gdalautotest-3.0.4/0000755003401500001440000000000013614005365013633 5ustar rouaultusersgdalautotest-3.0.4/alg/0000755003401500001440000000000013614005314014370 5ustar rouaultusersgdalautotest-3.0.4/alg/polygonize.py0000755003401500001440000001600413614005314017145 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: polygonize.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test Polygonize() algorithm. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, 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. ############################################################################### import ogrtest from osgeo import gdal, ogr ############################################################################### # Test a fairly simple case, with nodata masking. def test_polygonize_1(is_int_polygonize=True): src_ds = gdal.Open('data/polygonize_in.grd') src_band = src_ds.GetRasterBand(1) # Create a memory OGR datasource to put results in. mem_drv = ogr.GetDriverByName('Memory') mem_ds = mem_drv.CreateDataSource('out') mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) fd = ogr.FieldDefn('DN', ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. if is_int_polygonize: result = gdal.Polygonize(src_band, src_band.GetMaskBand(), mem_layer, 0) else: result = gdal.FPolygonize(src_band, src_band.GetMaskBand(), mem_layer, 0) assert result == 0, 'Polygonize failed' # Confirm we get the set of expected features in the output layer. expected_feature_number = 13 assert mem_layer.GetFeatureCount() == expected_feature_number expect = [107, 123, 115, 115, 140, 148, 123, 140, 156, 100, 101, 102, 103] tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect) # check at least one geometry. if tr: mem_layer.SetAttributeFilter('dn = 156') feat_read = mem_layer.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((440720 3751200,440720 3751020,440900 3751020,440900 3751200,440720 3751200),(440780 3751140,440840 3751140,440840 3751080,440780 3751080,440780 3751140))') != 0: tr = 0 feat_read.Destroy() assert tr def test_polygonize_1_float(): return test_polygonize_1(is_int_polygonize=False) ############################################################################### # Test a simple case without masking. def test_polygonize_2(): src_ds = gdal.Open('data/polygonize_in.grd') src_band = src_ds.GetRasterBand(1) # Create a memory OGR datasource to put results in. mem_drv = ogr.GetDriverByName('Memory') mem_ds = mem_drv.CreateDataSource('out') mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) fd = ogr.FieldDefn('DN', ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. result = gdal.Polygonize(src_band, None, mem_layer, 0) assert result == 0, 'Polygonize failed' # Confirm we get the set of expected features in the output layer. expected_feature_number = 17 assert mem_layer.GetFeatureCount() == expected_feature_number expect = [107, 123, 115, 132, 115, 132, 140, 132, 148, 123, 140, 132, 156, 100, 101, 102, 103] tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect) assert tr ############################################################################### # A more involved case with a complex looping. def test_polygonize_3(): src_ds = gdal.Open('data/polygonize_in_2.grd') src_band = src_ds.GetRasterBand(1) # Create a memory OGR datasource to put results in. mem_drv = ogr.GetDriverByName('Memory') mem_ds = mem_drv.CreateDataSource('out') mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) fd = ogr.FieldDefn('DN', ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. result = gdal.Polygonize(src_band, None, mem_layer, 0) assert result == 0, 'Polygonize failed' # Confirm we get the expected count of features. expected_feature_number = 125 assert mem_layer.GetFeatureCount() == expected_feature_number # check at least one geometry. mem_layer.SetAttributeFilter('dn = 0') feat_read = mem_layer.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((6 -3,6 -40,19 -40,19 -39,24 -39,25 -39,25 -38,26 -38,27 -38,27 -37,28 -37,28 -36,29 -36,29 -35,30 -35,30 -34,31 -34,31 -25,30 -25,30 -24,29 -24,29 -23,28 -23,28 -22,27 -22,27 -21,24 -21,24 -20,23 -20,23 -19,25 -19,26 -19,26 -18,27 -18,27 -17,28 -17,28 -16,29 -16,29 -8,28 -8,28 -7,27 -7,27 -6,26 -6,26 -5,24 -5,24 -4,18 -4,18 -3,6 -3),(24 -35,25 -35,26 -35,26 -33,27 -33,27 -25,26 -25,26 -23,24 -23,24 -22,11 -22,11 -36,24 -36,24 -35),(11 -7,11 -18,23 -18,23 -17,24 -17,24 -16,25 -16,25 -9,24 -9,24 -8,23 -8,23 -7,11 -7))') != 0: print(feat_read.GetGeometryRef().ExportToWkt()) tr = 0 else: tr = 1 feat_read.Destroy() assert tr ############################################################################### # Test a simple case without masking but with 8-connectedness. def test_polygonize_4(): src_ds = gdal.Open('data/polygonize_in.grd') src_band = src_ds.GetRasterBand(1) # Create a memory OGR datasource to put results in. mem_drv = ogr.GetDriverByName('Memory') mem_ds = mem_drv.CreateDataSource('out') mem_layer = mem_ds.CreateLayer('poly', None, ogr.wkbPolygon) fd = ogr.FieldDefn('DN', ogr.OFTInteger) mem_layer.CreateField(fd) # run the algorithm. result = gdal.Polygonize(src_band, None, mem_layer, 0, ["8CONNECTED=8"]) assert result == 0, 'Polygonize failed' # Confirm we get the set of expected features in the output layer. expected_feature_number = 16 assert mem_layer.GetFeatureCount() == expected_feature_number expect = [107, 123, 132, 115, 132, 115, 140, 148, 123, 140, 132, 156, 100, 101, 102, 103] tr = ogrtest.check_features_against_list(mem_layer, 'DN', expect) assert tr gdalautotest-3.0.4/alg/fillnodata.py0000755003401500001440000001371113614005314017065 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: fillnodata.py d839df27fcec381753ca44dc6e12dce1134a0832 2019-02-04 15:43:32 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: GDALFillNoData() testing # 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 struct def test_fillnodata_1x1_no_nodata(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ar = struct.pack('B' * 1, 1) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar) gdal.FillNodata(targetBand = ds.GetRasterBand(1), maxSearchDist = 1, maskBand = None, smoothingIterations = 0) ar = ds.ReadRaster() ar = struct.unpack('B' * 1, ar) assert ar == (1,) def _test_fillnodata_nodata_zero(width, height, input_ar, maxSearchDist = 1): ds = gdal.GetDriverByName('MEM').Create('', width, height) npixels = ds.RasterXSize * ds.RasterYSize ds.GetRasterBand(1).SetNoDataValue(0) ar = struct.pack('B', input_ar[0]) for i in range(1, len(input_ar)): ar += struct.pack('B', input_ar[i]) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, ar) gdal.FillNodata(targetBand = ds.GetRasterBand(1), maxSearchDist = maxSearchDist, maskBand = None, smoothingIterations = 0) ar = ds.ReadRaster() return struct.unpack('B' * npixels, ar) def test_fillnodata_1x1_nodata_but_pixel_valid(): assert _test_fillnodata_nodata_zero(1, 1, (1,)) == (1,) def test_fillnodata_1x1_nodata_pixel_invalid(): assert _test_fillnodata_nodata_zero(1, 1, (0,)) == (0,) def test_fillnodata_2x1_valid_invalid(): assert _test_fillnodata_nodata_zero(2, 1, (1, 0)) == (1, 1) def test_fillnodata_2x1_invalid_valid(): assert _test_fillnodata_nodata_zero(2, 1, (0, 1)) == (1, 1) def test_fillnodata_3x1_valid_invalid_valid(): assert _test_fillnodata_nodata_zero(3, 1, (2, 0, 4)) == (2, 3, 4) def test_fillnodata_4x1_valid_invalid_invalid_valid(): assert _test_fillnodata_nodata_zero(4, 1, (2, 0, 0, 4)) == (2, 2, 4, 4) def test_fillnodata_1x2_valid_invalid(): assert _test_fillnodata_nodata_zero(1, 2, (1, 0)) == (1, 1) def test_fillnodata_1x2_invalid_valid(): assert _test_fillnodata_nodata_zero(1, 2, (0, 1)) == (1, 1) def test_fillnodata_1x3_valid_invalid_valid(): assert _test_fillnodata_nodata_zero(1, 3, (2, 0, 4)) == (2, 3, 4) def test_fillnodata_1x4_valid_invalid_invalid_valid(): assert _test_fillnodata_nodata_zero(1, 4, (2, 0, 0, 4)) == (2, 2, 4, 4) def test_fillnodata_3x3_central_column_invalid(): assert _test_fillnodata_nodata_zero(3, 3, (2, 0, 4, 4, 0, 6, 6, 0, 8)) == (2, 3, 4, 4, 5, 6, 6, 7, 8) def test_fillnodata_3x3_central_line_invalid(): assert _test_fillnodata_nodata_zero(3, 3, (2, 3, 4, 0, 0, 0, 6, 7, 8)) == (2, 3, 4, 4, 5, 6, 6, 7, 8) def test_fillnodata_3x3_central_column_and_line_invalid(): assert _test_fillnodata_nodata_zero(3, 3, (2, 0, 4, 0, 0, 0, 6, 0, 8)) == (2, 3, 4, 4, 0, 6, 6, 7, 8) # 1.5 > sqrt(2) def test_fillnodata_3x3_central_column_and_line_invalid_search_dist_1_5(): assert _test_fillnodata_nodata_zero(3, 3, (2, 0, 4, 0, 0, 0, 6, 0, 8), maxSearchDist = 1.5) \ == (2, 3, 4, 4, 5, 6, 6, 7, 8) gdalautotest-3.0.4/alg/__init__.py0000644003401500001440000000000013614005314016467 0ustar rouaultusersgdalautotest-3.0.4/alg/proximity.py0000755003401500001440000001026713614005314017017 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: proximity.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test ComputeProximity() algorithm. # 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. ############################################################################### from osgeo import gdal import pytest ############################################################################### # Test a fairly default case. def test_proximity_1(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/pat.tif') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/proximity_1.tif', 25, 25, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.ComputeProximity(src_band, dst_band) cs_expected = 1941 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/proximity_1.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try several options def test_proximity_2(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/pat.tif') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/proximity_2.tif', 25, 25, 1, gdal.GDT_Float32) dst_band = dst_ds.GetRasterBand(1) gdal.ComputeProximity(src_band, dst_band, options=['VALUES=65,64', 'MAXDIST=12', 'NODATA=-1', 'FIXED_BUF_VAL=255']) cs_expected = 3256 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/proximity_2.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try input nodata option def test_proximity_3(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/pat.tif') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/proximity_3.tif', 25, 25, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.ComputeProximity(src_band, dst_band, options=['VALUES=65,64', 'MAXDIST=12', 'USE_INPUT_NODATA=YES', 'NODATA=0']) cs_expected = 1465 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/proximity_3.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') gdalautotest-3.0.4/alg/sieve.py0000755003401500001440000002157013614005314016065 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: sieve.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test SieveFilter() algorithm. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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. ############################################################################### from osgeo import gdal import pytest ############################################################################### # Test a fairly default case. def test_sieve_1(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/sieve_src.grd') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/sieve_1.tif', 5, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, None, dst_band, 2, 4) cs_expected = 364 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/sieve_1.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try eight connected. def test_sieve_2(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/sieve_src.grd') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/sieve_2.tif', 5, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, None, dst_band, 2, 8) cs_expected = 370 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/sieve_2.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Do a sieve resulting in unmergable polygons. def test_sieve_3(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/unmergable.grd') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/sieve_3.tif', 5, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, None, dst_band, 2, 8) # cs_expected = 472 cs_expected = 451 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/sieve_3.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try the bug 2634 simplified data. def test_sieve_4(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/sieve_2634.grd') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/sieve_4.tif', 10, 8, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, None, dst_band, 2, 4) cs_expected = 98 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/sieve_4.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Same as sieve_1, but we provide a mask band # This should yield the same result as we use an opaque band def test_sieve_5(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/sieve_src.grd') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('tmp/sieve_1.tif', 5, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, dst_band.GetMaskBand(), dst_band, 2, 4) cs_expected = 364 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/sieve_1.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Performance test. When increasing the 'size' parameter, performance # should stay roughly linear with the number of pixels (i.e. size^2) def test_sieve_6(): try: import numpy except ImportError: pytest.skip() # Try 3002. Should run in less than 10 seconds # size = 3002 size = 102 ds = gdal.GetDriverByName('MEM').Create('', size + 1, size) ar = numpy.zeros((size, size + 1), dtype=numpy.uint8) for i in range(size): for j in range(int(size / 3)): ar[i][size + 1 - 1 - i - 1 - 3 * j] = 255 ar[i][size + 1 - 1 - i - 3 * j] = 255 ar[i][0] = 255 ar[size - 1] = 255 ds.GetRasterBand(1).WriteArray(ar) band = ds.GetRasterBand(1) gdal.SieveFilter(band, None, band, 2, 4) # ar = band.ReadAsArray() # print(ar) cs = band.Checksum() if (size == 102 and cs != 60955) or (size == 3002 and cs != 63178): print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Test with nodata def test_sieve_7(): gdal.FileFromMemBuffer('/vsimem/sieve_7.asc', """ncols 7 nrows 7 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 NODATA_value 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 2 2 2 1 0 1 1 2 1 2 1 0 1 1 2 2 2 1 0 1 1 1 1 1 1 """) drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('/vsimem/sieve_7.asc') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('/vsimem/sieve_7.tif', 7, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, src_band.GetMaskBand(), dst_band, 4, 4) cs_expected = 42 cs = dst_band.Checksum() dst_band = None dst_ds = None gdal.Unlink('/vsimem/sieve_7.asc') if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('/vsimem/sieve_7.tif') # Expected: # [[0 0 0 0 0 0 0] # [0 1 1 1 1 1 1] # [0 1 0 0 1 1 1] # [0 1 0 2 2 2 1] # [0 1 1 2 2 2 1] # [0 1 1 2 2 2 1] # [0 1 1 1 1 1 1]] if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Test propagation in our search of biggest neighbour def test_sieve_8(): gdal.FileFromMemBuffer('/vsimem/sieve_8.asc', """ncols 7 nrows 7 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 0 0 0 0 0 0 0 0 5 5 0 0 0 0 0 5 2 3 4 0 0 0 0 8 1 5 0 0 0 0 7 6 5 9 0 0 0 0 0 9 9 0 0 0 0 0 0 0 0 """) drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('/vsimem/sieve_8.asc') src_band = src_ds.GetRasterBand(1) dst_ds = drv.Create('/vsimem/sieve_8.tif', 7, 7, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) gdal.SieveFilter(src_band, src_band.GetMaskBand(), dst_band, 4, 4) # All non 0 should be mapped to 0 cs_expected = 0 cs = dst_band.Checksum() dst_band = None dst_ds = None gdal.Unlink('/vsimem/sieve_8.asc') if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('/vsimem/sieve_8.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') gdalautotest-3.0.4/alg/reproject.py0000755003401500001440000001213013614005314016737 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: reproject.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test ReprojectImage() algorithm. # 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 from osgeo import osr import pytest ############################################################################### # Test a trivial case. def test_reproject_1(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('../gcore/data/byte.tif') dst_ds = drv.Create('tmp/byte.tif', src_ds.RasterXSize, src_ds.RasterYSize, gdal.GDT_Byte) dst_ds.SetProjection(src_ds.GetProjectionRef()) dst_ds.SetGeoTransform(src_ds.GetGeoTransform()) gdal.ReprojectImage(src_ds, dst_ds) cs_expected = src_ds.GetRasterBand(1).Checksum() cs = dst_ds.GetRasterBand(1).Checksum() dst_ds = None drv.Delete('tmp/byte.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Test a real reprojection case. def test_reproject_2(): sr = osr.SpatialReference() sr.ImportFromEPSG(32611) sr2 = osr.SpatialReference() sr2.ImportFromEPSG(4326) drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('../gcore/data/byte.tif') dst_ds = drv.Create('tmp/byte_4326.tif', 22, 18, gdal.GDT_Byte) dst_ds.SetGeoTransform([-117.641169915168746, 0.000598105625684, 0, 33.900668703925191, 0, -0.000598105625684]) gdal.ReprojectImage(src_ds, dst_ds, sr.ExportToWkt(), sr2.ExportToWkt()) cs_expected = 4727 cs = dst_ds.GetRasterBand(1).Checksum() dst_ds = None drv.Delete('tmp/byte_4326.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Test nodata values def test_reproject_3(): data = '\x02\x7f\x7f\x02\x02\x7f\x7f\x02\x02\x7f\x7f\x02' src_ds = gdal.GetDriverByName('MEM').Create('', 4, 3) src_ds.GetRasterBand(1).WriteRaster(0, 0, 4, 3, data) src_ds.GetRasterBand(1).SetNoDataValue(2) src_ds.SetGeoTransform([10, 1, 0, 10, 0, -1]) dst_ds = gdal.GetDriverByName('MEM').Create('', 6, 3) dst_ds.GetRasterBand(1).SetNoDataValue(3) dst_ds.GetRasterBand(1).Fill(3) dst_ds.SetGeoTransform([10, 2. / 3., 0, 10, 0, -1]) gdal.ReprojectImage(src_ds, dst_ds, '', '', gdal.GRA_Bilinear) got_data = dst_ds.GetRasterBand(1).ReadRaster(0, 0, 6, 3).decode('latin1') expected_data = '\x03\x7f\x7f\x7f\x03\x03\x03\x7f\x7f\x7f\x03\x03\x03\x7f\x7f\x7f\x03\x03' if got_data != expected_data: import struct pytest.fail(struct.unpack('B' * 18, got_data)) ############################################################################### # Test warp options def test_reproject_4(): data = '\x02\x7f\x7f\x02\x02\x7f\x7f\x02\x02\x7f\x7f\x02' src_ds = gdal.GetDriverByName('MEM').Create('', 4, 3) src_ds.GetRasterBand(1).WriteRaster(0, 0, 4, 3, data) src_ds.GetRasterBand(1).SetNoDataValue(2) src_ds.SetGeoTransform([10, 1, 0, 10, 0, -1]) dst_ds = gdal.GetDriverByName('MEM').Create('', 6, 3) dst_ds.GetRasterBand(1).SetNoDataValue(3) dst_ds.SetGeoTransform([10, 2. / 3., 0, 10, 0, -1]) gdal.ReprojectImage(src_ds, dst_ds, '', '', gdal.GRA_Bilinear, options=['INIT_DEST=NO_DATA']) got_data = dst_ds.GetRasterBand(1).ReadRaster(0, 0, 6, 3).decode('latin1') expected_data = '\x03\x7f\x7f\x7f\x03\x03\x03\x7f\x7f\x7f\x03\x03\x03\x7f\x7f\x7f\x03\x03' if got_data != expected_data: import struct pytest.fail(struct.unpack('B' * 18, got_data)) gdalautotest-3.0.4/alg/cutline.py0000755003401500001440000001253413614005314016415 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: cutline.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test the image reprojection functions. Try to test as many # resamplers as possible (we have optimized resamplers for some # data types, test them too). # Author: Andrey Kiselev, dron16@ak4719.spb.edu # ############################################################################### # 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. ############################################################################### from osgeo import gdal import ogrtest import gdaltest import pytest ############################################################################### def test_cutline_1(): tst = gdaltest.GDALTest('VRT', 'cutline_noblend.vrt', 1, 11409) return tst.testOpen() ############################################################################### def test_cutline_2(): if not ogrtest.have_geos(): pytest.skip() tst = gdaltest.GDALTest('VRT', 'cutline_blend.vrt', 1, 21395) return tst.testOpen() ############################################################################### def test_cutline_3(): if not ogrtest.have_geos(): pytest.skip() tst = gdaltest.GDALTest('VRT', 'cutline_multipolygon.vrt', 1, 20827) return tst.testOpen() ############################################################################### def test_cutline_4(): if not ogrtest.have_geos(): pytest.skip() ds = gdal.Translate('/vsimem/utmsmall.tif', '../gcore/data/utmsmall.tif') ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open(""" 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"]] 4.4072000000000000e+05, 5.9999999999999993e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -5.9999999999999993e+01 512 128 6.71089e+07 NearestNeighbour Byte /vsimem/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,59.99999999999999,0,3751320,0,-59.99999999999999 -7345.333333333334,0.01666666666666667,0,62522.00000000001,0,-0.01666666666666667 MULTIPOLYGON(((10 10,10 50,60 50, 10 10)),((70 70,70 100,100 100,100 70,70 70),(80 80,80 90,90 90,90 80,80 80))) """) out_ds = gdal.Translate('', ds, options='-of MEM -outsize 50%% 50%%') cs = out_ds.GetRasterBand(1).Checksum() assert cs == 5170 gdal.Unlink('/vsimem/utmsmall.tif') ############################################################################### gdalautotest-3.0.4/alg/contour.py0000755003401500001440000002646013614005314016446 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: contour.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: ContourGenerate() 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 array import os from osgeo import gdal from osgeo import ogr import ogrtest import pytest ############################################################################### # Test with -a and -i options def test_contour_1(): try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass drv = gdal.GetDriverByName('GTiff') 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\",\"9108\"]],AUTHORITY[\"EPSG\",\"4326\"]]' size = 160 precision = 1.0 / size ds = drv.Create('tmp/gdal_contour.tif', size, size, 1) ds.SetProjection(wkt) ds.SetGeoTransform([1, precision, 0, 50, 0, -precision]) raw_data = array.array('h', [10 for i in range(int(size / 2))]).tostring() for i in range(int(size / 2)): ds.WriteRaster(int(size / 4), i + int(size / 4), int(size / 2), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [20 for i in range(int(size / 2))]).tostring() for i in range(int(size / 4)): ds.WriteRaster(int(size / 4) + int(size / 8), i + int(size / 4) + int(size / 8), int(size / 4), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [25 for i in range(int(size / 4))]).tostring() for i in range(int(size / 8)): ds.WriteRaster(int(size / 4) + int(size / 8) + int(size / 16), i + int(size / 4) + int(size / 8) + int(size / 16), int(size / 8), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/contour.shp') ogr_lyr = ogr_ds.CreateLayer('contour') field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elev', ogr.OFTReal) ogr_lyr.CreateField(field_defn) gdal.ContourGenerate(ds.GetRasterBand(1), 10, 0, [], 0, 0, ogr_lyr, 0, 1) ds = None expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125]] expected_height = [10, 20] lyr = ogr_ds.ExecuteSQL("select * from contour order by elev asc") assert lyr.GetFeatureCount() == len(expected_envelopes) i = 0 feat = lyr.GetNextFeature() while feat is not None: envelope = feat.GetGeometryRef().GetEnvelope() assert feat.GetField('elev') == expected_height[i] for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) pytest.fail('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) i = i + 1 feat = lyr.GetNextFeature() ogr_ds.ReleaseResultSet(lyr) ogr_ds.Destroy() ############################################################################### # Test with -fl option and -3d option def test_contour_2(): try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/contour.shp') ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString25D) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elev', ogr.OFTReal) ogr_lyr.CreateField(field_defn) ds = gdal.Open('tmp/gdal_contour.tif') gdal.ContourGenerate(ds.GetRasterBand(1), 0, 0, [10, 20, 25], 0, 0, ogr_lyr, 0, 1) ds = None size = 160 precision = 1. / size expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125], [1.25 + 0.125 + 0.0625, 1.75 - 0.125 - 0.0625, 49.25 + 0.125 + 0.0625, 49.75 - 0.125 - 0.0625]] expected_height = [10, 20, 25, 10000] lyr = ogr_ds.ExecuteSQL("select * from contour order by elev asc") assert lyr.GetFeatureCount() == len(expected_envelopes) i = 0 feat = lyr.GetNextFeature() while feat is not None: assert feat.GetGeometryRef().GetZ(0) == expected_height[i] envelope = feat.GetGeometryRef().GetEnvelope() assert feat.GetField('elev') == expected_height[i] for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) pytest.fail('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) i = i + 1 feat = lyr.GetNextFeature() ogr_ds.ReleaseResultSet(lyr) ogr_ds.Destroy() ############################################################################### # def test_contour_real_world_case(): ogr_ds = ogr.GetDriverByName('Memory').CreateDataSource('') ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elev', ogr.OFTReal) ogr_lyr.CreateField(field_defn) ds = gdal.Open('data/contour_in.tif') gdal.ContourGenerate(ds.GetRasterBand(1), 10, 0, [], 0, 0, ogr_lyr, 0, 1) ds = None ogr_lyr.SetAttributeFilter('elev = 330') assert ogr_lyr.GetFeatureCount() == 1 f = ogr_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(f, 'LINESTRING (4.50497512437811 11.5,4.5 11.501996007984,3.5 11.8333333333333,2.5 11.5049751243781,2.490099009901 11.5,2.0 10.5,2.5 10.1666666666667,3.0 9.5,3.5 9.21428571428571,4.49800399201597 8.5,4.5 8.49857346647646,5.5 8.16666666666667,6.5 8.0,7.5 8.0,8.0 7.5,8.5 7.0,9.490099009901 6.5,9.5 6.49667774086379,10.5 6.16666666666667,11.4950248756219 5.5,11.5 5.49833610648919,12.5 5.49667774086379,13.5 5.49800399201597,13.501996007984 5.5,13.5 5.50199600798403,12.501996007984 6.5,12.5 6.50142653352354,11.5 6.509900990099,10.509900990099 7.5,10.5 7.50142653352354,9.5 7.9,8.50332225913621 8.5,8.5 8.50249376558603,7.83333333333333 9.5,7.5 10.0,7.0 10.5,6.5 10.7857142857143,5.5 11.1666666666667,4.50497512437811 11.5)', 0.01) == 0 # Test with -p option (polygonize) def test_contour_3(): try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/contour.shp') ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbMultiPolygon) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elevMin', ogr.OFTReal) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elevMax', ogr.OFTReal) ogr_lyr.CreateField(field_defn) ds = gdal.Open('tmp/gdal_contour.tif') #gdal.ContourGenerateEx(ds.GetRasterBand(1), 0, 0, 0, [10, 20, 25], 0, 0, ogr_lyr, 0, 1, 1) gdal.ContourGenerateEx(ds.GetRasterBand(1), ogr_lyr, options = [ "FIXED_LEVELS=10,20,25", "ID_FIELD=0", "ELEV_FIELD_MIN=1", "ELEV_FIELD_MAX=2", "POLYGONIZE=TRUE" ] ) ds = None size = 160 precision = 1. / size expected_envelopes = [[1.0, 2.0, 49.0, 50.0], [1.25, 1.75, 49.25, 49.75], [1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125], [1.25 + 0.125 + 0.0625, 1.75 - 0.125 - 0.0625, 49.25 + 0.125 + 0.0625, 49.75 - 0.125 - 0.0625]] expected_height = [10, 20, 25, 10000] lyr = ogr_ds.ExecuteSQL("select * from contour order by elevMin asc") assert lyr.GetFeatureCount() == len(expected_envelopes) i = 0 feat = lyr.GetNextFeature() while feat is not None: if i < 3 and feat.GetField('elevMax') != expected_height[i]: pytest.fail('Got %f as z. Expected %f' % (feat.GetField('elevMax'), expected_height[i])) elif i > 0 and i < 3 and feat.GetField('elevMin') != expected_height[i-1]: pytest.fail('Got %f as z. Expected %f' % (feat.GetField('elevMin'), expected_height[i-1])) envelope = feat.GetGeometryRef().GetEnvelope() for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) pytest.fail('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) i = i + 1 feat = lyr.GetNextFeature() ogr_ds.ReleaseResultSet(lyr) ogr_ds.Destroy() ############################################################################### # Cleanup def test_contour_cleanup(): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/contour.shp') try: os.remove('tmp/gdal_contour.tif') except OSError: pass gdalautotest-3.0.4/alg/tps.py0000755003401500001440000000465513614005314015565 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tps.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test TPS algorithm. # 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 gdaltest from osgeo import gdal, osr ############################################################################### # Test error case (#5586) def test_tps_1(): drv = gdal.GetDriverByName('MEM') ds = drv.Create('foo', 2, 2) gcp_list = [ gdal.GCP(0, 0, 0, 0, 0), gdal.GCP(0, 50, 0, 0, 50), gdal.GCP(50, 0, 0, 50, 0), gdal.GCP(50, 50, 0, 50, 50), gdal.GCP(0 * 25, 0 * 25, 0, 25, 25), ] ds.SetGCPs(gcp_list, osr.GetUserInputAsWKT('WGS84')) utm_wkt = osr.GetUserInputAsWKT('+proj=utm +zone=11 +datum=WGS84') with gdaltest.error_handler(): transformer = gdal.Transformer(ds, None, ['DST_SRS=' + utm_wkt, 'METHOD=GCP_TPS']) assert transformer is None gdalautotest-3.0.4/alg/data/0000755003401500001440000000000013614005314015301 5ustar rouaultusersgdalautotest-3.0.4/alg/data/utmsmall_blinear_short.vrt0000644003401500001440000000342513614004466022622 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Bilinear Int16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_lanczos.vrt0000644003401500001440000000342313614004466021436 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Lanczos Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/white_nodata.tif0000644003401500001440000000216013614004466020461 0ustar rouaultusersII*tS   V255@@@@ASA# w )#WGS 84 / UTM zone 31N|WGS 84|tS   R255@@@@ASA# w )#WGS 84 / UTM zone 31N|WGS 84|gdalautotest-3.0.4/alg/data/utmsmall-int16-neg.tiff0000644003401500001440000001736713614004466021544 0ustar rouaultusersII*<<<S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|  &              &  >..O  6F.  .   & & 6  &&.&.    &&&6.66>     ..6_Fx .  O .  F>.>. .  & . .6&>g  &.>>.&WFF>6O   6xF6 FO>.6>.6OWO>__& 6O_F F6...>>&.&.>. & .xOWp&W6  6F...&&O6 . & .& &6 F_xWWF>6 O6&&6.OF6.xO && 6F.6F&6F_WggO&&6>OxO6.g6  F. 666&FWO._. .66_6.  >>x&>.&W&W6>& 6&6&6>FO6FgF.& .66F>..>F6 &&FOOOF.&&F..FF.&& ..>>W&.> F_gWg_p_&6 >Op___> &.&.&__F&&>&&&>_Og&. .W .&.WF>W_p 6.. ..66F.F &. &.W6&OgF.   .gFWg>66.6>6> >  pO. .&& .FpW &6.&6& &O_p_O>&& & 6Og& .&& &.6>O.>pOF6.   &&&FWp& .FO666&. 6.6x&O&6&6   .. && .&66&.& WWp 6  F  W&&&&_WF&_p.&&&W&.&    . && . &F&>. .  .6&F6F6F .  &F& &F>>6F 6 >> >_WF    &FOO>6.&6F&g &&  F&  & _O>O_Fg>6...&&.>&&66  .Opg>O_>6&...Fg6&.O&6.6>& &&&6.xWg.FOgOO___Og_OO_> & ..&.  &.>6>WWW&&6 &F6>6& O_&6 .>6 .&.& 6F_pgOWp p.>FFWOWF>_xg&x__..& &g. . g_WF& . >& WF&._xgWWW6&6 .&&x&g&  &&. >O&O.>OFpWFWF& & O_OO 6 O.gFF 6W .Fxg_> .p_O.>. &  .FOF_Wg>F& gF.g_xpxg_   &.66p W666F6&p>Fxg_F.>O &&& &   &F &__&_F.Og.>6 OgxW& Ox&FW  p&gFxg6 >&_g>&_..>> &6.&6 . &&x& >.>6>O6>W_>gFgO &6WF &p>.x>&& .p_ .>g 6 . &&gOOg O&O x6F>.&  &&&.OF&6 &6>__6Fg  .FW_F W ..&.__& &>&&.&&._& _ &>>&6.     O6.>F &6>&6 g &  &6 F&F.>.>&6 ..&&F  && O>.&>&F> 6 .F&>F.6 & &6&. .&&WW.6p .F_W&    6&& . .O&> F &666.&p .66Op6. .. .F.g&&66.6 &6O . 6 &&& .Og .& &>_ O  6 .W&6>F6 _<<f< S L d N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767gdalautotest-3.0.4/alg/data/cutline.csv0000644003401500001440000000031113614004466017463 0ustar rouaultusersCounter,WKT 1,"POLYGON((6.25 1.25,7.25 1.25,7.25 2.25,6.25 2.25,6.25 1.25))" 2,"POLYGON((4.25 4.25,6.25 4.25,6.25 6.25,4.25 6.25,4.25 4.25))" 3,"POLYGON((1.001 1.001,3.999 3.999,3.2 1.6,1.001 1.001))" gdalautotest-3.0.4/alg/data/utmsmall_mode.vrt0000644003401500001440000000417413614004466020715 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Mode Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/test_nearest_short.vrt0000644003401500001440000001060213614004466021763 0ustar rouaultusers 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 2.0983170908647397e+04, 5.0109700347667203e+03, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0109700347667203e+03 Alpha 512 128 6.71089e+07 NearestNeighbour Int16 ../tmp/test.tif 0.125 500000,5000,0,5000000,0,-5000 -100,0.0002,0,1000,0,-0.0002 20983.1709086474,5010.97003476672,0,5017540.250625971,0,-5010.97003476672 -4.187446894127006,0.000199562159235014,0,1001.311166463512,0,-0.000199562159235014 PROJCS["WGS 84 / UTM zone 30N",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",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32630"]] 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 4 4 gdalautotest-3.0.4/alg/data/utmsmall_near_short.vrt0000644003401500001440000000343513614004466022134 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 NearestNeighbour Int16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_ds_cubic.vrt0000644003401500001440000000341713614004466021543 0ustar rouaultusers 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"]] 440720,50,0,3751320,0,-50 Gray 512 128 6.71089e+07 Cubic Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,50,0,3751320,0,-50 gdalautotest-3.0.4/alg/data/utmsmall_mode_int32.tiff0000644003401500001440000002420613614004466022047 0ustar rouaultusersII*22 (S   Z@v ^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|k{ksccssk{{ssck{{c{ss{s{ss{ksskkcsZsZc{kk{{{s{sssk{sccsskks{s{kccs{{sccksccs{{s{s{sJskssk{{{R{c{skk{{sk{{{c{{s{k{c{ckscZkss{sskkcss{sc{{{s{ccccksZ{kskkkkRc{{{skkccZcsc{k{{s{{{sR{{kc{kk{k{s{sk{sZk{{k{{sss{kk{skskk{ks{{c{k{{sk{s{k{k{cscsk{{ckk{s{sJJRsRssckBkZcZkcks{{sssZcZ:sRcZ{kkk{{ks1ZRBRcsscZk{J{BJRZJBks{ZBJ{Zsscc:kR{{JBssZ{{{{Zc{Rks)ckskR{Js{{s{c1kcckk:R{s{ZkZccsssc:ZBR{1BZRsBk1cBccc{kcBkJsRsk1JRJk:ckZRRZ{Z:1BJR1RB:kB1R{J{s))){11c:J!Z!BJ:1Jkkk))JsRcRRsZkRZkJZ{{s{B:ZBkJcZZRcZJsZJBZkcc:ssRs)k{s{ZcZk{cZskZZ)kcBR{sBc{{cskksRRcZZcc{k{kZZsJZRc!B)R:JkR{kRRkJ:ZkJskkksZc{ZRcBB{:kksckZJs{cBBZ:Zcs{ssZJ:BJ)B:!!Z!!c)Z1ZJ1BBcccRsRcRkcsR{sJB1BR:{J1)BZ!ZB::BZck1)sB:JZc{s{RZJRRs{cRBB1s!JcJ:Z:RRBZ{Z{sJcJJJkRBBBR!c):ZR)sksZ1BJ!JksJcZsJJk{R{{ZcBs)kcRZ1))JRkB{JcRRZcs:1J1ZcJRkcscRZgdalautotest-3.0.4/alg/data/utmsmall_Q1.vrt0000644003401500001440000000420113614004466020241 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Quartile1 Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_average_float.vrt0000644003401500001440000000420513614004466022563 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Average Float32 ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_Q1.tif0000644003401500001440000000545213614004466020221 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kksskkcksckkcJRcZccsZcckksckck{s{νs{sksskkkkcZsccZcZckkkk{ks{{{{kέBŜssksckkkcZcsZZZckcckss{k{Zs{kZc{{s{ckscccccccZccZcZs{{{ssc{sťscckkkcckkccJZkkkk{c{s{RcΥ{kckZkkkcksccs{Zccssccks{k{ΥcccccsckZckk{ck{skkŵ{ťkkZkZcccsZc{kkckZkks{sc{ŔֽksZJZcccckkZskksΜ{Όksέk{skkkcRZs{{{{k{sZZcRZccΔ{ֽޔ{ZckRsޥ{{R{ń{{s{{{{sks{{{Zc{k{ޜ֔sks{{ks{ńZ{{s{{s֌{sŌs{ֵΔ֔Δ{省Ό{RksZkssΌŭ樂ֵ{Jc{Rcc{k֜ŔcνŜ{ksk{skksRcRcJZs{R{Ŝŭތέŵ{kk{ss{ks{cc{sZ{s{{{Jks{{scsks{ck{kc{έޔޥs{{skcccssksksskks{{ss{Μޥkkcskc{{{kc{{ccccsŔs{{֭sRckZZkssZRkckZ{skk{sŌkŔ{έcZRckcscc{skRBZs{{ssZJ:cRkkRkkcsc{ks{ŭd{ΌB)JJ)cJRkcscZcRRsks{{{{ΔޭksZcBRcJRckRZk{ZkJkJskk{k{{c:1:!JRBBcc{JJBJsZcsZ1sBcťksJcBBRR:BRB{JZBsJ{ZZs{ssc::kJkkRRJJBRBJ:sZcsBkcc{sksZ{ŭZckRJBR)J)s{k!ZckkJJckkssc{1ZR:J::JBZc:1RZJ!scsR֥ckc:J)!:1!J:Z:1ZZ1:BcJRR{csŜkZB1BJ))11J1:k))k)RBRZ{Zޭ)11!11::JJB1R{1BZ{s{sc֥{s)!)1)!:J!B!B1::1JZkksksks{ss))!1R!:JB1B)kZBJ1Jcck{k{{ks{!11):)1!::ccB1ZZ:JBRBkk{kks:ZRZZRB)cZRkcB)::cscJ1BRZJ:kc{skZRcZcZBZR{):)BRkZB1Zk:1:Jk{cZR1RRcZZZsZcBJ{k1BRZJ{JB:J!):JcR1cckB):1!1Z::kZkkkZkJBBcc{B::BB{R1J)1ZJB1BJJBB{Z::ZccZZJsskB{cs11::)B:c!B!:1:1J!1:1B:B1J1)cZcsR:Z:R1k{ZR{sBB1)J:{J)BZ!:B::!ZZk:1)s)))BRZ:kcRRJRJc{scJ1)Bsk1R:!))::!BZ1R:ZkJ{JssJJsRJBBJJ{skkJB)BckR1!c:)):ckZZ1)!!Z):JBRRB1Z:ZB1ssZR{:RZksR1B!cR!)!:)Rsk{)11J))RJ!BB:111sJcJR::cscRZgdalautotest-3.0.4/alg/data/utmsmall_cubicspline_short.vrt0000644003401500001440000000343013614004466023502 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 CubicSpline Int16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_blinear.vrt0000644003401500001440000000342413614004466021402 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Bilinear Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_ds_cubicspline.vrt0000644003401500001440000000342513614004466022755 0ustar rouaultusers 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"]] 440720,50,0,3751320,0,-50 Gray 512 128 6.71089e+07 CubicSpline Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,50,0,3751320,0,-50 gdalautotest-3.0.4/alg/data/utmsmall_near.tiff0000644003401500001440000003076513614004466021040 0ustar rouaultusersII* N =S   VRW9[mQUD;Z^pgqryr^u = @.r57 "#%&(Y*+-J/0$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|x!RADb+W]yyD"" ؓXJD>*3SfWhh6ˌ3=/K4R!b1Z%]E^2}vSnFxB%TFyfg2Ѿ۳2/2/2/2/2&l| vi{0gΧni̹0M5vݕeĬ{\װMQ< ne^e^e^e^e~wOobD=Z?+|i,?WI?zz* {:#bxyy?!!x!nQ Dc. ]XXXXXXZXتI Y kv6Jpa/:E&UZ$s䚛l*iu.|\3]m !zWt#['-xl_ Gbuߦ[жB͞kl_J7[{Sonǖ+x# &)OV}F2OoSDp0|a>̇0?`>yla{~[<~;3v޼Dζٺ#&Ya\o/#7! +a>̇0|a~O= EhrޢCYQ,8w!#[G:,/~" oۛklq}DLgzQx P'_2/2/28S,чr6O{f=ɛw̽dI]ss.woK8]W/ڗ%*û#cȺ'`>brg/%"4 gy|$k8Pu-d slx ҽ/%r/7bLO=yyyy#1G~uC&6IwLǁoc/SCfC8zXo%:Gz[TOaWKUpd}(JԼVyyyy?sfsFSeoN7IsWIyvHNQfa/q >1Fk]*<4 e c~Jޖx!A FYʕkȑXI$IJ, Tv:O{i*-4>Vd!|L$k?KvS䬥\kըLMdK:<<1*ܴHɻзfyQx-By3Ex١n\A Fw,,-,, - ,-\XXW(ܪT}(>`t/3^FG_GÈg.Wї9$xȽF*jv=xu׽N`QۭaCmvDg^,[;t7{2p#[qoN-ĖIzjTЮr٩|TeIםvoss5u9ewk/e̗2_|cJ[^ ZPe/m'G/Iv:k$[?:_ziٜK|/e̗2_1o_+vd wQS)뭴Yڳ2sT2O7Yo: k8'Vq\uo_2Hgfx헡A$Dbȕkȓ'"O" K I%sy&3=]mf'FǮ8RLA-b "g霵 2 0 r?`n8|֧;kpLG *mrn7M#<="!"0ȑdԃ oYrx2!!.':qS|ʻtdnTe^e^e^e^9]#xZfFO)":*{ZW2#Dc~k/OwI2*l03i[e^e^e^e^濝9ȷPm4U:pgo)MUqJw$uW)oŹf۝:½2w<IlRe^e^3hex헡RCA ED"k+Zd%},=0E^dINxs]#,(!u%G>?E;9%,w}d/8FdsUx/cڐ_wxŋȋF;ufΎ'gd y-[L[s9ޣᕘ x*zU;1=9xkL35"z!g|[tm-p:w]rN{;&[3i/2/2/2/2/|*^&3{L`/y̌xw%{-oGuGēgtι^73ɛ$.*2/2/2/2/˜iq@-ff=9so`-D/;]x L\#yŵeg=yrEgje~̿kx!s1F'Y[yyde%DbH:g^g'xLčC8ފ)4_bĜ g ҙ^Gޭ ~!åp6WHNqmj?&]wVDŽkAa?jyy9gDm ^]%٭ǾwY6{}ոk$ǂ̮ܝW gg5_]qqqq1jd+8q4ȹmUى:=6{̌w {sc3~e zcc ѿ[UzTw-~Q6Fĝw{~;bI&[t{{'D<7<?:y1#]gV F,1dO[&PKSG%sϺ7-9!s^9H>-yC˼˼˼˼vˋavy[Ɋiq;*GDyĴ9;[1USo\UN=YwCyyyy.sM&,0$s/:ydgg޽ -h }oQ߄ɃśpkkZNe~lx-ODA Db+W"X$\rJ, OHNkPKIS3SQa+^/ 7cqNűpfUςx.Lortg}]@evY+R^vާLz$ȿh>NOTm s޼~[9k` awKߑ5N wS,rs#r_Ry {5SMMI+7U3=eG|4G|4/O03~Uחi^ry5K֣,bE׎kO%w}rӢ} Md[Z}{|5KN IG|4G|4Gbx!o@ FhMS'YJ;}Ew瀌Z ߊ]wű8穘R|/nYN|IO gALsyV\ '@EۻMѵS<888888tN8E?ܞ 3Rx,у/KKKoK2x=ӭ/WwwЋn߉y ɵ,yqӨ}mA3ir,-U^L̇0z;9:-u):F%I۫vQb3-e[KeNǤ.{e"O}^nNR>kinݣ?<̇0|a>̿saVn>~ v# eGf覈D&#oWGĿ5g'"S.KY]jsO;^yy`NWN.曆TG>D=J对 BUsR{ZWG?I _:3{Lݣ|Ȥ8.sÇn-ns񚹣m+2/2/2/2/c;ML!TEsf }x{,2/2/2/2/ci% fjț^N_kz>OŹMwC-x cܢ_'iv5w N˼˼;x홡nBAEPY[\|E"+Jd%=!9" sf9c6ohF=ZE.kh+nCr|f/g9s%C>'CUg";>ܚ]!nw+NOZNE[Uft9D6s QD溈)c/a֮񯈯gntfS-}uLj|"ȳYNOL3Z^ܮ}jͼ7f̛y3o/$&TCs{3]W'Y ?$gmΕ<#j]tOSI2oɧFuy3oͼ7f̛#2w2cFWώOq?jƇJDq7-<~MgyL?"{ ^j;He3'K_9`D<x헡nBAE YD"H,r%D"+Hdeme%M I^Hj!ysƼ1V:ZD"s#f2rఋ|ƇNE}Dhϙ[q;G+8SvHO|p[!^]#UoLEO>2/2/2UIs#Ip:7ޚLÛh&ߑkJĄ͝Ó*̛j?NUȤ7Gqp+2/2/2/2/gdnz,엒a;ZIdI?9_&2wƜG*>o"u6zN.z*JK/%gįW/mP|=1bD&Ę-X:^boQa>̇0|a~qճaF.]4=v_j]կ.KMc=aoWG^ %̇0|a~̎:bۥ7"IFdP_WuicYMMRdߠWnbے&? ds{YHeԷoZuLa>̇07x-rTa-E"ȱHld$262- R飺v9}:f4ep?1`4'am_d=:y<*@]bn:=8R\:W_@"σA7k7\` U'ţC^inV? &oD.4]5VWc<.WS-[/!Oݪ'R?6m/K֮ŬjjWea`n2l=Pݯ7A'éJuPw~P\H"lE=aîn" zQ^ݾ8R ijj>M/ו);Vyi6Ŏ[1[稃*I?{x3u.2Nv6Fo/l+S|1W"7؆I}UѻuoO?hx׭NQg5H$YYD"Jdem%[p~!9Ɇ(&wg]m(St.>.Zb%z _GEGG!WٜJ?):)OԵiW?"Q2̇017EqݥyMN>l hلy4L(u4;'ےj=9; vӳ#3b{bq7DLubqb2||Uda>̇0|_+$%͹zn3flU][o);)ٱԷbM7cQl=Φ J%gw_/S}6x|a>̇0 @x!rAEϓ+DF"ؕHl$2\r*Aի@zz3Mz}G?gh9ϮuV>)F?x:.MQCWxn$Oo'ESU&C {^V= vfʼn׈s,Syyyy?sOAy(NnL#*2?%OWfkĜbpܜŹLo.<nxsH$w`rWyyyy?sOΜ@< v)RN񛏽`7I%|pvcg`-d:qB<[5˼˼lx٭nUakA"Jd%YYeee-Jle%%@'$o,5o5GLq÷vp=`8qfp~ i}ǫxߪl0x.1_VӗA9ЅHAc+Or^{ИWMpׁUWVWnZt,oua;:}_A|mxŸAu`>1u{/ΏS,FU7QAM,|D|ܯJh3G}GJ]"ٺ>ds$Ϯ$V]g*Ϊf|aO7 {}#΀Iώ/"z"dkŲ/6WEܻ'Gns9;C b%8]3l= =4̇0|a>/ywQ{b[Dj"@laͰuwo]XOKL< w5Mssf"zDvi7z?ۗ0_T0=A= =Ň0|a>̇0.0PԆCbT\<̱Vx)0[b-N:F[ay$~:Ew3|-J9N͑N~)uvy;os.cUNr[=N*s~AM6Qww^z}ʎ- ߙÎ:Ӓ*¼EZ*ul8Fw_vy;ov~}γCzCi͔0pS`lCZ k<fo*_.@W,or~ҿ%ϮT3'_W;Bk~ږ yޫvtӀx١rUQ FW"Xdee嵕Jle%++Xd%#oY3 :Rg1s:z4 SNy|Cowu}xD- M`eh?a8"2;}jvٟ[4˟]^f{u>V79j lj0TϪyCCwyv:T]'ũ9nAt[U;Uj\;8,QUC-;z4N}L岚jj>ͯ?vS}LDw>qZUΧ;V#!Od+ y}u_K:)5 ^ԉQ[Ak\W|5_W|5__nWSw΅JYCw,y >yetB B[|7yBH76uve﫝\ߞ>xסNAE_"H,r$E"WbWDD"H$'@H^BH]թ#zYrNm؄ ~wAD6R\`jAg 922U{ "A]/)1}B| rҧxYd]q>8y;,m_<[k^8!k۰ηPS_'*7rngv5-7Bĩy[jv?IPBD~^|q>8ye~l̼vy[+bU;=g/ncX_rlWl3%Զמ{mL}#zT{ݎq>8|ȃx׭NA["H,Hd-"++J$YE"!'$'Q{,.Ut2ʣ&ʙ]s9ϑO82 Wg!Z6>G>[}Fުn"vέ,<")9nla>̇0|a~r1Ĥ$,hr]"=${Mnu7#ۖ޼ۺdt[$/XWln|fsPt*t3O>OG:0|a>̇1C2uG~?Sub]XDc"{m߫RoD]^fɚ!_QJwYn{pܷ"5̇0?1x.x!RAQHdd/H$DrH$W@BѯRVL.p!<@w~-dqE(^[̕Nto)|G8 S9NgEw(*WP2\:DWAC=K>Bƻ[=ޒwx rzcșC=WzVb2ty3zQu_Jwdڡu~q_v~3 0 0 0 0 0 ÿaJgdalautotest-3.0.4/alg/data/white_nodata.vrt0000644003401500001440000001042513614004466020515 0ustar rouaultusers PROJCS["WGS 84 / UTM zone 32N",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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32632"]] 2.7632427649497848e+04, 5.0134167725698410e+02, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0134167725698410e+02 2.55000000000000E+02 512 128 6.71089e+07 NearestNeighbour Byte white_nodata.tif 0.125 500000,500,0,5000000,0,-500 -1000,0.002,0,10000,0,-0.002 27632.42764949785,501.3416772569841,0,5017540.250625971,0,-501.3416772569841 -55.11695696373088,0.001994647653215967,0,10008.22488582775,0,-0.001994647653215967 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] PROJCS["WGS 84 / UTM zone 32N",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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32632"]] 255 0 255 0 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline_wt_short.vrt0000644003401500001440000000413013614004466024212 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 CubicSpline Int16 ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/4by4.tif0000644003401500001440000000115113614004466016574 0ustar rouaultusersII*@63=S   16 8.5 1 4.7609522856952 -1.6999999999999999e+308??? P7  !**B00N$Dd9FEѐdAFFgdalautotest-3.0.4/alg/data/utmsmall_mode_int16.vrt0000644003401500001440000000417613614004466021740 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Mode Int16 ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_mode_int16.tiff0000644003401500001440000001235613614004466022054 0ustar rouaultusersII*22f2S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|k{ksccssk{{ssck{{c{ss{s{ss{ksskkcsZsZc{kk{{{s{sssk{sccsskks{s{kccs{{sccksccs{{s{s{sJskssk{{{R{c{skk{{sk{{{c{{s{k{c{ckscZkss{sskkcss{sc{{{s{ccccksZ{kskkkkRc{{{skkccZcsc{k{{s{{{sR{{kc{kk{k{s{sk{sZk{{k{{sss{kk{skskk{ks{{c{k{{sk{s{k{k{cscsk{{ckk{s{sJJRsRssckBkZcZkcks{{sssZcZ:sRcZ{kkk{{ks1ZRBRcsscZk{J{BJRZJBks{ZBJ{Zsscc:kR{{JBssZ{{{{Zc{Rks)ckskR{Js{{s{c1kcckk:R{s{ZkZccsssc:ZBR{1BZRsBk1cBccc{kcBkJsRsk1JRJk:ckZRRZ{Z:1BJR1RB:kB1R{J{s))){11c:J!Z!BJ:1Jkkk))JsRcRRsZkRZkJZ{{s{B:ZBkJcZZRcZJsZJBZkcc:ssRs)k{s{ZcZk{cZskZZ)kcBR{sBc{{cskksRRcZZcc{k{kZZsJZRc!B)R:JkR{kRRkJ:ZkJskkksZc{ZRcBB{:kksckZJs{cBBZ:Zcs{ssZJ:BJ)B:!!Z!!c)Z1ZJ1BBcccRsRcRkcsR{sJB1BR:{J1)BZ!ZB::BZck1)sB:JZc{s{RZJRRs{cRBB1s!JcJ:Z:RRBZ{Z{sJcJJJkRBBBR!c):ZR)sksZ1BJ!JksJcZsJJk{R{{ZcBs)kcRZ1))JRkB{JcRRZcs:1J1ZcJRkcscRZgdalautotest-3.0.4/alg/data/utmsmall-int16-neg_Q1.tif0000644003401500001440000000420113614004466021716 0ustar rouaultusersII*yS   Vr^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767  &.6> &F66 .6& _O &.&... .6. &.&  &..& ..> FW>_.>>  &. O&& F& >FO> & &WW   .         >>OFF  &&   OW>&.FO &  6& &  __O  &&.FWW  &OF  F.__ .__O. & &&6 gW > & .>O.>  .. & 6F && .& W&   gdalautotest-3.0.4/alg/data/2by2.vrt0000644003401500001440000000311413614004466016622 0ustar rouaultusers 0.0000000000000000e+00, 5.0000000000000000e-01, 0.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, -5.0000000000000000e-01 -1.70000000000000E+308 Gray 2 2 6.71089e+07 Average Float64 4by4.tif 0.125 0,0.25,0,1,0,-0.25 -0,4,0,4,0,-4 0,0.5,0,1,0,-0.5 -0,2,0,2,0,-2 -1.7e+308 0 -1.7e+308 0 gdalautotest-3.0.4/alg/data/utmsmall_ds_blinear.vrt0000644003401500001440000000342213614004466022066 0ustar rouaultusers 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"]] 440720,50,0,3751320,0,-50 Gray 512 128 6.71089e+07 Bilinear Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,50,0,3751320,0,-50 gdalautotest-3.0.4/alg/data/byte_tps.vrt0000644003401500001440000000460613614004466017704 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area Gray 20 20 6.71089e+07 NearestNeighbour Byte ../../gcore/data/byte.tif 0.125 0 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_min.tif0000644003401500001440000000420113614004466022220 0ustar rouaultusersII*yS   Vr^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767  &.6> &F66 .6& _O &.&... .6. &.&  &..& ..> FW>_.>>  &. O&& F& >FO> & &WW   .         >>OFF  &&   OW>&.FO &  6& &  __O  &&.FWW  &OF  F.__ .__O. & &&6 gW > & .>O.>  .. & 6F && .& W&   gdalautotest-3.0.4/alg/data/sieve_src.grd0000755003401500001440000000044213614004470017766 0ustar rouaultusersncols 5 nrows 7 xllcorner 440720.000000000000 yllcorner 3751020.000000000000 cellsize 60.000000000000 NODATA_value 132 107 123 132 115 132 115 132 132 123 123 115 132 140 132 123 148 132 123 123 123 156 156 156 140 132 156 100 156 101 102 156 156 156 103 103 gdalautotest-3.0.4/alg/data/empty_rcs.vrt0000644003401500001440000001057513614004466020062 0ustar rouaultusers 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 2.0983170908647397e+04, 5.0109700347667203e+03, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0109700347667203e+03 Alpha 512 128 6.71089e+07 CubicSpline Byte ../tmp/empty.tif 0.125 500000,5000,0,5000000,0,-5000 -100,0.0002,0,1000,0,-0.0002 20983.1709086474,5010.97003476672,0,5017540.250625971,0,-5010.97003476672 -4.187446894127006,0.000199562159235014,0,1001.311166463512,0,-0.000199562159235014 PROJCS["WGS 84 / UTM zone 30N",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",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32630"]] 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 4 4 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline.tiff0000644003401500001440000047523013614004466022413 0ustar rouaultusersII* N =S   V|:VmxXr#5GYl\sD-C Xl2ږ$u/Fm\ t$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|xmW[Iqcʁ$r0II96xq~>sƠ^֭zSipy@0 }^3Ñh,_\ZǗbjEPq9v|su;6kH8u9ltq{6~c49>:2/G'&dMN㷩i n/]m\xRلL7-c)>n(+/.rEV̦NNOO6W"P8_?8<<<{{8:>999Mgf׫rtڍr4Hϲ\.Ӟ̉}+u-5z7o?|Ʉ = @(0cy`~eEsnry|qy}k{gg c`rg1fH{ C/)ճOgTXɤV.8S`nw'\3251y 'q'b!/ g< raMh Ya5ߙwnœ8u L=2?<&WYPm`ިV*ynVt6e3rڴ99HiQ(CN˚yHs0w;̹VC3F4[[K8xQ?1s$ igO~ߞ<ṙ=zAfAlO \2.)ay96>IfYr6K r4kB||Ve@!\lsy}kU 91D/`K[dH$`O zPiwfZ#̓ɣLP4W&>=N% C"N\^00767!caO]| 3UjGFi"XaPD^= "]σ}J&c0\hyL3WĹ+Gm"E2fE@ŅA"0B7w~t|ΗHn0Hs|?;JR"g2lNq?D@ V_4j(~IRH|euuEGz4=a*j^ *q^d`naie 7!R-\S:|aډ X+p)utzQI9J-hws“y)FzE,*:u.gQۉRZ2g j$p }0 !?J!7VWט{$)M\v~,_\y!}r4/*JTP F$-$z5LMظ<7(G I)CF`vgX`^>+M@4HuJ|!PenM)bϤaDŽ.1A<3=`1GT9 -bIn$ff.` p(Vn u*){S?.,ݘIx:$̊3Kh^7Cv y3Wd6`Ќ sJO#a-כzfsB\VI`wkNCڪ0?aAouuYgҙ\>ѨzE{~B@I˰HtbHliA`̥skaC<2洶n&N(_B[䱐{z- Jt,/pIJ/;/+Y]K&}U)3NW=L̺So}M٘H&ԧzf]̣'=6S8̺5= ׶yz\.N؛ig)4I1des4u מ:>A?ϻwۻ۫~ܮy>o J '}[@ ճglWVrQ jt˗NLr*)}ȪM[{ rVcTgw6I]Ӫ#pXd>9=0VK @0gNLRm$r9EՠU_EG_|.o}^8+*{׷o 4Rug#++5+^,@q޿{O^][i$ybsVX|;_=35*)ob FqwRULáʌYvՄ`z%[?z&V nu% `=W\0s\P1>I=LxvmU .Dj8:h^$r2TŭQ /q_9aժ쎺Ij(y0<4VI3"CAR ̦zJ[)$!rOGuf2iD-P'3tPNɚ~U?bZz/a 3T)0N3_/(H$1t{Bge.ѳJ2Vu E`^xn.jpRk auY\Ik@zH\/ս:\^0>20WYGk`."c>*1Zo SSܴ?7Y1smĿh9[7zU+*RB\5{y{ڭ:{7W606ϹZN/?wo.G3`F]'kXծ) ~}¦lvt!{LZ6;aWGcաݫMOA#l/6tIwS@ȧ 7&|ZiKUG; 4f=qQY"d5sjs*|YisEeS%!:Lt0>C{o?+5Au{Fz=Jx/~~x݃2^rHitp lKlY "xmy_Z҅k'qVPgAPAPyL4c;~wU>轿HsSjUxF>x.naٝ.6J͊e;hmahppp`:p尚ð`0MXFH  ac tZ9^ A@N7ݻή>ON|mGNŇvh2qd]'/iX,VK7p/u|hN0lZx5B/||'T7xd:/.,W6Z{O|VQ7ϯnn/OOy^޽puX_7V^]],j^U+j./K|>EȽm6'<]31tfngb3wݽxpi]4:͸VmIu"#qu@k/?R9q(h|*=+*O_|Ã}j6[{GgWw7Wg''DŽ>ztoV]X- Tjf\YߨjZU,󅀶q/W!2rlg>$wCXp6a1Svرf7+NH 2T17Y$I&a]z=C"D]޾Dc: ^de.Ld&9#|#P} j( `0 OgBh<9+.ךg7O?!gÇ秧~} glY].J K++x$H+A*/ C|AE$Bzr{ f+A ?[J5f=1"#fVQ:sP? +H%𐔲hp)I,o~ ]o9{p>a1 괓-et#FGxT x3X[*P׃Hxch 3j}Ce#͡ߟ>C>=xyZW'@TBy~.p2[7toZe̋H$+ rd9!GKpS*-JbnAS TR*]@}LunPZ(.9^k̕#v{;Xܻib'jBإXUz<zC1גY<`V.O(ƩR sSҀ l(#pd< }o঵w{|#ޠӺӣba6d |6v͔* * l>BXwƣtfovp"%m,zJ\U9K܀ 6`t'ELX xK3z(=d:su6srMTœPc.&ETtub[JOoծK-6NnܗG{ͦwptzqsӷ_@;خ-g''Ql:9p Y]j)bDٶ;|rݵ&]үoS]`g-!'ubLzF-~˞ړQBy"9b)"ٷk-`y?Bkke:`mQiG/??AMG?~8lUJ8u|b2i桁~56=Vg6jv ̩y@DƥnYs:U'%p뭝=4h;[@Fv,Mя/>_1{~pqXɧdz6LłqA='8Ok bwUM!7;'SSh$ tuIsi>FL^zh4?ՐEpEB~d ӅdRsА+4m@._>ͪQjSδMQN%NiLڬUSuyLUsF1bsN1%p$xN$2sZDxFU3M[7OϿG0د/MOD|ggSI.j2:y7h.z~yuef`St&IM:.mּqܾs2s& zݜv0tr" Ԡkjq'ПSMVAw ᔖCũ(D0VzU`I3tCtq*ID)Un;_M2ytvmmeW.s zM$SlRèaQ/UVk2E*0n]ߐwhNyO'vE vox2PsF̛e4=33rٙd2ΎJ_J<|&4A?D=/Rɉ(E$t::`(xTuo0N$:g7Ox+9{C*<#!汉<Jz~J^i7<(`Qra20Y[*QT?s"p//ãW;{ǧg..б34ݢiG7aMΎZkK\f*~N/JXAQ3e xm[Ziׅ7QbHSJQ+"{؍L2ɴ̟xρ;߻k x{3???7;NdRX88UW+~[[q+fkwcho×]۬fSG[a&>[փ9f,@< pn' ]lq=h4Lg2LCTn:_\ZY;<:9=;???;;=99>>::=֮Vfwk;2ʌx^|߇%AnXNJ`(&ғ 33yUɜk`IwBZԾ nXazh4: xAyԮ 'F}Puz=t D(dNBW][uUUUƖV2TMcw:dU*q)qUJ7 =j~L) 6?6s1@{X[[+~|von޿'w;oghhx`(Y+sɋ99f(0 :4=J!MTyw{kS1ϡ̵v*A]2G4$;)%XG'Š*e9:[`8D#;6S[scC&9 :&\DQ{C%ˆ+%ײJ074Eu͊9oٴJ)u/ ]U :8iM&@q9 2"݊]Nr#1xrb*?BoD~ޒM`{ma: |x&8 2# tYvLǶ!xEEKyפ\di6܄R]RbE¹uu89vԶ<' +Jἰy<>R;vskkDlm5J.wYqkYG *%wirb&&ʉGG#! won-/*~'Rsvt,`V1;zPH89ay,UeY-F8`*4eZ*Q_ȩ*s¼m4xBvr9 kO.\L)@z($q r H\pncus +ۻ0;+!wWPt|='gW6Ȝup{pdo1p|sB*pBU=ntXtT:Ã˳Dab Q%WN DxW8?B[U~<Tzbb%2s.UFy/UYfVƮvzquWu. Pi2qf7mjU7(wBXCe%뤟,UU)Zk:3~ N(3+sUd.]bS]ݬ1q"K+cqDtLVN\WbED&7~#.Ay ?|x~z|t72_F"%'.i0d:u|<'ITl]3ygMSTSfKkH{ n⮜n:ХKֲWR*"1g74M \" B %^xI^ṪRs. هRG|C3?}_?zyD",~q$4:_ޗ`ʾ(ctH0 ;R$HN5  ɡIlڈ3Fj-Sʬ `iikgR͗z`2~ndi4^U Gͮ/n_2!dꖇ!"󒸫B̥eaQ_wBqJx$lfqg{Yx$CcTvfq}pu~rtTĉps˷㷯_>>6g4?GgVp1Ż?}xsuzv.;sCK@O QehX5qͷ82(+F8rK_,ZY|NЀe4pMmYld^KB*NmS^.*6:EccqT37pCc3tFK!SreV EIXr ]OyvMYd,9JgJ.Zyp B"syeןTrlduU Ͼ8=?}//t[k˨iv'D˹cԶS[aWj{sQaL Qhh+[z6u=c;[ح㏆z0ůreЮ+8u5hF]G[6)#aPQg^<ZsVV$Fek/yxtȹu&:ÃI<2&W6!W"sb?|۟>Nrnv?8eK煛wWgGGg|-|{}yjh٤x;ba6@WHlQqSm++spoUK+ÚzDrCvk7j̩MSn]JwX9i0ee:$bֿK80_s٬E7fg떗&6Z:6"tS}_y"l WvO.V*N9g{swiaۗߝ`4ϥcA; }(ο?wp[<(ܿ?pD2I"HcsCE IP)~R~аpFCOWװ{qёdD%$&v[rRjMLg: Yi)d=%-#˙_T\Z^QYU]Q[WPWS]YmYiqQ~nN,)jqJCcsёյ#{woO ~h+/NOIuտXXsoo=ωij0l.)-xSRV^VZ0/';+33+ۙC?;2bcGb3ĭ .Mƫ~g "3pc#:u gO2U0N+W!7űgO>GPIB2COciD /ϟ0 Ab. 6ޚ EL@)B^;(P_W[S]UQ^ZgUTׂusKKkkk[]ݽÈQ pSlm<6 ~h(wdֿ\=y<޳ˋS/dse^[V+,.+/+rbsBJ8I|$NUeb]7 :M8A3 BqB5˚xًW@3CeFA9/M N@Qψy(i,tbncNw͙HOKMM+kYMM-ىxTUVV54O]2>|郺Gd&g׷v;;;`~G8?;>Q[,}?1>8򞜜>_^]\_]NkF?4U2R9 WRM@v:BȇI@!OQU/_W(˹F&:%%V$|ZZ + ݬwkRs 8&:2YEńʥ[-m:?@(TL|tbn]{w=wk }Դʖ#KOvW;@9#P(;yj=QD.:G_M PVO5f.{. 0L-dt-;RP'v!jj/_9l!($BF9jBD0v7.\˭5t< 0'tϸ>f;s|/mly twvј].@_oVGqkbrjf:uCj#p̽0U_H+mFu_\}ۛ Do[m9RDII1A/G v\RޅxIB\ L[!BB2I> ?J/^7oDD-^&!5O#WCU-: jZҺ\UpQISN'.thalÑuePI.~C.-G]kj{ ###c3>LM;2ՅE bumsGptC){vצ* gAYm뇡Ʌu=BP닳͹*o_L!bAu]ֶT kUwd5iP`Y;Ze=\(PfXqвЋ.Al.*zIW9b Opk" B TNd4'/;M%Q{f=5(zJVTuH3pqe >lc}ui~vj5,XX[2Ћ:Mî nEK%uhCnC eyW\|~}w/ٻ6;T@ ѿxp2S+dWf.2d{`VS8ʹj,FʴH~pfJJk86Up< u E),ܻ5jQw7F߶ء0W2AӨp3Q4h&s|7T/Q+kޑɹՕU]3d!^;7٠Q=?Ôp|~F6͇62^]]X^{Ww_2B̌uWW襏sJqC+jhRqWs-[ yEIflf9EMGr:tPi:\K@Y&܀,7\%*ӂsU7"«ADRl1;xt ^,W4t Oίnww0#H伞Mrק>TsQšk99D⽻!3Χϑ/JR)}s{~ Tv4Ao(/@Sufpq0O`CY/Lh{"ef$k8az;FX6LbD<dBJ)~-(o]u +'?>}&}&+^@#~,4WBpt05XjڳFvD}'4ԥOScC}]bAX_ CW\N<ևNk)q/vbvifKpQRr¿ĝzlodkY{ڹYYH#Bٿ>Wl' g}Pܢ07c\bh%wLe w}6ˑ,,kuͭ`\NJ P]g |?߉-Y{* t^~I[s Ĥ̂m]}#V>N7W?M |m U%wAwd$pi[+ZYB>ʦ6FhxKk OKOO%G[ŀE^?=^PS2FDG$c@kSѠEN s^2ԃbyE9z0%!ǖEm_<8iy}o0cԩ|NNJ.~йSx[kKs28j(6lLFG9{?vkm()t)x~$gHEZPy(׉~:7GhC Ud;n12<,ڿ 5V<-R:}=NTJhX:6/xsIUj:|b/omoX Nu57k*K |Yeu ˫k+Kc]=}CcSHEn-/esv; vJFplAdVr? Q# (ۓq ;Dqf'1rV]F\,d^#ٵ\07EL'cp*voIOIOYd{Ov6kkpx5Whi)/&;v'#>> w4uFʲB7({Y'fd". Y$FXrM&vN 尚 Xo9g9ܱӅsmfʉ>N.FLjQ_X9~9].СsU9kҢD/IŤ~NWGNL_^AAAAG˖N!%ŠGnVTZo έl:oZ/]fM.vyr(L ;=>2joÇ{v+%#w6}=3;396hilhj CkTQ}ʊʪq/+=5a1h2Da$Ipэf9EfONȂA!H` ]4sNjn᎑O(.QPk0#P2aYJhDs^'lldɸS0gyCX:\jI ,6h*\9t~$tIVW*.1F[VQQCUV֢"gp|ϐ_i?߰|&W7o‡߾EOԉ8ukp0=1>>19559>J{ݝ-r2[F'&''Ɔolrak{/NrojhhhN6+Ŝ'NH8N^J]NRaٓeYK*`vxY0.A-򜿐`"%K'~ 9[U%HiK5r܃C-/@Л)<*y*Jjl<}ﯭ*GyiyUM=RxkL/./..y]_D\p(x ;s._nq!t;řѱ1dy_oo_USPZl1ߢ)UJujٹl&=rJtfJ3ƨxfbs/iNKPCDF/lXSӛidO54Kց=2!Zdja'/S0=fӓ#^>|:<>= X {ߠù=='8?=>^M  twu+-E &džz74w ;;[C(îfQS)"ÒKƌo#lv<0T# E ObcP"]N^dISYU`#HA=sBS~ɏ̍4q:p4<4AO+(.7/-+):ص?3/ = Ķ~tH >~>͍ͭ s Syyus 7tib~rx+o}k`ppX[UVT)kj#}ƦN 1oYWgQ!FSY5ͧwL~$gxkw/#X[w=uWЉ͈ceee@UWPoF^]Hɹ92\SsKk+ f0kˡ v~mckwW|::>&g볣-@ZA{iwuv47RU ᩬmlĦ{7_^!>p; s3SPh_VAWiхQb5F=m&'4]ͽX(MgUZi‰7 MkkGz%9beR5oȨ='椙Sۭi. .3zyy`cssc} IUC8;0<1C4M?VaB"Pcsg0_ Ս{X)w(Nίo~ud%.MZ =QoCMwD%E`': - ? x]Ciٻ$T V(D"*"&jbLiɦgu|s0<4PѨ+U奊EiY~ʊ ?zѣǏ<~ ej]}VZ]UYYTW%ryIiyZAjZ;:[k+U*UE?BU^V*++WTJLV,(Ux mNW[WWW//-Aoʊ*Tee ZZۨZ[[ZZPx2TWtmc陙Yi~jYMs3SS3sӹdgYp=@(Hwv2DD]_>}_?oo \_z=X[MٙYk-zp4cnJt}+Ecs{}=]m@#2-9 AX0'H^VQ *z53sy=NXS(-WV7֖z\IO! ,RȊ2e^xS0TW-.M+y375R555j?42687;0g`.n1NOz\j_rTz<%6S N5 ֑Hd5 ‘zjg uzr||t|rvy?}>ӻv#a6H:Kvb'Ox$<ɤ3NRۙ~0 ͍q29/s],)+8{:'U*% Jf28=IX3ґTZ`^XXX$A"7!l#qGZ\:vjz 67?ٍ084<2:6dTf<v.Z͆)q~p8pO@ GT'jh% "[>==9^?Cv6B+~PlжY,&\I4ۜ`Dy33=916248pFFn4[ w rʚMyXYbQ9JRKmo3H(3 dN }B"BOs51'c-FI\?1OϙK@L*{Nk?o_rn^,+aWn OKݤ'u~ \ƦfVxШ~hEۂ8ёToLԍfPGy;h4I"toy% gon9}25 $o'g t?M׏g1Gvح >$nwe!D qI=Mr;N:'\e_`^HQE߁*f.\A@% 9h~.AKFeRN咹(Or#ߦVNצÈ ~of@⃣'Zs4512!|pd|jδ`n,/~;fO"epso%w'pWxi*aư ?"p Nzw;%R ߜf7^̼x:O pANX=p#l"ey 3g4)?%o)qsm}K&͇.ٶFm) @,s0H(f ܯe+hxW"|!C ޵-]pYX]Co2yP/jmx  p})jYY9_Kll9D,q j9C,8'$)n ?BKCQo_\d^K1; hQ+Cg撳 ȥщb:w^j5Vy3z/^w#`yQFT`r+\ ~/2]涮^ȭjb+f j\9p/HcSF+RQvA8 ȜKvj$:~УtY4 . Sk: $Y߾}˧]ecAzys:cGh;.ѵDGÈ4vr 羅[;wQ rV{cF4$: "/1١xWHA #-.\:{9كeRd{45ׁ(#FI p R/sq;9T©0.y}Fd9T=4`+|>ϟo^ }LeG8pu$yaB#l$w(x)ey%{AV)dJ 2GLDq_iiZ1XۨW-eE-w hĥ(|UMxHo4.sF'ШϦ뱐adHt?99܆f|7wauC#8UGrzk!l0/OWn \^P4=񓨏ٓnpG*jsӥF-n'HSqn/\W0qFi+сķv<{>|û7n/x $a鐗2d:&D$*zӫ''lj=n/ܩ^?>:LZ^T2S2l6+v\衔ueOĪR1. \ؚ߰E;;ZHՌ&;unh?$$= n0[xvCg7b+ab:\)ݳ UhY, |A )18δ~lxhxT?k.RXjj55m`<705Y,YpG1 Vwh}ww/_󫋓 -(cdQ/QMh7H k˗/__e7#7x۷oί鄻4jJ𼞩sa~H>rUWʋ) H~.{4mfGn)z*)na1yqJS͒ʖx&"hfdߧ'G;8tnDpavu]}Co6-+&M)y\?93G!u A8{ Mvf'Gzi0pFݽ}(2-b'W7Ϟ ^<=;B$[]n &v"a+}rW^e&&j(p<=|.3bmҪJQM:d\A KAĺ E+;3pBVȳ_ ݶ*:{#5:&p`:VF!AnM) y97V8D!N2t[ >V$' VpĘ4 BޜOt̴]%ϵm6-aF?:30:9#}-p.TwJoyW7K )=BaoZ()җi`{AiSN:赎sJy[|X|P@}_?BVt"V<ĩC+(^H^VR,vmHkBeP_&/aT&[RD>12鱁.LЬ{=mOo3X{̷Q6i>}ч9eqAh @Qri }};ZꞲjk*?~RQU]]]U?=|{T?Ƌ*74eeWT?mhnmkkoxo|֊׶4jkjڞ[Q :\P5i]]}ru MϺF',~tN;Nb%4f&FGFFF5:3^K$77aLOgftF/.+p8 Kni㣣yvXtӚ-/GƵSs77x~~//fbm%n e4MxQ ,#͝˫+ʫ˳n2趙 cle\F1|+s W@+*+*<&o(BN 0Z]RQ ([;:h`[▦|OeeK oi]746ٽK犧\_e3lP:9z0f㚱1͸vzNoqF2 pR8r`>7YnbG" .9@'a3'4i9x$KwNx=ˣJ'7߾{=<<,s;x$|:F‚No4[mt:]n)J͵nV~eztC0(6~GFQ#C=[p8Ӻ'U@ KKTVU54`.z] [8bțt`^]mhQ݀h&D&nf4ӟuOTtqsc|I/A˳b. Sډqvrf`uX<]YF螐|vn-rbΓ[@TH N}|k&ffgiu}s;e3JgW/o߾}.T$ర.M_B++cnCe޿ewpi1, zo_~N .04c#}]ښRzCqமζ@ z}]m g­BԈdTրBޞR C@A85|?|ۏ|T/Kgнlj-sBg'] F`Î :@9iNH-I)l@tgjrzި`nj5Pϡ; flR;8>~sH{.?(JŃ|&N&leAxuȻNٌpzAf*NRɍuxFҹVgTta8-ڟwwHs`^"Uj }m lD)g:ѽ@C"{T~Pdi}c.`R&bmeVWlN-&8[: Z0PJ%=> LAF$g9=8<ǟ|g',b!  riYr34tjΉ ܉W#kkkQ+\ mf&};J7{7HdxC ID~S6@/s;exlYA[]Ra# ]|!PjHseHs c< ~sdLq-f]| ghk&qelsCk{W>п}w~oyw6+S݈Rݨ!V$Fǃ=$;#xR.G'Asxc0f>La2 Hs8z #~W'..5 Dƌ@" 誡p|Ddz`jnͧ??ܿ dƘ:9@+eVQ IpL%c^Ŝʢ͘*+T@Q=P`4p̞^0q" :4,wA5p`tYRL4syӗ_||q @nox 霬IJjz% :qq@[ -B8`'$BxrNࡲ2Qszd઴ 'ٽ} GX1$/`ڹp0U,&R[[ ?^ҍypI D(1Hj)NcLp5kLmsdREV0%T;7ʢߍ ze0!=vՇoo oRIՠi}.s a1xaVU5vt£=*> x4A]c}IߣGPB`4bXSv8Ῐ)4i0&b -Wdz7W(`}㧏޽<) DJNyw*O@~=%cD=n("/DEs#H/11kNTs1=KzKpx%ChnRGU"^`V3<Yk4DYn0~(:Q8Dˊ,{,>&u҂L]6-|RV'N%3q}-tD(Eu]A@n:9 /3=E.Yϑ? " 08kxu ddvw߿{ Cn:(: ԃi+Ql"vQ%9h(ඛU {!F-1UqPde"2U\F@@-7Lnoppxnm!=,JD龜ggM2d]#4Ž+o?!{NxoMw=kk͗,ei7^\ӎTʍYv(ʮLvM{Ͽ(ʞ4wc> L*!i1, Cˠh(%Wo߼}-+lD,V&%Qx%R܃n%12͊,!蹂g4S&Q.{232jMO*4ĉS^t_k̰w_H<=8><fazEsnShR"fyW-j|C4c VɂMnLF^[O?t`~ӻ_V񴹳Uӓ̮Wݒ" ? Τc8D_\qcu*0z5us;_<*14o0'G#s/&q{$\$/ 75iu7js١QLT2-.6#l6֌Yb0'0VS%b|D UhF kgؔޱ#whb+wx='Pf5ЛwDDf$k\ȞvBÜBv#MʾXrI?ϿrUOe/o ɶ DX CJ{+7~@^::>90mwÒɭl[Y.s=]]:(.j1"E|٩OIvsO֒ f*NoSIcTg;h c$:^"9x)%҆<[Zskoxm[:0"(jQd&!dIHB@&2aJGUOVw}j}^kƓ|is?:)a }vog`pxdl\3>:ϴr{|h  Aщd*5 6vO1<rl\?i%6JV˻IżYT|V tb.s;0 j 8\n*%5gkZ.\9sbqem}c[)st: SrSС/Ves%S$qj@E=W.2@GJ`8 ̅0x%HLܼy )죢Y O`t:SNZͅCA4n }yrƫBFOudb"s݉`7G tJ<Za.꾠ˬ=e3qɬ\|ָ*oBր}:N }͙S_}ںz2?{k vO2_^,Wd2X_]ʥT́RTx^Ww)Zi&qڂ&1mS8&̳Fo}x|pg})q., @bfΤX$ơ<3e߾}VO/VMgXD—F˱L7=n(q 寨 o\M`vF)<):Ebn!L~ggzv\ Sjzno=_V^N3onUfihh9s)8{]=U[S^,b\޳Yҁgaq3օfasX:5/[6BOLLn,vL(6Ȳus˛{>_)3)e B巁kbc8Nt.8㶣Ps A1ĤIĊl25w9cCfc`zv-:Y@/{s p*7B Ca)ՁbECAL'ch'B>$~ű8Z"HjWWo$N-SE~N! u^[ځv>f\*͖\@ &˞p^\Y]Gq܌j&泐9:7׷חR 4S \[.a&L\9^ ͨaQ]W0t!O7M+D,_0(I6 wO#NU_`6Y./*J8A4P]Ƣ 4Jf8*:b`S}@#_̄v#][ ┾rfNWI]PvjqSc1M+#o 9pqp!B2aJqCj$ F˔7I3Slw6K4r{dN`-Vv#ᮯKJȦ晹Bjԏ1eѠW]qD/k)r? mG$t7p"s|$9MP(ɧz/P'E@(;%fLè[ɾ͕KI֖&ͽ;9kݜ2'ktUʄU OdMYr닼I PH\>`;³2Y8nX \^̥Gf`6>x}Lb#)>f1" 1#̜s:t+Ti&\ tf-GIOWwjt}A{rFy(n~D| ]^LjVB=."dd(#S}d]KK@[-_s˹6끜ykG[܎?[.vғyM$7֖ ܢ}i!ARBG U&6/] $Q)R6~w4qLi8T B-RgYĞH"SX>|/?yt`o[ji7J<1iGNθd2G8ƣ3I9F%tKnOs3;xvic{.V(xEp LL Cp̀pœN!G#'k]΃mUzi̛!s`ނLr^ j iKr SeJs<594աg}SxB&B\)΀,!@sQ74R>xǟ_߿[,I3NGuyb0(3+AEӎ}jz6Y.?~G;umӁTKL*2s2ޅYa҅2Sȇdv"x9&f5HM (->*sa~?s헮޸=0j9fł@/sWEy6\"SBwyL+1%|DbnQ̍ q܅$ٜ$4>iatAӘ\v?|ǿ_|h C -Lӓ&yF cFN`LhMZCζ e<$!ZV ;5[eps1e_hq_^OIn)6.F;E9=X`i}oq M` t2C@ޢeumG9Ӣs%q s5 M/u]?3ڪ񣸴쾽]YGj/wV*}r E)oV c%/un9/gbG8}W_oxf#̈z3lZf|i "n2~?J0wMqp% s:q:t>dVvoJ}qN|>:<,$"j1cQfH(k9Cz{nu#]lKv浊_Dž+3*.X?5/\f؄s4cB).Uͽ]spvHwpHMU4I Pe>Bː͑9n Ky,_:|/}哣5ZӍ DgX.I]kP.6ljXᏪ\/UQ's*iݐ: ( n~woؔ6VY6_?tdk.䪴m]VsRG/_r;MQ[HZo~O7ݽzu+m\-+sW = %wZj ȵg9&)F#,Y <<㌳~:{2R9x߼?㻕<=`ט˰@>S&4ԔxbQ? lT:1זоW֩\anT7vD~/ywHɃýZ1cR*G 2~W@2 ޛ;1sV8r]ut j'MCj@du6 Ɠ2sJ;?+\%R!}:S., ǗkL&6#y!<ރg??}~x^lΥMži ܣ2ʱTKQW vԵ<blJܲax( GDads_(Y,{>}ןR6JՒv2YͨQGHɡ_aL}aΫ׻oqgCs"kP^alm]cK؄p;S DǼZ8f OB8Gc s2jVW Zg*6Z}Hssik[.Y|>Ix:}_>~Wmr)]h.M՘z·6E@ad4}@VNrCD'JsB󰡁{&,VzO/{ /n,evxuW]ԧi.3SIˡ4sDADgP@Qsִ̲w}nyZ r}k{t ONǽN}A&kjjn*JIVW}Ғ7 _xV$qv%W//{ 7;o߹{,Z>|{w޹}MZ{QTi !󇢉d*\JD~ih2F&^@i6wLF^&^FAU)[FY-:C]7uvXmatܞQ܅;v =?~dw}.sЏFUN"-} %kŪk5CUj, þxg2XUIhiimmKR[UVg0:̝.kM{OQV4Nۈ/t߿cj9q'ЊbtAgbP)\}ښ*_S+x񺴢]'߹u6f!rr?~{n޺}av`.ks 'V6|,ȧx{a}au: V@+`.t{Ƽ^wnDl!}p WW/o.ł>o!: ZMBPe"1oz&A\Gz`b+Fgꖞa/C>H_Qt`>69}t 瓽͕و9&&#Sl"Ħ1ǀh/ԠiT|JZM uՕeE^xI^~>j(  VT74+4Ab L6HԈ36= {N t%cv)J7RX {_?;)F= = Fɭo߾~>O$&~k7jh3J-Nz,b.z]m]]=]A.e$^߀D'r=-Θpz/j ȂpnZ6 7>K|Cba;D8=_X\Z\\'Xtb|1o#ڰf|Hܦ\U9]իWEoJ?ʚ[ˋ_e?w?{9VӼܜl@{߸qnE?CE;[ZU:Smp|靏۩Յt4)$qHt5ckj4KSTvRZ@ʈe9᭜C#1xtbq-{xz~qx/Mu[0Pn$z)Icx?0G  :x s2=ND4ALV|;_N/ R1Ѝ:>K+kX+L~qq~.>Iv(B1<_GGB ͝fNhP/..){EhU~ iG5eaQųy~׍nyn7eUu6bqG:l&(=dp磺Y j*}zI%_N+db !?}A{}p 3 .ll|:;=ŝEYb6=(6sVT[j3u ށ; BgאP/FK{aCGE ӽR|VgV֒zrm WqϨ` ;9lQmu4MuU߽}WCMCjW\V ' |?ug=w1QTܪ6t;ypr 7V/,,%= MBbѠgۨnzfVO"?TZ=UBp~RQ=k!;.l \5D'=݀n7d&lm%^FxF0(AjB&\=1 c?Pt`dEF Gwۏ_?||83A@/.6[[M\"AEOOB٬+lw]^_SCUubq\iDoJߕWT 0P@I61zQAuQқEAonl7֖ZǦ"h VZ ,f&kR-7w7VTSG'.k LFg)fr161 a7sW[XmY‡ ^W;((_9`%sII)E"(5A@BۨA0J]߿/&fiy5Jo~qgg+ZO/,]p!0km][TI,(yIvìljߊ+a+ߖ~,qֽۀ~yļm%35vF}Fzkksѷs= w`[\Y[] :{Mj%1CÉCPeTKI<%F?吐~ĥTovya8w1&sHե٩HrJCcGHt9mز9.Hz#eN̉i;3/"Rs.E'*&Rmw&52=]:< ;K}^`; X&76vv;[F.> q:v_0qhUlHUS99Ha PCNgPQE~A^ I~ 0anD-m⬊<3y9ojc%1PMy'[rp5SC"pd3VsP: q6KGfwFNJU;%`I՗71NNjZ cܛgl(?Ni}hr]}#n؏weXb=ڎ8lPONON?a]fOol!RB>"cD,LMIRRyjcjWpO ,bԱE#G> GU!7L"3kIx sTt!sTk7ӛksb9ct.ꢭ0Iˠ8nFT4ON""xzt^H'G͐$üIY6kD6K!ukۅDMĜ]AGMhbPR >vtعK?8=;?M-&bSh~(/X?Ep@ s^F'"TISAϐlRA WK:/_)yKJj,q7M/?~GiNEv[m}蜜C[x"%6V#+*:n+uRb^UFx.S"3 ;{" BvUPԄeH>m'yjmx.]Esř97\"u;Ev߰./uv |um#R+qم5tht<[\eŻҒnXeoW!˛%][sMT4Ыѐ zP=Ptfv)v&11mf3Ppw/i`b\gi&u!"5/ 8Q)N (n!eBijY-7uҸE$:E9g4S$ Хzwt("cppp@L$yE>G`wtKD+~usyqt viie}sgA EMfiBA27 FCmU%yY[߿$;_[GKfաSʪʊ?y8qNn^s.ZB#ALSmBf42l:ĄH g J3ܼkM *bLD6citiiJăN`zӿBQkRh;fH^28in;) BG%AӉ4nL.l{h$s~[2Tk^ug+D7\TKm!hl 8a(}'05Oٚ6@?uuyv-%ӻGWGpzAjCt='3*Si)& b1-Fξ3ؼ|6z9M4f~p-A5|+<[jjjiǑ'½;)Ԥ C͚ xځkhֆ.fr2T46!*uA&qH7bg55HՊ 3^M(ZzS!qh#F|@xf!Ҟi?}Gxu[ZיI2ɝ䦗L&"͂ U@)v{/5k탙;yHֻ޵ηoA:6?12<:9ޢwptrzrN,M76Թ6+-nwrb9֚ \W-UkmmRa* r|o޽}ͻ)(Vj1sEEeeVe5p(?<:>>111953c˳#LY\XP(+Qi Zoh<.ߗ?xYk,UfA{ӨUJR-7UYƦ&ێm͸*ܙhcKerTQ]]j+ RRP(N+ëTT*JEEUioZ8L6F~W~T֔jujKXt=^ 74:6>62<4421l|gwx|v^|?&[V&Pw[Ή=XmKw ,f8!PUR]( s~o_zݯ?ʕ8 ф5:ƶ3Nkbrzv~i%G:VQT_PX 3w;5/ZkhmzєQD=P̫q8j|AlėʴZ%b64\^P@U1^)U(z~dEE2Rs` f3gfL[z)9vXB 5uMLMݽݝvWtocezop|nA}W/ _(I Fs@ ƾ`sG6V\/H"ѱu6-:PJ)30GrS  n}}!\@eb5UrڔL&+Zk M-`2Bf#3 X.49sh"2CAWC^4uv#\ˋK+dzgo`#[/@wwz*Ionl2'W'vgm 9[#]]&MSq${P‚/^ft5Ob4WVQCCܾPKwphx|09@̵ ``]u^%AGz[5J!Hsyq1SHDC vZ1IBVN>-4Ʉ`tl9gb^$ĝYj4uG+YQ4PBUw`x|za%Lģ+=d~y6?58No&ד뛛˳X9uբ6,6g]}= ^7Wq"yqdTs߿y $ #{pkgOO.,|~^z^D] F88$jlf YꉹLi- u<$N+9m2>+^U\ ۀ+gTwC̕" *63`n$PIщ6J7DvtF:;dc˱Vz#F%GX'gZ808ڊ v4ǒFf}mL\Eհ@4&hksB+H"0%Hٳg_Ћ&2sXJEci.3sGeZZ7$P`LnʋyQB3U^j Ed**02uJ91AuovRENoQP0G'aVyͧLSg]:MQ0b\Ӕ\pnTT\N=ޣ:W{ly@*y^y!eğ$\K7! r2Z@GiCXifp7hfۆs32M LeF`gsmeqaq}*/t\gD2%Zɶ'~O_ T숛䝡7w,k&8\FztZjEUtd MoS=ک5MfPZw@7E A!!c I.V> \R2i:\n$<:ѕ*:knZF!< f2o&5?2 [KBfKnjmya̓Hs"~|N}<݉D0 {lVobHm푅CϏwhB^Ŭ" 52-Y=R8)pԼ}ß~ѓ~ z;AÓsQ0-ώԻV <#ẩL̫;ޜRm1s<óҢo>b#C>^L0GFW`)ڂu`GVph7HNNQ(ʎxv*V,6IT]s*:$`hhȠR t (E+\//'kNn~zYͨHuM ԇZ:w4򜹭)Ĉ*Utrp"\8ޑUji|* 0[*$M'bxb#ڿGM)Nrq3:*+kN4v?=ķ VU"M6% <)Q 9' r9lz?ɳh?02a%4ۺYQa>jBIiE6Ir4}ȹ[ ue+E%I2{dE#ЎkEQe]\>ׯ9ytQ9,O"1oԛP4w w7.! #S U[GSGW7Y~G2Zp`Zzti~/(oq,%;x+0 mV&G.1>?N,M t6B[M`F*JLcWR%2kq,/~DEGQ0+sFƶt=Cqh5BBmmM!! ŋp0Tx`z{iaAɪICwS]zr oj09Q$K@Z4  /7˜MB2\FCw1[\ss3SS33=m!Doܯ :|z1L?FsFUw+% 풒x38;55XR? w!;n򹜞 CMHO[UEbn3T.4OeE2i@ǓW~_s9s/9' |J:OF pKgwOwg+=@8~= 'r}LWIRX*. Ҽ˝}b39s fd]þ]L]hΆ1?7'{PY *juHp8q! 6uNEN/z<KHV*E:9S579>>9B;:=5#{;d{h M-'һB@nPIKWk=@ %=e*Mi"þ%~73l?~'RpH)˹I98?H>nbf~qav| ҂;04Ol\r.f]$쬃+9 =Pw&6|mG!+;{5n1EzAO!?ԑsuQ2d4OcshH\'t?7 00>LOQ%zg}`\lxmYC"so۽fg'cDPɂADbV@09aq\_0 t:3ݽ!jw0N&{Ʋ ;7xzS?W2lhT)*`2U \QlPk&=I#ZY\QWW___WUW}|\^US+@7uss"t.׌ERh/nou4 MZNo0cZRkf{t9NGb6ki5\:=hqn|p+ nŠU)oӨ YueeUNPߜ/Io4[VɠkT7(qetoKw8=W,Ro.fR_tEcTѮH8 EBa}{ 'VrH5clVSD!9'&Vj?姟}Mfs@3 gǐJSBƉ'tnbDyrRz<^F)E>˜#1 AM\m>!wۚmLZ"XE#k++U_:]aN[9= m ?{f70ՙp{a>_\.=ۇGGG'gQP~~vzr|tDa0I''s;{x:꾶FBmn!"^7w֗ޮa5Y<[lf9Bⅸ3Z0DcNpW1,|ۦң&3@8H2aM Q D"I뙑6t!ڡp'@FA[+dhǵv t3p`HAb ի4"Pw!Jp[ř5A[nwzvycJLuzT\Ńm`,#1_c)_ @oJ '#NN% pyNold"9^ߗ '䷿NǷ[ v+3(a5jVdtR28`pkjT[œa^DdA<75H'/nq , 8raz|'|mi.a.mgcZcPadJlIN/ҝlq"Kǃ>`5hb`,umb4`+FrO.PXY0uy }+kHt.^攏1wa.=ҟEcz0>AV|vl'vu^CI1 %3Z[NY.{7o sBk:ttVM"l5DTomkuc8#\UUYx_c-bQJA&Q9srC\4tj$G_h# ?e" NgL&;1zL wy@\.'59Ey]D3% r6e~|&XOGh^m,0D`$?/%i: zsٱDg(BҼeAKhvNZR20;mFw,asد7]oâS*>}noxCa>Ř/+YD[]Z6*k+>~x2^KU[xMB<7J]VvgĉA͋2׿#%aFғd)P{:N RD4s"= ./՝*V}qE?>2<w7W|._,oB;ԧ}Z]H|}/ƒJṊ]=ZAnC %#~/?Օ FʶAhRᡕ*UËil*mxaFFYu(EۅK(vZZyX*yUهwo߼_Q#WRwa$!M^ 9c0c;|$\b~gegAkjK|XFAFٓK#@GR}E}dp *fJH #&s녯s\6%їY{&BڦSszC ^/̦Gz{z1#L E B:1 ^[^ -sH4Jں ~AU&i_]SpTF@lƺo^)SM؎YDp&1Z"SwƺsQX3 Y\ ?RˤxROrF\NXFTZ/VƇ0r`H ?CޤEh0/kL1nuia6LOc;:}x?exUY[bYٻ3kD2"bSuM"qOP œۇi!8lZ/]><>=>^֓cCp8l6[,ɠӪU*R!wd.B)BR* ZgvfP[[Z;.\!@)lomnl@56!)TF7FA7-vX?_Ͽkd h2y4fFmV /5VzGF¡@   FbPԫm|-|Ύ\m}}=].}ΎֶN&v Zj1>57'=6^oox0669=;l.n??KoO {x|nqyu+W8/R'wOOxt,w?Om.onK|4 r;l8*#7"W].E+U: }nIski&ԛ.JZR]%uKh:Qz>M/oǿ6tUZ>0w8{l2x E#}A"h?[dz]hij/nm#uf4J@ѥ6:at$f&Pc#a14bNщ@Q@.P{}~<;>XY[do_a?(.oѣzzqfl eZX|y}'_( kyt\n݌#vo*h/sJk9NY9} GzkSkk㷖I{c 7}.AX ?~on)!(n ` |QNnZEg34Cñ(a5J q&^¼h]z72s\]VS,a1AAopl*+;GrFL/?]_;p<6442^?<}T1ח@|{c%9?=6 FFR۹|~ws%13+uۭf! R.2Th U_Ȉ&bv.M\Rk-3SG˿L>MMղֆڟ?/ ڪr!|^nw;nzCPP n | W&F%hKgqoo#_j3х:o$><86VWRTH$ sL%ә~;t2xb ˻G{G'gg@|fbdḘvL/V767VۄU 7`# JU ]ct<^wYCϏv֒p(?86\+RӀ^,,%#}/&Jjׁrr1>'apAN)!x)z:Jr:FBzs GTVAY_S|d#Wmf޹^P&aN.0н}u9|) QbUKX:ƭDi߄y/|jKt&r'00Xρ~O//qp:m,N"us̬omQ NK۫h(Eb X zE:ad;ٽ 9# 3 GNL EB$v9b2 8V3 %D{U]pIP v`N[mV19q, Nx5щ&, (a/ }$q>Gh伆o x\97S]Onk^9>Ꮞ/dv}/F|{s}uyyqqq~ZgWnf2{}210(`΂F`gVb.b"S: Ň D.ècYVX,8iR&81 UH$Y 8t- s&L!.RF,T rՐr蕠:Yf: & @& t"ŽU+܅{I sN:I_d|~x~cR~+=sDfkxy'ԏ 4g?8<o/OwcѾ>3cN!D^YY]['N!7X91őE@`E`4BsؠpÑgɤ՝172EpG`HJO/]NE<7Ÿ>PDiB#9hprjU-3'w'v&( Bc{ãVDYTtwQa>>9ixrvFz6W8<+`"w/r.PӉPllz~y}~@OAG}ÑfcDkmmP0j!P p$էa* U"2 ;=x.Cvdr8œK5rF,%iPQ"8H:;5@R 6iw(~ ZD:l/:MbyRœAW+% 04E!C.Fl6la/70Zz9\^Yb80}VM" `٭gY~<-gז]F1V<-Z'&&Qcѐi7S8QH6w͏?g]KсF#<2*R]DxEItuH9l]1b* ϧ+ jB|˙^Ֆ痷Xld 1662 iX\wݯIՇqN(XlqW% -.UUNk V+xdLq mzRJ@Ω(pSs<_mgssL6_(K2kyp/DV6irX8>|`^f4JDl$-rOhp"+F}aXDea1H,"NI?-Fi2yvvT!݀,fdu8_l_7b998 ^Kt$̷H٨G IN49|\\"Uz yE w-i` Aη?^t/C˻5P"~I(I~+J!J% kTfs,2`wk}uum#ǀwr V8O&9hx}[Zi{IUVYYEewQw &3=QNXpnZ1>:뗿?˷ XEG'bT*R19J&Q*:JcэJ]sZf*|ltddttL6.F}۷o+108844480*~h2iԔRFSj2p8.ay‚=p/x>by>󸝳fvzJD() ltxp; 0d4p>1:#`L& 604*m~)*Oݷ/OWͳjZo_n}}{{!t{qVgKf]?gT\<<<<>=wqς{a34If7?Ŀӳ{ɗY^o4MDqV|>_(Rr'fdu9Ԥ||'&&'ח`qqCtGe ZA.||BINH_;Ii0ϙ0G=́ܿ|v^R*(\Jqg&igNNiFj10t 9G:Q P"G&; ?jBTw^C{_;xqRk/.[g9^$^)NNy~uӹ_#ї.VNȸ寿ksf -VVS4[my٨S6 %J%fk &Cv!пb``$R)մZ*)>\03iy9~~"J5 yQ9X f{%b(~*2tٔ`lV@yH!SE`P1X:!?!U^)| pS3tFT/Hds٬JUkSt=TsN<:$uU aPՁ&uT9ѹ\3vzJjoEB>k&9<}R eB@r12t2%g]nlU0Cth]h<U=>߻ YLJdNЇ)!:;k kC}y9g.#xG?>>;|JeNU+sE0}x$o.q);z)25d0݋d&W<ȩQϵ)Zo]\w_\ 98!5ýP; E]dKr>BN|4k|\H괓MϺ6FSsDwռiY9lNJ P`hu sHɹ@F8 ɑq`#]v+9 y] 'K??~R>|[BpլN\}NNI0D}+kTj4D%^]=-YZ斐spZ:Nl-/y,T6Jj@YE9.A!(Bv[*ndSמpK!rb6!Pb0NH,&sI dTZx8I*sN ؤhw+B@/7;Ֆd~}y͂yzּ@TF^ΦLq>. .Y5]DSVit{Wף,U:$*a"uR뫋6rZBMJT1w|t]_ Ns~XBV.k:?պL6.=BT5W~DDYON4f`ؚTNu\yfZbqH`#640ss*{x6* 7?$vdz[8Z|08.T[(^'Ar+ge霠kµyA2jF>XuУ,niph5jJ4sY"i}hМD%~n4c'&t+jk)  :4:nf(XmԿu:`$"zC(4_gȀ}@@<%;V@ru!=HŷB>EgR9z]Ս7{ES8Ggo.꥓v,<)~b.zc9iʦZk;ãIP>3BݙGյLREg3 "3:D7 |'ݭQϳQ"5RlҩP($EeN"!HmmFc|q)_oy|tiq 6{qe-}i`0e0~mFBˁJd ){}~'xjdpt2/̱ҚERi^V*!D¨+o +8i,Xxhr84:t\c>nn02 +Jzva{%ji;Cpiz3yƮ&CX̩Ԣ/P !' 1o.4P`bS0pj˔gp'S{zzOӻEڈs0ڢo~^{yoK."׹ @&?CHqNĒ tJR^ "lzn,NeBUԩBkHxuyw6-;V#1a"L3'Y%2(+,695k#Ũm1т*Lci9%[(Ꞷ{(D~LiiNbՄ& ~xT(; b.,Wݫ\|wQ=X9`> (Ul~a3+{6ky涏E~Jt*Gux􍗮'[` TUIeɢ. ¬Ebx>bP^9(;1E6͑Ia/{%f"ȅ7YЃ&vuz\ЅAxK&:7qw2K#<ݨ>П\b=HKy3Kwy?DroR8J?[?,4;(|"]4K+a\Bq!>ލ?K4=4+j|t&CQth'ꀎgڂFU RJK;_vD7ɊPEZuҝ3a?0D =liE$Dn6b^̲͆#ǜ圣% msҮsH@0b4óCFFmvҊ}zd4aWya6Gi* 7i^Tx!Ĵ<:*o_Q<\; }KHt/y\")z0AΏn{F'Jn/~rZx>QJ:(q2 }HUǡACI6keT89DS /A(J#hӽNIR>#! K+og`[l|lFqަ;nS↛XJK&w;MӂAL޴ʙƲP i @Io}K[T~]^49|WR!s݉u~qݡN?.vx[b;0ۜD300cܷ{{>[? O[oթVkGi{}s{{{s^^wΎb6 zfnYo"Vz3bZ86bZm6pV`8F^T=:qZM'ckq;t%2OGl;].b\,*dӓcsrA>?7;3==3;7P48`4-ɠ[ҪN4 8~b|||brr ټbAQLMN?NB8;/K: ܢVZT*q *ZMd+݇oOrv3wYtgʍv8cVCw/W}Y;,ˇY}R?MctqG.z7wM>mUۉnZF*I66Z;WV<ǓN+F<Lj#En6@[ dCF0sB1:22:61rB!dss'_XT1`4`QTj:VrB9>66&OQ <3L&ko ZKdB$GY[h:_o_Iu? zz93Rҏ%={v{=}Oпqv<==?C_z'zt^܊P4jw/.ܔV(.Ճ\*wEb KSbs# >>`u5 {=H$8lf j!^VJ^.ٌG^LGIOS:񳘌%R>@ЙL6O!gp*>@FN#!Q@\Q~B/#Etz{lVH3ZR^܎zw5ؽkYft֧ F@3OGQ}ѽTvk`4ڽ?"8z]x8WdcC % "T Og2TA|~9w RN$) A,8<?uۍFxŲ8):H3@Co{x(hYs~ٻ}x|yEq$Hώm]fչ[ ŒJ 5X_qXeZPy4:ǓV'dZ0B_ Qp'~&@] U8>)@9P,+RiV)6Rs[גreija~frL9I/K5?OJӋǧnYKy,K 9JoFRJ0gļw}uцĶbg(ۛ{s:>:=i8Gu(C^ a_h=}Eqv9aݠ2_LtjƎHcSGB ak{ggZ:MUNYŇ$>_,U W=.r1OEՂlzbtxx29ݣNRt3[Rvmt 8'6 }B& .P"Jp#*{(H봪L s33Ꮵ[?8WG3?q@[ۿnWqUQ#1[`br w.:kIKRYE0JIÖ|-) &Cg'ߢG#$:MQ KW-r[\?6IԌ:׹lz|dhhh}GI3*bK%;-`s2zbR+:1 ?#EKf=͗kM8( @7ǵ߶*e%d.G?߰Uw(krtO(sH-.GOxAsLvotuuzy)^y<+XtZ2dpk7y7E27Ddi'GN3vC *O"\*ȾTRv3lۢrЩQJ0'PQ^2`7@$y\T g0o5j ZyV8'_a1,k%^G&݉pعLTe\I$HHG XS2X|#I魰݆cPy<"K* 0F~!(tXcbnwHf1 \strȑtjĜ~N7^x,NjXhPU$ F<*6nc˿js2q04qeã?\u 'Rz9MӡTS|w(n[bW3;b^)峙8Q(-ț8l-Is27v4.iX=PPXG Ihz-V8. FfguRo4 vvz#9ŐnbB*&aGQdBDӝ[m& }Z5hޞ`=&+'[JgyGlND (ҕ0Pf!V _w\瘞av&17yN/R9Npu\^ %`q6 b.\%=xk̫0Qۣ=TJN4MhLc#١B<>a%5p72E1*bx(t|͏;ū8i5h&DyLQOP!ci1o6G,%8ݵ0샵93WH=ZɩXn(ߤAR+ihT;ЊjszC-|r#v2+sڐ8#ɯӪ[2x KwVKEN~l7.6oģ!èU uLEgpxtt5B63!qrOdSףZN¡L aλz|CzE}`>0-"eA>?B.6nVh@݉9,>1Qڪ1jK9hrgh.,ln8FyijhԿiBn;fKǂ>o5̰2~2Ns^7 wsf.=:7Rvs} r{C`0)FId,ݟ[hZ0*峓_5SP es=$"ç77GLpDL\*J- yGm& ;:46>!ZsShZE;KثNL˔L3FĨFK=PqW/.!}FcISTE/ٷ8?.{o0eןk:oar& (J-Ilkg}ZzrM\ ^`,Rsl~ C,Șx'e'0k{*}sy  ] QP<88(򼳡_ I^bwۭ^[ K*uu鎡di5j\JYhIO:O?O-h :VbNN6N [Kn핪xI^ =攅 lإLf;jU<_{Ako)i0wW~ҿx[5˛X==wqey\iS | f](,G~15N.C) }O)AaǾ7|L{0<XZLbPdSizSm9! ,Mt4g j`?K[Z A \FRwٽ>x%#qCLzkjF1{W6mO_lr"j󔗜ߗ(NG7DCAH-zR=fo;81=o0V)jq߯Л3hAİi ;X?^+7]X5?6qa @%oLFF1;>?CcSspƇϿed=˦F~O?/`T9]Puax`mT4߃RIaڲHH$H4Qo38j'n*V*2J޺e/AB^@ fpWȐC6j8x@&_9tzY7˯ө v_4Wnwo6 -4iA9h'(FkEB$Y^utX5.r1|&D@yU"~}9Dn#xuY_Z_̜L$5޻XP" (`bɜg{={ׇ7qY)k &'''BڊhnbsGO__w{[sCmMMm}Sk{8T[U^V^U30<69=;/--JrźJjuZFZW*ulwmzBݽH$ m<^R*Gd*dRɣ.nnzQX Ƈz;;;:G&DKexiqaV0>uuvvuwLJDm0u뒥9@_o/]?0ǧᑑёѱ9 Dҹ󫛻ۛ WL::>NƏ[Oӳ\68ӹG}i(vp{ǹk\_]^\\^?>}{.|۷xwpa$}?E#{{8^]fggfѪT ښj>5~5UU[t;ښj+**ڻ`fn^(/I2\QrL&Eɕ tv\V(Fqkej\*HI 'DGC[^ՠ.L 48?0<1nڭ&tinj s\C0 ''疕&whpw{uq;d D<?bE֓l.pI:Hg\8橣HZ~(}zquO?r'Y4F3By*J%ѢP(WeJJ(LŠwvni,/++if넏ոыL/EKKKZH*lQ{_`s ĭf]!f7.=9͟_\^Ӽ " 'f])]YZfIsrtmY4O2thx|fIʜ]i/q"~ .Wl0:9XU@#y#ԟQ$U2\mzBDW}{z>@ov{6}x24*JV1Rgp{MMO Ғ⒲.LAOWǗVFw? ;LfNA#\_3kf61X R&hЩj70/B#A 6lqzlG|3C#ӋR#K^><~(,{|ޢZPV$ G[t)pBr3,|ۨXLϋeZ E@$Uc}M(SbPm04@cv9ُJIX8=66},+.*,,,.jE6V[=kֶ|Iz@ttcD4+x~l1c5r Fp`euVo0 Jx ;ϓDG 2ؖ ٌ3f1TŹilfg&Тjý :`t+jIg>:1#\ۇӷ$w.iE!=:<&J\} eFfg㻛&hfoBRLy8󙣽n5o*dvA[=tC"4#tmgfrskKsS@UT׀A_~eP__W[ ۃ߫kn2 hY"_Wk4D̋B %#L_u8O8GѬP>>)[j,60CK'ğ14T}trV0y񓋛{yV8IFCQqLҚ`༟1nGP\:yMس[߬3EēI.˘u#yH!j¹iںZ2b0fbp~f sGŅ>0mu@K{{WGpWVA b/$0C#S3 er"!""F%aOۏ}G"bŲQSvK|̪vPP6l@ ".柟ݘY`J;2O)0y?lٻ]]s~KFnM3Gr](mm!F̝_3!vM83=+\QmP00gI 8'/i?}MDIOX2[ ̅J\T.cq4{oWGzSc] /xrJn>AiT ?{ׯ߾)(*G|Ŵ7=K?Q E{ 7ҳ'qI3@'Ay\QABeݏqE-b2FFyRQgffb n2{7l6W<0"ǧWwܘs?_asb&V`3;};D&tiSqңt8bGp"Ҳ<gԎgMs\]`o o"9)n Rln蕫 xNfS+=]pimfmuy1]A1  ʏu-m uo_勗% u|ȡD.'ʒ <>_Y97B2${Hx⿊ PibEQ0X699M5Ѭ`blto.qIni~nYeGSg4hDIov`N/ywsGJ{{fOEH%}cѩպ fp&ss}p$G&4ό-r ~؎l%KQ7,VQ#A̺;r0U2ik*K z՛w%DUH%ŀ~ƞ|T{ozW0n"pɮoI.MƊ`fnA(b70n_ ; w”hkƁJqy0LH>Ka_Q6N*9qv}üh|vYeRgy0sznhFc3 Sܫ\:q :ZAƃX< FulVj~Z. Xv@;*,I&yHz :7kTK&;ud)橯0g//~xWai%`,/i+޽zۯۿ_2KوWC$_8̹@ĥy80&̻N<|h]G ZT}sx\!"OXxH VMZdH7B[Wb^>XǘӜl 461Vӧj}Gݏ %yQ$zb~q n*9TkI88Bph°<@?bVl\0fe}0ՅM ϱ} ;T<?s+j[Ĝ;Z`o;'%2nwyS~>z3pln i> L1vFz<;-v-8{sxveiz5l"0c᫾hv.u+@l̑ʉ@܌AU+[!@:^{ 2d))Xkл\^ղaiTrSmrC:[)E]h^ɰ]tOk iܤ?Gv#P;`>1wOz.u#ۣUrc1h'$]Dpr. e[$OYz) T|o'[x:`K^>{|6I>F˹'EFVkd/ Jy!gQtxڪ_y\J "|.lhmh@(D䴯+fMƬ;dЪ< h&96eoz}t2Ὗ;#ba708hA.-D":^ M-Ht aC E7v>7av7/F޳I@ƽ3چ?~9{wsEo2̃-?;U 201[{]T3h f ;0u:5TxU[Zww X+l1nlذJ{{I{|!? ֖ι^ۻ{ptrzv :{ۛk奥׷燻syt||rv~ustsq^]YXXollol >.y.炊y|Xᑜ%3i$ TQ?G11شtƤD:$RS4çpB"CnN7k*B...***dUT54~X_WS]YYYUSe;3vB3 {:;߻MS3."-&ELS3"nq`ogggwwqv|v;f6hnkh4ٽGW_$]q:?9 @$ggv˜2N6`_^ޑ>`{yvC8>75CGFou9 NǻY1*Z0͈ഌĸILNNDG|S H0/*.$X< 朼8P/(0~Z]kE9ox:r][ilokk )\mrd{{k ƌwõ|~y}}}uqꇇHkIQ98݌<:d_9yzyvr|Mơ#bc 1ڔ‚4AT4$YGB69z}n~aIYEUM]=2Tߍ#fecr:Qn܌ubd S9ښj*~?o$vhmBTe~pB!{SںV2l:nS)96Ŷ~s\OzPE}>B_[_^wAxe٧P}LeTs L82UKGNJf `j<UϚ%hҲ v@4>Z 99? 31L]\ye|dhp-{ Uo 2_յ Zڿ M؜[ǧ0SrWO]?-TYݭE܌m63A'oz_'NN:RIDIF&2KNjT@E%e_+C;, E |,N[&Ыc>mzŗ2_ȝ F`%_mX$Yj﫸w^Xxs"`o)b?JOF@ CoEݥ}a{Wsb~yvLUV?gG R!E4i]N$R(k <+Ғ.g`@k꿵vN-ETCլmje•:޶)3j[} =[[{u)]Z;T,U{7Cooc: !_S Or2q\\"cDl! C<2_p_Cy'80 EΗU\]OH/jAjeerQ*!9-K)@9BKՎG%Q t]b.!g8&' I8 f#Gb.91$'!ÿ64w9} VG&O6[-MC}ݝU_>r'' \c 6Z8*٥?NM?S51V/\R/A4>>Uyb~3U @@"B ?0* |2 ցie#*bfLMYqó3R (\"2 sP SW ҞKY[pz:2b1 UV?EH.Єb10~ R'cyY |9QOjzU~Eݨ&U~ȥ`woh;:w/4!>4Irg}j;[Iٌ:F*[~tV/@ RpIHҡ'd#4Q|%4 j'CH毨Rk’/U-\e% wB2kjhhd"t60rcxxxd65n)aoKTQ77fp{+SuAKMhڻmn0ß~㷸@)G7ab)>6O(VFXuzuvcT,zrRԗHPDNT.SS3sU; #vxʷ!9Wkl"! 8n]e+y]n %Սm]F,V(/gY,yj48?0/oԂ?W4~5 ,0u`NC@]>pMA!.dB?=JeS“ ҞԒĤ6Ul;lw/M\Dpˬ -k "ڒ{vjlxg >wG.;OgfeDs\N?>ըp*  '*nɆVp"pCNY/`d:7=Ka.g`ҳ8բB9NA qi2c0Aؐ A&@pbӳi$ ҳ JQ  ndnmF3IP=zEY ]K"IY5y}}sC9d9.;;%s2w_ *y& K>M|#.C4w, ,_i1?d SU"$vMO t4ru=M-]?M_ͣ8kpzKb.0p`Ds2KO=wO. \3O Hsx{y杳N{&32bliL*Z:VQ7@dŻxMg[bL #fŀ HT 9"HRP̘fҶG[j:}}}}Aѱ1 K?#ĤX<9! {:ym>q@_OW'ٟO%SSCC^;L{ghT(w疎 ٜR7`,h<^v{@0{Nf;n_ <F9/N ]_Ͽiϩ kv'n+ x8Lvrv~~vzr\j痷߾_:?||syrT.fۉX4 |f]ڝ^nWU}㸜ۊqԴ|naQ\`t#vt苮.:@.p'z{{GgO_? (K4dAT{M9~@"N\E0 QLruꢻOD±>}skgߐ@<=TX׽f"r5KKˆU}ÑH۵p8(F^uOϟO-]Cr~p›^Km F|ZVˀU(g뻇? qe/JB(9ӹNVFG;~̠oQ8oqAU?>9{|aЩ>ޜUizYNڪA{6Z݁H,'ӒqAMHd3s J3@t3{{Bn7Llq666nb tBĸpࡅø )L&Jt~owQeXFbT:%!}=8=M_O)E?~] :g`t\23+V$C^ǪVPLf˚f_wyM<P`AӶj,J'FqWƼs@4ԡ<@dvl6Le*wөdb+[(5kv߀~X$cAϺb^]YY1:eMf J堄;_> 8/OWGru:z9ڈmfòjqqIgF"Aը^먐1%-/-+գaKomDB~jiV]6)^B&&izX:==33-" kN7u:x䦸@q;[TYB!M>]!s72_-a̜BѯuZksb^&_J܌Q:]8چ|.0pLbɝllǃnǚyl|n&JnD!nO~PH'">A,k:fIvӛTnrTUK{{+1{ci0J:?~FǏoo7GIn[R2h<S@wL4);}0+vo,U8bBaw6>j1KlvƜ?8$gA:=#Ȧ&Âqs(]>qCYIe͊3I':hNt3A:]eJMA~wG 5$ttDb4-ucʹ87:W,6k$J裸^LxbL&7ŨQ̈/ m]yqm2x?b4pAmSn'TrO/h݃M!_jBXTTE‚B>~T*W/9/O|6!%7ouoVG~q'mx]I!)|B tjdӥ-감ϲVg }䫚<)ba~N.FA'IdrzY0lUxHJ<ή4F>7O>$c&KZPAII}gbmJf;[ KP&>EnRjhm7$k&H$$u1>|qO'~jCraiDH.[Ԛ]A~}_vG3dߟޞna\mh ķRd,蕳J|a/-TER53yvY "^ʒ)jsX@R17-APBs3IJQOi).saHY9 hkmiiim`NL7L=_t2ϭnBuz2lJ"-j hKo0N榼5v*"VI[C@M-`xy2\FkdI$0!#wP=Վ`QI!-1eG7-Wh-xT;nՏ*U0 |{%^)l._,N/oƁb_6尯{B\.}rQ,gcu.Fz0Y8_B20-gp䔞FP)z3xjr%2 Q̢qU"e\3u1? `H[ഴHTFI8nvژK{/ _"X2IlV!ͭT&2ۛ ^5'".hL W˘JxE0453W*K{EBC,eŰ m9۔tFiv|~ /Ϗi87׍ >}Z?gNai>3a~T݊+ˋ(~%e4&Ժf=oWBo5hS(/SkJtRw)0kx 3P)ݥB67ĝSw~saٵNBgƜ4 e>N0ڜI@<>%gNP 16wcIt@>%u4'ط 1Jt#5!]v# !ī5N`v8r F)d3$G*UnYI>O˔D*_Cy 94NQ9TPxxyoTU;;l\e^VEڂWV1<@7v˧/~tUoztK`>C&ȩmMS ЇK5:VR,P(2: 1gtH袏J? pXvN{iC~wE<~gG?*m.BYl7IrfA yE#hZڠZ>iU/nɬ\6isrz+Ț~_^>>߿ʧ!m ~ɉ_]Toɺj2~<N2ʖǷ??6ٸ۬SG$4ȥeEPDL.k޸b--L59c.E0^CN潏] tߙG@Q #B%I [;.s:={m 6kݱ4{##%%LhH2WL@μPܪrn6:sN u;w~(i >x|>Zqsˆ;!jB?% y$8;ӏ#Fb=;;;ީ- %̈B.߯FK>6 hEL E:қmI֞Pw6`qie*- -*f(m6$6'krh`nunV{V+-o&M@]A:q~pe?"Uao/OkCxPd1IޏӑtO io8@A1C5X I CxҸ uYiz4ϐK(ZMKG^R9dO&c~);="bۖ/#hV$sv(a, is[;1Gj6-PƜ%I/4W7( 2qɎߟiN 1㉭mDe9_%%]F8>F32zd~?,:{ld+|jg+/ 0$1vdV^q  1n\2G4.i9N8aR?5QF.зa H/wgtĵbZ3,qf]$bK&t($|O)DNmÍ >urSЋ7r\:V-Ǹ<*$yaA6Q.q|4:=<s 2-ЉGnf 3;_W3dEmKz<i`> 1̨04|~*h-a|zv;t8-ׁqjng@RE:+@ۯ8:Zzt=+mU$>RGhZ^)B'fk< =ANmCs~ո\0)=c./bԑheytfU*{Ƭ]8z<<6iכ`@K\z\;L2 u|".\YђyOp:#L$DVK'y|Ć*xvZkH1lq YNxhD02}8xyRj:YT Srip/JejiN..){_rr6_N+l:+.n^(?=J瞬`Jprq}r4|9)D{"tNxUWb҅oݶ9PATPQɠ"H9Kshgz:÷=λ֬ipڻv`?=595=#X/J"`nvvN /-*T(Y 5liQ4?Ǜ%'XO=}CCCCS<=81ś[He ojo73;OC|ϑ.x>v~aQ*_Um6ZqwgK|2䲙Z`޳z|>ŤӨ6lmktzѠSrɂ`GɗWV:ޞeǨhzӮupmV+}cLX5[l<!xT?m][FID#DXmGG..ZgQ!IBTgRDP;߾]2dt|qׯ_pwsy<;i4NNׯ_} No8NN |r|l|rzfY>Ǜ++2X Vtsq6֩P03=1:<bAq|d~T|pA03Rh~U| Gp~_ڍRA40o//Zs ϟ| Ø_sQLd LёI#; 8&P$mmn@+roxMPșƧI 1c9QGm+Ir1E jP"HqjjKQ"(WLj KQ.wXZ61wzAi5uku:fe(;X`^?[ZHˊux FDw,/Kj@~yun֋ɰh<'YOF^/v̏ NR"!pz™jOW\*.TO۷` /:l\^]??~9b"B\HG}O PH2Id>|u}7JRA諫 ˖D9H<>u9_ө1Ϡ5H"Dpa}qԙCjL*r><5ZD@GѪ6i[U9ڋp/#^$(1JLaMO^ {0;i58\@(y:_&j!AA}!܀^*l&J&bP|^nݱؽR_~~|Ӭlh]3Sy*g!Θs:@db]$s"uFX>9 U$M`Pm- 9ss0iGX3'Qz9Y2qz, Y`oݽCt%ZϗB*[Lqv&RhBZud P2+VO-,:\Jex .: ;V'.8Jv"վ8ߡbKPxTȦ(YB8 p]g8߸~̞.BɁK~l5Κ8Av/Z-Ub6; Kb%DJ;|'i vҝB fIe^@33w. R`㿾j72pdjKF><.bͭomt??|>x,;\2G~;?mԏOǧLJ{矿<ޠ"RYgwY&' Es/^ƊdތA* jЁfpx<95Wy>^\.d Hoj1Gs&g.3.dল|My`\oiYrC7m{;5h?MOL#wG?=Z$t~' fu =E!#k(',ߡ o{aT/J'4XFJC—Pe`lUnjw|BYs :+AB䜚}y\J'09@F(9%(-׷t&,2Mp`5.=DCB$úzewC2T64Fe!LG:gV0P/ OHN77OdDV]J)+X kY|"L͐WsKkepDz)(7b%rŦ-t۫z>C`t{QJ-dJ>tl@,S)[vw-lsiQZ(4{5\2b \MG+q~FK8;`J-Oʺ Bߵڂ:HȺ,}  pл((|̰aG&8clVNc$yrgQǕhJBG"D""q.+i5n+e"4VTh 0oHfy2t BGkHNwQLP?7<)!]T(EB25ZV !g˛fg(Sn41|JaYd@%\;9;oC&IhH: `'Rbx9p߾y-w?3zщAwlmaJLDOY G%Z9Ć84&_s~^y\͑S/gpi't4ڽi"L"GIrK&t\0 %kczZT4o1k7V"##ϹE ʦ_=~~<-!wya&uZ+{ ;:Ft܂ЇHLdQYɛ]mhTk^ͲÞ%BQT=OӘd (-&Y.dH8Aׯ7 vG g3}L$s -; So'ɍ͓ osGv@Vt*ΰM6A0RsiԊL3M-0GFViбvwB*5ur[tRԬxUcg_n[Zn?prmW,c`@3G2x;P c1 q1_Rl0:T,sZMMڈ(iHr`FO[Ww-dЅl2* F.7"`cϤa3zhv8\ e3FkzSi_æ5-Ӿ$Bk4ܬUvFN=^PZjMy7,j% [`#|DJaҺLkFh!q' ŤqIfsd&Nʾ7H"oљi "A/-ZDžˢX։l/8y?)ux]Cbiݙ`6' AP9G`6vݝ/喙3>%\:N֦uՕoTTV׽mjimijxSQUSNScc[>Mͭ=bG$%ROuZUWBz$^[WRTJtvnTT)QWg;Ng){NzDG"+~FTe2O#&etttljw‰rR*K 3TﲚJGn0ukF ~iY6CQ+io%՚ŝ󻏟_-3s+[gﮎA%7]^][-.&SH(u-]?RRLcO Ǣ7 ua-vήnn.yHh4:8bw"t0fRLvzux^7 CohFA Hz:edRIOWG[kk+3'toZR2\`R03tOC4ǘ7IN s K^*< zcfO%ĸ.q -v7xkJۚ64mlLJwBafnayem[ИF}.]8?/WJKsX8s;#C\jM‘*q9lAOuiu#l~wrq}uZHxnj:OhЭ`,MNx"=YXZ=65T7CVm 5`iiлX *Ju) (P @.v;peB j4>0nD̥ kЕ&hd!h"3%ERL>ID.(4cÐt:&Y{nǸو{:FӨx}>D*Ia eӧJ{g7wwϏv7W%sJ!rۭV:67../&qBkcvX %u|BЩR52o(>_\{wt~uy[,z-Oi BOf&2p$ͭl]= bkikkjdd ^L_p6SvfH U>9}+&2s.iia" vX}ο0 =E8;c:j6 pnnynp4ib[;D~75vy}}u~rZ\^^.mn]\]]l.~(<Vl~n~KȸteyY1Cۉ! /0O$D,豎 \d0nOgvEs ׳˫ýw;;{GGx9ufŕp<̦!F6S3W+9huta JeYIglypJ:/MC烚>Ma^b"HFCP|rnm_)]Hx''_#ʊJf@ cFi!rIjۺDs\?cDGgf(#$Hr:,PZxCN' gG;H,I n@ v}yqvz" f2:d |^U*=X 9sYMT)Z?Nί_\\]>!zq. Ah'Ā&`$JрqH?R#W~6 t8|y/;ӽ|=j@4T\Xf@~Z<MTD|B_VWUUOjMs!vQMG xd:eo;̧)ozhlG 2/9+v8EAiH@ݏLd"&pO.82jtg1eTjCR`@F(i4*4.ysw=o,L">^8 T[0D,w#n2*h%1P) yDd<3gKۇ)m@GS SD,),ocxO&!>DZkN$a9TJ;sU :w9^! iir+2{vНzi̻WQ|f8uNugf P/L_ЗJk뫥\R`n 3шMX ӘQ#c{mtLxV)0Tm`<'Z+0]d9E<\162L襁D=0ă_`N<ѠRfnCcQEz=Fp<3=<15-_=||" bAl.0JիSlq@ ߼z 0Bj0meZ!Gr NO݁~#ύ;R@"r0k]OąY8],Iq31wy<.;MȘ3M&_.1A$ w 5 c/_>?=~x}qzJ8B LdoZˆ&+3$I & j^n~.yym2ǘi!tNA]K8g Τ"Ae/a"=(mwP6r΄@-C(U Ǣ9ӰL x'Doabg%J)d8ήrOvLry5f;{k ˫4CZNTPS}SY̜7N״S Y!wѓ+_ihjGΛ13()wuxλ\K3MQJYe !Ƿ d#dA#"B,X7?rN_c6o1yp}uvۆ@ o60x&C93%zpӛJ5"৵B2)0=/~볃Z<@GœAX\}*)>RG¨\%0e?}xu]@$1[J?l'-O98xfSGuiIQgkS}uūojb]EB*ۅ.O!ZTΓ>5fZE=!";R.&Di%$lK;J0:z0<8Bf3bL6_,3M&R.>oy.ڻ##GBF!Ey oOnN6gse(h߃^ܨ{e9H`Є=ҙt*,sZܐ,`jfeo_wVD235nwoMT*,FN7V|cyFjPqdN?/u ;O:f- {4@1}N!;4Ѭ[B.耶16ڿAIUOHfs##~a#CCi% V7lFl*y>+|pG:ԳX";"9r/ۧVa7ja*~17h}VXt'Fx*MNbA2Ww2Hva竢Ҋs˫0P\ <<">FL}E1UvX G' $V_~Jq§tD^MA?˽SĽn&bFR7BH?tRC*zY#Nw'kjcdЗ'JGiN2iVG3`sL2)iQ*LSylM- /U,x~e_.7 '"~C?Ldd *(n1x#.>)~aTP_!|;kť-X?<<>>~ypwsqnm0NpEOڒ\e }ֺ ڪ׿_ѫIRSaμkln&lϰ^#nG?74?Ux])B%h@e=g\`nA%6pY.4Ee!OQF8sHk0}D2XGjۥ;̜rx4D-yP-ejø?=q}twu>rsSDg5 rA͙9m`0B>4<̷o?vuz}W/?=Ç;}` ?xWZՙIL4v)bo( "HG hzyqR&\L޼ok֚9}wv +U6QÕ+u MM M-Ξ~41`Og[ ._kln%VY;>.WFգ#C9DG"T,vǴ g9eSZqfQ {zFpM`_L"Swo/9{Ndاx:?_ϧcAϴnO9^?͸INgND 8,FK0;ٕOo߾~tܼu޾?;;ͫ{'+ʈy/nu4\!8 -bY{WwOOwwwa!+/VU_or1Ao"Gk]FE[NZ sY6V_t+E,!g/L18U6nEO$+4 3Nh4ۦ=h2eSqf`( 4L:CcnUJ<< WԀНn?%0O#~mrlXF3'omrH nSbqi>`8i̓Z aV s̈́lwz|imkwo{OxN?rTk{坓z뷿q}|G>~v٧ϟ?}|Ϟ<~Gwوp8!T Ik\'ļY,m;hooBctwuW]x:PC!Y$ӛm6tNqÕ˗?wpAU⢲V3Wd3M0 Fќd"{\N~cBkE#!ɉI31~Rp+H T:IaW(ԆhaG޻q]^M.+Iɋ\&qD*qXM͎" 'VKnt+5T̮p}|鋷|__~ӧ߻Çnm,.b%r65CՉy#V*kk[J F?N;X2UUz|L89N?765K{&É[ ڑvQ} 1OmgdtWClos EEBθpi70"D'AqXz@7Y!S601>6J7C! ݏT:j@_|Xke߹{`seq61s8+,-+< ?IdryO tȨVoryCRyskWw7Ke7O҃QOEFl&N߿y7X||woݼyv}u.Ō06yO;&tSC]mm9Fpj!сBK"ZhsI+UŹ@_/}? Y7tZnn55}i^ tPrpgHQH\Ihvb2h:f@)1\ &atr%V77Mf(4\.@Gk'SGg-oPwFsD,]p<tV.H汊!NX VYOD̏ѳ&9 Vo$6{Rs=$߾7Ns^/::`L֌c?W:_*aL@&c-hiux0E$`NdvlЩ}&'WpiR&F \Il%yw:[p3[D"ax2r3C%l\>$0*2u㺉 *W)H! akI Dqh4s+4ojqm{ģPD~qe}sc\8h27T\Z 1Zt;([3O(](׷vG;\jӂzMl3ѹO_=cB/<׏iJ-VÄNǦ " 42nrrbqSԢ蠁ϓBmR<d2aSSNIiFfr^;aHS EHU.Ri$#@[8\ H }d*NH+cGy~v6KŸuZFA,!{L%D.<0 ܀]0͠U U`P,-g 0K./]dX$_,,fi2< 4ponmon-/\S-~| _lf~'~q2X휼H49|ݭdhAj*z*P!&m7][PHhz, 6@G2zi!|'+T99YAPB{πB9jm=kh#&)A0FM[BZS#G s8eH*Cyg4<^Lc|&& Fa,\PfE=2486Iݰ ^ϧ1_Ec(*||?oh><2 ۇNNw7V Exݽݭt=};s:TV;n;1 1"]Lj94 vMJLLv@[0gޣy+&pjaʺB*Dv0S?{/:9tF="] vL<0Z+Bc@l.$A),p&CcthNf(([ $Lɖh ¯ЦG)N4J1~:.9C0/,c>om6}eCזh$)oܼq|韛-t}i>ON_o^1\[`I >pb\H3T`̹);1sjfaS!p`&wӮHBz`s ):ǭSjT.ICͥ+_*iirI̳nr\Q C C omw<+R"w2pq|{nSNe\d)23^Ќ](v0%JZڡGz 3$Лk"R KKŕ5HVy1џ/m]~k+ L&7_\݂ԯR'ͫwP)}x;Pvh_گқC`P`ΣN0T9~hLMYf,nB>wXH<84h`JC ^"AGZf^]uK54N~ih #¨4pF##1Kh( GKpFO^ CE)6ߨK?HGCVOW',5$^6zqfK˛;[ -Ņ!^_^+h|D9r!JfaAOsh^Zn^w^I9k+/W]j]B^մO[r]?KIt[pq<"I1ϿHcy!C̅0=\s UuM¯^\~W>26Anǎ$`60MnL\d*^%a1vmiƑZʎ onb6B rv)9T[qNlz=m1=-,oý "`C {;İ_*z } 1;")fw|Pv'njm0+|@{TޤٷsT]_jb>Ӑ6o=<}"6mkW==H^ w3!B04X j=ю)1k. ̑e 庖VŨhs4D<^}.؍*sV7io5ccF7ZhKAOaXg-P^q'WIdfr\53' X)maۡDc s?>{>1<߿uLe0Ƙya,.1Ŵ0oM [+;z(|3Erl(yRiFu>D*{X՘Fw6^op$5}.P)5zcc&]f)1&qvp)Ci /0|NntxH'w>mv;m''83sw}3\m^ bэ~puhJN׋b-aE.씦bQ ߼7ʪiX_ +ʹUQQ 8[m\&45s%kjIsUgWw$ RB0K%].UUXYkҢ’&.&;&PfOVf}3<];Sý (q z"H'KH$D$lGv6VD2ٽu>w?4*,C0@qfЪW[ BZTXXԉWs[T^ecI %e: "1Wj^<<\,sڽn\" 60s9;.ew ĸvMM=U'ٜ?@<[M5=:7 ff3~+d<t&zT*;67 ZhS:LvuhIc#C$SxX,vO(OWW"!{>}rǏ6-,.7xj}s{'HLi߾}ANR鵍͝{PE߿{ɋWo?~?!Ne'yj"d|)2kW[QR_PXTT+9y-`PU%EyyE z9[KMe( e>=af7ULLR v)mV!p&#!K WdT\*B@>0gB=7g`_sOMbMY]>|leJ]YMWcaI;թRu@=UҡT̙LsY:M}'ޝ4w3b #dj-F&PP]^\a~-ʕkE"0UexM7nɵC;Uh"\ ƫJdM"w ǘf|qdykK 0''gSIZ/ه;(H*YwCi\f zmB]m)xvݙ|-_Ytc=jNe+Ax!~ VF%IЛ@0uX0'VzpLo_=hg..y8XtPx=Ǔk̹E5zz-{O.TU`s& (ݍĂf,9[]]YZp+ G"]ˁۑ`eb p ojPGwY BjYiomf+\CO@;Q5kSiQk'Iɱ\ltٕŀsnzlJ CHih+}Cx5`ʶ9=R#<:\\ 6鏦v<>=# *e /"9 mnIM'J!̺|& 9jϟ,}"5 ׀yt3g8| [0F,R$'^_[Qt0/o*zzF?#!*E#FXr>r`D:Q7ۯ _ S!r㌍OL (S3G"rɶqNk蓓lM#f4\`5|.jwPYf!䭬ˠLLȟ^<;9ҫKzhC@)hsqX sv_4ww.T2+хPx jcz~}g 4blMs nc.phN~p'<䱙 # ><}v:VW GBͰH %y׮\/hUnJFBy%楕g';4c3R8⚚vU7I4(ރƉOA& hXcs)\Z'79ip\? wlvB؆)/fV,.E]k|~a!2͆Z ^3'7*Ft~yA;.5F+ Y7޿dzno5 xPo`?mv~K ANJ!_ӻ6x"߲Z)lg摠:g0 ;G>s[YyEe%5ה\/ڹl;e9fḆΦt,:+M"uUyM ,{d\@A#A04JZM`C ep7ẵf8M2f Ih@qKApk!p٠4&F8̥HudY"M?b[ cjIgh\7gu.\CX(+LÜ,'P[Լ r8q7;wek}#C}og+J,/qSFa>~="ۿd~n\i nh4g>zp͢6ti9KV%WoU:i:BmKj*p5g9ʍQ> f`k"3?5):vvdxLvi l2KUആ 9@Njz{{)##ìL_csz|\Sf)l6e`B;тpN${,L\OgGJ?2PT40?15Ee7663y"{O__Z{;×)C9>)6sH;XW:χ7v>+_<),I{* w~&O?~Gʧ8]]@.8Z՛6Cz\MEiQ>KkL'ĆVol g!M@czTaHRM1]FQ,j`%Y۠^PMD尡Yplrg)릧GHHGhP>j+zSA4,(eMOQUs~C}%P OLnZLT!C}N`҃l͞Ex8w/c y*+`d2iзX#O cA,grc6:Mܿ^:cKisw\BO˩[Ro ] v%s0̅R:9aƬ ? \qMLGsY3ȕYKkYa؎/(kR;, Iw ^D}\;u)qRwP'YB,X01:vl л:m4#/vP $no94:Ad&Mq^b6 }zs8f匐iTq gݖy(U,Sh֏Rq -"F{_> 8y_~r׀e\<[R"]so5p^GsUd6Hx ywZ@yE,хb Ԋ/.i"aK1U_sVaj5v‰=6>g54GUP4i׼ m#|q9G`_7/T O^4eAkz4dkh÷/7 t2{yNfY~8tȏ"R2=qE^b? rPVͼ}٫pxmW[Y3gwڑ`09(AsFdI$  L6`r2vgOxgv>m#~꫺ﵕ{Gwo_/7gG^Q|HĊي c#yaaaἈȨh>?&FÏOLJNNJLO_SRh$'qK+  %&efV5wO zR&m4TWUVWTVUT椧$ɩ9ExeS{wߠRTz{{ZidЎ*dmxҢ4q|06NWTVYCaL|h>YRUWZڻ_~Y`4N ɉq(֘z|Ro4LtZ =62<+f_=ǟ?'[?owG{ fo:>gW6?^=<}ykPtWo?_oG{7w`x@(Gq//OOw7,ȅ"(66V%аp%$8+O'.DZKvNDxhppHX?6!)5c!SMg3ၮr\jʲ܌1`89-#+.z;Rigl@927NOUҶ&ICmuyIAvzrO/SPRNRE{Ѯ: niWUa7H:z:dz[@p{uz`6MѠMj5cWhu!c#])ѷW c߭~e?|{yz47ͶZ՛6w>]^@NJspKo/w7x; 4"::Cиo`!'P2- È=/2:F $D I[LUđYQa!A(A8"*ƦLssv0!XU073U/"ILJI/ >YOCJ@F9&fh &gD`cKg@PwiIqqqIYEU5@t 1`ΐɕ@k~Ax`{}yaôtI ŠB9D GFF=Ξ~f`^\>?Xھ{om_x5c9Y;;;9::y3cX(-BAAAxy 9?4 m3[#H=9ߘONԊގFƼ̴$JZ#m=>Y/1ooLMfar [IO$ƃ9JFFzD%c o@A+wwԤvbR)AIlCn| -!%- bݕ!܀{y/$E c  `F6[@„[XVɎ)-K 3R@ GKHj-Jzz{-Z^U{ 9sgLCd1e¢bZEýQWBX@iyUmC̪̭Gώ֗g0rڇUר0!EFCo<0d;~bT%PLL{_^oɫ]݀Y7Fͫ>{{@7 [[{'(M9ƾ/r/ݧAyݒB o6-h`DE)PUMm]1{#H]q7F_9D O"!k[;{1 z;1zT5Ћi$ixBQfK1fBEnA!`s*gvLÀ',+.s0U#HeZ/_H藧(fi!asj͖Z= u0k''_Ǐ)xY?o@ 7NN>lo_|"JX>ޞ.v6_xLJeuw7VVax.=9mz3 FH"΂=0-raOoc 11 E ;{QĄ Bg%VeiANzr"܃?_Ao "mmr rm$v8e nyzVn>Cފic('?x $$uSF SOgWw.>?>~8={fMz}?Y|`keV˺Uj+kx- ho в+7S+7/_ZuKIREQݕ2S `6.qu9*s|9G+̱T7qQ )+z m./I'X("HCD@] c!|{P0!HEyȀqT2\#esgIERQF0?7"PoTJ%~n~|Q  FذR1H݂-9 9LF϶0?{߉;ۋy82vwptʼh]X:<a C1wCsqZ<9Z|⵽?O`\7#Ã]:^S"@g iEE0ۄVAjklFQbQ $ 8/#9^8aT86N`p(L t6[@ [` _<siL$r ohri{ % <'چjt(7-nbS?-(iQUr `P5'g`@0rkoŎ4ַˊr3-:!M̘CEw5Kܙ++KK 1Kp^*4|sO7'4~z fX9=aPS SigȟF|8>{\o.JYGs}u%v&SR SP 1NM#ǟ *A/f'!t0n+:zꕵo@KK6F9tzBΎ 7dc錝QNJn΂[ }<)id%TX]mf: VqnXCEDg=:+瘣I_[nbBj=m5܁=]d1iY .1'*tNةCť.4Uڍ܅/z\_|5 FӌyfZR0h9<߲8L#'G;+Kk$Kl=jiU_gKCM%BG}S{W/.OP5.#ÁJ('t:c76E@o7ܞ9neee#ڌD;+B<s:uru'S#`ɧ cm@s-̣qtKC>ɩCOebNc< hĜ|]aJ{Cj-l#tBތݢIcf`n1w9 2| :| $Ыu-Z 2GSNRijpJH\G̷U!{zӣݍ%Nj Z.tS/ Ov.|uXQvvF(2g_~;pn>Qq)Y02:?:z `󑆿8!6& sğ??'t t&C<4Ūps%"Bd-'!lC|گXD{g@L7U*K r2ۻzNjJ9b 52zno___[[]$c. oLzg7m ŕͭ 6rZ7%@.y!96*:/wt;^ xUY[gg:tzuiwWQ}EAEEvPEDW5ƤY6mt:/y?9Ww?IHZua0$]5e%_?}}W%VͣVu|tĨS˥"A{S]u{%%UZ:::A\h*|hO(575644BA7!nD*k['mSvkɵtzB& +:ytl||b6hG7 dCkWG[ . *<61= ӹ˓\"u-,StJ1jZ|)sv/-:gb^oY􅣱Z"]CZr-p/8 K@8OevgW7O>}F9'7O;[L2Y`x%F"+88a*-^>zf2 $ÓӓZ4[u3Υ@$ʤqA"IJR\c;c^yɗӧ|G_|YZQSj<2b24J` W<_ZZ@ ~|`hXTJ0M477=Wt&Ĥ ] VN%L F=,Ea/A><,_]vkLMN COnſOc&-B7MFVV3pKS~8tKN3M͹x2I'@ $Hw/@|-O/߾߾)|=.Br$qbr8q ^׸89ȧ"~7,lo'Wn[clGx Kv~֎n@"?QU?ZKo?o>u9/R zVuՕePVYS!tw1P X_;]="q_?fTj LD&s :8i+$BR\Reҁ^g'FgF /02̬(pxrvvOG%:9Q#F :asG :<>=]%3ٍZ]]F`~ pvag\߾{'ώF Xd$S$i8_ DwGGŽj圛_$L2 bfy2ކ"L|ַzh*i|:)a~_?|_P:[kk*+<(41zE=]|-K} =AWg'`.dc'ݖ1Pk Z\7en2..'&y觑+rP_)xB]TacgA9>^/Ǻ5=0"QwZid fՙw>g 11j6tČ+Ylll:IA/ɇ7Swo^yͫG;+j|-Y_@R۵YC+kvN}v JY!Df6$^G!"344s iz@«(/>w?S$!iϹ/XraJG#B xh1R> 1F&1> sL"Vs^H$7=ںƶA\`#N `4+ d4nŨUɇP=?9hn|1 ǣ|Yd4@>*HP䉯r({]/^:51:NϺww 3z+ -DNRyF?_9myn>윓,|D[]EBt'E(2Y&'mvR$+Sp0/b~df+ƾetlԬj(_Z՝/SR^#c((YFuPQ)nX̫zeUMl@G.߄p nkm'҃$. Z- 0!0 N1 "~{GGG{;@Ue  S4mb~L,XǦ]1@_Oc#h Dsp0NOYF,cS';\ >? ]^]ᯭ7߾Ͽa@ =C9Ks33:,s y4P80Nw(,!+diۇg7/9ScjTQ~sm5([Y++Z:Cjd_Fhj*m z<Ɔ6 L"`0Rj,2-7&La4)j.B+y}2E z4u&\ ?8=;=)I&FIÁNAnv4p`ly|=<>9.ԄEQËS<'Xezݻ?onyL!K$xt`A=ڧ&),@m0xvh;H `fXx&Bzpxv5VJ4爂 PSY^ wvJLmzW/6@ WWUUU[)u[:X|'v$a:s֐&c#zP_+6@GIaAZW;chQYװ\֏:óK n iK1>2rzG`<(`v"=:=?;)E!xl"vpz0G œ߿Ӈwsp9|9H* qGnOsZw:Aw|QoL8<{fP5ZRkt  R"=.hCp)Xt6R~5eNnalc>3H-sWb O}5]~U?`.Sa#̇!#嚍Q&&V ż7ށa>:I rJ5PvP21&zSZZFݫW=Kփ6@a4IvKsml2|˫1Ud#fB )t&W88O sHlPx>9&z0k88璋60LB=\!tf ԘQDZEJl-N#CR7/)>Ds Ӛ{e =5?607id=|Мэ)*JݻWZzkҲZ$j!mYkk[kfB>iMZШ[ٲm}` MϛAs5ij;<ә~(eqȭZhCݵfk%wzu򬸛$nfTCNwrUE7g=Xrz4D&fKfۉ*X&3~@3'/{~poaέXD/* /^jҒFM{A*y8X9fTJ[զ uz}q ۙԋT[UVZRrAUCG1 j#:`/h^#5dmd絕_ݽ{ݯJW"b Z: 7 LB dJkC 1 8RE?v-{n 7X6W40` h͓ 9Dz"m a9jN"Jvtj +X&8Úd Hc@t'_zi/8yBvT̐H6l63hl8Ed-/-gI`$Tm`@2cie{u ğl%vX򲲊F@n#p=o}؀BLzyU中7U?;wb TnҮ2YReDpXj55 no7plV5\@e+ЄE0rKq+98>Aw _0n!!نNҤW3ZH_1'Q*=y!|oFA|&P*„oa5L`Џ# ▮fj6r7q~rKw>2tC;&4pb4w^':>ۼJA !TǘU0#hB~DYGg3~fXѰZ *Y&S!`NKSw(m(%{Q+ѫPϡ)r[R~Zq~у+mk۬on$4C*ytgRL3Y.[/NO/<- 9m%J v#Ӯ`$FͳWwo_xM_ZH5(CELp܈ʐ%+f5i$m6O <ݘ|>MjDn:9wm]}CSC֥Vt:$BAScSX2:Gl6GVӣnV&U޼~˗._rƭeeKo(Y\Z^Y]765k*[7nUVT*P,Qrp%XO !o*ʲҲʚCޭ [ \U YsyGFG|!$RE؇2H"l$kZc;<>53\xi&H%rt pryT.nuU:sF2[_D2L$x _H[ݽ͍T*߿/N/_N:m}:]$TUVV[;! CH,?owo~K]A"][=KV6\-Ouro/|.\ZtjTWUVTӹ()F\t.x u*{c3++A1Cz\>mTX[yoPU(l)U,J&.XS( 6VAZ.ЍF@ﷻ&ñD2^ 9{Nt{G| .J D71b7v{'F Xlf8S8 & : G(GQ:q}c׃vn3J6w=?{ݻo޼y?zL\ 6jz*6 Gb9ӳ7ۻ_+j[rtyT*Rj0  E%W_x??/xV9shqvm8?~TۛWO$n0WAaKs#a`b)H%pd=w/~#?RM=_ ܽ[Aխ,ΡhωyqII 7|E ʪjn%xM ,iTm0م9mrS(jt4TߺU|.!nP]ζښZ^C5^;`NZE^A_ ,ڧ&&&&9CC2Dcޝ;{;f]1J8$kC\(m](7&8bss Kw*܀*-^O叟|ןsN磃vsFhh!kW N\)=|⧷޽ySsy%BޭTT.ѷH.F&W]/>c?/|͛K]Bge5ChM*Wjց95թɉ1jG<^L̫. ze-X_SӪPB0TzpzBLkti:0ŅY?8}b||bҏce&J@98! bó2Y/W۬HԞ'wrhk˸ܴfn*\E.PnH" P|`7xrwg#y]VAQȥћ%6Y7Jm! o~WYO9ku;:FG _}kO? ,)F#@UQ~+W^ tx5癎eFL m4w)|C(nuwiu:\%eU8TnF6Ч]=&tڭ>hdxJh=` {~: čǠ@d1kd`8}|n3;(.֙9M` b;D}{^~3E@#Aj Ǔ$ph_ YGd>d4tB&ThL~;Hn?zO_>{tPM ew@W5DTHp9צ5Tܸzo_~ͥEJfpJ[E/]xE{xq]} _zңZp'`=vXz2_WMlj^ woJ;{:]OTPkli)6lԟ#o@kjz4T===l yIbJn^Wyb f'lfhqB&6xB'@gwÜtΐYATH쀘GrnƏˮ%O}N~} >9ی.La4﷘qĕ.>noo٫']/ńLY imנ,vrmh.qҷ\WT__\ :d^!qK@~ҥ+Wstn|CNΎ5c0 ${pYp#{\(bjkゐpN!5ݝbQ y b6?|AQSasA&#>=Enb4(Jxr2̡~'u9s8yjꀎJ5+sP8J#J|0=|t _~\OpOE 3dN>cr-Z68Ɩb[{FL/_|1/!7@7!=:&qFL*ICMV.|ͷ/gi9R ~M=T ~țksiatc*['lJj`씴45 D]jL : %ZQKM<> (2@s5\ F\rؤl=Aۉ9\ ܡ0=e5ZbM\`㜝-JMnJGŘZ]!mƣ( &5G| I)0 Dһ'_~}叧Ϟ<8ٌ(LAdV:3IdBz2ahAv\)]-E`m֫kk_S.Cq2G]vu8d ै.K")] PC=ztn]cl[.yut%ʁUpnN5YM"$g u SYNZU* &qA0}#sh<5)tsy,3c̓l2MZΤXa:<¢:I9\kc|_zZb 1?<{:K.bߨhϙ#jx?@~9ft}V*ZE/,4ʡs{"h!!usM̶0E<:RmZѣ-ř4#tvq 5 u 9>RV؜~гXM6#hJpHMqR)(qfٜHnk?%n¼Dg>nPGgǽNKc̐y0l C{*MfhvO}ݘ]\nN|=89߁̈́ f!hI9׳:fnѳ^!D R:neBƈתhBcQɗ;+4eotVelJbx=*5` XH[W.B ^LnG"q6||6tǵJI󥲻vD12%wiWlGT~5]M7UVt-~J4mcf gݷ3 ~*ft*YӾ5 ,gg+l o V\l?/nbXq-;<>wrrL0/"qا&ir[n"L۹st,I1f,*ډb`nh93 mSCv&7r3ޅ* աӲ\ELoU,.%wJĢVUl<لb  E `%2)F/c,-,,.Ybcc@ns#Z@I KѡAj51Oh Ve{$lҘ> (|zէWq-( @JFKzP`&; BmSPul1Vct:v T.lj#MUP {)ri'OJ)՜ Vf@tlV-`n##sޞ\_Cn4GV2/sgtzd)η(}x{>BYyU}Sey2BUXWlIOݘ4s+)_AMt{#N;Z:~Tv42{2J% .)03W@%Yt}6lwvꐲ` 1sW 7*c.A`2it:(F\~p$JL#{.1_cn2%ļ9 'AMy=NGvZda֑ݜԽ̊-kP%hcϐ3 : nsGfV>z#ӗ/_<SxMYvZ׶؉zG QD @tDQj !ԛk;n͵%kuF?}ԬLkS\PvTݴ0Y-JL |`/kMNr4H$0w!|NȁVs4K9Zi5jLRћP4CB&[j0vHQ#'񙳢9ޏ du}p$Y`8-Tjãqݬ@/k݋/Nx^r.}hr#W//.o^˷o߾~OgO?zIݙFg}-<*4 u+Xs3@)'xt0em;F'!EpsB*|4?4G*"En LFtylaۂIp%o02ӳnU?(ɲOO!ŝs ܓMP}|r$|:yЃͭF`S|ptR V "8~ mZfVġ%H$0 SeDPﶛB"7` f :ܠ'1hB NCcX``njA3RgbfV!GvϮ'zKe=9=cr0́QZe~܋2&I\YIb۹ &sX {1t*b?$7␐%/n/0GGso߿24P!Y vG&gjɊk3x\ @\_l=ҼT$E&&yT#t/aEB̟@?cC52 a-ZfY4R̫U{i^,8boG s@1,N+ ;=1j;rRă3qHR'9p'K6bw~y=;GVun=48Pǻ6s^vOAӣF,q버{$I_+uJ8(Q<>ET@ĨҗnuN?w`MMNNpDaM&ӢAG._0\fmqk@Ux=Ma[Fќ$ތXֲP _]؝NpAȄ@҃/Ta>ldHy@c<Դ^<^ Zi6Hf,FlfraDR0аqϭN/WU0 ~$C='[!RUE0yj^x>0o8jTQ7a1ȑ#Qh!0ܿ85]SJAh\!͑dw4"79@͂T栨`jvWY[ݤVd@gDf YH_)F10V*ذbo@ OS(O`JT5$477/^G0$ πRIsd*L ̣,+kA:7Ó.N7Jaok90'8) =@!%NANQ(0?l5ٵɺh[fuYt,Bf7xDyNwN%W˗>~%R=3|>u'dpHm[Uc=$N8-0󹙩1kDqpiWgtdK 4ojjv#|Q.u<(}f%!t;<D 2'iB҂f`n* 9RD8oVOν͈ryvs`0'V7&6v:Sq{3EmOw9]sweZ|2:h\z1}kit:jZ I f;fY,AqE_߾hϭ@XRr3$d[B\"\"SVb9+g'ψKt}Xk}U j,iL`@wP4`ylQg^߼O` @d?, ͘CGGC#=7{95s)pkb`ES0"%)2e.px.#s|Jrc~,ѱ}-fP*I^U0סh^ Ɣpώ;Ɉ0ǘa-N0/ vZM&020:JV1fd ]7dlg@W3<^]ݾz?' t2^ڑ}N"E(a:K#0@{{W՜`|o<||h }Pe36NN"bFKҙ]z:^OV8_ Ewl QsN3ܖRQN{V w^T8d&L={7أ%FdE{pY4P !L!r5`^DzvzܮVjas*<#<1&4'4#nDҰhr0+XO僒 8Z{Aۗ"mc%& z&-zNmX 3_ݼxﴕGPCyg-[XG,خq :dz~4x=ГtS  i) '7[k0 sTb+90>W cs'FCc\% āiK pY:ҀH|._Ab՘BF[˳!Ukܴ汍4*d)^d t&$2F! \|5W)whPXfAZ8ܓѰ{m*VJ7/^Rn%ͥ#Mu`N[K #on d*DgO<fo wQV BOV)N_$E7VWhJ1Hl\PIƶIl?=e++qM-(R[ 7+ օl&ʲM ^qn.ώ꥝x0hyWp%6=&Rߪsi9fs;;8"wYp,?haJEpk$"9>HDTi@ךWo޾~yK@맨J q;RX(хB!SH;puB-~^6;9O<[ŻR͞H@Mhr#l&Ч1b/a +VJH_m@ B_ V̶ExFIHzCs[D鹊gɖ*l) KNtw߭3zv{}iv1Y#=lv c8I,Dr]T=XMc1T͝B=~8=>lP^Fk)J4?:!JSGGxM_b[y==*2E@1cVTL"`"*9K̹^yy==oRs~2qk@VOWGT,ZT*EW?00Ąbt]P[VT𺠨E*Hm\wg{N,*'&fխ͍݃eNYPfctF~uEYYyE5A7T955==5_\/ ࿵͍5hL" ݛ {}Cc ڕf~nfvn~QY[S6 6,M.`"U.;M:Rۢ{RN'MT2L<8;uZW:nyu}kpd`Ol: x]vx}^r{H~wtrl~Aoii%qY蝀' }CfAuۂׅ|U҂"eD\5zF@6Fo~#uK٩сYKCme⒲*~cK[go?Aǩ8-բvFje\hȕBGD$lllly|`hdk3eN kc 'O^Ԯ鸨y[ZU'lyc@P lK V5 >l2/eRsVKgY&wJˊ _.$[|361 n+@YW YVVi+-p=/uȈB9Ka:_ew㷵{hFsOOwrl4@onoPɈe>^]3Э;N#n3)0^=>=b~ljag^Njw86 Dpba \#`GBA,pym+E6>|Ow8I9)8p5ҡ!@E-9!Autv- \FQ < y⢢wyhziiI,bi4Zr7zjJ1.J ~jꛥ]=r9 ty:NKj3}nnF9F݁{qfN(&gB9@Acpdq޿ &4^^_dS*h[6݁Xoy2Of.?ݝ`:_[;n66.i=9f #b2{1OP@ @rh@8~x~ts˞_=}xǻohhhh7Z3G5KIu| !FI£yW[SUQVRRRݗv*[mu,xzvb.p# ST̼9`nR$vrlHNBgE#/ʠ(FJl6c-v?~| g5 ? DL͇;kiJo\P?y4l7<>sz?Xktc+Aq7v< mްٺȾP`\RCu|*7_&8@eeUWU4[$m}0^2r9^0OOMI)׳8PVZ y;l0nG4wYއGzpȸIa m87UJ0rf8e+|N}A`6?}~B m5p뀷_=<61{#I*D ;@hSN!6jOd1+tKBsT,oh(H_B 8Bq\y&FF#;eMNW&nY-p|?1gg R)qA.+k4"CD/W6uT*Q[GWL1F1O͢5tSAGԀ5#D- IJAisn 3Fc흽ã#yYǺF9ݎٟG$;y6.JjC~M.ɦ(Ψuvyc3"~ʩ{*w}OÒ\" i=׶'2'`#8_p8^%2čF7pO.(q@z<>ƿ}[7(\IXJb8%dMYaX%  optd'D)@ob""2?CAo(e񛆮D\#Yhn^ !F5(ǘ67au z&zcM.O?2n.:v'_~5q b5&paω,;A>J>F! dTy>b {f ̡9eL:ɞÄ]H28毈9rD"5SΌZ3!PF66W@9: 5lT#d&xZctƊQ6dSy5<we Ҥc㓓~Cy']$SR\\RQ(B6:vGrw/OX_>z,\_=c~̘+[9̕JN:d!l9ç/?>A",w`TH;>\>!-u%/u+q/IYe81 >[QzhΤ9-(xeWٖ{9 $D9sFdA9'$@Dnt73f[bz͚{as>~9$<:.)5=3[OKK 2sjR\tDhЈ~f>&HM  Med $Qn 22 ˫kjk*++*J E9^RB\ll,OJIýsrŅ%Mm=}mM UŅ|av HMN׈Me667Ta벲ʪںљe>BHWf&'''f2뷷oϏ7WcYl__|z_<;1;<*=Pjtzd'ts?z\6V831:2<<2>5u{q-Zq/WjZP}xxh*ںtŭLN6r:VѠ7-v㴚tǠ/1 <0beg $SRyi4^JR|LdXt8Rӳy,~r|tdDDdTttTDxXxDt\rZ0P"Tyj 5Օvy驉QD$[Q1q+.&*,8Ǡd9x688$4<C9sDқ1ϓV^sKKsSC]Me.5),"PAHØ$HF!4A%<69#<87+-1:˧>CLHpxdt[TەzwzzzrzvqsxFy|Zvקo?ݹۨb&ldp`hlzamkO`R<<rU ?<<ߑ]VÑ}v _;49믷XwsB.W-t*P,H27=9=sdnH'*I02@s'sJkCSӓcC-uumLTG'VZ ̱7(m&ۋ@ǏϷgNb Im!g{WFl!4AZZ9GϨPfm7i{Ȍ #EG@>ggB-'s!APl̎ LB(;"X(tJIшf(ڐyP;'JȂKPEА/D1WPGgÖ883;J%h|F!d~FP$)* c.~drHvƑm*ۺG s4I*]m-Mͭ]8&1.UsiB7O sS'.L3ƐM0p(먥Gq5;!~!2PFȩ],:6:t[vdrt\uumg9emGTY6T=p0k'8z6)pYxLsl'F5` &YC Pn2z4?;54lmqݘdrb.1õ3=" "3+/!h|3=1 [101?4X ~p,&БVQx @-ή%>Ѕt%xϑ2Gpa vsU;2L>dNV=+l\L&ҘAg(*dy?|aU oG*7!^FN@|5 SE*&!GCC*G~dFs83` SeE)#{G yNAiU}ccC]Z9 \QK 79- Dyж06BFJ*rB#Re6_(.iF[X\Z^^^Z\Q.< :3W,Xo!F n9}O//֏ϯoeo̍uut̬(44v16Awi0|BGh?_"|owfSGš .; j93{{IWPYJ8MF:..>1l*a9T'HLn=2 \CCiH#qbӈURZ6ym}=.jj0{r`?ؼq5tMHT |M J5ǯ_?ߞizc2lzHcl2d8J%pQ!BoF""7^V> *Wh*L,dgg Db,ΖJ<}QqTZUH ^:-/#%KsrzCܐ+f$%%e eŦbV%3<2>191jlZ./+  %eƊΞ`_W{S}MuePCjUMFFGGG&?ν}zveŲ0?77A 84t9zϿ}~yȳi2tuNZñ/^x~{}yq~vz><{׻ϖxܮ퍕iu}ckbo>[c۩QHE,>?+[(J[P§jm~d*/)ЩdbAv?33%ȕF\9"~zJRMA9aT+*nh35T*v"!ZL0/oj0z:k+e%%% ǔ*Ƽw<8on:=~sg˶ƨeimc3cӊDWϿ{׏|O|c-powдuwyի/n]cga`߽u{= E}x=Xp{@#Y,QKAbvr{}CvmK`>˜?Xݶݼyӧ?h(UXUHE٠͊$2\ȑI%2(_+4AJyjL"2322\͇KʍF@d&ݿwC@+*5U*%EZ:`ٙ2BMu}s{Wl z@⨪4%}}ݏ:;z35w~Q``ױd]\X_X\Zn/?:  !8◷/?a޽yqyv[ ?^ D.n^s"p8l|p$E##|)'5S(4r ~2x1.3wdrHGCED$Df@ zs5:`p"lhp`@1+[tuut^ DM tmoV,w?̱d :xv~q?_ߟ~ëx$e]qn/aAѓCt/b>1D/ aC0',"xdrTz 8v:>IƎ;pr>|xy}=ʄԱ嘋r\]Ɛ򳲲YKrHEEd98"b -D<d0}\\"䥁4^8G[do1MNO ՕJYts%ŌB+,m&_o15*GiI\]vt.|f~9&݉eqѺv8x'U%I>|gѐw:3f0?]uN/?XH{燃N+HfD" (!8: <rgp?'tHŹɱᡡa@z4O!gdfd 2w E*Eo#R7Vr[fƇ#SkN8vëc8\҃PCt89Ι]Nj{Ɏ\UȐy<{nYZt.on/N{ڊ-0'HhtԲA=; TLʨl4"C+P0 <" QNĕh \edqF~zx[}EF U¶\e`>0ȐUr ~:nhp`.W%-މ`2<{ptL P ̐1.mcsk !;];;zd4>^ܡd:͕yӇWn4.vRyr w=Z`~⾅-rf$90?pg_ߒ@>800@G&?_ļ鉢'")Cxor jE g za:(O(l\")<8/QjjL$B~>;Hۋnm.ӫtrBRաH|~6倱T*_H sEnX90xκK "GNБK9 M:|v@aׁ_'|u㉱' T4{F6Naڰm,vy0;ꍬԱFj{>vx:ټc{˶~ 5hrS3O1/"pc_70P!X#A_МO HreNH~Hu%U MZz7$A;]uXf2bxXr"dU=+,˪ tyچݱKbJt2cޛ)k7!{MJT`G//Oɩe>.&ij!@'Hf03vus{s\AjQ w9Č\8 8 tGpl ۖ&1vu4Wh<H2SSv{`iiiT"Ǹ\DLĽĂ,Q"E>d@O uEv/,1V547VsټTVU*h(,)c*:5V2= (]WXbBfp~NbT* |kscöeqb68$N߿}}svc[^x23=55_r{T/|,~vrD$s C^)C μ L0wsBO0'm _.D~VJjr! z%, DŒ|]%~o"lJ_V]X_UV&Ln0K[{{[KSC]uEy څ8N/)d SRҲdCE]sg펮 Y _JW7 M>%\/>e2 v omuo&P.*H(aÓo~m=K3:J֖j*9bA& LBcʿ?9x$'%%tE05L؜[e#ùDYYGNP0RnnG`,n48|N@Is8;#"9]ilAӁhD\蔀yeݱ $E}㻟,ZYB[[-Z MA ooo2f{u1!<:}+ׯ]{^O8@NT9g0` #8+( Q#gw)`+98%ڱFF0zЗw.eb.x_d{ɘ?˧g|.yXRNU zt6y%e;34yYbpU=@w{SmeAVJ d% R2Ĺ&D?Cn,//7*kjkM0EFIi*5<?/^_v`VVis(mNQ(QIN}a1BB'gqm#TQ˃T5፠!Zvz83M/AO+|Y^OoPM(7%Ҝ{@ ݻw?Mn<ΟjF%cD$,^*x2c*s]ä`@.25tOL>yQ3]RQJ2e,t(WЭ~ ]h+["d4UTQ4S6mһj:eFwbas/x|f&?B9~o˜y,lY}@ܖh 7Ho>wm.̌ܒ͎SA㟷YG/ɾ/b0cqNcZ5v65//{,sg/ ;; 9oֹ+Qg}|/!o__ab!J[*isx;=="[,hǂ[M QsIt&˥ ,Ad;Q< M)x5_ mFdpaNΞƒV7677Vʍ5hsmM5兰 2wCAO0=]Ӈ.A 9zekI=?"|= K3#f0up23p`EB4F+i[z{,8^` psv|%L\ns!5fc >99IH/ξ;x]W[YLUWl#66,rN"`0`2Q $$J(r6.۵{fzz}ճǓ(6ϏEE|eHXDNj "9. ƿ OHR1q¤DALdhK)+HLNKIO+& 04,QX񪡩u]X\Y}wOwg[S 3YǏG/zs@6noxWWV{߾m{3kzF/Xlvv\%b]k[{NɠScCC#r`Y/ڬkyummuv=+k[ǧg'{;[88>[_Wwur,Ko˿u#5t,-Z3IմZ7 tL8FvfR16222:6662<(HƧff5Zݼhç43pgς^Gbb=2""<'Rg ;~<9M$JM '!ŋP0&222Ei)ɉ&:"4DEy\66:<$vu6WK r2q@ &$$>Kʑ/L)oln|][)~70TW'J S2 kZ)f խã sxzhԩ kfs/xN[|quuq|N;;=9˕Y=ga}gt{W};{''`WAVVVլlEsymgJÐ[JL1>9EP7-87;5.r<ё1.PKa)|4ɓ'ς9i?4ߡs?"|0OMKKP&a/Pk TMHDlRfQuc{*r}G{[[*/.JOC$FEFgVWUT־iJkJrRh>]TQW2Piu//׿ۿ|:L5TYtlVݹpkeli5(i`^t8K;n$t17wv;ۛlP\Zbn ԌlYkk;D2'632\99=t eL$tlJb ЇGFe VՎq?xǏ |'ظXR}3@|iRJ$'%IF+<&>2 \X0*'($*>5{X{KScΛׯj+ʈyFݑ P+|^TTdJ(5Mskksë`W̤8t)0O.nhRLi V&!#uyV}[{'>tsY)$,s2r`27,Ϯ>^lxlyN7Gih89]h[$r9wnl07l2sB,/ :د,snc6keҁ(iЍt ]/!wàxܾs=FQSn4hw9=;g]$m0:[wY srK(q1pyo Q!Jl¦7vvw5]̌:Zђ&"La_.Bn2OG]]ݽrN. vzR)0'W('T`NUxO?_ݧz4<.^@; ~i sND{'|G!\Tz>܂yPp?1WEq~^^AQIX\!. 9/uQonljiuWf& b4ɸwCD62[g!h߿[qé ý^9=|jBPȘ<Ʃ ~yuyuZ LDi5]$VԨYv8P\(Xz׷Kc: ip/ LYpޱd BhFvtUFuF1̝::;@1&se}B;c;wŹwa Qh1qeHeCq|"E9:E,$$!;!GG6 YċTH.,:>%USk[[KCMY~(MWXRV^ΘsZ9, į #wwutH$}os&W-SzӋ>\mV\x&#ĵ V]`N(CaEruiytvq.W}[;hrt?E2! Ib] /;XD/ע- X}cNDΞ1jȄ~\6:B1yɃqtrzzÏ~9]'ЉТxL)d [$ctknd#DZq,3+-8)ǩɜj)}X;1 A-](y݈4W$$$83)o=d."] `OwwO__U% d_98.o_} ?;oe0?G˱d0pmAF5,V+a@y4؜[ǧ';^tS3a#X #ޒǻv7$jFĩ)!ٽutj.k#=Kp" Č҉OQAϠ 0LkttT1Zᎏ3{uǁdB T~&bC6LZǠq{ZFVvNvFZb\4e4r$9y{4辘ɢҊJJDťyNFZr"⹶B@)ZVRHz{{Wr# .|> W\{g׿}Y8tfg:J?1fY ZnhphD7 9$Y\vÆm;5!=kmi$ +)vtLzԸ s/r0I8`svN///Ύv7~oFXj#iNIgfegbF~9BHsrr29\f Q.*\J+*ʋ)zE蝚WTZ)4qF)n4zq~cUEQvZ":>RQJξst˷o_>}8XZ,c5[flH2 aYxfVbx?ּƌ r#A9>\;|{Gna. m)߽̒! 4Pk'ʉ9\c[-(B'*!a=`` JhF;`:Iք+J4 3SLlݣ.|#?x)sZME*-)%DRA=(AM,%D@duܑญ 2Q%HmE9IQaP?OSP\ZVRhDzсa"YG}]- ¬!>12^@/_>c^sZЕ $Ƨ¼7 37D:9"ЄjZMSn9-yi˫?}@9eG#o5jvzB.S4E7 B7.CJ!0c+τr]DM{ߙ߽smPq'O\x5Qfna & N|a J" ?Bb[TQ&ԟ|,q2P3RƓSd$`(GwF&&Qe_IP_jD@Jx[nWsP9k\B>#?2vb#~873>"nd d@s`d{4ZwNsT՗ߐOlVj1-f f|ѱ4e6عJգשH%}A!}y*gz[?~Q<~y02Nگ [ pB" 9EE820Jo%%%Ey9Y$nc#}z&~F*c΋OJD⡠Sű+*kUN0c(MGF[KkKo'lNCZƑH$aԜճ{|vvh{woO~?|YN+WTWgAa/9^Hdl"ɳhEii9j qYiqa~N(VB҄TpOH.4[ssq%= yeumCqDXWj0)w`|7ҙ+>]qڌffUQi/]A]VB}vRI_gn UnZ\z1k@ࠍsrr gן~̏Q[RZY[6}3}'5FaN"Ǵh*#:Ƶ~>ǜElKN?Mj.Yw6/TEI8 .y~xz˷߿vuypޜ6i*>Eo(Ҟ@A{kLKlþ8&Fff t22]ݽ}(~ )ccC!\'ט:/ s@['r!j(++U S RĕUUtyNf7u11Y<-ӗ2V%V47mhLYF\-JބCNU heN&ad ӬZL+:ZZ;F'0N)F$lN搔L~W}KO0h^}WLE9S25X7-]j1/C33 aٍ8}艂G Kz:wv9%V==IϴO=aڸt6GlxUwCſ˝L$f3QƮ("{QlH{],{&39̹䜹JyZ{/}z=^>_|S'(o_z10,.74eՕEyqz0ËDEEDqˈА1Uu -ZKnm*-%'E} KI*odrfnnvj|xa:]f{ofԴWWW6*uvaҪjzSˠ ]fwptrny}k{g{kcݵ;>Ѯ{cck>=pf&''fW\[;G'LJŅѱAըht]I"smVb;5ʖֶֶ}1tv]RժvekKsSsYu+99>zՋO{{?}_^>z_gm^$]ȏ p^bj4Qb^/3U奥%'ߡxQQѬ"myyY]k6[ӉyD砠P O/kVp Gq{&uhTJRtݬW7˪*l[h21 7Yl=#`x;;u1pgӵ>8O+s3SSS3s k# Xדc##9k7;j+s˘lv͂چm86&dk(BmMļN/_<{>1 }_}{=Fy=yջ|aZ4'7G*NED \輀ɜyQ hu 0!oQŰبTxxWZЪ1l[jVJSb"quXKWlCݙfBѬ荦nVAUfh2GjCé2 zo酕-{s]}zw{}~wz70?;X[^ZV6/q藀Lx^ ̎ށQ,"}s9!hU{;tFCgPr c+8泫ӳ3Nӽr}~{rus,/Q-/ގ{cui~%CN^  t+>6>95===59})'5(/e6stC!Mw=tt`ROq[8{Ff׶N_|z?~{~!(?F/X3ߗaApτdX"+ y1t"-Jęb8+K"&WT1P83I q:66E3GDpb3tf *5ٙ¤DA2<(A҂(Xjk8a+K NJӡ&MuN(` ,,k}s{xok}mm:6 ׻wਛkKsScu '+ 5mξQ0"ÃN*9*d/RV!N=zN!jbvaas_\1z79t*oSpX4Z" }i, $R3a Jʫje'& qq $$Arq{%IKZ;S33} {-< VRX3Nb4¢ʪD |M^KIwIA@myv 731S4uJu7ww7gHHM~ueeog }˵4;12?084<2<0w4B 0d;j2avBuX\uRcNqEv9s0?=yڣ3^w?|G4u@g3D)BH5>!INHOKM Ϗ#'$%D@H%ոu5hyYz.NL&<9>]T\rVQ]>81;314nG<*k%$ v `dK񛜼ҲҒ\xj gBgФhl3bۏ. <&g78W;n^{su<u< !uىa2qlY&0{:ӹ @,] ]w@D'cIs2A6{&ӓ\~LA=NZQJ CNKH1,gAhcb t @54JxdJE r|>H@\\B4Z $8Fm0ᡘLJq*ө2vh(3+A9Ƌ: :nn6žlKD ˗/7Wg'h}{kӵJ̑q9ȢgOXѐ5Z cS31iN),\e89Ps!1WLΑm1>}2:)ݻ4/ { b9a2N%YY4uS*Cse7BwpHxTlb25xIvsYx#0D[Xa'pϧ,)M#Ss s䐤DYRr#a"D*5$4Tzg^aqI)7JTR`ݠVֈ[?Azdq>iGݵI;:: <;'7%.6ގxr#C#c>@~>8:5ˆBƎVupJ}m:))i^@Cܦu;&{l1$x _~KsG|Ǔ%C㸧$b.22G )sQȊDBviX/*% \"+#  fH3!AcI !7e1_By/Q$VDZ^^z*ՊrdldB뉔 Ee0UR,SlsٍzhJ] A8˖|AH<0IY0A(-gAk:;2:7okCor kk!~a3_^9CN+Jh4ϯ./c;B>f'GG1 Oίny3s6p"S:fip'gs#MݴSRt".7RAǽc܁A||ڑ ?x%dze+Y hS׹Y$^X@ħ]@ [`Rؘh^\B>klM7d%cn{yiq~XDFClZ[.o[46s-$TNjm {ɿ0GL(L 5Іk :sj䥥5 mZS!BHO72,sA u{ǟ&SQx1w1f$6_\;Glql~u>:mo&Fxju H8Zё1jڙƿ1P>a=E8rvoc}/oGS L)#Ω LDŽH^"}3!NMEg61؊%+h!IN~=KciBZ!zLhQ57j1ҥ@\JKC~Lt4 O=>vLxWRV%k`]>\ਘmCvƠF2˵^) o_" *'Qd݃8fqvrla5٤dnsȜwnzozeF|6uQcapPû7,],4A\DpG\`!!D>yEꀸj.A߈yŕ&%iZP>oljeV}63klh;Ԩ2ި@lKg=PxyӨ|S00E (6:,ׯ^Q`FЂژ' 1sĐKaE 62nHq28<) 63n+r"ܭO;,kLpuJrw96\}ʖ6Uѧ0MJLlMJxUYyCZw43m'Mb&M]ADE6AeUQ%јhlMtog:s.3{l;ǎ|駟=~ԩǏ9rę+nedeq9lV~V+SΝO_+,.)af޽ui⢂._$+ vav[n/(*fq+2`nحM&NR:N5Vhu:VVɥ*@()5҄CVk蔔88lVa^NNn~1_Y+/ɵfhok66TrX\#S-mW/M'bp8'Ʀfo}7On>?x__yGkW,/-..2y@_s0b2V ᐩl0Z4 >UU-Qꛜ/m<LJF&g-,n߿{bw1hs廏??|Gg''&&&Xbhhxlzpo"`СTrWdzD4h6*NgljmAtdig}Dzn8Xvf[ /GǏ?y&;9,v9$S(IL H9 K*1\X.*/-̄aet8\^@(*2F82&ц3j`2`*6ĺjU*܈BzF' ͖`:{#x벙r$+@t_( 3c[;﵇C731:<O]il||d0k7"hOL[Xv6|F5Yr/$wvңa vzC}Dbx aL&[k FϟC;~O>#ǎ'1?y =3Skvd/x"fjF6)993-`sQD"VrXٙnE%lN9"|A"H$hi66f6{7[ư\) s [A1'*p!nU=w IB$qjN a_ol,ǎ|gG28q0vfA_,Gb֪UIȳʥ/ee-_%NsyuuuU%<[ idd(/sUP,ّԃLtZAtވ![BoE0".Q7juzl=t!z<n3͇pm&MmuS)6zB󟛛|>_]|γO?y|Ï?sٱH/:8<:6624 d ^gՌpl/<Gn/.Sh9\R]Ґꄼ{]&RHg7[;[-t숊q`~8㇘> dq:-RE$?3PӳKjX r%JA5[jzvx-j \. *aZdsZCm—$J!SnEBo! J #(`w Z!)dϏG Zm#( Nj+k\\nQ%VY@3 Fid}o=~em)Fw#8էmmO#`Odpd|r|t(w^X`^u BQBKTeյ7a8J E(BJ֛݁Ph BY0JNՎJ886s@?} sԙ._OaUZ}N߾aBL-VN#">UH.JP--LC`+T 7 pгEjXBH˛mmx(zذOHE9Gݪ(/$NjۚQ`< eO/|N Il4Qo@6#ѼU(d,TVwwW{SGͧt9γݽޠiK3싏NMO(9JliF"shֶNMI.gsZa8 SKpR \gh@wݬרi|} ASGouzGgw 249OrNП73=35359.&tXU*]itzm6"!K|ksss/^&oo=ypeeM$#~* q-GIvI!9yEl싶QTX+Iy|!eck7 0I_jҫYzB•˗\ɓN9wbH>Jڝ_^J?:s_J.,%pE&ҋw*XZ.rJލΤWFVW.E&)Ff%T'Gÿ \6Uʭ"r /:^4TB|rgzr|BKdW*B*,(d1CPAZ w#WO-{7[7]'g@ٯgW"ku2! Ɨ14ܞ;1iiR ([=B$2u S(fV-BP>G'OURM*fZ'/pY dhz``ڛ/V0P˫|>~x{ f~YD"12:2DK60u fuiSDIFBsΧVm:A ^ K P=*piػ?Av{J>S*i{AN[' 30o?}E<2,Lb5>Cx,`4[w7UoBڄZLIEX#d#r(u-no0r6b>H#fx#$a=K L-DxLs:Cuzr evF)dߺ|4d͙~+=Cü&sc#ĒAGs3Rxș Ƌ! Yiwܹ!G!E#;~bmE8cx/LT#0AL37ơ!DPXcLeO~r _!6GFR%(&{Gp`|;{/^}˝2Uw|?}gOWWp4APma*DHTGttPAXBL֠ʪ(byCs֠B.ᔕqDzjN+.M )@qEY驷d*4ܽzԱG_eR;m(nKF%C55Rn[ u>Mi5)+˒Wi_bj>;c j*̫So\A $5rޥ6 ޵PP̻&V #;*$#b4Ѣ)N85YXY{7?xGVxo2{}H||vaiiianvjbe5j`ye$aG'EjiC #3e${<VGJFu(UL硾Hsq痗%yόPݘ]^{dXmx=wwgſN†p6Y`HVFeF3*ެ\zR,a"d{0q(9ɁI6o6%4sdRϝ11rҷΟ?ͷGs%8؝.E7ⳁOq拳K78| Rkuzh؝noMBX">neLШ AR𕫣7'~v7GO\z%[}lo6JTd z$h#2 D4赛iW1LUdu8]N 0 4EjH4X\x*]Ԫ|g %&bJhuzLj9_m?xtpv\*U&!~uXIl.n&>ԩON99Xk15 NOVX`8"׍^ըqT1vuxxt$w/$WkJX042tDpSp@\gO Gώ|urt4kbX5;;~ɳ^ZkU t&Wml?KZB"Z-E !1n8scMR!* u10v࣎2C!Dd; hj = !AIB% "JG #L-sB&Q+Wfp(GEChu@a]ؐ@nՌohbL JrWo^?pp60/|}{v}݀ӹbٹлFai&쵛(Ӳiʼn2d\T*J) @1Φ$)Efsz٨gBn U8bɹlz~oY) b.Fܼ6:H urar(Jᓏup:F;d=JM8<0|L?ň6h4 FcwbsKJjK;tZx ēshֺ{j׋LP >0xgdalautotest-3.0.4/alg/data/utmsmall_min.vrt0000644003401500001440000000417713614004466020557 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Minimum Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline_wt_float32.vrt0000644003401500001440000000413213614004466024327 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 CubicSpline Float32 ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_average.vrt0000644003401500001440000000417713614004466021406 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Average Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_mode.tiff0000644003401500001440000000545213614004466021032 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|k{ksccssk{{ssck{{c{ss{sŌ΄{ss{ksskkcsZsZc{kk{{{s{νֽΔsssk{sccsskks{s{kcŔcs{{sccksccs{Ž֥{s{s{sJskssk{{{Rֵ{c{skk{{sk{{{c{{s{k{֔c{ckscZkss{ssέޥŔŌkkcss{sc{{{s{έ֜޵ޜccccksZ{ksεΌŜޥťεkkkkRcŵΥ挌ޔ{εޜΔ{{skkcc朥ťŜޔބZcsťΥΜ歜c攽{k{札{ΥΌs{Δޥ{Ž{޽νsνŌ֜޵ޭRŜބﵵ{{kc{֥kk{k{Ōքޭs{sk{sZքε֜k{{k挽޽ޭ{{sss{kk{s޽kskk{ks{{Ŝc{ޥŌk{{sk{s{k{k{ތޥŌΔޭcscsk{{ckk{s{s֜֔νJJRsRssֵckΜֽŔBkZcZkcks{{ss浵sZcZ:sRcZ{kkk{Žތ{έks1ZRBRcssc籠ZֽŜkŽ{J{BJRZJBks{ZBJ{Zsńsֵޭ楥c֜Žc:kR{{JBssZ{{{{֔έťŵZc{Rks)ckskR{Js{{sέ{cŵέ1kcckk:R{s{ZkZccsss֥΄c֜ޥﭵ:ZBR{1BZRsBk1cBccc{֜k浥ŌcBkJsRsk1JRJk:ckZRR֭ŵZֽť{Z:1BJR1RB:kB1R{J{ťŭޔs))){11c:J!Z!BJ:1Jkk֭k֔))JsRcRRsZkRZkJZ{Δ{s{֜޽ޔB:ZBkJcZZRcZJsZJBZ֭ﭵkcc:ssRs)k{s{ZcZk޽{cZskZZΔ)kcBR{sBc{{cskksRRcZZcc{k{kZZsJZRc!B)R:JkR{kRRkJ:ZkJskkksZc{ZRcBB{:kksckZJs{cBBZ:Zc޵sŜ{ssZJ:BJ)B:!!Z!!c)Z1ZJ1BBcccRsRcΜRkcsR{sJB1BR:{J1)BZ!ZB::BZck1)sB:JZc޽{s{RZJRRs{cRBB1s!JcJ:Z:RRBZ{Z{sJcJJJkRBBBR!c):ZR)sksZ1BJ!ތJksJcZsJJk{R{{ZcBs)kcRZ1))JRkB{JcRRZcs:1J1ZcJRkcscRZgdalautotest-3.0.4/alg/data/utmsmall_ds_lanczos.vrt0000644003401500001440000000342113614004466022122 0ustar rouaultusers 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"]] 440720,50,0,3751320,0,-50 Gray 512 128 6.71089e+07 Lanczos Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,50,0,3751320,0,-50 gdalautotest-3.0.4/alg/data/test3658.tif0000644003401500001440000001760713614004466017334 0ustar rouaultusersII*22;2LS  @. u255?? ;AąUA!S!#     > )#@TXAr@UTM Zone 32, Northern Hemisphere|GCS Name = unnamed ellipse|Datum = unknown|Ellipsoid = unnamed|Primem = Greenwich||ğɬƱxw}vtzt~t}{|w~w|}{}~{~|~||~y~y~}|~|}w{v|z}}~yyvvwy}|x}tzw}z|~zx~z~|{zwztr|qlvtmsz{ws}~}y~zyx{~~}|wz~y}wumpvtzsknuuytt{z§ßȟŠáǞŚ{~~{|{zgdalautotest-3.0.4/alg/data/utmsmall_mode_int32.vrt0000644003401500001440000000417613614004466021736 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Mode Int32 ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_cubic.tiff0000644003401500001440000075136613614004466021207 0ustar rouaultusersII* B S   J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f!@&`f&f:&Zfy&f4&Tfs&f.&Nfm&$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»lllmpruxz|}~~|zwuux{~}yurnnrvz~}yuqllquy~~zvsonqsvx{{zywvuw}}vpnrv{~zvrnlmopqrromjhffimptwwtpmieb^[XTQRX^diopkfa\WW\afkprrrrrrqpnmljknqsvyzzzzzzxuqmiffimquy{{zzzyyxwvutssssstsrponljhec`]]_`bdfghijkmmmmmnnmkjhgefjnrvzzxurpmnty~{zzzz{{zyxvutromjhfglqv{~}|zywvussssttuuvwwxyz{}|yvtsuvwyz|}żzz~mmmnqtvy|}}}~~~}|zywvwz}~}zxuspqtwz}|wsokkpty}~{xusrtvxz|}|{zyxy}yrquy||wsomnopqsrpnljhhjmorttqnlifdb`^\Z[_cgkookhd`\\`dhkoqqppponmljighknqtwyyyyyywtqmjggjnrvy{zyxwvuutttssstttutsrponljhfcaacfhjlnnoppqqrrrssrpnljhimptx{|yvtqnpuz|ywxyyz{zyxvutrpnljhimptx|~}}||{zywutrrstvwyyxwwvuvxy{}|zwurrtuwyz|~nnnprux{}~}}|{zyyxxwwx{~~}{yxvutrsuxz}~zvrnjjosx}~|zxvvxy{|~~~}|{z{}~{usw{~}yupoopqrsrqonljjkmnoppnmkigfeedcccfhjlonlifdaadfilnoonnmmljigfefilosvxxxxxxvspnkhhkorvyzywutrqrrrsssttuuvvtsrponljigefhknpsttuuuuvvwwxxwurpmkkorvy}}{xurpqv{~zvuvwxyzzyxvutrqonljknpsvxzzzz{{zxvtsqqsuxz||zxvtrrtvxz||zwusqqstvxz|~Žpppqtwy|~|zxvvvvwwwy}|}}{~}zwuuuuutuwyz|~}yuqlhinsx}~}}|{zz{|}~~}}|||{{}}wvy}~zvrppqrrsrqponmllmmmmmlkjihhiijkkllmmnnnlkihffhiklnnmllkjihfecbcfjmquvvvvvvuspnkiilpsvyzxusqnnopqrsstuvvwwvtsrponmljijmpsvy{{zzzzz{||}~}zwtqnnqux{|ywtqrw{}xtrtvwyzzyxvutrqponmmoprsuvwxyz{zxvtropsvz}|yvronpruwyywusqoortvxz|~qqqrux{~~{xusrstvwx{}y{{y||wsrstuvwxyz{|}{wsokghmrw|~}}}~~~~|zwuru{zy|{wsqqrrrssrqqponmllkjiiiiiijlnprtusrqonmlllkkkklllmmlkjihfecb`_`dhlosuuuuuutrpnljjmpswzzwtqnkjlmoqrstuvwxxwvtsrqpoonmnruy|~~{xtqqtwz}~{xursx|{vqprtvxzzyxvutsrqqpoopppqqrtuwyzzxusqnosw{zupkjmoqtvvusqpnnqsuxz|~rrrtwy|~zvsonpsuwy||wxxvz~zupnprtwyzz{{{|zvrnjfflqw|~||}~|wsnjlu}|{~}ytrrssssssrrrrqnljhfefghijlpsvz}~zwtqmlmnnopponnmlkjigfedba_^\]afjnrttttttsqpnmklnqtwzyvrnkgfikmprtuvwxzzxwvtsrrrrqqsw{{xtsvy||ywtty}ztonpruwzzyxvutssrrrrqqponmnqsuxzzwurpmnsx}{tnhfiknqstrqonlmpruwz|zzssstwz}{upmlmosvz~}vrt{|tru{xqljlosx{}~~~}|yupjfcdhov}}{{|~{skebdlw}{}~yvsrqqqrrrstuutqnjfdccdegilqw}{upkjkmprttsqomkihgedcb`^\ZZ\_cimqstuttsrqomkjknrvy{zwqlfcbdgkortvxz{{{zxvussrrrstvz}xutvy}~zvuuyxqljkoswz{zyxvuttttttsromlkknrvy{{yupmkmrz~tkecdgkpsssqomllnqtwz}~wv}~}ºssstwz}}xtqpqsvy|{uqszyrpszxqljlpuz}}{yupjfdeipw~~||}~~xqjebdjt~|}~{ywtrponnoruwxwuqmjgeeefghkouz~ysmihjlpsuusqmjgfddccba`_^]]_aeimprsssssrpmkihilpuy{{wqkfbacgkptvxz{||{zxusrrrtuwy{~~zwvwz}|zyz}wpkijmquxzzzzyyxxxwwvusqnmlmoswz|}zvromnsz~umgefinruvusqpopqtwz|~ÿssstwz}}zxwxy{}ytqryvonryzrmlnrw|~{yupkgfgkqx~}}~~~~}}}|{xtpkgefkrz~}}~~~|zwsnkiikoty{|zvrokjhgffgilpuy{{xtojgghlpsuusokgcbaaaaaaaaabbcehjmopqrssrqolifefinty|{xrkfbadhmrvxz{|||{zwtqppruy|}{yxy{}~~wpjiilptwyz|}~~~}|zywvtrpoooruy|~~|yuqpqu{~wpkiknruxyywvtstvxz}þſssstwz}|wsqrx}tmmqx{tonpty~~|yuqlighlry~~}}||{{{{{zzyxwutsqnljjjmquy|~~~}|{zyyyz|~~yslgccgmtz~~|xtqoljhfefhkorttrnjgeegkosutqmhc`^]^_`abcdeghijklmnopqrsrqnjfcabflrx||xrlfbbeinsxz|}}}|{yvronorw|}zxxz}}{zzz{|}wpjhiknruwz}}{xwutsrrsux{~~{xustw|ysonpsvz|}}|zyxyz|~þüssstwz}}yurqsxzqllpx|vqprv{~|yvrnkijnsz}{yxwwwwwwvusqponmmnnnoopqrstvxz|}}{xvsrruz~{skc__cjs{}zvtpmifddegjlnnljgecdfjnrtspke`][[\]_acegikmnnnmmmmoprssqnid`^_cjqw{|xslgccejpuy{}}~}|{xtpmlmrx~ztqqsx}~}||{{{{{{|}~wpkiijmpsvz~|zxwvuuvwy{~~{xvwy|{wttux{~~~~~|}Ŀý¾ssstwz}}|ywtrrtx~xpkkpw}wsrtx|~|zvroljkotz}zwutsttttsrpnlkklnoqrrqpnmlmpswz||yvromnqw}|sia[[`ir{~{xtokgdccegikkigecccfjnqsrojd_[YZ[]_bdfjmoqrqpnmllmoqssrnhb^[\`gov{{xsmgccfkpvz|}~~}|zwsolklqxxqmlotz~|{{{{{{{{zzz{|wqljijloruy~{yxxxxyz|~}{zz{~}{yyz||z{}ͽǾvvvwy|~~|zywutssuy~~wpllpw~}xttuy}~|zwsolklosy~~zvsqqqrrsrqonmllmoqrssrpmlkkmqtxyywsoljkou{|si`[[`hr{~{wrlhdcdfikmmkigeddgjnqsrojd_\ZZ\^`behknqstsqnlkkloqstrnhb]ZZ_fmuyzwrlgccfkpuy{}}}|{zwsolklqyxqmlnsx~}{{zzzzzzzzyyz|~~xrmkjkmoqty~}|{{{{|}~~}}~~}}~~{zz}ɸǽ{{{|}}{yxwvuuuvw{~xrnnqw}}yvuvy{~~|zwsoljkmqv{zuqooopqrrrqqpppqrrsssrponmmoqsuvuspmjijnsy~zqia]]ahqy~ztojffgjnrttrokhffhkorsspkfb_]]^`bdfilpstusqnkiiknrtvtoib\YY]dkrwxupkfccejnswyz{{{zyvsolkmqx{upoqtw{~~}|{{zyxxxxxxyz{~~xsomlmmoqsw|}{zz{}½ò}{ywvuuuvxy{}zurqsw{|ywwwxz{||}}}}|zwsnkiikosw{~{upnmnoprsstuvwwvutsrrrrrrrrrrrqqpomkiijmqvy{zvpic``dipw|}wqliilqv{~~|wrnjijmprssqmjfcbbccefhjmpsuuspljhhkosvxvqjc\XX\bioturniebbdhlqtvxyyyyxvsomlmrw~~zwuuvwxyz{|}}}}|zxvutuvwxz|~}yurpooooprux|~{yyyz{}½μ~}{ywuttuvxz|~|xvuuwy{}}}|{yyxxxxxxxyz{||zwsnjhgilptw{{tolllnprtvx{}~~|yvsqqrtvwxxvtqnlkjiiijkmoruvurnjfddgkotx{~ztolmqxztommnprtsromkihggghijlnqsttrokhfgjotxzxsld]XX[`flpqplhdbbcfjnqstvwwwwuspnmorv|~|{ywutuvy|~}zvsqqqsvxz|~|zwusrqpppqsuxz}~~yuttvy|ÿųxrs}~~~}}|{zwutssuwz}~{yxwwwxxxxyyzzyxwvutuvxz{{zwsnjhghjmptx~|tnkkkmprtx|~ytqqrvz}~~zvqlhfffhijklnopqpomjhghjlorux{~|vroqv~yspopqstssrponmlkkjjkmoqstsqmjgefioty{zune^YXZ_ejmnmjgdbbcehkmoqstuvvusqpoprvy}|wspprv{zuqnmoqtxz|}~~}|zyxwutsrqqrstuwy|~||}vpoptx}ɻsbY\j~}|{{{{{{zywusssuy|}{zxwvuttuwxz{zyxvtsstvyz{zxtpljiijlorv||tmjjjloruy~{vrrtx}~wpjeccdgikllllllllkkjjklmoqsux|}xsrtz|uqppqrsssssrrqpomlkkmoqrsrplieddhnty{zvog_ZY[_chklkifdbbcegikmnpqstttsrrqrsuwz|~~wqmlotz{uplkmptwz|}}}||||||||||{{{zyxwusrrqqqrsuy~~{{{smlnrx~»Ƚ}eRHK\wź~|{zz{{||{zxvtstwz~}|zywusrrtuxz{{zywuttuwyz{{yvsponmmnoqu{|smjijknqtyyvuw{xqjdbbdfhjkkkkjjjjjjjkllmoprtwz~|wtsu||uqppqrrssttttsrpnlkklnprsrplhdbcglrwzyuoha\[\_cgjkjigeddefghjklnopqrsstttuuvvwxz~wpkknsz{uplkmpswz{|{{zzzzzzzzz{{||||{yxvutsrqqrtw|||zrlkmrx~~}}Ľu]I?CVsǻ}{zz{|}~}|zxvuvx|~}}|{zxvtrrrsuwy{||{zzyyzzz{{{zzyxwwutsrsv{{slihijmosw}~{z|~~xqkfdcdfhijjjjjjjjiijjklmoqstvy{}~~|yvtsv{zspnnopqrstuuuurpmjhhjlprsspkgb``dinsvvsnid`_`begijjjiihhhhiiijjklmnoqsuwxyxvussuzxpkjmsz}wrnmnqtvyzzzyxxxxxxyyz{|}}~~}}|zyxwusrrsw{yrmkmrw}|{{~ýž~lWF=BVsǻ~|{{}~}{yxy{~~|{zzyyyxwutrrrsuwyz|}~~}{{{|~}zwvw{zrlihhikmpu{~xsmigfffghhhiijjjjihhhikmprtvvwwxxwvutssuz|upmllmopqrsuvvurnjgeegjnrtspkea^]`dinqrpmjgdddeghijklmmmmmlkjiiihhijlosw{}~{xspnpu}yqkjmsz~yuqpqrtvwxxwwvvvvwwxyy{|}~~|ywustvy}yrnmorw{~~|{|~µ}|}vdSF@FYuź¿}|}}||~~zxvvvvvwvutssrssuvxz|~|z{~|yy|xqligghiknrx~|xtpmjihgfffghijkkjigffgjmqtvwwutrqpppqrsux||vpljjjkmnoqstvvtqmhdaadhmqtspke_\[]`dhkmmlkjiiiiiijklnprsrqpmkjigfeefhmsyyrlikpyzrmlotz|xutttuvvvvuutttuuvwxz{|~~{xvuvx{}~}~}xtqpqsvy|}~~~~~}}~zwuvx}wk^QIGN_y¹{xusssstttttsssstuvxy|}z{|z|}wqlihgghjlpu{}zxuspnljhfeeegijkkjhfedehmrvxywtpmjjklnpstvxz||{xtokhgghikmnprtuutpke`]]aflqttpjd^ZYZ]`dfhjklmnnmlkkjkmpsvwwuspmjigdcbcfks|zrjfflu|tonpu{~{ywvvuuuttssssstuvwyz|}{xwwxyz|~|zxyz}}yvtstuwyz{|}~~վzpkjlqv~ukbYROPWh~ſ~zvtrrrrssssssssttuvwy|}{|}{{~{vpljhgghjloty~~{xwvusqnkhfdcdfhjkkjheccdhmrwzzwsnieefilortuvvvvtrnjgeddfgiklnqsttsoic^[[_djpsspjd^ZYY[]`cehkmpqrqomlklnquxzzxuroligdbabekt}|riddir|}vrqsw|}{zxwvutssrrrsstuwxz{}~~{yxxxyz||yvuuvy}~|zyxxxxyz{|}¾׽rgcdhovø|lb[WUVZbq}zwutsssssssrrrrstuvxz}~{}|yy|zupmkiiijkmptx}|xvuuutrpliecccegijjigdccdhmsx{{wrlfcbdgkorttuttsqnkhebbbdfhjkmoqrsqmhb]ZZ^cinrroke`\[[\]_bdgjnqstsqnlklnruy{{yvspmkhfdccfmv}sjeeiqzzvuwz~~|zywutsrrrrsstuwxz{}~}|{zzz{|{wtrrtwz~~~}||||}~׾tjfgkqyuf^ZY[`fn{~}|{zyxwvutssrqqqqsuwy|~|yvvx|}yuqmlkklmopsux|zusstuuspmifcbbcefggfeccceinty|{xrkea`bfjortuuutsqnjfc`_`bdfhjkmoppnkgb^[[^bglopnkhdb````abdgkortutromklnqtwyyxvsqomkihghkqxvnihlqx~}|~}{zxvtsrrrrstuvxz{}~~~~~{wsqqruy}ÿyutux}na\\`fnv~¾}|}~}{xvtsqpooprux{~~~}tqqtx|~|yuqnmnoprsuvwy{wqoprtusqmifcbabbcccccbbcfjouz||xrkd`_bejosuvwwvusokfa^]^_bdghiklllkieb^]]_bfilmmlkjihgfeddfhkortutromllmprtvvvusrqpoonnoqv{ztpoprvz}~|yxvtsqqqrsuwxz|~~|{{}{wspprux|³rf^]bju|yy{|xvsqnmmnquy}~~~xolmpuz}}{xurpoprtwyzzzz{~unlmprtsqmjfdba`___``aacegkqvz||xrke``bfjosuwxyyxvqlf`][\^`cefghhihhfdb`__`bdfijlmnoppnljhghilorttsrpnllmnoqrrssssstttuuwx{~zwvutttux{|zwvtrqppqrtwy|~~{ywwy|}zvronnqv{|wspprtx|ƿ|vnf`]`ivyvvyzwtpnlklpuz}{yyyz|~sjghlrw{|{xusqqsuy{~~}||~Ƚrkijmqssqnjgdb`^]\\]^_adfimrwz||xrkeaabfkosuwy{{zxsmf`\ZZ\_bdeefffeedcbaaaabcdegjnqtvvuroljikmorstsqonmllllmnopqstvwyz{|~~|yvrpoqw}zxutrqpppqsvy|zvrpqsx~}ytnidbcgnv}}xtqqruy}ļ{uojfb_\\_fr~xttx|xuqnlklouz{wttux{~{ofcejpvz{{xvsrsux|~~qhfhlpssqnjgdb`^\[Z[\_behkoswz|{wrlfcbdgkoruwy{||zung`[YY[^acdddddccccccbbbbbbceinswzzyurnkklmprssrqomlkkjjjklnqsvy{|~}wqmknt~|yvtrqqppqsux|~xsnllpv}}xqjc^[\ajs|zurrtvz~ù¿ķzoe^ZWWY]cl{ÿ~xttx~~zvsomllpuz~zvssux{xldachouz|{ywuttwz~ɽphfhlpsrpnjgdb`]\ZZ[]`dhknqtwyzzvrmhedehknqsvxz{{ytnga\ZZ[^`bccccccccccccccbaabdhmrwzzyurnkklmprssrpnlkjiiiijlnqux{}~xrmkmt~~{xvtsrrrstvx{~~xsnllpv~zskd^[\ajs||wuuvy|÷}µth`[Z[_dluzvvx}|yurpnoquz~}zxvvxz}ujcacipw|}}{xvuvx{~pigimpsrpmjgdb`^]\\]`dhlortvwxxwurnkihijkmopruwyyxsnhb^\\]^`bbcddeeeeeddccbaa`acfjnruvtroljjkmoqsrqnligggghikmptx{~~ysonpv}zxutstuvxy{|~{vrpptyyrkeabfnv~~{xxz}µ~zy{¹ypkjkot{ľ}zyyz}|yvtrrsvy{}~~}|{{{}~~sib`cjqy~}{xwwy||qkjknqsrpmifdb`____adhmqtvwwwvuutrqonmmlkkllnqtvvurnid`_^^_`abcefhhihgfdcbbaa`abdfilnnnljihhjloqrrplifcccegilorv{~~zvsruz~{ywvuuvx{~|xvwy}|upllou{~}}ɿ~zyz~Ż~|zxvuuvwz}}zxvuuvwxz{|}~{qhbadks{}zxyz}yrnmnprsrolifcbaaabceimrwz{zyvtrrrrssssqnljhhjmorsrpmjfdba``aabdfikllkigecbaaaaaabcdeffffeefgilnqrqnjfb__`cfjmquz~~{zz}}{yxxz|zxwvvwy}~}|}~~}yxz}ĺ|{{ɼ{vqmkknsy~~{yxwvvvvwz}yogbbfmu}|zz{}|wsqpqrssrolhecbbbcegimrw|~}zvroopruwxwtqlhfefhknopomkigfdcbaabehknppnkhecbaaabbaa`__^__`abcehknqrqnid_\\^afkosx}|xvvz~||{|}~}{yxwwwy||zxwx{Ž~~½}¾|unheeiov}~|zxvussux}~vngccgnv~}{{{|~~{xvusrrsstsroliecbccegilpv{{upmlnquy{zwrmhdcdehjlmmllkjihfdcbcfimprrpmjfcbbbbccba_][ZZ[\^`bdgkoqsrnic^ZZ]afkpuz{vsty|{{|~|zyxxxy{~{wuttx|Ⱦ½ÿ~x|unhddhnv}~|zxusrrsw}{tnhddhnu|}|{{{|}zurqrrsssttttspmifdccdegjmrw}{uokjlptxzzwrmhdccdfhijkllmmlkhfeddgjnqssqnkgecccdddcb`^\[[\]^`bdhlortsojd^[[]aflqv{}wtuy|{{}|{zyyz{~|xustw{¾˾ÿſ}w|wqliilqx}~{ywvtrqqsw|~|xsnigginty}~}|{zyxx{snllnprrstuuutqnkhedddegilqw~|uojijmquwwuqmifedddefgikmnoonljhgghknqrrqnligfffffffedcba```aabdhmquwvsmgb^^`chlqv{{xy|}||}~}}|}}{wtuw|ÿǺ|}yvsqqswz~}zxutrqppqsw|}|{{{zyxurnkjjknqtwxzz{||{yvsrsy{ohfgjmpqrtuvvuspmjgfeeeegjov}}unighjmprrqomkihfedccdfjmprsrpnljjklnopppnmkjiiiiiiiijjjiihfdcceinsx{zwrlgcbcfimqu{~~}}~{wwy|ĿʿĿ}}~}|{{{{|}~~|yvsqpooooqsw|}zxwvvuutrqonmmmmnopqsvxz{{xsnllq~ykecdgknoqsuwwwurolihfeddehmu|}uniffghjllmmmmlkifca`adhmruvvtronmmmnnnnnnnnmmmmlllmnpqssrpmifefjpv{~|wqlighiknqu{~~~{z{}~~ſƾzw{¸|xx|~|}~}{yurommlmnoqsw|~zvtsrqqppppppponmkjjkmquy{{vpjffkywib`aehlnpsuxyxwtqnkigecbcfks{|umhedddefgikmopolgc_]^bgmsxyyxusqponmmlmmnooppppooopsvy{|{xsnighkqx~|vrnlllmoquz~~}~~~}ywx{ƿù|qjiozϿž~yuuy|{}}zwspmlkklnortw{|xtrqonmmmmoqrrrolifeeinsx{zvohcbguvha_`cgjmosvyzzxvroljgecbbejrz{slfcaaabcdgjnqrqnhc^[\`fmty{{zxusrpomlkklnoqrssrrqrsvz~~xrmjjmsz~zvrqpoopquz}|||zvstx~ƿʽ~rhccjuʼ~}~|y}~wssw~|{}}zwspnlllmnprux{{xurpnlkjjknpstsplhdbbflrwzzvpicbgttga_`bfiloswz{{zwsoljgecbcejqx~~wpic`__`acdgkortsoib]ZZ_emtz||{yvtrqomlkklnoqsssssrsux|{vqnmpuz{xutrqqqruz}{z{}{vtuyžʼumihmvĮʼ}{|~{vz}vqqu|}}~~|yvsqooopqstvx{~|zwurolihgilprtsplgb`adjqvz{xrlhgkushb`acfikosw{}}{wrnjhgeedegkpvz}|xqjc^\\]`cehknqtusoib\YY]dlsy{{zxusrpomllllmopqrrssstux{}yvssuw{~}{ywvtssstvz}zxyz}zwx|ý|z{}κĻ~|ytx|uqpty~|zxvttsttuvxy{}~}{xuplhfegknrtspkfb_`dipvz{zvronqx~rjeccdfhjnsx|~~{wqlhfeefgijmpsvwupjb\XWY\afjmortvvtoha[XX\cjqwyyxvtrponnmllmmnoopqqrstuwz|~~}{zzzz{{{{{zyxxwvuutuwz~|{|~|ywvxz}|}ſǼ{y}˽}zxsw}{uqpsw}~}{zyxxxxyyz{|~~}xsmhedfimqsspkfa_`ciouz||zxwwx|yrligffghjnsy}|vpjeddfhjlmopqqpmhb[URRU[bioruvwwvsoha[XX\biotvwusqoonnnnnnmmmmmnnpqrtuvxyz{|~}zxvvvvwxxxxwwvwx{~~yurrsvz}|xutuwz}ÿrjlxǸxu{~|zxvsv|{uqqrvz~~|zyyz|~}||{{z{{||}~|unhdcdhlpsrokfb`adiouy|~~~~~}yvromkjhhhjntz}vohdbcfjmppppnljga[TOMNS[dmtxyzyxvsnha\XX\ahnsttsqommmnnoooonllklmnprstuuuvwx{zuqpqruwyzzyyyyy{}|wqmjikoty}|wtssuwz|~~~лk]]lƬ{kgn{}}}|{yxvtsv{zvsrsuwz|~}zvttvz}~}|{{z{{{|~}woidbdhlprrplhdbbejpuy||ywuttssrqomkjjkou{~wohcbdgkorrqolifb]VPLJLR\fpx{}|zxurmga\ZY]bhnrssqomlllnoqrrpomlkklnoqsttssrsuyyrnlmpswz{{{{zzz{|}~}{wrlgddgkpuz~}xtrrsuwz}|{|ͫiVTd~Ҵygagv||||{yxwvuwz}}zwuttuvwxz|~}yussux|}{zzyyyz{}}voiecehlpssqmjfeehlqvz|}yurqqrstutrpnllmrw}yqkfdfimqssqolhda\VPLJLS]hry}}|zwsplgb^\\_diostsqolkklnqstusrpnllmnpqrsrrqqqtx~xpkjkosw{|}}}|||||||{xupkgddfjoty|~yusssuwz}|{|ٵmXUb{۽mfkx~}|{zxxyz{{{{{zyyxwvuttuwz}|xusstwy|~{yxwwwxxy{}zuojfefimqssrpmkjjmptwz|~~zvsqpqrtvxxvtrqpruz|uojiiknqrrqnlieb^XSONPV_isy||zwspmjfc`_`chmruvuroljjmptwyzywtrpooppqqrqpppqsw|}vojikotx|~~~}}|{zxvtpmkiiknqux|{wuuuwx{}~}¿⿚yc]fyʮy{~|{ywuttvx{}~}{xurpprtx{}}|zxvutuvwyz|~|yvuuuvvwwxz{{{zwsnkhgiknqsttsrqpqsuwy{|}}}}|{ywusrrsuwy{{{ywvvwz{uqonopqqqonljhfb]YUTV[cksxzzwsokigedccehmrvyywtpljjmrw{}zxvtsrqqpppooopruz~ysnjjlpuz~~|zxvutsrrqrstuwy|~{yxyz{}¿ʨsknyî}ytpmmqv{{uplklorvxyyyxwwvvuuuuvy|~zvsrrrtuvvvvvvutrpnlkklmprtuvvvwwxyz{|||{zxwvuuttttuwy{}~~~|||}|xutrqpoonnmmljgc_][\agmswxvsnjgeeeeghjnrw{}}zvpljjntz~{ywusqonnnooprtwz|}|yuqmkkmrw{|ywutuvxz{|{zzyz|}||}~½Ӷ|xy~˾yqkhhlt|}unighjnruvwxyyyxwurqpqtx}|xspooprstttsrqponnnmnnoprtuwxz{}~~~~~~}{ywtrppprsuwyz|~~|yvrpnmmmnoonlifdccfjosuusojfcccegjmosw|}wrmjkou}~{wtpnmmmnpqrsuvwwwtrnlklosx}|xuttvz~~|{|Į{vsswõypiddjr|~ulfddgkortvxyz{zxtqnlmqv{|vqmllnprssrqomlllmnoqrstuwxz|~~}zxtqnllmpsvy{}}xtolkkmoqrrpnljiikmpstsqmiecbdfimpsw{ysnkkpv~}ytpmkkmnprssttttsqomkkloty~|xustw|}{|оqfabjw®zqiddjs}}tjdabejnrtwyz{|{xtoljkou{|upkjjloqrsrpnlkklnprtvwyz|}~{yvsomkkmpswz|~ztoljkmorstsqpnmmnoqrsrpmjgeegiloruy}ztolmpw~ytokjjloqstuuuttsqoljjlotz|xustw}}{{ʻrbXW_mȴ|tmhhmu~{qhb`bekptwyz|||{xsokijov}}vojhhknprsrpnlklmpsvy{~~{ywtrpnmmoruxz|~{uoljkmortuttsrqppqqqqqponmllmnprtvy|zuqnnqu{~xrmihilpsvxxyyxwvspljhjntz|xvtux||z{~ɻwcWT[j|˻~xroorxxof`_bfmswz|}}}|{wsnjijpwwoifgimprsrpommnpswz~}zxvtsrqpqqrtvxz|}~||||~{upljkmortuvuuttssrqpppqrsuvvvutttuwz}~{wsqpqsvy{}~wpjfeglqvz|}~~~}{wrmighlsz~|ywvvx{|yxz~ʵiZV]k}¹}yvvx|}ule`_bhov{~~|zwrnjikqyxohefhlprssrpooqsw{|yvtrqqqrtuvvwxyz{|~~{ywvvvxy{}~{upljkmortuvwwwwvtrponorvz~|yvttux{}}{xvtrrqqqrtwz~|unhdcflrx}{unheejqz}{zxxwxz{}~~|zxwwy}~}}~èra\bp~}~~yrjd``dkrz~|zvrnjilr{xngdegkorttssrsuw{|xurponoqtvxyzzzzz{||}~~}{xurqpqrsuwy|{upljkmortuvwxyyxvspmmnsy}xtssux{|}|{zxwuspmkjknsy}ztlfbbfls{wohcdiqz}|{zzyyyxxxxxwvutuw{~}|{{|}~yvv{е|jdjw~{vpidbbgmu||zvrnkjls|xmfccfjortuuvvwy|zuqomllnqtxz{|||{{{{||||{xuromllmoqsvy}{uplkklnqstvxyzzzwsolkms{ytrrtvy{{|||{zxtpkgeehnty||xrkfbcgmu|zphcchqz}{{{{{{zyxvuttsrrrsuz}|zyyyz|}voklr~ۿsmr~ƾĿ~~}{xtojgefjpx~|zvrnlkmt|vldabdimqtvxz{}}wsomkkkmpswy{||||||||||{zwtpmkjjlmoqsw{{upljjlmoqsuwy{|{xsokjlr|{usstvy{|}~~~|wrlgccfkpuxyvqlgefiov|{qieejr|{zyzz{{{zxvussrqppqsw|}zyxwxyz}zskggm{Ǫ}vzĿzz}zwurpmlkmpuz~|zwspmmnt|}rh`]^aeinrv{zuqnlkjjknpsuwyz|}}}}}|{zxvsomkjjkmoqsvz~zupljjjkmnprvy{||xsnjhjqz|vttuwz|}|vpjfefimpssrpnlklorw{{slhhmu~}ywwxy{{{zyxvutrqonnpsx}{wtttuvx{~|tlgflyʹǿ¼}wv|}zvtrqqrrsuwz}~|zwtroopt{wlc\YY\`ejov~|vrpmlkjjkklnprtw{}~}{ywuromlkklnprtvz}}ytpljiiiijlosw{||xsmhfhnw|xvvwy{}|vpkihhijllnoprstuwxy{|{tollqxzvttvxy{{{{zyxwtqolklosw{~~{xtpmmoqtx|xoihmyҽƾ{tsx}~~zvrpoqsvy|~~}|zxvsrqruy}ypg^XUVX\afmwzxz}{vrpnmllkjjiiijlotz~}{xvtrpnmmmnpqstwy|~~{xtpljhgfffhlpuz||xrlgeflt}}yxxy{}}wrnkhfeefinsx|}}{ywvvx{~~zvrpqv|~xsrrtvxz{|}}}|zwsokhhjmquwwtpliggjnsx}~tnkp{Ʒ»{sqt|}}}}}}}}}{|~~{wsommpu{~}}}|{zywutsstwz{|yskc[VTTVZ_elx~tppqtwyywusqonmllllkigedegkrx~~{xvusqpooopqrtuwy{|}|zwsoljhfdcceinty|{xrlfcdiqy}{zz{}}xsnid`_`emv~yuqprux{}~|zxvuvz}wrpqruxz{}~~zuojfefiloqqnjgdbcglsy{sqtú}{{|ľĻ}urty|||||||||{{|}}}{xtpmklqw~}|{{{{{{yxvusstuvwvsohb\XWWY\`fmz{pjhijmnnnmmllllllllkifdbbdipw~}zxwutsrqqrrsstvxz{|{yvsoljhecbbdhmsx{{wrkfcdhow~}{{|}~|wqib][\cmxzsnlmptx{||{zyyz~}wsqqsuxz|~}voieccehklljgdbacgmtzzwzǿĿ{uokjmvƿǿzvvy~~~}|||{{zxvrnlkmrx~{yyyz{{{yxvtsrrrssrpmieb___acgkr}ynheefhiiiijjjjkkkkkjigecdfjpw}~}|zxvutsrrqqrtvxz{zxuroljhfeddeinswzzwqlgddiov}}{{|}~yrjc]Z\cnyyqkjknswz||||{|}~zvuuvwy{|xqjebbdfhjjigfeegkqw}~ǿ|wpjecfnƿļ~}{ywvtrpnmmotz|xwwxz{|{zwurqoooooooonnnnopqrux|wmhfeefggghhiijjjjiiiihhhiknrvz~|zxuspnmnprvxzzxurnljihhhijmqtwyyvqlhfgkqw~~{zz{}~yske_]^eozxpjikoty|~~~~~}}|||}~zslgdddfhjkklmnorux|¾ztojggjrƾż|wspnmmnoprv{}xutuwy{||zvspmlkkklmorv{}unjhgghhhhhhiiiihhghhjkmoqstuvwy{|wsnkhhjnswyzxuqnkjklmopqstvwxwtqmjijnsz}zxxy{~|xsmhcachqz}unjilpv|}vojhffgijmosw{~ytpnoqv~Ƽº|uokiiknqtvy}}yurqsvy{}|yuqmjhgggikpv{wsomlkkjjjjjiiiihgfefgjoswz{zxussv|zslfcbejpuyzxuqmkkloruxyyyxwvusqnmlnqw||xvvwz~|zwsolighmszzsmjjmsy~}{zz|ysnkjiijlou{ÿýytsuzź}tlgefjnswz|}|yuqooqtx{}|ytojfedcdfjpzzusrqqqppoonnmmlkkjihfdcdfkry{upnqy|sjc^]agntyzyuqmkknrw{|zwusrqpopquy~{wttvy}~|{ywusqommnquy}|wqljkou|~zwuuw~|vqomlklnrzĹſŹzvx}ĸź}skecdiouy|}~~}}{xuqnllorwz|{xsmhdcaabdhp|ypkjkmprsssrrrqponlkjhecbbekt}~unknw~tja\Z^emty{yuqmkkotz{wtrqqqqrsw{~zvssuy}}{zxwvutsrqqqrtvy{|{xtpljlpw~~zvsru}}xtqonmnpu~ͽʽ|y|öǺ~tkecejouy|}}}|{zwsoljjmptxzyvrmhdca`acgo|wmihilpsttuuvuutrpnmkhecabekt~vnjmwujb\Z^emuz|zvrnklouz{wtrrqqrstwz~}yvttvz}}{zxvusrrqrrsstvwyz{zwsolklqw{wtsv}|xtrpnnoqwɺľɽ}¶woighlpuxz{|||{yvrnkhhjmqtvvtpmifecbabfmzwplklnqstvxyz{zywuromjfca`cjt~wolnwwmd^]`gov{}{wsommosw{~~}{yvtssrrrrsux{}~|zxvwy|~|zwurpnnnoqstuvxyzzyvsomlmqw}|yxz~{xtqpnmmnqwƹĹƾztommoqtvwyz{{{zvrnigfgiloqqpomkjigdccekvzvsrqqrstwz}}zvsplgc`_bir|xqnpyyphcbekry}~}yuqnmnprtvwwwvvuutsrqqqstwxz{{{zzz{}}{wspljjjloqtuvxyyyxvspnmnqv{|zxxyyyxvsqnmllklnqwú¿»¿~zvtsrrsstuxz{|zwrmieddfhjklmnnnnmkhecdir~~~}zxvtstx|{wsnhd`_agpzztqs{|tmhgjou{~{wspnmmmmmnprtuwwvtrpoopqrsuvxy{|~|xsnifegilpsuvwxyyxwtqonoquy}{wtsqqponmkjihiijknqx̚}{xvsqpprux{|{wsmhdbbcdeghjlnpqqnjgddfnwytrty~~yustx~zvpjea_afox|wuw}~wqnmoty~}yuqomjhgfgjnruxywurpnmmmmnprtx{~zsmgdbdgkortvwxyyyxusqpprtwz}|yvsqomkjihgffffghjlosy½ٖ}xtpmmorvz|{xsmhdbaaabcegknqssplhdcejr{{skgglt}|vstx|xsmgcabgnv~~zyzzurqsw|~{wsqmjfdcdglqvzzyvrolkjjjjlnqv{|unhcbcfjnrtvwyzzzywusrrstvx{~~{ywutrqomkjhgggfghiklorv|Ķýľ㓓ztnjikotxzzwrmiecaaaabcfimprrolgdbdiow}|umfbbhq{}wsty~zupkgffjpw}~}~|xutvz~}yvsolifefinsx{|zwsoljihghikoty~xqkfefhlortvxz{||{yxvuuuuvwy||zxwwwvuutsrqqpoooopqsvy|ʾü咒}~zrlgegkpuwwurnjgedcbbccehkmnnliebacgnu{~~zskeabhpz|wttx~{wtqomnptx|}ywwy|{xvtqonmnptx|}}{wrnjhgeeefgkpuz~~~xrnmmnprtvxz|}~}|{zyyxxyy{~}|||}~~||}ż»º|wz~yqhcacglqtutroljigfeeeeefhiiigdb``bfmsy}}ztmhdeipx{vtux~~|zyxxwwxxy{|~~~~{xxz~~{zyyyyzz{}{wrmigecbbcdgkptxzzzyxyz~}ywvvvvwxy|~~|{{z{}»¼¿֏|xru{yof_]_chmprrqpomlkjihgffeddcca`_^_aflsy}}{vqliilqv{|xvtux|}|}~~{zyz~~xttv{{yy|~~|wrmifdba``bdgkoqsssrrsuz~|zyy{~}|{||~¿ˎ}xtmryxnd]Z[_dimopqqqpponmkjhfdb`^]]\\]_bflsx|}|yuqnnpruxzzyxvutuwz}~||}}yvw|zrlknt{|zz}|wrmifdba```begjlmmmllnqv~}{{|}{zzyyyyxwwvwx{~Żù¿Ĺzupkpxync\YZ]bgkmopqrrrrqomligc`][ZZ[\^`chmsx{}|zwtrrrrstuuuttsstuwy{}}}|{z{}xtuzwmfehov~|{{~}xsokhfdbbabcdfhjkkjiijnt||{}}{ywvuutsrqqruy~ý{yxy{}~ùÿ÷¾|vqmry{pe]ZZ]aeikmoqrsssqpnljgc`][Z[]_adgjnrvyzzywutssrrrqqqqqqrstuvxyzyyyyz|xssxukdcflt||{|~~zvroljigfffghjklmlkiijms{~{{|~{ywvutsrqqpqruz}xuuuwyz|}ýǻ|xrv~~sia^]_behikmoqrrrqonljgeb_^^`behkmoqrtuuvvvuutsrqonnnnnoopqrsuvvwwwwy{xsru{{rjedgmsy~}{{{}}{ywusrqpoopqrsttrpnllnt{~{yy{~~{xvuttssssrssuy~}wttuvxyz|}ƾǼĖ~y}yogcbbcefhikmopqponlkjhfeccdgjnruvutsqppqrtuuutromkkjkkllmnopqrsttuvxzytrsvy|~}zupliikosx{|}|{zzz|~~}|{{{}~~{xtqpqu{}{ywuuvx|}{xvtsssstuvvvwxz~Ž~xuuvxz{{|}ºΛvnjgfffffgikmnnnmlkjiihhhiknsx|~~|xsolklnqtuutqnkihgghhijklmnoqrrstvy}yurqqqqqqpoonnoprtvxxyyyyyy{|~|xuuw{zuqonnopqsvy}~|zxvtrqppqrtvxy{|}{xwyz|}~~¿¿۟|uqmkihgfghjklllkkjijjjklnquz{smhfhkosuusplifeedeefghijlmnoprsuw{~yuroligeegjnqsuuvuuuuvvwxyyz{{|}~{wutuvx{~}yxy{~{uoieccegjmpswz}~{xusqonmllmorux|~¶~{{|~¿zx|棣{wspmkjhhijjkkkkjjjjklmoqty}skecehmqttrokgecbbbccdeghjklnopqsux|}yurmhc_]]agmsxzzywusstuwxyzzzz{{|~{uqmlmpsw{|zz{}~~{voga][\_bgjmqtxz||zwtpmlkjiijlosw{·~~{wxtjgkt~}|}ƶ裏{xusqomllkkkkkkkllmmnnpqty|skecdgkoqqpmifcbaaaabcdeghjklmnoqsvz~|xtpke_[YZ^enu{}}{xuttuwy{|}}}|{{|}~ytolkkmpsw{|yyy{{{xslf`\Z[^aeilorvxzzxuqnkjihhikmquzǿwrs{pdaemv}zyxwwy~ǵ󫫫}|{zywurpnlllmnpqqponnnptzzslgeegilmmligdcaa``aabcdfgijjjklmosx|}ytplgb]ZXZ_fow}}zxvvx{~~~}zvrponnnpru{~yvvvwxxvrnieb``acehjloruvvuroljiiijkmpty~ľ¼wqr|ujegmu}}{{zyyz»ij󯯯zuqnlmpruvvtqnkjjmrvz}}{wsnkihhhhhggedcbbaa```abdeghhhhgghkou{{vpkhd`][Z\biqx~}{z{}~}|{yxwuspnllnry}xtrrrstutsqomljihggggiloqssrpnlkkkkmnqty~º¸žxsuuppsx}¿п𳳳|upnoswz||xsmhdcehlpsttsrqonkigdcbaabbbbbaa``abceghhgfdddflryzslgca_]]^aflsz~~|zzz|~~ytniffjpv}zvronmnpqstuvwxwvtpligfgilnpqponmlmnopsvz~ƾȻ|xz||~ľǸ췷xroqu{{tle_]^`cgjkmpqrrqnjfa^]]^`abcbbaaaabdfghhgecaadiqxxqic`___`cfjpv|}ywwy}wnf`_bgnty|~~|{yvspmkjklmoqsw{~~xrlhffhkmoppoonnoqruw{Ĵ|ùȿʾ軻{tqsx}|tkc\ZY[]`cfilprtsoje_[ZZ\^abcccbbbcdfgijjhecaaciqxxpica`abegjoty~{wttx~ynd][]agnsvxyz{{{zyxvusqomkjjjkmoqty~~wpjhhjloqqqqqqqrtvy|ƿɾǿ溺~vsuy~|tkb\YYZ\_bdgjnpqqmid_[ZZ\^`bccdccdefhjlmmkigeeglszzslgeefgjlosw|zussw}xmc[Y[`flqtwyz|||{zxvtsqponmmnnoqsuz{tomnoqtvvvutttuwy|Ͼž»˿¾赵zwwy|~}xqjc_\\]_bdefhijkjheb_]\\]^`abcdeeghjlnpqrqpnmmosx}~yurpoopqrtx|~|xtrsv|vlb\Z\agmrvy||ywvuuuuuuuutuuw{zwwxy|~~|zxwxy|;¿ºſ쯯}zyyyxxurniecabceghhgfdcaa``````_____`bdfhjloqsvwyyyyyyz|~~}|{zz{}~zwwz}yvtssvz~{sjb]\_djpvz~}||}~}|zyz{}}{{|~˿¾ô񪪪~{xurpmljihggijlnnmid_[XWX[^adddb`_^_adgknqtwy|~ztpoquz~~|zywvutstuwz{{zuoic``chnu{~}|{{{|}~üŸ}wrligfgiklmortutrld\TPORW^dijifc`^_bejnsvy|~vojhilptwxxwutsssssstttuuutsplhedehntz~{xvvx|ȿƺ||~~wpiecdfjmpruxz{zvoeZQKJOW`hnpokgcaadhmrw{~|slfccehknoonnmmmnpqssssrponmkihghjntz|wtru{}|~ÿƽź|yy{}wpiedehkosux{~{sh]SMLQZdnuwvrmiggjnrw{{rkebabdfhhhhhiijkmoqrrqomkiihhijlotzzvtv|~|}ſż|xwx{~~{vqlihiknqtvz~xncYSSYbmw~}xtqrsvz~ysmhecbbbbbccdefgikmoponkifeegiknrv{|y{¿ǽ¿¼~xuuwxyxwusqppppqstvzvlc^^dmx{xtpmjgda_^]^_`bdegiklmljgdbabeinty~¿ºÿ·yusrrrrstvxyyxwuttvz~vnjkqy~|zxwvutrokfa]ZYY[^`cdfghiiigd`^^`dkryĿ¹Ĺǻ|vronmmpuy~}zwvw{yvw}}|zyyxyz|}~{xusrsuwxwupib[WUVX\_bceffgffc`][[^dluľ¸¿~~ŻĿɼxrnlkkpv}{yy}}{xurpnnptwz||zwspmmpswz{yskbZTRSVZ_bcdeeedca]ZYY]dnyÿǿĿø¾~|{}ĺƼǻ{uqnmnry~}{yurnkiilotwzzwtpljjmqvz|yskbYSQRVZ_cdeeddcb_\YWX]ep|þ¾Ļ¼zwy~~{z|ɿǼ쯯ȿ{wtstx~~}|{zzxvsokhggimrvxxvrnjhhkotxzxrjaYSQSW\aeggfedba^[XWX]fq~ÿǿýž|uruz}|~üùᰰû}|}~}{zyxwwwvusqmjgffimquwwuqmiffimruwuph`YTRUY_eijjhgdca^[YXY^htù½yroqv|¼Բ½}{zyyzzyxwvutsssssrqoligfgimqtvvtplhfegkorsrmg_YUUX]chlnmkheca_\ZY[`jvȼþɽĻÿxqnptzƳ¿yurqqrsssrrqppoooooonmkjhhhknqtuusokgeefilopnje_ZWWZ`flpqpmjfdb_][[]blx÷yqnpty~|xvx|~xsnlkklmmmmmmlllllllllkkjjjjloqstsqnjgddegiklkhd_[YZ]cinrsqnkgdb`^]]_enzĽø»˸ʿzsqquz}vqpquz~~ytokihhhiiiiijjjjjjjjjjjkkllmnpqrrqolhecbcegijigc`][\_djorsqnjgdba_^_bhq}ǿȽżƴȽž}wuux}|yxxz}wpkikoswzzxurnkihgfeeeefgghhhhggghiknoqrrrqqpnlieca`aceghhfda_^_bfjnpqolifcbaaabeks~žǾ²ƿ}}~yvuvy}|}yqjecehlpstsrpnlkigecbabcdfggffeddfimqtwxwuromkheb`^^_acefffdcbbbdgjlnnljgecbbbceinvúþ˽ſ~zwvx||yz{}}xrke`_`bfilmnoooonkhda_^_acefffdcbbdintz}~{xsnjgda_]\\]_acdeeeeeeffhijjjigecbccdfimryƹø½}zz|}zxxxyyyvrlf`][\^adfhkmoqqpmid`]\]_beggfdbaadipw~zsmgda_][[[[]_acdefghhhhhhggfedcbbcegimqv|ôÿüÿ~}|zyxxwvurnic^[ZZ[^`cehlorsroid_[Z\_cfiihfcbadiqyzslfb_][ZZZ[\^`bdeghjjjjhgeddcbaabdfimqv{ýɺ¾~}}~~}|zywurnhc_[ZZ[]`bdgkorsrnic^ZZ\`eimnljgedfkqx~~xqjea_]\[Z[[]_abdfgijkkjhfdcbaaaabehmqw|ƿ̽¾ƿ}}|yuqkfa^\\]_bdfhloqrpmga\YZ]ciosutqnljkmqvy{{xsnidb_^]\\\]^`bcefhijkjihfdcbaaaacfkqw~º˽˿ü|{}|vpjea``acfhikmnppnje`[YZ_fov|~}{xurqqqrrrpnlifdca`__^__abdefghhiiihgedccbaabdhnv~źȼķļzwy}|z{}wqkgeegikmnnoonnlhc^[Y\bku~{xuqmjgedddeeddcbbabbdefghhhhhggfeedcccbbcejq{ȺĺüнŽƼzpkkou{~{zz}~xrnllmorssrqpnljfb^[[^fq|~wphb][[]adfgggfeeefghiiiihgfeeddddddcccdglt˻ſʶŻƻżymgfiouy{||||~{wuuvwxyxvtqnlifc`^_ckwxnd\VSUY_dhjkkjiiiijjkkjihfedccccccddccehnwμøݸƺĶunmoty}~|zwspmkhfdcejs~vlaXRQSY_fknooonmmmmllkjihfdcbbaaabbccdfioxĺӾȽŹ~zvronmllmpu~ypg^WRQU[cjpsuuttsrpomkjhgfdcba`__^__`bdgkpxƺþüʹ嶸~yusrrtvy~woh`ZVSTX`hpvz{|{zxwtqmjgedccbba_]\[[\^`dhlqw}ÿû»Ƚ½}ywwy|zme_ZWVVX^env}|xsniecbaaba`^\YWWX[_dinrvz}ž̾Ǿü¹Ļ~||se\XVVWZ]dlt}}wpjebaaabb`^ZWTSUX^djosuvwx{~ʵ̿»ƽȶƸm_WTTWZ^ciqz|uoifddddca^ZVSRSW^ekqsttsrsw|ĽӺѿƿºм;}l_XVWZ_chnv~~xsolkigec_[WTRTX_fmruutrqquz׽Ƴ°ylc^]^aejnt{|wsniea]YVUVZahotwwvtssw}ؾɷɸ²|unigghjnquzvoid_\ZYZ^dkqvyzyxwx|׾Ķ¾|yvusrrrrrstuwy|tmgc`^^_bgmsx{|||}Խ|vpkfddfkqw{~¸zqkgdccdgkpuz}~ѼĿ˾~woha\Z[ait}ijuokihhiknrvz}κþĽƼȼ{sle`^`fp{Ƕyspnnnnopsvy{~̹ÿº¸¸|wsqsx}xvtttsssstux{~Ŀʷÿû~|{{zywtrqqrvzǴƿͿ{vqnlmpv}ű}||~̽ʾxqkghkryï|yyz{}}}ɺŹyqiddhnv}{xxyz||{Ƶǻÿ{ridcfkry|yyy{|||Ž}tkfdehmrw{п|{|}~ҺĽvoifefhjmqw};δɾþyrmifdbbdgnvʽ}~|~~xwzʮǺ|vqlgb^[Z]ep{ȼ}|}~}~}{{}yrqt{ýȿǩ;~~ytoia[VTV^jw}{~Ƚ}|wuw}~{}~||}}zy{}zrpt{¸å|z{xxz|vqjaYSPRZer~|z}ʿ{z|ztqt{~{}}{{~}zz{~zx|ƾڽwvõ|xvy}xrkbZSPQXalw}}õ{z}{ursz}{}~|}|}»ƽӷsr~Ķzxz~xskc[URRV^fov{}~ȶ}}yuv|~|{}~}~ẕ̇rp{ŷ|}~ysme^XTTV[agmrv{͸¹~yz~|{|~}||}ƻȾǮsq{ƺzunha[XVWY\aejqxҺŷ~~}{{{{|~¾}{{{}ȷŮxwʾ}|~|wqjd^ZXXXZ]afnwԻ~{yy{}ý}{zz|IJȴž|{}ztmf`\ZYZ[^bgnxӻȹ~~ľ~|{{}ű±ľ~yqib^\\]adims{мŻ~}}ĮȷǼ~uld_]_chnsw{ʽû}yx|ȿɽzof`_ciqyýɽxrrv~ּ¶~shbafoy~Ƶ}smmqyҷιƹvkdcis~|{{}˸Ŀ|rkkowγɼymedjt}{|}˸unnryʰ|ofdir}ƴ½}wvzŭƿ~pgdgow;ÿԿƾrhdfkqy̺ÿƽż|zz|ujeeglrw{ôǸ}wttx}xmgefimrv}~|{{{{|~ƻżʺоǿ|wttw}}qkhhjmqv|~{yxxxxy{~Ľùųɸÿ~zww{xqonorux~~{yxwwwxz}~|{{{|~ĿĿŽѾ²}}yvvvxz}|zyxxxy{~}xvutuwy|Žɸĺƻ~~|{zzz{}yspnoprtw|ǿý³ýý~}}}~ƻxokjjkmpsw|ķ~||~~{{ɿɼɴĿıxniggikmptx~ƶſ{vtuw{{xx~ƺɿ÷Ŀƴzqkihijlnrw{Ĵúztrsvz~{yzɼĽƺƽǶ½wrnlkkknquzȽ¹|wuvx{~~~~Žľøzuqnmlnquy}þ}{|}~|zz|˼ø~xspnoruy}|ywvx|~~´}zzƶ¼~ytrrtwz~{wtsuz}z|Ͼ{vuzƶ|{}zwwx{~{wsrty|y|ȶ}wv{ʽŸxtxɽ|{}~}{xutvz}|Ͼǻ̿xnikw~}~}{zz{~Ǻùĺqf`akz½ǿľĽxkaZZalz~}ϽŻľÿth^XW[cmw~|||}Ƭɴý{qg^YXZ_gox¾ÿ~{|~z|xxƿxqib^^`dipxþǾú~|||£xxڿƿ|yvrnkjkmqv|ʿ}~ʮí}{xvttttvxz}¾̹}{yvtqommosy¼¿þǾ{wspnkiijnv¿zy{Ŀ̾{vrpmkijlr|ýzutv{Ŀı¼ɿ{xwusstw~ǽzusv{ýƱ¼ɿ¸|xwy}İƿ}}~οŽŹ|}Ȼʼü¼{xyȷѿzz}¾ɾ~xuwӿ˸~ƽ~xuxűɸ¼ü{x{ȵɽ¾ú¿}˸¿ȿ¿ͻƾ½ɼ~Ͽſľĵ|{·¾ļ˽}|ǼŻǽ¾ɿýнöľǾȴοĿĻĺ˻ʿɽҹɷɾ~δĴǽ¿ij}}ͳúľɶ~}εźþ~|͹}~ѹȿ¼ľ~wuxҼ~Ծĸzqkhjp{{{ʿzrpt|¹ıŷ{pf]WUW_kz{snnrz½ȹ{rpu}ĬɹʹȻsiaZUTV^iv~zrmmry¾´zw|ȳɹ÷¼tnjhgginu|ztsv||yy}÷¹ͼ¹||~{qjhmu~ȼ}{z{uia`enzù}|||~Ƹ{vrqrv|{z|pd\[`kw¿ƾ~{xvttuy~¸Ȳwpljkozytrrsvz}nbZY_iv¿ȿ~yvsqqtyȼ͵~uokiimw~tommnrv}}pe^]clwɽȿ~zwvx}˼Ȳwqmllpx}tomllnrxwojims|ûžʹºⷷϾzvsrsu|~vromllos|~{z|¾dzƸ¾Ⱦ|zz{|zvsomklnu}ƿ¾ſ½í¿ͷz|ľ}zvrnkjkou|~}||~~||}{yxz~þƾؿùԸoikt̻}{~¼}{wsoljjmpuy}}xtqonoqtwxxvrokiiknruwwtplhgiov½ƺ׽˻ۻ}h`cn}IJ{uojhjsô|~}{zxuspnmmnpsvxyz{{}|wrnkjjkmnonkhda__bfjnpqnjeb`bhpx}zxz~öֽʸmeis°ztnjhjs˼ysƿ}zvtrppqrstuuvvvwwwvvwy}{wspnljihgec`][Z[^cimqqokgdbchnu|}{{|żտ̺ý̮{~ƶ}|~Ŷ}vq{uojggjouz~~|zxwusqpqu|}{wsnida^\ZXXX[_ekquvurnkijlpuz}°Ⱦ®~yuypg`\]clw{xtqmkkmrz|skb\XVUVWY]bipw{}}{xusstuwxz{||}}~þƸǼ¹ǻ|wl`WRT\jy}ytokgfgkqw~ymaXTRSUX\`fmu|~|{yxwwwxxz||{}ü¾ĸvi\QKNXh{~ytnieccfkpv{~oaVQPRVZ_djpw~|xutttuwz~xomnszƽƾý¾zzz{|}tgZOJLWh{|wrnifeegkotx|~o`UPPRW]bglqv{~xsqpqrux}xolnryŽǽþ¿yyyyz{|}}|}sg[RMOYiz~wspmlkjkmptwz|}}}~paVQRV\bhkmoqsvzxronoqtx||z{~¼ſþxxxxxxyyyw|zrh^VRT]jxvpmmnoqsuwy{}~~|yvttv}qcYUW\binpomjiinwzqnmnqtw{þýÿvvvvvvvvusx~~~{wqjb]Z[bkv}unihjnty}}vpjgiq{re\Y\bjqvvqkc^\`l}{qmlmqtxz|~ÿº¿ľuuuutssrrptz|wtstvz}}|ywtplgcabgmtz~~ztmgcdipy~tja]^eq~sh`^biqx}{ti]TQUcx|qkkmquxzzzzz{~Ȼ¿»tttsrqponmqw}|vpmlmqux{|{zxvtspnkihiknruvvrmgcadjt~~rf[UU]iwtjcbgnw~wi[OJN^t|ojjmqvzzyxuttv{~}~ÿ̿ý»ùvvvusqonlkotz{uqmmnqux{{{ywutrqponnmnnoppomifddhox~qdYRRZft~tkediqzzl]QKO^uzmhhlrw{|{xusrtx}}}{}ǺŽü{{{zwtrolimqw|}zwvuvxz|}}|zxvtssssssrpnljihhhikmrx~reZTTZer}{skffks|}qcXSWdxuidfkry}~{xutuy~~~żĸȾĺꁁ{xtpmhkoty}}zxvuvwxyxwrmhcaadinuzsh^XX]fq{yqkgglt}xmd`cn~od`cirz}{yy{~úúľۆ{vrmhimqv{|zxwxz|~}{tld]Z[ajuuld_^biqy~|vpjghmt}xroqywh^\`hr|¼Ǿʌ~ysnhilpty~|zy{}~vlaYTV_l|~wpiedglrx||ytojhinu}}~~pc[Y_hs~}}~{unigipzü{unijlosx~}{{|xl`VRT_o~xrmjikotx{{xtokjkov}xkaZZ_iu|{|xncZVW_ky½}wpkkmptx~}{{}ymaXSVar}xsomlnrvy{{yuqnlnrx~tjb]]clw~|}xmaXST[ft¼¼ʿ¿ĺytoopruz~|{zz|zoe]Y\fu~zvspnnquy}}yurpqu{zsmhefkr{{ria]^ckt~ûÿÿú|xsstvx||zxxxxyz}zrkebemy}zwtqpopsx}{wuuy~|yvtrqqruz|z{}{vrppqtx|úˏ{xxyz|~|wtsstuvwxz|}~}zuqnmou~|yvtrpooqu{|zz}~yussuxz}xsqrvz}{z{}½~~ƿö܎}}}~ztommnprtuwxyz{{zyxwwy}~yvsqpooprw~~~ysoorw}ypkikou{zussuy~Ͼ~zwtrpprx÷Ⱥ덍zupljjlnqstuvxyz{|}~}xtrpoooqty}vollqytkedfkryyplkmpu{ʴ|wrlfa^^dq¾¾ͼ󉉉{vqnllmnprsuvxz{}~yusqppqsv{|uolmr{}sjdcfkrzwlgfhkpv}Ʈûztog_XTTZgzǾÿͼ˿򄄄|xusqqppqrtvy||xvtttuvx|{vrpqv}|slgginu}tiedeintzëüxrld\UQQWexŻ³˿~}|||~~~~}yvsqpqsw{|zyxxyz{}{ywvw{}}{upmmpt{}pgcceintyӿȿ}vpjc\VRSYgyĺþ̾~|zyyy{}yyyz~}xsppsx~~}}}~~~~~~~}||}~~{yy|{xuttw{xmfccfjpuzͻǾ|uojd^ZWX_l}ø¹ü|x{ĸ|yxwxy{~ÿsssvz|uqptz~|zyyz~~{{}|ywvvy~}|{{{||sjecdglqv{ƷŻŽ|vpkgb_^`fqʿýwqtȾ{xwwx{}~}¸nnnqw}xsrv~{wutuy|z{~|zwussux}~|||}~~wohdceinsx|ǿ¶ľxsojgedflvɽ~źľwqsø|yxxz}{yz}̼ooory}vu{{wtstx}~|}~zxvtsrrtx}~|{z{|~{unhdcfjouz~Ǻytpmkjkpx·Ż}{|źży{ɾ~{z{}ʸwwwz|{}yvtux|~zvtsrqqsuy}|zzz{}{unhddglrx}ͿzvsqqtxƾþȼƼ~ȴ|yxxy|zurpooprtw|}{zyyz{~~{z{~}wpiffinu{Ź}zxxxz}Ŀüþ·żƱƽ~}|{{|}~zuqnmmnpsvz~|zzyz{}}vrqtx~yrkggkqx~~¾|yvttw}}{~źîžŴ{|~{yxxz~zuqnkklnptx|~{zzz|}xojimt||tmiimszxttyǺǾǾzsmijo|ÿļͿ~zy}÷˼~{{ȵyy~{xutuzzvrolkjlnquy}}{z{|~ukediq{wokknt|}tnmpwĴžȿ}sjdbgužƵ}zz~˻վ}{z~ÿij{{|wtrtx~|xtqommmnpruy}|zz|ukedir}yqllou|~tmkmszŻºwngdhu}|}~ʿżӼ~|ú|{{}}yutux}~xusrrrsssttvx|{z|wniinw{snmotzyqnpsx}ʺķȿysqt|{z{}Ľ˾žϸzvsrtw{~zxvwz~zurstwy{|{ywvwz{z~{tpqv~}uomorw}yvuvx{~ǽ}{z{}ƾƼ¿˵ʿ{upljilqv{}{z{}{uqprw|{wvw}~z{|yzvpnnqty~|{zzz{}ʹ}zz{Ǿľɾȱѽ~~ytnieccglrx|~}vqnnry}xtuz}z|xronprv{|yxwy|±¾|zzƾ»žƾѾů˳zw}~xw}|wrlgdabejpuz}ysnkmr{xttx}z}ztqopruy~}xutux|ɷ~{{þŽĽƿɻϸįֽ|vszywz|ssz|wrnjhgilquy{~}wqmklr{xttx~}{~|vtrrtvz~~wsqruy}ͻ}}ĽƼżпѸƲĭ|wsx~wtv~vw~~zwuttuvwy{~|wqmklrzxttx}}{~{xwxy{}}vqnoqtx{Ѿû;²ʸɴ}ytyxtu{{wuux||wrnlmqx}xuux|}|~~~~~}uollmorux|źĴȺǾοͼ~zwy~yttyztsuz}ytpnnquz~{xvwy|}}}xx{}tnjiijmorv|ĶŸ˹ʾĎ~{yz|~zutw{½|tqsx~zvsppqsvy{{{zyxxxz{}{urrw~}tmigggikmrw}Ǻ{yz{}°ŴĶˍ|zzzz{}zusux|Žuqsy{xusqqrstuuvwxyzz{{{||}~ztomns{zvv{}tmigffgilotzɾɾzvtsrrsux}ͼɶӾü~żҋ~{zxwvwwz~xsrsuy}xtv}}zwusrqqqqrsvxz|||{zyyz|}wqljkqy}vrrw}tnjihijlnquy}þĽ~yy~{vsqonnopsy̻ȷһ{yz¹؊|ywutrrrtx}ztpoquzƾ~{~|zxvtrponoruy|~|ywwx{}wpkhiow}vqqv~~vollmpruvxyz|}½ƿ{wv{|xtqonnopru{Ͽŷһzxwy~Ƽ݉}yvtrpnmmorv{~ysolmpv|½}{xvrpmmmqu{}yutv{yqkhhmt}}wssxwrpquy~}{zz{|~¾zvuyzvsqppqrux{ŵҼ{xwwzľᇇ~{wsqnlkiijlosvxwuqmjhjpw~|zyyy|}}~~{xtpmklpv}~ytrt{|tmhhkry~}~~yuvzyutw}{vutuwy|ƺ{wvx}~yvsqqsuy};ҿ}yxxy}Ĺż円|yuqmkigfffgjlnppnjgeehoy|vspnllmot{zvvy}~zuqmklpw~ysqt|vnjhkqw~~zxx{{xy}{wx}{uqpoprvzʼ|ywy|Ļļzwuttw{zy{Ƹľ³|yyz|³ʿ腅{vrnkhfedddefhjkkifdbcfnywokhedcdglryvrrvz}wrmklpwztrt}xpkjlqw}|wttw}}z{}z{}upnmmorv~̽~{yz|{~¶}zxxy}{vuvz̿¾öŷ|zz|Ŷöɻ넄~zuqmigedcccegiklljgcaaelw}tmiecaabdhmtzvrruzztollqx{vtwxrmlosy{vstw|~{|~|~xsponorv~˼}|{}~z|ĸ~~~wrqrv{¹λǻ}{|ƼνŸ~zuqmhfedddehkoqsspkfbacjs}|uokigedefimqvz}zvuwz~}wqnnrw~~{y{~xsppty~{wvvy~~||~}|ywvvw{ĸ~~}y|¸~wqnnorw~ʶʿʷƾ񄄄~zuqmgeeefgimrw|~}yrkeabgnv~|wtqonllklmnpsuwz~|{{|}~zuqqsw|}zwuuvz~|zyyz}~|{}Ļǽ{}¾ysoljjlnryȾȲļű¾􄄄~zuqmfffghknsz{qhbadiouz|}}|zyxxwvutsrrqqqsvz~}{{|}~||}~xustwz~}zxwvvwy|}zyyz|~~{{{}¹}Ƚzrlhggghjkou~ĺƯ~zuqmgggiknryvkdaadinrtwy{}~|{xurpnorw|~zvsstwz}}{{~|xvvwy{}|xurqpqsvy}~xuuwz~~{zz{|}~ïpfa`adfhijlqzí½ӽ~~~~zuqmiiikmpu}znea`adhknrw{}xsollpu{|vqnmoquy|~~{{~{yxxxy{}~xuromkklorw{}ursvz~|zyyzz{|}~þǯ}j`\\_dhjjjkow¼һ~|{||{wtpmllmnqu}{pgbaacfilpuzysnkknt{{uokikmqtxz|~}}}{zyxyz|xrolkjjkmpty~~vssvz~|{zzz{{|}ĿƮ}ja^_chmonmlouƿҼļѺ{zzz{~{yvsqpoopsz{pieccdgikosx}ysmjjnu}~wpkiikmqsvx{~}|{zz{}{smkjklnqsvy}{xwwy{}}|||}~þϿqiginswwuroos|ɷ¹ѹ~zyy{|~}{xtqnnot{yqkhgghikmpsvy|yrlijowzrljiikmoqtx|~}}}}~}unjhjmqvz|~~|zxwwwy|~~~}{vux|ztqqx̿ŽѸ}zz{|~ȿysnkkntz{vqmkkklmnoqrtvxz}yrlikqzvpljiijkmpuz}wpjggkqx|wspoqtx|}zxwvvvvwxy|~Ƽuqsyzsqt|Žҹ}{|}Ƶ~vojhjmquwxwusqpooopqqrrrrstvy}zsnkmt~zsnkigggimrx~|xrmhfhnvvojhjmrw{~zrnljjjklmnpsuy}ŵözmhjpzwqqt{º~|}ջ~ͻzrkhhhjlnoppqqrrrssssssrrrrtw{{vqorx}uplhfddfjov|~|zvqlihkr|vlfceiouy|~}ridaaabdegiloruy}˸ýοyhbdku{tqprv}¾xw{}{{}­wpljhgghhjlorsttttsrrrrrstux{~{xwy}vqlhdbacglsz}{xtpmmpxuleceiouz}xme`^^_`bdfhkoruy|ɶľŮ{ibcis~xspnoryĹ¼yrqv}{{}Ʊʶzuqlhdbbeimruvvusqppqsuvxz|~}vqlhca_`diov||ywwz~|zyyz|vmgfhlrx}}tleb``bcegilpsvy{~̴nggmuytolmr|żvpns{~~оĵ}}}{rib]\_elrwxwtqnmmptx|{vqlgc`^^afkqw{~~~~zwutstuy}}vplknrx~zupliggghikmpswz}ѻxposzzsnkmvſvpnryĻzzz|ylaYW[bjrxyxtokijnu{|yuqmhc_]]_chmqux|~|{zzzz{|}~yuqonmmorvz~{wsqruy}{||tpnmmnnnoopqsux{{y{yqlkrøxrpsxƺwwwy}oaWTW_iryzxsmhfgmu~|zxwuqmhc^\[]`eimpruxz|}}|||}|xvuuvvwxxz{~}upljhhhikosvyzzywvvx{}vrt{~qhcdfkosuwxxy{}Ʊunko{ʹ|vtux}ÿ~ʼƼtttvzqaURU^hry{xrkfcelvzwvuutqmhb^[Z\_cgjmoprsuvvvwxz~wsqpqrstuuvx{ypkgedddegjmqsuvwwxy|yqlnwzj_[]bjqx{}~ȸȶzpkmvızxxz}}~Ⱥòtttvz~qaURU^hry{xrkebeku~wtttutqmhb]ZZ[_cgjlnnopprssuvy~}tpnnoqrsssstw{ulfcaaabcehknqsuuvxy|vokmvxh]Y[bjsz~²ƶ}rllr}Ϳ}|}ļĻuuuw{pbXUX`jsyzwrkfcekt~~{vttuutrmgb]YY[`ejmoponmmopsux|yrnmmnpqqponoqu}|pf`]]^_acehlorstttuvy~|uomoxzka]_emu{ǺumkowͼǸǿؿvvvx|{oc\Y]cksxyvqlgdekrz|z|zvuuvvurmga\YY\ahnrtsqolklosx||vqnmnopqpnlihinvwj_YXY[_behknqtuusrqrtz|xtrrt|}qhegkqw|»xolmqxĸ̾¹~||׾xxxy}}ume`_bgmswxuqlhfgjpv|~zwvvx{~~{yxwwwwurmg`[XY]dlsxzxtpljkou{{wspnnoppqplhdbbfp|sdYSSUZ_dgknruwwvsommou~~xvtttuw{yroprvz}|{z{}}snllou~¾}{{|~Žztppuռyyy{~{xsokgeegkosuvtqmjhhknswyzyxusqpoonnnoqsuwyyyyywurmg`[XY^gpx~}xrmjkpv~{ywusqpppqqrqpkfa]\`jvo`UPPTZ`fjnquxyywsnjikrz|tnlmptx}{yxyz{}Ƽ}{xvuuwz~wqlihkr;·~zwvwzulggnŽҺzzz||vqmkjiiijknprttrpnljjlnpstutsqomkieb_^`diouy{{{zwurmf`[YZ`is|ztnkkpwzusrqqrrrrsttsqle_ZY]fs~m^TOPT[bhlptwy{{xsokikqyulfehmt{~}||}}{Ŀ~zwtrsux||unhddivԿûzvstx~ļtjden˻ϸyyyz}~vojgfghjlmnopqrrqpnmllmoprrrqpomkhd`\XWY^emuz}}|ywtplfa][]cku}|vplmqx~yusssstuuuvvvusng`\Z]fr}oaXTTX^djmptwyzzxuronotzyphcbfmt|}zyz|°}ĺ|ywvvwy|zrjdaepɵŻxttyxplmxɹʵuuuvy|yqjebcehknoopppppoooooopqrssrqomkhfb^ZWVX^fox~}yuqnjfb_^`fmv}}xsppsw|}{zzz{{{{{{{zywrlfa_bjt~tjb__adhkmprtvwxyyyyyz|}~yrkebbgmu|zvtsuy}ijļyogbclϼǾǾ}ww}ž~ͽ¯qqqrux{}{tlea_`dhloppponmmnopqrsstuuutrolifda]ZXX[bjt|}xrmjgecbceiov|~{xvuvwxz|}~|wrmihjox{uqnllllmmnopqsvz~~yurnjgedeiov|}yvtux||vplkmpty}~ŶüwmgejyǼļǿſ||ľƼƸmmmnqtwy|{vphb^]_chmpqqomkjjlnqsuvwxxxwvsplhec`^]\]agpy~voifeeefhjmrvz~~}{zxvtssuy}yvsqsv||xtqomlllmosz}rjecbcdfhlqv{~~{vplijnu|zqjecehlqux|~ƹÿ~|{zz{~ulhkuſȵµýiiijmpruxvrle_\[^chmqrqnkighjmquxyz{{{zxuplgdba``acgmv~umfdcegjlnqtwy{}{upljmt~~|{{}}vqnkihikq{|l_ZY[_dhkoswz|{vohb__enwwme_]^afkptx}~Ż»~zxvuvx}}smmrz¾þŭ̷úeeefilnqtsoic^[[^cinrsqnjfdehlqvy{}}}}|zvqlgdbbbcehlrz~tkebceimprtvwyz|~|umgdgp}}}{tpliggio{{gXRRV\cimqux{{yskbZVW]gs}~vkb[Z[_djosx}ļ½~|{|}{wtsstyzspqu{ѷȮȿľfffhjloqsrnic^[[^ciossqmhdbbfjpvz|}~~}|yvqlhdccdehknt{}tkecdgkpsuwxyz{||tkdbdn{{{xsokhgio|{fVOOSZahlpuy|}zsi^UOPWco{vlc][]bhouy~~|zzz|~zwttuyxttvy}þ׾īöĽmmmnpqsuvtpke`]]`ekpssplfa__chnty{|}|{zxuqmigffghkmpuz{tmhghknruwyz{|}~zrkebdmy|{}ytpljkq}{fWPOQW]cgmtz~}ui\QJJR^lyxogbaelt{}{z{{}~{yy|{z|ñѾȹľtttuvwxyzwsniebadhmqtspjd_\\`elrwyzzyxwuspnkjijklnpruy}~ytpmlmoruwy{}~~|wqkfdfmw}{vroos~{iZSQQTX\ahqzxj[NEEMZhv{smikqy}{{|}~Ǻ·ͽ{{{{{|||}{wsniffhkortsoib\YY]cipuwxxvutsqponmmmnpqrtuwxyzzywusrrstuwy{}|zwtokhginu}~yvvy~~yutv~{l`YURRSVZco{}m\LBBIVet~xtsv~{z{~½{vqmjikmqstrng`ZVVZ`gnsuvutsrqqpppppqrsstttttsssttuvwwxxxyz{~~zvsqnljjknsx|~|wrmklqxzxy|pf_ZURPQU`m|p]LA@GTds~~||¾~zz|ĽþȾ¯¾~ytolklnqstrme^XTTW^elqtuutsrrrrrrrssstttsrqonmnpruwz{{{zzz|~ytronllklmpsuvurniedflt|~|||~~{{}tle_YSPPT_n}s`NBAHUds½~yz}}}}~ſĽżıý¼~ysnkijmprsqkd\VRRV\dkqtvvvvuuuuttsssssrrqomkiijlpswz||{zzz|zvspnlkjjkmnpqpmjfcbeks{~|zyz{||xqkd^XTSWbpvcRGELXgvý~z{}zyxxy{~¿ſƿžŶɿĽ~wpjedehlopoibZTPPT[ckquxz|}}}|zxusrqponmljhfeefimquxzzyxxxz~{xtplifefhjlmmkigffhnu|}{yyyz|~{{|vqlfa^]`ivyhYONU`n|ÿǼ|||wutrrsv|ǽüĽŽǿƺ}tkc^\]afkmlg`YROOSZbjqv{|wspnkihfedbbabcfjnruwwvuuux|yrkfa_`bdgjkkkkkmotyzwvvwy{}|yz~|xtpmjjms}}ob[Z`kwǶzuromllnt}µȽ°{qf\VSUZafjie^WQNNSZbjrxyrmjfca_^]]]^_acgknqssrrrsuz~ukb\YY\`dhjmoqsux{~ztrrtwz~}ywx~}{yxyzvmghmwþxsokhffhlu³ǵöɾʵymaVOMOU]dhhd]VPLMRYbkszyqkfa^[XWWWYZ\^adhkmoooooqtywk_WTTX]bgkorvy}}uomnrw|zvuw|}wtuz~{ƿȲ~wqlhebbcgoz|yxy{ȳɴƿϿŵϽ¼һxk^SLIMT\diid]UOKLQYblu}zpic^ZVTSSTUXZ\_behklmnnoqtyxj^UQRV\bhlqvz~zrlkmrw}|wtsu{wswļ̵}unjfca`aelu|tonnptz˳vyȲüͼ͹­ȵÿƿvk_UNLPW`hmmh_VMIJPYdoyynga\XUSQQRTVXZ]`cgjlmopqsw|xj^URSW]djosx|yrmlosy{wsrtzxtxżɴ{slhecbbcgmu~zqkhilqw˳tw¬ľ̼ʷȵǾǿǮ~~~}vlcZUUZbltyxpdWLFGMXes~wmf`\YVTSRRSTUXZ^bfimprux{~wk`YVX]djptwz|~~}}|wsrtw||wtrsw}¸xpjgeefhknsx~þzphfhmt}Dzz{˵þƸϽƽȽεwwwwxxyyy{vohc`ahq{{kZLCCKXhxukd`][YXVUSSRSUX\aejnsx|}tkc^]`flsx{||||{{zyxwx{}{{|~~yurrtx}ǽǾ}tmgefimrvy{~ÿ}phfjr|ŵſ¼ɿƾȺսooooprstuwuromlowr]K??HXk}}ric`^]]\ZXUSRQSV[`fkqw~~{wqlgeeiov|~{xvtsrqqsw~{vsrrsuwy{}¶yqjeehnv}rjinyºÿĿȷƴggggikmoptttuux|w_J=4/3@Si}}tmklptx{{zyvsolf`ZUQQTY^dggd^YTRTZblu}ztnidbbcdfhjmpsuxyyyxwwvvvvutsqoljihijlmmlhc_ZWVWX[^bhpztg_^dp}~qe]YZ]bgmqv{~~zupnmorvy|}}|zyyz}{yz~øϻ·ùvvvwxz{|~~xpf]UPKGDCCFNXblrrne\TNMPV^dilmmljf`UG9.).:9?K[m}xsmf]UNIGGJNRVY[]_acefghjkmoqtvy{~~zvrokheb`^\[Z[]bipuyxtld]YY]ckry}sidbbdgjnt{}sjc`^_`cehmrw|·|tnjkqz}{{}žºûbbbekpv|uja\^fszmb[VROLJHGGGGHHIJKLLLIFBABHR`o~~zuog_WOJGGILOSVZ^cgjkkjihghjlnqtx}zupkfb^\YVUTUW^fnvzzumd\XX\dmu}pbYUW]fnuy}zsmifdddefimsx~Ĵ~unjls~}zz|~ӿ]]]`gmtz~vld`cn~~m_WRONMKIFDA?>>@BDGIJJIHIKQZeq}~zvpi`XQKHHIKNQTZ`flpqpmjfddegjmqv}}wqkfa\YVSQPQT[dmuz{vne]YY^enx~ueWNLQ\hu~~|yvroljihggikotzμvnklt}zz{~~}òȱ̾}[[[_elsywngeiuo`VQNMLKHD?;8668FLQTVX[^cipx{wsng`YSOLKKLNQU[ckswyvqkfcbdgkpty}wpic_[YWVVXZ_elrvwuqlhefimrw}|vrqrtx|vk`WRSZes}xuqmjgeefilortvxz|~¯~volnu|zz}yttyʺ̶ͿŽaaadinsx~~zusszƺ{i]UPMJF@90(! &0P`jqvy|~{uqnmptx|~~{wrmieb_[YWVTTTUW[bjs{}wpieeipw~~{yz||vqmklmprssqnkhhinv}~wqmnt|xqkgca``adhloqtwz{|zvpid``chouzysme]VPNPYes|uru}}|zurpqu{|yz~sidgrýÿĽ|y|jjjknqtwz|}ñsf]VPJD<0$ /CXhs{|unhddglrx{|yupjfc`^\[YXWVVVX\clu}xpieeipx~xsppsw}~yurqrtwyzyupjfdfmwzqlkpw}|rjd`^\\\^aehkmopqqpoje`[Z\bku~|vpjbYQLJMWfv~vrt}zqmnrxô~yvsrruy~~{z{~rjfjuɾÿǹ}yz}ƺkkkmpsvy|}Źoc\VQMHA7+ &8Mar}}wqkgginswzzwsmhda_^]\[[YXWWX\cmvxogbbfmu|~xqkhhkpw}~{xvuvxz{|zuoidbdlw}tnmpv}~{z}{nfa][YYY[_cgikkkjigfc`][[^fpz~xqkf^WPKJNYhyzuwwmihimrzǺ{xvttvy|}||~~vrpt~ʾ¿Ⱥ~zz{ʾkkkmqtx|qc[VSRPNJB91+).:K]o~~|zxyz{|{yupkfb_^^]^]][XVVWZbmxxmc][_emtxyuoic__chnty{|||{{z{{{{zwsmgbackvytrtx}~||ymf`\ZYXX[_cgjjifc`^]^^`bejqy}wqke`[UPMMR]l|}}zsokiikpyĸ~{xwvvxz|~~~~~~ɽĸ}}Ⱦkkkmrvzzl^TOMORUVURMHEEJTbq~ytnid`^]^^__^\YUTTXalxwj^VSV[bimmje_ZWWZ^dinruy|~}{xurnida`cjt|{{|~wmgb^[YXY\`eillhb\WUVZ`gov{ztnhc^ZWSQPRXcq~zunigirŻ|yxwwxyz{|~wv{ĽŻ¼|yz»kkknsx}}|{zyvph^SJDBEKSZ`cdcbbdiq|yrlgc_]]^_aa`]YTRQU_lyvgYOKLQW\``^ZUQOOQUY^chnu{ztplieb``cjs|~~vojea][ZZ]bhlonh`WPMOWcq~|vqke_ZVTSSTVZ`jv}|wledmý|zxwvvwx{~}phjvǾĿ|m`YZdu}}kkkntyzupjd^YSLD=869?JVakrvy|~Ǿyqjea^\\]`aba^YTPPT^kytdUIDDGLQTUSPMJHHJLPTY^gpzxqjgda``adjqz||~|vqmhd_\[[^djoqpi_TLHLWgy{tnic]WSPOPSW\bir|{rllr|qfbi~Ǿ|zwvuuvzrd]asǷɿýýr\J?@Nc{{wtstv{kkknu{wpg^TKC=83/-/4>L\kxɹwohc_\Z[]_bcb^YTQPT^kysbRF@?AEILLKIFDCDEGIMQXamywnfb`_^_aejrz{{~~{wtpkfa][[_ekpsqj_TKGLYk}vnhb\VQMKLOU\ckrzug__ixugah|ź|yvtsuym^X^sй·oU?23BZvztolkkmqyjjjnt{woeYMB:40-,-18EUgxĴtlfa]ZXY[^acb_[VSSW`lyrbSGA?ACFHHGECBABCDFJNU_lxvlea_^^_bflt|}|~{yvrmga\ZZ]cjpsrkbXPMQ]nzske_YSNJIKPXbkt{qbYYdtyjci{Ƚ{wtrtxpc]cyи¸w\F89H`}{rlheddgktiiilrw}yqfZMB:52126=>??=83-*(+2@BFLS[afgd_YSPPSY_dhhgd`[WSOJFB@??@ADGKRZbinqqolifc`]YVSPMJGFFIOW_hotwxz|~{ogb^[XVSOLHFFHNU^flprrrstxzhYOLPXbmw}|xtpke`\Z\clv~|{yxxz}ƽzwx}¼ȼ½;xlb`h|ҾȹLLLOV\cipvxyzz{~{jYLEBBEGIIGECA@ABDGJMQV\bgjjfa[URRU[agjjgb[UOKGC@=;:::;>AFNWajqtusqnjgd_[VROKGCAADKT^gpuy|~vib^\[[YWRMHDBCGMT[bglqvzzhWLJOYfs}|xsokgb]ZY\bjt}~|zzyyyz}¿ùxtuyȻƷrfah}ҿKKKNU[agmsuvvwx{wcPB;:=AFJKJHFDCDFHKNRUZ_dikkhb\WSSW\bhkjf_XQJFC@>=<;;;;=@EMV`iptvutqolhd`[WSOJFCCEKT^hpvz}qe^\[\]]ZVPJFCDGLSZaflrx~zhXMKR]ky}ytokgc_\ZZ\birz~}|{zyyz{~¼ĺxssw~ƹuhbh}ðнNNNPUZ_dhnqrrsux}v`L<548?EJLLKIGGGHJLNQUY_dhkkhc]XTTW\afhgb\TLGCBABBCCBBABDHNV_gnrtuuutrpmieb^ZUPLKMRYaiptx{~vj`[Z[^`a_[VPLIJMSZ`glqv{zi[RQXdr~zupkgda_]\]^bhntx|~~{yxy{}Ļxtsw~ĽʿȻwich|ųQQQRVY]`diklnoquy~x`J9116=EKMNMLKKKKKLMNQV\bgjjhc^YVUW[_cec^WPIDBCEHLNONLKJJLQW^dinqtwxyzywuspmid_[XX[_ejorux{}|sjb\YY\`ceeb]XTRTX^elrvy{}zl`YY`lz|xrmgca____`bdfilosx}zwwwy{~Ĺzuuyvici{ƷȹSSSTVY[]_bdfhkmquy}{bJ9115=ELNPPPPOONMKKKNSY_eijgc_ZWVWZ]_`_ZSLFBBEKQW[]\YVSRSUX\`dhmrw{~}ytojgffgilnpruwz{}}~~~}xsnic^ZXWZ^bgjjhea^]_dkrz~}~ynfabiu~}}}~}zupjd`^^_aceeeddefjqz{vttuvx{~~÷ú{ww{¼ľvidizǻVVVVWXXYZ[]`cfilpsw{fN<437?GMPRSSTTSQOMKJLQW^dhigd`[XWXY[\][VQKFCDIQZagihea]ZYYZ[]_chov|}xtqponnopqsuwyz{zz{|zpg_[WVUUVW[`ejnonliggjpx|yxz}xqkikr}~{z{|||ytnhb^\]`cfhhfc`^_clx|vsqqrtwz|{~´}yy~¿ż½ujfjzYYYXXWVVUUWZ]`dgjmpuzkTC:9@CGLRYajszpg`\ZZ\_cir}ztokhfeefhjloty|~}yrke`_aejnpojc[SNMORW\`begijjie^XTSW`n}wmd^\]`ekosvz~~wmcZUV]gs~|vrpnnnorwvpkgdbbchnu{~wmd]YYZ\^abdeghkmquy|~|ywvusrrrsvz~̽~||~½ʼurwƿaaa^YSNHC97779<@ELT\eo|~pe`]\^agnz~xsnkihhjlnrxylaYWZaiptsme\SMJJLORTVWYZ[ZYTNHEELYkteXOLNT\dkosvy{{ztme_\^gswpmkjkmqvwpjd`]]^dlt}{wuux|{pf^ZXXY[]_bfkortuuuuuuvwxxyxwvtsstvy|¾Ǹ~|{}zw{ź˿bbb_YRLF?854568FVkq_PFBEMV`hmpsuvvuqlfbadmzwokihilpvwpic^[Z[ajt}}vqmnrw~}qf^YVUVWZ]ahntxzyvspnnoruxzzyxvtstvx{~~~ȿ´}{{|ð~z}Ƚ¾ǺdddaZTNHB;8778:=AGMT\ep}sliiknt|ztoljiijmpu}p`USXamw~}wmaVNIGFGHIIHHHHHGEB??BKZno^PFCFNXbinpqqqpoliebbfoz~tlhghimqwvoic_\[\bjt|zsnjkou|~qe\WTSTUX[ahpv{|zvrmjjlptx{|{xusrrtwz~zy~ķɽ}|{|~ð}y}÷ºµeeec^YTOKCA@@ABDFHKOT\fs}xvvx|}wqmigfffhkpyrcZX^hutg[QLIHHHHHGFEEEFFGHKPXeu{nbWPNQX`hnqqpnkihfdbabekt}~vmgefgjosy~tnieb``aekrx|}{vqljjnsz}obXSPPQSWZ`hpw|}{wrmjjmqvz}}{xspnoquz|utyɾ~|{|~zuyƽżŹfffea^ZWSNMMMNNNMKJJLQ[hu}wsru~~xsmifcbaabdiq|tha`gr|naVPMKJJJIHFEDEHLQW^elt~~zunhc__bgmsvvtpkfb`_^^_`bfjosvvsniebbdglqv|yqlihgghhjmpsuutqnlklorw{{l^SNLLNRVZ`hpw|}|xsollosx}|vqlijnszwpot|ż~|{|~;ups|}|~ȾĽhhhgeb`^\[[\\\\ZUOIEDGP\ivzskecemx|wrmhda_\[ZZ\ais~vnijq}ug\UROONNLJHFFGKS]is|}xurqpoooooopqrsvy|}wph`ZWWXZ\^^______^]\\\_chntz}unkjkmoqqqponmmmmmmnoqsuwz}yiZNIGILQUZ`gov{}{xtqoorw{|unhdejr{~sljow½~|{|~ʻ}oknw|vsrstvy}¼iiiihggfehhijjhe]TJB>?GR_kuz}~|yriaZVW^hs|xtplgc_\YWUTTUYajt}~xsqs{|mb[WTSSRQNKIHJP[jzzupjeb_^^^_aejpw}{pe[SPPSVZ\[YUQMKJKMPTX]ciqw}xqljlotxzzwsnjgfgjmprtttttux~veUJDDFKPUZ`houz|{yvsqruy~|tleabhq|{ohfks~¾|{|~}~Ʒzlhks~xqligfginu}~|}ĽjjjkklmmnqrsttrmdXLA;;AKWblquwxxvslcYQMNS\fq{{wusqnkgb^YVTRPOOQU[dmu||zww{qf_[YXXXVSOLKMUcuxqjd^YVSRRSUY^gq}}pcWNJKOSXZYUNGA==?DJPV\dls{ztnkknsy~|vohdceiotwyxvtssuzraQFAAEJPW\bhouy|{ywtstw{}uleacir}xmedhpzý|{|~}yvvxõzlhjr|ÿwoic_]\^dlu}~zy{~½mmmnnopqruvxyywqh\OD=<@HS]ejnqssspi`VNJJOW`kt|~xsqonlhc^YTPNMMMNQUZbiqwz{{{z|rhb^]]^^\YTQOQYh{xphb\WTRQQRTX^gr~~pbULHIMRWZYTMF?;;>CJQX_gow~}xsommqw}yqjfehmsy}}{xutuy{l]ND@AEKRY^djqvz||yvtrsvz~wpjfhmvwldcgnwý|z{}zuqory~rnou}½yqic^ZY[`ir{qqqqqqqqqvwxyywrj_TKDBEJQY_cgkoqqoiaYQMMQX`iqx{wtqokgaZSMHGGILPTX]chnrvxz{}}ridccdffea\WUV]lvoid`\ZYXYZ]bjs}qbULHIMSY\\XRLGCDGKQX_elt|~{xusrsv{~wqnnqv|}zz{}zpdWKC@BGNU\bgnty|~|yurppsw||wsqrv|vlecfls{þzyz}yrljmuzz}wpic_]^ckt}½ľuuuutsrqptuvvvtqkc[TOMMOSVZ]bgloqple^XTTW\cjqv|{vrmg^ULE@?AFMTZ^beiloruy|ypjggilopoke_\\cq|wrnkigfffgjntzqcWMJKOU[_`^[WTRSVY^chmt{}{zyyyz|{z{~~|yvrldZPHBADJRZaflrw|}ytollosx}wmgefjou{ywx|xoifhq~yrlgefjqyƿzzzywusqoqqqrrqokgc^[YWVUUVY]ciorrpke`]]_chmquy}}vog]QF=77:7770+),3>JV`gmqtvxxwuronnortwyzxvtstxxvz~pcZVVY^cgiijjjjlnqtvxyyyxwvuuuuttsqnljkovwqpt{ì~zxwxz|~ĸѹ~̾Ŀĺļffffeeeddehmrvz|}}}}|zxurokifc`][XUQMKJLQW^eknrtvvuqj`VMFDGKRX\]]\ZXURNIC@?CMZht||wmaVMJLPUZ\\YTOJD?92,('+5CSbnw}}|||}yqib[TMF=4+%"$+5BNX`fkorttrokhffimrwzzxtpmmq|zpmqyufXOLOV_gnqsrrqqqsuwyzzyxvutstvwxyxuqnkjmt}|smms{ư~{yxxxz{}ķӸ~yz}¾¼ƿ____```aacglqvy|}}}}|zxvspmjhec`]ZVRNKJKOU[agjnqtutpi^SIB@BGMSXYYXVSQOLHDBBENYepwwrh]SKHIMQUXXVRNJFA<5/++/9FUcpx~}||||}~umf`ZUOH?6-&"#*3?JT\bgloqrplgcabflrx{|xrlhfkuvlimu~~paTKJNVakswxxvutuvxz{||zxvtssuwz|}}zupmkms|xnijq|Dz}{yxxxy|õԹù{{~ʽWWWWYZ[]^aejotxz||||{zxuromkihhfeb^YTPNNPSX\adhmpssph^SIB?BGNTYZYWTPNKIFDBCFMV_glmh`WOIGHKORUUUSQOMJFA<99=FR_kv~}}}xohc_[XSNF=4.**/6@IRX^dimopnjea_afmu{zrib_blztkhlrzznbVONS[fpw{|{ywvvwy{}~~|zwutuwz~~zuqnpu}}rhcen|ò|zxwxy|ʿѼ|yxy~úſNNNORTVX[^bglquwyz{{zywtpmkjklnoomic]XTRRSTWY\aglprpi_TJDBEKRY^^\XSNJHFDCCCEJPV[__\VPKGFGIMPSUVWWXXWURPNNRYcmw|z{xogb_^]\YUOH@:658=CJPU[`fjmnlhd`_agoy}rg]WXan}|rkilqw}~xne\WV[clu|~}zxvvxz|~~|ywvwy}zvstxxla\_k|ɽþ}zyxxz}¹̿~zvrpprwƾ½FFFGKNQTW[`dinqtvxyyyxurnkiilpuy{yuoha[XUSQQRTY`gmpoi`VMGFJQX_dd`ZSLGDCBBCCDGILOPQOLIGEFGILORTX[_bdffeedfiou}yx{zske_]\]_``^YTNHECDFIMPTY^chklkgc`_bis}rdWOOVbo|xqmkmquy{zvpid`aelsz~zwuuwz}~|zyz}{yy|tf[VZh|½¾~{yxxz~þ|xurolihilqyĻ¿>>>@DHLPTX]afjnqsuvwwvsokhfhls{yqib\WRNKJLQYbjnnibYQLKOV^eiid\TKEB@@ABCCCCCDDDDDDEEGHJLNQUZ_ekosuvwxz}wv{}||{zyxvusqnie`[XXY]`dfec_[WSRQPPQRTX]bgjkjgca`ckvrbSIGLVamuyywtqooprtvwvtqnkjkoty~~zvttwz~}|~~~paVQVf~½|yxy{Ǿyuqmjgecbdgmt}û5558=BGLQVZ_cgknprstutqlhedflt~wnf_YRKGDEKT]fklic[UPPT[bhlje]TKD@??ABBBA?=<<<=@BEGIJKLNPU[biqw|}uu{|xvtrpnkifda_\YVTSTW\afijjheb_^\ZXWWX[_cgjkjgdbbelwq`PEBELV_gknopqqrssttttsrqqqruy~}yustw{~o`TOVg¾|yxxz~Ϳ~xsnkheba`bejrzɽ2224:?DIOSX]aeiknpqrrqnjfbadjs}wnf_XPIC@AGOXagigc]XUUX]cgihc[SKEA@@AABA@><::;=AEHKMNNNNPTZbjqx}zssyzuqomkifc_\XVTRQPPPRV[afjklkjigfdca___adgikljgeccelu}n^PEABGMTZ_chmqtuvuutssrrrrsuw{}yustx}~pbWSYkø}ywvx|ǵ}yuqnjgdccfkqy˾3336:?DINQV[_dgjlmnnnmjfc`_bhpy{skc\UNGA>?CKS[acca_\ZZ\^acca^XRMHECBAA@@??>>?ADHMQTUUSQPQSY_gnty{}vqqwxpkhfedb_[WRNKJIJKMPRVZ^bfhjklmmnnnnnnnnnoonnligedfkry~~vk^RIECCEHLPW`iqwz{zxvtssrrrrsvy}|xtsuzuh_\ctɿ~yustxϽ~ytoljknszʾ½5557;@DHMNSY^bfhjjjjihfc`^]_dkry}|ysld]XQKE@>>AGMTY\^`aaaa`_^\ZXVTROMKHEB@?>?ACFHKOTX\^_]ZVSRSW\bhmpqrrrtvy}~wroot{ukc^]\]]\YUOIDA@AEHMPSVX[]`behkoqtw{~}yvspnkihggimpstrmf^WPLGB><=AJWer{}yvusrppoprvy|~}zvttw}{rjioĿþ~xronr{ƶxtrtw|ǽƽ6668<@DHKLQW\aeghgfedca_][[\`ekorqnic]WRMHC?==?CHMQUZ^cfhgd_ZTPNNOQRRQMHC?==@DINSW\aehjifa[VSRTX]adfedcbbdhnty~~|zxvtrommnqv{ypf\UQQRTVWTOIB<88;AGMRUVWWWY\`ejouz}xtqnlkihgggffdca_\XSKB81/3>Oas}zwtromklnqux{{zwustxü|ww}wojilu{{|¼¾ȼ8889=@DGJKPV[`dffeca`^][YXXY[_bfgfd`[VQMIEA>==>@CGKOV]ejnmg_VMGEFKPTWVRKD?;<@GOW^chlpstrng`YTRRTWZ[[YWTQQSX_gnsutqmjgffghjklnqsttqjaXOHFFIMPQPKD<6337>GNUWXVTSSV[ahow~|vsqomkhea^[XXY\^`_[PC5*%(6I_t|yuqmjhgilptwxwtrrsyøźƾvmgdgp~Ƽƹ999;>ACFIKPU[_cddc`^\[YWVUTUVX[]^][XTPMJFC?=;;<>@DHMT^gnrpi^RG?=@FNUYYTME>:;AJT]fkpuxzzxskc[TQPQSTUSPLIFEGMU^fkmlhc_\\^adhjllmlkie^ULD?<>BFJLKG@93017?HPWZYWTQQSX_gow~xurqomic]WRNNQW]bc_TD4' $2G_u}zupkgedfimpsutrpprxźȾŻvmfben{̾¾::::84226;AHOU\dlqtqh[M@747>FNSTPJD><=CLV`hmquwxxuph`XRNMNOPPOLHDBADJR\dknnljgeegikmnmkieb]XRJC<7557;>@A@?=<=?DKQX]__^\ZZ\_chnsy|xusqolgaYRKGFINUZ][SH=404ASfy~yuqmiecbdfjmoomjgfgnzȻ÷yqkhksƺ~»ż:::524:AGLMKGB?>@EMV^eimoqqpnib[TOLLLNPPPNKHFFIOW`hosuvvvvvuutsrolhd_ZUOHA;6434579;>ADGKNRVZ^acdddddefhjlnpsvy|~~}|zxvtrpnjf`YRLGFGJNQSSPLGDDHR_n{ytqmjgedcdfikllid`]^dqľ{uporzº~yz¿:::=CIOTZ_aa`__^^^]\ZWQJC<867:>BEGILNNNJC9/&"$-:HWbinqrrpkbVI=5126;@DEECA@@BGNU[adfhiigea\VPLJJLNPQRPOMLMPV]fnuz~zvqmhc^YSMGA<8531113761/038=ADHKNPPLD8," +;N_lsvvuqlg^SG<40026:=????@ADHNSX]_aaaa`^ZVQMJIJKNPRSSRQQSW\dlt{xrmgb\WRMHC?;851/./3FMU]djjgc_\[[\]]\WPF;2,*+/5;@CHLPRROF9-#!-?Sft{|zuohbYOD;40/1379;<=>@ADHMRVZ\]]]\[YWSOLJIJKNPRSTTTUW[ahpxxqke_ZUQMIFC@=940-.3>L[jtyzvrmklou{|vnf_XPG?857>IVajnonlheb^YUPLIEA>=?DN\jx~{wrmiecbbbcddfhijkic\UPOS_ptjc^YVTUY`kwúè˼Ǿxqtľypmr{:::>FNV^fmkhc^ZXY[\]\WPE:1*(*/53*&)5GZly~~zskd]TKA93//148:<<==>?BFKPUX[\]]]\ZXUQNLKKLMOPQRSTUX\cjrz~tmga\WSOMLJIGE@:5227AP`ny~}ysnkkpv}xof]UMC:4029DQ]fklljgda]XSNJHEB@@CIUeu|xtojgca````abdgjlmlha[WUZds}pf_YTQOPS\gtؿ~|ź̼ĺº{vzüulimv:::>FNU]emkga\WVWY[]\XPF;2,*-3:AGKORUWWUPH@:8;FTdr|}woe]VNE=61/049=AB@><:9;@FMSX\^`aaa`^[XURQONMMMNNOPSV[bjs{tkd_ZVSQOOQRTTRMGA<;?HTbox|{vpkhinu}ypf]VNF?978>FQZbfhhhfda\VOIFDCDFIOWcs{vqmifca_]]]]_bfkorsqmjggjs~}qga\XUSTW_it~ѽÿͽ}}ujhlt:::>EMU\dkie_YUSTWZ\\YRH>5/.29AIPTWYZZ[ZXURPPS[eoy~~zrh^UMF?83//39@FJJGA:4138@IQY^begijiheb^[XUQNKIIIJLOSX`is|zpg_YURPOOPSW\acb^XQKHJPYdmtvtpjfcejr{zpg_YSNJFEEHMSY^`bdeec`ZRJC??BGOW_iu{uplifca^[YXXZ_elsy|}~}}~umgca___bgow~ʻϾ~ywx|úȾvlilt~:::>ELT[cigb\VQPRUY\\ZSJA9448@IRZ]___^^_acegjmqv{~|uk`VLE>830./5>HPUTND9/)*09EPZ`fkoqssrolhd_ZTNIEDCDGJNT]gr|}xqi`XRNKJJKMPV^gnsspib[WVY_eknomid`^`foxyqha]ZXWVVUVVWXY[]_bcc`YOF=9;BLYfr|ztoligda]YUSRU[dnx{uqnmmnopsw{»ºxsprx˻ƻxnknu:::>ELSZafd_YSONPSW[\ZUMD=9:@HR[bffecaachnu|zqfZNE>83/-.08CNX^\TG8+##*5BP[cjpvy|}{yupke^VNFA?>?BFJQZfr|{tmg`YQKFCBBDGKPYdoyyrjeccegijjgc_[Z]ckt}~xphc``acefeb_[XVVX\_bc`XNC:69CRduyrnkigeb]WRNMQYcp|~|{{}~ýü}tmjlt¿Ҽø¾{qnqw:::=DKRY`da\VPLKMQUY[ZUOHB?@FOXahkjhebbelvwmaUI?830.-.2;GS]baWI8*!!(4BQ]fnu{~ztnh`VLD=::;>BHNXeq|{ria[TMFA=<;=?CHOZgt}vpmlkkkjhea]ZY[`hqx}~{unhdcdhloqpke^XTSUY^bcaYNC:6;GYnxqmjigea\UOKJNWcrþ¿ƽñ|qiegqýּ~tqsy===@GMSY_b_ZTNJIKNSVYXUPKGEFLS[cilkhdaaelw~vl_RF=620//15=HS\a_WI:-%%,8FT`hpw}~yslf]SIA;8799778:<>@CGIKKIEB??AHPZckpuz}}xph_XQJD>96457:?ELVcozxoe]WRMHEB?=;::=<>@CGKOTY`flqtwz{|zwpf\RJD?:753457;?ELVboyyph`[WSOKHEA=:88;AIS]elrw|xqjd^YVTTVX[]^^]]\\\\]]^_`abdegijkmosxukfdegijifc`\YWSOLKMR]l|~ørbZ[i}ĵ¿~YYYYZZ[[\XUQLHDCAAABDHMT[aefea]XUSQPPOOPPPPRTW^fntwuodYNEBACFIJID>82028ALV_ejmpstvwxyxupg]QG>8421123584-),5BQ`kruwwvuuuuuspjaVJ>60.--.036;@EKR[dnv|~|wqkea^\YVSOIB;52247=CJR\fr}}pbTI@=?EMTYZYUQMKLOTY^cefffgimt}s`OB>AHR\cec`[WTRPNMMPVap~oaXV[cnzſ½¶wdZ[iò¾½hhhgeca_^ZUPKGCA?>>?ADKT]ejjf_WOIFFFGIIIFC@>>BIT_ipqmf]UOLMORUURKA6.*-7FVfrxzyvspoooonkf]RG<4/,++-/28>EMTZahntwxvsnhda^\ZWTPJC<621247=CKUamz~p`PC969@IRYZYUQMJKMQV[_bcddfinwzhVE:6:CNX`cb_ZVSQOMLLOU`o~zj[RQV`lz¼¼yg]^lǵþqqqpmkhfc_ZSMHCA?>?@BFLS[beeaZRJDBBCEGHHEB><746@N]lvzyuoiecceggfc\SI@840-,,.2:DOYbglnpqqpnkgd`][YWUROIC=7421237414=GRY\[XTPNMNPRTWY[]`chnxwj[L@75:BMW^aa^[WTROMKJLQ]kzyj]TSYco}ſÿ{jacpȹý{{{yvsplif`XPIDA@@ACFIMRX\^^YSKD?=>@CFHHFC?=:7431125:9;>BFIIHEB??@EKQX]acefgghgfedb`]ZVSSU[dmtxwodWLDADJQX\][XTOKF@81-,2@Sgyti`\YXWVVTSQOMKIFC@=;8630/16?LYfqy}tgVE6-+0:GS\abba_\YTNHC@AELS\dmyraRID@>=>@DJQX\__^][XVQLGCCHR`p}}sjefluºtoq}ſ½¿¾~}}~yutk`ULEAADGKNOPPPOMKGB=9668536>GPWZ[[YWTPH>5.-3CZrueXRONOPPONLJIGFEDBA@>;63005=HUakqvy{}}~~~}{wobRB4+)/:GT^cfggeb^VLB:56;CNYdmyxbM>646:@EHLPUY\]^^]\ZXRLFA@DN[jwytqsyʼzwz»¼¿½}{{{|}{wmbVLEABEINQQPNLIFC@;74236;@EIKJHECBCEGJNRV\binrsrokgddegjmoprsttqk`QB5,*.6@JRVY[\\ZVNC80.5F_yuaRJGGHJLKJHFEDCDEFFFEB=9558?IU_hmopppopqssspj^O@3*)0;HU_ehjjhe`WJ=3,-3>KYenznV@0*+1:DLPSVXYZ[\]]\[YSMFB@CLWeq{}}ŵǼĿ~|{zzz{{|}}~~yuk`UKDABEJORRPMIEA>;7310149?EIJIGEBAACEHKOSY`flprplhdaadimruuutqnicXL?4,*-4=FMQUX[\[XPF;317Ib|r]MEBBDGIHGECBAACFJMNNLHDA@CIR[dknonljihiklmkeZM>2+*1CGIHEB@>?@CFIMQV\afijhd_[YZ_emswwtohb[UNF?95459>CHKORVXXVPG>75=?CIOUY[[ZXWWZ^ekquvurnjfeefffd_VJ>3-.4?LYbfhgea]WMA4*%(1@QaoxucP?405>JU^aa`]ZWVVWXXXWUROLLMPU[agnu~ʹĶ¿ÿ~~|zxwwy|~ytokfd]UMFA?ADIMOOLGB=8520.--.27=BFGFC?<;;>AEIMPTW[]__\XSPNPW`iqvuof[QIDBBBCCCCBBBCDGKORSSNG@<;AOauyfUG@>?BEGGD@=::=CKU^eknprtuwz~~ysmhdbba`]YQG=6129DP[cffc^YSMD9/(%)4EXjx|vl`SHA@ENYcjlje`ZVSSSSTTUUUVVWWVUTUY`kzŹzvvzǺſ~|}{wtux}vvvsojea\YSMGB?>@DHLMMID?9520.,,,.27FNTURMGA>=?BFJMMKGDAAFQ`o{{n_PE@>@BEGFC>:77;CN[hr{yqjea_\ZWRLE>968>IT^dfc^VOHB:2+&%+9Lat}unid^XTQSXajrwwrkcZTPONNOQRUY]acb]VOKKRbwȶ÷umijrɾ¼|{}|vssxkkkhd`[WRMIEB?==?CGJLKGB=730.-,,-/27<@CDA>96458=CIMNNMKIGEB>:88BEIJIFA<620.--./048<@BB@<74226<852015?M[flj^L8'(:Oanpi]N@51149>BDFHJLNQV\bfhgb[RJD@@@BCDC@;75661,)''+4DYoqbXUW\dkrw}seYOIFEEGINU`jswvl]NB>FZwʰžvh^Y]j}¿û½¹|{xsszUUUSPLIFB><:988:KXcig[I6%(;Qdqsl^N>3..15;?CFJMPSVY[^__]ZTNIDB@@?@@?<977:AN^p½xog`ZTOKHFDBBCEJQY_a`YPE;3.+))+09I]s}l\RPT]it}sdVLFBAACGLU`lv}|sdUIEMa~üжɾwj`\`m»Ľľ¼}|zuv|JJJIGECA?:876557;?DIKLIEA<9766789:;=?@A@=:6300269=?@@><:97642238@KW`ecYJ:,#$/@Sdoph[L=2--/49>BGLQVY[[[ZXVURPMJGDA>;987779==<;76432248>DJMNMJFC@?>?@ABBBBBA@?<963100135678899:::999;>EMV]`_XMA712:GUaiibVH:1--/49>BHOU[_`^[VRNLLLLLKIC=61..15FRbqp`RJKUdv|m\MB;879<96420/.---.0369<>?@ABDFJPUY[[WQKEBBGOW]a_YNC81..049>CJRZ`dea[SLGEFILOPME;1($%+4?LXdr|vqkgc_\YWUSQPONNMNOOPOMJEA<:9:DNZfr|ĿDz¿ι)))*,.024420-++.4;CKQTTSQONNOPRSSQOLHDA><:8642/,)&%'*/4:>BDFHJLMPRTUWWWUTSRRTVXYXUOG>61//25:>DKT]dhhcZPGA?AFLQSPG:-"&3CTco}wlggimqssqnkgdb`^\ZXWUTSRQONMLJIGEB@>>?ADHLQW^gpwzyqfYOJN[nrbQC82/027=CMXdp{¾˸˴þ|zyyz|ý #'*-121.+)),2:BJQTUUTRRRSUWXYWTPKFB@><;:861,'#!"&,3:@DGJMOQRRSRRSTVY\^__]ZWTPLF@:510136;?ELV_fkjdZND=;>DKQTPG9+%5GZjwucVPQU[afhhgfecba_^\[YXWUTRQNKIFDCA@??@CFKPV[`fmswyxpfZRNR`syk\M?5/-/27=DMXdp|ͽȰÿ~~zwuttuw{ú #'+/0/-*('*08@HNRSSRQQRTVY[[ZWSNIECBAA@?<71*%"#&,29?CGJMOQRRQQPPRV[`dfea\UNID?;7421248;@EMV^fjibYMC<9>?@DIPX_fkqv{~~wlbYVZfx|qdVI=40/04:AHQ\ht˾ƮĿſ}{}yurppprv|ƽ!$'+./.,)'').5=DJMNMLLLMPSWZ\\ZVRNKIIJJJIFA:2,('*.38=ADGIKMNONNNOQV\afhfaYPF?:742112358;?DKSZadd^VMD=:GQX]`dfhihfb^ZWUTTTTSQNKGDA?=<;;>BJT_isz}rjegq|pf[PE<6335:?FNWbn{žĮ¿~zvrommosyȿ !#%(*-.-+)'&(,29>CFFEDCCEINSX[]\ZWTSRSTVVVSME>61//148;=?ACEGHIJKLNQV\bfhf^TH=4/--./12469<<<<<;963238@JUajrzweQ?3.18AKTZ_ejmonje^XSPPPQRRPNKGDA?<9779?IWftyy~zmaXPHB<989><;::?ACFHKMQV\bfgcZNA4*&%'*-1357::520025:>CHNT[afkpuz|{uhXF6+(+3=HQX_gmsutog^UNKJKMOPOMKHEC@<8435==>AEJPW_iu·|yz~Ƴù}wqmjkpv~%%%%&'(*+,+*)''(*-14676421149@HPVZ\]^_`behlnolg_WOGB>;975444568:=AEJNRW]beeaWJ;.$ #(-258:8313;J]sƽugZMC=;:DJOSX^bed`VH9,"#)059FLQUXZ\_cipv{~}xriaYRKD=72/-++,.16=DKQV[`dfeaXK=1($%*06<@CGJMOPPONMLMORUVVRJ>3)$%-:IVaefd`\YXXZ[[YTK?3)""&/9DNV_hpvywpeYMD@?@BEHIJKMMMLHB=:;DSh~Ļ{rh\OC80-/3:AHOU\cks}ɹ|rifjwzmjmu|vssw~żɰuklyø¿{usv|xqllpv}Ľ///.,*(&$#$&(*,./123320-)'&',18?EILNQSW\clu|~xph`XPG?71,*(((+.4>?ACDHLPSVVSOKHIP^o~vmd\QE;2,*,29AJQZcluɾ|sjdbgu{okow|xvw{ȱþvkkwzx||tonqv}~~|}ƿ3332.+'$  #(,0246787630+(&')-27;?ABDFJPZeq|~wnf_UK@7/*'%$%(,3=GQY_cgikkie_XRNLLMORUX^djptutqmifdddddc_YQIB==@FLSWYXVSPNNORUWWTLB8/**/7AKSY]adffd`YRKEB?=<;JU^dhkmmnnmkigfedcbbcgmt|zvsqomlifa\WSOMLMNOOONLJIHILPTWXVPG>6115=GPWZ\]\[YXURNJGD@<866:BLWbkpqqpopsz|voic]XTOKFB<5/+()-3:CLVbp~}qjebabfn|vsv~Ŀµ}sr{|vtuy}{xx{{|~}yvv|ü<<<92,& '07;>@AAA?<72-)'&&'()****,08EUetxqi_RE9/)%"!"%*3?LYcimoopprtvxz{{yvrppsy|yuroljgec`]YTPLHFDCCCDFJOTXZYTLD<88=DLTY[[XUQNLKKKJIFB<6226?LZhsz~zrke_ZTPKGDA?=:840-**,0594/*(&$####"!"#(0=M_o{{uncVI<2,'$"#&+5AO\fmpqqqrtx}~zy{{vsqppqqokd\SKDA?>>@ADHMSXZZVPIC??CIPVZ[XTNIFDDFHJJHC<6104>L[jwwmbYRMHD@=:8654320.-,-04:AIR]kzȼ˻saXVY^fnw}z}ǶɾͿ½|z|yy|{vsru}}z{yurrwľAAA=5-%&/6;>@ABA@=83/+(%#"! !&-9HXgry}~~{wqh[NB82-)'').7CQ]hnqrrqruy~|{}|xustvyzyumcXNFA?>>@ACGLQUXXVRMHFFHLQUXWTPJEBABDGIJID>7215>KYgt|xl`WPJFCA>;975321100136;AHPYcp~ƽ}||Ǹq`XVY`gpx}{ȷ˾;}|}{{}|xtsv}}{}~ytqqvľ>>>:4-' $+258;<==<962-*'%#"! !!!#%)09DP[ekquxyxumcXMC=73/./2;FR^gmpqrrrtwz|}{yxz~|ywuux|wlaVMGDCBCDEGJNQSTSRPNMLMNOPQPMJGDBBCEGIJIE@;769@IT_iqyxlb\WTRPMJGC?<987789<@FLT\emwyttvy}}zwvw}tf_^`djqw|{ŷ²|{}{||yxy~~ytqqvý;;;83-(#"'+.03567642/,)'&$###$%'*-15;@GMSYahpuxxslcZRLF@;769?HS]eknpqqrrrqqpoooppqqrtvy{|||{zyxwvutttvzvk_VQMJIHHHHIJKLMOQRTTTROLIGFEEEEEEFGHHIHFCA?>@CGLRY`ir|wqmkjifb]VPJFCBBCEHLSZcksyzpigjov}ztpnrzypkjjlorw~{zƶĻ|zz~|{|~~ytqrx88862-)%!"$%(*,.///-+*(''&%%&(+/37:====>AFOZfpxzxtmg`[TMGB?@DLT\chknoppolhc^[[\_cfhihgecbbbdefhiklmoru{uja[WTQOMKIHFFFGKPUZ\[WPIB=;DKQVZ^bfkpx{sniea]YUPJEB@BIR\dig_SF:203:BJPRRPMJIILPTWXVNC8/+/9GYk|Ļvlfddfimqx}ske`\XUROLJHGINXer~vj_WSRSVZ^cjs}yustwy|~~|yvssv|ÿǸ¶þ~}xniikosx{~~z{{xvw~0000/.,+*)&#  "#%')+,-./149>DHJHA6+"",636BEFC=3)!!*8GVbilmmljigda^]]_behihe`[VQNLIHFEDDEEEDB>82-+-3?BFJMOPPPPQSVZ^``\RE7,(,8Kavƽymhhkqw|~~vmc\VPKGDCBDFJNSW]djorrmg_WQNLLLNQU\eow}~{vronoqsuwwurpnnqx{zz{~»ø~}~~|zz|....----,/.,)'%#!"%)-/135679;<>??<70)#!#+5AMV[^^^]\]^_abcehloqpmf[QG@>@EKPTSPKE?:730-,-19COZaeda]YWY]dkqvy{|{{zyxvtrpnjfc`^^aeimonjd]WQNLJIIIJLORUXZ]`bcb^TG:0,1@Umÿthceks{~{wsnga[UQMIFDCEIOV]beffedca^ZWSQOONOPRUY_djmoomkihiknruvwuqnlkou~|vsrtw|ÿ´Ļ}|||}~~~~~}}}}|||},,,,----.110/.,*'#!&+/2579:;;;;:8752.*'&(-4=<96410/.--./158<>??><<=AIR\emsx}}vfQ<)*>Thtul\I6)##%*18@LYgsz{ti\PGCDGLQV[`flrvz|}~~}|ywtrpoprtutph]RHBAFNW`gjkkigd`WLB;:BTmwg\Y_jwwj^TNLKKLLLKIHIKPYfr}yk\MC?@CIOSVWXYYYYWURPOPRTW[_bgmrvyyvqlgfipyúznihkpw~ʽľĿ~volllnqrsstttuwy|****+,./035789972+$#*06:<>@AA@>:620//13466666554310027ALYeov|weM5 $ABCDCCA>:75569;=>><952/.,***-3=JWdnuz~|saI1";XqwcL6&!$+5AKT_lwxhWG;657;@FKQX`gmrvz|zvvy~yk\OGEKT`ktvvsojea[TNKLSdyyqjghoztg_^ep|qaQE?>?BFIJKKKMPV`m{zgS@2.2;FQY]^^][YXVSQONPRW[`eimrvy{zvpidadjs~̼rkkou}þöŻɿſvpllnpsvvutsrrtx}////.-+*)+.38;=;6.&'09@DFFFEEEDDCBBCEGJKKIE>71,)('(*-3GQZaehiigc]QA2% -@UhuwoaQB88?KYgrx}|vj[K<2-/3:BHKNPRTWZ]aeinsz}tja\[`gpx~~{vpieba`abdhnv{voh`[XY_is}}{{~}rfZQLIHHIJKKLMNPSX^cgif]QC8107BNZbda[SMJLS\grz{ungb_aemvʸĽľµƼ»zwx{~}}~~88851-)$ !(08<<70' %/;FORROKHGIMT[bgjmnnmjdZM@3*&&(,16:@GNTXZ[[YWSOG>5-*,6DSajmh^SJEGQ_o}}umaRD7.,.5=FLOONLJJLORW\ahpz|wqlijmsy}wpidcdgkorssssrqqqqqpolg`ZURSX`iry~{skc\WSQONMLMMOPQRSTTTSQKD<746>IU`hicYNFBFRcv{umga^_ciqzĺĿķοȿ|zyz}{z|<<<93-'!#,5;<70(! (3@KTXWSNJILS]hqy}~|wocTD6+&&*/6;?CGKNPQPNKHEC@<9779?HQY_a_[VRRWbqxmcWJ>4-,08BKRTQMHC@@BFJPV]gr~~{ywvvwz~xphdcgmt{~}xpg_YWX[_bdc`ZUPNOSX_gnu}~ytpkgc_[WTQPPQRSSROLHEB@=;98:>GR^hnnfYLA=CTk{sle`]^aelu~ǹù¹п{yxyyzyyz}Żxspoopsw~~{}@@@<5-&)39;70)""*6BNW[ZWRNMQZer}~vhXG7,'(,29?BEGIKKKHEB><<<=?ACFHLORUWXWWY\cordYOD;4//4=GQWXTNF?;::889;>BHQ\gqvul]NB=DXsƾyqjc^\\^bhoxʾùüıvmihiknoqsvztkfddehlqx~||}~{}@@@<5-&(18960)$"$,6BMVZ[YVTUYbmy~ugWG8-().4;ADFHJJJJGC?<:;=BFKNPPONMMOQTX]cjvyh[QHA;756;DMV[\XQIB=<=@EJPW_is||zz}|riddkvraPD?@ELRWXVSOKIJKMPU[co}|xwwwxwuqmhd`^^_```]XQKEA?@BEINT]gr{~ufWKFM`{º}umf`[YY[^dkt~ɾ¿ĺʿǺ}md``adgjmqu{Ļwkb][[]`ejr|}zxvwz|xz<<<93-'!(/564/*&$'-5>GOTXZ[^afmw|ul`SE8/+,06EKRZaiou{~wof_UKA930148=ADHKORSTROLIHJPW_eig`UI?99?IUakquy{{ytk_RF>:?DO^n}zrkhghijjhfb_[ZYYZ[^ckxqfcgoz|hZVZcnz~}{{|++++,,--./.-+*))*,-/00.,))-6G\stkaUJ@832357:;;<<>@DJRZagjkjhggjqzvaJ6)'1ATeprk`QC7/("%3F[n||wstw{ufWI@=@HQ[chknprtvy{~slkq||ume^YUTUWXWTME=6127?HQY^acegjou|xl`WPKFCBBCGLSZbhpx|vpljkozûõzop|~}}{ytokhhmvzrke_ZUPIC=::>JYjy{qg`]]^aceda^ZWTSRRRUYao}l_\_fp{vcVRV_lx}{|..../011231/-+*)*+-/010-,,0:KawwkaVK@70,,.1489:;<>@ELT\djnonlklov{gQ>1/7FXhrsl`QC80*$ !)7J_r|vrrv|}paQC:7;BLV_dgikmoqtvy{umlr{~vnga^]^`aa]ULA9337?HQX]`bcehmszþui^UOJFDCBDGLQX^djqx~{vqmjikp{ſujlzų~|}{z{||zvrnkkox~tmga]XTOIB=99=HWgv~vkaZWWZ]`bb_\XTRQPOORV^m{h[WY_hr{sbVSWamy7777776656420-,+++,-./0125;DTh|{k^SJA81+(()+.13579<@FMV^gmqrqonnqwq_ODAGR_kssne[PGA;50./5AQcs}voklrzxpeXK@87;CMW_cefeeegilorv{vonrzztommnpqpkcWLB;:?GPYaeffeefjpx¹~tj`XRNKIGGHJMPUY^cjpv{}wsqpooqu{ÿƿsjl{˸|vtuwy{{xurppt{ypic_[WTPJE?<<@JWfs|~zrh^WUVY\`ba_[WSQPPPRUZbpyfXSTX`hpv~qd[Y^gr}AAA@?=<:9875310.-+*)*-05;BJTaq~m\ND<60,)&%%%'(+.26;@FNW`iossrponqw|pe][]biossqmid_[UOIEDGOZfqy|yrkeacku{pf^ULD=9:?HR\cfeb_[ZZ\_bgkqxvqpsx}sgZOGFKT^horqnjfegmt|º~vmd]XTRPONNNOPRTX\binsvwxxwwvtqomlnqtyŽsko~пvonpswzzyxwvvy~ule`]ZWUQMHDBBENYepxzvof^XVWZ]acc`\XTRRSUX\bjwxeVPORW]chnv~yogcchpzKKKJGDB?<:976542/+(&&*1;FQ\ep{p^L>5/,*)(&#!  "&,29@HPYbjpttspnnpu|}ywutssssuwy{{ytmf`[[^cinrqmf_YWZco}{l^RKE@=<EKRZbhlkf]SJC@?@CGKPXblu{~}yvtsrqqrtw|ypnt~ymebdhnu{zupligfeec`\WRMKJMQV[]]YSMHEEHLSZdo~ʮ||x|uhbadinsvy}{xvx}yofa^\[ZYXWVVVWY^cinrrpmhdbabdgijifb]ZY[_fnv~|k\SMHFDDEGJOTY_djqw~ǵccc`[VQLGB@>=<;94/+)*1>Pdv}scO;($)*'$$-6@IPX_flqssqnkjkmquz{uu}~wqlfa[UPLKNWcp{}q_J8*&(.7@IOU\bfhhd]UNHECAABEIQ[fpw{|zxusrqoooptzyw{znfbcfjpuz{wspljhhgfdb]XSOLKLORUWVRMGCACGMU^ivȬz~ÿ|¹qe`_bfkpsvz~zvrpqwynfa^]\\\[ZZYZ[]aflqtusplifefhjllkhc_[Z\ahqyrdZRLGDBBCGLRX^elt|̸ccca\XSOJFB?=:9753125CIOUZ^bfiklmligdcccegilpu|}~}ytplheb`_^`dgihdZM?3+*.7ALTXXWVTTV[bhmomdXK@:;CP_mw||yuqnmlllmot{}vniecbabcejou{}zvromnrw}|uokknsy~xsomkjhgfdca`^][YXVTRPMKIHHHIKNRW^fozȿ̾пÿ~tkd`^_bdghjlnpqqoljhhjqz|tmigeddcba_^^_bgov}}yvtssssrpke`\Z[`goxyndZQLKOU]fnty~˷ccca^[XURNG@:4225;BJR[er}~tiXC/ '06L]mx}}ytnkiijkmqu}~zwsokhd`][Z[^cinrsqnjfca_^]\]^aeilnnkf`[YY\`flquz~|uoifdddccb`^\ZYXYZ[[[XTNIDABEJQX`hpxͻ~įµ{tmhda__`abbcddeffedcceipyxqnkjihhfdb`_`cjs}|{zywurmga\Z[_emv~rf\UTXaku~dzcccb_]ZXURJB92/06@KVair{zpeTA- +5:768?HR[aa\RIA>DShw]F63;J\mz~}yrlgfghjmrw~zvsqqponkf`ZURQTY_dffb[UNIGGHJLNPRUWYZYWSOLJKMQV[`djpw{~~ztmfa^]]^__^\ZXVUUWZ^aa_YQH@<>DMWcnxŭwomrzԸ̿Ŵuojhfdb`__^^]]\[[[\\]^`choy{uqonmlkigda`adlw~{xuoic^\\`fmu}qe^\blxgdalautotest-3.0.4/alg/data/utmsmall_blinear.tiff0000644003401500001440000076630413614004466021534 0ustar rouaultusersII*f B S   J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f!@&`f&f:&Zfy&f4&Tfs&f.&Nfm&$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»kkklortwz|}}zwttwz}~zuqmmquz~~zuqmmquz~~zuqmlortwzzyxvutv}|unmquz~~zuqmlmnpqrroljgdeimquyyuqmiea]YTPLMT[bippke`ZUUZ`ekpssssssrqpnmllortwz{{{{{{yuqmieeimquy{{{{{{zyxvutssssssrqpnmljgda^[[\^_abdefhijkkkkkkjihfedeimquyzwtrolnsy~|{{{{{{zyxvutroljgdfkqv|}|zyxvutsssssstuvxyz|}}zwttuvxyz|}Ǿ{vv{»lllmpruxz|}~~|zwuux{~}yurnnrvz~}yuqllquy~~zvsonqsvx{{zywvuw}}vpnrv{~zvrnlmopqrromjhffimptwwtpmieb^[XTQRX^diopkfa\WW\afkprrrrrrqpnmljknqsvyzzzzzzxuqmiffimquy{{zzzyyxwvutssssstsrponljhec`]]_`bdfghijkmmmmmnnmkjhgefjnrvzzxurpmnty~{zzzz{{zyxvutromjhfglqv{~}|zywvussssttuuvwwxyz{}|yvtsuvwyz|}żzz~mmmnqtvy|}}}~~~}|zywvwz}~}zxuspqtwz}|wsokkpty}~{xusrtvxz|}|{zyxy}yrquy||wsomnopqsrpnljhhjmorttqnlifdb`^\Z[_cgkookhd`\\`dhkoqqppponmljighknqtwyyyyyywtqmjggjnrvy{zyxwvuutttssstttutsrponljhfcaacfhjlnnoppqqrrrssrpnljhimptx{|yvtqnpuz|ywxyyz{zyxvutrpnljhimptx|~}}||{zywutrrstvwyyxwwvuvxy{}|zwurrtuwyz|~nnnprux{}~}}|{zyyxxwwx{~~}{yxvutrsuxz}~zvrnjjosx}~|zxvvxy{|~~~}|{z{}~{usw{~}yupoopqrsrqonljjkmnoppnmkigfeedcccfhjlonlifdaadfilnoonnmmljigfefilosvxxxxxxvspnkhhkorvyzywutrqrrrsssttuuvvtsrponljigefhknpsttuuuuvvwwxxwurpmkkorvy}}{xurpqv{~zvuvwxyzzyxvutrqonljknpsvxzzzz{{zxvtsqqsuxz||zxvtrrtvxz||zwusqqstvxz|~Žpppqtwy|~|zxvvvvwwwy}|}}{~}zwuuuuutuwyz|~}yuqlhinsx}~}}|{zz{|}~~}}|||{{}}wvy}~zvrppqrrsrqponmllmmmmmlkjihhiijkkllmmnnnlkihffhiklnnmllkjihfecbcfjmquvvvvvvuspnkiilpsvyzxusqnnopqrsstuvvwwvtsrponmljijmpsvy{{zzzzz{||}~}zwtqnnqux{|ywtqrw{}xtrtvwyzzyxvutrqponmmoprsuvwxyz{zxvtropsvz}|yvronpruwyywusqoortvxz|~qqqrux{~~{xusrstvwx{}y{{y||wsrstuvwxyz{|}{wsokghmrw|~}}}~~~~|zwuru{zy|{wsqqrrrssrqqponmllkjiiiiiijlnprtusrqonmlllkkkklllmmlkjihfecb`_`dhlosuuuuuutrpnljjmpswzywtqnkjlmoqrttuvwxxwvtsrqpoonmnruy|~~{xtqqtwz}~{xursx|{vqprtvxzzyxvutsrqqpoopppqqrtuwyzzwusqnosw{zupkjmoqtvvusqpnnqsuxz|~rrrtwy|~zvsonpsuwy||wxxvz~zupnprtwyzz{{{|zvrnjfflqw|~||}~|wsnjlu}|{~}ytrrssssssrrrrqnljhfefghijlpsvz}~zwtqmlmnnopponnmlkjigfedba_^\]afjnrttttttsqpnmklnqtwzyvrnkgfikmprtuvwxzzxwvtsrrrrqqsw{{xtsvy||ywtty}ztonpruwzzyxvutssrrrrqqponmnqsuxzzwurpmnsx}{tnhfiknqstrqonlmpruwz|zzssstwz}~{wspoqtvx{~{vw~vty}ytnmpruxz||{{{{yuqmifflqw|~||}{vqlgiqz}|}zvttsrrqqrrsttsqnkifefghijlptx||xtplkmnoqrrqonljihgfedba`_^]^beimprsssssrqonljknqtwzyuqmiedgjmortuwxyzzywvussssttuwz}}yvuxz}}{yvw{~ysnloqtwyzyxwvvuuttttsrqonmnpsuxzzxuspnoty~{uohfiknqstsqponnqsvx{}~}ssstwz}}zwutvwy{|~zuw~|usx|zupnqtvy|}}|||{yurnjghmrw|~}~~~~|xtpmijqx}|}|zxvusqonnoqsuvvtqomjiiiiiiknruy||yurnkjlmoqrrpnljhffeedccbbaa`bdgjmpqrrrssrpnljhhlosvyyuqmieehjmpsuvwxy{zywutrrstvwyz|~}zwvxz|~}{z{~~ysnloqsvxyyyyyyyxwwvutsrqpopsuwz||zwuspqvz|wqljmoqtvwvutsrrtvxz|~ssstwz}}|zyz{|}~|yuv}zsrw{{vqprux{}~~}}|{yvrokhinsx}~~~}}}}}}}}}||{zzxvspnklqv{~|{||}}~~}}|{zyvspmjjmpsvyywurpnmlkjihiloruxxuroliiklnprromjhedddcccccddddegikmopqqrrsromjhefjnquyyuqmieehknquwwxyz{zxvtsqqsuxz|}~~~~~|zxwyz|~~~~ysnlnpruwxyz{|}}|zyxwvuttsrsuwy{~~{ywustw{}ytonpruwyzyxwwvvxy{|~¿½ssstwz}~~{xuv|xrqv{{wrqtwy|~}|{yvsplijosx}~}|{zzzzzzzyxwwvusrpomnqtw{~~~}|{{zzzyyyzz{|}{wsokffkosw{|zxvtrpnmkighjmorttromjhgjlnprrolifcabbbcccdefghijklmnoppqrsrolifcchlpuyyuqmieehlorvxxyzz{zxvtropsvz}~|{yz|}~|zyxy{|}~~ysnlnprtuwy{}}|zxwwvvuuuwy{}}{ywuvy|~zwsrtvxz|}||{zzz{|}ssstwz}~{ywtv{}vppuz|xsrux{~~}|yvspmjkpty}}|zxwwwwwwwvutsrqqpppopqrtuwxxyyz{zyxvuttvx{}}xsmhcchmsx}}{yxvtqnliffhjlnppnljhffikmprqnjgc`__`abcdegijlmmmmmmnopqrsqnjgc`aejotyyuqmieeilpswyyzzz{zwusqnosw{~{xuuwz}~}|{zyz{{|}~~ysnlnoqstvy|~|zyxxxwwxz{}}{zxx{}|yvvxy{}~~~ssstwz}~|{ywvtuz~ztonty}yttwy|~}|zwtqnllquy~}{xvtttttttsqponmnopqqqqqppoprtvxzzxusqoosvz}yslf__flsy}{zwtpmiedfhikllkihfdehjmorqmiea]\]_`abdfikmppponmllnopqrqmiea]^cinsxyuqmieeimqtxzz{{{{zwurpmnsx}~yuppsw{~~}|||{{{z{{{{|}~ysnlmoprsvy}~|zzzzzzz|~~|z{|~~|zz{}~}½½vvvwy|~~}{zyxwvuvz~~ytooty~}yvuwz|~}|zwtrolmquy}}zwtrssssssrqponnopqrssrqponnprtvxxvsqolmqux|xrke__elry}|zvrnjfegiklnnlkigefhjmorqmifb^]^_abcegjmorrqonmkkmnpqsrmie`\]bglrwxtplieeilptxzzzzzzywtromnsy~zuposvz}~}||{{{zzzzzz{{|~ytomnopqruy}~||||||}~~}}~~~~}|þȼ{{{|}~}{zyyxxxwy|zvqqux||yvvxy{}~}|{zwtrolmptw{~~{wsqrrrssssssssssssssssrrrqrrsstutsqonlmpsvy|{vqkfaaglrw}~~}{xtpmihknpsvvspnkhhjlnprqnkhebaabcdefhkmorrqomljjlnprtsnjea\\afkpuurokheehkoruwxxxyyxvtrpnotx}|xutvxy{}~~~}}}}|{zyxwxyyz{|~}yuqopqqrsux{~~~~}}}¿~}{zxxxyyyz{~{wtsvx{~}{ywwxyz{|}|||{{zwtrollorux{~{vrpqqrrsstuvwxxwvutsstttuuuttsrqqponmlloqtvxxsokgcchmqv{}}~~~}yvrokkosvz~~zvsokjlnoqrromjhfeeefffgilnprrpnlkiiknpsutokfa\\aeinrspmjgddgjmpsuuvvwwwutrqoptx|~|zyyyyyzz{|}}~~|zywuuvwxyz|}}zvsrrrrsstwy|~~{z{|}}~þŹ~}{zxwwxyz{|~|yvuwxz{}}|{zyxxxyyyzzzz{{{zwtrolloqtvy|{vqoppqrstvxz{}}{zxvttuvwxyyvtrpnmmlllklnoqsutqnkhefimqux{|}~{xuqnosx||xsomnopqrrpomkiihhhhhijlnprrpnljghknpsvupkfa\\`dhlppnligddgilnprsttuvvutrqpqtwz}~|{yxvvxz|~}zxusrtvwyz|}~|zxuttttsstvwy{}~{wvxz|~ſɽz{~~~}}{zxwvvxy{}}{xwxxxyyyyyyyyyyxxxwxxyyz{zwtrollnprtvy}|vpnopqrstwz}}zwttvwy{}|yurnkijjjkklmnopqpomkihhknpsvxz|}}zwtqrw}}wropqqrsrqponmllkkjijkmoprrpmkifgjmqtwvqlgb]\_cfjmnljhfddfhjlnpqrstuutssrqruwy|~|yvssux{~}zwtqprtvxz{|}}~}|zyxwvuutstuvwxyz}~ytsux{~~rgiz~}||||||{zxwvtuwz|~|{yyxwvuvvwxyzzyxwvuuvwxyzzwtrollmoprtw||uolnopqruy||yutwy|~{vqlgfghijkklllmmmllkjjjlnprtvx{}|yvsu{{urrrrsssrrrqqponmlkklnoqrromjhefimquxxrmgb]\_behkljhgeddeghjlmnoqrstssssrsuwxz|}~ytoosvz~~zvrnnpruwz{{||||||||||||{{zzyxwvutstttuuwz~~~}vposvz~½ĹrcTWl~}|||||||zyxvuvx{~~|{zywvuttuvxyz{zyxwvvwxyz{zxvtsqpqqrssv{|unlmnoqrty}|xwz|~|vqlgefghijjkkkkkkkkkkjkmnpqsuwy|~~{ywtv|{urrrrrrrsssssrqonljjlnoqrrolifddhlpswwrmhc^]`begjjihgfeefghijlmnopqrssttuuvwwxy{~ytnnrvz~~zvrnmpruwyzzzzzzz{{{{{{{{{||{zyxwvuuttttvy}|vpnrvz~þzk[LPg}ü~}~~~}|{yxxz}~}|{zyxwvustuvxyz{{{{{{{{{{{{{{zzzzyxxwvuw|ztnlmnopqsw{~~~{wrnigghhiiijjjkkkkjjjijlnprtvwxyz{{zxwutv{}xropppqqqrrrssrpnljhhjlnprqnkhebbfimpsspliebaceghjkjjjiiiijjjkklmmnoprsuwxyxwwvuw{zuposwz~{xtqpqsuwxyyyyyyyzzz{{{|||}}}||{zzyxwwvuwz}}wrqtwz}þ¼vi]PUj}|{{}~~||{zyxwwvutstuvxyz{|}~~}|{|}~~|zwx|ytnklmnoorvz~~{wsoliiihhhhiijjkkjjiihiknpsuvvvvvvvuuttsuy}~ytommnnoopqqrrsromjheehjmorqnkgdaadgjmppnljheefghijkklllmmlllkkkkllllnqsvy||zxvtrsx|{vqptw{|yvsrstuvwxxxxxxxyyzz{{|}}~~~~~~~}|zyxwxz|}ytsuxz}{qh^UZnĿ~~~}{zyyxwwvvuttstuvxyz|~~||}yy|}xsnkllmnnpuy}}zwtqnlkjihgghhijkkjihhghknpsvwvutrqqqrrrstwz}}yupljkllmnoppqrsrolifccfilorqnjgc`_bdgilmlkjjiiijjjkklmnopponmlkkkjjjjlptx||yvropuz{wrqux|}{xvtuuuvvvvvvvvwxxyz{{|}~}|zxyz|~~~zvuwyz|~ʽ{tmf`Y^q½}zxwwvvvuuutttstuvxyz||}{z}|wrmklllmmosw||zwuspnlkihffghijkjjihgfgjmqtwxvsqollmnpqrtvwy{|{xtpmihijklmnopqrsqnjgc``cgjnqqmjfb^]_bdfhijkkllmlllkklmoqrttrqomlkjiihgjoty~zupklrx}|xssvy||zxwvvvvuuuuuuuvwxyz{|}~~|zz{|}~|zz}~{xxyz{|}~̻~~yqmiea]ct~{xvttttttttsssstuvxyz}}~}{}zvrmkkkkllnrvz~~{yxvtspnligedfghijjihgfdfimquxyurnkggikmprsttuvvurolifefgijklnopqrqmiea]]aeimqqmiea]\]_abdfhjlnpponmlklnqsuxxusqnljihgfegntz{tnhhou|}yttwz}~|{yxwvuttttttttvwxyz|}~~|{{{|||~~|yvvy|}{zz{{{||~͹}suvxy{~phfedbahx¼}{ywvuuutttssssrsuvxy{~~}z|}}yurnllllmmoswz~}yxwvutroljgddefghiihgfedfimquyyuqmiedgjlorssssstroljgdcdfghjklmopqplhd`]]`dhlpplieb^]^`abcegjmorrqpnmlloqtvxyvtrpmlkjhgfiou||uoiiouz~{xxz|~~}{zywvutssttttuvxyz|}~}|}}}}}~}zwttwz}~~~ͺ~uwxz{}zkdfghikr~}||{zyxwvutssrqrtvxz|~~yvxz|}yvromnoopqsvy|{wvuutsroljgdcdeeffgfffeegjnrvyyuqmiedgjlorsstttuspmifbacdfghjklmnomjgda^^adgjmnljhecbccddefhkmorrqpnmllnprtvvutrqponmmllnsx}}xsnmquz~~~~|zyxwvusstuuvwxy{|}}zwttwz}̽vkgknrvz~}~~|{ywvutrqpqsvx{}}uruwz||yvspopqrtuwy{~yttttssroljgdcccddddeeeffhkorvyyuqmiedgjlorsttuuvtqmiea`acdfghijjklkifda__adfiklkjjihhggggfgilnprrqpnmllmoprtttssrrrqqqqqsw{{wsrtvy{}}{ywwvutstuvwxy{|}~}}~}zwttwz}¿{skipv||{}~{ywutrqopsvy|zqnqtwz}}{xvsqprtuwyz|~xrrrrssroljgdccbbbabcdefgilpsvyyuqmiedgjlorstuvvwvqmid`^`acdfgghhiiigedb``bdegijkkllmmlkjihijlnprrqpnmllmnopqrrsstttuuuvvx{}}{xvwwxxyz}~|zwvvuttstuwyz|~}|zz|~~{yvstwz}}zwttwz}ýzuojlu~}yy|~{xvtrpnorvy}~}||}~vmknqux||zxvtrrtvx{}~vopqqrsroljgdcba`___acefhjmpswzyuqmiedgjlorttuvwxwrmhc_]^`acdefffggfedcbaabcdefhjlnprrpomkjjkmoprrqpnmlklmmnopqrtuvwxyz{{}~~}{zxwutv{~{yvuutttstvxz}}zwuux|}zvrnjkoty}}zwttwz}½}wtrpnljoz|ww||ywtromnruy}~{ywwy{~|sjgknrvz{yxvustvy{~²tmnopqrroljgdba`_]\]_bdgilnqtwzyuqmiedgjlortuvwxzxrmhc][]^`acddddddddcccbbcccddfimpswwurpnkklnoqrrqpnmlkkllllmprtvyz|}~|yvsoqx}zxuttsssstwy|~{wsppuz~zupkfabhnu{}zwttwz}žƼzqgdefghjq|ww{}zxuspnnrvy}}{xvvy{~zqheimqvz{zxwvtuxz}¿slmopqrroljgdba`_]\]`cfilnprtwyxuqnjgfhjloqrtuvxywrmhc^\]_`abccddddddddccccccccehlosvwurpnkkmnoqrrqonljjjjkkkmpsux{}~~zvsoqx}zxuttuuuvwy|~{wsppuz|wqlgabhou{~|yvvy|ǾĻtjfhjmoqy~yy{~~|zwusppsvy|~~}|{zz|~xpgejnrw{}{zxwvvy{~smnopqsroljgdcba`__`cfilprstuvwvtqoljijkmnopqrtuvuqmid`__`abccdeefggfeedcccccccdgjloqrpomkjjlmoqrrpnljhghijklorux{~~{xust{|zxvvwxyz{|}~{xuuy~~yupkkpuz|zz}û½~z{}~|{{|}~~{ywusstvxz|}}}}}}~~wogejosx|~}{zxwwz|~~soopqrsroljgdccbbbacfjmptuuuuuttsqponmmmmmlmnpqrtsplifcabbbccdefghiihgfedccccccdfgiklmlkjihiklnprromjheeghjlmpswz}~}~~|zxvx}~|zywwy{|~|zz~}yttw{~~||{zyxxz{}~}{ywuuvwxyz{|}~|ungejoty~~}{zxy{}{sppqrrsroljgdcccdddfimqtxyxvutrrrqqqqponmljjlmnpqqnljgedddcccdeghjlljhgedcccccccdefgghggggfgjlnprrolifcbegjlnquy|}{|~}}|{z|~}|{yxy{~~~~}¼~|yvsqqtwz}}{zxwwwwwwx{}zsmffkpuz~}{zz|~~ytqqrrrsroljgdcdeeffilptx|}zxusppqrrsttqomkhhijlmnnmljigffeedcdfhjlnnljhfdccccccccccbbbccddefikmprqnjgc``cfiloswz~~{yy}}}}~~~}|{{zy{~~|z{}ƿû¾|wsniinsx|~|zyxwwvuvz}}wrlffkpv{~}{{}~~{yvtrrssssroljgddefghilptx|}yurnmprtvxwtpmjfefhijlllkkjjihgfeddgilnppnligdccccccba`_^]]^`abcehjmorqmiea]]aeimptx|~zvw|~|}~}|{{{{z|~{yvw{~Ļ~|wrniinrw|~|zyxwvutuy}{vqlgglpuz~}||}~}xwvutsrsssstrpmjhedefhijlquy~~yuqllnpsuxwtpmifefgghijjkkllljihfeehjmoqqoljhedddddddca`_^^_`abcehkmpsrnjfb^^bfimquy~{wx}~|~~||||||~|yvvz~¿ƽ~}yvroorvy}}{zxwvuutsuy}~~|xtpmiilpswz||{{{{{{{{||zutssrqqrsstutqnlifefgghikpty}}ytpkjlnprttromjhgggggggijlmnnmljihhikmoppomkihgggggggfffeeeeeeeegjmpsvuqnjfbbehknquz~~{{~~|yy|ÿ¹}{ywuuwy{}}{ywuttttssux|~}||{zzxvspnkkmoqsuwwxyz{{zyxww{vqqpppppqrtuvurpmjhfgggghjosx}}xsojhjlmopponmkjihgfedegjlnqqpnmljjklmnoonmlkjjjjjjjjjjkkkkjihhghkoruxxuqmjffhjmoruz|{~ĿȾľ~~}}|{{|}}~~~{ywusrrrrssux{}{zyxwwvusrpommmnopprsuwxzzxwusrv~smmnnnnoqrtuwvtqnlihggggfinsx}}xsnighijklmmmmllkjhfdbcfilpstrqpnmlmmmnnnnmmmlllllllmnopqrrpnljiimqtx{{xtqnjikmopruz~Ŀſ{{~~~~|zwuspopqqrsux{~}{xwvutsrqqpppoonmmllmortwzzwtromq}|oijkklmnprtvxxurpmjihggfehmrw||wrmhefgghijklmmnnkheb``dimquvutrqponnnnmmnnnnoooooooprsuwyxuspmjkorvz~~{xuqnmnopqrv{~~~}}Ľ|zúſ}xx}~}}zxuspnmnopqrtwz}~{xvtsqponmnopqqqomkighkorvyyvrokhlyylfghijkmortwyyvtqnljihfedflqw||wqlfddddeefhjlnqplhea]^chmrwyxvutrqponmllmnopqrrrrrrsuxz}{wtpllptx}~{xurqqrrrsv{~|}{xx}ɾxonv~||{vv{~}}{xvsqnnopqrsuxz}}{xvtrpomkkmnoqrroljgdeimquyyvrokhlxwkefghijloruxzzwtroljihgfeglpuzytnidabccdefhkmorqmid`\]bgmrxzxwvtsrqpnmllmnpqrrssssstwy|}zvsoosvz}~|zwuttttttv{}{|~}xy~ɾ|tsyƸ~{{zuuz~~~|zxvtrrrsstuvxz|}|zxvtqomjjlmoqrroljgdeimquyzwtrompzvlghiijkmpsvy||xuqnkiihhggilpswzytoje_^`bdfhjkmoprqmid`\]bglqvxwvtsrqpoonmmnoopqqrrrsstvxz}}{xvttvxy{}}|zywvuuuuuuw{~|zz}ĿĻź|yy}~zuuy|~|{yxvuvvvvvwyz|~~}|{yuroliiklnprroljgdeimquyzxwusrt{~vnjjjjkkmpswz}}yuqmjhhhiiikmoqsutoje`[Z^adhkmnopqrqmid`\\afkpuwvtsrppoooonnooooppqqrrstuwyz|}|{zzyyyyyyzyyxxwwvvvvvvx{~||}~|yy{}¿ûÿ}zxx{}yuux{~~~~~}|{zyyyxxxxy{|}~~~~}}{wtplhgjlnprroljgdeimquy{zyxwwx|{uollllkkmptw{~~zuqmhghijklmmnoppnje`\WW\`ejoqqrrrsqmid`\\afkotvtsrponooooppoooonoppqrstuvwxyz{|}}~~|{yxvvvvwwwxxxxxxy{}~{xvuxz|~{xwy{}wxǻ~|zxvwz}|xutwy{~~}{zz{}~~}}|{zyyz{{|}}~~~yuplgfikmprroljgdeimquy{{{{|||~~{xtqonmmlkmqtx|{vqlgfhiklnonmmllie`\WSSY`flrutttssqmid`\\aejnstsrponmnoopqqpoonmnopqrsstuuvwxz||yvsrstvwxyyyyyyz{|~|yvroorux{~~zwvxy{}~ɷnmij~z}}}|{yxvtux{~~{xutvwy{|~}{yvvy{}}|{z{{{{||}{vqkfehjmorroljgdeimquy|}~~|{yxwvusrqponmlmquy}{vqlfegjlnpqomkigd_[WSNPW_fnuxwvutsqmid`\\`eimrsrponllmnpqrrqpnmllnopqrssttttvz}~ytonpsuwyzzzzzz{{{||}{wtplhhlpsw{~~zvtvwyz|~~~Ʈ}dcxͷtoz||||{yxwvvxz|~~|zxvuvwwxyz{}|zwuuwz|~~|{zzzzzz{|}{vqlgfhkmprspnlighkorvy|}~~|zwutttttttsqponosw{}xsmhgikmoqqoljheb^[WSOQX`gowzxwutrpliea^^bfjnrtrpomllnoqsttsrponnnopqrrsssssuy}}xsnloruxz|||||||{{{{zyurokhhlorvy|zvuvwyz{~~~жgdxտzt~~}|{zyzz{{||{{zzyyxwwvuvxy{}}{yxvvwyz|}~|zxwxxxyyyz{|}}|xtpmihjmoqttsqonlmortwz{||}}~}|zywvuvvvwwwvutsrsvz}{vrmlmnopqpomkiheb^[WTU\biovxwusrpnkifdabfjnquvtrpnlloqsvxywvusrqqqqqqqrrrssux{~{vrmmpsvy|}}}}}}}|{{zyxvtrpnnqsuxz}}yxyz{|}սup~ɶ~}|zyxwwxyz|}|zxvtrrtvxz||{zyxwwwxxyyz|~}{xvuuvvwwxxxyyyxvspnkkmoqsuvutsrqrsuwxz{{zzzzyyxxwwwwxyyzzyxwwvwz}~zvsqppppponmlkjheb_\YZ`ejpuwusqomljihfefjmquxyvtqolmpsvy|}{zywvutsrqppqqrrstwy|~|xtqmmpswz}~}|{yxwwvvutuvwxyz}|z{|}~~Į|ĵ}{xurrux{}|yvronpruwyzyyyxxwwwvvvwy{~|yvsrsttuvvvvvvuusrpommoqsuwxwwwwvwwxyz{{zyxwvvvvwwwxyz{||}||{zz{}~{xvtsrponnmmmlkifda__dhlptusqomkjiiiiijnqtx{{xurolmqtx|~}|zywusqooppqrstvwy{}|yvspmmptw{~~|zywwwxyz{{{{{{{}}~~˸ƻ{vrmmrv{zupkjmoqtvwxxxyyxwvtsrsvy|{xtqpqrstuutssrrqqpppopqsuvxyzz{{|||{{{{zywutrrstvwxz{|}~~~}{xvsqnmnnnnonljhfddgjmpstromkhghijklnqux{~~{wtpmmrv{~|zwtqnnopqrstuvwxyxvsqolmqtx||zxvvxz|~}|}}Ǿ{uoiiou{{tnhfiknqsuvwxyzywuspnoswz~~zvrnmnoqrssrqponmnopqqrtuwxz{|}~~}|zxusqnnpsuwy{|~|xuqmlmnopqqonlkiikmoqsrpmkhfegjlnprux{~}yuqmnsx}|yuqnlnopqrstttuutsqonlmquy}}zxuuy|~|}ʼujly|uoiiou{zsmfdgjmpsuvwxyzzwtrolmrvzzvqmkmnoqrrqponmmopqstvxy{}~~|zyvtrpmnpruwz|}~~zuqmlmnpqrrqponmmnopqrqpnljhhjlnprtwz|~zvrnosx}}yuqlkmoprttuuuuutrqomkmquz~}zxuvy}~||Źrccp~Ʒ}xsnnrw|xrlfehkorvxxyyz{zwtrolmrw|{vqljlmoqrsrqqpoprsuwxz}}{zxvutrqpprtvxz|}~~~~zuqmlmnpqrsrqqpoooppqqqqpppoppqqrstwy|~}zwtqqtwz}|wsokjmoqtvwxxxyyxurpmjkpuz|zxvvy|~|z{ĸxhgsŻ{wsrvy}|wqkfeimptxzzz{{{zwtrolnsx}|vpkiklnprssrrrrsuwyz|}{ywuttssrrrtvwyz{|}~}|{zz|}~~zuqmlmnpqrssrrrrqqqpppprstuwwvvutstvy{}}zxusrtvwyz{|}~~zvrnjiloruyz{{|}}|xtqmijpuz~|zywwy{}}|zxz~ò~mjw}{xwy{}zupkfeinrv{}|||{{zwtrolnty}wpjgjlnprssttttuxz|~~{ywusrrssttuvwxyz{|}}~~~|{yxvvwyz{}~~zuqmlmnpqrsstttttsrqpopsvx{~|zxvttvxz|~~|zywuttttttuwyz|~}yuqlhhlptw{}~{vrmiiouz~}|{yxxyz{|}}|zyxwx}ϼrnz~}|}}~~}xsojeejoty}~}|{zwtrolntz~wpifikmprstuuvwx{}|zwusppqrtuvwxyyz{{|||}}|zxvtrrsuvwyz|~~zuqmlmnpqrstuuvwvtsqpnotx}|xutvwy{|}|{zyxvusqpnoqtwy|{wsokgglpuy~~xsmhhnt{~}|{{zyyyyyyyyxwwvuw{}}}}}}}dzwr}ÿ~~}zvrniefkpu{~}|zwtrolnu|wohehjmortuvwxy{~zxuspnmprtvyzzzz{{{{{{||{xvsqnnoprstvy{~~zuqmlmnpqrtuvwxyxvtqomou{zutuwxz{|{{{zzxurnkhhlosvzzvrnjffkqv{ztmggnt{}|{{{{zzyxwvvuuttttvz~}||||||~~zvrxѼ|v½~|zxurnkhinrw|~}|zwuromou{~vnfdfilnqsvxz|~}xvtqolloqsvxyzz{{|||{{{{zwuromlmopqrtwz|}yuqmlmnopqrtvwyzzwtqolnt{{vtvwxz{|||}}}{wsokggjmpswwtqnkhimrv{{unhhou||z{{{{{zyxwvuttssrrtx{}zyzz{{|~{wsnt­~¼}{zxvusqpnorvy}~}|zwuspnpuzzsldbehjmpswz~zvtrpnllnoqstvwxz{}}}|||{zwuspnmnopqstwy|~|xtqmklmmnoprtvxzyvtqnklsy|wvwxz{}~~{wsokjkmoprrqpponoqtwz|{vqllrx}~{yzzz{{{zyyxxwutrqpqtx{~{yvvwxz{}zvqwƴĿ~}{ywuttttttuwy{}~}|{zxvtqoptx|}vpicacfilnrx}|wtrpomllmnopqrtwy{~~~}}|{zxvtqooopqrstvy{}~{wtpmkkllllnpruwzyvspmikqw~|xwxz{}~{wsommmmmmnopqrtuuvwxy{|~{wsopuz}yxyyzz{{{{zzzywtrpmnqtwz}}{ywtrrtwy{~}ytyʻ~~{ywusrtvwyz{|}}~~~~}}|{zxvtrqqtwz|~xrlga_begjmry{z|~~zwsqponmlklllmmorux{~}|{zxvtrqppqrrstvxz|~}zwspmkkjjjjknqtwzyvrolhiou||yxz{}~{wspomljiimpsvyzzyxwvvy{}~{xursx||xwxxyz{{{|||}{xurnkkmpruwxvtrpnorux{|w{µĿ~}}}}}}}}}}}}}}}|zwuspqtwz}~~}}|||{zxwusrrtuwyzytnid_^`cfilqzwtuwxy{zxvtrponmmlkkkjjjikosw|~}|zxwusrqqrrrstvwy{||yvspmkjiihgilosvyyurnkghnty}zz{}~{wspmjgdejouz~{xusruwy|~~}{yxvw{{wvwxyz{{|}~~zuqmihjlnprrqomljkosw|z~ɿ}|||||||||||||||zxuspnosx}}||{{{{zywvtsssttuutokfb]\_begjq{}snnoopppoonmmllllkkkjihgfhmrw|~}|zywvtsrrsssstuwxz{zxuroljihgfefjnruyyuqmjfflrw}}{{}~{wrmid_`hov~}ytonqsvy{||{zzy{~~zvtvwxyz|}~{vqlgeghjkmmljigfhmrw||¼~}|zyxľ}~~~}}|{{zyxvtromoty~~{zzzz{{zywvtrrrrrrrqnlifdcfhkmou~{qlllllllkkkkkkkkkkjjiihggimrv{~}{yxvutssrqrsuwxzzwtrolkjihgfgknruyyuqmjfglrw|~}{{}~|xsnid_`how}xsnlorux{||||||}|yxxyz{{|~}wrlgefgijkkkkjjikpuy~zxwusqyſļ~|zxvutsqpoquy}~{xwxyyz{zxvtrpopppqqqqrrrssuvxy{~yqmmmmmmmlllkkkkjjjiijkklmoqtwz|}zxvtrpnnpsuwzzwtrolkkkkkkloqsvxxtqnkhinsx}~|zz|~~{wsokfbdjqw~|wrmmpswz~~~~}~~~}~~ytojghijklnoqrsuwz|{{{{{{ľŽ}zvsqqqqqrsvz}~{xvuvwxyzzwurpnmmnnooqux{~}wqnnnnnnnmmllkkjjiihikmoqsuuvwxy{|xuqnjjmpsvyzwtrolklmnopqrtuvwwtromklpuy}}{yy{}|yvsplifgmrw}~zvqmmqux|{vqljkllmnpsvz}|~ü~ytonopqrtuxz|~{yvsrtvwyzzwtqnkjkllmnqx~}yurpppppponnmlkkjihhghkorvyzzyxwvx~zuqlgfjnruyzwtrollnprsuvvvvvvvtrpomnrvz~~|zwwz|~}zxusqnljkosw||xuqmmqvz~~~}xsommnnoorw|þ}º¼~xrljmoqsvxyz|}~{xvspprtvxzyvsolihijklmr{~{ywutrqqqqqqponmlkjjihgfglqv{~{xusu}|vpjcbgkptyzwtrolloruxz{zyxwvutrqpoqtx{~{yvvy{~~|zxvtsrpomnqtx{~~zwspmmrw|~}{z|zvqoopppqt{˿þ~xpigjnqtxzz{{||{xvspnnpruwzyurnjfefgijkr~~uqqqrrrrrrrrrrponmljihgfdgmsy}ytor|~woh`_dinsxzwtrolmqtx|~|ywutssrrrsvy|}zxuuxz}~|{yxvtsssrrqrtvxz{{xurolnsx}}{yvy|xtrrrrrrwŸķŻxqigknquxzzzz{{zwtqollnpsuxwtpmifefghijq~|snopqrssttuuvusrpomljhgedfmt{~ytor|xph`_diotyzxurpmmqux|~|ywutssssrtvy{~|zxvvx{~~|{yxvtsrrrrsstuvxyzzwuromnsy~|zwy|xtrsssstx¿ķǾù{tnlnprtvwxyyz{yvtqnkjlnprttromjhgghhiioz}wsssssstuvxy{zxvtrpnljhfdfmszzvqt}zrkdcglqv{|yvtqnnqsvx{{zyxwvutssrqrtvx{}}|{zyxxz}~|zwuspopqqrstuvxyzzwuspnotx}~|~|yvsqrsstuzļ}xsqrrsstuvwxyzyvspmihjlmopponmkjiiihhhmw~{xwvutstvy{}}zxuspnligdflsy{wtv~|unhgkotx}}{xurpoprstvvvvvvvvutrqpprtuwyzzzzzz{}~}zwtqnmnopqrtuvxyzzxvtqoptx|}}}~~~}{xvsqpqrtuv{ƿ{xvuttsrrtvwyzyvrolhghijklmmmmlllkjihgkt}}{zxvtux{~|yvspmjgdflrx~|yvx}wqlknrvz~|ywtqpppppqqrtuvwwutrqoopqrtuvwyz{|~~{wsoljlnoqrtuvxyzzxvtrqqtwz}|zzzyyyxvtsqooqrtuw|þɚ}{yvtrpprtvxzyurnkgefgghijklmmnnlkihfipx}xwy{~}zwtuy}|yurokheflrw}}{xzzuonruy|~{xurqponmlloqsvxxvtrpnmnoopqruwz|{wrnihjlnprtuvxyzzxwusrruwy|~}{xwvvuttsrqponnprtvx}Ӗ|yurnnpruwzyuqmjfddddeefhjlnqpnligegmsy|vqllqw||yuv{|xtpliefkqw|~|{||xsruy||ywtqomkiggknruyywtromllllmmorvz}|vqlgfhjmortuvxyzzywvtssuwxz|~~|zywutsrqonnmmmllmortwy~úþݓ~yuplknpsvxxtqmjfddddddegiknppmkifdfkpv{|vqlggntz}yuv{}yvsoliinsw|~~~zvux{~~{xvsqomkiimpswzzxurolkkkkkjlptx|~ytojhjlnqstvwyz||{yxwvvwxyz{}}|{zzyxxxwwwvvuttstvxz|ƾľ½ߒ~~ytoihknpsvvspnkhgfffeefghjklljigedfkpuz{wrnijoty~~{xuuz~}zxvtrpqsvy|~~zwvy|}{xwvutsrrtvxz||yvspmkkjjjiknruy|~~~~~~~zuqpqrstuvxy{}~~}|{zyzzz{{|ľ½ّ|{}~ysmgehkmpssrpnlkiihhggggghhhhgfedcejoty~~{wsollptx|~|ywtuy||{zzyxxxyz{||~~{xx{}}{zzzz{{{||}~~}zwspmkjjiihiloruxzzzzzz{~|ywwwwwvwy{}~}}|||{|~¾¾ԏ|xwz}xrkdbehknpqpoonmlkjjihggffeeddddccejosx|}zwtqnnqsvy|}{ywvtux{~~|{|}~~~}|{{{~|yy{~~|yy|~~~{wtpmkjihhghjmortuuuuuuw{~|{zxy{}~}|{|}~½þΎ}xtsw|xpib`behknoooooonmlkjihgedba`aabbcejnrw{|zwuspprsuwxyxwvuttwy{~~}||~~{yy}|wrquy}~|zz}|xtqmjjihgffhjlnpqqqqqqty~}zz}~|{{{{{{{{{{{{}ľ»žȍzuppuzwog_]`behkmnoopqqpomlkigdb`]]^_`abeimqvz{yxvtsrssttuuutttstvwy{|}}|||{}{ww|yrkjnsx}}{|}yuqmjihgfddfhiklmmmmmmpv}||~|{zyxwvvvvvvvx}º¾Ž|vqqv{yqia^`cegjlmnoqrrqonmljgeb`]]_`bdfhknqtwyxwvutssrrrrrrrrrrrtuvxyzzzzzz|{vuz~wpiglqv{~}||~{wtqnmlkjhhjklmnonnmmmov|{{~~{yxwwvuuuuvvvy~||||||}¿żÒ|xw|}unfcdfgijlmnopqqponmkjhgecaacfhjlnoprstuutttssrqqpooooooopqrtuvwxxxyy{zuux{~~zupkkorvz~~}|{|~}|zxwvutsrrstuvwwutrqprw|}{xx{~~|zxwwwwwwxyz{|}}}}}}}~¼˖~~zrkhiijjkklmnoooonmlkjihgfefhknpstssrrqqrrrssrqponmllllllmnpqrtuuvvwwy}~zutuwxz{{xvsqnnqtvy|}|||{{|}~}}|{{|}}~~|zwustx|}{zywvuvx{~}|zxwuuvwxyz{}~¿½¾ÿӛ~wqmmlllkkllmnnnnmllkkjjjiijmpsvyzwuspnnopqrsrqonljjjjjjjjlmnpqrsttuvx{}yussssrrrrrqqqrsuvxyzzz{{{|}~|yvvy{~}zwtrrrrrrsvy{~~}{zxwvusrstvxz|~۟|vrqpnmlklllmmmmlllkkklllmnruy||wsokjlmoqrrpnljhgggggghijlmnpqrstuwz}|xurpomkijlnprtuvvvwwxxyyz{{|}}~}zxxyz{|}}yxz{}{wsokijklmnpsvx{~~|zxvtsrqqpopsvy|~ü¿㣣{wusqnlkkkkllllkkkkklmnopsw{ztnhfikmprromjhfddddddefhijlmnoqrsux{~~{xuqnkgdaaejnrwyxwvvuuvwxyz{{||||}~{xtqprtvy{~|z{{||}{vpkfa`bdgiknpsvx{{yvtqonmmmmlnrvy}ƾ¿}~~spw}Ǻ맧{ywusqoonmmlllllmmmnoopqsw{ysmgegjlnppmkifdccccccdefhijlmnopqsvy||yvsplhea]^cinty{zywvuuwxz{}~}}}}}}~}zvsooprtvw{|zzzzzzxsojea_adfhjloqtwyywtromllllmmotx|Ľ¿xyznkqw}~¾ȹ~}|{zxvtrpnmnoopqqpoonmorvy}{wrnighijklljigedccccccdefhijklmmnoqtx{{xtqnkheb`afkpu{}|{zyxxz|~}{xvtssssssu{~ywxxxyywtqnkhghhijkloqsvxxvtrpnmnoopqtx}þž{|wsw|µ쯯~zwtpopqrtutrpnljjmpsvyywtqnkjiiiiihgfedcccccccdefhijkkllllnrvz~~zvrnkjhfdbdhmrw|~~}|{z{~~}}|{zzyxvtrpnpuz~zvuuvvwwwutsqponmmlklnpruwwutrqoopqrtux}þ¿~|~ȼ곳|wrprtuwyxtqmjffhknpssrqpnmljihfeddddccccccccdefhijkkjjjjlpuy}}yuplihgfedfkpty~~~}~}{z{|}}~|yuqmjjotx}|yvsrsttuvvwwwwwvtrpnllnprtuvutrqpprtuwy|¼ƼĿ·鷷ztrtvx{}{vqmhcadfhjlmnnnoonkifda`aabbcccccccdefhijkjiihginsx}}xsniggggggimrv{~{yxz|{vpkeeinrw{~~|zwusppqrstuvxy{}~zwtpmlnoqstutssrqrtvx{}÷ƾŻ绻~vtvy{~xrlf_]_`bdfgikmoqpliea^]^_`abccccccdefhijjihgfeglrw||wrlgefgghilpty}~zvvz}~woh`_cglptwxy{|}}|{yxwvtrqommnoqrsuy||wrmlmoprstssssrtvy{~½ǾÿȾŽ庺xuxz|~~xrle_]^`acdfhikmonkgda^]^_`abccdddefgijlmmlkjihjotx}}ytokijkllmpsw{|yuuy|~vog_^bfjosvxy{}~~}{zxwutsrqppqrstuwz~{vrqrsuvxxxwwvuvy|̿þƾÿɾ絵zxxyz{{yuplgcabdeghiiiiiihgedba`aabbccdefghjlmoqrssrrrqsvy|}zxussssssux{~~}}}zwttwz}ztnha`einrwz}~|{{{zzzyyyyyyz|~}{z|~~|z{}ʿ¿ɾ믯|zyxxwwurolifeghiklljhgecbcccddddddccdegijlnprtvxyyzzz{|}~}|{zyz|}{xx{}}{zxvttvxz{}|wrmhdchmrv{~~~ȿľɿ𪪪~|zxvtrpomlkiiklmopolhda]\^aceghgfedcdfikmprtwy{}{wsrtwy|~~}|zyxwvutsstuvwxwtpmiffkpuz~~~{wtpmkllllmmoprstrmgb\WVZ^cgkljigedegjmpsvy{~}xsnlnprtvwvvuttssssssssssssrpnljhinty~~|z|ý{wrmhgijlnprstvwxung`XQPV\bhnpmkifdehlpswz}|uoighjkmnooonnnnopqrssrqponmmlkkjlrw|~zwyÿ|}~{vrmihjlnpstvxy{|yrjbZSRY`fmtvsqoljjnqux{~ztnhefgghiiijjjjklmopqqpnmljjkllmnqw|}yz¿žžþ}}}~~~|zwtqonoprstvxz|~~wpic\\biov|~|zxvtuwy|~}ytpkihggfeefgghijklmnonmljighjmortx}½ƿ~}}|{zyxwvuutuuuvvxz}}wqkeelrx~}zwtqnljhfdbabdefghijjklljigfefjnrvzľǿ~|zxvvwxyzz{zzyxxy|}xsnou{~}{zxwvtsrolheb^]_abdfgghhiiihfecbdjouzÿýſ~{xussux{~~}{z{~|xx~~}||{zzz{|}~~|zxvtstttuusnid_[Y[^`bdefffggfecb`_bipxþ¼񬬬Ź~zvsooty}~||~}{ywusqqsuwy{{yvtqooqrtvxvpjc]WUX[]`bdddddddba_^\`irzſ¿~żĸ|yuqrw|~}|zxvtqolloqtwyyvtqnllnqsvxvpic\VTWZ]`cddddccba`^][`is}Ľſ¾»¾|~üƽ篯û|yy}~}|{zyxvtrpnlloqsvxxurpmjjmoqtvtnhc]WVY\_begfeedcba`_^]akuÿ}{½ݰþ~}||{zyxwwvutrpomllnpruwvtqnliikmoqsrmgb]XWZ^aehihgfedcba`_^cmw¿Ľþ½ÿ|y}Ҳÿ~|{{zzyxxwwvvuttssrqponmllnprtuurpmjhgikmoqokfb]YX\`cgkljhgedcbaa``doy½ƻĽ{x{dz{wuutttsssrrrqqqpppoonmmlklnoqsttqnliffhikmnmieb^ZZ^beimnljhfdcbbbaafq{ļºywz}~yx{~}yupnnnnnnnnmmmmmmmmmlllllkklmoprsrpmjhedfgijlkhda^[[_chlppnligdccccbbhs}Ŀ¼ɼǿĿxux{~~ytruxz}|xuqmkkkjjjjjjjkkkkkkkjkkkllmmnopqqpnkifdcdfghjigdb_]]aehlppnligdccdddejuüýƹǿ½{x{~~}~zuonqsvx{{xvsqnlkjihgghiijkkkjjjijklnoqqqppponkigdbacdfghhfeca_`behknnljhfdcdefghnw¾½·ſ~zupkjlnqsuvtsrpomljhgeefghijkjjiihikmprtusrpomkigec``acdfggfedcbbdfhjkljhgeddegijlqz½Ŀȿ¿~zuplgehjlnpqpppppnljgebbdegijkjihhghknruxxvspnkigeca_^`acdfffeeeddefghiihgfeddfikmpu}½ü¿Ŀ}}|||{yuplgcacegijlmnopqolifc`_adfhjjjihgfgkosx||xtpmifdca_]]^`acdeefffggggggggfeedcegjmpsxþȽþ}{zyxwvtokgc^]_`bcegikmoqpmiea]]_begjjihgfdfkpuz{vqlgdb`_]\[]^`acdefghiihggfeddddccehlpsw|ÿĸ¾¿~}{zxwtokgc_]_`bcdfhkmoqpliea]\`cgjmnmkjhghlquy~}ytokfcb`_]\\]_`bcdefhijjigfedcccccdfjosx|ƻ~|yuqmhdcdefghjklnopolhea^^cglpuvtrpnllnprtvvspmjgdcba`__`abcdefgghiihgfecccdddehmsx}ýĺzvrnjhijklmmnnooonkheb_aflqw}~|ywtrqpppponmkjigfedcbbbbcdeffgggghggfedccddeefjpv}ƾ¹Ǻ»¿|xsonnoopqqppooomkhfcacipw}}{xurpmkhggggghggfeeddeefgghggggfffeddccdeffgkszɿþ´û{~}yusstttutsrponljhfdbelt|}ytpkfa_acefhihhhgggghhhiihggfeeedddcddefghmu~¿ľü˼Ļºwqtwy|~zxxyyyyxvsqomkihfecgpy~vohaZX[_beijjjjjjjjjjjjjihfedddccccdefghjoxÿǷƾŻ~xz|~~|zwtqnmlkjjimv}unf_WVZ^cglnnnnnnnmmllkjihfedccbbbbbdfgikpyÿķóûĺȾ|yvsqrrsssw}wqke_YY]bglqsssssssqpnmljihfedcbaa`_`begilqxʿ¿ʽƿ¹}zwvxy{|~wplhd_[\aflqvyyyyyyxusqnljihfedba`_^]]adgjmqw|Ŀľȿ{{~{qjheb`]_djpv{~~~~~~}yvspmjihfedba_]\Z[_bfjnrvz~þźýĽƼwkdcba`_bhntz~yuqmjihfedb`^\YWX]afjoruwy|~´ýŷǽse^__`aaekry}xsnjihfedb_]ZWUV[`ekpsttuvwzľ˹ýĽ̽øre_`bcdfjpv}{vspnkifda^[XUW\aglqttttuuxϼŷ¾Ľķź~tkghijlmpu{zupkheb_\Z[_dinsuvwwxy|λź˿ƻ|wropqrstv{xqlifca^_cglptwxyz|}ͻƻǽ~|{yxwxyyz{}vpmjgebcfjnrvxz|}̻ɾ}yvrrtwy|~{tqnliffjmqtwz|~˺þʿ|wrnidekrx~Ƹxurpmjjmpsvy|~ʺ¾ɾ{vqmhipxɻ{yvtqooqrtvx{~ȹ¾¿˿Ļ~|zxvtstttuuwz~¿Ʒɼƿ~}{zxwvtsrsw{ĴǺ}zwtqnotx|²Ÿƿ}ytpkkpuzõ˿¾ztnhhmrw}ξ};{unhgkpty~ͽ~ȸſĿ}vpjhknqsvz~̽òº~xrmjklmnorx}˽Ѿztolkjihgjqx~ʾ͹ƻ{vqnkhec`bjrzɾ~~ʴ̿}xtokfb]X[dmvȾ~z|~~~}~zyʿƱµ}~zvqkf`[UW`ir{~~{wx~}}}þ˿ïķ{wrmgb\WX_gov~÷~z{ƺ}xtnic^XX_ekrx|~ƹ}~üýнȼ~zuojd_YY^chmrvy}ʻþ˺ʿ{vqkf`[Z]adhkpu{ͽŽ~ɽǻǶ|xrmgb\Z]_acejqyƼ~½~|~ôʻʻ{uoic^\^`bdfkryú½}Ĵʻǻľyslf_^adgjnrw|ʾ»òǻƾ~wpha`dhmquy|Ž||ļ{skcbgmrw}¸yx~~vmedjqw~˿|utzѾ徾Źypgfnu}~Ƹ¾yqpw~нǼ|rigow~~Ʒ{tsy̺ǿtjhou|˿¾}|Ƕ¼vlinty~øxmjnrvzĺɻĽzoknqtwz}¶ź̿}yy~|pkmoqsuyźƿͿķ}xx}topqrsux~}||||||}ýļǺɾ}}{vvwxxy|}}}}}}~~ÿµ¸||}}}}}||{zz|ÿÿɽúzyxwwvw|ľÿ÷Ȼº}wvutsrsw|Ľſɽ˻ȸ|tsqponosw|zx{}ɾľù³ɺvtsqomnrvz~ȿĿywy|~ȿƽǻ~{yvspqtx{ƾ~|~Ļľż{wtsvy|~¹¿ž{wvx{}~}{|øƼzxz|}zxz~̿øù~~}{|~~{xvw|~ǹʿƼ|~~~|zwy}ǽ}vy~~ɽĽļxqs~¿½ľyrkmvʾÿ{tmffnv~ξõž|ung``fmsy¿~~ȳƵzupjeejpu{Ž~ʴij|zxvtu{»°˽~}~Ŀ¿´ƹ~}|{|þ|{zzyxx{{xvuuuuuz¼zx|˾ž}|}}~~~Žyx|Ϳž»ǻĿ·½żùǽÿĸʾɿ~µ¿ǿƶ¶¿ɹÿſ˽ĿþüĿżõſøƹŽʿʾʾûõĺ˼¿¼ĻŵȼǿȾŸɿκǿõ͹ƼľǸнÿǿþʻȿ¿Ŀξŵĸ~¿~|ɺŷ|vpicenx}vv}ȼzxĴǺͿȻ{vqlgbclu}{uv|ĹɺǺǺ¼}|z{}|żùù~vu{ÿǾƿypov|þŽĿ¸}{~}sihpxſü»˻|yuru}yzz{|}xmcbkt}ĺŽ}{y{п{wsps}xtuvwxyyofemv~ȿǿ~ĺǸ~{xuwyuuvvww{yrrw}þſ÷ý߷ʾ|z|yvvvuuux~~·¾ÿzwvutsru{ÿ¾ÿľ~{xvusrpqv{ƽϾǻ~{ywurpnnqux{}zwtstvwxyywtrpnnpruwyywurpnpv|¿ĻϽֿwpzʻ}{yȽĽ|zxvutrqpprtvxz|}~|xtqooppppomkifddgjmpssqoljhiou{úϽ̾ì|uȹ}{x·ƿ{xtqoqrtuwxxyyz{{{{{||}{xvtrpnljihfedehkorvvusqpnosw|¾öλ·}xsniimquy}~~}|{{zyxwwy}yuplgeedddceimptxzyxwvuuwz|~öȼʻĿɿ{tnhbbipv}~|zxwusrsy~~wpjc`aabbceinrv{}|||{{{|||}}~ż½ýǽyqibZ[enx}zwtromnrw|yqh_[\^_abejoty}~}{zz{|}~ľżwne\STamy}yvrokhhlpuy}|qfZVX[]_bfkpu{}zwvwxy{|xv{ý½¾úzzz{|}~ulcZQS`ly|xuroliilptw{}}qeYUX[^adhlpuy}~zusuvwyz~xvz½ƿ¾üyyyyz{|}}|tme^VXbmw|wutsrqpqsvy{~~~~}rg\X[_bfilnpqsux~ztrtuwyz}ľxxxxxxyyy|~ztmga[\emv~|wsrstuvwxz|~|zwuw||rh^[_cgkopponmlpx{sqstvxz}¿vvvvvvvvuw|}{xsnid``gmtz~zwsoorux{~~zuqlnt{|sj`^bgkptuqnkgdhs~|sortvxz|~ſuuuutssrrsw|~{z{}~}{zxvrokhdeinrw{|xuqnklqv{~wqjddlt|{skcafkptyysmga[_m{|rnqsuxz{|}~~Ǿtttsrqponosw|}yurqsuxz||{yxwusqomkiilnqsuurolifipw~~uld[[dnw{tmedioty}uld[SWhx}qmpruwz{zyyxwzÿǼ½ƿvvvusqonlmquy}{xurqsuwy{|zywvtsrqponmnnooppnmljils{~tkbYYbkt}ztmgflqw|wof]TXhx|pknqux{|{yxwvw|½øſļ{{{zwtrolmqtx|~}|||}~~~}{yxvutssrrqpomlkkmnpqsv|~ume\\dlt|ysnhhmsx~{tme^ao|xlimquy}~}|{z{~ý¹Ľž¼{xtpmmptw{~}{ywvvvvvutqoligglptx|~vog``gmt{}xsniiotzytnhkutifkpv{~~»ýՆ{vrmmpswz}}{yxxxyyywsokfbcjqx~wqjdciotz{wsnjjpu{{wst|zpfdjpv|ʌ~ysnmpsvy|}zyz{|}}{uoic]_is|~xsmhgkpty}}zvroklqw|}~vlcbipv}|yvst{{unloruxz~|{|}~woh`Y[gt~ytpkknqtx{{xurolmsx~zqh`_gow~zsmf`akt~¿ȿü}wpnqsvx{~|{}~xpiaZ]iv}yuqnmpsvy||yvtqnpuzxqibcjqyyrkd]^gpzľ¾ǿŽytrtvxz|}|zz{}~ysmgadoy~{xurooruy|}{xustx}}xtokkqv|}ytpkkqv|ľ|xvxy{|~~}|zyxxz{}~~zvqmikt||ywtrpptx||ywx|}{ywustx|}|}}{yy{|~þĻʏ{z{|}{yxxwwwwxz{}~}{xvspry|ywvtrqrvz~{|~zyzz{{|}|wux{}}~Ŀ¼ŻՎ~zvstttuuvwxz{}}|{zyxz~}ywvutsrsx}~yuux{~}wposw{~~xwz}¸Ŀ}{|||}}Ǽ}xtpnopqrstvwxz{|}}~zvtttsssuzzupqv|yrjinsx}|spsux{~ȹſ}xtroljglzöɿ뉉}yvrpqqrrstvwy{}~{wuuuuutw|zupqw}xqihmsx}zploqtwzĴĽ{vqmiea]crµƻꄄ~{yxwvuttwz|{yyxxxwy||xuuz~ztnmrv{wnknqtwz¾¼|vqnjgc`esƽʾǽ~~~|zwtux|}}|{{z{}~|zz}~{wssvz~}ulimpsvy~ɼ|vrolifchuĻÿǽȿyyyz~~yuuz~~}}~}{|}zxx{~zrjhlorvy~ķ|vromjhejwƿÿsssvz|vv{~}||}}{zxy}~}|}}vohgknrvy}ʿľ½}vrpnljhmyȿþûºúnnnqw}~wv}}{ywx}}~|{yxwuvz~}~~ysmgfjmquy}ùĻľ}vrqonljo{Ƽ¹½}Ľ}~˾ooory{z~{xvw|~{yxwvutvz~~|}~|wqlffjnrvz~ȿƿ|xvtrpos|ȿƽļ»ʺwwwz}zxy|~{xwwvvuuw|~~~~xsmhglpty}ºý}zwuw}ü¾»Ǿüȸ~}{{}~{xvuuuvvvy}||~ztoiimrw{ƾý~{{~ƿþžŽƶ~}~~{yvsrstuvwzzvvy}{upjjoty~¾»ü¾żŴ¶~}||~~{xvspprsuvx|~~|vppty~|wqllqv{||ľ~{yw|»ºĻòʼ}{ywx~{xvspnnpruwy}~|~yqjipv|~xsmmrx}{ssx~ĺļ|wqlp~üø¹øǺ}{xvw||ywusqooqsuwy}~|~yrjjpw}ztnnsy~zrquz~žǿztnqľʿº~|}~}|zxy}zwwvvvuvvwwxy|~}}vppv||vpotx}ywy|ºżº|ſƽƿп|xwyz|~~}|{||wuvxyz{|{zzyxz}}{vw|}wqptx|}}~þ¸üſüĿϾĸ{wsrtwy{~~~~}}~}ytsvy|~|ywy}~}}ysqtwz}~~Ǽľſͽŷ}yuqmmpsvy|}~~zvqqvz~zwx}}{truwy|~}{z|ľĿ¼̿˼²z{|xtplhhkosvz|}{wsnou{{vv|}|vsuwxz||wvy|~Ÿ~Ŀ½¹Ĵʺͼ|vw|{{}yuqmloqtwy{}~zvrnou{{vv{~~xvwxz{|{utvy{~Ȼʿ¼þùŴ˽ò|wx~{}}{{zzzyz}~zwsopuz~{ww{|z{}~ztrtvx{}ʽ»·ǿ¿;öǹ}yy~z{}yy|{wtpptx|}zxx{~~ysprtuwy{üǻ»ȼɾ~zy}~yyyx||xuqqtwz|~}{zxy{}{{~xqopqrtuw{~øûĹŻǎ~{z|~}xw|zw||yvsrtuwyz{{zzzyz{|~{vv{}wpmnoopqsw{ż¹~ƹǺǽ΍|{{|}}~|vuy|zv{}zwtssttuuvwxxyz{{{||}~}ytpqw}~zz|vollllmmosw{ȿȿ}ywwxyzz}ͿɻƿՋ~{zzyyyy{ytswz}»}y~~{xvtttssssuwxz||||{{{{~zvrmnu||vv|}vpmmnnopqux{~Ŀž~~~zvttuuvvy~̾Ȼξļي|ywwvvvuwz~zvqquy~}zxwvutsrruwy|~~}|{z{~|wrmntz|wx}~xrprsuwyz{|}~ľ~~{wvwxz{}ķĹο܉}yvttsrrqrux{~}zvrnoty~~}{ywvtrqqtwz}~|zyz}xsnnty}yy~zusvy|~}~û~~|xwz|~ɼއ~{wsqqponmnqsvx{{wtqnkmsy~~|ywtrpptx||zxyytnnsx}~~zz|wvz|{|}~ȿ~}}yy|¶µúþ|yuqonmlkjjlnprttromkhjqx}ywvvuttv{|}~{xurootx}}zwyztnmrw|}{{~~{{~yzzxxyzz{¸~}~{{~~ȼøĽㅅ{vrnlkihgffgijlnnljigehpx~xromlkjikpv{{wy|~}yuqnnsy~}yvx|unmrvz~{ww{|||}xuuuuuvzź~}÷ĺ|}yx~·ƺĺ~Ÿ億~zuqmjihgfeegiklnnljhfdgnv~|vplkjihfhmqv{{wy{~{wsnoty~~{wz|vposx|}zvvz~|}~{wwwvvvzĹ~ŸƼ|uuzźż~ĹͿŽ焄~zuqmkjiihghknpsvvrokhefmsz{wsqponmlmpsvy||}~~yuqquy}~|~{wssx|}{xy||}~~}||~Ǿ¶}xssx}ĺ̽ƾʻÿꄄ~zuqmkkjjjjkosvz~}xtojefkpv{}{ywutssrqqstvwy{}|xtsvz}}{ywx|~}|{|||ǿ|xuqrvzúɺǿƶ섄~zuqmkkllllosx|~xrlfeimrvz|{{{zzyyxxwwvvvvvuwz}{vuxz|}|{{{zz|}}}}}}~||~zxvtqoptx|¹Ƿ²Ŀ~zuqmklmmnorw}}vngehknqtvwyz|}~}}}||{ywvtrsvz}}{xxz{}~}yxyz|}~|zxvvwyz|}|z{|}~||}~ƶyqpoonmoruy|ijüϾý񄄄~zuqmlmnopqu{ypgdfhjlmpswz}|yuroosw{|xtqpsuwz|~~~|zz{{||~~zwutrqopswz}yvx{}|{|||}}~ÿϼqhiijkkmpsvy|°Ŀ̺􄄄{wtpoopqqru|zqiefgijknquy}~zvrnnrw{{wrnmoqsvxz|~~||||||~zurrqppoqtx{ywy{|~}|||}}}~Ŀϼrijlmnpqsuvxzžξ˹~~{yvutssrqty~xqjghijklorux{~~zwsooty~~ytonoprstvy{~}}}}}}}xsrstuvwxz}~{{{|||}~~~Ķ{tuwxy{{{zzzyƸ̻ú~}{ywusqrvz~{vqljkllmnprtwy|~{wtpqv||vqoooppqsvy|zvrqtvy{~~|{ywwz|~{yɾƿμ~zwsppsux{~~{wtqnmmnnooqrtvwy{}~|xuqsx~~xsooonnmoswz~|xtppuy}}zvsrux{~~}|zyxxz{}~¸}z}y|ƾϽź~ytonpqsuvwutrqpoopppqrstuvwxz}|yvstzztponlkjkpty}|yuropv{~ysnmptwz~}wsrrqppprtvxz}ʾvrx~xyſпʾ{uolmmnnooppqqqrrrrrrssstttvx{~}zwtv||vqomkhfhmrw|~|yvspmow~xqihkosw{}~}umhhhhgghkmprux|ķǶpjqw~xvz~|~µysonmlkijlmoqsssssrrrsstuuwy|~~|z|}vrolifdejouz}{yvtrt|wpigkosw{~zqieeeeffgjlortx{õͻpjpv}|xz|}ûxw}~Ƶɼ|xtqmjffilnqttssrqpprtvxz|}{vqnkhebchmrw{~|~~}}}||}}wrlkosw{}wrlijjjkkmoruwz|ƻϾxrv{~~~Ľyx}õȾ}}}{uoicbfjmquutrqomnqux|~zuqnkgdaafjosw{~~}~~}yyxxwwxz}|xsoosw{|xuromnooppruwz}y}}{{y}ƾzzz|yqi`_chlquvtrpmklqvz|xuqnjgc``dhlpswy|~~}|{z{|}~~yutssrqruwz}}zxursw{~yuttsrqqrstuvxz}ýĵ|x}Ƽ|z}ǿwwwy}}rh][`fkqvwtqolijpv||zwtqmjfb^^beilprtvxz|~~{zzyxxxyz{|}~uqponmlmoruwz{zyxwvw{|wyxokmoqrtvwxyz{}ƽǹ{ux˿¾}z}ùtttvztgZW^djqwxuqnjfhpw}{ywvtqmiea]\_beilnoqstvwxyz{}zvuuuuuuvwyz{{rlkjihfgjlortvwwxxy{~wqs||pebfjnswz{|~ʽzqtǸû~{}÷ƹtttvz~tgZW^djqwxuqmifgow~zyxvutqmid`\\_behknnopqrsuwxz|~wssssssstuvwx|xnhhgfedehjmprtuvwxy||vpr{zoc`ejoty|}ȼǻ{qr}ôĺºijuuuw{}rh][`fkqvwtqmjghou|~zyxvutqmid`\\`dhkoqqqqqqruwy|~|vsssssssssssswtjeeeeeefilnqtuuvvwwy~~{wsu}}sifjnruy|~Ž~ts|ȿŽvvvx|yqi`_chlquvspnkhinty~}{|}zyxvutqmid`\\aejosutsrqpqtwz}zusssssssrqponrz|qfabcdefhjmpruvvvuuuw{}{zxvywomoruwz|~wu{ļúϿxxxy}{uoicbfjmquuspnkijnrvz~|zxvwy{}~}|zyxvutqmid`\]bglrwywusqoptx||xussssssrpnlkilvxmb]_acegilnqtvwvutsrty~}yxxxyyy|{usuvwyz|~zvz}ýƾļ}̼yyy{~~{xtqmjffilnqttrpnljknqtwzzywutrqrrrrssuvxyzzyxvutqmid`\]ciou{|zwtqnotx}~|zxvtssssssrolifdgq{uj^Z\_behjmpruxxvusrprw||wrpsuxz}|zzzz{{|~|||xyz{|}ƿ{|{w~ʹzzz||wronmlkijlmoqssqpnmkkmoqsuutrqonljigecdhmquyzyxvutqmid`\]dkqx|yuqnnsy~|ywvuutsssssssqmjfb_bmw~rfZVZ]aehlnqtvyywtrpnotz}wpjinrw{~}|{|Ÿ~|ywwz}yxvusr}¼|xx~ü{vqzǺǷyyyz}|wrljjjkkklmnopqqpoonmmnoqrssqpnmkigdb_]^diotz|zxvtspliea^_flsy~zvsooty}~|ywwwvvvvvuuuusokgc_cmw~sh^Z]`dgjmortvyyxvusrswz~~xrmgflqv{}{yz}ǺĿ~|zy{}~zwtqmwŸſyz}yķóuuuvy|~ytoighijklmmnnooooooooopqrsttrpnljhfeca_aflqw|~{xvspnkifdacinty~{xussux{~~~}||{{zzzyxtqmjfiqzxpheghiklnoqsuvxyz{|}}}}~~~{wsokgglqv{~~}zwttx{~ƺ¾|xtowƻýɽʽqqqrux{}zupkfeghjlmnnnmmmmnoopqrsttuvuspnkigfedcbdiotz}yurnljihfegkpuy~~|zxvvwxyzz|~~~|yvspmov}}xsqppoooopqrstvz}}yvspnljghmquz~}{ywuux{}~{wsoorvy}Ż|wqvĿ½·mmmnqtwy|{vrmhcbegjlnonmlkjklnprsuuvvwwvspnkhffeeedglrw}~zupljiiiiijnrvy}~}}|{zyxwvuuv{~{yvtu{~|zxusqppqqqru{|unjjiihhjmquy}}zvsollquy~}xtojjmqtx|Ļzsv¿½̿ļ½Ļiiijmpruxwsnjea`cfilopnmkjhhknpsvwwxxxywtqmjgeefffgiotzzuojghijklnqtvy|}}}~~~|zwtqoqx}{{{wsqppppos||qfacdeghknqux|{vqlhcciou{|vpkedhlptw{~ļ}|~}uu}ÿοʽºeeefilnqtsojfb^]aeimpqomjhffjmqtxzzzzzzxuqmifdefghilrw}{tnhegjlnprtuwy{|}~{vrmiku{urqponmr}{m^X\_beilortwzyslf`Z[bjqyztmg`_cgkosw{ý¾~~|ywx~wuy~̻ȷǿfffhjloqsrnjfb]]aeimqrolifcdhlptxzzzzzzyuqmjfefgijknsx}ztnhfiknprtvwyz|}~{vqkfis}~yusrpomr~{l\VY]`dgknqux{yrkc\TU^fow{tnhaaejosx|~}~~{xy~|y|~¿ŴúĿmmmnpqsuvuqmid``cgjnqqnkgd`aejnrwyyyyyyxtqnkhghijklosvz~}ytpkjlnprtvxy{}~~yuplgirz}zxvtrpt~{m_Y[]`bdglquz}tlc[RS\enw}xsniiou{÷ƽĿtttuvwxyzxtpkgccfilorqmifb^^cglquxxxxxxwtromkjkllmnpruxz}}zwtqnnoqrtvwy{}~}{wtplhjqx}zxusv|oc]]^_``djpv|wmdZPPZclv{xtqryżĽɿ{{{{{|||}{wrnjfehjmorqmhd`[\`ejotvvvvvvvtrpommmnnooprsuvxxwvtsrrstuvwy{}}{yurolijpuz~|yy}|yvx|qf``_^]]`how~yodYNNXaku}zx{½Ŀ~yuqmihjlnprqlgb]YY^chmruuuuuuutrqpooopppqqrrrssstttuuuvwwxyz}~{yvtqomjkorvz~~{yvsqrv{|yz|sidb`][Y]fow|pdXLKV`ju~ĸ|xtpljlnoqrpkfa[VV[aflqtttttttssrrrrrrrrrrqpponoqrtvxyyzzzz|~~zvtrpomkknprtvvspnkhjpv}~|||tmgd`]YVYdnx~qdWJIT^it}~~Žƺ}xtokiklnpqpje_ZTTZ`ekqtuuvvwwvuttsrrqqqppomlkjknpsvxzzzzzz|{xuspnljjkmnprqomkigiou|~}|~|}~wqlhda]Y]gq{tg[NMWblw¿~~{z|}~½Ŀǽþ¼|vqkfdfikmpnic^XSSY_flrvxy{}~|ywurponmlkjjihhghknpsvwxxxyy{~}yvrnjgfhjlnpqponmlnsx}~~~}}}{{|vroligdgowyncXWakt~÷}ywxyz{{»ƿĿ¼ĸztmg`_behknmgb\WQRY_flsx{~~zvromkjhfeeedddehkmpsuuvvwwz~~ysnicbdgilnpppppqsw{}z{|}}~}yz{xvtrpnqw~}tkbbks|˾{wtuuuvvzƽý¿˾yrjc[Z]aeillfa[VPQX_fmtz~|wqmkhfca```aaabehknprsttuvy}|ung`^adgjmoprstvx{}yvxz|~{xy~}|{zy{{sllt|ŷytrqqqqqu}¹˿žžŶxog_VTY]bfkje_ZTOPW_fnu|xqkheb_\[[\]]^`behknpqrstuw|vne]Z]adhknqsvx{}~{usux{~}zwx~|vw~̽~xronmmllox~~ʽ´úǽ¼˻vmd[QOTZ_diic^XSMOW_fnv~ypjfb^ZWUVXYZ[]`behkmnoqrsv|xncYVZ^bfjmqux|~wposvz~~{xuw~}»ó}vplkjhgfjrz{tsw{ĵĿǹý~umd\SRW]bhmmf`YRLMV_hpyxohea]YUTUVWXY[^adgjmnprtvy}xndZW[_cglosvz}~wqptw{}zwtv|~ü{tnjjiihhkryxpnsx|Ͽ˿ŷÿļŴ~~~{tnhb\[aflqwumd[SJKU`jt~vmgda^[XVWWWXXZ]adhknqtvy|~vnf^\`eimqtvxy{}~~~~~~|wvy{~~{xuuz~žķysljklnoqtx}zqpv|˽Ľżû̼wwwwxxyyyxtplhdejpu{~si^SIIU`lw}tlfdb_]ZYXXXWWY]adhlptw{ztnicbfjnrwyyyyyzzzzzzz|~}~{xutwz}~wqkilpsvy|~|sryĹǼÿùõooooprstuusqpnmotzzm`TGGTan{zrjedb`_][ZYXWVX\`eimrv{~}zvsokggkptx|~|{yxvuuuuuuy|xutuvxyz|~ļ|uoiinsx}~ut|¸˾ggggikmoprrsttux~rcTEESbp~xpidcba`_^\ZXWUV[`ejoty~|zxvtsqomlmquy}|yvsqqqqqqu|}yussrrrqsvz}¿ytnhhov}vvſ¶^^^_bdgilorux{~veUDCSbr|ungcccbbb`^[YVTU[`ejpv||ywurpoooopprv{~ytommmmmmqy}yurpnlkijoty}Ŀ}wrlfhqyxxµXXXY\^adfjnsw{tdTDDTds~xrlfccccbba_]ZXVW]bglrw}}zwtrollmnpqrux|}ytommlllkow~}yvromjgdfkqv|üĺ}xrmgir{}~}}ĿŽƼTTTUWY[^`chmrw{~uj^SHIWes~yuqmiecbbbaa`_^]\[]afkpuy}}zwtrollmnpqrtwy|~~{xusqponmlnu|~}zwspmjgdfkqv|zuojkt|||¿¼PPPQRTVWY]bglrwyxvusrng`YRKNZfs~ysomkifdcbaa``___```bfkosx{}~}|zwtrollmnpqrtuvxyzzzyxwvusqonlntz{z|~|zxuqnkhefkqv|ǿ|~¾ȿ}wrlnu}z{Ŀ¿LLLMNOPQRV\agmssokgc_[YVSQNR]hs~}vpieedddccba`_^^`abcegkosw{}|||{{{{{{{{zwtrollmnpqrssstttuuvwxyxvtqolmrw|}zwwy{~~|zyvrolhefkqv|xvy|Ƽzuopw~yyHHHHIJJKLOV\bhnng`YRKIKLNPQW`is|~vnf^[]^_abba`_^]]`begjlpswz~|zwurrtuwyzzwtrollmnpqrsrqponoqtwz||yvspmmquy}|yvssvy|~~}~~~~}|{zwsplhefkqv|ɼzrosx|ù}wrry}xx~¾ŽûDDDDDEEEEIOV]cjh_UKB8665=EMT\bfimptsmga[UTVY\_ba^ZWSPRYahpw{||}}~|yvspmlnprtvurokhddfhjlnnkhfc`bhmsy~{xusrrsstutsqonlmptw{~~}|{zyyyyyyyxwwvuuvvvwwuqnjfcchlquz}{wsrstuvwxyz{|}ƽ~ytsx}{ww|ĿźZZZZ[[\]]^^__``]VOHA:;BJQYaefhijkjgc`]YY[\^`ba\WRMHKT^hr|~}{zywvtsqqrrsstrokgc__adfikkhec`]_ekqw}~|zxvuttsrqqponmllorux{||{zyxxxxxxxwvutsrqrrsttsolheaaeimqty}ļ}}||{{zxvtrpprtuwy}|wrrvz~{xy}Ŀľcccdeefghgeca_]ZTOJD?@GOV]ehgfedcba`_^^^_`abc`ZSMGACP\ht|zwuvvvvvvuttsrpkgc^ZY\_behhfc`]Z\ciou|~}}|{zyvtrpnmmlllkloqtvyzyyxwwvvvvvvvtrqonmnopqqpmifc__cfilotzý|trvy|}xsnihjmortx~zuqptx|}{yz~ú½ļmmmmnpqrsqmhd_[VSOKGDELT[bikhda^ZY[]^`bcccccc_XPHA97;K[kz~|wsojd^YSMLOSVZ]^^]\[[\aejnsvxy{}|zwurqqpppoonnnmmmlllkklmoqrtspmifbbehjmpqpoonmmnpqrsw~}vpibclu~{qg]Z]`cfimquz~|wrmmrvz~||÷»ùmmmosw{~yrkd][`dhmqrqomkifa\WRMKMOQSVWWWXXXVQLGB=AP^m{}yupke_YSMKNQTWZ\]^^__adgjmprtvxz|}|||{{zxwutrqonlkihhggffgjlorutqmieaaehlptvvwxxyz{{|}~~xurolhjqw~yqia^`begjmquz~}xsnnsy||~żĻhhhjotx}zsmf__fmsz|wqlgb^YUQLJKLMMNOPQRSTSPLIFCGUbo|~zvrmf`ZSMKNPSUXZ\^`bdfghjklnpruwy{}~~{xvspnkhfdcbba`bfjnrvvqmid``einsw{}zqlmmnnoqvz~xqkdaceghjmquz~¸ytnnu|}|~½ſ»bbbekpv|{tnhbclu~vme^[WSPLJIHHGGGIJLNOPNMKJHNYeq|{wsngaZTMKMOQSUX[_bfikjjjiijmoqtvy}}yuqnjfb`_^]\[]bglqvwrmhc__ejpu{xndaeimquxz|~|wqlgefghijmquz~ztnow~|~Ľ¾Ȼſ]]]`gmtz{vpjdgr~znb[XUROLIGECA??BDFIKLMMNNNT^hs}}ytohb[TMKLNOQSV[_dinomljhffiknqsw}|wrmhc_[ZYXWUX^dkqwxrmhc]^ekrxznbWU]dlt|~~|yurnkiijjjkmquz~˽|unpy~|}ź˻[[[_elsy|wrnimypbZWTQNKHEA>;88<@DHLNPQSTV[dmu~|xtnhb[UOLMNPQRU[aflrspmjgddgjmpsw}~ytoid_\ZYXWVX^djpvwrnjeabhmsy{z}uj_UT]fow~|{xurpmjijklmnpswz~|uopy~|~}}Ź²ź^^^agmsy}yvroste\YUQNJFB>:6239?EKQUWY[]_dkry}yuqlga\VQNOPQRSW]cintvrokheehkorvy}{vqlgc`__^]]^bgkostrpnljjnqux|zutwz}{tle^^emt{}{xurokhddgjnqtvxz{}|vpqy~|z{Ƚʼaaadinsx~}{ywuzwi_ZVRMID?:50+-5>FNW\_adfimrw|{wrnjea\XSQRSSTUX_ekqwxtpmieeimptx{}}xtokgddddccdgiknpqqqrrrstuvxy|}xtoortwz}~zvsokghnty|yvrokgc_`ejotz|||}}}̿{vqry}}xyµdddfkotx}~~}}|{{la\WRMHB<60*$'2=;952.*'*3=;8631.19BJRZ]ZWTQNNQTWZ]`behkmmkhec`__```aaaa````^]\ZYYZ[\]^_abcefghijklmnoopqwxpiaYRPSVY\_envyncXW_gowzsmf`]_`acdjv{uojddkryĻ¿¿¾¸|xuqnjgec`^\[]^`abl~ĽYYY[_dhlqtvy{}~}{zxy|þ{rh^TJECBA?>=;:9769@HOV]_\YVROORVY\_bbcdefec`][XWWXYYZ[]^`bddba`^]\\\\\\\]]]^^`cehjmopqrtuzzsmg`ZTQSUVXY^fnv~wphaahpw~}ume]Z]`dgjpz|wqlgbcjqw~¿Ƚ}zwtrponmlkihfedmTTTW\afkptvxz|~}tke^WQJFECBA??>>>>>AGNTZab_[XTPPTX[_bccba`_]ZXURPOPPQRSUX\`cghgedca`_]\[ZYXXXWWY]aeinprtuwy}~unid`[VSSSSSSW^elt{}yurnjlrxvmcYW\afkpv}~{wrnie`ahov}Ŀ¿ø}||||||zvqmiemĹPPPSY_ejptvwy{|~{oc[XTQMJGFECBA@ABCDEHNSY^dea]YVRRVY]aeec`]ZXURPMJHGHIJKLOTZ_ejlkihgeda_\ZWVTSRPOQW]chnrtvx{}{pifb_[XUTRPOMPV]cjptttsssv|xlaVT[ahov|}yuqnjfb^`gnu|~~~}þ|}»ʿ{tmfnǼLLLOV\ciptuwxz{}|n`RKKJJJIIGFECBBDGIKMPUY^cghd_[WSSW[_dhgc^ZUPMJGEB??@ABDEIPX_fmponlkjgd`\YURPNLIGJQY`gotvy{~wleb`^\ZWTQMJGHNTZ`fjnruy}yl_SPYbks||xtplifc`\^elsz~}||||||~»xyĻƺ{qhn˾öKKKNU[agmqrtuwx{xhYJCDFGHJJIHGFEEGJLNQTX\aeiiea]YUUX\`dhgb\WRMIGECB@?@ABCDHPW_fmqpoonmkhd`]YVSQNKHJRYahotwz|~shba`_^]ZWSOLHINTZ_ejnsw|zm`TR\enx}ytplhfda_]_ekqw}~~}}||{{|ýü~ww~ľ¹¶tio̿NNNPUZ_dhlmoqrtw{zjZJCDFHIKLKJJIHIJLNOQTX\aeiiea^ZVVY\_bed`[VQLJJIIIHHIIIJJMSY^djmnoopqpnkifda^[XURSY_ejptwy|~vneaaa```_\YVSPQW]chnruwz|yodZYbkt}{wrnifecb`_aejnswz|~}|z{~Ľþxx¼ǽtjpǻQQQRVY]`dfhjlnpsw{}l[JCEGIJLMMMMLLLMNOPQTX\aeiifb^[WWY[^`cb]YUPLKLMOPQRQQQPPRVZ^bgjlnprtusrqonlieb_[\`dhmqtvy{}{unhb`aabcdca_\ZXY_flrx{{|||}~yph__hpy~ytpkfdccbbacehknqtx||yy{~ŽƿzzukqúSSSTVY[]_acegjlosw{n\KCEGIKNOOOOPPPPQQQRTX\aeiifc_\XXY[]^`_[WTPLKNQTWZ[ZYXWVWY\^acfjmqtxyyyyyywsplieegjlortvxz|~~yuqnjgc`_`bdfhhfdca_bhnu{~}{{~yrlefnv~|wrmidabbccdefghjkntz|xwy{|~ƽŽ{{vlqžVVVVWXXYZ[^`cehkosw{o]KCEHJLOPQRRSTTSSSRRTX\aeiifc`]ZYZ[\]^]YVROLLQUZ^cdba_]\[\]^_`chmqv{~~zvromnopqrtvwy{|~~{tmfba`_^]^`cfiklkjihgjpw}}yxz|~}xtokmt|~~~}{vpkfa_`bcefgffeeehpx}xvwxyz{~ǽú||ÿvmr½YYYXXWVVUVY\^adgkosw{q^KCFHKMPRSTUVWWVUTSRTX\aeijgda^[ZZZ[[[ZWTQNKMSY_ekmkhfda`__^]\_flrx|xvuuttstuwxz{|||}}}~tjaWSTVWYZ]`dhkoqpppoory}wuwxz{}}zxusqsz||||||ytnid^]_adfhigeca_blv}wttuuuvx~ȽȾ~~ƿĿwos[[[ZXVTSQQTVY\^bfjnswwfUMNPQRSUVWYZ[\\\\\\]`cfillifc`][\\\\\[YWVTRSY^chnomljhfdb`^\Z\biov||xvwwwwxxz{|}~~~}~zpf\QNQTW[^adgjnqrsssssw~~wstuvwxxwwvuuw}|}}}}}ztnic][^`cfhifdb`^blu}wtsssssv{ǽʿ~~zxƿ¾zrv\\\[XUSPMMOQSVX[`eins{tg`_]\ZYYZ\]^`adfiknopqqrsqnjgc`^___`````___`bdfhjkjjjiigda^[XY^chnswy{}|yurnnruy|~~~~xog^URW[`dhklmnopqrrrssw~~wssssssstuuvwy}~wqjd][]_adfffedccfnu}|wutttssuzĽǼ~~|zĿy}^^^\XUQMJIJLNOQUZ_dinwysokgc^]^`abdglqv{~}{zwsokgcabbcddefhijlljihgffghjklkgb^ZUUY^bfjmnpqsttqnkhegmt{}zwsrtuvxyz|}~~vog`XW]bhmsutsrqppqqrrswwsrqponnpsuwy{}{sle^[\^`acdeffggjpuz~{xvuuttsuz~Ĺ~~}{___]XTOKFEFGHIJNTY_ejs~yrkdacdeghlt{|xsojfdefgghjmpsvxxsokfbadgjmpnid^YSRUX[^acdefghhec`^[_ir|ztngfhknqtvwyz{}ztnhb\\cipw}|yvspoppqrswwrpnlkijmqtx{}~~~~vnf^[\]^_`bdfhjlorux{~}|{zxwvvutsuy}~}ŷ|aaa^YSNHC@ABBCDGMTZ`foz}sjeghiklr||xsnighijklosx||umf^\aejnsrke^XQOQRTVXYZZ[\\[YWUSQWdq~wnd[Y]bfkorsuvwywrmid_ahpxzupnopqrswwrolifdejosx}~|{yxy{~xpg^Z[\\]^`cgjnqstuuvwwxxxyyxwvutsux|ʿ}}ɺ}ûbbb_YRLF?<<====AGNU[bkv{ojklnopw|wqljkmnoptzzpeZX^djpvunf^WOLLMMNOOOOPPPONLKIHO_osg[OLRX^djnoprstspmifcenw~volnopqrxxqmjfb_`fmsy~zwtqqv{{qh_ZZ[[[[^cglqvwvtsqpprtvxyzxwvutux{~ĺǼ}}̾~¹ɿdddaZTNHB??????AGLRW]epzvqrsuvx~|vqljklmnpt{}rf[Y`gmt{zriaYPLLLLLKKKKKKKKKKKKKSbr~rfZOLRX^eknnoooonljhfcfow{tmjlnprtywqmjfc_`flrx~|yurnoty~{qg]XYYYZZ]bhmsxzwurommpruxz{yxvtsswz}}|Ⱦ¸}|;}ǽ»Żeeec^YTOKHHHHHHJLORUW^hr}~z|~|wrmgefghijnu|}sja`gmt{xof^UPPOOONNMMMLLMPSVY[bmxzrjbZY^bglqrqomkjhgedcadiou{|xsnihknpsv{}upnljhffjnrvz{yvtrpqux|xndYUVWXYZ]bhmsxzwuspnnqtvy||zwuspquy~yxż}|ʻzùĽĽfffea^ZWSRRRRRRRRRRRRWajt~~{wy|wrmhcabccdeipv}|unggmt{~ulbYTSSRRQPPOONNPV[aflrx}zvrnjffimptwwsokhdbaa``_adhknrromjhefimqux}{soonmmllnprtuvuttsrsvx{~vk`UQSTVXY]bhmsxzxvtqoprux{}}zwtqnoty~}ut{½}|~Ǹ|xžÿhhhgeb`^\[[[[[[ZWUROLPYblu~}ytpkmt||vrmhd_]]^^__cjqx|wrlmt{{qg]XWVVUTSRQQPOS[clt|}zwvvutsrrrrrrsuwy{}{upjd^[\\]]^^_`abbcbbbbachmqv{~xroopqqrrrrqqqqrrsstuwxz{}sh]RMPRTWY]bhmsxzxvtrqqtwy|~{wsolmsy~zqpw~}|~ŵyu|~~}iiiihggfeeeeeeeb]WRLGIRZcluzz{||}{upje_`hpx~zuqmhd_[XYYYZZ^ekry|xurt{vlb\[ZYXWUTSRQPValw{wsokiiiiiijnrvz~xph`XUVXYZ\[ZXWUSSUWY[]aglrw}{upnprtvxxvtqollnprtvwxxxyy{~}qeZNJMPSVY]bhmsxzxwusrrux{~{wrnijqxvmlsz¿}|~³wryzxvtrpqw|jjjkklmmnnnnnnnjbZRJABJR[clpqstuvsmf`ZST\dlt||yvsolgc_[VTTTTUUX_fmtz}|{zyx{|qf`_]\[YXWVTSRXft|upkfa\Z[\]^^cjrzzpf\ROQSUWZYUQLHDDHMQUY_elry|wsnmqtx{~zuqlhgknquxyyxwvuw{{nbVJFJMQUX]bhmsxzywvtstwy||vqlghpx|sjhov}}|}}{y|Ŀtpw}{tqmjfcdkqw~ümmmnnopqrrrrrrrne]TLCBIPW^ejkmoprpic]VPQX`gow~|yvspmid_ZVQOPQRSTX^djpvyzz{{||rhcba`__]\ZYWV\kz|uoje`[YZ[\]^bks|{pf[PLOQTWYYTPKGBCGLQV[agnu{~zwsppsw{}ytojjnruy}~}{zxwwz}vj_THEIMQVZ_dioty{yxvtssvy|}xtpkmsz{rigntz}{}}zvsvyuz|uqmid`ahou|qqqqqqqqqqqqqqqng`YRLKOTY^bfhkmorpke`ZUU\biov|}yuqmhb\VQKILOSVY\aejnsvwxz{}xpgcddeffeca_][ao~}ytpkgeeefffiou{zpf[QMPSUX[[XVSPNNRVZ^bgmsy~|ywtux{~}zvssw{~~|{{{{{{wnd[RIFKPTY^cglqv{|zwuspqtwz}}{ywx|{skjoty~¿|z|~|yuqt~}yuqmiiou{¾uuuutsrqpppppppmhc^YTSUXZ]_behknqqlhc_ZZ`ejpuz~|wrmg`YRKDCINSX]adgjmprtwy{~{tmfdfhjlnnkifdaft~zwsqpppooqtw{~zpf\ROQTWZ\]]\[ZYZ]adgjnsx~~}|{yz|~|}}zwurmf_WPIHMRW]bgkotx}}zwtqnnqux{|umlptx|{y|~|xsor|}yuqqw|zzzywusqonnnnnnmjfc`][\\\\\^bfjmqqnjfc__dhlptx{~ztng_WNF>>ELSZbfghjklorux{{vpkfehkoruvspmjglx}|{zyxxxyz{|}ypf]SPSVX[^`abcdefhkmoquy~~~~~ysnhc^YTNIIOUZ`fknrvz~~{wsolkorvy}|vpnqsvy|ľzx{~|wqlo{}yy~~~~|zwtqnmmmmmmlkjhgedb`][YZ_chlqroljgddgjmpsvxy{}|unf]TJA88AJT]fkjjjiikosw|~}|zxtplieejotx}~zwsplq}}{zxvwy|xof]TQTWZ]_behkmprsuvwy{~wog_YVSPMJKQW]djnruy|{wrniimptx{}wrprsuwxzwz~{vpjmz¾ǿĿĂ|yuqnllllllllmmnnlhc_[VW\afkprpomkiikmoqstuuvvwy{~~wof[QF<22=IT_komljhfhmrw|~{xuqomjhfdflrx~zvrv}yuqptx{xog^VSVX[^aeinrw|~~~}vk`UONMLKJMSZ`gnruy||vqlgfjnrvz~}ytrssttu|Ļ¼yvz~{unhkxýȾƿ|xtplkkkkllmnoqrsqlga\WV[`ejopomljiiklnpqrssssstvxz|~|tmdYOE;01=IUbnrolifbdinsy~~zvrnjgedba_bipx~zwz}xsrux{~~vnf^URTVXZ\`flrx~}|~sh^SMMMMMMQW]djpuwz|{vqlggjnqux~~{|xvvvvvv~ýyvy}|vpjn{¼þ|||zwtqnkjkklmnopqrstsnid_[Z]adhkljigeddfikmpqrrrssssssssvz~{unh`WNF=45ALXdosokgc__dinrwwsokgc`^\ZXVYaiqy~|z}}|}}~|tld\TPQQQRRV\cipvz{|}~~||}~vog`XTTTTTTW\bgmrvxy{}~zvrokjloqtv{{y}}}}}}}Ȼžzwz}~yuqvŻ¾vvvuspnkiijlmoqrsttuvtplgc_]_adfhhfdb`^_behknpqqrrsrpomkikosw{~ysnic]UNF?79DOZfqtoje`[[_chlpplhd`\YVTQOLOYbkt}~~~yqjbZSNMLJIHKRYahosuwyz|}~~~~~}|{{||}}~ysojfb][[[[[[]bfkptwxyz{||yvtqnnopqstxxw|ƿzxz|}{y}ļ¾qqqpnlkighjlnqsuuvvwwvrnjfcabbccdca_][YZ]aeiloppqrsqnjfc_`dhlptsokgc_YSMGA;=HR]hruoic]WVZ^bfjiea]YUROLIFCFPZdnx~~|vog`YQLIFDA>@HPX`hmortvyzyyyxxxxyzz{{zzzyy|}umhgfedbbbbbbbdgkorvxxyyyzyxvusrqqqqrru}}uu{ǹ{yz|~ĸǿǾkkkkjihgfgjmoruwwxxxywtqmjfddcbaa_]ZXVSTY]bfknopqrspke`[UUY]aeiifc`]ZVQLHC>AKU_jtvohaZTRUY\_cb^ZVRNKGD@=9=HS^itz|~ztle^WPJEA=846>GOX`filosvwutsqpprtvxzzyxvutw{z}tja^`bdfhiiiiiijmpruxyyxxxwwwvvvutsrqqpszzsry;»|z{|}~üǸÿĽĿffffeeeddfimptxzzzzzzyvspmjhfda_][XVSQNOTZ_dilnopqrohaZRKJNRVZ^_][YWUROLHEBEOXbluvog_XPNPSVY\[WSOKGC@<8404@LWcowz~yqjc\UNHB<60*+4=GPY_cgkossqomjhilosvyzxusqos}~trw|uj`USX]bhmppppppprtvxyzyxwvuuvvwxyxvtrpmpw~~wppxó}{{{|||~żʷĺÿĽ____```aadhlptxzzzzzzyvtqnligeca_]ZWTQNNSX\aehjlnpqng_WOGEIMQUY[YWUSROMKHFCFOW`iqrkc\UNKNPSVXXURNKHEA>:737CNZeqx|~umga\VPJC=60*+3>>@DHLPTX\aeimpqrstutqnlifglpty}}wqke`[YVSPNOTZ_ejje`[VQPTX\aed_YTNIFEDDCBCDEGHJJJJJJJKMNPRSVZ^bgkmnoqrsv{{z}||{zzywusqpmjfc_\[\^_aba_\YWTSTVWXY\_behklkigfdflrxyoe[QPW]dkruttsrqrstvwyxurpmjknrvz~}zxvtux|xof]bt~}|ù{wtsqonlou|ý5558=BGLQUZ^bfjmnoqrsrpmjhegmsy~xqkd_ZUQLHIOU\bhie`\WSSW[_chf`ZSMGCCCCBBBAA@@@@BDFGIKLNOQRV\agmswz|~yx{ywusqoljgeb`^\ZXVVZ]`cggfdb`^]]\[[Z[^adgjkjhgedfmszynbWKHNTZ`fjkmoprsssttuutsrqpqtw{~|ywtuy}ulbY_s¼~}|ĸ{vqnlkihfipw}ú2224:?DIOSX\`dhklmnoppmkhecekrx~~xqkd^YTNIDEKRX_egc`]ZVVY\_bed^XSMGDCCBBBAA@??>?BEGJMNOPPQRU[bhnty{~wv~ytrpnligda^[XVVUTTSUX\`cgihggfeedccbabdfhikljigfdglrx~vk`UJGKOSW[_cgkosuuttttssssrrsvy|~|ywtuzwne\bwĽ~|z~̿|wsqomjhjpv|ź3336:?DINRVZ_cgijkkllligeb`aglrw}}wqke`ZVQLGBCINTZ`ba_^\[[[\]^^]YUQNJGFECBAABCDEFHJMPRUVUTTSRUZ_dinqstvwy{{ttz|unjigfeca^[XUQPQRRSTUX[^acefgghiijklmnoooooonlkigfgknrvzwog_WNKLNOPRV\cipvyxwwvutssrqppsvy|~}zxvtv||umflľ|yvzź~yuqqvzú5557;@DHMQUY]afhhhhhiheca_]^cglpuupje`[VRNIEAAFKQV[]^^__`_]\ZYWVTRPOMKIFDB@@CEHJMPRUXZ]][YWUSTX\`dhjkkllmotx}{vrrvzxqjc`__^^]\XUQNKJLNPRTVXZ\^`bdfhjlnqsvy{|zxvtsqomkiggiklnpnhc]XRONLKJHLU^gpy}|zyxwutrqomnpsvy||zywutw~|vpvĿ~zwsvzy|º6668<@DHKOTX\`dfffeeecb`^\Z[_bfimmhd_[WROKGC?@DHMQVY[]`bdc`\XTPOOOOPPNKHEB??DHLPTX[]`ceea^[WTSVY\_bccbbaachnsx}~~}}{ywtrppruxz}{tmf_YUVVWWXVROKHDDGKNRUWXYZ[\^behlosw|~zvsqomkigggfffda_\YWSOKGC?BNYep|}|zxvtrpmkknqsvyyxwvutw{ľ}ytor}ſ8889=@DGJNRV[_cedcbaa_^\ZYWXZ]`beea]ZVROKHDA>>BEIMPTX\aeihb\UOIGJLNQSRNJFB>?EJPV\`cehkmlhc^YTSUVXZ[\ZYXVUW]ciotwutrqoonnnmmnopqrspib[UNKLNOPRPMIEA=>BGLQVXXXXXX[_dinsx~zvsqoljheca^\[[[[[[WPJC<59GUcq~|zwtqolihknpsvwvuutsxļŽ|wqlnyǿ999;>ACFIMQUY]bcba_^][ZXWVTTVXZ[]]ZWTQNKHEB?<FMT\chknpsvtnha[URSSTUUTRPNKIKRX_elnligdbbdegikkkjjiie^WQJCACEGILKGC?;67>DJPVYXWVUUW]cjpv}}xvsqnlhd_[VRQTVY\_[RH?5+/?P`q~|xuqnjffhknpsttttssyżż{uohjuøƾ:::<>@BEGGDA>;9:@FLRX[ZYXWWY_djpu|}xvsqnlhb]WRMLPSW[^\SJA7.2BRbr}zwtpliedgiloqrrqqqpvûĺ|vpilvʾƾ:::<@DHLPSVX[]``_^]\[XUROLIIKMOQSSRQONMJFB>:67CGKPPMIEA>@GNU\chjlnprpjd^YSPQQQRRQONLJIKRY`gnqpoonmmmmmmmligeb`\VPJE?=>?ABCDDDDDDFJOSX\^^^^^^`dgjnquz~}yvtqomjfa\WRMKNQTWYXSNIC>BO[hu}zwtqnkhddgiknpponmlkq}ƽ¸~ytpr|ƽľ:::>>???ADFILNQTWZ]`bccdefghjklmnprtvxyxwvvusqomkie`[VQLKMOQRTUSRQONR[enw}yvspnkigddfhjmoomkjhfkxĽ}yvy»:::=CIOTZ]]]^^^]]\\[ZWRMGB=>==<<>DIOTY]^_abcegijlnomlkjhggffeefhjlnqqomkigd_[VQLJKLMNOQTVY[^bhnty}yvrolkigfddfhjlmmkhfcafr¸ûʿ~|ľ~¾:::=DKRY_ba`_^]\\[[[ZWPJC=658ABBAAA@CHMRW\__`aab`]YURNMNOPQRRRSSSTW^elszytojfa]XTQMIFB?><;98;DLT\dhhhggghknqsvvrokhda^[XURSX]bglnmkihfc^ZUQLJJJJJJNTZagnruwy|~}zvrokihgfeddfgiklkheb_\`my{wvutsrsx}½ǹŽɽ¾|~}:::>FMU]dgec`^\[[ZZZZVOG?80.26:>BEGJLNPMF>6/'*8FTbpurolif`XOG>63468:<=>??@ADHLQUY\\\\\][XUROLKMNOPQRSTUVW[bipw~}vpke`[VROLIFC@>;9749DNYdotrpnlkkoswz~}wqkf`ZTOID>?HPX`hljigfdb]YUPLJIHGFEJT_is~~}zwsokgeedddcdeghjkjfb^ZW[gtwnifdb`]`hpy½°ȼ½üz}½vt|:::>FNV^fifc`]ZYYYYZZVNF?7/-26:?CGIKNPRPIB<5.1?LYgtytpkfb\TLD=52468:<>>>>??BFKOTX[[\\]]\YWTQNMNNOOPQRTUWX\dkryzrlgb]YTQONLJIGDA>;8FNU]egda^[XVWXXYZVOHA:326;@EJMOPRTUTPLHD@CMWalvxrmga\UOHB;4369<;=BHNTY]^`abdc`]ZWTRQPONMMOPRTUZbiqyxpic`\YURPQRSSTSPMIFCFOXajsvspnkhinrw{xrlf_ZVQMHDDJPV\bedddcca\WRMHHKNQTW]gq{{wtplheba`_^]_cgkosusrpomqyyqlkigecflszʽȼ~~þƿsqx:::>EMU\dfc_\XUTUVWXYWPJC=76;AFKPTUVWXYXWVTSRT[bipwxqjc\UOJD?9438<@EIIEB>:68?FLSZ_acfhjjgc`]YVTQOLIIKMOQRW`hpx{tmf_ZXVTRPPSVY\__\XURNPV]djqspmkhefkpty~}xrlfa\YWTQNNRUX\_aabbbc`[VQKFFLRX^dlt|{vsolheb`_][Y\agmsy|}}~~~~wtrqponpty}ĿŻɼyyĽtry:::>ELT[cea]ZVRQSUVXYWQLF@::@FLQWZZ[[[\]^_abcfjnquywog_WOIE@<8349?DJOOIC=823;CKS[adgjnqqmjfc_[WSOJFEGIKNPU^fow~|zvoib\UQQPONNPU[`ekkhda]YZ^bgkopnkhebdimrw||wrlgb_]\[YXXYZZ[\]^_`ab`ZUOIDENW`irzzurnkheb_]ZXVX`hpw~{zzzyyz|ÿʽ|tu~Ĺºusz:::>ELSZac_[XTPOQSUWYWRMHC>?EKQW^a```__aeimquxxyyz{vmd[RIC?<9634;BHOUUME=5-.7@JS\cgkoswxtplhe`ZTNICADFHKMS\enw~zvsojd^WQKIIJJKLPW_gnvxtplhddfhjlnnkheb`afkpv{{vqmhcaaabbbb`^][YY[]_`b`ZTMGADP\htytqnkgda^[XURU_hr{¿˾woq{ɺwtz:::=DKRY`b^ZUQMMOQTVYXSOKFBCJPW^dgfedcbelsy|vlaWMC<:86425=DLT\[QG=3))3>HS]ejoty~~zvrnje]VNG@=@BEHJPZclv{uoic]XRMGB@BDFHJPYcmw|xtpmmmmmlkheb`]^dintyzuqmidcegikmkgc_ZVUXZ]_b`YRLE?CR`o~xrpmjgda]YVRNR]it̾|sjly¿ͻȿxu{===@GMSY_`\XTPKKMORTWVSPMJGHNTZ`ehfedcbels{|uk`VKA;987647>ELT[ZQH>5,-7AKU_glqv{{vrmhb[SLD=;>ACFIOYbluyrle^XSNID?=?ACEGMXblw|ywuttssrpmifc_`dhlpttqnjgdcfhjlnmid_ZVUWZ]`ba[VPKEJXgv~vpnkhfc`\XTPMQ]iu̿{qgiwͻƽzw|DDDGKPUZ^_[VRNJIKMOQSSRQONMNRVY]aba`_^]`ekqw}~}|{ztj`WMC>=<;::<@EINRRMHB=8:BJR[cimptx|{upje_YSMGA;9=@DGJPYbkt}xrlf_ZUPLGB@ABBCCHR[dnw{{{zzyz{|}~}ytpkgefghijjhgecbacdeghgda^[XWZ\_adc`]ZWTXdp|}wrnkhfc`]ZWTQNR^jv}rfhw½ɺº|z~KKKMPSWZ^]YUQMIGIKLNOPQQRRSTVWY[\]\[[ZY[_cglprstuvwsjaXNEA@@@??@BDFHJJIHFEDFMSZ`fknpsvxvpic]VPLGB=98<@DHKRZckt|}xrlfa\WSOJFDCBAA@DLT\dlrtvxz|ztnkigeca````___``aaba`^][ZZ\_acefeeddcgpy|yvsqnkhec`][XVSQOS_kw¸~regwŸž~|RRRSUWY[]\XTPKGFGHIJKMORTVYZYYYXXWWVVUUVX[^`cfilorurjaYPHCDDDDDDCCBBABEHJMPSX\aejmoprsurjc\TMGDA=:67;@DHMS[cks{|wrlgb]YVRNJGECA?<:8646:?DINT[cjry{vqmhc_\XUQNJGC@<9:@FLRX^emt{}vnf^VNLORUX[\ZYXVUUWYZ\^`acefhkptx}|qg\X[^`cffc`]ZXVUTSRQValx}wppv{ſrdewºý```_^^]\[YUQMIECCCCDDGMSY_eea\XSOMMLLLLLKKJJILT[bippib[SLIJKMNOLGA<613=HR]gmnnopqqqponmh_VMD:5543324:?DIOU\cjqxzuqmida^[XURNID?:55:?DHMT^hr{{pe[PEBFKOTXZWUSQOORVY]`bdeghjnu|seXJFLQW\bc`]ZXUSSSRRRWbmx|si`_hpx¾½scdw˿¿hhhgeca_^[VRMIDBBCCCCFLRX_ee`ZUPKHHIIIJIHGEDCFNU]elmhb\VPNOPQRSPJD>825@KVbmrqponmmlkkjie\SJB94432214;BHOV[`ejotuqnjfc`]ZWURNID?:658<@CGNYdny|pcWK?;AGMRXZWURPMNQTWZ]_adfhjowwj]PC?FLRY_a^\YWTRRRRQQValwyoe[[dmwĿ½uegyµ¾qqqpmkhfc`ZUOJEBCDDEFHMQVZ_^ZUPKFDEFGHIIHGEDCELSZagiea^ZVTUUUVVTPKGB>@IR[dmpmjgebabbcddaZSMF?:975425>GPYbgijkmnmjgda^\YWTROLHEA=98;=@BEKU`jtxl`TH<9?FLSY[YWUSQQQRSSTVZ^beiow|tkaXNECHNSY^`^[YWUSRRQPOS^is~zrjbckt}xkm~¹{{{yvsplie^XRKECDEFGHJMPSVXXSOKFB@BDFGIIHGEDCEKQW\bdca_^\[[ZZZYXUROLIKRX_flmid`[VUWY[]`^YTOJEA>;8527BMXdosqoljheca^\ZWUSQOLJGEB?=<=?@ACHR\fpy|th\PE96>ELSZ][ZXWUTRPOMLNSX^chov~|tld_YSMGFKOTX]^][YXVTSQPNLQ[epz{upjks{ÿ|qs¼~{wsojb[TMFCDFGIKLMOPQRQMIEA==?ADFIIHGEDCDINSX]``aaaba`_^]\[ZYWVUV[_chlke^XQKJMPTW[[XTQNKGC?;738ES`n|ysmga^\ZYWUSQPNLJHFECB@@@@@@AEOXaktz~{wpdYMA64CGLQVXVUSRPMHC>949IYixxne[VUTSRQONLJIGFEEEDDCBA@?>BKT]fotvxz|~~|zwurl`UJ>32:CKT\``_^^]ZSMGA;;8559=@DHIHGEDCDGJMPSW[`dimnljgeccdfhjlmmllllg]RH>428?EKQTUUVVVSMGA:4:L^q}obUNNMMMLKJHGFDDDEFGHGECA><@HPYajnoopqqqqponmh\QF;0/8BKT^bbbaaa]TLC;23=GR\fnu||l[K:49>CHMQSTVXZ[ZZZZYWTPMIEHR[eox}~~ķû¿¾}|||}}}~~yri`WOFCEHKMPPMJHEB?=:75237;?CGIGFDCABEHJMPTY]bglmjhec``dgjmqqoljhe`WNE<427=BGMPQSTVWUOIC=7=Oas|m_QIIIIIIIGFECBCEHJLOONLJHFIPW^eloonmlkkjjiihcYOE:009BLU^cbaa`_ZRI@7./;FR]iqv|wgWG83:@GMTWWXXXYYYYYYYWTQNKHKS[bjrx{˾ȿ~}}||{{{}ztoibZSKDADGILONKHEB?=;864237;>BFGEDB@??BEHKNRUY\`cda_\ZXY]bfjoojfb]YTPKGB>=?ADFIKLNPQSRMID@;AP_n~uh[NHHHHHHGFECBABGLQUZ]]]]]]_dinrwxvsqoljihfec^VME<44JVcovy{~~rf[OC@FLRX^`^\ZYWVVVVVVVUTSRQSW\afjpxĸÿ}|z{~~ytokf`ZTNHB@CEHKMMJFC@=:8753236:>AEFDB@><=@CFJMPRTVXZZXVTQOQW\bgmlf_YSLIIHHHHHGFFEEEGIKMOOLIFC@EQ^jwyncWLGGGGGGFECBA?BIPW^ejlmoqsuxz}}yuqmjheca^ZSLE>77?GOW_a^ZWSPKF@:5/3@N[hu|{{zyyumf^VONSX]bhhda]YUSSSSSSTUVWXY[\^_abitźǼ~º¾|yz~vvvsojea\WSNID@?ADGILLHDA=:765432369=@DDB@>;9:=ADHLNNOPQQQOMKIGIPW]dkjbYPH?=AFJNRROKHDA@BDFIKKJIGFEIS]fpzzpg]TJEEEEEEECBA?>BKU^gqw{~ysnifc`]YUPJE@:;BJQX_a\WRMHD@<8405CQ_n|~zvsolhea^[[`dimrqke_YTQQQQQQRUX\_bba_^\[apŷƾ}vvĽ|xykkkhd`[WROKHDA>=@CEHKJFC?;7543321369;967;?CFJLKJJIIGFDB@>AIQYaih]SH=32:CKT\]WPJC=:=?BDGHHIIIJMT[bipph`XPHDDDDDDCBA?>=BMYep|}voiea]XTPMIEA>?FLSY``ZSMGA<:75307FUdsyslfcddeefhlptx|zrjbZRNNNNNNQV[`ejjfa\WSZmпļ}umnzƿÿ}xx```]YUQMIFDB@><AA?<96448=AEIJHFDB@><;986:CLU^geYL?3&&3@MZfh_ULB958;=@CEGIKLNQVZ^bfe_YRLFCCCCCCBA?>=;BO]kyxohc^YTOLJGECACIOTZ`_XPHA95432218HXhyyof\Z_chmrvy|xndZPKKKKKKOV]dlsrjb[SKRiȵ¾vmcfu¼¾º~}wxUUUSPLIFB@?=<;9:=@CFIIEA=9644444468:;96337:>AEFDB@><:987548AJS\dcVJ>2%&3AN[ij`VKA6258;>ADGJMPSUWY[]_]YTOJFCBAA@???????FTcqxohc]XSNKIHGEDFKOTY^\UMF>6334445=L\k{wmbWV]elt{zodYMHHIIIINV^goxxpiaYRYo½̹Ľwofix½¾¾yzJJJIGECA?=<:9868;?CFJJGDA>;9:::;;<=>?@AA><974468;=???>>=<<;;::9=DKSZa`VMC:01;EOYdd[RH?6258;>ADHKOSVXXXYYYWTQNKHEB@>;99==<;:986545:>BGKLJGEB@?@@AABBBBBBBA?<:865667899:;;<==>>>>?BGMRX^]VPIB;;BIPW^^VNE=5258;>ADIMQVZ\ZXVUSQPNMKIGC?;7349?DJOXdp}{vpjfb^ZVSPOMLKIJLNPRTSNID?;9<>@BEKWbmy|ri`WWalvth\QE@ACDEFKU^gqz~~}}}Ͼɽÿ44445667876532138=BGLNLJIGEEEFGHIHGFEDCA?=;976554323579<>?@ABCDFJNRVZZVRNJFFJNRUYXQJC<5258;>AEJOTY^_[XTPMKKKKKKIC=82-.6?GOWalw}~~~~~|xtplheb^[XUSQPOMLLLMNOONKGD@==@CFIMS\enxypg_VXdo{|peYMA<>@ACEJT^hr{Ǻ¿)))*,.0245321/.06<:97530.,-047;>ABDFGIKMPRUWXVUTRQQQRSSTQKF@:4258;>AEKPV\bb]WRLGEGHJLMJC<5.')4?IT_jt~wmjkmoqsrpmkifda_\ZWUTSQPONMLLKKIGECA?@DHLPTZahow~}unf^VYfsymaUI=8:=?ACIS^hr}ķŶ¿ #'*-120/.,+.4;AHNQQPPPOPQRTUVUQNKGDA@>=;:841-*&',05:?BEGILNPPQRSTUVXY[\\YVTQOKFB=83258;>AELRY_fe^WPHA?BEILOLD;2)!#1?LZgs|uh[VY]`cghgffedca_][ZXWUTSQPNLJHFDDCBBACHMRW\afkpv{yrkd]VYhvvj^RE947:BDGILNOPPQQRSVY\_ba\WRNIEA>:73369<>AFLRY_ee]VNG@=@CFILJB:3+#&4AO\ju|zk]NIMRV[_bbcddedb`][YWVUTSRPNKIFDCBBBBAEKRY_fkptx|xqjc\`mzyodYND958;>ADLWbmxż±ÿ¿|zxwusu{ž!$(+./.-,+),17940/147:ADGKOSW[[WSOJFCBA@?>=<;:98>BGKPT\gr}ƿ˿¿¿}zwtqrx}"""#%&(*,,,+**)+.269=>>=<;:@DGJMPSVY\_b_WOF>62345568:=@CEHKNQSVVTQOLIFC@=:779<>@CGLRW\bfjmqtxsg\PD85DR_lz|ri_UNLIFDABGLRW\dozǾ~Ⱦ|xtpqw|%%%%&'(*+++***)*-02589876546;AFLQUVWXYZ\_adgiha[UOIDB?<97667889;?DHLPSVY\_b^ULB90,.03579953333346;@EJOSVY\_b^SI>4*&*-148;=@CEHJJKKLLMNNOOPLE>70)*3ADGKRX_eltɼ~y|urx~||¼²vx»{y|~ysnnty½++++*))(''(()**+,./0220.-+*,28?EKORUWZ]aejotyxqke^XRLF@:411111039?EKQUX[^`c_VLB9/,/36:>ADGJMPQQQPPPPQRSSTQJB;3,-6?IR\`^][ZYXYYYZZULC:1((/7?GOV\agmsriaXPGCDEFGGHIJLMNMKIGECJ\mǿyqh^TJ@638<@EIOV^emt}ķzuorspv}}yy~¼²stzx|zuooty~///.,*(&$$%')+,./1235420.,*+05:?CGILNQSX^ekqxxsmhb]WPIB;411000/29@GNUY\^acfc\UNG?=?BDGILPTW[_`_^]\[ZZZZZZWQKE?99?EKQXZYXWVUUVWXYZVNF>5--4;BIPVZ^bgkic\UNGDDDDDDEHKORUVUTSRQXftzslf^VNF=538=BGLR[clu}¸{wsoturyýuv~xrqvzĿ3332.+'$ #&),/123567742/-*+.258CINV_is}{xvtrouxu{½xx{utw{~88850+'"!%)-145689:9630-**,.02468:<>@FPYcmvyvrnkgaXOG>510/..-19BKT\bdegikkigec`_`````chmrw|~{ywtrpnljhfd`]YVSQQPPPPOONNMLMPRTWYWQJD>77=CHNTWWXXYYXUROKHFDB@>;9<:86543214;BHOU_mzǾ¿yh`dgjmqx|ĺÿ~}{|~~|yvy}~{xv{ľAAA=5-%"(.489;<=?=:62/+('&%$##%&()+2>JVbnssssssndZPF<6421/-2<97666666:AGNU[eq}xg`cgjnqx}źɿ~~|~}zwy~}zxuzĿ>>>:4-' "&+/2456898630-*)(''&%&(*,.06>GOX`fhkmorog^VNF@><9748AJS\ejklmnopqstuwwvutrqswz~~|zxvtrrtuwyzwphaYRNMLKJIIKMOQSSRQONMMMNNOOOMLJHGFGHHIJIFDA?DINSX]bglqpic]VPKHEB?<>EMU\dhijjklllkkjjjjjjjjkmnprtutttttssrqqpqtwz|}vohaZVTRPOMLMNNOPPQQRRSRQOMKJIIIIIIIIIIJJIHGEDCDHLOSW]fowzxusqnjd^XRLIJKKLLPV\bioty~ztruy|{xtqs{{sopqqrsv}{{¾ƽž}~~}~|zw}88862-)%!!"#%&')*+-..-,+*)))****,/258;=?ABDFJRY`hoqlhc^ZVRNJGCDJQW]cgghhiiifdb`]]^_`acccbbbabdefhikklmmnptx||vohb][YVTQPONNMLMORTVYXTPLHDCDFGIKKKKKJJJJJIIIIIJJKKP[fp{~vnf_WSTUVVW[agmsy|}~zvqlhhmrw|}xsnijpv||ywvuutsv{~yyɿÿ|}~}}{y~55541.*'$#""""!"#%&'))))))))*++,-/269=@A?=<:8=@CFILNMLLKJJKLMNONKHEB?DP]iu~uka]^_`abekqw}|zwusqonljgda_\^elsz{tnhbaeimquxy{|}~|zxvtuy|~zwx¹}}|||{}}}~|z22210.,*(&$"  "#$%&'()*+,-./269=AEE@:50+/;HT`msrqponkfa[VQPTW[^bdddddda[VPJDCFIMPTSOJFA==BFKPTY\`cfjou{}wrmieb^ZVSPLIFGMSY_ec[RJA97;@EJNPONMLKKMOQSVSMF@:37ESbp~wlghijlmpv|yslgda]ZWUTSRQPT]enwyqibZWZ\^`cgmsy|xutvxz}}{ywuw~Żƾvrtuwyz}}~~}{0000/.,+*)&$" !#%&(*+,./0248;?CFE?92,&)6BN[gnnnnnnkgc_[WVY\^addca`^]ZUPLGBADFHJMLGC>:56BFJOPPOONNOQSUWZWOG?703CRbq½|pklnprtw{{sle_[XTPMKLMMNOS[bjryzrkd]VSTVWXY^emt{~zwsrtvwyzzywvtru|Žzuwy{}~~}////.--,+*)'%$"!!  #%'*,./123569;>@CA=83.*,6@JT^ccccccb`_^\[[^`cehgb^YUPNNNMMMLKJIGFEB@=;8;AHNU[______bgmsy~{ywtromkhfc`^[XVW[_cgkjc]VPIFHIKLMOPQRSTUVXYZ\YQJC<59IZjzýymhknruxz{|}~}wqke`[YVSPMMPRTWY\`cgjnmhd_[VTUVWXZ]bhnsyzxvtrpprtvxzzxvtrpszþ¸....----,,+*)('&$#! "%(+/1235679:;<>?>;740-/6>ELTXXXXXXXZ[\^_acegjlibZSLDBGKOSWWRMID@===<<@BBBBBBELSZ`glmoqrtnaTF9++8ER^kl`UJ>3/37:>BHQYbksskc[SJHLPSW[^bfjmqtuvwxyyyyyyyywvusrqqpppole^WPIIOTZ`fhgedca^YTOIDK]o{odbhou|zrjbZVUTSRQPPPPPPT[biqxwne\SJGJMPSVXXYYYZZZZZZZ\^`bdfilosvyyvsolikt}xsw{ƽĿ¿|vtuvwxyyyxxxwy{~****+,./012346750+&!!',169;<=?@?=;964345678887777777777;EOXbkqrtuwxq`P@/1BSduvhYJ;,(.49?EMV_ir{zodYOD@CFILOSY_djptvy{}~zwtsuwyz|xoe[RHGNV]elnljhfc`[WRNIQcv{uu|wla_gow~zodYNIJJKKLMMNOPQV_gpysfYL>;@FKQWYYZZZZYWVTRPQUX\_cfjnruyyurnjfir|uosw{Ž»yqnpqrstuuuuutvz~++++,,--./1357972-'""(.4:=>?ABCBA?=;99:;=>?><97421112228BLV`jpqrstun]M=-0ASewxj[L=.*18@GNU]emu}{ocWK?;>ADGJNTZ`fkpsvy{~|xwz|~~tj`VLKSZbjqtqnkhea^[XTQXhyxrklt|wnedkryyncWLGGHIJKLMNPQRW_hpy~qcUH:7=DKRY\\[ZYXXWWVVUWZ^aehknqtwzyuqmhdgpyǸxsw{úŽº½{tqstvwxyxwvutvz~////.-+*)*-036972-(#%+28?BCDDEFFFGGGHHHIIJJHC?:61012345:BKS\diijjjkdXK>2%&5DRaprfZOC75=EMU]cgkoswti^SH=:=AEHLPTW[_cfimpsvy}~~~~vnf^VV\cipvwtplieba_^][`kw}wqkffnu|zuoosx|ypf]SNNNNNNNOPQRSW]ciourg]RG=;BIPW_a_\ZXUVZ^aeilnprtvxxyzz{ytplgcenv˼~ºŽľþ~|~|yvw{3332/-*'%%)-14883.)$ '.5=DGHHHHIJLOQSVWVVVVURKE>81/02457CHNSX[ZYXWVRLFA;56?HQZbd_ZUOJLU_hqz}zwtpmg^ULB97DJPV\^\YWUSWaku}voh`XPH@76ELQUX\_cglrw|}xtokdZPF<2/269=@CFIKNQQOMKIGHKORUYYVSPLIJPUZ_djouzyoe[QKJIHGFHLQUZ^_\YVSPPRUXZ]aeimquy}~{z|~xpiipw~vlbXSTVWXYYWUSQOOPRSTV[eoy~ywxyyz{zxvtrpoooooonljhfdccdddehov}{sldhxvnje`[VW\bgmr|ļɿuonmmlkntzºwmd______cmv~{ywutrtywsy~88851-)$ #'*.120.,*)*06;AFLSZ`gnrtvy{}{vpje_XQJB;4258;>ADGKORVWUTRQOPTX\`db\VPJDDKRY_fklnprtph`WOFDGILORUX[]`cdba`^]]_abdfghhiijlpuy~}{yy{}zrjjqy}tkb]]\[[ZYXVUSQPPPOONS\eox~|yvuwz|~~~}}}}}}}}}}~~~~|{zywz~xzxohc_[VRSX^cinw»¿øwqponmlov}zri`[[ZYXW\eoy}zxusqomklqvz|z}pmsy3332/-*'%$&)+-/0/.-,+,048<@GQ[enx}|{{zyuohaZSMID?:5479<>ADIMRV[]\ZYXWY]afjnlcZQH?>GOW`hkjhfdb^WPJC<;9779;=?AEJPU[`bba``_afkptyui]QE98BLV`jlga\VQKFA<725?JU_joonnmmnoqsuwwwwwwwtmf`YRQW]cinrrsstuvy{~vmmu}}wqmie`\ZYXXWVTPLHD@AIQYaimmnnnoqv{~tka[WTPMJKPV[afmvŷzvtrpnlpy|ungaZURPMJHLWbny~ytomllllkjhec`^^`cfikr}xljpw~qc`gnv}++++,,--..--,+++,--./012234=M]m}~xqi`WNE<7888889;=>@AELRX_ehhhgggjotypaRC42>IU`lmd[RH?952.+'-89@GNU]acegikov|wndZTQNKHEGLRW]bipx~|zxvtxxx÷~{xvtqolp{|tnhb\VRNKGC@DP\ht}vpjcabccdedb_\ZWVXZ\^_gsrebhov}zl]Yaiqy..../011220/.,++,-./0123567@P`qzqi`WOF=51234678:<>@BFMT[ahlkkkkknsx~ugXI;9CNXcnne\SI@:741.+1?N]kz}zwtqrw{~wlaVLA?ELSZ`efhjlnpsvx{~ypow~}wqkebbbbbb^WPHA::AHNU\`bdfhint{ľ~tkbYSPNKIFGLPUZ_dkqx~}yxwvutyþtuȻ~}|{ywuspnr|voje`ZUQMIFB>BNZeq}yrke^[]^`acb_]ZWTTUWY[]dq}oa]ciou{wj]Zbjs{7777776655321/.-...//158<@DLYfszpf\SMF?92/00112369940.----,.37;?CIPV]dknmmllkmrw|~voh`_bfjmqromkhfb^ZUQLNU]dksuqnjgdelry~wpib\WRMHCDJPW]cfdcba_`bdfikov|~xqquz|sjbYQPW^dkrtrpmkijpv{~vog`[YWUSQPRSUVX[`ejpuxxyz{{{zywvuw|ſľxz|vwwwwxwwwvvvx}zqjgc_[WTROMKHLU^gpxzupkf`^`acdfeb_\ZWW[_bfjq|}oa[^`begkqw||vpjjryKKKJGDB?<:98654210/.-1:BKT]ekrxuh[OB:7530.,+*)(')/49?DJQX_elonnmlkmrw|~zwsqrrrsstuvwxywrmgb]]`dhkookhda]_fnu|ypf]TNLJHFDFLRY_efc`^[XWY[]_afmt{|wrqux|xoe\[biov}~zvqmiinsx~~wqjd`^\ZXVUUUUUTW[_dhmonmmlllmnopqv~ƻÿz|ĺwqrstuvwwxxyy{~wnheb_[XVTRQOMPX`govxsojfa`acdfgfca^[XY^bglpw}oaZ[[\]]`ejpuz{ywuspsyTTTSOKGC@=<:986531/.,1EKRY`gnponmlkmrv{~{xuuz~ztnkkkkkkifb^ZVXaiqzti]QF@ABCDEIOUZ`fgb^YUPOQSTVX\dksz}zvsrtvxz|{qgfmtz{uohglquz~xsmhdba_]\ZXVUSQRVZ]aefdb`^\\`cgjmuǸ|ǿ~rlnoqstvwyz|}~|tkfca^\YWVUTSRU[bhnturnjfcacdfghheb_\Y[`flqw~}oaYXWVTSUZ^chloqrtuw{Ⱦ^^^\WRMHC@?=<;97520-+1?LZhv}}}}~~vfWG7(!"$&'))&$" '/6>FMTZahorponmlmqvz~}vwzvsokhd`\XTOR[dnw~pbTF837;?CGKQW\bhga[UOIGHJKMNS[cks{}{ywussstuuvy}sqxyphfjnrw{~ytpkhgedba_[XTQNNQTWZ]]YVSOLMSX^ditȴĿ~ûzlgilnpsuwz|~~|zyzyqhcb`^\ZYYXXXWZ_chmrspmjgdcdfghjifc`^[]cjpw}}oaXUROLIJNRV[_cinsx}˿ccc`[VQLGCA@><:8753206ESao~~|zqaQA0  #&**('%#!$,3;BJPV]cioqpnmljkoswz~xy|wrmhd`\XUQS[cks{xj\N@2.39?DJOSX\`ee`[WRMKJJJIIMU^fnwzywvtrrrrrssv}{y~zqifiloruz{wsokihfedb`\YURNNOQSUVVSQNKIKRY`gnzű½vidfikmpruwz||zxusuzxphdba_^\[[[[[[]bfkoturpmjhghijklkheb_\^elsztg_ZUPLGGKPTY]ciov|õccca\XSOJGDA?<9899:;;BN[gs|yvm]N>.!%)-//////39?EKQV[_dhmnmljighknqsvz~~yz|xuqmjgc`]Z[_dhmqnbWL@528>DIOSUWZ\^_^^^]][WSOLHJS\enwzxvtrpopqqrsv}}xqjhijlmnqv{|xurokhfecba_^\ZWUSRRRRRRRRRRRRV^emt|;ɾ}shdegijlnoqsuwwutsqprx~zrkfecb`_^^]]]\_djouz|ywtqomnnnoomjgda^`fmsztlf`YSMMRX]bhmrw|ccca]YVRNJGC?<88;>ACFMXbmw~zwsiZK;,"',1468:<>AFJOTY]_behkljigfeegijlnqtwz~~|{||zwurpmkhfccdefghd[RJA86DIOTZ^`bdfhihhhggfecb`_^^^^^^_abcefimquz~~}}||||}}}}}}|||{zyxwvsmga[UQMIEA>?ELRY_`\WRMIMYfs}oaSECMWblvyvsolihjlnprv}|ywutrqpmiea\XX[_beihd`\XTRSTUUVXZ\_adda_\ZXX[^adgjnqux|{wsokgdcba`_^\[ZXWWY[^`b`[UPJEFNW_goxο~~̻ǼŸ{wrnjecbbaa````____abcefkrz~xrnmljigfedcbaemu}}{zxuqnjfcdjou{tj`_gowƸ  S   8 h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f!@&`f&f:&Zfy&f4&Tfs&f.&Nfm&$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/alg/data/utmsmall_cubic_short.vrt0000644003401500001440000000342213614004466022270 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Cubic Int16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_cubic_2_float.vrt0000644003401500001440000000412413614004466022457 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Cubic Float32 ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_min.tif0000644003401500001440000000545213614004466020523 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kksskkcksckkcJRcZccsZcckksckck{s{νs{sksskkkkcZsccZcZckkkk{ks{{{{kέBŜssksckkkcZcsZZZckcckss{k{Zs{kZc{{s{ckscccccccZccZcZs{{{ssc{sťscckkkcckkccJZkkkk{c{s{RcΥ{kckZkkkcksccs{Zccssccks{k{ΥcccccsckZckk{ck{skkŵ{ťkkZkZcccsZc{kkckZkks{sc{ŔֽksZJZcccckkZskksΜ{Όksέk{skkkcRZs{{{{k{sZZcRZccΔ{ֽޔ{ZckRsޥ{{R{ń{{s{{{{sks{{{Zc{k{ޜ֔sks{{ks{ńZ{{s{{s֌{sŌs{ֵΔ֔Δ{省Ό{RksZkssΌŭ樂ֵ{Jc{Rcc{k֜ŔcνŜ{ksk{skksRcRcJZs{R{Ŝŭތέŵ{kk{ss{ks{cc{sZ{s{{{Jks{{scsks{ck{kc{έޔޥs{{skcccssksksskks{{ss{Μޥkkcskc{{{kc{{ccccsŔs{{֭sRckZZkssZRkckZ{skk{sŌkŔ{έcZRckcscc{skRBZs{{ssZJ:cRkkRkkcsc{ks{ŭd{ΌB)JJ)cJRkcscZcRRsks{{{{ΔޭksZcBRcJRckRZk{ZkJkJskk{k{{c:1:!JRBBcc{JJBJsZcsZ1sBcťksJcBBRR:BRB{JZBsJ{ZZs{ssc::kJkkRRJJBRBJ:sZcsBkcc{sksZ{ŭZckRJBR)J)s{k!ZckkJJckkssc{1ZR:J::JBZc:1RZJ!scsR֥ckc:J)!:1!J:Z:1ZZ1:BcJRR{csŜkZB1BJ))11J1:k))k)RBRZ{Zޭ)11!11::JJB1R{1BZ{s{sc֥{s)!)1)!:J!B!B1::1JZkksksks{ss))!1R!:JB1B)kZBJ1Jcck{k{{ks{!11):)1!::ccB1ZZ:JBRBkk{kks:ZRZZRB)cZRkcB)::cscJ1BRZJ:kc{skZRcZcZBZR{):)BRkZB1Zk:1:Jk{cZR1RRcZZZsZcBJ{k1BRZJ{JB:J!):JcR1cckB):1!1Z::kZkkkZkJBBcc{B::BB{R1J)1ZJB1BJJBB{Z::ZccZZJsskB{cs11::)B:c!B!:1:1J!1:1B:B1J1)cZcsR:Z:R1k{ZR{sBB1)J:{J)BZ!:B::!ZZk:1)s)))BRZ:kcRRJRJc{scJ1)Bsk1R:!))::!BZ1R:ZkJ{JssJJsRJBBJJ{skkJB)BckR1!c:)):ckZZ1)!!Z):JBRRB1Z:ZB1ssZR{:RZksR1B!cR!)!:)Rsk{)11J))RJ!BB:111sJcJR::cscRZgdalautotest-3.0.4/alg/data/utmsmall-int16-neg_Q1.vrt0000644003401500001440000000447613614004466021765 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Quartile1 Int16 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,120,0,3751320,0,-120 -3672.666666666667,0.008333333333333333,0,31261,0,-0.008333333333333333 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/2by2.tif0000644003401500001440000000111713614004466016572 0ustar rouaultusersII*@:=S     13.5 8.5 3.5 4.7609522856952 -1.6999999999999999e+308??? P0a*+ @@gdalautotest-3.0.4/alg/data/sieve_2634.grd0000644003401500001440000000047413614004466017604 0ustar rouaultusersncols 10 nrows 8 xllcorner 646973.105999974650 yllcorner 4645937.876000000164 cellsize 3.659999999972 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_min.vrt0000644003401500001440000000447413614004466022265 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Minimum Int16 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,120,0,3751320,0,-120 -3672.666666666667,0.008333333333333333,0,31261,0,-0.008333333333333333 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline_ushort.vrt0000644003401500001440000000343113614004466023670 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 CubicSpline UInt16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_mode.tiff0000644003401500001440000000761213614004466022540 0ustar rouaultusersII* zS   ^-32767^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|   &  F    &   &66 .  ..>  6F O..>W_> & xWp&6&..&6 &F66_gO&>x.g . OFFg& 6>.6 &__ O__.&._F&&6g. .Fg>666 Op& g.&&6.xO 6 . &&&&. _&&.  &. &F>  >  &O>.&6  F g_6_.F&.. &6W&6 F66 __.6 &.6p&. &W&_gW&6 .& 6 OFF W.g>  &.6 6F&>gFOFW &gg >_>_.> 6W &>x& ._> &.F &>_  _ >&. &&>> .& & &&.&W6 6_&6p. ... 6&Og.&> gdalautotest-3.0.4/alg/data/utmsmall_bilinear_2.vrt0000644003401500001440000000412413614004466021772 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Bilinear Byte ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_lanczos_2.vrt0000644003401500001440000000412313614004466021655 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Lanczos Byte ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_lanczos.tiff0000644003401500001440000076630413614004466021571 0ustar rouaultusersII*f B S   J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f!@&`f&f:&Zfy&f4&Tfs&f.&Nfm&$@$@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|ghijkmpsw||wsqqsvz~zrliimsz~xrnmnrw|~wpjfegkpuxxvrmklqzyqkhhkpv|{upkjjloqrqmida`bgnu{}wof\RH@<<@IUalstph]TMKNU^hpvz{{ywusqpoopqsvx{}~zuoidaacgmsy}}{xvtsrrqqqqqpomjhda]ZWVTTUVX[]`bdfggggfeca_^^_bflqvxyvsnkjlpw~}{zzz{{{{zyvrmgb__bhpy}zxwwwvtrpnmmnqtw{}zwuuwy{|{xutv|̾xpjhkq{ƿýhhiklnptx|{vsrrux|yrlijnt{}wqmlnqw|}wqkhgimrvyywsomnrzzsmiilqw}|vpljjloqrqnjebacgmtz~{vof]TKD@@DLWclstph^UOMPW_hpvy{zxvtrponnopruxz}~zuoidbbdhmsy}}{ywutsrrrrrrrqomkhea^[YWVWXY[^`bdfghiiihgeca__`cglrwyywsoljlqw|zzzz{{{{zxvrmhc``chpx}zxwvvutrqoooprtwz}|yvttvy{|{xvtw}˼|tnlns{ſühijkmoruy}}yvsstwz~~xrmjkot{|vplkmqv|}wrmjikoswzzxurpptz}unkjmrx~|vpljjlorsrokfcbdgmsx|}|ytnf^VOIEEIPZdmrsoh_WRPSYaipuxzywuspnmllmnqtwz}}ytoiecceinty}}{zxvutsrrrrssrqpnlifb_\ZYYY[]_bdeghijkllkjhfcbaadhmsxzzxtolklqw}{yyyz{{{{zxuqmhdbadiow~}zxvvutsrqqqqrsuwy{~~{wussuxz{{yvvx~Ȼxsqqu|ľüijklnpsvz}~{wustvy}|vqmlmpv{ztokjlqv|}xsommnquy{|zxussv{xqmlotz~wqmjkmprtsplhecdglquxzyvrmg`ZSOLLPV^gnrrohaZUTV[cjpuwxxvsqnljiijlorvy|~|ytojfddfjouy|~~|{ywvutsssssssssrqomjgc`][[[]_begijkklmnnoonligdcceinty{{yuplklqw|yxxyz{{{zywtqmhecceiou||zwvtssrrrsstuuvvwxz}|yvsrrtwy{{ywwyƸ~yvvx|þļjklnprux{~~|zwutsux|}ytpnmnrw|~xrmjikpv||yurqqrux{}~}{yxwy{{tonpv|xrmkkmpsttrnjgeegknrtuusplgc^ZWUVX]cjorqnib]YXZ_ekqtvwvtqoligffgimqux{}~{xsojgffhlqvy|}}{ywvtssrrsssttttttsqnkhda_]^_behlnoppoopqrstsqnkheegjpvz}}zvplklqw~zwvwxz{|{zxvsplifeegjoty}~|ywusqqqrsuwxxxwvuuvx{}}zwsqppruxzzzyy{µ~|{}½ļklnorux{}}{ywusrrtv{~~~|yvrpooqty}|vpkhhjov||zwvuvwy{~~}||||~wrprxzsnkkmpsuutqmjgghjlnpqpomkhfcb``acfjnpqpniea^^`chmqsuutrolifdbbdfjoswz|}}|zwsokhghjnrvz{|zxvsrqppqrrstuuvvvutrpmjfca`adglptvwwutttuwyzywtpligilqw||wqmklqx{wutuxz{|{zwuroljhghiknruy{}~~}{yvtqooprux{|}{yusqqrux{||zxtqonnqtwyzzz{~ƽ~}}Ļmnoqtwz}}zwtqpooqtx~|{|~{{~{wtrpopqtw{~~ytniffiou|}|{zzz{|}|ywwy~{usuz{tollnpsvvuspmjiiijkklkkjiiiijklmnpqqqqomjgeddfhknprrrqolifb`^^`cglquy{||zxuroljijlptxz{zxuqomlmnoqstuvwwwwwvtrolheddfinty}~|zxxz|~~zupljknsy~}xsnlmrxytrrtvy{|{ywtqomkkkklmnprtvxz{|{yvspmmnrv{zupmlmosvxywuromlmorvxz{{}{xy|ĺnoqsvy}{wsomklnqu{ywy{xx|}wrpnnoqtwz}|wqkgdehnu|~|{||}|vqnns{xvw|}vpmmnpsuvvurpnljihhggfffgiknruwyyxwuromljjjjklmnoooonmkifb_][[]`ejotwyzzywtqnljjknruyzzxuqmjhhiknqsuwxxyyxxwusqnkihikpu{}}{upnnqv{ztpnosz|vqooqux{|{ywsqonnnnooonnopqtvyz{yvrolkmrx~|uniggjnruvuspmlklnruxz|}|vtv}}|ùnprtw{{upmjikmrw}|vtv~wtuzztnlkmptw{~}ztoiecdhnv||{{|~zrkfeir}{yz~~xspooprtuvvusrpmkhfecccdfimrw|{vqnkjklnpqqqpomlkjihfc`]ZYY[_cinruwxxwuspnljkloswz{zwsnifddfimqtwxzzzzzyxvtrpnmmnqv{zurqtx}|wsqrv|zsnlloswz||zwurqqqqrrqpnmllmptwz{zwrnkjmrz~ulfccfjortsromkklnrvy{}vrsz|{}¹nprtx||vqmkjlotyzsqt||sprxyqkiilqv{}xsmhdcdhov}~{z{}xoga_ckv~||{wsqpopqrtuvwvtrnjgdbaabdhmsz|upkiikortuuspmjhgfedca^\ZYZ\_chmqtuvvusqoljijlosw{|zwrlfcabdhmrvy{|||{zywutrqqqsux|}xuuvz~~yvuvzxqkiilquy||{ywvutuuuusqnljjknrwz|{xsnkjms{uleaadinrttrpmllmptx{}|vv{}{}moqsw{~yuqoopsw|wqorzxpmpwyqjhimsy~|wrlgddejpw~~{z{||ume`^agq|~~~{xtqnllmpsvyzywsojfca`acglrx~yrlhghkptwxvsojfcbaaaa`^]\\\^adhlorstutrpmkighjnrw{|{wqkea_adinsx{}~~}|zxvtrrrtvy{~{yxy{~|zz|wojggjnsx{}}|{zzzyyxwtrnljiknsw{}}zuplkns{ulebbekptvvtrpnnpsw{~~ſlmorvz~~{xvvwy||uonqytmkowzqkikou||wrmhffglry|{{|~~~~~~}{wqkfbachnv~~~~~|wrlhghkpuz~~}ytojfcbbcfinsx{}|ysmheegkpuwxvrlgb_]]]^_`````acegjlnprsssrolifeegkqv{}|xrkea_aejpvz}~|yvsqqqsvz~}{z{|~~~voiffhlqvz}~}{xuromkkmpuy}|wsonpu{~vnhefjotxzzxvsrrtw{ƽ½klnqtx}~~~ysonqx|rkjnv|smkmrx~|wrnjhhjntz~|{{|}}~~}||{zyxwvtqnkigghjnrvz}~|zxxy|zrkebbflt{zuokgdccdfimqsutqmheccfkptvvtoic_[ZZ[]_`bcdeghijklmnpqrrqolhdbbdhnuz}|yslfbabflrw|~{xtqonpsx~{yy{~~}}|||}~~voifegkoty}|yvsponoqtx|~zvsqrv|~wqmkloty|~~|zxwwy|ƾľkmoqtw{|wroorxypjjnv}upnptz}xsoljjlouz~}{zzyyyxxxwvusqpnmllllmmnnoprtwz}~|yusrsw|{sib^^birz{uplhfdcdehjmnmkhebbcfkosutqmga\YXXZ\_begiklmmmmllmnprsrolgb_^`elsy||ytmgcbdhmsy}}zvrollosz{urqsx}~}}}}|||||}~~wpjgfgjnsx}~zwtrrrsux|}ywuvx|~yurqruy}}||~}|}þ¾¹ǾĽnoqrux{|xurpqtywokkov~xsqrv{}ytpmkkloty~~|ywuttttuttrpnlkklmoqrqpomllnptx{}|yuqnlnsy|si`[[_fpy{vqlhecccegijkigdbbcfkortspke`[XWXZ]`dgkmpqqqonlllmprtsqlfa][]ahpw{|ytnhdcdhnty}}yuqmkkmszyrmlnsy}{z{{|||{zzz{|~wqliggimqw||xvuuvxz|}zyy{}}zxxy{~~{z{};¿stuvwy|}|zxusrqsv{~vpllpv~yuttwz~}yuqmkjknrw|}yurqppqrrrqonlllmoqstsromkjkmquxyxvrmjikpv}{rh`[Z^enx{vpkgdccehjlmkifddegkorsroje`\ZYY[_bfjmqsttsqnlkkmpsuurmg`[YZ^emtyzxsmhdcdhnsx||ytpliilrzyqljlpv|~{zyyyzzzyyxyz|~~xrnjhhilpuz~{zyz{|~~}}~~~~~|zyz|þûʹz{{{|}~~{yxvussssuy}}wrooqv|zwvvwy{~}zuqmjiiknsx}zupnmmnpqrrqpoopqrstttrpnlklmprtutqnjhgintzyqha\\_emv~ztnifefimpstroliggiloqsrokgb_]\]^adhlpsuvvtqmkijmqtwwuoh`ZWW[bjrvxvrlgcbcglrwz}~|xtokiilqy{tolmotx|~}{yyxxwwwvvwxy|~~ytpmkjjlorw|~~~{yxyz}ĽƿǴƿ~{ywusssstvx|~zusrsvz~~{ywwwwxy{|~~~}zvqmigfgjnsy{toljkloqstuuuuvvuuttsrqqpppppqqpoljhfgimrw{|zvpic`_afmt{~wqlihkouz}~|xsnkjjloqsrpmifca`abdgjmqtvvvsplihimqvyzwqjaZVVY_gnsutpjebabejotx{}}}{xtpljjlqxytqpqsvxz|}}}|{zxvutsstuwy|}yvrpmlklnptx||ywwxz|ý¯|zwusrrstvx{|yvuuvxz|}}}|{zywvuuuvxz|}|zvrmifdegjou{|uojiiknqtwz|}}}{ywtsrrstuvutrpnkihgffhjmptvvurnjfccdhlrx}ysnlmqw~{uollmoqssrpmjhffefgilnqtuvurnkhgilrw{|ytlc[VUX^ekprqmida`adhlqtwz{{zxtqnkkmqv||xvtsstvxz|~~~|yvspopqtvy|}zxuspommnoqtwz}}}wtstw{þ»üλxsu~¿~}{xvtrrrsvx{|yxvvvwwxyz{{{zxvtsrsuxz||zwsnjfddehlry}unjggimqvz~}yurrsux{||yuplheddegikmopqqpnljhgghjmpty~{upoqv~zsommoqstsrpomlkjjjklnqstusqmiffglqw{}{ume]XVX]cimonkgda`acfjnqtvxxxvtrpnnoquy~|xtrpqtw{~zuqnlmorvz}}|{zxvtrqpoooqrux{}{}xsporw|½¼òqc\_kƽ~}}}}}}}}|zxvtsrsux{~~{ywvuttuvxyz{{ywusrstwy{{zxtqmjgffhkpw~~vniffhlqv|{vsrtx}}xqjebabdgjlmnnmmlkkjjjjklmorvz{urqtz}vpmmnprttttsrpomlkklnprttrokgddejouz|{vog_ZXY]bgkmljgdbabcfhknprstuttsrqqqrtvy||upmmpuz|vplkknrvz|~~~}}}}}||||||{zyxvusrqpopqsvz}{|}unllpv|~~|}xaPIM]v~|zzyzz{||{ywutstwz}~|zxvtrrrtuxz{{zywvuuvwyz{zywtrpmlkkmqv}~unheegjou|~xutw{zrkeaabdgjlmmlkjjjjjkkllmnoqtx|~yursv}~vqmmnortuvvvutrpmkjkloqssrojfbacglrwzyvpib][[^bfikkjigeddefhiklmnpqrsttuuuttstvzwojjlry}wqmkknrvy|}}|{yyxxyyzz{|||||{{yxvtrpooqsw{~||zqkijou|{xvx}ƾľ||~kTB;ASo´|yxwxy{|}}{ywuuvy|}}|||{zxvtrqqrtvxz{||{{zzzzzz{zzzzyxvtrqpsw}~umhddeimsz|xxz~{slfbabdgiklkkjiiiijkklmmnpqsvy|}~}zwtrsw}}upmllnqsuwxxxvtplihhjmpstroje`^_bgmrvvtpjea__`cfhjkkkjiihhhhhhhhijlnqtwyzywtqoptzxoigjpxysnlmorvy{{zyxvuuuvvwyz{|}~~|ywtqppqtx}~wojhjnt{|xtrsxƽƽ~~x_I94;Om´~zxwwy{~~|zxwy{}zxwxyyyyxvtrqqrsuwy|~~|{zz|~|xvvx}|tmgdcdgkqw~}|~{tnieccdfhijjjjjiiiiijklmoqstvwxxxwusrrsw|yrnkjkmoruwyzywtojgdegkostsojd^[[]bgmprrolhfdccefhjkmnnnnmmkjhgeddegjotz~~{uokjmt~yoifiow~{vrooqsvxyyxwutssstuvxy{}~|yusqqsvz~|uokikoty~~zvsqsxǿĴ~wtux~lUB53CO`p~ýŽ}yy{~}||~ƿ½ǻӿżŽ}wqljijmprrpjc\URRTZaiptwyxwvuuttttsssssrpnkihhilptxz||{yxy{|wroljjjjlmoppnkgcaaeks|{xvuw{||}tjaXQOQYfuweTHDITdtǽzz}{wtrruz¼ľĹ´ʿƼ}ungdbcfjlmkgaZTQPSX_gnty|}~~}|{ywusqponljhfdcceimrvy{zxvuvx|}wrnkhfeefghihfdccdhnu}{wtrsuz||{sjb\Y[alzzj[QNR\kzýʽ|{xrmihjowƻ»ĹýŽŶ{rha\YZ]bfhgc^XSPPRW^fmu{~yuqmkigecb`__`cgkptwxwusqruz~wqkea_^^`bdeffghkntzzurqqsv{}z{zsmhfhmu}pd\Z^ht˹}~vohcabfnyĽϿɻýξymbYSQRV[`cca\WROOQV]env{tnieb`^][[[\^aeimqstsqonorw~}sjb\XVWY]aehknpsw{ysonnqty~}yxz~|xuuvzwnihltýį}tle_\\`gq~ò³ŹƻDzvj]TMKLQX^bc`\VQNNPU]foz|skd_[YXWVVWY\_cgknopomllnqw}uj`XRQRV\bgmquy|~{snkkmrw}}xuux~}xuuy}xw}ľ̵{rjc][[^dmx~{ywvw|ƱƾϽλIJϽϹug[QKILRZafgd^VPLKNT]gs~}qg`ZWTSSSSUWZ]`dgjlmmllmosx~wj^UPOQV]elrw|xqljkotz~yussv|zsqw¼θyphb^\\_dlu|vqnkjlr}ǮvzӺ˺ʴ¬˶ÿֿtg[RMMQYckppjbXOJHKS]jw|oe]WTRRQQRSUWZ]adgiklnortx|wi^UQPTZbjrx}xqmlnrw}}xtqqtz~vtxüʵ~umgb__`dhnu}xpjeccgo|ƭ}rvǯ¼ɺŲؿ˶ŽĹŬ~ti^WSU\fqz~|thZNFDHQ^m}znc[WTSRRRQRSUWZ]`dgknrvy}ui_XUVZajqx}~||}{vsrtw{}xtqqrw}~οzqjeccehkosx}wmea_bis¬vx̵ɾѽнõ˲xxz{}|uld^]akwo]MC@DO_qwlb[WVUUTSRQQRTVY]bglrx~|ria]\^dksz~{yvuux||{{{}{vsqqsw|Ƚż}tlgddglqvy|}ƿxlc`afp}˽óſľƻʿοѹopqsuwz||zupjgiozu_L@@K]s}slgdcbbceghhfc_[XVWZ`fnv~|vqmjihhiknqvz{vpjeb`adjs}{yy{~yslfa^]_dlt|ywy}Ź̾zqieejsywy~zy{ľƿü³DEDDDDFINU^hrzseWJB@FSey{ne_]]_aceghiigd`][[]agnu||xsoljiijlosw{~~{xtojfcbchpyzvuwz~{uohb_^`emu~Ǽ~tonryȽȷ~tmhhmvwtw~üþþ½@@??>==@ELWcnw}|vndZPHBADM[l}{m`XTTW[`cfghhgfdb`_`chov}~{zyz{|{ywsolkjknqtwyz{{zzzz{{{yuqkgddgmv~yursuy~}xqkea`bgnw˺vkfgmvǿyqllpx|usu|Ǽ?>><;:9:?GR^irwwrj`UKB=;EO[fmpmeYK?5/.19CP]kw~seXNIIMSZ`dedb_^^_adhmrx~xqkgeglqwz|{xsolklnqstsqmjggimszysmjilpv{~|xsommoty~|{{{{||||||}~}ztniecdhov~ʴwldacjs|·xsrtzytsu{|z{~þǾƴƴ~úHGFECA??BHP[diidYK;.%"$-9HWdpz|ti^TLIJOV]bdc`[XVVZ_emtzzskfbbdiouy{zvrnjijmprsqmhb_^afnwysolmoruwwtqmjjknsy}zyxxxyzzzyyxyy{|}}{xsnhdbbekryιulgeglsy~¹zusuyxttw||xvx~{z½ſĴƲ|yƽQPPOMKJIKOU]cfd\PA1$".=N^ktz|{wqjbZSOMPU\bed`ZSNLNS\gqz~xsmhdbcejotwxvrmifegjmpqnic]YWZajt~ztpnnooonljgggjnsy~|ywvvwwxxwvuuuuwxyzxupkfa_^`djpv{ϼ~xtpnmnpsuwxxwvwy}Ƽzustw||wuux}}yx{|z}ſž\[[[ZYWWWY]adc_WJ;-"'4EVepvxvqlfa\XUTUY^cghd]TJCADMYhv}vpligfghknqtttqlgb``bfjmnlg`YTSU\fq{zuqnljhfdcccfinsx|~{ywvvvvvutsrqqrstuutqlgb]ZYY\agmsy̾yussuwyyxuspnlklmptx}~xtrrtx|~zwvwz|z}Ⱦź½gggggggfffffeb\SG:.&$'1?O_ksvsnga\XWWX[^bgkljdYMA97;FWizwoiffhknprtttroje_[YY\afjkje^WRPRYbmxzuokfc`^^`beinrvz}~~}{ywvvuutsrponmnopqqpmid_ZVTTUY^dks|Ǿ|qigjpx{skd`_aejoty~{vrpprtwz}}}{ywwx|yvy̼ÿ»ǼppqrtuuutsplgaYPF<4005?LZgptsnf]WSRTX\bfkoqpkbUG:1.4ATi}tjedglrvyzzxtpjd^XTRRV[afhgc]WRPQW_jt}~xqke`]\]_bfjnruwy{{{zyxwvvutsrpnljjjklmmmjgb^YUSQRTX^foypc\\cn{tg\VUW]elrvz~{xz}xspnnoqtwyz{zyxxz}~xuw|ϹŹȾøǷvwxz}}xqh`WOGA=Riukfgkry{voh`YSNLMPV\adda\WRQRW^gqy{tmgb_^_aehlnqrtuvvvvvuuuuuusroligfefhjkkjgd`\XUSSUX^eoywfYTV_nueXPNQXaiotw{~yrqv~{vqnllmpsvy{{{zzz{~zxx{}|³ϷȺúķǺ̻wxz}~ti^UNIGGJOV^elqspjaWOIHJPXahnrtsofZL=/'&-942259>DHKMOPRUZ`hq{}zupiaZSMJGFGJOU]dlquvtqmhdaabejpxyrlfa\XSPNNQV^govzzvpic_]_dlu~zwvwz~wgYOJKR]ky{vromlkjihijlosx|ϼypkjnw~xvx{}wvw}½ű~½ζʹzx}PSV[aiqy}~zsmiluŻ{gXOKJJID=5,&"#'.7@HOTWZ]`dinu|~{xtoha[UPLIHIKPW^gouyzxtniebbdhmt{~voic^YVSSTW[ahnsvwvsokhfgint{{wtqpprv|xk_UONR[guxqligfffhjmpsuwz{}~Ѿxpkkox|wvy~|rmlpyͼ|{þĬ|~³UWY]bhovz{ytootȵn]SNLJG@6+ &2?LU]begjmpuz~}zvqlf`[VROLKKNRYairx|}zvpjfddhmsz{tmfa]ZZ[]`cfjmprstuutsrqppsv||vqnlkjjlou|~tjaZVUX^gswohc_^_aejpvz|}{zyyzоwpllpx{wx{ticcjvz|þлwwźķ[]_aejouyzxust{нtcXQNKF=1# "2BR^gmprsux{}{zyyz|~|xsnhc_[WTRONNPU[ckt{~|wqkgfhlszxqjebabdgjkllllmosw{~~{wsqqu|ypkgedddegjov}vme_[Z[_emvvmd]XVVZ`is|~yusv}ͽ}vpmnqx~yxz}mb\^gvü|{ſƳwuzɾbcdfhlpuxyywwzѾxg[TPLE;.  #6IZhrx{|}~~ytnjhhkouy}~}zupjea][YWUSQQSW]dmv}}wqkgfjpw~~~|uojhhknqssqmjhhkpx~wqnot}{oga^^^_`bdglqw|~xpg`[XY]dlt}}ukaXRNOT]ivysps|}y{˾|vqopsx|yy|yj`\_iyĿ~ƾúʼyuv|Ǽghijlorvyz{z{~ɷvf[UPLF<.  *>Set~xqjdabejpvz|{xrlgb_][ZYXVTSTX]eow~xpieeipxzurqty~ytqopsvyzxtnhdcgnxzrlkow||th_ZXXZ\^`cfjnqtvvtpjc]YWY^foyzrh^TLHIOZix}tqt}~rkhjq{´{vsqrtw|~{y{wldcgrķ½˾ǿ|wvw|jklmoruy|}~~~¸oaXROLG?3''7K_q}vpkiikoswz{ytoid`^]]]\[XVTTW]eoyxogbadkt|~xqjfehmtz|ywvxz}~}ztlfa`dlx~unkms{zvw}~od[WUVX[^adgjkllkifb^[YY\air|~ztmdZPIEFMZizzvw|oe_]_gr˾|xutstvy|~|{|~wrprwȷ½Ϳzwwyʿklmoruy}pbWQNMMJE=4,((/:J\n~}|||}}}|zvqkfb_^^___]ZVSRTZcozxmc\Z\cltxyvoh`\[]bipv{~~~}}}~}xqjc__ckvyroosy~{wuv|zlbZVTUW[_cgikjhd_[XVUW[`gox{vrmf_VMGDGO[k}~~sh_YVZcr˽|xvuuuvxz{||}}~|yy|ýȷȻ|zy|ikmpsx}wi\QKHHKNONKFB@BIS`o~ysmgc`^^_aba_[VQOQWan{wj]TPRX`hmnkf^XSRSW]dkrw{~~ysmfa^^bjtzvuvy{}}{ywwzwkb[WUUX[`eilljd]UOKLPWbmx~wrmid_YRLHGKS`o}sh]VTZh}̾|ywvuuuvwy{}yqot}ɿŶƿvnknu}ƾgilptz~}}|zvof[PGA?@DKRX[\\\]`fnxypic`^^_acdca\UOLMT_m{vgXMHHLT[ab`\VQMKKNSY`hpw~ztmgb^]_cir{}|{{zzzz{|ule^ZWWX\agloojbXNFCFN[k{}void_[XSOLKMR[ft~vh\UWcy}zxutstux{uhadpƾp_RLNXi|||~dgjou{|vplgb[TKB;6466/++.4>JYgt;uja][[\^`cddb]VPLMT_m|udTF>;=BGLNNLIFDBBBDIPYdp|{ria\ZZ]`ekqy~{z|~{wsnhb]ZZ\ahossofZNFDIUg||voia[TPMKLNRX_hqzpe_akzpc^ewɾzvsrruzxdWT^tԽ÷º»hN:/1>Uq}tmighls|adhnt{xmaVLB90)%$(/9GWhyȹrf_ZXXY[^`bca^XSQRYcp|ueVI@<@?;5/+*.5>IRY\]ZUPLIHJMQW]cjpvy{|zwtqonmmmkifc_\XURPOOOPRUX\`ejosvxxwvtqlgb^]_eo}ui]TMIILR[gv~iVJDGP]kv}}xqh`XQMNS\k}xnfbbgoyù{wwzž»¿Ǿ˽zrlhda^ZTNIDA??AFO[j}__`acegkotzzupliikq{ɾ{fRC9434664.&&2@MV\]ZVPLHHIMRX^elrwzzxtpkgedegijjiheb_\YWUTTUVX[^adfiklmnopppnjfcacisƿ~sg\SLHFHLT`o}fRD?CN]lx~wof]VRPRXcr}umgdehow~zy{º}|ƺ¾ºú̾vmgb_][XTPMIGEEEIP\lYZ[]_aeinsy~~{yvvw{n[J=50/022/)!#0?MW]^[VPLIIKOU[agmruvuqke_[XXZ]adghihgeca^\ZYXXY[\^___``abehlnonlihinwzod[SLHFEHNXeu{fTGDITds~~ukaYSQRV^jxxpjecdhov~{ustzķ}{{½ʻwoida_]\[YXVUROMNS]lɼRTVX[^chnty~ù|paSF<621121/*$!+8ER[__\WQMJKNSY_dimpqplg`YSOLLNRV[`dgijjiheb_][YYYYXWVTSSTW[aglpqqpoqu|ukaZSNJFDEHPZhwwhZRQWcq~}qe[SPPT[ep}yrkea`bgnv}wsqrwɾ}zy{ú¾ƿĶ|vpkhfffghiigd^XUV]lLNPSW\biouz}}si_ULD?;8655430,))+1:EPZ`cb]XRNMNRX^dhklljga[UNHDAACFKQW]cgkmnnliea]ZXWUSPMJHGILRZbjqtvwwx{{of^YUQMIECDHPZfqz|tkd`bju{m_TNLOV`kw~ztmf`]\_emw~yurqsw|zy{~õ~}ž˽{wtrrtwz}}wod\Y^kIJGILOTZaipvz|}~xk`WPJGDCA@><:998779=BJS[bffd_YSPORW]chkkjgb\VPJE@=:::=AGNV^ekprsqnje`]ZWTPLGC@@AELU_iqvz|}~tia\YWTQMHDBCGNW`hossronot}yiZOJJPZfs~~zuoha\YY]dlvzvtssvy·{xwx|ƿzz~õ~pd]_kȳ˻CFIMRYaipvz{{{{~{k[OFA@BDGHGFCA???ACFKPW^dhjie`ZTQRUZ`fjkjf`YRLFB?<:8778;AHPYbjpuvvsojfa^ZVRLGB?>?CJS]gpw{~zlb\ZYYXVRLGCBCGLT\cinqsw|xgWMIKS`nz}yupjd^ZWX\ckt}}yvuuwy{ȼ}wttx~ǽϾɺzj`_jʵ±BEHLQX`hotwxxxy{t`N@757=DJMNMJGEEEGJNRW]chklkga[VSSW\bgjjf`XPIC?====<:99:>DLV_hpuxywtplieb^YSMHDCCFLT]fouz~pd\XXZ\][XRLGDCEIOV^elqw}wfWMJOYgv}yupkfa]YXY]biqy~{zyyz{|~~{ƺwssu{Ż˻}}nb`i~˶оDFILQW^flqtuuuvy~pYD4,*/8BKQSSPMJIIJLOSW]bgklkgb\WTTW\bfhfaZQHA=;::>ENV[^^[WSPOQTY_flqw{{vrnkigfghjloruwxxxwvwy}~ysld]VQOPTZ`fjljgb^\]`ekrx|~wka]_gs}xvvxzzxtnhc_]\^`ceedcabdjq{ytqoprw~|yzöýzvvy»qebiz˽TTTUUWXZ\^adgjlnqtw|w\E3)'+5@LUZ\\ZWTPLIGGJNU\bghgd_[WVWY\]\YSLD?=?DMW`gjjhc^ZWUVX\aflrx|wspnlkklnpsuvvvuttw{{riaYSOMLNRW^djnpoligfhmt|~{{~wngehp||wuvxyywslf`\[\_cgihea][]clxxqmkknszzwx}Ĺ{xx{ùýpgdkzZYYXWVVVVVX[_cfhjlotzºgP?524;DMUZ\]\ZWTQNLLNRX_dhjifb]ZXXY[\[XSMHDDGMV_horsqmhb]ZXWX[_els{}yurqpopqsuwxxxwvvx|th\SLHGIMSX^djnqrrpnmnry}wttw{~{vqmmqy}xwxz{{xsle_[Z\`eikjf`ZWX^iwwpkiilqw~{yy}ʿɻ|z{~¾zzȽ~qigm{_^\ZXVSQONORVZ]`bdhmt~üuaRGBBEJPUYZ[[[[ZYXXX[^cgkmmlid`][Z[\\\ZWSPNORW^fmruvurnhc^YVUVY^dlu}{wuttuwxz{}~~}|||~}paTJECFMT\cimqsttrqppsy~uolmpsvwvussuy~{{|}~~{unf_[Z\`eikjf`ZWX^huwpkiilpu|||ɾ̼}||ÿ|pkltɿ~slkp}cb_\YUPLHEDGKOSVY\agp{vi^WSQRSUVWXY\_adgiloqsuutrolhda^]]^____^]]^`cfjmprssrplga[VSQSV]dmu}zuqopsw|~}{xvvw{{m^QHDFLVakrvxyxvtqpoqu|ulgefilnqsux|~xpha\Z[_cgiifa]Z[`iuwqmkknquzǿ̻}|}wjdfpǿ¿wqpugeb^YTNGA=;GVjn]NEABHP[enuz{{ytnga^^dm{}ridabgnyznc\WVW\dmwysonpu{|rg_XSRRUY^djptwyxvspnnoquxyzzxwvuttvx{}Ƽǹ}{{{|~}x{¾ǻkhea\VOH@:6458;=@DJQZdq~wkc`bhrú|vqnljhffhnwn^TQU_kv}{rfZOHDBCDFHIIJIGD?;9:@KZm|l\OFCEKT_hpuwvtqmida`bhq}vme`_afnxxmc]YXY^dlu|ysmihkpwsg]UPMMPU\ckrx|}{wrmjikotx{|{yvtrqqsv{zx{ŸȽ}{{{|~~y{·žʽigeb^YSMHC@?@ACCDDGKQZer~yx{xrprx{uqnkifcbdir~o`WUZer~zm_SJDBBBCCCCBBA@>>@DKVdtxl_UONPV_gnsttqmifb`_`cipx~vmfa^^agoyukd_]]_bgmrwyywrmhffhlszsfZQKIIMSZcktz~}xrlihjou{~~|xtomlmpu||usv}µü}|{{|}{uwº~}·ǻhfec`]YUQNMMNOOMJFDEHOYer~zrmjlr|~wrolifb_]^bkvqd\\cn|teWMGDCDDCA@>>?ADHNU^hr}~ztmfa__bgmrvwuqkfa][[\^aejnruutqlgc_]]`djq{zpidbbdfilnpqqpnligefgjot|qcVMGEFKQYbksz~}xsmjjmry~|vojgfhmt}xpnqy¸~||||}Ͽtnow{trsx~ĸŽffedca_]\[\]^^\XQJD@@EMYfs~zqib^]bkx~xsokhea]YWW[bmysidfmzzj\QKHGGGFCA>>AFMWaku}|xtqnnnnoooonoqtw{~|vnf_YUTUX[^`aba`_][YYXY[^bhnu}}tlhfgjmpqqpnljhgggghijjlpu}o_RHBADJQZbkry|~|ytpmmqv|{skeaadkt~slimu}||}~̼|ngho{vnjhjntz~{yz|ŸſffffffeefgilmlibYOE>;=DN[ht}|tkbZTRU[fs|yuqnjfc_[WTQRU[doz}uompyoaVPMMNNLHDAAEMYguyrmhea^\[\^afkqv|wmbYRONPTX[[ZVRNKIIJMQU[`gmsz~vojhimrvyywsmheccehknoommmqw{jZMD??CJR[ckrw{|{yurpquz{rib__ckvzohfir}¾~||}~}}ȸyjccjvulea`bekqx{wuux}ĸǿhhiijjklnqtwxwskaUI?::?GS_jtz~}xph_VPLLQYdp||wtqpnlid`\XTQNMNQV^gpx~{wuuzsf\WUUVVTOJFFKUcu{of`\XVSQPPSX`ir|ym`UNJJMRWYYVPIC><=@FMU]dlsyxqljjmsy~}vohcacglquwvtqopu|tdUH@=?DLT]elrwz{{yvtrsw|{sjd`afnxvlecgnyľ~|{}{xvvyõ{ldcisvld^ZY[`gow~~{xwx|øŽllmnnoprtw{~}yqfZND=;>DMXbkrwyxuog_VOKILR[fq{}vqnmlkhd_YTOLJIJLOU[bjpuyzzyz|ujb^]_``]XQLKP[lzmc\XUSQNMMPU^hs~{m`TLHHLRX[ZVOG@;9:?FNWajrzztpmmnsyzrkfehmtz}xutv{yk\OD>=?FNW`hotx{|{yvtssw{}vojghls|tkdbdkt~Ľ~{z|ysonqxĽumknv{pf^XVVZair{üqrrssttuwz|~ztj_TKDAAEKS[cjpsusoibZSNLMQXajt|xspnljf`XQKFDCEHLQV\afkpsvy{~wnhffikkhbZTRVarrha][YWTRRTY`hr{}o`TKHHMTZ^^[TMFA?AELT^gpy{wtrqrty~~wronrw~||}}vl`TIA=>BIR[dlrx{}}{xurqqtx}}xtrsv{~tkdbchowľ}zy{woigjq|{xx|wlc\XWZ`hr{¾xxxxxwwwwxz{|{xsld\TNJHIKOU\biorsqmg`ZURRU[aipw~{wtqle\RIB=;=AGOV[`cfilosx|~vpmmosvvsld]Y\fv¹}tnkigdb_^_aejpv}~pbVMIJOV]bdb^XSONORW^fox~ywuuwx{~~{z{~zvph^TKD?>@FMV_hpw||xtpnmoty~umgcbejqy}xwy~vmebdlxtkc_^_dktǿ~}}{zxvuuuuuusqmic^ZURONOQV\cjpstrmhb][Z\`ekpty~}vndYLA9448?IS\bfhhhjlqv}~xspprv{}vnfackyĽ|zxvsqommnnoqtx~~rdXPLLQX`fijifca`acfkpw~}yxxz}|tlcZRJD@?AEKS[dmu|}xrnjijnsyyqjfcdglt||wux~vkc_ajw~vojhilrz·˄~{xurpnnnnnnnmkifa\WSPPSX_gnsvurnieccdgknqsvx{|qdVH;2./5?LXcjmmjhgint{}xsommotzvniio{½}{xuqnmnrx~sf[SNNRX`floqrrrrsstvz~|zz|zncXOGB??AEJQXairy}wqkgeehmt||uoieddhpzù{utw}wkb_ajx}yvvwzȿɿȿ{wsnkihhikmoqrrplf_YTQRV]elruvtqmkiikmoqrsstuvxz}rdTD6-),4AP_krtqmhefjqyzuojfddfjqy~vpos}}vpkjlqx}sh]UPNQV\ciouy||z{~vi\QHB>>@DJPW^fnu|}wpjebbdiox||ztnhedfnyúȼ{usv|xmd`cm|{xy}ʿ¾ɽ˿{vqlhedegimquxyxuog_XTSV[bjostrpnlklnprtttsrqppppruzrbRB4+(,6DVfsyzungbaelt||voha\XVW[ais~{vtwwpmnqw}{rh^UOLMPU[bjry|{|~qcWMFA@AEJPW]djqx}|vpjeb`aekt|ww{yrlfdfn{ij}|~ǻztsv|yngdhr¿{wvy~ǻĿ˾ǻ}ytojfdcegkotx|~}ztme]XVW[`fjmmljihhjmpstuutrpnkigghlqy|o`PA4+).9J\myxne^\_fnvz{ysld[TMIGHLS]iuzxz|xwx|ypf]TMHFGJOV_is||zz{~ui^UNIFFHLQW]cinty~zupkfcaachp{zttw}~wpjfhpιzx{µztsv{yqkjnyÿľ{z{ĸſ²}zvqlhfdegjnrw{}xqib]ZY[^adedca``beimqtuvutqnjeb_^_ciqx~uj]OA5.-2?ObsynbZWY_gostqkcZQHA;89=DO\iv}|}|umdZQIC><=AHQ\hs}}{yxxy{}|riaZURPOPRUY_dinrvz}|yuqnjfdbcfmvxssv}}uoklu{z~ùzutvzzspqvſøſɺǼ}|zwtqmjgffhknrvz~}ysmgb_]\]]^][YWVWZ^chmquwwvsojd^YVUW[ahntwxwsmdZNB8228EUgwyl_VRTY`gklic[RI?70,,/6AN]lwyri`WOF=62039BMZgrz}|{zywvvvwwwwwxzvkb\YXXYZ[\]_bfjnrux{}}}}{ywutqolhedfjr~vrrw~|vrs|ǭzwvwz}~zwvy¯ɺľĶ¹tsrpnkigefgjnrvz}~|yupkgca_]\ZXUQONORV\bhnsvxxvrle]VPLLNSY`eikkhd^VLC;78>JZjxvi\RNNSY_cdb]VND;2*%$&,7ETcpz~ume]UMD:1*'(,4?LYeov{}}|ywusqonoqsvwwusrsv}zy}tf[TRSX]bfhiiijloruxz{{{zywvvvvvtqnjgfioy{sprx~{}˲Ľ|yxxy{}~~}||}Ϳؿ|{¼¸Ǿjihgfdcccehlquy|~~}{xurnkheb`]ZWRNKJJMQV]cjpuxzxuof]SKFDEIOU[_aa_\WQJC>;=CN\jv}zpdXOJJMSX\]\YSLD<3+%#$*4AP_mx~|{{{}zqib[UMD:0(#!$+5ANZdlrvwvtqnkhfgimswyxuqmkmtzqnrzxhZPKLQZckqttsrqqsuwz{{zywuttuwyzywsojhinv~uomqx͵ü~{yxxyz{|}~ͽپyzƿwtu{ÿ»»^^^^]]]^adhmqvz|~~}{zxuspnkigeb_[VQMJIKNRX^elrwzzwqh]RIB?@DJQVZ\[YVRMHC@?AGP\gpuvqh]SKGFIMRVXXWTOIA:3-+,09ERanz}|||||{{|~ule`[VPH>4*$!"'/9EPZcjoqqpmiea`afmt{}|wphddjvukgjr|}paTKHKS^jsz}}zxutuwyz{{ywusrsux{}~|xsnkjnt}vmhinx˷ǿ}{yxwxz|ʻؽyz~øyttyʾĽSSTTUVWZ]bglqux{}~~|{ywurpnmlkjifc^YTOMLMPSX_fmswywri^RG@=>CJQWZ[YUQLHEBAADIPX`gjie^UMGDCFJNRUWWVTPKF@<:;?FP\hu~zyz}ynga^\YUNF<3+'&).6?IR[bhlmlie`]\_enxzpe]Z_jzrgcelv~xl^SLKPYepz{xvvxz{|{yvsqqrux}}xrnmou}xmeackxƷǾ|ywvwy}ŷԾ{wutux~Ļ||þžGHIJLNQUZ`ejosvy{|}|{xvspnmlmoqqqnjd^XTPNNORW^emswwsj_SH@>@FMU[^]YSMHDA@ABEINSX[\[XSMHDBBDGKPSVY[[[XURPOPSY`jtzww{zoga^]]][WPH?72//26=DLU\chkjgc^[Z^gr}}pbWRT^nqgcdjqx|ztj`XSSXalw|xvvxz|}|zwtqqruz~|wsqsx~qe\X\gwɿ}yvuwzƾ~ytplkkmqxüºþ<>?ADGLQW]chloruxz{{zwtpmjjknrvz{zvqjb[UPMKLOU]fnsuskaUJCADKT\ac`[SKE@>>@BEHJLNONMKHFCBABDGJOSW\`dffffffgjnszxuw~wme_\\]`bb`[UMF@<::<=?BDFFFEDCBAAABBCDEHKOSY_ekosuwxz{}~vtx|zzz{{|||{xtnha[XXZ]aeggea[UPKHFEFIMSY`eiigc^\]blyq`PFDHSap{xrmjjlpsttqnjggimsz|xutvy}~{xwy|~|}xiZPMTcy~yutvz|vqmjfc`^^aejqy¼Ż.0248=BIPW]behknqtvwvsojeccflu}{qg]TLFCCFMV`hmnjc[SOORYagkjf^UKD?==?ACCB@>=<<=?ADFGHIJLPTZaipv{{uty{vtrqponljhea]YVSSUX]bfjkkjfc^ZWTRRSUY^cgjjhd`^_enzq`PE@AHS^hptutrqppqrsssqpnnoquz~yvttvzyiZPNUe}ytstyztolifc`^^`dipxɾù+,/159?FMTZ_bfhknqstrokfb``dkt~}sh^TKD@?BHOX`fihd^YVVY^dhjie^UMFB???@AA?=;::;>BFJMNONNOQTZbjry~xssy{toljiheb^ZVSPNMLMOSW\`eikmnmljhfdcbbbdgiklkifbabgoy}paSG@>@FMU]djnruwxxwvtsrqqrtvz}|wtstx}{k]TRZk·»ytqqv}λ~xusrokgdccfkqx̿ú*,.037@DJQX^bcca_]^_bdffd`\VPKFCA@@?>=<;;=@DJOTWXWUSRRUY`hpw|zsprx{qjfdcba]YSLGCAACEIMRVZ^aehkmoqrstuuuutttsrpnkgedeiou{~wncWMD>;;=CJS^hqy~}yvsrqrsuwz}~zvttv{~qd\[ctǽüyrnmqyİ{uokijmsy̿ľŽ,-/136;@FMSY^begikkkifc`]\]agow}{sjaXPID@??AEJPUZ^accddcba_][YWUSPMIEB?=<<<>AEJPV\`bb`\YUTTW]djptvwwxxz}}wqmlov~yne_\\\][XRJB<767;AGMRUXZ\_beinsw|~ytpligggjlorstspke]UKB93029DRbp|~yurppqrtwz}|yvuvyxnhhpºzqlils}̸wrpqu{Ⱦɽ/02357;?EKQW\`dfghhfdb_\[Z\_djotwwupjbZSMHDA@@@BEINTZ`dhiifa\WSQQRTUUSOID?<;;>CIPW^dilmlhc^XUTUY^cgiihgffhlrw||yuqmjhhimsy}si_WSRSVXWTMD<40/28@HOSVWWWX[^djqyyrnkjjjjihgfeffgfc]TH:/'&+8I]p|vqonmnoqtx{}|{xvuw|ĸyuv}ǽý{qifgmw|wwy~üʼ345679<@DJPV[`ceffdb`][YXXY[_cgjkkie`ZTNIFCA@?>?@CHOW_glnmh`WNHFHLRWYXSLE>::BFKQW\`bdddb_]ZXVTTTVXZ]_`_^[WSNJFC@>=<;<=@FNWajprph^RG@=?FNVZZUNF>::>ENYcltz}~|xrkc[UQPQSUUTQMHFFIOW_glnmie`\Z[]`dhlnppnke^ULE@>?CHLMLG?81./4>AGPYbhkjhc_\[]`dhkmnnkgb[SJB;767;@DFFC?:646@BFJOSX\^`abba_\YVROKIGFFGHIKLMNNLIE?940..04:BLValsxwrhZL?523:CLRTQLE@=?DLV`jrx|}|ytmf^VPLKKMNNLHD?<@@?>>?BHNU\`aa_][YY[^cipx~yvtspmg`WNHEEIOV[\YPD91/3?Pdw{tmiecbbcfjlmkgc_^ajwǸ˿vmgfir~½||~ºǿ9:@CFILMMJD=4,&#$)1;GT`jsyzwpfXJ=4/04AEIMQV[_ceeeedcbbbdfilosvy{}~|zywvsplf_WPJFEFJNQRQLF@=>DO]lz~vpjgdcbcegjkkga[USV^mſ²ʾyqllpx»zvvz¿Ľþ79;?CIOU[`ccba_^^^^\YUOHB<85456:>BGLOOLE<1&$0?O]jtz}{vmbUH=4.-0661.-.16;BHNRROH=0#$3EWht|yrh]QF<4/-.16;>@@ABDHLQV[_bdeeda]XSNJGFGILOQQQPOOPSX^fnw{tmg`ZTNIC>951,(''+3=IUajpsspnlkmosuwvusojd]VPJGGJPX`ipuvurmhc^ZUQMHDA?>@DIOW_gov{|xtojfdbbcdfhjlljd\RJFHO^p{pidcdhls{Ļɱ˽|z|ûȾtnpz½½}usv148>DMV_fklje`\Z[\^^[VNE;3,))+06?@CFJNSWZ]_``^\YUQNKIHHJMPRRSSSTVZ_elt}zqic]XTPLIFB>94.*),3?M\jtz|ytollnsx}~ysjaWLB:658?IU`jqttplfa]YVRNHB>;:=DNZgs}zuqlifca``acehkmnkf_VNJKR_o|nbYSQRU[dny~Ƿ̾¾Ⱦ¸upsxolow.26@DINSWZ\^^]\YWTROMLLMNPQRRSTVY]ciqyukc]YUSRQPONKF@93017BQaoy~ztnjjnu}~uk_SG<3..18BNZdlppnje`[WTPKE@<:;AKXhy~vokheca`^^_`cfjmonkf_YUV\gvsfZPJGHKR[gs~}~ȿս|zοúxuzžulhjq|,05;CMXbkpokd]XVWZ^`^YQE:0)').6>GOV[]^[VNF?::?IWft~~ti]QG>730026:?BCA>;878;AHNUY]`aa`_]\ZXUSQPOOOOOPQUY^els|vkb[VSQRSUXZ[ZVOG@;:>GTbox|{voifgmuwk_RG=6214:BKU^ejlkhd_YTOJE@=;>@CHMSY_cghgd^WPIB>::5//3;EPY_cdcba`abdgkpv|~xodXMB91,*+19CMUXVPE9.'%(0;HT^eknpqrrqplhb\VPKGDCCFKRZclu}{sjaYRLGEEHMT]fnuxwrkbZTSU[bhmmke`\[_gq{vkaYTQPPPQQQQRUX]aefd^VLC<769@KYi{|qjfeeda]XTQRUZbku~}tlfa_^`cgkpv{¹ººıwqnpt{οɾwlggmv,05;BLV_fjhc[TOMOTY]^[TKA:56;CNYafhgecbdhmtzzqg\QF<3,('+2=IU^a^UH9+""+8GUbkrvyz{{{ytng_VOHB?==@EMV`ku}zri`XQKFB?>?CJS^ju}zrjc_^`dghgd_ZXX\cmw|sjc^\]_aba_[WSRTX]bed^UJ@745DLW`gkkhebbelt~wlaUKA80*&',4@MYbeaWI9+"",:JYgqx}}xph^ULD>:77:?GR]it}xndZRKEA>;99:?GQ]kwwpkhhijigc^ZWX[ajrz~}wpidbcfjnonjc\VRRU[`dd_VK@859CReyxpkihgea[SMJIMU`m|ļʷrhcdisƾ¶ÿ~tons{359>DKSZ_b`[TNJIJNRVXXUPKHFHMU^ejlkgcaaelvui]QF=5.*(*/7BMX_b^UH:.&$(2@P_lw~|umdZQHA;6435:CNZgs||rg\QIC?<:8667=COau}uokihgd_YQKGHMUbpÿƻμsg`_dn}ùȾ¿xtsw8:=AFLRX\][WQLHFGIMQSTTRPOPRW\bgjjhd`^^ahq{th\OD;3.,,.3;CKRWXUOE;3//5>KYgr||umd[RJC=841026?JWer|{pdYOGB?=;97569?HTanz{wqkfcabdgjllkhecbcfkorsrnhb\XWY]bffc]TMIJR_q{vrnkiheb]VOIGHNXeu¾¯uf]Z_j{Ž׽¹}xx|>@BEIMRVYYWSOJFDDEGJMPRTUWY\_beffeb^[YZ\ahow~~ui]PD;400159>CFIKKIEA=;<<<>AEJQX`gov|xqh^TJB<864431125:768?CHNV]cgihfb]XTRPPPPPPPQSW]emtxyumbVJA<;>BFHGC=7201572001233459@JVboy|tkb[VTRPMHC>9657;BJT^fov}ui^UNJIJMRWZ]\[XUTTUY\`cefghijknptzudWPNQW_dhhfa\WRMIHINWdsxpjils}¼¿½n^WZexĺ]]]]]]][YVSOKGD@=;;<@FMV^ejkid^VPLJJKLLKIFDCFLU_iqutof[PHDDGLOPLE<3,),3?M[hqwyyxwwwxxvqjaVJ@60+*+-0368@ELSY[[WSOLLOSY_cefffgimsztaPE?@FOYafge`[UPKHGINXeutg]WW]hvſijqaY[fy¾ÿkjjihgec_ZUQLHD@=;:;?ENW_fjjg`XPIECDFIIHD@;9;@IT_ioqoh`WQNNRVXXRI>3,)-7EVfs|~ztommnonke]SH=4-)''*.38?EMU]elquxxvsojeb_]\YVPJC=72.-.17>GQ\hu}kZJ?758>GPX[[XSNJIKPV[_bbbbdhnwr_N@747?JU_egea[UOJFEGLVdtzj[PKLTbrľ½ĵtd\^i|ƴ½yxwvusplg`ZSNID@=;;@DGHFC=856:ALWaimmjd_ZXY\_a_YOD9205@Oaq|}tjc^^`ceeb\TJA80+'&',3;FQ[dlqttsqomjgeb`_]\YVQKE?82-)''+19CO]kz}jWF91.19CNW]^[WRNKLNRVXZZZ[_enz~m\L>4//4=HS]cfea\VPJECDIR`qxgXMGJSasſµwg`bm¿ɹه{voh_WOID@=<=?DJPW\`a`[TKC>;;>BFGGC?:769?GQZbgjjhfdcdfhhe_VLC>=BM\lyvi\RMMQW\``]XQI@80*&&*3?M]kv}}xqjea_^]]\[ZYWTPKFA;5.($"#'.8DSbr{hUC5,)-5AMW_ba^YUQNMMNOOOPSYbn}ygVH<3/.17@IS\addb^XQJD@@DM[l}zj[QMOYgxýþ¿½zkegs½ʿľΒxodZQJD@>>@CHMRVY[ZWRKD>989;:;?ELT[aehjkllmmmlic]VPLMS\iu~xk[LA<=BKSZ^_]YSKA8/(&)3BUi{{ncZUSSTVVVUTRPMJGC>92+%! "(1>L\jwveR@2)'*3?MXaghfb]WRMIECCCFKT_n~ydQB60-/38?FMT[`bcb_ZSLE?=@HUfw~qd\X\erøĺ|pkozƾĽÿ}||}›~th]RJDA?ADHLPSUUTQNIC=8657>@DIOU[agkoqrrqomifb^\[]cjs{ym^M>4/17AKU\`b`\UK@4+'*4F\s|k[PJHJLOQQPNLJIHGFC?92,'$%*2>KYepw|~|paO?1(&*3@MZdknmjd\TKC<878=EQ_o}gQ?2*)-4;CIOSWZ]`bb`\UNF@=>DP_p~ypkimuļϾ~vsx¼¿¾~{zz{|~vi]RJDAACGKORTSPMID?:63236;@EIJJIFDBAACGKQW]dkpstsqmjgeddfhlpty{zvm`QB5,)+1;FPY_cdb\SG:/*+6Ia{{gTHA@BGJLLKHFEEFGHHGC>83004;EP\fmqsrqqruxzysj\L=1)(,6BP\gnrrnh^SG<3.-08CQaqoXC2(%)13-.9LexbOA;;>DHJIFC@?@CFKNOOMIFCDFLT]ekopolhffhknnjcWI<1++09FS_ipssng\OA5+&&,6DUevwcM:,&'.:HT\aa_\ZYZ[]]\XSMHEDFKS]gpw}IJ~}}}|{zzyyyyz|yncXNGCACFJNQRPLF@940,**+/39?DHJJIFDB@ABEIMSY_eijifa[WVY^fov{|ztkaWME>853347;@FMSZ^`^WMA713=Ofs\I=78=CGIGC?;:;@FMTY]^^]]^`ejptwwtpkfb`aceeb[RF:2./5>JWbjoqojaUG9-$!$,:K]n}|lZG8.+/9GU`hjhd^ZWVWXYYXVSPNLLLOSY`ir}ºѾ}~Ƿ½~}}~|yvuuvy}xoe[QJDAACFJNPPMHA:4/*(&')-28>CGIHFC@>>?AEINRW\_aa^YSNJJOXcnx||uk]PD<88:=@ABA@@AEJPUYYUMC;68AQf{kVE:68>DHIFA;768=FPZdlruxz|~}vohb_]]^]ZULC9303:DP[djmmiaWK>1& %1AUhx}qcTG=88>IVclrrng_YTRRSUVWXZZZXUQMJKPYgwȷ|tonqv~˼¿~{z|ytrrty|xrjbZQJDA?@BEILMMJD>71+(%%&(,28>CFGFC?<::<@EJNRUWXWUQKE?=?EP]kuzwn_N>2-.5>HOSRMGA=FSdusbPB:7:@FIIE?8436=GTbo{~umfa]ZYWTOH@9448@JU^fjjg`WL@3(! )8L`t~rf[RKGGKR\gqwzwqh_WQMLLORV[`dge`WNEACL]sпʾticbfo|̿|yy|{tppt{xvtqmic\UNHB?==>ADHJKJGB<50+(&%')-28=BDEC?;867:>DINQRRQNJD>8325ACB@<84337=?BEFC?:535;EScuwnf_YTPLHD?<;=BJS[aed`XOD9.& (6I^twh[TQTZclv~~th\QHB??BHQ\hryztgWH>BFIJJHD?:520//03594+$ $-<97432247:62/-.037;>?@?=:741.,-18CO[cd_TD3& #/BViuxreTC4*&&+2:BJPUY\^][XTQONMMMKHDA=:631149BM[k}vnf_YTPMKIFEEGKPUZ]]ZUME<4,'$%*3ARexraQHFLYj}qbTG=6337?JWer|~vj^VU\mùپȶyldcivºǻľ~{{666556654310//149?EKNPOMJFC@??@ABBBBA@>;851.-,-.025678887654458>FPX^`\SG:1-0:J[irsmaQA3*&&+2:CLU\adda[TMHFGJNPPMG@81+(),4>KZj{yqjd^YVSQOMKJJKNQTVXWTOIC<61.,-2:FUeuvgVHABL\q|m]NB81./4ELPSTROLJHHHIJJIHFC@=:7520.,+**+,-/257:;<=>?AEKQVZ[YSLD?=@HR]fkjcXK>3,()-32(!!)5DUgyyrlfa]ZWVTSRPONNOPQRRQNKFB>;8668BNawwgWI<3,*,2:EQ^jv~ζһ~zz|!"%(+.110-+*+/4;97542/,)&%%&)-28<@CEGIJLORTVWWURPNNPTY^a`]VND;3.,,06>GR\eknke[OE><@GPVXSI;-!)8K_rvolmpsvwuqlgc`][ZYXWVUSRQPONNLKHFDA@???@CGMU_irwxrgZLCAFTg~p`QC8/*),2;DO[fr}ҼľͶzvuvx|Ž $)-010-*)),29BJQUWWUSRRSUWXXVSOJEA><;;:840+&#!"%+18>DHLNOPQQQRRSTVXZ\]^^][XTNHB<620//27>GQ\ekmkdYNC<:>ENUVQG9*,=Qfzyh[SPSY`fklkieca_^\[ZYXWVTRQNLJHECA@?@ACFIMSY`hpw{ytj]RKIO]pxhXK?5.**.4FPZafhhgfdca_\[YXWVUSQNKHEA?<;;DIMOQQPOMKKLQW_fkmjdZNB80,*+,/02246;BIRY_a`[TKC=::>BFFC<4,'&)1>L]m}~jUB4,*/9EQ[chkkkjhd`\XVUUUUTROKGC?;7557;AJT_ju~unloxpaTIA:62137=DLT]gt¹¿įƽ||~ytplkkmqw~"',/10,)&%&*/6=BEFFEDEGLQW\`aa_\YVUVWXXVQKC;3.,,.28=AEHJKLKJIGHJPW`hmni`TE7+# #(,023458=DJQUXXUQKE@;99:::8531149AJUamyp\H6)"!'1>KWaioqrqmg`ZTQPQRSTRPLHC>830/15=IVfupbUKC>;988:>DJRYbmzŽ}~ðƿŶľĿ{vqlihjnt|#',./.,(&$%(-27;==<;;<<=>@CGLSZakvʿ|vux~ñ½ɵ}Ǿ~}~~ztnjhils{ "%(+---+(&%&(+/356532126;BKSY^abbbbdgjmnmid]TLE?;87778889:;=?@BFKQYahkibVH7)&-3789:;=?ADFIKMNONJD=4-'%&+3=HRY_abcehlpssndWH8+"$.:HVcnw|}zsj^SKEDEHLOQQOLHB;4-**/9H[q¸zl]PE>:9:>BEHLQV]dlvͿuonr{µü~~̵wuzķywwzxqlhils{$%%&'()*++*)(''(*,/121/-+*+.3;CLSX\^_acfkotvwupjbYQIC>:742100136:=BGMT\chig_TF8* #+39=@BCCDEEEFGJMQSTQKA6,$!")5CP\dggda^^`ceebZOB4)"!'0=JWdox}}zsh\PGA>?CGKNOPOMIB:4/.23*&%'-4;BGLOPRRQPNMMNQVY[XRH<0'#$,8FU`gigb\WVVY\\ZSI>3)#"$+5@MZeovzzvoeZNE>;;=AEIMPSSQMF?:93+&%)0:FQ\fmrtrnh`VME>:88;?DJPVZ\ZVPKIKQ\k}zri_UI>4,'&',4=HQ[eoyȼui_Z\ev~ohip{zvtsuzǾɲƶujisǽ¾}yy}vqoqv}~|yy|}zy|?=:62,&!!',269;<;851-)&$$&*05:<=>?BHQ\ivwk_RG<3+$")2FOYagigd`]^bju{tle^WOF=4,'##%*23*"!)3?JV_fknnmkjjkllkifcaachoxytrpomjf`YRLHGGILOQQPMIGFHKPUYYUNE;3//4CEFDA>950,(&%%')*)'%%(.9GXixtgZMA6,#!*5ANZdkopponoqvz}~}zuqoosz|xtqolhea^ZXUROLJHECAABFKQWZ[XRJA:66;CLU\``^YTOLKLLLJE?82/05>L[jvzrkd]XRNJFC@=:63/+)''').5?JVdt¸ŹzgXNKMUaqytu|˽źȻż÷xuyzwwz~~xsppv|wvx}|vrqsyMJE>6,"#-7?DGGFC@<83/*'%$$$$"  &1?O_o|wk_SG<2(!$,7CP\fmqrrqqsw}|xxz|xtrqpppolic[TLFA=;;=@EKQVZ[ZUOGA>>BHPW[][VPKFDEGJLKGA:3//3=JYiwwmcZRLFB?=;975420.,,,,.057.$'/6;>@@?=;840,'$"! #(/7ALV`jrx|}{vpg^SI?6/++-3;EP\fmsuvvvwy|~|{{~}yvuvy~}qdVKB=;;=ADHKMPRSTSRQOOOOOONMJGDA@ABEHJJHD?:768>FQ\hr{ui_WQMKIHGDB?=;9889;>BGMU^hq{{rlkntz~}ytsvzj_Z[`it}ȹ˹ĵ|{~}z{~|yxzztonpv»HEA<6/&").368998752.+'$"! !"%(,059>CIPXbksy|{xskbXND<7447=EOYckquxxxwvutrqqqqsuwy{}~}{ywusrru{|n`TJDAABDEFFGHJMPSVXXWTPLHDB@@@ACEFHIIIGEB@>>>@EKRZbjs{|rjeba`_\XTOKGDBAADHNU]fow}pf_]`gpyztoos}umihkpw}}żоɻ|yxxz}|z{{tonpwB@=:5/)#"&),/01210/,*'%#""#&).38;=<;;<@FP\hsz}wpf\SJC?<=@FNW`hotwyxupke`]\]afkoqqpnkigffghiijjlnszxj^UNKIIHHFCAABGLSY^_^YQH@:77:?CHKLLKIHGFGGGGFDDDFJOW`jv~}}{wqjc[UPMKLNSZclv{qf[SPQYdp||skggks}|ywvwy||z{Ųúyspnoqtx|zy{{upory<:9630,'#!#&(*++,+*)(&%%&(+18>CEC?94016@N]kwyqh_VOIEDFJOV^elquutoh_VOJILRY`dfd`[UQNMORVZ^`cfjpwti`ZVSROLHC>=>CJS\cec]RF;4027>FLPQOMJHGILOQPMHC>;;>DN[k{žvkc\XUVY_gpz|vsqpmic[RJFFLVcr~}rh_[Z^dlsz~{yyz~{wwy~̻þýxngeeimsx|}yy||vqpt{544310.+(%!!#%&'()))(((*-17?FJKG@6-'%)2ARcq{}vog_XROMMPTY_eimonkf^TJB>=@FNTXXUOG@;9:>DKQVZ]aekr{{skfb^[XSMF@=>CKU_gjh`TG;2.06?HOSTRNJIIMRWZYTKB81./6BRdxúwme`^_cjr{wnf`\YWTPJEAADLXes~zocYRNNQV^foy|wttvz}~~{xussv|½ŵ|}xlebdiou{}zz~|wssv~///////.-*'#  "$%')*++,.16::CGIGA7,"#1AQ_ipsrpmifda``acfikkjfa[UOJFDBA@ABCCB@;5-&" #)3?JSY]^^^_bgov}|ywtqlf`YSNNPV]djmlf]SIA=<>CHLOPPONPSY`ehe\O@1'"$/AWp»ƾ|ogeglt|}ukbXPHC?==>ADIOV^fmruusnh`XQJFCCFKRZdmu{}}yuokijlpsuuspmlmqw|wtqpqu|ƿ|}}~~{ywx|%&')+.02442/,'# "&*.1468:>>>=:61+% %.8BINQQPOOQTY_flsz~teSB4,+1;840,)&$$%(,17>?CJR[eoyvcL7&);Pcpsm_M:)*7FVepwxtk`UKDBCHOV^elrx|~|zwtrommnqsuvsmeZOFA@CJS\elqttpi^QC823>PiǾweZW\gt~qcWOJIIKLJHDABFO[jxscTHA>@EKQVZ[\[ZXURPNLLLNQUZ_flruwurnifegmuvjb]^bjs}Ǽƾǻľſzxy||tmihhjmoqrrsstuwz}&&'()+-/258:;;95/(" &-4:>BCDCA>:630.--/02356776420./39AKWcozt^E-%?BFJKJHFGLUcrn[I;327@KT\`bb`\YUQMJHHILPV\cjpvyzxtniedejr}zmdabhqz˿Ƚ¹ºľ~{{|}tlhfgimprrrqqrtw{+++++**+-049=>>:4,$#*3:@DFFECA>;86568;>@BA?<940+'$$&+21*,3?LW_cdb^ZVSQOOOPRUZ_ekqw|~~{vpjeccgoz̺tlils|ƾĺwplklosvwwusrsux}}||}321/-*(''*/5;@@>8/&'0:BHKKIFCA?>>?ADHLPSSPJC;2+$ "(0:EP[fox~}teP9$&?[tmV@/'(1@RcsscQ@3*')/7?FMRV[_bfjmrw|~pbVOMQZepx|}ztmf_XTRSXbn}ynd\XX\dnzyqllqy~paQE<99=AFIJJJLPXbmv||uhWD5*&*4BO[aca\WRPPSW[`cgjmpsw{}wpjebbekuðwvzĽɻ̿ƾyvuw{~|xvuwz}zxvvw<:840+&"!"(08>A?91'!+7CKPQOKGCABCGKPV\aefc]TI=2( #*3?BFHJKKMPU[afhf_TG9.'(.:HU_ba[SLHHMWbnx~wpjebachq|ɷĹȻɿŶĹ{yz}~|ywuuuEB>:3,$ *4<@?:1'$0>JSXWSMHDCFKRZbjquxwri]O@2'!'/8@GMRW[^`_\UK@3("!'4FZkuwqeVJCDM]oraO?1($%*3BL]q~voida`aelvξķýŻȺ˺{|Ǽ|yy{}|~}{yxxxKHD=6-#$/8>>91( '4BOX\[VPJGHMU_jt||qcRB3(!!&.6>DIMOQRRQOLGA;50.05>JWbhie^UOOUaqxgUE8-('*1;DLPPMHC?<;>BIR\hu{wsrruy}~wngccgmtz}}yria[XY\`cec`ZUPMMOU\eoy}wqkfa]XTPNMMNOQQRQOLHD?:50..19DQ_imi`SE;9?Ne½|tmgb_^^agq}ö¾Ʒľǽʶ{xy{}|zwuw}÷|uqnnptz}~~~NKF?6,"*4:<81("!)5CPY]\XSNMOV`lxteTD5+$#&,4GSamuwrfWH=;CUnĸypic_][\^clwƻȺƿʹ{mfdfkoqrqrv}Ƚ~tmfbabfls{~{yz}{|LID=5+!'07961*%"$+5ALUYZXVTUZcmysdTD8.)),29@GKMNMKHD@=:9:>CHMQRRPNLJJKMRYbn{zjZK@8325:AIRY]^[UME?;:>AFNXdq|~qbSHFM_xʽ}sjc^ZXXXZ_grƽ̿ƻl_XVY_dilosxsia[WUW\bks|zvtsuy~Ž|vvzFC?92*!%-3540,(&',3EO\hurcTG>867;BIQY_dfea[TMGDDGMSY^cgkpu{~{yz}{ofcfo{zgTE<9CHLOQRQOLGDBCHP[fmoj`QB5-,2>M^mxxnbTH=5227>HR[bhlnnlhc]XTSUY^cgiihgfgjov}~|{}ridgp}q_PE@?BFJLMMLJGD@<;;@HSbp}ytrty~}{zzyyxxxwwvusrqru{}spr|ǿymcZSOLLMOSYakwǾпug\TQRU[bjr||qf]UNHEDGMVamz}yupligfghkpwyvyĴyleejt~zyy{210.+(%"  "&),./000/.-,.17?JWer~xnd[RJD?<;::;=?CGLPTWXWUQNLNS]it{{teR>-$#+:L_oy}{tj^QD8.(&)0;HVblswxvtqmjgedeimruvtpib\YY\cksy}~}}}vkfhp}n`UMIHHIJKKKJHE@;757CLXft~yvutsqnkgda_^^^afoz{qmnuqc[\bmy~yvstw~+***))((''''()*+-/1320,)()/9GYk|{pe[RIC><;;<===>?BFKQW\_`_\YXZ`iu|kU>+ (9MapxxqfWG9,"$0@Rcq{{wtrqqsux|}th]SLIKQZclrvyz{{|~zoiip{~qg^WRNMLLMNNMID=7324;DOZcilmmmmpt{uh]SKEBABDHMT\enwzvuw|ǿξwu}yslf`]\`fp|yphaZTLE>98AEKS[afihfdbdjsr[D1%$-=Pbpusj\K:,%4G[m||vttvzsdVIA=?ENXbjortvwxyz}}rkjpyxof_YUSSUVWVRKC;4115=FPY_ceghkntzɿ{ocXOGB@?@CGLRYaiqx|slhhkq|Ĵwnp{~{~}|zvpjeceku{rkd_ZUNF>758@L[lzvkb][\`ceec`]YVRNLKOWctpb[Y^huwdWPRZft}xtsv}))*+-/123320.,*)*,/11.+'%&-;Mcy|l\NB92-+*+.268:::318EUepspgYI:,! +;Nbt~wrpsy{l]NA968>HS]ejlmmnnoqsw}unlpw~vngc``bddc^VLB9436JYhvxmbYTSUZ^aba^[WSOKHHKS`q}k\SPT\hvqaVQS[gt}z{0012356787642/-+*+,--+*()-6DWko]M@5.)&$#%'*.12469=DMWajptutrprv}raRHEIQ]horoh^RF;2+'(-7EVgv~unijoy}oaRD:437?IT]dggecaabdhmt|wpnpv~}xsrrtvvsmcWKA;9?DMYeouvslbYRNORX]`a`^ZWSPNMOT]iyvbRGBBHQZdnv|zrkd`_bir}JIHGFDB@><;::962-)%##&+21)$###" !&,4AHOV]chlnonlkiijns{XWUSPMID@=<<=<:6/)#!"&/;IXgutcP?0%  #%$""*4>HS^gotvwutrqruzxrpqu}~uokjkmnmibXPKKR_o{iVF91./4;DOYcjmkf]RH@<;>DMV`irz}yurpqsvy~rf__do{xmfbchqzľzslgca``_^\XTOLKMQW]addb^YTOKJLPV]fp|ŭunoxϼzkb^`fnv}znd]XVUVUURPMLNRX_flopmib]YWX\`dffd`]ZXXY\ahr~wdTG@=>BGKPTX\`cfjmpsvz~Źdb`]YTOIC?==>><71*$!#*6EVgvwgTB0##'(%!#-7BMWaiosttsqonmosx~vrsyztqolhbZQIEGO[kz}lXE5*&'-6ALW`hlmke]SJA<9:>DLT]fov{|yuronoqtw|tmmr||pfa`dks|ytnkhgffec`\VPLJKNSX\^]YUOJFCCFLU`m}Ǭ{~¾|uu}´vh`]^cjry~}ywwzzof^ZWWXXXWUTTUY^cinqqolgc`_`cfijifb^[ZZ]ahq{}k[OFA?@BDGJNSX^djqw}ƶmkhe`[TMFA>===;71+&%)2@Qctp]I6%"(+*&"#*4>HR[cjoqrqpnkihikot{zuv~}vqke_WOIFHOZgt|zo]I7)! %/;GR\bgiigd_YRLE@=<=AHPZeow|~~|ytpmllmpsy{z~}qg`^`elsyzvromkjjigeb]WRMKJLOSVWURNIECBCGOZhyȬwv~~|Ƽrg`]]agmty~}xronqw|rib][[\\\[ZYY[_chnruvurnkhghjlnmkgc^[Z[^dkuwhZOHDBBBDGKQX_gowнrpmje`YQJC><;:851-+-4>M^p}kWB. !)/0/,**,18@IRY`fknoonljgeccdfkqy{|{tmg`ZSOMOT\emrrl`O>.#!(4AMW]_``_`accb^XOF>87;CO\it{|xsnkiijnry|pga]]_dinsx}}xuv{{vtuz{vspnmllkihfc`\XTPMLKLNOOMKIGFFGJPYeuȯzwzĽÿyne`]]`dinswz||zvpkhgjqz~umgcaaaaa`^]]_chmsx|}}zwtqooprrqmhc^ZYZ]ckuwi\SLGEDFJOV^gowsqolhc]VNF?:75310038AN\l{|iU?+ !+379:;=@DJPW\afilmmljheca_]^_cgnv~wqkfa]ZYZ\`dghe]RD5*#!&0* "-8@EJMQUY]aegiklllkifdb_][ZYZ\_chntzzuqnljihggfeb^XPF;1*')0:GRY\YRKEFMZl~{fN9,(.=Qeu|uniedeint}}xsnie`\XWWZ^chmprqokfb^ZXVVWY]aehigc]WRNMNRX`hqzwngb``bceeda^[YXXYYXWSOJFB@?AEMU]djr{{wuvx}ǰ~źwoifca`_^_`bdefggfca__afmw|upmlllkifca`bgmv~}|{zvqkd^YWWY^fp|zl`XSRU\fpzϺlkjigeb]VMC:3.,.2:EQ_lxweR>* %2>HQX]cgkmopponmljhfca_][YXWWWYZ\^aeiotz}zxxxxxxurmf_VNE=60./4 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Median Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/warpedvrt_with_ovr.png.ovr0000644003401500001440000004632513614004466022574 0ustar rouaultusersII*=BCD<E<SX]'lN4R]'lN4V]'lN4>J 0 J (!!/cY!a#$ &&')+I,p,,h./01245P7 89<=>KxۿK1? Y;8`!H/4'8t)4`MvIGޒåzMl}l>mP}CӧO>} w" 9m/Ze>wd/Y#CSDrxy_C%6?ݙoUb<͸9/.9î?Duo߶I /ܬz8<9d}ЧS@X_o4 ~~WG%^#X- ~~(` ~~(` @ }mX_} vZ/X\a}_o_o_Tal+ J'Nxn0WޛvߡYHօЃ&+!HQ_kHJMr:#ۭ7u+t\oF/^*/F=JR4~)E1vx6odƢXArɦ`~~&˪a>5y&3.P0R2i0|yc;#jzC]9 <;VΛ8>W&suJ̯pN&nS%$֟D!_mrΝ|v&.wƘq>V##&Ç>|X<}%QydԗbAOÇ>|qƏbZ‡>|Ç~X2p>|Ç>qdJ%x!@wma 6 ` "u1} 2ŮSS7F0]ʱAt[;ԩK(PuFa`#Gk?J_hv;{G[T|GUmC(С" <|t5xj x`\!ݺ2c]!KKh4=7iO'8hǎ3&Sya>L;rЦQ$@Ç>|Ç>|1VkO(#+\{ÇX_KA4aU✱DײN\(A|xDIS]$&,,-0Y$߿D&GOǟPYmZ rs(0P-K#TVj8$ҏWYs9 L39\o `F9l9hxϗОC$ {Hw?Yj>/O|/ӗLIRyÇ|{η/`_o/tƼ/HxۿO@ߑ ]M4aG08^ C 9 PҾ#޻4i5J7=Ǧ; ~>6wIUn3 ~7l _rwYMM3O>}֮mq}ƪ'V0s/Z "~c!/~> ?o@e W|rz>Sگ@0A-5KMc^po?_l-\Tx~ӾY|0Y3zo R</\m,(}x__N)?bJe!XdL~[x}-}-}w߸>;oTl?C#?<n?]7-1}G7.}C7ohq!!| 3;v}/$a{_9qg!®+v}Үt]xٱn0FWǎ}0-\8\[xx7c+co|, ߆O8T˟Zd |#>Y|hP/>0'gpՖ%z{) }\>nϬ@VY>+ʇy.|nyoCzA?O7h ;OڇfO}(+oLAx10zA10((SK$_ g$1,*e+gIiʨ3_36OQ|Lm|Tߛ:/jT쏁jqp<f?>_7r<ߺk|87d20WR^֓Ljа߂)~ʲ[Ԡwk <nT_C 6h ZD|k\$x+P@w ʲpt#GTT"@AcM- 霙}Vu̪nuWbc4V8Nzyߵ]mqVU @+)ux1n00z7tpCUaxTƐ!}nDCTD0NG_D}) ~p~|||:$I27`|||X_K?7~ހ00uǯ N[?8[? >>>~~dw1{umq%7=ww|:ݽ5t9ZgS7/A.p.muLXMϟ ﰎӥ-G IYy=,Yb=|||||||V? &xJ@ǥKp{.j bBJŤXd&IiR0_sE;'M/=+ %P_|p@_1 %SP_a c?f1#c_?G~6~?y Mɇf}3?(ߎ?oη'W?[?fyG~1P~?7/O>///O>¯ƯƯO~|*_? /̚uw9z<[$$]2[";ww͒<5g=kCO LV؜{#NGkĜɉO*)ጿ#ǜi7tÉ_S}Kuz}Sjt%7wm|o?I x۫0G}e  .0ƷRRT}dsN>CxkoQϖP?YFh ŧo;7P?'zak>7>|nϭ_wW}p]_cgcg'ׯ;;|t>~??F^7U%J낮~[P߬~Y_KWַGch?ַ(gK,~4C`}~ɽHO\Q*G -oK >7 o O>>'/8!0  "sx1 g òx͡ (RD" $@0)ϭQ|>|>|>|>ߨ~$|>|>|>F~F=sxۡr@#VTG&Qy@DD (w_좘9f~w]S{6޽uK?ʈOmbԲ+>A&ԟd@W :k@~-ȯ@{PA(`A`!+>k§8 @_F/#:=/ \@H?е/KeA%~ױ~/( gOOOֿ4[3)+F_3(+Fkz߾$ei#?oW0pɥ*`'ap g%Ә |#_)<[`[x혱N0En00y@b`CP>BTX:d(4Y2< 3UskߗF9>v٩k[ S~5~&~Uz,z,%Yu 7G++[mQ㷾_'*/2x"rNX;vQH|)G}ގse1cM1c/u,9_cTM?^Yin6]ׅi}}8Z;oۻ}_`Ȭ7Ǐ?~Ky\'x헿΂0GGMGo@C;8AF1$r~)7ztI?~=eׯ?~ӯdYmď?U^UR[5uIaٌdz疈J:[w)CQTsTU9}~_񶿣sc ǰ}ӧOo9kI{uZm&U'1͇g+kj J& Kq#F߯)8X[ᖧž=-Z͢ja W&=9[ӡU eo8ӧO>}ӧPz` -x혱k@ݐA e8()MСQHJL+ y{ wΧG(袈53 "BDʯ_~dvܫ?W?ـ]SO5`TpS )?~"XD'^AXDүm9nb⥤5pE j /cs|0%W5ēLvn6G}ڌ~9h D i>/Z/שؘe}12ǨOYMȦ|xO̸kv1lR5]23]Ը4^}r OA.ƖfwC=·aUh9li{~/~Y~o:x۱N0y`ҝ!H TbdP*AʨK,TD9nh⺧4u>^Ó| yw^B翆>}ӧO>qHBdU8KFTĒȽTr$\bC{&.^Y'XEՄx۞fv=iv!=|4]P byWBljIh2Bt#*g9{.+r/l<4g3 0c彉ߘp}1W '{%^XB!~ys/?=[~1d\@|Ç~;c:/}R5d ~‡>|Ç~HO|44/|Ç>| '|Ç>|Ǎ~%x!@wma 6 ` "u1} 2ŮSS7F0]ʱAt[;ԩK(PuFa`#Gk?J_hv;{G[T|GUmC(С" <|t5xj07=.CMFLE&ڤtUZ4XC$_NbO z:xv(o~meKV/u{mtÇ>|Ç>|coϰ(FI>_ !L<b":hC'q %:xxo>gD~x!IGTda\e-yGjǖ] Y&K * =t]>Memf+3YuU_3Sw?U[B98ubqyF> %4P-6Ý+0݃-0lO3˄O|W°F(V~Ç|ww/`ß.|0ƾ/aHxKA a/hx8 7?e=Xnո;N_H #|6(M21axxaE^+1͖zFbL;O>}vnlI}gVh0s ?o ~|c!/A(v>h~|sױBW|z}fs_`:j6co\拽_~`}`Bzf-w`(jՃ}Ĵ>P>\ \{y]x>ˇ@y>^BwxvI&#4;oT?C#?<?]71}xG7}7oqPXPX>g/=_9qg!wGŕ]?}0-\8\[xx7c+co|, ߆O8T˟Zd |#>Y|hP/>0'gpՖ%z{) }\>nϬ@VY>+ʇy.|nyoCzA?O7h ;OڇfO}(+oLAx10zA10((SK$_ g$1,*e+gIiʨ3_36OQ|Lm|Tߛ:/jT쏁jqp<f?>_7r<ߺk|87d20WR^֓Ljа߂)~ʲ[Ԡwk <nT_C 6h ZD|k\$x+P@w ʲpt#GTT"@AcM- 霙}Vu̪nuWbc4V8Nzyߵ]mqVU @+)ux1n00z7tpCUaxTƐ!}nDCTD0NG_D}) ~p~|||:$I27`|||X_K?7~ހ00uǯ N[?8[? >>>~~dw1{umq%7=ww|:ݽ5t9ZgS7/A.p.muLXMϟ ﰎӥ-G IYy=,Yb=|||||||V? &xػj0c:xޡtHAaLqC'nʒ//A!?$˦/w2W/}a}c}&)P_ X #A}?*~#]{XX??0_-P_-P_ǟ|f|]隷o_ď|Gb"~#M,8,8?Xa~|*Cjj*#zaza:7ʯOéJ>۪]Op?A׏WK>3 !1/iȟm!FuLJύ>|#VG'oU*>Ir:XaXVo}_z\>v:Vl}T=NaoO~[ p5rM?7}'=/fnx۫0G}e  .0ƷRRT}dsN>CxkoQϖP?YFh ŧo;7P?'zak>7>|nϭ_wW}p]_cgcg'ׯ;;|t>~??F^7U%J낮~[P߬~Y_KWַGch?ַ(gK,~4C`}~ɽHO\Q*G -oK >7 o O>>'/8!0  "sx1 g òx͡ (RD" $@0)ϭQ|>|>|>|>ߨ~$|>|>|>F~F=sxۡr@#VTG&Qy@DD (w_좘9f~w]S{6޽uK?ʈOmbԲ+>A&ԟd@W :k@~-ȯ@{PA(`A`!+>k§8 @_F/#:=/ \@H?е/KeA%~ױ~/( gOOOֿ4[3)+F_3(+Fkz߾$ei#?oW0pɥ*`'ap g%Ә |#_)<[`[x혱N0En00y@b`CP>BTX:d(4Y2< 3UskߗF9>v٩k[ S~5~&~Uz,z,%Yu 7G++[mQ㷾_'*/2x"rNX;vQH|)G}ގse1cM1c/u,9_cTM?^Yin6]ׅi}}8Z;oۻ}_`Ȭ7Ǐ?~Ky\'x헿΂0GGMGo@C;8AF1$r~)7ztI?~=eׯ?~ӯdYmď?U^UR[5uIaٌdz疈J:[w)CQTsTU9}~_񶿣sc ǰ}ӧOo9kI{uZm&U'1͇g+kj J& Kq#F߯)8X[ᖧž=-Z͢ja W&=9[ӡU eo8ӧO>}ӧPz` -x혱k@ݐA eF:tp!$bjӈ i|qx$#&uq9WDd՟ ~~G+ǮlYg"'pL~*8Tp N?~G'Oh@+h@9Rw~N7܀x)m ܠAx_T'oG3S]|@o/bSL6f\>;MpebӉOe1beQekҟd1Cj1畦 >rzonWyTiT|Pw(q Ui^&R]~~Gga:ka7"x۽N0y`ҝ!H TbdP+AQ:؉ w>gh{8dv=fݾC?l:}ӧO>qHBdUltOy%k#v7|,Q,(7z,9?{X_pOGl2G?*1No&m{̋.=fv&)vai{z>-W~K=9I4~Zw@>&N9b}mX-m#Oxc/׏@WW(~(~(`%KFc}QK2_jId_b}s~ɾ~[ˊ~C,o*_]U!Nxj WޛvC.}b0r*mX3fsLlf1ԟ}HjbQP+ݶoWuU}[U(vwm<9||]~d?_108Vћ8?{o\"ش¹|'ܿ_Ç>|O'|Ç>|᧍맰%x!@wma 6 ` "u1} 2ŮSS7F0]ʱAt[;ԩK(PuFa`#Gk?J_hv;{G[T|GUmC(С" <|t5xj027=.CQtR4g{`@oL=/•(͡r࿕WUi;>94})BQ3Ç>|Ç>|ǮϙaQ{F2,?|M|&BHI\ d&oW:hC'q %u"?&h?2(~_=# OxOxʝNe5`ک`Nna'6\|گdLuuӏ™FVC`0Z篗0Pԫ'>:xϷסmk09O`Ο"7K+>|°F~>^Ç=|w`}Ç_HxۿO@ߑ ]M0NjahbT=ڻwBKxҤ5} )˜% >>Y|{_FkW~?qB!ӈRMq$V"D_~^q_?uֱ³>.\%2Lh 1ԬݷUx~g5߈|p7گdDPUE fd-%`jw ߿/BFƕP`ݫYטi-1eAІJ5{S}= ο?oY2`+9s~>߼3dQZ+ ~5SޯpO?#F!fPo.q}ߨ>~{G/>x>~CoLZ|cp䃋oD\|#'ɷo?4sKa=KaYf?n "c__9qN`!_­/nʭ:_Yxٱn0FWǎ}0-\8\[xx7c+co|, ߆O8T˟Zd |#>Y|hP/>0'gpՖ%z{) }\>nϬ@VY>+ʇy.|nyoCzA?O7h ;OڇfO}(+oLAx10zA10((SK$_ g$1,*e+gIiʨ3_36OQ|Lm|Tߛ:/jT쏁jqp<f?>_7r<ߺk|87d20WR^֓Ljа߂)~ʲ[Ԡwk <nT_C 6h ZD|k\$x+P@w ʲpt#GTT"@AcM- 霙}Vu̪nuWbc4V8Nzyߵ]mqVU @+)ux1n00z7tpCUaxTƐ!}nDCTD0NG_D}) ~p~|||:$I27`|||X_K?7~ހ00uǯ N[?8[? >>>~~dw1{umq%7=ww|:ݽ5t9ZgS7/A.p.muLXMϟ ﰎӥ-G IYy=,Yb=|||||||V? &xػN0##,1dRXR *PmܜI%r|8g|)/XJþc}&wYuwﮟ?ŏ|w}a}c,||C}|C}a@ߌ?oO>O~|#<;#Q0nCewϗo/8?Xa~|*Cjj*#zaza:7ʯOcEۻ/9d?//}EI3Y^"[n`JCxkoQϖP?YFh ŧo;7P?'zak>7>|nϭ_wW}p]_cgcg'ׯ;;|t>~??F^7U%J낮~[P߬~Y_KWַGch?ַ(gK,~4C`}~ɽHO\Q*G -oK >7 o O>>'/8!0  "sx1 g òx͡ (RD" $@0)ϭQ|>|>|>|>ߨ~$|>|>|>F~F=sxۡr@#VTG&Qy@DD (w_좘9f~w]S{6޽uK?ʈOmbԲ+>A&ԟd@W :k@~-ȯ@{PA(`A`!+>k§8 @_F/#:=/ \@H?е/KeA%~ױ~/( gOOOֿ4[3)+F_3(+Fkz߾$ei#?oW0pɥ*`'ap g%Ә |#_)<[`[x혱N0En00y@b`CP>BTX:d(4Y2< 3UskߗF9>v٩k[ S~5~&~Uz,z,%Yu 7G++[mQ㷾_'*/2x"rNX;vQH|)G}ގse1cM1c/u,9_cTM?^Yin6]ׅi}}8Z;oۻ}_`Ȭ7Ǐ?~Ky\'x헿΂0GGMGo@C;8AF1$r~)7ztI?~=eׯ?~ӯdYmď?U^UR[5uIaٌdz疈J:[w)CQTsTU9}~_񶿣sc ǰ}ӧOo9kI{uZm&U'1͇g+kj J& Kq#F߯)8X[ᖧž=-Z͢ja W&=9[ӡU eo8ӧO>}ӧPz` -x혱O@g:GMlp1 $%Biz%< Vxg˅./E@')_#YƒߦQvʱ'p@~_dV N?~OjA`'~F? '~Nv O|o6 JD^qU%"٫v͸-G(GԐ؟SU)UI8?,q>F1Im/asXijR|~-Ժ4|ֹ;P11>Wݖf?z?SQbv~Y_}7szt5gdalautotest-3.0.4/alg/data/cutline_noblend.vrt0000644003401500001440000000437313614004466021220 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 5.9999999999999993e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -5.9999999999999993e+01 512 128 6.71089e+07 NearestNeighbour Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,59.99999999999999,0,3751320,0,-59.99999999999999 -7345.333333333334,0.01666666666666667,0,62522.00000000001,0,-0.01666666666666667 POLYGON((10 10,10 50,60 50, 10 10)) gdalautotest-3.0.4/alg/data/utmsmall_max.vrt0000644003401500001440000000417713614004466020561 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Maximum Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_near_ushort.vrt0000644003401500001440000000343613614004466022322 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 NearestNeighbour UInt16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_near_float_with_alpha.vrt0000644003401500001440000000343713614004466024304 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 NearestNeighbour Float32 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/polygonize_in.grd0000755003401500001440000000044213614004470020671 0ustar rouaultusersncols 5 nrows 7 xllcorner 440720.000000000000 yllcorner 3751020.000000000000 cellsize 60.000000000000 NODATA_value 132 107 123 132 115 132 115 132 132 123 123 115 132 140 132 123 148 132 123 123 123 156 156 156 140 132 156 100 156 101 102 156 156 156 103 103 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline.vrt0000644003401500001440000000342713614004466022271 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 CubicSpline Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_ds_near.vrt0000644003401500001440000000343213614004466021400 0ustar rouaultusers 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"]] 440720,50,0,3751320,0,-50 Gray 512 128 6.71089e+07 NearestNeighbour Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,50,0,3751320,0,-50 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_max.tif0000644003401500001440000000420113614004466022222 0ustar rouaultusersII*yS   Vr^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767&          >.&O  6F 6 & &..&    &.6 ..  O.>. .& .>>&g&   6x_FO6>OW>_>.& &  .&&6FWp6W6OF6O6Ox6&FW_.F_gO>Ox>gWF.OOF6.&FFgF..6FW.>&&g.6W >p__6..66_&>&.&Og. .gpg>6&6>6>>&p6.&6Op&..O66>O66xO6&F .W&&&._W6. p.&WFFF.. &F&.&F>FF>.>6...FO>>Fg&&F.gO_g__g>.O6.6>&&&>>WWWp.6>FWWx_.>6.&g.&.g&. &>.WOxWF.&_. & 6  OFggW&F&&& && .6pW___6pFgFx&&FW&6.pxxg>>&gO__g &6W6 . &&pgx&O&OxF& &.O_F6W6_.g &>&&.&O6_>F_&>>g &&&6 OFF>.F 66F>F &&  66...WWp.F6_666Op.&6.FgO 6&6. .g.&6&F__gdalautotest-3.0.4/alg/data/utm_alpha_noinit.vrt0000644003401500001440000000537513614004466021411 0ustar rouaultusers 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"]] -1.1764116862079686e+02, 5.9741237520048360e-04, 0.0000000000000000e+00, 3.3903634039985498e+01, 0.0000000000000000e+00, -5.9741237520048360e-04 Gray Alpha 512 128 6.71089e+07 NearestNeighbour Byte ../../gdrivers/data/utm.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 -117.6411686207969,0.0005974123752004836,0,33.9036340399855,0,-0.0005974123752004836 196917.8636135853,1673.885646684861,0,56750.80638998799,0,-1673.885646684861 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"]] 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"]] 2 gdalautotest-3.0.4/alg/data/utmsmall_cubic_wt_float32.vrt0000644003401500001440000000412413614004466023115 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Cubic Float32 ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_average.tiff0000644003401500001440000000545213614004466021520 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|wwyv|~~qmgimmouukxswwquwu΄y~{{s~wumm~wogmikuyzy{y|ֻŽģ}ww~keoucekmos~~w~|̘{Ļ|sqwoovkgommqm੖ܷ؂zuw|wqwwz~miis|quw~ҟ؀y|uqowuykqmxy{swŝҾҘľsqm{k~sqszou|sȻƽȥmisoouu}uwǀ൭حƌmgeu~wqØңĿ~uqmaḁسƩÜûmg|iee|лاڷ}g{ġŝ̩œkԷؖuԘг޹zԽȱ̟Щ֧湐Ț鯜ǩĵ̥ؿƿֳĻֱswso|ԵȣܷƐw}msuzпι~~~ģҳڟʷ񒒤~yұίƫЯ~w|u}|ڎƻȵymoy|Ȟڵފނso~gsscuuȽԖ瘭޽zkiqusz_i|ŷ»˜ؽuxgX{oxysʣڿګaLg_cvgc|mysi{q{Ƚ潱qTB|_iogswq~m俫ХʭuemsXqTRsgs|[|ȥķƽoZ{uN_\P]uicmwc}}ÿԥ_SaysP{s_gosTuuҧƚmucekmVcNHu{gku}çػBggJ_PHZgz[Ng{iJ{s|Ω³QVF[e@HeLR]koXSmkuÊʜҿηÿuFJFaT_RV]D_HNRZiصĎֹ:@D<:PN:WHJ>LBaiy[0+H<:2LHR>Lmei|̀TYsgJ|P]i[>HxycL~@%QB8Jeq}RekT4@@oocmNeePsNRcexm}}\R6/DDPkcP12/FPo6eciN[cXHY_LPBWXka^iaxVygdalautotest-3.0.4/alg/data/utmsmall-int16-neg_med.tif0000644003401500001440000000420113614004466022202 0ustar rouaultusersII*yS   Vr^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767     &  &66>   &.WF>O 6F 6..>... xW> &..6 &F66W6&>O.66 66&F6.& 6>&F _gg_& &OFW..FF& .W. . F . OO_ &W & &6. p&     &&6&&&   &&  & _O_gW  &.&&6  px>F6..O_& . &.&F>6O&_6& 6pgWW& .O>OgW6&6 &Og FF6> ggxg>gp>  6 6&FO.>Ox&O &F6 >&6.> g >O .6>g &.F &.__  &66&  &.> .&6 & &&.6 6&p&.  . &> gdalautotest-3.0.4/alg/data/utmsmall_blinear_ushort.vrt0000644003401500001440000000342613614004466023010 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Bilinear UInt16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_Q3.tif0000644003401500001440000000545213614004466020223 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|{{{sskssss{sss{{s{{sŭ΄{{{ssskksskssk{{{{{sֽŭέ{{{sk{sccssk{sŜk歔ss{sskksssssν浜ť{{{s{{ssssss{{{s{k{{{k{{{{s{ޭ֥{{ssk{sss{sŵ޽ŭεkk{sss{{{{{ńŽΥŭŌŵssc{ssŔťΥŜֵΜ{skccť極֥έťΥ{kkkc{ŜťŜޥk{省ť޵Ŝťs֔ŵ޽{朜ŜﵭťΔޥ{֭޽εŜŽތť{{ssŽ֥ޜs{s{ŔŌsŜŔޭք{楽޽ֽ{Ŝs{朥{޽潌ssss֜ޥތks{sssk{{֔ŵńssss{sk{ŽΔń{ZsssνŌkΥֽ{Rscskck{{k{εֽ浵{ZJcsss{{k֥Žތֽε޽ss{Z{ZRssscޥνֽεsﵽZ{RkZJcscsk{ŵֽޭ楥ŽŽkck{{Rcks{Z{{ŵťťŭֵε޽k{kksksccR{ss{έ{֭ŵ޽εν֭JkcJkZBR{skZk{kc{s΄ΌεޭcZBc{:ZkRRsk{kcskŵ挽֭ŵŭ{BJJscsZRcJkZcRZ{ΥֽŽέŭBJRBBRcBcBcRB{Jŭŭޥŵ֥֭):){RRs{scZRJJ1sΌֵ֭浵1!::sscJkssRZscRZZ{΄νޔ޽11Z{BkRsZs{ZZ{c֭ޭc{c:)skJk{ss{kcZ޽Δcsckc֜ŔBk{scs{RcssZksΔkcc{RkcZs{ZZ{RJRBZRBJkc{kJZkJ:kJεdkŵks{{ZRRBs:Bk!BsRkksskRZֵ{֌{sZJJBJJJ!ks!ccccZRZscccccRcRkŜZkkRJBBJZZs1JZ{:ZRsJBsB:JΌ{{Zs{Z{ZRBBcs!1J:J:ZRZRJZ{{JckJRckcBBsZ1)JRBRs{sZRBJBքZksJcZsRZkk{Zc:)RccsZ1))JR:{{:kkRZckJZJkZksZskZ{gdalautotest-3.0.4/alg/data/cutline_blend.vrt0000644003401500001440000000444613614004466020664 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 5.9999999999999993e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -5.9999999999999993e+01 512 128 6.71089e+07 NearestNeighbour Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,59.99999999999999,0,3751320,0,-59.99999999999999 -7345.333333333334,0.01666666666666667,0,62522.00000000001,0,-0.01666666666666667 POLYGON((10 10,10 50,60 50, 10 10)) 5 gdalautotest-3.0.4/alg/data/empty_rb.vrt0000644003401500001440000001057213614004466017673 0ustar rouaultusers 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 2.0983170908647397e+04, 5.0109700347667203e+03, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0109700347667203e+03 Alpha 512 128 6.71089e+07 Bilinear Byte ../tmp/empty.tif 0.125 500000,5000,0,5000000,0,-5000 -100,0.0002,0,1000,0,-0.0002 20983.1709086474,5010.97003476672,0,5017540.250625971,0,-5010.97003476672 -4.187446894127006,0.000199562159235014,0,1001.311166463512,0,-0.000199562159235014 PROJCS["WGS 84 / UTM zone 30N",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",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32630"]] 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 4 4 gdalautotest-3.0.4/alg/data/utmsmall_Q3.vrt0000644003401500001440000000420113614004466020243 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Quartile3 Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/byte_gcp.vrt0000644003401500001440000000464713614004466017654 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area Gray 20 20 6.71089e+07 NearestNeighbour Byte ../../gcore/data/byte.tif 0.125 1 0 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_med.vrt0000644003401500001440000000447313614004466022246 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Median Int16 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,120,0,3751320,0,-120 -3672.666666666667,0.008333333333333333,0,31261,0,-0.008333333333333333 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_max.vrt0000644003401500001440000000447413614004466022267 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Maximum Int16 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,120,0,3751320,0,-120 -3672.666666666667,0.008333333333333333,0,31261,0,-0.008333333333333333 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/utmsmall_max.tif0000644003401500001440000000545213614004466020525 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|s{ss{{{{s{{ֵŽ֔{sss{{{νsk{{ks{s{ťŔ{{{{s{ss֥{s{ss{{{s{{潭ֽ{{{{s{{޵ťsss{ބεֽε{sֵŵεΜ޽Ŝ޽{{scޭνŭޜέ޵εŵ{skkŭ֭ޭ֥ŭ歵{εΜ歜攽ŵ省εΔεŜքֵﭥŭťŽŽť潜ν楥Ŝ֭Δﭵޭ步ŭ֥ޜ֌֥潽ֵΥΜŌs{ŵֵޭޥ{ssk{ε޽ޔ֔s{{{kŽŌŽֽcŵֽńkk{s{{{ﭔֵkss{步Ž޵t・ckcŵcﭭŭޭsZkkss{sk޽ﭥŵsssZsZ{֌έέք{ss{kc{ތŽRscskk{{Z{cΔ挵ޔֽﵽkZk{ccZs{sc{ֽŵŭ潜RkJsssk{Rccc֭ŽŵŔνZRZBJksBkRkccJŵﵽ޽ŵBBR{sksZZ{{sνスťﵵ1:BJs{Rscֵ{ֵ֔B:Bkcε{νέk步νcsBssk{sksk{ťΔkŔťkcs{{{kZsZkc{ckRRZskkRsk{sΌ{ŵksZZcZJkΜkksc{֭ksŜ歜ΥkJZZJRR!s!{sks{{{s{ckssRRJRkŽ!ZcsZkcRss޽s{scZJBBJZcJRkZcRcscRZkkJZs!BZR{{JRsތk{cskZsk{kcsJkkssk:cJJB{s{sZksk{Rc{{{sZgdalautotest-3.0.4/alg/data/warpedvrt_with_ovr.png.aux.xml0000644003401500001440000000246013614005314023343 0ustar rouaultusers PIXEL gdalautotest-3.0.4/alg/data/utmsmall_bilinear_2.tif0000644003401500001440000000545213614004466021746 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|x|~wx}{}sniiinprtpwvz}vtxxwЄ~~zzz|xyrouupiljlry}{}|zĵÿà{yxkiprighknv}}{ħ̶|x~tu{nomjllmqs۵ԱՁ{xzyvvwzyymkotvuw|{ئʥ܃yyvu}sw{wqs|~tw{|w꾦Ũ崌wrl|ys~wvtxvy˷¿ɨpkpnq{wz}~|x{޺ϴؿrmmv}{yt~𾜡ҽ}wtldkǬıɩzqwlhezǻШ淪Ϻȴq~ӹĨÿǠuѺ؛㣗zž챿Ƕݽ˫øʫϰӭҹ޷Ŷüò˹ۥw}{ɼƴȯ|~t{x}ɼ⽾χĵ߾ι̶珒|ŽµѬ|z~{ǛּƯλ~wr|xշӦtp{mv|syzŸحɿyjlsot|xrsȺplnwax~q{}|˽ҿɹc^b]f|jguvwup|ͽ޵±t\V|bdovlr~tqϽtrsk]g\]nlkyj½û}Ũ]wS`_[_inirzyjzΨ`_eumauekx||atz͸imffreUdb}{VjzolxĽĽMc`QZNNYa~va\cof]spοūQTNY\BR_RrY\kg`^tmmмéĻ¾eLIMXTXPU\LmuSTqfYiϰγ@?CC@OLCSEhw_LSuqTɨ*08TML\^bTUMQP~Vnƭ,)6CNZTU`fidZ]qgcamyο10XW?[\cXcit}zrcu}~lƪltȽOLd;QhntthWbkvvt{k]iƯmszcwruA]nnvsogdlyuiesytpdaf~hnn^bhmulWc}7GSRQDNZbbt|yeUY]X\r^_~}\ekv{}bTNIj0Ama;C]bNXdng_mrysyjS`|taSMHECJsKf5JfdQ^c_RPYej^adaURs}ɼlmg^v~SD=H`^ZMaomIUeSMMimuWOfpQKWvl|rajrh{VI@L~/]luY;-D=:;JU[SRtpecv\dqfTo^cp\JUv|kQxG'JGES_feWnakYDJc{z_f_a]UiRXikvdvy^S~G)@HOjkU?25I\ix~KZdo`XdZNYXMUEWbjehj^|u\rgdalautotest-3.0.4/alg/data/utmsmall_lanczos_2.tif0000644003401500001440000000536513614004466021635 0ustar rouaultusersII*22r2 =S   V^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|x WPۇ>kz]M4NJ ,aB[hO$ ОHh @H,01Mہ=>,-dtomj8e4 CQ'g +Nj:M!aYm8ÂP4A1t&JQbPouL^Nų;ImJx!pF2KG睌1br0#iBcs;8[eݮ<8x{eT 0DH9 UiW[,Rwwz9<ғK+'3֡魄ѤըrO_1O/t~Y֖nY- 5ZX&jje(uBOBfYZ!]3zm)|aOWåyt`dι<{96:RÒy+{NӯJ][ߝnxd,+poT$T:Rlv]IP4E|S" ml-{:*pIV"0),1휭;17?)E2Fi4u:UKmB޾<8;\XNѪXm٩胭l-պ_q%v<~#vmuY>S\mnN8cR8 ?oeN9'{wN"00fPeFǛ;㥽w{ ƌ:cN!Yq -+xx2Pu*~Hq+|A5E~W]$@޻RpϪAşz hY݀,Ү+paW=ŗ>y n}Mk""G{[aЪؽ4>Q"{߀߿Qٵf_ nj(y*Oq %tfjgdalautotest-3.0.4/alg/data/refine_gcps.vrt0000644003401500001440000000372213614004466020335 0ustar rouaultusers 0,1,0,20,0,-1 20 20 6.71089e+07 NearestNeighbour Byte ../../gcore/data/byte.tif 0.125 1 0 1 1 0,1,0,20,0,-1 0,1,0,20,0,-1 gdalautotest-3.0.4/alg/data/utmsmall_cubic_ushort.vrt0000644003401500001440000000342313614004466022456 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Cubic UInt16 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/warpedvrt_with_ovr.png0000644003401500001440000002330313614004466021756 0ustar rouaultusersPNG  IHDR<_ IDATxݻzǺ*?ȔTJL6}gFlR*RiZ4E >7FM{ʥ~tZ_LZS/j̯6N󩔇ݻru;rn}Q}^|yqaן}ۧ?)<^p\ms82Vx}Z}\J1r~}ww /?|`VWPrĵe,7W<.?^Э7\=ן}2k+WL>nM)j#R|Q>ץ|z!@_~|^oOv \ן}2BYZ>W͇\m3n_gu_\߯ץ/Kz9@/|Vg[)֟ߕr+8osݸ{WŪwmjS[kgm^VW 09_m/#DDDDDDp0jx9y{譵 m?e0L`;$ d^0bЙEoJHYEE\? 0 f007F`ާ,܅1 s*x83,hW"910wou `fDB&0!0SFD^C$`6{"9 ·`oG3  @;1Eh4 H6{6{Dh4vn8h4fwL8:f4Fu_3 d2 lyy3<2 Lr`6xa4Ixvb]lΜ) p&Fה wg4S]"< 0+F؟׋Eg'wh4h4> ^^dwL֑a.@ \C].0@\1f>Qo;__2Xp}Y6`fnm?QF 90,V<}I3II `8+'f/pFFA0hahFb4..7U`*FgctYm0Rjz%睆zw1]mxdCra\ ;f_ Lh4ɐ3c0/ $f#󩔇ݻru[Jc%kmݸ1rNUhgEѳ~]}[|.(fQ  2zu/#QuY.nJyxw]~>#F^Iln%}|!&㪔ˋ__><"`<5 e)7E bh`};}(7JF3Fs%0th408!OJ89gș `HC6 h4a@BL"tF{6{aCvg0Ѱh6{ZT80:Ѱ Uah4̖^8Th&v%2 3(8ZhG3 M1F 9ð0p08+``F6{ah8h4lc"2  2yh2Y0 y4|H ڴ h‚00+FYPa00/F-Cΰt)̄?  ̚h&a$e0}fX6{!h4''7IX6f/@'F?b4 KZ|8љ@ @1 JYF/0 `  BьFϙ`Xѳaz5#x0oFO/80 # L좄W؋ f/00>$?Jpkm"h~MyJ`0 ̟FhtX4 0hB `o4m&^h@O05EJj&#=Rv4f/= 0FO`)M2m$fah@?^ZkOVkmsqA6,8X" 0Gz\ '6ū{@Aцv˰ўh|ΌK2S3䓽DDDDDZ{zDDK6*~DKADDDDDx"@00gQkmM`"`"`"`"`"`"`"`"`"jSԫ     X0XOAAA0ZkkmU<'1DDD'xIAAAAA0!kZ^DDDDDDDZN  ZzDD~=GDDDDDD f `"`"`"jS/`"`"`"`"`"`0t000?y09 @wRz"     8U6*     wiZ^[DDDd)FDDDDD=hZ^ 7x-  xԫ؋       ~[k:*8 Hԫؗ        Kk:*8脷vZzDDDDDDDDDjZ^,Z[kS0HK<  0 hZ^D0      ԫ8 >JAAAAAAAAZkkmUIAVkzFAAAtJDDDZzDDDp`"`"`"`"`"`VkmM`"`"`"`"#jS} `"`"`"`"`cZ[kSu  @ @ @ @ @|Ik:*x  `ZkkmU CAAtY/ `"`"`"`"Sy"`"`^WkmM`"`"`"`"`"`"`"`"jS]0֦^Ő0000000@Zk֩W0#xFfN\6*& DDDDDDDZziZ^DDDDDDDDjZ^0ԫ8  @<$o̖       ZkkmUM}b XE{S<F 楥`|[mP?> `*D1Bm)a)`s51PToC3'%# qc`d%0O}xo. '6I/ `` ƐL< K{09a 00-c 0%3Los':(}g`?BF7D8Z[S/Z^S~Y}{ī >KM|3Ap|ҹd{$ng cGy͇W,|*au\?&9,80EbKJ3z~_WV/K)?\>܎ێJ/"3ǿl~rRrq{U՛_)FX4a̘n%`0(+!*bחr G;z1th?JRʷo\ޯ?||_.n_\߯ץ/K) []9jvUju[/~(7C"73RbLEDC||N,0<5@8GƜB/ߴ6nwC6θ}8˜0dfƙ0G tP{ZHl2C& @^}28 @G0&a<[h6a0ن،F/OO gW\`a e #'a^l2s"=a|4 g9W8a& ql2/W,Dq06#o3rJth^D6WfCHpsͼm/V4HG biF)- ]`6u w5u^B^3DDC2 0[ (Wqvx0@3 pOGAtGDD3DAAA^DDGr`"`"`"`"`(` @| g ,8FCA}DDDD~ 9 `00000a<`0(` @ @ @ @ @|g ,  `ZuU Cx_@X4 @ @ @ .ݜ(  $DDDD0ۜ @ @ @ @ @(],@ @ @ @ @ @3!πDDDDD[9 '}jSHx+g DAAd'D` ` @ @ @ @ az~Zz LA\37%,      $8K< DDDDD8 o#jSb_g DDDoAG `"`    Dd)p $ @ @ @ @ @ @v qptCAAAA!7%7000000Zk֩WV $4 @ @ `T @ @h@ @  @ @ @ `Zk= X!.).$    l `g  `b `"`. @ @ @v8l      BJ; \J0,    @D  ,Zk֩W @ @H6   \fP @Hlt!    8s; G=0<DDDDD6$s/L6) 0 3}L `n'e`"`"`"`"t@^D\>~IDATDVkp3xUo DDDdڣ0&? `g MW `"`"`"`"`3ၑ3ء0000: ``N(` @ @ @ @ @H7 `t;EfIAAAa $}`"9xxYhY|?m( ciPS~1]6`-6a\_z/:ƪ`"Fh9jE|sv1=xS/`b\1p%jn??޵H`zl=5Vݳݫ'(`<>` vt/{+v́5'@f[ ,^$a 3xa]pno΁kpOܙ3z GG-y-e)sa(#?v.o !0̙eapc`N%e)l)< `œ8wQ(fl\؟kDm멗gYJYVSdv_9cRDWPJ󩔇ݻruWgch[-^/]7ChLj`v\aUs֥gj[_߯w՗e&iB9 *֗Ӽ{wsu[>|u)W?J.?U)χWo~`xIche?Whmxup -`Z*htO_=ܯVw*b.>_)N[\@&dKy([)֟ߕr+z]JR>_p樁l,-1:ܬQ cr<+faѼl)Cì1̇\6G{=5F_ Ӷ[L^̶oLjގ=o)u)˜X*g'o4O~irmz$ |} > {ҳ1PЙI^0w?Q`$x6v.0  0Fs#QyVgT. Oޚ9@00_Gf;GB00~`v.0jAs*`7 'Leh[-8/ǿg 3 p7ø/V4YZ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @o5$IENDB`gdalautotest-3.0.4/alg/data/utmsmall_med.tif0000644003401500001440000000545213614004466020505 0ustar rouaultusersII*22f2 S   J^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|ss{k{{{scckkkk{skkks{sksss{sνέ΄{s{s{kssskk{ksckZcssk{{{s{{νŽŽss{{s{cccsccckkks{s{{s{{c{sk{kkkcckkcks{ŽΜֽ{sss{ss{sskkckssk{s{{Zֵ{{{scskk{sskk{{ck{{{k{{ťޭ{楔kkckksc{skssss{ssŽ֥{kkcsk{ss{{k{k{s{ֽέŵ{ccckkksk{sssֽΜťεkkkkZcŵֵέ{Ŝέ{cckccckŵŜŵޔZcs֔ť潽ŭcŜޔc{֔ŭ凜sŜ{{{ŜΥsֽ֜֜ŵޜֽ֭朄{ŽΥ޵ﵵk{kcs{νֵΜޥΔsk{{kkkk{ŵνŵss{k{skέޥŵ{{{k{{ssŜޜ{ksks{k{{s{s浭Ό֭kksk{ks{sŔk{ޜŌ{kks{Zk{s{cs{{Ōέޭskcsks{k{{RR{֜ŽνkkJkRs{kkscsέΜťֽ֜BJZcZkkc{kssccks{浵kJ:{ZZc{ZckkZ{ks{{ֽ֜ŵŵkcBZZkJRkkZk{ZcΥ{ZkޥŽ{{R{BJRZJZks{Zc{s{Z{s{Υkνc:s{s{R{cJsZkZZkkZss{{{εscsZksZBZBssJs{Jss{{s{ֵŭ:cZBRB:RRkkJRckcBsssֵ{Ō:ZBRc1BZJJBkcRJcccŵsŭcBBBRRkR1JBJk:Jk:ZR֭{ﵜ1:1::RJ1RBscZB1R{B{ť{s޽)1)c11cJRBZBBJR1Zs{֜ŵ{{ε)111c:1RsZkJJkJJRZssŵs))Rk:JJc1ZRskZJksZ{{Z{Ŕ{kRc{Z1{JcRs{JBBJskZBJsZRB{֭{ccsZscZZ)cc{Z{sRZk{{BZZskk{JRRsZk{Zccc{kJRZZkJRRc!B::BB:JkR{{{c:RZ::{RJs޵kk{RcZcs{ZRJBZ{!)kZ)JZJJZZcJJZcccZBR{{ŵ{skRsRB:BJBBk!ZRBc)ZcZJBBBcBJRRJBcss樓RZc{cR{s{JB1BRRJ1kRs!BB:BBZc{B1:sB:JZccks{kZZRRkRRBB{ZZs:!B1)!B:R1Bs:Zkss{΄sJR{ccJRJZsRZBBsRJB{:111Bss)cZ:B)B)cs{JcsJBcBsJJ{ZZkR{{{ZR):1cBkRZ1!)JBRR1k:J1cRRJRZB:::ZcJRkk{scRkgdalautotest-3.0.4/alg/data/utmsmall_ds_cubicspline.tiff0000644003401500001440000000212413614004466023065 0ustar rouaultusersII*fS   JI@I@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|nw~{{}tzuvtws{zxwwzqt~|~v~||w|{qt{z~z|}y}y{zstvs~|{ww{}||{~sq}xtu~|}rqvu}~syv|y{{wzyoz{||ytw~xrnsxy|{wx}{qmmkux~{{yx{zz~~xyyqorqxzzyznuyty}qrsu|}xt|vpz{tz}lpz|rs}xv|}{uutjt{zqlnzrx}vvqmy{qokjt~tvvmnmjzwy{qkzwnqkhiho|uzz}zv{{ilnkfgotrrquz}}wronmsvnmigjovwyvnjojecdhlq|tfS   8I@I@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/alg/data/utmsmall_average_float.tiff0000644003401500001440000002463613614004466022712 0ustar rouaultusersII*22 (S   2r @! 255 154.6212 0 54.250980733624 ^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|BBC CBBBBB CBBBBBBBBBBBBBBBBBBBBC0C&C C CC*C8C"C(CCKCCCGC@^CKClCfC^CMCCCBBBBBBBBBBBBBBBBBBBBBBBBCCCCBCVC;C@AC@EC@=C@;C-CC-CC@=CKClC`C@fCKC@ACCC"C@CCBBCCBBCBBBBBBBBBBBCBBCBCBB@CCC5C@;C5C@?CKCCB$C9C@C@CIC@bCRC`CnCCC;C@ C CCBBCBB@CBBBBBBBBBBCCCC@CC@C"C@CC@CIC@ACKC@`C(C@C@CC\C7CCC CC+C^CrCC}CUCXCCBBBBBBBBBBBBBBBBBBBCB C@C@C&CICXC@ECZCOCZChCpCnC CjCwCRCC@C C(CQCGC\C{C@dCrCXCBBBBBCCBBBBBBCCBBBCBBBCCC@CCCnCCCCCC@hC@ECCQC=CQCCCCC=C C@C@7C}ClC)C@CBBBCCBBB@CBBBBCBBC CBB"C&C(C@C@=C\CbC\CZC@fCvCCnCGC@;C"C@AC1CTC\CEC@=C(C8C(C5CCCGC$C CBBBBBBCBBBCCCBBBBCEC@GCB(C7C(C1C@?C=C@C3C0COCrC`C4C,C C@9CMCXC-COCrCWCEC C@3C7C@;C?C.C@CCBBBBCBBBBB CCC C$CrCTC@CC@C C@C(C1C/C@9CC"CC?CICKCRC"C@C$C$C*CClCCC@;C@CC?C@7C@ZCCC@?C CC C@CBBBBBB,CEC@ACC7CQCKC$C(C9C@XC3CEC(C0CC CCC C3C"CC@C@CC&C@C&CCClC@CC@C C"CVC@CC@;C9C=C@CC CBBBBBBB0COC;C=C@$C'CC@CC9C@?C&CnCWC&C@C@CCCCC@CC@ C$C@7CCQCrC7CCZC6C@C@C@=C(CC@hCnC@hCjC@=C@AC@CBCCBB*CPCOCSCCC C(CC-CC@ CKC@ECC@$C CC@CC@CC$CC"C@C1C/C$CpCKC@GCACKC(C@=CC$C&CCCICdCCAC@C@?CCC CB CC*CSC7C C@"C@C@CCC1C(C"CCC C@CC C@CC"C*C1CIC\C@dCrC{CXC@C3C3C@C;C@C/CVC@`CUCrCCnCCCCCCBC C"C*C@?CTC@C@C$C(C@C&C3C/C C CCC CC(CyCICGCACdCCrCvCWC}C,C@=C@;CMCPC3C/CtCtC"CC@^C@9C$C@C C@CC@CCC CC C"C CBCC@C C5C.C$C@CCCC@ CSC@=C@C,C@dC}C@lCOCvCCC@9C*C@ICGC0C@^C@dCKCCC C,C(C(C@CCCC@CCC&C@C@CC@C(C"C@ C(C&CC@CCCCCCnCCCCCnC\C@`CrC@9C@fCxC}CVCMCOC(CC"CUC&CC0C@fC@bC@fCjC@jC@fC9CC@C@C@CCC*C1C,C*C1C@=C@C@C CC&C CGC@ClCC@dCCCC}CjC{CUCCyCfC@ECVChC.C@CCCCnCrC@GC(CKCCC5C@?CCC\C@dCKC$C"C-CC@CC-C@ C@CC C@CC"C*C*CC/C@9CC}CjCjC}CxCCZCOCMCC{C@\CICfCXC@?ClC4C@C@CC C"CC@"C@AC@CCEC@?CSCMCZCVC2C@C@C(C@CC"C"C@C@C;CrCpChCTC@^CCCbCpCjC{CxCCjCMCCrCuCCC;CrC^CCVC0CC CBBCBBB C@"C C$C@7CRCZC@dCjCjCSC5CGC"CC@CMCC@\C7ClCpCEC@^CXC@bCfC@fClCZCECECCCvCxCOCUCpCClCBCBB CBBBCC CC@C@"COCOC@?C9C@C$C@jC@bCtClCOCjCpCrCrCZC@`C@bC{CpC@`CC@^CZCTCKCGCMC@9CvC@dCGCICrCC9CC@CB C@CBCCCCCBB CCC"C@;C5CACC CRC2CZCVCvCtC6C(CTCbCuCZC{CZCC@;CC@CECOCCC@AC.CIC7C(C\CCpCCC@$C@C@CBBCBC CCCCB C@1CQC1C=C@C$CC@AC3C9CCCMC.ClC@^C\C@`C@^CvC@bCpCKC@fClCEC*CMCrCOC/C@?CSChC@dCBBBC@C2CCCBB@CBCCCC@C,CGCZC C&CCCB CKCEC;C@dC1CGC4CC@`C3CZC@bCKCMC@^CSCnCnC{CwC@fCtCKClCCBBBBB CC CCB@ CBCC CB C7CGC@C@C@C$C7CC@C@dCYC5C C.CC@C(C@C@C^C C@C2CtCfCrChCQC@bC@ZCxC@^CCBBB@CBBCBC"CBBCCB C CC*C(C@C&CC@C5CCGC@=C(C3C(CC@CSC@C CClCCfC@C,COC@^C@=C7CIC@`CECBBBBBBBBC@C@CC CBBB"C$C*C0C C9CCCCC3C@C*CGC@EC@7CICOCAC;CCCCnCAC@CC(COCWC@=CICKCKCBBBBBBCBBCCCB CC&CCC C/C3C@=C CB@C2CC(C&CpC@dC@9CKCOCKC@CC`ChC{CIC"CMCVCZC@?C@?C9C;C@ZC*CBBBBBBBBBBBBBC=C@C@ CBB&C"C1C@CBCC@CCC@;CyCGC@=C4C@=C.CbCC@hC&ClC@dCC@fC@=C1C$C@C"CvCBCBBBCBBBCBBCCBCBBB C/C9CCCC@CC6C0C CAC@dC?C*C.C$COC$C&C1C$C@dC@dCKCUCCCACCCIC,CBB C1CBBBBBBBCC@CBBBBCBCGC$CC@C5C*C3C;CCC@7CEC=C0C@?C@=C7C@ CBC@;C@bC@fC@dCEC@CCTC?C@ C CBB$CBBBBBBBBC@CCBBCBCBBBC(C1C3C7C C@CC@?C7C@5C@?C,C.C9CTC$CC"C;CTCGC@AC@9C=C9C@;C,C*CBBCCC CBBBBCBBBB CBBCBBB@CC7C1C(CC"C;C@ C$C"CCC5C$C/C C;C@3C[CSCCCQC&C@=CECCECBBBBBBBBBB@C@CCBBB CCBBB CCC@=C/C9CBC@=C@=C C"CC@CC&C4C5C-C@?CXC@;C@?C@9C,C?C@;C@=C+C@9CBBBBBBBBBCBBBBBBBBB C(CC$CXCCC@CCGCB"C1CMC(CC*C7C*C/C C*CAC3C1C@?C@=C$C3C(C2C@;C;CBBBBBBBBBCBBBBBBCBBCB C,C?C,CKC@CC C9C.C@ACIC@CQC@?C*C,C,C,CC(C@=CMC7C.C$C@C@CC@?C*CBBBBBBBBBBBBCBBCBBBC?CC C,C;CXC5C@C;C@;C2C7C@AC.C.C2C-C+C"CCCCCC@dCrCVC8C@3CC2CfBBBoBgBBBfBBoBBCBBBB CBC@GC=CGCC4C&CACC*C5C@AC@;C0C1C1C7C-C C"C@C CC.C$C(ClCMCC CC&C$BVBEBBBBBBBBBBBBCCBB?CCCCC C,C@?C@CCRC$CCC*C*C@C1C*CCCC@CC C@=CMC.C*C$C1C-C6C@C4B BVBVBBBBnBBBBBBB*C@CBBBBBBC3CC@=CQCIC@=C@?C4C@9CC@7C@C@C CCCB@C-C7C?C@=C0C@9C@CC1C@?C,B5BBBgBBBBBBBB@CBBBBCCC@CCB@9CCEC@?C@bCOCC@CCC$CBCB@CC C C C@C@C"C2CUC0CEClCBBBBBBBCBBBBBB@C@CBBBBCBBB@=C@;CCXC3CC(CBBBBBBCBCCC@C$CB3C7C;C C5C CBBBC@CBBBBBBBBBBC CBCCBBB C CB7C5CC1CCBBBBB@CCBBBB@CB@CCBBBBwBBBxBBnBBBBBBB@CBBBBBBBBBBCCBC9C@=CPC*CBB@9C5C$C(CCBBBBB CBBBBB$C5BoBCB5BoBBBBBBBBBBBCBBCBBBCBC@GC@?CACCB0C@ACBB CCBB CC@CBBBBBBB@CABBABBBBBBBBBBBBBBBBBBBBCdC2C@C@9CBB,CBBBCCCBB CCBBnBBBB@$C3CABDBBBBBBBBBBBBCBBBCBBBB C.C1C@5C?CCBCBBBBBB@CCCCBBBwBB C C3C*CABBBB>B,BBoBfBFBBBBvBB CBBB CCB*CKCBC(CBB CBBBBBB@C CB CCBBwBBBCBBBB CBABBB^BBBBBB CBBBNBBB@=C0CCBC@9CBBBBBBBBBBCCBBCCBBBBBBBBCVBA=BBBBBCBBEBFB=BBBBC@C@CBVBBBBBBBBBBBBBBB CCBBBBBBCCBBBgdalautotest-3.0.4/alg/data/utmsmall_ds_lanczos.tiff0000644003401500001440000000212413614004466022236 0ustar rouaultusersII*fS   JI@I@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|ju}tjvqjwqwlw|ptkn|n~n|vkjt|}|{sxzvwy~mjoo|y{v|vr{zzzr}mixsrs~|wmismpuzc{r̻kyvxvd{x}ymr}tqms}dppyryjlp\yn~{y{xttwxxogqlznt`q~muisko{|luai~csv~ykxvwxn|t{sM^o|mlbrg|r}sawufehgwxn}xemqazwn~n[|zeyh`lgfz\~znyp}Wksp_\lzvqpux}wqgkjkbtiagmw|po^rs_bbddbifS   8I@I@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/alg/data/utmsmall_cubicspline_2.vrt0000644003401500001440000000412713614004466022510 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 CubicSpline Byte ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/utmsmall_near_float.vrt0000644003401500001440000000343713614004466022104 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 NearestNeighbour Float32 ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_Q3.vrt0000644003401500001440000000447613614004466021767 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Quartile3 Int16 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,120,0,3751320,0,-120 -3672.666666666667,0.008333333333333333,0,31261,0,-0.008333333333333333 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/contour_in.tif0000644003401500001440000000116213614004466020173 0ustar rouaultusersII* S %& +?AC@5)1A>DGEB#3<EGHJJJE #4<>FIJKJJEA(6CFHIKLJIC<6.>EJLLKJGC=80(8CHLPOOLF?7/(!FIKMNNLH@5+"GIJKJHE@6) HHHHEA;4( HFD?;50) EA;3,(# ?92*" gdalautotest-3.0.4/alg/data/utmsmall_cubic_2.vrt0000644003401500001440000000412113614004466021267 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray 50 50 6.71089e+07 Cubic Byte ../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 gdalautotest-3.0.4/alg/data/unmergable.grd0000644003401500001440000000037013614004466020127 0ustar rouaultusersncols 5 nrows 7 xllcorner 440720.000000000000 yllcorner 3751020.000000000000 cellsize 60.000000000000 NODATA_value 132 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_mode.vrt0000644003401500001440000000455613614004466022427 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area -3.27670000000000E+04 Gray 30 30 6.71089e+07 Mode Int32 utmsmall-int16-neg.tiff 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,120,0,3751320,0,-120 -3672.66666666666652,0.00833333333333333322,0,31261,0,-0.00833333333333333322 -32767 0 -32767 0 gdalautotest-3.0.4/alg/data/cutline_multipolygon.vrt0000644003401500001440000000451013614004466022332 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 5.9999999999999993e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -5.9999999999999993e+01 512 128 6.71089e+07 NearestNeighbour Byte ../../gcore/data/utmsmall.tif 0.125 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,59.99999999999999,0,3751320,0,-59.99999999999999 -7345.333333333334,0.01666666666666667,0,62522.00000000001,0,-0.01666666666666667 MULTIPOLYGON(((10 10,10 50,60 50, 10 10)),((70 70,70 100,100 100,100 70,70 70),(80 80,80 90,90 90,90 80,80 80))) gdalautotest-3.0.4/alg/data/test_nearest_float.vrt0000644003401500001440000001060413614004466021733 0ustar rouaultusers 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 2.0983170908647397e+04, 5.0109700347667203e+03, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0109700347667203e+03 Alpha 512 128 6.71089e+07 NearestNeighbour Float32 ../tmp/test.tif 0.125 500000,5000,0,5000000,0,-5000 -100,0.0002,0,1000,0,-0.0002 20983.1709086474,5010.97003476672,0,5017540.250625971,0,-5010.97003476672 -4.187446894127006,0.000199562159235014,0,1001.311166463512,0,-0.000199562159235014 PROJCS["WGS 84 / UTM zone 30N",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",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32630"]] 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 4 4 gdalautotest-3.0.4/alg/data/utmsmall_near.vrt0000644003401500001440000000343413614004466020714 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 NearestNeighbour Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/rgbsmall_dstalpha.vrt0000644003401500001440000000424413614004466021534 0ustar rouaultusers 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"]] -4.4840319999999998e+01, 3.4319999999999950e-03, 0.0000000000000000e+00, -2.2932583999999999e+01, 0.0000000000000000e+00, -3.4319999999999950e-03 Alpha 512 128 6.71089e+07 NearestNeighbour Byte ../gcore/data/rgbsmall.tif 0.125 -44.84032,0.003432,0,-22.932584,0,-0.003432 13065.3613053613,291.3752913752913,0,-6681.988344988345,0,-291.3752913752913 -44.84032,0.003431999999999995,0,-22.932584,0,-0.003431999999999995 13065.36130536132,291.3752913752918,0,-6681.988344988355,0,-291.3752913752918 4 gdalautotest-3.0.4/alg/data/pat.tif0000644003401500001440000000155413614004466016605 0ustar rouaultusersII* q(S255HH/wrk/home/warmerda/small.tif@@@@@@@@@gdalautotest-3.0.4/alg/data/utmsmall_cubic_2.tif0000644003401500001440000000536113614004466021245 0ustar rouaultusersII*22r2 =S   V^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|xSzk^\zqQo @1d$^HD"4 I Ybb1k;χ=OaiFvaж6 C \ߠL/u.~:9}IH$"x<Ch$dlbj =?Ix.Ǒ@(  #pTsi u!4ZPZ]} ۑmaszٽF9/Ud6|cdxˣ."LD"ކqx**Վ_Lٵ^ DtƳp@+Kl>Z14͠?51+yvfN<>$ZT7G̹Sau¤ TϏw󙰂RSs@2)ͤQ*pd" [~-, 3^i\$U }PYl/m {Q'"7VʬoP.ˍi&/7;aGq$<ХmE)ٗfͣ?>D=Tp2E %GeWiF*L|$s|Ca-1X͈W5CȘ^-K' -N,}^|Tc{t7\MmiQʍ>+8Wo߾ٟ}n3piīQI b{,O-ݿm.lSOquCa߿ߜ:9>N֝z* aY.-ںula'zzqouL֮9:ͬ.T#wE~_^/>XZX ?; 3< O`T~7NG<~6Yh@ېzL͍i$,KE:Ӊٝ%Stibj} @)mr2@zAiꅂŅd>-,,.:;>:]9#)L@c24Ё)Qg AGIU݃׶3VO t6@ۼ@'!;ߑU9?8۱HER[F`iK&uSvA;/?>Z}N/L:$BŮ7Nqztb?휼K,q02?X iC[ **`y NѐoY{s>>l{ŠˋX=uM(ЩXxQy=8t@`ݼa4]=k\Y>9l˭ֻte/L" P !2 L`, )..jdj+-XȷmRiF?B~w|3x bByuXw8sQGh=S鉠Y"V){IY 4W4I~.񁉱okb#Ɲ㥠Kߞ+-:_qIz@& x'7j&i|jzܸRVv+(B-KAQ5V1 = AC?Һ2=xkeZnly|~1dAJv9@.BdֈĢkW.|s }q'Wۮ76U6uCoēpCD^//C* Zb%I}b@ǘDDt (zɷ y\A_WjfS&Y[BdMlmCO7[qR) k/.W+MsVE\,?DmXw6*1R ~zN!>R (T* k++a54{<gdalautotest-3.0.4/alg/data/utmsmall-int16-neg_Q3.tif0000644003401500001440000000420113614004466021720 0ustar rouaultusersII*yS   Vr^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|-32767    .  . .  &    ._Fx  F  ..6>  OFF>..>O&_6    .xWF&66.F&6O& 6OF&6_g&6>x6W&>& FO&>OFF& .>>.6pO_& ..W__p&.&._F&&&p6F& .WW6.66& _p&& &&Fg&F.6..6&6  .&&&6F&& _&&66.  &&>66.> _>&&O6.66 & g.OOO_O_g6&&..&.66&&FOF>_gx_ .. &.FpF& &F>_pFW&&xO ..O_WF.xpx   F66F.g>x_.O6.  &g&>.6_>>W>FF &Og&p_> &FW.>&_&  & ..  >&6. &>.&>&> .&.F  &&&.&O>F &6. .666 ..O.  & OW&>6 gdalautotest-3.0.4/alg/data/warp_52_dem.tif0000644003401500001440000003101413614004466020117 0ustar rouaultusersII*zz!=S   6!v+ f  $O d@O d@t$z`A8QA#  )#WGS 84 / Pseudo-Mercator|WGS 84|xuY%EwLj5 <${1ppppppB8ʊ~ô^~}UEFfdfe,E)cK~o}+Xk{q^>cyv3.ۈG/)W^m\rIdfnFs^ŴOmr+wā-^t2Q㸝^}ۯMZʸ [9+y]-m3@X16oY/ݳ<L;cteyvFb.׋LoȮճ[[ xK9|);zϫLsZ6.ۓͧSA/)|Æv>ۓ,Evؘ&Ke=e^ƀQDbF%ܸہy7sذ4b9 `fa(<[@軞#6wwFuj[׊YV}8qܼVDl]2?NLq?*ߎY]SgR޺WZ.z n,"{}p94r$p ?,ler2WU |bYeud|׭j5Mӹ7U!1H-N&7`gbf]dڔ3'YI<׬vǭɌneFi୏7R1YVL6'{VvK6KRӓuF kA *A;U \jV,+]l^-aLPE\+i 7rJYJZ5]e~qz~٧"9Rނ(GXlV WZub mJ YgUSfWkQ0FG?o(5f(m6)vv9t۵ߗ<݌r>l]Fn@EHņ@(kq}e #DЗ7ըtm;s՜3rvlrJ`f*qĹGnoZe< CUe}ǺUմEz̴ w cA\/=ԙ:k>Y?}B1㊑*EWD^IX~}涾Fճ z3MBOxeǾՉvͷ%X^Xbm^孴7=g3;.Kx2X> Dq/VػS_V-[ۦطb%4 t7;{Y0?5Vn|:FRU5 [z̛Z)U/|ݻ=ٻgoXyZL+1VamY2cW,|;q1fr+m,1D Ƶ#^'tjE'l&w~Ao+X6B']ϲmie]Cx]l}+ij-~\壭y5*C.yEr_v?}:`YH.m*v)[ʿSxuYKGwfcpQBBxl  $$*?=;V (B, H((6lL۱ر=3ǽwNU93֝~[]_}ΩDzjj-h2v'܆+e7renٍ"тk7|ZlM^}<J/JmdߠCmr Vr w:9oùs|x4BEI8ki얀zĽU\YF#U1Hp7WzT2#.yۣӭ3 '28c+qǏ63@VI7ϻ:\G>[5c"̜a ~_66߆g:A{l }i&} c2?q:کi+V{Q=mRTscP]/gݣ5GsDKQqG ´oE1WUuTtTreƠ \_[enDme{$.I۴KA8h$2`"縺f7D#ݦcy\e*uj#WGbVR:lfгJ✀i56;H^Y&Dō:2V׌.] =!tu[clxŵgrx^l3'[**;)V1+SU⋭蹍x|*Μq:s_,)WbEj-hI6zt*"Lk"8ґZ3]rTEHd_WI(>=;rTBh3Uw:dS>̵-xAਝ¸,bNg8梈6?Ĺf3=^9+` 5qpf&f/ 9|k5q>ʶeQ?\#N>,f8cq*EwLc&٫#vu}ىdkg"1}zYr6Ŭ#Dh=o 7@ۨ+_s$nO¹9f8Q[\_2\M^ֱRM?P]=::;U{պ櫯N^CkFw6bum"s(|-MQ<|!X#:ctoY}ƻ"^Y.k)Է?yKvAm C$[-:^]Po0<۹d` 5l>5 [s7Ī\GXޤ7:7z֤4"8sGZsucF,Oщxl[%w오^mq&^z,jC+ϖ^,AW3B \q ZZ~ +)sڢ4f3Z#Vd+NdlюQOF%^ګ6;ggg1vAU昙vgC8W!UqeѪ [Z=z8+g .㗼{^Ktɹk4^@ُ wu .d]-]f昳,ELK*ݢ[]9X^L|^_'l)k#5J27Ϲ炵 ^} t'l4ܥerA\{ؗ^Wg EI5քŒʂ'b+<#$:=cv? yk c ]B}l_w_A^WU iwr$Ѽ+} Y~Ffu7?!72{s^xј~NbuMk~)i#K~}Dl_B̷ؗwT;4Er~;/;a9=v K WǮ(8bCG߈uTܾ; ަp1?NHDBX+Hԍu}yBZg-}{VL3xx͙j4Q7زHS)h[*TtuKt>#[Ik`/TA)خjw xBGnwRPueFA1Vʮrvuso: S(,UˌM9[{[x|^ςz~͒00 ߔ/Ȳ˹q&Un)t%ۯ# Ru~-/sּbٿSI⟆[fִ^gp0%^H}TU8D^s{B7mOoP9zUQ̾%*,k2Ҥk/w5}#ߢ3Rvpy͓ f6 qՊNX<[GMHu-[d967aa|SpiwgQ{&g$\@sV#9bѽpk);[| 8<epfFO}l^ۀ|8cT^FtVc]C? 刼OG(ʷiJqԬx_u;LmگjsPPY:zGF5gflř:DE <X= }u=ATUٟ|U@&eeo[qWe#,pUk$YndMpd'|Z4-GWuUO ؾˎ믈)*̭ߖߑ5ru x4;'V{oy4ч-WxZjzea仚ẑ] ]E^?Cps ,hb -?V;HV5~ayxNð9ݢq&9,GLIe=xO ˍkV6r~|i"&j×W:S7gagntjwa1xCzmXfUFЍ&JTNᥕZ幮[ bwIQ{VhF$©|l42Uj)g\my{b+]1nwQZ&a,QߵX5MZڧεK `/:| ԟ3M'~ςx'[;G~V{ި׼> ބ23b/hi zYcKs`)Fph;Zw? ;HGQ]l:IuK%n6g;`u|pV/6 1ga0Du~ڼiFtflfc*8ĬU+i?kTEa<_yW"W:^E rush3As)GhXZ׽hiWNתzυVwjVs0[-a9R}_~ 3ݠJ 9ld3Ml! _̣Cd9|䝖}F#uG&6 !ӵ&f-9I瞲\h`YW+^o|#N.zҭ3licktaW?1Q0^|fLDk_}֪l3\0mSglq9VVՖZFi 5[뺣TWQ]n_ Pޣ<+Vk;;t]S3<[^"!Ga|9HDgAv:7qϴ٪[o;K ˵ jm59'Uj}=~[:$A?VzXXk,%3'Oڋbu\}lm]b{ ]bsv9xndFVcU2,**R=g6D[un2ny'̱KX܋*ԣ<~yGP FTɰ+dg"  ~]_uo,WѼנHW5>fo]kVOpO#k#{= ~'!==t"7P~?CvL`ѻfV*D˒Y/SԾCֵn^sޟ62+9y4[4]Ay 樰?$|~~n?\=eKaJQYb*X~>eڼb5zU')Q1[&:۱U[LZmdBY(JĞԿ'zwQcg[R?:.t)~8B^B&A| Lcx#bޕ5gȽfWuFMqn/)N+d-ԺPUӠ%L$wGx}tG䛋TW'GQ@| ybx !GwYr%_]Yȳ8%=mT{+C#vVDk&kdh4WвE]2CA~oj2'P`1e}qk {#zWཉ#{L{D[weð1gsy bQFQ 3jo9gUZ^:ޘFo,bYwl+}]L׻ӵd(:xmwf"@BAPDEu֮Cۇ/]@jZW]jV1J DHd"y$MrIr^6;sw{MK+*Vj|jTOɒ.vp.#^FtRh\u}O4]j/Ahlc518GDU8-1͐Qʘ~~Jh="JC->%(GĽ.}c,'>7_KetG/h\&yfZ'گ`^/kNi禉q5h̰'Ҥ\VJv=(CYs'M:A ;!)0qet%-PڸCwXlK'1 *{h6H\ k׹k ?W$_\ϙT6O~CS 62Y[L ~'QtPosD?3S~58P@%+eu#ꕝx*IߢӺBf@U2 HȷM(G]DNA|̥صB<̻7/Τ:KREܓTwbEmF^IzQ]*~m?i\7fC<9Lz\mmwR>/C~6SՕ;N,Ff.t5͹M'Z,w(,afnQFK1jsd?̀L:9o]\K;g-BD`|ԭ\syiThOh:-/]F  ܣi[.r2ͧG\T'f_s(zU|UAqt=h%9Iz'==ja I)z,&u`j7s,f;P.qItOBm0? aXlݙF BcxY TbZ*ߔ`Qb}.kOV疭EO:-zCje9'韵g0R *p,wT[TB ѕXf4^s`npHaj[Oj,m: A }Okym#<,A-~[=Fex ׫{KO[q4H-iBQ; sT#`.ge,vKqWq>}ؿf@=Rg5r:/*9rY9n7rxjȷweo^CS`=Ss J`Z'AUY$x3g&{y R9ܝ3'ϻ^EnDk2.*&]+~<2yfv,yfR;*e~CūNې Ur^zY?Moŕl|s:>ݾD\Q8/S^`10gײךM>~ cֽFo1fvXob5rXby,pM۴Z^p4Oʷ)e۷^DQߜ#*5xnr#jۊB d=B.r~%^CjQHj'a},<&=;DZ>?Vݷ8l_˺jO6,{cϬKA~mg;ͷ>p!Ej^ﲳߌJ1< |0qs(uPy+K;uR`kxˣ0dTQqf]Y:t̥7S;ɩu%te_DutwsEb Xq-Du^m/0 "ou *MVXj>>34Ol83m#SJ2>j/{V>>hQ6 83xrw1>nrx xf?C`1FUt֭Pe@THo`ȼcV ]>C pY[[a /fu9J#eОgdalautotest-3.0.4/alg/data/polygonize_in_2.grd0000644003401500001440000001217513614004466021122 0ustar rouaultusersncols 36 nrows 42 xllcorner 0.000000000000 yllcorner -42.000000000000 cellsize 1.000000000000 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 2 15 30 60 109 167 246 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 113 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 202 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 205 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 250 235 196 133 33 0 0 0 0 0 47 251 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 247 99 0 0 0 0 0 167 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 254 60 0 0 0 0 85 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 175 0 0 0 0 35 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 233 0 0 0 0 11 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 250 0 0 0 0 8 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 233 0 0 0 0 27 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 176 0 0 0 0 75 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 254 62 0 0 0 0 152 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 248 103 0 0 0 0 28 243 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 250 236 198 135 35 0 0 0 0 8 190 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 196 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 84 175 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 58 164 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 205 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 243 227 186 129 37 0 0 0 0 9 185 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 254 149 7 0 0 0 9 214 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 170 0 0 0 0 56 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 72 0 0 0 0 191 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 166 0 0 0 0 105 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 224 0 0 0 0 47 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 246 0 0 0 0 19 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 244 0 0 0 0 5 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 222 0 0 0 0 23 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 164 0 0 0 0 47 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 68 0 0 0 0 105 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 165 0 0 0 0 0 183 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 253 146 6 0 0 0 0 49 253 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 255 244 228 187 129 37 0 0 0 0 0 3 196 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 164 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 178 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 118 240 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 7 22 37 74 125 182 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 gdalautotest-3.0.4/alg/data/warpedvrt_with_ovr.vrt0000644003401500001440000000627013614004466022011 0ustar rouaultusers -2.9991966282908999e+002, 2.5531597443786556e+000, 0.0000000000000000e+000, 2.2681602079169127e+002, 0.0000000000000000e+000,-2.5612550811638806e+000 Red Green Blue 512 128 6.71089e+007 NearestNeighbour Byte warpedvrt_with_ovr.png 0.125 0 -0.69617369803609108,0.99213321513500075,0,1022.1492516466913,0,-0.99213321513500075 0.70169377198137839,1.0079291618756345,0,1030.2540385240566,0,-1.0079291618756345 gdalautotest-3.0.4/alg/data/utmsmall_cubic.vrt0000644003401500001440000000342113614004466021050 0ustar rouaultusers 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"]] 440720,10,0,3751320,0,-10 Gray 512 128 6.71089e+07 Cubic Byte ../../gcore/data/utmsmall.tif 440720,60,0,3751320,0,-60 -7345.333333333333,0.01666666666666667,0,62522,0,-0.01666666666666667 440720,10,0,3751320,0,-10 gdalautotest-3.0.4/alg/data/utmsmall_cubicspline_2.tif0000644003401500001440000000531513614004466022457 0ustar rouaultusersII*22r2[ =S   V^@^@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|x gS?Mr38cs6&"PCHz/Ht޻ $ H0609ܝLcsiD¤Ј8 2 H$c0|ˮ>}dof) Qp=@ T f ٹtjdxf׎dJf&d U$i8AS($@Ie ER,*qBf %l/$0rh5X}]-fO7WFVAJ:>19u:×ێЬ?tWkTIct֤tRIgmʩ B%N.]D|>>V26ٴX*V[4JqdR_i=;o[-eƗ82tLSFa5jZl[g_?쬔frX(6JkК./5*:ìч_~xu7彄ś,dcDt~mjäT k0s+vuW;WWfqo14*s0̯./-ݠϠYLJWCGaX1InnJBi]xqћǗY|M'qki) ;{'_V<=Y][/-+GO#㣣\rR(U 3_t% hɇSrz'spLf33z10*;Jeeft\^:Jd:K|y`>kiJu\X.KٵRi} iQ.aC4igk#zZQ~?~}s6%QD.C0I&4w*> :՞=lDx251d\yDR\,ē篧y;GQC0G X4BgTPp%i݃\p/?Zc ^h0j3J8l}DJƚ?\OGw{&B;Ɍ^5̙䳙Äq{PU` };/bXpqPW6EX{mkv"OsI@= yuB::qWE$^],%غQ1w9L& 3X@`rD&zC [isj~KB2FYC47 H (z \f!DSNH{u$B_W774ę,bpƣg=>w.IFn\"ZfD[{/9I$tW/}Lf1cnܽ]᷆HTSb_Dcx<yܺqs08wtw-v! lhL u1ÙY&{- H.JSŖʑBR 'ED*9 6k?ܪmlltsXh GZ̩R6j_Qm>%זvh;C U"2NaJ/m}NɄ@%FS:xoED|"@2?7+ $8Bb(n<2 60%4' |[duP8T8f|.It`#QJu֪8~?^4vXbG¨ؾVxW/o -6 ӈ'/j:!M]{ b%PRЮ6& ⺇@W3wֽ^|v0F @[뛛jZx\|8Ýgdalautotest-3.0.4/alg/data/empty_rc.vrt0000644003401500001440000001056713614004466017700 0ustar rouaultusers 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 2.0983170908647397e+04, 5.0109700347667203e+03, 0.0000000000000000e+00, 5.0175402506259708e+06, 0.0000000000000000e+00, -5.0109700347667203e+03 Alpha 512 128 6.71089e+07 Cubic Byte ../tmp/empty.tif 0.125 500000,5000,0,5000000,0,-5000 -100,0.0002,0,1000,0,-0.0002 20983.1709086474,5010.97003476672,0,5017540.250625971,0,-5010.97003476672 -4.187446894127006,0.000199562159235014,0,1001.311166463512,0,-0.000199562159235014 PROJCS["WGS 84 / UTM zone 30N",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",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32630"]] 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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32631"]] 4 4 gdalautotest-3.0.4/alg/warp.py0000755003401500001440000014537713614005314015737 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: warp.py a84c4ea25b201702c1065405b13656176b5b501e 2019-11-28 20:16:03 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test the image reprojection functions. Try to test as many # resamplers as possible (we have optimized resamplers for some # data types, test them too). # Author: Andrey Kiselev, dron16@ak4719.spb.edu # ############################################################################### # Copyright (c) 2008, Andrey Kiselev # 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 shutil import sys from osgeo import gdal from osgeo import osr import gdaltest import pytest import struct ############################################################################### # Verify that we always getting the same image when warping. # Warp the image using the VRT file and compare result with reference image # Upsampling def test_warp_1(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_near.vrt') ref_ds = gdal.Open('data/utmsmall_near.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_1_short(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_near_short.vrt') ref_ds = gdal.Open('data/utmsmall_near.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_1_ushort(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_near_ushort.vrt') ref_ds = gdal.Open('data/utmsmall_near.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_1_float(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_near_float.vrt') ref_ds = gdal.Open('data/utmsmall_near.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_2(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_blinear.vrt') ref_ds = gdal.Open('data/utmsmall_blinear.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_2_short(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_blinear_short.vrt') ref_ds = gdal.Open('data/utmsmall_blinear.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_2_ushort(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_blinear_ushort.vrt') ref_ds = gdal.Open('data/utmsmall_blinear.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_2_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_bilinear_2.vrt') ref_ds = gdal.Open('data/utmsmall_bilinear_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_3(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubic.vrt') ref_ds = gdal.Open('data/utmsmall_cubic.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_3_short(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubic_short.vrt') ref_ds = gdal.Open('data/utmsmall_cubic.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_3_ushort(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubic_ushort.vrt') ref_ds = gdal.Open('data/utmsmall_cubic.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_3_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubic_2.vrt') ref_ds = gdal.Open('data/utmsmall_cubic_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_3_float_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubic_2_float.vrt') ref_ds = gdal.Open('data/utmsmall_cubic_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4_short(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline_short.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4_ushort(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline_ushort.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline_2.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4_short_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline_wt_short.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_4_float_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_cubicspline_wt_float32.vrt') ref_ds = gdal.Open('data/utmsmall_cubicspline_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_5(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_lanczos.vrt') ref_ds = gdal.Open('data/utmsmall_lanczos.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_5_downsize(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_lanczos_2.vrt') ref_ds = gdal.Open('data/utmsmall_lanczos_2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Downsampling def test_warp_6(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_near.vrt', 1, 4770) return tst.testOpen() def test_warp_7(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_blinear.vrt', 1, 4755) return tst.testOpen() def test_warp_8(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() tst = gdaltest.GDALTest('VRT', 'utmsmall_ds_cubic.vrt', 1, 4833) return tst.testOpen() def test_warp_9(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_ds_cubicspline.vrt') ref_ds = gdal.Open('data/utmsmall_ds_cubicspline.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_10(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_ds_lanczos.vrt') ref_ds = gdal.Open('data/utmsmall_ds_lanczos.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' def test_warp_11(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() tst = gdaltest.GDALTest('VRT', 'rgbsmall_dstalpha.vrt', 4, 30658) return tst.testOpen() # Test warping an empty RGBA with bilinear resampling def test_warp_12(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/empty.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(0) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'empty_rb.vrt', 4, 0) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/empty.tif') return ret # Test warping an empty RGBA with cubic resampling def test_warp_13(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/empty.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(0) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'empty_rc.vrt', 4, 0) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/empty.tif') return ret # Test warping an empty RGBA with cubic spline resampling def test_warp_14(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/empty.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(0) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'empty_rcs.vrt', 4, 0) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/empty.tif') return ret # Test GWKNearestFloat with transparent source alpha band def test_warp_15(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/test.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(0) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'test_nearest_float.vrt', 4, 0) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/test.tif') return ret # Test GWKNearestFloat with opaque source alpha band def test_warp_16(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/test.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(255) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(255) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'test_nearest_float.vrt', 4, 4921) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/test.tif') return ret # Test GWKNearestShort with transparent source alpha band def test_warp_17(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/test.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(0) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(0) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'test_nearest_short.vrt', 4, 0) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/test.tif') return ret # Test GWKNearestShort with opaque source alpha band def test_warp_18(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/test.tif', 20, 20, 4) ds.GetRasterBand(1).Fill(255) ds.GetRasterBand(2).Fill(0) ds.GetRasterBand(3).Fill(0) ds.GetRasterBand(4).Fill(255) ds = None # The alpha channel must be empty tst = gdaltest.GDALTest('VRT', 'test_nearest_short.vrt', 4, 4921) ret = tst.testOpen() gdaltest.tiff_drv.Delete('tmp/test.tif') return ret def warp_19_internal(size, datatype, resampling_string): ds = gdaltest.tiff_drv.Create('tmp/test.tif', size, size, 1, datatype) ds.SetGeoTransform((10, 5, 0, 30, 0, -5)) ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]') ds.GetRasterBand(1).Fill(10.1, 20.1) ds = None gdal.Warp('tmp/testwarp.tif', 'tmp/test.tif', options='-r ' + resampling_string) ref_ds = gdal.Open('tmp/test.tif') ds = gdal.Open('tmp/testwarp.tif') checksum = ds.GetRasterBand(1).Checksum() checksum_ref = ref_ds.GetRasterBand(1).Checksum() ds = None ref_ds = None gdaltest.tiff_drv.Delete('tmp/testwarp.tif') assert checksum == checksum_ref gdaltest.tiff_drv.Delete('tmp/test.tif') # Test all data types and resampling methods for very small images # to test edge behaviour def test_warp_19(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() datatypes = [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_CInt16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_CInt32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_CFloat32, gdal.GDT_Float64, gdal.GDT_CFloat64] methods = ['near', 'bilinear', 'cubic', 'cubicspline', 'lanczos', 'average'] sizes = [1, 2, 3, 7] for size in sizes: print('Testing size = %d ...' % size) for method in methods: for datatype in datatypes: warp_19_internal(size, datatype, method) # Test fix for #2724 (initialization of destination area to nodata in warped VRT) def test_warp_20(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() tst = gdaltest.GDALTest('VRT', 'white_nodata.vrt', 1, 1705) return tst.testOpen() ############################################################################### # Test overviews on warped VRT files def test_warp_21(): shutil.copy('data/utmsmall_near.vrt', 'tmp/warp_21.vrt') ds = gdal.Open('tmp/warp_21.vrt', gdal.GA_Update) ds.BuildOverviews('NEAR', overviewlist=[2]) ds = None ds = gdal.Open('tmp/warp_21.vrt') if ds.GetRasterBand(1).GetOverviewCount() != 1: pytest.skip() ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None os.remove('tmp/warp_21.vrt') ############################################################################### # Test warping with datasets which are "bigger" than the wm parameter. # Would have detected issue of #3458 def test_warp_22(): # Generate source image with non uniform data w = 1001 h = 1001 ds = gdal.GetDriverByName('GTiff').Create("tmp/warp_22_src.tif", w, h, 1) ds.SetGeoTransform([2, 0.01, 0, 49, 0, -0.01]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) for j in range(h): line = '' for i in range(w): line = line + '%c' % int((i * i + h * j / (i + 1)) % 256) ds.GetRasterBand(1).WriteRaster(0, j, w, 1, line) expected_cs = ds.GetRasterBand(1).Checksum() ds = None ret = 'success' failures = '' # warp with various options for option1 in ['', '-wo OPTIMIZE_SIZE=TRUE']: for option2 in ['', '-co TILED=YES', '-co TILED=YES -co BLOCKXSIZE=16 -co BLOCKYSIZE=16']: option = option1 + ' ' + option2 try: os.remove('tmp/warp_22_dst.tif') except OSError: pass # -wm should not be greater than 2 * w * h. Let's put it at its minimum value gdal.Warp('tmp/warp_22_dst.tif', 'tmp/warp_22_src.tif', options='-wm 100000 ' + option) ds = gdal.Open('tmp/warp_22_dst.tif') cs = ds.GetRasterBand(1).Checksum() if cs != expected_cs: if failures != '': failures = failures + '\n' failures = failures + 'failed for %s. Checksum : got %d, expected %d' % (option, cs, expected_cs) ret = 'fail' ds = None if failures != '': gdaltest.post_reason(failures) os.remove('tmp/warp_22_src.tif') os.remove('tmp/warp_22_dst.tif') return ret ############################################################################### # Test warping with datasets where some RasterIO() requests involve nBufXSize == 0 (#3582) def test_warp_23(): gcp1 = gdal.GCP() gcp1.GCPPixel = 3213 gcp1.GCPLine = 2225 gcp1.GCPX = -88.834495 gcp1.GCPY = 29.979959 gcp2 = gdal.GCP() gcp2.GCPPixel = 2804 gcp2.GCPLine = 2236 gcp2.GCPX = -88.836706 gcp2.GCPY = 29.979516 gcp3 = gdal.GCP() gcp3.GCPPixel = 3157 gcp3.GCPLine = 4344 gcp3.GCPX = -88.833389 gcp3.GCPY = 29.969519 gcp4 = gdal.GCP() gcp4.GCPPixel = 3768 gcp4.GCPLine = 5247 gcp4.GCPX = -88.830168 gcp4.GCPY = 29.964958 gcp5 = gdal.GCP() gcp5.GCPPixel = 2697 gcp5.GCPLine = 9225 gcp5.GCPX = -88.83516 gcp5.GCPY = 29.945386 gcp6 = gdal.GCP() gcp6.GCPPixel = 4087 gcp6.GCPLine = 12360 gcp6.GCPX = -88.827899 gcp6.GCPY = 29.929807 gcp7 = gdal.GCP() gcp7.GCPPixel = 4629 gcp7.GCPLine = 11258 gcp7.GCPX = -88.825102 gcp7.GCPY = 29.93527 gcp8 = gdal.GCP() gcp8.GCPPixel = 4480 gcp8.GCPLine = 7602 gcp8.GCPX = -88.826733 gcp8.GCPY = 29.95304 gcps = [gcp1, gcp2, gcp3, gcp4, gcp5, gcp6, gcp7, gcp8] sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds = gdal.GetDriverByName('GTiff').Create('tmp/test3582.tif', 70, 170, 4, options=['SPARSE_OK=YES']) for i, gcp in enumerate(gcps): gcps[i].GCPPixel = gcp.GCPPixel / 10 gcps[i].GCPLine = gcp.GCPLine / 10 ds.SetGCPs(gcps, sr.ExportToWkt()) ds = None ds = gdal.Warp('', 'tmp/test3582.tif', format='MEM') ret = 'success' if ds is None: gdaltest.post_reason('could not open output dataset') ret = 'fail' ds = None os.remove('tmp/test3582.tif') return ret ############################################################################### # Test fix for #3658 (numerical imprecision with Ubuntu 8.10 GCC 4.4.3 -O2 leading to upper # left pixel being not set in GWKBilinearResample() case) def test_warp_24(): ds_ref = gdal.Open('data/test3658.tif') cs_ref = ds_ref.GetRasterBand(1).Checksum() ds = gdal.Warp('', ds_ref, options='-of MEM -r bilinear') cs = ds.GetRasterBand(1).Checksum() assert cs == cs_ref, 'did not get expected checksum' ############################################################################### # Test -refine_gcps (#4143) def test_warp_25(): ds = gdal.Open('data/refine_gcps.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672, 'did not get expected checksum' ############################################################################### # Test serializing and deserializing TPS transformer def test_warp_26(): gdal.Translate('tmp/warp_25_gcp.vrt', '../gcore/data/byte.tif', options='-of VRT -gcp 0 0 0 20 -gcp 0 20 0 0 ' '-gcp 20 0 20 20 -gcp 20 20 20 0') gdal.Warp('tmp/warp_25_warp.vrt', 'tmp/warp_25_gcp.vrt', options='-of VRT -tps') ds = gdal.Open('tmp/warp_25_warp.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672, 'did not get expected checksum' os.unlink('tmp/warp_25_gcp.vrt') os.unlink('tmp/warp_25_warp.vrt') ############################################################################### # Pure Python reprojection example. Nothing particular, just make use of existing # API. def warp_27_progress_callback(pct, message, user_data): # pylint: disable=unused-argument return 1 # 1 to continue, 0 to stop def test_warp_27(): # Open source dataset src_ds = gdal.Open('../gcore/data/byte.tif') # Desfine target SRS dst_srs = osr.SpatialReference() dst_srs.ImportFromEPSG(4326) dst_wkt = dst_srs.ExportToWkt() error_threshold = 0.125 # error threshold --> use same value as in gdalwarp resampling = gdal.GRA_Bilinear # Call AutoCreateWarpedVRT() to fetch default values for target raster dimensions and geotransform tmp_ds = gdal.AutoCreateWarpedVRT(src_ds, None, # src_wkt : left to default value --> will use the one from source \ dst_wkt, \ resampling, \ error_threshold) dst_xsize = tmp_ds.RasterXSize dst_ysize = tmp_ds.RasterYSize dst_gt = tmp_ds.GetGeoTransform() tmp_ds = None # Now create the true target dataset dst_ds = gdal.GetDriverByName('GTiff').Create('tmp/warp_27.tif', dst_xsize, dst_ysize, src_ds.RasterCount) dst_ds.SetProjection(dst_wkt) dst_ds.SetGeoTransform(dst_gt) # And run the reprojection cbk = warp_27_progress_callback cbk_user_data = None # value for last parameter of above warp_27_progress_callback gdal.ReprojectImage(src_ds, dst_ds, None, # src_wkt : left to default value --> will use the one from source \ None, # dst_wkt : left to default value --> will use the one from destination \ resampling, \ 0, # WarpMemoryLimit : left to default value \ error_threshold, cbk, # Progress callback : could be left to None or unspecified for silent progress cbk_user_data) # Progress callback user data # Done ! dst_ds = None # Check that we have the same result as produced by 'gdalwarp -rb -t_srs EPSG:4326 ../gcore/data/byte.tif tmp/warp_27.tif' ds = gdal.Open('tmp/warp_27.tif') cs = ds.GetRasterBand(1).Checksum() ds = None ds = gdal.Warp('tmp/warp_27_ref.tif', '../gcore/data/byte.tif', options='-rb -t_srs EPSG:4326') ref_cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == ref_cs gdal.Unlink('tmp/warp_27.tif') gdal.Unlink('tmp/warp_27_ref.tif') ############################################################################### # Test reading a VRT with a destination alpha band, but no explicit # INIT_DEST setting def test_warp_28(): ds = gdal.Open('data/utm_alpha_noinit.vrt') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() assert not (cs1 == 0 or cs2 == 0), 'bad checksum' ds = None ############################################################################### # Test multi-thread computations def test_warp_29(): ds = gdal.Open('data/white_nodata.vrt') cs_monothread = ds.GetRasterBand(1).Checksum() ds = None old_val = gdal.GetConfigOption('GDAL_NUM_THREADS') gdal.SetConfigOption('GDAL_NUM_THREADS', 'ALL_CPUS') gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', '0') ds = gdal.Open('data/white_nodata.vrt') cs_multithread = ds.GetRasterBand(1).Checksum() ds = None gdal.SetConfigOption('GDAL_NUM_THREADS', old_val) gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', None) assert cs_monothread == cs_multithread old_val = gdal.GetConfigOption('GDAL_NUM_THREADS') gdal.SetConfigOption('GDAL_NUM_THREADS', '2') gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', '0') ds = gdal.Open('data/white_nodata.vrt') cs_multithread = ds.GetRasterBand(1).Checksum() ds = None gdal.SetConfigOption('GDAL_NUM_THREADS', old_val) gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', None) assert cs_monothread == cs_multithread src_ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Open('data/byte_gcp.vrt') old_val = gdal.GetConfigOption('GDAL_NUM_THREADS') gdal.SetConfigOption('GDAL_NUM_THREADS', '2') gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', '0') got_cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_NUM_THREADS', old_val) gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', None) ds = None assert got_cs == src_ds.GetRasterBand(1).Checksum() ds = gdal.Open('data/byte_tps.vrt') old_val = gdal.GetConfigOption('GDAL_NUM_THREADS') gdal.SetConfigOption('GDAL_NUM_THREADS', '2') gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', '0') got_cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GDAL_NUM_THREADS', old_val) gdal.SetConfigOption('WARP_THREAD_CHUNK_SIZE', None) ds = None assert got_cs == src_ds.GetRasterBand(1).Checksum() src_ds = None ############################################################################### # Test warping interruption def warp_30_progress_callback(pct, message, user_data): # pylint: disable=unused-argument return bool(pct <= 0.2) def test_warp_30(): # Open source dataset src_ds = gdal.Open('../gcore/data/byte.tif') # Desfine target SRS dst_srs = osr.SpatialReference() dst_srs.ImportFromEPSG(4326) dst_wkt = dst_srs.ExportToWkt() error_threshold = 0.125 # error threshold --> use same value as in gdalwarp resampling = gdal.GRA_Bilinear # Call AutoCreateWarpedVRT() to fetch default values for target raster dimensions and geotransform tmp_ds = gdal.AutoCreateWarpedVRT(src_ds, None, # src_wkt : left to default value --> will use the one from source \ dst_wkt, \ resampling, \ error_threshold) dst_xsize = tmp_ds.RasterXSize dst_ysize = tmp_ds.RasterYSize dst_gt = tmp_ds.GetGeoTransform() tmp_ds = None # Now create the true target dataset dst_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/warp_30.tif', dst_xsize, dst_ysize, src_ds.RasterCount) dst_ds.SetProjection(dst_wkt) dst_ds.SetGeoTransform(dst_gt) # And run the reprojection cbk = warp_30_progress_callback cbk_user_data = None # value for last parameter of above warp_27_progress_callback gdal.PushErrorHandler('CPLQuietErrorHandler') ret = gdal.ReprojectImage(src_ds, dst_ds, None, # src_wkt : left to default value --> will use the one from source \ None, # dst_wkt : left to default value --> will use the one from destination \ resampling, \ 0, # WarpMemoryLimit : left to default value \ error_threshold, cbk, # Progress callback : could be left to None or unspecified for silent progress cbk_user_data) # Progress callback user data gdal.PopErrorHandler() assert ret != 0 old_val = gdal.GetConfigOption('GDAL_NUM_THREADS') gdal.SetConfigOption('GDAL_NUM_THREADS', '2') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = gdal.ReprojectImage(src_ds, dst_ds, None, # src_wkt : left to default value --> will use the one from source \ None, # dst_wkt : left to default value --> will use the one from destination \ resampling, \ 0, # WarpMemoryLimit : left to default value \ error_threshold, cbk, # Progress callback : could be left to None or unspecified for silent progress cbk_user_data) # Progress callback user data gdal.PopErrorHandler() gdal.SetConfigOption('GDAL_NUM_THREADS', old_val) assert ret != 0 gdal.Unlink('/vsimem/warp_30.tif') # Average (Byte) def test_warp_31(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_average.vrt') ref_ds = gdal.Open('data/utmsmall_average.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Average (Float) def test_warp_32(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_average_float.vrt') ref_ds = gdal.Open('data/utmsmall_average_float.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Mode (Byte) def test_warp_33(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_mode.vrt') ref_ds = gdal.Open('data/utmsmall_mode.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Mode (Int16) def test_warp_34(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_mode_int16.vrt') ref_ds = gdal.Open('data/utmsmall_mode_int16.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Mode (Int16 - signed with negative values) def test_warp_35(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_mode.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_mode.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Mode (Int32) - this uses algorithm 2 (inefficient) def test_warp_36(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_mode_int32.vrt') ref_ds = gdal.Open('data/utmsmall_mode_int32.tiff') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # Test a few error cases def test_warp_37(): # Open source dataset src_ds = gdal.Open('../gcore/data/byte.tif') # Dummy proj.4 method sr = osr.SpatialReference() sr.ImportFromWkt("""PROJCS["unnamed", GEOGCS["unnamed ellipse", DATUM["unknown", SPHEROID["unnamed",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]], PROJECTION["custom_proj4"], UNIT["Meter",1], EXTENSION["PROJ4","+proj=dummy_method +units=m +wktext"]]""") dst_wkt = sr.ExportToWkt() gdal.PushErrorHandler('CPLQuietErrorHandler') tmp_ds = gdal.AutoCreateWarpedVRT(src_ds, None, dst_wkt) gdal.PopErrorHandler() gdal.ErrorReset() assert tmp_ds is None ############################################################################### # Test a warp with GCPs on the *destination* image. def test_warp_38(): # Create an output file with GCPs. out_file = 'tmp/warp_38.tif' ds = gdal.GetDriverByName('GTiff').Create(out_file, 50, 50, 3) gcp_list = [ gdal.GCP(397000, 5642000, 0, 0, 0), gdal.GCP(397000, 5641990, 0, 0, 50), gdal.GCP(397010, 5642000, 0, 50, 0), gdal.GCP(397010, 5641990, 0, 50, 50), gdal.GCP(397005, 5641995, 0, 25, 25), ] ds.SetGCPs(gcp_list, gdaltest.user_srs_to_wkt('EPSG:32632')) ds = None gdal.Warp(out_file, 'data/test3658.tif', options='-to DST_METHOD=GCP_POLYNOMIAL') ds = gdal.Open(out_file) cs = ds.GetRasterBand(1).Checksum() ds = None # Should exactly match the source file. exp_cs = 30546 assert cs == exp_cs os.unlink(out_file) ############################################################################### # Test a warp with GCPs for TPS on the *destination* image. def test_warp_39(): # Create an output file with GCPs. out_file = 'tmp/warp_39.tif' ds = gdal.GetDriverByName('GTiff').Create(out_file, 50, 50, 3) gcp_list = [ gdal.GCP(397000, 5642000, 0, 0, 0), gdal.GCP(397000, 5641990, 0, 0, 50), gdal.GCP(397010, 5642000, 0, 50, 0), gdal.GCP(397010, 5641990, 0, 50, 50), gdal.GCP(397005, 5641995, 0, 25, 25), ] ds.SetGCPs(gcp_list, gdaltest.user_srs_to_wkt('EPSG:32632')) ds = None gdal.Warp(out_file, 'data/test3658.tif', options='-to DST_METHOD=GCP_TPS') ds = gdal.Open(out_file) cs = ds.GetRasterBand(1).Checksum() ds = None # Should exactly match the source file. exp_cs = 30546 assert cs == exp_cs os.unlink(out_file) ############################################################################### # test average (#5311) def test_warp_40(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/2by2.vrt') ref_ds = gdal.Open('data/2by2.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # test GDALSuggestedWarpOutput (#5693) def test_warp_41(): src_ds = gdal.Open(""" -2.0037508340000000e+07, 5.9716428339481353e-01, 0.0000000000000000e+00, 2.0037508340000000e+07, 0.0000000000000000e+00, -5.9716428339481353e-01 dummy 1 """) vrt_ds = gdal.AutoCreateWarpedVRT(src_ds, None, None, gdal.GRA_NearestNeighbour, 0.3) assert vrt_ds.RasterXSize == src_ds.RasterXSize assert vrt_ds.RasterYSize == src_ds.RasterYSize src_gt = src_ds.GetGeoTransform() vrt_gt = vrt_ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - vrt_gt[i]) <= 1e-5 ############################################################################### # Maximum def test_warp_42(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_max.vrt') ref_ds = gdal.Open('data/utmsmall_max.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Minimum def test_warp_43(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_min.vrt') ref_ds = gdal.Open('data/utmsmall_min.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Median def test_warp_44(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_med.vrt') ref_ds = gdal.Open('data/utmsmall_med.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Quartile 1 def test_warp_45(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_Q1.vrt') ref_ds = gdal.Open('data/utmsmall_Q1.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Quartile 3 def test_warp_46(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall_Q3.vrt') ref_ds = gdal.Open('data/utmsmall_Q3.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Maximum (Int16 - signed with negative values) def test_warp_47(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_max.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_max.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Minimum (Int16 - signed with negative values) def test_warp_48(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_min.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_min.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Median (Int16 - signed with negative values) def test_warp_49(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_med.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_med.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Quartile 1 (Int16 - signed with negative values) def test_warp_50(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_Q1.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_Q1.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' # Quartile 3 (Int16 - signed with negative values) def test_warp_51(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.tiff_drv is None: pytest.skip() ds = gdal.Open('data/utmsmall-int16-neg_Q3.vrt') ref_ds = gdal.Open('data/utmsmall-int16-neg_Q3.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ds = None ref_ds = None assert maxdiff <= 1, 'Image too different from reference' ############################################################################### # Test fix for #6182 def test_warp_52(): src_ds = gdal.GetDriverByName('MEM').Create('', 4096, 4096, 3, gdal.GDT_UInt16) rpc = [ "HEIGHT_OFF=1466.05894327379", "HEIGHT_SCALE=144.837606185489", "LAT_OFF=38.9266809014185", "LAT_SCALE=-0.108324009570885", "LINE_DEN_COEFF=1 -0.000392404256440504 -0.0027925489381758 0.000501819414812054 0.00216726134806561 -0.00185617059201599 0.000183834173326118 -0.00290342803717354 -0.00207181007131322 -0.000900223247894285 -0.00132518281680544 0.00165598132063197 0.00681015244696305 0.000547865679631528 0.00516214646283021 0.00795287690785699 -0.000705040639059332 -0.00254360623317078 -0.000291154885056484 0.00070943440010757", "LINE_NUM_COEFF=-0.000951099635749339 1.41709976082781 -0.939591985038569 -0.00186609235173885 0.00196881101098923 0.00361741523740639 -0.00282449434932066 0.0115361898794214 -0.00276027843825304 9.37913944402154e-05 -0.00160950221565737 0.00754053609977256 0.00461831968713819 0.00274991122620312 0.000689605203796422 -0.0042482778732957 -0.000123966494595151 0.00307976709897974 -0.000563274426174409 0.00049981716767074", "LINE_OFF=2199.50159296339", "LINE_SCALE=2195.852519621", "LONG_OFF=76.0381768085136", "LONG_SCALE=0.130066683772651", "SAMP_DEN_COEFF=1 -0.000632078047521022 -0.000544107268758971 0.000172438016778527 -0.00206391734870399 -0.00204445747536872 -0.000715754551621987 -0.00195545265530244 -0.00168532972557267 -0.00114709980708329 -0.00699131177532728 0.0038551339822296 0.00283631282133365 -0.00436885468926666 -0.00381335885955994 0.0018742043611019 -0.0027263909314293 -0.00237054119407013 0.00246374716379501 -0.00121074576302219", "SAMP_NUM_COEFF=0.00249293151551852 -0.581492592442025 -1.00947448466175 0.00121597346320039 -0.00552825219917498 -0.00194683170765094 -0.00166012459012905 -0.00338315804553888 -0.00152062885009498 -0.000214562164393127 -0.00219914905535387 -0.000662800177832777 -0.00118644828432841 -0.00180061222825708 -0.00364756875260519 -0.00287273485650089 -0.000540077934728493 -0.00166800463003749 0.000201057249109451 -8.49620129025469e-05", "SAMP_OFF=3300.34602166792", "SAMP_SCALE=3297.51222987611" ] src_ds.SetMetadata(rpc, "RPC") import time start = time.time() out_ds = gdal.Warp('', src_ds, format='MEM', outputBounds=[8453323.83095, 4676723.13796, 8472891.71018, 4696291.0172], xRes=4.77731426716, yRes=4.77731426716, dstSRS='EPSG:3857', warpOptions=['SKIP_NOSOURCE=YES', 'DST_ALPHA_MAX=255'], transformerOptions=['RPC_DEM=data/warp_52_dem.tif'], dstAlpha=True, errorThreshold=0, resampleAlg=gdal.GRA_Cubic) end = time.time() assert end - start <= 5, 'processing time was way too long' cs = out_ds.GetRasterBand(4).Checksum() assert cs == 3188 ############################################################################### # Test Grey+Alpha def test_warp_53(): if sys.platform == 'darwin': pytest.skip("Expected checksum should be updated for Mac") for typestr in ('Byte', 'UInt16', 'Int16'): src_ds = gdal.Translate('', '../gcore/data/byte.tif', options='-of MEM -b 1 -b 1 -ot ' + typestr) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(2).Fill(255) zero = struct.pack('B' * 1, 0) src_ds.GetRasterBand(2).WriteRaster(10, 10, 1, 1, zero, buf_type=gdal.GDT_Byte) dst_ds = gdal.Translate('', src_ds, options='-of MEM -a_srs EPSG:32611') for option in ('-wo USE_GENERAL_CASE=TRUE', ''): # First checksum is proj 4.8, second proj 4.9.2 for alg_name, expected_cs in (('near', [3781, 3843]), ('cubic', [3942, 4133]), ('cubicspline', [3874, 4076]), ('bilinear', [4019, 3991])): dst_ds.GetRasterBand(1).Fill(0) dst_ds.GetRasterBand(2).Fill(0) gdal.Warp(dst_ds, src_ds, options='-r ' + alg_name + ' ' + option) cs1 = dst_ds.GetRasterBand(1).Checksum() cs2 = dst_ds.GetRasterBand(2).Checksum() if cs1 not in expected_cs or cs2 not in [3903, 4138]: print(typestr) print(option) pytest.fail(alg_name) ############################################################################### # Test Alpha on UInt16/Int16 def test_warp_54(): # UInt16 src_ds = gdal.Translate('', '../gcore/data/stefan_full_rgba.tif', options='-of MEM -scale 0 255 0 65535 -ot UInt16 -a_ullr -162 150 0 0') dst_ds = gdal.Warp('', src_ds, format='MEM') for i in range(4): expected_cs = src_ds.GetRasterBand(i + 1).Checksum() got_cs = dst_ds.GetRasterBand(i + 1).Checksum() assert expected_cs == got_cs, i # Int16 src_ds = gdal.Translate('', '../gcore/data/stefan_full_rgba.tif', options='-of MEM -scale 0 255 0 32767 -ot Int16 -a_ullr -162 150 0 0') dst_ds = gdal.Warp('', src_ds, format='MEM') for i in range(4): expected_cs = src_ds.GetRasterBand(i + 1).Checksum() got_cs = dst_ds.GetRasterBand(i + 1).Checksum() assert expected_cs == got_cs, i # Test NBITS src_ds = gdal.Translate('', '../gcore/data/stefan_full_rgba.tif', options='-of MEM -scale 0 255 0 32767 -ot UInt16 -a_ullr -162 150 0 0') for i in range(4): src_ds.GetRasterBand(i + 1).SetMetadataItem('NBITS', '15', 'IMAGE_STRUCTURE') dst_ds = gdal.Warp('/vsimem/warp_54.tif', src_ds, options='-co NBITS=15') for i in range(4): expected_cs = src_ds.GetRasterBand(i + 1).Checksum() got_cs = dst_ds.GetRasterBand(i + 1).Checksum() assert expected_cs == got_cs, i dst_ds = None gdal.Unlink('/vsimem/warp_54.tif') ############################################################################### # Test warped VRT with source overview, target GT != GenImgProjetion target GT # and subsampling (#6972) def test_warp_55(): ds = gdal.Open('data/warpedvrt_with_ovr.vrt') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 25128 ds = None ############################################################################### # Test bilinear interpolation when warping into same coordinate system (and # same size). This test crops a single pixel out of a 3-by-3 image. def test_warp_56(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() pix_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds = gdal.GetDriverByName('MEM').Create('', 3, 3) src_ds.GetRasterBand(1).WriteArray(numpy.array([[0, 0, 0], [0, 0, 0], [0, 0, 100]])) src_ds.SetGeoTransform([1, 1, 0, 1, 0, 1]) for off in numpy.linspace(0, 2, 21): pix_ds.SetGeoTransform([off + 1, 1, 0, off + 1, 0, 1]) gdal.Warp(pix_ds, src_ds, resampleAlg='bilinear') exp = 0 if off < 1 else 100 * (off - 1)**2 warped = pix_ds.GetRasterBand(1).ReadAsArray()[0, 0] assert abs(warped - exp) <= 0.6, \ 'offset: {}, expected: {:.0f}, got: {}'.format(off, exp, warped) ############################################################################### # Test bugfix for #1656 def test_warp_nearest_real_nodata_multiple_band(): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 1, 2, gdal.GDT_Float64) src_ds.GetRasterBand(1).SetNoDataValue(65535) src_ds.GetRasterBand(1).WriteRaster(0,0,1,1,struct.pack('d', 65535)) src_ds.GetRasterBand(2).SetNoDataValue(65535) src_ds.GetRasterBand(2).WriteRaster(0,0,1,1,struct.pack('d', 65535)) src_ds.SetGeoTransform([1, 1, 0, 1, 0, 1]) out_ds = gdal.Warp('', src_ds, options = '-of MEM') assert struct.unpack('d' * 4, out_ds.ReadRaster()) == struct.unpack('d' * 4, src_ds.ReadRaster()) gdalautotest-3.0.4/alg/applyverticalshiftgrid.py0000755003401500001440000003172413614005314021537 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: applyverticalshiftgrid.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDALApplyVerticalShiftGrid algorithm. # 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. ############################################################################### import gdaltest from osgeo import gdal, osr ############################################################################### # Rather dummy test: grid = DEM def test_applyverticalshiftgrid_1(): src_ds = gdal.Open('../gcore/data/byte.tif') src_ds = gdal.Translate('', src_ds, format='MEM', width=20, height=40) grid_ds = gdal.Translate('', src_ds, format='MEM') out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds.GetRasterBand(1).DataType == gdal.GDT_Byte assert out_ds.RasterXSize == src_ds.RasterXSize assert out_ds.RasterYSize == src_ds.RasterYSize assert out_ds.GetGeoTransform() == src_ds.GetGeoTransform() assert out_ds.GetProjectionRef() == src_ds.GetProjectionRef() # Check that we can drop the reference to the sources src_ds = None grid_ds = None cs = out_ds.GetRasterBand(1).Checksum() assert cs == 10038 src_ds = gdal.Open('../gcore/data/byte.tif') src_ds = gdal.Translate('', src_ds, format='MEM', width=20, height=40) # Test block size out_ds = gdal.ApplyVerticalShiftGrid(src_ds, src_ds, options=['BLOCKSIZE=15']) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 10038 # Inverse transformer out_ds = gdal.ApplyVerticalShiftGrid(src_ds, src_ds, True, options=['DATATYPE=Float32']) assert out_ds.GetRasterBand(1).DataType == gdal.GDT_Float32 cs = out_ds.GetRasterBand(1).Checksum() assert cs == 0 ############################################################################### # Error cases def test_applyverticalshiftgrid_2(): sr = osr.SpatialReference() sr.SetFromUserInput("WGS84") for i in range(6): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) if i != 0: src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) if i != 1: src_ds.SetProjection(sr.ExportToWkt()) if i == 2: src_ds.AddBand(gdal.GDT_Byte) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) if i != 3: grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) if i != 4: grid_ds.SetProjection(sr.ExportToWkt()) if i == 5: grid_ds.AddBand(gdal.GDT_Byte) with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds is None, i # Non invertable source geotransform src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 0, 0, 0, 0, 0]) src_ds.SetProjection(sr.ExportToWkt()) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds is None # Non invertable grid geotransform src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 0, 0, 0, 0, 0]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds is None # No PROJ.4 translation for source SRS, coordinate transformation # initialization has failed src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection('LOCAL_CS["foo"]') with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds is None # Out of memory if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is None: src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['BLOCKSIZE=2000000000']) assert out_ds is None # Wrong DATATYPE src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) with gdaltest.error_handler(): out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['DATATYPE=x']) assert out_ds is None ############################################################################### # Test with grid and src not in same projection def test_applyverticalshiftgrid_3(): src_ds = gdal.Open('../gcore/data/byte.tif') grid_ds = gdal.Warp('', src_ds, format='MEM', dstSRS='EPSG:4326', width=40, height=40) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['RESAMPLING=NEAREST']) assert out_ds.RasterXSize == src_ds.RasterXSize assert out_ds.RasterYSize == src_ds.RasterYSize assert out_ds.GetGeoTransform() == src_ds.GetGeoTransform() assert out_ds.GetProjectionRef() == src_ds.GetProjectionRef() cs = out_ds.GetRasterBand(1).Checksum() assert cs == 5112 out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['RESAMPLING=BILINEAR']) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 4867 or cs == 4868 out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['RESAMPLING=CUBIC']) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 4841 or cs == 4854 ############################################################################### # Test nodata def test_applyverticalshiftgrid_4(): sr = osr.SpatialReference() sr.SetFromUserInput("WGS84") # Nodata on source src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(1) src_ds.GetRasterBand(1).SetNoDataValue(1) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.GetRasterBand(1).Fill(30) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds.GetRasterBand(1).GetNoDataValue() == 1 cs = out_ds.GetRasterBand(1).Checksum() assert cs == 1 # Nodata on grid src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(1) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.GetRasterBand(1).Fill(30) grid_ds.GetRasterBand(1).SetNoDataValue(30) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds) assert out_ds.GetRasterBand(1).GetNoDataValue() is None cs = out_ds.GetRasterBand(1).Checksum() assert cs == 1 # ERROR_ON_MISSING_VERT_SHIFT due to non compatible extents src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(255) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([10, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['ERROR_ON_MISSING_VERT_SHIFT=YES']) with gdaltest.error_handler(): data = out_ds.GetRasterBand(1).ReadRaster() assert data is None # ERROR_ON_MISSING_VERT_SHIFT due to nodata in grid src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(255) grid_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) grid_ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.GetRasterBand(1).SetNoDataValue(0) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, options=['ERROR_ON_MISSING_VERT_SHIFT=YES']) with gdaltest.error_handler(): data = out_ds.GetRasterBand(1).ReadRaster() assert data is None ############################################################################### # Test scaling parameters def test_applyverticalshiftgrid_5(): src_ds = gdal.Open('../gcore/data/byte.tif') grid_ds = gdal.Translate('', src_ds, format='MEM') grid_ds.GetRasterBand(1).Fill(0) src_ds = gdal.Translate('', src_ds, format='MEM', outputType=gdal.GDT_Float32, scaleParams=[[0, 1, 0, 0.5]]) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, srcUnitToMeter=2) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 4672 src_ds = gdal.Open('../gcore/data/byte.tif') grid_ds = gdal.Translate('', src_ds, format='MEM') grid_ds.GetRasterBand(1).Fill(0) src_ds = gdal.Translate('', src_ds, format='MEM', outputType=gdal.GDT_Float32, scaleParams=[[0, 1, 0, 0.5]]) out_ds = gdal.ApplyVerticalShiftGrid(src_ds, grid_ds, dstUnitToMeter=0.5) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### # Simulate EGM grids def test_applyverticalshiftgrid_6(): grid_ds = gdal.GetDriverByName('GTX').Create( '/vsimem/applyverticalshiftgrid_6.gtx', 1440, 721, 1, gdal.GDT_Float32) grid_ds.SetGeoTransform([-180.125, 0.25, 0, 90.125, 0, -0.25]) grid_ds.GetRasterBand(1).Fill(10) grid_ds = None ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', dstSRS='+proj=utm +zone=11 +datum=NAD27 +geoidgrids=/vsimem/applyverticalshiftgrid_6.gtx +vunits=m +no_defs') cs = ds.GetRasterBand(1).Checksum() assert cs == 4783 gdal.Unlink('/vsimem/applyverticalshiftgrid_6.gtx') ############################################################################### # Simulate USA geoid grids with long origin > 180 def test_applyverticalshiftgrid_7(): grid_ds = gdal.GetDriverByName('GTX').Create( '/vsimem/applyverticalshiftgrid_7.gtx', 700, 721, 1, gdal.GDT_Float32) grid_ds.SetGeoTransform([-150 + 360, 0.25, 0, 90.125, 0, -0.25]) grid_ds.GetRasterBand(1).Fill(10) grid_ds = None ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', dstSRS='+proj=utm +zone=11 +datum=NAD27 +geoidgrids=/vsimem/applyverticalshiftgrid_7.gtx +vunits=m +no_defs') cs = ds.GetRasterBand(1).Checksum() assert cs == 4783 gdal.Unlink('/vsimem/applyverticalshiftgrid_7.gtx') gdalautotest-3.0.4/alg/tmp/0000755003401500001440000000000013614004466015177 5ustar rouaultusersgdalautotest-3.0.4/alg/tmp/do-not-remove0000644003401500001440000000000013614004466017603 0ustar rouaultusersgdalautotest-3.0.4/alg/dither.py0000755003401500001440000000644513614005314016235 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: dither.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test gdal.ComputeMedianCutPCT() and gdal.DitherRGB2PCT() # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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 pytest ############################################################################### # Test def test_dither_1(): drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') r_band = src_ds.GetRasterBand(1) g_band = src_ds.GetRasterBand(2) b_band = src_ds.GetRasterBand(3) dst_ds = drv.Create('tmp/rgbsmall.tif', src_ds.RasterXSize, src_ds.RasterYSize, 1, gdal.GDT_Byte) dst_band = dst_ds.GetRasterBand(1) ct = gdal.ColorTable() nColors = 8 gdal.ComputeMedianCutPCT(r_band, g_band, b_band, nColors, ct) dst_band.SetRasterColorTable(ct) gdal.DitherRGB2PCT(r_band, g_band, b_band, dst_band, ct) cs_expected = 8803 cs = dst_band.Checksum() dst_band = None dst_ds = None assert ct.GetCount() == nColors, 'color table size wrong' ref_ct = [(36, 48, 32, 255), (92, 120, 20, 255), (88, 96, 20, 255), (92, 132, 56, 255), (0, 0, 0, 255), (96, 152, 24, 255), (60, 112, 32, 255), (164, 164, 108, 255)] for i in range(nColors): ct_data = ct.GetColorEntry(i) ref_data = ref_ct[i] for j in range(4): if ct_data[j] != ref_data[j]: for k in range(nColors): print(ct.GetColorEntry(k)) print(ref_ct[k]) pytest.fail('color table mismatch') if cs == cs_expected or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': drv.Delete('tmp/rgbsmall.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') gdalautotest-3.0.4/alg/rasterize.py0000755003401500001440000003463313614005314016766 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: rasterize.py 932fc9a9e36f82efdf1a22175e39ffe8ef03b46f 2019-02-21 22:11:37 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test RasterizeLayer() and related calls. # 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 struct import ogrtest from osgeo import gdal, ogr, osr import pytest ############################################################################### # Simple polygon rasterization. def test_rasterize_1(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) # Create a memory raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a memory layer to rasterize from. rast_ogr_ds = \ ogr.GetDriverByName('Memory').CreateDataSource('wrk') rast_mem_lyr = rast_ogr_ds.CreateLayer('poly', srs=sr) # Add a polygon. wkt_geom = 'POLYGON((1020 1030,1020 1045,1050 1045,1050 1030,1020 1030))' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) # Add a linestring. wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) # Run the algorithm. err = gdal.RasterizeLayer(target_ds, [3, 2, 1], rast_mem_lyr, burn_values=[200, 220, 240]) assert err == 0, 'got non-zero result code from RasterizeLayer' # Check results. expected = 6452 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum) gdal.GetDriverByName('GTiff').CreateCopy('tmp/rasterize_1.tif', target_ds) pytest.fail('Did not get expected image checksum') ############################################################################### # Test rasterization with ALL_TOUCHED. def test_rasterize_2(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' # Create a memory raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 12, 12, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((0, 1, 0, 12, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a memory layer to rasterize from. cutline_ds = ogr.Open('data/cutline.csv') # Run the algorithm. gdal.PushErrorHandler('CPLQuietErrorHandler') err = gdal.RasterizeLayer(target_ds, [3, 2, 1], cutline_ds.GetLayer(0), burn_values=[200, 220, 240], options=["ALL_TOUCHED=TRUE"]) gdal.PopErrorHandler() assert err == 0, 'got non-zero result code from RasterizeLayer' # Check results. expected = 121 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum) gdal.GetDriverByName('GTiff').CreateCopy('tmp/rasterize_2.tif', target_ds) pytest.fail('Did not get expected image checksum') ############################################################################### # Rasterization with BURN_VALUE_FROM. def test_rasterize_3(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) # Create a memory raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a memory layer to rasterize from. rast_ogr_ds = \ ogr.GetDriverByName('Memory').CreateDataSource('wrk') rast_mem_lyr = rast_ogr_ds.CreateLayer('poly', srs=sr) # Add polygons and linestrings. wkt_geom = ['POLYGON((1020 1030 40,1020 1045 30,1050 1045 20,1050 1030 35,1020 1030 40))', 'POLYGON((1010 1046 85,1015 1055 35,1055 1060 26,1054 1048 35,1010 1046 85))', 'POLYGON((1020 1076 190,1025 1085 35,1065 1090 26,1064 1078 35,1020 1076 190),(1023 1079 5,1061 1081 35,1062 1087 26,1028 1082 35,1023 1079 85))', 'LINESTRING(1005 1000 10, 1100 1050 120)', 'LINESTRING(1000 1000 150, 1095 1050 -5, 1080 1080 200)'] for g in wkt_geom: feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=g)) rast_mem_lyr.CreateFeature(feat) # Run the algorithm. err = gdal.RasterizeLayer(target_ds, [3, 2, 1], rast_mem_lyr, burn_values=[10, 10, 55], options=["BURN_VALUE_FROM=Z"]) assert err == 0, 'got non-zero result code from RasterizeLayer' # Check results. expected = 15006 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum) gdal.GetDriverByName('GTiff').CreateCopy('tmp/rasterize_3.tif', target_ds) pytest.fail('Did not get expected image checksum') ############################################################################### # Rasterization with ATTRIBUTE. def test_rasterize_4(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) # Create a memory raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a memory layer to rasterize from. rast_ogr_ds = ogr.GetDriverByName('Memory').CreateDataSource('wrk') rast_mem_lyr = rast_ogr_ds.CreateLayer('poly', srs=sr) # Setup Schema ogrtest.quick_create_layer_def(rast_mem_lyr, [('CELSIUS', ogr.OFTReal)]) # Add polygons and linestrings and a field named CELSIUS. wkt_geom = ['POLYGON((1020 1030 40,1020 1045 30,1050 1045 20,1050 1030 35,1020 1030 40))', 'POLYGON((1010 1046 85,1015 1055 35,1055 1060 26,1054 1048 35,1010 1046 85))', 'POLYGON((1020 1076 190,1025 1085 35,1065 1090 26,1064 1078 35,1020 1076 190),(1023 1079 5,1061 1081 35,1062 1087 26,1028 1082 35,1023 1079 85))', 'LINESTRING(1005 1000 10, 1100 1050 120)', 'LINESTRING(1000 1000 150, 1095 1050 -5, 1080 1080 200)'] celsius_field_values = [50, 255, 60, 100, 180] i = 0 for g in wkt_geom: feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=g)) feat.SetField('CELSIUS', celsius_field_values[i]) rast_mem_lyr.CreateFeature(feat) i = i + 1 # Run the algorithm. err = gdal.RasterizeLayer(target_ds, [1, 2, 3], rast_mem_lyr, options=["ATTRIBUTE=CELSIUS"]) assert err == 0, 'got non-zero result code from RasterizeLayer' # Check results. expected = 16265 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum) gdal.GetDriverByName('GTiff').CreateCopy('tmp/rasterize_4.tif', target_ds) pytest.fail('Did not get expected image checksum') ############################################################################### # Rasterization with MERGE_ALG=ADD. def test_rasterize_5(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) # Create a memory raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a memory layer to rasterize from. rast_ogr_ds = \ ogr.GetDriverByName('Memory').CreateDataSource('wrk') rast_mem_lyr = rast_ogr_ds.CreateLayer('poly', srs=sr) # Add polygons. wkt_geom = 'POLYGON((1020 1030,1020 1045,1050 1045,1050 1030,1020 1030))' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) wkt_geom = 'POLYGON((1045 1050,1055 1050,1055 1020,1045 1020,1045 1050))' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) # Add linestrings. wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) wkt_geom = 'LINESTRING(1005 1000, 1000 1050)' feat = ogr.Feature(rast_mem_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_mem_lyr.CreateFeature(feat) # Run the algorithm. err = gdal.RasterizeLayer(target_ds, [1, 2, 3], rast_mem_lyr, burn_values=[100, 110, 120], options=["MERGE_ALG=ADD"]) assert err == 0, 'got non-zero result code from RasterizeLayer' # Check results. expected = 13022 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum) gdal.GetDriverByName('GTiff').CreateCopy('tmp/rasterize_5.tif', target_ds) pytest.fail('Did not get expected image checksum') ############################################################################### # Test bug fix for #5580 (used to hang) def test_rasterize_6(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) wkb = struct.pack('B' * 93, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 5, 65, 28, 138, 141, 120, 239, 76, 104, 65, 87, 9, 185, 80, 29, 20, 208, 65, 28, 144, 191, 125, 165, 41, 54, 65, 87, 64, 14, 111, 103, 53, 124, 65, 30, 132, 127, 255, 255, 255, 254, 65, 87, 63, 241, 218, 241, 62, 127, 65, 30, 132, 128, 0, 0, 0, 0, 65, 87, 9, 156, 142, 126, 144, 236, 65, 28, 138, 141, 120, 239, 76, 104, 65, 87, 9, 185, 80, 29, 20, 208) data_source = ogr.GetDriverByName('MEMORY').CreateDataSource('') layer = data_source.CreateLayer('', sr, geom_type=ogr.wkbPolygon) feature = ogr.Feature(layer.GetLayerDefn()) feature.SetGeometryDirectly(ogr.CreateGeometryFromWkb(wkb)) layer.CreateFeature(feature) mask_ds = gdal.GetDriverByName('Mem').Create('', 5000, 5000, 1, gdal.GDT_Byte) mask_ds.SetGeoTransform([499000, 0.4, 0, 6095000, 0, -0.4]) mask_ds.SetProjection(sr_wkt) gdal.RasterizeLayer(mask_ds, [1], layer, burn_values=[1], options=["ALL_TOUCHED"]) ############################################################################### # Test rasterizing linestring with multiple segments and MERGE_ALG=ADD # Tests https://github.com/OSGeo/gdal/issues/1307 def test_rasterize_merge_alg_add_multiple_segment_linestring(): # Setup working spatial reference sr_wkt = 'LOCAL_CS["arbitrary"]' sr = osr.SpatialReference(sr_wkt) data_source = ogr.GetDriverByName('MEMORY').CreateDataSource('') layer = data_source.CreateLayer('', sr, geom_type=ogr.wkbLineString) feature = ogr.Feature(layer.GetLayerDefn()) # Diagonal segments feature.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(0.5 0.5,100.5 50.5,199.5 99.5)')) layer.CreateFeature(feature) feature = ogr.Feature(layer.GetLayerDefn()) # Vertical and horizontal segments feature.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(30.5 40.5,30.5 70.5,50.5 70.5)')) layer.CreateFeature(feature) ds = gdal.GetDriverByName('Mem').Create('', 10, 10, 1, gdal.GDT_Byte) ds.SetGeoTransform([0, 20, 0, 100, 0, -10]) ds.SetProjection(sr_wkt) ds.GetRasterBand(1).Fill(0) gdal.RasterizeLayer(ds, [1], layer, burn_values=[1], options=["MERGE_ALG=ADD"]) got = struct.unpack('B' * 100, ds.ReadRaster()) expected = (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) assert got == expected, '%s' % str(got) ds.GetRasterBand(1).Fill(0) gdal.RasterizeLayer(ds, [1], layer, burn_values=[1], options=["MERGE_ALG=ADD", "ALL_TOUCHED"]) got = struct.unpack('B' * 100, ds.ReadRaster()) expected = (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) assert got == expected, '%s' % str(got) gdalautotest-3.0.4/alg/transformgeoloc.py0000755003401500001440000000607313614005314020157 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: transformgeoloc.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test TransformGeoloc algorithm. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2012, Frank Warmerdam # Copyright (c) 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 osr import pytest ############################################################################### # Test a fairly default case. def test_transformgeoloc_1(): try: import numpy except ImportError: pytest.skip() # Setup 2x2 geolocation arrays in a memory dataset with lat/long values. drv = gdal.GetDriverByName('MEM') geoloc_ds = drv.Create('geoloc_1', 2, 2, 3, gdal.GDT_Float64) lon_array = numpy.asarray([[-117.0, -116.0], [-116.5, -115.5]]) lat_array = numpy.asarray([[45.0, 45.5], [44.0, 44.5]]) geoloc_ds.GetRasterBand(1).WriteArray(lon_array) geoloc_ds.GetRasterBand(2).WriteArray(lat_array) # Z left as default zero. # Create a wgs84 to utm transformer. wgs84_wkt = osr.GetUserInputAsWKT('WGS84') utm_wkt = osr.GetUserInputAsWKT('+proj=utm +zone=11 +datum=WGS84') ll_utm_transformer = gdal.Transformer(None, None, ['SRC_SRS=' + wgs84_wkt, 'DST_SRS=' + utm_wkt]) # transform the geoloc dataset in place. status = ll_utm_transformer.TransformGeolocations( geoloc_ds.GetRasterBand(1), geoloc_ds.GetRasterBand(2), geoloc_ds.GetRasterBand(3)) print(status) print(geoloc_ds.ReadAsArray()) gdalautotest-3.0.4/pyscripts/0000755003401500001440000000000013614005315015666 5ustar rouaultusersgdalautotest-3.0.4/pyscripts/test_gdal2tiles.py0000755003401500001440000002427413614005314021344 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal2tiles.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal2tiles.py testing # 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 os import sys import shutil from osgeo import gdal # noqa import test_py_scripts # noqa # pylint: disable=E0401 import pytest def test_gdal2tiles_py_simple(): script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() shutil.copy('../gdrivers/data/small_world.tif', 'tmp/out_gdal2tiles_smallworld.tif') os.chdir('tmp') test_py_scripts.run_py_script( script_path, 'gdal2tiles', '-q out_gdal2tiles_smallworld.tif') os.chdir('..') os.unlink('tmp/out_gdal2tiles_smallworld.tif') ds = gdal.Open('tmp/out_gdal2tiles_smallworld/0/0/0.png') expected_cs = [25314, 28114, 6148, 59026] for i in range(4): if ds.GetRasterBand(i + 1).Checksum() != expected_cs[i]: for j in range(4): print(ds.GetRasterBand(j + 1).Checksum()) pytest.fail('wrong checksum for band %d' % (i + 1)) ds = None for filename in ['googlemaps.html', 'leaflet.html', 'openlayers.html', 'tilemapresource.xml']: assert os.path.exists('tmp/out_gdal2tiles_smallworld/' + filename), \ ('%s missing' % filename) def test_gdal2tiles_py_zoom_option(): script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() shutil.rmtree('tmp/out_gdal2tiles_smallworld', ignore_errors=True) # Because of multiprocessing, run as external process, to avoid issues with # Ubuntu 12.04 and socket.setdefaulttimeout() # as well as on Windows that doesn't manage to fork test_py_scripts.run_py_script_as_external_script( script_path, 'gdal2tiles', '-q --force-kml --processes=2 -z 0-1 ../gdrivers/data/small_world.tif tmp/out_gdal2tiles_smallworld') ds = gdal.Open('tmp/out_gdal2tiles_smallworld/1/0/0.png') expected_cs = [8130, 10496, 65274, 63715] for i in range(4): if ds.GetRasterBand(i + 1).Checksum() != expected_cs[i]: for j in range(4): print(ds.GetRasterBand(j + 1).Checksum()) pytest.fail('wrong checksum for band %d' % (i + 1)) ds = None ds = gdal.Open('tmp/out_gdal2tiles_smallworld/doc.kml') assert ds is not None, 'did not get kml' def test_does_not_error_when_source_bounds_close_to_tiles_bound(): """ Case where the border coordinate of the input file is inside a tile T but the first pixel is actually assigned to the tile next to T (nearest neighbour), meaning that when the query is done to get the content of T, nothing is returned from the raster. """ in_files = ['./data/test_bounds_close_to_tile_bounds_x.vrt', './data/test_bounds_close_to_tile_bounds_y.vrt'] out_folder = 'tmp/out_gdal2tiles_bounds_approx' try: shutil.rmtree(out_folder) except Exception: pass script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() try: for in_file in in_files: test_py_scripts.run_py_script( script_path, 'gdal2tiles', '-q -z 21-21 %s %s' % (in_file, out_folder)) except TypeError: pytest.fail( 'Case of tile not getting any data not handled properly ' '(tiles at the border of the image)') def test_does_not_error_when_nothing_to_put_in_the_low_zoom_tile(): """ Case when the highest zoom level asked is actually too low for any pixel of the raster to be selected """ in_file = './data/test_bounds_close_to_tile_bounds_x.vrt' out_folder = 'tmp/out_gdal2tiles_bounds_approx' try: shutil.rmtree(out_folder) except OSError: pass script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() try: test_py_scripts.run_py_script( script_path, 'gdal2tiles', '-q -z 10 %s %s' % (in_file, out_folder)) except TypeError: pytest.fail( 'Case of low level tile not getting any data not handled properly ' '(tile at a zoom level too low)') def test_python2_handles_utf8_by_default(): if sys.version_info[0] >= 3: pytest.skip() return _test_utf8(should_raise_unicode=False) @pytest.mark.skip("This behaviour doesn't actually work as expected") def test_python2_gives_warning_if_bad_lc_ctype_and_non_ascii_chars(): if sys.version_info[0] >= 3: pytest.skip() lc_ctype = os.environ.get("LC_CTYPE", "") os.environ['LC_CTYPE'] = 'fr_FR.latin-1' ret = _test_utf8(should_raise_unicode=False, quiet=False, should_display_warning=True) os.environ['LC_CTYPE'] = lc_ctype return ret def test_python2_does_not_give_warning_if_bad_lc_ctype_and_all_ascii_chars(): if sys.version_info[0] >= 3: pytest.skip() lc_ctype = os.environ.get("LC_CTYPE", "") os.environ['LC_CTYPE'] = 'fr_FR.latin-1' ret = _test_utf8(should_raise_unicode=False, quiet=False, should_display_warning=False, input_file='./data/test_bounds_close_to_tile_bounds_x.vrt') os.environ['LC_CTYPE'] = lc_ctype return ret def test_python2_does_not_give_warning_if_bad_lc_ctype_and_non_ascii_chars_in_folder(): if sys.version_info[0] >= 3: pytest.skip() lc_ctype = os.environ.get("LC_CTYPE", "") os.environ['LC_CTYPE'] = 'fr_FR.latin-1' ret = _test_utf8(should_raise_unicode=False, quiet=False, should_display_warning=False, input_file='./data/漢字/test_bounds_close_to_tile_bounds_x.vrt') os.environ['LC_CTYPE'] = lc_ctype return ret def test_python3_handle_utf8_by_default(): if sys.version_info[0] < 3: pytest.skip() return _test_utf8(should_raise_unicode=False) def _test_utf8(should_raise_unicode=False, quiet=True, should_display_warning=False, input_file="data/test_utf8_漢字.vrt"): script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() out_folder = 'tmp/utf8_test' try: shutil.rmtree(out_folder) except OSError: pass args = '-z 21 %s %s' % (input_file, out_folder) if quiet: args = "-q " + args try: ret = test_py_scripts.run_py_script(script_path, 'gdal2tiles', args) print(ret) except UnicodeEncodeError: if should_raise_unicode: return pytest.fail('Should be handling filenames with utf8 characters in this context') assert not should_raise_unicode, \ 'Should not be handling filenames with utf8 characters in this context' if should_display_warning: assert "WARNING" in ret and "LC_CTYPE" in ret, \ 'Should display a warning message about LC_CTYPE variable' else: assert not ("WARNING" in ret and "LC_CTYPE" in ret), \ 'Should not display a warning message about LC_CTYPE variable' try: shutil.rmtree(out_folder) except OSError: pass def test_gdal2tiles_py_cleanup(): lst = ['tmp/out_gdal2tiles_smallworld', 'tmp/out_gdal2tiles_bounds_approx'] for filename in lst: try: shutil.rmtree(filename) except Exception: pass def test_exclude_transparent_tiles(): script_path = test_py_scripts.get_py_script('gdal2tiles') if script_path is None: pytest.skip() output_folder = 'tmp/test_exclude_transparent_tiles' os.makedirs(output_folder) try: test_py_scripts.run_py_script_as_external_script( script_path, 'gdal2tiles', '-x -z 14-16 data/test_gdal2tiles_exclude_transparent.tif %s' % output_folder) # First row totally transparent - no tiles tiles_folder = os.path.join(output_folder, '15', '21898') dir_files = os.listdir(tiles_folder) assert not dir_files, ('Generated empty tiles for row 21898: %s' % dir_files) # Second row - only 2 non-transparent tiles tiles_folder = os.path.join(output_folder, '15', '21899') dir_files = sorted(os.listdir(tiles_folder)) assert ['22704.png', '22705.png'] == dir_files, \ ('Generated empty tiles for row 21899: %s' % dir_files) # Third row - only 1 non-transparent tile tiles_folder = os.path.join(output_folder, '15', '21900') dir_files = os.listdir(tiles_folder) assert ['22705.png'] == dir_files, \ ('Generated empty tiles for row 21900: %s' % dir_files) return finally: shutil.rmtree(output_folder) gdalautotest-3.0.4/pyscripts/setup.cfg0000644003401500001440000000003513614004467017514 0ustar rouaultusers[flake8] max-line-length=100 gdalautotest-3.0.4/pyscripts/test_gdalinfo_py.py0000755003401500001440000002041313614005314021574 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdalinfo_py.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdalinfo.py 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 test_py_scripts import pytest ############################################################################### # Simple test def test_gdalinfo_py_1(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/byte.tif') assert ret.find('Driver: GTiff/GeoTIFF') != -1 ############################################################################### # Test -checksum option def test_gdalinfo_py_2(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-checksum ../gcore/data/byte.tif') assert ret.find('Checksum=4672') != -1 ############################################################################### # Test -nomd option def test_gdalinfo_py_3(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/byte.tif') assert ret.find('Metadata') != -1 ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-nomd ../gcore/data/byte.tif') assert ret.find('Metadata') == -1 ############################################################################### # Test -noct option def test_gdalinfo_py_4(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gdrivers/data/bug407.gif') assert ret.find('0: 255,255,255,255') != -1 ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-noct ../gdrivers/data/bug407.gif') assert ret.find('0: 255,255,255,255') == -1 ############################################################################### # Test -stats option def test_gdalinfo_py_5(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/byte.tif') assert ret.find('STATISTICS_MINIMUM=74') == -1, 'got wrong minimum.' ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-stats ../gcore/data/byte.tif') assert ret.find('STATISTICS_MINIMUM=74') != -1, 'got wrong minimum (2).' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test a dataset with overviews and RAT def test_gdalinfo_py_6(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gdrivers/data/int.img') assert ret.find('Overviews') != -1 ############################################################################### # Test a dataset with GCPs def test_gdalinfo_py_7(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/gcps.vrt') assert ret.find('GCP Projection =') != -1 assert ret.find('PROJCS["NAD27 / UTM zone 11N"') != -1 assert ret.find('(100,100) -> (446720,3745320,0)') != -1 # Same but with -nogcps ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-nogcp ../gcore/data/gcps.vrt') assert ret.find('GCP Projection =') == -1 assert ret.find('PROJCS["NAD27 / UTM zone 11N"') == -1 assert ret.find('(100,100) -> (446720,3745320,0)') == -1 ############################################################################### # Test -hist option def test_gdalinfo_py_8(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/byte.tif') assert ret.find('0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 57 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 72 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1') == -1, \ 'did not expect histogram.' ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-hist ../gcore/data/byte.tif') assert ret.find('0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 57 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 72 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1') != -1, \ 'did not get expected histogram.' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test -mdd option def test_gdalinfo_py_9(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gdrivers/data/fake_nsif.ntf') assert ret.find('BLOCKA=010000001000000000') == -1, 'Got unexpected extra MD.' ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-mdd TRE ../gdrivers/data/fake_nsif.ntf') assert ret.find('BLOCKA=010000001000000000') != -1, 'did not get extra MD.' ############################################################################### # Test -mm option def test_gdalinfo_py_10(): script_path = test_py_scripts.get_py_script('gdalinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '../gcore/data/byte.tif') assert ret.find('Computed Min/Max=74.000,255.000') == -1 ret = test_py_scripts.run_py_script(script_path, 'gdalinfo', '-mm ../gcore/data/byte.tif') assert ret.find('Computed Min/Max=74.000,255.000') != -1 gdalautotest-3.0.4/pyscripts/test_ogrmerge.py0000755003401500001440000002656413614005314021125 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_ogrmerge.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: ogrmerge.py 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 from osgeo import ogr import test_py_scripts import pytest ############################################################################### # Test -single def test_ogrmerge_1(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -o tmp/out.shp ../ogr/data/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/out.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 20 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/out.shp') ############################################################################### # Test -append and glob def test_ogrmerge_2(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -o tmp/out.shp ../ogr/data/poly.shp') test_py_scripts.run_py_script(script_path, 'ogrmerge', '-append -single -o tmp/out.shp "../ogr/data/p*ly.shp"') ds = ogr.Open('tmp/out.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 20 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/out.shp') ############################################################################### # Test -overwrite_ds def test_ogrmerge_3(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-overwrite_ds -o tmp/out.shp ../ogr/data/poly.shp') test_py_scripts.run_py_script(script_path, 'ogrmerge', '-overwrite_ds -single -o tmp/out.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/out.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 10 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/out.shp') ############################################################################### # Test -f VRT def test_ogrmerge_4(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp') ds = ogr.Open('tmp/out.vrt') lyr = ds.GetLayer(0) assert lyr.GetName() == 'poly' assert lyr.GetFeatureCount() == 10 ds = None gdal.Unlink('tmp/out.vrt') ############################################################################### # Test -nln def test_ogrmerge_5(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp ../ogr/data/testpoly.shp -nln ' '"foo_{DS_NAME}_{DS_BASENAME}_{DS_INDEX}_{LAYER_NAME}_{LAYER_INDEX}"') ds = ogr.Open('tmp/out.vrt') lyr = ds.GetLayer(0) assert lyr.GetName() == 'foo_../ogr/data/poly.shp_poly_0_poly_0' assert lyr.GetFeatureCount() == 10 lyr = ds.GetLayer(1) assert lyr.GetName() == 'foo_../ogr/data/testpoly.shp_testpoly_1_testpoly_0' assert lyr.GetFeatureCount() == 14 ds = None gdal.Unlink('tmp/out.vrt') ############################################################################### # Test -src_layer_field_name -src_layer_field_content def test_ogrmerge_6(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-src_layer_field_name source -src_layer_field_content ' '"foo_{DS_NAME}_{DS_BASENAME}_{DS_INDEX}_{LAYER_NAME}_{LAYER_INDEX}"') ds = ogr.Open('tmp/out.vrt') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['source'] != 'foo_../ogr/data/poly.shp_poly_0_poly_0': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('tmp/out.vrt') ############################################################################### # Test -src_geom_type def test_ogrmerge_7(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() # No match in -single mode test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-src_geom_type POINT') ds = ogr.Open('tmp/out.vrt') assert ds.GetLayerCount() == 0 ds = None gdal.Unlink('tmp/out.vrt') # Match in single mode test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-src_geom_type POLYGON') ds = ogr.Open('tmp/out.vrt') assert ds.GetLayerCount() == 1 ds = None gdal.Unlink('tmp/out.vrt') # No match in default mode test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-src_geom_type POINT') ds = ogr.Open('tmp/out.vrt') assert ds.GetLayerCount() == 0 ds = None gdal.Unlink('tmp/out.vrt') # Match in default mode test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-src_geom_type POLYGON') ds = ogr.Open('tmp/out.vrt') assert ds.GetLayerCount() == 1 ds = None gdal.Unlink('tmp/out.vrt') ############################################################################### # Test -s_srs -t_srs in -single mode def test_ogrmerge_8(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-s_srs EPSG:32630 -t_srs EPSG:4326') ds = ogr.Open('tmp/out.vrt') assert ds is not None ds = None f = gdal.VSIFOpenL('tmp/out.vrt', 'rb') content = '' if f is not None: content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') gdal.VSIFCloseL(f) gdal.Unlink('tmp/out.vrt') assert 'EPSG:32630' in content assert 'EPSG:4326' in content ############################################################################### # Test -s_srs -t_srs in default mode def test_ogrmerge_9(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-s_srs EPSG:32630 -t_srs EPSG:4326') ds = ogr.Open('tmp/out.vrt') assert ds is not None ds = None f = gdal.VSIFOpenL('tmp/out.vrt', 'rb') content = '' if f is not None: content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') gdal.VSIFCloseL(f) gdal.Unlink('tmp/out.vrt') assert 'EPSG:32630' in content assert 'EPSG:4326' in content ############################################################################### # Test -a_srs in -single mode def test_ogrmerge_10(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-single -f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-a_srs EPSG:32630') ds = ogr.Open('tmp/out.vrt') assert ds is not None ds = None f = gdal.VSIFOpenL('tmp/out.vrt', 'rb') content = '' if f is not None: content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') gdal.VSIFCloseL(f) gdal.Unlink('tmp/out.vrt') assert 'EPSG:32630' in content ############################################################################### # Test -a_srs in default mode def test_ogrmerge_11(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt ../ogr/data/poly.shp ' '-a_srs EPSG:32630') ds = ogr.Open('tmp/out.vrt') assert ds is not None ds = None f = gdal.VSIFOpenL('tmp/out.vrt', 'rb') content = '' if f is not None: content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') gdal.VSIFCloseL(f) gdal.Unlink('tmp/out.vrt') assert 'EPSG:32630' in content ############################################################################### # Test layer names with accents def test_ogrmerge_12(): script_path = test_py_scripts.get_py_script('ogrmerge') if script_path is None: pytest.skip() with open('tmp/tmp.json', 'wt') as f: f.write("""{ "type": "FeatureCollection", "name": "\xc3\xa9ven", "features": [ { "type": "Feature", "properties": {}, "geometry": null} ]}""") test_py_scripts.run_py_script(script_path, 'ogrmerge', '-f VRT -o tmp/out.vrt tmp/tmp.json') ds = ogr.Open('tmp/out.vrt') assert ds is not None ds = None gdal.Unlink('tmp/tmp.json') gdal.Unlink('tmp/out.vrt') gdalautotest-3.0.4/pyscripts/data/0000755003401500001440000000000013614004467016606 5ustar rouaultusersgdalautotest-3.0.4/pyscripts/data/test_utf8_漢字.vrt0000644003401500001440000000307413614004467023610 0ustar rouaultusers PROJCS["WGS 84 / Pseudo-Mercator",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["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["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 6.3490506599999999e+05, 4.7627007652033447e-02, 0.0000000000000000e+00, 8.1392822900000000e+06, 0.0000000000000000e+00, -4.7657934423650940e-02 Area pix4dmapper -10000 Red -10000 Green -10000 Blue -10000 Alpha gdalautotest-3.0.4/pyscripts/data/test_gdal2tiles_exclude_transparent.tif0000644003401500001440000013275713614004467026554 0ustar rouaultusersII*aZaRS   .!nppCppo@   "$u&e(U*M,I.A08234/6%8:<=?ACEGIKMOQSuUmWeY`[X]J_=a1c$egi kmnprtvxz|~{kd`\XLD?/دñG[cӵ=@'E=@TR'YA|l}]A#  )#WGS 84 / Pseudo-Mercator|WGS 84|||+_PKh^]GEF+Հ~~}~~}A?37B10@--E/27paL|z{x&CgfkXXZfclqottqh{zx`ּ{yz{yzzxyzx&O`_ZUTOTSN[WTiebqli{vslgcxq}~|z{|z{zxyywx~Á;_^YRQLTSNTSNhdaiebje_ytn[VS|z{}z|z{zxy|c`_[^]XPOJWVR[ZVnjgyuribZxupvro}{|}{|}~xz}~}~~z{~_ZYTVUPQPKUTPdc_yurgc`a]TZYT}{|~|}|z{~~}_VUPSRMONIXWRifaurme\SZUOVQN~|}}~zxy}{|ywxywxywz_ZYUWXSVWRXWR{zuwrne]Z^YSONI}~~|}{yz}~}~vtutrsxvw_cb^_^ZIEB^YVrqlmlgf\Z^VSJKEzxy|z{ywxzxyzxyUqpk[[QYVQolgxtq_\U\WQXWSvwr{|z{~~~|}{wy|ف[hgbtqlxup^ZWZWPUTOmmk~~|}|z{{yz{yzwwywwy{|~s_wvqyxs`_Z``X]\W^]Y}{|}{||z{|}z{rts_ZYU|srmpojMLGQPL}{|~xzywxzpqu_dfeacbegf*,+]^XVWOLMEutr~~ttvtuznot|/enmUYXempZY^HZ_YKLGvwr~|}~|}ghj*.7swzhlo8Q(6NRQqmnDmojnnl~GJO~kor=WA\Bcv^hi@~|}UZ`yx}nlm?6R>^(Toj}\[Y}~ ]adzmnrG8T3V SdKj|ba\yyxy}afjC8Q7NKdFgzjieeZVnv{yzwqlpqaff́C?XG]Lvmjcbdcxoj wv{{zgklMgvBon}|w^_ZO,*).yz|vwy{|~ijlA_kke`ZLMG98=}z}~z{}xy{mnpG}|xutpPSLTXY~yz~w{|hlmK=cb^lmqrpquuwswxmqreijrojqmj_]` !&$zxyust} wwyx|}hlmcYj b^[:89wx|zxywuv|~}vw{vz}impiahh`WYVPTW ~wux xzyz{imp+fc\XYSuyzz0~|}sqv|}{ljmfg`[\V~|}tvqvxwrrtjjl_`Z}~x~xvwuussurrtsfgi dc^}prqvz}v00&ehavz{]ab]_^poj,ust{~ggqsyudlncgpPTUvvt0{yz{uy|jkm38>W\` {yz|{nmrccgEiomecd }~}~uuwttvqpumlq SUPz~}y uuwuuwnmrY`Ymojzxy|{wv|uuwlln T[Tbhf4|z{{{}||~jkmNNu OWOJPL zz|xxzooq\^`#Y_[nlo~ywnnpjjl'aefrsngfa}uirgkl ad]gj_UUS##-llj~~rokln y{znoj]`Yqsr=@Ejnq~yscdf3g`ba]^Xhkd_a`645ljk}yxnhik fpo}n(ghccd_zx{x|}w{|kqqggjmuwgcdTTVIIG\]XvwrIS\]`e}~yy{rvwnrsgmm/x|fb_RQMXWSmifafj%1fjm}}tuwptwhlo~i,fb_ba]ed`}~w{|txyjnqeab`0|xwd`aed`ppr108RQV~yz|txymqrjlqP)D4}.1\q_o=*$C`^aWUV`\[oge~z][O/#ojn_vyrDAHWUZdbeVRQlhgfc\û}}|{>8:c^ZS|~{^_dKLNXVWgefZWR~zrr|iis_]]_pmxTNN]YVa]ZhdavvxmmokoptupdTVSZXSOea^vro~{~w{|imnhlm qtifQLR^ZWhid}~(v{hnnefhimn`|wnmiOKLqnieKL}}~|~}swxlpq_`b_ihd^ZWz{sx|kopfjk_ehaihc{|~quvmqrghjzyu\XWbda.-2 srrtiik_Gejcutodc_nmi~sv}XPELGDiil\YT\[Vjie?:>vz}lr~@<9kkisnjc_^||zQRMgfd|{w[[Yz ru~eqjko#_ZVUSVljk}a`\ac^FDEvuq4}z{rvykopgklCda\|pnqnlmihdba]GFD{ rswoptkop_HDCEA@~fbaSON\XWyz|mssosthlmb,#OKJkgf~he`^ZY|{ qrtqwwimnhlmhe^nji{zZYUixvw$utyqrtimpimn#^ZW}z~\\T}|x,*+0./qpvhloimpW {a]ZopjWVR | xxz\[`Y]`'A=QRV~yv}}yy{iglihfjjmU4rsn~}wwyooqffnbcg;~{|w|z{~vwyefjRSWZ[_#lkg|b^[Z[Vz{}rsuhik_`dABFA]^Y^_ZVUQwx}stynoqVZ[A@F7&%*ccelmgWXSWXS}vw{stxlkpHMPROXs7SPWONTwwuQRLVWQ{zqrvlmqjhm\]a;@CH=;HbbdMMKNOJXYTvupvw{xv{nlqiglVTYCxu|~~lmhY[X$xy}qrvlmqghlVW[==QCLG?>CWXSWXR~ty|jnqWX\bcgSTXFa\=EG {|w]][VVTwvt,}~vuzrvy]beCGJNRU ,<9PPQLWXRZ[Uxzysrw]^bAFIEIL ,39zP^]Y[ZVZYUecd}h\P/- b`TTX[AEHGKNcnlq$)%tw|$(^`[YXTSRN}si70(.$sjcQB;KKIABFMMUi_pzrZ[UYVQ|ryppztcmaW_[ceURY7puy||zac^[\Vqnivyquutzmdg}XY]7jos~zy[WT`]VgfauvxouskorY\aJKOV(ba]`_Z}y{vUMBinhbfeILQRWWqy|WV [Y\z{int!kjfZRRẂ'nqv},^Z[YWXYWX~~~qutnogkt]a`JKF vzyd0USTWUV|z{|zz|ttvnmrdfrT^gYbk,bb`LKGXVWkij{vvxssuxxzmlq`dgIMP mW,ZYU[YZ}~xy{vqutrsjjlUUW/53]]_ZTXWU|{yxy{lhejjl[QWXRVWYV}}{uyurvrimmollntsy{0klfhjg}yurqolldkkmiik qpk`e^^]Yv${ssolljpotyy{|}oumk- nmhuusmmkkp GFL~MMK9,wsrqqoiigoq{,񅅃kijusrxmmojlvvtw9sK~z~w|oryontkjoPc;|{vgfbvvxnrstsqnnphhjTTV/~]\X_^Z|{zz|vvxtuyhik[]\YY[3lmhWVQceb|vvxrrtooqhimIJLMMTB5qpab\h`]c^b~}{ssq//'hgepnqu~}trxw4~yXYsnh|vv~|zx{DHKswxrnm~}7z~puyt{xil}{vruvqxxvqx~,!(.aku|{}sulow;TZfEJN|}ywqqqs\\^<{|w|yz|ostnrs[_b`dgCGH!IJO\`clmq8}|}|mrnostimnTY\WX\\fglJLX}z~}wwucghcfkVY^Y^aJLP|-.0cck@}45/y[WNsutLME`deCFM[^c[\aFBCfcl;;Cxy} jigV\\s]ajvwy[\^JJL!c_^}zKGH;9:y0yuz}mssmt~459^ZY`XV\[W}(||~ssur nms*)7-14kifԉ_ZW`XVZVS| ttvttvo kjoljw==;ׁa\YTOL[XQWLP~wv{ssuooqjjlrpqnmk}zuVQNYTQWTO!%>~}xytsnnpeegXXZkbg#WTOZWRWTOSUbWYp}yuusq ihmooqaac'pnonlmmje[WTHFKUSX]\Wz{{}vvxttvkkmWWYljo!wqopWVQ\Y`zw0-4vxxznnpkkmYY[*%+$}^][kij xzumnfmYSTVHIN'|ypjeahgc~{{}rpuGIHcWPUY'ZWPa^Wdc_$||~uuwpt}qvypqkeeg+lid[XQfc\yxt|tuwyz|ornku+䔐nmh~yvwypqsgpuptwAAÍ+uqnzvs zz|xxzqqsnnpprquz}+~zwb^[jdd||~{yy{ttvpprooqqqsz{/|yVSLd_Yb^_~}x~ttvc^Xd_emsqykcaWOMZZX{z.*+tuyB@E1,(hglotw?lgd]URXWRUV[NNZHDA}}tuzSP[i_cblps;{{VQM^YUJIENOS{y~ xxzptwjnqosvPSZ]VPb]Yhc_ ~~vvxuuwosvosvrvyZPNf^[ha[rsnutyNNPJJLnsveilTSNXUPb_Z{y~~zzy~SV[lot|gd_\WS_XRTPM~znmruty| y{z~~{{ ssupqvadk Jtoi]XTRMIYUR-{yV!vu{xxzxxz||~~ywqscZU]XRQMJuqzzw'kjoyx}wwyxxzwwyzz|zyrp~!"$ZVW]VL`[UEDBSSU}{zvrt|zyywzwuxuttw+jli&!%c[X~|}{yz{vu{yz}{||}xx vtwzx{sqtrz/rmg`[Wd`_^^\NPM}~}{|~yx}{|wwuvvvxtqvyCs8 `_]d_Y`\Pa]T]YV{yz~|}Zc`vxwyyy{pprqqw;~|TSQhdaqjbe_SRRTKEG}{|~yummoooqox?GAA^TRvmf_VQZ_eiry}{y|~wyxzt jjlMMOkjo3SJEaVR[RM-&-}~}{~~}}yyw} q^^`RRT3iebJFCd_[VQM>CG/BQ}yx}{~ywz}||~vvxWV[?3bZVSVRO]YVLJOryN58{vz}v} z QQSVVXPLM3WSPZYTUTOyxv*(+~|bEJxvw/,3x~|zy~jjlDHIWX\_}mif<;9,+)~}|RRP~}}~~ddfWWYQQS[\~|}hgmlkq))+~{{}rrtPPRTTV@BAAC~y}f^\ 0/5~~${y|nlo@?DV5MHHJCCEPROhcgy}<;:?{{y|||~sqta_bd^`"mgkWRVIKHedb:;@DR_7GJO[_`~z~vvx^^`b`e\Z[_;DP>DR }{zxxytuvqV fx|hu}}0|nms~}~}yxwsyxt|z}H}}ciiu{wwv{}~~}~xwuzyuoom@}}.74vxwutid`d`]}zu~|}}sonupt| xxzt {[WT_\Ua^Wqqo|~}{{|~z{xxzrrtp7;CI~~qqsaaclOIK}YUR}}Z]V457ywz/05qqsddfddf,()v}{}|xZ~~xzycebvwyuuwwwy||mqpprqTUW/JKMiomwnxybce~|{QSR&&.stv~t$}}|}wolTSOWYT+IGL}gj{pqsmnrzxz$}}wv{YKKd_\VXSD@?>\Z[Stx{]ehmkl(||~YV]WML]YV;i`a?;:RNM[UUvrq}~}yz~egd~|}~~||~rrtRQYWXZC=?=98UQP_[Zd`avhlk}@~~oomeij}~}}{zutz_^dOOQQHITOLB=:\XWXTS* mqr{zyy{z {{uuwxw|^[d[[ute[Ye^Xc\Vfa^}swwuttv{} }~xvwljmkopIKHmljzpni^\YTPkgd}yv{}|z{%%#qqsz}|q{Z[`STYDC>#PQLQVRceb}|z|}x}~|~}nxxz}qzu}qspV\XVWRcbjhrt~|} }|]]_{{~~zyw]_\efhokh!"KJO|xy~}~f,&0qvy~~|}prmadk2ko~*(-WV[{ '&+tuy|~}{{y{zffhOPT`NNPRRZ|zrts $|{~z~ons015zkk^G|z}NVXqzxymonx|{<x{{}wv{YY[ZVUeb]wuxqpn|{}||4mqt`hkxxv{ tupB@4ida ~~|)(&Px~|aFK~|~z~yyx}ehma`[rffK}}{|}66>mcYs[Yzooqddfbb`_]ZO|yZ}}{$%*qqy})0)HDE~xiikNhidGwzsx||~}sqtSTVJPPcdhutrx ywxhgeED@C~}y~}x#1YYax|{~rv~|}][\G}zuyyw#!,yzt\]bopr}eqqopW}{wxzwxsust[]zvw$pno9?wv|L}xwu{zxCD?C#&5iiuIJO:;?~nslTUPu |y vwrfgba^W}~xX]`%(}ZZXpokxyt}LC:ssqlmh561vvnlutw{$|}w~DEJGD?^\]VUQzyt}~}|UL$|zyuwrz}korTVUK[,2}LR|}yy{yxt~wvlipWGL~|~}}|O=;vvutrfdeEquv#jb_},ppr}}eegz|{R=}xu7뒏{ostdmhtyu{{{n ~{t2 {tdwvq{|%"ztl߁??~|yr{{yv||msq}z{swxlpqn {zuxqgi[Nuqxzyloviik?}yveijw{z~x|}swxosrvwrxwtm~txpsqtbaf'}optux}(w}x|}swxpuoz}||um}uu;},3;iglHHPtw|yy{{qppn~xjidSOD}xn+o^WPTSgejedj106rmqz}rvyqvup/( g`Xee[utyrrtw$ ~smo^ddeittv0rw{kqquuwH3.wf_5/#vusppnssq)yaJPO)6gmm~(wyv~}urBmlWLH{xomlq)($de_3mpwydi"{||}xw|wvtcLF\VV~|}t]\dPN[+gdm21-203yurvvtxJ${pqkmqpprulnoqkuus~,@;5yzr}|}xumklwuz!Wtuymuxmqtw,K>8mf\|{}sol{zv}gefnlo'tw*[^crqv(R5-ib}a`\sutljk3{rEA@IHN:;=w{~w{~vz}wv|{Ɩzxysw{~a]\olgrp{jV8QSPvzyy}{{{}sut9.,~zwzyupnorWqmj{xsjjbyur|!$-ghlmonx|w{~{vz}qpvttvMGG{]ZSts[khatqjole23.`deopt~|~{~y}yioopql{{vJK]ON~|rpsrf+jbbkha{xqw|stvijldeg4tzxy}~x|}tuw|}z|w}z՟zx{nlorsu?[VRxwrOOMOPUmnp{|~}|txw{uyzuyzzz|wwuutoyxvnnpppr'WTM^YUxwr}:89v{uoqptuyzw{|v||nrsrrtuxyyw {zx@>CffhWTOc`[ba\vuqm(ptutx{uy|vz{|ptuimnssuxzz]`e`ff: GROHgd]khcvw|sut}{}~{}|vz{quvpturvu{}pwrsqtiilGb_Xxun}TRSvz}|}~~vz{swxswxtxy}nrquuppnjhiG^[Tee]qqikjfRPQvtywyxxy{tx{v{~mruv||vwy~}{|jhipnqplkjg`_\Ummex0ooqtsxwyx|~}tx{rvylpsstxptu{y| rpqtmt#b_Xssuqqsooq }z~}w}vz}jnqlmquuwt {z@?EUPT+_^Z݋pkevuznnpooq|~yy}~swxmqrnrsvz{|{ mlqmlr`[_YZTkg^oV,yyw}~}x{uyzvz{||~||~~}{qopsqrcVWQde_wsjnwvfg||ztzvrxxv||rw{inrrt|}}{ssqpnoljkHICjkede_hbnkz|y{yz|qrtt qrmpql'BC=Z[UVWQ}}u{y~eijnu}x{~vv|y}~:>A..6H+VRPijdPNYlkq5043ie\} EDI!nms('-srmxwr3iebkmj+28bis{ VU[lUaa_xxp5~utr^][&*3'~zwVSL~}x xvynoqnoqwvt{zx7deg|}rvwumkogd}~x}~ywzompompzx{{yz;45/97[[]}zz f`bglibpok||~wxrUVQuus;:@iikcceqrt{/yxvsrpnkdurmmoj~$yyw}}~{{,,4RSWfeaINWfLOXMHB|xojf~khchfitxwy~z|~yuwtz{wwy{{}uifoGEJ~}|x$cFHG418spk|rohrqo~{~afbv|xO+-x|{ijlV[_\Z[TTRlkqwst{ցXi~~|lmqrnk|urk`]V|vv|z~}rtstvuA*$z[`wt{XZfHN\\]XrWSP_CGR06L8>JnosrojvslrohQNI}|vzyz~}nrqy{z~{{yssz|rw}~}{roj7~uuy|gdk( qha~zqhe^b_X^[Vxxv}mqp~ }{|{yzvusjigtrs}zu3jE=xvrmg`]XURI^ZOzzx~uyx~zyustNLOa_b~4qWXUVwjdgb^ID@VQKzywssqpqk xvw~|}uvqoomz|{{x_7B>@0,-qqo}vxk[daWRN[SPg_\z~}{utztt|~|}{yzkeegywxzw7FDGrln,"!ukirmib]Yb[Uje_}~yfkdz{txw%quvywxtrs%)4njk|ytKO6:ttv~zypfdifac^Zkfbofay{~]c_ntr~LKGLHG~|sV BBJC`YS}rnpfevroupl^YUc\Vif_{~w}ywyv}~{}|}}{q}|zsurjg{zv}7".HLO{{yvq^ZQ\XOkb]nic}}qtm~} xwu{zxvuziikddbuususkāOHAA#)$KJP{urm[XS^WOlbXmlhpuo{x|}yzuxwuzywkXW\rrpspkcwsj_cn!"snj_ZT]XRg\Xmd]}zz}vv|xuyzwxrstn|rrjtuonnp7}pomolg~uCC;]XRa\Vb]Wi\Tzyu}~vrvwuyx|$uvzsrn}qobhROF~};{}vcaeW[YMc^Xfa[upl}|wwxp|y}| 1,)ust}{~xxnOtrc_C%'{}|zytklpb_Zb]Y^YV~~|~|{~{~nieRQLxvw}{|nm=wd|v^N><)vp{~z]ab^ZWe\W\WQUTPqplwyxqwuqut} tsnsrm~zvwxpmrmjcȼ=ole|vwq^YUWRN^VS]TOVQK~~v|sut}{~ywxsqr}xwujieqpl{zv3rnm}vb_ZaYVcUT_USc^Xssk~yywx}{|zywjig_^Z~}y4rmg~ue[Y[RMe\W^UP^WQa\Vxzy~~|vvtow F4(uuxvwzxyutr`_[srn+vmfg^U_VQ\SN]TOj_[VMH}~y}~}{ }wvtihfzyu_`utoztd_YcZUcYWg][ndbXNLtup{|wstoz{v|ZSZ}ukjmlgkje~z@xunsnjd[Vd[Vf\ZdZXh^\f\Zyomwxs}~ywxszzzz|wT:9kbcjeb{zvC|rjea\WScZU^UPXOJ^SQ`USRNEz|wxytvwrxytwtzzomddfxsp?xif_snh_ZTe`\QNIVQMZROPHEsupwxs~ztp feclki/eb[daZjg`rohXXPMLGTSNQNI}yvnnp}~vz~N jid|{v}A;XUNROHghb{yRXNOLE~uwthhjuusuvp~zzxttrsptsRSUzurWTMXWRpslVSLf]X{~wp{|wuvpssq~~|~vtsoW[^jjl#TQJ]YPwxs}~y|}w{{{yzx{kjh}7|wtwyxvxwrrpvwrz|w~wqsqrzxykillki~~|/vz{nttnpkuto{}zpuoustigjzyw+tuxtso|ytvtuighrpuw|y~|hfgljkuskghljk{zxOPRlkiyxtnwws4gdalautotest-3.0.4/pyscripts/data/漢字/0000755003401500001440000000000013614004467021042 5ustar rouaultusersgdalautotest-3.0.4/pyscripts/data/漢字/test_bounds_close_to_tile_bounds_x.vrt0000644003401500001440000000307413614004467030741 0ustar rouaultusers PROJCS["WGS 84 / Pseudo-Mercator",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["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["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 6.3490506599999999e+05, 4.7627007652033447e-02, 0.0000000000000000e+00, 8.1392822900000000e+06, 0.0000000000000000e+00, -4.7657934423650940e-02 Area pix4dmapper -10000 Red -10000 Green -10000 Blue -10000 Alpha gdalautotest-3.0.4/pyscripts/data/test_latin1_é.vrt0000644003401500001440000000307413614004467022511 0ustar rouaultusers PROJCS["WGS 84 / Pseudo-Mercator",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["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["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 6.3490506599999999e+05, 4.7627007652033447e-02, 0.0000000000000000e+00, 8.1392822900000000e+06, 0.0000000000000000e+00, -4.7657934423650940e-02 Area pix4dmapper -10000 Red -10000 Green -10000 Blue -10000 Alpha gdalautotest-3.0.4/pyscripts/data/test_bounds_close_to_tile_bounds_y.vrt0000644003401500001440000000275413614004467026512 0ustar rouaultusers 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"]] 6.5614318824000005e+05, 2.4702942643333180e-02, 0.0000000000000000e+00, 6.5219694422600009e+06, 0.0000000000000000e+00, -2.4686193855448537e-02 Area pix4dmapper -10000 Red -10000 Green -10000 Blue -10000 Alpha gdalautotest-3.0.4/pyscripts/data/test_bounds_close_to_tile_bounds_x.vrt0000644003401500001440000000307413614004467026505 0ustar rouaultusers PROJCS["WGS 84 / Pseudo-Mercator",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["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["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]] 6.3490506599999999e+05, 4.7627007652033447e-02, 0.0000000000000000e+00, 8.1392822900000000e+06, 0.0000000000000000e+00, -4.7657934423650940e-02 Area pix4dmapper -10000 Red -10000 Green -10000 Blue -10000 Alpha gdalautotest-3.0.4/pyscripts/__init__.py0000644003401500001440000000000013614005314017764 0ustar rouaultusersgdalautotest-3.0.4/pyscripts/test_gdal_polygonize.py0000755003401500001440000001625413614005314022477 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_polygonize.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test gdal_polygonize.py script # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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 ogrtest import test_py_scripts from osgeo import ogr import pytest ############################################################################### # Test a fairly simple case, with nodata masking. def test_gdal_polygonize_1(): script_path = test_py_scripts.get_py_script('gdal_polygonize') if script_path is None: pytest.skip() # Create a OGR datasource to put results in. shp_drv = ogr.GetDriverByName('ESRI Shapefile') try: os.stat('tmp/poly.shp') shp_drv.DeleteDataSource('tmp/poly.shp') except OSError: pass shp_ds = shp_drv.CreateDataSource('tmp/poly.shp') shp_layer = shp_ds.CreateLayer('poly', None, ogr.wkbPolygon) fd = ogr.FieldDefn('DN', ogr.OFTInteger) shp_layer.CreateField(fd) shp_ds.Destroy() # run the algorithm. test_py_scripts.run_py_script(script_path, 'gdal_polygonize', '../alg/data/polygonize_in.grd tmp poly DN') # Confirm we get the set of expected features in the output layer. shp_ds = ogr.Open('tmp') shp_lyr = shp_ds.GetLayerByName('poly') expected_feature_number = 13 assert shp_lyr.GetFeatureCount() == expected_feature_number expect = [107, 123, 115, 115, 140, 148, 123, 140, 156, 100, 101, 102, 103] tr = ogrtest.check_features_against_list(shp_lyr, 'DN', expect) # check at least one geometry. if tr: shp_lyr.SetAttributeFilter('dn = 156') feat_read = shp_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((440720 3751200,440900 3751200,440900 3751020,440720 3751020,440720 3751200),(440780 3751140,440780 3751080,440840 3751080,440840 3751140,440780 3751140))') != 0: tr = 0 feat_read.Destroy() shp_ds.Destroy() # Reload drv because of side effects of run_py_script() shp_drv = ogr.GetDriverByName('ESRI Shapefile') shp_drv.DeleteDataSource('tmp/poly.shp') assert tr ############################################################################### # Test a simple case without masking. def test_gdal_polygonize_2(): script_path = test_py_scripts.get_py_script('gdal_polygonize') if script_path is None: pytest.skip() shp_drv = ogr.GetDriverByName('ESRI Shapefile') try: os.stat('tmp/out.shp') shp_drv.DeleteDataSource('tmp/out.shp') except OSError: pass # run the algorithm. test_py_scripts.run_py_script(script_path, 'gdal_polygonize', '-b 1 -f "ESRI Shapefile" -q -nomask ../alg/data/polygonize_in.grd tmp') # Confirm we get the set of expected features in the output layer. shp_ds = ogr.Open('tmp') shp_lyr = shp_ds.GetLayerByName('out') expected_feature_number = 17 assert shp_lyr.GetFeatureCount() == expected_feature_number expect = [107, 123, 115, 132, 115, 132, 140, 132, 148, 123, 140, 132, 156, 100, 101, 102, 103] tr = ogrtest.check_features_against_list(shp_lyr, 'DN', expect) shp_ds.Destroy() # Reload drv because of side effects of run_py_script() shp_drv = ogr.GetDriverByName('ESRI Shapefile') shp_drv.DeleteDataSource('tmp/out.shp') assert tr def test_gdal_polygonize_3(): script_path = test_py_scripts.get_py_script('gdal_polygonize') if script_path is None: pytest.skip() drv = ogr.GetDriverByName('GPKG') if drv is None: pytest.skip() try: os.stat('tmp/out.gpkg') drv.DeleteDataSource('tmp/out.gpkg') except OSError: pass # run the algorithm. test_py_scripts.run_py_script(script_path, 'gdal_polygonize', '-b 1 -f "GPKG" -q -nomask ../alg/data/polygonize_in.grd tmp/out.gpkg') # Confirm we get the set of expected features in the output layer. gpkg_ds = ogr.Open('tmp/out.gpkg') gpkg_lyr = gpkg_ds.GetLayerByName('out') geom_type = gpkg_lyr.GetGeomType() geom_is_polygon = geom_type in (ogr.wkbPolygon, ogr.wkbMultiPolygon) gpkg_ds.Destroy() # Reload drv because of side effects of run_py_script() drv = ogr.GetDriverByName('GPKG') drv.DeleteDataSource('tmp/out.gpkg') if geom_is_polygon: return pytest.fail('GetGeomType() returned %d instead of %d or %d (ogr.wkbPolygon or ogr.wkbMultiPolygon)' % (geom_type, ogr.wkbPolygon, ogr.wkbMultiPolygon)) ############################################################################### # Test -b mask def test_gdal_polygonize_4(): script_path = test_py_scripts.get_py_script('gdal_polygonize') if script_path is None: pytest.skip() # Test mask syntax test_py_scripts.run_py_script(script_path, 'gdal_polygonize', '-q -f GML -b mask ../gcore/data/byte.tif tmp/out.gml') content = open('tmp/out.gml', 'rt').read() os.unlink('tmp/out.gml') assert '440720,3751320 440720,3750120 441920,3750120 441920,3751320 440720,3751320' in content # Test mask,1 syntax test_py_scripts.run_py_script(script_path, 'gdal_polygonize', '-q -f GML -b mask,1 ../gcore/data/byte.tif tmp/out.gml') content = open('tmp/out.gml', 'rt').read() os.unlink('tmp/out.gml') assert '440720,3751320 440720,3750120 441920,3750120 441920,3751320 440720,3751320' in content gdalautotest-3.0.4/pyscripts/test_gdal_pansharpen.py0000755003401500001440000000763013614005314022435 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_pansharpen.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_pansharpen testing # 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 test_py_scripts import pytest ############################################################################### # Simple test def test_gdal_pansharpen_1(): script_path = test_py_scripts.get_py_script('gdal_pansharpen') if script_path is None: pytest.skip() src_ds = gdal.Open('../gdrivers/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 test_py_scripts.run_py_script(script_path, 'gdal_pansharpen', ' tmp/small_world_pan.tif ../gdrivers/data/small_world.tif tmp/out.tif') ds = gdal.Open('tmp/out.tif') cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] ds = None gdal.GetDriverByName('GTiff').Delete('tmp/out.tif') assert cs == [4735, 10000, 9742] ############################################################################### # Full options def test_gdal_pansharpen_2(): script_path = test_py_scripts.get_py_script('gdal_pansharpen') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_pansharpen', ' -q -b 3 -b 1 -bitdepth 8 -threads ALL_CPUS -spat_adjust union -w 0.33333333333333333 -w 0.33333333333333333 -w 0.33333333333333333 -of VRT -r cubic tmp/small_world_pan.tif ../gdrivers/data/small_world.tif,band=1 ../gdrivers/data/small_world.tif,band=2 ../gdrivers/data/small_world.tif,band=3 tmp/out.vrt') ds = gdal.Open('tmp/out.vrt') cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] ds = None gdal.GetDriverByName('VRT').Delete('tmp/out.vrt') assert cs == [9742, 4735] ############################################################################### # Cleanup def test_gdal_pansharpen_cleanup(): script_path = test_py_scripts.get_py_script('gdal_pansharpen') if script_path is None: pytest.skip() gdal.GetDriverByName('GTiff').Delete('tmp/small_world_pan.tif') gdalautotest-3.0.4/pyscripts/test_gdal_ls_py.py0000755003401500001440000001735113614005314021425 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_ls_py.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_ls.py testing # Author: Even Rouault # ############################################################################### # Copyright (c) 2011-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 sys from osgeo import gdal import gdaltest import test_py_scripts import pytest ############################################################################### def run_gdal_ls(argv): script_path = test_py_scripts.get_py_script('gdal_ls') if script_path is None: pytest.skip() saved_syspath = sys.path sys.path.append(script_path) try: import gdal_ls except ImportError: sys.path = saved_syspath pytest.fail() sys.path = saved_syspath from sys import version_info if version_info >= (3, 0, 0): import io outstr = io.StringIO() else: import StringIO outstr = StringIO.StringIO() ret = gdal_ls.gdal_ls(argv, outstr) retstr = outstr.getvalue() outstr.close() assert ret == 0, 'got error code : %d' % ret return retstr ############################################################################### # List one file def test_gdal_ls_py_1(): # TODO: Why the '' as the first element of the list here and below? ret_str = run_gdal_ls(['', '-l', '../ogr/data/poly.shp']) assert ret_str.find('poly.shp') != -1 ############################################################################### # List one dir def test_gdal_ls_py_2(): ret_str = run_gdal_ls(['', '-l', '../ogr/data']) assert ret_str.find('poly.shp') != -1 ############################################################################### # List recursively def test_gdal_ls_py_3(): ret_str = run_gdal_ls(['', '-R', '../ogr/data']) assert ret_str.find('PROJ_UNITS') != -1 ############################################################################### # List in a .zip def test_gdal_ls_py_4(): ret_str = run_gdal_ls(['', '-l', '/vsizip/../ogr/data/poly.zip']) if ret_str.find('-r--r--r-- 1 unknown unknown 415 2008-02-11 21:35 /vsizip/../ogr/data/poly.zip/poly.PRJ') == -1: if gdaltest.skip_on_travis(): # FIXME # Fails on Travis with dates at 1970-01-01 00:00 # Looks like a 32/64bit issue with Python bindings of VSIStatL() pytest.skip() pytest.fail(ret_str) ############################################################################### # List dir in /vsicurl/ def test_gdal_ls_py_5(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would stall for a long time') f = gdal.VSIFOpenL('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip', 'rb') if f is None: pytest.skip() d = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) if not d: pytest.skip() # ret_str = run_gdal_ls(['', '-R', 'https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/']) # # if ret_str.find('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/wkb_wkt/3d_broken_line.wkb') == -1: # print(ret_str) # pytest.fail() ############################################################################### # List in a .zip in /vsicurl/ def test_gdal_ls_py_6(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() f = gdal.VSIFOpenL('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip', 'rb') if f is None: pytest.skip() d = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) if not d: pytest.skip() ret_str = run_gdal_ls(['', '-l', '/vsizip/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip']) if ret_str.find('-r--r--r-- 1 unknown unknown 415 2008-02-11 21:35 /vsizip/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip/poly.PRJ') == -1: if gdaltest.skip_on_travis(): # FIXME # Fails on Travis with dates at 1970-01-01 00:00 # Looks like a 32/64bit issue with Python bindings of VSIStatL() pytest.skip() pytest.fail(ret_str) ############################################################################### # List dir in /vsicurl/ and recurse in zip def test_gdal_ls_py_7(): # Super slow on AppVeyor since a few weeks (Apr 2016) if gdal.GetConfigOption('APPVEYOR') is not None: pytest.skip('Slow on AppVeyor') drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would stall for a long time') f = gdal.VSIFOpenL('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip', 'rb') if f is None: pytest.skip() d = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) if not d: pytest.skip() # ret_str = run_gdal_ls(['', '-R', '-Rzip', 'https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/']) # if ret_str.find('/vsizip//vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip/poly.PRJ') == -1: # print(ret_str) # pytest.fail() ############################################################################### # List FTP dir in /vsicurl/ def test_gdal_ls_py_8(): if not gdaltest.run_slow_tests(): pytest.skip() drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would stall for a long time') f = gdal.VSIFOpenL('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip', 'rb') if f is None: pytest.skip() d = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) if not d: pytest.skip() ret_str = run_gdal_ls(['', '-l', '-R', '-Rzip', 'ftp://download.osgeo.org/gdal/data/aig']) assert ret_str.find('-r--r--r-- 1 unknown unknown 24576 2007-03-29 00:00 /vsicurl/ftp://download.osgeo.org/gdal/data/aig/nzdem/info/arc0002r.001') != -1 assert ret_str.find('-r--r--r-- 1 unknown unknown 24576 2007-03-29 12:20 /vsizip//vsicurl/ftp://download.osgeo.org/gdal/data/aig/nzdem.zip/nzdem/info/arc0002r.001') != -1 gdalautotest-3.0.4/pyscripts/test_ogr2ogr_py.py0000755003401500001440000013670013614005314021401 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_ogr2ogr_py.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: ogr2ogr.py testing # Author: Even Rouault # ############################################################################### # 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 sys import os import shutil import pytest sys.path.append('../ogr') from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import ogrtest import test_cli_utilities import test_py_scripts ############################################################################### # Simple test def test_ogr2ogr_py_1(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat0 = ds.GetLayer(0).GetFeature(0) assert feat0.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat0.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -sql def test_ogr2ogr_py_2(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -sql "select * from poly"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -spat def test_ogr2ogr_py_3(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -spat 479609 4764629 479764 4764817') ds = ogr.Open('tmp/poly.shp') if ogrtest.have_geos(): assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 else: assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 5 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -where def test_ogr2ogr_py_4(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -where "EAS_ID=171"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -append def test_ogr2ogr_py_5(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp') test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-update -append tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20 feat10 = ds.GetLayer(0).GetFeature(10) assert feat10.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat10.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -overwrite def test_ogr2ogr_py_6(): import ogr_pg script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ogr_pg.test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly') test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-update -overwrite -f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert ds is not None and ds.GetLayerByName('tpoly').GetFeatureCount() == 10 ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') ############################################################################### # Test -gt def test_ogr2ogr_py_7(): import ogr_pg script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ogr_pg.test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly -gt 1') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert ds is not None and ds.GetLayerByName('tpoly').GetFeatureCount() == 10 ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') ############################################################################### # Test -t_srs def test_ogr2ogr_py_8(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-t_srs EPSG:4326 tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -a_srs def test_ogr2ogr_py_9(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-a_srs EPSG:4326 tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -select def test_ogr2ogr_py_10(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass # Voluntary don't use the exact case of the source field names (#4502) test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-select eas_id,prfedea tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 feat = lyr.GetNextFeature() ret = 'success' if feat.GetFieldAsDouble('EAS_ID') != 168: gdaltest.post_reason('did not get expected value for EAS_ID') print(feat.GetFieldAsDouble('EAS_ID')) ret = 'fail' elif feat.GetFieldAsString('PRFEDEA') != '35043411': gdaltest.post_reason('did not get expected value for PRFEDEA') print(feat.GetFieldAsString('PRFEDEA')) ret = 'fail' feat = None ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') return ret ############################################################################### # Test -lco def test_ogr2ogr_py_11(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-lco SHPT=POLYGONZ tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds.GetLayer(0).GetLayerDefn().GetGeomType() == ogr.wkbPolygon25D ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -nlt def test_ogr2ogr_py_12(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-nlt POLYGON25D tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds.GetLayer(0).GetLayerDefn().GetGeomType() == ogr.wkbPolygon25D ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Add explicit source layer name def test_ogr2ogr_py_13(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp poly') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -segmentize @pytest.mark.skip() def test_ogr2ogr_py_14(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-segmentize 100 tmp/poly.shp ../ogr/data/poly.shp poly') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat = ds.GetLayer(0).GetNextFeature() assert feat.GetGeometryRef().GetGeometryRef(0).GetPointCount() == 36 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -overwrite with a shapefile def test_ogr2ogr_py_15(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() # Overwrite test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-overwrite tmp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -fid def test_ogr2ogr_py_16(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-fid 8 tmp/poly.shp ../ogr/data/poly.shp') src_ds = ogr.Open('../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 src_feat = src_ds.GetLayer(0).GetFeature(8) feat = ds.GetLayer(0).GetNextFeature() assert feat.GetField("EAS_ID") == src_feat.GetField("EAS_ID") ds.Destroy() src_ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -progress def test_ogr2ogr_py_17(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass ret = test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-progress tmp/poly.shp ../ogr/data/poly.shp') assert ret.find('0...10...20...30...40...50...60...70...80...90...100 - done.') != -1 ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -wrapdateline @pytest.mark.skip() def test_ogr2ogr_py_18(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') except OSError: pass try: os.stat('tmp/wrapdateline_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') except OSError: pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/wrapdateline_src.shp') srs = osr.SpatialReference() srs.ImportFromEPSG(32660) lyr = ds.CreateLayer('wrapdateline_src', srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POLYGON((700000 4000000,800000 4000000,800000 3000000,700000 3000000,700000 4000000))') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) feat.Destroy() ds.Destroy() test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-wrapdateline -t_srs EPSG:4326 tmp/wrapdateline_dst.shp tmp/wrapdateline_src.shp') expected_wkt = 'MULTIPOLYGON (((179.222391385437419 36.124095832129363,180.0 36.10605558800065,180.0 27.090340569400169,179.017505655195095 27.107979523625211,179.222391385437419 36.124095832129363)),((-180.0 36.10605558800065,-179.667822828781084 36.098349195413753,-179.974688335419557 27.089886143076747,-180.0 27.090340569400169,-180.0 36.10605558800065)))' expected_geom = ogr.CreateGeometryFromWkt(expected_wkt) ds = ogr.Open('tmp/wrapdateline_dst.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() ret = ogrtest.check_feature_geometry(feat, expected_geom) feat.Destroy() expected_geom.Destroy() ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') assert ret == 0 ############################################################################### # Test -clipsrc def test_ogr2ogr_py_19(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -clipsrc spat_extent -spat 479609 4764629 479764 4764817') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test correct remap of fields when laundering to Shapefile format # Test that the data is going into the right field # FIXME: Any field is skipped if a subsequent field with same name is found. def test_ogr2ogr_py_20(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.remove('tmp/Fields.dbf') except OSError: pass expected_fields = ['a', 'A_1', 'a_1_2', 'aaaaaAAAAA', 'aAaaaAAA_1', 'aaaaaAAAAB', 'aaaaaAAA_2', 'aaaaaAAA_3', 'aaaaaAAA_4', 'aaaaaAAA_5', 'aaaaaAAA_6', 'aaaaaAAA_7', 'aaaaaAAA_8', 'aaaaaAAA_9', 'aaaaaAAA10'] expected_data = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'] test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp ../utilities/data/Fields.csv') ds = ogr.Open('tmp/Fields.dbf') assert ds is not None layer_defn = ds.GetLayer(0).GetLayerDefn() if layer_defn.GetFieldCount() != 15: ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') pytest.fail('Unexpected field count: ' + str(ds.GetLayer(0).GetLayerDefn().GetFieldCount())) error_occurred = False feat = ds.GetLayer(0).GetNextFeature() for i in range(layer_defn.GetFieldCount()): if layer_defn.GetFieldDefn(i).GetNameRef() != expected_fields[i]: print('Expected ', expected_fields[i], ',but got', layer_defn.GetFieldDefn(i).GetNameRef()) error_occurred = True if feat.GetFieldAsString(i) != expected_data[i]: print('Expected the value ', expected_data[i], ',but got', feat.GetFieldAsString(i)) error_occurred = True ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') assert not error_occurred ############################################################################### # Test ogr2ogr when the output driver has already created the fields # at dataset creation (#3247) def test_ogr2ogr_py_21(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.remove('tmp/testogr2ogr21.gtm') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-f GPSTrackMaker tmp/testogr2ogr21.gtm ../utilities/data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -nlt POINT') ds = ogr.Open('tmp/testogr2ogr21.gtm') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() os.remove('tmp/testogr2ogr21.gtm') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() os.remove('tmp/testogr2ogr21.gtm') ############################################################################### # Test ogr2ogr when the output driver delays the destination layer defn creation (#3384) def test_ogr2ogr_py_22(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-f "MapInfo File" tmp/testogr2ogr22.mif ../utilities/data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -nlt POINT') ds = ogr.Open('tmp/testogr2ogr22.mif') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr22.mif') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr22.mif') ############################################################################### # Same as previous but with -select def test_ogr2ogr_py_23(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f "MapInfo File" tmp/testogr2ogr23.mif ../utilities/data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -select comment,name -nlt POINT') ds = ogr.Open('tmp/testogr2ogr23.mif') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr23.mif') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr23.mif') ############################################################################### # Test -clipsrc with WKT geometry (#3530) def test_ogr2ogr_py_24(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -clipsrc "POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -clipsrc with clip from external datasource def test_ogr2ogr_py_25(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass f = open('tmp/clip.csv', 'wt') f.write('foo,WKT\n') f.write('foo,"POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"\n') f.close() test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -clipsrc tmp/clip.csv -clipsrcwhere foo=\'foo\'') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') os.remove('tmp/clip.csv') ############################################################################### # Test -clipdst with WKT geometry (#3530) def test_ogr2ogr_py_26(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/poly.shp ../ogr/data/poly.shp -clipdst "POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -clipdst with clip from external datasource def test_ogr2ogr_py_27(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass f = open('tmp/clip.csv', 'wt') f.write('foo,WKT\n') f.write('foo,"POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"\n') f.close() test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-nlt MULTIPOLYGON tmp/poly.shp ../ogr/data/poly.shp -clipdst tmp/clip.csv -clipdstsql "SELECT * from clip"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') os.remove('tmp/clip.csv') ############################################################################### # Test that -overwrite work if the output file doesn't yet exist (#3825) def test_ogr2ogr_py_31(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -overwrite tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test that -append/-overwrite to a single-file shapefile work without specifying -nln def test_ogr2ogr_py_32(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_32.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_32.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -append tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_32.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -overwrite tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_32.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_32.shp') ############################################################################### # Test -explodecollections def test_ogr2ogr_py_33(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_33_src.csv') ogr.GetDriverByName('CSV').DeleteDataSource('tmp/test_ogr2ogr_33_src.csv') except OSError: pass try: os.stat('tmp/test_ogr2ogr_33_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_33_dst.shp') except OSError: pass f = open('tmp/test_ogr2ogr_33_src.csv', 'wt') f.write('foo,WKT\n') f.write('bar,"MULTIPOLYGON (((10 10,10 11,11 11,11 10,10 10)),((100 100,100 200,200 200,200 100,100 100),(125 125,175 125,175 175,125 175,125 125)))"\n') f.write('baz,"POLYGON ((0 0,0 1,1 1,1 0,0 0))"\n') f.close() test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -explodecollections tmp/test_ogr2ogr_33_dst.shp tmp/test_ogr2ogr_33_src.csv -select foo') ds = ogr.Open('tmp/test_ogr2ogr_33_dst.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3, '-explodecollections failed' feat = lyr.GetFeature(0) if feat.GetField("foo") != 'bar': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((10 10,10 11,11 11,11 10,10 10))': feat.DumpReadable() pytest.fail() feat = lyr.GetFeature(1) if feat.GetField("foo") != 'bar': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((100 100,100 200,200 200,200 100,100 100),(125 125,175 125,175 175,125 175,125 125))': feat.DumpReadable() pytest.fail() feat = lyr.GetFeature(2) if feat.GetField("foo") != 'baz': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('CSV').DeleteDataSource('tmp/test_ogr2ogr_33_src.csv') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_33_dst.shp') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist src.shp -nln someDirThatDoesNotExist' # This should result in creating a someDirThatDoesNotExist directory with # someDirThatDoesNotExist.shp/dbf/shx inside this directory def test_ogr2ogr_py_34(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_34_dir') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_34_dir') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ 'initial shapefile creation failed' ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -append tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -overwrite tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_34_dir') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist src.shp' def test_ogr2ogr_py_35(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_35_dir') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_35_dir') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp ') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ 'initial shapefile creation failed' ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -append tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -overwrite tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_35_dir') ############################################################################### # Test ogr2ogr -zfield def test_ogr2ogr_py_36(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_36.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_36.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_36.shp ../ogr/data/poly.shp -zfield EAS_ID') ds = ogr.Open('tmp/test_ogr2ogr_36.shp') feat = ds.GetLayer(0).GetNextFeature() wkt = feat.GetGeometryRef().ExportToWkt() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_36.shp') assert wkt.find(' 168,') != -1 ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist.shp dataSourceWithMultipleLayer' def test_ogr2ogr_py_37(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_37_dir.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_dir.shp') except OSError: pass try: os.mkdir('tmp/test_ogr2ogr_37_src') except OSError: pass shutil.copy('../ogr/data/poly.shp', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/poly.shx', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/poly.dbf', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.shp', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.shx', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.dbf', 'tmp/test_ogr2ogr_37_src') test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_37_dir.shp tmp/test_ogr2ogr_37_src') ds = ogr.Open('tmp/test_ogr2ogr_37_dir.shp') assert ds is not None and ds.GetLayerCount() == 2 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_src') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_dir.shp') ############################################################################### # Test that we take into account the fields by the where clause when combining # -select and -where (#4015) def test_ogr2ogr_py_38(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_38.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_38.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_38.shp ../ogr/data/poly.shp -select AREA -where "EAS_ID = 170"') ds = ogr.Open('tmp/test_ogr2ogr_38.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_38.shp') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist.shp dataSourceWithMultipleLayer -sql "select * from alayer"' (#4268) def test_ogr2ogr_py_39(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_39_dir.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39.shp') except OSError: pass try: os.mkdir('tmp/test_ogr2ogr_39_src') except OSError: pass shutil.copy('../ogr/data/poly.shp', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/poly.shx', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/poly.dbf', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.shp', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.shx', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.dbf', 'tmp/test_ogr2ogr_39_src') test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_39.shp tmp/test_ogr2ogr_39_src -sql "select * from poly"') ds = ogr.Open('tmp/test_ogr2ogr_39.shp') assert ds is not None and ds.GetLayerCount() == 1 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39_src') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39.shp') ############################################################################### # Test -dim 3 and -dim 2 def test_ogr2ogr_py_43(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_43_3d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_3d.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_43_3d.shp ../ogr/data/poly.shp -dim 3') ds = ogr.Open('tmp/test_ogr2ogr_43_3d.shp') lyr = ds.GetLayerByIndex(0) assert lyr.GetGeomType() == ogr.wkbPolygon25D ds = None try: os.stat('tmp/test_ogr2ogr_43_2d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_2d.shp') except OSError: pass test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' tmp/test_ogr2ogr_43_2d.shp tmp/test_ogr2ogr_43_3d.shp -dim 2') ds = ogr.Open('tmp/test_ogr2ogr_43_2d.shp') lyr = ds.GetLayerByIndex(0) assert lyr.GetGeomType() == ogr.wkbPolygon ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_2d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_3d.shp') ############################################################################### # Test -nlt PROMOTE_TO_MULTI for polygon/multipolygon def test_ogr2ogr_py_44(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_44_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') except OSError: pass gdal.Unlink('tmp/test_ogr2ogr_44.gml') gdal.Unlink('tmp/test_ogr2ogr_44.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_44_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_44_src', geom_type=ogr.wkbPolygon) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))')) lyr.CreateFeature(feat) ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -f GML tmp/test_ogr2ogr_44.gml tmp/test_ogr2ogr_44_src.shp -nlt PROMOTE_TO_MULTI') f = open('tmp/test_ogr2ogr_44.xsd') data = f.read() f.close() assert data.find('type="gml:MultiPolygonPropertyType"') != -1 f = open('tmp/test_ogr2ogr_44.gml') data = f.read() f.close() assert data.find('0,0 0,1 1,1 0,0') != -1 ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') os.unlink('tmp/test_ogr2ogr_44.gml') os.unlink('tmp/test_ogr2ogr_44.xsd') ############################################################################### # Test -nlt PROMOTE_TO_MULTI for polygon/multipolygon def test_ogr2ogr_py_45(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_44_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') except OSError: pass gdal.Unlink('tmp/test_ogr2ogr_44.gml') gdal.Unlink('tmp/test_ogr2ogr_44.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_44_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_44_src', geom_type=ogr.wkbPolygon) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))')) lyr.CreateFeature(feat) ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -f GML tmp/test_ogr2ogr_44.gml tmp/test_ogr2ogr_44_src.shp -nlt PROMOTE_TO_MULTI') f = open('tmp/test_ogr2ogr_44.xsd') data = f.read() f.close() assert data.find('type="gml:MultiPolygonPropertyType"') != -1 f = open('tmp/test_ogr2ogr_44.gml') data = f.read() f.close() assert data.find('0,0 0,1 1,1 0,0') != -1 ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') os.unlink('tmp/test_ogr2ogr_44.gml') os.unlink('tmp/test_ogr2ogr_44.xsd') ############################################################################### # Test -nlt PROMOTE_TO_MULTI for linestring/multilinestring def test_ogr2ogr_py_46(): script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_45_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_45_src.shp') except OSError: pass gdal.Unlink('tmp/test_ogr2ogr_45.gml') gdal.Unlink('tmp/test_ogr2ogr_45.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_45_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_45_src', geom_type=ogr.wkbLineString) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1,1 1,0 0)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 0,0 1,1 1,0 0),(10 0,10 1,11 1,10 0))')) lyr.CreateFeature(feat) ds = None test_py_scripts.run_py_script(script_path, 'ogr2ogr', ' -f GML tmp/test_ogr2ogr_45.gml tmp/test_ogr2ogr_45_src.shp -nlt PROMOTE_TO_MULTI') f = open('tmp/test_ogr2ogr_45.xsd') data = f.read() f.close() assert data.find('type="gml:MultiLineStringPropertyType"') != -1 f = open('tmp/test_ogr2ogr_45.gml') data = f.read() f.close() assert data.find('0,0 0,1 1,1 0,0') != -1 ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_45_src.shp') gdal.Unlink('tmp/test_ogr2ogr_45.gml') gdal.Unlink('tmp/test_ogr2ogr_45.xsd') gdalautotest-3.0.4/pyscripts/test_gdal_merge.py0000755003401500001440000001767713614005315021412 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_merge.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_merge.py 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 from osgeo import osr import test_py_scripts import pytest ############################################################################### # Basic test def test_gdal_merge_1(): script_path = test_py_scripts.get_py_script('gdal_merge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_merge', '-o tmp/test_gdal_merge_1.tif ../gcore/data/byte.tif') ds = gdal.Open('tmp/test_gdal_merge_1.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None ############################################################################### # Merge 4 tiles def test_gdal_merge_2(): script_path = test_py_scripts.get_py_script('gdal_merge') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() ds = drv.Create('tmp/in1.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).Fill(0) ds = None ds = drv.Create('tmp/in2.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([3, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).Fill(63) ds = None ds = drv.Create('tmp/in3.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 48, 0, -0.1]) ds.GetRasterBand(1).Fill(127) ds = None ds = drv.Create('tmp/in4.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([3, 0.1, 0, 48, 0, -0.1]) ds.GetRasterBand(1).Fill(255) ds = None test_py_scripts.run_py_script(script_path, 'gdal_merge', '-q -o tmp/test_gdal_merge_2.tif tmp/in1.tif tmp/in2.tif tmp/in3.tif tmp/in4.tif') ds = gdal.Open('tmp/test_gdal_merge_2.tif') assert ds.GetProjectionRef().find('WGS 84') != -1, \ ('Expected WGS 84\nGot : %s' % (ds.GetProjectionRef())) gt = ds.GetGeoTransform() expected_gt = [2, 0.1, 0, 49, 0, -0.1] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 20 and ds.RasterYSize == 20, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) assert ds.RasterCount == 1, ('Wrong raster count : %d ' % (ds.RasterCount)) assert ds.GetRasterBand(1).Checksum() == 3508, 'Wrong checksum' ############################################################################### # Test -separate and -v options def test_gdal_merge_3(): script_path = test_py_scripts.get_py_script('gdal_merge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_merge', '-separate -v -o tmp/test_gdal_merge_3.tif tmp/in1.tif tmp/in2.tif tmp/in3.tif tmp/in4.tif') ds = gdal.Open('tmp/test_gdal_merge_3.tif') assert ds.GetProjectionRef().find('WGS 84') != -1, \ ('Expected WGS 84\nGot : %s' % (ds.GetProjectionRef())) gt = ds.GetGeoTransform() expected_gt = [2, 0.1, 0, 49, 0, -0.1] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 20 and ds.RasterYSize == 20, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) assert ds.RasterCount == 4, ('Wrong raster count : %d ' % (ds.RasterCount)) assert ds.GetRasterBand(1).Checksum() == 0, 'Wrong checksum' ############################################################################### # Test -init option def test_gdal_merge_4(): script_path = test_py_scripts.get_py_script('gdal_merge') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_merge', '-init 255 -o tmp/test_gdal_merge_4.tif tmp/in2.tif tmp/in3.tif') ds = gdal.Open('tmp/test_gdal_merge_4.tif') assert ds.GetRasterBand(1).Checksum() == 4725, 'Wrong checksum' ############################################################################### # Test merging with alpha band (#3669) def test_gdal_merge_5(): try: from osgeo import gdalnumeric gdalnumeric.BandRasterIONumPy except (ImportError, AttributeError): pytest.skip() script_path = test_py_scripts.get_py_script('gdal_merge') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() ds = drv.Create('tmp/in5.tif', 10, 10, 4) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).Fill(255) ds = None ds = drv.Create('tmp/in6.tif', 10, 10, 4) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(2).Fill(255) ds.GetRasterBand(4).Fill(255) cs = ds.GetRasterBand(4).Checksum() ds = None test_py_scripts.run_py_script(script_path, 'gdal_merge', ' -o tmp/test_gdal_merge_5.tif tmp/in5.tif tmp/in6.tif') ds = gdal.Open('tmp/test_gdal_merge_5.tif') assert ds.GetRasterBand(1).Checksum() == 0, 'Wrong checksum' assert ds.GetRasterBand(2).Checksum() == cs, 'Wrong checksum' assert ds.GetRasterBand(3).Checksum() == 0, 'Wrong checksum' assert ds.GetRasterBand(4).Checksum() == cs, 'Wrong checksum' ds = None os.unlink('tmp/test_gdal_merge_5.tif') test_py_scripts.run_py_script(script_path, 'gdal_merge', ' -o tmp/test_gdal_merge_5.tif tmp/in6.tif tmp/in5.tif') ds = gdal.Open('tmp/test_gdal_merge_5.tif') assert ds.GetRasterBand(1).Checksum() == 0, 'Wrong checksum' assert ds.GetRasterBand(2).Checksum() == cs, 'Wrong checksum' assert ds.GetRasterBand(3).Checksum() == 0, 'Wrong checksum' assert ds.GetRasterBand(4).Checksum() == cs, 'Wrong checksum' ############################################################################### # Cleanup def test_gdal_merge_cleanup(): lst = ['tmp/test_gdal_merge_1.tif', 'tmp/test_gdal_merge_2.tif', 'tmp/test_gdal_merge_3.tif', 'tmp/test_gdal_merge_4.tif', 'tmp/test_gdal_merge_5.tif', 'tmp/in1.tif', 'tmp/in2.tif', 'tmp/in3.tif', 'tmp/in4.tif', 'tmp/in5.tif', 'tmp/in6.tif'] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_gdal_edit.py0000755003401500001440000002723313614005315021225 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_edit.py 554eb0a0ced2fbe219a5d7509fa6790df41aff8a 2019-04-16 23:20:05 +0200 Benjamin Leutner $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_edit.py testing # Author: Even Rouault # ############################################################################### # 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 sys import os import shutil from osgeo import gdal import test_py_scripts import pytest # Usage: gdal_edit [--help-general] [-a_srs srs_def] [-a_ullr ulx uly lrx lry] # [-tr xres yres] [-a_nodata value] # [-unsetgt] [-stats] [-approx_stats] # [-gcp pixel line easting northing [elevation]]* # [-mo "META-TAG=VALUE"]* datasetname ############################################################################### # Test -a_srs, -a_ullr, -a_nodata, -mo def test_gdal_edit_py_1(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') if sys.platform == 'win32': # Passing utf-8 characters doesn't at least please Wine... val = 'fake-utf8' val_encoded = val elif sys.version_info >= (3, 0, 0): val = '\u00e9ven' val_encoded = val else: exec("val = u'\\u00e9ven'") val_encoded = val.encode('utf-8') test_py_scripts.run_py_script(script_path, 'gdal_edit', 'tmp/test_gdal_edit_py.tif -a_srs EPSG:4326 -a_ullr 2 50 3 49 -a_nodata 123 -mo FOO=BAR -mo UTF8=' + val_encoded + ' -mo ' + val_encoded + '=UTF8') ds = gdal.Open('tmp/test_gdal_edit_py.tif') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() nd = ds.GetRasterBand(1).GetNoDataValue() md = ds.GetMetadata() ds = None assert wkt.find('4326') != -1 expected_gt = (2.0, 0.050000000000000003, 0.0, 50.0, 0.0, -0.050000000000000003) for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1e-10 assert nd == 123 assert md['FOO'] == 'BAR' assert md['UTF8'] == val assert md[val] == 'UTF8' ############################################################################### # Test -unsetgt def test_gdal_edit_py_2(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -unsetgt") ds = gdal.Open('tmp/test_gdal_edit_py.tif') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform(can_return_null=True) ds = None assert gt is None assert wkt != '' ############################################################################### # Test -a_srs '' def test_gdal_edit_py_3(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -a_srs ''") ds = gdal.Open('tmp/test_gdal_edit_py.tif') wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None assert gt != (0.0, 1.0, 0.0, 0.0, 0.0, 1.0) assert wkt == '' ############################################################################### # Test -unsetstats def test_gdal_edit_py_4(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') ds = gdal.Open('tmp/test_gdal_edit_py.tif', gdal.GA_Update) band = ds.GetRasterBand(1) band.ComputeStatistics(False) band.SetMetadataItem('FOO', 'BAR') ds = band = None ds = gdal.Open('tmp/test_gdal_edit_py.tif') band = ds.GetRasterBand(1) assert (not (band.GetMetadataItem('STATISTICS_MINIMUM') is None or band.GetMetadataItem('FOO') is None)) ds = band = None test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -unsetstats") ds = gdal.Open('tmp/test_gdal_edit_py.tif') band = ds.GetRasterBand(1) assert (not (band.GetMetadataItem('STATISTICS_MINIMUM') is not None or band.GetMetadataItem('FOO') is None)) ds = band = None with pytest.raises(OSError): os.stat('tmp/test_gdal_edit_py.tif.aux.xml') ############################################################################### # Test -stats def test_gdal_edit_py_5(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() try: from osgeo import gdalnumeric gdalnumeric.BandRasterIONumPy except: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') ds = gdal.Open('tmp/test_gdal_edit_py.tif', gdal.GA_Update) band = ds.GetRasterBand(1) array = band.ReadAsArray() # original minimum is 74; modify a pixel value from 99 to 22 array[15, 12] = 22 band.WriteArray(array) ds = band = None ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert ds.ReadAsArray()[15, 12] == 22 ds = None test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -stats") ds = gdal.Open('tmp/test_gdal_edit_py.tif') stat_min = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert stat_min is not None and float(stat_min) == 22 ds = None ds = gdal.Open('tmp/test_gdal_edit_py.tif', gdal.GA_Update) band = ds.GetRasterBand(1) array = band.ReadAsArray() array[15, 12] = 26 band.WriteArray(array) ds = band = None ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert ds.ReadAsArray()[15, 12] == 26 ds = None test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -stats") ds = gdal.Open('tmp/test_gdal_edit_py.tif') stat_min = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert stat_min is not None and float(stat_min) == 26 ds = None ############################################################################### # Test -setstats def test_gdal_edit_py_6(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') # original values should be min=74, max=255, mean=126.765 StdDev=22.928470838676 test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -setstats None None None None") ds = gdal.Open('tmp/test_gdal_edit_py.tif') stat_min = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert stat_min is not None and float(stat_min) == 74 stat_max = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MAXIMUM') assert stat_max is not None and float(stat_max) == 255 stat_mean = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MEAN') assert not (stat_mean is None or abs(float(stat_mean) - 126.765)>0.001) stat_stddev = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_STDDEV') assert not (stat_stddev is None or abs(float(stat_stddev) - 22.928)>0.001) ds = None test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -setstats 22 217 100 30") ds = gdal.Open('tmp/test_gdal_edit_py.tif') stat_min = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') assert stat_min is not None and float(stat_min) == 22 stat_max = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MAXIMUM') assert stat_max is not None and float(stat_max) == 217 stat_mean = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MEAN') assert stat_mean is not None and float(stat_mean) == 100 stat_stddev = ds.GetRasterBand(1).GetMetadataItem('STATISTICS_STDDEV') assert stat_stddev is not None and float(stat_stddev) == 30 ds = None ############################################################################### # Test -scale and -offset def test_gdal_edit_py_7(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdal_edit_py.tif') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -scale 2 -offset 3") ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert ds.GetRasterBand(1).GetScale() == 2 assert ds.GetRasterBand(1).GetOffset() == 3 ds = None shutil.copy('../gcore/data/1bit_2bands.tif', 'tmp/test_gdal_edit_py.tif') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -scale 2 4 -offset 10 20") ds = gdal.Open('tmp/test_gdal_edit_py.tif') for i in [1, 2]: assert ds.GetRasterBand(i).GetScale() == i*2 assert ds.GetRasterBand(i).GetOffset() == i*10 ds = None ############################################################################### # Test -colorinterp_X def test_gdal_edit_py_8(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() gdal.Translate('tmp/test_gdal_edit_py.tif', '../gcore/data/byte.tif', options='-b 1 -b 1 -b 1 -b 1 -co PHOTOMETRIC=RGB -co ALPHA=NO') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -colorinterp_4 alpha") ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -colorinterp_4 undefined") ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined ############################################################################### def test_gdal_edit_py_unsetrpc(): script_path = test_py_scripts.get_py_script('gdal_edit') if script_path is None: pytest.skip() gdal.Translate('tmp/test_gdal_edit_py.tif', '../gcore/data/byte_rpc.tif') test_py_scripts.run_py_script(script_path, 'gdal_edit', "tmp/test_gdal_edit_py.tif -unsetrpc") ds = gdal.Open('tmp/test_gdal_edit_py.tif') assert not ds.GetMetadata('RPC') ############################################################################### # Cleanup def test_gdal_edit_py_cleanup(): gdal.Unlink('tmp/test_gdal_edit_py.tif') gdalautotest-3.0.4/pyscripts/test_gdalmove.py0000755003401500001440000000551113614005315021102 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdalmove.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdalmove testing # 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 os import shutil from osgeo import gdal import test_py_scripts import pytest ############################################################################### # def test_gdalmove_1(): script_path = test_py_scripts.get_py_script('gdalmove') if script_path is None: pytest.skip() shutil.copy('../gcore/data/byte.tif', 'tmp/test_gdalmove_1.tif') test_py_scripts.run_py_script(script_path, 'gdalmove', '-s_srs "+proj=utm +zone=11 +ellps=clrk66 +towgs84=0,0,0 +no_defs" -t_srs EPSG:32611 tmp/test_gdalmove_1.tif -et 1') ds = gdal.Open('tmp/test_gdalmove_1.tif') got_gt = ds.GetGeoTransform() expected_gt = (440719.95870935748, 60.000041745067577, 1.9291142234578728e-05, 3751294.2109841029, 1.9099167548120022e-05, -60.000041705276814) for i in range(6): assert abs(got_gt[i] - expected_gt[i]) / abs(got_gt[i]) <= 1e-5, 'bad gt' wkt = ds.GetProjection() assert '32611' in wkt, 'bad geotransform' ds = None ############################################################################### # Cleanup def test_gdalmove_cleanup(): lst = ['tmp/test_gdalmove_1.tif'] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_gdal_fillnodata.py0000755003401500001440000000625413614005315022415 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_fillnodata.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_fillnodata.py 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, fillnodata, 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 test_py_scripts import pytest ############################################################################### # Dummy test : there is no nodata value in the source dataset ! def test_gdal_fillnodata_1(): script_path = test_py_scripts.get_py_script('gdal_fillnodata') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_fillnodata', '../gcore/data/byte.tif tmp/test_gdal_fillnodata_1.tif') ds = gdal.Open('tmp/test_gdal_fillnodata_1.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None ############################################################################### # Make sure we copy the no data value to the dst when created # No data value for nodata_byte.tif is 0. def test_gdal_fillnodata_2(): script_path = test_py_scripts.get_py_script('gdal_fillnodata') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_fillnodata', '../gcore/data/nodata_byte.tif tmp/test_gdal_fillnodata_2.tif') ds = gdal.Open('tmp/test_gdal_fillnodata_2.tif') assert ds.GetRasterBand(1).GetNoDataValue() == 0, \ 'Failed to copy No Data Value to dst dataset.' ds = None ############################################################################### # Cleanup def test_gdal_fillnodata_cleanup(): lst = ['tmp/test_gdal_fillnodata_1.tif', 'tmp/test_gdal_fillnodata_2.tif'] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_gdal_calc.py0000755003401500001440000003262613614005315021204 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_calc.py 25549 2013-01-26 11:17:10Z rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_calc.py testing # Author: Etienne Tourigny # ############################################################################### # Copyright (c) 2013, Even Rouault # Copyright (c) 2014, Etienne Tourigny # # 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 os import shutil from osgeo import gdal import test_py_scripts import pytest # test that gdalnumeric is available, if not skip all tests gdalnumeric_not_available = False try: from osgeo import gdalnumeric gdalnumeric.BandRasterIONumPy except (ImportError, AttributeError): gdalnumeric_not_available = True # Usage: gdal_calc.py [-A ] [--A_band] [-B...-Z filename] [other_options] ############################################################################### # test basic copy def test_gdal_calc_py_1(): if gdalnumeric_not_available: pytest.skip('gdalnumeric is not available, skipping all tests') script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() shutil.copy('../gcore/data/stefan_full_rgba.tif', 'tmp/test_gdal_calc_py.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --calc=A --overwrite --outfile tmp/test_gdal_calc_py_1_1.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --A_band=2 --calc=A --overwrite --outfile tmp/test_gdal_calc_py_1_2.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-Z tmp/test_gdal_calc_py.tif --Z_band=2 --calc=Z --overwrite --outfile tmp/test_gdal_calc_py_1_3.tif') ds1 = gdal.Open('tmp/test_gdal_calc_py_1_1.tif') ds2 = gdal.Open('tmp/test_gdal_calc_py_1_2.tif') ds3 = gdal.Open('tmp/test_gdal_calc_py_1_3.tif') assert ds1 is not None, 'ds1 not found' assert ds2 is not None, 'ds2 not found' assert ds3 is not None, 'ds3 not found' assert ds1.GetRasterBand(1).Checksum() == 12603, 'ds1 wrong checksum' assert ds2.GetRasterBand(1).Checksum() == 58561, 'ds2 wrong checksum' assert ds3.GetRasterBand(1).Checksum() == 58561, 'ds3 wrong checksum' ds1 = None ds2 = None ds3 = None ############################################################################### # test simple formulas def test_gdal_calc_py_2(): if gdalnumeric_not_available: pytest.skip() script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --A_band 1 -B tmp/test_gdal_calc_py.tif --B_band 2 --calc=A+B --overwrite --outfile tmp/test_gdal_calc_py_2_1.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --A_band 1 -B tmp/test_gdal_calc_py.tif --B_band 2 --calc=A*B --overwrite --outfile tmp/test_gdal_calc_py_2_2.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --A_band 1 --calc="sqrt(A)" --type=Float32 --overwrite --outfile tmp/test_gdal_calc_py_2_3.tif') ds1 = gdal.Open('tmp/test_gdal_calc_py_2_1.tif') ds2 = gdal.Open('tmp/test_gdal_calc_py_2_2.tif') ds3 = gdal.Open('tmp/test_gdal_calc_py_2_3.tif') assert ds1 is not None, 'ds1 not found' assert ds2 is not None, 'ds2 not found' assert ds3 is not None, 'ds3 not found' assert ds1.GetRasterBand(1).Checksum() == 12368, 'ds1 wrong checksum' assert ds2.GetRasterBand(1).Checksum() == 62785, 'ds2 wrong checksum' assert ds3.GetRasterBand(1).Checksum() == 47132, 'ds3 wrong checksum' ds1 = None ds2 = None ds3 = None ############################################################################### # test --allBands option (simple copy) def test_gdal_calc_py_3(): if gdalnumeric_not_available: pytest.skip() script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --allBands A --calc=A --overwrite --outfile tmp/test_gdal_calc_py_3.tif') ds = gdal.Open('tmp/test_gdal_calc_py_3.tif') assert ds is not None, 'ds not found' assert ds.GetRasterBand(1).Checksum() == 12603, 'band 1 wrong checksum' assert ds.GetRasterBand(2).Checksum() == 58561, 'band 2 wrong checksum' assert ds.GetRasterBand(3).Checksum() == 36064, 'band 3 wrong checksum' assert ds.GetRasterBand(4).Checksum() == 10807, 'band 4 wrong checksum' ds = None ############################################################################### # test --allBands option (simple calc) def test_gdal_calc_py_4(): if gdalnumeric_not_available: pytest.skip() script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() # some values are clipped to 255, but this doesn't matter... small values were visually checked test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif --calc=1 --overwrite --outfile tmp/test_gdal_calc_py_4_1.tif') test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif -B tmp/test_gdal_calc_py_4_1.tif --B_band 1 --allBands A --calc=A+B --NoDataValue=999 --overwrite --outfile tmp/test_gdal_calc_py_4_2.tif') ds1 = gdal.Open('tmp/test_gdal_calc_py_4_2.tif') assert ds1 is not None, 'ds1 not found' assert ds1.GetRasterBand(1).Checksum() == 29935, 'ds1 band 1 wrong checksum' assert ds1.GetRasterBand(2).Checksum() == 13128, 'ds1 band 2 wrong checksum' assert ds1.GetRasterBand(3).Checksum() == 59092, 'ds1 band 3 wrong checksum' ds1 = None # these values were not tested test_py_scripts.run_py_script(script_path, 'gdal_calc', '-A tmp/test_gdal_calc_py.tif -B tmp/test_gdal_calc_py.tif --B_band 1 --allBands A --calc=A*B --NoDataValue=999 --overwrite --outfile tmp/test_gdal_calc_py_4_3.tif') ds2 = gdal.Open('tmp/test_gdal_calc_py_4_3.tif') assert ds2 is not None, 'ds2 not found' assert ds2.GetRasterBand(1).Checksum() == 10025, 'ds2 band 1 wrong checksum' assert ds2.GetRasterBand(2).Checksum() == 62785, 'ds2 band 2 wrong checksum' assert ds2.GetRasterBand(3).Checksum() == 10621, 'ds2 band 3 wrong checksum' ds2 = None ############################################################################### # test python interface, basic copy def test_gdal_calc_py_5(): if gdalnumeric_not_available: pytest.skip('gdalnumeric is not available, skipping all tests') script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() backup_sys_path = sys.path sys.path.insert(0, script_path) import gdal_calc shutil.copy('../gcore/data/stefan_full_rgba.tif', 'tmp/test_gdal_calc_py.tif') gdal_calc.Calc('A', A='tmp/test_gdal_calc_py.tif', overwrite=True, quiet=True, outfile='tmp/test_gdal_calc_py_5_1.tif') gdal_calc.Calc('A', A='tmp/test_gdal_calc_py.tif', A_band=2, overwrite=True, quiet=True, outfile='tmp/test_gdal_calc_py_5_2.tif') gdal_calc.Calc('Z', Z='tmp/test_gdal_calc_py.tif', Z_band=2, overwrite=True, quiet=True, outfile='tmp/test_gdal_calc_py_5_3.tif') sys.path = backup_sys_path ds1 = gdal.Open('tmp/test_gdal_calc_py_5_1.tif') ds2 = gdal.Open('tmp/test_gdal_calc_py_5_2.tif') ds3 = gdal.Open('tmp/test_gdal_calc_py_5_3.tif') assert ds1 is not None, 'ds1 not found' assert ds2 is not None, 'ds2 not found' assert ds3 is not None, 'ds3 not found' assert ds1.GetRasterBand(1).Checksum() == 12603, 'ds1 wrong checksum' assert ds2.GetRasterBand(1).Checksum() == 58561, 'ds2 wrong checksum' assert ds3.GetRasterBand(1).Checksum() == 58561, 'ds3 wrong checksum' ds1 = None ds2 = None ds3 = None ############################################################################### # test nodata def test_gdal_calc_py_6(): if gdalnumeric_not_available: pytest.skip('gdalnumeric is not available, skipping all tests') script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() backup_sys_path = sys.path sys.path.insert(0, script_path) import gdal_calc gdal.Translate('tmp/test_gdal_calc_py.tif', '../gcore/data/byte.tif', options='-a_nodata 74') gdal_calc.Calc('A', A='tmp/test_gdal_calc_py.tif', overwrite=True, quiet=True, outfile='tmp/test_gdal_calc_py_6.tif', NoDataValue=1) sys.path = backup_sys_path ds = gdal.Open('tmp/test_gdal_calc_py_6.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 4673 result = ds.GetRasterBand(1).ComputeRasterMinMax() assert result == (90, 255) ############################################################################### # test --optfile def test_gdal_calc_py_7(): if gdalnumeric_not_available: pytest.skip('gdalnumeric is not available, skipping all tests') script_path = test_py_scripts.get_py_script('gdal_calc') if script_path is None: pytest.skip() shutil.copy('../gcore/data/stefan_full_rgba.tif', 'tmp/test_gdal_calc_py.tif') with open('tmp/opt1', 'w') as f: f.write('-A tmp/test_gdal_calc_py.tif --calc=A --overwrite --outfile tmp/test_gdal_calc_py_7_1.tif') # Lines in optfiles beginning with '#' should be ignored with open('tmp/opt2', 'w') as f: f.write('-A tmp/test_gdal_calc_py.tif --A_band=2 --calc=A --overwrite --outfile tmp/test_gdal_calc_py_7_2.tif') f.write('\n# -A_band=1') # options on separate lines should work, too opts = '-Z tmp/test_gdal_calc_py.tif', '--Z_band=2', '--calc=Z', '--overwrite', '--outfile tmp/test_gdal_calc_py_7_3.tif' with open('tmp/opt3', 'w') as f: for i in opts: f.write(i + '\n') # double-quoted options should be read as single arguments. Mixed numbers of arguments per line should work. opts = '-Z tmp/test_gdal_calc_py.tif --Z_band=2', '--calc "Z + 0"', '--overwrite --outfile tmp/test_gdal_calc_py_7_4.tif' with open('tmp/opt4', 'w') as f: for i in opts: f.write(i + '\n') test_py_scripts.run_py_script(script_path, 'gdal_calc', '--optfile tmp/opt1') test_py_scripts.run_py_script(script_path, 'gdal_calc', '--optfile tmp/opt2') test_py_scripts.run_py_script(script_path, 'gdal_calc', '--optfile tmp/opt3') test_py_scripts.run_py_script(script_path, 'gdal_calc', '--optfile tmp/opt4') ds1 = gdal.Open('tmp/test_gdal_calc_py_7_1.tif') ds2 = gdal.Open('tmp/test_gdal_calc_py_7_2.tif') ds3 = gdal.Open('tmp/test_gdal_calc_py_7_3.tif') ds4 = gdal.Open('tmp/test_gdal_calc_py_7_4.tif') assert ds1 is not None, 'ds1 not found' assert ds2 is not None, 'ds2 not found' assert ds3 is not None, 'ds3 not found' assert ds4 is not None, 'ds4 not found' assert ds1.GetRasterBand(1).Checksum() == 12603, 'ds1 wrong checksum' assert ds2.GetRasterBand(1).Checksum() == 58561, 'ds2 wrong checksum' assert ds3.GetRasterBand(1).Checksum() == 58561, 'ds3 wrong checksum' assert ds4.GetRasterBand(1).Checksum() == 58561, 'ds4 wrong checksum' ds1 = None ds2 = None ds3 = None ds4 = None def test_gdal_calc_py_cleanup(): lst = ['tmp/test_gdal_calc_py.tif', 'tmp/test_gdal_calc_py_1_1.tif', 'tmp/test_gdal_calc_py_1_2.tif', 'tmp/test_gdal_calc_py_1_3.tif', 'tmp/test_gdal_calc_py_2_1.tif', 'tmp/test_gdal_calc_py_2_2.tif', 'tmp/test_gdal_calc_py_2_3.tif', 'tmp/test_gdal_calc_py_3.tif', 'tmp/test_gdal_calc_py_4_1.tif', 'tmp/test_gdal_calc_py_4_2.tif', 'tmp/test_gdal_calc_py_4_3.tif', 'tmp/test_gdal_calc_py_5_1.tif', 'tmp/test_gdal_calc_py_5_2.tif', 'tmp/test_gdal_calc_py_5_3.tif', 'tmp/test_gdal_calc_py_6.tif', 'tmp/test_gdal_calc_py_7_1.tif', 'tmp/test_gdal_calc_py_7_2.tif', 'tmp/test_gdal_calc_py_7_3.tif', 'tmp/test_gdal_calc_py_7_4.tif', 'tmp/opt1', 'tmp/opt2', 'tmp/opt3', ] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_gdal_proximity.py0000755003401500001440000001031613614005315022336 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_proximity.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test gdal_proximity.py script # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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 test_py_scripts from osgeo import gdal import pytest ############################################################################### # Test a fairly default case. def test_gdal_proximity_1(): script_path = test_py_scripts.get_py_script('gdal_proximity') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') dst_ds = drv.Create('tmp/proximity_1.tif', 25, 25, 1, gdal.GDT_Byte) dst_ds = None test_py_scripts.run_py_script(script_path, 'gdal_proximity', '../alg/data/pat.tif tmp/proximity_1.tif') dst_ds = gdal.Open('tmp/proximity_1.tif') dst_band = dst_ds.GetRasterBand(1) cs_expected = 1941 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try several options def test_gdal_proximity_2(): script_path = test_py_scripts.get_py_script('gdal_proximity') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_proximity', '-q -values 65,64 -maxdist 12 -nodata -1 -fixed-buf-val 255 ../alg/data/pat.tif tmp/proximity_2.tif') dst_ds = gdal.Open('tmp/proximity_2.tif') dst_band = dst_ds.GetRasterBand(1) cs_expected = 3256 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Try input nodata option def test_gdal_proximity_3(): script_path = test_py_scripts.get_py_script('gdal_proximity') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'gdal_proximity', '-q -values 65,64 -maxdist 12 -nodata 0 -use_input_nodata yes ../alg/data/pat.tif tmp/proximity_3.tif') dst_ds = gdal.Open('tmp/proximity_3.tif') dst_band = dst_ds.GetRasterBand(1) cs_expected = 1465 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') ############################################################################### # Cleanup def test_gdal_proximity_cleanup(): lst = ['tmp/proximity_1.tif', 'tmp/proximity_2.tif', 'tmp/proximity_3.tif'] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_rgb2pct.py0000755003401500001440000001365213614005315020654 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_rgb2pct.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: rgb2pct.py and pct2rgb.py 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 struct from osgeo import gdal import gdaltest import test_py_scripts import pytest ############################################################################### # Test rgb2pct def test_rgb2pct_1(): script_path = test_py_scripts.get_py_script('rgb2pct') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'rgb2pct', '../gcore/data/rgbsmall.tif tmp/test_rgb2pct_1.tif') ds = gdal.Open('tmp/test_rgb2pct_1.tif') assert ds.GetRasterBand(1).Checksum() == 31231 ds = None ############################################################################### # Test pct2rgb def test_pct2rgb_1(): try: from osgeo import gdalnumeric gdalnumeric.BandRasterIONumPy except: pytest.skip() script_path = test_py_scripts.get_py_script('pct2rgb') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'pct2rgb', 'tmp/test_rgb2pct_1.tif tmp/test_pct2rgb_1.tif') ds = gdal.Open('tmp/test_pct2rgb_1.tif') assert ds.GetRasterBand(1).Checksum() == 20963 ori_ds = gdal.Open('../gcore/data/rgbsmall.tif') max_diff = gdaltest.compare_ds(ori_ds, ds) assert max_diff <= 18 ds = None ori_ds = None ############################################################################### # Test rgb2pct -n option def test_rgb2pct_2(): script_path = test_py_scripts.get_py_script('rgb2pct') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'rgb2pct', '-n 16 ../gcore/data/rgbsmall.tif tmp/test_rgb2pct_2.tif') ds = gdal.Open('tmp/test_rgb2pct_2.tif') assert ds.GetRasterBand(1).Checksum() == 16596 ct = ds.GetRasterBand(1).GetRasterColorTable() for i in range(16, 255): entry = ct.GetColorEntry(i) assert (entry[0] == 0 and entry[1] == 0 and entry[2] == 0), \ 'Color table has more than 16 entries' ds = None ############################################################################### # Test rgb2pct -pct option def test_rgb2pct_3(): script_path = test_py_scripts.get_py_script('rgb2pct') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'rgb2pct', '-pct tmp/test_rgb2pct_2.tif ../gcore/data/rgbsmall.tif tmp/test_rgb2pct_3.tif') ds = gdal.Open('tmp/test_rgb2pct_3.tif') assert ds.GetRasterBand(1).Checksum() == 16596 ct = ds.GetRasterBand(1).GetRasterColorTable() for i in range(16, 255): entry = ct.GetColorEntry(i) assert (entry[0] == 0 and entry[1] == 0 and entry[2] == 0), \ 'Color table has more than 16 entries' ds = None ############################################################################### # Test pct2rgb with big CT (>256 entries) def test_pct2rgb_4(): try: from osgeo import gdalnumeric gdalnumeric.BandRasterIONumPy except (ImportError, AttributeError): pytest.skip() script_path = test_py_scripts.get_py_script('pct2rgb') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'pct2rgb', '-rgba ../gcore/data/rat.img tmp/test_pct2rgb_4.tif') ds = gdal.Open('tmp/test_pct2rgb_4.tif') ori_ds = gdal.Open('../gcore/data/rat.img') ori_data = struct.unpack('H', ori_ds.GetRasterBand(1).ReadRaster(1990, 1990, 1, 1, 1, 1))[0] data = (struct.unpack('B', ds.GetRasterBand(1).ReadRaster(1990, 1990, 1, 1, 1, 1))[0], struct.unpack('B', ds.GetRasterBand(2).ReadRaster(1990, 1990, 1, 1, 1, 1))[0], struct.unpack('B', ds.GetRasterBand(3).ReadRaster(1990, 1990, 1, 1, 1, 1))[0], struct.unpack('B', ds.GetRasterBand(4).ReadRaster(1990, 1990, 1, 1, 1, 1))[0],) ct = ori_ds.GetRasterBand(1).GetRasterColorTable() entry = ct.GetColorEntry(ori_data) assert entry == data ds = None ori_ds = None ############################################################################### # Cleanup def test_rgb2pct_cleanup(): lst = ['tmp/test_rgb2pct_1.tif', 'tmp/test_pct2rgb_1.tif', 'tmp/test_rgb2pct_2.tif', 'tmp/test_rgb2pct_3.tif', 'tmp/test_pct2rgb_1.tif', 'tmp/test_pct2rgb_4.tif'] for filename in lst: try: os.remove(filename) except OSError: pass gdalautotest-3.0.4/pyscripts/test_ogrinfo_py.py0000755003401500001440000002721613614005315021465 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_ogrinfo_py.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: ogrinfo.py testing # Author: Even Rouault # ############################################################################### # 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 import ogrtest import test_py_scripts import pytest ############################################################################### # Simple test def test_ogrinfo_py_1(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp') assert ret.find('ESRI Shapefile') != -1 ############################################################################### # Test -ro option def test_ogrinfo_py_2(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '-ro ../ogr/data/poly.shp') assert ret.find('ESRI Shapefile') != -1 ############################################################################### # Test -al option def test_ogrinfo_py_3(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '-al ../ogr/data/poly.shp') assert ret.find('Feature Count: 10') != -1 ############################################################################### # Test layer name def test_ogrinfo_py_4(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly') assert ret.find('Feature Count: 10') != -1 ############################################################################### # Test -sql option def test_ogrinfo_py_5(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp -sql "select * from poly"') assert ret.find('Feature Count: 10') != -1 ############################################################################### # Test -geom=NO option def test_ogrinfo_py_6(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -geom=no') assert ret.find('Feature Count: 10') != -1 assert ret.find('POLYGON') == -1 ############################################################################### # Test -geom=SUMMARY option def test_ogrinfo_py_7(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -geom=summary') assert ret.find('Feature Count: 10') != -1 assert ret.find('POLYGON (') == -1 assert ret.find('POLYGON :') != -1 ############################################################################### # Test -spat option def test_ogrinfo_py_8(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -spat 479609 4764629 479764 4764817') if ogrtest.have_geos(): assert ret.find('Feature Count: 4') != -1 return else: assert ret.find('Feature Count: 5') != -1 return ############################################################################### # Test -where option def test_ogrinfo_py_9(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -where "EAS_ID=171"') assert ret.find('Feature Count: 1') != -1 ############################################################################### # Test -fid option def test_ogrinfo_py_10(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -fid 9') assert ret.find('OGRFeature(poly):9') != -1 ############################################################################### # Test -fields=no option def test_ogrinfo_py_11(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '../ogr/data/poly.shp poly -fields=no') assert ret.find('AREA (Real') == -1 assert ret.find('POLYGON (') != -1 ############################################################################### # Test RFC 41 support def test_ogrinfo_py_22(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() f = open('tmp/test_ogrinfo_22.csv', 'wt') f.write('_WKTgeom1_EPSG_4326,_WKTgeom2_EPSG_32631\n') f.write('"POINT(1 2)","POINT(3 4)"\n') f.close() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', 'tmp/test_ogrinfo_22.csv') assert '1: test_ogrinfo_22 (Unknown (any), Unknown (any))' in ret ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '-al tmp/test_ogrinfo_22.csv') expected_ret = """INFO: Open of `tmp/test_ogrinfo_22.csv' using driver `CSV' successful. Layer name: test_ogrinfo_22 Geometry (geom__WKTgeom1_EPSG_4326): Unknown (any) Geometry (geom__WKTgeom2_EPSG_32631): Unknown (any) Feature Count: 1 Extent (geom__WKTgeom1_EPSG_4326): (1.000000, 2.000000) - (1.000000, 2.000000) Extent (geom__WKTgeom2_EPSG_32631): (3.000000, 4.000000) - (3.000000, 4.000000) SRS WKT (geom__WKTgeom1_EPSG_4326): 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"]] SRS WKT (geom__WKTgeom2_EPSG_32631): 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"]] Geometry Column 1 = geom__WKTgeom1_EPSG_4326 Geometry Column 2 = geom__WKTgeom2_EPSG_32631 _WKTgeom1_EPSG_4326: String (0.0) _WKTgeom2_EPSG_32631: String (0.0) OGRFeature(test_ogrinfo_22):1 _WKTgeom1_EPSG_4326 (String) = POINT(1 2) _WKTgeom2_EPSG_32631 (String) = POINT(3 4) geom__WKTgeom1_EPSG_4326 = POINT (1 2) geom__WKTgeom2_EPSG_32631 = POINT (3 4) """ expected_lines = expected_ret.splitlines() lines = ret.splitlines() for i, exp_line in enumerate(expected_lines): assert exp_line == lines[i], ret os.unlink('tmp/test_ogrinfo_22.csv') ############################################################################### # Test -geomfield (RFC 41) support def test_ogrinfo_py_23(): script_path = test_py_scripts.get_py_script('ogrinfo') if script_path is None: pytest.skip() f = open('tmp/test_ogrinfo_23.csv', 'wt') f.write('_WKTgeom1_EPSG_4326,_WKTgeom2_EPSG_32631\n') f.write('"POINT(1 2)","POINT(3 4)"\n') f.write('"POINT(3 4)","POINT(1 2)"\n') f.close() ret = test_py_scripts.run_py_script(script_path, 'ogrinfo', '-al tmp/test_ogrinfo_23.csv -spat 1 2 1 2 -geomfield geom__WKTgeom2_EPSG_32631') expected_ret = """INFO: Open of `tmp/test_ogrinfo_23.csv' using driver `CSV' successful. Layer name: test_ogrinfo_23 Geometry (geom__WKTgeom1_EPSG_4326): Unknown (any) Geometry (geom__WKTgeom2_EPSG_32631): Unknown (any) Feature Count: 1 Extent (geom__WKTgeom1_EPSG_4326): (3.000000, 4.000000) - (3.000000, 4.000000) Extent (geom__WKTgeom2_EPSG_32631): (1.000000, 2.000000) - (1.000000, 2.000000) SRS WKT (geom__WKTgeom1_EPSG_4326): 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"]] SRS WKT (geom__WKTgeom2_EPSG_32631): 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"]] Geometry Column 1 = geom__WKTgeom1_EPSG_4326 Geometry Column 2 = geom__WKTgeom2_EPSG_32631 _WKTgeom1_EPSG_4326: String (0.0) _WKTgeom2_EPSG_32631: String (0.0) OGRFeature(test_ogrinfo_23):2 _WKTgeom1_EPSG_4326 (String) = POINT(3 4) _WKTgeom2_EPSG_32631 (String) = POINT(1 2) geom__WKTgeom1_EPSG_4326 = POINT (3 4) geom__WKTgeom2_EPSG_32631 = POINT (1 2) """ expected_lines = expected_ret.splitlines() lines = ret.splitlines() for i, exp_line in enumerate(expected_lines): assert exp_line == lines[i], ret os.unlink('tmp/test_ogrinfo_23.csv') gdalautotest-3.0.4/pyscripts/tmp/0000755003401500001440000000000013614004467016475 5ustar rouaultusersgdalautotest-3.0.4/pyscripts/tmp/do-not-remove0000644003401500001440000000000013614004467021101 0ustar rouaultusersgdalautotest-3.0.4/pyscripts/test_gdal_retile.py0000755003401500001440000003032613614005315021561 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_retile.py f894c441f4b5830a9801bfb3dda556b1baa7ee9f 2019-02-22 12:37:35Z DanielEvans $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_retile.py 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 shutil import os from osgeo import gdal from osgeo import osr import test_py_scripts import pytest ############################################################################### # Test gdal_retile.py def test_gdal_retile_1(): script_path = test_py_scripts.get_py_script('gdal_retile') if script_path is None: pytest.skip() try: os.mkdir('tmp/outretile') except OSError: pass test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -levels 2 -r bilinear -targetDir tmp/outretile ../gcore/data/byte.tif') ds = gdal.Open('tmp/outretile/byte_1_1.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None ds = gdal.Open('tmp/outretile/1/byte_1_1.tif') assert ds.RasterXSize == 10 # if ds.GetRasterBand(1).Checksum() != 1152: # print(ds.GetRasterBand(1).Checksum()) # return 'fail' ds = None ds = gdal.Open('tmp/outretile/2/byte_1_1.tif') assert ds.RasterXSize == 5 # if ds.GetRasterBand(1).Checksum() != 215: # print(ds.GetRasterBand(1).Checksum()) # return 'fail' ds = None ############################################################################### # Test gdal_retile.py with RGBA dataset def test_gdal_retile_2(): script_path = test_py_scripts.get_py_script('gdal_retile') if script_path is None: pytest.skip() try: os.mkdir('tmp/outretile2') except OSError: pass test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -levels 2 -r bilinear -targetDir tmp/outretile2 ../gcore/data/rgba.tif') ds = gdal.Open('tmp/outretile2/2/rgba_1_1.tif') assert ds.GetRasterBand(1).Checksum() == 35, 'wrong checksum for band 1' assert ds.GetRasterBand(4).Checksum() == 35, 'wrong checksum for band 4' ds = None ############################################################################### # Test gdal_retile.py with input images of different pixel sizes def test_gdal_retile_3(): script_path = test_py_scripts.get_py_script('gdal_retile') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() # Create two images to tile together. The images will cover the geographic # range 0E-30E and 0-60N, split horizontally at 30N. The pixel size in the # second image will be twice that of the first time. If the make the first # image black and the second gray, then the result of tiling these two # together should be gray square stacked on top of a black square. # # 60 N --------------- # | | \ # | 50x50 | \ Image 2 # | | / # | | / # 30 N --------------- # | | \ # | 100x100 | \ Image 1 # | | / # | | / # 0 N --------------- # 0 E 30 E ds = drv.Create('tmp/in1.tif', 100, 100, 1) px1_x = 30.0 / ds.RasterXSize px1_y = 30.0 / ds.RasterYSize ds.SetProjection(wkt) ds.SetGeoTransform([0, px1_x, 0, 30, 0, -px1_y]) ds.GetRasterBand(1).Fill(0) ds = None ds = drv.Create('tmp/in2.tif', 50, 50, 1) px2_x = 30.0 / ds.RasterXSize px2_y = 30.0 / ds.RasterYSize ds.SetProjection(wkt) ds.SetGeoTransform([0, px2_x, 0, 60, 0, -px2_y]) ds.GetRasterBand(1).Fill(42) ds = None try: os.mkdir('tmp/outretile3') except OSError: pass test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -levels 2 -r bilinear -targetDir tmp/outretile3 tmp/in1.tif tmp/in2.tif') ds = gdal.Open('tmp/outretile3/in1_1_1.tif') assert ds.GetProjectionRef().find('WGS 84') != -1, \ ('Expected WGS 84\nGot : %s' % (ds.GetProjectionRef())) gt = ds.GetGeoTransform() expected_gt = [0, px1_x, 0, 60, 0, -px1_y] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 100 and ds.RasterYSize == 200, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) assert ds.RasterCount == 1, ('Wrong raster count : %d ' % (ds.RasterCount)) assert ds.GetRasterBand(1).Checksum() == 38999, 'Wrong checksum' ############################################################################### # Test gdal_retile.py -overlap def test_gdal_retile_4(): script_path = test_py_scripts.get_py_script('gdal_retile') if script_path is None: pytest.skip() try: os.mkdir('tmp/outretile4') except OSError: pass test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -ps 8 7 -overlap 3 -targetDir tmp/outretile4 ../gcore/data/byte.tif') expected_results = [['tmp/outretile4/byte_1_1.tif', 8, 7], ['tmp/outretile4/byte_1_2.tif', 8, 7], ['tmp/outretile4/byte_1_3.tif', 8, 7], ['tmp/outretile4/byte_1_4.tif', 5, 7], ['tmp/outretile4/byte_2_1.tif', 8, 7], ['tmp/outretile4/byte_2_2.tif', 8, 7], ['tmp/outretile4/byte_2_3.tif', 8, 7], ['tmp/outretile4/byte_2_4.tif', 5, 7], ['tmp/outretile4/byte_3_1.tif', 8, 7], ['tmp/outretile4/byte_3_2.tif', 8, 7], ['tmp/outretile4/byte_3_3.tif', 8, 7], ['tmp/outretile4/byte_3_4.tif', 5, 7], ['tmp/outretile4/byte_4_1.tif', 8, 7], ['tmp/outretile4/byte_4_2.tif', 8, 7], ['tmp/outretile4/byte_4_3.tif', 8, 7], ['tmp/outretile4/byte_4_4.tif', 5, 7], ['tmp/outretile4/byte_5_1.tif', 8, 4], ['tmp/outretile4/byte_5_2.tif', 8, 4], ['tmp/outretile4/byte_5_3.tif', 8, 4], ['tmp/outretile4/byte_5_4.tif', 5, 4]] for (filename, width, height) in expected_results: ds = gdal.Open(filename) assert ds.RasterXSize == width, filename assert ds.RasterYSize == height, filename ds = None test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -levels 1 -ps 8 8 -overlap 4 -targetDir tmp/outretile4 ../gcore/data/byte.tif') expected_results = [['tmp/outretile4/byte_1_1.tif', 8, 8], ['tmp/outretile4/byte_1_2.tif', 8, 8], ['tmp/outretile4/byte_1_3.tif', 8, 8], ['tmp/outretile4/byte_1_4.tif', 8, 8], ['tmp/outretile4/byte_2_1.tif', 8, 8], ['tmp/outretile4/byte_2_2.tif', 8, 8], ['tmp/outretile4/byte_2_3.tif', 8, 8], ['tmp/outretile4/byte_2_4.tif', 8, 8], ['tmp/outretile4/byte_3_1.tif', 8, 8], ['tmp/outretile4/byte_3_2.tif', 8, 8], ['tmp/outretile4/byte_3_3.tif', 8, 8], ['tmp/outretile4/byte_3_4.tif', 8, 8], ['tmp/outretile4/byte_4_1.tif', 8, 8], ['tmp/outretile4/byte_4_2.tif', 8, 8], ['tmp/outretile4/byte_4_3.tif', 8, 8], ['tmp/outretile4/byte_4_4.tif', 8, 8], ['tmp/outretile4/1/byte_1_1.tif', 8, 8], ['tmp/outretile4/1/byte_1_2.tif', 6, 8], ['tmp/outretile4/1/byte_2_1.tif', 8, 6], ['tmp/outretile4/1/byte_2_2.tif', 6, 6]] for (filename, width, height) in expected_results: ds = gdal.Open(filename) assert ds.RasterXSize == width, filename assert ds.RasterYSize == height, filename ds = None ############################################################################### # Test gdal_retile.py with input having a NoData value def test_gdal_retile_5(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy as np except (ImportError, AttributeError): pytest.skip() nodata_value = -3.4028234663852886e+38 raster_array = np.array(([0.0, 2.0], [-1.0, nodata_value])) script_path = test_py_scripts.get_py_script('gdal_retile') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() ds = drv.Create('tmp/in5.tif', 2, 2, 1, gdal.GDT_Float32) px1_x = 0.1 / ds.RasterXSize px1_y = 0.1 / ds.RasterYSize ds.SetProjection(wkt) ds.SetGeoTransform([0, px1_x, 0, 30, 0, -px1_y]) raster_band = ds.GetRasterBand(1) raster_band.SetNoDataValue(nodata_value) raster_band.WriteArray(raster_array) raster_band = None ds = None try: os.mkdir('tmp/outretile5') except OSError: pass test_py_scripts.run_py_script(script_path, 'gdal_retile', '-v -targetDir tmp/outretile5 tmp/in5.tif') ds = gdal.Open('tmp/outretile5/in5_1_1.tif') raster_band = ds.GetRasterBand(1) assert raster_band.GetNoDataValue() == nodata_value, \ ('Wrong nodata value.\nExpected %f, Got: %f' % (nodata_value, raster_band.GetNoDataValue())) min_val, max_val = raster_band.ComputeRasterMinMax() assert max_val, \ ('Wrong maximum value.\nExpected 2.0, Got: %f' % max_val) assert min_val == -1.0, \ ('Wrong minimum value.\nExpected -1.0, Got: %f' % min_val) ds = None ############################################################################### # Cleanup def test_gdal_retile_cleanup(): lst = ['tmp/outretile/1/byte_1_1.tif', 'tmp/outretile/2/byte_1_1.tif', 'tmp/outretile/byte_1_1.tif', 'tmp/outretile/1', 'tmp/outretile/2', 'tmp/outretile', 'tmp/outretile2/1/rgba_1_1.tif', 'tmp/outretile2/2/rgba_1_1.tif', 'tmp/outretile2/1', 'tmp/outretile2/2', 'tmp/outretile2/rgba_1_1.tif', 'tmp/outretile2', 'tmp/in1.tif', 'tmp/in2.tif', 'tmp/outretile3/1/in1_1_1.tif', 'tmp/outretile3/2/in1_1_1.tif', 'tmp/outretile3/1', 'tmp/outretile3/2', 'tmp/outretile3/in1_1_1.tif', 'tmp/outretile3', 'tmp/in5.tif'] for filename in lst: try: os.remove(filename) except OSError: try: os.rmdir(filename) except OSError: pass shutil.rmtree('tmp/outretile4') if os.path.exists('tmp/outretile5'): shutil.rmtree('tmp/outretile5') gdalautotest-3.0.4/pyscripts/test_gdal_sieve.py0000755003401500001440000000531413614005315021407 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdal_sieve.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test gdal_sieve.py utility # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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 test_py_scripts from osgeo import gdal import pytest ############################################################################### # Test a fairly default case. def test_gdal_sieve_1(): script_path = test_py_scripts.get_py_script('gdal_sieve') if script_path is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') dst_ds = drv.Create('tmp/sieve_1.tif', 5, 7, 1, gdal.GDT_Byte) dst_ds = None test_py_scripts.run_py_script(script_path, 'gdal_sieve', '-nomask -st 2 -4 ../alg/data/sieve_src.grd tmp/sieve_1.tif') dst_ds = gdal.Open('tmp/sieve_1.tif') dst_band = dst_ds.GetRasterBand(1) cs_expected = 364 cs = dst_band.Checksum() dst_band = None dst_ds = None if cs == cs_expected \ or gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': # Reload because of side effects of run_py_script() drv = gdal.GetDriverByName('GTiff') drv.Delete('tmp/sieve_1.tif') if cs != cs_expected: print('Got: ', cs) pytest.fail('got wrong checksum') gdalautotest-3.0.4/gnm/0000755003401500001440000000000013614005315014407 5ustar rouaultusersgdalautotest-3.0.4/gnm/tmp/0000755003401500001440000000000013614004466015215 5ustar rouaultusersgdalautotest-3.0.4/gnm/tmp/do-not-remove0000644003401500001440000000000013614004466017621 0ustar rouaultusersgdalautotest-3.0.4/gnm/__init__.py0000644003401500001440000000000013614005315016506 0ustar rouaultusersgdalautotest-3.0.4/gnm/data/0000755003401500001440000000000013614004466015326 5ustar rouaultusersgdalautotest-3.0.4/gnm/data/pipes.qpj0000644003401500001440000000040113614004466017155 0ustar rouaultusersGEOGCS["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"]] gdalautotest-3.0.4/gnm/data/pipes.dbf0000644003401500001440000000116113614004466017122 0ustar rouaultusers_!aidN widthN 32 1 31 5 30 3 29 3 28 5 27 3 26 4 25 4 24 10 23 8 22 7 21 7 20 3 19 3 18 3 17 2 16 5 15 4 14 4 13 3 12 2 11 3 10 4 9 6 8 7 7 4 6 6 5 5 4 6 3 4 2 4 1 3 0 6gdalautotest-3.0.4/gnm/data/wells.prj0000644003401500001440000000021713614004466017171 0ustar rouaultusersGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]gdalautotest-3.0.4/gnm/data/pipes.shp0000644003401500001440000000567413614004466017176 0ustar rouaultusers' ݝTB@+qK@7(B@1K@(r~B@L5.K@BlfB@Ř1K@BlfB@Ř1K@r~B@L5.K@(qfB@!.K@rTB@1K@rTB@!.K@qfB@1K@(IB@*K@IB@3.K@IB@*K@IB@3.K@(B@[W!K@bIB@ԁ*K@B@[W!K@bIB@ԁ*K@(ͥB@\AK@NڥB@Me,K@ͥB@\AK@NڥB@Me,K@(jKB@쟀K@ B@/K@jKB@쟀K@ B@/K@(< B@X%K@7B@j .K@7B@X%K@< B@j .K@(27B@OK@(B@߱%K@(B@OK@27B@߱%K@ (0R B@z|Lv K@7(B@sOK@0R B@z|Lv K@7(B@sOK@ (@{)B@fOK@rʥB@M>K@@{)B@M>K@rʥB@fOK@ (ZgB@FK@@{)B@$K@ZgB@$K@@{)B@FK@ (B6}\xB@VgK@ fB@K@B6}\xB@VgK@ fB@K@ (3@StۥB@K@lHޥB@:hK@3@StۥB@K@lHޥB@:hK@(9ۥB@1.K@2@StۥB@6K@9ۥB@1.K@2@StۥB@6K@(9ۥB@K@?B@1.K@?B@K@9ۥB@1.K@(aQB@K@sB@AW!K@sB@AW!K@aQB@K@("B@nIK@ExͥB@W!K@ExͥB@nIK@"B@W!K@(8ͥB@KhK@AޥB@_K@AޥB@KhK@8ͥB@_K@(ԽޥB@*~K@9$B@@hK@9$B@*~K@ԽޥB@@hK@(X$B@W`8K@P+B@.h~K@P+B@W`8K@X$B@.h~K@(+B@⥀K@Q)B@a6K@Q)B@⥀K@+B@a6K@(1B@/!Hv K@/R B@K@/R B@/!Hv K@1B@K@(x&B@PDK@?Q B@/!Hv K@x&B@PDK@?Q B@/!Hv K@(WM>B@=YK@A B@sK@WM>B@=YK@A B@sK@(JʥB@wOK@DB@I>K@JʥB@wOK@DB@I>K@(s$B@ 7+K@:ʥB@goOK@s$B@ 7+K@:ʥB@goOK@(ѢB@+qK@q$B@,K@ѢB@+qK@q$B@,K@(UB@+qK@ѢB@;K@UB@;K@ѢB@+qK@(w[xB@ ?K@B@W)PdK@w[xB@W)PdK@B@ ?K@(tiB@QdK@[xB@$t|K@tiB@$t|K@[xB@QdK@(!"a\B@RK@y4iB@4 K@!"a\B@4 K@y4iB@RK@ (ݝTB@AK@va\B@1K@ݝTB@1K@va\B@AK@!( B@5K@pQ B@T/G.K@ B@5K@pQ B@T/G.K@gdalautotest-3.0.4/gnm/data/wells.shx0000644003401500001440000000053413614004466017202 0ustar rouaultusers' O TB@LSjlK@(B@nk1K@2 @ N \ j x    . < J X f t        gdalautotest-3.0.4/gnm/data/pipes.prj0000644003401500001440000000021713614004466017163 0ustar rouaultusersGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]gdalautotest-3.0.4/gnm/data/wells.shp0000644003401500001440000000171013614004466017167 0ustar rouaultusers' O TB@LSjlK@(B@nk1K@ z)B@SK@ ּB@ MK@ BtۥB@-:K@ 99ۥB@&MK@ d B@_^.K@ g/8B@Tlʲ%K@ E2B@y?K@ (B@OK@ ~B@1.K@ SڦfB@nk1K@ {B@'.K@ IB@,#*K@ ڥB@Q=,K@ QB@DK@ fcB@/W!K@ ͥB@Cv9K@ PޥB@*QhK@ {#B@‘~K@ 8+B@]K@ PċB@>K@ Q B@Vv K@ A~B@K@ ZήB@K@ V~ʥB@i}OK@ c$B@+K@ 砂ѢB@dqK@ B@w3K@ ]][xB@ߠeK@ DniB@UK@ #"a\B@3 K@ İTB@8aK@gdalautotest-3.0.4/gnm/data/wells.qpj0000644003401500001440000000040113614004466017163 0ustar rouaultusersGEOGCS["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"]] gdalautotest-3.0.4/gnm/data/wells.dbf0000644003401500001440000000112113614004466017124 0ustar rouaultusers_aidN depthN 31 15 30 15 29 15 28 15 27 15 26 15 25 15 24 15 23 15 22 16 21 15 20 15 19 15 18 15 17 15 16 15 15 15 14 15 13 15 12 15 11 16 10 15 9 15 8 12 7 10 6 10 5 16 4 15 3 16 2 15 1 15gdalautotest-3.0.4/gnm/data/pipes.shx0000644003401500001440000000055413614004466017176 0ustar rouaultusers' ݝTB@+qK@7(B@1K@2(^(((((:(f(((((B(n(((((J(v((((&(R(~((((.(Z(((gdalautotest-3.0.4/gnm/gnm_test.py0000755003401500001440000001471613614005315016615 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gnm_test.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic GNMGdalNetwork class functionality. # Authors: Mikhail Gusev (gusevmihs at gmail dot com) # Dmitry Baryshnikov, polimax@mail.ru # ############################################################################### # Copyright (c) 2014, Mikhail Gusev # Copyright (c) 2014-2015, 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 os import shutil from osgeo import gdal from osgeo import gnm import pytest ############################################################################### # Create file base network def test_gnm_filenetwork_create(): try: shutil.rmtree('tmp/test_gnm') except OSError: pass ogrtest.drv = None ogrtest.have_gnm = 0 ogrtest.drv = gdal.GetDriverByName('GNMFile') if ogrtest.drv is None: pytest.skip() ds = ogrtest.drv.Create('tmp/', 0, 0, 0, gdal.GDT_Unknown, options=['net_name=test_gnm', 'net_description=Test file based GNM', 'net_srs=EPSG:4326']) # cast to GNM dn = gnm.CastToNetwork(ds) assert dn is not None assert dn.GetVersion() == 100, 'GNM: Check GNM version failed' assert dn.GetName() == 'test_gnm', 'GNM: Check GNM name failed' assert dn.GetDescription() == 'Test file based GNM', \ 'GNM: Check GNM description failed' dn = None ogrtest.have_gnm = 1 ############################################################################### # Open file base network def test_gnm_filenetwork_open(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') # cast to GNM dn = gnm.CastToNetwork(ds) assert dn is not None assert dn.GetVersion() == 100, 'GNM: Check GNM version failed' assert dn.GetName() == 'test_gnm', 'GNM: Check GNM name failed' assert dn.GetDescription() == 'Test file based GNM', \ 'GNM: Check GNM description failed' dn = None ############################################################################### # Import layers into file base network def test_gnm_import(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') # pipes dspipes = gdal.OpenEx('data/pipes.shp', gdal.OF_VECTOR) lyrpipes = dspipes.GetLayerByIndex(0) new_lyr = ds.CopyLayer(lyrpipes, 'pipes') assert new_lyr is not None, 'failed to import pipes' dspipes = None new_lyr = None # wells dswells = gdal.OpenEx('data/wells.shp', gdal.OF_VECTOR) lyrwells = dswells.GetLayerByIndex(0) new_lyr = ds.CopyLayer(lyrwells, 'wells') assert new_lyr is not None, 'failed to import wells' dswells = None new_lyr = None assert ds.GetLayerCount() == 2, 'expected 2 layers' ds = None ############################################################################### # autoconnect def test_gnm_autoconnect(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') dgn = gnm.CastToGenericNetwork(ds) assert dgn is not None, 'cast to GNMGenericNetwork failed' ret = dgn.ConnectPointsByLines(['pipes', 'wells'], 0.000001, 1, 1, gnm.GNM_EDGE_DIR_BOTH) assert ret == 0, 'failed to connect' dgn = None ############################################################################### # Dijkstra shortest path def test_gnm_graph_dijkstra(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') dn = gnm.CastToNetwork(ds) assert dn is not None, 'cast to GNMNetwork failed' lyr = dn.GetPath(61, 50, gnm.GATDijkstraShortestPath) assert lyr is not None, 'failed to get path' if lyr.GetFeatureCount() == 0: dn.ReleaseResultSet(lyr) pytest.fail('failed to get path') dn.ReleaseResultSet(lyr) dn = None import ogrtest ############################################################################### # KShortest Paths def test_gnm_graph_kshortest(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') dn = gnm.CastToNetwork(ds) assert dn is not None, 'cast to GNMNetwork failed' lyr = dn.GetPath(61, 50, gnm.GATKShortestPath, options=['num_paths=3']) assert lyr is not None, 'failed to get path' if lyr.GetFeatureCount() < 20: dn.ReleaseResultSet(lyr) pytest.fail('failed to get path') dn.ReleaseResultSet(lyr) dn = None ############################################################################### # ConnectedComponents def test_gnm_graph_connectedcomponents(): if not ogrtest.have_gnm: pytest.skip() ds = gdal.OpenEx('tmp/test_gnm') dn = gnm.CastToNetwork(ds) assert dn is not None, 'cast to GNMNetwork failed' lyr = dn.GetPath(61, 50, gnm.GATConnectedComponents) assert lyr is not None, 'failed to get path' if lyr.GetFeatureCount() == 0: dn.ReleaseResultSet(lyr) pytest.fail('failed to get path') dn.ReleaseResultSet(lyr) dn = None ############################################################################### # Network deleting def test_gnm_delete(): if not ogrtest.have_gnm: pytest.skip() gdal.GetDriverByName('GNMFile').Delete('tmp/test_gnm') assert not os.path.exists('tmp/test_gnm') gdalautotest-3.0.4/osr/0000755003401500001440000000000013614005315014431 5ustar rouaultusersgdalautotest-3.0.4/osr/osr_erm.py0000755003401500001440000000463513614005315016464 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_erm.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test ERMapper spatial reference implementation. # Author: Andrey Kiselev, dron@ak4719.spb.edu # ############################################################################### # Copyright (c) 2010, Andrey Kiselev # # 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. ############################################################################### from osgeo import osr ############################################################################### # Test for the http://trac.osgeo.org/gdal/ticket/3787 problem. # Spherical datums should have inverse flattening parameter 0.0, not 1.0. # def test_osr_erm_1(): for sphere_datum in ['SPHERE', 'SPHERE2', 'USSPHERE']: srs = osr.SpatialReference() srs.ImportFromERM('MRWORLD', sphere_datum, 'METRE') assert srs.GetInvFlattening() == 0.0 and not abs(srs.GetSemiMajor() - srs.GetSemiMinor() > 0.0000005), \ 'Wrong ERMapper spherical datum parameters (bug #3787). Be sure your "ecw_cs.wkt" is from 20890 revision or newer.' ############################################################################### # Confirm that unsupported SRSes will be translated from/to EPSG:n # format (#3955) # def test_osr_erm_2(): srs = osr.SpatialReference() assert srs.ImportFromERM('EPSG:3395', 'EPSG:3395', 'METRE') == 0 and srs.IsProjected(), \ 'EPSG:n import failed.' srs2 = osr.SpatialReference() srs2.SetFromUserInput('EPSG:3395') assert srs2.IsSame(srs), 'EPSG:n import does not match.' gdalautotest-3.0.4/osr/osr_compd.py0000755003401500001440000003165213614005315017002 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_compd.py 8b99fd4d3ad3db542705722876fcf484486f46d6 2019-12-17 14:27:30 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test COMPD_CS support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010, 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 gdaltest from osgeo import osr import pytest example_compd_wkt = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB_1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[375,-111,431,0,0,0,0],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49],PARAMETER["central_meridian",-2],PARAMETER["scale_factor",0.999601272],PARAMETER["false_easting",400000],PARAMETER["false_northing",-100000],UNIT["metre_1",1,AUTHORITY["EPSG","9001"]],AXIS["E",EAST],AXIS["N",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["metre_2",1,AUTHORITY["EPSG","9001"]],AXIS["Up",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]' ############################################################################### # Test parsing and a few operations on a compound coordinate system. def test_osr_compd_1(): srs = osr.SpatialReference() srs.ImportFromWkt(example_compd_wkt) assert srs.IsProjected(), 'Projected COMPD_CS not recognised as projected.' assert not srs.IsGeographic(), 'projected COMPD_CS misrecognised as geographic.' assert not srs.IsLocal(), 'projected COMPD_CS misrecognised as local.' assert srs.IsCompound(), 'COMPD_CS not recognised as compound.' expected_proj4 = '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601272 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=375,-111,431,0,0,0,0 +units=m +vunits=m +no_defs' got_proj4 = srs.ExportToProj4() if expected_proj4 != got_proj4: print('Got: %s' % got_proj4) print('Expected: %s' % expected_proj4) pytest.fail('did not get expected proj.4 translation of compd_cs') assert srs.GetLinearUnitsName() == 'metre_1', 'Did not get expected linear units.' assert srs.Validate() == 0, 'Validate() failed.' ############################################################################### # Test SetFromUserInput() def test_osr_compd_2(): srs = osr.SpatialReference() srs.SetFromUserInput(example_compd_wkt) assert srs.Validate() == 0, 'Does not validate' assert srs.IsProjected(), 'Projected COMPD_CS not recognised as projected.' ############################################################################### # Test expansion of compound coordinate systems from EPSG definition. def test_osr_compd_3(): srs = osr.SpatialReference() srs.ImportFromEPSG(7401) assert srs.Validate() == 0, 'Does not validate' exp_wkt = """COMPD_CS["NTF (Paris) / France II + NGF Lallemand", PROJCS["NTF (Paris) / France II (deprecated)", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936265, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.33722917, AUTHORITY["EPSG","8903"]], UNIT["grad",0.01570796326794897, AUTHORITY["EPSG","9105"]], AUTHORITY["EPSG","4807"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",52], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99987742], PARAMETER["false_easting",600000], PARAMETER["false_northing",2200000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","27582"]], VERT_CS["NGF Lallemand height", VERT_DATUM["Nivellement General de la France - Lallemand",2005, AUTHORITY["EPSG","5118"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Up",UP], AUTHORITY["EPSG","5719"]], AUTHORITY["EPSG","7401"]]""" wkt = srs.ExportToPrettyWkt() assert gdaltest.equal_srs_from_wkt(exp_wkt, wkt) != 0, \ 'did not get expected compound cs for EPSG:7401' ############################################################################### # Test expansion of GCS+VERTCS compound coordinate system. def test_osr_compd_4(): srs = osr.SpatialReference() srs.ImportFromEPSG(7400) assert srs.Validate() == 0, 'Does not validate' exp_wkt = """COMPD_CS["NTF (Paris) + NGF IGN69 height", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936265, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.33722917, AUTHORITY["EPSG","8903"]], UNIT["grad",0.01570796326794897, AUTHORITY["EPSG","9105"]], AUTHORITY["EPSG","4807"]], VERT_CS["NGF-IGN69 height", VERT_DATUM["Nivellement General de la France - IGN69",2005, AUTHORITY["EPSG","5119"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Up",UP], AUTHORITY["EPSG","5720"]], AUTHORITY["EPSG","7400"]]""" wkt = srs.ExportToPrettyWkt() assert gdaltest.equal_srs_from_wkt(exp_wkt, wkt) != 0, \ 'did not get expected compound cs for EPSG:7400' ############################################################################### # Test EPGS:x+y syntax def test_osr_compd_5(): srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:26911+5703') assert srs.Validate() == 0, 'Does not validate' exp_wkt = """COMPD_CS["NAD83 / UTM zone 11N + NAVD88 height", PROJCS["NAD83 / UTM zone 11N", 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["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","26911"]], VERT_CS["NAVD88 height", VERT_DATUM["North American Vertical Datum 1988",2005, AUTHORITY["EPSG","5103"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Gravity-related height",UP], AUTHORITY["EPSG","5703"]]]""" wkt = srs.ExportToPrettyWkt() if gdaltest.equal_srs_from_wkt(exp_wkt, wkt) == 0: pytest.fail() elif exp_wkt != wkt: print('warning they are equivalent, but not completely the same') print(wkt) exp_proj4 = '+proj=utm +zone=11 +datum=NAD83 +units=m +vunits=m +no_defs' proj4 = srs.ExportToProj4() assert proj4 == exp_proj4, ('Did not get expected proj.4 string, got:' + proj4) ############################################################################### # Test conversion from PROJ.4 to WKT including vertical units. def test_osr_compd_6(): srs = osr.SpatialReference() srs.SetFromUserInput('+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +geoidgrids=g2003conus.gtx,g2003alaska.gtx,g2003h01.gtx,g2003p01.gtx +vunits=us-ft +no_defs ') assert srs.Validate() == 0, 'Does not validate' exp_wkt = """COMPD_CS["unknown", PROJCS["unknown", GEOGCS["unknown", DATUM["Unknown_based_on_GRS80_ellipsoid", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], 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, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH]], VERT_CS["unknown", VERT_DATUM["unknown",2005, EXTENSION["PROJ4_GRIDS","g2003conus.gtx,g2003alaska.gtx,g2003h01.gtx,g2003p01.gtx"]], UNIT["US survey foot",0.304800609601219, AUTHORITY["EPSG","9003"]], AXIS["Gravity-related height",UP]]]""" wkt = srs.ExportToPrettyWkt() if gdaltest.equal_srs_from_wkt(exp_wkt, wkt) == 0: pytest.fail() elif exp_wkt != wkt: print('warning they are equivalent, but not completely the same') print(wkt) assert wkt.find('g2003conus.gtx') != -1, 'Did not get PROJ4_GRIDS EXTENSION node' exp_proj4 = '+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +geoidgrids=g2003conus.gtx,g2003alaska.gtx,g2003h01.gtx,g2003p01.gtx +vunits=us-ft +no_defs' proj4 = srs.ExportToProj4() assert proj4 == exp_proj4, ('Did not get expected proj.4 string, got:' + proj4) ############################################################################### # Test SetCompound() def test_osr_compd_7(): srs_horiz = osr.SpatialReference() srs_horiz.ImportFromEPSG(4326) srs_vert = osr.SpatialReference() srs_vert.ImportFromEPSG(5703) srs_vert.SetTargetLinearUnits('VERT_CS', 'foot', 0.304800609601219) srs = osr.SpatialReference() srs.SetCompoundCS('My Compound SRS', srs_horiz, srs_vert) assert srs.Validate() == 0, 'Does not validate' exp_wkt = """COMPD_CS["My Compound 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"]], AUTHORITY["EPSG","4326"]], VERT_CS["NAVD88 height", VERT_DATUM["North American Vertical Datum 1988",2005, AUTHORITY["EPSG","5103"]], UNIT["foot",0.304800609601219], AXIS["Gravity-related height",UP]]]""" wkt = srs.ExportToPrettyWkt() if gdaltest.equal_srs_from_wkt(exp_wkt, wkt) == 0: pytest.fail() elif exp_wkt != wkt: print('warning they are equivalent, but not completely the same') print(wkt) assert srs.GetTargetLinearUnits('VERT_CS') == pytest.approx(0.304800609601219, 1e-15) assert srs.GetTargetLinearUnits(None) == pytest.approx(0.304800609601219, 1e-15) ############################################################################### # Test ImportFromURN() def test_osr_compd_8(): srs = osr.SpatialReference() srs.SetFromUserInput('urn:ogc:def:crs,crs:EPSG::27700,crs:EPSG::5701') assert srs.Validate() == 0, 'Does not validate' wkt = srs.ExportToWkt() assert wkt.startswith('COMPD_CS'), 'COMPD_CS not recognised as compound.' gdalautotest-3.0.4/osr/osr_url.py0000755003401500001440000000652413614005315016502 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_url.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test some URL specific translation issues. # Author: Howard Butler # ############################################################################### # Copyright (c) 2007, Howard Butler # 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. ############################################################################### import socket import gdaltest from osgeo import osr import pytest expected_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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]' def osr_url_test(url, expected_wkt): timeout = 10 socket.setdefaulttimeout(timeout) if gdaltest.gdalurlopen(url) is None: pytest.skip() # Depend on the Accepts headers that ImportFromUrl sets to request SRS from sr.org srs = osr.SpatialReference() from osgeo import gdal gdal.PushErrorHandler('CPLQuietErrorHandler') try: srs.ImportFromUrl(url) except AttributeError: # old-gen bindings don't have this method yet pytest.skip() except Exception: gdal.PopErrorHandler() if gdal.GetLastErrorMsg() == "GDAL/OGR not compiled with libcurl support, remote requests not supported." or \ gdal.GetLastErrorMsg().find("timed out") != -1: pytest.skip() pytest.fail('exception: ' + gdal.GetLastErrorMsg()) gdal.PopErrorHandler() if gdal.GetLastErrorMsg() == "GDAL/OGR not compiled with libcurl support, remote requests not supported." or \ gdal.GetLastErrorMsg().find("timed out") != -1: pytest.skip() assert gdaltest.equal_srs_from_wkt(expected_wkt, srs.ExportToWkt()) def test_osr_url_1(): return osr_url_test('http://spatialreference.org/ref/epsg/4326/', expected_wkt) def test_osr_url_2(): return osr_url_test('http://spatialreference.org/ref/epsg/4326/ogcwkt/', expected_wkt) gdalautotest-3.0.4/osr/osr_pm.py0000755003401500001440000000634313614005315016313 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_pm.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test some prime meridian related issues with EPSG translation # and evaluation by PROJ.4. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, 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 ############################################################################### # Check that EPSG:27572 lookup has the prime meridian properly set, # and the central meridian. def test_osr_pm_1(): srs = osr.SpatialReference() srs.ImportFromEPSG(27572) assert abs(float(srs.GetAttrValue('PRIMEM', 1)) - 2.33722917) <= 0.0000005, \ 'Wrong prime meridian.' assert abs(srs.GetProjParm(osr.SRS_PP_CENTRAL_MERIDIAN) - 0.0) <= 0.0000005, \ 'Wrong central meridian.' ############################################################################### # Check that EPSG:27572 lookup has the prime meridian properly set, # and the central meridian in the PROJ.4 string. def test_osr_pm_2(): srs = osr.SpatialReference() srs.ImportFromEPSG(27572) proj4_srs = srs.ExportToProj4() assert proj4_srs.find('+pm=paris') != -1, 'prime meridian wrong or missing.' assert proj4_srs.find('+lon_0=0') != -1, '+lon_0 is wrong.' ############################################################################### # Convert PROJ.4 format to WKT and verify that PM and central meridian # are properly preserved. def test_osr_pm_3(): srs = osr.SpatialReference() srs.ImportFromProj4('+proj=utm +zone=30 +datum=WGS84 +pm=bogota') assert abs(float(srs.GetAttrValue('PRIMEM', 1)) + 74.08091666678081) <= 0.0000005, \ 'Wrong prime meridian.' assert abs(srs.GetProjParm(osr.SRS_PP_CENTRAL_MERIDIAN) + 3.0) <= 0.0000005, \ 'Wrong central meridian.' ############################################################################### gdalautotest-3.0.4/osr/osr_ct_proj.py0000755003401500001440000002522213614005315017334 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_ct_proj.py 8b99fd4d3ad3db542705722876fcf484486f46d6 2019-12-17 14:27:30 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test reprojection of points of many different projections. # Author: Frank Warmerdam, warmerdam@pobox.com # ############################################################################### # Copyright (c) 2004, 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 gdaltest import os import pytest from osgeo import osr bonne = 'PROJCS["bonne",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["bonne"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",60.0],UNIT["Meter",1.0]]' ############################################################################### # Table of transformations, inputs and expected results (with a threshold) # # Each entry in the list should have a tuple with: # # - src_srs: any form that SetFromUserInput() will take. # - (src_x, src_y, src_z): location in src_srs. # - src_error: threshold for error when srs_x/y is transformed into dst_srs and # then back into srs_src. # - dst_srs: destination srs. # - (dst_x,dst_y,dst_z): point that src_x/y should transform to. # - dst_error: acceptable error threshold for comparing to dst_x/y. # - unit_name: the display name for this unit test. # - options: eventually we will allow a list of special options here (like one # way transformation). For now just put None. # - requirements: string with minimum proj version required, GRID: # or None depend on requirements for the test. transform_list = [ # Simple straight forward reprojection. ('+proj=utm +zone=11 +datum=WGS84', (398285.45, 2654587.59, 0.0), 0.02, 'WGS84', (24.0, -118.0, 0.0), 0.00001, 'UTM_WGS84', None, None), # Ensure that prime meridian *and* axis orientation changes are applied. # Note that this test will fail with PROJ.4 4.7 or earlier, it requires # axis support in PROJ 4.8.0. # ('EPSG:27391', (40000, 20000, 0.0), 0.02, # 'EPSG:4273', (6.397933,58.358709,0.000000), 0.00001, # 'NGO_Oslo_zone1_NGO', None, '4.8.0' ), # Test Bonne projection. ('WGS84', (65.0, 1.0, 0.0), 0.00001, bonne, (47173.75, 557621.30, 0.0), 0.02, 'Bonne_WGS84', None, None), # Test Two Point Equidistant ('+proj=tpeqd +a=3396000 +b=3396000 +lat_1=36.3201218 +lon_1=-179.1566925 +lat_2=45.8120651 +lon_2=179.3727570 +no_defs', (4983568.76, 2092902.61, 0.0), 0.1, '+proj=latlong +a=3396000 +b=3396000', (-140.0, 40.0, 0.0), 0.000001, 'TPED_Mars', None, None), # test scale factor precision (per #1970) ('data/wkt_rt90.def', (1572570.342, 6728429.67, 0.0), 0.001, ' +proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs', (616531.1155, 6727527.5682, 0.0), 0.001, 'ScalePrecision(#1970)', None, None), # Test Google Mercator (EPSG:3785) ('EPSG:3785', (1572570.342, 6728429.67, 0.0), 0.001, 'WGS84', (51.601722482149995, 14.126639735716626, 0.0), 0.0000001, 'GoogleMercator(#3136)', None, None), # Test Equirectangular with all parameters ('+proj=eqc +ellps=sphere +lat_0=-2 +lat_ts=1 +lon_0=-10', (-14453132.04, 4670184.72, 0.0), 0.1, '+proj=latlong +ellps=sphere', (-140.0, 40.0, 0.0), 0.000001, 'Equirectangular(#2706)', None, "4.6.1"), # Test Geocentric ('+proj=latlong +datum=WGS84', (-140.0, 40.0, 0.0), 0.000001, 'EPSG:4328', (-3748031.46884168, -3144971.82314589, 4077985.57220038), 0.1, 'Geocentric', None, None), # Test Vertical Datum Shift with a change of horizontal units. ('+proj=utm +zone=11 +datum=WGS84', (100000.0, 3500000.0, 0.0), 0.1, '+proj=utm +zone=11 +datum=WGS84 +geoidgrids=egm96_15.gtx +units=us-ft', (328083.333225467, 11482916.6665952, 41.4697855726348), 0.01, 'EGM 96 Conversion', None, "GRID:egm96_15.gtx"), # Test optimization in case of identical projections (projected) ('+proj=utm +zone=11 +datum=NAD27 +units=m', (440720.0, 3751260.0, 0.0), 0, '+proj=utm +zone=11 +datum=NAD27 +units=m', (440720.0, 3751260.0, 0.0), 0, 'No-op Optimization (projected)', None, None), # Test optimization in case of identical projections (geodetic) ('+proj=longlat +datum=WGS84', (2, 49, 0.0), 0, '+proj=longlat +datum=WGS84', (2, 49, 0.0), 0, 'No-op Optimization (geodetic)', None, None), # Test GRS80 -> EPSG:3857 ('+proj=longlat +ellps=GRS80 +towgs84=0,0,0 +no_defs', (2, 49, 0.0), 1e-8, '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs', (222638.981586547, 6274861.39384813, 0), 1e-3, 'GRS80 -> EPSG:3857', None, None), # Test GRS80 -> EPSG:3857 ('+proj=longlat +ellps=GRS80 +towgs84=0,0,0 +no_defs', (2, 49, 0.0), 1e-8, '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs', (222638.981586547, 6274861.39384813, 0), 1e-3, 'GRS80 -> EPSG:3857', None, None), ('EPSG:4314', (50, 10, 0.0), 1e-8, 'EPSG:4326', (49.9988573027651,9.99881145557889, 0.0), 1e-8, 'DHDN -> WGS84 using BETA2007', None, 'GRID:BETA2007.gsb'), ("""GEOGCS["DHDN", DATUM["Deutsches_Hauptdreiecksnetz", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], TOWGS84[598.1,73.7,418.2,0.202,0.045,-2.455,6.7], AUTHORITY["EPSG","6314"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4314"]]""", (50, 10, 0.0), 1e-8, 'EPSG:4326', (49.9988572643058,9.99881392529464,0), 1e-8, 'DHDN -> WGS84 using TOWGS84 automatically set', 'OSR_CT_USE_DEFAULT_EPSG_TOWGS84=YES', None), ('+proj=longlat +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +no_defs', (10, 50, 0.0), 1e-8, 'EPSG:4326', (49.9988572643058,9.99881392529464,0), 1e-8, 'DHDN -> WGS84 usign explicit TOWGS84', None, None), ] ############################################################################### # When imported build a list of units based on the files available. @pytest.mark.parametrize( 'src_srs,src_xyz,src_error,dst_srs,dst_xyz,dst_error,unit_name,options,requirements', transform_list, ids=[row[6] for row in transform_list] ) def test_proj(src_srs, src_xyz, src_error, dst_srs, dst_xyz, dst_error, unit_name, options, requirements): if requirements is not None and requirements[:5] == 'GRID:': grid_name = requirements[5:] if grid_name == 'egm96_15.gtx' and \ osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 + osr.GetPROJVersionMicro() < 60201: # Issues before PROJ 6.2.1 pytest.skip() search_paths = osr.GetPROJSearchPaths() found = False for path in search_paths: if os.path.exists(os.path.join(path, grid_name)): found = True break if not found: #print( 'Did not find GRID:%s' % grid_name ) pytest.skip() src = osr.SpatialReference() assert src.SetFromUserInput(src_srs) == 0, \ ('SetFromUserInput(%s) failed.' % src_srs) dst = osr.SpatialReference() assert dst.SetFromUserInput(dst_srs) == 0, \ ('SetFromUserInput(%s) failed.' % dst_srs) if requirements is not None and requirements[0] != 'G': additionnal_error_str = ' Check that proj version is >= %s ' % requirements else: additionnal_error_str = '' has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(src, dst) if not has_built_ct: ct = osr.CoordinateTransformation(src, dst) ###################################################################### # Transform source point to destination SRS. result = ct.TransformPoint(src_xyz[0], src_xyz[1], src_xyz[2]) error = abs(result[0] - dst_xyz[0]) \ + abs(result[1] - dst_xyz[1]) \ + abs(result[2] - dst_xyz[2]) assert error <= dst_error, \ ('Dest error is %g, got (%.15g,%.15g,%.15g)%s' % (error, result[0], result[1], result[2], additionnal_error_str)) ###################################################################### # Now transform back. has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(dst, src) if not has_built_ct: ct = osr.CoordinateTransformation(dst, src) result = ct.TransformPoint(result[0], result[1], result[2]) error = abs(result[0] - src_xyz[0]) \ + abs(result[1] - src_xyz[1]) \ + abs(result[2] - src_xyz[2]) assert error <= src_error, \ ('Back to source error is %g got (%.15g,%.15g,%.15g)%s' % (error, result[0], result[1], result[2], additionnal_error_str)) gdalautotest-3.0.4/osr/osr_metacrs.py0000755003401500001440000001323313614005315017331 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_metacrs.py c5c2dc62f987e4972f180b960015cf2b957a6356 2019-08-01 16:39:53 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test with MetaCRS TestSuite # Author: Frank Warmerdam, warmerdam@pobox.com # ############################################################################### # Copyright (c) 2009, 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 csv import pytest import gdaltest from osgeo import osr, gdal ############################################################################### # When imported build a list of units based on the files available. csv_rows = list(csv.DictReader(open(os.path.join(os.path.dirname(__file__), 'data/Test_Data_File.csv'), 'rt'))) class TestMetaCRS(object): @pytest.mark.parametrize( 'test_line', csv_rows, ids=[row['testName'] for row in csv_rows] ) def test_metacrs(self, test_line): self.test_line = test_line self.src_xyz = None self.dst_xyz = None self.src_srs = None self.dst_srs = None self.dst_error = None result = self.parse_line() ct = osr.CoordinateTransformation(self.src_srs, self.dst_srs) ###################################################################### # Transform source point to destination SRS result = ct.TransformPoint(self.src_xyz[0], self.src_xyz[1], self.src_xyz[2]) # This is odd, but it seems the expected results are switched if self.src_srs.EPSGTreatsAsLatLong(): result = (result[1], result[0], result[2]) ###################################################################### # Check results. error = abs(result[0] - self.dst_xyz[0]) \ + abs(result[1] - self.dst_xyz[1]) \ + abs(result[2] - self.dst_xyz[2]) if error > self.dst_error: err_msg = 'Dest error is %g, src=%g,%g,%g, dst=%.18g,%.18g,%.18g, exp=%.18g,%.18g,%.18g' \ % (error, self.src_xyz[0], self.src_xyz[1], self.src_xyz[2], result[0], result[1], result[2], self.dst_xyz[0], self.dst_xyz[1], self.dst_xyz[2]) gdal.Debug('OSR', 'Src SRS:\n%s\n\nDst SRS:\n%s\n' % (self.src_srs.ExportToPrettyWkt(), self.dst_srs.ExportToPrettyWkt())) pytest.fail(err_msg) self.src_srs = None self.dst_srs = None def parse_line(self): test_line = self.test_line self.src_srs = self.build_srs(test_line['srcCrsAuth'], test_line['srcCrs']) try: self.dst_srs = self.build_srs(test_line['tgtCrsAuth'], test_line['tgtCrs']) except: # Old style self.dst_srs = self.build_srs(test_line['tgtCrsType'], test_line['tgtCrs']) assert not (self.src_srs is None or self.dst_srs is None) try: self.src_xyz = (float(test_line['srcOrd1']), float(test_line['srcOrd2']), float(test_line['srcOrd3'])) except: self.src_xyz = (float(test_line['srcOrd1']), float(test_line['srcOrd2']), 0.0) try: self.dst_xyz = (float(test_line['tgtOrd1']), float(test_line['tgtOrd2']), float(test_line['tgtOrd3'])) except: self.dst_xyz = (float(test_line['tgtOrd1']), float(test_line['tgtOrd2']), 0.0) try: self.dst_error = max(float(test_line['tolOrd1']), float(test_line['tolOrd2']), float(test_line['tolOrd3'])) except: self.dst_error = max(float(test_line['tolOrd1']), float(test_line['tolOrd2'])) def build_srs(self, typ, crstext): if typ == 'EPSG': srs = osr.SpatialReference() if srs.ImportFromEPSG(int(crstext)) == 0: return srs gdaltest.post_reason('failed to translate EPSG:' + crstext) return None gdaltest.post_reason('unsupported srs type: ' + typ) return None gdalautotest-3.0.4/osr/osr_epsg.py0000755003401500001440000003621613614005315016637 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_epsg.py 8b99fd4d3ad3db542705722876fcf484486f46d6 2019-12-17 14:27:30 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test aspects of EPSG code lookup. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, 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. ############################################################################### from osgeo import osr import gdaltest import pytest ############################################################################### # Verify that deprecated EPSG:26591 ends up picking non-deprecated EPSG:3003 def test_osr_epsg_1(): srs = osr.SpatialReference() srs.ImportFromEPSG(26591) assert srs.GetAuthorityCode(None) == '3003' ############################################################################### # Check that EPSG:4312 w.r.t towgs84 values def test_osr_epsg_2(): srs = osr.SpatialReference() with gdaltest.config_option('OSR_ADD_TOWGS84_ON_IMPORT_FROM_EPSG', 'YES'): srs.ImportFromEPSG(4312) if abs(float(srs.GetAttrValue('TOWGS84', 6)) - 2.4232) > 0.0005: print(srs.ExportToPrettyWkt()) pytest.fail('Wrong TOWGS84, override missed?') ############################################################################### # Check that various EPSG lookups based on Pulvoko 1942 have the # towgs84 values set properly (#3579) def test_osr_epsg_3(): for epsg in [3120, 2172, 2173, 2174, 2175, 3328]: srs = osr.SpatialReference() srs.ImportFromEPSG(epsg) srs.AddGuessedTOWGS84() expected_towgs84 = [33.4, -146.6, -76.3, -0.359, -0.053, 0.844, -0.84] for i in range(6): if abs(float(srs.GetAttrValue('TOWGS84', i)) - expected_towgs84[i]) > 0.0005: print(srs.ExportToPrettyWkt()) pytest.fail('For EPSG:%d. Wrong TOWGS84, override missed?' % epsg) ############################################################################### # Check that EPSG:4326 is considered as lat/long def test_osr_epsg_4(): srs = osr.SpatialReference() srs.ImportFromEPSG(4326) assert srs.EPSGTreatsAsLatLong(), 'supposed to be treated as lat/long' assert srs.ExportToWkt().find('AXIS') != -1, 'should have AXIS node' ############################################################################### # Check that EPSGA:4326 is considered as lat/long def test_osr_epsg_5(): srs = osr.SpatialReference() srs.ImportFromEPSGA(4326) assert srs.EPSGTreatsAsLatLong(), 'supposed to be treated as lat/long' assert srs.ExportToWkt().find('AXIS') != -1, 'should have AXIS node' ############################################################################### # Test datum shift for OSGB 36 def test_osr_epsg_6(): srs = osr.SpatialReference() srs.ImportFromEPSG(4277) assert srs.ExportToWkt().find('TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489]') == -1, \ '# We do not expect a datum shift' ############################################################################### # Check that EPSGA:2193 is considered as N/E def test_osr_epsg_7(): srs = osr.SpatialReference() srs.ImportFromEPSG(2193) assert srs.EPSGTreatsAsNorthingEasting(), 'supposed to be treated as n/e' assert srs.ExportToWkt().find('AXIS') != -1, 'should have AXIS node' ############################################################################### # Check that EPSGA:2193 is considered as N/E def test_osr_epsg_8(): srs = osr.SpatialReference() srs.ImportFromEPSGA(2193) assert srs.EPSGTreatsAsNorthingEasting(), 'supposed to be treated as n/e' assert srs.ExportToWkt().find('AXIS') != -1, 'should have AXIS node' ############################################################################### # Check EPSG:3857 def test_osr_epsg_9(): srs = osr.SpatialReference() srs.ImportFromEPSG(3857) assert srs.ExportToWkt() == 'PROJCS["WGS 84 / Pseudo-Mercator",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["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],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"],AUTHORITY["EPSG","3857"]]' assert srs.Validate() == 0, 'Does not validate' ############################################################################### # Test AutoIdentifyEPSG() on Polar Stereographic def test_osr_epsg_10(): srs = osr.SpatialReference() srs.SetFromUserInput("""PROJCS["PS WGS84", 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["Polar_Stereographic"], PARAMETER["latitude_of_origin",-71], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""") assert srs.AutoIdentifyEPSG() == 0 assert srs.GetAuthorityCode(None) == '3031', srs.ExportToWkt() srs_ref = osr.SpatialReference() srs_ref.ImportFromEPSG(3031) assert srs.IsSame(srs_ref) != 0, "%s vs %s" % (srs.ExportToPrettyWkt(), srs_ref.ExportToPrettyWkt()) srs = osr.SpatialReference() srs.SetFromUserInput("""PROJCS["PS WGS84", 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["Polar_Stereographic"], PARAMETER["latitude_of_origin",71], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""") assert srs.AutoIdentifyEPSG() == 0 assert srs.GetAuthorityCode(None) == '3995', srs.ExportToWkt() srs_ref = osr.SpatialReference() srs_ref.ImportFromEPSG(3995) assert srs.IsSame(srs_ref) != 0 ############################################################################### # Test datum shift for EPSG:2065 (PCS based override) def test_osr_epsg_11(): srs = osr.SpatialReference() srs.ImportFromEPSG(2065) # The override is no longer in proj.db #assert srs.ExportToWkt().find('TOWGS84[570.8,85.7,462.8,4.998,1.587,5.261,3.56]') != -1, \ # 'did not get expected TOWGS84' ############################################################################### # Test IsSame() on SRS that differs only by their PROJ4 EXTENSION (besides # different EPSG codes) def test_osr_epsg_12(): sr1 = osr.SpatialReference() sr1.ImportFromEPSG(3857) sr2 = osr.SpatialReference() sr2.ImportFromEPSG(3395) assert not sr1.IsSame(sr2) ############################################################################### # Test FindMatches() def test_osr_epsg_13(): # One exact match sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["ETRS89 / UTM zone 32N (N-E)", GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4258"]], 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["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Northing",NORTH], AXIS["Easting",EAST]]""") matches = sr.FindMatches() assert len(matches) == 1 and matches[0][1] == 100 assert matches[0][0].IsSame(sr) # Another one sr = osr.SpatialReference() sr.ImportFromEPSG(3044) sr.MorphToESRI() sr.SetFromUserInput(sr.ExportToWkt()) matches = sr.FindMatches() assert len(matches) == 1 and matches[0][1] == 100 assert not matches[0][0].IsSame(sr) # Two matches (and test GEOGCS) # This will now match with 4126 (which is deprecated), since the datum # is identified to 6126 and GetEPSGGeogCS has logic to subtract 2000 to it. #sr.SetFromUserInput("""GEOGCS["myLKS94", #DATUM["Lithuania_1994_ETRS89", # SPHEROID["GRS 1980",6378137,298.257222101], # TOWGS84[0,0,0,0,0,0,0]], #PRIMEM["Greenwich",0], #UNIT["degree",0.0174532925199433]]""") #matches = sr.FindMatches() #if len(matches) != 2: # gdaltest.post_reason('fail') # print(matches) # return 'fail' #if matches[0][0].GetAuthorityCode(None) != '4126' or matches[0][1] != 90: # gdaltest.post_reason('fail') # print(matches) # return 'fail' #if matches[1][0].GetAuthorityCode(None) != '4669' or matches[1][1] != 90: # gdaltest.post_reason('fail') # print(matches) # return 'fail' # Very approximate matches sr.SetFromUserInput("""GEOGCS["myGEOGCS", DATUM["my_datum", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]] """) matches = sr.FindMatches() assert matches # One single match, but not similar according to IsSame() sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["WGS 84 / UTM zone 32N", 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",9], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",999999999], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]] """) matches = sr.FindMatches() assert len(matches) == 1 and matches[0][1] == 25 assert matches[0][0].IsSame(sr) != 1 # WKT has EPSG code but the definition doesn't match with the official # one (namely linear units are different) # https://github.com/OSGeo/gdal/issues/990 sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["NAD83 / Ohio North", 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",41.7], PARAMETER["standard_parallel_2",40.43333333333333], PARAMETER["latitude_of_origin",39.66666666666666], PARAMETER["central_meridian",-82.5], PARAMETER["false_easting",1968503.937007874], PARAMETER["false_northing",0], UNIT["International Foot",0.3048, AUTHORITY["EPSG","9002"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","32122"]] """) matches = sr.FindMatches() assert len(matches) == 1 and matches[0][1] == 25 assert matches[0][0].IsSame(sr) != 1 ############################################################################### def test_osr_epsg_gcs_deprecated(): sr = osr.SpatialReference() with gdaltest.config_option('OSR_USE_NON_DEPRECATED', 'NO'): sr.ImportFromEPSG(4268) assert sr.ExportToWkt().find('NAD27 Michigan (deprecated)') >= 0 ############################################################################### def test_osr_epsg_geoccs_deprecated(): sr = osr.SpatialReference() with gdaltest.config_option('OSR_USE_NON_DEPRECATED', 'NO'): sr.ImportFromEPSG(4346) assert sr.ExportToWkt().find('ETRS89 (geocentric) (deprecated)') >= 0 ############################################################################### def test_osr_epsg_area_of_use(): srs = osr.SpatialReference() srs.ImportFromEPSG(2154) area = srs.GetAreaOfUse() assert area.west_lon_degree == -9.86 assert area.south_lat_degree == 41.15 assert area.east_lon_degree == 10.38 assert area.north_lat_degree == 51.56 assert area.name == 'France' ############################################################################### def test_osr_GetCRSInfoListFromDatabase(): l = osr.GetCRSInfoListFromDatabase('EPSG') found = False for record in l: if record.auth_name == 'EPSG' and record.code == '2154': assert record.name == 'RGF93 / Lambert-93' assert record.type == osr.OSR_CRS_TYPE_PROJECTED assert not record.deprecated assert record.bbox_valid assert record.west_lon_degree == -9.86 assert record.south_lat_degree == 41.15 assert record.east_lon_degree == 10.38 assert record.north_lat_degree == 51.56 assert record.area_name == 'France' assert record.projection_method == 'Lambert Conic Conformal (2SP)' found = True assert found gdalautotest-3.0.4/osr/osr_pci.py0000755003401500001440000002104213614005315016443 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_pci.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test some PCI specific translation issues. # Author: Andrey Kiselev, dron@ak4719.spb.edu # ############################################################################### # Copyright (c) 2004, Andrey Kiselev # # 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. ############################################################################### import gdaltest from osgeo import osr ############################################################################### # Test the osr.SpatialReference.ImportFromPCI() function. # def test_osr_pci_1(): prj_parms = (0.0, 0.0, 45.0, 54.5, 47.0, 62.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) srs = osr.SpatialReference() srs.ImportFromPCI('EC E015', 'METRE', prj_parms) assert abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_1) - 47.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_2) - 62.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_LATITUDE_OF_CENTER) - 54.5) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_LONGITUDE_OF_CENTER) - 45.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) - 0.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_FALSE_NORTHING) - 0.0) <= 0.0000005, \ 'Can not import Equidistant Conic projection.' expected = 'PROJCS["unnamed",GEOGCS["Unknown - PCI E015",DATUM["Unknown - PCI E015",SPHEROID["Krassowsky 1940",6378245,298.3,AUTHORITY["EPSG","7024"]]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Equidistant_Conic"],PARAMETER["standard_parallel_1",47],PARAMETER["standard_parallel_2",62],PARAMETER["latitude_of_center",54.5],PARAMETER["longitude_of_center",45],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) pci_parms = srs.ExportToPCI() assert pci_parms[0] == 'EC E015' and pci_parms[1] == 'METRE' and pci_parms[2] == prj_parms, \ 'ExportToPCI result wrong.' ############################################################################### # Test the osr.SpatialReference.ExportToPCI() function. # def test_osr_pci_2(): srs = osr.SpatialReference() srs.ImportFromWkt("""PROJCS["unnamed",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["Lambert_Conformal_Conic_2SP"],\ PARAMETER["standard_parallel_1",33.90363402777778],\ PARAMETER["standard_parallel_2",33.62529002777778],\ PARAMETER["latitude_of_origin",33.76446202777777],\ PARAMETER["central_meridian",-117.4745428888889],\ PARAMETER["false_easting",0],PARAMETER["false_northing",0],\ UNIT["metre",1,AUTHORITY["EPSG","9001"]]]""") (proj, units, parms) = srs.ExportToPCI() assert proj == 'LCC D-01' and units == 'METRE' and abs(parms[2] - -117.4745429) <= 0.0000005 and abs(parms[3] - 33.76446203) <= 0.0000005 and abs(parms[4] - 33.90363403) <= 0.0000005 and abs(parms[5] - 33.62529003) <= 0.0000005, \ 'Can not import Lambert Conformal Conic projection.' ############################################################################### # Test MGRS interpretation. (#3379) # def test_osr_pci_3(): srs = osr.SpatialReference() srs.ImportFromPCI( 'UTM 13 D000', 'METRE', (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)) wkt = srs.ExportToWkt() if wkt.find('PARAMETER["false_northing",0]') == -1: gdaltest.post_reason('did not default to northern hemisphere!') print(wkt) return 'fail' srs = osr.SpatialReference() srs.ImportFromPCI( 'UTM 13 G D000', 'METRE', (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)) wkt = srs.ExportToWkt() if wkt.find('PARAMETER["false_northing",10000000]') == -1: gdaltest.post_reason('did get northern hemisphere!') print(wkt) return 'fail' srs = osr.SpatialReference() srs.ImportFromPCI( 'UTM 13 X D000', 'METRE', (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)) wkt = srs.ExportToWkt() if wkt.find('PARAMETER["false_northing",0]') == -1: gdaltest.post_reason('did get southern hemisphere!') print(wkt) return 'fail' ############################################################################### # Test Datum lookup in pci_datum.txt # def test_osr_pci_4(): prj_parms = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) srs = osr.SpatialReference() srs.ImportFromPCI('LONG/LAT D506', 'DEGREE', prj_parms) expected = 'GEOGCS["Rijksdriehoeks Datum",DATUM["Rijksdriehoeks Datum",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],TOWGS84[565.04,49.91,465.84,0.4094,-0.3597,1.8685,4.077200000063286]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) pci_parms = srs.ExportToPCI() assert pci_parms[0] == 'LONG/LAT D506' and pci_parms[1] == 'DEGREE' and pci_parms[2] == prj_parms, \ 'ExportToPCI result wrong.' ############################################################################### # Test Datum ellisoid lookup in pci_ellpis.txt # def test_osr_pci_5(): prj_parms = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) srs = osr.SpatialReference() srs.ImportFromPCI('LONG/LAT E224', 'DEGREE', prj_parms) expected = 'GEOGCS["Unknown - PCI E224",DATUM["Unknown - PCI E224",SPHEROID["Xian 1980",6378140,298.2569978029123]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) pci_parms = srs.ExportToPCI() assert pci_parms[0] == 'LONG/LAT E224' and pci_parms[1] == 'DEGREE' and pci_parms[2] == prj_parms, \ 'ExportToPCI result wrong.' ############################################################################### # Test Datum lookup in pci_datum.txt # def test_osr_pci_6(): prj_parms = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) srs = osr.SpatialReference() srs.ImportFromPCI('LONG/LAT D030', 'DEGREE', prj_parms) expected = 'GEOGCS["AGD84",DATUM["Australian_Geodetic_Datum_1984",SPHEROID["Australian National Spheroid",6378160,298.25,AUTHORITY["EPSG","7003"]],TOWGS84[-117.763,-51.51,139.061,0.292,0.443,0.277,-0.191],AUTHORITY["EPSG","6203"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4203"]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) pci_parms = srs.ExportToPCI() assert pci_parms[0] == 'LONG/LAT D030' and pci_parms[1] == 'DEGREE' and pci_parms[2] == prj_parms, \ 'ExportToPCI result wrong.' ############################################################################### # Make sure we can translate a datum with only the TOWGS84 parameters to # to identify it. # def test_osr_pci_7(): srs = osr.SpatialReference() srs.SetFromUserInput('GEOGCS["My GCS",DATUM["My Datum",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],TOWGS84[565.04,49.91,465.84,0.4094,-0.3597,1.8685,4.077200000063286]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]') prj_parms = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) pci_parms = srs.ExportToPCI() assert pci_parms[0] == 'LONG/LAT D506' and pci_parms[1] == 'DEGREE' and pci_parms[2] == prj_parms, \ 'ExportToPCI result wrong.' gdalautotest-3.0.4/osr/osr_ct.py0000755003401500001440000003541513614005315016307 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_ct.py a84c4ea25b201702c1065405b13656176b5b501e 2019-11-28 20:16:03 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test coordinate transformations. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2013, Even Rouault # Copyright (c) 2014, Google # # 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 from osgeo import gdal from osgeo import osr from osgeo import ogr import pytest ############################################################################### # Verify that we have PROJ.4 available. def test_osr_ct_1(): utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') try: gdal.PushErrorHandler('CPLQuietErrorHandler') ct = osr.CoordinateTransformation(ll_srs, utm_srs) gdal.PopErrorHandler() if gdal.GetLastErrorMsg().find('Unable to load PROJ.4') != -1: pytest.skip('PROJ.4 missing, transforms not available.') except ValueError: gdal.PopErrorHandler() if gdal.GetLastErrorMsg().find('Unable to load PROJ.4') != -1: pytest.skip('PROJ.4 missing, transforms not available.') pytest.fail(gdal.GetLastErrorMsg()) assert not (ct is None or ct.this is None), \ 'Unable to create simple CoordinateTransformat.' ############################################################################### # Actually perform a simple LL to UTM conversion. def test_osr_ct_2(): utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ct = osr.CoordinateTransformation(ll_srs, utm_srs) result = ct.TransformPoint(32.0, -117.5, 0.0) assert abs(result[0] - 452772.06) <= 0.01 and abs(result[1] - 3540544.89) <= 0.01 and abs(result[2] - 0.0) <= 0.01, \ 'Wrong LL to UTM result' ############################################################################### # Transform an OGR geometry ... this is mostly aimed at ensuring that # the OGRCoordinateTransformation target SRS isn't deleted till the output # geometry which also uses it is deleted. def test_osr_ct_3(): utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ll_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CoordinateTransformation(ll_srs, utm_srs) pnt = ogr.CreateGeometryFromWkt('POINT(-117.5 32.0)', ll_srs) result = pnt.Transform(ct) assert result == 0 ll_srs = None ct = None utm_srs = None out_srs = pnt.GetSpatialReference().ExportToPrettyWkt() assert out_srs[0:6] == 'PROJCS', 'output srs corrupt, ref counting issue?' pnt = None ############################################################################### # Actually perform a simple LL to UTM conversion. # Works for both OG and NG bindings def test_osr_ct_4(): utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ll_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CoordinateTransformation(ll_srs, utm_srs) result = ct.TransformPoints([(-117.5, 32.0, 0.0), (-117.5, 32.0)]) assert len(result) == 2 assert len(result[0]) == 3 for i in range(2): assert abs(result[i][0] - 452772.06) <= 0.01 and abs(result[i][1] - 3540544.89) <= 0.01 and abs(result[i][2] - 0.0) <= 0.01, \ 'Wrong LL to UTM result' ############################################################################### # Same test, but with any sequence of tuples instead of a tuple of tuple # New in NG bindings (#3020) def test_osr_ct_5(): utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ll_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CoordinateTransformation(ll_srs, utm_srs) result = ct.TransformPoints(((-117.5, 32.0, 0.0), (-117.5, 32.0))) for i in range(2): assert abs(result[i][0] - 452772.06) <= 0.01 and abs(result[i][1] - 3540544.89) <= 0.01 and abs(result[i][2] - 0.0) <= 0.01, \ 'Wrong LL to UTM result' ############################################################################### # Test osr.CreateCoordinateTransformation() method def test_osr_ct_6(): ct = osr.CreateCoordinateTransformation(None, None) assert ct is None utm_srs = osr.SpatialReference() utm_srs.SetUTM(11) utm_srs.SetWellKnownGeogCS('WGS84') ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ll_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CreateCoordinateTransformation(ll_srs, utm_srs) assert ct is not None result = ct.TransformPoints(((-117.5, 32.0, 0.0), (-117.5, 32.0))) for i in range(2): assert abs(result[i][0] - 452772.06) <= 0.01 and abs(result[i][1] - 3540544.89) <= 0.01 and abs(result[i][2] - 0.0) <= 0.01, \ 'Wrong LL to UTM result' ############################################################################### # Actually perform a simple Pseudo Mercator to LL conversion. def test_osr_ct_7(): pm_srs = osr.SpatialReference() pm_srs.ImportFromEPSG(3857) ll_srs = osr.SpatialReference() ll_srs.SetWellKnownGeogCS('WGS84') ll_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CoordinateTransformation(pm_srs, ll_srs) (x, y, z) = ct.TransformPoint(7000000, 7000000, 0) (exp_x, exp_y, exp_z) = (62.8820698884, 53.0918187696, 0.0) if (abs(exp_x - x) > 0.00001 or abs(exp_y - y) > 0.00001 or abs(exp_z - z) > 0.00001): print('Got: (%f, %f, %f)' % (x, y, z)) print('Expected: (%f, %f, %f)' % (exp_x, exp_y, exp_z)) pytest.fail('Wrong LL for Pseudo Mercator result') pnt = ogr.CreateGeometryFromWkt('POINT(%g %g)' % (7000000, 7000000), pm_srs) expected_pnt = ogr.CreateGeometryFromWkt('POINT(%.10f %.10f)' % (exp_x, exp_y), ll_srs) result = pnt.Transform(ct) assert result == 0 if (abs(expected_pnt.GetX() - pnt.GetX()) > 0.00001 or abs(expected_pnt.GetY() - pnt.GetY()) > 0.00001 or abs(expected_pnt.GetZ() - pnt.GetZ()) > 0.00001): print('Got: %s' % pnt.ExportToWkt()) print('Expected: %s' % expected_pnt.ExportToWkt()) pytest.fail('Failed to transform from Pseudo Mercator to LL') ############################################################################### # Test WebMercator -> WGS84 optimized transform def test_osr_ct_8(): src_srs = osr.SpatialReference() src_srs.ImportFromEPSG(3857) dst_srs = osr.SpatialReference() dst_srs.SetWellKnownGeogCS('WGS84') dst_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CoordinateTransformation(src_srs, dst_srs) pnts = [(0, 6274861.39400658), (1, 6274861.39400658)] result = ct.TransformPoints(pnts) expected_result = [(0.0, 49.000000000000007, 0.0), (8.9831528411952125e-06, 49.000000000000007, 0.0)] for i in range(2): for j in range(3): if abs(result[i][j] - expected_result[i][j]) > 1e-10: print('Got: %s' % str(result)) print('Expected: %s' % str(expected_result)) pytest.fail('Failed to transform from Pseudo Mercator to LL') pnts = [(0, 6274861.39400658), (1 + 0, 1 + 6274861.39400658)] result = ct.TransformPoints(pnts) expected_result = [(0.0, 49.000000000000007, 0.0), (8.9831528411952125e-06, 49.000005893478189, 0.0)] for i in range(2): for j in range(3): if abs(result[i][j] - expected_result[i][j]) > 1e-10: print('Got: %s' % str(result)) print('Expected: %s' % str(expected_result)) pytest.fail('Failed to transform from Pseudo Mercator to LL') ############################################################################### # Test coordinate transformation where only one CRS has a towgs84 clause (#1156) def test_osr_ct_towgs84_only_one_side(): srs_towgs84 = osr.SpatialReference() srs_towgs84.SetFromUserInput("+proj=longlat +ellps=GRS80 +towgs84=100,200,300") srs_just_ellps = osr.SpatialReference() srs_just_ellps.SetFromUserInput('+proj=longlat +ellps=GRS80') ct = osr.CoordinateTransformation(srs_towgs84, srs_just_ellps) (x, y, z) = ct.TransformPoint(0, 0, 0) assert x == 0 assert y == 0 assert z == 0 ct = osr.CoordinateTransformation(srs_just_ellps, srs_towgs84) (x, y, z) = ct.TransformPoint(0, 0, 0) assert x == 0 assert y == 0 assert z == 0 ############################################################################### # Test coordinate transformation where both side have towgs84/datum clause (#1156) def test_osr_ct_towgs84_both_side(): srs_towgs84 = osr.SpatialReference() srs_towgs84.SetFromUserInput("+proj=longlat +ellps=GRS80 +towgs84=100,200,300") srs_other_towgs84 = osr.SpatialReference() srs_other_towgs84.SetFromUserInput("+proj=longlat +ellps=GRS80 +towgs84=0,0,0") ct = osr.CoordinateTransformation(srs_towgs84, srs_other_towgs84) (x, y, z) = ct.TransformPoint(0, 0, 20) assert x != 0 assert y != 0 assert z == 20 srs_datum_wgs84 = osr.SpatialReference() srs_datum_wgs84.SetFromUserInput("+proj=longlat +datum=WGS84") ct = osr.CoordinateTransformation(srs_towgs84, srs_datum_wgs84) (x, y, z) = ct.TransformPoint(0, 0, 20) assert x != 0 assert y != 0 assert z == 20 ct = osr.CoordinateTransformation(srs_datum_wgs84, srs_towgs84) (x, y, z) = ct.TransformPoint(0, 0, 20) assert x != 0 assert y != 0 assert z == 20 ############################################################################### # Test coordinate transformation with custom operation def test_osr_ct_options_operation(): options = osr.CoordinateTransformationOptions() assert options.SetOperation('+proj=affine +s11=-1') ct = osr.CoordinateTransformation(None, None, options) assert ct x, y, z = ct.TransformPoint(1, 2, 3) assert x == -1 assert y == 2 assert z == 3 ############################################################################### # Test coordinate transformation with area of interest def test_osr_ct_options_area_of_interest(): srs_nad27 = osr.SpatialReference() srs_nad27.SetFromUserInput("NAD27") srs_wgs84 = osr.SpatialReference() srs_wgs84.SetFromUserInput("WGS84") options = osr.CoordinateTransformationOptions() assert not options.SetAreaOfInterest(-200,40,-99,41) assert not options.SetAreaOfInterest(-100,-100,-99,41) assert not options.SetAreaOfInterest(-100,40,200,41) assert not options.SetAreaOfInterest(-100,40,-99,100) assert options.SetAreaOfInterest(-100,40,-99,41) ct = osr.CoordinateTransformation(srs_nad27, srs_wgs84, options) assert ct x, y, z = ct.TransformPoint(40.5,-99.5,0) assert x != 40.5 assert abs(x - 40.5) < 1e-3 x, y, z = ct.TransformPoint(0,0,0) if sys.platform == 'darwin': print("ct.TransformPoint(0,0,0) doesn't return expected result on MacOSX. Not sure why.") else: assert x == float('inf') ############################################################################### # Test 4D transformations def test_osr_ct_4D(): options = osr.CoordinateTransformationOptions() assert options.SetOperation('+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=cart +step +proj=helmert +convention=position_vector +x=0.0127 +dx=-0.0029 +rx=-0.00039 +drx=-0.00011 +y=0.0065 +dy=-0.0002 +ry=0.00080 +dry=-0.00019 +z=-0.0209 +dz=-0.0006 +rz=-0.00114 +drz=0.00007 +s=0.00195 +ds=0.00001 +t_epoch=1988.0 +step +proj=cart +inv +step +proj=unitconvert +xy_in=rad +xy_out=deg') ct = osr.CoordinateTransformation(None, None, options) assert ct x, y, z, t = ct.TransformPoint(2, 49, 0, 2000) assert abs(x - 2.0000005420366) < 1e-10, x assert abs(y - 49.0000003766711) < 1e-10, y assert abs(z - -0.0222802283242345) < 1e-8, z assert abs(t - 2000) < 1e-10, t ret = ct.TransformPoints([[2, 49, 0, 2000], [2, 49, 0, 1988]]) assert len(ret) == 2, ret assert len(ret[0]) == 4, ret x, y, z, t = ret[0] assert abs(x - 2.0000005420366) < 1e-10, x assert abs(y - 49.0000003766711) < 1e-10, y assert abs(z - -0.0222802283242345) < 1e-8, z assert abs(t - 2000) < 1e-10, t assert len(ret[1]) == 4, ret x, y, z, t = ret[1] assert abs(x - 1.9999998809056305) < 1e-10, x assert abs(y - 48.9999995630005) < 1e-10, y assert abs(z - 0.005032399669289589) < 1e-8, z assert abs(t - 1988) < 1e-10, t ############################################################################### # Test geocentric transformations def test_osr_ct_geocentric(): s = osr.SpatialReference() s.SetFromUserInput("IGNF:RGR92") t = osr.SpatialReference() t.SetFromUserInput("IGNF:REUN47") ct = osr.CoordinateTransformation(s, t) assert ct x, y, z = ct.TransformPoint(3356123.5400, 1303218.3090, 5247430.6050) assert abs(x - 3353420.949) < 1e-1 assert abs(y - 1304075.021) < 1e-1 assert abs(z - 5248935.144) < 1e-1 gdalautotest-3.0.4/osr/osr_basic.py0000755003401500001440000016417013614005315016763 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_basic.py bec5fbd4fbf5d69a8386b920f0dd6d951eceb117 2019-11-22 19:46:52 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Basic tests of OGRSpatialReference (OSR) operation, not including # support for actual reprojection or use of EPSG tables. # 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 gdaltest from osgeo import osr import pytest from threading import Thread ############################################################################### # Create a UTM WGS84 coordinate system and check various items. def test_osr_basic_1(): utm_srs = osr.SpatialReference() # Southern hemisphere utm_srs.SetUTM(11, 0) utm_srs.SetWellKnownGeogCS('WGS84') assert utm_srs.GetUTMZone() == -11 # Northern hemisphere utm_srs.SetUTM(11) assert utm_srs.GetUTMZone() == 11 parm_list = \ [(osr.SRS_PP_CENTRAL_MERIDIAN, -117.0), (osr.SRS_PP_LATITUDE_OF_ORIGIN, 0.0), (osr.SRS_PP_SCALE_FACTOR, 0.9996), (osr.SRS_PP_FALSE_EASTING, 500000.0), (osr.SRS_PP_FALSE_NORTHING, 0.0)] for parm in parm_list: value = utm_srs.GetProjParm(parm[0], -1111) assert abs(value - parm[1]) <= .00000000000010, ('got %g for %s instead of %g.' % (value, parm[0], parm[1])) auth_list = [('GEOGCS', '4326'), ('DATUM', '6326')] for auth in auth_list: assert utm_srs.GetAuthorityName(auth[0]) == 'EPSG', \ ('Got authority %s instead of EPSG for %s' % (utm_srs.GetAuthorityName(auth[0]), auth[0])) assert str(utm_srs.GetAuthorityCode(auth[0])) == auth[1], \ ('Got code %s instead of %s for %s' % (utm_srs.GetAuthorityName(auth[0]), auth[1], auth[0])) ############################################################################### # Simple default NAD83 State Plane zone. def test_osr_basic_2(): srs = osr.SpatialReference() srs.SetStatePlane(403, 1) # California III NAD83. parm_list = \ [(osr.SRS_PP_STANDARD_PARALLEL_1, 38.43333333333333), (osr.SRS_PP_STANDARD_PARALLEL_2, 37.06666666666667), (osr.SRS_PP_LATITUDE_OF_ORIGIN, 36.5), (osr.SRS_PP_CENTRAL_MERIDIAN, -120.5), (osr.SRS_PP_FALSE_EASTING, 2000000.0), (osr.SRS_PP_FALSE_NORTHING, 500000.0)] for parm in parm_list: value = srs.GetProjParm(parm[0], -1111) assert gdaltest.approx_equal(parm[1], value), \ ('got %.16g for %s instead of %.16g.' % (value, parm[0], parm[1])) auth_list = [('GEOGCS', '4269'), ('DATUM', '6269'), ('PROJCS', '26943'), ('PROJCS|UNIT', '9001')] for auth in auth_list: assert srs.GetAuthorityName(auth[0]) == 'EPSG', \ ('Got authority %s instead of EPSG for %s' % (srs.GetAuthorityName(auth[0]), auth[0])) assert str(srs.GetAuthorityCode(auth[0])) == auth[1], \ ('Got code %s instead of %s for %s' % (srs.GetAuthorityCode(auth[0]), auth[1], auth[0])) ############################################################################### # NAD83 State Plane zone, but overridden to be in Feet. def test_osr_basic_3(): srs = osr.SpatialReference() # California III NAD83 (feet) srs.SetStatePlane(403, 1, 'Foot', 0.3048006096012192) # print srs.ExportToPrettyWkt() parm_list = \ [(osr.SRS_PP_STANDARD_PARALLEL_1, 38.43333333333333), (osr.SRS_PP_STANDARD_PARALLEL_2, 37.06666666666667), (osr.SRS_PP_LATITUDE_OF_ORIGIN, 36.5), (osr.SRS_PP_CENTRAL_MERIDIAN, -120.5), (osr.SRS_PP_FALSE_EASTING, 6561666.666666667), (osr.SRS_PP_FALSE_NORTHING, 1640416.666666667)] for parm in parm_list: value = srs.GetProjParm(parm[0], -1111) assert gdaltest.approx_equal(parm[1], value), \ ('got %.16g for %s instead of %.16g.' % (value, parm[0], parm[1])) auth_list = [('GEOGCS', '4269'), ('DATUM', '6269')] for auth in auth_list: assert srs.GetAuthorityName(auth[0]) == 'EPSG', \ ('Got authority %s instead of EPSG for %s' % (srs.GetAuthorityName(auth[0]), auth[0])) assert str(srs.GetAuthorityCode(auth[0])) == auth[1], \ ('Got code %s instead of %s for %s' % (srs.GetAuthorityCode(auth[0]), auth[1], auth[0])) assert srs.GetAuthorityName('PROJCS') is None, \ 'Got a PROJCS Authority but we should not' assert str(srs.GetAuthorityCode('PROJCS|UNIT')) != '9001', \ 'Got METER authority code on linear units.' assert srs.GetLinearUnitsName() == 'Foot', 'Didnt get Foot linear units' assert srs.GetLinearUnits() == pytest.approx(0.3048006096012192, 1e-16) assert srs.GetTargetLinearUnits('PROJCS') == pytest.approx(0.3048006096012192, 1e-16) assert srs.GetTargetLinearUnits(None) == pytest.approx(0.3048006096012192, 1e-16) ############################################################################### # Translate a coordinate system with nad shift into to PROJ.4 and back # and verify that the TOWGS84 parameters are preserved. def test_osr_basic_4(): srs = osr.SpatialReference() srs.SetGS(cm=-117.0, fe=100000.0, fn=100000) srs.SetLinearUnits('meter', 1) srs.SetGeogCS('Test GCS', 'Test Datum', 'WGS84', osr.SRS_WGS84_SEMIMAJOR, osr.SRS_WGS84_INVFLATTENING) srs.SetTOWGS84(1, 2, 3) assert srs.GetTOWGS84() == (1, 2, 3, 0, 0, 0, 0), 'GetTOWGS84() result is wrong.' proj4 = srs.ExportToProj4() srs2 = osr.SpatialReference() srs2.ImportFromProj4(proj4) assert srs2.GetTOWGS84() == (1, 2, 3, 0, 0, 0, 0), \ 'GetTOWGS84() result is wrong after PROJ.4 conversion.' ############################################################################### # Test URN support for OGC:CRS84. def test_osr_basic_5(): wkt_1 = osr.GetUserInputAsWKT('urn:ogc:def:crs:OGC:1.3:CRS84') wkt_2 = osr.GetUserInputAsWKT('WGS84') assert wkt_1 == '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["Longitude",EAST],AXIS["Latitude",NORTH]]' assert wkt_2 == '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"]]' ############################################################################### # Test URN support for EPSG def test_osr_basic_6(): # Without version wkt_1 = osr.GetUserInputAsWKT('urn:x-ogc:def:crs:EPSG::4326') assert not (wkt_1.find('GEOGCS["WGS 84",DATUM["WGS_1984"') == -1 or wkt_1.find('AXIS["Latitude",NORTH],AXIS["Longitude",EAST]') == -1), \ 'EPSG:4326 urn lookup not as expected.' # With a version wkt_2 = osr.GetUserInputAsWKT('urn:x-ogc:def:crs:EPSG:6.6:4326') if wkt_2.find('GEOGCS["WGS 84",DATUM["WGS_1984"') == -1 or wkt_2.find('AXIS["Latitude",NORTH],AXIS["Longitude",EAST]') == -1: print(wkt_1) pytest.fail('EPSG:4326 urn lookup not as expected.') # Without version, but with no repeated :. Probably illegal from my understanding # of http://www.opengeospatial.org/ogcUrnPolicy, but found quite often in the wild # especially in content returned by GeoServer wkt_2 = osr.GetUserInputAsWKT('urn:x-ogc:def:crs:EPSG:4326') if wkt_2.find('GEOGCS["WGS 84",DATUM["WGS_1984"') == -1 or wkt_2.find('AXIS["Latitude",NORTH],AXIS["Longitude",EAST]') == -1: print(wkt_1) pytest.fail('EPSG:4326 urn lookup not as expected.') ############################################################################### # Test URN support for auto projection. def test_osr_basic_7(): wkt = osr.GetUserInputAsWKT('urn:ogc:def:crs:OGC::AUTO42001:-117:33') assert wkt.find('GEOGCS["WGS 84"') > 0 and wkt.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],UNIT["Meter",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]') > 0, 'AUTO42001 urn lookup not as expected.' ############################################################################### # Test the SetLinearUnitsAndUpdateParameters() method. def test_osr_basic_8(): srs = osr.SpatialReference() srs.SetFromUserInput('+proj=tmerc +x_0=1000 +datum=WGS84 +units=m') srs.SetLinearUnits('Foot', 0.3048) fe = srs.GetProjParm('false_easting') assert fe == 1000.0, 'false easting was unexpectedly updated.' srs.SetFromUserInput('+proj=tmerc +x_0=1000 +datum=WGS84 +units=m') srs.SetLinearUnitsAndUpdateParameters('Foot', 0.3048) fe = srs.GetProjParm('false_easting') assert fe != 1000.0, 'false easting was unexpectedly not updated.' assert abs(fe - 3280.840) <= 0.01, 'wrong updated false easting value.' ############################################################################### # Test the Validate() method. def test_osr_basic_9(): srs = osr.SpatialReference() srs.SetFromUserInput("PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6378137,0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Mercator_2SP\"],PARAMETER[\"standard_parallel_1\",0],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],EXTENSION[\"PROJ4\",\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs\"]]") assert srs.Validate() == 0 ############################################################################### # Test the Validate() method on PROJCS with AXIS definition (#2739) def test_osr_basic_10(): srs = osr.SpatialReference() srs.SetFromUserInput("""PROJCS["NAD83(CSRS98) / UTM zone 20N (deprecated)", GEOGCS["NAD83(CSRS98)", DATUM["NAD83_Canadian_Spatial_Reference_System", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6140"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4140"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-63], 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","2038"]]""") assert srs.Validate() == 0 ############################################################################### # Test the IsSame() method (and the IsSameGeogCS() method through that) def test_osr_basic_11(): srs1 = osr.SpatialReference() srs1.SetFromUserInput("""PROJCS["NAD83(CSRS98) / UTM zone 20N (deprecated)", GEOGCS["NAD83(CSRS98)", DATUM["NAD83_Canadian_Spatial_Reference_System", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6140"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4140"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-63], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","2038"], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") srs2 = osr.SpatialReference() srs2.SetFromUserInput("""PROJCS["NAD83(CSRS98) / UTM zone 20N (deprecated)", GEOGCS["NAD83(CSRS98)", DATUM["NAD83_Canadian_Spatial_Reference_System", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6140"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9108"]], AUTHORITY["EPSG","4140"]], PROJECTION["Transverse_Mercator"], PARAMETER["central_meridian",-63], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","2038"], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") assert srs1.IsSame(srs2) ############################################################################### # Test URN support for OGC:CRS84. def test_osr_basic_12(): wkt_1 = osr.GetUserInputAsWKT('CRS:84') wkt_2 = osr.GetUserInputAsWKT('WGS84') assert wkt_1 == '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["Longitude",EAST],AXIS["Latitude",NORTH]]' assert wkt_2 == '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"]]' ############################################################################### # Test GEOCCS lookup in supporting data files. def test_osr_basic_13(): srs = osr.SpatialReference() with gdaltest.config_option('OSR_USE_NON_DEPRECATED', 'NO'): srs.ImportFromEPSG(4328) expected_wkt = 'GEOCCS["WGS 84 (geocentric) (deprecated)",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Geocentric X",OTHER],AXIS["Geocentric Y",OTHER],AXIS["Geocentric Z",NORTH],AUTHORITY["EPSG","4328"]]' wkt = srs.ExportToWkt() assert wkt == expected_wkt, 'did not get expected GEOCCS WKT.' assert srs.IsGeocentric(), 'srs not recognised as geocentric.' assert srs.Validate() == 0, 'epsg geoccs import does not validate!' ############################################################################### # Manually setup a simple geocentric/wgs84 srs. def test_osr_basic_14(): srs = osr.SpatialReference() srs.SetGeocCS('My Geocentric') srs.SetWellKnownGeogCS('WGS84') srs.SetLinearUnits('meter', 1.0) expected_wkt = 'GEOCCS["My Geocentric",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["meter",1],AXIS["Geocentric X",OTHER],AXIS["Geocentric Y",OTHER],AXIS["Geocentric Z",NORTH]]' wkt = srs.ExportToWkt() assert wkt == expected_wkt, 'did not get expected GEOCCS WKT.' assert srs.IsGeocentric(), 'srs not recognised as geocentric.' assert srs.Validate() == 0, 'geocentric srs not recognised as valid.' ############################################################################### # Test validation and fixup methods. def test_osr_basic_15(): wkt = """GEOCCS["WGS 84 (geocentric)", PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], UNIT["metre",1], AXIS["Geocentric X",OTHER], AXIS["Geocentric Y",OTHER], AXIS["Geocentric Z",OTHER], AUTHORITY["EPSG","4328"]]""" srs = osr.SpatialReference() srs.SetFromUserInput(wkt) # Missing PRIMEM assert srs.Validate() != 0 ############################################################################### # Test OSRSetGeocCS() def test_osr_basic_16(): # Nominal test : change citation of a GEOCCS srs = osr.SpatialReference() srs.SetFromUserInput("""GEOCCS["WGS 84 (geocentric)", PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], UNIT["metre",1], AXIS["Geocentric X",OTHER], AXIS["Geocentric Y",OTHER], AXIS["Geocentric Z",OTHER], AUTHORITY["EPSG","4328"]]""") srs.SetGeocCS("a") expect_wkt = """GEOCCS["a", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["metre",1], AXIS["Geocentric X",OTHER], AXIS["Geocentric Y",OTHER], AXIS["Geocentric Z",NORTH], AUTHORITY["EPSG","4328"]]""" wkt = srs.ExportToPrettyWkt() if wkt != expect_wkt: print('Got:%s' % wkt) print('Expected:%s' % expect_wkt) pytest.fail('Did not get expected result.') # Build GEOCCS from a valid GEOGCS srs = osr.SpatialReference() srs.ImportFromEPSG(4326) srs.SetGeocCS("a") expect_wkt = """GEOCCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Geocentric X",OTHER], AXIS["Geocentric Y",OTHER], AXIS["Geocentric Z",NORTH]]""" wkt = srs.ExportToPrettyWkt() if wkt != expect_wkt: print('Got:%s' % wkt) print('Expected:%s' % expect_wkt) pytest.fail('Did not get expected result.') # Error expected. Cannot work on a PROJCS srs = osr.SpatialReference() srs.ImportFromEPSG(32631) ret = srs.SetGeocCS("a") if ret == 0: print(srs) pytest.fail('expected failure') # Limit test : build GEOCCS from an invalid GEOGCS srs = osr.SpatialReference() with gdaltest.error_handler(): assert srs.SetFromUserInput("""GEOGCS["foo"]""") != 0 ############################################################################### # Test OGC URL support def test_osr_basic_17(): wkt_1 = osr.GetUserInputAsWKT('urn:ogc:def:crs:EPSG::4326') wkt_2 = osr.GetUserInputAsWKT('http://www.opengis.net/def/crs/EPSG/0/4326') assert wkt_1 == wkt_2, 'CRS URL parsing not as expected.' ############################################################################### # Test OGC URL support for compound CRS def test_osr_basic_18(): # This is a dummy one, but who cares wkt = osr.GetUserInputAsWKT('http://www.opengis.net/def/crs-compound?1=http://www.opengis.net/def/crs/EPSG/0/4326&2=http://www.opengis.net/def/crs/EPSG/0/4326') assert wkt.startswith('COMPD_CS'), 'CRS URL parsing not as expected.' ############################################################################### # Test well known GCS names against their corresponding EPSG definitions (#6080) def test_osr_basic_19(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') sr_ref = osr.SpatialReference() sr_ref.ImportFromEPSG(4326) assert sr.ExportToWkt() == sr_ref.ExportToWkt() sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS72') sr_ref = osr.SpatialReference() sr_ref.ImportFromEPSG(4322) assert sr.ExportToWkt() == sr_ref.ExportToWkt() sr = osr.SpatialReference() sr.SetWellKnownGeogCS('NAD27') sr_ref = osr.SpatialReference() sr_ref.ImportFromEPSG(4267) assert sr.ExportToWkt() == sr_ref.ExportToWkt() sr = osr.SpatialReference() sr.SetWellKnownGeogCS('NAD83') sr_ref = osr.SpatialReference() sr_ref.ImportFromEPSG(4269) assert sr.ExportToWkt() == sr_ref.ExportToWkt() ############################################################################### # Test GetAxisName() and GetAxisOrientation() and GetAngularUnitsName() def test_osr_basic_20(): sr = osr.SpatialReference() sr.ImportFromEPSGA(4326) assert sr.GetAxisName(None, 0) == 'Geodetic latitude' assert sr.GetAxisOrientation(None, 0) == osr.OAO_North assert sr.GetAxisName('GEOGCS', 1) == 'Geodetic longitude' assert sr.GetAxisOrientation('GEOGCS', 1) == osr.OAO_East assert sr.GetAngularUnitsName() == 'degree' sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:4326+5773') assert sr.GetAxisName(None, 0) == 'Geodetic latitude' assert sr.GetAxisOrientation(None, 0) == osr.OAO_North assert sr.GetAxisName(None, 1) == 'Geodetic longitude' assert sr.GetAxisOrientation(None, 1) == osr.OAO_East assert sr.GetAxisName(None, 2) == 'Gravity-related height' assert sr.GetAxisOrientation(None, 2) == osr.OAO_Up ############################################################################### # Test IsSame() with equivalent forms of Mercator_1SP and Mercator_2SP def test_osr_basic_21(): wkt1 = """PROJCS["unnamed", GEOGCS["Segara (Jakarta)", DATUM["Gunung_Segara_Jakarta", SPHEROID["Bessel 1841",6377397.155,299.1528128]], PRIMEM["Jakarta",106.8077194444444], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_2SP"], PARAMETER["central_meridian",110], PARAMETER["false_easting",3900000], PARAMETER["false_northing",900000], PARAMETER["standard_parallel_1",4.45405154589751], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" wkt2 = """PROJCS["unnamed", GEOGCS["Segara (Jakarta)", DATUM["Gunung_Segara_Jakarta", SPHEROID["Bessel 1841",6377397.155,299.1528128]], PRIMEM["Jakarta",106.8077194444444], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",110], PARAMETER["scale_factor",0.997], PARAMETER["false_easting",3900000], PARAMETER["false_northing",900000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" wkt2_not_equivalent = """PROJCS["unnamed", GEOGCS["Segara (Jakarta)", DATUM["Gunung_Segara_Jakarta", SPHEROID["Bessel 1841",6377397.155,299.1528128]], PRIMEM["Jakarta",106.8077194444444], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",110], PARAMETER["scale_factor",0.998], PARAMETER["false_easting",3900000], PARAMETER["false_northing",900000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" sr1 = osr.SpatialReference() sr1.ImportFromWkt(wkt1) sr2 = osr.SpatialReference() sr2.ImportFromWkt(wkt2) assert sr1.IsSame(sr2) != 0 assert sr2.IsSame(sr1) != 0 sr2_not_equivalent = osr.SpatialReference() sr2_not_equivalent.ImportFromWkt(wkt2_not_equivalent) assert sr1.IsSame(sr2_not_equivalent) != 1 ############################################################################### # Test LCC_2SP -> LCC_1SP -> LCC_2SP def test_osr_basic_22(): sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",49], PARAMETER["standard_parallel_2",44], PARAMETER["latitude_of_origin",46.5], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","2154"]]""") sr2 = sr.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP) expected_sr2_wkt = """PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.5194302239868], PARAMETER["central_meridian",3], PARAMETER["scale_factor",0.9990510286374693], PARAMETER["false_easting",700000], PARAMETER["false_northing",6602157.83881033], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr2 = osr.SpatialReference() expected_sr2.ImportFromWkt(expected_sr2_wkt) assert sr2.IsSame(expected_sr2) != 0 # Back to LCC_2SP sr3 = sr2.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) assert sr3.IsSame(sr) != 0 # Particular case of LCC_2SP with phi0=phi1=phi2 sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.5], PARAMETER["standard_parallel_2",46.5], PARAMETER["latitude_of_origin",46.5], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP) expected_sr2_wkt = """PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.5], PARAMETER["central_meridian",3], PARAMETER["scale_factor",1], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr2 = osr.SpatialReference() expected_sr2.ImportFromWkt(expected_sr2_wkt) assert sr2.IsSame(expected_sr2) != 0 sr3 = sr2.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) assert sr3.IsSame(sr) != 0 # Particular case of LCC_2SP with phi0 != phi1 and phi1=phi2 sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.4567], PARAMETER["standard_parallel_2",46.4567], PARAMETER["latitude_of_origin",46.123], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP) expected_sr2_wkt = """PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.4567], PARAMETER["central_meridian",3], PARAMETER["scale_factor",1], PARAMETER["false_easting",700000], PARAMETER["false_northing",6637093.292952879], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr2 = osr.SpatialReference() expected_sr2.ImportFromWkt(expected_sr2_wkt) assert sr2.IsSame(expected_sr2) != 0 sr3 = sr2.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) expected_sr3_wkt = """PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6171"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4171"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.4567], PARAMETER["standard_parallel_2",46.4567], PARAMETER["latitude_of_origin",46.4567], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6637093.292952879], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr3 = osr.SpatialReference() expected_sr3.ImportFromWkt(expected_sr3_wkt) assert sr3.IsSame(expected_sr3) != 0 ############################################################################### # Test LCC_1SP -> LCC_2SP -> LCC_1SP def test_osr_basic_23(): sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.33722917, AUTHORITY["EPSG","8903"]], UNIT["grad",0.01570796326794897, AUTHORITY["EPSG","9105"]], AUTHORITY["EPSG","4807"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.85], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","27584"]]""") sr2 = sr.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP) expected_sr2_wkt = """PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.33722917, AUTHORITY["EPSG","8903"]], UNIT["grad",0.01570796326794897, AUTHORITY["EPSG","9105"]], AUTHORITY["EPSG","4807"]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",47.51962607709162], PARAMETER["standard_parallel_2",46.17820871246364], PARAMETER["latitude_of_origin",46.85], PARAMETER["central_meridian",0], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr2 = osr.SpatialReference() expected_sr2.ImportFromWkt(expected_sr2_wkt) assert sr2.IsSame(expected_sr2) != 0 # Back to LCC_2SP sr3 = sr2.ConvertToOtherProjection(osr.SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP) assert sr3.IsSame(sr) != 0 ############################################################################### # Test Mercator_1SP -> Mercator_2SP -> Mercator_1SP def test_osr_basic_24(): sr = osr.SpatialReference() sr.SetFromUserInput("""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["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection(osr.SRS_PT_MERCATOR_2SP) expected_sr2_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["Mercator_2SP"], PARAMETER["standard_parallel_1",60.08325228676391], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" expected_sr2 = osr.SpatialReference() expected_sr2.ImportFromWkt(expected_sr2_wkt) assert sr2.IsSame(expected_sr2) != 0 # Back to LCC_2SP sr3 = sr2.ConvertToOtherProjection(osr.SRS_PT_MERCATOR_1SP) assert sr3.IsSame(sr) != 0 ############################################################################### # Test corner cases of ConvertToOtherProjection() def test_osr_basic_25(): sr = osr.SpatialReference() sr.SetFromUserInput("""GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]]""") sr2 = sr.ConvertToOtherProjection('Mercator_1SP') assert sr2 is None sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection(None) assert sr2 is None sr2 = sr.ConvertToOtherProjection('foo') assert sr2 is None sr2 = sr.ConvertToOtherProjection('Mercator_1SP') assert sr2.IsSame(sr) != 0 # Mercator_1SP -> Mercator_2SP: Negative scale factor sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",-0.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Mercator_2SP') assert sr2 is None # Mercator_1SP -> Mercator_2SP: Invalid eccentricity sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,0.1]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.5], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Mercator_2SP') assert sr2 is None # Mercator_2SP -> Mercator_1SP: Invalid standard_parallel_1 sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_2SP"], PARAMETER["standard_parallel_1",100], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Mercator_1SP') assert sr2 is None # Mercator_2SP -> Mercator_1SP: Invalid eccentricity sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,0.1]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Mercator_2SP"], PARAMETER["standard_parallel_1",60], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Mercator_1SP') assert sr2 is None # LCC_1SP -> LCC_2SP: Negative scale factor sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269]], PRIMEM["Paris",2.33722917], UNIT["grad",0.01570796326794897]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.85], PARAMETER["central_meridian",0], PARAMETER["scale_factor",-0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_2SP') assert sr2 is None # LCC_1SP -> LCC_2SP: Invalid eccentricity sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,0.1]], PRIMEM["Paris",2.33722917], UNIT["grad",0.01570796326794897]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.85], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_2SP') assert sr2 is None # LCC_1SP -> LCC_2SP: Invalid latitude_of_origin sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269]], PRIMEM["Paris",2.33722917], UNIT["grad",0.01570796326794897]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",200], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_2SP') assert sr2 is None # LCC_1SP -> LCC_2SP: latitude_of_origin == 0 sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269]], PRIMEM["Paris",2.33722917], UNIT["grad",0.01570796326794897]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_2SP') assert sr2 is None # LCC_2SP -> LCC_1SP : Invalid standard_parallel_1 sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",246.4567], PARAMETER["standard_parallel_2",46.4567], PARAMETER["latitude_of_origin",46.123], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None # LCC_2SP -> LCC_1SP : Invalid standard_parallel_2 sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.4567], PARAMETER["standard_parallel_2",246.4567], PARAMETER["latitude_of_origin",46.123], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None # LCC_2SP -> LCC_1SP : Invalid latitude_of_origin sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.4567], PARAMETER["standard_parallel_2",46.4567], PARAMETER["latitude_of_origin",246.123], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None # LCC_2SP -> LCC_1SP : abs(stdp1) == abs(stdp2) sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",1], PARAMETER["standard_parallel_2",-1], PARAMETER["latitude_of_origin",10], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None # LCC_2SP -> LCC_1SP : stdp1 ~= stdp2 ~= 0 sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,298.257222101]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",.0000000000000001], PARAMETER["standard_parallel_2",.0000000000000002], PARAMETER["latitude_of_origin",10], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None # LCC_2SP -> LCC_1SP : Invalid eccentricity sr.SetFromUserInput("""PROJCS["unnamed", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 1980",6378137,0.1]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["standard_parallel_1",46.4567], PARAMETER["standard_parallel_2",46.4567], PARAMETER["latitude_of_origin",46.123], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["metre",1], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""") sr2 = sr.ConvertToOtherProjection('Lambert_Conformal_Conic_1SP') assert sr2 is None ############################################################################### # Test corner cases of osr.SetGeocCS() def test_osr_basic_setgeogcs(): sr = osr.SpatialReference() sr.SetGeogCS(None, None, None, 0, 0, None, 0, None, 0) assert sr.ExportToWkt() == 'GEOGCS["unnamed",DATUM["unnamed",SPHEROID["unnamed",0,0]],PRIMEM["Reference meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' sr.SetGeogCS('a', 'b', 'c', 1, 2, 'd', 3, 'e', 4) assert sr.ExportToWkt() == 'GEOGCS["a",DATUM["b",SPHEROID["c",1,2]],PRIMEM["d",3],UNIT["e",4],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' sr.SetUTM(31) sr.SetGeogCS(None, None, None, 0, 0, None, 0, None, 0) assert sr.ExportToWkt() == 'PROJCS["unnamed",GEOGCS["unnamed",DATUM["unnamed",SPHEROID["unnamed",0,0]],PRIMEM["Reference meridian",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]]' ############################################################################### # Test other authorities than EPSG, e.g. IGNF:XXXX # def test_osr_basic_set_from_user_input_IGNF(): srs = osr.SpatialReference() assert srs.SetFromUserInput("IGNF:LAMB93") == 0 assert srs.GetAuthorityName(None) == 'IGNF' and srs.GetAuthorityCode(None) == 'LAMB93' def test_osr_basic_set_from_user_input_IGNF_non_existing_code(): srs = osr.SpatialReference() assert srs.SetFromUserInput("IGNF:non_existing_code") != 0 def test_osr_basic_set_from_user_input_non_existing_authority(): srs = osr.SpatialReference() assert srs.SetFromUserInput("non_existing_auth:1234") != 0 def test_osr_basic_set_from_user_input_GEODCRS(): srs = osr.SpatialReference() assert srs.SetFromUserInput("""GEODCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], AREA["World"], BBOX[-90,-180,90,180], ID["EPSG",4326]]""") == 0 assert srs.Validate() == 0 def test_osr_basic_set_from_user_input_GEOGCRS(): srs = osr.SpatialReference() assert srs.SetFromUserInput("""GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]], ID["EPSG",4326]]""") == 0 assert srs.Validate() == 0 def test_osr_basic_set_from_user_input_PROJCRS(): srs = osr.SpatialReference() assert srs.SetFromUserInput("""PROJCRS["WGS 84 / UTM zone 31N", BASEGEODCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]]], CONVERSION["UTM zone 31N", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",3, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], AREA["World - N hemisphere - 0°E to 6°E - by country"], BBOX[0,0,84,6], ID["EPSG",32631]]""") == 0 assert srs.Validate() == 0 def test_osr_basic_set_from_user_input_COMPOUNDCRS(): srs = osr.SpatialReference() assert srs.SetFromUserInput("""COMPOUNDCRS["KKJ / Finland Uniform Coordinate System + N60 height", PROJCRS["KKJ / Finland Uniform Coordinate System", BASEGEODCRS["KKJ", DATUM["Kartastokoordinaattijarjestelma (1966)", ELLIPSOID["International 1924",6378388,297, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]]], CONVERSION["Finland Uniform Coordinate System", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",27, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",1, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",3500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["northing (X)",north, ORDER[1], LENGTHUNIT["metre",1]], AXIS["easting (Y)",east, ORDER[2], LENGTHUNIT["metre",1]]], VERTCRS["N60 height", VDATUM["Helsinki 1960"], CS[vertical,1], AXIS["gravity-related height (H)",up, LENGTHUNIT["metre",1]]], AREA["Finland - onshore"], BBOX[59.75,19.24,70.09,31.59], ID["EPSG",3901]]""") == 0 assert srs.Validate() == 0 def test_osr_basic_export_to_sfsql(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') assert sr.ExportToWkt(['FORMAT=SFSQL']) == 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]' def test_osr_basic_export_to_wkt1_esri(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') assert sr.ExportToWkt(['FORMAT=WKT1_ESRI']) == 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]' def test_osr_basic_export_to_wkt1_gdal(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') assert sr.ExportToWkt(['FORMAT=WKT1_GDAL']) == '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"]]' def test_osr_basic_export_to_wkt2_2015(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') assert sr.ExportToWkt(['FORMAT=WKT2_2015']) == 'GEODCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]]' def test_osr_basic_export_to_wkt2_2018(): sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') assert sr.ExportToWkt(['FORMAT=WKT2_2018']) == 'GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]]' def test_osr_get_name(): sr = osr.SpatialReference() assert sr.GetName() is None sr.SetWellKnownGeogCS('WGS84') assert sr.GetName() == 'WGS 84' def test_SetPROJSearchPath(): # OSRSetPROJSearchPaths() is only taken into priority over other methods # starting with PROJ >= 6.1 if not(osr.GetPROJVersionMajor() > 6 or osr.GetPROJVersionMinor() >= 1): pytest.skip() # Do the test in a new thread, so that SetPROJSearchPath() is taken # into account def threaded_function(arg): sr = osr.SpatialReference() with gdaltest.error_handler(): arg[0] = sr.ImportFromEPSG(32631) try: arg = [ -1 ] thread = Thread(target = threaded_function, args = (arg, )) thread.start() thread.join() assert arg[0] == 0 osr.SetPROJSearchPath('/i_do/not/exist') thread = Thread(target = threaded_function, args = (arg, )) thread.start() thread.join() assert arg[0] > 0 finally: # Cancel search path (we can't call SetPROJSearchPath(None)) osr.SetPROJSearchPaths([]) sr = osr.SpatialReference() assert sr.ImportFromEPSG(32631) == 0 def test_osr_create_in_one_thread_destroy_in_other(): def threaded_function(arg): sr = osr.SpatialReference() sr.ImportFromEPSG(32631) arg[0] = sr arg = [ None ] thread = Thread(target = threaded_function, args = (arg, )) thread.start() thread.join() assert arg[0] del arg[0] gdalautotest-3.0.4/osr/__init__.py0000644003401500001440000000000013614005315016530 0ustar rouaultusersgdalautotest-3.0.4/osr/osr_validate.py0000755003401500001440000002443313614005315017470 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_validate.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test (error cases of) OSRValidate # 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 osr ############################################################################### # No root pointer def test_osr_validate_1(): empty_srs = osr.SpatialReference() assert empty_srs.Validate() != 0 ############################################################################### # Unrecognized root node def test_osr_validate_2(): srs = osr.SpatialReference() srs.ImportFromWkt("FOO[]") assert srs.Validate() != 0 ############################################################################### # COMPD_CS errors def test_osr_validate_3(): # No DATUM child in GEOGCS srs = osr.SpatialReference() srs.ImportFromWkt("""COMPD_CS[]""") # 5 is OGRERR_CORRUPT_DATA. assert srs.Validate() != 0 srs.ImportFromWkt("""COMPD_CS["MYNAME",GEOGCS[]]""") assert srs.Validate() != 0 # AUTHORITY has wrong number of children (1), not 2. srs = osr.SpatialReference() srs.ImportFromWkt("""COMPD_CS["MYNAME",AUTHORITY[]]""") assert srs.Validate() != 0 # Unexpected child for COMPD_CS `FOO' srs = osr.SpatialReference() srs.ImportFromWkt("""COMPD_CS["MYNAME",FOO[]]""") assert srs.Validate() != 0 ############################################################################### # VERT_CS errors def test_osr_validate_4(): # Invalid number of children : 1 srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",VERT_DATUM[]]""") assert srs.Validate() != 0 # UNIT has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",UNIT[]]""") assert srs.Validate() != 0 # AXIS has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",AXIS[]]""") assert srs.Validate() != 0 # AUTHORITY has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",AUTHORITY[]]""") assert srs.Validate() != 0 # Unexpected child for VERT_CS `FOO' srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",FOO[]]""") assert srs.Validate() != 0 # No VERT_DATUM child in VERT_CS srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME"]""") assert srs.Validate() != 0 # No UNIT child in VERT_CS srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",VERT_DATUM["MYNAME",2005,AUTHORITY["EPSG","0"]]]""") assert srs.Validate() != 0 # Too many AXIS children in VERT_CS srs = osr.SpatialReference() srs.ImportFromWkt("""VERT_CS["MYNAME",VERT_DATUM["MYNAME",2005,AUTHORITY["EPSG","0"]],UNIT["metre",1],AXIS["foo",foo],AXIS["bar",bar]]""") assert srs.Validate() != 0 ############################################################################### # GEOCCS errors def test_osr_validate_5(): # srs.ImportFromWkt('GEOCCS["My Geocentric",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["meter",1]]') # PRIMEM has wrong number of children (1),not 2 or 3 as expected srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM[],UNIT["meter",1]]') assert srs.Validate() != 0 # UNIT has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",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[]]') assert srs.Validate() != 0 # AXIS has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],AXIS[],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["meter",1]]') assert srs.Validate() != 0 # AUTHORITY has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",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["meter",1],AUTHORITY[]]') assert srs.Validate() != 0 # Unexpected child for GEOCCS `FOO' srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",FOO[]]') assert srs.Validate() != 0 # No DATUM child in GEOCCS srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric"]') assert srs.Validate() != 0 # No PRIMEM child in GEOCCS srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]]]]') assert srs.Validate() != 0 # No UNIT child in GEOCCS srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]]],PRIMEM["Greenwich",0]]') assert srs.Validate() != 0 # Wrong number of AXIS children in GEOCCS srs = osr.SpatialReference() srs.ImportFromWkt('GEOCCS["My Geocentric",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"]],AXIS["foo",foo],UNIT["meter",1]]') assert srs.Validate() != 0 ############################################################################### # PROJCS errors def test_osr_validate_6(): # srs.ImportFromWkt('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"]]') # UNIT has wrong number of children (1), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",UNIT[]]') assert srs.Validate() != 0 # PARAMETER has wrong number of children (1),not 2 as expected srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PARAMETER[]]') assert srs.Validate() != 0 # Unrecognized PARAMETER `foo' srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PARAMETER["foo",0]]') assert srs.Validate() != 0 # PROJECTION has wrong number of children (0),not 1 or 2 as expected srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PROJECTION]') assert srs.Validate() != 0 # Unrecognized PROJECTION `foo' srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PROJECTION["foo"]]') assert srs.Validate() != 0 # Unsupported, but recognised PROJECTION `Tunisia_Mining_Grid' srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PROJECTION["Tunisia_Mining_Grid"]]') assert srs.Validate() != 0 # Unexpected child for PROJECTION `FOO' srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PROJECTION["Transverse_Mercator", FOO]]') assert srs.Validate() != 0 # AUTHORITY has wrong number of children (0), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",PROJECTION["Transverse_Mercator", AUTHORITY]]') assert srs.Validate() != 0 # AUTHORITY has wrong number of children (0), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",AUTHORITY]]') assert srs.Validate() != 0 # AXIS has wrong number of children (0), not 2 srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",AXIS]]') assert srs.Validate() != 0 # Unexpected child for PROJCS `FOO' srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N",FOO]]') assert srs.Validate() != 0 # PROJCS does not have PROJECTION subnode. srs = osr.SpatialReference() srs.ImportFromWkt('PROJCS["WGS 84 / UTM zone 31N"]') assert srs.Validate() != 0 ############################################################################### gdalautotest-3.0.4/osr/osr_micoordsys.py0000755003401500001440000001061713614005315020071 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_micoordsys.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test some MITAB specific translation issues. # 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 osr import pytest ############################################################################### # Test the osr.SpatialReference.ImportFromMICoordSys() function. # def test_osr_micoordsys_1(): srs = osr.SpatialReference() srs.ImportFromMICoordSys('Earth Projection 3, 62, "m", -117.474542888889, 33.7644620277778, 33.9036340277778, 33.6252900277778, 0, 0') if abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_1) - 33.9036340277778) > 0.0000005 \ or abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_2) - 33.6252900277778) > 0.0000005 \ or abs(srs.GetProjParm(osr.SRS_PP_LATITUDE_OF_ORIGIN) - 33.7644620277778) > 0.0000005 \ or abs(srs.GetProjParm(osr.SRS_PP_CENTRAL_MERIDIAN) - (-117.474542888889)) > 0.0000005 \ or abs(srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) - 0.0) > 0.0000005 \ or abs(srs.GetProjParm(osr.SRS_PP_FALSE_NORTHING) - 0.0) > 0.0000005: print(srs.ExportToPrettyWkt()) pytest.fail('Can not export Lambert Conformal Conic projection.') ############################################################################### # Test the osr.SpatialReference.ExportToMICoordSys() function. # def test_osr_micoordsys_2(): srs = osr.SpatialReference() srs.ImportFromWkt("""PROJCS["unnamed",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["Lambert_Conformal_Conic_2SP"],\ PARAMETER["standard_parallel_1",33.90363402777778],\ PARAMETER["standard_parallel_2",33.62529002777778],\ PARAMETER["latitude_of_origin",33.76446202777777],\ PARAMETER["central_meridian",-117.4745428888889],\ PARAMETER["false_easting",0],PARAMETER["false_northing",0],\ UNIT["metre",1,AUTHORITY["EPSG","9001"]]]""") proj = srs.ExportToMICoordSys() assert proj == 'Earth Projection 3, 62, "m", -117.474542888889, 33.7644620277778, 33.9036340277778, 33.6252900277778, 0, 0', \ 'Can not import Lambert Conformal Conic projection.' ############################################################################### # Test EPSG:3857 # def test_osr_micoordsys_3(): srs = osr.SpatialReference() srs.ImportFromEPSG(3857) proj = srs.ExportToMICoordSys() assert proj == 'Earth Projection 10, 157, "m", 0' srs = osr.SpatialReference() srs.ImportFromMICoordSys('Earth Projection 10, 157, "m", 0') wkt = srs.ExportToWkt() assert 'EXTENSION["PROJ4"' in wkt # Transform again to MITAB (we no longer have the EPSG code, so we rely on PROJ4 extension node) proj = srs.ExportToMICoordSys() assert proj == 'Earth Projection 10, 157, "m", 0' gdalautotest-3.0.4/osr/osr_xml.py0000755003401500001440000002037513614005315016500 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_xml.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OSR XML import/export # 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 re import gdaltest from osgeo import osr ############################################################################### # Test the osr.SpatialReference.ImportFromXML() function. # def test_osr_xml_1(): gdaltest.srs_xml = """ WGS 84 / UTM zone 31N 32631 WGS 84 4326 ellipsoidal 6402 Geodetic latitude 9901 Lat north Geodetic longitude 9902 Lon east WGS_1984 6326 Greenwich 8901 0 WGS 84 7030 6378137 298.257223563 Transverse_Mercator 0 3 0.9996 500000 0 Cartesian 4400 Easting 9906 E east Northing 9907 N north """ gdaltest.srs_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"]]""" srs = osr.SpatialReference() srs.ImportFromXML(gdaltest.srs_xml) got = srs.ExportToWkt() expected = gdaltest.srs_wkt assert got == expected ############################################################################### # Test the osr.SpatialReference.ExportToXML() function. # def test_osr_xml_2(): srs = osr.SpatialReference() srs.ImportFromWkt(gdaltest.srs_wkt) expected = gdaltest.srs_xml got = srs.ExportToXML() # Strip the gml:id tags got = re.sub(r' gml:id="[^"]*"', '', got, 0) expected = re.sub(r' gml:id="[^"]*"', '', expected, 0) assert got == expected gdalautotest-3.0.4/osr/osr_usgs.py0000755003401500001440000000760213614005315016657 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_usgs.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test some USGS specific translation issues. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2004, 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. ############################################################################### from osgeo import gdal from osgeo import osr ############################################################################### # Test the osr.SpatialReference.ImportFromUSGS() function. # def test_osr_usgs_1(): srs = osr.SpatialReference() srs.ImportFromUSGS( 8, 0, (0.0, 0.0, gdal.DecToPackedDMS(47.0), gdal.DecToPackedDMS(62.0), gdal.DecToPackedDMS(45.0), gdal.DecToPackedDMS(54.5), 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), 15) assert abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_1) - 47.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_STANDARD_PARALLEL_2) - 62.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_LATITUDE_OF_CENTER) - 54.5) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_LONGITUDE_OF_CENTER) - 45.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) - 0.0) <= 0.0000005 and abs(srs.GetProjParm(osr.SRS_PP_FALSE_NORTHING) - 0.0) <= 0.0000005, \ 'Can not import Equidistant Conic projection.' ############################################################################### # Test the osr.SpatialReference.ExportToUSGS() function. # def test_osr_usgs_2(): srs = osr.SpatialReference() srs.ImportFromWkt("""PROJCS["unnamed",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["Lambert_Conformal_Conic_2SP"],\ PARAMETER["standard_parallel_1",33.90363402777778],\ PARAMETER["standard_parallel_2",33.62529002777778],\ PARAMETER["latitude_of_origin",33.76446202777777],\ PARAMETER["central_meridian",-117.4745428888889],\ PARAMETER["false_easting",0],PARAMETER["false_northing",0],\ UNIT["metre",1,AUTHORITY["EPSG","9001"]]]""") (proj_code, _, parms, datum_code) = srs.ExportToUSGS() assert proj_code == 4 and datum_code == 0 and abs(gdal.PackedDMSToDec(parms[2]) - 33.90363403) <= 0.0000005 and abs(gdal.PackedDMSToDec(parms[3]) - 33.62529003) <= 0.0000005 and abs(gdal.PackedDMSToDec(parms[4]) - -117.4745429) <= 0.0000005 and abs(gdal.PackedDMSToDec(parms[5]) - 33.76446203) <= 0.0000005, \ 'Can not import Lambert Conformal Conic projection.' gdalautotest-3.0.4/osr/data/0000755003401500001440000000000013614004467015351 5ustar rouaultusersgdalautotest-3.0.4/osr/data/wkt_rt90.def0000644003401500001440000000063313614004467017516 0ustar rouaultusersPROJCS["RT90_DIRPRJ",GEOGCS["Latitud/longitud.SWEREF99",DATUM["GRS80",SPHEROID["anon",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["grader",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["Central_Meridian",15.8062845294444],PARAMETER["False_Easting",1500064.274],PARAMETER["False_Northing",-667.711],PARAMETER["Latitude_of_Origin",0],PARAMETER["Scale_Factor",1.00000561024],UNIT["m",1]] gdalautotest-3.0.4/osr/data/Test_Data_File.csv0000644003401500001440000000327013614004467020677 0ustar rouaultuserstestName,testMethod,srcCrsAuth,srcCrs,tgtCrsType,tgtCrs,srcOrd1,srcOrd2,srcOrd3,tgtOrd1,tgtOrd2,tgtOrd3,tolOrd1,tolOrd2,tolOrd3,using,dataSource,dataCmnts,maintenanceCmnts WGS84 Geogrpahic 2D to CSPC Z3 USFT NAD83,CRS2D,EPSG,4326,EPSG,2227,37.95657778,-121.3128278,,2171792.15,6327319.23,,0.05,0.05,,,Trimble Business Center 1.10,The latitude and longitude values provided as the source CRS ordinate values were obtained from Google Earth Version X for the approximate location of the KSN Inc. Office in Stockton California. These latitude and longitude values were calculated to California State Plane Coordinates Zone 3 United States Survey Feet using Version 1.10 of Trimble Business Center. The latitude and longitude values were inserted into TGO in Degrees-Minutes-Seconds format. These values were 37-57-23.68000 and -121.18-46.80000. The decimal degrees format for these latitude and longitude values provided in the Source CRS columns were converted by hand from the Degrees-Minutes-Seconds format by Landon Blake.,The latitude and longitude values provided as the source CRS ordinate values were obtained from Google Earth Version X for the approximate location of the KSN Inc. Office in Stockton California. These latitude and longitude values were calculated to California State Plane Coordinates Zone 3 United States Survey Feet using Version 1.10 of Trimble Business Center. The latitude and longitude values were inserted into TGO in Degrees-Minutes-Seconds format. These values were 37-57-23.68000 and -121.18-46.80000. The decimal degrees format for these latitude and longitude values provided in the Source CRS columns were converted by hand from the Degrees-Minutes-Seconds format by Landon Blake. gdalautotest-3.0.4/osr/data/lcc_esri.prj0000644003401500001440000000077213614004467017657 0ustar rouaultusersESRI::PROJCS["Lambert Conformal Conic",GEOGCS["grs80",DATUM["D_North_American_1983",SPHEROID["Geodetic_Reference_System_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["standard_parallel_1",34.33333333333334],PARAMETER["standard_parallel_2",36.16666666666666],PARAMETER["latitude_of_origin",33.75],PARAMETER["central_meridian",-79],PARAMETER["false_easting",609601.22],PARAMETER["false_northing",0],UNIT["Meter",1]] gdalautotest-3.0.4/osr/data/esri_extra.csv0000644003401500001440000001412013614004467020231 0ustar rouaultusersCOORD_REF_SYS_CODE;ESRI_DATUM_NAME;WKT 0;;GEOGCS["GCS_Tete",DATUM["D_Tete",SPHEROID["Clarke_1866",6378206.4,294.9786982]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]PROJCS["SAD_1969_UTM_Zone_21S",GEOGCS["GCS_South_American_1969",DATUM["D_South_American_1969",SPHEROID["GRS_1967_Truncated",6378160.0,298.25]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",-57.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]PROJCS["World_Aitoff",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Aitoff"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],UNIT["Meter",1.0],AUTHORITY["ESRI",54043]] 0;;PROJCS["South_America_Albers_Equal_Area_Conic",GEOGCS["GCS_South_American_1969",DATUM["D_South_American_1969",SPHEROID["GRS_1967_Truncated",6378160.0,298.25]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Albers"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-59.0],PARAMETER["Standard_Parallel_1",1.0],PARAMETER["Standard_Parallel_2",-14.0],PARAMETER["Latitude_Of_Origin",5.0],UNIT["Kilometer",1000.0]]PROJCS["World_Bonne",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Bonne"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",60.0],UNIT["Meter",1.0],AUTHORITY["ESRI",54024]] 0;;GEOGCS["GCS_South_American_1969",DATUM["D_South_American_1969",SPHEROID["GRS_1967_Truncated",6378160.0,298.25]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]PROJCS["South_America_Albers_Equal_Area_Conic",GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Albers"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-59.0],PARAMETER["Standard_Parallel_1",1.0],PARAMETER["Standard_Parallel_2",-14.0],PARAMETER["Latitude_Of_Origin",5.0],UNIT["Kilometer",1000.0]]GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]PROJCS["Pulkovo_1942_GK_Zone_7N",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",39.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",28467]] 0;;PROJCS["Pulkovo_1942_GK_Zone_7",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",7500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",39.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",28407]] 0;;PROJCS["Pulkovo 1963 D 3 Degree Zone 1N",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",1250000.0],PARAMETER["False_Northing",-14743.504],PARAMETER["Central_Meridian",38.55],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]PROJCS["Pulkovo 1963 D 3 Degree Zone 1",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",250000.0],PARAMETER["False_Northing",-14743.504],PARAMETER["Central_Meridian",38.55],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]PROJCS["Pulkovo 1963 D 3 Degree Zone 2N",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",2250000.0],PARAMETER["False_Northing",-14743.504],PARAMETER["Central_Meridian",41.55],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator_Auxiliary_Sphere"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],PARAMETER["Auxiliary_Sphere_Type",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",3857]] 0;;PROJCS["WGS_1984_Web_Mercator",GEOGCS["GCS_WGS_1984_Major_Auxiliary_Sphere",DATUM["D_WGS_1984_Major_Auxiliary_Sphere",SPHEROID["WGS_1984_Major_Auxiliary_Sphere",6378137.0,0.0]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],UNIT["Meter",1.0],AUTHORITY["ESRI",102113]] 0;;PROJCS["WGS_1984_World_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",3395]] gdalautotest-3.0.4/osr/data/esri_gcs.csv.gz0000644003401500001440000004345613614004467020317 0ustar rouaultusers;Nesri_gcs.csv}[s83ugw2U ,,eCQ@fmx7'SIDv~/?߾?w:>;]'i[3/g[}>^_;AĉQ4ql7]Y$[\dؑYQ:?x |~OU|\oǝN0:*om˂lRa5 (Z>F4$݊dM69b p@ OWF<;`YwWh7)}<)/DmETCgm~!SB"PF0vL|~;~t03nƾŘ\1l#m|MD ]  geMVYSlU8=9ӲۦZevg:C9m`c1P3*I `n4%˲[^T{%^$w)iq?){S{%jsi{{۲`1;kt[PԞEt_"ٖ؊W}[2<'Y)TfeorHlX%vHagmYZy&T*;y^*찣2ѫ.ԝL}xVn6_Ц Cu5l򋝠۶'9)Xלb W 7|1Ν;sseʳd7`z=۶`Y&EF؋B!]*FBȾ-܁0}`lt}{uFQ(` 0O9_ _Ot5"@X4U nub>|3ĕCnڳt" ]g[:6Zx΀@ MSg;3 '{0Y>9,bZyPEh|Fq>|Ft hBa QG;|L_OQ3D;.W8/?~5!ϯcsj~uG1_`~$9GyO#5u]AxBY-xlq{naku6[n(ՠ7ƹMy۵Ru+{J_Ƿh7>a_!ݿDf&A$ Y6F{{RpߺuqrP_h/0~3De~:=b4"oxY`p]q>%WWq[d' sLSUWl:ƫn(/ݮp~HW񧪬lҩ_vE; R WI!ecXC7,I-,cD83}~ C4SaYCB[h'Ou1\ڸ"9M/!?+Q o WjQ/ xK~~QEgDyRgFC|>"L*&mSldʚaFb|W/Ib4>?Sm1\wg3oZ<X#ԬEf~LJQo,lL 5@gB=YH ~҇w)w̕_ÖZ(بU.6&k,(28},zG_^&>%ےhoẾCh>~͋tPU)t2g$tn_pWXϥ|G}5lQ[>ZAhva G.i0j |uv2NM9 :>2O"VMe[>k~Ast!.k|v## >@d.G2ɑbwϾg\dg2.IƜk$G1IQ*ɳ$njIalˌ 2~W'YIe.|=B!-=*\K8*{]hSn }( zCpȆS5qAAwC{zwG#ETQ4ySr.*"6ӻUR[h.uJWaQP޶HJsд9.zLE*r>KI1xd_uZ p2K6 bϽF3X~ # 9k`pn o]HTО̮"WRn6M6=*%Dw(eUR}U"F-+6pLֽz#@V*꽟s8 =d<4P" H̾t|9А U{ Hcv `WAI8:Wl{fn6)XXS^"mQ7m^c"'RW/>Dnۢ'RM}R*rGgO Yc@"l,w/Q%Sj* PЯl&K2LKv Q┴*$13s.KqJrMUDD%dvu*NJ]$˝^T8͋"y SUfywī5O[F~$-׼mh|G 7NGAgotDUN-JX#Or;a -ppɓ-ZRXтn,f$['a,J̶+x2qa@TIɖ$ AB-E]X+v{5KWe\uE9D4GkJM}FA-d`t-*XawUaGmQ̢5xCfY ]+V0@ÝQ\,ju.l2l#Xjp,.FTD]WS(Zc?;ԵUNq@w{3-SHZƷ醮Ӟ_H9ĐЬ{'S\V5CpNߢ6][= x6=2k^$S<5i7OJGu# ;VU@_5-(@B0eYYy@%zDUU ?h`I߀&cY;-dI>>:ȠOJ̾T|uF0!j/El/}FQh~D r (O %y&RA0:`mQQl1oҠ*TQ-*w$5MwPQ:)kQLQd ydIz4#Fgif/ǛڎR f!Q:2!C ?'5*;%PN>>6QE+#˓BVjdrr`C;fNOWo͏hE!:ʻU3:57d]LpOaC(Jd)x$.> c7[kBرMo6UDf9fJ+$Pk*ǁ47ǜE ^d'Q= mPq=C#jD,ѯ^IrlHA >ŭ5֘#vB4^tQm6JX\n9k`DMR%ȊlP9;pTf,޷Iek(uIƂSiԻ "9؎{]2j<͎bz$f(N L!( k-򲧶4~Q'vR;uiVCT<ViQC8:|nC@v5&JdIF͒nJmtUժa N 0 JBUSsb-I)|*%)*Y7U-hvQb\dl`TQ[]<] I׈yc)Z=2[G@3T;ߩg+2iDG:[m_+gb)2%1N>}~ 'a$1WȌ!:yD=k2$@j٣ӉFG\8u 0GS}ߍqOtEX MI [wc^ jt _vzZbdA[huD݌_0ߴI"b{cV1 n:3'sm Vy'Mפ* )!qEwNmGTޘ+m@ioLdI Q tQt W(+VK ѓ @fPdX.ncv5pG{sqrldR$m2F[h~sFXx>y Ya~|Hfrٱu(%6۹=(gsQf~7Cж78hןN}jL7iwD 8(AԖ lɱQ=x&J3/?wx 5, )V؝kݶe=%RT)9qHbԕuEbw<&d7_%_$^%]얋$N<4ƹ"1k>X13嚼e]Ef)Yz!$A]nrsņuj+'<_wj%8U1xqԚ':r,2@LӱR,Mɡ~γk^էUhb<ǪLz~LK./?*U_`glGi<%mIPE(V" {m+"$3jDVlQd%KT2U!ʎUEfًY1ټG4l_إwf-sR.tG)c m"R 2!m-(WzϦլؼ-(_Y}q~+:6b25:pex(!fRʋY:)A!,]ټ'3RyMo=K$wr\5۪"2p7YƁե 8zLv Jt8J^&$]R]14UTTv|{şW+2XgRnɒ|dd۸uS뒛5F\?BVak(@6ؑ={S{qiPt|Eٶϡzi68%gIӄ2*|jwb45c׵2Q:LDۻ@3F.<\YWQQ87_f Ik2Hl}Ɨ1~Jam ˣL^F,W9? &='uAYƞpoN;8"Ŗ(s9H6En8Oޟ~#uJ@ gڮ)>GS+AuPp| [^l" mcQJ*١HĕKo-/bY89ljQY4ڶE{1.AxHնȗ"`|u#Xh]qEwx{^P/HKKf )b(A4_޵ѻ؜'`Z'۲`+EY گtBٶL]ɜǂc52>sl2,K8] ZNk!]nepY|m׹+$-5nrL yhAM'9gK~i|bj84}YSRp},(Ѣ8*PPwe[숇qSByǭH!hsg8b(u5lae1Qaw-N E<q÷(~QB'rLrP`(ӫȓ:@G]_> Z |ĉ`6@2I.quأavؓ'ɺx9%K Pn SGU!0!)jh3pR-Z4wy]U~@JggJP L|d;REXdϱN<]L| 6E^!'M9}7:~J6**?P|񦲲HRFʽ5kԠ4+s1[5K8'䕳"WC:xv{X}K:'O!m2puE<>%^Z EeQCy1/ҔD{o"!g<\{z3EW5Ÿ͑W,0d E~8y<~DsC'D^?CɋW4K"ܡRi8,_C; U3}ď=H'Od%H4*D\t@E4?CMo% Itikq8geg 9vENE֢?mߴ=7_skT͞8%뗳nYAVLwl?0 8YOVrb? qqhg*vV[r* u=o<+WF:Q:ˌܔzV[겥%tMaC#~XloKKmP9 te|^DJ*Cv (\#_x>wxQ˧uǺջF?n @CS|RLI` dzQ ,ۯ$p.q/ga|`I$-fnd4:tvd{~Ý+:u"&/VIQNT9 +Sd+ ;N TW8<ڭڈٺlS'" ғyzsw#FUBߧ"=c,G!ΓU[4T1 8Bh,vULHe瞫53KLW-d qƽguR`p̄;0:*pٰlHȺt: 7_t#jG#%'R;e٤d4HB]xcwBGs±[2BUH<$'%P@`!!6_/$801d~_\,E$UfUDO#E*vҶ36ܟH!dٍ[Cq9*%MwmΒijSԚخS[d{O?5:?f>; <&s7Yį.NHGVR@[SNgeۧ1$i`7[I`,iG[R8e&gyP' /4dUs>K[ުYH#mg=/VM lŦ~C$a8]p*mBR:FDM;"R|RWFD#}ZDi"jw;چlIN'Qi/DdKʯw;D]DmD$w5Y" A'ѠʯQ!ښjT%ٖr|Kaoº^\I햤գ;tpbeXϤ c\@k_uex(/G[x9̎ҟcx?/K֩QV/iGK~ɋr>C(Ȉ1wŘm;u/˺'"5&q}2K˺KY|FN~8N9 )!1{vDpy^~d w4^5)nj J|2a[|M'Ժ^%廡03]+D^iaNSR[LZ:3 c3zS9幑CuFztFig@snVQn(; mgFquª i \Ko<שƄh:qz1:}dIdj鍢Fj`: `5 %966ԺM4mF::mHgjs%\2q'HBSRlBZMgvTh:Nw_|ût{;%77@WMo~0ﯢ1pot5€y9ޟD<]//_j6@5S? Gz 4^%% ۙӹZ\/|c2[4ϟn@S@5o՟*CZwP# y؍NoyRM}#4z hQ`q@R+f@6AmFmY@'a^RKgԩAۚD(+=KJdTĵ1 5^Y{ܐ+~lp2g5gk< Rd)MU:ZOQ.Y5Z_kUw'?xyy1`m+5{Zc?y7sz7 >k5 [ݱr3Jh5=iRk EYq}G ^z\'7׵c!TX2JxmN݊=7gc LpxWI%Rij=m[Z#/]zf|3`K5Ro8/eu5yi7rjI]jzRm2Ez}K-Rg _͓U`5Ӛ^kܽ}FI KLOx8mdfȮ7]mZ#}6OC ZFW:Z+7 |6ϗ+kl5ykƋob߽l5gytE;V@?Bypo ʄ"Kzb1M |ym{j;c/_~J6Fӫ*ߴ6#AD##ύ0ê/^V'mOEJ44T뵓zZI(L;[݃v>֔po5ʌUsdϵ$CGީsJ6[b?_kLk xNQX!1$txLHx4.숺t5w+5~9щ2U=?ˤ%v%p6^tɫk͕}^h&K:wj;ýIٷj"}}*bW >j|!e/&^"%4:W8)! Z{Lgp6/8S׍p#\ie@{^9>PޓE gzk5T'C^럴Vs?1u}ߵcX.!kYg6xy<۩xHjxtqoiQ탢bqRKG`RزaƍVJQ~(˾y[]K'#تq$߿'0kXLeY[6dyJgכ[|k`\~K]!.3Z;M]DDnFG7--HaVk[_OYAl'cϋ`{X-Lns: U{)iFK>[}{ {G9dFY1}ڵ9^k:FGƤ_~̳r@f 3V_ޞ6QY3;v0=G6KՀ5T;BJ#rɗ# U{K_/ߕ<zo{_2~8r Cǭ]nۺ}?c1Mﶨac4:P߶,H, bhְzD!9o:l^fn6ġ<98z$Pm5C{ 7I m mGbz(1ܡfR KCVհΝY I(iueE*u^?;UƬ)ŜԨ @|6˜zx<PѴF,Gӆү[y?a)I*kU9U#S &4Br;p};+O!^V^.:\P%BT8FCG-r_n3nu/9NF8z|PzE=z <)ΘhAC.-_v:]k$3HB%bXg݀V7'Zh8#!u[Mu&ev 99z9'6 /JFkbR>̷< ƽ>wje}7@K71![]ϝ>I4q:Ã4%<tҬiS[5r_2]J; _/'+/V/;pvo_w9tꂴ_%Tj0$, a%W^Dk kr>fܟxB2Y%}7w^ӿ4nj_|0 ŐČcWC^l w3JjWkk!sA[iƿO[h&L' CT.jy~ DiXs4@wN3;WM77YsBף_0.e5IβcqXgAİ5qPhwj\Bpnpa*@;tB[MujaM0F8 Ӥ1KYu*->ӈBOK"Y֙7D<=3fkMfyE F% `KRhT":w82b9~;Mf[3M( f".x(N6n&..~7-~Gu(C]|ݶ.jXy4 p_ͩWA\ 89̺N0weEtB!Hpk"}F iBYf4mTטu ]",J AAt1zZ<["ʳM*+n\Mr:]ِ|0MXAesk*:s[ :M?IZfb.xS W%Z7".6@u]벨l#!@ ݠ 2QVڧIoxq< &Yǣ(XC͜weo,\c2 $s .t]"!;ۚ sq7Iبm Go!l -jߗouٰ`mBj./㱰EaA&AuC~|˷i26M(q",Y6: F/mq#@ ¡e!jZ p`nD`T`ʋ.MzXۇ4 sꀻ޺rpꈂN'&T'WNZH(R&  DD͡1%@ &)][ZZqԉҕz߶vԽ pr0sKCuB0qGW4J'Q$AaoȽV+CѢ6@C 9ltQcɬ`@[ԹjFhYn0 x O8'-+2I0[Р|]&>q&xyww\Umx}jYn|ɲ.[Kfxb8n4],ʦGq1[q9ٖ xAq; ~Y 1FkqW4n2^ ]<~A;۽}:$|.p'xіU*d=ؖI&n~U: [yeh (u˺V> .dy<)1wPūRJz-C&I!L̫+unpi6zup=ܖVnio`Vq2d><:/gƢF+&UU;^`HaH,@0N/ m D䆈zyAhqѿ;C& !!BDH{Y "sCd=Do,"6Anu 7DCH;HMA覸1`cd%Ɠw;:jytNl45ҮWހT8ي t0azaP9*h ]PauS'TPqPQT삊{BeCMP *nU6mC%MP *n u 6Ae.)T1T7HZriA`RtO6Jr0w9 Tc~Y˵6T~yxc"p-|6{13sdoukQG%"QDkqG+D0tc6=F/_P-D<0F"-}GEן%m>zqׇVQCC\ѓnQ *F 3H!ɜ0!A{O ;ΌVF ?}YLeP5:fy(k28FV|hq߼L|l plC!! p0B$!& ,+v*D>,}qm]p,&7=\gt<> Hqkr"FNI''`؎@GelJeQ Y=)yMc  )9Ayw./ӲIrYYT.H}hhX|Wky ;f\V?p50 dCPxk{GR/UHCJ!  a €0@o-"X4,5 i]|pZsHvr6ZT%r:ͳl0Vb*|!ɼ$ wIDJDOr{V6ġ %=J;ʎ7(hB (ent mrhq:*6hokVj ܲP%x=ɧf;˕Nƙ\3u7( x#1~8Oe9v3fF:ڔ{.Xj$('ի=O |48d8PC<@K[^ZIէ>O(n'\Q} ts!zy}ȳoc^%J5ދ,[jLag֮( C ?ܽt3Ch~ߛ {t5eMf"&I:f&gzf{ɾWz"|4aҐ2hO8t:|El=B9û2ʇ @ ;c4{(R}R slpihEvjJaͶ;Z|pX1}L|Q4f#9π7!=z_Bu n8 䁵f;0\!FaSR!fD7XxY̖57DVgzc+[afwm`Xa9z0;'`px8{GG(iFzɎ;Nﳿa1}vY$%k%afi7*HM=vtE8̇H-6iz$F/IKH#׍N C߄%Luh%}ĐmhUc+L/ohpM/] e=-) C YjeO5Ӽ,kС™~I9^3+ 9Ԁ9n5?֬ 4%*ZY#se E?S2..52TU zAY"lSm.a3DQ!BYq(zp cN_9AC[y4m 9 +'WʣhR[rBZRub*ܣd'_%#<t XZ(*Oa`7 Ej ަq<54UA F<Y>?lI4쯈&ɊŦma\Js2u݈7eoဪ\j1ޖ+7p-qԕMOtmۯ lDx4GVKK>>e •3;luPɽ.FA%9V$s*sS&gśz"+U9-l{ʳHV`}[Li+|m~.~s7~T}|&;C.Noł\ohH(`@=7Ύ?ό۸t`eD=7z_zhc}ƱPmK o >r '!N+\$o9KFqNrd3HjHl'nاc" p&״iKoQgt5_ѮglgL, ϔ/)׼b LYk Qo b .Wྏ~LuRVq^lVtfBA{#1Mz!KַVH 0buP\po``I@m$B oR<`&=KKa*Uieq5Xw*yXMC'm-[7:ײ6`c8Q;,l V=\;\('eի2tMa.f=R;R@!|O2+POFX͢j`gNro"PMoa܈) [# TVMHU|6ZtJ' B=MRJGOܶ\@]h}+4P"·_Ŧkd#"ʊS}[ܴFKaW.-ruܞ,gƢɗ6Z6$7XibTIH9ถjfUXfbAZN8Y#np\a7`eCxM]+ ph,7s&h?.ͬ)oNqC9^^L-Qg~ PT}0MryѤ8}iVuJG_һ@Vf*<꺨<K[*0rQ45هW}+Tk)Kx}?~/L%ngt<>Uof-na9c!} u 'L"]bqK6CE93"S6%".RyK=^_NB+5ee<fߒQ.TbJpö1$YR̋@ ``DM+U6Gw.֩֌*POn J<ر4DnȄԧBL9!/'с#Hd~$4kmEG#_G̫7 CԚEW@~Mx`!2}  tr%TNo[bzG[YͪW `n?dnŐR?tҶzDlɐ2?lB8- ;CǐCZj yhb( G <'5"7w^d GTߡ|GwK_V#i vj]Ǽ,-c~p^pզtphlinϪ5/λy g04/g#j>jh)fjPh(5x&;af]@mr6~R א6vYJ 'm;]cn^X:'\BI+W4Y5Iv&;Aݻ~t~KP<>|5ɟ9ve79N ա-fh <'VZf!>5c[Z$08) c|:WX-ztQC]gsA>=o}C}fjCd; ٯl2-@+x nGR) %=7EOi֜ނ!Qa3%YS2PvC\^>x='ɕ&M2o:\ԯ!;Vvup&چ'/p8E跜q"*'9ZA a8i|L@֫<*9vOwm-/:v뤐 弯QZV(-<*!jg!u]r{-@!8`+>sKxiOx%1y4/V5cC&VשO_$^KU{^{Ϩ=99 $t?\Ê|OScfJ'T|VQ_r nfd/vN҇OGtMGqՆKR}c_o ;6~I2ŁאnJk+uBʉUZ;KT=ҳ ^Z*'ǭi |&zB6;ssQB¹;w)8֊ad5 鷥^ʹ陴b/k}3UMl2ImϬ%>g#٭~d}4 ,vSG?BSq%/}K"9{Jz>07Շa}~?dj/|zZ1!ʱ|  qT1{+b^V0c.H:>a>\̎9ue$>SZ!Has %zJ1zGŗJx\0Ԃ Ɋ}aCdm*ghJ&TهT_ a( qW-kgUٷ۔ЭkTF^2?j~CL]o)NZXKh>jeKg^ཥ8>gg᳥P@ўˇՒu6O^1?NxMc^57dܡ #X<7(mb@b(Z& lJVB|%[J7!E= CZk8@)<u'n)6L7ip_IEY?JfpW?  C"/3iu%`PqTe_q_zyuwSTk_1t[}tīAnW<Ӌ*ҧ|񎺇NDX]|^hRlcpjbf? ]d0Iۣ'+hPCcvWm^$Ko#凲WM鬝44V-Z}H_Te2wp?i%'<5+Q-A#zu1:[;rX%3?=yez<4y05~kI@T>h4$M=+u=WGk^W] b"[5OyrUb*f+! ̭GHK3o<GQj/AỘugϥ+tī2دh}-.Rp9kZK279<"6v1g b>S/g^a]) _R;4];3;]prnzц[)|㵯pަ!ſ]P2'8*|K%{ip8{*=%ge$d CVsÑzG|{⽍^TROigkҼ}\WUR |g~8bW:}_~W45^l͹q?W[zS{CH ̲5z;(6Uٽ?bI#]p-uv}^hpCYVz񸂳+lq`gf!f6i͠)[LB?^p47f$,p pAYr_ҠpA`qhYVܼC0LuDqU%gYV00Q>B쾦OrRš[s9>%)u'`Y fs3al6oUtELceaJٌOuʜ8]GfeL MíN1b\k}חn0p|M?y̎Y-͆,KU$2ӄ͓ݶv{@j62t;{]=y#$|1ч`'#tm%u‰vOQM&VZҽ!kc=1ƪ9W/LԷ^FnpoO'jOcȑ\-wZ}{4!B>ُ0 rQAv@2 ؽ@ϧ{i?m_^+1Ɵ.?_8KHѨoVXQ1ļMdpz\z˻ݟo/_Ѫ"&RZ tdEzzzݷU)n7Nd}pvsN#ϻէ_yb3Rw~J_u3cT8i8fA118AO6p\ p8`'3'AŃ{±C86V8oolE>=g/)"ccTJLH0εpॿjמRp|_~{b(S~7yX7kc=D a.Z3Lا2N:/z҅@!|rkk~X-Oܬ L0>>.VE֨H.0>>!WA#`L Pj $ D2& G0@@* -b4HHg$sIeD&˭|nclf)͜Gf1jƦ5i6Xe=g"lf1fF5@?X,sx<V<<#A?X,rh䩠x39#x~Y\(=hŁ)0ۛobI2\n6(XB$blQNb %KLDB,W%KUDB,WBIb%]DB,Wk3dHTLyߜ,J,*X4QgnJ,*XVr(XC$b!D>l@ŶUD !kj$ZTz0HKz.a9zn__-\C5áð)D{\Cv%ҡð){l{5pT@ AopBdϡ%ՇC>`;<>>e[V,ߞIP,ȶ D4áX ~ ӒIE~fHnl :>%>zC+TZeHnUZKeATZeHnzUZKe5 Z]PT6OyPT&OrbY8>e5AR8>%4;5WUy-7˾ P GiQb7 l̛x 8b˻ HToDU`en(}TXM@GG$[,& Ci*m95T"Qb63e:L5 ڴ鈗DU`eڴjw ƇH^qc.W|+nЫ+?WKfLiȕz+躅1 ӀȕU+ٺOٟg<㎹ dht8^:wx 8/'puQN-ʩ-SMrV7?z{~eMdcO &2lu3$.`+`(p&-+a[5ڜ()Ԝ/+D9 ()Ԝ_e(R ڜZrBH(%VRsRIXeuM_m m8lp:(7 j,-+9.:T5X +77T3+ F5CCU><*55TVx\VqpڐZDAXPPUhH C~rqp҈_:ymnii M?\$M[mf}7/".ݟ.іaUV^(^m߁2鵅U VϡT ,U V՞Uis5+@K,rwO-0<X\` ۷ù$:GKX'@EL4*0WX`as8J3V0k` XIc(f~4 0aKXIc(&Ffbt.$ML]ѹL4121kbti&F21Nhѥ8I\K31:&(&Ffbt.#eb4Leb$ۺXL]ѹLdk \K31:lb21kbti&F21-^,P&pM)Ę\&F͋1Hz@514crv/(c&ƔfbL.#{Wݜ_VjNbcPF#G[;SjQZo8NE)n+;8 ƥ\fJ>[+SvQ]o8NEiz+;84_ ׿_$8M/?I bT'_4__?>8NI///PKф\bI4_,׿_R$&[Kф\bI//_\/ ~o!WK1q\I//_|/ ~EƝ!_K1\I//_B/ ~no:pϿ7n!.@SE PU)@)Vwq0t05>ƥ6?j{*Ɓ&ŚF dkx+^vnAOź ru;lvRcNづTG:0WSɦ7<04X\N%8Xx`i6s#5ֻ50BO)e\8_cvKG?ْO`|ˣ#7Z6*4jj TWG:@&PO- h0 50lj r09hr0 0lj09h0 0lj"219h2151|j&219h2151|j&219h2151|j&219h2151|j&219h2151|j&21Y䨐ᨉS315S]XtĈdĢC&F&FLĈT&&k72151bj&F21Y;萉S31"ڕEL@MLL޾,:bbTHbvf1!#P#bD*7 15#RɘYLƈbB:F:FLMLjT:&o11rj>F1y{S22ۥńDL>-&d$dԔLdvj1!'#Q'#dd2'W 9:95'#9ZlHȩ9dbCNFNFNdN&kr2u2rjNF&s2Y{ؐSs22ڵņBQɜL־-6ddԜJdvn!'P'dT2'w 9:55'9[l(ɨ9dbCNFNFMɨdN&k&ddԜJdۄBQɜL'QQSs2*}r2 u2jjNF%s2YI4!'Q'dt2'Kr2u2zjNFr24!)Q)&et*)K22zjVF2;4!-Q-et*-KCx77% ZP2]R==+ɻtGS6Ks%ynbjBĴInϕ] %E%ye<75_h0y$ϝ'&KL^SN^CxSΥMXϕ]y %ES%yeXw6+F…1иt,x#h8(]]Ŋva.K.`ڼ0%ob-_K7W1B7/=36; u_2~qyˬֻtԺm:d%_mE͜V׮E߯i9I2I2$$OF')`Rj2E10g"#&E&S_N)&E&S_N)&E&S_DFLDM,&ӗ&SLDM,&ӗ&SLBM*&ӓ LUL/9M T(db2}i2eE&S_N)EE_ΆDFF.ŗEF.ŗEA)œo//_r//_r//Or6!2*_{[0F %f04$ЗKА`^Q?~K~iayŧ/?Y}7LWpէyx8^9_ucp&.\yO}Z6(VUV Xx.ijD])X1:K^/0|f94>8gB^=e~`ud#׻",pyr~tD@%+'T҃?|Pi?To{X-nx厛#Pye(2qMfBJ\HI6$TSC0Ly TJQV3482L- v Xy" c3V'c܌JFRo{6dUPQQ)#~Iav6B&x8ࠢ8ht ֱ;AUEM}4cX:*}<╱TC<[A ߬׏끂Rf9G&ۍpemHD-m4] ZZ5!NKĚb !ᑈEak塏mXs. `E2SO1!4|%>,Vw_t]#9战[XsC>:tJSVqHڸ%};b^/^<.wlq̵Zh4fgȆߴABĉhtiɘZā ~qpAVƉl7sA ^;MձJd˛JŚOmud mr?yq+.̿<_m ìmqsK.!kw-TAf1s e)5( 21WfGoP2w`O00@c B14Z! ^cRK]>tS9fI`YMaNwY5B©$4MeU njc 'kul~TfúVQjl)VzÕZt7$ܦ{pϠ'pn$@](sAm{ZkMJ~%!zO}~O\' C`QGC}{t87@RΦQl0*}N;PJm~ @-#@/rtפW *C2}zxXnO1͡*koje#l;EH[s}2kNgPu6\:-줷Т+گ-l!>(ýG?}AmۼYBV"%ϳbEfV ^;Xx(0wy/S % xoy"'pnH8D ;Wc~Ip cHQy!.Ͻ 62z3=UeB^?q*Xȷ*aosa#cNj'Oޭubƍfi#2 #y_lpm%"kZ>y܌rF>-/8as SiMo9P 5(|Z|ء,\S@Bɩh1u@ab fqj.r7m !oC\ֲ6s& ?|&X9nxZ׍g G>A G_ @Gu=P IԋDEi$P xol; }A g=B d_~e[)ނҼ́qpA.r26<ъyt6 G38My{%{ 8GoAZb*|@qֵ`fX9ꄣ/ױO{V[d_v{<{BN]8icӫkwTxaU3 v'Z$vwO/a}s艫'm@GN1͎;Ĵۆ"_//w/&xEW=B"qCnUôߴ7 DpLjHƌVֆcG Q{/ϹN^rh:}ԦV%*'/O`gțٍ8v~s՟X nD0:Q{ToVG0C8&6Fύݎ{p8mLzUfú?P0x΍c c/ѝt.-Bt ~)L3l] yQI!nڌ\ zEsyjXSu[Z^$׎k'娼sy!<۞,kɉz)so{ ٕ6ȳ8ZaT^߻@V=}nONorAg̒}NZqټ{bn""dC2č(DYm6k;jn?AÍ\(TJ!j'P)Di?#6րsc&yxS. qp~h.jЉ|МT[s۸nZE܉ғ8'cy&{GǶ%̯_D@P"#˂OL4h_ht)GV"YLHnXC̕E5UC|弃dNb)i+ - ,4  ۷ql*Խ_EPE9X r"p:Q@&|tI0[n8EzNghk}l9m,5Fp+{~11n#Q ~UxysMO8F]+L|miaWlkvɪYLt*`ׄL-Q YX ˴J6$3qq &syys`n{jZP>/iNP7` I%JS! w 8Ft! ̪Y!-G2jzek}J8p4̵Q/G^-oJ jdm5r`QT?P5̬ǨnCbyčCS#PX5hJܤr!+Z\S :ٮ 9)Rkt;iIȖ"bV-OnQ  %fBN|pl[0}06 ,)Z6rN-qհI ƃ ޑ ڧ@]^Mg9G@Q\^ԎFAqQޕڱlA vL3Ut1M*Gs(4v6073M>%4G6x(^^4Q)Ƙ}&]rT9gofQKp*]?.oHNLvwDRy$s^wۍwr:5{n9YI>Owt>]gm:ؙ{*cR+%]Ru}lxW!x!v,r:"OIװ5 ~)~st{]oVSՐueQgO1@PŖ](`*y{ J#Ӣ4I_2Y$a!z5'ѿEH| 2PZRW.sL׏j ( m C::AN]FGXEr>DAw/4 f*͊T)/\o(C% D 00|Zj{;x"_ŏl-/oQ_ma${`yrt( ?:D܅VHmLB0#O˧{*6 1EE;vF*>YLV-.}gVgEZ(^ч!i)υYV"~6fI4a#Mh®h}dF&ze4QW4پhF&~e4qG4I/DCHFcmh"&4G~5D 4G~5дHSs8.7hiUI&PUDe1ud;xݚ 0Cw{L%\u[}-_]l|3..OШG0Y#B BMgS%Vam-T*D$kzB{ۑ5I2 Ib!I<-Iv4B2Ԑԓܒd͏c\CYH2Or;Tݒ$dh!z[D=B{[= g%ZvY"eAl9wp>o_'wNm"v;Y`CL+['d|ӁON|3KB@^'ztȱ p&xTF%+iY ۷QmJ%5 z[UںJj,`|JCTSI5e`þ;j*\Tys5ƛru[{q-jd\UT4r"\{FUKU yVgw:tm,:}珱=u2 d!Aj5K)]tR<,td ֮{t"zkf{:gZ9biQsUsʜe;ɎXc#b6m:1߉/]Ƣq&mKT]eU d |ފ`8'MF,ҴMS\(r'-10<ۣ@"UVZ TYtdHϦv7w夆VS崩@Ie1 'TZoy<[?iU4sV!NY#YD/ Aj*j+j]zzs৾͡o㯓DNR0%zUT/Lྐྵ[golH[FmU])S2]Wy1UJU+*5%ᾏ`x>PXbU*8IBU&Khqg,2uu-PYңjg]q6?njdC*lupϙ5tKBK\ W=&zY2[ߋXt'V4'9xs($Ob<|zr<F|'\Qp=KΏxjY1I;aoKidgfZ*sج QTJEy]1l/x>2/W8T;N6o<-QeVfb?ʔ:J) sKdY{u$`f:Ĥp o΢,>ϱR7}iӂho[Y\jVZ;Σr\)UY;I/? Qů O1Z%u4 %6(B:6YggcO#.!~C|rXۍ $6To7f^M77F6aJl4lbțgq L8X'+pL0}a^{L9ڞcr9aڞ{8Z80H='/pp@=G@9#kÛ[DDTq]RmJuc#(![AJcj_ w?/OdD"bE} Uҵ/]{P%<7]&Ɉ L(ԭRoaYB=ZҲ^Ԛ4k>z뾰EXJڢ\u<D`Nn1r-#lE{ UY yAr=^<5:ǖ"urTKՉݑj'闎n {!GUr}KOe$G6+U*Tv00X:ޭr:L+ TLTU&botvfpi(3p#)Ny T.]'=lkt;Y1 +5g%F# .%nS}EFbU dP *L➕UuT}+MGeB*# *`A<*"gRXC ZHAO@hH! )IEE5Lj}ՙ" U[`1W ysžXc@k֊}X, &T}8%[*UP'xIUlDZ| Nk< 5  /Wu"I'zZ!RrC끆 >7ٗvp>O˺~e3F#ykP:FLR!u'סK2Ïá萋,y^U嵮h$׳0=qutY'*&ݓAIUR̝&*~+T)^acRoWE+ɶժׄ,(Βy&+~}&a3(YتQr{Iњ7b6 j)uZϸOXL /VSN*²+dew]7wWQv.[rSknj߾{ӧi2$ItASWE6Y.w_2}%q>MHRI~yD  -~؎&|$ d~NŗPmmCJ9%RV[B={gJiMa@X BC; v5rUʂ2ᕅR{ZtYvqBPӛ5Fy;ٕ^X⽌']|:aq\AhSuXb4M5ruW*ֈ-P]9q:ʂ C.Lim6۴|c756cP93 Fcc}c|(MuM%MgjDs2.24kY^G 2cz6S+F |D*P,!.,>l!S Ife-͏I]:N8E BT( Jmw<Ƌx]߾/s k?P6ΰZ2PB6`LEMFB+ KE:ː&IfV(s6I/uHPUM5mT~*_ S"^W>}Ѯ>%+ F禇h?uŵkϱ6}S*>d~4E]1#C\X,hQzܪqօAzTLoZ?=$ >g@ F"Xso kw~A[fFU rQwIY69uH p0x^Ze44pg1?m5q/tQ̱1,ަ?坝zUUzIYV><]]=^ !WL=R7L9ABfHR0RNjtpρ8A"fHCB)gFo HA[[EhE y0+PG ZiO-%R/ZS VZE t~*p8,j$QW$Z[Jq9lpfp"!Jǔh:Y@@O}2*_7JTERZ*ƹs,g.d/}dt0~ݽ `(8.*>ä+i` n^D0vs mMGƔ slb6Կ9z6Ou.qsӝKy~Kxaj~:2s,zr3T]Bh (;l4lts`T(K<ͅeZS+VhQ:ͦ@=Ðv QX03s&YwSY7z K£$M]ԲIF=my:\cߜG3._:>nLlj]SOˮ.3)03Trտ\9C! & < fmJ@(=DDߤ"6Q,j=FF'Lxn'Z=! u9z64L>|.ڼCO.3CS'jkdQEVnX=NLq6`SIw7BgښsnLtdJb,m?<0[>$})5 VLyTی؝vj0;&1aLЎ zL:LGL(`BvLca/ w4tj]bLĎIcEcSaKLX11}:1 Ў)tj.]bX! BO+X! BO+X! BO+wL2ZxI_]Ŵ0IeX&ʢ)|C:`%6k>yq\0]ں}DwV{zU*lz,2($qhFXcuwH1BMXy#VuX~LXAUxۂ7& ,n`];,7r%\հ3מ+ \i3Wn5DL*E<Ս91Fx=q@b>ncL9v-j &C^5d@ÛՙxDGWɏLEՔEʱ37kD{\~Oķ<+)[8%DJ^vjv$֬4'V#F:6dѵ  GSȅ%ϣ>Gvxyg %ëSnc*_J nDxСb GLhY/SW}r aWz Z U"  jp"N] k 64ѫ~/ML7S3ξx6bmM6eIiez?sg|uʉ贸ЛnQX\ s:XDWb^@m.NqjEڪV"MB|ߊsTݕCJY Ȋo._-2JBx=g?f܁)j{l#E4Ssس_\E):P$={L:P Ş !2SD@cL;PTx: 1S$՛b߫jH(~6q߫f(=E-žW7f t@oqlm7Nȃ{u4m4aw iC"4@d 螐o1lzNñ"o ?[w63t&:I~DHJt"H(xE-y9b"A<`*S  #paƚՀc]ေ:45`&ȅ k*RAްbia#Z.ʇT+j"'r'~9~͋T<Ggs\җ-)T$զ`4b>yJ%pJ~Œ~Bu>j$(Z}ՂjnPyeGNG&d2QD<c,MgnȥT{L9dz.\ao ˍQ/LR {sQ(zPۯ>vW꒽M9TWFj)"}oQl0v-nBJ6RYwv.e}>B?L"$J# ỊB摗֝[x{_O jLz ˅< 9c2]"sE)+!m|̂{`ƣvjG7%@6cٮLqPZZ|{籶C?y_;yw~alML Fɛk]74񆱋7޵*y##o|rx_2K,L4k}1H58|y;kpϻ3FkFM[~ v&n&wW εݝ| NMVsVΔj\& gLrj YR 2Ěw5_2}ͲY%ώi;}8Wq/9J@K1.eӂ]:P$Šk{{wߑcd%Jb}^?R_")ÆeCAR׶br[:0Nbc@]pȠt"CBEFWN-狱Z\SI0jlRZN^6|%x7I]-]*Åf0f="|K= V9_or Q)"@Sc&P! o:YȸoQK'{Rr[5lZ;d ' &lnZ[2zv%TqGU8`+/.4xt2tS[/ԣgs喈C 1TI0aRRF@r5H•^_WP>j zX[*ϣPyo*RmFc6ljjI|̘g%y hZ#7!7P+*Pah9u*6'Gf.TdҊMVf,l9٢ʄ-0[>J5@2wIyQ.N[^):NY30-1>'P;,24 {n;%WG=CI@Qbu7Xcl}K۶ i)mN}fnRTPS޸>QlƔQD$:[.']"b.M"JRp'? #$Po7KL!}\-=Q6BJb%…NRv yibƴ[ /!yEʼZ9Vw'@ "-DĆk1iyKWy /"0ËzZB"X?5],ܵP]g8}vx(#7Smx]&Z Kl\N2eyyOɗsuxhmz"P+"V#ő?XH L aB6tK?Uh]F|܊WsG!c>,A" ğS݊91na$]8q"0iUc|{v; E++ eQt؁X$&1~)K';['&s6{r!޶+[yRI wℑu ?1o̷Np>nv@0߄u+S"abXĉ;xbp"TO)&0cϞ3o ]xiΤjcC&FS{JfXbLvqq8 {_S T{#X$  zNNƛV]@YK0Dr ۘtȊ- ] xT ^8b= c,)%1U6sܷQ d'ID؉T@i7yO=$Q­w~K'M69??STʖ_L~h54Y *bB&*p"R}Ea#*&aÐ;FӲ9dtNFN`hd]MeCs?&!AvƥJC}L-zaޛKkº9eL$uyo}`}5}ȞlPNohyr)Ei>nU|Pb=U_XԜqcΥ8uYb:2\/27Rx4GDhM-rLGGo#]٪NS[%xr)`REK`ryO9-6VB hʵ%ۍ:E'l=iS'D萎iC%{+|@,fާx9[j059yOA 4(zilo K oU+tEE&U߮o[AגexiZd_bQ(.W3D-o\Gf8\ W=>R341 Wo7I>">~/i5#}^=gS1}*i- !1#q#AywKܷ_- u˻Tn2nL7ljEg9?#PPOc-ĚG<]}OZ[l_{On)JQͨ~D1|}^ m>3 >Ogvۋoy{W6z(} C;^z@{_A2 b ywc0B*(:GG n֘YkAνj҈;o Y*0b;-۩1/e[c5 3WkxK\xyyYܩm \ u8Cv D0 HHoplcɤ' 7m-1a}S]) O 7tѽiO"SOrpe:L)ZZHA[n{֋J[2Ȋ$GnЛ|Up3\:{Gt=O@&5,00{$ёDZЋ2 x ރڎR[i0{"~Elj ] oG2Fז. , *Bak`IFq-}0+(В)]-|G&M7{}/shhEex6V*G̹dL>`e**ErJ+]Ӟ_-?ewB|dW~6Nq1&!"Su\64lW\`*tGqٚ)t`Z}i?ã '/웚-϶߿oI 2^kXW\ hRQe)P?)a' Bo@0 Z[$S Ю}wƴWYH*VQ#n|%Q}ooK'_+9t:j-{Vϕ3c  qQ ].jc>{:C*S* dIi߅X扗AcH_t%=<&li؋::CAԕ~uuS^O.GPЋ:9#Aԕ~uSG^ S5:Xu@ݛzbnAI J?gsn%Aԕ~uoٜݧ{| s)/W+cՐ-YA.b|VCoǏ{u (&q,zpyM@Uz;[MO64(;1wŜZ jig(2*j%\~W%z+hv_ Y `1.qfBK>3Ѭ4v4wqT[ls\NPcZty4qm 5'kH(R~˦i'Wzٖ G2=!!1֘9D<$Kow3}~v+J7o^p84GF7-KC B %T:z|+[+ԷHi.;8prx !X2+:p Z1Zpvq]ܢ: v^9ZQ#Oǻw?WR`#Ɠ?kѶr~qvjs3WΟxT1tjfD/wLܨz#kN7֠c XSY\,Ǭ}!-Va)6ozyQI^G|^G!me*i=vϓ\ݖ3`aC'+~H&ή(qk*lmPΑص30y0q "ybN$8/w?S2e-k3( K?i#@cnTM}%1 sjQCww?4vF%Dc9Pm# $vmDrQޣrvV9MkG`!5xpzC{g4u]ծʦεc`QN{~LYe4ul6|Zϼ3k_T7^o8ޝTsʡ9mL$X* pSW~+S^NaFx~hl*GT՗Ӏ9vތ?پ*u|W_uʹ$ n:M_ebqLk?YZZ̘' @_oUR#Qb9t*JUpdClWHv(:͛w(SG]2Ep( n҆h̍IaG_?sqTTA}jX$"nLq8 u臎j+g|ABrI^J"7D߷}Z:$'5{3\WOsCR$(xx]N߷zѢbȺg-wfݡhŠ4)v>fH]8Ŕ-t^4;t_&T=Kذ<ᔽ=BwiC3fr,~ci4l`bIHt.\-Nn+O໒XZ4c]nYpӢ}Ծ9f6݊@M!] fcH #nXtHLRy҄&t:'KuT.e}͠(Tw甦1p-/DHd2)=@WJ]$m8e\t`jٞK9N{r/P.}k_'Nd166d0d# 22;t_&X51vÅy42.NX]K߷Ij52DG6id\^]-cݗ LdeRqy98˥;h +TzO1Gg{Fm&Khc|}FSkd!*@lgE!.S\NK(aw=*]~(OI MBSeasr5:WPS6*+]6(dђ۸\$dvޓƕQ)b<i&4Hv9 VR[D`5?50v^ܻ_Y г_~40t) ^76 غ=lR=wGN^9Fc}_>F5Ç/?*bƞ!exfӘW1Ӝ}Uk勌]ff@ϛy%yuf>#oI8M4ZEZ0fd(##9l>c3apNJje xacx m`a71>oQ.%~]?,{ Ny n jemg2Sctř( >$ ܳF/b7=jD me݅/>>~:(g`̺+loKݱ/yWu H.^NP\]0C-'ؿF@R__&^KR]w@-O@/xe }50A₻l7<4.m53 V("Ũ%y%XK?mKX/M^8j잸jծ)D#8m7wg/Kg_=?]ߤJ¬ۻ YGLY b**tTD^ؗQdA\& $ ю.2nyKIP`$G.V  JWEr*.V1Nh98QΔKd"" %뷸"$dbAS*ծN k*0-rXUk}*q1megN5$LҠVg0gKGl!re⾼ynJʍᑑ2SrV8ȟ x-4jb ok_߷4}1?BxJcK'jNԔWw&?fc> "?iYժպo0?7yΕ)e2ퟛdr̾2)ǯތI*\*uR)I%|t:W vdDsHHŹ"/~a[9{Gy'<>f sz"+çwHN3Az3gfN+2e ;L!o'KyzVg=-p-w[#ҿlB,L$\>=^]˔wfy,a2[]3BX֐OYB.j ЃI >ma$w^3);9'so$d0*IǬm[IEEȶܶx"*68`?j{ Ki^)bd$#JVi)O V0hi^&DQ]H# XYPi@7a!9iR'iReq&F6f,*)KҬ_СM;MEwMvY u e\";~`MYfUhsB` pmOu+ذ! ,,l CcVc I`4+Ҭ-cK̻(XJF$+G@^,o(w==&^^J߳ЕHg1.\ԆQ?iiꬮW`Y|0ąd8\Q#V6 4gVK\hR/#K͚Y+XPF>Cˑ% Fr3J*FXs|jخUdoVοƪ]eF+ﻗFJS ʭ?`ϱ%ۦǚOSFH&,qy1fR9N!H}-Ҫ=+~Kծ͛E d+$J"z?S׏oW.ISb4{?#]/z !-%mB^ƏE]^3'D,)+'%_?l%pUrfB0 OꦗԵ&g 4?`k;. F _EBgJiKZxb]k͆Bōr_8p Ɓ#waF(.V< fy`QU؅e1aȾ^cS6:qcL]tV VI$)q}c}g}/-zxsS-Ѐݭ0c? ~G#5Bz&zZjl:~RXd4Jsly( j"@ #[epf=iVX"eh6?08#XB-b 8DxcBq4+d,!\׋ﳗ߶A>nn^Cr$aA~a* ! aӖ_ 8;4j9~DDG;C+9;7nO*hT>"@Aګͧú%B_ƏIw}8 M&HS7j?2vNQjC[Q $ s$mUDܖdJݮuqBIZGO6ќm"Kt5ё Y溂 " *P'DjY֩` ]&כ/Y+$4.f;pXaQ}㊫XO O>Ntk~*|@@2LU2V@V1b\s urYlr5[y1ce,[(ʠvab/cUZ=Ng˶ &t W1EG1w2ŢEk4iy ugP0*卺x=, ƭdI Z3ڊPˉ J$.7tNo?V);!'j,!R;d0HHM"I1|,,waPue3Z(K{J: 8b+π"=Ǿap10Z/0{uQXo6O՞Ko:|ư&a $EgivluLhF[iAA04 SI>{s`0gu\Zׇ%E0 ~}IQD:Ѧ<>Jk(0`Ys匽ۆAxH%I#/RQ&8BHW-ETVqcjqjY&ٵ]=AWW֑֓["b\=vω' :0lJ B=ұpeOŒ4؅=93AO EGkO. ݈T9j̮O eއ+OMh2&""'V' z?;*XJpCM25zx>ER`mҩwrw8^!DEE;X^ }WVÌJ |EbuT]P%=c8< EgEk-9 # 5_+z.[b8Fl/>="0eup N۵FŶ0-Vv8\rwm 4 j3[K,'hÀXu4-3V D+-4-͉S X0#aS9%\xh01œGP e.`N¬- ߾H#d[,?^Ϳ}3͝czx >seef>q1Cة.:%P3w M4(,$0:`0`3R1u9;ǃ ϕ@)K33=9M܉l^ul!~YϮ@.xc>KFg.g=w̃1M6ڄ60Y[8!W <*iҔ/pdWkpmygV9a3HȺlH`vbkm7bP#C?FE^.5SǺO@Qy,#YKk 80=spIܾ>yd#Raۆ˕e/T!H9dH,4ᗼ# "*NrINu"e&9Z)!aᎡB-c^Dm\5lΡ^ؑco/ZkM2h_D=cJ#@l@ oo[Q^n0 CiN,`x `{C5ĖŽ!۹MIP0c ZlMG7qW0'v Z Ha7"Ɋ:m lhܡ}̀9Ibok4]x*-""gaE7m)&Yb%[|Uw;򰯈qv1Cj)ܷN6z]j9(' չ9ex73KR@kVEuOA"Iޟаg;9{„5'POT9Wdzκ {v $ Ȟ:l]22Q&{ sPaLP4ŞIlcʢ`hNCSEDjBr"+Kcã;O2"3U~Ǭ ^t!+c,}Z}~[mǏ$CS na1QǔAm Z]lSP)!UB(L˝:?!]7nE|TY n;~NcN ϵ4-^;ķcoxyGylRYQ/D}уIy4r=$"Fâ]qW-;>kxJ:zHWB8yt0<Ƽ;P~鹜hD*b(xS+nnFe/\8BENW(1OgojM(u5t$ytz$@cw1zYCZ$@I&4V5PvO|5Çj׋ 4q,Iq)OP`bzr&SK'FX+y/r'@pA >@4EVAa /yȄo|I+͌Wʊo<2 {*ArL^iRP|I̕W)+'xd:3U e7tμyQ]#י=rTW(sȤuЫʟo<2z)9i6zwu4n/kϳnK˽a7:HTa7 /='5mst<)eGu3ܼxҺun.ONj=ij84FFa/,˟ N &0X(젒2(HʪYu##rm`6 -|+Z$#4e# +/y+-߿}`X7r8j~㳖N^K,ҁ|IcN|LcL).ww_M1%~*Ύ:#W>>d)l6hX$DfxS0L|Q=狟f嵾_f8]n><,xCA˺U+Sdڴ77ީRjn٘fi.6ՇׁսnsЬ߯+x1) ÕTڊNU9G N7Y9{R䞳rhXL45}/gYl>|/2/OTT|nRf^?g2yVr=zN=Q݌c#4k> XV_j[?j׳*BE>:ERB+$=asZeSlj/[X.dӓl=K6+7 7`DcI Z=DޘTY60i6is6_d qO>R4~1hHN_NĥEN#!H%^ \gFIåS-Mw%$T-Mwuhq\*BYu`OVU@ Ҝ_jܲ<e`sDH@fe|PW6(5۪vs#D7 {s<^}c mᑿjvIhH;up uF屜Lv2욖 ӋnaLmeT.Bn@TVMT-1z=DGd%jIӯyT9&&z.hSiyHP.Z{?~_kr9+jr"߀y8M;<7& ;h{f'~bNzF74˘f+TG;y$NvFC,X#i`fWW.= V<ۡ^AZKm%ޔrw;\]~)R)"5{5$$h'+Cۙxyy9dq]pȓŸJ/[s5Tzk-tYKGm;>?gsAQ8S 4F{j쯙f0̯Welma6 TYa.?X4/|ld+֢}Z,ҳVKaqM:ĩrz>y"'p@N{ΰt'?9ѓzO&rD k~VzΖk|Aj@K*,Bű¢¢{i8 ٱ 1ZBFhҳjQOh[ꈳ9Qg~oC{[})')Z^Ly܃tLܫKc#e#FIݪ*VşU/^Ur(n@V9}${w]G..'rI%yqz.]doޒa{Zg/zvQ;Jd04,U3z-_e<;ju]]pyS.m\׎ IA@|Br7KլѕO32 za_lPvcvGXX4C׎jm:YD00 []_P QE0T쨸VQQj<'I QEŭ0TjVI`ZCFTvQI$ R;*2#*{UTʂPP]T** CmllDvTQCFTvQy< caDVT$39B *яJ,x.vf+m=DȾiõ\({W -oot*jrI :Lnyw=z~8,ZKgu"ř簘TS&v.urc&`r?=˦ƥ~OI̗B =|=ݮ'Z>|.I1Gv9{/_Ɵm-(hxՇz̆P䶘OE~ *tZiHrDD4f%XƢ]wT /4 <lUNV:%ß כ|Mz֬ju$Dcܩ'08ոyAoAohhcAvA66 TxAAh{AM eqRHG90N#H_1Ou`zz%şX}DfeQPyL @ 漂j1_|6{@9o|atJ@tA3^z\ 5Nsƞ-R A&CiҘJ>^+Z51d*c1ϪЬA^+WkkT,#sKضċ zt-++d2-̪ WVX،eZN-VVHϰNWaQ3i2gXmAib13sca,Fs*7cq7?3b 3iUgXmYrD, {Z/j@2z'b|"W hX55bfD̚OJQ W|"f'y+nÚOJ K@>nÚOJ W5畢g(q5DܚO{"6]n',n>RD>䰀'|"XrXqk>,9l`q;|"XstX|`)aR7[|`)a;u^X|ӱS!D>0'|"X uXb^|x4>?PFaºԶ?bFgH & 0%N3>!IXԀE]X+aΠo Ky% -`qwa飮8d,%S_|;a*԰VM˷%CvGDwDp[f'Lx…'^gx$3́G(? @ h &@ȽKH P ,h '0<, H ċa&<£ / 3zx^.#<ᱚ&}x棇 2chza»ڇj>zx^.#<ᱚ&}x棇 2c",X0]Fx WhӼ׏OyrP zɁa*TT~l  +Jg\0Z\ͬ5 1`c~m|鶸nkƤ$:sp1fAsEг83 -d$h<B o/B~ͣe,{WE"Z~?fJ˭Pmjf#{q rjݒSĪ~~VϫzkSjhPz?^<Φ(j{!ܽJ "`#D88wBd"ˑXL9y\Cki*W[}GTb?Q ٭P[žK ۭp[ŎTY}"ɔ>FPmv̉ɲܔLQ(}Nق1Izz֢zJN="?!پQgۣGzԪ%.I7jrk:ou퍙ܘӍ%W~2aN~p^'כq 0_ ` |WFa2:.M,3O>R5 \\,ʉ` Ő`@*( F _8dI4a@.4ҋYNj͋u`o-^Ż0}]``Y`օ}%> Z vao f r@O- rD`fJ}>Q)fJ}ד9Ry~9Rys~9RyS~9Ry ,Q)fJvF<`P_f$%*ŭQ)z;KT[R>0}vF|`)Q)&%_bՇ*zT3Eoj*f+,ïD`hۿMͿʿTgfG1N}l5FbT̟򏅬8ʏ')?^{hxNa?غ73[\hgZv"l Nl uL /q2su_3Z~+>O>Q/ᨂp\et X`x#ZscuM";Z3[Ф!iBC֔|{uoo-70f͞gK%kiWu=Чo7+3Lx5ULF(.AM:Oqn6)Y̭-ax&UvxfJ~Em&I$~-It>\{sfFR5UfR(RZ4+{pd^ٓ{%O+EWv^ 3$G$E#eocVQcsC]YnݵA.$ِ 9a7nUg'#aQ5ٔ¤SW ՠ &9q[``_O x~=a<-A>%JuEY;z4v@lqhu?xnKkoaH_B! !$l+>M\( +J#b!!$lke+zU7!qBO¶KM8i!'a[']y=Y!'a[K*] 2hVb#!agMf~vfP4hV'agMf~vfP4hV'agMf~vfP4hV'ag  2KYT/ʔ #Ѡ 3t4dCӓ {֙:ᾣufp2 p֙zKZg.-~wGh]CKLMDgӬ@oos{7AZj]XMywlZTעV-}+u!ZȷU<.RjR]mS&;d{pЃ; ^,r`(Sj:^>|[AB(47DԙLo!z +UR8ʱ(PFtV,T_ r/kUv#Ävo\x6r3x@dD$đvO'O'%=Ig#<ǘ,ˆwxHyjKXJ%vwգF򃗳y=}4}nammvoq[٨WG&9|Al4L?s&3:76jVЕSM#8L3[WPRhۤ`2jV;^1H=xp|ݬڟ-RŴsa:4 RzȥJ'pߌzjLj0ӷ`r-eblJJIߠXHc2]“r$[]TMҁKCwwm^#oerS浚^b @V?ާAyh`prQ> ?lZ.Wr9ZKIQ]JBeء|Sng7c q߾ɫF1PlxwZ'njs+a#oMm:׶:XI:P,v= ~6.6}'FƓslb+G+O@^Y3bB/ohe dȾ˃/Ox_{}C/Ox_ۗx|Ep+bRoh `l_%Yhj&c}Il_ lU{/+< ~[=+~Aj_aO S=7v {WR-~EW"(ۖ6_hEUWvr\ݞb\qYT<}:7N,ҔJpEJt ߱+47 WF?4?|(:S#jSJp;W4% %=șڒ ECGۖTz(vwL {%`T1ԌpGNHtcdeFf'fƑSV%C(D>c|#=q F{|`;aă`S3F`8vÍp^  /@{N8V(a80+#DQ͡!x5<@A%h3)DžC`gLp!C[o(z &2zD*QfLzA 2SH}5L9v*0 >37_EnSd/eyՅ|N- E`c8[v H2DX)Nc|#UQ0`qQS(|t^}ӯw7 mf`e"xRpƇcKfj}U`_~~1:и ;jyW=U~4Em[nJͮ>Fcv }r B ɕ>q `:֓LJvsuзLJmh4I2mr¥6r\Vn<=DRP(-ʸr 1D>%8څNj8vA^5cTVC5R(W QrjaJ+ RmHql  PBŎVAߌqvBm0ojZEL`v[:dU^km֛~J^Rp ap'tgK^d\_g7}g5{Z,6N@~ql>}^|6(Q(K->n/{Axť/m#Z'[%.0s?ٻJ?}WNv^/TQfRGSpg?̗EMB|@ߑb%^cF>kbߪ埦zZ7za'P܎6sN;rtɫ_t3P-WUӚ#Л G/Bn[)Չο;q^ S^`qXl+0\a 6rnuXBA"qNh%|og/qY7(zK]رI@dH@dHhvP$uPC~vX\$ӭ?x`óC G k;z(%}KۓtDT^>%wJ:+?_̷'+A>%wJw8z>pm|<1<)B N*IRp'(/m@yR D*BlE8To[eP)4-g`/_*UD0 IZ0ZBDWJ/Xuŧ:yۿ0UJrM--#:KS:Pos$2L/&!,}ł/ȶ߼m)O;6am>/߾-󵽆{"6_!4 Ls ?\>\㕁yEX;OF `^b>x}|"'c]`^WlƓpI,JeaF|XƠf@{{mN"p*cTg;)#y2ٸsJL"FJ/1bgdb GbR!$O3gbk, a?0 Y:60#~`"X,w ~b!ؑXiH٧db q41~bXwxCeb # ~˃dI~`bҌ<46;25W_٭rXjJnӪv5xmnf1]36n֒#ӷayol_8[CuD)' ElBň4ۈ-HbBKX{ۃN|uh<wa7#{/3#:[j}weʳ"I),0""^fnw0ÅgE1R(DB"GBەP g!T DF({ Ѻ;\3=% S}Ĵ;ەwJLwJ7+};k?k5]o?g(`QJK1Sk2L?uD(ŗAu3BbpvRt8(9 yb"=DhϜfA6(}l 1(Ag!y ѾML1@qӧx}x90o:yf!cG7o׾ݙ)(|n{JqW~ew6X%NfY! ieGlP6Լ^6֕IIeYRa}wz Wj8J*YcԋC eK / lgV/Q_K65 qZRy+ l*r^7D NetTK-źx)Ó;Ta"E`'0|TLˁ8#)=9$1}"SFO}%AosPB=gG,QF^췠óXy~u#!Y+˫wbÑN͒7U}aQ@[U8SMv$v'^zCJwd KZBB i Ow{*B[LѧˑCiskK(j>~~\7hTC$6N@Q6J6Hȉvʦy ^|U/HZx-rKU SZ}!,>i#h.NNGJBig%V\}I+IY+%f9e2SZ(Um,bttp#`:'G*eq}qE$Iy( o|ڴjʨvʊꕑun)% ***;ڍ6ڝY( S/fyu/褕vLJae%av\z(&X'i}`Tb˜w3Ԅ)BxxMASKܠ̅w,ԕD+ʔ akЫLJVkZ ਓő*ya}Fü>n w,' M( gmtsu8Rڰ8RW2kW\s-TZ`QRՔ V61xtf LC27R*>'䔎'tHпiiUr~җR1+ﲓA$=V^y$YF^o׋ d"[Ђfz9]ȥ$‰Մh$(V@V !Dq$UZ\aV=O8^a< ,u\8zm&Y\'k,Erp,DwFhҬAUʆS9IAPT{ +Qr$8-)j$&8ѵa`>"4eBچ芊,\Hds8TUڽchF(̴"pNvkM(EJ۞FTtՠo׾Yxŗb<(s*{ULxhX?w- \+#X+/R13gek/B^EmvEVD]ő[\} H]qL@,[7^ٕ\Z}Kn:^; ch6R5yg tt38 lm/"Vy_7ɪd?LY[sվ ] xYXBv!.(Stqz zaf7ujh_ uQ+r ]ӂx_|3uZz;i׾a @0 3̞0;㛡aR&fOR e`hoh}0y=(`z/f=aaJeF%TJ߸$KTaSj9]\s8ΐ{xqax*C 0>83Ldhk6Y(OS_TbF(./+H6n"(LR[&xHÐ ! r!RC1d2!s1da$C0.<3cH4`(\ Ef0O#Pfq IrF > *=~䗙b$^ TH(_ 9՚X=5)נm `byܹTlPl?RlSAY>DHANef0~!9EUȤ $ jlY"c!;UUH 6),DHvl0_ɚM$Ԏ $lpl Ԏ /Q{1>V_*.WfuݑHe%>IyJn'f[%rpz?5.1 |ǘYW@;zVd1|͉_/umqퟬ37}/ \I%8ekŧ=VHȟ̡ o >ڄwh5Lz#kD\4|מ938Ѓ8A×n#9 1< ^A3hv$$m;gq]lAǁA hq$${;gq9Q1-dhy:3fjrHN6gqɝ1jJy@ -h*T lR!CҨ.Xw!. O|Z]^ r=LOУJ/|UAZFfX3d n'[PR "CgN@=g9 ˥0s%†il-:e:נʠ!8nߥKР8i{Qeä y:U~/x* RIv*YVl+!* wȣ(BSQ2)=nm`@ǭdC2P4a @+jsp?1Xz4 I*XY` ,݀m~FtI6] T1!sDSbXGHݫFy8 ր^x{60|ҝf䇰b=Gz]6㰫e {˙{|m%w5%sLH^~9,#0X~S՗VJ6P4:>J=_ +;+=:!Y'Eq"QZ}Un˴eDd[ UX6`M^Ww7z;'lS}ǀD@A0/HMQLšp(^&[\]ǚcDPBd~B4$X~쓦gl1B)zGAe.SupsΙŔ`YhYmz̉fN v-ZXbj"6'G0m][1% i"- -b_OP7^ 햪c* w@(X>YCsiE;e;:ώŽ<_пX+F|4s)ʆsᄸ$" mnjnCy^~:3/2 SVڕm<|x3R%֢hfm|ӼZ=L'Hr_LU(ӄIA9aN:7ov+k(mw{ T (H --i[d^a"\Zf_*> &mF',G^.F G"թ3|IZ,)Uɿ6"Mur?Q ѢbD8o΢vߖOˢMSѱ>py,'s?]L~6t4;3- Lx8g=XW &тPO; %GuOKצ(T 1AjTn7럖[ߖ{lUGkL DS;wᏙBtvfL7.)R Չ{RZ-?VƦ:Z/_"SèUG:=S)v %Ȕ^n%~6dqQ$¼W~-gɻi ʴhUP.; L/j7CgmYo#\Ϋwn7c2$׻ g_ޕZukr n:Qo&SfIc5kb eo??{n9s:ֶ|fcCB"ȽS4erfS5˼`IØsn#jbh/?p]_ 'f^#Q!7R|b[T43]c#Gsib83Tn*%)gc^B$y$$cI&N5uYY<]KK roʬ#Ȕ9~յOzkm5EJNjxw7x;݃{YU ^RޛCߪ֨goӂl64 _7ɾS?f-VA֐ İDXxwE-A}tVmZ&s2.|ZV ̾b*qP%T52Uj# H3 j12FeAu.@jTqyeoU@jTJTUfaPexP)V7_&M&Kcv'+j?:; 76Sae -ɲ`J:1>hn(pԅ5BiS̈GXO6g7j5=^|g6Lp HlqFFJYpj0ZL1xw(УRu-(C[| ݩNIYJ_Jo ly-`jMfW7x_ooP/ #ۏ- 7/d7Ty hyn_9xF hU-Z<gq;2瘑2si.;\ohp..ڒ@3K\%@CK1c-gse>< -+sv Yda\MB ,\gϓCH#&|7Xkޤ܅1N 6h D;((l? y@H;W/´!_4M 7rXeFQ uz1mZg;Hws]%*}c#\_[B]RL2N5il'r:[](蠲@Z*Dh|lu؇{u mcM𩪃E xlO\!mL$T>Ť77/) &C Ηm0,0K/ ߁kpihf b\TfdV3+337n431C.f(3s223b337>#3bF23'3abF]hfdF b\Xff3b33'33b&237>0²f>v7˺fܼnnFS|l|zU)Tzz4ucՏpŊ+2+[}aQuâ#Eݎ}_X ܰ``=8 a"nW/,nXbdP:%ݰ`Ɂ`Ѵa)7,52Xj X,J*ݴP92\WR! / ċ'u3E@M@C)<,RhhlbJI dQ3G@c3PLoX Q4$ 4!MyD 46U %kE@]M@C)*aQ6G@c6P/D/0<8|=a= R8|}Y$8$< Ɓ8|a}YD9D^YװJoX|a|"mXx7D>^Yݰ'|",pX'|"߉rV8lҚO% DҚO5Ne,m>e,m>e,a':--a'B XZÚO DҚO ʚO J XRCY|KOD>bYK9)|c~˅׷a59 %̻/x^-uq-HՅy[.fwGM[jamj~?/ G s}|iX(úXH`ÛnBJre&Oi;.5GqTNm-$srDxK9rL{ ɱd/#8b'Ƕ99ysF#3 ?Gd?g~(޻G>s-C5rWͽ^NtnݷZMfp4V:(ɫCU`MY!y@vH2nR5|!=P-?ٟz[qҿQߴ lo@mŸ D:XcoV2жPT*|*o?g!% ^5]yߖOGеXi{bZáѳks۶?Q9ą_6M'ٸm7&abm#M~AIFXHg:cEჃaaR\1>'ҁT .$nc{*ӻOm9mĎm7lkԯPdr:M+;a6AQQ&#zGx<",r/΢c,9up~z7ϪzF~V_&W7w-zޔrj*7<6w,jp4UBr ?BK-[u _zJ?Էو(Ǥ(x|W'WU9o" 2O Qv=q&Ԉ?RXnVhPW* \JGmغցYS–,0[0q&c XolKeԾTۄ_vn,ޥ u\/* nStC 0I IT:TpWO96! P}4+T JtЌܰ6!bPdqQm*F H: 󍋊lStLo֙yb96-6tg7`2 o:h.<>@ACCP2'f 4cJ@~CN.@?%C˥U0<@#%0€f @@îW@88t6R~QN&ۯ<{v6;:-td49*e909b~*9@0p+O4kg"W]ol># I*WI y'wwk7l?OVR Qm07Ї(6Mv4wƦn$]7Cɳi5U[x]ޟt^7]=7ݧFz~RQ5l: KrTR5mƒ^/6U Ih΂(41mi% YϽaEg^s&cW|0/v-6‹PHwDY)5G ʴ}?接Bҡ<11 dne̱\?W͎v+nӖ [k_~JrP%t*Q PvM@#FybOij{0ni9+Svvfd{ގpC&9$+<^}?NjYoڕ9)Dңb1OreuG9_MmeӦEp噕Vi*!.y 2ۛڵ.=2F^4D;tHA'o?$PVP 4tVީ_WAfVd,j"_b7 ;hig˗&Ty=yvXΧj+FhmS6kaTQnOg1 g`ɇ?ͣap4J~;A ; ;y,><}`,E;$_פX\E4X 4օf a1bŻ.R ,Cb|XblEbly,n%9k%_Ud@c)1+%NҨVJK>%>):LX) / )(j`sy{f\z4LC9Ӹ08\4 k\8x~S\E\wV岧e.2q9F.]PcHVy ][0uo7YڛxQ/y5>,fZZq:lJԸ=n ۱b?V|~X@Xݕر?Vr~X^j>+c~ҡLGJ>kaZ$6QgWfק84>U)ή]wG׆/?~*;!NN,K$B"IttBX'IS0ŧ[<=G:t#8Cx^ʛ0omm7k/ÖJ.^#XsRhWgy{;y?]|6kmnh E}I}PۼzcIF@jBI/U/Ȥ#ay#}yȵc)_Ey"ih~f3ۗo['&yGp;j+EFl.t" 1)؀4(ґg5Ad1$41I405/O&1 Ӹ +LĄ'%L=q'161a !+0a &!2@V jg1,hعٍq ;cG;7|x ;cG;1>t]йэ܂бSpdAgzF#th4Hj;rbAgzFV$0:4$t'PIA ^I,.֞@ӡY|+,֞AӨT|)֞bBӯO|+'~K$`[K%UDkk#͒I\$ZXQg/{|r,RQgrV/_)PxDNͫgwO\Vߣ] TqdlSJ.gUi&`R Xñϱxkzqw<fxỦ#a`(}brU{HwzW aՊ &ʠ/ \jccjNI`ڳ ǪbGRCaG[}kyz:6tUo>Iq9HC\؊q^,p&,:4V'EXAYא~[#ɽיdT)j$oW M켵Pk$ɽ᧽cILX"(=Pv$ɽWRBx03Q`#N 6z~ӞP|I∍8Hl1y[HD 9,J6s5?Y4 qxMl 7B]Läv=QڂB7Р5X XrsE`ƈC]}^K$cPc֧'2d [lMԒEIX #d%ET1IubPΎIX K?YJiv=0C=!G==Zl +YIGc80XGyl|ND̬nnN|lzAz*±iϹ "FO7F{LuJzMO$RH|` {շz:rKVNs(AvF!ǗZwIbOL8^L]ԲS`}5-~SΦzT)wuLaw򌇽96dТL UlkiB<9>IgR:EŒc_iW\ḣ`>CgIcaZr$Xng[ ~% c g(ҔjV#_ mڡ2ϵX2qoXIK0E :C3 klr{ =z H Ԩ"(l "X^IVbfI0z"ɪ=z,k-0m:$Q)TUΚRii} ;+So%)k4e5cw_+-}+i1 II)g86nW P\QjճVtJ=D5tcTbQp_[@)9Qߞ[UaSf{J$3Sx1v÷hO8= NIOɹ61Y?sXo߂[Xtho=6[h> nISma0j񊊻R,{Zl=!oCgY.^@?z en|=FtưYKw$f+`t-z`$|ÒWRT唰\=4zϺ!=[ne ߰e$6hP]DzgSD{+h4b-4#*3[5o+Dt,?h"ę X !&P3T'AAק#*wפH'zL[ήI7^bl?vK]8"s}R^Cs2Ɋyk8Q R cz1K>cY pUGLHbwf-[EPw&߭xBVr{k/ԧ^Lu$*R?7sӑ̝:bˡIc߈ |yY-+}- ~DBɘ@cD}>])]E -w7jABlPigؘ@d2#:V@| '"˗/2'_]{!ɗ'%#͗IϿ<ͿOzi}/OE3rxgBt!=/by[sL-QJnhnDۯ.'nq܌=jCs:7`)}u9q[ (n (鳺qcsc:7sc[7cd+Of?Q}׆)8 \gݟfQt8M}?]_T⺞o#IWtu<# hW_ZS]{-A¹gF6+¨?iі .m5wwz᪹uJX"XbE׮;mpaPNAY>iх|1\t+bHE$_VlnqRGqL8IEVD%M@W92@!T $AŦIP<eoid^g"V @#@V3 !Ⓝ!)QPoswA" -΃ mw$b 71 @©̍_QLw;DwDxtD}U!eQ9 e}lRBt=M=Yq: r5rUʷ .{hb@>/a}``t>JZ/g?ZJA*m=֮>0T![͹/j0 xN2n 4dm*dPPlU풘'wL*KEΣm5-|ERzZk HP$]E9Q(zBY"CE+ I4㈆8g")tsTU4_涼(<,SOt© KлOS8[ıNI<#d2rQR#c( 6ͫoaY)ү(΢(]bQmQ܀I?o90eb\hyO@Mc07cK c%"-6<7<磠./Yg(Y|E7wPZ>k}ti95RǣhrJ Şe(eyŝ+y>2 ڛBP"##D>e2*nǀ磤b% %),k-LCGG'U iɮTtw: ;+]s/q/&Q`%k1P@۽RC{"(3plحd Ba_j~Wh}9T] nAu(GE mEay}NC}϶NɿW <Ì J NmoQ .|j40N@B)d^H{x$:K\_yKg+5ul&VaV=uAߧDOyniמ6۶%?B} iwSȯf;^"m?/~_Ke8pƿ/m<9Y~x[_|m&E菞,^יmIj}(c8wHrMoyз JfŘIٞUYu>w~ںt9AhY9xW]hatr z ;ΚfaێnpGoXMZzUKy{JAzZ؟9F fkW,Х c@O5; t c$z{ t ^AO[fG]F<82ލQ/Y0Fhؽ¶-~\-NywNvVm'oliem'lU侱16Ct]uN(leXz{Xv¶(>cll턭j7~¶SdՄol1m.l;aKll1m!l;acdwq}7$()MZnQ&$8$ȕ6?ĕGْUy7%%AdnK#L# nbLL{$nL#Mnrk|X޷N_ϸiՖU.٫M= lɼ*?^}=nxƗ3KQ;#vov{ >.ni3m㩱~`><z&AYO߆+p0ESD0՘ݟVaJ0%a0u)2”Tݨ_a*0a1;: SGza1Ki0ͅ”%@To.!̺ۙ@ՠED0=2|v,r6dPPFs+$2(F#|߀#ABdDگ8YB"@#$+NPI9A^GXJ"@'$%v-'r5'v-%Rxv!#Qsb (!Qq:"Z>"B#*Nu̾9Y>"B#jN:(Qq:(QsGD1(Qr2duD6&F$h#l"tI.bJ~3iu2SJ"Y""A$"x/v$s@^r./vfr: /Y ):99^mq'9Ć^k̆49Ԇ;9QQ̆]j8ĆHr= .y p= .i {k|@\.sId5\\Rd5<\Qqj襆qjkl\v%y2-'v\Kj ii8xKFÁE)!|^c8a!tC^;!lG}wD@Z^A/2HK.ãE2 HK*áEh@Z2-I'VFh ']Ғph{iHK*ãŮ2HK.áEu"G - I2)Z-rI:bY'EˡO&d g-ʘIrht!*u|RZ짒&dt\NΊNj]gf`!bt b2* bwvrJ b[wZ WPky {P,..zayFp׸v b/ e6"4Qf.5%6"QbfnԐpqKhiFp7e5"QVՈjDY ԰FV#jx{vѲZ(⢗ՈjDY s˲Z(y2dIFp+ 6-i$4C2 $_ͅ'x|^c$Kg$3tC^'f$h3lG}w,H^A/2,Hr-zaUFph$d$h2LCD2[&#Ce2HMAR#-jjԤG{Nt&;ҢƮF?HMrA'mAjr# j}{'RiQW#v&7Ҡ/t?HMnE^!HMFZΟ ͉R#b NdF04:3;2G;2eI`hID7N8 &%(CuɈ4 ;*BOg@M>C?uJl4v!Bh!lj$D؅&Ɉ`hU'TBN &#ҀF/DAMF!酈4Ɉ4 ;pBi$ȡ  aےi}1=sOj4ovqn \GV|yR&o1|^zݟg/OWЦCFO0Y?_~\=^lV1‘8ޜ^Hԯ84'|7#{9s}qhot;{Ʊ{ C9|i:|̡j<{+FPǮ[2q9CQ_qhi|~=ߞ||:6|cyzFm>٫\}|1p/5A^⼾nNڈ?|sT?>>OgHO?ۀ[s8y^+O&NlvĚD'%̯?H hӵ5Cl _h4e5(;}ؼܛMo(i56uv7;NCߺ|)f`{n R-ֵ[eo?ͦ?wgֈ|5jR<$qUbp~_9_G1D9ӟ_n @'qg*S# z3UeP`n.r:Ǿ!_#hg>'z&ɼg34/c~['n|}609W/v;Kx]mLBVC ;?GIYRмsbzq6h4v]5?>urVg[vx?<0KyFrʭjuv/jwܟ] :U٭r cͧO½_/xnO&ˎ=}K˚] ,'WJd;NO*Aw:▣vٺueW闯l'HyQ<cݫSQM!3̔l)F)y*穔nHS ğ̳VnVڏ>`R"EnϟтyFKy["=3ϞyK4}ٗܞ=vxyOىDc߻y?]fN1C 2]N9A*mN 2 Bg!M8z/yP5%3^ćwyS^0|5!E=E.DeRtw?EgU+6H{/{gyQeҌgwY0:#sHXZlyHbgx`쇡N"PbޑR᧭v˩~#$j\bd\xk;wu Ts qQi)fWICf]~}̜vԾ$}R[>¦Yc"DDE e>l4c=N/X?զ2Ƕε#@ʣ¯\5q͠V/?fxz*u^Zx?U§I&m a$\".,km2px=) 2)0O (1M DV }MjpZ6;,_~OاN OD킘(}̧SoG.c@Ҹ  Iz࿷d;MMDok3T BI!VEJੑw2 (Vi\d 1)LG˩}j5 ;Ah7m@c;(}^'V#,f]n&E 6y< S>؉22b5fۀ6 󹆷WI:.;NҭG8sWZe+Fz9_Mwp'N H Zr1ɅqF"Zk[_E4t}UTtsW)3Zf?|.`(r}gDlk5gkmoIɛ pWwD5Z \';S{=#kVQw٢{ƚ6I[E}g~:qB btA*"6L!߱zp$v:G3N<gyv3?IlP[md<2uk|{7(;MFQy7>%׏j@NO>:GP:ö#$Vs>&;%yxP |_ƷyHf<@Dv!޵ xj65 gq({_9 4SoXH*(sSQ(-߿Nltw^{!ib`„S Z*A %%c?XTgg:W9+M94Lq6?&i.=o3e5^LK5b 6"% }Kx5w .VI$gSM җMMq?s:l{M>CMr{Q}H0!hx^!^y&?˕Xz+( ix+XP- Ð} ՀU* տU^^L"Iqד*_K'VRJРAWe@­TsFȾE ؜Iޞڠ5_~2}`׬g/&UGu BԒ5ϺJ4ryPT< &GP]@Fu vW8 0Ũ~A\ u򚡛zڒXf_-7U'u(4:#}Uv*F /~?~^?o6\|*m2$2%<r/2],6q. fl;Dڰe nU&_ o]bQ1ں֢bQTZe҈=UDѠxb]Gٌ+,9i0o&;v7/e$^Ogo7 7wQ.uO;N1wn:D[=Ysd+ Ns։T1\B^~)oMOR@HH"\ G6(Lד|9zή[΁ `zD9I'v2J Մ#yiPJ lt}7Bz"c_wDKHmt؏]B3& d'( C&0blOl,E!{3`hd9"ΧX2TcR u!-74ps <<7,q#p#|]ps9ۓp͓d']uύvI2̓ܒs$nT;Oatj8]wI:̓N`$ny+%I,y<ԡ̚jyV"mr#p;/)+ŴnV연)[陲v>Iw 3sPs$P  xd.A{2C]/7avEɳ˦ʡVo+& kؽ1=%*f(12c3 37^@}|~lt6P-B7q߃^/nº?QYBiB;f}X-~ָbRjl%#nubG R8 BGRh fL,PX{hzHM顁nGlOKp6=~.G nMGGi"5L/Sҋb3x` YTqOffhN*o,udBR7h¼\KD]J>:T&Q}r r%ٛ{(f{ryx"jLu`^2ty=׵Jg--.ͳ^LeXǎqj'Ԏo[fC>[+ukE!#wNW|qI9f Rşc@49ɏjqf g&,'w{Ub[p-G?ԏx,_~^ U3JYTe) $evIwٹ8pFX|7KuyYK'UQc i@&$&7_ t;r5yYZRN杚5S~GH3QJdW :UŪMrɖFjt .a_K6iM̮&]%T{^L#X~MZ7C#SA_DA@bdT a8 w3gl !>( g)j3Q?(JSΨU $Flat-LPUcCv{3QL1[/+BcO'b}@M@qWG`AHF" -')0Єwx95nL)nD0(T@쮋Rѯe(ZdC3^ @H ށ{R*jHMI_戊1Rcj/kB6ߋ|X?dpLxr잼/b%# vr?^$TF^r.7 o qmjڴ xAAUFlë&$Yu0!=&0$ 1߀D!LDIL2hcө,=ŲQO9ם-/X|XQE'ۯ,ߋ}>~7湸Y<3 z+ao?-'MMx(fŗu.%ٛsn.Hu̟K${.WdTǙ( bϾZ@͏VGhYW?وn/ZajA-)o,EI؁ˆ(# ދ8ǠwH=$=_Ҋ<=.hyن%{N0^䟧2^ uQhR^@i \O (J.?ŋb.*T%R3ۛe0$q ˴E *imsO2v]]poǜj%cBM/6R(qHq7E{"զ:(- Mόi"{V6ZD E1%q]E,P"$}1}aHè`c ? SQJ Vj8@$xF =֭;UlQtm8FwBڸ%'J9A^}\;Ge@{{*A1vzDq[m7ύrT]BHXv:=vt4glI}gh?|.FJmi1;Yn9SN]bvI*{S@&] AuaX{aNh|sB{h|mx 0%o)r>*::jqT:1Yt= M5ix (~8s9YO(tm`,gȏrzQ@bf##:c¶0A=VVn|j.nYɳZQQ}V|!ԼJ6eM{Yޘn>e5mݱ ${@7XUFv{{v|7fE}.?tU8Rd'ZZwzD! yD23 u;$(V Bԑ Ap}_;M j"= .=R N>?G)HC.Kr&_Ca&GB 9&03;z D+h|Z((Ld5qľv"c'BHS&\\@,xUw/fcpĔle4D;ꘆ8c1ʟ_Y71莈}eH/P'ђUe@wD${t!ZNVvdwM6J_'lw/֣Q6IV>W_Y/kzq+s@Ј*#ivǴ/L`lT W0"45N; 5 ?)WaŐY_PDYdԗbGH~ЈȾIM^Oj9{`z/dbmM80ۇQH؏}j(`JL)"0b?+% DRyn~erng?|g7՟<&E}Wr;Eԑx[Tk88v{J_hݬV'R+wt  G*u,hNc:Uitd'-_B\\ bbaR˨iEnϭv(.rV{URA38r4F4 Av$s"HJEAc09ܦaF]֦QfiAW+*)jAW(QT){nt|-fE4*n5'ĩqoЩvwc೘][1_)VL%;NJ!QkO*5=X_- $;KO/)+BsFGJ!bc8 `]B>N`,+B{0b% ӶYTs&&rFξ4T* 9.]ks۶/5xǟҴM}[;gl79_4ƺT AIVdb47cs-nl,G|ݭfwO͛c fc$NJ,_|j1nlq[gTA@w ,"tۍ}ջe^|曎ڋƆ!e&.L(":I>J^AmO=c#KoA PE78jg5s:Q#=O7a6gKs@|x Ɛ+q_NY"mTpl+4M㶡id4ЋyVب$U }jL%FwP^E^)1uXErOP]\VNNQ;ta9mƅM<1/@(@n]Sr&T.1&őh[AVtpHLUHPBn1 G\պ>(hYdwJQ { 6mQa7Z{-Iu տo'$Pc9F8&HFi{~&uH%1L#PNc(fO< fy@B Ш˟ft?㸼cn0;avI:U{ IRB*xY]  x_Ng̔/N=::V%K3lm{P+CqY (]SI з/o>nN1ζͩS⑴M:"ju0}9].wOlZǞAt1 /(jTnҾoMŜUnU\,+Ah)֗l$QCv-j ]}ؔSB0c9FFv^E'nJ u t,6k`,e- !1?T_^Cm+r f->O‹ɫWoJXT~f 7GpAx9I) ~1ټDzKf7@:^|*6o`ʪK{̖$y䌦}j鬏QoXl޼OC>a-'描Ol+Ml?7A![.r9>EF?HB~sWGP 1 :ȒLxq/F |ey6Al^313XDԅ˞ae5X_\Qڌ'o< Wهzf=FMmƸ̺H3YXܼ89}}{ir5\k`ܳH ӓ"X*֫s^_7WB־c~.{Zo!dr㦩IGJ#r=|lv=LT;٩AZS< +sR'E1p::ߪY(νspC^n!6PPfc*2礅z^Ai*:eey?ۍl ; FN=> m1&e56fN]$ԥC(f ?;=CyMG $F36$6i& PDh]'@ Sɇ} EşӱA veI@EXGl*ñd }mƌGr"`c]@ P/Z(n-t8`a fo &:}"?py7lqVvй+U=:hy KL5'L_rY& $.dn&me%R@}az?V"@e`TwF!G$ wMI$` 0= j20jpF1h2QID[(f(5]dJB#hos P`jװ-/L#p{mϧy@p>׷Ѩ<=ݩi2;\^(X=X}ЫXM~oAU* ,wr}9CRqN"ZM{lj8)'pr-VqMxdpT.*d}+㱥u/8DVzf 1@t0ň9*<;gmdMfpWٶLd0 :@uk>3F\ K$@u36N1 SCzp"^It&*՚4#P>biN#fi]PK)T^)u∴l٣y4b-uCM@^'"E4#P ] :FUZgivc|$iGlB%'T K7~_M+;*se5FrP|OpCFCF 4SQr %p͓*J_v#"ږaq}IJ 06 ]VQHFIhؐ;\A0J`#8Կ|[9F@LNK: SHRW5]P"(f }YXw}~-&H~Y56R(3 )kޜok[[W (t=KB.q $㨔\Bg':)D5 <G}C-@@-Կ%iwl*4G6K"n@-[]zRԺڏ$mb"[w?)Czɪ#Y@1B棷ÙI&;DYn15Z3H\-*soumbN1w9u V|&D-]Ь@R;Ehh~A' zt_}Q*uk Ka}54+R5qضcA 1f"41}Y㤟TtS:$oTI?(hVp053I>!L%'j괘tf@Y \#ՅBJ*j?)o^"P0Vo\kEke;)sb8YMMx9o*j?,-6(dUja=|&mF.-K[mXQxglUΡ;CG{h0!J;; p QX˗Ϡސ| ߰ nO2y5^>iԑ*V/7`1W;nڥt/[<&ixqSRNCA3}3Rg0<2gM^ZDy8LjFGdYB)BDi8<=qn͗!Rj{sj^(JDB9tmѼ!dJ >*%P".S1`rH(c[yާ cR [.a(e aŖ0)Jlǖ>K0u7( [io1u7$`d}H~X?$(?nG?C0 OϽc (?# h?$?8,/n&4yC*kUv:]e j1eA :j|sÜ~|r=n^MBG{90g`a_O/Ӹ{?m@]W(2%RR?@"q*%;SPgQ4.r :$u7)\\ J@Q!R(?@H 8"JMR?@H"h-T)@* Ip|mG 4 a1K||ǯf{ O @pB *PHP@Ce@ !! BC AC8!"A$ ؤ2@E w PBE ߽Rm<-;oFf?:{W&+~ztޱr~8ˡ^7bu?vC/ ~-zJ5tgd^bv{1PD`89}_d Y`q;}K쯪X7Tl ބl~h@mK"RD"as?Z)ZA_W)7RvRRH-RJީF*u ]:zx);6Sx1LNgr<)f9 gje}<^,@Xv8 I Ӱ;zQ% ֢NâdE]X: uY: zQOK@EE.Vه,[sʫvU]fۣ䠿m"N$ }NR4}3C]P܉cCP=0jKcJ8;ȡ=0jc)"Jc`RWJzǒOTDZJ@XZKiUv_0?:Juv9>Nn>g_//&WS\OO\*rŶew"Fi-%*A+(iLhwWճdw|kYIE)9׿ɫOn6S,yÄ(D|O/\SNcz:T2FMiz;z $ lnC<5\pw)K\ݲDK__o1M{Xw z\" #AXp =DN?2G±>D7h8D2G±>?7XǑ=<.‘p 8qdCKdᘠp 8Z8G±>27XDZAG (Q8-sBXp] c ᘢp 8Z5Cè 90gpϓyM.&Of_Jo6?*P+29dLXHI8iys+д4􈡦B-"҄N>YG5k^o3ls+ؼ;w/jx"͉J b5hǹD|p'kwiF]T~R- C(LK #%,;w/ 1-i|~;5(1jh? }77O.^i'E7_釧J%LTRh=rb0 1r]䀮mITT{s]p>mC0lϋR l5>/pU =JkKO+13Yy2El.7ggw/pW[FNGʏ+J"Ĉs+{pQbg+ IVVI.>ǖTlY:"1ĉ޲!͋oȈM$cț,_|M jx}ЧZYف1ɺķ+"ӤDw}ig2Sh1|\Ngr8^Jk]Ɇu8}UH5OU3:aNw?\#* WBr>üU@YY~^c~QMS ZxОA P1"gAcdC_tXy,n1KځMٍ"$*c P`CMk cGi9:F i|U7MǽC9s_8<l Nu;x(褘t4b5FVMMYN!@S-ҶM?:[sk 9PjABS٧"?28nؤͻ5-2 tn?\ua2z֖ 쉂З@fN!i㩣~kҵI*Я!@&>7Iozgڮj!NPʯnoh!pdד~zvO\,[C_mSmjĬˤɐYaA&jrW⬦TKV2'/{?_JQe~{RPeAqԂuQeY;̣o;1`iG;zJ#[cJ b#C3Vn O~" ɎNUPN>y2/]ѳ[ONxwɟ Ҡ)2ͳyN>]msFǿy *|9vRSݾQa%&s߀"@t$P*r_6fPRYѰ)ˉG$R˲[gVD_-L0K`x)jt٭aQq"3Yccb:/p>X}X̗`Xh(qxekaf8U[,,>8"Xi(q 7OcWQKo߼ f] ƁήKVƴiJ4TD8tڬ< &p,'ѦcQrYy?#\械$8Q 'LOu5Vmj`wsoEHw0Z ιs}ֲ5u7ݞs#6DYhWrGF*::b)n>of_lȈd`0)Lk‹U~qG5t _ͦ +\je#)ۺD^&B;Gʖ_ nxo;[eNm(\`N'㖴nqhjN`mǃܾC7MDĂg 9e-u^*JQNZݶ/x d"X8:h\)NklR%6cqwTD'e$%n5=.#6$ȪOuEH0Ambv9?R͂IYwqv *zG`"ٔydmբXͮ˲"2In^>ԅeh(߶)"q_Z]0bФ!IbTyBȕ;ZPd%63W?{W<}3ȴ݃Ьß"Δkfw`cDW>@mS0\i&W2].JRver4'KFdzeMMai6%Isf;:.^mIpFGoo&q5Zri9h"•X --:"CY~] Q*6Xqx?zCͧat n8d: 6e0%ʸU~4f]BȮZpppױ.^+nMb]MǁB%:d%'M̵+ⳊkQź0LgV%L_ypq=ZRCZ\tt>I\oV,d+߫]5&Pe8^v Wٌ% 1DuJSd֤podg jv_2 MޭQ'ʆZ֗Y[_b~(QPLSu6n䬆'Kb`([*N.*=xPה&}[DT0٘) I b] ZO] ,9{cڶ>y|U FBWʼQL0z=Q~e{XP .ʉݢ\_4ƳYba؊&ȅ`QjaMc!-'.E `דddRmX ?gWn5wb;qy.jB02n%,1F"n[^-軰I?z>43$+87#5,>_+4D'$Ю7svt<O0> TpxhQ䍼fe۬* >5ؔ˗ziflG`dJ5B3Φ.}\ÇRU(xsZ3K] @nl>ضfWd 5kI vd;uQU6PT5-ٖS#"3UT4|sZnc*tb͠[Nmp}5K^S2.;V( O] 6ͪs, 3վ4Zjvs6xO2cN%#m:geEܮT]vpK-ZcVf_sv=5嬼4.f"}.OAlwkpY~$uw5o?!V^RnDMY*"ߚ~d2X9ޯW%;h~:O.#~@?\kQҼZ83droB4„ 3->ޯ\zW X|$jQfe*OCܺ,wibj$Y_d3+cj̶`){ lkf-L?} t♺Vaׯgfk_G{e}E֎Blh=}+ joۖvUo3oɷ-}u[M1|&߶m{5oeL'߶lwی-c-%T[^~-e 2RrZKR-c-%T[^~-e䴖jۋDZo) O>m>6a*ҧTO>m=O}j>5O^ܧ껫O[uRcKoߵR"/Υs[@B_>>y%Wӓ/)ʯU,bK#Pyё^tP/]̾ǯ2~w'?z% "G=D|%+ݩGx=YY qn%8gz+?F-׭u^urYWܼKG۬ZT ͫB dzc ՗ld@U@4!^+e uaC]/17$z~^6Kf-Je]VDyK7̀Pj"SɌDI*a,Vn91c@Frfe>50l(lWeSDY\~,?PJm@_2 ĆOm0QD}0f ض_(yY#|1Kd܍xtNkse!P0)P{TIvZTiI']ʄ/ħU\LEH j ;p%3n HXG\v~gFa9^F3/D 2r0n`lRN\HkN ]$`_0Z!KMH͹Ƒ N\rŚ2R~xJEOSqH床4X*H qnřMiC Hv*:4!;虁&ё+qE R pHY,G XnaTibEjF/P_ †h Hٵ iwa5)c[60Qx6sa;/;gd+V5'yKqnuL؝]v iXU0&ᣗ 7.'۹$)}-=J}DU22JM%j=vA1o䐱`&HjՍaQ"DR%_5aţ }`ღiD:(,lK0lt-D1Q>JdF* k&'Ma }Z.g7_7fY @khFt?,IzZ$ubt4|C@@2|Tqq7dob-lQ|-ֳ=(V5Y9cI刞 ~Gv$ ~H0"WZ׍Ö棳nfڦ9dB\?Tx W+=r [NUa@D 0 Fpr4}F}wdwm%.0gÆ" "c{D! .:8S=qmh  AfHPg Z]}) @Ȯ_*ld 8UF-;jHQFk% 9>B]13I,!mj8Gk@H\9ҹayfH<bq aHy|-o3=Hub&Y AdtMdN G$jᅮ_@! O=`VC4" ЦTYn=锤uV:c%YՀF'K~rd!5_#h-]WMC)P< :SЏ Mjsɿq; 9sC/I&N ey-"^l`Q%Tg&2ʦ*) 3BO~9\rB1Y^yakĐB$WaNLj~E똀.|SFSdY1R 'DR~SӠ@vy0G.t#g5}UBQ_V8 N8>s+Y#iG' Q_?.dlL,Dc3eHa\aX$α$" _F5‰,)ٖp.4+T\ ?E1_G-jw>'K>.Kũem~tK wLjq^@b-omWbEIvZ,XqЕ䂄#SN5I#߯׷?7Q`fceK}`uYkƄ 줾:GfU/e9x kD-&!ѧE 6HεaCE"\(2Aihij]buJp%-p"~ɤY<OSXCN_qH[XE-bmsǿ unZeyuy˴ŲqH*Z 螥v53LRJ Iďݍ#\2;BG/"̹NԙKRY^yTT.Voin|'Nl$񃕈]iTSt=:X+$ V O3"lGuNTɑ՘H@}Y]~H|W#Z7/ޝrGm$YPMӧHIK@}yZT7$,scb P_Y)L̎ oL9?4LrQ(@  ~6sCoNbEx& Pazz7iQhfM(;c,MaϜ ΢ JUT}_lDFFc$e ˾VDR6kPh͍t`.N2t0Z*1Q;&/?1D ʾZ.k :i2vҬ!AϦXiu~O*AӍtIMP4Z-mMJZ$"c@}mNŐmi,d סY)̮0׃ECiXiQOXa4`4vbj]0"h ʦ|u0$_7 ISį뒨Fcsm,'+ NYib}Y^ рRzy}[|!B6$SNЀp^k! 14k#<زoXvqi3E!@T'눂D@݉!eڒZ#,NH9SQxNs.SJ\7#;e1v<ɹ:y>~14QbllQYӢ[KH8beQ݉!Ͷ\}]65hxͱvMܘ^( (goKL0;z9cȢL^6~vp\Vwx`l;79ٝ PϖkF;)Y3& kRKSEONE<:DRK_1YDâ4?uK!n4UD25+nHfpQ]A!`2|גR` \h . 96Ǚt Q꼭1Ơ>@A~[].iUSscr*oGJ}/m3vD]2Hv_2(-a)ѕ(7JJ%⟆sb*'%);N*Y|`1SXB9%Eb4 荟49,S,?Ds6501T ձ;5 |^ݐ菟1NR1Dk w^NyMdw#` NYAaN(&S!$wJ3aWTѸ6&6F1!V쇤ᢷ{q>xjp[=Rh\DzCsEoU ۞G?H̍ a9U~RV :ē}!]wkK#)1:yo5~]1#\<9#cҋlRr|R6EChREh=@CF?GacYE^h踰F6X@D2e1v<4\x\goj0c\@obIeEVwb,@}I|5)a0GZ58d\YNܬI[bfxF|&WfbD )lIc-CxJuJ ;bdiM0axqqMMmwBg`\P#p, 9ojC6s#ݮ dƢ.,4%V]R W5F@m!PRv\s\T@6c'1Ԇ񘦐F% z'aB Vw'rX~Z->TI7c1uM; òA!OPڸrV=`&mkh)16!ZJ7oσx]5Y'tzSAТMN}4 / ^Ul/g! %3r};b׻=~Kn䁉䙽AV1x뫎3uDMoV]]Wq_Wﻂ/ΚOspճVZ!!>+J©CU'yp 8KcamύPB&2u_ָxkDUhTl*;tIE0 UM(SN$TOe(~"7bjT>TMp˄mZcr&YA=ky2}Dp= uSSuz`D0 X&0C|#u1qg h$mmuIZO( DjP*}H]O}?Gh6e4nj'h8iM;/KUPdžȦ6i*ɑALܮhaЩG(mN<jw$l_dRcϾWCA{w!=m\A!%8q{*4m/ s'Hz\])MEdfoLd# #`(˹K&_N 6 *1 R})R~if^4n?&E`?b^c2zo^AcIe\D:y+-~ nY{ű2Ã(Hw+4VPNN,ODh!Վe_7́>bo>n Tq*Pn4hG9}w谢k9x+ G`nxvY6#O sfa_XP s<* зj~XF?~n(nW:6;8$A;4@埪k'IY!}Ukh"L;r obb4i@3- u1r/¦f%uD/4=Lx &Snc4Z'tSu]p 46-/(riBȣY t^-[ +=27C$7N2m P: <"߽Q^yz;13Y`윑>rc{f<Ϯ߾-n+ 2t!=+ˬtE#ܐf!x9\#G!rS9z3?_u0 ]P,řk!zZ}?𝫴gup>,).(a1v@2YY˵˂حNCc+ݱ[ Eܝiќuu?Z(#g)V笈&75.ŚlX^"_ b9pr]%9B(C 4͖}9L.porvG7G5H0`h}o(mmT @|~x 蹡a$4Wŀ;&k( C\|n$!g078D(8DDUJ,@Lݓ @fEꎞ#u7@RGdG!@(n]W5! IA''[+/dsu kGm{1ݑAz$p;f@^ػIRxEŶHɼ0L_ZEyxUuI&m47f&x%uygJ1O} DYֈsxaC!Ї'~NPzƉ w&|O "K0-Ġdc OFgv9++)"2:gn&#~_WI-Y<#l0Hn`al]l㘄hruY_N SFց=R81+cO7zР r[ք hd4 ^QĽ B# Kn:Ufћ')u j΋& Ѝ#'-N-}ߗkbx9r ҥl{I:ك2 ._7d\&cBq ѯ뒤1&MN9T*++u@cn"EB%e27\~}uZXzN Tcbc30@h݀TZ릡*XNf P\֫-Se#{#ΑgGF]9[)Lu:`IT7#?~ :+9,s,f;\s]KHE:fQu݉ьm$lzIvcDC sc4 I-- zto9vUذqUYvluG*VY#}pv݉ф2~Ψ?؉;=&t;_4i7K$j=EJ4 hgO(-cgePn|Z4$WnDk/}$"-1Xube,,#EswٱŦ tyJu04ØaM3 U.ηs#e2(o'L{1e1vZlXD9Y)D׊E弒RgaJI|:.wG+z (Tbr=xćrJ v He͆HgqdS\ۉ功R3@j>ntGύbbrXIk*;zC@TgT.IL pPP81w)Zr3c*XsƤNkɒGBZVa@">Z|]I2[Ds#h|O _'(/wji޼="uZ4]R]<qv~Ѽ3g aAвMV(g-q$8qMW(bسwO"q|{bDɽi9V)TwcǦ2.ŇurWVGͱv(;N QMô+|1{s#l<ҧqjlWguSp\,S1gWHfڋ ysv+J3__~I%q@mGÃJH7G~z+ c@x_yD JH+u3{(N3LZĺ?B?MA :ddR}Rd6!F b'ycPK`5,. P)h1ӆD:xHimDvB/ME2 i2V#RnpI[Oy,]J](p5݂?$L :VU|bk~Crqa1Xk_zpRj*w9|$xUTQ-h'ZCQRMG(6(^r=O2XA@S`!bRL!K?ARf"d2$fHs$D:EZ.qպ^y*0lOCf̥ͧVOn-g5չ3(=.nw=pJ!$"+;ɒR pXyx՗z[=$ g짏pT!c{g7:XU2<6a8oZ0 cM/DV^θc=B9 3'Re7Wi\>TDJ0DjG@oY|@۹h\h;s\vTvJéU!<^J]dBEJ)B$+i}"k.L o\WWAK:־/2}ȎvBDY<rݤnZ-6Z΍ ubL\62^xSfUxGO}>Q>?W)\?Ȅ@'1E`y6齇:eyI[q䚅ӚEdL|Z2hɺ8DrD~iɠ%{VݢJʯ:b|(\2_2}Z2hdKfKfKfNK.{%%%%Ǐ>\r\~i%{#)~NdÏl޻O@%fE2&yKK3Z 'Ƞ08:^NTCv郄I'e0I&(r_ H0? M% `:}*N;dř .iDx+E h²~{LR?;N0}P.L]ULK"^a3u6ѯ= zwOFA{l_2$.ӇaqZ8c I :ϗ #/tҳL:\M <:pa!/S0ѓ2X!EpZ sLH3J ҏ0[]<P]a|ءVsݎp@Pm[]F5 P ͙#MebfݛNTsLew@e,G٫ LRv'HԘ?ҁ`b_0Y?GQ:F>\ ,hgx#_ Ĵ|0|ObKt0&F]BVsRc'?P^v:2h_ks۶I'Mw6;ٙC11#^(J#f:º^fR!bi{Na CJЫXF]ʻ'B6B@3Dug:6@M^;6"uǩ4|P`eq~R#'aUM^D7Sl#8=Z{Y=vZgiX$ܘ]%u|nuw8g8DZdQbG7M[D >b]6[B1zD3ݾ6Qĺ=&pKYGlW}:r3ؼ"BW_?|'k滎M6W늑ゝ4&B4cg\?avΪݲuӻQM>c:76=1XO(hPtvFW}>`sbGؖm$Ck³zvO~N7nF3-fr$PSOY u,vr+Wթt,S*X*aO9?8 c;S1LJ@ˊ^`ub4YL</!/䜘s7MS$rC^DRDDJgyFlAF9"yN5! Bwح6$]CG t(>b?thԂ(jBLL 3įNMB|g/) /.{a@DN"/1Mɻ)ф3CZ(6>rO=1!o"Md)ۿV;QqG!QR8s=$78DFV)"/(c&aS&${U)VpKlp6jF[)-*XI)Bx>y/M@ QWʹ)OFb:a4O8.ֺ'9ʕah;qxNWŧ[F1X.1 Y{Y`Vɹ1 ԯ,T^k_4`p,G(1Ԕ, ؝݅Eߘ'exD9p~e J"Pj[DPF PIjx, J>UT:.2سobvC-_D`'D5pRwvGˆA<7bX&b~Ert)WϰU v6 6EA#1ng"4|JJnOXfùs2@r#j><|ΰơ^`& 6"e&;8+NZ:1V7ٶϞ{[bLri5yغbmw7WFxSן-vg #fSէj$(~;̽7Ӿ/XH@֬0BX:ղNF+~+ˇgl#jĚ&:X'qFi04ڑ\>`g{(J߶3t%]%7"D,pJf{]\ _CWͺA`,C8qy@^^@ޖ;4M~E@T 2Vȉٙn}᧘qD`<  MM*V=]nS@~gUf4Q[eDre(k/^%k.xLB %)P p"4 RO_dQD &mD_iZC-ec'PDc-BA(6}j&:W'RϱGmIN6DBÇ[@j 8@keUPx;\%ݒnk쥅p$dQ:"FZ^+#w2)M _(\&AD/(գ|#hj_dOBeхN4?lK36:z rEsс+L#Rx =,DTRn},ZA%T^<Ӓe+K֡b_/5'H&(/k")H<"fAΐ68Lp5aV㨀س 1k5#6+pv:NvszyWlV{jVƒ׊Ty@ <߾TQ8\AQHDX}A4,yߺJVIos[!(n$^Eջo0) VajTMէxv[`e7ldsq#1aˆacATؖ#$W#C"rmw qjVתTs9['Wv` .rv`@a7g*6ɜ9̙9:p EЪFVY.+{!m/x #zSϯ\-&g N*O+RB"qSX{8%){ƭ.Dy;aXRZoQd5n r~`ǐ=YJ]a°q eF%6-$w6"z#E{_Mޙ|@ Uh)Ҩĉ792g/Y+Xdkjd_hjwxSЈ5}V`!]bd4{5|ȉP>؅jt#">l6q9kLJC]"_]o'bXS^NHVx_lMW+ [_w9GO.ލK^B!Κ%f:!O\'oM"lHqpV3#"\?aB66VkXjr~^I%ޗ_ͭB}1oi'K>@jՂNDR+rNV]DCycaJM\*V4;[?*>Yaİӱ v@5&Z=dc'3tAs/`T؆2ØT|7_5b$8T+ :VTъ İ"JZâW+j;~rmuL$>+k ҤHZaIK*9DpC˳g)M AUX),-Lhy1f߽+ PKLc8;;[GSD)8j7:)8XD^"@0S':q2/i0"HNjt<9EcKlP:B QjW֮g;EI;nW+Е~H)Im q nQŦD_]W5*FSoaHkbnyKHv̜gnT|Ozx)\72רX͒`= Oo^/7|(VhC5&",\GԹ1BN@·C h$OJ4\4ZWX䉢Xnh+/p\E^5cmٵJ[7k4}̙*,s7٪Iϟ/fV+ Ϳ )~Drtg:ؔ*П$bޔnka %.b Gԥ<|JC:/GEq Fsty?jS'#i}DA򔋢0D0n5CGzD/>z}dw0IFUմ@<)6!F E:϶/< $9T=$p]+r(dNqSO( C\>W]9KX E^[|{yOL)$0=̤tYb7IfLe nZl5"Hθel8zv>.<0P*vDҫ|]5!RkUz&ORO^Dѣ:Dضl,|-Es! ,XWy6ZUXQ6W)q<ڜ:cقK[ݽV4ǂ~ PrcGN7j\ \u [cy:WW.nLkU<`~X:u85X`bhsv75eaai^U|7 u#xeqEiW?aj\}r 8#v+jJAMw#O^@vG"2j[@oC(FeOIθocȺD!,/>]sĎ/ζkӕz_'DjB8{g?ƪEML nbI9ت }m}Uwt~UbCǶg C(H'FTnFbv^jJ;FP)8N(_K@ yD(~o$Fy\}wMNe 0׏ŗ/ HNrةCFi^bfq0pRmbq>XO%ZPiJfMT"7kc5ܗH4v;: (' F5% 'TakOqq5Xw qP2YȠf. X7yĎ># }p7Cܵ+J^w-{N}8=D|:|BhFz!_/[{% fOjBB6ت8Z:-䲆H!_ˇOHLCȫFNIθ]#o՜Z>ZgH!Ыf_#R_מ]%B'>j'omq=]C-WD&dOso, bosE΁A t,`JMz].w"o}_n䨁t,_jٿq"3}JFnqlu$Cۉ6"G?DmA^V)˚,9Gxo6@ pMh:^5mwf ĩ71%-wXDTr#%zfg@8'TP ȔXk5K&+D}[epҁP[cqe(k.bT4[:0BKC-Ht`(6Iv%+ NQ؉Z8m|+ NơՉT]ٶ!g(R`A+|(EcXS ZV:$wiU Rd{FK֤Q' =vJ=%7XZj:oyyԾ&\.% "GY j~9]r :ѵ`^2zxPusdlAkX~56a,28s K "jQ){>ޚ[ 9(X䱖\yN 9_RX,%cZ[0DL^AnQCBrĚQH,bH`B΄-Zy:&~,ʻ9FQ ecATKB%%d "ج5r֕vJnе"U8a|2FŜo_d{$%ANQo]$L&($Yᒛջ. Wk5*Y|ZO$ezu6<Ξ M)?6"5z#eShPb[3d}dݣ1 4)қaku=V6"BF~X㔑_a"PWr:ªwWz,^1Q_x_@;]a4,jE?})="ڈ$/U%.] !,0s y:Y}/]G\O$FgiLTʈ'/Om MjZu`!hKked_Y!(bء PW~ XDCy#*M&ZUYZvrgݲ3""UVЧKN2ةNИ& =ԕvNfu(ĉ*)Y .u⚿;|7_5wb Tz3U-%2[" "!IZRW+fs+oÇrD:!5,dbI9$|(wy !*(R%ݹ]\}& W9Z5:pR6GjŤd;]D$" kmu 2%6l6`:;=g`7t0 }.|C?t/m5BX \{/vڛ`#!S"3%mAߓΕvuNhMr$;"pqoPfP.0" Y {tÁ}qm}x!7ی@1c "q[ܯ&DЫF ]Y5N>϶KWB_-7zђr( -b#+7GZ-8X j)1*9Se_;}\ܾ]kWI?Ng?5``)lX<-R=QfFƖggv}%3FčO/spha1(4ȌӲf7͘Ua)!n\VfSjJ]#|Z.P iA)1~$W"x/A%u~ɄC2ȃK_@@ސF 6HqɶD F}/EĮ>aq?}KZX x$mI0l6qRV2cb<0!tΩ[Geyz`)OvX@b8Q m=jP9CG1COx;fqNt:qj Pyl2 ņ& <Ɔ#AC$:I Y∇739~6-s Z7oBh o?v`y:9UvඐIm#@ΟQ\gAĠqbLt֟9NjcQ<% )^veԸ tSZiƩa %/Y`o.V TEG$?hIGr?^.zJ҄b^#.jC61r}ws692`.3]JGh9*M b&@Ow0gGM};}'u(ODi39 *5gZe@Jyhk[`5|׊_:Ґf݈ M4?\-q)0D Of9tASS%B Lbp$C B^UOgD9JN+ݝfպRcǬBlF8cչ64<.ő#1OFShF¸u?%(i25t4ܕe) o3lEcR>eʫ S^WxcFw >hH#>;6품A&;S Ld`#^}NMmc1( +K5D֬ \¿Ř < OgAK#) zeqs#Q4>wpz~>ISru!aA:f[F1gn]G@[x@U<#R?$Lژ͒~~3\eț A^ \PC(66@CV'mQD)$N6nDɛbDKL cX*|]^M @Ab\ĐW\?c"g a)g4j`#Nfct^N?٬?>ͦsAw2`.:=K Ji%CrdBf ٧ŘQdBM*#@cl)ge(,Q|kv1E9n+xkOAIXB/%1eP ^WuK9ýefoijާL~}>E^t{/!^4 eǤ+hJeRAl#ĽIFߏ kUla&6_z|}!cض}"ʶ DSn/6/|a%'el .6Iۏm5[#KG\qZa(ۂJe=KjI¤W<2(W(I|bA6"GNnj1ys(IjyR+k5W#̕K-wf'V-l{uJB%Q7*PQaیlt# +VtS6/X ΁_z @F8Ӂ1TΖɹ&C >zkgۚ\MI48W(\,y\8<4ƱmC6}epG}ZjBXk[D7I(W&8"ZD\&;SK,=AiP7g62>EhM$W7PhW^ ܜ%u8h(MԳO45څplDӈ٦@lKfַ l3wa(pz2Ƣ<6DIuQnrsZWJnlJ!dmXw/'ȚJG(bܻ>FQߏsh1N'nc^!C?j&# yАO3dYEQ6uxO)Vy$ Ey&8|t>~ (-b4Z52r  3h`۬ A5k{sx%g-(frzMuR9׫4W~uub0Йb$9\[cQqB?WVy)j>Uik 7s=8V! IL%D_gqe#{H 9(a다F7/b *`C(ÂҷPV[c\Ir67 ߶j#1Og\ℰC-@GiuQY֮s3Ct2*2EUe)Uڀ=(H):D'>^.n_? TȃPF-+9n/t9H =QAvli%w*7ѬM**PդwV% >ǡ&A! 2ڦS"IЗ$~\$ώMC%N3jbFÁ[BB VHVPB1+TZdOr.-tqQù<µimkS>_b@l6(#{OTIȈ'2uٶrfW艠,vߦ4ۘ&8^}+)${Xn6$ 9\&,81#ƥ "DqiWLj1Ȫ𔥎wR8sG[ W hnqp 84gЋ&t\PPԈZ#ѣ5+򐐢S0B3xqrզ1(VlQbm^7|9yI(QsY=l̰zңV0 AeG0]9z_o%U|?#J1į4 ݜFHz<_[Lт"hRcT9f+pwWf>q#J·3MAs葒hxT4Ű[D%ԣ!pD@W:zr4ֲ܂X9%iD3N r]T8鶀 G\} #5Bpu9n f).OؔD%UIop / s#,s'*cI$wGcVd*]8HF,4)/0"`PICzڞٞ *'+d{( FռM0\1Yw`dkiV'hu`RL?}Oő6X>U_J=Db(A^Ho[G]$lrse0,i A^f=-Ǥit52sB7#>p`tŜfb[= G|=W{ IZPejZ!NK7m_J$l}4[;s(@a0󈯧r fH Q x'(if{R ]vB07 6ӝ %I=1Hne,_KDƢLL쯞sx׳|5[l,l1CǖÖ}3gp{~\<`,@Q5*CuAW)8\8$vodim Dp.G 7Ra|9njT0<:sҹx[*]J8 "Uq ACN)rgGfk%GjS~Ī5WFGfDe`-2AcA/~× aبCx¹|[{F VB11fHI38f=G\ߣQ0lA[ҖM;;ڧ1ݐ K[2 {D+H[1,)aArgĆh6[iX3f kk"23P!K/0kE2 3;^Kno1xuLujb7ǧt1oAQ>j+=8.6*I@ I#/*x¦lisfy6,U}lS"2}2hA1δ[| FLAـR԰ghqXl`ӕQJc_{4| Ÿ&ø->ʸ ~)70 ڷ.%q6Ϟeew[z1ΝVN!瑯W#|0n2.Fj'nMCu2,GdA8caϦ7GU0jo: FnGj SZZ$K&ձ&-==co9<0jcUa][ᵁE Nt^Ьc;%|CWݹ(A:yK(rjpԩ4(yl;G,ՌrүqX0fDR܅MRaY#o^isX|;9Woc)%o"G5BݣVx<{u4<7Wg`+1ҽ VTgVǛ􀛱lCRlAOMd4P,8tGASF8??.m,jfnVO=4_|w85(Tgu9F2ZIiB \'S0YM_=)#>$u8c >F϶(DGYY ˨al%lA*$CWil^ pDo_XV'3LV0nu@JحF2U7FM6K\ uiDXAy̦+cJ Đl޳wcxpEڢDl6(т .ʅbOiZɍM0-P6nD[C)XP;*+ 9|A&cG-8aCcK%Z$䜟UXX>GoZ'kUUcY<::? OJnpI I\ӉlA`x4A5~{[EsS̗5 ::jKCz]o\q8t $5\sn :LuWs<Uh*1z}*f.kֳܖo|%1\E/x&; k}RA'eAeɣps # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2013, Even Rouault # Copyright (c) 2013, Kyle Shannon # Copyright (c) 2014, Google # # 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 ogr from osgeo import osr import pytest ############################################################################### # This test verifies that morphToESRI() translates idiosyncratic datum names # from "EPSG" form to ESRI from when the exception list comes from the # gdal_datum.csv file. def test_osr_esri_1(): srs = osr.SpatialReference() srs.ImportFromEPSG(4202) assert srs.GetAttrValue('DATUM') == 'Australian_Geodetic_Datum_1966', \ ('Got wrong DATUM name (%s) after EPSG import.' % srs.GetAttrValue('DATUM')) srs.MorphToESRI() assert srs.GetAttrValue('DATUM') == 'D_Australian_1966', \ ('Got wrong DATUM name (%s) after ESRI morph.' % srs.GetAttrValue('DATUM')) srs.MorphFromESRI() assert srs.GetAttrValue('DATUM') == 'Australian_Geodetic_Datum_1966', \ ('Got wrong DATUM name (%s) after ESRI unmorph.' % srs.GetAttrValue('DATUM')) ############################################################################### # Verify that exact correct form of UTM names is established when # translating certain GEOGCSes to ESRI format. def test_osr_esri_2(): srs = osr.SpatialReference() srs.ImportFromEPSG(32711) srs.MorphToESRI() assert srs.GetAttrValue('GEOGCS') == 'GCS_WGS_1984', \ ('Got wrong GEOGCS name (%s) after ESRI morph.' % srs.GetAttrValue('GEOGCS')) assert srs.GetAttrValue('PROJCS') == 'WGS_1984_UTM_Zone_11S', \ ('Got wrong PROJCS name (%s) after ESRI morph.' % srs.GetAttrValue('PROJCS')) ############################################################################### # Verify Polar Stereographic translations work properly OGR to ESRI. def test_osr_esri_4(): srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["PS Test",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",-80.2333],PARAMETER["central_meridian",171],PARAMETER["false_northing",0],UNIT["metre",1]]') srs.MorphToESRI() assert srs.GetAttrValue('PROJECTION') == 'Stereographic_South_Pole', \ ('Got wrong PROJECTION name (%s) after ESRI morph.' % srs.GetAttrValue('PROJECTION')) assert srs.GetProjParm('standard_parallel_1') == -80.2333, \ ('Got wrong parameter value (%g) after ESRI morph.' % srs.GetProjParm('standard_parallel_1')) ############################################################################### # Verify Polar Stereographic translations work properly ESRI to OGR. def test_osr_esri_5(): srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["PS Test",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Stereographic_South_Pole"],PARAMETER["standard_parallel_1",-80.2333],PARAMETER["central_meridian",171],PARAMETER["scale_factor",0.9999],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]') srs.MorphFromESRI() assert srs.GetAttrValue('PROJECTION') == 'Polar_Stereographic', \ ('Got wrong PROJECTION name (%s) after ESRI morph.' % srs.GetAttrValue('PROJECTION')) assert srs.GetProjParm('latitude_of_origin') == -80.2333, \ ('Got wrong parameter value (%g) after ESRI morph.' % srs.GetProjParm('latitude_of_origin')) ############################################################################### # Verify Lambert 2SP with a 1.0 scale factor still gets translated to 2SP # per bug 187. def test_osr_esri_6(): srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["Texas Centric Mapping System/Lambert Conformal",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",1500000.0],PARAMETER["False_Northing",5000000.0],PARAMETER["Central_Meridian",-100.0],PARAMETER["Standard_Parallel_1",27.5],PARAMETER["Standard_Parallel_2",35.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",18.0],UNIT["Meter",1.0]]') srs.MorphFromESRI() assert srs.GetAttrValue('PROJECTION') == 'Lambert_Conformal_Conic_2SP', \ ('Got wrong PROJECTION name (%s) after ESRI morph, expected 2SP' % srs.GetAttrValue('PROJECTION')) ############################################################################### # Verify that FEET is treated as US survey feet per bug #1533. def test_osr_esri_7(): prj = ['Projection STATEPLANE', 'Fipszone 903', 'Datum NAD83', 'Spheroid GRS80', 'Units FEET', 'Zunits NO', 'Xshift 0.0', 'Yshift 0.0', 'Parameters ', ''] srs_prj = osr.SpatialReference() srs_prj.ImportFromESRI(prj) wkt = """PROJCS["NAD83 / Florida North", 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["latitude_of_origin",29], PARAMETER["central_meridian",-84.5], PARAMETER["standard_parallel_1",30.75], PARAMETER["standard_parallel_2",29.5833333333333], PARAMETER["false_easting",1968500], PARAMETER["false_northing",0], UNIT["Foot_US",0.304800609601219], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" srs_wkt = osr.SpatialReference(wkt=wkt) if not srs_prj.IsSame(srs_wkt): print('got: %s' % srs_prj.ExportToPrettyWkt()) pytest.fail('old style ESRI projection imported wrong, perhaps linear units?') ############################################################################### # Verify that handling of numerically specified units (see bug #1533) def test_osr_esri_8(): prj = ['Projection STATEPLANE', 'Fipszone 903', 'Datum NAD83', 'Spheroid GRS80', 'Units 3.280839895013123', 'Zunits NO', 'Xshift 0.0', 'Yshift 0.0', 'Parameters ', ''] srs_prj = osr.SpatialReference() srs_prj.ImportFromESRI(prj) wkt = """PROJCS["NAD83 / Florida North", 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["latitude_of_origin",29], PARAMETER["central_meridian",-84.5], PARAMETER["standard_parallel_1",30.75], PARAMETER["standard_parallel_2",29.5833333333333], PARAMETER["false_easting",1968503.93700787], PARAMETER["false_northing",0], UNIT["user-defined",0.3048], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" srs_wkt = osr.SpatialReference(wkt=wkt) assert srs_prj.IsSame(srs_wkt), \ 'old style ESRI projection imported wrong, perhaps linear units?' ############################################################################### # Verify Equidistant Conic handling. def test_osr_esri_9(): srs = osr.SpatialReference() esri_wkt = 'PROJCS["edc",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equidistant_Conic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-96.0],PARAMETER["Standard_Parallel_1",29.5],PARAMETER["Standard_Parallel_2",45.5],PARAMETER["Latitude_Of_Origin",37.5],UNIT["Meter",1.0]]' srs.SetFromUserInput(esri_wkt) expected = 'PROJCS["edc",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equidistant_Conic"],PARAMETER["latitude_of_center",37.5],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]]' srs.MorphFromESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected Equidistant Conic SRS after morphFromESRI') srs.MorphToESRI() wkt = srs.ExportToWkt() expected = esri_wkt if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected Equidistant Conic SRS after morphToESRI') ############################################################################### # Verify Plate_Carree handling. def test_osr_esri_10(): srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["Sphere_Plate_Carree",GEOGCS["GCS_Sphere",DATUM["D_Sphere",SPHEROID["Sphere",6371000.0,0.0]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Plate_Carree"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],UNIT["Meter",1.0]]') expected = 'PROJCS["Sphere_Plate_Carree",GEOGCS["Unknown datum based upon the Authalic Sphere",DATUM["Not_specified_based_on_Authalic_Sphere",SPHEROID["Sphere",6371000,0],AUTHORITY["EPSG","6035"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equirectangular"],PARAMETER["standard_parallel_1",0],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' srs.MorphFromESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected Equirectangular SRS after morphFromESRI') expected = 'PROJCS["Sphere_Plate_Carree",GEOGCS["GCS_Sphere",DATUM["D_Sphere",SPHEROID["Sphere",6371000.0,0.0]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equidistant_Cylindrical"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],UNIT["Meter",1.0]]' srs.MorphToESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected Equidistant_Cylindrical SRS after morphToESRI') ############################################################################### # Verify arc/info style TM handling. def test_osr_esri_11(): srs = osr.SpatialReference() srs.ImportFromESRI(['Projection TRANSVERSE', 'Datum NAD27', 'Spheroid CLARKE1866', 'Units METERS', 'Zunits NO', 'Xshift 0.0', 'Yshift 0.0', 'Parameters ', '1.0 /* scale factor at central meridian', '-106 56 0.5 /* longitude of central meridian', ' 39 33 30 /* latitude of origin', '0.0 /* false easting (meters)', '0.0 /* false northing (meters)']) expected = 'PROJCS["unnamed",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",39.5583333333333],PARAMETER["central_meridian",-106.933472222222],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["METERS",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' srs.MorphFromESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected TM SRS after morphFromESRI') ############################################################################### # Test automatic morphing of ESRI-style LCC WKT prefixed with 'ESRI::' def test_osr_esri_12(): srs = osr.SpatialReference() srs.SetFromUserInput('ESRI::PROJCS["Lambert Conformal Conic",GEOGCS["grs80",DATUM["D_North_American_1983",SPHEROID["Geodetic_Reference_System_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["standard_parallel_1",34.33333333333334],PARAMETER["standard_parallel_2",36.16666666666666],PARAMETER["latitude_of_origin",33.75],PARAMETER["central_meridian",-79],PARAMETER["false_easting",609601.22],PARAMETER["false_northing",0],UNIT["Meter",1]]') # No MorphFromESRI() is required assert srs.GetAttrValue('PROJECTION') == 'Lambert_Conformal_Conic_2SP', \ ('Got wrong PROJECTION name (%s) after ESRI morph.' % srs.GetAttrValue('PROJECTION')) assert abs(srs.GetProjParm('standard_parallel_1') - 34.333333333) <= 0.00001, \ ('Got wrong parameter value (%g) after ESRI morph.' % srs.GetProjParm('standard_parallel_1')) if srs.GetAttrValue('DATUM') != 'North_American_Datum_1983': gdaltest.post_reason('Got wrong DATUM name (%s) after ESRI morph.' % srs.GetAttrValue('DATUM')) assert srs.GetAttrValue('UNIT') == 'metre', \ ('Got wrong UNIT name (%s) after ESRI morph.' % srs.GetAttrValue('UNIT')) ############################################################################### # Test automatic morphing of ESRI-style LCC WKT prefixed with 'ESRI::' # but read directly from file. def test_osr_esri_13(): srs = osr.SpatialReference() srs.SetFromUserInput('data/lcc_esri.prj') # No MorphFromESRI() is required assert srs.GetAttrValue('PROJECTION') == 'Lambert_Conformal_Conic_2SP', \ ('Got wrong PROJECTION name (%s) after ESRI morph.' % srs.GetAttrValue('PROJECTION')) assert abs(srs.GetProjParm('standard_parallel_1') - 34.333333333) <= 0.00001, \ ('Got wrong parameter value (%g) after ESRI morph.' % srs.GetProjParm('standard_parallel_1')) if srs.GetAttrValue('DATUM') != 'North_American_Datum_1983': gdaltest.post_reason('Got wrong DATUM name (%s) after ESRI morph.' % srs.GetAttrValue('DATUM')) assert srs.GetAttrValue('UNIT') == 'metre', \ ('Got wrong UNIT name (%s) after ESRI morph.' % srs.GetAttrValue('UNIT')) ############################################################################### # Verify that state plane epsg authority values are not applied if the # linear units are changed for old style .prj files (bug #1697) def test_osr_esri_14(): srs = osr.SpatialReference() srs.ImportFromESRI(['PROJECTION STATEPLANE', 'UNITS feet', 'FIPSZONE 2600', 'DATUM NAD83', 'PARAMETERS']) assert srs.GetAuthorityCode('PROJCS') is None, \ 'Get epsg authority code inappropriately.' srs = osr.SpatialReference() srs.ImportFromESRI(['PROJECTION STATEPLANE', 'UNITS meter', 'FIPSZONE 2600', 'DATUM NAD83', 'PARAMETERS']) assert srs.GetAuthorityCode('PROJCS') == '32104', \ 'Did not get epsg authority code when expected.' ############################################################################### # Verify hotine oblique mercator handling, particularly handling # of the rectified_grid_angle parameter. def test_osr_esri_15(): srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["Bern_1898_Bern_LV03C",GEOGCS["GCS_Bern_1898_Bern",DATUM["D_Bern_1898",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Bern",7.439583333333333],UNIT["Degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Azimuth",90.0],PARAMETER["Longitude_Of_Center",0.0],PARAMETER["Latitude_Of_Center",46.95240555555556],UNIT["Meter",1.0]]') expected = 'PROJCS["Bern_1898_Bern_LV03C",GEOGCS["GCS_Bern_1898_Bern",DATUM["D_Bern_1898",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Bern",7.43958333333333],UNIT["Degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Azimuth",90.0],PARAMETER["Longitude_Of_Center",0.0],PARAMETER["Latitude_Of_Center",46.9524055555556],UNIT["Meter",1.0]]' srs.MorphFromESRI() wkt = srs.ExportToWkt() assert wkt.find('rectified_grid_angle') != -1, \ 'Did not get rectified_grid_angle as expected.' srs.MorphToESRI() wkt = srs.ExportToWkt() assert wkt.find('rectified_grid_angle') == -1, \ 'did not get rectified_grid_angle removed as expected.' if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected HOM projection after morphing') ############################################################################### # Verify translation of equirectangular to equidistant cylindrical with # cleanup of parameters. def test_osr_esri_16(): srs = osr.SpatialReference() srs.SetFromUserInput('+proj=eqc +lat_0=0 +lat_ts=-10 +lon_0=2 +x_0=100000 +y_0=200000 +ellps=sphere') expected = 'PROJCS["unknown",GEOGCS["GCS_unknown",DATUM["D_Unknown_based_on_Normal_Sphere_r_6370997_ellipsoid",SPHEROID["Normal_Sphere_r_6370997",6370997.0,0.0]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equidistant_Cylindrical"],PARAMETER["False_Easting",100000.0],PARAMETER["False_Northing",200000.0],PARAMETER["Central_Meridian",2.0],PARAMETER["Standard_Parallel_1",-10.0],UNIT["Meter",1.0]]' srs.MorphToESRI() wkt = srs.ExportToWkt() assert expected == wkt, 'Did not get expected equidistant cylindrical.' ############################################################################### # Test LAEA support (#3017) def test_osr_esri_17(): original = 'PROJCS["ETRS89 / ETRS-LAEA",GEOGCS["ETRS89",DATUM["European_Terrestrial_Reference_System_1989",SPHEROID["GRS 1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]],UNIT["metre",1],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["latitude_of_center",52],PARAMETER["longitude_of_center",10],PARAMETER["false_easting",4321000],PARAMETER["false_northing",3210000]]' srs = osr.SpatialReference() srs.SetFromUserInput(original) expected = 'PROJCS["ETRS89_ETRS_LAEA",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["False_Easting",4321000.0],PARAMETER["False_Northing",3210000.0],PARAMETER["Central_Meridian",10.0],PARAMETER["Latitude_Of_Origin",52.0],UNIT["Meter",1.0]]' srs.MorphToESRI() wkt = srs.ExportToWkt() if wkt not in (expected, expected.replace('ETRS89_ETRS_LAEA', 'ETRS89_ETRS-LAEA')): print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected LAEA SRS after morphToESRI') expected = 'PROJCS["ETRS89 / ETRS-LAEA",GEOGCS["ETRS89",DATUM["European_Terrestrial_Reference_System_1989",SPHEROID["GRS 1980",6378137,298.257222101],AUTHORITY["EPSG","6258"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Azimuthal_Equal_Area"],PARAMETER["latitude_of_center",52],PARAMETER["longitude_of_center",10],PARAMETER["false_easting",4321000],PARAMETER["false_northing",3210000],UNIT["metre",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' srs.MorphFromESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected LAEA SRS after morphFromESRI') ############################################################################### # Test EC morphing. def test_osr_esri_18(): original = """PROJCS["World_Equidistant_Cylindrical", GEOGCS["GCS_WGS_1984", DATUM["D_WGS_1984", SPHEROID["WGS_1984",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Equidistant_Cylindrical"], PARAMETER["False_Easting",0], PARAMETER["False_Northing",0], PARAMETER["Central_Meridian",0], PARAMETER["Standard_Parallel_1",60], UNIT["Meter",1]]""" srs = osr.SpatialReference() srs.SetFromUserInput(original) expected = 'PROJCS["World_Equidistant_Cylindrical",GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Equirectangular"],PARAMETER["False_Easting",0],PARAMETER["False_Northing",0],PARAMETER["Central_Meridian",0],PARAMETER["standard_parallel_1",60],UNIT["Meter",1]]' srs.MorphFromESRI() srs_expected = osr.SpatialReference(wkt=expected) if not srs.IsSame(srs_expected): print('') print('Got: ', srs.ExportToPrettyWkt()) print('Expected: ', srs_expected.ExportToPrettyWkt()) pytest.fail('Did not get expected EC SRS after morphFromESRI') expected = 'PROJCS["World_Equidistant_Cylindrical",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Equidistant_Cylindrical"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",60.0],UNIT["Meter",1.0]]' srs.MorphToESRI() wkt = srs.ExportToWkt() if wkt != expected: print('') print('Got: ', wkt) print('Expected: ', expected) pytest.fail('Did not get expected EC SRS after morphToESRI') ############################################################################### # Test spheroid remapping (per #3904) def test_osr_esri_19(): original = """GEOGCS["GCS_South_American_1969",DATUM["D_South_American_1969",SPHEROID["GRS_1967_Truncated",6378160.0,298.25]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]""" srs = osr.SpatialReference() srs.SetFromUserInput(original) srs.MorphFromESRI() expected = 'GRS 1967 Modified' if srs.GetAttrValue('SPHEROID') != expected: print('') print('Got: ', srs.ExportToPrettyWkt()) pytest.fail('Did not get expected spheroid name after morphFromESRI') srs.MorphToESRI() expected = 'GRS_1967_Truncated' if srs.GetAttrValue('SPHEROID') != expected: print('') print('Got: ', srs.ExportToPrettyWkt()) pytest.fail('Did not get expected spheroid name after morphToESRI') ############################################################################### # Test esri->ogc, esri->proj / ogc->esri, ogc->proj / proj->esri, proj->ogc def osr_esri_test(wkt_esri, wkt_ogc, proj4): silent = True # silent = False result = 'success' srs_from_esri = osr.SpatialReference() srs_ogc = osr.SpatialReference() if not silent: print('osr_esri_test( ) \nwkt_esri=' + wkt_esri + '\nwkt_ogc= ' + wkt_ogc + '\nproj4=' + proj4) # esri->ogc, esri->proj if not silent: print('\nesri->ogc, esri->proj\n') srs_from_esri.SetFromUserInput(wkt_esri) srs_from_esri.MorphFromESRI() srs_ogc.SetFromUserInput(wkt_ogc) wkt_esri_to_ogc = srs_from_esri.ExportToWkt() if not silent: print('wkt_ogc: ' + srs_ogc.ExportToWkt()) print('wkt_esri_to_ogc: ' + wkt_esri_to_ogc) if not srs_from_esri.IsSame(srs_ogc): print('wkt_esri_to_ogc failed for ' + proj4) result = 'fail' wkt_esri_to_proj4 = srs_from_esri.ExportToProj4() if not silent: print('wkt_esri_to_proj4: ' + wkt_esri_to_proj4) if wkt_esri_to_proj4 != proj4: print('wkt_esri_to_proj4 failed for ' + proj4 + '. Got ' + wkt_esri_to_proj4) result = 'fail' # ogc->esri if not silent: print('\nogc->esri, ogc->proj\n') srs_ogc.SetFromUserInput(wkt_ogc) srs_ogc.MorphToESRI() wkt_ogc_to_esri = srs_ogc.ExportToWkt() if not silent: print('wkt_ogc_to_esri: ' + wkt_ogc_to_esri) if wkt_ogc_to_esri != wkt_esri: print('wkt_ogc_to_esri failed for ' + proj4) print(wkt_ogc_to_esri) print(wkt_esri) result = 'fail' return result ############################################################################### # Test for various stereographic projection remappings (ESRI / OGC / PROJ.4) # Stereographic # Double_Stereographic / Oblique_Stereographic (#1428 and #4267) # Stereographic_North_Pole / Polar_Stereographic # Orthographics (#4249) def test_osr_esri_20(): result = 'success' # Stereographic / Stereographic / +proj=stere +lat_0=0 +lon_0=0 ... # modified definitions from ESRI 'Stereographic (world).prj' stere_esri = 'PROJCS["World_Stereographic",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Stereographic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]' stere_ogc = 'PROJCS["World_Stereographic",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Stereographic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]' stere_proj4 = '+proj=stere +lat_0=0 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' result1 = osr_esri_test(stere_esri, stere_ogc, stere_proj4) # Double_Stereographic / Oblique_Stereographic / +proj=sterea +lat_0=46 +lon_0=25 ... # modified definitions from ESRI 'Stereo 1970.prj' sterea_esri = 'PROJCS["Stereo_70",GEOGCS["GCS_Dealul_Piscului_1970",DATUM["D_Dealul_Piscului_1970",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Double_Stereographic"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",500000.0],PARAMETER["Central_Meridian",25.0],PARAMETER["Scale_Factor",0.99975],PARAMETER["Latitude_Of_Origin",46.0],UNIT["Meter",1.0]]' sterea_ogc = 'PROJCS["Stereo_70",GEOGCS["GCS_Dealul_Piscului_1970",DATUM["Dealul_Piscului_1970",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Oblique_Stereographic"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",500000.0],PARAMETER["Central_Meridian",25.0],PARAMETER["Scale_Factor",0.99975],PARAMETER["Latitude_Of_Origin",46.0],UNIT["Meter",1.0]]' sterea_proj4 = '+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs' result2 = osr_esri_test(sterea_esri, sterea_ogc, sterea_proj4) # Stereographic_North_Pole / Polar_Stereographic / +proj=stere +lat_0=90 +lat_ts=70 ... # modified definitions from ESRI 'WGS 1984 NSIDC Sea Ice Polar Stereographic North.prj' sterep_esri = 'PROJCS["WGS_1984_NSIDC_Sea_Ice_Polar_Stereographic_North",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Stereographic_North_Pole"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-45.0],PARAMETER["Standard_Parallel_1",70.0],UNIT["Meter",1.0]]' sterep_ogc = 'PROJCS["WGS 84 / NSIDC Sea Ice Polar Stereographic North",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["Polar_Stereographic"],PARAMETER["latitude_of_origin",70],PARAMETER["central_meridian",-45],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","3413"]]' sterep_proj4 = '+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' result3 = osr_esri_test(sterep_esri, sterep_ogc, sterep_proj4) # Orthographic (#4249) ortho_esri = 'PROJCS["unnamed",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Orthographic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Longitude_Of_Center",145.0],PARAMETER["Latitude_Of_Center",-37.0],UNIT["Meter",1.0]]' ortho_ogc = 'PROJCS["unnamed",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Orthographic"],PARAMETER["latitude_of_origin",-37],PARAMETER["central_meridian",145],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]' ortho_proj4 = '+proj=ortho +lat_0=-37 +lon_0=145 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' result4 = osr_esri_test(ortho_esri, ortho_ogc, ortho_proj4) if (result1 != 'success' or result2 != 'success' or result3 != 'success' or result4 != 'success'): result = 'fail' return result ############################################################################### # Test LCC_2 Central_Parallel <--> latitude_of_origin issue (#3191) # def test_osr_esri_24(): srs = osr.SpatialReference() srs.ImportFromWkt('''PROJCS["Custom", GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.017453292519943295]], PROJECTION["Lambert_Conformal_Conic_2SP"], PARAMETER["False_Easting",0.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",10.5], PARAMETER["Standard_Parallel_1",48.66666666666666], PARAMETER["Standard_Parallel_2",53.66666666666666], PARAMETER["Central_Parallel",51.0], UNIT["Meter",1.0]]''') srs.MorphFromESRI() assert srs.GetProjParm(osr.SRS_PP_LATITUDE_OF_ORIGIN, 1000.0) != 1000.0, \ 'Failed to set latitude_of_origin' ############################################################################### # Test Pseudo-Mercator (#3962) # def test_osr_esri_25(): srs = osr.SpatialReference() srs.SetFromUserInput( 'PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",' ' GEOGCS["GCS_WGS_1984",' ' DATUM["D_WGS_1984",' ' SPHEROID["WGS_1984",6378137.0,298.257223563]],' ' PRIMEM["Greenwich",0.0],' ' UNIT["Degree",0.017453292519943295]],' ' PROJECTION["Mercator_Auxiliary_Sphere"],' ' PARAMETER["False_Easting",0.0],' ' PARAMETER["False_Northing",0.0],' ' PARAMETER["Central_Meridian",0.0],' ' PARAMETER["Standard_Parallel_1",0.0],' ' PARAMETER["Auxiliary_Sphere_Type",0.0],' ' UNIT["Meter",1.0]]' ) target_srs = osr.SpatialReference() target_srs.ImportFromEPSG(4326) target_srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) transformer = osr.CoordinateTransformation(srs, target_srs) expected_proj4_string = ('+a=6378137 +b=6378137 +proj=merc +lat_ts=0' ' +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +no_defs') proj4_string = srs.ExportToProj4() if not (expected_proj4_string.split(' ').sort() == proj4_string.split(' ').sort()): # pylint: disable=superfluous-parens print('Got: %s' % expected_proj4_string) pytest.fail('Expected: %s' % proj4_string) # test an actual conversion (x, y, z) = transformer.TransformPoint(7000000, 7000000, 0) (exp_x, exp_y, exp_z) = (62.882069888366, 53.091818769596, 0.0) if (abs(exp_x - x) > 0.00001 or abs(exp_y - y) > 0.00001 or abs(exp_z - z) > 0.00001): print('Got: (%f, %f, %f)' % (x, y, z)) pytest.fail('Expected: (%f, %f, %f)' % (exp_x, exp_y, exp_z)) ############################################################################### # Test LCC_1SP (#2072) # def test_osr_esri_26(): srs = osr.SpatialReference() srs.SetFromUserInput("""PROJCS["NAD_1983_HARN_WISCRS_Washburn_County_Meters",GEOGCS["GCS_North_American_1983_HARN",DATUM["D_North_American_1983_HARN",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",234086.8682],PARAMETER["False_Northing",188358.6058],PARAMETER["Central_Meridian",-91.78333333333333],PARAMETER["Standard_Parallel_1",45.96121983333334],PARAMETER["Scale_Factor",1.0000475376],PARAMETER["Latitude_Of_Origin",45.96121983333334],UNIT["Meter",1.0]]""") srs.MorphFromESRI() assert srs.Validate() == 0, srs.ExportToWkt() ############################################################################### # Test Mercator_2SP (#4861) def test_osr_esri_27(): esri_wkt = """PROJCS["Batavia_NEIEZ", GEOGCS["GCS_Batavia", DATUM["D_Batavia", SPHEROID["Bessel_1841",6377397.155,299.1528128]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator"], PARAMETER["False_Easting",3900000.0], PARAMETER["False_Northing",900000.0], PARAMETER["Central_Meridian",110.0], PARAMETER["Standard_Parallel_1",4.45405154589751], UNIT["Meter",1.0]]""" srs = osr.SpatialReference() srs.SetFromUserInput(esri_wkt) srs.MorphFromESRI() got_wkt = srs.ExportToPrettyWkt() assert got_wkt == """PROJCS["Batavia / NEIEZ", GEOGCS["Batavia", DATUM["Batavia", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], AUTHORITY["EPSG","6211"]], PRIMEM["Greenwich",0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator_2SP"], PARAMETER["standard_parallel_1",4.45405154589751], PARAMETER["central_meridian",110], PARAMETER["false_easting",3900000], PARAMETER["false_northing",900000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" srs.MorphToESRI() got_wkt = srs.ExportToPrettyWkt() assert got_wkt == """PROJCS["Batavia_NEIEZ", GEOGCS["GCS_Batavia", DATUM["D_Batavia", SPHEROID["Bessel_1841",6377397.155,299.1528128]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator"], PARAMETER["False_Easting",3900000.0], PARAMETER["False_Northing",900000.0], PARAMETER["Central_Meridian",110.0], PARAMETER["Standard_Parallel_1",4.45405154589751], UNIT["Meter",1.0]]""" ############################################################################### # Test Mercator_1SP (#4861) def test_osr_esri_28(): ogc_wkt = """PROJCS["Segara (Jakarta) / NEIEZ (deprecated)", GEOGCS["Segara (Jakarta)", DATUM["Gunung_Segara_Jakarta", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], TOWGS84[-403,684,41,0,0,0,0], AUTHORITY["EPSG","6820"]], PRIMEM["Jakarta",106.8077194444444, AUTHORITY["EPSG","8908"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4820"]], PROJECTION["Mercator_1SP"], PARAMETER["central_meridian",110], PARAMETER["scale_factor",0.997], PARAMETER["false_easting",3900000], PARAMETER["false_northing",900000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","2934"]]""" srs = osr.SpatialReference() srs.SetFromUserInput(ogc_wkt) # 1SP transformed to 2SP form ! srs.MorphToESRI() got_wkt = srs.ExportToPrettyWkt() # Do not do exact test because of subtle difference of precision among compilers assert got_wkt.startswith("""PROJCS["Gunung_Segara_Jakarta_NEIEZ", GEOGCS["GCS_Gunung_Segara_Jakarta", DATUM["D_Gunung_Segara", SPHEROID["Bessel_1841",6377397.155,299.1528128]], PRIMEM["Jakarta",106.807719444444], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator"], PARAMETER["False_Easting",3900000.0], PARAMETER["False_Northing",900000.0], PARAMETER["Central_Meridian",110.0], PARAMETER["Standard_Parallel_1",4.45405154""") srs = osr.SpatialReference() srs.SetFromUserInput(got_wkt) srs.MorphFromESRI() got_wkt = srs.ExportToPrettyWkt() # Do not do exact test because of subtle difference of precision among compilers assert got_wkt.startswith("""PROJCS["Segara (Jakarta) / NEIEZ", GEOGCS["Segara (Jakarta)", DATUM["Gunung_Segara_Jakarta", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], AUTHORITY["EPSG","6613"]], PRIMEM["Jakarta",106.807719444444], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator_2SP"], PARAMETER["standard_parallel_1",4.45405154""") ############################################################################### # Test Web Mercator def test_osr_esri_29(): srs = osr.SpatialReference() srs.ImportFromEPSG(3857) srs.MorphToESRI() got_wkt = srs.ExportToPrettyWkt() assert got_wkt == """PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere", GEOGCS["GCS_WGS_1984", DATUM["D_WGS_1984", SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]], PROJECTION["Mercator_Auxiliary_Sphere"], PARAMETER["False_Easting",0.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",0.0], PARAMETER["Standard_Parallel_1",0.0], PARAMETER["Auxiliary_Sphere_Type",0.0], UNIT["Meter",1.0]]""" srs.MorphFromESRI() got_wkt = srs.ExportToPrettyWkt() assert got_wkt == """PROJCS["WGS 84 / Pseudo-Mercator", 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["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], 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"], AUTHORITY["EPSG","3857"]]""" # 6134 srs.SetFromUserInput("""PROJCS["WGS_84_Pseudo_Mercator",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Mercator"],PARAMETER["central_meridian",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1],PARAMETER["standard_parallel_1",0.0]]""") srs.MorphFromESRI() got_wkt = srs.ExportToPrettyWkt() assert got_wkt == """PROJCS["WGS_84_Pseudo_Mercator", 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["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], 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"]]""" ############################################################################### # Verify import of custom ellipsoid def test_osr_esri_30(): prj = ['Projection GEOGRAPHIC', 'Parameters 6370000.0 6370000.0', ''] srs_prj = osr.SpatialReference() srs_prj.ImportFromESRI(prj) wkt = """GEOGCS["unknown", DATUM["unknown", SPHEROID["unknown",6370000,0]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" srs_wkt = osr.SpatialReference(wkt=wkt) assert srs_prj.IsSame(srs_wkt) ############################################################################### # Verify import of old-style Mercator def test_osr_esri_31(): prj = ['Projection MERCATOR', 'Datum WGS84', 'Spheroid WGS84', 'Units METERS', 'Zunits NO', 'Xshift 0.0', 'Yshift 0.0', 'Parameters ', '100 0 0.0 /* longitude of central meridian', '-41 0 0.0 /* latitude of true scale', '100.0 /* false easting (meters)', '200.0 /* false northing (meters)' ''] srs_prj = osr.SpatialReference() srs_prj.ImportFromESRI(prj) 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["Mercator_1SP"], PARAMETER["latitude_of_origin",-41], PARAMETER["central_meridian",100], PARAMETER["scale_factor",1], PARAMETER["false_easting",100], PARAMETER["false_northing",200], UNIT["METERS",1]]""" srs_wkt = osr.SpatialReference(wkt=wkt) assert srs_prj.IsSame(srs_wkt) ############################################################################### # Bad Equidistant Conic def test_osr_esri_32(): # Autofuzz POC from b/65416453 prj = [ 'PROJECTIONLOCA?L_CSw?( EQUIDISTANT_CONIC', 'Paramet', '55555555555555'] srs_prj = osr.SpatialReference() with gdaltest.error_handler('CPLQuietErrorHandler'): result = srs_prj.ImportFromESRI(prj) assert result == ogr.OGRERR_CORRUPT_DATA, \ 'Corrupt EQUIDISTANT_CONIC not marked corrupt' ############################################################################### # Test morphing invalid PROJCS WKT does not crash def test_osr_esri_33(): sr = osr.SpatialReference() with gdaltest.error_handler(): sr.ImportFromWkt('PROJCS[]') sr.MorphFromESRI() sr.MorphToESRI() ############################################################################### # gdalautotest-3.0.4/osr/osr_proj4.py0000755003401500001440000006440513614005315016740 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: osr_proj4.py b384815f8a4a2344821c49ad9e030887a0b92058 2019-02-12 01:06:40 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test some PROJ.4 specific translation issues. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2013, 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. ############################################################################### from osgeo import gdal, osr import gdaltest import pytest ############################################################################### # Test the +k_0 flag works as well as +k when consuming PROJ.4 format. # This is from Bugzilla bug 355. # def test_osr_proj4_1(): srs = osr.SpatialReference() srs.ImportFromProj4('+proj=tmerc +lat_0=53.5000000000 +lon_0=-8.0000000000 +k_0=1.0000350000 +x_0=200000.0000000000 +y_0=250000.0000000000 +a=6377340.189000 +rf=299.324965 +towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15') assert abs(srs.GetProjParm(osr.SRS_PP_SCALE_FACTOR) - 1.000035) <= 0.0000005, \ '+k_0 not supported on import from PROJ.4?' ############################################################################### # Verify that we can import strings with parameter values that are exponents # and contain a plus sign. As per bug 355 in GDAL/OGR's bugzilla. # def test_osr_proj4_2(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=lcc +x_0=0.6096012192024384e+06 +y_0=0 +lon_0=90dw +lat_0=42dn +lat_1=44d4'n +lat_2=42d44'n +a=6378206.400000 +rf=294.978698 +nadgrids=conus,ntv1_can.dat +units=m") assert abs(srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) - 609601.219) <= 0.0005, \ 'Parsing exponents not supported?' if srs.Validate() != 0: print(srs.ExportToPrettyWkt()) pytest.fail('does not validate') ############################################################################### # Verify that unrecognized projections return an error, not those # annoying ellipsoid-only results. # def test_osr_proj4_4(): srs = osr.SpatialReference() srs.SetFromUserInput('+proj=utm +zone=11 +datum=WGS84') srs.SetAttrValue('PROJCS|PROJECTION', 'FakeTransverseMercator') try: gdal.PushErrorHandler('CPLQuietErrorHandler') srs.ExportToProj4() gdal.PopErrorHandler() except RuntimeError: gdal.PopErrorHandler() if gdal.GetLastErrorMsg().find('Unsupported conversion method') != -1: return pytest.fail('unknown srs not handled properly') ############################################################################### # Verify that prime meridians are preserved when round tripping. (#1940) # def test_osr_proj4_5(): srs = osr.SpatialReference() input_p4 = '+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=clrk80ign +pm=paris +towgs84=-168,-60,320,0,0,0,0 +units=m +no_defs' srs.ImportFromProj4(input_p4) assert abs(float(srs.GetAttrValue('PRIMEM', 1)) - 2.3372291667) <= 0.00000001, \ 'prime meridian lost?' assert abs(srs.GetProjParm('central_meridian')) == 0.0, 'central meridian altered?' p4 = srs.ExportToProj4() if p4 != input_p4: gdaltest.post_reason('round trip via PROJ.4 damaged srs?') print(p4) return 'fail' ############################################################################### # Confirm handling of non-zero latitude of origin mercator (#3026) # def test_osr_proj4_6(): wkt = """PROJCS["unnamed", 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["latitude_of_origin",46.1333331], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",1000], PARAMETER["false_northing",2000], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""" srs = osr.SpatialReference() srs.ImportFromWkt(wkt) proj4 = srs.ExportToProj4() expect_proj4 = '+proj=merc +lat_ts=46.1333331 +lon_0=0 +x_0=1000 +y_0=2000 +datum=WGS84 +units=m +no_defs' assert proj4 == expect_proj4 ############################################################################### # Confirm handling of somerc (#3032). # def test_osr_proj4_7(): srs = osr.SpatialReference() srs.ImportFromEPSG(23700) proj4 = srs.ExportToProj4() expected = '+proj=somerc +lat_0=47.1443937222222 +lon_0=19.0485717777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.684,-71.194,-13.975,-0.312,-0.1063,-0.3729,1.0191 +units=m +no_defs' assert proj4 == expected srs.ImportFromProj4(proj4) proj4 = srs.ExportToProj4() assert proj4 == expected ############################################################################### # Check EPSG:3857, confirm Google Mercator hackery. def test_osr_proj4_8(): srs = osr.SpatialReference() srs.ImportFromEPSG(3857) proj4 = srs.ExportToProj4() expected = '+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' assert proj4 == expected, 'did not get expected EPSG:3857 (google mercator) result.' srs = osr.SpatialReference() srs.ImportFromEPSG(3785) proj4 = srs.ExportToProj4() assert proj4 == expected, 'did not get expected EPSG:3785 (google mercator) result.' ############################################################################### # NAD27 is a bit special - make sure no towgs84 values come through. # def test_osr_proj4_9(): srs = osr.SpatialReference() srs.ImportFromEPSG(4267) proj4 = srs.ExportToProj4() expected = '+proj=longlat +datum=NAD27 +no_defs' assert proj4 == expected, 'did not get expected EPSG:4267 (NAD27)' srs = osr.SpatialReference() srs.SetFromUserInput('NAD27') proj4 = srs.ExportToProj4() assert proj4 == expected, 'did not get expected "NAD27"' ############################################################################### # Does geocentric work okay? # def test_osr_proj4_10(): srs = osr.SpatialReference() srs.ImportFromProj4('+proj=geocent +ellps=WGS84 +towgs84=0,0,0 ') wkt_expected = 'GEOCCS["unknown",DATUM["Unknown_based_on_WGS84_ellipsoid",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Geocentric X",OTHER],AXIS["Geocentric Y",OTHER],AXIS["Geocentric Z",NORTH]]' assert gdaltest.equal_srs_from_wkt(wkt_expected, srs.ExportToWkt()), \ 'did not get expected wkt.' p4 = srs.ExportToProj4() srs2 = osr.SpatialReference() srs2.ImportFromProj4(p4) if not srs.IsSame(srs2): print(srs.ExportToPrettyWkt()) print(srs2.ExportToPrettyWkt()) pytest.fail('round trip via PROJ.4 damaged srs?') ############################################################################### # Test round-tripping of all supported projection methods # def test_osr_proj4_11(): proj4strlist = ['+proj=bonne +lat_1=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=cass +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=nzmg +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=cea +lat_ts=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=tmerc +lat_0=1 +lon_0=2 +k=5 +x_0=3 +y_0=4', '+proj=utm +zone=31 +south', '+proj=merc +lat_ts=45 +lon_0=2 +x_0=3 +y_0=4', '+proj=merc +lon_0=2 +k=5 +x_0=3 +y_0=4', '+proj=stere +lat_0=90 +lat_ts=90 +lon_0=2 +x_0=3 +y_0=4', '+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=2 +x_0=3 +y_0=4', '+proj=stere +lat_0=90 +lon_0=2 +k=0.99 +x_0=3 +y_0=4', '+proj=sterea +lat_0=45 +lon_0=2 +k=2 +x_0=3 +y_0=4', '+proj=stere +lat_0=1 +lon_0=2 +k=1 +x_0=3 +y_0=4', '+proj=eqc +lat_ts=0 +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=gstmerc +lat_0=1 +lon_0=2 +k_0=5 +x_0=3 +y_0=4', '+proj=gnom +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=ortho +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=laea +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=aeqd +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=eqdc +lat_0=1 +lon_0=2 +lat_1=-2 +lat_2=-1 +x_0=3 +y_0=4', '+proj=mill +R_A +lon_0=2 +x_0=3 +y_0=4', '+proj=moll +lon_0=2 +x_0=3 +y_0=4', '+proj=eck1 +lon_0=2 +x_0=3 +y_0=4', '+proj=eck2 +lon_0=2 +x_0=3 +y_0=4', '+proj=eck3 +lon_0=2 +x_0=3 +y_0=4', '+proj=eck4 +lon_0=2 +x_0=3 +y_0=4', '+proj=eck5 +lon_0=2 +x_0=3 +y_0=4', '+proj=eck6 +lon_0=2 +x_0=3 +y_0=4', '+proj=poly +lat_0=1 +lon_0=2 +x_0=3 +y_0=4', '+proj=aea +lat_0=1 +lon_0=2 +lat_1=-2 +lat_2=-1 +x_0=3 +y_0=4', '+proj=robin +lon_0=2 +x_0=3 +y_0=4', '+proj=vandg +R_A +lon_0=2 +x_0=3 +y_0=4', '+proj=sinu +lon_0=2 +x_0=3 +y_0=4', '+proj=gall +lon_0=2 +x_0=3 +y_0=4', '+proj=goode +lon_0=2 +x_0=3 +y_0=4', '+proj=igh +lon_0=0 +x_0=0 +y_0=0', '+proj=geos +lon_0=2 +h=1 +x_0=3 +y_0=4', '+proj=lcc +lat_1=1 +lat_0=1 +lon_0=2 +k_0=2 +x_0=3 +y_0=4', '+proj=lcc +lat_0=60 +lon_0=2 +lat_1=-10 +lat_2=30 +x_0=3 +y_0=4', '+proj=lcc +lat_0=-10 +lon_0=2 +lat_1=-10 +lat_2=30 +x_0=3 +y_0=4', '+proj=omerc +lat_0=1 +lonc=2 +alpha=-1 +gamma=-2 +k=2.5 +x_0=3 +y_0=4', '+proj=omerc +lat_0=1 +lat_1=3 +lon_1=2 +lat_2=5 +lon_2=4 +k=2.5 +x_0=3 +y_0=4', '+proj=somerc +lat_0=1 +lon_0=2 +k_0=2 +x_0=3 +y_0=4', '+proj=krovak +lat_0=1 +lon_0=2 +alpha=30.2881397222222 +k=2 +x_0=3 +y_0=4', '+proj=imw_p +lon_0=2 +lat_1=-2 +lat_2=-1 +x_0=3 +y_0=4', '+proj=wag1 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag2 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag3 +lat_ts=1 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag4 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag5 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag6 +lon_0=0 +x_0=3 +y_0=4', '+proj=wag7 +lon_0=0 +x_0=3 +y_0=4', '+proj=tpeqd +lat_1=1 +lon_1=2 +lat_2=3 +lon_2=4 +x_0=5 +y_0=6', #'+proj=utm +zone=31 +south +ellps=WGS84 +units=us-ft +no_defs ', #'+proj=utm +zone=31 +south +ellps=WGS84 +units=ft +no_defs ', #'+proj=utm +zone=31 +south +ellps=WGS84 +units=yd +no_defs ', #'+proj=utm +zone=31 +south +ellps=WGS84 +units=us-yd +no_defs ', ['+proj=etmerc +lat_0=0 +lon_0=9 +k=0.9996 +units=m +x_0=500000 +datum=WGS84 +no_defs', '+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs'], '+proj=qsc +lat_0=0 +lon_0=0 +x_0=0 +y_0=0', '+proj=sch +plat_0=1 +plon_0=2 +phdg_0=3 +h_0=4' ] for input_ in proj4strlist: if isinstance(input_, list): proj4str, expected = input_ else: proj4str = input_ if proj4str.find("+no_defs") == -1: proj4str = proj4str + " +ellps=WGS84 +units=m +no_defs" expected = proj4str srs = osr.SpatialReference() srs.ImportFromProj4(proj4str) if srs.Validate() != 0: print(proj4str) print(srs.ExportToPrettyWkt()) pytest.fail('does not validate') out = srs.ExportToProj4() assert out == expected, 'round trip via PROJ.4 failed' ############################################################################### # Test importing +init=epsg:XXX # def test_osr_proj4_12(): expect_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","9108"]], AUTHORITY["EPSG","4326"]]""" srs = osr.SpatialReference() srs.ImportFromProj4("+init=epsg:4326") wkt = srs.ExportToPrettyWkt() if not wkt.startswith("""GEOGCS["WGS 84"""): print('Got:%s' % wkt) print('Expected:%s' % expect_wkt) pytest.fail('Did not get expected result.') ############################################################################### # Test error cases # def test_osr_proj4_13(): proj4strlist = ['', # None, 'foo', '+a=5', '+proj=foo', '+proj=longlat +ellps=wgs72 +towgs84=3'] gdal.PushErrorHandler('CPLQuietErrorHandler') for proj4str in proj4strlist: srs = osr.SpatialReference() gdal.ErrorReset() if srs.ImportFromProj4(proj4str) == 0 and gdal.GetLastErrorMsg() == '': gdal.PopErrorHandler() print(proj4str) pytest.fail() gdal.PopErrorHandler() ############################################################################### # Test etmerc (#4853) # def test_osr_proj4_14(): proj4str = '+proj=etmerc +lat_0=1 +lon_0=2 +k=0.9996 +x_0=3 +y_0=4 +datum=WGS84 +nodefs' # Test importing etmerc srs = osr.SpatialReference() srs.ImportFromProj4(proj4str) wkt = srs.ExportToPrettyWkt() expect_wkt = """PROJCS["unknown", GEOGCS["unknown", 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"]]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",1], PARAMETER["central_meridian",2], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",3], PARAMETER["false_northing",4], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH]]""" if wkt != expect_wkt: print('Got:%s' % wkt) print('Expected:%s' % expect_wkt) pytest.fail('Did not get expected result.') srs = osr.SpatialReference() srs.ImportFromEPSG(32600 + 32) # Test exporting standard Transverse_Mercator, without any particular option proj4str = srs.ExportToProj4() expect_proj4str = '+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs' assert proj4str == expect_proj4str srs = osr.SpatialReference() proj4str = '+proj=etmerc +lat_0=1 +lon_0=2 +k=0.9996 +x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs' srs.ImportFromProj4(proj4str) # Test exporting standard Transverse_Mercator, with OSR_USE_APPROX_TMERC=YES with gdaltest.config_option('OSR_USE_APPROX_TMERC', 'YES'): got_proj4str = srs.ExportToProj4() gdal.SetConfigOption('OSR_USE_APPROX_TMERC', None) assert got_proj4str == '+proj=tmerc +approx +lat_0=1 +lon_0=2 +k=0.9996 +x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs' # Test exporting standard Transverse_Mercator, with OSR_USE_APPROX_TMERC=YES srs = osr.SpatialReference() srs.ImportFromEPSG(32600 + 32) with gdaltest.config_option('OSR_USE_APPROX_TMERC', 'YES'): got_proj4str = srs.ExportToProj4() assert got_proj4str == '+proj=utm +approx +zone=32 +datum=WGS84 +units=m +no_defs' ############################################################################### # Test unit parsing # def test_osr_proj4_16(): def almost(a, b): if abs(a - b) > 0.000000000001: return False return True units = (('km', 1000.), ('m', 1.), ('dm', 1. / 10.), ('cm', 1. / 100.), ('mm', 1. / 1000.), ('kmi', 1852.0), ('in', 0.0254), ('ft', 0.3048), ('yd', 0.9144), ('mi', 1609.344), ('fath', 1.8288), ('ch', 20.1168), ('link', 0.201168), ('us-in', 1. / 39.37), ('us-ft', 0.304800609601219), ('us-yd', 0.914401828803658), ('us-ch', 20.11684023368047), ('us-mi', 1609.347218694437), ('ind-yd', 0.91439523), ('ind-ft', 0.30479841), ('ind-ch', 20.11669506)) srs = osr.SpatialReference() for u in units: assert srs.ImportFromProj4('+proj=utm +zone=11 +datum=WGS84 +units=%s' % u[0]) == 0 to_met = srs.GetLinearUnits() assert almost(to_met, u[1]), \ ('Did not get expected units for %s: %.12f vs %.12f' % (u[0], u[1], to_met)) ############################################################################### # Test unit parsing for name assignment # def test_osr_proj4_17(): units = (('km', 'kilometre'), ('m', 'metre'), ('dm', 'decimetre'), ('cm', 'centimetre'), ('mm', 'millimetre'), ('kmi', 'nautical mile'), ('in', 'inch'), ('ft', 'foot'), ('yd', 'yard'), ('mi', 'Statute mile'), ('fath', 'fathom'), ('ch', 'chain'), ('link', 'link'), ('us-in', 'US survey inch'), ('us-ft', 'US survey foot'), ('us-yd', 'US survey yard'), ('us-ch', 'US survey chain'), ('us-mi', 'US survey mile'), ('ind-yd', 'Indian yard (1937)'), ('ind-ft', 'Indian foot (1937)'), ('ind-ch', 'Indian chain')) srs = osr.SpatialReference() for u in units: assert srs.ImportFromProj4('+proj=utm +zone=11 +datum=WGS84 +units=%s' % u[0]) == 0 unit_name = srs.GetLinearUnitsName() assert unit_name == u[1], \ ('Did not get expected unit name: %s vs %s' % (str(u), str(unit_name))) ############################################################################### # Test fix for #5511 # def test_osr_proj4_18(): for p in ['no_off', 'no_uoff']: srs = osr.SpatialReference() srs.ImportFromProj4('+proj=omerc +lat_0=57 +lonc=-133 +alpha=-36 +k=0.9999 +x_0=5000000 +y_0=-5000000 +%s +datum=NAD83 +units=m +no_defs' % p) if srs.Validate() != 0: print(srs.ExportToPrettyWkt()) pytest.fail('does not validate') out = srs.ExportToProj4() proj4str = '+proj=omerc +no_uoff +lat_0=57 +lonc=-133 +alpha=-36 +gamma=-36 +k=0.9999 +x_0=5000000 +y_0=-5000000 +datum=NAD83 +units=m +no_defs' if out != proj4str: print(p) pytest.fail('round trip via PROJ.4 failed') ############################################################################### # Test EXTENSION and AUTHORITY in DATUM def test_osr_proj4_19(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +datum=WGS84 +nadgrids=@null") assert srs.ExportToWkt().find('DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],EXTENSION["PROJ4_GRIDS","@null"],AUTHORITY["EPSG","6326"]]') > 0 if srs.Validate() != 0: print(srs.ExportToPrettyWkt()) pytest.fail('does not validate') ############################################################################### # Test EXTENSION in GEOGCS def test_osr_proj4_20(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +lon_0=90") assert srs.ExportToWkt() == 'GEOGCS["unknown",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["Longitude",EAST],AXIS["Latitude",NORTH],EXTENSION["PROJ4","+proj=longlat +lon_0=90"]]' if srs.Validate() != 0: print(srs.ExportToPrettyWkt()) pytest.fail('does not validate') ############################################################################### # Test importing datum other than WGS84, WGS72, NAD27 or NAD83 def test_osr_proj4_21(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +datum=nzgd49") got = srs.ExportToProj4() assert got.startswith('+proj=longlat +ellps=intl') ############################################################################### # Test importing ellipsoid defined with +R def test_osr_proj4_22(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +R=1") got = srs.ExportToProj4() assert got.startswith('+proj=longlat +R=1') ############################################################################### # Test importing ellipsoid defined with +a and +f def test_osr_proj4_23(): # +f=0 particular case srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +a=1 +f=0") got = srs.ExportToProj4() assert got.startswith('+proj=longlat +R=1') srs = osr.SpatialReference() srs.ImportFromProj4("+proj=longlat +a=2 +f=0.5") got = srs.ExportToProj4() assert got.startswith('+proj=longlat +a=2 +rf=2') ############################################################################### # Test importing linear units defined with +to_meter def test_osr_proj4_24(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +to_meter=1.0") got = srs.ExportToProj4() assert '+units=m' in got # Intl foot srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +to_meter=0.3048") got = srs.ExportToProj4() assert '+units=ft' in got # US foot srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +to_meter=0.3048006096012192") got = srs.ExportToProj4() assert '+units=us-ft' in got # unknown srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +to_meter=0.4") got = srs.ExportToProj4() assert '+to_meter=0.4' in got ############################################################################### # Test importing linear units defined with +vto_meter def test_osr_proj4_25(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vto_meter=1.0") got = srs.ExportToProj4() assert '+vunits=m' in got # Intl foot srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vto_meter=0.3048") got = srs.ExportToProj4() assert '+vunits=ft' in got # US foot srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vto_meter=0.3048006096012192") got = srs.ExportToProj4() assert '+vunits=us-ft' in got # Unknown srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vto_meter=0.4") got = srs.ExportToProj4() assert '+vto_meter=0.4' in got ############################################################################### # Test importing linear units defined with +vunits def test_osr_proj4_26(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vunits=m") got = srs.ExportToProj4() assert '+vunits=m' in got # Intl foot srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vunits=ft") got = srs.ExportToProj4() assert '+vunits=ft' in got # US yard srs = osr.SpatialReference() srs.ImportFromProj4("+proj=merc +geoidgrids=foo +vunits=us-yd") got = srs.ExportToProj4() assert '+vunits=us-yd' in got ############################################################################### # Test geostationary +sweep (#6030) def test_osr_proj4_27(): srs = osr.SpatialReference() srs.ImportFromProj4("+proj=geos +sweep=x +lon_0=0 +h=35785831 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs") got = srs.ExportToProj4() assert '+proj=geos +sweep=x +lon_0=0 +h=35785831 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' in got ############################################################################### # Test importing +init=epsg: with an override def test_osr_proj4_28(): srs = osr.SpatialReference() srs.ImportFromProj4("+init=epsg:32631 +units=cm") got = srs.ExportToWkt() assert '32631' not in got assert 'Transverse_Mercator' in got assert 'UNIT["centimetre",0.01' in got def test_osr_proj4_error_cases_export_mercator(): srs = osr.SpatialReference() # latitude_of_origin != 0.0 and scale != 1.0 srs.SetFromUserInput('WGS84') srs.SetMercator(30.0, 0.0, 0.99, 0.0, 0.0) srs.SetLinearUnits('metre', 1) with gdaltest.error_handler(): got = srs.ExportToProj4() assert got == '' # latitude_of_origin != 0.0 srs = osr.SpatialReference() srs.SetFromUserInput('WGS84') srs.SetMercator2SP(0.0, 40.0, 0.0, 0.0, 0.0) srs.SetLinearUnits('metre', 1) with gdaltest.error_handler(): got = srs.ExportToProj4() assert got == '' gdalautotest-3.0.4/osr/osr_ozi.py0000755003401500001440000001062113614005315016472 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: osr_ozi.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OZI projection and datum support # Author: Even Rouault # ############################################################################### # Copyright (c) 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 gdaltest from osgeo import osr ############################################################################### # Test with WGS 84 datum def test_osr_ozi_1(): srs = osr.SpatialReference() srs.ImportFromOzi(["OziExplorer Map Data File Version 2.2", "Test_Map", "Test_Map.png", "1 ,Map Code,", "WGS 84,WGS 84, 0.0000, 0.0000,WGS 84", "Map Projection,Lambert Conformal Conic,PolyCal,No,AutoCalOnly,No,BSBUseWPX,No", "Projection Setup, 4.000000000, 10.000000000,,,, 40.000000000, 56.000000000,,,"]) expected = '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["standard_parallel_1",40],PARAMETER["standard_parallel_2",56],PARAMETER["latitude_of_origin",4],PARAMETER["central_meridian",10],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) ############################################################################### # Test with another datum known by OZI and whose EPSG code is known def test_osr_ozi_2(): srs = osr.SpatialReference() srs.ImportFromOzi(["OziExplorer Map Data File Version 2.2", "Test_Map", "Test_Map.png", "1 ,Map Code,", "Tokyo,", "Map Projection,Latitude/Longitude,,,,,,", "Projection Setup,,,,,,,,,,"]) srs_ref = osr.SpatialReference() srs_ref.ImportFromEPSG(4301) assert gdaltest.equal_srs_from_wkt(srs_ref.ExportToWkt(), srs.ExportToWkt()) ############################################################################### # Test with another datum known by OZI and whose EPSG code is unknown def test_osr_ozi_3(): srs = osr.SpatialReference() srs.ImportFromOzi(["OziExplorer Map Data File Version 2.2", "Test_Map", "Test_Map.png", "1 ,Map Code,", "European 1950 (Mean France),", "Map Projection,Latitude/Longitude,,,,,,", "Projection Setup,,,,,,,,,,"]) expected = 'GEOGCS["European 1950 (Mean France)",DATUM["European 1950 (Mean France)",SPHEROID["International 1924",6378388,297],TOWGS84[-87,-96,-120,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]' assert gdaltest.equal_srs_from_wkt(expected, srs.ExportToWkt()) gdalautotest-3.0.4/pytest.ini0000644003401500001440000000066613614004470015670 0ustar rouaultusers[pytest] python_files = *.py testpaths = ogr gcore gdrivers osr alg gnm utilities pyscripts env = # GDAL_RUN_SLOW_TESTS=NO # GDAL_DOWNLOAD_TEST_DATA=NO # DYLD_LIBRARY_PATH=../gdal # LD_LIBRARY_PATH=../gdal # GDAL_DATA=../gdal/data # GDAL_DRIVER_PATH=/usr/lib/gdal/gdalplugins markers = require_driver: Skip test(s) if driver isn't present require_run_on_demand: Skip test(s) if RUN_ON_DEMAND environment variable is not setgdalautotest-3.0.4/README.md0000644003401500001440000000333613614004466015120 0ustar rouaultusers# GDAL test suite ## How to run tests 1. You need to install `pytest` to run the test suite. This should do it: ```bash cd autotest pip install -r ./requirements.txt ``` 2. Then, run tests with: ```bash pytest ``` 3. Some quick usage tips: ```bash # get more verbose output; don't capture stdout/stdin pytest -vvs # run all the gcore tests pytest gcore/ # run a particular module only pytest gcore/basic_test.py # run a particular test case in a module pytest gcore/basic_test.py::test_basic_test_1 ``` Full documentation of pytest at https://docs.pytest.org/en/latest/ ## GDAL's tests are not independent GDAL's test functions are not currently independent of each other. In particular, running individual test functions from a given module may not work. Most tests were originally written with the assumption that entire modules will be run at once. Practically, this means that you should avoid using: * pytest's `--last-failed` / `--lf` option (since it runs only failed tests, not the whole module) * test specifiers that run individual tests (e.g. `pytest gcore/basic_test.py::test_basic_test_1` ) * the xunit plugin to run tests in parallel, unless you also use `--dist=loadfile`. (This may have other issues; untested) This will hopefully be addressed in the future. When writing new tests, please try to make them independent of each other. ## Notes about availability of GDAL sample and test data The GDAL Team makes every effort to assure that all sample data files available from GDAL download server (http://download.osgeo.org/gdal/data/) and test data files used in GDAL Autotest package (https://github.com/OSGeo/gdal/tree/master/autotest) are available as public and freely redistributable geodata. -- http://gdal.org/ gdalautotest-3.0.4/kml_generate_test_files.py0000644003401500001440000003714513614005315021070 0ustar rouaultusers#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: kml_generate_test_files.py 45df0300f2291a88f6f2bca0630c6782a7e7f05b 2019-12-24 18:05:12 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Generate test files that can be used to exercise the points tested # by the OGC KML 2.2 – Abstract Test Suite # (http://portal.opengeospatial.org/files/?artifact_id=27811) # 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 ogr ############################################################################### # Generate a .kml/.kmz file with OGR LIBKML driver covering most requirements # # Following steps are covered : # ATC 1: Root element # ATC 2: XML Schema constraints # ATC 3: Geometry coordinates # ATC 4: TimeSpan # ATC 5: TimeStamp # ATC 6: Style reference # ATC 7: Shared style definition # ATC 8: Region – LatLonAltBox # ATC 9: Link elements # ATC 10: Link referent # ATC 12: Geometry - extrude # ATC 13: Geometry - tessellate --> test currently broken. # ATC 14: Point # ATC 15: LineString # ATC 16: LinearRing - control points # ATC 17: Polygon boundary # ATC 18: Icon - href # ATC 19: ViewVolume - minimal content # ATC 20: NetworkLinkControl - minRefreshPeriod # ATC 21: Empty object # ATC 24: PhoneNumber # ATC 25: Schema # ATC 26: Schema - SimpleField # ATC 27: ExtendedData - SchemaData # ATC 28: ExtendedData - Data # ATC 29: Alias # ATC 30: atom:author # ATC 31: atom:link # ATC 32: Orientation - minimal content # ATC 34: Model # ATC 35: PhotoOverlay - minimal content # ATC 36: Pair # ATC 37: ItemIcon # ATC 38: LookAt # ATC 39: Lod # ATC 40: Link # ATC 41: Region # ATC 42: PolyStyle # ATC 43: Coordinates - altitudeMode # ATC 44: Scale - minimal content # ATC 45: KML - minimal content # ATC 46: ViewFormat # ATC 47: httpQuery # ATC 48: LinearRing in Polygon # ATC 49: Data # ATC 50: ResourceMap - Alias # ATC 51: Link refresh values # ATC 52: PhotoOverlay # ATC 54: Camera # ATC 55: Location # ATC 56: Overlay # ATC 57: ScreenOverlay # ATC 58: BalloonStyle # ATC 59: ExtendedData # ATC 60: Folder # ATC 61: IconStyle # ATC 62: ImagePyramid # ATC 63: LabelStyle # ATC 64: ListStyle # ATC 65: Style # ATC 66: MultiGeometry # ATC 67: Placemark # ATC 68: StyleMap # ATC 69: Polygon - rings # ATC 70: LinearRing - Simple # ATC 71: BalloonStyle - color # ATC 72: Metadata # ATC 73: Scale - full content # ATC 74: Lod - fade extents # ATC 75: Orientation - full content # ATC 76: Snippet # ATC 77: NetworkLink-Url def generate_libkml(filename): gdal.Unlink(filename) content = """eiffel_tower_normal:SYMBOL(id:"http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Eiffel_Tower_from_north_Avenue_de_New_York%2C_Aug_2010.jpg/220px-Eiffel_Tower_from_north_Avenue_de_New_York%2C_Aug_2010.jpg");LABEL(c:#FF0000FF) eiffel_tower_highlight:SYMBOL(id:"http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Eiffel_Tower_from_north_Avenue_de_New_York%2C_Aug_2010.jpg/220px-Eiffel_Tower_from_north_Avenue_de_New_York%2C_Aug_2010.jpg");LABEL(c:#0000FFFF)""" gdal.FileFromMemBuffer("/vsimem/style.txt", content) style_table = ogr.StyleTable() style_table.LoadStyleTable("/vsimem/style.txt") gdal.Unlink("/vsimem/style.txt") ds_options = ['author_name=Even Rouault', 'author_uri=http://gdal.org', 'author_email=foo@bar.com', 'link=http://gdal.org', 'phonenumber=tel:12345678', 'NLC_MINREFRESHPERIOD=3600', 'NLC_MAXSESSIONLENGTH=-1', 'NLC_COOKIE=cookie', 'NLC_MESSAGE=message', 'NLC_LINKNAME=linkname', 'NLC_LINKDESCRIPTION=linkdescription', 'NLC_LINKSNIPPET=linksnippet', 'NLC_EXPIRES=2014-12-31T23:59:59Z', 'LISTSTYLE_ICON_HREF=http://www.gdal.org/gdalicon.png', 'eiffel_tower_normal_balloonstyle_bgcolor=#FFFF00'] ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filename, options=ds_options) ds.SetStyleTable(style_table) lyr_options = ['LOOKAT_LONGITUDE=2.2945', 'LOOKAT_LATITUDE=48.85825', 'LOOKAT_RANGE=300', 'LOOKAT_ALTITUDE=30', 'LOOKAT_HEADING=0', 'LOOKAT_TILT=70', 'LOOKAT_ALTITUDEMODE=relativeToGround', 'ADD_REGION=YES', 'REGION_MIN_LOD_PIXELS=128', 'REGION_MAX_LOD_PIXELS=10000000', 'REGION_MIN_FADE_EXTENT=1', 'REGION_MAX_FADE_EXTENT=2', 'SO_HREF=http://www.gdal.org/gdalicon.png', 'LISTSTYLE_ICON_HREF=http://www.gdal.org/gdalicon.png'] lyr = ds.CreateLayer('test', options=lyr_options) lyr.CreateField(ogr.FieldDefn('name', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('description', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('nom_francais', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int_value', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('double_value', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('timestamp', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('begin', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('end', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('snippet', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('altitudeMode', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('extrude', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('tessellate', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('model', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("scale_x", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("scale_y", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("scale_z", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("heading", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("tilt", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("roll", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("networklink", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("networklink_refreshvisibility", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("networklink_flytoview", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("networklink_refreshMode", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("networklink_refreshInterval", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("networklink_viewRefreshMode", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("networklink_viewRefreshTime", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("networklink_viewBoundScale", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("networklink_viewFormat", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("networklink_httpQuery", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("camera_longitude", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("camera_latitude", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("camera_altitude", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("camera_altitudemode", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("photooverlay", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("leftfov", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("rightfov", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("bottomfov", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("topfov", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("near", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("photooverlay_shape", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("imagepyramid_tilesize", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("imagepyramid_maxwidth", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("imagepyramid_maxheight", ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('name', 'Eiffel tower') feat.SetField('description', 'Famous Paris attraction. Built by Gustave Eiffel in 1889.') feat.SetField('nom_francais', 'Tour Eiffel') feat.SetField('int_value', 12) feat.SetField('double_value', 34.56) feat.SetField('snippet', 'Very cool snippet') feat.SetField('begin', '1889/05/06') feat.SetField('end', '9999/12/31') feat.SetStyleString('@eiffel_tower') feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.2945 48.85825)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('name', 'Avenue Gustave Eiffel') feat.SetField('timestamp', '2014/02/22') feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2.29420 48.85746,2.29540 48.85833)')) feat.SetStyleString('PEN(c:#00FF00)') feat.SetField('tessellate', 1) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('name', 'Ecole Militaire') feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2.30383 48.85162 15,2.30460 48.85220 15,2.30581 48.85152 15,2.30507 48.85083 15,2.30383 48.85162 15))')) feat.SetField('altitudeMode', 'relativeToGround') feat.SetField('extrude', 1) feat.SetStyleString('BRUSH(fc:#0000FF)') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('name', 'Champ de Mars') feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((2.29413 48.85703,2.29606 48.85847,2.29837 48.85679,2.29676 48.85543,2.29413 48.85703)),((2.29656 48.85504,2.29929 48.85674,2.30359 48.85364,2.30164 48.85226,2.29656 48.85504)))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.2945 48.85825 10)')) feat.SetField("tilt", 75) feat.SetField("roll", 10) feat.SetField("heading", -70) feat.SetField("scale_x", 2) feat.SetField("scale_y", 3) feat.SetField("scale_z", 4) feat.SetField("altitudeMode", "relativeToGround") feat.SetField("model", "http://even.rouault.free.fr/kml/gdal_2.1/dummy.dae") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("name", "a network link") feat.SetField("networklink", "http://developers.google.com/kml/documentation/Point.kml") feat.SetField("networklink_refreshVisibility", 1) feat.SetField("networklink_flyToView", 1) feat.SetField("networklink_refreshInterval", 60) feat.SetField("networklink_httpQuery", "[clientVersion]") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("networklink", "http://developers.google.com/kml/documentation/Point.kml") feat.SetField("networklink_viewRefreshTime", 30) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("networklink", "http://developers.google.com/kml/documentation/Point.kml") feat.SetField("networklink_refreshMode", 'onExpire') feat.SetField("networklink_viewRefreshMode", 'onRegion') feat.SetField("networklink_viewBoundScale", 0.5) feat.SetField("networklink_viewFormat", 'BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("photooverlay", "http://even.rouault.free.fr/kml/gdalicon_$[level]_$[x]_$[y].png") feat.SetField("imagepyramid_tilesize", 256) feat.SetField("imagepyramid_maxwidth", 512) feat.SetField("imagepyramid_maxheight", 512) feat.SetField("camera_longitude", 2.2946) feat.SetField("camera_latitude", 48.8583) feat.SetField("camera_altitude", 20) feat.SetField("camera_altitudemode", "relativeToGround") feat.SetField("leftfov", -60) feat.SetField("rightfov", 60) feat.SetField("bottomfov", -60) feat.SetField("topfov", 60) feat.SetField("near", 100) feat.SetField("heading", 0) feat.SetField("tilt", 90) feat.SetField("roll", 0) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.2945 48.85825)')) lyr.CreateFeature(feat) # feat = ogr.Feature(lyr.GetLayerDefn()) # feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT EMPTY')) # lyr.CreateFeature(feat) # feat = ogr.Feature(lyr.GetLayerDefn()) # # feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING EMPTY')) # lyr.CreateFeature(feat) # feat = ogr.Feature(lyr.GetLayerDefn()) # feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON EMPTY')) # lyr.CreateFeature(feat) # feat = ogr.Feature(lyr.GetLayerDefn()) # feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT EMPTY,POINT(1 2))')) # lyr.CreateFeature(feat) lyr_options = ['CAMERA_LONGITUDE=2.2945', 'CAMERA_LATITUDE=48.85825', 'CAMERA_ALTITUDE=30', 'CAMERA_HEADING=120', 'CAMERA_TILT=70', 'CAMERA_ROLL=10', 'CAMERA_ALTITUDEMODE=relativeToGround', 'FOLDER=YES', 'NAME=layer_name', 'DESCRIPTION=description', 'OPEN=1', 'VISIBILITY=1', 'SNIPPET=snippet'] ds.CreateLayer('test2', options=lyr_options) gdal.SetConfigOption('LIBKML_USE_SIMPLEFIELD', 'NO') lyr = ds.CreateLayer('test_data') gdal.SetConfigOption('LIBKML_USE_SIMPLEFIELD', None) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("foo", "bar") feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.2945 48.85825)')) lyr.CreateFeature(feat) ds = None ############################################################################### # Generate a .kml file with OGR LIBKML driver covering the Update KML features # # Following steps are covered : # ATC 22: Update - targetHref # ATC 23: Identification of update target def generate_libkml_update(filename): gdal.Unlink(filename) ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filename, options=['UPDATE_TARGETHREF=http://even.rouault.free.fr/kml/gdal_2.1/test_ogrlibkml.kml']) lyr = ds.CreateLayer('test') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(100) lyr.CreateFeature(feat) feat.SetFID(1) lyr.SetFeature(feat) lyr.DeleteFeature(1) ds = None ############################################################################### # Generate a .kml file with GDAL KMLSuperOverlay driver covering the GroundOverlay KML features # # Following steps are covered : # ATC 11: LatLonBox # ATC 33: GroundOverlay # ATC 53: GroundOverlay - minimal content def generate_kmlsuperoverlay(filename): src_ds = gdal.GetDriverByName('MEM').Create('', 512, 256, 3) src_ds.SetGeoTransform([-180, 360. / 512, 0, 90, 0, -180. / 256]) ds = gdal.GetDriverByName('KMLSuperOverlay').CreateCopy(filename, src_ds) del ds src_ds = None if __name__ == '__main__': generate_libkml('test_ogrlibkml.kml') generate_libkml('test_ogrlibkml.kmz') generate_libkml_update('test_ogrlibkml_update.kml') generate_kmlsuperoverlay('test_superoverlay.kmz') gdalautotest-3.0.4/GNUmakefile0000644003401500001440000000053313614004466015707 0ustar rouaultusersall: @echo "Run 'make -j test'" gcore-test: pytest gcore gdrivers-test: pytest gdrivers alg-test: pytest alg osr-test: pytest osr ogr-test: pytest ogr utilities-test: pytest utilities pyscripts-test: pytest pyscripts test check: @$(MAKE) $(MFLAGS) gcore-test gdrivers-test alg-test ogr-test osr-test utilities-test pyscripts-test gdalautotest-3.0.4/gcore/0000755003401500001440000000000013614005323014724 5ustar rouaultusersgdalautotest-3.0.4/gcore/colortable.py0000755003401500001440000000623613614005315017437 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: colortable.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test functioning of the GDALColorTable. Mostly this tests # the python binding. # 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. ############################################################################### import gdaltest from osgeo import gdal import pytest ############################################################################### # Create a color table. def test_colortable_1(): gdaltest.test_ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255, 0)] gdaltest.test_ct = gdal.ColorTable() for i in range(len(gdaltest.test_ct_data)): gdaltest.test_ct.SetColorEntry(i, gdaltest.test_ct_data[i]) ############################################################################### # verify contents. def test_colortable_2(): for i in range(len(gdaltest.test_ct_data)): g_data = gdaltest.test_ct.GetColorEntry(i) o_data = gdaltest.test_ct_data[i] for j in range(4): if len(o_data) <= j: o_v = 255 else: o_v = o_data[j] assert g_data[j] == o_v, 'color table mismatch' ############################################################################### # Test CreateColorRamp() def test_colortable_3(): ct = gdal.ColorTable() try: ct.CreateColorRamp except AttributeError: pytest.skip() ct.CreateColorRamp(0, (255, 0, 0), 255, (0, 0, 255)) assert ct.GetColorEntry(0) == (255, 0, 0, 255) assert ct.GetColorEntry(255) == (0, 0, 255, 255) ############################################################################### # Cleanup. def test_colortable_cleanup(): gdaltest.test_ct = None gdalautotest-3.0.4/gcore/pam.py0000755003401500001440000003752313614005316016072 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: pam.py 22a76081aac3d81d1b91a8b135a23ba7a91983ff 2019-04-09 10:56:33 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test functioning of the PAM metadata 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 shutil import stat import gdaltest from osgeo import gdal import pytest ############################################################################### # Check that we can read PAM metadata for existing PNM file. def test_pam_1(): gdaltest.pam_setting = gdal.GetConfigOption('GDAL_PAM_ENABLED', "NULL") gdal.SetConfigOption('GDAL_PAM_ENABLED', 'YES') ds = gdal.Open("data/byte.pnm") base_md = ds.GetMetadata() assert len(base_md) == 2 and base_md['other'] == 'red' and base_md['key'] == 'value', \ 'Default domain metadata missing' xml_md = ds.GetMetadata('xml:test') assert len(xml_md) == 1, 'xml:test metadata missing' assert isinstance(xml_md, list), 'xml:test metadata not returned as list.' expected_xml = """ Value """ assert xml_md[0] == expected_xml, 'xml does not match' ############################################################################### # Verify that we can write XML to a new file. def test_pam_2(): driver = gdal.GetDriverByName('PNM') ds = driver.Create('tmp/pam.pnm', 10, 10) band = ds.GetRasterBand(1) band.SetMetadata({'other': 'red', 'key': 'value'}) expected_xml = """ Value """ band.SetMetadata([expected_xml], 'xml:test') band.SetNoDataValue(100) ds = None ############################################################################### # Check that we can read PAM metadata for existing PNM file. def test_pam_3(): ds = gdal.Open("tmp/pam.pnm") band = ds.GetRasterBand(1) base_md = band.GetMetadata() assert len(base_md) == 2 and base_md['other'] == 'red' and base_md['key'] == 'value', \ 'Default domain metadata missing' xml_md = band.GetMetadata('xml:test') assert len(xml_md) == 1, 'xml:test metadata missing' assert isinstance(xml_md, list), 'xml:test metadata not returned as list.' expected_xml = """ Value """ assert xml_md[0] == expected_xml, 'xml does not match' assert band.GetNoDataValue() == 100, 'nodata not saved via pam' ds = None ds = gdal.Open('tmp/pam.pnm', gdal.GA_Update) assert ds.GetRasterBand(1).DeleteNoDataValue() == 0 ds = None ds = gdal.Open('tmp/pam.pnm') assert ds.GetRasterBand(1).GetNoDataValue() is None, \ 'got nodata value whereas none was expected' ############################################################################### # Check that PAM binary encoded nodata values work properly. # def test_pam_4(): # Copy test dataset to tmp directory so that the .aux.xml file # won't be rewritten with the statistics in the master dataset. shutil.copyfile('data/mfftest.hdr.aux.xml', 'tmp/mfftest.hdr.aux.xml') shutil.copyfile('data/mfftest.hdr', 'tmp/mfftest.hdr') shutil.copyfile('data/mfftest.r00', 'tmp/mfftest.r00') ds = gdal.Open('tmp/mfftest.hdr') stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[0] == 0 and stats[1] == 4, \ 'Got wrong min/max, likely nodata not working?' ############################################################################### # Verify that .aux files that don't match the configuration of the # dependent file are not utilized. (#2471) # def test_pam_5(): ds = gdal.Open('data/sasha.tif') filelist = ds.GetFileList() ds = None assert len(filelist) == 1, 'did not get expected file list.' ############################################################################### # Verify we can read nodata values from .aux files (#2505) # def test_pam_6(): ds = gdal.Open('data/f2r23.tif') assert ds.GetRasterBand(1).GetNoDataValue() == 0, \ 'did not get expected .aux sourced nodata.' ds = None assert not os.path.exists('data/f2r23.tif.aux.xml'), \ 'did not expect .aux.xml to be created.' ############################################################################### # Verify we can create overviews on PNG with PAM disabled (#3693) # def test_pam_7(): gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') shutil.copyfile('data/stefan_full_rgba.png', 'tmp/stefan_full_rgba.png') ds = gdal.Open('tmp/stefan_full_rgba.png') ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open('tmp/stefan_full_rgba.png') ovr_count = ds.GetRasterBand(1).GetOverviewCount() ds = None os.remove('tmp/stefan_full_rgba.png') os.remove('tmp/stefan_full_rgba.png.ovr') assert ovr_count == 1 ############################################################################### # Test that Band.SetDescription() goes through PAM (#3780) # def test_pam_8(): gdal.SetConfigOption('GDAL_PAM_ENABLED', 'YES') ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pam_8.tif', 1, 1, 1) ds.GetRasterBand(1).SetDescription('foo') ds = None ds = gdal.Open('/vsimem/pam_8.tif') desc = ds.GetRasterBand(1).GetDescription() ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/pam_8.tif') assert desc == 'foo' ############################################################################### # Test that we can retrieve projection from xml:ESRI domain # def test_pam_9(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/pam_9.tif', 1, 1, 1) ds = None f = gdal.VSIFOpenL('/vsimem/pam_9.tif.aux.xml', 'wb') content = """ PROJCS["NAD_1983_UTM_Zone_14N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["false_easting",500000.0],PARAMETER["false_northing",0.0],PARAMETER["central_meridian",-99.0],PARAMETER["scale_factor",0.9996],PARAMETER["latitude_of_origin",0.0],UNIT["Meter",1.0]] true """ gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) ds = gdal.Open('/vsimem/pam_9.tif') wkt = ds.GetProjectionRef() ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/pam_9.tif') expected_wkt = """PROJCS["NAD83 / UTM zone 14N",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-99],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]]""" assert wkt == expected_wkt ############################################################################### # Test serializing and deserializing of various band metadata def test_pam_10(): src_ds = gdal.Open('data/testserialization.asc') ds = gdal.GetDriverByName('AAIGRID').CreateCopy('/vsimem/pam_10.asc', src_ds) src_ds = None ds = None ds = gdal.Open('/vsimem/pam_10.asc') gcps = ds.GetGCPs() assert len(gcps) == 2 and ds.GetGCPCount() == 2 assert ds.GetGCPProjection().find("WGS 84") != -1 assert (gcps[0].GCPPixel == 0 and gcps[0].GCPLine == 1 and \ gcps[0].GCPX == 2 and gcps[0].GCPY == 3 and gcps[0].GCPZ == 4) assert (gcps[1].GCPPixel == 1 and gcps[1].GCPLine == 2 and \ gcps[1].GCPX == 3 and gcps[1].GCPY == 4 and gcps[1].GCPZ == 5) band = ds.GetRasterBand(1) assert band.GetDescription() == 'MyDescription' assert band.GetUnitType() == 'MyUnit' assert band.GetOffset() == 1 assert band.GetScale() == 2 assert band.GetRasterColorInterpretation() == gdal.GCI_PaletteIndex assert band.GetCategoryNames() == ['Cat1', 'Cat2'] ct = band.GetColorTable() assert ct.GetColorEntry(0) == (0, 0, 0, 255) assert ct.GetColorEntry(1) == (1, 1, 1, 255) assert band.GetMaximum() == 0 assert band.GetMinimum() == 2 assert band.GetMetadata() == {'STATISTICS_MEAN': '1', 'STATISTICS_MINIMUM': '2', 'STATISTICS_MAXIMUM': '0', 'STATISTICS_STDDEV': '3'} ds = None gdal.Unlink('/vsimem/pam_10.asc') gdal.Unlink('/vsimem/pam_10.asc.aux.xml') ############################################################################### # Test PamProxyDb mechanism def test_pam_11(): # Create a read-only directory try: os.chmod('tmpdirreadonly', stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) shutil.rmtree('tmpdirreadonly') except OSError: pass os.mkdir('tmpdirreadonly') shutil.copy('data/byte.tif', 'tmpdirreadonly/byte.tif') # FIXME: how do we create a read-only dir on windows ? # The following has no effect os.chmod('tmpdirreadonly', stat.S_IRUSR | stat.S_IXUSR) # Test that the directory is really read-only try: f = open('tmpdirreadonly/test', 'w') if f is not None: f.close() pytest.skip() except IOError: pass # Compute statistics --> the saving as .aux.xml should fail ds = gdal.Open('tmpdirreadonly/byte.tif') stats = ds.GetRasterBand(1).ComputeStatistics(False) assert stats[0] == 74, 'did not get expected minimum' gdal.ErrorReset() ds = None error_msg = gdal.GetLastErrorMsg() assert error_msg.startswith('Unable to save auxiliary information'), \ 'warning was expected at that point' # Check that we actually have no saved statistics ds = gdal.Open('tmpdirreadonly/byte.tif') stats = ds.GetRasterBand(1).GetStatistics(False, False) assert stats[3] == -1, 'did not expected to have stats at that point' ds = None # This must be run as an external process so we can override GDAL_PAM_PROXY_DIR # at the beginning of the process import test_py_scripts ret = test_py_scripts.run_py_script_as_external_script('.', 'pamproxydb', '-test1') assert ret.find('success') != -1, ('pamproxydb.py -test1 failed %s' % ret) # Test loading an existing proxydb ret = test_py_scripts.run_py_script_as_external_script('.', 'pamproxydb', '-test2') assert ret.find('success') != -1, ('pamproxydb.py -test2 failed %s' % ret) ############################################################################### # Test histogram with 64bit counts def test_pam_12(): shutil.copy('data/byte.tif', 'tmp') open('tmp/byte.tif.aux.xml', 'wt').write(""" -0.5 255.5 256 1 0 6000000000|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|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|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|37|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|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|0|0|1 """) ds = gdal.Open('tmp/byte.tif') (mini, maxi, _, hist1) = ds.GetRasterBand(1).GetDefaultHistogram() hist2 = ds.GetRasterBand(1).GetHistogram(include_out_of_range=1, approx_ok=0) ds.SetMetadataItem('FOO', 'BAR') ds.GetRasterBand(1).SetDefaultHistogram(mini, maxi, hist1) ds = None aux_xml = open('tmp/byte.tif.aux.xml', 'rt').read() gdal.Unlink('tmp/byte.tif') gdal.Unlink('tmp/byte.tif.aux.xml') assert hist1 == hist2 assert hist1[0] == 6000000000 assert '6000000000|' in aux_xml ############################################################################### # Test various stuff with PAM disabled # def test_pam_13(): gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') ds = gdal.GetDriverByName('PNM').Create('/vsimem/tmp.pnm', 1, 1) # if ds.GetRasterBand(1).SetColorTable(None) == 0: # gdaltest.post_reason('fail') # return 'fail' gdal.PushErrorHandler() ret = ds.GetRasterBand(1).SetNoDataValue(0) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = ds.GetRasterBand(1).DeleteNoDataValue() gdal.PopErrorHandler() assert ret != 0 ds = None assert gdal.VSIStatL('/vsimem/tmp.pnm.aux.xml') is None gdal.Unlink('/vsimem/tmp.pnm') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'YES') ############################################################################### # Test that existing PAM metadata is preserved when new is added # https://github.com/OSGeo/gdal/issues/1430 def test_pam_metadata_preserved(): tmpfilename = '/vsimem/tmp.pnm' ds = gdal.GetDriverByName('PNM').Create(tmpfilename, 1, 1) ds.SetMetadataItem('foo', 'bar') ds = None ds = gdal.Open(tmpfilename) ds.GetRasterBand(1).SetMetadataItem('bar', 'baz') ds = None ds = gdal.Open(tmpfilename) assert ds.GetMetadataItem('foo') == 'bar' assert ds.GetRasterBand(1).GetMetadataItem('bar') == 'baz' ds = None gdal.GetDriverByName('PNM').Delete(tmpfilename) ############################################################################### # Cleanup. def test_pam_cleanup(): gdaltest.clean_tmp() if gdaltest.pam_setting != 'NULL': gdal.SetConfigOption('GDAL_PAM_ENABLED', gdaltest.pam_setting) else: gdal.SetConfigOption('GDAL_PAM_ENABLED', None) try: os.chmod('tmpdirreadonly', stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) shutil.rmtree('tmpdirreadonly') except OSError: pass try: shutil.rmtree('tmppamproxydir') except OSError: pass gdalautotest-3.0.4/gcore/vsis3.py0000755003401500001440000031751313614005316016364 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsis3.py 4e7ce5fcadef46f94d6a548a04d389224fc9a99c 2019-02-11 11:30:42 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsis3 # 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 os.path import stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_vsis3_init(): gdaltest.aws_vars = {} for var in ('AWS_SECRET_ACCESS_KEY', 'AWS_ACCESS_KEY_ID', 'AWS_TIMESTAMP', 'AWS_HTTPS', 'AWS_VIRTUAL_HOSTING', 'AWS_S3_ENDPOINT', 'AWS_REQUEST_PAYER', 'AWS_DEFAULT_REGION', 'AWS_DEFAULT_PROFILE', 'AWS_NO_SIGN_REQUEST'): gdaltest.aws_vars[var] = gdal.GetConfigOption(var) if gdaltest.aws_vars[var] is not None: gdal.SetConfigOption(var, "") # To avoid user AWS credentials in ~/.aws/credentials and ~/.aws/config # to mess up our tests gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', '') assert gdal.GetSignedURL('/vsis3/foo/bar') is None ############################################################################### # Test AWS_NO_SIGN_REQUEST=YES def test_vsis3_no_sign_request(): if not gdaltest.built_against_curl(): pytest.skip() with gdaltest.config_option('AWS_NO_SIGN_REQUEST', 'YES'): actual_url = gdal.GetActualURL('/vsis3/landsat-pds/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF') assert actual_url == 'https://landsat-pds.s3.amazonaws.com/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF' actual_url = gdal.GetActualURL('/vsis3_streaming/landsat-pds/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF') assert actual_url == 'https://landsat-pds.s3.amazonaws.com/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF' f = open_for_read('/vsis3/landsat-pds/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF') if f is None: if gdaltest.gdalurlopen('https://landsat-pds.s3.amazonaws.com/L8/001/002/LC80010022016230LGN00/LC80010022016230LGN00_B1.TIF') is None: pytest.skip('cannot open URL') pytest.fail() gdal.VSIFCloseL(f) ############################################################################### # Error cases def test_vsis3_1(): if not gdaltest.built_against_curl(): pytest.skip() # Missing AWS_SECRET_ACCESS_KEY gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsis3/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AWS_SECRET_ACCESS_KEY') >= 0 gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AWS_SECRET_ACCESS_KEY') >= 0 gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', 'AWS_SECRET_ACCESS_KEY') # Missing AWS_ACCESS_KEY_ID gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsis3/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AWS_ACCESS_KEY_ID') >= 0 gdal.SetConfigOption('AWS_ACCESS_KEY_ID', 'AWS_ACCESS_KEY_ID') # ERROR 1: The AWS Access Key Id you provided does not exist in our records. gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsis3/foo/bar.baz') if f is not None or gdal.VSIGetLastErrorMsg() == '': if f is not None: gdal.VSIFCloseL(f) if gdal.GetConfigOption('APPVEYOR') is not None: return pytest.fail(gdal.VSIGetLastErrorMsg()) gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/foo/bar.baz') assert f is None and gdal.VSIGetLastErrorMsg() != '' ############################################################################### def test_vsis3_start_webserver(): 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('AWS_SECRET_ACCESS_KEY', 'AWS_SECRET_ACCESS_KEY') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', 'AWS_ACCESS_KEY_ID') gdal.SetConfigOption('AWS_TIMESTAMP', '20150101T000000Z') gdal.SetConfigOption('AWS_HTTPS', 'NO') gdal.SetConfigOption('AWS_VIRTUAL_HOSTING', 'NO') gdal.SetConfigOption('AWS_S3_ENDPOINT', '127.0.0.1:%d' % gdaltest.webserver_port) def get_s3_fake_bucket_resource_method(request): request.protocol_version = 'HTTP/1.1' if 'Authorization' not in request.headers: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return expected_authorization_8080 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=38901846b865b12ac492bc005bb394ca8d60c098b68db57c084fac686a932f9e' expected_authorization_8081 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=9f623b7ffce76188a456c70fb4813eb31969e88d130d6b4d801b3accbf050d6c' if request.headers['Authorization'] != expected_authorization_8080 and request.headers['Authorization'] != expected_authorization_8081: 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.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) ############################################################################### # Test with a fake AWS server def test_vsis3_2(): if gdaltest.webserver_port == 0: pytest.skip() signed_url = gdal.GetSignedURL('/vsis3/s3_fake_bucket/resource') expected_url_8080 = 'http://127.0.0.1:8080/s3_fake_bucket/resource?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-Expires=3600&X-Amz-Signature=dca239dd95f72ff8c37c15c840afc54cd19bdb07f7aaee2223108b5b0ad35da8&X-Amz-SignedHeaders=host' expected_url_8081 = 'http://127.0.0.1:8081/s3_fake_bucket/resource?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AWS_ACCESS_KEY_ID%2F20150101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20150101T000000Z&X-Amz-Expires=3600&X-Amz-Signature=ef5216bc5971863414c69f6ca095276c0d62c0da97fa4f6ab80c30bd7fc146ac&X-Amz-SignedHeaders=host' assert signed_url in (expected_url_8080, expected_url_8081) handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3_streaming/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if 'Authorization' not in request.headers: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return expected_authorization_8080 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=464a21835038b4f4d292b6463b8a005b9aaa980513aa8c42fc170abb733dce85' expected_authorization_8081 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token,Signature=b10e91575186342f9f2acfc91c4c2c9938c4a9e8cdcbc043d09d59d9641ad7fb' if request.headers['Authorization'] != expected_authorization_8080 and request.headers['Authorization'] != expected_authorization_8081: 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.add('GET', '/s3_fake_bucket_with_session_token/resource', custom_method=method) # Test with temporary credentials with gdaltest.config_option('AWS_SESSION_TOKEN', 'AWS_SESSION_TOKEN'): with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket_with_session_token/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if 'Range' in request.headers: if request.headers['Range'] != 'bytes=0-16383': sys.stderr.write("Bad Range: '%s'\n" % str(request.headers['Range'])) request.send_response(403) return request.send_response(206) request.send_header('Content-type', 'text/plain') request.send_header('Content-Range', 'bytes 0-16383/1000000') request.send_header('Content-Length', 16384) request.send_header('Connection', 'close') request.end_headers() request.wfile.write(('a' * 16384).encode('ascii')) else: request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 1000000) request.send_header('Connection', 'close') request.end_headers() request.wfile.write(('a' * 1000000).encode('ascii')) handler.add('GET', '/s3_fake_bucket/resource2.bin', custom_method=method) with webserver.install_http_handler(handler): # old_val = gdal.GetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN') # gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'EMPTY_DIR') stat_res = gdal.VSIStatL('/vsis3/s3_fake_bucket/resource2.bin') # gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', old_val) if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() handler = webserver.SequentialHandler() handler.add('HEAD', '/s3_fake_bucket/resource2.bin', 200, {'Content-type': 'text/plain', 'Content-Length': 1000000, 'Connection': 'close'}) with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsis3_streaming/s3_fake_bucket/resource2.bin') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-east-1') >= 0: request.send_response(400) response = 'blaAuthorizationHeaderMalformedus-west-2' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.send_header('Connection', 'close') request.end_headers() request.wfile.write(response.encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-west-2') >= 0 and request.headers['Host'].startswith('127.0.0.1'): request.send_response(301) response = 'blaPermanentRedirectlocalhost:%d' % request.server.port response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.send_header('Connection', 'close') request.end_headers() request.wfile.write(response.encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-west-2') >= 0 and request.headers['Host'].startswith('localhost'): request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) handler.add('GET', '/s3_fake_bucket/redirect', custom_method=method) # Test region and endpoint 'redirects' with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/redirect') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) if data != 'foo': if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail(data) # Test region and endpoint 'redirects' handler.req_count = 0 with webserver.install_http_handler(handler): f = open_for_read('/vsis3_streaming/s3_fake_bucket/redirect') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() def method(request): # /vsis3_streaming/ should have remembered the change of region and endpoint if request.headers['Authorization'].find('us-west-2') < 0 or \ not request.headers['Host'].startswith('localhost'): sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.protocol_version = 'HTTP/1.1' request.send_response(400) response = 'bla' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.send_header('Connection', 'close') request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/s3_fake_bucket/non_xml_error', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/non_xml_error') assert f is None and gdal.VSIGetLastErrorMsg().find('bla') >= 0 handler = webserver.SequentialHandler() response = '' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/s3_fake_bucket/invalid_xml_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/invalid_xml_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = '' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/s3_fake_bucket/no_code_in_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/no_code_in_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'AuthorizationHeaderMalformed' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/s3_fake_bucket/no_region_in_AuthorizationHeaderMalformed_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/no_region_in_AuthorizationHeaderMalformed_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'PermanentRedirect' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/s3_fake_bucket/no_endpoint_in_PermanentRedirect_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/no_endpoint_in_PermanentRedirect_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'bla' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/s3_fake_bucket/no_message_in_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3_streaming/s3_fake_bucket/no_message_in_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 # Test with requester pays handler = webserver.SequentialHandler() def method(request): if 'x-amz-request-payer' not in request.headers: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return expected_authorization_8080 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-request-payer,Signature=cf713a394e1b629ac0e468d60d3d4a12f5236fd72d21b6005c758b0dfc7049cd' expected_authorization_8081 = 'AWS4-HMAC-SHA256 Credential=AWS_ACCESS_KEY_ID/20150101/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-request-payer,Signature=4756166679008a1a40cd6ff91dbbef670a71c11bf8e3c998dd7385577c3ac4d9' if request.headers['Authorization'] != expected_authorization_8080 and request.headers['Authorization'] != expected_authorization_8081: sys.stderr.write("Bad Authorization: '%s'\n" % str(request.headers['Authorization'])) request.send_response(403) return if request.headers['x-amz-request-payer'] != 'requester': sys.stderr.write("Bad x-amz-request-payer: '%s'\n" % str(request.headers['x-amz-request-payer'])) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler.add('GET', '/s3_fake_bucket_with_requester_pays/resource', custom_method=method) with gdaltest.config_option('AWS_REQUEST_PAYER', 'requester'): with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3/s3_fake_bucket_with_requester_pays/resource') assert f is not None data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # Test temporary redirect handler = webserver.SequentialHandler() class HandlerClass(object): def __init__(self, response_value): self.old_authorization = None self.response_value = response_value def method_req_1(self, request): if request.headers['Host'].find('127.0.0.1') < 0: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return self.old_authorization = request.headers['Authorization'] request.protocol_version = 'HTTP/1.1' request.send_response(307) response = 'blaTemporaryRedirectlocalhost:%d' % request.server.port response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) def method_req_2(self, request): if request.headers['Host'].find('localhost') < 0: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return if self.old_authorization == request.headers['Authorization']: sys.stderr.write('Should have get a different Authorization. Bad headers: %s\n' % str(request.headers)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' request.send_response(200) response = self.response_value request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) h = HandlerClass('foo') handler.add('GET', '/s3_test_temporary_redirect_read/resource', custom_method=h.method_req_1) handler.add('GET', '/s3_test_temporary_redirect_read/resource', custom_method=h.method_req_2) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_test_temporary_redirect_read/resource') assert f is not None data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # Retry on the same bucket and check that the redirection was indeed temporary handler = webserver.SequentialHandler() h = HandlerClass('bar') handler.add('GET', '/s3_test_temporary_redirect_read/resource2', custom_method=h.method_req_1) handler.add('GET', '/s3_test_temporary_redirect_read/resource2', custom_method=h.method_req_2) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_test_temporary_redirect_read/resource2') assert f is not None data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar' ############################################################################### # Test ReadDir() with a fake AWS server def test_vsis3_readdir(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-east-1') >= 0: request.send_response(400) response = 'blaAuthorizationHeaderMalformedus-west-2' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) elif request.headers['Authorization'].find('us-west-2') >= 0: if request.headers['Host'].startswith('127.0.0.1'): request.send_response(301) response = 'blaPermanentRedirectlocalhost:%d' % request.server.port response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) elif request.headers['Host'].startswith('localhost'): request.send_response(200) request.send_header('Content-type', 'application/xml') response = """ a_dir/ bla a_dir/resource3.bin 1970-01-01T00:00:01.000Z 123456 """ request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', custom_method=method) handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', custom_method=method) handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', custom_method=method) def method(request): # /vsis3/ should have remembered the change of region and endpoint if request.headers['Authorization'].find('us-west-2') < 0 or \ not request.headers['Host'].startswith('localhost'): sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'application/xml') response = """ a_dir/ a_dir/resource4.bin 2015-10-16T12:34:56.000Z 456789 a_dir/i_am_a_glacier_file 2015-10-16T12:34:56.000Z 456789 GLACIER a_dir/subdir/ """ request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket2/a_dir/resource3.bin') if f is None: if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail() gdal.VSIFCloseL(f) with webserver.install_http_handler(webserver.SequentialHandler()): dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] assert gdal.VSIStatL('/vsis3/s3_fake_bucket2/a_dir/resource3.bin').size == 123456 assert gdal.VSIStatL('/vsis3/s3_fake_bucket2/a_dir/resource3.bin').mtime == 1 # Same as above: cached dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir/resource3.bin') assert dir_contents is None # Test unrelated partial clear of the cache gdal.VSICurlPartialClearCache('/vsis3/s3_fake_bucket_unrelated') assert gdal.VSIStatL('/vsis3/s3_fake_bucket2/a_dir/resource3.bin').size == 123456 dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] # Test partial clear of the cache gdal.VSICurlPartialClearCache('/vsis3/s3_fake_bucket2/a_dir') handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket2/a_dir/resource3.bin', 400) handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&max-keys=100&prefix=a_dir%2Fresource3.bin%2F', 400) with webserver.install_http_handler(handler): gdal.VSIStatL('/vsis3/s3_fake_bucket2/a_dir/resource3.bin') handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', 200, {'Content-type': 'application/xml'}, """ a_dir/ a_dir/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') assert dir_contents == ['test.txt'] gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', 200, {}, """ a_dir/ a_dir/resource4.bin 2015-10-16T12:34:56.000Z 456789 a_dir/i_am_a_glacier_file 2015-10-16T12:34:56.000Z 456789 GLACIER a_dir/subdir/ """) with gdaltest.config_option('CPL_VSIL_CURL_IGNORE_GLACIER_STORAGE', 'NO'): with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/s3_fake_bucket2/a_dir') assert dir_contents == ['resource4.bin', 'i_am_a_glacier_file', 'subdir'] # Test CPL_VSIL_CURL_NON_CACHED for config_option_value in ['/vsis3/s3_non_cached/test.txt', '/vsis3/s3_non_cached', '/vsis3/s3_non_cached:/vsis3/unrelated', '/vsis3/unrelated:/vsis3/s3_non_cached', '/vsis3/unrelated:/vsis3/s3_non_cached:/vsis3/unrelated']: with gdaltest.config_option('CPL_VSIL_CURL_NON_CACHED', config_option_value): handler = webserver.SequentialHandler() handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo', config_option_value handler = webserver.SequentialHandler() handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'bar2') with webserver.install_http_handler(handler): size = gdal.VSIStatL('/vsis3/s3_non_cached/test.txt').size assert size == 4, config_option_value handler = webserver.SequentialHandler() handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): size = gdal.VSIStatL('/vsis3/s3_non_cached/test.txt').size if size != 3: print(config_option_value) pytest.fail(data) handler = webserver.SequentialHandler() handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'bar2') with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar2', config_option_value # Retry without option for config_option_value in [None, '/vsis3/s3_non_cached/bar.txt']: with gdaltest.config_option('CPL_VSIL_CURL_NON_CACHED', config_option_value): handler = webserver.SequentialHandler() if config_option_value is None: handler.add('GET', '/s3_non_cached/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ test.txt 1970-01-01T00:00:01.000Z 40 test2.txt 1970-01-01T00:00:01.000Z 40 """) handler.add('GET', '/s3_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo', config_option_value handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) # We should still get foo because of caching assert data == 'foo', config_option_value # List buckets (empty result) handler = webserver.SequentialHandler() handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, """ """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/') assert dir_contents == ['.'] gdal.VSICurlClearCache() # List buckets handler = webserver.SequentialHandler() handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, """ mybucket """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/') assert dir_contents == ['mybucket'] # Test temporary redirect handler = webserver.SequentialHandler() class HandlerClass(object): def __init__(self, response_value): self.old_authorization = None self.response_value = response_value def method_req_1(self, request): if request.headers['Host'].find('127.0.0.1') < 0: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return self.old_authorization = request.headers['Authorization'] request.protocol_version = 'HTTP/1.1' request.send_response(307) response = 'blaTemporaryRedirectlocalhost:%d' % request.server.port response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) def method_req_2(self, request): if request.headers['Host'].find('localhost') < 0: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return if self.old_authorization == request.headers['Authorization']: sys.stderr.write('Should have get a different Authorization. Bad headers: %s\n' % str(request.headers)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'application/xml') response = self.response_value request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) h = HandlerClass(""" test """) handler.add('GET', '/s3_test_temporary_redirect_read_dir/?delimiter=%2F', custom_method=h.method_req_1) handler.add('GET', '/s3_test_temporary_redirect_read_dir/?delimiter=%2F', custom_method=h.method_req_2) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/s3_test_temporary_redirect_read_dir') assert dir_contents == ['test'] # Retry on the same bucket and check that the redirection was indeed temporary handler = webserver.SequentialHandler() h = HandlerClass(""" test/ test/test2 """) handler.add('GET', '/s3_test_temporary_redirect_read_dir/?delimiter=%2F&prefix=test%2F', custom_method=h.method_req_1) handler.add('GET', '/s3_test_temporary_redirect_read_dir/?delimiter=%2F&prefix=test%2F', custom_method=h.method_req_2) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsis3/s3_test_temporary_redirect_read_dir/test') assert dir_contents == ['test2'] ############################################################################### # Test OpenDir() with a fake AWS server def test_vsis3_opendir(): if gdaltest.webserver_port == 0: pytest.skip() # Unlimited depth handler = webserver.SequentialHandler() handler.add('GET', '/vsis3_opendir/', 200, {'Content-type': 'application/xml'}, """ test.txt 1970-01-01T00:00:01.000Z 40 subdir/ 1970-01-01T00:00:01.000Z 0 subdir/test.txt 1970-01-01T00:00:01.000Z 5 """) with webserver.install_http_handler(handler): d = gdal.OpenDir('/vsis3/vsis3_opendir') assert d is not None entry = gdal.GetNextDirEntry(d) assert entry.name == 'test.txt' assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir' assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir/test.txt' entry = gdal.GetNextDirEntry(d) assert entry is None gdal.CloseDir(d) # Depth = 0 handler = webserver.SequentialHandler() handler.add('GET', '/vsis3_opendir/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ test.txt 1970-01-01T00:00:01.000Z 40 subdir/ """) with webserver.install_http_handler(handler): d = gdal.OpenDir('/vsis3/vsis3_opendir', 0) assert d is not None entry = gdal.GetNextDirEntry(d) assert entry.name == 'test.txt' assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir' assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) assert entry is None gdal.CloseDir(d) # Depth = 1 handler = webserver.SequentialHandler() handler.add('GET', '/vsis3_opendir/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ test.txt 1970-01-01T00:00:01.000Z 40 subdir/ """) with webserver.install_http_handler(handler): d = gdal.OpenDir('/vsis3/vsis3_opendir', 1) assert d is not None entry = gdal.GetNextDirEntry(d) assert entry.name == 'test.txt' assert entry.size == 40 assert entry.mode == 32768 assert entry.mtime == 1 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir' assert entry.mode == 16384 handler = webserver.SequentialHandler() handler.add('GET', '/vsis3_opendir/?delimiter=%2F&prefix=subdir%2F', 200, {'Content-type': 'application/xml'}, """ subdir/ subdir/test.txt 1970-01-01T00:00:01.000Z 5 """) with webserver.install_http_handler(handler): entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir/test.txt' entry = gdal.GetNextDirEntry(d) assert entry is None gdal.CloseDir(d) ############################################################################### # Test simple PUT support with a fake AWS server def test_vsis3_4(): if gdaltest.webserver_port == 0: pytest.skip() with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3', 'wb') assert f is None handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket3/empty_file.bin', 200, {'Connection': 'close'}, 'foo') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsis3/s3_fake_bucket3/empty_file.bin').size == 3 # Empty file handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '0': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket3/empty_file.bin', custom_method=method) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/empty_file.bin', 'wb') assert f is not None gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket3/empty_file.bin', 200, {'Connection': 'close'}, '') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsis3/s3_fake_bucket3/empty_file.bin').size == 0 # Invalid seek handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/empty_file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFSeekL(f, 1, 0) assert ret != 0 gdal.VSIFCloseL(f) # Invalid read handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/empty_file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFReadL(1, 1, f) assert not ret gdal.VSIFCloseL(f) # Error case handler = webserver.SequentialHandler() handler.add('PUT', '/s3_fake_bucket3/empty_file_error.bin', 403) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/empty_file_error.bin', 'wb') assert f is not None gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '' # Nominal case with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/another_file.bin', 'wb') assert f is not None assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 assert gdal.VSIFSeekL(f, 0, 1) == 0 assert gdal.VSIFSeekL(f, 0, 2) == 0 assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 assert gdal.VSIFWriteL('bar', 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '6': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(6).decode('ascii') if content != 'foobar': sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket3/another_file.bin', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' # Redirect case with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/redirect', 'wb') assert f is not None assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-east-1') >= 0: request.send_response(400) response = 'blaAuthorizationHeaderMalformedus-west-2' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) elif request.headers['Authorization'].find('us-west-2') >= 0: if request.headers['Content-Length'] != '6': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(6).decode('ascii') if content != 'foobar': sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket3/redirect', custom_method=method) handler.add('PUT', '/s3_fake_bucket3/redirect', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' ############################################################################### # Test simple PUT support with retry logic def test_vsis3_write_single_put_retry(): if gdaltest.webserver_port == 0: pytest.skip() with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', 'GDAL_HTTP_RETRY_DELAY': '0.01'}): with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket3/put_with_retry.bin', 'wb') assert f is not None assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '3': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(3).decode('ascii') if content != 'foo': sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket3/put_with_retry.bin', 502) handler.add('PUT', '/s3_fake_bucket3/put_with_retry.bin', custom_method=method) with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) ############################################################################### # Test simple DELETE support with a fake AWS server def test_vsis3_5(): if gdaltest.webserver_port == 0: pytest.skip() with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): ret = gdal.Unlink('/vsis3/foo') assert ret != 0 handler = webserver.SequentialHandler() handler.add('GET', '/s3_delete_bucket/delete_file', 200, {'Connection': 'close'}, 'foo') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsis3/s3_delete_bucket/delete_file').size == 3 handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsis3/s3_delete_bucket/delete_file').size == 3 handler = webserver.SequentialHandler() handler.add('DELETE', '/s3_delete_bucket/delete_file', 204) with webserver.install_http_handler(handler): ret = gdal.Unlink('/vsis3/s3_delete_bucket/delete_file') assert ret == 0 handler = webserver.SequentialHandler() handler.add('GET', '/s3_delete_bucket/delete_file', 404, {'Connection': 'close'}) handler.add('GET', '/s3_delete_bucket/?delimiter=%2F&max-keys=100&prefix=delete_file%2F', 404, {'Connection': 'close'}) with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsis3/s3_delete_bucket/delete_file') is None handler = webserver.SequentialHandler() handler.add('GET', '/s3_delete_bucket/delete_file_error', 200) handler.add('DELETE', '/s3_delete_bucket/delete_file_error', 403) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink('/vsis3/s3_delete_bucket/delete_file_error') assert ret != 0 handler = webserver.SequentialHandler() handler.add('GET', '/s3_delete_bucket/redirect', 200) def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-east-1') >= 0: request.send_response(400) response = 'blaAuthorizationHeaderMalformedus-west-2' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) elif request.headers['Authorization'].find('us-west-2') >= 0: request.send_response(204) request.send_header('Content-Length', 0) request.end_headers() else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('DELETE', '/s3_delete_bucket/redirect', custom_method=method) handler.add('DELETE', '/s3_delete_bucket/redirect', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.Unlink('/vsis3/s3_delete_bucket/redirect') assert ret == 0 ############################################################################### # Test multipart upload with a fake AWS server def test_vsis3_6(): if gdaltest.webserver_port == 0: pytest.skip() with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket4/large_file.bin', 'wb') assert f is not None size = 1024 * 1024 + 1 big_buffer = 'a' * size handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Authorization'].find('us-east-1') >= 0: request.send_response(400) response = 'blaAuthorizationHeaderMalformedus-west-2' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.end_headers() request.wfile.write(response.encode('ascii')) elif request.headers['Authorization'].find('us-west-2') >= 0: response = 'my_id' request.send_response(200) request.send_header('Content-type', 'application/xml') request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploads', custom_method=method) handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploads', custom_method=method) def method(request): if request.headers['Content-Length'] != '1048576': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('ETag', '"first_etag"') request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket4/large_file.bin?partNumber=1&uploadId=my_id', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == size handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '1': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) return request.send_response(200) request.send_header('ETag', '"second_etag"') request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/s3_fake_bucket4/large_file.bin?partNumber=2&uploadId=my_id', custom_method=method) def method(request): if request.headers['Content-Length'] != '186': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return content = request.rfile.read(186).decode('ascii') if content != """ 1"first_etag" 2"second_etag" """: sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploadId=my_id', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('POST', '/s3_fake_bucket4/large_file_initiate_403_error.bin?uploads', 403) handler.add('POST', '/s3_fake_bucket4/large_file_initiate_empty_result.bin?uploads', 200) handler.add('POST', '/s3_fake_bucket4/large_file_initiate_invalid_xml_result.bin?uploads', 200, {}, 'foo') handler.add('POST', '/s3_fake_bucket4/large_file_initiate_no_uploadId.bin?uploads', 200, {}, '') with webserver.install_http_handler(handler): for filename in ['/vsis3/s3_fake_bucket4/large_file_initiate_403_error.bin', '/vsis3/s3_fake_bucket4/large_file_initiate_empty_result.bin', '/vsis3/s3_fake_bucket4/large_file_initiate_invalid_xml_result.bin', '/vsis3/s3_fake_bucket4/large_file_initiate_no_uploadId.bin']: with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0 gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('POST', '/s3_fake_bucket4/large_file_upload_part_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/s3_fake_bucket4/large_file_upload_part_403_error.bin?partNumber=1&uploadId=my_id', 403) handler.add('DELETE', '/s3_fake_bucket4/large_file_upload_part_403_error.bin?uploadId=my_id', 204) handler.add('POST', '/s3_fake_bucket4/large_file_upload_part_no_etag.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/s3_fake_bucket4/large_file_upload_part_no_etag.bin?partNumber=1&uploadId=my_id', 200) handler.add('DELETE', '/s3_fake_bucket4/large_file_upload_part_no_etag.bin?uploadId=my_id', 204) with webserver.install_http_handler(handler): for filename in ['/vsis3/s3_fake_bucket4/large_file_upload_part_403_error.bin', '/vsis3/s3_fake_bucket4/large_file_upload_part_no_etag.bin']: with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0, filename gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '', filename # Simulate failure in AbortMultipart stage handler = webserver.SequentialHandler() handler.add('POST', '/s3_fake_bucket4/large_file_abortmultipart_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/s3_fake_bucket4/large_file_abortmultipart_403_error.bin?partNumber=1&uploadId=my_id', 403) handler.add('DELETE', '/s3_fake_bucket4/large_file_abortmultipart_403_error.bin?uploadId=my_id', 403) filename = '/vsis3/s3_fake_bucket4/large_file_abortmultipart_403_error.bin' with webserver.install_http_handler(handler): with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0, filename gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '', filename # Simulate failure in CompleteMultipartUpload stage handler = webserver.SequentialHandler() handler.add('POST', '/s3_fake_bucket4/large_file_completemultipart_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/s3_fake_bucket4/large_file_completemultipart_403_error.bin?partNumber=1&uploadId=my_id', 200, {'ETag': 'first_etag'}, '') handler.add('PUT', '/s3_fake_bucket4/large_file_completemultipart_403_error.bin?partNumber=2&uploadId=my_id', 200, {'ETag': 'second_etag'}, '') handler.add('POST', '/s3_fake_bucket4/large_file_completemultipart_403_error.bin?uploadId=my_id', 403) # handler.add('DELETE', '/s3_fake_bucket4/large_file_completemultipart_403_error.bin?uploadId=my_id', 204) filename = '/vsis3/s3_fake_bucket4/large_file_completemultipart_403_error.bin' with webserver.install_http_handler(handler): with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == size, filename gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '', filename ############################################################################### # Test multipart upload with retry logic def test_vsis3_write_multipart_retry(): if gdaltest.webserver_port == 0: pytest.skip() with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', 'GDAL_HTTP_RETRY_DELAY': '0.01'}): with gdaltest.config_option('VSIS3_CHUNK_SIZE', '1'): # 1 MB with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsis3/s3_fake_bucket4/large_file.bin', 'wb') assert f is not None size = 1024 * 1024 + 1 big_buffer = 'a' * size handler = webserver.SequentialHandler() response = 'my_id' handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploads', 502) handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploads', 200, {'Content-type': 'application/xml', 'Content-Length': len(response), 'Connection': 'close'}, response) handler.add('PUT', '/s3_fake_bucket4/large_file.bin?partNumber=1&uploadId=my_id', 502) handler.add('PUT', '/s3_fake_bucket4/large_file.bin?partNumber=1&uploadId=my_id', 200, {'Content-Length': '0', 'ETag': '"first_etag"', 'Connection': 'close'}, {}) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == size handler = webserver.SequentialHandler() handler.add('PUT', '/s3_fake_bucket4/large_file.bin?partNumber=2&uploadId=my_id', 200, {'Content-Length': '0', 'ETag': '"second_etag"', 'Connection': 'close'}, {}) handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploadId=my_id', 502) handler.add('POST', '/s3_fake_bucket4/large_file.bin?uploadId=my_id', 200, {'Content-Length': '0', 'Connection': 'close'}, {}) with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) ############################################################################### # Test Mkdir() / Rmdir() def test_vsis3_7(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_mkdir/dir/', 404, {'Connection': 'close'}) handler.add('GET', '/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F', 404, {'Connection': 'close'}) handler.add('PUT', '/s3_bucket_test_mkdir/dir/', 200) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsis3/s3_bucket_test_mkdir/dir', 0) assert ret == 0 assert stat.S_ISDIR(gdal.VSIStatL('/vsis3/s3_bucket_test_mkdir/dir').mode) dir_content = gdal.ReadDir('/vsis3/s3_bucket_test_mkdir/dir') assert dir_content == ['.'] # Try creating already existing directory handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_mkdir/dir/', 416, {'Connection': 'close'}) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsis3/s3_bucket_test_mkdir/dir', 0) assert ret != 0 handler = webserver.SequentialHandler() handler.add('DELETE', '/s3_bucket_test_mkdir/dir/', 204) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir') assert ret == 0 # Try deleting already deleted directory handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_mkdir/dir/', 404) handler.add('GET', '/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F', 404, {'Connection': 'close'}) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir') assert ret != 0 # Try deleting non-empty directory handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_mkdir/dir_nonempty/', 416) handler.add('GET', '/s3_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir_nonempty%2F', 200, {'Content-type': 'application/xml'}, """ dir_nonempty/ dir_nonempty/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsis3/s3_bucket_test_mkdir/dir_nonempty') assert ret != 0 # Try stat'ing a directory not ending with slash handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_dir_stat/test_dir_stat', 400) handler.add('GET', '/s3_bucket_test_dir_stat/?delimiter=%2F&max-keys=100&prefix=test_dir_stat%2F', 200, {'Content-type': 'application/xml'}, """ test_dir_stat/ test_dir_stat/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): assert stat.S_ISDIR(gdal.VSIStatL('/vsis3/s3_bucket_test_dir_stat/test_dir_stat').mode) # Try ReadDi'ing a directory not ending with slash handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_readdir/?delimiter=%2F&prefix=test_dirread%2F', 200, {'Content-type': 'application/xml'}, """ test_dirread/ test_dirread/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): assert gdal.ReadDir('/vsis3/s3_bucket_test_readdir/test_dirread') is not None # Try stat'ing a directory ending with slash handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_dir_stat_2/test_dir_stat/', 400) handler.add('GET', '/s3_bucket_test_dir_stat_2/?delimiter=%2F&max-keys=100&prefix=test_dir_stat%2F', 200, {'Content-type': 'application/xml'}, """ test_dir_stat/ test_dir_stat/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): assert stat.S_ISDIR(gdal.VSIStatL('/vsis3/s3_bucket_test_dir_stat_2/test_dir_stat/').mode) # Try ReadDi'ing a directory ending with slash handler = webserver.SequentialHandler() handler.add('GET', '/s3_bucket_test_readdir2/?delimiter=%2F&prefix=test_dirread%2F', 200, {'Content-type': 'application/xml'}, """ test_dirread/ test_dirread/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): assert gdal.ReadDir('/vsis3/s3_bucket_test_readdir2/test_dirread') is not None ############################################################################### # Test handling of file and directory with same name def test_vsis3_8(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/vsis3_8/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ test 1970-01-01T00:00:01.000Z 40 test/ """) with webserver.install_http_handler(handler): listdir = gdal.ReadDir('/vsis3/vsis3_8', 0) assert listdir == ['test', 'test/'] handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert not stat.S_ISDIR(gdal.VSIStatL('/vsis3/vsis3_8/test').mode) handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert stat.S_ISDIR(gdal.VSIStatL('/vsis3/vsis3_8/test/').mode) ############################################################################### # Test vsisync() with SYNC_STRATEGY=ETAG def test_vsis3_sync_etag(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() options = ['SYNC_STRATEGY=ETAG'] with gdaltest.error_handler(): handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert not gdal.Sync('/i_do/not/exist', '/vsis3/', options=options) with gdaltest.error_handler(): handler = webserver.SequentialHandler() handler.add('GET', '/do_not/exist', 404) handler.add('GET', '/do_not/?delimiter=%2F&max-keys=100&prefix=exist%2F', 404) handler.add('PUT', '/do_not/exist', 404) with webserver.install_http_handler(handler): assert not gdal.Sync('vsifile.py', '/vsis3/do_not/exist', options=options) handler = webserver.SequentialHandler() handler.add('GET', '/out/', 200) handler.add('GET', '/out/testsync.txt', 404) handler.add('GET', '/out/?delimiter=%2F&max-keys=100&prefix=testsync.txt%2F', 404) def method(request): if request.headers['Content-Length'] != '3': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(3).decode('ascii') if content != 'foo': sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.send_header('ETag', '"acbd18db4cc2f85cedef654fccc4a4d8"') request.end_headers() handler.add('PUT', '/out/testsync.txt', custom_method=method) gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'foo') with webserver.install_http_handler(handler): assert gdal.Sync('/vsimem/testsync.txt', '/vsis3/out', options=options) # Re-try with cached ETag. Should generate no network access handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert gdal.Sync('/vsimem/testsync.txt', '/vsis3/out', options=options) gdal.VSICurlClearCache() # Other direction: S3 to /vsimem handler = webserver.SequentialHandler() handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'ETag' : '"acbd18db4cc2f85cedef654fccc4a4d8"' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync( '/vsis3/out/testsync.txt', '/vsimem/', options=options) # Shouldn't do any copy, but hard to verify with webserver.install_http_handler(webserver.SequentialHandler()): assert gdal.Sync( '/vsis3/out/testsync.txt', '/vsimem/', options=options) # Modify target file, and redo synchronization gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'bar') handler = webserver.SequentialHandler() handler.add('GET', '/out/?delimiter=%2F', 200, {}, """ testsync.txt 1970-01-01T00:00:01.000Z 3 "acbd18db4cc2f85cedef654fccc4a4d8" """) handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'ETag' : '"acbd18db4cc2f85cedef654fccc4a4d8"' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync( '/vsis3/out/testsync.txt', '/vsimem/', options=options) f = gdal.VSIFOpenL('/vsimem/testsync.txt', 'rb') data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # /vsimem to S3, but after cleaning the cache gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/out/', 200) handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'ETag' : '"acbd18db4cc2f85cedef654fccc4a4d8"' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync('/vsimem/testsync.txt', '/vsis3/out', options=options) gdal.Unlink('/vsimem/testsync.txt') # Directory copying gdal.VSICurlClearCache() gdal.Mkdir('/vsimem/subdir', 0) gdal.FileFromMemBuffer('/vsimem/subdir/testsync.txt', 'foo') handler = webserver.SequentialHandler() handler.add('GET', '/out/?delimiter=%2F', 200, {}, """ testsync.txt 1970-01-01T00:00:01.000Z 3 "acbd18db4cc2f85cedef654fccc4a4d8" """) with webserver.install_http_handler(handler): assert gdal.Sync('/vsimem/subdir/', '/vsis3/out', options=options) gdal.RmdirRecursive('/vsimem/subdir') ############################################################################### # Test vsisync() with SYNC_STRATEGY=TIMESTAMP def test_vsis3_sync_timestamp(): if gdaltest.webserver_port == 0: pytest.skip() options = ['SYNC_STRATEGY=TIMESTAMP'] gdal.FileFromMemBuffer('/vsimem/testsync.txt', 'foo') # S3 to local: S3 file is older -> download gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' }, "foo") handler.add('GET', '/out/?delimiter=%2F', 404) handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync( '/vsis3/out/testsync.txt', '/vsimem/', options=options) # S3 to local: S3 file is newer -> do nothing gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync( '/vsis3/out/testsync.txt', '/vsimem/', options=options) # Local to S3: S3 file is older -> upload gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'Last-Modified': 'Mon, 01 Jan 1970 00:00:01 GMT' }, "foo") handler.add('PUT', '/out/testsync.txt', 200) with webserver.install_http_handler(handler): assert gdal.Sync( '/vsimem/testsync.txt', '/vsis3/out/testsync.txt', options=options) # Local to S3: S3 file is newer -> do nothgin gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/out/testsync.txt', 206, { 'Content-Length' : '3', 'Content-Range': 'bytes 0-2/3', 'Last-Modified': 'Mon, 01 Jan 2037 00:00:01 GMT' }, "foo") with webserver.install_http_handler(handler): assert gdal.Sync( '/vsimem/testsync.txt', '/vsis3/out/testsync.txt', options=options) gdal.Unlink('/vsimem/testsync.txt') ############################################################################### # Read credentials from simulated ~/.aws/credentials def test_vsis3_read_credentials_file(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '/vsimem/aws_credentials') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.Unlink('/vsimem/aws_credentials') ############################################################################### # Read credentials from simulated ~/.aws/config def test_vsis3_read_config_file(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('AWS_CONFIG_FILE', '/vsimem/aws_config') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/aws_config', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY region = us-east-1 [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.Unlink('/vsimem/aws_config') ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config def test_vsis3_read_credentials_config_file(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '/vsimem/aws_config') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) gdal.FileFromMemBuffer('/vsimem/aws_config', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY region = us-east-1 [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.Unlink('/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.Unlink('/vsimem/aws_config') ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config with # a non default profile def test_vsis3_read_credentials_config_file_non_default(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '/vsimem/aws_config') gdal.SetConfigOption('AWS_DEFAULT_PROFILE', 'myprofile') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [myprofile] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY [default] aws_access_key_id = foo aws_secret_access_key = bar """) gdal.FileFromMemBuffer('/vsimem/aws_config', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [profile myprofile] region = us-east-1 [default] aws_access_key_id = foo aws_secret_access_key = bar """) handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.Unlink('/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.Unlink('/vsimem/aws_config') gdal.SetConfigOption('AWS_DEFAULT_PROFILE', '') ############################################################################### # Read credentials from simulated ~/.aws/credentials and ~/.aws/config def test_vsis3_read_credentials_config_file_inconsistent(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '/vsimem/aws_config') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/aws_credentials', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID aws_secret_access_key = AWS_SECRET_ACCESS_KEY [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) gdal.FileFromMemBuffer('/vsimem/aws_config', """ [unrelated] aws_access_key_id = foo aws_secret_access_key = bar [default] aws_access_key_id = AWS_ACCESS_KEY_ID_inconsistent aws_secret_access_key = AWS_SECRET_ACCESS_KEY_inconsistent region = us-east-1 [unrelated] aws_access_key_id = foo aws_secret_access_key = bar """) gdal.ErrorReset() handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None assert gdal.GetLastErrorMsg() != '' data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.Unlink('/vsimem/aws_credentials') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.Unlink('/vsimem/aws_config') ############################################################################### # Read credentials from simulated EC2 instance def test_vsis3_read_credentials_ec2(): if gdaltest.webserver_port == 0: pytest.skip() if sys.platform not in ('linux', 'linux2', 'win32'): pytest.skip() gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', 'http://localhost:%d/latest/meta-data/iam/security-credentials/' % gdaltest.webserver_port) # Disable hypervisor related check to test if we are really on EC2 gdal.SetConfigOption('CPL_AWS_AUTODETECT_EC2', 'NO') gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/latest/meta-data/iam/security-credentials/', 200, {}, 'myprofile') handler.add('GET', '/latest/meta-data/iam/security-credentials/myprofile', 200, {}, """{ "AccessKeyId": "AWS_ACCESS_KEY_ID", "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "3000-01-01T00:00:00Z" }""") handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # Set a fake URL to check that credentials re-use works gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', '') handler = webserver.SequentialHandler() handler.add('GET', '/s3_fake_bucket/bar', 200, {}, 'bar') with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/bar') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar' gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', '') gdal.SetConfigOption('CPL_AWS_AUTODETECT_EC2', None) ############################################################################### # Read credentials from simulated EC2 instance with expiration of the # cached credentials def test_vsis3_read_credentials_ec2_expiration(): if gdaltest.webserver_port == 0: pytest.skip() if sys.platform not in ('linux', 'linux2', 'win32'): pytest.skip() gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', '') gdal.SetConfigOption('AWS_CONFIG_FILE', '') gdal.SetConfigOption('AWS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('AWS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', 'http://localhost:%d/latest/meta-data/iam/security-credentials/expire_in_past/' % gdaltest.webserver_port) # Disable hypervisor related check to test if we are really on EC2 gdal.SetConfigOption('CPL_AWS_AUTODETECT_EC2', 'NO') gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/latest/meta-data/iam/security-credentials/expire_in_past/', 200, {}, 'myprofile') handler.add('GET', '/latest/meta-data/iam/security-credentials/expire_in_past/myprofile', 200, {}, """{ "AccessKeyId": "AWS_ACCESS_KEY_ID", "SecretAccessKey": "AWS_SECRET_ACCESS_KEY", "Expiration": "1970-01-01T00:00:00Z" }""") handler.add('GET', '/s3_fake_bucket/resource', custom_method=get_s3_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsis3/s3_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # Set a fake URL to demonstrate we try to re-fetch credentials gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', 'http://localhost:%d/invalid/' % gdaltest.webserver_port) handler = webserver.SequentialHandler() handler.add('GET', '/invalid/myprofile', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsis3/s3_fake_bucket/bar') assert f is None gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', '') gdal.SetConfigOption('CPL_AWS_AUTODETECT_EC2', None) ############################################################################### def test_vsis3_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_vsis3_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() credentials_filename = gdal.GetConfigOption('HOME', gdal.GetConfigOption('USERPROFILE', '')) + '/.aws/credentials' # Either a bucket name or bucket/filename s3_resource = gdal.GetConfigOption('S3_RESOURCE') if not os.path.exists(credentials_filename): if gdal.GetConfigOption('AWS_SECRET_ACCESS_KEY') is None: pytest.skip('Missing AWS_SECRET_ACCESS_KEY') elif gdal.GetConfigOption('AWS_ACCESS_KEY_ID') is None: pytest.skip('Missing AWS_ACCESS_KEY_ID') if s3_resource is None: pytest.skip('Missing S3_RESOURCE') if '/' not in s3_resource: path = '/vsis3/' + s3_resource statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'vsis3_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) ret = gdal.Mkdir(subpath, 0) assert ret != 0, ('Mkdir(%s) repeated should return an error' % subpath) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, \ ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsis3/' + s3_resource) assert f is not None, ('cannot open %s' % ('/vsis3/' + s3_resource)) ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Same with /vsis3_streaming/ f = open_for_read('/vsis3_streaming/' + s3_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 if False: # pylint: disable=using-constant-test # we actually try to read at read() time and bSetError = false # Invalid bucket : "The specified bucket does not exist" gdal.ErrorReset() f = open_for_read('/vsis3/not_existing_bucket/foo') with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert gdal.VSIGetLastErrorMsg() != '' # Invalid resource gdal.ErrorReset() f = open_for_read('/vsis3_streaming/' + gdal.GetConfigOption('S3_RESOURCE') + '/invalid_resource.baz') assert f is None, gdal.VSIGetLastErrorMsg() # Test GetSignedURL() signed_url = gdal.GetSignedURL('/vsis3/' + s3_resource) f = open_for_read('/vsicurl_streaming/' + signed_url) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 ############################################################################### def test_vsis3_cleanup(): for var in gdaltest.aws_vars: gdal.SetConfigOption(var, gdaltest.aws_vars[var]) gdal.SetConfigOption('CPL_AWS_CREDENTIALS_FILE', None) gdal.SetConfigOption('AWS_CONFIG_FILE', None) gdal.SetConfigOption('CPL_AWS_EC2_CREDENTIALS_URL', None) gdalautotest-3.0.4/gcore/gdal_api_proxy.py0000755003401500001440000003512513614005316020312 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gdal_api_proxy.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDAL API PROXY mechanism # Author: Even Rouault, # ############################################################################### # 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 sys import subprocess import time from osgeo import gdal from osgeo import osr import pytest ############################################################################### # Test forked gdalserver @pytest.fixture def gdalserver_path(): import test_cli_utilities gdalserver_path = test_cli_utilities.get_cli_utility_path('gdalserver') if gdalserver_path is None: gdalserver_path = 'gdalserver' return gdalserver_path def test_gdal_api_proxy_1(gdalserver_path): subprocess.check_call([ sys.executable, 'gdal_api_proxy.py', gdalserver_path, '-2', ]) ############################################################################### # Test connection to TCP server def test_gdal_api_proxy_2(gdalserver_path): if sys.version_info < (2, 6, 0): pytest.skip() subprocess.check_call([ sys.executable, 'gdal_api_proxy.py', gdalserver_path, '-2', ]) ############################################################################### # Test connection to Unix socket server def test_gdal_api_proxy_3(gdalserver_path): if sys.version_info < (2, 6, 0): pytest.skip() if sys.platform == 'win32': pytest.skip() if sys.platform == 'darwin': pytest.skip("Fails on MacOSX ('ERROR 1: posix_spawnp() failed'. Not sure why.") subprocess.check_call([ sys.executable, 'gdal_api_proxy.py', gdalserver_path, '-3', ]) ############################################################################### # Test -nofork mode def test_gdal_api_proxy_4(gdalserver_path): if sys.version_info < (2, 6, 0): pytest.skip() if sys.platform == 'win32': pytest.skip() if sys.platform == 'darwin': pytest.skip("Fails on MacOSX ('ERROR 1: posix_spawnp() failed'. Not sure why.") subprocess.check_call([ sys.executable, 'gdal_api_proxy.py', gdalserver_path, '-4', ]) ############################################################################### # def _gdal_api_proxy_sub(): src_ds = gdal.Open('data/byte.tif') src_cs = src_ds.GetRasterBand(1).Checksum() src_gt = src_ds.GetGeoTransform() src_prj = src_ds.GetProjectionRef() src_data = src_ds.ReadRaster(0, 0, 20, 20) src_md = src_ds.GetMetadata() src_ds = None drv = gdal.IdentifyDriver('data/byte.tif') assert drv.GetDescription() == 'API_PROXY' ds = gdal.GetDriverByName('GTiff').Create('tmp/byte.tif', 1, 1, 3) ds = None src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/byte.tif', src_ds, options=['TILED=YES']) got_cs = ds.GetRasterBand(1).Checksum() assert src_cs == got_cs ds = None ds = gdal.Open('tmp/byte.tif', gdal.GA_Update) ds.SetGeoTransform([1, 2, 3, 4, 5, 6]) got_gt = ds.GetGeoTransform() assert src_gt != got_gt ds.SetGeoTransform(src_gt) got_gt = ds.GetGeoTransform() assert src_gt == got_gt assert ds.GetGCPCount() == 0 assert ds.GetGCPProjection() == '', ds.GetGCPProjection() assert not ds.GetGCPs() gcps = [gdal.GCP(0, 1, 2, 3, 4)] sr = osr.SpatialReference() sr.ImportFromEPSG(4326) wkt = sr.ExportToWkt() assert ds.SetGCPs(gcps, wkt) == 0 got_gcps = ds.GetGCPs() assert len(got_gcps) == 1 assert (got_gcps[0].GCPLine == gcps[0].GCPLine and \ got_gcps[0].GCPPixel == gcps[0].GCPPixel and \ got_gcps[0].GCPX == gcps[0].GCPX and \ got_gcps[0].GCPY == gcps[0].GCPY) assert ds.GetGCPProjection() == wkt ds.SetGCPs([], "") assert not ds.GetGCPs() ds.SetProjection('') got_prj = ds.GetProjectionRef() assert src_prj != got_prj ds.SetProjection(src_prj) got_prj = ds.GetProjectionRef() assert src_prj == got_prj ds.GetRasterBand(1).Fill(0) got_cs = ds.GetRasterBand(1).Checksum() assert got_cs == 0 ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, src_data) got_cs = ds.GetRasterBand(1).Checksum() assert src_cs == got_cs ds.GetRasterBand(1).Fill(0) got_cs = ds.GetRasterBand(1).Checksum() assert got_cs == 0 ds.WriteRaster(0, 0, 20, 20, src_data) got_cs = ds.GetRasterBand(1).Checksum() assert src_cs == got_cs # Not bound to SWIG # ds.AdviseRead(0,0,20,20,20,20) got_data = ds.ReadRaster(0, 0, 20, 20) assert src_data == got_data got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20) assert src_data == got_data got_data_weird_spacing = ds.ReadRaster(0, 0, 20, 20, buf_pixel_space=1, buf_line_space=32) assert len(got_data_weird_spacing) == 32 * (20 - 1) + 20 assert got_data[20:20 + 20] == got_data_weird_spacing[32:32 + 20] got_data_weird_spacing = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, buf_pixel_space=1, buf_line_space=32) assert len(got_data_weird_spacing) == 32 * (20 - 1) + 20 assert got_data[20:20 + 20] == got_data_weird_spacing[32:32 + 20] got_block = ds.GetRasterBand(1).ReadBlock(0, 0) assert len(got_block) == 256 * 256 assert got_data[20:20 + 20] == got_block[256:256 + 20] ds.FlushCache() ds.GetRasterBand(1).FlushCache() got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20) assert src_data == got_data assert len(ds.GetFileList()) == 1 assert ds.AddBand(gdal.GDT_Byte) != 0 got_md = ds.GetMetadata() assert src_md == got_md assert ds.GetMetadataItem('AREA_OR_POINT') == 'Area' assert ds.GetMetadataItem('foo') is None ds.SetMetadataItem('foo', 'bar') assert ds.GetMetadataItem('foo') == 'bar' ds.SetMetadata({'foo': 'baz'}, 'OTHER') assert ds.GetMetadataItem('foo', 'OTHER') == 'baz' ds.GetRasterBand(1).SetMetadata({'foo': 'baw'}, 'OTHER') assert ds.GetRasterBand(1).GetMetadataItem('foo', 'OTHER') == 'baw' assert ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'BAND' assert not ds.GetRasterBand(1).GetMetadata() assert ds.GetRasterBand(1).GetMetadataItem('foo') is None ds.GetRasterBand(1).SetMetadataItem('foo', 'baz') assert ds.GetRasterBand(1).GetMetadataItem('foo') == 'baz' ds.GetRasterBand(1).SetMetadata({'foo': 'baw'}) assert ds.GetRasterBand(1).GetMetadataItem('foo') == 'baw' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_Undefined) ct = ds.GetRasterBand(1).GetColorTable() assert ct is None ct = gdal.ColorTable() ct.SetColorEntry(0, (1, 2, 3)) assert ds.GetRasterBand(1).SetColorTable(ct) == 0 ct = ds.GetRasterBand(1).GetColorTable() assert ct is not None assert ct.GetColorEntry(0) == (1, 2, 3, 255) ct = ds.GetRasterBand(1).GetColorTable() assert ct is not None assert ds.GetRasterBand(1).SetColorTable(None) == 0 ct = ds.GetRasterBand(1).GetColorTable() assert ct is None rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat is None assert ds.GetRasterBand(1).SetDefaultRAT(None) == 0 ref_rat = gdal.RasterAttributeTable() assert ds.GetRasterBand(1).SetDefaultRAT(ref_rat) == 0 rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat is None assert ds.GetRasterBand(1).SetDefaultRAT(None) == 0 rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat is None assert ds.GetRasterBand(1).GetMinimum() is None got_stats = ds.GetRasterBand(1).GetStatistics(0, 0) assert got_stats[3] < 0.0 got_stats = ds.GetRasterBand(1).GetStatistics(1, 1) assert got_stats[0] == 74.0 assert ds.GetRasterBand(1).GetMinimum() == 74.0 assert ds.GetRasterBand(1).GetMaximum() == 255.0 ds.GetRasterBand(1).SetStatistics(1, 2, 3, 4) got_stats = ds.GetRasterBand(1).GetStatistics(1, 1) assert got_stats == [1, 2, 3, 4] ds.GetRasterBand(1).ComputeStatistics(0) got_stats = ds.GetRasterBand(1).GetStatistics(1, 1) assert got_stats[0] == 74.0 minmax = ds.GetRasterBand(1).ComputeRasterMinMax() assert minmax == (74.0, 255.0) assert ds.GetRasterBand(1).GetOffset() == 0.0 assert ds.GetRasterBand(1).GetScale() == 1.0 ds.GetRasterBand(1).SetOffset(10.0) assert ds.GetRasterBand(1).GetOffset() == 10.0 ds.GetRasterBand(1).SetScale(2.0) assert ds.GetRasterBand(1).GetScale() == 2.0 ds.BuildOverviews('NEAR', [2]) assert ds.GetRasterBand(1).GetOverviewCount() == 1 assert ds.GetRasterBand(1).GetOverview(-1) is None assert ds.GetRasterBand(1).GetOverview(0) is not None assert ds.GetRasterBand(1).GetOverview(0) is not None got_hist = ds.GetRasterBand(1).GetHistogram() assert len(got_hist) == 256 (minval, maxval, nitems, got_hist2) = ds.GetRasterBand(1).GetDefaultHistogram() assert minval == -0.5 assert maxval == 255.5 assert nitems == 256 assert got_hist == got_hist2 ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [3]) (minval, maxval, nitems, got_hist3) = ds.GetRasterBand(1).GetDefaultHistogram() assert minval == 1 assert maxval == 2 assert nitems == 1 assert got_hist3[0] == 3 got_nodatavalue = ds.GetRasterBand(1).GetNoDataValue() assert got_nodatavalue is None ds.GetRasterBand(1).SetNoDataValue(123) got_nodatavalue = ds.GetRasterBand(1).GetNoDataValue() assert got_nodatavalue == 123 assert ds.GetRasterBand(1).GetMaskFlags() == 8 assert ds.GetRasterBand(1).GetMaskBand() is not None ret = ds.GetRasterBand(1).DeleteNoDataValue() assert ret == 0 got_nodatavalue = ds.GetRasterBand(1).GetNoDataValue() assert got_nodatavalue is None ds.CreateMaskBand(0) assert ds.GetRasterBand(1).GetMaskFlags() == 2 assert ds.GetRasterBand(1).GetMaskBand() is not None ds.GetRasterBand(1).CreateMaskBand(0) assert ds.GetRasterBand(1).HasArbitraryOverviews() == 0 ds.GetRasterBand(1).SetUnitType('foo') assert ds.GetRasterBand(1).GetUnitType() == 'foo' assert ds.GetRasterBand(1).GetCategoryNames() is None ds.GetRasterBand(1).SetCategoryNames(['foo']) assert ds.GetRasterBand(1).GetCategoryNames() == ['foo'] ds.GetRasterBand(1).SetDescription('bar') ds = None gdal.GetDriverByName('GTiff').Delete('tmp/byte.tif') ############################################################################### # def _gdal_api_proxy_sub_clean(): if gdaltest.api_proxy_server_p is not None: try: gdaltest.api_proxy_server_p.terminate() except Exception: pass gdaltest.api_proxy_server_p.wait() gdal.Unlink('tmp/gdalapiproxysocket') if __name__ == '__main__': sys.path.insert(0, '../pymod') import gdaltest if len(sys.argv) >= 3 and sys.argv[2] == '-1': gdal.SetConfigOption('GDAL_API_PROXY', 'YES') if sys.platform == 'win32': gdalserver_path = sys.argv[1] # noqa gdal.SetConfigOption('GDAL_API_PROXY_SERVER', gdalserver_path) gdaltest.api_proxy_server_p = None gdaltest_list = [_gdal_api_proxy_sub] elif len(sys.argv) >= 3 and sys.argv[2] == '-2': gdalserver_path = sys.argv[1] p = None for port in [8080, 8081, 8082]: p = subprocess.Popen([gdalserver_path, '-tcpserver', '%d' % port]) time.sleep(1) if p.poll() is None: break try: p.terminate() except (AttributeError, OSError): pass p.wait() p = None if p is not None: gdal.SetConfigOption('GDAL_API_PROXY', 'YES') gdal.SetConfigOption('GDAL_API_PROXY_SERVER', 'localhost:%d' % port) print('port = %d' % port) gdaltest.api_proxy_server_p = p gdaltest_list = [_gdal_api_proxy_sub, _gdal_api_proxy_sub_clean] else: gdaltest_list = [] elif len(sys.argv) >= 3 and sys.argv[2] == '-3': gdalserver_path = sys.argv[1] p = subprocess.Popen([gdalserver_path, '-unixserver', 'tmp/gdalapiproxysocket']) time.sleep(1) if p.poll() is None: gdal.SetConfigOption('GDAL_API_PROXY', 'YES') gdal.SetConfigOption('GDAL_API_PROXY_SERVER', 'tmp/gdalapiproxysocket') gdaltest.api_proxy_server_p = p gdaltest_list = [_gdal_api_proxy_sub, _gdal_api_proxy_sub_clean] else: try: p.terminate() except (AttributeError, OSError): pass p.wait() gdaltest_list = [] elif len(sys.argv) >= 3 and sys.argv[2] == '-4': gdalserver_path = sys.argv[1] p = subprocess.Popen([gdalserver_path, '-nofork', '-unixserver', 'tmp/gdalapiproxysocket']) time.sleep(1) if p.poll() is None: gdal.SetConfigOption('GDAL_API_PROXY', 'YES') gdal.SetConfigOption('GDAL_API_PROXY_SERVER', 'tmp/gdalapiproxysocket') gdaltest.api_proxy_server_p = p gdaltest_list = [_gdal_api_proxy_sub, _gdal_api_proxy_sub_clean] else: try: p.terminate() except (AttributeError, OSError): pass p.wait() gdaltest_list = [] for func in gdaltest_list: func() gdalautotest-3.0.4/gcore/vsicrypt.py0000755003401500001440000004427113614005316017176 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vsicrypt.py 1b3280ca29d02241f72cb9b75064e6497368cf0d 2019-08-01 16:48:12 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsicrypt/ # 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 struct from osgeo import gdal import gdaltest import pytest from gcore.testnonboundtoswig import setup as testnonboundtoswig_setup # noqa ############################################################################### # Use common test for /vsicrypt def test_vsicrypt_1(): gdaltest.has_vsicrypt = False fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb+') if fp is None: pytest.skip() gdal.VSIFCloseL(fp) gdal.Unlink('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin') gdaltest.has_vsicrypt = True import vsifile return vsifile.vsifile_generic('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin') ############################################################################### # Test various error cases def test_vsicrypt_2(): if not gdaltest.has_vsicrypt: pytest.skip() # Missing key with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') assert fp is None # Invalid file with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/not_existing/not_existing', 'wb') assert fp is None # Invalid file with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/not_existing/not_existing', 'rb') assert fp is None # Invalid file with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/not_existing/not_existing', 'ab') assert fp is None # Invalid access with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/not_existing/not_existing', 'foo') assert fp is None # Key to short with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=a,file=/vsimem/file.bin', 'wb+') assert fp is None # Invalid signature gdal.FileFromMemBuffer('/vsimem/file.bin', 'foo') with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') assert fp is None # Generate empty file fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb') gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') assert fp is not None gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsimem/file.bin', 'rb') header = gdal.VSIFReadL(1, 1000, fp) gdal.VSIFCloseL(fp) assert len(header) == 46 # Test shortening header for i in range(46): fp = gdal.VSIFOpenL('/vsimem/file.bin', 'wb') gdal.VSIFWriteL(header, 1, 46 - 1 - i, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') assert fp is None # Test corrupting all bytes of header for i in range(46): for val in (0, 127, 255): fp = gdal.VSIFOpenL('/vsimem/file.bin', 'wb') try: new_byte = chr(val).encode('latin1') except (UnicodeDecodeError, UnicodeEncodeError): new_byte = chr(val) header_new = header[0:i] + new_byte + header[i + 1:] gdal.VSIFWriteL(header_new, 1, 46, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=' '/vsimem/file.bin', 'rb') if fp is not None: gdal.VSIFCloseL(fp) gdal.SetConfigOption('VSICRYPT_IV', 'TOO_SHORT') with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=' '/vsimem/file.bin', 'wb') gdal.SetConfigOption('VSICRYPT_IV', None) if fp is not None: gdal.VSIFCloseL(fp) # Inconsistent initial vector. header = struct.pack('B' * 38, 86, 83, 73, 67, 82, 89, 80, 84, # signature 38, 0, # header size 1, # major 0, # minor 0, 2, # sector size 0, # alg 0, # mode 8, # size of IV (should be 16) 32, 13, 169, 71, 154, 208, 22, 32, # IV 0, 0, # size of free text 0, # size of key check 0, 0, 0, 0, 0, 0, 0, 0, # size of unencrypted file 0, 0 # size of extra content ) fp = gdal.VSIFOpenL('/vsimem/file.bin', 'wb') gdal.VSIFWriteL(header, 1, len(header), fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): fp = gdal.VSIFOpenL( '/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') assert fp is None # Inconsistent initial vector with key check. header = struct.pack('B' * 39, 86, 83, 73, 67, 82, 89, 80, 84, # signature 39, 0, # header size 1, # major 0, # minor 0, 2, # sector size 0, # alg 0, # mode 8, # size of IV (should be 16) 32, 13, 169, 71, 154, 208, 22, 32, # IV 0, 0, # size of free text 1, # size of key check 0, # key check 0, 0, 0, 0, 0, 0, 0, 0, # size of unencrypted file 0, 0 # size of extra content ) fp = gdal.VSIFOpenL('/vsimem/file.bin', 'wb') gdal.VSIFWriteL(header, 1, len(header), fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') assert fp is None # Test reading with wrong key fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb') gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt/key=dont_use_in_prod,file=/vsimem/file.bin', 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content != 'hello' with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=short_key,file=/vsimem/file.bin', 'ab') assert fp is None # Test reading with wrong key with add_key_check fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,add_key_check=yes,file=/vsimem/file.bin', 'wb') gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=dont_use_in_prod,file=/vsimem/file.bin', 'rb') assert fp is None with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=short_key,file=/vsimem/file.bin', 'ab') assert fp is None with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=dont_use_in_prod,file=/vsimem/file.bin', 'ab') assert fp is None # Test creating with potentially not build-in alg: with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/alg=blowfish,key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'wb') if fp is not None: gdal.VSIFCloseL(fp) # Invalid sector_size with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,sector_size=1,file=/vsimem/file.bin', 'wb') assert fp is None # Sector size (16) should be at least twice larger than the block size (16) in CBC_CTS with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,sector_size=16,mode=CBC_CTS,file=/vsimem/file.bin', 'wb') assert fp is None gdal.Unlink('/vsimem/file.bin') ############################################################################### # Test various options def test_vsicrypt_3(): if not gdaltest.has_vsicrypt: pytest.skip() for options in ['sector_size=16', 'alg=AES', 'alg=DES_EDE2', 'alg=DES_EDE3', 'alg=SKIPJACK', 'alg=invalid', 'mode=CBC', 'mode=CFB', 'mode=OFB', 'mode=CTR', 'mode=CBC_CTS', 'mode=invalid', 'freetext=my_free_text', 'add_key_check=yes']: gdal.Unlink('/vsimem/file.bin') if options == 'alg=invalid' or options == 'mode=invalid': with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PRODDONT_USE_IN_PROD,%s,file=/vsimem/file.bin' % options, 'wb') else: fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PRODDONT_USE_IN_PROD,%s,file=/vsimem/file.bin' % options, 'wb') assert fp is not None, options gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PRODDONT_USE_IN_PROD,file=/vsimem/file.bin', 'r') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello', options # Some of those algs might be missing for options in ['alg=Blowfish', 'alg=Camellia', 'alg=CAST256', 'alg=MARS', 'alg=IDEA', 'alg=RC5', 'alg=RC6', 'alg=Serpent', 'alg=SHACAL2', 'alg=Twofish', 'alg=XTEA']: gdal.Unlink('/vsimem/file.bin') with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,%s,file=/vsimem/file.bin' % options, 'wb') if fp is not None: gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file.bin', 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello', options # Test key generation # Do NOT set VSICRYPT_CRYPTO_RANDOM=NO in production. This is just to speed up tests ! gdal.SetConfigOption("VSICRYPT_CRYPTO_RANDOM", "NO") fp = gdal.VSIFOpenL('/vsicrypt/key=GENERATE_IT,add_key_check=yes,file=/vsimem/file.bin', 'wb') gdal.SetConfigOption("VSICRYPT_CRYPTO_RANDOM", None) # Get the generated random key key_b64 = gdal.GetConfigOption('VSICRYPT_KEY_B64') assert key_b64 is not None gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello', options gdal.SetConfigOption('VSICRYPT_KEY_B64', None) fp = gdal.VSIFOpenL('/vsicrypt/key_b64=%s,file=/vsimem/file.bin' % key_b64, 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello', options with gdaltest.error_handler(): statRes = gdal.VSIStatL('/vsicrypt//vsimem/file.bin') assert statRes is None ret = gdal.Rename('/vsicrypt//vsimem/file.bin', '/vsicrypt//vsimem/subdir_crypt/file.bin') assert ret == 0 ret = gdal.Rename('/vsicrypt//vsimem/subdir_crypt/file.bin', '/vsimem/subdir_crypt/file2.bin') assert ret == 0 dir_content = gdal.ReadDir('/vsicrypt//vsimem/subdir_crypt') assert dir_content == ['file2.bin'] gdal.Unlink('/vsimem/subdir_crypt/file2.bin') ############################################################################### # Test "random" operations against reference filesystem def test_vsicrypt_4(): if not gdaltest.has_vsicrypt: pytest.skip() test_file = '/vsicrypt/key=DONT_USE_IN_PROD,sector_size=32,file=/vsimem/file_enc.bin' ref_file = '/vsimem/file.bin' for seed in range(1000): gdal.Unlink(test_file) gdal.Unlink(ref_file) test_f = gdal.VSIFOpenL(test_file, 'wb+') ref_f = gdal.VSIFOpenL(ref_file, 'wb+') import random random.seed(seed) for _ in range(20): random_offset = random.randint(0, 1000) gdal.VSIFSeekL(test_f, random_offset, 0) gdal.VSIFSeekL(ref_f, random_offset, 0) random_size = random.randint(1, 80) random_content = ''.join([chr(40 + int(10 * random.random())) for _ in range(random_size)]) gdal.VSIFWriteL(random_content, 1, random_size, test_f) gdal.VSIFWriteL(random_content, 1, random_size, ref_f) if random.randint(0, 1) == 0: random_offset = random.randint(0, 1500) gdal.VSIFSeekL(test_f, random_offset, 0) gdal.VSIFSeekL(ref_f, random_offset, 0) random_size = random.randint(1, 80) test_content = gdal.VSIFReadL(1, random_size, test_f) ref_content = gdal.VSIFReadL(1, random_size, ref_f) if test_content != ref_content: print(seed) print('Test content (%d):' % len(test_content)) print('') pytest.fail('Ref content (%d):' % len(ref_content)) gdal.VSIFSeekL(test_f, 0, 0) gdal.VSIFSeekL(ref_f, 0, 0) test_content = gdal.VSIFReadL(1, 100000, test_f) ref_content = gdal.VSIFReadL(1, 100000, ref_f) gdal.VSIFCloseL(test_f) gdal.VSIFCloseL(ref_f) if test_content != ref_content: print(seed) print('Test content (%d):' % len(test_content)) print('') pytest.fail('Ref content (%d):' % len(ref_content)) gdal.Unlink(test_file) gdal.Unlink(ref_file) ############################################################################### # Test random filling of last sector def test_vsicrypt_5(): if not gdaltest.has_vsicrypt: pytest.skip() test_file = '/vsicrypt/key=DONT_USE_IN_PROD,file=/vsimem/file_enc.bin' f = gdal.VSIFOpenL(test_file, 'wb+') gdal.VSIFWriteL('ab', 1, 2, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(test_file, 'rb+') gdal.VSIFSeekL(f, 3, 0) gdal.VSIFWriteL('d', 1, 1, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(test_file, 'rb') content = gdal.VSIFReadL(1, 4, f) content = struct.unpack('B' * len(content), content) gdal.VSIFCloseL(f) assert content == (97, 98, 0, 100) f = gdal.VSIFOpenL(test_file, 'rb+') gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 5, 0) gdal.VSIFWriteL('f', 1, 1, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(test_file, 'rb') content = gdal.VSIFReadL(1, 6, f) content = struct.unpack('B' * len(content), content) gdal.VSIFCloseL(f) assert content == (97, 98, 0, 100, 0, 102) f = gdal.VSIFOpenL(test_file, 'rb+') gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 512, 0) gdal.VSIFWriteL('Z', 1, 1, f) gdal.VSIFSeekL(f, 7, 0) gdal.VSIFWriteL('h', 1, 1, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(test_file, 'rb') content = gdal.VSIFReadL(1, 8, f) content = struct.unpack('B' * len(content), content) gdal.VSIFCloseL(f) assert content == (97, 98, 0, 100, 0, 102, 0, 104) gdal.Unlink(test_file) ############################################################################### # Test VSISetCryptKey def test_vsicrypt_6(testnonboundtoswig_setup): # noqa try: import ctypes except ImportError: pytest.skip() testnonboundtoswig_setup.VSISetCryptKey.argtypes = [ctypes.c_char_p, ctypes.c_int] testnonboundtoswig_setup.VSISetCryptKey.restype = None # Set a valid key testnonboundtoswig_setup.VSISetCryptKey('DONT_USE_IN_PROD'.encode('ASCII'), 16) if not gdaltest.has_vsicrypt: pytest.skip() fp = gdal.VSIFOpenL('/vsicrypt/add_key_check=yes,file=/vsimem/file.bin', 'wb+') assert fp is not None gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello' fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') assert fp is not None gdal.VSIFWriteL('hello', 1, 5, fp) gdal.VSIFCloseL(fp) fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') content = gdal.VSIFReadL(1, 5, fp).decode('latin1') gdal.VSIFCloseL(fp) assert content == 'hello' # Set a too short key testnonboundtoswig_setup.VSISetCryptKey('bbc'.encode('ASCII'), 3) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'rb') assert fp is None with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') assert fp is None # Erase key testnonboundtoswig_setup.VSISetCryptKey(None, 0) with gdaltest.error_handler(): fp = gdal.VSIFOpenL('/vsicrypt//vsimem/file.bin', 'wb+') assert fp is None gdal.Unlink('/vsimem/file.bin') gdalautotest-3.0.4/gcore/virtualmem.py0000755003401500001440000002344613614005316017501 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: virtualmem.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDALVirtualMem interface # 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 sys from osgeo import gdal import pytest ############################################################################### # Test linear and tiled virtual mem interfaces in read-only mode def test_virtualmem_1(): if gdal.GetConfigOption('SKIP_VIRTUALMEM'): pytest.skip() try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() ds = gdal.Open('../gdrivers/data/small_world.tif') bufxsize = 400 bufysize = 128 tilexsize = 128 tileysize = 64 ar = ds.ReadAsArray(0, 0, bufxsize, bufysize) try: ar_flat_bsq = ds.GetVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, bufxsize, bufysize, gdal.GDT_Int16, [1, 2, 3], 1, 1024 * 1024, 0) except: if not sys.platform.startswith('linux'): # Also try GetTiledVirtualMemArray() robustness (#5728) try: ar_tiled_band1 = ds.GetRasterBand(1).GetTiledVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, tilexsize, tileysize, gdal.GDT_Int16, 1024 * 1024) except: pass pytest.skip() ar_flat_band1 = ds.GetRasterBand(1).GetVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, bufxsize, bufysize, gdal.GDT_Int16, 1024 * 1024, 0) ar_flat_bip = ds.GetVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, bufxsize, bufysize, gdal.GDT_Int16, [1, 2, 3], 0, 1024 * 1024, 0) ar_tiled_band1 = ds.GetRasterBand(1).GetTiledVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, tilexsize, tileysize, gdal.GDT_Int16, 1024 * 1024) ar_tip = ds.GetTiledVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, tilexsize, tileysize, gdal.GDT_Int16, [1, 2, 3], gdal.GTO_TIP, 1024 * 1024) ar_bit = ds.GetTiledVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, tilexsize, tileysize, gdal.GDT_Int16, [1, 2, 3], gdal.GTO_BIT, 1024 * 1024) ar_bsq = ds.GetTiledVirtualMemArray(gdal.GF_Read, 0, 0, bufxsize, bufysize, tilexsize, tileysize, gdal.GDT_Int16, [1, 2, 3], gdal.GTO_BSQ, 1024 * 1024) tilepercol = int((bufysize + tileysize - 1) / tileysize) tileperrow = int((bufxsize + tilexsize - 1) / tilexsize) for tiley in range(tilepercol): reqysize = tileysize if reqysize + tiley * tileysize > bufysize: reqysize = bufysize - tiley * tileysize for tilex in range(tileperrow): reqxsize = tilexsize if reqxsize + tilex * tilexsize > bufxsize: reqxsize = bufxsize - tilex * tilexsize for y in range(reqysize): for x in range(reqxsize): for band in range(3): assert ar_tip[tiley][tilex][y][x][band] == ar[band][tiley * tileysize + y][tilex * tilexsize + x] assert ar_tip[tiley][tilex][y][x][band] == ar_flat_bsq[band][tiley * tileysize + y][tilex * tilexsize + x] assert ar_tip[tiley][tilex][y][x][band] == ar_flat_bip[tiley * tileysize + y][tilex * tilexsize + x][band] assert ar_tip[tiley][tilex][y][x][band] == ar_bsq[band][tiley][tilex][y][x] assert ar_tip[tiley][tilex][y][x][band] == ar_bit[tiley][tilex][band][y][x] if band == 0: assert ar_flat_band1[tiley * tileysize + y][tilex * tilexsize + x] == ar_flat_bip[tiley * tileysize + y][tilex * tilexsize + x][0] assert ar_tiled_band1[tiley][tilex][y][x] == ar_flat_bip[tiley * tileysize + y][tilex * tilexsize + x][0] # We need to destroy the array before dataset destruction ar_flat_band1 = None ar_flat_bip = None ar_tiled_band1 = None ar_tip = None ar_bit = None ar_bsq = None ds = None ############################################################################### # Test write mode def test_virtualmem_2(): if gdal.GetConfigOption('SKIP_VIRTUALMEM'): pytest.skip() try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() if not sys.platform.startswith('linux'): pytest.skip() ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 1) ar = ds.GetVirtualMemArray(gdal.GF_Write) ar.fill(255) ar = None # We need to have released the Virtual Memory Array with ar=None to be sure that # every modified page gets flushed back to the dataset cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 57182 ############################################################################### # Test virtual mem auto with a raw driver def test_virtualmem_3(): if gdal.GetConfigOption('SKIP_VIRTUALMEM'): pytest.skip() try: from osgeo import gdalnumeric except ImportError: pytest.skip() if not sys.platform.startswith('linux'): pytest.skip() for tmpfile in ['tmp/virtualmem_3.img', '/vsimem/virtualmem_3.img']: ds = gdal.GetDriverByName('EHdr').Create(tmpfile, 400, 300, 2) ar1 = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Write) ar2 = ds.GetRasterBand(2).GetVirtualMemAutoArray(gdal.GF_Write) for y in range(ds.RasterYSize): ar1[y].fill(127) ar2[y].fill(255) # We need to destroy the array before dataset destruction ar1 = None ar2 = None ds = None ds = gdal.Open(tmpfile) ar1 = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Read) ar2 = ds.GetRasterBand(2).GetVirtualMemAutoArray(gdal.GF_Read) ar_127 = gdalnumeric.empty(ds.RasterXSize) ar_127.fill(127) ar_255 = gdalnumeric.empty(ds.RasterXSize) ar_255.fill(255) for y in range(ds.RasterYSize): assert gdalnumeric.array_equal(ar1[y], ar_127) assert gdalnumeric.array_equal(ar2[y], ar_255) # We need to destroy the array before dataset destruction ar1 = None ar2 = None ds = None gdal.GetDriverByName('EHdr').Delete(tmpfile) ############################################################################### # Test virtual mem auto with GTiff def test_virtualmem_4(): if gdal.GetConfigOption('SKIP_VIRTUALMEM'): pytest.skip() try: from osgeo import gdalnumeric except ImportError: pytest.skip() if not sys.platform.startswith('linux'): pytest.skip() tmpfile = 'tmp/virtualmem_4.tif' for option in ['INTERLEAVE=PIXEL', 'INTERLEAVE=BAND']: gdal.Unlink(tmpfile) ds = gdal.GetDriverByName('GTiff').Create(tmpfile, 400, 301, 2, options=[option]) ar1 = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Write) if gdal.GetLastErrorMsg().find('mmap() failed') >= 0: ar1 = None ds = None pytest.skip() ar1 = None ar1 = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Write) ar1_bis = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Write) ar2 = ds.GetRasterBand(2).GetVirtualMemAutoArray(gdal.GF_Write) for y in range(ds.RasterYSize): ar1[y].fill(127) ar2[y].fill(255) val = ar1_bis[0][0] # We need to destroy the array before dataset destruction ar1 = None ar1_bis = None ar2 = None ds = None assert val == 127 ds = gdal.Open(tmpfile) ar1 = ds.GetRasterBand(1).GetVirtualMemAutoArray(gdal.GF_Read) ar2 = ds.GetRasterBand(2).GetVirtualMemAutoArray(gdal.GF_Read) ar_127 = gdalnumeric.empty(ds.RasterXSize) ar_127.fill(127) ar_255 = gdalnumeric.empty(ds.RasterXSize) ar_255.fill(255) for y in range(ds.RasterYSize): if not gdalnumeric.array_equal(ar1[y], ar_127): ar1 = None ar2 = None ds = None pytest.fail() if not gdalnumeric.array_equal(ar2[y], ar_255): ar1 = None ar2 = None ds = None pytest.fail() # We need to destroy the array before dataset destruction ar1 = None ar2 = None ds = None gdal.GetDriverByName('GTiff').Delete(tmpfile) gdalautotest-3.0.4/gcore/minixml.py0000755003401500001440000001673513614005316016774 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: minixml.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test Minixml services from Python. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2005, Frank Warmerdam # Copyright (c) 2009-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 from osgeo import gdal ############################################################################### # Parse a simple document into a tree of lists. def test_minixml_1(): tree = gdal.ParseXMLString('abc') assert tree[0] == gdal.CXT_Element, 'wrong node type.' assert tree[1] == 'TestDoc', 'Wrong element name' assert len(tree) == 5, 'Wrong number of children.' # Check style attribute node = tree[2] assert node[0] == gdal.CXT_Attribute, 'wrong node type.' assert node[1] == 'style', 'Wrong element name' assert len(node) == 3, 'Wrong number of children.' assert node[2][1] == '123', 'Wrong element content.' # Check element node = tree[3] assert node[0] == gdal.CXT_Element, 'wrong node type.' assert node[1] == 'sub1', 'Wrong element name' assert len(node) == 2, 'Wrong number of children.' # Check element node = tree[4] assert node[0] == gdal.CXT_Element, 'wrong node type.' assert node[1] == 'sub2', 'Wrong element name' assert len(node) == 3, 'Wrong number of children.' assert node[2][1] == 'abc', 'Wrong element content.' ############################################################################### # Serialize an XML Tree def test_minixml_2(): tree = [0, 'TestDoc', [2, 'style', [1, '123']], [0, 'sub1'], [0, 'sub2', [1, 'abc']]] doc_target = '\n \n abc\n\n' doc_got = gdal.SerializeXMLTree(tree) assert doc_got == doc_target, 'serialize xml tree failed.' ############################################################################### # Read XML document with complex DOCTYPE element. def test_minixml_3(): fp = open('data/doctype.xml', 'r') text = fp.read() tree = gdal.ParseXMLString(text) assert tree[0] == gdal.CXT_Element, 'wrong node type.' # Check element node = tree[6] assert node[0] == gdal.CXT_Element, 'wrong node type.' assert node[1] == 'chapter', 'Wrong element name' assert len(node) == 7, 'Wrong number of children.' # Check subelement subnode = node[2] assert subnode[0] == gdal.CXT_Element, 'wrong node type.' assert subnode[1] == 'title', 'Wrong element name' assert len(subnode) == 3, 'Wrong number of children.' assert subnode[2][1] == 'Chapter 1', 'Wrong element content.' # Check fist <chapter><para> subelement subnode = node[3] assert subnode[0] == gdal.CXT_Element, 'wrong node type.' assert subnode[1] == 'para', 'Wrong element name' assert len(subnode) == 3, 'Wrong number of children.' ############################################################################### # Parse and serialize an XML Tree with a <?xml> prolog def test_minixml_4(): xml = """<?xml encoding="utf-8"?>\n<foo />\n""" got_xml = gdal.SerializeXMLTree(gdal.ParseXMLString(xml)) assert xml == got_xml, 'serialize xml tree failed.' ############################################################################### # Parse malformed XML. Complains, but still makes a tree. def test_minixml_5(): test_pairs = ( ('<a></A>', 'case'), ('<a b=c></a>', 'quoted'), ) for xml_str, expect in test_pairs: with gdaltest.error_handler(): tree = gdal.ParseXMLString(xml_str) found = gdal.GetLastErrorMsg() assert expect in found, ('Did not find expected error message: "%s" ' 'Found: "%s" ' 'For test string: "%s""' % (expect, found, xml_str)) assert tree is not None, ('Tree is None: "%s"' % tree) ############################################################################### # Parse malformed XML. def test_minixml_6(): test_pairs = ( ('<', 'element token after open angle bracket'), ('<a>', 'not all elements have been closed'), ('<a><b>', 'not all elements have been closed'), ('<a><b></a></b>', 'have matching'), ('<a foo=></a>', 'attribute value'), ('<></>', 'element token'), ('<&></&>', 'matching'), ('<a></a', 'Missing close angle'), ('<a foo=2\'> foo=2\'>', 'unexpected token'), ('<a?>', 'without matching'), ('<a/.', 'for value of attribute '), ('<a\'>', 'reached EOF before closing quote'), ) for xml_str, expect in test_pairs: with gdaltest.error_handler(): tree = gdal.ParseXMLString(xml_str) found = gdal.GetLastErrorMsg() assert expect in found, ('Did not find expected error message: "%s" ' 'Found: "%s" ' 'For test string: "%s""' % (expect, found, xml_str)) assert tree is None, ('Tree is not None: "%s"' % tree) ############################################################################### # Parse malformed XML. Pass without warning, but should not pass. def test_minixml_7(): test_strings = ( '<1></1>', '<-></->', '<.></.>', '<![CDATA[', ) for xml_str in test_strings: gdal.ErrorReset() tree = gdal.ParseXMLString(xml_str) found = gdal.GetLastErrorMsg() assert found == '', ('Unexpected msg "%s"' % found) assert tree is not None, ('Tree is None: "%s"' % tree) ############################################################################### # Parse XML with too many nesting def test_minixml_8(): xml_str = '<a>' * 10001 xml_str += '</a>' * 10001 gdal.ErrorReset() with gdaltest.error_handler(): tree = gdal.ParseXMLString(xml_str) assert tree is None, 'expected None tree' assert gdal.GetLastErrorMsg() != '', 'expected error message' ############################################################################### # Cleanup def test_minixml_cleanup(): pass �����������������������������������gdalautotest-3.0.4/gcore/vsifile.py�����������������������������������������������������������������0000755�0034015�0000144�00000071404�13614005316�016752� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vsifile.py 9c24ad96457892f982965b61ae48b3cc48b845f5 2019-05-23 16:26:40 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test VSI file primitives # Author: Even Rouault <even dot rouault at mines dash parid dot org> # ############################################################################### # Copyright (c) 2011-2013, Even Rouault <even dot rouault at mines-paris dot org> # # 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 time from osgeo import gdal import gdaltest import pytest ############################################################################### # Generic test def vsifile_generic(filename): start_time = time.time() fp = gdal.VSIFOpenL(filename, 'wb+') assert fp is not None assert gdal.VSIFWriteL('0123456789', 1, 10, fp) == 10 assert gdal.VSIFFlushL(fp) == 0 assert gdal.VSIFTruncateL(fp, 20) == 0 assert gdal.VSIFTellL(fp) == 10 assert gdal.VSIFTruncateL(fp, 5) == 0 assert gdal.VSIFTellL(fp) == 10 assert gdal.VSIFSeekL(fp, 0, 2) == 0 assert gdal.VSIFTellL(fp) == 5 gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 7 assert abs(start_time - statBuf.mtime) <= 2 fp = gdal.VSIFOpenL(filename, 'rb') buf = gdal.VSIFReadL(1, 7, fp) assert gdal.VSIFWriteL('a', 1, 1, fp) == 0 assert gdal.VSIFTruncateL(fp, 0) != 0 gdal.VSIFCloseL(fp) assert buf.decode('ascii') == '01234XX' # Test append mode on existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 9 assert gdal.Unlink(filename) == 0 statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG) assert statBuf is None # Test append mode on non existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 2 assert gdal.Unlink(filename) == 0 ############################################################################### # Test /vsimem def test_vsifile_1(): return vsifile_generic('/vsimem/vsifile_1.bin') ############################################################################### # Test regular file system def test_vsifile_2(): ret = vsifile_generic('tmp/vsifile_2.bin') if ret != 'success' and gdaltest.skip_on_travis(): # FIXME # Fails on Travis with 17592186044423 (which is 0x10 00 00 00 00 07 instead of 7) at line 63 # Looks like a 32/64bit issue with Python bindings of VSIStatL() pytest.skip() return ret ############################################################################### # Test ftruncate >= 32 bit def test_vsifile_3(): if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() filename = 'tmp/vsifile_3' fp = gdal.VSIFOpenL(filename, 'wb+') gdal.VSIFTruncateL(fp, 10 * 1024 * 1024 * 1024) gdal.VSIFSeekL(fp, 0, 2) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdal.VSIFCloseL(fp) gdal.Unlink(filename) pytest.fail(pos) gdal.VSIFSeekL(fp, 0, 0) gdal.VSIFSeekL(fp, pos, 0) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdal.VSIFCloseL(fp) gdal.Unlink(filename) pytest.fail(pos) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) gdal.Unlink(filename) assert statBuf.size == 10 * 1024 * 1024 * 1024 ############################################################################### # Test fix for #4583 (short reads) def test_vsifile_4(): fp = gdal.VSIFOpenL('vsifile.py', 'rb') data = gdal.VSIFReadL(1000000, 1, fp) # print(len(data)) gdal.VSIFSeekL(fp, 0, 0) data = gdal.VSIFReadL(1, 1000000, fp) assert data gdal.VSIFCloseL(fp) ############################################################################### # Test vsicache def test_vsifile_5(): fp = gdal.VSIFOpenL('tmp/vsifile_5.bin', 'wb') ref_data = ''.join(['%08X' % i for i in range(5 * 32768)]) gdal.VSIFWriteL(ref_data, 1, len(ref_data), fp) gdal.VSIFCloseL(fp) gdal.SetConfigOption('VSI_CACHE', 'YES') for i in range(3): if i == 0: gdal.SetConfigOption('VSI_CACHE_SIZE', '0') elif i == 1: gdal.SetConfigOption('VSI_CACHE_SIZE', '65536') else: gdal.SetConfigOption('VSI_CACHE_SIZE', None) fp = gdal.VSIFOpenL('tmp/vsifile_5.bin', 'rb') gdal.VSIFSeekL(fp, 50000, 0) if gdal.VSIFTellL(fp) != 50000: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() gdal.VSIFSeekL(fp, 50000, 1) if gdal.VSIFTellL(fp) != 100000: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() gdal.VSIFSeekL(fp, 0, 2) if gdal.VSIFTellL(fp) != 5 * 32768 * 8: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() gdal.VSIFReadL(1, 1, fp) gdal.VSIFSeekL(fp, 0, 0) data = gdal.VSIFReadL(1, 3 * 32768, fp) if data.decode('ascii') != ref_data[0:3 * 32768]: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() gdal.VSIFSeekL(fp, 16384, 0) data = gdal.VSIFReadL(1, 5 * 32768, fp) if data.decode('ascii') != ref_data[16384:16384 + 5 * 32768]: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() data = gdal.VSIFReadL(1, 50 * 32768, fp) if data[0:1130496].decode('ascii') != ref_data[16384 + 5 * 32768:]: gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) pytest.fail() gdal.VSIFCloseL(fp) gdal.SetConfigOption('VSI_CACHE_SIZE', None) gdal.SetConfigOption('VSI_CACHE', None) gdal.Unlink('tmp/vsifile_5.bin') ############################################################################### # Test vsicache above 2 GB def test_vsifile_6(): if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() offset = 4 * 1024 * 1024 * 1024 ref_data = 'abcd'.encode('ascii') fp = gdal.VSIFOpenL('tmp/vsifile_6.bin', 'wb') gdal.VSIFSeekL(fp, offset, 0) gdal.VSIFWriteL(ref_data, 1, len(ref_data), fp) gdal.VSIFCloseL(fp) # Sanity check without VSI_CACHE fp = gdal.VSIFOpenL('tmp/vsifile_6.bin', 'rb') gdal.VSIFSeekL(fp, offset, 0) got_data = gdal.VSIFReadL(1, len(ref_data), fp) gdal.VSIFCloseL(fp) assert ref_data == got_data # Real test now gdal.SetConfigOption('VSI_CACHE', 'YES') fp = gdal.VSIFOpenL('tmp/vsifile_6.bin', 'rb') gdal.SetConfigOption('VSI_CACHE', None) gdal.VSIFSeekL(fp, offset, 0) got_data = gdal.VSIFReadL(1, len(ref_data), fp) gdal.VSIFCloseL(fp) assert ref_data == got_data gdal.Unlink('tmp/vsifile_6.bin') ############################################################################### # Test limit cases on /vsimem def test_vsifile_7(): if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: pytest.skip() # Test extending file beyond reasonable limits in write mode fp = gdal.VSIFOpenL('/vsimem/vsifile_7.bin', 'wb') assert gdal.VSIFSeekL(fp, 0x7FFFFFFFFFFFFFFF, 0) == 0 assert gdal.VSIStatL('/vsimem/vsifile_7.bin').size == 0 gdal.PushErrorHandler() ret = gdal.VSIFWriteL('a', 1, 1, fp) gdal.PopErrorHandler() assert ret == 0 assert gdal.VSIStatL('/vsimem/vsifile_7.bin').size == 0 gdal.VSIFCloseL(fp) # Test seeking beyond file size in read-only mode fp = gdal.VSIFOpenL('/vsimem/vsifile_7.bin', 'rb') assert gdal.VSIFSeekL(fp, 0x7FFFFFFFFFFFFFFF, 0) == 0 assert gdal.VSIFEofL(fp) == 0 assert gdal.VSIFTellL(fp) == 0x7FFFFFFFFFFFFFFF assert not gdal.VSIFReadL(1, 1, fp) assert gdal.VSIFEofL(fp) == 1 gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/vsifile_7.bin') ############################################################################### # Test renaming directory in /vsimem def test_vsifile_8(): # octal 0666 = decimal 438 gdal.Mkdir('/vsimem/mydir', 438) fp = gdal.VSIFOpenL('/vsimem/mydir/a', 'wb') gdal.VSIFCloseL(fp) gdal.Rename('/vsimem/mydir', '/vsimem/newdir'.encode('ascii').decode('ascii')) assert gdal.VSIStatL('/vsimem/newdir') is not None assert gdal.VSIStatL('/vsimem/newdir/a') is not None gdal.Unlink('/vsimem/newdir/a') gdal.Rmdir('/vsimem/newdir') ############################################################################### # Test ReadDir() def test_vsifile_9(): lst = gdal.ReadDir('.') assert len(lst) >= 4 # Test truncation lst_truncated = gdal.ReadDir('.', int(len(lst) / 2)) assert len(lst_truncated) > int(len(lst) / 2) gdal.Mkdir('/vsimem/mydir', 438) for i in range(10): fp = gdal.VSIFOpenL('/vsimem/mydir/%d' % i, 'wb') gdal.VSIFCloseL(fp) lst = gdal.ReadDir('/vsimem/mydir') assert len(lst) >= 4 # Test truncation lst_truncated = gdal.ReadDir('/vsimem/mydir', int(len(lst) / 2)) assert len(lst_truncated) > int(len(lst) / 2) for i in range(10): gdal.Unlink('/vsimem/mydir/%d' % i) gdal.Rmdir('/vsimem/mydir') ############################################################################### # Test fuzzer friendly archive def test_vsifile_10(): gdal.FileFromMemBuffer('/vsimem/vsifile_10.tar', """FUZZER_FRIENDLY_ARCHIVE ***NEWFILE***:test.txt abc***NEWFILE***:huge.txt 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890123456789012345678X ***NEWFILE***:small.txt a""") contents = gdal.ReadDir('/vsitar//vsimem/vsifile_10.tar') if contents is None: gdal.Unlink('/vsimem/vsifile_10.tar') pytest.skip() assert contents == ['test.txt', 'huge.txt', 'small.txt'] assert gdal.VSIStatL('/vsitar//vsimem/vsifile_10.tar/test.txt').size == 3 assert gdal.VSIStatL('/vsitar//vsimem/vsifile_10.tar/huge.txt').size == 3888 assert gdal.VSIStatL('/vsitar//vsimem/vsifile_10.tar/small.txt').size == 1 gdal.FileFromMemBuffer('/vsimem/vsifile_10.tar', """FUZZER_FRIENDLY_ARCHIVE ***NEWFILE***:x abc""") contents = gdal.ReadDir('/vsitar//vsimem/vsifile_10.tar') assert contents == ['x'] gdal.FileFromMemBuffer('/vsimem/vsifile_10.tar', """FUZZER_FRIENDLY_ARCHIVE ***NEWFILE***:x abc***NEWFILE***:""") contents = gdal.ReadDir('/vsitar//vsimem/vsifile_10.tar') assert contents == ['x'] gdal.Unlink('/vsimem/vsifile_10.tar') ############################################################################### # Test generic Truncate implementation for file extension def test_vsifile_11(): f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'wb') gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsisubfile/0_,/vsimem/vsifile_11', 'wb') gdal.VSIFWriteL('0123456789', 1, 10, f) assert gdal.VSIFTruncateL(f, 10 + 4096 + 2) == 0 assert gdal.VSIFTellL(f) == 10 assert gdal.VSIFTruncateL(f, 0) == -1 gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'rb') data = gdal.VSIFReadL(1, 10 + 4096 + 2, f) gdal.VSIFCloseL(f) import struct data = struct.unpack('B' * len(data), data) assert data[0] == 48 and data[9] == 57 and data[10] == 0 and data[10 + 4096 + 2 - 1] == 0 gdal.Unlink('/vsimem/vsifile_11') ############################################################################### # Test regular file system sparse file support def test_vsifile_12(): target_dir = 'tmp' if gdal.VSISupportsSparseFiles(target_dir) == 0: pytest.skip() # Minimum value to make it work on NTFS block_size = 65536 f = gdal.VSIFOpenL(target_dir + '/vsifile_12', 'wb') gdal.VSIFWriteL('a', 1, 1, f) assert gdal.VSIFTruncateL(f, block_size * 2) == 0 ret = gdal.VSIFGetRangeStatusL(f, 0, 1) # We could get unknown on nfs if ret == gdal.VSI_RANGE_STATUS_UNKNOWN: print('Range status unknown') else: assert ret == gdal.VSI_RANGE_STATUS_DATA ret = gdal.VSIFGetRangeStatusL(f, block_size * 2 - 1, 1) assert ret == gdal.VSI_RANGE_STATUS_HOLE gdal.VSIFCloseL(f) gdal.Unlink(target_dir + '/vsifile_12') ############################################################################### # Test reading filename with prefixes without terminating slash def test_vsifile_13(): gdal.VSIFOpenL('/vsigzip', 'rb') gdal.VSIFOpenL('/vsizip', 'rb') gdal.VSIFOpenL('/vsitar', 'rb') gdal.VSIFOpenL('/vsimem', 'rb') gdal.VSIFOpenL('/vsisparse', 'rb') gdal.VSIFOpenL('/vsisubfile', 'rb') gdal.VSIFOpenL('/vsicurl', 'rb') gdal.VSIFOpenL('/vsis3', 'rb') gdal.VSIFOpenL('/vsicurl_streaming', 'rb') gdal.VSIFOpenL('/vsis3_streaming', 'rb') gdal.VSIFOpenL('/vsistdin', 'rb') fp = gdal.VSIFOpenL('/vsistdout', 'wb') if fp is not None: gdal.VSIFCloseL(fp) gdal.VSIStatL('/vsigzip') gdal.VSIStatL('/vsizip') gdal.VSIStatL('/vsitar') gdal.VSIStatL('/vsimem') gdal.VSIStatL('/vsisparse') gdal.VSIStatL('/vsisubfile') gdal.VSIStatL('/vsicurl') gdal.VSIStatL('/vsis3') gdal.VSIStatL('/vsicurl_streaming') gdal.VSIStatL('/vsis3_streaming') gdal.VSIStatL('/vsistdin') gdal.VSIStatL('/vsistdout') ############################################################################### # Check performance issue (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1673) def test_vsifile_14(): with gdaltest.error_handler(): gdal.VSIFOpenL('/vsitar//vsitar//vsitar//vsitar//vsitar//vsitar//vsitar//vsitar/a.tgzb.tgzc.tgzd.tgze.tgzf.tgz.h.tgz.i.tgz', 'rb') ############################################################################### # Test issue with Eof() not detecting end of corrupted gzip stream (#6944) def test_vsifile_15(): fp = gdal.VSIFOpenL('/vsigzip/data/corrupted_z_buf_error.gz', 'rb') assert fp is not None file_len = 0 while not gdal.VSIFEofL(fp): with gdaltest.error_handler(): file_len += len(gdal.VSIFReadL(1, 4, fp)) assert file_len == 6469 with gdaltest.error_handler(): file_len += len(gdal.VSIFReadL(1, 4, fp)) assert file_len == 6469 with gdaltest.error_handler(): assert gdal.VSIFSeekL(fp, 0, 2) != 0 assert gdal.VSIFSeekL(fp, 0, 0) == 0 len_read = len(gdal.VSIFReadL(1, file_len, fp)) assert len_read == file_len gdal.VSIFCloseL(fp) ############################################################################### # Test failed gdal.Rename() with exceptions enabled def test_vsifile_16(): old_val = gdal.GetUseExceptions() gdal.UseExceptions() try: gdal.Rename('/tmp/i_do_not_exist_vsifile_16.tif', '/tmp/me_neither.tif') ret = 'fail' except RuntimeError: ret = 'success' if not old_val: gdal.DontUseExceptions() return ret ############################################################################### # Test gdal.GetActualURL() on a non-network based filesystem def test_vsifile_17(): assert gdal.GetActualURL('foo') is None assert gdal.GetSignedURL('foo') is None ############################################################################### # Test gdal.GetFileSystemsPrefixes() def test_vsifile_18(): prefixes = gdal.GetFileSystemsPrefixes() assert '/vsimem/' in prefixes ############################################################################### # Test gdal.GetFileSystemOptions() def test_vsifile_19(): for prefix in gdal.GetFileSystemsPrefixes(): options = gdal.GetFileSystemOptions(prefix) # Check that the options is XML correct if options is not None: ret = gdal.ParseXMLString(options) assert ret is not None, (prefix, options) ############################################################################### # Test gdal.VSIFReadL with None fp def test_vsifile_20(): try: gdal.VSIFReadL(1, 1, None) except ValueError: return pytest.fail() ############################################################################### # Test gdal.VSIGetMemFileBuffer_unsafe() and gdal.VSIFWriteL() reading buffers def test_vsifile_21(): filename = '/vsimem/read.tif' filename_write = '/vsimem/write.tif' data = 'This is some data' vsifile = gdal.VSIFOpenL(filename, 'wb') assert gdal.VSIFWriteL(data, 1, len(data), vsifile) == len(data) gdal.VSIFCloseL(vsifile) vsifile = gdal.VSIFOpenL(filename, 'rb') gdal.VSIFSeekL(vsifile, 0, 2) vsilen = gdal.VSIFTellL(vsifile) gdal.VSIFSeekL(vsifile, 0, 0) data_read = gdal.VSIFReadL(1, vsilen, vsifile) data_mem = gdal.VSIGetMemFileBuffer_unsafe(filename) assert data_read == data_mem[:] gdal.VSIFCloseL(vsifile) vsifile_write = gdal.VSIFOpenL(filename_write, 'wb') assert gdal.VSIFWriteL(data_mem, 1, len(data_mem), vsifile_write) == len(data_mem) gdal.VSIFCloseL(vsifile_write) gdal.Unlink(filename) gdal.Unlink(filename_write) with gdaltest.error_handler(): data3 = gdal.VSIGetMemFileBuffer_unsafe(filename) assert data3 == None def test_vsifile_22(): # VSIOpenL doesn't set errorno gdal.VSIErrorReset() assert gdal.VSIGetLastErrorNo() == 0, \ ("Expected Err=0 after VSIErrorReset(), got %d" % gdal.VSIGetLastErrorNo()) fp = gdal.VSIFOpenL('tmp/not-existing', 'r') assert fp is None, "Expected None from VSIFOpenL" assert gdal.VSIGetLastErrorNo() == 0, \ ("Expected Err=0 from VSIFOpenL, got %d" % gdal.VSIGetLastErrorNo()) # VSIOpenExL does fp = gdal.VSIFOpenExL('tmp/not-existing', 'r', 1) assert fp is None, "Expected None from VSIFOpenExL" assert gdal.VSIGetLastErrorNo() == 1, \ ("Expected Err=1 from VSIFOpenExL, got %d" % gdal.VSIGetLastErrorNo()) assert len(gdal.VSIGetLastErrorMsg()) != 0, "Expected a VSI error message" gdal.VSIErrorReset() assert gdal.VSIGetLastErrorNo() == 0, \ ("Expected Err=0 after VSIErrorReset(), got %d" % gdal.VSIGetLastErrorNo()) ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/675 def test_vsitar_bug_675(): content = gdal.ReadDir('/vsitar/data/tar_with_star_base256_fields.tar') assert len(content) == 1 ############################################################################### # Test multithreaded compression def test_vsigzip_multi_thread(): with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS', 'CPL_VSIL_DEFLATE_CHUNK_SIZE': '32K'}): f = gdal.VSIFOpenL('/vsigzip//vsimem/vsigzip_multi_thread.gz', 'wb') for i in range(100000): gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsigzip//vsimem/vsigzip_multi_thread.gz', 'rb') data = gdal.VSIFReadL(100000, 5, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/vsigzip_multi_thread.gz') if data != 'hello' * 100000: for i in range(10000): if data[i*5:i*5+5] != 'hello': print(i*5, data[i*5:i*5+5], data[i*5-5:i*5+5-5]) break pytest.fail() ############################################################################### # Test vsisync() def test_vsisync(): with gdaltest.error_handler(): assert not gdal.Sync('/i_do/not/exist', '/vsimem/') with gdaltest.error_handler(): assert not gdal.Sync('vsifile.py', '/i_do/not/exist') # Test copying a file for i in range(2): assert gdal.Sync('vsifile.py', '/vsimem/') assert gdal.VSIStatL('/vsimem/vsifile.py').size == gdal.VSIStatL('vsifile.py').size gdal.Unlink('/vsimem/vsifile.py') # Test copying the content of a directory gdal.Mkdir('/vsimem/test_sync', 0) gdal.FileFromMemBuffer('/vsimem/test_sync/foo.txt', 'bar') gdal.Mkdir('/vsimem/test_sync/subdir', 0) gdal.FileFromMemBuffer('/vsimem/test_sync/subdir/bar.txt', 'baz') if sys.platform != 'win32': with gdaltest.error_handler(): assert not gdal.Sync('/vsimem/test_sync/', '/i_do_not/exist') assert gdal.Sync('/vsimem/test_sync/', '/vsimem/out') assert gdal.ReadDir('/vsimem/out') == [ 'foo.txt', 'subdir' ] assert gdal.ReadDir('/vsimem/out/subdir') == [ 'bar.txt' ] # Again assert gdal.Sync('/vsimem/test_sync/', '/vsimem/out') gdal.RmdirRecursive('/vsimem/out') # Test copying a directory pct_values = [] def my_progress(pct, message, user_data): pct_values.append(pct) assert gdal.Sync('/vsimem/test_sync', '/vsimem/out', callback = my_progress) assert pct_values == [0.5, 1.0] assert gdal.ReadDir('/vsimem/out') == [ 'test_sync' ] assert gdal.ReadDir('/vsimem/out/test_sync') == [ 'foo.txt', 'subdir' ] gdal.RmdirRecursive('/vsimem/test_sync') gdal.RmdirRecursive('/vsimem/out') ############################################################################### # Test gdal.OpenDir() def test_vsifile_opendir(): # Non existing dir d = gdal.OpenDir('/vsimem/i_dont_exist') assert not d gdal.Mkdir('/vsimem/vsifile_opendir', 0o755) # Empty dir d = gdal.OpenDir('/vsimem/vsifile_opendir') assert d entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) gdal.FileFromMemBuffer('/vsimem/vsifile_opendir/test', 'foo') gdal.Mkdir('/vsimem/vsifile_opendir/subdir', 0o755) gdal.Mkdir('/vsimem/vsifile_opendir/subdir/subdir2', 0o755) gdal.FileFromMemBuffer('/vsimem/vsifile_opendir/subdir/subdir2/test2', 'bar') # Unlimited depth d = gdal.OpenDir('/vsimem/vsifile_opendir') entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir' assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir/subdir2' assert entry.mode == 16384 entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir/subdir2/test2' assert entry.mode == 32768 entry = gdal.GetNextDirEntry(d) assert entry.name == 'test' assert entry.mode == 32768 assert entry.modeKnown assert entry.size == 3 assert entry.sizeKnown assert entry.mtime != 0 assert entry.mtimeKnown assert not entry.extra entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) # Only top level d = gdal.OpenDir('/vsimem/vsifile_opendir', 0) entry = gdal.GetNextDirEntry(d) assert entry.name == 'subdir' entry = gdal.GetNextDirEntry(d) assert entry.name == 'test' entry = gdal.GetNextDirEntry(d) assert not entry gdal.CloseDir(d) # Depth 1 files = [l_entry.name for l_entry in gdal.listdir('/vsimem/vsifile_opendir', 1)] assert files == ['subdir', 'subdir/subdir2', 'test'] gdal.RmdirRecursive('/vsimem/vsifile_opendir') ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1559 def test_vsitar_verylongfilename(): f = gdal.VSIFOpenL('/vsitar/data/verylongfilename.tar/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ccccccccccccccccccccccccccccccccccc/ddddddddddddddddddddddddddddddddddddddd/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee/fffffffffffffffffffffffffffffffffffffffffffffff/foo', 'rb') assert f data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar' ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/hfa_write.py���������������������������������������������������������������0000755�0034015�0000144�00000033307�13614005316�017261� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: hfa_write.py 8c1d039cc423641eee65e278fbadf2cf52e15062 2020-01-06 22:17:34 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for Erdas Imagine (.img) HFA driver. # Author: Frank Warmerdam <warmerdam@pobox.com> # ############################################################################### # Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> # Copyright (c) 2008-2013, Even Rouault <even dot rouault at mines-paris dot org> # # 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 pytest from osgeo import gdal import gdaltest ############################################################################### # test that we can write a small file with a custom layer name. def test_hfa_write_desc(): src_ds = gdal.Open('data/byte.tif') new_ds = gdal.GetDriverByName('HFA').CreateCopy('tmp/test_desc.img', src_ds) bnd = new_ds.GetRasterBand(1) bnd.SetDescription('CustomBandName') bnd = None src_ds = None new_ds = None new_ds = gdal.Open('tmp/test_desc.img') bnd = new_ds.GetRasterBand(1) assert bnd.GetDescription() == 'CustomBandName', 'Didnt get custom band name.' bnd = None new_ds = None gdal.GetDriverByName('HFA').Delete('tmp/test_desc.img') ############################################################################### # test writing 4 bit files. def test_hfa_write_4bit(): drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/byte.tif') ds = drv.CreateCopy('tmp/4bit.img', src_ds, options=['NBITS=1']) ds = None src_ds = None ds = gdal.Open('tmp/4bit.img') cs = ds.GetRasterBand(1).Checksum() assert cs == 252, 'Got wrong checksum on 4bit image.' ds = None drv.Delete('tmp/4bit.img') ############################################################################### # test writing 4 bit files compressed. def test_hfa_write_4bit_compressed(): drv = gdal.GetDriverByName('HFA') src_ds = gdal.Open('data/byte.tif') ds = drv.CreateCopy('tmp/4bitc.img', src_ds, options=['NBITS=1', 'COMPRESSED=YES']) ds = None src_ds = None ds = gdal.Open('tmp/4bitc.img') cs = ds.GetRasterBand(1).Checksum() assert cs == 252, 'Got wrong checksum on 4bit image.' ds = None drv.Delete('tmp/4bitc.img') ############################################################################### # Test creating a file with a nodata value, and fetching otherwise unread # blocks and verifying they are the nodata value. (#2427) def test_hfa_write_nd_invalid(): drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/ndinvalid.img', 512, 512, 1, gdal.GDT_Byte, []) ds.GetRasterBand(1).SetNoDataValue(200) ds = None ds = gdal.Open('tmp/ndinvalid.img') cs = ds.GetRasterBand(1).Checksum() assert cs == 29754, 'Got wrong checksum on invalid image.' ds = None drv.Delete('tmp/ndinvalid.img') ############################################################################### # Test updating .rrd overviews in place (#2524). def test_hfa_update_overviews(): shutil.copyfile('data/small_ov.img', 'tmp/small.img') shutil.copyfile('data/small_ov.rrd', 'tmp/small.rrd') ds = gdal.Open('tmp/small.img', gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[2]) assert result == 0, 'BuildOverviews() failed.' ds = None ############################################################################### # Test cleaning external overviews. def test_hfa_clean_external_overviews(): ds = gdal.Open('tmp/small.img', gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[]) assert result == 0, 'BuildOverviews() failed.' assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'Overviews still exist.' ds = None ds = gdal.Open('tmp/small.img') assert ds.GetRasterBand(1).GetOverviewCount() == 0, 'Overviews still exist.' ds = None assert not os.path.exists('tmp/small.rrd') gdal.GetDriverByName('HFA').Delete('tmp/small.img') ############################################################################### # Test writing high frequency data (#2525). def test_hfa_bug_2525(): drv = gdal.GetDriverByName('HFA') ds = drv.Create('tmp/test_hfa.img', 64, 64, 1, gdal.GDT_UInt16, options=['COMPRESSED=YES']) import struct data = struct.pack('H' * 64, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535, 0, 65535) for i in range(64): ds.GetRasterBand(1).WriteRaster(0, i, 64, 1, data) ds = None drv.Delete('tmp/test_hfa.img') ############################################################################### # Test building external overviews with HFA_USE_RRD=YES def test_hfa_use_rrd(): shutil.copyfile('data/small_ov.img', 'tmp/small.img') old_value = gdal.GetConfigOption('HFA_USE_RRD', 'NO') gdal.SetConfigOption('HFA_USE_RRD', 'YES') ds = gdal.Open('tmp/small.img', gdal.GA_Update) result = ds.BuildOverviews(overviewlist=[2]) gdal.SetConfigOption('HFA_USE_RRD', old_value) assert result == 0, 'BuildOverviews() failed.' ds = None try: os.stat('tmp/small.rrd') except OSError: pytest.fail('small.rrd not present.') ds = gdal.Open('tmp/small.img') assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 26148, \ 'Unexpected checksum.' ds = None gdal.GetDriverByName('HFA').Delete('tmp/small.img') ############################################################################### # Test fix for #4831 def test_hfa_update_existing_aux_overviews(): gdal.SetConfigOption('USE_RRD', 'YES') ds = gdal.GetDriverByName('BMP').Create('tmp/hfa_update_existing_aux_overviews.bmp', 100, 100, 1) ds.GetRasterBand(1).Fill(255) ds = None # Create overviews ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None # Save overviews checksum ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') cs_ovr0 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs_ovr1 = ds.GetRasterBand(1).GetOverview(1).Checksum() # and regenerate them ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') # Check overviews checksum new_cs_ovr0 = ds.GetRasterBand(1).GetOverview(0).Checksum() new_cs_ovr1 = ds.GetRasterBand(1).GetOverview(1).Checksum() if cs_ovr0 != new_cs_ovr0: gdal.SetConfigOption('USE_RRD', None) pytest.fail() if cs_ovr1 != new_cs_ovr1: gdal.SetConfigOption('USE_RRD', None) pytest.fail() # and regenerate them twice in a row ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') # Check overviews checksum new_cs_ovr0 = ds.GetRasterBand(1).GetOverview(0).Checksum() new_cs_ovr1 = ds.GetRasterBand(1).GetOverview(1).Checksum() if cs_ovr0 != new_cs_ovr0: gdal.SetConfigOption('USE_RRD', None) pytest.fail() if cs_ovr1 != new_cs_ovr1: gdal.SetConfigOption('USE_RRD', None) pytest.fail() # and regenerate them with an extra overview level ds.BuildOverviews('NEAR', overviewlist=[8]) ds = None ds = gdal.Open('tmp/hfa_update_existing_aux_overviews.bmp') # Check overviews checksum new_cs_ovr0 = ds.GetRasterBand(1).GetOverview(0).Checksum() new_cs_ovr1 = ds.GetRasterBand(1).GetOverview(1).Checksum() if cs_ovr0 != new_cs_ovr0: gdal.SetConfigOption('USE_RRD', None) pytest.fail() if cs_ovr1 != new_cs_ovr1: gdal.SetConfigOption('USE_RRD', None) pytest.fail() ds = None gdal.GetDriverByName('BMP').Delete('tmp/hfa_update_existing_aux_overviews.bmp') gdal.SetConfigOption('USE_RRD', None) ############################################################################### # Test writing invalid WKT (#5258) def test_hfa_write_invalid_wkt(): # No GEOGCS ds = gdal.GetDriverByName('HFA').Create('/vsimem/hfa_write_invalid_wkt.img', 1, 1) ds.SetProjection("""PROJCS["NAD27 / UTM zone 11N", 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"]]""") ds = None # No DATUM in GEOGCS ds = gdal.GetDriverByName('HFA').Create('/vsimem/hfa_write_invalid_wkt.img', 1, 1) ds.SetProjection("""PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", 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"]]""") ds = None # No SPHEROID in DATUM ds = gdal.GetDriverByName('HFA').Create('/vsimem/hfa_write_invalid_wkt.img', 1, 1) ds.SetProjection("""PROJCS["NAD27 / UTM zone 11N", GEOGCS["NAD27", DATUM["North_American_Datum_1927", 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"]]""") ds = None gdal.GetDriverByName('HFA').Delete('/vsimem/hfa_write_invalid_wkt.img') ############################################################################### # Get the driver, and verify a few things about it. init_list = [ ('byte.tif', 4672), ('int16.tif', 4672), ('uint16.tif', 4672), ('int32.tif', 4672), ('uint32.tif', 4672), ('float32.tif', 4672), ('float64.tif', 4672), ('cfloat32.tif', 5028), ('cfloat64.tif', 5028), ('utmsmall.tif', 50054)] # full set of tests for normal mode. @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', 'testSetGeoTransform', 'testSetMetadata', ] ) @pytest.mark.require_driver('HFA') def test_hfa_create_normal(filename, checksum, testfunction): ut = gdaltest.GDALTest('HFA', filename, 1, checksum) getattr(ut, testfunction)() # Just a few for spill file, and compressed support. short_list = [ ('byte.tif', 4672), ('uint16.tif', 4672), ('float64.tif', 4672)] @pytest.mark.parametrize( 'filename,checksum', short_list, ids=[tup[0].split('.')[0] for tup in short_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', ] ) @pytest.mark.require_driver('HFA') def test_hfa_create_spill(filename, checksum, testfunction): ut = gdaltest.GDALTest('HFA', filename, 1, checksum, options=['USE_SPILL=YES']) getattr(ut, testfunction)() @pytest.mark.parametrize( 'filename,checksum', short_list, ids=[tup[0].split('.')[0] for tup in short_list], ) @pytest.mark.parametrize( 'testfunction', [ # 'testCreateCopy', 'testCreate', ] ) @pytest.mark.require_driver('HFA') def test_hfa_create_compress(filename, checksum, testfunction): ut = gdaltest.GDALTest('HFA', filename, 1, checksum, options=['COMPRESS=YES']) getattr(ut, testfunction)() def test_hfa_create_compress_big_block(): src_ds = gdal.GetDriverByName('MEM').Create('/vsimem/big_block.img', 128, 128, 1, gdal.GDT_UInt32) src_ds.GetRasterBand(1).Fill(4 * 1000 * 1000 * 1000) src_ds.GetRasterBand(1).WriteRaster(0,0,1,1,b'\0') gdal.GetDriverByName('HFA').CreateCopy('/vsimem/big_block.img', src_ds, options=['COMPRESS=YES', 'BLOCKSIZE=128']) ds = gdal.Open('/vsimem/big_block.img') got_data = ds.GetRasterBand(1).ReadRaster() ds = None gdal.Unlink('/vsimem/big_block.img') assert got_data == src_ds.GetRasterBand(1).ReadRaster() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/vsiwebhdfs.py��������������������������������������������������������������0000644�0034015�0000144�00000050405�13614005316�017450� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: vsiwebhdfs.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsiwebhdfs # Author: Even Rouault <even dot rouault at spatialys dot com> # ############################################################################### # Copyright (c) 2018 Even Rouault <even dot rouault at spatialys dot com> # # 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 stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_vsiwebhdfs_init(): gdaltest.webhdfs_vars = {} for var in ('WEBHDFS_USERNAME', 'WEBHDFS_DELEGATION'): gdaltest.webhdfs_vars[var] = gdal.GetConfigOption(var) if gdaltest.webhdfs_vars[var] is not None: gdal.SetConfigOption(var, "") ############################################################################### def test_vsiwebhdfs_start_webserver(): 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() gdaltest.webhdfs_base_connection = '/vsiwebhdfs/http://localhost:' + \ str(gdaltest.webserver_port) + '/webhdfs/v1' gdaltest.webhdfs_redirected_url = 'http://non_existing_host:' + \ str(gdaltest.webserver_port) + '/redirected' ############################################################################### # Test VSIFOpenL() def test_vsiwebhdfs_open(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Download without redirect (not nominal) handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/foo/bar?op=OPEN&offset=9999990784&length=16384', 200, {}, '0123456789data') with webserver.install_http_handler(handler): f = open_for_read(gdaltest.webhdfs_base_connection + '/foo/bar') assert f is not None gdal.VSIFSeekL(f, 9999990784 + 10, 0) assert gdal.VSIFReadL(1, 4, f).decode('ascii') == 'data' gdal.VSIFCloseL(f) # Download with redirect (nominal) and permissions gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/foo/bar?op=OPEN&offset=0&length=16384&user.name=root&delegation=token', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=OPEN&offset=0&length=16384'}) handler.add('GET', '/redirected/webhdfs/v1/foo/bar?op=OPEN&offset=0&length=16384', 200, {}, 'yeah') with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DELEGATION': 'token', 'WEBHDFS_DATANODE_HOST': 'localhost'}): with webserver.install_http_handler(handler): f = open_for_read(gdaltest.webhdfs_base_connection + '/foo/bar') assert f is not None assert gdal.VSIFReadL(1, 4, f).decode('ascii') == 'yeah' gdal.VSIFCloseL(f) # Test error gdal.VSICurlClearCache() f = open_for_read(gdaltest.webhdfs_base_connection + '/foo/bar') assert f is not None handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/foo/bar?op=OPEN&offset=0&length=16384', 404) with webserver.install_http_handler(handler): assert len(gdal.VSIFReadL(1, 4, f)) == 0 # Retry: shouldn't not cause network access assert len(gdal.VSIFReadL(1, 4, f)) == 0 gdal.VSIFCloseL(f) ############################################################################### # Test VSIStatL() def test_vsiwebhdfs_stat(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/foo/bar?op=GETFILESTATUS', 200, {}, '{"FileStatus":{"type":"FILE","length":1000000}}') with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL(gdaltest.webhdfs_base_connection + '/foo/bar') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() # Test caching stat_res = gdal.VSIStatL(gdaltest.webhdfs_base_connection + '/foo/bar') assert stat_res.size == 1000000 # Test missing file handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/unexisting?op=GETFILESTATUS', 404, {}, '{"RemoteException":{"exception":"FileNotFoundException","javaClassName":"java.io.FileNotFoundException","message":"File does not exist: /unexisting"}}') with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL( gdaltest.webhdfs_base_connection + '/unexisting') assert stat_res is None ############################################################################### # Test ReadDir() def test_vsiwebhdfs_readdir(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1/foo/?op=LISTSTATUS', 200, {}, '{"FileStatuses":{"FileStatus":[{"type":"FILE","modificationTime":1000,"pathSuffix":"bar.baz","length":123456},{"type":"DIRECTORY","pathSuffix":"mysubdir","length":0}]}}') with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir(gdaltest.webhdfs_base_connection + '/foo') assert dir_contents == ['bar.baz', 'mysubdir'] stat_res = gdal.VSIStatL(gdaltest.webhdfs_base_connection + '/foo/bar.baz') assert stat_res.size == 123456 assert stat_res.mtime == 1 # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir( gdaltest.webhdfs_base_connection + '/foo/bar.baz') assert dir_contents is None # Test error on ReadDir() handler = webserver.SequentialHandler() handler.add('GET', '/webhdfs/v1foo/error_test/?op=LISTSTATUS', 404) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir( gdaltest.webhdfs_base_connection + 'foo/error_test/') assert dir_contents is None ############################################################################### # Test write def test_vsiwebhdfs_write(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Zero length file handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): # Missing required config options with gdaltest.error_handler(): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is None handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root'}, ) handler.add( 'PUT', '/redirected/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 201) with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DATANODE_HOST': 'localhost'}): with webserver.install_http_handler(handler): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is not None assert gdal.VSIFCloseL(f) == 0 # Non-empty file gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root'}, ) handler.add( 'PUT', '/redirected/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 201) with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DATANODE_HOST': 'localhost'}): with webserver.install_http_handler(handler): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is not None assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 handler = webserver.SequentialHandler() def method(request): h = request.headers if 'Content-Length' in h and h['Content-Length'] != 0: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() request.protocol_version = 'HTTP/1.1' request.send_response(307) request.send_header('Location', gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=APPEND&user.name=root') request.end_headers() handler.add('POST', '/webhdfs/v1/foo/bar?op=APPEND&user.name=root', 307, custom_method=method) handler.add('POST', '/redirected/webhdfs/v1/foo/bar?op=APPEND&user.name=root', 200, expected_body='foobar'.encode('ascii')) with webserver.install_http_handler(handler): assert gdal.VSIFCloseL(f) == 0 # Errors during file creation gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add( 'PUT', '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 404) with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DATANODE_HOST': 'localhost'}): with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is None handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root'}, ) with gdaltest.config_options({'WEBHDFS_USERNAME': 'root'}): with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is None # Errors during POST gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root'}, ) handler.add( 'PUT', '/redirected/webhdfs/v1/foo/bar?op=CREATE&overwrite=true&user.name=root', 201) with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DATANODE_HOST': 'localhost'}): with webserver.install_http_handler(handler): f = gdal.VSIFOpenL( gdaltest.webhdfs_base_connection + '/foo/bar', 'wb') assert f is not None assert gdal.VSIFWriteL('foobar', 1, 6, f) == 6 handler = webserver.SequentialHandler() handler.add('POST', '/webhdfs/v1/foo/bar?op=APPEND&user.name=root', 307, {'Location': gdaltest.webhdfs_redirected_url + '/webhdfs/v1/foo/bar?op=APPEND&user.name=root'}) handler.add( 'POST', '/redirected/webhdfs/v1/foo/bar?op=APPEND&user.name=root', 400) with gdaltest.error_handler(): with webserver.install_http_handler(handler): assert gdal.VSIFCloseL(f) != 0 ############################################################################### # Test Unlink() def test_vsiwebhdfs_unlink(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Success handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/bar?op=DELETE', 200, {}, '{"boolean":true}') with webserver.install_http_handler(handler): ret = gdal.Unlink(gdaltest.webhdfs_base_connection + '/foo/bar') assert ret == 0 gdal.VSICurlClearCache() # With permissions gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/bar?op=DELETE&user.name=root&delegation=token', 200, {}, '{"boolean":true}') with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DELEGATION': 'token'}): with webserver.install_http_handler(handler): ret = gdal.Unlink(gdaltest.webhdfs_base_connection + '/foo/bar') assert ret == 0 # Failure handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/bar?op=DELETE', 200, {}, '{"boolean":false}') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink(gdaltest.webhdfs_base_connection + '/foo/bar') assert ret == -1 gdal.VSICurlClearCache() # Failure handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/bar?op=DELETE', 404, {}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink(gdaltest.webhdfs_base_connection + '/foo/bar') assert ret == -1 ############################################################################### # Test Mkdir() / Rmdir() def test_vsiwebhdfs_mkdir_rmdir(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Invalid name ret = gdal.Mkdir('/vsiwebhdfs', 0) assert ret != 0 # Valid handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/dir?op=MKDIRS', 200, {}, '{"boolean":true}') with webserver.install_http_handler(handler): ret = gdal.Mkdir(gdaltest.webhdfs_base_connection + '/foo/dir', 0) assert ret == 0 # Valid with all options handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/dir?op=MKDIRS&user.name=root&delegation=token&permission=755', 200, {}, '{"boolean":true}') with gdaltest.config_options({'WEBHDFS_USERNAME': 'root', 'WEBHDFS_DELEGATION': 'token'}): with webserver.install_http_handler(handler): ret = gdal.Mkdir(gdaltest.webhdfs_base_connection + '/foo/dir/', 493) # 0755 assert ret == 0 # Error handler = webserver.SequentialHandler() handler.add('PUT', '/webhdfs/v1/foo/dir_error?op=MKDIRS', 404) with webserver.install_http_handler(handler): ret = gdal.Mkdir(gdaltest.webhdfs_base_connection + '/foo/dir_error', 0) assert ret != 0 # Root name is invalid ret = gdal.Mkdir(gdaltest.webhdfs_base_connection + '/', 0) assert ret != 0 # Invalid name ret = gdal.Rmdir('/vsiwebhdfs') assert ret != 0 gdal.VSICurlClearCache() # Valid handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/dir?op=DELETE', 200, {}, '{"boolean":true}') with webserver.install_http_handler(handler): ret = gdal.Rmdir(gdaltest.webhdfs_base_connection + '/foo/dir') assert ret == 0 # Error handler = webserver.SequentialHandler() handler.add('DELETE', '/webhdfs/v1/foo/dir_error?op=DELETE', 404) with webserver.install_http_handler(handler): ret = gdal.Rmdir(gdaltest.webhdfs_base_connection + '/foo/dir_error') assert ret != 0 ############################################################################### def test_vsiwebhdfs_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_vsiwebhdfs_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() webhdfs_url = gdal.GetConfigOption('WEBHDFS_URL') if webhdfs_url is None: pytest.skip('Missing WEBHDFS_URL') if webhdfs_url.endswith('/webhdfs/v1') or webhdfs_url.endswith('/webhdfs/v1/'): path = '/vsiwebhdfs/' + webhdfs_url statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'vsiwebhdfs_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) #ret = gdal.Mkdir(subpath, 0) # if ret == 0: # gdaltest.post_reason('fail') # print('Mkdir(%s) repeated should return an error' % subpath) # return 'fail' ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsiwebhdfs/' + webhdfs_url) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 ############################################################################### def test_vsiwebhdfs_cleanup(): for var in gdaltest.webhdfs_vars: gdal.SetConfigOption(var, gdaltest.webhdfs_vars[var]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/histogram.py���������������������������������������������������������������0000755�0034015�0000144�00000014024�13614005316�017301� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: colortable.py 11065 2007-03-24 09:35:32Z mloskot $ # # Project: GDAL/OGR Test Suite # Purpose: Test GetHistogram() and GetDefaultHistogram() handling. # Author: Frank Warmerdam <warmerdam@pobox.com> # ############################################################################### # Copyright (c) 2008, Frank Warmerdam <warmerdam@pobox.com> # Copyright (c) 2009, Even Rouault <even dot rouault at mines-paris dot org> # # 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 ############################################################################### # Fetch simple histogram. def test_histogram_1(): ds = gdal.Open('data/utmsmall.tif') hist = ds.GetRasterBand(1).GetHistogram() exp_hist = [2, 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] assert hist == exp_hist, 'did not get expected histogram.' ############################################################################### # Fetch histogram with specified sampling, using keywords. def test_histogram_2(): ds = gdal.Open('data/utmsmall.tif') hist = ds.GetRasterBand(1).GetHistogram(buckets=16, max=255.5, min=-0.5) exp_hist = [10, 52, 115, 219, 371, 493, 825, 1077, 1279, 1302, 1127, 783, 625, 462, 331, 929] assert hist == exp_hist, 'did not get expected histogram.' ############################################################################### # try on a different data type with out of range values included. def test_histogram_3(): ds = gdal.Open('data/int32_withneg.grd') hist = ds.GetRasterBand(1).GetHistogram(buckets=21, max=100, min=-100, include_out_of_range=1, approx_ok=0) exp_hist = [0, 0, 0, 0, 0, 1, 0, 1, 1, 3, 3, 2, 0, 5, 3, 4, 0, 1, 1, 2, 3] assert hist == exp_hist, 'did not get expected histogram.' ############################################################################### # try on a different data type without out of range values included. def test_histogram_4(): ds = gdal.Open('data/int32_withneg.grd') hist = ds.GetRasterBand(1).GetHistogram(buckets=21, max=100, min=-100, include_out_of_range=0, approx_ok=0) exp_hist = [0, 0, 0, 0, 0, 1, 0, 1, 1, 3, 3, 2, 0, 5, 3, 4, 0, 1, 1, 2, 0] assert hist == exp_hist, 'did not get expected histogram.' ds = None gdal.Unlink('data/int32_withneg.grd.aux.xml') ############################################################################### # Test GetDefaultHistogram() on the file. def test_histogram_5(): ds = gdal.Open('data/utmsmall.tif') hist = ds.GetRasterBand(1).GetDefaultHistogram(force=1) exp_hist = (-0.5, 255.5, 256, [2, 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]) assert hist == exp_hist, 'did not get expected histogram.' ds = None gdal.Unlink('data/utmsmall.tif.aux.xml') ############################################################################### # Test GetDefaultHistogram( force = 0 ) on a JPG file (#3304) def test_histogram_6(): shutil.copy('../gdrivers/data/albania.jpg', 'tmp/albania.jpg') ds = gdal.Open('tmp/albania.jpg') hist = ds.GetRasterBand(1).GetDefaultHistogram(force=0) assert hist is None, 'did not get expected histogram.' ds = None os.unlink('tmp/albania.jpg') ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/pamproxydb.py��������������������������������������������������������������0000755�0034015�0000144�00000012241�13614005316�017470� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python ############################################################################### # $Id: pamproxydb.py c43366de744b9f18fa6469d9d283a1575a9c6fc6 2018-04-24 06:54:01 +1000 Ben Elliston $ # # Project: GDAL/OGR Test Suite # Purpose: Test functioning of the ProxyDB PAM metadata support # Author: Even Rouault, <even dot rouault at mines dash paris dot org> # ############################################################################### # Copyright (c) 2011, Even Rouault <even dot rouault at mines-paris dot org> # # 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 os try: os.putenv('CPL_SHOW_MEM_STATS', '') except OSError: pass # Must to be launched from pam.py/pam_11() # Test creating a new proxydb if len(sys.argv) == 2 and sys.argv[1] == '-test1': from osgeo import gdal import shutil try: shutil.rmtree('tmppamproxydir') except OSError: pass os.mkdir('tmppamproxydir') gdal.SetConfigOption('GDAL_PAM_PROXY_DIR', 'tmppamproxydir') # Compute statistics. They should be saved in the .aux.xml in the proxyDB ds = gdal.Open('tmpdirreadonly/byte.tif') stats = ds.GetRasterBand(1).ComputeStatistics(False) gdal.ErrorReset() ds = None error_msg = gdal.GetLastErrorMsg() if error_msg != '': print('did not expected error message') sys.exit(1) # Check that the .aux.xml in the proxyDB exists filelist = gdal.ReadDir('tmppamproxydir') if '000000_tmpdirreadonly_byte.tif.aux.xml' not in filelist: print('did not get find 000000_tmpdirreadonly_byte.tif.aux.xml on filesystem') sys.exit(1) # Test altering a value to check that the file will be used f = open('tmppamproxydir/000000_tmpdirreadonly_byte.tif.aux.xml', 'w') f.write("""<PAMDataset> <PAMRasterBand band="1"> <Metadata> <MDI key="STATISTICS_MAXIMUM">255</MDI> <MDI key="STATISTICS_MEAN">126.765</MDI> <MDI key="STATISTICS_MINIMUM">-9999</MDI> <MDI key="STATISTICS_STDDEV">22.928470838676</MDI> </Metadata> </PAMRasterBand> </PAMDataset>""") f.close() ds = gdal.Open('tmpdirreadonly/byte.tif') filelist = ds.GetFileList() if len(filelist) != 2: print('did not get find 000000_tmpdirreadonly_byte.tif.aux.xml in dataset GetFileList()') print(filelist) sys.exit(1) stats = ds.GetRasterBand(1).GetStatistics(False, False) if stats[0] != -9999: print('did not get expected minimum') sys.exit(1) ds = None # Check that proxy overviews work ds = gdal.Open('tmpdirreadonly/byte.tif') ds.BuildOverviews('NEAR', overviewlist=[2]) ds = None filelist = gdal.ReadDir('tmppamproxydir') if '000001_tmpdirreadonly_byte.tif.ovr' not in filelist: print('did not get find 000001_tmpdirreadonly_byte.tif.ovr') sys.exit(1) ds = gdal.Open('tmpdirreadonly/byte.tif') filelist = ds.GetFileList() if len(filelist) != 3: print('did not get find 000001_tmpdirreadonly_byte.tif.ovr in dataset GetFileList()') print(filelist) sys.exit(1) nb_ovr = ds.GetRasterBand(1).GetOverviewCount() ds = None if nb_ovr != 1: print('did not get expected overview count') sys.exit(1) print('success') sys.exit(0) # Must to be launched from pam.py/pam_11() # Test loading an existing proxydb if len(sys.argv) == 2 and sys.argv[1] == '-test2': from osgeo import gdal gdal.SetConfigOption('GDAL_PAM_PROXY_DIR', 'tmppamproxydir') ds = gdal.Open('tmpdirreadonly/byte.tif') filelist = ds.GetFileList() if len(filelist) != 3: print('did not get find 000000_tmpdirreadonly_byte.tif.aux.xml and/or 000001_tmpdirreadonly_byte.tif.ovr in dataset GetFileList()') print(filelist) sys.exit(1) stats = ds.GetRasterBand(1).GetStatistics(False, False) if stats[0] != -9999: print('did not get expected minimum') sys.exit(1) nb_ovr = ds.GetRasterBand(1).GetOverviewCount() ds = None if nb_ovr != 1: print('did not get expected overview count') sys.exit(1) print('success') sys.exit(0) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/hfa_read.py����������������������������������������������������������������0000755�0034015�0000144�00000004743�13614005316�017044� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: hfa_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for all datatypes from a HFA file. # Author: Frank Warmerdam <warmerdam@pobox.com> # ############################################################################### # Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> # # 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 init_list = [ ('byte.img', 4672), ('int16.img', 4672), ('uint16.img', 4672), ('int32.img', 4672), ('uint32.img', 4672), ('float32.img', 4672), ('float64.img', 4672), ('utmsmall.img', 50054), ('2bit_compressed.img', 11918)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('HFA') def test_hfa_open(filename, checksum): ut = gdaltest.GDALTest('HFA', filename, 1, checksum) ut.testOpen() ############################################################################### # Test bugfix for https://oss-fuzz.com/v2/testcase-detail/6053338875428864 def test_hfa_read_completedefn_recursion(): with gdaltest.error_handler(): gdal.Open('data/hfa_completedefn_recursion.img') �����������������������������gdalautotest-3.0.4/gcore/pixfun.py������������������������������������������������������������������0000755�0034015�0000144�00000056370�13614005316�016627� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: pixfun.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test pixel functions support. # Author: Antonio Valentino <antonio.valentino@tiscali.it> # ############################################################################### # Copyright (c) 2010-2014, Antonio Valentino <antonio.valentino@tiscali.it> # # 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 try: import numpy numpy_available = True except ImportError: numpy_available = False from osgeo import gdal ############################################################################### # Verify real part extraction from a complex dataset. def test_pixfun_real_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_real_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata.real) ############################################################################### # Verify real part extraction from a complex dataset. def test_pixfun_real_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_real_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata.real) ############################################################################### # Verify imaginary part extraction from a complex dataset. def test_pixfun_imag_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_imag_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata.imag) # Test bugfix of #6599 copied_ds = gdal.Translate('', filename, format='MEM') data_ds = copied_ds.GetRasterBand(1).ReadAsArray() copied_ds = None assert numpy.alltrue(data == data_ds) ############################################################################### # Verify imaginary part extraction from a real dataset. def test_pixfun_imag_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_imag_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == 0) ############################################################################### # Verify imaginary part extraction from a real dataset. def test_pixfun_complex(): if not numpy_available: pytest.skip() filename = 'data/pixfun_complex.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, refdata + 1j * refdata) ############################################################################### # Verify modulus extraction from a complex (float) dataset. def test_pixfun_mod_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_mod_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.abs(refdata)) ############################################################################### # Verify modulus extraction from a real (integer type) dataset. def test_pixfun_mod_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_mod_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.abs(refdata)) ############################################################################### # Verify phase extraction from a complex dataset. def test_pixfun_phase_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_phase_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() refdata = refdata.astype('complex128') assert numpy.allclose(data, numpy.arctan2(refdata.imag, refdata.real)) ############################################################################### # Verify phase extraction from a real dataset. def test_pixfun_phase_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_phase_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/pixfun_imag_c.vrt' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.arctan2(0, refdata)) ############################################################################### # Verify cmplex conjugare computation on a complex dataset. def test_pixfun_conj_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_conj_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.conj(refdata)) ############################################################################### # Verify cmplex conjugare computation on a real dataset. def test_pixfun_conj_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_conj_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.conj(refdata)) ############################################################################### # Verify the sum of 3 (real) datasets. def test_pixfun_sum_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_sum_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() if numpy_available: refdata = numpy.zeros(data.shape, 'float') for reffilename in ('data/uint16.tif', 'data/int32.tif', 'data/float32.tif'): refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata += refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) ############################################################################### # Verify the sum of 3 (two complex and one real) datasets. def test_pixfun_sum_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_sum_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() if numpy_available: refdata = numpy.zeros(data.shape, 'complex') for reffilename in ('data/uint16.tif', 'data/cint_sar.tif', 'data/cfloat64.tif'): refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata += refds.GetRasterBand(1).ReadAsArray(0, 0, 5, 6) assert numpy.alltrue(data == refdata) ############################################################################### # Verify the difference of 2 (real) datasets. def test_pixfun_diff_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_diff_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata1 = refds.GetRasterBand(1).ReadAsArray(0, 0, 5, 6) reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata2 = refds.GetRasterBand(1).ReadAsArray(10, 10, 5, 6) assert numpy.alltrue(data == refdata1 - refdata2) ############################################################################### # Verify the difference of 2 (complex) datasets. def test_pixfun_diff_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_diff_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata1 = refds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cfloat64.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata2 = refds.GetRasterBand(1).ReadAsArray(0, 0, 5, 6) assert numpy.alltrue(data == refdata1 - refdata2) ############################################################################### # Verify the product of 3 (real) datasets. def test_pixfun_mul_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_mul_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() if numpy_available: refdata = numpy.ones(data.shape, 'float') for reffilename in ('data/uint16.tif', 'data/int32.tif', 'data/float32.tif'): refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata *= refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata) ############################################################################### # Verify the product of 2 (complex) datasets. def test_pixfun_mul_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_mul_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata * refdata) ############################################################################### # Verify the product with complex conjugate of a complex datasets. def test_pixfun_cmul_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_cmul_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == refdata * refdata.conj()) ############################################################################### # Verify the product with complex conjugate of two real datasets. def test_pixfun_cmul_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_cmul_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/uint16.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata1 = refds.GetRasterBand(1).ReadAsArray() refdata1 = refdata1.astype('float64') reffilename = 'data/int32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata2 = refds.GetRasterBand(1).ReadAsArray() refdata2 = refdata2.astype('float64') assert numpy.alltrue(data == refdata1 * refdata2.conj()) ############################################################################### # Verify computation of the inverse of a real datasets. def test_pixfun_inv_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_inv_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/uint16.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() refdata = refdata.astype('float64') assert numpy.alltrue(data == 1. / refdata) ############################################################################### # Verify computation of the inverse of a complex datasets. def test_pixfun_inv_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_inv_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() refdata = refdata.astype('complex') delta = data - 1. / refdata assert numpy.alltrue(abs(delta.real) < 1e-13) assert numpy.alltrue(abs(delta.imag) < 1e-13) ############################################################################### # Verify intensity computation of a complex dataset. def test_pixfun_intensity_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_intensity_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == (refdata * refdata.conj()).real) ############################################################################### # Verify intensity computation of real dataset. def test_pixfun_intensity_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_intensity_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == (refdata * refdata.conj()).real) ############################################################################### # Verify square root computation. def test_pixfun_sqrt(): if not numpy_available: pytest.skip() filename = 'data/pixfun_sqrt.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.sqrt(refdata)) ############################################################################### # Verify logarithm computation of real dataset. def test_pixfun_log10_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_log10_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.alltrue(data == numpy.log10(refdata)) ############################################################################### # Verify logarithm computation of imag dataset. def test_pixfun_log10_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_log10_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, numpy.log10(numpy.abs(refdata))) ############################################################################### # Verify dB computation of real dataset. def test_pixfun_dB_r(): if not numpy_available: pytest.skip() filename = 'data/pixfun_dB_r.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, 20. * numpy.log10(refdata)) ############################################################################### # Verify dB computation of imag dataset. def test_pixfun_dB_c(): if not numpy_available: pytest.skip() filename = 'data/pixfun_dB_c.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/cint_sar.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() assert numpy.allclose(data, 20. * numpy.log10(numpy.abs(refdata))) ############################################################################### # Verify conversion from dB to amplitude. def test_pixfun_dB2amp(): if not numpy_available: pytest.skip() filename = 'data/pixfun_dB2amp.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() # if not numpy.alltrue(data == 10.**(refdata/20.)): assert numpy.allclose(data, 10.**(refdata / 20.)) ############################################################################### # Verify conversion from dB to power. def test_pixfun_dB2pow(): if not numpy_available: pytest.skip() filename = 'data/pixfun_dB2pow.vrt' ds = gdal.OpenShared(filename, gdal.GA_ReadOnly) assert ds is not None, ('Unable to open "%s" dataset.' % filename) data = ds.GetRasterBand(1).ReadAsArray() reffilename = 'data/float32.tif' refds = gdal.Open(reffilename) assert refds is not None, ('Unable to open "%s" dataset.' % reffilename) refdata = refds.GetRasterBand(1).ReadAsArray() refdata = refdata.astype('float64') assert numpy.allclose(data, 10.**(refdata / 10.)) ############################################################################### ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/hdf4_write.py��������������������������������������������������������������0000755�0034015�0000144�00000004263�13614005316�017347� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: hdf4_write.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for HDF4 driver. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev <dron@remotesensing.org> # # 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. ############################################################################### import pytest import gdaltest init_list = [ ('byte.tif', 4672), ('int16.tif', 4672), ('uint16.tif', 4672), ('int32.tif', 4672), ('uint32.tif', 4672), ('float32.tif', 4672), ('float64.tif', 4672), ('utmsmall.tif', 50054) ] @pytest.mark.parametrize( 'rank', [2, 3], ids=lambda x: 'rank%d' % x ) @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[arg[0].split('.')[0] for arg in init_list] ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', 'testSetGeoTransform', 'testSetProjection', 'testSetMetadata', 'testSetNoDataValue', 'testSetDescription', ] ) @pytest.mark.require_driver('HDF4Image') def test_hdf4_write(filename, checksum, testfunction, rank): ut = gdaltest.GDALTest('HDF4Image', filename, 1, checksum, options=['RANK=%d' % rank]) getattr(ut, testfunction)() ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/vrt_read.py����������������������������������������������������������������0000755�0034015�0000144�00000131066�13614005316�017120� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vrt_read.py 4470ea897eda9272e9b5dd3edb00c2855b0b88e7 2019-03-15 11:33:06 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from a VRT file. # Author: Frank Warmerdam <warmerdam@pobox.com> # ############################################################################### # Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> # Copyright (c) 2008-2012, Even Rouault <even dot rouault at mines-paris dot org> # # 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 import pytest import gdaltest from osgeo import gdal import test_cli_utilities ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.vrt', 4672), ('int16.vrt', 4672), ('uint16.vrt', 4672), ('int32.vrt', 4672), ('uint32.vrt', 4672), ('float32.vrt', 4672), ('float64.vrt', 4672), ('cint16.vrt', 5028), ('cint32.vrt', 5028), ('cfloat32.vrt', 5028), ('cfloat64.vrt', 5028), ('msubwinbyte.vrt', 2699), ('utmsmall.vrt', 50054), ('byte_nearest_50pct.vrt', 1192), ('byte_averaged_50pct.vrt', 1152), ('byte_nearest_200pct.vrt', 18784), ('byte_averaged_200pct.vrt', 18784) ] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('VRT') def test_vrt_open(filename, checksum): ut = gdaltest.GDALTest('VRT', filename, 1, checksum) ut.testOpen() ############################################################################### # The VRT references a non existing TIF file def test_vrt_read_1(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/idontexist.vrt') gdal.PopErrorHandler() if ds is None: return pytest.fail() ############################################################################### # The VRT references a non existing TIF file, but using the proxy pool dataset API (#2837) def test_vrt_read_2(): ds = gdal.Open('data/idontexist2.vrt') assert ds is not None gdal.PushErrorHandler('CPLQuietErrorHandler') cs = ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() assert cs == 0 ds.GetMetadata() ds.GetRasterBand(1).GetMetadata() ds.GetGCPs() ds = None ############################################################################### # Test init of band data in case of cascaded VRT (ticket #2867) def test_vrt_read_3(): driver_tif = gdal.GetDriverByName("GTIFF") output_dst = driver_tif.Create('tmp/test_mosaic1.tif', 100, 100, 3, gdal.GDT_Byte) output_dst.GetRasterBand(1).Fill(255) output_dst = None output_dst = driver_tif.Create('tmp/test_mosaic2.tif', 100, 100, 3, gdal.GDT_Byte) output_dst.GetRasterBand(1).Fill(127) output_dst = None ds = gdal.Open('data/test_mosaic.vrt') # A simple Checksum() cannot detect if the fix works or not as # Checksum() reads line per line, and we must use IRasterIO() on multi-line request data = ds.GetRasterBand(1).ReadRaster(90, 0, 20, 100) got = struct.unpack('B' * 20 * 100, data) for i in range(100): assert got[i * 20 + 9] == 255, ('at line %d, did not find 255' % i) ds = None driver_tif.Delete('tmp/test_mosaic1.tif') driver_tif.Delete('tmp/test_mosaic2.tif') ############################################################################### # Test complex source with complex data (#3977) def test_vrt_read_4(): try: import numpy as np except ImportError: pytest.skip() data = np.zeros((1, 1), np.complex64) data[0, 0] = 1. + 3.j drv = gdal.GetDriverByName('GTiff') ds = drv.Create("/vsimem/test.tif", 1, 1, 1, gdal.GDT_CFloat32) ds.GetRasterBand(1).WriteArray(data) ds = None complex_xml = '''<VRTDataset rasterXSize="1" rasterYSize="1"> <VRTRasterBand dataType="CFloat32" band="1"> <ComplexSource> <SourceFilename relativeToVRT="1">/vsimem/test.tif</SourceFilename> <SourceBand>1</SourceBand> <ScaleOffset>3</ScaleOffset> <ScaleRatio>2</ScaleRatio> </ComplexSource> </VRTRasterBand> </VRTDataset> ''' ds = gdal.Open(complex_xml) scaleddata = ds.GetRasterBand(1).ReadAsArray() ds = None gdal.Unlink("/vsimem/test.tif") if scaleddata[0, 0].real != 5.0 or scaleddata[0, 0].imag != 9.0: print('scaleddata[0, 0]: %f %f' % (scaleddata[0, 0].real, scaleddata[0, 0].imag)) pytest.fail('did not get expected value') ############################################################################### # Test serializing and deserializing of various band metadata def test_vrt_read_5(): src_ds = gdal.Open('data/testserialization.asc') ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrt_read_5.vrt', src_ds) src_ds = None ds = None ds = gdal.Open('/vsimem/vrt_read_5.vrt') gcps = ds.GetGCPs() assert len(gcps) == 2 and ds.GetGCPCount() == 2 assert ds.GetGCPProjection().find("WGS 84") != -1 ds.SetGCPs(ds.GetGCPs(), ds.GetGCPProjection()) gcps = ds.GetGCPs() assert len(gcps) == 2 and ds.GetGCPCount() == 2 assert ds.GetGCPProjection().find("WGS 84") != -1 band = ds.GetRasterBand(1) assert band.GetDescription() == 'MyDescription' assert band.GetUnitType() == 'MyUnit' assert band.GetOffset() == 1 assert band.GetScale() == 2 assert band.GetRasterColorInterpretation() == gdal.GCI_PaletteIndex assert band.GetCategoryNames() == ['Cat1', 'Cat2'] ct = band.GetColorTable() assert ct.GetColorEntry(0) == (0, 0, 0, 255) assert ct.GetColorEntry(1) == (1, 1, 1, 255) assert band.GetMaximum() == 0 assert band.GetMinimum() == 2 assert band.GetMetadata() == {'STATISTICS_MEAN': '1', 'STATISTICS_MINIMUM': '2', 'STATISTICS_MAXIMUM': '0', 'STATISTICS_STDDEV': '3'} ds = None gdal.Unlink('/vsimem/vrt_read_5.vrt') ############################################################################### # Test GetMinimum() and GetMaximum() def test_vrt_read_6(): gdal.Unlink('data/byte.tif.aux.xml') src_ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrt_read_6.tif', src_ds) vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrt_read_6.vrt', mem_ds) assert vrt_ds.GetRasterBand(1).GetMinimum() is None, 'got bad minimum value' assert vrt_ds.GetRasterBand(1).GetMaximum() is None, 'got bad maximum value' # Now compute source statistics mem_ds.GetRasterBand(1).ComputeStatistics(False) assert vrt_ds.GetRasterBand(1).GetMinimum() == 74, 'got bad minimum value' assert vrt_ds.GetRasterBand(1).GetMaximum() == 255, 'got bad maximum value' mem_ds = None vrt_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_6.tif') gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_6.vrt') ############################################################################### # Test GDALOpen() anti-recursion mechanism def test_vrt_read_7(): filename = "/vsimem/vrt_read_7.vrt" content = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">%s</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" % filename gdal.FileFromMemBuffer(filename, content) gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open(filename) gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() gdal.Unlink(filename) assert ds is None assert error_msg != '' ############################################################################### # Test ComputeRasterMinMax() def test_vrt_read_8(): src_ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrt_read_8.tif', src_ds) vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrt_read_8.vrt', mem_ds) vrt_minmax = vrt_ds.GetRasterBand(1).ComputeRasterMinMax() mem_minmax = mem_ds.GetRasterBand(1).ComputeRasterMinMax() mem_ds = None vrt_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_8.tif') gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_8.vrt') assert vrt_minmax == mem_minmax ############################################################################### # Test ComputeStatistics() def test_vrt_read_9(): src_ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrt_read_9.tif', src_ds) vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrt_read_9.vrt', mem_ds) vrt_stats = vrt_ds.GetRasterBand(1).ComputeStatistics(False) mem_stats = mem_ds.GetRasterBand(1).ComputeStatistics(False) mem_ds = None vrt_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_9.tif') gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_9.vrt') assert vrt_stats == mem_stats ############################################################################### # Test GetHistogram() & GetDefaultHistogram() def test_vrt_read_10(): src_ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrt_read_10.tif', src_ds) vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrt_read_10.vrt', mem_ds) vrt_hist = vrt_ds.GetRasterBand(1).GetHistogram() mem_hist = mem_ds.GetRasterBand(1).GetHistogram() mem_ds = None vrt_ds = None f = gdal.VSIFOpenL('/vsimem/vrt_read_10.vrt', 'rb') content = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert vrt_hist == mem_hist assert '<Histograms>' in content # Single source optimization for i in range(2): gdal.FileFromMemBuffer('/vsimem/vrt_read_10.vrt', """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">vrt_read_10.tif</SourceFilename> </SimpleSource> </VRTRasterBand> </VRTDataset>""") ds = gdal.Open('/vsimem/vrt_read_10.vrt') if i == 0: ds.GetRasterBand(1).GetDefaultHistogram() else: ds.GetRasterBand(1).GetHistogram() ds = None f = gdal.VSIFOpenL('/vsimem/vrt_read_10.vrt', 'rb') content = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '<Histograms>' in content # Two sources general case for i in range(2): gdal.FileFromMemBuffer('/vsimem/vrt_read_10.vrt', """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">vrt_read_10.tif</SourceFilename> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">vrt_read_10.tif</SourceFilename> </SimpleSource> </VRTRasterBand> </VRTDataset>""") ds = gdal.Open('/vsimem/vrt_read_10.vrt') if i == 0: ds.GetRasterBand(1).GetDefaultHistogram() else: ds.GetRasterBand(1).GetHistogram() ds = None f = gdal.VSIFOpenL('/vsimem/vrt_read_10.vrt', 'rb') content = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '<Histograms>' in content gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_10.tif') gdal.GetDriverByName('VRT').Delete('/vsimem/vrt_read_10.vrt') ############################################################################### # Test resolving files from a symlinked vrt using relativeToVRT with an absolute symlink def test_vrt_read_11(): if not gdaltest.support_symlink(): pytest.skip() try: os.remove('tmp/byte.vrt') print('Removed tmp/byte.vrt. Was not supposed to exist...') except OSError: pass os.symlink(os.path.join(os.getcwd(), 'data/byte.vrt'), 'tmp/byte.vrt') ds = gdal.Open('tmp/byte.vrt') os.remove('tmp/byte.vrt') assert ds is not None ############################################################################### # Test resolving files from a symlinked vrt using relativeToVRT # with a relative symlink pointing to a relative symlink def test_vrt_read_12(): if not gdaltest.support_symlink(): pytest.skip() try: os.remove('tmp/byte.vrt') print('Removed tmp/byte.vrt. Was not supposed to exist...') except OSError: pass os.symlink('../data/byte.vrt', 'tmp/byte.vrt') ds = gdal.Open('tmp/byte.vrt') os.remove('tmp/byte.vrt') assert ds is not None ############################################################################### # Test resolving files from a symlinked vrt using relativeToVRT with a relative symlink def test_vrt_read_13(): if not gdaltest.support_symlink(): pytest.skip() try: os.remove('tmp/byte.vrt') print('Removed tmp/byte.vrt. Was not supposed to exist...') except OSError: pass try: os.remove('tmp/other_byte.vrt') print('Removed tmp/other_byte.vrt. Was not supposed to exist...') except OSError: pass os.symlink('../data/byte.vrt', 'tmp/byte.vrt') os.symlink('../tmp/byte.vrt', 'tmp/other_byte.vrt') ds = gdal.Open('tmp/other_byte.vrt') os.remove('tmp/other_byte.vrt') os.remove('tmp/byte.vrt') assert ds is not None ############################################################################### # Test ComputeStatistics() when the VRT is a subwindow of the source dataset (#5468) def test_vrt_read_14(): src_ds = gdal.Open('data/byte.tif') mem_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrt_read_14.tif', src_ds) mem_ds.FlushCache() # hum this should not be necessary ideally vrt_ds = gdal.Open("""<VRTDataset rasterXSize="4" rasterYSize="4"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">/vsimem/vrt_read_14.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="2" yOff="2" xSize="4" ySize="4" /> <DstRect xOff="0" yOff="0" xSize="4" ySize="4" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") vrt_stats = vrt_ds.GetRasterBand(1).ComputeStatistics(False) mem_ds = None vrt_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/vrt_read_14.tif') assert vrt_stats[0] == 115.0 and vrt_stats[1] == 173.0 ############################################################################### # Test RasterIO() with resampling on SimpleSource def test_vrt_read_15(): vrt_ds = gdal.Open("""<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 1044 ############################################################################### # Test RasterIO() with resampling on ComplexSource def test_vrt_read_16(): vrt_ds = gdal.Open("""<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <ComplexSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </ComplexSource> <ComplexSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </ComplexSource> </VRTRasterBand> </VRTDataset>""") cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 1044 ############################################################################### # Test RasterIO() with resampling on AveragedSource def test_vrt_read_17(): vrt_ds = gdal.Open("""<VRTDataset rasterXSize="9" rasterYSize="9"> <VRTRasterBand dataType="Byte" band="1"> <AveragedSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="9" ySize="9" /> </AveragedSource> </VRTRasterBand> </VRTDataset>""") # Note: AveragedSource with resampling does not give consistent results # depending on the RasterIO() request cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 847 ############################################################################### # Test that relative path is correctly VRT-in-VRT def test_vrt_read_18(): vrt_ds = gdal.Open('data/vrtinvrt.vrt') cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### # Test shared="0" def test_vrt_read_19(): vrt_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <AveragedSource> <SourceFilename relativeToVRT="0" shared="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> </AveragedSource> </VRTRasterBand> </VRTDataset>""") vrt2_ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <AveragedSource> <SourceFilename relativeToVRT="0" shared="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> </AveragedSource> </VRTRasterBand> </VRTDataset>""") cs = vrt_ds.GetRasterBand(1).Checksum() assert cs == 4672 cs = vrt2_ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### # Test 2 level of VRT with shared="0" def test_vrt_read_20(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() shutil.copy('data/byte.tif', 'tmp') for i in range(3): open('tmp/byte1_%d.vrt' % (i + 1), 'wt').write("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") open('tmp/byte2.vrt', 'wt').write("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">byte1_1.vrt</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">byte1_2.vrt</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">byte1_3.vrt</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -checksum tmp/byte2.vrt --config VRT_SHARED_SOURCE 0 --config GDAL_MAX_DATASET_POOL_SIZE 3') assert 'Checksum=4672' in ret for f in ['tmp/byte.tif', 'tmp/byte1_1.vrt', 'tmp/byte1_2.vrt', 'tmp/byte1_3.vrt', 'tmp/byte2.vrt']: os.unlink(f) ############################################################################### # Test implicit virtual overviews def test_vrt_read_21(): ds = gdal.Open('data/byte.tif') data = ds.ReadRaster(0, 0, 20, 20, 400, 400) ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/byte.tif', 400, 400) ds.WriteRaster(0, 0, 400, 400, data) ds.BuildOverviews('NEAR', [2]) ds = None gdal.FileFromMemBuffer('/vsimem/vrt_read_21.vrt', """<VRTDataset rasterXSize="800" rasterYSize="800"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="400" RasterYSize="400" DataType="Byte" BlockXSize="400" BlockYSize="1" /> <SrcRect xOff="100" yOff="100" xSize="200" ySize="250" /> <DstRect xOff="300" yOff="400" xSize="200" ySize="250" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") ds = gdal.Open('/vsimem/vrt_read_21.vrt') assert ds.GetRasterBand(1).GetOverviewCount() == 1 data_ds_one_band = ds.ReadRaster(0, 0, 800, 800, 400, 400) ds = None gdal.FileFromMemBuffer('/vsimem/vrt_read_21.vrt', """<VRTDataset rasterXSize="800" rasterYSize="800"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="400" RasterYSize="400" DataType="Byte" BlockXSize="400" BlockYSize="1" /> <SrcRect xOff="100" yOff="100" xSize="200" ySize="250" /> <DstRect xOff="300" yOff="400" xSize="200" ySize="250" /> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> <ComplexSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="400" RasterYSize="400" DataType="Byte" BlockXSize="400" BlockYSize="1" /> <SrcRect xOff="100" yOff="100" xSize="200" ySize="250" /> <DstRect xOff="300" yOff="400" xSize="200" ySize="250" /> <ScaleOffset>10</ScaleOffset> </ComplexSource> </VRTRasterBand> </VRTDataset>""") ds = gdal.Open('/vsimem/vrt_read_21.vrt') assert ds.GetRasterBand(1).GetOverviewCount() == 1 ds = gdal.Open('/vsimem/vrt_read_21.vrt') ovr_band = ds.GetRasterBand(1).GetOverview(-1) assert ovr_band is None ovr_band = ds.GetRasterBand(1).GetOverview(1) assert ovr_band is None ovr_band = ds.GetRasterBand(1).GetOverview(0) assert ovr_band is not None cs = ovr_band.Checksum() cs2 = ds.GetRasterBand(2).GetOverview(0).Checksum() data = ds.ReadRaster(0, 0, 800, 800, 400, 400) assert data == data_ds_one_band + ds.GetRasterBand(2).ReadRaster(0, 0, 800, 800, 400, 400) mem_ds = gdal.GetDriverByName('MEM').Create('', 400, 400, 2) mem_ds.WriteRaster(0, 0, 400, 400, data) ref_cs = mem_ds.GetRasterBand(1).Checksum() ref_cs2 = mem_ds.GetRasterBand(2).Checksum() mem_ds = None assert cs == ref_cs assert cs2 == ref_cs2 ds.BuildOverviews('NEAR', [2]) expected_cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs2 = ds.GetRasterBand(2).GetOverview(0).Checksum() ds = None assert cs == expected_cs assert cs2 == expected_cs2 gdal.Unlink('/vsimem/vrt_read_21.vrt') gdal.Unlink('/vsimem/vrt_read_21.vrt.ovr') gdal.Unlink('/vsimem/byte.tif') ############################################################################### # Test that we honour NBITS with SimpleSource and ComplexSource def test_vrt_read_22(): ds = gdal.Open('data/byte.tif') data = ds.ReadRaster() ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/byte.tif', 20, 20) ds.WriteRaster(0, 0, 20, 20, data) ds.GetRasterBand(1).ComputeStatistics(False) ds = None ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> </Metadata> <SimpleSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> </VRTDataset>""") assert ds.GetRasterBand(1).GetMinimum() == 63 assert ds.GetRasterBand(1).GetMaximum() == 63 assert ds.GetRasterBand(1).ComputeRasterMinMax() == (63, 63) assert ds.GetRasterBand(1).ComputeStatistics(False) == [63.0, 63.0, 63.0, 0.0] data = ds.ReadRaster() got = struct.unpack('B' * 20 * 20, data) assert got[0] == 63 ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> </Metadata> <ComplexSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> </ComplexSource> </VRTRasterBand> </VRTDataset>""") assert ds.GetRasterBand(1).GetMinimum() == 63 assert ds.GetRasterBand(1).GetMaximum() == 63 assert ds.GetRasterBand(1).ComputeRasterMinMax() == (63, 63) assert ds.GetRasterBand(1).ComputeStatistics(False) == [63.0, 63.0, 63.0, 0.0] ds = gdal.Open("""<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <Metadata domain="IMAGE_STRUCTURE"> <MDI key="NBITS">6</MDI> </Metadata> <ComplexSource> <SourceFilename>/vsimem/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <ScaleOffset>10</ScaleOffset> </ComplexSource> </VRTRasterBand> </VRTDataset>""") assert ds.GetRasterBand(1).GetMinimum() is None assert ds.GetRasterBand(1).GetMaximum() is None assert ds.GetRasterBand(1).ComputeRasterMinMax() == (63, 63) assert ds.GetRasterBand(1).ComputeStatistics(False) == [63.0, 63.0, 63.0, 0.0] gdal.Unlink('/vsimem/byte.tif') gdal.Unlink('/vsimem/byte.tif.aux.xml') ############################################################################### # Test non-nearest resampling on a VRT exposing a nodata value but with # an underlying dataset without nodata def test_vrt_read_23(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrt_read_23.tif', 2, 1) mem_ds.GetRasterBand(1).WriteArray(numpy.array([[0, 10]])) mem_ds = None ds = gdal.Open("""<VRTDataset rasterXSize="2" rasterYSize="1"> <VRTRasterBand dataType="Byte" band="1"> <NoDataValue>0</NoDataValue> <SimpleSource> <SourceFilename>/vsimem/vrt_read_23.tif</SourceFilename> </SimpleSource> </VRTRasterBand> </VRTDataset>""") got_ar = ds.GetRasterBand(1).ReadAsArray(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) assert list(got_ar[0]) == [0, 10, 10, 10] assert ds.ReadRaster(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) == ds.GetRasterBand(1).ReadRaster(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) ds = None gdal.Unlink('/vsimem/vrt_read_23.tif') # Same but with nodata set on source band too mem_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrt_read_23.tif', 2, 1) mem_ds.GetRasterBand(1).SetNoDataValue(0) mem_ds.GetRasterBand(1).WriteArray(numpy.array([[0, 10]])) mem_ds = None ds = gdal.Open("""<VRTDataset rasterXSize="2" rasterYSize="1"> <VRTRasterBand dataType="Byte" band="1"> <NoDataValue>0</NoDataValue> <SimpleSource> <SourceFilename>/vsimem/vrt_read_23.tif</SourceFilename> </SimpleSource> </VRTRasterBand> </VRTDataset>""") got_ar = ds.GetRasterBand(1).ReadAsArray(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) assert list(got_ar[0]) == [0, 10, 10, 10] assert ds.ReadRaster(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) == ds.GetRasterBand(1).ReadRaster(0, 0, 2, 1, 4, 1, resample_alg=gdal.GRIORA_Bilinear) ds = None gdal.Unlink('/vsimem/vrt_read_23.tif') ############################################################################### # Test floating point rounding issues when the VRT does a zoom-in def test_vrt_read_24(): ds = gdal.Open('data/zoom_in.vrt') data = ds.ReadRaster(34, 5, 66, 87) ds = None ds = gdal.GetDriverByName('MEM').Create('', 66, 87) ds.WriteRaster(0, 0, 66, 87, data) cs = ds.GetRasterBand(1).Checksum() ds = None # Please do not change the expected checksum without checking that # the result image has no vertical black line in the middle assert cs == 46612 ds = None ############################################################################### # Test GetDataCoverageStatus() def test_vrt_read_25(): import ogrtest if not ogrtest.have_geos(): pytest.skip() ds = gdal.Open("""<VRTDataset rasterXSize="2000" rasterYSize="200"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="1000" yOff="30" xSize="10" ySize="20" /> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="1010" yOff="30" xSize="10" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(0, 0, 20, 20) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA and pct == 100.0 (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(1005, 35, 10, 10) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA and pct == 100.0 (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(100, 100, 20, 20) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_EMPTY and pct == 0.0 (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(10, 10, 20, 20) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA | gdal.GDAL_DATA_COVERAGE_STATUS_EMPTY and pct == 25.0 ############################################################################### # Test consistency of RasterIO() with resampling, that is extracting different # sub-windows give consistent results def test_vrt_read_26(): vrt_ds = gdal.Open("""<VRTDataset rasterXSize="22" rasterYSize="22"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="22" ySize="22" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""") full_data = vrt_ds.GetRasterBand(1).ReadRaster(0, 0, 22, 22) full_data = struct.unpack('B' * 22 * 22, full_data) partial_data = vrt_ds.GetRasterBand(1).ReadRaster(1, 1, 1, 1) partial_data = struct.unpack('B' * 1 * 1, partial_data) assert partial_data[0] == full_data[22 + 1] ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1553 def test_vrt_read_27(): gdal.Open('data/empty_gcplist.vrt') ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1551 def test_vrt_read_28(): with gdaltest.error_handler(): ds = gdal.Open('<VRTDataset rasterXSize="1 "rasterYSize="1"><VRTRasterBand band="-2147483648"><SimpleSource></SimpleSource></VRTRasterBand></VRTDataset>') assert ds is None ############################################################################### # Check VRT source sharing and non-sharing situations (#6949) def test_vrt_read_29(): f = open('data/byte.tif') lst_before = sorted(gdaltest.get_opened_files()) if not lst_before: pytest.skip() f.close() gdal.Translate('tmp/vrt_read_29.tif', 'data/byte.tif') vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>tmp/vrt_read_29.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> <SimpleSource> <SourceFilename>tmp/vrt_read_29.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" lst_before = sorted(gdaltest.get_opened_files()) ds = gdal.Open(vrt_text) # Just after opening, we shouldn't have read the source lst = sorted(gdaltest.get_opened_files()) assert lst == lst_before # Check that the 2 bands share the same source handle ds.GetRasterBand(1).Checksum() lst = sorted(gdaltest.get_opened_files()) assert len(lst) == len(lst_before) + 1 ds.GetRasterBand(2).Checksum() lst = sorted(gdaltest.get_opened_files()) assert len(lst) == len(lst_before) + 1 # Open a second VRT dataset handle ds2 = gdal.Open(vrt_text) # Check that it consumes an extra handle ds2.GetRasterBand(1).Checksum() lst = sorted(gdaltest.get_opened_files()) assert len(lst) == len(lst_before) + 2 gdal.Unlink('tmp/vrt_read_29.tif') ############################################################################### # Check VRT reading with DatasetRasterIO def test_vrt_read_30(): ds = gdal.Open("""<VRTDataset rasterXSize="2" rasterYSize="2"> <VRTRasterBand dataType="Byte" band="1"> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="3"> </VRTRasterBand> </VRTDataset>""") data = ds.ReadRaster(0, 0, 2, 2, 2, 2, buf_pixel_space=3, buf_line_space=2 * 3, buf_band_space=1) got = struct.unpack('B' * 2 * 2 * 3, data) for i in range(2 * 2 * 3): assert got[i] == 0 ds = None ############################################################################### # Check that we take into account intermediate data type demotion def test_vrt_read_31(): gdal.FileFromMemBuffer('/vsimem/in.asc', """ncols 2 nrows 2 xllcorner 0 yllcorner 0 dx 1 dy 1 -255 1 254 256""") ds = gdal.Translate('', '/vsimem/in.asc', outputType=gdal.GDT_Byte, format='VRT') data = ds.GetRasterBand(1).ReadRaster(0, 0, 2, 2, buf_type=gdal.GDT_Float32) got = struct.unpack('f' * 2 * 2, data) assert got == (0, 1, 254, 255) data = ds.ReadRaster(0, 0, 2, 2, buf_type=gdal.GDT_Float32) got = struct.unpack('f' * 2 * 2, data) assert got == (0, 1, 254, 255) ds = None gdal.Unlink('/vsimem/in.asc') ############################################################################### # Test reading a VRT where the NODATA & NoDataValue are slightly below the # minimum float value (https://github.com/OSGeo/gdal/issues/1071) def test_vrt_float32_with_nodata_slightly_below_float_min(): shutil.copyfile('data/minfloat.tif', 'tmp/minfloat.tif') shutil.copyfile('data/minfloat_nodata_slightly_out_of_float.vrt', 'tmp/minfloat_nodata_slightly_out_of_float.vrt') gdal.Unlink('tmp/minfloat_nodata_slightly_out_of_float.vrt.aux.xml') ds = gdal.Open('tmp/minfloat_nodata_slightly_out_of_float.vrt') nodata = ds.GetRasterBand(1).GetNoDataValue() stats = ds.GetRasterBand(1).ComputeStatistics(False) ds = None vrt_content = open('tmp/minfloat_nodata_slightly_out_of_float.vrt', 'rt').read() gdal.Unlink('tmp/minfloat.tif') gdal.Unlink('tmp/minfloat_nodata_slightly_out_of_float.vrt') # Check that the values were 'normalized' when regenerating the VRT assert '-3.402823466385289' not in vrt_content, \ 'did not get expected nodata in rewritten VRT' if nodata != -3.4028234663852886e+38: print("%.18g" % nodata) pytest.fail('did not get expected nodata') assert stats == [-3.0, 5.0, 1.0, 4.0], 'did not get expected stats' ############################################################################### # Fix issue raised in https://lists.osgeo.org/pipermail/gdal-dev/2018-December/049415.html def test_vrt_subpixel_offset(): ds = gdal.Open('data/vrt_subpixel_offset.vrt') cs = ds.GetRasterBand(1).Checksum() assert cs == 4849 ############################################################################### # Check bug fix of bug fix of # https://lists.osgeo.org/pipermail/gdal-dev/2018-December/049415.html def test_vrt_dstsize_larger_than_source(): ds = gdal.Open('data/dstsize_larger_than_source.vrt') cs = ds.GetRasterBand(1).Checksum() assert cs == 33273 def test_vrt_invalid_srcrect(): vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relative="1">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="-10" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" assert gdal.Open(vrt_text) is None def test_vrt_invalid_dstrect(): vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relative="1">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="1e400" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" assert gdal.Open(vrt_text) is None def test_vrt_no_explicit_dataAxisToSRSAxisMapping(): vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <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"]]</SRS> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relative="1">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2,1] def test_vrt_explicit_dataAxisToSRSAxisMapping_1_2(): vrt_text = """<VRTDataset rasterXSize="20" rasterYSize="20"> <SRS dataAxisToSRSAxisMapping="1,2">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"]]</SRS> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relative="1">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SourceProperties RasterXSize="20" RasterYSize="20" DataType="Byte" BlockXSize="20" BlockYSize="20" /> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20" /> <DstRect xOff="0" yOff="0" xSize="20" ySize="20" /> </SimpleSource> </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1,2] def test_vrt_shared_no_proxy_pool(): before = gdaltest.get_opened_files() vrt_text = """<VRTDataset rasterXSize="50" rasterYSize="50"> <VRTRasterBand dataType="Byte" band="1"> <ColorInterp>Red</ColorInterp> <SimpleSource> <SourceFilename>data/rgbsmall.tif</SourceFilename> <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> <ColorInterp>Green</ColorInterp> <SimpleSource> <SourceFilename>data/rgbsmall.tif</SourceFilename> <SourceBand>2</SourceBand> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="3"> <ColorInterp>Blue</ColorInterp> <SimpleSource> <SourceFilename>data/rgbsmall.tif</SourceFilename> <SourceBand>3</SourceBand> </SimpleSource> </VRTRasterBand> </VRTDataset>""" ds = gdal.Open(vrt_text) assert ds assert ds.GetRasterBand(1).Checksum() == 21212 assert ds.GetRasterBand(2).Checksum() == 21053 assert ds.GetRasterBand(3).Checksum() == 21349 ds = None after = gdaltest.get_opened_files() assert len(before) == len(after) def test_vrt_shared_no_proxy_pool_error(): vrt_text = """<VRTDataset rasterXSize="50" rasterYSize="50"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename>data/byte.tif</SourceFilename> <SourceBand>10</SourceBand> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> <SimpleSource> <SourceFilename>data/byte.tif</SourceFilename> <SourceBand>11</SourceBand> </SimpleSource> </VRTRasterBand> </VRTDataset>""" with gdaltest.error_handler(): ds = gdal.Open(vrt_text) assert not ds ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/misc.py��������������������������������������������������������������������0000755�0034015�0000144�00000066764�13614005316�016261� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: misc.py c32689fcc70cf5222837f139b5893ebc62f9f0e4 2019-06-05 19:41:02 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Various test of GDAL core. # Author: Even Rouault <even dot rouault at mines dash parid dot org> # ############################################################################### # Copyright (c) 2009-2013, Even Rouault <even dot rouault at mines-paris dot org> # # 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 that the constructor of GDALDataset() behaves well with a big number of # opened/created datasets def test_misc_1(): tab_ds = [None] * 5000 drv = gdal.GetDriverByName('MEM') for i, _ in enumerate(tab_ds): name = 'mem_%d' % i tab_ds[i] = drv.Create(name, 1, 1, 1) assert tab_ds[i] is not None ############################################################################### # Test that OpenShared() works as expected by opening a big number of times # the same dataset with it. If it did not work, that would exhaust the system # limit of maximum file descriptors opened at the same time def test_misc_2(): tab_ds = [None for i in range(5000)] for i, _ in enumerate(tab_ds): tab_ds[i] = gdal.OpenShared('data/byte.tif') assert tab_ds[i] is not None ############################################################################### # Test OpenShared() with a dataset whose filename != description (#2797) def test_misc_3(): with gdaltest.error_handler(): ds = gdal.OpenShared('../gdrivers/data/small16.aux') ds.GetRasterBand(1).Checksum() cache_size = gdal.GetCacheUsed() with gdaltest.error_handler(): ds2 = gdal.OpenShared('../gdrivers/data/small16.aux') ds2.GetRasterBand(1).Checksum() cache_size2 = gdal.GetCacheUsed() if cache_size != cache_size2: print("--> OpenShared didn't work as expected") ds = None ds2 = None ############################################################################### # Test Create() with invalid arguments def test_misc_4(): gdal.PushErrorHandler('CPLQuietErrorHandler') # Test a few invalid argument drv = gdal.GetDriverByName('GTiff') drv.Create('tmp/foo', 0, 100, 1) drv.Create('tmp/foo', 100, 1, 1) drv.Create('tmp/foo', 100, 100, -1) drv.Delete('tmp/foo') gdal.PopErrorHandler() ############################################################################### def get_filename(drv, dirname): filename = '%s/foo' % dirname if drv.ShortName == 'GTX': filename += '.gtx' elif drv.ShortName == 'RST': filename += '.rst' elif drv.ShortName == 'SAGA': filename += '.sdat' elif drv.ShortName == 'ADRG': filename = '%s/ABCDEF01.GEN' % dirname elif drv.ShortName == 'SRTMHGT': filename = '%s/N48E002.HGT' % dirname elif drv.ShortName == 'ECW': filename += '.ecw' elif drv.ShortName == 'KMLSUPEROVERLAY': filename += '.kmz' elif drv.ShortName == 'RRASTER': filename += '.grd' return filename ############################################################################### # Test Create() with various band numbers (including 0) and datatype def misc_5_internal(drv, datatype, nBands): dirname = 'tmp/tmp/tmp_%s_%d_%s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) # print('drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype))) try: os.mkdir(dirname) except OSError: try: os.stat(dirname) # Hum the directory already exists... Not expected, but let's try to go on except OSError: reason = 'Cannot create %s for drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) gdaltest.post_reason(reason) return 0 filename = get_filename(drv, dirname) ds = drv.Create(filename, 100, 100, nBands, datatype) if ds is not None and not (drv.ShortName == 'GPKG' and nBands == 0): set_gt = (2, 1.0 / 10, 0, 49, 0, -1.0 / 10) ds.SetGeoTransform(set_gt) ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]') # PNM and MFF have no SetGeoTransform() method implemented if drv.ShortName not in ['PNM', 'MFF', 'NULL']: got_gt = ds.GetGeoTransform() for i in range(6): if abs(got_gt[i] - set_gt[i]) > 1e-10: print('Did not get expected GT for drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype))) print(got_gt) return -1 # if ds.RasterCount > 0: # ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.Open(filename) if ds is None: # reason = 'Cannot reopen %s for drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) # gdaltest.post_reason(reason) # TODO: Why not return -1? pass # else: # if ds.RasterCount > 0: # print ds.GetRasterBand(1).Checksum() ds = None try: shutil.rmtree(dirname) except OSError: reason = 'Cannot remove %s for drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) gdaltest.post_reason(reason) return 0 return 1 def test_misc_5(): gdal.PushErrorHandler('CPLQuietErrorHandler') try: shutil.rmtree('tmp/tmp') except OSError: pass try: os.mkdir('tmp/tmp') except OSError: try: os.stat('tmp/tmp') # Hum the directory already exists... Not expected, but let's try to go on except OSError: pytest.fail('Cannot create tmp/tmp') # 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') ret = 'success' # Test Create() with various band numbers, including 0 for i in range(gdal.GetDriverCount()): drv = gdal.GetDriver(i) md = drv.GetMetadata() if drv.ShortName == 'PDF': # PDF Create() is vector-only continue if drv.ShortName == 'MBTiles': # MBTiles only support some precise resolutions continue if 'DCAP_CREATE' in md and 'DCAP_RASTER' in md: datatype = gdal.GDT_Byte for nBands in range(6): if misc_5_internal(drv, datatype, nBands) < 0: ret = 'fail' for nBands in [1, 3]: for datatype in (gdal.GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CInt16, gdal.GDT_CInt32, gdal.GDT_CFloat32, gdal.GDT_CFloat64): if misc_5_internal(drv, datatype, nBands) < 0: ret = 'fail' gdal.PopErrorHandler() return ret ############################################################################### class misc_6_interrupt_callback_class(object): def __init__(self): pass def cbk(self, pct, message, user_data): # pylint: disable=unused-argument return pct <= 0.5 ############################################################################### # Test CreateCopy() with a source dataset with various band numbers (including 0) and datatype def misc_6_internal(datatype, nBands, setDriversDone): ds = gdal.GetDriverByName('MEM').Create('', 10, 10, nBands, datatype) if nBands > 0: ds.GetRasterBand(1).Fill(255) ds.SetGeoTransform([2, 1.0 / 10, 0, 49, 0, -1.0 / 10]) ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]') ds.SetMetadata(['a']) for i in range(gdal.GetDriverCount()): drv = gdal.GetDriver(i) md = drv.GetMetadata() if ('DCAP_CREATECOPY' in md or 'DCAP_CREATE' in md) and 'DCAP_RASTER' in md: # print ('drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype))) skip = False # FIXME: A few cases that crashes and should be investigated if drv.ShortName == 'JPEG2000': if (nBands == 2 or nBands >= 5) or \ not (datatype == gdal.GDT_Byte or datatype == gdal.GDT_Int16 or datatype == gdal.GDT_UInt16): skip = True if skip is False: dirname = 'tmp/tmp/tmp_%s_%d_%s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) try: os.mkdir(dirname) except OSError: try: os.stat(dirname) # Hum the directory already exists... Not expected, but let's try to go on except OSError: reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) pytest.fail(reason) filename = get_filename(drv, dirname) dst_ds = drv.CreateCopy(filename, ds) has_succeeded = dst_ds is not None dst_ds = None size = 0 stat = gdal.VSIStatL(filename) if stat is not None: size = stat.size try: shutil.rmtree(dirname) except OSError: reason = 'Cannot remove %s after drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) pytest.fail(reason) if has_succeeded and drv.ShortName not in setDriversDone and nBands > 0: setDriversDone.add(drv.ShortName) # The first list of drivers fail to detect short writing # The second one is because they are verbose in stderr if 'DCAP_VIRTUALIO' in md and size != 0 and \ drv.ShortName not in ['JPEG2000', 'KMLSUPEROVERLAY', 'HF2', 'ZMap', 'DDS'] and \ drv.ShortName not in ['GIF', 'JP2ECW', 'JP2Lura']: for j in range(10): truncated_size = (size * j) / 10 vsimem_filename = ('/vsimem/test_truncate/||maxlength=%d||' % truncated_size) + get_filename(drv, '')[1:] # print('drv = %s, nBands = %d, datatype = %s, truncated_size = %d' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype), truncated_size)) dst_ds = drv.CreateCopy(vsimem_filename, ds) error_detected = False if dst_ds is None: error_detected = True else: gdal.ErrorReset() dst_ds = None if gdal.GetLastErrorMsg() != '': error_detected = True if not error_detected: msg = 'write error not decteded with with drv = %s, nBands = %d, datatype = %s, truncated_size = %d' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype), truncated_size) print(msg) gdaltest.post_reason(msg) fl = gdal.ReadDirRecursive('/vsimem/test_truncate') if fl is not None: for myf in fl: gdal.Unlink('/vsimem/test_truncate/' + myf) fl = gdal.ReadDirRecursive('/vsimem/test_truncate') if fl is not None: print(fl) if drv.ShortName not in ['ECW', 'JP2ECW', 'VRT', 'XPM', 'JPEG2000', 'FIT', 'RST', 'INGR', 'USGSDEM', 'KMLSUPEROVERLAY', 'GMT']: dst_ds = drv.CreateCopy(filename, ds, callback=misc_6_interrupt_callback_class().cbk) if dst_ds is not None: dst_ds = None try: shutil.rmtree(dirname) except OSError: pass pytest.fail('interruption did not work with drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype))) dst_ds = None try: shutil.rmtree(dirname) except OSError: pass try: os.mkdir(dirname) except OSError: reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (dirname, drv.ShortName, nBands, gdal.GetDataTypeName(datatype)) pytest.fail(reason) ds = None def test_misc_6(): gdal.PushErrorHandler('CPLQuietErrorHandler') try: shutil.rmtree('tmp/tmp') except OSError: pass try: os.mkdir('tmp/tmp') except OSError: try: os.stat('tmp/tmp') # Hum the directory already exists... Not expected, but let's try to go on except OSError: pytest.fail('Cannot create tmp/tmp') # 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') datatype = gdal.GDT_Byte setDriversDone = set() for nBands in range(6): ret = misc_6_internal(datatype, nBands, setDriversDone) if ret != 'success': gdal.PopErrorHandler() return ret nBands = 1 for datatype in (gdal.GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CInt16, gdal.GDT_CInt32, gdal.GDT_CFloat32, gdal.GDT_CFloat64): ret = misc_6_internal(datatype, nBands, setDriversDone) if ret != 'success': gdal.PopErrorHandler() return ret gdal.PopErrorHandler() ############################################################################### # Test gdal.InvGeoTransform() def test_misc_7(): gt = (10, 0.1, 0, 20, 0, -1.0) res = gdal.InvGeoTransform(gt) expected_inv_gt = (-100.0, 10.0, 0.0, 20.0, 0.0, -1.0) for i in range(6): assert abs(res[i] - expected_inv_gt[i]) <= 1e-6, res gt = (10, 1, 1, 20, 2, 2) res = gdal.InvGeoTransform(gt) assert not res gt = (10, 1e10, 1e10, 20, 2e10, 2e10) res = gdal.InvGeoTransform(gt) assert not res gt = (10, 1e-10, 1e-10, 20, 2e-10, 2e-10) res = gdal.InvGeoTransform(gt) assert not res # Test fix for #1615 gt = (-2, 1e-8, 1e-9, 52, 1e-9, -1e-8) res = gdal.InvGeoTransform(gt) expected_inv_gt = (-316831683.16831684, 99009900.990099, 9900990.099009901, 5168316831.683168, 9900990.099009901, -99009900.990099) for i in range(6): assert abs(res[i] - expected_inv_gt[i]) <= 1e-6, res res2 = gdal.InvGeoTransform(res) for i in range(6): assert abs(res2[i] - gt[i]) <= 1e-6, res2 ############################################################################### # Test gdal.ApplyGeoTransform() def test_misc_8(): try: gdal.ApplyGeoTransform except AttributeError: pytest.skip() gt = (10, 0.1, 0, 20, 0, -1.0) res = gdal.ApplyGeoTransform(gt, 10, 1) assert res == [11.0, 19.0] ############################################################################### # Test setting and retrieving > 2 GB values for GDAL max cache (#3689) def test_misc_9(): old_val = gdal.GetCacheMax() gdal.SetCacheMax(3000000000) ret_val = gdal.GetCacheMax() gdal.SetCacheMax(old_val) assert ret_val == 3000000000, 'did not get expected value' ############################################################################### # Test VSIBufferedReaderHandle (fix done in r21358) def test_misc_10(): try: os.remove('data/byte.tif.gz.properties') except OSError: pass f = gdal.VSIFOpenL('/vsigzip/./data/byte.tif.gz', 'rb') gdal.VSIFReadL(1, 1, f) gdal.VSIFSeekL(f, 0, 2) gdal.VSIFSeekL(f, 0, 0) data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) import struct ar = struct.unpack('B' * 4, data) assert ar == (73, 73, 42, 0) try: os.remove('data/byte.tif.gz.properties') except OSError: pass ############################################################################### # Test that we can open a symlink whose pointed filename isn't a real # file, but a filename that GDAL recognizes def test_misc_11(): if not gdaltest.support_symlink(): pytest.skip() gdal.Unlink('tmp/symlink.tif') os.symlink('GTIFF_DIR:1:data/byte.tif', 'tmp/symlink.tif') ds = gdal.Open('tmp/symlink.tif') if ds is None: os.remove('tmp/symlink.tif') pytest.fail() desc = ds.GetDescription() ds = None os.remove('tmp/symlink.tif') assert desc == 'GTIFF_DIR:1:data/byte.tif', 'did not get expected description' ############################################################################### # Test CreateCopy() with a target filename in a non-existing dir def test_misc_12(): if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') import test_cli_utilities gdal_translate_path = test_cli_utilities.get_gdal_translate_path() for i in range(gdal.GetDriverCount()): drv = gdal.GetDriver(i) md = drv.GetMetadata() if ('DCAP_CREATECOPY' in md or 'DCAP_CREATE' in md) and 'DCAP_RASTER' in md: nbands = 1 if drv.ShortName == 'WEBP' or drv.ShortName == 'ADRG': nbands = 3 datatype = gdal.GDT_Byte if drv.ShortName == 'BT' or drv.ShortName == 'BLX': datatype = gdal.GDT_Int16 elif drv.ShortName == 'GTX' or drv.ShortName == 'NTv2' or drv.ShortName == 'Leveller': datatype = gdal.GDT_Float32 size = 1201 if drv.ShortName == 'BLX': size = 128 src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/misc_12_src.tif', size, size, nbands, datatype) set_gt = (2, 1.0 / size, 0, 49, 0, -1.0 / size) src_ds.SetGeoTransform(set_gt) src_ds.SetProjection('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]') # Test to detect crashes gdal.PushErrorHandler('CPLQuietErrorHandler') ds = drv.CreateCopy('/nonexistingpath' + get_filename(drv, ''), src_ds) gdal.PopErrorHandler() if ds is None and gdal.GetLastErrorMsg() == '': gdal.Unlink('/vsimem/misc_12_src.tif') pytest.fail('CreateCopy() into non existing dir fails without error message for driver %s' % drv.ShortName) ds = None if gdal_translate_path is not None: # Test to detect memleaks ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/misc_12.vrt', src_ds) (out, _) = gdaltest.runexternal_out_and_err(gdal_translate_path + ' -of ' + drv.ShortName + ' tmp/misc_12.vrt /nonexistingpath/' + get_filename(drv, ''), check_memleak=False) del ds gdal.Unlink('tmp/misc_12.vrt') # If DEBUG_VSIMALLOC_STATS is defined, this is an easy way # to catch some memory leaks if out.find('VSIMalloc + VSICalloc - VSIFree') != -1 and \ out.find('VSIMalloc + VSICalloc - VSIFree : 0') == -1: if drv.ShortName == 'Rasterlite' and out.find('VSIMalloc + VSICalloc - VSIFree : 1') != -1: pass else: print('memleak detected for driver %s' % drv.ShortName) src_ds = None gdal.Unlink('/vsimem/misc_12_src.tif') ############################################################################### # Test CreateCopy() with incompatible driver types (#5912) def test_misc_13(): # Raster-only -> vector-only ds = gdal.Open('data/byte.tif') gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('ESRI Shapefile').CreateCopy('/vsimem/out.shp', ds) gdal.PopErrorHandler() assert out_ds is None # Raster-only -> vector-only ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) gdal.PushErrorHandler() out_ds = gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', ds) gdal.PopErrorHandler() assert out_ds is None ############################################################################### # Test ConfigureLogging() def test_misc_14(): import collections import logging class MockLoggingHandler(logging.Handler): def __init__(self, *args, **kwargs): super(MockLoggingHandler, self).__init__(*args, **kwargs) self.messages = collections.defaultdict(list) def emit(self, record): self.messages[record.levelname].append(record.getMessage()) logger = logging.getLogger('gdal_logging_test') logger.setLevel(logging.DEBUG) logger.propagate = False handler = MockLoggingHandler(level=logging.DEBUG) logger.addHandler(handler) prev_debug = gdal.GetConfigOption("CPL_DEBUG") try: gdal.ConfigurePythonLogging(logger_name='gdal_logging_test', enable_debug=True) assert gdal.GetConfigOption("CPL_DEBUG") == "ON", "should have enabled debug" gdal.Debug("test1", "debug1") gdal.Error(gdal.CE_Debug, gdal.CPLE_FileIO, "debug2") gdal.Error(gdal.CE_None, gdal.CPLE_AppDefined, "info1") gdal.Error(gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1") gdal.Error(gdal.CE_Failure, 99999, "error1") expected = { 'DEBUG': ["test1: debug1", "FileIO: debug2"], 'INFO': ["AppDefined: info1"], 'WARNING': ["AssertionFailed: warning1"], 'ERROR': ["99999: error1"], } assert handler.messages == expected, "missing log messages" gdal.SetErrorHandler('CPLDefaultErrorHandler') handler.messages.clear() gdal.SetConfigOption('CPL_DEBUG', "OFF") gdal.ConfigurePythonLogging(logger_name='gdal_logging_test') assert gdal.GetConfigOption("CPL_DEBUG") == "OFF", \ "shouldn't have enabled debug" # these get suppressed by CPL_DEBUG gdal.Debug("test1", "debug3") # these don't gdal.Error(gdal.CE_Debug, gdal.CPLE_None, "debug4") assert handler.messages['DEBUG'] == ['debug4'], "unexpected log messages" finally: gdal.SetErrorHandler('CPLDefaultErrorHandler') gdal.SetConfigOption('CPL_DEBUG', prev_debug) logger.removeHandler(handler) ############################################################################### # Test SetErrorHandler def test_misc_15(): messages0 = [] def handle0(ecls, ecode, emsg): messages0.append((ecls, ecode, emsg)) messages1 = [] def handle1(ecls, ecode, emsg): messages1.append((ecls, ecode, emsg)) prev_debug = gdal.GetConfigOption("CPL_DEBUG") try: gdal.SetErrorHandler(handle0) gdal.SetConfigOption('CPL_DEBUG', "ON") gdal.Debug('foo', 'bar') gdal.Error(gdal.CE_Debug, gdal.CPLE_FileIO, "debug2") gdal.Error(gdal.CE_None, gdal.CPLE_AppDefined, "info1") gdal.Error(gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1") gdal.Error(gdal.CE_Failure, 99999, "error1") expected0 = [ (gdal.CE_Debug, 0, 'foo: bar'), (gdal.CE_Debug, gdal.CPLE_FileIO, "debug2"), (gdal.CE_None, gdal.CPLE_AppDefined, "info1"), (gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1"), (gdal.CE_Failure, 99999, "error1"), ] assert expected0 == messages0, "SetErrorHandler: mismatched log messages" messages0[:] = [] # Check Push gdal.PushErrorHandler(handle1) gdal.SetConfigOption("CPL_DEBUG", "OFF") gdal.Error(gdal.CE_Debug, gdal.CPLE_FileIO, "debug2") gdal.Error(gdal.CE_None, gdal.CPLE_AppDefined, "info1") gdal.Error(gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1") gdal.Error(gdal.CE_Failure, 99999, "error1") assert len(messages0) == 0, "PushErrorHandler: unexpected log messages" assert len(messages1) == 4, "PushErrorHandler: missing log messages" # and pop restores original behaviour gdal.PopErrorHandler() messages1[:] = [] gdal.Error(gdal.CE_Debug, gdal.CPLE_FileIO, "debug2") gdal.Error(gdal.CE_None, gdal.CPLE_AppDefined, "info1") gdal.Error(gdal.CE_Warning, gdal.CPLE_AssertionFailed, "warning1") gdal.Error(gdal.CE_Failure, 99999, "error1") assert len(messages0) == 4, "PopErrorHandler: missing log messages" assert len(messages1) == 0, "PopErrorHandler: unexpected log messages" finally: gdal.SetErrorHandler('CPLDefaultErrorHandler') gdal.SetConfigOption('CPL_DEBUG', prev_debug) ############################################################################### def test_misc_cleanup(): try: shutil.rmtree('tmp/tmp') except OSError: pass ������������gdalautotest-3.0.4/gcore/vsiaz.py�������������������������������������������������������������������0000755�0034015�0000144�00000110445�13614005316�016444� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: vsiaz.py 4e7ce5fcadef46f94d6a548a04d389224fc9a99c 2019-02-11 11:30:42 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsiaz # Author: Even Rouault <even dot rouault at spatialys dot com> # ############################################################################### # Copyright (c) 2017 Even Rouault <even dot rouault at spatialys dot com> # # 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 stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_vsiaz_init(): gdaltest.az_vars = {} for var in ('AZURE_STORAGE_CONNECTION_STRING', 'AZURE_STORAGE_ACCOUNT', 'AZURE_STORAGE_ACCESS_KEY'): gdaltest.az_vars[var] = gdal.GetConfigOption(var) if gdaltest.az_vars[var] is not None: gdal.SetConfigOption(var, "") assert gdal.GetSignedURL('/vsiaz/foo/bar') is None ############################################################################### # Error cases def test_vsiaz_real_server_errors(): if not gdaltest.built_against_curl(): pytest.skip() # Missing AZURE_STORAGE_ACCOUNT gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AZURE_STORAGE_ACCOUNT') >= 0 gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz_streaming/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AZURE_STORAGE_ACCOUNT') >= 0 # Invalid AZURE_STORAGE_CONNECTION_STRING gdal.SetConfigOption('AZURE_STORAGE_CONNECTION_STRING', 'invalid') gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz/foo/bar') assert f is None gdal.SetConfigOption('AZURE_STORAGE_CONNECTION_STRING', '') gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', 'AZURE_STORAGE_ACCOUNT') # Missing AZURE_STORAGE_ACCESS_KEY gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('AZURE_STORAGE_ACCESS_KEY') >= 0 gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', 'AZURE_STORAGE_ACCESS_KEY') gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz/foo/bar.baz') if f is not None: if f is not None: gdal.VSIFCloseL(f) if gdal.GetConfigOption('APPVEYOR') is not None: return pytest.fail(gdal.VSIGetLastErrorMsg()) gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiaz_streaming/foo/bar.baz') assert f is None, gdal.VSIGetLastErrorMsg() ############################################################################### def test_vsiaz_start_webserver(): 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('AZURE_STORAGE_CONNECTION_STRING', 'DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=MY_ACCOUNT_KEY;EndpointSuffix=127.0.0.1:%d' % gdaltest.webserver_port) gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', '') gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', '') gdal.SetConfigOption('CPL_AZURE_TIMESTAMP', 'my_timestamp') ############################################################################### # Test with a fake Azure Blob server def test_vsiaz_fake_basic(): if gdaltest.webserver_port == 0: pytest.skip() signed_url = gdal.GetSignedURL('/vsiaz/az_fake_bucket/resource', ['START_DATE=20180213T123456']) assert (signed_url in ('http://127.0.0.1:8080/azure/blob/myaccount/az_fake_bucket/resource?se=2018-02-13T13%3A34%3A56Z&sig=9Jc4yBFlSRZSSxf059OohN6pYRrjuHWJWSEuryczN%2FM%3D&sp=r&sr=c&st=2018-02-13T12%3A34%3A56Z&sv=2012-02-12', 'http://127.0.0.1:8081/azure/blob/myaccount/az_fake_bucket/resource?se=2018-02-13T13%3A34%3A56Z&sig=9Jc4yBFlSRZSSxf059OohN6pYRrjuHWJWSEuryczN%2FM%3D&sp=r&sr=c&st=2018-02-13T12%3A34%3A56Z&sv=2012-02-12')) def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'Authorization' not in h or \ h['Authorization'] != 'SharedKey myaccount:zKb0EXnM/RinBjcUE9EU+qfRIGaIItoUElSWc+FE24E=' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsiaz/az_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'Authorization' not in h or \ h['Authorization'] != 'SharedKey myaccount:8d6IEeOsl7qGpKAxaTTxx2xMNpvqWq8DGlFE67lsmQ4=' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp' or \ 'Accept-Encoding' not in h or h['Accept-Encoding'] != 'gzip': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/az_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsiaz_streaming/az_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/resource2.bin', 200, {'Content-Length': '1000000'}) with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsiaz/az_fake_bucket/resource2.bin') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_fake_bucket/resource2.bin', 200, {'Content-Length': 1000000}) with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsiaz_streaming/az_fake_bucket/resource2.bin') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() ############################################################################### # Test ReadDir() with a fake Azure Blob server def test_vsiaz_fake_readdir(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&prefix=a_dir%2F&restype=container', 200, {'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>a_dir/</Prefix> <NextMarker>bla</NextMarker> <Blobs> <Blob> <Name>a_dir/resource3.bin</Name> <Properties> <Last-Modified>01 Jan 1970 00:00:01</Last-Modified> <Content-Length>123456</Content-Length> </Properties> </Blob> </Blobs> </EnumerationResults> """) handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&marker=bla&prefix=a_dir%2F&restype=container', 200, {'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>a_dir/</Prefix> <Blobs> <Blob> <Name>a_dir/resource4.bin</Name> <Properties> <Last-Modified>16 Oct 2016 12:34:56</Last-Modified> <Content-Length>456789</Content-Length> </Properties> </Blob> <BlobPrefix> <Name>a_dir/subdir/</Name> </BlobPrefix> </Blobs> </EnumerationResults> """) with webserver.install_http_handler(handler): f = open_for_read('/vsiaz/az_fake_bucket2/a_dir/resource3.bin') if f is None: if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail() gdal.VSIFCloseL(f) dir_contents = gdal.ReadDir('/vsiaz/az_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] assert gdal.VSIStatL('/vsiaz/az_fake_bucket2/a_dir/resource3.bin').size == 123456 assert gdal.VSIStatL('/vsiaz/az_fake_bucket2/a_dir/resource3.bin').mtime == 1 # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir('/vsiaz/az_fake_bucket2/a_dir/resource3.bin') assert dir_contents is None # Test error on ReadDir() handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/az_fake_bucket2?comp=list&delimiter=%2F&prefix=error_test%2F&restype=container', 500) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiaz/az_fake_bucket2/error_test/') assert dir_contents is None # List containers (empty result) handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, {'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults ServiceEndpoint="https://myaccount.blob.core.windows.net"> <Containers/> </EnumerationResults> """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiaz/') assert dir_contents == ['.'] gdal.VSICurlClearCache() # List containers handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/?comp=list', 200, {'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Containers> <Container> <Name>mycontainer1</Name> </Container> </Containers> <NextMarker>bla</NextMarker> </EnumerationResults> """) handler.add('GET', '/azure/blob/myaccount/?comp=list&marker=bla', 200, {'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Containers> <Container> <Name>mycontainer2</Name> </Container> </Containers> </EnumerationResults> """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiaz/') assert dir_contents == ['mycontainer1', 'mycontainer2'] ############################################################################### # Test write def test_vsiaz_fake_write(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Test creation of BlockBob f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): h = request.headers if 'Authorization' not in h or \ h['Authorization'] != 'SharedKey myaccount:AigkrY7q66WCrx3JRKBte56k7kxV2cxB/ZyGNubxk5I=' or \ 'Expect' not in h or h['Expect'] != '100-continue' or \ 'Content-Length' not in h or h['Content-Length'] != '40000' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp' or \ 'x-ms-blob-type' not in h or h['x-ms-blob-type'] != 'BlockBlob': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(40000).decode('ascii') if len(content) != 40000: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(201) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL('x' * 35000, 1, 35000, f) ret += gdal.VSIFWriteL('x' * 5000, 1, 5000, f) if ret != 40000: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) # Simulate illegal read f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFReadL(1, 1, f) assert not ret gdal.VSIFCloseL(f) # Simulate illegal seek f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFSeekL(f, 1, 0) assert ret != 0 gdal.VSIFCloseL(f) # Simulate failure when putting BlockBob f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', custom_method=method) if gdal.VSIFSeekL(f, 0, 0) != 0: gdal.VSIFCloseL(f) pytest.fail() gdal.VSIFWriteL('x' * 35000, 1, 35000, f) if gdal.VSIFTellL(f) != 35000: gdal.VSIFCloseL(f) pytest.fail() if gdal.VSIFSeekL(f, 35000, 0) != 0: gdal.VSIFCloseL(f) pytest.fail() if gdal.VSIFSeekL(f, 0, 1) != 0: gdal.VSIFCloseL(f) pytest.fail() if gdal.VSIFSeekL(f, 0, 2) != 0: gdal.VSIFCloseL(f) pytest.fail() if gdal.VSIFEofL(f) != 0: gdal.VSIFCloseL(f) pytest.fail() with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.VSIFCloseL(f) if ret == 0: gdal.VSIFCloseL(f) pytest.fail(ret) # Simulate creation of BlockBob over an existing blob of incompatible type f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 409) handler.add('DELETE', '/azure/blob/myaccount/test_copy/file.bin', 202) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 201) with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) # Test creation of AppendBlob gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', '10') f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) assert f is not None handler = webserver.SequentialHandler() def method(request): h = request.headers if 'Authorization' not in h or \ h['Authorization'] != 'SharedKey myaccount:KimVui3ptY9D5ftLlsI7CNOgK36CNAEzsXqcuHskdEY=' or \ 'Content-Length' not in h or h['Content-Length'] != '0' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp' or \ 'x-ms-blob-type' not in h or h['x-ms-blob-type'] != 'AppendBlob': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' request.send_response(201) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', custom_method=method) def method(request): h = request.headers if 'Content-Length' not in h or h['Content-Length'] != '10' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp' or \ 'x-ms-blob-type' not in h or h['x-ms-blob-type'] != 'AppendBlob': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' content = request.rfile.read(10).decode('ascii') if content != '0123456789': sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(201) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', custom_method=method) def method(request): h = request.headers if 'Content-Length' not in h or h['Content-Length'] != '6' or \ 'x-ms-date' not in h or h['x-ms-date'] != 'my_timestamp' or \ 'x-ms-blob-type' not in h or h['x-ms-blob-type'] != 'AppendBlob': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' content = request.rfile.read(6).decode('ascii') if content != 'abcdef': sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(201) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) if ret != 16: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) # Test failed creation of AppendBlob gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', '10') f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) if ret != 0: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) # Test failed writing of a block of an AppendBlob gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', '10') f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') gdal.SetConfigOption('VSIAZ_CHUNK_SIZE_BYTES', None) assert f is not None handler = webserver.SequentialHandler() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 201) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', 403) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) if ret != 0: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) ############################################################################### # Test write with retry def test_vsiaz_write_blockblob_retry(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Test creation of BlockBob f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', 'GDAL_HTTP_RETRY_DELAY': '0.01'}): handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(3).decode('ascii') if len(content) != 3: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(201) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 502) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 gdal.VSIFCloseL(f) ############################################################################### # Test write with retry def test_vsiaz_write_appendblob_retry(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', 'GDAL_HTTP_RETRY_DELAY': '0.01', 'VSIAZ_CHUNK_SIZE_BYTES': '10'}): f = gdal.VSIFOpenL('/vsiaz/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 502) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin', 201) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', 502) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', 201) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', 502) handler.add('PUT', '/azure/blob/myaccount/test_copy/file.bin?comp=appendblock', 201) with webserver.install_http_handler(handler): assert gdal.VSIFWriteL('0123456789abcdef', 1, 16, f) == 16 gdal.VSIFCloseL(f) ############################################################################### # Test Unlink() def test_vsiaz_fake_unlink(): if gdaltest.webserver_port == 0: pytest.skip() # Success handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_unlink/myfile', 200, {'Content-Length': '1'}) handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_unlink/myfile', 202, {'Connection': 'close'}) with webserver.install_http_handler(handler): ret = gdal.Unlink('/vsiaz/az_bucket_test_unlink/myfile') assert ret == 0 # Failure handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_unlink/myfile', 200, {'Content-Length': '1'}) handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_unlink/myfile', 400, {'Connection': 'close'}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink('/vsiaz/az_bucket_test_unlink/myfile') assert ret == -1 ############################################################################### # Test Mkdir() / Rmdir() def test_vsiaz_fake_mkdir_rmdir(): if gdaltest.webserver_port == 0: pytest.skip() # Invalid name ret = gdal.Mkdir('/vsiaz', 0) assert ret != 0 handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/', 404, {'Connection': 'close'}) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir%2F&restype=container', 200, {'Connection': 'close'}) handler.add('PUT', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/.gdal_marker_for_dir', 201) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsiaz/az_bucket_test_mkdir/dir', 0) assert ret == 0 # Try creating already existing directory handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/', 404) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir%2F&restype=container', 200, {'Connection': 'close', 'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>dir/</Prefix> <Blobs> <Blob> <Name>dir/.gdal_marker_for_dir</Name> </Blob> </Blobs> </EnumerationResults> """) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsiaz/az_bucket_test_mkdir/dir', 0) assert ret != 0 # Invalid name ret = gdal.Rmdir('/vsiaz') assert ret != 0 # Not a directory handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/it_is_a_file/', 404) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=it_is_a_file%2F&restype=container', 200, {'Connection': 'close', 'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>it_is_a_file/</Prefix> </EnumerationResults> """) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/it_is_a_file') assert ret != 0 # Valid handler = webserver.SequentialHandler() handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir%2F&restype=container', 200, {'Connection': 'close', 'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>dir/</Prefix> <Blobs> <Blob> <Name>dir/.gdal_marker_for_dir</Name> </Blob> </Blobs> </EnumerationResults> """) handler.add('DELETE', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/.gdal_marker_for_dir', 202) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/dir') assert ret == 0 # Try deleting already deleted directory handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir/', 404) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir%2F&restype=container', 200) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/dir') assert ret != 0 # Try deleting non-empty directory handler = webserver.SequentialHandler() handler.add('HEAD', '/azure/blob/myaccount/az_bucket_test_mkdir/dir_nonempty/', 404) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir_nonempty%2F&restype=container', 200, {'Connection': 'close', 'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>dir_nonempty/</Prefix> <Blobs> <Blob> <Name>dir_nonempty/foo</Name> </Blob> </Blobs> </EnumerationResults> """) handler.add('GET', '/azure/blob/myaccount/az_bucket_test_mkdir?comp=list&delimiter=%2F&maxresults=1&prefix=dir_nonempty%2F&restype=container', 200, {'Connection': 'close', 'Content-type': 'application/xml'}, """<?xml version="1.0" encoding="UTF-8"?> <EnumerationResults> <Prefix>dir_nonempty/</Prefix> <Blobs> <Blob> <Name>dir_nonempty/foo</Name> </Blob> </Blobs> </EnumerationResults> """) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiaz/az_bucket_test_mkdir/dir_nonempty') assert ret != 0 ############################################################################### def test_vsiaz_fake_test_BlobEndpointInConnectionString(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('AZURE_STORAGE_CONNECTION_STRING', 'DefaultEndpointsProtocol=http;AccountName=myaccount;AccountKey=MY_ACCOUNT_KEY;BlobEndpoint=http://127.0.0.1:%d/myaccount' % gdaltest.webserver_port) signed_url = gdal.GetSignedURL('/vsiaz/az_fake_bucket/resource') assert 'http://127.0.0.1:%d/myaccount/az_fake_bucket/resource' % gdaltest.webserver_port in signed_url ############################################################################### def test_vsiaz_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_vsiaz_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() az_resource = gdal.GetConfigOption('AZ_RESOURCE') if az_resource is None: pytest.skip('Missing AZ_RESOURCE') if '/' not in az_resource: path = '/vsiaz/' + az_resource statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'vsiaz_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) ret = gdal.Mkdir(subpath, 0) assert ret != 0, ('Mkdir(%s) repeated should return an error' % subpath) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, \ ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsiaz/' + az_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Same with /vsiaz_streaming/ f = open_for_read('/vsiaz_streaming/' + az_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 if False: # pylint: disable=using-constant-test # we actually try to read at read() time and bSetError = false # Invalid bucket : "The specified bucket does not exist" gdal.ErrorReset() f = open_for_read('/vsiaz/not_existing_bucket/foo') with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert gdal.VSIGetLastErrorMsg() != '' # Invalid resource gdal.ErrorReset() f = open_for_read('/vsiaz_streaming/' + az_resource + '/invalid_resource.baz') assert f is None, gdal.VSIGetLastErrorMsg() # Test GetSignedURL() signed_url = gdal.GetSignedURL('/vsiaz/' + az_resource) f = open_for_read('/vsicurl_streaming/' + signed_url) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 ############################################################################### def test_vsiaz_cleanup(): for var in gdaltest.az_vars: gdal.SetConfigOption(var, gdaltest.az_vars[var]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/vsistdin.py����������������������������������������������������������������0000755�0034015�0000144�00000012221�13614005316�017144� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env pytest ############################################################################### # $Id: vsistdin.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsistdin/ # Author: Even Rouault <even dot rouault at mines dash parid dot org> # ############################################################################### # Copyright (c) 2012, Even Rouault <even dot rouault at mines-paris dot org> # # 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 test_cli_utilities import pytest ############################################################################### # Test on a small file def test_vsistdin_1(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/vsistdin_1_src.tif', src_ds) ds = None cs = src_ds.GetRasterBand(1).Checksum() src_ds = None # Should work on both Unix and Windows os.system(test_cli_utilities.get_gdal_translate_path() + " /vsistdin/ tmp/vsistdin_1_out.tif -q < tmp/vsistdin_1_src.tif") gdal.Unlink("tmp/vsistdin_1_src.tif") ds = gdal.Open("tmp/vsistdin_1_out.tif") assert ds is not None assert ds.GetRasterBand(1).Checksum() == cs gdal.Unlink("tmp/vsistdin_1_out.tif") ############################################################################### # Test on a bigger file (> 1 MB) def test_vsistdin_2(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() ds = gdal.GetDriverByName('GTiff').Create('tmp/vsistdin_2_src.tif', 2048, 2048) ds = None # Should work on both Unix and Windows os.system(test_cli_utilities.get_gdal_translate_path() + " /vsistdin/ tmp/vsistdin_2_out.tif -q < tmp/vsistdin_2_src.tif") gdal.Unlink("tmp/vsistdin_2_src.tif") ds = gdal.Open("tmp/vsistdin_2_out.tif") assert ds is not None ds = None gdal.Unlink("tmp/vsistdin_2_out.tif") ############################################################################### # Test opening /vsistdin/ in write mode (failure expected) def test_vsistdin_3(): gdal.PushErrorHandler('CPLQuietErrorHandler') f = gdal.VSIFOpenL('/vsistdin/', 'wb') gdal.PopErrorHandler() assert f is None ############################################################################### # Test fix for #6061 def test_vsistdin_4(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() f = open('tmp/vsistdin_4_src.vrt', 'wt') f.write("""<VRTDataset rasterXSize="20" rasterYSize="20"> %s <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,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"]]</SRS> <GeoTransform> 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01</GeoTransform> <VRTRasterBand dataType="Byte" band="1"> <ColorInterp>Gray</ColorInterp> <SimpleSource> <SourceFilename relativeToVRT="0">data/byte.tif</SourceFilename> <SourceBand>1</SourceBand> </SimpleSource> </VRTRasterBand> </VRTDataset>""" % (' ' * (2 * 1024 * 1024))) f.close() # Should work on both Unix and Windows os.system(test_cli_utilities.get_gdal_translate_path() + " /vsistdin/ tmp/vsistdin_4_out.tif -q < tmp/vsistdin_4_src.vrt") gdal.Unlink("tmp/vsistdin_4_src.vrt") ds = gdal.Open("tmp/vsistdin_4_out.tif") assert ds is not None ds = None gdal.Unlink("tmp/vsistdin_4_out.tif") �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/__init__.py����������������������������������������������������������������0000644�0034015�0000144�00000000000�13614005316�017025� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/����������������������������������������������������������������������0000755�0034015�0000144�00000000000�13614005321�015633� 5����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/pcscitation.tif�������������������������������������������������������0000644�0034015�0000144�00000001532�13614004466�020671� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���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{skkkkksck�����������������������������������������������������������������������S������� ������ ����^���@����� ����&��� ���N����������������������������������@A����̞LA��������������N@������N@��������������������������������v� ��� ��� ��� ���� ���)# ��� �� �� �� ����������������������������������*?mycitation|�����������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/md_ls_MTL.txt���������������������������������������������������������0000644�0034015�0000144�00000001115�13614004466�020215� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GROUP = L1_METADATA_FILE GROUP = PRODUCT_METADATA DATA_TYPE = "L1T" ELEVATION_SOURCE = "GLS2000" OUTPUT_FORMAT = "GEOTIFF" SPACECRAFT_ID = "LANDSAT_8" SENSOR_ID = "OLI_TIRS" DATE_ACQUIRED = 2015-09-01 SCENE_CENTER_TIME = 17:00:00.0000000Z END_GROUP = PRODUCT_METADATA GROUP = IMAGE_ATTRIBUTES CLOUD_COVER = 1.09 IMAGE_QUALITY_OLI = 9 IMAGE_QUALITY_TIRS = 9 ROLL_ANGLE = -0.001 SUN_AZIMUTH = 139.45771403 SUN_ELEVATION = 56.31165874 EARTH_SUN_DISTANCE = 1.0011798 END_GROUP = IMAGE_ATTRIBUTES END_GROUP = L1_METADATA_FILE END ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/int32_2.hdf�����������������������������������������������������������0000644�0034015�0000144�00000012256�13614004466�017515� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� j���\��� ��@��������� ���<���F���!���g������k���<������!�j������������������� �����2� ��$���7� ��[���;� �����I� �����F� ��%��� ��9���<� ��u���8������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NCSA HDF Version 4.1 Release 4, December 2000��������������������������������������k���{������s���������������������k������k���������k���{���s���������s������k���{������s������s������k���{���{���c������{������������c������s������������{���s������k������s������{���k���������s���s���k���s���k���������{���{���s���������{���s���{���s���{���k���s������k���s������s������������������������s���s���s���{������{������{������k���k���������{������������������s������{���k������s���������c���{���s������������k���������������������c������{���s������������c������{���������{���s������{������s������{������{���k���s������s���k���s���c���{���c������c���k���{���s������s���{������s���������{���{������c���s���c���{������s���s���k���������c������c���s���{���k������k���s���k���s���{������{���k���{������������������{���c������{���k������c���s���{���������{���k���{���{���{���k���{���{���{���k������{���{���s���s���Z���k������k���k���k���k���c������{���s���������c���{���{���k���{���c���k���������k���s���s���k���c������k������������������k���{���c���c���s���c������c������s������{���c������{������������k������Z���k���s���k���Z���c���{���s���s���s���{���{������s������c���������������{���k���k���k���s������c���s���c���c���k���s������s���Z���{���s������������������s������Z���c���s���Z���c���c���k���c������c���k���������������������{������c���s���{���J���s���c���{���������������������c������������������k������{������������������������{���k���{���k���{���������������������������������s������k���k���k���k���k���s���c���k����������������Values�fakeDim0� DimVal0.1��������������fakeDim0�Dim0.0������������������������Values�fakeDim1� DimVal0.1��������������fakeDim1�Dim0.0�������� ��������j��j��j���j�����j�������Band0�Var0.0��������Created with GDAL (http://www.remotesensing.org/gdal/)�������7���7���7�VALUES� Signature�Attr0.0�����������440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000�������I���I���I�VALUES�TransformationMatrix�Attr0.0�����������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"]]�����������VALUES� Projection�Attr0.0��������������� � � � � int32_2.hdf�CDF0.0�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/rpc_5395.vrt����������������������������������������������������������0000644�0034015�0000144�00000004417�13614004466�017660� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="1" rasterYSize="1"> <Metadata domain="RPC"> <MDI key="HEIGHT_OFF">300</MDI> <MDI key="HEIGHT_SCALE">600</MDI> <MDI key="LAT_OFF">-27.689839583902</MDI> <MDI key="LAT_SCALE">1</MDI> <MDI key="LINE_DEN_COEFF">1 -0.000565083938580901 -0.00974153845115211 -0.000794958239421523 0.00784996523870163 2.10636680764154e-07 6.85732484595469e-06 -0.0137711394455584 0.0104193322169692 2.96123621609801e-07 6.68697894923298e-06 -1.99656815311755e-05 2.79585890439193e-06 2.55435494977974e-09 -0.000220679266647039 -8.59804168840128e-05 -1.04048356597275e-08 -1.26611886734906e-05 7.55325741863544e-06 -0.000198739559854933</MDI> <MDI key="LINE_NUM_COEFF">7.60785544306492e-05 -14.0414767431677 2.45276702125956 -7.23869336054436e-05 -0.00450598097418797 -5.46285135312602e-05 1.14514308534597e-05 -0.000909846164052902 -0.0218529040338717 6.28996438614693e-09 5.23140484043338e-07 -0.000857585883098567 0.000793452779238812 -3.07644792593709e-06 0.000697251094359919 0.000300049830300964 5.25204092882703e-07 1.22634879473615e-07 -2.03688928834822e-07 -1.80967333588151e-05</MDI> <MDI key="LINE_OFF">1344</MDI> <MDI key="LINE_SCALE">1344.5</MDI> <MDI key="LONG_OFF">28.2093298743762</MDI> <MDI key="LONG_SCALE">1</MDI> <MDI key="SAMP_DEN_COEFF">1 -0.000745926079289916 -0.000900686906646797 -0.000791563212814012 0.0026046187758002 5.36774902748505e-07 4.53337123396125e-08 -0.00645061187068485 0.00103164674687495 -1.41299856798449e-06 2.30855788174722e-06 -4.82541713608953e-06 2.48302339116435e-05 -4.75899541996228e-09 -0.000134796844065477 -5.41622966920841e-07 9.10052166958053e-09 -6.50256952994255e-06 -2.88941516046748e-07 -0.000197890803203444</MDI> <MDI key="SAMP_NUM_COEFF">3.7636857875202e-05 1.36472735610589 9.85951824427767 -0.000308204934926913 0.00507860692929707 1.04795143375802e-05 7.88534978790334e-05 -0.0361831898897949 -0.000646503355165695 2.86864410697918e-08 -1.67866121003613e-08 9.5227084031535e-05 -0.000352661500443663 -2.02804763937969e-06 0.00064048124228222 -5.50652734678803e-05 -1.46603300837933e-05 -2.81211146813121e-07 9.07323766119461e-09 -7.70512335653336e-05</MDI> <MDI key="SAMP_OFF">2016</MDI> <MDI key="SAMP_SCALE">2016.5</MDI> </Metadata> <VRTRasterBand dataType="Byte" band="1" /> </VRTDataset> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/utmsmall.img����������������������������������������������������������0000644�0034015�0000144�00000062713�13614004466�020211� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG�@����������������������������������������������������R����{Y��������������H ����������root������������������������������������������������������������root�������������������������������XAA����H ��R�����R�����Layer_1�48752538������������������������������������������������Eimg_Layer�������������������������XAAd���d�����@���@�������J��������������Ehfa_Layer�52538������������������������������������������������Ehfa_Layer�������������������������XAA��0 ����L�����������n��0���Statistics�52538������������������������������������������������Esta_Statistics�rs�����������������XAA������ @�����o@g@Tc@�����b@�����o@ٶK@��Z�����������<���StatisticsParameters��������������������������������������������Eimg_StatisticsParameters830�������XAA����T���T������ ��������������ĒT����������ԒT��������������Descriptor_Table�ers��������������������������������������������Edsc_Table�ticsParameters830�������XAA���V��������Z������b�����#Bin_Function#�e�ers��������������������������������������������Edsc_BinFunction�rameters830�������XAA������������������o@����T������Z������������Histogram�ion#�e�ers��������������������������������������������Edsc_Column�tion�rameters830�������XAA���N�������Z���������������Z���HistogramParameters���������������������������������������������Eimg_StatisticsParameters830�������XAA����N���N������ ��������������N���������N������������������o@����2NV��H��Edms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{4096:Cdata,}RasterDMS,.�������R������� �����IMGFormatInfo�38������������������������������������������������ImgFormatInfo831�������������������XAA�@������k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{ksss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{s{ksc{skscZk{cs{Zcccc{kskk{kssk{Zsŭc{sc{{ssckk{ckkcsccZcsZss{{{sν{s{{kssksc{cck{kcccsZ{sksskss{s{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{ccs{kksks{{k{kskscskkssks{{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{k{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{c{{k{ckksskckZ{ksss{ss{ksssk{ccsccs{c{ssc{kkcs{s{{skk{֜ŽkZkskZc{sss{{sc{kckk{{ssŵ{{νΜ凜{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{潭sZcsZcckccksZs{skskssֵŭΜΜ{cs{Jsc{ckkskksŽ{εŵν΄k{{k{k{RccZŭŜΥε浌ŭ{{skkkkksckZsccέޭ޵ֵ֥s{sZcsZkccZckcc{ε朔ŭŽŵk{{{kcRkkkcckŭŭ֥ޜZckcRss޽業{Z{k{ŽŭŌŭc{{{{sR{֜{s{{{{{{Zc楜{έ{c{εkΥsks{{֔ŔskޜŔs{ﭥ{֔{{ťs{Z{ŵŵŌťŽŌ{{ssŌsνť挥ť{ν{潔޽朔Υ{攔ք{Rkŵޔsks{ZŽ楔ޭs歔ť{k{kscsc{ť֜{J{c{Rcs{kΥέŔťŵskk{skscRcJk{sέ{Ŝ֌޽έk{{Rk{kZ{Rťŭνks{sskck{ֵŜsZŭkss{{s{c{ŌޥŜsk歜֜{{Ŝ{s{k{{ckkŜ浌c潥ޔޔs{s{c{ks{s{s{εέ{{ssss{{kskkュ{ssތkckckcsksks{{ss{{Ό{sŽ歄ksckkk{{{{sks{{ťck{޵޽kksssssc{kc{ccsބŌcsޥŭssR{c{sZks{ss{kcs{kZ{ޔޔkޥ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνksRssssk{{sksc{{kRBνŽ{{ťŭ޵JkJ{kRZksRkkss֭kcŜksέZk:ccRs{kskkscΥŌc{s{ŽBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭ{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭cscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵ZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νs凜sŜŌֵέ֭����������������������������s{Ŕε����������������������������Žέ֭Δŵ����������������������������έńBΥννΜ����������������������������k{ccť����������������������������ΔŽޜZkŭ{����������������������������ﵔťsޥ����������������������������c{����������������������������Rcֵ����������������������������Zֽ����������������������������sέέ{֔極����������������������������ť{kέ޽{ޥΥ����������������������������ε{Δ楥ޥŜŭ����������������������������ֵ޽Žŭޥεk����������������������������ֽεΔŽŵ֥ťޭŜ����������������������������ŽŭŌk����������������������������ΌŔ޽ŭ����������������������������֭Μks����������������������������ޭΔ{Ό����������������������������{Ŝ{ޭ����������������������������ŭŵŵ����������������������������ޭ֔Ŝ{����������������������������έބε����������������������������ŵŜ����������������������������kޔŽť����������������������������sֵޥֽs{����������������������������ŽΔΜ����������������������������΄省Μ����������������������������Ō攜����������������������������εޭńŽ֭����������������������������{Ό޽֭����������������������������sֵŔ����������������������������޵޽֔����������������������������ŵε����������������������������ֽŭ֌������������������������������������������������������������������������������������掠����������������������������c{kޜs����������������������������νΜsk{s����������������������������ޭޥ{����������������������������ŵΜŌ����������������������������֔εŵεJk����������������������������޽s֭{{{����������������������������ޥs{{s����������������������������ֵ����������������������������Ō����������������������������{΄֜����������������������������{έ����������������������������{����������������������������ŔֽŔŵ{����������������������������s֭kޜ歭����������������������������Μ֭潽޽����������������������������ŔνޥΥ֭����������������������������Υ޽֜����������������������������޽֜ޔք{ν����������������������������ޜ{ť歵s����������������������������ŔޥΔ޵քk����������������������������ŵ{ֽνŵ����������������������������Žޜ{֜ޔ����������������������������ń1skń{{s����������������������������޵sZBcťk����������������������������樂c֜ťŽŵ����������������������������ޭŜέkε֥ŭε����������������������������c::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{kss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skńkksRskssk)sckcskRc{JJsc{{ssΌ޵sccc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތk:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌c:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔεcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZք{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭B:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭk)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{cB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭cscZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZBkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZk)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zk!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:JsބkkRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜk:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{J!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZ!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkc!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{Z1Rs�!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsR!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBBs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1Bs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cR)JRk1ccBckssZ!11cJ)JJB)RRs{R�:){k1:JJ):)kR{sJJZkB����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ΔŜ֭Zs����������������������������sZ{ΥŽ浵Υֽ֭����������������������������潜ŵΌュ֭νέε����������������������������{֔ŭֵΔ֭֌����������������������������c֔޵ΜŽ����������������������������ťŭޭތ����������������������������sֵkŜ步����������������������������֜ŭsŵŵť����������������������������ŵŭť΄ﭵέ����������������������������ŭŜ{{Zε����������������������������ŭ{ss֜ޥ����������������������������{s֭c歵֥֭{s����������������������������kΥŭskֵΜŭ����������������������������{{s{sťﵵΔ֜s����������������������������{{{֜ޜ޵����������������������������ֽkss΄ޔ����������������������������kΥck{{攽ŭ����������������������������ksR:ZcRZZR歌νŭֵ����������������������������scZZsckZZBZ攜潽Ō����������������������������Rcskc{ccքŌZR{����������������������������ccBJc{{k{Rk{ZkZZkJJBZRkc����������������������������ccccs{{k1JBRcRZZss{{JRZ:ZJ{����������������������������{kťŭ{kRBcZBcc{ZZRZcRZBB����������������������������Zk֥kJkss{{cs{ZBR:J:BBZs{{����������������������������{skZRc1J:ZZBJJ)BJB:c����������������������������kZJRsΔssBk{sBJ1J:BJ:JRBRk����������������������������scR1{{Z{{sBRRBB1BRRJ:Z{ŭ����������������������������:{kRRsksRJJBB1J)JZkR����������������������������RRZJsRRZcs{kcRR1BJBB{k����������������������������ksZZ{{RsJ{cZJRZ)BBBs����������������������������JBRBZRkZkRJBZBBBBcs����������������������������ckJJRJJcJ{sskkkc)JBZskRRJ1����������������������������ZsZ:ssJRJZ{kZ{Zk{{{ZRR1����������������������������ccBkZZB1ssskZkR{:RRZks{Zkcc����������������������������sZ:k1{J:1ksJZ{k{JZ{:skccRZZk����������������������������kBJBZ:R1:ZcccsJRRskk:{sscRZ{��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f��K���������PK��^���RasterDMS��52538������������������������������������������������Edms_State�������������������������XAA���������������fK���� ��������������������*����������:������������K�����XAAJ��L���������.L��c���Map_Info���52538������������������������������������������������Eprj_MapInfo�����������������������XAA���6L��UTM����BL������A����LA���ZL������CA����#LA���rL��������N@������N@���L��meters�K�������M��M�����Projection�52538������������������������������������������������Eprj_ProParameters�����������������XAA���������M�����'M��UTM� ������7M��������������������������������?�������������������������������������������������������������������������������������������M�� ���M��Clarke 1866�TXA333?XA^s{?fOMXA��������L������kN��+���Datum�tion�52538������������������������������������������������Eprj_Datum�ameters�����������������XAA���sN��NAD27������N�� ���N��nadcon.dat����������������������������������������������������������������������� @��������������������������������������������������������������7@����������������������������������������������������������������������=@��������������������������������������������������������������G@�������������������������������������������������������������@Q@�������������������������������������������������������������X@����������������������������������������������������������������������^@�������������������������������������������������������������@f@������������������������������������������������������������� h@�������������������������������������������������������������j@�������������������������������������������������������������q@���������������������������������������������������������������������v@�������������������������������������������������������������|@�������������������������������������������������������������@��������������������������������������������������������������@���������������������������������������������������������������������@�������������������������������������������������������������h@�������������������������������������������������������������@�������������������������������������������������������������@���������������������������������������������������������������������P@�������������������������������������������������������������@�������������������������������������������������������������0{@�������������������������������������������������������������u@�������������������������������������������������������������Pu@���������������������������������������������������������������������q@������������������������������������������������������������� l@�������������������������������������������������������������m@�������������������������������������������������������������e@���������������������������������������������������������������������c@�������������������������������������������������������������@Z@�������������������������������������������������������������@������:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.�����������������������������������������������������gdalautotest-3.0.4/gcore/data/byte_jpg_tablesmodezero.tif�������������������������������������������0000644�0034015�0000144�00000001246�13614004466�023255� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���������������������������������������������f��������������������@���������S������� ������� �������� ��� ������J������������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|��C�    $.' ",#(7),01444'9=82<.342� ��������������������*����������1A!Qq"aBb���?�uŷ1JuQe؍}q+T,38 /}@k=D,\,t˯Y¯.WyX?{Y&VbDTAe�m/[PJ LSQ1"ZI7 Շ 0i'@w> G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/stats_nodata_posinf_msvc.tif������������������������������������������0000644�0034015�0000144�00000000261�13614004466�023441� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� �������������������� ������������������������������������������ ����������S������������������1.#INF�����?��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/cint16.tif������������������������������������������������������������0000644�0034015�0000144�00000003620�13614004466�017455� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�H��k���{������s���������������������k������k���������k���{���s���������s������k���{������s������s������k���{���{���c������{������������c������s������������{���s������k������s������{���k���������s���s���k���s���k���������{���{���s���������{���s���{���s���{���k���s������k���s������s������������������������s���s���s���{������{������{������k���k���������{������������������s������{���k������s���������c���{���s������������k���������������������c������{���s������������c������{���������{���s������{������s������{������{���k���s������s���k���s���c���{���c������c���k���{���s������s���{������s���������{���{������c���s���c���{������s���s���k���������c������c���s���{���k������k���s���k���s���{������{���k���{������������������{���c������{���k������c���s���{���������{���k���{���{���{���k���{���{���{���k������{���{���s���s���Z���k������k���k���k���k���c������{���s���������c���{���{���k���{���c���k���������k���s���s���k���c������k������������������k���{���c���c���s���c������c������s������{���c������{������������k������Z���k���s���k���Z���c���{���s���s���s���{���{������s������c���������������{���k���k���k���s������c���s���c���c���k���s������s���Z���{���s������������������s������Z���c���s���Z���c���c���k���c������c���k���������������������{������c���s���{���J���s���c���{���������������������c������������������k������{������������������������{���k���{���k���{���������������������������������s������k���k���k���k���k���s���c���k����������������������� ������������������������������������������@���������S������� ������ ����������J������z������������N@������N@������������������������������������@A����̞LA�������������������������� ���Wh ���)#NAD27 / UTM zone 11N|�����������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/msubwinbyte.vrt�������������������������������������������������������0000644�0034015�0000144�00000003361�13614004466�020754� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="50" rasterYSize="50"> <VRTRasterBand dataType="Byte" band="1"> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="20" yOff="20" xSize="10" ySize="12"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="30" yOff="30" xSize="10" ySize="12"/> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="2"> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="20" yOff="20" xSize="10" ySize="12"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="30" yOff="30" xSize="10" ySize="12"/> </SimpleSource> </VRTRasterBand> <VRTRasterBand dataType="Byte" band="3"> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="20" yOff="20" xSize="10" ySize="12"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">byte.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="10" yOff="5" xSize="10" ySize="12"/> <DstRect xOff="30" yOff="30" xSize="10" ySize="12"/> </SimpleSource> </VRTRasterBand> </VRTDataset> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/stats_nodata_posinf.tif�����������������������������������������������0000644�0034015�0000144�00000000464�13614004466�022416� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� �������������������� ������������������������������������������������������S���������������?��� �������������������� ������������������������������������������ ����������S�����������inf�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/tif_jpeg_ycbcr_too_big_last_stripe.tif��������������������������������0000644�0034015�0000144�00000002444�13614004466�025440� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*����������������������������������������������������������������������������S������[����>�������������� ������ ������� ���������D���������������������`��[�������������������������������������������C�    $.' ",#(7),01444'9=82<.342�C  2!!22222222222222222222222222222222222222222222222222<GDALMetadata> <Item name="COLORINTERP" sample="0" role="colorinterp">Gray</Item> <Item name="COLORINTERP" sample="1" role="colorinterp">Gray</Item> <Item name="COLORINTERP" sample="2" role="colorinterp">Gray</Item> </GDALMetadata> ��������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|����"�����������������(����������!1AQq"ab����������������������������������� ��?�# 2x#\a|�0rӡYǑ̬!2e$OIa|C IeB!gGPt﹥LZ_'P���"������������������%� �����������1A!"BQaq����������������������������������� ��?�V/YA6,q"]$SVT)gI9g\<@A#Ѐ?����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/pixfun_mul_c.vrt������������������������������������������������������0000644�0034015�0000144�00000001353�13614004466�021073� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="5" rasterYSize="6"> <VRTRasterBand dataType="CFloat32" band="1" subClass="VRTDerivedRasterBand"> <Description>Product</Description> <PixelFunctionType>mul</PixelFunctionType> <SimpleSource> <SourceFilename relativeToVRT="1">cint_sar.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="5" ySize="6"/> <DstRect xOff="0" yOff="0" xSize="5" ySize="6"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">cint_sar.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="5" ySize="6"/> <DstRect xOff="0" yOff="0" xSize="5" ySize="6"/> </SimpleSource> </VRTRasterBand> </VRTDataset> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/classictiff_one_block_long.tif����������������������������������������0000644�0034015�0000144�00000000636�13614004466�023701� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� ���������������������������������������������������B�������C�������D�������E�������S�����������s�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/uint32.img������������������������������������������������������������0000644�0034015�0000144�00000025740�13614004466�017476� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG�@����������������������������������������������������R������������������G ����������root������������������������������������������������������������root�������������������������������XAA����G ��R���9��R�����Layer_1�48752518������������������������������������������������Eimg_Layer�������������������������XAA��������������������������������Ehfa_Layer�52518������������������������������������������������Ehfa_Layer�������������������������XAA��0 ���������������n��0���Statistics�52518������������������������������������������������Esta_Statistics�rs�����������������XAA�����R@�����o@)\_@�����^@�����`@@X) 6@��Z�����������<���StatisticsParameters��������������������������������������������Eimg_StatisticsParameters830�������XAA����xP���P������ ��������������P����������P��9������������Descriptor_Table�ers��������������������������������������������Edsc_Table�ticsParameters830�������XAA���V��������Z������b�����#Bin_Function#�e�ers��������������������������������������������Edsc_BinFunction�rameters830�������XAA����������R@�����o@����~P������?������������������������������������������������������������������������������������������������������������������������������@���������������������������������������������������������������������B@�������������������������������������������������������������L@��������������������������������������������������������������O@�������������������������������������������������������������P@����������������������������������������������������������������������R@��������������������������������������������������������������?@��������������������������������������������������������������8@��������������������������������������������������������������(@����������������������������������������������������������������������@��������������������������������������������������������������(@��������������������������������������������������������������@��������������������������������������������������������������@��������������������������������������������������������������?�����������������������������������������������������������������������@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��������������������������������������������������������������?{400:Ldata,}RasterDMS,.�������R������� �����IMGFormatInfo�18������������������������������������������������ImgFormatInfo831�������������������XAA@������k���{������s���������������������k������k���������k���{���s���������s������k���{������s������s������k���{���{���c������{������������c������s������������{���s������k������s������{���k���������s���s���k���s���k���������{���{���s���������{���s���{���s���{���k���s������k���s������s������������������������s���s���s���{������{������{������k���k���������{������������������s������{���k������s���������c���{���s������������k���������������������c������{���s������������c������{���������{���s������{������s������{������{���k���s������s���k���s���c���{���c������c���k���{���s������s���{������s���������{���{������c���s���c���{������s���s���k���������c������c���s���{���k������k���s���k���s���{������{���k���{������������������{���c������{���k������c���s���{���������{���k���{���{���{���k���{���{���{���k������{���{���s���s���Z���k������k���k���k���k���c������{���s���������c���{���{���k���{���c���k���������k���s���s���k���c������k������������������k���{���c���c���s���c������c������s������{���c������{������������k������Z���k���s���k���Z���c���{���s���s���s���{���{������s������c���������������{���k���k���k���s������c���s���c���c���k���s������s���Z���{���s������������������s������Z���c���s���Z���c���c���k���c������c���k���������������������{������c���s���{���J���s���c���{���������������������c������������������k������{������������������������{���k���{���k���{���������������������������������s������k���k���k���k���k���s���c���k���f�������������4���RasterDMS��52518������������������������������������������������Edms_State�������������������������XAA������������������ ��@��������������XAA�����������C��c���Map_Info���52518������������������������������������������������Eprj_MapInfo�����������������������XAA���K��UTM����W������A����LA���o������A����LA�����������N@������N@�����meters�����������&�����Projection�52518������������������������������������������������Eprj_ProParameters�����������������XAA���������4�����<��UTM� ������L��������������������������������?��������������������������������������������������������������������������������������������� �����Clarke 1866�TXA333?XA^s{?fOMXA����������������+���Datum�tion�52518������������������������������������������������Eprj_Datum�ameters�����������������XAA�����NAD27�������� �����nadcon.dat�������Z������+�����Histogram�ion#�e�ers��������������������������������������������Edsc_Column�tion�rameters830�������XAA����������Z���������������Z���HistogramParameters���������������������������������������������Eimg_StatisticsParameters830�������XAA����/M���/M������ ��������������/M���������/M����������R@�����o@����/M����} ��erType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.��������������������������������gdalautotest-3.0.4/gcore/data/spaf27_epsg.tif�������������������������������������������������������0000644�0034015�0000144�00000001344�13614004466�020472� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���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{skkkkksck�����������������������������������������������������������������������S������� ������ ����R������������������������������������������˶8AY[#A��������Pō[Lph@nQfLh@����������������������������#� ���zh ���+#SPAF 406 E000|���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/minfloat.tif����������������������������������������������������������0000644�0034015�0000144�00000000520�13614004466�020156� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� �������������������� ������������������������������������������������������S�������������@��@ �������������������� ����������������������������������������������������S�����������8������-3.4028234663852886e+38���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/sasha.aux�������������������������������������������������������������0000644�0034015�0000144�00000070542�13614004466�017472� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG��������������&���{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.�8������������Z��;���DependentFile���������������������������������������������������Eimg_DependentFile���������������������� ���b��sasha.tif������������������������������������������W��������������B���RasterDMS�������������������������������������������������������Edms_State������������������������������������� ������+��������������������������������������������o���������������Ehfa_Layer������������������������������������������������������Ehfa_Layer����������������������������������{4096:cdata,}RasterDMS,.�������P������v��B���RasterDMS�������������������������������������������������������Edms_State������������������������������������� ��������������������������������������������������:p����P������8�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������>��{4096:cdata,}RasterDMS,.���������������B���RasterDMS�������������������������������������������������������Edms_State������������������������������������� ��������������������������������������������������p��W�������������Ehfa_Layer������������������������������������������������������Ehfa_Layer����������������������������������{4096:cdata,}RasterDMS,.�����������������������root������������������������������������������������������������root���������������������������������������������������IMGFormatInfo���������������������������������������������������ImgFormatInfo831�������������������������`��P��8������<�����Layer_1���������������������������������������������������������Eimg_Layer������������������������������d���2�����@���@����������������Layer_2���������������������������������������������������������Eimg_Layer������������������������������d���2�����@���@�������P����W��d�����Layer_3���������������������������������������������������������Eimg_Layer������������������������������d���2�����@���@���,'������o��������4���RasterDMS�������������������������������������������������������Edms_State������������������������������������������������,������������������������NV\cpo_]XQb���������������������������������������������������FNR_{`ݺu���������������������������������������������������j߫���������������������������������������������������誽���������������������������������������������������ҢӺ���������������������������������������������������Ȳɿbd���������������������������������������������������ϑ}Y�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x��o������'�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������'��{4096:cdata,}RasterDMS,.�����o��������K(�� ��RRDNamesList����������������������������������������������������Eimg_RRDNamesList��������������������������S(��IMAGINE 2X2 Resampling����r(�����z(��sasha.aux(:Layer_1:_ss_8_)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D������:p������4��4���RasterDMS�������������������������������������������������������Edms_State��������������������������������������������4����4������������������������BJQQTRTLGFPvx���������������������������������������������������<BDH.[f���������������������������������������������������I&}W���������������������������������������������������QNKvo���������������������������������������������������TWwm���������������������������������������������������ii_s*ɜ;���������������������������������������������������@P5۪R�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������24��:p������fE�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������lE��{4096:cdata,}RasterDMS,.�����:p��P������F�� ��RRDNamesList����������������������������������������������������Eimg_RRDNamesList�������������������������� F��IMAGINE 2X2 Resampling����,F�����4F��sasha.aux(:Layer_2:_ss_8_)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b������p������lR��4���RasterDMS�������������������������������������������������������Edms_State��������������������������������������������R����R������������������������$$--&'!,KR����������������������������������������������������5B>?i���������������������������������������������������0<PVIz��������������������������������������������������� +0=+���������������������������������������������������2V S5gQ_QR*5h���������������������������������������������������P8%@,RK7w���������������������������������������������������AB? K_=1 B�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Q��p������ c�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������&c��{4096:cdata,}RasterDMS,.�����p��������c�� ��RRDNamesList����������������������������������������������������Eimg_RRDNamesList��������������������������c��IMAGINE 2X2 Resampling����c�����c��sasha.aux(:Layer_3:_ss_8_)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'��W����x��&p�����_ss_8_����������������������������������������������������������Eimg_Layer_SubSample�������������������� ��������@���@���E����P��24��p�����_ss_8_����������������������������������������������������������Eimg_Layer_SubSample�������������������� ��������@���@���?c������Q��Nq�����_ss_8_����������������������������������������������������������Eimg_Layer_SubSample�������������������� ��������@���@�����������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/int12_ycbcr_contig.tif������������������������������������������������0000644�0034015�0000144�00000000243�13614004466�022031� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� ������������������������������������������������������������������������S����������� � � ����k�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/uint32.tif������������������������������������������������������������0000644�0034015�0000144�00000003620�13614004466�017475� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�H��k���{������s���������������������k������k���������k���{���s���������s������k���{������s������s������k���{���{���c������{������������c������s������������{���s������k������s������{���k���������s���s���k���s���k���������{���{���s���������{���s���{���s���{���k���s������k���s������s������������������������s���s���s���{������{������{������k���k���������{������������������s������{���k������s���������c���{���s������������k���������������������c������{���s������������c������{���������{���s������{������s������{������{���k���s������s���k���s���c���{���c������c���k���{���s������s���{������s���������{���{������c���s���c���{������s���s���k���������c������c���s���{���k������k���s���k���s���{������{���k���{������������������{���c������{���k������c���s���{���������{���k���{���{���{���k���{���{���{���k������{���{���s���s���Z���k������k���k���k���k���c������{���s���������c���{���{���k���{���c���k���������k���s���s���k���c������k������������������k���{���c���c���s���c������c������s������{���c������{������������k������Z���k���s���k���Z���c���{���s���s���s���{���{������s������c���������������{���k���k���k���s������c���s���c���c���k���s������s���Z���{���s������������������s������Z���c���s���Z���c���c���k���c������c���k���������������������{������c���s���{���J���s���c���{���������������������c������������������k������{������������������������{���k���{���k���{���������������������������������s������k���k���k���k���k���s���c���k����������������������� ������������������������������������������@���������S������� ������ ����������J������z������������N@������N@������������������������������������@A����̞LA�������������������������� ���Wh ���)#NAD27 / UTM zone 11N|�����������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/utmsmall.tif����������������������������������������������������������0000644�0034015�0000144�00000024170�13614004466�020212� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�'��k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭Δŵ{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť攽s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ{s{{kssksc{cck{kcccsZ{sksskss{sc{{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌ccs{kksks{{k{kskscskkssks{Zֽ楄{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥc{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭk{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽ŽŭޥεkkZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌksZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭ֜{cs{Jsc{ckkskksŽ{εŵν֭Μks΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό޵skkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭΜ{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޜZckcRss޽έބε業{Z{k{ŽŭŌŵŜŭc{{kޔŽť{{sR{֜{s{{{sֵޥֽs{{{{Zc楜{έ{ŽΔΜc{εk΄省ΜΥsks{{Ō攜֔ŔskޜŔs{εޭńŽ֭ﭥ{֔{{ťs{{Ό޽֭歵Z{ŵŵŌťŽŌ{{sֵŔ޽ssŌsνť挥ť޵޽֔楥{ν{ŵε潔޽朔Υ{ֽŭ֌攔ք{Rkŵޔsks{ZŽ楔ޭs歔掠ť{k{kscsc{ť֜c{kޜs{J{c{Rcs{kΥέŔťŵνΜsk{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{k{{Rk{kZ{RťŭνŵΜŌks{sskck{ֵŜsZŭ֔εŵεJkkss{{s{c{ŌޥŜsk歜֜{޽s֭{{{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔s{s{c{ks{s{s{εέֵ{{ssss{{kskkュ{ssތŌkckckcsksks{{ss{{Ό{sŽ歵{΄֜ބksckkk{{{{sks{{ťck{޵޽{έބkksssssc{kc{ccsބŌcsޥŭs{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŌksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭JkJ{kRZksRkkss֭kcŜksέΥ޽֜Zk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{scscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭Zskss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭kksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽ:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތ:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜s1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{Bkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkc)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:cJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkR!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsZ1Rs�!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcsBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1Bs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{ZkccBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk)JRk1ccBckssZ!11cJ)JJB)RRs{R�:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{������d�������d����������������������������'�������������Q�������'���������S������� ����(�� ����'������*(������b(��������l�����������������������������������@A����̞LA��������������N@������N@������������������������������ ���Wh ���)#NAD27 / UTM zone 11N|���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/byte_inconsistent_georef.tfw������������������������������������������0000644�0034015�0000144�00000000025�13614004466�023455� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1, 0, 0, -1, 100, 200�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/1bit_2bands.tif�������������������������������������������������������0000644�0034015�0000144�00000000636�13614004466�020445� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� ������ ������� ����������������������������������������� �����������������R��������S����������UUZUVjUUUUUZUUUUUUVUUYUVZiUUUVZiUUUUUVUUUUUUZUYUZUVjUUZUVjUUUUUZUUUUUUVUUYUVZiUUUVZiUUUUUVUUUUUUZUYUZUVjUUZUVjUUUUUZUUUUUUVUUYUVZiUUUVZiUUUUUVUUUUUUZUYUZUVjUUZUVjUUUUUZUUUUUUVUUYUVZiUUUVZiUUUUUVUUUUUUZUYUZUVj��������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/empty1bit.tif���������������������������������������������������������0000644�0034015�0000144�00000000434�13614004466�020267� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� ������ ������� ������������������������������������������� ������������������S����������� ������ ������� ������������������������������������������� ������������������S�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/zero_stored.bin.xml.zip�����������������������������������������������0000644�0034015�0000144�00000001447�13614004466�022303� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VSISparseFile> <Length>5000000447</Length> <SubfileRegion> <Filename relative="1">zero_stored.bin.zip.start</Filename> <DestinationOffset>0</DestinationOffset> <SourceOffset>0</SourceOffset> <RegionLength>83</RegionLength> </SubfileRegion> <ConstantRegion> <DestinationOffset>83</DestinationOffset> <RegionLength>5000000003</RegionLength> <Value>0</Value> </ConstantRegion> <ConstantRegion> <DestinationOffset>5000000086</DestinationOffset> <RegionLength>1</RegionLength> <Value>3</Value> </ConstantRegion> <SubfileRegion> <Filename relative="1">zero_stored.bin.zip.end</Filename> <DestinationOffset>5000000087</DestinationOffset> <SourceOffset>0</SourceOffset> <RegionLength>360</RegionLength> </SubfileRegion> </VSISparseFile> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/md_ov.tif�������������������������������������������������������������0000644�0034015�0000144�00000012650�13614004466�017460� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�R��xoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7�oH�xbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjP�E«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ <P긺"qa@"[:D9F64](`5O8YLmCb*VTe= ywH’/U]Fl(j{r"@8+BƸ. hBI8B)1<ܪEXiCIU<-],'ʣ0k¿%1 <i*(d3APK_sj-eƞcIF%!V B;im@ џ̝9@zNjT "?p8{a.=M*D4&k rS/n_m~V" '{5O$Tm=;6I"N?Lڱr l_7%*(kY\:#&6q<`RUѹeYyp +*(acg<�2](/E>NP2Z^q6_ IsEq +�1(+B)!氅~!ϟf+؆UU[I)0S10E�촻� " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:B�k1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;b�I<c0;g~jضt@?8?φJFWV*_)U$'as|n&3Ab.bT攰`-H9TK^oWOMg:TE(wCig][pmXXeʼnʍeONOM;b) Ne .ct+˦5I,ikQ''3]q7nh\i)P0Ĥ]ύUI؁Ui}ӓjINbq[};K<"6MWV,[fJIgoݯәɉUѡRۺĄ;Q7Iko v;jQSSg?<u7Vm] ]k>vo7n'OD;侟47:}[^%YXz?Le}�f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"0<T)< 9%1PE '2q.t ȪFege%.I` [Ȃ+(_``5H&SB"*M"Dql3aT Q<2Bbpp7۪Հ3۫@Z HNBqqJQ'`UԜ`&d]S @6b@LA!F|UfmCGYT @A8 }ICzff:SA XI�HV%9g;Gn&bAcq\7IHHO>8,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$�]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6<uCWzo6SA W˷%y8 G57663R_}[+Z=H7< $!u2x-QJ#,}/ƐSj{z<  J3(DhE:iO⡄P4rI5j(MV $H7>kW+{w,ݠ*&E& *@@;b%,K)�o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/Ã<D"^2PWaK'c6+POd~5q9x/ye οczH[b&۬L.ityfheD>dN-Au,%hF%;u[ˋl�~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@�]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&�^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%�k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&<HJ١GVYW7ߝq %@+�Xyy~ _56f`eTx$Ulkk/HhGRo& L{䓙>TeE\:tsP$8eǼ@x!>$ fe� $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H�������2�������2������� ��������������������������������2����������������S����*�� ����0�� ����H������x������������������������/��:�����Pll?Pll?��������������������������������]kF4ӽ6�����������������������������WGS 84|�����������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/left_vrt_subpixel_offset.tif������������������������������������������0000644�0034015�0000144�00000001056�13614004466�023460� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���������� �����������������������������������f������������������������������S������� ������� �������� ��� ������J������������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|�k{ssk{ssks{sks{{s{s{sss{s{kŭc{s{s{{ks{ss{s{ccs{kk{c{kc{{{k{{ssZc{{k{ckk{ccsckZkskZc{{kkkscsZcs{cs{J΄k{����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/byte_3.hdf������������������������������������������������������������0000644�0034015�0000144�00000010015�13614004466�017511� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� j���\��� ����� V������ Z���<��� ���!��� ������ ���<��� ���!��� ������ ���<� �� X���!�j� �� y���� �� }������ ���� �� ���Q� �� ���7� �� 3���;� �� n���I� �� ���F��� ��������<������:���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NCSA HDF Version 4.1 Release 4, December 2000�����������������������������������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{skkkkksck����������������Values�fakeDim0� DimVal0.1��������������fakeDim0�Dim0.0������������������������Values�fakeDim1� DimVal0.1��������������fakeDim1�Dim0.0������������������������Values�fakeDim2� DimVal0.1��������������fakeDim2�Dim0.0�������������������j� �j� �j� �j� ��j� � � ��j��� �� � �� 3-dimensional Scientific Dataset�Var0.0��������Created with GDAL (http://www.remotesensing.org/gdal/)�������7���7���7�VALUES� Signature�Attr0.0�����������440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000�������I���I���I�VALUES�TransformationMatrix�Attr0.0�����������PROJCS["UTM",GEOGCS["North_American_Datum_1927",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982139006]],PRIMEM["Greenwich",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",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]�����������VALUES� Projection�Attr0.0��������������� � � � �� byte3.hdf�CDF0.0����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/ycbcr_21_lzw.tif������������������������������������������������������0000644�0034015�0000144�00000005576�13614004466�020665� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�v ���� 0xT" C ,x5L[/r@]< s�Q7CPk�b�2PsQha1ΆXl.�)jnpC�l2O#!\d2N `d1݌d"Լ`, κ@0 (K:Frp+ҹi,M&¹fe0&3Idk�X|Mzg@1i̜駣AЬw*5*5NAűms}p8Xw7ys,v0)[^`Kx0�:+봝6T?=8; 1 x7A֧ C2P-0##;LT ?;Q.-x,|;cAè2#��HCʄ�`;OH3:C` �- kĶ8"B/DJd� c[ +Ќ=J; # <b6c2/(� �/ #H,x* --1 h30 "C1 .Fb]~:҄R|* B/#0"H1.€ B27@/e0.Sj..#`,1c-ݢ8,"'_8Ļ #5 Px% ؖ, 3tB5M(dBh�50c5e „. _л.!�0cx1[@: C , h-@�<h 56ct0;h(xʨB,bM à;f�8 c�E 6#S꾉+ü04 ; 5/" P>�]#bbjP3?:;uUm&=nM<91"º=2CPcQ% tT(rb70部J�> ~_k`T&rЕ!T>pc 0x ?k a0PT ١AEHAu3CQ %ffI � bA}&PO_c1pY /I!( x !DTV"@T�[a5 s 9ZQ 3 k.T[TI%Bp*ut?`d @42'pq<@CL7'p o,0A@ P= <$A*0h(\ &7"ڨt,H7C93VO( at-"e<%LJR F2P`t Ah:QU CfgAl: bl�X4$sX;1 Aia4S5(мxn" (FiرA�X �NW�TY�_K[q `DPP'^CЃ EW )ĩ�a7* @a�؆8; 4Zmx%BBi@qL&!pÈ!$61,L;R_D ~X{' fxdal\Q'y $0H1& '`r"('a ¨tF� bAA�RGhtl&A] N�+A]$8+cTG ó ��8[&A� >;e0{0(ę$H?C` e%T0r A [8!> k�WA6¡S9e0t,P"΁CcR /P@ A'#Bhq`Z)�| ((>RbH^/' !^١< \PzPA&|a�$D(S:�!v%*# 6qX$51 3pAp('f( .#^Ðv f73` l:AD2@Ȇߢ(@́!Hn\:p`+"8nN�ZAAJ x&|{a>e8\TA� B$0 qB8P�!2V!@ 3CU!9 SCOJ�Bs`8SS 8pu%U9208@�$p`J +!@ @ *`kc @ �N/zn8O~Ĭ`͌WPJ6pnK^' @ A 2 !  ` %OJ ע�^ a\ 8aj a�^ ` a8 I�a ) � Rm`F�¸ @axlbA a@  @ < @ �̯ N !Ρ Mj R<��@ ������'�������'�������0 �����������������������������������������f�������n �������������f �������������������6 ����������������������������������������������CLE/����������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/ticket3019.tif��������������������������������������������������������0000644�0034015�0000144�00000001644�13614004466�020155� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�����������������������������������������������������������������������������S������� ������� ������������������������N@������N@������������������������������������@A����̞LA�������������� ���wk{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{skkkkksck����������������������������������������������������������������������S������� ����L�� ����d������������������N@������N@������������������������������������@A����̞LA�������������� ���w��������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/erdas_feet.img��������������������������������������������������������0000644�0034015�0000144�00000043164�13614004466�020453� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG�������V��- ���96�������1!���������0���Statistics������������������������������������������������������Esta_Statistics�������������������A������"@�����o@/ҏb@�����@a@�����@a@  ]M@&���~��1!������ ��(���StatisticsParameters��������������������������������������������Eimg_StatisticsParameters830������A ��(���������������������������������2 ��1!���������Descriptor_Table�ers��������������������������������������������Edsc_Table�ticsParameters830������A��� �� ������~�����������#Bin_Function#�e�ers��������������������������������������������Edsc_BinFunction�rameters830������A������������������o@�������������������������������������������������������������������������������������?���������������������������������������������������������������������������������������������� @���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� @���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?���������������������������������������������F@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������B@��������������?������������������������������������������������������������������������������������������������������?����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.@������~������$ �����Histogram�ion#�e�ers��������������������������������������������Edsc_Column�tion�rameters830������A����������~�� ��1!������ ��F���HistogramParameters���������������������������������������������Eimg_StatisticsParameters830������A���������������������������������������������������o@���������������������������������������2 ������1!������* �����Elevation_Info�ters���������������������������������������������Eprj_ElevationInfo�meters830������A �����������Pulkovo 1942(83) [To WGS 84 1]���������������8@�����^�����W>:z|*yU>qF'%>avt>�������������meters���������������Pulkovo 1942(83) [To WGS 84 1]���������������8@�����^�����W>:z|*yU>qF'%>avt>�������������feet���&��'��nary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.���&���1!������Z��4���RasterDMS�������������������������������������������������������Edms_State��������������������������������������������p����������������������������ccc<<�������������������������������������������������ccc<�������������������������������������������������ccccc�������������������������������������������������رcc �������������������������������������������������رccc�������������������������������������������������رcccc<<<�������������������������������������������������رccc<<�������������������������������������������������رcc<cc�������������������������������������������������رccc<c�������������������������������������������������رccccc�������������������������������������������������رcc�������������������������������������������������رc|�������������������������������������������������رccc�������������������������������������������������cccccc���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!����1!������ �����Ehfa_Layer������������������������������������������������������Ehfa_Layer�������������������������������� ��{4096:cdata,}RasterDMS,.������������� ����������root������������������������������������������������������������root������������������������������������1!������- ������-!�����IMGFormatInfo���������������������������������������������������ImgFormatInfo831���������������������������$�� ��- �� ��!�����Layer_1���������������������������������������������������������Eimg_Layer��������������������������������������@���@���"����1!������E"��i���Map_Info��������������������������������������������������������Eprj_MapInfo���������������������������� ���M"��GK_Zone_7����_"������>\A����ɍWA���w"������L\A����WA���"�������@@�����@@���"��meters�����!��1!��$��.#�����Projection������������������������������������������������������Eprj_ProParameters������������������������ ��������������D#��Transverse Mercator��������d#������������������������?��������?������������8\A�������������������������������������������������������������������#�� ���#��Krasovsky����@TXAޓ3?XAj{?���@TXA��������"������$��_���Datum�����������������������������������������������������������Eprj_Datum������������������������������ ���$��Pulkovo 1942������$��fffff7@a9T�������¾2GѾ+i)+�������������1!��- ��z%��v%�����GDAL_MetaData���������������������������������������������������Edsc_Table���������������������������������&������$������%�����#Bin_Function#��������������������������������������������������Edsc_BinFunction���������������������������������������������������������z%��$������&�����ELEVATION_UNITS�������������������������������������������������Edsc_Column��������������������������������$������������ion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,{1:*oEprj_Datum,verticalDatum,0:pcelevationUnit,1:e3:EPRJ_ELEVATION_TYPE_HEIGHT,EPRJ_ELEVATION_TYPE_DEPTH,EPRJ_ELEVATION_TYPE_UNKNOWN,elevationType,}Eprj_ElevationInfo,.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/uint16.vrt������������������������������������������������������������0000644�0034015�0000144�00000002533�13614004466�017532� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="20" rasterYSize="20"> <SRS>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"]]</SRS> <GeoTransform> 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01</GeoTransform> <VRTRasterBand dataType="UInt16" band="1"> <ColorInterp>Gray</ColorInterp> <SimpleSource> <SourceFilename relativeToVRT="1">uint16.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> </VRTRasterBand> </VRTDataset> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/contig_strip.tif������������������������������������������������������0000644�0034015�0000144�00000005252�13614004466�021060� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MM�*�� &�  !"  !"#  !"#$  !"#$%  !"#$%&  !"#$%&'  !"#$%&'(  !"#$%&'()  !"#$%&'()*  !"#$%&'()*+  !"#$%&'()*+,  !"#$%&'()*+,-  !"#$%&'()*+,-.  !"#$%&'()*+,-./ !"#$%&'()*+,-./0 !"#$%&'()*+,-./01 !"#$%&'()*+,-./012 !"#$%&'()*+,-./0123 !"#$%&'()*+,-./01234 !"#$%&'()*+,-./012345 !"#$%&'()*+,-./0123456 !"#$%&'()*+,-./01234567 !"#$%&'()*+,-./012345678 !"#$%&'()*+,-./0123456789 !"#$%&'()*+,-./0123456789: !"#$%&'()*+,-./0123456789:; !"#$%&'()*+,-./0123456789:;< !"#$%&'()*+,-./0123456789:;<= !"#$%&'()*+,-./0123456789:;<=> !"#$%&'()*+,-./0123456789:;<=>? !"#$%&'()*+,-./0123456789:;<=>?@ !"#$%&'()*+,-./0123456789:;<=>?@A !"#$%&'()*+,-./0123456789:;<=>?@AB!"#$%&'()*+,-./0123456789:;<=>?@ABC"#$%&'()*+,-./0123456789:;<=>?@ABCD#$%&'()*+,-./0123456789:;<=>?@ABCDE$%&'()*+,-./0123456789:;<=>?@ABCDEF� ������#�������%�������� ��������������������������������(�������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/ycbcr_44_lzw.tif������������������������������������������������������0000644�0034015�0000144�00000003612�13614004466�020657� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� P8$�@AP8D. A c@!KE�,xSad5!h+ e8NfIw>eY\2d#]-p�Pk�QH,N#hV-p](Ao4GY6/E{4b*KƂ\U) $YUByuɮh2gQр 5d�X�[!x �CIA`"/f*� U$3D= @28/�.#3 /:2H74K04�C@^1 <d4 @1 b$ j0 �� �ʴ J袮! (1A5C7@C�.b+ @(c3 C0B$ B. 843CH1+à2в;CP% @`5dI*ؖ, 87cI6&x<j5 V + C05 4&"� Ⱞ�.z`@��� #F@=/1 D *+CC5P= 8)41$1cC=(/#(8 < Gch/cx-B2J0sz9#8P¸2P�5 `/`W!["Y*�CqXĐ1A84d5=9b:Ĵ$++#Z1 Qv]FØ9 U/c^b(049#h4Ð~$ N8"*$9 9�- 9( A7kDv� � nrދ"n�AjJ+d 1 `x\=@ ew.�ՈPS:lظB|)Bw C� AP<�$@'~Br=A "D"V�i€pbE 1, DE *#s !0 ��b�0�Mk$��� @Q,�Ax? E8tA)#H}, D(t ;!] fFz`ap;�8:~J)X0v!Q !€|8) `:͐D4j<8qd0A"8fX:v �v�J ��.��DN�& a"�Z 3Cz<Z mC\Aԅ90X"(DfT a0CDH7` .tNp(Ce =+qAxE`rTC!� pe\BppB#¸,�'i@`c(�@�J�y��% axAks^C -C|d 6"s ,@ g =qøm$F 9l¬N*;% DHtJfxrb0>A %C} 3f60YV,ZpKcE�� "�������'�������'�������<������������������������������������������������y�������������r�������������������B����������������������������������������������CLE/����������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/thunder.tif�����������������������������������������������������������0000644�0034015�0000144�00000000224�13614004466�020017� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� ���������������������������)��������������������������������������������S������������U����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/pixfun_dB2amp.vrt�����������������������������������������������������0000644�0034015�0000144�00000001063�13614004466�021077� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float64" band="1" subClass="VRTDerivedRasterBand"> <Description>db to amplitude</Description> <PixelFunctionType>dB2amp</PixelFunctionType> <SourceTransferType>Float64</SourceTransferType> <SimpleSource> <SourceFilename relativeToVRT="1">float32.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> </VRTRasterBand> </VRTDataset> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/mfftest.hdr�����������������������������������������������������������0000644�0034015�0000144�00000000140�13614004466�020006� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IMAGE_FILE_FORMAT = MFF FILE_TYPE = IMAGE IMAGE_LINES = 3 LINE_SAMPLES = 3 BYTE_ORDER = LSB END ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/6band_wrong_number_extrasamples.tif�����������������������������������0000644�0034015�0000144�00000005364�13614004466�024726� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�����������������������������������������������������������������` ���������R�������S������� ������� ������� ���8������x���������������������������������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|�kkkkk{{{{{ssssskkkkkkkkkkkkkkk{{{{{sssssssssskkkkk{{{{{sssssssssskkkkk{{{{{{{{{{ccccc{{{{{cccccsssss{{{{{ssssskkkkksssss{{{{{kkkkksssssssssskkkkkssssskkkkk{{{{{{{{{{sssss{{{{{sssss{{{{{sssss{{{{{kkkkkssssskkkkksssssssssssssssssssssssss{{{{{{{{{{{{{{{kkkkkkkkkk{{{{{sssss{{{{{kkkkksssssccccc{{{{{ssssskkkkkccccc{{{{{sssssccccc{{{{{{{{{{sssss{{{{{sssss{{{{{{{{{{kkkkksssssssssskkkkksssssccccc{{{{{cccccccccckkkkk{{{{{ssssssssss{{{{{sssss{{{{{{{{{{cccccsssssccccc{{{{{sssssssssskkkkkccccccccccsssss{{{{{kkkkkkkkkkssssskkkkksssss{{{{{{{{{{kkkkk{{{{{{{{{{ccccc{{{{{kkkkkcccccsssss{{{{{{{{{{kkkkk{{{{{{{{{{{{{{{kkkkk{{{{{{{{{{{{{{{kkkkk{{{{{{{{{{ssssssssssZZZZZkkkkkkkkkkkkkkkkkkkkkkkkkccccc{{{{{sssssccccc{{{{{{{{{{kkkkk{{{{{ccccckkkkkkkkkksssssssssskkkkkccccckkkkkkkkkk{{{{{ccccccccccsssssccccccccccsssss{{{{{ccccc{{{{{kkkkkZZZZZkkkkkssssskkkkkZZZZZccccc{{{{{sssssssssssssss{{{{{{{{{{sssssccccc{{{{{kkkkkkkkkkkkkkkssssscccccssssscccccccccckkkkkssssssssssZZZZZ{{{{{ssssssssssZZZZZcccccsssssZZZZZcccccccccckkkkkcccccccccckkkkk{{{{{cccccsssss{{{{{JJJJJsssssccccc{{{{{ccccckkkkk{{{{{{{{{{kkkkk{{{{{kkkkk{{{{{ssssskkkkkkkkkkkkkkkkkkkkkkkkksssssccccckkkkk����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/pixfun_sum_r.vrt������������������������������������������������������0000644�0034015�0000144�00000001752�13614004466�021124� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float32" band="1" subClass="VRTDerivedRasterBand"> <Description>Sum</Description> <PixelFunctionType>sum</PixelFunctionType> <SimpleSource> <SourceFilename relativeToVRT="1">uint16.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">int32.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> <SimpleSource> <SourceFilename relativeToVRT="1">float32.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> </VRTRasterBand> </VRTDataset> ����������������������gdalautotest-3.0.4/gcore/data/stefan_full_rgba.tif��������������������������������������������������0000644�0034015�0000144�00000276306�13614004466�021663� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� �������������������������������������� ����������������� ���� �������������R�������S��������������`��`��`��`��`��`��`��`��`��`��`��`��0����v��=��6\��z����V������v�0�6O�m���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������." 7)#      *C%"  n����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n  !   !%&( !      � ��   n����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n% !7)3<)0?+/.'* '';4BLH^QK\LAPYJXG@PB.@?);8&32&*%$  � � �  n����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'' %#0!)7#.<(25%)&(+IBPn^mohzmb}o`pp\jP=G=-92$.2"2,)'#!     ����� ����#  n�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� n0-)# .#H-6C019&."@4Avn}|q}sji_q[HWA3>:(8;+;4(6:*8:+;8-59/>5-72!-1%1+))!(%    ���� � � ���<1$(n����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n0--:*2 (#mYOC+,)fclvL9D4"01!02"30 +6(5B7DKASRH[ki|yw|gfvQHXDBOMC_=8D6+7, !  ��� � � ���� �=?&!n�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=.7% _7Eyij|hqK8E3!-%"(*5 *7&.G;QVOjk_~}xtymjUOcD;J:.A2#2-)(!  ��� � � ������ �<Bo������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n �J99  # -&!  ()6 %B4@LERWN`b\}vf}|rZRjNG[KAU:2=4")0!/+)  �� � � � � �������� �N`MBq����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� � �   &&02!;(-D8LQH]SIYibnlto{ylmerlcqUKeRGa>5G7+>3!21",(   �� � � � ��������� � �QP��� ��� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  �� � � �s*\1  $"   &,3;,*8',H7=G;CN9LQBMe[kkcrf]paYcbXlWK\PF]E;V=/B9+C/ ...#   � � � ������������ � � �  ��� �#������������ ��� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �  � � � � ��0y </-!    %,.5"%<*.<.1F8@E;HRGTYQZRFWKASUI`^WsSE]C;N<0J- *#!��� ���4���4���5���5���5���4���4���3���1���/���-���+���(���% ��������������������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n � � � � �� � 7%WO#0!.*'&'./!6"%8*-G7?B5EJ=HI=IZKgj]ZSnLD^0!1����2���5���9���<���?���A���D���E���G���H���H���I���I���I���H���G���F���E���C���@���=���9���6���2���.���)���%��� ��������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n� � � �'�;%� � �5-$Onk^VBJ<7;16#!)*+1 9&%H5=HCXKAVTKoTEb:+?  ����4���9���=���A���E���I���M���P���S���V���X���Z���\���]���]���^���^���^���]���\���[���Z���W���T���Q���M���I���E���@���;���5���0���*���$��������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n � � ��h >3I bilvv5#'% % ,4"L6IfN^PAV& ����7���=���B���G���L���Q���V���Z���^���a���e���h���j���m���n���p���q���q���r���r���r���q���p���o���n���l���i���f���b���^��Y���T���N��H��A���:��3���+���$������������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �n �� �`v9KxEH$%x29dmP`FU-#&  "* ����7���>���D���J���P��V���\���a���f���j���n���q���u���x���z���}���������������������������������������}���{���x���t���p��l��g��a��[��T��L��D��;��2��(��� ��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ � ���#&60Y n!4 =Sc:J77$!�� ���4���;��C��J���Q�X��^��d���j���o���t���x���|�����������������������������������������������������������������������{��w��r��l��e��]��T��J@��5��+���!��������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����$��"",B l  I8  ���������5���=��F��N�V�^�e�k��q���w���|��������������������������������������������������������������������������������������}��x��r��kbXNB6��*������������ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� � ����$� P$( q1x-0&  � ���?���G���P�Y�a�i�q! " ..��������������������������������������������������������������������z��skbXL?��2��&��������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������      5XU[+  ���B���J���R-<A MN S QQ HLD?<7572 449<? 9%+ (����������������������������������������������~��z��u�og]RE8��+������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ � �����2%"J�<>U7(4U!q+~sjE -! ')  #      ���37< : * 3$ ������������������������~���{���y���w��t��p��kd\RG:��.���"��������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  �����{ ,:PJKODK&WWMC/%!# &1!';!4%#4!"2 '** "  � � � �������������� �� �$ 0 A'/ ���y���v���s���q���o���m���k���i��g��d��a��\UMC��8��,���!��������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n � � �� �u1V `L('  =5&k]E_OE81-."  � � � � � � ���� � ���� ������������������ � �& / ���a���^���\���Z���Y���X���V���T���R��N��J��C��;��2���(������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  � ��,#\s |X8/)nLۉxx8% � � � �� � � � � �� � ��� ������������� ���� � � �� ��!  ���J���H���G���E���D���C���B���A���>���;���6���1���)���"��������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� � ��2k   W !K$71pcT8% � � �� � ��� � � � � � � � � � � � � � � �� �       ���6���4���3���2���1���0���/���.���,���)���%��� ������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� � �� �r *_   l�R _LRK  � � �� �� � � � � � � � � � ��  !#! ! ! ���R���M���I���E���A���>���;���8���5���2    ���&���$���#���"���"���!��� ��������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  � �= %U  ] [bX) � � �� � � � � � � � , ""���~���x���r���m��g��a��\���V���Q���L���G���C���?���;���8���5���1���/���,���)���&���#���!��������������������������������������� ��� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �� �F /i    �= scjn. � � � � ��� ���������������{���u���o��j��d��_��Z��U���P���L���G���C���@���<���9���6���3���/���-���*���'���$���!��������������������������������� ��� ��� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��? Hs k9v#_s ́ |J:"     ���������������������������{���u��o��j��e��`��\��X��T��P��M��J���G���D���A���>���;���8���5���2���/���,���)���&���#��� ������������������������ ��� ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  �K   kAh$-    ���������������������������������������������x��s��n��i��f��b��_��]��Z��W��U��S��P��N��L��I���G���D���A���>���;���7���4���1���.���*���'���#��� ������������������ ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  �7"e  j]IL# ������������������������������������������������������y���u��q��n��k��i��h��f��e��c��b��`��^��]��[��Y��V��S���P���M���J���G���C���@���<���8���4���0���,���'���#��������������� ��� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��K ~vcT2T�����������������������������������������������������������~���{���x���v��u��t��s��s��r��q��p��o��n��l��k��i��f��d��a��^��[��X���T��P��L��H��C���?���:���5���/���*���$��������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n1Gn���������������������������������������������������������������������$1}  ~`H2#Z ���������������������������������������������������������������������������������~��~��}��|��{��z��x��v��t��r��o��m��j��f��c��_��[��W��R��M��H��B��<��6���/���(���!������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GQK���������������������������������������������������������������� ��X  wU=*!] �������������������������������������������������������������������������������������������������������}��{��y��v��s��p��m��i��e��a��\��W��R��M��G��@��9���1���*���"��������� ��� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7=l0i���������������������������������������������������������������� 35V nG2,o�����������������������������������������������������������������������������������������������������������}��{��x��v��s��p��l��i��e��`��\��W��R��M��F��@��8���0���'������������ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+Ss:��������������������������������������������������������������n }!k  v^B6y� ������������������������������������������������������������������������������������������������~��|��z��x��u��s��q��n��k��h��e��a��]��Y��U��Q��L��G��A���:���3���*���"��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������nOkfb 1 ������������������������������������������������������������ �9u  cTG*! �������������������������������������������������������������������������������������}��z��w��u��r��p��m��k��i��g��e��c��`��]��Z��W���S���P���M���J���F���B���=���8���1���*���"��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@S\~=w*T������������������������������������������������������������ �   riT=< � ���������������������������������������������������������������������������}���z���w���t��q��m��j��g��d��a��_��\��Z��X��V���T���R���P���M���K���H���E���C���@���>���;���9���5���1���,���&������������ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$*wO 3k�������������������������������������������������������������I |cSc � ���������������������������������������������������������~���{���w���t���p���m���i���e��b��^��[��W���T���Q���N���L���I���G���E���D���B���@���>���<���9���7���5���3���1���0���.���,���*���(���$��� ������������ ����������������������������������������������������������������������������������������������������������������������������������������������������Fi$3 �n������������������������������������������������0 Wvb*V �������������������������������������������������������P`    ~\& � � �� ���������������������������������������|���x���t���q���m���i���e���b���^���Y���U���R���N���J���G���C���@���=���:���8���6���4���2���1���0���.���,���+���)���'���%���$���#���"���!��� ��������������������� ��� �����������������������������������������������������������������������������������������������������������������������������������������������������c;Y-����������������������������������������#nG[ | Tw 3������������������������������������������������������%    qmA= � � � �����������������������������}���v���p���k���f���a���]���Y���U���Q���M���I���E���A���=���:���6���3���0���-���+���(���&���$���#���"���!��� ��������������������������������������������������� ��� ��������������������������������������������������������������������������������������������������������������������������������������������������������m-U������������������������������������7H  b Yn����������������������������������������������������3  z}Yz� � � �������������������������w���n���f���^���X���R���M���I���E���A���=���9���5���2���.���+���(���%���"��� ������������������������������������������������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��������������������������������������������������������������������������������������������������������������������������������������������������������������yr9����������������������������!-l{Ly C����������������������������������� ��� ��� ��� ��� ��� �����qE {Y" �� � � � ���������������v���j���_���U���L���E���?���:���5���2���.���+���(���$���!��������������������������������� ��� ��� ��� ��� ��� ��� ��� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������w r S n������������������������;= c n(]������������������������������� ��������������������� �j d+@ �� �� � �� ���������y���l���^���Q���F���<���4���.���)���%���!��������������������������� ��� ��� ��� ��� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������jv d1a��������������������!]q O  %@��������������������������� �������������������w �LmE� � � � ��������t���e���V���G���;���0���'���!��������������������� ��� ��� ��� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Kpsucr<�������������3:nlby n��������������������������� �����������$�&�&��"�� � �^d0 � �� � ��  ���r���b���R���B���5���)��� ������������ ��� ��� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������btw[G}������������L_uMx?��������������������� ���������"��)�.�1�/�*��#�� �RdL2� �� � �������s���c���S���C���4���(������������ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9:j tmim"6������^v_IZ /p������������q%'6,:4G8M:P=O8F,8&6! �9vPJ� �� � �� �����i���X���H���9���,��� ��������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �nZorXouIh������ `Mnbj]������ p #8EJaRj_x d|nfbz\l WbRRXdF\�eisrT% � � � � � � �����q���b���R���C���4���'��������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������3/usSmc�s���!X{?b %IIUu"?>M`w{v atUc^n^tb}blsmp` �B Zi?� � � � �� ������m���^���O���@���2���&��������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P] {|\Prn9U���%Jg8O L~���Vzvz~ + �%oz oF"� � � ��� ���y���k���]���N���?���1���%��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*7r yM|\vRj|":P>F40Ho  Wg+(  � �d} M d Q6�� � � � � ���y���k���]���N���?���1���%��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������:D yFf[r!)6GLP 'C I\Bunex\uAW9J-;'   ��(e} }aX�C�,�� �� ����������y���k���]���M���>���0���$��������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������% -! '0@G g wPQ`:A-/Xaa��MEKXR&(   �- `j~Ch_T�M�<�#�� � � �� �����������y���k���\���M���=���/���"��������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������^ _ V X M| :c*A'%78:BMX#$,*k)LLAJjNv)D     ��1}k{ Tq cZO�QA�2�� � � � � ��� ���������x���j���[���K���;���-��� ������������& o����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  y Gy!(0)N\:Hi D>TX" /7KX W Km=f<d=i7X2M2C'2  �5  ݢ- c h`i[�X�O�9�)�� � � � � ���������������w���h���Y���H���8+ 0��� q2d ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������bicbb\bn qiF\NQo ] G^StRFOs fWS[TRUJ@v6Z.F! ��3d  ]% jdd\c�a�\�J�:�.�%� � � � �� � ����������������u���e���U#$:d2Al!&M! P++n��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  } ~ sa?|FP   t i]]^W@l*@  � �Q = ޔ "ْq,_ ]]bh�_�Y�bX�N�=�4�*�� � � � �������������������q���a+���>L-1QL34l��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������   5Q`WX|/#:z?;z   5M.Vs:y"~%T]   n ZeQ\a�ca�_�V�T�I�K�H�4�*�� � � � � ��������������������|���l���[.8Q6=m%.UDz&F-Tn&Hz-!B ����������������������������������������������������������������������������WX } Yz3A n��������������������������������������������������������������������������������������������������������������������������������������������������������������������  c %. > CS =;7f:?O yz QQ 7) 0) /# 4'!�/�DXx w } &l I 4:]al]][kled�dWT�@�J�9�=�1�� � � � � �� ������ 0<?Z(B 99Gv+)0 Jr"@o#Bs#Jn'Bm"!*o n������������������������������������������������������������������������V] | u~z}fk =Vn����������������������������������������������������������������������������������������������������������������������������������������������������������������Ts inrhn v Qz %3:  nCB �472o=U65+#,"      ��5�?PNQR]IC0Pd_ggkwi[�e�e�P�O�L�I�C�8�2� �� � � � � �+/DO L Xr[{ayId@l0 1E>RZnh?Z+C'7%*-@�����������������������������������������:?V]etZk Vk SPNK M[YK cYKi ����������������������������������������������������������������������������������������������������������������������������������������������������������������-+(.$-"FJ  U^ QmA>3u75LxM  �     ��9BTSJTNP:BVS^Z]l�c_We�P�H�J�E�Q�G�7�!�� � �$.&+%10865668EM=L ?[$' *!HSPa M`@\L[M]YlYkRoIa +E������������������n@Q[eouXfLLPR Tg HNPMHFL7 K6 sx:B ������������������������������������������������������������������������������������������������������������������������������������������������������������;1 289b?\ | $*, AK31+S044x 7@_% %44HHe\vMvIi8V%2 *N[]RQN�<:FK]JQ]�Z�J�Y�^K�I�J�J�>�F�0��� "%.&+%!#+$.(+";2031'1()$/ 3/JDQM@K'3,,DEILA:W_]qPr ?N >S AQKvPn]ezkWm TMSVHJ7-GO <9?2>,?- 5`OUZ #!n��������������������������������������������������������������������������������������������������������������������������������������������������������hQ3Tu t{mT` KQ [W g>9"$-10Z1F\f *4GXS=&.XRJJO_K<,4�I[JKQb�N�]�T�N�H�C�D�F�9�"�  ()!.*)')+ $5*-*=/51$#*:*E4):1CE03604*9/=5IVOIT_ QPRURhWzS_}vSUAW L<SMEH!OE*'. ,& A+R@ --����������������������������������������������������������������������������������������������������������������������������������������������b sM r jLR,'&7 ,QJ=I50 *b*04r 6%D  'cMberDBG%@.G? F# MOX�E�/�-�B�O�R�II�M�]�I�LI�H'N;.'( %&&+!-'-#,!55,.%!+"+!:+/1(0/#(;/+*3* -(3)5/9;7';=99>8;?62K77661,"aM83%=)& *6 -'��������������������������������������������������������������������������������������������������������������������������������������������f iayz  %I % .   !!+N+C"WJ6>!/)w+y,yU{m+ &Xjkh@MWR,/&' %!  ���,=K�X�N�J�86�J�NOYNU�C�F,7$0$    #&*"+4(!.+:*'%1'!$0&5$"!    ( 3#.   6'70-) 1$+'(4.*%D*/#:$.)K5;1  0! % (   )*%������������ ��� ��� ��� ���������������������������������������������������������������������������������������������������������������������^ K jf x Q'G&  �+C,E.C6@=UCWCS<S#'U)s+v7a0 8?X[[ );E)2      ��'4�BH�L64�>�CT9�?�,��, TMP RIE "-#&#%5+(*.!>2#, //!*-*  "  �3 8-%&''#1)&*'0-8*.' ������������& ! ��� ��� ��������������������� ��� �����������������������������������������������������������������������������������������������������������:U 5[mf{ 0W?N9c$%;TPsem_]xYxVnQo!2!6)p-y+ln&3  4K;eHp[%:': #"   �(�-�8�A�-�#"�" PMP OAJ!' !"!&)#)4%+(#B4-4+  ,0/� � �� "'%"+)' %% #'% ! /$ '������������������ ��� v��������������������������������� ��� ����������������������������������������������������������������������������������������������������/_ ZtF &Fc!+7EXhnxvh_TnOgEVIU(<(Z(l+pGh,d /E2S6N?d")&  $ +8% ��   L<IH/5*6 !#!$+7%*%&8$4*4&%2' � �  �#!  #!'+ s��� ��������� ��� ��� ���������������#���'���*���,���,���*���&���!������������ �������������������������������������������������������������������������������������������������w"F>Lt'.36Ovecedfdouz~{sG1#'b*n&Yl U,<)3(>MYc  pi=43x        " B!,V5G9H)5%* )0",B%'.)!,#  ������z���k���\���O�E�@�?�%A9*(�#%" -" {������������������������������ ���&���,���3���8���<���>���>���;���6���/���'������������ ���������������������������������������������������������������������������������������������\d 7@p@gLpcs|{x xz {a%O";)a'bLd i;`&4):u&   t{9('U^M       ! "!! ! HH37>+7 !)$'!,7$"4%����������������u��h�]�U�P�P�SY 1&KD+'  ( >)4%!���)���%���!���������������������#���(���/���6���>���E���K���O���Q���Q���M��G���>���4���)�����������������������������������������������������������������������������������������������������#^|}p3e8"03S kyp m|yu s~vd+q.'N&_0N{T"37FSy   �hiq.EC0    )% LS=##!',' ! �3$ ,$ ������������������������t�k�e�b�bek � ='3/ mc�Y�P�H�A��:���5���1���-���+���*���*���+���.���3���9���@���H���P�X�^�b�d�c�_�W�M�A��4���(��������� �����������������������������������������������������������������������������������������RgtgW 8]LR5d#9 #)72K 8T Gm Bl <k:e3X1I. &S&NbK,Lk  TOXF-6PhD+;  � �#" !!   ?=*!/+7: , � �����������������������������z�u�s�s�v{"  4F3�s�k�b�[�T�N��H���D���@���=���<���<���=���A���E���L���S�[�c�j�o�s�t�r�n�e�Z�M�?���0���#�����������������������������������������������������������������������������������������������"dF~ ;s_@ljq_2[%:!##0#<$9!9 9/  %A>[{4_& &' 5@ VbFO:iXtJb<C  &*% "#4-" " �   ������������������������������������� �  +L?�z�t�m�g�b�]��X���T���Q���P���P���Q���U�Y�_�e�l�s�y�}���}�x�o�d�V�G�7���(��������� �������������������������������������������������������������������������������������3lk,'Iv G  +DDtqf Gs3c1i3m0d4m5r2q3q3w/n!D +Oz =54b} 8P Yg!"vzrnowqrmG`%%   (3  )� (  � �� � � ����������������������������������������������� "  *F5%! �}�y�t��p��l���h���f���d���d���f���h�l�q�v�{�������|�t�h�[�K�;���,��������� �������������������������������������������������������������������������������������Cq*Jf,Z/T8YSs  ~K +Z)V+d/p.w0u1{1t/q&T#!&e 0h SnLi BSNq_ y'(z!qj_Y Y U Q T T Z V Y X \ e oq*8  "3   &   � � � �� ���������������������������������������������������� D9YDbS������}���z���x���w���w���w���y���|����������z�r�g�Z�L�<�-��� ������ �������������������������������������������������������������������������������������[My"";Ix- �"2a4f<__w G=;88;7218;l^u wql%G8i7q3m 7n4p4g/_/_.X,S*P,M*N(H)R,M0O8`<dH Mbu%q$-@, 7%#� �  �� �� ��� ��������������������������������������������������������������'" "!X/�����������������������������~�x�r�j�`�U�H�:��,��������� �������������������������������������������������������������������������������������f _$D#73H^p!$;8e5q/RMw] t &s770| B   # }yR I J +   )G+O,V2`/_6k1o.`*S)M,Y-\0h5t8r:x5k1`1X@b[ &o!- �# � � � � � ����� � ����������������������������������������������������������������������������������   vI ����������������������������~��y��r�k�e�]�U�K�@�4���(��������� ������������������������������������������������������������������������������������� yW-Y 2&?HsV-*K8y;t4d<_K]m !+U   (1a ^ V6?_d")R\'Kv-B !0%A,R1d2j0f.e1o5t5v9|IN HK FD=v:nLvqBj  � ��� ���� ��� ����������������������������������������������������������������������������������������� F 1?���������������������y��r��j��b�[��T�M�F�?�6���,���"��������� �������������������������������������������������������������������������������������d(W!C+"93WK~E ,P???y;eDq[`q'L$- DMK j&\ #WW)U5jZ/j/>` %% *%6(B(D,K.E-E1M2N7U8X8^>mAsEtPd&D � � �� � � � ������������������������������������������������������������������|���y���w���v���v���w���z���}���������F+���������������z��r��j��a��Y��P��I��B���<���6���1���*���"��������� ����������������������������������������������������������������������������������������J'N#K+ 6%<AU #0g #4`EAFAp>bP]d (a"3l?lj % &9(>b "&O,[>j`-;u2Mk&% #  "   %+1JMt 5 � �� � � ����� � ����������������������������������������������������|���u���o���j���g���d���c���c���e���h���m���s���z������#����������{�t�k�c��Y��P���F���>���7���1���,���'���#��������������� �����������������������������������������������������������������������������������������$*X#G4!=#;2[Frv !?<yDGHAq9_FS]$`BvC/Ih -2 +#H%L,T7fI~`2r.Hn#& " +  -'  � � � � �(/  � � � �� �#�!����& ���������������������������������������������|���s���k���c���\���W���R���O���N���O���Q���T���Z���a���i���r���z�����������}�v�n�e�\��R��H���>���5���-���'���"������������������ ��� ��������������������������������������������������������������������������������������������.' � /$=#@,BAN"L  �=wIIFxK|7]?HX !bBz)  -&7]v. .#J)Z(c)I4_@Ln'|->c#!! !     � � � � � � � � ���(�!�!�����������������������������������������������x���m���b���Y���P���I���C���>���;���:���:���=���A���G���N���W���`���j��s��z������~�x�q�i�`�V�L��B���8���.���&��������������������� ��� ��������������������������������������������������������������������������������������������������� �0 5$?(F5SJ\}!> ?gQLQOx>^;lDMqc$'/3Yla($$J+_-k(`'O0]9vJi!k!3R     ������� �&�"�$�%�%��� �� �������������������������������������v���i���]���Q���F���=���6���0���,���)���(���)���+���/���4���<���E���N���Y��b��j��q�u�w�v�s�m�f�]�T�I��>��4���*���"������������ ��� ��� �������������������������������������������������������������������������������������������������������������c&<  +d&L'K)E*@EuJ\ `)4RNKHoQwIq2V?M`l!? +?~!C| &%'D+[,h-h,e(M4\:uM ~!W  �� � !   ����� � �$�#�!�%� �!��� �� �����������������������������������x���j���[���M���@���6���-���&��� ���������������������%���+���3���=���G���P��Y�a�f�i�j�h�c�\�T�J�?�5���*���!��������� ��� �����������������������������������������������������������������������������������������������������������������������.\ Ne'4(0v- 'F'E)C;MDu?jP~ (N (#((-9O\RNsOl6Q<pF\\ "@-.KU ~*3 ��� "5*W-c+a-h)V-M>kOk_ ��� � � ���������   ����� �"� � �&�%�!��� ���������������������������������~���n���^���N���?���2���'������������������������������������%���-���6���?���H��P�V�Z�]�\�Z�T�M�D�9�/���$��������� ��� ����������������������������������������������������������������������������������������������������������������������������(D[ei)P;']"+(J,J,<?`,L(<*H"!64+p!&-DpXZRyKh<W7cC]I  D 2 *EZ_( ������!)(I+\+W/e)\*O;kQgg6���������������������  �����"�#��#�!�%� �� � � �� ����������������������������w���f���T���C���3���&������������ ��� ������������ ��� ���������������'���/���7���?��F�K�O�Q�P�M�G�@�6�,���"��������� ������������������������������������������������������������������������������������������������������������������������������������'9ak_< #V &C)P(D,@#7'%.w85'X%!$=Y]\VzRr=[7_Fa3` $D";!53TKk+_ ���������%<+Y.\.d+](R7aXva$���������������������  ���� �"� �#�"���� � �������������������������������r���_���L���:���+������������ ��������������������������� ������������!���(���/���6��<�B�E�G�F�C�=�5�+��"��������� �������������������������������������������������������������������������������������������������������������������������������������"9qpn|!:!('H(K(/w22UuA+,? $1>R`gjNk:Q@rP /^ !.)K$;%;MMv.�������������'=/`.b1f*`.PZ n*���������������������  �� � �������� � � � � �� ���������������������������n���[���G���5���%��������� ��������������������������������� ��� ������������!���(���.��4��:�=�>�=�9�3�+��"��������� �������������������������������������������������������������������������������������������������������������������������������������%DZT ^&B#9,P32cw y <1G*+Rxjx^}7T>mJ*N(M&B%=5MMeJ������������������ 'C-Z1f2f.VR{ R ���������������������� � ��� � ��� � � � � � ��� � ���������������������~���l���Y���E���2���"������ ����������������������������������������������� ��� ������������"���(���.�3�6�6�5�0�)��"��������� �������������������������������������������������������������������������������������������������������������������������������������&@.O  + &524^}65a������8>fxg9];fO2g,H(>$3I{Ty!'��������������������� $(6]6i5h,[T| ~ 4c����������������������  � ����� � � �� � � ��� �����������������������~���l���X���D���1���!������ ������������������������������������������������������� ���������������#���(��,�.�.�+�&�� ��������� �������������������������������������������������������������������������������������������������������������������������������������'D/eaf9b  /5c 1BX�������������� 9MkwC{7tO1c,D);4OLd Hs���������������������������&72X2j+_L}m @��������������������� � �� ���� � �� � � �� �� ������������������������n���Z���E���2���!������ ��������������������������������������������������������������� ���������������"��%��&�%��!������������ �������������������������������������������������������������������������������������������������������������������������������������-Q3o:Ve-]9j -+=�����������������������CS_Q;}D/T-B*;KXu��������������������������� +F6n.hW O ���������������������� � � � � �� � � � � � � � �� ���������������������p���\���H���4���#������ ������������������������������������������������������������������� ��� ��������������������������������� �������������������������������������������������������������������������������������������������������������������������������������-M6|2liv)U;q+#(����������������������������������18C|:B5S,<=ZVv G ���������������������������������� &.Z,dN:v ���������������������  � � � � ��� � � � � � ��� ����������������������s���`���K���7���&��������������������������������������������������������������������������������� ��������������������������� ���������������������������������������������������������������������������������������������������������������������������������������� $5x3wNl (:k } F����������������������������������������%83_B}5G5@S]{h�������������������������������������)R.eW 3��������������������  � � � ��� � � � � � �� � � ���������������������w���d���O���<���*��������� ������������������������������������������������������������������������������� ��� ������������ ��� ������������������������������������������������������������������������������������������������������������������������������������������� n0X1~:_ 5 +ed ~Hqqy #������������������������������������������������ � %(=T.5Pa\o%�����������������������������������3V8t:g ��������������  � � ��� � � � � � �����������������������{���h���T���@���.��������� ������������������������������������������������������������������������������������������ ��� ������������������������������������������������������������������������������������������������������������������������������������������������������$072dx 4,UKmQ~KWux,1 ������������������������������������������������ (%3BAD]ktn)I ����������������������������0XA}(����������  � � �� �� �� � � � �� � ������������������������m���Z���F���3���#������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� 8p5{ f 4C}&% 43HzEjlD�������������������������������������������������1-=C7B52Q[^oFZ�����������������������������4R3_��������x� � � � � ���� � � ��� � � ���������������������s���_���K���8���'�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+D:W "4 .BOp ���I���^��($?mJezq��������������������������������������������������� DP>F.5GNYhY|�������������������}�z�y���{���~������8Y ������z�p�f  � �� �� � �� ���� �� ������������������x���e���R���>���,��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #6 Wt ,X7R����5���I���^���r�2=<ai ��������������������������������������������������<7AM0<DGWh`v ���������������|�u�p�m��m���p���u���{�������~�t�i�^�U � � � �� ���� ��� � �������������������}���k���X���D���2���"������ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6uOyv !(%6�z���#���5���I���^���r��� :XRu$���������������������������������������������������$@O6D=<L`bx ���������������x�n�g�b�`��a���f���k���r���y��~����y�p�e�Y�O��G  � � � ���� ���� � � ���������������������q���^���K���7���'���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5\ZZ ��� ������#���5���H���]���r������$Ch([������������������������������������������|���y���x���z�52?P89Se_p$���������������v�j�`�X��T���S���V���[���b���i��p�u�x�w�s�l�b�W�L��C � �� � �� ����� �� ����������������������w���e���Q���>���,��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4U\5d ������ ������#���4���H���]���q�������2/c{ >j����������������������������������|���s���l���h���g���h���l�=B67P_Yk ����������������v�h�\��Q��J���F���G���J���P���X���`�f�k�m�l�g�`�V�K�B��;  � � ��� ������ � �������������������}���k���X���D���1���"������ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.FT ������ ������"���3���G���\���p���������LaPz�����������������������������{���o���d���\���V���T���U���Y���`<6;;LXPf �����������������w�i�[��M��C���<���:���;���@���G���N�V�]�a�c�a�]�U�L�B��: � � � � �� ����� ����������������������q���^���J���7���&�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7M5b ������ ������!���1���E���Z���n������������>.K���������������������������q��c��V���L���E���B���B���F���L/(<FOSFd���x�����������������y�k�\��L���?���6���0���/���1���6���=���E���M��S�X�Y�W�S�L�C��;��5�� � � � � � ���� � �����������������������w���e���Q���>���,��������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=O*��������� ���������/���B���W���k���}����������09 ����������������������x�h�Y���J���>���6���1���1���4���:�=GOW*C ���g���p���y������������{�n�^��N���>���2���)���%���%���(���.���5���=��D�J�N�P�N�J�C��;��4�� � � � ���� � � �����������������������}���k���X���D���1���"������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/> ���������� ���������,���?���S���g���y������������������������������������q�a��P��A���3���*���$���#���%���) ;BOe ���U���`���k���u���~�������}�q�b��P���?���1���&������������!���'���.���5���<�B�F�G�E�A��:��3���- �� ���    ������������������������q���^���J���7���&������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������)���;���N���b���t���������������������������������y�l�\��K���:���,���"�������������HY!.���9���C���O���[���g���s���|����~�t�e��T��B���1���$������������������!���(���/���6��;��>��>��<��7���0���*���' � � �������t���������������������������������������w���e���Q���=���,��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%���6���I���\���o���~����������������������������|�t�g�X��G��7���(������������������"-���!���)���3���>���K���Y���f���r���{����}�u�h�W��E���3���$������������������������"���)���/��4��6��5���1���,���&���" ����Y���j���z������������������������������������|���k��W���C���1���!������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������!���0���B���U���h���w���������������������|���y���w��w�v�s�m�c�V��F��5���&��������� ��� ��� ��� ������������%���0���=���K���Z���h���s���z�{�v�j��Z��H���6���&��������� ��� ��� ���������������$���(���+���,���*���&���!������������$���/���=���N���_���p��������������������������������������q��^���J���6���&������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ���������+���<���N���`���o���y���������|���w���q���l���h���g�h�i�i�e�^�S��D��5���&��������� ������������ ��� ���������$���0���?���N���^���k��t�x�t�k��\��J���8���'��������� ������������ ���������������!���"���!���������������������&���3���C���T���f���v�����������������������������������v��c���O���<���*��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&���5���G���W���e���o���s���s���n���g���`���Z���W���V��X�[�]�]�X�O�C��4���&��������� ������������������ ���������%���3���C���S��b��m�s�r�j�]��L���:���)��������� ��������������� ��� ���������������������������������������)���8���I���[���l���|��������������������������������z��h���T���@���.��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ������!���/���?���O���[���d���g���e���_���W���N���H���E���E���G���L��Q�S�Q�K�@��3���&��������� ��������������������� ���������*���9���I��X��e�m�n�h�\��L���:���)��������� ��������������������� ��� ������������������ ��� ��� ���������!���.���>���P���b���s��������������������������������}��l��X���D���2���!������ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ���������)���8���F���Q���X���Z���W���P���G���>���8���4���5���8���>���D�H�H�D��<���1���%��������� ������������������������������"���0���?���O�\�e�h�d�Y��J���9���)��������� ��������������������������� ��� ��� ��� ��� ������������ ���������%���4���E���W���i���y�����������������������������~��m��Z���G���4���#������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$���1���=���G���L���M���I���A���8���/���)���&���'���*���0���7���<���?��<���6���-���"��������� �������������������������� ���������(���7���F���S�]�a�^�U��G���7���(����������������������������������������������������������������� ���������+���;���M���_���p�����������������������������|���l��Z���G���5���$������ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������*���4���=���A���@���;���4���+���#���������������%���+���1���4���4���/���(������������������������������������������ ������!���.���=��J�T�X�W�O��B���3���%���������������������������������������������������������������������������#���1���B���T���e���u��������������������������w���h���W���E���3���$������ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������#���,���3���6���5���0���(��� ���������������������!���&���*���*���'���!��������� ���������������������������������� ���������'���4��@�J�O�N�G���<���.���!������ ����������������������������������������������������������������� ���������)���8���I���Z���j���w���������������������y���n���a���Q���@���0���"������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$���)���+���*���%������������ ��� ��� ��������������� ��� ��������������� ������������������������������������� ������ ���+���7���?�D�C���=���4���(��������� ����������������������������������������������������������������������������� ������ ���.���=���M���]���j���t���z���}���|���y���t���l���b���U���H���9���+��������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������ ���!��� ������������ ������������ ��� ������������������������ ���������������������������������������� ���������#���-���5���9���8���3���+���!��������� ������������������������������������������������������������������������������ ���������%���2���@���N���[���d���j���l���l���h���c���[���R���H���<���0���$��������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������ ��������������������� ��� ��������������� ������������������������������������������������ ���������$���*���-���-���)���"��������� ������������������������������������������������������������������������������������� ���������'���4���@���J���S���X���Z���Y���U���P���I���A���9���/���%��������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ������������������ ������������������������������ ��� ��� ��� ��������������������������������������������������� ������������ ���"���"��������������� ���������������������������������������������������������������������������������������� ���������'���1���:���A���E���F���E���B���=���7���1���*���#������������ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ��� ��� ��� ������������������������������������������������������������������������������������������������� ��������������������������� ��������������������������������������������������������������������������������������������� ������������$���+���0���3���4���2���/���+���'���"��������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ��������������� ��� ���������������������������������������������������������������������������������������������������� ���������������!���#���$���"��� ������������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ��� ��� ����������������������������������������������������������������������������������������������������������������� ������������������������������ ��� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��� ��� ��� ��� ��� ��� ��� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/warpsst.vrt�����������������������������������������������������������0000644�0034015�0000144�00000004600�13614004466�020104� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="68" rasterYSize="45" subClass="VRTWarpedDataset"> <GeoTransform> -9.0302711486816406e+01, 1.5466423123725517e-01, 0.0000000000000000e+00, 3.3875526428222656e+01, 0.0000000000000000e+00, -1.5466423123725517e-01</GeoTransform> <VRTRasterBand dataType="Int16" band="1" subClass="VRTWarpedRasterBand"/> <BlockXSize>512</BlockXSize> <BlockYSize>128</BlockYSize> <GDALWarpOptions> <WarpMemoryLimit>6.71089e+07</WarpMemoryLimit> <ResampleAlg>NearestNeighbour</ResampleAlg> <WorkingDataType>Int16</WorkingDataType> <Option name="INIT_DEST">0</Option> <SourceDataset relativeToVRT="1">sstgeo.vrt</SourceDataset> <Transformer> <ApproxTransformer> <MaxError>0.125</MaxError> <BaseTransformer> <GenImgProjTransformer> <SrcGeoLocTransformer> <GeoLocTransformer> <Reversed>0</Reversed> <Metadata> <MDI key="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"]]</MDI> <MDI key="X_DATASET">data/sstgeo.tif</MDI> <MDI key="X_BAND">1</MDI> <MDI key="PIXEL_OFFSET">0</MDI> <MDI key="PIXEL_STEP">1</MDI> <MDI key="Y_DATASET">data/sstgeo.tif</MDI> <MDI key="Y_BAND">2</MDI> <MDI key="LINE_OFFSET">0</MDI> <MDI key="LINE_STEP">1</MDI> </Metadata> </GeoLocTransformer> </SrcGeoLocTransformer> <DstGeoTransform>-90.30271148681641,0.1546642312372552,0,33.87552642822266,0,-0.1546642312372552</DstGeoTransform> <DstInvGeoTransform>583.8629317485302,6.465619051026727,0,219.0262490378758,0,-6.465619051026727</DstInvGeoTransform> </GenImgProjTransformer> </BaseTransformer> </ApproxTransformer> </Transformer> <BandList> <BandMapping src="1" dst="1"/> </BandList> </GDALWarpOptions> </VRTDataset> ��������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/byte.tif.zip����������������������������������������������������������0000644�0034015�0000144�00000001077�13614004466�020121� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PK����VK8C-ͫ������byte.tifUT �cG HUx�}Q=A]E 431;t?8 *` :i&l 749C}cb757=&%V3736V)YtJQpSDX8*`d4hNيjY2Ή#fwдHV`9 - # T`@3^QҋpX+cŴ):īʐ"9n0�oaȺ\2DaUYUN%iQ.p�z^׹MYRJoq㱄zJ8ǤfG|1Lpέ {γqOG)}i~ m9N_O| w-_?n#}}<5kWR\fGv~jw,<ݟxd훗PK����VK8C-ͫ����� �������������byte.tifUT�cGUx��PK������C������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/uint16_3.hdf����������������������������������������������������������0000644�0034015�0000144�00000011032�13614004466�017674� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� j���\��� �� ��� ������ ���<��� &���!��� G������ K���<��� ���!��� ������ ���<� �� ���!�j� �� ���� �� ������+���� ��;���Q� �����7� �����;� �����I� ��G���F�����������<������<���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NCSA HDF Version 4.1 Release 4, December 2000������������������������������������k�{��s�������k��k���k�{�s���s��k�{��s��s��k�{�{�c��{����c��s����{�s��k��s��{�k���s�s�k�s�k���{�{�s���{�s�{�s�{�k�s��k�s��s��������s�s�s�{��{��{��k�k���{������s��{�k��s���c�{�s����k�������c��{�s����c��{���{�s��{��s��{��{�k�s��s�k�s�c�{�c��c�k�{�s��s�{��s���{�{��c�s�c�{��s�s�k���c��c�s�{�k��k�s�k�s�{��{�k�{������{�c��{�k��c�s�{���{�k�{�{�{�k�{�{�{�k��{�{�s�s�Z�k��k�k�k�k�c��{�s���c�{�{�k�{�c�k���k�s�s�k�c��k������k�{�c�c�s�c��c��s��{�c��{����k��Z�k�s�k�Z�c�{�s�s�s�{�{��s��c�����{�k�k�k�s��c�s�c�c�k�s��s�Z�{�s������s��Z�c�s�Z�c�c�k�c��c�k�������{��c�s�{�J�s�c�{�������c������k��{��������{�k�{�k�{�����������s��k�k�k�k�k�s�c�k����������������Values�fakeDim0� DimVal0.1��������������fakeDim0�Dim0.0������������������������Values�fakeDim1� DimVal0.1��������������fakeDim1�Dim0.0������������������������Values�fakeDim2� DimVal0.1��������������fakeDim2�Dim0.0�������������������j� �j� �j� �j� ��j� � � ��j��� �� � �� 3-dimensional Scientific Dataset�Var0.0��������Created with GDAL (http://www.remotesensing.org/gdal/)�������7���7���7�VALUES� Signature�Attr0.0�����������440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000�������I���I���I�VALUES�TransformationMatrix�Attr0.0�����������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"]]�����������VALUES� Projection�Attr0.0��������������� � � � �� uint16_.hdf�CDF0.0���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/2bit_compressed.img���������������������������������������������������0000644�0034015�0000144�00000023307�13614004466�021433� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG�����������W���&���{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.�������[������Z��^���RasterDMS�������������������������������������������������������Edms_State�������������������������������������@������p����������������I������8��������J���������������������������[������8�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������>��{4096:2data,}RasterDMS,.�����������������������root������������������������������������������������������������root������������������������������������[������W������W�����IMGFormatInfo���������������������������������������������������ImgFormatInfo831���������������������������%����W���������Layer_1���������������������������������������������������������Eimg_Layer������������������������������P���P�����@���@���eiYUUUUUUVYeYfVYUUUfVUVefiUeVUUUeZiUeUUUUeVUZefiUUUUUfVifVjUUUUfZUUUeffeUYUUeUVVUUeUYUVeZUUjYVZUYeUiVYUVUYUeZVZUiUeVjUYYZVfUUViZZjUVUeUffUUe﫮YUjUfjUUjUUUꪪjUUVUZUꪪjiU꿫Zfj翪jZjjjj^jگڪjjZꪪjꯪYZUieUifVfjZjikojziZꪪUj꺦VYfff릩iYji^ZYjjjiVZYkYUUfZejjUUYfYeZUUVYZeUZZyiYeUVVjiYUUYUZjUUeUfEZUiYzUUZijeEUUUjjjUUUUZUjUUUjUY�������� 0 0000000000000 0 0 0 0 0 00 0 00000 000000 0 0 00 0000 000 0 000 0 0 0000000000000 0������������������������������������������������������������������������                L��������������������������������������V���d���0 0 00 00 0 00 0 00000 L0����������������!����[��������\��ProjectionX�����������������������������������������������������Eprj_MapProjection842������������������� �����PE_COORDSYS�N�����{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,coordSys,}PE_COORDSYS,.����������PROJCS["NAD_1927_UTM_Zone_11N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_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]]������PE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"����[������`"��u���Map_Info��������������������������������������������������������Eprj_MapInfo�������������������������������h"��NAD_1927_UTM_Zone_11N����"������A����LA���"������0A����{LA���"��������N@������N@���"��meters�����!��[��/$��U#�����Projection������������������������������������������������������Eprj_ProParameters��������������������������������������k#��UTM� ������{#��������������������������������?�������������������������������������������������������������������������������������������#�� ���$��Clarke 1866�TXA333?XA^s{?TXA��������"������$��c���Datum�����������������������������������������������������������Eprj_Datum���������������������������������$��NAD27�����$���������������������������������������������������������� ���%��nadcon.dat�Area�����[��W��%��%�����GDAL_MetaData���������������������������������������������������Edsc_Table���������������������������������9&������%������&�����#Bin_Function#��������������������������������������������������Edsc_BinFunction���������������������������������������������������������%��%������&�����AREA_OR_POINT���������������������������������������������������Edsc_Column��������������������������������%�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/oddsize_1bit2b.tif����������������������������������������������������0000644�0034015�0000144�00000005634�13614004466�021164� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*� �� <0������0 ?<030����?3? <� ���3 <� 3�3��� �? <�����<??303����??��� ?0 �0��3?� 3��� �0 3� ��?03?? 0�0 �<0����<=��0� ���?<�<� ?����?<�300��3?<?�� ?��� ?�0�?�?�?��??������?�<�?�<?�30??�???????��0?�??3�???��0�?��� ?���<???�030 ?�3?�0 0���??�<�<<� �??�??�< �<???0�? ??��< ?<?<<?0< <?<<?<0< 3?3?? ??�3<0??<=0<?? 0?0?<0?00�� ?����030 ??��?��?03� �?<<?<????�0 �<??�<0�3�0�?3?3�?� �?<?�33�<3?? 0?��<??? ���� ?���������0� �?� � ���00 ???�< 00?�����3�???�0��?0��3??������� ����� �0?�� ��?�����3���0���3�����?� 0?�����0��?�������?�<?���3��???���� �� 0???���0�00�??� ��<��<?�0�3<< <�����<?��� <����< ����<0< 3 ����� ?0?0 �����������0����<����� <��0??�3������ 0�3?<���<�� � ��? ���<������ ��?� 3���=���?<����< � �����0���000 0��������0�?�� <<������00����������0?<��00������� �� ��<��0�0�� �0 0�?������?������ ��������c�������c�����������������������������������������c������� ���������R��������S������ ���� �� ���� ��� ���@ ������ ���r��� ������<GDALMetadata> <Item name="NBITS" sample="0">1</Item> <Item name="NBITS" sample="1">1</Item> </GDALMetadata> �������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|�����������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/flt_min.tif�����������������������������������������������������������0000644�0034015�0000144�00000000446�13614004466�020004� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*������������������������ ���������������������������������������������������S������� ������� ������������������1.17549435082228751e-38�������?������?�����������������������������������������������������������������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/cint32.vrt������������������������������������������������������������0000644�0034015�0000144�00000002533�13614004466�017506� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="20" rasterYSize="20"> <SRS>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"]]</SRS> <GeoTransform> 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01</GeoTransform> <VRTRasterBand dataType="CInt32" band="1"> <ColorInterp>Gray</ColorInterp> <SimpleSource> <SourceFilename relativeToVRT="1">cint32.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> </VRTRasterBand> </VRTDataset> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/byte_lerc.tif���������������������������������������������������������0000644�0034015�0000144�00000001355�13614004466�020324� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*�������������������������������G�������������z��������������������s���������S������� ������� �������� ���������^��������������������������N@������N@������������������������������������@A����̞LA������������������������������#� ���Wh ���)#NAD27 / UTM zone 11N|NAD27|�Lerc2 ���2��������������s�����������?�����R@�����o@����J�������J������ ����������0���0���0���0����������������`���P���p���p������������������������������  `���0_w7G NN}Ƒne;tJJ` tqq$PŨD"#^{vRjlemڶ1]Lu(Zt%Y a n9 2$TPD]!tY �Lܶ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/toomanyblocks_separate.tif��������������������������������������������0000644�0034015�0000144�00000000636�13614004466�023125� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*���� �������������������������������������������������B�������C�������D�������E�������S�����������s�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/small_ov.img����������������������������������������������������������0000644�0034015�0000144�00000051456�13614004466�020171� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������EHFA_HEADER_TAG�����������I@���&���{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.�?������MA������Z��P���RasterDMS�������������������������������������������������������Edms_State�������������������������������������0�������p������������������������/������������������������k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{ksss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{s{ksc{skscZk{cs{Zcccc{kskk{kssk{Zsŭc{sc{{ssckk{ckkcsccZcsZss{{{sν{s{{kssksc{cck{kcccsZ{sksskss{s{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{ccs{kksks{{k{kskscskkssks{{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{k{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{c{{k{ckksskckZ{ksss{ss{ksssk{ccsccs{c{ssc{kkcs{s{{skk{֜ŽkZkskZc{sss{{sc{kckk{{ssŵ{{νΜ凜{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{潭sZcsZcckccksZs{skskssֵŭΜΜ{cs{Jsc{ckkskksŽ{εŵν΄k{{k{k{RccZŭŜΥε浌ŭ{{skkkkksckZsccέޭ޵ֵ֥s{sZcsZkccZckcc{ε朔ŭŽŵk{{{kcRkkkcckŭŭ֥ޜZckcRss޽業{Z{k{ŽŭŌŭc{{{{sR{֜{s{{{{{{Zc楜{έ{c{εkΥsks{{֔ŔskޜŔs{ﭥ{֔{{ťs{Z{ŵŵŌťŽŌ{{ssŌsνť挥ť{ν{潔޽朔Υ{攔ք{Rkŵޔsks{ZŽ楔ޭs歔ť{k{kscsc{ť֜{J{c{Rcs{kΥέŔťŵskk{skscRcJk{sέ{Ŝ֌޽έk{{Rk{kZ{Rťŭνks{sskck{ֵŜsZŭkss{{s{c{ŌޥŜsk歜֜{{Ŝ{s{k{{ckkŜ浌c潥ޔޔs{s{c{ks{s{s{εέ{{ssss{{kskkュ{ssތkckckcsksks{{ss{{Ό{sŽ歄ksckkk{{{{sks{{ťck{޵޽kksssssc{kc{ccsބŌcsޥŭssR{c{sZks{ss{kcs{kZ{ޔޔkޥ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνksRssssk{{sksc{{kRBνŽ{{ťŭ޵JkJ{kRZksRkkss֭kcŜksέZk:ccRs{kskkscΥŌc{s{ŽBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭ{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭cscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵ZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νs凜sŜŌֵέ֭֭޵Ŝέ極ޭs{Ŕεޭޥ޽ΥŽŽέ֭ΔŵޥֽνŭŔssΔέńBΥννΜνť΄Όk{ccť{ŵֽŜΔŽޜZkŭ{挌ﭜŜޜޭΔﵔťsޥ֥΄Ōc{ŔŭŌΜŔ{Rcֵ֌{֜Zֽ楌ΜΥsέέ{֔極{ε֔ť{kέ޽{ޥΥŔε{Δ楥ޥŜŭΜŜ{ֵ֥޽Žŭޥεk朔{ŽֽεΔŽŵ֥ťޭŜ歭{ﭵkŽŭŌkŭsν楜sΌŔ޽ŭε֥ťs֭Μks֥{{ޭΔ{Ό|ޭŵ{Ŝ{ޭތΥ֥ŭŵŵΜ֭ŽŌޭ֔Ŝ{ޔνŌέބεޔֽŵŜ֥έkޔŽťΌֵťsֵޥֽs{֥ŵֽΜŽΔΜތ΄省ΜΜ֭Ō攜ޥεޭńŽ֭ŵŔ{Ό޽֭ŵ֭sֵŔ޵ֽŵ޵޽֔ŽεŵεŽŜֽŭ֌ތνŭεﭽ掠έc{kޜs歜ťένΜsk{s޽{{攥Δޭޥ{kέֵŵΜŌέŭ޵քΜ֔εŵεJkքŵޭ歵޽s֭{{{sֽŽŭsνޥs{{s֔{{ŵֵŌ{ֵֵŌޜֵ攔ŭŜﭵﵜ{΄֜ޔέŽέ{έޥޭΔ޵޵{{ΔŔֽŔŵ{޽ńքs֭kޜ歭޵ťֽΜ֭潽޽ŭޭ{sֽŵŔνޥΥ֭֜έ޽έΥ޽֜ŔνŌŽ{έ޽֜ޔք{νŔŭ{ޜ{ť歵s{έŔ޵{ŔޥΔ޵քkŭνֵŭsŵ{ֽνŵε{ޔބ{Žޜ{֜ޔΌέksέskﵽń1skń{{sΌŭ﵌֭Όscޥ޵sZBcťkc֔s{{kcń樂c֜ťŽŵ潭Z{{֥ťs{cޭsޭŜέkε֥ŭεέsck{ν֌sν����������������������������������������������������޵ť����������������������������������������������������ތ{{����������������������������������������������������sΜ����������������������������������������������������楌����������������������������������������������������ֵ����������������������������������������������������{{����������������������������������������������������s����������������������������������������������������{k����������������������������������������������������Ō����������������������������������������������������΄֌sk����������������������������������������������������{{k����������������������������������������������������sńk����������������������������������������������������{{έ����������������������������������������������������֥����������������������������������������������������ֵ����������������������������������������������������Ŝcsks����������������������������������������������������{s{ssc����������������������������������������������������s{{{{{����������������������������������������������������{sk����������������������������������������������������sk����������������������������������������������������攥����������������������������������������������������ŭs{����������������������������������������������������ބΜ��������������������������������������������������������������������������������������������������������Υ����������������������������������������������������ΥΥ����������������������������������������������������ΌcΥs����������������������������������������������������νΥ{����������������������������������������������������֭����������������������������������������������������ν挭����������������������������������������������������ֵ����������������������������������������������������ν��������������������������������������������������������������������������������������������������������Ž����������������������������������������������������քΜ����������������������������������������������������Ž����������������������������������������������������Υ����������������������������������������������������έֵ����������������������������������������������������オν��������������������������������������������������������������������������������������������������������޵����������������������������������������������������{֌������������������������������������������������������������������������������������������������������������������������������������������������������������ﭜ����������������������������������������������������ބ����������������������������������������������������極Υ����������������������������������������������������޽����������������������������������������������������ks����������������������������������������������������k{{����������������������������������������������������{kΥ����������������������������������������������������޵��������������������������������������������������������������������������������������������������������kŭ����������������������������������������������������ŭν����������������������������������������������������Ž����������������������������������������������������ތ����������������������������������������������������Μŵ����������������������������������������������������Ž����������������������������������������������������ﵽ֌Ŝ����������������������������������������������������޽����������������������������������������������������ŭ֭����������������������������������������������������{Ž����������������������������������������������������A����MA������*@�����Ehfa_Layer������������������������������������������������������Ehfa_Layer��������������������������������0@��{4096:cdata,}RasterDMS,.�������������@����������root������������������������������������������������������������root������������������������������������MA������I@������IA�����IMGFormatInfo���������������������������������������������������ImgFormatInfo831�������������������������0��E��@��I@����A�����Layer_1���������������������������������������������������������Eimg_Layer���������������������������������@�����@���@���B��?��MA������aB��t���Map_Info��������������������������������������������������������Eprj_MapInfo�������������������������������iB��NAD27 / UTM zone 11N����B������A����LA���B������iA����[LA���B��������N@������N@���B��meters�F��A��MA��/D��UC�����Projection������������������������������������������������������Eprj_ProParameters��������������������������������������kC��UTM� ������{C��������������������������������?�������������������������������������������������������������������������������������������C�� ���D��Clarke 1866�TXA333?XA^s{?TXA��������B������D��c���Datum�����������������������������������������������������������Eprj_Datum���������������������������������D��NAD27�����D���������������������������������������������������������� ���E��nadcon.dat�Area�����MA��I@��E��E�����GDAL_MetaData���������������������������������������������������Edsc_Table���������������������������������9F������E������F�����#Bin_Function#��������������������������������������������������Edsc_BinFunction���������������������������������������������������������E��E������F�����AREA_OR_POINT���������������������������������������������������Edsc_Column��������������������������������E����������B��MA������GG�� ��RRDNamesList����������������������������������������������������Eimg_RRDNamesList��������������������������OG��IMAGINE 2X2 Resampling����nG�����vG��small.rrd(:Layer_1:_ss_2_)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/byte.raw��������������������������������������������������������������0000644�0034015�0000144�00000000620�13614004466�017320� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������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{skkkkksck����������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/packbits-not-enough-data.tif������������������������������������������0000644�0034015�0000144�00000002076�13614004466�023145� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*� �����������!������������:�����������IIield�� ���� �����������II*����?P8$ ƒ�*P�D‰DcH#5-!2��� ���>����F����1�������������~��!������������:�����������IIield�� ������ ���>����FťX#���A>Rؤ[͂U*o-yl0-[%P /.(-Sx�L ������ ������� ���>����FGTIFF_RAW:���������� ����������������������:�����������IIield�� ������FťX#���A>Rؤ[͂U*o-yl0-[%P /.(-Sx�L ������ �����������������������������!���� �����������(�������)�����@� ��������(��foo.�tif����H�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/pixfun_imag_r.vrt�����������������������������������������������������0000644�0034015�0000144�00000001060�13614004466�021225� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<VRTDataset rasterXSize="20" rasterYSize="20"> <VRTRasterBand dataType="Float32" band="1" subClass="VRTDerivedRasterBand"> <Description>Imaginary part</Description> <PixelFunctionType>imag</PixelFunctionType> <SourceTransferType>Float32</SourceTransferType> <SimpleSource> <SourceFilename relativeToVRT="1">float32.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="20" ySize="20"/> <DstRect xOff="0" yOff="0" xSize="20" ySize="20"/> </SimpleSource> </VRTRasterBand> </VRTDataset> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/spaf27_markedcorrect.tif����������������������������������������������0000644�0034015�0000144�00000001650�13614004466�022361� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������II*��������������������������������������������������������������������������S������� ������� ��������P����� �������"���������Pō[Lph@nQfLh@��������������������������������˶8AY[#A����������������������������������# �� �� ����� ��� ��� ���� ���+# �� �� �� ��� �� ��ZUUUU@@�����] @@@DDDDd@@����>A��������Uuor@TXANAD27 / California zone VI|NAD27|�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{skkkkksck����������������������������������������������������������������������������������������gdalautotest-3.0.4/gcore/data/doctype.xml�����������������������������������������������������������0000644�0034015�0000144�00000001232�13614005317�020027� 0����������������������������������������������������������������������������������������������������ustar �rouault�������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Sample XML document to test reading complex DOCTYPE element. --> <!-- The XML document type declaration contains or points to markup declarations that provide a grammar for a class of documents. --> <!DOCTYPE chapter [ <!ELEMENT chapter (title,para+)> <!ELEMENT title (#PCDATA)> <!ELEMENT para (#PCDATA)> ]> <chapter><title>Chapter 1 More unexpert, I boast not: them let those Contrive who need, or when they need, not now. For while they sit contriving, shall the rest, Millions that stand in Arms, and longing wait gdalautotest-3.0.4/gcore/data/bug4468.tif0000644003401500001440000000205413614004466017454 0ustar rouaultusersII*xWn@=nJ]t% D fg Z)R"?u`=o@{Dza;玁Ll]iD8ȵ;@{)0=m)l3`EK,M>--8JZ`XngVmöx͟ZG߱-E=u?d~^-b~ʟW~X#âISӍXec7a2`m?`RtRZlS.lnƖ28mׁOԘ*RB%0]19-lpr|! x=5jBb7¶}U ڻMkɘmT9 [ܹ}Urũ .e4jg "g*]|՚j!_])6G*'}fKueeʯ+.^.Y¾qngQohr Ns_)$)O JǴ1ɿt_^gFaYZ]\[^cgkhfboVkXLbvvц}wlkn_sRDuvggfXNAWVt6T5sJwKOc_eYe]SEPXtqhU^STmRkC\>YKf(c~"_ym ]wA~ywvaS_]hbq̂]hjjjls^gTCZYIOilFg]_a^[_dehjkkg۵֖Uotȁhc-niP-n,m^YeOOsRshgdbQPHR#a$b[e[[XV_E^^BPlO7t[n{T]N1l#`|CDmNVEL؀kiaQtgg^PzilehmdZ\acHPFiade_Y_eediqu}҉١%Xnt?w{GZ@T4u-nhgoE[7u={W[edcZL[MJ3qnJ\@~OYSS8x;{adZpjN"_yn_F&^x[v_N[ptq͐E?}^uYEvqwqk\k>T`bdbb^ZC\·FZfga[`edbgmt{ϋ}ʊ 7MdSs`lcAO9z6w$emry6tsiǸNgcdecfVdiowbgf`[QFIUZd|`]kXi@{Vqm+c} XtsC Ki@Nm7u[HNr1n=|`s΂݊y^tOY[[[gtcTݠrR8?FvB꘹Eikd\ahc`djsx̬;nK~zʋTWOe^]RBinrlZxX^_efc`cf]T^crbfe`\\\A,l8xKA7vdsgebXXtiMCRC}:zDZYv[EVhjiiBpmރjOX}}[;FW}\U]j\OYc_Zau]xsvxl}qmfgihghhiklmkjgejoljlmpi}_SkǕZywM,ixώH,iajs̡tradgmiuMK]ciy|A_Jabffiovdy)͘搠OKHFsfmFW/rgszd_G6Mf`Z]k[ٛΓ܁~qtxsmkiiijkjjjkihfejov}rhikhjalpL9xvuΎlgv!^xv~|+hGRkpXadefĀܖ|V$a}dKU+jRhGsYcedbcffgxvJʊyw_Eh˳FU.ȳ^\f1ǥYh[IUaZXP_gVΣyûqojjklmlkjjhbp`otЊ`mbgfˆniłP6uKqȃ^HK@}H~=ze]imxcgpa{ב}[Y[hA3uYk[cfme^ZTU6DL)щlhy m-Fi矂~jဌ숲^m\[\TXBl[rĆґdպŭrkjhkonhwhlv[}[MLpʡHjƁ1p0o]b]sVaūplj[|HHCMTyeTpxXojti|[F2oG+kLabc]djg\lQ[vwUK{ro_ªhF̜ȥyxRf͎m|Zjj`ea`SdelnoӣeZw΂jf[fqoddpgÈt\YG:wSqifXN^w{j{Y|zНa]IdHtqrzq|؉cSaCe`d`[bhaBß;ZmtVS+ʾlGw0r]F͒⼈jo[)Efxdomieajswh΢hJP\vͅ܂و~n|g|nr{lŕs4q]:wdCuyyQdYVcyhՀ֍YtPjijt3oMkz>zPqtA~^}^vri=lQdflcX^epҖLѹgg,3ϺǫoCiӷXWWYXXQKVcjnhdebrggւדpĄ؍i{ρtx̀]Vp|oÃoÎބz΃׍zlfrikkvZdnij]LcSkAboƇaۄhi`]_bceeea˂+ɡZHNymq|@vxjtw,^Ft˵˭rVtYsm]wmsX?6rxzzoe`\fiʉa]Z_dipuwNjwǕwnxw|yw{z|`u{͓o}шuɀԉݢkm|~{^Vfo~]isdxhq}>y~ED`nxwpjcYl^fjnqeNocEꦃBҊÄš,(E⬜~ӬӚˉ،圜^`qq~RW~VЃqotpΐyƉف_]\^_fnoox|Л{χہՅ~h|ezlcӁtvʚݍk|\Lt_mppkkDtZyL_[:{nfkmnljdjHc`Rg}xLVFEmks0^eg׉ſtMe\."Fzξ~q՗sfك}orce^lu]`fm\^>yrce^jgR]^]\Yclhdp}҄{ҧxφ݆tʎ܏v˂׉ފߕe|Uvrxhd^prvʀxЀYhZ}Y=|h_PAk^[cif\a3&tbb{xbmo'FޕT񳮞dFyfZ&VZ{WkLyaƃnߡߥ髏̊`r'6mtpQRM^jj¿Z[[[\afgimrwwІwЍp|jg~yy{ԃi^]npjrP}ѩ}~ЀtoONesYX `}?x[a\]fojed4hkfrnhv"Nx2$&A͊UB[Uό]dVFzd^'PeȚq؛w_X7|H*trOoDl9XծlYƨfsy{XYY[___fokhfdkryvϑpɂۓk~sqx~sdp^ehn}dի݀vk]cK_[V[9y0pZ`R[_ishcbibt^R\RubjLĝ[ԊGWƷuso)"ڏde彅f+Fd̏ƹ}ƬtǢkޫyU̟qWiuK\mCl~_m@7QW{߈ρ\\[[\\]bihgffjmeXrodYUoig_VZYgV[\cmcrǗߠRq^dPyE!f2yjFbbic\r|܍dtoRPSEݚ`EI,ץhEؑgd]cBXDž‚z\!ܞFqe&ZQZaffZ̢u住àtѯ[gsQɡ񶒱xpoa_]\Z\^`bcefihhikmnjgda`^dj_RRRQQW]emčr’SHhwduDVRTcUft]G\x`guo_\cSv=|XkVNWXǀf^\̽}h^NFz<ڜ̽r\$tC~Qfի_3k:ӭzƚ—p_|a`Ԙ؝odxP^eb_]Y[]_`abceeedfghfdddcb`_[WVVSSX]dlmmۧ֯aJuƗY]W\`c^V^kYeZP|59h[äxOnil0miMTߘxyяLݟtFsP‡ܽ”ƞ~Щկfu>fxTї{󱠼gSaaRFmbdTdxkeb]Y[Z\^^_abbcfieaeigfeeca^\YXRLT[ckkjzʝښ`e|ɈOqa`gocX[gP|QXT£aaiSm\Tuǵ_YFT]9zkaU}Tjeca]_`baaccccddcccccbbbadfhjiid^_`bdglqtpqwxwu~\{mc\UPcNDWQkpfҍyT7vWoH9$DĆMSXn\_Uf_o4ZDHFȁFxD^p i>x<곭aQmx<]yXVEfkyblͮziwہiedb`abceedddeeedddddcccbcddedcefb]elihihgggffiofrknh`WRvomquJKXM}fiD|HJ?YQ ݛknw;}X`T"}A{裞\ԁpFxll"ێav,rdc΂Ј_D輛Wxltmc{umarāhgdccddegffeffffheeeddddcba``__ac_Zhslddfd]WWVVXmouuzbEV}QXl_MXQwwnsɫT{5zSA#-ЊΑCK ";ۗmS$2׏ww0Uф吾F菬p_Z}k7e-{`[뷴=ٯgDWlkiwihedcddefeefeeeegggffddcccbbaaace_[agc`bccba\W\`lcm|tu[J}7YZmzocԝ~妐D1eCxmo+Lx}}:󲗫koz;DPM`gS}Rq:ăS2=FM{9u_&BᡨDGdӏ`S"dgOOLÔ\7ծC[_cnqvjifedeeeeefeeeegggffffdccccceeeghaZ[[[[^_chlc[bjlCGcQxVq}wJFė}ydR%`˜{W3{ Nµr4?몚l]zTǫwxLrIH YTBCŋXFLp䴋T.ȭ~V+صbDȑрh̸tb|vv=H[\ct́kjifeeeeeeeeeegffffffffccceeeeefgc__]]]^^`bhc]bfoU2mbQUSaZwjoБ{N:եnQ+⾀]9ȩfL%`TwMl[$0|Wk/ոϬ×èvhE=URݩYF_ϧۺǫƝ5N&3qdU1 hGĄPܳtlm^^MtlC-#A'Mo!Gk?hlkjiffeeedddffffffffffeeeeeedefggfedba``^`aeb```tn'TOkClE{OYXdqRҚcmq߽hk>n\o֩s'ؔqطM*b}Z-kve0qsj:hLJpFdGyoL`UآRn-aPi>NFcQlH M|qu 3V%Tyjihfeeeeeddddffffffffffccccbbbccccaa^`achXgdZPOH̀riq{٬ֈjyU}VÖƑhazW{[kˊpI]%!N_(@Yw{Hɰ 䢿֝e^徖[೥Wfq|sJpwFyi]ǃ{.3exvO70$PvCg^^8rqY}|3Vgggdddddeddddffeefffgfdcccbaaaa___]]]`cfsRleRB=@pŤZ;W?tol[~aQ/kE՝w^[3ѩշcَS}tD\q1gX(A]q9wl:ǚƫ|k>̤|l9cgy[oSL8F{c_fintXi|}hƀhmvIeoxmi/xUq\xlH~+JKjStecccccddedddddeeeefggedccbaa__^]\]][\`fjs^gcVJ]N:b|aC4Мc˅gN+yTg@̞vmCc8`3ϰs{akIO z{=RL\h/†r37id}YuWgmRΑxoWvhFVSafkzdh]oVg(CP¡@gjs !;<\Oo9WWRecaabbccdedddddeedefefedcbaa_^]\ZYZ[\]ahnukbbYeTVUq^ωXǑjjLϙxoJpH\}Q经?kNn=xHĊDCYّhᣮŠ]k3QY#{h9j͞{|@!_C~fjhXj^Ffbcebihk_hek^[gWkjķu/g@x2j2jI]sˁbbbbbcccddddddcbdcdefedcabaaa___^^__`cfjpe[cw[}Wy~rs~xM<侒wNb]`k`r[+^M_ٮeVWaDxiu0֘bu=|O^`,ϝǘcᰍ}A"税vao`kbleFplge\]eefhixOm{kgcnjѧc=sG}UPccccccccccddedcbcbdegedbaaaddecccccccbbfl`TdږW"\l`pc^Ҋqm̪bb:ʟDzΚ^i|OyƤƹLj\Se ڈnUh0őWs]Բà벒iQgVzo_^ieFidd_`[gc`]ޗuYZ\fvۧqXNoŁcegdbbcbbbcdedba`bcegeca``ceghijkjhgfechk`UfrsTqR{[Śs}QuНxc1ȚcArEPjg3$,uxR׿Ș|M+Eӆ}s͘|HwEpطm@iKybuhSOdg][F`\f_kcjameVfRfeVk}iĄښ牷̫`\Ndgjfbbbbabcdedba_acegeca_bdfilnptqomjg]^^^]ݤo:Y̎bqQZD_j>d6}JS; ݮټS|JVIBSI!XU!?EEs,gr?МPִ|J#귓aBkN{`hQn[ᛍ◍vlFd[haRKjl`"Fjrsiڹܒ٤׆tɁgdbcedcbbbbbbbccbbdegeddcddeffdXUWZZ\YUTCǛzR~[>əbe[lQ߳Ʊ}zc2zIp?ϟһlyh5+ɿX#"zwPmās綹g\:\Eޓ{`HínXƍwkUu_q`Fsfrkso{||B㕇m`mʁՁНΙꃹ|сjbZahfccebba`bccdeedefghmheb_`bdgb]\\[ZVw-Ƨ_ݤc8ͫ϶jĞsdD:"ݪxa0eNw`/ʲ|LpT*מ[ZU\!Qc?OkZR][$ҟڿƛvc3v_tע~banh7FZK_oY{LsI{idfkw~}eyūՆsƄujegeceffffgec_]`bdfffdchjorlg`\bhpwmb_\m~hGRkrc}_j~TmJwL{b7wZ+p=ϸgƤ|\XD ڂܘ=X(m1⍃Blo{7xFΑDQ⼒iPn`zc˯Z~Fo^U`_zlpPdoE`szŌoDz؈ܧibՉއ݁cgjfbdfgheb`\`bdffeccdhknkigdb`]Z`gec]QȦ}xJFo^qTTʢzmD_wW)մm=d0F)ȭ{mR JњWU&$3z{mzⓇLIVBBkAЧbI\>Ϋ}Uȶ{FZ]O}?m]W^p[wØ߫QcXJf]Czcsʁeggeeeeggecb`abceccbacegjjllmbWZ]eljigyٛswԯ{\_OiPTcZfk|z;am)Wg"o=ەsz4ϋHгpҘmtXB`^9Ǟ|[;Ԩ󻞨FfI^D}i]DeEkd_1~Zӕ׃هʍ٘rob``\`flgabdbcVIQW[_cfhikssw{c_f_g_cZ_Ssf{l،zbMyaˆlbhlHՠzਂ}VެuHgOjJd8YΣtƝmj]l^ZVYnVGTAUvB̸vؓE̸7/6<ಸyZrjPஓfQ2FazVƉeuS~`nd^r^HڒvƹtgfoW\fng`ccccde\RY^dikkhfɇwtisLr[qhlmgvqsvkӊs֓qb=Оv̠vƣvxMexQńbz[uXˁboNŊf汊Ėm]/Șĕ௃Z*oT"|Hri>Lan<اx`^j1|Kch+妤bDeTfti7˜mr[´nޮ]EғpFpIyK~PhAԐt敇䆇|{*е̃smkeh]bfeccddea^[XZ\cgf{DppjpSkVdXf_c`mb]J~b规籊U,slT$ƈsB͛|f>ЕqчhvQǟwݰӟb}LP5ٹr@TWˬyVuoGI^_U_ňҎɆ̈ӿ|Ҏf۞2/XuŰɱu\l:T8ޜFS3ƋgǑkdF}g]J򪛷ipjuzunqb_`acddfggdb_]\]add!¶tyk~lllZbPWHdTiV~ghND&ࣀZ3ͧ|d宭zԛ̏}lxRz\e?wGkuœYp[)ʯ}QRérbS[ZfwKvNAMvMoԘz⊃Q[գN`ݻlősʄhoUFizbhRuc`I_A탋Xq-~dǨxvlv_me[bjhghjfecb_\`ccÌ,dj}Zwekp_fU^MXES;tYٙ{|\kGഋVt}IΜ|vI_5\pOwZzasUjFdMآa~R\ʕנr=4iqֈꛝZObp tߑ`>lWrI͇fd%ҟoe`ڒunUgRF{jk[ˆ}RCXGjQlJUSbjYQ}סvz|ẃ|iUbnlgjljhhfa\^abnj6Ngh}Qucprdqbn_kUqUW9iJ⫊䫉vNi^ИthAǩ܅ocMyemYo[j͌rb!ݢ˱vOu[&Mhԏayx1L.g7i(@T9Emx"pn]}4Im_гrԉQt_dt?vJf@W;lX𘈫FaTYR|zbZochOa=h[mc@wchFǼFl|pόؔns~Q|jjiigfdd^Y\][ǂ(fuMSZm`aud_NiXwaniLX<{>#wZokY@\MWqMqRτhnT{brYjS~dfoPt2rGg9О̔H\Sӣn#%lFsgrhosꕛNQncz*umBUgꞢfeΑ؟ƦqɛhJF~qfdiqgd։zmTtSra~qyK]Yu͞ulwӄہ<ΥvR`kwljhfecba[WX[TwǛae΃yrl[Ȇs城ˌvy_{dʍveOݜ|dqyYdag{Xlji_~_iMcH訊㬍]<_eg[9`dĎ~Ep4:AV(b_)05W}؆pb{≯lSݓ^Krg*^(!qu6|j?F~ppqSfrrՌyiMrZ]:RjdWoiwv[pLTdv%櫥ihb]XQ]j_V\a`d|~adggsrvk̑~|<)vcɈrbLÁnvfqbĂqƄqbLhbFȈjwWkIϐmʊjޞ~{]aBzZxY{[lHdΓnyW%[_Xxr/u>owiZ^hYhdazí_Ѕ]Y䡵Ą~G֕ח\ljhCUȧFr̃xf`޴ͶxQpKޥfxFOSkimi~БۏӲ}yIފkwۋLb_fOJ@S`hR_glQ¡/aZ]NWeah[~jϔ`L禐xc]MԎxoȀz|qxkp{gU>ڒuDŽb夂ňenMŎkuSe}_Áfdžd`{QT(pED">]m|0ڋAɾukɾukhfŲfͷiԹk8;5sNJؗʈˆhםv<ľ]FnW|aŷљȔc4ʄ}g5fSjp~gzԡYk}|~uXY#u~arhipmLkchdhpfב~cy\f˚yңpPjMogˎsuXnOuSߩ򽖳YZnHȓmԞxagvVa‹h[ҫ}Ҝcz>aٌRRǿrTFb=l`s^gAuxLT[!p¼{ʐȐtKFzafGEesA}OPA|btjkqp}ԑJrfYToIzEzFiKpX^MёejsUsjw_xpiU]_pjtls\XaQ]Dԛyפ״ɚj~RqG^5–lS輩YsC~Nək}OիVڤ~_f^lIgAzJkOiXAMT M^Sc܍h|.Պl!Rݐwq`u`nq%'|ft`Xѧ|DeY5wP˞٥hl7 ~}yv}|?g܍݁|PsGq۔~mNu_WGcRdUƂsqe袛us|wsmYlCodcedhe\`MĂetLgŒm͆nwidR|gM8iq]padXf_K<~fܜ|wNث}p;ra'þvl,vc$^˫lטs3nf#vv3MWvߨԟqףisrR\+֎Tc>SӃu_xFH|1\C6rh^z7\fa*ìmy6LE]b0ȂZXFVL…ܤlh?lHғoB᳀i6S{NZfHbovƒuaikU|ekS}arTsTԝz[=w\u]΍wfTwf|mzn\NҌ~э~ՓUBˊplL]9]pBֹo^)r\&ˬwi|KMtU Nyh0Xyb/h7?"sC`Dk^ `K)i] ^xv<Ր|A嘯qd㗷l:Dnؗ鶩oǾfʊLӧs\5l>FglGݰsPB,nb\G0j= LOS0syPu~̥܁Ʉnȃkv[bE{ZfxZ~Q/z㺚ؼpƍw„rxiOAiYnZu`hĆhӑr`fЩVʧ{~T*ҢzmHyRƘplAzN|Qf>lڭWeɓkgi5~ROȍmh*sw8}YhUdt5Ue~ݎIMN柒z7m.HHW?;)kw\l]j뢽Ɗge+g}EL֫ye6rHɈc]F`f.gNSÈcy[u`weSDb經~b{wzIYؿnO.mӦwp_ujN=ڢuˢbEe積X>I-Y:xWjgFmPy^M5qWgLasTqRdF~abhClT'rrKJx]qWÂQa^o&io1Ypp8oWWɓЂ^A.$M{yHVȗj^}UϔoȉeќpFYZLسlӰh{jrmN6qFwV.\wSِkT3ǯҜ%ԇȁyXgFfzYnNϤ}mvpK}zoNz\oT}gߤq`r^w<'x_nQuZfIO4訌E*̒viN͛~sXxb[G`RkXzfr[kSgOmT\C΋r`@lJ"znqBN?^\em7O[>Hs~7WXad[Z}u0GcW㡁zFtRuNsGآz`M:엍vfO<[BdGT4bAs[wZed_^_WmJTDL(1`BCDE:SZ 4  LdIMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $ujj)A[1t@uj \@IMAGINE GeoTIFF Support ERDAS IMAGINE 2016 16.0.0.75 Geocoding information not available Projection Name = Unknown Units = meters GeoTIFF Units = meters|gdalautotest-3.0.4/gcore/data/bigtiff_four_strip_short.tif0000644003401500001440000000050013614004466023450 0ustar rouaultusersII+ <=>?S<=>?gdalautotest-3.0.4/gcore/data/text.txt0000644003401500001440000000067613614004466017402 0ustar rouaultusersLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. gdalautotest-3.0.4/gcore/data/quad-lzw-old-style.tif0000644003401500001440000064250613614004466022043 0ustar rouaultusersMM*B&H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJUF@䏊$X(c$ί0On=tDEt!6%~\z^닥d.C 8oC@t UIl/Ex۸sͻ0",?&I Y.I+j躡;S]{1/ȼ!CK%L^ fRrI8D$L!?W\e`hFFZh[rU]z{[؇~0(4h#Q ` `?@$0s Nqiܽe]jystR|xxix yЕ ]uD  AE$ĒP<8uXTltA^b&|9b%ta&lͩꪬ.H*\ȰÇ#JHŋ3jȱǏ CI2d?>\Ͽ}/= F@D?)YO ^2_NtfOϧ,^I?'L7T?j©HE kJ+L\E*igz+!:*InUNvMѷ Nȓ+_8 5d@ƚ?8㺏@ N云H+z4za%ȟD;KGHHGD~K7߄A0$ sB/DM61$Y$DMrTRVlT^%VflXn5YwYfu!g-r$`QV&[qtB!sdChcBpa!N=?J脋T0f\HFUd`VmlXvX~Y$ #Mn VTuV^馜v駠* GHa@Rx? xy?) #/2d?? 2?K8C4\A?]TÙ5q?h`‘?t웇60 o"6$^b&n)릂n+"..?\k0(?5jS7#N*a+QD|>B zC.b,qFaK3G3=s=,a"ZCb$F_&F92=d|P?CL5RS!8=# QLPrfVH]^T%VfYmcXGt.H??V`E\)_BGc&7X)1FA8]v[V`qgqVrY,y$`]%VT=m_Eth~Gs)( xJ2Y:+bX. 5K'0U [#· 8Ac\4- ̰/6 򰍀5M,Flľ6aO̫J[.Y2Zʐ4Ej,d#fA?x K0/Ph0%@I̓<$@8 y8`%VIyM)VU "X"`>@`}dw }!a(IP"X.Z,Jй;r CRD(qL`VyD'!?e?w"EJpBd.[KB,l8t!:Υe`ІGz`nA̪ZX*>|ZP l9>qTȀ#I z%c1&N DaA<0y$N<`zXZ=z! (ꑆ-ԣ \`:tz={={," r+!{db 鎢 @vYa| xq|" z| C ŷ~b\K+dX8Vt"OP QI`;Af%c Kp$1Iwx!Es&Iw0OsЎ@8;֎,;lȥ;v^,Ya@trG:zЇ5QA#G 4D`Q8HA*V,f:@AaA4Dц@"@Rs8K' C`!'Cp.r7o9ئzNf ,؅ XXp4`sr@! H",8(X>=8`98`QN:@Cя9 w߇"݈Acz > {<$H*\ȰÇ .3jܘqA s:`AD b-n=l$:Feٶ t lfy )wy頧.z餧jz )(Bjhtyqh&3bN Zo߯e!l?hQ[h9SeWQ?0p2r2dNR-ſ܌4(Βt{QHC>I{.J諭>K|H0M%C$N\І<(Q {0=8$!>IXO#&X ?Ztҏ#(J?iҏ3(PA?@y@ IɑI ?,'QNigA pG^=+ ~C p?=(Oc$(Q?N\'t?`|?l!?zǭjȭ aɫɩtϝ; \ۢB#F"?l,OSG$A Bo!&Bo##I#Tn&v> (cE.V젇  ,$l('؃zG=rx)8 |݈6-m63eS9a5>Y5B]S5GY5LYT5QU3U5UUsU5YUU5]UBXՔUYդUZմe[e\֬5w]5{Ys5]SeSX6i65led?Y0R.ղZ+;Se3F0K#gq$ws8gtHwuз=wxWNxgNyW"KH@^9I1)ꗟr)rb FP9d 0:u| 찐;N@x@QB#GQ DD=` {0!&aNC P ȇF7BsJ=p!JCQW)1|`BD($rq4r/ !8CҐ*nBtLJ!x"N=1q }lD$!HG*qVD=dzBΖ0Lgj=!N !04%l6<m@0т\c&xZ5rR P'4" )@GRD)шJ4hTWFVhtsF!ꚈgFZh%oF\1i(N8k^i\1jˠ4`i 05l"0c|FEix[C9Pv7C @SL(A*tqqqq$g C:㠎83C;{>w<{ p((p{ppG}qp , p( ac"s n p A16#CP;bwЀA"уF#(1$`bL= zX'PC HQ4n(=f<|8<9B΋x#\3cb( /b˧D=P& x D5x|H4؈L=@ |~C.p ` 1wHB!SW&Y88"ʇiBڅv"HF"% {&AL*(AW8P7H d5Djh1hH:9FA8(`ꌣ4C)hk3Ҍ0pqfd[aFW17f eF#&/ɧkiF[fĥsq✑f؋3.⌿pkaZi@c 4bK m(?~  c@2bCF/[C9RavbHt\wK  e v_0 `pp`p?ސ?p 0 X ް @ AP  K p307u , `!vp,5`=D` M V ^ eP  nsp |P  )`< 2 "P J`K`G?d>G6 p K 0TeXe] Vgj6ovrgsVuVwVyFP @ @Vf~ 3qpp? 0 D7e0 G  SpWe\0h`@fdfip 7`wВ{ 292y-- G P g@f@ @ 0  @ p 0ӰigFih0cq i$( % M1B#-$ ICC4nH]0RDFHe0#]m01b> g2Xb Ř 1e"`'!P GHQ/a@E9ʐrA+AV(x""UD9; r(E)Ƒ Q NP̂h^PHD2 f(Ґ@1cpɐ:i|`Q ,#cCFƸWG #(Jxj3 DlS:9Nxt*J U(J(*@G'NqP 9P! 4 PZ`C'S(8H6x0H#ĉ HGb,p Xr2hE; v찃/ڱa!B:0 vp"mG uP, ŝr^00|s' :' *nFؐ?!p@F" #,6P!@0p4xPQTa%S! T~(_V~_LbY|q_z@/ҋ"./⋻"/؋// "1X 0r㣓F$Ɛb`Ѕ5 jc`2f$c0: tp-Αr8nA (Fc:p#DC4 @<@3 8΀O3 9:>hf'p31B,wf4jF!fXX3Zo1C/$Nfd*"fH4q;8PL` x,0\a~_0C/%  F,(]P3u2"j`E8Њp?"@!оG+w"#0GUaxQ3E0L " F3 i\@0 !4h(@F *^ ĠQLa$%Kn20e QBiA 8Pyg9Y} @ obCC+@ARB@=/P  'i@iC @ 0}m`z`&ـ\~ ? @`I pS p] ePki r @ÐxP|PPPP0 Pk 8H 5 `  `0 p P @ @ w ʰ  ` ې u MXx4@q`kP {iP | H  836@#P  &WT`Jdt Pep01Gp> ~0o q s u w y { 6`` wh j0PAX  Ҁi  p ՠ ̠̀ ` @ p  0 : ˶ P R Ҷ ٱ 6 qޱ ] _ l r vK        " $ ,*K 0#`"0 + 4 <0t`Xe0 Wp ^q `q kpnp'a ia if ma oa qa sa    )yp h`  p @)p & l`!`` )p &Đ0 -0  5 tDeL I P T  [ -  l0qu |0y {  yWy@fp    03:k` %PT 7`  EP @N @MM>Pf`  ;I;;; ;Y;;;9 z @ U 0 P ` v P P  ۀ P }` P L?.880]4q_ r p0500 0 6 Mq[PppF{"T rрh {`T+T  ؀p ׀@Hc3@ @ `P * 6 dt Pep yc h da ga c h }Yp@{a s s v y 0 0Ґ` !  sh  @ 0Ҁ    ް ڰ~@ C9P =%@)@v 2@q ޱE@`PFǠƀF0K` rd Q f tŰ% oopK@ R T B R B G B R j=qäD D R="JP0= 90 #0 &p 0`@ 8 ? ttꝵ` @ `1 b1 I '1 i1 k1 m1 o1   jSZ G W a 0 \   p + l扴0J0+0 &0  -2P 8`йԙt}@`Iۢ۞gJzЦ@P@     `p 0)t΢ ^ "p< @ pK VZP cg 0r `f0~ցօ`֊`֎`֓ p ` [- @ 0ղ P J @ ݐ P  Ӡ֐ ؐ p ܰ P ߰s @{ 1+p(m` ] g0 r0vp +k @ ܠܤبتp P Xm+`8H*\ȰC5riÆ3QƇ?mCiJ<$i#G&͛8 f`JⰁׇ HDХbA.rp+[?֑LBJk Yh޲y+筝yy 6zmrB (Цڪ묮ʫ/ôp+\ 5EȥK[8_͘4p̘}5b޸m7sSm'k@Y X%īB 7!އx!⍈WRމ|*]!}!D0j|s,xǂ{|gȂ,L% j' ) + - / b1 *b3 J5 j7 9KwE Ђ/* xP.7@p 1-_Ѳ[N5\@,[ŞbiAhR+wG~$H$+R,ɞ ʞ"[͒b-,PK1f&c-p4#"  R&,'Ō0& ҂P/5@K`.? W}uZY˝IKxZe\xƁ]%^%_ "x&adV'hVLVKe\fKf-p0 ld4"*BTb0AɄ2$ al3/L7L xc2p7_, |3ߴ7rHnn !n/6$kS6&hsR'b7$*x 1"L7.p /S1hs,, 6Ψr4\C(` 5`2M7L"ф348m(`|N PFKL7W 1߀u¥!Qv̀G4 #6#eG"\%e"v'x ףd} r+XddE.Xd`Y̠m7 g0`<}1Apb8P$F8C Ax /(`]hpA B  09ĕXOX`QXj[`Xs`qX{E_`XP Ԧ:X,c`XLE,XlFgf1E2 0f X-Z`Ê@5|n04 gpC؆5 n#M9lau֑>!ZIy~q,h=pA 4IMAФ#4?/ @0/ Ax/" ;,Ņ~_lxh# IQuQ/ZPCq GHG !H0R/^(h:8J( x 2P L;h,~X 8`/XwrЊ>O]ŊQVqUeZ [f\EaXq S+F RXT+V[ 0,|Q`8@Š,Z4F nl1*t(`5@U` $@iuŝb'>I_T,QJT(W}qE\0L%jT,0 TL,\Ef :p jMv0 1: a 1nA@B1dlc  .  4Pmx Ͱ ` ˰$M@ 0~Ndg q P r r r r r b pt0!z!!Q! "`"" R"R@#%#@ 2S$ $` 2$$TT2 !"%W( 4p ;` C` Jp S k 'o*lQ R b |X uQ w()0)XxP )*1P* p m+  d  pP   ( @0WJ%!0? (0*@$ 3p :PW Dh8PorH | +؇x؇ Ї ى  ( jZлAub Q D TXQ ː0 P PP ]p P f հ` pLt ՀP }PŀPŅPŊ Ŏ œ p J G :0 ૪@ : Ҡ   0 p Ǹ 0 ̀ ܠ Q 3p P p@ P| ,p =@ w0 L <P e ֐J, ]@ 0 d` Đ@ mr `@ ~΂΅@Ί@Ύp | 0 ͞@  0 @  @ 7 PՐ P&"m1`]peP` sp] {4-4]1@ ӄ Đ0 @ #mAE* #   .0 p 9P` A gD B uR eA zB jA 2 z5 q1 s1 p7 z* xpH1xPY)0PIЩb p 0` 8g @  P { #  0 P @  P5p p ǰs%J D A A Q A A A A 6A &.kO.{ K0 2 c  !K 2 ~!QQQ@"`"" & , 2 4 6Z"#(@ B < F H A I K H%!-%&3 .Y:p ;p B P ` J@ SP`0 [ ׁ" "  |( % + " ؓ" ؁   ( "  P 0 ` P  ` %i  $- Ր!'Q]!PNp7 +' 3` : @@d LpP@P=Ws+b k( X+{ 0PYp r m ` pָ@ֽ  ` ː<0^ @Lp p@t<0 #p[ K@  V ѐ ] d k aáaá1 j j b/ Р:V 0 m Pp ̀ İ  }< p Ȑ p ؓ P p 0  v sp1@@ %@  ?PLC ΀ L iTp р0b` S   `@ P h` ο  u  , ο p o ` ` ǰ }, 5X |l @ p%,nH*\Ȱ X9c MZnԚå-hg@곫_^zӯF~I+S_NxqHѣ`%* $R}pJS(&j rc( F * PNRy{- ^6xDg| 07|(2 K6r-(Ë4M20L110C1c4s.lc0"73)9&H/ <|رB[e 0| 0!I va ,#?p20 e ˀ6Aa!p^F3&,Q`.]p!$x1J E, 9\v0?P<,q]8%*LPb.@]8E#tE,[ʐ0 ڸ7UlKNY r'b b 7p!u,W &QCd!-^(!< Ft/.qOqd 0A)OBW0 b X'P@6.0 d1 dPF5 i2 aF:j x/~%{X gY~XgYE X$UhZU!HIX*)B؂^3 CQ*D DR"Tb Q*dF`F*t G ft"HH*r&"R* f`J*t.K*ԁ2LRK5!+0R1( V0`:A(~P0>t‰Oh4'PNAPC8цv&RUmUx&ZƉF,x 6 lM.,$Zw/8 a&2Z0 h؀B)l@UAdQ#=P h x*ŞJE, " d3PTB@K}a:?09U1OPb0 '4 @bϧ8'XQXfaA)S@)[8 3B,(p +8U| RA")8\ +|\F2dAH8цq$CHʑ = AE;@F%ܝ tw"8Ao`E7m8.a ^TF1bH2ьc #F5 l􂦹c-~X9J t.1\cG l1;ТL ĭ `p#t1@؁3i;M5RY2]L@-[\$nIܢ@C%n1\&p\0D. y"Eo[hhQ8h-X W$8D-lQZF$nVBF7loȂ8J r|"p5DT1 ^`8`Au*PU&v @Q P 0 B~P4@ $  "` -`_2_6@M k n q S au z |  % ' 0Pp QQR  `_0__S Ɛ ` ӰFͣ ɐGs `  uQ.~PePVV``ȨȘ pWW!0!P! X!!pK` R "R $R x"pYPK@ 2B E 6B 8B :B B PPPG2 IB KB PE PPUB PYB [B P_B aB cB eB gB zPRFaL` *[q0. 7" ?  Fp  Sp  bpP i@ s0p zPPP _  P 0  6 #  9 0OH&?p ,p00 4`^ > EH0 RP/-`NF&v#  2p2h 6b`bP`Pp 8 `c 9 <& ! Ȁ 2 I @b R `C 6` !^$ k($ A` _0@` iPP rp`` {`@ @ p @  @  0 S ΐ S|: ߀  p 0 p @ `@| @] ` %` `ʱ @ЧEp Ð0 P Pq: `p$0 P`0 [x0@ h` @ r pP z 0 Я@G ;1 {9 ' Q$ T$    p @   P ߐ `0 Щ@ p P #`U:D a`[p lpU` w@VS` `` { $!4`` P  PEK`5 " "@&) 7 =pzYp nq MP@N01* PpP2p2*i0PpP`k0P P \Y p I My % @s ư ;  ϧ J  p N PU`.@`V ` 0W 2 (W`K % " cP( " "2K v0 ~pY*2  6 8 : < >  C GJ$[%pP%p%٠! _ g {&<: 2 p+ ;P" B` Jp S `P p _ ` fP mp0P vz˂˅ˉ`@ ̖˛`˞ˡP 𼥌6p   " `p , 0 < p7STPN` ): 0@@, 8p0`H@X Q` Yp^p`cgkp@Phkn Ӑ𕝐pp -  i @ 7 hQA? l@j` pPp p`@0 8 00 $& +0 < ep m } pڃpڇڋڐ@ p١PP  P ` p ɰ `   ` PP ` @  ` P3PpPP   7<=@` ` J@NU p @pE PP Zx@ g`  r p { V.V~SPM> p T p  P-   |  p @p  @  @)f=gp]0[0 hpU s0`R {.Q ` {@  0 pS BrG `p* 0  &p 26L@ I0 /9 u! $ C! |!      % '   -    ! ! % o( 6 𥱮@ OD , @ Š ` 00 ` ` / y ٠ P @ Ҡ ~p } 0 0 ˮPPK    e J,O ?9 _ 4~  )ß!" "@"`"KhK 2 %{#< Z GO[O Q YP %%%&ǝP&p&0ȝP&@- 5 7( ?@!` FP N0@ W0 _ 0 e  m  v ~     P 0 @ 0 p D P @ )`  8P? PBcP &E ,6 4*@!c M`Kʖ` ]L Lό0 ` 0 ̋̐̕˙`˝0ˠ͖ͤ ` @ # Đ 1 Π!f}{ ]`SL PP@ ; `2 !@) 'P 2P0ʀ i20 x 0   pP P P @=נ P Ґ 0 ˀ ր `  P `0  @ 0c^ 0pnfP$ P0  ͠ 8 h E   U w/{p D Pp@X * d`  n  {  pE 0 ` T W p  p @p  }}z@ p0 t0 0P0 x  s :(PH*\ȰaA!I|򩌕Oi|r(8鴧I?&44RH@|J1@4 LTQ(bӪOVjʡӧP p,ā%*@II2"D R~D$1H FVnof/wo&錄j/(/,iWHD R9L$h$M;{,2@x ap)f ڵZԦƬ7c.,x\#US_h` 'Kt%-'9^A}A&s̈nj{c!<&& ʐː   Όΐ(GT ]xB&2p 2T `%A0I HD8A$R`@|#b@8F@#rjk!"«#JB% 8 x"A#LH)8$t-Dr$ð@13PD3%  fbBD',I 8hR %@Gфu\Ε؜ t2(0b\*L B-PKbB%L 8C&ixBsr$( LJt"P0:lA x& (dbB %-|` TRPJx-/x ;!'..I;X.'J:N.+2 9.X7-hs 2 5@# -4C5̲ z, Xc0-\XXюZb0:lt稅,A[,G axC, Y0F, X`2\ b`E6"1a& T(NQNE>!|"`%bЄ~s XD)Q4@19ء,xy `cCE1#Ң ޠ.ɃW!G *0B[(`QA@ n J@ } H   0  @  p II@   y ` r 0 k ǀP p P 0P 0 |/tqfxb` \T` eMP U u|IP @_ x 8@ LA ` ` @   phxq@3 p &';B?0pH@`PS0PpP`QQRQQQQQQQZUЍЍaQQQa0W ƨW@ s i `0 f W  0 P ޠ Đ=z` U|Q[F_U B B B R B B B B 6@_)!@]"#_$2 &2 \"""l)#P#^##K @ B G  K y`0% y%%%0 9&g i k m o q ) u - / 'e )BG0>62?(EP"M V_p`f@8`r` i) `p i 0 !P ( 2ǐ ?рӛgHj &cDP 1P7 9 Mq %FiJ`iN0WfZpecViffofy0g}`gsFzgn &hV W V #p Jj 4 & `A 1  zpN pA@ p8 0EHs`#)0t4p]if HD0 j0 00 0     @   P ɰ P P Ұ ʠ ` 7. pB) 80  0y }@K/zp w  m "; = @ F 0~ T Z+ j ?Pz M@` k fj  t  ~pp @H~[ P P W5 00   wp @ np  hP ΰP   ` p 1-h( I[0 ^@ P gJ3I300G j{@N {PPP  `F ෕k 4$ ! #&p04  P? @G`0P S !d/` Oa\pUPp X|ū! I< 0` C̐ @ : : ` 00 ڐ ` p ް ` P ?       BRK!q   MR&b*"0"@ #^^##0_$KGKG]`TSUWY[]aWap&&b KP0'}''- AgP )0F2`;:P0BP'pI@!PR`@[@aP i`0spw0 ~ׂׅ׊p׍P  כ֝ 0 @ճ@p 'P 0pP` ; J2Z>=Q6 'eF@R(\:9@0?0'FKNSW`癞I`i@ iiz:z j j `L  `  2p >ۼ!y pPVP PA p7@ && Z剬`E0 @Q@T@ep| {@  p   Pʪ ݐ ͐  8E `Į0 0 ^ P `  Pc !t j " Ԁ ?` @ؐ INS ܠ 7@i` CP U b ` m0  {p  / Ex P p = ~P p w@  l0 P @0 # s   P ~ ~P:$_ Y`PdpJm FvPD~RpppǞ  o +$ !(` @5pP 0p@?  GpP0PPWi/~Zt  OP` ο  0 Ѐ0 o 0 p P0 p l @ @ @ 0 ` p Q '`   -\ "$&(*f-"@ #^p#KTKUKp@_$ K0%9` Kp p K Kа&&&&'0'`ӈp''ӈQd*0L2 `=72-@E&0M@0 V_ e0p{PPP`` P  #p *0 3@pp >`@ N5P!DlP '!JI <9p2?0)pFPK0!@TWZn rly-{؂0؂P؃p؃q n    "@P .`0P : ۴- Pb%w` pP] @L P@ ㉠2)p#Pㅐbm@n0L>N.P.S.XPpp[^b P׿<@ vP P t0 @ r@ / p  Z  #Bː P  ~:~R%`@~ `p5j0 ` b0ܵ/@ ?P @P Ip @ S pP R ` @ol` \b tc  t  }    c P 0 ` P  @ ນp tp  ` s O R  p ~0 <#pH*\0$h`I% /LI(͑CmCН!1g堕P&B Id=ҴgX5S,MZiJT>4J&U,"Ӧׯ` @AdClڰBH|bР'G??|*d =a. |\s9>].t9F#qt=.,ȫqx>ѕ/|93,Bc,Yivy- ]F:'j8QbM5lU'q|rN0&@GG@% Q$@aJ!lP†%l-l(Æ6lÆ>lĆElMl(Xza#<K PyP ɕP P Py \ \˕P P̕P P͕P Py\ ϕPVji i(D!2A ? PC AH,D 4aR!}|AatG|AhQG{A~\+|Bm"6$ZAɰ|G)k+&1 /51C !H4Q b?L"*H I"J6PH9C  D )\N] [x!jF^r\GN!HՅ8ӎ5I^]Ϧ쬊R H.,01>ŒtfNI0$]0r(D" @ BP2A |!" H " 1]C^8TCE0G DsP(GqX,ƅc_'FdePenp&e~v!!r#f e'! {X*؃+Y(/ AD=Pq{D%1ICї"<,GXQaC$H( h00z HB'@ P,5@akB V.6/(" z2A/eP% La-2ZdvQ L(p-.1X\&TaNE%DI8E&$ JD+шX _F' N/6qc& L#),OXB)FLpDx`y 2(lGS @0$e( @AAC}@PCSqFaDe@@M,,XXb**TL@E%a1 I"L"aDn - A/|A M`a  * YX|ІO9>p|5 lXܐ&ā MCh..QUT%& 0AXh!B|!ĈQAJ,Ҋ"Bh=D+hNҎAla •@3\i 4;\ J @d [":@ cD':@b @EYXt8NE{a`t htFaptFGxt8RG}04b%X"PB a A;n EA>4{ `a !Ѓ@1|@f@Ё<y` AiCx:nĦ%QKHzģCZ0<8`! Y^-| 0X5+w[I=黃j<[)QVMBA;'<܂xX ~!z@A' N(Ap, а V \P[@ @ 5Jp];J DD"DB^Fmp` P p 0  @ `   @ w`@ p 0p ` 0 LLM 1t^FQ@M^ maP`C4n@t2p nv G0 /7 P PG p  0 (SAH}2z@"(y4`wp>v  PEu@P`t@@Y0t0a811m%!!1Ax5#!!!118p0s` @pt0 Pu `vZw0 pPv pΐ x 0 \0 ۠ p Ӏ p` Pĸ s=U?@0000V0000F^_V_aJcSaWc30&f$$$00fa%0%×@BDFHJLNRTVXZ\^_acegikmprtvxz|\ea^\- ~`C:|9 U5@U1Ix*Rwp%pZ@w"`avPPrvu@~00Su` @ P0uP %`pw -p x 5{9{` BD@)?@چ6*`M2`fol=@@}0x-KlPp{@&X zgPikPiniwi{j&iiiPix 0@y ){ 6l< ~ Jh? Ѧt@[0#X`~2)d-D1i;@w0st t0?s`ztzszt?0ys0@t@ @u P d `P ` |B@}DP0l``b@ *X0P@2p E p K`R PP Y @ P>]zk0   0 @@ @ 0 p  p P P []k{`:CK}I^P{ cz@lpy`=zyMyl2y` `z`Y$t &L+@ p  ` B - @Iz3x"ФH0t@@9@s Bqpr X@q` p@mpn@n`nnWn0np ?n n@n y vppq@q Fil q@q@r0 ^|s 0ΰs @PSY ` `  ` ؀ @ p @${ KO_}K;>@ 6 m$}$ rvP}0?P>`&} Alv]TL6Px@={vP3`It,PSs`(0Z`s$ `0r`! jrvzՁՅՊՍՓ՗s "0բԥps H -0up 4@u <`vp Fpw`((}mp`+`~N3}pc?=z7D0x0$U )Upvv#` jcu`@@+J+z033*3z0+>t E J* $P`v )PvP 0pХ0z Lg=A  cL0LV<p'2x vx:v`#p)PjZoW8`t0rP {'Ljlb0n`vy>p pPz>p>pWpښn` `p{p p C `r`SVY[ ?E0C0}}@Cl;`Yp@R 0 FP  S PSp @JpPW0`UE ` Pp  @  ߠ 0` ׻ 0 M@P^~0 >bBNyPJZP*w0@V>Pl,u`;?:P0O Y9p p @  . `PA`JXg@u:r0s  o9PnBl l P@CTpkpd lm^xPk` @Cl` HPm` ɐn p0q P  0 @   P ` ͋0@ "!#K')+-/1OK5K0K`K>RxKBDex ypUy0%)>x/%{_,`wM`5puB@>r96 I0q0RpP+Zp&emi n!rmp zm m` m!0lp #Pn &n` *n .2`p 9q0 B0ps PP xN@_+{Q3x0w@u@5PH u.@Qs@)0Xr%0_cf q]=_qdՃՆՋՎՓpp "Pr0 'r + s` 30pu ;@mpw Qx/q@~0\ `x`ux0j>jWjj>j/  j @k Ώkk@ @l pm膀`VKp ^CBPc|[X/MPyI.P%C EL @LPQQ2%ysr£] %TPEB#2dɖ!M}ET+BR %JJ\|۷ TCq>h#D!شf59,AA i4HdA' PA4\ B̘g8f5fLڀj}"؎jN?Uϩ8J&ւ3 /ȿ&5;Fڇ5DV.x|sLc8Œ8H #h7,4s!sp 6zP3Ae(Ȑ @+ ` [8\71 h R8` t8)ЇAxcKqE'H/A1pb ⢩h+@됁 (C. P^H scd ؀с3 a4;u(P3Ƒi؆!q C#82` b>,2 ` q8f8@l:ˁ΂$, :K#8 Ttt%fY&tHpf&IpH0ˆơu%tv3@A1ȁY ($EX!@ Eel& R3lg  (0>a%0H`=p D 0&a3\fD f(EU n Ba5 kX.xCt 0!6Hl?m BڀV.j QЂ5`aj°.1 gJ7܊CT "UH"h[Qїh FE =Yņ_SJFgQ8`. 2ԁb4@2qP77X n ƲL*@ LC :h ;*phU0B2 P`Dː:2pdp`73|4 "uIpR;b⤉8i#N* ZPz2⢫`*," U2@a2fy!~z#!kЃ4܁bP` X  zʀ"`;{<}@%FA `&Ph`9T q*A9B D` 8`m >p I(P@ a =tc,@V:Nv >c{%Hȃ/Ơ_{ඁ& A T4xhCፆ56@j<EwG Btv Q `? X  ~  }  | D` yW& mA dg FneOd @6c @0bPbNa@ W`_``0g@_ttw _0yxyyy8 tx q q `  b 0a  pb` T 0b !0@d 'P PƐ P` 0ܐ  p }e!l "l@"kKlpZkZkZlh#k#k#l#k#l$l[k@$k`$l \l$k$l$k@\l\l]l%k%dPЃ.>:ՏZ2 jPL:pgBpAf@B3pUXc``dagjpbtpbxa|a6v'* V )Pe +`f 3``ؑg =h@ GOp0qrlqlpNnHҶp_j5 `v#a%a* MendP@8c0>B [X^M Q`P X\0mbP`p`ty8CaJl_q_ q`a؈nXT`p_ L (@asap  h>y>y?w`?0c@=IH` 5V0`1_V_P+P*r^`(P(ʉʎ_0 | ,_ l 4p_0 :ɻ` D ĠXH \shC='0R+jV3hp0FPoB`GPK9d40U dpc- `dg@6tpxp`tt9"}" D )Aa@ 0`Pc 80Y e0 HPg`)@ nFlp9I{gp:P P+;)0a 5``+@L^ UY^``g`\nls@\`+k[ڗ \p 0ؾP^  @` 9tkek@kPhPF0g@`j e@kO_@NpjpgY0!_af@V`g0fQPnfvdwdA@ㅐVKd Y`4@ r 0Ҁ s` Pڐ u P` t@@ s  s m 3~"GTz^20L0JPbl<97O_,0uPzP~́̄PPɑɕ0gkpu wp}00 wp p v `p v @ sp 0p q {>gG0b4"&p^"=[D0[LZ  WY ^~E~XpP_wPYP6Y0pp@ Y o  Y PZ [` ]] "P]   ư} 0|| ۰p zPΠP  ue"% "2EHK@EH5O#c`#7c@E5EDЏ/\dd>ENJwk<_2))q,ݞb{l|I,p1`bPP9`EA^9Rp]`5Z0\1b\Є\[,r[P+zZ*ZP*/[0 | -] 2@\  9^p ?оB`_0 J_ Uؐ qX0.|"Yh0fVP3 epaP;M`R`_`2]P`_ rlp^@|< *^ -^ N 2 Ͳ_p =Ha0 I uB0.vt x eE0cp;pa __$+5^<dA[`M@RY\@_@cp".j`Y/o"OoO /@uY  Z K\\ 0 q?y7iuh@g.J0`cc> a@9).̲u6g@m`ZZPebp_Qk[ Y lPZMD`S0`0S@aUa a '* P  nP @ n  n  n l@~^ 2`EРH*\h0E|YK]F04% -m\lb˝zXl#3LC-l2J'1g:F?L 1M$N#as$s N%.8p% -UnxrSx58  HTC ."Zh1b Zd|bCpH+I$TaU0eA/ A`́*jn1P;gxx/ۗnk)6(THNՠJ+VbEBK\p,4`)!K@d&" 5Z`DF/ Adp_0c0V8(1XÍ:@HčHQXōYō`HƍgܸqHǍx8j`Ċx|e ( ^|_90хFt\H;h!ZXaZԐ3`F YjE-\upELWMW",`H XLb%0dI X|Ҫ(4`qʩ+:dAZ /GlAD3Xt/mpC}@ FyAf@14H MC_PAE?|D]4QEi1]0pAF \!2tE12 "B/"t$,hQIKIȰ)!b,;xa]"10"fÿx T kAe LF7B`=|_t@ ,pqBc*E "lzhYdQXiVDU4` Xk_(P TqUqn[xƇT 'W"5r%aB&( XqJw@xL`.h0 `3B{b x(-!=F2_ 0PaqNC  6/xr ЁFxD4B d&\ȁL@2'| XXC0x `0' _PІ-|AY=\ ~xc X,xA+(M 8b 94a84>k|" x7OH7@d 1 hA3B ` R4-!Y`B0d2Y \ .Br_aW4+ !h6Wȕ%r%1nC1܀un<OD0p aa`'~R E`Q 6"k* La,5IB~ !0 Rp 1<@l g L iP<)lR D 7 t8=hZ V UEhWU/UMDNRII!RhSPa/20aܴ}*@U X0/q`p:@t8nِC9u &b>8q~!` \hq!G\Q@\, AP$.)]ԅ'q!J]E*< sԅ1< es3u!M\XLAU!LMd`P. XP&hH" IЃ V`*tT `T! 1`@9` v8܇# 8"\@Gy1%d@N4(l`R A\+UE" W F` )`!C6n 7XAQ@8D6A  /̀ ^%pF¥-$\M|id! & c ZC2㐫^]⃯+B bD + X'z \6B*pVk!h]Z(F *d,`4HprnCtyVB . @ 8)d* &XA! >Pt =@~* U0B P A`HA HT28  fU x8uJAZ7B*&ʉ~Q EQ("S`Xd#=M7p% a/ BV  1 Ёh!ZN*Ԓj@, X H0 5|a n.a L/ [`_" \ 12D%'jhb e _X / 'PVp ,`V 2`p? y KT;X D`RNU@6@Y S08-0fS+0pS@)0xP|SJ8JEEB8 ?h <(_Ɛsp ipȐ{0000ЅP i Ð i0  g 6  f `pG{Q,J#epUYf* .%00QrP4CpNL0MUNpTM aM` jLtw^`b`00ЋrM H `N pP  QXR@ Jx + 0 a  s` q 0n ߠ mPҰ kx0b92Y@K;̅?AC0G9TFB0I1띘::5hmqpNY) 20N 4PP =)R ~TP QXV@ހ b+QJ=ydP}ZPZp0V\T= Q5 $@(PоP'36 Mb@pCLp=NS0Jp^PaRehI tx}ÃÇÌPPĝPB0I pJp 9 \  $΀L`x;Jg ETD0T ; <$* !#;'BPNM(͍[P_0bPlM`>z~@φ@ϊP Bn:` @Hp閰##P##ŰK@ "\ilo@109N@FK`,VJ,_J@(H&lPH n#P鈀錀핐pI Wa`cP0{~ c _  a @ ap  ` Խ _ .0Q0E)p$$K(09HF `GpE.2_P6i^E8E@ PjE`/ PwDhoDh_hhe_EE ] PF@ @0 󮠧`F `G pHH !p̀`I0 )I i  g Рg@ pe @` d  ap@*/24: 9;='CI 8ݔP$OGSb8}%P^P8=P^P&Q0&P8}&P&PN&FNNp 뼎@T`iSph ,^Nm-,6%@KPEI J@WI)H8f`H5mPNG`4pz0G3p0G`3@H4P7lH 7H0 :I &.I FJ L L Wѐ W ݀ ^ 8ORv`jY,SP3|RpYApNpCЊAM@RLv)`pK@G y}ЀЄ ш0J3іp$pJ MyL K/Mp D`ӿ*xP q-@-P|pVc@ TS P %L4MC}0*0$-3`J`#0!=)I0FHpP`YGpwV/FB[EX} `uz}F X_ X S_ . ` F pG` 'аI'p|S T[01`%0R M0bL1!#e? APJP"LI DOH ?opiG_F` pF p@GHHH0 =IpJpI ΟH*Dh"B䈍#KfF(2%!A"rD#sO"n YH&"^JzY%Hi시f_@Տ/j}ɔ 'd_BRjؗUŖ.hq j2NXj|8ɒ FhE0PQ"4FChr&@ !Y"!HA46,bgZ^hy卖G2^i8ᝀMJ۫h dօ!2 ٥/< )VLf% FL׸P2\>erO32:dPڈ7݀!6`sv; ># >c;>#F>ŎTŎ]cxkJ̱#>l!>.¦#lN%K$D #h衈&hB,"}D1N,D \,QI E>4KAG QMa?QEhC^@D:QEqn CQ{< DR\ȵ0+ C\P':1 DJEBDa/IG #`5tM6]xE]Ň2 4TRF(ENp W4qLT.FB$JHCV;$EHe܀D5 Frp^1~ F6"h7R`%rkr@H+? 1KDIH3u@M\ܢƜ#T@ W0 `DNH0AdGC%d G0p (qC F  EHl`jPF{WĶC|1aVFBm/up}ppx$W eBABASF,C B/>@``0iĠK!A4 P0)0!vL!(DF5XM4@B b ,83B`^D 7+Po  ' 5iz(ܡ>zXMVb5O#zV@'2(4CPaQZ$," E` @ icGP*WyL r+B%  3\ )@W@` @  !@;Ps)l#)hV™XfRІZ< -𡞁'!x:x%N(c HJa-Z0P _da0dqc 8X ` 8 b0' @~p2?B~@ "0@dpr` <b X !DbDWLhWUISL+,.6_tSd,s%4P i`׀q)baE>0 {A4j 0qd A,cYCLB!vH8$FBT UN: # VBw( B:u1!LG8t5d:NF0D#~2BrPM4p+p Ӥp4 ab@ ``a4T%& {4l,(!VAЃ;Br58O sr l,+bʎA& `"@؄#ȧ*X=D- ^N00B6oT HF*hX8) !H& LXA.(YH̒( H*% U-W e(K̪ó><+5B!g5[಄-5!|bC.x*-u:B1pjLB 0F , p@QP10a`' !I$kBV"C `B<&pPH,\ RT3U QmCT;PUTC|#*V>ȄS=TQ NWEbc1TZ1 h3a #AXF X(b P"j TȍYW#rǥk@C P A !% QA,t D_cUn 0m`l{G { 4BpmDb%C CcCAGVf-'0Td@ A` 8 3x B0`c8@hF3@4.N?P'ZP=#b=`BBsЂyЂ|=4(4h---8 -h B &Ipqu WNp0 W` p W p W `@ U@ P U 0 S 6 /6A d$ ?-0?@%9 ԂBE<P`;@Y0;a:@h;( vf};V;P X @@; P0; `@> &А?0 ,?  ^0  \ Ԡ[ 5pۀP UP@E)%=2@2tK0#35Ls411I%71>2[B]2_2R>1Y&Cp&C&C&B`Cp1)'B@'B :`C'B'B'B :caBp9$t`G0)FPbEc@1B@Z9@AP@s5fR >`@ZS^0K`'>98vzp5<0 :Л> 4 ?e ? A XC`%3U? YրV"V P RPs%5M~!`J@jH2%FkDUP; c@k>TAw6tdCVd^pdadffNe@SfUX6[PePe?` 4 :m?P  @0@@ E B L CCP  V0s8\p0 IgF@/fRPDG0 C ?EIU318S;p?$ d#Xg]>4T=_0bp;pnswz~𪒰0;` zE@I0ʉdfhdF'ةqs0v;G=G=G<};~;H~ 15?p躵 a':=4 z0K:'UP9D!b9pzq9P 𷖠3j0 R@t@ T; @ R 0 S0 0 S 0 Q  P0 ʠ Mp \; A0= 5(;)'90 733pY@7psd7`lr6`?6?6?6 \  p0`6 p70 p88 z  : r *<` 1@< X0 PX pV p V @P T P%J=@B ?0@$?]@$HT%?%OGcegikpbeL'?`'?`?'? L (? K0|;̅q0]t{ q &Ab ^@Y F;*:PA,X<i:+k9zςφϊ:: ϗΛ9 >Ʃ; Bη; M ;0 UȠ+S P L l 0%I~Y&3#h0,1y8<@+*Dc>h?p>p??=a e@U9ٚ=8~ׁׄ׉׹i =г?EG?  R AF  R@ M FkP@D@\`APȚM=,10=@07;đA`I;LmV X8:cf@jp8tpwp{P8pp߆pߊpߎÓ@Ø8 ި8 z !@DP: ) , ; mp[@B2=)W?u©62609;+?qI@;SA19z+^;G80:l::::\::L8 k p:Ј@D #9P .pӠ<0 21N+ y5<`bw6a5c P_5@P.^m50}3P0yp~3G3~3@ 5 nP N w|p N>~ n  N  N ` L  K  J0 `l! >0 ; ޛh80-4p6$p!m^.4=4=3>30`02@ hl2PoyP}PPPP@2 043 @6L >Lp05p %`ˀ6 +p8` 2pP8 p@ÐS PS@ ؐR  Pp z D $<@]<@$:<$PNL3RrdOC>˜%<%<)<0&`6 @`@s@7 3 H`8 N070 V̀ Dp M  KPӐ F0a@ F@C<>PZ7p=V<8x:DSW:nP}8;p88  : h CEP`ƀ= 9 I,1.! -Ah?p=# ;PL'-1p8`39=UB7`&`H@6"`RpU`Y]` cPgPkpp50@w4@4 @4wN @P휰5~4@ @p@p5 )`6@ 1pʠ>=5R.R'{?,990o39<U6P'pcL@6 )6@!`Xpdn^b4pܮ.@v4@K4P@44` @4@ ~ 7 / s *  F~ 4pΐϟ )@H&@b5n# !+d 9 TB!`:( .dp1 ;6sEl&Ȧ`bT5%r)UO6%jH"ROӔĔ3%% ɭbHxC̗d8cUd" #K,P@5Dܠ"F-hH!#G=DRJ8p$W.R .Lpp"܌">QDF#=rN?Up! SSv,ݶ:A/0#0c ˤ03+0 3X3 @.DK?P D3@A;N`Nސӄ8,qVU/FqH9f, F  YFEe thvf{Ǜyf,a#oN%or'~' 0㣐F*i @ =|#ȡ k8 5lqCX6E D0AJ4HQ V 1B2C f C=FsC  ƒ ȹ0%r 0;J3b*E3В 01/P4 s ̬5,TPFxW8$ q V 6Ԑ 5hK-0 3 J 2H1 V  J!bA?p 8<CoC0p~(LA(JR  #A+^3*A/\ `X62x0N !` 9 N` 7```7 "5d@!}ChX:D ,Ȧ d0!j8A%{PT"B%P#<I%DI@!Rq b@"0T 2WJI! Xb `|. Z@ $`B*|Y A* CT P,;psPp#)lVšf'  0Ba9!C #"B ~V":a #F0E4 g! -A] !0cBG "``Xp. T= I P!+5/s X&6P⚇bGQ z."`k%؊r"(i k}V`  hA/B`Hu%`1 :.F \` @70aX2fC Ԁ$xG7p~E0#ޔ ȁ %@I4`wD(Yѻ;XB D,]w]0 % ]4@M4Xw49xwN4 4< 5J,a&@/+*_Gl |p6 | 8SP0 h 2Ad)ĠM& Q8 @ha.BZ ?pAGȡ,0?j!ެ4;,./>N|[Zp "`Fp,\%I\ *YA3\kȇ!"#D(8jAp}Ԁ@ĠA{Bg;ؙJ , V<^'׻JH `L_W |YaxUk@V ?`40``*B ~T rф" 3hP ,88asXh zR$ A`C4pB BS%ݖ r):An!1Z#v )pN)WD/a f2cq w=Xe aYD}z1+qLMp  VP`-E X@ .h/fa /}B& + g@\8A .: Z%0 ((SZ-]*B2p `YAx8cB8wJ?%ςRVy,P 1Z.07@LxF5;*'E@(!U(`]&`f`R&88`xЃ|0&B(=h==88 8h 6 3 `h B q BP`` pЅ B ` BP  B  @ 0 @P p ?0 9 a `dh>"+`5u*`(=@)pU)p{pTЂW'p_`'068==HBBBB8BxBB=H = 8 6 p0Ђ&0 p'Y) "p `)` -ӰT֐ـ+!HP[H0 p j`E@ PE @5砅 @P0k0 P$1$0`$0$0%0pLLf%ZdZ$F_0&._dhjlphudxd|hhh{}hBhKUP|I 06b4)30qJj61.P]9, dR4,PNI+IQ*`EZ@*B`(P@@M?ms(`>{00000*p @) 9 y G*@ K* RP+i+ FC A` ?Ȱ}I s ;p08{p `633d0c] ?tU?010P|LK.R6FW`h[ .[e,`d-0hvhhf+=wg ^h, Cvh7-`. N 0 VƠ1@PC @vp * `Pqpg0 3z*-ZQ)0{.|>8f;,7A@+@2{z**@(Wp)%a@)P#i@l@rPv( Z֊%8 h ͪ " &p`(p )) -* 4+ A|31.@fg`0<ԐxР P 6@583!@10G5IE4</*KQF+%JR0FX[0))) ™z(>pyˉr'` f{()>.LX;e* ? =;D ˬP'z@1f -0Z%P,NF5@Q;@?A'P5ϩ]ZL-`X&*P_b0f`%&3$Ps0%`.^< n (@ ޭ% 2`P& c =p ' ct'@@6:0>?( 9'00ܿQTX%)`^bfp$%,n%Np+$ ~ l ) L b .PŶp= p䘞P)$C 0 ! L c0pluy}> > ~ P ;߰p0t0x0{;N. n ݰ ;@ ٰp ; Ր0 9 ΐ 9 ƀ 7 p 5 HN(PL`0"$`70y)- 6!'@@"@"H!R p[c`ptw>~.Y? Y W T . Po M J @! $P À!` 8 , # 3 `" :0P? P> ܠ=  ;֠0 7,0JrLrvK`PbRruVrXrZb\re`Kpdbۏ&&&r[iqrsra9_&a&'%& (&@(&`(%(%(&@+%bU @ -p+b;((͛&p|L%@Q0H#K0Q"`G0Y`"E`@ PB j!(!! !@!`!< A `0" D`"# I "@ M0# T0F`}j~;0@7P ӗP 8@@ 2p 0|e>κ$1)Z;`?@(pN@)3HPX[_0hf@jpЎ m $m$$)A@"D@'M)]%& Q`0& : @=Pp<ޠP 5 -n!P+@nUTP2p5p;?A%Po=#40RP-:X"?+fk!?(p ( ꘰! +P! 2" ?00$p <  !0B0%P.60R@#`0 ?+@+kn"0;;;;?;o;) ꔀ" 5/ 1P|̙(H``,f|C|@C$68 W*l2a @؀ff0Pg~d$D;5 '%frLQ-| 7^鄻gq74XFc#yUOnv٘U.i5x9!, df45c.BBϠAA0DD L0>Xa @Jx 2| lE1:p,p#=$E}wMZ5TtЊG,G "/ L 457|0*"䳃4M<8pN9ذ56S BhL6iP$#@ T@%TCPyKP T|ŗ\Pŗc|yƗk| Ǘs|y||ǗPyȗ,#_V%_n'b)b+0Nv駠$ 40 H&|pG "A kU!B _!@PR| 0\K|`hq]1iAAx Gn ":$^2'E| ʶ`Ģ-N|KP/W|0$ c:N93c =@  @$,\ »)@ $q i 1aB ^$p ?T1Rp",N(!Ip"lQ_BC`"Dm?G4n/uEj}> jZXJT D e0b P~1BǍ0 p 8'$J`CU"B 9l a"_:Ѓ,t U8(t N+$Y0Aed6As=p\ E\B$LpE40 " \  xQ X30  ;z|{8g$< B 0 P(` 4| L J "`DP !@`, >`(|` M3][[ؖT*pK rCءz(: (w#M~D'ЁQHXQ-X0@. d #  0:a(A;Axp-"N+#Ha؁&hT` "i4KÂP0"^:p` ;pЁ-:f@ l :]b 6B{#.Z뚨AU)p;+zY,C/ &xȞAi[S؀t2@S69RGAp$!Rԧ!8 z7~h H ,T#@* L*0(L`U x"PD@ ?Dp```~~ 0P~f0.mrP.`P` .  .` 8  ,` P , Ű + Ơ * 0 &`BR[h0g,&700`-p;(`DP#`L,PPaH^ g0jn@x@{}``  @ W H "`@ 'P#c`0 p 6pԐ < &"4`Z3` 1 01 .[- +P|K;@d^aceN@dik& DfDV'p'XFd{{@d@d`() )p``))@ K[P —` # "%+1:PcVITIdLpVIJH`a`TD`m00C`w 9iB`ppP F`pքp t q #A l i V,P<*p`1 @ 'p &0 0zJ$j0 k l4fcC@e(A6mPm(g٦_0gbdfIj@en@eYZ^`V4A zfp DPt J0P Q wp.@@h`\F*0p (p f2`\8h;@DV sT\F?T=\:b`f6s0w0z@~*500p0 tz r : ?p 0 )J Y֣ڪH>*200BpL0RQ` [  b pkp tx|P 0jߺ: z ٪  J eP*qp*P𰅀PP@*  *P  ) ހ ( ׀@ (@ pʠ & ` % @#a` \`T ie&8@0@@10;) DH@: [a`jзmp{[ ззp@ M " ДP@  bk .0 \ 70Ԡ =P0 .`Z. . Ґ,` +y (0``ZP %%&0&P&p&&pKp[&'P'p'<'P_p_-yeb < |``)0 | $  @! b0r(+b,]`=)1U@I 'L@VJ0]G0e`E m@ tltC ǁDžNJ@ǎ@ǓP n GH I02 G Z Ԣ0-03I }`\Q @ " p hJ.&I_9дdWiyRKM@JwyG`bgjn@``CPz0ώ)Ll\ L FPYbͪi  Tp-z) p`|Ÿ#p-q۴6@U9P<pllP#I`QTY ?PdPgPj`p`tp;0{ՂՇՋՐ` Q B@0Ϫ@m ]pb  `҈؊ؖ!7% ! S ` @H  Rp [cpplPtx}ۀ0@} M  ] =`ip&`q&P`ކ`މ`ލ0ޓ0ޘޝP& `0& P $@ @ $ @ $ ΐ "P ݠ @A/ ]}UP<6&`*54 .? (HP 6 6 P ^ e Zs p{ hPP哠嗠p@  O "0 @ $` ( ,P 8԰ >@ ")`Z) *) p( p&P0p G9blb\&'iBk2;o2q2s2u25y"̉b'P_p__(_` ` )p``)  K-02pP d 4~pRBL(F+6.&4@@UH0QRPL`KIa@Gi`Erw@DPP ` p GPD Ip = N @P W-@yIjD`  ~ *F4bЕ8< `Ź7Q@N@_|eh=n|nq0t|{|ǂLJ@Nj@tL q hL eL) W R0` X0@3 1f@2Pu7;P_p+NY{V@JM9/F6~Fdh? qP?y?@??P [ En_/ U <@Hf (N pAt`0" $`S @4G;> |&grbi'0R :g҉`NDu"̓;BZ's"H\V@"W7v i5@؇m:^ S( Ga$LAÒ8  ``@cƂ0X@H HL(`B" Tx8@fm8{y}7R/I%)ݝRQ+R-%$ 0-(PLr׌ D6!SSB02#22J 37M;"SN<64E)唫E07䰀K8DS,]r]ѥ]ѥ]q]!]ҥ!)r$]Rr%mr'r)r,r" WRi饘6Lh@(4PI,RL|p# l@@5@^0 DXT, DU4@L(Ѕ e @G(І ȁE$G  Ү":$G$p$'J$hXʴD-S(  d.Aa4@- ` pd0"\@ayT)1 gLA]HV@p,P80E`Q |cF8 Qs} |·!w+r Pb'H4I 0+N8 ׵Lр.V8KC j.@ `C p<1jHE[DDQTHQ[8mbP^j @QDvܭ~M/3x?Pm@@)_bEn0 :e 50T@2lBZc An蠆>CĀ,20e`(Al58 mp2h0āCp;8xpA!bPʰpW9>"$x:nBHFqh9:0 qt@/adƸ Hc04 ^dp~` 0C&` H` @ 1 (0JP(U|a%~ "졟g Y~&Ba$Dh {j"(@@R\  r  Pl&Ú͘f4t`j,B&/A`L"pcF ˁux! LpL@N*,AdRΊlR %$`v<)@O SGuv%T70Zav9JY*ya` 4`(. lD  t^%^@, Y` H  xA C @$@ G0@;#F( " ί&( HVB  +Y8@PY`E@ ,`p$*0ELUșxB a.bE,c1@WX,@TMb&nv+J!ڵtA $ ` XHZBb!؂ N0 A z@Qpb"\GTBHV@1.( UPLdZn|6h |6/͑pB*!gMPE1O" (YЎMm  *U0D Ȅ T.HZ! bEw1 FD` @3,h\Ӹ qd:zЍ 82pqd` Ȁ̑)#WHG |a;6Pvl@ @>xlF߃ 0"W'p. ul2ggA Bȃ #XF5. gF0*0\PppL (;!> p@`9za0B  %F,^ y @<9"~"xG}&r ك" OU 0Ahaz\ XA|т|2.ό ;5" ` lxs@  0w0 Pmd-P&&pK`nbpbxUtRvbxBzR0hXXtx( @  `#Zh`R4_@=Z0DpU0L0 Q0UMh"a=Ir`G{ph8?_ ( M  Q 56 [028; @0   Є` 3 Pp+,p 4 [\h5Wp;vK0QpT\WLP_0uHp]G@sw`y^^ I H@S(p_ NY% $u Y`~&@x#0 p,uLP @gW ap^ѥPV33VVV^XP3 V ]p`+l8ٗ~ !L00|P ?  P #@ %  +0 03 `08 P? PGPPM PVP_pepmОr p@Zy i pp ޹ Ppp P I @@ P 0`  p }@ Ѕ`@"@?0@6901B`*J&T@#\za {d {{'gW }  G ]z Z %p@ा KZ H 5ˀ ; )A25z7z9z;z=z?zAzCzEzGz#0z@ n p`P*ZZp+e5@pZDpVM0RyZ`Jn`   + k   ; k( ; z P`P WЮz` @ ȄN ~ }N@p 0`pv'@ZC*FI H0LRVae iP sw{0 [  0 K( * 4m(ɴ0Ю@}3a p ` pM8ժ}@`0x f m=lЈl |k0jއތݑ Bj@H XKlP(`EA,l@_03|``D4&%PqMAl `pSPG9B1(u c *`Ǡ<`1 Cl9cAzP]CuՅ$w\Lm;sJRdWyV]"`X8Ȍ:ӦZ5ڢ% _*I  U|X@(hrc 0a@ PPrf2"Yf@WH~WBI|G z*",/1uL ,47\#k,ێ<@)DiH4|@@#Q hC Ft_P[@D qMP@KV!Z@NFaĵrp'BYx\YEv|!o62 9rq5'hHLĄ@@%Ĉ*]48i7+H``48 9NMp(AP"`6gzGQxL6&NUQOxUpjq[ WUa@(+5+ҢPm[-(S Ȑ5M=`#@'; ’',^m̰(QV0K aZģ (JB( u1O@1iaD$>~ @) g@(5 gXA7o` !C=@ @;x A+ԃ\fԠAR> H%RTF U0%~BRASWt .A_0A47p leÚtP" ;Z%$DXx@u%p ߡP.X !z6C|>, BF'{0NLB;-D:0X-Π4k P@ =B\QK{ݨg@ |6dD10( B 0 {m@;GqABGqm L jD*S`RO-OLMHֳHRV@j́JkBp15+( KrfzBQđmGA| upġm2N E VxV.rѐ'MJ[/b;j a5 \bDѺAt@"|B׈ujh)!ZMRV ŅzK_CL > >d @j9;Tij|Bc@Æ=tpOӇ">!Db=X& }B()ģb- 9t2xf𣆅@ι+4 , Ld4ct׃6\Eglń;E!8VXRVY8QJ`910FQ1&Kj1D'S,iŬja\ܓyAPF Wɰ@pZ" %Θ_dCNτuf#j Cۉ8t c,ζ NYPS*ĊbV.JO#c-Tg8L M9q>s?sAsCsEsFsIpKpMpP0Q0S~U~W~+ ^ .D_]_&FPP4pF8 .UwBqt^U'Z@vf'(eP(jv"r!awg(P(~'I*''p'@''w~[3tX\ye-bTekRzVW.CPzzKbP(gP(k(t`H7w1|p B Yh1 K w'@'+8H*\ȰÇ#JHŋ3jȱǏ CIrc*lrh`0A0|| "+d )VT@]@(8f&ՃZAh MIc/QWMQ**+j-ŵђ2e9Hb h091(!I.A %*XngƮ wA)_ZJc1VRWS nUS[KwqE˟OϿ(w@l@ 4لN5 GL9VP`^\VdtXe XvZXv0 Xt~PU8Eb+X!! hPBeR(NTa1W}]p1ȡZ50ZEE XlwWByr*ꨤjꩨꪬYP#jDh!KIXQUa]`c1 c2"`9֏\"V\%`IX!.FАrbk\!GpRP 'W Ew'X~0Xxh 2!c-2$`= @&]u(W2X*T,KݲR.\08<@-4 Dj+5,bVKqUZlWsD `V `x %]]&6 UDʺK @.`5ѢL-ŰQaA}qZEX/7n1X PIWA`2 F`DKٲ"D/4L˧BUSW}uZѕ]5X%Xݕ#]Mpr'ESLd@yʮ:sqf@ iVY$|,װc˞Mm]b`FeV) s Qx2&S0q4Kꄪq!t1H|[$$DIV(.Q)=M]ܣlbF>O's,Y'uZ'uȂ,X I'$H*\ȰÇ#JHŋ3:D >Pn =J(䐒E@8sɳϟ@$$Q~MH+™[b@1u '`4RGf 2hퟵ{Y+g-g̊)H$B ƹ @'ǺICUJRy˔ަ.6LNlyӝ|y$PD!t:NwrLȓ+_μУK&0@ ;MjȪ^''Q!}B␇<NP/ qc ˄0k\ѨD8 Ja.VB́#h;ds60k8FЄa3bdE@  *R$`j&Vp؂׶Plf϶8Q ^4ta ž\pF >@B@A7тo8bDA AX&MTj8ĹO? 9vG(V @#@!P(C z|L2f:S')Pآ؅#$ HT`P$6I@OzԳ=L{ߺuM|zW`z^߾Tֿ #Fغ&ȉ` : $ڡZ" όi`/}G a&5Dij8F@D3cEP  B*+v&J` (2jz6-ApB۶p a@\@a$`caQX#`D#!1qLDЁud z=@a{bC>Dqam.EFm91O0f x+ZnAH*\ȰÇ#JH&B:dU1.G~A ,c6(Z,fDK+ar-ӌpnӴ&6Qǩ;NIubyާ.> Oh޺IOv箠.nvbl)zV-J)عMǖ6+*&k? njR9NΓljsλgGs7 ;PF4luHLb0F0 |]J) MhaYDB"dQH ޑ` A` la~= Pr$X,t/yT@,#"5M#+xI Lb9&SibD;,'Q|E=aO(f# Gw3 fbf!f2f$a^%' =2(U*蠄j衈&袌6裐HD2G%H$J,Lx %8ēO@ EQdbRM=TqZq `EV=l[me^z]F] cA&'Y.q&ƐhvZjXškFI) \0'7 ݢa;>}3CPG7)߭h$`@zb2DE,t \( h YTrbW,xXup`a!bja[DAT0 ) KA2lЌ!!TЍ$1SɐpN&SmbU'K |Rчk}Ka>1 $Dc>Ob,L'ʼnt3ziLKp^z$b0BH "0=ndž}_    ":9jpPa6TCjР 0,^P V4` X>,pW X!B!`!t&ت]_*0@ Pxe D GHP Ct @ 8ЌC 6nHĭ0WD(#V(@QeG)TW93q@vhGwWޕ (1ScG(V8JUAP=EC 3LBk> :dbz?Љ}b(VF\b8%,LDb`]( S׾e:HH-v@8@h .h.!_402(1AHÂʠ8[i"# Ў ,Th!16Da?1"~I\bHHV\Wyujס3Q~>p/t_c' #Sh<`x!AqȠ`Aq6Xc22 xA/b],XЉXB$@E $!p 2P29V`M,8ZME p`-_qHc#$I Xn "JhG(QD[G)@R`=N!{ajDZĨ/jOtz@E| "7Zm 20c80 |.&YD pnlP, P@,)@8 q){(>)cH{-[ —h!@3!kn p6,w@/7Ad@s#F`H@p 49P`P0 I@ U` `@` k` "jjp"X   8S  @ (0 jP>0q w T 0_@|@S}*\rʎ O|1'ġ}*%8V<ʋk./#IY8MҺa6Q*wlҺ_bGس?O~y˧?=Gz3 ߖHD&c fKD 0;RӅ,1[. H f4SBx2'~ W "8-i b0B]vM.;%JxG-&dڶm}`> %aDc G88dp?A(0C5H h -0 h1*"SH @ &I( H@ &z( cD eP X!u@,Ax[@ Pp ?D1UH|@ & |9($5!IX)TTcs\2̃jG+@Wf㺂h#[/Kr*RTb)v 6&̐F|a?H`t @#K9rX09sa@1bC8rb kEĬ11M0(~aSЅ9\ sBԶ9r sB)! Pc`%ȁ FC G&5~@@DXP2\(Ņ)б4G B6[fʆ4;= ~ . T B@0` z6nCఇ"aYj߼ ֶCXGYV.N0[x+bA"G&n"aQ1 b0FƐ  c!+Yʚ![Cf t7#ZҚ9- >miKћ>^1}"AsqqЀ p2XaFp/2pVSxP(N_&DBKP ~@$` ^BaLЀ&\QQ0G@T`- APbk 7=p F }@P c@ $`  1 p =@` H V _` k0@f ~` gp f _0S3}f f\@]p -G H  S 0'`p P0i  s  | 8 X  @ p 0  p  ` `  YP \p 37z@7@}LZpiKF@~0yΒ ? z` )J4P ؀ ;Ry 5mq:S) ePr'cxr0'sF` P_P Y_a`_@hP^rpv0^ll lYllg gY a a ^ [) Xi P_0 Ov`vq7wu' ,w|w`rYef )p àYwZlyPzzzz3 ^@ Hsr@5gڠbP & ] X0}U @PR M@ K qI~I {n@gbJXR NE`SP<V`30H`a'? J Pð P %`  1 p0 3h B` PP Z H l s y }@P>P P2 \* t v }Lh0pm +0 E ߐ N0 @ Y  b P k  tx| ` 0 ߀ @ J ߰ ` p 0 А @ PP v 460q1| ~f l u/{/~///PP` P  0 !  @ ; 9H*\ȰC#B$Z1e vʼn.Zpj˗0c.TDm4P&Πa248ɁȀ aLc$% @Y𥊂/Y|rK_6ȉkgH3Dx%g7'Lj 0愂w),묲 ;|+HXуi>!p TQ.l4K!u $K9 .<;D@ 9DDԠ.PDRL9TTY`8TJXR/E-lq 2/.yK_r 0IbL B,0x4!Ռ5dp ldCF7 pC!G9qtJCvD@HEXqW"9O>A AY"a>p9rp̀ h.HZ`F`T!/2Z\ 8bŽ $@&pI4`@ !J@r(Ѐ"F H&$X E(S8~'D- /zА x!2 Jx4:A)P7NqT@9\t fw a :04l,[,`%,Z0;d ubp- _C**Bކ`͘`` bӰla3`D50k!X2!hX Ѹq/Xb5΀kkr5찍k衭~hk Z*B$qKubD5! BP4f\CS2 c\¸0~aaȅ5A k8#Ո*1 R\F&, jpFa Рꊀx*آ `GV*X`70TfȆ5 jԠxЍj(o!ʛ6%z⺡*) T$ 7`o,qS$E%q/"p75:/DsP!w @/$#i04 XB/0-ki8.x^/ "∸P_@|1_d(Õ3gєYQ̦6nz g>LrKшHĎvY5eZֳkp:@r8{(Ρ4xtŅ?fa!B! Dap# (!@($pOD@$"0D0D|auA ` ! H,"d ?؀t)6  .0 XZ&&L C@~)@k"37PpBh>aOYXA;jv E3a$I!Fh#aCSH,fqX8X1 p8EpP >C DT dg` UDcː!&HCR4p il6AmL m7!oLߘ"H>#W}'vl@kY!XА.! ^$C04A i@/\HzW P 2 8 ` i 1vJ @ U Рޠ ^ 0 h@0 qp8 z@ Ġ778 P @@5 % 0 C  @p  g 0:pz\ bpbw<< Q33 A #-hdCVd3(?fLcpeR6TfeX@_e_&h!fdgAj&AnFAv1g^Pg^0 qq k g4h ThYh` VhB BG 0CfCCC& 0jBdjEtDI jk`kkȉ` @ p y Pa 2ذ[ &p0T` M J PG@ P D 0C ANYI g`H\ГW@FpKpI@<9P0"0 )d@p 0 p W = Qi@S $6. `ޠ < GP@ Up `` kpr 𛐘 p`0 w  0 ߰ 2psI 4 8sB0{?PP˰f y0 C ͐ Np @ W  ` @ h J xP|PPPP Z    J 5p e @  @ ͐  `X ٠ E p  00 =p ) :qFP` Fp Ȱ` R p \P eiplpsv{+pp{< @0 `Ы P Ш @ p ŀ p 0 ` PP{:)@ PXjFM;ٵI`a{E^|0R 00 p  ՀP Q`ԀV $0N Jp pF @@C   B c?Ksa]0Cp@P@JG@<kn.PS0 4_P ( "  0 P͋0p5bB&>M#7EP-10fqB 0 Pp`p \`c hX; { L , X{ 0  P P @ ʰ `kP01p$4 K > Fp6zH ǀi` XP  J` @D@ ɐؐ P @ݐ X- a`G p@@ x|Ƀɉɍ0 l `ȡ P +  | ِ ` ɐ v Ґ 0 ʐ ƀ ɠ Ā  ՠ b8 ݐ 9@p f` pb>0Z C p NP@@ X" f0 np `  }0 @0"  } z v rP |u p @ ˀ ` ɐ  ΰ `yH*\ȰÁ(e sB/aTcp/ a01 eL̨F,aXء#LQ\0&IL8!$@t,Ip3P`),+\X.;8 ΰQ"(@H4x` h`͈0@@-VB* wu 0'D HЁ& HЁn >A x> j#L &|r"pj _0P/4_|":xsEn p_(7ba@ε& B(E TeFb1mA؁lo} aSe Xp/>p_`#~an  *#Z(0P`8:A`Łhq!DFzakğ( SCG0\Y|p. _`d8)4 j 0ы_p0ı_8' `/RG!(C(\o pB(A &RG'`LpC>(Q}HBLh("P P4P)>P|*q 4B`D#PC0[( !X80 HЈ1 @a %. V PrQZ@1|a_#(6T n|p5*S8A$.`@pQ &GI8bn6/".4U$E4Hm90#M@=AlCHCmyK\GB {_P&1^ؤI/D Bep/d Bg/ *NՀ5`xM|QZf .uK_39gE1T:N& 'ˠ9!'>C}ΩN>=wAхOE>}[/ a(h0 ^(#`4d j"84!i\Ȇ&JXC"C_װ }yupkpfP Ӏ X~S~P Ր@ D  :P40 ]` $ b  PmP@Dp_d IpS0?X@418?+A@+`2K(.Y,PZ%*@b#@#( pp"@'z`"h~ ~H { v s8 +@& k( h 3P, 7Ƞ4` Bp݀` "p L@ W@/ђ `@ h r` z~ { K / @@ ݀   b Ԑѐ P ɐ P  0 ` p   P\` oU" _ 60p <0 GpSp]}p  0 P  @ P| q mspl@g`0sVRN  L LN 0 Vpt`p p ڠ @ ߠ  @` pp߉1 B  r!1`r(EП@/Q 2 P@:s=L**s4`KtXQ1Rg?P" Lt]H^Ibdmhv4j^P9Zwww{wCZ`@ xxa MjKKΰK$Myǰ[ z4zDfz1?4*7.-0]1һ{ }PL`P p i  ` ` /s  @ @ @ P ` 7t ` ! ـ ֆ rrrMr׀ e`` f}P R0 0 G  > ̀'Ā , PG ӫ  PxledpM@Tpl#0<?X<`K8p2p01G+-P)`*`)p^& 'PgtktrP$P:$00߂0߈ލޓtp$ M +)` . - 5Ͱ5@ DAW{0+ i` @Q `'?  6 ? P Rp` [P dZ` r `bbP 唠噠p@夰 P PO/ P R ɵ P 0 @ հ @ 0 @ / 0 @ 0|0 vXF`԰Y@iI = DPP|`p[sjm  p    pm0 pPcp?_yri@`Wb@Pr E A@C P@ G`@ QIy; ʠ7Ð [OP P y 0H*\Ȱ!BZ+ \I4R4.C&%9).@pN<\nBi.Up 5\Prȴӧ SA 4ԄP3,@၌ cv\B" I0R|_"3! 9܉'ȁ"(2#ƒ_Jɰ|*u]q}Q̂b 0fY2>5f8slQ \8J)عMij-na-Zp(#&.Gd1#ԂA` "6Vbhan衆 f߈P tB;r,|s /K50 s 2(/03 4L#*LS5|rM5`c%X#6,!` 66f\Fft [XSP501M4F@M42܀L21c C/|K/rĒ@'p"P{q@Y0PM@ ( ;05 ;C3D . J*@E )h ^p&F &AB qk%1 ;ȼȺP&rb p))JX -" 277XC9<A`,@Fl]ALD+JBA|C+" _D:HN,X F<O,h#2=؁6h h"hCRv%bgu'\5)ĂԬ,b9B, 027M,d3"4T ,$ 70 , :+s ,|fO(2 ,rJ! dB`0$^@h`1bZ0@A < 4` Xa T0@ "dF؀-^A F46 e|b9tt-a ^ȀAl:xHZ@.\tA0H0"&J<b En"4&h.J\b7p! fCBgP*X W 5@Z!e.uK^җ,F0_a8 r`dP/\ f/| `L%HcԨ5lh[&78YNsT:Nwc r<5q nPD91 G?C&M)JWzҖԥ,}iHJKUcG)VWB"/|a `#1A e$P.ьZHF4Ta i6lPڨ$QFl5!W?py5W8U ڰQ/ ؘ1(T#J4f2Q)F0D _t,jSEMg.Dg肬0),L8B ? t5d  Fh @!+ T &@J0 #0[`"([x%¾$ z"8 N1VՅ \Ā42n`i@Q! H@ۦ8R0ZH ( *2Tp` P.H)Wp*UA ,{g{c5@:g|apwP|] }AgMy}}~Nq~_ ~$Tta a OHБ  PPQhQQR# R K {   @  ` 0 @$ ǰ  p ɀ Ԡ `   PQ 0 pN+l@ xPsni 0 ` ѠCK IP @Ӡ ? Ƞ` 3  &   0p p{G{0P`\Q`KPF@ %?:1`:`Dz0P?3@+ H0'T`-+#bPg )!r( p``мP0+P %.p *@07 k KH@R0? pc U  F <  0.Џ+  *@ ]@@ fp<@ sDDD\DD0 ÖÚ` 0 `æ 0 ` 0  @@ p0 p p C+ ް  `$  @  p ps *C@] #D ;ӐM]`@\NfFp= $ y `YX &0a %00?` &`@-  R$@{rfP.^ ,0P%@C0<"060L$`)P_h/t_b.P( ,p '0 :`% K@p {  h @*p . 5xGx7`xPp #&1&#Q + It@7AITJz߀ {;P-#r9P%Y- (0ftcjL`|iPׇM}}~$~j~__ D4 ǧOPJP`fpP ڀ(QQ`7 ŁAR] m4E`   ` p  P ΀ p 0 . ǐ Ԑ p  А  0 ,,,. m`ic0_XT  H` Ӑ = p0 +` , p @  r)t@e0 [R LDD@<*>5:7,PD3(P`0P$[0,)!g+ s*p|ꁰꇰ) n  n %p1 > 3p=p ;E`H`U1; Pc R -QP? 6  <) '`" -  `p` ipp0_ p@`    0 Ԑ VR ` @  `  Şp 0  ` 0J` + ʀ: KWP[J0f?np9P@` *T*   -S@ .@ %0 2p9`8`mPd05Q$3\.1~W0z1 !@ϧ. 2* B' 0  u9 p_ k b`H*\Ȱ -`\G6RW 8= p Jd@;\ptfjK:\ W1l!E M"XjmHD@dƃ4$LA1 dhlH0JK_ 0)M/mx/y> sω>3Is%ʙ(sɱŦ|YU0LaxUA02QƁ3@cblj:Nm2FNpud-ۥm,cFܱI<0?l5P?B`NhVv~nhb(*Ȣ *(VLI=|N+s+B6RM1@/40 5y,$J6ʜ 3pL'8s7H 4| "n Dt醛g)7tQfbR2Mpy5Q1=HS #2pL/$ Ԓ.L * M,1㫰feAYpAUXD?AB0C 1C ˮ`)А 38QB SC"E-B h|B0GxGx!2o$b +J+­.b10 dA, $ Fl`d,& $ICdB\C&Ѐ1d2p&$ %`A&2thbF>&p jvpH܄ڍ-ٖ >|r&س)l ="&-l:&I1lL84&t 5lr5l3&n2S&:hB&Ȳpa*QW"¨15䠌0r:J|Ng 828XnЃ/ZdݰA*ΑCcp@)M$@!rhaNda B2p #YЃ@ d8@Cr0 A#4`Mx  `0F\#C(<}`/CCG'6Fb;H $9|"58.\4pB #CJ&p\̤&7 .AE''ց U.~ \0C G)p \HW ` fAZbE.t%0`p@(1c&S˰A3g@#|fQ k\6M*8Ar@G:C씁"0w`Eb<9OzӞh"%Q ? .BꋔԤ^AM]SJU HDٌ?GRx(:l pB-a ]DCHF3~A i F.Q ZdF2Pe7o4cp# CPVဆ(ʁll!zY2 e0A05k  ,*@.H@ \|@.ZXBDZ+uC̠+tPB a Hl 0h:A n0 %H0* Z .hW 9xy:A\fą'`Ğ(|  h +1ZfӰ"CJH0,pZV`P 8 8B%"KP@,T, *1T$D B@ sVB 2P ( j؇%ܰKЁL҅t" ݈FKBї&6K|=.a {XB+qYp%vKB:.ar\"D3qhx؆%qKp#?k2.AcX°:~av% K'B} Kc,TWFH `S4 r#?F l $4]@`a47Zn( HB p[mPoA"*0 +PD P@ 5h4$]6@΀)AHB|`..a,H FtD@ C`'?D|P '.b`a7ƀ lMq3b=ba{7P P@PNg!b"H8 (\[.0K6D;I!RK\dbMp^=ADONH.fA\)ǸFTR>K γki >PtE = TO$a^O^0^P^P^p P1qɱ1  1!5Rء(R&`/E ސ :S Cu "#QՅSUbdQu~Z  ǔ @ Ұ u P   @ p 0 ߠ 0  ̀YPGHx߰ ^PW ܀ L pP @`  6  ) 0`  P ` Mhr`gXSB#F5 0 ?P.:;(D`8$`M05@!0Y2 c0fsw.p@0 b1@   #@p8>:p -p-ܰG0AUPZAu `@L ? @< 3  Pg`$ *r-  5 G0 6 xYij( P#3 0 0 & P0k0  0  `  xpm pT @ @ & {  L*C0a 0F &xà1p L '10#` #p  `  A P0 >` S;``.!PV`9PPVL yK@E` 00Q ߀ Z@ CHBP p@ 6WY%Ig0Kp`w |) 2Afpmxp@F 0 L$MdM+MN#gWsq|Xxc ȀpU^ %e+p%b 5x9 PR +p0@ Sp| @@*   " P p p ? n qp@Z@`PX@PT 6@00Bp `Mp 0͠ V`  a0ɐ q0 yvV |ӎz$ CJDJ#qʩ #!K KPP D Ą -[ }Ma 'Ta<:~o~iPǚ]C̪@@*W`bu55a^1 :%x) @1Q́6R" jR=x %`{ P`S ={p WP[U;!+M.2``   0 p @ Ѡ P P 0 Đ `  0 &s0 ~yrl`g`a\p>P K P ?  40 А '   P`  I@0wpjbLXzRw yI3P0B@+:>0=0u JTpZ5@c30m2@ z~镰蛀4P  !0: GD )@ 00PH ; SLc` cpRR @?pp‰1' &'`7B1`8PHB` Vp@p  ` mP0 u ` P Ι ِ` Ӑ `  P @x 6P=@RAt@  Iz `1L/lx/y^y ׇ^/zH$՗ |DgQJVc5SkraxMa0&1< 5f0-[:RMÔI2h7T%Tc7TR1L$H>?X"&',(c4|1;X<(dDHs!R!IC08` _pPԠ4 td00!+p$ [0' 8ԪC.# Ġ2Jؠ8<@QUz0ñDT!QcB ! (AEP!@2A !#@ " A!1h@H C0!?D@b$!M$0G K!S%>|!S)=R!C-;N!¨CH1L94#N!|CH56!T,@. DB<R,ܓJ!B>O$S  D B((`St( ja.] Б1Tb12`^\@/Lqdhb8 ~Zj5 CDt`9X!rXC`X&OcGb A6Ќk8AԈ6q=y1bhŠ9s8F "ۇscX3`@l kFP7Qn T#Ѩ F** Q8`H**!6dA@Ņ6( D $,0BE]? B| A:,p ^Ơ6퀁4 `E48DlBA+% b q!,CD 4:9~px0 {PA"i@,BjH"bkaB1CXm BD7@  !4 &  ,] @F@X=zv< ww Zb)=@l/ =F? %A0 LA(B(2SP h!%JQM(b @(<`M< a@A˨6|,@0D1ܠL5B mPA&O|C j@ A %XN20aha `@ @ p0lll(P kpgp0 \@` Q C ܰ : @` - ` `   JЂDvdlPwG \<`$#$0M.-HP(Pf!? @ !H>U;_90ip8pv`7H x @: P0AP &0̠G0 ǘ 3_[Jz5!}n }@[RRU[^P|@6}p6}(m&}07}`7}7~7}B$8}g}g}P Qp}P\0}c}prppsp}p y| w}wwI wy r @}>}0>}0  |㖒=~ tW0 P? @1 -`&p T   Zp %  B``@y T @` A$]ٙ2'5wsݐ -  5` ۠hP C Аِ L `P@ lD92_%H!#QhqyI.q5x (x8x k0 y``` yTaX ӀLD fL4G{u0M'N@tNNU7O}j@}}}^}5~u~P~_@ Ɂ Q7Q (hڀ% (+R S3u;@%"%8&j"8#wzhθ@ @X0 p @p 0 ǀ 6䦼 T `%@  pP p0 ~wsmy( `P[Pp` IP߰ > p 4p  % ʐ P P P :Hr4appMp```];`TP-.I@'pT?B@I?T=]<dp:n`9P|`8 { < ~+?P x 0CP %`͐IP -@R:p]J0M IL0RUU?yex@6yp6y`fz &psvy|{Lz0yPknc y@y`yxzp{P#PPz@ypxly =y ݓ0y dp0< HpPZ  A 1` ( & : J ' Pؠ . Jp0 v `@ M`.+,X pq`6܀ ,P Pc 9  AP p0 LP0 X PK|`vpo=0wCxWI$cpi* xpx+!x/QC^jOKK Pz׀ bzz<ħW!|?P L0Ԩ̗^|$nPهP7PWP'11x 'R8Z4eSj!S>լB`-a" $( HG Pp ` 0 ` p @ `  ` @ =-m m N0 D p 8 @ ,@ Ѱ !  7 pp @j?SWPc`?PV010)N(4`I"`>E@ J@U@oZ>e`<ppu5z555p0`; = ^ C !PPH ( T?ePct4utpTPUIEP?DKaSSgSjCmcpSsS,u P5u7uPSS\YV[cV`tP\@vP \tYvin0@{Y\|t0"t0!u4@v u@upulup Pu PSu0>u PuP@SC up?tCQ *N4 %& 4 P _P `ː + P ? `@=P @ `(`ȼE #p JZQD ,  4 Հ = 0 F@L  Y&H*\@!|b~d.'p]\e jל{ $LF-+9I%WwÅ'.?N 9etRNpZ :\ WmIu.Zf1KnBHTF 5!T!a⌊edt cCØ0H a_(/1L/jxi#/wnvۅn/H$ٗ^kb)5ԤL 4,`j9+]}Q#,r cml1d!VŒglk_l2L9 #&| 5`5xM%(3I:D.I!vX"&',(c4h6<B=4T%8ŀM2d)LJ3׸b6 -|s-8R.'I:P/y:hƞe F:lqN/V 쒄8->xc26`M+&@J˔AÉ`!m @+,; ЅHI!Ac\3XA T.D $(CHDt@ EAT[\@F=AAqL 0# Orp&{bJ@Ap / G n3VÂ`8:lοD;?qPtTq4PD b~ꊘ꓄l T<KH0qqKF>&pF? 2pG|0`!H6X (-A)lU$ _`9dQv HE ;(:O/ SD(ף D::v8! #B%?mרH5h h5o0hH2Ґ6H l <.\$Ap $@NX:Ȅ2.lFd'=Op HQ .bNYR$Le+8W`Q\"7p kB9J"pzxЗf09L`<&2 &p3`|! q ldC/A6n/ B"n G9qtCи;w!yҳ=O}Z?d )h6q QB<"5bJәT&t ̞$yĂ$ (}6aiT#F+ XiG-l1[B,0.H]|"؄:zQuB;~!awkv v:xZpB9r!7fnĂp L!h)8pOX .(Q, a`Ow;DBbD8!jGHP >0,UXA @#`@x DH(d@TP ?(~A>zЇbp#0fd8 xP@P5C\2%DLD0kEΑ +`,@Y BMaV(5@A\<e}^@? Ѐ teB R$eRT R!=S5ŀ7Հh"8zPp E5 !K  @ P ٠  p P ` g   0 xrPk g a]VD` C   3 ؐ '@   pà  pVG@5p$` _`rEUa6pu1%W(@6 N@IPKF@V`C _0Apl@@5?`U0P5P50@ 0Ep `I `R@ )PY 746`_Q3w ii`gN iBpsh4pZhfhp#-h 5h=@h@gh0Fi RhPZ`i`@ihil hih0bri:i0"i;iph pI py @h gI dkh ^ki` h vɠi cpv gL0>%@#pPP @:P@@6`%p +0 : Fp @ U)ds] W` b P @ Ơ T7*JP}$3~P cPpUPf0%AQ`jp $@ %` `p ( ԰ # dYeTiFmF9@sTG ̈ X@&1*;!-tgw2 z[wx+!xNpY! gpV KTKKKdq9P#`GP{DMFMd0|d|aNOwOطOOePP~ 'Qwǰ(%5! p -#:حX_&"xzD@ w` @ P` 0 0 ` ˰ p ݰ  @ P y \ T J ((+(b# !` IP@ ? 5- @ " pĀ '`tDL"<Ǣ"T 8Rf9 @_.'W'`20Rp <MDJP`F0D0` CP*s@PeP\й@D PxH   Q $0֐X 0࠷ele;cP`0dP0cC@5v;50d,@#cp%@* dded@?0d0@Gd @NdЕeP@YpdP`Pd@@g0ddGc4u d@|Â~IÿU0e 3 0 @pe ' @dp d @Ādd d 0 c w:&%0ZbpW uP5{50P!P$.P =P FPp k ``@ pŀ@ ` @ p  P  P  Ьj`0ؼm؜lLWpA7pz1:%H&P D>auQ5! C@{G fl/22A2-w 4I%ԥN`:KA HZH J  ހ Đ nzP9m55Ig@ :ʨg\p_T|ԩN'O}_ }}~j z~aðQe` $`%Ě pQ#Zz==P϶~p6 j g` p  Ҁ ۀ 0`   @  p P HIu p}pw0HaHm@ Q@HP@ E 9 @݀ .  "  P 0 P@f`Ƿ`3@YG P&e=pp+_0,'Z%p3 Sp<NFKQPH`p\ E@MJ:(yЛ~ЛЛЛB@ 0H0F m g~ P ! PV` (] 2p:PHpe;_`a_R_E``-$``&+0_0` 6`=``C _`! V` ` g@`q0``|0000`R ۗ [ 0` ` 0 _&[& 9Wp[0OsD2t^0%) (zJ M!/SL%$ 7xr 5D(pc1ߠ8BN+ ,Ē:-S&R <8-<*ȣ<ǣs<<(r-V3 Ȓ9qⰲ8)-hCJ ׄ24t& s:`a7K~`nT"@` 4F!lTC@1A ]+ !TqSAh0KHAAWHF@l4P"~0@ *rr#"OqPF|q)2q,߂h0D U83՜7-|! c-l  ep\,@0ElAA]`C3p ]ܛ ]@B.Ѕ ta]A=\Ef] 1AFHЅxD]H@V(E t]q@dEt]At]!-<$CE&sr{(pAJ쪬 8-RA\1pL]@#2|" D(1& fdL5ҤP0(7N qbXE-ъXXG,%Oc-(Z8G-![x(DΞeYX:`9Tp( 1`$'> Md")@XAg6,!zApH<T Ѐ!a]nҰ0V .@px <(NXB ,! PB 18ghBv9 .D 0B%T̉Ĥ*< 0 Vpa.l߈ArBz W0`,0 Xp`1,T`X`5Bb (H(x :l >@`,Y8d +, [P@,Y d B :e" `Wיu'O$ PR,"ճ@p1j^T Ȁ,$#Ƽ C*0` (Ѓ3h`p@ !C :0d9@#|0I!84xB E~ Yb2aE-¡VG1<dpH21faPԿt,I.Zh7$a8a) =8  3HD p0%@ H|dPZܡ&| jrR-+a #\d-sK\L  $Rt) s,H0іPCs]bx30)a001|'e,#y h~5^Cxw__!a aR!Ɛ+UA/S B  ;SR!Au 0 !P0 #R"'BUKU?UVURXTxS"ݷE n`@ p qu ` 0 ` Ѱ  `X 0   0 @ g8gggZ0 f \` Q Dp \p 6  *C ԅ  ! 5W?ipI2u 0@lpP zB@p@j2p b@)*P#[@:U@BRpL@N XKaJ mВsH pPP В;I L !)  S0   !P^pea 0P`j @ EpSpn@ 0TjSR0U`D@U  G p R:`@   "  p 0t0hMZ*00 ;`P% 5Q0P@  @  p Z|2`H" BHG`y !$ad*21yP2{WzJJDFq{pKK!MQQ{ V ]a1`hMTM РMMd!)_D~N'~DX_0PP1= 8QXQxQ Q#(R&wtR*Ȃ,1f &`5hS9S< Ѓ@%T@ C!FJM$+"XhY:{@M k q`p p@ 0 Ԑ Ր  ` pP   0 Jx&"0 }@p;&{ b]p R Fp X g' 1 ^kװ  Dz #3Vp;e %!?00_֙L2FvP:Pl0 ,@%pa#5i9X`BpTp N0P@YMq# fnIPHI@ \ LP N `R @Wp \P %ـ_ f@5  1A`@PfPP0MpQAP9"@QP1(Q(.`Q0#7Q>QFOKP Q@q[Q bR` iQ rQ`z0}0ˀ0˄0ˈ0ˌʐʖʚpʞʠQ` ,@QPd]@Q (RL*h0T`Bp^`d )p&0mAsAwP:@PCp L  P U ^pP@ ` p p JX + + i0b p` L`L =,|&`p ر p`ˠw@ <P`yGyEK  tII-K52@cz3Jp *ѪWL qvQQaUqK!L tL4L G}n Ր gxaʭ!h Dd c~@:W!bPpPPد=8xOR%+8c0U [S "S; ဲ?-[GKńN$F;<1RmP@ s`%{[rP @ @ P е s0 P Az  0  0 @0dd>d ga] QKPBj@ 7к %p B *-PPPV?p"^{@ `0MPM0 rQ 0@pV u 3 #۠d -p   GJP^J L0R{]K?K 7%0K.,K'4@L!:LAL@ 6~WLqLn"b K2 nL0L & qc J@LP L R #`L F/\pPQL8$ ) h2p`<0zD 0MVp@ ^P cP` 0 | f cp SPF0pBk $0`HMP  ps `cH*,=p \:F `E.-p}k \izsND5Ք$LN,AI0pqk U8p݉W@\ q]5RKpu j.Sp28\ j9Õm.xp-\̘q MiB@c@Ɔ1;.B!La8ӄ) \Iˁ/_~1M/lx/yy燞/zH9%_2‰ߢ|1;/rj0`W1èfLc$|@4 Af`c,".p‹:s&Ɛ2d"M7X%PcI8PR1 $BИBAEdL"O6 RVTbp`)AD l=A,{K c9(#$LC 6\B64'DŽ09N)sJ+;* &B =8*""HGs Qv*X|E;,a9@(6(*7 ''`IT4 '8SA6\1<@ }nt2"@AH@zLC3A j(  !_:h`ADW(1AND@EHEQ|c,D 8FMЁtH@ Ҏ ]IќϤ S"P`E/-ǜ ҈6' hF&|:$!&~bF8@xqT qAGhpq> !HP)Ā - C Hp7! HDl I@aUL EI|b8 Fm0 $aGz(~!#~#OIIB$Bz`Z$/  %@3Ti b&\ :$?hn  '8AV00cAԠ C @"0JP@?H X1 g$ Kq& :@x#`4!f$̰D0!E$h 5f⌞ c(Rb,[,``b0(el q6`8c@pa,JC.\DI0 /aCMhd'=N I/A .@eHUf:pE_ !@"+&\".8.dA\7pAlbE5rPC"pŁ2l Ԡx4!iPքljs7 3'9Q/L u/l $ BzӞ }G  1A ehCPFMDE*6ht (\B6k%j鳞 mgG Mmcv#l+ ZANH0 Qd(pD&(KH`78E8(rRT:* Q#*21Uj-X1{Ń{ ز Xy ܕ;Nфv E! #9'fN@6.!jP *'R!h/epՂi[Ұ t!B"*:`rXc$ C @ul^A hB$`UgSH B7pB@"Њ($l @a ( Ma,"`[L @- !1H XAMcQ/! ]!@` BP,Q"?x0`)Z!ĀC 0L"`C B6@%d$4  ($@1D,@7P| (P=p qEd\(E/"l`(&@TTdo[p~" E8 a6.a&рUAPoA8PB b -Ad.``؁ l098xpa 0c D!h8hB!Dj BO"=#Pr7@vk h }6!.d\AG^ B Eqх%gj"A'|P NIMQOUqYA\\@PPu! z !a ;@-}?Q@,1qSa;eA%aT_TKw aءܡ[0`V`P aq%R   reѰu!! X"B" ސ X%#4Y#%B%ZEZ؊$@ @ m*v [@ʐ "p P Dž ʵ  }]  P 0 p @ `(8 gb@_8` Kp0 B 9@@aߐa` $p A'p"P6`cC  $opR3 ~>d9`0QnU6!) e@D8_AP[`$QW` P[T 0cjQzpQIi S@ PV pPZ  a @Wܐj h ! ; qD>0tg]P?N$oB#?p:*p?22?P+8@%?0@ !F@M@ U@\P@b0@pk@*z   # s `` @  p@@` I ,0?ĩ8hY@ ; mE0,Pb1b5UdDb `LkTppPG_0y f~(p0jZzJ$zzER{}{} @t`  l xz @ 2V )ApO KK-`&PL$ GM0%q)pp25q:rL& 䴀ЀN4ih\YY! T i rApQ P pQQQ!5R)(UG%Pf!SMHSbpS9SWXE5ja8e{pRVZoq0defQ ᇀVX suxW 6 )pX r" 9BeKŊ踐늑$>zE dЏq#w` ̐ ֠  p ` !   ` P  p P0 p xPrmhP0` X I M C  5 ߀ ) P  :gb?P@i a PNp pp0;pw10Uk`%8k. Wa dgE0[oVW PxYeT0ppSPDD DRh e\ e b PV PŶ Z Ơ`  0h )n@Mp à APKk ,@lb<S<GA(<:.P= 26<+=P?P= #FI@:N= U<]p>cP=pk0>t ==m L `ϛ`ϟp=@ = < = $p=@ + < 7i`q0j$38;,0A*`4PI <R`C`Wp0N_0 0Wep^PifijqrvzvPZDR؅ؤjgؔט q @ףשe ] pԐ?`< \ ; * W~~Q~ PM҄ Ԥ,Q/35" $ ȀN8ip\  f PQ nqPP à Ԁ 9x#Dh-E:;SO@B L@E{JMTbQ;^hHUjUlpH_uxgf `lkcWfp s[z; 距X XU5r.tu~$ [pоu ~[PP ;  ԰ ` $ !   ` @ 0 ` k { pp>lrp aPP K S G :Pp j`?RP<uP+Pr@ 0P[@ h D ~@:@vtp0''0igP5b?`_0LZ  Y\V `d0ciqpT`FA0`CIv\x\WX ZP @] ,O tf h ' w@ p  @A7ph7Yp7 J0LE@@=.8 5608.=9m9p#v!2R9`Z9`9@hk`909@L@P8 p@9 '8 79@Pz)$Q+P174>p)О$@sҶEL M S`XP Y\_@c@g@d0m0cGc`yhh@$hzh`e00cP @Pa ! \Ȃ<6`N E G =P4H$@Ň L.&p+\F8b PE.1p\p~z y"tV&\+ ;\eJWxÕgl,$fiRpBU9\ 0n],jpD 3kN hhF5) >@@60 z 8BӜDg:չNv0x x7Cx3dwB=Dz u<>-m$ҁ94qr`b 1 lE 8 Ze"s8E pB$E01A}{Ѐ !(Y ܐ!ip  @ |! B*,` XP0 f80Ʀ]l,!BW*fM @ʶT|Ym]Euaa14P!ې5-0 ^A1 \p 8*H Z@0A`p`5d D`A ,1B b@ !@/|b@ r m؀ 䰁ԡz@ o@FDQHքbsܧ VQ8X HA vтB0 `aG0`ꖣ !7n &R 1( l܀ A:*`X@@!|aC`IhCg:,Cb`1#X P{'"PPZW|$.X _`x ,p{ qDLp\58F8d %B.K.2&d n=COg(`R) .F˫de+]1b𡜸8'.1FE]V8qP/X9pB0(apq41 @ qyP9 ?Q-Qg#`#E4!.R+!QS1SapSaqrp?TCUT^PܑIQ0U`" Xe  " 2^!!Vd@Vbڀh%"$2\mVq sUW6 P z |WyXXvxEXG @p ]`]ep'm@}`Z Zpp P `[ E @  "\P PP] 2 %@ ~zt`5 hp   YU0 K@E {.pv ' &0n0i0p8eecO`e_e^e]f\ apZp`vF{FF`Gh `T ~[0 ] _h` Udp `zҐj 7$ \ *0b%+pV+*H`JV=<+6A0,@1H,+Q,@'XP+#_ ,!fanQrcv1{1~1,Pԩ5 e  9 $`+ ) y 00+ 8+ D"Y 0.P c`?AC$`7P:.L,#0T 2p`[7a9Pi@=!vy}@ Q 4 ࢢ3 # *p 4p`@f 9ps2Jt& t M&*.1Q470===ʇ p`M0xԇ _pdMN7{000|`` ]~P@ y A Q PPP PP1ej HߣiXc/*U F ."(S4eQ)S,xv2H^`^JLN%PGIXULp \E_aER e[pMv_@L0p%)fHWv qXX|w8_Yg {p*p _p n't@ }P p  ` P  @   p % @; s ZP JP Aȶ83@0?&+pr P`b`CM p cPcP12-u@% ' plj2h`>Pd  Fa Nơ^ ]\ f`[rv@Y\|GZ [ &&\ ] _@ 0c PtyxlЗip?'07pFI(0pQ(P*Y''p_c@^8(#pn w(,|@"I ~ ~ %pǣ@Ǩ'0 h| 9p&p F`Ķlf`iD@{FHP>Np! 7U%0u|($c.`Q-rcvoo&V::, x  &|# 7@"Йz KGA( :0E tK|ZTeWt@=A K|4 4}TW1Z};1z0~000pN 4O T P° XaZpk۪h$ʁ抮¡ˮ_d+-zpDʯp?CX`KxUQ8U  HbpiKk0W `67=ܿ r0 Wˢ h U @P ڠ c hK kk @ 0@ з     N @ LFкp 9`P0 0"P5:`TX I0DY>o{xdKs!&2k`{>@e@+ ~SZ^]]p&[Ђ[[ 2G@[\P p] ^P a 00dfP ʰj i:&yYpܚ\("c.1`"s>w"B0@#0$p90J`$0:# 20W kZ$+0`$@(@hp$&@pP#@%@x{pB@#P -@0@#@ 8 @#@ о !Jya>0;cP 0M Up@:]@32g `^tPw_" & PPP" M 3pP @ I@I.&HNh\)f׍|%.#p-ɀK\V*2 @564e.=> 䳐D;dL3=E 樖`lG.6p ['<_B9dHL&NF OV)e?e\v饊z=tQ)dG;ԑ0z475\M"xH388c$SI/\K;&ȳ *t2J=|b'%|I>0( ak1*~ZpD< O&BX9@$1I¹*![l(D$ @ 2TC .A xp&0G тn̰7`f G80 `<yaxqF]QqFa4 Fb"FCB@uX't@a˽HP/a| 5t0 ]|` ;0H|G;|PaW2 n-| {ׁyNƑn h'0| J R|.KXp PeB h]tN$c!?@|06P=@tP<}!ABH>#( Z"(B>1DH Z\h p1B#@!tI.\L$Y.0L 3 .ڰ9> . A'HRv\h"*S .H+h Xp-Y$,W.Nh{!_R\0.r\dQ \82pAQ pӤf5yPDF7M(4'9`P:`vg<9Oz>}ÝNd?_}@J- =(BЅ24 uC!Q!#h.#KY&J%ZF-ZzGp/Cf,\a:r(F AAh6o0p2 bcPG%vKE<2 yhTU'LՉMrdZ}">O!mO\G'PNDahWU"?1 C2H`@@`?YDP(""DP`@ -R'T8Bdg ʀ C+$ [3T1#.F5)Mވ P*u .5x~‡A4 #Bt{e\VF\0.dA\"b \4ldf3CB@ip4r6 9@ވa!q.ө֫ !̃t {/ } pi at$D!bDD"3 l ` 6֡>ь6~<5!ޣDA0̃gG-'9#v810f4F5l@4e($IDTU/ULb&FaM|>:a|xU`D\ WqC\Oe>щ-=4&0` @ 7`0EY$P5T 2 P9@P0{(%0tprfpP8pkeHe 0Rbp_ct_ A_^p_^u__0 ````a 0d` N p0i@ Ȑlappy X9c`?WpD pLJEpR0`?YP]1>AnFf0nrtFo_ sof1fqGpaQ ^ \ Z g ~I 1J ΐJdJr/sli*s2!>t@!CLFL_ LKgtQMUM灆^@u$vgYvD m'O pOt'pw!zP}w7x/A%Hx)y9yxR c 5 s0'w`'z'~''p ` `   P  0p P}p  ~~ZY `]`Y`)-`P 8 =8p@ y Qp 5 P@[p[`70 0~0{'s 1?mAhP" `Nd0c ]paaЅ`osxe"c @e06f `lp Z X0? f B`TW KN0S`G0[PB!qI'<@q 9@|ЭЭЭ FA @0 P `,; C`! &l DpDJDLDP$ETSAYdl;Q>>>V;A (npn0yGjpoaq)ofeda aA uHIITI qI  ` ׀ 0r àr,> `p0l0pii%–b0<@!qiLDu WJt:``\@|`\P*w\ues0$aFPJhe@ @Xpc `PbPi@`t}ȁȅȊlj  e@ǡpbP @ưf@ pe@J@U0;`E  hK ]Sp `UYL_ 0eڕCr0v0 @~́͆lh E l Sp-`-H6ppkF \9Hl$(pUK\]$ W8զ.9>0gzh(#|Nyi&jI.0pi;\jκk;WPBquvKd7(uPXpk7\* 2j9e .spk  SA 3҄P 3,>с cv\B"(q /R| _c ^g^Ag>J|I x )ݩ0, a `/b d029ӄP5eslP@l8G?@|GK*NFPR)eX^F~1A)昮s bh& $*&I kҡ+!&]=P1j*O%FCH:耎#6K M(E& (AD@L"`3 x!G #wA0p0 ān@A?HqDh,Q(`dtaa a4qG} Hхa8$IϜ0F(Q ͫ$P+ Q ʸ8/"1A8kx;PQd E lE^\T(@ Em\ ԑy " H(pp  Tr9'{x@0/oys`.#K 3 `.:BD 1R"X/}!M;>1TQKR PH*VV؁ 2h HxB2 ? 2( !E $ 2ANx`) sr9p p0 dHʀ. \0pCIBdChjMo~8YNs@ H:v Уx?^ЏH'@Bp/$hAIŃ"4 ](C/*D)ZQ^FZG?Ȓv^nI]¥-<`aYtu"(Fʁ;9cߘF m (4qe#0"I`G$TxLS%HaK D&Xi"nMj6Q[a0&@P1 YzX A#cBhG$~H88ǹ4 8T `".`Cd@ A&XܡC 60`@9z06!l Ѐ4,ahBPA (1cXCP5PKZibf5vdE׾VTlgҐ65h+1*1, <ͭnWz@Ўg֐! t졺~ {*B,&aNNݺ|$0!Ed\ܠAGн"pJ0RBd+\j2a'l a( R$'OETp1/\\'' RZE-M6p FޔfXh(G ?pNÀ 1;8!@}l<̧>|Gg$+yI}A_hv(d! i(  (KI" *b`dF8tpK_[-%M_x" E! 9u2h6B b(3qe#P0_h$lIB`=(zT(qND2}dVȕ&MDE5qQMA8= ^b .%&̣&;fG 8="8#L 0$"FL@b0a% B|` 4@\@:-[se4 V@`3|epX2(v n&<@ I@c%~sb-)`Ӟ @,5la8AF6 fp~0z D`9ֻo}% E N=HGD}+E^&@}'x @,bE(I$|"Ƹ1.RǞ PB F1gP4BlFULP!XVee_e_!fdvgVHiHknp@  bgxg_ g$h$"6c @Ѱdh~<#?؃g^` n0 v0̐ | Rk B(P  l Fm@ p ` 懓Pn`+` x q`nk`Q{` V`0uhp  4=tPBX kqTT1@*  c3tp?tqBmP Jj.jWh`[`gpuf Pf0eXdbG4c`vc0M3 v d@5dp5epwe `i0xj` xxm 8[q*,ْ.bV i`8P`0r %& |Uиv@P3<@qFl0k Sip\8hhl edP @IppOCTS0f `Pg@ h !* l @rdZfzhH*\ȰÇ#JHE"l࣍j>@C!@Ɔ1;.Q! a@ä) TQe /^|c_f*^`݃AXa]IS/AԓRQGM%h|r&W0&UA02Ia 3d(SmDk%̰@ϠCMi:bp0wθevEmXh7AZ61sSL"^V\L=(!$EP7;"Ai$. fd0!@+ @&Ї ByȠ6\PGrC8 l@T Eh|Qbph&@pYGeAgtB'!t&Bg#oN"ى9h&+[¢TDG0L駠*ꨤjꩨꪬZlQH-dR " $Mb!N<PDeqTRK5TTSaVZy^y!HXcuVZk(JE]xŗ_ Fa)ƘcIFe1MP2t N3w|#XӇ6 !ʐc1$N"|#-¢*}'(LR%w>H%<%]}}ЧG;8'Hɂ L=L#2;|`Lj_Ddt!&Q~,x !Cw`$t @@R"Q% d]j1kƠq :y`fiF!ifJ(雄(qjTNmҀh smgw5t #3$lGP5"T΂T -/́Z[ VCt fZ/ n@ wB^0"`` s1C^yLd&Sdf(8CvC0'k5Ao D2Qb/ء]dh,W,Bc%n}TD"a Bqh(%c XB|P%`G2Qj !EbBX<F XDb`FA `! :l 4p`:t8"4HX(- XC8ׅti@6 qV:3up̠ %ޡ!QiE0! H@0ʆ:D'JQR@3о/ 3 ?doY 89LZP([ťAt @eB]-|bb3@`ihEJS"^FhC!2H t9uE"<aFG G$(O1>(;qO%V ?< i#)7v%-z@ D<Ax,"PDU | AHy.qP;,) #4 IPf)4laiHM4 s:y3 ;ЈAPh(T4O@ T)tʼ 9|9'L [^ $ 2hD %R20Z-b^HV- QV|9!$|`P@ b [ʞ > S!8`% SuElVʵ#RaHB|D>$J Vg#%H Pu,d;YJTmf5ItV ^Pg)ȹ hj 8@`.`{AP;v;(ɁJqXa h -` ^o Ly焆֡@C M;4 ¾EC<`kobj/] fmf1laMJL H*\ȰÇ#JHŋ)`"2N! K9, g柙fh&#X^*I'$B0`JիXjʕ 0c\!aZWD)%QyXsʞR S>IIoR$~hr~aY:Lf9M2/UA FJH;E]g]P [nX@H9GYnhs@-|!&5eާM4r׹@?F"5r$Y" {F)xKwhsta@¥,0(4h8<6ƠB/ ;"-, =yH_(@bX$E˜$Id@v$3InnY#IzO$_>Xq#RXmJuD<@;AAPgH, wq@TFy祷b }j䗆_W`  {a nȢ@!ʑKsT*k覫+\wH-g2"P)8%$I&Y晒 mN$MB$I?&D']RaO#PPľ6!țbp B9@L$P*Z\ƫAFbmjjưj 5#XKu%m8}n\ LJq"*',n'7T* B{AE̥# /$EX$IH?\&fp&g)IG?iB#+TBH( S44mDM+j`sh^6ׄphl! '` HHk.C p{wpoŐ i - &u0!'V>EimVpaPA@A @ @X@(@CC|wOZc-=*cx20Z#=ڳ< S P^#ihlp)tVFRtF?)14}=uCi1K]APUZIUf9aVf1!%E !k=ʃ;Ț8zë5<7s2<Y.łY*hU'@Ua# PՁNLvegub0K+LBO(uR@T"\X<Ȋ|@O`qC`q/`q`  c>fᣕ=WCX(3"=;Q:e9[騧ꬷ밷^EGpHkKgTMd$FOaP^,a\@UXhuYVUS<'ūQꄬMX̄JXHt> ~>~Ánb`1ȊRRfVBCP0p X Fb2-AfbФ@YPT\Z$W@VAm@}0 E HR@6-:` آ)@>dCL0<c)9tB2HIB`2 `B* 6tE$`}n@: 2L,+K R rـ\2 %biX+)#n[>fՃE('p#*Rd $aHآX-aBblڃ-`9"x-`4آ Z)@,P ԗ&b%^1%2Wa00 I׺BAfh0$@qRX%bBL +Xl IA l[O5 ָX5Z4Z mh0A5@P l[|xZIa΁r%4eȅ6 $,@- <E&P[ 6V rف\r {\̿o2 oF@.K2{pvh BGq(7 0®m 2?z܁HNK`F:GK@5$ 9R@2@E Z Y &/< Ŵ`, 곂 )lQ [& Uh0Z$-h0 T:BPiTAsPiP7m FK`1 `) hBv7v`*@Jt2=@ljrФ=Pd\bbsT`'5AKI4h?0Tz@4o #oVoTh0>GK!zoLuW!Rodjp֩?AgPl#jVh'` bI\!`PzPW; X'_!NЯ>r\`e<ŭE(9@4 @7 0})"c%¥0W XCXb 5@0EcP@H*\ȰÇ M i"ċ3jܸ;Ա@=phuҤ2`8am7] md+T`J5RF &0@ $l5 @D .?ۣ:{n hh6[i[UA @':bjptP <+،sV{>ǍC7𽻺YhY h,"뉯% +"-@A]0f` V` J` 6` &`PiC>_ᓕ=SUic&=c;^`9@N@#p6`M%)=,,̲2**\v5DgA|W=|W8Ud債,@bk )1-pM;X } {Iu7<(LlؔFNhdPd5Qa(ES_LՅU\dWY|YVU[T%dQD3D& HXkEXKBX@P>P;P9X{5XK3.B]+ԕ['eY$t&WXTAQ!J !QEB !dB!*RB B P Ap P 9>13ݐ^ ?PT 0U YЙ dw]%E", $C'P{;뀼 PPk.L>bЃ+J;(I8r mG5wS046@d.UhX`&x l2J)- 4qM̀ V%`EXSd@D40'.sǜ{1&v)xՖApTQ0k*-'ܗ e[\aUPMRk Ѣ't QBV0#LeSBS|@STf`d_Y[RPXf:Ќ4t5Wi. I;d0Mڐ6$ BACQ̠24e S U/| BZ,@ uѪ` *,m ֊@iZJ8 /$*B'-!D+B~-DAtDh +rZ@X+K;L@4@F"`*L>!x# Ä");I~tAcDxG?ȑrG:QxtG5P $ĠHW>x0EAQh^Z+. K S7,͘0H@+A> Ф4MZ@Ф4M:@ muhWci0= Sȃ,:Ք(7r ]c(0]I<`U4 4M+T $`$hpnp g qH<G 1H#0()Zi{̩ǦvIa:ȱpU↭aMkD+4d7,PN9fAXfT,S4)KP RA(? V=ERXXYٛ2M`GMRQBTh8Z݃/I A=-L搣8 cCQԠ44 S!CV0t i[P.M ʂejUZThA!ZN~M&AHФa~Bw ~>w~9 ]~@3d 4h Z+ uVM>@4@fiqBQ}y@( Ej%hL (J'8`#g<`#EA;kd Bx~hAQpXA4U) oM[hr?0ίaDW@D1a xm~@- yZ= $,J:B(6lr ICHWtق`J;Vu0L3T (<`*hb xjAr `$$ @baVSMdI4#*! +a U Sb @"NB4vG0'[ K K!z]o]-\@-\4\P[ZXW0VSQPN KGD@=96CBEaAS!Yd+Q AL#m2C A0?`Up Qpx 24 2$ 2 2 2 ޱ-3a91EJMS\a_Qi1luKdRE4͂wgG7wgG7rdB$KP1a!3EB?<9?BqEaJAM1MMYYYYMMMqJQ%21#.`-#,#+ $*P$ YEP$B#@`?=P;97"q\[*o)0'0&,$ z"p$ }P;P;P;P;P;P;P;P; } p$ z,0~,[ /@-`-@4Pې0Ҁ1psX0?P%=a/hBs"IMV$:[Y1¡k k k$П!fSDiIsiBfa 4 UB /  +cV^ C_,_o_-_@-8umLOYݨYPX URNKt6!66a669awk.8Mx$?\X i3?9|6Wz3$y0x- ݩ] ءP !Cs c@z; CT7PUV3%Y0Ղ[,^( vg%8Fc"N~dNrNbNRNBdN*0s>i3=U,@:8}66U4%"4@C4.@&6 3 -0) $C|@v@f@V@F@2l|;|Ç>s<2:)@NxldJM@T#t HUHx`TH^lEm3]ѝ]똈߉:XÉ.lB&$9OMAPDTaTQP­N ]*y^,,1K``B ^?^<`8X d |w zqSm騧zCp*0+z6é-`H>.̈́MvDGq`SQl RhDee$VatX_EZ\[Zr\VU^T 6`Q cN8Ƅ-};HpdoCx7-l88Is`8fQ`Ps)ypa{8'8 %BKp"*tg ߉yP3' Y| 6$Q)U@!\yA|'iWUjD>3[ ', ē ;'8 ZRm`0D\Jd &A *:r-3pK 3,p o%r: 3¼0+ 3|s7N* {\zc^ciVsG󶑓j E;ƣ"i x H~ T;Ubb!؊ZR@&8+ R0Uj@PTJJ )H" ]] >||8!u04-WoxjHQgX*?O!OS-e0Kdzb+| 2 <y 0| ո, v%;h Z‚΢;#Ɓi`&gY'JV?Y OZ#Yљ[FMARw? f {Q^0#n[iAZtn\f1@oQ QAeGAQ$Å>G!'vha)lp!Oes-_pla/Z * N7( cߖ7% <0 L"s0Yo=a@7 Ya΀ok:: N*yQCtq;,>x `;W$TLfR 5>K<,E0"-?p -90K) IWU\pgQORP*AHi`0Ч jE  *=sTxio- a` 8 0>o@< \"π/ Mx 4бg{EnXԡsIF{Ѣjؤۡg$Xj¤~1TlSJ\QT(EJO#[(0 _&}g@$B,?k‡y QeCQr7B uH3vHiSN`Igԇs,iJ)ihOfh lR ;bnTacD2P",P"PYY40= 6'' \'"+RX gA g!rWV7U8TCxnnitfQ`1````1p`1J5`31.$sxaTLP`#j:0)0))0)0)0)0)`\6`\ a 8$ aBAH!N~Wy`qzca0`_^0\[?Z$X8W7U7T7SLQ LPN7L7K7J7H7G7F7D rC rB r@ r?"""""wpexSx3xzz:daPCh0b@<`@9Y !P3 vӱ-'݁aQ?A!bQTyf=G0EDs)QA9{q{!_J0.',@+p) 6(&%@$#"p"! 0& azTs5C!KڃlsA73L1 L.q,7+W)|(P7&P " P7| r Wq7 L78?`' 6۰@@5aPR)$P"LbB'(*}qRRCT+f` qc}GKR0z,+`+! +**p{/`\@0p00` #BucˁxnfyTQ1?<C3AaE?xӱ2b%rQ-!A3<E`1t(zxˑsanc`yZaWAW!TTTTWaWAW1y]`i1pxQ$0I %  v  c R f#e 8 !Z`n1}L1< b0`_$^8]7[7Z7X L-zSz3xp"""uuuszi*H*8*(**7=<;97653P7\0PCC0b@<0P"CYp"0 ~&[1]\p"[Z YP3WVUpS@R'P`NL0K0I08NR@k&L? L> L; Lu8AA3p{s#b*'(@'p&%#P3" ! p"0 oJM@5H`F 6C'F6=;$917L57472W1P7.,0 " sssS++((((((x[;s*zY7p˱|C{nqf1Z Q 1 < A#hx5eLߒu(U}7qV0Wp+ClX+Y+Z$[P,MMMK|I\I<IGCvC'qpRRQ,-T +**ߐUP`)P;%1 y{Wsx=>mnpp@ppp 6pPrq<"pD4 .clS Y.la@*XT ULW )P:D%F Fi<@ܸGcw4GcCKQV?݄~p<@s@];l;@^9 j3#콰Ȳ;KojȂ+@E_| @K+ r!zzzr  l@` ` _ `  Kp !lH}`Ax|g@wi$r)PD1  @W@ <[9u)P 3 '' ' PB#B Ad}f #KsZp3 $@6 h3IR1 WCpi:$M`C0Vqj [E_0B! BA[A @ t;IaT!\Dqʞ@ UTM @X/k@M@uV`_A r @GtH#5vu`@l!ݱpMwvpunr E$w-@px uK!u1_l:AV_ř_Y_lE]PŅSZ}W@i1*EP4M*V1MA͕0 Ӱ Kk ʫ_ p%G"L ~XUlفYHtIPu  ̅@c8Q,pŊG|P&G(qLO@Qm1EQQDب ["X`0 l\P.E z™+ BИ(4 pj'%P :@)"Pjx£QOЊT(x 6m6ܰ[77ᐛ8C8谉:ƎcAJ=1a)'Nw0 By. B4,, @DH+PK„$ 1a`!)pzIpaj`Ez\ZE]AN`s~j@=@Ӂp <N*<;JhC+ *@⃷L: t6N3S >㺄dJ6%MG`6@%j`jd:F@Q JNhԋ3#[1vtET!~l(/Z:* Y>XvHݲhP. rAX;UcifIYd@f;@V@i+ Lŀu%`(p ؖ>jCZ:>veC26288̾@2R_ 7]U9|4;DMCx@@<4`p -阔Jk` R  b " Ȓ P)qPq踔dnl i ! 91 Q ߁ < v H@    PPPPPPPE E! E1 EA EQ Eq B B B   ? v3 vC .<.:/8Y643p1qB,3)'%#! p PZY/.?p. ..-@\ X,1߰W`2ˠ:^P*d"l1`Q]arVNQMK3]$H1Caqi6n Q r# q wԷzv§21.0*('~#!@D% ` @ ~`SS~''&@&*8_mQg20HxjJq)***vpSw$0"0 0BPF0P< EHX0(.p.0 @\ X1P,I"1`Ela`qZVNQMK32T16B_cqґ .F n y 7 7p Mbsa8I!QaՁر M!AT! cd31g Sh@)h&hPhh*hS!NQDK3Q9Zs6RHQqQ!HqT1]Z9MsRTVBWA`1lH*\ȰCjb*ʪb*Ȭb*rr.ٹ!sɳHm8@(uFPS@WVXJK+u/u VwX]bu5Ydi]FYgdquWjYe٠jK[n|Sp\Qs.u@4w @`1A0_zK,\Xb @P\ V\ #@M  D?tC:tC5`81T؂+0@ P &d `}y@_q@ A4d`]`PYdy[\uad DpAM<,@7i4 С * ) )~hnH^`(JY@# M7= /B.e^D .a';@r:5 w0@ njR㥒iv yDYRP,@ @m`p @A=]0Oc8[ 6=pKB-N!ґfp+1 yЧ.!X{( L P6 p@"omVIS@IiX5JV[ Wp WpLgYi7U9M:G[f?b@   D:i k jЧ.Q51{^vlo!7EYG9!TMPU MpμQmPpEA> s2= ^@u(0 L  ".-ax *!3P 8iEMjQ\8Nf$8̶!oȌ2KG"L "pl4QNG RFR4PITTQVXYEVbp\㸂 XdY|A_4, K02 D1 $+2Œ8#+(M4J#P*`5re#6P 7lӍ||M8"C(09̣{xU{$@T'^3@{`"̃,B($ L"7 &bÉ|5)hYd%YEVd4՘6⍦#69rްn[<3lxN>?\j!`k?mXp6laIi`Vl(9a`օh!7VP0a*H(M +;Jb̠41( %P}(a m^3H: ^%l$5jp"XLcZ`QX1EcLXl`Xc ox@@%̣u"8(J(76PJ*b) , ̢4(M-Js4.‹"+zV`de!FiQcIFie@Pqkєh4EFlkGFnmEFp!7pE!y̑sMYGxTG%`jK7gfavd$A?_HqFZ`$d?QaTR8 Ƅv%\G8q@\<uq\28 *AF07< g2% Tc+ViSBA1M1\!uqEAMaYMNP 0"Q5%bB"  rS#Ugp``?P P M! MA MQ Ma Mq M   ! A Q a q E E r B l!iCfcPraұYDUsгF cdqaQC6!:7 R3lxlXeEllbW8r/$!"' ! p#O 4h=m1E!iq֝^z\iAo"Q'.;p.:P.8 .6 .5-3-1-0-,+)'%-#-!-- . 1 1^ 3B5UrC uq d y l<2erxԢ!.P5ac(]XBz"zz B# &'$'"' ''Ѕ !*'Y !KYBR܂ 1 a z ( s0'v0 x+z{P4|4~4h%`nP5A0;5b=`6 7P7D1  G1 0Gs M1 M M M ?`pL!EQrơiP1Qq=?+Bu:ki"I)!!r=rP5qp0;n5lkh`e@JVAdirE.uU0/u0);\\!VSGqSEAr#la^UPY=j lP3 . MPdzPǷPǼPǿPPPPP22ККККК0AQk,0;6=``  7PP````````̶  ! A Q a q   E! EA EQ a q B B Ʊ l i #AaS+vձY UCvq uYMơf^KaaHCII"7 c S"lbEB?<96201,p[)& .$0"P0 !' ! p#0  4@P5$b`6  yLae`gPҶ!ҋpqsP[hL0'> .=-;98z[311.,*('$1#p[ p[p[--2'V% ZPærdy> 3 &[P_`$c,fZhj0lmnP[q`-E XD 10'00',0'+0')0''0'%0'#p+!p+p+P'; #' !*' `( !pX|:K!P[@-0@`,`ST7rFE1%3AUSaKP f# iC Q q o r u E ! S GQeĠȠ̰Gq>~P `% PyU6h-Vu":2k"4ut4t@t=tP5ts0;r p%m6k6h`NY;L7JpU#%h(=`(9P21,* Z&p$!G`?`0ErliݣaY t"t]rsz۝H*\ȰATP4K#04#>b㷋(y<](ġѣHB1 'i@U0FlNejFh֕7%Zʋ+o+,k,1*L.BSifiPm׮Umt-ok@2(\1X @;_@{c%PcR8pSo=;mFjPS=M.h`) d\"A_wE`Vd4Il@C1C0C0 2 `pB$#Y\D^`VP ME l94N y| $cGg ǝt@pG{yV\9 " ,b \B,B(h$( +d xxI>SiI{T* <*|qd.@~~+.C\a  ~@z"L*v !ytF $20,p p8A%l@ Y`$LX@@P @(YB/+ 6 JAr  }lM B  @H/ TtȚ(#RA$Qm%[]"[&cqZ'f}V(r")yW+h-KtKt~L$Le\ȵZޘXVVtNUHՎ<%tmϰtK2L ʤځ f۱ oT!U<^>ۚ0~_8W %XA K 4lREjI@>HT(@6 r`Mfl T=8PPM`gC9PXY<Oz`<9Ohd ]CFېQ7dVUu^DE@B˽Xm'58 )s ߠ7*rӊb+,d3 ,Xr1]cX|1_c X1ac1X!dFYWfl[FѭiFUlHERن޺oG!ro3vqu){tm@P%>J_ daMnN@j~6.ef` Rd0a"`0"^`"\P$Z #V0S0Lp2r2Ae8C/E&#s@H cVH2$# kcrtw5v!u&lnp0stv9w@'y?z(|(}p'%EU6 2 R r Т 2 Q r fx -7 `6\r^@bP3eB^i.k`m .qB/t@/u ow oy/z@}/~//AAAA`333333000//04/p/@/`.`h.x!{c} d@62Bfufilo ! A Q q ^ ! cA q f  o1 oa o r r r! rQ o o j 0 ߐP@p6p>`6 Б3RC,ٓ#ߣiءLǑq^QjSABApVE A/& o# 0P@[@)P)p' @'9 ` &(6`6  N9b , ,R Z Z Z7 Z Z Z Z' ZG Zw Z Z Z7 ZW Z , , ,BErEErb5c Bf o  ! kB zs ǁ R  X! 2 R b [ [ [ [ [ [ [ [ [! [1 [Q [a r ݂ ݒ ݲ U ! 1 RQ Ra zs z k k L!oClSafcB]c ':tss ([RofZ#Z0 Qu #&EQAe(E? T jEqBA/E&rnpVZ2*ZZfoqCr{¢ !qLk~-s u0wx z9{ } ~??((((p'p'p'p'0 ^K ^k ^ # yQ rq Iws7(6,*kH_@c vfpipB^l.n4q.r3t.u`w/y`b| o~p// @@@04bbbbb/040404 p/p/b/`. `c*E$ БP ) 06`6p>6O &p@  00````````͔h4 pp&(O6p>`6 =>r|y1S=z0R{0 =|@} }Q}}6}P}|7|zxu@'n )JP`to3hE3o!^qO6",(a[R$b ) ': 'z E ER E E E E" EB Er E E E2 R ' )*)j)e"`"`"g}rWT i o $ B a O k ʱ z R R! 1 Q a U   ! 1 A a q ı R R R z z# 1 kB kb q ρ ұ L o l#3Qfc]3jW A)(u(t`s`z#L! $/-rkJBE"/AbVKRe*bA/b'ZJ2 "- Lz݂fr21rQQ/vx y`{`} ~ 99   ]@'@'@'@'@'@'@'@']  9 `b0ʡ oS f# M2Bsޖ{3pr`u.wx3y|/}/eb o o o rrrrr r> r^ r~ /   E r 8 LC 653ƢLT-x@lE}!`ͱ ql$n@{T5ae\!DE\R1P 9 ),h"t]8HQO9P tȀ \ H($J% aL)C<|6Z'qW}YA |\6 H|!"!!ҟ"1ҟ#Aҟ$Q_%^_&n 2>c,?b)Aw6D%(8* B(J. B( 1 ,C(J4R`(87"x ;6np" F&Ll>Qe1EZPTGoa[\!XErmjq[w]tq]}E_~1˾C/¸0B.Ǹ 2l (C.̐K3v㌷@-4CX#-0 6;m97󍮀#8RcRHwN!RG=h=4|P"H0 `*;|wCZ0:p ! ݡBqؐPe_2@J^zT!5aaHpa(X7. 0K1I( H"NHQ@= 0w1 `Ȫ- @?R ^Syڰ8LgɩCZ ) 1@ M# q1C\ KDѳF=D&3JD4Q1NT#HFR, I[`TZD%</b (*\k(!d{""&1b# Hb,0K%b `-&lӉx/ L(# Ȑ[*x [,FUQbT/ mC[U1FuQ)O3$ Q[`\6 t/߸ 8"C80K:u#;X?tÃaO@' VaAe[aAF"d:jA#2Ǡ~‡|rp|+ǤaO?xB GLv$QaGVOoA]DAbD\Si<OSoy͑Ru)>\|'|`O0)` -`* +P`APX'zgRl !p`O ks֑ciw!z1}Aa߲ 2 B b ߂ ߲ pq-l i! J]`O0%CJPgjRlRprt up"wly%z:QN:%=2@RCbCC % E e u  C C  8 =b 40N 7 9V P  I \|PR>P}O'Q O6]H.p'  pp\x88-;;;;;;--88Ґp  p'.H0)@Ok>`>#1Fd!1ATQe]qqfqlxsb+ A( @P`A +(`*-  `6@ >C|S $ ' 4 t  c 6 V  6 f & F cr c c  ''E'uddd5|~pAP QI0H p  1 R [q ّ ֡ ]   `1 `Q `a q w w w w w w #}'p'p'p'p'p'000``ӐHԐհ]װ.ٰ60)0'@QpC)P> !505p%5>!|(|`(|0({({'{Yow١sp L^e[UR3EX#XNCS=:B @23 1 0Tu50Sp/UU"!!p!@! !'0'p'@'(0@%BdkcQ?  ppp-p֓r! rQ oq .H.@O 5٠5,/e!ikn%qRsuw0Sxp"z#{5}l~Pu04#T__#$$$$$####T##pq#@#%=P HR{%i5G\c^ " 2 E T ]q Ӂ ` w i i  o! A +np@8@̐Ҡp`  ސ`p'.0'pT50=I0ER8ddqӑwiz~rsR  t.pE }r1`1Akc=I |H*\Ȑ`,IPI Va0k䭑FkdFl26JHm㵍,r"8&vNPo>@jȵWD %O4ЉOJ`*X8#,b},ǪE1-Ƶߺ e]wQE_),0(cl12+cpCMVk^lw nq-8Q rhq:KO) '70 a},v|l$ *V{zAbEHqv@&@jDd X̀ DJd5EV[deb#bmc d!&a8$ 4 =hW3p!enAze  !0o00H$V%fBLZr 'Ek( ʪ+`rLGZɌz <,* e gmstq1V$2b}X| 8H$jrȌȌ$5$)W%)g&)w2'9\(/*c+A rDeKЋ{A1Q _!z*#52 Ls,7^U a-dB&r`'~2-(B[W0h J1bLa ,@K2:. / / 0:2+2;sy4Osl5^`6nk7~ 8ڊC9#:zCW;k @  @&!k2"t!B\")"2*#2k#sD3F 4Aΰ=xxʀ #f\s8;hWC[`<2c;CwXT<:NQDZ1XLDt^X ~1cL$YD1hLNSn8NT1rLXaVzlO!TW4Nx [Fa 8tIrTV}E_bY`n08 /–aqa)`!d&Q_їfā^i,˩slT2ن[nw±=qXe1Q>u"3zSH?@~H0~X C~А?fa}0`ԇF}Qx )22u@xԦ2D~IUZRF1jQJZꟂRQ5RС|v@_~0U!(cS!B[p"VՈUAbU$bUX]"V&b WyUpU(V5 ]E[0*ӊPB0 --N1ƣE!:w 3i†:D J)p#Ey և  Z$i(!v%FH#DA"Q$8V ]K&ʼnDy"QH(`D bG"L@. }"z0r OCL S&0-X $JN.XN%c`B08& tB[p'V W"VU)bufA+xcłr-.g"s/2"s02Wrɠ2(׌cAW`5heXa#Vp7 m}2`8Sc9 ;9 ^8a;6xD-qQrF|kk1-G4 $^0b#:t O7ȃ (2ujba*w}s恝zwnV@r{J)r +,bb*J/c*Ę1,c*ΘJ4B X+6 }{J9y@c< %+ (H DY:1OvJS%TE\XVˉrfZz^p]gK/ } F_bz1^dEYrg8ΉF\QIjLn[lewo GY16rBG{QkvhG B+n=ZE5?@H0X C#w"@21#A؈9BB E 4 HbEB?RTRWr1@\_ace&# [  m(TQ`0pr)uxz>|}0 p**@@@@----e ! Q q ! wQ ΁ k ! a a3 X V>t[-Flp#)c"TZXRc+5 CI*-r2HH_E E# E3 S 0r      E 6 Hc H K - M# U +  ( S a̐a]?(.Pk!06P=@@ p@`*- **0-++@+, ++p,p,@9@9@9@9@9@9@9p,++ ,,++0-* ۠-@p @0>W1DbcR>>0p*qx2 " 2 C S f "d Fv\Sd@ߑmP ` ) `t r k1AI/.)\\HHHHH=======ǰHHHHHHذ\ڰ\ݰ\0H))0.R&V 1c>06PIPIPΡ α t ҥ  1 A Q a q Α n n k# A kQ a q ޑ ۣ  e ; #Bb"$T10~] 0 P p p`!!s*[!! 2#2&2eBcBab_b\Z*p/P @ MB Mr @jAZ2\2_Rabcre&# [ر˱  #A[ae!Aqasp} 1 A a xpp@  It A a k h 2 q a 4 ˵ NAm9P8tbw`5yR{p|]~kP&Ћp0Pcs - 2% 25 2U 2u b H H b 2 2 -2 -R x M  +2 T  & y u S@%)0)P>c`!@@ [ | -r Ӳ   2 R r  2 R r ͂ ͢  2 R r  ڢ 1Qqkc@00Pk6c00@@*`* 0-,p, oP@A%0#{tPD`Apn&$6FCbrӂ|z!ȸ|E ! ..0))))))))))))))))).... !OPk\0)0)q$ d  a  ;6 eA r ۃ h k 1 A kS nq n n n n n n 9\n! nA nQ na nq k ء ر   ! A S c q  e ; c a!Fa"qt=00Ri(PCn0 P p r*1b`!!i> "0"`"P&0&&%(2c###S0{S @%#`#2(40`04`"0""!!`!*p,`Bp m`t#2#aX˵):)~06>=krLpppp@ PIہ ޱ e S a 1 :0Nq˅" e 1 hA Q ks n q t l @*@@`*Z ***0-+++++@+@+@+@+@+++++0-0-*а*ZԠ-`*@p p00 4fek  ! ! 1 B R e p,9`Bp BNb 0 Aݠ A`0@:p9 +*- pPI\H*\0$@@q"%["u%җH`"$&d"l&2iiQ[EnUWQ#垞@vTMPokJ\@óhtB4$UP[E%5TUmV@&idcZkpk2ɹ&krɾ& lr&\l'k2O%vh _kcY 6JmFoi'!Tu~@3j `M `/ւ +BJ!Ba$F)\#NDV q'$P u.L\4@nc( P٘UNω's|mcWO3=c B-tBO O% :Ɓtyy|F<$ 2!%Ҙ"ت#$sN2g%s^ ɮɮʮYʜLʄrd@ n&2/ C1)@5m8i` kAkHXr|DdžvɇY}Gx!j"*@#UHȑLAP%(cE\/or'/2(/2)&2*!baYƴpAى/eh1#*c4fC0ATzy|F{`: q0!Fti7% ~cqx*a'tNbd1:N4BM.))x,*R"/*"¨H1*r$"xJ3L!x5 p*ި*r@Itx,gc&nN OQ)K+pH>PHDT!NTEcYXZW%ܒ`h1Z Ebr]$Eb|_$ Fbb$1a1d FY_fXj`VB)ېH7*|\8BC]h:<=ȄxA B"Ā QB 2 'Cs:Dc1D<%kJD[qEjQH $.уp8NX("0ŠA6p cF吪9cX;8G[䱦y<i =T;OГ=dݣ@=tQWL6ځLx8<aCI *2b+X"6n100 $LUh% iiBZU'b iBZ)&cɠb2h bDYpXt_OFe]mFWqA=C k6H+cS&b`0  # % q qא $$AـC@sܠ'@:9<8`' 80'*`]٤bM@@  ! T c 4ðŰǰ0~ !O(:԰IAB   2Rq1q9 &abH m  p! A b    ^@@*`^ݢŰưpȰ@@@}~O! 1 Q a q ߡ k  m!BVrgfBQsN'(B@n0bB q@C :8 8 -0P!p&@&( 112" >2#BAP T TB Z  D 3 R J -!3NVcdgmk`:!!8: @C q`B@ z@nJ8Vt`2vp"y|@&~pa"Aakr"O [1 A a t NT 8 UpQ q ĥ':1 R Tq OF  ! R  R  NC#ga'3RqcO).@0P)" )0@&a/_511G;UN      # C c N  ! Q3 e # ~ R 2 1PT  1 OA b `A-`8 嗠7+7 8!p8`'880@8 9 9 <<<''''<<<< 9 980@8Ҡ8`'! 8770!*`xOtg4.o#! ы)#7a +77p88 9 99 ' A A@C@A`A qP AB0r0r0r0r0r0rP P p`Aq@CӠP &C@s٠'@:9݀'8ߠ8!+0!0`>^ op 1 q ܒ  t^q ŗ|ͷIII-----010```ސ >\+0!~0'7L-F`4")`p_!&p. PPPT eGpvT T T!  w    "! &װ!ZB m &BgR rf#QCNs*C@n @@! sqA '`'0'#2c O " A V b # ' E ! -2 Jx R X 3b U  4 U 3 R; Re J - ! E#A#bNnp_p.@ 0'`''' p P eRUr%v`2y1{R}0~.@&m1 ! O@ u`@@Pp.p_`!P)"Wְab`12 U}m r8u0'wyz|~&@!P)  )0@&Pa//__< Q ! ! !& !F QS " F #b  ~ % B !qوW@n` *I-`ʸ#  " ~9 |S c s   v v  # 4 T s  # C S s   v v" 2 V s s  !TЁt! $p_ gz*s7h`'0@ 9<9: ' C Aqqp `A`A`A`A`A`A`Ap qq͠Π A ՠ':@:9ۀ' 9ݠ8p8~)BxP]qH*\D ODa,':h%2Y"k%RH^"}1a}<1e}QGjaĆQFna1\(㮚u\ۑzC`*°]Ff96I>@@P U2!%zZJ+uԺRJ݋_:Xja&XcN&zhfqv9ei Pm5gSm7< rpo5AVgyVmM! w=(N7^#|h Cb.8 Dl$e%Y%yI'd08JeL-D0Yc2SB4O^d6 vs7f'd8@c99Sc:"#:o3 (c;O4zd(υPwqtpǓz0Ǒ~92!!"-Y#A$MD^_ib&Љ#A @; @{Jضm KjPhdeLKcG 294B^syS>|vPdPǡwDz% ȱp6v4fbЫa |37|؉! ҡ = ҥ }  ϳi ``zØw dXMj| &UT 6|8#E$Q"%]_LT&tsX$EHVUpEJ)uJZB骼J\ҙ뱸2b؎ˊ,/<0 "1+c1##23z3;W4oMcz5i]:6\isT&S#91ޜA$E바4[$.>L(H` u-x'Z$ۅxbnbe" "1@BZErѨ]4R(a42F1"e@3P E#ba5@h \@6 qx7#`9(!p#BD"-' B"J*#-0b #H/0 #10R #2Ҍ@*Ґ4$b \C"ڐ6 |c,8@W,H ;->(xr̛`a/' 0W)s Ť1h +&2,,S؂3L.8 3/8 r&gbp9eadXm`d1gL&Fcj(bmf=`ao 8~їri@:ⴎ1AP={0iNv-"BLJAmh)ʡ#"FBp$2 Pc%D h1 ' i`pLp Ax-z(B ]0d*I`4bb#ڈS7 c0@8,CԘc:0`N\ٱBv`uWUxQMYBw&AA@P 4g"죈-0@ $#L۱Df0M|fh181p,0,`+^3jR q = !C2d!a````00#``%hɐ-@09ۀ~=EiE7Շ ˲88F109>P9 H! f i i 3 C oa oq o q q q q q q q! qA oQ oa o i i{ c1 \A W   R$i#3P,͂ l9C> p}$# l1 oA S s + Y  ( B' 4 "T "t h      # C hg " " B (  $ B S s o p09@'+`G q 4g:`:i ٙĐŐȐɐDj:`:oq owqQ #Cd+CgYV$BA)G F  w H*H`-.S *$B i+$\%ӗ_2XHc!LrYf!rZ,՞^mmVYfpQ,g pX.^/| @a~c,L *,m Nb0 Qi:p TnD*Vak,:hPkٸf뚽;|580fMlvf#lV7344BO Ms596" q]Pb`:V,JO E19՘́(錨v 1j4@!R` x#5r$E$U%ab&mZ'y2'2(\)\*\+2,-b.2/mfdVeܷL84\i 6q~I za:>N ܃?0P%p5L3Z\L!>2 H'%4B L"$$I")c"d&TdcMz'M2e,Y)eRv*eRv+MҤ,MҲ-Y.R40L42̐p5@^6693ylI*MEDFASPYEZqXXEVUla\XEVU|a_XVUacXVIUaf\EAjPEQmDjZC!-x :.Ћ)ޓ̨B=L+<|"4 -LS 4 40/4j`FiabAhefjghl&FfjX}qmDc+p(G sP@R!!xThTDH4E`7KDC"Ȩڌ2qMDO=O ),)d bk(+ )b- 8pc'k]!hm[߮lICo OGDqqh+#]ˁ2s&:[Qa*=0@Y1VAf3Q+EjSmHld,aLd&фg8/OiBaQ9iRaU43M,L3 j)_.< 0'ddgba k ↄaANUEae|p^p. 8BAf"v 1H $ MhP%pw eH& NIPRR(JJVV( JhA5[H z_JFAd@3lp2EAv0*KrGdd%f50&P (ql^H>APMH@S(EBERr aXp6Ŏj[ *Šv1^ Š1(a *#dL;\FqCg(ړ 7']xH6 A%OJFw]> ʼ:ZRUjZfZDEDv^DEDaD1FDdDdjiZhejZq(lJFQoTt!.R/ ;o0FfF~YNx@"b&ĉ]}"a`Op ` b & &1 A Q a   1 A Q t   2WUbL "ce;@V*k"dp)P2 ) eWMpC#@=@@44p$ 55$P6%%%%%%%%P6$Ͱ5 5p$Ԡ44@=pC0(pW e2P2p)d);@)!}@*` B@f  ! B Q q   1 Q a EP! q`  ! A q  2 We  c  7s7 `x!Pb *%(Rɀ*}!oAaq?7> @ 3 D S Ds E J  L G # 3 S s      3 S Gr L J G  C s p  ;C 9 ? L29H `::% '`5$R#XLs  x48@4< ;  @" @3 T S@p@!8`O/JS } } z! wQ w t t t  7 g w ZyPyPyPyPyPyPyPyPyPy@@pppp۠MN0#0#PN(W 8/b   2 C r   1 A Q q  +pb1 A Q a   1 A Q q  S W2Bbc%bKPd$!P]0"`""")#(MpHO 2 7D s3$P$4p$ 5555555ð5Ű5 57p$Π4@40$$֠=pC0(pLw yR"2(2&B#RՕ"P*+BfUcu=r!+++`Op0   #!0pp@0+ ǰ` ̀ 0*@1V d@k %1(d;Vy{P2}"" (Npp0(CC3`=$<8@0$<@4P$P$44@;;;;;;;@44P$P$<<@8Ű<$ʠ=̀ҰCC@@N2` !J  k ~r e 3 YC 5PG L 4p4P$88<< > > > > > >" >2 >>` 3?yJ=ʀ? @0$Ӑ8հqL P cs҄!p*(0#NNppppppppppppȠMNNNg\2#PN(2# e~pW"9ce    W " B Su   1 A Q q qu !~0Z1 A Q bp -b a0  2 B S q S Q + !*cp!*P1*uq*V% m o q s + 0  w ! OA b ;t 5D=sC D# J%y$p$p$p$p$p$p$p$Ǡ4P$@4@4zk;t 2 V  w y R +("&2o5ե R{*~k*q8QxBc  Q> R a S OA! 1 QaO a $ +0İ+` Ȑ ˀP+ +P!@dߠ*㰔p*0u!~]y"{}P20)) e0#p0(`3C3@=@=$48@0$wOsKB4A]$P$P$D3 DS Ds C2 s$Ppm3pCe0(Q ٍ)` ( c 1 zR P" r2 cC S Ys T R"!844@44p4P$88@4@4@4< < D# DC 8Ɛ8P$p4ˠ4̀;4 87@5֐506%+xw P%7* ߜ5 5Sɟ4;% < $ @C @S o@kE=@=@=o  3 Cpk $ǰp@ C  G3 T s R cc HT @d4OXjSSyd% J*Y+[.q j f\si%2\.s̥cW |؉ erOD:@'̘ E\T(R( +j )&R'Ȳ \y%.\/\å0\1W"s2T2#3PF Ӱ5` MM]ZMM;ʐ(f@=ԇ$^@ 0 !"r`Ȉ $EIL %Y&T i khqk mVnnnn6np mжwk&LjX1%29Y4Rs5 j~9.L8"aPF!kJS&QkX!5x -^c g5`.RB_ 0BSw3 34 ^I#W԰5NuC8bȤv1<0"P3eÊ@? I0%",,&# Ihk%v $]BOX&ĉ&uBp'FљňBJR)d *J* *J,T *BJ.ӋJ0NbKJ!4hUFΰ p8xyÚQ\[ߖt0]'p8\䁡( ؕ)nAw"+ Bx ,7 ByP- y`/ a0+ϰ"4M,H# ̂4З-L 4```````````@@@@NҰ נ+p pݐ+`+@TP!T!R2U"pUc`"~@cc7&)PQV #P#p##`jPPWpWW'$$$$$$$$$$$ư$ɀ$'͐WpWPWPP` #p#P# #PV[U"\*@:`"\,H % B IU r    $ 1 Q q aO'd``.  1 Q  " Q    S% R#%b @8FFc\?&'C)S+s}%5 5 u5 CR Fb @s } H H z G I w  M2 C Pb Pr P  ! A a P P P M w K2 KR z H W30$PjP߰#M9@HFu+[#::@lpP@P;P;l;;E<1;b;F뒡es4 'LҘ4 -0WRp\`Fۅza1_X0,&#ubXR^ E$ lb0'"b/K* B"H,*2Т"-Ғ"-HK/#-H0B"ƨ2*,"̨3$ D.5b\c/؋6tc/700L9s!1$;C2=zta,;Ia8&@ V}B( T AH* @pM,`3 b6-fb6M/f lX av6Ƙ ˈA g( Fj0;!mjhohG?qr%R1Aw(Gg#>׏BLS(=RŏV1HV{] Т$M;N/;N`Q=#7]gFqQj8RCq>l1))*0?*S r **/@N` @ d 400vbGvh7v  ! B b  " 2 b  " Er0sAٵ)8{ t! 1 %Q ,a w - / W 0`\2 ^B zS v  u u A ? ? ?# ?C ?S ?s ? ? ? A <  & zC ^b \ W i# QR O w /  Gc s#kT*9`Me@>i:0jvj :f€Ő:ǐ:e`i4*ḑU^N _N0p>yQ B  1 Q {|ðİŰǰȰʰ˰~{ {U00```` $ $0H0H# 99K1pQs]H1,R"p*O*P!/@! `?  2 R b r       I @ BXwCH @ p a[Ku[ N!@ +P!P!*۠!!p* "P"!"+Aeuc()@ 31##90H $`Eitn  CDDPDGP67bI B   :"  ?SrS"ce 2 S c % ŵ   ! 2 R tNu T W" 2 R b/͹` N! +P! Ҡ!0Op*P0݀0PPᰠpV Ip) 1qAC`1]]#9@^p'2 2088p%p%%%%%% ` ` ` ` ` ` ` `7bLcr&\2 WR 4s #'78%$p'$PG"7HP]TkU!M9:ee@>P:`   1 A c ^ \V2yl۶nl[j&  $ D q B B  010000000000000000 ~f`Ӑ $@(B !Cc=r=Ս##HH1#]~@` aj  3"  1 Y r X!/ +!!N  " 2 B s !!!N'OB S*P)\ D\ "%"Ʌ"\ eE;J 31#pQ9#0H $``O)RIz Y ``0H0H9#pQHΐ1340^9h  11 IpV*000@I Ӛ* #b r   " B b C N!@@ +P!*͠!0OP\@IP0ۀ0PP߰0 u) B0ih41]##0HA{a tq   % , L w O -# : /S Sb Sr 4 W W  \" \B \R \r \%%p%@3@3@30%082P'O 'L2 /Q % cQ pQ13kW*೴೵9e:eeeeeàŠP0BRנڢ}H8<'u@a@HuJ2 KY,iU-rrԅ^8}`8$Xc,TrKf,2Zi%VZGlu܆nU \EqI,\<Pǐ=g{pO|𑰳g t&?X Q'<pJHTf@+`h9| fr\5芾+:辢XtaчE'cʑ)O6\pfÛwZ pOMͶ\36&M lZ7" |8 jd@9C`Nb`0&BKp,"Q-݂..,’/,$K$ F`T FHtD0 C@ɍ3h c4"$ILB"%VhUȉjkJl8mV}p q(r('KtDWKtDt@//s01!s2+mMl XM@j۠֍XPW89 f1Y#(tX$IR$"URR% Dߘ d36tRE2MF 45)`2)*Ȍ*12, R ʶʹ Ƚ ȿtL$112+㌰ ;sp4Os {;x@7DS8"dwAh}& {jqћ"FK/x7$Gq`Foj'7G.yE$]&u'(R*댔*,,ґ-Q.R/%R/×LIt4LGtdLGtLGtLGtLG` F`D FTdMETMEHčDHC<_6CfbP:ɴc2<2Cl,1``"D@Q49RŬjm\XfEojћ[pv1^ E8 1zSWInfqm1ifFk kn 4S9*hѤDS; KF-s !`.$ B"D!a0d )Cc@7"C#I˳A $I :UDS& kmP'T }A4b6*l ciEo`ћXfpl1[ 'aކ 7M03#Xư 20@pM44 UC5׈c6渍 vcOQ85[`,j9#X.a&JTDI2Q/M4D: x_(&Gv h*"ƊbX,,& "c-2"cY/, b0"VaH2 :4zjn FֺQo$#_!̐ͬf7z$uDf(L4C@!Q9CRUHiD`QYTd*"/*⋊¹FEQaT1FEQdTDYFEfHD!j<ClFCo0bјq@1dΑtXfi?PCrk%HqZ(P# B5` * װ5(+bb6M-ls 6.l 6@ma`f!macIl1eĦE4\# LAh5 t `C5وc(oP4ؓ8*8>@Y$kE=^ze^z e^{Y1H"#2H6hTQFFka %Cn0Lȶ۷piNxZT %) PUx ! ֆ[qqxWkPC-418|s./̌3 Gk<j!6 7)-py0˟O_p@Mm"]'}^(݉(Ց)ΝX*B*+Y,͂-ق-ႚ.k@m SZns2)C3Lc,& bf` _ @r'&Bs&mR] <|'`0939X8}7!ʊ7 < 7̲fr-r. r/C0h1h2*%3:h40 y ;ٹ67/k)Vkfvm~U@X!",͂Q-ق..Q/B/Q0 112)Q&?tCh< 'vy'Z("*إR*+Ҙ,͒d-..BY/r/Y0 11Y2)213AX4MS5UCew؀wqe7\~S 8n&,P'Y'\e()ݕ)R]*++,rY-r.r.Y/e\&eP546ʔ3E4Q5|]36ym^7" w}K<}%Iʝi :J*Vrŗb%Y jl(\ *x^ DT0% DK 1 *W3 uNը5 mcM 7HL&:P\KВ)ƃ /+ Ģ0,Sb1XL.b1X/c1X0Cc1X1(:3 @;4C Tc<06 .y;VJ^ b@XRA_RU`giEu\Xl1p-cܢ1h.1h/1p1c 1@$0I8xJ-aKڰ62! 􉏀%X(7dN) "O* ?W,5 BP- ABP/ ABPT05 @P2 >-#Oȓ3:MXH5ڔ {#ZJֲhMZV@ zh( T"/В* <,3Ԣ;. ;N/ ;N0# ;1s ;2 8/O4# -Q#/5 tec@l J @D!Wb=) b<+ҊB0,3Ԣ:.1@L/ 103„6HA`ѝe|ql3 .Шd܃@!(>2bM)䑘dX*Ŋ;†S,' тO-t ?O/ ?O0$ > ȓ1 *N V3 8IӀ_5z d*E6pZQ )JETVpZdYxp\Gxz_xag)x1cQ%fh\Q ivƀ [!"Rsb ."/R+/,C.lw~ѝ`tG!_c3ӌ8cFd &B #x)5~ 1+ 8X,5 bN-l †/<†7@0l(;X 1 c)NHV36Iëx5>" ϺַuH*\ȰÇ#JHŋ E eZ:@n毛n)氖Zky%J.+Ld8# Ư`ÊKٳh'G *J$TjnJR\sֵg^}5`&fc7T֒f"}uOkM[@@|T^z TKxhA-w® ;/콰 ;0N1ǔ'SfƝ 覆h& 6F(F@Y`(!Z-."R/%R/%#R0 01Y!P)DP %+"+Z,"R-%բ-0KKKK-Ӓ0-@1*2"%#213Aӕ@4id >/Jop 'q W rwr(r(Njr(0 \12%321ӛ3q(m *k&6Fˠ ]! ","P-٢.!(/'H"$#x@@( iE[Wn6KoW pp p p p p GLwLon jFl8<@h! ".".! @/R@@D@b#2, jm!(..[/nnF b5F[2j7G.WngH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxk3 H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶ۓ BMBMDE6E>$@\x/EI]wFA"%&'!'(=(*0K:RHdYm!#_֘y:&**+,+,H-2;HYlINX$2Y:=>Q>?m?@AA%a=% 1Q/ 3 j<V  BKH iC'''gdalautotest-3.0.4/gcore/data/classictiff_two_strip_be_short.tif0000644003401500001440000000024413614004466024641 0ustar rouaultusersMM* Sstgdalautotest-3.0.4/gcore/data/uint16_3band.vrt0000644003401500001440000000465013614004466020603 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 testvalue Gray 107 byte.tif 1 testvalueBand Gray 107 byte.tif 1 testvalueBand Gray 107 byte.tif 1 testvalueBand gdalautotest-3.0.4/gcore/data/test_with_mask_1bit_and_ovr.tif0000644003401500001440000000234013614004466024023 0ustar rouaultusersII* S   . dSp 4<S&>>>>>   @Sgdalautotest-3.0.4/gcore/data/md_kompsat.txt0000644003401500001440000000031313614004466020540 0ustar rouaultusersAUX_IMAGE_LEVEL L1R AUX_PRODUCT_LEVEL RPC AUX_CLOUD_STATUS 1 AUX_SATELLITE_NAME KOMPSAT2 AUX_SATELLITE_SENSOR MSC AUX_STRIP_ACQ_DATE_UT 20070501 AUX_STRIP_ACQ_START_UT 070000.000000 LICENCE NULL gdalautotest-3.0.4/gcore/data/cint32.tif0000644003401500001440000000672013614004466017457 0ustar rouaultusersII* k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/byte_ovr_jpeg_tablesmode1.tif0000644003401500001440000000270713614004466023474 0ustar rouaultusersII*S[I  0 `C    $.' ",#(7),01444'9=82<.342N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|  BCDES[IjC    $.' ",#(7),01444'9=82<.342 *S5t!1A2q?ėlYK-1w敧JҟN}K)O_ٶ~דs{nac^M?ykɹ=y70籯&5Ƽ~דs{nac^M?ykɹ=y700_O:p]OicZֿBJRRRT֗r_SZ]kKUMiw/ꩭ.U5ܿT֗r_SZ]kKUMiw/:Z[\CA |byh Ggdalautotest-3.0.4/gcore/data/byte_zstd_corrupted2.tif0000644003401500001440000000110013614004466022520 0ustar rouaultusersII*PfS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|X1nW"*}:/D_]J$(*:%x 7\Y>_Le ]#/ϻ^{D"#[N*sÎ^صȌxVbg8[k8-*DCѢȘhԵm VuHYWms#뺌 <=0@J!iM ` "C 8'Qwp$egdalautotest-3.0.4/gcore/data/testserialization.asc0000644003401500001440000000016513614004466022113 0ustar rouaultusersncols 1 nrows 1 xllcorner 0.000000000000 yllcorner 0.000000000000 cellsize 1.000000000000 0 gdalautotest-3.0.4/gcore/data/mfftest.r000000644003401500001440000000004413614004466017635 0ustar rouaultusers?@@@@gdalautotest-3.0.4/gcore/data/testzip.zip0000644003401500001440000001240613614004466020075 0ustar rouaultusersPK )@subdir/UT ײOײOux PK .@subdir/subdir/UT ײOײOux PK.@psubdir/subdir/uint16.tifUT ײOײOux }S=K1[SbFmD;Qa  Z3V&喋ݕX\y#, N^f׵qd&36m22dIXr-XD5#ï5fqXR7Oq:Fr*_3Dq#ѭy~}qCom {Nr~v\_&;PK+@#!D^subdir/subdir/test_rpc.txtUT ײOײOux ;o\7 .8wrG&B 'E~~y%-qÇۗW/Yn]ӧ|;|ޏ _oI[oOwo~~-m=Onޝ:.vAvLSq>noM3]p[ #oDnH̠ "FHq)>!T)B%" ,$|y5 4W(edH`&@٣L}UuD2$Sƹpv.Hϱ7$sͽBT ڒaVc y}R)ZY-c^v/s2eLyvtt%;D9+aЌѢkHSu5b2D(;5Zm9nVW'c'_Aޫ)//)wqeP"l+G (]6޸o-3'o B-3Jp JCˈ9$L Qp1<يʯ>4H #R*ɱ>}TlzyA XJ@t.H% ”K9$DtIAE;\ے1CR6. e>-W¼$c薣Q5vSƢ]// t-S[TB U1BPA~3K0&T&PxbܱAmcqw{ii}DtfcivZ1 ZL`d;tyl]!]悷} -noM3]p[ #oDnH̠ "FHq)>!T)B%" ,$|y5 4W(edH`&@٣L}UuD2$Sƹpv.Hϱ7$sͽBT ڒaVc y}R)ZY-c^v/s2eLyvtt%;D9+aЌѢkHSu5b2D(;5Zm9nVW'c'_Aޫ)//)wqeP"l+G (]6޸o-3'o B-3Jp JCˈ9$L Qp1<يʯ>4H #R*ɱ>}TlzyA XJ@t.H% ”K9$DtIAE;\ے1CR6. e>-W¼$c薣Q5vSƢ]// t-S[TB U1BPA~3K0&T&PxbܱAmcqw{ii}DtfcivZ1 ZL`d;tyl]!]悷} -noM3]p[ #oDnH̠ "FHq)>!T)B%" ,$|y5 4W(edH`&@٣L}UuD2$Sƹpv.Hϱ7$sͽBT ڒaVc y}R)ZY-c^v/s2eLyvtt%;D9+aЌѢkHSu5b2D(;5Zm9nVW'c'_Aޫ)//)wqeP"l+G (]6޸o-3'o B-3Jp JCˈ9$L Qp1<يʯ>4H #R*ɱ>}TlzyA XJ@t.H% ”K9$DtIAE;\ے1CR6. e>-W¼$c薣Q5vSƢ]// t-S[TB U1BPA~3K0&T&PxbܱAmcqw{ii}DtfcivZ1 ZL`d;tyl]!]悷} -*_3Dq#ѭy~}qCom {Nr~v\_&;PK )@Asubdir/UTײOux PK .@AAsubdir/subdir/UTײOux PK.@psubdir/subdir/uint16.tifUTײOux PK+@#!D^subdir/subdir/test_rpc.txtUTײOux PK)@#!D^Usubdir/test_rpc.txtUTײOux PK@#!D^  test_rpc.txtUTײOux PK@p puint16.tifUTײOux PKZgdalautotest-3.0.4/gcore/data/uint16.img0000644003401500001440000002430013614004466017467 0ustar rouaultusersEHFA_HEADER_TAG@RpG rootrootXAAG RRLayer_148752500Eimg_LayerXAA Ehfa_Layer52500Ehfa_LayerXAA0 n0Statistics52500Esta_StatisticsrsXAAR@o@)\_@^@`@@X) 6@Z<StatisticsParametersEimg_StatisticsParameters830XAA+J+J +J+JDescriptor_TableersEdsc_TableticsParameters830XAAVZb#Bin_Function#eersEdsc_BinFunctionrameters830XAAR@o@K?@B@L@O@P@R@?@8@(@@(@@@?@??{400:Sdata,}RasterDMS,.R IMGFormatInfo00ImgFormatInfo831XAA k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckfo4RasterDMS52500Edms_StateXAA XAA #cMap_Info52500Eprj_MapInfoXAA+UTM7ALAOALAgN@N@metersProjection52500Eprj_ProParametersXAAUTM ,? Clarke 1866TXA333?XA^s{?fOMXA`+Datumtion52500Eprj_DatumametersXAAhNAD27x nadcon.datZ Histogramion#eersEdsc_Columntionrameters830XAAZZHistogramParametersEimg_StatisticsParameters830XAApJxJ JJR@o@J} erType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.gdalautotest-3.0.4/gcore/data/byte_nogeoref.tfw0000644003401500001440000000002513614004466021212 0ustar rouaultusers1, 0, 0, -1, 100, 200gdalautotest-3.0.4/gcore/data/stefan_full_greyalpha.tif0000644003401500001440000013734613614004466022724 0ustar rouaultusersII* (RSHH V@_B)   'nn    n)n -.0"!6JNDNC4/+$   n&%(-)!DbkfdaB1('   nn/!34+7qtnbM7-0,./02/%(" !Znn1. ]0d{>'%'$,:DKkygKCG:." cnB Alm=&%*?Rd|zmR>2'" Bon=  %8GQ`kwUJE4&%! q   #,?F^f`[\OJ?30$!   Ew0 &.1<>JSJDM[J>4# 445554431/-+(% n JN$"&-;9A@PcVH%259<?ADEGHHIIIHGFEC@=962.)%  n =kG8"'#*:FEPJ0 49=AEIMPSVXZ\]]^^^]\[ZWTQMIE@;50*$  n*%# !Vw'#M%   7>DJPV\afjnquxz}}{xtplga[TLD;2(  &% $  ;4;CJQX^djotx|{wrle]TJ@5+!  '!# t8 5=FNV^ekqw|}xrkbXNB6* ,. (% -! ?GPYaiq  zskbXL?2& 1/,""+-.b" BJR $#~zuog]RE8+ 9:8<=F@EI"*7/(&  $&"~{ywtpkd\RG:." !OYkffjaf7#2  %$(%$ +#yvsqomkigda\UMC8,! n'Qpt- 6^R2 a^\ZYXVTRNJC;2(  Ct[0vz'JHGEDCBA>;61)" 0SZ[u_'   643210/.,)%   MwitehX  RMIEA>;852 &$#""!  Do}kovi  ~xrmga\VQLGC?;851/,)&#! P~v{|  {uojd_ZUPLGC@<963/-*'$! bu 2i: {uoje`\XTPMJGDA>;852/,)&#  5h|Q0  xsnifb_]ZWUSPNLIGDA>;741.*'#  C{}s]"yuqnkihfecb`^][YVSPMJGC@<840,'# 0hxjF( ~{xvutssrqponlkifda^[XTPLHC?:5/*$ 0nn MtaL9$~~}|{zxvtromjfc_[WRMHB<6/(! I5qlXC6! }{yvspmiea\WRMG@91*" ;zrVpaME(}{xvsplie`\WRMF@80' 2d@n2t\Q.~|zxusqnkhea]YUQLGA:3*" *n^7xlaB }zwurpmkigec`]ZWSPMJFB=81*" Ic^2}lW}zwtqmjgda_\ZXVTRPMKHEC@>;951,& 3pY_yj(~{wtpmieb^[WTQNLIGEDB@><975310.,*($  Z/n7gGxr=  |xtqmieb^YURNJGC@=:864210.,+)'%$#"!  vM)DnQ|97[}vpkfa]YUQMIEA=:630-+(&$#"!  KD3nBp.wnf^XRMIEA=952.+(%"  35gj qRo; vj_ULE?:52.+($! u-n9vd  qxF yl^QF<4.)%! P$enH wY^/ teVG;0'! `B8l $&&"iwF rbRB5)  z{iUgw ").1/*#[xa scSC4( 9=iwPXp8q*/3>CFF>2/% Hg iXH9,  ncZ r_ap">U^knyrmaYM[Q ,% qbRC4' /r7s kTN§uEEjhYcgortvtvrt) m^O@2& TcN'ZEqj% ) yk]N?1% Aih^ |"F@0_]& p_  yk]N?1% =Xe&?JERblhMA4# 8|,  yk]M>0$ (-&#AvlV;,YMEz%     xU yk\M=/" jT8#4'qFZFSl#dC &T ./( |l[6u^HhucjIWk:-n) $J7UvrL*($( !#07'  =ZA@g,d`ca~Wo/nUscP5ney}~i- #x>lznp2""     +HmemlX]=HdyhL@3J=Ui``KGRIU\)*(DV`;_y}f     %$-324GDP$!KWVPQSa`aVO)n`\l\GL\HIB87oP13SPD.EkvaS "-?Yif\K,    % #'"1/''#!-AID-)@F8WecFIHe`qmwaIOE,H62-/ MSHnG{WKRu6!kjjr QN  (& *(//+40@/.).3MEWKO\jVoOM !&#!1*"!+-#.() )-7(956:083/"L1+ #3z=A9H8)^``j r,%  '( ". )+#'&%   $ (.($%,$-#'(60" '0 r< :;::JMJHE[^Q 9xz.      OK#!*'"1 , (  ", %!$"  JMIFT"Idujiaa+.YaW*AU`r3     N E$ "&&4 * ,  # .v O rqV&=qza[LM4IVZZR >;6/' r:XaA2NOXR-2!{,[   F81#&&  uh]UPPS Y  &A&  ,0-)%!#(/6>EKOQQMG>4)mT//sZ(@LB,>j  iB    P!%# tkebbek  )"/ m c YPHA:51-+**+.39@HPX^bdc_WMA4( [O{S1 1AI^\ZUJ?' D@sz&]Q3`4   <)6 zussv{ 5 skb[TNHD@=<<=AELS[cjostrneZM?0#j_[L2*3100(7N+w! %:ZxgW>    ,  @ztmgb]XTQPPQUY_elsy}}xodVG7( X%#e| :bbRVYRY]\\`Y8B11oFo~U# "    8,}ytplhfddfhlqv{|th[K;, k>JFLqqJGQZ_^c^[D"Ua\Kd{x2 "    9ET}zxwwwy|zrgZL<-  g2q&PTQqfiZlX^Z[\UNNIECAA%.3rUPyqo^SY} 1U AKY`!  '@d-|uojgdccehmsz*{tkcYPF>71,'# I;,32L5dyqo_Pxkv)[* %;>FUk`  *|skc\WRONOQTZairz}vne\RH>5-'" ! (469m bxoeiNif# &0 (=IP=OlzU   xmbYPIC>;::=AGNW`jsz~xqi`VLB8.& )-5;Gp4 WungQZx "(K =MVMAMatG    vi]QF=60,)()+/4<ENYbjquwvsmf]TI>4*" 4 Q?>:7clw$ F{r_gaHi4&ui#9JTTR@M`zt   xj[M@6-& %+3=GPYafijhc\TJ?5*! LY.#_f;:9DbZlA$##3umc^F]{ 5'@+-GQOTGAZu ~n^N?2'%-6?HPVZ]\ZTMD9/$ :\~BK&>?5R@4=.mZ(_wuh[KSnp 8+%u %=KHSKBY|7 wfTC3&  '/7?FKOQPMG@6," 2a~iF 8B97/#!_zzH !MvvjcNPjP92-GP3ILRLDQ~$r_L:+  !(/6<BEGFC=5+" 0i1$=93+" 9P{ 80Cvpq>(hnH[rA@74Cs8JTTHjw ~lYE2"  "(.36650)" 6C~ & .rvR 8OV|U=5,h# %NWVKkR~lXD1!  #(,..+&  9S^S  jrODg_}Q:3Dtc0JWMj9  nZE2!  "%&%! D[J}  Lu6J}frF93oz;ZTw{ p\H4#   AeXk F{"3gnpG4Nwp#JQpcs`K7&  #aa^ #vn0Oh>9mlDRy, wdO<*   nIeQ- R` %I0Wc!I_W {hT@.  -pS, &`lmg,#:?ah?Ih#mZF3# ]dx,j"0g[q+=;/SdQFOx s_K8':po-9b I^"\XH?0G^m}zy{~LzpfxeR>, "kf'}H5I^r6R4E5A]j|upmmpu{~ti^U }kXD2" `h$/z#5I^r Le F<8Ukxngb`afkry~ypeYOGq^K7'M| #5H]rYL|yxz/G5Ze!vj`XTSV[bipuxwslbWLC weQ>, HT #4H]q-nZ|slhghl<3U`vh\QJFGJPX`fkmlg`VKB; }kXD1" , F$ /BWk}5xhYJ>6114:@O<gpy{n^N>2)%%(.5=DJNPNJC;4}kXD1" 7  ,?SgyqaPA3*$#%)><70*'tweQ=, %6I\o~|tgXG7(3!)3>KYfr{}uhWE3$")/4651,&"Yjz|kWC1!  !0BUhw|ywwvsmcVF5& %0=KZhsz{vjZH6& $(+,*&!$/=N_pq^J6& +<N`oy|wqlhghiie^SD5&  $0?N^ktxtk\J8'  !"!&3CTfvvcO<* &5GWeossng`ZWVX[]]XOC4&  %3CSbmsrj]L:)  )8I[l|zhT@.  !/?O[dge_WNHEEGLQSQK@3&  *9IXemnh\L:)   !.>Pbs}lXD2!  )8FQXZWPG>8458>DHHD<1% "0?O\ehdYJ9)   %4EWiy~mZG4# $1=GLMIA8/)&'*07<?<6-"  (7FS]a^UG7( +;M_p|lZG5$  *4=A@;4+#%+144/( !.=JTXWOB3%#1BTeuwhWE3$  #,3650( !&**'!  '4@JONG<.!  )8IZjwynaQ@0" $)+*%     +7?DC=4(   .=M]jtz}|ytlbUH9+   !     #-5983+!  %2@N[djllhc[RH<0$      $*--)"  '4@JSXZYUPIA9/%      ""  '1:AEFEB=71*#     $+0342/+'"    !#$"      gdalautotest-3.0.4/gcore/data/utmsmall_2.hdf0000644003401500001440000003260113614004466020410 0ustar rouaultusers j\ '00<1!171;<1w!j111 12 17 2+; 2fI 2F 2 5 < 5E;NCSA HDF Version 4.1 Release 4, December 2000k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭Δŵ{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť攽s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ{s{{kssksc{cck{kcccsZ{sksskss{sc{{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌ccs{kksks{{k{kskscskkssks{Zֽ楄{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥc{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭk{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽ŽŭޥεkkZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌksZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭ֜{cs{Jsc{ckkskksŽ{εŵν֭Μks΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό޵skkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭΜ{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޜZckcRss޽έބε業{Z{k{ŽŭŌŵŜŭc{{kޔŽť{{sR{֜{s{{{sֵޥֽs{{{{Zc楜{έ{ŽΔΜc{εk΄省ΜΥsks{{Ō攜֔ŔskޜŔs{εޭńŽ֭ﭥ{֔{{ťs{{Ό޽֭歵Z{ŵŵŌťŽŌ{{sֵŔ޽ssŌsνť挥ť޵޽֔楥{ν{ŵε潔޽朔Υ{ֽŭ֌攔ք{Rkŵޔsks{ZŽ楔ޭs歔掠ť{k{kscsc{ť֜c{kޜs{J{c{Rcs{kΥέŔťŵνΜsk{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{k{{Rk{kZ{RťŭνŵΜŌks{sskck{ֵŜsZŭ֔εŵεJkkss{{s{c{ŌޥŜsk歜֜{޽s֭{{{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔s{s{c{ks{s{s{εέֵ{{ssss{{kskkュ{ssތŌkckckcsksks{{ss{{Ό{sŽ歵{΄֜ބksckkk{{{{sks{{ťck{޵޽{έބkksssssc{kc{ccsބŌcsޥŭs{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŌksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭JkJ{kRZksRkkss֭kcŜksέΥ޽֜Zk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{scscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭Zskss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭kksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽ:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތ:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜s1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{Bkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkc)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:cJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkR!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsZ1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcsBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1Bs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{ZkccBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{dValuesfakeDim0 DimVal0.1fakeDim0Dim0.0dValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ddjjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 utmsmall_2.hdfCDF0.0gdalautotest-3.0.4/gcore/data/pixfun_diff_r.vrt0000644003401500001440000000135413614004466021226 0ustar rouaultusers Difference diff int32.tif 1 float32.tif 1 gdalautotest-3.0.4/gcore/data/uint16.tif0000644003401500001440000000216013614004466017475 0ustar rouaultusersII*(k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck S  *ZN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/corrupted_z_buf_error.gz0000644003401500001440000000154313614004466022616 0ustar rouaultusersMn0MV]$=Ee!TMYB#(9JOR~|ag~fqBBj>6Rj3zrםd]n u˯5o<;S6$#JW!0?#v4[<籿JOR~|ag~fqBBj>6+zrםd]n u˯5o<;S6$#JW!RDA2 A 2 133377 131840 1026 1 4105 2 gg 526 40 107 123 132 115 115 132 107 123 115 132 140 132 148 132 123 123 132 156 132 140 107 123 132 115 115 132 107 123 115 132 140 132 148 132 123 )23 132 156 5?#v4[~ꁫ_132 140 1026 1 4105 3 dim 13paswv]V_gi/#oܽp1Rw%Is;sword=2$5<'uV 4 254 gdalautotest-3.0.4/gcore/data/uint16_sgilog.tif0000644003401500001440000000115013614004466021037 0ustar rouaultusersII*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{{ssZkkc{sc{{k{ckksskckk{ccsccs{c{kZkskZc{sss{{sc{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{ sksck tLSgdalautotest-3.0.4/gcore/data/minimum_tiff_tags_no_warning.tif0000644003401500001440000000010013614004466024261 0ustar rouaultusersII* gdalautotest-3.0.4/gcore/data/classictiff_four_strip_short.tif0000644003401500001440000000026613614004466024341 0ustar rouaultusersII* Sgdalautotest-3.0.4/gcore/data/vrtmisc16_tile1.tif0000644003401500001440000001707413614004466021315 0ustar rouaultusersII*:=@S     04 S r , K j $Cb;Zy3Rq +Ji#Ba:Yx2Qp *Ih"A`9Xw1Po )Hg!@_~8Wv0On (Gf 33??Ջ?񙙙?|A`gLA# e )#WGS 84 / UTM zone 13N|WGS 84|x1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿΆx1 àԿ 'gdalautotest-3.0.4/gcore/data/md_dg_2.tif0000644003401500001440000001265013614004466017647 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/md_ge_rgb_0010000.tif0000644003401500001440000001265013614004466021141 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/bigtiff_two_strip_long.tif0000644003401500001440000000043613614004466023116 0ustar rouaultusersII+ Sstgdalautotest-3.0.4/gcore/data/bigtiff_four_strip_be_short.tif0000644003401500001440000000050013614004466024116 0ustar rouaultusersMM+ <=>?S<=>?gdalautotest-3.0.4/gcore/data/rgba_with_alpha_0_and_255.tif0000644003401500001440000000064513614004466023124 0ustar rouaultusersII*RS   &/fN@N@@ALA# Wh )#NAD_1927_UTM_Zone_11N|GCS_North_American_1927|gdalautotest-3.0.4/gcore/data/stats_nodata_neginf.tif0000644003401500001440000000047113614004466022364 0ustar rouaultusersII*  S?   S4-infgdalautotest-3.0.4/gcore/data/irregular_tile_size_jpeg_in_tiff.tif0000644003401500001440000000450513614004466025122 0ustar rouaultusersII*r BCDESC    $.' ",#(7),01444'9=82<.342 ?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((C    $.' ",#(7),01444'9=82<.342 ?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( BCDES[!$bbC    $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzgdalautotest-3.0.4/gcore/data/byte.pnm0000644003401500001440000000063513614004466017327 0ustar rouaultusersP5 20 20 255 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{skkkkksckgdalautotest-3.0.4/gcore/data/float32.raw0000644003401500001440000000310013614004466017623 0ustar rouaultusersBBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBBgdalautotest-3.0.4/gcore/data/byte_bigtiff_strip5lines.tif0000644003401500001440000000170013614004466023344 0ustar rouaultusersII+lLS   dddd0\N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|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{skkkkksckgdalautotest-3.0.4/gcore/data/spaf27_correct.tif0000644003401500001440000000164013614004466021174 0ustar rouaultusersII*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  ^L >"~˶8AY[#APō[Lph@nQfLh@#      +#      TXAUuor@ @@@DDDDd@@]ZUUUU@@>ANAD27 / California zone VI|NAD27|gdalautotest-3.0.4/gcore/data/uint32.vrt0000644003401500001440000000253313614004466017530 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray uint32.tif 1 gdalautotest-3.0.4/gcore/data/stats_signed_byte.img0000644003401500001440000002070513614004466022060 0ustar rouaultusersEHFA_HEADER_TAG- &{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.1!Z4RasterDMSEdms_Statep1! Ehfa_LayerEhfa_Layer {4096:Cdata,}RasterDMS,. rootroot1!- -!IMGFormatInfoImgFormatInfo831 - !Layer_1Eimg_Layer@@gdalautotest-3.0.4/gcore/data/utmsmall.vrt0000644003401500001440000000254113614004466020241 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray utmsmall.tif 1 gdalautotest-3.0.4/gcore/data/twoimages.tif0000644003401500001440000000212413614004466020346 0ustar rouaultusersII*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{skkkkksck Sk{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{skkkkksck .Sgdalautotest-3.0.4/gcore/data/cint16.vrt0000644003401500001440000000253313614004466017510 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray cint16.tif 1 gdalautotest-3.0.4/gcore/data/excessive-memory-TIFFFillStrip.tif0000644003401500001440000000331213614004466024232 0ustar rouaultusersII*}88=@S   . 0Կ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ!4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x  igdalautotest-3.0.4/gcore/data/strip_larger_than_2GB_header.tif0000644003401500001440000000041013614004466024014 0ustar rouaultusersMM+ PSFeGgdalautotest-3.0.4/gcore/data/test_gf.tif0000644003401500001440000000145213614004466020005 0ustar rouaultusersII*4  $,4<(2D X p$B<HH2008:01:07 21:21:42??<)A@A  )# k )Image Data|NTF (Paris)(France - onshore)|NTF (Paris) / France II|gdalautotest-3.0.4/gcore/data/byte.tif0000644003401500001440000000134013614004466017311 0ustar rouaultusersII*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.0.4/gcore/data/int16.hdr0000644003401500001440000000036313614004466017306 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 2 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/idontexist2.vrt0000644003401500001440000000262513614004466020662 0ustar rouaultusers 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"]] 2.0000000000000000e+00, 1.0000000000000001e-01, 0.0000000000000000e+00, 4.9000000000000000e+01, 0.0000000000000000e+00, -1.0000000000000001e-01 idontexist.tif 1 idontexist2.tif 1 gdalautotest-3.0.4/gcore/data/sstgeo.tif0000644003401500001440000007651413614004466017671 0ustar rouaultusersII*| <' RS }sAE5ǖAEAџjxAEA^AE:&>AHE N§#A(E}APEˆAzEՠdAiEt‰AcE0TAX[…iAɍ*FAƖV'A^½A[AGYA}ÛAEzAFQAƙ.AM<A¾ACA0AƷ+aAa9AƏy AפAA]S:AڗNAӥ A>E!AUEYIAxE" AlEtKAoEp3PA}EwApEɧ®AE\AEglAEHA@EŸAxE]MA;D A`8EzAEiKnAJŠҪ–A{m/€AI[ffAĤAQĪzէA@eJAEfSA0Eڭ4pAD[f¨A0~Ź‰A@a|AEˆrACApEฟܛAE|APE bAE:.BAЋEb}&AȆ±A`E%AzEPA@pEDکAPfEzEA/pyhAƣXDAqΡ$A<nA;/A\“AƾAƥsA0—JAƇ)¸&AbAƴ¢AϣArAƨ@ŽTAv+A|AVAƴ.DA=hgpAƵ¼:A@uEŠ A \E/A@^Ehn=AE带ŽeAsE00AE#HAzEA}EOާvAxE(&¤;AȢE$|>AEǨAgD|"hA8Efr%A8Epĩ6A0E'¬AxE~w?AELA0ECAEw?0AįAEblA[B ATŀzA0PŸ!,AP%yAC 4A_EꏯGAEq A EAPE˟1AȝE¶AE- 9}AxEBN]AE-vŸBAEBY"AEΠDA}E:AqE'AmEPY­AAƫ@dAƒKEA{‹ AƕCzADqATAY֢CAnA}>KAw!A9AB‹AJAWV¬}A°UAxˤ%AAE Aư~AHEVå‡iAxEaO;AOEFA@E;A`D4ЦΘA؇EOeAxE_{'A0zEdAE]HAEf>EuAjEi/A8E|ŽA@El;A0EdAEݩa A`E@­AWEA@UE*ApRE'^cApyE[ΫzAHE1`$A4 A$E0\A` EۖsA;Ev ¿APwE {A0E¶AE9AE{8)AE”AEgAErA@E/6ˆAEMd­uAE@YA E^(9A@yE5™A }EeA0nE0>HAkEoUA@fE[AsE̡¼wA7XA,2AY"AEAƻlAA{$}ATYAqElA/Av AOAƆ/IAl¾Av^A;.Aƛ}Aơ[iAESŠAdE٥mA0ZE¨>AXE]A_E3YAeE¨AhEY( dA@lEv$AtEAvE APpEU¸nAENO'A(E*AERʛApE5XA`Ew8AEKW§A8EkrApE8APEtAEcAhEOH¾ AȉEA(E+š>AJE §A E –^AxE2kA[E*gAEįOAEiNORAE͟¡AȝEWAE!YAؗEHٮAEw~AE 9tAEAΠSAȃE+7A~Et'A@xETQ•AmEł;AiEMApfE`ʕAd vAn@RAƥm2AreAƤѢ¤AAƘ8†A,iT}AƾmSAԣ.AYA/DAƴ:A^?A…WA.¦-ApAoE˪ªA`cEA eE+lA`xEs…5AEOA`E/[AaE>ٖAaE-YAgEѧl"A0eE $AvEYlŦA]E¨`AE #AEjiAPvEU8APE QAEo#AsEhǪA0uE0^\AȊE AؐEm5AE,bUA0jEڬŽAPEE/AȈEǭAxE;AXEȮ3A\EFAEXe3AE kCAEAEF AE7AE^AhEAXEfAE[“jA EM NA؀E=',A~Eg«AqEµAmEá>AgEAƵ"’AV$dAzCAֱA"AA9BAO8AƩVAA`Aj:;A&­AƾZ©AG AͤUAƷ ¡_AbE4AƐAxEfAPdE9IApNEmBpARE#Œ7A`SEȦALEAYErUuA^EͣDVA`E{A fE:gA@lEAqEi٨­XA@[Ew%nAzE!AEЩrAEj#†CAE~AXEު°AHEYGvHApEA@EDAEx;AEG;AXEu\µoA`EXޭ»AnE#R¥AxEޮt AE\ AE_OApEGAtE24AEAEKrAEmrA EAEȠEAE:AhEB!jA|EQŽIA(E{,AED/ AGELء;A+E& ³AL7¹A}kAטdAƢ;DA$tAk,•AgdLA!AΣ(A){aA<5Ap†AzAKA8$-A\L`AcA.A]E_إMAXE`ºAVEYAPOE"hA`OEf7AME+ApHE{mrAHE —AeETAPoEiSXAGE՛NAnEiAME>…UA0hE6 AxE¡AE=5ApEࠪq1AqEA@IEWb‰AOE߿>A@E05AE»A8E [AmE=yAEgLA0EoA؎EeApEj{#AXEfdABŵA45 /NA@E33AЏE4aAhE APuE綠)A`yEߠmAEq”AhE7ApCEg_ADŸAAEá¤A`D(AC!AƶMrAAMQvABݢUAƤ’-AB AQEzAƫAm^AƺmAbSgAAb_AŤAA:GAƼr…gAk4AbE!ˆA`UE)4A FEpžA OEujAJEmF8AREBAP>ETAVEҧºA_EPAYEBj ATE„AjEX AzEUKAPE|AXEȻAxE?TuA{E6!AZEZAXEx§zA Eu֫D)AE4G\AE6mAppE$.AE’AE{+AEFA`E@>ADz[AE+h8AXE-AHE%"SAHEH8AhE1vYAxEA0EˠcAD!Aņ#ADLtAp-E}_AEAA@ýءA?AD6ADb͹A‰AzĢ#rAr(PA('A%XuA)sA·AƯA-°cAƪh6AƪAcڤhA9šA,P¯AVA_ʥ„"AlE^ƒA dEaIxA0PEA@LEͦSALE  APSEWAVEuǬAeEkA\E,±2AHENAbEǨAmEQ¥gA`vEjµ&AyEũ]AEeܒAE i KAEQ̪+ApuE$AE)IAE˜AE[AȁE;5AhEW8•AXEacAؠE%AE陮 }A@E'4A8E|~AHE?¨AEɰaApE4—kACk[IQAC-2A e"A$Bޠ!A#JA Š6QA _ A@*D\ž{AC|^AD9:A&DcIAp EbJAEvMA´AyآAƈ†pA =HAnl6&AƍAdգAF AƯA~Ax}¿[AƔ4AmAb%AyeAoAߥŸMA‹ AI_œA[E̛-A6E^AEE"YPA6E?n]APRE6{A0KEA`SEDgA[E$AkE=ߨAnE6ApEŽaA0uEީAtE.AyEARE7‰5A08E$=A E/AoEjAAOHRAƯA]ʦjAaE—A@.EQŽAEEfŽFAIEߧ¨ATE.#A\EsA dEƨ VAPdEfApSEf0ARE%˜AcEFAsE_A0vE zAP{EfgA@~Eo³A`uE1٫APsE 7nAfEjœ AsE ­AЀE^KEAHE_A؋ECuRmAhEyAEwRAPE AEu'wAEA8EtA!Ğ*ASTɠŒ}A@bAČ…AAG6%Aěw­A頡|A@oĨѡA@OAE-ApQE&YbA\ES=A0TE£AFWAA#IAzAg'hAƻ>A^ARšAmLAk¦AƴªqA3AAi%A+7AKdA%AU_WAƹ Al~A]E)yA@E i`A?EFAP>E APLEE#ASE ֕Ap_EݨPAWE&A@RE}›A XEyʩžAVEV&4;A`kEFw¤AsE]ʪƭAPxE-.VA gEWv A0sEp¬ApcETN XAȀEcAE#A~Ee½(AEV mAyE&LAPEAPoEXAXEL AEJA0WE3AEƇ²AŧYA`uܠ0A@S{A2[AzY[.?A0e+AE~qABEVfAlEA UEA›AWEmA`YE_£[AOE̢;AƆQA?/|AƐ]ApNE^eAģ¸Ayx`AƗ-f¼KALEA`UEFAOE>…wATE m3AeEZA0kEpGAxEٟ>LA~E? oAP~EihAHE٬;AP}E>AEt«uAE$rAE秮™A E³2AgE|A0aE,*9A`EPŰ-ADDQ"AWE2¾AŠA0ZACؒA@DjIIrAqUAùh4AE%ˡ3A6E–AIEg&qA]EqX±A@NEރˆAPE*ŒnAOELNA]'AFAttŽAJ Aڣ̘ArnAƗDJA~;AƌAƳDA "FAX`rAƟ¼HAץAaAKRŽAȆAXҦrQA3!AƲWA]E*޳ADE•vA@9E-%Œ@A;E]t¦ABEڹZAAE qAEEU‚DA0IE6AOEA`RE&V¯kAPEL&ApRE5A@YE^9ApE9AyEu!A}EKAeE%”"AEU¤APEϭXAE;pAwE羮{AC3²Ap?E—A`dE@ AqE۰{zAEggApvE池RAؠA@PDAID.®A Dp]œAD ¸qAPHE°PAUEnߡ3A@UEiASE:6AREm A QEcANE̢AOEMnAw-¥HAjET['Aˉ^A¥AƔA3)©AyZ‘nAݔ˜CAƷǤA0AƔ8Av'A` rA%AAo&+AƅiA%¯AµA&;PAƜo^AALAyE%AALE=PtA AE¾4ApNEҨŸAME& ASE?os}AbEƩ“5A xEAEp AƨdA0YE6šA@eEypAprEAҫ©}ApzEA9p fAƝ:Axݤ˜A»AVNŽAƸ¡A#å›cAn1A4 AU2¿Ak„Aƃ•Aפ›jA DAƃF>A7{AùASA"1aAƶi5A4AAƳ-—AjjA•0Aƍ9Aơ?ŸAPNAѨHAwACk0AƞAi !BAƨYAEĢA?E\$A#XAP_A…5AȳeAf;BAƏAƇI¸AU³AijAXEwA\! PA]J!AƔSA)ѥtAƾ˜AƓHjiA-}EEsAƚ1AoA=:A6TAA^E.L2Ap\EhPA`gEMƒArEAE::A~EhAwEծfAbE'ZƒAaEϯo~A@GE?_LA(EF߰a}AHE{A@]E]AcE2߃A0=EY’hA8ECHA6E&+,A2E\ߡ A5EBA 2E~8¯A2ELbխA04EsAP?EhŸkAGAƾ/'AƆPXA{}WAƠ$AAƏtAFµJAw‰&A}AƑARA~OA+RA)AAƑ63AƘwA] nAM8A. Au”A`A{TcA|;.A͇AưʨAƈuAƙ`;AUBA¬AUGjAf'A;ARiA†EA AcŽAXEϬ>ASE\NA3ESA4E¤xA1Eڡ†\A/EA <;A`-EF3FA1EcAƑA²AڛAƓFwAƄHcWAo|Š1Aƃ†AޣNA A;@AxszAƹ¦VAܤ•+AƖAƂIA|̱AƫAƴYAƤ-)AƋd-AAƭަA[";hA~]8AۣyAhAƷ*.Aj¶^AnAƂFAƕJ›Aؐ¾jA#AƘ.QA↪AƎԪWAƤ1qAƨA׫tA<„ALAbkA`IAƙӭ AR9 OA^EDAƒ!§vAhE‘A AdEA[E+IAPEfȱ™APEU[\ApcE)q¤A.E°A .E"ǡϒA,EdwAP.EJVAG9AoxAtŠA Ԣ­A PA1NA]uA쑣­PA20AƋ  A"AQºAƘAtyAB%OA%%*A-`AƠ‡AƢХ“ARADMQA{3'A\ArAP:AƝu¼eA-L.A‰AgC AðAƁШQA—A dBAƀ’Aƶ0[AƲHA=A$rAƁLqCAŞXA9AƬX@]AH?A §AƏ}H\AƦ·AƺVA@pEҮ0*A?AƸįMKA4;AF˰‘UA[EL_A(ªDAFEv A›A@*Eo+A,EܡµA7E>zzAƸ4 YA];AZ…Ad‡AAAGAAs8tA3NA*գ-AƜ ¤A 9@AhCAƷ©AФNrAi GAF;3!A]v"Aө¯A©AwtA&[OCA45AƙӦ¼AƯ AƍP‰AًRAhҧGAQAƞYvA¾vAƯ‚7A)¿A1zżAƟŸAz:A^AA¯AlAob•Aƨ®A `Arnt/AǬoA3c~A'AšAl€`A_ATAƿٯ$ APA AƘ`»AXE(AIEhAREꛡBƀáŠqB"•aBƂ·SBJMCBRs5B$B΢dBB*…A]}AA:ҀAƌR`A !»9AƭO A~AƜA{Aƒ &AƑR!ZAύ .AfzAƖ€A3:A3s0AgWA$A8%£AFiAƾ†AƂ^Ah)E-A!sAƮ[AƧžAD/KAƧ AR۩A/¡Ay:MAҪBA ¿AƋ~±rA ѫŒ,Aƹ%Ar[ALN>AkQ¨A=A{$$AЊAXAvtAƸyAƀp† AA± AƁrAƔ.AdEڱoBx١´B$tBƋ0RB+`™Bl BͤB=ʕBB"A€tBtbBERB}ԣ?B{.Bj7Be’ B"$A̤…At&A6vAhQA)#AץyAoAGJ9AƑ sAGAYqAƗ;=Aƥ5AºAHA?AvAɨIAgAcZ8/A㪩2AƇAEiA*AA6ΛAƏ¸JAAƩ;hAVl^A#WA3g:AƭšVA$:JAgASA݉_A|7AƦoBƟ-mBcŠAƜvA٦NAUA4U)AzA!է›AA4ZH^A'#AKA2…Au |AƄƩ¢:Ad AbdAƄ}Aƕ3AS_A۱AAƚ ]AƌYAƖ·Aƶ–nA,A(RAY“TAƏ°Aƣ<«A3$Aƞ0WAŧ:AƤ8Aš8AXˆAƝ¥AƋݡzBHº B4vBƠ\QBe’BƵBƒ¿B¸BBB ngB${BzͣjBWBT/QGBe˜3B̓`"BäBB+Bke*BƖ8Bӥ¨BB1D]BƱy¾jB/#RBƑ<BY2"Bk- B GAƯòAƩ2yAƼpGAƫ Ae.AƑHߗA5 `AܩA#Avx†Aª…[AžA2jaAȫ<{A:3AƦoAƟլŽAƱ/›>AgA³AƦoJA9֮A0RLAfAEfA’AƲMUjAϱ³Al¾QA*QABơB{KuB tzBڣiBC͢MZBHBl(9B_Zh'BƯ¤BӸB2žBƞBB!G]B|LBƭƪBۤB ¿BƿC7qBn}([BƟGB0BBN\BӑBXѦµBƿ¸BƋJvBgBDȧsBŸ[BJ¡>B %BҨBƴIA`²AƏº]AQKA.AƠ`A+AƳMbA֢£A „AlcNmAЭ AL0@AEKA hAkczA<A{Aš#A2BA‡AtAƧ2A(B GߦBvKBƵBƧ΢vB-gB%)YVBƖSGBƪ4B%BZ>BBbEmBsxBRBפºBCԥBk?‰BBp}BgBiܥhTB T=BK)BƋ B4B¿Bn6©BgxHBBtoBE2gBryIBƲY0B¤BƾB™B"&BөˆB$'BkxBCTBq 3BƱd B6AM؁A3d7AK Aƀ;AyBK• ByݪBO(]B݁[BƨЫ¯B/ mBGHBƮ׬¶#BD>5AߘA…;Aef¥Aƽڮ{AAŽAƝdAw-BAȳA~+RA ŒA?HAݲEAlzA{K½B}s¶BƟBmˢ¯Bƅ˜B.%¸BPVoB䀣_B"ŽMBƵޣµ=B&*B>‚BƄs BLBjפBmGB 6[Ban B_mBb٥BB lBƬGUB{ŒABƈr)B\SB?/BfB'œBnBƜ'·BƟc]B6bBw‘HB3)BtBƒ©NBƚªBWCB B4SlB?KBƇ %BH‡BƧEB͘B'´BƫTv_B6N6B)cBƐ|¸AoCAW–A|ԯ„lA;CœAlɰAA’ Akұ|}AST`A]AӁA`McBUBT/EB<6Bt2&B7;•BwlFB(5BƇɣYB5B(VBƈU@Bf+BL…BƎ¿{BƱ|jBnMXBꅥDB 1B2B#" B_‡B¾BѦ(B}BH֙B8BD§fjB7¼SBA¤8BL} BĨYBƒIB.NBBƀϲBcݩBƥ!wBsUBƞ7BB[‹B€BͬBƫb!B `Bƿ ½:Bƞr™ ByͭkB:±BƋ9B1_TBƥw%BƭAcŠoAAƉbPAy˜AvƒuAAƃLAƁw†Bƣ{B΢BlB(QBQnB$ʆB٭owB>9eB [UBƌ?‰BBQl!2B5¦B Ϥ¨ BhxBƐ4BQdBҜ–BͥB!ƗB:_BƽvCmBYB@B+B_B䖧nBH٧B<B"XBT³Bۨ†yBƗ_B1eABƀ&B\…Bƙ8B oBƃѪB&qBqcBƿ˫<BƼŽBeyB̬Be"ŸB8VvB$MBMQ,B˜Bƕ&eBB LByBƂAkx[9A0 #Al(AW+AƨAƝ|Bٵ>nB?]BH±OBƦ>>BƋh>0BBģBPB"#_BVBăB͸±BBJ:BƖLB||`qB)y\Bs6JB {4BƛSz!Bɏ B2Ħ BXlBƂ8½BxBڰlBr”BƔ-kBưrPB8BqBƿ5\BƗOB©B:BƱTBiwmBOBC,Bn B7[B{8 ByB+wBAtRBGB%Bm Bq?B(Ү¹B0GkBy<Bf,B盰B#­Bl´VB-½BƠ3AAPjA73yAGLBƉ̢>BœB%$BkUBWBǰrBƟۣB/}B:mBm[BƷ®JBϤ/7B+&BN4BƞcQBƈ]B9̥BƆ\B7(Bưj¼Bদ™BKۦXqBq3YBƝO DB揧*Bǧ©Bƒ 6BƶDB҉=B5ƨخB¥BLwBƹ/YB=٩>BX'ŒBkBƁgB2BZZB$zB5SBqO^1Bd¤B ›BWTB B"dBƼ¿2BƷ BƧ]BZůXBƫB-dB/B 92BU˳BƒClB9ƲY+BƩeApD%A <' }6} &}RSF} >]gdalautotest-3.0.4/gcore/data/md_eros.rpc0000644003401500001440000000713613614004466020011 0ustar rouaultusersLINE_OFF: +003577.86 pixels SAMP_OFF: +005073.81 pixels LAT_OFF: -25.46203790 degrees LONG_OFF: +030.92821397 degrees HEIGHT_OFF: +0799.818 meters LINE_SCALE: +003701.00 pixels SAMP_SCALE: +005073.50 pixels LAT_SCALE: +00.03366450 degrees LONG_SCALE: +000.03933000 degrees HEIGHT_SCALE: +0800.000 meters LINE_NUM_COEFF_1: -5.685732320958757E-05 LINE_NUM_COEFF_2: -1.688452124667677E-01 LINE_NUM_COEFF_3: +1.026285109792635E-02 LINE_NUM_COEFF_4: +3.370333778549677E-02 LINE_NUM_COEFF_5: -1.688452123504236E-01 LINE_NUM_COEFF_6: -9.210941236359113E-05 LINE_NUM_COEFF_7: +1.026285112455623E-02 LINE_NUM_COEFF_8: +7.275450748233468E-04 LINE_NUM_COEFF_9: -5.685732326117261E-05 LINE_NUM_COEFF_10: +1.275991345347366E-05 LINE_NUM_COEFF_11: -9.210941329658526E-05 LINE_NUM_COEFF_12: -7.107935332182441E-03 LINE_NUM_COEFF_13: -1.688452124517246E-01 LINE_NUM_COEFF_14: -7.817702560991569E-05 LINE_NUM_COEFF_15: +7.275450726536353E-04 LINE_NUM_COEFF_16: +1.259657328251798E-03 LINE_NUM_COEFF_17: -5.685732319980720E-05 LINE_NUM_COEFF_18: +1.275991335486938E-05 LINE_NUM_COEFF_19: +1.026285112524951E-02 LINE_NUM_COEFF_20: -4.046048387797195E-06 LINE_DEN_COEFF_1: +1.000000000000000E+00 LINE_DEN_COEFF_2: -1.660629248792338E-05 LINE_DEN_COEFF_3: +7.781766191075484E-04 LINE_DEN_COEFF_4: +1.552004958811531E-03 LINE_DEN_COEFF_5: -1.660629300111096E-05 LINE_DEN_COEFF_6: -5.496314032583734E-04 LINE_DEN_COEFF_7: +7.781766202266671E-04 LINE_DEN_COEFF_8: +4.691190242093672E-03 LINE_DEN_COEFF_9: -2.800290040998603E-01 LINE_DEN_COEFF_10: +9.190822500847878E-06 LINE_DEN_COEFF_11: -5.496313957449625E-04 LINE_DEN_COEFF_12: -1.556308710889394E-03 LINE_DEN_COEFF_13: -1.660629304429864E-05 LINE_DEN_COEFF_14: +1.675835981211626E-05 LINE_DEN_COEFF_15: +4.691190212377331E-03 LINE_DEN_COEFF_16: +3.805520978922899E-04 LINE_DEN_COEFF_17: -2.800290039595706E-01 LINE_DEN_COEFF_18: +9.190789503243230E-06 LINE_DEN_COEFF_19: +7.781766189033090E-04 LINE_DEN_COEFF_20: +1.574732057685324E-05 SAMP_NUM_COEFF_1: -2.129060789027837E-04 SAMP_NUM_COEFF_2: +3.493776357942976E-06 SAMP_NUM_COEFF_3: +1.936345819081399E-01 SAMP_NUM_COEFF_4: -2.382498929970764E-02 SAMP_NUM_COEFF_5: +3.493752749279915E-06 SAMP_NUM_COEFF_6: -7.113250768332150E-03 SAMP_NUM_COEFF_7: +1.936345817997452E-01 SAMP_NUM_COEFF_8: -1.993343984792224E-04 SAMP_NUM_COEFF_9: -2.129060800454212E-04 SAMP_NUM_COEFF_10: +1.244388483525128E-02 SAMP_NUM_COEFF_11: -7.113250770281199E-03 SAMP_NUM_COEFF_12: -6.640580663263980E-04 SAMP_NUM_COEFF_13: +3.493770676204088E-06 SAMP_NUM_COEFF_14: -1.090930315505032E-03 SAMP_NUM_COEFF_15: -1.993343996887753E-04 SAMP_NUM_COEFF_16: +3.766611282534946E-03 SAMP_NUM_COEFF_17: -2.129060800034271E-04 SAMP_NUM_COEFF_18: +1.244388483322245E-02 SAMP_NUM_COEFF_19: +1.936345816322605E-01 SAMP_NUM_COEFF_20: -4.930201160996610E-03 SAMP_DEN_COEFF_1: +1.000000000000000E+00 SAMP_DEN_COEFF_2: -3.399660026730292E-03 SAMP_DEN_COEFF_3: +7.140161558631606E-03 SAMP_DEN_COEFF_4: -1.404299913797778E-04 SAMP_DEN_COEFF_5: -3.399660026924333E-03 SAMP_DEN_COEFF_6: -4.408923950531601E-04 SAMP_DEN_COEFF_7: +7.140161558382806E-03 SAMP_DEN_COEFF_8: +1.744314123010001E-03 SAMP_DEN_COEFF_9: -2.218626461126291E-01 SAMP_DEN_COEFF_10: -3.870828853713920E-03 SAMP_DEN_COEFF_11: -4.408924020411851E-04 SAMP_DEN_COEFF_12: -1.053716488104013E-05 SAMP_DEN_COEFF_13: -3.399660027333339E-03 SAMP_DEN_COEFF_14: +6.221075558288873E-05 SAMP_DEN_COEFF_15: +1.744314147054657E-03 SAMP_DEN_COEFF_16: -2.066729793693595E-05 SAMP_DEN_COEFF_17: -2.218626462941301E-01 SAMP_DEN_COEFF_18: -3.870828817334132E-03 SAMP_DEN_COEFF_19: +7.140161557935442E-03 SAMP_DEN_COEFF_20: -1.231838158165972E-04 ERR_BIAS: 0000.00 meters ERR_RAND: 0000.00 meters gdalautotest-3.0.4/gcore/data/tag_without_null_byte.tif0000644003401500001440000000027213614004466022764 0ustar rouaultusersII* 1Ssoftware without null byte sgdalautotest-3.0.4/gcore/data/classictiff_one_block_be_long.tif0000644003401500001440000000063613614004466024347 0ustar rouaultusersMM* BCDESsgdalautotest-3.0.4/gcore/data/float64.tif0000644003401500001440000000672013614004466017634 0ustar rouaultusersII* Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/slim_g4.tif0000644003401500001440000002603613614004466017715 0ustar rouaultusersII**   )(1@SIMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $&s Iy@2]R#:\C#6e.z~߰=l?{ ˥V}\5@((<"` DH bz}=0GOzA'ooKmv%GA0`]-aa , hP@S8B`l D\ bNdu 4G@GO!A&o_~[kKa X"ح5@pO?@ *4/^X Cx{@F!l@e˾E 8l{k ?o~o~LJk}|>@ Ñ@9B"Tq[xeњ#;Z A0(P b,)LjpogC6Ӡa`r ! a78vx wQ| ^(|@!8hpB ":ro.498-W$ 7g}"2א6˜r<G&8E "$ 'B K egB' 4Ap#9h a(v `k J>$3G*8dx m%a2sl1z 0Ce +pmoGA^Sw@ADwW8p h9-!(r|?ƺ{62Rd#>82 P0|DӢVU~Hq'i'TCyhRixDtG*-Fg3z DUxPԄS#0@9Dr7v""2 F Du x*8P"!pq|$|p)Xp4(rCOC4r\pR hi?7-QGdX &|"zԉm~*_TOց Hwv.? h&&D׿~ń"""9h-v |(F%hK4 )DDD7 ʂ&>\CdDI K .P?YR # X 9@wr,N!Eq"8HKp| ЃRbmX2!>!/DuQ :BeTr xez>`qd X0 M,q\)!Ԇ" ud A<)xu%Ŏ!F9Aah<30<6ঌ(PqA!DN2(  JL2Ar5@%%[B# <4PЁd ~0DH4 4Bp}{ xSY8x DtmC7A޻0w7*5dA8ܡqp p DE:S:a )*Oރ). Nu5xc Fрx`D}xĆc\ΔPPT:"',VB 'v"CMx8h85I TC ʎHρGZ\!#l`0$VAQ:h 8!)޲+rK m~ ԁ2< 0D`CZ8h\ߑp^d\+Pc|+kBa&9 yk":؈OkHx=׿i36"dx\4\3h[S] x ͢aBDa@IdAPF?#d,B!#]/?*4E `a Ԇ?#28fI8$p""CXph=mmb:W a0? ;o4?  Q} D]%V< 36eIG#~XEk ,YCS lPpC0q7ľ ~F l`.鰊vZ(w0DAF @H4IxB5EJ@/a s$36LJp^n]xNB) =,(?S9E .@! |8 SPL  |0B$2 |hu ҈D<\7ԯ^UDZepKBeÖ9Qu,&.C_"xYvLT .diH|! D" 9C&A3 LqAH$J]A%jDw~,l!t @}C@ԁDtP DpPt5հ$eDah)'B"p_~ XF&} )}.$^R{Fa!EA"6Mr \B(zCFDzPJ!ࡢ ܓ0?j"R, d?a?n9I+5 0.4gQ:@+Qȸkp +_!t /d6ٲCA'PD%"' #/F" dpA]zf.%:H?ЎZvEAa) ~"@E 884>"#[@&f#@? C;?h4`=\2XO,D0$<&0~IE#\nC TAy8ONoVݿ cH?i h \ŤL ~z/]XLBM5]"p@.$3q' L3 a=B h$Fk#P7xI@3\M(O 'qA@*WtAi ?f!>}L\}Dv~vð.` c<Uxb"xa ad J8`L-E>C O#!5 ]<&a<"0+YGo @pB7e4u0 >i7~ ޓt]?ײ]egm~@ud}Ņi6Ն[gհ&IL ]RMXa0 k pY` 4,"? R|a< zz@iS2ڿL ~H֫V}A?K_wi_YC > l )Al8O a5)„д=?DPZ"": 4! tCi~5oK%t}?௯jmrC-魦zԧkda`莕f Gd2@F?!i,'AuAQꞁL=$HutN7@I'WU?wvjۯޕ/oVul/V"*)&]|;e {B D50C<6rtP/sPu:X ;CC ?S|Y*0({ f @ @^ <( xAW mq,%6V@zYhfd GEh 6I \TUh% f 0gp{3{%f pa셁mA< aD.`^$Զ@Yh*d +x2:<4,CP/ mL2А3 hI@4YhR0e J.y@&h g@4 lhq5܋hfd _@E= zODz IIv]hkp®[Uo]5[Ml&l,6W6Ql 6sC_ < =0Oat" iVA8K*酬/dl W]0 _ _8I Qk#`HlD[ 9Q!D\ 5S)o6b@Yh* l-K,% ,"L VXA`XA`Z a 9 sЈ=>h4d d%x62l! =<} o MM>_^*5ЋK%[u6 m!`¬Z6󳁘fP}sHK@q]=OFO0h:1 m2Q@ڰzi߄O7 #OH7'M _K} y/R턾kp] mQYhgO m @ X JOO_X>?@_ ޚx[A^^D5AoIo߯_K^l%0ivavCУd lEmml-,t,C(@ F# ͚ gja~__4kNc{u>' mnCFLF"$h3^?@/>XA4PI>F|$J'}Ro[ %)-z m.u[K BڭX0  27R03,03 ?bYh( '# P# mhr6O>DǠet g~oI}&}~Km. ]K%(- OAlB -0X0 @C31sO| ~x0F#|D#ˢ8""| _} @.uOkN:l az 'OA!f&q% WdmC𽯐f 0{\dvGg[6HH;/h^@r,=< |0_H7AoA}&}'Ktv` -l v+kaa[ ,2bȒC f4א6aOAΡz }/߯b>I":# e8qߴB#D|qz{@>@Ý^$a,%XK-, , a-- @1 |?w5\Hu\#   )^+f+(1z+@n+SIMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $gdalautotest-3.0.4/gcore/data/second_image_width_above_32bit.tif0000644003401500001440000000047013614004466024344 0ustar rouaultusersII* S Sgdalautotest-3.0.4/gcore/data/bigtiff_one_strip_long.tif0000644003401500001440000000037513614004466023070 0ustar rouaultusersII+ Ssgdalautotest-3.0.4/gcore/data/next_default_case.tif0000644003401500001440000000022313614004466022022 0ustar rouaultusersII* Ssgdalautotest-3.0.4/gcore/data/byte_nogeoref.tif.aux.xml0000644003401500001440000000014313614005317022564 0ustar rouaultusers LOCAL_CS["PAM"] 1,2,3,4,5,6 gdalautotest-3.0.4/gcore/data/projection_3856.tif0000644003401500001440000000053613614004466021215 0ustar rouaultusersII* sS   D@A̞LAN@N@  WGS 84 / Pseudo-Mercator|gdalautotest-3.0.4/gcore/data/md_re.tif0000644003401500001440000001265013614004466017442 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/uint16_2.hdf0000644003401500001440000001061713614004466017703 0ustar rouaultusers j\    < &! G K< !j    2 7 ;; vI F  < U9NCSA HDF Version 4.1 Release 4, December 2000k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 uint16_2.hdfCDF0.0gdalautotest-3.0.4/gcore/data/uint32_3band.vrt0000644003401500001440000000465013614004466020601 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 testvalue Gray 107 byte.tif 1 testvalueBand Gray 107 byte.tif 1 testvalueBand Gray 107 byte.tif 1 testvalueBand gdalautotest-3.0.4/gcore/data/transformer_14_dem.tif0000644003401500001440000000171613614004466022050 0ustar rouaultusersII*&n`S    Vf ϻ1?J41?#  mtr@@TXAWGS 84|#$+3:CKSZagnu{ (/6?GPW^ejotz$+2;CLS[bfjnsy~$*19AIRZ^bflrw}"(/5?IRW[`ekpv}}$09@KOTX^ciovv|%-7BLQUZ_diouu{&0:DNSW[`dinttz&0:DNSW[`dinttz '2=<;;98 BPLH=43 21 0 0 0 0 0 0 0 0 0 0               PPPPPPPPPPPPPPPPPPPPPPPPPPPPPcqJ?9655444 3332110/.-, *  % % $ "                         7 20,+*)('&#!##$&()+,-01 0 1 1 3 33322/ / / / / />?>?>>>>=+**  (((2221&) )()                                                                     0 0 0 00000000000 00000000000000000000000000000000000000000000000000           PPPPPPPPPPPPPPPPPPPPPPPPPPPPPVc! !           "##%&'"!                       $   ' +                                                                                                      !--55 4 4 3 2 1 1 211 " !      ' ' ( *            ) 9(&                                                                                                                                                                                                                     000000000000000000000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 0 0000000                            PPPPPPPPPPPPPPPPPPPPPPPPPPPPtD>===<<;;::::9999999999:::;;;;;<<<<<<<==<<<<<==                 .                                       &% !            # $ %(1))) & " !                                                                                                                                                                                                  % /        + -  -.$ -( "#--))/2     - =?@O9:6 21,*                                                                                                                                                                                         0000 0 0 0 0 00000000 000000000 00000 0 0 00000000000000000000000000000000                PPPPPPPPPPPPPPPPPPPPPPPPPPPP=>>>????N P^            #$& 4 5 6 8<@;75531222 // -)(                            (  '  %  $  #  (  &  %  "                                                                                                                 !!        1,) 0 4 3 3 67:B;>5)' " % & 89+) ( 6 5 1                                           000000 0 0 0 0 0000000000000 00 0 0 000000000000 0 00000 00 0 000 000000 0 0 00000                                                             PPPPPPPPPPPPPPPPPPPPPPPPPPPPP$         . ) ' & $ # !          $))'&$#!!             !"$#!! ! #                                                                                      %#!))(''&&%$                          # $ $ $                                                                                                                                                                                                     +00 000 0 0 0 0 0 0 0 0 0 0 0 0 0 00 000 0 0 0 00000 0000 0 0 00000000 0 0 0 0000000000000000                                                                             PPPPPPPPPPPPPPPPPPPPPPPPPPPPPVd' ( ) **+ -./ 0 2 3 3 4 5 5 6 7 89:;<<;;<<<H              ( ) 001       !                                                                                                                                             0 0 0 1 0 00000000000 0 0000000 0 0 0 0 0 0 0 0000 0 0 000000000 0 0 0 000000000000000                                                PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPVd!!"#$$%% % ' ' ( ( '..L                  +9000 0 0 0 0 0 0 0 00000L0           {#IgMap_InfoEprj_MapInfounnamed, -3.40282346638529E+38 gdalautotest-3.0.4/gcore/data/byte_2.hdf0000644003401500001440000000760213614004466017520 0ustar rouaultusers j\  V Z< !  < !j   2 B2 t7 ; I /F u < J7NCSA HDF Version 4.1 Release 4, December 2000k{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{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["UTM",GEOGCS["North_American_Datum_1927",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982139006]],PRIMEM["Greenwich",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",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]VALUES ProjectionAttr0.0 byte_2.hdfCDF0.0gdalautotest-3.0.4/gcore/data/dbl_min.tif0000644003401500001440000000047013614004466017755 0ustar rouaultusersII*@ S  2.22507385850720138e-308???nGgdalautotest-3.0.4/gcore/data/nan64.tif0000644003401500001440000001027413614004466017302 0ustar rouaultusersII*2  2@2SI@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@I@I@J@J@K@K@L@L@M@  2@2Sgdalautotest-3.0.4/gcore/data/gcps.vrt0000644003401500001440000000307513614004466017342 0ustar rouaultusers Gray utmsmall.tif 1 gdalautotest-3.0.4/gcore/data/4bit_pal.bmp0000644003401500001440000000054613614004466020047 0ustar rouaultusersBMfv(wwxwwwwwwwwwwwwwxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwxwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgdalautotest-3.0.4/gcore/data/uint32.raw0000644003401500001440000000310013614004466017475 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gcore/data/uint33.tif0000644003401500001440000000023213614004466017472 0ustar rouaultusersII* !Sgdalautotest-3.0.4/gcore/data/pixfun_intensity_r.vrt0000644003401500001440000000106013614004466022336 0ustar rouaultusers Intensity intensity Float32 float32.tif 1 gdalautotest-3.0.4/gcore/data/byte.tar0000644003401500001440000002400013614004466017313 0ustar rouaultusersbyte.tif0000644000175000017500000000134011364624556011213 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.0.4/gcore/data/dstsize_larger_than_source.vrt0000644003401500001440000000257713614004466024027 0ustar rouaultusers PROJCS["WGS 84 / UTM zone 11N",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",-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","32611"]] 1.3468857985001034e+05, 5.0009600968988252e+01, 0.0000000000000000e+00, 4.0103732789101200e+06, 0.0000000000000000e+00, -5.0009600968988252e+01 Gray dstsize_larger_than_source.tif 1 gdalautotest-3.0.4/gcore/data/float32.vrt0000644003401500001440000000253513614004466017660 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray float32.tif 1 gdalautotest-3.0.4/gcore/data/size_of_stripbytecount_at_1_and_lower_than_stripcount.tif0000644003401500001440000000025513614004466031430 0ustar rouaultusersII* SsZgdalautotest-3.0.4/gcore/data/float24.tif0000644003401500001440000000362013614004466017624 0ustar rouaultusersII*HEEFEFFFFFFEFEFFEEE8F(FEFEE(FEJFEFEEEEFEFFFE8FEFFFEEFEFEFEEFFEEEEE(FFEEEFFEEEEEEE(FEEFEFF8FFFFFEEEE(FEJFEFEEF8FEzFZFZF(F(FE(FEEFEF8FEEEFFFEFZF(FFFFEFEEFFFEFEFZFEE(FE(FE(FEFEEEFEEEEEEjFEEEEFEEFEFFEEFEEEEFEEEFFEFEEEEFEEEEEFEEEFFFFFEEFEE(FEEEFZFEEEEEEEEEEFEEEEhEEZFEEEEEFEEZF(FEEEEEEEzFZFEEEEEFEZFF(FFFEEEEEEFEFE(FEEFE(FFFEFhEEEEhEEEEEEEE(FE(FEFJF(F8FEEEEEFEEEEEEFEhEEEzFZFFFJFEFhEEEhEEEEEFEEFF8FjFFZFEFEEE(EEEEF8FFJFFFEZFFFFFEFE(FFJFJF(FFFEEEEEjFjF8F(F8F8F8FjFF(FEFEEEEEEEE%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBBS  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/ycbcr_12_lzw.tif0000644003401500001440000000552013614004466020652 0ustar rouaultusersII*H  0xT" C"P>'@0x@DGtXmA ]? E\[;e<;grٰw/' ho9SHDc1zf_a! %ODQ|3 V> SѐY<eX:M%sX; y(g,HWzvt0afSY\^`ڪ@v5v:E8lo<F_w+OfIV; esTŌ)"Sf2NHW:C7xQ6=,tm+:5/.,.CC* n7p "{52b4@볣;1̼?` l0  Ð0Bc, 3 8 ŎH,-> L2 ŇC20 ?} G?/ (0,c( P # @* 1(0.I-Î[=PE,0)€/h/{ :7Fð⎤@*3< #f!p/Cй=x0=X=Sc Ä:BBcF#85E Peϐ5/P̊Rx'+X㰮+ꚶ! <.;@33 1 =$>? 8NH<>FAzP\C(JC_ P.rxHv&D2Xa0ΙMvP/`CxGښ: `dG"!H;ðw /T $d?KYA$1C39 0 `o ) shaoa:\ AF 60Cl$W0t9HZ\"_ @GC$  xl@$ YP"l1a)rCI f@!?)L2%O 7=hQptD)CQ 8DU +0 !9C\ !3и [BFlĈ@, p(RpC ĀPa[  =D AE6l$DLA= @I]a0 hXА@i-B~ P<@ =pQ[0iR-Qx6ڊ>FiN ! CBb p&k(q)Zf> !NM(G#Dlp: $"`8q>y# >}D<nƃa8q! -@Hȴ0lìr7CS:/㐃B0uF"DhMBݩVu5@ H.vD hF" a A@z=<а!Ot><:CFAģCQs'?" 8fN{J(| Bp8 aB`0A !n5xb} `9]P((Aq %RkA0-p%ZD>0v X9W858̄ C;X\T /Q \$3p*IR!paYJP ؄B@l8$!3y#p, ANC#DD!?rBC۸8M;988xaE` ÀX"~Dh!A í] q Bfi@8qҜ* )a jwBo`=` (r]9F!à!B 򯄸 Uaχ@2 0w|P< \ h9`\`( ! V A8 a& !OV +@''6`R VPJLa }x @`@ A@ `j a =Q ! I. s 1 BHz@jX S <8'' i? 8  CLE/gdalautotest-3.0.4/gcore/data/cfloat64.hdr0000644003401500001440000000036313614004466017767 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 9 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/uint16.pnm0000644003401500001440000000145713614004466017515 0ustar rouaultusersP5 20 20 65535 k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gcore/data/stefan_full_rgba_photometric_rgb.tif0000644003401500001440000030576613614004466025135 0ustar rouaultusersII*    RS`````````````v=6\zVv06Om." 7)#      *C%"  nn  !   !%&( !          nn% !7)3<)0?+/.'* '';4BLH^QK\LAPYJXG@PB.@?);8&32&*%$      n'' %#0!)7#.<(25%)&(+IBPn^mohzmb}o`pp\jP=G=-92$.2"2,)'#!      #  n n0-)# .#H-6C019&."@4Avn}|q}sji_q[HWA3>:(8;+;4(6:*8:+;8-59/>5-72!-1%1+))!(%       <1$(nn0--:*2 (#mYOC+,)fclvL9D4"01!02"30 +6(5B7DKASRH[ki|yw|gfvQHXDBOMC_=8D6+7, !      =?&!n=.7% _7Eyij|hqK8E3!-%"(*5 *7&.G;QVOjk_~}xtymjUOcD;J:.A2#2-)(!      <Bon J99  # -&!  ()6 %B4@LERWN`b\}vf}|rZRjNG[KAU:2=4")0!/+)        N`MBq     &&02!;(-D8LQH]SIYibnlto{ylmerlcqUKeRGa>5G7+>3!21",(         QP      s*\1  $"   &,3;,*8',H7=G;CN9LQBMe[kkcrf]paYcbXlWK\PF]E;V=/B9+C/ ...#            #        0y 3I bilvv5#'% % ,4"L6IfN^PAV& 7=BGLQVZ^aehjmnpqqrrrqponlifb^YTNHA:3+$  n  `v9KxEH$%x29dmP`FU-#&  "* 7>DJPV\afjnquxz}}{xtplga[TLD;2(    #&60Y n!4 =Sc:J77$! 4;CJQX^djotx|{wrle]TJ@5+!  $"",B l  I8  5=FNV^ekqw|}xrkbXNB6*   $ P$( q1x-0&   ?GPYaiq! " ..zskbXL?2&        5XU[+  BJR-<A MN S QQ HLD?<7572 449<? 9%+ (~zuog]RE8+  2%"J<>U7(4U!q+~sjE -! ')  #      37< : * 3$ ~{ywtpkd\RG:."   { ,:PJKODK&WWMC/%!# &1!';!4%#4!"2 '** "       $ 0 A'/ yvsqomkigda\UMC8,! n    u1V `L('  =5&k]E_OE81-."             & / a^\ZYXVTRNJC;2(    ,#\s |X8/)nLۉxx8%                 !  JHGEDCBA>;61)"   2k   W !K$71pcT8%                            643210/.,)%     r *_   lR _LRK                 !#! ! ! RMIEA>;852    &$#""!     = %U  ] [bX)           , ""~xrmga\VQLGC?;851/,)&#!   F /i    = scjn.      {uojd_ZUPLGC@<963/-*'$!  ? Hs k9v#_s ́ |J:"     {uoje`\XTPMJGDA>;852/,)&#    K   kAh$-    xsnifb_]ZWUSPNLIGDA>;741.*'#    7"e  j]IL# yuqnkihfecb`^][YVSPMJGC@<840,'#  K ~vcT2T~{xvutssrqponlkifda^[XTPLHC?:5/*$ n1Gn$1}  ~`H2#Z ~~}|{zxvtromjfc_[WRMHB<6/(! GQK X  wU=*!] }{yvspmiea\WRMG@91*" 7=l0i 35V nG2,o}{xvsplie`\WRMF@80' +Ss:n }!k  v^B6y ~|zxusqnkhea]YUQLGA:3*" nOkfb 1 9u  cTG*! }zwurpmkigec`]ZWSPMJFB=81*" @S\~=w*T    riT=<  }zwtqmjgda_\ZXVTRPMKHEC@>;951,& $*wO 3kI |cSc  ~{wtpmieb^[WTQNLIGEDB@><975310.,*($  Fi$3 n0 Wvb*V P`    ~\&    |xtqmieb^YURNJGC@=:864210.,+)'%$#"!  c;Y-#nG[ | Tw 3%    qmA=    }vpkfa]YUQMIEA=:630-+(&$#"!  m-U7H  b Yn3  z}Yz   wnf^XRMIEA=952.+(%"  yr9!-l{Ly C qE {Y"     vj_ULE?:52.+($! w r S n;= c n(]  j d+@     yl^QF<4.)%! jv d1a!]q O  %@ w LmE    teVG;0'! Kpsucr<3:nlby n $&&"  ^d0      rbRB5)  btw[G}L_uMx? ").1/*# RdL2   scSC4( 9:j tmim"6^v_IZ /pq%'6,:4G8M:P=O8F,8&6! 9vPJ    iXH9,   nZorXouIh `Mnbj] p #8EJaRj_x d|nfbz\l WbRRXdF\eisrT%       qbRC4' 3/usSmcs!X{?b %IIUu"?>M`w{v atUc^n^tb}blsmp` B Zi?     m^O@2& P] {|\Prn9U%Jg8O L~Vzvz~ + %oz oF"    yk]N?1% *7r yM|\vRj|":P>F40Ho  Wg+(   d} M d Q6     yk]N?1% :D yFf[r!)6GLP 'C I\Bunex\uAW9J-;'   (e} }aXC,  yk]M>0$ % -! '0@G g wPQ`:A-/XaaMEKXR&(   - `j~Ch_TM<#    yk\M=/" ^ _ V X M| :c*A'%78:BMX#$,*k)LLAJjNv)D     1}k{ Tq cZOQA2      xj[K;- & o  y Gy!(0)N\:Hi D>TX" /7KX W Km=fL-1QL34l   5Q`WX|/#:z?;z   5M.Vs:y"~%T]   n ZeQ\aca_VTIKH4*     |l[.8Q6=m%.UDz&F-Tn&Hz-!B WX } Yz3A n  c %. > CS =;7f:?O yz QQ 7) 0) /# 4'!/DXx w } &l I 4:]al]][kleddWT@J9=1       0<?Z(B 99Gv+)0 Jr"@o#Bs#Jn'Bm"!*o nV] | u~z}fk =VnTs inrhn v Qz %3:  nCB 472o=U65+#,"      5?PNQR]IC0Pd_ggkwi[eePOLIC82      +/DO L Xr[{ayId@l0 1E>RZnh?Z+C'7%*-@:?V]etZk Vk SPNK M[YK cYKi -+(.$-"FJ  U^ QmA>3u75LxM       9BTSJTNP:BVS^Z]lc_WePHJEQG7!  $.&+%10865668EM=L ?[$' *!HSPa M`@\L[M]YlYkRoIa +En@Q[eouXfLLPR Tg HNPMHFL7 K6 sx:B ;1 289b?\ | $*, AK31+S044x 7@_% %44HHe\vMvIi8V%2 *N[]RQN<:FK]JQ]ZJY^KIJJ>F0 "%.&+%!#+$.(+";2031'1()$/ 3/JDQM@K'3,,DEILA:W_]qPr ?N >S AQKvPn]ezkWm TMSVHJ7-GO <9?2>,?- 5`OUZ #!nhQ3Tu t{mT` KQ [W g>9"$-10Z1F\f *4GXS=&.XRJJO_K<,4I[JKQbN]TNHCDF9"  ()!.*)')+ $5*-*=/51$#*:*E4):1CE03604*9/=5IVOIT_ QPRURhWzS_}vSUAW L<SMEH!OE*'. ,& A+R@ --b sM r jLR,'&7 ,QJ=I50 *b*04r 6%D  'cMberDBG%@.G? F# MOXE/-BORIIM]ILIH'N;.'( %&&+!-'-#,!55,.%!+"+!:+/1(0/#(;/+*3* -(3)5/9;7';=99>8;?62K77661,"aM83%=)& *6 -'f iayz  %I % .   !!+N+C"WJ6>!/)w+y,yU{m+ &Xjkh@MWR,/&' %!  ,=KXNJ86JNOYNUCF,7$0$    #&*"+4(!.+:*'%1'!$0&5$"!    ( 3#.   6'70-) 1$+'(4.*%D*/#:$.)K5;1  0! % (   )*% ^ K jf x Q'G&  +C,E.C6@=UCWCSCT9?,, TMP RIE "-#&#%5+(*.!>2#, //!*-*  "  3 8-%&''#1)&*'0-8*.' & !  :U 5[mf{ 0W?N9c$%;TPsem_]xYxVnQo!2!6)p-y+ln&3  4K;eHp[%:': #"   (-8A-#"" PMP OAJ!' !"!&)#)4%+(#B4-4+  ,0/   "'%"+)' %% #'% ! /$ ' v /_ ZtF &Fc!+7EXhnxvh_TnOgEVIU(<(Z(l+pGh,d /E2S6N?d")&  $ +8%    LLt'.36Ovecedfdouz~{sG1#'b*n&Yl U,<)3(>MYc  pi=43x        " B!,V5G9H)5%* )0",B%'.)!,#  zk\OE@?%A9*(#%" -" { &,38<>>;6/' \d 7@p@gLpcs|{x xz {a%O";)a'bLd i;`&4):u&   t{9('U^M       ! "!! ! HH37>+7 !)$'!,7$"4%uh]UPPSY 1&KD+'  ( >)4%!)%!#(/6>EKOQQMG>4)#^|}p3e8"03S kyp m|yu s~vd+q.'N&_0N{T"37FSy   hiq.EC0    )% LS=##!',' ! 3$ ,$ tkebbek  ='3/ mcYPHA:51-+**+.39@HPX^bdc_WMA4( RgtgW 8]LR5d#9 #)72K 8T Gm Bl [{4_& &' 5@ VbFO:iXtJb` %% *%6(B(D,K.E-E1M2N7U8X8^>mAsEtPd&D       |ywvvwz}F+zrjaYPIB<61*" J'N#K+ 6%<AU #0g #4`EAFAp>bP]d (a"3l?lj % &9(>b "&O,[>j`-;u2Mk&% #  "   %+1JMt 5       |uojgdccehmsz#{tkcYPF>71,'# $*X#G4!=#;2[Frv !?5-'" .'  /$=#@,BAN"L  =wIIFxK|7]?HX !bBz)  -&7]v. .#J)Z(c)I4_@Ln'|->c#!! !             (!!xmbYPIC>;::=AGNW`jsz~xqi`VLB8.&  0 5$?(F5SJ\}!> ?gQLQOx>^;lDMqc$'/3Yla($$J+_-k(`'O0]9vJi!k!3R      &"$%%  vi]QF=60,)()+/4<ENYbjquwvsmf]TI>4*" c&<  +d&L'K)E*@EuJ\ `)4RNKHoQwIq2V?M`l!? +?~!C| &%'D+[,h-h,e(M4\:uM ~!W    !     $#!% !  xj[M@6-& %+3=GPYafijhc\TJ?5*! .\ Ne'4(0v- 'F'E)C;MDu?jP~ (N (#((-9O\RNsOl6QkOk_        "  &%! ~n^N?2'%-6?HPVZ]\ZTMD9/$ (D[ei)P;']"+(J,J,<?`,L(<*H"!64+p!&-DpXZRyKhR`gjNk:Q@rP /^ !.)K$;%;MMv.'=/`.b1f*`.PZ n*          n[G5%  !(.4:=>=93+" %DZT ^&B#9,P32cw y <1G*+Rxjx^}7T>mJ*N(M&B%=5MMeJ 'C-Z1f2f.VR{ R             ~lYE2"  "(.36650)" &@.O  + &524^}65a8>fxg9];fO2g,H(>$3I{Ty!' $(6]6i5h,[T| ~ 4c          ~lXD1!  #(,..+&  'D/eaf9b  /5c 1BX 9MkwC{7tO1c,D);4OLd Hs&72X2j+_L}m @          nZE2!  "%&%! -Q3o:Ve-]9j -+=CS_Q;}D/T-B*;KXu +F6n.hW O               p\H4#   -M6|2liv)U;q+#(18C|:B5S,<=ZVv G  &.Z,dN:v             s`K7&   $5x3wNl (:k } F%83_B}5G5@S]{h)R.eW 3              wdO<*    n0X1~:_ 5 +ed ~Hqqy #  %(=T.5Pa\o%3V8t:g           {hT@.  $072dx 4,UKmQ~KWux,1  (%3BAD]ktn)I 0XA}(            mZF3#  8p5{ f 4C}&% 43HzEjlD1-=C7B52Q[^oFZ4R3_x           s_K8'+D:W "4 .BOp I^($?mJezq DP>F.5GNYhY|}zy{~8Y zpf         xeR>,  #6 Wt ,X7R5I^r2=, 4U\5d  #4H]q2/c{ >j|slhghl=B67P_Yk vh\QJFGJPX`fkmlg`VKB;       }kXD1" .FT  "3G\pLaPz{od\VTUY`<6;;LXPf wi[MC<:;@GNV]aca]ULB:       q^J7&7M5b  !1EZn>.KqcVLEBBFL/(, =O* /BWk}09 xhYJ>6114:=GOW*C gpy{n^N>2)%%(.5=DJNPNJC;4       }kXD1" />  ,?SgyqaPA3*$#%) ;BOe U`ku~}qbP?1&!'.5<BFGEA:3-      q^J7& );Nbtyl\K:,"HY!.9CO[gs|~teTB1$!(/6;>><70*'   tweQ=, %6I\o~|tgXG7("-!)3>KYfr{}uhWE3$")/4651,&" Yjz|kWC1!  !0BUhw|ywwvsmcVF5& %0=KZhsz{vjZH6& $(+,*&!$/=N_pq^J6& +<N`oy|wqlhghiie^SD5&  $0?N^ktxtk\J8'  !"!&3CTfvvcO<* &5GWeossng`ZWVX[]]XOC4&  %3CSbmsrj]L:)  )8I[l|zhT@.  !/?O[dge_WNHEEGLQSQK@3&  *9IXemnh\L:)   !.>Pbs}lXD2!  )8FQXZWPG>8458>DHHD<1% "0?O\ehdYJ9)   %4EWiy~mZG4# $1=GLMIA8/)&'*07<?<6-"  (7FS]a^UG7( +;M_p|lZG5$  *4=A@;4+#%+144/( !.=JTXWOB3%#1BTeuwhWE3$  #,3650( !&**'!  '4@JONG<.!  )8IZjwynaQ@0" $)+*%     +7?DC=4(   .=M]jtz}|ytlbUH9+   !     #-5983+!  %2@N[djllhc[RH<0$      $*--)"  '4@JSXZYUPIA9/%      ""  '1:AEFEB=71*#     $+0342/+'"    !#$"      gdalautotest-3.0.4/gcore/data/reproduce_average_issue.tif0000644003401500001440000002703313614004466023247 0ustar rouaultusersII* 'q-=S P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9m7NgS}?PhT:%GRiTe6OTjU:VWVkUv_XlV;%gZmVeo\nW;w^oW`pX<& bqXf7drYy+n\-ulZfYdY%epTY1a@1gE5 0;8WHX|Q P3 P5$ L G#nKK5NӤGRYYucX9ug5ag&cV-mWmyU#_RSVٵNcfj-UnëU9F]Tn3kER[U ڴ6ݹюŝHjTkSd宆_? e)<%r4V%wqr BM=3dv%k]lauݘ!w{=zb!cyF1c7z>d&G׳F?/d}zy_1^sȀP g0w(af g3|U 9&h٣tϺ D(=.yµW1\> Ӳv?[|E@?]"T|bHn&"LR'EQAET68@%$ .}?6Cxx=g8 bhA5 A]!HEH+$RLU)$䰪"NIS'HBT yI)(RQI+Q1I+,2SKQ(BVI[$`bVIY*t͙2e Y!j$"fL!7ǒ3bȡU" HTI*4"y70%RVM?RQyMADҶKs/hT&JY*US IY-RPQ@(" AJxO=M7tN:')@n 5P f 0&juP: z%V\K A,%DNVA($ 8H$xH $uyFW"XB*"DHBAA?Co7Ypla5xk !4pkC`j نf8k [z-ź 3[vi[ kC5кA2.غP1P%߼!10` !/^yoxc!x1@xBb !p0Bc!/B] h,Q 8&HE! !АAI %b0M@'~@Q)`HC ,"`LY PBNa\'LBN$"LBV4 yh pJ0$ВH#氌AH $B^Y ( В`G!@`~.$%`xF) &=`Fk C@!`3@R~h?Yzh;]x<]tx:pAh6`T+@v >qp6x 15`P~ B0@ B!ø|ioAEށ v B =$hp6@82@`A/'d /rZ Ah+ T x' ^ AP.^ 8-D`\ (- ^ A>L gCT 3`QA@4`n `:x A9d H)@p:00H y@@ 0"_Y_vLGn>G Oн(_gMA8$}OpV /Mֻ? @bA7`@ ?`nd|^`ZO|o\NOΜJF@N`B64:FO0BBpV0.f.V~"`BF^@nHPހXVZ`t-MDDfĠfpr @`m ~`Z\p- ~pmb\xz`W@X\H` `X@\bπb zX `| i f `j @ n\ Rr2BdFTr Xpx R`\rNVNB4`EϚ@N8<JO(F`J R8 2`B:@4H>`>@:,$ 8<2*@O$P@?qr!D@6`Ffr["@,0*644> ;)@9)@4`-)`,C6O=FBq`R`O J0e&RU P0e$J=&(,@.)1("@*s@/*82:/:PI&E3F/PR @28o.I 5$F@K6kL7%L'3O48\R;@Y3Ӯy./+5M:S[ѼN`@B(B4IXV.~`J`g>j i@Nhdd^`UAZ@* df hNpjfM@fR faBa?@`WF UG\dcA@a?"FFt[D```N`P pԨ gbT[KԶvtgJfMM@ilVT{N |jPmOnZ`\ ـrt4'K00 uQ0 rTp@t`@zR5ZaVH`~͏L X@fuEpԨ`ێ`o: oFrple[g`b4"\_>b]A5G n jgAUFH.?o00Qn3y%2 7 i[6VgygRVwF JYF IfKiTME`LծtQyvMrMyZuZ@wD`x V" Vwolf m @@j n n @޶@Lp M'rdĠio @l  t  | lT 7x \,` \QuS56^uڠUzPkO|VIKJ4}b6~@dVT~f@Jz@r lV@zq4۴ @f, RxB\,3 .2o pd@VTNJC<o>Y93Qvnu^ o?j D@\oBqgvoMׄ#Mm ~`@c a@X`~,fM@h $Qpj @ @tz Ql ` ` `  d  x @ ` @ Z ` ࡛`@ @ | D ` h Ö ` Ú `y@6 @ ߛ۔ 3 @ ` z ̌wwpeujmn *b@^` mSh t wO LQ @hǀjǚzz:`wj~? ` ` @ @ f x ̆ v `9r vy @ ׀ t [~ yي ; `h ۸ zh @ @ _` @ {yV z1a`#z7lLŹᨠP @` ۾ Š [8 ս ݜ `@ ࿴ `u @eP1wXİ8` $e-n q}P`XZ{y`{yϘ/oМM`@wM=XZ|@| h., 9O0P842!Kl.0@m4  > TH 2.pX8 ̿.xF+>DA8@ /4cH,:@@6KUA`8 -2L\ 2\ 349 '-.> O˻=Jػ\9.ä1 >, t0551@Č @=&4[N ( VMEl XWՂ2c]N80 :-8>GARlJ6,[w/EQ$,YM.݂а&ȂlH$Ă,4`& M=q;J!CoRql8ICt5H 7q9< /%}nJ2񲌻 Lňֲ<wwWt@3x;UN~ !\!e ue9p%BlP hwgiy7;4 /?x9fu=۹僘XzU h`zn l@;v /]E ./ :%ult=9fsGQh/l h%*,n ^ mbV lzZ+'?5e&x5Ǯʫp0h@Dh@V502)A&ߢѮ+4 5b5k7M5>h؆YCQU8~U$vs&63?/ Lf0qZ)veVj$ֽuW͚X렬EonW5 h?!^iu@@BGMtq5ߑ>/8\{g隘*|S[j.{ ɬnbxfh ؔfS> =IPY5"8aq П5`Mrnv9lMsyּ`@s9D5Uۃ}oԨ"kהJX"}O3ѵhdpО֣ISS}&Y4j!v}y:'RQ4O!>wC75j5?2MP#Vdmf@AN̻Eh0`d~X$J =yWj +++`` h1c1`@l Av<@ф|Ba|@mBFA$0B F a$hH0%ܐBMѺa %Гu A8%r`M W(%{rxL,%\@="[ K^{a! B ,#0/IF{%w`61!8/ ۰1E @f.@l>!b+smB(F!# (HA%\u@K $&hP !8(ФxS a@*@BR T)ФT `*PUA[=|BWA_:`HS!SDfj9+istZ`+0Yz+5HZ a`-s[ AcZk`ƧaoTB] ;,l B^ p/_awhݦa[Oi ;Chl^{.൰{0núw\{/෴`ߜgٴchn]. wq a0@"<2PC')|N7* ϚP g桰6|Xk !6Cpk 6txm7 q o qa9@ïi:~x] 7[~o?}oS?C$B?A#<<[@ < >K=T==|AL;;C+:8x8:h7A|B 3585cP43x08p7x0/u5CbxBZ+65C *4^xcg _h֘=95*QŽ誵@Njxign.1誂6ءB>jFprʙ9`Ԫ%wt0P6n!**Qeo&pwe&mf V6* 5l V)=15F4cAI^WŀZPD8S{`?F :иРS$M0 Qtś!-'XRǏҸш{ @ H + ,΂,r"OXO_RGv}"-'# H#G"HGȁpxG{'с} $'Њ@ƿR@GX p2TnB|.`x/C[k2!Px,r!8hADt1pAEфveUC E"d\.B,/R1x]8 ô̠4% 1U|7Lu0J]UQ& |!aɘn`\apX PZEB,:'ND%@D, B0@C,ȮH0N9@FDŽ+A$DC@@AHA2Ѵ[^ٶ~[۾[\ ?\_!\)ܿ1\9A]I?Q[gdalautotest-3.0.4/gcore/data/pixfun_conj_r.vrt0000644003401500001440000000104713614004466021246 0ustar rouaultusers conjugate conj Int32 int32.tif 1 gdalautotest-3.0.4/gcore/data/pixfun_phase_r.vrt0000644003401500001440000000105013614004466021407 0ustar rouaultusers Phase phase Float64 pixfun_imag_c.vrt 1 gdalautotest-3.0.4/gcore/data/byte_zstd.tif0000644003401500001440000000110013614004466020347 0ustar rouaultusersII*PfS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|(/X1nW"*}:/D_]J$(*:%x 7\Y>_Le ]#/ϻ^{D"#[N*sÎ^صȌxVbg8[k8-*DCѢȘhԵm VuHYWms#뺌 <=0@J!iM ` "C 8'Qwp$egdalautotest-3.0.4/gcore/data/rgba.tif0000644003401500001440000000370413614004466017267 0ustar rouaultusersII*@RS   &f$@$@A*QA# w )#WGS 84 / UTM zone 31N|WGS 84|gdalautotest-3.0.4/gcore/data/test3_with_mask_1bit_and_ovr.tif0000644003401500001440000000434013614004466024110 0ustar rouaultusersII* NST   (Z ,S.p 4<S&>>>>>   @Sgdalautotest-3.0.4/gcore/data/int32_3.hdf0000644003401500001440000001247213614004466017516 0ustar rouaultusers j\ @ <F!gk<!< !j ) -K [Q 7 ; I gF<<NCSA HDF Version 4.1 Release 4, December 2000k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1fakeDim2Dim0.0 j j j j j   j   3-dimensional Scientific DatasetVar0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0  int32_3.hdfCDF0.0gdalautotest-3.0.4/gcore/data/bigtiff_one_block_long8.tif0000644003401500001440000000102013614004466023075 0ustar rouaultusersII+ BCDESsgdalautotest-3.0.4/gcore/data/pixfun_complex.vrt0000644003401500001440000000145613614004466021447 0ustar rouaultusers Make complex complex CFloat32 int32.tif 1 int32.tif 1 gdalautotest-3.0.4/gcore/data/byte_gcp.tif0000644003401500001440000000141213614004466020142 0ustar rouaultusersII*zS  " br????#  mtr@@TXAWGS 84|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{skkkkksckgdalautotest-3.0.4/gcore/data/ycbcr_44_lzw_optimized.tif0000644003401500001440000000506413614004466022746 0ustar rouaultusersII*, P8$@AP8D. A$N)@0 t "1D Nr@9e3d2lm0fsm8Lܤ[/^5F2h\2Φh8 W9;z00X2Gb0NB{SCkɚNgy:p.ST_A %\o4 fl2W:WLf4'3b45zm4Ń1XkŠ1P8:?X9P1@= @63/ 3;+* @-`:3 5 #X> 8/*,4C89/-9H0 #P/b,so!* 1(*"۪c 0 c+2 B0#EH ",#/, X0 R)J/ 8(( 5 B<2jh4 0%cC^Ab+ h=EBظ$ .Ŷ3X*-(1 5 bLϒ C5 c7 YύGB(D)#0,@<[␿x"< b(: #Ь1+r8 @+ C4:`=dHQ> 7YbmxD6ض54Ao bȰB/Ȭ3 P* T0 b' Ȗ,B|  p֎0@)78;]i@>d ;5x< "7 !*@8X+8> 2⨒$c@)?F1p+fy$>/T0n̐fCPc|- lN[Aa83,sad7Pr'X%#[_ ah*@䜡0>6#@",Jx!,.C~ "Jhl aP#ByQ,%f )Y{ -PCC<aR.tW8p 7i +0ܖxs.c AeI "@@Pd \-0!f$9qDȷD6ON 2 `jB.ܾQ . ' k  RAI CIؕ;`E7 u1zx4(8dVJAйm*D\ "EtDPVAh4Q qA$ĀQ<ȀB E!$DN B\!Y anBT;Р(I 060e?,&@EqBb0p$bX=˱u8potuPZ45`+UM8B :"Epb4p>B8U A 8r ,p%(@b0D?At@0yBtVd BaÀDE$C8D`ڐ A@A$Epv )?(b (Lb5 (U,$Ck aAXAz`a@!A3vx~KDB ! C?`!DPp Bpo/ shtH6J p+R "5 9 PJrh>k\I4=q^\&CM 5{"8rb#XHB$C]iB@B ACv$/MP*+8X <:R$D Ap*AAX/P /$AZK%Cb1 R!CP3 }H% B%batk8JA!q %Q1v !ݒ!.'H\b=1 #E"b,< @& &`A@`!w,,q'xp4I"N * !F` Dbt>1#X 08 `Da&%` 6 LĐ|BBퟴSfW\ * X Dpm^(< 00 $   CLE/gdalautotest-3.0.4/gcore/data/classictiff_one_strip_long.tif0000644003401500001440000000022313614004466023740 0ustar rouaultusersII* Ssgdalautotest-3.0.4/gcore/data/tif_webp_huge_single_strip.tif0000644003401500001440000000152213614004466023741 0ustar rouaultusersII*QnS   R Gray Gray Gray @۲j^0?@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|RIFFWEBPVP8 P*>HL%" inۖƃ־zd # <-r2d#5)b2-y kn,=Tߩ~X5by5UC{ ֯O)#|E'DT-#N1G_v4+_˅f?"Ջ>t:68gdalautotest-3.0.4/gcore/data/pixfun_dB_c.vrt0000644003401500001440000000104213614004466020616 0ustar rouaultusers dB dB CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/pixfun_cmul_c.vrt0000644003401500001440000000140313614004466021232 0ustar rouaultusers Product with complex conjugate cmul cint_sar.tif 1 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/next_literalspan.tif0000644003401500001440000000023013614004466021717 0ustar rouaultusersII* S@Ugdalautotest-3.0.4/gcore/data/int32.hdr0000644003401500001440000000036313614004466017304 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 3 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/pixfun_inv_r.vrt0000644003401500001440000000105013614004466021103 0ustar rouaultusers Inverse inv Float64 float32.tif 1 gdalautotest-3.0.4/gcore/data/float32.img0000644003401500001440000002574013614004466017624 0ustar rouaultusersEHFA_HEADER_TAG@RG rootrootoXAAG RRLayer_148752350Eimg_LayeroXAA Ehfa_Layer52350Ehfa_LayeroXAA0 n0Statistics52350Esta_StatisticsrsoXAAR@o@)\_@@^@@`@@X) 6@Z<StatisticsParametersEimg_StatisticsParameters830oXAA@H dtDescriptor_TableersEdsc_TableticsParameters830oXAAVZb#Bin_Function#eersEdsc_BinFunctionrameters830oXAAR@o@eZHistogramion#eersEdsc_Columntionrameters830oXAAZZHistogramParametersEimg_StatisticsParameters830oXAApx R@o@HEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{400:fdata,}RasterDMS,.R IMGFormatInfo50ImgFormatInfo831oXAA@BBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBBf4RasterDMS52350Edms_StateoXAA @oXAACcMap_Info52350Eprj_MapInfooXAAKUTMWALAoALAN@N@meters&Projection52350Eprj_ProParametersoXAA4<UTM L? Clarke 1866TXA333?XA^s{?fOMXA+Datumtion52350Eprj_DatumametersoXAANAD27 nadcon.dat?@B@L@O@P@R@?@8@(@@(@@@?@??:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.gdalautotest-3.0.4/gcore/data/unknown_compression.tif0000644003401500001440000000022213614004466022464 0ustar rouaultusersII* Sgdalautotest-3.0.4/gcore/data/int12.tif0000644003401500001440000000167613614004466017317 0ustar rouaultusersII* fXS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|{@s@@@ks 0{ @s Psk{0@00sks@{@s0k0k @{0@{0{0{s @k00@@@0s0{ @{ P{@k { Э Д @s @{0 cs@ k P @0s@c@{@s @{ @s @{{s@ss0{00ks@s0@{0s0{@s0k00sk@k0k0{@{{@@@{0k @c0{k{k{k{s0Zkk0s Д0{kc k0sck Ќ @@kc0s000c@{ @kZsZ0{0s0{00 P {ksc0c0k00Zs Э Ps@Z0sc0k00k@ 0sJ0c Pc @k{ @ P @@{{{ P @0kks0kgdalautotest-3.0.4/gcore/data/ycbcr_42_lzw_optimized.tif0000644003401500001440000000547213614004466022747 0ustar rouaultusersII*2 P8A8T, !( GXx3&S9p+Ϧ [;El.)a=c:E!2'N#iKCyd3 c qe2 '9d6L&BŌ^5F2dh8 X9ѩPT*K@4Nig5'3\p8Nf)ЪW<&f2Φcc)Ńk(7'J Abb?ƃw7v%Z)k0 s ## 6ۆ:9lɺ Bhj0H0:C/C<88 b/7C* @-5 #X> 8 4O29 #B(64 h04̣ 6C(:/-B2i.~5 X.ȱ  6 0 c83701"( ; 3 "4,&-x, gQzFɬ\-@34Щ5C2H2@8n0$n-  ",#K!?4`â6 hX8<%,crӶ 𭦎vD`9yxDB U-. 2"/ Kx0 ⸖," @⨤:;x3/-0"7 !*@㐬> Cc /&0 Lg q |?l7X!pq T idH;D@P;Q*a`+BHHa. 64~C !6,_ aӄ !2PX L-@!bPJH$ L%DЈ A?%Di a4, *wX:IBha Àn!:pHoa)5PBA$4!>ª%,|'JN0D nHÈW5@"o `0r(AP8 Cs%Bc@]#O|ABD60v6"h~-*\0*ѐbG)* B|8@^ w <!Q[at(8U4( JjtpA@!D=0nA*>`ȋ.`2) ":"*[b@'B$H0xWXGФBHM !60E&q-I ZDPGNX3{8= T9p0< ="Epb4z`B (9&tVXRpKDX8: ɻ[ A8! <PJwD;Ќ-+bfh~HŀABA<p? :]LBe BaY$;xz"x\\ThP"aXEy!9pQ 012xY %Hoab"x <ZXaC@(^ (?o45ēC r A w&DЀ8D>a"xA<^tLa 5JF 89 vuA-(qA(͘BG`!xK b,AQ0 af`n G;V 8+`0d@ N4`B| +n-P 2PWDX5e D\!<.B=C@DSV 8WB$Ae4%@J gAx) AK !8<I1+$!A=ОCX]+80"HL8@D` h"0!87YD9(}axBϏDcgaEf 4@A( `CdU0fP ̈i>*6`@v$* a!0͚ @!@ V(@AN@NJΈb@2@ lA @ @ xȮ < a8 @ˎa ̷ a( p T VXR@`H<00 * "  CLE/gdalautotest-3.0.4/gcore/data/bigtiff_one_strip_long8.tif0000644003401500001440000000037513614004466023160 0ustar rouaultusersII+ Ssgdalautotest-3.0.4/gcore/data/cp866.zip0000644003401500001440000000041613614004466017237 0ustar rouaultusersPK [U7DPK [U7DPK? [U7D$ WR㭽wwPK? [U7D$$ WR㭽wwPKHgdalautotest-3.0.4/gcore/data/pixfun_mod_r.vrt0000644003401500001440000000104513614004466021072 0ustar rouaultusers Magnitude mod Int32 int32.tif 1 gdalautotest-3.0.4/gcore/data/stefan_full_rgba.png0000644003401500001440000006730113614004466021656 0ustar rouaultusersPNG  IHDR*c6gAMA1_ IDATxiUՕޫ^ͳP58P&8!6*h1 jI:+Ncda&LJc4 DY2( UTAw˽YU{})4F uu?o\0U$!DQXo~;r1z,kg sH 0@\X P1$W{W01hekU4V"}T64'H +%X64;M;k~;fM" ]lVDaŸ{{2EX LrEu` $'kV{XY-ru#'Inb+/=m3sM% kIn)u5B^Jlذ5i*pt]Ij.5ˬIgUAS]]gV+\ "܈Pg,}JP,Ou?AH3KOLIƕІV%FTX hn+lp@C+"R|_aػ %9JQ0jIF 0Z ;)졑w/y*Ŷ-s }=#^ >=HFWMP3\ `0#V޼uүQ:'Q1t!sޣVQ-:G(آ28 |뾀yWhyXZ jI0hmD7a󿥨}]ww-YKIC`^}*GyYX.;qQmh%؊g-3̱(@d薀.8W+ jϭF3x֫YMz܀̴96QxA('Džl]BA~hB9ֽTyi\6f.HcyaKdVjXmLP~PojqKgZZdSo,Ҳٖ-?>R DOa.\Mק)ښ,L*o*gW\zg|$뀖7u/sׁ5@uz܅EPkGX8rVqPw 6@KzwT`0Ex`eel}g27nT`IqEŇs XдsV :Л]"YA)$@)l,}q9b/"&L8:,]:vn'!v%Mq(C' #U ߲xr^ w|[,ZOI0֮}k4}' 2xf~ߑBD,fXNcƷ19_ynҝW.xWdi+FJܺ}F X몮 dі; CzcCBk"1Zۯ|I`+@mUp,*"J)&^ hBK 90ϫ9@/n/M<7u[Ɔ쬆M%_y%Vrymc%WHDdK:9xʡfꎰq>8;6]ez]z:!*N8(/$'`zVdQK3n# #|oK㯩a jSFՊ6>a6],{(;[_<*F4&= ƜϚ%X.bsT>inf2|^I7BH1!zRwz5_Zvde3 M F|tF o^(8Ve- Jr9u4⊐nQmP@ih_"0(+ 舳mA!CM"G4K~W=\g 6I~WK8|1Ҙ$ ˞~džS" lPR A`C5(!,ǝks( җ|T@HB* (F/nZp*K 5y(Vw3]g&14@%1qϋ4:ԉ0LF`"`0(7ˀ-< S*whBx+J2x򪳺2{%֦I^X:z~88\-P""ժچ_bkhU|/oZba4Xa[:3â/vexkګcƬ =^x\ҽ^) `' Y:Xp_ݕKǥxqe=t zVrܯ_6#m4CXc1+A!gi9 ޷BBAdN6PI}`u757mLR0 N*FJ ^kV>˱V|7xNP?CZn$0{Wo@.4&cp\p2q1v7}^8?Y>3T>mg#z8!iک8Vh BY$d>X )ס r>}̟x|y}W0qLYɡiCj8[$(X5B.x[+bs|nZ#3*ر)Eaқ Q+cJdf Rˊߖө1B)W/q=zopۅBwl4By;٬E^nS1dTl 1DN ϧYĒK'^sSu>nqki{7snʌtfyq^j8?\Yďj=R?¡mwMLp˫.]'(M.T JY ˅HovDCT v6tT0hP7>Vl wѷQ-6=0)〵Ouy3ΙU]gw{I}Bт,ac\2@JK96!8 *e Lq ؎ # F6 " I#23wOfFŖIUU]v=|oJ=qJFJ/ 9uӫB!h2B@@3WT]K8@3pRsHMXöa Yظr't^_\ d'߸IK zBsPV~Kid{rpRc6'UɍK밫h8'BwIW;0N4eǥxj4.㝤ktuԍ`D#o!盗g7yW8'{jAY2`*n} }p11qZԩl+?aّ Q ULZw bF=MqY,%[b{OEk1mNo=^ ʲ*syf[ EgL`cEBQz6ȉ~vS`&6kEU) eyޥ.ܣh&f[Ԥڋ,:?e+;F^.g4=A̽t!6%ۄ"m_2FhW*BwI}si7 M 29$[j?NW&[) >CHQ|jC6 697\-!G&KȎG*bٔ5 }uJ}= -tP4:Q>Q9QbCbS]_&5uW[yfU=BoGq_5M8ӧ,Mgxٕ̍~m%H1|Ha[r~!^e%~q[~!1.HJj#PlRר7[N5̓5gӁjr3RK8u]}<՚ͪU#e2ic;%T@K5a>WjBFUyKP ᳿s`3'NcK[y{oǐ l ںq.z=rumR&(H V ۃj*搁V /v/rZ'+%L?-)e=kഌ?SF (p1gRHfn9 d8A {SwxXz2s2>1W=Ͱep˜.]r;QЀqˏ雥S]V42uIk|mH"ҵoVTavI3y#^tn!@&ٿv[*,8-Ѐ@MK.ާQ 唢 VygG wɚ B5-ۏށ!k$@=WdGaTQKS/; lT sb9Mf%!v1rΒ"ݿ!| .T^1ufNBphX.w';8RxuPE5@BfmWn{Q(Jfk M]yof^ް632@Mni @[^ 0U`?y+ujgWz,gxt}x͂!a/))z \:D|y)yUO4:ƛk`Osh=BK! ٽS."÷ nTG!ʾCُLϥp ~ZzkGi*PZ)b Sk1"ba ;灆WGd^Osc2s3{# MS=Elfz^xkkB%Ar3dF8h扻S7 n͓Ӓ&4šJFL 4X3x>y񑊽qR?^NX~I?m  Oޱp г;?]` FU W]GWnXlxy^:Ǹ8(q/ޛ3Gm򉿾.ޚmOT>,ݒ|jV.;{l ӳ&nAJ>&E夝vNI;i'`wDMw& c 3QD$1a5l@\޿|׵vtі/ ˲eCέصoa5Z%ĄDk% #[Jωv:vYg\uKv /a歔G'vꉰ+iA zf!FDq*cRJJs,[U=08E~5[z7iȇ{vB@4ZA{PsK>|6=^ncBKŶ6ZZ|,^ˮ}cguޘ}VADr>"j&ʲ/?EU;F0nB.m]`Ņ\$e?ᙲ%0zhKשM@,րRt˖LװD*"cUݧ&yQ/4 6&8m, 6c6Wx '7ks'R6LoEҿ)6twNomWCqSIX:Ka@m\~E;ZSn[mYY)pg1F%FjFjIզ 0 _LUVU.+=,01bC6'DFkǪq4d5qaL0x>}AqĜ֝Yf-0VC>Z*@ݫ6m OU7b抛Y(QNr1&N?L7ck]r?æ"|lڂ"AQ}0&X=f3J,ml4("C2nn#pN12P\Ч!>,g3N+jit\PIyxh‚Pk~y0] թ8sMG>ͤc]Xgt5^_=S&AL"*J[@<-}Lu@zښҟ[2 v=@&tqyB r RXDHZLAъ[]}?T5)`#8i&]ٗ}x͞:3? |4Q gl/Ig<Ё+>.U}C5g n2I)$5uD-r?^%Iye_XKA}pf6ϰG2p߆mX4G/~S qCQT3xE^wήar(?/xɈ[Or+;c|齅VGNYar24g<ʄ}!\_}5™ʫ |L~s`}}y?faƈ LJo^#l U,EF`hYK~y;=?k<+eٲH} OnWjm%0zkϜdV,W$ޙGqWsUtϪbɲ-o]( INX~N @{^/ ,ŀ}1XcyeI#i4=ia[1=ԣ[ߺ߽{/V/Z' I@3\A\aΆ|MfÎ0i#r4xJL+?g_W?`0g}avc)gg9g v724%e (*~w-g=3u>=#bHrQ E-\=>&\#FN!grEzz&wb^9d;V0_/19М iV7Sv]$V嶴֑"'ݗ}E1Vo37|'Zu hJRkvK,<22cy;\AY߸_{pXyJl°QDqZJ c =(I*s(HɕǛU'\u}Ɯ~~[nm _} ps^hިҋCu=\3Aλ oSaw5DžkKlQE&&g౟ 1Հ+\O53y1^g afOk9 MU"i* [ Q4Y50PQ# N V z$Q }ʉZ&ob͹xB!{s㴕ul8v{_oi[4ƅ_ +e+7ǥ'M>gÆ6r/Zu1D[}ذ%GU"0@@%Z{'vhB   =%p`n2TpTqeCc,Nx .ԧʃkXF a Cem=⿒Chd=yxZN+9>0?e9<}b{DPVN;icpbqˉc>ׯ|zNJcŰV* >, 6}xWSJ#Pt wR y%Ri UhB\򽂭B>IpCþgU1t 2@J{3 i_9"}.ٯFB V^Z¨.ıûν|E0ײo 0LQ *&^eʼnF1!/|rp2<01#0%i6g!D6R&F?nL#Ztm R6pUQp꥖JU*gYk'2T1kKPyեH2på!컉{v8I>+[@`@AJ:}rB_^O ӋJ_)f>r#9N0aQѫ5/nklpݳ okx$DѤne -Ye$t.>"J\&Lw;l#fDcsϏh) s߉yB MO?EiN' 12zDkHc'DVUY7đR.~çYo92=x1ګW2 %aʵ`qNtvܼi{uyNVmє-%Z/"UAqX_:ǝ}s%\Avq$Z$wB'}}׸|lzm/g_s ݀ZAQȰEn~JJXZP~Xh(y:!dvTҊ8PTr>\t*MU<W]^"TUe2u/JC-p;\7%_B ɋ5NF=J~Ny!_$t#ĉ,;DP-SDS+އFE⺊B?%Ñw$V avPIj.yet!&tQkl rZ^iJ̐L"WKj0uCȲ?|M^~?ۈ=0l~{*o7w_}v_$)B:ũa%J<>{GY0?c%P!!F %rH'Ώ;p˺v 򭰥JTi@2Rb'8_ȍS~ .yq|XҘпVZ"a>6m>ǰv` /^)m_/=F߰zW*&geaG\l|MkIg*<G?S,^SomչMM&m [ʩ)̶̣Ҙef ZON+N-(c!9sʆlM?}i 5֜_4  =-R߯RYs9XusNk\`,TtX {GJpeon:çIؙ 4p.] I2*"*s bbԵ=\8;xesҳ =.p ScZ eA)/ E8q6!wzO?ESaQ/j'}h섉I%'!L] ^"ܩi_ihT擸KS_eoB:N a*^rJYָ$01:akb!h@@`.^Mg]j_%[& 4?ū_2ʳ_ecOhyp걊{0<ڈ9ԃƱ%^0O0} 7+gD[Wk AsVg.#MK9$fO3%㮩ti'q4ɚ)R.KڸğWn-\)-ި9gT^|yw۲zԍP.F)DccWlR*5>#Vtk  7@gQmsi+МҪ bp> Z[bgj'V ܘg5qjJqwBVكʣ3c bfo;ξB$IՉzo'^b@ /B7Q LID1՘CoưTVN7DiDv@yZ>cء⩊tYwCpw>m%E p}6/|O6 3 1:6*FZ09=_#6IuJRaeYilNI&fmӖ%'zJVO< ={GuNr,s1MFoU/,zJjْȈkqF hԔXZiɒ ȫI=$J쥓dg,deaJDS7 gt&I^`)jLLwUd=.hTWm4g'm%0,5O7DTXVʒ:?7S%_2;GZӚ2' I2$QNM9Mpմz]cSX$AbUc1ttBuQ"4Dڏ4C  aOV %:]Q22&S^%[^MTyixz3"˝LH~p Ck^%BrmT%7Mp9 pFN͸PA(0׋"Q2aۧ[IX3$1ti3ySf`ђ* ^ӱ%Q^|1#fIu tPHLB=Zn>L@2飝 tflr|6M#UHfc W6y&Fc`io1΢)}t@b#is'Y;klmrnT6`l+'ݪ) y28(ӻԋ˒?RxV<OŽ>crTQ9*GrTQ9*GrTa幎%YkWoUF*=[O(Q`-&A#"DpCo!ǚvO fQ{λwg@|99)\ƖOyCǐ#1ܢGX!B +F2b96jTJEf@cW_ ר{ ("KbEסWR$YsP?yqp߶wjW*[b|u0Vb]q¸qsxaPȃBzJeP*) Ge`#+9+ IDATJG;}=ċjɉq1=;h5jX h6x~bmL aEKΗ"7ᣗw}^ͬ>ZpU9jS'oρ9|"~} 1 $ $q 2F,RBCOO?z?)V( S=|c0?J$ /Pq]п~3Kfd;eGftoYRSu#.?@,.59$+M 8ᴑa~e_ו?}/P?0F.gX\#"yJWCZk)`u7G :7'̖ޏn f,-)-?bi_ɳ"ٔ.ZSA(Mp+ܪp8ōyfw 8rksK/Cǝ=߿;Or9|7B n>:<HL:L_˻SܲMZôKE kC+?"򼵈nakE[–/s#|z\΋!|&T9>@8?c[ؾ= IғBC >PL~mymeKҭv[YA8t=ke*&_R4Hhkjt)7F7Y"a F0Elce> :WQ[S^'7Y%[ >}'~Te®ٔ, l$ J&=^2IJ)Q*W b55 vAa5aHbβ>oJ@}=0Ȭ4nz?P'IWqKjXc; Յ-vB'9S.rFubb":ċՅ}w?4;_~"~|N;=O<3Ǎ Fw bfԓXCOjӿaR'wqij i5+Lf PO{|Ȧ۹ItrO$7FGxeB|6qWа;PDbDsZ^+|"^1`+ZQ9 Q< t34j8G_j66Rj>0CX%/a$:85#Kjj{y[mjV.:^p-9c^3>v,|)<{DZ-}IS,/2_YD`cH38.:9t 3sKPYc=d1:浰kO19g=y "D؉#jG^g!-16LφSBtLfi#PePy{,gAIx>`r[Ǖ"œS*m;%uc }YJ[˽n&Ak,X w =)h6clhM-{ь 2D ;Pw'w(BB(Cm|C4ā6,g_Wws/IKIؚSk Rf YpV(䰞PU DhV.eqB=cm w-(? S~gj*ߓڙ ۞<1JYci .˛J6eȳ6l9g.f{NK/=C0CD!b)QJ4`r hWbJ%䔕58 رsdN}cgSI)xaVey-Xt;CsYd?Xu+r(㒐<=a>p җDt.Dc ;P0P!Nu"a eu9eycn ۫%vV ol02劗y~o5frs%rcW];tnFx/~U˜Ua4e1^]}aY7AWAz E NZ ϡ\A+ ߞT>؄z((9SajC3Xv{ŏw]93ܷ]heɒlye/'$0N d>I83dC3|&!@H K0`66[ؖmYe-KV۫?^-S!NG\c{f%/+~qtȺW@~xo뎩# 1+[%x<L3}QY jpf#bD&"} -cnڢ 7pXqab,)K3;Ln^Kq۟~!u0P E"䐸[T2oZ%|"%sЖEYA }qlb\i1y0IY +,JoqaǷa#(G 'q*uLYb& MsΤ3m? |6lA 8Md>3qryЌoig^uS?}_t koq8~W~MZH? ~ ՙwgKesBGp}qGUWf UG~=/ވpſ`'-(4;Ddw@ĝdKEyC&c$[\1AUTO+|wh8ĄC. ` ՚&<4S, +YzjHrq˵Wr _ufmJ)+9l%"W|GȈ%X~TgW?A ~cРSc\(DRUc 4fh p׀,)Ag-U$W( kT!k'ORU -0Aq7'bNl J#:a#Ns/[ !xAV(j3.y|7?5ڷVf_s涐5K363-/-gÚm+84}(<'+g| <(FZ.٭QIb&Atן)OLLs@'@в9oO"WȁCB8<܅Y>{٫ܯ{4Ce0Pmws A\L5Z4C s> BEoup!f 9i !2J/03vȀ8hd11ԎOvWH%TUi"TPb#I+n]8<05QOitK6`y-GʪV\,BFn1m_a1wx"{|;ҳTYuгryaSJ泣̎L7xbiUjՊR;јsk ("RO/?GI#*L)!PmԾw-arņ p1xoPv=VFJ>30rl2vLy|wȑDž&uePuAs19ɐ(1qvҧĝ";Q*.:gf|- aYnټy5^4rV˷A_=D- ٖKC[wɱV"Lo|KN7_QKoPsG GэGZ/r% Pfղu 8љj ,xoyGR&Rm+,4+K(~17X rS AsOp\! ,*15JAR#s@",Pn rIQRj(9\'drA +bBzzihӛeiY%Ú [wR1b/tGoiD4ey+7t쳌L G /Cш N*[{qu2i:r0M޲\}G#2&52Pmm!Gw7OY|a5&Cf6׆(۬p񫅭|zBd,XTrW)^aò|/8ezy6f(yem923?/`*T>,cSk Y!~#5ԋfmE:3(#93JgZ`˂[R. Q*J&'B@yВ' G,˗ W xK<pذm}0a 2zL8t5Ld% +G|ص+0\7?- c|Lt|ˡ)>B.#LT&k:! }W#Z̰oF+}`Lm5…k 7Gޥ"GLM.&^ w4B4P&* j , H)EJBN2FUƾ*[LӜyoOĢ-3yqS"H%7y0rț8!3Q0x2 %BӳVp|LPq\PS.3HN5=',=Q}PVx0T "z"LOD -3OmWer9AzcO6c~{8\K!-?⫡9dZsӟDօ`HGVh)-g CLW vJ QDy.\lFfk =ky/Fhr%Sp N'7<-Kd( jゕVSi6Qȉ0R քD_ E7B,ZE0)pֵWsmW; -\B )Ы8>ЄBN;Jc֮1T%bj1̃ReIF-8: ٬`rqm)QdiXl!\l v¢KIZLF/rp{/Z9?2ǢO1JgJv-| m%GC.zÿˡq2AYuRU0v3`=(_O*4-: +) rEp9na[!M+,ܾ~8,)u֠|M|oD-׀B H$xSZjpYk7.x!er(aUh @od%lK pL G,_򔑃^t +xt8zl9gDnXE9Mz GyDU€p`ME'}#mO2iӮ˓/⪍F%W2ނ0b; ?b uFdCz%‘80 ] (F3p,3A2phYW7=OM(C›>(Qt}nr;bG!,A=5o{|,ݶvBqscL\cfH TPZ*T BlqΫe⺊mAX|FF0VQ6ICw ltHUdb#^lS72fEHJG5V׻~@L$Y:$q@_Y8w>>s2. QQ k6 }wX^厣f6BQe=4ǹC/kacP`.aRǘz"@"p3B~t`ɀW"5dMA8(N 8E+  K9ݛ|v|$SXm8zͪC'2=Y0GqWӟu'Nϗެ\>A,>銕?Ou_{.Yߏ96,@Cۢ09]M;KGJ}1KXXpA4E [ !\QY*+BA))J>V'Y?R^-\+ W(!Mi*F#w7G*wpqς+:8f &PbX-~W apIn $Dm^RrzSj N׷#ޙZn`:A>ܝ{匹U[=ss$?:-T~^:B ޼42AYg(⭵w ^m8sCn>pYֽ+*BsLhL=C9Bɳ8Ğu8ƒ7UE#(W} j[78x*,eEʱv`93ِncMd"*9OrtRh3B#0=eu)rcI)7ڣh#[^LXM'ih颚IAtw:D2DM+9␏X\i-ƿ=M"TIDATqtywÉJ43 }kcӚl n^p31t?gcT~Al^{`kP9QIɝ.Ney(nR\`6w-zoi$ !) E+[.R(|o+ ng<< 7fCō"6;΍^ݰw2i T| LaqUm.U]@lLs DHFNCO@NOoݩ&夻Kzy!vwcJ-P:(:R; V eMaf_-.֝*J0 aCzVy{?Wg [ e$XƝl83lX.g_ d* 5=/zd]Odg51Q7Y ` ZXjȜ`h!@FƣNs$D, 1"'afmp6|h~f%D[k%Th7] "^s\na~o 󅨮A؀0PV\mȼLѦr6jeIc,r_:<}{%07ke G,+cت-C_aYo/û[|in3G\ճBʅIMg]#ʷ@msToHW]Oa'Ch9l=AZ3p)8b3L'ti]+if>1ߜrk}ͮD׫:Qݡ0,̲?\a`頹wY֯qXpcd[ΘM|!^NaL c&N XPs>?ሉB Qb VE@|6.VO@9@rlu~Űrqk}͝ aG>䌳`w-ǰ8X*_\tKigSD^{o4Wo>3 7,J3BBdf~ G,5axJpgk,fSeY $c†cSNpϟy-`{\. ey Ǝ.A>SxE%(Doocx,~R"ݝ {NĆF|R~Z8l+!y%`|Xp=%hmZAo~3Qb{Wv1?(7gaZS9vXH4ah04f#bڼsOk>aPEZNC#ͽ6f)EΚSOf$f%B3Pvw{\rTӘ_&ڴ.NQ)15ϵbʴDz:8 lbp!ӄ" l-c)-c3_kC-'-˳T7dNnYY 4eJ+\k-J}=ŽRװH B} 5uGOɪ -}Q u6+AKZ4u)`1 VىO5goY[/Ζ$sk)gzڠki*~3eS3H2F1M *XuDQJLI!fry ҮҠ<6-hޕ'\~1jӖ#:>l,Ǜz;z@"Tsey>y/Z0#l>ȭ{[Iyڽ4/To=b_p \x "%BE :&1:UU=Y^“^ubtM"b#$]R.]V.BUה֖ 6beԢxFB8bPV79cwŌ3MhZ3u%]bY#~“#u&YZtmpӠJ]`ƈEg.(n=bבk~hP#N'2Xww"e&tcEy8 |vH,t&rq2Kٓ11L!=/2RzƁ߅w!CmݗŨ3 qpx٢3ipB{,ڟe$Va[ġB R[+(o'e,[Ύak cR;_sOwBԙoO,ua 3OTkIN[0v&]A,stm$0uN:o)mKbLS<΃<܉Jϫߒ~iME85:{%^ P(.+mOk}.O+G0@3*<\{l?6%zwwpX>K tR29n/q\'ua?㶷6sBb%0ّpOc@&\:w5_R(-|j5gڎЅ|iVmGh;,> FMwn&. ov{0ґi@qI/Z0O$A<`3:?UmY:d\,9=$!O,.$rbZK(KrV_2O$G%Z ؖlcI'u+%uO,='iblwT) \a-˥?QNbGzliNVNNv&L `B'[~!hsbG1yDً^ @;EStN):EStN):E?/9SIENDB`gdalautotest-3.0.4/gcore/data/ycbcr_24_lzw.tif0000644003401500001440000000407613614004466020662 0ustar rouaultusersII*6 P8A8T, !(LE|h g"Fs <̨#!^>sQs4%rلq0Mk= f31d[/ 2Z; xc4gPeS:;~Ac\3p7k/N_1I~3sw7'3N1 تR1"ʦyj`3 Y / 1cˀ4 "( @7 /B3F3 Kj69#*t1 4#0д< KC.#ȡ$ C30-/X. B K;,r>>8  5C5 cp3b3+.b(c`-$ 8-ʱ33C) ,HJà= #5  FdH= P@Y*ؖ, y6 (=`ҡ B0R@5 3+ cR5E+X&+`;&lHGD˜9T0BHĩ:āP+թ9 U,c1H1b2A@31pgC҆8 c(/о2ո/0/(cP-D:0)`987bCvc(5 mRP x6 OdO>@qEq%Ȯ@"6$P6H59b:0$K8c )nC4#!X9`78H9{b: K^pn$;Hذ,! v EI4t,wD,Dps a8$#Z)f B08A )B+ u F!0jPD85m: u`; Ap(aR B2LAhp A$`!°vtԜ$k ax/_0r-:!?"D3@?D`P5B o\9ADDu S"RˆP+P9 `:(y e=q!=B! w?:W@N+7J0rB̑PHO1X40Ȣp"Ŭ M@ āEq3郅@rB'L 4I 8*I 0C!KZ"IyG"C @y@Pb0H P!Q!%eyC+>RjN A@%x` p䀀''.&CLE/gdalautotest-3.0.4/gcore/data/nan32_nodata_warp_zero_to_nan.vrt0000644003401500001440000000443013614004466024277 0ustar rouaultusers 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] 4.0000000000000000e+05, 1.0000000000000000e+00, 0.0000000000000000e+00, 5.0000000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+00 nan 512 128 6.71089e+07 NearestNeighbour Float32 nan32_nodata_warp_nan_to_zero.vrt 0.125 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 0 0 nan 0 gdalautotest-3.0.4/gcore/data/md_dg.RPB0000644003401500001440000000350213614004466017263 0ustar rouaultuserssatId = "WV03"; bandId = "Multi"; SpecId = "RPC00B"; BEGIN_GROUP = IMAGE errBias = 1.49; errRand = 0.58; lineOffset = 812; sampOffset = 850; latOffset = 41.8791; longOffset = 12.5798; heightOffset = 95; lineScale = 938; sampScale = 1152; latScale = 0.0150; longScale = 0.0225; heightScale = 501; lineNumCoef = ( -6.181087E-03, +3.510113E-02, -1.109763E+00, -8.245546E-02, -1.574358E-04, -1.151270E-05, +3.785618E-04, -1.617343E-04, +3.392421E-03, +1.557476E-05, +2.094558E-07, -6.314112E-08, +7.033553E-07, +5.121700E-08, +2.389848E-06, -1.042301E-05, -1.402098E-06, +6.953425E-08, -5.038526E-07, -9.876127E-08); lineDenCoef = ( +1.000000E+00, +4.696998E-05, -3.057960E-03, -8.778793E-05, -3.454986E-07, +1.971646E-08, +1.083809E-06, -1.723920E-06, +9.397055E-06, +1.371016E-06, +1.647007E-08, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, -3.685579E-08, +0.000000E+00, -2.476523E-07, +0.000000E+00); sampNumCoef = ( -1.941040E-03, +1.012973E+00, +2.549412E-02, +3.146281E-02, -7.701827E-05, +4.973536E-04, -2.130061E-04, +9.757313E-04, +7.164101E-06, -5.137094E-06, -3.021765E-07, +9.135275E-07, -5.816734E-08, +1.078116E-07, -1.534883E-07, +0.000000E+00, -1.318700E-07, +9.196606E-07, -3.705506E-07, +0.000000E+00); sampDenCoef = ( +1.000000E+00, +9.641438E-04, +1.340215E-04, -4.371442E-04, +4.849114E-08, +0.000000E+00, -6.403717E-08, +9.014668E-07, +0.000000E+00, -2.387648E-07, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00, +0.000000E+00); END_GROUP = IMAGE END;gdalautotest-3.0.4/gcore/data/test_mosaic2.vrt0000644003401500001440000000067713614004466021007 0ustar rouaultusers Red ../tmp/test_mosaic2.tif 1 gdalautotest-3.0.4/gcore/data/right_top_vrt_subpixel_offset.tif0000644003401500001440000000071213614004466024523 0ustar rouaultusersII*  f dS   JN@N@(A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|xxxxxswq~msp{qw|rooowxslk|~xhv|ylw{qr|w}}mpjpkgzsjkm|rononwqqgdalautotest-3.0.4/gcore/data/empty_gcplist.vrt0000644003401500001440000000016013614004466021261 0ustar rouaultusersgdalautotest-3.0.4/gcore/data/epsg_2853_with_us_feet.tif0000644003401500001440000000237613614004466022544 0ustar rouaultusersII*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,fAZA??D %  D +#IMAGINE GeoTIFF Support Copyright 1991 - 2005 by Leica Geosystems Geospatial Imaging, LLC. All Rights Reserved @(#)$RCSfile: egtf.c $ IMAGINE 9.0 $Revision: 10.0 $ $Date: 2005/07/26 15:10:00 EST $ Projection Name = NAD_1983_HARN_StatePlane_Virginia_North_FIPS_4501_Feet Units = us_survey_feet GeoTIFF Units = us_survey_feet|IMAGINE GeoTIFF Support Copyright 1991 - 2005 by Leica Geosystems Geospatial Imaging, LLC. All Rights Reserved @(#)$RCSfile: egtf.c $ IMAGINE 9.0 $Revision: 10.0 $ $Date: 2005/07/26 15:10:00 EST $ State Plane Zone -4501 NAD = HARN|gdalautotest-3.0.4/gcore/data/size_of_stripbytecount_lower_than_stripcount.tif0000644003401500001440000000025513614004466027702 0ustar rouaultusersII* SsZgdalautotest-3.0.4/gcore/data/hfa_completedefn_recursion.img0000644003401500001440000000037213614004466023720 0ustar rouaultusersEHFA_HEADER_TAG y*&{j,jj:o,,:o,{n,,:oEprj_MapProjection842,}:,:oEmif_MIFObject,,:o,,,:oEprj_MapPro:o,,:o,},:oE,,}Emif_MIFObject,,:o,:o,,:o,},:oE,,}E,{,:o,,:E,:o,,:o,},:oE,,}E,{,:o,,:E,,}{,E,:oE,,:oE,,:o,} ,:o,},:oE,,},gdalautotest-3.0.4/gcore/data/dstsize_larger_than_source.tif0000644003401500001440000000172113614004466023764 0ustar rouaultusersII* 4 =S & > n1111111111._#T;kI@;kI@dtAͦ%LA# c )#WGS 84 / UTM zone 11N|WGS 84|x1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g /gPx1 g ?pqgdalautotest-3.0.4/gcore/data/float32.tif0000644003401500001440000000362013614004466017623 0ustar rouaultusersII*HBBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBB @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/pixfun_dB2pow.vrt0000644003401500001440000000105713614004466021132 0ustar rouaultusers dB to power dB2pow Float64 float32.tif 1 gdalautotest-3.0.4/gcore/data/minimum_tiff_tags_with_warning.tif0000644003401500001440000000006413614004466024631 0ustar rouaultusersII* gdalautotest-3.0.4/gcore/data/md_eros.tif0000644003401500001440000001265013614004466020004 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/f2r23.aux0000644003401500001440000005635413614004466017236 0ustar rouaultusersEHFA_HEADER_TAG@ R/<rootrootxAdRRDependentFileEimg_DependentFilexA Zf2r23.tifR0 Band_1215470050Eimg_LayerentFilexA Layer_1\ d|Descriptor_TableedValueEdsc_TabletializedValuexA #Bin_Function840#dValueEdsc_BinFunction840aluexA,@0@A@u@@@"@1@.@@Q@*@c@4@3@,@0@@@ @A@p@A@M@A@V@@5@$@b@*@$@@ @ @0@@@@6@B@I@L@@ @"@N@;@ b@@2@M@N@I@P@U@J@Q@"@=@3@ @d@"@@@A@"@&@O@ @@8@1@$@@@@&@@U@G@@$@9@@ @4@@ @D@@@"@,@@@5@@@@@"@? @"@@@@&@(@@@1@@@(@.@@@,@$@@:@ @@@@@*@@$@.@ @"@$@@@@@@@ @@@$@>@@4@@4@?&@@B@ @D@B@1@b@;@J@&@4@:@$@>@@F@<@3@?@V@@@6@@7@3@@ @@F@<@4@@@<@$@@9@2@D@ @ @,@(@C@@(@7@0@4@9@2@ @7@@ @@6@5@4@6@8@C@2@8@@@6@6@?`k@8V@O@@sK]6Q@G%nfo831,.@@ dEhfa_Layer70050Ehfa_LayerentFilexA{4096:Cdata,}RasterDMS,.D \ dDependentLayerNameEimg_DependentLayerNamexA d Eimg_NonInitializedValueEimg_NonInitializedValuexA  BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,. ?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@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@ Unique Value  Histogramion840#dValueEdsc_Columntion840aluexAd& HistogramParametersalueEimg_StatisticsParameters840xAd 0StatisticsrametersalueEsta_Statisticsarameters840xAd StatisticsParameterslueEimg_StatisticsParameters840xAEdsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,. ?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@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@ Unique Value$ STREET_NAMon840#dValueEdsc_Columntion840aluexA  "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  %Value_NAMon840#dValueEdsc_Columntion840aluexA"!1a_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.Edsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,. ?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@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@ Unique Value' ion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,.Spruce LnMountain ResortMAPLEUnknownAPPLEBYHALL COPPICEBOLTONFORESTSANBORNNOTCHBROOKWELLESWEEKS HILLELMORE MOUNTAINMOSS GLEN FALLSMANSFIELD VIEWPARTRIDGE HILLSOUTHKIDDERWORCESTERCAPE CODMOUNTAINCOTTAGE CLUBLUCE HILLBRUSH HILLBROWNSVILLESIMMONSBIRCH HILLPALISADESNEBRASKA VALLEYWINTERBIRDLOWER JUDSONSUNSETSCHOOLPARKPONDHIGHLANDPLEASANTCLIFFBEECH HILLMAINBARROWSRIVERMCALLISTERFALLS BROOKTHOMASTABER HILLSYLVAN PARKSTOWE HOLLOWSACHS PONDGILCRISTSHAW HILLHOLLOWUPPER HOLLOWMOSCOWTRAPP HILLGOLD BROOKWATERBURYWOODDEWEY HILLADAMS MILLCLARKHILLUPPER HOLLOW HILLBARNES HILLAYERS FARMSLAYTON FARMLOGGING HILLWOODLANDSTERLING GORGESKI CLUBBULL MOOSE RIDGESTERLING WOODSLINTILHACHEMLOCKBIRCHBEECHTHOMAS PASTUREUPPER SPRINGSROBINSON SPRINGSWADE PASTUREDISHEDSON WOODSCAREY FARMINNISFREESARGENTS FARMRANCH BROOKTURNER MILLHOADLEY BROOKBROOKBRANCHHARTSONSPRUCE HOLLOWCHURCHILLSUMMIT RUNCOUNTRY CLUB LPSTOWE CLUBLAPELLEPERKINSALPINE MEADOWSHORIZONSLOWER TAMARCKATWOODSWEETSERELIZABETHSGALE MEADOWSTROM FARMHIGH RIDGERIDGEALGERUPPER ALGERWEEKS HILL MEADOWSPARKERSCRIBNERUPPER JUDSONSADDLEVALEMONTDEER HILLOLD FARMFARR HILLWAITESCOVERED BRIDGEOWLS HEADWILKENSMAGOON PASTUREFOSTER FARMWATTSWARREN HILLMARSHALLTALL PINESLANG FARMHIDDEN VALLEYRAVEN HILLMERRILL HILLSEARSSULHAMBROWNSSPRINGGULCHHIGH MEADOWUPPER MEADOWRICHARDSONHOLTCHANDLER FARMPOINTSBENNETTMEADOWLINDHAUSGREY BIRCHVIEWWESTVIEW HIEGHTSDEPOTTAMARACKELMSTERLING VALLEYSPRUCE PEAKSTERLING RIDGETOLLWHITE GATESEDSON HILLLOWER MOULTONPERCY HILLALPINE VIEWNEEDLE LEAFTANSY HILLBROOKDALESTAGECOACHHOUSTON FARMRANDOLPHTINKERPUCKERDEER RUNUPPER BAIRDBAIRDNORTHWORCESTER LPBOUCHARDX ROAD 18CEMETERYPIKEMCCALL PASTURESUGAR BUSHCADY HILLCROSSPINNACLEWHITNEYDUNHAMMAPLE RUNLOWER SANBORNSINCLAIRMILLER BROOKTOWNE FARMMAYO FARMLOWER LERICHETABER RIDGESALLIESHOLMESHOLLOW VIEWSKY ACRESSUGAR HOUSEGLENBROOKBILLINGS HILLMILLLITTLE RIVER FARMARCTICFOXFIREBINGHAMWATERWORKSCOTTONBROOKSHORFIELDUPPER PINNACLEBLACK BEAR RUNOLD COUNTRYBRYANHIGH FARMSMOULTONMOUNTAINSIDEBEAR RUNgdalautotest-3.0.4/gcore/data/bigtiff_two_strip_be_long.tif0000644003401500001440000000043613614004466023564 0ustar rouaultusersMM+ Sstgdalautotest-3.0.4/gcore/data/test3_with_1mask_1bit.tif0000644003401500001440000000307013614004466022460 0ustar rouaultusersII* NST Z<Sgdalautotest-3.0.4/gcore/data/pixfun_sqrt.vrt0000644003401500001440000000105513614004466020764 0ustar rouaultusers Square root sqrt Float32 float32.tif 1 gdalautotest-3.0.4/gcore/data/uint16.raw0000644003401500001440000000144013614004466017504 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gcore/data/pixfun_real_r.vrt0000644003401500001440000000105013614004466021232 0ustar rouaultusers Real part real CFloat64 int32.tif 1 gdalautotest-3.0.4/gcore/data/ycbcr_41_lzw.tif0000644003401500001440000000451213614004466020654 0ustar rouaultusersII*B @@x\*Bǃh+4^; PT %tFs)g5Lel.V9K"m.PȂ2C)X; f2d^0@*U-aBZ*.~5ҹi4(F314vۅ;oNIxs=cT`3ζ#^Q3vn@|;Ec`2ɬV9KfkYYL@K)~3OW;wFe/Ά2ѓϧܭb9'bx-Cx'< C;ԴMrcCs3 ` H1c3/# (C> ,Cb #2 C.6L,\)( 0 =`*.Œ0p<. c!J2$A;1$/) H4Cx;zF $ RB2P|^8.b,#<8P( B%0r`bh.SdP4b+ $ U1 y.Cx5ȴ+@j4:uD ˆ 3CФ+à;`56"4'7>04 u /-2 9dI*#2M3 cR /euX X<2;#p2 > >(/cǣ902VT=Mc*CB12y$?JC(lC*ZI #= Câ8 $c=Y w)A#+B)GD *P= 1c@-878#: D3% B8`?"*X4d D@ !LQ,%\,ØR96[}A\+ P[9Ĵ "p HwѡH-Ӎ(zpr!q V@1,.PDP{ UE]a70x !*@1E 3!vLa6@K  a)b4fn0Cxa A8ya@.@CؐP( b:u#e)!0:za47"˜r !0X}(H,A a2@DJ @<$€q@DĘA'@,#1C- )< p`BbH@1ȇ<8 8$DT AxF\WA0E{"89 Mu NQ#c dJv 28t!FC}A!\<Á a, AC`H C }и+sDUjB0CY&b P7o4BP- ;ϢA?R`1%*Ja~58&PB 5($蓐 Ĉ 0:;,;  #Ґ~Lj_!pN P@ CP }A0KLpk;PBaR/A( !2@!"(C G:R D 0{ ψ/7WxPvUP&|-4YB8%¸,g)@a$`@s!Q 0D" S %x8݃w0B0`C"UPCz:$<3"$`pJݍ=C|6JHcu_6"p;m5 sB>a\IYt>a"ŨZ'Za<88#KJ$D;`` AXxc0J7*: 5\C8جU X 1kȂ YdRC$p@@'':2  CLE/gdalautotest-3.0.4/gcore/data/alos/0000755003401500001440000000000013614004466016602 5ustar rouaultusersgdalautotest-3.0.4/gcore/data/alos/RPC-md_alos.txt0000644003401500001440000000200213614004466021375 0ustar rouaultusers00400003639+55.8151+032.0758+300000412903699+00.4400+000.7304+3158-3.910052E-4-3.183540E-1-1.136076E+0-2.764965E-4+4.820507E-3+6.314381E-4+2.248402E-3-4.827423E-3-5.628790E-3+7.063636E-7+7.387494E-6+1.621526E-5+7.714024E-5+2.645431E-6+9.095926E-6+5.103928E-6+9.402414E-6+1.317677E-5+2.180787E-5+6.331507E-9+1.000000E+0-2.395249E-3+4.910170E-3-1.979234E-3-4.434428E-5-1.095954E-5-1.797271E-5+2.114926E-6-3.908516E-6-8.265047E-6+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+7.854784E-3+1.190927E+0-3.819688E-1+4.903193E-5-6.649807E-3+3.604242E-3-1.156816E-3-4.774021E-3-1.842626E-3+6.588797E-8-2.311049E-5-3.063846E-6-8.987769E-5+5.254359E-6-1.970831E-5+9.643964E-7-1.697456E-6-3.331775E-5+1.815988E-7-8.016227E-9+1.000000E+0-2.395249E-3+4.910170E-3-1.979234E-3-4.434428E-5-1.095954E-5-1.797271E-5+2.114926E-6-3.908516E-6-8.265047E-6+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0+0.000000E+0gdalautotest-3.0.4/gcore/data/alos/IMG-md_alos.tif0000644003401500001440000001265013614004466021342 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/alos/summary.txt0000644003401500001440000000011113614004466021031 0ustar rouaultusersLbi_Satellite="ALOS" Lbi_Sensor="AVNIR-2" Lbi_ObservationDate="20100701" gdalautotest-3.0.4/gcore/data/md_dg.tif0000644003401500001440000001265013614004466017426 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/cfloat32.hdr0000644003401500001440000000036313614004466017762 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 6 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/pixfun_log10_c.vrt0000644003401500001440000000105013614004466021212 0ustar rouaultusers Log10 log10 CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/bug_gh_1439_to_be_updated_lzw.tif0000644003401500001440000002047713614004466024047 0ustar rouaultusersII* =S 0"مzuʀ2;jʧyO0׃XJVQbh~4ۉi-;-\W-`c(``1n噥|}x$DW[uZ`<dJ^ x<-Gᨎ- 3o-,T: @G"$kDtOP@6z(-x&d 0i *EA6@juQy4jAC3iBBl9؁1*>GJL9ItԴ_g6%n+f B"xѮP=c?( c8 [a- $PcМJ aAV:RCDwh&Enf?$aRP$prKFY4M 0 OAxfz vs PѺrGx9hMyC`-yXY!) Dx F6b8l0{&x@,A#5 !rp3(*~bhj:! NAx'x3Eh-lF(^4FXy&h+ơdl`|D 0\al 6ze!p`a`p@G-.~` uuQ87D`$F8&AcGGhBt 9XB\ @1@6 ! 0CD (HV% #| `bv `P "yЊ+`|X0XAJ@UP7! | ~@z"bc0d`!؄\uDv )Ø|[!T 0!'G`B~"Pk & A07 #f%r)pz"T Gf Cq3bM1@ w $H<2A#Ġ#d\Qh&D(M`[Jp `<XpJC2pFA$h6 90E#vp> a`~AXK (5hXN5h %Cpf`,At\,rr`NDCT a µLz2h] G "` H!0jALCnx!lVXceVy CKBp#Gknk(8-^NG[D0hðCGH! 4ExHPH;8D, X+P"$ x8aŰct[N 9@l h'02 $D"AkCrPH ?bE d^CBL3'pP0@B$q*-Xnj^2\`B@z!hr|`:a&`ttj`0 @N`6<AP8@ `@8a"*!!j6 RVaAT Az!A\ FA ! |!@ thdAN@`A@^ !>!!!H@ !R@ $`hV4 A Al, `. L &@& `$At!"  X1d> @ Aa a.X  8@"j2! 8Ab`h*nj!f,`*h  ~@ ``ih`Da`j@a @ v p* a`@! !k ji.@؞!d`* ^``jFA J a`T A>J(\ (`$ !V a!aT` A>Aa!@r0$@aBAA $,A>`b @ !,"a a.>| HXXx$Z j bz ( `J @ NP !a,@ Aj6va` @"z AZ8a@j AX@j A8 " A:*@f  xa@!@A|A T` 2 ` `@   PH^pab d   A>4>vrA! ap@`(R aс8 !Za!l  DH fA $@ `^.A^Vx La& ^ !4`a Z @h Db BA Aa`( a^`A > FajR!* h* at,T A&a!  !R,\A|!| Z`!hp  @ a@ `f fTHaHV"@J b (:!P`ġlT@a  aS 0 `Hld@ X  v @ !.xajVp A Al | ,W5U `"@&a! @AN Axaaa@@ jj R2~q\PnV*:!d A @tXz\@ `NV `0Ab 2 aAvA hP @b * ad Ax @\, ^bAa!@:8 anJj$@x.t `Ah26@{`~N@aT!I`,@R@` t| h alB  A v`d !8b @@f @ >Ah!@P > |Nd"!d {*!T AL va!nLz!!ht`!<z ݱF!``! `! x  @L  n @ c`aaV!H@ `DP !*` !@:n! `j  A@@X v`   apba R!$aZ8@@   pj@RA <Az` p~  AzH: .@$`.AhF b `@| :  ~ @\!@z av, ~hP@ ` a  !j A!hrje@$j4a H !`~!a\ j  0@!|B"@A.d  D d-:؁Zux~A* @ X,b.ӄqC5C(j6DQqxVCpaD$%׭r4: +'R%q8 d1LD<E'CXgGl?3 w,1"gZ1XJmK-n-#JœxM:JT\e:6-(" D6M b&c4{>}r $%'4( e+0"$Qڃz[a"R1BPa|eXqcv|XHKpDC!Dt`Zq>&%2HA4x), T7@ dE p`fybHrH\h c7j.`)xa@@Ю!2q::D!b!oTG`ZD`9Z_S%Xf<aj |q pRt hC1 f(G&.B% '^d |a7Ɋ E$'+w8} L٠ex5fDchrQLTb4tqV5B%xV07e@sa,\ 1l!(yFx($xE.0R #_=%pF"(Ĺj$8 i"Bavl'k0*^&p ~ <F:. $6Ac F D9vQ-Ecr.^b0 <#1}aC eb>᙮;C)_!HN¨ /f{٘8@)_TW CQ< F(" 06@G1 Èt`=C8X h@l`%pYPw@ 1 8<B#G8 _ m $h *PB]p. 0,@28e&)C$ n8"MCP@,p*P-.è!(O25DH "3p,8A"@"R`!qa.co*@`L Ac" @ E."@x`04! PM c !2h ~0 J>,PBT @'XU/l A x_ ` 5AjC5  4؟<q;4 pr8% =P(8`Dp(A,{ TAX2j@$+C Q8" 4lt f5L К p/@`  %2He4h89F * }:<P  B?$hc|"pU Jxa5 18C<chmEHBXOG |0[T@=(Zb\ Gؕ#`x"Ph P<1c FAZ /a[ -C Gq@$ !#BL1i &@ @ 0/p tj pRT;AЙ0[d%,bj ƀXx nb,@ *DE ( h Ǩ`_j<V^f?x YQ# }90r"XA{ 1h2HP)`8Du 4]@ `X aB ~@ ъ X?LXp ExJ@Uq PCl& p.BA@3 )pZ{& A|# acHHDHAȶB'2"Cv Z`  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"]] 4.4072000000000000e+05, 3.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -3.0000000000000000e+01 Area Gray byte.tif 1 gdalautotest-3.0.4/gcore/data/scanline_more_than_2GB.tif0000644003401500001440000000024013614004466022626 0ustar rouaultusersII* RSkkgdalautotest-3.0.4/gcore/data/8bit_pal.bmp0000644003401500001440000000270613614004466020053 0ustar rouaultusersBM6(  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~skkkkksck΄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.0.4/gcore/data/float64.vrt0000644003401500001440000000253513614004466017665 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray float64.tif 1 gdalautotest-3.0.4/gcore/data/byte.vrt0000644003401500001440000000300613614004466017343 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 testvalue Gray 107 byte.tif 1 testvalueBand gdalautotest-3.0.4/gcore/data/utmsmall_3.hdf0000644003401500001440000003301513614004466020411 0ustar rouaultusers j\ '00<1!171;<1w!11< 1!j 1 12 2+Q 2|7 2; 2I 37F3}5<5?NCSA HDF Version 4.1 Release 4, December 2000k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭Δŵ{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť攽s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ{s{{kssksc{cck{kcccsZ{sksskss{sc{{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌ccs{kksks{{k{kskscskkssks{Zֽ楄{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥc{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭk{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽ŽŭޥεkkZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌksZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭ֜{cs{Jsc{ckkskksŽ{εŵν֭Μks΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό޵skkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭΜ{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޜZckcRss޽έބε業{Z{k{ŽŭŌŵŜŭc{{kޔŽť{{sR{֜{s{{{sֵޥֽs{{{{Zc楜{έ{ŽΔΜc{εk΄省ΜΥsks{{Ō攜֔ŔskޜŔs{εޭńŽ֭ﭥ{֔{{ťs{{Ό޽֭歵Z{ŵŵŌťŽŌ{{sֵŔ޽ssŌsνť挥ť޵޽֔楥{ν{ŵε潔޽朔Υ{ֽŭ֌攔ք{Rkŵޔsks{ZŽ楔ޭs歔掠ť{k{kscsc{ť֜c{kޜs{J{c{Rcs{kΥέŔťŵνΜsk{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{k{{Rk{kZ{RťŭνŵΜŌks{sskck{ֵŜsZŭ֔εŵεJkkss{{s{c{ŌޥŜsk歜֜{޽s֭{{{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔s{s{c{ks{s{s{εέֵ{{ssss{{kskkュ{ssތŌkckckcsksks{{ss{{Ό{sŽ歵{΄֜ބksckkk{{{{sks{{ťck{޵޽{έބkksssssc{kc{ccsބŌcsޥŭs{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŌksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭JkJ{kRZksRkkss֭kcŜksέΥ޽֜Zk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{scscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭Zskss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭kksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽ:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތ:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜s1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{Bkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkc)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:cJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkR!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsZ1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcsBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1Bs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{ZkccBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{dValuesfakeDim0 DimVal0.1fakeDim0Dim0.0dValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1fakeDim2Dim0.0ddj j j j j   j   3-dimensional Scientific DatasetVar0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 utmsmall_3.hdfCDF0.0gdalautotest-3.0.4/gcore/data/nan32.tif0000644003401500001440000000125413614004466017273 0ustar rouaultusersII*"     SHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhB     Sgdalautotest-3.0.4/gcore/data/sstgeo.vrt0000644003401500001440000000215513614004466017710 0ustar rouaultusers 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"]] data/sstgeo.tif 1 0 1 data/sstgeo.tif 2 0 1 Gray -32767 sstgeo.tif 3 gdalautotest-3.0.4/gcore/data/byte_rle8.bmp0000644003401500001440000000304213614004466020240 0ustar rouaultusersBM"6(    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~sksck΄k{{k{k{{cs{Jsc{csZcsZcckcck{k scscckssZ{s kZkskZc{s{{sck{ccsccs{c{c{{k{ckksskck{ k{{ssZkkc{s {c{kcs{{k{kccs{kksks{{k{{ss{s{{csc{ssk{s{{kssksc{cckŭc{sc{{ss{ksc{sks {{{kk{{{s{s{s{ksksss{sks{kssksksk{ssk{{c{ck{s kkk{sgdalautotest-3.0.4/gcore/data/zero_stored.bin.zip.end0000644003401500001440000000055013614004466022243 0ustar rouaultusersPK [:Dn׬ hello.txtUT }%R}%Rux HELLO PK-y:D5,zero.binUTmRux **PK [:Dn׬ $hello.txtUT}%Rux W*PK,-*PK]*PKgdalautotest-3.0.4/gcore/data/test_average_palette.tif0000644003401500001440000000730413614004466022543 0ustar rouaultusersII*. @S @Sgdalautotest-3.0.4/gcore/data/zackthecat.tif0000644003401500001440000002010213614004466020464 0ustar rouaultusersMM*($v8OU0Ss=)]6^1 Sւ Pt[FgNx4RUF՟%@s߷UUW-4ZPJ:+h|qPk/.2ݶ ~Χ7OKr*u|ֳmt {1<P֩j,⫻&PPo1S+5= 8gIt2ϨJIFMDjVMI ;QT ;]w MNH9MQR@Nw9,S(ف Oqd*Q2H:֚&&p)!H;`c83l2('lNHX Z^Sz>ee?#?4(;qkqr?V+c\-%HY3[ٵ@ &;Ɋhr^qm61? {ܰ='?_^&5-BYAP>G} tS`NJ7\R⺱GlT[ndkIzV>K033pA=N\ SRvnBnAi"FGCu?t՛7*@;Us}| Bf<{ &xRWҦ`B:ԮBť_ wNTRnNwf!$=8 1ǥ TICmcAsB(~C䍩ن}h\oG:="CbSHb=D-n.lg8]ϩ>0LgH.zoZg, r~۷4+Ȉ*#j*}yOk"眨 HξP&ds*ΒIhَ҅~0#۷WF9n%Zf7Mc^o(сD[\uG |(K˕AE<&1yM@)hnA;QUK6NޫQ]7# YGuQ X#f A+]7x2sK/OJrǶ䊹h̲_t# GAAPwr{S-ɗ8Q֞ 0,0aJ[ ÿΘHPawIx]G*(|zUI269qU=$8niz$BN*!jc 57D7hF/1ڃθ#֯j\ToJ2C`›Ŷ6wHvP,Ӹ$=IOjaOM?J/I3Ñ9c(ǔldJrUv7U᜝HZVglaVӔsy>MXs,3.;Jb|[>x~-f h~)#G WHST,:2q]yM=mrQtrj.Zp5|zk;Rcq4ʇɵHt+'lOOAUne( f^l.z֪OQSRFz$yhucY6g*AJyFTo\T Ff=v;ДSUp0qvzAA%uoZ2`n֩ ==(LppFcBdNFsPsː?1@au!ެ//043%BcGU6`jv:ÞB"46E 3#"BOMO@}60s\;kvl4qJ 붱FY}ޭE,ކ9`)CA~U?1%FQ'pzf(<=hCgV%FhCs~؞$W(ڵCsKKi'8 ŊH׆M6uZW-S9=sXed= ɊݳPd@e\fSGcX.V5W?TOڇGbR8ً ܷ+23mH2Tl?L2BW%Cgӡ7 mRZOKhhVBVdR@;ޮ_XC "ER'Ld7ΗaXn޲'xǦ=yyZg(Z-hUpYGCRr@Ai@+r}jZz }.0b`>[Cr%Xgjj먡3Vb&wv\[=I$D;Zh5`I=y(2- 9Ę?,JЁs*)6,LC$J~-;0 4IG$qͱTB]2s:*:ꭹ$0=7-jt\p:ݵ_Y:oʹ%_L'i3"1]ԍg\s:U6)+nryAz%cv8IGj s `,9Sڲ'=h"I,EgK0!HކYs,wCQ?FRʸܝQus'!by4!? #7rsLAq-Ž5CRAO$eOJH Rܮ1@@o.hk140ymc#򢴁W5)9Uc*'> rTҨ$tw;~u9fU1Ґɳdvj>7wn0wVm,U]ExyISn\S׻c*dQm@gZ3F;d C\]N;~c%9+(Wg˽Q[yl&JVM=1X9[O[!rOĊ_+cL(]GRf~BĐ7GWXq5ZJ*s̎~=kYt}Kyw>WNGbO\`9ڋw3+o0Wr/C(>w) f?͏ҞP/2Xښny#!c( mWB0θ#T&}P7cM!\0 jq'"@n.~7nLc 6~ҢS?jKE_KS= 5R꨼@ܲ>!mkی1@S{pM :>~]Q{2UU65G*Ҡ;"FVuN1.V gըr3Ӹ0˳:X0,wǯO9WB6/ޘ3lGg` ~펿J~LA; X/n)top؏B1A9 ؎G)?X'9 d9A#) "V6UeL6sJ &U }h2uޕdC ߟ&R鱧YzjM;eu=9iS#Qbz`bq늈@+?Ko@;S2ʙʉ9؊08O4uZlhIH`kE,~`|롳%``rAW6#t9 k*+pBBzr:|蚸当j0TB2'4k\o\bAᚺ$?]3 Mak|NWRBpfDF:TQrX;ZA\P>[V$`IPQ XEz3fU%y^z:f{9r8;7zul{Ԅ8F!Xgn1Dc~OM Ϯ҉* r&lF:~_J`;214Yb +<|}:>t~ vjsw= eF1^e6\3}vLܹ‘2۽!o 4']z"c~u]~t)@;T>JdmB\ OJ0@7:fA@H;)'bjd\b?C,O`qF#?8:e^an4 vF1~5"@s͌C:tomGdAniRĠ.O]FR|,te9g?l,F 0H1GQ@g5 2 p~ άJA`Oc "ۙkneN?ħ}s(2nUV}S=A<{U b͵t±N+lRԼyOС= F0@˞WPcjXd1 3+֭*ape98~41\,hAʐzJu)*p' piS'#oNƤ2Ĺ r~C9wzT'ñF'9\R?4yGsެ32Щlw2$gU㛗yӜ(dmAP azGB?kIqӭV.wҁ2.3@H:ў )QҪy@EayoLrv_N[7qk9i3˜NqQE6f_Ї! ba`#`c1T?>t1BFw 5| ?J_+MΔ'9u#/gk0??A~!EZ+{ֳ5P9;ff|tERfԡboQQ?i'm3u `Ҵ7b9>JO~ִAJX0u?0_&2IlTZ,IoR 8ˀdۯSwG_J>~Ґnv=6?֝z?}ҚOAHa}>0rpZsSZ@E q;<???2dGLt>cT[֘g)(w*u|5zЀ(BCDE    * q' q'     ' .(00-(,,39I>36E7,,@W@ELNRSR1=Z`YP`IPRO %%O4,44OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO %%O4,44OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD   }!1AQa"q2#BR3br $%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzy!1AQq"2aB3R#br$4CS %&'()*56789:DEFGHIJTUVWXYZcdefghijstuvwxyzy!1AQq"2aB3R#br$4CS %&'()*56789:DEFGHIJTUVWXYZcdefghijstuvwxyzT ''t'gdalautotest-3.0.4/gcore/data/spot/0000755003401500001440000000000013614004466016631 5ustar rouaultusersgdalautotest-3.0.4/gcore/data/spot/METADATA.DIM0000644003401500001440000000306513614004466020350 0ustar rouaultusers DIMAP SPOTSCENE_1A EPSG EPSG:4326 GEOGRAPHIC WGS 84 2001-03-01 00:00:00 SPOT 4 +1.4490376282e+02 +5.4877838135e+01 3000 3000 4 8 UNSIGNED I NONE 1A RAW SYSTEM gdalautotest-3.0.4/gcore/data/spot/md_spot.tif0000644003401500001440000001265013614004466021006 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/twofileinsubdir.zip0000644003401500001440000000160513614004466021603 0ustar rouaultusersPK <twofileinsubdir/UT uKKUxPK Ggdalautotest-3.0.4/gcore/data/byte.hdr0000644003401500001440000000036313614004466017310 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/int16.tif0000644003401500001440000000216013614004466017310 0ustar rouaultusersII*(k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck S  *ZN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/excessive-memory-TIFFFillStrip2.tif0000644003401500001440000000036413614004466024320 0ustar rouaultusersII*llK=S   2 r xA (LJXBa+ީë/X38,gdalautotest-3.0.4/gcore/data/byte_jpg_unusual_jpegtable.tif0000644003401500001440000000152313614004466023745 0ustar rouaultusersII*S[!   8xC     $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27| ?R9Q6=:J߯L*W{@'$!v5&eW>ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q gdalautotest-3.0.4/gcore/data/stats_nodata_neginf_msvc.tif0000644003401500001440000000026213614004466023412 0ustar rouaultusersII*   S-1.#INF?gdalautotest-3.0.4/gcore/data/erdas_cm.img0000644003401500001440000004316413614004466020127 0ustar rouaultusersEHFA_HEADER_TAGV- 961!0StatisticsEsta_StatisticsA"@o@/ҏb@@a@@a@  ]M@&~1! (StatisticsParametersEimg_StatisticsParameters830A (2 1!Descriptor_TableersEdsc_TableticsParameters830A ~#Bin_Function#eersEdsc_BinFunctionrameters830Ao@? @ @D@?F@B@??9@.@~$ Histogramion#eersEdsc_Columntionrameters830A~ 1! FHistogramParametersEimg_StatisticsParameters830Ao@2 1!* Elevation_InfotersEprj_ElevationInfometers830A Pulkovo 1942(83) [To WGS 84 1]8@^W>:z|*yU>qF'%>avt>metersPulkovo 1942(83) [To WGS 84 1]8@^W>:z|*yU>qF'%>avt>cm&)ionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.&1!Z4RasterDMSEdms_Statepccc<<ccc<cccccرcc رcccرcccc<<<رccc<<رcc\AɍWAw"L\AWA"@@@@"meters!1!$.#ProjectionEprj_ProParameters D#Transverse Mercatord#??8\A# #Krasovsky@TXAޓ3?XAj{?@TXA"$_DatumEprj_Datum $Pulkovo 1942$fffff7@a9T¾2GѾ+i)+1!- z%v%GDAL_MetaDataEdsc_Table&$%#Bin_Function#Edsc_BinFunctionz%$&ELEVATION_UNITSEdsc_Column$ion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,{1:*oEprj_Datum,verticalDatum,0:pcelevationUnit,1:e3:EPRJ_ELEVATION_TYPE_HEIGHT,EPRJ_ELEVATION_TYPE_DEPTH,EPRJ_ELEVATION_TYPE_UNKNOWN,elevationType,}Eprj_ElevationInfo,.gdalautotest-3.0.4/gcore/data/erdas_m.img0000644003401500001440000004316413614004466017764 0ustar rouaultusersEHFA_HEADER_TAGV- 961!0StatisticsEsta_StatisticsA"@o@/ҏb@@a@@a@  ]M@&~1! (StatisticsParametersEimg_StatisticsParameters830A* (2 1!Descriptor_TableersEdsc_TableticsParameters830A ~#Bin_Function#eersEdsc_BinFunctionrameters830Ao@? @ @D@?F@B@??9@.@~$ Histogramion#eersEdsc_Columntionrameters830A~ 1! FHistogramParametersEimg_StatisticsParameters830Ao@2 1! Elevation_InfotersEprj_ElevationInfometers830APulkovo 1942(83) [To WGS 84 1]8@^W>:z|*yU>qF'%>avt>meters&ing,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.&1!Z4RasterDMSEdms_Statepccc<<ccc<cccccرcc رcccرcccc<<<رccc<<رcc\AɍWAw"L\AWA"@@@@"meters!1!$.#ProjectionEprj_ProParameters D#Transverse Mercatord#??8\A# #Krasovsky@TXAޓ3?XAj{?@TXA"$_DatumEprj_Datum $Pulkovo 1942$fffff7@a9T¾2GѾ+i)+1!- z%v%GDAL_MetaDataEdsc_Table&$%#Bin_Function#Edsc_BinFunctionz%$&ELEVATION_UNITSEdsc_Column$ion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,{1:*oEprj_Datum,verticalDatum,0:pcelevationUnit,1:e3:EPRJ_ELEVATION_TYPE_HEIGHT,EPRJ_ELEVATION_TYPE_DEPTH,EPRJ_ELEVATION_TYPE_UNKNOWN,elevationType,}Eprj_ElevationInfo,.gdalautotest-3.0.4/gcore/data/float64.hdr0000644003401500001440000000036313614004466017624 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 5 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/hugeblocksize.tif0000644003401500001440000000023613614004466021207 0ustar rouaultusersII* BCDESgdalautotest-3.0.4/gcore/data/arcgis93_geodataxform_gcp.tif.aux.xml0000644003401500001440000000631113614005320024747 0ustar rouaultusers1PROJCS["NAD_1927_UTM_Zone_12N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-111.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",26712]]true267121.883333333333333.823333333333330110.5166666666666993.896666666666670119.1299999999999993.9627.7766666666666994.03000000000000021.813333333333329915.54333333333329910.43666666666669915.5819.04333333333330115.62666666666670127.666666666666715.6866666666666991.7966666666666727.2710.37333333333329927.28333333333329918.96999999999999927.31333333333330127.57999999999999827.35333333333331.820000000000000138.99000000000000210.38333333333330138.986666666666718.94000000000000138.99333333333329727.52333333333330139.0266666666666995000004705078.79016612513694.738949854974705092.24672045527389.488231900964705132.6166430097541084.258175572964705199.90071250035000004723585.2528382801513658.312030380014723598.71614639527316.633693014974723639.1063283999540974.974617394044723706.42415740995000004742092.2619709503513621.768887386024742105.7315773396527243.546710298054742146.1406523297540865.342401484034742213.48996334995000004760599.8178412998513585.109822754984760613.2932902602527170.227887553054760653.7198910601540755.3624336514760721.0984054497gdalautotest-3.0.4/gcore/data/pixfun_real_c.vrt0000644003401500001440000000104713614004466021221 0ustar rouaultusers Real part real CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/byte_inconsistent_georef.tab0000644003401500001440000000053613614004466023432 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table File "HP.TIF" Type "RASTER" (400000,1200000) (0,4000) Label "Pt 1", (500000,1200000) (4000,4000) Label "Pt 2", (500000,1300000) (4000,0) Label "Pt 3", (400000,1300000) (0,0) Label "Pt 4" CoordSys Earth Projection 8, 79, "m", -2, 49, 0.9996012717, 400000, -100000 Units "m" gdalautotest-3.0.4/gcore/data/test_with_mask_1bit.tif0000644003401500001440000000141413614004466022314 0ustar rouaultusersII* Sj .<Sgdalautotest-3.0.4/gcore/data/pixfun_log10_r.vrt0000644003401500001440000000105013614004466021231 0ustar rouaultusers Log10 log10 Float32 float32.tif 1 gdalautotest-3.0.4/gcore/data/oddsize1bit.tif0000644003401500001440000000263113614004466020573 0ustar rouaultusersII* cccS/4'`J:ZrQPP(*`gsTX:B AS% K+Ђ< ʷq  hOϿ`@,Ѐ``(7?`T?Wp=7}>`??G񗷠3q ?~y^ ?"'0g< E?<< A8(p}gdalautotest-3.0.4/gcore/data/rasterio_lanczos_nodata.tif0000644003401500001440000000126213614004466023260 0ustar rouaultusersII*   S J b  d0 Red ??@I@#  mtr@@TXAWGS 84|xWW XWWWWWW@XW@XWtWWW4XX WW8WXXXPWDW X4X4XXWW LOCAL_CS["PAM"] 1,2,3,4,5,6 gdalautotest-3.0.4/gcore/data/onefileinsubdir.zip0000644003401500001440000000135513614004466021555 0ustar rouaultusersPK ﬜<onefileinsubdir/UT KKUxPK﬜ 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray cfloat32.tif 1 gdalautotest-3.0.4/gcore/data/bigtiff_two_strip_be_long8.tif0000644003401500001440000000043613614004466023654 0ustar rouaultusersMM+  Sstgdalautotest-3.0.4/gcore/data/f2r23.tif0000644003401500001440000002171713614004466017216 0ustar rouaultusersII*  P8$ BaPd6DbQ8V-FcQv= RzI%dܢ#+ee3ʡSy2kOaSnnРJ,Nҩ)>QN5X-b;Wi@ pק:hڧ-hXZy^k{a` *GرP,f6ɏQ\62*'[m'okO 鵺 a'T-] O7sݴq s^<F+󠜮nܽd+yϿmTx &%/r ,*"/#8I4$ pR)""1 -@DDSDA/DY$z-W#ЃBtmű2G O# BI JԷ/!j P8$ B`6*D`pؔV-EQ4R9d8I'G,Y/Kdg('yYy=OEQ5*"ZJ5TF굘b],5ݎ!^Yu [u^oW`pQ~7)`TPcX#e`t/l'Au ޖˁa%_D(VpAWlڸ''E< 8|c{p"wMAy|ߔT}M@΃34<+ X3" ;;C 6a$4M,VE5Fq`!#JMLj$i /PJPNWUt֟cC+En\ ^nJ{o; P0V.sn"y')\nE sCM.Y-ku-үy[2+*ԢR,U1&oݖw#=ҿ'}|>I#@) P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9m7NgS}?PhT:%GRiTe6OTjU:VWVk@ P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9m7NgS}?PhT:%GRiTe6OTjU:VWVk@ P8$ BaP4.C8F-v 8 Jb2T]/LfS9m7SI\;PhT:%GRiTe6OTjU:VWVkUv_XlV;%gZmVeo\nTV@pP(`V*PX 'aX Dģv#$XlKLfb[6NaaYF*Q:ҏQBUv+Pԥ(=ZZ PY!D*>KVh&\)*Ʃ1G;Uz#oڬvK~@Sa&7=~ѱlNė/vs#MU*S:=$ m(rVITX'"[Xn tY}[Dyn^v{r|n2X{_@ϲފb?l 00K $% p.0z?Q'qTDϮ $#."ضËȻOhF q Kx% 4C%&2j 2PdS*JS."쨃S 2E2i0,9Z(>;Y.OV=e#ec>Yfȓ?;?7&`A:&}/MO6oyZ:գͧS눎 86'sVl҈  0 BaPQȌV ?+Fbhn=#Q|vIȤrxDY2&S5E'i Χ 9y_Gst@Xf-'~[CFRzLMZ %QY!7+aUw1X-4daȈ/-[9%) "LBi7Mdl M4gγ;gU20k~YNݐ݅)Q Q~=w)~ {H3򒢮ʅ(DhZ3l&hD .PZ&a C.THC350!qb"&R Z-dGhFW*[$F1\!##iL* l " WD22LĽ3J 6Li8,IŽ?d2s" "/@" BT2D"HH8s5} RHX1U-0!6]I"N-88 f Pu1sB ](1H Aֈ42Xs! fڔ%* ʗYaV p!L]dz 2](XLmxwz!v<2 6ܲ7]v\,෕a-oeu. ^%ghUkm!}Y^٦MߡJ"SY!W-(-7iEċ^΅GN:Oie"x,5H){)aIH~N:]Z{p n?া|.>HhAј7IYΡQ P8$ BaPd6DbQ8V-FcQv=[2IIrT]DKc (eMVYTOaB(zD, JI*K 5H=^#4JجvX-La-5V[7+긦S\wM\p9YJtw e F1#(VAe! TcQA|3(k5QYk=S}Aχ!\~7 Cu/B_ўOBQ4oZ+B_F!oj" / AsABhALRЊO$>XD(G2TEh4, @ 0&Ɉ(33,̀8K bX2LOyX9A Cs4 Д=,$'LhIgeAL tML]XTU%Fhk+[vWPUdQU/1eYh+4ŬZ6#kibhm P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9i¦Ly?PhSeU*MRiU(*U3B*Յb Vi  KvJZ.W8 nQZpZb#X R#o tˀ^2: y|w=C7cP eo O$' P4- BBj-DQCm?Fj2'" P8$ BaPP$6Da0$J-ãR5c8rBҹcZ+H09\ jLs(4'|B'H CT@z=J'*պ:FHꥆcYlѹEhmU0qnf0(@ `Dp{q5'2 fng4:=&MjuZf]lv[=mnw[}px\>'~ P8  A!P\/ C (`lAXv88DPIe z]/Ib2I QM%\;&Dg9zM7H$T\_3U*ت_Un/Y,Z%CWmmg]wEK\lxb<6d5EҙaK}&vPM6a_Búk52F'&yp5(<;aVmhOi sB'n-b˽Fd}ﮊ([ /7me!oD0$a4L2aL.;8R)2Dm1Z`dZ\jq&GP@R 򄌈,pɁ2ŀ!H?1apxG, rM8KS:G/JhL4i.G Vԍ@ pt}$Ri*HR2;0@- J%N4:ME$" ZW]$uY֖ 7UC^6auR[uh46L\Ym!cB'iuL#r a\U΅(؋錁6m^Vڣ_U\W( `Wgװ\6NӸYkw7c ?BY^9}_hA.ˆpooVwXX7]Sht@c. }~{'{^&H3b aj] Ow܈{r RƴlB vP$`{ Gد bAp>G@$Ṗ!K2 `C" !ʕ: AqVI8d S@b!#1&{bA( 9nj4HA P8$ Ba* CPlNţP8n G` 'EҹL(Ჹd]GdI&M1 ;(ԥA0JTwK_u~h@' a#_W?{;/GI~</ 쀀 P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9m7NgS}?PhT:%GRiTe6OTjU:V4@U4 P8$ d z=`(TJ-ⱘF#"AdYde%s4M;A"4 TCx>Reu ̾];9eE6V -;|^n^.ۍ:n0AaレN*/drYtQ,VU}`mgRVh"וiW&HwaXuLX6B3STHmg&5+fڈl[63n[En 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"]] 4.4072000000000000e+05, 3.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -3.0000000000000000e+01 Area Gray byte.tif 1 gdalautotest-3.0.4/gcore/data/md_rdk1.tif0000644003401500001440000001265013614004466017675 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/test_mosaic1.vrt0000644003401500001440000000067713614004466021006 0ustar rouaultusers Red ../tmp/test_mosaic1.tif 1 gdalautotest-3.0.4/gcore/data/int16.img0000644003401500001440000002430013614004466017302 0ustar rouaultusersEHFA_HEADER_TAG@RpG rootrootXAAG RRLayer_148752404Eimg_LayerXAA Ehfa_Layer52404Ehfa_LayerXAA0 n0Statistics52404Esta_StatisticsrsXAAR@o@)\_@^@`@@X) 6@Z<StatisticsParametersEimg_StatisticsParameters830XAAgg ggDescriptor_TableersEdsc_TableticsParameters830XAAVZb#Bin_Function#eersEdsc_BinFunctionrameters830XAAR@o@vg?@B@L@O@P@R@?@8@(@@(@@@?@??{400:sdata,}RasterDMS,.R IMGFormatInfo04ImgFormatInfo831XAA k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckfo4RasterDMS52404Edms_StateXAA XAA #cMap_Info52404Eprj_MapInfoXAA+UTM7ALAOALAgN@N@metersProjection52404Eprj_ProParametersXAAUTM ,? Clarke 1866TXA333?XA^s{?fOMXA`+Datumtion52404Eprj_DatumametersXAAhNAD27x nadcon.datZ Histogramion#eersEdsc_Columntionrameters830XAAZZHistogramParametersEimg_StatisticsParameters830XAA a(a DaTaR@o@ra} erType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.gdalautotest-3.0.4/gcore/data/byte_point.tif0000644003401500001440000000125613614004466020530 0ustar rouaultusersII*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 v F@A̞LAN@N@ cgdalautotest-3.0.4/gcore/data/md_eros.pass0000644003401500001440000000034713614004466020170 0ustar rouaultuserssatellite EROS-B1 camera NA50 sweep_start_utc 2013-04-01,11:00:00.00000 overall_cc 0 detail_cc 0 cc_ul 0 cc_ur 0 cc_lr 0 cc_ll 0 gdalautotest-3.0.4/gcore/data/pixfun_dB_r.vrt0000644003401500001440000000104213614004466020635 0ustar rouaultusers dB dB Float32 float32.tif 1 gdalautotest-3.0.4/gcore/data/arcgis93_geodataxform_gcp.tif0000644003401500001440000004212213614004466023366 0ustar rouaultusersII*,/(BCDp"EpS,,gdalautotest-3.0.4/gcore/data/float64_3.hdf0000644003401500001440000001536013614004466020035 0ustar rouaultusers j\ FJ<!<!j " 22 d7 ; I F e y< :NCSA HDF Version 4.1 Release 4, December 2000@Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@ZValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0@jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 float64_3.hdfCDF0.0gdalautotest-3.0.4/gcore/data/pixfun_cmul_r.vrt0000644003401500001440000000140713614004466021255 0ustar rouaultusers Product with complex conjugate cmul uint16.tif 1 int32.tif 1 gdalautotest-3.0.4/gcore/data/gtiff_towgs84_override.tif0000644003401500001440000000150713614004466022750 0ustar rouaultusersII*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  ^$ !&JA`I|UA??# z )#fffffF@P@y@zG?9v?/$Gz$@DHDN / Gauss-Kruger zone 3|DHDN|gdalautotest-3.0.4/gcore/data/pixfun_inv_c.vrt0000644003401500001440000000104513614004466021070 0ustar rouaultusers Inverse inv CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/vrtinvrt.vrt0000644003401500001440000000206313614004466020300 0ustar rouaultusers byte.tif 1 ]]> 1 gdalautotest-3.0.4/gcore/data/byte_ovr_jpeg_tablesmode_not_correctly_set_on_ovr.tif0000644003401500001440000000324413614004466030613 0ustar rouaultusersII*S[I  0 `C    $.' ",#(7),01444'9=82<.342N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|  BCDES[IjC    $.' ",#(7),01444'9=82<.342 ?IY"# sץHQ,7x?w'ʏ>Oo|?*Oo|?* Ggdalautotest-3.0.4/gcore/data/ycbcr_with_mask.tif0000644003401500001440000010625213614004466021526 0ustar rouaultusersII*΂KBCDES  TN Q.' .f@' .f@U4b]㭳zQAH#        )#    H@@@TXAmtr@unnamed|GCS Name = WGS 84|Datum = unknown|Ellipsoid = WGS84|Primem = Greenwich|| KBCD2E"SIʊċC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" ?((((((((aiUcG^N:WgKFb2͐8*pFx}2a]^ǙQ_G?;b˩]^R17b9ʿ8GWH-#MI3TAaק墹.i,M@KA82^EuWsm-WI|8zn5"]<\>_I5 GȞcǧ^C kv]CZaE`{b_-ެ*1ƊӅ(H$kЮVh `aORi6R>zWk0z(4a)Ik#?XFkHY9-$9Odžlkh4B ,^o=12@DԢN&ayjuWӔ]@~cn$bh<{kZ6崍E7ikwi Q6rp0@=+&iѤVQ*EH @;ޣ[&7 R0 c3j9W q^}qee$ :aƱo.2I#QJ̬@lm\Éf*{zWaN|.VsfE3G浏Fu[ Ы3ӑ&8SLbq{Ǧ?JMUZF:NRv>E+>(((((o ~!.\\|\F \Aǩ=hnۃv2jk[K녷vBp2p=?zpY2nsR!r3pT 3GE k@H86zIⰕt2uWC4?jǦ#0p޼+υV6NHkߌu#*NO^:.Q3\z=j#e$'Xʬe% >]х,"GV!~n%0Xt)ageۭ,. ͻOǭkE ˴)(}+JMGVeArlL=_[@Σcsq 0IYzM]446Ep*KjA7}k$i.$nI!Xm*P;!9^c֒P\L){zVF=zڠ'e9ޛ 25i<2|q_8Lq_4j(~2=qZ4wyQl{ףiB3Q:OLkvuwO~U(&x0M6V s++zj~lf8iS nK%۴I+c9¹(+ `9J!wgE*h ( ( (G"32I=-S_6e-̃mUx^h %t:62&n1#=hl66;TD$jW<&[Jg햟\nׁ"B|0qvVDƫhQaTtUTH%tdȸHp =)9n_޹OJ7`Uc(:}ԿڷDm>~ϽMsu ¨@"z()3&e"U3ly#p^Vd_ɘ`O% 乺?,p Nk{TI( @H8ac˰J/:5_Om}Řs  PC"Fq?-rs۸896h{+#O Ss=D>Lϛ҃Z(dS>kW}ZEjrt<ם8I9(((/x-CU_G,vjU΍Cr1)(s~A$YDdpvU 2+ i[y!#y:g5knQECdQƛV01a {qZ>њDvFpOu8{'9Բ_X5Vх8ǽ`Zjih&ޙۧNIoN1qXR-#:e>]cs^E_O Sm5Zg{6%42`=?F tCHF A'O^ 4V! ORF:+ƭEȇ!ۍZ70ǚa@YLaXt;r>Z Mqr==kOc$*59!k˘"~cA \KĠw69g;ۗ)3[ϼR]㌃֣۔b.4 aLo®+ێ^a=GQݵHA?۽i%h:㎟nn7ͣU[_Zl2X=۟5N:~N=̖v΢Hـ ?vlOV8/isQ+MQ˸rpj9]=#>[}>_AxXy7WRAp:#?<4n5}*109:om2tXLX rx/נ_7G*sP{O Lo $eb?ç=Wn<'a$3Tn=ӸSYV֑ m|S>޺4*21ZlEw Z CN z ;zgzDqXagUe_6"TÚ͋h OlJc&paɯN5FbN>8Py֯Ũi$d|TV4T:]OS㶱UvOMCWx"-F(9'vc^8Ȱ.py A9Nk ԍ=Gy Enz0٭jG#3('ӭ^lE@tYJ՚F@% +2[ɮh>ҹa.hQi\:-.'%C œFEAź;OxārlUOio-*J sJOմ:f-kPZPi\.S 9jy2>CRU~hT>zzr+k8Fɀ:mwGVb2<ߠ5tWQ3BiH{e:d#4Ȣh ː[3Yֳ*]<`}릎G^??vN9-kԓ", '}+^@+s^!g^P-Ncru ߇H z{4D"ǐG#g)ӵбpWFԚ&H'9dxHi)Ȋu@)դTN\p{NE]&#|:-9)FRGZ2rI4$,y9=XedЖu⯵pV U\é⳯KHCqգ 5kE)9tY qu `2u{qSZDz'p9珥YGuiAЗֺ8+vKmdXM(J_QVKFڀV' zV\BV{nAPzs#Nq=h1iiQAއVThdSMY_ǿ}iԲ:}lҎ$ */U,>e@zT*D[9Ww5Z'c#iM8H$䗨Wpk+i'~;#kS rSAFoI,`pSP$+q :zT{UӛrB{ݢa R{T2 J/UUPMKTp謹xcO n<Ʃ-Ǵ|}?ײ H>_Hz-JJ`b&q޳6X1s"9_y"1+p:ElƠY4K^@sVܥF(..13*PX]O]͡sA%AK|N :>X7] fwI%Ԋ|95I ҢM5OuvWd` {v_y*9k72ebc96[+Gwt}IL62͊$JۚŽgv6W^zЕlX`Iu \i)N[h d/sTnǚcFea{f2$V_SIyH g)j*O wJdvZBv}S<ӚTl"RIݘK5br*ȣ%y9n$qJ٘sPs ˌtVzU4Yz b9^IlKL=Ă=(|2&}ld#'=۸fNyg|*pu-m^?n%dC i\D7?ۜWz,qf u/~ч:qJEu',Ol?sjg[ ,eId*r?ʵyMdA`n: utsӥ(8-nq1sM nz=6v1'L&K՛VIhtKRy=JcҽoD [,3܏WWlpٹfPO#䎟皆kaqI+n3\J3޹{w9sGZҚ6;=j+cB1_ا(ԚU3۾ -tr8>}+6ImzT%:!@8ţҝknv΃-FAGc܀`G0oHFlX>ϥt:P?t 5<v܌L˙v&n0mU-cX*ߔb,O6[>QǭM.:UiI_$N6'+hÑɓ }ޕJ^NTU܎' Vq5nϔ08ҷLCsWchORl 9[X`)n6nE\bʩbFʟ1;qkB0dNo:&Vգ$15N69TJCIg;1yCH3u?VrlgdN)ԒNZ uIsLy@!8~T6tx'd -vvdd1vI-ͦ; 9+Wcڤ ;Yz"i:;Bڷ=>F鹱rzҾbYԓw>SA[ļ}¤gzo9I W-m! bϩy}ӕԴRp.Ý= ҷ$s9_r@p9!l f(Y\W[19Jc?Lrpn$p{%0󗄮~;`J(w ~5a02H@S}BKY]z̚br7wO[ a>u?犷%cXFqZ_FWCi5j6[L;H;#۷s=(5۽Girk\)ާ#z!I)i#[dUw85Buź)9 u\s޹Aa'7gVU`xؘ*3/;V#ܼH+VI~"R̈3( |L[E9InyEt*Y\nX~5z !`FhD)n9 U@HrzSbuEf|TѠbɫZ3WK4aǥZP8TI 2jՌ']IhCf{ux[64׋bAnB1b;+jm #^N?sgoUq֔V0ȫTdOjM |J>5rAQ^ 3cT`7^F}Qgqcǩ,q1+V.5'WicW8*蠆Ogj+>DTd(~f#{; [`S9 | 䏔uy0ȹЫxNVL8#ߵ 2i 90ApOg.XcL 6c?;iHV pc2sVUYwhU1:v,l|Zk]Z5)@'qMeQ]ӊ\Yʝϩ|'.o#bx`1;}kc]d`Oz]&K jL 8 ǧ>܊WpzBeVrr:8hUF:UefÊN}^Zepѐ qgg3_afxrD*LaQ95dsQ쯂3Z*؂[:g/'!pji$%pEB،85;'#9 3m G'czJ =,N/fLTr SX7l⣷v@Hjsʝ| H2?c69c{5:үt$V9-9= hPmʡF>w+XIԿC֡M8Yu@x_+U=kVR|,>ַ +GG)8 {94͹y@&NG6_N2yD8de,HǭH4ΊnŠ(3#A>5ňQOQ[vQV;vT¤4RU]A6G+Y39Hu@Qvț"1杍\wD3$C {p{TOq1Th̶}~ek1yjS]*ǮiJ]ju[ 4LuChKcx蓁 Iqⰵ] EFvJ[MsI 0 Aa1%EZ{mlL`խ[KܪNs9Jܡ+0xxREc̤UO?p-;3 GsyN)?vV$ϥ 0ye1MTj$ Az Ӛ@W4Mu+:y5)[TtA-,&QM=:0tD*®5rBbX[X8+~!$UEkX)1>X%G=g() pKϠ>E9CW?Ixau,0Wwc=Z!(bDSR0$ϥ.I#"FG /-Dn$z7 OjFKs>LB%,wz*8FN!@xJmrlSTi%k'; yf6$8VR-n~v2RP@#koK(-$BX-}y80IVo>a+=ࢊ(Oׇ5 W`P,a%?2{ՖkX6l Բ WUx+>UtޣqӃV5i+lM'50CWB#5VV1!p#O91\aRD[K|rzkEsVP- T3{z1* S<{BF)9F$T?`z=gHȎd\8 =tw&Wcu5zFy7 ^Kr1[L\S1Ϯ8\+7S#mtd_m7֒E,QC=;:Ҕ5Lʳb]Cue: Yø8+O׿^q?B%mE-1+g脜qץ{E#_pɓ9jW1X$nsTOƲ%q˞G皺#%^2-O< H9n]dBQ61܊[fʹq{[ѯn`Ӹq׃qfUV9+>X-L:GE9 v+JE_#YpN8sKLe#*Tp\WZ_ac<8$ ~V|v4Tb5#Y U^3L۶݁I{UDJ@fjG =kZC89v.Q7Դ]V\8pk< e1]:[u ʎ9k|\C@~11x8N;3J2W

WL[('-9ްkH'de yԅ61ҨIsGLUDy1/45rUYFU3=j+;yzVoJ=.N smɓ;|sg[XG ֚q޶f#SO;AI8S+³f[ fs$/Rqq\u֫5"ʹucN~bS3E#\/2j_s9VO3i7V,ї%Q=:覚9ZQE((((({@͌c#oZ,nH+ŤxT.usݬY2A:W*x%d"'F3֬[U >`;Um>1IƬEi4e!==6s\A1Sg`X|=To'6{t9Fi+6.P`q}N O5d!vg@'_a%"&3WI pN"1Wщƃe{qZ0L%YwBHJ2Yw4іx8u_~y Ï?Mb%Rf珽\/qM%O8?Sץt_ qRԵ«p?+npچHH~]M ҶAOOp}㙾r)&O0= זM(m8UkMGPzљU` y\d0|zŜ7zdn>e?!a1Zz^Q%9z5\ln%RP]jKC$F*Hi7kcjV?4cr:7!= x|/WR#mtsBţwHӟJȓ> m9 :a[c5|=\ZeqBs=i\襈p顽WҳlIZ#UaLXy#r0{&Ew4 gG˨?wqwF;ϒL1힞%Pl3㎔,%vyZxhKM)8یs5Po9EO溒km A,w:sܞB4[K6zPzI}-ċ,] %`(^TZ- l<&GzuR"aLO{+!: m'Si}ƥ,N'?+%ԤFx*qG#o#W8$rb\Ķ(Nz9sH=da^~ZUw f+\UJ79hr\$/ĥI+sʱ?Tt]3Tx#Iy dG#rvҴE^qoI8a^.?x3<@y.L `t'.١є# #&k5g\L> x?'دis+ ( ( (> +H2px;W5iga,C ꏩ#]"b[x `z)hW GUз͌9[%CIXTyid8PvhبjՒN*{ LV5%dEK;˩jhClqw!Ǐ½&XSr\(5&o|ӻBV79zMGB1qz$=`4Kp?׶.c2)ʟCuk3;p>~jmWlHq?wV] dk'QmF=+!<2O'Һ=:h Y{mجaih0j,NUzs^gt}5چvJ@lG\~7!1CqzǸ;˥چ>8;V\8p2=9{ƺ-2༱;2G;+yxaTF iK* qHldM#_d%rb?ZBMb8AӿTwg (TކIFgYׯ[9 TQA5oI'$seѓ3T/K^9]J`{V fAkQhqi|YSn=LGCy<} wu ȡ x<5g׷.ne!V$x*iFD`J*zWctݖSt24dc?XݔfRr2y[YM J̆Q&Ŧ]NWǷVr .`q0;+/YӴ20Yg=A>T{`x?rRgJqt=/!'CFw״i4g̸ &GNٮ NX⸶L6ۃ<7D,.eNqWGfLfD~T`W?zRm,JOU+CFfob;d8 ߚ7_L5-TTbRtc0w+m-!zjke.3NwMA?ZJK\ <}E.[MBL$'>[pz ukk[_#֦VF S?9Ⱥ `Tz W;f.37|4UTkbHDhUܶ܎kѤ9v!NO?+wLєIu|8#f?ޜT)JVf@;™qld:~H.1~B,@Gڒ$p돛8֕SjG7/b+K@=޽|屰5CU`ɑ_AuGlb}+SVN16ȧ={nWcHB'W8L N_g=x^mm$ӥKCcKM-u'Nq(EuޡU0/wIKG|֮yr$9Tyg?B<_bqI5fMN<Mec#U9j9qsbאDpFN muT օjKx/ KpNO?7j{I$|ԟG-"y4 2>֪j\F iCu WU:Wg=JYlXx=JkWBŭwߞp;5D[6̟;g3Hg5QGbs-̸A'u=baq?dXG57[:`1([I 8I7\ʌQqS4(Td^Ye40OX 85gS%K ޳4hlSh}+rQxs$+,8qnMX~4+זs|z5}ZIj嫫1;/Wb#QEtQ@`P* =8lm6 <9-KqBYXn$}+KIWlduvaƣwdӔSiZD+˴|ׯnߕtnBxks]n^?_ZÚ*5tz,LQьz^ #6psv}DuhF+zSgˢ,nmK[r9Z-Bd4 ߞ ^ua?ؔeczm#|Ԗ{ldRKɐ!b[oaC0/#%ۑ~zm{I/v츉af,UVMikbO̧^q m`O xjp݋20UIWji6UJy5ٮLgjݶDiYb#WBz+j#_3EW1QE}}A  nUlu n-=M-~Qӧ5<\a^f~\lۉ'KL}Eq3dsӽGK<[$FܙD3ljIؾtkIp?g>ՕnݲXif!'hbA=*I9f L qrXԃ\6t\ق#8@Ž;+OgLbD\0ch8{W%X+[>VC}"ؙ؄=3Oj僂zhi -V|]\7;$+$lKƖ4XWljbsUb ~j ݞ;ܮ ʲilcs֦Ip8`t4*vEUGe{&p?R"[JKW%|0Hp2\YNU%=F3בW)5հa=wG\CMڋѲ;9Ӧ+kq\5FZjéO9 5_şon/#ʳ9t߳I*\W$J27{GS_Yc:~|̂>\|imv ,A޶D$@؈ǠRU$9J}?Y_'Q0B7.2XǷ>~+;UR4~fy=OVA›LjOlSM+$8;$`j#$Ԉǐ UgCr6O.&Rv4v?&UOG2}j;;ΚR-MG@2/U4 I+JslҚxwZVex4 _n LKc%^=p 859rE*4WSon~qug+I9I8PQE|m (Š(&aNε m|`ռPjݻ)䭴BRi|x=+IB~_,Y\!;O'ЁJ#dm9;"w`7#pR4eӁڜ0HlhB7bb0W>6361A?z><0?ύʃkuIG>+8-彂!q*ȸ\sFx8%pL#g~3֩ڱH9ycZ20:V\1u ?_Z5z*! Lڞ؇F3!znB\ϋe(wn6Ҷ+0i`^[PM=;^͔>P}G\C3;g1R>vfjPLUȕ2;B@&$-X2 2}&9$11A>͏UFjs o,g:w3q(HEǔ;QlALVb1;)˝jtWA][l|T9<`z W7IxZ#eS8h9z$jmIɝF2Nrߐ{ ;q^5 HjҖ1gd@~QN=lʺE*{#2(=((np(јvsM1=Tc6)L*0s|J`$pJ=*8*FesNiQ:ٛ# &$H VW9Ym&.?\EȁT/RkӵHH@{6uݻij**5 YXA˴Ҿ0Ps]jWiQ {U`>XO.1OYX) =bsxc%8'ҳ qsML}UԢݷm-Gp>;<7Fdm8?ֲ;rR;V?.' @PpKgF?h`@(?*5n+\bܑc4v9`#qlAoW@T_`(SVV>_&X %T7W' qIu3 $lYKnu՞.'b#\xvkSK^)Y[rNHH«=݂jQ$V 3^N]b1Xz4gln`ky$'$ךxS:߷OPwR[ӿRT^4ř3NI4Q^)Q@Q@Q@[zy sc {Ki1.6qv?[ [Ȫdr *٧ҒԹ;Cf+6@5☓uփHwܲ)^MVFq8:zYۻ)W)ma4pPtϱfhOH9'fC`}AZ-rNơf #`\ F40Ofcy%$TcO=÷Kr3R5ý) А{5LH7&>P~ zf=dfʆ?`穪H)dfFd['44+*IQrY+Z9n7zRGEipAe;>߫2n20AQսcCpA4`YEs׬Ϊtۍ1-ՐI"ՙ"d4"늀@A5ʬpN˱#Qm nУ#qXca)z UC\XAgbT`9$שq.Ƹ(ٔ13U0>nx.R8 nRgQ$=McU!t$W|g ԏAc"a呤݉ff9$&uQSR g`?;V=y$naEV@QEQEQE=263ҴH\{C+׹ KrD}8{9x:"fie6H wV2+>IXMÅN@x@+3Qu_oM@";EVK曘bi]v*kT'nwn,3ʻm&s)H"`5Z }Gco6\s ֪Kb`;0zz.{h?JӠMS-$gT־ZHd _x/_ZꆏCE1IZ=PˏgWT֚5;Oµ"}b18Ե;ɞUyhzv#<ćA^[]3~ ~ε&pUKknc tם[UIzlrF 1ڝ:iRO2^dbKשt3m_KHupqBƹ &#+>jK" ݿ0Do D;V5W3./vQh 1nؔw! y wXb^eGJJwGiUWa4yPOҫֲ ;~s{ֲX YS'C;EQҙK 95[<ʻFc"SqGBzұg?G5 ܧM'UMa- ,L9 zS+&N@&AjhwPMR 0/( K3+|e6ߥ4FTs\JBh-ъ6FjB#*Ԗj*3R7wkCޢgiOQؤXF8NԠT(ޕV9-HwWX뚴FM6@Tum h[㞝HI\NF=+b i3e˨8G$N)uI#֒9dx-Q_}@QEQEQEQE^mkoXu랹G2[]BD$n+)0=kz 6ig SOᱼ+z[=F lRAACgY.mqB2t?Ӄ[6ڊ\:H[j!mF,bD5av N$$+z8~ݎzZu{\JO:US.ו"$2ڃ[H8Rx5>"5B$=qJq='Nz5v֖s[(i+zPN(XP(((((((kJ>Bh\*S8Sp0;{WaxK)i=z7w\ ך]4qu)8(}0pe9v"A׊k,v$rVYt*fy^= ۓN%#k?7n@#TU1#)齍GpcgÁܰ0oR3CٷSU5Cuy9HJa.mpVQ?/u9[sAh>Ut<}.;˫wF-'νF:@ r+5v=}R%B L2ݚR=?3v\`$6M;q\01N?o*`1k,UTqX{k \x!e_Iϯ&J|Ep-Go,-X{#o*pY\N(=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" ? Xg?ZbKh.6rrY-!]%,|c{bL)GSd>  SZ(_ c[F Zw^2rv>MHI fȽjr+e8ncL 8j2"^6gڝUD{ڒq7خ/y{ ;.l(ڟ[PTr[KYZH gkx)I\ B*ުQ}[v1\NcBG~j7qGz^k[EDiݧ;$5ٲ&錀sq&##խe, b!zաJ 7".EnB\νpi13GQa)~VUy"˅!SOAWeO{(Qrz _rkO[uaSg\ت͝L3اKIs)?1T^>zE6u$QEQEQEQEQE}ʙb~!%WAX:43KxF WM"B<wfͽ+,ԸB 9oCx#ԌW۟K}`d0*\|qQ #BU^w&7kpDH/g8'u!KZY;ۿXOsކԷ6QnYULET^ E)9;B1QVK@) ((((((4aߩ-69U(s}(7V|:5QX=WXk;#sEi0;kOr@?[i}>-7>~zʃV>PmҞQLse[>.=U$m =rzK_y9zZ2A,dy$u$`~U [97# 5чάc.eWwCa ,;5e@Ecz$ա{E& QVпt7pBW?#O9ꯈ5(Xԫ Q,q=s+ռvÈzwzF* ;-cYҭDӄ.Qxs^qxQ-d{k2Hڄq9x9ki幕WFʼnuӬGC OŠ(((((((((0W)jqWc|?Hi:X߷迴m|-}OIGU_Bkn[]m~`$=YF?*ǚaW#\M7}e6C'ٗvU#ak?]biU~\9 pG==klK >THyrYyB2g/jkq}vK߆}Fj;o&߅[lOja›E{Z6w8*ON:v#wSЧ<ژKR4m;9M X'nkB;߉}|5㳗߈C>||-;~*୯nE>~FϮ7^ŗe6#zwޝxH<$C!x{"wG#H|$>OA|$>ǛxH|ӹyTC!OH}>RG#H}>Rwd{AGW&~s\z^{}~Ⱥ=dݞv{˺=`/dޏ+gn`I/Is/#6QoII/Im>gA*^nq:߮I/6yO`ON='\ w np'p7 xo|;+W xMz% n??f/u:t:nv%^Q~FN?r_fݒIS@N9#䔿[5s(#[\^[N19ӖtsAK2WI^xһ 1 PWţ >}(8#א;9]~l Oqc~Mod@Fd@F$>wX`ywOx3p{3p{3p{3p{3 ^^^8Ops89xhw􅼣'qP08(  FׂG'N> %/s@\ {~/ ~7抢(((((|jxұ D+( 2wbNoF,+WW%^^}N// މ7x!ng_'Ao+q;">x#^zx=t+qx惇a>x{8{罜=<<<<۽/g9F7rs=}?gdalautotest-3.0.4/gcore/data/vertcs_user_defined.tif0000644003401500001440000000065013614004466022373 0ustar rouaultusersII* kS  0 <l@A̞LAN@N@? &&# Wh )#,*#NAD27 / UTM zone 11N + EGM2008 height|NAD27|EGM2008 height|gdalautotest-3.0.4/gcore/data/pixfun_mod_c.vrt0000644003401500001440000000104613614004466021054 0ustar rouaultusers Magnitude mod CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/idontexist.vrt0000644003401500001440000000157413614004466020602 0ustar rouaultusers 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"]] 2.0000000000000000e+00, 1.0000000000000001e-01, 0.0000000000000000e+00, 4.9000000000000000e+01, 0.0000000000000000e+00, -1.0000000000000001e-01 idontexist.tif 1 gdalautotest-3.0.4/gcore/data/stefan_full_rgba_jpeg_separate.tif0000644003401500001440000002705713614004466024551 0ustar rouaultusersII*+  @ RSC    $.' ",#(7),01444'9=82<.342 @?(((((((U,T9&<7jB4U-=;u4$}J|"Er¨1븓Y";l:XĢہbN"p$=>j+#`U`IEQEQEVjҺ[D]30D}Y][ō(\pA]BH.V:]ZihP/?3?PX :6>k3\>Ev9S1!URqjh((|W+ Lj|%ڼ6@p[a9?L⺝GGDž5=KgipȠ"/'r+=v鴽KOUB|2'8QHǧʛɜc9bǩIEQE8#3bԁLJ49uI! |#oǧ횩¡bB(ҩW߳"%!%yX+JlldToKGϙÌzb(њJ(+{ql&,#_=P vVo4ѵ|e~x:zW{A_^m-3~5K1(v^ Tz"d~xx)I׮־o}Ķ2I"?*b r:z(((j7j.ߎxpk*jM ńÎOCrIemsзtߵH(vzVȖ&?9TԌ}>j--ofr3Gν 4x,Ybzwkc<Ԛ~!hmJȶz x24n92.G@xbw*8iH#QEQEWC    $.' ",#(7),01444'9=82<.342 @?;u/ifLbUSsҽf(k=Op2vQD`\Nc^M5c0ΐap#~+kխށyowŨOeMoéPp}޹۟h߻SW.*?Zk:.-cԩV$נ\WYInlnm.0t>IXxZ֬N@ B+L)<f8+,!T#'nAIc0{V}߇aAisj0n\ΨEۇ+־hf]Amcç~t$LbTRO\0pO9F(2Α=>6fFY.4 a(%<|j> 9I]†k3G x,Rm8<?Zz.Ɓ!iZM0VaL񿎮.Igk}2(&ǜÃZA|EʺHҜ5gCv=&(QEohmq6Y[@G>?*Ү[ȥ$\TV7?ggF2۫ae;dVL!Q<~#\}:f mS}HR櫓7 EX=%)_n}o~ild*f"0Fx"1\u5?̇ٳ*R8ۓ6(. )O]Xg*z\­LxKL˺5^a5IkgkqB t99^qe6R~hl_NԔ|\}rOnvh yk3ѮrQ؀NյystyISF,qFocT#QFh(zlB:3m?Ct牤կ u"OsՐ*BA7AJwr;FH /4;V`:k$SI$LUס9Fr,I*TmQRjdg\tQEQE1L(wiYIi e:aڙAڃX\ l *S5)a뚉ܻdEQEQEQEQEQEQEQ_C    $.' ",#(7),01444'9=82<.342 ?(((((((((((((((+C    $.' ",#(7),01444'9=82<.342 @?((((((($Zz-; )mwWDWaVPLqZv7qkousZ1I'ֲ exv?*Xq!cm'0QEQEQEu>^%Te2G,r.8 $~oŞ}+28Uݬ-m8ҭἃoh9"¹[B{%ZE>Y^g-.}~EQEQEVK]l/1k .,q ¼r3=*۸udTeQG=W~Ja{n'8G(1e7CTtQEQEQEZӬu-!Vg€'|8<3T3m˶9z'Xg FSOX Y$[XrF3\1 $}1JѼ ?Iqq֐EQE=bi`3Oi?XKuVɃ3LԓTM$x쪫ƪ0 YU?4\pvV5 ~ʽ{S`חxq4hn$h_#jQEQEQ^r]:[[L9eH(~ΰ"xQ<9 ,geOקf.k;Ff^wSg1x"=˳$rHRyIcwdOÆZ" ky~خs$AC}֢H2c־z Ǘ);q\jJ(((/5 KM.UsϮ^4EōեeC<$bA#tlY[]/LHSL2 v]Hu8Bq ѦRbI!M0## 'pA3< MG\#y6Q]x;ֽ"\ެ?g+Y!e1 %ǽ|_^ӵ]vM0):^|8#Vcv> A#QEQEC    $.' ",#(7),01444'9=82<.342 @?멢hj 9f5FF2sҽ+c .Qex8^g^xHlI]Eow*,uuėA ߨ1c(LbU5:zևK*t f'S?]g閖]y-9i;sﶹW(֬ͥ< k'4 ұtdP~ӵ ?GX rTfH> IX,foA{F_'+='}vZo-]rDu'=Os7XӴKՐIB/9_ r?r4QEoom.&Pg w籮Vӵ٦Lt[r `'ִ_)RH' Y6nPk;F"ͻ;ZͲ[!oCMho|H- TVI@ܜ'oՑ;5ޡ&ܵihg=BX-`_DUlMY=-R)`mᕔ̩KIRsM@? qtp̎p@ w#N$ǿJ%͹27ˌteԥUdid9$9CEQ]ëV&op׶BLGBIt3K0jzqu ,U3_A1q>rifwp_¹[VY:}dfX!S= .H<ֽŭ6\Yp G;PHs`c/Ԟ]B¿ѐl?l>csJxT|nuVV _ś4L +:f  EĎ<6]CX2I2ǀ ǵ%81 -q3QKse<2"-k6J:QEu~kcNXԳ[F%++}%ۗPb)I8=[A.lṷޑk&"Aӧ"e ڪMpm(bCyƁf4N@6wN~~}} kWn4-FՐ71̧"ŧ_l%oB?n=y֣oy_e}#Ќ]]Bs#aw =){RQE.nN(ȴp܊ Z<=y?+J]J%tE`$~ 5Ž6bh /3NGJ+j~%2GV۔{uxB7*!p=;x/ ;ʑɒ"@+Kׯt C'OW]ZxC25{$&-tP׎ޠRQEQEV/Sd[?#]e6qb"[ȫT- beOڌCwi$q3󹂒>?:IAC i"Ƚ`:T3Y%żrE$ҙRF,UFFE%)IEQEQRA+AԌHv=j20pzEQEQERSD39N8n_xvL[1 `w3B̮Es+GS(-ϠƸ^|{UĚ3NW`  eQEQERfG A5C?ZRՁQEQEQEOsF1My Gbǹa*:dK7`)֍u((*P m=EJ)l0zSJ6(((R0Ԝ*}*,ڌCN8IP##QEQEQE9j{-) G|*VH &uݤn6s wi)h @z{QEQEWC    $.' ",#(7),01444'9=82<.342 @?8 qSM "2aXA-LZ"@lL>FqC>pd9*TL6;P~y | fU.7go|u j }NBc]S 59ch܎ EEQRFp|Tђ=)R#2NAM;5q\,b)P_c U  %AUa5F#d)+F+6Ԅx4Oֆ`d iQE$Ks?H<`1F'ƉՈ*A,h7;8 dOJV vz3AHP08tz_u9)1l-0M%|nn S((clD:t-AaL#T6PG'*>F[28m([IYc׃^P6Qϥ.)ݦE(z zfXK71jrX>vE9hקң E<1qtKE6((U8aR^vޟJX\e'=ɨ(M(q .B8fq k}9\<4D{HIᧂtaCq{*'T]XI, VIDS,wao%/#R1 }?HeaiQEQEQNDy$XVgbO`+~Yx2H7 66x9.1I^ˢxOE]Ge@dq1󟙾ؤfTR@Q$ O~w*^O39~rӼζ>vOsT)⬻ω~,}vV6mcHs뜏U$Uyw_1(}aYs_YG%+YDXz56Sz({ [ڼKgH ̪e @eֹQoyّjBDS  ^i/5b-i  8'7glm{WVzm+^i-Ov:_\.۬ҤfY,  'Im}-'j(Qj+cӦլTNgGQ?\kQJ$W7>q!?9/\FSFnd?i37SQEW|!k2ZTRT}nVs_Qx#ො+#ƝiIJ}JP%7VvvNvrFZE1$Q"0(dG.>ĝVlv`-'L^;`]Ooym:6[2$5''1nkO{W!*W̿4ۧ֯((+r!Xsl{\|(SX$)r}k7H~a}qҰ|C1R;6Q>9!Fp@;Z2-y߈fbE񤢽e?}EUOuk)6(~V&66Ry@ywpZ-aӸ>ާk6K(.@T[qמW_fWk+%eV(W8KxM)ۜjDjZJrƲ%y~&ٚXľ'mYW<a זOk>)I؏B;#5Tbdu;F))rE&sEQW=M]MV!+Y]Er#'0lgqZOk~$ LWSd9$ $@Wx_\k(]8z}z3\5 F8~MZ./eN2~=p>:F/d\CC1t5cIq]'o/ǸmR4['H⌟`󩯵YuL0BylV`+.dTTQEQEKn%]qgoK8.a>[]7CnxPK9"61ѵSzދqҲO<,koX4GV(C    $.' ",#(7),01444'9=82<.342 ?qRy͌fҗ$uԱLNr9Fȭ(5ME>4TYJ(((((((((((( , ,@ ,RS-[!-L$BF vbyH$?+C    $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzgdalautotest-3.0.4/gcore/data/md_re_metadata.xml0000644003401500001440000000210413614005320021277 0ustar rouaultusers RE00 RE-0 2010-02-01T12:00:00.000000Z 0 70 AUTOMATIC gdalautotest-3.0.4/gcore/data/float32_almost_nodata_max_float32.tif0000644003401500001440000000065713614004466024736 0ustar rouaultusersII* S   0/p-3.40282300000000000e+38N@N@@ALA# Wh )#NAD_1927_UTM_Zone_11N|GCS_North_American_1927|gdalautotest-3.0.4/gcore/data/bigtiff_two_strip_long8.tif0000644003401500001440000000043613614004466023206 0ustar rouaultusersII+ Sstgdalautotest-3.0.4/gcore/data/float32_2.hdf0000644003401500001440000001226013614004466020023 0ustar rouaultusers j\ @ <F!gk<!j 2 $7 [; I F % 9< u:NCSA HDF Version 4.1 Release 4, December 2000BBCBCCC CCCBCBCCBBBCCBCBBCBC%BC BBBBCBCCCBCBCC CBBC BC BCBBCCBBBBBCCBBBCCBBBBBBBCBBC BCCCCC CCBBBBCBC%BCBBCCBC=C-C-CCBCBBCBCCBBBCCCNBCEC-CC C CBCBBC CCBCBCC-BBCBCBCBC BBBCBBBBBBC5BBBBCBBCBCCBBCBBBBCBBBC C BC BBBBCBBBBBCBBBCCCCCBBCBBCBBBC C-BBBBBBBBBBC BBBBBBC-BBBBBCBBC-CBBBBBBBC=C-BBBBBC BC-C CCCBBBBBBCBC BCBBCBCC C BC BBBBBBBBBBBBCBCBCC%CCBBBBBC BBBBBBCBBBBC=C-C C C%BCBBBBBBBBCBBCCCC5C C-BCBBBBBBBC CCC%C C BC-CwCCNCBC BCCC%C%CC CBBBBBC5C5CCCCCC5CCBCBBBBBBBBValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0 jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 float32_2.hdfCDF0.0gdalautotest-3.0.4/gcore/data/cfloat64.tif0000644003401500001440000001512013614004466017771 0ustar rouaultusersII*Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@S   :N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/int24.tif0000644003401500001440000000362013614004466017311 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{ck{{k{k{skkkkksckS  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/byte_ovr_jpeg_tablesmode3.tif0000644003401500001440000000403013614004466023465 0ustar rouaultusersII*YS[!   8xC    $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|  BCDcES[!BC    $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?IY"# sץHQ,7x?w'ʏ>Oo|?*Oo|?*ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q gdalautotest-3.0.4/gcore/data/int32.vrt0000644003401500001440000000253113614004466017341 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray int32.tif 1 gdalautotest-3.0.4/gcore/data/right_bottom_vrt_subpixel_offset.tif0000644003401500001440000000071213614004466025225 0ustar rouaultusersII*  f dS   JN@N@(ALA# Wh )#NAD27 / UTM zone 11N|NAD27|kpwyqw|\mjx~u}iigovt}ev}rt||{qpinttquhcadfww^n~^`eu~~xu~zuoqomgdalautotest-3.0.4/gcore/data/ycbcr_14_lzw.tif0000644003401500001440000000447013614004466020657 0ustar rouaultusersII*0 @@x\*!dN#EcQJ6!p s 0k6"#! G e2Ks#9[= FSIhW0M%la6NYb;fjlc3Z: %s0J#k*cwEXe2q/0NRp9Eټ~9YW<^n8mfv:ʅTU7$Y0 $dڕCWMse1z s(Lfl2# 5̊*(/C#b8.0,i$0> @./ 0 Р-cȮC()+p/Ē3 +3 0 è2#4Ȃf0#жT CCа>+ 1#> @/(f4 4i#Hc3$4J-2d6#z0# -K19 03 B+C8,5\b+ ; BhqhK7R F̳ >$A<d DO!\?"CTBp6څ͠{aX<0_I !m9fЖŏXZP3 Bs`,Ysr6P91qD`t )^y ЍזZI/tnz@Da@7 .g x:1Pt ]P bW" Z"`X 0 )8! x ABx=\@ Q7FЦHd AT9“B,\C a;'kE W'> %RD0T .QBN@"E0CЀ)$Ā] H A?C!(#! O HЪxt'"%Y hA70CHxB8*PDh;ViM$͙@"@!D?Bp' aFz ;CUx;(U0? ql,X]qCcd0Ĉ̱$QBr0-)0f3pCvd0 n aBpAA xF!PvCP!Br0AH b |`. !J . C i@`Z @|H:,r6D15px=8zpU $4FA"ǨEQyrD`9@:"AF$4tC%20eAEOШD4!p!`^ E !(lUGD0a&!+`OӅ`¸39X 8@ J!) p (!ZZ  J>014^0v;waf-D(1"9O:l  A3s07'0b$'0Gm0}$48&O"DnDH 9!(g&%D'!?in!;!0:V A`!'p A( :`F:v ''( CLE/gdalautotest-3.0.4/gcore/data/md_ge_metadata.txt0000644003401500001440000000514613614004466021326 0ustar rouaultusers============================================================== Version Number: 2.2 ================================================================== Product Order Metadata Creation Date: 01/01/15 Product Work Order Number: 0000000 Product Order Number: 0000000 Customer Project Name: XXXXXXX Sensor Type: Satellite Sensor Name: IKONOS-2 Product Line: Geo Processing Level: Standard Geometrically Corrected Image Type: PAN/MSI Interpolation Method: Cubic Convolution Multispectral Algorithm: Projective File Format: GeoTIFF TIFF Tiled: No Bits per Pixel per Band: 8 bits per pixel Multispectral Files: RGB ============================================================== Source Image Metadata Number of Source Images: 2 Source Image ID: 00000000000000000000000000000 Product Image ID: 000 Sensor: IKONOS-2 Acquired Nominal GSD Pan Cross Scan: 0.93 meters Pan Along Scan: 1.07 meters MS Cross Scan: 3.72 meters MS Along Scan: 4.26 meters Acquisition Date/Time: 2012-06-01 14:00 GMT Percent Cloud Cover: 16 -------------------------------------------------------------- Source Image ID: 00000000000000000000000000000 Product Image ID: 001 Sensor: IKONOS-2 Acquired Nominal GSD Pan Cross Scan: 0.87 meters Pan Along Scan: 0.93 meters MS Cross Scan: 3.49 meters MS Along Scan: 3.71 meters Acquisition Date/Time: 2012-06-01 14:00 GMT Percent Cloud Cover: 6 ============================================================== Product Space Metadata Number of Image Components: 2 X Components: 1 Y Components: 1 Pixel Size X: 1.0000000000 meters Pixel Size Y: 1.0000000000 meters Product Order Map Units: meters Columns: 50 pixels Rows: 50 pixels Reference Height: 85.9509811401 meters ============================================================== Product Component Metadata Number of Components: 2 Component ID: 0000000 Product Image ID: 000 Country Code: FR Component Map Coordinates (in Map Units) UL Map X (Easting): 449755.21 meters UL Map Y (Northing): 5417778.74 meters Pixel Size X: 1.0000000000 meters Pixel Size Y: 1.0000000000 meters Percent Component Cloud Cover: 2 -------------------------------------------------------------- Component ID: 0010000 Product Image ID: 001 Country Code: FR Component Map Coordinates (in Map Units) UL Map X (Easting): 445950.21 meters UL Map Y (Northing): 5417803.74 meters Pixel Size X: 1.0000000000 meters Pixel Size Y: 1.0000000000 meters Product Order Map Units: meters Percent Component Cloud Cover: 3 ============================================================== gdalautotest-3.0.4/gcore/data/rgbsmall_cmyk.tif0000644003401500001440000002441013614004466021177 0ustar rouaultusersII*' 22'(SHH@r~yn#}ZfÆ,z{o \Pʹn|zt mtq hWq j{vUX[ѿ'tmyz~q q ulq o szkma[m ﻾W|oy|Xwvtr ievs r stЍBwsto ǾGYjzs lhj|clelir q sn wr r jfʽUv ols g]q t b!ǁ$gtn q r ƀ#hm Ɂ&xn r Ðl}^bbr `iyP[^io eflvgm vvxo ɫx n_`n`jv|ttCjup ryp hrflyo ʽIlhUfp o dshā$À!hmthm lyo uq jzs }ud{wwvl\{itZȄ+n _Xxsmtlr v|q Zicm o i`]p o y}tsq _n n tlzw׵w s whlrftƃ'p n w{z|w~txws o r wzip {r o |o ws r p n wp q xto q lq ym q }˩$*ۺؼҩ.Ă$t{s zzwp q p r s yzhVM ]vj}}ʇ3m vs Ġc5}~ey}ˆ.ɏ@v|tkǃ)xń)Ć,|un un kvhZY%S`Ɍ<{q izr r kėP‰0&is r ~uwwj|mz|k~t up q xg,6be{wz!mur {vƹ&yÄ'z}}x}xwyvp un hemmŇ.CE,ȔM&q hmn kp mł&Ɔ.Ȉ3ɜ`t mZ|Ć,$ƅ,s }ʌ<†+z#uo eo n r x}kfx u kjxsz| x|$Æ,ֹt hjfhIt Ć,ΎCÅ)w~whÄ) q n gXSr 'v Pnp n lkv{|~ ȅ,kÁ##׻gs n hebnluĊ5}u es nvwkhkX*`Pn&gp vsuko p tlԓQxz#Ȟbmm h^Oxxlx!er f~p |),nI4^O*zZ&Phho {z{|~ŀ#vkͅ0|vs Ã&ǁ$\TPc{\Kr $ukh`otYC.fY0Jgvvw{zn r a˃+n lp s Á#Ȍ:»yen mo wcyB^Vh]vyȚZ35!U= aNZuzȁ$~vp lr q _ˀ$dlwÄ'Ɗ5͠lt ]gtwacq gdv lÁ#ʊ9ɍ>Ϡnʢn{ ms vtp gtԓQy{r heZyw {Ą)뿱|nHOYYfch\V&#p {ń)ɑEњ`͕Qzglo e]^֘_Ɉ3kl\hZ̅.{ā$ΎBɈ3ѷYIM5DRvWHTm8g&q t{q vxl`axn ^Y}PkV9$p q Rs wȧZI~?L2s ,8oKGifs vme_`[_Z#PaҌB̉7m 7B2^}Ɇ0WLo ˷dy RXDmq )ȐCy'g‡,€!q _Tb[cɀ$zǃ'ɀ$]XNӎHχ5i<?vъ<ԕWs Ndɦq=È0hI\ilˉ7#jmvȁ$imvgcvct~!Midn zw9TX`n lOmɰ(np.j[8,d\^_juq p o lp hTszlz::jjN[=ajvm ω9Ā#YpK{NNhY\f]_w{vs{wtq uscfd^kl SSMm XJCuˀ$vʆ0dž.hJvKr:z>ZhbuH^uvZ`z{n lp vD98GDRTD?D613Wo l̉7ɇ2wsٽeTF<OWla[UmKhx{nYʊ9ГOĂ&Y4=4,1/'/%&+;M[gҊ>XYıWRRCIKQ``m P{g[~:Ro)zfÃ&{ЎDC=>6c&-6} -$/8B<QJNʵUormMD6SYd_yєSƒ&p er w$\fyюFŁ$dn g,f~!qveQ84A>Uit ʭ6fhVq [YZN>`k}Ņ+ȉ5vxӐKӋ@kaʄ,ҐIђM֝k}KQς)n }ttj,9O`kˑEϻcjNTqf[VCtm lYJT9E[Pm ufUq~!ՐMo f=C=;84QeYet ԛ_w쾛mWTc]UnXVjk{z#!AC/4=LPN?k tr[Mq_R433Fbjӝkݩ{躶vˮ{Zu V^TZZtdƄ)Ă&ʇ2s ˆ.#@GeJ?IK;:Pn m g\htn eFCIUΏB؅{ε[>ETT\`o }uuzz]l{ΖUwvxlw{K1176<;7GXOlq uulڗ]؈꾺ȫPQDJWQQUF[elЍB͌>lA_9H>02YzD1/!.%*9AEKTy֛gv|涿}軸zɻFGBNarefw[jeOdҌBԒQ!fLD+79gxJ30&0*8ELZ̒Gۥux紻t纶v鼸|& Zebkwzw l)g>Nw|ULJ0}5S]HKet{};8*3%8O`DŽ&{x纶v缵wô~̞fwÀ!Wthz|ʇ1LJ2kYˏAЏEqXn Ā!gxʋ:y]QujHs͊9lcJP)0?׊@q~躽ĵȵȻ)q ΅0RfeXPT̃+́&^ivЄ0ӈ9ӆ5]ӈ9} TSEMzp eՔU~ vm Mp k@4@iݝlᱹlĸƷ̲˱qcO9@/\RcrD65;58-Z910&<,,=IWMvJXRr PHOυ.ܡk绺~¶ǸǴʳIDi9MMLFC"5P,;KK95 %,:`E=>MbE:R<F}ݟox躶v鿴y¶ô~a]hbD*8tk.N@6.+0!'9>,:0H:<R?FؕWx赼x繶t轳u{گNཀྵfŏ>ROWX GrPbdž.GTʅ.uQ9/&+F+8<04@;GPN[ߞqw赼x縵r龴wĵʮ|ѫ}ʾIQ|_hKr dG<1Sr ͍@zf07 A<2Dtfn zq mOKILVܜh籼q泺r綼x˵ӯڬ22('(((S(`(HH PIXEL gdalautotest-3.0.4/gcore/data/nan32_nodata.tif0000644003401500001440000000140413614004466020616 0ustar rouaultusersII*   t S   Vnan??jASA# w )#WGS 84 / UTM zone 31N|WGS 84|HBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBHBLBPBTBXB\B`BdBhBgdalautotest-3.0.4/gcore/data/separate_tiled.tif0000644003401500001440000001045213614004466021337 0ustar rouaultusersMM*"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF #% B@C@DE ~~~gdalautotest-3.0.4/gcore/data/spaf27_brokengdal.tif0000644003401500001440000000164013614004466021643 0ustar rouaultusersII*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  ^L >"~˶8AY[#APō[Lph@nQfLh@#      +#      TXAUuor@ @@@DDDDd@@]ZUUUU@@MM;p"ANAD27 / California zone VI|NAD27|gdalautotest-3.0.4/gcore/data/empty_nodata.tif0000644003401500001440000000023713614004466021036 0ustar rouaultusersII* Ssgdalautotest-3.0.4/gcore/data/byte_averaged_50pct.vrt0000644003401500001440000000303213614004466022213 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray byte.tif 1 gdalautotest-3.0.4/gcore/data/byte.tif.grd0000644003401500001440000000560413614004466020073 0ustar rouaultusersncols 20 nrows 20 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 107 123 132 115 132 132 140 132 132 132 107 132 107 132 132 107 123 115 156 148 115 132 107 123 148 115 165 115 140 107 123 123 99 132 123 132 132 132 99 156 115 132 140 132 123 115 140 107 140 115 132 123 107 132 132 115 115 107 115 107 148 132 123 123 115 132 132 123 115 123 115 123 107 115 148 107 115 140 115 132 132 156 132 140 132 132 115 115 115 123 148 123 165 123 132 107 107 132 156 123 189 173 173 148 148 115 148 123 107 132 115 132 156 99 123 115 132 132 206 107 197 173 148 140 140 132 99 132 123 115 140 132 132 99 132 123 132 173 123 115 148 123 148 115 148 123 140 123 107 115 132 115 107 115 99 123 99 181 99 107 123 115 132 115 123 132 115 132 132 123 123 132 99 115 99 123 132 115 115 107 140 140 99 140 99 115 123 107 132 107 115 107 115 123 132 123 107 123 132 132 132 132 132 123 99 132 123 107 148 99 115 123 140 173 123 107 123 123 123 107 123 123 123 107 140 123 123 115 115 90 107 173 107 107 107 107 99 132 123 115 173 148 99 123 123 107 123 99 107 189 173 107 115 115 107 99 140 107 173 140 148 132 132 107 123 99 99 115 99 132 99 140 115 148 123 99 132 123 148 140 140 107 140 90 107 115 107 90 99 123 115 115 115 123 123 148 115 148 99 132 165 148 156 123 107 107 107 115 140 99 115 99 99 107 115 132 115 90 123 115 189 173 140 140 165 115 132 90 99 115 90 99 99 107 99 132 99 107 132 132 156 181 140 173 123 132 99 115 123 74 115 99 123 140 156 132 165 140 140 99 173 247 255 206 132 107 140 123 148 132 165 165 148 140 132 123 107 123 107 123 181 181 156 148 156 156 156 181 132 148 115 132 107 107 107 107 107 115 99 107 gdalautotest-3.0.4/gcore/data/tif_webp.tif0000644003401500001440000000335613614004466020156 0ustar rouaultusersII*22Qf2S    N^ \T@$@HpH@B`"[@U@T@&@R!u??ܵ|?@h@v4U?xIw? q'Ȑ??_kϱ?mID 2Sf?BBjvnWCJZ"aϾ[a NLV>'bq>.ܭTIFz> @>ARצ>'(޾oYB_?pW`k?=(W?!Myk/ޤףEht>Ǟ S>q<:>LXTbS'(>PGt=09KUQ=2tEvB.u=|FͿ=Bո,V)$3=1#s> ۩>}Q7DB?d{?sޥCs?[ǿJ?sH,>)i ?k?6)>W NB>_>4޷jtVX"M<ʾMK߱b >RmLU>j@QD>n9b>?pW`k?=(W?!Myk/ޤףEht>Ǟ S>q<:>LXTbS'(>PGt=09KUQ=2tEvB.u=|FͿ=Bո,V)$3=1#s> ۩>Pll?Pll?]kF4ӽ6#  mtr@@TXAWGS 84|RIFFWEBPVP8 t*22>HJ,P@PlpO-]-m|hDB^n PL[@ NA\h'4{kY.H|ΠZ $߱Ňr^`uC}h?lO9kT8ݪ.5ȃܤ,]Вk:YK`s WlLB(5g]'z%/jCoZX4ʿL6z+ ҫ&}+9:x{ʯ3oNhi캈Jtuq.$է ( ͕pH'iQvB) Ai2|]ҭ0QRy2crG`';H21؈kUŨ$L^ܚhRlp"Q|e^kiHgdalautotest-3.0.4/gcore/data/int32.tif0000644003401500001440000000362013614004466017310 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/cfloat64.vrt0000644003401500001440000000253713614004466020032 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray cfloat64.tif 1 gdalautotest-3.0.4/gcore/data/ycbcr_22_lzw.tif0000644003401500001440000000460613614004466020657 0ustar rouaultusersII*~ @@x\*!dN#@0D{@s)g4E\a1ΧӹZ;l\7NespZd:*  !g1͆CY}Aҹe9K'cl,3c!˥xc̠XQb8:)TH7O{;ǓA`V;JF$Y\`3 sYƳf6C2>Z5_1'9Ƚ4ZŃh-튦~a5s92: b2c 0Ҍ*P `?N`@<,?4l/`귊ð4# -1 ;C"P8/ B0)|*c0,3@ X$`* 4C ߎ) 83 H;,4BC/? -rp%Al$)A-cS<к(c-€;2 T-$c4/#H8C5 ;P@ ؖ, + XҜI C8+=T+j `K R=u+@l66 )ы#ؤ+03* "Bcc#R77c0㠭b@8*#P˾/ e@"bT7 D@!*XT A:`̿)fg4C D*0Q9a6ÈI PA DJA\-@p".0stPP0 %$"(=ШoP;\˘q a-csh0@i :x +]̆@pS\CCs , hptS";b0,  ~ C à_oL:0 ezB,TvCh A@5!PT&B(C0uL'eB DDXbX& u !6@le5 hWA `Y?i"8(ST- b'M AW u 9Nh:Q d@8HH BTG#DA#K`8 A@!U8P)]Ys:!YD8$#qM:0J )`z ܥA xp$FBCP;vhm É ("*8t !; t B#Cb8`2=̟TA)( ( !8 aap'!@ i p`%<H8婈ZL-] 2Xs-qd8@?k ADD;΂z<`+ P" .! !A!(G\ NpKCHp`{ !=pO <COEhr"D5F 'B oT8Pn bJ3cAx> {A0C>` 48 @ A V` K1q 2w,Z&ÛIb/u" !; "BN#0(7$N"C @T(C`3J!Þu`De`(CaS(A 59b0O,* sP\D! !0 5 A8m)C$D08@Pv ''8 un > CLE/gdalautotest-3.0.4/gcore/data/cp866_plus_utf8.zip0000644003401500001440000000054213614004466021250 0ustar rouaultusersPK [U7DupVабвгдеPK [U7DupiжзийклPK [U7D9upVабвгде W0=㭽p[wPK [U7D99upiжзийкл W0=㭽p[wPKrgdalautotest-3.0.4/gcore/data/testserialization.asc.aux.xml0000644003401500001440000000243713614005320023500 0ustar rouaultusers MyDescription MyUnit 1 2 Palette Cat1 Cat2 0 1 2 3 gdalautotest-3.0.4/gcore/data/nan32_nodata.vrt0000644003401500001440000000310713614004466020651 0ustar rouaultusers 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] 4.0000000000000000e+05, 1.0000000000000000e+00, 0.0000000000000000e+00, 5.0000000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+00 Area nan Gray nan32_nodata.tif 1 nan gdalautotest-3.0.4/gcore/data/3376.rrd0000644003401500001440000002636613614004466016774 0ustar rouaultusersEHFA_HEADER_TAG@R8 rootrootA R_ss_2_470373667Eimg_Layer_SubSampleA6%6% Ehfa_Layer73667Ehfa_LayerA0  n4RasterDMS73667Edms_Statefo831AZA R Layer_2tInfo67Eimg_Layerfo831A V_ss_2_470373667Eimg_Layer_SubSampleA6%6%V"6Ehfa_Layer73667Ehfa_Layerfo831A>{1998:Cdata,}RasterDMS,."4RasterDMS73667Edms_Statefo831A(%AR"Layer_3tInfo67Eimg_Layerfo831A:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{1998:Cdata,}RasterDMS,. R IMGFormatInfo67ImgFormatInfo831AjfP 4RasterDMS73667Edms_StateAf | AH RLayer_1tInfo67Eimg_Layerfo831A _ss_2_470373667Eimg_Layer_SubSampleA6%6%  Ehfa_Layer73667Ehfa_Layerfo831A {1998:Cdata,}RasterDMS,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,.nwnc]BglfYQ40aWb[^VWe\R(E>@]wmlfcqijljcYXYi``\chkrgYL7XbU\ad[YSSZVUGaykaJdFdNZ\MrUtsdZ_cc]rof^ddmRou_`QalLhbbd^_jgc]IBQ\eeab[b=BRNY^Lfmse]`chmb]b_iuul~}qlkchklgc`fi\]vQl\eY^eaJZd_QXI_\^jblVpXed_cn{qmjhlklihjjkdZxZxcqnLl|w`eh\SXIR_ZfjjyadU`]gxskijjkigkwpjlgqVzf[oeMllek]TVRZ`fddixiP\W_ouijmoknc^piX[j]owiv[WvenkwtTJKb`gaoѯgc]`n`n{trrpxiQZig_Vqr}UrjNYb[fnb[`h\esϩΟnmjjjopl~~{yroasrghuHYzqrgad_K[X\_abg[awUsѽ`hbd]Zpcinu{wqfwzxupoknkjb_Reore^aedeնqf`o]^fnx{wsyuxtjpngj\U\jki`[izmԽǂȽldl[[agnt~|w{qmknk{j^p`AZ\_kdlƵȳtz\[]chfjjqmfjfa^Zdjx\ed;T[fbs{ʛ²Ϲӯb][^acefhgecb]VSWdtetv[\b_^d`Ľνf_]^`bceddecccababhl{uo_\o{i˨{ffbacddeeddcccddd`ejjiggjuuga̼eȠhsftohddefeefgfeccbbc`acac`Zb{þа|gSbmjgeeeefffffddeefc_^^af`gx–ĞuXIn4ifeeddfffffdccccb``d`bRXɶƔo}ĉvz@8]qddccdddeeefecb`_]]\akfaRu~lcz6 dbbccdddcdeecaa`_^_cjeföжǴmczxOVedbbbddabeeaaehjjgde_vťz{Эduucdcdbbbcbceeddefb``\Wbȹ̱÷ok{edefd``dfdflkcbhg`diķo{[orrkvgfegebacdbcghkg]gvöQ̝ĢZ^`q=Bjihgfeecbba_bdewò~¦ƭØ`vvF[iggddb]]bemoʶgƯhzecefcc`YZcjh̽ӾʼϧrzϨ̘ohbcegd_]amdþȴßsΪǽɑ~qkdkiif`^ko˶ѷbθj͞vqgba]Zai»½ƬʓtɐRcmxܦ̩ui\adafƿƺȉƴʩ_gqy׽}{̺ƚöo¶ųʯ}u|Xnɸźƪ|cʾxҰ|}zִƹěɾ²qrķüϥqmcy|Ýxáɰ̀{Ψǡʹźf{y޷sijzzt⟭ĸuv{ײ²Fwwtwrñܫw~vyùٸ{lŭ|zƴ^zإbwn˻vh{»gyzyd`r{iȁиxvxayĔZevlv_zv}|~kgwtvh|vpo|rffmwaVXrm{|yljbm|ѭxvxxͲwpmeenwʾ~ȵr~{lmv̴zzvg}}VŨˑ~mttklxyƍ}elڭgfjjsvpʿtqowĵtmhnr}ʳϣxq}ۺtke`qručۻœxw|poa۴]clkisrzqəpmjhfغotuqs|}w{v|Ķzk|yk_vx{xv~~įǩ~npr~}zrcuy{ŤƬʹzwo|zrtjkrei|{wǝIJrz}zzstyxsv}x}zs|{ʻ֧|jWtv|qg{omvo{rűhr}xzjygv}vefmagoucz{Զs~zvzz~`__}}tʿö|Ǿú׺ùܻ˰˝┷ȺȨü»ğ¼ƿǺӭǶ⽺ȿԵһŤҼĶİ[iṴҽƾ޶™cl[]ǽʿųŶʹϭū~X9xy»ªҫèӳp\Io\ùƸǽ̞ľd7jcjfVĺŻstfnmia}׾ļĶùdQdQutz}orѾ¸̽ğswjZoIzqj`dk\hNVpʴи͖YpUkZDpp\oY]gj}m_yűѤ\QbNr}vk^exo`gjQwblĿ¾ĵWZSmYpl_^QYY\S8R[\XUlbxltk`jefI_YSRWO\MeeCYFWj:d_e{^2Pjwn^Xd[SjlXJUTmx[\sthilS_L[clbWZ]NRRKf-Y`2oBB?UxrP`^?rh^ZQP]nMABjaVwgdalautotest-3.0.4/gcore/data/byte_nearest_50pct.vrt0000644003401500001440000000302613614004466022101 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 1.2000000000000000e+02, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -1.2000000000000000e+02 Area Gray byte.tif 1 gdalautotest-3.0.4/gcore/data/pixfun_intensity_c.vrt0000644003401500001440000000105413614004466022322 0ustar rouaultusers Intensity intensity CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/test_rpc.txt0000644003401500001440000000713613614004466020237 0ustar rouaultusersLINE_OFF: +015834.00 pixels SAMP_OFF: +013464.00 pixels LAT_OFF: -42.86070000 degrees LONG_OFF: +147.25880000 degrees HEIGHT_OFF: +0300.000 meters LINE_SCALE: +015834.00 pixels SAMP_SCALE: +013464.00 pixels LAT_SCALE: +00.07150000 degrees LONG_SCALE: +000.08280000 degrees HEIGHT_SCALE: +0970.000 meters LINE_NUM_COEFF_1: -5.396368863150944E-04 LINE_NUM_COEFF_2: +2.627711654471593E-03 LINE_NUM_COEFF_3: -1.002878365030092E+00 LINE_NUM_COEFF_4: -3.403033110765838E-02 LINE_NUM_COEFF_5: +5.236585985386163E-03 LINE_NUM_COEFF_6: +2.100573285690368E-03 LINE_NUM_COEFF_7: +3.116646954215110E-03 LINE_NUM_COEFF_8: +4.062679628915546E-04 LINE_NUM_COEFF_9: -5.500898738846068E-03 LINE_NUM_COEFF_10: +5.262025538628248E-05 LINE_NUM_COEFF_11: +2.595870786562705E-06 LINE_NUM_COEFF_12: -2.236321986531990E-06 LINE_NUM_COEFF_13: +2.028224523347030E-05 LINE_NUM_COEFF_14: -5.240094084170959E-06 LINE_NUM_COEFF_15: +2.169130236379565E-05 LINE_NUM_COEFF_16: -2.360025540323606E-05 LINE_NUM_COEFF_17: +1.567039324774875E-06 LINE_NUM_COEFF_18: -6.140955761839389E-06 LINE_NUM_COEFF_19: +1.842219178666101E-05 LINE_NUM_COEFF_20: +2.016157744853291E-07 LINE_DEN_COEFF_1: +1.000000000000000E+00 LINE_DEN_COEFF_2: -5.207696939454288E-03 LINE_DEN_COEFF_3: +5.491384701857780E-03 LINE_DEN_COEFF_4: -4.727180074393679E-03 LINE_DEN_COEFF_5: -2.020573655432083E-05 LINE_DEN_COEFF_6: +8.395096049908390E-06 LINE_DEN_COEFF_7: -3.437283172911763E-05 LINE_DEN_COEFF_8: -1.945981417186446E-05 LINE_DEN_COEFF_9: +2.356606160184157E-05 LINE_DEN_COEFF_10: +3.716539248344547E-06 LINE_DEN_COEFF_11: +7.084068533515953E-08 LINE_DEN_COEFF_12: -5.720023734630433E-09 LINE_DEN_COEFF_13: +8.713633855611634E-09 LINE_DEN_COEFF_14: -4.390823433854830E-09 LINE_DEN_COEFF_15: +1.391612952975369E-08 LINE_DEN_COEFF_16: -1.249149641244712E-08 LINE_DEN_COEFF_17: +4.617114319884902E-08 LINE_DEN_COEFF_18: +1.700675693818975E-08 LINE_DEN_COEFF_19: -2.374499913161109E-08 LINE_DEN_COEFF_20: +9.054600849900734E-10 SAMP_NUM_COEFF_1: +1.213864291061065E-03 SAMP_NUM_COEFF_2: +1.004765220558402E+00 SAMP_NUM_COEFF_3: +3.630405784792365E-03 SAMP_NUM_COEFF_4: -3.370205555837898E-02 SAMP_NUM_COEFF_5: +6.658085265327544E-03 SAMP_NUM_COEFF_6: -3.622524618488598E-03 SAMP_NUM_COEFF_7: -2.511746391245581E-04 SAMP_NUM_COEFF_8: -5.232329647398484E-03 SAMP_NUM_COEFF_9: +1.746291301991781E-05 SAMP_NUM_COEFF_10: +1.310497157498372E-04 SAMP_NUM_COEFF_11: -2.802990027621599E-05 SAMP_NUM_COEFF_12: -1.952735465610529E-05 SAMP_NUM_COEFF_13: +2.919770377248328E-05 SAMP_NUM_COEFF_14: +2.787361173742650E-07 SAMP_NUM_COEFF_15: -2.640057594230422E-05 SAMP_NUM_COEFF_16: +7.082777646638441E-08 SAMP_NUM_COEFF_17: +1.122115749459905E-06 SAMP_NUM_COEFF_18: +1.153307732758342E-06 SAMP_NUM_COEFF_19: +7.154634160111926E-07 SAMP_NUM_COEFF_20: -2.427419939623720E-08 SAMP_DEN_COEFF_1: +1.000000000000000E+00 SAMP_DEN_COEFF_2: -5.207696939454288E-03 SAMP_DEN_COEFF_3: +5.491384701857780E-03 SAMP_DEN_COEFF_4: -4.727180074393679E-03 SAMP_DEN_COEFF_5: -2.020573655432083E-05 SAMP_DEN_COEFF_6: +8.395096049908390E-06 SAMP_DEN_COEFF_7: -3.437283172911763E-05 SAMP_DEN_COEFF_8: -1.945981417186446E-05 SAMP_DEN_COEFF_9: +2.356606160184157E-05 SAMP_DEN_COEFF_10: +3.716539248344547E-06 SAMP_DEN_COEFF_11: +7.084068533515953E-08 SAMP_DEN_COEFF_12: -5.720023734630433E-09 SAMP_DEN_COEFF_13: +8.713633855611634E-09 SAMP_DEN_COEFF_14: -4.390823433854830E-09 SAMP_DEN_COEFF_15: +1.391612952975369E-08 SAMP_DEN_COEFF_16: -1.249149641244712E-08 SAMP_DEN_COEFF_17: +4.617114319884902E-08 SAMP_DEN_COEFF_18: +1.700675693818975E-08 SAMP_DEN_COEFF_19: -2.374499913161109E-08 SAMP_DEN_COEFF_20: +9.054600849900734E-10 ERR_BIAS: 0000.31 meters ERR_RAND: 0000.25 meters gdalautotest-3.0.4/gcore/data/classictiff_one_block_byte.tif0000644003401500001440000000063613614004466023705 0ustar rouaultusersII* BCDESsgdalautotest-3.0.4/gcore/data/huge-implied-number-strips.tif0000644003401500001440000000020013614004466023521 0ustar rouaultusersII*.2. gdalautotest-3.0.4/gcore/data/test3_with_mask_1bit.tif0000644003401500001440000000325013614004466022377 0ustar rouaultusersII* NST ZSgdalautotest-3.0.4/gcore/data/md_ls_b1.tif0000644003401500001440000001265013614004466020034 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/pixfun_conj_c.vrt0000644003401500001440000000104413614004466021224 0ustar rouaultusers conjugate conj CInt16 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/pixfun_phase_c.vrt0000644003401500001440000000104413614004466021373 0ustar rouaultusers Phase phase CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/toomanyblocks.tif0000644003401500001440000000023613614004466021235 0ustar rouaultusersII* ``BCDESgdalautotest-3.0.4/gcore/data/leak-ZIPSetupDecode.tif0000644003401500001440000000057313614004466022056 0ustar rouaultusersII*r =S   VN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|xcgdalautotest-3.0.4/gcore/data/GTModelTypeGeoKey_only.tif0000644003401500001440000000107613614004466022656 0ustar rouaultusersII*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{skkkkksck S.gdalautotest-3.0.4/gcore/data/float32.hdr0000644003401500001440000000036313614004466017617 0ustar rouaultusersENVI samples = 20 lines = 20 bands = 1 header offset = 0 file type = ENVI Standard data type = 4 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/block_width_above_32bit.tif0000644003401500001440000000023613614004466023021 0ustar rouaultusersII* BCDESgdalautotest-3.0.4/gcore/data/int16_2.hdf0000644003401500001440000001061613614004466017515 0ustar rouaultusers j\    < &! G K< !j    2 7 ;; vI F  < U8NCSA HDF Version 4.1 Release 4, December 2000k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 int16_2.tifCDF0.0gdalautotest-3.0.4/gcore/data/small_ov.rrd0000644003401500001440000003121213614004466020170 0ustar rouaultusersEHFA_HEADER_TAG0&{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.v10Z;DependentFileEimg_DependentFile bsmall.imgW01BRasterDMSEdms_State +WW kkk{kkccssk{{skck{{c{s{֥sεֵŽ޵s{kss{ccZss{{kk{{s{ŜֽΔޥss΄ssksk{scssckks{{s{kc{ֵŔc{{skkcksccZ{sŽ֥֥ޥŵ{{s{ccssJssss{{{sRε֜c{s{{{sk{{cc{s{k歭֔ޭc{{kskZkss{ssέޥŔΜkkcss{sc{ck{s{έ֜έ޵Ō歜kcZcccsZ{ks΄ތŔޥťťskkRcŵΥ挌{ޜ΄{εޜޥ{ZskZkcŵ攭ťŜޭޔބccsťΥΜޭֵ歜c{{k{c札΄{΄Υεss{Ŝޭ{{Žŵֵs֌νŜ֜Žε޵Δ{֭浥Rkޥs{{kcc֥֜ks{kc{{Ōք潭νkŵ挄k{skc{ŔZŽ֌εŵΔk省ֵ歽֔{{{k挽޽ޭ{s{{ތ{sss{kksޭ֭ﵜsckk{ss{Ŝc{ޥŌ޵ŵs{sk{s{kskZޔތޥŔΔťcZc{kc{ckR{ss֔νJJRkRssֵkkΜֽֽ{BkZJZ{s{{{ss{ޭs޵νŔZcZ:RsRcZ{kk{Ōތ{֜έﵽ{ބks1ZRBBcsscs籠Zֽ1kޥŽ{έŔcJ{JRRJBkBcBJk{ńsֵ楔c|Ž{Υťscs{ť{֌skk{{sޭs凜ΜΔŽ֌޽ŽŽέ{֭ތν޽k{kŌŜ10Ehfa_LayerEhfa_Layer0{4096:cdata,}RasterDMS,.rootroot01Layer_1Eimg_Layerv1v2_ss_2_Eimg_Layer_SubSampleF @@gdalautotest-3.0.4/gcore/data/byte.pnm.aux.xml0000644003401500001440000000034513614005321020707 0ustar rouaultusers Value red value gdalautotest-3.0.4/gcore/data/int32.img0000644003401500001440000002574013614004466017311 0ustar rouaultusersEHFA_HEADER_TAG@RG rootrootXAAG R9RLayer_148752478Eimg_LayerXAAEhfa_Layer52478Ehfa_LayerXAA0 n0Statistics52478Esta_StatisticsrsXAAR@o@)\_@^@`@@X) 6@Z<StatisticsParametersEimg_StatisticsParameters830XAAKK  KK9Descriptor_TableersEdsc_TableticsParameters830XAAVZb#Bin_Function#eersEdsc_BinFunctionrameters830XAAR@o@oL?@B@L@O@P@R@?@8@(@@(@@@?@??{400:ldata,}RasterDMS,.R IMGFormatInfo78ImgFormatInfo831XAA@k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckf4RasterDMS52478Edms_StateXAA @XAACcMap_Info52478Eprj_MapInfoXAAKUTMWALAoALAN@N@meters&Projection52478Eprj_ProParametersXAA4<UTM L? Clarke 1866TXA333?XA^s{?fOMXA+Datumtion52478Eprj_DatumametersXAANAD27 nadcon.datZ+Histogramion#eersEdsc_Columntionrameters830XAAZZHistogramParametersEimg_StatisticsParameters830XAA R@o@ } erType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.gdalautotest-3.0.4/gcore/data/byte_nogeoref.tab0000644003401500001440000000053613614004466021167 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table File "HP.TIF" Type "RASTER" (400000,1200000) (0,4000) Label "Pt 1", (500000,1200000) (4000,4000) Label "Pt 2", (500000,1300000) (4000,0) Label "Pt 3", (400000,1300000) (0,0) Label "Pt 4" CoordSys Earth Projection 8, 79, "m", -2, 49, 0.9996012717, 400000, -100000 Units "m" gdalautotest-3.0.4/gcore/data/tiff_dos_strip_chop.tif0000644003401500001440000000017213614004466022377 0ustar rouaultusersII* @@gdalautotest-3.0.4/gcore/data/minfloat_nodata_slightly_out_of_float.vrt0000644003401500001440000000062413614004466026221 0ustar rouaultusers -3.402823466385289e+38 Gray minfloat.tif 1 -3.402823466385289e+38 gdalautotest-3.0.4/gcore/data/cfloat32.tif0000644003401500001440000000672013614004466017772 0ustar rouaultusersII* BBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBB@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gcore/data/utf8.zip0000644003401500001440000000050613614004466017257 0ustar rouaultusersPK [U7D абвгдеUT RRux PK [U7D жзийклUT RRux PK [U7D абвгдеUTRux PK [U7D FжзийклUTRux PKgdalautotest-3.0.4/gcore/data/contig_tiled.tif0000644003401500001440000000540013614004466021013 0ustar rouaultusersMM* p  !"  !"#  !"#$  !"#$%  !"#$%&  !"#$%&'  !"#$%&'(  !"#$%&'()  !"#$%&'()*  !"#$%&'()*+  !"#$%&'()*+,  !"#$%&'()*+,-  !"#$%&'()*+,-.  !"#$%&'()*+,-./ !"#$%&'()*+,-./0 !"#$%&'()*+,-./01 !"#$%&'()*+,-./012 !"#$%&'()*+,-./0123 !"#$%&'()*+,-./01234 !"#$%&'()*+,-./012345 !"#$%&'()*+,-./0123456 !"#$%&'()*+,-./01234567 !"#$%&'()*+,-./012345678 !"#$%&'()*+,-./0123456789 !"#$%&'()*+,-./0123456789: !"#$%&'()*+,-./0123456789:; !"#$%&'()*+,-./0123456789:;< !"#$%&'()*+,-./0123456789:;<= !"#$%&'()*+,-./0123456789:;<=> !"#$%&'()*+,-./0123456789:;<=>? !"#$%&'()*+,-./0123456789:;<=>?@ !"#$%&'()*+,-./0123456789:;<=>?@A !"#$%&'()*+,-./0123456789:;<=>?@AB!"#$%&'()*+,-./0123456789:;<=>?@ABC"#$%&'()*+,-./0123456789:;<=>?@ABCD#$%&'()*+,-./0123456789:;<=>?@ABCDE$%&'()*+,-./0123456789:;<=>?@ABCDEF #% B@C@DE hgdalautotest-3.0.4/gcore/data/corrupted_gtiff_tags.tif0000644003401500001440000000062513614004466022557 0ustar rouaultusersII*S  , v@@@A̞LA #  )#mtr@@TXAWGS 84|NAVD88 height|sgdalautotest-3.0.4/gcore/data/cielab.tif0000644003401500001440000000024113614004466017564 0ustar rouaultusersII* Szgdalautotest-3.0.4/gcore/data/zoom_in.vrt0000644003401500001440000000124513614004466020055 0ustar rouaultusers byte.tif 1 byte.tif 1 gdalautotest-3.0.4/gcore/data/test_deflate_4GB.tif.zip0000644003401500001440000002723613614004466022262 0ustar rouaultusersPK ON1$-utest_deflate_4GB.tifUT f\f\ux ܽja/HN:nK,TBqsx,.*8 ('!xpon^Va89 09X[deݙ Ͼ5={^=b>xZ{/<{dfg'; \t{>p=:}je~)oƲW!ӕe8tk]|s޲Oς"-"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"-"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"-"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"-"1"-"1"-"1"-"1"-"1"-"1"-"1"-"1"-"1"-"1_wfwo/meW?yxe٧{p z *VPK ON1$-utest_deflate_4GB.tifUTf\ux PKZ..gdalautotest-3.0.4/gcore/data/int16.vrt0000644003401500001440000000234713614004466017350 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray int16.tif 1 gdalautotest-3.0.4/gcore/data/uint32_3.hdf0000644003401500001440000001247313614004466017704 0ustar rouaultusers j\ @ <F!gk<!< !j ) -K [Q 7 ; I gF<=NCSA HDF Version 4.1 Release 4, December 2000k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1fakeDim2Dim0.0 j j j j j   j   3-dimensional Scientific DatasetVar0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0  uint32_3.hdfCDF0.0gdalautotest-3.0.4/gcore/data/many_blocks_truncated.tif0000644003401500001440000000024713614004466022725 0ustar rouaultusersII* =Sx+ttgdalautotest-3.0.4/gcore/data/md_dg.IMD0000644003401500001440000000234113614004466017251 0ustar rouaultusersversion = "24.06"; generationTime = 2015-01-01T00:00:00.000000Z; productOrderId = "000000000_00_0000"; productCatalogId = "00000000000000000"; imageDescriptor = "ORStandard2A"; bandId = "Multi"; panSharpenAlgorithm = "None"; numRows = 50; numColumns = 50; productLevel = "LV2A"; productType = "Standard"; numberOfLooks = 1; radiometricLevel = "Corrected"; radiometricEnhancement = "Off"; bitsPerPixel = 16; compressionType = "None"; outputFormat = "GeoTIFF"; BEGIN_GROUP = IMAGE_1 satId = "WV03"; mode = "FullSwath"; scanDirection = "Forward"; CatId = "00000000000000000"; firstLineTime = 2010-04-01T12:00:00.000000Z; avgLineRate = 5000.01; exposureDuration = 0.00020000; minCollectedRowGSD = 1.315; maxCollectedRowGSD = 1.315; meanCollectedRowGSD = 1.315; minCollectedColGSD = 1.286; maxCollectedColGSD = 1.287; meanCollectedColGSD = 1.286; meanCollectedGSD = 1.301; cloudCover = 0.027; resamplingKernel = "MTF"; positionKnowledgeSrc = "R"; attitudeKnowledgeSrc = "R"; revNumber = 337; END_GROUP = IMAGE_1 BEGIN_GROUP = MAP_PROJECTED_PRODUCT earliestAcqTime = 2015-01-01T00:00:00.000000Z; latestAcqTime = 2015-01-01T00:00:00.000000Z; datumName = "WE"; numGCP = 0; END_GROUP = MAP_PROJECTED_PRODUCT END; gdalautotest-3.0.4/gcore/data/bigtiff_one_strip_be_long8.tif0000644003401500001440000000037513614004466023626 0ustar rouaultusersMM+ Ssgdalautotest-3.0.4/gcore/data/rgbsmall.tif0000644003401500001440000001265013614004466020157 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gcore/data/classictiff_two_strip_short.tif0000644003401500001440000000024413614004466024173 0ustar rouaultusersII* Sstgdalautotest-3.0.4/gcore/data/negative_scaley.tif0000644003401500001440000000054713614004466021520 0ustar rouaultusersII*fS   JN@N@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kgdalautotest-3.0.4/gcore/data/test_with_mask_8bit.tif0000644003401500001440000000214013614004466022320 0ustar rouaultusersII* S .Sgdalautotest-3.0.4/gcore/data/tar_with_star_base256_fields.tar0000644003401500001440000000100013614004466023772 0ustar rouaultuserscb_2014_us_state_20m/0000755c0000000000013306531125014675 5ustar simon.evesmapdgdalautotest-3.0.4/gcore/data/bigtiff_one_block_be_long8.tif0000644003401500001440000000102013614004466023543 0ustar rouaultusersMM+ BCDESsgdalautotest-3.0.4/gcore/data/image_width_above_32bit.tif0000644003401500001440000000022213614004466023004 0ustar rouaultusersII* Sgdalautotest-3.0.4/gcore/data/byte_nogeoref.tif0000644003401500001440000000104213614004466021174 0ustar rouaultusersII* Sk{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.0.4/gcore/data/cfloat64.raw0000644003401500001440000001440013614004466020000 0ustar rouaultusersZ@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@gdalautotest-3.0.4/gcore/data/test_mosaic.vrt0000644003401500001440000000126213614004466020714 0ustar rouaultusers Red test_mosaic1.vrt 1 test_mosaic2.vrt 1 gdalautotest-3.0.4/gcore/data/byte_ovr_jpeg_tablesmode2.tif0000644003401500001440000000402713614004466023472 0ustar rouaultusersII*S[   2N }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|  BCDE;S[ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzC    $.' ",#(7),01444'9=82<.342 ?IY"# sץHQ,7x?w'ʏ>Oo|?*Oo|?*ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q gdalautotest-3.0.4/gcore/data/byte.tgz0000644003401500001440000000106413614004466017336 0ustar rouaultusersʂK퓿Q&" VZh6͉vNppy+D-"eJ3,r9Y+泼df}w7y;\>{b1fN=F^c7`h:Yz&C^45ד?lo_3c xq1FFœ0 ̄QpQ8p(`Ia} ދT8%l~ŢOz#d-b2.+`yXUӪ`cǺE e|m.9^1+e(2í&sE}I[QN1[0 )ak_&HY=;ϋP\ugI/ƜJjycjjgfVߨ\X|̽Z~}46y'm9/Yl ֨[ǣqiϷGd1NCSA HDF Version 4.1 Release 4, December 2000BBCBCCC CCCBCBCCBBBCCBCBBCBC%BC BBBBCBCCCBCBCC CBBC BC BCBBCCBBBBBCCBBBCCBBBBBBBCBBC BCCCCC CCBBBBCBC%BCBBCCBC=C-C-CCBCBBCBCCBBBCCCNBCEC-CC C CBCBBC CCBCBCC-BBCBCBCBC BBBCBBBBBBC5BBBBCBBCBCCBBCBBBBCBBBC C BC BBBBCBBBBBCBBBCCCCCBBCBBCBBBC C-BBBBBBBBBBC BBBBBBC-BBBBBCBBC-CBBBBBBBC=C-BBBBBC BC-C CCCBBBBBBCBC BCBBCBCC C BC BBBBBBBBBBBBCBCBCC%CCBBBBBC BBBBBBCBBBBC=C-C C C%BCBBBBBBBBCBBCCCC5C C-BCBBBBBBBC CCC%C C BC-CwCCNCBC BCCC%C%CC CBBBBBC5C5CCCCCC5CCBCBBBBBBBBValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1fakeDim2Dim0.0 j j j j j   j   3-dimensional Scientific DatasetVar0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0  float32_3.hdfCDF0.0gdalautotest-3.0.4/gcore/data/bigtiff_one_strip_be_long.tif0000644003401500001440000000037513614004466023536 0ustar rouaultusersMM+ Ssgdalautotest-3.0.4/gcore/data/byte_truncated.tif0000644003401500001440000000056613614004466021373 0ustar rouaultusersII* S   Zv>N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/gcore/data/bug_gh_1439_update_lzw.tif0000644003401500001440000002303313614004466022522 0ustar rouaultusersII* }%=S4tĶKIMvC7pa =M.X(PA#%1h#@RB8MH}TU&)b;@%ѨPpKT"F)14N:Rp";tZ'Dt^fd@Og?KPp4nTj%D`h# XBg⍀H G00Q9t7- `#&Z!]`dj@ 0:-R@Ija *^8gi jep9@<&|`dAXt#XbZst5:FI!1%9@;ɤ@d{Z^ v d{&fx Hf|"NC9dhN8U: U&hBNL_ 7 CA.ũ`!!AB$G*oCH&GcvZDF1Ap.@ (R&.eBX8 +BXIBe(j\30k GZQh2I 7@ZI vda(4; Pn v 81b0y'`?!NYDx,AyZ@XAg9EVq:_ $AI aٔeYX" b~9D([Qp%ALj!0 a 0I 栜  k :q# ]`Nn GN'PZ CjAѲ'q!&P4AVt>P1bxZ@Chs0f1LRhPi6X@6\3P%M#@8 ?0#na@P[= ĀU kC,%4a y؍.j&&#<`|*P@@$px0EHY1x p,?; kC0! Cth]*C]a  `P *C`KBȵTdf<g \-(c/p'D|J&M`X<qX8A a7DPt1y`sT ȼ0M7!.)( 0 ^@HCPX @ld6 `t;ph hN `02 |Ða @0¸t~ XbTD8EB(a<&@aQT$@`UE1/_J18ň}dh!hHP<Ő C(V ,CȚh5hAp @3CBJ@ k_$,À>B ^р5G >!Đhm @EjK Ǩ!l9P<@h|, c:B #MF0`p<в'h#~opx%8_`L  Ar\V'p!`@t? B`xdA0h?q` `aP@V(v| 0#ByA$*vckl2FaX!r+$`,U!I7h1&G`0UF~TVB5 #IAB? f`)adF:.E <$X<-\9`:Wag!P# p#&f qD ,m!@fV5`@H1x!8e`@4CV$  NŨHc0%` ".aP ~ 0vQN)0>8cCfp"wqacdPZH(b\ pA/@g`<+8Pi7U c<<X@YP$@Wf7E"B;x9@@H4@oQP hJJ02 azpn@v1`p@w@7Aj& \B1&"HHh @m$Lb>LE@H",H1HxH\a&jQ,) >A<A@  !d& Z N z A! !`.!: AHb 8! A  ! . `d R@T @Y(\r!  AzL `  ! AZ!(` 2 rB ``V$ `@ & P@ @:\AX$A$A\ ! d\ F!!DBa TaFA l & `X| a F*A@ D ap@h !0@T@ @p !` !!|,A a !r% ͢Aa\ AhrAb@ z|V dalA@p X ` A2A$ B@4p@!N!p!<LL(@"! aV !~  t_Ap a,@tA`!!p`0$Af AAH$!!  AAD`T ! .@`A^ Ѩ(@P!z.!8 *HaA`$Ap@n Ta^d!xR`    F A !Z a!!:A&avJ`@6@ F @!!n A> !<@nA@N   @`za&  J!v< L`Z:H`l&ATaX 4@Z! @P`a0`x` ~@l `  aP L!r @a>(\`!` aaDa \d`a @(``D! 2!R o` ~`l`TK@@TA @A  A ZX a@`!| d! bP ~0 @ Z@ dZ!vAZTDv!@af7A|t!P q a< `*j ! @h!A jLA!@ `DA@UL!H@ H `AtP aXa! `aT @4 `aJ22^ap @x` !`A n!A2`& @`ANPJ`A $j>B!A$Fr T P &< `jhXtPZ@(@@V@f6ova,az, ~nL!l@ `H<  ,`! P!$!X`6>` l /&h@ @  4zMA0@`n A0 Fp^ Ar@д`68AAaH,> `B@!@J`&  !a\^ d>!X `SN!Bat !6D`l !a." l @d@a`A^f0a2 A>Z :`r!b p4 ~.d ij J>A!@!`Ar᧾$@xz` ! .n8 a0 2aD!ha&˺  <R @ A`@t>a  \! A @ ~!`jA @  @!a<`>@AL!X b `a`! d |``a.D l 4 ar  aX n lL(`h!N`6wuj8 ` ] H ˡ@ ()>t4:A*cBb}$ bXpB˂PΧ[@!"cJD a7IkpZlBI)HP0$P]7R:|yO@I'zI 1|<f hhh0 D>rṪ@p`y!+ BE1[|s2VGB،,Gxz04\$Il&xU Ry :*r\@ H<'ZJ dq E`TG'p @e}dd H#hfE2} FtxHGAJG8$N0*@$v% Q>:#pW0xB9U1&.' !$}B*EA bn- Qd%&)LIA ! C"Q: 88'APe9$cJU.#&q"Jdb1Z|GTkX<3p"R [z~f0`F! k|c ,Pz_ LY|XAIji[xXTqDL%G#h'ak ( $CdYdayHGq`SdHM#yp `I"~xB`"d(wf8 c)h7x )4z0/)K.d =t "H %@  .bDC G،PG")EsA` @!u QR1$Hz ` 6AM:8WscLf 0,"`7$D @ @P!l>(G@y`bY@! y @\8 8T&P0ln BtC|8"H, @|'aB|Dj bplz > JXxc |8C(A6*x\,GL'1ƀa$shCv@0Ɛ   5)f\cu j4(<bgV Fcqv&@`H@@t0(F1Zh4`2D` `V ,4hl p a C0ZQ LzA>X t\`0d cR`l4`H1€@ip"E`Fp"+`o@&%Q `p>1.G`5,њAðvf ,=Gv| bD q )HE|lAHC@a|"F`r2ŀ1B#>*A> Q &@ aO(" Bt2 b\lncpz)c."v02Al 4%qBP  Pp-H44 0$(1 0a\-BxS+@B(D ' g & A b}(h„@@ !MXoq/$yоa)A\FE $42!pt,H  ж [NipN,B `pBBà$H 7Gh;09Mr(Ő@~ @:A\A "`60S`t``; "F:,bj ]Q3Ъh0`a: C`P!YHc_ PO@X8fH.28Pc 3p5`00QP(8J^$vx tp)p(Hf8J oLR|Li#V pAps>`T`H0n|Nh}`4HtNhx7=D[,.Jx]_( Xr?Qz#4syy@s! h08m cP "(=#"% :(51nit m0`O Ehy}-s`BxMJ(k( (C`ach4H/Pv6^f8pH`Gj2,tR,\8k gaXuH}H2PBh5S @sx F'(0$>0~ 4P`VOPBtxW`w`8`Pp`XhByx>5Cl@Ux9xtp@ZLIUpI @T`KD7tQvx4`.YXV P$dUhZXWrP(8&s@L[xRAz0L0C8W\z C: ^2p.< ? Y^-Bnh.xPPGQ('Nhu D p@hJ(/ H_pKPP?hcx~8\ 00Po/xtMh_`8R=O` 82 ;,c@d,ejx8M,0C΀*(x^hY$,10i/hF=8LOX@g 8RX!ŸH4@6D`Kph_$! #pW% ,@%xSń~Re.Se>TeNUe^VenWe~XeYeZe[e\e]e^e_e`fafbf.cf>dfNef^ffngf~hfiegdalautotest-3.0.4/gcore/data/float64_2.hdf0000644003401500001440000001536013614004466020034 0ustar rouaultusers j\ FJ<!<!j " 22 d7 ; I F e y< :NCSA HDF Version 4.1 Release 4, December 2000@Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@ZValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0@jjjjjBand0Var0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0 float64_2.hdfCDF0.0gdalautotest-3.0.4/gcore/data/utmsmall.hdr0000644003401500001440000000036513614004466020205 0ustar rouaultusersENVI samples = 100 lines = 100 bands = 1 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1} gdalautotest-3.0.4/gcore/data/eofloop_valid_huff.tif.zip0000644003401500001440000000207013614004466023002 0ustar rouaultusersPKuJljvSeofloop_valid_huff.tifUT ^NYTYux KlTUs;3Bӡ0FRA`U҄؂DT DyDН . RD)_@xK&dذr}{Ͻֺ!%BOax<EoW"?ī8?Lsϳs`M2oM$I?oM$I?@I@#WGS 84|gdalautotest-3.0.4/gcore/data/vrtmisc16_tile2.tif0000644003401500001440000001002213614004466021300 0ustar rouaultusersII*}88=@S   . 0L k  % D c  < [ z  4 S r , K j $Cb;Zy33??ަ?^?$~A333SLA# e )#WGS 84 / UTM zone 13N|WGS 84|x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x1 àԿ4x  igdalautotest-3.0.4/gcore/data/test_nodatavalues.tif0000644003401500001440000000131113614004466022071 0ustar rouaultusersII*B222=SJ0 0 0 0 x1ðIIP;$W^9$R3*22 26=S0 DEFLATE PIXEL 0 0 0 gdalautotest-3.0.4/gcore/data/seperate_strip.tif0000644003401500001440000001010013614004466021371 0ustar rouaultusersMM*"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF"  !""  !"#"  !"#$"  !"#$%"  !"#$%&"  !"#$%&'"  !"#$%&'("  !"#$%&'()"  !"#$%&'()*"  !"#$%&'()*+"  !"#$%&'()*+,"  !"#$%&'()*+,-"  !"#$%&'()*+,-."  !"#$%&'()*+,-./" !"#$%&'()*+,-./0" !"#$%&'()*+,-./01" !"#$%&'()*+,-./012" !"#$%&'()*+,-./0123" !"#$%&'()*+,-./01234" !"#$%&'()*+,-./012345" !"#$%&'()*+,-./0123456" !"#$%&'()*+,-./01234567" !"#$%&'()*+,-./012345678" !"#$%&'()*+,-./0123456789" !"#$%&'()*+,-./0123456789:" !"#$%&'()*+,-./0123456789:;" !"#$%&'()*+,-./0123456789:;<" !"#$%&'()*+,-./0123456789:;<=" !"#$%&'()*+,-./0123456789:;<=>" !"#$%&'()*+,-./0123456789:;<=>?" !"#$%&'()*+,-./0123456789:;<=>?@" !"#$%&'()*+,-./0123456789:;<=>?@A" !"#$%&'()*+,-./0123456789:;<=>?@AB"!"#$%&'()*+,-./0123456789:;<=>?@ABC""#$%&'()*+,-./0123456789:;<=>?@ABCD"#$%&'()*+,-./0123456789:;<=>?@ABCDE"$%&'()*+,-./0123456789:;<=>?@ABCDEF #%"((4< p444gdalautotest-3.0.4/gcore/data/tif_jpeg_too_big_last_stripe.tif0000644003401500001440000000143213614004466024252 0ustar rouaultusersII*S[I ( @ pC    $.' ",#(7),01444'9=82<.342N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27| (!1AQq"ab?k1JuQa؍~~팕* +rK(r ;f8<͊zp"ea 0# $dvOTAeϹ %1A!"BQaq?Aĭ_\)I-$U ts5Ö^ cgdalautotest-3.0.4/gcore/data/byte_zip64_local_header_zeroed.zip0000644003401500001440000000107413614004466024423 0ustar rouaultusersPK-C-Ͷbyte.tif|Q=A]E 431;t?8 *` :i&l 749C}cb757=&%V3736V)YtJQpSDX8*`d4hNيjY2Ή#fwдHV`9 - # T`@3^QҋpX+cŴ):īʐ"9n0oaȺ\2DaUYUN%iQ.pz^׹MYRJoq㱄zJ8ǤfG|1Lpέ {γqOG)}i~ m9N_O| w-_?n#}}<5kWR\fGv~jw,<ݟxd훗PKC-Ͷbyte.tifPK6gdalautotest-3.0.4/gcore/data/22281.aux0000644003401500001440000005432013614004466017045 0ustar rouaultusersEHFA_HEADER_TAG@RLrootroot!AdRRDependentFileEimg_DependentFile!A Z22281.tif^ R0 Band_1467904135Eimg_LayerentFile!A Layer_1 ^ |DependentLayerNameEimg_DependentLayerName!ALayer_2^ RE@ Band_3467904135Eimg_LayerentFile!AL*.(Ehfa_Layer04135Ehfa_LayerentFile!A{262144:Cdata,}RasterDMS,. |BDependentLayerNameEimg_DependentLayerName!AJLayer_3 dEimg_NonInitializedValueEimg_NonInitializedValue!A9 ^ gEimg_NonInitializedValueEimg_NonInitializedValue!Ao7Eimg_NonInitializedValueEimg_NonInitializedValue!ARdMap_InfonitializedValueEprj_MapInfoalizedValue+A'Transverse Mercator (South Orientated)$!Ỷ@HgpEA$!Y|.@HgSeEA??meters d`ProjectiontializedValueEprj_ProParametersValue+AG'Transverse Mercator (South Orientated)?[n u?(0Clarke 1880 ArcGITXAcٽ?XA 9{?JtMXAYDatumtiontializedValueEprj_DatumametersValue+ACape-1a[@r9 n^ Map_InfonitializedValueEprj_MapInfoalizedValue+A Cape-1 a[@r _L*.! dEhfa_Layer04135Ehfa_LayerentFile!A{262144:Cdata,}RasterDMS,.D RdDependentLayerNameEimg_DependentLayerName!AdR Band_2467904135Eimg_LayerentFile!AL*.S%^ r Ehfa_Layer04135Ehfa_LayerentFile!Az {262144:Cdata,}RasterDMS,.2d  Descriptor_TableedValueEdsc_TableametersValue@0A #Bin_Function#eedValueEdsc_BinFunctionsValue@0A(@n@  Histogramion#eedValueEdsc_ColumntionsValue@0A dSHistogramParametersalueEimg_StatisticsParameters830@0A(@n@2d0StatisticsrametersalueEsta_Statisticsarameters830@0A(@n@2B+]@^@_@h-V8@d5SStatisticsParameterslueEimg_StatisticsParameters830@0A(@n@n4^ ( Descriptor_TableedValueEdsc_TableametersValue@0A#Bin_Function#eedValueEdsc_BinFunctionsValue@0A(@o@&Histogramion#eedValueEdsc_ColumntionsValue@0A .^ SHistogramParametersalueEimg_StatisticsParameters830@0A(@o@4^ 0StatisticsrametersalueEsta_Statisticsarameters830@0A(@o@8wڃ\@\@@\@AhC$9@^ 7SStatisticsParameterslueEimg_StatisticsParameters830@0A(@o@^@n@6,*,{1:bcovariance,}Esta_Covariance,.'Transverse Mercator (South Orientated)$!Ỷ@HgpEA7$!Y|.@HgSeEAO??gmeters9 ^ ProjectiontializedValueEprj_ProParametersValue+AG'Transverse Mercator (South Orientated)7?[n u?Clarke 1880 ArcGITXAcٽ?XA 9{?JtMXAn YDatumtiontializedValueEprj_DatumametersValue+A|=Map_InfonitializedValueEprj_MapInfoalizedValue+A'Transverse Mercator (South Orientated)$!Ỷ@HgpEA$!Y|.@HgSeEA??6meters75ProjectiontializedValueEprj_ProParametersValue+AG'Transverse Mercator (South Orientated)?[n u?NVClarke 1880 ArcGITXAcٽ?XA 9{?JtMXA=YDatumtiontializedValueEprj_DatumametersValue+ACape-1a[@r_@??@ @$@=@F@U@^@c@0q@w@x@@@@@x@l@@0@@U@ @@7@1@@@a@@F@@`@@@@P@@@@d@@@p@@AXA8bA`EA A A0kA(|AXAlXAxA3A8A5AA7AA1A[ A!A!A,"AL4#A.#AJ$AlR%A&A֯&Ah'A+(A(AԤ)Ag*AG+A$,A-Ab.Av.A./A0A 1A1A~02A2Aya3A2 4A4AG5A5A6A57Aw7A8AR9Aؾ9A[:A:A6;A1.Au>A?Aq?A?A@At!@A3@AH@A;F@AO@A(D@A@@A#@A{ @A?Al?AG ?A>Ah=A;Y=ARAN>Az>Aݦ>A7>A>A%>A >AT>A^>A.>Ai=A=AhY=A-)Av'A\&A$Ap#A!A&o AA(WAAAPApAؿA@- AAAAL@P@p@@ @`@@:@@@W@@@@@@@$@@@@@ֽ@@@Ӵ@}@@@@x@T@@@@@؂@z@0v@n@`h@@d@X@@T@D@D@1@"@*@@@@@@?@??@??@??=>*6Descriptor_TableedValueEdsc_TableametersValue@0AB>5#Bin_Function#eedValueEdsc_BinFunctionsValue@0A@@@@@@(@.@9@B@J@S@``@g@t@w@(@@(@$@@Σ@Ψ@H@U@@@x@@@ @h@@@B@ @ &@v@@@`@R@@@ @@A(AHjAHAX A AxqA AHAADA[A0A8AAFg AM!A>"A!#A$Ap %A%A&A'A@(A*A:+A,A-A9/A\0A.1A 2A2A3AR5A-6Aa7A8A9A*;AvrAf?Au@A@AQ6AA#zAA֟AAAA7AAqAAhAAY1AA@A@AV@A?AP?A)>A|=Az[=Awb(Ab&A$A#A[!AHBAtGAASAеA(1A( A A$AhAP@@=@@@\@@@@ @@@@@,@@@@ @d@ @@V@;@@@ڬ@@@Ġ@\@@@@@h@@z@0v@p@`l@c@ c@\@O@O@C@<@0@$@@@@ @?????????????????*65Histogramion#eedValueEdsc_ColumntionsValue@0A5?B?SHistogramParametersalueEimg_StatisticsParameters830@0A@n@>E@@0StatisticsrametersalueEsta_Statisticsarameters830@0A@n@~lY@Y@X@-7@?@SStatisticsParameterslueEimg_StatisticsParameters830@0A@n@ dAzRRDInfoList4135Eimg_RRDInfoListe0A AErdasBino3AA22281.rrd(:Band_1:_ss_2_)A22281.rrd(:Band_1:_ss_4_)A22281.rrd(:Band_1:_ss_8_)!B22281.rrd(:Band_1:_ss_16_)DB22281.rrd(:Band_1:_ss_32_)gB22281.rrd(:Band_1:_ss_64_)B22281.rrd(:Band_1:_ss_128_)B22281.rrd(:Band_1:_ss_256_)B&C IRtT]*.!D dC2RRDNamesList135Eimg_RRDNamesList0A CErdasBino3CC22281.rrd(:Band_1:_ss_2_)C22281.rrd(:Band_1:_ss_4_)C22281.rrd(:Band_1:_ss_8_)D22281.rrd(:Band_1:_ss_16_)>D22281.rrd(:Band_1:_ss_32_)aD22281.rrd(:Band_1:_ss_64_)D22281.rrd(:Band_1:_ss_128_)D22281.rrd(:Band_1:_ss_256_)F ^ DEzRRDInfoList4135Eimg_RRDInfoListe0A LEErdasBino3_EgE22281.rrd(:Band_2:_ss_2_)E22281.rrd(:Band_2:_ss_4_)E22281.rrd(:Band_2:_ss_8_)E22281.rrd(:Band_2:_ss_16_)E22281.rrd(:Band_2:_ss_32_)F22281.rrd(:Band_2:_ss_64_)6F22281.rrd(:Band_2:_ss_128_)ZF22281.rrd(:Band_2:_ss_256_)~F&C IRtT]*.S% ^ >G2RRDNamesList135Eimg_RRDNamesList0A FGErdasBino3YGaG22281.rrd(:Band_2:_ss_2_)G22281.rrd(:Band_2:_ss_4_)G22281.rrd(:Band_2:_ss_8_)G22281.rrd(:Band_2:_ss_16_)G22281.rrd(:Band_2:_ss_32_) H22281.rrd(:Band_2:_ss_64_)0H22281.rrd(:Band_2:_ss_128_)TH22281.rrd(:Band_2:_ss_256_)jJ HzRRDInfoList4135Eimg_RRDInfoListe0A HErdasBino3 II22281.rrd(:Band_3:_ss_2_)5I22281.rrd(:Band_3:_ss_4_)WI22281.rrd(:Band_3:_ss_8_)yI22281.rrd(:Band_3:_ss_16_)I22281.rrd(:Band_3:_ss_32_)I22281.rrd(:Band_3:_ss_64_)I22281.rrd(:Band_3:_ss_128_)J22281.rrd(:Band_3:_ss_256_)*J&C IRtT]*.( J2RRDNamesList135Eimg_RRDNamesList0A JErdasBino3K K22281.rrd(:Band_3:_ss_2_)/K22281.rrd(:Band_3:_ss_4_)QK22281.rrd(:Band_3:_ss_8_)sK22281.rrd(:Band_3:_ss_16_)K22281.rrd(:Band_3:_ss_32_)K22281.rrd(:Band_3:_ss_64_)K22281.rrd(:Band_3:_ss_128_)L22281.rrd(:Band_3:_ss_256_){1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:oEmif_String,algorithm,0:poEmif_String,nameList,0:pLdimList,}Eimg_RRDInfoList,.gdalautotest-3.0.4/gcore/data/nan32_nodata_nan_to_zero.vrt0000644003401500001440000000310513614004466023244 0ustar rouaultusers 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] 4.0000000000000000e+05, 1.0000000000000000e+00, 0.0000000000000000e+00, 5.0000000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+00 Area 0 Gray nan32_nodata.tif 1 nan gdalautotest-3.0.4/gcore/data/byte_rpc.tif0000644003401500001440000000241613614004466020162 0ustar rouaultusersII* ~S \@L@gj+nEHhb@r@@L@M?Q|a2?P@EcͮAe?:/ [nll~Xru?85a?i?/1 :?EBv:5 ?>Ήw¾GyD>HoվVź>ܿ3%raJ>پAa+Q> lw>?ЭTuD["~v?0&\s$ɠ/6$7>"vSqM?gӤl>]/5-> "s>E(;8J={^B>*}2yM>Y EJlxh> BR>C~Yb+ق>PS?N'?-Cm?TeA:'E{?e}muQv0iz~nu$N>O>=?|L-!?2w8dnyo첝>"ڕh> ٮӔk?s>%rPsӲ>X7CkY>ط>H%lpZ?ЭTuD["~v?0&\s$ɠ/6$7>"vSqM?gӤl>]/5-> "s>E(;8J={^B>*}2yM>Y EJlxh> BR>C~Yb+ق>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{skkkkksckgdalautotest-3.0.4/gcore/data/pixfun_diff_c.vrt0000644003401500001440000000135713614004466021212 0ustar rouaultusers Difference diff cint_sar.tif 1 cfloat64.tif 1 gdalautotest-3.0.4/gcore/data/nan32_nodata_warp.vrt0000644003401500001440000000441113614004466021701 0ustar rouaultusers 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] 4.0000000000000000e+05, 1.0000000000000000e+00, 0.0000000000000000e+00, 5.0000000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+00 nan 512 128 6.71089e+07 NearestNeighbour Float32 nan32_nodata.tif 0.125 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 nan 0 nan 0 gdalautotest-3.0.4/gcore/data/ycbcr_42_lzw.tif0000644003401500001440000000406213614004466020655 0ustar rouaultusersII** P8A8T, ` (<Fs)g4fsQ[ 2>(/- CؾI1"ܻ Bn.c #F@> C;#A ? C TB>"@f8$@eW3p 7,,B3 㐾/`9jR#AJ$PG N ""6 b=-.#8Ø94 ) (6#H9@93Ј+"q$ mݶ0< b KC@$P7ch9HLQ H)+X[ : Cxa 0@C^ H7q NCȃ r q.M>dR` ,Qh>@ @eyN;"\X` PTB(C" >$!47"A(0C | + ~Ǎ_"89H-ׅpb`#@'~\@"VqpHP%DpOb4A ðHWhp8`)#pqPDb`p%,` HF` a;p B`Pu !C3h@ƃ\- :LBA C9pR`1 !Cl `:AF 89Bf AA.ib(@>qlCK kk C`o`%Nq=0K (.րBaڻpOhBaP5v tHp&| 2 H\L7"0G G;pXÐ+ [ J-j} pHwB0D r'gH a"P` *U"P&: !c!FPf | @@%`Rc~4B1 ,Z&XxaA %C} !?d)a8pKmFb1 ;.(X@x 5ל`(T1 p, śi+" Ae a8@<@''!CLE/gdalautotest-3.0.4/gcore/data/int10.tif0000644003401500001440000000153213614004466017304 0ustar rouaultusersII* fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|Dzs!B0!ABk2pA{%2s#{A!AB020k#2{BsƱk%A{B{DZ{2Pk̄! !AsDzP{)GkBp{/JҴ%2P{Ā'1s!C8k1JP#A20!2{! s%Ps%0{2s1{Qk2sĀ!1{!1k#1k!kDz{Dz!B{Ak%1{# kDZkDZk#sšƱkAs+IA{ƱcҴk1c#%Bk1sAAc!P#0Z1ZDZsDZA)IBp{Ʊs#1cƱ̄šs/J0)G2Z1hcƱƲ' R0Asġcp)H0c+Os!0{%B%{DZ{-KRp' p! ĀƱk1kgdalautotest-3.0.4/gcore/data/md_rdk1.xml0000644003401500001440000000141713614005321017701 0ustar rouaultusers Version = "0.0.1" nNumberKA = 40 cCodeKA = "RDK1" cCodePPI = "NTSOMZ" cStation = "NA VRL" dDateHeaderFile = 1/1/2015 cOrganization = "NTSOMZ-NKPOI" cProgramm = "PK KFI" cFormatNamePasport = "MSP" nImageType = 0 cDeviceName = "GEOTON" nStringLength = 36000 nBitsPerPixel = 10 nFokalLength = 4005.408 aNWLat = 54:50:11.360508 aNWLong = 35:24:50.248891 aNELat = 54:51:13.449236 aNELong = 35:27:29.080959 aSELat = 54:49:44.072484 aSELong = 35:29:12.837671 aSWLat = 54:48:42.028900 aSWLong = 35:26:34.056061 aMidLat = 54:49:57.743237 aMidLong = 35:27:1.522895 nBitsPerPixel = 10 nNChannel = 1 nWidth = 4000 nHeight = 4000 dSceneDate = 1/8/2014 tSceneTime = 19:00:00.0000000 gdalautotest-3.0.4/gcore/data/stefan_full_rgba_jpeg_contig.tif0000644003401500001440000002676513614004466024235 0ustar rouaultusersII*+   RSC    $.' ",#(7),01444'9=82<.342?(((((((((((((((((((((((((((URA,Ni@,I<;Ҫ` $ޟ2\L,f<MkXxoP#ybi̪[n{wZz-; )mwZVZo$1;"cqE-=3ڽgh}Z \q׺=[==4y(cgC&J\ ?gCO Awl`&q8Ngis=~$֝RxCU=w}kN&2-mp2X=I$ֽgw# bX=rIᧂtaCq{*ͽ`yJ4'Td}>GW1=U?UA<BĞ(%>'W=(TgV&szK&1G/*'C\քO1֚`Gyg?g y/<1~6 ec̬UV 08=k)9ԐQE6(((((C    $.' ",#(7),01444'9=82<.342?(((((HƬU$VjҺ[D]30D}Yxo%S$pcmsA䞕|?*,m'XG$.:0k/.9cw!a Y'u⽗D8>gfʁ<c?3}I5w 7Xp~*ߋ<w!) V\7dq[-fBX)]lUM:KBy =jwkKDy3奶ew-%#H̨ICA`6Hhڧջ7mB SV,& 'Q[A?rZĿ i/Mˏ'? W+urNW+sOtĹ\eqz=3dc qNsU*bMe|KdﳲhZC\*o}fI'2#ӿ}Է;*N:Pey{й tϽ[g Wx>!֧kDa7UfR z 2\]͔1 *QEQEQEQEQEQEQEQEQEIuS uۨYJp ۀM~VW l''VK]l/1✌ᗨ9Q.MOt\5(,H <]5L8^XԹMz/~'8#Ն>c*r?;h8a@0/|'tx mv9S'ʹnh3x2݋['c]F}2Gzk$a2YNhՃ#(;Sn?Zyzah'-VI%Fq\S^C#رy&^vzs0Bz/R V N 7PN #a*:d<1@Tæ@P@"_&?8ְ?ѭaOR}Nq@Q _1\JNB~c?#O+c#*M돥7sz;wk8_ilv?S7\h}Mce={Sܧ =˺*ăk1f,z擭r֫=ۆf=NҒ+iMQT QIEQEQEQNX p)H=2EYӯnn&KL9r8=} 6EVhr뚒B*GߏO5?XKuVɃ3LԓNUBMs2)fw\2Vzt"jE.tX@8~& .}W+ڟ@&QkVo-^& A.߇6hImMF񷋴tj2+#x -пG Js#$y/tGU3(n`s (澲9+KE>dhVlњ({NLm%W1/+QIEQEQEQ_C    $.' ",#(7),01444'9=82<.342?OmB8Awgq%ӥմ[Aw*/ٞ-DtʦP\=k7hھm2W?<=W+ 'ÚO}^t # s_> xE#N[[1dx2ml9icOͭ]v$:hϰ cO{晧 iLip0f.Xfcf%ܓњE{fH䑉*Q`-xMey %INZ{Z\ *RSwIm2V0} oZ|5-ͼz*Fe@A+Em৏'^pֱxkDB-xq?Wf۾iA㓵( OOw" p0=Ӂ PJ7pZ֢H2c֚y&Ɖ?[6&9篈Za yr +e2Q\jdd~5C1j*C3ƣkS+k_V"(n}~B~sEU~hEs!#ESZfn(袊(((+cöڴ+7?PԾߠ[4X g84RO>-VM*Hq)A*>S+ ㌂9Īq43,rW:=FzW@oM"qcuivYd u#<OeI[muHcW$ivV1 yK+T"jxǥY[]/LHSL2 v]Hu8Bq8xN4ץM>I(+p;PTǧ;9#p-Vþ--tMB~6`jtCO 2ܕߧ^եV- yT:a~gɬ-܂(`~?bycu~$ri va^9O/%B;c3gqڨEۇ+{xOXCE˷*#"Qϯ>HaҡOwGvV};Z% Fǩ鹇OWM𥽝KHDnaӞ,|#yXg[[;r <|*մ].%c|y7XӴKՐIB/9_ r?+F6pkKtk 5jU8GU$cz#QW4QEQEQEQEIt Qw5oom.&Pg w籩#8V+f_kV!gadJ8㔙 %(of_)RH' Y6nPiQY=kHbi?*ѯgnֳlVh[AHcpHe9t4 JoQ=; @JZAṋp9OnN=`F9v6v-"ly89g 4]&L+D78#?=OuLfOܿ&Ya87 Q uʷf= NI:쬵wc#2 Iw A瞇֘:H"ݒ-ahoKXL1@*Rye m͒窺 'X>!^(OzwS?4U镀BEݕe>Z 1IIEr-QIEQ[\MVV}v?점ʺ 5iVYy#,mV#νe?kWQ[yM-R.x?~P++}%ۗPb)I8=-Aa_@TV7?ggF2۫ae;dUmPbzE NFGNa'"72}CɕD7*2+_-9R)<ԫ6PG'*>W;bbNb{uuR=k4 1jw ugCs&CFsH=̎3p1E,z֏}%eǯܐv8=r*Z Qud#ls)F?ȥi+,r:xa6~R1lPZ}RU䏔>Tҵ8DGDZsuQsSKes%F9Tu#5Z5 B3v(X`Mll%hT9LBfuG#<UxA aE&}*7֩q et) p!aMAK6E/jCk񍩒 ?1V7\~^^{]}oAEWk+%eV+ /%Cms]nܝ;Q1ں/%4ns,4BKdl)=6J\'Jב;΋$,xpSƶjJ>So.>9P}j`NۈnU.B7ѩ zv=wdWMaXf !o~] vho5wBď'o|{*G&Hr:AZ4^T|U`.tϴ(S¹]Fkb;W׺[G!*0W;xO*7 ms˘Comf̟>QƆdjHL[:=m5t{'c5ISF`5et˄bSc8NJQ֊Z>{cȄ =\UB0pzSkżAW QE2ݾ}hQEXH!ՏV-4QEeH$rEQU((*ޛ)POZkYL>#Un*0!*Oʨ%!W9cs&V6%Ԋ=V@ IxShV+R(%_eO*_7{^ h#/_>y2` uҮ.gu]@ܿ*? x]OL=d7vG?;))ꥅfR~sv&d}מYR)}=+=+f 2h:5ı]dЊnRCkf`?F&+5"RN~SLm|Iu 2J򍏘{z5ƊG^[}?K!"H%Y"bmfKy9PYz`xGVXe)"{GqI#$g ĜiL)US#*dڃɫ7 3\C/@I*6稨ȥχ>-iS[ݸ7LC?u~Ri)kӌJN1sJzOZ; s/FO뚎OXQ\i8)(\ERg4QEQEQEQEC    $.' ",#(7),01444'9=82<.342?(1L(Vx\n pkô=M]MV!+Y]Er#'0lgqH;;MGWF,K1=ɢ]Is.2rHI`i e:aڝNB쒡ܬiA : eW˲T6L%O> Қ+F rvP{k d́]Ԟ-p 9[7|hBq{.Rvk1Ti+_Hl(\CC1t4QEaDvS4Q]'o/Ǹ)aP@ퟭ.k\D-yFO N'!MM}˭f*iQ^c[U (6JEQQQEQEQEQEQEQEQEQE-(]qQY%3EQjbNMQ\l>EQ]7Cn(^!89+,C(whѵSQ^#jt++0&()`ӱQEV((((((C    $.' ",#(7),01444'9=82<.342?(qETsc)9QJ\֊(E,S4G En^Aɢ* ((Q(҃XEg,MQTY((((((((((((((((((((((((((((C    $.' ",#(7),01444'9=82<.342?(((((((((((((((((((( t, , |,RS,[!,}kz  {h!M')+C    $.' ",#(7),01444'9=82<.342 }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzgdalautotest-3.0.4/gcore/data/vrt_subpixel_offset.vrt0000644003401500001440000000423413614004466022500 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray left_vrt_subpixel_offset.tif 1 right_top_vrt_subpixel_offset.tif 1 right_bottom_vrt_subpixel_offset.tif 1 gdalautotest-3.0.4/gcore/data/nodata_byte.tif0000644003401500001440000000142513614004466020643 0ustar rouaultusersII*S   /V0N@N@@A̞LA# Wh )#NAD_1927_UTM_Zone_11N|GCS_North_American_1927|k{skkk{ss{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{ccsckZkskZc{sss{{sc{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{skkkkkscgdalautotest-3.0.4/gcore/data/int16.raw0000644003401500001440000000144013614004466017317 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gcore/data/classictiff_four_strip_be_short.tif0000644003401500001440000000026613614004466025007 0ustar rouaultusersMM* Sgdalautotest-3.0.4/gcore/data/exif_and_gps.tif0000644003401500001440000000064413614004466021002 0ustar rouaultusersII*(Si%.HH$0220EXIF Spectral SensitivitySpEM<" gdalautotest-3.0.4/gcore/data/md_kompsat.tif0000644003401500001440000001265013614004466020512 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgdalautotest-3.0.4/gcore/data/esri_103300_NAD_1983_HARN_WISCRS_Adams_County_Meters_transverse_mercator.imggdalautotest-3.0.4/gcore/data/esri_103300_NAD_1983_HARN_WISCRS_Adams_County_Meters_transverse_mercat0000644003401500001440000002330013614004466032201 0ustar rouaultusersEHFA_HEADER_TAG- &{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.1!Z4RasterDMSEdms_Statepk{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{skkkkksck!1! Ehfa_LayerEhfa_Layer {4096:cdata,}RasterDMS,. rootroot1!- -!IMGFormatInfoImgFormatInfo831% - !Layer_1Eimg_Layer@@"1!E"Map_InfoEprj_MapInfo)M"NAD_1983_HARN_WISCRS_Adams_County_Meters~"ALA"ALA"N@N@"meters!1!4$M#ProjectionEprj_ProParameters c#Transverse Mercator#gM&?-DT!)~Ps8?ǺA_vOn?$ $GRS 1980@TXA'?XA>k{?@TXA"$WDatumEprj_Datum$HARN$Area1!- %%GDAL_MetaDataEdsc_Table2&%&#Bin_Function#Edsc_BinFunction%%&AREA_OR_POINTEdsc_Column %gdalautotest-3.0.4/gcore/data/byte_buggy_packbits.tif0000644003401500001440000000165113614004466022373 0ustar rouaultusersII*S b z 0F[p-BWlN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|k{s kkk{ssk{ssk{{c{c s{sks{ksksk{{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{sZkkc{sc{{k{ckksskckk{ccsccs{c{ kZkskZc{s{sc{k scscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{sksckgdalautotest-3.0.4/gcore/data/transformer_13_dem.tif0000644003401500001440000000072013614004466022041 0ustar rouaultusersII*llK=S   2 r &h/?h/?@[D@#  mtr@@TXAWGS 84|x1 (^@ xA (LJXBa+ީë/X38,gdalautotest-3.0.4/gcore/data/pixfun_sum_c.vrt0000644003401500001440000000174113614004466021103 0ustar rouaultusers Sum sum uint16.tif 1 cint_sar.tif 1 cfloat64.tif 1 gdalautotest-3.0.4/gcore/data/int32_withneg.grd0000644003401500001440000000051313614004466021025 0ustar rouaultusersncols 5 nrows 6 xllcorner 0.000000000000 yllcorner -6.000000000000 cellsize 1.000000000000 35 -8 25 52 -47 -1 24 39 29 -12 -22 -12 11 116 63 4 27 -25 48 83 -4 77 84 36 33 47 127 173 48 12 gdalautotest-3.0.4/gcore/data/geomatrix.tif0000644003401500001440000000133213614004466020346 0ustar rouaultusersII*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{skkkkksck S؅ :?h 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray float32.tif 1 Gray float32.tif 1 Gray float32.tif 1 gdalautotest-3.0.4/gcore/data/sasha.tif0000644003401500001440000006666413614004466017471 0ustar rouaultusersII*0BCDES[> <K#::5BShC"9%""F25)9RHWUQHPN[fo[a|bNPrs|XmC""C%%C^P^ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz 1 (96) (96) 2 2000:00:00 00:00:00 2 Copyright 9,2002 (0.0155793) (2.9) 3 100 0210 2000:00:00 00:00:00 2000:00:00 00:00:00 0x1 0x2 0x3 00 (3.43223) (6) (3.07) (0) (3.7) 5 0 1 0100 1 800 600 (1) 2 0x3 0x1 0:00:00 2 Copyright 9,2002 (0.0155793) (2.9) 3 100 0210 2000:00:00 00:00:00 2000:00:00 00:00:00 0x1 0x2 0x3 00 (3.43223) (6) (3.07) (0) (3.7) 5 0 1 0100 1 800 600 (1) 2 0x3 0x1 " ?.(  ( ZJZ(Z))iQE-PERQ@ Ei!LQOY5'"R RH@=*00xq9p8ap{~T(G0ri=S##EМYV( Z(()h( (-%-P0((R2CC`S5Yߚ4HSSBbn(eWnAQG?–df`Й!pX4&Nb|t4SXG(ɌOn rj֔REhrPRK@ Z(QE Z3IZ)3Fhh&@: 3u=[Z#KTdJ_C0QMC4gҫi DX4NʚhVkR;})=})GZV1*F*#h4ioj3N^tT Ux#񨡈OlՋlh34f83Fj<@ftnQ@Fn(;u&LQ]ԛf4Q3SCKcNK*(UWfaRidgBEbfyV;{gSU L4eSG׽8U)ƪոb'3U}!GGU ) lQvG&害 QO0QJ,F)ij, 7 b* M_ލ/!}i۳rx)7RvE( `wap)SJfŠaM) #E [րx!27&$o=h`& =E64l#Rrs41^4p la# {'`JǷ:Ƅ PG\V-4)N qi {RdB0})>}+=rƞ4QMz<AtU+ŝ ~TX$[1覞7݉]5EGnL }kv**Q8̋]%YΟ @j9T# (VQ9.*ly{ fJQ'rbI"#L>¤jaHc3HiSqqT!;Ԫ5@N m<lv= [aЃֆc=jDB@Vȍӑ81PjN+&2x=*!|㰤4H{4nL\QT2U!\?5YOVL}}wR:N352# <R~q@XPO<p=8 Sr)S2Gj<ۚnJ[ڐm;sBqX)nSLDkԢ#RQڔ +HqXC'^jzF ǀ+Rfr-Xğjx^*WdVߜqsK Kp>l& : ƐqP4P*%XeiGN<6# }h@qy0+U[">iqi=ŗ{S׵ ؛܍ը\lML(8, =j D-o£*3ߚJ,qׁZ!vO9'*07DŽ^G2P ziwqnRҐ ئ0R9MEKd S:(1N\0ZUZ/cιKE;Ƭ` PRNW (#0QY:A$ڮ^,3m Gl734!7-YNF dNw4qRN;obsdn*gzzssMb\u651'@Xyzv-'Fq 1gd%_v vJs76"*YsNvrGE!'S *\zu5#ے\Q CGf==12qVS#<If#9c;),Ď@-iD@O.[<ʔ>M!4LNNqҁ܅mssS-*G:pVC5,ՍUķJ'k; ё\,z⫵~i]hv;繆?*/ժ안71vkV,zՈFI5g͙8Y3mjRv+ 6^W''jf_!~{ֽL ϰc](Qpŕ ڡ%b1N{Ry;bP-pV5 >*yTQ-.=NjX;x׏'Tq)c#8c{jv9A$S( E!SR&NISUz0GCR^y0F5_5#;Ɏ*d*+1iDb _ֵ|=qTDh9繫sOSQpn0iG:zsz+;sQ;`I9qB="\?JtyJr:5* ze㿃M\_NjT$eaJ:TQi㞕2g FhG 1?/;TsqVBV+ɪ#w$Ԯ   }e\sО@nK$copղ6@= AV=M2l5-ܤVr=Op~x@IIiYßLJ#%l #=EH1,[O>BL{!ӕV,P7?SU pR͓T*F)pF~qjE挻  dGzz| `m= &`sR4UOҟ$OL@+US1dH͌wpF*>l cM,#SϸRM۷J tm A \|٦*Hӄ(4 ( 1\z"Cߏœ$Zd `w~d1$d!!=+R N@B3bo(AU UvVsS{&q7?JsJNtV,bE )?Jqc\e,&@{gGϿj`}֘Qv.^3G{uEfcVa@ZbjPx`P؈bFS}5zAP~AH|#u6f:5aPmq ,CK0t1)粌0ǽHԑ{&RFSޤCgH23D>94/~S5gc=p@LSsnܟHN?*z<`R1E*0"D^(\gq0j^00"mT*YSMsQL4B 极NO*p)9sÌ{lZ1`1T.72784' 1S[NqP V|~( җRr 8␭##A#IR4KLni9m%2D4) K1K`S =Ì4ˋrG*sB_x'wJe{,5`fP4ԛo M.(-%8ҌF^wP<~֞ׯLӏ_QCj!.ޙ4RW>\S$E<( F8ϵ'w`iA(+$@9ݏJsg=9p"e~(ۏqRpsMfU&N* G~)\QXuCe3pJ:R@7\Y#媯!å[ʹ90&v\4ڗn2sƗ?*=SNXI V$ {bH.NƤ{@,sjQx89.F TC&s‚[UyTzۃl԰#i\:`P v.BIەRq"@DWcsU_d{ZaJE^"&*EMY/$Ҭ|Wyux83PLR$ 1G"1$4gTjDn\U?qxb?uv3VC8i֫4\Kn:S[Eny[֟˖2P?ߗ4T4;`T˿oͅ#vFP7I$mNF2ssJs0)qWFp1؊\٤f>٩e#IP%JBǝ#К@i.d'N£l"I#HELqESSay攟d_c6= +>W9u4K (s/ҞY)B`K 0pI9FlPI9qah&G?:8#4$ix]kBR f} 8qZ3S:B WCXC@t^fIZ`郁"!#38J !尯rYЬjī y0ԕOZx5ԂfBcyE,f#r@TjhF$ўkֱؓẆ'tP85 3&}ϭy$Zef#={Jgm^O!p$k%)HmY$$jj =x*E)bY{ֺ#ذī;|m `)+J-pKn>FVzuQ1$oɷƮE梌.s})Е9㨫q@ꊫC+C' T%qś1N9 }O$ՠp#=Ʊarq)bYy+b_Q}J}HQ|g9Z$ o ЃO aќMF u␾Kĉs@fa78"'8>DEfP;Dȍ|#Z"0H椲s)<Ӕ_#{RɎǥMvJ/RfVԊ+CD<ՔUTmFֶ`kxȎ>Td@{"{T+P*:~5:q2>5e#cRAHMŚr2lJq⪺ wQeGQi8 \.6zjiO \Γev]3ۀ*ԣEjF {Px=j`1ґ0$z9T_RjT}Nj3Nw&8it4qL6";O+L`qΙ$/ddnGj̖J־sc28OJ&rm!+RqjFaj'rV,G֬2$QON^ s 4dP0RxۏƤ3ޘ0O^)qϽ0e@{2!ZJWR7 zkJiH85֘֠vD#34(#֘(9lm*1SK1$!2S帧K2`Njż >ƨ͡OμuƧ+H2=Вr*+ḩ/S_GL 80㊓*: ?Nnk[Dyr.z$<#=NQsK8Y}F>8w9"H( nHx (3ޚ-=89(9'1Jp:@ NA҄w&@3Unΐ(jX)H@Ńwl]F 4#+RB((((((((((((GI-W|yڢ1yːrPCIԉ{Bo>$ |֢{<oTB(I~"i@);1E%ʍw/$ HzշXLy6:P袊ؐ((((((((((((lI(ߜg-ܓ$L*ST9QDPȋ7JcB6}zK_^@r&QE0#v_݉Ta{EpZ^ӝ$IGQU74Q[QEQEQEQEQEQEQEQEQEQEQEQEwBO>X]HwgiKZ)%=VErk&C`:Y"U WQڢ ɪby؜f$9$28eroS #e+ߥ!Q[QEQEQEQEQEQEQEQEQEQEQEQEvo},e}HK 5VdU+0|W1bOs `&yikS˨ `JV9QO UާąYGxѸҪo~pzdtDptQEj (((((((((((('$bCdIsQqy9j*V _@ SQH5)gr$ ,%b-25HSeWrV\LR᱌q[QΏnyeQVEPEPEPEPEPEPEPEPEPEPEPEP}o+ޠCȭ'<*782k5jB6jp9&$ n9EjJacEV ( ( ( ( ( ( ( ( ( ( ( (= \:NgeToJ0Ȯ6XA$T3M*Zi⋁QEwQEQEQEQEQEQEQEQEQEQEQEQEzźOVVgӟ U{e9Ұj1F*'סwmebc4SѶ7+((((((((((((hĢ a2Sו4h) ċTZH.$_֦J\ 9vx ,NH>[Oƙ!# 64ݭcɦ+ nb=ԁvOҢLs4,]ޛ@lScHޝg-Rzz RIEEM82AҐCs5*0_|R (I$SMn[jj;9$#EǸLaodPNM4lsNv$ʞntsHwU?R JG!sNF=T^ c=Ұ65wZppEHC3ЏG ~j1@aӁHdQ߭5q?JbO$P%\T= ;9b9=*YTdpqMQLvw# {u'yi'4<ԂB==j-iC|ԀeBǒ3"ibŽrzvaAZˀܚޤ#g9X& ?bq׽7`;G~ >OAQ 4G}֑\ /@) \d⠍F_Ђ3VQPzu8ltSLj;ӯRZ9=LdptŒ`QؖqSd nK$%#s?WWvKS@'M15 _=Vhެ0ԧ{AhsN;SPdz1'FX1pxy5ڀ1=iab299#qHcHPty8A)>JTG4}@GZS(MU ːMP;իl{F瓜⭆ڇe; Fc2,HI SM=E=^(^i oʚu9>1+:jiR:Sر=?:knr"y'\՘cl8= 9_2@<{POJyG&6wnT9V4P$ oSP0s}:vY}ǭQeQߓ]╆YChf8zm"EqԍI4'C@ uMh`Zp}2w0+UKA);JaQH1SVp3IQN&w" S(%@*Rheu9ojߏJ>950ʬ_4Pu&NT@Mj";z<GlܶqS~&!:>M56Js}? T}ϵJ𩿋>XLp8FpYO4T&N1I$y,?5aW3@6ˁ0BO^YC{Up6˓1iߝ?<::;8 8R/&;vژuwp=I'`jjɹ)%}޴u۳Tўy 3SЀqJa\fpBS)X.gךAd'b4}clY*} Hp΄g~qL@iJvvxri(8 3КC9tNzAy@y뚑 }qbA(b >!wj88<\@#4 zS`Tw oDUF={i2*A҆9T"@Ҟ2l/8jӐګ76q@ƙI9)6~iTmP):z "BMVSaA,`Ӟly>0b<=A"q8XwsNqLBK`Qi۾m6p=(s59JA#tI'S>ΐG 4GsHM b?Z>ԹT2M*~@qAOLܚ=;TJ~eiǖ>C5Y$㩩#'͜8 2Y09 +֖e'qF 0c=hBO)O_8B.֘p:n=IہԚT\*?9j@M0 _Tl1Mjb'g%j,ԣiAN1 2Fwk?VUjlSoY4Q=>Z97DV5{sdn@ױ.XQ=TlmwObOǰ{In7oFZ(=#^msN'Z(ǰ{Iw6?F-=<;vȟjŢg%cgZ'='Z(ǰ{Iw6 nMmkw[Y4Q='c֥:seQG`jltVM{sWkԣZdKǰ{Iw5Z.ZZ(GSVM{8s[oo?&~=H((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((" ?cO@#j#BăuX>`Ucs}}I؉׊n8#KLc'`{TcI=?@Oޘ=iN3Ӳ<Ӹ3~ݿM"\:)s#1j 4?1J'|KJzUךRѐyp?^)WG'w$AH7ʧ'P ? s3z9*M$`0Jš遟j:>ԓm# >@ V#ӂkB)\6٬EPF~r8AtԮm+e XT sWÜXq 1JC }){1 \0=\O4{wT6} F렫yڞS|>;)8@G$94w>y@uҁ ךi!A\y4rM!Cj@$^i7).>xӭ5i2 Z|Zwӎ{Uqs,;8(v VQM5ID9?0zv5<@6G9Cw,Xqӭ0I*sMh.r[9z_hۜJˀ@ns׽LB|?wRpE%0 #,q&X|T03l^W B2 Cw `'Cn#Aݟjn1>H B6WqןʬwEc/t7A=#tv\,˺5hAb 8Z jɇz|c=>iLgQ9Է 2 n)Jy`fXBH;sXJ'BG?'9PҮF~MHl"ʑNOɨ#>֥\ d4ׅ#6w SB/r?A9Fj@2;ItԞҠ0*?ZvNE11D2>Ƨc&= Hj@A84NNp1` v8?vA^5I8zTm@F=['`XUd$dd}+xCU1`q]Rx=z`SGVVԶw7 )}iX7pZ5 I8Y2 x$eTQ\-\iاê ZYO~@62]G"q,- 槆\qfG8c?ェ*+sFvˏF;񓁞D TI&ǽ0ǎi9=3Y jplRF~ })(5 8tU*K-=jvJ5WK׌B+M hU& >zxUz5-W;TE eGC(wBY X14zTJrIAVapz t(PO0-ASt#͝69eNPF{"qcZ-I-$ $e|3ޚX\xauRv%#faLOw&*4jۘ;{:$cFhKu?z~5rtl܆X1f=`4$B[9*Oƶ y᎝*[H(I}Z&S3n8[N/c|U}Rhʣp=k@:yo)n8Qa[] x#U;1upX!V*\S*td'"، mK#V[*i%cdԋ=j;!͓/j.&'-lSxU洎N02N>l֣S3E,OzrZ`1ZL))XLn<┩]?rhfO0tǯ^瞵=NM3PROS{ToOhϽ&ifaN;RM4WSzRDHG*9P V ld`@QϥVSIž.JCEYIԁMHx\ & 8?dՍ 븍܏W{|P^aj6'hyb=8f*[h'U$;]%$'Q1mWϽY s݉h7{wHQ jtVD@u-Կ:/jˎSe7 3&Dri,g"cM5>CSTo>)j2i?9=X[ykd})?J Cp8F:Sǥ94]jVZ:UjX P*f2M4Kh҉zSCY+j$ OQH1Tz0*n' d׊34i *:^݅CSКNh +.ՐLN*]+Z$<)''=+:{">^[qդP$*\/ s.h%֜li 2'BdrdNF\-PWk6C%Ӝ8\~`Uny\ިbhcN{I!g9' i$\̮Jj0iHDsO/Zt(*7v;h_wԣ\ٿdQGa]eSLj.XTS䈹ުtS >LO>ުQ`usԟnS w?wQ֪4Q`xj$/zڳ ֬( ?ڭ/W$]YQ`4-.QN,߷?zGjE $;1D֡ sikcQaܸ/,V,EB,hWV (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@" ?R0IzU8A;N;w5\GɜkSFJ&45 qR-ǽf4!EVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@@e=R,E^0VPTW2v;$r4Uƙ N>uDS( ( ( ( ( ( ( ( ( ( ( ( (: GvN*}M5d*U`VE7r"w.T鈪1UҙR8(QEQEQEQEQEQEQEQEQEQEQEQEᱞ:\{[{҉HPQS$$s֧KzB6Umc)qLB(QEQEQEQEQEQEQEQEQEQEQEQEo4R1b9y4& qZJph(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@)i#J(i W*QEQEQEQEQEQEQEQEQEQEQEQEOE/ڒŢZJ)3@EQEQEQEQEQEQEQEQEQEQEQEQENA3S?JRf`(EPEPEPEPEPEPEPEPEPEPEPEP>ZfjeX2~j7S(` (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@gdalautotest-3.0.4/gcore/data/cfloat32.raw0000644003401500001440000000620013614004466017772 0ustar rouaultusersBBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBBgdalautotest-3.0.4/gcore/data/test3_with_mask_8bit.tif0000644003401500001440000000527013614004466022412 0ustar rouaultusersII* NST   ZS gdalautotest-3.0.4/gcore/data/zackthecat_corrupted.tif0000644003401500001440000002010213614004466022553 0ustar rouaultusersMM*($v8OU0Ss=)]6^1 Sւ Pt[FgNx4RUF՟%@s߷UUW-4ZPJ:+h|qPk/.2ݶ ~Χ7OKr*u|ֳmt {1<P֩j,⫻&PPo1S+5= 8gIt2ϨJIFMDjVMI ;QT ;]w MNH9MQR@Nw9,S(ف Oqd*Q2H:֚&&p)!H;`c83l2('lNHX Z^Sz>ee?#?4(;qkqr?V+c\-%HY3[ٵ@ &;Ɋhr^qm61? {ܰ='?_^&5-BYAP>G} tS`NJ7\R⺱GlT[ndkIzV>K033pA=N\ SRvnBnAi"FGCu?t՛7*@;Us}| Bf<{ &xRWҦ`B:ԮBť_ wNTRnNwf!$=8 1ǥ TICmcAsB(~C䍩ن}h\oG:="CbSHb=D-n.lg8]ϩ>0LgH.zoZg, r~۷4+Ȉ*#j*}yOk"眨 HξP&ds*ΒIhَ҅~0#۷WF9n%Zf7Mc^o(сD[\uG |(K˕AE<&1yM@)hnA;QUK6NޫQ]7# YGuQ X#f A+]7x2sK/OJrǶ䊹h̲_t# GAAPwr{S-ɗ8Q֞ 0,0aJ[ ÿΘHPawIx]G*(|zUI269qU=$8niz$BN*!jc 57D7hF/1ڃθ#֯j\ToJ2C`›Ŷ6wHvP,Ӹ$=IOjaOM?J/I3Ñ9c(ǔldJrUv7U᜝HZVglaVӔsy>MXs,3.;Jb|[>x~-f h~)#G WHST,:2q]yM=mrQtrj.Zp5|zk;Rcq4ʇɵHt+'lOOAUne( f^l.z֪OQSRFz$yhucY6g*AJyFTo\T Ff=v;ДSUp0qvzAA%uoZ2`n֩ ==(LppFcBdNFsPsː?1@au!ެ//043%BcGU6`jv:ÞB"46E 3#"BOMO@}60s\;kvl4qJ 붱FY}ޭE,ކ9`)CA~U?1%FQ'pzf(<=hCgV%FhCs~؞$W(ڵCsKKi'8 ŊH׆M6uZW-S9=sXed= ɊݳPd@e\fSGcX.V5W?TOڇGbR8ً ܷ+23mH2Tl?L2BW%Cgӡ7 mRZOKhhVBVdR@;ޮ_XC "ER'Ld7ΗaXn޲'xǦ=yyZg(Z-hUpYGCRr@Ai@+r}jZz }.0b`>[Cr%Xgjj먡3Vb&wv\[=I$D;Zh5`I=y(2- 9Ę?,JЁs*)6,LC$J~-;0 4IG$qͱTB]2s:*:ꭹ$0=7-jt\p:ݵ_Y:oʹ%_L'i3"1]ԍg\s:U6)+nryAz%cv8IGj s `,9Sڲ'=h"I,EgK0!HކYs,wCQ?FRʸܝQus'!by4!? #7rsLAq-Ž5CRAO$eOJH Rܮ1@@o.hk140ymc#򢴁W5)9Uc*'> rTҨ$tw;~u9fU1Ґɳdvj>7wn0wVm,U]ExyISn\S׻c*dQm@gZ3F;d C\]N;~c%9+(Wg˽Q[yl&JVM=1X9[O[!rOĊ_+cL(]GRf~BĐ7GWXq5ZJ*s̎~=kYt}Kyw>WNGbO\`9ڋw3+o0Wr/C(>w) f?͏ҞP/2Xښny#!c( mWB0θ#T&}P7cM!\0 jq'"@n.~7nLc 6~ҢS?jKE_KS= 5R꨼@ܲ>!mkی1@S{pM :>~]Q{2UU65G*Ҡ;"FVuN1.V gըr3Ӹ0˳:X0,wǯO9WB6/ޘ3lGg` ~펿J~LA; X/n)top؏B1A9 ؎G)?X'9 d9A#) "V6UeL6sJ &U }h2uޕdC ߟ&R鱧YzjM;eu=9iS#Qbz`bq늈@+?Ko@;S2ʙʉ9؊08O4uZlhIH`kE,~`|롳%``rAW6#t9 k*+pBBzr:|蚸当j0TB2'4k\o\bAᚺ$?]3 Mak|NWRBpfDF:TQrX;ZA\P>[V$`IPQ XEz3fU%y^z:f{9r8;7zul{Ԅ8F!Xgn1Dc~OM Ϯ҉* r&lF:~_J`;214Yb +<|}:>t~ vjsw= eF1^e6\3}vLܹ‘2۽!o 4']z"c~u]~t)@;T>JdmB\ OJ0@7:fA@H;)'bjd\b?C,O`qF#?8:e^an4 vF1~5"@s͌C:tomGdAniRĠ.O]FR|,te9g?l,F 0H1GQ@g5 2 p~ άJA`Oc "ۙkneN?ħ}s(2nUV}S=A<{U b͵t±N+lRԼyOС= F0@˞WPcjXd1 3+֭*ape98~41\,hAʐzJu)*p' piS'#oNƤ2Ĺ r~C9wzT'ñF'9\R?4yGsެ32Щlw2$gU㛗yӜ(dmAP azGB?kIqӭV.wҁ2.3@H:ў )QҪy@EayoLrv_N[7qk9i3˜NqQE6f_Ї! ba`#`c1T?>t1BFw 5| ?J_+MΔ'9u#/gk0??A~!EZ+{ֳ5P9;ff|tERfԡboQQ?i'm3u `Ҵ7b9>JO~ִAJX0u?0_&2IlTZ,IoR 8ˀdۯSwG_J>~Ґnv=6?֝z?}ҚOAHa}>0rpZsSZ@E q;<???2dGLt>cT[֘g)(w*u|5zЀ(BCDE    * q' q'     ' .(00-(,,39I>36E7,,@W@ELNRSR1=Z`YP`IPRO %%O4,44OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO %%O4,44OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD   }!1AQa"q2#BR3br $%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzy!1AQq"2aB3R#br$4CS %&'()*56789:DEFGHIJTUVWXYZcdefghijstuvwxyzy!1AQq"2aB3R#br$4CS %&'()*56789:DEFGHIJTUVWXYZcdefghijstuvwxyzT ''t'gdalautotest-3.0.4/gcore/data/nan32_nodata_warp_nan_to_zero.vrt0000644003401500001440000000443013614004466024277 0ustar rouaultusers 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],UNIT["degree",0.0174532925199433],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"]],AUTHORITY["EPSG","32631"]] 4.0000000000000000e+05, 1.0000000000000000e+00, 0.0000000000000000e+00, 5.0000000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+00 0.00000000000000E+00 512 128 6.71089e+07 NearestNeighbour Float32 nan32_nodata.tif 0.125 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 400000,1,0,5000000,0,-1 -400000,1,0,5000000,0,-1 nan 0 0 0 gdalautotest-3.0.4/gcore/data/pixfun_imag_c.vrt0000644003401500001440000000105413614004466021211 0ustar rouaultusers Imaginary part imag CFloat64 cint_sar.tif 1 gdalautotest-3.0.4/gcore/data/byte_inconsistent_georef.tif0000644003401500001440000000134013614004466023440 0ustar rouaultusersII*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.0.4/gcore/data/int16_3.hdf0000644003401500001440000001103213614004466017507 0ustar rouaultusers j\    < &! G K< !  < !j    + ;Q 7 ; I GF<<NCSA HDF Version 4.1 Release 4, December 2000k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1fakeDim2Dim0.0j j j j j   j   3-dimensional Scientific DatasetVar0.0Created with GDAL (http://www.remotesensing.org/gdal/)777VALUES SignatureAttr0.0440720.000000, 60.000000, 0.000000, 3751320.000000, 0.000000, -60.000000IIIVALUESTransformationMatrixAttr0.0PROJCS["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"]]VALUES ProjectionAttr0.0  int16_3.tifCDF0.0gdalautotest-3.0.4/gcore/data/byte.tif.gz0000644003401500001440000000067513614004466017742 0ustar rouaultusersQH}Q=A]E 431;t?8 *` :i&l 749C}cb757=&%V3736V)YtJQpSDX8*`d4hNيjY2Ή#fwдHV`9 - # T`@3^QҋpX+cŴ):īʐ"9n0oaȺ\2DaUYUN%iQ.pz^׹MYRJoq㱄zJ8ǤfG|1Lpέ {γqOG)}i~ m9N_O| w-_?n#}}<5kWR\fGv~jw,<ݟxd훗C-gdalautotest-3.0.4/gcore/data/float32_with_nodata_slightly_above_float_max.tif0000644003401500001440000000203013614004466027323 0ustar rouaultusersII*jd S   $:  3.40282346638529011e+38??;At>!A # @q )#a+婁@ӼI@J +}@؃I ڿ0(hr?w-!&S@Amersfoort / RD New|Amersfoort|rݽ 8@qSY`z֔(ݾ`M!lԤpV> >B`>|>>2??Zd? ?.%?G(?+?0?{.?.?4?Lj,?;/?.?ޠ%?&?*?*?'!??}?>-?>&>>K>*>!>t>ܕ>ʬ>)=˦V6<۾O}?5YlGa=L=^;_=֡=-=\=` =z==F=;>h=+>>==(>y1>v[$>Q3>G>B>3>X7>B>rR>F> d S3.40282346638529011e+38gdalautotest-3.0.4/gcore/data/byte_zstd_corrupted.tif0000644003401500001440000000110013614004466022436 0ustar rouaultusersII*PfS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|(/XnW"*}:/D_]J$(*:%x 7\Y>_Le ]#/ϻ^{D"#[N*sÎ^صȌxVbg8[k8-*DCѢȘhԵm VuHYWms#뺌 <=0@J!iM ` "C 8'Qwp$egdalautotest-3.0.4/gcore/data/md_kompsat.rpc0000644003401500001440000000724613614004466020521 0ustar rouaultusersLINE_OFF: 1937.50 pixels SAMP_OFF: 1874.88 pixels LAT_OFF: 51.56772106 degrees LONG_OFF: 45.98734433 degrees HEIGHT_OFF: 168.68 meters LINE_SCALE: 1937.50 pixels SAMP_SCALE: 1874.88 pixels LAT_SCALE: 0.08641944 degrees LONG_SCALE: 0.13839466 degrees HEIGHT_SCALE: 168.68 meters LINE_NUM_COEFF_1: 2.094646315995084e-004 LINE_NUM_COEFF_2: 2.824750131694535e-001 LINE_NUM_COEFF_3: -1.173219179951515e+000 LINE_NUM_COEFF_4: -1.643871889503145e-004 LINE_NUM_COEFF_5: -4.459904216443517e-004 LINE_NUM_COEFF_6: 6.084761032075198e-008 LINE_NUM_COEFF_7: -2.398876894257297e-007 LINE_NUM_COEFF_8: -1.111217596494691e-003 LINE_NUM_COEFF_9: -1.389855422616564e-004 LINE_NUM_COEFF_10: 7.083566157854145e-009 LINE_NUM_COEFF_11: -1.224882520719930e-007 LINE_NUM_COEFF_12: -3.918301133164352e-006 LINE_NUM_COEFF_13: 3.274768487322774e-005 LINE_NUM_COEFF_14: -7.331057466697384e-006 LINE_NUM_COEFF_15: 1.161541733564753e-005 LINE_NUM_COEFF_16: -4.014454129634238e-005 LINE_NUM_COEFF_17: 3.044857993209063e-005 LINE_NUM_COEFF_18: 3.642567889539727e-008 LINE_NUM_COEFF_19: -8.384567439686723e-008 LINE_NUM_COEFF_20: 4.261707718456547e-009 LINE_DEN_COEFF_1: 1.000000000000000e+000 LINE_DEN_COEFF_2: -2.695655775221908e-004 LINE_DEN_COEFF_3: 2.091828849434532e-004 LINE_DEN_COEFF_4: -2.117966663508839e-007 LINE_DEN_COEFF_5: 2.934493924413960e-005 LINE_DEN_COEFF_6: 1.301639536718661e-007 LINE_DEN_COEFF_7: 3.699123948529798e-008 LINE_DEN_COEFF_8: -2.026947931442176e-005 LINE_DEN_COEFF_9: -6.731673266376843e-005 LINE_DEN_COEFF_10: -2.595461316405050e-005 LINE_DEN_COEFF_11: 2.012281265939131e-008 LINE_DEN_COEFF_12: 2.850608580024337e-006 LINE_DEN_COEFF_13: 1.389397053353597e-004 LINE_DEN_COEFF_14: 4.966772935405603e-009 LINE_DEN_COEFF_15: -3.427916927895478e-005 LINE_DEN_COEFF_16: -1.889868626674809e-004 LINE_DEN_COEFF_17: -2.078004480709344e-009 LINE_DEN_COEFF_18: -2.409823243159362e-009 LINE_DEN_COEFF_19: -4.030159880309564e-008 LINE_DEN_COEFF_20: 1.299018273224906e-011 SAMP_NUM_COEFF_1: 1.801323933224189e-003 SAMP_NUM_COEFF_2: 1.178863201055586e+000 SAMP_NUM_COEFF_3: 2.830684570865402e-001 SAMP_NUM_COEFF_4: 5.728545672444025e-003 SAMP_NUM_COEFF_5: -1.887567467741118e-003 SAMP_NUM_COEFF_6: 1.111553934343384e-004 SAMP_NUM_COEFF_7: 3.476047763479550e-005 SAMP_NUM_COEFF_8: -2.477463380727685e-003 SAMP_NUM_COEFF_9: 1.980392503148189e-004 SAMP_NUM_COEFF_10: 2.873596383849840e-007 SAMP_NUM_COEFF_11: 3.014178263750575e-007 SAMP_NUM_COEFF_12: -6.808880542647113e-005 SAMP_NUM_COEFF_13: -1.494361868018614e-004 SAMP_NUM_COEFF_14: -9.823046889065704e-005 SAMP_NUM_COEFF_15: 4.116968005327678e-005 SAMP_NUM_COEFF_16: 1.272492737704768e-004 SAMP_NUM_COEFF_17: -2.359225384754636e-005 SAMP_NUM_COEFF_18: 3.176399624285134e-008 SAMP_NUM_COEFF_19: -1.346185899997949e-007 SAMP_NUM_COEFF_20: -4.773232480264892e-007 SAMP_DEN_COEFF_1: 1.000000000000000e+000 SAMP_DEN_COEFF_2: 1.307868521990991e-003 SAMP_DEN_COEFF_3: 1.755373119101831e-003 SAMP_DEN_COEFF_4: -1.512020807093616e-004 SAMP_DEN_COEFF_5: 2.252816677913234e-005 SAMP_DEN_COEFF_6: 1.193790650240214e-006 SAMP_DEN_COEFF_7: 1.627185983950029e-007 SAMP_DEN_COEFF_8: -5.222632442464887e-005 SAMP_DEN_COEFF_9: -4.320995242285467e-005 SAMP_DEN_COEFF_10: -8.335569426226505e-005 SAMP_DEN_COEFF_11: -4.845786735988417e-009 SAMP_DEN_COEFF_12: -2.241531445183524e-007 SAMP_DEN_COEFF_13: -2.168805560416187e-007 SAMP_DEN_COEFF_14: -2.874165583568054e-007 SAMP_DEN_COEFF_15: -5.478883857797828e-009 SAMP_DEN_COEFF_16: -4.586720636157518e-007 SAMP_DEN_COEFF_17: -2.181581217109535e-007 SAMP_DEN_COEFF_18: 1.634575697195243e-008 SAMP_DEN_COEFF_19: 1.333688380766964e-008 SAMP_DEN_COEFF_20: 2.148235549909915e-008 gdalautotest-3.0.4/gcore/data/stefan_full_rgba_pct32.png0000644003401500001440000003111313614004466022661 0ustar rouaultusersPNG  IHDRgAMA1_PLTEZY'/>D"6 "         J "]I`   )g 7F f /WJNk(( 9^ ,}|r}/(?>t'6 $[v!M1ItI/ *r Ld>!4zXo .`Jb%F-RH7 Ip0m$~'5>W*_% 9 '(PZ("  I    9}tRNS y)&j# +]VF2xJDz }~>^.nT,[؎ٮm}hrY_N)M) F/bң \9Y/k0MbTsook[򬃮!G-K_X4.]N>|` wg]-)?8t.ѐ@L~;0u{6qO_1ΐZg*+yI/#l^޶{^} w?+u(\ڍClgdBQJ\Uݴi O7 GiŐ8νCTN6I1p>-!zERYLD]4ll]Кۅ4]?#g// 7BLw]1)Qձ՝v_|dzZvحm}@Op'Eo Ȫ/1㙸{XJMREM$EGMeS.klE 8p GBx"(-ck2/MWlu=+io8%ܬ\O*zjcX%'?Svtc- +k/7Vnd! TR,qt_  qnt+uD\Or=_#ISU-ͭ.[v=TU=#K@mז qOD\q#'VWu''9~O V S%Yy$dM?KX:=ՐN>X|7<#X \e))D¦WUCpC|CHE bT֝dtx p8uݲWȃZ^nʀ6+!B x7pK=9=0}࢓'|#Wz%O np\4^\\ltdd.e*7BP*BXcfR>q WS3H}2^0g:⎣{vzug!/uu!F(+PՒ0I3cغ<kH"L3|<Π1[\D[EOSB:o$r86xnOkML\ZXa-B_M4R3?1=j x f[0XO& 1 REmyvw>!RGxۓw70cl< c7\[VĠWV4z(f d[9y pV_1* !gښ 6?m8 #i+lǷHV.>Q;QuEHI({h4@>jB$czdEmC Ǒkmo}?̕[τ"M4Q@K%:tTHS͕ .g%;[ZTBennD)4! aI1e vE-qi^(u0O..W<xȩ;ء~{=Ir9=merE;xO'%-'O>Vv.nnQE}{dOlFCW#7@WA]˯}~tم]Q쥋T;& bVv+o`'-pY/e6xM)̫We3[\]n6 ){$2^F[rX1\aFSUD -0_U~'ʈS)]KV@ʰ+.?oQ7m@x2S.Ȑ̸N6s>h AOyThd *:hj41AZ::I\8gҸ+i[>$)*r2WYduLZ rmeCEeUeh@Ӄ2FE`SLL[h 7 )M20+ .3i=b" 9A.$$dg"*z&Y?@IDb)DLyX}; Y&+JOWGDF9ںqW׈8"1=4vYU3~HVBR^mr߅ܡvYoyDCw9A蜏cv*!%nkw^%OK y!nȅzg PI?iw7.5<pcb@5"J`F\Z0viS"9ƹ~{ͭJ+s[@q -섹pqXkK x|0 ڼ0^,'.fGBտVu5="4U`J?/N.>lZKN]nԗӗ1"rdfR KK^\y\VcEE~ezawփY1g7G RP5Qʣuּ̱tJ˓Fr,]]|x#qrreqAhABiyYB!ppqd3IcW*;oʿ []."`;:[ &[FqĥQmmm,f5?,|~J.yZޝaDxrɖR?FSwD 8I0OX&<woUOt ]nE 29rB [kK*!+cɭӯ_ qqw`q7Go$~s2qf< g™%D!~#.*7Rw]Ok fbg:TWWa^+h/r},rRxxN?QE}Oəy񤙚ܞ,,rc0* >>~5|3R~lA$xwx&I'uWܫu77:1茴&b.2`қw5B#}ē3zqmmEf&)H#W wOv$^,ܸ} jPt4omneul') KځjLO#{}2\]z.[1!Su䒙mdJ& )lGOJ qrZwu?%bf<&-OWeXۣ HSS vr  7=XZz9vulAO_6jpP0p>`0V gu-%q,CcϚҧ3[1QXP<3v5# "AV"eE-q0uM3I#̶ p4e+ovJ6RW`e:u E5v|W<'3NU mndd~"|wt?tj3VDDyˈso4;wKK]yN #z!z%k{c|xV!ZaIhfʀɓ~.&HWh NR[BN〧nb$åLb~⺶jjwijZ)~X@G/s~eO5B!^"R~.:gMd5ҳEWDZ8~`\э-> }4B^t58hnd8`)wI a=Qaqk(踁0 eo0TӑG zZ*I8\ұ@5. '['9.>k\D#/9yx=v)kQO9?ȣ!v񘳥2/ +"n,# ,Ey Νc6H+ ϬS]Jg 6>jrsf<"-,NH XⳀ G\q&@!:VA+Ũ߯^]ofTl))e7A沩,a+BQ՝;UwxC(UEe"OׯED|eW6;kЊ^7Hw(i  al2Ca"2K 1>pG\ A_-Swy@=O.GFDD2aYl٫WPt QAAA~ށNNaaa.+\Iqh7#o<6 `W[hjaKGGS_מIJw zY+44ɋɋEbݽS UQha㣫[uFҀC62WޏUPt񂿆gɵp##XVF,Om8a:>I3{:y 'lFL[d/l4uL$T,털?/-722eddv֗}lqxN-Ne~<LUI={vCP({%+ *v|\0MD21ٴBSF/'@;SfMnn22^Z>v\Q=yx"HhoLek= ֩%Ag>suF[*dow ;LMm$J::Vp[BB1Ky^n<0_ͩ@oRؘ]fP)ٓa H}*kj*A:]{0#=%6iޟ: ہ]'!dc8.){fp~"""{![[K3;7-k^#4??(xmKn 1!@(v!&w}*'() 4Pfn}Z(_#57Y Svb;ko;z P)DÇŁ M \cBF!>ۆPI}տVNax9:zIB]ˑQ)b1m ѨCS1}%5 t ?b QE75?p|7䲊|!|i@L<][0iǰK.6=54 ! m< {]Ydkr 9vkLa*|r,SoO@ז#㖉L$.^O-L =Ғ3c%idd4rؼlfQZH6G/ܿbḘ?uC׮3`M…sp3On{Ӏǻn6P####l/LEs|n'Yf v1Q&ZIDAT⾱ځ3*egssU ^M}t {{;SSbnb5E#ت3޴Ʀ7 RF[(M iii8+.a65&}![nөok}:k4>betwPp,5??ut`Vi`L⼼qC]7i Br|*aa[ |Sr,hetaw/}&*괩|K/55%5*&>HyYپ6HBݣ-bW{*9>૴{G5|df&)t&'eX4Ut' NwN?LMM|\ؕ>%we8ҒvsgMl  u]>go8M}38ܗJɫm(/WO7n4ѢRfl&!Tvߞl,((M)mHmy6zh5t-kttrmkm֘m'局cB%}-8ǜ6:Sٶa_#eyOq\DLum8EY[WfMb}?nu, uuŽ ¶4 !32 #%.{+Zrq%F[o <׵4w ^ 9hWA|dQWex,,I}.%tS2ؒp8It^8dꊓdRILO'p|RI2\ #zaZZ -.!*wVֲrTP9b'-.nPx >q:LA>̀oH&aqO**2*L#T jrILf)Pט2Mh+ׯ,ACؾ~}LW@^2@y6r d8<Ԕ[5 otACT<'5%YJwOjsȫmaСYai }1i7iX=`  4؈5`[IlkZdc bR[Q&_<1]W)g L\/kQ0P7bpu=l4 U]Amj*  [K?7Mm3[svIqDpqpΪR"#H5Z4>4#/%*OB8 Da*n*.7 k[Ƿ?kd{ -Ħ#T~X@<.8̞֩ſh@ DiU1(+c ֳ6\3V1;Dk*~mj ?'S}Z"o{i Y]Wh;'fn}Ϟoݽ4-ϞY\CJ],/*jpW 񂂓ŎC@ӋWӻefAD! sW;b 7{ #g%|ZG2<oS j}}8^F,{fTtpp[x<,a7y] ٹUP tY! ?l!(}dCH@@Q`'j [|<ܟwVu aS<<̆ןXYoMƹpĠNIENDB`gdalautotest-3.0.4/gcore/data/mandrilmini_12bitjpeg.tif0000644003401500001440000001574613614004466022537 0ustar rouaultusersII*@@@8(S[ C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222      !" #12$3A%BQ &CRa5bq  '()*+,-./046789:;<=>?@DEFGHIJKLMNOPSTUVWXYZ[\]^_`cdefghijklmnoprstuvwxyz{|}~    !1A"Qa2qB #Rb $r3CS 5  %&'()*+,-./046789:;<=>?@DEFGHIJKLMNOPTUVWXYZ[\]^_`cdefghijklmnopstuvwxyz{|}~ @@" ?.6;:nRdXu(I?MKWCM)bwUrhdc* ~1u$hʰn7J}zH!a{7Lqv(de9è3G"̆=h?E|xH}rLR_*)Txsv6[n\x(ڷ-e9틷4$=RMxذHR YD)יecs<@ud)XsBReT)Be'g:NyͭO4D7:TمK $-=Hz[E/aYAr.˚ƭK[ΚV]W6[->̗yPE_/~B8E%OB=jn^VdPϨ"t;I[06Reg_cDɊxf66Mɗ[Y="r% 0z#Jܳ $a|os5űHVrq#$īufɭq#WϥPS'bU )O$'o%VIB qϩ15;+m-ݭ!ȩ+J.јRV%Er{~ݏe \b2}%jOqʤRΦ | ${'c@}R+UTMoKxmG]euNcacl-V&m@w9]ef,416 tY; )to簰{*ȂŴ3 8KIn6!2)A>rdz}}mN\_]H({K{"%Uֹd7lv_ڄiLӌwlΤLSaOnJdn9Njӣf zHH8~GAk8_qzxKFƸ\RowM*+k'Ϲsie3j5|Ws{m8k"pN!v;eq_TqEfOd%M]]C=?55mauR'd>ț c e:s2cXo7y׍-v#1>> y^_-Ys1oNdQ͍3 ZmXXcPKe}]TܡHefPڐBo: #j ;ALMq⯎h[, ).gò~N?4ۗ('VqGz+q $O<Td>qfؤzɍB6[.jAI} M8FO,`K¡EکVmc"4q Uos 5P7 1s6.Rh뼳"swFh_m_rYیL@3SF?U*(:eՙem9&b)fDb_-iM0ur,1\˻NS;Ai I0 Y*Ma4Q:n?IAwǫ^Yyl-Oj!"F<'\;Ll+-%|JX,{)RPG%$')*)ɿ3-m.)^"+o> ]uHߤTT7ZXRMQƙjCw^pc*́U&ԙni B)] _M&GP3?ow 7"Ϸ%5UBB@s],D , -hZ`XP:D{1~ӣg[f$jm[l%4NGi)pU6m#O2:mH4TH %Mtٍjì2RiO[㫛pOd-Udvx%itĎI&x& diq[>[md8a+*e̤n n_mmh2"'3o':3uDkIj*0L2^ĕ¡u+>(ͳϰOR/Q9NC !n U/GޘK.ElE[nW̋Z O.nq+a^TVelYC5FRb"X$>H 1.{(ɶw* bvhtmkN>)Ac3%|~iHvMl,ghӳa!OH\cEf.̌mn1M/Iԕv6"daFTVSmj;q~T"МItO.=rb*$b.[E4uzzYpI`87"UBH6[VW\w]E{c8ۘ(DQW$w{$Ͳk\CS&imYjP}}҂PHM34#!iCݤ 6%F)gʷSlǰN*5W3W8+wWmWΫB1OWӳj&V6` 173Ăvc .Q{`"cY/+y݂H_ [} ('Rl FqJr_x 5 aGWA(Pd]ؿ=企Pf5[%Ǚƪz6iQ0Uv$7Ǐ4^rƧ\ M.4Oj/Ts^֧NД~H! TUhOpcw ^e5tߠ]B "Z%=v8 Z+!.kmTs, O,X$h<U@yo*Ɵ sLּmv۝; -cA݇i!vЭ~nqa1qk$5Zi{nɋYUV>aWßt\LmL:/{ŲJv@%0j*@ YBV]-6xl,M:U9^2r:j{0SEQb#1 &UU/Nd*Ʊtػ z67ϳV%;^4;ԧK;nN.Ylv쳵\Mh-\k]rYeJ$}ԴCA]Ī>'~<(alGB^\MOe07YBOvrf#vX0E'hj7nL1ar.2es(`JGe})sEghN@L|ȍt]wm]l0qdqYlX= Ycޙh Product mul uint16.tif 1 int32.tif 1 float32.tif 1 gdalautotest-3.0.4/gcore/data/cint_sar.tif0000644003401500001440000000306313614004466020154 0ustar rouaultusersII*#4$';6 t?M#+0SM<Tz$!/0  xS :*2ڝ'1r@|?5^0@d@^I r@Gzt0@d@ü@w/r@'10@ڝü@?5^Ir@p= 0@#WGS 84| ES 6356.7590000 19970718024119087 347.339 6378.1440000 7.9040000 INCREASE 0001667400297672 24.824 ERS2-SLC-6.1 ESA -65.311 3.9900000 345.5885834 90.000 ITALY 16.213 GEM6 gdalautotest-3.0.4/gcore/data/classictiff_one_strip_be_long.tif0000644003401500001440000000022313614004466024406 0ustar rouaultusersMM* Ssgdalautotest-3.0.4/gcore/data/zero.bin.zip.zip0000644003401500001440000002765713614004466020740 0ustar rouaultusersPKy:D=z/ J zero.bin.zipUT RRux 1;Q~u66HB S2Ic 1*v7i .\ FJ㼈Ne:) ,)P%rq 8 gdalautotest-3.0.4/gcore/data/huge4GB.tif0000644003401500001440000000062113614004466017574 0ustar rouaultusersII* Sgdalautotest-3.0.4/gcore/data/md_ge_rgb_0010000_rpc.txt0000644003401500001440000000727213614004466022046 0ustar rouaultusersLINE_OFF: +003754.00 pixels SAMP_OFF: +002322.00 pixels LAT_OFF: +48.87720000 degrees LONG_OFF: +002.29450000 degrees HEIGHT_OFF: +0086.000 meters LINE_SCALE: +003754.00 pixels SAMP_SCALE: +002323.00 pixels LAT_SCALE: +00.03410000 degrees LONG_SCALE: +000.03220000 degrees HEIGHT_SCALE: +0194.000 meters LINE_NUM_COEFF_1: +1.332808717180063E-03 LINE_NUM_COEFF_2: +5.838338162123306E-03 LINE_NUM_COEFF_3: -1.009752051699543E+00 LINE_NUM_COEFF_4: +1.639109825624001E-02 LINE_NUM_COEFF_5: -3.367124587841246E-03 LINE_NUM_COEFF_6: +3.418139814295659E-05 LINE_NUM_COEFF_7: +2.725217573364683E-03 LINE_NUM_COEFF_8: -1.136478536138676E-04 LINE_NUM_COEFF_9: -1.430144921673965E-03 LINE_NUM_COEFF_10: -4.442510706499226E-05 LINE_NUM_COEFF_11: -3.740719192328738E-06 LINE_NUM_COEFF_12: -4.428194095535854E-07 LINE_NUM_COEFF_13: +7.849067991883587E-07 LINE_NUM_COEFF_14: +6.476944648851546E-08 LINE_NUM_COEFF_15: -4.190764824024006E-07 LINE_NUM_COEFF_16: +2.604509233052465E-07 LINE_NUM_COEFF_17: +2.007288008283678E-06 LINE_NUM_COEFF_18: +6.807783035194681E-07 LINE_NUM_COEFF_19: -7.324069126732976E-06 LINE_NUM_COEFF_20: -2.911374890048000E-08 LINE_DEN_COEFF_1: +1.000000000000000E+00 LINE_DEN_COEFF_2: +3.341837949953734E-03 LINE_DEN_COEFF_3: +1.413402151478922E-03 LINE_DEN_COEFF_4: -3.353868240228878E-03 LINE_DEN_COEFF_5: -7.939341430848480E-07 LINE_DEN_COEFF_6: +1.464661833433624E-06 LINE_DEN_COEFF_7: +5.420601966045226E-06 LINE_DEN_COEFF_8: +2.418517479122306E-07 LINE_DEN_COEFF_9: -2.618804378743522E-07 LINE_DEN_COEFF_10: -1.850052696212862E-08 LINE_DEN_COEFF_11: +2.901758478182862E-09 LINE_DEN_COEFF_12: +1.157680773655344E-10 LINE_DEN_COEFF_13: +2.757379458383255E-11 LINE_DEN_COEFF_14: -1.778307031557182E-09 LINE_DEN_COEFF_15: +1.779638859280152E-10 LINE_DEN_COEFF_16: +2.892540510908146E-11 LINE_DEN_COEFF_17: -3.343682187106984E-09 LINE_DEN_COEFF_18: +2.503226828621465E-10 LINE_DEN_COEFF_19: +1.847198034982663E-09 LINE_DEN_COEFF_20: +7.216457909015041E-10 SAMP_NUM_COEFF_1: -3.557872238818793E-04 SAMP_NUM_COEFF_2: +1.016335494334002E+00 SAMP_NUM_COEFF_3: +1.513605650641709E-02 SAMP_NUM_COEFF_4: +4.807724237164880E-03 SAMP_NUM_COEFF_5: +7.961689402077173E-04 SAMP_NUM_COEFF_6: -3.071423942177348E-03 SAMP_NUM_COEFF_7: +1.276322859089735E-04 SAMP_NUM_COEFF_8: +3.396901539018378E-03 SAMP_NUM_COEFF_9: +2.537122290529346E-05 SAMP_NUM_COEFF_10: -1.745893731269933E-05 SAMP_NUM_COEFF_11: +8.549458117912697E-06 SAMP_NUM_COEFF_12: +2.396282052729133E-07 SAMP_NUM_COEFF_13: -1.422798782176754E-06 SAMP_NUM_COEFF_14: -9.988283137037749E-07 SAMP_NUM_COEFF_15: -3.107467131977126E-06 SAMP_NUM_COEFF_16: +7.970237235722655E-10 SAMP_NUM_COEFF_17: -4.086946530323194E-07 SAMP_NUM_COEFF_18: +2.451278005502479E-06 SAMP_NUM_COEFF_19: +9.020228618443205E-07 SAMP_NUM_COEFF_20: +1.710486731803557E-09 SAMP_DEN_COEFF_1: +1.000000000000000E+00 SAMP_DEN_COEFF_2: +3.341837949953734E-03 SAMP_DEN_COEFF_3: +1.413402151478922E-03 SAMP_DEN_COEFF_4: -3.353868240228878E-03 SAMP_DEN_COEFF_5: -7.939341430848480E-07 SAMP_DEN_COEFF_6: +1.464661833433624E-06 SAMP_DEN_COEFF_7: +5.420601966045226E-06 SAMP_DEN_COEFF_8: +2.418517479122306E-07 SAMP_DEN_COEFF_9: -2.618804378743522E-07 SAMP_DEN_COEFF_10: -1.850052696212862E-08 SAMP_DEN_COEFF_11: +2.901758478182862E-09 SAMP_DEN_COEFF_12: +1.157680773655344E-10 SAMP_DEN_COEFF_13: +2.757379458383255E-11 SAMP_DEN_COEFF_14: -1.778307031557182E-09 SAMP_DEN_COEFF_15: +1.779638859280152E-10 SAMP_DEN_COEFF_16: +2.892540510908146E-11 SAMP_DEN_COEFF_17: -3.343682187106984E-09 SAMP_DEN_COEFF_18: +2.503226828621465E-10 SAMP_DEN_COEFF_19: +1.847198034982663E-09 SAMP_DEN_COEFF_20: +7.216457909015041E-10 ERR_BIAS: 0004.98 meters ERR_RAND: 0000.50 meters gdalautotest-3.0.4/gcore/data/1bit.bmp0000644003401500001440000000027613614004466017210 0ustar rouaultusersBM>(  0x 0 00x 0x 0 00x 0x 0 00x 0x 0 00xgdalautotest-3.0.4/gcore/data/weird_mercator_2sp.tif0000644003401500001440000000166513614004466022152 0ustar rouaultusersII*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 ^ vP Fn@n@Q|a՜OA#      )#        @TXAr@L7A`G@?Global Mercator|NAD83|gdalautotest-3.0.4/gcore/data/ycbcr_11_lzw.tif0000644003401500001440000000727613614004466020663 0ustar rouaultusersII* APhd& Db82@#g/\w-_/ {bJT $د? ;ST`9u6:c:#,е-CXӲ:+è<)D >C?/8>bʾʎìS;M30H -B6cц2;ŵWU-(=@ S4b=`=8*Sz KXbCȌ"C ќ/Cc8#-s1$0!e˶u;03% M?,گԯ˪( /%YA> C5y(0(&$al34SaMDc20`u:IVod+L)h8rfFD#3@C&pg+IuԐyt=q  E8֚N!/[² r LXP`9K8k 85Cix (d@pa0v bLGi|G)zʜ'[i@0}+)P /?BD+1A8,(dh71D JDx&{yN5dԚPJP`e { 3PJBT*-D<G1gL Da<@iB`m-D$)aSBNg!4xb 0Gg?0CI&"q0qX~!46ZPTPt 9p⢧)"r)L?D@Pb$(phU,  a=Ɗ$j(r T9#NtjT*$q AP*]spChHa A L= S ч-^}Z魨H9ZjS!<Bt`>W ' v(" " dA TaXf^ žr P9炉 ~H A3` pm UX"Cu8NCl%j;DPS!VE!->qCA! #䩃t 9>Bn3a*`C b 싳ȟRKQ$AT@d@cps E*TvrxFΤSJf !4 d ;!@6n <CMT9=2؅:x? Q"p't FpT4SUN֢LC$'z5o=ɐh HRXt 60°`$aB G H4Xel9mƒ| XIw D*iDV,7 0xhrD$y !K6C)sgiЦ50@ҠCѸB{ 7+C%ja\0y<hM!E H1; C+Bho08 N((aA5Ӥ(Bh .Q-!L; Bxwh=cD spKA4!9b0.ʑyHp3a0fΞ49y~8 !,X}>#G : v >, `Ā' @@` ]`\6)\ ) ` `- cDvE@ma,M!a '`f jT    `R[@ *, *o-梪b@{m`&z ߭BIBv  a ` /#Dm$  Hb/"ؿKs(R %@bA! ԏ   a  nP\  O , *NB@HcF4 `C,"M6 @ '   ! 'NO*x`V@ /% @g`BJEK þ FSMf0b(N%{4  r .@X Ғԁ   ʸ> YVrk"d* $$. kf`d$ 09 >.@ @r'v3*M@t 0पS`At g!`A `@35`nm bz ( 6 ? ' (a( V Ň%oX jVM`! 3aD:O|@`@`0 {@nm7@ ܀{ A@ !$( : 6Ъ1Y$ *s6N+b(X `A2! 9|AjBZl H,P-nX` 8 @ !'8 8)!+  `@QNJah Jx8q 5@%A%N!a=2!T`a C ($  l! IN< ''pF vCLE/gdalautotest-3.0.4/gcore/data/rpc.vrt0000644003401500001440000001556213614004466017176 0ustar rouaultusers 16201 15184 97 39.7792 125.7510 16480 15217 501 0.0900 0.1096 +5.105608E-04 -2.921055E-02 -1.010407E+00 -1.743729E-02 -6.604239E-05 -7.871396E-05 +3.027877E-04 -4.323587E-04 -2.624751E-04 +6.186490E-06 +1.084676E-06 +5.389738E-05 +4.145232E-06 +3.911486E-07 +1.772434E-05 +3.302960E-06 +3.006106E-06 +1.662606E-05 +6.051677E-06 -2.657667E-08 +1.000000E+00 -9.652128E-05 +2.488346E-04 +3.089019E-04 -2.120170E-06 +4.117913E-07 +1.370009E-06 +1.357281E-05 -4.174324E-06 -3.146787E-06 -7.724587E-06 +3.524480E-04 -1.303224E-05 -8.507679E-07 -1.670972E-05 +6.781061E-06 +5.602262E-07 +1.161421E-05 +4.681872E-06 +5.593931E-08 -2.429563E-04 +1.028320E+00 -3.360972E-02 +3.519600E-03 -6.568341E-04 +5.951139E-04 -3.875716E-04 +1.260622E-04 -5.273817E-05 -4.418981E-06 -3.520581E-06 -2.502760E-04 -4.167704E-05 -5.973233E-05 -1.438949E-04 +7.603041E-06 +2.358136E-06 -2.275274E-05 +1.602657E-06 -1.716541E-07 +1.000000E+00 +7.765620E-05 +6.568707E-04 -6.270621E-04 +5.163170E-05 +6.979463E-06 +2.476334E-07 +1.083558E-04 -4.043734E-05 -5.819288E-05 +1.778201E-07 +5.665202E-05 +6.927205E-06 +6.793485E-07 +3.604209E-05 -4.057103E-07 -8.291254E-07 +1.010650E-05 -2.875552E-06 +5.142751E-08 "R" 2006-10-20T08:42:31.000000Z "005553965230_01_P001" "ORStandard2A" "P" "None" 32380 30324 "LV2A" "Corrected" "Off" 16 "None" 125.64811494 39.86920881 97.12 125.86059820 39.86415940 97.12 125.85336381 39.68933367 97.12 125.64141633 39.69435205 97.12 4.656600e-02 3.980000e-01 "GeoTIFF" "QB02" "FullSwath" "Forward" "1010010005448B00" 2006-10-20T02:50:52.250677Z 6900.11 0.00260865 0.679 0.651 0.665 63.87 37.90 170.1 39.7 192.3 70.6 -17.8 -1.0 17.8 4.4 0.036 "CC" 18 "R" "R" 28119 2006-10-20T02:50:52.526006Z 2006-10-20T02:50:52.526006Z "WE" 6378137.0000 298.257223563 (0.000,0.000,0.000) "UTM" 1 51 "N" (0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000,0.000000000) "M" 726487.50014544 4416597.29999868 0.0 0.60 0.60 0.60 726487.50014544 4416597.29999868 97.12 744681.30024945 4416597.29999863 97.12 744681.30024444 4397169.89999862 97.12 726487.50014252 4397169.89999869 97.12 "Base Elevation" 97.12 0 byte.tif 1 gdalautotest-3.0.4/gcore/data/md_dg_2.XML0000644003401500001440000001233613614004466017526 0ustar rouaultusers 24.06 2011-05-01T13:00:00.000000Z 000000000000_00_P000 000000000000000 ORStandard2A Multi None 50 50 LV2A Standard 1 Corrected Off 16 None GeoTIFF WV03 FullSwath Forward 000000000000000 2011-05-01T13:00:00.000000Z 5.000010000000000e+03 2.000000000000000e-04 1.315000000000000e+00 1.315000000000000e+00 1.315000000000000e+00 1.286000000000000e+00 1.287000000000000e+00 1.286000000000000e+00 1.301000000000000e+00 2.229000000000000e+01 1.060000000000000e+01 3.300000000000000e+00 2.700000000000000e-02 MTF R R 337 2015-01-01T00:00:00.000000Z 2015-01-01T00:00:00.000000Z WE 6.378137000000000e+06 2.982572235630000e+02 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 Base Elevation 9.166000000000000e+01 0 WV03 Multi RPC00B 1.490000000000000e+00 5.800000000000000e-01 812 850 4.187910000000000e+01 1.257980000000000e+01 95 938 1152 1.500000000000000e-02 2.250000000000000e-02 501 -6.181087000000000e-03 3.510113000000000e-02 -1.109763000000000e+00 -8.245545999999999e-02 -1.574358000000000e-04 -1.151270000000000e-05 3.785618000000000e-04 -1.617343000000000e-04 3.392421000000000e-03 1.557476000000000e-05 2.094558000000000e-07 -6.314111999999999e-08 7.033553000000000e-07 5.121700000000000e-08 2.389848000000000e-06 -1.042301000000000e-05 -1.402098000000000e-06 6.953425000000000e-08 -5.038526000000000e-07 -9.876126999999999e-08 1.000000000000000e+00 4.696998000000000e-05 -3.057960000000000e-03 -8.778793000000000e-05 -3.454986000000000e-07 1.971646000000000e-08 1.083809000000000e-06 -1.723920000000000e-06 9.397055000000000e-06 1.371016000000000e-06 1.647007000000000e-08 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 -3.685579000000000e-08 0.000000000000000e+00 -2.476523000000000e-07 0.000000000000000e+00 -1.941040000000000e-03 1.012973000000000e+00 2.549412000000000e-02 3.146281000000000e-02 -7.701827000000001e-05 4.973536000000000e-04 -2.130061000000000e-04 9.757313000000000e-04 7.164101000000000e-06 -5.137094000000000e-06 -3.021765000000000e-07 9.135275000000000e-07 -5.816734000000000e-08 1.078116000000000e-07 -1.534883000000000e-07 0.000000000000000e+00 -1.318700000000000e-07 9.196606000000000e-07 -3.705506000000000e-07 0.000000000000000e+00 1.000000000000000e+00 9.641438000000000e-04 1.340215000000000e-04 -4.371442000000000e-04 4.849114000000000e-08 0.000000000000000e+00 -6.403717000000000e-08 9.014668000000000e-07 0.000000000000000e+00 -2.387648000000000e-07 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 gdalautotest-3.0.4/gcore/data/3376.aux0000644003401500001440000005070013614004466016767 0ustar rouaultusersEHFA_HEADER_TAG@# R ErootrootAcRRDependentFileEimg_DependentFileA Z3376.tifn R0 Layer_170373667Eimg_LayerentFileA  nn sDependentLayerNameEimg_DependentLayerNameA{Layer_2n R?Layer_370373667Eimg_LayerentFileAmJCEhfa_Layer73667Ehfa_LayerentFileA{262144:Cdata,}RasterDMS,.p9DependentLayerNameEimg_DependentLayerNameAALayer_3 LcMap_InfoLayerNameEprj_MapInfotLayerNameA$Hotine Oblique Mercator (Variant A)@i&k)A\0AXQ*ȵ@-[1t@uj \@EmetersI cProjectionyerNameEprj_ProParametersNameAF$Hotine Oblique Mercator (Variant A) qt?45T?A9u@9RF߱?Wjrg?b jGRS 1980@TXA?XA@k{?˯MXAL[DatumtionyerNameEprj_DatumametersNameA GDM 2000.nqn Map_InfoLayerNameEprj_MapInfotLayerNameA$Hotine Oblique Mercator (Variant A)"@i&k)A:\0AXQ*ȵ@R[1t@uj \@jmetersnn ProjectionyerNameEprj_ProParametersNameAF$ Hotine Oblique Mercator (Variant A) 7 qt?45T?A9u@9RF߱?Wjrg? GRS 1980@TXA?XA@k{?˯MXA GDM 2000   831,.mJn@ cEhfa_Layer73667Ehfa_LayerentFileA{262144:Cdata,}RasterDMS,.D Ic^ DependentLayerNameEimg_DependentLayerNameAf Layer_1cR Layer_270373667Eimg_LayerentFileAmJAn Ehfa_Layer73667Ehfa_LayerentFileA{262144:Cdata,}RasterDMS,.LHc  Descriptor_TableeEdsc_TableametersNameA #Bin_Function#eeEdsc_BinFunctionsNameAo@ :Histogramion#eeEdsc_ColumntionsNameA cFHistogramParametersEimg_StatisticsParameters830Ao@Hc0StatisticsrametersEsta_Statisticsarameters830Ao@XA׈a@]@@Y@ZI@c>FStatisticsParametersEimg_StatisticsParameters830Ao@q0n  Descriptor_TableeEdsc_TableametersNameA#Bin_Function#eeEdsc_BinFunctionsNameAo@"Histogramion#eeEdsc_ColumntionsNameA,n FHistogramParametersEimg_StatisticsParameters830Ao@0n v0StatisticsrametersEsta_Statisticsarameters830Ao@ ͛c@d@e@|sC@n &FStatisticsParametersEimg_StatisticsParameters830Ao@o@5o@ ,.q [DatumtionyerNameEprj_DatumametersNameAsMap_InfoLayerNameEprj_MapInfotLayerNameA$Hotine Oblique Mercator (Variant A)$@i&k)A<\0AXQ*ȵ@T[1t@uj \@lmetersp4ProjectionyerNameEprj_ProParametersNameAF$ Hotine Oblique Mercator (Variant A) 9qt?45T?A9u@9RF߱?Wjrg? GRS 1980@TXA?XA@k{?˯MXAs:[DatumtionyerNameEprj_DatumametersNameA BGDM 2000U,@@?@@???@@???@@?@@?@@@@@@?@@@@@@"@@@@@@@ @@ @?@@ @"@@@@ @"@@"@"@@@,@"@"@*@3@"@6@*@2@*@.@9@0@0@1@2@6@9@3@:@@@A@>@@@B@F@A@H@N@K@W@@S@Z@V@Y@@Z@`@e@l@k@n@`g@b@[@^@^@U@T@S@K@P@K@J@J@L@I@F@K@I@F@C@A@@@G@D@A@B@E@>@B@A@A@5@>@B@=@A@@@B@=@B@=@4@=@@@>@A@9@<@@@@@7@6@9@:@:@A@@@?@A@B@<@G@E@D@B@D@B@D@D@B@K@?@B@C@A@G@>@F@D@G@F@E@D@A@M@@@F@F@D@H@I@E@@@C@@@A@E@A@C@@@;@?@?@;@;@:@8@9@9@>@5@;@3@6@>@9@5@1@,@1@8@4@3@2@*@$@2@7@0@.@5@*@&@(@"@&@1@@"@ @(@2@$@ @@"@@ @@@ @@@^@c ion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,.@????????@?@@??@@??@@@@?@@@@@@?@@?@@@?@@@@@@@@@@@"@&@@ @ @@$@"@$@0@2@0@&@9@1@*@3@1@(@3@3@6@8@5@7@:@;@=@=@=@;@@@A@7@;@@@B@@@<@@@D@>@A@E@C@>@A@C@@@G@A@D@I@@@F@D@D@B@C@D@F@?@B@F@F@B@@@D@E@H@J@I@M@E@C@D@I@K@D@E@I@H@L@I@J@P@L@Q@S@O@@U@R@U@X@^@Z@@_@d@k@p@ s@s@pp@e@_@Z@\@@Z@U@@Q@P@@Q@L@I@R@I@H@G@A@I@H@E@A@E@=@D@A@<@>@7@7@;@?@6@5@3@6@<@3@8@7@*@8@*@9@5@.@4@=@,@.@&@&@7@"@&@&@*@0@,@,@2@(@0@.@,@$@0@.@"@.@&@&@@*@ @ @ @$@@@ @ @@$@@@Q@sx>x5lDescriptor_TableeEdsc_TableametersNameA=4t#Bin_Function#eeEdsc_BinFunctionsNameA@P@@@@?@@@??@@ @?@@@@@@ @$@"@ @@@@&@@@&@(@$@$@&@@ @@"@@"@(@,@$@(@@"@(@0@(@@4@$@*@"@1@(@1@(@,@8@.@4@&@"@6@3@2@5@@@9@5@=@9@7@4@A@?@@@<@9@8@?@B@C@;@9@B@D@@@C@E@B@:@A@I@F@H@G@C@E@E@K@C@I@B@A@G@B@C@9@A@A@D@A@C@?@:@;@;@<@@@<@@@8@B@;@8@9@?@5@5@5@9@6@.@=@5@=@5@3@3@6@9@9@9@8@4@3@5@5@9@@@,@:@:@?@6@@@7@8@<@9@6@>@;@8@B@8@C@8@@@C@4@@@G@;@D@J@D@G@D@N@@Q@@S@P@S@T@X@@V@@[@_@ j@`k@`h@@q@`k@@c@b@[@[@@V@V@M@R@K@P@G@K@G@C@C@A@B@;@<@<@>@5@=@5@6@&@*@.@ @$@"@8@0@$@.@(@@*@"@2@$@&@"@@@,@(@@@@@ @ @ @@@*@$@@S@x54Histogramion#eeEdsc_ColumntionsNameA4>FHistogramParametersEimg_StatisticsParameters830Ax>?x?0StatisticsrametersEsta_Statisticsarameters830Ao@8b}7c@@f@`h@682YwL@>(@FStatisticsParametersEimg_StatisticsParameters830Ao@;AD c@MRRDInfoList3667Eimg_RRDInfoListeA @ErdasBino3 AA3376.rrd(:Layer_1:_ss_2_)3A7%n@cA=RRDNamesList667Eimg_RRDNamesListA AErdasBino3AA3376.rrd(:Layer_1:_ss_2_)B n xBMRRDInfoList3667Eimg_RRDInfoListeA BErdasBino3BB3376.rrd(:Layer_2:_ss_2_)B7%An EC=RRDNamesList667Eimg_RRDNamesListA MCErdasBino3`ChC3376.rrd(:Layer_2:_ss_2_)ODDMRRDInfoList3667Eimg_RRDInfoListeA DErdasBino3D%D3376.rrd(:Layer_3:_ss_2_)GD7%CD=RRDNamesList667Eimg_RRDNamesListA DErdasBino3DD3376.rrd(:Layer_3:_ss_2_){1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:oEmif_String,algorithm,0:poEmif_String,nameList,0:pLdimList,}Eimg_RRDInfoList,.gdalautotest-3.0.4/gcore/data/int32.raw0000644003401500001440000000310013614004466017310 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gcore/data/one_strip_nobytecount.tif0000644003401500001440000000414313614004466023005 0ustar rouaultusersII* Sgdalautotest-3.0.4/gcore/data/zero_stored.bin.zip.start0000644003401500001440000000012313614004466022626 0ustar rouaultusersPK-y:D50zero.binUT mRoRux **gdalautotest-3.0.4/gcore/data/md_ov.pvl0000644003401500001440000001010713614004466017472 0ustar rouaultuserscopyright = "(C) COPYRIGHT Some corp"; companyName = "Some corp"; BEGIN_GROUP = productInfo; distributionMediaType = "Removable Storage"; productCloudCoverPercentage = 999; bytesPerPixel = 2; bitsPerPixel = 11; spacingUnits = "meters"; numScanLines = 27482; pixelsPerScanLine = 8016; lineSpacing = 1.1371980000e+00; pixelSpacing = 1.1076250000e+00; BEGIN_GROUP = geodeticCorners; BEGIN_GROUP = upperLeftCorner; latitude = 52.2791997000; longitude = 35.4363643000; height = 193.6229706000; END_GROUP = upperLeftCorner; BEGIN_GROUP = upperRightCorner; latitude = 52.2804926000; longitude = 35.5612666000; height = 233.9022567000; END_GROUP = upperRightCorner; BEGIN_GROUP = lowerRightCorner; latitude = 51.9848272000; longitude = 35.5634170000; height = 266.1853238000; END_GROUP = lowerRightCorner; BEGIN_GROUP = lowerLeftCorner; latitude = 51.9811444000; longitude = 35.4341051000; height = 255.8598057000; END_GROUP = lowerLeftCorner; END_GROUP = geodeticCorners; BEGIN_GROUP = rationalFunctions; errorBias = 0.7895830000; errorRand = 1.7287800000; lineFitQuality = 0.0057215900; pixelFitQuality = 0.0158227000; lineOffset = 13741; pixelOffset = 4008; latitudeOffset = 52.1348000000; longitudeOffset = 35.4988000000; heightOffset = 187; lineScale = 13741; pixelScale = 4008; latitudeScale = 0.1547000000; longitudeScale = 0.0652000000; heightScale = 300; lineNumeratorCoefficients = ( 1.2139522000e-02, 8.6390366000e-03, -1.0458370000e+00, -8.2485745000e-03, -3.2943662000e-03, -3.3170669000e-05, 3.7925112000e-04, -5.0983401000e-05, -3.6218128000e-02, 5.6195798000e-06, -5.3882431000e-05, -1.3020458000e-06, -1.1081245000e-03, -3.5808830000e-07, 1.2169698000e-04, -5.6299113000e-03, -4.3150790000e-07, 1.3301807000e-06, -1.2818923000e-04, 7.7889933000e-10 ); lineDenominatorCoefficients = ( 9.9995149000e-01, -9.6804321000e-05, -2.8251791000e-04, 2.9551446000e-06, 1.0020444000e-03, 4.8453322000e-05, 2.2753464000e-04, -1.3037612000e-04, 6.8270975000e-03, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00 ); pixelNumeratorCoefficients = ( 1.6220009000e-05, 1.0258227000e+00, -6.6448174000e-05, 5.3314395000e-03, 1.8613264000e-02, 9.8160833000e-04, -1.5204838000e-03, -9.5200268000e-04, -2.4161835000e-04, -7.8873504000e-06, -1.4208021000e-04, -5.9193119000e-05, 1.1618314000e-02, 3.8508625000e-07, 1.0335565000e-04, 2.6322693000e-05, -1.7564084000e-06, -2.0334168000e-05, -2.3851960000e-05, 1.0874163000e-09 ); pixelDenominatorCoefficients = ( 9.9987815000e-01, 1.4307523000e-05, -1.2830986000e-04, 8.0826420000e-05, -2.0080269000e-04, -2.0646704000e-05, -1.3486920000e-04, -5.3956955000e-05, 1.1118010000e-02, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00 ); END_GROUP = rationalFunctions; END_GROUP = productInfo; BEGIN_GROUP = sensorInfo; satelliteName = "OV-3"; sensorName = "PAN"; END_GROUP = sensorInfo; BEGIN_GROUP = inputImageInfo; firstLineAcquisitionDateTime = 2013-07-01T15:00:00.000000Z; circularError = 3.3038700000; acquisitionOrbitNumber = 0000; idsNumberScanLines = 27482; idsPixelsPerScanLine = 8016; idsLineSpacing = 1.1371980000e+00; idsPixelSpacing = 1.1076250000e+00; END_GROUP = inputImageInfo; END; gdalautotest-3.0.4/gcore/hfa_srs.py0000755003401500001440000001017113614005321016724 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: hfa_srs.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write round-tripping of SRS for HFA/Imagine format. # 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 pytest from osgeo import gdal from osgeo import osr ############################################################################### # Write a HFA/Imagine and read it back to check its SRS epsg_list = [ [3814, False], # tmerc [2036, True], # sterea # failure caused by revert done in r22803 # [2046, False], # tmerc south oriented DISABLED. Not sure about the axis [3031, True], # stere [32661, True], # stere [3408, False], # laea [2062, False], # lcc #[2065, True], # krovak South-West [5221, True], # krovak east-north [2066, False], # cass [2964, False], # aea [3410, True], # cea [3786, True], # eqc [2934, True], # merc [27200, False], # nzmg [2057, True], # omerc [29100, False], # poly [2056, False], # somerc [2027, False], # utm [4326, False], # longlat ] @pytest.mark.parametrize( 'epsg_code,epsg_broken', epsg_list, ids=[str(r[0]) for r in epsg_list], ) def test_hfa_srs(epsg_code, epsg_broken): sr = osr.SpatialReference() sr.ImportFromEPSG(epsg_code) ds = gdal.GetDriverByName('HFA').Create('/vsimem/TestHFASRS.img', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/TestHFASRS.img') wkt = ds.GetProjectionRef() sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None gdal.Unlink('/vsimem/TestHFASRS.img') # For EPSG:2065. Those 2 datums are translated into D_S_JTSK in ESRI WKT... So for the purpose of # comparison, substitute one for another if sr.ExportToWkt().find('"System_Jednotne_Trigonometricke_Site_Katastralni_Ferro"') != -1 and \ sr2.ExportToWkt().find('"System_Jednotne_Trigonometricke_Site_Katastralni"') != -1: wkt2 = sr2.ExportToWkt().replace('"System_Jednotne_Trigonometricke_Site_Katastralni"', '"System_Jednotne_Trigonometricke_Site_Katastralni_Ferro"') sr2.SetFromUserInput(wkt2) if (epsg_code == 4326 and sr2.GetAuthorityCode(None) != '4326') or sr.IsSame(sr2) != 1: if epsg_broken: pytest.xfail('did not get expected SRS. known to be broken currently. FIXME!') print(sr) print(sr2) assert False, 'did not get expected SRS' def test_hfa_srs_wisconsin_tmerc(): ds = gdal.Open('data/esri_103300_NAD_1983_HARN_WISCRS_Adams_County_Meters_transverse_mercator.img') wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) assert sr.GetAuthorityCode(None) == '103300' gdalautotest-3.0.4/gcore/testnonboundtoswig.py0000755003401500001440000002572213614005322021267 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: testnonboundtoswig.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDAL functions not bound SWIG with ctypes # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011-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 sys import version_info from osgeo import gdal import pytest try: import ctypes except ImportError: pass import gdaltest gdal_handle_init = False gdal_handle = None gdal_handle_stdcall = None ############################################################################### # find_libgdal() def find_libgdal(): return gdaltest.find_lib('gdal') ############################################################################### # Init @pytest.fixture(scope='module', autouse=True) def setup(): global gdal_handle_init, gdal_handle, gdal_handle_stdcall if gdal_handle_init: if gdal_handle is None: pytest.skip() return gdal_handle gdal_handle_init = True try: ctypes.cdll except ImportError: pytest.skip('cannot find ctypes') name = find_libgdal() if name is None: pytest.skip() print('Found libgdal we are running against : %s' % name) static_version = gdal.VersionInfo(None) # short_static_version = static_version[0:2] try: gdal_handle = ctypes.cdll.LoadLibrary(name) try: gdal_handle_stdcall = ctypes.windll.LoadLibrary(name) except: gdal_handle_stdcall = gdal_handle gdal_handle_stdcall.GDALVersionInfo.argtypes = [ctypes.c_char_p] gdal_handle_stdcall.GDALVersionInfo.restype = ctypes.c_char_p dynamic_version = gdal_handle_stdcall.GDALVersionInfo(None) if version_info >= (3, 0, 0): dynamic_version = str(dynamic_version, 'utf-8') if dynamic_version != static_version: gdal_handle = None gdal_handle_stdcall = None pytest.skip('dynamic version(%s) does not match static version (%s)' % (dynamic_version, static_version)) return gdal_handle except Exception: print('cannot find gdal shared object') pytest.skip() ############################################################################### # Call GDALDestroyDriverManager() def GDALDestroyDriverManager(): if gdal_handle_stdcall: gdal_handle_stdcall.GDALDestroyDriverManager.argtypes = [] gdal_handle_stdcall.GDALDestroyDriverManager.restype = None gdal_handle_stdcall.GDALDestroyDriverManager() ############################################################################### # Call OGRCleanupAll() def OGRCleanupAll(): if gdal_handle_stdcall: gdal_handle_stdcall.OGRCleanupAll.argtypes = [] gdal_handle_stdcall.OGRCleanupAll.restype = None gdal_handle_stdcall.OGRCleanupAll() ############################################################################### # Call OSRCleanup() def OSRCleanup(): if gdal_handle: gdal_handle.OSRCleanup.argtypes = [] gdal_handle.OSRCleanup.restype = None gdal_handle.OSRCleanup() ############################################################################### # Test GDALSimpleImageWarp def test_testnonboundtoswig_GDALSimpleImageWarp(): src_ds = gdal.Open('data/byte.tif') gt = src_ds.GetGeoTransform() wkt = src_ds.GetProjectionRef() src_ds = None gdal_handle_stdcall.GDALOpen.argtypes = [ctypes.c_char_p, ctypes.c_int] gdal_handle_stdcall.GDALOpen.restype = ctypes.c_void_p gdal_handle_stdcall.GDALClose.argtypes = [ctypes.c_void_p] gdal_handle_stdcall.GDALClose.restype = None gdal_handle.GDALCreateGenImgProjTransformer2.restype = ctypes.c_void_p gdal_handle.GDALCreateGenImgProjTransformer2.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] gdal_handle_stdcall.GDALSimpleImageWarp.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p] gdal_handle_stdcall.GDALSimpleImageWarp.restype = ctypes.c_int gdal_handle.GDALDestroyGenImgProjTransformer.argtypes = [ctypes.c_void_p] gdal_handle.GDALDestroyGenImgProjTransformer.restype = None out_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 20, 20, 1) out_ds.SetGeoTransform(gt) out_ds.SetProjection(wkt) out_ds = None filename = 'data/byte.tif' if version_info >= (3, 0, 0): filename = bytes(filename, 'utf-8') native_in_ds = gdal_handle_stdcall.GDALOpen(filename, gdal.GA_ReadOnly) assert native_in_ds is not None filename = '/vsimem/out.tif' if version_info >= (3, 0, 0): filename = bytes(filename, 'utf-8') native_out_ds = gdal_handle_stdcall.GDALOpen(filename, gdal.GA_Update) assert native_out_ds is not None pTransformerArg = gdal_handle.GDALCreateGenImgProjTransformer2(native_in_ds, native_out_ds, None) assert pTransformerArg is not None ret = gdal_handle_stdcall.GDALSimpleImageWarp(native_in_ds, native_out_ds, 0, None, gdal_handle_stdcall.GDALGenImgProjTransform, pTransformerArg, None, None, None) assert ret == 1 gdal_handle.GDALDestroyGenImgProjTransformer(pTransformerArg) gdal_handle_stdcall.GDALClose(native_in_ds) gdal_handle_stdcall.GDALClose(native_out_ds) ds = gdal.Open('/vsimem/out.tif') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink('/vsimem/out.tif') assert cs == 4672 ############################################################################### # Test VRT derived bands with callback functions implemented in Python! def GDALTypeToCTypes(gdaltype): if gdaltype == gdal.GDT_Byte: return ctypes.c_ubyte if gdaltype == gdal.GDT_Int16: return ctypes.c_short if gdaltype == gdal.GDT_UInt16: return ctypes.c_ushort if gdaltype == gdal.GDT_Int32: return ctypes.c_int if gdaltype == gdal.GDT_UInt32: return ctypes.c_uint if gdaltype == gdal.GDT_Float32: return ctypes.c_float if gdaltype == gdal.GDT_Float64: return ctypes.c_double return None def my_pyDerivedPixelFunc(papoSources, nSources, pData, nBufXSize, nBufYSize, eSrcType, eBufType, nPixelSpace, nLineSpace): if nSources != 1: print(nSources) print('did not get expected nSources') return 1 srcctype = GDALTypeToCTypes(eSrcType) if srcctype is None: print(eSrcType) print('did not get expected eSrcType') return 1 dstctype = GDALTypeToCTypes(eBufType) if dstctype is None: print(eBufType) print('did not get expected eBufType') return 1 if nPixelSpace != gdal.GetDataTypeSize(eBufType) / 8: print(nPixelSpace) print('did not get expected nPixelSpace') return 1 if (nLineSpace % nPixelSpace) != 0: print(nLineSpace) print('did not get expected nLineSpace') return 1 nLineStride = (int)(nLineSpace / nPixelSpace) srcValues = ctypes.cast(papoSources[0], ctypes.POINTER(srcctype)) dstValues = ctypes.cast(pData, ctypes.POINTER(dstctype)) for j in range(nBufYSize): for i in range(nBufXSize): dstValues[j * nLineStride + i] = srcValues[j * nBufXSize + i] return 0 def test_testnonboundtoswig_VRTDerivedBands(): DerivedPixelFuncType = ctypes.CFUNCTYPE(ctypes.c_int, # ret CPLErr ctypes.POINTER(ctypes.c_void_p), # void **papoSources ctypes.c_int, # int nSources ctypes.c_void_p, # void *pData ctypes.c_int, # int nBufXSize ctypes.c_int, # int nBufYSize ctypes.c_int, # GDALDataType eSrcType ctypes.c_int, # GDALDataType eBufType ctypes.c_int, # int nPixelSpace ctypes.c_int) # int nLineSpace my_cDerivedPixelFunc = DerivedPixelFuncType(my_pyDerivedPixelFunc) # CPLErr CPL_DLL CPL_STDCALL GDALAddDerivedBandPixelFunc( const char *pszName, # GDALDerivedPixelFunc pfnPixelFunc ); gdal_handle_stdcall.GDALAddDerivedBandPixelFunc.argtypes = [ctypes.c_char_p, DerivedPixelFuncType] gdal_handle_stdcall.GDALAddDerivedBandPixelFunc.restype = ctypes.c_int funcName = "pyDerivedPixelFunc" if version_info >= (3, 0, 0): funcName = bytes(funcName, 'utf-8') ret = gdal_handle_stdcall.GDALAddDerivedBandPixelFunc(funcName, my_cDerivedPixelFunc) assert ret == 0 vrt_xml = """ pyDerivedPixelFunc Byte data/byte.tif 1 """ src_ds = gdal.Open('data/byte.tif') ref_cs = src_ds.GetRasterBand(1).Checksum() ref_data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20) src_ds = None ds = gdal.Open(vrt_xml) got_cs = ds.GetRasterBand(1).Checksum() got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20) ds = None assert ref_cs == got_cs, 'wrong checksum' assert ref_data == got_data gdalautotest-3.0.4/gcore/vsicurl_streaming.py0000755003401500001440000001013413614005322021037 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsicurl_streaming.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsicurl_streaming # 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 time from osgeo import gdal import gdaltest import pytest ############################################################################### # def test_vsicurl_streaming_1(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() gdal.SetConfigOption('GDAL_HTTP_CONNECTTIMEOUT', '5') fp = gdal.VSIFOpenL('/vsicurl_streaming/http://download.osgeo.org/gdal/data/usgsdem/cded/114p01_0100_deme.dem', 'rb') gdal.SetConfigOption('GDAL_HTTP_CONNECTTIMEOUT', None) if fp is None: if gdaltest.gdalurlopen('http://download.osgeo.org/gdal/data/usgsdem/cded/114p01_0100_deme.dem', timeout=4) is None: pytest.skip('cannot open URL') pytest.fail() if gdal.VSIFTellL(fp) != 0: gdal.VSIFCloseL(fp) pytest.fail() data = gdal.VSIFReadL(1, 50, fp) if data.decode('ascii') != ' 114p01DEMe Base Ma': gdal.VSIFCloseL(fp) pytest.fail() if gdal.VSIFTellL(fp) != 50: gdal.VSIFCloseL(fp) pytest.fail() gdal.VSIFSeekL(fp, 0, 0) if gdal.VSIFTellL(fp) != 0: gdal.VSIFCloseL(fp) pytest.fail() data = gdal.VSIFReadL(1, 50, fp) if data.decode('ascii') != ' 114p01DEMe Base Ma': gdal.VSIFCloseL(fp) pytest.fail() if gdal.VSIFTellL(fp) != 50: gdal.VSIFCloseL(fp) pytest.fail() time.sleep(0.5) gdal.VSIFSeekL(fp, 2001, 0) data_2001 = gdal.VSIFReadL(1, 20, fp) if data_2001.decode('ascii') != '7-32767-32767-32767-': gdal.VSIFCloseL(fp) pytest.fail(data_2001) if gdal.VSIFTellL(fp) != 2001 + 20: gdal.VSIFCloseL(fp) pytest.fail() gdal.VSIFSeekL(fp, 0, 2) if gdal.VSIFTellL(fp) != 9839616: gdal.VSIFCloseL(fp) pytest.fail() nRet = len(gdal.VSIFReadL(1, 10, fp)) if nRet != 0: gdal.VSIFCloseL(fp) pytest.fail() gdal.VSIFSeekL(fp, 2001, 0) data_2001_2 = gdal.VSIFReadL(1, 20, fp) if gdal.VSIFTellL(fp) != 2001 + 20: gdal.VSIFCloseL(fp) pytest.fail() if data_2001 != data_2001_2: gdal.VSIFCloseL(fp) pytest.fail() gdal.VSIFSeekL(fp, 1024 * 1024 + 100, 0) data = gdal.VSIFReadL(1, 20, fp) if data.decode('ascii') != '67-32767-32767-32767': gdal.VSIFCloseL(fp) pytest.fail(data) if gdal.VSIFTellL(fp) != 1024 * 1024 + 100 + 20: gdal.VSIFCloseL(fp) pytest.fail() gdal.VSIFCloseL(fp) gdalautotest-3.0.4/gcore/envi_read.py0000755003401500001440000000475613614005322017250 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: envi_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from an ENVI file. # Author: Andrey Kiselev, dron@remotesensing.org # # See also: gdrivers/envi.py for a driver focused on coordinate system support. # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # # 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. ############################################################################### import pytest from osgeo import gdal import gdaltest ############################################################################### # Test GDAL_READDIR_LIMIT_ON_OPEN def test_envi_1(): gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', '1') ds = gdal.Open('data/utmsmall.raw') filelist = ds.GetFileList() gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', None) assert len(filelist) == 2, 'did not get expected file list.' ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.raw', 4672), ('int16.raw', 4672), ('uint16.raw', 4672), ('int32.raw', 4672), ('uint32.raw', 4672), ('float32.raw', 4672), ('float64.raw', 4672), # ('cfloat32.raw', 5028), # ('cfloat64.raw', 5028), ] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('ENVI') def test_envi_open(filename, checksum): ut = gdaltest.GDALTest('ENVI', filename, 1, checksum) ut.testOpen() gdalautotest-3.0.4/gcore/tiff_srs.py0000755003401500001440000005406013614005322017124 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: tiff_srs.py 7e34e3f619f8275ac06db151fd7c283ed9f49f89 2020-01-27 14:38:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write round-tripping of SRS for GeoTIFF format. # Author: Even Rouault, # ############################################################################### # Copyright (c) 2011-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 gdaltest import pytest from osgeo import gdal from osgeo import osr ############################################################################### # Test fix for #4677: def test_tiff_srs_without_linear_units(): sr = osr.SpatialReference() sr.ImportFromProj4('+proj=vandg +datum=WGS84') ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_without_linear_units.tif', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/tiff_srs_without_linear_units.tif') wkt = ds.GetProjectionRef() sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None gdal.Unlink('/vsimem/tiff_srs_without_linear_units.tif') assert sr.IsSame(sr2) == 1, 'did not get expected SRS' ############################################################################### # Test writing a COMPDCS without VerticalCSType def test_srs_write_compd_cs(): sr = osr.SpatialReference() # EPSG:7400 without the Authority sr.SetFromUserInput("""COMPD_CS["unknown", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936265, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.5969213], UNIT["grad",0.01570796326794897], AUTHORITY["EPSG","4807"]], VERT_CS["NGF-IGN69 height", VERT_DATUM["Nivellement General de la France - IGN69",2005, AUTHORITY["EPSG","5119"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Up",UP]]]""") ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_compd_cs.tif', 1, 1) ds.SetProjection(sr.ExportToWkt()) ds = None gdal.SetConfigOption('GTIFF_REPORT_COMPD_CS', 'YES') ds = gdal.Open('/vsimem/tiff_srs_compd_cs.tif') wkt = ds.GetProjectionRef() gdal.SetConfigOption('GTIFF_REPORT_COMPD_CS', None) sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None gdal.Unlink('/vsimem/tiff_srs_compd_cs.tif') assert sr.IsSame(sr2) == 1, 'did not get expected SRS' ############################################################################### # Test reading a COMPDCS without VerticalCSType def test_srs_read_compd_cs(): gdal.SetConfigOption('GTIFF_REPORT_COMPD_CS', 'YES') ds = gdal.Open('data/vertcs_user_defined.tif') wkt = ds.GetProjectionRef() gdal.SetConfigOption('GTIFF_REPORT_COMPD_CS', None) assert wkt == 'COMPD_CS["NAD27 / UTM zone 11N + EGM2008 height",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"]],VERT_CS["EGM2008 height",VERT_DATUM["EGM2008 geoid",2005,AUTHORITY["EPSG","1027"]],UNIT["foot",0.3048,AUTHORITY["EPSG","9002"]],AXIS["Up",UP]]]' ############################################################################### # Test reading a GeoTIFF with both StdParallel1 and ScaleAtNatOrigin defined (#5791) def test_tiff_srs_weird_mercator_2sp(): ds = gdal.Open('data/weird_mercator_2sp.tif') gdal.PushErrorHandler() wkt = ds.GetProjectionRef() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'warning expected' sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) ds = None sr = osr.SpatialReference() # EPSG:7400 without the Authority sr.SetFromUserInput("""PROJCS["Global Mercator", GEOGCS["NAD83", DATUM["North_American_Datum_1983", SPHEROID["GRS 1980",6378137,298.2572221010002, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6269"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4269"]], PROJECTION["Mercator_2SP"], PARAMETER["standard_parallel_1",47.667], PARAMETER["central_meridian",0], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""") assert sr.IsSame(sr2) == 1, 'did not get expected SRS' ############################################################################### # Test reading ESRI WGS_1984_Web_Mercator_Auxiliary_Sphere def test_tiff_srs_WGS_1984_Web_Mercator_Auxiliary_Sphere(): ds = gdal.Open('data/WGS_1984_Web_Mercator_Auxiliary_Sphere.tif') wkt = ds.GetProjectionRef() sr = osr.SpatialReference() sr.SetFromUserInput(wkt) wkt = sr.ExportToPrettyWkt() ds = None assert wkt == """PROJCS["WGS 84 / Pseudo-Mercator", 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["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], 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"]]""" ############################################################################### # Test writing and reading various angular units def test_tiff_srs_angular_units(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (arc-second)", DATUM["WGS_1984 (arc-second)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["arc-second",4.848136811095361e-06]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["arc-second",4.84813681109536E-06' in wkt ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (arc-minute)", DATUM["WGS_1984 (arc-minute)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["arc-minute",0.0002908882086657216]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["arc-minute",0.000290888208665722]' in wkt ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (grad)", DATUM["WGS_1984 (grad)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["grad",0.01570796326794897]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["grad",0.015707963267949' in wkt ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (gon)", DATUM["WGS_1984 (gon)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["gon",0.01570796326794897]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["gon",0.015707963267949]' in wkt ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (radian)", DATUM["WGS_1984 (radian)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["radian",1]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["radian",1]' in wkt ds = None ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_angular_units.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 (custom)", DATUM["WGS_1984 (custom)", SPHEROID["WGS 84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["custom",1.23]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_angular_units.tif') wkt = ds.GetProjectionRef() assert 'UNIT["custom",1.23]' in wkt ds = None gdal.Unlink('/vsimem/tiff_srs_angular_units.tif') ############################################################################### # Test writing and reading a unknown datum but with a known ellipsoid def test_tiff_custom_datum_known_ellipsoid(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_custom_datum_known_ellipsoid.tif', 1, 1) ds.SetProjection("""GEOGCS["WGS 84 based", DATUM["WGS_1984_based", SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]]], PRIMEM["Greenwich",0], UNIT["degree",1]]""") ds = None ds = gdal.Open('/vsimem/tiff_custom_datum_known_ellipsoid.tif') wkt = ds.GetProjectionRef() assert wkt == 'GEOGCS["WGS 84 based",DATUM["WGS_1984_based",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' ds = None gdal.Unlink('/vsimem/tiff_custom_datum_known_ellipsoid.tif') ############################################################################### # Test reading a GeoTIFF file with only PCS set, but with a ProjLinearUnitsGeoKey # override to another unit (us-feet) ... (#6210) def test_tiff_srs_epsg_2853_with_us_feet(): old_val = gdal.GetConfigOption('GTIFF_IMPORT_FROM_EPSG') gdal.SetConfigOption('GTIFF_IMPORT_FROM_EPSG', 'YES') ds = gdal.Open('data/epsg_2853_with_us_feet.tif') gdal.SetConfigOption('GTIFF_IMPORT_FROM_EPSG', old_val) wkt = ds.GetProjectionRef() assert 'PARAMETER["false_easting",11482916.66' in wkt and 'UNIT["us_survey_feet",0.3048006' in wkt and '2853' not in wkt gdal.SetConfigOption('GTIFF_IMPORT_FROM_EPSG', 'NO') ds = gdal.Open('data/epsg_2853_with_us_feet.tif') gdal.SetConfigOption('GTIFF_IMPORT_FROM_EPSG', old_val) wkt = ds.GetProjectionRef() assert 'PARAMETER["false_easting",11482916.66' in wkt and 'UNIT["us_survey_feet",0.3048006' in wkt and '2853' not in wkt ############################################################################### # Test reading a SRS with a PCSCitationGeoKey = "LUnits = ..." def test_tiff_srs_PCSCitationGeoKey_LUnits(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_srs_PCSCitationGeoKey_LUnits.tif', 1, 1) ds.SetProjection("""PROJCS["UTM Zone 32, Northern Hemisphere", GEOGCS["GRS 1980(IUGG, 1980)", DATUM["unknown", SPHEROID["GRS80",6378137,298.257222101], TOWGS84[0,0,0,0,0,0,0]], 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",50000000], PARAMETER["false_northing",0], UNIT["Centimeter",0.01]]""") ds = None ds = gdal.Open('/vsimem/tiff_srs_PCSCitationGeoKey_LUnits.tif') wkt = ds.GetProjectionRef() assert wkt == 'PROJCS["UTM Zone 32, Northern Hemisphere",GEOGCS["GRS 1980(IUGG, 1980)",DATUM["unknown",SPHEROID["GRS80",6378137,298.257222101],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",9],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",50000000],PARAMETER["false_northing",0],UNIT["Centimeter",0.01],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ds = None gdal.Unlink('/vsimem/tiff_srs_PCSCitationGeoKey_LUnits.tif') ############################################################################### # Test reading a geotiff key ProjectionGeoKey (Short,1): Unknown-3856 def test_tiff_srs_projection_3856(): ds = gdal.Open('data/projection_3856.tif') wkt = ds.GetProjectionRef() ds = None 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 ############################################################################### # Test reading a geotiff with a LOCAL_CS and a Imagine citation def test_tiff_srs_imagine_localcs_citation(): ds = gdal.Open('data/imagine_localcs_citation.tif') wkt = ds.GetProjectionRef() ds = None assert wkt.startswith('LOCAL_CS["Projection Name = UTM Units = meters GeoTIFF Units = meters"') ############################################################################### # Test reading a geotiff with a EPSG code and a TOWGS84 key that must # override the default coming from EPSG def test_tiff_srs_towgs84_override(): ds = gdal.Open('data/gtiff_towgs84_override.tif') wkt = ds.GetProjectionRef() ds = None assert 'TOWGS84[584.8,67,400.3,0.105,0.013,-2.378,10.29]' in wkt, wkt ############################################################################### # Test reading PCSCitationGeoKey (#7199) def test_tiff_srs_pcscitation(): ds = gdal.Open('data/pcscitation.tif') wkt = ds.GetProjectionRef() ds = None assert wkt.startswith('PROJCS["mycitation",') ############################################################################### # Test reading file with ProjectedCSTypeGeoKey and GeographicTypeGeoKey def test_tiff_srs_ProjectedCSTypeGeoKey_GeographicTypeGeoKey(): ds = gdal.Open('data/utmsmall.tif') sr = ds.GetSpatialRef() assert sr.GetAuthorityCode(None) == "26711" def _test_tiff_srs(sr, expect_fail): """ This is not a test by itself; it gets called by the tests below. """ ds = gdal.GetDriverByName('GTiff').Create('/vsimem/TestTiffSRS.tif', 1, 1) ds.SetSpatialRef(sr) ds = None ds = gdal.Open('/vsimem/TestTiffSRS.tif') wkt = ds.GetProjectionRef() sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt) if 'Miller' in wkt: # Trick so that the EXTENSION node with a PROJ string including +R_A is added sr2.ImportFromProj4(sr2.ExportToProj4()) ds = None gdal.Unlink('/vsimem/TestTiffSRS.tif') if sr.IsSame(sr2) != 1: if expect_fail: pytest.xfail('did not get expected SRS. known to be broken currently. FIXME!') print(sr) print(sr2) assert False, 'did not get expected SRS' else: if expect_fail: print('Succeeded but expected fail...') ############################################################################### # Write a geotiff and read it back to check its SRS epsg_list = [ [3814, False], # tmerc [28991, False], # sterea # [2046, False], # tmerc south oriented DISABLED. Not sure about the axis [3031, False], # polar stere (ticket #3220) [3032, False], # polar stere (ticket #3220) [32661, False], # stere [3408, False], # laea [2062, False], # lcc 1SP #[2065, True], # krovak South-West [5221, True], # krovak east-north [2066, False], # cass [2964, False], # aea [3410, False], # cea [3786, False], # eqc spherical, method=9823 [32663, False], # eqc elliptical, method=9842 [4087, False], # eqc WGS 84 / World Equidistant Cylindrical method=1028 [4088, False], # eqc World Equidistant Cylindrical (Sphere) method=1029 [2934, False], # merc [27200, False], # nzmg [2057, False], # omerc Hotine_Oblique_Mercator_Azimuth_Center [3591, False], # omerc Hotine_Oblique_Mercator [29100, False], # poly [2056, False], # somerc [2027, False], # utm [4326, False], # longlat [26943, False], # lcc 2SP, [4328, False], # geocentric [3994, False], # mercator 2SP [26920, False], # UTM NAD83 special case [26720, False], # UTM NAD27 special case [32630, False], # UTM WGS84 north special case [32730, False], # UTM WGS84 south special case [22700, False], # unknown datum 'Deir_ez_Zor' [3857, True], # Web Mercator [102113, True], # ESRI WGS_1984_Web_Mercator ] @pytest.mark.parametrize('use_epsg_code', [0, 1]) @pytest.mark.parametrize( 'epsg_code,epsg_proj4_broken', epsg_list, ids=[str(r[0]) for r in epsg_list], ) def test_tiff_srs(use_epsg_code, epsg_code, epsg_proj4_broken): sr = osr.SpatialReference() if epsg_code > 32767: sr.SetFromUserInput('ESRI:' + str(epsg_code)) else: sr.ImportFromEPSG(epsg_code) expect_fail = False if use_epsg_code == 0: proj4str = sr.ExportToProj4() # print(proj4str) sr.SetFromUserInput(proj4str) expect_fail = epsg_proj4_broken _test_tiff_srs(sr, expect_fail) @pytest.mark.parametrize( 'proj4', [ '+proj=eqdc +lat_0=%.16g +lon_0=%.16g +lat_1=%.16g +lat_2=%.16g" +x_0=%.16g +y_0=%.16g' % (1, 2, 3, 4, 5, 6), '+proj=mill +R_A +lon_0=2 +x_0=3 +y_0=4 +datum=WGS84 +units=m +no_defs', '+proj=gnom +lat_0=%.16g +lon_0=%.16g +x_0=%.16g +y_0=%.16g' % (1, 2, 3, 4), '+proj=robin +lon_0=%.16g +x_0=%.16g +y_0=%.16g' % (1, 2, 3), '+proj=sinu +lon_0=%.16g +x_0=%.16g +y_0=%.16g' % (1, 2, 3), ], ids=[ 'eqdc', 'mill', 'gnom', 'robin', 'sinu', ] ) def test_tiff_srs_proj4(proj4): sr = osr.SpatialReference() sr.SetFromUserInput(proj4) _test_tiff_srs(sr, False) def test_tiff_srs_towgs84_from_epsg_do_not_write_it(): filename = '/vsimem/test.tif' ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) srs_in = osr.SpatialReference() srs_in.ImportFromEPSG(31468) srs_in.AddGuessedTOWGS84() assert srs_in.HasTOWGS84() ds.SetSpatialRef(srs_in) ds = None ds = gdal.Open(filename) with gdaltest.config_option('OSR_ADD_TOWGS84_ON_IMPORT_FROM_EPSG', 'NO'): srs = ds.GetSpatialRef() assert not srs.HasTOWGS84() def test_tiff_srs_towgs84_from_epsg_force_write_it(): filename = '/vsimem/test.tif' ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) srs_in = osr.SpatialReference() srs_in.ImportFromEPSG(31468) srs_in.AddGuessedTOWGS84() assert srs_in.HasTOWGS84() with gdaltest.config_option('GTIFF_WRITE_TOWGS84', 'YES'): ds.SetSpatialRef(srs_in) ds = None ds = gdal.Open(filename) with gdaltest.config_option('OSR_ADD_TOWGS84_ON_IMPORT_FROM_EPSG', 'NO'): srs = ds.GetSpatialRef() assert srs.HasTOWGS84() def test_tiff_srs_towgs84_with_epsg_code_but_non_default_TOWGS84(): filename = '/vsimem/test.tif' ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) srs_in = osr.SpatialReference() srs_in.SetFromUserInput("""PROJCS["DHDN / 3-degree Gauss-Kruger zone 4", GEOGCS["DHDN", DATUM["Deutsches_Hauptdreiecksnetz", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], TOWGS84[1,2,3,4,5,6,7], AUTHORITY["EPSG","6314"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4314"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",12], PARAMETER["scale_factor",1], PARAMETER["false_easting",4500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Northing",NORTH], AXIS["Easting",EAST], AUTHORITY["EPSG","31468"]]""") ds.SetSpatialRef(srs_in) ds = None ds = gdal.Open(filename) srs = ds.GetSpatialRef() assert srs.GetTOWGS84() == (1,2,3,4,5,6,7) def test_tiff_srs_write_epsg3857(): tmpfile = '/vsimem/tmp.tif' ds = gdal.GetDriverByName('GTiff').Create(tmpfile, 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(3857) ds.SetSpatialRef(sr) ds = None ds = gdal.Open(tmpfile) assert sr.GetName() == 'WGS 84 / Pseudo-Mercator' assert sr.GetAuthorityCode(None) == '3857' f = gdal.VSIFOpenL(tmpfile, 'rb') data = gdal.VSIFReadL(1, 100000, f) gdal.VSIFCloseL(f) gdal.Unlink(tmpfile) assert b"ESRI PE String" not in data gdalautotest-3.0.4/gcore/identify.py0000755003401500001440000000675113614005322017124 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: identify.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test functioning of the IdentifyDriver functionality. # 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 ############################################################################### # Simple try of identify driver on a tiff file. def test_identify_1(): file_list = gdal.ReadDir('data') dr = gdal.IdentifyDriver('data/byte.tif', file_list) assert dr is not None and dr.GetDescription() == 'GTiff', \ 'Got wrong driver for byte.tif' ############################################################################### # Test a file that won't be recognised. def test_identify_2(): file_list = gdal.ReadDir('data') dr = gdal.IdentifyDriver('data/byte.pnm.aux.xml', file_list) assert dr is None, 'Got a driver for byte.pnm.aux.xml!' ############################################################################### # Try identify on a directory. def test_identify_3(): dr = gdal.IdentifyDriver('data') assert dr is None, 'Got a driver for data directory!' ############################################################################### # Try IdentifyDriverEx def test_identify_4(): dr = gdal.IdentifyDriverEx('data/byte.tif') assert dr is not None and dr.GetDescription() == 'GTiff', \ 'Got wrong driver for byte.tif' dr = gdal.IdentifyDriverEx('data/byte.tif', gdal.OF_RASTER) assert dr is not None and dr.GetDescription() == 'GTiff', \ 'Got wrong driver for byte.tif' dr = gdal.IdentifyDriverEx('data/byte.tif', gdal.OF_VECTOR) assert dr is None, 'Got wrong driver for byte.tif' dr = gdal.IdentifyDriverEx('data/byte.tif', allowed_drivers=['HFA']) assert dr is None, 'Got wrong driver for byte.tif' dr = gdal.IdentifyDriverEx('../gdrivers/data/aea.dat', sibling_files=['aea.dat']) assert dr is None, 'Got a driver, which was not expected!' dr = gdal.IdentifyDriverEx('../gdrivers/data/aea.dat', sibling_files=['aea.dat', 'aea.hdr']) assert dr is not None, 'Did not get a driver!' gdalautotest-3.0.4/gcore/geoloc.py0000755003401500001440000000353613614005322016557 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: geoloc.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test Geolocation warper. # 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 ############################################################################### # Verify warped result. def test_geoloc_1(): tst = gdaltest.GDALTest('VRT', 'warpsst.vrt', 1, 61818) return tst.testOpen(check_filelist=False) gdalautotest-3.0.4/gcore/rat.py0000755003401500001440000001106013614005322016064 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: rat.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RasterAttributeTables services from Python. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2009, 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 gdaltest from osgeo import gdal import pytest ############################################################################### # Create a raster attribute table. def test_rat_1(): gdaltest.saved_rat = None try: rat = gdal.RasterAttributeTable() except: pytest.skip() rat.CreateColumn('Value', gdal.GFT_Integer, gdal.GFU_MinMax) rat.CreateColumn('Count', gdal.GFT_Integer, gdal.GFU_PixelCount) rat.SetRowCount(3) rat.SetValueAsInt(0, 0, 10) rat.SetValueAsInt(0, 1, 100) rat.SetValueAsInt(1, 0, 11) rat.SetValueAsInt(1, 1, 200) rat.SetValueAsInt(2, 0, 12) rat.SetValueAsInt(2, 1, 90) rat2 = rat.Clone() assert rat2.GetColumnCount() == 2, 'wrong column count' assert rat2.GetRowCount() == 3, 'wrong row count' assert rat2.GetNameOfCol(1) == 'Count', 'wrong column name' assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'wrong column usage' assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, 'wrong column type' assert rat2.GetRowOfValue(11.0) == 1, 'wrong row for value' assert rat2.GetValueAsInt(1, 1) == 200, 'wrong field value.' gdaltest.saved_rat = rat ############################################################################### # Save a RAT in a file, written to .aux.xml, read it back and check it. def test_rat_2(): if gdaltest.saved_rat is None: pytest.skip() ds = gdal.GetDriverByName('PNM').Create('tmp/rat_2.pnm', 100, 90, 1, gdal.GDT_Byte) ds.GetRasterBand(1).SetDefaultRAT(gdaltest.saved_rat) ds = None ds = gdal.Open('tmp/rat_2.pnm', gdal.GA_Update) rat2 = ds.GetRasterBand(1).GetDefaultRAT() assert rat2.GetColumnCount() == 2, 'wrong column count' assert rat2.GetRowCount() == 3, 'wrong row count' assert rat2.GetNameOfCol(1) == 'Count', 'wrong column name' assert rat2.GetUsageOfCol(1) == gdal.GFU_PixelCount, 'wrong column usage' assert rat2.GetTypeOfCol(1) == gdal.GFT_Integer, 'wrong column type' assert rat2.GetRowOfValue(11.0) == 1, 'wrong row for value' assert rat2.GetValueAsInt(1, 1) == 200, 'wrong field value.' # unset the RAT ds.GetRasterBand(1).SetDefaultRAT(None) ds = None ds = gdal.Open('tmp/rat_2.pnm') rat = ds.GetRasterBand(1).GetDefaultRAT() ds = None assert rat is None, 'expected a NULL RAT.' gdal.GetDriverByName('PNM').Delete('tmp/rat_2.pnm') gdaltest.saved_rat = None ############################################################################### # Save an empty RAT (#5451) def test_rat_3(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/rat_3.tif', 1, 1) ds.GetRasterBand(1).SetDefaultRAT(gdal.RasterAttributeTable()) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/rat_3.tif') ############################################################################## gdalautotest-3.0.4/gcore/gdal_stats.py0000755003401500001440000006344413614005322017440 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: gdal_stats.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test core numeric operations and statistics calculations # Author: Mateusz Loskot # ############################################################################### # Copyright (c) 2007, Mateusz Loskot # Copyright (c) 2009-2012, Even Rouault # # 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. ############################################################################### import os import struct import shutil import gdaltest from osgeo import gdal import pytest ############################################################################### # Test handling NaN with GDT_Float32 data def test_stats_nan_1(): gdaltest.gtiff_drv = gdal.GetDriverByName('GTiff') if gdaltest.gtiff_drv is None: pytest.skip() stats = (50.0, 58.0, 54.0, 2.5819888974716) shutil.copyfile('data/nan32.tif', 'tmp/nan32.tif') t = gdaltest.GDALTest('GTiff', 'tmp/nan32.tif', 1, 874, filename_absolute=1) ret = t.testOpen(check_approx_stat=stats, check_stat=stats) gdal.GetDriverByName('GTiff').Delete('tmp/nan32.tif') return ret ############################################################################### # Test handling NaN with GDT_Float64 data def test_stats_nan_2(): if gdaltest.gtiff_drv is None: pytest.skip() stats = (50.0, 58.0, 54.0, 2.5819888974716) shutil.copyfile('data/nan64.tif', 'tmp/nan64.tif') t = gdaltest.GDALTest('GTiff', 'tmp/nan64.tif', 1, 4414, filename_absolute=1) ret = t.testOpen(check_approx_stat=stats, check_stat=stats) gdal.GetDriverByName('GTiff').Delete('tmp/nan64.tif') return ret ############################################################################### # Test stats on signed byte (#3151) def test_stats_signedbyte(): if gdaltest.gtiff_drv is None: pytest.skip() stats = (-128.0, 127.0, -0.2, 80.64) shutil.copyfile('data/stats_signed_byte.img', 'tmp/stats_signed_byte.img') t = gdaltest.GDALTest('HFA', 'tmp/stats_signed_byte.img', 1, 11, filename_absolute=1) ret = t.testOpen(check_approx_stat=stats, check_stat=stats, skip_checksum=1) gdal.GetDriverByName('HFA').Delete('tmp/stats_signed_byte.img') return ret ############################################################################### # Test return of GetStatistics() when we don't have stats and don't # force their computation (#3572) def test_stats_dont_force(): gdal.Unlink('data/byte.tif.aux.xml') ds = gdal.Open('data/byte.tif') stats = ds.GetRasterBand(1).GetStatistics(0, 0) assert stats == [0, 0, 0, -1], 'did not get expected stats' ############################################################################### # Test statistics when stored nodata value doesn't accurately match the nodata # value used in the imagery (#3573) def test_stats_approx_nodata(): shutil.copyfile('data/minfloat.tif', 'tmp/minfloat.tif') try: os.remove('tmp/minfloat.tif.aux.xml') except OSError: pass ds = gdal.Open('tmp/minfloat.tif') stats = ds.GetRasterBand(1).GetStatistics(0, 1) md = ds.GetRasterBand(1).GetMetadata() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None os.remove('tmp/minfloat.tif.aux.xml') ds = gdal.Open('tmp/minfloat.tif') minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None os.remove('tmp/minfloat.tif') if nodata != -3.4028234663852886e+38: print("%.18g" % nodata) pytest.fail('did not get expected nodata') assert stats == [-3.0, 5.0, 1.0, 4.0], 'did not get expected stats' assert md == {'STATISTICS_MEAN': '1', 'STATISTICS_MAXIMUM': '5', 'STATISTICS_MINIMUM': '-3', 'STATISTICS_STDDEV': '4', 'STATISTICS_VALID_PERCENT': '50'}, \ 'did not get expected metadata' assert minmax == (-3.0, 5.0), 'did not get expected minmax' ############################################################################### # Test read and copy of dataset with nan as nodata value (#3576) def test_stats_nan_3(): src_ds = gdal.Open('data/nan32_nodata.tif') nodata = src_ds.GetRasterBand(1).GetNoDataValue() assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) out_ds = gdaltest.gtiff_drv.CreateCopy('tmp/nan32_nodata.tif', src_ds) del out_ds src_ds = None try: os.remove('tmp/nan32_nodata.tif.aux.xml') except OSError: pass ds = gdal.Open('tmp/nan32_nodata.tif') nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None gdaltest.gtiff_drv.Delete('tmp/nan32_nodata.tif') assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test reading a VRT with a complex source that define nan as band nodata # and complex source nodata (#3576) def test_stats_nan_4(): ds = gdal.Open('data/nan32_nodata.vrt') cs = ds.GetRasterBand(1).Checksum() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert cs == 874, 'did not get expected checksum' assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test reading a VRT with a complex source that define 0 as band nodata # and complex source nodata (nan must be translated to 0 then) (#3576) def test_stats_nan_5(): ds = gdal.Open('data/nan32_nodata_nan_to_zero.vrt') cs = ds.GetRasterBand(1).Checksum() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert cs == 978, 'did not get expected checksum' assert nodata == 0, ('expected nan, got %f' % nodata) ############################################################################### # Test reading a warped VRT with nan as src nodata and dest nodata (#3576) def test_stats_nan_6(): ds = gdal.Open('data/nan32_nodata_warp.vrt') cs = ds.GetRasterBand(1).Checksum() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert cs == 874, 'did not get expected checksum' assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test reading a warped VRT with nan as src nodata and 0 as dest nodata (#3576) def test_stats_nan_7(): ds = gdal.Open('data/nan32_nodata_warp_nan_to_zero.vrt') cs = ds.GetRasterBand(1).Checksum() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert cs == 978, 'did not get expected checksum' assert nodata == 0, ('expected nan, got %f' % nodata) ############################################################################### # Test reading a warped VRT with zero as src nodata and nan as dest nodata (#3576) def test_stats_nan_8(): ds = gdal.Open('data/nan32_nodata_warp_zero_to_nan.vrt') cs = ds.GetRasterBand(1).Checksum() nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert cs == 874, 'did not get expected checksum' assert gdaltest.isnan(nodata), ('expected nan, got %f' % nodata) ############################################################################### # Test statistics computation when nodata = +/- inf def stats_nodata_inf_progress_cbk(value, string, extra): # pylint: disable=unused-argument extra[0] = value def test_stats_nodata_inf(): ds = gdal.GetDriverByName('HFA').Create('/vsimem/stats_nodata_inf.img', 3, 1, 1, gdal.GDT_Float32) ds.GetRasterBand(1).SetNoDataValue(gdaltest.neginf()) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, struct.pack('f', gdaltest.neginf()), buf_type=gdal.GDT_Float32) ds.GetRasterBand(1).WriteRaster(1, 0, 1, 1, struct.pack('f', 1), buf_type=gdal.GDT_Float32) ds.GetRasterBand(1).WriteRaster(2, 0, 1, 1, struct.pack('f', -2), buf_type=gdal.GDT_Float32) ds.GetRasterBand(1).Checksum() user_data = [0] stats = ds.GetRasterBand(1).ComputeStatistics(False, stats_nodata_inf_progress_cbk, user_data) assert user_data[0] == 1.0, 'did not get expected pct' ds = None gdal.GetDriverByName('HFA').Delete('/vsimem/stats_nodata_inf.img') assert stats == [-2.0, 1.0, -0.5, 1.5], 'did not get expected stats' ############################################################################### # Test deserialization of +inf/-inf values written by Linux and Windows def stats_nodata_check(filename, expected_nodata): ds = gdal.Open(filename) nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None assert nodata == expected_nodata, 'did not get expected nodata value' def test_stats_nodata_neginf_linux(): return stats_nodata_check('data/stats_nodata_neginf.tif', gdaltest.neginf()) def test_stats_nodata_neginf_msvc(): return stats_nodata_check('data/stats_nodata_neginf_msvc.tif', gdaltest.neginf()) def test_stats_nodata_posinf_linux(): return stats_nodata_check('data/stats_nodata_posinf.tif', gdaltest.posinf()) def test_stats_nodata_posinf_msvc(): return stats_nodata_check('data/stats_nodata_posinf_msvc.tif', gdaltest.posinf()) ############################################################################### # Test standard deviation computation on huge values def test_stats_stddev_huge_values(): gdal.FileFromMemBuffer('/vsimem/stats_stddev_huge_values.asc', """ncols 4 nrows 4 xllcorner 0 yllcorner 0 cellsize 1 100000000 100000002 100000000 100000002 100000000 100000002 100000000 100000002 100000000 100000002 100000000 100000002 100000000 100000002 100000000 100000002""") ds = gdal.Open('/vsimem/stats_stddev_huge_values.asc') stats = ds.GetRasterBand(1).ComputeStatistics(0) assert stats == [100000000.0, 100000002.0, 100000001.0, 1.0], \ 'did not get expected stats' ds = None gdal.GetDriverByName('AAIGRID').Delete('/vsimem/stats_stddev_huge_values.asc') ############################################################################### # Test approximate statistics computation on a square shaped raster whose first column # of blocks is nodata only def test_stats_square_shape(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/stats_square_shape.tif', 32, 32, options=['TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16']) ds.GetRasterBand(1).SetNoDataValue(0) ds.GetRasterBand(1).WriteRaster(16, 0, 16, 32, struct.pack('B' * 1, 255), buf_xsize=1, buf_ysize=1) stats = ds.GetRasterBand(1).ComputeStatistics(True) hist = ds.GetRasterBand(1).GetHistogram(approx_ok=1) minmax = ds.GetRasterBand(1).ComputeRasterMinMax(1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_square_shape.tif') assert stats == [255, 255, 255, 0], 'did not get expected stats' assert hist[255] == 16 * 16, 'did not get expected histogram' if minmax != (255, 255): print(hist) pytest.fail('did not get expected minmax') ############################################################################### # Test when nodata = FLT_MIN (#6578) def test_stats_flt_min(): shutil.copyfile('data/flt_min.tif', 'tmp/flt_min.tif') try: os.remove('tmp/flt_min.tif.aux.xml') except OSError: pass ds = gdal.Open('tmp/flt_min.tif') stats = ds.GetRasterBand(1).GetStatistics(0, 1) nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None os.remove('tmp/flt_min.tif.aux.xml') ds = gdal.Open('tmp/flt_min.tif') minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None os.remove('tmp/flt_min.tif') if nodata != 1.17549435082228751e-38: print("%.18g" % nodata) pytest.fail('did not get expected nodata') assert (stats == [0.0, 1.0, 0.33333333333333337, 0.47140452079103168] or \ stats == [0.0, 1.0, 0.33333333333333331, 0.47140452079103168]), \ 'did not get expected stats' assert minmax == (0.0, 1.0), 'did not get expected minmax' ############################################################################### # Test when nodata = DBL_MIN (#6578) def test_stats_dbl_min(): shutil.copyfile('data/dbl_min.tif', 'tmp/dbl_min.tif') try: os.remove('tmp/dbl_min.tif.aux.xml') except OSError: pass ds = gdal.Open('tmp/dbl_min.tif') stats = ds.GetRasterBand(1).GetStatistics(0, 1) nodata = ds.GetRasterBand(1).GetNoDataValue() ds = None os.remove('tmp/dbl_min.tif.aux.xml') ds = gdal.Open('tmp/dbl_min.tif') minmax = ds.GetRasterBand(1).ComputeRasterMinMax() ds = None os.remove('tmp/dbl_min.tif') if nodata != 2.22507385850720138e-308: print("%.18g" % nodata) pytest.fail('did not get expected nodata') assert (stats == [0.0, 1.0, 0.33333333333333337, 0.47140452079103168] or \ stats == [0.0, 1.0, 0.33333333333333331, 0.47140452079103168]), \ 'did not get expected stats' assert minmax == (0.0, 1.0), 'did not get expected minmax' ############################################################################### # Test stats on a tiled Byte with partial tiles def test_stats_byte_partial_tiles(): ds = gdal.Translate('/vsimem/stats_byte_tiled.tif', '../gdrivers/data/small_world.tif', creationOptions=['TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_byte_tiled.tif') expected_stats = [0.0, 255.0, 50.22115, 67.119029288849973] assert stats == expected_stats, 'did not get expected stats' # Same but with nodata set ds = gdal.Translate('/vsimem/stats_byte_tiled.tif', '../gdrivers/data/small_world.tif', creationOptions=['TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) ds.GetRasterBand(1).SetNoDataValue(0) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_byte_tiled.tif') expected_stats = [1.0, 255.0, 50.311081057390084, 67.14541389488096] expected_stats_32bit = [1.0, 255.0, 50.311081057390084, 67.145413894880946] assert stats == expected_stats or stats == expected_stats_32bit, \ 'did not get expected stats' # Same but with nodata set but untiled and with non power of 16 block size ds = gdal.Translate('/vsimem/stats_byte_untiled.tif', '../gdrivers/data/small_world.tif', options='-srcwin 0 0 399 200') ds.GetRasterBand(1).SetNoDataValue(0) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_byte_untiled.tif') expected_stats = [1.0, 255.0, 50.378183963744554, 67.184793517649453] assert stats == expected_stats, 'did not get expected stats' ds = gdal.GetDriverByName('GTiff').Create('/vsimem/stats_byte_tiled.tif', 1000, 512, options=['TILED=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=512']) ds.GetRasterBand(1).Fill(255) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.Unlink('/vsimem/stats_byte_tiled.tif') expected_stats = [255.0, 255.0, 255.0, 0.0] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' # Non optimized code path ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, struct.pack('B' * 1, 1)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [1.0, 1.0, 1.0, 0.0] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ds = gdal.GetDriverByName('MEM').Create('', 3, 5) ds.GetRasterBand(1).WriteRaster(0, 0, 3, 1, struct.pack('B' * 3, 20, 30, 50)) ds.GetRasterBand(1).WriteRaster(0, 1, 3, 1, struct.pack('B' * 3, 60, 10, 5)) ds.GetRasterBand(1).WriteRaster(0, 2, 3, 1, struct.pack('B' * 3, 10, 20, 0)) ds.GetRasterBand(1).WriteRaster(0, 3, 3, 1, struct.pack('B' * 3, 10, 20, 255)) ds.GetRasterBand(1).WriteRaster(0, 4, 3, 1, struct.pack('B' * 3, 10, 20, 10)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 255.0, 35.333333333333336, 60.785597709398971] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ds = gdal.GetDriverByName('MEM').Create('', 32 + 2, 2) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).WriteRaster(32, 1, 2, 1, struct.pack('B' * 2, 0, 255)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 255.0, 4.7205882352941178, 30.576733555893391] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ds = gdal.GetDriverByName('MEM').Create('', 32 + 2, 2) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).SetNoDataValue(2) ds.GetRasterBand(1).WriteRaster(32, 1, 2, 1, struct.pack('B' * 2, 0, 255)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 255.0, 4.7205882352941178, 30.576733555893391] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ############################################################################### # Test stats on uint16 def test_stats_uint16(): ds = gdal.Translate('/vsimem/stats_uint16_tiled.tif', '../gdrivers/data/small_world.tif', outputType=gdal.GDT_UInt16, scaleParams=[[0, 255, 0, 65535]], creationOptions=['TILED=YES', 'BLOCKXSIZE=64', 'BLOCKYSIZE=64']) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_uint16_tiled.tif') expected_stats = [0.0, 65535.0, 50.22115 * 65535 / 255, 67.119029288849973 * 65535 / 255] assert stats == expected_stats, 'did not get expected stats' ds = gdal.Translate('/vsimem/stats_uint16_untiled.tif', '../gdrivers/data/small_world.tif', options='-srcwin 0 0 399 200 -scale 0 255 0 65535 -ot UInt16') stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_uint16_untiled.tif') expected_stats = [0.0, 65535.0, 12923.9921679198, 17259.703026841547] assert stats == expected_stats, 'did not get expected stats' # Same but with nodata set but untiled and with non power of 16 block size ds = gdal.Translate('/vsimem/stats_uint16_untiled.tif', '../gdrivers/data/small_world.tif', options='-srcwin 0 0 399 200 -scale 0 255 0 65535 -ot UInt16') ds.GetRasterBand(1).SetNoDataValue(0) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/stats_uint16_untiled.tif') expected_stats = [257.0, 65535.0, 50.378183963744554 * 65535 / 255, 67.184793517649453 * 65535 / 255] assert stats == expected_stats, 'did not get expected stats' for fill_val in [0, 1, 32767, 32768, 65535]: ds = gdal.GetDriverByName('GTiff').Create('/vsimem/stats_uint16_tiled.tif', 1000, 512, 1, gdal.GDT_UInt16, options=['TILED=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=512']) ds.GetRasterBand(1).Fill(fill_val) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None gdal.Unlink('/vsimem/stats_uint16_tiled.tif') expected_stats = [fill_val, fill_val, fill_val, 0.0] if max([abs(stats[i] - expected_stats[i]) for i in range(4)]) > 1e-15: print(fill_val) pytest.fail('did not get expected stats') # Test remaining pixels after multiple of 32 ds = gdal.GetDriverByName('MEM').Create('', 32 + 2, 1, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).WriteRaster(32, 0, 2, 1, struct.pack('H' * 2, 0, 65535)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 65535.0, 1928.4411764705883, 11072.48066469611] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' # Non optimized code path for fill_val in [0, 1, 32767, 32768, 65535]: ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, struct.pack('H' * 1, fill_val)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [fill_val, fill_val, fill_val, 0.0] if max([abs(stats[i] - expected_stats[i]) for i in range(4)]) > 1e-15: print(fill_val) pytest.fail('did not get expected stats') ds = gdal.GetDriverByName('MEM').Create('', 3, 5, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).WriteRaster(0, 0, 3, 1, struct.pack('H' * 3, 20, 30, 50)) ds.GetRasterBand(1).WriteRaster(0, 1, 3, 1, struct.pack('H' * 3, 60, 10, 5)) ds.GetRasterBand(1).WriteRaster(0, 2, 3, 1, struct.pack('H' * 3, 10, 20, 0)) ds.GetRasterBand(1).WriteRaster(0, 3, 3, 1, struct.pack('H' * 3, 10, 20, 65535)) ds.GetRasterBand(1).WriteRaster(0, 4, 3, 1, struct.pack('H' * 3, 10, 20, 10)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 65535.0, 4387.333333333333, 16342.408927558861] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ds = gdal.GetDriverByName('MEM').Create('', 2, 2, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).WriteRaster(0, 0, 2, 1, struct.pack('H' * 2, 0, 65535)) ds.GetRasterBand(1).WriteRaster(0, 1, 2, 1, struct.pack('H' * 2, 1, 65534)) stats = ds.GetRasterBand(1).GetStatistics(0, 1) ds = None expected_stats = [0.0, 65535.0, 32767.5, 32767.000003814814] assert max([abs(stats[i] - expected_stats[i]) for i in range(4)]) <= 1e-15, \ 'did not get expected stats' ############################################################################### # Test a case where the nodata value is almost the maximum value of float32 def test_stats_nodata_almost_max_float32(): gdal.FileFromMemBuffer('/vsimem/float32_almost_nodata_max_float32.tif', open('data/float32_almost_nodata_max_float32.tif', 'rb').read()) ds = gdal.Open('/vsimem/float32_almost_nodata_max_float32.tif') minmax = ds.GetRasterBand(1).ComputeRasterMinMax() assert minmax == (0, 0), 'did not get expected minmax' stats = ds.GetRasterBand(1).ComputeStatistics(False) assert stats == [0, 0, 0, 0], 'did not get expected stats' hist = ds.GetRasterBand(1).GetHistogram(approx_ok=0) assert hist[0] == 3, 'did not get expected hist' ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/float32_almost_nodata_max_float32.tif') ############################################################################### # Test STATISTICS_APPROXIMATE def test_stats_approx_stats_flag(dt=gdal.GDT_Byte, struct_frmt='B'): ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000, 1, dt) ds.GetRasterBand(1).WriteRaster(1000, 1000, 1, 1, struct.pack(struct_frmt * 1, 20)) 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 md == {'STATISTICS_MEAN': '0', 'STATISTICS_MAXIMUM': '0', 'STATISTICS_MINIMUM': '0', 'STATISTICS_APPROXIMATE': 'YES', 'STATISTICS_STDDEV': '0', 'STATISTICS_VALID_PERCENT': '100'}, \ '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' 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' def test_stats_approx_stats_flag_float(): return test_stats_approx_stats_flag(dt=gdal.GDT_Float32, struct_frmt='f') def test_stats_all_nodata(): ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000) ds.GetRasterBand(1).SetNoDataValue(0) approx_ok = 1 force = 1 with gdaltest.error_handler(): stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats == [0.0, 0.0, 0.0, 0.0], 'did not get expected stats' ds = gdal.GetDriverByName('MEM').Create('', 2000, 2000, 1, gdal.GDT_Float32) ds.GetRasterBand(1).SetNoDataValue(0) approx_ok = 1 force = 1 with gdaltest.error_handler(): stats = ds.GetRasterBand(1).GetStatistics(approx_ok, force) assert stats == [0.0, 0.0, 0.0, 0.0], 'did not get expected stats' def test_stats_float32_with_nodata_slightly_above_float_max(): ds = gdal.Open('data/float32_with_nodata_slightly_above_float_max.tif') my_min, my_max = ds.GetRasterBand(1).ComputeRasterMinMax() assert (my_min, my_max) == (-1.0989999771118164, 0.703338623046875), \ 'did not get expected stats' ############################################################################### # Run tests gdalautotest-3.0.4/gcore/aaigrid_read.py0000755003401500001440000000345313614005322017700 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: aaigrid_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for Arc/Info ASCII grid (AAIGrid) file. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # # 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. ############################################################################### import pytest import gdaltest ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.tif.grd', 4672), ] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('AAIGrid') def test_aaigrid_open(filename, checksum): ut = gdaltest.GDALTest('AAIGrid', filename, 1, checksum) ut.testOpen() gdalautotest-3.0.4/gcore/gtiff_write.py0000755003401500001440000000465213614005322017620 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: gtiff_write.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for GTiff driver. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # # 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. ############################################################################### import pytest import gdaltest init_list = [ ('byte.tif', 4672), ('int16.tif', 4672), ('uint16.tif', 4672), ('int32.tif', 4672), ('uint32.tif', 4672), ('float32.tif', 4672), ('float64.tif', 4672), ('cint16.tif', 5028), ('cint32.tif', 5028), ('cfloat32.tif', 5028), ('cfloat64.tif', 5028)] # Some tests we don't need to do for each type. @pytest.mark.parametrize( 'testfunction', [ 'testSetGeoTransform', 'testSetProjection', 'testSetMetadata', ] ) @pytest.mark.require_driver('GTiff') def test_gtiff_set(testfunction): ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) getattr(ut, testfunction)() # Others we do for each pixel type. @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', 'testSetNoDataValue', ] ) @pytest.mark.require_driver('GTiff') def test_gtiff_create(filename, checksum, testfunction): ut = gdaltest.GDALTest('GTiff', filename, 1, checksum) getattr(ut, testfunction)() gdalautotest-3.0.4/gcore/tiff_write.py0000755003401500001440000077736713614005322017475 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiff_write.py 8b99fd4d3ad3db542705722876fcf484486f46d6 2019-12-17 14:27:30 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for GeoTIFF format. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import copy import os import sys import array import shutil from osgeo import gdal from osgeo import osr import pytest sys.path.append('../../gdal/swig/python/samples') import gdaltest run_tiff_write_api_proxy = True ############################################################################### # Get the GeoTIFF driver, and verify a few things about it. def test_tiff_write_1(): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') assert gdaltest.tiff_drv is not None, 'GTiff driver not found!' drv_md = gdaltest.tiff_drv.GetMetadata() assert drv_md['DMD_MIMETYPE'] == 'image/tiff', 'mime type is wrong' ############################################################################### # Create a simple file by copying from an existing one. def test_tiff_write_2(): src_ds = gdal.Open('data/cfloat64.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_2.tif', src_ds) bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 5028, 'Didnt get expected checksum on still-open file' bnd = None new_ds = None # hopefully it's closed now! new_ds = gdal.Open('tmp/test_2.tif') bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 5028, 'Didnt get expected checksum on reopened file' assert bnd.ComputeRasterMinMax() == (74.0, 255.0), \ 'ComputeRasterMinMax() returned wrong value' bnd = None new_ds = None gdaltest.tiff_drv.Delete('tmp/test_2.tif') ############################################################################### # Create a simple file by copying from an existing one. def test_tiff_write_3(): src_ds = gdal.Open('data/utmsmall.tif') options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32'] new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_3.tif', src_ds, options=options) bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 50054, 'Didnt get expected checksum on still-open file' bnd = None new_ds = None gdaltest.tiff_drv.Delete('tmp/test_3.tif') ############################################################################### # Create a tiled file. def test_tiff_write_4(): try: from osgeo import gdalnumeric except ImportError: pytest.skip() options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32'] new_ds = gdaltest.tiff_drv.Create('tmp/test_4.tif', 40, 50, 3, gdal.GDT_Byte, options) try: data_red = gdalnumeric.zeros((50, 40)) data_green = gdalnumeric.zeros((50, 40)) data_blue = gdalnumeric.zeros((50, 40)) except AttributeError: import numpy data_red = numpy.zeros((50, 40)) data_green = numpy.zeros((50, 40)) data_blue = numpy.zeros((50, 40)) for y in range(50): for x in range(40): data_red[y][x] = x data_green[y][x] = y data_blue[y][x] = x + y try: data_red = data_red.astype(gdalnumeric.UnsignedInt8) data_green = data_green.astype(gdalnumeric.UnsignedInt8) data_blue = data_blue.astype(gdalnumeric.UnsignedInt8) except AttributeError: try: data_red = data_red.astype(gdalnumeric.uint8) data_green = data_green.astype(gdalnumeric.uint8) data_blue = data_blue.astype(gdalnumeric.uint8) except AttributeError: pass new_ds.GetRasterBand(1).WriteArray(data_red) new_ds.GetRasterBand(2).WriteArray(data_green) new_ds.GetRasterBand(3).WriteArray(data_blue) gt = (0.0, 1.0, 0.0, 50.0, 0.0, -1.0) new_ds.SetGeoTransform(gt) assert new_ds.GetRasterBand(1).Checksum() == 21577 and new_ds.GetRasterBand(2).Checksum() == 20950 and new_ds.GetRasterBand(3).Checksum() == 23730, \ 'Wrong checksum.' assert gt == new_ds.GetGeoTransform(), 'Wrong geotransform.' new_ds.SetMetadata({'TEST_KEY': 'TestValue'}) new_ds = None new_ds = gdal.Open('tmp/test_4.tif') assert new_ds.GetRasterBand(1).Checksum() == 21577 and new_ds.GetRasterBand(2).Checksum() == 20950 and new_ds.GetRasterBand(3).Checksum() == 23730, \ 'Wrong checksum (2).' assert gt == new_ds.GetGeoTransform(), 'Wrong geotransform(2).' nd = new_ds.GetRasterBand(1).GetNoDataValue() assert nd is None, 'Got unexpected nodata value.' md_dict = new_ds.GetMetadata() assert md_dict['TEST_KEY'] == 'TestValue', 'Missing metadata' new_ds = None gdaltest.tiff_drv.Delete('tmp/test_4.tif') ############################################################################### # Write a file with GCPs. def test_tiff_write_5(): src_ds = gdal.Open('data/gcps.vrt') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_5.tif', src_ds) assert (new_ds.GetGCPProjection().find( 'AUTHORITY["EPSG","26711"]') != -1), 'GCP Projection not set properly.' gcps = new_ds.GetGCPs() assert len(gcps) == 4, 'GCP count wrong.' new_ds = None gdaltest.tiff_drv.Delete('tmp/test_5.tif') # Test SetGCPs on a new GTiff new_ds = gdaltest.tiff_drv.Create('tmp/test_5.tif', 10, 10, 1) new_ds.SetGCPs(gcps, src_ds.GetGCPProjection()) new_ds = None new_ds = gdal.Open('tmp/test_5.tif') gcps = new_ds.GetGCPs() assert len(gcps) == 4, 'GCP count wrong.' new_ds = None gdaltest.tiff_drv.Delete('tmp/test_5.tif') ############################################################################### # Test a mixture of reading and writing on a DEFLATE compressed file. # May crash with libtiff <= 3.8.2, so skip it if BigTIFF is not supported # (this is a sign of an older libtiff...) def test_tiff_write_6(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32', 'COMPRESS=DEFLATE', 'PREDICTOR=2'] ds = gdaltest.tiff_drv.Create('tmp/test_6.tif', 200, 200, 1, gdal.GDT_Byte, options) # make a 32x32 byte buffer buf = array.array('B', list(range(32))).tostring() * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() ds.WriteRaster(32, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() buf_read = ds.ReadRaster(0, 0, 32, 32, buf_type=gdal.GDT_Byte) if buf_read != buf: gdaltest.tiff_write_6_failed = True pytest.fail('did not get back expected data.') ds = None gdaltest.tiff_write_6_failed = False gdaltest.tiff_drv.Delete('tmp/test_6.tif') ############################################################################### # Test a mixture of reading and writing on a LZW compressed file. # Will cause older libtiff versions (<=3.8.2 for sure) to crash, so skip it # if BigTIFF is not supported (this is a sign of an older libtiff...) def test_tiff_write_7(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() options = ['TILED=YES', 'COMPRESS=LZW', 'PREDICTOR=2'] ds = gdaltest.tiff_drv.Create('tmp/test_7.tif', 200, 200, 1, gdal.GDT_Byte, options) # make a 32x32 byte buffer buf = array.array('B', list(range(32))).tostring() * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() ds.WriteRaster(32, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() buf_read = ds.ReadRaster(0, 0, 32, 32, buf_type=gdal.GDT_Byte) assert buf_read == buf, 'did not get back expected data.' ds = None gdaltest.tiff_drv.Delete('tmp/test_7.tif') ############################################################################### # Test a mixture of reading and writing on a PACKBITS compressed file. def test_tiff_write_8(): options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32', 'COMPRESS=PACKBITS'] ds = gdaltest.tiff_drv.Create('tmp/test_8.tif', 200, 200, 1, gdal.GDT_Byte, options) # make a 32x32 byte buffer buf = array.array('B', list(range(32))).tostring() * 32 ds.WriteRaster(0, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() ds.WriteRaster(32, 0, 32, 32, buf, buf_type=gdal.GDT_Byte) ds.FlushCache() buf_read = ds.ReadRaster(0, 0, 32, 32, buf_type=gdal.GDT_Byte) assert buf_read == buf, 'did not get back expected data.' ds = None gdaltest.tiff_drv.Delete('tmp/test_8.tif') ############################################################################### # Create a simple file by copying from an existing one. def test_tiff_write_9(): src_ds = gdal.Open('data/byte.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_9.tif', src_ds, options=['NBITS=5']) with gdaltest.error_handler(): new_ds = None new_ds = gdal.Open('tmp/test_9.tif') bnd = new_ds.GetRasterBand(1) assert bnd.Checksum() == 5287, 'Didnt get expected checksum on reopened file' bnd = None new_ds = None gdaltest.tiff_drv.Delete('tmp/test_9.tif') ############################################################################### # 1bit file but with band interleaving, and odd size (not multiple of 8) #1957 def test_tiff_write_10(): ut = gdaltest.GDALTest('GTiff', 'oddsize_1bit2b.tif', 2, 5918, options=['NBITS=1', 'INTERLEAVE=BAND']) return ut.testCreate(out_bands=2) ############################################################################### # Simple 1 bit file, treated through the GTiffBitmapBand class. def test_tiff_write_11(): ut = gdaltest.GDALTest('GTiff', 'oddsize1bit.tif', 1, 5918, options=['NBITS=1', 'COMPRESS=CCITTFAX4']) return ut.testCreateCopy() ############################################################################### # Read JPEG Compressed YCbCr subsampled image. def test_tiff_write_12(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdal.Open('data/sasha.tif') cs = ds.GetRasterBand(3).Checksum() assert cs == 31952 or cs == 30145 ############################################################################### # Write JPEG Compressed YCbCr subsampled image. def test_tiff_write_13(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.Open('data/sasha.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/sasha.tif', src_ds, options=['PROFILE=BASELINE', 'TILED=YES', 'COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=31']) ds = None ds = gdal.Open('tmp/sasha.tif') cs = ds.GetRasterBand(3).Checksum() ds = None size = os.stat('tmp/sasha.tif').st_size gdaltest.tiff_drv.Delete('tmp/sasha.tif') assert cs == 17347 or cs == 14445, 'fail: bad checksum' if md['LIBTIFF'] == 'INTERNAL': assert size <= 22816, 'fail: bad size' ############################################################################### # Test creating an in memory copy. def test_tiff_write_14(): tst = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # Test that we can restrict metadata and georeferencing in the output # file using the PROFILE creation option with CreateCopy() def test_tiff_write_15(): ds_in = gdal.Open('data/byte.vrt') ds = gdaltest.tiff_drv.CreateCopy('tmp/tw_15.tif', ds_in, options=['PROFILE=BASELINE']) ds_in = None ds = None ds = gdal.Open('tmp/tw_15.tif') md = ds.GetMetadata() assert 'test' in md, 'Metadata absent from .aux.xml file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' in md, 'Metadata absent from .aux.xml file.' ds = None gdal.Unlink('tmp/tw_15.tif.aux.xml') ds = gdal.Open('tmp/tw_15.tif') assert ds.GetGeoTransform() == (0.0, 1.0, 0.0, 0.0, 0.0, 1.0), \ 'Got wrong geotransform, profile ignored?' md = ds.GetMetadata() assert 'test' not in md, 'Metadata written to BASELINE file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' not in md, 'Metadata written to BASELINE file.' ds = None gdaltest.tiff_drv.Delete('tmp/tw_15.tif') ############################################################################### # Test that we can restrict metadata and georeferencing in the output # file using the PROFILE creation option with Create() def test_tiff_write_16(): ds_in = gdal.Open('data/byte.vrt') ds = gdaltest.tiff_drv.Create('tmp/tw_16.tif', 20, 20, gdal.GDT_Byte, options=['PROFILE=BASELINE']) ds.SetMetadata({'test': 'testvalue'}) ds.GetRasterBand(1).SetMetadata({'testBand': 'testvalueBand'}) ds.SetGeoTransform((10, 5, 0, 30, 0, -5)) data = ds_in.ReadRaster(0, 0, 20, 20) ds.WriteRaster(0, 0, 20, 20, data) ds_in = None ds = None ds = gdal.Open('tmp/tw_16.tif') assert ds.GetGeoTransform() == (0.0, 1.0, 0.0, 0.0, 0.0, 1.0), \ 'Got wrong geotransform, profile ignored?' md = ds.GetMetadata() assert 'test' in md, 'Metadata absent from .aux.xml file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' in md, 'Metadata absent from .aux.xml file.' ds = None try: os.remove('tmp/tw_16.tif.aux.xml') except OSError: try: os.stat('tmp/tw_16.tif.aux.xml') except OSError: pytest.fail('No .aux.xml file.') ds = gdal.Open('tmp/tw_16.tif') md = ds.GetMetadata() assert 'test' not in md, 'Metadata written to BASELINE file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' not in md, 'Metadata written to BASELINE file.' ds = None gdaltest.tiff_drv.Delete('tmp/tw_16.tif') ############################################################################### # Test writing a TIFF with an RPC tag. def test_tiff_write_17(): # Translate RPC controlled data to GeoTIFF. ds_in = gdal.Open('data/rpc.vrt') rpc_md = ds_in.GetMetadata('RPC') tmpfilename = '/vsimem/tiff_write_17.tif' ds = gdaltest.tiff_drv.CreateCopy(tmpfilename, ds_in) ds_in = None ds = None # Ensure there is no .aux.xml file which might hold the RPC. assert not gdal.VSIStatL(tmpfilename + '.aux.xml'), \ 'unexpectedly found.aux.xml file' # confirm there is no .rpb file created by default. assert not gdal.VSIStatL(tmpfilename + '.RPB'), 'unexpectedly found .RPB file' # confirm there is no _rpc.txt file created by default. assert not gdal.VSIStatL(tmpfilename + '_RPC.TXT'), \ 'unexpectedly found _RPC.TXT file' # Open the dataset, and confirm the RPC data is still intact. ds = gdal.Open(tmpfilename) assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) ds = None # Modify the RPC modified_rpc = copy.copy(rpc_md) modified_rpc['LINE_OFF'] = '123456' ds = gdal.Open(tmpfilename, gdal.GA_Update) ds.SetMetadata(modified_rpc, 'RPC') ds = None ds = gdal.Open(tmpfilename) assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), modified_rpc) ds = None # Unset the RPC ds = gdal.Open(tmpfilename, gdal.GA_Update) ds.SetMetadata(None, 'RPC') ds = None ds = gdal.Open(tmpfilename) assert not ds.GetMetadata('RPC'), 'got RPC, but was not expected' ds = None gdaltest.tiff_drv.Delete(tmpfilename) ############################################################################### # Test that above test still work with the optimization in the GDAL_DISABLE_READDIR_ON_OPEN # case (#3996) def test_tiff_write_17_disable_readdir(): oldval = gdal.GetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN') gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'TRUE') ret = test_tiff_write_17() gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', oldval) return ret ############################################################################### # Test writing a TIFF with an RPB file and IMD file. def test_tiff_write_18(): # Translate RPC controlled data to GeoTIFF. ds_in = gdal.Open('data/rpc.vrt') rpc_md = ds_in.GetMetadata('RPC') gdaltest.tiff_drv.CreateCopy('tmp/tw_18.tif', ds_in, options=['PROFILE=BASELINE']) # Ensure there is no .aux.xml file which might hold the RPC. assert not gdal.VSIStatL('tmp/tm_18.tif.aux.xml'), \ 'unexpectedly found tm_18.tif.aux.xml file' # confirm there is an .rpb and .imd file. assert gdal.VSIStatL('tmp/tw_18.RPB') is not None, 'missing .RPB file.' assert gdal.VSIStatL('tmp/tw_18.IMD') is not None, 'missing .IMD file.' # confirm there is no _rpc.txt file created by default. assert not gdal.VSIStatL('tmp/tw_18_RPC.TXT'), 'unexpectedly found _RPC.TXT file' # Open the dataset, and confirm the RPC/IMD data is still intact. ds = gdal.Open('tmp/tw_18.tif') assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) imd_md = ds.GetMetadata('IMD') assert imd_md['version'] == '"R"' and imd_md['numColumns'] == '30324' and imd_md['IMAGE_1.sunEl'] == '39.7', \ 'IMD contents wrong?' ds = None # Test deferred loading with GetMetadataItem() ds = gdal.Open('tmp/tw_18.tif') assert ds.GetMetadataItem('LINE_OFF', 'RPC') == '16201', \ "wrong value for GetMetadataItem('LINE_OFF', 'RPC')" assert ds.GetMetadataItem('version', 'IMD') == '"R"', \ "wrong value for GetMetadataItem('version', 'IMD')" ds = None gdaltest.tiff_drv.Delete('tmp/tw_18.tif') # Confirm IMD and RPC files are cleaned up. If not likely the # file list functionality is not working properly. assert not gdal.VSIStatL('tmp/tw_18.RPB'), 'RPB did not get cleaned up.' assert not gdal.VSIStatL('tmp/tw_18.IMD'), 'IMD did not get cleaned up.' # Remove the RPC gdaltest.tiff_drv.CreateCopy('tmp/tw_18.tif', ds_in, options=['PROFILE=BASELINE']) ds = gdal.Open('tmp/tw_18.tif', gdal.GA_Update) ds.SetMetadata(None, 'RPC') ds = None assert not os.path.exists('tmp/tw_18.RPB'), 'RPB did not get removed' gdaltest.tiff_drv.Delete('tmp/tw_18.tif') ############################################################################### # Test that above test still work with the optimization in the GDAL_DISABLE_READDIR_ON_OPEN # case (#3996) def test_tiff_write_18_disable_readdir(): oldval = gdal.GetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN') gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', 'TRUE') ret = test_tiff_write_18() gdal.SetConfigOption('GDAL_DISABLE_READDIR_ON_OPEN', oldval) return ret ############################################################################### # Test writing a TIFF with an _RPC.TXT def test_tiff_write_rpc_txt(): # Translate RPC controlled data to GeoTIFF. ds_in = gdal.Open('data/rpc.vrt') # Remove IMD before creating the TIFF to avoid creating an .IMD # since .IMD + _RPC.TXT is an odd combination # If the .IMD is found, we don't try reading _RPC.TXT ds_in_without_imd = gdal.GetDriverByName('VRT').CreateCopy('', ds_in) ds_in_without_imd.SetMetadata(None, 'IMD') rpc_md = ds_in.GetMetadata('RPC') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_rpc_txt.tif', ds_in_without_imd, options=['PROFILE=BASELINE', 'RPCTXT=YES']) ds_in = None ds = None # Ensure there is no .aux.xml file which might hold the RPC. try: os.remove('tmp/tiff_write_rpc_txt.tif.aux.xml') except OSError: pass # confirm there is no .RPB file created by default. assert not os.path.exists('tmp/tiff_write_rpc_txt.RPB') assert os.path.exists('tmp/tiff_write_rpc_txt_RPC.TXT') # Open the dataset, and confirm the RPC data is still intact. ds = gdal.Open('tmp/tiff_write_rpc_txt.tif') assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_rpc_txt.tif') # Confirm _RPC.TXT file is cleaned up. If not likely the # file list functionality is not working properly. assert not os.path.exists('tmp/tiff_write_rpc_txt_RPC.TXT') ############################################################################### # Test writing a TIFF with an RPC in .aux.xml def test_tiff_write_rpc_in_pam(): ds_in = gdal.Open('data/rpc.vrt') rpc_md = ds_in.GetMetadata('RPC') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_rpc_in_pam.tif', ds_in, options=['PROFILE=BASELINE', 'RPB=NO']) ds_in = None ds = None # Ensure there is a .aux.xml file which might hold the RPC. try: os.stat('tmp/tiff_write_rpc_in_pam.tif.aux.xml') except OSError: pytest.fail('missing .aux.xml file.') # confirm there is no .RPB file created. assert not os.path.exists('tmp/tiff_write_rpc_txt.RPB') # Open the dataset, and confirm the RPC data is still intact. ds = gdal.Open('tmp/tiff_write_rpc_in_pam.tif') assert gdaltest.rpcs_equal(ds.GetMetadata('RPC'), rpc_md) ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_rpc_in_pam.tif') ############################################################################### # Test the write of a pixel-interleaved image with NBITS = 7 def test_tiff_write_19(): src_ds = gdal.Open('data/contig_strip.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/contig_strip_7.tif', src_ds, options=['NBITS=7', 'INTERLEAVE=PIXEL']) new_ds = None # hopefully it's closed now! new_ds = gdal.Open('tmp/contig_strip_7.tif') assert (new_ds.GetRasterBand(1).Checksum() == src_ds.GetRasterBand(1).Checksum() and \ new_ds.GetRasterBand(2).Checksum() == src_ds.GetRasterBand(2).Checksum() and \ new_ds.GetRasterBand(3).Checksum() == src_ds.GetRasterBand(3).Checksum()), \ 'Didnt get expected checksum on reopened file' new_ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/contig_strip_7.tif') ############################################################################### # Test write and read of some TIFF tags # Expected to fail (properly) with older libtiff versions (<=3.8.2 for sure) # Also test unsetting those tags (#5619) def test_tiff_write_20(): new_ds = gdaltest.tiff_drv.Create('tmp/tags.tif', 1, 1, 1) values = [('TIFFTAG_DOCUMENTNAME', 'document_name'), ('TIFFTAG_IMAGEDESCRIPTION', 'image_description'), ('TIFFTAG_SOFTWARE', 'software'), ('TIFFTAG_DATETIME', '2009/01/01 13:01:08'), # TODO: artitst? ('TIFFTAG_ARTIST', 'artitst'), ('TIFFTAG_HOSTCOMPUTER', 'host_computer'), ('TIFFTAG_COPYRIGHT', 'copyright'), ('TIFFTAG_XRESOLUTION', '100'), ('TIFFTAG_YRESOLUTION', '101'), ('TIFFTAG_RESOLUTIONUNIT', '2 (pixels/inch)'), ('TIFFTAG_MINSAMPLEVALUE', '1'), ('TIFFTAG_MAXSAMPLEVALUE', '2'), ] new_ds.SetMetadata(dict(values)) new_ds = None # hopefully it's closed now! assert not os.path.exists('tmp/tags.tif.aux.xml') new_ds = gdal.Open('tmp/tags.tif') md = new_ds.GetMetadata() for item in values: assert item[0] in md, ('Could not find tag %s' % (item[0])) assert md[item[0]] == item[1], \ ('For tag %s, got %s, expected %s' % (item[0], md[item[0]], item[1])) new_ds = None # Test just unsetting once, but leaving other unchanged ds = gdal.Open('tmp/tags.tif', gdal.GA_Update) ds.SetMetadataItem('TIFFTAG_SOFTWARE', None) ds = None assert not os.path.exists('tmp/tags.tif.aux.xml') ds = gdal.Open('tmp/tags.tif') assert ds.GetMetadataItem('TIFFTAG_SOFTWARE') is None, \ ('expected unset TIFFTAG_SOFTWARE but got %s' % ds.GetMetadataItem('TIFFTAG_SOFTWARE')) assert ds.GetMetadataItem('TIFFTAG_DOCUMENTNAME') is not None, \ 'expected set TIFFTAG_DOCUMENTNAME but got None' ds = None # Test unsetting all the remaining items ds = gdal.Open('tmp/tags.tif', gdal.GA_Update) ds.SetMetadata({}) ds = None ds = gdal.Open('tmp/tags.tif') got_md = ds.GetMetadata() ds = None assert got_md == {}, 'expected empty metadata list, but got some' gdaltest.tiff_drv.Delete('tmp/tags.tif') ############################################################################### # Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_ASSOCALPHA def test_tiff_write_21(): src_ds = gdal.Open('data/stefan_full_rgba.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_rgba.tif', src_ds) new_ds = None new_ds = gdal.Open('tmp/stefan_full_rgba.tif') assert new_ds.RasterCount == 4 for i in range(4): assert new_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == src_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum() new_ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/stefan_full_rgba.tif') ############################################################################### # Test RGBA images with TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_UNSPECIFIED def test_tiff_write_22(): src_ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_rgba_photometric_rgb.tif', src_ds, options=['PHOTOMETRIC=RGB']) new_ds = None new_ds = gdal.Open('tmp/stefan_full_rgba_photometric_rgb.tif') assert new_ds.RasterCount == 4 for i in range(4): assert new_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == src_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum() new_ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/stefan_full_rgba_photometric_rgb.tif') ############################################################################### # Test grey+alpha images with ALPHA=YES def test_tiff_write_23(): src_ds = gdal.Open('data/stefan_full_greyalpha.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_greyalpha.tif', src_ds, options=['ALPHA=YES']) new_ds = None new_ds = gdal.Open('tmp/stefan_full_greyalpha.tif') assert new_ds.RasterCount == 2 for i in range(2): assert new_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == src_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum() new_ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/stefan_full_greyalpha.tif') ############################################################################### # Test grey+alpha images without ALPHA=YES def test_tiff_write_24(): src_ds = gdal.Open('data/stefan_full_greyalpha.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/stefan_full_greyunspecified.tif', src_ds) new_ds = None new_ds = gdal.Open('tmp/stefan_full_greyunspecified.tif') assert new_ds.RasterCount == 2 for i in range(2): assert new_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == src_ds.GetRasterBand(i + 1).GetRasterColorInterpretation() assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum() new_ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/stefan_full_greyunspecified.tif') ############################################################################### # Read a CIELAB image to test the RGBA image TIFF interface def test_tiff_write_25(): src_ds = gdal.Open('data/cielab.tif') assert src_ds.RasterCount == 4 assert src_ds.GetRasterBand(1).Checksum() == 6 assert src_ds.GetRasterBand(2).Checksum() == 3 assert src_ds.GetRasterBand(3).Checksum() == 0 assert src_ds.GetRasterBand(4).Checksum() == 3 assert src_ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand assert src_ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand assert src_ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand assert src_ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand src_ds = None ############################################################################### # Test color table in a 8 bit image def test_tiff_write_26(): ds = gdaltest.tiff_drv.Create('tmp/ct8.tif', 1, 1, 1, gdal.GDT_Byte) 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) ct = None ds = None ds = gdal.Open('tmp/ct8.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert (ct.GetCount() == 256 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.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/ct8.tif') ############################################################################### # Test color table in a 16 bit image def test_tiff_write_27(): ds = gdaltest.tiff_drv.Create('tmp/ct16.tif', 1, 1, 1, gdal.GDT_UInt16) 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) ct = None ds = None ds = gdal.Open('tmp/ct16.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/ct16_copy.tif', ds) del new_ds ds = None ds = gdal.Open('tmp/ct16_copy.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert (ct.GetCount() == 65536 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.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/ct16.tif') gdaltest.tiff_drv.Delete('tmp/ct16_copy.tif') ############################################################################### # Test SetRasterColorInterpretation on a 2 channel image def test_tiff_write_28(): ds = gdaltest.tiff_drv.Create('tmp/greyalpha.tif', 1, 1, 2) assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_Undefined ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_AlphaBand) assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_AlphaBand ds = None ds = gdal.Open('tmp/greyalpha.tif') assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_AlphaBand ds = None gdaltest.tiff_drv.Delete('tmp/greyalpha.tif') ############################################################################### # Test SetRasterColorInterpretation on a 4 channel image def test_tiff_write_29(): # When creating a 4 channel image with PHOTOMETRIC=RGB, # TIFFTAG_EXTRASAMPLES=EXTRASAMPLE_UNSPECIFIED ds = gdaltest.tiff_drv.Create('/vsimem/rgba.tif', 1, 1, 4, options=['PHOTOMETRIC=RGB']) assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_Undefined # Now turn on alpha ds.GetRasterBand(4).SetRasterColorInterpretation(gdal.GCI_AlphaBand) assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '2' ds = None assert gdal.VSIStatL('/vsimem/rgba.tif.aux.xml') is None ds = gdal.Open('/vsimem/rgba.tif') assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '2' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand # Test cancelling alpha gdaltest.tiff_drv.CreateCopy('/vsimem/rgb_no_alpha.tif', ds, options=['ALPHA=NO']) ds = None assert gdal.VSIStatL('/vsimem/rgb_no_alpha.tif.aux.xml') is None ds = gdal.Open('/vsimem/rgb_no_alpha.tif') assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_Undefined # Test re-adding alpha gdaltest.tiff_drv.CreateCopy('/vsimem/rgb_added_alpha.tif', ds, options=['ALPHA=YES']) ds = None assert gdal.VSIStatL('/vsimem/rgb_added_alpha.tif.aux.xml') is None ds = gdal.Open('/vsimem/rgb_added_alpha.tif') assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '2' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand ds = None gdaltest.tiff_drv.Delete('/vsimem/rgba.tif') gdaltest.tiff_drv.Delete('/vsimem/rgb_no_alpha.tif') gdaltest.tiff_drv.Delete('/vsimem/rgb_added_alpha.tif') ############################################################################### # Create a BigTIFF image with BigTIFF=YES def test_tiff_write_30(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 1, 1, 1, options=['BigTIFF=YES']) ds = None ds = gdal.Open('tmp/bigtiff.tif') assert ds is not None ds = None fileobj = open('tmp/bigtiff.tif', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Create a BigTIFF image implicitly (more than 4Gb). def test_tiff_write_31(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 100000, 100000, 1, options=['SPARSE_OK=TRUE']) ds = None ds = gdal.Open('tmp/bigtiff.tif') assert ds is not None ds = None fileobj = open('tmp/bigtiff.tif', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Create a rotated image def test_tiff_write_32(): ds_in = gdal.Open('data/byte.vrt') # Test creation ds = gdaltest.tiff_drv.Create('tmp/byte_rotated.tif', 20, 20, gdal.GDT_Byte) gt = (10, 3.53553390593, 3.53553390593, 30, 3.53553390593, -3.53553390593) ds.SetGeoTransform(gt) data = ds_in.ReadRaster(0, 0, 20, 20) ds.WriteRaster(0, 0, 20, 20, data) ds_in = None # Test copy new_ds = gdaltest.tiff_drv.CreateCopy('tmp/byte_rotated_copy.tif', ds) del new_ds # Check copy ds = gdal.Open('tmp/byte_rotated_copy.tif') new_gt = ds.GetGeoTransform() for i in range(6): if abs(new_gt[i] - gt[i]) > 1e-5: print('') print(('old = ', gt)) print(('new = ', new_gt)) pytest.fail('Geotransform differs.') ds = None gdaltest.tiff_drv.Delete('tmp/byte_rotated.tif') gdaltest.tiff_drv.Delete('tmp/byte_rotated_copy.tif') ############################################################################### # Test that metadata is written in .aux.xml file in GeoTIFF profile with CreateCopy # (BASELINE is tested by tiff_write_15) def test_tiff_write_33(): ds_in = gdal.Open('data/byte.vrt') ds = gdaltest.tiff_drv.CreateCopy('tmp/tw_33.tif', ds_in, options=['PROFILE=GeoTIFF']) ds_in = None ds = None ds = gdal.Open('tmp/tw_33.tif') md = ds.GetMetadata() assert 'test' in md, 'Metadata absent from .aux.xml file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' in md, 'Metadata absent from .aux.xml file.' ds = None try: os.remove('tmp/tw_33.tif.aux.xml') except OSError: try: os.stat('tmp/tw_33.tif.aux.xml') except OSError: pytest.fail('No .aux.xml file.') ds = gdal.Open('tmp/tw_33.tif') md = ds.GetMetadata() assert 'test' not in md, 'Metadata written to GeoTIFF file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' not in md, 'Metadata written to GeoTIFF file.' ds = None gdaltest.tiff_drv.Delete('tmp/tw_33.tif') ############################################################################### # Test that metadata is written in .aux.xml file in GeoTIFF profile with Create # (BASELINE is tested by tiff_write_16) def test_tiff_write_34(): ds = gdaltest.tiff_drv.Create('tmp/tw_34.tif', 1, 1, gdal.GDT_Byte, options=['PROFILE=GeoTIFF']) ds.SetMetadata({'test': 'testvalue'}) ds.GetRasterBand(1).SetMetadata({'testBand': 'testvalueBand'}) ds = None ds = gdal.Open('tmp/tw_34.tif') md = ds.GetMetadata() assert 'test' in md, 'Metadata absent from .aux.xml file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' in md, 'Metadata absent from .aux.xml file.' ds = None try: os.remove('tmp/tw_34.tif.aux.xml') except OSError: try: os.stat('tmp/tw_34.tif.aux.xml') except OSError: pytest.fail('No .aux.xml file.') ds = gdal.Open('tmp/tw_34.tif') md = ds.GetMetadata() assert 'test' not in md, 'Metadata written to GeoTIFF file.' md = ds.GetRasterBand(1).GetMetadata() assert 'testBand' not in md, 'Metadata written to GeoTIFF file.' ds = None gdaltest.tiff_drv.Delete('tmp/tw_34.tif') ############################################################################### # Test fallback from internal storage of Geotiff metadata to PAM storage # when metadata is too big to fit into the GDALGeotiff tag def test_tiff_write_35(): # I've no idea why this works, and why this rolled in a # loop doesn't work... Python gurus please fix that ! big_string = 'a' big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string big_string = big_string + big_string ds = gdaltest.tiff_drv.Create('tmp/tw_35.tif', 1, 1, gdal.GDT_Byte) md = {} md['test'] = big_string ds.SetMetadata(md) md = ds.GetMetadata() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = None gdal.PopErrorHandler() try: os.stat('tmp/tw_35.tif.aux.xml') except OSError: pytest.fail('No .aux.xml file.') gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('tmp/tw_35.tif') gdal.PopErrorHandler() md = ds.GetMetadata() assert 'test' in md and len(md['test']) == 32768, 'Did not get expected metadata.' ds = None gdaltest.tiff_drv.Delete('tmp/tw_35.tif') ############################################################################### # Generic functions for the 8 following tests def tiff_write_big_odd_bits(vrtfilename, tmpfilename, nbits, interleaving): ds_in = gdal.Open(vrtfilename) ds = gdaltest.tiff_drv.CreateCopy(tmpfilename, ds_in, options=['NBITS=' + str(nbits), 'INTERLEAVE=' + interleaving]) ds_in = None ds = None ds = gdal.Open(tmpfilename) bnd = ds.GetRasterBand(1) cs = bnd.Checksum() assert cs == 4672, 'Didnt get expected checksum on band 1' md = bnd.GetMetadata('IMAGE_STRUCTURE') assert md['NBITS'] == str(nbits), 'Didnt get expected NBITS value' bnd = ds.GetRasterBand(2) assert bnd.Checksum() == 4672, 'Didnt get expected checksum on band 2' bnd = ds.GetRasterBand(3) assert bnd.Checksum() == 4672, 'Didnt get expected checksum on band 3' bnd = None md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['INTERLEAVE'] == interleaving, 'Didnt get expected interleaving' ds = None gdaltest.tiff_drv.Delete(tmpfilename) ############################################################################### # Test copy with NBITS=9, INTERLEAVE=PIXEL def test_tiff_write_36(): return tiff_write_big_odd_bits('data/uint16_3band.vrt', 'tmp/tw_36.tif', 9, 'PIXEL') ############################################################################### # Test copy with NBITS=9, INTERLEAVE=BAND def test_tiff_write_37(): return tiff_write_big_odd_bits('data/uint16_3band.vrt', 'tmp/tw_37.tif', 9, 'BAND') ############################################################################### # Test copy with NBITS=12, INTERLEAVE=PIXEL def test_tiff_write_38(): return tiff_write_big_odd_bits('data/uint16_3band.vrt', 'tmp/tw_38.tif', 12, 'PIXEL') ############################################################################### # Test copy with NBITS=12, INTERLEAVE=BAND def test_tiff_write_39(): return tiff_write_big_odd_bits('data/uint16_3band.vrt', 'tmp/tw_39.tif', 12, 'BAND') ############################################################################### # Test copy with NBITS=17, INTERLEAVE=PIXEL def test_tiff_write_40(): return tiff_write_big_odd_bits('data/uint32_3band.vrt', 'tmp/tw_40tif', 17, 'PIXEL') ############################################################################### # Test copy with NBITS=17, INTERLEAVE=BAND def test_tiff_write_41(): return tiff_write_big_odd_bits('data/uint32_3band.vrt', 'tmp/tw_41.tif', 17, 'BAND') ############################################################################### # Test copy with NBITS=24, INTERLEAVE=PIXEL def test_tiff_write_42(): return tiff_write_big_odd_bits('data/uint32_3band.vrt', 'tmp/tw_42.tif', 24, 'PIXEL') ############################################################################### # Test copy with NBITS=24, INTERLEAVE=BAND def test_tiff_write_43(): return tiff_write_big_odd_bits('data/uint32_3band.vrt', 'tmp/tw_43.tif', 24, 'BAND') ############################################################################### # Test create with NBITS=9 and preservation through CreateCopy of NBITS def test_tiff_write_44(): ds = gdaltest.tiff_drv.Create('tmp/tw_44.tif', 1, 1, 1, gdal.GDT_UInt16, options=['NBITS=9']) ds = None ds = gdal.Open('tmp/tw_44.tif') bnd = ds.GetRasterBand(1) md = bnd.GetMetadata('IMAGE_STRUCTURE') bnd = None assert md['NBITS'] == '9', 'Didnt get expected NBITS value' ds2 = gdaltest.tiff_drv.CreateCopy('tmp/tw_44_copy.tif', ds) ds2 = None ds2 = gdal.Open('tmp/tw_44_copy.tif') bnd = ds2.GetRasterBand(1) md = bnd.GetMetadata('IMAGE_STRUCTURE') bnd = None assert md['NBITS'] == '9', 'Didnt get expected NBITS value' ds = None ds2 = None gdaltest.tiff_drv.Delete('tmp/tw_44.tif') gdaltest.tiff_drv.Delete('tmp/tw_44_copy.tif') ############################################################################### # Test create with NBITS=17 and preservation through CreateCopy of NBITS def test_tiff_write_45(): ds = gdaltest.tiff_drv.Create('tmp/tw_45.tif', 1, 1, 1, gdal.GDT_UInt32, options=['NBITS=17']) ds = None ds = gdal.Open('tmp/tw_45.tif') bnd = ds.GetRasterBand(1) md = bnd.GetMetadata('IMAGE_STRUCTURE') bnd = None assert md['NBITS'] == '17', 'Didnt get expected NBITS value' ds2 = gdaltest.tiff_drv.CreateCopy('tmp/tw_45_copy.tif', ds) ds2 = None ds2 = gdal.Open('tmp/tw_45_copy.tif') bnd = ds2.GetRasterBand(1) md = bnd.GetMetadata('IMAGE_STRUCTURE') bnd = None assert md['NBITS'] == '17', 'Didnt get expected NBITS value' ds = None ds2 = None gdaltest.tiff_drv.Delete('tmp/tw_45.tif') gdaltest.tiff_drv.Delete('tmp/tw_45_copy.tif') ############################################################################### # Test correct round-tripping of ReadBlock/WriteBlock def test_tiff_write_46(): import struct with gdaltest.SetCacheMax(0): ds = gdaltest.tiff_drv.Create("tmp/tiff_write_46_1.tif", 10, 10, 1, options=['NBITS=1']) ds.GetRasterBand(1).Fill(0) ds2 = gdaltest.tiff_drv.Create("tmp/tiff_write_46_2.tif", 10, 10, 1, options=['NBITS=1']) ds2.GetRasterBand(1).Fill(1) ones = ds2.ReadRaster(0, 0, 10, 1) # Load the working block data = ds.ReadRaster(0, 0, 10, 1) # Write the working bloc ds.WriteRaster(0, 0, 10, 1, ones) # This will discard the cached block for ds ds3 = gdaltest.tiff_drv.Create("tmp/tiff_write_46_3.tif", 10, 10, 1) ds3.GetRasterBand(1).Fill(1) # Load the working block again data = ds.ReadRaster(0, 0, 10, 1) # We expect (1, 1, 1, 1, 1, 1, 1, 1, 1, 1) got = struct.unpack('B' * 10, data) for g in got: assert g == 1, got ds = None ds2 = None ds3 = None gdaltest.tiff_drv.Delete('tmp/tiff_write_46_1.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_46_2.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_46_3.tif') ############################################################################### # Test #2457 def test_tiff_write_47(): with gdaltest.SetCacheMax(0): ret = test_tiff_write_3() return ret ############################################################################### # Test #2457 with nYOff of RasterIO not aligned on the block height def test_tiff_write_48(): with gdaltest.SetCacheMax(0): src_ds = gdal.Open('data/utmsmall.tif') new_ds = gdal.GetDriverByName("GTiff").Create('tmp/tiff_write_48.tif', 100, 100, 1, options=['TILED=YES', 'BLOCKXSIZE=96', 'BLOCKYSIZE=96']) data = src_ds.ReadRaster(0, 0, 100, 1) data2 = src_ds.ReadRaster(0, 1, 100, 99) new_ds.WriteRaster(0, 1, 100, 99, data2) new_ds.WriteRaster(0, 0, 100, 1, data) new_ds = None new_ds = None new_ds = gdal.Open('tmp/tiff_write_48.tif') assert new_ds.GetRasterBand(1).Checksum() == 50054, 'Didnt get expected checksum ' new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_48.tif') ############################################################################### # Test copying a CMYK TIFF into another CMYK TIFF def test_tiff_write_49(): # We open the source as RAW to get the CMYK bands src_ds = gdal.Open('GTIFF_RAW:data/rgbsmall_cmyk.tif') new_ds = gdal.GetDriverByName("GTiff").CreateCopy('tmp/tiff_write_49.tif', src_ds, options=['PHOTOMETRIC=CMYK']) # At this point, for the purpose of the copy, the dataset will have been opened as RAW assert new_ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ 'Wrong color interpretation.' new_ds = None new_ds = gdal.Open('GTIFF_RAW:tmp/tiff_write_49.tif') for i in range(4): assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum(), \ 'Didnt get expected checksum ' src_ds = None new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_49.tif') ############################################################################### # Test creating a CMYK TIFF from another CMYK TIFF def test_tiff_write_50(): # We open the source as RAW to get the CMYK bands src_ds = gdal.Open('GTIFF_RAW:data/rgbsmall_cmyk.tif') new_ds = gdal.GetDriverByName("GTiff").Create('tmp/tiff_write_50.tif', src_ds.RasterXSize, src_ds.RasterYSize, 4, options=['PHOTOMETRIC=CMYK']) for i in range(4): data = src_ds.GetRasterBand(i + 1).ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) new_ds.GetRasterBand(i + 1).WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) assert new_ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ 'Wrong color interpretation.' new_ds = None new_ds = gdal.Open('GTIFF_RAW:tmp/tiff_write_50.tif') for i in range(4): assert new_ds.GetRasterBand(i + 1).Checksum() == src_ds.GetRasterBand(i + 1).Checksum(), \ 'Didnt get expected checksum ' src_ds = None new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_50.tif') ############################################################################### # Test proper clearing of existing GeoTIFF tags when updating the projection. # http://trac.osgeo.org/gdal/ticket/2546 def test_tiff_write_51(): shutil.copyfile('data/utmsmall.tif', 'tmp/tiff_write_51.tif') ds = gdal.Open('tmp/tiff_write_51.tif', gdal.GA_Update) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:32601') ds.SetProjection(srs.ExportToWkt()) ds = None ds = gdal.Open('tmp/tiff_write_51.tif') wkt = ds.GetProjection() ds = None # Create a new GeoTIFF file with same projection ds = gdaltest.tiff_drv.Create('tmp/tiff_write_51_ref.tif', 1, 1, 1) ds.SetProjection(srs.ExportToWkt()) ds = None # Read it back as the reference WKT ds = gdal.Open('tmp/tiff_write_51_ref.tif') expected_wkt = ds.GetProjection() ds = None assert wkt.find('NAD') == -1 and wkt.find('North Am') == -1, \ 'It appears the NAD27 datum was not properly cleared.' assert wkt == expected_wkt and wkt.find('WGS 84 / UTM zone 1N') != -1, \ 'coordinate system does not exactly match.' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_51.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_51_ref.tif') ############################################################################### # Test the ability to update a paletted TIFF files color table. def test_tiff_write_52(): shutil.copyfile('data/test_average_palette.tif', 'tmp/tiff_write_52.tif') test_ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255, 0)] test_ct = gdal.ColorTable() for i, data in enumerate(test_ct_data): test_ct.SetColorEntry(i, data) ds = gdal.Open('tmp/tiff_write_52.tif', gdal.GA_Update) ds.GetRasterBand(1).SetRasterColorTable(test_ct) ds = None ds = gdal.Open('tmp/tiff_write_52.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct.GetColorEntry(0) == (255, 0, 0, 255), 'Did not get expected color 0.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_52.tif') ############################################################################### # Test the ability to create a paletted image and then update later. def test_tiff_write_53(): test_ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255, 0)] test_ct = gdal.ColorTable() for i, data in enumerate(test_ct_data): test_ct.SetColorEntry(i, data) ds = gdaltest.tiff_drv.Create('tmp/tiff_write_53.tif', 30, 50, 1, options=['PHOTOMETRIC=PALETTE']) ds.GetRasterBand(1).Fill(10) ds = None ds = gdal.Open('tmp/tiff_write_53.tif', gdal.GA_Update) ds.GetRasterBand(1).SetRasterColorTable(test_ct) ds = None ds = gdal.Open('tmp/tiff_write_53.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct.GetColorEntry(0) == (255, 0, 0, 255), 'Did not get expected color 0.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_53.tif') ############################################################################### # Same as before except we create an overview before reopening the file and # adding the color table def test_tiff_write_53_bis(): test_ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255, 0)] test_ct = gdal.ColorTable() for i, data in enumerate(test_ct_data): test_ct.SetColorEntry(i, data) ds = gdaltest.tiff_drv.Create('tmp/tiff_write_53_bis.tif', 30, 50, 1, options=['PHOTOMETRIC=PALETTE']) ds.GetRasterBand(1).Fill(10) ds.BuildOverviews('NONE', overviewlist=[2]) ds = None ds = gdal.Open('tmp/tiff_write_53_bis.tif', gdal.GA_Update) ds.GetRasterBand(1).SetRasterColorTable(test_ct) ds = None ds = gdal.Open('tmp/tiff_write_53_bis.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct.GetColorEntry(0) == (255, 0, 0, 255), 'Did not get expected color 0.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_53_bis.tif') ############################################################################### # Test the ability to create a JPEG compressed TIFF, with PHOTOMETRIC=YCBCR # and write data into it without closing it and re-opening it (#2645) def test_tiff_write_54(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/tiff_write_54.tif', 256, 256, 3, options=['TILED=YES', 'COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR']) ds.GetRasterBand(1).Fill(255) ds.FlushCache() ds = None ds = gdal.Open('tmp/tiff_write_54.tif') cs = ds.GetRasterBand(1).Checksum() ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_54.tif') assert cs != 0, 'did not get expected checksum' ############################################################################### # Test creating and reading an equirectangular file with all parameters (#2706) def test_tiff_write_55(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_55.tif', 256, 256, 1) srs_expected = 'PROJCS["Equirectangular Mars",GEOGCS["GCS_Mars",DATUM["unknown",SPHEROID["unnamed",3394813.85797594,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Equirectangular"],PARAMETER["latitude_of_origin",-2],PARAMETER["central_meridian",184.412994384766],PARAMETER["standard_parallel_1",-15],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]' ds.SetProjection(srs_expected) ds.SetGeoTransform((100, 1, 0, 200, 0, -1)) ds = None ds = gdal.Open('tmp/tiff_write_55.tif') srs = ds.GetProjectionRef() ds = None assert srs == srs_expected, \ 'failed to preserve Equirectangular projection as expected, old libgeotiff?' gdaltest.tiff_drv.Delete('tmp/tiff_write_55.tif') ############################################################################### # Test clearing the colormap from an existing paletted TIFF file. def test_tiff_write_56(): md = gdaltest.tiff_drv.GetMetadata() # Expected to fail with libtiff < 4.0 as it needs TIFFUnsetField, so skip it if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() test_ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255, 0)] test_ct = gdal.ColorTable() for i, data in enumerate(test_ct_data): test_ct.SetColorEntry(i, data) ds = gdaltest.tiff_drv.Create('tmp/tiff_write_56.tif', 30, 50, 1, options=['PHOTOMETRIC=PALETTE']) ds.GetRasterBand(1).Fill(10) ds = None test_ct = gdal.ColorTable() ds = gdal.Open('tmp/tiff_write_56.tif', gdal.GA_Update) ds.GetRasterBand(1).SetRasterColorTable(test_ct) ds = None ds = gdal.Open('tmp/tiff_write_56.tif') ct = ds.GetRasterBand(1).GetRasterColorTable() assert ct is None, 'color table seemingly not cleared.' ct = None ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_56.tif') ############################################################################### # Test replacing normal norm up georef with rotated georef (#2625) def test_tiff_write_57(): md = gdaltest.tiff_drv.GetMetadata() # Expected to fail with libtiff < 4.0 as it needs TIFFUnsetField, so skip it if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() # copy a file to tmp dir to modify. open('tmp/tiff57.tif', 'wb').write(open('data/byte.tif', 'rb').read()) # open and set a non-northup geotransform. ds = gdal.Open('tmp/tiff57.tif', gdal.GA_Update) ds.SetGeoTransform([100, 1, 3, 200, 3, 1]) ds = None ds = gdal.Open('tmp/tiff57.tif') gt = ds.GetGeoTransform() ds = None assert gt == (100, 1, 3, 200, 3, 1), \ 'did not get expected geotransform, perhaps unset is not working?' gdaltest.tiff_drv.Delete('tmp/tiff57.tif') ############################################################################### # Test writing partial end strips (#2748) def test_tiff_write_58(): md = gdaltest.tiff_drv.GetMetadata() for compression in ('NONE', 'JPEG', 'LZW', 'DEFLATE', 'PACKBITS'): if md['DMD_CREATIONOPTIONLIST'].find(compression) != -1: ds = gdaltest.tiff_drv.Create('tmp/tiff_write_58.tif', 4, 4000, 1, options=['COMPRESS=' + compression]) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.Open('tmp/tiff_write_58.tif') assert ds.GetRasterBand(1).Checksum() == 65241, 'wrong checksum' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_58.tif') else: print(('Skipping compression method %s' % compression)) ############################################################################### # Test fix for #2759 def test_tiff_write_59(): import struct ret = 'success' for nbands in (1, 2): for nbits in (1, 8, 9, 12, 16, 17, 24, 32): if nbits <= 8: gdal_type = gdal.GDT_Byte ctype = 'B' elif nbits <= 16: gdal_type = gdal.GDT_UInt16 ctype = 'h' else: gdal_type = gdal.GDT_UInt32 ctype = 'i' ds = gdaltest.tiff_drv.Create("tmp/tiff_write_59.tif", 10, 10, nbands, gdal_type, options=['NBITS=%d' % nbits]) ds.GetRasterBand(1).Fill(1) ds = None ds = gdal.Open("tmp/tiff_write_59.tif", gdal.GA_Update) data = struct.pack(ctype * 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ds.GetRasterBand(1).WriteRaster(0, 0, 10, 1, data) ds = None ds = gdal.Open("tmp/tiff_write_59.tif") data = ds.GetRasterBand(1).ReadRaster(0, 0, 10, 1) # We expect zeros got = struct.unpack(ctype * 10, data) for g in got: if g != 0: print(('nbands=%d, NBITS=%d' % (nbands, nbits))) print(got) ret = 'fail' break ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_59.tif') return ret ############################################################################### # Test fix for #2760 def test_tiff_write_60(): tuples = [('TFW=YES', 'tmp/tiff_write_60.tfw'), ('WORLDFILE=YES', 'tmp/tiff_write_60.wld')] for options_tuple in tuples: # Create case with gdaltest.error_handler(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_60.tif', 10, 10, options=[options_tuple[0], 'PROFILE=BASELINE']) gt = (0.0, 1.0, 0.0, 50.0, 0.0, -1.0) ds.SetGeoTransform(gt) ds = None with gdaltest.error_handler(): ds = gdal.Open('tmp/tiff_write_60.tif') assert ds.GetGeoTransform() == gt, ('case1: %s != %s' % (ds.GetGeoTransform(), gt)) ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_60.tif') assert not os.path.exists(options_tuple[1]) # CreateCopy case src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_60.tif', src_ds, options=[options_tuple[0], 'PROFILE=BASELINE']) gt = (0.0, 1.0, 0.0, 50.0, 0.0, -1.0) ds.SetGeoTransform(gt) ds = None gdal.Unlink('tmp/tiff_write_60.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_60.tif') assert ds.GetGeoTransform() == gt, \ ('case2: %s != %s' % (ds.GetGeoTransform(), gt)) ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_60.tif') assert not os.path.exists(options_tuple[1]) ############################################################################### # Test BigTIFF=IF_NEEDED creation option def test_tiff_write_61(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 50000, 50000, 1, options=['BIGTIFF=IF_NEEDED', 'SPARSE_OK=TRUE']) ds = None ds = gdal.Open('tmp/bigtiff.tif') assert ds is not None ds = None fileobj = open('tmp/bigtiff.tif', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') # Check classical TIFF signature assert (not ((binvalues[2] != 0x2A or binvalues[3] != 0) and (binvalues[3] != 0x2A or binvalues[2] != 0))) ############################################################################### # Test BigTIFF=IF_SAFER creation option def test_tiff_write_62(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 50000, 50000, 1, options=['BIGTIFF=IF_SAFER', 'SPARSE_OK=TRUE']) ds = None ds = gdal.Open('tmp/bigtiff.tif') assert ds is not None ds = None fileobj = open('tmp/bigtiff.tif', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() gdaltest.tiff_drv.Delete('tmp/bigtiff.tif') # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Test BigTIFF=NO creation option when creating a BigTIFF file would be required def test_tiff_write_63(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1700: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.tiff_drv.Create('tmp/bigtiff.tif', 150000, 150000, 1, options=['BIGTIFF=NO']) gdal.PopErrorHandler() if ds is None: return pytest.fail() ############################################################################### # Test returned projection in WKT format for a WGS84 GeoTIFF (#2787) def test_tiff_write_64(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_64.tif', 1, 1, 1) srs = osr.SpatialReference() srs.SetFromUserInput('WGS84') ds.SetProjection(srs.ExportToWkt()) ds = None ds = gdal.Open('tmp/tiff_write_64.tif') wkt = ds.GetProjection() ds = None 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 wkt == expected_wkt, 'coordinate system does not exactly match.' gdaltest.tiff_drv.Delete('tmp/tiff_write_64.tif') ############################################################################### # Verify that we can write XML metadata. def test_tiff_write_65(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_65.tif', 10, 10) doc = '' ds.SetMetadata([doc], 'xml:test') ds = None ds = gdal.Open('tmp/tiff_write_65.tif') md = ds.GetMetadata('xml:test') ds = None assert len(md) == 1 and md[0] == doc, 'did not get xml back clean' gdaltest.tiff_drv.Delete('tmp/tiff_write_65.tif') ############################################################################### # Verify that we can write and read a band-interleaved GeoTIFF with 65535 bands (#2838) def test_tiff_write_66(): if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/tiff_write_66.tif', 1, 1, 65535, options=['INTERLEAVE=BAND']) ds = None ds = gdal.Open('tmp/tiff_write_66.tif') assert ds.RasterCount == 65535 assert ds.GetRasterBand(1).Checksum() == 0 assert ds.GetRasterBand(65535).Checksum() == 0 ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_66.tif') ############################################################################### # Verify that we can write and read a pixel-interleaved GeoTIFF with 65535 bands (#2838) def test_tiff_write_67(): if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/tiff_write_67.tif', 1, 1, 65535, options=['INTERLEAVE=PIXEL']) ds = None ds = gdal.Open('tmp/tiff_write_67.tif') assert ds.RasterCount == 65535 assert ds.GetRasterBand(1).Checksum() == 0 assert ds.GetRasterBand(65535).Checksum() == 0 ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_67.tif') ############################################################################### # Verify that we can set the color table after a Create() (scenario hit by map.tif in #2820) def test_tiff_write_68(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_68.tif', 151, 161, options=['COMPRESS=LZW']) 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).Fill(255) ds = None ds = gdal.Open('tmp/tiff_write_68.tif') assert ds.GetRasterBand(1).Checksum() != 0 ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_68.tif') ############################################################################### # Verify GTiffRasterBand::NullBlock() when reading empty block without any nodata value set def test_tiff_write_69(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_69.tif', 32, 32, 1, gdal.GDT_Int16, options=['SPARSE_OK=YES']) ds = None ds = gdal.Open('tmp/tiff_write_69.tif') assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_69.tif') ############################################################################### # Verify GTiffRasterBand::NullBlock() when reading empty block with nodata value set def test_tiff_write_70(): ref_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_70_ref.tif', 32, 32, 1, gdal.GDT_Int16) ref_ds.GetRasterBand(1).Fill(-32768) ref_ds = None ref_ds = gdal.Open('tmp/tiff_write_70_ref.tif') expected_cs = ref_ds.GetRasterBand(1).Checksum() ref_ds = None ds = gdaltest.tiff_drv.Create('tmp/tiff_write_70.tif', 32, 32, 1, gdal.GDT_Int16, options=['SPARSE_OK=YES']) ds.GetRasterBand(1).SetNoDataValue(0) assert os.stat('tmp/tiff_write_70.tif').st_size <= 8, \ 'directory should not be crystallized' ds = None ds = gdal.Open('tmp/tiff_write_70.tif', gdal.GA_Update) ds.GetRasterBand(1).SetNoDataValue(-32768) ds = None ds = gdal.Open('tmp/tiff_write_70.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs, 'wrong checksum' ds = None ds = gdal.Open('tmp/tiff_write_70.tif', gdal.GA_Update) assert ds.GetRasterBand(1).DeleteNoDataValue() == 0 assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None with pytest.raises(OSError): os.stat('tmp/tiff_write_70.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_70.tif') assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_70.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_70_ref.tif') ############################################################################### # Test reading in a real BigTIFF file (on filesystems supporting sparse files) def test_tiff_write_71(): import struct md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() # 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() header = open('data/bigtiff_header_extract.tif', 'rb').read() f = open('tmp/tiff_write_71.tif', 'wb') f.write(header) # Write StripByteCounts tag # 100,000 in little endian for _ in range(100000): f.write(b'\xa0\x86\x01\x00\x00\x00\x00\x00') # Write StripOffsets tag offset = 1600252 for _ in range(100000): f.write(struct.pack(' 2180: print(photometric) pytest.fail('did not get expected mean for band1.') try: compression = dst_ds.GetMetadataItem('COMPRESSION', 'IMAGE_STRUCTURE') except: md = dst_ds.GetMetadata('IMAGE_STRUCTURE') compression = md['COMPRESSION'] if (photometric == 'YCBCR' and compression != 'YCbCr JPEG') or \ (photometric == 'RGB' and compression != 'JPEG'): print(('COMPRESSION="%s"' % compression)) pytest.fail('did not get expected COMPRESSION value') try: nbits = dst_ds.GetRasterBand(3).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') except: md = dst_ds.GetRasterBand(3).GetMetadata('IMAGE_STRUCTURE') nbits = md['NBITS'] if nbits != '12': print(photometric) pytest.fail('did not get expected NBITS value') dst_ds = None gdaltest.tiff_drv.Delete('tmp/test_74.tif') ############################################################################### # Verify that FlushCache() alone doesn't cause crash (#3067 ) def test_tiff_write_75(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_75.tif', 1, 1, 1) ds.FlushCache() ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_75.tif') ############################################################################### # Test generating a G4 band to use the TIFFWriteScanline() def test_tiff_write_76(): src_ds = gdal.Open('data/slim_g4.tif') compression = src_ds.GetMetadata('IMAGE_STRUCTURE')['COMPRESSION'] new_ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_76.tif', src_ds, options=['BLOCKYSIZE=%d' % src_ds.RasterYSize, 'COMPRESS=' + compression]) new_ds = None new_ds = gdal.Open('tmp/tiff_write_76.tif') cs = new_ds.GetRasterBand(1).Checksum() assert cs == 3322, 'Got wrong checksum' src_ds = None new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_76.tif') ############################################################################### # Test generating & reading a 8bit all-in-one-strip multiband TIFF (#3904) def test_tiff_write_77(): src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_77_src.tif', 1, 5000, 3) src_ds.GetRasterBand(2).Fill(255) for interleaving in ('PIXEL', 'BAND'): new_ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_77.tif', src_ds, options=['BLOCKYSIZE=%d' % src_ds.RasterYSize, 'COMPRESS=LZW', 'INTERLEAVE=' + interleaving]) for attempt in range(2): # Test reading a few samples to check that random reading works band_lines = [(1, 0), (1, 5), (1, 3), (2, 10), (1, 100), (2, 1000), (2, 500), (1, 500), (2, 500), (2, 4999), (2, 4999), (3, 4999), (1, 4999)] for band_line in band_lines: cs = new_ds.GetRasterBand(band_line[0]).Checksum(0, band_line[1], 1, 1) if band_line[0] == 2: expected_cs = 255 % 7 else: expected_cs = 0 % 7 assert cs == expected_cs, 'Got wrong checksum' # Test whole bands for i in range(3): cs = new_ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs, 'Got wrong checksum' if attempt == 0: new_ds = None new_ds = gdal.Open('tmp/tiff_write_77.tif') new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_77.tif') src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_77_src.tif') ############################################################################### # Test generating & reading a YCbCr JPEG all-in-one-strip multiband TIFF (#3259) def test_tiff_write_78(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_78_src.tif', 16, 2048, 3) src_ds.GetRasterBand(2).Fill(255) new_ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_78.tif', src_ds, options=['BLOCKYSIZE=%d' % src_ds.RasterYSize, 'COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR']) # Make sure the file is flushed so that we re-read from it rather from cached blocks new_ds.FlushCache() # new_ds = None # new_ds = gdal.Open('tmp/tiff_write_78.tif') if 'GetBlockSize' in dir(gdal.Band): (_, blocky) = new_ds.GetRasterBand(1).GetBlockSize() if blocky != 1: print('') print('using regular band (libtiff <= 3.9.2 or <= 4.0.0beta5, or SplitBand disabled by config option)') # Test reading a few samples to check that random reading works band_lines = [(1, 0), (1, 5), (1, 3), (2, 10), (1, 100), (2, 1000), (2, 500), (1, 500), (2, 500), (2, 2047), (2, 2047), (3, 2047), (1, 2047)] for band_line in band_lines: cs = new_ds.GetRasterBand(band_line[0]).Checksum(0, band_line[1], 1, 1) if band_line[0] == 1: expected_cs = 0 % 7 elif band_line[0] == 2: expected_cs = 255 % 7 else: # We should expect 0, but due to JPEG YCbCr compression & decompression, # this ends up being 1 expected_cs = 1 % 7 if cs != expected_cs: print(band_line) pytest.fail('Got wrong checksum') # Test whole bands for i in range(3): cs = new_ds.GetRasterBand(i + 1).Checksum() expected_cs = src_ds.GetRasterBand(i + 1).Checksum() if i == 2: # We should expect 0, but due to JPEG YCbCr compression & decompression, # this ends up being 32768 expected_cs = 32768 assert cs == expected_cs, 'Got wrong checksum' new_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_78.tif') src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_78_src.tif') ############################################################################### # Test reading & updating GDALMD_AREA_OR_POINT (#3522) def test_tiff_write_79(): ds = gdaltest.tiff_drv.Create('tmp/tiff_write_79.tif', 1, 1) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:32601') ds.SetProjection(srs.ExportToWkt()) ds = None for do_projection_ref in [False, True]: for check_just_after in [False, True]: ds = gdal.Open('tmp/tiff_write_79.tif') if do_projection_ref: ds.GetProjectionRef() mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Area', \ ('(1) did not get expected value. do_projection_ref = %d, check_just_after = %d' % (do_projection_ref, check_just_after)) ds = None # Still read-only. ds = gdal.Open('tmp/tiff_write_79.tif') if do_projection_ref: ds.GetProjectionRef() ds.SetMetadataItem('AREA_OR_POINT', 'Point') ds = None assert not os.path.exists('tmp/tiff_write_79.tif.aux.xml') # So should get 'Area' ds = gdal.Open('tmp/tiff_write_79.tif') if do_projection_ref: ds.GetProjectionRef() mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Area', \ ('(2) did not get expected value. do_projection_ref = %d, check_just_after = %d' % (do_projection_ref, check_just_after)) ds = None # Now update to 'Point' ds = gdal.Open('tmp/tiff_write_79.tif', gdal.GA_Update) if do_projection_ref: ds.GetProjectionRef() ds.SetMetadataItem('AREA_OR_POINT', 'Point') if check_just_after: mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Point', \ ('(3) did not get expected value. do_projection_ref = %d, check_just_after = %d' % (do_projection_ref, check_just_after)) ds = None assert not os.path.exists('tmp/tiff_write_79.tif.aux.xml') # Now should get 'Point' ds = gdal.Open('tmp/tiff_write_79.tif') if do_projection_ref: ds.GetProjectionRef() mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Point', \ ('(4) did not get expected value. do_projection_ref = %d, check_just_after = %d' % (do_projection_ref, check_just_after)) ds = None # Now update back to 'Area' through SetMetadata() ds = gdal.Open('tmp/tiff_write_79.tif', gdal.GA_Update) if do_projection_ref: ds.GetProjectionRef() md = {} md['AREA_OR_POINT'] = 'Area' ds.SetMetadata(md) if check_just_after: mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Area', \ ('(5) did not get expected value. do_projection_ref = %d, check_just_after = %d' % (do_projection_ref, check_just_after)) ds = None # Now should get 'Area' ds = gdal.Open('tmp/tiff_write_79.tif') if do_projection_ref: ds.GetProjectionRef() mdi = ds.GetMetadataItem('AREA_OR_POINT') assert mdi == 'Area', '(6) did not get expected value' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_79.tif') ############################################################################### # Test SetOffset() & SetScale() def test_tiff_write_80(): # First part : test storing and retrieving scale & offsets from internal metadata ds = gdaltest.tiff_drv.Create('tmp/tiff_write_80.tif', 1, 1) ds.GetRasterBand(1).SetScale(100) ds.GetRasterBand(1).SetOffset(1000) ds = None assert not os.path.exists('tmp/tiff_write_80.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_80.tif') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 100 and offset == 1000, \ 'did not get expected values in internal case (1)' ds = None # Test CreateCopy() src_ds = gdal.Open('tmp/tiff_write_80.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_80_copy.tif', src_ds) src_ds = None ds = None ds = gdal.Open('tmp/tiff_write_80_copy.tif') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 100 and offset == 1000, 'did not get expected values in copy' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_80_copy.tif') # Second part : test unsetting scale & offsets from internal metadata ds = gdal.Open('tmp/tiff_write_80.tif', gdal.GA_Update) ds.GetRasterBand(1).SetScale(1) ds.GetRasterBand(1).SetOffset(0) ds = None ds = gdal.Open('tmp/tiff_write_80.tif') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 1 and offset == 0, \ 'did not get expected values in internal case (2)' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_80.tif') # Third part : test storing and retrieving scale & offsets from PAM metadata ds = gdaltest.tiff_drv.Create('tmp/tiff_write_80_bis.tif', 1, 1) assert ds.GetRasterBand(1).GetScale() is None and ds.GetRasterBand(1).GetOffset() is None, \ 'expected None values' ds = None ds = gdal.Open('tmp/tiff_write_80_bis.tif') ds.GetRasterBand(1).SetScale(-100) ds.GetRasterBand(1).SetOffset(-1000) ds = None try: # check that it *goes* to PAM os.stat('tmp/tiff_write_80_bis.tif.aux.xml') except OSError: pytest.fail('did not go to PAM as expected') ds = gdal.Open('tmp/tiff_write_80_bis.tif') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == -100 and offset == -1000, \ 'did not get expected values in PAM case (1)' ds = None # Fourth part : test unsetting scale & offsets from PAM metadata ds = gdal.Open('tmp/tiff_write_80_bis.tif') ds.GetRasterBand(1).SetScale(1) ds.GetRasterBand(1).SetOffset(0) ds = None assert not os.path.exists('tmp/tiff_write_80_bis.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_80_bis.tif') scale = ds.GetRasterBand(1).GetScale() offset = ds.GetRasterBand(1).GetOffset() assert scale == 1 and offset == 0, 'did not get expected values in PAM case (2)' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_80_bis.tif') ############################################################################### # Test retrieving GCP from PAM def test_tiff_write_81(): shutil.copyfile('data/byte.tif', 'tmp/tiff_write_81.tif') f = open('tmp/tiff_write_81.tif.aux.xml', 'wt') f.write(""" """) f.close() ds = gdal.Open('tmp/tiff_write_81.tif') assert (ds.GetGCPProjection().find( 'AUTHORITY["EPSG","26711"]') != -1), 'GCP Projection not set properly.' gcps = ds.GetGCPs() assert len(gcps) == 4, 'GCP count wrong.' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_81.tif') ############################################################################### # Test writing & reading a signedbyte 8 bit geotiff def test_tiff_write_82(): src_ds = gdal.Open('data/byte.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_82.tif', src_ds, options=['PIXELTYPE=SIGNEDBYTE']) src_ds = None ds = None ds = gdal.Open('tmp/tiff_write_82.tif') md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') assert md['PIXELTYPE'] == 'SIGNEDBYTE', 'did not get SIGNEDBYTE' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_82.tif') ############################################################################### # Test writing & reading an indexed GeoTIFF with an extra transparency band (#3547) def test_tiff_write_83(): # Test Create() method ds = gdaltest.tiff_drv.Create('tmp/tiff_write_83.tif', 1, 1, 2) ct = gdal.ColorTable() ct.SetColorEntry(127, (255, 255, 255, 255)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.GetRasterBand(1).Fill(127) ds.GetRasterBand(2).Fill(255) ds = None # Test CreateCopy() method src_ds = gdal.Open('tmp/tiff_write_83.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_83_2.tif', src_ds) src_ds = None ds = None ds = gdal.Open('tmp/tiff_write_83_2.tif') ct2 = ds.GetRasterBand(1).GetRasterColorTable() assert ct2.GetColorEntry(127) == (255, 255, 255, 255), \ 'did not get expected color table' ct2 = None cs1 = ds.GetRasterBand(1).Checksum() assert cs1 == 127 % 7, 'did not get expected checksum for band 1' cs2 = ds.GetRasterBand(2).Checksum() assert cs2 == 255 % 7, 'did not get expected checksum for band 2' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_83.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_83_2.tif') ############################################################################### # Test propagation of non-standard JPEG quality when the current directory # changes in the midst of encoding of tiles (#3539) def test_tiff_write_84(): md = gdaltest.tiff_drv.GetMetadata() # Crashes with libtiff < 4.0 if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() with gdaltest.SetCacheMax(0): ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_84.tif', 128, 128, 3) ds = None try: os.remove('tmp/tiff_write_84.tif.ovr') except OSError: pass ds = gdal.Open('tmp/tiff_write_84.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG') gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', '90') ds.BuildOverviews('NEAREST', overviewlist=[2]) cs = ds.GetRasterBand(2).GetOverview(0).Checksum() ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', None) gdaltest.tiff_drv.Delete('tmp/tiff_write_84.tif') assert cs == 0, 'did not get expected checksum' ############################################################################### # Test SetUnitType() def test_tiff_write_85(): # First part : test storing and retrieving unittype from internal metadata ds = gdaltest.tiff_drv.Create('tmp/tiff_write_85.tif', 1, 1) ds.GetRasterBand(1).SetUnitType('ft') ds = None assert not os.path.exists('tmp/tiff_write_85.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_85.tif') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'ft', 'did not get expected values in internal case (1)' ds = None # Test CreateCopy() src_ds = gdal.Open('tmp/tiff_write_85.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_85_copy.tif', src_ds) src_ds = None ds = None ds = gdal.Open('tmp/tiff_write_85_copy.tif') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'ft', 'did not get expected values in copy' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_85_copy.tif') # Second part : test unsetting unittype from internal metadata ds = gdal.Open('tmp/tiff_write_85.tif', gdal.GA_Update) ds.GetRasterBand(1).SetUnitType(None) ds = None ds = gdal.Open('tmp/tiff_write_85.tif') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == '', 'did not get expected values in internal case (2)' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_85.tif') # Third part : test storing and retrieving unittype from PAM metadata ds = gdaltest.tiff_drv.Create('tmp/tiff_write_85_bis.tif', 1, 1) assert not ds.GetRasterBand(1).GetUnitType(), 'expected None values' ds = None ds = gdal.Open('tmp/tiff_write_85_bis.tif') ds.GetRasterBand(1).SetUnitType('ft') ds = None try: # check that it *goes* to PAM os.stat('tmp/tiff_write_85_bis.tif.aux.xml') except OSError: pytest.fail('did not go to PAM as expected') ds = gdal.Open('tmp/tiff_write_85_bis.tif') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == 'ft', 'did not get expected values in PAM case (1)' ds = None # Fourth part : test unsetting unittype from PAM metadata ds = gdal.Open('tmp/tiff_write_85_bis.tif') ds.GetRasterBand(1).SetUnitType(None) ds = None assert not os.path.exists('tmp/tiff_write_85_bis.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_85_bis.tif') unittype = ds.GetRasterBand(1).GetUnitType() assert unittype == '', 'did not get expected values in PAM case (2)' ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_85_bis.tif') ############################################################################### # Test special handling of xml:ESRI domain. When the ESRI_XML_PAM config # option is set we want to write this to PAM, not into the geotiff itself. # This is a special option so that ArcGIS 10 written geotiffs will still work # properly with earlier versions of ArcGIS, requested by ESRI. def test_tiff_write_86(): gdal.SetConfigOption('ESRI_XML_PAM', 'YES') ds = gdaltest.tiff_drv.Create('tmp/tiff_write_86.tif', 100, 100, 1, gdal.GDT_Byte) ds.SetMetadata([''], 'xml:ESRI') ds.SetMetadataItem('BaseTest', 'Value') ds = None # Is the xml:ESRI data available? ds = gdal.Open('tmp/tiff_write_86.tif') assert ds.GetMetadata('xml:ESRI') == ['\n'], \ 'did not get expected xml:ESRI metadata.' if ds.GetMetadataItem('BaseTest') != 'Value': gdaltest.post_value('missing metadata(1)') pytest.fail() ds = None # After removing the pam file is it gone, but the conventional # metadata still available? os.rename('tmp/tiff_write_86.tif.aux.xml', 'tmp/tiff_write_86.tif.aux.xml.hidden') ds = gdal.Open('tmp/tiff_write_86.tif') assert ds.GetMetadata('xml:ESRI') is None, 'unexpectedly got xml:ESRI metadata' if ds.GetMetadataItem('BaseTest') != 'Value': gdaltest.post_value('missing metadata(2)') pytest.fail() ds = None # now confirm that CreateCopy also preserves things similarly. os.rename('tmp/tiff_write_86.tif.aux.xml.hidden', 'tmp/tiff_write_86.tif.aux.xml') ds_src = gdal.Open('tmp/tiff_write_86.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_86_cc.tif', ds_src) ds_src = None ds = None # Is the xml:ESRI data available? ds = gdal.Open('tmp/tiff_write_86_cc.tif') assert ds.GetMetadata('xml:ESRI') == ['\n'], \ 'did not get expected xml:ESRI metadata (cc).' if ds.GetMetadataItem('BaseTest') != 'Value': gdaltest.post_value('missing metadata(1cc)') pytest.fail() ds = None # After removing the pam file is it gone, but the conventional # metadata still available? os.remove('tmp/tiff_write_86_cc.tif.aux.xml') ds = gdal.Open('tmp/tiff_write_86_cc.tif') assert ds.GetMetadata('xml:ESRI') is None, 'unexpectedly got xml:ESRI metadata(2)' if ds.GetMetadataItem('BaseTest') != 'Value': gdaltest.post_value('missing metadata(2cc)') pytest.fail() ds = None # Cleanup gdal.SetConfigOption('ESRI_XML_PAM', 'NO') gdaltest.tiff_drv.Delete('tmp/tiff_write_86.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_86_cc.tif') ############################################################################### # Test COPY_SRC_OVERVIEWS creation option def test_tiff_write_87(): gdal.Translate('tmp/tiff_write_87_src.tif', 'data/utmsmall.tif', options='-a_nodata 0') src_ds = gdal.Open('tmp/tiff_write_87_src.tif', gdal.GA_Update) src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) expected_cs1 = src_ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs2 = src_ds.GetRasterBand(1).GetOverview(1).Checksum() ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_87_dst.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES', 'ENDIANNESS=LITTLE']) ds = None src_ds = None ds = gdal.Open('tmp/tiff_write_87_dst.tif') cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2 = ds.GetRasterBand(1).GetOverview(1).Checksum() nodata_ovr_0 = ds.GetRasterBand(1).GetOverview(0).GetNoDataValue() nodata_ovr_1 = ds.GetRasterBand(1).GetOverview(1).GetNoDataValue() ifd_main = int(ds.GetRasterBand(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) ifd_ovr_0 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('IFD_OFFSET', 'TIFF')) ifd_ovr_1 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) data_ovr_1 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) data_ovr_0 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) data_main = int(ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) ds = None import validate_cloud_optimized_geotiff try: _, errors, _ = validate_cloud_optimized_geotiff.validate('tmp/tiff_write_87_dst.tif', check_tiled=False) assert not errors, 'validate_cloud_optimized_geotiff failed' except OSError: pytest.fail('validate_cloud_optimized_geotiff failed') gdaltest.tiff_drv.Delete('tmp/tiff_write_87_src.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_87_dst.tif') # Check checksums assert cs1 == expected_cs1 and cs2 == expected_cs2, 'did not get expected checksums' assert nodata_ovr_0 == 0 and nodata_ovr_1 == 0, 'did not get expected nodata values' assert ifd_main == 8 or(ifd_main < ifd_ovr_0 and ifd_ovr_0 < ifd_ovr_1 and ifd_ovr_1 < data_ovr_1 and data_ovr_1 < data_ovr_0 and data_ovr_0 < data_main) ############################################################################### # Test that COPY_SRC_OVERVIEWS creation option has an influence # on BIGTIFF creation def test_tiff_write_88(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() # The file would be > 4.2 GB without SPARSE_OK src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_88_src.tif', 60000, 60000, 1, options=['TILED=YES', 'SPARSE_OK=YES']) src_ds.BuildOverviews('NONE', overviewlist=[2, 4]) # Just write one data block so that we can truncate it data = src_ds.GetRasterBand(1).GetOverview(1).ReadRaster(0, 0, 128, 128) src_ds.GetRasterBand(1).GetOverview(1).WriteRaster(0, 0, 128, 128, data) src_ds = None # Truncate the file to cause an I/O error on reading # so that the CreateCopy() aborts quickly f = open('tmp/tiff_write_88_src.tif', 'rb') f.seek(0, 2) length = f.tell() f.seek(0, 0) data = f.read(length - 1) f.close() f = open('tmp/tiff_write_88_src.tif', 'wb') f.write(data) f.close() src_ds = gdal.Open('tmp/tiff_write_88_src.tif') # for testing only. We need to keep the file to check it was a bigtiff gdal.SetConfigOption('GTIFF_DELETE_ON_ERROR', 'NO') gdal.SetConfigOption('CHECK_DISK_FREE_SPACE', 'NO') # we don't want free space to be an issue here gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_88_dst.tif', src_ds, options=['TILED=YES', 'COPY_SRC_OVERVIEWS=YES', 'ENDIANNESS=LITTLE']) gdal.PopErrorHandler() gdal.SetConfigOption('GTIFF_DELETE_ON_ERROR', None) gdal.SetConfigOption('CHECK_DISK_FREE_SPACE', None) del ds src_ds = None f = open('tmp/tiff_write_88_dst.tif', 'rb') data = f.read(8) f.close() os.remove('tmp/tiff_write_88_src.tif') os.remove('tmp/tiff_write_88_dst.tif') import struct ar = struct.unpack('B' * 8, data) assert ar[2] == 43, 'not a BIGTIFF file' assert ar[4] == 8 and ar[5] == 0 and ar[6] == 0 and ar[7] == 0, \ 'first IFD is not at offset 8' ############################################################################### # Test JPEG_QUALITY propagation while creating a (default compressed) mask band def test_tiff_write_89(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() last_size = 0 for quality in [90, 75, 30]: src_ds = gdal.Open('../gdrivers/data/utm.tif') ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_89.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=%d' % quality]) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(2).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(1).GetMaskBand().Fill(255) src_ds = None ds = None # older versions of python don't have SEEK_END, add if missing. try: os.SEEK_END except AttributeError: os.SEEK_END = 2 f = open('tmp/tiff_write_89.tif', 'rb') f.seek(0, os.SEEK_END) size = f.tell() f.close() # print('quality = %d, size = %d' % (quality, size)) if quality != 90: assert size < last_size, 'did not get decreasing file sizes' last_size = size gdaltest.tiff_drv.Delete('tmp/tiff_write_89.tif') ############################################################################### # Test JPEG_QUALITY propagation while creating (internal) overviews def test_tiff_write_90(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() last_size = 0 for quality in [90, 75, 30]: src_ds = gdal.Open('../gdrivers/data/utm.tif') ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_90.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=%d' % quality]) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(2).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) src_ds = None ds = None f = open('tmp/tiff_write_90.tif', 'rb') f.seek(0, os.SEEK_END) size = f.tell() f.close() # print('quality = %d, size = %d' % (quality, size)) if quality != 90: assert size < last_size, 'did not get decreasing file sizes' last_size = size gdaltest.tiff_drv.Delete('tmp/tiff_write_90.tif') ############################################################################### # Test JPEG_QUALITY propagation while creating (internal) overviews after re-opening def test_tiff_write_91(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() last_size = 0 for quality in [90, 75, 30]: src_ds = gdal.Open('../gdrivers/data/utm.tif') ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_91.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=%d' % quality]) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(2).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds = None ds = gdal.Open('tmp/tiff_write_91.tif', gdal.GA_Update) gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', '%d' % quality) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', None) src_ds = None ds = None f = open('tmp/tiff_write_91.tif', 'rb') f.seek(0, os.SEEK_END) size = f.tell() f.close() # print('quality = %d, size = %d' % (quality, size)) if quality != 90: assert size < last_size, 'did not get decreasing file sizes' last_size = size gdaltest.tiff_drv.Delete('tmp/tiff_write_91.tif') ############################################################################### # Test the effect of JPEG_QUALITY_OVERVIEW while creating (internal) overviews after re-opening # This will test that we correctly guess the quality of the main dataset def test_tiff_write_92(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() last_size = 0 quality = 30 for jpeg_quality_overview in [False, 30, 40]: src_ds = gdal.Open('../gdrivers/data/utm.tif') ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_92.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=%d' % quality]) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(2).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds = None ds = gdal.Open('tmp/tiff_write_92.tif', gdal.GA_Update) if jpeg_quality_overview is not False: gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', '%d' % jpeg_quality_overview) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', None) src_ds = None ds = None f = open('tmp/tiff_write_92.tif', 'rb') f.seek(0, os.SEEK_END) size = f.tell() f.close() # print('quality = %d, size = %d' % (quality, size)) if jpeg_quality_overview == 30: assert size == last_size, 'did not get equal file sizes' elif jpeg_quality_overview == 40: assert size > last_size, 'did not get growing file sizes' last_size = size gdaltest.tiff_drv.Delete('tmp/tiff_write_92.tif') ############################################################################### # Test JPEG_QUALITY_OVERVIEW propagation while creating external overviews def test_tiff_write_93(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.Open('../gdrivers/data/utm.tif') ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_93.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR']) data = src_ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512, 1024, 1024) ds.GetRasterBand(1).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(2).WriteRaster(0, 0, 1024, 1024, data) ds.GetRasterBand(3).WriteRaster(0, 0, 1024, 1024, data) ds = None src_ds = None last_size = 0 for quality in [90, 75, 30]: try: os.remove('tmp/tiff_write_93.tif.ovr') except OSError: pass ds = gdal.Open('tmp/tiff_write_93.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG') gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', '%d' % quality) gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', 'YCBCR') ds.BuildOverviews('NEAR', overviewlist=[2, 4]) gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', None) gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', None) ds = None f = open('tmp/tiff_write_93.tif.ovr', 'rb') f.seek(0, os.SEEK_END) size = f.tell() f.close() # print('quality = %d, size = %d' % (quality, size)) if quality != 90: assert size < last_size, 'did not get decreasing file sizes' assert not (quality == 30 and size >= 83000), \ 'file larger than expected. should be about 69100. perhaps jpeg quality is not well propagated' last_size = size gdaltest.tiff_drv.Delete('tmp/tiff_write_93.tif') ############################################################################### # Test CreateCopy() of a dataset with a mask into a JPEG compressed dataset # and check JPEG_QUALITY propagation without warning def test_tiff_write_94(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_write_94_src.tif', 1024, 1024, 3) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(0, 0, 1, 1, '\xff', 1, 1) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/tiff_write_94_dst.tif', src_ds, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEG_QUALITY=30']) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) src_ds = None ds = None ds = gdal.Open('tmp/tiff_write_94_dst.tif') cs = ds.GetRasterBand(1).GetMaskBand().Checksum() ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_94_src.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_94_dst.tif') assert cs == 3, 'wrong checksum' ############################################################################### # Test that COPY_SRC_OVERVIEWS deal well with rounding issues when computing # overview levels from the overview size def test_tiff_write_95(): src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_95_src.tif', 7171, 6083, options=['SPARSE_OK=YES']) src_ds.BuildOverviews('NONE', overviewlist=[2, 4, 8, 16, 32, 64]) gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_95_dst.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) ok = ds is not None ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_95_src.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_95_dst.tif') assert ok ############################################################################### # Test that COPY_SRC_OVERVIEWS combined with GDAL_TIFF_INTERNAL_MASK=YES work well def test_tiff_write_96(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') src_ds = gdaltest.tiff_drv.Create('tmp/tiff_write_96_src.tif', 100, 100) src_ds.GetRasterBand(1).Fill(255) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) from sys import version_info if version_info >= (3, 0, 0): exec("src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(25,25,50,50,b'\\xff',1,1)") else: src_ds.GetRasterBand(1).GetMaskBand().WriteRaster(25, 25, 50, 50, '\xff', 1, 1) src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) expected_cs = src_ds.GetRasterBand(1).Checksum() expected_cs_mask = src_ds.GetRasterBand(1).GetMaskBand().Checksum() expected_cs_ovr_1 = src_ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs_ovr_mask_1 = src_ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() expected_cs_ovr_2 = src_ds.GetRasterBand(1).GetOverview(1).Checksum() expected_cs_ovr_mask_2 = src_ds.GetRasterBand(1).GetOverview(1).GetMaskBand().Checksum() ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_96_dst.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) ds = None gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) ds = gdal.Open('tmp/tiff_write_96_dst.tif') cs = ds.GetRasterBand(1).Checksum() cs_mask = ds.GetRasterBand(1).GetMaskBand().Checksum() cs_ovr_1 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs_ovr_mask_1 = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() cs_ovr_2 = ds.GetRasterBand(1).GetOverview(1).Checksum() cs_ovr_mask_2 = ds.GetRasterBand(1).GetOverview(1).GetMaskBand().Checksum() ds = None src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_96_src.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_96_dst.tif') assert [expected_cs, expected_cs_mask, expected_cs_ovr_1, expected_cs_ovr_mask_1, expected_cs_ovr_2, expected_cs_ovr_mask_2] == \ [cs, cs_mask, cs_ovr_1, cs_ovr_mask_1, cs_ovr_2, cs_ovr_mask_2], \ 'did not get expected checksums' ############################################################################### # Create a simple file by copying from an existing one - PixelIsPoint def test_tiff_write_97(): gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') src_ds = gdal.Open('data/byte_point.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_97.tif', src_ds) gt = new_ds.GetGeoTransform() md = new_ds.GetMetadataItem('AREA_OR_POINT') new_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' assert md == 'Point', 'did not get expected AREA_OR_POINT value' gdaltest.tiff_drv.Delete('tmp/test_97.tif') # Again, but ignoring PixelIsPoint gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_97_2.tif', src_ds) gt = new_ds.GetGeoTransform() md = new_ds.GetMetadataItem('AREA_OR_POINT') new_ds = None src_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 when ignoring PixelIsPoint' assert md == 'Point', 'did not get expected AREA_OR_POINT value' gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) # read back this file with pixelispoint behavior enabled. new_ds = gdal.Open('tmp/test_97_2.tif') gt = new_ds.GetGeoTransform() md = new_ds.GetMetadataItem('AREA_OR_POINT') new_ds = None gt_expected = (440660.0, 60.0, 0.0, 3751380.0, 0.0, -60.0) assert gt == gt_expected, \ 'did not get expected geotransform when ignoring PixelIsPoint (2)' assert md == 'Point', 'did not get expected AREA_OR_POINT value' gdaltest.tiff_drv.Delete('tmp/test_97_2.tif') ############################################################################### # Create a rotated geotiff file (uses a geomatrix) with - PixelIsPoint def test_tiff_write_98(): with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'FALSE'): src_ds = gdal.Open('data/geomatrix.tif') with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'TRUE'): new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_98.tif', src_ds) gt = new_ds.GetGeoTransform() md = new_ds.GetMetadataItem('AREA_OR_POINT') new_ds = None src_ds = None gt_expected = (1841001.75, 1.5, -5.0, 1144003.25, -5.0, -1.5) assert gt == gt_expected, 'did not get expected geotransform' assert md == 'Point', 'did not get expected AREA_OR_POINT value' with gdaltest.config_option('GTIFF_POINT_GEO_IGNORE', 'FALSE'): new_ds = gdal.Open('tmp/test_98.tif') gt = new_ds.GetGeoTransform() md = new_ds.GetMetadataItem('AREA_OR_POINT') new_ds = None src_ds = None gt_expected = (1841003.5, 1.5, -5.0, 1144006.5, -5.0, -1.5) assert gt == gt_expected, 'did not get expected geotransform (2)' assert md == 'Point', 'did not get expected AREA_OR_POINT value' gdaltest.tiff_drv.Delete('tmp/test_98.tif') ############################################################################### # Create copy into a RGB JPEG-IN-TIFF (#3887) def test_tiff_write_99(): src_ds = gdal.Open('data/rgbsmall.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_99.tif', src_ds, options=['COMPRESS=JPEG']) del new_ds src_ds = None ds = gdal.Open('tmp/test_99.tif') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() ds = None gdaltest.tiff_drv.Delete('tmp/test_99.tif') assert (cs1, cs2, cs3) == (21629, 21651, 21371), ('%d,%d,%d' % (cs1, cs2, cs3)) ############################################################################### # Create copy into a 2 band JPEG-IN-TIFF (#3887) def test_tiff_write_100(): src_ds = gdaltest.tiff_drv.Create('/vsimem/test_100_src.tif', 16, 16, 2) src_ds.GetRasterBand(1).Fill(255) new_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/test_100_dst.tif', src_ds, options=['COMPRESS=JPEG']) del new_ds src_ds = None ds = gdal.Open('/vsimem/test_100_dst.tif') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None gdaltest.tiff_drv.Delete('/vsimem/test_100_src.tif') gdaltest.tiff_drv.Delete('/vsimem/test_100_dst.tif') assert (cs1, cs2) == (3118, 0), ('%d,%d' % (cs1, cs2)) ############################################################################### # Test CHUNKY_STRIP_READ_SUPPORT (#3894) # We use random data so the compressed files are big enough to need partial # reloading. tiff_write_78 doesn't produce enough big data to trigger this... def test_tiff_write_101(): if not gdaltest.run_slow_tests(): pytest.skip() md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if sys.platform.startswith('linux'): # Much faster to use /dev/urandom than python random generator ! f = open('/dev/urandom', 'rb') rand_array = f.read(10 * 1024 * 1024) f.close() else: import random rand_array = array.array('B') for _ in range(10 * 1024 * 1024): rand_array.append(random.randint(0, 255)) f = open('tmp/tiff_write_101.bin', 'wb') f.write(rand_array) f.close() f = open('tmp/tiff_write_101.hdr', 'wb') f.write("""ENVI samples = 2500 lines = 4000 bands = 1 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq byte order = 0 map info = {UTM, 1, 1, 440720.000000, 3751320.000000, 60.000000, 60.000000, 11, North} band names = { Band 1}""".encode('ascii')) f.close() src_ds = gdal.Open('tmp/tiff_write_101.bin') expected_cs = src_ds.GetRasterBand(1).Checksum() for compression_method in ['DEFLATE', 'LZW', 'JPEG', 'PACKBITS', 'LZMA']: if md['DMD_CREATIONOPTIONLIST'].find(compression_method) == -1: continue ds = gdaltest.tiff_drv.CreateCopy('tmp/tiff_write_101.tif', src_ds, options=['COMPRESS=' + compression_method, 'BLOCKXSIZE=2500', 'BLOCKYSIZE=4000']) ds = None ds = gdal.Open('tmp/tiff_write_101.tif') gdal.ErrorReset() cs = ds.GetRasterBand(1).Checksum() error_msg = gdal.GetLastErrorMsg() ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_101.tif') if error_msg != '': src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_101.bin') pytest.fail() if compression_method != 'JPEG' and cs != expected_cs: src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_101.bin') pytest.fail('for compression method %s, got %d instead of %d' % (compression_method, cs, expected_cs)) src_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_101.bin') ############################################################################### # Test writing and reading back COMPD_CS def test_tiff_write_102(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_102.tif', 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(7401) name = sr.GetAttrValue('COMPD_CS') wkt = sr.ExportToWkt() ds.SetProjection(wkt) ds = None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_102.tif') wkt1 = ds.GetProjectionRef() ds = None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'NO'): ds = gdal.Open('/vsimem/tiff_write_102.tif') wkt2 = ds.GetProjectionRef() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_102.tif') assert wkt1.startswith('COMPD_CS'), 'expected COMPD_CS, but got something else' assert not wkt2.startswith('COMPD_CS'), 'got COMPD_CS, but did not expected it' sr2 = osr.SpatialReference() sr2.SetFromUserInput(wkt1) got_name = sr2.GetAttrValue('COMPD_CS') if got_name != name: print(wkt2) pytest.fail('dit not get expected COMPD_CS name') ############################################################################### # Test -co COPY_SRC_OVERVIEWS=YES on a multiband source with external overviews (#3938) def test_tiff_write_103(): import test_cli_utilities if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() gdal.Translate('tmp/tiff_write_103_src.tif', 'data/rgbsmall.tif', options='-outsize 260 260') gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' -ro tmp/tiff_write_103_src.tif 2') gdal.Translate('tmp/tiff_write_103_dst.tif', 'tmp/tiff_write_103_src.tif', options='-co COPY_SRC_OVERVIEWS=YES') src_ds = gdal.Open('tmp/tiff_write_103_src.tif') dst_ds = gdal.Open('tmp/tiff_write_103_dst.tif') src_cs = src_ds.GetRasterBand(1).GetOverview(0).Checksum() dst_cs = dst_ds.GetRasterBand(1).GetOverview(0).Checksum() src_ds = None dst_ds = None gdaltest.tiff_drv.Delete('tmp/tiff_write_103_src.tif') gdaltest.tiff_drv.Delete('tmp/tiff_write_103_dst.tif') assert src_cs == dst_cs, 'did not get expected checksum' ############################################################################### # Confirm as best we can that we can write geotiff files with detailed # projection parameters with the correct linear units set. (#3901) def test_tiff_write_104(): src_ds = gdal.Open('data/spaf27_correct.tif') dst_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_104.tif', src_ds) src_ds = None del dst_ds ds = gdal.Open('tmp/test_104.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 2000000.0) <= 0.001, 'did not get expected false easting' gdaltest.tiff_drv.Delete('tmp/test_104.tif') ############################################################################### # Confirm as best we can that we can write geotiff files with detailed # projection parameters with the correct linear units set. (#3901) def test_tiff_write_105(): # This hangs forever with libtiff 3.8.2, so skip it md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() shutil.copyfile('data/bug4468.tif', 'tmp/bug4468.tif') # Update a pixel and close again. ds = gdal.Open('tmp/bug4468.tif', gdal.GA_Update) data = ds.ReadRaster(0, 0, 1, 1) ds.WriteRaster(0, 0, 1, 1, data) ds = None # Now check if the image is still intact. ds = gdal.Open('tmp/bug4468.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 2923, ('Did not get expected checksum, got %d.' % cs) ds = None gdaltest.tiff_drv.Delete('tmp/bug4468.tif') ############################################################################### # Test the direct copy mechanism of JPEG source def test_tiff_write_106(filename='../gdrivers/data/byte_with_xmp.jpg', options=None, check_cs=True): if options is None: options = ['COMPRESS=JPEG'] md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.Open(filename) nbands = src_ds.RasterCount src_cs = [] for i in range(nbands): src_cs.append(src_ds.GetRasterBand(i + 1).Checksum()) out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_106.tif', src_ds, options=options) out_ds = None out_ds = gdal.Open('/vsimem/tiff_write_106.tif') cs = [] for i in range(nbands): cs.append(out_ds.GetRasterBand(i + 1).Checksum()) out_ds = None gdal.Unlink('/vsimem/tiff_write_106.tif') if check_cs: for i in range(nbands): assert cs[i] == src_cs[i], 'did not get expected checksum' else: for i in range(nbands): assert cs[i] != 0, 'did not get expected checksum' def test_tiff_write_107(): return test_tiff_write_106(options=['COMPRESS=JPEG', 'BLOCKYSIZE=8']) def test_tiff_write_108(): return test_tiff_write_106(options=['COMPRESS=JPEG', 'BLOCKYSIZE=20']) def test_tiff_write_109(): return test_tiff_write_106(options=['COMPRESS=JPEG', 'TILED=YES', 'BLOCKYSIZE=16', 'BLOCKXSIZE=16']) # Strip organization of YCbCr does *NOT* give exact pixels w.r.t. original image def test_tiff_write_110(): return test_tiff_write_106(filename='../gdrivers/data/albania.jpg', check_cs=False) # Whole copy of YCbCr *DOES* give exact pixels w.r.t. original image def test_tiff_write_111(): return test_tiff_write_106(filename='../gdrivers/data/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260']) def test_tiff_write_111_bis(): return test_tiff_write_106(filename='../gdrivers/data/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260', 'INTERLEAVE=PIXEL']) def test_tiff_write_111_ter(): return test_tiff_write_106(filename='../gdrivers/data/albania.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=260', 'INTERLEAVE=BAND'], check_cs=False) # Tiled organization of YCbCr does *NOT* give exact pixels w.r.t. original image def test_tiff_write_112(): return test_tiff_write_106(filename='../gdrivers/data/albania.jpg', options=['COMPRESS=JPEG', 'TILED=YES'], check_cs=False) # The source is a JPEG in RGB colorspace (usually it is YCbCr). def test_tiff_write_113(): return test_tiff_write_106(filename='../gdrivers/data/rgbsmall_rgb.jpg', options=['COMPRESS=JPEG', 'BLOCKYSIZE=8']) ############################################################################### # Test CreateCopy() interruption def test_tiff_write_114(): tst = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1, interrupt_during_copy=True) ############################################################################### # Test writing a pixel interleaved RGBA JPEG-compressed TIFF def test_tiff_write_115(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() tmpfilename = '/vsimem/tiff_write_115.tif' src_ds = gdal.Open('data/stefan_full_rgba.tif') ds = gdaltest.tiff_drv.CreateCopy(tmpfilename, src_ds, options=['COMPRESS=JPEG']) assert ds is not None ds = None src_ds = None f = gdal.VSIFOpenL(tmpfilename + '.aux.xml', 'rb') if f is not None: gdal.VSIFCloseL(f) gdal.Unlink(tmpfilename) pytest.fail() ds = gdal.Open(tmpfilename) md = ds.GetMetadata('IMAGE_STRUCTURE') if md['INTERLEAVE'] != 'PIXEL': ds = None gdal.Unlink(tmpfilename) pytest.fail() expected_cs = [16404, 62700, 37913, 14174] for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() if cs != expected_cs[i]: ds = None gdal.Unlink(tmpfilename) pytest.fail() if ds.GetRasterBand(i + 1).GetRasterColorInterpretation() != gdal.GCI_RedBand + i: ds = None gdal.Unlink(tmpfilename) pytest.fail() ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test writing a band interleaved RGBA JPEG-compressed TIFF def test_tiff_write_116(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() tmpfilename = '/vsimem/tiff_write_116.tif' src_ds = gdal.Open('data/stefan_full_rgba.tif') ds = gdaltest.tiff_drv.CreateCopy(tmpfilename, src_ds, options=['COMPRESS=JPEG', 'INTERLEAVE=BAND']) assert ds is not None ds = None src_ds = None f = gdal.VSIFOpenL(tmpfilename + '.aux.xml', 'rb') if f is not None: gdal.VSIFCloseL(f) gdal.Unlink(tmpfilename) pytest.fail() ds = gdal.Open(tmpfilename) md = ds.GetMetadata('IMAGE_STRUCTURE') if md['INTERLEAVE'] != 'BAND': ds = None gdal.Unlink(tmpfilename) pytest.fail() expected_cs = [16404, 62700, 37913, 14174] for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() if cs != expected_cs[i]: ds = None gdal.Unlink(tmpfilename) pytest.fail() if ds.GetRasterBand(i + 1).GetRasterColorInterpretation() != gdal.GCI_RedBand + i: ds = None gdal.Unlink(tmpfilename) pytest.fail() ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test bugfix for ticket #4771 (rewriting of a deflate compressed tile, libtiff bug) def test_tiff_write_117(): # This will also fail with a libtiff 4.x older than 2012-08-13 # Might be good to be able to test internal libtiff presence md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() import random # so that we have always the same random :-) random.seed(0) ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_117.tif', 512, 256, 2, options=['COMPRESS=DEFLATE', 'TILED=YES']) # Write first tile so that its byte count of that tile is 2048 (a multiple of 1024) adjust = 1254 data = '0' * (65536 - adjust) + ''.join([('%c' % random.randint(0, 255)) for _ in range(adjust)]) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) # Second tile will be implicitly written at closing, or we could write # any content ds = None ds = gdal.Open('/vsimem/tiff_write_117.tif', gdal.GA_Update) # Will adjust tif_rawdatasize to TIFFroundup_64((uint64)size, 1024) = TIFFroundup_64(2048, 1024) = 2048 ds.GetRasterBand(1).ReadRaster(0, 0, 256, 256) # The new bytecount will be greater than 2048 data = ''.join([('%c' % random.randint(0, 255)) for _ in range(256 * 256)]) ds.GetRasterBand(1).WriteRaster(0, 0, 256, 256, data) # Make sure that data is written now ds.FlushCache() # Oops, without fix, the second tile will have been overwritten and an error will be emitted data = ds.GetRasterBand(1).ReadRaster(256, 0, 256, 256) ds = None gdal.Unlink('/vsimem/tiff_write_117.tif') assert data is not None, \ 'if GDAL is configured with external libtiff 4.x, it can fail if it is older than 4.0.3. With internal libtiff, should not fail' ############################################################################### # Test bugfix for ticket #4816 def test_tiff_write_118(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_118.tif', 1, 1) # Should be rejected in a non-XML domain ds.SetMetadata('bla', 'foo') ds = None ds = gdal.Open('/vsimem/tiff_write_118.tif') md = ds.GetMetadata('foo') ds = None gdal.Unlink('/vsimem/tiff_write_118.tif') assert not md ############################################################################### # Test bugfix for ticket #4816 def test_tiff_write_119(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_119.tif', 1, 1) ds.SetMetadata('foo=bar', 'foo') ds = None ds = gdal.Open('/vsimem/tiff_write_119.tif') md = ds.GetMetadata('foo') ds = None gdal.Unlink('/vsimem/tiff_write_119.tif') assert md['foo'] == 'bar' ############################################################################### # Test bugfix for ticket #4816 def test_tiff_write_120(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_120.tif', 1, 1) ds.SetMetadata('', 'xml:foo') ds = None ds = gdal.Open('/vsimem/tiff_write_120.tif') md = ds.GetMetadata('xml:foo') ds = None gdal.Unlink('/vsimem/tiff_write_120.tif') assert len(md) == 1 assert md[0] == '' ############################################################################### # Test error cases of COPY_SRC_OVERVIEWS creation option def test_tiff_write_121(): # Test when the overview band is NULL src_ds = gdal.Open(""" data/byte.tif 1 non_existing 1 """) gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) gdal.PopErrorHandler() assert ds is None src_ds = None # Test when the overview count isn't the same on all base bands src_ds = gdal.Open(""" data/byte.tif 1 data/byte.tif 1 data/byte.tif 1 """) gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) gdal.PopErrorHandler() assert ds is None src_ds = None # Test when the overview bands of same level have not the same dimensions src_ds = gdal.Open(""" data/byte.tif 1 data/byte.tif 1 data/byte.tif 1 data/rgbsmall.tif 1 """) gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_121.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES']) gdal.PopErrorHandler() assert ds is None src_ds = None ############################################################################### # Test write and read of some TIFFTAG_RESOLUTIONUNIT tags where '*'/'' is # specified (gdalwarp conflicts) # Expected to fail (properly) with older libtiff versions (<=3.8.2 for sure) def test_tiff_write_122(): new_ds = gdaltest.tiff_drv.Create('tmp/tags122.tif', 1, 1, 1) new_ds.SetMetadata({ 'TIFFTAG_RESOLUTIONUNIT': '*', }) new_ds = None # hopefully it's closed now! new_ds = gdal.Open('tmp/tags122.tif') md = new_ds.GetMetadata() if 'TIFFTAG_RESOLUTIONUNIT' not in md: pytest.fail('Couldnt find tag TIFFTAG_RESOLUTIONUNIT') elif md['TIFFTAG_RESOLUTIONUNIT'] != '1 (unitless)': pytest.fail("Got unexpected tag TIFFTAG_RESOLUTIONUNIT='%s' (expected ='1 (unitless)')" % md['TIFFTAG_RESOLUTIONUNIT']) new_ds = None gdaltest.tiff_drv.Delete('tmp/tags122.tif') ############################################################################### # Test implicit photometric interpretation def test_tiff_write_123(): src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_src.tif', 1, 1, 5, gdal.GDT_Int16) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) src_ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_BlueBand) src_ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) src_ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_src.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' src_ds = gdal.Open('/vsimem/tiff_write_123_src.tif') assert src_ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect a TIFFTAG_GDAL_METADATA tag' assert src_ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '2' assert src_ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert src_ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined assert src_ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand assert src_ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0,2' new_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_123.tif', src_ds) del new_ds statBuf = gdal.VSIStatL('/vsimem/tiff_write_123.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_123.tif') assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect a TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert src_ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined assert src_ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0,2' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_src.tif') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123.tif') # From implicit RGB to BGR (with Photometric = MinIsBlack) ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_bgr.tif', 1, 1, 3, gdal.GDT_Byte) assert ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '2' assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') is None ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_BlueBand) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_RedBand) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_bgr.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect a PAM file' ds = gdal.Open('/vsimem/tiff_write_123_bgr.tif') assert ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '1' assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0,0' assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is not None, \ 'expected a TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None # Test overriding internal color interpretation with PAM one (read-only mode) ds = gdal.Open('/vsimem/tiff_write_123_bgr.tif') ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_RedBand) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_bgr.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is not None, 'expected a PAM file' ds = gdal.Open('/vsimem/tiff_write_123_bgr.tif') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_bgr.tif') # Create a BGR with PROFILE=BASELINE --> no TIFFTAG_GDAL_METADATA tag, but .aux.xml instead ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_bgr.tif', 1, 1, 3, options=['PROFILE=BASELINE']) ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_BlueBand) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_GreenBand) ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_RedBand) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_bgr.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is not None, 'expected a PAM file' ds = gdal.Open('/vsimem/tiff_write_123_bgr.tif') assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect a TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GreenBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_bgr.tif') # From implicit RGBA to MINISBLACK ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_rgba.tif', 1, 1, 4, gdal.GDT_Byte) assert ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '2' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '2' ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_Undefined) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_Undefined assert ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '1' assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') == '0,0,2' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgba.tif') # From that implicit RGBA to Gray,Undefined,Undefined,Alpha doesn't # produce PAM file ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_guua.tif', 1, 1, 4, gdal.GDT_Byte) ds.GetRasterBand(1).SetColorInterpretation(gdal.GCI_GrayIndex) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_Undefined) ds.GetRasterBand(3).SetColorInterpretation(gdal.GCI_Undefined) ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_AlphaBand) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_guua.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_123_guua.tif') assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_guua.tif') # Test that CreateCopy() from a RGB UInt16 doesn't generate ExtraSamples src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_rgb_src.tif', 1, 1, 3, gdal.GDT_UInt16, options=['PHOTOMETRIC=RGB']) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_123_rgb.tif', src_ds) src_ds = None assert ds.GetMetadataItem('TIFFTAG_PHOTOMETRIC', '_DEBUG_') == '2' assert ds.GetMetadataItem('TIFFTAG_EXTRASAMPLES', '_DEBUG_') is None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgb_src.tif') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgb.tif') # Test that PHOTOMETRIC=RGB overrides the source color interpretation of the # first 3 bands src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 3) gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_123_rgb.tif', src_ds, options=['PHOTOMETRIC=RGB']) ds = gdal.Open('/vsimem/tiff_write_123_rgb.tif') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgb.tif') src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 5) src_ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_123_rgbua.tif', src_ds, options=['PHOTOMETRIC=RGB']) ds = gdal.Open('/vsimem/tiff_write_123_rgbua.tif') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined assert ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgbua.tif') # Test updating alpha to undefined gdaltest.tiff_drv.Create('/vsimem/tiff_write_123_rgba_to_undefined.tif', 1, 1, 4, options=['PHOTOMETRIC=RGB', 'ALPHA=YES']) ds = gdal.Open('/vsimem/tiff_write_123_rgba_to_undefined.tif', gdal.GA_Update) ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_Undefined) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_123_rgba_to_undefined.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_123_rgba_to_undefined.tif') assert ds.GetRasterBand(4).GetColorInterpretation() == gdal.GCI_Undefined ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_123_rgba_to_undefined.tif') ############################################################################### # Test error cases with palette creation def test_tiff_write_124(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_124.tif', 1, 1, 3, gdal.GDT_Byte) gdal.PushErrorHandler('CPLQuietErrorHandler') # Test "SetColorTable() can only be called on band 1" ret = ds.GetRasterBand(2).SetColorTable(gdal.ColorTable()) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') # Test "SetColorTable() not supported for multi-sample TIFF files" ret = ds.GetRasterBand(1).SetColorTable(gdal.ColorTable()) gdal.PopErrorHandler() assert ret != 0 ds = None ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_124.tif', 1, 1, 1, gdal.GDT_UInt32) gdal.PushErrorHandler('CPLQuietErrorHandler') # Test "SetColorTable() only supported for Byte or UInt16 bands in TIFF format." ret = ds.GetRasterBand(1).SetColorTable(gdal.ColorTable()) gdal.PopErrorHandler() assert ret != 0 ds = None gdal.PushErrorHandler('CPLQuietErrorHandler') # Test "SetColorTable() only supported for Byte or UInt16 bands in TIFF format." ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_124.tif', 1, 1, 1, gdal.GDT_UInt32, options=['PHOTOMETRIC=PALETTE']) gdal.PopErrorHandler() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_124.tif') ############################################################################### # Test out-of-memory conditions with SplitBand and SplitBitmapBand def test_tiff_write_125(): if gdal.GetConfigOption('SKIP_MEM_INTENSIVE_TEST') is not None: pytest.skip() ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_125.tif', 2147000000, 5000, 65535, options=['SPARSE_OK=YES', 'BLOCKYSIZE=5000', 'COMPRESS=LZW', 'BIGTIFF=NO']) ds = None ds = gdal.Open('/vsimem/tiff_write_125.tif') # Will not open on 32-bit due to overflow if ds is not None: gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetRasterBand(1).ReadBlock(0, 0) gdal.PopErrorHandler() ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_125.tif', 2147000000, 5000, 1, options=['NBITS=1', 'SPARSE_OK=YES', 'BLOCKYSIZE=5000', 'COMPRESS=LZW', 'BIGTIFF=NO']) ds = None ds = gdal.Open('/vsimem/tiff_write_125.tif') # Will not open on 32-bit due to overflow if ds is not None: gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetRasterBand(1).ReadBlock(0, 0) gdal.PopErrorHandler() gdal.Unlink('/vsimem/tiff_write_125.tif') ############################################################################### # Test implicit JPEG-in-TIFF overviews def test_tiff_write_126(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.Open('../gdrivers/data/small_world_400pct.vrt') options_list = [(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]), (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEGTABLESMODE=0'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]), (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]), (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=800'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]), (['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=64'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]), (['COMPRESS=JPEG'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'INTERLEAVE=BAND'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'INTERLEAVE=BAND', 'TILED=YES'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'INTERLEAVE=BAND', 'BLOCKYSIZE=800'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'INTERLEAVE=BAND', 'BLOCKYSIZE=32'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'BLOCKYSIZE=8'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]), ] for (options, cs1, cs2, cs3, cs4) in options_list: os.environ['JPEGMEM'] = '500M' ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_126.tif', src_ds, options=options) ds = None del os.environ['JPEGMEM'] ds = gdal.Open('/vsimem/tiff_write_126.tif') # Officially we have 0 public overviews... assert ds.GetRasterBand(1).GetOverviewCount() == 0, options # But they do exist... cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs in cs1, options cs = ds.GetRasterBand(2).GetOverview(0).Checksum() assert cs in cs2, options cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs in cs3, options cs = ds.GetRasterBand(1).GetOverview(2).Checksum() assert cs in cs4, options assert ds.GetRasterBand(1).GetOverview(-1) is None, options assert ds.GetRasterBand(1).GetOverview(3) is None, options ovr_1_data = ds.GetRasterBand(1).GetOverview(1).GetDataset().ReadRaster(0, 0, 400, 200) subsampled_data = ds.ReadRaster(0, 0, 1600, 800, 400, 200) assert ovr_1_data == subsampled_data, options ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') src_ds = gdal.Open('../gdrivers/data/small_world_400pct_1band.vrt') options_list = [(['COMPRESS=JPEG'], [49887, 58937], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'TILED=YES'], [49887, 58937], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'BLOCKYSIZE=800'], [49887, 58937], [30829, 34806], [11664, 58937]), (['COMPRESS=JPEG', 'BLOCKYSIZE=32'], [49887, 58937], [30829, 34806], [11664, 58937]), ] for (options, cs1, cs3, cs4) in options_list: os.environ['JPEGMEM'] = '500M' ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_126.tif', src_ds, options=options) ds = None del os.environ['JPEGMEM'] ds = gdal.Open('/vsimem/tiff_write_126.tif') # Officially we have 0 public overviews... assert ds.GetRasterBand(1).GetOverviewCount() == 0, options # But they do exist... cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs in cs1, options cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs in cs3, options cs = ds.GetRasterBand(1).GetOverview(2).Checksum() assert cs in cs4, options ovr_1_data = ds.GetRasterBand(1).GetOverview(1).GetDataset().ReadRaster(0, 0, 400, 200) subsampled_data = ds.ReadRaster(0, 0, 1600, 800, 400, 200) assert ovr_1_data == subsampled_data, options ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') # Test single-strip, opened as split band src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_126_src.tif', 8, 2001) src_ds.GetRasterBand(1).Fill(255) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_126.tif', src_ds, options=['COMPRESS=JPEG', 'BLOCKYSIZE=2001']) src_ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126_src.tif') ds = None ds = gdal.Open('/vsimem/tiff_write_126.tif') assert ds.GetRasterBand(1).GetBlockSize() == [8, 1] ovr_ds = ds.GetRasterBand(1).GetOverview(1).GetDataset() ovr_1_data = ovr_ds.ReadRaster(0, 0, ovr_ds.RasterXSize, ovr_ds.RasterYSize, 1, 1) subsampled_data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 1, 1) assert ovr_1_data == subsampled_data ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') # We need libtiff 4.0.4 (unreleased at that time) if md['LIBTIFF'] != 'INTERNAL': print('skipping tests that will fail without internal libtiff') return # Test with completely sparse file ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_126.tif', 1024, 1024, options=['COMPRESS=JPEG', 'SPARSE_OK=YES']) ds = None ds = gdal.Open('/vsimem/tiff_write_126.tif') assert ds.GetRasterBand(1).GetOverview(0) is not None assert ds.GetRasterBand(1).GetMetadataItem('JPEGTABLES', 'TIFF') is not None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') is None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_0', 'TIFF') is None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') # Test with partially sparse file ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_126.tif', 1024, 1024, 3, options=['COMPRESS=JPEG', 'SPARSE_OK=YES', 'INTERLEAVE=BAND']) # Fill band 3, but let blocks of band 1 unwritten. ds.GetRasterBand(3).Fill(0) ds = None ds = gdal.Open('/vsimem/tiff_write_126.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 0 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_126.tif') ############################################################################### # Test setting/unsetting metadata in update mode (#5628) def test_tiff_write_127(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_127.tif', 1, 1) ds = None for i in range(2): ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) obj = ds if i == 0 else ds.GetRasterBand(1) obj.SetMetadata({'key': 'value'}) obj = None ds = None ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) obj = ds if i == 0 else ds.GetRasterBand(1) if obj.GetMetadataItem('key') != 'value': print(i) pytest.fail(obj.GetMetadata()) obj.SetMetadata({}) obj = None ds = None ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) obj = ds if i == 0 else ds.GetRasterBand(1) assert not obj.GetMetadata(), i obj.SetMetadataItem('key', 'value') obj = None ds = None ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) obj = ds if i == 0 else ds.GetRasterBand(1) assert obj.GetMetadataItem('key') == 'value', i obj.SetMetadataItem('key', None) obj = None ds = None ds = gdal.Open('/vsimem/tiff_write_127.tif', gdal.GA_Update) obj = ds if i == 0 else ds.GetRasterBand(1) assert not obj.GetMetadata(), i obj = None ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_127.tif.aux.xml') if statBuf is not None: print(i) pytest.fail('unexpected PAM file') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_127.tif') ############################################################################### # Test lossless copying of a CMYK JPEG into JPEG-in-TIFF (#5712) def test_tiff_write_128(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') src_ds = gdal.Open('../gdrivers/data/rgb_ntf_cmyk.jpg') gdal.SetConfigOption('GDAL_JPEG_TO_RGB', None) # Will received implicitly CMYK photometric interpretation. old_val = gdal.GetConfigOption('GDAL_PAM_ENABLED') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_128.tif', src_ds, options=['COMPRESS=JPEG']) ds = None gdal.SetConfigOption('GDAL_PAM_ENABLED', old_val) # We need to reopen in raw to avoig automatic CMYK->RGBA to trigger ds = gdal.Open('GTIFF_RAW:/vsimem/tiff_write_128.tif') for i in range(4): assert src_ds.GetRasterBand(i + 1).GetColorInterpretation() == ds.GetRasterBand(i + 1).GetColorInterpretation() assert src_ds.GetRasterBand(i + 1).Checksum() == ds.GetRasterBand(i + 1).Checksum() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_128.tif') # Try with explicit CMYK photometric interpretation old_val = gdal.GetConfigOption('GDAL_PAM_ENABLED') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_128.tif', src_ds, options=['COMPRESS=JPEG', 'PHOTOMETRIC=CMYK']) ds = None gdal.SetConfigOption('GDAL_PAM_ENABLED', old_val) # We need to reopen in raw to avoig automatic CMYK->RGBA to trigger ds = gdal.Open('GTIFF_RAW:/vsimem/tiff_write_128.tif') for i in range(4): assert src_ds.GetRasterBand(i + 1).GetColorInterpretation() == ds.GetRasterBand(i + 1).GetColorInterpretation() assert src_ds.GetRasterBand(i + 1).Checksum() == ds.GetRasterBand(i + 1).Checksum() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_128.tif') # Try with more neutral colorspace in the case the source JPEG is not really CMYK (yes that happens !) old_val = gdal.GetConfigOption('GDAL_PAM_ENABLED') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_128.tif', src_ds, options=['COMPRESS=JPEG', 'PHOTOMETRIC=MINISBLACK', 'PROFILE=BASELINE']) ds = None gdal.SetConfigOption('GDAL_PAM_ENABLED', old_val) # Here we can reopen without GTIFF_RAW trick ds = gdal.Open('/vsimem/tiff_write_128.tif') for i in range(4): # The color interpretation will NOT be CMYK assert src_ds.GetRasterBand(i + 1).GetColorInterpretation() != ds.GetRasterBand(i + 1).GetColorInterpretation() assert src_ds.GetRasterBand(i + 1).Checksum() == ds.GetRasterBand(i + 1).Checksum() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_128.tif') ############################################################################### # Check effective guessing of existing JPEG quality def test_tiff_write_129(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() for jpegtablesmode in ['1', '3']: for photometric in ['RGB', 'YCBCR']: cs_ref = 0 for i in range(2): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_129.tif', 64, 32, 3, options=['COMPRESS=JPEG', 'TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32', 'JPEG_QUALITY=50', 'PHOTOMETRIC=' + photometric, 'JPEGTABLESMODE=' + jpegtablesmode]) src_ds = gdal.Open('data/rgbsmall.tif') data = src_ds.ReadRaster(0, 0, 32, 32) ds.WriteRaster(0, 0, 32, 32, data) # In second pass, we re-open the dataset if i == 1: ds = None ds = gdal.Open('/vsimem/tiff_write_129.tif', gdal.GA_Update) ds.WriteRaster(32, 0, 32, 32, data) ds = None ds = gdal.Open('/vsimem/tiff_write_129.tif') with gdaltest.SetCacheMax(0): cs = ds.GetRasterBand(1).Checksum() ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_129.tif') if i == 0: cs_ref = cs elif cs != cs_ref: print(photometric) print(i) pytest.fail(jpegtablesmode) ############################################################################### # Test cases where JPEG quality will fail def test_tiff_write_130(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() shutil.copyfile('data/byte_jpg_unusual_jpegtable.tif', 'tmp/byte_jpg_unusual_jpegtable.tif') ds = gdal.Open('tmp/byte_jpg_unusual_jpegtable.tif', gdal.GA_Update) assert ds.GetRasterBand(1).Checksum() == 4771 src_ds = gdal.Open('data/byte.tif', gdal.GA_Update) ds.WriteRaster(0, 0, 20, 20, src_ds.ReadRaster()) src_ds = None ds = None ds = gdal.Open('tmp/byte_jpg_unusual_jpegtable.tif') assert ds.GetRasterBand(1).Checksum() == 4743 ds = None os.unlink('tmp/byte_jpg_unusual_jpegtable.tif') shutil.copyfile('data/byte_jpg_tablesmodezero.tif', 'tmp/byte_jpg_tablesmodezero.tif') ds = gdal.Open('tmp/byte_jpg_tablesmodezero.tif', gdal.GA_Update) assert ds.GetRasterBand(1).Checksum() == 4743 src_ds = gdal.Open('data/byte.tif', gdal.GA_Update) ds.WriteRaster(0, 0, 20, 20, src_ds.ReadRaster()) src_ds = None ds = None ds = gdal.Open('tmp/byte_jpg_tablesmodezero.tif') assert ds.GetRasterBand(1).Checksum() == 4743 ds = None os.unlink('tmp/byte_jpg_tablesmodezero.tif') ############################################################################### # Test LZMA compression def test_tiff_write_131(level=1): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LZMA') == -1: pytest.skip() filename = '/vsimem/tiff_write_131.tif' src_ds = gdal.Open('data/byte.tif') ds = gdaltest.tiff_drv.CreateCopy(filename, src_ds, options=['COMPRESS=LZMA', 'LZMA_PRESET=' + str(level)]) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None # LZMA requires an howful amount of memory even on small files if gdal.GetLastErrorMsg().find('cannot allocate memory') >= 0: gdal.Unlink(filename) pytest.skip() ds = gdal.Open(filename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = None gdal.Unlink(filename) def test_tiff_write_131_level_9(): return test_tiff_write_131(level=9) ############################################################################### # Test that PAM metadata is cleared when internal metadata is set (#5807) def test_tiff_write_132(): for i in range(2): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_132.tif', 1, 1) ds = None # Open in read-only ds = gdal.Open('/vsimem/tiff_write_132.tif') ds.SetMetadataItem('FOO', 'BAR') ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAR') ds = None # Check that PAM file exists assert gdal.VSIStatL('/vsimem/tiff_write_132.tif.aux.xml') is not None # Open in read-write ds = gdal.Open('/vsimem/tiff_write_132.tif', gdal.GA_Update) if i == 0: ds.SetMetadataItem('FOO', 'BAZ') ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAZ') else: ds.SetMetadata({'FOO': 'BAZ'}) ds.GetRasterBand(1).SetMetadata({'FOO': 'BAZ'}) ds = None # Check that PAM file no longer exists assert gdal.VSIStatL('/vsimem/tiff_write_132.tif.aux.xml') is None, i ds = gdal.Open('/vsimem/tiff_write_132.tif') assert ds.GetMetadataItem('FOO') == 'BAZ' and ds.GetRasterBand(1).GetMetadataItem('FOO') == 'BAZ' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_132.tif') ############################################################################### # Test streaming capabilities def test_tiff_write_133(): src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_133.tif', 1024, 1000, 3, options=['STREAMABLE_OUTPUT=YES']) src_ds.SetGeoTransform([1, 2, 0, 3, 0, -2]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:32601') src_ds.SetProjection(srs.ExportToWkt()) src_ds.SetMetadataItem('FOO', 'BAR') src_ds.GetRasterBand(1).SetNoDataValue(127) src_ds.GetRasterBand(1).Fill(64) src_ds.GetRasterBand(2).Fill(127) src_ds.GetRasterBand(3).Fill(184) src_ds.FlushCache() gdal.PushErrorHandler() ret = src_ds.SetProjection(srs.ExportToWkt()) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.SetGeoTransform([1, 2, 0, 3, 0, -4]) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.SetMetadataItem('FOO', 'BAZ') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.SetMetadata({}) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.GetRasterBand(1).SetMetadataItem('FOO', 'BAZ') gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.GetRasterBand(1).SetMetadata({}) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = src_ds.GetRasterBand(1).SetNoDataValue(0) gdal.PopErrorHandler() assert ret != 0 # Pixel interleaved out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_133_dst.tif', src_ds, options=['STREAMABLE_OUTPUT=YES', 'BLOCKYSIZE=32']) out_ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') ds = gdal.Open('/vsimem/tiff_write_133_dst.tif') gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds.GetProjectionRef().find('32601') >= 0 assert ds.GetGeoTransform() == (1.0, 2.0, 0.0, 3.0, 0.0, -2.0) assert ds.GetMetadataItem('FOO') == 'BAR' assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') is None with gdaltest.SetCacheMax(0): for y in range(1000): got_data = ds.ReadRaster(0, y, 1024, 1) assert got_data is not None ds.FlushCache() for y in range(1000): gdal.PushErrorHandler() got_data = ds.ReadRaster(0, y, 1024, 1) gdal.PopErrorHandler() assert got_data is None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') # Tiled out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_133_dst.tif', src_ds, options=['STREAMABLE_OUTPUT=YES', 'TILED=YES']) out_ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') ds = gdal.Open('/vsimem/tiff_write_133_dst.tif') gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds.GetProjectionRef().find('32601') >= 0 assert ds.GetGeoTransform() == (1.0, 2.0, 0.0, 3.0, 0.0, -2.0) assert ds.GetMetadataItem('FOO') == 'BAR' assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') is None with gdaltest.SetCacheMax(0): for yblock in range(int((1000 + 256 - 1) / 256)): y = 256 * yblock ysize = 256 if y + ysize > ds.RasterYSize: ysize = ds.RasterYSize - y for xblock in range(int((1024 + 256 - 1) / 256)): x = 256 * xblock xsize = 256 if x + xsize > ds.RasterXSize: xsize = ds.RasterXSize - x got_data = ds.ReadRaster(x, y, xsize, ysize) assert got_data is not None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') # Band interleaved out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_133_dst.tif', src_ds, options=['STREAMABLE_OUTPUT=YES', 'INTERLEAVE=BAND']) out_ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') ds = gdal.Open('/vsimem/tiff_write_133_dst.tif') gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') is None with gdaltest.SetCacheMax(0): for band in range(3): for y in range(1000): got_data = ds.GetRasterBand(band + 1).ReadRaster(0, y, 1024, 1) assert got_data is not None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') # BIGTIFF md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') >= 0: out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_133_dst.tif', src_ds, options=['STREAMABLE_OUTPUT=YES', 'BIGTIFF=YES']) out_ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') ds = gdal.Open('/vsimem/tiff_write_133_dst.tif') gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') is None with gdaltest.SetCacheMax(0): for y in range(1000): got_data = ds.ReadRaster(0, y, 1024, 1) assert got_data is not None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133_dst.tif') # Compression not supported gdal.PushErrorHandler() out_ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_133_dst.tif', src_ds, options=['STREAMABLE_OUTPUT=YES', 'COMPRESS=DEFLATE']) gdal.PopErrorHandler() assert out_ds is None # Test writing into a non authorized file ds = gdaltest.tiff_drv.Create('/foo/bar', 1024, 1000, 3, options=['STREAMABLE_OUTPUT=YES', 'BLOCKYSIZE=1']) assert ds is None gdal.PushErrorHandler() out_ds = gdaltest.tiff_drv.CreateCopy('/foo/bar', src_ds, options=['STREAMABLE_OUTPUT=YES']) gdal.PopErrorHandler() assert out_ds is None src_ds = None # Classical TIFF with IFD not at offset 8 gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') gdal.PushErrorHandler() ds = gdal.Open('data/byte.tif') gdal.PopErrorHandler() gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds is None # BigTIFF with IFD not at offset 16 if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') >= 0: ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_133.tif', 1024, 1000, 3, options=['BIGTIFF=YES']) ds.GetRasterBand(1).Fill(0) ds.FlushCache() ds.SetGeoTransform([1, 2, 0, 3, 0, -2]) ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') gdal.PushErrorHandler() ds = gdal.Open('/vsimem/tiff_write_133.tif') gdal.PopErrorHandler() gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds is None # Test reading strips in not increasing order ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_133.tif', 1024, 1000, 3, options=['BLOCKYSIZE=1']) for y in range(1000): ds.WriteRaster(0, 1000 - y - 1, 1024, 1, 'a' * (3 * 1024)) ds.FlushCache() ds = None gdal.SetConfigOption('TIFF_READ_STREAMING', 'YES') gdal.PushErrorHandler() ds = gdal.Open('/vsimem/tiff_write_133.tif') gdal.PopErrorHandler() gdal.SetConfigOption('TIFF_READ_STREAMING', None) assert ds.GetMetadataItem('UNORDERED_BLOCKS', 'TIFF') == 'YES' with gdaltest.SetCacheMax(0): for y in range(1000): got_data = ds.ReadRaster(0, 1000 - y - 1, 1024, 1) assert got_data is not None # Test writing strips in not increasing order in a streamable output ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_133.tif', 1024, 1000, 3, options=['STREAMABLE_OUTPUT=YES', 'BLOCKYSIZE=1']) gdal.ErrorReset() gdal.PushErrorHandler() ret = ds.WriteRaster(0, 999, 1024, 1, 'a' * (3 * 1024)) ds.FlushCache() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' ds = None # Test writing tiles in not increasing order in a streamable output ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_133.tif', 1024, 1000, 3, options=['STREAMABLE_OUTPUT=YES', 'TILED=YES']) gdal.ErrorReset() gdal.PushErrorHandler() ret = ds.WriteRaster(256, 256, 256, 256, 'a' * (3 * 256 * 256)) ds.FlushCache() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_133.tif') ############################################################################### # Test DISCARD_LSB def test_tiff_write_134(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 3, options=['DISCARD_LSB=0,1,3']) ds.GetRasterBand(1).Fill(127) ds.GetRasterBand(2).Fill(127) ds.GetRasterBand(3).Fill(127) ds = None ds = gdal.Open('/vsimem/tiff_write_134.tif') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() assert cs1 == 1 and cs2 == 0 and cs3 == 5 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134_src.tif', 1, 1, 3) src_ds.GetRasterBand(1).Fill(127) src_ds.GetRasterBand(2).Fill(127) src_ds.GetRasterBand(3).Fill(127) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_134.tif', src_ds, options=['DISCARD_LSB=0,1,3']) ds = None ds = gdal.Open('/vsimem/tiff_write_134.tif') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() assert cs1 == 1 and cs2 == 0 and cs3 == 5 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134_src.tif') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_134.tif', 1, 1, 3, options=['DISCARD_LSB=3']) ds.GetRasterBand(1).Fill(127) ds.GetRasterBand(2).Fill(127) ds.GetRasterBand(3).Fill(127) ds = None ds = gdal.Open('/vsimem/tiff_write_134.tif') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() cs3 = ds.GetRasterBand(3).Checksum() assert cs1 == 5 and cs2 == 5 and cs3 == 5 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_134.tif') ############################################################################### # Test clearing GCPs (#5945) def test_tiff_write_135(): # Simple clear src_ds = gdal.Open('data/gcps.vrt') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_135.tif', src_ds) ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif', gdal.GA_Update) ds.SetGCPs([], '') ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif') assert not ds.GetGCPs() assert ds.GetGCPProjection() == '' ds = None # Double clear src_ds = gdal.Open('data/gcps.vrt') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_135.tif', src_ds) ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif', gdal.GA_Update) ds.SetGCPs([], '') ds.SetGCPs([], '') ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif') assert not ds.GetGCPs() assert ds.GetGCPProjection() == '' ds = None # Clear + set geotransform and new projection src_ds = gdal.Open('data/gcps.vrt') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_135.tif', src_ds) ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif', gdal.GA_Update) ds.SetGCPs([], '') ds.SetGeoTransform([1, 2, 3, 4, 5, -6]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:32601') ds.SetProjection(srs.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/tiff_write_135.tif') assert not ds.GetGCPs() assert ds.GetGeoTransform() == (1, 2, 3, 4, 5, -6) assert ds.GetProjectionRef().find('32601') >= 0 ds = None gdal.Unlink('/vsimem/tiff_write_135.tif') ############################################################################### # Test writing a single-strip mono-bit dataset def test_tiff_write_136(): src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_136_src.tif', 8, 2001) src_ds.GetRasterBand(1).Fill(1) expected_cs = src_ds.GetRasterBand(1).Checksum() ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_136.tif', src_ds, options=['NBITS=1', 'COMPRESS=DEFLATE', 'BLOCKYSIZE=2001']) src_ds = None ds = None ds = gdal.Open('/vsimem/tiff_write_136.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == expected_cs gdal.Unlink('/vsimem/tiff_write_136_src.tif') gdal.Unlink('/vsimem/tiff_write_136.tif') gdal.Unlink('/vsimem/tiff_write_136.tif.aux.xml') ############################################################################### # Test multi-threaded writing def test_tiff_write_137(): src_ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_137_src.tif', 4000, 4000) src_ds.GetRasterBand(1).Fill(1) data = src_ds.GetRasterBand(1).ReadRaster() expected_cs = src_ds.GetRasterBand(1).Checksum() # Test NUM_THREADS as creation option ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_137.tif', src_ds, options=['BLOCKYSIZE=16', 'COMPRESS=DEFLATE', 'NUM_THREADS=ALL_CPUS']) src_ds = None ds = None ds = gdal.Open('/vsimem/tiff_write_137.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs # Test NUM_THREADS as creation option with Create() ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_137.tif', 4000, 4000, 1, options=['BLOCKYSIZE=16', 'COMPRESS=DEFLATE', 'NUM_THREADS=ALL_CPUS']) ds.GetRasterBand(1).WriteRaster(0, 0, 4000, 4000, data) ds = None ds = gdal.Open('/vsimem/tiff_write_137.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs # Test NUM_THREADS as open option ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_137.tif', 4000, 4000, options=['TILED=YES', 'COMPRESS=DEFLATE', 'PREDICTOR=2', 'SPARSE_OK=YES']) ds = None ds = gdal.OpenEx('/vsimem/tiff_write_137.tif', gdal.OF_UPDATE, open_options=['NUM_THREADS=4']) ds.GetRasterBand(1).Fill(1) ds = None ds = gdal.Open('/vsimem/tiff_write_137.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs # Ask data immediately while the block is compressed ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_137.tif', 4000, 4000, options=['BLOCKYSIZE=3999', 'COMPRESS=DEFLATE', 'NUM_THREADS=4']) ds.WriteRaster(0, 0, 1, 1, 'A') ds.FlushCache() val = ds.ReadRaster(0, 0, 1, 1).decode('ascii') assert val == 'A' ds = None gdal.Unlink('/vsimem/tiff_write_137_src.tif') gdal.Unlink('/vsimem/tiff_write_137.tif') # Test NUM_THREADS with raster == tile src_ds = gdal.Open('data/byte.tif') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_137.tif', src_ds, options=['BLOCKYSIZE=20', 'COMPRESS=DEFLATE', 'NUM_THREADS=ALL_CPUS']) src_ds = None ds = None ds = gdal.Open('/vsimem/tiff_write_137.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672, expected_cs gdal.Unlink('/vsimem/tiff_write_137.tif') ############################################################################### # Test that pixel-interleaved writing generates optimal size def test_tiff_write_138(): # Test that consecutive IWriteBlock() calls for the same block but in # different bands only generate a single tile write, and not 3 rewrites ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/tiff_write_138.tif', 10, 1, 3, options=['COMPRESS=DEFLATE']) ds.GetRasterBand(1).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) ds.GetRasterBand(1).FlushCache() ds.GetRasterBand(2).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) ds.GetRasterBand(2).FlushCache() ds.GetRasterBand(3).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) ds.GetRasterBand(3).FlushCache() ds = None size = gdal.VSIStatL('/vsimem/tiff_write_138.tif').size assert size == 181 # Test fix for #5999 # Create a file with a huge block that will saturate the block cache. with gdaltest.SetCacheMax(1000000): tmp_ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/tiff_write_138_saturate.tif', gdal.GetCacheMax(), 1) tmp_ds = None ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/tiff_write_138.tif', 10, 1, 3, options=['COMPRESS=DEFLATE']) ds.GetRasterBand(1).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) ds.GetRasterBand(2).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) ds.GetRasterBand(3).WriteRaster(0, 0, 10, 1, 'A', buf_xsize=1, buf_ysize=1) # When internalizing the huge block, check that the 3 above dirty blocks # get written as a single tile write. tmp_ds = gdal.Open('/vsimem/tiff_write_138_saturate.tif') tmp_ds.GetRasterBand(1).Checksum() tmp_ds = None ds = None size = gdal.VSIStatL('/vsimem/tiff_write_138.tif').size assert size == 181 gdal.Unlink('/vsimem/tiff_write_138.tif') gdal.Unlink('/vsimem/tiff_write_138_saturate.tif') ############################################################################### # Test that pixel-interleaved writing generates optimal size def test_tiff_write_139(): import struct drv = gdal.GetDriverByName('GTiff') # Only post 4.0.5 has the fix for non-byte swabing case has_inverted_swab_fix = drv.GetMetadataItem('LIBTIFF') == 'INTERNAL' # In the byte case, there are optimizations for the 3 and 4 case. 1 is the general case for nbands in (1, 3, 4): ds = drv.Create('/vsimem/tiff_write_139.tif', 4, 1, nbands, options=['PREDICTOR=2', 'COMPRESS=DEFLATE']) ref_content = struct.pack('B' * 4, 255, 0, 255, 0) for i in range(nbands): ds.GetRasterBand(i + 1).WriteRaster(0, 0, 4, 1, ref_content) ds = None ds = gdal.Open('/vsimem/tiff_write_139.tif') for i in range(nbands): content = ds.GetRasterBand(i + 1).ReadRaster() assert ref_content == content ds = None gdal.Unlink('/vsimem/tiff_write_139.tif') # Int16 for endianness in ['NATIVE', 'INVERTED']: if endianness == 'INVERTED' and not has_inverted_swab_fix: continue ds = drv.Create('/vsimem/tiff_write_139.tif', 6, 1, 1, gdal.GDT_Int16, options=['PREDICTOR=2', 'COMPRESS=DEFLATE', 'ENDIANNESS=%s' % endianness]) ref_content = struct.pack('h' * 6, -32768, 32767, -32768, 32767, -32768, 32767) ds.GetRasterBand(1).WriteRaster(0, 0, 6, 1, ref_content) ds = None ds = gdal.Open('/vsimem/tiff_write_139.tif') content = ds.GetRasterBand(1).ReadRaster() if ref_content != content: print(endianness) pytest.fail(struct.unpack('h' * 6, content)) ds = None gdal.Unlink('/vsimem/tiff_write_139.tif') # UInt16 (same code path) for endianness in ['NATIVE', 'INVERTED']: if endianness == 'INVERTED' and not has_inverted_swab_fix: continue ds = drv.Create('/vsimem/tiff_write_139.tif', 6, 1, 1, gdal.GDT_UInt16, options=['PREDICTOR=2', 'COMPRESS=DEFLATE', 'ENDIANNESS=%s' % endianness]) ref_content = struct.pack('H' * 6, 0, 65535, 0, 65535, 0, 65535) ds.GetRasterBand(1).WriteRaster(0, 0, 6, 1, ref_content) ds = None ds = gdal.Open('/vsimem/tiff_write_139.tif') content = ds.GetRasterBand(1).ReadRaster() if ref_content != content: print(endianness) pytest.fail(struct.unpack('H' * 6, content)) ds = None gdal.Unlink('/vsimem/tiff_write_139.tif') # Int32 for endianness in ['NATIVE', 'INVERTED']: if endianness == 'INVERTED' and not has_inverted_swab_fix: continue ds = drv.Create('/vsimem/tiff_write_139.tif', 6, 1, 1, gdal.GDT_UInt32, options=['PREDICTOR=2', 'COMPRESS=DEFLATE', 'ENDIANNESS=%s' % endianness]) ref_content = struct.pack('I' * 6, 0, 2000000000, 0, 2000000000, 0, 2000000000) ds.GetRasterBand(1).WriteRaster(0, 0, 6, 1, ref_content) ds = None ds = gdal.Open('/vsimem/tiff_write_139.tif') content = ds.GetRasterBand(1).ReadRaster() if ref_content != content: print(endianness) pytest.fail(struct.unpack('I' * 6, content)) ds = None gdal.Unlink('/vsimem/tiff_write_139.tif') # Test floating-point predictor # Seems to be broken with ENDIANNESS=INVERTED ds = drv.Create('/vsimem/tiff_write_139.tif', 4, 1, 1, gdal.GDT_Float64, options=['PREDICTOR=3', 'COMPRESS=DEFLATE']) ref_content = struct.pack('d' * 4, 1, -1e100, 1e10, -1e5) ds.GetRasterBand(1).WriteRaster(0, 0, 4, 1, ref_content) ds = None ds = gdal.Open('/vsimem/tiff_write_139.tif') content = ds.GetRasterBand(1).ReadRaster() assert ref_content == content, struct.unpack('d' * 4, content) ds = None gdal.Unlink('/vsimem/tiff_write_139.tif') ############################################################################### # Test setting a band to alpha def test_tiff_write_140(): # Nominal case: set alpha to last band ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_140.tif', 1, 1, 5) ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_140.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_140.tif') assert ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None # Strange case: set alpha to a band, but it is already set on another one ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_140.tif', 1, 1, 5) ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) # Should emit a warning gdal.ErrorReset() with gdaltest.error_handler(): ret = ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) assert gdal.GetLastErrorMsg() != '' assert ret == 0 ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_140.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_140.tif') assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None # Strange case: set alpha to a band, but it is already set on another one (because of ALPHA=YES) ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_140.tif', 1, 1, 5, options=['ALPHA=YES']) # Should emit a warning mentioning ALPHA creation option. gdal.ErrorReset() with gdaltest.error_handler(): ret = ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) assert gdal.GetLastErrorMsg().find('ALPHA') >= 0 assert ret == 0 ds = None statBuf = gdal.VSIStatL('/vsimem/tiff_write_140.tif.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open('/vsimem/tiff_write_140.tif') assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_140.tif') ############################################################################### # Test GEOTIFF_KEYS_FLAVOR=ESRI_PE with EPSG:3857 def test_tiff_write_141(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_141.tif', 1, 1, options=['GEOTIFF_KEYS_FLAVOR=ESRI_PE']) srs = osr.SpatialReference() srs.ImportFromEPSG(3857) ds.SetProjection(srs.ExportToWkt()) ds = None ds = gdal.Open('/vsimem/tiff_write_141.tif') wkt = ds.GetProjectionRef() ds = None assert wkt.startswith('PROJCS["WGS 84 / Pseudo-Mercator"') assert 'EXTENSION["PROJ4"' in wkt gdaltest.tiff_drv.Delete('/vsimem/tiff_write_141.tif') ############################################################################### # Test PixelIsPoint without SRS (#6225) def test_tiff_write_142(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_142.tif', 1, 1) ds.SetMetadataItem('AREA_OR_POINT', 'Point') ds.SetGeoTransform([10, 1, 0, 100, 0, -1]) ds = None src_ds = gdal.Open('/vsimem/tiff_write_142.tif') gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_142_2.tif', src_ds) src_ds = None ds = gdal.Open('/vsimem/tiff_write_142_2.tif') gt = ds.GetGeoTransform() md = ds.GetMetadataItem('AREA_OR_POINT') ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_142.tif') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_142_2.tif') gt_expected = (10, 1, 0, 100, 0, -1) assert gt == gt_expected, 'did not get expected geotransform' assert md == 'Point', 'did not get expected AREA_OR_POINT value' ############################################################################### # Check that we detect that free space isn't sufficient def test_tiff_write_143(): with gdaltest.error_handler(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_143.tif', 1000000000, 1000000000) assert ds is None ############################################################################### # Test creating a real BigTIFF file > 4 GB with multiple directories (on filesystems supporting sparse files) def test_tiff_write_144(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() # 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('GTiff').Create('tmp/tiff_write_144.tif', 20, 20, 1, options=['BIGTIFF=YES']) ds.GetRasterBand(1).Fill(255) ds = None # Extend the file to 4 GB f = open('tmp/tiff_write_144.tif', 'rb+') f.seek(4294967296, 0) f.write(' '.encode('ascii')) f.close() ds = gdal.Open('tmp/tiff_write_144.tif', gdal.GA_Update) ds.BuildOverviews('NEAR', [2]) ds = None ds = gdal.Open('tmp/tiff_write_144.tif') got_cs = ds.GetRasterBand(1).Checksum() got_cs_ovr = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None gdal.Unlink('tmp/tiff_write_144.tif') assert got_cs == 4873 and got_cs_ovr == 1218 ############################################################################### # Test various warnings / errors of Create() def test_tiff_write_145(): options_list = [{'bands': 65536, 'expected_failure': True}, {'creation_options': ['INTERLEAVE=foo'], 'expected_failure': True}, {'creation_options': ['COMPRESS=foo'], 'expected_failure': False}, {'creation_options': ['STREAMABLE_OUTPUT=YES', 'SPARSE_OK=YES'], 'expected_failure': True}, {'creation_options': ['STREAMABLE_OUTPUT=YES', 'COPY_SRC_OVERVIEWS=YES'], 'expected_failure': True}, {'use_tmp': True, 'xsize': 100000, 'ysize': 100000, 'creation_options': ['BIGTIFF=NO'], 'expected_failure': True}, {'creation_options': ['ENDIANNESS=foo'], 'expected_failure': False}, {'creation_options': ['NBITS=9'], 'expected_failure': False}, {'datatype': gdal.GDT_Float32, 'creation_options': ['NBITS=8'], 'expected_failure': False}, {'datatype': gdal.GDT_UInt16, 'creation_options': ['NBITS=8'], 'expected_failure': False}, {'datatype': gdal.GDT_UInt16, 'creation_options': ['NBITS=17'], 'expected_failure': False}, {'datatype': gdal.GDT_UInt32, 'creation_options': ['NBITS=16'], 'expected_failure': False}, {'datatype': gdal.GDT_UInt32, 'creation_options': ['NBITS=33'], 'expected_failure': False}, {'bands': 3, 'creation_options': ['PHOTOMETRIC=YCBCR'], 'expected_failure': True}, {'bands': 3, 'creation_options': ['PHOTOMETRIC=YCBCR', 'COMPRESS=JPEG', 'INTERLEAVE=BAND'], 'expected_failure': True}, {'bands': 1, 'creation_options': ['PHOTOMETRIC=YCBCR', 'COMPRESS=JPEG'], 'expected_failure': True}, {'creation_options': ['PHOTOMETRIC=foo'], 'expected_failure': False}, {'creation_options': ['PHOTOMETRIC=RGB'], 'expected_failure': False}, {'creation_options': ['TILED=YES', 'BLOCKSIZE=1', 'BLOCKYSIZE=1'], 'expected_failure': True}, ] for options in options_list: xsize = options.get('xsize', 1) ysize = options.get('ysize', 1) bands = options.get('bands', 1) datatype = options.get('datatype', gdal.GDT_Byte) use_tmp = options.get('use_tmp', False) if use_tmp: filename = 'tmp/tiff_write_145.tif' else: filename = '/vsimem/tiff_write_145.tif' creation_options = options.get('creation_options', []) gdal.Unlink(filename) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdaltest.tiff_drv.Create(filename, xsize, ysize, bands, datatype, options=creation_options) if ds is not None and options.get('expected_failure', False): print(options) pytest.fail('expected failure, but did not get it') elif ds is None and not options.get('expected_failure', False): print(options) pytest.fail('got failure, but did not expect it') ds = None # print(gdal.GetLastErrorMsg()) if gdal.GetLastErrorMsg() == '': print(options) pytest.fail('did not get any warning/error') gdal.Unlink(filename) ############################################################################### # Test implicit JPEG-in-TIFF overviews with RGBA (not completely sure this # is a legal formulation since 4 bands should probably be seen as CMYK) def test_tiff_write_146(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() tmp_ds = gdal.Translate('', 'data/stefan_full_rgba.tif', format='MEM') original_stats = [tmp_ds.GetRasterBand(i + 1).ComputeStatistics(True) for i in range(4)] gdal.Translate('/vsimem/tiff_write_146.tif', 'data/stefan_full_rgba.tif', options='-outsize 1000% 1000% -co COMPRESS=JPEG') out_ds = gdal.Open('/vsimem/tiff_write_146.tif') got_stats = [out_ds.GetRasterBand(i + 1).GetOverview(2).ComputeStatistics(True) for i in range(4)] out_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_write_146.tif') for i in range(4): for j in range(4): assert i == 2 or j < 2 or abs(original_stats[i][j] - got_stats[i][j]) <= 5, \ 'did not get expected statistics' ############################################################################### # Test that we don't use implicit JPEG-in-TIFF overviews with CMYK when converting # to RGBA def test_tiff_write_147(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') gdal.Translate('/vsimem/tiff_write_147.tif', '../gdrivers/data/rgb_ntf_cmyk.jpg', options='-outsize 1000% 1000% -co COMPRESS=JPEG -co PHOTOMETRIC=CMYK') gdal.SetConfigOption('GDAL_JPEG_TO_RGB', None) gdal.SetConfigOption('GDAL_PAM_ENABLED', None) out_ds = gdal.Open('/vsimem/tiff_write_147.tif') assert out_ds.GetRasterBand(1).GetOverview(0) is None, 'did not expected overview' out_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_write_147.tif') ############################################################################### # Test that we can use implicit JPEG-in-TIFF overviews with CMYK in raw mode def test_tiff_write_148(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') tmp_ds = gdal.Translate('', '../gdrivers/data/rgb_ntf_cmyk.jpg', format='MEM') gdal.SetConfigOption('GDAL_JPEG_TO_RGB', None) original_stats = [tmp_ds.GetRasterBand(i + 1).ComputeStatistics(True) for i in range(4)] gdal.SetConfigOption('GDAL_JPEG_TO_RGB', 'NO') gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') gdal.Translate('/vsimem/tiff_write_148.tif', '../gdrivers/data/rgb_ntf_cmyk.jpg', options='-outsize 1000% 1000% -co COMPRESS=JPEG -co PHOTOMETRIC=CMYK') gdal.SetConfigOption('GDAL_JPEG_TO_RGB', None) gdal.SetConfigOption('GDAL_PAM_ENABLED', None) out_ds = gdal.Open('GTIFF_RAW:/vsimem/tiff_write_148.tif') got_stats = [out_ds.GetRasterBand(i + 1).GetOverview(0).ComputeStatistics(True) for i in range(4)] out_ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_write_148.tif') for i in range(4): for j in range(4): assert j < 2 or abs(original_stats[i][j] - got_stats[i][j]) <= 5, \ 'did not get expected statistics' ############################################################################### # Test filling missing blocks with nodata def test_tiff_write_149(): # Power-of-two bit depth ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_149.tif', 1, 1) ds.GetRasterBand(1).SetNoDataValue(127) ds = None ds = gdal.Open('/vsimem/tiff_write_149.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 1 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_149.tif') # Test implicit blocks expected_cs = 13626 ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_149.tif', 40, 30, 2, gdal.GDT_UInt16, options=['NBITS=12', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'INTERLEAVE=BAND', 'SPARSE_OK=YES']) ds.GetRasterBand(1).SetNoDataValue(127) ds.GetRasterBand(2).SetNoDataValue(127) ds = None ds = gdal.Open('/vsimem/tiff_write_149.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs gdaltest.tiff_drv.Delete('/vsimem/tiff_write_149.tif') # NBITS=12, SEPARATE. Checksum must be the same as in the implicit blocks case ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_149.tif', 40, 30, 2, gdal.GDT_UInt16, options=['NBITS=12', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'INTERLEAVE=BAND']) ds.GetRasterBand(1).SetNoDataValue(127) ds.GetRasterBand(2).SetNoDataValue(127) ds = None ds = gdal.Open('/vsimem/tiff_write_149.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs gdaltest.tiff_drv.Delete('/vsimem/tiff_write_149.tif') # NBITS=12, CONTIG. Checksum must be the same as in the implicit blocks case ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_149.tif', 40, 30, 2, gdal.GDT_UInt16, options=['NBITS=12', 'TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16', 'INTERLEAVE=PIXEL']) ds.GetRasterBand(1).SetNoDataValue(127) ds.GetRasterBand(2).SetNoDataValue(127) ds = None ds = gdal.Open('/vsimem/tiff_write_149.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == expected_cs gdaltest.tiff_drv.Delete('/vsimem/tiff_write_149.tif') ############################################################################### # Test failure when loading block from disk in IWriteBlock() def test_tiff_write_150(): shutil.copy('data/tiled_bad_offset.tif', 'tmp/tiled_bad_offset.tif') ds = gdal.Open('tmp/tiled_bad_offset.tif', gdal.GA_Update) ds.GetRasterBand(1).Fill(0) gdal.ErrorReset() with gdaltest.error_handler(): ds.FlushCache() assert gdal.GetLastErrorMsg() != '' ds = None gdaltest.tiff_drv.Delete('tmp/tiled_bad_offset.tif') ############################################################################### # Test IWriteBlock() with more than 10 bands def test_tiff_write_151(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_151.tif', 1, 1, 11) ds = None ds = gdal.Open('/vsimem/tiff_write_151.tif', gdal.GA_Update) ds.GetRasterBand(1).Fill(1) ds = None ds = gdal.Open('/vsimem/tiff_write_151.tif', gdal.GA_Update) ds.GetRasterBand(1).Checksum() ds.GetRasterBand(2).Fill(1) ds.GetRasterBand(3).Fill(1) ds = None ds = gdal.Open('/vsimem/tiff_write_151.tif') assert ds.GetRasterBand(1).Checksum() == 1 assert ds.GetRasterBand(2).Checksum() == 1 assert ds.GetRasterBand(3).Checksum() == 1 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_151.tif') ############################################################################### # Test flushing of blocks in a contig multi band file with Create() def test_tiff_write_152(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_152.tif', 1, 1, 2, options=['NBITS=2']) ds.GetRasterBand(2).SetNoDataValue(3) ds.GetRasterBand(2).Fill(1) ds = None ds = gdal.Open('/vsimem/tiff_write_152.tif') assert ds.GetRasterBand(1).Checksum() == 0 assert ds.GetRasterBand(2).Checksum() == 1 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_152.tif') ############################################################################### # Test that empty blocks are created in a filesystem sparse way def test_tiff_write_153(): target_dir = 'tmp' if gdal.VSISupportsSparseFiles(target_dir) == 0: pytest.skip() gdaltest.tiff_drv.Create(target_dir + '/tiff_write_153.tif', 500, 500) f = gdal.VSIFOpenL(target_dir + '/tiff_write_153.tif', 'rb') ret = gdal.VSIFGetRangeStatusL(f, 500 * 500, 1) gdal.VSIFCloseL(f) gdaltest.tiff_drv.Delete(target_dir + '/tiff_write_153.tif') assert ret != gdal.VSI_RANGE_STATUS_DATA ############################################################################### # Test empty block writing skipping and SPARSE_OK in CreateCopy() and Open() def test_tiff_write_154(): import struct src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['BLOCKYSIZE=256']) ds.FlushCache() # At that point empty blocks have not yet been flushed assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 162 ds = None # Now they are and that's done in a filesystem sparse way. TODO: check this assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 256162 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['BLOCKYSIZE=256', 'COMPRESS=DEFLATE']) ds.FlushCache() # With compression, empty blocks are written right away assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 462 ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 462 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') # SPARSE_OK in CreateCopy(): blocks are not written ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['SPARSE_OK=YES', 'BLOCKYSIZE=256']) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 162 # SPARSE_OK in Open()/update: blocks are not written ds = gdal.OpenEx('/vsimem/tiff_write_154.tif', gdal.OF_UPDATE, open_options=['SPARSE_OK=YES']) ds.GetRasterBand(1).Fill(0) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 162 ds = None # Default behaviour in Open()/update: blocks are written ds = gdal.OpenEx('/vsimem/tiff_write_154.tif', gdal.OF_UPDATE) ds.GetRasterBand(1).Fill(0) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 250162 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') # SPARSE_OK in CreateCopy() in compressed case (strips): blocks are not written ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['SPARSE_OK=YES', 'BLOCKYSIZE=256', 'COMPRESS=DEFLATE']) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 174 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') # SPARSE_OK in CreateCopy() in compressed case (tiling): blocks are not written ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['SPARSE_OK=YES', 'TILED=YES']) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 190 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') # Test detection of 0 blocks for all data types for dt in ['signedbyte', gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: # SPARSE_OK in CreateCopy(): blocks are not written if dt == 'signedbyte': src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500, 1, gdal.GDT_Byte) options = ['SPARSE_OK=YES', 'BLOCKYSIZE=256', 'PIXELTYPE=SIGNEDBYTE'] else: src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500, 1, dt) options = ['SPARSE_OK=YES', 'BLOCKYSIZE=256'] gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=options) assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 162, dt # Test detection of nodata blocks with nodata != 0 for all data types for dt in ['signedbyte', gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64]: # SPARSE_OK in CreateCopy(): blocks are not written if dt == 'signedbyte': src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500, 1, gdal.GDT_Byte) options = ['SPARSE_OK=YES', 'BLOCKYSIZE=256', 'PIXELTYPE=SIGNEDBYTE'] else: src_ds = gdal.GetDriverByName('MEM').Create('', 500, 500, 1, dt) options = ['SPARSE_OK=YES', 'BLOCKYSIZE=256'] src_ds.GetRasterBand(1).Fill(1) src_ds.GetRasterBand(1).SetNoDataValue(1) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=options) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 174, dt # Test optimized detection when nodata==0, and with the last pixel != 0 src_ds = gdal.GetDriverByName('MEM').Create('', 100, 1, 1) src_ds.GetRasterBand(1).Fill(0) src_ds.GetRasterBand(1).WriteRaster(99, 0, 1, 1, struct.pack('B' * 1, 1)) gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_154.tif', src_ds, options=['SPARSE_OK=YES']) assert gdal.VSIStatL('/vsimem/tiff_write_154.tif').size == 246 gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') # Test that setting nodata doesn't prevent blocks to be written (#6706) ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_154.tif', 1, 100, 1) ds.GetRasterBand(1).SetNoDataValue(1) ds = None ds = gdal.Open('/vsimem/tiff_write_154.tif') offset = ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_154.tif') assert not (offset is None or int(offset) == 0) ############################################################################### # Test reading and writing band description def test_tiff_write_155(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_155.tif', 1, 1) ds.GetRasterBand(1).SetDescription('foo') ds = None assert gdal.VSIStatL('/vsimem/tiff_write_155.tif.aux.xml') is None ds = gdal.Open('/vsimem/tiff_write_155.tif') assert ds.GetRasterBand(1).GetDescription() == 'foo' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_155.tif') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_155.tif', 1, 1, options=['PROFILE=GeoTIFF']) ds.GetRasterBand(1).SetDescription('foo') ds = None assert gdal.VSIStatL('/vsimem/tiff_write_155.tif.aux.xml') is not None ds = gdal.Open('/vsimem/tiff_write_155.tif') assert ds.GetRasterBand(1).GetDescription() == 'foo' ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_155.tif') ############################################################################### # Test GetDataCoverageStatus() def test_tiff_write_156(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_156.tif', 64, 64, options=['SPARSE_OK=YES', 'TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=32']) ds.GetRasterBand(1).WriteRaster(0, 0, 1, 1, 'X') (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(0, 0, 32, 32) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA and pct == 100.0 (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(32, 0, 32, 32) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_EMPTY and pct == 0.0 (flags, pct) = ds.GetRasterBand(1).GetDataCoverageStatus(16, 16, 32, 32) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA | gdal.GDAL_DATA_COVERAGE_STATUS_EMPTY and pct == 25.0 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_156.tif') # Test fix for #6703 ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_156.tif', 1, 512, options=['SPARSE_OK=YES', 'BLOCKYSIZE=1']) ds.GetRasterBand(1).WriteRaster(0, 100, 1, 1, 'X') ds = None ds = gdal.Open('/vsimem/tiff_write_156.tif') flags, _ = ds.GetRasterBand(1).GetDataCoverageStatus(0, 100, 1, 1) assert flags == gdal.GDAL_DATA_COVERAGE_STATUS_DATA ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_156.tif') ############################################################################### # Test Float16 def test_tiff_write_157(): import struct # Write controlled values of Float16 vals = struct.pack('H' * 14, 0x0000, # Positive zero 0x8000, # Negative zero 0x7C00, # Positive infinity 0xFC00, # Negative infinity 0x7E00, # Some positive quiet NaN 0xFE00, # Some negative quiet NaN 0x3D00, # 1.25 0xBD00, # -1.25 0x0001, # Smallest positive denormalized value 0x8001, # Smallest negative denormalized value 0x03FF, # Largest positive denormalized value 0x83FF, # Largest negative denormalized value 0x0400, # Smallest positive normalized value 0x8400, # Smallest negative normalized value ) ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_157.tif', 14, 1, 1, gdal.GDT_Float32, options=['NBITS=16']) ds = None ds = gdal.Open('/vsimem/tiff_write_157.tif') offset = int(ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) ds = None f = gdal.VSIFOpenL('/vsimem/tiff_write_157.tif', 'rb+') gdal.VSIFSeekL(f, offset, 0) gdal.VSIFWriteL(vals, 1, len(vals), f) gdal.VSIFCloseL(f) # Check that we properly deserialize Float16 values ds = gdal.Open('/vsimem/tiff_write_157.tif') assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '16' got = struct.unpack('f' * 14, ds.ReadRaster()) expected = [0.0, -0.0, gdaltest.posinf(), -gdaltest.posinf(), gdaltest.NaN(), gdaltest.NaN(), 1.25, -1.25, 5.9604644775390625e-08, -5.9604644775390625e-08, 6.0975551605224609e-05, -6.0975551605224609e-05, 6.103515625e-05, -6.103515625e-05] for i in range(14): if i == 4 or i == 5: assert got[i] != got[i] elif abs(got[i] - expected[i]) > 1e-15: print(got[i]) print(expected[i]) pytest.fail(i) # Check that we properly decode&re-encode Float16 values gdal.Translate('/vsimem/tiff_write_157_dst.tif', ds) ds = None ds = gdal.Open('/vsimem/tiff_write_157_dst.tif') offset = int(ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) ds = None f = gdal.VSIFOpenL('/vsimem/tiff_write_157_dst.tif', 'rb') gdal.VSIFSeekL(f, offset, 0) vals_copied = gdal.VSIFReadL(1, 14 * 2, f) gdal.VSIFCloseL(f) if vals != vals_copied: print(struct.unpack('H' * 14, vals)) pytest.fail(struct.unpack('H' * 14, vals_copied)) gdaltest.tiff_drv.Delete('/vsimem/tiff_write_157.tif') gdaltest.tiff_drv.Delete('/vsimem/tiff_write_157_dst.tif') # Now try Float32 -> Float16 conversion ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_157.tif', 18, 1, 1, gdal.GDT_Float32, options=['NBITS=16']) vals = struct.pack('I' * 18, 0x00000000, # Positive zero 0x80000000, # Negative zero 0x7f800000, # Positive infinity 0xff800000, # Negative infinity 0x7fc00000, # Some positive quiet NaN 0xffc00000, # Some negative quiet NaN 0x7f800001, # Some positive signaling NaN with significant that will get lost 0xff800001, # Some negative signaling NaN with significant that will get lost 0x3fa00000, # 1.25 0xbfa00000, # -1.25 0x00000001, # Smallest positive denormalized value 0x80000001, # Smallest negative denormalized value 0x007fffff, # Largest positive denormalized value 0x807fffff, # Largest negative denormalized value 0x00800000, # Smallest positive normalized value 0x80800000, # Smallest negative normalized value 0x33800000, # 5.9604644775390625e-08 = Smallest number that can be converted as a float16 denormalized value 0x47800000, # 65536 --> converted to infinity ) ds.GetRasterBand(1).WriteRaster(0, 0, 18, 1, vals, buf_type=gdal.GDT_Float32) with gdaltest.error_handler(): ds.FlushCache() ds = None ds = gdal.Open('/vsimem/tiff_write_157.tif') got = struct.unpack('f' * 18, ds.ReadRaster()) ds = None expected = (0.0, -0.0, gdaltest.posinf(), -gdaltest.posinf(), gdaltest.NaN(), gdaltest.NaN(), gdaltest.NaN(), gdaltest.NaN(), 1.25, -1.25, 0.0, -0.0, 0.0, -0.0, 0.0, -0.0, 5.9604644775390625e-08, gdaltest.posinf()) for i in range(18): if i == 4 or i == 5: assert got[i] != got[i] elif abs(got[i] - expected[i]) > 1e-15: print(got[i]) print(expected[i]) pytest.fail(i) gdaltest.tiff_drv.Delete('/vsimem/tiff_write_157.tif') # Test pixel interleaved gdal.Translate('/vsimem/tiff_write_157.tif', '../gdrivers/data/small_world.tif', options='-co NBITS=16 -ot Float32') ds = gdal.Open('/vsimem/tiff_write_157.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 30111 cs = ds.GetRasterBand(2).Checksum() assert cs == 32302 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_157.tif') ############################################################################### # Test GetActualBlockSize() (perhaps not the best place for that...) def test_tiff_write_158(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_158.tif', 20, 40, 1, options=['TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=32']) (w, h) = ds.GetRasterBand(1).GetActualBlockSize(0, 0) assert (w, h) == (16, 32) (w, h) = ds.GetRasterBand(1).GetActualBlockSize(1, 1) assert (w, h) == (4, 8) res = ds.GetRasterBand(1).GetActualBlockSize(2, 0) assert res is None res = ds.GetRasterBand(1).GetActualBlockSize(0, 2) assert res is None res = ds.GetRasterBand(1).GetActualBlockSize(-1, 0) assert res is None res = ds.GetRasterBand(1).GetActualBlockSize(0, -1) assert res is None ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_158.tif') ############################################################################### # Test that COPY_SRC_OVERVIEWS creation option with JPEG compression # result in a https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF def test_tiff_write_159(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('BIGTIFF') == -1: pytest.skip() prev_table = '' for options in [[], ['JPEG_QUALITY=50'], ['PHOTOMETRIC=YCBCR']]: src_ds = gdal.Translate('', '../gdrivers/data/small_world.tif', format='MEM') src_ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_159.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES', 'COMPRESS=JPEG'] + options) ds = None src_ds = None ds = gdal.Open('/vsimem/tiff_write_159.tif') cs0 = ds.GetRasterBand(1).Checksum() cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2 = ds.GetRasterBand(1).GetOverview(1).Checksum() assert not (cs0 == 0 or cs1 == 0 or cs2 == 0), options ifd_main = int(ds.GetRasterBand(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) ifd_ovr_0 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('IFD_OFFSET', 'TIFF')) ifd_ovr_1 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('IFD_OFFSET', 'TIFF')) data_ovr_1 = int(ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) data_ovr_0 = int(ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) data_main = int(ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF')) assert (ifd_main < ifd_ovr_0 and ifd_ovr_0 < ifd_ovr_1 and ifd_ovr_1 < data_ovr_1 and data_ovr_1 < data_ovr_0 and data_ovr_0 < data_main), \ options table_main = ds.GetRasterBand(1).GetMetadataItem('JPEGTABLES', 'TIFF') table_ovr_0 = ds.GetRasterBand(1).GetOverview(0).GetMetadataItem('JPEGTABLES', 'TIFF') table_ovr_1 = ds.GetRasterBand(1).GetOverview(1).GetMetadataItem('JPEGTABLES', 'TIFF') assert table_main == table_ovr_0 and table_ovr_0 == table_ovr_1, options # Check that the JPEG tables are different in the 3 modes assert table_main != prev_table, options prev_table = table_main ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_159.tif') for value in range(4): src_ds = gdal.Translate('', 'data/byte.tif', format='MEM') src_ds.BuildOverviews('NEAR', overviewlist=[2]) ds = gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_159.tif', src_ds, options=['COPY_SRC_OVERVIEWS=YES', 'COMPRESS=JPEG', 'JPEGTABLESMODE=%d' % value]) ds = None src_ds = None ds = gdal.Open('/vsimem/tiff_write_159.tif') cs0 = ds.GetRasterBand(1).Checksum() cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs0 == 4743 and cs1 == 1133, value ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_159.tif') ############################################################################### # Test the Create() interface with a BLOCKYSIZE > image height def test_tiff_write_160(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_160.tif', 10, 10, options=['BLOCKYSIZE=11']) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.Open('/vsimem/tiff_write_160.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 1218 ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_160.tif') ############################################################################### # Test setting GCPs on an image with already a geotransform and vice-versa (#6751) def test_tiff_write_161(): ds = gdaltest.tiff_drv.Create('/vsimem/tiff_write_161.tif', 1, 1) ds.SetGeoTransform([0, 1, 2, 3, 4, 5]) ds = None ds = gdal.Open('/vsimem/tiff_write_161.tif', gdal.GA_Update) src_ds = gdal.Open('data/gcps.vrt') with gdaltest.error_handler(): assert ds.SetGCPs(src_ds.GetGCPs(), '') == 0 assert ds.GetGeoTransform(can_return_null=True) is None ds = None ds = gdal.Open('/vsimem/tiff_write_161.tif', gdal.GA_Update) assert ds.GetGCPs() assert ds.GetGeoTransform(can_return_null=True) is None with gdaltest.error_handler(): assert ds.SetGeoTransform([0, 1, 2, 3, 4, 5]) == 0 assert ds.GetGeoTransform() == (0.0, 1.0, 2.0, 3.0, 4.0, 5.0) assert not ds.GetGCPs() ds = None ds = gdal.Open('/vsimem/tiff_write_161.tif', gdal.GA_Update) assert not ds.GetGCPs() assert ds.GetGeoTransform() == (0.0, 1.0, 2.0, 3.0, 4.0, 5.0) ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_161.tif') ############################################################################### # Test creating a JPEG compressed file with big tiles (#6757) def test_tiff_write_162(): src_ds = gdal.GetDriverByName('MEM').Create('', 512, 512, 3) options = ['TILED=YES', 'BLOCKXSIZE=512', 'BLOCKYSIZE=512', 'COMPRESS=JPEG'] gdaltest.tiff_drv.CreateCopy('/vsimem/tiff_write_162.tif', src_ds, options=options) assert gdal.GetLastErrorMsg() == '' gdaltest.tiff_drv.Delete('/vsimem/tiff_write_162.tif') ############################################################################### # Test creating a file that would trigger strip chopping (#6924) def test_tiff_write_163(): # Was a libtiff 4.0.8 regression if gdaltest.tiff_drv.GetMetadataItem('LIBTIFF').find('4.0.8') >= 0: pytest.skip('Test broken with libtiff 4.0.8') gdal.Translate('/vsimem/tiff_write_163.tif', 'data/byte.tif', options='-outsize 1 20000 -co BLOCKYSIZE=20000 -co PROFILE=BASELINE') ds = gdal.Open('/vsimem/tiff_write_163.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 47567 # Check that IsBlockAvailable() works properly in that mode offset_0_2 = ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_2', 'TIFF') assert offset_0_2 == str(146 + 2 * 8192) ds = None gdaltest.tiff_drv.Delete('/vsimem/tiff_write_163.tif') ############################################################################### # Test that we handle [0,1,0,0,0,1] geotransform as a regular geotransform def test_tiff_write_164(): ds = gdaltest.tiff_drv.Create('/vsimem/test.tif', 1, 1) ds.SetGeoTransform([0, 1, 0, 0, 0, 1]) ds = None ds = gdal.Open('/vsimem/test.tif') gt = ds.GetGeoTransform(can_return_null=True) ds = None assert gt == (0, 1, 0, 0, 0, 1) # Test [0,1,0,0,0,-1] as well ds = gdaltest.tiff_drv.Create('/vsimem/test.tif', 1, 1) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) ds = None ds = gdal.Open('/vsimem/test.tif') gt = ds.GetGeoTransform(can_return_null=True) ds = None assert gt == (0, 1, 0, 0, 0, -1) gdal.Unlink('/vsimem/test.tif') ############################################################################### # Test the current behaviour of per-band nodata vs per-dataset serialization def test_tiff_write_165(): ds = gdaltest.tiff_drv.Create('/vsimem/test.tif', 1, 1, 3) ret = ds.GetRasterBand(1).SetNoDataValue(100) assert ret == 0 with gdaltest.error_handler(): ret = ds.GetRasterBand(2).SetNoDataValue(200) assert gdal.GetLastErrorMsg() != '', 'warning expected, but not emitted' assert ret == 0 nd = ds.GetRasterBand(1).GetNoDataValue() assert nd == 100 nd = ds.GetRasterBand(2).GetNoDataValue() assert nd == 200 ds = None ds = gdal.Open('/vsimem/test.tif') nd = ds.GetRasterBand(1).GetNoDataValue() ds = None assert nd == 200 gdal.Unlink('/vsimem/test.tif') ############################################################################### # Test reading & writing Z dimension for ModelTiepointTag and ModelPixelScaleTag (#7093) def test_tiff_write_166(): with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('data/tiff_vertcs_scale_offset.tif') assert ds.GetRasterBand(1).GetScale() == 2.0 assert ds.GetRasterBand(1).GetOffset() == 10.0 # Scale + offset through CreateCopy() gdal.Translate('/vsimem/tiff_write_166.tif', 'data/byte.tif', options='-a_srs EPSG:26711+5773 -a_scale 2.0 -a_offset 10 -co PROFILE=GEOTIFF') assert gdal.VSIStatL('/vsimem/tiff_write_166.tif.aux.xml') is None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_166.tif') assert ds.GetRasterBand(1).GetScale() == 2.0 assert ds.GetRasterBand(1).GetOffset() == 10.0 ds = None gdal.Unlink('/vsimem/tiff_write_166.tif') # Offset only through CreateCopy() gdal.Translate('/vsimem/tiff_write_166.tif', 'data/byte.tif', options='-a_srs EPSG:26711+5773 -a_offset 10 -co PROFILE=GEOTIFF') assert gdal.VSIStatL('/vsimem/tiff_write_166.tif.aux.xml') is None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_166.tif') assert ds.GetRasterBand(1).GetScale() == 1.0 assert ds.GetRasterBand(1).GetOffset() == 10.0 ds = None gdal.Unlink('/vsimem/tiff_write_166.tif') # Scale + offset through Create() ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_166.tif', 1, 1, options=['PROFILE=GEOTIFF']) sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:26711+5773') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([440720, 60, 0, 3751320, 0, -60]) ds.GetRasterBand(1).SetScale(2) ds.GetRasterBand(1).SetOffset(10) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_166.tif.aux.xml') is None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_166.tif') assert ds.GetRasterBand(1).GetScale() == 2.0 assert ds.GetRasterBand(1).GetOffset() == 10.0 ds = None gdal.Unlink('/vsimem/tiff_write_166.tif') # Scale only through Create() ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_166.tif', 1, 1, options=['PROFILE=GEOTIFF']) sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:26711+5773') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([440720, 60, 0, 3751320, 0, -60]) ds.GetRasterBand(1).SetScale(2) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_166.tif.aux.xml') is None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_166.tif') assert ds.GetRasterBand(1).GetScale() == 2.0 assert ds.GetRasterBand(1).GetOffset() == 0.0 ds = None gdal.Unlink('/vsimem/tiff_write_166.tif') # Offset only through through Create() ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_write_166.tif', 1, 1, options=['PROFILE=GEOTIFF']) sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:26711+5773') ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([440720, 60, 0, 3751320, 0, -60]) ds.GetRasterBand(1).SetOffset(10) ds = None assert gdal.VSIStatL('/vsimem/tiff_write_166.tif.aux.xml') is None with gdaltest.config_option('GTIFF_REPORT_COMPD_CS', 'YES'): ds = gdal.Open('/vsimem/tiff_write_166.tif') assert ds.GetRasterBand(1).GetScale() == 1.0 assert ds.GetRasterBand(1).GetOffset() == 10.0 ds = None gdal.Unlink('/vsimem/tiff_write_166.tif') ############################################################################### def test_tiff_write_167_deflate_zlevel(): src_ds = gdal.Open('data/byte.tif') gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', src_ds, options=['COMPRESS=DEFLATE', 'ZLEVEL=1']) size1 = gdal.VSIStatL('/vsimem/out.tif').size gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', src_ds, options=['COMPRESS=DEFLATE', 'NUM_THREADS=2', 'ZLEVEL=9']) size2 = gdal.VSIStatL('/vsimem/out.tif').size gdal.Unlink('/vsimem/out.tif') assert size2 < size1 ds = gdal.GetDriverByName('GTiff').Create('/vsimem/out.tif', 20, 20, 1, options=['COMPRESS=DEFLATE', 'ZLEVEL=9']) ds.SetProjection(src_ds.GetProjectionRef()) ds.SetGeoTransform(src_ds.GetGeoTransform()) ds.WriteRaster(0, 0, 20, 20, src_ds.ReadRaster()) ds = None size2_create = gdal.VSIStatL('/vsimem/out.tif').size gdal.Unlink('/vsimem/out.tif') assert size2 == size2_create ############################################################################### # Test CCITTFAX3 def test_tiff_write_168_ccitfax3(): ut = gdaltest.GDALTest('GTiff', 'oddsize1bit.tif', 1, 5918, options=['NBITS=1', 'COMPRESS=CCITTFAX3']) return ut.testCreateCopy() ############################################################################### # Test CCITTRLE def test_tiff_write_169_ccitrle(): ut = gdaltest.GDALTest('GTiff', 'oddsize1bit.tif', 1, 5918, options=['NBITS=1', 'COMPRESS=CCITTRLE']) return ut.testCreateCopy() ############################################################################### # Test invalid compression method def test_tiff_write_170_invalid_compresion(): src_ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/out.tif', src_ds, options=['COMPRESS=INVALID']) assert gdal.GetLastErrorMsg() != '' gdal.Unlink('/vsimem/out.tif') ############################################################################### # Test ZSTD compression def test_tiff_write_171_zstd(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=ZSTD', 'ZSTD_LEVEL=1']) return ut.testCreateCopy() ############################################################################### # Test ZSTD compression with PREDICTOR = 2 def test_tiff_write_171_zstd_predictor(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=ZSTD', 'ZSTD_LEVEL=1', 'PREDICTOR=2']) return ut.testCreateCopy() ############################################################################### # Test WEBP compression def test_tiff_write_webp(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'md_ge_rgb_0010000.tif', 0, None, options=['COMPRESS=WEBP']) return ut.testCreateCopy() ############################################################################### # Test WEBP compression with internal tiling def test_tiff_write_tiled_webp(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: pytest.skip() if md['DMD_CREATIONOPTIONLIST'].find('WEBP_LOSSLESS') == -1: pytest.skip() filename = '/vsimem/tiff_write_tiled_webp.tif' src_ds = gdal.Open('data/md_ge_rgb_0010000.tif') gdaltest.tiff_drv.CreateCopy(filename, src_ds, options=['COMPRESS=WEBP', 'WEBP_LOSSLESS=true', 'TILED=true']) ds = gdal.Open(filename) cs = [ds.GetRasterBand(i+1).Checksum() for i in range(3)] assert cs == [21212, 21053, 21349] gdaltest.tiff_drv.Delete(filename) gdal.Unlink('data/md_ge_rgb_0010000.tif.aux.xml') ############################################################################### # Test WEBP compression with huge single strip def test_tiff_write_webp_huge_single_strip(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: pytest.skip() filename = '/vsimem/tif_webp_huge_single_strip.tif' src_ds = gdal.Open('data/tif_webp_huge_single_strip.tif') gdaltest.tiff_drv.CreateCopy(filename, src_ds, options=['COMPRESS=WEBP', 'BLOCKYSIZE=2001']) ds = gdal.Open(filename) original_stats = [src_ds.GetRasterBand(i + 1).ComputeStatistics(True) for i in range(3)] got_stats = [ds.GetRasterBand(i + 1).ComputeStatistics(True) for i in range(3)] ds = None src_ds = None for i in range(3): for j in range(4): assert abs(original_stats[i][j] - got_stats[i][j]) <= 1e-1 * abs(original_stats[i][j]), \ 'did not get expected statistics' gdaltest.tiff_drv.Delete(filename) gdal.Unlink('data/tif_webp_huge_single_strip.tif.aux.xml') ############################################################################### # GeoTIFF DGIWG tags def test_tiff_write_172_geometadata_tiff_rsid(): tmpfilename = '/vsimem/tiff_write_172_geometadata_tiff_rsid.tiff' ds = gdal.GetDriverByName('GTiff').Create(tmpfilename, 1, 1) ds.SetMetadataItem('GEO_METADATA', 'foo') ds.SetMetadataItem('TIFF_RSID', 'bar') ds = None ds = gdal.Open(tmpfilename, gdal.GA_Update) assert ds.GetMetadataItem('GEO_METADATA') == 'foo', ds.GetMetadata() assert ds.GetMetadataItem('TIFF_RSID') == 'bar', ds.GetMetadata() ds.SetMetadata({}) ds = None ds = gdal.Open(tmpfilename) assert ds.GetMetadataItem('GEO_METADATA') is None, ds.GetMetadata() assert ds.GetMetadataItem('TIFF_RSID') is None, ds.GetMetadata() ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test LERC compression def test_tiff_write_173_lerc(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=LERC']) return ut.testCreateCopy() ############################################################################### # Test LERC_DEFLATE compression def test_tiff_write_174_lerc_deflate(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC_DEFLATE') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=LERC_DEFLATE']) return ut.testCreateCopy() ############################################################################### # Test LERC_DEFLATE compression def test_tiff_write_174_lerc_deflate_with_level(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC_DEFLATE') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=LERC_DEFLATE', 'ZLEVEL=1']) return ut.testCreateCopy() ############################################################################### # Test LERC_ZSTD compression def test_tiff_write_175_lerc_zstd(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC_ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=LERC_ZSTD']) return ut.testCreateCopy() ############################################################################### # Test LERC_ZSTD compression def test_tiff_write_175_lerc_zstd_with_level(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC_ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4672, options=['COMPRESS=LERC_ZSTD', 'ZSTD_LEVEL=1']) return ut.testCreateCopy() ############################################################################### # Test LERC compression with MAX_Z_ERROR def test_tiff_write_176_lerc_max_z_error(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte.tif', 1, 4529, options=['COMPRESS=LERC', 'MAX_Z_ERROR=1']) return ut.testCreateCopy(skip_preclose_test=1) ############################################################################### # Test LERC compression with several bands and tiling def test_tiff_write_177_lerc_several_bands_tiling(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/tiff_write_177_lerc_several_bands_tiling.tif' gdal.Translate(filename, '../gdrivers/data/small_world.tif', creationOptions=['COMPRESS=LERC', 'TILED=YES']) ds = gdal.Open(filename) cs = [ds.GetRasterBand(i+1).Checksum() for i in range(3)] ds = None gdal.Unlink(filename) assert cs == [30111, 32302, 40026] ############################################################################### # Test LERC compression with alpha band def test_tiff_write_178_lerc_with_alpha(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/tiff_write_178_lerc_with_alpha.tif' gdal.Translate(filename, 'data/stefan_full_rgba.tif', creationOptions=['COMPRESS=LERC']) ds = gdal.Open(filename) cs = [ds.GetRasterBand(i+1).Checksum() for i in range(4)] ds = None gdal.Unlink(filename) assert cs == [12603, 58561, 36064, 10807] ############################################################################### # Test LERC compression with alpha band with only 0 and 255 def test_tiff_write_178_lerc_with_alpha_0_and_255(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/tiff_write_178_lerc_with_alpha_0_and_255.tif' gdal.Translate(filename, 'data/rgba_with_alpha_0_and_255.tif', creationOptions=['COMPRESS=LERC']) ds = gdal.Open(filename) cs = [ds.GetRasterBand(i+1).Checksum() for i in range(4)] ds = None gdal.Unlink(filename) assert cs == [13, 13, 13, 13] ############################################################################### # Test LERC compression with different data types def test_tiff_write_179_lerc_data_types(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/tiff_write_179_lerc_data_types.tif' for src_filename in ['uint16.tif', 'int16.tif', 'uint32.tif', 'int32.tif', 'float32.tif', 'float64.tif']: gdal.Translate(filename, 'data/' + src_filename, creationOptions=['COMPRESS=LERC']) ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink(filename) assert cs == 4672 filename_tmp = filename + ".tmp.tif" gdal.Translate(filename_tmp, 'data/byte.tif', creationOptions=['PIXELTYPE=SIGNEDBYTE']) gdal.Translate(filename, filename_tmp, creationOptions=['COMPRESS=LERC']) gdal.Unlink(filename_tmp) ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() ds = None gdal.Unlink(filename) assert cs == 4672 gdal.ErrorReset() with gdaltest.error_handler(): gdal.Translate(filename, 'data/cfloat32.tif', creationOptions=['COMPRESS=LERC']) assert gdal.GetLastErrorMsg() != '' gdal.Unlink(filename) ############################################################################### # Test LERC compression with several bands and separate def test_tiff_write_180_lerc_separate(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/tiff_write_180_lerc_separate.tif' gdal.Translate(filename, '../gdrivers/data/small_world.tif', creationOptions=['COMPRESS=LERC', 'INTERLEAVE=BAND']) ds = gdal.Open(filename) cs = [ds.GetRasterBand(i+1).Checksum() for i in range(3)] ds = None gdal.Unlink(filename) assert cs == [30111, 32302, 40026] ############################################################################### # Test set XMP metadata def test_tiff_write_181_xmp(): src_ds = gdal.Open('data/utmsmall.tif') new_ds = gdaltest.tiff_drv.CreateCopy('tmp/test_181.tif', src_ds) src_ds = None xmp_ds = gdal.Open('../gdrivers/data/byte_with_xmp.tif') xmp = xmp_ds.GetMetadata('xml:XMP') xmp_ds = None assert 'W5M0MpCehiHzreSzNTczkc9d' in xmp[0], 'Wrong input file without XMP' new_ds.SetMetadata(xmp, 'xml:XMP') new_ds = None # hopefully it's closed now! new_ds = gdal.Open('tmp/test_181.tif') read_xmp = new_ds.GetMetadata('xml:XMP') assert read_xmp and 'W5M0MpCehiHzreSzNTczkc9d' in read_xmp[0], \ 'No XMP data written in output file' new_ds = None gdaltest.tiff_drv.Delete('tmp/test_181.tif') ############################################################################### # Test delete XMP from a dataset def test_tiff_write_182_xmp_delete(): shutil.copyfile('../gdrivers/data/byte_with_xmp.tif', 'tmp/test_182.tif') chg_ds = gdal.Open('tmp/test_182.tif', gdal.GA_Update) read_xmp = chg_ds.GetMetadata('xml:XMP') assert read_xmp and 'W5M0MpCehiHzreSzNTczkc9d' in read_xmp[0], \ 'No XMP data written in output file' chg_ds.SetMetadata(None, 'xml:XMP') chg_ds = None again_ds = gdal.Open('tmp/test_182.tif') read_xmp = again_ds.GetMetadata('xml:XMP') assert not read_xmp, 'XMP data not removed' again_ds = None gdaltest.tiff_drv.Delete('tmp/test_182.tif') ############################################################################### def test_tiff_write_183_createcopy_append_subdataset(): tmpfilename = '/vsimem/test_tiff_write_183_createcopy_append_subdataset.tif' gdal.Translate(tmpfilename, 'data/byte.tif') gdal.Translate(tmpfilename, 'data/utmsmall.tif', creationOptions=['APPEND_SUBDATASET=YES']) ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = gdal.Open('GTIFF_DIR:2:' + tmpfilename) assert ds.GetRasterBand(1).Checksum() == 50054 ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_tiff_write_184_create_append_subdataset(): tmpfilename = '/vsimem/test_tiff_write_184_create_append_subdataset.tif' gdal.Translate(tmpfilename, 'data/byte.tif') ds = gdal.GetDriverByName('GTiff').Create(tmpfilename, 1, 1, options=['APPEND_SUBDATASET=YES']) ds.GetRasterBand(1).Fill(255) ds = None ds = gdal.Open(tmpfilename) assert ds.GetRasterBand(1).Checksum() == 4672 ds = gdal.Open('GTIFF_DIR:2:' + tmpfilename) assert ds.GetRasterBand(1).Checksum() == 3 ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test LERC compression with Create() and BuildOverviews() # Fixes https://github.com/OSGeo/gdal/issues/1257 def test_tiff_write_185_lerc_create_and_overview(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() filename = '/vsimem/test_tiff_write_185_lerc_create_and_overview.tif' ds = gdaltest.tiff_drv.Create(filename, 20, 20, options=['COMPRESS=LERC_DEFLATE']) src_ds = gdal.Open('data/byte.tif') ds.WriteRaster(0,0,20,20,src_ds.ReadRaster()) gdal.ErrorReset() ds.BuildOverviews('NEAR', [2]) assert gdal.GetLastErrorMsg() == '' ds = None ds = gdal.Open(filename) cs = ds.GetRasterBand(1).Checksum() cs_ovr = ds.GetRasterBand(1).GetOverview(0).Checksum() gdal.Unlink(filename) assert (cs, cs_ovr) == (4672, 1087) ############################################################################### def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micro): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['LIBTIFF'] == 'INTERNAL': return True if md['LIBTIFF'].startswith('LIBTIFF, Version '): version = md['LIBTIFF'][len('LIBTIFF, Version '):] version = version[0:version.find('\n')] got_maj, got_min, got_micro = version.split('.') got_maj = int(got_maj) got_min = int(got_min) got_micro = int(got_micro) if got_maj > expected_maj: return True if got_maj < expected_maj: return False if got_min > expected_min: return True if got_min < expected_min: return False return got_micro >= expected_micro return False ############################################################################### # Test writing a deflate compressed file with a uncompressed strip larger than 4 GB # def test_tiff_write_deflate_4GB(): if not check_libtiff_internal_or_at_least(4, 0, 11): pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() ref_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) ref_ds.GetRasterBand(1).Fill(127) gdal.Translate('/vsimem/out.tif', ref_ds, options = '-co TILED=YES -co COMPRESS=DEFLATE -co BLOCKXSIZE=50000 -co BLOCKYSIZE=86000 -outsize 50000 86000') ds = gdal.Open('/vsimem/out.tif') data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) assert data == ref_ds.ReadRaster() ds = None gdal.Unlink('/vsimem/out.tif') ############################################################################### # Test rewriting a LZW strip/tile that is very close to 8 KB with larger data def test_tiff_write_rewrite_lzw_strip(): if not check_libtiff_internal_or_at_least(4, 0, 11): pytest.skip() src_data = open('data/bug_gh_1439_to_be_updated_lzw.tif', 'rb').read() tmpfilename = '/vsimem/out.tif' gdal.FileFromMemBuffer(tmpfilename, src_data) ds = gdal.Open(tmpfilename, gdal.GA_Update) src_ds = gdal.Open('data/bug_gh_1439_update_lzw.tif') ds.WriteRaster(0,0,4096,1,src_ds.ReadRaster()) ds = None ds = gdal.Open(tmpfilename) gdal.ErrorReset() assert ds.GetRasterBand(1).ReadRaster(0,1,4096,1) assert gdal.GetLastErrorMsg() == '' gdal.Unlink(tmpfilename) ############################################################################### # Test COPY_SRC_OVERVIEWS on a configuration with overviews, mask, but no # overview on the mask def test_tiff_write_overviews_mask_no_ovr_on_mask(): tmpfile = '/vsimem/test_tiff_write_overviews_mask_no_ovr_on_mask.tif' with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ds = gdaltest.tiff_drv.Create(tmpfile, 100, 100) ds.GetRasterBand(1).Fill(255) ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds = gdal.Open(tmpfile) gdal.ErrorReset() with gdaltest.error_handler(): ds.BuildOverviews('NEAR', overviewlist=[2]) assert gdal.GetLastErrorMsg() == 'Building external overviews whereas there is an internal mask is not fully supported. The overviews of the non-mask bands will be created, but not the overviews of the mask band.' # No overview on the mask assert ds.GetRasterBand(1).GetOverview(0).GetMaskFlags() == gdal.GMF_ALL_VALID ds = None tmpfile2 = '/vsimem/test_tiff_write_overviews_mask_no_ovr_on_mask_copy.tif' src_ds = gdal.Open(tmpfile) gdal.ErrorReset() with gdaltest.error_handler(): ds = gdaltest.tiff_drv.CreateCopy(tmpfile2, src_ds, options=['COPY_SRC_OVERVIEWS=YES']) assert gdal.GetLastErrorMsg() == 'Source dataset has a mask band on full resolution, overviews on the regular bands, but lacks overviews on the mask band.' assert ds ds = None src_ds = None ds = gdal.Open(tmpfile) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET # No overview on the mask assert ds.GetRasterBand(1).GetOverview(0).GetMaskFlags() == gdal.GMF_ALL_VALID ds = None gdaltest.tiff_drv.Delete(tmpfile) gdaltest.tiff_drv.Delete(tmpfile2) ############################################################################### # Test that -co PHOTOMETRIC=YCBCR -co COMPRESS=JPEG does not create a TIFFTAG_GDAL_METADATA def test_tiff_write_no_gdal_metadata_tag_for_ycbcr_jpeg(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() tmpfile = '/vsimem/test_tiff_write_no_gdal_metadata_tag_for_ycbcr_jpeg.tif' assert gdaltest.tiff_drv.Create(tmpfile, 16, 16, 3, gdal.GDT_Byte, options=['PHOTOMETRIC=YCBCR', 'COMPRESS=JPEG']) statBuf = gdal.VSIStatL(tmpfile + '.aux.xml', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf is None, 'did not expect PAM file' ds = gdal.Open(tmpfile) assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand tmpfile2 = tmpfile + "2" assert gdaltest.tiff_drv.CreateCopy(tmpfile2, ds, options=['PHOTOMETRIC=YCBCR', 'COMPRESS=JPEG']) ds = None ds = gdal.Open(tmpfile2) assert ds.GetMetadataItem('TIFFTAG_GDAL_METADATA', '_DEBUG_') is None, \ 'did not expect TIFFTAG_GDAL_METADATA tag' assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand ds = None gdaltest.tiff_drv.Delete(tmpfile) gdaltest.tiff_drv.Delete(tmpfile2) ############################################################################### # Test that repated flushing after SetGeoTransform() does not grow file size # indefinitely def test_tiff_write_setgeotransform_flush(): tmpfile = '/vsimem/test_tiff_write_setgeotransform_flush.tif' gdal.GetDriverByName('GTiff').Create(tmpfile,1,1) ds = gdal.Open(tmpfile, gdal.GA_Update) ds.SetGeoTransform([2,0,1,49,0,-1]) for i in range(10): ds.FlushCache() ds = None assert gdal.VSIStatL(tmpfile).size < 1000 gdaltest.tiff_drv.Delete(tmpfile) ############################################################################### # Test that compression parameters are taken into account in Create() mode def test_tiff_write_compression_create_and_createcopy(): md = gdaltest.tiff_drv.GetMetadata() tests = [] if 'DEFLATE' in md['DMD_CREATIONOPTIONLIST']: tests.append((['COMPRESS=DEFLATE', 'ZLEVEL=1'],['COMPRESS=DEFLATE', 'ZLEVEL=9'])) if 'LZMA' in md['DMD_CREATIONOPTIONLIST']: tests.append((['COMPRESS=LZMA', 'LZMA_PRESET=1'],['COMPRESS=LZMA', 'LZMA_PRESET=9'])) if 'JPEG' in md['DMD_CREATIONOPTIONLIST']: tests.append((['COMPRESS=JPEG', 'JPEG_QUALITY=95'],['COMPRESS=JPEG', 'JPEG_QUALITY=50'])) if 'ZSTD' in md['DMD_CREATIONOPTIONLIST']: tests.append((['COMPRESS=ZSTD', 'ZSTD_LEVEL=1'],['COMPRESS=ZSTD', 'ZSTD_LEVEL=9'])) # FIXME: this test randomly fails, especially on Windows, but also on Linux, # for a unknown reason. Nothing suspicious with Valgrind however # if 'LERC_DEFLATE' in md['DMD_CREATIONOPTIONLIST']: # tests.append((['COMPRESS=LERC_DEFLATE', 'ZLEVEL=1'],['COMPRESS=LERC_DEFLATE', 'ZLEVEL=9'])) if 'WEBP' in md['DMD_CREATIONOPTIONLIST']: tests.append((['COMPRESS=WEBP', 'WEBP_LEVEL=95'],['COMPRESS=WEBP', 'WEBP_LEVEL=15'])) new_tests = [] for (before, after) in tests: new_tests.append((before, after)) new_tests.append((before + ['COPY_SRC_OVERVIEWS=YES', 'TILED=YES', 'NUM_THREADS=2'], after + ['COPY_SRC_OVERVIEWS=YES', 'TILED=YES', 'NUM_THREADS=2'])) tests = new_tests tmpfile = '/vsimem/test_tiff_write_compression_create.tif' src_ds = gdal.Open('data/rgbsmall.tif') data = src_ds.ReadRaster() for (before, after) in tests: ds = gdaltest.tiff_drv.Create(tmpfile, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, options = before) ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) ds = None size_before = gdal.VSIStatL(tmpfile).size ds = gdaltest.tiff_drv.Create(tmpfile, src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, options = after) ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data) ds = None size_after = gdal.VSIStatL(tmpfile).size assert size_after < size_before, (before, after, size_before, size_after) print(before, after, size_before, size_after) gdaltest.tiff_drv.CreateCopy(tmpfile, src_ds, options = before) size_before = gdal.VSIStatL(tmpfile).size gdaltest.tiff_drv.CreateCopy(tmpfile, src_ds, options = after) size_after = gdal.VSIStatL(tmpfile).size assert size_after < size_before, (before, after, size_before, size_after) gdaltest.tiff_drv.Delete(tmpfile) ############################################################################### # Ask to run again tests with GDAL_API_PROXY=YES def tiff_write_api_proxy(): if not run_tiff_write_api_proxy: pytest.skip() import test_py_scripts ret = test_py_scripts.run_py_script_as_external_script('.', 'tiff_write', ' -api_proxy', display_live_on_parent_stdout=True) assert ret.find('Failed: 0') != -1 ############################################################################### def test_tiff_write_cleanup(): gdaltest.tiff_drv = None gdalautotest-3.0.4/gcore/bmp_write.py0000755003401500001440000000446013614005322017274 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: bmp_write.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for Microsoft Bitmap (.bmp) # BMP driver. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # Copyright (c) 2008-2009, Even Rouault # # 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. ############################################################################### import pytest import gdaltest ############################################################################### # Test creating an in memory copy. def test_bmp_vsimem(): tst = gdaltest.GDALTest('BMP', 'byte.tif', 1, 4672) return tst.testCreateCopy(vsimem=1) ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.tif', 4672), ('utmsmall.tif', 50054), ('8bit_pal.bmp', 4672), ] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', ] ) @pytest.mark.require_driver('BMP') def test_bmp_create(filename, checksum, testfunction): ut = gdaltest.GDALTest('BMP', filename, 1, checksum) getattr(ut, testfunction)() gdalautotest-3.0.4/gcore/mask.py0000755003401500001440000007350713614005322016247 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: mask.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC 15 "mask band" default functionality (nodata/alpha/etc) # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2007, 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 gdaltest from osgeo import gdal import pytest ############################################################################### # Verify the checksum and flags for "all valid" case. def test_mask_1(): ds = gdal.Open('data/byte.tif') assert ds is not None, 'Failed to open test dataset.' band = ds.GetRasterBand(1) assert band.GetMaskFlags() == gdal.GMF_ALL_VALID, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 4873, 'Got wrong mask checksum' my_min, my_max, mean, stddev = band.GetMaskBand().ComputeStatistics(0) assert (my_min, my_max, mean, stddev) == (255, 255, 255, 0), 'Got wrong mask stats' ############################################################################### # Verify the checksum and flags for "nodata" case. def test_mask_2(): ds = gdal.Open('data/byte.vrt') assert ds is not None, 'Failed to open test dataset.' band = ds.GetRasterBand(1) assert band.GetMaskFlags() == gdal.GMF_NODATA, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 4209, 'Got wrong mask checksum' ############################################################################### # Verify the checksum and flags for "alpha" case. def test_mask_3(): ds = gdal.Open('data/stefan_full_rgba.png') assert ds is not None, 'Failed to open test dataset.' # Test first mask. band = ds.GetRasterBand(1) assert band.GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET, \ 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 10807, 'Got wrong mask checksum' # Verify second and third same as first. band_2 = ds.GetRasterBand(2) band_3 = ds.GetRasterBand(3) # We have commented the following tests as SWIG >= 1.3.37 is buggy ! # or str(band_2.GetMaskBand()) != str(band.GetMaskBand()) \ # or str(band_3.GetMaskBand()) != str(band.GetMaskBand()) assert band_2.GetMaskFlags() == band.GetMaskFlags() and band_3.GetMaskFlags() == band.GetMaskFlags(), \ 'Band 2 or 3 does not seem to match first mask' # Verify alpha has no mask. band = ds.GetRasterBand(4) assert band.GetMaskFlags() == gdal.GMF_ALL_VALID, \ 'Did not get expected mask for alpha.' cs = band.GetMaskBand().Checksum() assert cs == 36074, 'Got wrong alpha mask checksum' ############################################################################### # Copy a *real* masked dataset, and confirm masks copied properly. def test_mask_4(): src_ds = gdal.Open('../gdrivers/data/masked.jpg') assert src_ds is not None, 'Failed to open test dataset.' # NOTE: for now we copy to PNM since it does everything (overviews too) # externally. Should eventually test with gtiff, hfa. drv = gdal.GetDriverByName('PNM') ds = drv.CreateCopy('tmp/mask_4.pnm', src_ds) src_ds = None # confirm we got the custom mask on the copied dataset. assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ 'did not get expected mask flags' msk = ds.GetRasterBand(1).GetMaskBand() cs = msk.Checksum() expected_cs = 770 assert cs == expected_cs, 'Did not get expected checksum' msk = None ds = None ############################################################################### # Create overviews for masked file, and verify the overviews have proper # masks built for them. def test_mask_5(): # This crashes with libtiff 3.8.2, so skip it md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdal.Open('tmp/mask_4.pnm', gdal.GA_Update) assert ds is not None, 'Failed to open test dataset.' # So that we instantiate the mask band before. ds.GetRasterBand(1).GetMaskFlags() ds.BuildOverviews(overviewlist=[2, 4]) # confirm mask flags on overview. ovr = ds.GetRasterBand(1).GetOverview(1) assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, 'did not get expected mask flags' msk = ovr.GetMaskBand() cs = msk.Checksum() expected_cs = 20505 assert cs == expected_cs, 'Did not get expected checksum' ovr = None msk = None ds = None # Reopen and confirm we still get same results. ds = gdal.Open('tmp/mask_4.pnm') # confirm mask flags on overview. ovr = ds.GetRasterBand(1).GetOverview(1) assert ovr.GetMaskFlags() == gdal.GMF_PER_DATASET, 'did not get expected mask flags' msk = ovr.GetMaskBand() cs = msk.Checksum() expected_cs = 20505 assert cs == expected_cs, 'Did not get expected checksum' ovr = None msk = None ds = None gdal.GetDriverByName('PNM').Delete('tmp/mask_4.pnm') ############################################################################### # Test a TIFF file with 1 band and an embedded mask of 1 bit def test_mask_6(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('data/test_with_mask_1bit.tif') assert ds is not None, 'Failed to open test dataset.' band = ds.GetRasterBand(1) assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 100, 'Got wrong mask checksum' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') ############################################################################### # Test a TIFF file with 3 bands and an embedded mask of 1 band of 1 bit def test_mask_7(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('data/test3_with_1mask_1bit.tif') assert ds is not None, 'Failed to open test dataset.' for i in (1, 2, 3): band = ds.GetRasterBand(i) assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 100, 'Got wrong mask checksum' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') ############################################################################### # Test a TIFF file with 1 band and an embedded mask of 8 bit. # Note : The TIFF6 specification, page 37, only allows 1 BitsPerSample && 1 SamplesPerPixel, def test_mask_8(): ds = gdal.Open('data/test_with_mask_8bit.tif') assert ds is not None, 'Failed to open test dataset.' band = ds.GetRasterBand(1) assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 1222, 'Got wrong mask checksum' ############################################################################### # Test a TIFF file with 3 bands with an embedded mask of 1 bit with 3 bands. # Note : The TIFF6 specification, page 37, only allows 1 BitsPerSample && 1 SamplesPerPixel, def test_mask_9(): ds = gdal.Open('data/test3_with_mask_1bit.tif') assert ds is not None, 'Failed to open test dataset.' for i in (1, 2, 3): band = ds.GetRasterBand(i) assert band.GetMaskFlags() == 0, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 100, 'Got wrong mask checksum' ############################################################################### # Test a TIFF file with 3 bands with an embedded mask of 8 bit with 3 bands. # Note : The TIFF6 specification, page 37, only allows 1 BitsPerSample && 1 SamplesPerPixel, def test_mask_10(): ds = gdal.Open('data/test3_with_mask_8bit.tif') assert ds is not None, 'Failed to open test dataset.' for i in (1, 2, 3): band = ds.GetRasterBand(i) assert band.GetMaskFlags() == 0, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 1222, 'Got wrong mask checksum' ############################################################################### # Test a TIFF file with an overview, an embedded mask of 1 bit, and an embedded # mask for the overview def test_mask_11(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('data/test_with_mask_1bit_and_ovr.tif') assert ds is not None, 'Failed to open test dataset.' band = ds.GetRasterBand(1) # Let's fetch the mask assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 100, 'Got wrong mask checksum' # Let's fetch the overview band = ds.GetRasterBand(1).GetOverview(0) cs = band.Checksum() assert cs == 1126, 'Got wrong overview checksum' # Let's fetch the mask of the overview assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 25, 'Got wrong checksum for the mask of the overview' # Let's fetch the overview of the mask == the mask of the overview band = ds.GetRasterBand(1).GetMaskBand().GetOverview(0) cs = band.Checksum() assert cs == 25, 'Got wrong checksum for the overview of the mask' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') ############################################################################### # Test a TIFF file with 3 bands, an overview, an embedded mask of 1 bit, and an embedded # mask for the overview def test_mask_12(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('data/test3_with_mask_1bit_and_ovr.tif') assert ds is not None, 'Failed to open test dataset.' for i in (1, 2, 3): band = ds.GetRasterBand(i) # Let's fetch the mask assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 100, 'Got wrong mask checksum' # Let's fetch the overview band = ds.GetRasterBand(i).GetOverview(0) cs = band.Checksum() assert cs == 1126, 'Got wrong overview checksum' # Let's fetch the mask of the overview assert band.GetMaskFlags() == gdal.GMF_PER_DATASET, 'Did not get expected mask.' cs = band.GetMaskBand().Checksum() assert cs == 25, 'Got wrong checksum for the mask of the overview' # Let's fetch the overview of the mask == the mask of the overview band = ds.GetRasterBand(i).GetMaskBand().GetOverview(0) cs = band.Checksum() assert cs == 25, 'Got wrong checksum for the overview of the mask' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') ############################################################################### # Test creation of external TIFF mask band def test_mask_13(): gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') src_ds = gdal.Open('data/byte.tif') assert src_ds is not None, 'Failed to open test dataset.' drv = gdal.GetDriverByName('GTiff') ds = drv.CreateCopy('tmp/byte_with_mask.tif', src_ds) src_ds = None ds.CreateMaskBand(gdal.GMF_PER_DATASET) cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 0, 'Got wrong checksum for the mask' ds.GetRasterBand(1).GetMaskBand().Fill(1) cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask' ds = None try: os.stat('tmp/byte_with_mask.tif.msk') except OSError: pytest.fail('tmp/byte_with_mask.tif.msk is absent') ds = gdal.Open('tmp/byte_with_mask.tif') assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ 'wrong mask flags' cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask' ds = None drv.Delete('tmp/byte_with_mask.tif') assert not os.path.exists('tmp/byte_with_mask.tif.msk') ############################################################################### # Test creation of internal TIFF mask band def test_mask_14(): src_ds = gdal.Open('data/byte.tif') assert src_ds is not None, 'Failed to open test dataset.' drv = gdal.GetDriverByName('GTiff') gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = drv.CreateCopy('tmp/byte_with_mask.tif', src_ds) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') src_ds = None # The only flag value supported for internal mask is GMF_PER_DATASET with gdaltest.error_handler(): with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ret = ds.CreateMaskBand(0) assert ret != 0, 'Error expected' with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ret = ds.CreateMaskBand(gdal.GMF_PER_DATASET) assert ret == 0, 'Creation failed' cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 0, 'Got wrong checksum for the mask (1)' ds.GetRasterBand(1).GetMaskBand().Fill(1) cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask (2)' # This TIFF dataset has already an internal mask band with gdaltest.error_handler(): with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ret = ds.CreateMaskBand(gdal.GMF_PER_DATASET) assert ret != 0, 'Error expected' # This TIFF dataset has already an internal mask band with gdaltest.error_handler(): with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ret = ds.GetRasterBand(1).CreateMaskBand(gdal.GMF_PER_DATASET) assert ret != 0, 'Error expected' ds = None assert not os.path.exists('tmp/byte_with_mask.tif.msk') gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('tmp/byte_with_mask.tif') assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ 'wrong mask flags' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask (3)' # Test fix for #5884 gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') old_val = gdal.GetCacheMax() gdal.SetCacheMax(0) out_ds = drv.CreateCopy('/vsimem/byte_with_mask.tif', ds, options=['COMPRESS=JPEG']) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', None) gdal.SetCacheMax(old_val) assert out_ds.GetRasterBand(1).Checksum() != 0 cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask (4)' out_ds = None drv.Delete('/vsimem/byte_with_mask.tif') ds = None drv.Delete('tmp/byte_with_mask.tif') ############################################################################### # Test creation of internal TIFF overview, mask band and mask band of overview def mask_and_ovr(order, method): src_ds = gdal.Open('data/byte.tif') assert src_ds is not None, 'Failed to open test dataset.' drv = gdal.GetDriverByName('GTiff') ds = drv.CreateCopy('tmp/byte_with_ovr_and_mask.tif', src_ds) src_ds = None if order == 1: gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') ds.BuildOverviews(method, overviewlist=[2, 4]) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.GetRasterBand(1).GetOverview(0).CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetOverview(1).CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') elif order == 2: gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.BuildOverviews(method, overviewlist=[2, 4]) ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetOverview(0).CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetOverview(1).CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') elif order == 3: gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.BuildOverviews(method, overviewlist=[2, 4]) ds.GetRasterBand(1).GetOverview(0).CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetOverview(1).CreateMaskBand(gdal.GMF_PER_DATASET) ds.CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') elif order == 4: gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') ds.CreateMaskBand(gdal.GMF_PER_DATASET) ds.GetRasterBand(1).GetMaskBand().Fill(1) # The overview for the mask will be implicitly created and computed. ds.BuildOverviews(method, overviewlist=[2, 4]) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') if order < 4: ds = None ds = gdal.Open('tmp/byte_with_ovr_and_mask.tif', gdal.GA_Update) ds.GetRasterBand(1).GetMaskBand().Fill(1) # The overview of the mask will be implicitly recomputed. ds.BuildOverviews(method, overviewlist=[2, 4]) ds = None assert not os.path.exists('tmp/byte_with_ovr_and_mask.tif.msk') gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'FALSE') ds = gdal.Open('tmp/byte_with_ovr_and_mask.tif') assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ 'wrong mask flags' gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK_TO_8BIT', 'TRUE') cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask' cs = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() assert cs == 100, 'Got wrong checksum for the mask of the first overview' cs = ds.GetRasterBand(1).GetOverview(1).GetMaskBand().Checksum() assert cs == 25, 'Got wrong checksum for the mask of the second overview' ds = None drv.Delete('tmp/byte_with_ovr_and_mask.tif') def test_mask_15(): return mask_and_ovr(1, 'NEAREST') def test_mask_16(): return mask_and_ovr(2, 'NEAREST') def test_mask_17(): return mask_and_ovr(3, 'NEAREST') def test_mask_18(): return mask_and_ovr(4, 'NEAREST') def test_mask_15_avg(): return mask_and_ovr(1, 'AVERAGE') def test_mask_16_avg(): return mask_and_ovr(2, 'AVERAGE') def test_mask_17_avg(): return mask_and_ovr(3, 'AVERAGE') def test_mask_18_avg(): return mask_and_ovr(4, 'AVERAGE') ############################################################################### # Test NODATA_VALUES mask def test_mask_19(): ds = gdal.Open('data/test_nodatavalues.tif') assert ds is not None, 'Failed to open test dataset.' assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET + gdal.GMF_NODATA, \ 'did not get expected mask flags' msk = ds.GetRasterBand(1).GetMaskBand() cs = msk.Checksum() expected_cs = 11043 assert cs == expected_cs, 'Did not get expected checksum' msk = None ds = None ############################################################################### # Extensive test of nodata mask for all data types def test_mask_20(): types = [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat32, gdal.GDT_CFloat64] nodatavalue = [1, -1, 1, -1, 1, 0.5, 0.5, 0.5, 0.5] drv = gdal.GetDriverByName('GTiff') for i, typ in enumerate(types): ds = drv.Create('tmp/mask20.tif', 1, 1, 1, typ) ds.GetRasterBand(1).Fill(nodatavalue[i]) ds.GetRasterBand(1).SetNoDataValue(nodatavalue[i]) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_NODATA, \ ('did not get expected mask flags for type %s' % gdal.GetDataTypeName(typ)) msk = ds.GetRasterBand(1).GetMaskBand() assert msk.Checksum() == 0, \ ('did not get expected mask checksum for type %s : %d' % gdal.GetDataTypeName(typ, msk.Checksum())) msk = None ds = None drv.Delete('tmp/mask20.tif') ############################################################################### # Extensive test of NODATA_VALUES mask for all data types def test_mask_21(): types = [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CFloat32, gdal.GDT_CFloat64] nodatavalue = [1, -1, 1, -1, 1, 0.5, 0.5, 0.5, 0.5] drv = gdal.GetDriverByName('GTiff') for i, typ in enumerate(types): ds = drv.Create('tmp/mask21.tif', 1, 1, 3, typ) md = {} md['NODATA_VALUES'] = '%f %f %f' % (nodatavalue[i], nodatavalue[i], nodatavalue[i]) ds.SetMetadata(md) ds.GetRasterBand(1).Fill(nodatavalue[i]) ds.GetRasterBand(2).Fill(nodatavalue[i]) ds.GetRasterBand(3).Fill(nodatavalue[i]) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET + gdal.GMF_NODATA, \ ('did not get expected mask flags for type %s' % gdal.GetDataTypeName(typ)) msk = ds.GetRasterBand(1).GetMaskBand() assert msk.Checksum() == 0, \ ('did not get expected mask checksum for type %s : %d' % gdal.GetDataTypeName(typ, msk.Checksum())) msk = None ds = None drv.Delete('tmp/mask21.tif') ############################################################################### # Test creation of external TIFF mask band just after Create() def test_mask_22(): drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/mask_22.tif', 20, 20) ds.CreateMaskBand(gdal.GMF_PER_DATASET) cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 0, 'Got wrong checksum for the mask' ds.GetRasterBand(1).GetMaskBand().Fill(1) cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask' ds = None try: os.stat('tmp/mask_22.tif.msk') except OSError: pytest.fail('tmp/mask_22.tif.msk is absent') ds = gdal.Open('tmp/mask_22.tif') assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_PER_DATASET, \ 'wrong mask flags' cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 400, 'Got wrong checksum for the mask' ds = None drv.Delete('tmp/mask_22.tif') assert not os.path.exists('tmp/mask_22.tif.msk') ############################################################################### # Test CreateCopy() of a dataset with a mask into a JPEG-compressed TIFF with # internal mask (#3800) def test_mask_23(): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = drv.Create('tmp/mask_23_src.tif', 3000, 2000, 3, options=['TILED=YES', 'SPARSE_OK=YES']) src_ds.CreateMaskBand(gdal.GMF_PER_DATASET) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'YES') old_val = gdal.GetCacheMax() gdal.SetCacheMax(15000000) gdal.ErrorReset() ds = drv.CreateCopy('tmp/mask_23_dst.tif', src_ds, options=['TILED=YES', 'COMPRESS=JPEG']) gdal.SetConfigOption('GDAL_TIFF_INTERNAL_MASK', 'NO') gdal.SetCacheMax(old_val) del ds error_msg = gdal.GetLastErrorMsg() src_ds = None drv.Delete('tmp/mask_23_src.tif') drv.Delete('tmp/mask_23_dst.tif') # 'ERROR 1: TIFFRewriteDirectory:Error fetching directory count' was triggered before assert error_msg == '' ############################################################################### # Test on a GDT_UInt16 RGBA (#5692) def test_mask_24(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_24.tif', 100, 100, 4, gdal.GDT_UInt16, options=['PHOTOMETRIC=RGB', 'ALPHA=YES']) ds.GetRasterBand(1).Fill(65565) ds.GetRasterBand(2).Fill(65565) ds.GetRasterBand(3).Fill(65565) ds.GetRasterBand(4).Fill(65565) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET, \ 'Did not get expected mask.' mask = ds.GetRasterBand(1).GetMaskBand() # IRasterIO() optimized case import struct assert struct.unpack('B', mask.ReadRaster(0, 0, 1, 1))[0] == 255 # IReadBlock() code path (blockx, blocky) = mask.GetBlockSize() assert struct.unpack('B' * blockx * blocky, mask.ReadBlock(0, 0))[0] == 255 mask.FlushCache() # Test special case where dynamics is only 0-255 ds.GetRasterBand(4).Fill(255) assert struct.unpack('B', mask.ReadRaster(0, 0, 1, 1))[0] == 1 ds = None gdal.Unlink('/vsimem/mask_24.tif') ############################################################################### # Test various error conditions def test_mask_25(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif', 1, 1) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALL_VALID ds = None # No INTERNAL_MASK_FLAGS_x metadata gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif.msk', 1, 1) ds = gdal.Open('/vsimem/mask_25.tif') assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALL_VALID cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 3 ds = None gdal.Unlink('/vsimem/mask_25.tif') gdal.Unlink('/vsimem/mask_25.tif.msk') # Per-band mask ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif', 1, 1) ds.GetRasterBand(1).CreateMaskBand(0) ds = None ds = gdal.Open('/vsimem/mask_25.tif') assert ds.GetRasterBand(1).GetMaskFlags() == 0 cs = ds.GetRasterBand(1).GetMaskBand().Checksum() assert cs == 0 ds = None gdal.Unlink('/vsimem/mask_25.tif') gdal.Unlink('/vsimem/mask_25.tif.msk') # .msk file does not have enough bands gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif', 1, 1, 2) ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif.msk', 1, 1) ds.SetMetadataItem('INTERNAL_MASK_FLAGS_2', '0') ds = None ds = gdal.Open('/vsimem/mask_25.tif') with gdaltest.error_handler(): assert ds.GetRasterBand(2).GetMaskFlags() == gdal.GMF_ALL_VALID ds = None gdal.Unlink('/vsimem/mask_25.tif') gdal.Unlink('/vsimem/mask_25.tif.msk') # Invalid sequences of CreateMaskBand() calls ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_25.tif', 1, 1, 2) ds.GetRasterBand(1).CreateMaskBand(gdal.GMF_PER_DATASET) with gdaltest.error_handler(): assert ds.GetRasterBand(2).CreateMaskBand(0) != 0 ds = None gdal.Unlink('/vsimem/mask_25.tif') gdal.Unlink('/vsimem/mask_25.tif.msk') # CreateMaskBand not supported by this dataset with gdaltest.error_handler(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds.CreateMaskBand(0) ############################################################################### # Test on a GDT_UInt16 1band data def test_mask_26(): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/mask_26.tif', 100, 100, 2, gdal.GDT_UInt16, options=['ALPHA=YES']) ds.GetRasterBand(1).Fill(65565) ds.GetRasterBand(2).Fill(65565) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_ALPHA + gdal.GMF_PER_DATASET, \ 'Did not get expected mask.' mask = ds.GetRasterBand(1).GetMaskBand() # IRasterIO() optimized case import struct assert struct.unpack('B', mask.ReadRaster(0, 0, 1, 1))[0] == 255 ds = None gdal.Unlink('/vsimem/mask_26.tif') ############################################################################### # Cleanup. ############################################################################### # Extensive test of nodata mask for all complex types using real part only def test_mask_27(): types = [gdal.GDT_CFloat32, gdal.GDT_CFloat64] nodatavalue = [0.5, 0.5] drv = gdal.GetDriverByName('GTiff') for i, typ in enumerate(types): ds = drv.Create('tmp/mask27.tif', 1, 1, 1, typ) ds.GetRasterBand(1).Fill(nodatavalue[i], 10) ds.GetRasterBand(1).SetNoDataValue(nodatavalue[i]) assert ds.GetRasterBand(1).GetMaskFlags() == gdal.GMF_NODATA, \ ('did not get expected mask flags for type %s' % gdal.GetDataTypeName(typ)) msk = ds.GetRasterBand(1).GetMaskBand() assert msk.Checksum() == 0, \ ('did not get expected mask checksum for type %s : %d' % gdal.GetDataTypeName(typ, msk.Checksum())) msk = None ds = None drv.Delete('tmp/mask27.tif') ############################################################################### # Extensive test of real NODATA_VALUES mask for all complex types gdalautotest-3.0.4/gcore/asyncreader.py0000755003401500001440000000542113614005322017602 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: asyncreader.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test AsyncReader interface # 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 ############################################################################### # Test AsyncReader interface on the default (synchronous) implementation def test_asyncreader_1(): ds = gdal.Open('data/rgbsmall.tif') asyncreader = ds.BeginAsyncReader(0, 0, ds.RasterXSize, ds.RasterYSize) buf = asyncreader.GetBuffer() result = asyncreader.GetNextUpdatedRegion(0) assert result == [gdal.GARIO_COMPLETE, 0, 0, ds.RasterXSize, ds.RasterYSize], \ 'wrong return values for GetNextUpdatedRegion()' ds.EndAsyncReader(asyncreader) asyncreader = None out_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/asyncresult.tif', ds.RasterXSize, ds.RasterYSize, ds.RasterCount) out_ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf) expected_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] cs = [out_ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] ds = None out_ds = None gdal.Unlink('/vsimem/asyncresult.tif') for i, csum in enumerate(cs): assert csum == expected_cs[i], ('did not get expected checksum for band %d' % (i + 1)) gdalautotest-3.0.4/gcore/basic_test_subprocess.py0000755003401500001440000000341013614005322021666 0ustar rouaultusers#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: basic_test_subprocess.py d4cacb3e1e62ec915b0b3fcbfd4205dc261aabbc 2018-11-12 19:05:43 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic GDAL open # 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. ############################################################################### from osgeo import gdal if __name__ == '__main__': # test_basic_test_8 print(gdal.VersionInfo('LICENSE')) gdalautotest-3.0.4/gcore/transformer.py0000755003401500001440000011144513614005322017650 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: transformer.py 69efc34f98764d1d1c3a66ea92298d10c628b97e 2019-06-17 18:33:13 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test the GenImgProjTransformer capabilities. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, 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 gdaltest from osgeo import gdal from osgeo import osr import pytest ############################################################################### # Test simple Geotransform based transformer. def test_transformer_1(): ds = gdal.Open('data/byte.tif') tr = gdal.Transformer(ds, None, []) (success, pnt) = tr.TransformPoint(0, 20, 10) assert success and abs(pnt[0] - 441920) <= 0.00000001 and abs(pnt[1] - 3750720) <= 0.00000001 and pnt[2] == 0.0, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20) <= 0.00000001 and abs(pnt[1] - 10) <= 0.00000001 and pnt[2] == 0.0, \ 'got wrong reverse transform result.' ############################################################################### # Test GCP based transformer with polynomials. def test_transformer_2(): ds = gdal.Open('data/gcps.vrt') tr = gdal.Transformer(ds, None, ['METHOD=GCP_POLYNOMIAL']) (success, pnt) = tr.TransformPoint(0, 20, 10) assert success and abs(pnt[0] - 441920) <= 0.001 and abs(pnt[1] - 3750720) <= 0.001 and pnt[2] == 0, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20) <= 0.001 and abs(pnt[1] - 10) <= 0.001 and pnt[2] == 0, \ 'got wrong reverse transform result.' ############################################################################### # Test GCP based transformer with thin plate splines. def test_transformer_3(): ds = gdal.Open('data/gcps.vrt') tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) (success, pnt) = tr.TransformPoint(0, 20, 10) assert success and abs(pnt[0] - 441920) <= 0.001 and abs(pnt[1] - 3750720) <= 0.001 and pnt[2] == 0, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20) <= 0.001 and abs(pnt[1] - 10) <= 0.001 and pnt[2] == 0, \ 'got wrong reverse transform result.' ############################################################################### # Test geolocation based transformer. def test_transformer_4(): ds = gdal.Open('data/sstgeo.vrt') tr = gdal.Transformer(ds, None, ['METHOD=GEOLOC_ARRAY']) (success, pnt) = tr.TransformPoint(0, 20, 10) assert success and abs(pnt[0] + 81.961341857910156) <= 0.000001 and abs(pnt[1] - 29.612689971923828) <= 0.000001 and pnt[2] == 0, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.436627518907024) <= 0.001 and abs(pnt[1] - 10.484599774610549) <= 0.001 and pnt[2] == 0, \ 'got wrong reverse transform result.' ############################################################################### # Test RPC based transformer. def test_transformer_5(): ds = gdal.Open('data/rpc.vrt') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_PIXEL_ERROR_THRESHOLD=0.05']) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5) assert success and abs(pnt[0] - 125.64830100509131) <= 0.000001 and abs(pnt[1] - 39.869433991997553) <= 0.000001 and pnt[2] == 0, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.05 and abs(pnt[1] - 10.5) <= 0.05 and pnt[2] == 0, \ 'got wrong reverse transform result.' # Try with a different height. (success, pnt) = tr.TransformPoint(0, 20.5, 10.5, 30) assert success and abs(pnt[0] - 125.64828521533849) <= 0.000001 and abs(pnt[1] - 39.869345204440144) <= 0.000001 and pnt[2] == 30, \ 'got wrong forward transform result.(2)' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.05 and abs(pnt[1] - 10.5) <= 0.05 and pnt[2] == 30, \ 'got wrong reverse transform result.(2)' # Test RPC_HEIGHT option tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT=30']) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5) assert success and abs(pnt[0] - 125.64828521533849) <= 0.000001 and abs(pnt[1] - 39.869345204440144) <= 0.000001, \ 'got wrong forward transform result.(3)' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.1 and abs(pnt[1] - 10.5) <= 0.1, \ 'got wrong reverse transform result.(3)' # Test RPC_DEM and RPC_HEIGHT_SCALE options # (long,lat)=(125.64828521533849 39.869345204440144) -> (Easting,Northing)=(213324.662167036 4418634.47813677) in EPSG:32652 ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32652) ds_dem.SetProjection(sr.ExportToWkt()) ds_dem.SetGeoTransform([213300, 200, 0, 4418700, 0, -200]) ds_dem.GetRasterBand(1).Fill(15) ds_dem = None tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT_SCALE=2', 'RPC_DEM=/vsimem/dem.tif']) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5, 0) assert success and abs(pnt[0] - 125.64828521533849) <= 0.000001 and abs(pnt[1] - 39.869345204440144) <= 0.000001, \ 'got wrong forward transform result.(4)' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.05 and abs(pnt[1] - 10.5) <= 0.05, \ 'got wrong reverse transform result.(4)' tr = None # Test RPC_DEMINTERPOLATION=cubic tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT_SCALE=2', 'RPC_DEM=/vsimem/dem.tif', 'RPC_DEMINTERPOLATION=cubic']) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5, 0) assert success and abs(pnt[0] - 125.64828521533849) <= 0.000001 and abs(pnt[1] - 39.869345204440144) <= 0.000001, \ 'got wrong forward transform result.(5)' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.05 and abs(pnt[1] - 10.5) <= 0.05, \ 'got wrong reverse transform result.(5)' tr = None # Test RPC_DEMINTERPOLATION=near tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT_SCALE=2', 'RPC_DEM=/vsimem/dem.tif', 'RPC_DEMINTERPOLATION=near']) (success, pnt) = tr.TransformPoint(0, 20.5, 10.5, 0) assert success and abs(pnt[0] - 125.64828521503811) <= 0.000001 and abs(pnt[1] - 39.869345204874911) <= 0.000001, \ 'got wrong forward transform result.(6)' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - 20.5) <= 0.05 and abs(pnt[1] - 10.5) <= 0.05, \ 'got wrong reverse transform result.(6)' tr = None # Test outside DEM extent : default behaviour --> error tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT_SCALE=2', 'RPC_DEM=/vsimem/dem.tif']) (success, pnt) = tr.TransformPoint(0, 40000, 0, 0) assert success == 0 (success, pnt) = tr.TransformPoint(1, 125, 40, 0) assert success == 0 tr = None # Test outside DEM extent with RPC_DEM_MISSING_VALUE=0 ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(32652) ds_dem.SetProjection(sr.ExportToWkt()) ds_dem.SetGeoTransform([213300, 1, 0, 4418700, 0, -1]) ds_dem.GetRasterBand(1).Fill(15) ds_dem = None tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT_SCALE=2', 'RPC_DEM=/vsimem/dem.tif', 'RPC_DEM_MISSING_VALUE=0']) (success, pnt) = tr.TransformPoint(0, -99.5, 0.5, 0) assert success and abs(pnt[0] - 125.64746155942839) <= 0.000001 and abs(pnt[1] - 39.869506789921168) <= 0.000001, \ 'got wrong forward transform result.' (success, pnt) = tr.TransformPoint(1, pnt[0], pnt[1], pnt[2]) assert success and abs(pnt[0] - -99.5) <= 0.05 and abs(pnt[1] - 0.5) <= 0.05, \ 'got wrong reverse transform result.' tr = None gdal.Unlink('/vsimem/dem.tif') ############################################################################### # Test RPC convergence bug (bug # 5395) def test_transformer_6(): ds = gdal.Open('data/rpc_5395.vrt') tr = gdal.Transformer(ds, None, ['METHOD=RPC']) (success, pnt) = tr.TransformPoint(0, 0.5, 0.5) assert success and abs(pnt[0] - 28.26163232) <= 0.0001 and abs(pnt[1] - -27.79853245) <= 0.0001 and pnt[2] == 0, \ 'got wrong forward transform result.' ############################################################################### # Test Transformer.TransformPoints def test_transformer_7(): ds = gdal.Open('data/byte.tif') tr = gdal.Transformer(ds, None, []) (pnt, success) = tr.TransformPoints(0, [(20, 10)]) assert success[0] != 0 and abs(pnt[0][0] - 441920) <= 0.00000001 and abs(pnt[0][1] - 3750720) <= 0.00000001 and pnt[0][2] == 0.0, \ 'got wrong forward transform result.' ############################################################################### # Test handling of nodata in RPC DEM (#5680) def test_transformer_8(): ds = gdal.Open('data/rpc.vrt') # (long,lat)=(125.64828521533849 39.869345204440144) -> (Easting,Northing)=(213324.662167036 4418634.47813677) in EPSG:32652 ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1, gdal.GDT_Int16) sr = osr.SpatialReference() sr.ImportFromEPSG(32652) ds_dem.SetProjection(sr.ExportToWkt()) ds_dem.SetGeoTransform([213300, 1, 0, 4418700, 0, -1]) ds_dem.GetRasterBand(1).SetNoDataValue(-32768) ds_dem.GetRasterBand(1).Fill(-32768) ds_dem = None for method in ['near', 'bilinear', 'cubic']: tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/dem.tif', 'RPC_DEMINTERPOLATION=%s' % method]) (success, pnt) = tr.TransformPoint(0, 20, 10, 0) if success: print(success, pnt) pytest.fail('got wrong forward transform result.') (success, pnt) = tr.TransformPoint(1, 125.64828521533849, 39.869345204440144, 0) if success: print(success, pnt) pytest.fail('got wrong reverse transform result.') gdal.Unlink('/vsimem/dem.tif') ############################################################################### # Test RPC DEM line optimization def test_transformer_9(): ds = gdal.Open('data/rpc.vrt') # (long,lat)=(125.64828521533849 39.869345204440144) -> (Easting,Northing)=(213324.662167036 4418634.47813677) in EPSG:32652 ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1, gdal.GDT_Byte) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds_dem.SetProjection(sr.ExportToWkt()) ds_dem.SetGeoTransform([125.647968621436, 1.2111052640051412e-05, 0, 39.869926216038, 0, -8.6569068979969188e-06]) import random random.seed(0) data = ''.join([chr(40 + int(10 * random.random())) for _ in range(100 * 100)]) ds_dem.GetRasterBand(1).WriteRaster(0, 0, 100, 100, data) ds_dem = None for method in ['near', 'bilinear', 'cubic']: tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/dem.tif', 'RPC_DEMINTERPOLATION=%s' % method]) points = [(125.64828521533849, 39.869345204440144)] * 10 (pnt, success) = tr.TransformPoints(1, points) assert success[0], method pnt_optimized = pnt[0] (success, pnt) = tr.TransformPoint(1, 125.64828521533849, 39.869345204440144, 0) assert success, method assert pnt == pnt_optimized, method gdal.Unlink('/vsimem/dem.tif') ############################################################################### # Test RPC DEM transform from geoid height to ellipsoidal height def test_transformer_10(): # Create fake vertical shift grid out_ds = gdal.GetDriverByName('GTX').Create('tmp/fake.gtx', 10, 10, 1, gdal.GDT_Float32) out_ds.SetGeoTransform([-180, 36, 0, 90, 0, -18]) sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') out_ds.SetProjection(sr.ExportToWkt()) out_ds.GetRasterBand(1).Fill(100) out_ds = None # Create a fake DEM ds_dem = gdal.GetDriverByName('GTiff').Create('/vsimem/dem.tif', 100, 100, 1, gdal.GDT_Byte) ds_dem.SetGeoTransform([125.647968621436, 1.2111052640051412e-05, 0, 39.869926216038, 0, -8.6569068979969188e-06]) import random random.seed(0) data = ''.join([chr(40 + int(10 * random.random())) for _ in range(100 * 100)]) ds_dem.GetRasterBand(1).WriteRaster(0, 0, 100, 100, data) ds_dem = None ds_dem = gdal.Open('/vsimem/dem.tif') vrt_dem = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/dem.vrt', ds_dem) ds_dem = None vrt_dem.SetProjection("""COMPD_CS["WGS 84 + my_height", 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"]], VERT_CS["my_height", VERT_DATUM["my_height",0, EXTENSION["PROJ4_GRIDS","./tmp/fake.gtx"]], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Up",UP]]]""") vrt_dem = None ds = gdal.Open('data/rpc.vrt') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/dem.vrt']) (success, pnt) = tr.TransformPoint(1, 125.64828521533849, 39.869345204440144, 0) assert success and abs(pnt[0] - 27.31476045569616) <= 1e-5 and abs(pnt[1] - -53.328814757762302) <= 1e-5 and pnt[2] == 0, \ 'got wrong result: %s' % str(pnt) tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/dem.vrt', 'RPC_DEM_APPLY_VDATUM_SHIFT=FALSE']) (success, pnt) = tr.TransformPoint(1, 125.64828521533849, 39.869345204440144, 0) assert success and abs(pnt[0] - 21.445626206892484) <= 1e-5 and abs(pnt[1] - 1.6460100520871492) <= 1e-5 and pnt[2] == 0, \ 'got wrong result.' gdal.GetDriverByName('GTX').Delete('tmp/fake.gtx') gdal.Unlink('/vsimem/dem.tif') gdal.Unlink('/vsimem/dem.vrt') ############################################################################### # Test failed inverse RPC transform (#6162) def test_transformer_11(): ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) rpc = [ 'HEIGHT_OFF=1113.66579196784', 'HEIGHT_SCALE=12.5010114250099', 'LAT_OFF=38.8489906468112', 'LAT_SCALE=-0.106514418771489', 'LINE_DEN_COEFF=1 -0.000147949809772754 -0.000395269640841174 -1.15825619524758e-05 -0.001613476071797 5.20818134468044e-05 -2.87546958936308e-05 0.00139252754800089 0.00103224907048726 -5.0328770407996e-06 8.03722313022155e-06 0.000236052289425919 0.000208478107633822 -8.11629138727222e-06 0.000168941442517399 0.000392113144410504 3.13299811375497e-06 -1.50306451132806e-07 -1.96870155855449e-06 6.84425679628047e-07', 'LINE_NUM_COEFF=0.00175958077249233 1.38380980570961 -1.10937056344449 -2.64222540811728e-05 0.00242330787142254 0.000193743606261641 -0.000149740797138056 0.000348558508286103 -8.44646294793856e-05 3.10853483444725e-05 6.94899990982205e-05 -0.00348125387930033 -0.00481553689971959 -7.80038440894703e-06 0.00410332555882184 0.00269594666059233 5.94355882183947e-06 -6.12499223746471e-05 -2.16490482825638e-05 -1.95059491792213e-06', 'LINE_OFF=2199.80872158044', 'LINE_SCALE=2202.03966104116', 'LONG_OFF=77.3374268058015', 'LONG_SCALE=0.139483831686384', 'SAMP_DEN_COEFF=1 0.000220381598198686 -5.9113079248377e-05 -0.000123013508187712 -2.69270454504924e-05 3.85090208529735e-05 -5.05359221990966e-05 0.000207017095461956 0.000441092857548974 1.47302072491805e-05 9.4840973108768e-06 -0.000810344094204395 -0.000690502911945615 -1.07959445293954e-05 0.000801157109076503 0.000462754838815978 9.13256389877791e-06 7.49571761868177e-06 -5.00612460432453e-06 -2.25925949180435e-06', 'SAMP_NUM_COEFF=-0.00209214639511201 -0.759096012299728 -0.903450038473527 5.43928095403867e-05 -0.000717672934172181 -0.000168790405106395 -0.00015564609496447 0.0013261576802665 -0.000398331147368139 -3.84712681506314e-05 2.70041394522796e-05 0.00254362585790201 0.00332988183285888 3.36326833370395e-05 0.00445687297094153 0.00290078876854111 3.59552237739047e-05 7.16492495304347e-05 -5.6782194494005e-05 2.32051448455541e-06', 'SAMP_OFF=3300.39818049514', 'SAMP_SCALE=3302.50400920438' ] ds.SetMetadata(rpc, 'RPC') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT=4000']) (success, pnt) = tr.TransformPoint(0, 0, 0, 0) assert not success, pnt # But this one should succeed tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_HEIGHT=1150']) (success, pnt) = tr.TransformPoint(0, 0, 0, 0) assert success and abs(pnt[0] - 77.350939956024618) <= 1e-7 and abs(pnt[1] - 38.739703990877814) <= 1e-7 ############################################################################### # Test degenerate cases of TPS transformer def test_transformer_12(): ds = gdal.Open(""" Gray data/byte.tif """) tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) assert tr is not None ds = gdal.Open(""" Gray data/byte.tif """) gdal.ErrorReset() with gdaltest.error_handler(): tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) assert gdal.GetLastErrorMsg() != '' ds = gdal.Open(""" Gray data/byte.tif """) gdal.ErrorReset() with gdaltest.error_handler(): tr = gdal.Transformer(ds, None, ['METHOD=GCP_TPS']) assert gdal.GetLastErrorMsg() != '' ############################################################################### # Test inverse RPC transform at DEM edge (#6377) def test_transformer_13(): ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) rpc = [ "HEIGHT_OFF=79.895358112544", "HEIGHT_SCALE=71.8479951519956", "LAT_OFF=39.1839631741725", "LAT_SCALE=-0.0993355184710674", "LINE_DEN_COEFF=1 8.18889582174233e-05 -0.000585027621468826 0.00141894885228522 -0.000585589558894143 2.26848970721562e-05 0.0004556101949561 -0.000807782279739336 -0.00042471862816941 -0.000569244978738162 1.48442578097541e-05 4.05131290592846e-05 2.84884306250279e-05 -5.18205692205965e-06 -6.313878273056e-07 1.53979251356426e-05 -7.18376115203249e-06 -6.17331013601745e-05 -7.21314704472095e-05 4.12297300238455e-06", "LINE_NUM_COEFF=-0.00742236358913794 -1.34432796989641 1.14742235955483 -0.00419813954264328 -0.00234215180175534 -0.00624463816085957 0.00678228413157904 0.0020362389986917 -0.00187712244349171 -8.03499198655765e-08 -0.00058862905508099 -0.00738644673656152 -0.00769111767189179 0.00076485216017804 0.00714033152180546 0.00597946564795612 -0.000632882594479344 -0.000167672086277102 0.00055226160003967 1.01784884515205e-06", "LINE_OFF=2199.71134437189", "LINE_SCALE=2197.27163235171", "LONG_OFF=-108.129788954851", "LONG_SCALE=0.135395601856691", "SAMP_DEN_COEFF=1 -0.000817668457487893 -0.00151956231901818 0.00117149108953055 0.000514723430775277 0.000357856819755055 0.000655430235824068 -0.00100177312999255 -0.000488725013873637 -0.000500795084518271 -3.31511569640467e-06 4.60608554396048e-05 4.71371559254521e-05 -3.47487113243818e-06 1.0984752288197e-05 1.6421626141648e-05 -6.2866141729034e-06 -6.32966599886646e-05 -7.06552514786235e-05 3.89288575686084e-06", "SAMP_NUM_COEFF=0.00547379112608157 0.807100297014362 0.845388298829057 0.01082483811889 -0.00320368761068744 0.00357867636379949 0.00459377712275926 -0.00324853865239341 -0.00218177030092682 2.99823054607907e-05 0.000946829367823539 0.00428577519330827 0.0045745876325088 -0.000396201144848935 0.00488772258958395 0.00435309486883759 -0.000402737234433541 0.000402935809278189 0.000642374929382851 -5.26793321752838e-06", "SAMP_OFF=3299.3111821927", "SAMP_SCALE=3297.19448149873" ] ds.SetMetadata(rpc, 'RPC') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=data/transformer_13_dem.tif']) (success, pnt) = tr.TransformPoint(0, 6600, 24) assert success and abs(pnt[0] - -108.00066000065341) <= 1e-7 and abs(pnt[1] - 39.157694013439489) <= 1e-7 ############################################################################### # Test inverse RPC transform when iterations do oscillations (#6377) def test_transformer_14(): ds = gdal.GetDriverByName('MEM').Create('', 4032, 2688) rpc = ["MIN_LAT=0", "MAX_LAT=0", "MIN_LONG=0", "MAX_LONG=0", "HEIGHT_OFF=244.72924043124081", "HEIGHT_SCALE=391.44066987292678", "LAT_OFF=0.095493639758799986", "LAT_SCALE=-0.0977494003085103", "LINE_DEN_COEFF=1 1.73399671259238e-05 -6.18169396309642e-06 -3.11498839490863e-05 -1.18048814815295e-05 -5.46123898974842e-05 -2.51203895820587e-05 -5.77299008756702e-05 -1.37836923606953e-05 -3.24029327866125e-06 2.06307542696228e-07 -5.16777154466466e-08 2.98762926005741e-07 3.17761145061869e-08 1.48077371641094e-07 -7.69738626480047e-08 2.94990048269861e-08 -3.37468052222007e-08 -3.67859879729462e-08 8.79847359414426e-10 ", "LINE_NUM_COEFF=0.000721904493927027 1.02330510505135 -1.27742813759689 -0.0973049949136407 -0.014260789316429 0.00229308399354221 -0.0016640916975237 0.0124508639909873 0.00336835383694126 1.1987123734283e-05 -1.85240614830659e-05 4.40716454954686e-05 2.3198555492418e-05 -8.31659287301587e-08 -5.10329082923063e-05 2.56477008932482e-05 1.01465909326012e-05 1.04407036240869e-05 4.27413648628578e-05 2.91696764503125e-07 ", "LINE_OFF=1343.99369782095", "LINE_SCALE=1343.96638400536", "LONG_OFF=-0.034423410000698595", "LONG_SCALE=0.143444599019706", "SAMP_DEN_COEFF=1 1.83636704399141e-05 3.55794197969218e-06 -1.33255440425932e-05 -4.25424777986987e-06 -3.95287146748821e-05 1.35786181318561e-05 -3.86131208639696e-05 -1.10085128708761e-05 -1.26863939055319e-05 -2.88045902675552e-07 -1.58732907217101e-07 4.08999884183478e-07 6.6854211618061e-08 -1.46399266323942e-07 -4.69718293745237e-08 -4.14626818788491e-08 -3.00588241056424e-07 4.54784506604435e-08 3.24214474149225e-08 ", "SAMP_NUM_COEFF=-0.0112062780844554 -1.05096833835297 -0.704023055461029 0.0384547265206585 -0.00987134340336078 -0.00310989611092616 -0.00116937850565916 -0.0102714370609919 0.000930565787504389 7.03834691339565e-05 -3.83216250787844e-05 -3.67841179314918e-05 2.45498653278515e-05 1.06302833544472e-05 -6.26921822677631e-05 1.29769009118128e-05 1.1336284460811e-05 -3.01250967502161e-05 -7.60511798099513e-06 -4.45260900205512e-07 ", "SAMP_OFF=2015.99417232167", "SAMP_SCALE=2015.9777295656" ] ds.SetMetadata(rpc, 'RPC') old_rpc_inverse_verbose = gdal.GetConfigOption('RPC_INVERSE_VERBOSE') gdal.SetConfigOption('RPC_INVERSE_VERBOSE', 'YES') old_rpc_inverse_log = gdal.GetConfigOption('RPC_INVERSE_LOG') gdal.SetConfigOption('RPC_INVERSE_LOG', '/vsimem/transformer_14.csv') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=data/transformer_14_dem.tif']) gdal.SetConfigOption('RPC_INVERSE_VERBOSE', old_rpc_inverse_verbose) gdal.SetConfigOption('RPC_INVERSE_LOG', old_rpc_inverse_log) (success, pnt) = tr.TransformPoint(0, 0, 0) assert success and abs(pnt[0] - 1.9391846640653961e-05) <= 1e-7 and abs(pnt[1] - -0.0038824752244123275) <= 1e-7 f = gdal.VSIFOpenL('/vsimem/transformer_14.csvt', 'rb') if f is not None: content = gdal.VSIFReadL(1, 1000, f).decode('ASCII') gdal.VSIFCloseL(f) assert content.startswith('Integer,Real,Real,Real,String,Real,Real') f = gdal.VSIFOpenL('/vsimem/transformer_14.csv', 'rb') if f is not None: content = gdal.VSIFReadL(1, 1000, f).decode('ASCII') gdal.VSIFCloseL(f) assert content.startswith("""iter,long,lat,height,WKT,error_pixel_x,error_pixel_y 0,""") gdal.Unlink('/vsimem/transformer_14.csvt') gdal.Unlink('/vsimem/transformer_14.csv') ############################################################################### # Test inverse RPC transform with DEM in [-180,180] but guessed longitude going # beyond def test_transformer_15(): ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) rpc = [ "HEIGHT_OFF=50", "HEIGHT_SCALE=10", "LAT_OFF=0", "LAT_SCALE=-0.105215174097221", "LINE_DEN_COEFF=1 0.000113241782375585 -7.43522609681362e-05 3.71535308900828e-08 0.000338102551252493 4.57912749279076e-07 -7.00823537484445e-08 9.01275640119332e-05 -0.000209723741981335 4.74972505083506e-09 7.2855438070338e-10 -3.16688523275456e-05 -4.49211037453489e-05 8.29706981496464e-12 7.58128162744879e-06 6.82536481272507e-07 2.58661007069147e-11 -3.9697791887986e-08 -5.06502821928986e-08 4.66978771069271e-11 ", "LINE_NUM_COEFF=0.00673418095252569 -1.38985626744028 -0.645141238074041 1.4661564574111e-05 0.00022202101663831 -4.32910472926433e-06 -1.90048143949724e-06 -0.00374486341484218 -0.00041396053769863 1.14148334846788e-09 -1.20458144309064e-07 -0.00618122456017927 -0.00783023711720404 1.32704635552568e-09 -0.0032532225011433 -0.00355239507036451 6.20315160857432e-10 -4.75170167074672e-07 1.37652348819162e-07 9.53393990126859e-12 ", "LINE_OFF=2191.17012189569", "LINE_SCALE=2197.23749680132", "LONG_OFF=179.9", "LONG_SCALE=0.124705315627701", "SAMP_DEN_COEFF=1 2.1759243891474e-05 -5.96367842636917e-06 6.03714873685079e-09 -0.000109764869260479 4.67786228725161e-07 -4.22013004308237e-07 0.000110379633112327 -0.00011679427405351 9.30515192365439e-09 1.09243100743555e-09 -3.29956656106618e-05 -4.1918167733603e-05 2.78076356769406e-11 -4.57011012884097e-06 -1.01453844685279e-05 2.60244039950836e-11 -3.52960090220746e-08 -4.49975439524006e-08 1.80641651820794e-11 ", "SAMP_NUM_COEFF=-0.000776008179693209 -0.380692820465227 1.0647540743599 1.72660888229082e-06 0.0028311896140173 -1.0466632896253e-06 3.17728359468736e-06 -0.000150466834838251 0.000566231304705376 -7.34786296240808e-11 5.90340934437437e-07 -0.00169917056998316 -0.00231193494979752 -2.71280972480264e-09 0.00482224415396017 0.00596164573794891 7.58464598771136e-09 -1.46075167736497e-07 -4.64652272450397e-07 -5.59268858101854e-13 ", "SAMP_OFF=3300.0420831968", "SAMP_SCALE=3295.90302088781", ] ds.SetMetadata(rpc, 'RPC') sr = osr.SpatialReference() sr.SetWellKnownGeogCS('WGS84') demE179 = gdal.GetDriverByName('GTiff').Create('/vsimem/demE179.tif', 10, 10) demE179.SetProjection(sr.ExportToWkt()) demE179.SetGeoTransform([179, 0.1, 0, 0.5, 0, -0.1]) demE179.GetRasterBand(1).Fill(50) demW180 = gdal.GetDriverByName('GTiff').Create('/vsimem/demW180.tif', 10, 10) demW180.SetProjection(sr.ExportToWkt()) demW180.SetGeoTransform([-180, 0.1, 0, 0.5, 0, -0.1]) demW180.GetRasterBand(1).Fill(50) gdal.BuildVRT('/vsimem/transformer_15_dem.vrt', [demE179, demW180]) demE179 = None demW180 = None tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/transformer_15_dem.vrt']) (success, pnt) = tr.TransformPoint(0, 0, 0) assert success and abs(pnt[0] - 180.02280735469199) <= 1e-7 and abs(pnt[1] - 0.061069145746997976) <= 1e-7 (success, pnt_forward) = tr.TransformPoint(1, pnt[0], pnt[1], 0) assert success and abs(pnt_forward[0] - 0) <= 0.1 and abs(pnt_forward[1] - 0) <= 0.1, \ 'got wrong reverse transform result.' (success, pnt_forward) = tr.TransformPoint(1, pnt[0] - 360, pnt[1], 0) assert success and abs(pnt_forward[0] - 0) <= 0.1 and abs(pnt_forward[1] - 0) <= 0.1, \ 'got wrong reverse transform result.' # Now test around -180 ds = gdal.GetDriverByName('MEM').Create('', 6600, 4400) rpc.remove('LONG_OFF=179.9') rpc += ['LONG_OFF=-179.9'] ds.SetMetadata(rpc, 'RPC') tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/transformer_15_dem.vrt']) (success, pnt) = tr.TransformPoint(0, 6600, 4400) assert success and abs(pnt[0] - -180.02313813793387) <= 1e-7 and abs(pnt[1] - -0.061398913932229765) <= 1e-7 (success, pnt_forward) = tr.TransformPoint(1, pnt[0], pnt[1], 0) assert success and abs(pnt_forward[0] - 6600) <= 0.1 and abs(pnt_forward[1] - 4400) <= 0.1, \ 'got wrong reverse transform result.' (success, pnt_forward) = tr.TransformPoint(1, pnt[0] + 360, pnt[1], 0) assert success and abs(pnt_forward[0] - 6600) <= 0.1 and abs(pnt_forward[1] - 4400) <= 0.1, \ 'got wrong reverse transform result.' gdal.Unlink('/vsimem/demE179.tif') gdal.Unlink('/vsimem/demW180.tif') gdal.Unlink('/vsimem/transformer_15_dem.tif') gdal.Unlink('/vsimem/transformer_15_dem.vrt') ############################################################################### # Test approximate sub-transformers in GenImgProjTransformer # (we mostly test that the parameters are well recognized and serialized) def test_transformer_16(): gdal.Translate('/vsimem/transformer_16.tif', 'data/byte.tif', options="-gcp 0 0 440720.000 3751320.000 -gcp 0 20 440720.000 3750120.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 -a_srs EPSG:26711") gdal.Warp('/vsimem/transformer_16.vrt', '/vsimem/transformer_16.tif', options='-of VRT -t_srs EPSG:4326 -et 0 -to SRC_APPROX_ERROR_IN_SRS_UNIT=6.05 -to SRC_APPROX_ERROR_IN_PIXEL=0.1 -to REPROJECTION_APPROX_ERROR_IN_SRC_SRS_UNIT=6.1 -to REPROJECTION_APPROX_ERROR_IN_DST_SRS_UNIT=0.0001') f = gdal.VSIFOpenL('/vsimem/transformer_16.vrt', 'rb') if f is not None: content = gdal.VSIFReadL(1, 10000, f).decode('ASCII') gdal.VSIFCloseL(f) assert ('6.05' in content and \ '0.1' in content and \ '0.0001' in content and \ '6.1' in content) ds = gdal.Translate('', '/vsimem/transformer_16.vrt', format='MEM') assert ds.GetRasterBand(1).Checksum() == 4727 ds = None gdal.Unlink('/vsimem/transformer_16.tif') gdal.Unlink('/vsimem/transformer_16.vrt') ############################################################################### # Test RPC DEM with unexisting RPC DEM file def test_transformer_17(): ds = gdal.Open('data/rpc.vrt') with gdaltest.error_handler(): tr = gdal.Transformer(ds, None, ['METHOD=RPC', 'RPC_DEM=/vsimem/i/donot/exist/dem.tif']) assert tr is None def test_transformer_longlat_wrap_outside_180(): ds = gdal.GetDriverByName('MEM').Create('', 360, 1, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([-180, 1, 0, 0, 0, -1]) tr = gdal.Transformer(ds, ds, []) (success, pnt) = tr.TransformPoint(0, -0.5, 0.5, 0) assert success assert abs(pnt[0] - 359.5) <= 0.000001, pnt assert abs(pnt[1] - 0.5) <= 0.000001, pnt ############################################################################### # Test reprojection transformer without reverse path # NOTE: in case the inverse airy method is implemented some day, this test # might fail def test_transformer_no_reverse_method(): tr = gdal.Transformer(None, None, ['SRC_SRS=+proj=longlat +ellps=GRS80', 'DST_SRS=+proj=airy +ellps=GRS80']) assert tr (success, pnt) = tr.TransformPoint(0, 2, 49) assert success assert abs(pnt[0] - 141270.54731856665) <= 1e-3, pnt assert abs(pnt[1] - 4656605.104980032) <= 1e-3, pnt with gdaltest.error_handler(): (success, pnt) = tr.TransformPoint(1, 2, 49) assert not success gdalautotest-3.0.4/gcore/tiff_read.py0000755003401500001440000036077113614005322017241 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiff_read.py 2903daae5d5c04d581f5804d72e84691f2486bc1 2019-09-11 00:45:29 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from a TIFF file. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2007-2014, Even Rouault # # 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. ############################################################################### import os import sys import shutil import pytest import webserver import gdaltest from osgeo import gdal, osr init_list = [ ('byte.tif', 1, 4672), ('uint16_sgilog.tif', 1, 4672), ('next_literalrow.tif', 1, 4), ('next_literalspan.tif', 1, 4), ('next_default_case.tif', 1, 4), ('thunder.tif', 1, 3), ('int10.tif', 1, 4672), ('int12.tif', 1, 4672), ('int16.tif', 1, 4672), ('uint16.tif', 1, 4672), ('int24.tif', 1, 4672), ('int32.tif', 1, 4672), ('uint32.tif', 1, 4672), ('float16.tif', 1, 4672), ('float24.tif', 1, 4672), ('float32.tif', 1, 4672), ('float32_minwhite.tif', 1, 1), ('float64.tif', 1, 4672), ('cint16.tif', 1, 5028), ('cint32.tif', 1, 5028), ('cfloat32.tif', 1, 5028), ('cfloat64.tif', 1, 5028), # The following four related partial final strip/tiles (#1179) ('separate_tiled.tif', 2, 15234), ('seperate_strip.tif', 2, 15234), # TODO: Spelling. ('contig_tiled.tif', 2, 15234), ('contig_strip.tif', 2, 15234), ('empty1bit.tif', 1, 0) ] @pytest.mark.parametrize( 'filename,band,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('GTiff') def test_tiff_open(filename, band, checksum): ut = gdaltest.GDALTest('GTiff', filename, band, checksum) ut.testOpen() ############################################################################### # Test absolute/offset && index directory access def test_tiff_read_off(): # Test absolute/offset directory access. ds = gdal.Open('GTIFF_DIR:off:408:data/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672 # Same with GTIFF_RAW: prefix ds = gdal.Open('GTIFF_RAW:GTIFF_DIR:off:408:data/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672 # Test index directory access ds = gdal.Open('GTIFF_DIR:1:data/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672 # Check that georeferencing is read properly when accessing # "GTIFF_DIR" subdatasets (#3478) gt = ds.GetGeoTransform() assert gt == (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0), \ 'did not get expected geotransform' # Error cases with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:1') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:1:') assert ds is None with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:1:/vsimem/i_dont_exist.tif') assert ds is None # Requested directory not found with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:2:data/byte.tif') assert ds is None # Opening a specific TIFF directory is not supported in update mode. # Switching to read-only with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:1:data/byte.tif', gdal.GA_Update) assert ds is not None ############################################################################### # Confirm we interpret bands as alpha when we should, and not when we # should not. def test_tiff_check_alpha(): # Grey + alpha ds = gdal.Open('data/stefan_full_greyalpha.tif') assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ 'Wrong color interpretation (stefan_full_greyalpha).' ds = None gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/stefan_full_greyalpha.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) gdaltest.supports_force_rgba = False if ds.RasterCount == 4: gdaltest.supports_force_rgba = True if gdaltest.supports_force_rgba: got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [1970, 1970, 1970, 10807] ds = None # RGB + alpha ds = gdal.Open('data/stefan_full_rgba.tif') assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ 'Wrong color interpretation (stefan_full_rgba).' ds = None if gdaltest.supports_force_rgba: gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/stefan_full_rgba.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] # FIXME? Not the same as without GTIFF_FORCE_RGBA=YES assert got_cs == [11547, 57792, 35643, 10807] ds = None # RGB + undefined ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_Undefined, \ 'Wrong color interpretation (stefan_full_rgba_photometric_rgb).' ds = None if gdaltest.supports_force_rgba: gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [12603, 58561, 36064, 10807] ds = None ############################################################################### # Test reading a CMYK tiff as RGBA image def test_tiff_read_cmyk_rgba(): ds = gdal.Open('data/rgbsmall_cmyk.tif') md = ds.GetMetadata('IMAGE_STRUCTURE') assert 'SOURCE_COLOR_SPACE' in md and md['SOURCE_COLOR_SPACE'] == 'CMYK', \ 'bad value for IMAGE_STRUCTURE[SOURCE_COLOR_SPACE]' assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Wrong color interpretation.' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ 'Wrong color interpretation (alpha).' assert ds.GetRasterBand(1).Checksum() == 23303, \ ('Expected checksum = %d. Got = %d' % (23303, ds.GetRasterBand(1).Checksum())) ############################################################################### # Test reading a CMYK tiff as a raw image def test_tiff_read_cmyk_raw(): ds = gdal.Open('GTIFF_RAW:data/rgbsmall_cmyk.tif') assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_CyanBand, \ 'Wrong color interpretation.' assert ds.GetRasterBand(1).Checksum() == 29430, \ ('Expected checksum = %d. Got = %d' % (29430, ds.GetRasterBand(1).Checksum())) ############################################################################### # Test reading a OJPEG image def test_tiff_read_ojpeg(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/zackthecat.tif') gdal.PopErrorHandler() if ds is None: if gdal.GetLastErrorMsg().find('Cannot open TIFF file due to missing codec') == 0: pytest.skip() pytest.fail(gdal.GetLastErrorMsg()) gdal.PushErrorHandler('CPLQuietErrorHandler') got_cs = ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() expected_cs = 61570 assert got_cs == expected_cs, \ ('Expected checksum = %d. Got = %d' % (expected_cs, got_cs)) # gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/zackthecat_corrupted.tif') cs = ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() if cs != 0: print('Should be 0 with internal libtiff') ############################################################################### # Read a .tif.gz file def test_tiff_read_gzip(): try: os.remove('data/byte.tif.gz.properties') except OSError: pass ds = gdal.Open('/vsigzip/./data/byte.tif.gz') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None try: os.stat('data/byte.tif.gz.properties') pytest.fail('did not expect data/byte.tif.gz.properties') except OSError: return ############################################################################### # Read a .tif.zip file (with explicit filename) def test_tiff_read_zip_1(): ds = gdal.Open('/vsizip/./data/byte.tif.zip/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tif.zip file (with implicit filename) def test_tiff_read_zip_2(): ds = gdal.Open('/vsizip/./data/byte.tif.zip') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tif.zip file with a single file in a subdirectory (with explicit filename) def test_tiff_read_zip_3(): ds = gdal.Open('/vsizip/./data/onefileinsubdir.zip/onefileinsubdir/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tif.zip file with a single file in a subdirectory(with implicit filename) def test_tiff_read_zip_4(): ds = gdal.Open('/vsizip/./data/onefileinsubdir.zip') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tif.zip file with 2 files in a subdirectory def test_tiff_read_zip_5(): ds = gdal.Open('/vsizip/./data/twofileinsubdir.zip/twofileinsubdir/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tar file (with explicit filename) def test_tiff_read_tar_1(): ds = gdal.Open('/vsitar/./data/byte.tar/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tar file (with implicit filename) def test_tiff_read_tar_2(): ds = gdal.Open('/vsitar/./data/byte.tar') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Read a .tgz file (with explicit filename) def test_tiff_read_tgz_1(): ds = gdal.Open('/vsitar/./data/byte.tgz/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None gdal.Unlink('data/byte.tgz.properties') ############################################################################### # Read a .tgz file (with implicit filename) def test_tiff_read_tgz_2(): ds = gdal.Open('/vsitar/./data/byte.tgz') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None gdal.Unlink('data/byte.tgz.properties') ############################################################################### # Check handling of non-degree angular units (#601) def test_tiff_grads(): ds = gdal.Open('data/test_gf.tif') srs = ds.GetProjectionRef() assert srs.find('PARAMETER["latitude_of_origin",52]') != -1, \ ('Did not get expected latitude of origin: wkt=%s' % srs) ############################################################################### # Check Erdas Citation Parsing for coordinate system. def test_tiff_citation(): build_info = gdal.VersionInfo('BUILD_INFO') if build_info.find('ESRI_BUILD=YES') == -1: pytest.skip() ds = gdal.Open('data/citation_mixedcase.tif') wkt = ds.GetProjectionRef() expected_wkt = """PROJCS["NAD_1983_HARN_StatePlane_Oregon_North_FIPS_3601_Feet_Intl",GEOGCS["GCS_North_American_1983_HARN",DATUM["NAD83_High_Accuracy_Reference_Network",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",8202099.737532808],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-120.5],PARAMETER["Standard_Parallel_1",44.33333333333334],PARAMETER["Standard_Parallel_2",46.0],PARAMETER["Latitude_Of_Origin",43.66666666666666],UNIT["Foot",0.3048]]""" if wkt != expected_wkt: print('got: ', wkt) pytest.fail('Erdas citation processing failing?') ############################################################################### # Check that we can read linear projection parameters properly (#3901) def test_tiff_linearparmunits(): # Test the file with the correct formulation. ds = gdal.Open('data/spaf27_correct.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 2000000.0) <= 0.001, 'did not get expected false easting (1)' # Test the file with the old (broken) GDAL formulation. ds = gdal.Open('data/spaf27_brokengdal.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 609601.219202438) <= 0.001, 'did not get expected false easting (2)' # Test the file when using an EPSG code. ds = gdal.Open('data/spaf27_epsg.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 2000000.0) <= 0.001, 'did not get expected false easting (3)' ############################################################################### # Check that the GTIFF_LINEAR_UNITS handling works properly (#3901) def test_tiff_linearparmunits2(): gdal.SetConfigOption('GTIFF_LINEAR_UNITS', 'BROKEN') # Test the file with the correct formulation. ds = gdal.Open('data/spaf27_correct.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 6561666.66667) <= 0.001, 'did not get expected false easting (1)' # Test the file with the correct formulation that is marked as correct. ds = gdal.Open('data/spaf27_markedcorrect.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 2000000.0) <= 0.001, 'did not get expected false easting (2)' # Test the file with the old (broken) GDAL formulation. ds = gdal.Open('data/spaf27_brokengdal.tif') wkt = ds.GetProjectionRef() ds = None srs = osr.SpatialReference(wkt) fe = srs.GetProjParm(osr.SRS_PP_FALSE_EASTING) assert abs(fe - 2000000.0) <= 0.001, 'did not get expected false easting (3)' gdal.SetConfigOption('GTIFF_LINEAR_UNITS', 'DEFAULT') ############################################################################### # Test GTiffSplitBitmapBand to treat one row 1bit files as scanline blocks (#2622) def test_tiff_g4_split(): ds = gdal.Open('data/slim_g4.tif') (_, blocky) = ds.GetRasterBand(1).GetBlockSize() assert blocky == 1, 'Did not get scanline sized blocks.' cs = ds.GetRasterBand(1).Checksum() assert cs == 3322, 'Got wrong checksum' ############################################################################### # Test reading a tiff with multiple images in it def test_tiff_multi_images(): # Implicitly get the content of the first image (backward compatibility). ds = gdal.Open('data/twoimages.tif') assert ds.GetRasterBand(1).Checksum() == 4672, ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) md = ds.GetMetadata('SUBDATASETS') assert md['SUBDATASET_1_NAME'] == 'GTIFF_DIR:1:data/twoimages.tif', \ 'did not get expected subdatasets metadata.' ds = None # Explicitly get the content of the first image. ds = gdal.Open('GTIFF_DIR:1:data/twoimages.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None # Explicitly get the content of the second image. ds = gdal.Open('GTIFF_DIR:2:data/twoimages.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds = None ############################################################################### # Test reading a tiff from a memory buffer (#2931) def test_tiff_vsimem(): try: gdal.FileFromMemBuffer except AttributeError: pytest.skip() content = open('data/byte.tif', mode='rb').read() # Create in-memory file gdal.FileFromMemBuffer('/vsimem/tiffinmem', content) ds = gdal.Open('/vsimem/tiffinmem', gdal.GA_Update) assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) ds.GetRasterBand(1).Fill(0) ds = None ds = gdal.Open('/vsimem/tiffinmem') assert ds.GetRasterBand(1).Checksum() == 0, \ ('Expected checksum = %d. Got = %d' % (0, ds.GetRasterBand(1).Checksum())) ds = None # Also test with anti-slash ds = gdal.Open('/vsimem\\tiffinmem') assert ds.GetRasterBand(1).Checksum() == 0, \ ('Expected checksum = %d. Got = %d' % (0, ds.GetRasterBand(1).Checksum())) ds = None # Release memory associated to the in-memory file gdal.Unlink('/vsimem/tiffinmem') ############################################################################### # Test reading a tiff from inside a zip in a memory buffer ! def test_tiff_vsizip_and_mem(): try: gdal.FileFromMemBuffer except AttributeError: pytest.skip() content = open('data/byte.tif.zip', mode='rb').read() # Create in-memory file gdal.FileFromMemBuffer('/vsimem/tiffinmem.zip', content) ds = gdal.Open('/vsizip/vsimem/tiffinmem.zip/byte.tif') assert ds.GetRasterBand(1).Checksum() == 4672, \ ('Expected checksum = %d. Got = %d' % (4672, ds.GetRasterBand(1).Checksum())) # Release memory associated to the in-memory file gdal.Unlink('/vsimem/tiffinmem.zip') ############################################################################### # Test reading a GeoTIFF with only ProjectedCSTypeGeoKey defined (ticket #3019) def test_tiff_ProjectedCSTypeGeoKey_only(): ds = gdal.Open('data/ticket3019.tif') assert ds.GetProjectionRef().find('WGS 84 / UTM zone 31N') != -1 ds = None ############################################################################### # Test reading a GeoTIFF with only GTModelTypeGeoKey defined def test_tiff_GTModelTypeGeoKey_only(): ds = gdal.Open('data/GTModelTypeGeoKey_only.tif') assert ds.GetProjectionRef().find('LOCAL_CS["unnamed"]') == 0 ds = None ############################################################################### # Test reading a 12bit jpeg compressed geotiff. def test_tiff_12bitjpeg(): old_accum = gdal.GetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') gdal.Unlink('data/mandrilmini_12bitjpeg.tif.aux.xml') try: ds = gdal.Open('data/mandrilmini_12bitjpeg.tif') ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) except: ds = None gdal.PopErrorHandler() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', old_accum) if gdal.GetLastErrorMsg().find( 'Unsupported JPEG data precision 12') != -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() elif ds is None: pytest.fail('failed to open 12bit jpeg file with unexpected error') try: stats = ds.GetRasterBand(1).GetStatistics(0, 1) except: pass assert not (stats[2] < 2150 or stats[2] > 2180 or str(stats[2]) == 'nan'), \ 'did not get expected mean for band1.' ds = None os.unlink('data/mandrilmini_12bitjpeg.tif.aux.xml') ############################################################################### # Test that statistics for TIFF files are stored and correctly read from .aux.xml def test_tiff_read_stats_from_pam(): try: os.remove('data/byte.tif.aux.xml') except OSError: pass ds = gdal.Open('data/byte.tif') md = ds.GetRasterBand(1).GetMetadata() assert 'STATISTICS_MINIMUM' not in md, 'Unexpected presence of STATISTICS_MINIMUM' # Force statistics computation stats = ds.GetRasterBand(1).GetStatistics(0, 1) assert stats[0] == 74.0 and stats[1] == 255.0 ds = None try: os.stat('data/byte.tif.aux.xml') except OSError: pytest.fail('Expected generation of data/byte.tif.aux.xml') ds = gdal.Open('data/byte.tif') # Just read statistics (from PAM) without forcing their computation stats = ds.GetRasterBand(1).GetStatistics(0, 0) assert stats[0] == 74.0 and stats[1] == 255.0 ds = None try: os.remove('data/byte.tif.aux.xml') except OSError: pass ############################################################################### # Test extracting georeferencing from a .TAB file def test_tiff_read_from_tab(): ds = gdal.GetDriverByName('GTiff').Create('tmp/tiff_read_from_tab.tif', 1, 1) ds = None f = open('tmp/tiff_read_from_tab.tab', 'wt') f.write("""!table !version 300 !charset WindowsLatin1 Definition Table File "HP.TIF" Type "RASTER" (400000,1200000) (0,4000) Label "Pt 1", (500000,1200000) (4000,4000) Label "Pt 2", (500000,1300000) (4000,0) Label "Pt 3", (400000,1300000) (0,0) Label "Pt 4" CoordSys Earth Projection 8, 79, "m", -2, 49, 0.9996012717, 400000, -100000 Units "m" """) f.close() ds = gdal.Open('tmp/tiff_read_from_tab.tif') gt = ds.GetGeoTransform() wkt = ds.GetProjectionRef() ds = None gdal.GetDriverByName('GTiff').Delete('tmp/tiff_read_from_tab.tif') assert not os.path.exists('tmp/tiff_read_from_tab.tab') assert gt == (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0), \ 'did not get expected geotransform' assert wkt.find('OSGB_1936') != -1, 'did not get expected SRS' ############################################################################### # Test reading PixelIsPoint file. def test_tiff_read_pixelispoint(): gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') ds = gdal.Open('data/byte_point.tif') gt = ds.GetGeoTransform() 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/byte_point.tif') gt = ds.GetGeoTransform() ds = 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' gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) ############################################################################### # Test reading a GeoTIFF file with a geomatrix in PixelIsPoint format. def test_tiff_read_geomatrix(): gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'FALSE') ds = gdal.Open('data/geomatrix.tif') gt = ds.GetGeoTransform() ds = None gt_expected = (1841001.75, 1.5, -5.0, 1144003.25, -5.0, -1.5) assert gt == gt_expected, 'did not get expected geotransform' gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', 'TRUE') ds = gdal.Open('data/geomatrix.tif') gt = ds.GetGeoTransform() ds = None gt_expected = (1841000.0, 1.5, -5.0, 1144000.0, -5.0, -1.5) assert gt == gt_expected, \ 'did not get expected geotransform with GTIFF_POINT_GEO_IGNORE TRUE' gdal.SetConfigOption('GTIFF_POINT_GEO_IGNORE', None) ############################################################################### # Test that we don't crash when reading a TIFF with corrupted GeoTIFF tags def test_tiff_read_corrupted_gtiff(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/corrupted_gtiff_tags.tif') gdal.PopErrorHandler() del ds err_msg = gdal.GetLastErrorMsg() assert (not (err_msg.find('IO error during') == -1 and \ err_msg.find('Error fetching data for field') == -1)), \ 'did not get expected error message' ############################################################################### # Test that we don't crash when reading a TIFF with corrupted GeoTIFF tags def test_tiff_read_tag_without_null_byte(): gdal.ErrorReset() oldval = gdal.GetConfigOption('CPL_DEBUG') gdal.SetConfigOption('CPL_DEBUG', 'OFF') ds = gdal.Open('data/tag_without_null_byte.tif') gdal.SetConfigOption('CPL_DEBUG', oldval) assert gdal.GetLastErrorType() == 0, \ 'should have not emitted a warning, but only a CPLDebug() message' del ds ############################################################################### # Test the effect of the GTIFF_IGNORE_READ_ERRORS configuration option (#3994) def test_tiff_read_buggy_packbits(): old_val = gdal.GetConfigOption('GTIFF_IGNORE_READ_ERRORS') gdal.SetConfigOption('GTIFF_IGNORE_READ_ERRORS', None) ds = gdal.Open('data/byte_buggy_packbits.tif') gdal.SetConfigOption('GTIFF_IGNORE_READ_ERRORS', old_val) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ReadRaster(0, 0, 20, 20) gdal.PopErrorHandler() assert ret is None, 'did not expected a valid result' ds = None gdal.SetConfigOption('GTIFF_IGNORE_READ_ERRORS', 'YES') ds = gdal.Open('data/byte_buggy_packbits.tif') gdal.SetConfigOption('GTIFF_IGNORE_READ_ERRORS', old_val) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ReadRaster(0, 0, 20, 20) gdal.PopErrorHandler() assert ret is not None, 'expected a valid result' ds = None ############################################################################### # Test reading a GeoEye _rpc.txt (#3639) def test_tiff_read_rpc_txt(): shutil.copy('data/byte.tif', 'tmp/test.tif') shutil.copy('data/test_rpc.txt', 'tmp/test_rpc.txt') ds = gdal.Open('tmp/test.tif') rpc_md = ds.GetMetadata('RPC') ds = None os.remove('tmp/test.tif') os.remove('tmp/test_rpc.txt') assert rpc_md['HEIGHT_OFF'] == '+0300.000 meters', \ ('HEIGHT_OFF wrong:"' + rpc_md['HEIGHT_OFF'] + '"') assert (rpc_md['LINE_DEN_COEFF'].find( '+1.000000000000000E+00 -5.207696939454288E-03') == 0), \ 'LINE_DEN_COEFF wrong' ############################################################################### # Test reading a TIFF with the RPC tag per # http://geotiff.maptools.org/rpc_prop.html def test_tiff_read_rpc_tif(): ds = gdal.Open('data/byte_rpc.tif') rpc_md = ds.GetMetadata('RPC') ds = None assert rpc_md['HEIGHT_OFF'] == '300', ('HEIGHT_OFF wrong:' + rpc_md['HEIGHT_OFF']) assert rpc_md['LINE_DEN_COEFF'].find('1 -0.00520769693945429') == 0, \ 'LINE_DEN_COEFF wrong' ############################################################################### # Test a very small TIFF with only 4 tags : # Magic: 0x4949 Version: 0x2a # Directory 0: offset 8 (0x8) next 0 (0) # ImageWidth (256) SHORT (3) 1<1> # ImageLength (257) SHORT (3) 1<1> # StripOffsets (273) LONG (4) 1<0> # StripByteCounts (279) LONG (4) 1<1> def test_tiff_small(): content = '\x49\x49\x2A\x00\x08\x00\x00\x00\x04\x00\x00\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x01\x00\x00\x00' # Create in-memory file gdal.FileFromMemBuffer('/vsimem/small.tif', content) ds = gdal.Open('/vsimem/small.tif') assert ds.GetRasterBand(1).Checksum() == 0, \ ('Expected checksum = %d. Got = %d' % (0, ds.GetRasterBand(1).Checksum())) # Release memory associated to the in-memory file gdal.Unlink('/vsimem/small.tif') ############################################################################### # Test that we can workaround a DoS with def test_tiff_dos_strip_chop(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/tiff_dos_strip_chop.tif') gdal.PopErrorHandler() del ds ############################################################################### # Test reading EXIF and GPS metadata def test_tiff_read_exif_and_gps(): ds = gdal.Open('data/exif_and_gps.tif') exif_md = ds.GetMetadata('EXIF') ds = None assert exif_md is not None and exif_md ds = gdal.Open('data/exif_and_gps.tif') EXIF_GPSVersionID = ds.GetMetadataItem('EXIF_GPSVersionID', 'EXIF') ds = None assert EXIF_GPSVersionID is not None # We should not get any EXIF metadata with that file ds = gdal.Open('data/byte.tif') exif_md = ds.GetMetadata('EXIF') ds = None assert (exif_md is None or not exif_md) ############################################################################### # Test reading a pixel interleaved RGBA JPEG-compressed TIFF def test_tiff_jpeg_rgba_pixel_interleaved(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdal.Open('data/stefan_full_rgba_jpeg_contig.tif') md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['INTERLEAVE'] == 'PIXEL' expected_cs = [16404, 62700, 37913, 14174] for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i] assert ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == gdal.GCI_RedBand + i ds = None ############################################################################### # Test reading a band interleaved RGBA JPEG-compressed TIFF def test_tiff_jpeg_rgba_band_interleaved(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdal.Open('data/stefan_full_rgba_jpeg_separate.tif') md = ds.GetMetadata('IMAGE_STRUCTURE') assert md['INTERLEAVE'] == 'BAND' expected_cs = [16404, 62700, 37913, 14174] for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == expected_cs[i] assert ds.GetRasterBand(i + 1).GetRasterColorInterpretation() == gdal.GCI_RedBand + i ds = None ############################################################################### # Test reading a YCbCr JPEG all-in-one-strip multiband TIFF (#3259, #3894) def test_tiff_read_online_1(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/3259/imgpb17.tif', 'imgpb17.tif'): pytest.skip() ds = gdal.Open('tmp/cache/imgpb17.tif') gdal.ErrorReset() cs = ds.GetRasterBand(1).Checksum() ds = None assert gdal.GetLastErrorMsg() == '' assert cs == 62628 or cs == 28554 ############################################################################### # Use GTIFF_DIRECT_IO=YES option combined with /vsicurl to test for multi-range # support def test_tiff_read_vsicurl_multirange(): if gdal.GetDriverByName('HTTP') is None: pytest.skip() webserver_process = None webserver_port = 0 (webserver_process, webserver_port) = webserver.launch(handler=webserver.DispatcherHttpHandler) if webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() try: filesize = 262976 handler = webserver.SequentialHandler() handler.add('HEAD', '/utm.tif', 200, {'Content-Length': '%d' % filesize}) def method(request): #sys.stderr.write('%s\n' % str(request.headers)) if request.headers['Range'].startswith('bytes='): rng = request.headers['Range'][len('bytes='):] assert len(rng.split('-')) == 2 start = int(rng.split('-')[0]) end = int(rng.split('-')[1]) request.protocol_version = 'HTTP/1.1' request.send_response(206) request.send_header('Content-type', 'application/octet-stream') request.send_header('Content-Range', 'bytes %d-%d/%d' % (start, end, filesize)) request.send_header('Content-Length', end - start + 1) request.send_header('Connection', 'close') request.end_headers() with open('../gdrivers/data/utm.tif', 'rb') as f: f.seek(start, 0) request.wfile.write(f.read(end - start + 1)) for i in range(6): handler.add('GET', '/utm.tif', custom_method=method) with webserver.install_http_handler(handler): with gdaltest.config_options({ 'GTIFF_DIRECT_IO': 'YES', 'CPL_VSIL_CURL_ALLOWED_EXTENSIONS': '.tif', 'GDAL_DISABLE_READDIR_ON_OPEN': 'EMPTY_DIR' }): ds = gdal.Open('/vsicurl/http://127.0.0.1:%d/utm.tif' % webserver_port) assert ds is not None, 'could not open dataset' # Read subsampled data subsampled_data = ds.ReadRaster(0, 0, 512, 32, 128, 4) ds = None ds = gdal.GetDriverByName('MEM').Create('', 128, 4) ds.WriteRaster(0, 0, 128, 4, subsampled_data) cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 6429, 'wrong checksum' finally: webserver.server_stop(webserver_process, webserver_port) gdal.VSICurlClearCache() ############################################################################### # Test reading a TIFF made of a single-strip that is more than 2GB (#5403) def test_tiff_read_huge4GB(): # Need libtiff 4.X anyway md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if not gdaltest.filesystem_supports_sparse_files('tmp'): ds = gdal.Open('data/huge4GB.tif') assert ds is not None else: shutil.copy('data/huge4GB.tif', 'tmp/huge4GB.tif') f = open('tmp/huge4GB.tif', 'rb+') f.seek(65535 * 65535 + 401) f.write(' '.encode('ascii')) f.close() ds = gdal.Open('tmp/huge4GB.tif') if ds is None: os.remove('tmp/huge4GB.tif') pytest.fail() ds = None os.remove('tmp/huge4GB.tif') ############################################################################### # Test reading a (small) BigTIFF. Tests GTiffCacheOffsetOrCount8() def test_tiff_read_bigtiff(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdal.Open('data/byte_bigtiff_strip5lines.tif') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672 ############################################################################### # Test reading in TIFF metadata domain def test_tiff_read_tiff_metadata(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdal.Open('data/stefan_full_rgba_jpeg_contig.tif') assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') == '254' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_0', 'TIFF') == '770' assert ds.GetRasterBand(1).GetMetadataItem('JPEGTABLES', 'TIFF').find('FFD8') == 0 assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_100_0', 'TIFF') is None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_100', 'TIFF') is None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_100_0', 'TIFF') is None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_100', 'TIFF') is None ds = gdal.Open('data/stefan_full_rgba_jpeg_separate.tif') assert ds.GetRasterBand(4).GetMetadataItem('BLOCK_OFFSET_0_2', 'TIFF') == '11071' assert ds.GetRasterBand(4).GetMetadataItem('BLOCK_SIZE_0_2', 'TIFF') == '188' ############################################################################### # Test reading a JPEG-in-TIFF with tiles of irregular size (corrupted image) def test_tiff_read_irregular_tile_size_jpeg_in_tiff(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() ds = gdal.Open('data/irregular_tile_size_jpeg_in_tiff.tif') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetRasterBand(1).Checksum() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetRasterBand(1).GetOverview(0).Checksum() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() ############################################################################### # Test GTIFF_DIRECT_IO and GTIFF_VIRTUAL_MEM_IO optimizations def test_tiff_direct_and_virtual_mem_io(): # Test with pixel-interleaved and band-interleaved datasets for dt in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_CInt16]: src_ds = gdal.Open('data/stefan_full_rgba.tif') dt_size = 1 if dt == gdal.GDT_Int16: dt_size = 2 mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, dt) data = src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, buf_type=dt) new_vals = [] for i in range(4 * src_ds.RasterXSize * src_ds.RasterYSize): if sys.version_info >= (3, 0, 0): new_vals.append(chr(data[2 * i]).encode('latin1')) new_vals.append(chr(255 - data[2 * i]).encode('latin1')) else: new_vals.append(data[2 * i]) new_vals.append(chr(255 - ord(data[2 * i]))) if sys.version_info >= (3, 0, 0): data = ''.encode('latin1').join(new_vals) else: data = ''.join(new_vals) mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data, buf_type=dt) src_ds = mem_ds elif dt == gdal.GDT_CInt16: dt_size = 4 mem_ds = gdal.GetDriverByName('MEM').Create('', src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, dt) data = src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, buf_type=dt) new_vals = [] for i in range(4 * src_ds.RasterXSize * src_ds.RasterYSize): if sys.version_info >= (3, 0, 0): new_vals.append(chr(data[4 * i]).encode('latin1')) new_vals.append(chr(data[4 * i]).encode('latin1')) new_vals.append(chr(255 - data[4 * i]).encode('latin1')) new_vals.append(chr(255 - data[4 * i]).encode('latin1')) else: new_vals.append(data[4 * i]) new_vals.append(data[4 * i]) new_vals.append(chr(255 - ord(data[4 * i]))) new_vals.append(chr(255 - ord(data[4 * i]))) if sys.version_info >= (3, 0, 0): data = ''.encode('latin1').join(new_vals) else: data = ''.join(new_vals) mem_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, data, buf_type=dt) src_ds = mem_ds for truncated in [False, True]: if truncated: nitermax = 4 options = [('GTIFF_DIRECT_IO', '/vsimem'), ('GTIFF_VIRTUAL_MEM_IO', '/vsimem')] else: nitermax = 8 options = [('GTIFF_DIRECT_IO', '/vsimem'), ('GTIFF_VIRTUAL_MEM_IO', '/vsimem'), ('GTIFF_VIRTUAL_MEM_IO', 'tmp')] for (option, prefix) in options: if dt == gdal.GDT_CInt16: niter = 3 elif prefix == 'tmp': niter = 4 else: niter = nitermax for i in range(niter): if i == 0: filename = '%s/tiff_direct_io_contig.tif' % prefix creation_options = [] if (dt == gdal.GDT_CInt16 or dt == gdal.GDT_Int16): creation_options += ['ENDIANNESS=INVERTED'] out_ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=creation_options) out_ds.FlushCache() out_ds = None elif i == 1: filename = '%s/tiff_direct_io_separate.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=['INTERLEAVE=BAND']) out_ds.FlushCache() out_ds = None elif i == 2: filename = '%s/tiff_direct_io_tiled_contig.tif' % prefix creation_options = ['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=16'] if (dt == gdal.GDT_CInt16 or dt == gdal.GDT_Int16): creation_options += ['ENDIANNESS=INVERTED'] if option == 'GTIFF_VIRTUAL_MEM_IO' and prefix == '/vsimem': gdal.Translate(filename, src_ds, bandList=[1, 2, 3], creationOptions=creation_options) else: out_ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=creation_options) out_ds.FlushCache() out_ds = None elif i == 3: filename = '%s/tiff_direct_io_tiled_separate.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').CreateCopy(filename, src_ds, options=['TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=16', 'INTERLEAVE=BAND']) out_ds.FlushCache() out_ds = None elif i == 4: filename = '%s/tiff_direct_io_sparse.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').Create(filename, 165, 150, 4, dt, options=['SPARSE_OK=YES']) out_ds.FlushCache() out_ds = None elif i == 5: filename = '%s/tiff_direct_io_sparse_separate.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').Create(filename, 165, 150, 4, dt, options=['SPARSE_OK=YES', 'INTERLEAVE=BAND']) out_ds.FlushCache() out_ds = None elif i == 6: filename = '%s/tiff_direct_io_sparse_tiled.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').Create(filename, 165, 150, 4, dt, options=['SPARSE_OK=YES', 'TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=16']) out_ds.FlushCache() out_ds = None else: filename = '%s/tiff_direct_io_sparse_tiled_separate.tif' % prefix out_ds = gdal.GetDriverByName('GTiff').Create(filename, 165, 150, 4, dt, options=['SPARSE_OK=YES', 'TILED=YES', 'BLOCKXSIZE=32', 'BLOCKYSIZE=16', 'INTERLEAVE=BAND']) out_ds.FlushCache() out_ds = None if truncated: ds = gdal.Open(filename) nbands = ds.RasterCount nxsize = ds.RasterXSize nysize = ds.RasterYSize (nblockxsize, nblockysize) = ds.GetRasterBand(1).GetBlockSize() band_interleaved = ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'BAND' ds = None padding = 0 if nblockxsize < nxsize: if (nysize % nblockysize) != 0: padding = ((nxsize + nblockxsize - 1) / nblockxsize * nblockxsize) * (nblockysize - (nysize % nblockysize)) if(nxsize % nblockxsize) != 0: padding += nblockxsize - (nxsize % nblockxsize) padding *= dt_size if not band_interleaved: padding *= nbands padding = int(padding) to_remove = 1 if not band_interleaved: to_remove += (nbands - 1) * dt_size f = gdal.VSIFOpenL(filename, 'rb') data = gdal.VSIFReadL(1, 1000000, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(filename, 'wb') gdal.VSIFWriteL(data, 1, len(data) - padding - to_remove, f) gdal.VSIFCloseL(f) ds = gdal.Open(filename) xoff = int(ds.RasterXSize / 4) yoff = int(ds.RasterYSize / 4) xsize = int(ds.RasterXSize / 2) ysize = int(ds.RasterXSize / 2) nbands = ds.RasterCount sizeof_float = 4 if truncated: gdal.PushErrorHandler() ref_data_native_type = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize) ref_data_native_type_whole = ds.GetRasterBand(1).ReadRaster() ref_data_native_type_downsampled = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2)) ref_data_native_type_downsampled_not_nearest = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), resample_alg=gdal.GRIORA_Bilinear) ref_data_native_type_upsampled = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=nbands * xsize, buf_ysize=nbands * ysize) ref_data_native_type_custom_spacings = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=nbands * dt_size) ref_data_float32 = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32) ref_nbands_data_native_type = ds.ReadRaster(xoff, yoff, xsize, ysize) ref_nbands_data_native_type_whole = ds.ReadRaster() ref_nbands_data_native_type_downsampled = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2)) ref_nbands_data_native_type_downsampled_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) ref_nbands_data_native_type_downsampled_not_nearest = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), resample_alg=gdal.GRIORA_Bilinear) ref_nbands_data_native_type_upsampled = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=4 * xsize, buf_ysize=4 * ysize) ref_nbands_data_native_type_downsampled_x_upsampled_y = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=32 * ysize) ref_nbands_data_native_type_unordered_list = ds.ReadRaster(xoff, yoff, xsize, ysize, band_list=[nbands - i for i in range(nbands)]) ref_nbands_data_native_type_pixel_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) ref_nbands_data_native_type_pixel_interleaved_whole = ds.ReadRaster(buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) ref_nbands_m_1_data_native_type_pixel_interleaved_with_extra_space = ds.ReadRaster(xoff, yoff, xsize, ysize, band_list=[i + 1 for i in range(nbands - 1)], buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) ref_nbands_data_float32 = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32) ref_nbands_data_float32_pixel_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32, buf_pixel_space=nbands * sizeof_float, buf_band_space=1 * sizeof_float) ref_nbands_data_native_type_custom_spacings = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=2 * nbands * dt_size, buf_band_space=dt_size) if nbands == 3: ref_nbands_data_native_type_custom_spacings_2 = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=4 * dt_size, buf_band_space=dt_size) if truncated: gdal.PopErrorHandler() ds = None if truncated: gdal.PushErrorHandler() old_val = gdal.GetConfigOption(option) gdal.SetConfigOption(option, 'YES') ds = gdal.Open(filename) band_interleaved = ds.GetMetadataItem('INTERLEAVE', 'IMAGE_STRUCTURE') == 'BAND' got_data_native_type = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize) got_data_native_type_whole = ds.GetRasterBand(1).ReadRaster() got_data_native_type_downsampled = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2)) got_data_native_type_downsampled_not_nearest = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), resample_alg=gdal.GRIORA_Bilinear) got_data_native_type_upsampled = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=nbands * xsize, buf_ysize=nbands * ysize) got_data_native_type_custom_spacings = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=nbands * dt_size) got_data_float32 = ds.GetRasterBand(1).ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32) got_nbands_data_native_type = ds.ReadRaster(xoff, yoff, xsize, ysize) got_nbands_data_native_type_whole = ds.ReadRaster() got_nbands_data_native_type_bottom_right_downsampled = ds.ReadRaster(ds.RasterXSize - 2, ds.RasterYSize - 1, 2, 1, buf_xsize=1, buf_ysize=1, buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) got_nbands_data_native_type_downsampled = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2)) got_nbands_data_native_type_downsampled_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) got_nbands_data_native_type_downsampled_not_nearest = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=int(ysize / 2), resample_alg=gdal.GRIORA_Bilinear) got_nbands_data_native_type_upsampled = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=4 * xsize, buf_ysize=4 * ysize) got_nbands_data_native_type_downsampled_x_upsampled_y = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_xsize=int(xsize / 2), buf_ysize=32 * ysize) got_nbands_data_native_type_unordered_list = ds.ReadRaster(xoff, yoff, xsize, ysize, band_list=[nbands - i for i in range(nbands)]) got_nbands_data_native_type_pixel_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) got_nbands_data_native_type_pixel_interleaved_whole = ds.ReadRaster(buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) got_nbands_m_1_data_native_type_pixel_interleaved_with_extra_space = ds.ReadRaster(xoff, yoff, xsize, ysize, band_list=[i + 1 for i in range(nbands - 1)], buf_pixel_space=nbands * dt_size, buf_band_space=dt_size) got_nbands_data_float32 = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32) got_nbands_data_float32_pixel_interleaved = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_type=gdal.GDT_Float32, buf_pixel_space=nbands * sizeof_float, buf_band_space=1 * sizeof_float) got_nbands_data_native_type_custom_spacings = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=2 * nbands * dt_size, buf_band_space=dt_size) if nbands == 3: got_nbands_data_native_type_custom_spacings_2 = ds.ReadRaster(xoff, yoff, xsize, ysize, buf_pixel_space=4 * dt_size, buf_band_space=dt_size) ds = None gdal.SetConfigOption(option, old_val) if truncated: gdal.PopErrorHandler() gdal.Unlink(filename) if ref_data_native_type != got_data_native_type: print(option) pytest.fail(i) if truncated and not band_interleaved: if got_data_native_type_whole is not None: print(truncated) print(band_interleaved) print(option) print(i) pytest.fail(gdal.GetDataTypeName(dt)) elif ref_data_native_type_whole != got_data_native_type_whole: print(i) pytest.fail(option) if ref_data_native_type_downsampled != got_data_native_type_downsampled: print(option) pytest.fail(i) if not truncated and ref_data_native_type_downsampled_not_nearest != got_data_native_type_downsampled_not_nearest: print(band_interleaved) print(option) pytest.fail(i) if ref_data_native_type_upsampled != got_data_native_type_upsampled: print(option) pytest.fail(i) for y in range(ysize): for x in range(xsize): for k in range(dt_size): if ref_data_native_type_custom_spacings[(y * xsize + x) * nbands * dt_size + k] != got_data_native_type_custom_spacings[(y * xsize + x) * nbands * dt_size + k]: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) if not truncated: for band in range(nbands): if ref_nbands_data_native_type_custom_spacings[(y * xsize + x) * 2 * nbands * dt_size + band * dt_size + k] != got_nbands_data_native_type_custom_spacings[(y * xsize + x) * 2 * nbands * dt_size + band * dt_size + k]: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) if nbands == 3: for band in range(nbands): if ref_nbands_data_native_type_custom_spacings_2[(y * xsize + x) * 4 * dt_size + band * dt_size + k] != got_nbands_data_native_type_custom_spacings_2[(y * xsize + x) * 4 * dt_size + band * dt_size + k]: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) if ref_data_float32 != got_data_float32: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) if not truncated and ref_nbands_data_native_type != got_nbands_data_native_type: print(band_interleaved) print(option) pytest.fail(i) if truncated: if got_nbands_data_native_type_whole is not None: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) elif ref_nbands_data_native_type_whole != got_nbands_data_native_type_whole: print(option) print(i) pytest.fail(gdal.GetDataTypeName(dt)) if truncated: if got_nbands_data_native_type_pixel_interleaved_whole is not None: print(option) pytest.fail(i) elif ref_nbands_data_native_type_pixel_interleaved_whole != got_nbands_data_native_type_pixel_interleaved_whole: print(i) pytest.fail(option) if truncated and got_nbands_data_native_type_bottom_right_downsampled is not None: print(gdal.GetDataTypeName(dt)) print(option) pytest.fail(i) if truncated: continue if ref_nbands_data_native_type_downsampled != got_nbands_data_native_type_downsampled: print(option) pytest.fail(i) if ref_nbands_data_native_type_downsampled_interleaved != got_nbands_data_native_type_downsampled_interleaved: print(option) pytest.fail(i) if ref_nbands_data_native_type_downsampled_not_nearest != got_nbands_data_native_type_downsampled_not_nearest: print(option) pytest.fail(i) if ref_nbands_data_native_type_upsampled != got_nbands_data_native_type_upsampled: print(option) # import struct # f1 = open('out1.txt', 'wb') # f2 = open('out2.txt', 'wb') # for b in range(nbands): # for y in range(4 * ysize): # f1.write('%s\n' % str(struct.unpack('B' * 4 * xsize, ref_nbands_data_native_type_upsampled[(b * 4 * ysize + y) * 4 * xsize : (b * 4 * ysize + y + 1) * 4 * xsize]))) # f2.write('%s\n' % str(struct.unpack('B' * 4 * xsize, got_nbands_data_native_type_upsampled[(b * 4 * ysize + y) * 4 * xsize : (b * 4 * ysize + y + 1) * 4 * xsize]))) pytest.fail(i) if ref_nbands_data_native_type_downsampled_x_upsampled_y != got_nbands_data_native_type_downsampled_x_upsampled_y: print(option) # import struct # f1 = open('out1.txt', 'wb') # f2 = open('out2.txt', 'wb') # for b in range(nbands): # for y in range(32 * ysize): # f1.write('%s\n' % str(struct.unpack('B' * int(xsize/2), ref_nbands_data_native_type_downsampled_x_upsampled_y[(b * 32 * ysize + y) * int(xsize/2) : (b * 32 * ysize + y + 1) * int(xsize/2)]))) # f2.write('%s\n' % str(struct.unpack('B' * int(xsize/2), got_nbands_data_native_type_downsampled_x_upsampled_y[(b * 32 * ysize + y) * int(xsize/2) : (b * 32 * ysize + y + 1) * int(xsize/2)]))) pytest.fail(i) if ref_nbands_data_native_type_unordered_list != got_nbands_data_native_type_unordered_list: print(option) pytest.fail(i) if ref_nbands_data_native_type_pixel_interleaved != got_nbands_data_native_type_pixel_interleaved: print(option) pytest.fail(i) for y in range(ysize): for x in range(xsize): for b in range(nbands - 1): for k in range(dt_size): if ref_nbands_m_1_data_native_type_pixel_interleaved_with_extra_space[((y * xsize + x) * nbands + b) * dt_size + k] != got_nbands_m_1_data_native_type_pixel_interleaved_with_extra_space[((y * xsize + x) * nbands + b) * dt_size + k]: print(option) pytest.fail(i) if ref_nbands_data_float32 != got_nbands_data_float32: print(option) pytest.fail(i) if ref_nbands_data_float32_pixel_interleaved != got_nbands_data_float32_pixel_interleaved: print(option) pytest.fail(i) ds = gdal.Open('data/byte.tif') # any GTiff file will do unreached = ds.GetMetadataItem('UNREACHED_VIRTUALMEMIO_CODE_PATH', '_DEBUG_') ds = None if unreached: print('unreached = %s' % unreached) pytest.fail('missing code coverage in VirtualMemIO()') ############################################################################### # Check read Digital Globe metadata IMD & RPB format def test_tiff_read_md1(): try: os.remove('data/md_dg.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_dg.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2010-04-01 12:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_dg.tif.aux.xml') ############################################################################### # Check read Digital Globe metadata XML format def test_tiff_read_md2(): try: os.remove('data/md_dg_2.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_dg_2.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 2, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2011-05-01 13:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_dg_2.tif.aux.xml') ############################################################################### # Check read GeoEye metadata format def test_tiff_read_md3(): try: os.remove('data/md_ge_rgb_0010000.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_ge_rgb_0010000.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2012-06-01 14:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_ge_rgb_0010000.tif.aux.xml') ############################################################################### # Check read OrbView metadata format def test_tiff_read_md4(): try: os.remove('data/md_ov.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_ov.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2013-07-01 15:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_ov.tif.aux.xml') ############################################################################### # Check read Resurs-DK1 metadata format def test_tiff_read_md5(): try: os.remove('data/md_rdk1.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_rdk1.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 2, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 5, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2014-08-01 16:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_rdk1.tif.aux.xml') ############################################################################### # Check read Landsat metadata format def test_tiff_read_md6(): try: os.remove('data/md_ls_b1.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_ls_b1.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 2, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 5, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2015-09-01 17:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_ls_b1.tif.aux.xml') ############################################################################### # Check read Spot metadata format def test_tiff_read_md7(): try: os.remove('data/spot/md_spot.tif.aux.xml') except OSError: pass ds = gdal.Open('data/spot/md_spot.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 2, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 5, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2001-03-01 00:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/spot/md_spot.tif.aux.xml') ############################################################################### # Check read RapidEye metadata format def test_tiff_read_md8(): try: os.remove('data/md_re.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_re.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 2, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 5, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2010-02-01 12:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_re.tif.aux.xml') ############################################################################### # Check read Alos metadata format def test_tiff_read_md9(): try: os.remove('data/alos/IMG-md_alos.tif.aux.xml') except OSError: pass ds = gdal.Open('data/alos/IMG-md_alos.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, 'did not get expected metadata list.' md = ds.GetMetadata('IMAGERY') assert 'SATELLITEID' in md, 'SATELLITEID not present in IMAGERY Domain' assert 'ACQUISITIONDATETIME' in md, \ 'ACQUISITIONDATETIME not present in IMAGERY Domain' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2010-07-01 00:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/alos/IMG-md_alos.tif.aux.xml') ############################################################################### # Check read Eros metadata format def test_tiff_read_md10(): try: os.remove('data/md_eros.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_eros.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2013-04-01 11:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_eros.tif.aux.xml') ############################################################################### # Check read Kompsat metadata format def test_tiff_read_md11(): try: os.remove('data/md_kompsat.tif.aux.xml') except OSError: pass ds = gdal.Open('data/md_kompsat.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2007-05-01 07:00:00', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' ds = None assert not os.path.exists('data/md_kompsat.tif.aux.xml') ############################################################################### # Check read Dimap metadata format def test_tiff_read_md12(): ds = gdal.Open('../gdrivers/data/dimap2/IMG_foo_R2C1.TIF', gdal.GA_ReadOnly) filelist = ds.GetFileList() assert len(filelist) == 3, 'did not get expected file list.' metadata = ds.GetMetadataDomainList() assert len(metadata) == 6, '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' # Test UTC date assert md['ACQUISITIONDATETIME'] == '2016-06-17 12:34:56', \ 'bad value for IMAGERY[ACQUISITIONDATETIME]' # Test RPC and that we have a LINE_OFF shift rpc = ds.GetMetadata('RPC') assert rpc['LINE_OFF'] == '-11', 'RPC wrong.' ds = None assert not os.path.exists('data/md_kompsat.tif.aux.xml') # Test not valid DIMAP product [https://github.com/OSGeo/gdal/issues/431] shutil.copy('../gdrivers/data/dimap2/IMG_foo_R2C1.TIF', 'tmp/IMG_foo_temp.TIF') shutil.copy('../gdrivers/data/dimap2/DIM_foo.XML', 'tmp/DIM_foo.XML') shutil.copy('../gdrivers/data/dimap2/RPC_foo.XML', 'tmp/RPC_foo.XML') ds = gdal.Open('tmp/IMG_foo_temp.TIF', gdal.GA_ReadOnly) filelist = ds.GetFileList() ds = None gdal.Unlink('tmp/IMG_foo_temp.TIF') gdal.Unlink('tmp/DIM_foo.XML') gdal.Unlink('tmp/RPC_foo.XML') assert len(filelist) <= 1, 'did not get expected file list.' ############################################################################### # Test reading a TIFFTAG_GDAL_NODATA with empty text def test_tiff_read_empty_nodata_tag(): ds = gdal.Open('data/empty_nodata.tif') assert ds.GetRasterBand(1).GetNoDataValue() is None ############################################################################### # Check that no auxiliary files are read with a simple Open(), reading # imagery and getting IMAGE_STRUCTURE metadata def test_tiff_read_strace_check(): if not sys.platform.startswith('linux'): pytest.skip() python_exe = sys.executable cmd = "strace -f %s -c \"from osgeo import gdal; " % python_exe + ( "gdal.SetConfigOption('CPL_DEBUG', 'OFF');" "ds = gdal.Open('../gcore/data/byte.tif');" "ds.ReadRaster();" "ds.GetMetadata('IMAGE_STRUCTURE');" "ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE');" " \" ") try: (_, err) = gdaltest.runexternal_out_and_err(cmd) except: # strace not available pytest.skip() lines_with_dotdot_gcore = [] for line in err.split('\n'): if '../gcore' in line: lines_with_dotdot_gcore += [line] assert len(lines_with_dotdot_gcore) == 1 ############################################################################### # Test GDAL_READDIR_LIMIT_ON_OPEN def test_tiff_read_readdir_limit_on_open(): gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', '1') ds = gdal.Open('data/md_kompsat.tif', gdal.GA_ReadOnly) filelist = ds.GetFileList() gdal.SetConfigOption('GDAL_READDIR_LIMIT_ON_OPEN', None) assert len(filelist) == 3, 'did not get expected file list.' ############################################################################### # def test_tiff_read_minisblack_as_rgba(): if not gdaltest.supports_force_rgba: pytest.skip() gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/byte.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [4672, 4672, 4672, 4873] ds = None ############################################################################### # def test_tiff_read_colortable_as_rgba(): if not gdaltest.supports_force_rgba: pytest.skip() gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/test_average_palette.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [2433, 2433, 2433, 4873] ds = None ############################################################################### # def test_tiff_read_logl_as_rgba(): if not gdaltest.supports_force_rgba: pytest.skip() gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('data/uint16_sgilog.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] # I'm pretty sure this isn't the expected result... assert got_cs == [0, 0, 0, 4873] ds = None ############################################################################### # def test_tiff_read_strip_separate_as_rgba(): if not gdaltest.supports_force_rgba: pytest.skip() # 3 band gdal.Translate('/vsimem/tiff_read_strip_separate_as_rgba.tif', 'data/rgbsmall.tif', options='-co INTERLEAVE=BAND') gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('/vsimem/tiff_read_strip_separate_as_rgba.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [21212, 21053, 21349, 30658] ds = None gdal.Unlink('/vsimem/tiff_read_strip_separate_as_rgba.tif') # 3 band with PHOTOMETRIC_MINISBLACK to trigger gtStripSeparate() to # use the single band code path gdal.Translate('/vsimem/tiff_read_strip_separate_as_rgba.tif', 'data/rgbsmall.tif', options='-co INTERLEAVE=BAND -co PHOTOMETRIC=MINISBLACK') gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('/vsimem/tiff_read_strip_separate_as_rgba.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [21212, 21212, 21212, 30658] ds = None gdal.Unlink('/vsimem/tiff_read_strip_separate_as_rgba.tif') ############################################################################### # def test_tiff_read_tiled_separate_as_rgba(): if not gdaltest.supports_force_rgba: pytest.skip() # 3 band gdal.Translate('/vsimem/tiff_read_tiled_separate_as_rgba.tif', 'data/rgbsmall.tif', options='-co TILED=YES -co INTERLEAVE=BAND') gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('/vsimem/tiff_read_tiled_separate_as_rgba.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [21212, 21053, 21349, 30658] ds = None gdal.Unlink('/vsimem/tiff_read_tiled_separate_as_rgba.tif') # Single band gdal.Translate('/vsimem/tiff_read_tiled_separate_as_rgba.tif', 'data/byte.tif', options='-co TILED=YES -co INTERLEAVE=BAND') gdal.SetConfigOption('GTIFF_FORCE_RGBA', 'YES') ds = gdal.Open('/vsimem/tiff_read_tiled_separate_as_rgba.tif') gdal.SetConfigOption('GTIFF_FORCE_RGBA', None) got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(ds.RasterCount)] assert got_cs == [4672, 4672, 4672, 4873] ds = None gdal.Unlink('/vsimem/tiff_read_tiled_separate_as_rgba.tif') ############################################################################### # def test_tiff_read_scanline_more_than_2GB(): with gdaltest.error_handler(): ds = gdal.Open('data/scanline_more_than_2GB.tif') if sys.maxsize > 2**32: assert ds is not None else: assert ds is None ############################################################################### # Test that we are at least robust to wrong number of ExtraSamples and warn # about it def test_tiff_read_wrong_number_extrasamples(): gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('data/6band_wrong_number_extrasamples.tif') assert gdal.GetLastErrorMsg().find('Wrong number of ExtraSamples') >= 0 assert ds.GetRasterBand(6).GetRasterColorInterpretation() == gdal.GCI_AlphaBand ############################################################################### # Test that we can read a one-trip TIFF without StripByteCounts tag def test_tiff_read_one_strip_no_bytecount(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/one_strip_nobytecount.tif') gdal.PopErrorHandler() assert ds.GetRasterBand(1).Checksum() == 1 ############################################################################### # Test GDAL_GEOREF_SOURCES def test_tiff_read_nogeoref(): tests = [(None, True, True, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, False, True, True, 'OSGB_1936', (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0)), (None, True, False, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, False, True, False, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), (None, False, False, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('INTERNAL', True, True, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('INTERNAL,PAM', True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('INTERNAL,WORLDFILE', True, True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('INTERNAL,PAM,WORLDFILE', True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('INTERNAL,WORLDFILE,PAM', True, True, True, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM,INTERNAL', False, False, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('PAM,WORLDFILE,INTERNAL', False, False, True, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ('TABFILE,WORLDFILE,INTERNAL', True, True, True, 'OSGB_1936', (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0)), ('PAM', True, True, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('PAM,WORLDFILE', True, True, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('WORLDFILE', True, True, False, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM', True, True, False, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL', True, True, False, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,PAM,INTERNAL', True, True, False, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('WORLDFILE,INTERNAL,PAM', True, True, False, 'LOCAL_CS["PAM"]', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('NONE', True, True, False, '', (0.0, 1.0, 0.0, 0.0, 0.0, 1.0)), ] for (config_option_value, copy_pam, copy_worldfile, copy_tabfile, expected_srs, expected_gt) in tests: for iteration in range(2): gdal.SetConfigOption('GDAL_GEOREF_SOURCES', config_option_value) gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.tif', open('data/byte_nogeoref.tif', 'rb').read()) if copy_pam: gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.tif.aux.xml', open('data/byte_nogeoref.tif.aux.xml', 'rb').read()) if copy_worldfile: gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.tfw', open('data/byte_nogeoref.tfw', 'rb').read()) if copy_tabfile: gdal.FileFromMemBuffer('/vsimem/byte_nogeoref.tab', open('data/byte_nogeoref.tab', 'rb').read()) ds = gdal.Open('/vsimem/byte_nogeoref.tif') if iteration == 0: gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() else: srs_wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None gdal.SetConfigOption('GDAL_GEOREF_SOURCES', None) gdal.Unlink('/vsimem/byte_nogeoref.tif') gdal.Unlink('/vsimem/byte_nogeoref.tif.aux.xml') gdal.Unlink('/vsimem/byte_nogeoref.tfw') gdal.Unlink('/vsimem/byte_nogeoref.tab') if gt != expected_gt: print('Got ' + str(gt)) print('Expected ' + str(expected_gt)) pytest.fail('Iteration %d, did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s,copy_tabfile=%s' % (iteration, config_option_value, str(copy_pam), str(copy_worldfile), str(copy_tabfile))) if (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('Iteration %d, did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s,copy_tabfile=%s' % (iteration, config_option_value, str(copy_pam), str(copy_worldfile), str(copy_tabfile))) ############################################################################### # Test GDAL_GEOREF_SOURCES def test_tiff_read_inconsistent_georef(): tests = [(None, True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, False, True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), (None, False, False, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), (None, False, True, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), (None, False, False, False, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), (None, True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, True, False, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, True, True, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), (None, True, False, False, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('INTERNAL', True, True, True, '26711', (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0)), ('PAM', True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('PAM,TABFILE', True, True, True, 'LOCAL_CS["PAM"]', (1.0, 2.0, 3.0, 4.0, 5.0, 6.0)), ('WORLDFILE', True, True, True, '', (99.5, 1.0, 0.0, 200.5, 0.0, -1.0)), ('TABFILE', True, True, True, 'OSGB_1936', (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0)), ('TABFILE,PAM', True, True, True, 'OSGB_1936', (400000.0, 25.0, 0.0, 1300000.0, 0.0, -25.0)), ] for (config_option_value, copy_pam, copy_worldfile, copy_tabfile, expected_srs, expected_gt) in tests: for iteration in range(2): gdal.SetConfigOption('GDAL_GEOREF_SOURCES', config_option_value) gdal.FileFromMemBuffer('/vsimem/byte_inconsistent_georef.tif', open('data/byte_inconsistent_georef.tif', 'rb').read()) if copy_pam: gdal.FileFromMemBuffer('/vsimem/byte_inconsistent_georef.tif.aux.xml', open('data/byte_inconsistent_georef.tif.aux.xml', 'rb').read()) if copy_worldfile: gdal.FileFromMemBuffer('/vsimem/byte_inconsistent_georef.tfw', open('data/byte_inconsistent_georef.tfw', 'rb').read()) if copy_tabfile: gdal.FileFromMemBuffer('/vsimem/byte_inconsistent_georef.tab', open('data/byte_inconsistent_georef.tab', 'rb').read()) ds = gdal.Open('/vsimem/byte_inconsistent_georef.tif') if iteration == 0: gt = ds.GetGeoTransform() srs_wkt = ds.GetProjectionRef() else: srs_wkt = ds.GetProjectionRef() gt = ds.GetGeoTransform() ds = None gdal.SetConfigOption('GDAL_GEOREF_SOURCES', None) gdal.Unlink('/vsimem/byte_inconsistent_georef.tif') gdal.Unlink('/vsimem/byte_inconsistent_georef.tif.aux.xml') gdal.Unlink('/vsimem/byte_inconsistent_georef.tfw') gdal.Unlink('/vsimem/byte_inconsistent_georef.tab') if gt != expected_gt: print('Got ' + str(gt)) print('Expected ' + str(expected_gt)) pytest.fail('Iteration %d, did not get expected gt for %s,copy_pam=%s,copy_worldfile=%s,copy_tabfile=%s' % (iteration, config_option_value, str(copy_pam), str(copy_worldfile), str(copy_tabfile))) if (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('Iteration %d, did not get expected SRS for %s,copy_pam=%s,copy_worldfile=%s,copy_tabfile=%s' % (iteration, config_option_value, str(copy_pam), str(copy_worldfile), str(copy_tabfile))) ############################################################################### # Test GDAL_GEOREF_SOURCES def test_tiff_read_gcp_internal_and_auxxml(): tests = [(None, True, 'LOCAL_CS["PAM"]', 1), (None, False, '4326', 2), ('INTERNAL', True, '4326', 2), ('INTERNAL', False, '4326', 2), ('INTERNAL,PAM', True, '4326', 2), ('INTERNAL,PAM', False, '4326', 2), ('PAM', True, 'LOCAL_CS["PAM"]', 1), ('PAM', False, '', 0), ('PAM,INTERNAL', True, 'LOCAL_CS["PAM"]', 1), ('PAM,INTERNAL', False, '4326', 2), ] for (config_option_value, copy_pam, expected_srs, expected_gcp_count) in tests: for iteration in range(2): gdal.FileFromMemBuffer('/vsimem/byte_gcp.tif', open('data/byte_gcp.tif', 'rb').read()) if copy_pam: gdal.FileFromMemBuffer('/vsimem/byte_gcp.tif.aux.xml', open('data/byte_gcp.tif.aux.xml', 'rb').read()) open_options = [] if config_option_value is not None: open_options += ['GEOREF_SOURCES=' + config_option_value] ds = gdal.OpenEx('/vsimem/byte_gcp.tif', open_options=open_options) if iteration == 0: gcp_count = ds.GetGCPCount() srs_wkt = ds.GetGCPProjection() else: srs_wkt = ds.GetGCPProjection() gcp_count = ds.GetGCPCount() ds = None gdal.Unlink('/vsimem/byte_gcp.tif') gdal.Unlink('/vsimem/byte_gcp.tif.aux.xml') if gcp_count != expected_gcp_count: print('Got ' + str(gcp_count)) print('Expected ' + str(expected_gcp_count)) pytest.fail('Iteration %d, did not get expected gcp count for %s,copy_pam=%s' % (iteration, config_option_value, str(copy_pam))) if (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('Iteration %d, did not get expected SRS for %s,copy_pam=%s' % (iteration, config_option_value, str(copy_pam))) ############################################################################### # Test reading .tif + .aux class myHandlerClass(object): def __init__(self): self.msg = None def handler(self, eErrClass, err_no, msg): # pylint: disable=unused-argument if 'File open of' in msg: self.msg = msg def test_tiff_read_aux(): gdal.ErrorReset() ds = gdal.Open('data/f2r23.tif') handler = myHandlerClass() gdal.PushErrorHandler(handler.handler) ds.GetFileList() gdal.PopErrorHandler() assert handler.msg is None, \ ('Got message that indicate recursive calls: %s' % handler.msg) def test_tiff_read_one_band_from_two_bands(): gdal.Translate('/vsimem/tiff_read_one_band_from_two_bands.tif', 'data/byte.tif', options='-b 1 -b 1') gdal.Translate('/vsimem/tiff_read_one_band_from_two_bands_dst.tif', '/vsimem/tiff_read_one_band_from_two_bands.tif', options='-b 1') ds = gdal.Open('/vsimem/tiff_read_one_band_from_two_bands_dst.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None gdal.Unlink('/vsimem/tiff_read_one_band_from_two_bands.tif') gdal.Unlink('/vsimem/tiff_read_one_band_from_two_bands.tif.aux.xml') gdal.Unlink('/vsimem/tiff_read_one_band_from_two_bands_dst.tif') def test_tiff_read_jpeg_cloud_optimized(): for i in range(4): ds = gdal.Open('data/byte_ovr_jpeg_tablesmode%d.tif' % i) cs0 = ds.GetRasterBand(1).Checksum() cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs0 == 4743 and cs1 == 1133, i ds = None # This one was generated with a buggy code that emit JpegTables with mode == 1 # when creating the overview directory but failed to properly set this mode while # writing the imagery. libjpeg-6b emits a 'JPEGLib:Huffman table 0x00 was not defined' # error while jpeg-8 works fine def test_tiff_read_corrupted_jpeg_cloud_optimized(): ds = gdal.Open('data/byte_ovr_jpeg_tablesmode_not_correctly_set_on_ovr.tif') cs0 = ds.GetRasterBand(1).Checksum() assert cs0 == 4743 with gdaltest.error_handler(): cs1 = ds.GetRasterBand(1).GetOverview(0).Checksum() if cs1 == 0: print('Expected error while writing overview with libjpeg-6b') elif cs1 != 1133: pytest.fail(cs1) ############################################################################### # Test reading YCbCr images with LZW compression def test_tiff_read_ycbcr_lzw(): tests = [('ycbcr_11_lzw.tif', 13459, 12939, 12414), ('ycbcr_12_lzw.tif', 13565, 13105, 12660), ('ycbcr_14_lzw.tif', 0, 0, 0), # not supported ('ycbcr_21_lzw.tif', 13587, 13297, 12760), ('ycbcr_22_lzw.tif', 13393, 13137, 12656), ('ycbcr_24_lzw.tif', 0, 0, 0), # not supported ('ycbcr_41_lzw.tif', 13218, 12758, 12592), ('ycbcr_42_lzw.tif', 13277, 12779, 12614), ('ycbcr_42_lzw_optimized.tif', 19918, 20120, 19087), ('ycbcr_44_lzw.tif', 12994, 13229, 12149), ('ycbcr_44_lzw_optimized.tif', 19666, 19860, 18836)] for (filename, cs1, cs2, cs3) in tests: ds = gdal.Open('data/' + filename) if cs1 == 0: gdal.PushErrorHandler() got_cs1 = ds.GetRasterBand(1).Checksum() got_cs2 = ds.GetRasterBand(2).Checksum() got_cs3 = ds.GetRasterBand(3).Checksum() if cs1 == 0: gdal.PopErrorHandler() assert got_cs1 == cs1 and got_cs2 == cs2 and got_cs3 == cs3, \ (filename, got_cs1, got_cs2, got_cs3) ############################################################################### # Test reading YCbCr images with nbits > 8 def test_tiff_read_ycbcr_int12(): with gdaltest.error_handler(): ds = gdal.Open('data/int12_ycbcr_contig.tif') assert ds is None assert gdal.GetLastErrorMsg().find('Cannot open TIFF file with') >= 0 ############################################################################### # Test reading band unit from VERT_CS unit (#6675) def test_tiff_read_unit_from_srs(): filename = '/vsimem/tiff_read_unit_from_srs.tif' ds = gdal.GetDriverByName('GTiff').Create(filename, 1, 1) sr = osr.SpatialReference() sr.SetFromUserInput('EPSG:4326+3855') ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open(filename) unit = ds.GetRasterBand(1).GetUnitType() assert unit == 'metre' ds = None gdal.Unlink(filename) ############################################################################### # Test reading ArcGIS 9.3 .aux.xml def test_tiff_read_arcgis93_geodataxform_gcp(): ds = gdal.Open('data/arcgis93_geodataxform_gcp.tif') assert ds.GetGCPProjection().find('26712') >= 0 assert ds.GetGCPCount() == 16 gcp = ds.GetGCPs()[0] assert (abs(gcp.GCPPixel - 565) <= 1e-5 and \ abs(gcp.GCPLine - 11041) <= 1e-5 and \ abs(gcp.GCPX - 500000) <= 1e-5 and \ abs(gcp.GCPY - 4705078.79016612) <= 1e-5 and \ abs(gcp.GCPZ - 0) <= 1e-5) ############################################################################### # Test reading file with block size > signed int 32 bit def test_tiff_read_block_width_above_32bit(): with gdaltest.error_handler(): ds = gdal.Open('data/block_width_above_32bit.tif') assert ds is None ############################################################################### # Test reading file with image size > signed int 32 bit def test_tiff_read_image_width_above_32bit(): with gdaltest.error_handler(): ds = gdal.Open('data/image_width_above_32bit.tif') assert ds is None ############################################################################### # Test reading file with image size > signed int 32 bit def test_tiff_read_second_image_width_above_32bit(): ds = gdal.Open('data/second_image_width_above_32bit.tif') with gdaltest.error_handler(): assert ds.GetMetadata("SUBDATASETS") == {} with gdaltest.error_handler(): ds = gdal.Open('GTIFF_DIR:2:data/second_image_width_above_32bit.tif') assert ds is None ############################################################################### # Test reading file with minimal number of warnings without warning def test_tiff_read_minimum_tiff_tags_no_warning(): gdal.ErrorReset() ds = gdal.Open('data/minimum_tiff_tags_no_warning.tif') assert gdal.GetLastErrorMsg() == '' ds.GetRasterBand(1).Checksum() assert gdal.GetLastErrorMsg() == '' ############################################################################### # Test reading file with minimal number of warnings but warning def test_tiff_read_minimum_tiff_tags_with_warning(): gdal.ErrorReset() with gdaltest.error_handler(): ds = gdal.Open('data/minimum_tiff_tags_with_warning.tif') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() ds.GetRasterBand(1).Checksum() assert gdal.GetLastErrorMsg() == '' ############################################################################### def check_libtiff_internal_or_at_least(expected_maj, expected_min, expected_micro): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['LIBTIFF'] == 'INTERNAL': return True if md['LIBTIFF'].startswith('LIBTIFF, Version '): version = md['LIBTIFF'][len('LIBTIFF, Version '):] version = version[0:version.find('\n')] got_maj, got_min, got_micro = version.split('.') got_maj = int(got_maj) got_min = int(got_min) got_micro = int(got_micro) if got_maj > expected_maj: return True if got_maj < expected_maj: return False if got_min > expected_min: return True if got_min < expected_min: return False return got_micro >= expected_micro return False ############################################################################### def test_tiff_read_unknown_compression(): with gdaltest.error_handler(): ds = gdal.Open('data/unknown_compression.tif') assert ds is None ############################################################################### def test_tiff_read_leak_ZIPSetupDecode(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/leak-ZIPSetupDecode.tif') for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Checksum() ############################################################################### def test_tiff_read_excessive_memory_TIFFFillStrip(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/excessive-memory-TIFFFillStrip.tif') for i in range(ds.RasterCount): ds.GetRasterBand(i + 1).Checksum() ############################################################################### def test_tiff_read_excessive_memory_TIFFFillStrip2(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/excessive-memory-TIFFFillStrip2.tif') ds.GetRasterBand(1).Checksum() ############################################################################### def test_tiff_read_excessive_memory_TIFFFillTile(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/excessive-memory-TIFFFillTile.tif') ds.GetRasterBand(1).Checksum() ############################################################################### def test_tiff_read_big_strip(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() gdal.Translate('/vsimem/test.tif', 'data/byte.tif', options='-co compress=lzw -outsize 10000 2000 -co blockysize=2000 -r bilinear -ot float32') if gdal.GetLastErrorMsg().find('cannot allocate') >= 0: pytest.skip() ds = gdal.Open('/vsimem/test.tif') assert ds.GetRasterBand(1).Checksum() == 2676 ds = None gdal.Unlink('/vsimem/test.tif') ############################################################################### # (Potentially) test libtiff CHUNKY_STRIP_READ_SUPPORT def test_tiff_read_big_strip_chunky_way(): gdal.Translate('/vsimem/test.tif', 'data/byte.tif', options='-co compress=lzw -outsize 1000 2001 -co blockysize=2001 -r bilinear') ds = gdal.Open('/vsimem/test.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 38337 ds = None gdal.Unlink('/vsimem/test.tif') ############################################################################### def test_tiff_read_big_tile(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() gdal.Translate('/vsimem/test.tif', 'data/byte.tif', options='-co compress=lzw -outsize 10000 2000 -co tiled=yes -co blockxsize=10000 -co blockysize=2000 -r bilinear -ot float32') if gdal.GetLastErrorMsg().find('cannot allocate') >= 0: pytest.skip() ds = gdal.Open('/vsimem/test.tif') assert ds.GetRasterBand(1).Checksum() == 2676 ds = None gdal.Unlink('/vsimem/test.tif') ############################################################################### def test_tiff_read_huge_tile(): with gdaltest.error_handler(): ds = gdal.Open('data/hugeblocksize.tif') assert ds is None ############################################################################### def test_tiff_read_huge_number_strips(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['LIBTIFF'] != 'INTERNAL': pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/huge-number-strips.tif') ds.GetRasterBand(1).Checksum() ############################################################################### def test_tiff_read_huge_implied_number_strips(): if not check_libtiff_internal_or_at_least(4, 0, 10): pytest.skip() with gdaltest.error_handler(): gdal.Open('data/huge-implied-number-strips.tif') ############################################################################### def test_tiff_read_many_blocks(): # Runs super slow on some Windows configs if sys.platform == 'win32': pytest.skip() md = gdal.GetDriverByName('GTiff').GetMetadata() if md['LIBTIFF'] != 'INTERNAL': pytest.skip() ds = gdal.GetDriverByName('GTiff').Create('/vsimem/test.tif', 1, 2000000, options=['BLOCKYSIZE=1']) ds = None ds = gdal.Open('/vsimem/test.tif') assert ds.GetRasterBand(1).Checksum() == 0 ds = None gdal.Unlink('/vsimem/test.tif') ############################################################################### def test_tiff_read_many_blocks_truncated(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['LIBTIFF'] != 'INTERNAL': pytest.skip() ds = gdal.Open('data/many_blocks_truncated.tif') with gdaltest.error_handler(): ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_2000000', 'TIFF') assert gdal.GetLastErrorMsg() == 'File too short' ############################################################################### # Test reading images with nbits > 32 def test_tiff_read_uint33(): with gdaltest.error_handler(): ds = gdal.Open('data/uint33.tif') assert ds is None assert gdal.GetLastErrorMsg().find('Unsupported TIFF configuration') >= 0 ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1545 def test_tiff_read_corrupted_deflate_singlestrip(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/corrupted_deflate_singlestrip.tif') ds.GetRasterBand(1).Checksum() ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1563 def test_tiff_read_packbits_not_enough_data(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() with gdaltest.error_handler(): ds = gdal.Open('data/packbits-not-enough-data.tif') ds.GetRasterBand(1).Checksum() ############################################################################### # Test reading images with more than 2billion blocks for a single band def test_tiff_read_toomanyblocks(): with gdaltest.error_handler(): ds = gdal.Open('data/toomanyblocks.tif') assert ds is None ############################################################################### # Test reading images with more than 2billion blocks for all bands def test_tiff_read_toomanyblocks_separate(): with gdaltest.error_handler(): ds = gdal.Open('data/toomanyblocks_separate.tif') assert ds is None ############################################################################### # Test reading images where the number of items in StripByteCounts/StripOffsets # tag is lesser than the number of strips def test_tiff_read_size_of_stripbytecount_lower_than_stripcount(): ds = gdal.Open('data/size_of_stripbytecount_lower_than_stripcount.tif') # There are 3 strips but StripByteCounts has just two elements; assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_1', 'TIFF') == '171' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_1', 'TIFF') == '1' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_2', 'TIFF') is None assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_2', 'TIFF') is None ds = gdal.Open('data/size_of_stripbytecount_at_1_and_lower_than_stripcount.tif') # There are 3 strips but StripByteCounts has just one element; assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_0', 'TIFF') == '1' ############################################################################### # Test different datatypes for StripOffsets tag with little/big, classic/bigtiff def test_tiff_read_stripoffset_types(): tests = [ ('data/classictiff_one_block_byte.tif', []), # unsupported ('data/classictiff_one_block_long.tif', [158]), ('data/classictiff_one_block_be_long.tif', [158]), ('data/classictiff_one_strip_long.tif', [146]), ('data/classictiff_one_strip_be_long.tif', [146]), ('data/classictiff_two_strip_short.tif', [162, 163]), ('data/classictiff_two_strip_be_short.tif', [162, 163]), ('data/classictiff_four_strip_short.tif', [178, 179, 180, 181]), ('data/classictiff_four_strip_be_short.tif', [178, 179, 180, 181]), ('data/bigtiff_four_strip_short.tif', [316, 317, 318, 319]), ('data/bigtiff_four_strip_be_short.tif', [316, 317, 318, 319]), ('data/bigtiff_one_block_long8.tif', [272]), ('data/bigtiff_one_block_be_long8.tif', [272]), ('data/bigtiff_one_strip_long.tif', [252]), ('data/bigtiff_one_strip_be_long.tif', [252]), ('data/bigtiff_one_strip_long8.tif', [252]), ('data/bigtiff_one_strip_be_long8.tif', [252]), ('data/bigtiff_two_strip_long.tif', [284, 285]), ('data/bigtiff_two_strip_be_long.tif', [284, 285]), ('data/bigtiff_two_strip_long8.tif', [284, 285]), ('data/bigtiff_two_strip_be_long8.tif', [284, 285]), ] for (filename, expected_offsets) in tests: # Only when built against internal libtiff we reject byte datatype if not expected_offsets and \ gdal.GetDriverByName('GTiff').GetMetadataItem('LIBTIFF') != 'INTERNAL': continue ds = gdal.Open(filename) offsets = [] for row in range(4): with gdaltest.error_handler(): mdi = ds.GetRasterBand(1).GetMetadataItem( 'BLOCK_OFFSET_0_%d' % row, 'TIFF') if mdi is None: break offsets.append(int(mdi)) if offsets != expected_offsets: print(filename, expected_offsets, offsets) ############################################################################### # Test reading a JPEG-in-TIFF file that contains the 2 denial of service # vulnerabilities listed in # http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf def test_tiff_read_progressive_jpeg_denial_of_service(): if not check_libtiff_internal_or_at_least(4, 0, 9): pytest.skip() # Should error out with 'JPEGPreDecode:Reading this strip would require # libjpeg to allocate at least...' gdal.ErrorReset() ds = gdal.Open('/vsizip/data/eofloop_valid_huff.tif.zip') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 0 and gdal.GetLastErrorMsg() != '' # Should error out with 'TIFFjpeg_progress_monitor:Scan number... gdal.ErrorReset() ds = gdal.Open('/vsizip/data/eofloop_valid_huff.tif.zip') with gdaltest.error_handler(): os.environ['LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC'] = 'YES' os.environ['LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER'] = '10' cs = ds.GetRasterBand(1).Checksum() del os.environ['LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC'] del os.environ['LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER'] assert gdal.GetLastErrorMsg() != '' ############################################################################### # Test reading old-style LZW def test_tiff_read_old_style_lzw(): if not check_libtiff_internal_or_at_least(4, 0, 8): pytest.skip() ds = gdal.Open('data/quad-lzw-old-style.tif') # Shut down warning about old style LZW with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 34282 ############################################################################### # Test libtiff mmap interface (actually not using mmap, but our /vsimem # mmap emulation) def test_tiff_read_mmap_interface(): src_ds = gdal.Open('data/byte.tif') tmpfile = '/vsimem/tiff_read_mmap_interface.tif' for options in [[], ['TILED=YES'], ['COMPRESS=LZW'], ['COMPRESS=LZW', 'TILED=YES']]: gdal.GetDriverByName('GTiff').CreateCopy(tmpfile, src_ds, options=options) gdal.SetConfigOption('GTIFF_USE_MMAP', 'YES') ds = gdal.Open(tmpfile) cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GTIFF_USE_MMAP', None) assert cs == 4672, (options, cs) f = gdal.VSIFOpenL(tmpfile, "rb") data = gdal.VSIFReadL(1, gdal.VSIStatL(tmpfile).size - 1, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(tmpfile, "wb") gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.SetConfigOption('GTIFF_USE_MMAP', 'YES') with gdaltest.error_handler(): ds = gdal.Open(tmpfile) cs = ds.GetRasterBand(1).Checksum() gdal.SetConfigOption('GTIFF_USE_MMAP', None) assert cs == 0, (options, cs) gdal.Unlink(tmpfile) gdal.Unlink(tmpfile) ############################################################################### # Test reading JPEG compressed file whole last strip height is the full # strip height, instead of just the number of lines needed to reach the # image height. def test_tiff_read_jpeg_too_big_last_stripe(): if not check_libtiff_internal_or_at_least(4, 0, 9): pytest.skip() ds = gdal.Open('data/tif_jpeg_too_big_last_stripe.tif') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 4557 ds = gdal.Open('data/tif_jpeg_ycbcr_too_big_last_stripe.tif') with gdaltest.error_handler(): cs = ds.GetRasterBand(1).Checksum() assert cs == 4557 ############################################################################### # Test reading GeoTIFF file with negative ScaleY in GeoPixelScale tag def test_tiff_read_negative_scaley(): ds = gdal.Open('data/negative_scaley.tif') with gdaltest.error_handler(): assert ds.GetGeoTransform()[5] == -60 ds = gdal.Open('data/negative_scaley.tif') with gdaltest.config_option('GTIFF_HONOUR_NEGATIVE_SCALEY', 'NO'): assert ds.GetGeoTransform()[5] == -60 ds = gdal.Open('data/negative_scaley.tif') with gdaltest.config_option('GTIFF_HONOUR_NEGATIVE_SCALEY', 'YES'): assert ds.GetGeoTransform()[5] == 60 ############################################################################### # Test ZSTD compression def test_tiff_read_zstd(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte_zstd.tif', 1, 4672) return ut.testOpen() ############################################################################### # Test ZSTD compression def test_tiff_read_zstd_corrupted(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte_zstd_corrupted.tif', 1, 0) with gdaltest.error_handler(): return ut.testOpen() ############################################################################### # Test ZSTD compression def test_tiff_read_zstd_corrupted2(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('ZSTD') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte_zstd_corrupted2.tif', 1, 0) with gdaltest.error_handler(): return ut.testOpen() ############################################################################### # Test WEBP compression def test_tiff_read_webp(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: pytest.skip() stats = (0, 215, 66.38, 47.186) ut = gdaltest.GDALTest('GTiff', 'tif_webp.tif', 1, None) success = ut.testOpen(check_approx_stat=stats, stat_epsilon=1) gdal.Unlink('data/tif_webp.tif.aux.xml') return success ############################################################################### # Test WEBP compression def test_tiff_read_webp_huge_single_strip(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('WEBP') == -1: pytest.skip() ds = gdal.Open('data/tif_webp_huge_single_strip.tif') assert ds.GetRasterBand(1).Checksum() != 0 ############################################################################### def test_tiff_read_1bit_2bands(): ds = gdal.Open('data/1bit_2bands.tif') cs = (ds.GetRasterBand(1).Checksum(), ds.GetRasterBand(2).Checksum()) assert cs == (200, 824) ############################################################################### # Test LERC compression def test_tiff_read_lerc(): md = gdal.GetDriverByName('GTiff').GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('LERC') == -1: pytest.skip() ut = gdaltest.GDALTest('GTiff', 'byte_lerc.tif', 1, 4672) return ut.testOpen() ############################################################################### def test_tiff_read_overview_of_external_mask(): filename = '/vsimem/tiff_read_overview_of_external_mask.tif' gdal.Translate(filename, 'data/byte.tif', options='-b 1 -mask 1') ds = gdal.Open(filename, gdal.GA_Update) ds.BuildOverviews('CUBIC', overviewlist=[2]) ds = None ds = gdal.Open(filename + '.msk', gdal.GA_Update) ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None ds = gdal.Open(filename) cs1 = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum() cs2 = ds.GetRasterBand(1).GetMaskBand().GetOverview(0).Checksum() flags1 = ds.GetRasterBand(1).GetOverview(0).GetMaskFlags() ds = None gdal.Unlink(filename) gdal.Unlink(filename + '.msk') assert cs1 == cs2 assert flags1 == gdal.GMF_PER_DATASET ############################################################################### # Test reading GeoTIFF file ModelTiepointTag(z) != 0 and ModelPixelScaleTag(z) = 0 # Test https://issues.qgis.org/issues/20493 def test_tiff_read_ModelTiepointTag_z_non_zero_but_ModelPixelScaleTag_z_zero(): ds = gdal.Open('data/ModelTiepointTag_z_non_zero_but_ModelPixelScaleTag_z_zero.tif') assert ds.GetRasterBand(1).GetScale() == 1 assert ds.GetRasterBand(1).GetOffset() == 0 ############################################################################### # Test strip chopping on uncompressed fies with strips larger than 2 GB def test_tiff_read_strip_larger_than_2GB(): if not check_libtiff_internal_or_at_least(4, 0, 11): pytest.skip() ds = gdal.Open('data/strip_larger_than_2GB_header.tif') assert ds assert ds.GetRasterBand(1).GetBlockSize() == [50000, 10737] assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_0', 'TIFF') == '264' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_0', 'TIFF') == '536850000' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_1', 'TIFF') == '536850264' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_1', 'TIFF') == '536850000' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_OFFSET_0_5', 'TIFF') == '2684250264' assert ds.GetRasterBand(1).GetMetadataItem('BLOCK_SIZE_0_5', 'TIFF') == '65750000' ############################################################################### # Test reading a deflate compressed file with a uncompressed strip larger than 4 GB def test_tiff_read_deflate_4GB(): if not check_libtiff_internal_or_at_least(4, 0, 11): pytest.skip() ds = gdal.Open('/vsizip/data/test_deflate_4GB.tif.zip/test_deflate_4GB.tif') if sys.maxsize < 2**32: assert ds is None return assert ds is not None if not gdaltest.run_slow_tests(): pytest.skip() data = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buf_xsize = 20, buf_ysize = 20) ref_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) ref_ds.GetRasterBand(1).Fill(127) assert data == ref_ds.ReadRaster() ############################################################################### # Check that GetMetadataDomainList() works properly def test_tiff_GetMetadataDomainList(): ds = gdal.Open('data/byte.tif') mdd1_set = set([x for x in ds.GetMetadataDomainList()]) assert mdd1_set == set(['', 'DERIVED_SUBDATASETS', 'IMAGE_STRUCTURE']) mdd2_set = set([x for x in ds.GetMetadataDomainList()]) assert mdd1_set == mdd2_set gdalautotest-3.0.4/gcore/bmp_read.py0000755003401500001440000000471213614005322017055 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: bmp_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from a BMP file. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # Copyright (c) 2008-2009, Even Rouault # # 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. ############################################################################### import pytest import gdaltest init_list = [ ('1bit.bmp', 200), ('4bit_pal.bmp', 2587), ('8bit_pal.bmp', 4672), ('byte_rle8.bmp', 4672)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('BMP') def test_bmp_open(filename, checksum): ut = gdaltest.GDALTest('BMP', filename, 1, checksum) ut.testOpen() def test_bmp_online_1(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/bmp/8bit_pal_rle.bmp', '8bit_pal_rle.bmp'): pytest.skip() tst = gdaltest.GDALTest('BMP', 'tmp/cache/8bit_pal_rle.bmp', 1, 17270, filename_absolute=1) return tst.testOpen() def test_bmp_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/bmp/24bit.bmp', '24bit.bmp'): pytest.skip() tst = gdaltest.GDALTest('BMP', 'tmp/cache/24bit.bmp', 1, 7158, filename_absolute=1) if tst == 'success': tst = gdaltest.GDALTest('BMP', 'tmp/cache/24bit.bmp', 3, 27670, filename_absolute=1) return tst.testOpen() gdalautotest-3.0.4/gcore/overviewds.py0000755003401500001440000002216013614005322017476 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: overviewds.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDALOverviewDataset # 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 shutil from osgeo import gdal import pytest ############################################################################### # Error cases def test_overviewds_1(): ds = gdal.OpenEx('data/byte.tif', open_options=['OVERVIEW_LEVEL=-1']) assert ds is None ds = gdal.OpenEx('data/byte.tif', open_options=['OVERVIEW_LEVEL=0']) assert ds is None ############################################################################### # Nominal cases def test_overviewds_2(): shutil.copy('data/byte.tif', 'tmp') ds = gdal.Open('tmp/byte.tif') ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0only']) assert ds.GetRasterBand(1).GetOverviewCount() == 0 ds = None src_ds = gdal.Open('tmp/byte.tif') ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) assert ds is not None assert ds.RasterXSize == 10 and ds.RasterYSize == 10 and ds.RasterCount == 1 assert ds.GetProjectionRef() == src_ds.GetProjectionRef() src_gt = src_ds.GetGeoTransform() expected_gt = (src_gt[0], src_gt[1] * 2, src_gt[2], src_gt[3], src_gt[4], src_gt[5] * 2) gt = ds.GetGeoTransform() for i in range(6): assert abs(expected_gt[i] - gt[i]) <= 1e-5 assert ds.GetGCPCount() == 0 and ds.GetGCPProjection() == src_ds.GetGCPProjection() and not ds.GetGCPs() expected_data = src_ds.ReadRaster(0, 0, 20, 20, 10, 10) got_data = ds.ReadRaster(0, 0, 10, 10) assert expected_data == got_data got_data = ds.GetRasterBand(1).ReadRaster(0, 0, 10, 10) assert expected_data == got_data assert ds.GetRasterBand(1).GetOverviewCount() == 1 expected_data = src_ds.ReadRaster(0, 0, 20, 20, 5, 5) got_data = ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 0, 5, 5) assert expected_data == got_data assert ds.GetMetadata() == src_ds.GetMetadata() assert ds.GetMetadataItem('AREA_OR_POINT') == src_ds.GetMetadataItem('AREA_OR_POINT') assert not ds.GetMetadata('RPC') assert not ds.GetMetadata('GEOLOCATION') assert ds.GetMetadataItem('RPC', 'FOO') is None ds = None ############################################################################### # Test GCP def test_overviewds_3(): src_ds = gdal.Open('data/byte.tif') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/byte.tif', src_ds) 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) ds.SetGCPs(src_gcps, src_ds.GetProjectionRef()) tr = gdal.Transformer(ds, None, ['METHOD=GCP_POLYNOMIAL']) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) gcps = ds.GetGCPs() for i in range(3): assert (gcps[i].GCPPixel == src_gcps[i].GCPPixel / 2 and gcps[i].GCPLine == src_gcps[i].GCPLine / 2 and \ gcps[i].GCPX == src_gcps[i].GCPX and gcps[i].GCPY == src_gcps[i].GCPY) # Really check that the transformer works tr = gdal.Transformer(ds, None, ['METHOD=GCP_POLYNOMIAL']) (_, pnt) = tr.TransformPoint(0, 20 / 2.0, 10 / 2.0) for i in range(3): assert abs(ref_pnt[i] - pnt[i]) <= 1e-5 ds = None ############################################################################### # Test RPC def myfloat(s): p = s.rfind(' ') if p >= 0: s = s[0:p] return float(s) def test_overviewds_4(): shutil.copy('data/byte.tif', 'tmp/byte.tif') shutil.copy('data/test_rpc.txt', 'tmp/byte_rpc.txt') ds = gdal.Open('tmp/byte.tif') rpc_md = ds.GetMetadata('RPC') tr = gdal.Transformer(ds, None, ['METHOD=RPC']) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) got_md = ds.GetMetadata('RPC') for key in rpc_md: assert ds.GetMetadataItem(key, 'RPC') == got_md[key] if key == 'LINE_SCALE' or key == 'SAMP_SCALE' or key == 'LINE_OFF' or key == 'SAMP_OFF': assert float(got_md[key]) == myfloat(rpc_md[key]) / 2 elif got_md[key] != rpc_md[key]: print(got_md[key]) print(rpc_md[key]) pytest.fail(key) # Really check that the transformer works tr = gdal.Transformer(ds, None, ['METHOD=RPC']) (_, pnt) = tr.TransformPoint(0, 20 / 2.0, 10 / 2.0) for i in range(3): assert abs(ref_pnt[i] - pnt[i]) <= 1e-5 ds = None try: os.remove('tmp/byte_rpc.txt') except OSError: pass ############################################################################### # Test GEOLOCATION def test_overviewds_5(): shutil.copy('data/sstgeo.tif', 'tmp/sstgeo.tif') shutil.copy('data/sstgeo.vrt', 'tmp/sstgeo.vrt') ds = gdal.Open('tmp/sstgeo.vrt') geoloc_md = ds.GetMetadata('GEOLOCATION') tr = gdal.Transformer(ds, None, ['METHOD=GEOLOC_ARRAY']) (_, ref_pnt) = tr.TransformPoint(0, 20, 10) ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None ds = gdal.OpenEx('tmp/sstgeo.vrt', open_options=['OVERVIEW_LEVEL=0']) got_md = ds.GetMetadata('GEOLOCATION') for key in geoloc_md: assert ds.GetMetadataItem(key, 'GEOLOCATION') == got_md[key] if key == 'PIXEL_OFFSET' or key == 'LINE_OFFSET': assert abs(float(got_md[key]) - myfloat(geoloc_md[key]) * 2) <= 1e-1 elif key == 'PIXEL_STEP' or key == 'LINE_STEP': assert abs(float(got_md[key]) - myfloat(geoloc_md[key]) / 2) <= 1e-1 elif got_md[key] != geoloc_md[key]: print(got_md[key]) print(geoloc_md[key]) pytest.fail(key) # Really check that the transformer works tr = gdal.Transformer(ds, None, ['METHOD=GEOLOC_ARRAY']) expected_xyz = (20.0 / 2, 10.0 / 2, 0) (_, pnt) = tr.TransformPoint(1, ref_pnt[0], ref_pnt[1]) for i in range(3): assert abs(pnt[i] - expected_xyz[i]) <= 0.5 ds = None ############################################################################### # Test VRT def test_overviewds_6(): shutil.copy('data/byte.tif', 'tmp') ds = gdal.Open('tmp/byte.tif') ds.BuildOverviews('NEAR', overviewlist=[2, 4]) ds = None src_ds = gdal.OpenEx('tmp/byte.tif', open_options=['OVERVIEW_LEVEL=0']) expected_cs = src_ds.GetRasterBand(1).Checksum() ds = gdal.GetDriverByName('VRT').CreateCopy('tmp/byte.vrt', src_ds) ds = None src_ds = None ds = gdal.Open('tmp/byte.vrt') assert ds.RasterXSize == 10 and ds.RasterYSize == 10 and ds.RasterCount == 1 got_cs = ds.GetRasterBand(1).Checksum() assert got_cs == expected_cs ds = None ############################################################################### # Cleanup def test_overviewds_cleanup(): gdal.GetDriverByName('GTiff').Delete('tmp/byte.tif') try: os.remove('tmp/byte_rpc.txt') except OSError: pass try: os.remove('tmp/sstgeo.tif') os.remove('tmp/sstgeo.vrt') os.remove('tmp/sstgeo.vrt.ovr') except OSError: pass try: os.remove('tmp/byte.vrt') except OSError: pass gdalautotest-3.0.4/gcore/vsiswift.py0000644003401500001440000006010713614005322017157 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsiswift.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsiswift # 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 stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_vsiswift_init(): gdaltest.swift_vars = {} for var in ('SWIFT_STORAGE_URL', 'SWIFT_AUTH_TOKEN', 'SWIFT_AUTH_V1_URL', 'SWIFT_USER', 'SWIFT_KEY'): gdaltest.swift_vars[var] = gdal.GetConfigOption(var) if gdaltest.swift_vars[var] is not None: gdal.SetConfigOption(var, "") ############################################################################### # Error cases def test_vsiswift_real_server_errors(): if not gdaltest.built_against_curl(): pytest.skip() # Nothing set gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiswift/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('SWIFT_STORAGE_URL') >= 0 gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiswift_streaming/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('SWIFT_STORAGE_URL') >= 0 gdal.SetConfigOption('SWIFT_STORAGE_URL', 'http://0.0.0.0') # Missing SWIFT_AUTH_TOKEN gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiswift/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('SWIFT_AUTH_TOKEN') >= 0 gdal.SetConfigOption('SWIFT_AUTH_TOKEN', 'SWIFT_AUTH_TOKEN') gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiswift/foo/bar.baz') if f is not None: if f is not None: gdal.VSIFCloseL(f) pytest.fail(gdal.VSIGetLastErrorMsg()) gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsiswift_streaming/foo/bar.baz') assert f is None, gdal.VSIGetLastErrorMsg() ############################################################################### def test_vsiswift_start_webserver(): 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() ############################################################################### # Test authentication with SWIFT_AUTH_V1_URL + SWIFT_USER + SWIFT_KEY def test_vsiswift_fake_auth_v1_url(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() gdal.SetConfigOption('SWIFT_AUTH_V1_URL', 'http://127.0.0.1:%d/auth/1.0' % gdaltest.webserver_port) gdal.SetConfigOption('SWIFT_USER', 'my_user') gdal.SetConfigOption('SWIFT_KEY', 'my_key') gdal.SetConfigOption('SWIFT_STORAGE_URL', '') gdal.SetConfigOption('SWIFT_AUTH_TOKEN', '') handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'X-Auth-User' not in h or h['X-Auth-User'] != 'my_user' or \ 'X-Auth-Key' not in h or h['X-Auth-Key'] != 'my_key': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-Length', 0) request.send_header('X-Storage-Url', 'http://127.0.0.1:%d/v1/AUTH_something' % gdaltest.webserver_port) request.send_header('X-Auth-Token', 'my_auth_token') request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler.add('GET', '/auth/1.0', custom_method=method) def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'x-auth-token' not in h or \ h['x-auth-token'] != 'my_auth_token': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsiswift/foo/bar') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # authentication is reused def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'x-auth-token' not in h or \ h['x-auth-token'] != 'my_auth_token': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""bar""".encode('ascii')) handler.add('GET', '/v1/AUTH_something/foo/baz', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsiswift/foo/baz') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar' ############################################################################### # Test authentication with SWIFT_STORAGE_URL + SWIFT_AUTH_TOKEN def test_vsiswift_fake_auth_storage_url_and_auth_token(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() gdal.SetConfigOption('SWIFT_AUTH_V1_URL', '') gdal.SetConfigOption('SWIFT_USER', '') gdal.SetConfigOption('SWIFT_KEY', '') gdal.SetConfigOption('SWIFT_STORAGE_URL', 'http://127.0.0.1:%d/v1/AUTH_something' % gdaltest.webserver_port) gdal.SetConfigOption('SWIFT_AUTH_TOKEN', 'my_auth_token') # Failure handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/bar', 501) with webserver.install_http_handler(handler): f = open_for_read('/vsiswift/foo/bar') assert f is not None gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) gdal.VSICurlClearCache() # Success def method(request): request.protocol_version = 'HTTP/1.1' h = request.headers if 'x-auth-token' not in h or \ h['x-auth-token'] != 'my_auth_token': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/bar', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsiswift/foo/bar') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' ############################################################################### # Test VSIStatL() def test_vsiswift_stat(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/bar', 206, {'Content-Range': 'bytes 0-0/1000000'}, 'x') with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsiswift/foo/bar') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() handler = webserver.SequentialHandler() handler.add('HEAD', '/v1/AUTH_something/foo/bar', 200, {'Content-Length': '1000000'}) with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsiswift_streaming/foo/bar') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() # Test stat on container handler = webserver.SequentialHandler() # GET on the container URL returns something, but we must hack this back # to a directory handler.add('GET', '/v1/AUTH_something/foo', 200, {}, "blabla") with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsiswift/foo') assert stat_res is not None and stat.S_ISDIR(stat_res.mode) ############################################################################### # Test ReadDir() def test_vsiswift_fake_readdir(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=1', 200, {'Content-type': 'application/json'}, """[ { "last_modified": "1970-01-01T00:00:01", "bytes": 123456, "name": "bar.baz" } ]""") handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=1&marker=bar.baz', 200, {'Content-type': 'application/json'}, """[ { "subdir": "mysubdir/" } ]""") handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=1&marker=mysubdir%2F', 200, {'Content-type': 'application/json'}, """[ ]""") with gdaltest.config_option('SWIFT_MAX_KEYS', '1'): with webserver.install_http_handler(handler): f = open_for_read('/vsiswift/foo/bar.baz') assert f is not None gdal.VSIFCloseL(f) dir_contents = gdal.ReadDir('/vsiswift/foo') assert dir_contents == ['bar.baz', 'mysubdir'] stat_res = gdal.VSIStatL('/vsiswift/foo/bar.baz') assert stat_res.size == 123456 assert stat_res.mtime == 1 # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir('/vsiswift/foo/bar.baz') assert dir_contents is None # Test error on ReadDir() handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000&prefix=error_test%2F', 500) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiswift/foo/error_test/') assert dir_contents is None # List containers (empty result) handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something', 200, {'Content-type': 'application/json'}, """[] """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiswift/') assert dir_contents == ['.'] # List containers gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something', 200, {'Content-type': 'application/json'}, """[ { "name": "mycontainer1", "count": 0, "bytes": 0 }, { "name": "mycontainer2", "count": 0, "bytes": 0} ] """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiswift/') assert dir_contents == ['mycontainer1', 'mycontainer2'] # ReadDir() with a file and directory of same names gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something', 200, {'Content-type': 'application/json'}, """[ { "last_modified": "1970-01-01T00:00:01", "bytes": 123456, "name": "foo" }, { "subdir": "foo/"} ] """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiswift/') assert dir_contents == ['foo', 'foo/'] handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200, {'Content-type': 'application/json'}, "[]") with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsiswift/foo/') assert dir_contents == ['.'] ############################################################################### # Test write def test_vsiswift_fake_write(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Test creation of BlockBob f = gdal.VSIFOpenL('/vsiswift/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): h = request.headers if 'x-auth-token' not in h or \ h['x-auth-token'] != 'my_auth_token' or \ 'Transfer-Encoding' not in h or h['Transfer-Encoding'] != 'chunked': sys.stderr.write('Bad headers: %s\n' % str(h)) request.send_response(403) return request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = '' while True: numchars = int(request.rfile.readline().strip(), 16) content += request.rfile.read(numchars).decode('ascii') request.rfile.read(2) if numchars == 0: break if len(content) != 40000: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/v1/AUTH_something/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL('x' * 35000, 1, 35000, f) ret += gdal.VSIFWriteL('x' * 5000, 1, 5000, f) if ret != 40000: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) ############################################################################### # Test Unlink() def test_vsiswift_fake_unlink(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Success handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/bar', 206, {'Content-Range': 'bytes 0-0/1'}, 'x') handler.add('DELETE', '/v1/AUTH_something/foo/bar', 202, {'Connection': 'close'}) with webserver.install_http_handler(handler): ret = gdal.Unlink('/vsiswift/foo/bar') assert ret == 0 # Failure handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/bar', 206, {'Content-Range': 'bytes 0-0/1'}, 'x') handler.add('DELETE', '/v1/AUTH_something/foo/bar', 400, {'Connection': 'close'}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink('/vsiswift/foo/bar') assert ret == -1 ############################################################################### # Test Mkdir() / Rmdir() def test_vsiswift_fake_mkdir_rmdir(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() # Invalid name ret = gdal.Mkdir('/vsiswift', 0) assert ret != 0 handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/dir/', 404, {'Connection': 'close'}) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200, {'Connection': 'close'}, "[]") handler.add('PUT', '/v1/AUTH_something/foo/dir/', 201) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsiswift/foo/dir', 0) assert ret == 0 # Try creating already existing directory handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/dir/', 404, {'Connection': 'close'}) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200, {'Connection': 'close', 'Content-type': 'application/json'}, """[ { "subdir": "dir/" } ]""") with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsiswift/foo/dir', 0) assert ret != 0 # Invalid name ret = gdal.Rmdir('/vsiswift') assert ret != 0 gdal.VSICurlClearCache() # Not a directory handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/it_is_a_file/', 404) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200, {'Connection': 'close', 'Content-type': 'application/json'}, """[ { "name": "it_is_a_file/", "bytes": 0, "last_modified": "1970-01-01T00:00:01" } ]""") with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiswift/foo/it_is_a_file') assert ret != 0 # Valid handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/dir/', 200) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=101&prefix=dir%2F', 200, {'Connection': 'close', 'Content-type': 'application/json'}, """[] """) handler.add('DELETE', '/v1/AUTH_something/foo/dir/', 204) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiswift/foo/dir') assert ret == 0 # Try deleting already deleted directory handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/dir/', 404) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiswift/foo/dir') assert ret != 0 gdal.VSICurlClearCache() # Try deleting non-empty directory handler = webserver.SequentialHandler() handler.add('GET', '/v1/AUTH_something/foo/dir_nonempty/', 404) handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=10000', 200, {'Connection': 'close', 'Content-type': 'application/json'}, """[ { "subdir": "dir_nonempty/" } ]""") handler.add('GET', '/v1/AUTH_something/foo?delimiter=%2F&limit=101&prefix=dir_nonempty%2F', 200, {'Connection': 'close', 'Content-type': 'application/json'}, """[ { "name": "dir_nonempty/some_file", "bytes": 0, "last_modified": "1970-01-01T00:00:01" } ]""") with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsiswift/foo/dir_nonempty') assert ret != 0 ############################################################################### def test_vsiswift_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_vsiswift_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() swift_resource = gdal.GetConfigOption('SWIFT_RESOURCE') if swift_resource is None: pytest.skip('Missing SWIFT_RESOURCE') if '/' not in swift_resource: path = '/vsiswift/' + swift_resource statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'vsiswift_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) ret = gdal.Mkdir(subpath, 0) assert ret != 0, ('Mkdir(%s) repeated should return an error' % subpath) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, \ ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsiswift/' + swift_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Same with /vsiswift_streaming/ f = open_for_read('/vsiswift_streaming/' + swift_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Invalid resource gdal.ErrorReset() f = open_for_read('/vsiswift_streaming/' + swift_resource + '/invalid_resource.baz') assert f is None, gdal.VSIGetLastErrorMsg() ############################################################################### def test_vsiswift_cleanup(): for var in gdaltest.swift_vars: gdal.SetConfigOption(var, gdaltest.swift_vars[var]) gdalautotest-3.0.4/gcore/rfc30.py0000755003401500001440000001014513614005322016216 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: rfc30.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC 30 (UTF filename handling) support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010 Frank Warmerdam # Copyright (c) 2010-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 sys import version_info from osgeo import gdal import gdaltest import pytest ############################################################################### # Try opening a file with a Chinese name using the Python UTF-8 string. def test_rfc30_1(): if version_info >= (3, 0, 0): filename = 'xx\u4E2D\u6587.\u4E2D\u6587' filename_escaped = gdaltest.urlescape(filename) else: exec("filename = u'xx\u4E2D\u6587.\u4E2D\u6587'") filename_escaped = gdaltest.urlescape(filename.encode('utf-8')) if not gdaltest.download_file('http://download.osgeo.org/gdal/data/gtiff/' + filename_escaped, filename): pytest.skip() filename = 'tmp/cache/' + filename ds = gdal.Open(filename) file_list = ds.GetFileList() assert ds is not None, 'failed to open utf filename.' ds = None ds = gdal.Open(file_list[0]) assert ds is not None, 'failed to open utf filename (2).' ############################################################################### # Try creating, then renaming a utf-8 named file. def test_rfc30_2(): if version_info >= (3, 0, 0): filename = 'tmp/yy\u4E2D\u6587.\u4E2D\u6587' else: exec("filename = u'tmp/yy\u4E2D\u6587.\u4E2D\u6587'") # The typemaps should accept Unicode strings directly # filename = filename.encode( 'utf-8' ) fd = gdal.VSIFOpenL(filename, 'w') assert fd is not None, 'failed to create utf-8 named file.' gdal.VSIFWriteL('abc', 3, 1, fd) gdal.VSIFCloseL(fd) # rename if version_info >= (3, 0, 0): new_filename = 'tmp/yy\u4E2D\u6587.\u4E2D\u6587' filename_for_rename = filename else: exec("new_filename = u'tmp/yy\u4E2D\u6587.\u4E2D\u6587'") filename_for_rename = filename.encode('utf-8') # FIXME ? rename should perhaps accept unicode strings new_filename = new_filename.encode('utf-8') # FIXME ? rename should perhaps accept unicode strings assert gdal.Rename(filename_for_rename, new_filename) == 0, 'utf-8 rename failed.' fd = gdal.VSIFOpenL(new_filename, 'r') assert fd is not None, 'reopen failed with utf8' data = gdal.VSIFReadL(3, 1, fd) gdal.VSIFCloseL(fd) if version_info >= (3, 0, 0): ok = eval("data == b'abc'") else: ok = data == 'abc' assert ok, 'did not get expected data.' gdal.Unlink(new_filename) fd = gdal.VSIFOpenL(new_filename, 'r') assert fd is None, 'did unlink fail on utf8 filename?' gdalautotest-3.0.4/gcore/pnm_read.py0000755003401500001440000000416113614005322017067 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: pnm_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from a PNM file. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, 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 pytest import gdaltest ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.pnm', 4672), ('uint16.pnm', 4672)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('PNM') def test_pnm_open(filename, checksum): ut = gdaltest.GDALTest('PNM', filename, 1, checksum) ut.testOpen() gdalautotest-3.0.4/gcore/vrtmisc.py0000755003401500001440000004651613614005322017003 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vrtmisc.py bc9641926ce9a7bcd04845bd71487da50ff9d0f0 2019-11-14 16:17:17 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Misc tests of VRT driver # Author: Even Rouault # ############################################################################### # 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 gdaltest from osgeo import gdal from osgeo import osr ############################################################################### # Test linear scaling def test_vrtmisc_1(): ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4323, 'did not get expected checksum' ############################################################################### # Test power scaling def test_vrtmisc_2(): ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255 -exponent 2.2') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4159, 'did not get expected checksum' ############################################################################### # Test power scaling (not in VRT file) def test_vrtmisc_3(): ds = gdal.Open(""" data/byte.tif 1 2.2 0 255 """) cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4159, 'did not get expected checksum' ############################################################################### # Test multi-band linear scaling with a single -scale occurrence. def test_vrtmisc_4(): # -scale specified once applies to all bands ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4323, 'did not get expected checksum' assert cs2 == 4323, 'did not get expected checksum' ############################################################################### # Test multi-band linear scaling with -scale_XX syntax def test_vrtmisc_5(): # -scale_2 applies to band 2 only ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale_2 74 255 0 255 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4672, 'did not get expected checksum' assert cs2 == 4323, 'did not get expected checksum' ############################################################################### # Test multi-band linear scaling with repeated -scale syntax def test_vrtmisc_6(): # -scale repeated as many times as output band number ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 0 255 0 255 -scale 74 255 0 255 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4672, 'did not get expected checksum' assert cs2 == 4323, 'did not get expected checksum' ############################################################################### # Test multi-band power scaling with a single -scale and -exponent occurrence. def test_vrtmisc_7(): # -scale and -exponent, specified once, apply to all bands ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 74 255 0 255 -exponent 2.2 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4159, 'did not get expected checksum' assert cs2 == 4159, 'did not get expected checksum' ############################################################################### # Test multi-band power scaling with -scale_XX and -exponent_XX syntax def test_vrtmisc_8(): # -scale_2 and -exponent_2 apply to band 2 only ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale_2 74 255 0 255 -exponent_2 2.2 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4672, 'did not get expected checksum' assert cs2 == 4159, 'did not get expected checksum' ############################################################################### # Test multi-band linear scaling with repeated -scale and -exponent syntax def test_vrtmisc_9(): # -scale and -exponent repeated as many times as output band number ds = gdal.Translate('', 'data/byte.tif', options='-of MEM -scale 0 255 0 255 -scale 74 255 0 255 -exponent 1 -exponent 2.2 -b 1 -b 1') cs1 = ds.GetRasterBand(1).Checksum() cs2 = ds.GetRasterBand(2).Checksum() ds = None assert cs1 == 4672, 'did not get expected checksum' assert cs2 == 4159, 'did not get expected checksum' ############################################################################### # Test metadata serialization (#5944) def test_vrtmisc_10(): gdal.FileFromMemBuffer("/vsimem/vrtmisc_10.vrt", """ bar baz foo.tif 1 """) ds = gdal.Open("/vsimem/vrtmisc_10.vrt", gdal.GA_Update) # to trigger a flush ds.SetMetadata(ds.GetMetadata()) ds = None ds = gdal.Open("/vsimem/vrtmisc_10.vrt", gdal.GA_Update) assert ds.GetMetadata() == {'foo': 'bar'} assert ds.GetMetadata('some_domain') == {'bar': 'baz'} assert ds.GetMetadata_List('xml:a_xml_domain')[0] == '\n' # Empty default domain ds.SetMetadata({}) ds = None ds = gdal.Open("/vsimem/vrtmisc_10.vrt") assert ds.GetMetadata() == {} assert ds.GetMetadata('some_domain') == {'bar': 'baz'} assert ds.GetMetadata_List('xml:a_xml_domain')[0] == '\n' ds = None gdal.Unlink("/vsimem/vrtmisc_10.vrt") ############################################################################### # Test relativeToVRT is preserved during re-serialization (#5985) def test_vrtmisc_11(): f = open('tmp/vrtmisc_11.vrt', 'wt') f.write( """ ../data/byte.tif 1 """) f.close() ds = gdal.Open("tmp/vrtmisc_11.vrt", gdal.GA_Update) # to trigger a flush ds.SetMetadata(ds.GetMetadata()) ds = None data = open('tmp/vrtmisc_11.vrt', 'rt').read() gdal.Unlink("tmp/vrtmisc_11.vrt") assert '../data/byte.tif' in data ############################################################################### # Test set/delete nodata def test_vrtmisc_12(): gdal.FileFromMemBuffer("/vsimem/vrtmisc_12.vrt", """ foo.tif 1 """) ds = gdal.Open("/vsimem/vrtmisc_12.vrt", gdal.GA_Update) ds.GetRasterBand(1).SetNoDataValue(123) ds = None ds = gdal.Open("/vsimem/vrtmisc_12.vrt", gdal.GA_Update) assert ds.GetRasterBand(1).GetNoDataValue() == 123 assert ds.GetRasterBand(1).DeleteNoDataValue() == 0 ds = None ds = gdal.Open("/vsimem/vrtmisc_12.vrt") assert ds.GetRasterBand(1).GetNoDataValue() is None ds = None gdal.Unlink("/vsimem/vrtmisc_12.vrt") ############################################################################### # Test CreateCopy() preserve NBITS def test_vrtmisc_13(): ds = gdal.Open('data/oddsize1bit.tif') out_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) assert out_ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ############################################################################### # Test SrcRect/DstRect are serialized as integers def test_vrtmisc_14(): src_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/vrtmisc_14_src.tif', 123456789, 1, options=['SPARSE_OK=YES', 'TILED=YES']) gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtmisc_14.vrt', src_ds) src_ds = None fp = gdal.VSIFOpenL('/vsimem/vrtmisc_14.vrt', 'rb') content = gdal.VSIFReadL(1, 10000, fp).decode('latin1') gdal.VSIFCloseL(fp) gdal.Unlink("/vsimem/vrtmisc_14_src.tif") gdal.Unlink("/vsimem/vrtmisc_14.vrt") assert (' 0 data/vrtmisc16_tile1.tif 1 0 data/vrtmisc16_tile2.tif 1 0 """) gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/vrtmisc_16.tif', gdal.Open('/vsimem/vrtmisc_16.vrt')) ds = gdal.Open('/vsimem/vrtmisc_16.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 206 gdal.Unlink('/vsimem/vrtmisc_16.tif') gdal.Unlink('/vsimem/vrtmisc_16.vrt') ############################################################################### # Check that the serialized xml:VRT doesn't include itself (#6767) def test_vrtmisc_17(): ds = gdal.Open('data/byte.tif') vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtmisc_17.vrt', ds) xml_vrt = vrt_ds.GetMetadata('xml:VRT')[0] vrt_ds = None gdal.Unlink('/vsimem/vrtmisc_17.vrt') assert 'xml:VRT' not in xml_vrt ############################################################################### # Check GetMetadata('xml:VRT') behaviour on a in-memory VRT copied from a VRT def test_vrtmisc_18(): ds = gdal.Open('data/byte.vrt') vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) xml_vrt = vrt_ds.GetMetadata('xml:VRT')[0] assert gdal.GetLastErrorMsg() == '' vrt_ds = None assert ('data/byte.tif' in xml_vrt or \ 'data\\byte.tif' in xml_vrt) ############################################################################### # Check RAT support def test_vrtmisc_rat(): ds = gdal.Translate('/vsimem/vrtmisc_rat.tif', 'data/byte.tif', format='MEM') rat = gdal.RasterAttributeTable() rat.CreateColumn("Ints", gdal.GFT_Integer, gdal.GFU_Generic) ds.GetRasterBand(1).SetDefaultRAT(rat) vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('/vsimem/vrtmisc_rat.vrt', ds) xml_vrt = vrt_ds.GetMetadata('xml:VRT')[0] assert gdal.GetLastErrorMsg() == '' vrt_ds = None assert '' in xml_vrt vrt_ds = gdal.Translate('/vsimem/vrtmisc_rat.vrt', ds, format='VRT', srcWin=[0, 0, 1, 1]) xml_vrt = vrt_ds.GetMetadata('xml:VRT')[0] assert gdal.GetLastErrorMsg() == '' vrt_ds = None assert '' in xml_vrt ds = None vrt_ds = gdal.Open('/vsimem/vrtmisc_rat.vrt', gdal.GA_Update) rat = vrt_ds.GetRasterBand(1).GetDefaultRAT() assert rat is not None and rat.GetColumnCount() == 1 vrt_ds.GetRasterBand(1).SetDefaultRAT(None) assert vrt_ds.GetRasterBand(1).GetDefaultRAT() is None vrt_ds = None ds = None gdal.Unlink('/vsimem/vrtmisc_rat.vrt') gdal.Unlink('/vsimem/vrtmisc_rat.tif') ############################################################################### # Check ColorTable support def test_vrtmisc_colortable(): ds = gdal.Translate('', 'data/byte.tif', format='VRT') 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 ############################################################################### # Check histogram support def test_vrtmisc_histogram(): tmpfile = '/vsimem/vrtmisc_histogram.vrt' ds = gdal.Translate(tmpfile, 'data/byte.tif', format='VRT') ds.GetRasterBand(1).SetDefaultHistogram(1, 2, [3000000000, 4]) ds = None ds = gdal.Open(tmpfile) hist = ds.GetRasterBand(1).GetDefaultHistogram(force=0) ds = None assert hist == (1.0, 2.0, 2, [3000000000, 4]) gdal.Unlink(tmpfile) ############################################################################### # write SRS with unusual data axis to SRS axis mapping def test_vrtmisc_write_srs(): tmpfile = '/vsimem/test_vrtmisc_write_srs.vrt' ds = gdal.Translate(tmpfile, 'data/byte.tif', format='VRT') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetSpatialRef(sr) ds = None ds = gdal.Open(tmpfile) assert ds.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1,2] ds = None gdal.Unlink(tmpfile) ############################################################################### # complex scenario involving masks and implicit overviews def test_vrtmisc_mask_implicit_overviews(): with gdaltest.config_option('GDAL_TIFF_INTERNAL_MASK', 'YES'): ds = gdal.Translate('/vsimem/cog.tif', 'data/stefan_full_rgba.tif', options = '-outsize 2048 0 -b 1 -b 2 -b 3 -mask 4') ds.BuildOverviews('NEAR', [2, 4]) ds = None gdal.Translate('/vsimem/cog.vrt', '/vsimem/cog.tif') gdal.Translate('/vsimem/out.tif', '/vsimem/cog.vrt', options = '-b mask -outsize 10% 0') gdal.GetDriverByName('GTiff').Delete('/vsimem/cog.tif') gdal.Unlink('/vsimem/cog.vrt') ds = gdal.Open('/vsimem/out.tif') histo = ds.GetRasterBand(1).GetDefaultHistogram()[3] # Check that there are only 0 and 255 in the histogram assert histo[0] + histo[255] == ds.RasterXSize * ds.RasterYSize, histo assert ds.GetRasterBand(1).Checksum() == 46885 ds = None gdal.Unlink('/vsimem/out.tif') ############################################################################### # Cleanup. def test_vrtmisc_cleanup(): pass gdalautotest-3.0.4/gcore/vsicurl.py0000755003401500001440000004336513614005322017002 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsicurl.py e3b9cb3fe73b177191085a02993c0a9aacb6b4ce 2019-06-25 11:41:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsicurl # 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 sys import version_info import time from osgeo import gdal from osgeo import ogr import gdaltest import webserver import pytest ############################################################################### # def test_vsicurl_1(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = ogr.Open('/vsizip/vsicurl/http://publicfiles.dep.state.fl.us/dear/BWR_GIS/2007NWFLULC/NWFWMD2007LULC.zip') assert ds is not None ############################################################################### # def vsicurl_2(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = gdal.Open('/vsizip//vsicurl/http://eros.usgs.gov/archive/nslrsda/GeoTowns/HongKong/srtm/n22e113.zip/n22e113.bil') assert ds is not None ############################################################################### # This server doesn't support range downloading def vsicurl_3(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = ogr.Open('/vsizip/vsicurl/http://www.iucnredlist.org/spatial-data/MAMMALS_TERRESTRIAL.zip') assert ds is None ############################################################################### # This server doesn't support range downloading def test_vsicurl_4(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = ogr.Open('/vsizip/vsicurl/http://lelserver.env.duke.edu:8080/LandscapeTools/export/49/Downloads/1_Habitats.zip') assert ds is None ############################################################################### # Test URL unescaping when reading HTTP file list def test_vsicurl_5(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = gdal.Open('/vsicurl/http://dds.cr.usgs.gov/srtm/SRTM_image_sample/picture%20examples/N34W119_DEM.tif') assert ds is not None ############################################################################### # Test with FTP server that doesn't support EPSV command def vsicurl_6_disabled(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() fl = gdal.ReadDir('/vsicurl/ftp://ftp2.cits.rncan.gc.ca/pub/cantopo/250k_tif') assert fl ############################################################################### # Test Microsoft-IIS/6.0 listing def test_vsicurl_7(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() fl = gdal.ReadDir('/vsicurl/http://ortho.linz.govt.nz/tifs/2005_06') assert fl ############################################################################### # Test interleaved reading between 2 datasets def vsicurl_8(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds1 = gdal.Open('/vsigzip//vsicurl/http://dds.cr.usgs.gov/pub/data/DEM/250/notavail/C/chipicoten-w.gz') gdal.Open('/vsizip//vsicurl/http://edcftp.cr.usgs.gov/pub/data/landcover/files/2009/biso/gokn09b_dnbr.zip/nps-serotnbsp-9001-20090321_rd.tif') cs = ds1.GetRasterBand(1).Checksum() assert cs == 61342 ############################################################################### # Test reading a file with Chinese characters, but the HTTP file listing # returns escaped sequences instead of the Chinese characters. def test_vsicurl_9(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() if version_info >= (3, 0, 0): filename = 'xx\u4E2D\u6587.\u4E2D\u6587' else: exec("filename = u'xx\u4E2D\u6587.\u4E2D\u6587'") filename = filename.encode('utf-8') ds = gdal.Open('/vsicurl/http://download.osgeo.org/gdal/data/gtiff/' + filename) assert ds is not None ############################################################################### # Test reading a file with escaped Chinese characters. def test_vsicurl_10(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() ds = gdal.Open('/vsicurl/http://download.osgeo.org/gdal/data/gtiff/xx%E4%B8%AD%E6%96%87.%E4%B8%AD%E6%96%87') assert ds is not None ############################################################################### # Test ReadDir() after reading a file on the same server def test_vsicurl_11(): if not gdaltest.run_slow_tests(): pytest.skip() if not gdaltest.built_against_curl(): pytest.skip() f = gdal.VSIFOpenL('/vsicurl/http://download.osgeo.org/gdal/data/bmp/Bug2236.bmp', 'rb') if f is None: pytest.skip() gdal.VSIFSeekL(f, 1000000, 0) gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) filelist = gdal.ReadDir('/vsicurl/http://download.osgeo.org/gdal/data/gtiff') assert filelist is not None and filelist ############################################################################### def test_vsicurl_start_webserver(): 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() ############################################################################### def test_vsicurl_test_redirect(): if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/test_redirect/', 404) # Simulate a big time difference between server and local machine current_time = 1500 def method(request): response = 'HTTP/1.1 302\r\n' response += 'Server: foo\r\n' response += 'Date: ' + time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(current_time)) + '\r\n' response += 'Location: %s\r\n' % ('http://localhost:%d/foo.s3.amazonaws.com/test_redirected/test.bin?Signature=foo&Expires=%d' % (gdaltest.webserver_port, current_time + 30)) response += '\r\n' request.wfile.write(response.encode('ascii')) handler.add('HEAD', '/test_redirect/test.bin', custom_method=method) handler.add('HEAD', '/foo.s3.amazonaws.com/test_redirected/test.bin?Signature=foo&Expires=%d' % (current_time + 30), 403, {'Server': 'foo'}, '') def method(request): if 'Range' in request.headers: if request.headers['Range'] == 'bytes=0-16383': request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Range', 'bytes 0-16383/1000000') request.send_header('Content-Length', 16384) request.send_header('Connection', 'close') request.end_headers() request.wfile.write(('x' * 16384).encode('ascii')) elif request.headers['Range'] == 'bytes=16384-49151': # Test expiration of the signed URL request.protocol_version = 'HTTP/1.1' request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() else: request.send_response(404) request.send_header('Content-Length', 0) request.end_headers() else: # After a failed attempt on a HEAD, the client should go there response = 'HTTP/1.1 200\r\n' response += 'Server: foo\r\n' response += 'Date: ' + time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(current_time)) + '\r\n' response += 'Content-type: text/plain\r\n' response += 'Content-Length: 1000000\r\n' response += 'Connection: close\r\n' response += '\r\n' request.wfile.write(response.encode('ascii')) handler.add('GET', '/foo.s3.amazonaws.com/test_redirected/test.bin?Signature=foo&Expires=%d' % (current_time + 30), custom_method=method) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsicurl/http://localhost:%d/test_redirect/test.bin' % gdaltest.webserver_port, 'rb') assert f is not None gdal.VSIFSeekL(f, 0, 2) if gdal.VSIFTellL(f) != 1000000: gdal.VSIFCloseL(f) pytest.fail(gdal.VSIFTellL(f)) gdal.VSIFSeekL(f, 0, 0) handler = webserver.SequentialHandler() handler.add('GET', '/foo.s3.amazonaws.com/test_redirected/test.bin?Signature=foo&Expires=%d' % (current_time + 30), custom_method=method) handler.add('GET', '/foo.s3.amazonaws.com/test_redirected/test.bin?Signature=foo&Expires=%d' % (current_time + 30), custom_method=method) current_time = int(time.time()) def method(request): # We should go there after expiration of the first signed URL if 'Range' in request.headers and \ request.headers['Range'] == 'bytes=16384-49151': request.protocol_version = 'HTTP/1.1' request.send_response(302) # Return a new signed URL request.send_header('Location', 'http://localhost:%d/foo.s3.amazonaws.com/test_redirected2/test.bin?Signature=foo&Expires=%d' % (request.server.port, current_time + 30)) request.send_header('Content-Length', 16384) request.end_headers() request.wfile.write(('x' * 16384).encode('ascii')) handler.add('GET', '/test_redirect/test.bin', custom_method=method) def method(request): # Second signed URL if 'Range' in request.headers and \ request.headers['Range'] == 'bytes=16384-49151': request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Range', 'bytes 16384-16384/1000000') request.send_header('Content-Length', 1) request.end_headers() request.wfile.write('y'.encode('ascii')) handler.add('GET', '/foo.s3.amazonaws.com/test_redirected2/test.bin?Signature=foo&Expires=%d' % (current_time + 30), custom_method=method) with webserver.install_http_handler(handler): content = gdal.VSIFReadL(1, 16383, f).decode('ascii') if len(content) != 16383 or content[0] != 'x': gdal.VSIFCloseL(f) pytest.fail(content) content = gdal.VSIFReadL(1, 2, f).decode('ascii') if content != 'xy': gdal.VSIFCloseL(f) pytest.fail(content) gdal.VSIFCloseL(f) ############################################################################### # TODO: better testing def test_vsicurl_test_clear_cache(): gdal.VSICurlClearCache() gdal.VSICurlClearCache() ############################################################################### def test_vsicurl_test_retry(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/test_retry/', 404) handler.add('HEAD', '/test_retry/test.txt', 200, {'Content-Length': '3'}) handler.add('GET', '/test_retry/test.txt', 502) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsicurl/http://localhost:%d/test_retry/test.txt' % gdaltest.webserver_port, 'rb') data_len = 0 if f: data_len = len(gdal.VSIFReadL(1, 1, f)) gdal.VSIFCloseL(f) assert data_len == 0 gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('GET', '/test_retry/', 404) handler.add('HEAD', '/test_retry/test.txt', 200, {'Content-Length': '3'}) handler.add('GET', '/test_retry/test.txt', 502) handler.add('GET', '/test_retry/test.txt', 429) handler.add('GET', '/test_retry/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsicurl?max_retry=2&retry_delay=0.01&url=http://localhost:%d/test_retry/test.txt' % gdaltest.webserver_port, 'rb') assert f is not None gdal.ErrorReset() with gdaltest.error_handler(): data = gdal.VSIFReadL(1, 3, f).decode('ascii') error_msg = gdal.GetLastErrorMsg() gdal.VSIFCloseL(f) assert data == 'foo' assert '429' in error_msg ############################################################################### def test_vsicurl_test_fallback_from_head_to_get(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() handler = webserver.SequentialHandler() handler.add('HEAD', '/test_fallback_from_head_to_get', 405) handler.add('GET', '/test_fallback_from_head_to_get', 200, {}, 'foo') with webserver.install_http_handler(handler): statres = gdal.VSIStatL('/vsicurl/http://localhost:%d/test_fallback_from_head_to_get' % gdaltest.webserver_port) assert statres.size == 3 gdal.VSICurlClearCache() ############################################################################### def test_vsicurl_test_parse_html_filelist_apache(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/mydir/', 200, {}, """ Index of /mydir

Index of /mydir

[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[IMG]foo.tif17-May-2010 12:26 90K 
[IMG]foo with space.tif15-Jan-2007 11:02 736  

""") with webserver.install_http_handler(handler): fl = gdal.ReadDir('/vsicurl/http://localhost:%d/mydir' % gdaltest.webserver_port) assert fl == ['foo.tif', 'foo%20with%20space.tif'] assert gdal.VSIStatL('/vsicurl/http://localhost:%d/mydir/foo%%20with%%20space.tif' % gdaltest.webserver_port, gdal.VSI_STAT_EXISTS_FLAG) is not None handler = webserver.SequentialHandler() handler.add('HEAD', '/mydir/i_dont_exist', 404, {}) with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsicurl/http://localhost:%d/mydir/i_dont_exist' % gdaltest.webserver_port, gdal.VSI_STAT_EXISTS_FLAG) is None ############################################################################### def test_vsicurl_no_size_in_HEAD(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('HEAD', '/test_vsicurl_no_size_in_HEAD.bin', 200, {}, add_content_length_header=False) handler.add('GET', '/test_vsicurl_no_size_in_HEAD.bin', 200, {}, 'X' * 10) with webserver.install_http_handler(handler): statres = gdal.VSIStatL('/vsicurl/http://localhost:%d/test_vsicurl_no_size_in_HEAD.bin' % gdaltest.webserver_port) assert statres.size == 10 ############################################################################### def test_vsicurl_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) gdalautotest-3.0.4/gcore/vsizip.py0000755003401500001440000005322213614005322016630 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vsizip.py 3ee58a935b1baef44438364a6019e2ba802412a1 2019-02-20 22:59:47 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsizip/vsimem/ # 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 random import gdaltest from osgeo import gdal import pytest ############################################################################### # Test writing a ZIP with multiple files and directories def test_vsizip_1(): # We can keep the handle open during all the ZIP writing hZIP = gdal.VSIFOpenL("/vsizip/vsimem/test.zip", "wb") assert hZIP is not None, 'fail 1' # One way to create a directory f = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir2/", "wb") assert f is not None, 'fail 2' gdal.VSIFCloseL(f) # A more natural one gdal.Mkdir("/vsizip/vsimem/test.zip/subdir1", 0) # Create 1st file f2 = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/abcd", "wb") assert f2 is not None, 'fail 3' gdal.VSIFWriteL("abcd", 1, 4, f2) gdal.VSIFCloseL(f2) # Test that we cannot read a zip file being written gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/abcd", "rb") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == 'Cannot read a zip file being written', \ 'expected error' assert f is None, 'should not have been successful 1' # Create 2nd file f3 = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/efghi", "wb") assert f3 is not None, 'fail 4' gdal.VSIFWriteL("efghi", 1, 5, f3) # Try creating a 3d file gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f4 = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/that_wont_work", "wb") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == 'Cannot create that_wont_work while another file is being written in the .zip', \ 'expected error' assert f4 is None, 'should not have been successful 2' gdal.VSIFCloseL(f3) # Now we can close the main handle gdal.VSIFCloseL(hZIP) # ERROR 6: Support only 1 file in archive file /vsimem/test.zip when no explicit in-archive filename is specified gdal.ErrorReset() with gdaltest.error_handler(): f = gdal.VSIFOpenL('/vsizip/vsimem/test.zip', 'rb') if f is not None: gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '', 'expected error' f = gdal.VSIFOpenL("/vsizip/vsimem/test.zip/subdir3/abcd", "rb") assert f is not None, 'fail 5' data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) assert data.decode('ASCII') == 'abcd' # Test alternate uri syntax gdal.Rename("/vsimem/test.zip", "/vsimem/test.xxx") f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx}/subdir3/abcd", "rb") assert f is not None data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) assert data.decode('ASCII') == 'abcd' # With a trailing slash f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx}/subdir3/abcd/", "rb") assert f is not None gdal.VSIFCloseL(f) # Test ReadDir() assert len(gdal.ReadDir("/vsizip/{/vsimem/test.xxx}")) == 3 # Unbalanced curls f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx", "rb") assert f is None # Non existing mainfile f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx}/bla", "rb") assert f is None # Non existing subfile f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.zzz}/bla", "rb") assert f is None # Wrong syntax f = gdal.VSIFOpenL("/vsizip/{/vsimem/test.xxx}.aux.xml", "rb") assert f is None # Test nested { { } } hZIP = gdal.VSIFOpenL("/vsizip/{/vsimem/zipinzip.yyy}", "wb") assert hZIP is not None, 'fail 1' f = gdal.VSIFOpenL("/vsizip/{/vsimem/zipinzip.yyy}/test.xxx", "wb") f_src = gdal.VSIFOpenL("/vsimem/test.xxx", "rb") data = gdal.VSIFReadL(1, 10000, f_src) gdal.VSIFCloseL(f_src) gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(hZIP) f = gdal.VSIFOpenL("/vsizip/{/vsizip/{/vsimem/zipinzip.yyy}/test.xxx}/subdir3/abcd/", "rb") assert f is not None data = gdal.VSIFReadL(1, 4, f) gdal.VSIFCloseL(f) assert data.decode('ASCII') == 'abcd' gdal.Unlink("/vsimem/test.xxx") gdal.Unlink("/vsimem/zipinzip.yyy") # Test VSIStatL on a non existing file assert gdal.VSIStatL('/vsizip//vsimem/foo.zip') is None # Test ReadDir on a non existing file assert gdal.ReadDir('/vsizip//vsimem/foo.zip') is None ############################################################################### # Test writing 2 files in the ZIP by closing it completely between the 2 def test_vsizip_2(): zip_name = '/vsimem/test2.zip' fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/foo.bar", "wb") assert fmain is not None, 'fail 1' gdal.VSIFWriteL("12345", 1, 5, fmain) gdal.VSIFCloseL(fmain) content = gdal.ReadDir("/vsizip/" + zip_name) assert content == ['foo.bar'], 'bad content 1' # Now append a second file fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/bar.baz", "wb") assert fmain is not None, 'fail 2' gdal.VSIFWriteL("67890", 1, 5, fmain) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') content = gdal.ReadDir("/vsizip/" + zip_name) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == 'Cannot read a zip file being written', \ 'expected error' assert content is None, 'bad content 2' gdal.VSIFCloseL(fmain) content = gdal.ReadDir("/vsizip/" + zip_name) assert content == ['foo.bar', 'bar.baz'], 'bad content 3' fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/foo.bar", "rb") assert fmain is not None, 'fail 3' data = gdal.VSIFReadL(1, 5, fmain) gdal.VSIFCloseL(fmain) assert data.decode('ASCII') == '12345' fmain = gdal.VSIFOpenL("/vsizip/" + zip_name + "/bar.baz", "rb") assert fmain is not None, 'fail 4' data = gdal.VSIFReadL(1, 5, fmain) gdal.VSIFCloseL(fmain) assert data.decode('ASCII') == '67890' gdal.Unlink(zip_name) ############################################################################### # Test opening in write mode a file inside a zip archive whose content has been listed before (testcase for fix of r22625) def test_vsizip_3(): fmain = gdal.VSIFOpenL("/vsizip/vsimem/test3.zip", "wb") f = gdal.VSIFOpenL("/vsizip/vsimem/test3.zip/foo", "wb") gdal.VSIFWriteL("foo", 1, 3, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL("/vsizip/vsimem/test3.zip/bar", "wb") gdal.VSIFWriteL("bar", 1, 3, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) gdal.ReadDir("/vsizip/vsimem/test3.zip") f = gdal.VSIFOpenL("/vsizip/vsimem/test3.zip/baz", "wb") gdal.VSIFWriteL("baz", 1, 3, f) gdal.VSIFCloseL(f) res = gdal.ReadDir("/vsizip/vsimem/test3.zip") gdal.Unlink("/vsimem/test3.zip") assert res == ['foo', 'bar', 'baz'] ############################################################################### # Test ReadRecursive on valid zip def test_vsizip_4(): # read recursive and validate content res = gdal.ReadDirRecursive("/vsizip/data/testzip.zip") assert res is not None, 'fail read' assert (res == ['subdir/', 'subdir/subdir/', 'subdir/subdir/uint16.tif', 'subdir/subdir/test_rpc.txt', 'subdir/test_rpc.txt', 'test_rpc.txt', 'uint16.tif']), 'bad content' ############################################################################### # Test ReadRecursive on deep zip def test_vsizip_5(): # make file in memory fmain = gdal.VSIFOpenL('/vsizip/vsimem/bigdepthzip.zip', 'wb') assert fmain is not None filename = "a" + "/a" * 1000 finside = gdal.VSIFOpenL('/vsizip/vsimem/bigdepthzip.zip/' + filename, 'wb') assert finside is not None gdal.VSIFCloseL(finside) gdal.VSIFCloseL(fmain) # read recursive and validate content res = gdal.ReadDirRecursive("/vsizip/vsimem/bigdepthzip.zip") assert res is not None, 'fail read' assert len(res) == 1001, ('wrong size: ' + str(len(res))) assert res[10] == 'a/a/a/a/a/a/a/a/a/a/a/', ('bad content: ' + res[10]) gdal.Unlink("/vsimem/bigdepthzip.zip") ############################################################################### # Test writing 2 files with same name in a ZIP (#4785) def test_vsizip_6(): # Maintain ZIP file opened fmain = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip", "wb") f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") assert f is not None gdal.VSIFWriteL("12345", 1, 5, f) gdal.VSIFCloseL(f) f = None gdal.PushErrorHandler('CPLQuietErrorHandler') f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") gdal.PopErrorHandler() if f is not None: gdal.VSIFCloseL(f) pytest.fail() gdal.VSIFCloseL(fmain) fmain = None gdal.Unlink("/vsimem/test6.zip") # Now close it each time f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") assert f is not None gdal.VSIFWriteL("12345", 1, 5, f) gdal.VSIFCloseL(f) f = None gdal.PushErrorHandler('CPLQuietErrorHandler') f = gdal.VSIFOpenL("/vsizip/vsimem/test6.zip/foo.bar", "wb") gdal.PopErrorHandler() if f is not None: gdal.VSIFCloseL(f) pytest.fail() gdal.Unlink("/vsimem/test6.zip") ############################################################################### # Test that we use the extended field for UTF-8 filenames (#5361). def test_vsizip_7(): content = gdal.ReadDir("/vsizip/data/cp866_plus_utf8.zip") ok = 0 try: local_vars = {'content': content, 'ok': ok} exec("if content == [u'\u0430\u0431\u0432\u0433\u0434\u0435', u'\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1", None, local_vars) ok = local_vars['ok'] except: if content == ['\u0430\u0431\u0432\u0433\u0434\u0435', '\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1 if ok == 0: print(content) pytest.fail('bad content') ############################################################################### # Basic test for ZIP64 support (5 GB file that compresses in less than 4 GB) def test_vsizip_8(): assert gdal.VSIStatL('/vsizip/vsizip/data/zero.bin.zip.zip/zero.bin.zip').size == 5000 * 1000 * 1000 + 1 ############################################################################### # Basic test for ZIP64 support (5 GB file that is stored) def test_vsizip_9(): assert gdal.VSIStatL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/zero.bin').size == 5000 * 1000 * 1000 + 1 assert gdal.VSIStatL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/hello.txt').size == 6 f = gdal.VSIFOpenL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/zero.bin', 'rb') gdal.VSIFSeekL(f, 5000 * 1000 * 1000, 0) data = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert data.decode('ascii') == '\x03' f = gdal.VSIFOpenL('/vsizip//vsisparse/data/zero_stored.bin.xml.zip/hello.txt', 'rb') data = gdal.VSIFReadL(1, 6, f) gdal.VSIFCloseL(f) assert data.decode('ascii') == 'HELLO\n' ############################################################################### # Test that we recode filenames in ZIP (#5361) def test_vsizip_10(): gdal.SetConfigOption('CPL_ZIP_ENCODING', 'CP866') content = gdal.ReadDir("/vsizip/data/cp866.zip") gdal.SetConfigOption('CPL_ZIP_ENCODING', None) ok = 0 try: local_vars = {'content': content, 'ok': ok} exec("if content == [u'\u0430\u0431\u0432\u0433\u0434\u0435', u'\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1", None, local_vars) ok = local_vars['ok'] except: if content == ['\u0430\u0431\u0432\u0433\u0434\u0435', '\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1 if ok == 0: if gdal.GetLastErrorMsg().find('Recode from CP866 to UTF-8 not supported') >= 0: pytest.skip() print(content) pytest.fail('bad content') ############################################################################### # Test that we don't do anything with ZIP with filenames in UTF-8 already (#5361) def test_vsizip_11(): content = gdal.ReadDir("/vsizip/data/utf8.zip") ok = 0 try: local_vars = {'content': content, 'ok': ok} exec("if content == [u'\u0430\u0431\u0432\u0433\u0434\u0435', u'\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1", None, local_vars) ok = local_vars['ok'] except: if content == ['\u0430\u0431\u0432\u0433\u0434\u0435', '\u0436\u0437\u0438\u0439\u043a\u043b']: ok = 1 if ok == 0: print(content) pytest.fail('bad content') ############################################################################### # Test changing the content of a zip file (#6005) def test_vsizip_12(): fmain = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_12_src1.zip", "wb") f = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_12_src1.zip/foo.bar", "wb") data = '0123456' gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) fmain = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_12_src2.zip", "wb") f = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_12_src2.zip/bar.baz", "wb") data = '01234567' gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) # Copy vsizip_12_src1 into vsizip_12 f = gdal.VSIFOpenL('/vsimem/vsizip_12_src1.zip', 'rb') data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsimem/vsizip_12.zip', 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.ReadDir('/vsizip/vsimem/vsizip_12.zip') # Copy vsizip_12_src2 into vsizip_12 f = gdal.VSIFOpenL('/vsimem/vsizip_12_src2.zip', 'rb') data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsimem/vsizip_12.zip', 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) content = gdal.ReadDir('/vsizip/vsimem/vsizip_12.zip') gdal.Unlink('/vsimem/vsizip_12_src1.zip') gdal.Unlink('/vsimem/vsizip_12_src2.zip') gdal.Unlink('/vsimem/vsizip_12.zip') assert content == ['bar.baz'] ############################################################################### # Test ReadDir() truncation def test_vsizip_13(): fmain = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_13.zip", "wb") for i in range(10): f = gdal.VSIFOpenL("/vsizip/vsimem/vsizip_13.zip/%d" % i, "wb") gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) lst = gdal.ReadDir('/vsizip/vsimem/vsizip_13.zip') assert len(lst) >= 4 # Test truncation lst_truncated = gdal.ReadDir('/vsizip/vsimem/vsizip_13.zip', int(len(lst) / 2)) assert len(lst_truncated) > int(len(lst) / 2) gdal.Unlink('/vsimem/vsizip_13.zip') ############################################################################### # Test that we can recode filenames in ZIP when writing (#6631) def test_vsizip_14(): fmain = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_14.zip', 'wb') try: x = [''] exec("x[0] = u'\u0430\u0431\u0432\u0433\u0434\u0435'") cp866_filename = x[0] except: cp866_filename = '\u0430\u0431\u0432\u0433\u0434\u0435' with gdaltest.error_handler(): f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_14.zip/' + cp866_filename, 'wb') if f is None: gdal.VSIFCloseL(fmain) gdal.Unlink('/vsimem/vsizip_14.zip') pytest.skip() gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) content = gdal.ReadDir("/vsizip//vsimem/vsizip_14.zip") assert content == [cp866_filename], 'bad content' gdal.Unlink('/vsimem/vsizip_14.zip') ############################################################################### # Test multithreaded compression def test_vsizip_multi_thread(): with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS', 'CPL_VSIL_DEFLATE_CHUNK_SIZE': '32K'}): fmain = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip', 'wb') f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip/test', 'wb') for i in range(100000): gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip/test', 'rb') data = gdal.VSIFReadL(100000, 5, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/vsizip_multi_thread.zip') if data != 'hello' * 100000: for i in range(10000): if data[i*5:i*5+5] != 'hello': print(i*5, data[i*5:i*5+5], data[i*5-5:i*5+5-5]) break pytest.fail() ############################################################################### # Test multithreaded compression, with I/O error def test_vsizip_multi_thread_error(): with gdaltest.error_handler(): with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS', 'CPL_VSIL_DEFLATE_CHUNK_SIZE': '16K'}): fmain = gdal.VSIFOpenL('/vsizip/{/vsimem/vsizip_multi_thread.zip||maxlength=1000}', 'wb') f = gdal.VSIFOpenL('/vsizip/{/vsimem/vsizip_multi_thread.zip||maxlength=1000}/test', 'wb') for i in range(100000): gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) gdal.Unlink('/vsimem/vsizip_multi_thread.zip') ############################################################################### # Test multithreaded compression, below the threshold where it triggers def test_vsizip_multi_thread_below_threshold(): with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS'}): fmain = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip', 'wb') f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip/test', 'wb') gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) f = gdal.VSIFOpenL('/vsizip//vsimem/vsizip_multi_thread.zip/test', 'rb') data = gdal.VSIFReadL(1, 5, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/vsizip_multi_thread.zip') assert data == 'hello' ############################################################################### # Test creating ZIP64 file: uncompressed larger than 4GB, but compressed # data stream < 4 GB def test_vsizip_create_zip64(): if not gdaltest.run_slow_tests(): pytest.skip() niters = 1000 s = 'hello' * 1000 * 1000 zip_name = '/vsimem/vsizip_create_zip64.zip' with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS'}): fmain = gdal.VSIFOpenL('/vsizip/' + zip_name, 'wb') f = gdal.VSIFOpenL('/vsizip/' + zip_name + '/test', 'wb') for i in range(niters): gdal.VSIFWriteL(s, 1, len(s), f) gdal.VSIFCloseL(f) gdal.VSIFCloseL(fmain) size = gdal.VSIStatL(zip_name).size assert size <= 0xFFFFFFFF size = gdal.VSIStatL('/vsizip/' + zip_name + '/test').size assert size == len(s) * niters f = gdal.VSIFOpenL('/vsizip/' + zip_name + '/test', 'rb') data = gdal.VSIFReadL(1, len(s), f).decode('ascii') gdal.VSIFCloseL(f) assert data == s gdal.Unlink(zip_name) ############################################################################### # Test creating ZIP64 file: compressed data stream > 4 GB def test_vsizip_create_zip64_stream_larger_than_4G(): if not gdaltest.run_slow_tests(): pytest.skip() zip_name = 'tmp/vsizip_create_zip64_stream_larger_than_4G.zip' gdal.Unlink(zip_name) niters = 999 s = ''.join([chr(random.randint(0, 127)) for i in range(5 * 1000 * 1000)]) with gdaltest.config_options({'GDAL_NUM_THREADS': 'ALL_CPUS'}): f = gdal.VSIFOpenL('/vsizip/' + zip_name + '/test2', 'wb') for i in range(niters): gdal.VSIFWriteL(s, 1, len(s), f) gdal.VSIFCloseL(f) size = gdal.VSIStatL(zip_name).size assert size > 0xFFFFFFFF size = gdal.VSIStatL('/vsizip/' + zip_name + '/test2').size assert size == len(s) * niters f = gdal.VSIFOpenL('/vsizip/' + zip_name + '/test2', 'rb') data = gdal.VSIFReadL(1, len(s), f).decode('ascii') gdal.VSIFCloseL(f) assert data == s gdal.Unlink(zip_name) ############################################################################### def test_vsizip_byte_zip64_local_header_zeroed(): size = gdal.VSIStatL('/vsizip/data/byte_zip64_local_header_zeroed.zip/byte.tif').size assert size == 736 gdalautotest-3.0.4/gcore/basic_test.py0000755003401500001440000004354113614005322017427 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: basic_test.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic GDAL open # 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 subprocess import sys import gdaltest from osgeo import gdal import pytest # Nothing exciting here. Just trying to open non existing files, # or empty names, or files that are not valid datasets... def matches_non_existing_error_msg(msg): m1 = "does not exist in the file system, and is not recognized as a supported dataset name." in msg m2 = 'No such file or directory' in msg m3 = 'Permission denied' in msg return m1 or m2 or m3 def test_basic_test_1(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('non_existing_ds', gdal.GA_ReadOnly) gdal.PopErrorHandler() if ds is None and matches_non_existing_error_msg(gdal.GetLastErrorMsg()): return pytest.fail('did not get expected error message, got %s' % gdal.GetLastErrorMsg()) def test_basic_test_strace_non_existing_file(): if not sys.platform.startswith('linux'): pytest.skip() python_exe = sys.executable cmd = "strace -f %s -c \"from osgeo import gdal; " % python_exe + ( "gdal.OpenEx('non_existing_ds', gdal.OF_RASTER)" " \" ") try: (_, err) = gdaltest.runexternal_out_and_err(cmd) except Exception: # strace not available pytest.skip() interesting_lines = [] for line in err.split('\n'): if 'non_existing_ds' in line: interesting_lines += [ line ] # Only 3 calls on the file are legit: open(), stat() and readlink() assert len(interesting_lines) <= 3, 'too many system calls accessing file' def test_basic_test_2(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('non_existing_ds', gdal.GA_Update) gdal.PopErrorHandler() if ds is None and matches_non_existing_error_msg(gdal.GetLastErrorMsg()): return pytest.fail('did not get expected error message, got %s' % gdal.GetLastErrorMsg()) def test_basic_test_3(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('', gdal.GA_ReadOnly) gdal.PopErrorHandler() if ds is None and matches_non_existing_error_msg(gdal.GetLastErrorMsg()): return pytest.fail('did not get expected error message, got %s' % gdal.GetLastErrorMsg()) def test_basic_test_4(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('', gdal.GA_Update) gdal.PopErrorHandler() if ds is None and matches_non_existing_error_msg(gdal.GetLastErrorMsg()): return pytest.fail('did not get expected error message, got %s' % gdal.GetLastErrorMsg()) def test_basic_test_5(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.Open('data/doctype.xml', gdal.GA_ReadOnly) gdal.PopErrorHandler() last_error = gdal.GetLastErrorMsg() expected = '`data/doctype.xml\' not recognized as a supported file format' if ds is None and expected in last_error: return pytest.fail() ############################################################################### # Issue several AllRegister() to check that GDAL drivers are good citizens def test_basic_test_6(): gdal.AllRegister() gdal.AllRegister() gdal.AllRegister() ############################################################################### # Test fix for #3077 (check that errors are cleared when using UseExceptions()) def basic_test_7_internal(): with pytest.raises(Exception): gdal.Open('non_existing_ds', gdal.GA_ReadOnly) # Special case: we should still be able to get the error message # until we call a new GDAL function assert matches_non_existing_error_msg(gdal.GetLastErrorMsg()), ('did not get expected error message, got %s' % gdal.GetLastErrorMsg()) # Special case: we should still be able to get the error message # until we call a new GDAL function assert matches_non_existing_error_msg(gdal.GetLastErrorMsg()), 'did not get expected error message, got %s' % gdal.GetLastErrorMsg() assert gdal.GetLastErrorType() != 0, 'did not get expected error type' # Should issue an implicit CPLErrorReset() gdal.GetCacheMax() assert gdal.GetLastErrorType() == 0, 'got unexpected error type' def test_basic_test_7(): old_use_exceptions_status = gdal.GetUseExceptions() gdal.UseExceptions() ret = basic_test_7_internal() if old_use_exceptions_status == 0: gdal.DontUseExceptions() return ret ############################################################################### # Test gdal.VersionInfo('RELEASE_DATE') and gdal.VersionInfo('LICENSE') def test_basic_test_8(): ret = gdal.VersionInfo('RELEASE_DATE') assert len(ret) == 8 python_exe = sys.executable if sys.platform == 'win32': python_exe = python_exe.replace('\\', '/') license_text = gdal.VersionInfo('LICENSE') assert ( license_text.startswith('GDAL/OGR is released under the MIT/X license') or 'GDAL/OGR Licensing' in license_text ) # Use a subprocess to avoid the cached license text env = os.environ.copy() env['GDAL_DATA'] = 'tmp' with open('tmp/LICENSE.TXT', 'wt') as f: f.write('fake_license') license_text = subprocess.check_output( [sys.executable, 'basic_test_subprocess.py'], env=env ).decode('utf-8') os.unlink('tmp/LICENSE.TXT') assert ( license_text.startswith(u'fake_license') ) ############################################################################### # Test gdal.PushErrorHandler() with a Python error handler def my_python_error_handler(eErrClass, err_no, msg): gdaltest.eErrClass = eErrClass gdaltest.err_no = err_no gdaltest.msg = msg def test_basic_test_9(): gdaltest.eErrClass = 0 gdaltest.err_no = 0 gdaltest.msg = '' gdal.PushErrorHandler(my_python_error_handler) gdal.Error(1, 2, 'test') gdal.PopErrorHandler() assert gdaltest.eErrClass == 1 assert gdaltest.err_no == 2 assert gdaltest.msg == 'test' ############################################################################### # Test gdal.PushErrorHandler() with a Python error handler as a method (#5186) class my_python_error_handler_class(object): def __init__(self): self.eErrClass = None self.err_no = None self.msg = None def handler(self, eErrClass, err_no, msg): self.eErrClass = eErrClass self.err_no = err_no self.msg = msg def test_basic_test_10(): # Check that reference counting works OK gdal.PushErrorHandler(my_python_error_handler_class().handler) gdal.Error(1, 2, 'test') gdal.PopErrorHandler() error_handler = my_python_error_handler_class() gdal.PushErrorHandler(error_handler.handler) gdal.Error(1, 2, 'test') gdal.PopErrorHandler() assert error_handler.eErrClass == 1 assert error_handler.err_no == 2 assert error_handler.msg == 'test' ############################################################################### # Test gdal.OpenEx() def test_basic_test_11(): ds = gdal.OpenEx('data/byte.tif') assert ds is not None ds = gdal.OpenEx('data/byte.tif', gdal.OF_RASTER) assert ds is not None ds = gdal.OpenEx('data/byte.tif', gdal.OF_VECTOR) assert ds is None ds = gdal.OpenEx('data/byte.tif', gdal.OF_RASTER | gdal.OF_VECTOR) assert ds is not None ds = gdal.OpenEx('data/byte.tif', gdal.OF_ALL) assert ds is not None ds = gdal.OpenEx('data/byte.tif', gdal.OF_UPDATE) assert ds is not None ds = gdal.OpenEx('data/byte.tif', gdal.OF_RASTER | gdal.OF_VECTOR | gdal.OF_UPDATE | gdal.OF_VERBOSE_ERROR) assert ds is not None ds = gdal.OpenEx('data/byte.tif', allowed_drivers=[]) assert ds is not None ds = gdal.OpenEx('data/byte.tif', allowed_drivers=['GTiff']) assert ds is not None ds = gdal.OpenEx('data/byte.tif', allowed_drivers=['PNG']) assert ds is None with gdaltest.error_handler(): ds = gdal.OpenEx('data/byte.tif', open_options=['FOO']) assert ds is not None ar_ds = [gdal.OpenEx('data/byte.tif', gdal.OF_SHARED) for _ in range(1024)] assert ar_ds[1023] is not None ar_ds = None ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_RASTER) assert ds is None ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_VECTOR) assert ds is not None assert ds.GetLayerCount() == 1 assert ds.GetLayer(0) is not None ds.GetLayer(0).GetMetadata() ds = gdal.OpenEx('../ogr/data/poly.shp', allowed_drivers=['ESRI Shapefile']) assert ds is not None ds = gdal.OpenEx('../ogr/data/poly.shp', gdal.OF_RASTER | gdal.OF_VECTOR) assert ds is not None ds = gdal.OpenEx('non existing') assert ds is None and gdal.GetLastErrorMsg() == '' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = gdal.OpenEx('non existing', gdal.OF_VERBOSE_ERROR) gdal.PopErrorHandler() assert ds is None and gdal.GetLastErrorMsg() != '' old_use_exceptions_status = gdal.GetUseExceptions() gdal.UseExceptions() got_exception = False try: ds = gdal.OpenEx('non existing') except RuntimeError: got_exception = True if old_use_exceptions_status == 0: gdal.DontUseExceptions() assert got_exception ############################################################################### # Test GDAL layer API def test_basic_test_12(): ds = gdal.GetDriverByName('MEMORY').Create('bar', 0, 0, 0) assert ds.GetDescription() == 'bar' lyr = ds.CreateLayer("foo") assert lyr is not None assert lyr.GetDescription() == 'foo' from osgeo import ogr assert lyr.TestCapability(ogr.OLCCreateField) == 1 assert ds.GetLayerCount() == 1 lyr = ds.GetLayerByName("foo") assert lyr is not None lyr = ds.GetLayerByIndex(0) assert lyr is not None lyr = ds.GetLayer(0) assert lyr is not None sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') assert sql_lyr is not None ds.ReleaseResultSet(sql_lyr) new_lyr = ds.CopyLayer(lyr, 'bar') assert new_lyr is not None assert ds.DeleteLayer(0) == 0 assert ds.DeleteLayer('bar') == 0 ds.SetStyleTable(ds.GetStyleTable()) ds = None ############################################################################### # Test correct sorting of StringList / metadata (#5540, #5557) def test_basic_test_13(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) for i in range(3): if i == 0: ds.SetMetadataItem("ScaleBounds", "True") ds.SetMetadataItem("ScaleBounds.MinScale", "0") ds.SetMetadataItem("ScaleBounds.MaxScale", "2000000") elif i == 1: ds.SetMetadataItem("ScaleBounds.MaxScale", "2000000") ds.SetMetadataItem("ScaleBounds.MinScale", "0") ds.SetMetadataItem("ScaleBounds", "True") else: ds.SetMetadataItem("ScaleBounds.MinScale", "0") ds.SetMetadataItem("ScaleBounds", "True") ds.SetMetadataItem("ScaleBounds.MaxScale", "2000000") assert ds.GetMetadataItem('scalebounds') == 'True' assert ds.GetMetadataItem('ScaleBounds') == 'True' assert ds.GetMetadataItem('SCALEBOUNDS') == 'True' assert ds.GetMetadataItem('ScaleBounds.MinScale') == '0' assert ds.GetMetadataItem('ScaleBounds.MaxScale') == '2000000' ds = None ds = gdal.GetDriverByName('MEM').Create('', 1, 1) for i in range(200): ds.SetMetadataItem("FILENAME_%d" % i, "%d" % i) for i in range(200): assert ds.GetMetadataItem("FILENAME_%d" % i) == '%d' % i ############################################################################### # Test SetMetadata() def test_basic_test_14(): ds = gdal.GetDriverByName('MEM').Create('', 1, 1) ds.SetMetadata('foo') assert ds.GetMetadata_List() == ['foo'] with pytest.raises(Exception): ds.SetMetadata(5) ds.SetMetadata(['foo=bar']) assert ds.GetMetadata_List() == ['foo=bar'] with pytest.raises(Exception): ds.SetMetadata([5]) ds.SetMetadata({'foo': 'baz'}) assert ds.GetMetadata_List() == ['foo=baz'] with pytest.raises(Exception): ds.SetMetadata({'foo': 5}) with pytest.raises(Exception): ds.SetMetadata({5: 'baz'}) with pytest.raises(Exception): ds.SetMetadata({5: 6}) if sys.version_info >= (3, 0, 0): val = '\u00e9ven' else: exec("val = u'\\u00e9ven'") ds.SetMetadata({'bar': val}) assert ds.GetMetadata()['bar'] == val ds.SetMetadata({val: 'baz'}) assert ds.GetMetadata()[val] == 'baz' with pytest.raises(Exception): ds.SetMetadata({val: 5}) with pytest.raises(Exception): ds.SetMetadata({5: val}) ############################################################################### # Test errors with progress callback def basic_test_15_cbk_no_argument(): return None def basic_test_15_cbk_no_ret(a, b, c): # pylint: disable=unused-argument return None def basic_test_15_cbk_bad_ret(a, b, c): # pylint: disable=unused-argument return 'ok' def test_basic_test_15(): mem_driver = gdal.GetDriverByName('MEM') with pytest.raises(Exception): with gdaltest.error_handler(): gdal.GetDriverByName('MEM').CreateCopy('', gdal.GetDriverByName('MEM').Create('', 1, 1), callback='foo') with gdaltest.error_handler(): ds = mem_driver.CreateCopy('', mem_driver.Create('', 1, 1), callback=basic_test_15_cbk_no_argument) assert ds is None with gdaltest.error_handler(): ds = mem_driver.CreateCopy('', mem_driver.Create('', 1, 1), callback=basic_test_15_cbk_no_ret) assert ds is not None with gdaltest.error_handler(): ds = mem_driver.CreateCopy('', mem_driver.Create('', 1, 1), callback=basic_test_15_cbk_bad_ret) assert ds is None ############################################################################### # Test unrecognized and recognized open options prefixed by @ def test_basic_test_16(): gdal.ErrorReset() gdal.OpenEx('data/byte.tif', open_options=['@UNRECOGNIZED=FOO']) assert gdal.GetLastErrorMsg() == '' gdal.ErrorReset() gdal.Translate('/vsimem/temp.tif', 'data/byte.tif', options='-co BLOCKYSIZE=10') with gdaltest.error_handler(): gdal.OpenEx('/vsimem/temp.tif', gdal.OF_UPDATE, open_options=['@NUM_THREADS=INVALID']) gdal.Unlink('/vsimem/temp.tif') assert gdal.GetLastErrorMsg() == 'Invalid value for NUM_THREADS: INVALID' ############################################################################### # Test mix of gdal/ogr.UseExceptions()/DontUseExceptions() def test_basic_test_17(): from osgeo import ogr for _ in range(2): ogr.UseExceptions() gdal.UseExceptions() try: gdal.Open('do_not_exist') except RuntimeError: pass gdal.DontUseExceptions() ogr.DontUseExceptions() assert not gdal.GetUseExceptions() assert not ogr.GetUseExceptions() for _ in range(2): ogr.UseExceptions() gdal.UseExceptions() try: gdal.Open('do_not_exist') except RuntimeError: pass flag = False try: ogr.DontUseExceptions() gdal.DontUseExceptions() flag = True except: gdal.DontUseExceptions() ogr.DontUseExceptions() assert not flag, 'expected failure' assert not gdal.GetUseExceptions() assert not ogr.GetUseExceptions() def test_gdal_getspatialref(): ds = gdal.Open('data/byte.tif') assert ds.GetSpatialRef() is not None ds = gdal.Open('data/minfloat.tif') assert ds.GetSpatialRef() is None def test_gdal_setspatialref(): ds = gdal.Open('data/byte.tif') sr = ds.GetSpatialRef() ds = gdal.GetDriverByName('MEM').Create('',1,1) ds.SetSpatialRef(sr) sr_got = ds.GetSpatialRef() assert sr_got assert sr_got.IsSame(sr) def test_gdal_getgcpspatialref(): ds = gdal.Open('data/byte.tif') assert ds.GetGCPSpatialRef() is None ds = gdal.Open('data/byte_gcp.tif') assert ds.GetGCPSpatialRef() is not None def test_gdal_setgcpspatialref(): ds = gdal.Open('data/byte.tif') sr = ds.GetSpatialRef() ds = gdal.GetDriverByName('MEM').Create('',1,1) gcp = gdal.GCP() gcp.GCPPixel = 0 gcp.GCPLine = 0 gcp.GCPX = 440720.000 gcp.GCPY = 3751320.000 ds.SetGCPs([gcp], sr) sr_got = ds.GetGCPSpatialRef() assert sr_got assert sr_got.IsSame(sr) gdalautotest-3.0.4/gcore/hfa_rfc40.py0000755003401500001440000003430613614005322017042 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: hfa_rfc40.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Tests Raster Attribute Table support in the HFA driver and in # particular, changes related to RFC40. # Author: Sam Gillingham # ############################################################################### # Copyright (c) 2013, Sam Gillingham # # 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 try: import numpy array = numpy.array except ImportError: numpy = None array = list pytestmark = pytest.mark.skipif(numpy is None, reason="numpy not available") INT_DATA = array([197, 83, 46, 29, 1, 78, 23, 90, 12, 45]) DOUBLE_DATA = array([0.1, 43.2, 78.1, 9.9, 23.0, 0.92, 82.5, 0.0, 1.0, 99.0]) STRING_DATA = array(["sddf", "wess", "grbgr", "dewd", "ddww", "qwsqw", "gbfgbf", "wwqw3", "e", ""]) STRING_DATA_INTS = array(["197", "83", "46", "29", "1", "78", "23", "90", "12", "45"]) STRING_DATA_DOUBLES = array(["0.1", "43.2", "78.1", "9.9", "23.0", "0.92", "82.5", "0.0", "1.0", "99.0"]) LONG_STRING_DATA = array(["sdfsdfsdfs", "sdweddw", "sdewdweee", "3423dedd", "jkejjjdjd", "edcdcdcdc", "fcdkmk4m534m", "edwededdd", "dedwedew", "wdedefrfrfrf"]) class HFATestError(Exception): pass def CreateAndWriteRAT(fname): """ Creates file and writes some data """ # create driver = gdal.GetDriverByName("HFA") ds = driver.Create(fname, 10, 10, 1, gdal.GDT_Byte) ds.SetGeoTransform([0, 1, 0, 0, 0, -1]) # write some image data band = ds.GetRasterBand(1) data = numpy.zeros((10, 10), numpy.uint8) data[5, 5] = 20 band.WriteArray(data) band.SetMetadataItem("LAYER_TYPE", "thematic") rat = band.GetDefaultRAT() rat.SetTableType(gdal.GRTT_THEMATIC) # create some columns if rat.CreateColumn("Ints", gdal.GFT_Integer, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("Doubles", gdal.GFT_Real, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("Strings", gdal.GFT_String, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") # for writing as different type if rat.CreateColumn("IntAsDouble", gdal.GFT_Integer, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("IntsAsString", gdal.GFT_Integer, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("DoubleAsInt", gdal.GFT_Real, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("DoubleAsString", gdal.GFT_Real, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("StringAsInt", gdal.GFT_String, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") if rat.CreateColumn("StringAsDouble", gdal.GFT_String, gdal.GFU_Generic) != gdal.CE_None: raise HFATestError("Create column failed") rat.SetRowCount(INT_DATA.size) # some basic checks if rat.GetRowCount() != INT_DATA.size: raise HFATestError('Wrong RowCount') if rat.GetColumnCount() != 9: raise HFATestError('Wrong Column Count') if rat.GetNameOfCol(1) != "Doubles": raise HFATestError('Wrong Column Count') if rat.GetUsageOfCol(1) != gdal.GFU_Generic: raise HFATestError("Wrong column usage") if rat.GetTypeOfCol(1) != gdal.GFT_Real: raise HFATestError("Wrong column usage") if rat.GetColOfUsage(gdal.GFU_Generic) != 0: raise HFATestError("Wrong col of usage") if not rat.ChangesAreWrittenToFile(): raise HFATestError("Wrong ChangesAreWrittenToFile") # Write data if rat.WriteArray(INT_DATA, 0) != gdal.CE_None: raise HFATestError("Failed to write int column") if rat.WriteArray(DOUBLE_DATA, 1) != gdal.CE_None: raise HFATestError("Failed to write double column") if rat.WriteArray(STRING_DATA, 2) != gdal.CE_None: raise HFATestError("Failed to write string column") # different types if rat.WriteArray(DOUBLE_DATA, 3) != gdal.CE_None: raise HFATestError("Failed to write doubles to int column") if rat.WriteArray(STRING_DATA_INTS, 4) != gdal.CE_None: raise HFATestError("Failed to write strings to int column") if rat.WriteArray(INT_DATA, 5) != gdal.CE_None: raise HFATestError("Failed to write ints to doubles column") if rat.WriteArray(STRING_DATA_DOUBLES, 6) != gdal.CE_None: raise HFATestError("Failed to write strings to doubles column") if rat.WriteArray(INT_DATA, 7) != gdal.CE_None: raise HFATestError("Failed to write ints to string column") if rat.WriteArray(DOUBLE_DATA, 8) != gdal.CE_None: raise HFATestError("Failed to write doubles to string column") # print('Succeeding writing data') # ds.FlushCache() ds = None def ReadAndCheckValues(fname, numrows): ds = gdal.Open(fname) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() if rat.GetTableType() != gdal.GRTT_THEMATIC: raise HFATestError("Wrong table type") if rat.GetRowCount() != numrows: raise HFATestError("Wrong number of rows") data = rat.ReadAsArray(0, 0, 10) if not (data == INT_DATA).all(): raise HFATestError("Int column does not match") data = rat.ReadAsArray(1, 0, 10) if not (data == DOUBLE_DATA).all(): raise HFATestError("double column does not match") data = rat.ReadAsArray(2, 0, 10) if not (data == STRING_DATA.astype(numpy.character)).all(): raise HFATestError("string column does not match") data = rat.ReadAsArray(3, 0, 10) if not (data == DOUBLE_DATA.astype(int)).all(): raise HFATestError("int as double column does not match") data = rat.ReadAsArray(4, 0, 10) if not (data == STRING_DATA_INTS.astype(numpy.int)).all(): raise HFATestError("int as string column does not match") data = rat.ReadAsArray(5, 0, 10) if not (data == INT_DATA).all(): raise HFATestError("double as int column does not match") data = rat.ReadAsArray(6, 0, 10) if not (data == STRING_DATA_DOUBLES.astype(numpy.double)).all(): raise HFATestError("double as string column does not match") data = rat.ReadAsArray(7, 0, 10) if not (data.astype(numpy.int) == INT_DATA).all(): raise HFATestError("string as int column does not match") data = rat.ReadAsArray(8, 0, 10) if not (data.astype(numpy.double) == DOUBLE_DATA).all(): raise HFATestError("string as int column does not match") # print('succeeded reading') ds = None def CheckSetGetValues(fname): # check the 'legacy' get and set value calls ds = gdal.Open(fname, gdal.GA_Update) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() # write data nrows = rat.GetRowCount() for i in range(nrows): # write some data slightly different rat.SetValueAsInt(i, 0, int(INT_DATA[i] + 1)) rat.SetValueAsDouble(i, 1, DOUBLE_DATA[i] + 1) s = STRING_DATA[i] s = s + 'z' rat.SetValueAsString(i, 2, s) # read data and check for i in range(nrows): if rat.GetValueAsInt(i, 0) != (INT_DATA[i] + 1): raise HFATestError("GetValueAsInt not reading correctly") if rat.GetValueAsDouble(i, 1) != (DOUBLE_DATA[i] + 1): raise HFATestError("GetValueAsDouble not reading correctly") s = STRING_DATA[i] s = s + 'z' if rat.GetValueAsString(i, 2) != s: raise HFATestError("GetValueAsString not reading correctly") # no need to check different types as ValuesIO is checked for this above # and these calls map to ValuesIO # write back old for i in range(nrows): rat.SetValueAsInt(i, 0, int(INT_DATA[i])) rat.SetValueAsDouble(i, 1, DOUBLE_DATA[i]) rat.SetValueAsString(i, 2, STRING_DATA[i]) # print("Get/SetValue OK") # ds.FlushCache() ds = None def ExtendAndWrite(fname): # write more data to the end of the RAT - will extend it ds = gdal.Open(fname, gdal.GA_Update) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() noldrows = rat.GetRowCount() # extend nrows = noldrows + INT_DATA.size rat.SetRowCount(nrows) # write new data if rat.WriteArray(INT_DATA, 0, 10) != gdal.CE_None: raise HFATestError("Failed to write int column") if rat.WriteArray(DOUBLE_DATA, 1, 10) != gdal.CE_None: raise HFATestError("Failed to write double column") if rat.WriteArray(STRING_DATA, 2, 10) != gdal.CE_None: raise HFATestError("Failed to write string column") # print('extend ok') # ds.FlushCache() ds = None def CheckExtension(fname): ds = gdal.Open(fname) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() data = rat.ReadAsArray(0, 10, 10) if not (data == INT_DATA).all(): raise HFATestError("Int column does not match") data = rat.ReadAsArray(1, 10, 10) if not (data == DOUBLE_DATA).all(): raise HFATestError("Double column does not match") data = rat.ReadAsArray(2, 10, 10) if not (data == STRING_DATA.astype(numpy.character)).all(): raise HFATestError("String column does not match") # print('extension data ok') ds = None def WriteLongStrings(fname): # this will force the string column to be re-written to accommodate # a longer string size ds = gdal.Open(fname, gdal.GA_Update) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() if rat.WriteArray(LONG_STRING_DATA, 2, 10) != gdal.CE_None: raise HFATestError("Failed to write string column") # print("wrote long strings ok") # ds.FlushCache() ds = None def CheckLongStrings(fname): ds = gdal.Open(fname) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() data = rat.ReadAsArray(2, 10, 10) if not (data == LONG_STRING_DATA.astype(numpy.character)).all(): raise HFATestError("String column does not match") # print("checked long strings ok") ds = None def SetLinearBinning(fname): ds = gdal.Open(fname, gdal.GA_Update) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() if rat.SetLinearBinning(0, 1) != gdal.CE_None: raise HFATestError("Error in SetLinearBinning") # print("set linear binning ok") # ds.FlushCache() ds = None def CheckLinearBinning(fname): ds = gdal.Open(fname) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() (state, mini, size) = rat.GetLinearBinning() if not state: raise HFATestError("GetLinearBinning failed") if mini != 0 or size != 1: raise HFATestError("GetLinearBinning values wrong") if rat.GetRowOfValue(3) != 3: raise HFATestError("GetRowOfValue value wrong") # print('linear binning ok') ds = None def CheckClone(fname): ds = gdal.Open(fname) band = ds.GetRasterBand(1) rat = band.GetDefaultRAT() cloned = rat.Clone() if cloned.GetTableType() != gdal.GRTT_THEMATIC: raise HFATestError("Cloned into wrong table type") if cloned.GetValueAsInt(0, 0) != 197: raise HFATestError("Cloned into wrong int") if cloned.GetValueAsDouble(5, 1) != 0.92: raise HFATestError("Cloned into wrong double") if cloned.GetValueAsString(1, 2) != "wess": raise HFATestError("Cloned into wrong string") # print("cloned ok") ds = None # basic tests def test_hfa_rfc40_1(): return CreateAndWriteRAT("tmp/test.img") def test_hfa_rfc40_2(): return ReadAndCheckValues("tmp/test.img", 10) # the older interface def test_hfa_rfc40_3(): return CheckSetGetValues("tmp/test.img") # make sure original data not changed def test_hfa_rfc40_4(): return ReadAndCheckValues("tmp/test.img", 10) # make it longer - data will be re-written def test_hfa_rfc40_5(): return ExtendAndWrite("tmp/test.img") # make sure old data not changed def test_hfa_rfc40_6(): return ReadAndCheckValues("tmp/test.img", 20) # new data at the end ok? def test_hfa_rfc40_7(): return CheckExtension("tmp/test.img") # write some longer strings - string column will # have to be re-written def test_hfa_rfc40_8(): return WriteLongStrings("tmp/test.img") # make sure old data not changed def test_hfa_rfc40_9(): return ReadAndCheckValues("tmp/test.img", 20) # check new data ok def test_hfa_rfc40_10(): return CheckLongStrings("tmp/test.img") # linear binning def test_hfa_rfc40_11(): return SetLinearBinning("tmp/test.img") # linear binning def test_hfa_rfc40_12(): return CheckLinearBinning("tmp/test.img") # clone def test_hfa_rfc40_13(): return CheckClone("tmp/test.img") # serialize not available from Python... def test_hfa_rfc40_cleanup(): gdal.GetDriverByName('HFA').Delete("tmp/test.img") gdalautotest-3.0.4/gcore/rasterio.py0000755003401500001440000011071413614005322017134 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: rasterio.py 8401c49a4e8509353d01b3d832705fbc28313741 2019-10-18 19:36:34 +0200 battisti-engineer $ # # Project: GDAL/OGR Test Suite # Purpose: Test default implementation of GDALRasterBand::IRasterIO # 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 struct import sys from osgeo import gdal import gdaltest import pytest ############################################################################### # Test writing a 1x1 buffer to a 10x6 raster and read it back def test_rasterio_1(): data = 'A'.encode('ascii') drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/rasterio1.tif', 10, 6, 1) ds.GetRasterBand(1).Fill(65) checksum = ds.GetRasterBand(1).Checksum() ds.GetRasterBand(1).Fill(0) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) assert checksum == ds.GetRasterBand(1).Checksum(), 'Didnt get expected checksum ' data2 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 1, 1) assert data2 == data, 'Didnt get expected buffer ' ds = None drv.Delete('tmp/rasterio1.tif') ############################################################################### # Test writing a 5x4 buffer to a 10x6 raster and read it back def test_rasterio_2(): data = 'AAAAAAAAAAAAAAAAAAAA'.encode('ascii') drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/rasterio2.tif', 10, 6, 1) ds.GetRasterBand(1).Fill(65) checksum = ds.GetRasterBand(1).Checksum() ds.GetRasterBand(1).Fill(0) ds.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, data, buf_type=gdal.GDT_Byte, buf_xsize=5, buf_ysize=4) assert checksum == ds.GetRasterBand(1).Checksum(), 'Didnt get expected checksum ' data2 = ds.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, 5, 4) assert data2 == data, 'Didnt get expected buffer ' ds = None drv.Delete('tmp/rasterio2.tif') ############################################################################### # Test extensive read & writes into a non tiled raster def test_rasterio_3(): data = [['' for i in range(4)] for i in range(5)] for xsize in range(5): for ysize in range(4): for m in range((xsize + 1) * (ysize + 1)): data[xsize][ysize] = data[xsize][ysize] + 'A' data[xsize][ysize] = data[xsize][ysize].encode('ascii') drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/rasterio3.tif', 10, 6, 1) i = 0 while i < ds.RasterXSize: j = 0 while j < ds.RasterYSize: k = 0 while k < ds.RasterXSize - i: m = 0 while m < ds.RasterYSize - j: for xsize in range(5): for ysize in range(4): ds.GetRasterBand(1).Fill(0) ds.WriteRaster(i, j, k + 1, m + 1, data[xsize][ysize], buf_type=gdal.GDT_Byte, buf_xsize=xsize + 1, buf_ysize=ysize + 1) data2 = ds.ReadRaster(i, j, k + 1, m + 1, xsize + 1, ysize + 1, gdal.GDT_Byte) assert data2 == data[xsize][ysize], \ 'Didnt get expected buffer ' m = m + 1 k = k + 1 j = j + 1 i = i + 1 ds = None drv.Delete('tmp/rasterio3.tif') ############################################################################### # Test extensive read & writes into a tiled raster def test_rasterio_4(): data = ['' for i in range(5 * 4)] for size in range(5 * 4): for k in range(size + 1): data[size] = data[size] + 'A' data[size] = data[size].encode('ascii') drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/rasterio4.tif', 20, 20, 1, options=['TILED=YES', 'BLOCKXSIZE=16', 'BLOCKYSIZE=16']) i = 0 while i < ds.RasterXSize: j = 0 while j < ds.RasterYSize: k = 0 while k < ds.RasterXSize - i: m = 0 while m < ds.RasterYSize - j: for xsize in range(5): for ysize in range(4): ds.GetRasterBand(1).Fill(0) ds.WriteRaster(i, j, k + 1, m + 1, data[(xsize + 1) * (ysize + 1) - 1], buf_type=gdal.GDT_Byte, buf_xsize=xsize + 1, buf_ysize=ysize + 1) data2 = ds.ReadRaster(i, j, k + 1, m + 1, xsize + 1, ysize + 1, gdal.GDT_Byte) if data2 != data[(xsize + 1) * (ysize + 1) - 1]: print(i, j, k, m, xsize, ysize) pytest.fail('Didnt get expected buffer ') m = m + 1 k = k + 1 if j >= 15: j = j + 1 else: j = j + 3 if i >= 15: i = i + 1 else: i = i + 3 ds = None drv.Delete('tmp/rasterio4.tif') ############################################################################### # Test error cases of ReadRaster() def test_rasterio_5(): ds = gdal.Open('data/byte.tif') for obj in [ds, ds.GetRasterBand(1)]: obj.ReadRaster(0, 0, -2000000000, 1, 1, 1) obj.ReadRaster(0, 0, 1, -2000000000, 1, 1) for band_number in [-1, 0, 2]: gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') res = ds.ReadRaster(0, 0, 1, 1, band_list=[band_number]) gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert res is None, 'expected None' assert error_msg.find('this band does not exist on dataset') != -1, \ 'did not get expected error msg' res = ds.ReadRaster(0, 0, 1, 1, band_list=[1, 1]) assert res is not None, 'expected non None' for obj in [ds, ds.GetRasterBand(1)]: gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') res = obj.ReadRaster(0, 0, 21, 21) gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert res is None, 'expected None' assert error_msg.find('Access window out of range in RasterIO()') != -1, \ 'did not get expected error msg (1)' # This should only fail on a 32bit build try: maxsize = sys.maxint except AttributeError: maxsize = sys.maxsize # On win64, maxsize == 2147483647 and ReadRaster() # fails because of out of memory condition, not # because of integer overflow. I'm not sure on how # to detect win64 better. if maxsize == 2147483647 and sys.platform != 'win32': gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') res = obj.ReadRaster(0, 0, 1, 1, 1000000, 1000000) gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert res is None, 'expected None' assert error_msg.find('Integer overflow') != -1, \ 'did not get expected error msg (2)' gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') res = obj.ReadRaster(0, 0, 0, 1) gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert res is None, 'expected None' assert error_msg.find('Illegal values for buffer size') != -1, \ 'did not get expected error msg (3)' ds = None ############################################################################### # Test error cases of WriteRaster() def test_rasterio_6(): ds = gdal.GetDriverByName('MEM').Create('', 2, 2) for obj in [ds, ds.GetRasterBand(1)]: with pytest.raises(Exception): obj.WriteRaster(0, 0, 2, 2, None) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') obj.WriteRaster(0, 0, 2, 2, ' ') gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert error_msg.find('Buffer too small') != -1, \ 'did not get expected error msg (1)' gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') obj.WriteRaster(-1, 0, 1, 1, ' ') gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert error_msg.find('Access window out of range in RasterIO()') != -1, \ 'did not get expected error msg (2)' gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') obj.WriteRaster(0, 0, 0, 1, ' ') gdal.PopErrorHandler() error_msg = gdal.GetLastErrorMsg() assert error_msg.find('Illegal values for buffer size') != -1, \ 'did not get expected error msg (3)' ds = None ############################################################################### # Test that default window reading works via ReadRaster() def test_rasterio_7(): ds = gdal.Open('data/byte.tif') data = ds.GetRasterBand(1).ReadRaster() assert len(data) == 400, 'did not read expected band data via ReadRaster()' data = ds.ReadRaster() assert len(data) == 400, 'did not read expected dataset data via ReadRaster()' ############################################################################### # Test callback of ReadRaster() def rasterio_8_progress_callback(pct, message, user_data): # pylint: disable=unused-argument if abs(pct - (user_data[0] + 0.05)) > 1e-5: print('Expected %f, got %f' % (user_data[0] + 0.05, pct)) user_data[1] = False user_data[0] = pct return 1 # 1 to continue, 0 to stop def rasterio_8_progress_interrupt_callback(pct, message, user_data): # pylint: disable=unused-argument user_data[0] = pct if pct >= 0.5: return 0 return 1 # 1 to continue, 0 to stop def rasterio_8_progress_callback_2(pct, message, user_data): # pylint: disable=unused-argument if pct < user_data[0]: print('Got %f, last pct was %f' % (pct, user_data[0])) return 0 user_data[0] = pct return 1 # 1 to continue, 0 to stop def test_rasterio_8(): ds = gdal.Open('data/byte.tif') # Progress not implemented yet if gdal.GetConfigOption('GTIFF_DIRECT_IO') == 'YES' or \ gdal.GetConfigOption('GTIFF_VIRTUAL_MEM_IO') == 'YES': pytest.skip() # Test RasterBand.ReadRaster tab = [0, True] data = ds.GetRasterBand(1).ReadRaster(resample_alg=gdal.GRIORA_NearestNeighbour, callback=rasterio_8_progress_callback, callback_data=tab) assert len(data) == 400, 'did not read expected band data via ReadRaster()' assert abs(tab[0] - 1) <= 1e-5 and tab[1] # Test interruption tab = [0] data = ds.GetRasterBand(1).ReadRaster(resample_alg=gdal.GRIORA_NearestNeighbour, callback=rasterio_8_progress_interrupt_callback, callback_data=tab) assert data is None assert tab[0] >= 0.50 # Test RasterBand.ReadRaster with type change tab = [0, True] data = ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Int16, callback=rasterio_8_progress_callback, callback_data=tab) assert data is not None, 'did not read expected band data via ReadRaster()' assert abs(tab[0] - 1) <= 1e-5 and tab[1] # Same with interruption tab = [0] data = ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Int16, callback=rasterio_8_progress_interrupt_callback, callback_data=tab) assert data is None and tab[0] >= 0.50 # Test RasterBand.ReadRaster with resampling tab = [0, True] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=40, callback=rasterio_8_progress_callback, callback_data=tab) assert data is not None, 'did not read expected band data via ReadRaster()' assert abs(tab[0] - 1) <= 1e-5 and tab[1] # Same with interruption tab = [0] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=40, callback=rasterio_8_progress_interrupt_callback, callback_data=tab) assert data is None and tab[0] >= 0.50 # Test Dataset.ReadRaster tab = [0, True] data = ds.ReadRaster(resample_alg=gdal.GRIORA_NearestNeighbour, callback=rasterio_8_progress_callback, callback_data=tab) assert len(data) == 400, 'did not read expected dataset data via ReadRaster()' assert abs(tab[0] - 1) <= 1e-5 and tab[1] ds = None # Test Dataset.ReadRaster on a multi band file, with INTERLEAVE=BAND ds = gdal.Open('data/rgbsmall.tif') last_pct = [0] data = ds.ReadRaster(resample_alg=gdal.GRIORA_NearestNeighbour, callback=rasterio_8_progress_callback_2, callback_data=last_pct) assert not (data is None or abs(last_pct[0] - 1.0) > 1e-5) # Same with interruption tab = [0] data = ds.ReadRaster(callback=rasterio_8_progress_interrupt_callback, callback_data=tab) assert data is None and tab[0] >= 0.50 ds = None # Test Dataset.ReadRaster on a multi band file, with INTERLEAVE=PIXEL ds = gdal.Open('data/rgbsmall_cmyk.tif') last_pct = [0] data = ds.ReadRaster(resample_alg=gdal.GRIORA_NearestNeighbour, callback=rasterio_8_progress_callback_2, callback_data=last_pct) assert not (data is None or abs(last_pct[0] - 1.0) > 1e-5) # Same with interruption tab = [0] data = ds.ReadRaster(callback=rasterio_8_progress_interrupt_callback, callback_data=tab) assert data is None and tab[0] >= 0.50 ############################################################################### # Test resampling algorithm of ReadRaster() def rasterio_9_progress_callback(pct, message, user_data): # pylint: disable=unused-argument if pct < user_data[0]: print('Got %f, last pct was %f' % (pct, user_data[0])) return 0 user_data[0] = pct if user_data[1] is not None and pct >= user_data[1]: return 0 return 1 # 1 to continue, 0 to stop def rasterio_9_checksum(data, buf_xsize, buf_ysize, data_type=gdal.GDT_Byte): ds = gdal.GetDriverByName('MEM').Create('', buf_xsize, buf_ysize, 1) ds.GetRasterBand(1).WriteRaster(0, 0, buf_xsize, buf_ysize, data, buf_type=data_type) cs = ds.GetRasterBand(1).Checksum() return cs def test_rasterio_9(): ds = gdal.Open('data/byte.tif') # Test RasterBand.ReadRaster, with Bilinear tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Int16, buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Bilinear, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None data_ar = struct.unpack('h' * 10 * 10, data) cs = rasterio_9_checksum(data, 10, 10, data_type=gdal.GDT_Int16) assert cs == 1211 assert abs(tab[0] - 1.0) <= 1e-5 # Same but query with GDT_Float32. Check that we do not get floating-point # values, since the band type is Byte data = ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Float32, buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Bilinear) data_float32_ar = struct.unpack('f' * 10 * 10, data) assert data_ar == data_float32_ar # Test RasterBand.ReadRaster, with Lanczos tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Lanczos, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 10, 10) assert cs == 1154 assert abs(tab[0] - 1.0) <= 1e-5 # Test RasterBand.ReadRaster, with Bilinear and UInt16 data type src_ds_uint16 = gdal.Open('data/uint16.tif') tab = [0, None] data = src_ds_uint16.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_UInt16, buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Bilinear, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 10, 10, data_type=gdal.GDT_UInt16) assert cs == 1211 assert abs(tab[0] - 1.0) <= 1e-5 # Test RasterBand.ReadRaster, with Bilinear on Complex, thus using warp API tab = [0, None] complex_ds = gdal.GetDriverByName('MEM').Create('', 20, 20, 1, gdal.GDT_CInt16) complex_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, ds.GetRasterBand(1).ReadRaster(), buf_type=gdal.GDT_Byte) data = complex_ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Bilinear, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 10, 10, data_type=gdal.GDT_CInt16) assert cs == 1211 assert abs(tab[0] - 1.0) <= 1e-5 # Test interruption tab = [0, 0.5] gdal.PushErrorHandler('CPLQuietErrorHandler') data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Bilinear, callback=rasterio_9_progress_callback, callback_data=tab) gdal.PopErrorHandler() assert data is None assert tab[0] >= 0.50 # Test RasterBand.ReadRaster, with Gauss, and downsampling tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Gauss, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 10, 10) assert cs == 1089 assert abs(tab[0] - 1.0) <= 1e-5 # Test RasterBand.ReadRaster, with Cubic, and downsampling tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10, resample_alg=gdal.GRIORA_Cubic, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 10, 10) assert cs == 1059 assert abs(tab[0] - 1.0) <= 1e-5 # Test RasterBand.ReadRaster, with Cubic, and downsampling with >=8x8 source samples used for a dest sample data = ds.GetRasterBand(1).ReadRaster(buf_xsize=5, buf_ysize=5, resample_alg=gdal.GRIORA_Cubic) assert data is not None cs = rasterio_9_checksum(data, 5, 5) assert cs == 214 # Same with UInt16 data = src_ds_uint16.GetRasterBand(1).ReadRaster(buf_xsize=5, buf_ysize=5, resample_alg=gdal.GRIORA_Cubic) assert data is not None cs = rasterio_9_checksum(data, 5, 5, data_type=gdal.GDT_UInt16) assert cs == 214 # Test RasterBand.ReadRaster, with Cubic and supersampling tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=40, buf_ysize=40, resample_alg=gdal.GRIORA_Cubic, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 40, 40) assert cs == 19556 assert abs(tab[0] - 1.0) <= 1e-5 # Test Dataset.ReadRaster, with Cubic and supersampling tab = [0, None] data = ds.ReadRaster(buf_xsize=40, buf_ysize=40, resample_alg=gdal.GRIORA_CubicSpline, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 40, 40) assert cs == 19041 assert abs(tab[0] - 1.0) <= 1e-5 # Test Dataset.ReadRaster on a multi band file, with INTERLEAVE=PIXEL ds = gdal.Open('data/rgbsmall_cmyk.tif') tab = [0, None] data = ds.ReadRaster(buf_xsize=25, buf_ysize=25, resample_alg=gdal.GRIORA_Cubic, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data[0:25 * 25], 25, 25) assert cs == 5975 cs = rasterio_9_checksum(data[25 * 25:2 * 25 * 25], 25, 25) assert cs == 6248 assert abs(tab[0] - 1.0) <= 1e-5 ds = None # Test Band.ReadRaster on a RGBA with parts fully opaque, and fully transparent and with huge upscaling ds = gdal.Open('data/stefan_full_rgba.png') tab = [0, None] data = ds.GetRasterBand(1).ReadRaster(buf_xsize=162 * 16, buf_ysize=150 * 16, resample_alg=gdal.GRIORA_Cubic, callback=rasterio_9_progress_callback, callback_data=tab) assert data is not None cs = rasterio_9_checksum(data, 162 * 16, 150 * 16) assert cs == 30836 assert abs(tab[0] - 1.0) <= 1e-5 ############################################################################### # Test error when getting a block def test_rasterio_10(): ds = gdal.Open('data/byte_truncated.tif') gdal.PushErrorHandler() data = ds.GetRasterBand(1).ReadRaster() gdal.PopErrorHandler() assert data is None # Change buffer type gdal.PushErrorHandler() data = ds.GetRasterBand(1).ReadRaster(buf_type=gdal.GDT_Int16) gdal.PopErrorHandler() assert data is None # Resampling case gdal.PushErrorHandler() data = ds.GetRasterBand(1).ReadRaster(buf_xsize=10, buf_ysize=10) gdal.PopErrorHandler() assert data is None ############################################################################### # Test cubic resampling and nbits def test_rasterio_11(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() mem_ds = gdal.GetDriverByName('MEM').Create('', 4, 3) mem_ds.GetRasterBand(1).WriteArray(numpy.array([[80, 125, 125, 80], [80, 125, 125, 80], [80, 125, 125, 80]])) # A bit dummy mem_ds.GetRasterBand(1).SetMetadataItem('NBITS', '8', 'IMAGE_STRUCTURE') ar = mem_ds.GetRasterBand(1).ReadAsArray(0, 0, 4, 3, 8, 3, resample_alg=gdal.GRIORA_Cubic) assert ar.max() == 129 # NBITS=7 mem_ds.GetRasterBand(1).SetMetadataItem('NBITS', '7', 'IMAGE_STRUCTURE') ar = mem_ds.GetRasterBand(1).ReadAsArray(0, 0, 4, 3, 8, 3, resample_alg=gdal.GRIORA_Cubic) # Would overshoot to 129 if NBITS was ignored assert ar.max() == 127 ############################################################################### # Test cubic resampling on dataset RasterIO with an alpha channel def rasterio_12_progress_callback(pct, message, user_data): if pct < user_data[0]: print('Got %f, last pct was %f' % (pct, user_data[0])) return 0 user_data[0] = pct return 1 # 1 to continue, 0 to stop def test_rasterio_12(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() mem_ds = gdal.GetDriverByName('MEM').Create('', 4, 3, 4) for i in range(3): mem_ds.GetRasterBand(i + 1).SetColorInterpretation(gdal.GCI_GrayIndex) mem_ds.GetRasterBand(4).SetColorInterpretation(gdal.GCI_AlphaBand) for i in range(4): mem_ds.GetRasterBand(i + 1).WriteArray(numpy.array([[0, 0, 0, 0], [0, 255, 0, 0], [0, 0, 0, 0]])) tab = [0] ar_ds = mem_ds.ReadAsArray(0, 0, 4, 3, buf_xsize=8, buf_ysize=3, resample_alg=gdal.GRIORA_Cubic, callback=rasterio_12_progress_callback, callback_data=tab) assert tab[0] == 1.0 ar_ds2 = mem_ds.ReadAsArray(0, 0, 4, 3, buf_xsize=8, buf_ysize=3, resample_alg=gdal.GRIORA_Cubic) assert numpy.array_equal(ar_ds, ar_ds2) ar_bands = [mem_ds.GetRasterBand(i + 1).ReadAsArray(0, 0, 4, 3, buf_xsize=8, buf_ysize=3, resample_alg=gdal.GRIORA_Cubic) for i in range(4)] # Results of band or dataset RasterIO should be the same for i in range(4): assert numpy.array_equal(ar_ds[i], ar_bands[i]) # First, second and third band should have identical content assert numpy.array_equal(ar_ds[0], ar_ds[1]) # Alpha band should be different assert not numpy.array_equal(ar_ds[0], ar_ds[3]) ############################################################################### # Test cubic resampling with masking def test_rasterio_13(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() for dt in [gdal.GDT_Byte, gdal.GDT_UInt16, gdal.GDT_UInt32]: mem_ds = gdal.GetDriverByName('MEM').Create('', 4, 3, 1, dt) mem_ds.GetRasterBand(1).SetNoDataValue(0) mem_ds.GetRasterBand(1).WriteArray(numpy.array([[0, 0, 0, 0], [0, 255, 0, 0], [0, 0, 0, 0]])) ar_ds = mem_ds.ReadAsArray(0, 0, 4, 3, buf_xsize=8, buf_ysize=3, resample_alg=gdal.GRIORA_Cubic) expected_ar = numpy.array([[0, 0, 0, 0, 0, 0, 0, 0], [0, 255, 255, 255, 255, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]) assert numpy.array_equal(ar_ds, expected_ar), dt ############################################################################### # Test average downsampling by a factor of 2 on exact boundaries def test_rasterio_14(): gdal.FileFromMemBuffer('/vsimem/rasterio_14.asc', """ncols 6 nrows 6 xllcorner 0 yllcorner 0 cellsize 0 0 0 100 0 0 0 0 100 0 0 0 100 0 0 0 0 100 0 100 0 100 0 0 0 0 100 0 100 0 0 0 0 0 0 0 100""") ds = gdal.Translate('/vsimem/rasterio_14_out.asc', '/vsimem/rasterio_14.asc', options='-of AAIGRID -r average -outsize 50% 50%') cs = ds.GetRasterBand(1).Checksum() assert cs == 110, ds.ReadAsArray() gdal.Unlink('/vsimem/rasterio_14.asc') gdal.Unlink('/vsimem/rasterio_14_out.asc') ds = gdal.GetDriverByName('MEM').Create('', 1000000, 1) ds.GetRasterBand(1).WriteRaster(ds.RasterXSize - 1, 0, 1, 1, struct.pack('B' * 1, 100)) data = ds.ReadRaster(buf_xsize=int(ds.RasterXSize / 2), buf_ysize=1, resample_alg=gdal.GRIORA_Average) data = struct.unpack('B' * int(ds.RasterXSize / 2), data) assert data[-1:][0] == 50 data = ds.ReadRaster(ds.RasterXSize - 2, 0, 2, 1, buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Average) data = struct.unpack('B' * 1, data) assert data[0] == 50 ds = gdal.GetDriverByName('MEM').Create('', 1, 1000000) ds.GetRasterBand(1).WriteRaster(0, ds.RasterYSize - 1, 1, 1, struct.pack('B' * 1, 100)) data = ds.ReadRaster(buf_xsize=1, buf_ysize=int(ds.RasterYSize / 2), resample_alg=gdal.GRIORA_Average) data = struct.unpack('B' * int(ds.RasterYSize / 2), data) assert data[-1:][0] == 50 data = ds.ReadRaster(0, ds.RasterYSize - 2, 1, 2, buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Average) data = struct.unpack('B' * 1, data) assert data[0] == 50 ############################################################################### # Test average oversampling by an integer factor (should behave like nearest) def test_rasterio_15(): gdal.FileFromMemBuffer('/vsimem/rasterio_15.asc', """ncols 2 nrows 2 xllcorner 0 yllcorner 0 cellsize 0 0 100 100 100""") ds = gdal.Translate('/vsimem/rasterio_15_out.asc', '/vsimem/rasterio_15.asc', options='-of AAIGRID -outsize 200% 200%') data_ref = ds.GetRasterBand(1).ReadRaster() ds = None ds = gdal.Translate('/vsimem/rasterio_15_out.asc', '/vsimem/rasterio_15.asc', options='-of AAIGRID -r average -outsize 200% 200%') data = ds.GetRasterBand(1).ReadRaster() cs = ds.GetRasterBand(1).Checksum() assert data == data_ref and cs == 134, ds.ReadAsArray() gdal.Unlink('/vsimem/rasterio_15.asc') gdal.Unlink('/vsimem/rasterio_15_out.asc') ############################################################################### # Test mode downsampling by a factor of 2 on exact boundaries def test_rasterio_16(): gdal.FileFromMemBuffer('/vsimem/rasterio_16.asc', """ncols 6 nrows 6 xllcorner 0 yllcorner 0 cellsize 0 0 0 0 0 0 0 2 100 0 0 0 0 100 100 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0""") ds = gdal.Translate('/vsimem/rasterio_16_out.asc', '/vsimem/rasterio_16.asc', options='-of AAIGRID -r mode -outsize 50% 50%') cs = ds.GetRasterBand(1).Checksum() assert cs == 15, ds.ReadAsArray() gdal.Unlink('/vsimem/rasterio_16.asc') gdal.Unlink('/vsimem/rasterio_16_out.asc') ############################################################################### def test_rasterio_nodata(): try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() ndv = 123 btype = [ gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_Int32, gdal.GDT_Float32, gdal.GDT_Float64 ] ### create a MEM dataset for src_type in btype: mem_ds = gdal.GetDriverByName('MEM').Create('', 10, 9, 1, src_type) mem_ds.GetRasterBand(1).SetNoDataValue(ndv) mem_ds.GetRasterBand(1).Fill(ndv) for dst_type in btype: if ( dst_type > src_type ): ### read to a buffer of a wider type (and resample) data = mem_ds.GetRasterBand(1).ReadAsArray(0, 0, 10, 9, 4, 3, resample_alg=gdal.GRIORA_Bilinear, buf_type=dst_type) assert int(data[0,0]) == ndv, 'did not read expected band data via ReadAsArray() - src type -> dst type: ' + str( src_type ) + ' -> ' + str( dst_type ) ############################################################################### def test_rasterio_lanczos_nodata(): ds = gdal.Open('data/rasterio_lanczos_nodata.tif') data = ds.GetRasterBand(1).ReadRaster(buf_xsize=9, buf_ysize=9, resample_alg=gdal.GRIORA_Lanczos) data_ar = struct.unpack('H' * 9 * 9, data) expected_ar = (0, 0, 0, 22380, 22417, 22509, 22525, 22505, 22518, 0, 0, 0, 22415, 22432, 22433, 22541, 22541, 22568, 0, 0, 0, 22355, 22378, 22429, 22468, 22562, 22591, 0, 0, 0, 22271, 22343, 22384, 22526, 22565, 22699, 0, 0, 0, 22404, 22345, 22537, 22590, 22582, 22645, 0, 0, 0, 22461, 22484, 22464, 22495, 22633, 22638, 0, 0, 0, 22481, 22466, 22500, 22534, 22536, 22571, 0, 0, 0, 22460, 22460, 22547, 22538, 22456, 22572, 0, 0, 0, 0, 22504, 22496, 22564, 22563, 22610) assert data_ar == expected_ar ############################################################################### def test_rasterio_resampled_value_is_nodata(): gdal.FileFromMemBuffer('/vsimem/in.asc', """ncols 4 nrows 4 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 nodata_value 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""") ds = gdal.Open('/vsimem/in.asc') data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Lanczos) data_ar = struct.unpack('f' * 1, data) expected_ar = (1.1754943508222875e-38, ) assert data_ar == expected_ar data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Average) data_ar = struct.unpack('f' * 1, data) expected_ar = (1.1754943508222875e-38, ) assert data_ar == expected_ar gdal.Unlink('/vsimem/in.asc') gdal.FileFromMemBuffer('/vsimem/in.asc', """ncols 4 nrows 4 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 nodata_value 0 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1""") ds = gdal.Open('/vsimem/in.asc') data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Lanczos) data_ar = struct.unpack('I' * 1, data) expected_ar = (1, ) assert data_ar == expected_ar data = ds.GetRasterBand(1).ReadRaster(buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Average) data_ar = struct.unpack('I' * 1, data) expected_ar = (1, ) assert data_ar == expected_ar gdal.Unlink('/vsimem/in.asc') def test_rasterio_dataset_readarray_cint16(): try: from osgeo import gdalnumeric gdalnumeric.zeros import numpy except (ImportError, AttributeError): pytest.skip() mem_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 2, gdal.GDT_CInt16) mem_ds.GetRasterBand(1).WriteArray(numpy.array([[1 + 2j]])) mem_ds.GetRasterBand(2).WriteArray(numpy.array([[3 + 4j]])) got = mem_ds.GetRasterBand(1).ReadAsArray() assert got == numpy.array([[1 + 2j]]) got = mem_ds.ReadAsArray() assert got[0] == numpy.array([[1 + 2j]]) assert got[1] == numpy.array([[3 + 4j]]) def test_rasterio_rasterband_write_on_readonly(): ds = gdal.Open('data/byte.tif') band = ds.GetRasterBand(1) with gdaltest.error_handler(): err = band.WriteRaster(0, 0, 20, 20, band.ReadRaster()) assert err != 0 def test_rasterio_dataset_write_on_readonly(): ds = gdal.Open('data/byte.tif') with gdaltest.error_handler(): err = ds.WriteRaster(0, 0, 20, 20, ds.ReadRaster()) assert err != 0 gdalautotest-3.0.4/gcore/nodatamaskband.py0000755003401500001440000001007513614005322020252 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: nodatamaskband.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDALNoDataMaskBand # 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 struct from osgeo import gdal def test_nodatamaskband_1(): for (dt, struct_type, v) in [(gdal.GDT_Byte, 'B', 255), (gdal.GDT_Int16, 'h', 32767), (gdal.GDT_UInt16, 'H', 65535), (gdal.GDT_Int32, 'i', 0x7FFFFFFF), (gdal.GDT_UInt32, 'I', 0xFFFFFFFF), (gdal.GDT_Float32, 'f', 1.25), (gdal.GDT_Float32, 'f', float('nan')), (gdal.GDT_Float64, 'd', 1.2345678), (gdal.GDT_Float64, 'd', float('nan'))]: ds = gdal.GetDriverByName('MEM').Create('', 6, 4, 1, dt) ds.GetRasterBand(1).SetNoDataValue(v) ds.GetRasterBand(1).WriteRaster(0, 0, 6, 4, struct.pack(struct_type * 6 * 4, v, 1, 1, v, v, 0, v, 1, 1, v, v, 0, v, 1, 1, v, v, 0, 0, v, v, 0, 0, 0)) data = ds.GetRasterBand(1).GetMaskBand().ReadRaster() data_ar = struct.unpack('B' * 6 * 4, data) expected_ar = (0, 255, 255, 0, 0, 255, 0, 255, 255, 0, 0, 255, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 255) assert data_ar == expected_ar, dt data = ds.GetRasterBand(1).GetMaskBand().ReadBlock(0, 0) data_ar = struct.unpack('B' * 6 * 1, data) expected_ar = (0, 255, 255, 0, 0, 255) assert data_ar == expected_ar, dt data = ds.GetRasterBand(1).GetMaskBand().ReadBlock(0, 3) data_ar = struct.unpack('B' * 6 * 1, data) expected_ar = (255, 0, 0, 255, 255, 255) assert data_ar == expected_ar, dt data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( buf_xsize=3, buf_ysize=2) data_ar = struct.unpack('B' * 3 * 2, data) expected_ar = (255, 0, 255, 0, 255, 255) assert data_ar == expected_ar, dt data = ds.GetRasterBand(1).GetMaskBand().ReadRaster( buf_type=gdal.GDT_UInt16, buf_xsize=3, buf_ysize=2) data_ar = struct.unpack('H' * 3 * 2, data) expected_ar = (255, 0, 255, 0, 255, 255) assert data_ar == expected_ar, dt gdalautotest-3.0.4/gcore/pnm_write.py0000755003401500001440000000343413614005322017310 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: pnm_write.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for portable anymap file format # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # # 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. ############################################################################### import pytest import gdaltest init_list = [ ('byte.tif', 4672), ('uint16.tif', 4672)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.parametrize( 'testfunction', [ 'testCreateCopy', 'testCreate', ] ) @pytest.mark.require_driver('PNM') def test_pnm_create(filename, checksum, testfunction): ut = gdaltest.GDALTest('PNM', filename, 1, checksum) getattr(ut, testfunction)() gdalautotest-3.0.4/gcore/vsihdfs.py0000755003401500001440000001060213614005322016745 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: vsihdfs.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test VSI file primitives # Author: James McClain # ############################################################################### # Copyright (c) 2011-2013, Even Rouault # Copyright (c) 2018, Azavea # # 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 def test_vsihdfs_1(): filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' fp = gdal.VSIFOpenL(filename, 'rb') if fp is None: gdaltest.have_vsihdfs = False pytest.skip() gdaltest.have_vsihdfs = True data = gdal.VSIFReadL(5, 1, fp) assert data and data.decode('ascii') == 'Lorem' data = gdal.VSIFReadL(1, 6, fp) assert data and data.decode('ascii') == ' ipsum' gdal.VSIFCloseL(fp) # Seek test def test_vsihdfs_2(): if gdaltest.have_vsihdfs == False: pytest.skip() filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' fp = gdal.VSIFOpenL(filename, 'rb') assert fp is not None gdal.VSIFSeekL(fp, 2, 0) # From beginning gdal.VSIFSeekL(fp, 5, 0) data = gdal.VSIFReadL(6, 1, fp) assert data and data.decode('ascii') == ' ipsum' gdal.VSIFSeekL(fp, 7, 1) # From current data = gdal.VSIFReadL(3, 1, fp) assert data and data.decode('ascii') == 'sit' gdal.VSIFSeekL(fp, 9, 2) # From end data = gdal.VSIFReadL(7, 1, fp) assert data and data.decode('ascii') == 'laborum' gdal.VSIFCloseL(fp) # Tell test def test_vsihdfs_3(): if gdaltest.have_vsihdfs == False: pytest.skip() filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' fp = gdal.VSIFOpenL(filename, 'rb') assert fp is not None data = gdal.VSIFReadL(5, 1, fp) assert data and data.decode('ascii') == 'Lorem' offset = gdal.VSIFTellL(fp) assert offset == 5 gdal.VSIFCloseL(fp) # Write test def test_vsihdfs_4(): pytest.skip() # EOF test def test_vsihdfs_5(): if gdaltest.have_vsihdfs == False: pytest.skip() filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' fp = gdal.VSIFOpenL(filename, 'rb') assert fp is not None gdal.VSIFReadL(5, 1, fp) eof = gdal.VSIFEofL(fp) assert eof == 0 gdal.VSIFReadL(1000000, 1, fp) eof = gdal.VSIFEofL(fp) assert eof == 0 gdal.VSIFReadL(1, 1, fp) eof = gdal.VSIFEofL(fp) assert eof == 1 gdal.VSIFSeekL(fp, 0, 0) eof = gdal.VSIFEofL(fp) assert eof == 0 gdal.VSIFCloseL(fp) # Stat test def test_vsihdfs_6(): if gdaltest.have_vsihdfs == False: pytest.skip() filename = '/vsihdfs/file:' + os.getcwd() + '/data/text.txt' statBuf = gdal.VSIStatL(filename, 0) assert statBuf filename = '/vsihdfs/file:' + os.getcwd() + '/data/no-such-file.txt' statBuf = gdal.VSIStatL(filename, 0) assert not statBuf # ReadDir test def test_vsihdfs_7(): if gdaltest.have_vsihdfs == False: pytest.skip() dirname = '/vsihdfs/file:' + os.getcwd() + '/data/' lst = gdal.ReadDir(dirname) assert len(lst) >= 360 gdalautotest-3.0.4/gcore/gcps2geotransform.py0000755003401500001440000001334613614005322020754 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: misc.py 26369 2013-08-25 19:48:28Z goatbar $ # # Project: GDAL/OGR Test Suite # Purpose: Test the GDALGCPsToGeoTransform() method. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2013 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 ############################################################################### # Helper to make gcps def _list2gcps(src_list): gcp_list = [] for src_tuple in src_list: gcp = gdal.GCP() gcp.GCPPixel = src_tuple[0] gcp.GCPLine = src_tuple[1] gcp.GCPX = src_tuple[2] gcp.GCPY = src_tuple[3] gcp_list.append(gcp) return gcp_list ############################################################################### # Test simple exact case of turning GCPs into a GeoTransform. def test_gcps2gt_1(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.0, 0.0, 400000, 370000), (100.0, 0.0, 410000, 370000), (100.0, 200.0, 410000, 368000) ])) assert gdaltest.geotransform_equals( gt, (400000.0, 100.0, 0.0, 370000.0, 0.0, -10.0), 0.000001) ############################################################################### # Similar but non-exact. def test_gcps2gt_2(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.0, 0.0, 400000, 370000), (100.0, 0.0, 410000, 370000), (100.0, 200.0, 410000, 368000), (0.0, 200.0, 400000, 368000.01) ])) assert gdaltest.geotransform_equals( gt, (400000.0, 100.0, 0.0, 370000.0025, -5e-05, -9.999975), 0.000001) ############################################################################### # bApproxOK false, and no good solution. def test_gcps2gt_3(): approx_ok = 0 gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.0, 0.0, 400000, 370000), (100.0, 0.0, 410000, 370000), (100.0, 200.0, 410000, 368000), (0.0, 200.0, 400000, 360000) ]), approx_ok) assert gt is None, 'Expected failure when no good solution.' ############################################################################### # Single point - Should return None. def test_gcps2gt_4(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.0, 0.0, 400000, 370000), ])) assert gt is None, 'Expected failure for single GCP.' ############################################################################### # Two points - simple offset and scale, no rotation. def test_gcps2gt_5(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.0, 0.0, 400000, 370000), (100.0, 200.0, 410000, 368000), ])) assert gdaltest.geotransform_equals( gt, (400000.0, 100.0, 0.0, 370000.0, 0.0, -10.0), 0.000001) ############################################################################### # Special case for four points in a particular order. Exact result. def test_gcps2gt_6(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (400000, 370000, 400000, 370000), (410000, 370000, 410000, 370000), (410000, 368000, 410000, 368000), (400000, 368000, 400000, 368000), ])) assert gdaltest.geotransform_equals( gt, (0.0, 1.0, 0.0, 0.0, 0.0, 1.0), 0.000001) ############################################################################### # Try a case that is hard to do without normalization. def test_gcps2gt_7(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (400000, 370000, 400000, 370000), (410000, 368000, 410000, 368000), (410000, 370000, 410000, 370000), (400000, 368000, 400000, 368000), ])) assert gdaltest.geotransform_equals( gt, (0.0, 1.0, 0.0, 0.0, 0.0, 1.0), 0.000001) ############################################################################### # A fairly messy real world case without a easy to predict result. def test_gcps2gt_8(): gt = gdal.GCPsToGeoTransform(_list2gcps([ (0.01, 0.04, -87.05528672907, 39.22759504228), (0.01, 2688.02, -86.97079900719, 39.27075713986), (4031.99, 2688.04, -87.05960736744, 39.37569137000), (1988.16, 1540.80, -87.055069186699924, 39.304963106777514), (1477.41, 2400.83, -87.013419295885001, 39.304705030894979), (1466.02, 2376.92, -87.013906298363295, 39.304056190007913), ])) gt_expected = (-87.056612873288, -2.232795668658e-05, 3.178617809303e-05, 39.227856615716, 2.6091510188921e-05, 1.596921026218e-05) assert gdaltest.geotransform_equals(gt, gt_expected, 0.00001) gdalautotest-3.0.4/gcore/vsigs.py0000755003401500001440000014144013614005323016440 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsigs.py 4e7ce5fcadef46f94d6a548a04d389224fc9a99c 2019-02-11 11:30:42 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsigs # 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. ############################################################################### import stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_vsigs_init(): gdaltest.gs_vars = {} for var in ('GS_SECRET_ACCESS_KEY', 'GS_ACCESS_KEY_ID', 'GOOGLE_APPLICATION_CREDENTIALS', 'CPL_GS_TIMESTAMP', 'CPL_GS_ENDPOINT', 'GDAL_HTTP_HEADER_FILE'): gdaltest.gs_vars[var] = gdal.GetConfigOption(var) if gdaltest.gs_vars[var] is not None: gdal.SetConfigOption(var, "") # To avoid user credentials in ~/.boto # to mess up our tests gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '') gdal.SetConfigOption('GS_OAUTH2_REFRESH_TOKEN', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_EMAIL', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_SECRET', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_ID', '') gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '') with gdaltest.config_option('CPL_GCE_SKIP', 'YES'): assert gdal.GetSignedURL('/vsigs/foo/bar') is None ############################################################################### # Error cases def test_vsigs_1(): if not gdaltest.built_against_curl(): pytest.skip() # Invalid header filename gdal.ErrorReset() with gdaltest.config_option('GDAL_HTTP_HEADER_FILE', '/i_dont/exist.py'): with gdaltest.config_option('CPL_GCE_SKIP', 'YES'): with gdaltest.error_handler(): f = open_for_read('/vsigs/foo/bar') if f is not None: gdal.VSIFCloseL(f) pytest.fail() last_err = gdal.GetLastErrorMsg() assert 'Cannot read' in last_err # Invalid content for header file with gdaltest.config_option('GDAL_HTTP_HEADER_FILE', 'vsigs.py'): with gdaltest.config_option('CPL_GCE_SKIP', 'YES'): f = open_for_read('/vsigs/foo/bar') if f is not None: gdal.VSIFCloseL(f) pytest.fail() # Missing GS_SECRET_ACCESS_KEY gdal.ErrorReset() with gdaltest.config_option('CPL_GCE_SKIP', 'YES'): with gdaltest.error_handler(): f = open_for_read('/vsigs/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('GS_SECRET_ACCESS_KEY') >= 0 gdal.ErrorReset() with gdaltest.config_option('CPL_GCE_SKIP', 'YES'): with gdaltest.error_handler(): f = open_for_read('/vsigs_streaming/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('GS_SECRET_ACCESS_KEY') >= 0 gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', 'GS_SECRET_ACCESS_KEY') # Missing GS_ACCESS_KEY_ID gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsigs/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('GS_ACCESS_KEY_ID') >= 0 gdal.SetConfigOption('GS_ACCESS_KEY_ID', 'GS_ACCESS_KEY_ID') # ERROR 1: The User Id you provided does not exist in our records. gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsigs/foo/bar.baz') if f is not None or gdal.VSIGetLastErrorMsg() == '': if f is not None: gdal.VSIFCloseL(f) if gdal.GetConfigOption('APPVEYOR') is not None: return pytest.fail(gdal.VSIGetLastErrorMsg()) gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsigs_streaming/foo/bar.baz') assert f is None and gdal.VSIGetLastErrorMsg() != '' ############################################################################### def test_vsigs_start_webserver(): 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_GS_ENDPOINT', 'http://127.0.0.1:%d/' % gdaltest.webserver_port) gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', 'GS_SECRET_ACCESS_KEY') gdal.SetConfigOption('GS_ACCESS_KEY_ID', 'GS_ACCESS_KEY_ID') ############################################################################### # Test with a fake Google Cloud Storage server def test_vsigs_2(): if gdaltest.webserver_port == 0: pytest.skip() # header file gdal.FileFromMemBuffer('/vsimem/my_headers.txt', 'foo: bar') handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket_http_header_file/resource', 200, {'Content-type': 'text/plain'}, 'Y', expected_headers={'foo': 'bar'}) with webserver.install_http_handler(handler): with gdaltest.config_option('GDAL_HTTP_HEADER_FILE', '/vsimem/my_headers.txt'): f = open_for_read('/vsigs/gs_fake_bucket_http_header_file/resource') assert f is not None data = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(data) == 1 gdal.Unlink('/vsimem/my_headers.txt') gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', 'GS_SECRET_ACCESS_KEY') gdal.SetConfigOption('GS_ACCESS_KEY_ID', 'GS_ACCESS_KEY_ID') gdal.SetConfigOption('CPL_GS_TIMESTAMP', 'my_timestamp') signed_url = gdal.GetSignedURL('/vsigs/gs_fake_bucket/resource', ['START_DATE=20180212T123456Z']) assert (signed_url in ('http://127.0.0.1:8080/gs_fake_bucket/resource?Expires=1518442496&GoogleAccessId=GS_ACCESS_KEY_ID&Signature=xTphUyMqtKA6UmAX3PEr5VL3EOg%3D', 'http://127.0.0.1:8081/gs_fake_bucket/resource?Expires=1518442496&GoogleAccessId=GS_ACCESS_KEY_ID&Signature=xTphUyMqtKA6UmAX3PEr5VL3EOg%3D')) handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket/resource', 200, {'Content-type': 'text/plain'}, 'foo', expected_headers={'Authorization': 'GOOG1 GS_ACCESS_KEY_ID:8tndu9//BfmN+Kg4AFLdUMZMBDQ='}) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket/resource', 200, {'Content-type': 'text/plain'}, 'foo', expected_headers={'Authorization': 'GOOG1 GS_ACCESS_KEY_ID:8tndu9//BfmN+Kg4AFLdUMZMBDQ='}) with webserver.install_http_handler(handler): f = open_for_read('/vsigs_streaming/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket/resource2.bin', 206, {'Content-Range': 'bytes 0-0/1000000'}, 'x') with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsigs/gs_fake_bucket/resource2.bin') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() handler = webserver.SequentialHandler() handler.add('HEAD', '/gs_fake_bucket/resource2.bin', 200, {'Content-Length': 1000000}) with webserver.install_http_handler(handler): stat_res = gdal.VSIStatL('/vsigs_streaming/gs_fake_bucket/resource2.bin') if stat_res is None or stat_res.size != 1000000: if stat_res is not None: print(stat_res.size) else: print(stat_res) pytest.fail() ############################################################################### # Test ReadDir() with a fake Google Cloud Storage server def test_vsigs_readdir(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', 200, {'Content-type': 'application/xml'}, """ a_dir/ bla a_dir/resource3.bin 1970-01-01T00:00:01.000Z 123456 """) handler.add('GET', '/gs_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F', 200, {'Content-type': 'application/xml'}, """ a_dir/ a_dir/resource4.bin 2015-10-16T12:34:56.000Z 456789 a_dir/subdir/ """) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket2/a_dir/resource3.bin') if f is None: if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail() gdal.VSIFCloseL(f) dir_contents = gdal.ReadDir('/vsigs/gs_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] assert gdal.VSIStatL('/vsigs/gs_fake_bucket2/a_dir/resource3.bin').size == 123456 assert gdal.VSIStatL('/vsigs/gs_fake_bucket2/a_dir/resource3.bin').mtime == 1 # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir('/vsigs/gs_fake_bucket2/a_dir/resource3.bin') assert dir_contents is None # List buckets handler = webserver.SequentialHandler() handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, """ mybucket """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsigs/') assert dir_contents == ['mybucket'] ############################################################################### # Test write def test_vsigs_write(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() f = gdal.VSIFOpenL('/vsigs/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = '' while True: numchars = int(request.rfile.readline().strip(), 16) content += request.rfile.read(numchars).decode('ascii') request.rfile.read(2) if numchars == 0: break if len(content) != 40000: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL('x' * 35000, 1, 35000, f) ret += gdal.VSIFWriteL('x' * 5000, 1, 5000, f) if ret != 40000: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) # Simulate failure while transmitting f = gdal.VSIFOpenL('/vsigs/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.VSIFWriteL('x' * 35000, 1, 35000, f) if ret != 0: gdal.VSIFCloseL(f) pytest.fail(ret) gdal.VSIFCloseL(f) # Simulate failure at end of transfer f = gdal.VSIFOpenL('/vsigs/test_copy/file.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = '' while True: numchars = int(request.rfile.readline().strip(), 16) content += request.rfile.read(numchars).decode('ascii') request.rfile.read(2) if numchars == 0: break request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/test_copy/file.bin', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL('x' * 35000, 1, 35000, f) if ret != 35000: gdal.VSIFCloseL(f) pytest.fail(ret) with gdaltest.error_handler(): ret = gdal.VSIFCloseL(f) assert ret != 0 ############################################################################### # Test write with retry def test_vsigs_write_retry(): if gdaltest.webserver_port == 0: pytest.skip() gdal.VSICurlClearCache() with gdaltest.config_options({'GDAL_HTTP_MAX_RETRY': '2', 'GDAL_HTTP_RETRY_DELAY': '0.01'}): f = gdal.VSIFOpenL('/vsigs/test_write_retry/put_with_retry.bin', 'wb') assert f is not None handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = '' while True: numchars = int(request.rfile.readline().strip(), 16) content += request.rfile.read(numchars).decode('ascii') request.rfile.read(2) if numchars == 0: break if len(content) != 3: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/test_write_retry/put_with_retry.bin', 502) handler.add('PUT', '/test_write_retry/put_with_retry.bin', custom_method=method) with webserver.install_http_handler(handler): assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 gdal.VSIFCloseL(f) ############################################################################### # Read credentials with OAuth2 refresh_token def test_vsigs_read_credentials_refresh_token_default_gdal_app(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', 'http://localhost:%d/accounts.google.com/o/oauth2/token' % gdaltest.webserver_port) gdal.SetConfigOption('GS_OAUTH2_REFRESH_TOKEN', 'REFRESH_TOKEN') with gdaltest.error_handler(): assert gdal.GetSignedURL('/vsigs/foo/bar') is None gdal.VSICurlClearCache() handler = webserver.SequentialHandler() def method(request): content = request.rfile.read(int(request.headers['Content-Length'])).decode('ascii') if content != 'refresh_token=REFRESH_TOKEN&client_id=265656308688.apps.googleusercontent.com&client_secret=0IbTUDOYzaL6vnIdWTuQnvLz&grant_type=refresh_token': sys.stderr.write('Bad POST content: %s\n' % content) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') content = """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""" request.send_header('Content-Length', len(content)) request.end_headers() request.wfile.write(content.encode('ascii')) handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) 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.add('GET', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', None) gdal.SetConfigOption('GS_OAUTH2_REFRESH_TOKEN', '') ############################################################################### # Read credentials with OAuth2 refresh_token def test_vsigs_read_credentials_refresh_token_custom_app(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', 'http://localhost:%d/accounts.google.com/o/oauth2/token' % gdaltest.webserver_port) gdal.SetConfigOption('GS_OAUTH2_REFRESH_TOKEN', 'REFRESH_TOKEN') gdal.SetConfigOption('GS_OAUTH2_CLIENT_ID', 'CLIENT_ID') gdal.SetConfigOption('GS_OAUTH2_CLIENT_SECRET', 'CLIENT_SECRET') gdal.VSICurlClearCache() handler = webserver.SequentialHandler() def method(request): content = request.rfile.read(int(request.headers['Content-Length'])).decode('ascii') if content != 'refresh_token=REFRESH_TOKEN&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token': sys.stderr.write('Bad POST content: %s\n' % content) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') content = """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""" request.send_header('Content-Length', len(content)) request.end_headers() request.wfile.write(content.encode('ascii')) handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) 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.add('GET', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', None) gdal.SetConfigOption('GS_OAUTH2_REFRESH_TOKEN', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_ID', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_SECRET', '') ############################################################################### # Read credentials with OAuth2 service account def test_vsigs_read_credentials_oauth2_service_account(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') # Generated with 'openssl genrsa -out rsa-openssl.pem 1024' and # 'openssl pkcs8 -nocrypt -in rsa-openssl.pem -inform PEM -topk8 -outform PEM -out rsa-openssl.pkcs8.pem' # DO NOT USE in production !!!! key = """-----BEGIN PRIVATE KEY----- MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOlwJQLLDG1HeLrk VNcFR5Qptto/rJE5emRuy0YmkVINT4uHb1be7OOo44C2Ev8QPVtNHHS2XwCY5gTm i2RfIBLv+VDMoVQPqqE0LHb0WeqGmM5V1tHbmVnIkCcKMn3HpK30grccuBc472LQ DVkkGqIiGu0qLAQ89JP/r0LWWySRAgMBAAECgYAWjsS00WRBByAOh1P/dz4kfidy TabiXbiLDf3MqJtwX2Lpa8wBjAc+NKrPXEjXpv0W3ou6Z4kkqKHJpXGg4GRb4N5I 2FA+7T1lA0FCXa7dT2jvgJLgpBepJu5b//tqFqORb4A4gMZw0CiPN3sUsWsSw5Hd DrRXwp6sarzG77kvZQJBAPgysAmmXIIp9j1hrFSkctk4GPkOzZ3bxKt2Nl4GFrb+ bpKSon6OIhP1edrxTz1SMD1k5FiAAVUrMDKSarbh5osCQQDwxq4Tvf/HiYz79JBg Wz5D51ySkbg01dOVgFW3eaYAdB6ta/o4vpHhnbrfl6VO9oUb3QR4hcrruwnDHsw3 4mDTAkEA9FPZjbZSTOSH/cbgAXbdhE4/7zWOXj7Q7UVyob52r+/p46osAk9i5qj5 Kvnv2lrFGDrwutpP9YqNaMtP9/aLnwJBALLWf9n+GAv3qRZD0zEe1KLPKD1dqvrj j+LNjd1Xp+tSVK7vMs4PDoAMDg+hrZF3HetSQM3cYpqxNFEPgRRJOy0CQQDQlZHI yzpSgEiyx8O3EK1iTidvnLXbtWabvjZFfIE/0OhfBmN225MtKG3YLV2HoUvpajLq gwE6fxOLyJDxuWRf -----END PRIVATE KEY----- """ for i in range(2): gdal.SetConfigOption('GO2A_AUD', 'http://localhost:%d/oauth2/v4/token' % gdaltest.webserver_port) gdal.SetConfigOption('GOA2_NOW', '123456') if i == 0: gdal.SetConfigOption('GS_OAUTH2_PRIVATE_KEY', key) else: gdal.FileFromMemBuffer('/vsimem/pkey', key) gdal.SetConfigOption('GS_OAUTH2_PRIVATE_KEY_FILE', '/vsimem/pkey') gdal.SetConfigOption('GS_OAUTH2_CLIENT_EMAIL', 'CLIENT_EMAIL') gdal.VSICurlClearCache() handler = webserver.SequentialHandler() def method(request): content = request.rfile.read(int(request.headers['Content-Length'])).decode('ascii') content_8080 = 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAiQ0xJRU5UX0VNQUlMIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZGV2c3RvcmFnZS5yZWFkX3dyaXRlIiwgImF1ZCI6ICJodHRwOi8vbG9jYWxob3N0OjgwODAvb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.DAhqWtBgKpObxZ%2BGiXqwF%2Fa4SS%2FNWQRhLCI7DYZCuOTuf2w7dL8j4CdpiwwzQg1diIus7dyViRfzpsFmuZKAXwL%2B84iBoVVqnJJZ4TgwH49NdfMAnc4Rgm%2Bo2a2nEcMjX%2FbQ3jRY%2B9WNVl96hzULGvLrVeyego2f06wivqmvxHA%3D' content_8081 = 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAiQ0xJRU5UX0VNQUlMIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZGV2c3RvcmFnZS5yZWFkX3dyaXRlIiwgImF1ZCI6ICJodHRwOi8vbG9jYWxob3N0OjgwODEvb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.0abOEg4%2FRApWTSeAs6YTHaNzdwOgZLm8DTMO2MKlOA%2Fiagyb4cBJxDpkD5gECPvi7qhkg7LsyFuj0a%2BK48Bsuj%2FgLHOU4MpB0dHwYnDO2UXzH%2FUPdgFCVak1P1V%2ByiDA%2B%2Ft4aDI5fD9qefKQiu3wsMDHzP71MNLzayrjqaqKKS4%3D' if content not in [content_8080, content_8081]: sys.stderr.write('Bad POST content: %s\n' % content) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') content = """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""" request.send_header('Content-Length', len(content)) request.end_headers() request.wfile.write(content.encode('ascii')) handler.add('POST', '/oauth2/v4/token', custom_method=method) 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.add('GET', '/gs_fake_bucket/resource', custom_method=method) try: with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) except: if gdal.GetLastErrorMsg().find('CPLRSASHA256Sign() not implemented') >= 0: pytest.skip() finally: gdal.SetConfigOption('GO2A_AUD', None) gdal.SetConfigOption('GO2A_NOW', None) gdal.SetConfigOption('GS_OAUTH2_PRIVATE_KEY', '') gdal.SetConfigOption('GS_OAUTH2_PRIVATE_KEY_FILE', '') gdal.SetConfigOption('GS_OAUTH2_CLIENT_EMAIL', '') assert data == 'foo' gdal.Unlink('/vsimem/pkey') ############################################################################### # Read credentials with OAuth2 service account through a json configuration file def test_vsigs_read_credentials_oauth2_service_account_json_file(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') gdal.FileFromMemBuffer('/vsimem/service_account.json', """{ "private_key": "-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOlwJQLLDG1HeLrk\nVNcFR5Qptto/rJE5emRuy0YmkVINT4uHb1be7OOo44C2Ev8QPVtNHHS2XwCY5gTm\ni2RfIBLv+VDMoVQPqqE0LHb0WeqGmM5V1tHbmVnIkCcKMn3HpK30grccuBc472LQ\nDVkkGqIiGu0qLAQ89JP/r0LWWySRAgMBAAECgYAWjsS00WRBByAOh1P/dz4kfidy\nTabiXbiLDf3MqJtwX2Lpa8wBjAc+NKrPXEjXpv0W3ou6Z4kkqKHJpXGg4GRb4N5I\n2FA+7T1lA0FCXa7dT2jvgJLgpBepJu5b//tqFqORb4A4gMZw0CiPN3sUsWsSw5Hd\nDrRXwp6sarzG77kvZQJBAPgysAmmXIIp9j1hrFSkctk4GPkOzZ3bxKt2Nl4GFrb+\nbpKSon6OIhP1edrxTz1SMD1k5FiAAVUrMDKSarbh5osCQQDwxq4Tvf/HiYz79JBg\nWz5D51ySkbg01dOVgFW3eaYAdB6ta/o4vpHhnbrfl6VO9oUb3QR4hcrruwnDHsw3\n4mDTAkEA9FPZjbZSTOSH/cbgAXbdhE4/7zWOXj7Q7UVyob52r+/p46osAk9i5qj5\nKvnv2lrFGDrwutpP9YqNaMtP9/aLnwJBALLWf9n+GAv3qRZD0zEe1KLPKD1dqvrj\nj+LNjd1Xp+tSVK7vMs4PDoAMDg+hrZF3HetSQM3cYpqxNFEPgRRJOy0CQQDQlZHI\nyzpSgEiyx8O3EK1iTidvnLXbtWabvjZFfIE/0OhfBmN225MtKG3YLV2HoUvpajLq\ngwE6fxOLyJDxuWRf\n-----END PRIVATE KEY-----\n", "client_email": "CLIENT_EMAIL" }""") gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '/vsimem/service_account.json') gdal.SetConfigOption('GO2A_AUD', 'http://localhost:%d/oauth2/v4/token' % gdaltest.webserver_port) gdal.SetConfigOption('GOA2_NOW', '123456') gdal.VSICurlClearCache() handler = webserver.SequentialHandler() def method(request): content = request.rfile.read(int(request.headers['Content-Length'])).decode('ascii') content_8080 = 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAiQ0xJRU5UX0VNQUlMIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZGV2c3RvcmFnZS5yZWFkX3dyaXRlIiwgImF1ZCI6ICJodHRwOi8vbG9jYWxob3N0OjgwODAvb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.DAhqWtBgKpObxZ%2BGiXqwF%2Fa4SS%2FNWQRhLCI7DYZCuOTuf2w7dL8j4CdpiwwzQg1diIus7dyViRfzpsFmuZKAXwL%2B84iBoVVqnJJZ4TgwH49NdfMAnc4Rgm%2Bo2a2nEcMjX%2FbQ3jRY%2B9WNVl96hzULGvLrVeyego2f06wivqmvxHA%3D' content_8081 = 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAiQ0xJRU5UX0VNQUlMIiwgInNjb3BlIjogImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvZGV2c3RvcmFnZS5yZWFkX3dyaXRlIiwgImF1ZCI6ICJodHRwOi8vbG9jYWxob3N0OjgwODEvb2F1dGgyL3Y0L3Rva2VuIiwgImlhdCI6IDEyMzQ1NiwgImV4cCI6IDEyNzA1Nn0%3D.0abOEg4%2FRApWTSeAs6YTHaNzdwOgZLm8DTMO2MKlOA%2Fiagyb4cBJxDpkD5gECPvi7qhkg7LsyFuj0a%2BK48Bsuj%2FgLHOU4MpB0dHwYnDO2UXzH%2FUPdgFCVak1P1V%2ByiDA%2B%2Ft4aDI5fD9qefKQiu3wsMDHzP71MNLzayrjqaqKKS4%3D' if content not in [content_8080, content_8081]: sys.stderr.write('Bad POST content: %s\n' % content) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') content = """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""" request.send_header('Content-Length', len(content)) request.end_headers() request.wfile.write(content.encode('ascii')) handler.add('POST', '/oauth2/v4/token', custom_method=method) 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.add('GET', '/gs_fake_bucket/resource', custom_method=method) try: with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') if f is None: gdal.Unlink('/vsimem/service_account.json') pytest.fail() data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) signed_url = gdal.GetSignedURL('/vsigs/gs_fake_bucket/resource', ['START_DATE=20180212T123456Z']) if signed_url not in ('http://127.0.0.1:8080/gs_fake_bucket/resource?Expires=1518442496&GoogleAccessId=CLIENT_EMAIL&Signature=b19I62KdqV51DpWGxhxGXLGJIA8MHvSJofwOygoeQuIxkM6PmmQFvJYTNWRt9zUVTUoVC0UHVB7ee5Z35NqDC8K4i0quu1hb8Js2B4h0W6OAupvyF3nSQ5D0OJmiSbomGMq0Ehyro5cqJ%2FU%2Fd8oAaKrGKVQScKfXoFrSJBbWkNs%3D', 'http://127.0.0.1:8081/gs_fake_bucket/resource?Expires=1518442496&GoogleAccessId=CLIENT_EMAIL&Signature=b19I62KdqV51DpWGxhxGXLGJIA8MHvSJofwOygoeQuIxkM6PmmQFvJYTNWRt9zUVTUoVC0UHVB7ee5Z35NqDC8K4i0quu1hb8Js2B4h0W6OAupvyF3nSQ5D0OJmiSbomGMq0Ehyro5cqJ%2FU%2Fd8oAaKrGKVQScKfXoFrSJBbWkNs%3D'): gdal.Unlink('/vsimem/service_account.json') pytest.fail(signed_url) except: if gdal.GetLastErrorMsg().find('CPLRSASHA256Sign() not implemented') >= 0: pytest.skip() finally: gdal.SetConfigOption('GO2A_AUD', None) gdal.SetConfigOption('GO2A_NOW', None) gdal.SetConfigOption('GOOGLE_APPLICATION_CREDENTIALS', '') gdal.Unlink('/vsimem/service_account.json') assert data == 'foo' ############################################################################### # Read credentials from simulated ~/.boto def test_vsigs_read_credentials_file(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '/vsimem/.boto') gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/.boto', """ [unrelated] gs_access_key_id = foo gs_secret_access_key = bar [Credentials] gs_access_key_id = GS_ACCESS_KEY_ID gs_secret_access_key = GS_SECRET_ACCESS_KEY [unrelated] gs_access_key_id = foo gs_secret_access_key = bar """) 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 = 'GOOG1 GS_ACCESS_KEY_ID:8tndu9//BfmN+Kg4AFLdUMZMBDQ=' 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', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '') gdal.Unlink('/vsimem/.boto') ############################################################################### # Read credentials from simulated ~/.boto def test_vsigs_read_credentials_file_refresh_token(): if gdaltest.webserver_port == 0: pytest.skip() gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '/vsimem/.boto') gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', 'http://localhost:%d/accounts.google.com/o/oauth2/token' % gdaltest.webserver_port) gdal.VSICurlClearCache() gdal.FileFromMemBuffer('/vsimem/.boto', """ [Credentials] gs_oauth2_refresh_token = REFRESH_TOKEN [OAuth2] client_id = CLIENT_ID client_secret = CLIENT_SECRET """) handler = webserver.SequentialHandler() def method(request): content = request.rfile.read(int(request.headers['Content-Length'])).decode('ascii') if content != 'refresh_token=REFRESH_TOKEN&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token': sys.stderr.write('Bad POST content: %s\n' % content) request.send_response(403) return request.send_response(200) request.send_header('Content-type', 'text/plain') content = """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 3600, }""" request.send_header('Content-Length', len(content)) request.end_headers() request.wfile.write(content.encode('ascii')) handler.add('POST', '/accounts.google.com/o/oauth2/token', custom_method=method) 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.add('GET', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '') gdal.SetConfigOption('GOA2_AUTH_URL_TOKEN', None) gdal.Unlink('/vsimem/.boto') ############################################################################### # Read credentials from simulated GCE instance def test_vsigs_read_credentials_gce(): if gdaltest.webserver_port == 0: pytest.skip() if sys.platform not in ('linux', 'linux2', 'win32'): pytest.skip() gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '') gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') 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, }""") handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' # Set a fake URL to check that credentials re-use works gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', '') handler = webserver.SequentialHandler() handler.add('GET', '/gs_fake_bucket/bar', 200, {}, 'bar') with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/bar') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar' with gdaltest.error_handler(): assert gdal.GetSignedURL('/vsigs/foo/bar') is None gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', '') gdal.SetConfigOption('CPL_GCE_CHECK_LOCAL_FILES', None) ############################################################################### # Read credentials from simulated GCE instance with expiration of the # cached credentials def test_vsigs_read_credentials_gce_expiration(): if gdaltest.webserver_port == 0: pytest.skip() if sys.platform not in ('linux', 'linux2', 'win32'): pytest.skip() gdal.SetConfigOption('CPL_GS_CREDENTIALS_FILE', '') gdal.SetConfigOption('GS_SECRET_ACCESS_KEY', '') gdal.SetConfigOption('GS_ACCESS_KEY_ID', '') 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() # First time is used when trying to establish if GCE authentication is available handler.add('GET', '/computeMetadata/v1/instance/service-accounts/default/token', 200, {}, """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 0, }""") # Second time is needed because f the access to th file handler.add('GET', '/computeMetadata/v1/instance/service-accounts/default/token', 200, {}, """{ "access_token" : "ACCESS_TOKEN", "token_type" : "Bearer", "expires_in" : 0, }""") handler.add('GET', '/gs_fake_bucket/resource', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsigs/gs_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' gdal.SetConfigOption('CPL_GCE_CREDENTIALS_URL', '') gdal.SetConfigOption('CPL_GCE_CHECK_LOCAL_FILES', None) ############################################################################### def test_vsigs_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_vsigs_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() # if gdal.GetConfigOption('GS_SECRET_ACCESS_KEY') is None: # print('Missing GS_SECRET_ACCESS_KEY') # pytest.skip() # elif gdal.GetConfigOption('GS_ACCESS_KEY_ID') is None: # print('Missing GS_ACCESS_KEY_ID') # pytest.skip() gs_resource = gdal.GetConfigOption('GS_RESOURCE') if gs_resource is None: pytest.skip('Missing GS_RESOURCE') if '/' not in gs_resource: path = '/vsigs/' + gs_resource statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'vsigs_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) ret = gdal.Mkdir(subpath, 0) assert ret != 0, ('Mkdir(%s) repeated should return an error' % subpath) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, \ ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsigs/' + gs_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Same with /vsigs_streaming/ f = open_for_read('/vsigs_streaming/' + gs_resource) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 if False: # pylint: disable=using-constant-test # we actually try to read at read() time and bSetError = false # Invalid bucket : "The specified bucket does not exist" gdal.ErrorReset() f = open_for_read('/vsigs/not_existing_bucket/foo') with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert gdal.VSIGetLastErrorMsg() != '' # Invalid resource gdal.ErrorReset() f = open_for_read('/vsigs_streaming/' + gs_resource + '/invalid_resource.baz') assert f is None, gdal.VSIGetLastErrorMsg() # Test GetSignedURL() signed_url = gdal.GetSignedURL('/vsigs/' + gs_resource) f = open_for_read('/vsicurl_streaming/' + signed_url) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 ############################################################################### def test_vsigs_cleanup(): for var in gdaltest.gs_vars: gdal.SetConfigOption(var, gdaltest.gs_vars[var]) gdalautotest-3.0.4/gcore/thread_test.py0000755003401500001440000000540113614005323017607 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: thread_test.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test Python threading # 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 threading from osgeo import gdal import pytest def my_error_handler(err_type, err_no, err_msg): # pylint: disable=unused-argument pass def thread_test_1_worker(args_dict): for i in range(1000): ds = gdal.Open('data/byte.tif') if (i % 2) == 0: if ds.GetRasterBand(1).Checksum() != 4672: args_dict['ret'] = False else: ds.GetRasterBand(1).ReadAsArray() for i in range(1000): gdal.PushErrorHandler(my_error_handler) ds = gdal.Open('i_dont_exist') gdal.PopErrorHandler() def test_thread_test_1(): try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() threads = [] args_array = [] for i in range(4): args_dict = {'ret': True} t = threading.Thread(target=thread_test_1_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' return ret gdalautotest-3.0.4/gcore/numpy_rw.py0000755003401500001440000005672713614005323017202 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: numpy_rw.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic integration with Numeric Python. # Author: Frank Warmerdam, warmerdam@pobox.com # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # 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 gdaltest from osgeo import gdal import pytest ############################################################################### # verify that we can load Numeric python, and find the Numpy driver. def test_numpy_rw_1(): gdaltest.numpy_drv = None try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() gdal.AllRegister() gdaltest.numpy_drv = gdal.GetDriverByName('NUMPY') assert gdaltest.numpy_drv is not None, 'NUMPY driver not found!' ############################################################################### # Load a test file into a memory Numpy array, and verify the checksum. def test_numpy_rw_2(): if gdaltest.numpy_drv is None: pytest.skip() from osgeo import gdalnumeric array = gdalnumeric.LoadFile('data/utmsmall.tif') assert array is not None, 'Failed to load utmsmall.tif into array' ds = gdalnumeric.OpenArray(array) assert ds is not None, 'Failed to open memory array as dataset.' bnd = ds.GetRasterBand(1) assert bnd.Checksum() == 50054, 'Didnt get expected checksum on reopened file' ds = None ############################################################################### # Test loading complex data. def test_numpy_rw_3(): if gdaltest.numpy_drv is None: pytest.skip() ds = gdal.Open('data/cint_sar.tif') array = ds.ReadAsArray() assert array[2][3] == 116 - 16j, 'complex value read improperly.' ############################################################################### # Test a band read with downsampling. def test_numpy_rw_4(): if gdaltest.numpy_drv is None: pytest.skip() ds = gdal.Open('data/byte.tif') array = ds.GetRasterBand(1).ReadAsArray(0, 0, 20, 20, 5, 5) assert array[2][3] == 123, \ 'Read wrong value - perhaps downsampling algorithm has changed subtly?' ############################################################################### # Test reading a multi-band file. def test_numpy_rw_5(): if gdaltest.numpy_drv is None: pytest.skip() from osgeo import gdalnumeric array = gdalnumeric.LoadFile('data/rgbsmall.tif', 35, 21, 1, 1) assert array[0][0][0] == 78, 'value read improperly.' assert array[1][0][0] == 117, 'value read improperly.' assert array[2][0][0] == 24, 'value read improperly.' array = gdalnumeric.LoadFile('data/rgbsmall.tif', buf_xsize=1, buf_ysize=1, resample_alg=gdal.GRIORA_Bilinear) assert array.shape[0] == 3 and array.shape[1] == 1 and array.shape[2] == 1, \ 'wrong array shape.' assert array[0][0][0] == 70 and array[1][0][0] == 97 and array[2][0][0] == 29, \ 'value read improperly.' import numpy array = numpy.zeros([3, 1, 1], dtype=numpy.uint8) ds = gdal.Open('data/rgbsmall.tif') ds.ReadAsArray(buf_obj=array, resample_alg=gdal.GRIORA_Bilinear) assert array[0][0][0] == 70 and array[1][0][0] == 97 and array[2][0][0] == 29, \ 'value read improperly.' ############################################################################### # Check that Band.ReadAsArray() can accept an already allocated array (#2658, #3028) def test_numpy_rw_6(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdalnumeric ds = gdal.Open('data/byte.tif') array = numpy.zeros([ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.GetRasterBand(1).ReadAsArray(buf_obj=array) assert array is array_res ds2 = gdalnumeric.OpenArray(array) assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() ############################################################################### # Check that Dataset.ReadAsArray() can accept an already allocated array (#2658, #3028) def test_numpy_rw_7(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdalnumeric ds = gdal.Open('data/byte.tif') array = numpy.zeros([1, ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.ReadAsArray(buf_obj=array) assert array is array_res ds2 = gdalnumeric.OpenArray(array) assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() # Try again with a 2D array array = numpy.zeros([ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.ReadAsArray(buf_obj=array) assert array is array_res ds2 = gdalnumeric.OpenArray(array) assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() # With a multi band file ds = gdal.Open('data/rgbsmall.tif') array = numpy.zeros([ds.RasterCount, ds.RasterYSize, ds.RasterXSize], numpy.uint8) array_res = ds.ReadAsArray(buf_obj=array) assert array is array_res ds2 = gdalnumeric.OpenArray(array) assert ds2.GetRasterBand(1).Checksum() == ds.GetRasterBand(1).Checksum() ############################################################################### # Check that Dataset.ReadAsArray() with multi-band data def test_numpy_rw_8(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdalnumeric ds = gdal.Open('data/rgbsmall.tif') array = numpy.zeros([ds.RasterCount, ds.RasterYSize, ds.RasterXSize], numpy.uint8) ds.ReadAsArray(buf_obj=array) ds2 = gdalnumeric.OpenArray(array) for i in range(1, ds.RasterCount): assert ds2.GetRasterBand(i).Checksum() == ds.GetRasterBand(i).Checksum() ############################################################################### # Test Band.WriteArray() def test_numpy_rw_9(): if gdaltest.numpy_drv is None: pytest.skip() ds = gdal.Open('data/byte.tif') array = ds.ReadAsArray() out_ds = gdal.GetDriverByName('MEM').Create('', ds.RasterYSize, ds.RasterXSize) out_ds.GetRasterBand(1).WriteArray(array) cs = out_ds.GetRasterBand(1).Checksum() out_ds = None ds = None assert cs == 4672, 'did not get expected checksum' ############################################################################### # Test signed byte handling def test_numpy_rw_10(): if gdaltest.numpy_drv is None: pytest.skip() import numpy ds = gdal.GetDriverByName('GTiff').Create('/vsimem/signed8.tif', 2, 1, options=['PIXELTYPE=SIGNEDBYTE']) ar = numpy.empty([1, 2], dtype=numpy.int8) ar[0][0] = -128 ar[0][1] = 127 ds.GetRasterBand(1).WriteArray(ar) ds = None ds = gdal.Open('/vsimem/signed8.tif') ar2 = ds.ReadAsArray() ar3 = numpy.empty_like(ar2) ds.GetRasterBand(1).ReadAsArray(buf_obj=ar3) ds = None gdal.Unlink('/vsimem/signed8.tif') assert ar2[0][0] == -128 and ar2[0][1] == 127, 'did not get expected result (1)' assert ar3[0][0] == -128 and ar3[0][1] == 127, 'did not get expected result (2)' ############################################################################### # Test all datatypes def test_numpy_rw_11(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdal_array type_tuples = [('uint8', gdal.GDT_Byte, numpy.uint8, 255), ('uint16', gdal.GDT_UInt16, numpy.uint16, 65535), ('int16', gdal.GDT_Int16, numpy.int16, -32767), ('uint32', gdal.GDT_UInt32, numpy.uint32, 4294967295), ('int32', gdal.GDT_Int32, numpy.int32, -2147483648), ('float32', gdal.GDT_Float32, numpy.float32, 1.23), ('float64', gdal.GDT_Float64, numpy.float64, 1.23456789), ('cint16', gdal.GDT_CInt16, numpy.complex64, -32768 + 32767j), ('cint32', gdal.GDT_CInt32, numpy.complex64, -32769 + 32768j), ('cfloat32', gdal.GDT_CFloat32, numpy.complex64, -32768.5 + 32767.5j), ('cfloat64', gdal.GDT_CFloat64, numpy.complex128, -32768.123456 + 32767.123456j)] for type_tuple in type_tuples: ds = gdal.GetDriverByName('GTiff').Create('/vsimem/' + type_tuple[0], 1, 1, 1, type_tuple[1]) tmp = ds.ReadAsArray() assert tmp.dtype == type_tuple[2], 'did not get expected numpy type' ar = numpy.empty([1, 1], dtype=type_tuple[2]) ar_ds = gdal_array.OpenArray(ar) got_dt = ar_ds.GetRasterBand(1).DataType ar_ds = None expected_dt = type_tuple[1] if expected_dt == gdal.GDT_CInt16 or expected_dt == gdal.GDT_CInt32: expected_dt = gdal.GDT_CFloat32 if got_dt != expected_dt: print(type_tuple[1]) pytest.fail('did not get expected result (0)') ar[0][0] = type_tuple[3] ds.GetRasterBand(1).WriteArray(ar) ds = None ds = gdal.Open('/vsimem/' + type_tuple[0]) ar2 = ds.ReadAsArray() ar3 = numpy.empty_like(ar2) ds.GetRasterBand(1).ReadAsArray(buf_obj=ar3) ds = None gdal.Unlink('/vsimem/' + type_tuple[0]) assert (not (type_tuple[0] == 'float32' and abs(ar2[0][0] - type_tuple[3]) > 1e-6) or \ (type_tuple[0] != 'float32' and ar2[0][0] != type_tuple[3])), \ 'did not get expected result (1)' assert (not (type_tuple[0] == 'float32' and abs(ar3[0][0] - type_tuple[3]) > 1e-6) or \ (type_tuple[0] != 'float32' and ar3[0][0] != type_tuple[3])), \ 'did not get expected result (2)' ############################################################################### # Test array with slices (#3542) def test_numpy_rw_12(): if gdaltest.numpy_drv is None: pytest.skip() import numpy ar = numpy.empty([2, 2], dtype=numpy.uint8) ar[0][0] = 0 ar[0][1] = 1 ar[1][0] = 2 ar[1][1] = 3 drv = gdal.GetDriverByName('MEM') ds = drv.Create('', 1, 2, 1, gdal.GDT_Byte) ds.GetRasterBand(1).WriteArray(ar[:, 1:]) ar_read = numpy.zeros_like(ar) slice_read = ar_read[:, 1:] ds.GetRasterBand(1).ReadAsArray(buf_obj=slice_read) ds = None assert slice_read[0][0] == 1 and slice_read[1][0] == 3 ############################################################################### # Test expected errors def test_numpy_rw_13(): if gdaltest.numpy_drv is None: pytest.skip() import numpy drv = gdal.GetDriverByName('MEM') ds = drv.Create('', 2, 1, 1, gdal.GDT_Byte) ar = numpy.empty([1, 2], dtype=numpy.uint8) ar[0][0] = 100 ar[0][1] = 200 ds.GetRasterBand(1).WriteArray(ar) # Try reading into unsupported array type ar = numpy.empty([1, 2], dtype=numpy.int64) with pytest.raises(Exception, match='array does not have ' 'corresponding GDAL data type'): ds.GetRasterBand(1).ReadAsArray(buf_obj=ar) # Try call with inconsistent parameters. ar = numpy.empty([1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_ysize not consistent ' 'with array shape'): ds.GetRasterBand(1).ReadAsArray(buf_obj=ar, buf_xsize=2, buf_ysize=2) # Same with 3 dimensions ar = numpy.empty([1, 1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_ysize not consistent ' 'with array shape'): ds.GetRasterBand(1).ReadAsArray(buf_obj=ar, buf_xsize=2, buf_ysize=2) # Try call with inconsistent parameters. ar = numpy.empty([1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_xsize not consistent ' 'with array shape'): ds.GetRasterBand(1).ReadAsArray(buf_obj=ar, buf_xsize=1, buf_ysize=1) # Inconsistent data type ar = numpy.empty([1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_type not consistent ' 'with array type'): ds.GetRasterBand(1).ReadAsArray(buf_obj=ar, buf_type=gdal.GDT_Int16) # This one should be OK ! ar = numpy.zeros([1, 2], dtype=numpy.uint8) ds.GetRasterBand(1).ReadAsArray(buf_obj=ar, buf_xsize=2, buf_ysize=1) assert ar[0][0] == 100 and ar[0][1] == 200, 'did not get expected values' # This one too ar = numpy.zeros([1, 1, 2], dtype=numpy.uint8) ds.GetRasterBand(1).ReadAsArray(buf_obj=ar) assert ar[0][0][0] == 100 and ar[0][0][1] == 200, 'did not get expected values' # This one too ar = numpy.zeros([1, 1, 2], dtype=numpy.uint8) ds.ReadAsArray(buf_obj=ar) assert ar[0][0][0] == 100 and ar[0][0][1] == 200, 'did not get expected values' # This one too ar = ds.ReadAsArray() assert ar[0][0] == 100 and ar[0][1] == 200, 'did not get expected values' ds = None # With a multiband file drv = gdal.GetDriverByName('MEM') ds = drv.Create('', 2, 1, 3, gdal.GDT_Byte) ar = numpy.empty([3, 1, 2], dtype=numpy.uint8) ar[0][0][0] = 100 ar[0][0][1] = 200 ar[1][0][0] = 101 ar[1][0][1] = 201 ar[2][0][0] = 102 ar[2][0][1] = 202 for i in range(3): ds.GetRasterBand(i + 1).WriteArray(ar[i]) ar = numpy.empty([3, 1, 2], dtype=numpy.int64) with pytest.raises(Exception, match='array does not have ' 'corresponding GDAL data type'): ds.ReadAsArray(buf_obj=ar) # Try call with inconsistent parameters. ar = numpy.empty([3, 1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_ysize not consistent ' 'with array shape'): ds.ReadAsArray(buf_obj=ar, buf_xsize=2, buf_ysize=2) # With 2 dimensions ar = numpy.empty([1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Array should have 3 ' 'dimensions'): ds.ReadAsArray(buf_obj=ar) # Try call with inconsistent parameters ar = numpy.empty([3, 1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_xsize not consistent ' 'with array shape'): ds.ReadAsArray(buf_obj=ar, buf_xsize=1, buf_ysize=1) # Inconsistent data type ar = numpy.empty([3, 1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Specified buf_type not consistent with array type'): ds.ReadAsArray(buf_obj=ar, buf_type=gdal.GDT_Int16) # Not enough space in first dimension ar = numpy.empty([2, 1, 2], dtype=numpy.uint8) with pytest.raises(Exception, match='Array should have space for 3 bands'): ds.ReadAsArray(buf_obj=ar) # This one should be OK ! ar = numpy.zeros([3, 1, 2], dtype=numpy.uint8) ds.ReadAsArray(buf_obj=ar, buf_xsize=2, buf_ysize=1, buf_type=gdal.GDT_Byte) assert ar[0][0][0] == 100 and ar[0][0][1] == 200 and ar[1][0][0] == 101 and ar[1][0][1] == 201 and ar[2][0][0] == 102 and ar[2][0][1] == 202, \ 'did not get expected values' # This one too ar = numpy.zeros([3, 1, 2], dtype=numpy.uint8) ds.ReadAsArray(buf_obj=ar) assert ar[0][0][0] == 100 and ar[0][0][1] == 200 and ar[1][0][0] == 101 and ar[1][0][1] == 201 and ar[2][0][0] == 102 and ar[2][0][1] == 202, \ 'did not get expected values' # This one too ar = ds.ReadAsArray() assert ar[0][0][0] == 100 and ar[0][0][1] == 200 and ar[1][0][0] == 101 and ar[1][0][1] == 201 and ar[2][0][0] == 102 and ar[2][0][1] == 202, \ 'did not get expected values' ds = None ############################################################################### # Test callback of ReadAsArray() def numpy_rw_14_progress_callback(pct, message, user_data): # pylint: disable=unused-argument if abs(pct - user_data[0]) > 1e-5: print('Expected %f, got %f' % (user_data[0], pct)) user_data[1] = False user_data[0] = user_data[0] + 0.05 return 1 # 1 to continue, 0 to stop def numpy_rw_14_progress_interrupt_callback(pct, message, user_data): # pylint: disable=unused-argument user_data[0] = pct if pct >= 0.5: return 0 return 1 # 1 to continue, 0 to stop def numpy_rw_14_progress_callback_2(pct, message, user_data): # pylint: disable=unused-argument if pct < user_data[0]: print('Got %f, last pct was %f' % (pct, user_data[0])) return 0 user_data[0] = pct return 1 # 1 to continue, 0 to stop def test_numpy_rw_14(): if gdaltest.numpy_drv is None: pytest.skip() # Progress not implemented yet if gdal.GetConfigOption('GTIFF_DIRECT_IO') == 'YES' or \ gdal.GetConfigOption('GTIFF_VIRTUAL_MEM_IO') == 'YES': pytest.skip() import numpy ds = gdal.Open('data/byte.tif') # Test RasterBand.ReadAsArray tab = [0.05, True] data = ds.GetRasterBand(1).ReadAsArray(resample_alg=gdal.GRIORA_NearestNeighbour, callback=numpy_rw_14_progress_callback, callback_data=tab) assert data is not None assert abs(tab[0] - 1.05) <= 1e-5 and tab[1] # Test interruption tab = [0] data = ds.GetRasterBand(1).ReadAsArray(callback=numpy_rw_14_progress_interrupt_callback, callback_data=tab) assert data is None assert tab[0] >= 0.50 # Test Dataset.ReadAsArray tab = [0.05, True] data = ds.ReadAsArray(resample_alg=gdal.GRIORA_NearestNeighbour, callback=numpy_rw_14_progress_callback, callback_data=tab) assert data is not None assert abs(tab[0] - 1.05) <= 1e-5 and tab[1] # Same with interruption tab = [0] data = ds.ReadAsArray(callback=numpy_rw_14_progress_interrupt_callback, callback_data=tab) assert data is None and tab[0] >= 0.50 # Test Dataset.ReadAsArray on a multi band file ds = None ds = gdal.Open('data/rgbsmall.tif') last_pct = [0] data = ds.ReadAsArray(callback=numpy_rw_14_progress_callback_2, callback_data=last_pct) assert not (data is None or abs(last_pct[0] - 1.0) > 1e-5) last_pct = [0] # Same but with a provided array array = numpy.empty([ds.RasterCount, ds.RasterYSize, ds.RasterXSize], numpy.uint8) data = ds.ReadAsArray(buf_obj=array, callback=numpy_rw_14_progress_callback_2, callback_data=last_pct) assert not (data is None or abs(last_pct[0] - 1.0) > 1e-5) ############################################################################### # Test NumPy GetGeoTransform/SetGeoTransform def test_numpy_rw_15(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdal_array array = numpy.empty([1, 1, 1], numpy.uint8) ds = gdal_array.OpenArray(array) gt = ds.GetGeoTransform(can_return_null=True) assert gt is None ds.SetGeoTransform([1, 2, 3, 4, 5, -6]) gt = ds.GetGeoTransform() assert gt == (1, 2, 3, 4, 5, -6) ############################################################################### # Test errors of OpenArray() def test_numpy_rw_16(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdal_array # 1D array = numpy.empty([1], numpy.uint8) with gdaltest.error_handler(): ds = gdal_array.OpenArray(array) assert ds is None # 4D array = numpy.empty([1, 1, 1, 1], numpy.uint8) with gdaltest.error_handler(): ds = gdal_array.OpenArray(array) assert ds is None # Unsupported data type array = numpy.empty([1, 1], numpy.float16) with gdaltest.error_handler(): ds = gdal_array.OpenArray(array) assert ds is None ############################################################################### # Test old deprecated way with gdal_array.GetArrayFilename() def test_numpy_rw_17(): if gdaltest.numpy_drv is None: pytest.skip() import numpy from osgeo import gdal_array # Disabled by default array = numpy.empty([1, 1], numpy.uint8) with gdaltest.error_handler(): ds = gdal.Open(gdal_array.GetArrayFilename(array)) assert ds is None gdal.SetConfigOption('GDAL_ARRAY_OPEN_BY_FILENAME', 'TRUE') ds = gdal.Open(gdal_array.GetArrayFilename(array)) gdal.SetConfigOption('GDAL_ARRAY_OPEN_BY_FILENAME', None) assert ds is not None # Invalid value with gdaltest.error_handler(): ds = gdal.Open('NUMPY:::invalid') assert ds is None ############################################################################### # Test the pixel interleave options def test_numpy_rw_18(): if gdaltest.numpy_drv is None: pytest.skip() import numpy import numpy.random from osgeo import gdal_array img = numpy.random.randint(0, 255, size=(256, 200, 3)).astype('uint8') ds = gdal_array.OpenArray(img, interleave='pixel') assert ds is not None, 'Failed to open memory array as dataset.' bnd1 = ds.GetRasterBand(1).ReadAsArray() bnd2 = ds.GetRasterBand(2).ReadAsArray() bnd3 = ds.GetRasterBand(3).ReadAsArray() res = numpy.dstack((bnd1, bnd2, bnd3)) assert numpy.all(img == res) res = ds.ReadAsArray(interleave='pixel') assert numpy.all(img == res) ############################################################################### # The VRT references a non existing TIF file, but using the proxy pool dataset API (#2837) def test_numpy_rw_failure_in_readasarray(): if gdaltest.numpy_drv is None: pytest.skip() ds = gdal.Open('data/idontexist2.vrt') assert ds is not None exception_raised = False with gdaltest.enable_exceptions(): try: ds.ReadAsArray() except RuntimeError: exception_raised = True assert exception_raised exception_raised = False with gdaltest.enable_exceptions(): try: ds.GetRasterBand(1).ReadAsArray() except RuntimeError: exception_raised = True assert exception_raised def test_numpy_rw_cleanup(): gdaltest.numpy_drv = None gdalautotest-3.0.4/gcore/aaigrid_write.py0000755003401500001440000000365413614005323020123 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: aaigrid_write.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read/write functionality for Arc/Info ASCII grid # (AAIGrid) driver # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # # 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. ############################################################################### import pytest import gdaltest ############################################################################### # When imported build a list of units based on the files available. init_list = [ ('byte.tif', 4672), ('int16.tif', 4672), ('uint16.tif', 4672), ('float32.tif', 4672), ('utmsmall.tif', 50054)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('AAIGrid') def test_aaigrid_create(filename, checksum): ut = gdaltest.GDALTest('AAIGrid', filename, 1, checksum) ut.testCreateCopy() gdalautotest-3.0.4/gcore/tmp/0000755003401500001440000000000013614004466015533 5ustar rouaultusersgdalautotest-3.0.4/gcore/tmp/do-not-remove0000644003401500001440000000000013614004466020137 0ustar rouaultusersgdalautotest-3.0.4/gcore/tiff_ovr.py0000755003401500001440000017716713614005323017142 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: tiff_ovr.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Overview Support (mostly a GeoTIFF issue). # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, 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 import sys import shutil import array import stat from osgeo import osr from osgeo import gdal import pytest import gdaltest @pytest.fixture(params=['invert', 'dont-invert']) def both_endian(request): """ Runs tests with both values of GDAL_TIFF_ENDIANNESS """ if request.param == 'invert': original = gdal.GetConfigOption('GDAL_TIFF_ENDIANNESS', "NATIVE") gdal.SetConfigOption('GDAL_TIFF_ENDIANNESS', 'INVERTED') yield gdal.SetConfigOption('GDAL_TIFF_ENDIANNESS', original) else: yield ############################################################################### # Check the overviews def tiff_ovr_check(src_ds): for i in (1, 2, 3): assert src_ds.GetRasterBand(i).GetOverviewCount() == 2, 'overviews missing' ovr_band = src_ds.GetRasterBand(i).GetOverview(0) if ovr_band.XSize != 10 or ovr_band.YSize != 10: msg = 'overview wrong size: band %d, overview 0, size = %d * %d,' % (i, ovr_band.XSize, ovr_band.YSize) pytest.fail(msg) if ovr_band.Checksum() != 1087: msg = 'overview wrong checksum: band %d, overview 0, checksum = %d,' % (i, ovr_band.Checksum()) pytest.fail(msg) ovr_band = src_ds.GetRasterBand(i).GetOverview(1) if ovr_band.XSize != 5 or ovr_band.YSize != 5: msg = 'overview wrong size: band %d, overview 1, size = %d * %d,' % (i, ovr_band.XSize, ovr_band.YSize) pytest.fail(msg) if ovr_band.Checksum() != 328: msg = 'overview wrong checksum: band %d, overview 1, checksum = %d,' % (i, ovr_band.Checksum()) pytest.fail(msg) ############################################################################### # Create a 3 band floating point GeoTIFF file so we can build overviews on it # later. Build overviews on it. def test_tiff_ovr_1(both_endian): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/mfloat32.vrt') assert src_ds is not None, 'Failed to open test dataset.' gdaltest.tiff_drv.CreateCopy('tmp/mfloat32.tif', src_ds, options=['INTERLEAVE=PIXEL']) src_ds = None ds = gdal.Open('tmp/mfloat32.tif') assert ds is not None, 'Failed to open test dataset.' err = ds.BuildOverviews(overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' ret = tiff_ovr_check(ds) ds = None return ret ############################################################################### # Open file and verify some characteristics of the overviews. def test_tiff_ovr_2(both_endian): src_ds = gdal.Open('tmp/mfloat32.tif') assert src_ds is not None, 'Failed to open test dataset.' ret = tiff_ovr_check(src_ds) src_ds = None return ret ############################################################################### # Open target file in update mode, and create internal overviews. def test_tiff_ovr_3(both_endian): try: os.unlink('tmp/mfloat32.tif.ovr') except OSError: pass src_ds = gdal.Open('tmp/mfloat32.tif', gdal.GA_Update) assert src_ds is not None, 'Failed to open test dataset.' err = src_ds.BuildOverviews(overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' ret = tiff_ovr_check(src_ds) src_ds = None return ret ############################################################################### # Re-open target file and check overviews def test_tiff_ovr_3bis(both_endian): return test_tiff_ovr_2(both_endian) ############################################################################### # Test generation def test_tiff_ovr_4(both_endian): shutil.copyfile('data/oddsize_1bit2b.tif', 'tmp/ovr4.tif') wrk_ds = gdal.Open('tmp/ovr4.tif', gdal.GA_Update) assert wrk_ds is not None, 'Failed to open test dataset.' wrk_ds.BuildOverviews('AVERAGE_BIT2GRAYSCALE', overviewlist=[2, 4]) wrk_ds = None wrk_ds = gdal.Open('tmp/ovr4.tif') ovband = wrk_ds.GetRasterBand(1).GetOverview(1) md = ovband.GetMetadata() assert 'RESAMPLING' in md and md['RESAMPLING'] == 'AVERAGE_BIT2GRAYSCALE', \ 'Did not get expected RESAMPLING metadata.' # compute average value of overview band image data. ovimage = ovband.ReadRaster(0, 0, ovband.XSize, ovband.YSize) pix_count = ovband.XSize * ovband.YSize total = 0.0 is_bytes = False if (isinstance(ovimage, bytes) and not isinstance(ovimage, str)): is_bytes = True if is_bytes is True: for i in range(pix_count): total += ovimage[i] else: for i in range(pix_count): total += ord(ovimage[i]) average = total / pix_count exp_average = 153.0656 assert abs(average - exp_average) <= 0.1, 'got wrong average for overview image' # Read base band as overview resolution and verify we aren't getting # the grayscale image. frband = wrk_ds.GetRasterBand(1) ovimage = frband.ReadRaster(0, 0, frband.XSize, frband.YSize, ovband.XSize, ovband.YSize) pix_count = ovband.XSize * ovband.YSize total = 0.0 if is_bytes is True: for i in range(pix_count): total += ovimage[i] else: for i in range(pix_count): total += ord(ovimage[i]) average = total / pix_count exp_average = 0.6096 assert abs(average - exp_average) <= 0.01, 'got wrong average for downsampled image' wrk_ds = None ############################################################################### # Test average overview generation with nodata. def test_tiff_ovr_5(both_endian): shutil.copyfile('data/nodata_byte.tif', 'tmp/ovr5.tif') wrk_ds = gdal.Open('tmp/ovr5.tif', gdal.GA_ReadOnly) assert wrk_ds is not None, 'Failed to open test dataset.' wrk_ds.BuildOverviews('AVERAGE', overviewlist=[2]) cs = wrk_ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1130 assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Same as tiff_ovr_5 but with USE_RDD=YES to force external overview def test_tiff_ovr_6(both_endian): shutil.copyfile('data/nodata_byte.tif', 'tmp/ovr6.tif') oldOption = gdal.GetConfigOption('USE_RRD', 'NO') gdal.SetConfigOption('USE_RRD', 'YES') wrk_ds = gdal.Open('tmp/ovr6.tif', gdal.GA_Update) assert wrk_ds is not None, 'Failed to open test dataset.' wrk_ds.BuildOverviews('AVERAGE', overviewlist=[2]) gdal.SetConfigOption('USE_RRD', oldOption) try: os.stat('tmp/ovr6.aux') except OSError: pytest.fail('no external overview.') cs = wrk_ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1130 assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Check nearest resampling on a dataset with a raster band that has a color table def test_tiff_ovr_7(both_endian): shutil.copyfile('data/test_average_palette.tif', 'tmp/test_average_palette.tif') # This dataset is a black&white chessboard, index 0 is black, index 1 is white. # In nearest resampling, we are expecting a uniform black image. ds = gdal.Open('tmp/test_average_palette.tif', gdal.GA_Update) assert ds is not None, 'Failed to open test dataset.' ds.BuildOverviews('NEAREST', overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 0 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Check average resampling on a dataset with a raster band that has a color table def test_tiff_ovr_8(both_endian): shutil.copyfile('data/test_average_palette.tif', 'tmp/test_average_palette.tif') # This dataset is a black&white chessboard, index 0 is black, index 1 is white. # So the result of averaging (0,0,0) and (255,255,255) is (127,127,127), which is # index 2. So the result of the averaging is a uniform grey image. ds = gdal.Open('tmp/test_average_palette.tif', gdal.GA_Update) assert ds is not None, 'Failed to open test dataset.' ds.BuildOverviews('AVERAGE', overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 200 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Test --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR -ro # Will also check that pixel interleaving is automatically selected (#3064) def test_tiff_ovr_9(both_endian): gdaltest.tiff_drv.Delete('tmp/ovr9.tif') drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() shutil.copyfile('data/rgbsmall.tif', 'tmp/ovr9.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG') gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', 'YCBCR') ds = gdal.Open('tmp/ovr9.tif', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open test dataset.' ds.BuildOverviews('AVERAGE', overviewlist=[2]) gdal.SetConfigOption('COMPRESS_OVERVIEW', '') gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', '') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 5562 ds = None assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.' # Re-check after dataset reopening ds = gdal.Open('tmp/ovr9.tif', gdal.GA_ReadOnly) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 5562 ds = None assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.' ############################################################################### # Similar to tiff_ovr_9 but with internal overviews. def test_tiff_ovr_10(both_endian): src_ds = gdal.Open('data/rgbsmall.tif', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr10.tif', src_ds, options=['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR']) src_ds = None assert ds is not None, 'Failed to apply JPEG compression.' ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr10.tif', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open copy of test dataset.' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 5562 ds = None assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.' ############################################################################### # Overview on a dataset with NODATA_VALUES def test_tiff_ovr_11(both_endian): src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr11.tif', src_ds) src_ds = None md = gdaltest.tiff_drv.GetMetadata() if (md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1 or int(gdal.VersionInfo('VERSION_NUM')) < 1700): # The two following lines are necessary with inverted endianness # for the moment with older libtiff # See http://bugzilla.maptools.org/show_bug.cgi?id=1924 for more details ds = None ds = gdal.Open('tmp/ovr11.tif', gdal.GA_Update) ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr11.tif', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open copy of test dataset.' cs = ds.GetRasterBand(2).GetOverview(0).Checksum() # If NODATA_VALUES was ignored, we would get 2766 exp_cs = 2792 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Same as tiff_ovr_11 but with compression to trigger the multiband overview # code def test_tiff_ovr_12(both_endian): src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr12.tif', src_ds, options=['COMPRESS=DEFLATE']) src_ds = None md = gdaltest.tiff_drv.GetMetadata() if (md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1 or int(gdal.VersionInfo('VERSION_NUM')) < 1700): # The two following lines are necessary with inverted endianness # for the moment with older libtiff # See http://bugzilla.maptools.org/show_bug.cgi?id=1924 for more details ds = None ds = gdal.Open('tmp/ovr12.tif', gdal.GA_Update) ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr12.tif', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open copy of test dataset.' cs = ds.GetRasterBand(2).GetOverview(0).Checksum() # If NODATA_VALUES was ignored, we would get 2766 exp_cs = 2792 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Test gaussian resampling def test_tiff_ovr_13(both_endian): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/mfloat32.vrt') assert src_ds is not None, 'Failed to open test dataset.' gdaltest.tiff_drv.CreateCopy('tmp/mfloat32.tif', src_ds, options=['INTERLEAVE=PIXEL']) src_ds = None ds = gdal.Open('tmp/mfloat32.tif') assert ds is not None, 'Failed to open test dataset.' err = ds.BuildOverviews('GAUSS', overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' # if ds.GetRasterBand(1).GetOverview(0).Checksum() != 1225: # gdaltest.post_reason( 'bad checksum' ) # return 'fail' ds = None ############################################################################### # Check gauss resampling on a dataset with a raster band that has a color table def test_tiff_ovr_14(both_endian): shutil.copyfile('data/test_average_palette.tif', 'tmp/test_gauss_palette.tif') ds = gdal.Open('tmp/test_gauss_palette.tif', gdal.GA_Update) assert ds is not None, 'Failed to open test dataset.' ds.BuildOverviews('GAUSS', overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 200 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Same as tiff_ovr_11 but with gauss, and compression to trigger the multiband overview # code def test_tiff_ovr_15(both_endian): src_ds = gdal.Open('data/test_nodatavalues.tif', gdal.GA_ReadOnly) assert src_ds is not None, 'Failed to open test dataset.' ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr15.tif', src_ds, options=['COMPRESS=DEFLATE']) src_ds = None md = gdaltest.tiff_drv.GetMetadata() if (md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1 or int(gdal.VersionInfo('VERSION_NUM')) < 1700): # The two following lines are necessary with inverted endianness # for the moment with older libtiff # See http://bugzilla.maptools.org/show_bug.cgi?id=1924 for more details ds = None ds = gdal.Open('tmp/ovr15.tif', gdal.GA_Update) ds.BuildOverviews('GAUSS', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr15.tif', gdal.GA_ReadOnly) assert ds is not None, 'Failed to open copy of test dataset.' cs = ds.GetRasterBand(2).GetOverview(0).Checksum() # If NODATA_VALUES was ignored, we would get 2954 exp_cs = 2987 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Test mode resampling on non-byte dataset def test_tiff_ovr_16(both_endian): gdaltest.tiff_drv = gdal.GetDriverByName('GTiff') src_ds = gdal.Open('data/mfloat32.vrt') assert src_ds is not None, 'Failed to open test dataset.' gdaltest.tiff_drv.CreateCopy('tmp/ovr16.tif', src_ds, options=['INTERLEAVE=PIXEL']) src_ds = None ds = gdal.Open('tmp/ovr16.tif') assert ds is not None, 'Failed to open test dataset.' err = ds.BuildOverviews('MODE', overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1122 assert cs == exp_cs, 'bad checksum' ds = None ############################################################################### # Test mode resampling on a byte dataset def test_tiff_ovr_17(both_endian): shutil.copyfile('data/byte.tif', 'tmp/ovr17.tif') ds = gdal.Open('tmp/ovr17.tif') assert ds is not None, 'Failed to open test dataset.' err = ds.BuildOverviews('MODE', overviewlist=[2, 4]) assert err == 0, 'BuildOverviews reports an error' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1122 assert cs == exp_cs, 'bad checksum' ds = None ############################################################################### # Check mode resampling on a dataset with a raster band that has a color table def test_tiff_ovr_18(both_endian): shutil.copyfile('data/test_average_palette.tif', 'tmp/ovr18.tif') ds = gdal.Open('tmp/ovr18.tif', gdal.GA_Update) assert ds is not None, 'Failed to open test dataset.' ds.BuildOverviews('MODE', overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 100 ds = None assert cs == exp_cs, 'got wrong overview checksum.' ############################################################################### # Check that we can create overviews on a newly create file (#2621) # Will cause older libtiff versions (<=3.8.2 for sure) to crash, so skip it # if BigTIFF is not supported (this is a sign of an older libtiff...) def test_tiff_ovr_19(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdal.GetDriverByName('GTiff').Create('tmp/ovr19.tif', 100, 100, 1) ds.GetRasterBand(1).Fill(1) # The flush is important to simulate the behaviour that wash it by #2621 ds.FlushCache() ds.BuildOverviews('NEAR', overviewlist=[2]) ds.FlushCache() ds.BuildOverviews('NEAR', overviewlist=[2, 4]) assert ds.GetRasterBand(1).GetOverviewCount() == 2, \ 'Overview could not be generated' cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 2500 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 625 ds = None ############################################################################### # Test BIGTIFF_OVERVIEW=YES option def test_tiff_ovr_20(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr20.tif', 100, 100, 1) ds = None ds = gdal.Open('tmp/ovr20.tif') assert ds is not None, 'Failed to open test dataset.' gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'YES') ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'IF_NEEDED') ds = None fileobj = open('tmp/ovr20.tif.ovr', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Test BIGTIFF_OVERVIEW=IF_NEEDED option def test_tiff_ovr_21(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr21.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) ds = None ds = gdal.Open('tmp/ovr21.tif') assert ds is not None, 'Failed to open test dataset.' # 170 k * 100 k = 17 GB. 17 GB / (2^2) = 4.25 GB > 4.2 GB # so BigTIFF is needed ds.BuildOverviews('NONE', overviewlist=[2]) ds = None fileobj = open('tmp/ovr21.tif.ovr', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Test BIGTIFF_OVERVIEW=NO option when BigTIFF is really needed def test_tiff_ovr_22(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr22.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) ds = None ds = gdal.Open('tmp/ovr22.tif') assert ds is not None, 'Failed to open test dataset.' # 170 k * 100 k = 17 GB. 17 GB / (2^2) = 4.25 GB > 4.2 GB # so BigTIFF is needed gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'NO') gdal.PushErrorHandler('CPLQuietErrorHandler') err = ds.BuildOverviews('NONE', overviewlist=[2]) gdal.PopErrorHandler() gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'IF_NEEDED') ds = None if err != 0: return pytest.fail() ############################################################################### # Same as before, but BigTIFF might be not needed as we use a compression # method for the overviews. def test_tiff_ovr_23(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr23.tif', 170000, 100000, 1, options=['SPARSE_OK=YES']) ds = None ds = gdal.Open('tmp/ovr23.tif') assert ds is not None, 'Failed to open test dataset.' gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'NO') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') ds.BuildOverviews('NONE', overviewlist=[2]) gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'IF_NEEDED') gdal.SetConfigOption('COMPRESS_OVERVIEW', '') ds = None fileobj = open('tmp/ovr23.tif.ovr', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() # Check Classical TIFF signature assert (not ((binvalues[2] != 0x2A or binvalues[3] != 0) and (binvalues[3] != 0x2A or binvalues[2] != 0))) ############################################################################### # Test BIGTIFF_OVERVIEW=IF_SAFER option def test_tiff_ovr_24(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr24.tif', 85000, 100000, 1, options=['SPARSE_OK=YES']) ds = None ds = gdal.Open('tmp/ovr24.tif') assert ds is not None, 'Failed to open test dataset.' # 85 k * 100 k = 8.5 GB, so BigTIFF might be needed as # 8.5 GB / 2 > 4.2 GB gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'IF_SAFER') ds.BuildOverviews('NONE', overviewlist=[16]) gdal.SetConfigOption('BIGTIFF_OVERVIEW', 'IF_NEEDED') ds = None fileobj = open('tmp/ovr24.tif.ovr', mode='rb') binvalues = array.array('b') binvalues.fromfile(fileobj, 4) fileobj.close() # Check BigTIFF signature assert (not ((binvalues[2] != 0x2B or binvalues[3] != 0) and (binvalues[3] != 0x2B or binvalues[2] != 0))) ############################################################################### # Test creating overviews after some blocks have been written in the main # band and actually flushed def test_tiff_ovr_25(both_endian): ds = gdaltest.tiff_drv.Create('tmp/ovr25.tif', 100, 100, 1) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).FlushCache() ds.BuildOverviews('NEAR', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr25.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 10000 assert ds.GetRasterBand(1).GetOverviewCount() != 0 assert ds.GetRasterBand(1).GetOverview(0).Checksum() == 2500 ############################################################################### # Test gdal.RegenerateOverview() def test_tiff_ovr_26(both_endian): ds = gdaltest.tiff_drv.Create('tmp/ovr26.tif', 100, 100, 1) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).FlushCache() ds.BuildOverviews('NEAR', overviewlist=[2]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds.GetRasterBand(1).GetOverview(0).Fill(0) cs_new = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs_new == 0 gdal.RegenerateOverview(ds.GetRasterBand(1), ds.GetRasterBand(1).GetOverview(0), 'NEAR') cs_new = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == cs_new ds = None ############################################################################### # Test gdal.RegenerateOverviews() def test_tiff_ovr_27(both_endian): ds = gdaltest.tiff_drv.Create('tmp/ovr27.tif', 100, 100, 1) ds.GetRasterBand(1).Fill(1) ds.GetRasterBand(1).FlushCache() ds.BuildOverviews('NEAR', overviewlist=[2, 4]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2 = ds.GetRasterBand(1).GetOverview(1).Checksum() ds.GetRasterBand(1).GetOverview(0).Fill(0) ds.GetRasterBand(1).GetOverview(1).Fill(0) cs_new = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2_new = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs_new == 0 and cs2_new == 0 gdal.RegenerateOverviews(ds.GetRasterBand(1), [ds.GetRasterBand(1).GetOverview(0), ds.GetRasterBand(1).GetOverview(1)], 'NEAR') cs_new = ds.GetRasterBand(1).GetOverview(0).Checksum() cs2_new = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == cs_new assert cs2 == cs2_new ds = None ############################################################################### # Test cleaning overviews. def test_tiff_ovr_28(both_endian): ds = gdal.Open('tmp/ovr25.tif', gdal.GA_Update) assert ds.BuildOverviews(overviewlist=[]) == 0, \ 'BuildOverviews() returned error code.' assert ds.GetRasterBand(1).GetOverviewCount() == 0, \ 'Overview(s) appear to still exist.' # Close and reopen to confirm they are really gone. ds = None ds = gdal.Open('tmp/ovr25.tif') assert ds.GetRasterBand(1).GetOverviewCount() == 0, \ 'Overview(s) appear to still exist after reopen.' ############################################################################### # Test cleaning external overviews (ovr) on a non-TIFF format. def test_tiff_ovr_29(both_endian): src_ds = gdal.Open('data/byte.tif') png_ds = gdal.GetDriverByName('PNG').CreateCopy('tmp/ovr29.png', src_ds) src_ds = None png_ds.BuildOverviews(overviewlist=[2]) png_ds = None assert open('tmp/ovr29.png.ovr') is not None, 'Did not expected .ovr file.' png_ds = gdal.Open('tmp/ovr29.png') assert png_ds.GetRasterBand(1).GetOverviewCount() == 1, 'did not find overview' png_ds.BuildOverviews(overviewlist=[]) assert png_ds.GetRasterBand(1).GetOverviewCount() == 0, 'delete overview failed.' png_ds = None png_ds = gdal.Open('tmp/ovr29.png') assert png_ds.GetRasterBand(1).GetOverviewCount() == 0, 'delete overview failed.' png_ds = None assert not os.path.exists('tmp/ovr29.png.ovr') gdal.GetDriverByName('PNG').Delete('tmp/ovr29.png') ############################################################################### # Test fix for #2988. def test_tiff_ovr_30(both_endian): ds = gdaltest.tiff_drv.Create('tmp/ovr30.tif', 20, 20, 1) ds.BuildOverviews(overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr30.tif', gdal.GA_Update) ds.SetMetadata({'TEST_KEY': 'TestValue'}) ds = None ds = gdaltest.tiff_drv.Create('tmp/ovr30.tif', 20, 20, 1) ds.BuildOverviews(overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr30.tif', gdal.GA_Update) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) ds = None ds = gdal.Open('tmp/ovr30.tif') assert ds.GetProjectionRef().find('4326') != -1 ############################################################################### # Test fix for #3033 def test_tiff_ovr_31(both_endian): ds = gdaltest.tiff_drv.Create('tmp/ovr31.tif', 100, 100, 4) ds.GetRasterBand(1).Fill(255) ds.GetRasterBand(2).Fill(255) ds.GetRasterBand(3).Fill(255) ds.GetRasterBand(4).Fill(255) ds.BuildOverviews('average', overviewlist=[2, 4]) cs = ds.GetRasterBand(1).GetOverview(1).Checksum() expected_cs = 7646 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d' % (cs, expected_cs)) ds = None ############################################################################### # Test Cubic sampling. def test_tiff_ovr_32(both_endian): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() # 4 regular band shutil.copyfile('data/stefan_full_rgba_photometric_rgb.tif', 'tmp/ovr32.tif') ds = gdal.Open('tmp/ovr32.tif', gdal.GA_Update) ds.BuildOverviews('cubic', overviewlist=[2, 5]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 21168 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() expected_cs = 1851 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs)) ds = None gdaltest.tiff_drv.Delete('tmp/ovr32.tif') # Same, but with non-byte data type (help testing the non-SSE2 code path) src_ds = gdal.Open('data/stefan_full_rgba_photometric_rgb.tif') tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ovr32_float.tif', src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, gdal.GDT_Float32) src_data = src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_data, buf_type=gdal.GDT_Byte) tmp_ds.BuildOverviews('cubic', overviewlist=[2]) tmp2_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ovr32_byte.tif', tmp_ds.RasterXSize, tmp_ds.RasterYSize, tmp_ds.RasterCount) tmp2_ds.BuildOverviews('NONE', overviewlist=[2]) tmp2_ovr_ds = tmp2_ds.GetRasterBand(1).GetOverview(0).GetDataset() tmp_ovr_ds = tmp_ds.GetRasterBand(1).GetOverview(0).GetDataset() src_data = tmp_ovr_ds.ReadRaster(0, 0, tmp_ovr_ds.RasterXSize, tmp_ovr_ds.RasterYSize, buf_type=gdal.GDT_Byte) tmp2_ovr_ds.WriteRaster(0, 0, tmp_ovr_ds.RasterXSize, tmp_ovr_ds.RasterYSize, src_data) cs = tmp2_ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 21168 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) src_ds = None tmp_ds = None tmp2_ds = None gdaltest.tiff_drv.Delete('/vsimem/ovr32_float.tif') gdaltest.tiff_drv.Delete('/vsimem/ovr32_byte.tif') # Test GDALRegenerateOverviewsMultiBand shutil.copyfile('data/stefan_full_rgba_photometric_rgb.tif', 'tmp/ovr32.tif') ds = gdal.Open('tmp/ovr32.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL') ds.BuildOverviews('cubic', overviewlist=[2, 5]) gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('INTERLEAVE_OVERVIEW', None) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 21168 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() expected_cs = 1851 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs)) ds = None gdaltest.tiff_drv.Delete('tmp/ovr32.tif') # 3 bands + alpha shutil.copyfile('data/stefan_full_rgba.tif', 'tmp/ovr32.tif') ds = gdal.Open('tmp/ovr32.tif', gdal.GA_Update) ds.BuildOverviews('cubic', overviewlist=[2, 5]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 21656 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() expected_cs = 2132 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs)) ds = None gdaltest.tiff_drv.Delete('tmp/ovr32.tif') # Same, but with non-byte data type (help testing the non-SSE2 code path) src_ds = gdal.Open('data/stefan_full_rgba.tif') tmp_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ovr32_float.tif', src_ds.RasterXSize, src_ds.RasterYSize, src_ds.RasterCount, gdal.GDT_Float32) src_data = src_ds.ReadRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize) tmp_ds.WriteRaster(0, 0, src_ds.RasterXSize, src_ds.RasterYSize, src_data, buf_type=gdal.GDT_Byte) tmp_ds.BuildOverviews('cubic', overviewlist=[2]) tmp2_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/ovr32_byte.tif', tmp_ds.RasterXSize, tmp_ds.RasterYSize, tmp_ds.RasterCount) tmp2_ds.BuildOverviews('NONE', overviewlist=[2]) tmp2_ovr_ds = tmp2_ds.GetRasterBand(1).GetOverview(0).GetDataset() tmp_ovr_ds = tmp_ds.GetRasterBand(1).GetOverview(0).GetDataset() src_data = tmp_ovr_ds.ReadRaster(0, 0, tmp_ovr_ds.RasterXSize, tmp_ovr_ds.RasterYSize, buf_type=gdal.GDT_Byte) tmp2_ovr_ds.WriteRaster(0, 0, tmp_ovr_ds.RasterXSize, tmp_ovr_ds.RasterYSize, src_data) cs = tmp2_ds.GetRasterBand(1).GetOverview(0).Checksum() # expected_cs = 21656 expected_cs = 21168 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) src_ds = None tmp_ds = None tmp2_ds = None gdaltest.tiff_drv.Delete('/vsimem/ovr32_float.tif') gdaltest.tiff_drv.Delete('/vsimem/ovr32_byte.tif') # Same test with a compressed dataset src_ds = gdal.Open('data/stefan_full_rgba.tif') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/ovr32.tif', src_ds, options=['COMPRESS=DEFLATE']) ds.BuildOverviews('cubic', overviewlist=[2, 5]) cs = ds.GetRasterBand(1).GetOverview(0).Checksum() expected_cs = 21656 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 0.' % (cs, expected_cs)) cs = ds.GetRasterBand(3).GetOverview(1).Checksum() expected_cs = 2132 assert cs == expected_cs, \ ('Checksum is %d. Expected checksum is %d for overview 1.' % (cs, expected_cs)) ds = None gdaltest.tiff_drv.Delete('tmp/ovr32.tif') ############################################################################### # Test creation of overviews on a 1x1 dataset (fix for #3069) def test_tiff_ovr_33(both_endian): try: os.remove('tmp/ovr33.tif.ovr') except OSError: pass ds = gdaltest.tiff_drv.Create('tmp/ovr33.tif', 1, 1, 1) ds = None ds = gdal.Open('tmp/ovr33.tif') ds.BuildOverviews('NEAREST', overviewlist=[2, 4]) ds = None gdaltest.tiff_drv.Delete('tmp/ovr33.tif') ############################################################################### # Confirm that overviews are used on a Band.RasterIO(). def test_tiff_ovr_34(both_endian): ds_in = gdal.Open('data/byte.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr34.tif', ds_in) ds.BuildOverviews('NEAREST', overviewlist=[2]) ds.GetRasterBand(1).GetOverview(0).Fill(32.0) ds = None ds_in = None ds = gdal.Open('tmp/ovr34.tif') data = ds.GetRasterBand(1).ReadRaster(0, 0, 20, 20, buf_xsize=5, buf_ysize=5) ds = None if data != ' '.encode('ascii'): print('[%s]' % data) pytest.fail('did not get expected cleared overview.') gdaltest.tiff_drv.Delete('tmp/ovr34.tif') ############################################################################### # Confirm that overviews are used on a Band.RasterIO(). def test_tiff_ovr_35(both_endian): ds_in = gdal.Open('data/byte.tif') ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr35.tif', ds_in) ds.BuildOverviews('NEAREST', overviewlist=[2]) ds.GetRasterBand(1).GetOverview(0).Fill(32.0) ds = None ds_in = None ds = gdal.Open('tmp/ovr35.tif') data = ds.ReadRaster(0, 0, 20, 20, buf_xsize=5, buf_ysize=5, band_list=[1]) ds = None if data != ' '.encode('ascii'): print('[%s]' % data) pytest.fail('did not get expected cleared overview.') gdaltest.tiff_drv.Delete('tmp/ovr35.tif') ############################################################################### # Confirm that overviews are used on a Band.RasterIO() when using BlockBasedRasterIO() (#3124) def test_tiff_ovr_36(both_endian): oldval = gdal.GetConfigOption('GDAL_FORCE_CACHING', 'NO') gdal.SetConfigOption('GDAL_FORCE_CACHING', 'YES') ret = test_tiff_ovr_35(both_endian) gdal.SetConfigOption('GDAL_FORCE_CACHING', oldval) return ret ############################################################################### # Test PREDICTOR_OVERVIEW=2 option. (#3414) def test_tiff_ovr_37(both_endian): shutil.copy('../gdrivers/data/n43.dt0', 'tmp/ovr37.dt0') ds = gdal.Open('tmp/ovr37.dt0') assert ds is not None, 'Failed to open test dataset.' gdal.SetConfigOption('PREDICTOR_OVERVIEW', '2') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'LZW') ds.BuildOverviews('NEAR', overviewlist=[2]) gdal.SetConfigOption('PREDICTOR_OVERVIEW', None) gdal.SetConfigOption('COMPRESS_OVERVIEW', None) ds = None ds = gdal.Open('tmp/ovr37.dt0') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 45378, 'got wrong overview checksum.' ds = None predictor2_size = os.stat('tmp/ovr37.dt0.ovr')[stat.ST_SIZE] # 3957 : on little-endian host # XXXX : on big-endian host ??? FIXME: To be updated assert predictor2_size == 3957, 'did not get expected file size.' ############################################################################### # Test that the predictor flag gets well propagated to internal overviews def test_tiff_ovr_38(both_endian): # Skip with old libtiff (crash with 3.8.2) md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdaltest.tiff_drv.CreateCopy('tmp/ovr38.tif', src_ds, options=['COMPRESS=LZW', 'PREDICTOR=2']) ds.BuildOverviews(overviewlist=[2, 4]) ds = None file_size = os.stat('tmp/ovr38.tif')[stat.ST_SIZE] assert file_size <= 21000, 'did not get expected file size.' ############################################################################### # Test external overviews on all datatypes def test_tiff_ovr_39(both_endian): for datatype in [gdal.GDT_Byte, gdal.GDT_Int16, gdal.GDT_UInt16, gdal.GDT_Int32, gdal.GDT_UInt32, gdal.GDT_Float32, gdal.GDT_Float64, gdal.GDT_CInt16, gdal.GDT_CInt32, gdal.GDT_CFloat32, gdal.GDT_CFloat64]: gdal.Translate('tmp/ovr39.tif', 'data/byte.tif', options='-ot ' + gdal.GetDataTypeName(datatype)) try: os.remove('tmp/ovr39.tif.ovr') except OSError: pass ds = gdal.Open('tmp/ovr39.tif') ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr39.tif.ovr') ovr_datatype = ds.GetRasterBand(1).DataType ds = None assert datatype == ovr_datatype, 'did not get expected datatype' ds = gdal.Open('tmp/ovr39.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None if gdal.DataTypeIsComplex(datatype): expected_cs = 1171 else: expected_cs = 1087 assert cs == expected_cs, \ ('did not get expected checksum for datatype %s' % gdal.GetDataTypeName(datatype)) ############################################################################### # Test external overviews on 1 bit datasets with AVERAGE_BIT2GRAYSCALE (similar to tiff_ovr_4) def test_tiff_ovr_40(both_endian): shutil.copyfile('data/oddsize_1bit2b.tif', 'tmp/ovr40.tif') wrk_ds = gdal.Open('tmp/ovr40.tif') assert wrk_ds is not None, 'Failed to open test dataset.' wrk_ds.BuildOverviews('AVERAGE_BIT2GRAYSCALE', overviewlist=[2, 4]) wrk_ds = None wrk_ds = gdal.Open('tmp/ovr40.tif') ovband = wrk_ds.GetRasterBand(1).GetOverview(1) md = ovband.GetMetadata() assert 'RESAMPLING' in md and md['RESAMPLING'] == 'AVERAGE_BIT2GRAYSCALE', \ 'Did not get expected RESAMPLING metadata.' # compute average value of overview band image data. ovimage = ovband.ReadRaster(0, 0, ovband.XSize, ovband.YSize) pix_count = ovband.XSize * ovband.YSize total = 0.0 is_bytes = False if (isinstance(ovimage, bytes) and not isinstance(ovimage, str)): is_bytes = True if is_bytes is True: for i in range(pix_count): total += ovimage[i] else: for i in range(pix_count): total += ord(ovimage[i]) average = total / pix_count exp_average = 153.0656 assert abs(average - exp_average) <= 0.1, 'got wrong average for overview image' # Read base band as overview resolution and verify we aren't getting # the grayscale image. frband = wrk_ds.GetRasterBand(1) ovimage = frband.ReadRaster(0, 0, frband.XSize, frband.YSize, ovband.XSize, ovband.YSize) pix_count = ovband.XSize * ovband.YSize total = 0.0 if is_bytes is True: for i in range(pix_count): total += ovimage[i] else: for i in range(pix_count): total += ord(ovimage[i]) average = total / pix_count exp_average = 0.6096 assert abs(average - exp_average) <= 0.01, 'got wrong average for downsampled image' wrk_ds = None ############################################################################### # Test external overviews on 1 bit datasets with NEAREST def test_tiff_ovr_41(both_endian): shutil.copyfile('data/oddsize_1bit2b.tif', 'tmp/ovr41.tif') ds = gdal.Open('tmp/ovr41.tif') # data = wrk_ds.GetRasterBand(1).ReadRaster(0,0,99,99,50,50) ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None # ds = gdaltest.tiff_drv.Create('tmp/ovr41.tif.handmade.ovr',50,50,1,options=['NBITS=1']) # ds.GetRasterBand(1).WriteRaster(0,0,50,50,data) # ds = None ds = gdal.Open('tmp/ovr41.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() ds = None assert cs == 1496, 'did not get expected checksum' ############################################################################### # Test external overviews on dataset with color table def test_tiff_ovr_42(both_endian): ct_data = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255)] ct = gdal.ColorTable() for i, data in enumerate(ct_data): ct.SetColorEntry(i, data) ds = gdaltest.tiff_drv.Create('tmp/ovr42.tif', 1, 1) ds.GetRasterBand(1).SetRasterColorTable(ct) ds = None ds = gdal.Open('tmp/ovr42.tif') ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None ds = gdal.Open('tmp/ovr42.tif.ovr') ct2 = ds.GetRasterBand(1).GetRasterColorTable() assert (ct2.GetCount() == 256 and \ ct2.GetColorEntry(0) == (255, 0, 0, 255) and \ ct2.GetColorEntry(1) == (0, 255, 0, 255) and \ ct2.GetColorEntry(2) == (0, 0, 255, 255) and \ ct2.GetColorEntry(3) == (255, 255, 255, 255)), 'Wrong color table entry.' ds = None ############################################################################### # Make sure that 16bit overviews with JPEG compression are handled using 12-bit # jpeg-in-tiff (#3539) def test_tiff_ovr_43(both_endian): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() old_accum = gdal.GetConfigOption('CPL_ACCUM_ERROR_MSG', 'OFF') gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', 'ON') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') try: ds = gdal.Open('data/mandrilmini_12bitjpeg.tif') ds.GetRasterBand(1).ReadRaster(0, 0, 1, 1) except: ds = None gdal.PopErrorHandler() gdal.SetConfigOption('CPL_ACCUM_ERROR_MSG', old_accum) if gdal.GetLastErrorMsg().find( 'Unsupported JPEG data precision 12') != -1: sys.stdout.write('(12bit jpeg not available) ... ') pytest.skip() ds = gdaltest.tiff_drv.Create('tmp/ovr43.tif', 16, 16, 1, gdal.GDT_UInt16) ds.GetRasterBand(1).Fill(4000) ds = None try: os.remove('tmp/ovr43.tif.ovr') except OSError: pass ds = gdal.Open('tmp/ovr43.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG') ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) ds = gdal.Open('tmp/ovr43.tif.ovr') md = ds.GetRasterBand(1).GetMetadata('IMAGE_STRUCTURE') cs = ds.GetRasterBand(1).Checksum() ds = None assert 'NBITS' in md and md['NBITS'] == '12', 'did not get expected NBITS' assert cs == 642, 'did not get expected checksum' gdaltest.tiff_drv.Delete('tmp/ovr43.tif') ############################################################################### # Test that we can change overview block size through GDAL_TIFF_OVR_BLOCKSIZE configuration # option def test_tiff_ovr_44(both_endian): shutil.copyfile('data/byte.tif', 'tmp/ovr44.tif') gdal.SetConfigOption('GDAL_TIFF_OVR_BLOCKSIZE', '256') ds = gdal.Open('tmp/ovr44.tif', gdal.GA_Update) ds.BuildOverviews(overviewlist=[2]) ds = None gdal.SetConfigOption('GDAL_TIFF_OVR_BLOCKSIZE', None) ds = gdal.Open('tmp/ovr44.tif') ovr_band = ds.GetRasterBand(1).GetOverview(0) if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ovr_band.GetBlockSize() assert blockx == 256 and blocky == 256, 'did not get expected block size' cs = ovr_band.Checksum() ds = None gdaltest.tiff_drv.Delete('tmp/ovr44.tif') assert cs == 1087, 'did not get expected checksum' ############################################################################### # Same as tiff_ovr_44, but with external overviews def test_tiff_ovr_45(both_endian): shutil.copyfile('data/byte.tif', 'tmp/ovr45.tif') gdal.SetConfigOption('GDAL_TIFF_OVR_BLOCKSIZE', '256') ds = gdal.Open('tmp/ovr45.tif', gdal.GA_ReadOnly) ds.BuildOverviews(overviewlist=[2]) ds = None gdal.SetConfigOption('GDAL_TIFF_OVR_BLOCKSIZE', None) ds = gdal.Open('tmp/ovr45.tif.ovr') ovr_band = ds.GetRasterBand(1) if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ovr_band.GetBlockSize() assert blockx == 256 and blocky == 256, 'did not get expected block size' cs = ovr_band.Checksum() ds = None gdaltest.tiff_drv.Delete('tmp/ovr45.tif') assert cs == 1087, 'did not get expected checksum' ############################################################################### # Test overview on a dataset where width * height > 2 billion def test_tiff_ovr_46(): md = gdaltest.tiff_drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('BigTIFF') == -1: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() # Test NEAREST gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('NEAREST', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test AVERAGE in optimized case (x2 reduction) gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test AVERAGE in un-optimized case (x3 reduction) gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('AVERAGE', overviewlist=[3]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test AVERAGE in un-optimized case (color table) gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 0, 0)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test GAUSS gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('GAUSS', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test GAUSS with color table gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ct = gdal.ColorTable() ct.SetColorEntry(0, (255, 0, 0)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.BuildOverviews('GAUSS', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test MODE gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('MODE', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') # Test CUBIC gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', 'YES') ds = gdaltest.tiff_drv.Create('/vsimem/tiff_ovr_46.tif', 50000, 50000, options=['SPARSE_OK=YES']) ds.BuildOverviews('CUBIC', overviewlist=[2]) ds = None gdal.SetConfigOption('GTIFF_DONT_WRITE_BLOCKS', None) gdaltest.tiff_drv.Delete('/vsimem/tiff_ovr_46.tif') ############################################################################### # Test workaround with libtiff 3.X when creating interleaved overviews def test_tiff_ovr_47(both_endian): mem_drv = gdal.GetDriverByName('MEM') mem_ds = mem_drv.Create('', 852, 549, 3) for i in range(1, 4): band = mem_ds.GetRasterBand(i) band.Fill(128) driver = gdal.GetDriverByName("GTIFF") out_ds = driver.CreateCopy("/vsimem/tiff_ovr_47.tif", mem_ds) mem_ds = None out_ds.BuildOverviews("NEAREST", [2, 4, 8, 16]) out_ds = None ds = gdal.Open("/vsimem/tiff_ovr_47.tif") cs = ds.GetRasterBand(1).GetOverview(1).Checksum() ds = None gdal.Unlink("/vsimem/tiff_ovr_47.tif") assert cs == 35721, 'did not get expected checksum' ############################################################################### # Test that we don't average 0's in alpha band def test_tiff_ovr_48(both_endian): shutil.copy('data/rgba_with_alpha_0_and_255.tif', 'tmp') ds = gdal.Open('tmp/rgba_with_alpha_0_and_255.tif') ds.BuildOverviews('AVERAGE', [2]) ds = None ds = gdal.Open('tmp/rgba_with_alpha_0_and_255.tif.ovr') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == 3, i # But if we define GDAL_OVR_PROPAGATE_NODATA, a nodata value in source # samples will cause the target pixel to be zeroed. shutil.copy('data/rgba_with_alpha_0_and_255.tif', 'tmp') ds = gdal.Open('tmp/rgba_with_alpha_0_and_255.tif') gdal.SetConfigOption('GDAL_OVR_PROPAGATE_NODATA', 'YES') ds.BuildOverviews('AVERAGE', [2]) gdal.SetConfigOption('GDAL_OVR_PROPAGATE_NODATA', None) ds = None ds = gdal.Open('tmp/rgba_with_alpha_0_and_255.tif.ovr') for i in range(4): cs = ds.GetRasterBand(i + 1).Checksum() assert cs == 0, i ############################################################################### # Test possible stride computation issue in GDALRegenerateOverviewsMultiBand (#5653) def test_tiff_ovr_49(both_endian): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_ovr_49.tif', 1023, 1023, 1) ds.GetRasterBand(1).Fill(0) c = '\xFF' # Fails on 1.11.1 with col = 255 or col = 1019 col = 1019 ds.GetRasterBand(1).WriteRaster(col, 0, 1, 1023, c, 1, 1) ds = None ds = gdal.Open('/vsimem/tiff_ovr_49.tif') gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') ds.BuildOverviews('AVERAGE', overviewlist=[2]) gdal.SetConfigOption('COMPRESS_OVERVIEW', None) ds = None ds = gdal.Open('/vsimem/tiff_ovr_49.tif.ovr') assert ds.GetRasterBand(1).Checksum() != 0 ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_49.tif') ############################################################################### # Test overviews when X dimension is smaller than Y (#5794) def test_tiff_ovr_50(both_endian): ds = gdal.GetDriverByName('GTiff').Create('/vsimem/tiff_ovr_50.tif', 6, 8192, 3, options=['COMPRESS=DEFLATE']) ds.GetRasterBand(1).Fill(255) # We just check that it doesn't crash ds.BuildOverviews('AVERAGE', overviewlist=[2, 4, 8, 16, 32]) ds.BuildOverviews('AVERAGE', overviewlist=[2, 4, 8, 16, 32]) ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_50.tif') ############################################################################### # Test average overview on a color palette with nodata values (#6371) def test_tiff_ovr_51(): src_ds = gdal.Open('data/stefan_full_rgba_pct32.png') if src_ds is None: pytest.skip() ds = gdal.GetDriverByName('PNG').CreateCopy('/vsimem/tiff_ovr_51.png', src_ds) ds.BuildOverviews('AVERAGE', [2]) ds = None ds = gdal.Open('/vsimem/tiff_ovr_51.png.ovr') cs = ds.GetRasterBand(1).Checksum() assert cs == 24518 ds = None gdal.GetDriverByName('PNG').Delete('/vsimem/tiff_ovr_51.png') ############################################################################### # Test unsorted external overview building (#6617) def test_tiff_ovr_52(): src_ds = gdal.Open('data/byte.tif') if src_ds is None: pytest.skip() gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_52.tif', src_ds) gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL') ds = gdal.Open('/vsimem/tiff_ovr_52.tif') ds.BuildOverviews('NEAR', [4]) ds = None ds = gdal.Open('/vsimem/tiff_ovr_52.tif') ds.BuildOverviews('NEAR', [2]) ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('INTERLEAVE_OVERVIEW', None) ds = gdal.Open('/vsimem/tiff_ovr_52.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 328 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 1087 ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_52.tif') gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_52.tif', src_ds) gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL') ds = gdal.Open('/vsimem/tiff_ovr_52.tif') ds.BuildOverviews('NEAR', [4, 2]) ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('INTERLEAVE_OVERVIEW', None) ds = gdal.Open('/vsimem/tiff_ovr_52.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 328 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 1087 ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_52.tif') ############################################################################### # Test external overviews building in several steps def test_tiff_ovr_53(): src_ds = gdal.Open('data/byte.tif') if src_ds is None: pytest.skip() gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_53.tif', src_ds) ds = gdal.Open('/vsimem/tiff_ovr_53.tif') ds.BuildOverviews('NEAR', [2]) ds = None # Note: currently this will compute it from the base raster and not # ov_factor=2 ! ds = gdal.Open('/vsimem/tiff_ovr_53.tif') ds.BuildOverviews('NEAR', [4]) ds = None ds = gdal.Open('/vsimem/tiff_ovr_53.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 328 ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_53.tif') # Compressed code path gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_53.tif', src_ds) gdal.SetConfigOption('COMPRESS_OVERVIEW', 'DEFLATE') gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL') ds = gdal.Open('/vsimem/tiff_ovr_53.tif') ds.BuildOverviews('NEAR', [2]) ds = None # Note: currently this will compute it from the base raster and not # ov_factor=2 ! ds = gdal.Open('/vsimem/tiff_ovr_53.tif') ds.BuildOverviews('NEAR', [4]) ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('INTERLEAVE_OVERVIEW', None) ds = gdal.Open('/vsimem/tiff_ovr_53.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() assert cs == 1087 cs = ds.GetRasterBand(1).GetOverview(1).Checksum() assert cs == 328 ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_53.tif') ############################################################################### # Test external overviews building in several steps with jpeg compression def test_tiff_ovr_54(): drv = gdal.GetDriverByName('GTiff') md = drv.GetMetadata() if md['DMD_CREATIONOPTIONLIST'].find('JPEG') == -1: pytest.skip() src_ds = gdal.Open('../gdrivers/data/small_world.tif') gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/tiff_ovr_54.tif', src_ds) gdal.SetConfigOption('COMPRESS_OVERVIEW', 'JPEG') gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', 'YCBCR') gdal.SetConfigOption('INTERLEAVE_OVERVIEW', 'PIXEL') ds = gdal.Open('/vsimem/tiff_ovr_54.tif') ds.BuildOverviews('AVERAGE', [2]) ds = None ds = gdal.Open('/vsimem/tiff_ovr_54.tif') ds.BuildOverviews('AVERAGE', [4]) ds = None gdal.SetConfigOption('COMPRESS_OVERVIEW', None) gdal.SetConfigOption('PHOTOMETRIC_OVERVIEW', None) gdal.SetConfigOption('INTERLEAVE_OVERVIEW', None) ds = gdal.Open('/vsimem/tiff_ovr_54.tif') cs0 = ds.GetRasterBand(1).GetOverview(0).Checksum() cs1 = ds.GetRasterBand(1).GetOverview(1).Checksum() ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_54.tif') assert not (cs0 == 0 or cs1 == 0) ############################################################################### def test_tiff_ovr_too_many_levels_contig(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/tiff_ovr_too_many_levels_contig.tif' ds = gdal.GetDriverByName('GTiff').CreateCopy(tmpfilename, src_ds) ds.BuildOverviews('AVERAGE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]) assert ds.GetRasterBand(1).GetOverviewCount() == 5 ds.BuildOverviews('AVERAGE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]) assert ds.GetRasterBand(1).GetOverviewCount() == 5 ds = None gdal.GetDriverByName('GTiff').Delete(tmpfilename) ############################################################################### def test_tiff_ovr_too_many_levels_separate(): src_ds = gdal.Open('data/separate_tiled.tif') tmpfilename = '/vsimem/tiff_ovr_too_many_levels_separate.tif' ds = gdal.GetDriverByName('GTiff').CreateCopy(tmpfilename, src_ds) ds.BuildOverviews('AVERAGE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]) assert ds.GetRasterBand(1).GetOverviewCount() == 6 assert ds.GetRasterBand(1).GetOverviewCount() == 6 ds = None gdal.GetDriverByName('GTiff').Delete(tmpfilename) ############################################################################### def test_tiff_ovr_too_many_levels_external(): src_ds = gdal.Open('data/byte.tif') tmpfilename = '/vsimem/tiff_ovr_too_many_levels_contig.tif' gdal.GetDriverByName('GTiff').CreateCopy(tmpfilename, src_ds) ds = gdal.Open(tmpfilename) ds.BuildOverviews('AVERAGE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]) assert ds.GetRasterBand(1).GetOverviewCount() == 5 ds.BuildOverviews('AVERAGE', [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]) assert ds.GetRasterBand(1).GetOverviewCount() == 5 ds = None gdal.GetDriverByName('GTiff').Delete(tmpfilename) ############################################################################### def test_tiff_ovr_average_multiband_vs_singleband(): gdal.Translate('/vsimem/tiff_ovr_average_multiband_band.tif', 'data/reproduce_average_issue.tif', creationOptions=['INTERLEAVE=BAND']) gdal.Translate('/vsimem/tiff_ovr_average_multiband_pixel.tif', 'data/reproduce_average_issue.tif', creationOptions=['INTERLEAVE=PIXEL']) ds = gdal.Open('/vsimem/tiff_ovr_average_multiband_band.tif', gdal.GA_Update) ds.BuildOverviews('AVERAGE', [2]) cs_band = [ds.GetRasterBand(i+1).GetOverview(0).Checksum() for i in range(3)] ds = None ds = gdal.Open('/vsimem/tiff_ovr_average_multiband_pixel.tif', gdal.GA_Update) ds.BuildOverviews('AVERAGE', [2]) cs_pixel = [ds.GetRasterBand(i+1).GetOverview(0).Checksum() for i in range(3)] ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_average_multiband_band.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/tiff_ovr_average_multiband_pixel.tif') assert cs_band == cs_pixel gdalautotest-3.0.4/gcore/hdf4_read.py0000755003401500001440000002550513614005323017130 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: hdf4_read.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic read support for a all datatypes from a HDF file. # Author: Andrey Kiselev, dron@remotesensing.org # ############################################################################### # Copyright (c) 2003, Andrey Kiselev # Copyright (c) 2009-2012, Even Rouault # # 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. ############################################################################### import pytest import gdaltest from osgeo import gdal init_list = [ ('byte_3.hdf', 4672), ('int16_3.hdf', 4672), ('uint16_3.hdf', 4672), ('int32_3.hdf', 4672), ('uint32_3.hdf', 4672), ('float32_3.hdf', 4672), ('float64_3.hdf', 4672), ('utmsmall_3.hdf', 50054), ('byte_2.hdf', 4672), ('int16_2.hdf', 4672), ('uint16_2.hdf', 4672), ('int32_2.hdf', 4672), ('uint32_2.hdf', 4672), ('float32_2.hdf', 4672), ('float64_2.hdf', 4672), ('utmsmall_2.hdf', 50054)] @pytest.mark.parametrize( 'filename,checksum', init_list, ids=[tup[0].split('.')[0] for tup in init_list], ) @pytest.mark.require_driver('HDF4Image') def test_hdf4_open(filename, checksum): ut = gdaltest.GDALTest('HDF4Image', filename, 1, checksum) ut.testOpen() ############################################################################### # Test HDF4_SDS with single subdataset def test_hdf4_read_online_1(): gdaltest.hdf4_drv = gdal.GetDriverByName('HDF4') if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/A2004259075000.L2_LAC_SST.hdf', 'A2004259075000.L2_LAC_SST.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'tmp/cache/A2004259075000.L2_LAC_SST.hdf', 1, 28189, filename_absolute=1) return tst.testOpen() ############################################################################### # Test HDF4_SDS with GEOLOCATION info def test_hdf4_read_online_2(): if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/A2006005182000.L2_LAC_SST.x.hdf', 'A2006005182000.L2_LAC_SST.x.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'HDF4_SDS:UNKNOWN:"tmp/cache/A2006005182000.L2_LAC_SST.x.hdf":13', 1, 13209, filename_absolute=1) tst.testOpen() ds = gdal.Open('HDF4_SDS:UNKNOWN:"tmp/cache/A2006005182000.L2_LAC_SST.x.hdf":13') md = ds.GetMetadata('GEOLOCATION') ds = None assert md['X_DATASET'] == 'HDF4_SDS:UNKNOWN:"tmp/cache/A2006005182000.L2_LAC_SST.x.hdf":11', \ 'Did not get expected X_DATASET' ############################################################################### # Test HDF4_EOS:EOS_GRID def test_hdf4_read_online_3(): if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/MO36MW14.chlor_MODIS.ADD2001089.004.2002186190207.hdf', 'MO36MW14.chlor_MODIS.ADD2001089.004.2002186190207.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'tmp/cache/MO36MW14.chlor_MODIS.ADD2001089.004.2002186190207.hdf', 1, 34723, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/MO36MW14.chlor_MODIS.ADD2001089.004.2002186190207.hdf') gt = ds.GetGeoTransform() expected_gt = [-180.0, 0.3515625, 0.0, 90.0, 0.0, -0.3515625] for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1e-8, 'did not get expected gt' srs = ds.GetProjectionRef() assert srs.find('Clarke') != -1, 'did not get expected projection' ds = None ############################################################################### # Test HDF4_SDS:SEAWIFS_L1A def test_hdf4_read_online_4(): if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/S2002196124536.L1A_HDUN.BartonBendish.extract.hdf', 'S2002196124536.L1A_HDUN.BartonBendish.extract.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'tmp/cache/S2002196124536.L1A_HDUN.BartonBendish.extract.hdf', 1, 33112, filename_absolute=1) tst.testOpen() ds = gdal.Open('tmp/cache/S2002196124536.L1A_HDUN.BartonBendish.extract.hdf') assert ds.RasterCount == 8, 'did not get expected band number' ds = None ############################################################################### # Test fix for #2208 def test_hdf4_read_online_5(): if gdaltest.hdf4_drv is None: pytest.skip() # 13 MB if not gdaltest.download_file('ftp://data.nodc.noaa.gov/pub/data.nodc/pathfinder/Version5.0/Monthly/1991/199101.s04m1pfv50-sst-16b.hdf', '199101.s04m1pfv50-sst-16b.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'tmp/cache/199101.s04m1pfv50-sst-16b.hdf', 1, 41173, filename_absolute=1) tst.testOpen() ############################################################################### # Test fix for #3386 where block size is dataset size def test_hdf4_read_online_6(): if gdaltest.hdf4_drv is None: pytest.skip() # 1 MB if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/MOD09Q1G_EVI.A2006233.h07v03.005.2008338190308.hdf', 'MOD09Q1G_EVI.A2006233.h07v03.005.2008338190308.hdf'): pytest.skip() # Test with quoting of components tst = gdaltest.GDALTest('HDF4Image', 'HDF4_EOS:EOS_GRID:"tmp/cache/MOD09Q1G_EVI.A2006233.h07v03.005.2008338190308.hdf":"MODIS_NACP_EVI":"MODIS_EVI"', 1, 12197, filename_absolute=1) tst.testOpen() ds = gdal.Open('HDF4_EOS:EOS_GRID:tmp/cache/MOD09Q1G_EVI.A2006233.h07v03.005.2008338190308.hdf:MODIS_NACP_EVI:MODIS_EVI') if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ds.GetRasterBand(1).GetBlockSize() assert blockx == 4800 and blocky == 4800, "Did not get expected block size" cs = ds.GetRasterBand(1).Checksum() assert cs == 12197, 'did not get expected checksum' ds = None ############################################################################### # Test fix for #3386 where block size is smaller than dataset size def test_hdf4_read_online_7(): if gdaltest.hdf4_drv is None: pytest.skip() # 4 MB if not gdaltest.download_file('http://download.osgeo.org/gdal/data/hdf4/MOD09A1.A2010041.h06v03.005.2010051001103.hdf', 'MOD09A1.A2010041.h06v03.005.2010051001103.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'HDF4_EOS:EOS_GRID:tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf:MOD_Grid_500m_Surface_Reflectance:sur_refl_b01', 1, 54894, filename_absolute=1) tst.testOpen() ds = gdal.Open('HDF4_EOS:EOS_GRID:tmp/cache/MOD09A1.A2010041.h06v03.005.2010051001103.hdf:MOD_Grid_500m_Surface_Reflectance:sur_refl_b01') if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ds.GetRasterBand(1).GetBlockSize() assert blockx == 2400 and blocky == 32, "Did not get expected block size" cs = ds.GetRasterBand(1).Checksum() assert cs == 54894, 'did not get expected checksum' ds = None ############################################################################### # Test reading a HDF4_EOS:EOS_GRID where preferred block height reported would be 1 # but that will lead to very poor performance (#3386) def test_hdf4_read_online_8(): if gdaltest.hdf4_drv is None: pytest.skip() # 5 MB if not gdaltest.download_file('ftp://e4ftl01u.ecs.nasa.gov/MODIS_Composites/MOLT/MOD13Q1.005/2006.06.10/MOD13Q1.A2006161.h21v13.005.2008234103220.hdf', 'MOD13Q1.A2006161.h21v13.005.2008234103220.hdf'): pytest.skip() tst = gdaltest.GDALTest('HDF4Image', 'HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h21v13.005.2008234103220.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI', 1, 53837, filename_absolute=1) tst.testOpen() ds = gdal.Open('HDF4_EOS:EOS_GRID:tmp/cache/MOD13Q1.A2006161.h21v13.005.2008234103220.hdf:MODIS_Grid_16DAY_250m_500m_VI:250m 16 days NDVI') cs = ds.GetRasterBand(1).Checksum() assert cs == 53837, 'did not get expected checksum' if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ds.GetRasterBand(1).GetBlockSize() if blockx != 4800 or blocky == 1: print('blockx=%d, blocky=%d' % (blockx, blocky)) pytest.fail("Did not get expected block size") ds = None ############################################################################### # Test reading L1G MTL metadata metadata def test_hdf4_read_online_9(): if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://www.geogratis.cgdi.gc.ca/download/landsat_7/hdf/L71002025_02520010722/L71002025_02520010722_MTL.L1G', 'L71002025_02520010722_MTL.L1G'): pytest.skip() if not gdaltest.download_file('http://www.geogratis.cgdi.gc.ca/download/landsat_7/hdf/L71002025_02520010722/L71002025_02520010722_HDF.L1G', 'L71002025_02520010722_HDF.L1G'): pytest.skip() f = open('tmp/cache/L71002025_02520010722_B10.L1G', 'wb') f.close() ds = gdal.Open('HDF4_SDS:UNKNOWN:"tmp/cache/L71002025_02520010722_HDF.L1G":0') gcp_count = ds.GetGCPCount() ds = None assert gcp_count == 4, 'did not get expected gcp count' ############################################################################### # Test that non-tiled access works (#4672) def test_hdf4_read_online_10(): if gdaltest.hdf4_drv is None: pytest.skip() if not gdaltest.download_file('http://trac.osgeo.org/gdal/raw-attachment/ticket/4672/MOD16A2.A2000M01.h14v02.105.2010357183410.hdf', 'MOD16A2.A2000M01.h14v02.105.2010357183410.hdf'): pytest.skip() ds = gdal.Open('HDF4_EOS:EOS_GRID:"tmp/cache/MOD16A2.A2000M01.h14v02.105.2010357183410.hdf":MOD_Grid_MOD16A2:ET_1km') if 'GetBlockSize' in dir(gdal.Band): (blockx, blocky) = ds.GetRasterBand(1).GetBlockSize() assert blockx == 1200 and blocky == 833, "Did not get expected block size" cs = ds.GetRasterBand(1).Checksum() assert cs == 20976, 'did not get expected checksum' ds = None gdalautotest-3.0.4/gcore/vsioss.py0000755003401500001440000013241213614005323016632 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vsioss.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test /vsioss # 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. ############################################################################### import stat import sys from osgeo import gdal import gdaltest import webserver import pytest def open_for_read(uri): """ Opens a test file for reading. """ return gdal.VSIFOpenExL(uri, 'rb', 1) ############################################################################### def test_visoss_init(): gdaltest.oss_vars = {} for var in ('OSS_SECRET_ACCESS_KEY', 'OSS_ACCESS_KEY_ID', 'OSS_TIMESTAMP', 'OSS_HTTPS', 'OSS_VIRTUAL_HOSTING', 'OSS_ENDPOINT'): gdaltest.oss_vars[var] = gdal.GetConfigOption(var) if gdaltest.oss_vars[var] is not None: gdal.SetConfigOption(var, "") assert gdal.GetSignedURL('/vsioss/foo/bar') is None ############################################################################### # Error cases def test_visoss_1(): if not gdaltest.built_against_curl(): pytest.skip() # Missing OSS_SECRET_ACCESS_KEY gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsioss/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('OSS_SECRET_ACCESS_KEY') >= 0 gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('OSS_SECRET_ACCESS_KEY') >= 0 gdal.SetConfigOption('OSS_SECRET_ACCESS_KEY', 'OSS_SECRET_ACCESS_KEY') # Missing OSS_ACCESS_KEY_ID gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsioss/foo/bar') assert f is None and gdal.VSIGetLastErrorMsg().find('OSS_ACCESS_KEY_ID') >= 0 gdal.SetConfigOption('OSS_ACCESS_KEY_ID', 'OSS_ACCESS_KEY_ID') def test_visoss_real_test(): if not gdaltest.built_against_curl(): pytest.skip() if gdaltest.skip_on_travis(): pytest.skip() # ERROR 1: The OSS Access Key Id you provided does not exist in our records. gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsioss/foo/bar.baz') if f is not None or gdal.VSIGetLastErrorMsg() == '': if f is not None: gdal.VSIFCloseL(f) if gdal.GetConfigOption('APPVEYOR') is not None: return pytest.fail(gdal.VSIGetLastErrorMsg()) gdal.ErrorReset() with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/foo/bar.baz') assert f is None and gdal.VSIGetLastErrorMsg() != '' ############################################################################### def test_visoss_start_webserver(): 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('OSS_SECRET_ACCESS_KEY', 'OSS_SECRET_ACCESS_KEY') gdal.SetConfigOption('OSS_ACCESS_KEY_ID', 'OSS_ACCESS_KEY_ID') gdal.SetConfigOption('CPL_OSS_TIMESTAMP', 'my_timestamp') gdal.SetConfigOption('OSS_HTTPS', 'NO') gdal.SetConfigOption('OSS_VIRTUAL_HOSTING', 'NO') gdal.SetConfigOption('OSS_ENDPOINT', '127.0.0.1:%d' % gdaltest.webserver_port) ############################################################################### def get_oss_fake_bucket_resource_method(request): request.protocol_version = 'HTTP/1.1' if 'Authorization' not in request.headers: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) return expected_authorization = 'OSS OSS_ACCESS_KEY_ID:ZFgKjvMtWUwm9CTeCYoPomhuJiE=' 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.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) ############################################################################### # Test with a fake OSS server def test_visoss_2(): if gdaltest.webserver_port == 0: pytest.skip() signed_url = gdal.GetSignedURL('/vsioss/oss_fake_bucket/resource', ['START_DATE=20180212T123456Z']) assert (signed_url in ('http://127.0.0.1:8080/oss_fake_bucket/resource?Expires=1518442496&OSSAccessKeyId=OSS_ACCESS_KEY_ID&Signature=bpFqur6tQMNN7Xe7UHVFFrugmgs%3D', 'http://127.0.0.1:8081/oss_fake_bucket/resource?Expires=1518442496&OSSAccessKeyId=OSS_ACCESS_KEY_ID&Signature=bpFqur6tQMNN7Xe7UHVFFrugmgs%3D')) handler = webserver.SequentialHandler() handler.add('GET', '/oss_fake_bucket/resource', custom_method=get_oss_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/oss_fake_bucket/resource', custom_method=get_oss_fake_bucket_resource_method) with webserver.install_http_handler(handler): f = open_for_read('/vsioss_streaming/oss_fake_bucket/resource') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(400) response = """ AccessDenied The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. unused unuset localhost:%d """ % request.server.port response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.send_header('Connection', 'close') request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/oss_fake_bucket/redirect', custom_method=method) def method(request): request.protocol_version = 'HTTP/1.1' if request.headers['Host'].startswith('localhost'): request.send_response(200) request.send_header('Content-type', 'text/plain') request.send_header('Content-Length', 3) request.send_header('Connection', 'close') request.end_headers() request.wfile.write("""foo""".encode('ascii')) else: sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) handler.add('GET', '/oss_fake_bucket/redirect', custom_method=method) # Test region and endpoint 'redirects' with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_fake_bucket/redirect') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) if data != 'foo': if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail(data) # Test region and endpoint 'redirects' handler.req_count = 0 with webserver.install_http_handler(handler): f = open_for_read('/vsioss_streaming/oss_fake_bucket/redirect') assert f is not None data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo' handler = webserver.SequentialHandler() def method(request): # /vsioss_streaming/ should have remembered the change of region and endpoint if not request.headers['Host'].startswith('localhost'): sys.stderr.write('Bad headers: %s\n' % str(request.headers)) request.send_response(403) request.protocol_version = 'HTTP/1.1' request.send_response(400) response = 'bla' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) request.send_header('Content-type', 'application/xml') request.send_header('Transfer-Encoding', 'chunked') request.send_header('Connection', 'close') request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/oss_fake_bucket/non_xml_error', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/non_xml_error') assert f is None and gdal.VSIGetLastErrorMsg().find('bla') >= 0 handler = webserver.SequentialHandler() response = '' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/oss_fake_bucket/invalid_xml_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/invalid_xml_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = '' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/oss_fake_bucket/no_code_in_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/no_code_in_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'AuthorizationHeaderMalformed' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/oss_fake_bucket/no_region_in_AuthorizationHeaderMalformed_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/no_region_in_AuthorizationHeaderMalformed_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'PermanentRedirect' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/oss_fake_bucket/no_endpoint_in_PermanentRedirect_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/no_endpoint_in_PermanentRedirect_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 handler = webserver.SequentialHandler() response = 'bla' response = '%x\r\n%s\r\n0\r\n\r\n' % (len(response), response) handler.add('GET', '/oss_fake_bucket/no_message_in_error', 400, {'Content-type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Connection': 'close'}, response) gdal.ErrorReset() with webserver.install_http_handler(handler): with gdaltest.error_handler(): f = open_for_read('/vsioss_streaming/oss_fake_bucket/no_message_in_error') assert f is None and gdal.VSIGetLastErrorMsg().find('') >= 0 ############################################################################### # Test ReadDir() with a fake OSS server def test_visoss_3(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'application/xml') response = """ a_dir/ bla a_dir/resource3.bin 1970-01-01T00:00:01.000Z 123456 """ request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/oss_fake_bucket2/?delimiter=%2F&prefix=a_dir%2F', custom_method=method) def method(request): request.protocol_version = 'HTTP/1.1' request.send_response(200) request.send_header('Content-type', 'application/xml') response = """ a_dir/ a_dir/resource4.bin 2015-10-16T12:34:56.000Z 456789 a_dir/subdir/ """ request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('GET', '/oss_fake_bucket2/?delimiter=%2F&marker=bla&prefix=a_dir%2F', custom_method=method) with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_fake_bucket2/a_dir/resource3.bin') if f is None: if gdaltest.is_travis_branch('trusty'): pytest.skip('Skipped on trusty branch, but should be investigated') pytest.fail() gdal.VSIFCloseL(f) with webserver.install_http_handler(webserver.SequentialHandler()): dir_contents = gdal.ReadDir('/vsioss/oss_fake_bucket2/a_dir') assert dir_contents == ['resource3.bin', 'resource4.bin', 'subdir'] assert gdal.VSIStatL('/vsioss/oss_fake_bucket2/a_dir/resource3.bin').size == 123456 assert gdal.VSIStatL('/vsioss/oss_fake_bucket2/a_dir/resource3.bin').mtime == 1 # ReadDir on something known to be a file shouldn't cause network access dir_contents = gdal.ReadDir('/vsioss/oss_fake_bucket2/a_dir/resource3.bin') assert dir_contents is None # Test CPL_VSIL_CURL_NON_CACHED for config_option_value in ['/vsioss/oss_non_cached/test.txt', '/vsioss/oss_non_cached', '/vsioss/oss_non_cached:/vsioss/unrelated', '/vsioss/unrelated:/vsioss/oss_non_cached', '/vsioss/unrelated:/vsioss/oss_non_cached:/vsioss/unrelated']: with gdaltest.config_option('CPL_VSIL_CURL_NON_CACHED', config_option_value): handler = webserver.SequentialHandler() handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo', config_option_value handler = webserver.SequentialHandler() handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'bar2') with webserver.install_http_handler(handler): size = gdal.VSIStatL('/vsioss/oss_non_cached/test.txt').size assert size == 4, config_option_value handler = webserver.SequentialHandler() handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): size = gdal.VSIStatL('/vsioss/oss_non_cached/test.txt').size if size != 3: print(config_option_value) pytest.fail(data) handler = webserver.SequentialHandler() handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'bar2') with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'bar2', config_option_value # Retry without option for config_option_value in [None, '/vsioss/oss_non_cached/bar.txt']: with gdaltest.config_option('CPL_VSIL_CURL_NON_CACHED', config_option_value): handler = webserver.SequentialHandler() if config_option_value is None: handler.add('GET', '/oss_non_cached/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ / /test.txt 1970-01-01T00:00:01.000Z 40 /test2.txt 1970-01-01T00:00:01.000Z 40 """) handler.add('GET', '/oss_non_cached/test.txt', 200, {}, 'foo') with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 3, f).decode('ascii') gdal.VSIFCloseL(f) assert data == 'foo', config_option_value handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = open_for_read('/vsioss/oss_non_cached/test.txt') assert f is not None, config_option_value data = gdal.VSIFReadL(1, 4, f).decode('ascii') gdal.VSIFCloseL(f) # We should still get foo because of caching assert data == 'foo', config_option_value # List buckets (empty result) handler = webserver.SequentialHandler() handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, """ """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsioss/') assert dir_contents == ['.'] gdal.VSICurlClearCache() # List buckets handler = webserver.SequentialHandler() handler.add('GET', '/', 200, {'Content-type': 'application/xml'}, """ mybucket """) with webserver.install_http_handler(handler): dir_contents = gdal.ReadDir('/vsioss/') assert dir_contents == ['mybucket'] ############################################################################### # Test simple PUT support with a fake OSS server def test_visoss_4(): if gdaltest.webserver_port == 0: pytest.skip() with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3', 'wb') assert f is None handler = webserver.SequentialHandler() handler.add('GET', '/oss_fake_bucket3/empty_file.bin', 200, {'Connection': 'close'}, 'foo') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsioss/oss_fake_bucket3/empty_file.bin').size == 3 # Empty file handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '0': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/oss_fake_bucket3/empty_file.bin', custom_method=method) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/empty_file.bin', 'wb') assert f is not None gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('GET', '/oss_fake_bucket3/empty_file.bin', 200, {'Connection': 'close'}, '') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsioss/oss_fake_bucket3/empty_file.bin').size == 0 # Invalid seek handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/empty_file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFSeekL(f, 1, 0) assert ret != 0 gdal.VSIFCloseL(f) # Invalid read handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/empty_file.bin', 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFReadL(1, 1, f) assert not ret gdal.VSIFCloseL(f) # Error case handler = webserver.SequentialHandler() handler.add('PUT', '/oss_fake_bucket3/empty_file_error.bin', 403) with webserver.install_http_handler(handler): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/empty_file_error.bin', 'wb') assert f is not None gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '' # Nominal case with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket3/another_file.bin', 'wb') assert f is not None assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 assert gdal.VSIFSeekL(f, 0, 1) == 0 assert gdal.VSIFSeekL(f, 0, 2) == 0 assert gdal.VSIFWriteL('foo', 1, 3, f) == 3 assert gdal.VSIFSeekL(f, gdal.VSIFTellL(f), 0) == 0 assert gdal.VSIFWriteL('bar', 1, 3, f) == 3 handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '6': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.wfile.write('HTTP/1.1 100 Continue\r\n\r\n'.encode('ascii')) content = request.rfile.read(6).decode('ascii') if content != 'foobar': sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/oss_fake_bucket3/another_file.bin', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' ############################################################################### # Test simple DELETE support with a fake OSS server def test_visoss_5(): if gdaltest.webserver_port == 0: pytest.skip() with webserver.install_http_handler(webserver.SequentialHandler()): with gdaltest.error_handler(): ret = gdal.Unlink('/vsioss/foo') assert ret != 0 handler = webserver.SequentialHandler() handler.add('GET', '/oss_delete_bucket/delete_file', 200, {'Connection': 'close'}, 'foo') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsioss/oss_delete_bucket/delete_file').size == 3 with webserver.install_http_handler(webserver.SequentialHandler()): assert gdal.VSIStatL('/vsioss/oss_delete_bucket/delete_file').size == 3 handler = webserver.SequentialHandler() handler.add('DELETE', '/oss_delete_bucket/delete_file', 204) with webserver.install_http_handler(handler): ret = gdal.Unlink('/vsioss/oss_delete_bucket/delete_file') assert ret == 0 handler = webserver.SequentialHandler() handler.add('GET', '/oss_delete_bucket/delete_file', 404, {'Connection': 'close'}, 'foo') handler.add('GET', '/oss_delete_bucket/?delimiter=%2F&max-keys=100&prefix=delete_file%2F', 404, {'Connection': 'close'}, 'foo') with webserver.install_http_handler(handler): assert gdal.VSIStatL('/vsioss/oss_delete_bucket/delete_file') is None handler = webserver.SequentialHandler() handler.add('GET', '/oss_delete_bucket/delete_file_error', 200) handler.add('DELETE', '/oss_delete_bucket/delete_file_error', 403) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ret = gdal.Unlink('/vsioss/oss_delete_bucket/delete_file_error') assert ret != 0 ############################################################################### # Test multipart upload with a fake OSS server def test_visoss_6(): if gdaltest.webserver_port == 0: pytest.skip() with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB with webserver.install_http_handler(webserver.SequentialHandler()): f = gdal.VSIFOpenL('/vsioss/oss_fake_bucket4/large_file.bin', 'wb') assert f is not None size = 1024 * 1024 + 1 big_buffer = 'a' * size handler = webserver.SequentialHandler() def method(request): request.protocol_version = 'HTTP/1.1' response = 'my_id' request.send_response(200) request.send_header('Content-type', 'application/xml') request.send_header('Content-Length', len(response)) request.end_headers() request.wfile.write(response.encode('ascii')) handler.add('POST', '/oss_fake_bucket4/large_file.bin?uploads', custom_method=method) def method(request): if request.headers['Content-Length'] != '1048576': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('ETag', '"first_etag"') request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/oss_fake_bucket4/large_file.bin?partNumber=1&uploadId=my_id', custom_method=method) with webserver.install_http_handler(handler): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == size handler = webserver.SequentialHandler() def method(request): if request.headers['Content-Length'] != '1': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) return request.send_response(200) request.send_header('ETag', '"second_etag"') request.send_header('Content-Length', 0) request.end_headers() handler.add('PUT', '/oss_fake_bucket4/large_file.bin?partNumber=2&uploadId=my_id', custom_method=method) def method(request): if request.headers['Content-Length'] != '186': sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return content = request.rfile.read(186).decode('ascii') if content != """ 1"first_etag" 2"second_etag" """: sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(200) request.send_header('Content-Length', 0) request.end_headers() handler.add('POST', '/oss_fake_bucket4/large_file.bin?uploadId=my_id', custom_method=method) gdal.ErrorReset() with webserver.install_http_handler(handler): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('POST', '/oss_fake_bucket4/large_file_initiate_403_error.bin?uploads', 403) handler.add('POST', '/oss_fake_bucket4/large_file_initiate_empty_result.bin?uploads', 200) handler.add('POST', '/oss_fake_bucket4/large_file_initiate_invalid_xml_result.bin?uploads', 200, {}, 'foo') handler.add('POST', '/oss_fake_bucket4/large_file_initiate_no_uploadId.bin?uploads', 200, {}, '') with webserver.install_http_handler(handler): for filename in ['/vsioss/oss_fake_bucket4/large_file_initiate_403_error.bin', '/vsioss/oss_fake_bucket4/large_file_initiate_empty_result.bin', '/vsioss/oss_fake_bucket4/large_file_initiate_invalid_xml_result.bin', '/vsioss/oss_fake_bucket4/large_file_initiate_no_uploadId.bin']: with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0 gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '' handler = webserver.SequentialHandler() handler.add('POST', '/oss_fake_bucket4/large_file_upload_part_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/oss_fake_bucket4/large_file_upload_part_403_error.bin?partNumber=1&uploadId=my_id', 403) handler.add('DELETE', '/oss_fake_bucket4/large_file_upload_part_403_error.bin?uploadId=my_id', 204) handler.add('POST', '/oss_fake_bucket4/large_file_upload_part_no_etag.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/oss_fake_bucket4/large_file_upload_part_no_etag.bin?partNumber=1&uploadId=my_id', 200) handler.add('DELETE', '/oss_fake_bucket4/large_file_upload_part_no_etag.bin?uploadId=my_id', 204) with webserver.install_http_handler(handler): for filename in ['/vsioss/oss_fake_bucket4/large_file_upload_part_403_error.bin', '/vsioss/oss_fake_bucket4/large_file_upload_part_no_etag.bin']: with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0, filename gdal.ErrorReset() gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() == '', filename # Simulate failure in AbortMultipart stage handler = webserver.SequentialHandler() handler.add('POST', '/oss_fake_bucket4/large_file_abortmultipart_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/oss_fake_bucket4/large_file_abortmultipart_403_error.bin?partNumber=1&uploadId=my_id', 403) handler.add('DELETE', '/oss_fake_bucket4/large_file_abortmultipart_403_error.bin?uploadId=my_id', 403) filename = '/vsioss/oss_fake_bucket4/large_file_abortmultipart_403_error.bin' with webserver.install_http_handler(handler): with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename with gdaltest.error_handler(): ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == 0, filename gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '', filename # Simulate failure in CompleteMultipartUpload stage handler = webserver.SequentialHandler() handler.add('POST', '/oss_fake_bucket4/large_file_completemultipart_403_error.bin?uploads', 200, {}, 'my_id') handler.add('PUT', '/oss_fake_bucket4/large_file_completemultipart_403_error.bin?partNumber=1&uploadId=my_id', 200, {'ETag': 'first_etag'}, '') handler.add('PUT', '/oss_fake_bucket4/large_file_completemultipart_403_error.bin?partNumber=2&uploadId=my_id', 200, {'ETag': 'second_etag'}, '') handler.add('POST', '/oss_fake_bucket4/large_file_completemultipart_403_error.bin?uploadId=my_id', 403) # handler.add('DELETE', '/oss_fake_bucket4/large_file_completemultipart_403_error.bin?uploadId=my_id', 204) filename = '/vsioss/oss_fake_bucket4/large_file_completemultipart_403_error.bin' with webserver.install_http_handler(handler): with gdaltest.config_option('VSIOSS_CHUNK_SIZE', '1'): # 1 MB f = gdal.VSIFOpenL(filename, 'wb') assert f is not None, filename ret = gdal.VSIFWriteL(big_buffer, 1, size, f) assert ret == size, filename gdal.ErrorReset() with gdaltest.error_handler(): gdal.VSIFCloseL(f) assert gdal.GetLastErrorMsg() != '', filename ############################################################################### # Test Mkdir() / Rmdir() def test_visoss_7(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oss_bucket_test_mkdir/dir/', 404, {'Connection': 'close'}) handler.add('GET', '/oss_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F', 404, {'Connection': 'close'}) handler.add('PUT', '/oss_bucket_test_mkdir/dir/', 200) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsioss/oss_bucket_test_mkdir/dir', 0) assert ret == 0 # Try creating already existing directory handler = webserver.SequentialHandler() handler.add('GET', '/oss_bucket_test_mkdir/dir/', 416) with webserver.install_http_handler(handler): ret = gdal.Mkdir('/vsioss/oss_bucket_test_mkdir/dir', 0) assert ret != 0 handler = webserver.SequentialHandler() handler.add('DELETE', '/oss_bucket_test_mkdir/dir/', 204) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsioss/oss_bucket_test_mkdir/dir') assert ret == 0 # Try deleting already deleted directory handler = webserver.SequentialHandler() handler.add('GET', '/oss_bucket_test_mkdir/dir/', 404) handler.add('GET', '/oss_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir%2F', 404, {'Connection': 'close'}) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsioss/oss_bucket_test_mkdir/dir') assert ret != 0 # Try deleting non-empty directory handler = webserver.SequentialHandler() handler.add('GET', '/oss_bucket_test_mkdir/dir_nonempty/', 416) handler.add('GET', '/oss_bucket_test_mkdir/?delimiter=%2F&max-keys=100&prefix=dir_nonempty%2F', 200, {'Content-type': 'application/xml'}, """ dir_nonempty/ dir_nonempty/test.txt 1970-01-01T00:00:01.000Z 40 """) with webserver.install_http_handler(handler): ret = gdal.Rmdir('/vsioss/oss_bucket_test_mkdir/dir_nonempty') assert ret != 0 ############################################################################### # Test handling of file and directory with same name def test_visoss_8(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/visoss_8/?delimiter=%2F', 200, {'Content-type': 'application/xml'}, """ test 1970-01-01T00:00:01.000Z 40 test/ """) with webserver.install_http_handler(handler): listdir = gdal.ReadDir('/vsioss/visoss_8', 0) assert listdir == ['test', 'test/'] handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert not stat.S_ISDIR(gdal.VSIStatL('/vsioss/visoss_8/test').mode) handler = webserver.SequentialHandler() with webserver.install_http_handler(handler): assert stat.S_ISDIR(gdal.VSIStatL('/vsioss/visoss_8/test/').mode) ############################################################################### def test_visoss_stop_webserver(): if gdaltest.webserver_port == 0: pytest.skip() # Clearcache needed to close all connections, since the Python server # can only handle one connection at a time gdal.VSICurlClearCache() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### # Nominal cases (require valid credentials) def test_visoss_extra_1(): if not gdaltest.built_against_curl(): pytest.skip() # Either a bucket name or bucket/filename OSS_RESOURCE = gdal.GetConfigOption('OSS_RESOURCE') if gdal.GetConfigOption('OSS_SECRET_ACCESS_KEY') is None: pytest.skip('Missing OSS_SECRET_ACCESS_KEY') elif gdal.GetConfigOption('OSS_ACCESS_KEY_ID') is None: pytest.skip('Missing OSS_ACCESS_KEY_ID') elif OSS_RESOURCE is None: pytest.skip('Missing OSS_RESOURCE') if '/' not in OSS_RESOURCE: path = '/vsioss/' + OSS_RESOURCE statres = gdal.VSIStatL(path) assert statres is not None and stat.S_ISDIR(statres.mode), \ ('%s is not a valid bucket' % path) readdir = gdal.ReadDir(path) assert readdir is not None, 'ReadDir() should not return empty list' for filename in readdir: if filename != '.': subpath = path + '/' + filename assert gdal.VSIStatL(subpath) is not None, \ ('Stat(%s) should not return an error' % subpath) unique_id = 'visoss_test' subpath = path + '/' + unique_id ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id in readdir, \ ('ReadDir(%s) should contain %s' % (path, unique_id)) ret = gdal.Mkdir(subpath, 0) assert ret != 0, ('Mkdir(%s) repeated should return an error' % subpath) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) readdir = gdal.ReadDir(path) assert unique_id not in readdir, \ ('ReadDir(%s) should not contain %s' % (path, unique_id)) ret = gdal.Rmdir(subpath) assert ret != 0, ('Rmdir(%s) repeated should return an error' % subpath) ret = gdal.Mkdir(subpath, 0) assert ret >= 0, ('Mkdir(%s) should not return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'wb') assert f is not None gdal.VSIFWriteL('hello', 1, 5, f) gdal.VSIFCloseL(f) ret = gdal.Rmdir(subpath) assert ret != 0, \ ('Rmdir(%s) on non empty directory should return an error' % subpath) f = gdal.VSIFOpenL(subpath + '/test.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 5, f).decode('utf-8') assert data == 'hello' gdal.VSIFCloseL(f) ret = gdal.Unlink(subpath + '/test.txt') assert ret >= 0, \ ('Unlink(%s) should not return an error' % (subpath + '/test.txt')) ret = gdal.Rmdir(subpath) assert ret >= 0, ('Rmdir(%s) should not return an error' % subpath) return f = open_for_read('/vsioss/' + OSS_RESOURCE) assert f is not None, ('cannot open %s' % ('/vsioss/' + OSS_RESOURCE)) ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 # Same with /vsioss_streaming/ f = open_for_read('/vsioss_streaming/' + OSS_RESOURCE) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 if False: # pylint: disable=using-constant-test # we actually try to read at read() time and bSetError = false: # Invalid bucket : "The specified bucket does not exist" gdal.ErrorReset() f = open_for_read('/vsioss/not_existing_bucket/foo') with gdaltest.error_handler(): gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert gdal.VSIGetLastErrorMsg() != '' # Invalid resource gdal.ErrorReset() f = open_for_read('/vsioss_streaming/' + OSS_RESOURCE + '/invalid_resource.baz') assert f is None, gdal.VSIGetLastErrorMsg() # Test GetSignedURL() signed_url = gdal.GetSignedURL('/vsioss/' + OSS_RESOURCE) f = open_for_read('/vsicurl_streaming/' + signed_url) assert f is not None ret = gdal.VSIFReadL(1, 1, f) gdal.VSIFCloseL(f) assert len(ret) == 1 ############################################################################### def test_visoss_cleanup(): for var in gdaltest.oss_vars: gdal.SetConfigOption(var, gdaltest.oss_vars[var]) gdalautotest-3.0.4/requirements.txt0000644003401500001440000000042713614004467017124 0ustar rouaultusers# Python 2.7 constraints # more-itertools 6.0 no longer supporting Python 2.7 more-itertools < 6.0.0; python_version < '3.0' # pytest 5.0 no longer supporting Python 2.7 pytest>=3.6.0,<5.0.0; python_version < '3.0' pytest>=3.6.0; python_version >= '3.0' pytest-sugar pytest-env gdalautotest-3.0.4/utilities/0000755003401500001440000000000013614005324015641 5ustar rouaultusersgdalautotest-3.0.4/utilities/test_gdal_grid_lib.py0000755003401500001440000001534113614005323022022 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_grid_lib.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_grid testing # Author: Even Rouault # ############################################################################### # Copyright (c) 2008-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 struct from osgeo import gdal, ogr import ogrtest ############################################################################### # def test_gdal_grid_lib_1(): # Create an OGR grid from the values of n43.dt0 ds = gdal.Open('../gdrivers/data/n43.dt0') geotransform = ds.GetGeoTransform() shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_ds = shape_drv.CreateDataSource('/vsimem/tmp') shape_lyr = shape_ds.CreateLayer('n43') data = ds.ReadRaster(0, 0, 121, 121) array_val = struct.unpack('h' * 121 * 121, data) for j in range(121): for i in range(121): wkt = 'POINT(%f %f %s)' % (geotransform[0] + (i + .5) * geotransform[1], geotransform[3] + (j + .5) * geotransform[5], array_val[j * 121 + i]) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) shape_lyr.CreateFeature(dst_feat) shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON n43') shape_ds = None spatFilter = None if ogrtest.have_geos(): spatFilter = [-180, -90, 180, 90] # Create a GDAL dataset from the previous generated OGR grid ds2 = gdal.Grid('', '/vsimem/tmp/n43.shp', format='MEM', outputBounds=[-80.0041667, 42.9958333, -78.9958333, 44.0041667], width=121, height=121, outputType=gdal.GDT_Int16, algorithm='nearest:radius1=0.0:radius2=0.0:angle=0.0', spatFilter=spatFilter) # We should get the same values as in n43.td0 assert ds.GetRasterBand(1).Checksum() == ds2.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds2.GetRasterBand(1).Checksum())) assert ds2.GetRasterBand(1).GetNoDataValue() is None, 'did not expect nodata value' ds = None ds2 = None ############################################################################### # Test with a point number not multiple of 8 or 16 def test_gdal_grid_lib_2(): shape_ds = ogr.Open('/vsimem/tmp', update=1) shape_lyr = shape_ds.CreateLayer('test_gdal_grid_lib_2') dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0 100)')) shape_lyr.CreateFeature(dst_feat) shape_ds = None for env_list in [[('GDAL_USE_AVX', 'NO'), ('GDAL_USE_SSE', 'NO')], [('GDAL_USE_AVX', 'NO')], []]: for (key, value) in env_list: gdal.SetConfigOption(key, value) # Point strictly on grid ds1 = gdal.Grid('', '/vsimem/tmp/test_gdal_grid_lib_2.shp', format='MEM', outputBounds=[-0.5, -0.5, 0.5, 0.5], width=1, height=1, outputType=gdal.GDT_Byte) ds2 = gdal.Grid('', '/vsimem/tmp/test_gdal_grid_lib_2.shp', format='MEM', outputBounds=[-0.4, -0.4, 0.6, 0.6], width=10, height=10, outputType=gdal.GDT_Byte) gdal.SetConfigOption('GDAL_USE_AVX', None) gdal.SetConfigOption('GDAL_USE_SSE', None) cs = ds1.GetRasterBand(1).Checksum() assert cs == 2 cs = ds2.GetRasterBand(1).Checksum() assert cs == 1064 ############################################################################### # Test bugfix for #7101 (segmentation fault with linear interpolation) def test_gdal_grid_lib_3(): wkt = 'POLYGON ((37.3495241627097 55.6901648563184 187.680953979492,37.349543273449 55.6901565410051 187.714370727539,37.3495794832707 55.6901531392856 187.67333984375,37.3496210575104 55.6901595647556 187.6396484375,37.3496398329735 55.6901716597552 187.596603393555,37.3496726900339 55.6901780852222 187.681350708008,37.3496793955565 55.6901829988139 187.933898925781,37.3496921360493 55.6901860225623 187.934280395508,37.3497162759304 55.6902037870796 187.435394287109,37.3497484624386 55.6902094566047 187.515319824219,37.3497618734837 55.6902241973661 190.329940795898,37.3497511446476 55.690238560154 190.345748901367,37.3497404158115 55.6902567026153 190.439697265625,37.3497142642736 55.6902650179072 189.086044311523,37.349688783288 55.6902608602615 187.763305664062,37.3496626317501 55.6902468754498 187.53678894043,37.3496378213167 55.6902412059301 187.598648071289,37.3496103286743 55.6902400720261 187.806274414062,37.3495902121067 55.6902313787607 187.759521484375,37.3495734483004 55.6902177719067 187.578125,37.349532879889 55.6902035980954 187.56965637207,37.3495161160827 55.6901939599008 187.541793823242,37.3495187982917 55.6901754394418 187.610427856445,37.3495241627097 55.6901648563184 187.680953979492))' polygon = ogr.CreateGeometryFromWkt(wkt) gdal.Grid('', polygon.ExportToJson(), width=115, height=93, outputBounds=[37.3495161160827, 55.6901531392856, 37.3497618734837, 55.6902650179072], format='MEM', algorithm='linear') ############################################################################### # Cleanup def test_gdal_grid_lib_cleanup(): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/tmp') gdalautotest-3.0.4/utilities/test_gdal_rasterize_lib.py0000755003401500001440000003244113614005323023105 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_rasterize_lib.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_rasterize testing # Author: Even Rouault # ############################################################################### # Copyright (c) 2015, Even Rouault # 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. ############################################################################### from osgeo import gdal, ogr, osr import gdaltest import pytest ############################################################################### # Simple polygon rasterization (adapted from alg/rasterize.py). def test_gdal_rasterize_lib_1(): # Setup working spatial reference # sr_wkt = 'LOCAL_CS["arbitrary"]' # sr = osr.SpatialReference( sr_wkt ) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) sr_wkt = sr.ExportToWkt() # Create a raster to rasterize into. target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a layer to rasterize from. vector_ds = \ gdal.GetDriverByName('Memory').Create('', 0, 0, 0) rast_lyr = vector_ds.CreateLayer('rast1', srs=sr) rast_lyr.GetLayerDefn() field_defn = ogr.FieldDefn('foo') rast_lyr.CreateField(field_defn) # Add a polygon. wkt_geom = 'POLYGON((1020 1030,1020 1045,1050 1045,1050 1030,1020 1030))' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) # Add feature without geometry to test fix for #3310 feat = ogr.Feature(rast_lyr.GetLayerDefn()) rast_lyr.CreateFeature(feat) # Add a linestring. wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) ret = gdal.Rasterize(target_ds, vector_ds, bands=[3, 2, 1], burnValues=[200, 220, 240], layers='rast1') assert ret == 1 # Check results. expected = 6452 checksum = target_ds.GetRasterBand(2).Checksum() assert checksum == expected, 'Did not get expected image checksum' target_ds = None ############################################################################### # Test creating an output file def test_gdal_rasterize_lib_3(): import test_cli_utilities if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' ../gdrivers/data/n43.dt0 tmp/n43dt0.shp -i 10 -3d') with gdaltest.error_handler(): ds = gdal.Rasterize('/vsimem/bogus.tif', 'tmp/n43dt0.shp') assert ds is None, 'did not expected success' ds = gdal.Rasterize('', 'tmp/n43dt0.shp', format='MEM', outputType=gdal.GDT_Byte, useZ=True, layers=['n43dt0'], width=121, height=121, noData=0) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/n43dt0.shp') ds_ref = gdal.Open('../gdrivers/data/n43.dt0') assert ds.GetRasterBand(1).GetNoDataValue() == 0.0, \ 'did not get expected nodata value' assert ds.RasterXSize == 121 and ds.RasterYSize == 121, \ 'did not get expected dimensions' gt_ref = ds_ref.GetGeoTransform() gt = ds.GetGeoTransform() for i in range(6): assert abs(gt[i] - gt_ref[i]) <= 1e-6, 'did not get expected geotransform' wkt = ds.GetProjectionRef() assert wkt.find("WGS_1984") != -1, 'did not get expected SRS' ############################################################################### # Rasterization without georeferencing def test_gdal_rasterize_lib_100(): target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100) # Create a layer to rasterize from. vector_ds = \ gdal.GetDriverByName('Memory').Create('', 0, 0, 0) rast_lyr = vector_ds.CreateLayer('rast1') wkt_geom = 'POLYGON((20 20,20 80,80 80,80 20,20 20))' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) ret = gdal.Rasterize(target_ds, vector_ds, burnValues=[255]) assert ret == 1 # Check results. expected = 44190 checksum = target_ds.GetRasterBand(1).Checksum() assert checksum == expected, 'Did not get expected image checksum' target_ds = None ############################################################################### # Rasterization on empty geometry def test_gdal_rasterize_lib_101(): target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100) # Create a layer to rasterize from. vector_ds = \ gdal.GetDriverByName('Memory').Create('', 0, 0, 0) rast_lyr = vector_ds.CreateLayer('rast1') # polygon with empty exterior ring geom = ogr.CreateGeometryFromJson('{ "type": "Polygon", "coordinates": [ [ ] ] }') feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(geom) rast_lyr.CreateFeature(feat) ret = gdal.Rasterize(target_ds, vector_ds, burnValues=[255]) assert ret == 1 # Check results. checksum = target_ds.GetRasterBand(1).Checksum() assert checksum == 0, 'Did not get expected image checksum' target_ds = None ############################################################################### # Rasterization on raster with RPC def test_gdal_rasterize_lib_102(): target_ds = gdal.GetDriverByName('MEM').Create('', 353, 226) target_ds.GetRasterBand(1).Fill(255) md = { 'HEIGHT_OFF': '430', 'HEIGHT_SCALE': '501', 'LAT_OFF': '-0.0734', 'LAT_SCALE': '0.2883', 'LINE_DEN_COEFF': '1 0.0002790015 0.001434672 1.481312e-07 5.866139e-06 1.878347e-07 -7.1677e-08 -1.099383e-05 1.968371e-06 -5.50509e-06 0 -1.227539e-08 0 0 2.40682e-07 -1.144941e-08 0 -1.884406e-08 0 0', 'LINE_NUM_COEFF': '0.002744972 -0.382552 -1.279674 -0.0001147828 0.001140472 1.262068e-07 -1.69402e-07 -0.005830625 -0.001964747 0 -2.006924e-07 3.066144e-07 3.005069e-06 2.103552e-06 -1.981401e-06 -1.636042e-06 7.045145e-06 -5.699422e-08 1.169591e-07 0', 'LINE_OFF': '112.98500331785', 'LINE_SCALE': '113.01499668215', 'LONG_OFF': '-4.498', 'LONG_SCALE': '0.5511', 'SAMP_DEN_COEFF': '1 0.001297913 0.0005878427 -0.0004554233 -7.353773e-05 7.928584e-06 -1.826261e-06 9.516839e-05 5.332457e-07 -4.236274e-05 -1.89316e-08 -1.520878e-06 -8.941367e-07 -7.770314e-07 1.413225e-06 9.681702e-08 -4.724849e-08 -2.244317e-07 1.0665e-08 4.212225e-08', 'SAMP_NUM_COEFF': '0.01819195 1.091934 -0.1976373 0.003166136 0.002648549 0.0003527143 -6.27017e-05 -0.01889831 -0.0005888535 1.729232e-07 3.037208e-06 0.000174218 -3.129558e-05 -4.602708e-05 2.724941e-05 -9.314161e-07 8.328574e-06 -1.240182e-05 -4.652876e-07 -1.322223e-07', 'SAMP_OFF': '176.619681301916', 'SAMP_SCALE': '177.068486184099' } target_ds.SetMetadata(md, "RPC") vector_ds = \ gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) rast_lyr = vector_ds.CreateLayer('', srs=sr) # polygon with empty exterior ring geom = ogr.CreateGeometryFromWkt("""POLYGON ((-3.967081661665 0.0003251483162,-4.976841813513 0.0003251483162,-4.904140485134 0.2151010973779,-4.904124933286 0.2151433982916,-4.904107210626 0.2151848366149,-4.904087364764 0.2152253010321,-4.904065449011 0.2152646828438,-4.904041522241 0.2153028762585,-4.904015648726 0.2153397786774,-4.903987897971 0.2153752909697,-4.903958344523 0.2154093177387,-4.903927067771 0.2154417675784,-4.903894151734 0.2154725533188,-4.903859684834 0.2155015922603,-4.90382375966 0.2155288063955,-4.903786472717 0.2155541226193,-4.903747924169 0.2155774729247,-4.90370821757 0.2155987945858,-4.903667459582 0.2156180303263,-4.903625759694 0.2156351284732,-4.903583229924 0.2156500430959,-4.90353998452 0.2156627341291,-4.903496139651 0.2156731674811,-4.9034518131 0.2156813151247,-4.903407123938 0.2156871551729,-4.903362192216 0.2156906719376,-4.903317138633 0.2156918559717,-4.903272084216 0.2156907040946,-4.903227149995 0.2156872194006,-4.903182456677 0.2156814112505,-3.945022212098 0.0658193544758,-3.94497805444 0.0658112751384,-3.944934372574 0.0658009277184,-3.944891282916 0.0657883397923,-3.944848900303 0.0657735449078,-3.944807337687 0.0657565824944,-3.944766705836 0.0657374977579,-3.944727113036 0.0657163415606,-3.944688664805 0.0656931702851,-3.94465146361 0.0656680456844,-3.944615608594 0.0656410347174,-3.944581195314 0.0656122093701,-3.944548315483 0.065581646464,-3.944517056729 0.0655494274513,-3.944487502358 0.065515638198,-3.944459731134 0.0654803687547,-3.944433817071 0.0654437131168,-3.944409829229 0.0654057689742,-3.94438783154 0.0653666374506,-3.944367882627 0.0653264228341,-3.944350035657 0.0652852322995,-3.944334338192 0.0652431756223,-3.944320832068 0.0652003648864,-3.944309553279 0.0651569141855,-3.944300531884 0.0651129393185,-3.944293791926 0.0650685574815,-3.944289351367 0.0650238869551,-3.944287222041 0.0649790467894,-3.944287409623 0.0649341564864,-3.944289913614 0.0648893356818,-3.94429472734 0.0648447038262,-3.944301837972 0.0648003798665,-3.94431122656 0.064756481929,-3.944322868082 0.0647131270048,-3.944336731513 0.0646704306378,-3.967081661665 0.0003251483162))""") feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(geom) rast_lyr.CreateFeature(feat) ret = gdal.Rasterize(target_ds, vector_ds, burnValues=[0]) assert ret == 1 # Check results. checksum = target_ds.GetRasterBand(1).Checksum() assert checksum == 1604, 'Did not get expected image checksum' # Re-try with transformer options target_ds.GetRasterBand(1).Fill(255) ret = gdal.Rasterize(target_ds, vector_ds, burnValues=[0], transformerOptions=['RPC_HEIGHT=1000']) assert ret == 1 # Check results. checksum = target_ds.GetRasterBand(1).Checksum() assert checksum == 2003, 'Did not get expected image checksum' target_ds = None ############################################################################### # Simple rasterization with all values of the optim option def test_gdal_rasterize_lib_4(): # Setup working spatial reference # sr_wkt = 'LOCAL_CS["arbitrary"]' # sr = osr.SpatialReference( sr_wkt ) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) sr_wkt = sr.ExportToWkt() # Create a raster to rasterize into. for optim in ['RASTER', 'VECTOR', 'AUTO']: target_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Create a layer to rasterize from. vector_ds = \ gdal.GetDriverByName('Memory').Create('', 0, 0, 0) rast_lyr = vector_ds.CreateLayer('rast1', srs=sr) rast_lyr.GetLayerDefn() field_defn = ogr.FieldDefn('foo') rast_lyr.CreateField(field_defn) # Add a polygon. wkt_geom = 'POLYGON((1020 1030,1020 1045,1050 1045,1050 1030,1020 1030))' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) # Add feature without geometry to test fix for #3310 feat = ogr.Feature(rast_lyr.GetLayerDefn()) rast_lyr.CreateFeature(feat) # Add a linestring. wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) ret = gdal.Rasterize(target_ds, vector_ds, bands=[3, 2, 1], burnValues=[200, 220, 240], layers='rast1', optim=optim) assert ret == 1 # Check results. expected = 6452 checksum = target_ds.GetRasterBand(2).Checksum() if checksum != expected: print(checksum, optim) pytest.fail('Did not get expected image checksum') target_ds = None gdalautotest-3.0.4/utilities/test_ogrlineref.py0000755003401500001440000001174013614005323021413 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: ogrlineref testing # Author: Dmitry Baryshnikov. polimax@mail.ru # ############################################################################### # 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 sys import os import pytest sys.path.append('../ogr') from osgeo import ogr import gdaltest import ogrtest import test_cli_utilities ############################################################################### # create test def test_ogrlineref_1(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() if os.path.exists('tmp/parts.shp'): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/parts.shp') _, err = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrlineref_path() + ' -create -l data/path.shp -p data/mstones.shp -pm pos -o tmp/parts.shp -s 1000') assert err is None or err == '', ('got error/warning: "%s"' % err) ds = ogr.Open('tmp/parts.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 9 ############################################################################### # get_pos test def test_ogrlineref_2(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrlineref_path() + ' -get_pos -r tmp/parts.shp -x -1.4345 -y 51.9497 -quiet').strip() expected = '15977.724709' assert ret == expected, ('"%s" != %s' % (ret.strip(), expected)) ############################################################################### # get_coord test def test_ogrlineref_3(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrlineref_path() + ' -get_coord -r tmp/parts.shp -m 15977.724709 -quiet').strip() expected = '-1.435097,51.950080,0.000000' assert ret == expected, ('%s != %s' % (ret.strip(), expected)) ############################################################################### # get_subline test def test_ogrlineref_4(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() if os.path.exists('tmp/subline.shp'): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/subline.shp') gdaltest.runexternal(test_cli_utilities.get_ogrlineref_path() + ' -get_subline -r tmp/parts.shp -mb 13300 -me 17400 -o tmp/subline.shp') ds = ogr.Open('tmp/subline.shp') assert ds is not None, 'ds is None' feature_count = ds.GetLayer(0).GetFeatureCount() assert feature_count == 1, ('feature count %d != 1' % feature_count) ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/subline.shp') ############################################################################### # test kml def test_ogrlineref_5(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() if os.path.exists('tmp/parts.kml'): ogr.GetDriverByName('KML').DeleteDataSource('tmp/parts.kml') gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrlineref_path() + ' -create -f "KML" -l data/path.shp -p data/mstones.shp -pm pos -o tmp/parts.kml -s 222') if os.path.exists('tmp/parts.kml'): return pytest.fail() def test_ogrlineref_cleanup(): if not ogrtest.have_geos() or test_cli_utilities.get_ogrlineref_path() is None: pytest.skip() if os.path.exists('tmp/parts.shp'): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/parts.shp') if os.path.exists('tmp/parts.kml'): ogr.GetDriverByName('KML').DeleteDataSource('tmp/parts.kml') gdalautotest-3.0.4/utilities/tmp/0000755003401500001440000000000013614004467016450 5ustar rouaultusersgdalautotest-3.0.4/utilities/tmp/do-not-remove0000644003401500001440000000000013614004467021054 0ustar rouaultusersgdalautotest-3.0.4/utilities/test_gdal_translate.py0000755003401500001440000010306213614005323022242 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_translate.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_translate testing # Author: Even Rouault # ############################################################################### # 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 from osgeo import gdal import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_gdal_translate_1(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif tmp/test1.tif') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/test1.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -of option def test_gdal_translate_2(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of GTiff ../gcore/data/byte.tif tmp/test2.tif') ds = gdal.Open('tmp/test2.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -ot option def test_gdal_translate_3(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -ot Int16 ../gcore/data/byte.tif tmp/test3.tif') ds = gdal.Open('tmp/test3.tif') assert ds is not None assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, 'Bad data type' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -b option def test_gdal_translate_4(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -b 3 -b 2 -b 1 ../gcore/data/rgbsmall.tif tmp/test4.tif') ds = gdal.Open('tmp/test4.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 21349, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 21053, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 21212, 'Bad checksum' ds = None ############################################################################### # Test -expand option def test_gdal_translate_5(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -expand rgb ../gdrivers/data/bug407.gif tmp/test5.tif') ds = gdal.Open('tmp/test5.tif') assert ds is not None assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Bad color interpretation' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Bad color interpretation' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Bad color interpretation' assert ds.GetRasterBand(1).Checksum() == 20615, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 59147, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 63052, 'Bad checksum' ds = None ############################################################################### # Test -outsize option in absolute mode def test_gdal_translate_6(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -outsize 40 40 ../gcore/data/byte.tif tmp/test6.tif') ds = gdal.Open('tmp/test6.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test -outsize option in percentage mode def test_gdal_translate_7(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -outsize 200% 200% ../gcore/data/byte.tif tmp/test7.tif') ds = gdal.Open('tmp/test7.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test -a_srs and -gcp options def test_gdal_translate_8(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_srs EPSG:26711 -gcp 0 0 440720.000 3751320.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 0 -gcp 0 20 440720.000 3750120.000 ../gcore/data/byte.tif tmp/test8.tif') ds = gdal.Open('tmp/test8.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' gcps = ds.GetGCPs() assert len(gcps) == 4, 'GCP count wrong.' assert ds.GetGCPProjection().find('26711') != -1, 'Bad GCP projection.' ds = None ############################################################################### # Test -a_nodata option def test_gdal_translate_9(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_nodata 1 ../gcore/data/byte.tif tmp/test9.tif') ds = gdal.Open('tmp/test9.tif') assert ds is not None assert ds.GetRasterBand(1).GetNoDataValue() == 1, 'Bad nodata value' ds = None ############################################################################### # Test -srcwin option def test_gdal_translate_10(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -srcwin 0 0 1 1 ../gcore/data/byte.tif tmp/test10.tif') ds = gdal.Open('tmp/test10.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 2, 'Bad checksum' ds = None ############################################################################### # Test -projwin option def test_gdal_translate_11(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -projwin 440720.000 3751320.000 441920.000 3750120.000 ../gcore/data/byte.tif tmp/test11.tif') ds = gdal.Open('tmp/test11.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -a_ullr option def test_gdal_translate_12(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_ullr 440720.000 3751320.000 441920.000 3750120.000 ../gcore/data/byte.tif tmp/test12.tif') ds = gdal.Open('tmp/test12.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -mo option def test_gdal_translate_13(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -mo TIFFTAG_DOCUMENTNAME=test13 ../gcore/data/byte.tif tmp/test13.tif') ds = gdal.Open('tmp/test13.tif') assert ds is not None md = ds.GetMetadata() assert 'TIFFTAG_DOCUMENTNAME' in md, 'Did not get TIFFTAG_DOCUMENTNAME' ds = None ############################################################################### # Test -co option def test_gdal_translate_14(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -co COMPRESS=LZW ../gcore/data/byte.tif tmp/test14.tif') ds = gdal.Open('tmp/test14.tif') assert ds is not None md = ds.GetMetadata('IMAGE_STRUCTURE') assert 'COMPRESSION' in md and md['COMPRESSION'] == 'LZW', 'Did not get COMPRESSION' ds = None ############################################################################### # Test -sds option def test_gdal_translate_15(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -sds ../gdrivers/data/A.TOC tmp/test15.tif') ds = gdal.Open('tmp/test15_1.tif') assert ds is not None ds = None ############################################################################### # Test -of VRT which is a special case def test_gdal_translate_16(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of VRT ../gcore/data/byte.tif tmp/test16.vrt') ds = gdal.Open('tmp/test16.vrt') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -expand option to VRT def test_gdal_translate_17(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of VRT -expand rgba ../gdrivers/data/bug407.gif tmp/test17.vrt') ds = gdal.Open('tmp/test17.vrt') assert ds is not None assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Bad color interpretation' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Bad color interpretation' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Bad color interpretation' assert ds.GetRasterBand(4).GetRasterColorInterpretation() == gdal.GCI_AlphaBand, \ 'Bad color interpretation' assert ds.GetRasterBand(1).Checksum() == 20615, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 59147, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 63052, 'Bad checksum' assert ds.GetRasterBand(4).Checksum() == 63052, 'Bad checksum' ds = None ############################################################################### # Test translation of a VRT made of VRT def test_gdal_translate_18(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/8bit_pal.bmp -of VRT tmp/test18_1.vrt') gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' tmp/test18_1.vrt -expand rgb -of VRT tmp/test18_2.vrt') (_, ret_stderr) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' tmp/test18_2.vrt tmp/test18_2.tif') # Check that all datasets are closed assert ret_stderr.find('Open GDAL Datasets') == -1 ds = gdal.Open('tmp/test18_2.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -expand rgba on a color indexed dataset with an alpha band def test_gdal_translate_19(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdal_translate_19_src.tif', 1, 1, 2) ct = gdal.ColorTable() ct.SetColorEntry(127, (1, 2, 3, 255)) ds.GetRasterBand(1).SetRasterColorTable(ct) ds.GetRasterBand(1).Fill(127) ds.GetRasterBand(2).Fill(250) ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -expand rgba tmp/test_gdal_translate_19_src.tif tmp/test_gdal_translate_19_dst.tif') ds = gdal.Open('tmp/test_gdal_translate_19_dst.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 1, 'Bad checksum for band 1' assert ds.GetRasterBand(2).Checksum() == 2, 'Bad checksum for band 2' assert ds.GetRasterBand(3).Checksum() == 3, 'Bad checksum for band 3' assert ds.GetRasterBand(4).Checksum() == 250 % 7, 'Bad checksum for band 4' ds = None ############################################################################### # Test -a_nodata None def test_gdal_translate_20(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_nodata 255 ../gcore/data/byte.tif tmp/test_gdal_translate_20_src.tif') gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_nodata None tmp/test_gdal_translate_20_src.tif tmp/test_gdal_translate_20_dst.tif') ds = gdal.Open('tmp/test_gdal_translate_20_dst.tif') assert ds is not None nodata = ds.GetRasterBand(1).GetNoDataValue() assert nodata is None ds = None ############################################################################### # Test that statistics are copied only when appropriate (#3889) # in that case, they must be copied def test_gdal_translate_21(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of HFA ../gcore/data/utmsmall.img tmp/test_gdal_translate_21.img') ds = gdal.Open('tmp/test_gdal_translate_21.img') md = ds.GetRasterBand(1).GetMetadata() ds = None assert md['STATISTICS_MINIMUM'] == '8', 'STATISTICS_MINIMUM 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.' ############################################################################### # Test that statistics are copied only when appropriate (#3889) # in that case, they must *NOT* be copied def test_gdal_translate_22(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of HFA -scale 0 255 0 128 ../gcore/data/utmsmall.img tmp/test_gdal_translate_22.img') ds = gdal.Open('tmp/test_gdal_translate_22.img') md = ds.GetRasterBand(1).GetMetadata() ds = None assert 'STATISTICS_MINIMUM' not in md, \ 'did not expected a STATISTICS_MINIMUM value.' assert 'STATISTICS_HISTOBINVALUES' not in md, \ 'did not expected a STATISTICS_HISTOBINVALUES value.' ############################################################################### # Test -stats option (#3889) def test_gdal_translate_23(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -stats ../gcore/data/byte.tif tmp/test_gdal_translate_23.tif') ds = gdal.Open('tmp/test_gdal_translate_23.tif') md = ds.GetRasterBand(1).GetMetadata() ds = None assert md['STATISTICS_MINIMUM'] == '74', 'STATISTICS_MINIMUM is wrong.' assert not os.path.exists('tmp/test_gdal_translate_23.tif.aux.xml') gdal.Unlink('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test -srcwin option when partially outside def test_gdal_translate_24(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -q -srcwin -10 -10 40 40 ../gcore/data/byte.tif tmp/test_gdal_translate_24.tif') ds = gdal.Open('tmp/test_gdal_translate_24.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 4620, 'Bad checksum' ds = None ############################################################################### # Test -norat def test_gdal_translate_25(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -q ../gdrivers/data/int.img tmp/test_gdal_translate_25.tif -norat') ds = gdal.Open('tmp/test_gdal_translate_25.tif') assert ds.GetRasterBand(1).GetDefaultRAT() is None, 'RAT unexpected' ds = None ############################################################################### # Test -a_nodata and -stats (#5463) def test_gdal_translate_26(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() f = open('tmp/test_gdal_translate_26.xyz', 'wb') f.write("""X Y Z 0 0 -999 1 0 10 0 1 15 1 1 20""".encode('ascii')) f.close() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_nodata -999 -stats tmp/test_gdal_translate_26.xyz tmp/test_gdal_translate_26.tif') ds = gdal.Open('tmp/test_gdal_translate_26.tif') assert ds.GetRasterBand(1).GetMinimum() == 10 assert ds.GetRasterBand(1).GetNoDataValue() == -999 ds = None ############################################################################### # Test that we don't preserve statistics when we ought not. def test_gdal_translate_27(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() f = open('tmp/test_gdal_translate_27.asc', 'wb') f.write("""ncols 2 nrows 2 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 0 256 0 0""".encode('ascii')) f.close() gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -stats tmp/test_gdal_translate_27.asc') # Translate to an output type that accepts 256 as maximum gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' tmp/test_gdal_translate_27.asc tmp/test_gdal_translate_27.tif -ot UInt16') ds = gdal.Open('tmp/test_gdal_translate_27.tif') assert ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') is not None ds = None # Translate to an output type that accepts 256 as maximum gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' tmp/test_gdal_translate_27.asc tmp/test_gdal_translate_27.tif -ot Float64') ds = gdal.Open('tmp/test_gdal_translate_27.tif') assert ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') is not None ds = None # Translate to an output type that doesn't accept 256 as maximum gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' tmp/test_gdal_translate_27.asc tmp/test_gdal_translate_27.tif -ot Byte') ds = gdal.Open('tmp/test_gdal_translate_27.tif') assert ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIMUM') is None ds = None ############################################################################### # Test -oo def test_gdal_translate_28(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gdrivers/data/float64.asc tmp/test_gdal_translate_28.tif -oo datatype=float64') ds = gdal.Open('tmp/test_gdal_translate_28.tif') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64 ds = None ############################################################################### # Test -r def test_gdal_translate_29(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif tmp/test_gdal_translate_29.tif -outsize 50% 50% -r cubic') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/test_gdal_translate_29.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 1059, 'Bad checksum' ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif tmp/test_gdal_translate_29.vrt -outsize 50% 50% -r cubic -of VRT') assert (err is None or err == ''), 'got error/warning' (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' tmp/test_gdal_translate_29.vrt tmp/test_gdal_translate_29.tif') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/test_gdal_translate_29.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 1059, 'Bad checksum' ds = None ############################################################################### # Test -tr option def test_gdal_translate_30(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -tr 30 30 ../gcore/data/byte.tif tmp/test_gdal_translate_30.tif') ds = gdal.Open('tmp/test_gdal_translate_30.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 18784, 'Bad checksum' ds = None ############################################################################### # Test -projwin_srs option def test_gdal_translate_31(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -projwin_srs EPSG:4267 -projwin -117.641168620797 33.9023526904262 -117.628110837847 33.8915970129613 ../gcore/data/byte.tif tmp/test_gdal_translate_31.tif') ds = gdal.Open('tmp/test_gdal_translate_31.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-6), \ 'Bad geotransform' ds = None ############################################################################### # Test subsetting a file with a RPC def test_gdal_translate_32(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte_rpc.tif tmp/test_gdal_translate_32.tif -srcwin 1 2 13 14 -outsize 150% 300%') ds = gdal.Open('tmp/test_gdal_translate_32.tif') md = ds.GetMetadata('RPC') assert (abs(float(md['LINE_OFF']) - 47496) <= 1e-5 and \ abs(float(md['LINE_SCALE']) - 47502) <= 1e-5 and \ abs(float(md['SAMP_OFF']) - 19676.6923076923) <= 1e-5 and \ abs(float(md['SAMP_SCALE']) - 19678.1538461538) <= 1e-5) gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte_rpc.tif tmp/test_gdal_translate_32.tif -srcwin -10 -5 20 20') ds = gdal.Open('tmp/test_gdal_translate_32.tif') md = ds.GetMetadata('RPC') assert (abs(float(md['LINE_OFF']) - (15834 - -5)) <= 1e-5 and \ abs(float(md['LINE_SCALE']) - 15834) <= 1e-5 and \ abs(float(md['SAMP_OFF']) - (13464 - -10)) <= 1e-5 and \ abs(float(md['SAMP_SCALE']) - 13464) <= 1e-5) ############################################################################### # Test -outsize option in auto mode def test_gdal_translate_33(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -outsize 100 0 ../gdrivers/data/small_world.tif tmp/test_gdal_translate_33.tif') ds = gdal.Open('tmp/test_gdal_translate_33.tif') assert ds.RasterYSize == 50 ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -outsize 0 100 ../gdrivers/data/small_world.tif tmp/test_gdal_translate_33.tif') ds = gdal.Open('tmp/test_gdal_translate_33.tif') assert ds.RasterXSize == 200, ds.RasterYSize ds = None os.unlink('tmp/test_gdal_translate_33.tif') (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' -outsize 0 0 ../gdrivers/data/small_world.tif tmp/test_gdal_translate_33.tif') assert '-outsize 0 0 invalid' in err ############################################################################### # Test NBITS is preserved def test_gdal_translate_34(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/oddsize1bit.tif tmp/test_gdal_translate_34.vrt -of VRT -mo FOO=BAR') ds = gdal.Open('tmp/test_gdal_translate_34.vrt') assert ds.GetRasterBand(1).GetMetadataItem('NBITS', 'IMAGE_STRUCTURE') == '1' ds = None os.unlink('tmp/test_gdal_translate_34.vrt') ############################################################################### # Test various errors (missing source or dest...) def test_gdal_translate_35(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path()) assert 'No source dataset specified' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif') assert 'No target dataset specified' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' /non_existing_path/non_existing.tif /vsimem/out.tif') assert 'does not exist in the file system' in err or 'No such file or directory' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif /non_existing_path/non_existing.tif') assert 'Attempt to create new tiff file' in err ############################################################################### # Test RAT is copied from hfa to gtiff - continuous/athematic def test_gdal_translate_36(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of gtiff data/onepixelcontinuous.img tmp/test_gdal_translate_36.tif') ds = gdal.Open('tmp/test_gdal_translate_36.tif') assert ds is not None rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat, 'Did not get RAT' assert rat.GetRowCount() == 256, 'RAT has incorrect row count' assert rat.GetTableType() == 1, 'RAT not athematic' rat = None ds = None ############################################################################### # Test RAT is copied from hfa to gtiff - thematic def test_gdal_translate_37(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -q -of gtiff data/onepixelthematic.img tmp/test_gdal_translate_37.tif') ds = gdal.Open('tmp/test_gdal_translate_37.tif') assert ds is not None rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat, 'Did not get RAT' assert rat.GetRowCount() == 256, 'RAT has incorrect row count' assert rat.GetTableType() == 0, 'RAT not thematic' rat = None ds = None # Test RAT is copied round trip back to hfa def test_gdal_translate_38(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -q -of hfa tmp/test_gdal_translate_37.tif tmp/test_gdal_translate_38.img') ds = gdal.Open('tmp/test_gdal_translate_38.img') assert ds is not None rat = ds.GetRasterBand(1).GetDefaultRAT() assert rat, 'Did not get RAT' assert rat.GetRowCount() == 256, 'RAT has incorrect row count' assert rat.GetTableType() == 0, 'RAT not thematic' rat = None ds = None ############################################################################### # Test -nogcp options def test_gdal_translate_39(): if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -nogcp ../gcore/data/byte_gcp.tif tmp/test39.tif') ds = gdal.Open('tmp/test39.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' gcps = ds.GetGCPs() assert len(gcps) == 0, 'GCP count wrong.' ds = None ############################################################################### # Cleanup def test_gdal_translate_cleanup(): for i in range(14): try: os.remove('tmp/test' + str(i + 1) + '.tif') except OSError: pass try: os.remove('tmp/test' + str(i + 1) + '.tif.aux.xml') except OSError: pass try: os.remove('tmp/test15_1.tif') except OSError: pass try: os.remove('tmp/test16.vrt') except OSError: pass try: os.remove('tmp/test17.vrt') except OSError: pass try: os.remove('tmp/test18_1.vrt') except OSError: pass try: os.remove('tmp/test18_2.vrt') except OSError: pass try: os.remove('tmp/test18_2.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_19_src.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_19_dst.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_20_src.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_20_dst.tif') except OSError: pass try: gdal.GetDriverByName('HFA').Delete('tmp/test_gdal_translate_21.img') except (AttributeError, RuntimeError): pass try: gdal.GetDriverByName('HFA').Delete('tmp/test_gdal_translate_22.img') except (AttributeError, RuntimeError): pass try: gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_translate_23.tif') except (AttributeError, RuntimeError): pass try: os.remove('tmp/test_gdal_translate_24.tif') except OSError: pass try: gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_translate_25.tif') except (AttributeError, RuntimeError): pass try: gdal.GetDriverByName('XYZ').Delete('tmp/test_gdal_translate_26.xyz') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_translate_26.tif') except (AttributeError, RuntimeError): pass try: gdal.GetDriverByName('AAIGRID').Delete('tmp/test_gdal_translate_27.asc') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_translate_27.tif') except (AttributeError, RuntimeError): pass try: gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_translate_28.tif') except (AttributeError, RuntimeError): pass try: os.remove('tmp/test_gdal_translate_29.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_29.vrt') except OSError: pass try: os.remove('tmp/test_gdal_translate_30.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_31.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_32.tif') except OSError: pass try: os.remove('tmp/test_gdal_translate_36.tif') except: pass try: os.remove('tmp/test_gdal_translate_36.tif.aux.xml') except: pass try: os.remove('tmp/test_gdal_translate_37.tif') except: pass try: os.remove('tmp/test_gdal_translate_37.tif.aux.xml') except: pass try: gdal.GetDriverByName('HFA').Delete('tmp/test_gdal_translate_38.img') except: pass gdalautotest-3.0.4/utilities/test_ogrinfo.py0000755003401500001440000004532713614005323020732 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_ogrinfo.py 89c0d84eefe6b89d8f5d3b35781ccbddd1dccbad 2019-12-18 12:11:59 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: ogrinfo testing # 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 import gdaltest import ogrtest import test_cli_utilities import pytest ############################################################################### # Simple test def test_ogrinfo_1(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp') assert (err is None or err == ''), 'got error/warning' assert ret.find('ESRI Shapefile') != -1 ############################################################################### # Test -ro option def test_ogrinfo_2(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro ../ogr/data/poly.shp') assert ret.find('ESRI Shapefile') != -1 ############################################################################### # Test -al option def test_ogrinfo_3(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -al ../ogr/data/poly.shp') assert ret.find('Layer name: poly') != -1 assert ret.find('Geometry: Polygon') != -1 assert ret.find('Feature Count: 10') != -1 assert ret.find('Extent: (478315') != -1 assert ret.find('PROJCRS["OSGB') != -1 assert ret.find('AREA: Real (') != -1 ############################################################################### # Test layer name def test_ogrinfo_4(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly') assert ret.find('Feature Count: 10') != -1 ############################################################################### # Test -sql option def test_ogrinfo_5(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp -sql "select * from poly"') assert ret.find('Feature Count: 10') != -1 ############################################################################### # Test -geom=NO option def test_ogrinfo_6(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -geom=no') assert ret.find('Feature Count: 10') != -1 assert ret.find('POLYGON') == -1 ############################################################################### # Test -geom=SUMMARY option def test_ogrinfo_7(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -geom=summary') assert ret.find('Feature Count: 10') != -1 assert ret.find('POLYGON (') == -1 assert ret.find('POLYGON :') != -1 ############################################################################### # Test -spat option def test_ogrinfo_8(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -spat 479609 4764629 479764 4764817') if ogrtest.have_geos(): assert ret.find('Feature Count: 4') != -1 return else: assert ret.find('Feature Count: 5') != -1 return ############################################################################### # Test -where option def test_ogrinfo_9(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -where "EAS_ID=171"') assert ret.find('Feature Count: 1') != -1 ############################################################################### # Test -fid option def test_ogrinfo_10(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -fid 9') assert ret.find('OGRFeature(poly):9') != -1 ############################################################################### # Test -fields=no option def test_ogrinfo_11(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ../ogr/data/poly.shp poly -fields=no') assert ret.find('AREA (Real') == -1 assert ret.find('POLYGON (') != -1 ############################################################################### # Test ogrinfo --version def test_ogrinfo_12(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --version', check_memleak=False) assert ret.startswith(gdal.VersionInfo('--version')) ############################################################################### # Test erroneous use of --config def test_ogrinfo_13(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --config', check_memleak=False) assert '--config option given without a key and value argument' in err ############################################################################### # Test erroneous use of --mempreload. def test_ogrinfo_14(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --mempreload', check_memleak=False) assert '--mempreload option given without directory path' in err ############################################################################### # Test --mempreload def test_ogrinfo_15(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (ret, _) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --debug on --mempreload ../ogr/data /vsimem/poly.shp', check_memleak=False) assert "ESRI Shapefile" in ret ############################################################################### # Test erroneous use of --debug. def test_ogrinfo_16(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --debug', check_memleak=False) assert '--debug option given without debug level' in err ############################################################################### # Test erroneous use of --optfile. def test_ogrinfo_17(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --optfile', check_memleak=False) assert '--optfile option given without filename' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --optfile /foo/bar', check_memleak=False) assert 'Unable to open optfile' in err f = open('tmp/optfile.txt', 'wt') f.write('--config foo\n') f.close() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' --optfile tmp/optfile.txt', check_memleak=False) os.unlink('tmp/optfile.txt') assert '--config option given without a key and value argument' in err ############################################################################### # Test --optfile def test_ogrinfo_18(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() f = open('tmp/optfile.txt', 'wt') f.write('# comment\n') f.write('../ogr/data/poly.shp\n') f.close() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --optfile tmp/optfile.txt', check_memleak=False) os.unlink('tmp/optfile.txt') assert "ESRI Shapefile" in ret ############################################################################### # Test --formats def test_ogrinfo_19(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --formats', check_memleak=False) assert 'ESRI Shapefile -vector- (rw+v): ESRI Shapefile' in ret ############################################################################### # Test --help-general def test_ogrinfo_20(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --help-general', check_memleak=False) assert 'Generic GDAL utility command options' in ret ############################################################################### # Test --locale def test_ogrinfo_21(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' --locale C ../ogr/data/poly.shp', check_memleak=False) assert "ESRI Shapefile" in ret ############################################################################### # Test RFC 41 support def test_ogrinfo_22(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() f = open('tmp/test_ogrinfo_22.csv', 'wt') f.write('_WKTgeom1_EPSG_4326,_WKTgeom2_EPSG_32631\n') f.write('"POINT(1 2)","POINT(3 4)"\n') f.close() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' tmp/test_ogrinfo_22.csv', check_memleak=False) assert '1: test_ogrinfo_22 (Unknown (any), Unknown (any))' in ret ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -al -wkt_format wkt1 tmp/test_ogrinfo_22.csv', check_memleak=False) expected_ret = """INFO: Open of `tmp/test_ogrinfo_22.csv' using driver `CSV' successful. Layer name: test_ogrinfo_22 Geometry (geom__WKTgeom1_EPSG_4326): Unknown (any) Geometry (geom__WKTgeom2_EPSG_32631): Unknown (any) Feature Count: 1 Extent (geom__WKTgeom1_EPSG_4326): (1.000000, 2.000000) - (1.000000, 2.000000) Extent (geom__WKTgeom2_EPSG_32631): (3.000000, 4.000000) - (3.000000, 4.000000) SRS WKT (geom__WKTgeom1_EPSG_4326): 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"]] Data axis to CRS axis mapping: 2,1 SRS WKT (geom__WKTgeom2_EPSG_32631): 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"]] Data axis to CRS axis mapping: 1,2 Geometry Column 1 = geom__WKTgeom1_EPSG_4326 Geometry Column 2 = geom__WKTgeom2_EPSG_32631 _WKTgeom1_EPSG_4326: String (0.0) _WKTgeom2_EPSG_32631: String (0.0) OGRFeature(test_ogrinfo_22):1 _WKTgeom1_EPSG_4326 (String) = POINT(1 2) _WKTgeom2_EPSG_32631 (String) = POINT(3 4) geom__WKTgeom1_EPSG_4326 = POINT (1 2) geom__WKTgeom2_EPSG_32631 = POINT (3 4) """ expected_lines = expected_ret.splitlines() lines = ret.splitlines() for i, exp_line in enumerate(expected_lines): assert exp_line == lines[i], ret os.unlink('tmp/test_ogrinfo_22.csv') ############################################################################### # Test -geomfield (RFC 41) support def test_ogrinfo_23(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() f = open('tmp/test_ogrinfo_23.csv', 'wt') f.write('_WKTgeom1_EPSG_4326,_WKTgeom2_EPSG_32631\n') f.write('"POINT(1 2)","POINT(3 4)"\n') f.write('"POINT(3 4)","POINT(1 2)"\n') f.close() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -al tmp/test_ogrinfo_23.csv -wkt_format wkt1 -spat 1 2 1 2 -geomfield geom__WKTgeom2_EPSG_32631', check_memleak=False) expected_ret = """INFO: Open of `tmp/test_ogrinfo_23.csv' using driver `CSV' successful. Layer name: test_ogrinfo_23 Geometry (geom__WKTgeom1_EPSG_4326): Unknown (any) Geometry (geom__WKTgeom2_EPSG_32631): Unknown (any) Feature Count: 1 Extent (geom__WKTgeom1_EPSG_4326): (3.000000, 4.000000) - (3.000000, 4.000000) Extent (geom__WKTgeom2_EPSG_32631): (1.000000, 2.000000) - (1.000000, 2.000000) SRS WKT (geom__WKTgeom1_EPSG_4326): 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"]] Data axis to CRS axis mapping: 2,1 SRS WKT (geom__WKTgeom2_EPSG_32631): 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"]] Data axis to CRS axis mapping: 1,2 Geometry Column 1 = geom__WKTgeom1_EPSG_4326 Geometry Column 2 = geom__WKTgeom2_EPSG_32631 _WKTgeom1_EPSG_4326: String (0.0) _WKTgeom2_EPSG_32631: String (0.0) OGRFeature(test_ogrinfo_23):2 _WKTgeom1_EPSG_4326 (String) = POINT(3 4) _WKTgeom2_EPSG_32631 (String) = POINT(1 2) geom__WKTgeom1_EPSG_4326 = POINT (3 4) geom__WKTgeom2_EPSG_32631 = POINT (1 2) """ expected_lines = expected_ret.splitlines() lines = ret.splitlines() for i, exp_line in enumerate(expected_lines): assert exp_line == lines[i], ret os.unlink('tmp/test_ogrinfo_23.csv') ############################################################################### # Test metadata def test_ogrinfo_24(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() f = open('tmp/test_ogrinfo_24.vrt', 'wt') f.write(""" bar foo baz ../../ogr/data/poly.shp poly """) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al tmp/test_ogrinfo_24.vrt -so', check_memleak=False) assert 'foo=bar' in ret assert 'bar=baz' in ret ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al tmp/test_ogrinfo_24.vrt -so -mdd all', check_memleak=False) assert 'foo=bar' in ret assert 'baz=foo' in ret assert 'bar=baz' in ret ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al tmp/test_ogrinfo_24.vrt -so -nomd', check_memleak=False) assert 'Metadata' not in ret os.unlink('tmp/test_ogrinfo_24.vrt') ############################################################################### # Test -rl def test_ogrinfo_25(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' -rl -q ../ogr/data/poly.shp') assert (err is None or err == ''), 'got error/warning' assert 'OGRFeature(poly):0' in ret and 'OGRFeature(poly):9' in ret, \ 'wrong output' ############################################################################### # Test SQLStatement with -sql @filename syntax def test_ogrinfo_sql_filename(): if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() open('tmp/my.sql', 'wt').write('-- initial comment\nselect * from poly\n-- trailing comment') (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrinfo_path() + ' -q ../ogr/data/poly.shp -sql @tmp/my.sql') os.unlink('tmp/my.sql') assert (err is None or err == ''), 'got error/warning' assert 'OGRFeature(poly):0' in ret and 'OGRFeature(poly):9' in ret, \ 'wrong output' gdalautotest-3.0.4/utilities/test_gdal_contour.py0000755003401500001440000003323513614005323021742 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_contour.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_contour testing # 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 import array from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import ogrtest import test_cli_utilities import pytest ############################################################################### # Test with -a and -i options def test_gdal_contour_1(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass drv = gdal.GetDriverByName('GTiff') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) wkt = sr.ExportToWkt() size = 160 precision = 1. / size ds = drv.Create('tmp/gdal_contour.tif', size, size, 1) ds.SetProjection(wkt) ds.SetGeoTransform([1, precision, 0, 50, 0, -precision]) raw_data = array.array('h', [10 for i in range(int(size / 2))]).tostring() for i in range(int(size / 2)): ds.WriteRaster(int(size / 4), i + int(size / 4), int(size / 2), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [20 for i in range(int(size / 2))]).tostring() for i in range(int(size / 4)): ds.WriteRaster(int(size / 4) + int(size / 8), i + int(size / 4) + int(size / 8), int(size / 4), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [25 for i in range(int(size / 4))]).tostring() for i in range(int(size / 8)): ds.WriteRaster(int(size / 4) + int(size / 8) + int(size / 16), i + int(size / 4) + int(size / 8) + int(size / 16), int(size / 8), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_contour_path() + ' -a elev -i 10 tmp/gdal_contour.tif tmp/contour.shp') assert (err is None or err == ''), 'got error/warning' ds = ogr.Open('tmp/contour.shp') expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125]] expected_height = [10, 20] lyr = ds.ExecuteSQL("select * from contour order by elev asc") assert lyr.GetSpatialRef().ExportToWkt() == wkt, 'Did not get expected spatial ref' assert lyr.GetFeatureCount() == len(expected_envelopes) i = 0 feat = lyr.GetNextFeature() while feat is not None: envelope = feat.GetGeometryRef().GetEnvelope() assert feat.GetField('elev') == expected_height[i] for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) pytest.fail('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) i = i + 1 feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) ds.Destroy() ############################################################################### # Test with -fl option and -3d option def test_gdal_contour_2(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass # put -3d just after -fl to test #2793 gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' -a elev -fl 10 20 25 -3d tmp/gdal_contour.tif tmp/contour.shp') size = 160 precision = 1. / size ds = ogr.Open('tmp/contour.shp') expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125], [1.25 + 0.125 + 0.0625, 1.75 - 0.125 - 0.0625, 49.25 + 0.125 + 0.0625, 49.75 - 0.125 - 0.0625]] expected_height = [10, 20, 25] lyr = ds.ExecuteSQL("select * from contour order by elev asc") assert lyr.GetFeatureCount() == len(expected_envelopes) i = 0 feat = lyr.GetNextFeature() while feat is not None: assert feat.GetGeometryRef().GetZ(0) == expected_height[i] envelope = feat.GetGeometryRef().GetEnvelope() assert feat.GetField('elev') == expected_height[i] for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) pytest.fail('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) i = i + 1 feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) ds.Destroy() ############################################################################### # Test on a real DEM def test_gdal_contour_3(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() try: os.remove('tmp/contour.shp') except OSError: pass try: os.remove('tmp/contour.dbf') except OSError: pass try: os.remove('tmp/contour.shx') except OSError: pass # put -3d just after -fl to test #2793 gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' -a elev -i 50 ../gdrivers/data/n43.dt0 tmp/contour.shp') ds = ogr.Open('tmp/contour.shp') lyr = ds.ExecuteSQL("select distinct elev from contour order by elev asc") expected_heights = [100, 150, 200, 250, 300, 350, 400, 450] assert lyr.GetFeatureCount() == len(expected_heights) i = 0 feat = lyr.GetNextFeature() while feat is not None: assert feat.GetField('elev') == expected_heights[i] i = i + 1 feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) ds.Destroy() ############################################################################### # Test contour orientation def test_gdal_contour_4(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() try: os.remove('tmp/contour_orientation.shp') except OSError: pass try: os.remove('tmp/contour_orientation.dbf') except OSError: pass try: os.remove('tmp/contour_orientation.shx') except OSError: pass drv = gdal.GetDriverByName('GTiff') 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\",\"9108\"]],AUTHORITY[\"EPSG\",\"4326\"]]' size = 160 precision = 1. / size ds = drv.Create('tmp/gdal_contour_orientation.tif', size, size, 1) ds.SetProjection(wkt) ds.SetGeoTransform([1, precision, 0, 50, 0, -precision]) # Make the elevation 15 for the whole image raw_data = array.array('h', [15 for i in range(int(size))]).tostring() for i in range(int(size)): ds.WriteRaster(0, i, int(size), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) # Create a hill with elevation 25 raw_data = array.array('h', [25 for i in range(2)]).tostring() for i in range(2): ds.WriteRaster(int(size / 4) + int(size / 8) - 1, i + int(size / 2) - 1, 2, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) # Create a depression with elevation 5 raw_data = array.array('h', [5 for i in range(2)]).tostring() for i in range(2): ds.WriteRaster(int(size / 2) + int(size / 8) - 1, i + int(size / 2) - 1, 2, 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' -a elev -i 10 tmp/gdal_contour_orientation.tif tmp/contour_orientation1.shp') ds = ogr.Open('tmp/contour_orientation1.shp') expected_contours = ['LINESTRING (' + '1.628125 49.493749999999999,' + '1.63125 49.496875000000003,' + '1.63125 49.503124999999997,' + '1.628125 49.50625,' + '1.621875 49.50625,' + '1.61875 49.503124999999997,' + '1.61875 49.496875000000003,' + '1.621875 49.493749999999999,' + '1.628125 49.493749999999999)', 'LINESTRING (' + '1.38125 49.496875000000003,' + '1.378125 49.493749999999999,' + '1.371875 49.493749999999999,' + '1.36875 49.496875000000003,' + '1.36875 49.503124999999997,' + '1.371875 49.50625,' + '1.378125 49.50625,' + '1.38125 49.503124999999997,' + '1.38125 49.496875000000003)'] expected_elev = [10, 20] lyr = ds.ExecuteSQL("select * from contour_orientation1 order by elev asc") assert lyr.GetFeatureCount() == len(expected_contours) i = 0 test_failed = False feat = lyr.GetNextFeature() while feat is not None: expected_geom = ogr.CreateGeometryFromWkt(expected_contours[i]) assert feat.GetField('elev') == expected_elev[i] if ogrtest.check_feature_geometry(feat, expected_geom, 0.01) != 0: print('Got %s.\nExpected %s' % (feat.GetGeometryRef().ExportToWkt(), expected_contours[i])) test_failed = True i = i + 1 feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) ds.Destroy() assert not test_failed ############################################################################### # Test contour orientation def test_gdal_contour_5(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' -a elev -i 10 data/contour_orientation.tif tmp/contour_orientation2.shp') ds = ogr.Open('tmp/contour_orientation2.shp') expected_contours = ['LINESTRING (0.0 1.999999,' + '0.5 1.999999,' + '1.5 1.999999,' + '1.95454293244555 2.5,' + '2.1249976158233 3.5,' + '1.5 3.9545460850748,' + '0.5 4.06666564941406,' + '0.0 4.06666564941406)'] expected_elev = [140] lyr = ds.ExecuteSQL("select * from contour_orientation2 order by elev asc") assert lyr.GetFeatureCount() == len(expected_contours) i = 0 test_failed = False feat = lyr.GetNextFeature() while feat is not None: expected_geom = ogr.CreateGeometryFromWkt(expected_contours[i]) assert feat.GetField('elev') == expected_elev[i] if ogrtest.check_feature_geometry(feat, expected_geom) != 0: print('Got %s.\nExpected %s' % (feat.GetGeometryRef().ExportToWkt(), expected_contours[i])) test_failed = True i = i + 1 feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) ds.Destroy() assert not test_failed ############################################################################### # Cleanup def test_gdal_contour_cleanup(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/contour.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/contour_orientation1.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/contour_orientation2.shp') try: os.remove('tmp/gdal_contour.tif') os.remove('tmp/gdal_contour_orientation.tif') except OSError: pass gdalautotest-3.0.4/utilities/test_gdalsrsinfo.py0000755003401500001440000003354513614005323021601 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalsrsinfo.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdalsrsinfo testing # 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 sys import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_gdalsrsinfo_1(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalsrsinfo_path() + ' ../gcore/data/byte.tif', encoding='utf-8') assert (err is None or err == ''), 'got error/warning' assert ret.find('PROJ.4 :') != -1, ret assert ret.find('OGC WKT2:2018 :') != -1, ret ############################################################################### # Test -o proj4 option def test_gdalsrsinfo_2(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o proj4 ../gcore/data/byte.tif') assert ret.strip() == "+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs" ############################################################################### # Test -o wkt1 option def test_gdalsrsinfo_3(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt1 ../gcore/data/byte.tif') assert ret.strip() == '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"]]' ############################################################################### # Test -o wkt_esri option def test_gdalsrsinfo_4(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt_esri ../gcore/data/byte.tif') assert ret.strip() == 'PROJCS["NAD_1927_UTM_Zone_11N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_1927",SPHEROID["Clarke_1866",6378206.4,294.978698213898]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-117.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]' ############################################################################### # Test -o wkt_old option def test_gdalsrsinfo_5(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt_noct ../gcore/data/byte.tif') assert ret.strip() == 'PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898]],PRIMEM["Greenwich",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",500000],PARAMETER["false_northing",0],UNIT["metre",1]]' ############################################################################### # Test -o wkt_simple option def test_gdalsrsinfo_6(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() if gdaltest.is_travis_branch('mingw'): pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt_simple ../gcore/data/byte.tif') ret = ret.replace('\r\n', '\n') val = """PROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.978698213898]],PRIMEM["Greenwich",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",500000],PARAMETER["false_northing",0],UNIT["metre",1]]""" assert ret.strip() == val ############################################################################### # Test -o mapinfo option def test_gdalsrsinfo_7(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o mapinfo ../gcore/data/byte.tif') assert ret.strip() == """'Earth Projection 8, 62, "m", -117, 0, 0.9996, 500000, 0'""" ############################################################################### # Test nonexistent file. def test_gdalsrsinfo_9(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() _, err = gdaltest.runexternal_out_and_err( test_cli_utilities.get_gdalsrsinfo_path() + ' nonexistent_file') assert err.strip() == "ERROR 1: ERROR - failed to load SRS definition from nonexistent_file" ############################################################################### # Test -V option - valid def test_gdalsrsinfo_10(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() 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"]],AUTHORITY["EPSG","4326"]]' if sys.platform == 'win32': # Win32 shell quoting oddities wkt = wkt.replace('"', '\"') ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + " -V -o proj4 "" + wkt + """) else: ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + " -V -o proj4 '" + wkt + "'") ret = ret #assert ret.find('Validate Succeeds') != -1 ############################################################################### # Test -V option - invalid def test_gdalsrsinfo_11(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() 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"]],BADAUTHORITY["EPSG","4326"]]' if sys.platform == 'win32': # Win32 shell quoting oddities wkt = wkt.replace('"', '\"') ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + " -V -o proj4 "" + wkt + """) else: ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + " -V -o proj4 '" + wkt + "'") if ret.find('Validate Fails') == -1: pytest.xfail('validation currently broken. FIXME') ############################################################################### # Test EPSG:epsg format def test_gdalsrsinfo_12(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt1 EPSG:4326') assert ret.strip() == """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"]]""" ############################################################################### # Test proj4 format def test_gdalsrsinfo_13(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' --single-line -o wkt1 "+proj=longlat +datum=WGS84 +no_defs"') assert ret.strip() == """GEOGCS["unknown",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["Longitude",EAST],AXIS["Latitude",NORTH]]""" ############################################################################### # Test VSILFILE format def test_gdalsrsinfo_14(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o proj4 /vsizip/../gcore/data/byte.tif.zip') assert ret.strip() == "+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs" ############################################################################### # Test .shp format def test_gdalsrsinfo_14bis(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o proj4 ../ogr/data/Stacks.shp') assert ret.strip() == "+proj=lcc +lat_0=27.8333333333333 +lon_0=-99 +lat_1=30.2833333333333 +lat_2=28.3833333333333 +x_0=600000 +y_0=3999999.9998984 +datum=NAD83 +units=us-ft +no_defs" ############################################################################### # Test .prj format def test_gdalsrsinfo_15(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o proj4 ../osr/data/lcc_esri.prj') assert ret.strip() == "+proj=lcc +lat_0=33.75 +lon_0=-79 +lat_1=34.3333333333333 +lat_2=36.1666666666667 +x_0=609601.22 +y_0=0 +datum=NAD83 +units=m +no_defs" ############################################################################### # Test DRIVER:file syntax (bug #4493) - similar test should be done with OGR def test_gdalsrsinfo_16(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() cmd = test_cli_utilities.get_gdalsrsinfo_path() +\ ' GTIFF_RAW:../gcore/data/byte.tif' try: (_, err) = gdaltest.runexternal_out_and_err(cmd, encoding = 'UTF-8') except: pytest.fail('gdalsrsinfo execution failed') assert err == '' ############################################################################### # Test -e def test_gdalsrsinfo_17(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() # Zero match ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -e "LOCAL_CS[foo]"') assert 'EPSG:-1' in ret # One match ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -e ../osr/data/lcc_esri.prj') assert 'EPSG:32119' in ret # Two matches open('tmp/test_gdalsrsinfo_17.wkt', 'wt').write( 'GEOGCS["myLKS94",DATUM["Lithuania_1994_ETRS89",SPHEROID["GRS_1980",6378137,298.257222101],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]') ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + """ -e tmp/test_gdalsrsinfo_17.wkt""") assert 'EPSG:4669' in ret ############################################################################### # Test -o all option def test_gdalsrsinfo_all(): if test_cli_utilities.get_gdalsrsinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalsrsinfo_path() + ' -o all ../gcore/data/byte.tif', encoding = 'UTF-8') assert 'PROJ.4 :' in ret, ret assert 'OGC WKT1 :' in ret, ret assert 'OGC WKT2:2015 :' in ret, ret assert 'OGC WKT2:2018 :' in ret, ret assert 'OGC WKT1 (simple) :' in ret, ret assert 'OGC WKT1 (no CT) :' in ret, ret assert 'ESRI WKT :' in ret, ret gdalautotest-3.0.4/utilities/__init__.py0000644003401500001440000000000013614005323017737 0ustar rouaultusersgdalautotest-3.0.4/utilities/test_ogr2ogr_lib.py0000755003401500001440000004711313614005323021471 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_ogr2ogr_lib.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: librarified ogr2ogr testing # Author: Faza Mahamood # ############################################################################### # Copyright (c) 2015, Faza Mahamood # # 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 from osgeo import gdal, gdalconst, ogr import gdaltest import ogrtest import pytest ############################################################################### # Simple test def test_ogr2ogr_lib_1(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat0 = ds.GetLayer(0).GetFeature(0) assert feat0.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat0.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ############################################################################### # Test SQLStatement def test_ogr2ogr_lib_2(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', SQLStatement='select * from poly', SQLDialect='OGRSQL') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 # Test @filename syntax gdal.FileFromMemBuffer('/vsimem/sql.txt', '-- initial comment\nselect * from poly\n-- trailing comment') ds = gdal.VectorTranslate('', srcDS, format='Memory', SQLStatement='@/vsimem/sql.txt') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 gdal.Unlink('/vsimem/sql.txt') # Test @filename syntax with a UTF-8 BOM if sys.version_info >= (3, 0, 0): gdal.FileFromMemBuffer('/vsimem/sql.txt', '\xEF\xBB\xBFselect * from poly'.encode('LATIN1')) else: gdal.FileFromMemBuffer('/vsimem/sql.txt', '\xEF\xBB\xBFselect * from poly') ds = gdal.VectorTranslate('', srcDS, format='Memory', SQLStatement='@/vsimem/sql.txt') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 gdal.Unlink('/vsimem/sql.txt') ############################################################################### # Test WHERE def test_ogr2ogr_lib_3(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', where='EAS_ID=171') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 # Test @filename syntax gdal.FileFromMemBuffer('/vsimem/filter.txt', 'EAS_ID=171') ds = gdal.VectorTranslate('', srcDS, format='Memory', where='@/vsimem/filter.txt') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 gdal.Unlink('/vsimem/filter.txt') ############################################################################### # Test accessMode def test_ogr2ogr_lib_4(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('/vsimem/poly.shp', srcDS) assert ds.GetLayer(0).GetFeatureCount() == 10, 'wrong feature count' ds = None ds = gdal.VectorTranslate('/vsimem/poly.shp', srcDS, accessMode='append') assert ds is not None, 'ds is None' assert ds.GetLayer(0).GetFeatureCount() == 20, 'wrong feature count' ret = gdal.VectorTranslate(ds, srcDS, accessMode='append') assert ret == 1, 'ds is None' assert ds.GetLayer(0).GetFeatureCount() == 30, 'wrong feature count' feat10 = ds.GetLayer(0).GetFeature(10) assert feat10.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat10.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/poly.shp') ############################################################################### # Test dstSRS def test_ogr2ogr_lib_5(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', dstSRS='EPSG:4326') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ############################################################################### # Test selFields def test_ogr2ogr_lib_6(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') # Voluntary don't use the exact case of the source field names (#4502) ds = gdal.VectorTranslate('', srcDS, format='Memory', selectFields=['eas_id', 'prfedea']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 feat = lyr.GetNextFeature() ret = 'success' if feat.GetFieldAsDouble('EAS_ID') != 168: gdaltest.post_reason('did not get expected value for EAS_ID') print(feat.GetFieldAsDouble('EAS_ID')) ret = 'fail' elif feat.GetFieldAsString('PRFEDEA') != '35043411': gdaltest.post_reason('did not get expected value for PRFEDEA') print(feat.GetFieldAsString('PRFEDEA')) ret = 'fail' return ret ############################################################################### # Test LCO def test_ogr2ogr_lib_7(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('/vsimem/poly.shp', srcDS, layerCreationOptions=['SHPT=POLYGONZ']) assert ds.GetLayer(0).GetLayerDefn().GetGeomType() == ogr.wkbPolygon25D ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/poly.shp') ############################################################################### # Add explicit source layer name def test_ogr2ogr_lib_8(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', layers=['poly']) assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 # Test also with just a string and not an array ds = gdal.VectorTranslate('', srcDS, format='Memory', layers='poly') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ############################################################################### # Test -segmentize def test_ogr2ogr_lib_9(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', segmentizeMaxDist=100) assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat = ds.GetLayer(0).GetNextFeature() assert feat.GetGeometryRef().GetGeometryRef(0).GetPointCount() == 36 ############################################################################### # Test overwrite with a shapefile def test_ogr2ogr_lib_10(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('/vsimem/tmp/poly.shp', srcDS) assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds = None # Overwrite ds = gdal.VectorTranslate('/vsimem/tmp', srcDS, accessMode='overwrite') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/tmp') ############################################################################### # Test filter def test_ogr2ogr_lib_11(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('', srcDS, format='Memory', spatFilter=[479609, 4764629, 479764, 4764817]) if ogrtest.have_geos(): assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 else: assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 5 ############################################################################### # Test callback def mycallback(pct, msg, user_data): # pylint: disable=unused-argument user_data[0] = pct return 1 def test_ogr2ogr_lib_12(): tab = [0] ds = gdal.VectorTranslate('', '../ogr/data/poly.shp', format='Memory', callback=mycallback, callback_data=tab) assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 assert tab[0] == 1.0, 'Bad percentage' ############################################################################### # Test callback with failure def mycallback_with_failure(pct, msg, user_data): # pylint: disable=unused-argument if pct > 0.5: return 0 return 1 def test_ogr2ogr_lib_13(): with gdaltest.error_handler(): ds = gdal.VectorTranslate('', '../ogr/data/poly.shp', format='Memory', callback=mycallback_with_failure) assert ds is None ############################################################################### # Test internal wrappers def test_ogr2ogr_lib_14(): # Null dest name and no option try: gdal.wrapper_GDALVectorTranslateDestName(None, gdal.OpenEx('../ogr/data/poly.shp'), None) except RuntimeError: pass ############################################################################### # Test non existing zfield def test_ogr2ogr_lib_15(): srcDS = gdal.OpenEx('../ogr/data/poly.shp') with gdaltest.error_handler(): ds = gdal.VectorTranslate('', srcDS, format='Memory', zField='foo') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPolygon ############################################################################### # Test -dim def test_ogr2ogr_lib_16(): tests = [['POINT M (1 2 3)', None, 'POINT M (1 2 3)'], ['POINT M (1 2 3)', 'XY', 'POINT (1 2)'], ['POINT M (1 2 3)', 'XYZ', 'POINT Z (1 2 0)'], ['POINT M (1 2 3)', 'XYM', 'POINT M (1 2 3)'], ['POINT M (1 2 3)', 'XYZM', 'POINT ZM (1 2 0 3)'], ['POINT M (1 2 3)', 'layer_dim', 'POINT M (1 2 3)'], ['POINT ZM (1 2 3 4)', None, 'POINT ZM (1 2 3 4)'], ['POINT ZM (1 2 3 4)', 'XY', 'POINT (1 2)'], ['POINT ZM (1 2 3 4)', 'XYZ', 'POINT Z (1 2 3)'], ['POINT ZM (1 2 3 4)', 'XYM', 'POINT M (1 2 4)'], ['POINT ZM (1 2 3 4)', 'XYZM', 'POINT ZM (1 2 3 4)'], ['POINT ZM (1 2 3 4)', 'layer_dim', 'POINT ZM (1 2 3 4)'], ] for (wkt_before, dim, wkt_after) in tests: srcDS = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) geom = ogr.CreateGeometryFromWkt(wkt_before) lyr = srcDS.CreateLayer('test', geom_type=geom.GetGeometryType()) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(geom) lyr.CreateFeature(f) ds = gdal.VectorTranslate('', srcDS, format='Memory', dim=dim) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != wkt_after: print(wkt_before) pytest.fail(dim) ############################################################################### # Test gdal.VectorTranslate(dst_ds, ...) without accessMode specified (#6612) def test_ogr2ogr_lib_17(): ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) gdal.VectorTranslate(ds, gdal.OpenEx('../ogr/data/poly.shp')) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 10 ds = None ############################################################################### # Test -limit def test_ogr2ogr_lib_18(): ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) gdal.VectorTranslate(ds, gdal.OpenEx('../ogr/data/poly.shp'), limit=1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ds = None ############################################################################### # Test -addFields + -select def test_ogr2ogr_lib_19(): src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) lyr = src_ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('foo')) lyr.CreateField(ogr.FieldDefn('bar')) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar' f['bar'] = 'foo' lyr.CreateFeature(f) ds = gdal.VectorTranslate('', src_ds, format='Memory', selectFields=['foo']) gdal.VectorTranslate(ds, src_ds, accessMode='append', addFields=True, selectFields=['bar']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['foo'] != 'bar' or f.IsFieldSet('bar'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['bar'] != 'foo' or f.IsFieldSet('foo'): f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test preservation of source geometry field name def test_ogr2ogr_lib_20(): if ogr.GetDriverByName('GPKG') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) lyr = src_ds.CreateLayer('layer', geom_type=ogr.wkbNone) lyr.CreateGeomField(ogr.GeomFieldDefn('foo')) ds = gdal.VectorTranslate('/vsimem/out.gpkg', src_ds, format='GPKG') lyr = ds.GetLayer(0) assert lyr.GetGeometryColumn() == 'foo' ds = None gdal.Unlink('/vsimem/out.gpkg') src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) lyr = src_ds.CreateLayer('layer', geom_type=ogr.wkbNone) lyr.CreateGeomField(ogr.GeomFieldDefn('foo')) lyr.CreateGeomField(ogr.GeomFieldDefn('bar')) ds = gdal.VectorTranslate('/vsimem/out.gpkg', src_ds, format='GPKG', selectFields=['bar']) lyr = ds.GetLayer(0) assert lyr.GetGeometryColumn() == 'bar' ds = None gdal.Unlink('/vsimem/out.gpkg') ############################################################################### # Verify -append and -select options are an invalid combination def test_ogr2ogr_lib_21(): src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) lyr = src_ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('foo')) lyr.CreateField(ogr.FieldDefn('bar')) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar' f['bar'] = 'foo' lyr.CreateFeature(f) ds = gdal.VectorTranslate('', src_ds, format='Memory') with gdaltest.error_handler(): gdal.VectorTranslate(ds, src_ds, accessMode='append', selectFields=['foo']) ds = None f.Destroy() src_ds = None assert gdal.GetLastErrorNo() == gdalconst.CPLE_IllegalArg, \ 'expected use of -select and -append together to be invalid' ############################################################################### def test_ogr2ogr_clipsrc_no_dst_geom(): if not ogrtest.have_geos(): pytest.skip() tmpfilename = '/vsimem/out.csv' wkt = 'POLYGON ((479461 4764494,479461 4764196,480012 4764196,480012 4764494,479461 4764494))' ds = gdal.VectorTranslate(tmpfilename, '../ogr/data/poly.shp', options='-f CSV -clipsrc "%s"' % wkt) lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 1 ds = None gdal.Unlink(tmpfilename) ############################################################################### # Check that ogr2ogr does data axis to CRS axis mapping adaptations in case # of the output driver not following the mapping of the input dataset. def test_ogr2ogr_axis_mapping_swap(): gdal.FileFromMemBuffer("/vsimem/test_ogr2ogr_axis_mapping_swap.gml", """ 49 2 """) gdal.FileFromMemBuffer("/vsimem/test_ogr2ogr_axis_mapping_swap.gfs", """" test test urn:ogc:def:crs:EPSG::4326 """) ds = gdal.OpenEx('/vsimem/test_ogr2ogr_axis_mapping_swap.gml', open_options = ['INVERT_AXIS_ORDER_IF_LAT_LONG=NO']) if ds is None: gdal.Unlink("/vsimem/test_ogr2ogr_axis_mapping_swap.gml") gdal.Unlink("/vsimem/test_ogr2ogr_axis_mapping_swap.gfs") pytest.skip() lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [1,2] ds = None ds = gdal.VectorTranslate('/vsimem/test_ogr2ogr_axis_mapping_swap.shp', '/vsimem/test_ogr2ogr_axis_mapping_swap.gml') gdal.Unlink("/vsimem/test_ogr2ogr_axis_mapping_swap.gml") gdal.Unlink("/vsimem/test_ogr2ogr_axis_mapping_swap.gfs") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() ret = ogrtest.check_feature_geometry(feat, "POINT (2 49)") ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource( '/vsimem/test_ogr2ogr_axis_mapping_swap.shp') assert ret == 0 ############################################################################### # Test -ct def test_ogr2ogr_lib_ct(): ds = gdal.VectorTranslate('', '../ogr/data/poly.shp', format='Memory', dstSRS='EPSG:32630', reproject=True, coordinateOperation="+proj=affine +s11=-1") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() #f.DumpReadable() assert ogrtest.check_feature_geometry(f, "POLYGON ((-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))") == 0 ############################################################################### # Test -ct without SRS specification def test_ogr2ogr_lib_ct_no_srs(): ds = gdal.VectorTranslate('', '../ogr/data/poly.shp', format='Memory', coordinateOperation="+proj=affine +s11=-1") lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().GetAuthorityCode(None) == '27700' f = lyr.GetNextFeature() #f.DumpReadable() assert ogrtest.check_feature_geometry(f, "POLYGON ((-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))") == 0 gdalautotest-3.0.4/utilities/test_gdalinfo.py0000755003401500001440000006021313614005323021041 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalinfo.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdalinfo testing # 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 json from osgeo import gdal import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_gdalinfo_1(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' ../gcore/data/byte.tif', encoding = 'UTF-8') assert (err is None or err == ''), 'got error/warning' assert ret.find('Driver: GTiff/GeoTIFF') != -1 ############################################################################### # Test -checksum option def test_gdalinfo_2(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -checksum ../gcore/data/byte.tif') assert ret.find('Checksum=4672') != -1 ############################################################################### # Test -nomd option def test_gdalinfo_3(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gcore/data/byte.tif') assert ret.find('Metadata') != -1 ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -nomd ../gcore/data/byte.tif') assert ret.find('Metadata') == -1 ############################################################################### # Test -noct option def test_gdalinfo_4(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/bug407.gif') assert ret.find('0: 255,255,255,255') != -1 ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -noct ../gdrivers/data/bug407.gif') assert ret.find('0: 255,255,255,255') == -1 ############################################################################### # Test -stats option def test_gdalinfo_5(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gcore/data/byte.tif') assert ret.find('STATISTICS_MINIMUM=74') == -1, 'got wrong minimum.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -stats ../gcore/data/byte.tif') assert ret.find('STATISTICS_MINIMUM=74') != -1, 'got wrong minimum (2).' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test a dataset with overviews and RAT def test_gdalinfo_6(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/int.img') assert ret.find('Overviews') != -1 assert ret.find('GDALRasterAttributeTable') != -1 ############################################################################### # Test a dataset with GCPs def test_gdalinfo_7(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -wkt_format WKT1 ../gcore/data/gcps.vrt') assert ret.find('GCP Projection =') != -1 assert ret.find('PROJCS["NAD27 / UTM zone 11N"') != -1 assert ret.find('(100,100) -> (446720,3745320,0)') != -1 # Same but with -nogcps ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -wkt_format WKT1 -nogcp ../gcore/data/gcps.vrt') assert ret.find('GCP Projection =') == -1 assert ret.find('PROJCS["NAD27 / UTM zone 11N"') == -1 assert ret.find('(100,100) -> (446720,3745320,0)') == -1 ############################################################################### # Test -hist option def test_gdalinfo_8(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gcore/data/byte.tif') assert ret.find('0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 57 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 72 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1') == -1, \ 'did not expect histogram.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -hist ../gcore/data/byte.tif') assert ret.find('0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 57 0 0 0 0 0 0 0 62 0 0 0 0 0 0 0 66 0 0 0 0 0 0 0 0 72 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 1') != -1, \ 'did not get expected histogram.' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test -mdd option def test_gdalinfo_9(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/fake_nsif.ntf') assert ret.find('BLOCKA=010000001000000000') == -1, 'got unexpected extra MD.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -mdd TRE ../gdrivers/data/fake_nsif.ntf') assert ret.find('BLOCKA=010000001000000000') != -1, 'did not get extra MD.' ############################################################################### # Test -mm option def test_gdalinfo_10(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gcore/data/byte.tif') assert ret.find('Computed Min/Max=74.000,255.000') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -mm ../gcore/data/byte.tif') assert ret.find('Computed Min/Max=74.000,255.000') != -1 ############################################################################### # Test gdalinfo --version def test_gdalinfo_11(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --version', check_memleak=False) assert ret.startswith(gdal.VersionInfo('--version')) ############################################################################### # Test gdalinfo --build def test_gdalinfo_12(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --build', check_memleak=False) ret = ret.replace('\r\n', '\n') assert ret.startswith(gdal.VersionInfo('BUILD_INFO')) ############################################################################### # Test gdalinfo --license def test_gdalinfo_13(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --license', check_memleak=False) ret = ret.replace('\r\n', '\n') if not ret.startswith(gdal.VersionInfo('LICENSE')): print(gdal.VersionInfo('LICENSE')) if gdaltest.is_travis_branch('mingw'): return 'expected_fail' pytest.fail(ret) ############################################################################### # Test erroneous use of --config. def test_gdalinfo_14(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --config', check_memleak=False) assert '--config option given without a key and value argument' in err ############################################################################### # Test erroneous use of --mempreload. def test_gdalinfo_15(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --mempreload', check_memleak=False) assert '--mempreload option given without directory path' in err ############################################################################### # Test --mempreload def test_gdalinfo_16(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (ret, _) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --debug on --mempreload ../gcore/data /vsimem/byte.tif', check_memleak=False, encoding = 'UTF-8') assert ret.startswith('Driver: GTiff/GeoTIFF') ############################################################################### # Test erroneous use of --debug. def test_gdalinfo_17(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --debug', check_memleak=False) assert '--debug option given without debug level' in err ############################################################################### # Test erroneous use of --optfile. def test_gdalinfo_18(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --optfile', check_memleak=False) assert '--optfile option given without filename' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --optfile /foo/bar', check_memleak=False) assert 'Unable to open optfile' in err ############################################################################### # Test --optfile def test_gdalinfo_19(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() f = open('tmp/optfile.txt', 'wt') f.write('# comment\n') f.write('../gcore/data/byte.tif\n') f.close() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --optfile tmp/optfile.txt', check_memleak=False) os.unlink('tmp/optfile.txt') assert ret.startswith('Driver: GTiff/GeoTIFF') ############################################################################### # Test --formats def test_gdalinfo_20(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --formats', check_memleak=False) assert 'GTiff -raster- (rw+vs): GeoTIFF' in ret ############################################################################### # Test erroneous use of --format. def test_gdalinfo_21(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --format', check_memleak=False) assert '--format option given without a format code' in err (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' --format foo_bar', check_memleak=False) assert '--format option given with format' in err ############################################################################### # Test --format def test_gdalinfo_22(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --format GTiff', check_memleak=False) expected_strings = [ 'Short Name:', 'Long Name:', 'Extensions:', 'Mime Type:', 'Help Topic:', 'Supports: Create()', 'Supports: CreateCopy()', 'Supports: Virtual IO', 'Creation Datatypes', ''] for expected_string in expected_strings: assert expected_string in ret, ('did not find %s' % expected_string) ############################################################################### # Test --help-general def test_gdalinfo_23(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --help-general', check_memleak=False) assert 'Generic GDAL utility command options' in ret ############################################################################### # Test --locale def test_gdalinfo_24(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' --locale C ../gcore/data/byte.tif', check_memleak=False) assert ret.startswith('Driver: GTiff/GeoTIFF') ############################################################################### # Test -listmdd def test_gdalinfo_25(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/byte_with_xmp.tif -listmdd', check_memleak=False) assert 'Metadata domains:' in ret assert ' xml:XMP' in ret ############################################################################### # Test -mdd all def test_gdalinfo_26(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/byte_with_xmp.tif -mdd all', check_memleak=False) assert 'Metadata (xml:XMP)' in ret ############################################################################### # Test -oo def test_gdalinfo_27(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' ../gdrivers/data/float64.asc -oo datatype=float64', check_memleak=False) assert 'Type=Float64' in ret ############################################################################### # Simple -json test def test_gdalinfo_28(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/byte.tif', encoding = 'UTF-8') ret = json.loads(ret) assert (err is None or err == ''), 'got error/warning' assert ret['driverShortName'] == 'GTiff' ############################################################################### # Test -json -checksum option def test_gdalinfo_29(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -checksum ../gcore/data/byte.tif') ret = json.loads(ret) assert ret['bands'][0]['checksum'] == 4672 ############################################################################### # Test -json -nomd option def test_gdalinfo_30(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/byte.tif') ret = json.loads(ret) assert 'metadata' in ret ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -nomd ../gcore/data/byte.tif') ret = json.loads(ret) assert 'metadata' not in ret ############################################################################### # Test -json -noct option def test_gdalinfo_31(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/bug407.gif') ret = json.loads(ret) assert ret['bands'][0]['colorTable']['entries'][0] == [255, 255, 255, 255] ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -noct ../gdrivers/data/bug407.gif') ret = json.loads(ret) assert 'colorTable' not in ret['bands'][0] ############################################################################### # Test -stats option def test_gdalinfo_32(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/byte.tif') ret = json.loads(ret) assert '' not in ret['bands'][0]['metadata'], 'got wrong minimum.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -stats ../gcore/data/byte.tif') ret = json.loads(ret) assert ret['bands'][0]['metadata']['']['STATISTICS_MINIMUM'] == '74', \ 'got wrong minimum (2).' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test a dataset with overviews and RAT def test_gdalinfo_33(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/int.img') ret = json.loads(ret) assert 'overviews' in ret['bands'][0] assert 'rat' in ret ############################################################################### # Test a dataset with GCPs def test_gdalinfo_34(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/gcps.vrt') ret = json.loads(ret) assert 'wkt' in ret['gcps']['coordinateSystem'] assert ret['gcps']['coordinateSystem']['wkt'].find('PROJCRS["NAD27 / UTM zone 11N"') != -1 assert ret['gcps']['gcpList'][0]['x'] == 440720.0 ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -nogcp ../gcore/data/gcps.vrt') ret = json.loads(ret) assert 'gcps' not in ret ############################################################################### # Test -hist option def test_gdalinfo_35(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() try: os.remove('../gcore/data/byte.tif.aux.xml') except OSError: pass ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/byte.tif') ret = json.loads(ret) assert 'histogram' not in ret['bands'][0], 'did not expect histogram.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -hist ../gcore/data/byte.tif') ret = json.loads(ret) assert ret['bands'][0]['histogram']['buckets'] == [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 1], \ 'did not get expected histogram.' # We will blow an exception if the file does not exist now! os.remove('../gcore/data/byte.tif.aux.xml') ############################################################################### # Test -mdd option def test_gdalinfo_36(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/fake_nsif.ntf') ret = json.loads(ret) assert 'TRE' not in ret['metadata'], 'got unexpected extra MD.' ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -mdd TRE ../gdrivers/data/fake_nsif.ntf') ret = json.loads(ret) assert ret['metadata']['TRE']['BLOCKA'].find('010000001000000000') != -1, \ 'did not get extra MD.' ############################################################################### # Test -mm option def test_gdalinfo_37(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gcore/data/byte.tif') ret = json.loads(ret) assert 'computedMin' not in ret['bands'][0] ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json -mm ../gcore/data/byte.tif') ret = json.loads(ret) assert ret['bands'][0]['computedMin'] == 74.000 ############################################################################### # Test -listmdd def test_gdalinfo_38(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/byte_with_xmp.tif -listmdd', check_memleak=False) ret = json.loads(ret) assert 'metadataDomains' in ret['metadata'] assert ret['metadata']['metadataDomains'][0] == 'xml:XMP' ############################################################################### # Test -mdd all def test_gdalinfo_39(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/byte_with_xmp.tif -mdd all', check_memleak=False) ret = json.loads(ret) assert 'xml:XMP' in ret['metadata'] ############################################################################### # Test -json wgs84Extent def test_gdalinfo_40(): if test_cli_utilities.get_gdalinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdalinfo_path() + ' -json ../gdrivers/data/small_world.tif') ret = json.loads(ret) assert 'wgs84Extent' in ret assert 'type' in ret['wgs84Extent'] assert ret['wgs84Extent']['type'] == 'Polygon' assert 'coordinates' in ret['wgs84Extent'] assert ret['wgs84Extent']['coordinates'] == [[[-180.0, 90.0], [-180.0, -90.0], [180.0, -90.0], [180.0, 90.0], [-180.0, 90.0]]] gdalautotest-3.0.4/utilities/test_ogr2ogr.py0000755003401500001440000025573513614005323020656 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_ogr2ogr.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: ogr2ogr testing # Author: Even Rouault # ############################################################################### # 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 sys import os import shutil import pytest sys.path.append('../ogr') from osgeo import gdal, ogr, osr import gdaltest import ogrtest import test_cli_utilities ############################################################################### # Simple test def test_ogr2ogr_1(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp') assert (err is None or err == ''), 'got error/warning' ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat0 = ds.GetLayer(0).GetFeature(0) assert feat0.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat0.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -sql def test_ogr2ogr_2(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -sql "select * from poly"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -spat def test_ogr2ogr_3(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -spat 479609 4764629 479764 4764817') ds = ogr.Open('tmp/poly.shp') if ogrtest.have_geos(): assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 else: assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 5 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -where def test_ogr2ogr_4(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -where "EAS_ID=171"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -append def test_ogr2ogr_5(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp') # All 3 variants below should be equivalent gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -update -append tmp/poly.shp ../ogr/data/poly.shp') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/poly.shp ../ogr/data/poly.shp') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append -update tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 40 feat10 = ds.GetLayer(0).GetFeature(10) assert feat10.GetFieldAsDouble('AREA') == 215229.266, \ 'Did not get expected value for field AREA' assert feat10.GetFieldAsString('PRFEDEA') == '35043411', \ 'Did not get expected value for field PRFEDEA' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -overwrite def test_ogr2ogr_6(): import ogr_pg if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ogr_pg.test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -update -overwrite -f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert ds is not None and ds.GetLayerByName('tpoly').GetFeatureCount() == 10 ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') ############################################################################### # Test -gt def test_ogr2ogr_7(): import ogr_pg if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ogr_pg.test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PostgreSQL PG:"' + gdaltest.pg_connection_string + '" ../ogr/data/poly.shp -nln tpoly -gt 1') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert ds is not None and ds.GetLayerByName('tpoly').GetFeatureCount() == 10 ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' PG:"' + gdaltest.pg_connection_string + '" -sql "DELLAYER:tpoly"') ############################################################################### # Test -t_srs def test_ogr2ogr_8(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -t_srs EPSG:4326 tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -a_srs def test_ogr2ogr_9(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -a_srs EPSG:4326 tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -select def test_ogr2ogr_10(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass # Voluntary don't use the exact case of the source field names (#4502) gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -select eas_id,prfedea tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 feat = lyr.GetNextFeature() ret = 'success' if feat.GetFieldAsDouble('EAS_ID') != 168: gdaltest.post_reason('did not get expected value for EAS_ID') print(feat.GetFieldAsDouble('EAS_ID')) ret = 'fail' elif feat.GetFieldAsString('PRFEDEA') != '35043411': gdaltest.post_reason('did not get expected value for PRFEDEA') print(feat.GetFieldAsString('PRFEDEA')) ret = 'fail' feat = None ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') return ret ############################################################################### # Test -lco def test_ogr2ogr_11(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -lco SHPT=POLYGONZ tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds.GetLayer(0).GetLayerDefn().GetGeomType() == ogr.wkbPolygon25D ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -nlt def test_ogr2ogr_12(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -nlt POLYGON25D tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds.GetLayer(0).GetLayerDefn().GetGeomType() == ogr.wkbPolygon25D ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Add explicit source layer name def test_ogr2ogr_13(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp poly') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -segmentize def test_ogr2ogr_14(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -segmentize 100 tmp/poly.shp ../ogr/data/poly.shp poly') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 feat = ds.GetLayer(0).GetNextFeature() assert feat.GetGeometryRef().GetGeometryRef(0).GetPointCount() == 36 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -overwrite with a shapefile def test_ogr2ogr_15(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() # Overwrite gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -overwrite tmp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -fid def test_ogr2ogr_16(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -fid 8 tmp/poly.shp ../ogr/data/poly.shp') src_ds = ogr.Open('../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 src_feat = src_ds.GetLayer(0).GetFeature(8) feat = ds.GetLayer(0).GetNextFeature() assert feat.GetField("EAS_ID") == src_feat.GetField("EAS_ID") ds.Destroy() src_ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -progress def test_ogr2ogr_17(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass ret = gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -progress tmp/poly.shp ../ogr/data/poly.shp') assert ret.find('0...10...20...30...40...50...60...70...80...90...100 - done.') != -1 ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -wrapdateline def test_ogr2ogr_18(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') except (OSError, AttributeError): pass try: os.stat('tmp/wrapdateline_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') except (OSError, AttributeError): pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/wrapdateline_src.shp') srs = osr.SpatialReference() srs.ImportFromEPSG(32660) lyr = ds.CreateLayer('wrapdateline_src', srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POLYGON((700000 4000000,800000 4000000,800000 3000000,700000 3000000,700000 4000000))') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) feat.Destroy() ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -wrapdateline -t_srs EPSG:4326 tmp/wrapdateline_dst.shp tmp/wrapdateline_src.shp') expected_wkt = 'MULTIPOLYGON (((-179.667822828781 36.0983491954137,-179.974688335419 27.0898861430767,-180.0 27.0904291236983,-180.0 36.1071354433546,-179.667822828781 36.0983491954137)),((180.0 27.0904291237411,179.017505655195 27.1079795236252,179.222391385437 36.1240958321293,180.0 36.1071354433546,180.0 27.0904291237411)))' expected_geom = ogr.CreateGeometryFromWkt(expected_wkt) ds = ogr.Open('tmp/wrapdateline_dst.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() got_wkt = feat.GetGeometryRef().ExportToWkt() ret = ogrtest.check_feature_geometry(feat, expected_geom) feat.Destroy() expected_geom.Destroy() ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') if ret == 0: return pytest.fail(got_wkt) ############################################################################### # Test -clipsrc def test_ogr2ogr_19(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -clipsrc spat_extent -spat 479609 4764629 479764 4764817') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test correct remap of fields when laundering to Shapefile format # Test that the data is going into the right field # FIXME: Any field is skipped if a subsequent field with same name is found. def test_ogr2ogr_20(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() expected_fields = ['a', 'A_1', 'a_1_2', 'aaaaaAAAAA', 'aAaaaAAA_1', 'aaaaaAAAAB', 'aaaaaAAA_2', 'aaaaaAAA_3', 'aaaaaAAA_4', 'aaaaaAAA_5', 'aaaaaAAA_6', 'aaaaaAAA_7', 'aaaaaAAA_8', 'aaaaaAAA_9', 'aaaaaAAA10'] expected_data = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'] gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp data/Fields.csv') ds = ogr.Open('tmp/Fields.dbf') assert ds is not None layer_defn = ds.GetLayer(0).GetLayerDefn() if layer_defn.GetFieldCount() != 15: ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') pytest.fail('Unexpected field count: ' + str(ds.GetLayer(0).GetLayerDefn().GetFieldCount())) error_occurred = False feat = ds.GetLayer(0).GetNextFeature() for i in range(layer_defn.GetFieldCount()): if layer_defn.GetFieldDefn(i).GetNameRef() != expected_fields[i]: print('Expected ', expected_fields[i], ',but got', layer_defn.GetFieldDefn(i).GetNameRef()) error_occurred = True if feat.GetFieldAsString(i) != expected_data[i]: print('Expected the value ', expected_data[i], ',but got', feat.GetFieldAsString(i)) error_occurred = True ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') assert not error_occurred ############################################################################### # Test ogr2ogr when the output driver has already created the fields # at dataset creation (#3247) def test_ogr2ogr_21(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.remove('tmp/testogr2ogr21.gtm') except OSError: pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GPSTrackMaker tmp/testogr2ogr21.gtm data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -nlt POINT') ds = ogr.Open('tmp/testogr2ogr21.gtm') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() os.remove('tmp/testogr2ogr21.gtm') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() os.remove('tmp/testogr2ogr21.gtm') ############################################################################### # Test ogr2ogr when the output driver delays the destination layer defn creation (#3384) def test_ogr2ogr_22(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f "MapInfo File" tmp/testogr2ogr22.mif data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -nlt POINT') ds = ogr.Open('tmp/testogr2ogr22.mif') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr22.mif') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr22.mif') ############################################################################### # Same as previous but with -select def test_ogr2ogr_23(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f "MapInfo File" tmp/testogr2ogr23.mif data/dataforogr2ogr21.csv ' + '-sql "SELECT comment, name FROM dataforogr2ogr21" -select comment,name -nlt POINT') ds = ogr.Open('tmp/testogr2ogr23.mif') assert ds is not None ds.GetLayer(0).GetLayerDefn() lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('name') != 'NAME' or \ feat.GetFieldAsString('comment') != 'COMMENT': print(feat.GetFieldAsString('comment')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr23.mif') pytest.fail(feat.GetFieldAsString('name')) ds.Destroy() ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testogr2ogr23.mif') ############################################################################### # Test -clipsrc with WKT geometry (#3530) def test_ogr2ogr_24(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -clipsrc "POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -clipsrc with clip from external datasource def test_ogr2ogr_25(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass f = open('tmp/clip.csv', 'wt') f.write('foo,WKT\n') f.write('foo,"POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -clipsrc tmp/clip.csv -clipsrcwhere foo=\'foo\'') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') os.remove('tmp/clip.csv') ############################################################################### # Test -clipdst with WKT geometry (#3530) def test_ogr2ogr_26(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/poly.shp ../ogr/data/poly.shp -clipdst "POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test -clipdst with clip from external datasource def test_ogr2ogr_27(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass f = open('tmp/clip.csv', 'wt') f.write('foo,WKT\n') f.write('foo,"POLYGON((479609 4764629,479609 4764817,479764 4764817,479764 4764629,479609 4764629))"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -nlt MULTIPOLYGON tmp/poly.shp ../ogr/data/poly.shp -clipdst tmp/clip.csv -clipdstsql "SELECT * from clip"') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 4 assert ds.GetLayer(0).GetExtent() == (479609, 479764, 4764629, 4764817), \ 'unexpected extent' ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') os.remove('tmp/clip.csv') ############################################################################### # Test -wrapdateline on linestrings def test_ogr2ogr_28(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') except (OSError, AttributeError): pass try: os.stat('tmp/wrapdateline_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') except (OSError, AttributeError): pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/wrapdateline_src.shp') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('wrapdateline_src', srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('LINESTRING(160 0,165 1,170 2,175 3,177 4,-177 5,-175 6,-170 7,-177 8,177 9,170 10)') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) feat.Destroy() ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -wrapdateline tmp/wrapdateline_dst.shp tmp/wrapdateline_src.shp') expected_wkt = 'MULTILINESTRING ((160 0,165 1,170 2,175 3,177 4,180 4.5),(-180 4.5,-177 5,-175 6,-170 7,-177 8,-180 8.5),(180 8.5,177 9,170 10))' expected_geom = ogr.CreateGeometryFromWkt(expected_wkt) ds = ogr.Open('tmp/wrapdateline_dst.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() ret = ogrtest.check_feature_geometry(feat, expected_geom) feat.Destroy() expected_geom.Destroy() ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') assert ret == 0 ############################################################################### # Test -wrapdateline on polygons def test_ogr2ogr_29(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() for i in range(2): try: os.stat('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') except (OSError, AttributeError): pass try: os.stat('tmp/wrapdateline_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') except (OSError, AttributeError): pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/wrapdateline_src.shp') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('wrapdateline_src', srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) if i == 0: geom = ogr.CreateGeometryFromWkt('POLYGON((179 40,179.5 40,-179.5 40,-179 40,-170 40,-165 40,-165 30,-170 30,-179 30,-179.5 30,179.5 30,179 30,179 40))') else: geom = ogr.CreateGeometryFromWkt('POLYGON((-165 30,-170 30,-179 30,-179.5 30,179.5 30,179 30,179 40,179.5 40,-179.5 40,-179 40,-170 40,-165 40,-165 30))') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat.Destroy() ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -wrapdateline tmp/wrapdateline_dst.shp tmp/wrapdateline_src.shp') expected_wkt = 'MULTIPOLYGON (((180 30,179.5 30.0,179 30,179 40,179.5 40.0,180 40,180 30)),((-180 40,-179.5 40.0,-179 40,-170 40,-165 40,-165 30,-170 30,-179 30,-179.5 30.0,-180 30,-180 40)))' expected_geom = ogr.CreateGeometryFromWkt(expected_wkt) ds = ogr.Open('tmp/wrapdateline_dst.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() ret = ogrtest.check_feature_geometry(feat, expected_geom) if ret != 0: print('src is : %s' % geom.ExportToWkt()) print('got : %s' % feat.GetGeometryRef().ExportToWkt()) feat.Destroy() expected_geom.Destroy() ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/wrapdateline_dst.shp') assert ret == 0 ############################################################################### # Test -splitlistfields option def test_ogr2ogr_30(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() ds = ogr.Open('../ogr/data/testlistfields.gml') if ds is None: pytest.skip() ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -splitlistfields tmp/test_ogr2ogr_30.dbf ../ogr/data/testlistfields.gml') gdal.Unlink('../ogr/data//testlistfields.gfs') ds = ogr.Open('tmp/test_ogr2ogr_30.dbf') assert ds is not None lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('attrib11') != 'value1' or \ feat.GetField('attrib12') != 'value2' or \ feat.GetField('attrib2') != 'value3' or \ feat.GetField('attrib31') != 4 or \ feat.GetField('attrib32') != 5 or \ feat.GetField('attrib41') != 6.1 or \ feat.GetField('attrib42') != 7.1: feat.DumpReadable() pytest.fail('did not get expected attribs') ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_30.dbf') ############################################################################### # Test that -overwrite work if the output file doesn't yet exist (#3825) def test_ogr2ogr_31(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -overwrite tmp/poly.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') ############################################################################### # Test that -append/-overwrite to a single-file shapefile work without specifying -nln def test_ogr2ogr_32(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_32.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_32.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_32.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -overwrite tmp/test_ogr2ogr_32.shp ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_32.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_32.shp') ############################################################################### # Test -explodecollections def test_ogr2ogr_33(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_33_src.csv') ogr.GetDriverByName('CSV').DeleteDataSource('tmp/test_ogr2ogr_33_src.csv') except (OSError, AttributeError): pass try: os.stat('tmp/test_ogr2ogr_33_dst.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_33_dst.shp') except (OSError, AttributeError): pass f = open('tmp/test_ogr2ogr_33_src.csv', 'wt') f.write('foo,WKT\n') f.write('bar,"MULTIPOLYGON (((10 10,10 11,11 11,11 10,10 10)),((100 100,100 200,200 200,200 100,100 100),(125 125,175 125,175 175,125 175,125 125)))"\n') f.write('baz,"POLYGON ((0 0,0 1,1 1,1 0,0 0))"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -explodecollections tmp/test_ogr2ogr_33_dst.shp tmp/test_ogr2ogr_33_src.csv -select foo') ds = ogr.Open('tmp/test_ogr2ogr_33_dst.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3, '-explodecollections failed' feat = lyr.GetFeature(0) if feat.GetField("foo") != 'bar': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((10 10,10 11,11 11,11 10,10 10))': feat.DumpReadable() pytest.fail() feat = lyr.GetFeature(1) if feat.GetField("foo") != 'bar': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((100 100,100 200,200 200,200 100,100 100),(125 125,175 125,175 175,125 175,125 125))': feat.DumpReadable() pytest.fail() feat = lyr.GetFeature(2) if feat.GetField("foo") != 'baz': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('CSV').DeleteDataSource('tmp/test_ogr2ogr_33_src.csv') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_33_dst.shp') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist src.shp -nln someDirThatDoesNotExist' # This should result in creating a someDirThatDoesNotExist directory with # someDirThatDoesNotExist.shp/dbf/shx inside this directory def test_ogr2ogr_34(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_34_dir') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_34_dir') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ 'initial shapefile creation failed' ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -overwrite tmp/test_ogr2ogr_34_dir ../ogr/data/poly.shp -nln test_ogr2ogr_34_dir') ds = ogr.Open('tmp/test_ogr2ogr_34_dir/test_ogr2ogr_34_dir.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_34_dir') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist src.shp' def test_ogr2ogr_35(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_35_dir') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_35_dir') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp ') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ 'initial shapefile creation failed' ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 20, '-append failed' ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -overwrite tmp/test_ogr2ogr_35_dir ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_35_dir/poly.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 10, \ '-overwrite failed' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_35_dir') ############################################################################### # Test ogr2ogr -zfield def test_ogr2ogr_36(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_36.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_36.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_36.shp ../ogr/data/poly.shp -zfield EAS_ID') ds = ogr.Open('tmp/test_ogr2ogr_36.shp') feat = ds.GetLayer(0).GetNextFeature() wkt = feat.GetGeometryRef().ExportToWkt() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_36.shp') assert wkt.find(' 168,') != -1 ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist.shp dataSourceWithMultipleLayer' def test_ogr2ogr_37(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_37_dir.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_dir.shp') except (OSError, AttributeError): pass try: os.mkdir('tmp/test_ogr2ogr_37_src') except OSError: pass shutil.copy('../ogr/data/poly.shp', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/poly.shx', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/poly.dbf', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.shp', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.shx', 'tmp/test_ogr2ogr_37_src') shutil.copy('../ogr/data/testpoly.dbf', 'tmp/test_ogr2ogr_37_src') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_37_dir.shp tmp/test_ogr2ogr_37_src') ds = ogr.Open('tmp/test_ogr2ogr_37_dir.shp') assert ds is not None and ds.GetLayerCount() == 2 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_src') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_37_dir.shp') ############################################################################### # Test that we take into account the fields by the where clause when combining # -select and -where (#4015) def test_ogr2ogr_38(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_38.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_38.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_38.shp ../ogr/data/poly.shp -select AREA -where "EAS_ID = 170"') ds = ogr.Open('tmp/test_ogr2ogr_38.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_38.shp') ############################################################################### # Test 'ogr2ogr someDirThatDoesNotExist.shp dataSourceWithMultipleLayer -sql "select * from alayer"' (#4268) def test_ogr2ogr_39(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_39_dir.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39.shp') except (OSError, AttributeError): pass try: os.mkdir('tmp/test_ogr2ogr_39_src') except OSError: pass shutil.copy('../ogr/data/poly.shp', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/poly.shx', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/poly.dbf', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.shp', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.shx', 'tmp/test_ogr2ogr_39_src') shutil.copy('../ogr/data/testpoly.dbf', 'tmp/test_ogr2ogr_39_src') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_39.shp tmp/test_ogr2ogr_39_src -sql "select * from poly"') ds = ogr.Open('tmp/test_ogr2ogr_39.shp') assert ds is not None and ds.GetLayerCount() == 1 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39_src') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_39.shp') ############################################################################### # Test 'ogr2ogr -update asqlite.db asqlite.db layersrc -nln layerdst' (#4270) def test_ogr2ogr_40(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() drv = ogr.GetDriverByName('SQLite') if drv is None: pytest.skip() try: ogr.GetDriverByName('SQLite').DeleteDataSource('tmp/test_ogr2ogr_40.db') except AttributeError: pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f SQlite tmp/test_ogr2ogr_40.db ../ogr/data/poly.shp') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -update tmp/test_ogr2ogr_40.db tmp/test_ogr2ogr_40.db poly -nln poly2') ds = ogr.Open('tmp/test_ogr2ogr_40.db') lyr = ds.GetLayerByName('poly2') assert lyr.GetFeatureCount() == 10 ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('tmp/test_ogr2ogr_40.db') ############################################################################### # Test 'ogr2ogr -update PG:xxxx PG:xxxx layersrc -nln layerdst' (#4270) def test_ogr2ogr_41(): import ogr_pg if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() ogr_pg.test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.Destroy() ds = ogr.Open('PG:' + gdaltest.pg_connection_string) ds.ExecuteSQL('DELLAYER:test_ogr2ogr_41_src') ds.ExecuteSQL('DELLAYER:test_ogr2ogr_41_target') lyr = ds.CreateLayer('test_ogr2ogr_41_src') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.StartTransaction() for i in range(501): feat = ogr.Feature(lyr.GetLayerDefn()) feat['foo'] = '%d' % i lyr.CreateFeature(feat) feat = None lyr.CommitTransaction() lyr = None ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -update PG:"' + gdaltest.pg_connection_string + '" PG:"' + gdaltest.pg_connection_string + '" test_ogr2ogr_41_src -nln test_ogr2ogr_41_target') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('test_ogr2ogr_41_target') assert lyr.GetFeatureCount() == 501 ds.ExecuteSQL('DELLAYER:test_ogr2ogr_41_src') ds.ExecuteSQL('DELLAYER:test_ogr2ogr_41_target') ds = None ############################################################################### # Test combination of -select and -where FID=xx (#4500) def test_ogr2ogr_42(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_42.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_42.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_42.shp ../ogr/data/poly.shp -select AREA -where "FID = 0"') ds = ogr.Open('tmp/test_ogr2ogr_42.shp') lyr = ds.GetLayerByIndex(0) assert lyr.GetFeatureCount() == 1 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_42.shp') ############################################################################### # Test -dim 3 and -dim 2 def test_ogr2ogr_43(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_43_3d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_3d.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_43_3d.shp ../ogr/data/poly.shp -dim 3') ds = ogr.Open('tmp/test_ogr2ogr_43_3d.shp') lyr = ds.GetLayerByIndex(0) assert lyr.GetGeomType() == ogr.wkbPolygon25D ds = None try: os.stat('tmp/test_ogr2ogr_43_2d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_2d.shp') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_43_2d.shp tmp/test_ogr2ogr_43_3d.shp -dim 2') ds = ogr.Open('tmp/test_ogr2ogr_43_2d.shp') lyr = ds.GetLayerByIndex(0) assert lyr.GetGeomType() == ogr.wkbPolygon ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_2d.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_43_3d.shp') ############################################################################### # Test -nlt PROMOTE_TO_MULTI for polygon/multipolygon def test_ogr2ogr_44(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_44_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') except (OSError, AttributeError): pass gdal.Unlink('tmp/test_ogr2ogr_44.gml') gdal.Unlink('tmp/test_ogr2ogr_44.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_44_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_44_src', geom_type=ogr.wkbPolygon) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,0 0)),((10 0,10 1,11 1,10 0)))')) lyr.CreateFeature(feat) ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/test_ogr2ogr_44.gml tmp/test_ogr2ogr_44_src.shp -nlt PROMOTE_TO_MULTI') f = open('tmp/test_ogr2ogr_44.xsd') data = f.read() f.close() assert data.find('type="gml:MultiPolygonPropertyType"') != -1 f = open('tmp/test_ogr2ogr_44.gml') data = f.read() f.close() assert data.find('0,0 0,1 1,1 0,0') != -1 ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_44_src.shp') os.unlink('tmp/test_ogr2ogr_44.gml') os.unlink('tmp/test_ogr2ogr_44.xsd') ############################################################################### # Test -nlt PROMOTE_TO_MULTI for linestring/multilinestring def test_ogr2ogr_45(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_45_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_45_src.shp') except (OSError, AttributeError): pass gdal.Unlink('tmp/test_ogr2ogr_45.gml') gdal.Unlink('tmp/test_ogr2ogr_45.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_45_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_45_src', geom_type=ogr.wkbLineString) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1,1 1,0 0)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 0,0 1,1 1,0 0),(10 0,10 1,11 1,10 0))')) lyr.CreateFeature(feat) ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/test_ogr2ogr_45.gml tmp/test_ogr2ogr_45_src.shp -nlt PROMOTE_TO_MULTI') f = open('tmp/test_ogr2ogr_45.xsd') data = f.read() f.close() assert data.find('type="gml:MultiLineStringPropertyType"') != -1 f = open('tmp/test_ogr2ogr_45.gml') data = f.read() f.close() assert data.find('0,0 0,1 1,1 0,0') != -1 ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_45_src.shp') os.unlink('tmp/test_ogr2ogr_45.gml') os.unlink('tmp/test_ogr2ogr_45.xsd') ############################################################################### # Test -gcp (#4604) def test_ogr2ogr_46(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/test_ogr2ogr_46_src.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_46_src.shp') except (OSError, AttributeError): pass gdal.Unlink('tmp/test_ogr2ogr_46.gml') gdal.Unlink('tmp/test_ogr2ogr_46.xsd') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test_ogr2ogr_46_src.shp') lyr = ds.CreateLayer('test_ogr2ogr_46_src', geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) lyr.CreateFeature(feat) ds = None for option in ['', ' -tps', ' -order 1', ' -a_srs EPSG:4326', ' -s_srs EPSG:4326 -t_srs EPSG:3857']: gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/test_ogr2ogr_46.gml tmp/test_ogr2ogr_46_src.shp -gcp 0 0 2 49 -gcp 0 1 2 50 -gcp 1 0 3 49%s' % option) f = open('tmp/test_ogr2ogr_46.gml') data = f.read() f.close() assert not (data.find('2,49') == -1 and data.find('2.0,49.0') == -1 and data.find('222638.') == -1), \ option assert not (data.find('3,50') == -1 and data.find('3.0,50.0') == -1 and data.find('333958.') == -1), \ option os.unlink('tmp/test_ogr2ogr_46.gml') os.unlink('tmp/test_ogr2ogr_46.xsd') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_46_src.shp') ############################################################################### # Test reprojection with features with different SRS def test_ogr2ogr_47(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_47_src.gml', 'wt') f.write(""" 500000,4500000 500000,4500000 """) f.close() gdal.Unlink('tmp/test_ogr2ogr_47_src.gfs') ds = ogr.Open('tmp/test_ogr2ogr_47_src.gml') if ds is None: os.unlink('tmp/test_ogr2ogr_47_src.gml') pytest.skip() ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML -t_srs EPSG:4326 tmp/test_ogr2ogr_47_dst.gml tmp/test_ogr2ogr_47_src.gml') f = open('tmp/test_ogr2ogr_47_dst.gml') data = f.read() f.close() assert not (data.find('>-3.0,40.65') == -1 and data.find('<3.0,40.65') == -1) os.unlink('tmp/test_ogr2ogr_47_dst.gml') os.unlink('tmp/test_ogr2ogr_47_dst.xsd') os.unlink('tmp/test_ogr2ogr_47_src.gml') os.unlink('tmp/test_ogr2ogr_47_src.gfs') ############################################################################### # Test fieldmap option def test_ogr2ogr_48(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp data/Fields.csv') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append -fieldmap identity tmp data/Fields.csv') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append -fieldmap 14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 tmp data/Fields.csv') ds = ogr.Open('tmp/Fields.dbf') assert ds is not None layer_defn = ds.GetLayer(0).GetLayerDefn() if layer_defn.GetFieldCount() != 15: ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') pytest.fail('Unexpected field count: ' + str(ds.GetLayer(0).GetLayerDefn().GetFieldCount())) error_occurred = False lyr = ds.GetLayer(0) lyr.GetNextFeature() feat = lyr.GetNextFeature() for i in range(layer_defn.GetFieldCount()): if feat.GetFieldAsString(i) != str(i + 1): print('Expected the value ', str(i + 1), ',but got', feat.GetFieldAsString(i)) error_occurred = True feat = lyr.GetNextFeature() for i in range(layer_defn.GetFieldCount()): if feat.GetFieldAsString(i) != str(layer_defn.GetFieldCount() - i): print('Expected the value ', str(layer_defn.GetFieldCount() - i), ',but got', feat.GetFieldAsString(i)) error_occurred = True ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/Fields.dbf') assert not error_occurred ############################################################################### # Test detection of duplicated field names in source layer and renaming # in target layer def test_ogr2ogr_49(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f CSV tmp/test_ogr2ogr_49.csv data/duplicatedfields.csv') f = open('tmp/test_ogr2ogr_49.csv') lines = f.readlines() f.close() os.unlink('tmp/test_ogr2ogr_49.csv') assert (lines[0].find('foo,bar,foo3,foo2,baz,foo4') == 0 and \ lines[1].find('val_foo,val_bar,val_foo3,val_foo2,val_baz,val_foo4') == 0) ############################################################################### # Test detection of duplicated field names is case insensitive (#5208) def test_ogr2ogr_49_bis(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f KML tmp/test_ogr2ogr_49_bis.kml data/grid.csv -sql "SELECT field_1 AS name FROM grid WHERE fid = 1"') f = open('tmp/test_ogr2ogr_49_bis.kml') lines = f.readlines() f.close() os.unlink('tmp/test_ogr2ogr_49_bis.kml') expected_lines = [ """""", """""", """""", """grid""", """ """, """ 440750.000""", """ """, """""", """"""] assert len(lines) == len(expected_lines) for i, line in enumerate(lines): assert line.strip() == expected_lines[i].strip(), lines ############################################################################### # Test -addfields def test_ogr2ogr_50(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_50_1.csv', 'wt') f.write('id,field1\n') f.write('1,foo\n') f.close() f = open('tmp/test_ogr2ogr_50_2.csv', 'wt') f.write('id,field1,field2\n') f.write('2,bar,baz\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_50.dbf tmp/test_ogr2ogr_50_1.csv -nln test_ogr2ogr_50') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -addfields tmp/test_ogr2ogr_50.dbf tmp/test_ogr2ogr_50_2.csv -nln test_ogr2ogr_50') ds = ogr.Open('tmp/test_ogr2ogr_50.dbf') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('field1') != 'foo' or not feat.IsFieldNull('field2'): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetField('field1') != 'bar' or feat.GetField('field2') != 'baz': feat.DumpReadable() pytest.fail() ds = None os.unlink('tmp/test_ogr2ogr_50.dbf') os.unlink('tmp/test_ogr2ogr_50_1.csv') os.unlink('tmp/test_ogr2ogr_50_2.csv') ############################################################################### # Test RFC 41 support def test_ogr2ogr_51(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_51_src.csv', 'wt') f.write('id,_WKTgeom1_EPSG_4326,foo,_WKTgeom2_EPSG_32631\n') f.write('1,"POINT(1 2)","bar","POINT(3 4)"\n') f.close() # Test conversion from a multi-geometry format into a multi-geometry format gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f CSV tmp/test_ogr2ogr_51_dst.csv tmp/test_ogr2ogr_51_src.csv -nln test_ogr2ogr_51_dst -dsco GEOMETRY=AS_WKT -lco STRING_QUOTING=ALWAYS') f = open('tmp/test_ogr2ogr_51_dst.csv', 'rt') lines = f.readlines() f.close() expected_lines = ['"_WKTgeom1_EPSG_4326","_WKTgeom2_EPSG_32631","id","foo"', '"POINT (1 2)","POINT (3 4)","1","bar"'] for i in range(2): assert lines[i].strip() == expected_lines[i] # Test conversion from a multi-geometry format into a single-geometry format gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_51_dst.shp tmp/test_ogr2ogr_51_src.csv -nln test_ogr2ogr_51_dst') ds = ogr.Open('tmp/test_ogr2ogr_51_dst.shp') lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() assert sr is not None and sr.ExportToWkt().find('GEOGCS["WGS 84"') == 0 feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (1 2)' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_51_dst.shp') # Test -append into a multi-geometry format gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/test_ogr2ogr_51_dst.csv tmp/test_ogr2ogr_51_src.csv -nln test_ogr2ogr_51_dst') f = open('tmp/test_ogr2ogr_51_dst.csv', 'rt') lines = f.readlines() f.close() expected_lines = ['"_WKTgeom1_EPSG_4326","_WKTgeom2_EPSG_32631","id","foo"', '"POINT (1 2)","POINT (3 4)","1","bar"', '"POINT (1 2)","POINT (3 4)","1","bar"'] for i in range(3): assert lines[i].strip() == expected_lines[i] os.unlink('tmp/test_ogr2ogr_51_dst.csv') # Test -select with geometry field names gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -select foo,geom__WKTgeom2_EPSG_32631,id,geom__WKTgeom1_EPSG_4326 -f CSV tmp/test_ogr2ogr_51_dst.csv tmp/test_ogr2ogr_51_src.csv -nln test_ogr2ogr_51_dst -dsco GEOMETRY=AS_WKT -lco STRING_QUOTING=ALWAYS') f = open('tmp/test_ogr2ogr_51_dst.csv', 'rt') lines = f.readlines() f.close() expected_lines = ['"_WKTgeom2_EPSG_32631","_WKTgeom1_EPSG_4326","foo","id"', '"POINT (3 4)","POINT (1 2)","bar","1"'] for i in range(2): assert lines[i].strip() == expected_lines[i] # Test -geomfield option gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/test_ogr2ogr_51_dst.csv tmp/test_ogr2ogr_51_src.csv -nln test_ogr2ogr_51_dst -spat 1 2 1 2 -geomfield geom__WKTgeom1_EPSG_4326') f = open('tmp/test_ogr2ogr_51_dst.csv', 'rt') lines = f.readlines() f.close() expected_lines = ['"_WKTgeom2_EPSG_32631","_WKTgeom1_EPSG_4326","foo","id"', '"POINT (3 4)","POINT (1 2)","bar","1"', '"POINT (3 4)","POINT (1 2)","bar","1"'] for i in range(2): assert lines[i].strip() == expected_lines[i] os.unlink('tmp/test_ogr2ogr_51_src.csv') os.unlink('tmp/test_ogr2ogr_51_dst.csv') ############################################################################### # Test -nlt CONVERT_TO_LINEAR and -nlt CONVERT_TO_CURVE def test_ogr2ogr_52(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_52_src.csv', 'wt') f.write('id,WKT\n') f.write('1,"CIRCULARSTRING(0 0,1 0,0 0)"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f CSV tmp/test_ogr2ogr_52_dst.csv tmp/test_ogr2ogr_52_src.csv -select id -nln test_ogr2ogr_52_dst -dsco GEOMETRY=AS_WKT -nlt CONVERT_TO_LINEAR') f = open('tmp/test_ogr2ogr_52_dst.csv', 'rt') content = f.read() f.close() assert 'LINESTRING (0 0,' in content gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f CSV tmp/test_ogr2ogr_52_dst2.csv tmp/test_ogr2ogr_52_dst.csv -select id -nln test_ogr2ogr_52_dst2 -dsco GEOMETRY=AS_WKT -nlt CONVERT_TO_CURVE') f = open('tmp/test_ogr2ogr_52_dst2.csv', 'rt') content = f.read() f.close() assert 'COMPOUNDCURVE ((0 0,' in content os.unlink('tmp/test_ogr2ogr_52_src.csv') os.unlink('tmp/test_ogr2ogr_52_dst.csv') os.unlink('tmp/test_ogr2ogr_52_dst2.csv') ############################################################################### # Test -mapFieldType and 64 bit integers def test_ogr2ogr_53(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_53.csv', 'wt') f.write('id,i64,b,WKT\n') f.write('1,123456789012,true,"POINT(0 0)"\n') f.close() f = open('tmp/test_ogr2ogr_53.csvt', 'wt') f.write('Integer,Integer64,Integer(Boolean),String\n') f.close() # Default behaviour with a driver that declares GDAL_DMD_CREATIONFIELDDATATYPES gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f KML tmp/test_ogr2ogr_53.kml tmp/test_ogr2ogr_53.csv -mapFieldType "Integer(Boolean)=String"') f = open('tmp/test_ogr2ogr_53.kml', 'rt') content = f.read() f.close() assert ('' in content and \ '1' in content and \ '' in content and \ '123456789012' in content and \ '' in content and \ '1' in content) os.unlink('tmp/test_ogr2ogr_53.kml') # Default behaviour with a driver that does not GDAL_DMD_CREATIONFIELDDATATYPES gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f BNA tmp/test_ogr2ogr_53.bna tmp/test_ogr2ogr_53.csv -nlt POINT') f = open('tmp/test_ogr2ogr_53.bna', 'rt') content = f.read() f.close() assert '"123456789012.0"' in content os.unlink('tmp/test_ogr2ogr_53.bna') # with -mapFieldType gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f KML tmp/test_ogr2ogr_53.kml tmp/test_ogr2ogr_53.csv -mapFieldType Integer64=String') f = open('tmp/test_ogr2ogr_53.kml', 'rt') content = f.read() f.close() assert ('' in content and \ '123456789012' in content) os.unlink('tmp/test_ogr2ogr_53.kml') os.unlink('tmp/test_ogr2ogr_53.csv') os.unlink('tmp/test_ogr2ogr_53.csvt') ############################################################################### # Test behaviour with nullable fields def test_ogr2ogr_54(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_54.csv', 'wt') f.write('fld1,fld2,WKT\n') f.write('1,2,"POINT(0 0)"\n') f.close() f = open('tmp/test_ogr2ogr_54.vrt', 'wt') f.write(""" test_ogr2ogr_54.csv test_ogr2ogr_54 wkbUnknown """) f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/test_ogr2ogr_54.gml tmp/test_ogr2ogr_54.vrt') f = open('tmp/test_ogr2ogr_54.xsd', 'rt') content = f.read() f.close() assert ('' in content and \ '' in content and \ '' in content) os.unlink('tmp/test_ogr2ogr_54.gml') os.unlink('tmp/test_ogr2ogr_54.xsd') # Test -forceNullable gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -forceNullable -f GML tmp/test_ogr2ogr_54.gml tmp/test_ogr2ogr_54.vrt') f = open('tmp/test_ogr2ogr_54.xsd', 'rt') content = f.read() f.close() assert ('' in content and \ '' in content and \ '' in content) os.unlink('tmp/test_ogr2ogr_54.gml') os.unlink('tmp/test_ogr2ogr_54.xsd') os.unlink('tmp/test_ogr2ogr_54.csv') os.unlink('tmp/test_ogr2ogr_54.vrt') ############################################################################### # Test behaviour with default values def test_ogr2ogr_55(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_55.csv', 'wt') f.write('fld1,fld2,WKT\n') f.write('1,,"POINT(0 0)"\n') f.close() f = open('tmp/test_ogr2ogr_55.csvt', 'wt') f.write('Integer,Integer,String\n') f.close() f = open('tmp/test_ogr2ogr_55.vrt', 'wt') f.write(""" test_ogr2ogr_55.csv test_ogr2ogr_55 wkbUnknown """) f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/test_ogr2ogr_55.gml tmp/test_ogr2ogr_55.vrt') f = open('tmp/test_ogr2ogr_55.gml', 'rt') content = f.read() f.close() assert '2' in content os.unlink('tmp/test_ogr2ogr_55.gml') os.unlink('tmp/test_ogr2ogr_55.xsd') # Test -unsetDefault gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -forceNullable -unsetDefault -f GML tmp/test_ogr2ogr_55.gml tmp/test_ogr2ogr_55.vrt') f = open('tmp/test_ogr2ogr_55.gml', 'rt') content = f.read() f.close() assert '' not in content os.unlink('tmp/test_ogr2ogr_55.gml') os.unlink('tmp/test_ogr2ogr_55.xsd') os.unlink('tmp/test_ogr2ogr_55.csv') os.unlink('tmp/test_ogr2ogr_55.csvt') os.unlink('tmp/test_ogr2ogr_55.vrt') ############################################################################### # Test behaviour when creating a field with same name as FID column. def test_ogr2ogr_56(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_56.csv', 'wt') f.write('str,myid,WKT\n') f.write('aaa,10,"POINT(0 0)"\n') f.close() f = open('tmp/test_ogr2ogr_56.csvt', 'wt') f.write('String,Integer,String\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PGDump tmp/test_ogr2ogr_56.sql tmp/test_ogr2ogr_56.csv -lco FID=myid --config PGDUMP_DEBUG_ALLOW_CREATION_FIELD_WITH_FID_NAME NO') f = open('tmp/test_ogr2ogr_56.sql', 'rt') content = f.read() f.close() assert ("""ALTER TABLE "public"."test_ogr2ogr_56" ADD COLUMN "myid"" """ not in content and \ """INSERT INTO "public"."test_ogr2ogr_56" ("wkb_geometry" , "myid" , "str", "wkt") VALUES ('010100000000000000000000000000000000000000', 10, 'aaa', 'POINT(0 0)');""" in content) os.unlink('tmp/test_ogr2ogr_56.sql') os.unlink('tmp/test_ogr2ogr_56.csv') os.unlink('tmp/test_ogr2ogr_56.csvt') ############################################################################### # Test default propagation of FID column name and values, and -unsetFid def test_ogr2ogr_57(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_57.csv', 'wt') f.write('id,str,WKT\n') f.write('10,a,"POINT(0 0)"\n') f.close() f = open('tmp/test_ogr2ogr_57.csvt', 'wt') f.write('Integer,String,String\n') f.close() f = open('tmp/test_ogr2ogr_57.vrt', 'wt') f.write(""" test_ogr2ogr_57.csv test_ogr2ogr_57 wkbUnknown id """) f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PGDump tmp/test_ogr2ogr_57.sql tmp/test_ogr2ogr_57.vrt') f = open('tmp/test_ogr2ogr_57.sql', 'rt') content = f.read() f.close() assert ("""CREATE TABLE "public"."test_ogr2ogr_57" ( "id" SERIAL, CONSTRAINT "test_ogr2ogr_57_pk" PRIMARY KEY ("id") )""" in content and \ """INSERT INTO "public"."test_ogr2ogr_57" ("wkt" , "id" , "str") VALUES ('010100000000000000000000000000000000000000', 10, 'a')""" in content) os.unlink('tmp/test_ogr2ogr_57.sql') # Test -unsetFid gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PGDump tmp/test_ogr2ogr_57.sql tmp/test_ogr2ogr_57.vrt -unsetFid') f = open('tmp/test_ogr2ogr_57.sql', 'rt') content = f.read() f.close() assert ("""CREATE TABLE "public"."test_ogr2ogr_57" ( "ogc_fid" SERIAL, CONSTRAINT "test_ogr2ogr_57_pk" PRIMARY KEY ("ogc_fid") )""" in content and \ """INSERT INTO "public"."test_ogr2ogr_57" ("wkt" , "str") VALUES ('010100000000000000000000000000000000000000', 'a')""" in content) os.unlink('tmp/test_ogr2ogr_57.sql') os.unlink('tmp/test_ogr2ogr_57.csv') os.unlink('tmp/test_ogr2ogr_57.csvt') os.unlink('tmp/test_ogr2ogr_57.vrt') ############################################################################### # Test datasource transactions def test_ogr2ogr_58(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if ogr.GetDriverByName('SQLite') is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -gt 3 -f SQLite tmp/test_ogr2ogr_58.sqlite ../ogr/data/poly.shp') ds = ogr.Open('tmp/test_ogr2ogr_58.sqlite') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 10 ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('tmp/test_ogr2ogr_58.sqlite') ############################################################################### # Test metadata support def test_ogr2ogr_59(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if ogr.GetDriverByName('GPKG') is None: pytest.skip() ds = ogr.GetDriverByName('GPKG').CreateDataSource('tmp/test_ogr2ogr_59_src.gpkg') ds.SetMetadataItem('FOO', 'BAR') ds.SetMetadataItem('BAR', 'BAZ', 'another_domain') lyr = ds.CreateLayer('mylayer') lyr.SetMetadataItem('lyr_FOO', 'lyr_BAR') lyr.SetMetadataItem('lyr_BAR', 'lyr_BAZ', 'lyr_another_domain') ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GPKG tmp/test_ogr2ogr_59_dest.gpkg tmp/test_ogr2ogr_59_src.gpkg -mo BAZ=BAW') ds = ogr.Open('tmp/test_ogr2ogr_59_dest.gpkg') assert ds.GetMetadata() == {'FOO': 'BAR', 'BAZ': 'BAW'} assert ds.GetMetadata('another_domain') == {'BAR': 'BAZ'} lyr = ds.GetLayer(0) assert lyr.GetMetadata() == {'lyr_FOO': 'lyr_BAR'} assert lyr.GetMetadata('lyr_another_domain') == {'lyr_BAR': 'lyr_BAZ'} ds = None ogr.GetDriverByName('GPKG').DeleteDataSource('tmp/test_ogr2ogr_59_dest.gpkg') gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GPKG tmp/test_ogr2ogr_59_dest.gpkg tmp/test_ogr2ogr_59_src.gpkg -nomd') ds = ogr.Open('tmp/test_ogr2ogr_59_dest.gpkg') assert ds.GetMetadata() == {} lyr = ds.GetLayer(0) assert lyr.GetMetadata() == {} ds = None ogr.GetDriverByName('GPKG').DeleteDataSource('tmp/test_ogr2ogr_59_dest.gpkg') ogr.GetDriverByName('GPKG').DeleteDataSource('tmp/test_ogr2ogr_59_src.gpkg') ############################################################################### # Test forced datasource transactions def test_ogr2ogr_60(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if ogr.GetDriverByName('FileGDB') is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -ds_transaction -f FileGDB tmp/test_ogr2ogr_60.gdb ../ogr/data/poly.shp -mapFieldType Integer64=Integer') ds = ogr.Open('tmp/test_ogr2ogr_60.gdb') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 10 ds = None ogr.GetDriverByName('FileGDB').DeleteDataSource('tmp/test_ogr2ogr_60.gdb') ############################################################################### # Test -spat_srs def test_ogr2ogr_61(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/test_ogr2ogr_61.csv', 'wt') f.write('foo,WKT\n') f.write('1,"POINT(2 49)"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_61.shp tmp/test_ogr2ogr_61.csv -spat 426857 5427937 426858 5427938 -spat_srs EPSG:32631 -s_srs EPSG:4326 -a_srs EPSG:4326') ds = ogr.Open('tmp/test_ogr2ogr_61.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 ds.Destroy() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/test_ogr2ogr_61_2.shp tmp/test_ogr2ogr_61.shp -spat 426857 5427937 426858 5427938 -spat_srs EPSG:32631') ds = ogr.Open('tmp/test_ogr2ogr_61_2.shp') assert ds is not None and ds.GetLayer(0).GetFeatureCount() == 1 ds.Destroy() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_61.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_ogr2ogr_61_2.shp') os.unlink('tmp/test_ogr2ogr_61.csv') ############################################################################### # Test -noNativeData def test_ogr2ogr_62(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() # Default behaviour fp = open('tmp/test_ogr2ogr_62_in.json', 'wt') fp.write('{"type": "FeatureCollection", "foo": "bar", "features":[ { "type": "Feature", "bar": "baz", "properties": { "myprop": "myvalue" }, "geometry": null } ]}') fp = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + """ -f GeoJSON tmp/test_ogr2ogr_62.json tmp/test_ogr2ogr_62_in.json""") fp = gdal.VSIFOpenL('tmp/test_ogr2ogr_62.json', 'rb') assert fp is not None data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) os.unlink('tmp/test_ogr2ogr_62.json') assert 'bar' in data and 'baz' in data # Test -noNativeData gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + """ -f GeoJSON tmp/test_ogr2ogr_62.json tmp/test_ogr2ogr_62_in.json -noNativeData""") fp = gdal.VSIFOpenL('tmp/test_ogr2ogr_62.json', 'rb') assert fp is not None data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) os.unlink('tmp/test_ogr2ogr_62.json') os.unlink('tmp/test_ogr2ogr_62_in.json') assert 'bar' not in data and 'baz' not in data ############################################################################### # Test --formats def test_ogr2ogr_63(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/poly.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/poly.shp') except (OSError, AttributeError): pass (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogr2ogr_path() + ' --formats') assert 'Supported Formats' in ret, err assert 'ERROR' not in err, ret ############################################################################### # Test appending multiple layers, whose one already exists (#6345) def test_ogr2ogr_64(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: shutil.rmtree('tmp/in_csv') except OSError: pass try: shutil.rmtree('tmp/out_csv') except OSError: pass os.mkdir('tmp/in_csv') open('tmp/in_csv/lyr1.csv', 'wt').write("id,col\n1,1\n") open('tmp/in_csv/lyr2.csv', 'wt').write("id,col\n1,1\n") ds = ogr.Open('tmp/in_csv') first_layer = ds.GetLayer(0).GetName() second_layer = ds.GetLayer(1).GetName() ds = None gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f CSV tmp/out_csv tmp/in_csv ' + second_layer) gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -append tmp/out_csv tmp/in_csv') ds = ogr.Open('tmp/out_csv') assert ds.GetLayerByName(first_layer).GetFeatureCount() == 1 assert ds.GetLayerByName(second_layer).GetFeatureCount() == 2 ds = None shutil.rmtree('tmp/in_csv') shutil.rmtree('tmp/out_csv') ############################################################################### # Test detection of extension def test_ogr2ogr_65(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/out.csv ../ogr/data/poly.shp') ds = gdal.OpenEx('tmp/out.csv') assert ds.GetDriver().ShortName == 'CSV' ds = None gdal.Unlink('tmp/out.csv') (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogr2ogr_path() + ' /vsimem/out.xxx ../ogr/data/poly.shp') if "Cannot guess" not in err: print(ret) pytest.fail('expected a warning about probably wrong extension') ############################################################################### # Test accidental overriding of dataset when dst and src filenames are the same (#1465) def test_ogr2ogr_66(): if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogr2ogr_path() + ' ../ogr/data/poly.shp ../ogr/data/poly.shp') assert "Source and destination datasets must be different in non-update mode" in err, \ ret def hexify_double(val): val = hex(val) # On 32bit Linux, we might get a trailing L return val.rstrip('L').lstrip('0x').zfill(16).upper() def check_identity_transformation(x, y, srid): import struct if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() shape_drv = ogr.GetDriverByName('ESRI Shapefile') for output_shp in ['tmp/output_point.shp', 'tmp/output_point2.shp']: try: os.stat(output_shp) shape_drv.DeleteDataSource(output_shp) except OSError: pass # Generate CSV file with test point xy_wkb = '0101000000' + ''.join(hexify_double(q) for q in struct.unpack('>QQ', struct.pack(" # ############################################################################### # 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 import shutil from osgeo import gdal import gdaltest import test_cli_utilities import pytest ############################################################################### # Basic test def test_nearblack_1(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_nearblack_path() + ' ../gdrivers/data/rgbsmall.tif -nb 0 -of GTiff -o tmp/nearblack1.tif') assert (err is None or err == ''), 'got error/warning' src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') ds = gdal.Open('tmp/nearblack1.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 21106, 'Bad checksum band 1' assert ds.GetRasterBand(2).Checksum() == 20736, 'Bad checksum band 2' assert ds.GetRasterBand(3).Checksum() == 21309, 'Bad checksum band 3' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' src_ds = None ds = None ############################################################################### # Add alpha band def test_nearblack_2(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' ../gdrivers/data/rgbsmall.tif -setalpha -nb 0 -of GTiff -o tmp/nearblack2.tif -co TILED=YES') ds = gdal.Open('tmp/nearblack2.tif') assert ds is not None assert ds.GetRasterBand(4).Checksum() == 22002, 'Bad checksum band 0' ds = None ############################################################################### # Set existing alpha band def test_nearblack_3(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() shutil.copy('tmp/nearblack2.tif', 'tmp/nearblack3.tif') gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' -setalpha -nb 0 -of GTiff tmp/nearblack3.tif') ds = gdal.Open('tmp/nearblack3.tif') assert ds is not None assert ds.GetRasterBand(4).Checksum() == 22002, 'Bad checksum band 0' ds = None ############################################################################### # Test -white def test_nearblack_4(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -wo "INIT_DEST=255" ../gdrivers/data/rgbsmall.tif tmp/nearblack4_src.tif -srcnodata 0') gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' -q -setalpha -white -nb 0 -of GTiff tmp/nearblack4_src.tif -o tmp/nearblack4.tif') ds = gdal.Open('tmp/nearblack4.tif') assert ds is not None assert ds.GetRasterBand(4).Checksum() == 24151, 'Bad checksum band 0' ds = None ############################################################################### # Add mask band def test_nearblack_5(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' ../gdrivers/data/rgbsmall.tif --config GDAL_TIFF_INTERNAL_MASK NO -setmask -nb 0 -of GTiff -o tmp/nearblack5.tif -co TILED=YES') ds = gdal.Open('tmp/nearblack5.tif') assert ds is not None assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 22002, \ 'Bad checksum mask band' ds = None ############################################################################### # Set existing mask band def test_nearblack_6(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() shutil.copy('tmp/nearblack5.tif', 'tmp/nearblack6.tif') shutil.copy('tmp/nearblack5.tif.msk', 'tmp/nearblack6.tif.msk') gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' -setmask -nb 0 -of GTiff tmp/nearblack6.tif') ds = gdal.Open('tmp/nearblack6.tif') assert ds is not None assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 22002, \ 'Bad checksum mask band' ds = None ############################################################################### # Test -color def test_nearblack_7(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_nearblack_path() + ' data/whiteblackred.tif -o tmp/nearblack7.tif -color 0,0,0 -color 255,255,255 -of GTiff') ds = gdal.Open('tmp/nearblack7.tif') assert ds is not None assert (ds.GetRasterBand(1).Checksum() == 418 and \ ds.GetRasterBand(2).Checksum() == 0 and \ ds.GetRasterBand(3).Checksum() == 0), 'Bad checksum' ds = None ############################################################################### # Test in-place update def test_nearblack_8(): if test_cli_utilities.get_nearblack_path() is None: pytest.skip() src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') gdal.GetDriverByName('GTiff').CreateCopy('tmp/nearblack8.tif', src_ds) src_ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_nearblack_path() + ' tmp/nearblack8.tif -nb 0') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/nearblack8.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 21106, 'Bad checksum band 1' assert ds.GetRasterBand(2).Checksum() == 20736, 'Bad checksum band 2' assert ds.GetRasterBand(3).Checksum() == 21309, 'Bad checksum band 3' ############################################################################### # Cleanup def test_nearblack_cleanup(): try: os.remove('tmp/nearblack1.tif') except OSError: pass try: os.remove('tmp/nearblack2.tif') except OSError: pass try: os.remove('tmp/nearblack3.tif') except OSError: pass try: os.remove('tmp/nearblack4_src.tif') except OSError: pass try: os.remove('tmp/nearblack4.tif') except OSError: pass try: os.remove('tmp/nearblack5.tif') except OSError: pass try: os.remove('tmp/nearblack5.tif.msk') except OSError: pass try: os.remove('tmp/nearblack6.tif') except OSError: pass try: os.remove('tmp/nearblack6.tif.msk') except OSError: pass try: os.remove('tmp/nearblack7.tif') except OSError: pass try: os.remove('tmp/nearblack8.tif') except OSError: pass gdalautotest-3.0.4/utilities/test_gdaldem_lib.py0000755003401500001440000003767713614005323021523 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdaldem_lib.py 4db55e60ad36bf21a576d1179c0f1788d2f8dbf2 2019-03-04 22:16:21 +0100 Martin Ždila $ # # Project: GDAL/OGR Test Suite # Purpose: gdaldem testing # 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 struct from osgeo import gdal from osgeo import osr import gdaltest import pytest ############################################################################### # Test gdaldem hillshade def test_gdaldem_lib_hillshade(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade with source being floating point def test_gdaldem_lib_hillshade_float(): src_ds = gdal.Translate('', gdal.Open('../gdrivers/data/n43.dt0'), format='MEM', outputType=gdal.GDT_Float32) ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade with source being floating point def test_gdaldem_lib_hillshade_float_png(): src_ds = gdal.Translate('', gdal.Open('../gdrivers/data/n43.dt0'), format='MEM', outputType=gdal.GDT_Float32) ds = gdal.DEMProcessing('/vsimem/test_gdaldem_lib_hillshade_float_png.png', src_ds, 'hillshade', format='PNG', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None gdal.GetDriverByName('PNG').Delete('/vsimem/test_gdaldem_lib_hillshade_float_png.png') ############################################################################### # Test gdaldem hillshade -combined def test_gdaldem_lib_hillshade_combined(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', combined=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 43876, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade -alg ZevenbergenThorne def test_gdaldem_lib_hillshade_ZevenbergenThorne(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', alg='ZevenbergenThorne', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 46544, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade -alg ZevenbergenThorne -combined def test_gdaldem_lib_hillshade_ZevenbergenThorne_combined(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', alg='ZevenbergenThorne', combined=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 43112, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade with -compute_edges def test_gdaldem_lib_hillshade_compute_edges(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50239, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade with -compute_edges with floating point def test_gdaldem_lib_hillshade_compute_edges_float(): src_ds = gdal.Translate('', gdal.Open('../gdrivers/data/n43.dt0'), format='MEM', outputType=gdal.GDT_Float32) ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50239, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade with -az parameter def test_gdaldem_lib_hillshade_azimuth(): from sys import version_info src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100, 1) src_ds.SetGeoTransform([2, 0.01, 0, 49, 0, -0.01]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) src_ds.SetProjection(sr.ExportToWkt()) for j in range(100): data = '' for i in range(100): val = 255 - 5 * max(abs(50 - i), abs(50 - j)) data = data + ('%c' % (val)) if version_info >= (3, 0, 0): data = bytes(data, 'ISO-8859-1') src_ds.GetRasterBand(1).WriteRaster(0, j, 100, 1, data) # Light from the east ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', azimuth=90, scale=111120, zFactor=100) assert ds is not None ds_ref = gdal.Open('data/pyramid_shaded_ref.tif') assert gdaltest.compare_ds(ds, ds_ref, verbose=1) <= 1, 'Bad checksum' ds = None ds_ref = None ############################################################################### # Test gdaldem hillshade -multidirectional def test_gdaldem_lib_hillshade_multidirectional(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', multiDirectional=True, computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 51784, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade -multidirectional def test_gdaldem_lib_hillshade_multidirectional_ZevenbergenThorne(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', alg='ZevenbergenThorne', multiDirectional=True, computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50860, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade -igor def test_gdaldem_lib_hillshade_igor(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', igor=True, computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 48830, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade -igor def test_gdaldem_lib_hillshade_igor_ZevenbergenThorne(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', alg='ZevenbergenThorne', igor=True, computeEdges=True, scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 49014, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief def test_gdaldem_lib_color_relief(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'color-relief', format='MEM', colorFilename='data/color_file.txt') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' ds = gdal.DEMProcessing('', src_ds, 'color-relief', format='MEM', colorFilename='data/color_file.txt', addAlpha=True) assert ds.RasterCount == 4, 'Bad RasterCount' src_ds = None ds = None ############################################################################### # Test gdaldem tpi def test_gdaldem_lib_tpi(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'tpi', format='MEM') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 60504, 'Bad checksum' ds = None ############################################################################### # Test gdaldem tri def test_gdaldem_lib_tri(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'tri', format='MEM') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 61143, 'Bad checksum' ds = None ############################################################################### # Test gdaldem roughness def test_gdaldem_lib_roughness(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'roughness', format='MEM') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 38624, 'Bad checksum' ds = None ############################################################################### # Test gdaldem slope -alg ZevenbergenThorne def test_gdaldem_lib_slope_ZevenbergenThorne(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'slope', format='MEM', alg='ZevenbergenThorne', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 64393, 'Bad checksum' ############################################################################### # Test gdaldem aspect -alg ZevenbergenThorne def test_gdaldem_lib_aspect_ZevenbergenThorne(): src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.DEMProcessing('', src_ds, 'aspect', format='MEM', alg='ZevenbergenThorne', scale=111120, zFactor=30) assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50539, 'Bad checksum' ############################################################################### # Test gdaldem hillshade with nodata values def test_gdaldem_lib_nodata(): for (value, typ) in [(0, gdal.GDT_Byte), (1, gdal.GDT_Byte), (255, gdal.GDT_Byte), (0, gdal.GDT_UInt16), (1, gdal.GDT_UInt16), (65535, gdal.GDT_UInt16), (0, gdal.GDT_Int16), (-32678, gdal.GDT_Int16), (32767, gdal.GDT_Int16)]: src_ds = gdal.GetDriverByName('MEM').Create('', 10, 10, 1, typ) src_ds.GetRasterBand(1).SetNoDataValue(value) src_ds.GetRasterBand(1).Fill(value) ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 0, 'Bad checksum' src_ds = None ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 3, 3, 1) src_ds.GetRasterBand(1).SetNoDataValue(0) src_ds.GetRasterBand(1).WriteRaster(1, 1, 1, 1, struct.pack('B', 255)) ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM') cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(ds.ReadAsArray()) pytest.fail('Bad checksum') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', computeEdges=True) cs = ds.GetRasterBand(1).Checksum() if cs != 10: print(ds.ReadAsArray()) # Should be 0 0 0 0 181 0 0 0 0 pytest.fail('Bad checksum') # Same with floating point src_ds = gdal.GetDriverByName('MEM').Create('', 3, 3, 1, gdal.GDT_Float32) src_ds.GetRasterBand(1).SetNoDataValue(0) src_ds.GetRasterBand(1).WriteRaster(1, 1, 1, 1, struct.pack('f', 255)) ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM') cs = ds.GetRasterBand(1).Checksum() if cs != 0: print(ds.ReadAsArray()) pytest.fail('Bad checksum') ds = gdal.DEMProcessing('', src_ds, 'hillshade', format='MEM', computeEdges=True) cs = ds.GetRasterBand(1).Checksum() if cs != 10: print(ds.ReadAsArray()) # Should be 0 0 0 0 181 0 0 0 0 pytest.fail('Bad checksum') gdalautotest-3.0.4/utilities/test_gdal_rasterize.py0000755003401500001440000003304713614005323022262 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_rasterize.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_rasterize testing # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-2013, Even Rouault # 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 sys import os import pytest sys.path.append('../gcore') from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import test_cli_utilities ############################################################################### # Simple polygon rasterization (adapted from alg/rasterize.py). def test_gdal_rasterize_1(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() # Setup working spatial reference # sr_wkt = 'LOCAL_CS["arbitrary"]' # sr = osr.SpatialReference( sr_wkt ) sr = osr.SpatialReference() sr.ImportFromEPSG(32631) sr_wkt = sr.ExportToWkt() # Create a raster to rasterize into. target_ds = gdal.GetDriverByName('GTiff').Create('tmp/rast1.tif', 100, 100, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((1000, 1, 0, 1100, 0, -1)) target_ds.SetProjection(sr_wkt) # Close TIF file target_ds = None # Create a layer to rasterize from. rast_ogr_ds = \ ogr.GetDriverByName('MapInfo File').CreateDataSource('tmp/rast1.tab') rast_lyr = rast_ogr_ds.CreateLayer('rast1', srs=sr) rast_lyr.GetLayerDefn() field_defn = ogr.FieldDefn('foo') rast_lyr.CreateField(field_defn) # Add a polygon. wkt_geom = 'POLYGON((1020 1030,1020 1045,1050 1045,1050 1030,1020 1030))' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) # Add feature without geometry to test fix for #3310 feat = ogr.Feature(rast_lyr.GetLayerDefn()) rast_lyr.CreateFeature(feat) # Add a linestring. wkt_geom = 'LINESTRING(1000 1000, 1100 1050)' feat = ogr.Feature(rast_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=wkt_geom)) rast_lyr.CreateFeature(feat) # Close file rast_ogr_ds.Destroy() # Run the algorithm. (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdal_rasterize_path() + ' -b 3 -b 2 -b 1 -burn 200 -burn 220 -burn 240 -l rast1 tmp/rast1.tab tmp/rast1.tif') assert (err is None or err == ''), 'got error/warning' # Check results. target_ds = gdal.Open('tmp/rast1.tif') expected = 6452 checksum = target_ds.GetRasterBand(2).Checksum() assert checksum == expected, 'Did not get expected image checksum' target_ds = None ############################################################################### # Test rasterization with ALL_TOUCHED (adapted from alg/rasterize.py). def test_gdal_rasterize_2(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() # Create a raster to rasterize into. target_ds = gdal.GetDriverByName('GTiff').Create('tmp/rast2.tif', 12, 12, 3, gdal.GDT_Byte) target_ds.SetGeoTransform((0, 1, 0, 12, 0, -1)) # Close TIF file target_ds = None # Run the algorithm. gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' -at -b 3 -b 2 -b 1 -burn 200 -burn 220 -burn 240 -l cutline ../alg/data/cutline.csv tmp/rast2.tif') # Check results. target_ds = gdal.Open('tmp/rast2.tif') expected = 121 checksum = target_ds.GetRasterBand(2).Checksum() assert checksum == expected, 'Did not get expected image checksum' target_ds = None ############################################################################### # Test creating an output file def test_gdal_rasterize_3(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_contour_path() + ' ../gdrivers/data/n43.dt0 tmp/n43dt0.shp -i 10 -3d') gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' -3d tmp/n43dt0.shp tmp/n43dt0.tif -l n43dt0 -ts 121 121 -a_nodata 0 -q') ds_ref = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43dt0.tif') assert ds.GetRasterBand(1).GetNoDataValue() == 0.0, \ 'did not get expected nodata value' assert ds.RasterXSize == 121 and ds.RasterYSize == 121, \ 'did not get expected dimensions' gt_ref = ds_ref.GetGeoTransform() gt = ds.GetGeoTransform() for i in range(6): assert abs(gt[i] - gt_ref[i]) <= 1e-6, 'did not get expected geotransform' wkt = ds.GetProjectionRef() assert wkt.find("WGS_1984") != -1, 'did not get expected SRS' ############################################################################### # Same but with -tr argument def test_gdal_rasterize_4(): if test_cli_utilities.get_gdal_contour_path() is None: pytest.skip() if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() gdal.GetDriverByName('GTiff').Delete('tmp/n43dt0.tif') gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' -3d tmp/n43dt0.shp tmp/n43dt0.tif -l n43dt0 -tr 0.008333333333333 0.008333333333333 -a_nodata 0 -a_srs EPSG:4326') ds_ref = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43dt0.tif') assert ds.GetRasterBand(1).GetNoDataValue() == 0.0, \ 'did not get expected nodata value' # Allow output to grow by 1/2 cell, as per #6058 assert ds.RasterXSize == 122 and ds.RasterYSize == 122, \ 'did not get expected dimensions' gt_ref = ds_ref.GetGeoTransform() gt = ds.GetGeoTransform() assert abs(gt[1] - gt_ref[1]) <= 1e-6 and abs(gt[5] - gt_ref[5]) <= 1e-6, \ 'did not get expected geotransform(dx/dy)' # Allow output to grow by 1/2 cell, as per #6058 assert (abs(gt[0] + (gt[1] / 2) - gt_ref[0]) <= 1e-6 and \ abs(gt[3] + (gt[5] / 2) - gt_ref[3]) <= 1e-6), \ 'did not get expected geotransform' wkt = ds.GetProjectionRef() assert wkt.find("WGS_1984") != -1, 'did not get expected SRS' ############################################################################### # Test point rasterization (#3774) def test_gdal_rasterize_5(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() f = open('tmp/test_gdal_rasterize_5.csv', 'wb') f.write("""x,y,Value 0.5,0.5,1 0.5,2.5,2 2.5,2.5,3 2.5,0.5,4 1.5,1.5,5""".encode('ascii')) f.close() f = open('tmp/test_gdal_rasterize_5.vrt', 'wb') f.write(""" test_gdal_rasterize_5.csv test_gdal_rasterize_5 wkbPoint """.encode('ascii')) f.close() gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' -l test tmp/test_gdal_rasterize_5.vrt tmp/test_gdal_rasterize_5.tif -a Value -tr 1 1 -ot Byte') ds = gdal.Open('tmp/test_gdal_rasterize_5.tif') assert ds.RasterXSize == 3 and ds.RasterYSize == 3, \ 'did not get expected dimensions' gt_ref = [0, 1, 0, 3, 0, -1] gt = ds.GetGeoTransform() for i in range(6): assert abs(gt[i] - gt_ref[i]) <= 1e-6, 'did not get expected geotransform' data = ds.GetRasterBand(1).ReadRaster(0, 0, 3, 3) assert data.decode('iso-8859-1') == '\x02\x00\x03\x00\x05\x00\x01\x00\x04', \ 'did not get expected values' ds = None ############################################################################### # Test on the fly reprojection of input data def test_gdal_rasterize_6(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() f = open('tmp/test_gdal_rasterize_6.csv', 'wb') f.write("""WKT,Value "POLYGON((2 49,2 50,3 50,3 49,2 49))",255 """.encode('ascii')) f.close() f = open('tmp/test_gdal_rasterize_6.prj', 'wb') f.write("""EPSG:4326""".encode('ascii')) f.close() ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdal_rasterize_6.tif', 100, 100) ds.SetGeoTransform([200000, (400000 - 200000) / 100, 0, 6500000, 0, -(6500000 - 6200000) / 100]) sr = osr.SpatialReference() sr.ImportFromEPSG(3857) ds.SetProjection(sr.ExportToWkt()) ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' -l test_gdal_rasterize_6 tmp/test_gdal_rasterize_6.csv tmp/test_gdal_rasterize_6.tif -a Value') ds = gdal.Open('tmp/test_gdal_rasterize_6.tif') assert ds.GetRasterBand(1).Checksum() == 39190, 'did not get expected checksum' ds = None ############################################################################### # Test SQLITE dialect in SQL def test_gdal_rasterize_7(): try: from osgeo import gdalnumeric gdalnumeric.zeros except (ImportError, AttributeError): pytest.skip() if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() drv = ogr.GetDriverByName('SQLite') if drv is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = drv.CreateDataSource('/vsimem/foo.db', options=['SPATIALITE=YES']) if ds is None: pytest.skip() ds = None gdal.Unlink('/vsimem/foo.db') gdal.PopErrorHandler() f = open('tmp/test_gdal_rasterize_7.csv', 'wb') x = (0, 0, 50, 50, 25) y = (0, 50, 0, 50, 25) f.write('WKT,Value\n'.encode('ascii')) for i, xi in enumerate(x): r = 'POINT(%d %d),1\n' % (xi, y[i]) f.write(r.encode('ascii')) f.close() cmds = '''tmp/test_gdal_rasterize_7.csv tmp/test_gdal_rasterize_7.tif -init 0 -burn 1 -sql "SELECT ST_Buffer(GEOMETRY, 2) FROM test_gdal_rasterize_7" -dialect sqlite -tr 1 1 -te -1 -1 51 51''' gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' ' + cmds) ds = gdal.Open('tmp/test_gdal_rasterize_7.tif') data = ds.GetRasterBand(1).ReadAsArray() assert data.sum() > 5, 'Only rasterized 5 pixels or less.' ds = None ############################################################################### # Make sure we create output that encompasses all the input points on a point # layer, #6058. def test_gdal_rasterize_8(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() f = open('tmp/test_gdal_rasterize_8.csv', 'wb') f.write('WKT,Value\n'.encode('ascii')) f.write('"LINESTRING (0 0, 5 5, 10 0, 10 10)",1'.encode('ascii')) f.close() cmds = '''tmp/test_gdal_rasterize_8.csv tmp/test_gdal_rasterize_8.tif -init 0 -burn 1 -tr 1 1''' gdaltest.runexternal(test_cli_utilities.get_gdal_rasterize_path() + ' ' + cmds) ds = gdal.Open('tmp/test_gdal_rasterize_8.tif') cs = ds.GetRasterBand(1).Checksum() assert cs == 21, 'Did not rasterize line data properly' ds = None ########################################### def test_gdal_rasterize_cleanup(): if test_cli_utilities.get_gdal_rasterize_path() is None: pytest.skip() gdal.GetDriverByName('GTiff').Delete('tmp/rast1.tif') ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/rast1.tab') gdal.GetDriverByName('GTiff').Delete('tmp/rast2.tif') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/n43dt0.shp') gdal.GetDriverByName('GTiff').Delete('tmp/n43dt0.tif') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_rasterize_5.tif') os.unlink('tmp/test_gdal_rasterize_5.csv') os.unlink('tmp/test_gdal_rasterize_5.vrt') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_rasterize_6.tif') os.unlink('tmp/test_gdal_rasterize_6.csv') os.unlink('tmp/test_gdal_rasterize_6.prj') if os.path.exists('tmp/test_gdal_rasterize_7.tif'): gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_rasterize_7.tif') if os.path.exists('tmp/test_gdal_rasterize_7.csv'): os.unlink('tmp/test_gdal_rasterize_7.csv') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdal_rasterize_8.tif') os.unlink('tmp/test_gdal_rasterize_8.csv') gdalautotest-3.0.4/utilities/test_gdaldem.py0000755003401500001440000005221713614005323020660 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdaldem.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdaldem testing # 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 osr import gdaltest import test_cli_utilities import pytest ############################################################################### # Test gdaldem hillshade def test_gdaldem_hillshade(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaldem_path() + ' hillshade -s 111120 -z 30 ../gdrivers/data/n43.dt0 tmp/n43_hillshade.tif') assert (err is None or err == ''), 'got error/warning' src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_hillshade.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade def test_gdaldem_hillshade_compressed_tiled_output(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaldem_path() + ' hillshade -s 111120 -z 30 ../gdrivers/data/n43.dt0 tmp/n43_hillshade_compressed_tiled.tif -co TILED=YES -co COMPRESS=DEFLATE --config GDAL_CACHEMAX 0') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/n43_hillshade_compressed_tiled.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' ds = None stat_uncompressed = os.stat('tmp/n43_hillshade.tif') stat_compressed = os.stat('tmp/n43_hillshade_compressed_tiled.tif') assert stat_uncompressed.st_size >= stat_compressed.st_size, \ 'failure: compressed size greater than uncompressed one' ############################################################################### # Test gdaldem hillshade -combined def test_gdaldem_hillshade_combined(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' hillshade -s 111120 -z 30 -combined ../gdrivers/data/n43.dt0 tmp/n43_hillshade_combined.tif') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_hillshade_combined.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 43876, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == 0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem hillshade with -compute_edges def test_gdaldem_hillshade_compute_edges(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' hillshade -compute_edges -s 111120 -z 30 ../gdrivers/data/n43.dt0 tmp/n43_hillshade_compute_edges.tif') ds = gdal.Open('tmp/n43_hillshade_compute_edges.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50239, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade with -az parameter def test_gdaldem_hillshade_azimuth(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() from sys import version_info ds = gdal.GetDriverByName('GTiff').Create('tmp/pyramid.tif', 100, 100, 1) ds.SetGeoTransform([2, 0.01, 0, 49, 0, -0.01]) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.SetProjection(sr.ExportToWkt()) for j in range(100): data = '' for i in range(100): val = 255 - 5 * max(abs(50 - i), abs(50 - j)) data = data + ('%c' % (val)) if version_info >= (3, 0, 0): data = bytes(data, 'ISO-8859-1') ds.GetRasterBand(1).WriteRaster(0, j, 100, 1, data) ds = None # Light from the east gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' hillshade -s 111120 -z 100 -az 90 -co COMPRESS=LZW tmp/pyramid.tif tmp/pyramid_shaded.tif') ds_ref = gdal.Open('data/pyramid_shaded_ref.tif') ds = gdal.Open('tmp/pyramid_shaded.tif') assert gdaltest.compare_ds(ds, ds_ref, verbose=1) <= 1, 'Bad checksum' ds = None ds_ref = None ############################################################################### # Test gdaldem hillshade to PNG def test_gdaldem_hillshade_png(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' hillshade -of PNG -s 111120 -z 30 ../gdrivers/data/n43.dt0 tmp/n43_hillshade.png') ds = gdal.Open('tmp/n43_hillshade.png') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 45587, 'Bad checksum' ds = None ############################################################################### # Test gdaldem hillshade to PNG with -compute_edges def test_gdaldem_hillshade_png_compute_edges(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' hillshade -compute_edges -of PNG -s 111120 -z 30 ../gdrivers/data/n43.dt0 tmp/n43_hillshade_compute_edges.png') ds = gdal.Open('tmp/n43_hillshade_compute_edges.png') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 50239, 'Bad checksum' ds = None ############################################################################### # Test gdaldem slope def test_gdaldem_slope(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' slope -s 111120 ../gdrivers/data/n43.dt0 tmp/n43_slope.tif') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_slope.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 63748, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == -9999.0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem aspect def test_gdaldem_aspect(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' aspect ../gdrivers/data/n43.dt0 tmp/n43_aspect.tif') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_aspect.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 54885, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' assert ds.GetRasterBand(1).GetNoDataValue() == -9999.0, 'Bad nodata value' src_ds = None ds = None ############################################################################### # Test gdaldem color relief def test_gdaldem_color_relief(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief ../gdrivers/data/n43.dt0 data/color_file.txt tmp/n43_colorrelief.tif') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_colorrelief.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' src_ds = None ds = None ############################################################################### # Test gdaldem color relief on a GMT .cpt file def test_gdaldem_color_relief_cpt(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief ../gdrivers/data/n43.dt0 data/color_file.cpt tmp/n43_colorrelief_cpt.tif') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_colorrelief_cpt.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' src_ds = None ds = None ############################################################################### # Test gdaldem color relief to VRT def test_gdaldem_color_relief_vrt(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief -of VRT ../gdrivers/data/n43.dt0 data/color_file.txt tmp/n43_colorrelief.vrt') src_ds = gdal.Open('../gdrivers/data/n43.dt0') ds = gdal.Open('tmp/n43_colorrelief.vrt') assert ds is not None ds_ref = gdal.Open('tmp/n43_colorrelief.tif') assert gdaltest.compare_ds(ds, ds_ref, verbose=0) <= 1, 'Bad checksum' ds_ref = None src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' src_ds = None ds = None ############################################################################### # Test gdaldem color relief from a Float32 dataset def test_gdaldem_color_relief_from_float32(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -ot Float32 ../gdrivers/data/n43.dt0 tmp/n43_float32.tif') gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief tmp/n43_float32.tif data/color_file.txt tmp/n43_colorrelief_from_float32.tif') ds = gdal.Open('tmp/n43_colorrelief_from_float32.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief to PNG def test_gdaldem_color_relief_png(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief -of PNG ../gdrivers/data/n43.dt0 data/color_file.txt tmp/n43_colorrelief.png') ds = gdal.Open('tmp/n43_colorrelief.png') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief from a Float32 to PNG def test_gdaldem_color_relief_from_float32_to_png(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief -of PNG tmp/n43_float32.tif data/color_file.txt tmp/n43_colorrelief_from_float32.png') ds = gdal.Open('tmp/n43_colorrelief_from_float32.png') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 55009, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 37543, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47711, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief with -nearest_color_entry def test_gdaldem_color_relief_nearest_color_entry(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief -nearest_color_entry ../gdrivers/data/n43.dt0 data/color_file.txt tmp/n43_colorrelief_nearest.tif') ds = gdal.Open('tmp/n43_colorrelief_nearest.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 57296, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 42926, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47181, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief with -nearest_color_entry and -of VRT def test_gdaldem_color_relief_nearest_color_entry_vrt(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief -of VRT -nearest_color_entry ../gdrivers/data/n43.dt0 data/color_file.txt tmp/n43_colorrelief_nearest.vrt') ds = gdal.Open('tmp/n43_colorrelief_nearest.vrt') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 57296, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 42926, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 47181, 'Bad checksum' ds = None ############################################################################### # Test gdaldem color relief with a nan nodata def test_gdaldem_color_relief_nodata_nan(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() f = open('tmp/nodata_nan_src.asc', 'wt') f.write("""ncols 2 nrows 2 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value nan 0.0 0 0 nan""") f.close() f = open('tmp/nodata_nan_plt.txt', 'wt') f.write('0 0 0 0\n') f.write('nv 1 1 1\n') f.close() gdaltest.runexternal(test_cli_utilities.get_gdaldem_path() + ' color-relief tmp/nodata_nan_src.asc tmp/nodata_nan_plt.txt tmp/nodata_nan_out.tif') ds = gdal.Open('tmp/nodata_nan_out.tif') val = ds.GetRasterBand(1).ReadRaster() ds = None import struct val = struct.unpack('B' * 4, val) assert val == (0, 0, 0, 1) os.unlink('tmp/nodata_nan_src.asc') os.unlink('tmp/nodata_nan_plt.txt') os.unlink('tmp/nodata_nan_out.tif') ############################################################################### # Test gdaldem color relief with entries with repeated DEM values in the color table (#6422) def test_gdaldem_color_relief_repeated_entry(): if test_cli_utilities.get_gdaldem_path() is None: pytest.skip() f = open('tmp/test_gdaldem_color_relief_repeated_entry.asc', 'wt') f.write("""ncols 2 nrows 3 xllcorner 440720 yllcorner 3750120 cellsize 60 NODATA_value 5 1 4.9 5 5.1 6 7 """) f.close() f = open('tmp/test_gdaldem_color_relief_repeated_entry.txt', 'wt') f.write('1 1 1 1\n') f.write('6 10 10 10\n') f.write('6 20 20 20\n') f.write('8 30 30 30\n') f.write('nv 5 5 5\n') f.close() gdaltest.runexternal( test_cli_utilities.get_gdaldem_path() + ' color-relief tmp/test_gdaldem_color_relief_repeated_entry.asc tmp/test_gdaldem_color_relief_repeated_entry.txt tmp/test_gdaldem_color_relief_repeated_entry_out.tif', display_live_on_parent_stdout=True, ) ds = gdal.Open('tmp/test_gdaldem_color_relief_repeated_entry_out.tif') val = ds.GetRasterBand(1).ReadRaster() ds = None import struct val = struct.unpack('B' * 6, val) assert val == (1, 1, 5, 10, 10, 25) gdaltest.runexternal( test_cli_utilities.get_gdaldem_path() + ' color-relief tmp/test_gdaldem_color_relief_repeated_entry.asc tmp/test_gdaldem_color_relief_repeated_entry.txt tmp/test_gdaldem_color_relief_repeated_entry_out.vrt -of VRT', display_live_on_parent_stdout=True, ) ds = gdal.Open('tmp/test_gdaldem_color_relief_repeated_entry_out.vrt') val = ds.GetRasterBand(1).ReadRaster() ds = None val = struct.unpack('B' * 6, val) assert val == (1, 1, 5, 10, 10, 25) os.unlink('tmp/test_gdaldem_color_relief_repeated_entry.asc') os.unlink('tmp/test_gdaldem_color_relief_repeated_entry.txt') os.unlink('tmp/test_gdaldem_color_relief_repeated_entry_out.tif') os.unlink('tmp/test_gdaldem_color_relief_repeated_entry_out.vrt') ############################################################################### # Cleanup def test_gdaldem_cleanup(): try: os.remove('tmp/n43_hillshade.tif') except OSError: pass try: os.remove('tmp/n43_hillshade_compressed_tiled.tif') except OSError: pass try: os.remove('tmp/n43_hillshade_combined.tif') except OSError: pass try: os.remove('tmp/n43_hillshade_compute_edges.tif') except OSError: pass try: os.remove('tmp/pyramid.tif') os.remove('tmp/pyramid_shaded.tif') except OSError: pass try: os.remove('tmp/n43_hillshade.png') os.remove('tmp/n43_hillshade.png.aux.xml') except OSError: pass try: os.remove('tmp/n43_hillshade_compute_edges.png') os.remove('tmp/n43_hillshade_compute_edges.png.aux.xml') except OSError: pass try: os.remove('tmp/n43_slope.tif') except OSError: pass try: os.remove('tmp/n43_aspect.tif') except OSError: pass try: os.remove('tmp/n43_colorrelief.tif') except OSError: pass try: os.remove('tmp/n43_colorrelief_cpt.tif') except OSError: pass try: os.remove('tmp/n43_colorrelief.vrt') except OSError: pass try: os.remove('tmp/n43_float32.tif') os.remove('tmp/n43_colorrelief_from_float32.tif') except OSError: pass try: os.remove('tmp/n43_colorrelief.png') os.remove('tmp/n43_colorrelief.png.aux.xml') except OSError: pass try: os.remove('tmp/n43_colorrelief_from_float32.png') os.remove('tmp/n43_colorrelief_from_float32.png.aux.xml') except OSError: pass try: os.remove('tmp/n43_colorrelief_nearest.tif') except OSError: pass try: os.remove('tmp/n43_colorrelief_nearest.vrt') except OSError: pass gdalautotest-3.0.4/utilities/test_gnmutils.py0000755003401500001440000001331013614005323021114 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gnmutils.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic GNMGdalNetwork class functionality. # Authors: Mikhail Gusev (gusevmihs at gmail dot com) # Dmitry Baryshnikov, polimax@mail.ru # ############################################################################### # Copyright (c) 2014, Mikhail Gusev # Copyright (c) 2014-2015, 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 os import gdaltest import test_cli_utilities import pytest ############################################################################### # Test create # gnmmanage create -f GNMFile -t_srs EPSG:4326 -dsco net_name=test_gnm -dsco net_description="Test file based GNM" /home/bishop/tmp/ --config CPL_DEBUG ON def test_gnmmanage_1(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gnmmanage_path() + ' create -f GNMFile -t_srs EPSG:4326 -dsco net_name=test_gnm -dsco net_description="Test file based GNM" tmp') assert (err is None or err == ''), 'got error/warning' try: os.stat('tmp/test_gnm') except OSError: pytest.fail('Expected create tmp/test_gnm') ############################################################################### # Test import # gnmmanage import /home/bishop/tmp/data/pipes.shp /home/bishop/tmp/test_gnm --config CPL_DEBUG ON # gnmmanage import /home/bishop/tmp/data/wells.shp /home/bishop/tmp/test_gnm --config CPL_DEBUG ON def test_gnmmanage_2(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gnmmanage_path() + ' import ../gnm/data/pipes.shp tmp/test_gnm') assert (err is None or err == ''), 'got error/warning' (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gnmmanage_path() + ' import ../gnm/data/wells.shp tmp/test_gnm') assert (err is None or err == ''), 'got error/warning' ############################################################################### # Test info # gnmmanage info /home/bishop/tmp/test_gnm def test_gnmmanage_3(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gnmmanage_path() + ' info tmp/test_gnm') assert ret.find('Network version: 1.0.') != -1 assert ret.find('Network name: test_gnm.') != -1 assert ret.find('Network description') != -1 ############################################################################### # Test autoconect # gnmmanage autoconnect 0.000001 /home/bishop/tmp/test_gnm --config CPL_DEBUG ON def test_gnmmanage_4(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gnmmanage_path() + ' autoconnect 0.000001 tmp/test_gnm') assert ret.find('success') != -1 ############################################################################### # Test dijkstra # gnmanalyse dijkstra 61 50 -alo "fetch_vertex=OFF" -ds /home/bishop/tmp/di.shp -lco "SHPT=ARC" /home/bishop/tmp/test_gnm --config CPL_DEBUG ON def test_gnmanalyse_1(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() if test_cli_utilities.get_gnmanalyse_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gnmanalyse_path() + ' dijkstra 61 50 tmp/test_gnm') assert ret.find('Feature Count: 19') != -1 ############################################################################### # Test kpaths # gnmanalyse kpaths 61 50 3 -alo "fetch_vertex=OFF" -ds /home/bishop/tmp/kp.shp -lco "SHPT=ARC" /home/bishop/tmp/test_gnm --config CPL_DEBUG ON def test_gnmanalyse_2(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() if test_cli_utilities.get_gnmanalyse_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gnmanalyse_path() + ' kpaths 61 50 3 tmp/test_gnm') assert ret.find('Feature Count: 61') != -1 ############################################################################### # Test cleanup def test_gnm_cleanup(): if test_cli_utilities.get_gnmmanage_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gnmmanage_path() + ' delete tmp/test_gnm') assert (err is None or err == ''), 'got error/warning' assert not os.path.exists('tmp/test_gnm') gdalautotest-3.0.4/utilities/test_gdalbuildvrt.py0000755003401500001440000004735213614005323021752 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalbuildvrt.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdalbuildvrt testing # 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 ogr from osgeo import osr import gdaltest import test_cli_utilities import pytest ############################################################################### def gdalbuildvrt_check(): ds = gdal.Open('tmp/mosaic.vrt') try: assert ds.GetProjectionRef().find('WGS 84') != -1, \ ('Expected WGS 84\nGot : %s' % (ds.GetProjectionRef())) gt = ds.GetGeoTransform() expected_gt = [2, 0.1, 0, 49, 0, -0.1] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 20 and ds.RasterYSize == 20, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) assert ds.RasterCount == 1, ('Wrong raster count : %d ' % (ds.RasterCount)) assert ds.GetRasterBand(1).Checksum() == 3508, 'Wrong checksum' finally: del ds ############################################################################### # Simple test def test_gdalbuildvrt_1(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() ds = drv.Create('tmp/gdalbuildvrt1.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).Fill(0) ds = None ds = drv.Create('tmp/gdalbuildvrt2.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([3, 0.1, 0, 49, 0, -0.1]) ds.GetRasterBand(1).Fill(63) ds = None ds = drv.Create('tmp/gdalbuildvrt3.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([2, 0.1, 0, 48, 0, -0.1]) ds.GetRasterBand(1).Fill(127) ds = None ds = drv.Create('tmp/gdalbuildvrt4.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([3, 0.1, 0, 48, 0, -0.1]) ds.GetRasterBand(1).Fill(255) ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/mosaic.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif') assert (err is None or err == ''), 'got error/warning' return gdalbuildvrt_check() ############################################################################### # Test with tile index def test_gdalbuildvrt_2(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() try: os.remove('tmp/tileindex.shp') except OSError: pass try: os.remove('tmp/tileindex.dbf') except OSError: pass try: os.remove('tmp/tileindex.shx') except OSError: pass try: os.remove('tmp/mosaic.vrt') except OSError: pass gdaltest.runexternal(test_cli_utilities.get_gdaltindex_path() + ' tmp/tileindex.shp tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif') gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/mosaic.vrt tmp/tileindex.shp') return gdalbuildvrt_check() ############################################################################### # Test with file list def test_gdalbuildvrt_3(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() open('tmp/filelist.txt', 'wt').write('tmp/gdalbuildvrt1.tif\ntmp/gdalbuildvrt2.tif\ntmp/gdalbuildvrt3.tif\ntmp/gdalbuildvrt4.tif') gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -input_file_list tmp/filelist.txt tmp/mosaic.vrt') return gdalbuildvrt_check() ############################################################################### # Try adding a raster in another projection def test_gdalbuildvrt_4(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') wkt = """GEOGCS["WGS 72", DATUM["WGS_1972", SPHEROID["WGS 72",6378135,298.26], TOWGS84[0,0,4.5,0,0,0.554,0.2263]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" ds = drv.Create('tmp/gdalbuildvrt5.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([47, 0.1, 0, 2, 0, -0.1]) ds = None gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/mosaic.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif tmp/gdalbuildvrt5.tif') return gdalbuildvrt_check() ############################################################################### # Try adding a raster with different band count # NOTE: fails. commented out originally in 4ef886421c99a4451f8873cb6e094d45ecc86d3f, not sure why @pytest.mark.skip() def test_gdalbuildvrt_5(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') wkt = srs.ExportToWkt() ds = drv.Create('tmp/gdalbuildvrt5.tif', 10, 10, 2) ds.SetProjection(wkt) ds.SetGeoTransform([47, 0.1, 0, 2, 0, -0.1]) ds = None gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/mosaic.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif tmp/gdalbuildvrt5.tif') return gdalbuildvrt_check() ############################################################################### # Test -separate option def test_gdalbuildvrt_6(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -separate tmp/stacked.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif') ds = gdal.Open('tmp/stacked.vrt') assert ds.GetProjectionRef().find('WGS 84') != -1, \ ('Expected WGS 84\nGot : %s' % (ds.GetProjectionRef())) gt = ds.GetGeoTransform() expected_gt = [2, 0.1, 0, 49, 0, -0.1] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 20 and ds.RasterYSize == 20, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) assert ds.RasterCount == 4, ('Wrong raster count : %d ' % (ds.RasterCount)) assert ds.GetRasterBand(1).Checksum() == 0, 'Wrong checksum' ############################################################################### # Test source rasters with nodata def test_gdalbuildvrt_7(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() out_ds = gdal.GetDriverByName('GTiff').Create('tmp/vrtnull1.tif', 20, 10, 3, gdal.GDT_UInt16) out_ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') out_ds.SetProjection(srs.ExportToWkt()) out_ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_RedBand) out_ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) out_ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_BlueBand) out_ds.GetRasterBand(1).SetNoDataValue(256) try: ff = '\xff'.encode('latin1') except UnicodeDecodeError: ff = '\xff' out_ds.GetRasterBand(1).WriteRaster(0, 0, 10, 10, ff, buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds.GetRasterBand(2).WriteRaster(0, 0, 10, 10, '\x00', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds.GetRasterBand(3).WriteRaster(0, 0, 10, 10, '\x00', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds = None out_ds = gdal.GetDriverByName('GTiff').Create('tmp/vrtnull2.tif', 20, 10, 3, gdal.GDT_UInt16) out_ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') out_ds.SetProjection(srs.ExportToWkt()) out_ds.GetRasterBand(1).SetRasterColorInterpretation(gdal.GCI_RedBand) out_ds.GetRasterBand(2).SetRasterColorInterpretation(gdal.GCI_GreenBand) out_ds.GetRasterBand(3).SetRasterColorInterpretation(gdal.GCI_BlueBand) out_ds.GetRasterBand(1).SetNoDataValue(256) out_ds.GetRasterBand(1).WriteRaster(10, 0, 10, 10, '\x00', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds.GetRasterBand(2).WriteRaster(10, 0, 10, 10, ff, buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds.GetRasterBand(3).WriteRaster(10, 0, 10, 10, '\x00', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds = None gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/gdalbuildvrt7.vrt tmp/vrtnull1.tif tmp/vrtnull2.tif') ds = gdal.Open('tmp/gdalbuildvrt7.vrt') assert ds.GetRasterBand(1).Checksum() == 1217, 'Wrong checksum' assert ds.GetRasterBand(2).Checksum() == 1218, 'Wrong checksum' assert ds.GetRasterBand(3).Checksum() == 0, 'Wrong checksum' ds = None ############################################################################### # Test -tr option def test_gdalbuildvrt_8(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -tr 0.05 0.05 tmp/mosaic2.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif') ds = gdal.Open('tmp/mosaic2.vrt') gt = ds.GetGeoTransform() expected_gt = [2, 0.05, 0, 49, 0, -0.05] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 40 and ds.RasterYSize == 40, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -tr 0.1 0.1 tmp/mosaic.vrt tmp/mosaic2.vrt') return gdalbuildvrt_check() ############################################################################### # Test -te option def test_gdalbuildvrt_9(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -te 1 46 5 50 tmp/mosaic2.vrt tmp/gdalbuildvrt1.tif tmp/gdalbuildvrt2.tif tmp/gdalbuildvrt3.tif tmp/gdalbuildvrt4.tif') ds = gdal.Open('tmp/mosaic2.vrt') gt = ds.GetGeoTransform() expected_gt = [1, 0.1, 0, 50, 0, -0.1] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 40 and ds.RasterYSize == 40, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -te 2 47 4 49 tmp/mosaic.vrt tmp/mosaic2.vrt') return gdalbuildvrt_check() ############################################################################### # Test explicit nodata setting (#3254) def test_gdalbuildvrt_10(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() out_ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdalbuildvrt_10_1.tif', 10, 10, 1, gdal.GDT_Byte, options=['NBITS=1', 'PHOTOMETRIC=MINISWHITE']) out_ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') out_ds.SetProjection(srs.ExportToWkt()) out_ds.GetRasterBand(1).WriteRaster(1, 1, 3, 3, '\x01', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds = None out_ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdalbuildvrt_10_2.tif', 10, 10, 1, gdal.GDT_Byte, options=['NBITS=1', 'PHOTOMETRIC=MINISWHITE']) out_ds.SetGeoTransform([2, 0.1, 0, 49, 0, -0.1]) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') out_ds.SetProjection(srs.ExportToWkt()) out_ds.GetRasterBand(1).WriteRaster(6, 6, 3, 3, '\x01', buf_type=gdal.GDT_Byte, buf_xsize=1, buf_ysize=1) out_ds = None gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -srcnodata 0 tmp/gdalbuildvrt10.vrt tmp/test_gdalbuildvrt_10_1.tif tmp/test_gdalbuildvrt_10_2.tif') ds = gdal.Open('tmp/gdalbuildvrt10.vrt') assert ds.GetRasterBand(1).Checksum() == 18, 'Wrong checksum' ds = None ############################################################################### # Test that we can stack ungeoreference single band images with -separate (#3432) def test_gdalbuildvrt_11(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() out_ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdalbuildvrt_11_1.tif', 10, 10, 1) out_ds.GetRasterBand(1).Fill(255) cs1 = out_ds.GetRasterBand(1).Checksum() out_ds = None out_ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdalbuildvrt_11_2.tif', 10, 10, 1) out_ds.GetRasterBand(1).Fill(127) cs2 = out_ds.GetRasterBand(1).Checksum() out_ds = None gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -separate tmp/gdalbuildvrt11.vrt tmp/test_gdalbuildvrt_11_1.tif tmp/test_gdalbuildvrt_11_2.tif') ds = gdal.Open('tmp/gdalbuildvrt11.vrt') assert ds.GetRasterBand(1).Checksum() == cs1, 'Wrong checksum' assert ds.GetRasterBand(2).Checksum() == cs2, 'Wrong checksum' ds = None ############################################################################### # Test -tap option def test_gdalbuildvrt_12(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalbuildvrt_path() + ' -tap tmp/gdalbuildvrt12.vrt ../gcore/data/byte.tif', check_memleak=False) assert err.find('-tap option cannot be used without using -tr') != -1, \ 'expected error' gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' -tr 100 50 -tap tmp/gdalbuildvrt12.vrt ../gcore/data/byte.tif') ds = gdal.Open('tmp/gdalbuildvrt12.vrt') gt = ds.GetGeoTransform() expected_gt = [440700.0, 100.0, 0.0, 3751350.0, 0.0, -50.0] for i in range(6): assert not abs(gt[i] - expected_gt[i] > 1e-5), \ ('Expected : %s\nGot : %s' % (expected_gt, gt)) assert ds.RasterXSize == 13 and ds.RasterYSize == 25, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) ############################################################################### # Test -a_srs def test_gdalbuildvrt_13(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/gdalbuildvrt13.vrt ../gcore/data/byte.tif -a_srs EPSG:4326') ds = gdal.Open('tmp/gdalbuildvrt13.vrt') assert ds.GetProjectionRef().find('4326') != -1 ds = None ############################################################################### # Test -r def test_gdalbuildvrt_14(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/test_gdalbuildvrt_14.vrt ../gcore/data/byte.tif -r cubic -tr 30 30') gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -of VRT ../gcore/data/byte.tif tmp/test_gdalbuildvrt_14_ref.vrt -r cubic -outsize 40 40') ds = gdal.Open('tmp/test_gdalbuildvrt_14.vrt') ds_ref = gdal.Open('tmp/test_gdalbuildvrt_14_ref.vrt') cs = ds.GetRasterBand(1).Checksum() cs_ref = ds_ref.GetRasterBand(1).Checksum() ds = None ds_ref = None assert cs == cs_ref ############################################################################### # Test -b def test_gdalbuildvrt_15(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalbuildvrt_path() + ' tmp/test_gdalbuildvrt_15.vrt ../gcore/data/byte.tif -b 1') ds = gdal.Open('tmp/test_gdalbuildvrt_15.vrt') cs = ds.GetRasterBand(1).Checksum() ds = None assert cs == 4672 ############################################################################### # Test output to non writable file def test_gdalbuildvrt_16(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() (out, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalbuildvrt_path() + ' /non_existing_dir/non_existing_subdir/out.vrt ../gcore/data/byte.tif') if not gdaltest.is_travis_branch('mingw'): assert 'ERROR ret code = 1' in err, out else: # We don't get the error code on Travis mingw assert 'ERROR' in err, out ############################################################################### # Cleanup def test_gdalbuildvrt_cleanup(): if test_cli_utilities.get_gdalbuildvrt_path() is None: pytest.skip() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/tileindex.shp') gdal.GetDriverByName('VRT').Delete('tmp/mosaic.vrt') gdal.GetDriverByName('VRT').Delete('tmp/mosaic2.vrt') gdal.GetDriverByName('VRT').Delete('tmp/stacked.vrt') gdal.GetDriverByName('VRT').Delete('tmp/gdalbuildvrt7.vrt') gdal.GetDriverByName('VRT').Delete('tmp/gdalbuildvrt10.vrt') gdal.GetDriverByName('VRT').Delete('tmp/gdalbuildvrt11.vrt') gdal.GetDriverByName('VRT').Delete('tmp/gdalbuildvrt12.vrt') gdal.GetDriverByName('VRT').Delete('tmp/gdalbuildvrt13.vrt') gdal.GetDriverByName('VRT').Delete('tmp/test_gdalbuildvrt_14.vrt') gdal.GetDriverByName('VRT').Delete('tmp/test_gdalbuildvrt_14_ref.vrt') gdal.GetDriverByName('VRT').Delete('tmp/test_gdalbuildvrt_15.vrt') drv = gdal.GetDriverByName('GTiff') drv.Delete('tmp/gdalbuildvrt1.tif') drv.Delete('tmp/gdalbuildvrt2.tif') drv.Delete('tmp/gdalbuildvrt3.tif') drv.Delete('tmp/gdalbuildvrt4.tif') drv.Delete('tmp/gdalbuildvrt5.tif') drv.Delete('tmp/vrtnull1.tif') drv.Delete('tmp/vrtnull2.tif') drv.Delete('tmp/test_gdalbuildvrt_10_1.tif') drv.Delete('tmp/test_gdalbuildvrt_10_2.tif') drv.Delete('tmp/test_gdalbuildvrt_11_1.tif') drv.Delete('tmp/test_gdalbuildvrt_11_2.tif') try: os.remove('tmp/filelist.txt') except OSError: pass gdalautotest-3.0.4/utilities/test_gdaltransform.py0000755003401500001440000001664713614005323022135 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: test_gdaltransform.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdaltransform 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. ############################################################################### import gdaltest import test_cli_utilities import pytest ############################################################################### # Test -s_srs and -t_srs def test_gdaltransform_1(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '2 49 1\n' + '3 50 2\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -s_srs EPSG:4326 -t_srs EPSG:4326', strin) assert ret.find('2 49 1') != -1 assert ret.find('3 50 2') != -1 ############################################################################### # Test -gcp def test_gdaltransform_2(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '0 0\n' + '20 0\n' + '20 20\n' + '0 20\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -gcp 0 0 440720.000 3751320.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 0 -gcp 0 20 440720.000 3750120.000', strin) assert ret.find('440720 3751320') != -1 assert ret.find('441920 3751320') != -1 assert ret.find('441920 3750120') != -1 assert ret.find('440720 3750120') != -1 ############################################################################### # Test -gcp -tps def test_gdaltransform_3(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '0 0\n' + '20 0\n' + '20 20\n' + '0 20\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -tps -gcp 0 0 440720.000 3751320.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 0 -gcp 0 20 440720.000 3750120.000', strin) assert ret.find('440720 3751320') != -1 assert ret.find('441920 3751320') != -1 assert ret.find('441920 3750120') != -1 assert ret.find('440720 3750120') != -1 ############################################################################### # Test -gcp -order 1 def test_gdaltransform_4(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '0 0\n' + '20 0\n' + '20 20\n' + '0 20\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -order 1 -gcp 0 0 440720.000 3751320.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 0 -gcp 0 20 440720.000 3750120.000', strin) assert ret.find('440720 3751320') != -1 assert ret.find('441920 3751320') != -1 assert ret.find('441920 3750120') != -1 assert ret.find('440720 3750120') != -1 ############################################################################### # Test with input file and -t_srs def test_gdaltransform_5(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '0 0\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -t_srs EPSG:26711 ../gcore/data/byte.tif', strin) text_split = ret.split(' ') x = float(text_split[0]) y = float(text_split[1]) assert abs(x - 440720) <= 1e-4 and abs(y - 3751320) <= 1e-4, ret ############################################################################### # Test with input file and output file def test_gdaltransform_6(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '440720 3751320\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' ../gcore/data/byte.tif ../gcore/data/byte.tif', strin) text_split = ret.split(' ') x = float(text_split[0]) y = float(text_split[1]) assert abs(x - 440720) <= 1e-4 and abs(y - 3751320) <= 1e-4, ret ############################################################################### # Test with input file and -t_srs and -i def test_gdaltransform_7(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '440720 3751320\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -t_srs EPSG:26711 ../gcore/data/byte.tif -i', strin) text_split = ret.split(' ') x = float(text_split[0]) y = float(text_split[1]) assert abs(x - 0) <= 1e-4 and abs(y - 0) <= 1e-4, ret ############################################################################### # Test -to def test_gdaltransform_8(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '2 49 1\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -to "SRC_SRS=WGS84" -to "DST_SRS=WGS84"', strin) assert ret.find('2 49 1') != -1 ############################################################################### # Test -output_xy def test_gdaltransform_9(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() strin = '0 0 0\n' ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' ../gcore/data/byte.tif -output_xy', strin) text_split = ret.split(' ') assert len(text_split) == 2, ret ############################################################################### # Test -ct and 4D def test_gdaltransform_ct_4D(): if test_cli_utilities.get_gdaltransform_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdaltransform_path() + ' -ct "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=cart +step +proj=helmert +convention=position_vector +x=0.0127 +dx=-0.0029 +rx=-0.00039 +drx=-0.00011 +y=0.0065 +dy=-0.0002 +ry=0.00080 +dry=-0.00019 +z=-0.0209 +dz=-0.0006 +rz=-0.00114 +drz=0.00007 +s=0.00195 +ds=0.00001 +t_epoch=1988.0 +step +proj=cart +inv +step +proj=unitconvert +xy_in=rad +xy_out=deg" -coord 2 49 0 2000') values = [float(x) for x in ret.split(' ')] assert len(values) == 3, ret assert abs(values[0] - 2.0000005420366) < 1e-10, ret assert abs(values[1] - 49.0000003766711) < 1e-10, ret assert abs(values[2] - -0.0222802283242345) < 1e-8, ret gdalautotest-3.0.4/utilities/test_gdal_translate_lib.py0000755003401500001440000004052313614005323023072 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_translate_lib.py bf8afbd97cff56fa47f2cbc836574bb114635ef4 2019-05-24 23:45:07 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: test librarified gdal_translate # Author: Faza Mahamood # ############################################################################### # Copyright (c) 2015, Faza Mahamood # # 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 ############################################################################### # Simple test def test_gdal_translate_lib_1(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test1.tif', ds) assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ds = gdal.Open('tmp/test1.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test format option and callback def mycallback(pct, msg, user_data): # pylint: disable=unused-argument user_data[0] = pct return 1 def test_gdal_translate_lib_2(): src_ds = gdal.Open('../gcore/data/byte.tif') tab = [0] ds = gdal.Translate('tmp/test2.tif', src_ds, format='GTiff', callback=mycallback, callback_data=tab) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert tab[0] == 1.0, 'Bad percentage' ds = None ############################################################################### # Test outputType option def test_gdal_translate_lib_3(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test3.tif', ds, outputType=gdal.GDT_Int16) assert ds is not None assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, 'Bad data type' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test bandList option def test_gdal_translate_lib_4(): ds = gdal.Open('../gcore/data/rgbsmall.tif') ds = gdal.Translate('tmp/test4.tif', ds, bandList=[3, 2, 1]) assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 21349, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 21053, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 21212, 'Bad checksum' ds = None ############################################################################### # Test rgbExpand option def test_gdal_translate_lib_5(): ds = gdal.Open('../gdrivers/data/bug407.gif') ds = gdal.Translate('tmp/test5.tif', ds, rgbExpand='rgb') assert ds is not None assert ds.GetRasterBand(1).GetRasterColorInterpretation() == gdal.GCI_RedBand, \ 'Bad color interpretation' assert ds.GetRasterBand(2).GetRasterColorInterpretation() == gdal.GCI_GreenBand, \ 'Bad color interpretation' assert ds.GetRasterBand(3).GetRasterColorInterpretation() == gdal.GCI_BlueBand, \ 'Bad color interpretation' assert ds.GetRasterBand(1).Checksum() == 20615, 'Bad checksum' assert ds.GetRasterBand(2).Checksum() == 59147, 'Bad checksum' assert ds.GetRasterBand(3).Checksum() == 63052, 'Bad checksum' ds = None ############################################################################### # Test oXSizePixel and oYSizePixel option def test_gdal_translate_lib_6(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test6.tif', ds, width=40, height=40) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test oXSizePct and oYSizePct option def test_gdal_translate_lib_7(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test7.tif', ds, widthPct=200.0, heightPct=200.0) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test outputSRS and GCPs options def test_gdal_translate_lib_8(): gcpList = [gdal.GCP(440720.000, 3751320.000, 0, 0, 0), gdal.GCP(441920.000, 3751320.000, 0, 20, 0), gdal.GCP(441920.000, 3750120.000, 0, 20, 20), gdal.GCP(440720.000, 3750120.000, 0, 0, 20)] ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test8.tif', ds, outputSRS='EPSG:26711', GCPs=gcpList) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' gcps = ds.GetGCPs() assert len(gcps) == 4, 'GCP count wrong.' assert ds.GetGCPProjection().find('26711') != -1, 'Bad GCP projection.' ds = None ############################################################################### # Test nodata option def test_gdal_translate_lib_9(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test9.tif', ds, noData=1) assert ds is not None assert ds.GetRasterBand(1).GetNoDataValue() == 1, 'Bad nodata value' ds = None ############################################################################### # Test srcWin option def test_gdal_translate_lib_10(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test10.tif', ds, srcWin=[0, 0, 1, 1]) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 2, 'Bad checksum' ds = None ############################################################################### # Test projWin option def test_gdal_translate_lib_11(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test11.tif', ds, projWin=[440720.000, 3751320.000, 441920.000, 3750120.000]) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test outputBounds option def test_gdal_translate_lib_12(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test12.tif', ds, outputBounds=[440720.000, 3751320.000, 441920.000, 3750120.000]) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test metadataOptions def test_gdal_translate_lib_13(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test13.tif', ds, metadataOptions=['TIFFTAG_DOCUMENTNAME=test13']) assert ds is not None md = ds.GetMetadata() assert 'TIFFTAG_DOCUMENTNAME' in md, 'Did not get TIFFTAG_DOCUMENTNAME' ds = None ############################################################################### # Test creationOptions def test_gdal_translate_lib_14(): ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.Translate('tmp/test14.tif', ds, creationOptions=['COMPRESS=LZW']) assert ds is not None md = ds.GetMetadata('IMAGE_STRUCTURE') assert 'COMPRESSION' in md and md['COMPRESSION'] == 'LZW', 'Did not get COMPRESSION' ds = None ############################################################################### # Test internal wrappers def test_gdal_translate_lib_100(): # No option with gdaltest.error_handler(): gdal.TranslateInternal('', gdal.Open('../gcore/data/byte.tif'), None) # Will create an implicit options structure with gdaltest.error_handler(): gdal.TranslateInternal('', gdal.Open('../gcore/data/byte.tif'), None, gdal.TermProgress) # Null dest name try: gdal.TranslateInternal(None, gdal.Open('../gcore/data/byte.tif'), None) except: pass ############################################################################### # Test behaviour with SIGNEDBYTE def test_gdal_translate_lib_101(): ds = gdal.Translate('/vsimem/test_gdal_translate_lib_101.tif', gdal.Open('../gcore/data/byte.tif'), creationOptions=['PIXELTYPE=SIGNEDBYTE'], noData='-128') assert ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE', \ 'Did not get SIGNEDBYTE' assert ds.GetRasterBand(1).GetNoDataValue() == -128, 'Did not get -128' ds2 = gdal.Translate('/vsimem/test_gdal_translate_lib_101_2.tif', ds, noData=-127) assert ds2.GetRasterBand(1).GetNoDataValue() == -127, 'Did not get -127' ds = None ds2 = None gdal.Unlink('/vsimem/test_gdal_translate_lib_101.tif') gdal.Unlink('/vsimem/test_gdal_translate_lib_101_2.tif') ############################################################################### # Test -scale def test_gdal_translate_lib_102(): ds = gdal.Translate('', gdal.Open('../gcore/data/byte.tif'), format='MEM', scaleParams=[[0, 255, 0, 65535]], outputType=gdal.GDT_UInt16) result = ds.GetRasterBand(1).ComputeRasterMinMax(False) assert result == (19018.0, 65535.0) (approx_min, approx_max) = ds.GetRasterBand(1).ComputeRasterMinMax(True) ds2 = gdal.Translate('', ds, format='MEM', scaleParams=[[approx_min, approx_max]], outputType=gdal.GDT_Byte) expected_stats = ds2.GetRasterBand(1).ComputeStatistics(False) # Implicit source statistics use approximate source min/max ds2 = gdal.Translate('', ds, format='MEM', scaleParams=[[]], outputType=gdal.GDT_Byte) stats = ds2.GetRasterBand(1).ComputeStatistics(False) for i in range(4): assert abs(stats[i] - expected_stats[i]) <= 1e-3 ############################################################################### # Test that -projwin with nearest neighbor resampling uses integer source # pixel boundaries (#6610) def test_gdal_translate_lib_103(): ds = gdal.Translate('', '../gcore/data/byte.tif', format='MEM', projWin=[440730, 3751310, 441910, 3750140]) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ############################################################################### # Test translate with a MEM source to a anonymous VRT def test_gdal_translate_lib_104(): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.GetRasterBand(1).Fill(255) ds = gdal.Translate('', '../gcore/data/byte.tif', format='VRT', width=1, height=1) assert ds.GetRasterBand(1).Checksum() == 3, 'Bad checksum' ############################################################################### # Test GCPs propagation in "VRT path" def test_gdal_translate_lib_gcp_vrt_path(): src_ds = gdal.Open('../gcore/data/gcps.vrt') ds = gdal.Translate('', src_ds, format='MEM', metadataOptions=['FOO=BAR']) assert len(ds.GetGCPs()) == len(src_ds.GetGCPs()) for i in range(len(src_ds.GetGCPs())): assert ds.GetGCPs()[i].GCPX == src_ds.GetGCPs()[i].GCPX assert ds.GetGCPs()[i].GCPY == src_ds.GetGCPs()[i].GCPY assert ds.GetGCPs()[i].GCPPixel == src_ds.GetGCPs()[i].GCPPixel assert ds.GetGCPs()[i].GCPLine == src_ds.GetGCPs()[i].GCPLine ############################################################################### # Test RPC propagation in "VRT path" def test_gdal_translate_lib_rcp_vrt_path(): src_ds = gdal.Open('../gcore/data/rpc.vrt') ds = gdal.Translate('', src_ds, format='MEM', metadataOptions=['FOO=BAR']) assert ds.GetMetadata('RPC') == src_ds.GetMetadata('RPC') ############################################################################### # Test GeoLocation propagation in "VRT path" def test_gdal_translate_lib_geolocation_vrt_path(): src_ds = gdal.Open('../gcore/data/sstgeo.vrt') ds = gdal.Translate('/vsimem/temp.vrt', src_ds, format='VRT', metadataOptions=['FOO=BAR']) assert ds.GetMetadata('GEOLOCATION') == src_ds.GetMetadata('GEOLOCATION') gdal.Unlink('/vsimem/temp.vrt') ############################################################################### # Test -colorinterp and -colorinterp_X def test_gdal_translate_lib_colorinterp(): src_ds = gdal.Open('../gcore/data/rgbsmall.tif') # Less bands specified than available ds = gdal.Translate('', src_ds, options='-f MEM -colorinterp blue,gray') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_BlueBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_GrayIndex assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand # More bands specified than available and a unknown color interpretation with gdaltest.error_handler(): ds = gdal.Translate('', src_ds, options='-f MEM -colorinterp alpha,red,undefined,foo') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_Undefined # Test colorinterp_ ds = gdal.Translate('', src_ds, options='-f MEM -colorinterp_2 alpha') assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand assert ds.GetRasterBand(2).GetColorInterpretation() == gdal.GCI_AlphaBand assert ds.GetRasterBand(3).GetColorInterpretation() == gdal.GCI_BlueBand # Test invalid colorinterp_ with pytest.raises(Exception): with gdaltest.error_handler(): gdal.Translate('', src_ds, options='-f MEM -colorinterp_0 alpha') ############################################################################### # Test nogcp options def test_gdal_translate_lib_110(): ds = gdal.Open('../gcore/data/byte_gcp.tif') ds = gdal.Translate('tmp/test110.tif', ds, nogcp='True') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' gcps = ds.GetGCPs() assert len(gcps) == 0, 'GCP count wrong.' ds = None ############################################################################### # Test gdal_translate foo.tif foo.tif.ovr def test_gdal_translate_lib_generate_ovr(): gdal.FileFromMemBuffer('/vsimem/foo.tif', open('../gcore/data/byte.tif', 'rb').read()) gdal.GetDriverByName('GTiff').Create('/vsimem/foo.tif.ovr', 10, 10) ds = gdal.Translate('/vsimem/foo.tif.ovr', '/vsimem/foo.tif', resampleAlg = gdal.GRA_Average, format = 'GTiff', width = 10, height = 10) assert ds assert ds.GetRasterBand(1).Checksum() == 1152, 'Bad checksum' ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/foo.tif') ############################################################################### # Cleanup def test_gdal_translate_lib_cleanup(): for i in range(14): try: os.remove('tmp/test' + str(i + 1) + '.tif') except OSError: pass try: os.remove('tmp/test' + str(i + 1) + '.tif.aux.xml') except OSError: pass gdalautotest-3.0.4/utilities/test_gdalinfo_lib.py0000755003401500001440000001137313614005323021672 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalinfo_lib.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: test librarified gdalinfo # Author: Faza Mahamood # ############################################################################### # Copyright (c) 2015, Faza Mahamood # # 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 ############################################################################### # Simple test def test_gdalinfo_lib_1(): ds = gdal.Open('../gcore/data/byte.tif') ret = gdal.Info(ds) assert ret.find('Driver: GTiff/GeoTIFF') != -1, 'did not get expected string.' ############################################################################### # Test Json format def test_gdalinfo_lib_2(): ds = gdal.Open('../gcore/data/byte.tif') ret = gdal.Info(ds, format='json') assert ret['driverShortName'] == 'GTiff', 'wrong value for driverShortName.' ############################################################################### # Test extraMDDomains() def test_gdalinfo_lib_3(): ds = gdal.Open('../gdrivers/data/fake_nsif.ntf') ret = gdal.Info(ds, format='json') assert 'TRE' not in ret['metadata'], 'got unexpected extra MD.' options = gdal.InfoOptions(format='json', extraMDDomains=['TRE']) ret = gdal.Info(ds, options=options) assert ret['metadata']['TRE']['BLOCKA'].find('010000001000000000') != -1, \ 'did not get extra MD.' ############################################################################### # Test allMetadata def test_gdalinfo_lib_4(): ds = gdal.Open('../gdrivers/data/byte_with_xmp.tif') ret = gdal.Info(ds, allMetadata=True, format='json') assert 'xml:XMP' in ret['metadata'] ############################################################################### # Test all options def test_gdalinfo_lib_5(): ds = gdal.Open('../gdrivers/data/byte.tif') ret = gdal.Info(ds, format='json', deserialize=True, computeMinMax=True, reportHistograms=True, reportProj4=True, stats=True, approxStats=True, computeChecksum=True, showGCPs=False, showMetadata=False, showRAT=False, showColorTable=False, listMDD=True, showFileList=False) assert 'files' not in ret band = ret['bands'][0] assert 'computedMin' in band assert 'histogram' in band assert 'checksum' in band assert ret['coordinateSystem']['dataAxisToSRSAxisMapping'] == [1, 2] ds = None gdal.Unlink('../gdrivers/data/byte.tif.aux.xml') ############################################################################### # Test command line syntax + dataset as string def test_gdalinfo_lib_6(): ret = gdal.Info('../gcore/data/byte.tif', options='-json') assert ret['driverShortName'] == 'GTiff', 'wrong value for driverShortName.' ############################################################################### # Test with unicode strings def test_gdalinfo_lib_7(): ret = gdal.Info('../gcore/data/byte.tif'.encode('ascii').decode('ascii'), options='-json'.encode('ascii').decode('ascii')) assert ret['driverShortName'] == 'GTiff', 'wrong value for driverShortName.' ############################################################################### def test_gdalinfo_lib_nodatavalues(): ds = gdal.Translate('', '../gcore/data/byte.tif', options='-of VRT -b 1 -b 1 -b 1 -mo "NODATA_VALUES=0 1 2"') ret = gdal.Info(ds) assert 'PER_DATASET NODATA' in ret, 'wrong value for mask flags.' gdalautotest-3.0.4/utilities/test_gdalbuildvrt_lib.py0000755003401500001440000000611013614005323022563 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalbuildvrt_lib.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: test librarified gdalbuildvrt # 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. ############################################################################### from osgeo import gdal ############################################################################### # Simple test def test_gdalbuildvrt_lib_1(): # Source = String ds = gdal.BuildVRT('', '../gcore/data/byte.tif') assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' # Source = Array of string ds = gdal.BuildVRT('', ['../gcore/data/byte.tif']) assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' # Source = Dataset ds = gdal.BuildVRT('', gdal.Open('../gcore/data/byte.tif')) assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' # Source = Array of dataset ds = gdal.BuildVRT('', [gdal.Open('../gcore/data/byte.tif')]) assert ds is not None, 'got error/warning' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ############################################################################### # Test callback def mycallback(pct, msg, user_data): # pylint: disable=unused-argument user_data[0] = pct return 1 def test_gdalbuildvrt_lib_2(): tab = [0] ds = gdal.BuildVRT('', '../gcore/data/byte.tif', callback=mycallback, callback_data=tab) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert tab[0] == 1.0, 'Bad percentage' ds = None gdalautotest-3.0.4/utilities/data/0000755003401500001440000000000013614005324016552 5ustar rouaultusersgdalautotest-3.0.4/utilities/data/grid.vrt0000644003401500001440000000064713614004467020252 0ustar rouaultusers grid.csv EPSG:26711 wkbPoint gdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_129_dem.vrt0000644003401500001440000000503613614004467024230 0ustar rouaultusers 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, 1.3888888888888889e-04, 0.0000000000000000e+00, 1, 0.0000000000000000e+00, -1.3888888888888889e-04 Gray test_gdalwarp_lib_129_upper_left.tif 1 1727 0 test_gdalwarp_lib_129_upper_left.tif 1 test_gdalwarp_lib_129_upper_right.tif 1 test_gdalwarp_lib_129_lower_right.tif 1 test_gdalwarp_lib_129_lower_left.tif 1 gdalautotest-3.0.4/utilities/data/mstones.prj0000644003401500001440000000021713614004467020766 0ustar rouaultusersGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]gdalautotest-3.0.4/utilities/data/mstones.cpg0000644003401500001440000000000513614004467020737 0ustar rouaultusersUTF-8gdalautotest-3.0.4/utilities/data/dataforogr2ogr21.csv0000644003401500001440000000005413614004467022362 0ustar rouaultuserscomment,name,WKT COMMENT,NAME,POINT(2 49) gdalautotest-3.0.4/utilities/data/onepixelcontinuous.img0000644003401500001440000002077413614004467023243 0ustar rouaultusersEHFA_HEADER_TAG@RdE rootroot`IAE RRLayer_161412744Eimg_Layer`IA Ehfa_Layer12744Ehfa_Layer`IA0 n0Statistics12744Esta_Statistics`IA?????F(StatisticsParametersEimg_StatisticsParameters830`IAGGGGDescriptor_TableersEdsc_TableticsParameters830`IAjlFN#Bin_Function#eersEdsc_BinFunctionrameters830`IAo@v6FHistogramion#eersEdsc_Columntionrameters830`IAo FzFHistogramParametersEimg_StatisticsParameters830`IA (0@o@^opion,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{1:Cdata,}RasterDMS,.R IMGFormatInfo44ImgFormatInfo831`IA7f M 4RasterDMS12744Edms_State`IAc g y `IA  fMap_Info12744Eprj_MapInfo`IA Unknown 1 I ??a other?:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.8gdalautotest-3.0.4/utilities/data/whiteblackred.tif0000644003401500001440000001675213614004467022110 0ustar rouaultusersII* 222LSgdalautotest-3.0.4/utilities/data/path.qpj0000644003401500001440000000040113614004467020224 0ustar rouaultusersGEOGCS["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"]] gdalautotest-3.0.4/utilities/data/w_jpeg.tiff0000644003401500001440000014017413614004467020715 0ustar rouaultusersII*,Sl[>rP    8H N - T + >  9   +   -:G-TX`lxo(F^C     C    }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??fV@#  mtr@@TXAWGS 84|??fV@#  mtr@@TXAWGS 84|" ?NyWOeZ"1]]^ >e?姛W?ߗ$rͻiם_fxHSF|Ԧˏ~|g]An1?;|wgG]Q+9mGe|=֦Y+z֗ey/wUOM[Ǩ]DXaʴZ~³?Z-[mߓfhT_of閡GIa?{?Կh' x/6i?? ZjE'5$߼OoTvGL>}QRjmB7?{F{$߼U;Uil~ھO' dqyD6T=z 5?:bաO;F]FHƫ->߻_d~?Yhs}P2^gAy1p/S{OvSx";9Io.PZ=h|Ok*5/gu%_sM}6~eԮկ>sF#ѧΧe?+5nʮP<1K%dSg+V&M\Zuq>GǓ5Sh.mO"_?Yj_XMi?|?+?IgY$Kx]vumzo2/俴Ow\/##p)r_r2m>x_LεZS]2s̰qdz5YŦu'Ǔ*-kZk%4M"O'^|uMЩSRx_Mcǫ>f Wzf_.NYMiu>Ο|u8?˸Z5oyEqܾ oʽ*[+˓+HSeJo~+b| k7 C<>/~zTO)?Zoz| W⻻4]֒_?%WzJѥ7~M̼,rIki!>Pkڴ/ygTO#_"GUvMzoI^hR9uo?Ы*q?;S!%>o`/KT_k/2O:/2?LizߛOZVu${/޾j6܎-C?jۇᕄ >֏+*|IG:S]|U=[_ 4_wj_S߻PO]-rF?NKIXn$(R6O}\J67.Oo?Kky3KE4Q-%Uk'k2e?+WZ?<}=V;l,{O§<+F'rEkվǾiM[/4R]ZuCIM~a8<,X_;9c_ur,˷}eZx Vn!W]\O#'ɿ?/oJi4riPG<V O 7sV^"jFO:rKFUKrxkʗ]իi>h4F"wFij>\v]G+aq^ZE4Vğ5E:sQz!^~Q8_T:.}K_cIurÉ٥_-KWsRo2=*o3z+Uy}䧈_yCx&)Iu w/רC96;*/Կ1({t1;1s~Oҽ~,uRO _WO3'cj>Ğ_^H<pkOb³K dr'y|3Wz߉ BO5?Iо'.v7p&OsW:^b[OJv,zYe}e*)b?,1ӽOk+ SՇOBIgK_sQwy.I|[4U_i~iqoiw; ozω ݼ'ڬ6Hl<'+#O2H,8e>N+{e$<(4ע~^f_Yy[Z<[_~In!4ȓH͔3.t'qCusE-?qo붲IǎT-C/ 5-冫$vsUnCg/.-?#ӤX~{ק&65|tdZƟ42~Uϕ'&' 5xcĺ?~jo./4CKI|zekO^Woզ/M>zj3>Iy$o򢸎͊OkYSjҡw~2>6Kvξ]m>+^d^g([SO5ynb}Ũ b]Ig%};Yo%\v{X^i,z^$i3/>Zn,w-9qiz<)R|x_ď[9k^$d~_߯@ō sKo6VJˬMFk|=iEo{%^G󾸭GsK~9btxڰNX[,K|seoZF.<wzĒ-]xa-뤖-넗V[}B_+Y( N?~7xrµe葡K}>k__sͮjI2/-U4Gy<}J4K?;8_ZԠtcX>̓lي_M?͏/z+ʥ|C_*m/$r!xŚ?OgN3YЉ,&g|tZF'w1^?CRț+ayQjvXV3Nͪ5tfŨ}W]>TǾjH%^gܓTk?NYio?%FB$6Uk׭ ?sMv{.xRPӯ떠tOBWYߤ_*M ^Cx~1DoWQ4}ƟCke_=Vq}V?=hR^žޭ>T巕v-g7执E뤵Ւwۺ[/4:%$[7m5π B[Ӵ:9|ēYț?5xwuS:MKZ-/D:/hSj]$H#q]B/`t[hd1=ïO?\׏5ozI[vE0U1XrNbhhuh;h|y$:\^gq<__[i ?ּ7^)/48.ryw5w9x 꺿'߷>wd_fhsΞF,{dt.XKOEޞ_Z%}ľU͗=^as'<z&9?ٯS E/Mԡ\߼G/]ݤ2bxcVu Z^[?fdrZGE$v/<=l?bY|I5AjVc$2Zд&)#rDY%0=_Gg&g/ȿb=NX? yě?MM54csǞ~7'Al6Iuy,Zna­NI˔/[r,&Ў7?s|x VMcχ˃mBYwɛE5gw z~kS]#ԓr ڡSxĺFod:]|/߮Iŧ廸!⽟$Wo7g˓5iZoy6o{ķ_=6IoFz5֝5R|I;ĩ:uj~\'(uំZ/xWw 6/w"ϟ_?,hǧĿ*֬WrY/O觗uSQ8vlҼYI4K?WJj/sW\CNѤˆIeG{gZ0S:h{trmB]CPS-&|=8tO;P/v?[t};U+; <׭ŢO24ks_[y/'ng/iަ;BTh^1Kj麌W|ZL|O uxky\5-$O?'-SR_ŖY^Xyy"v*n|o'Q^o MIO}g sZ猼C}K#cq ~_H4{~i R\~o+j6oD_ܣLS?#?CH5 -_*9GK7g?ZՖkHgqu8]Z&+*k>y͗g'zwo-孿fռ=wCʓZ:_%_3~_I*j|{8B6w33O>.h_Of&/E O>Og+k]ԇMw41GSK%Z/ir8aW CMwq,1IߤufrYOʳm>}{OoIϑ+n:O lX~괟7|VG_տwyqM{$gkWa~Va|ǎ-}q[SWJ>e?://[I7-!=7u/o/R:|޹$qiZM?WU nkz}ַ1CTɯg$JiM6_/Zu2EXrW. S '~/-/5ws>!^j?h_t>A~//Ue>SoQb3lßKx)dG5$'LGY:u{SEHȕ ?j։iw4^dn/ry}Ris9/5.O&)#G|nG4^]2~_+sKqԳZO+ʦک\ctKмm ޟE ݷe=I>]őyRG*HIZii<3K5}^l5*|ݤ9YCnjty.}z.!_=EoozvƝ7G٭o`Uol/I̺ޑoOEqB#OW9{T+O|n+kv?'u^iGˎYO;͕?עڷ-|2^ Sys~];MW?_~w#WwrY,vjbT0jN^7<QDP 7y"{/&yCF\Yj?ȩ;zj֛4Q}I9v"I+jVo.?'?-o Ha=o[r/]i6$'֮y>]c[:NhK\~ˤ'w?ݢ}<49>&ajNip?7fH6PHGyE=[Wwvze)"DOj`&얺O}$Qyhu+kߡ-'$hvj2[%%5x.ww_X|=Ljt}FXI~դ_'_w_9ºV<{m?c6KuυͲe$|TrZ~zKj1^T+Jjl@B־KȟՕqxXciH_^:]>IGk)A.4ȥi?QMyd~8O2_W|Z}?&_g??a3ש?Zzw }Ly<ߟiנ|=^$-c\^\7_2CC7'|Y>w?KkSGݟyESS [Id!ż_"gw[\i>_E~9~ϖ~>%(A?h|7]ޭ6Mc’zos^ole!ͲN 2Z/{si؊rO_#?whV~ 5OqK]TWxǾ%ş%&Iewy-#VX5ۍw\&BumBJ|GKXqv^xsCӭG=/nYdtR>y]xOO:-6IRO]mvk,]PH)6_//'Zz:Qy_du<99~mX$\wwMi,N_%u-kĚeGtw>;\ڶ42}k[o)I<~Z_tͿjoKy_|q+CDu匲K]/ٯM״Mc,g$F-[gKMo[֗7]?UsuK Zv5|=O4qw4#ߗ'+վ,ZY11Kj?ܓk#kS~Ky|?UK=ZD^W4JnO2%T%}I[x{Jr9YMIPmc\w,hZ>yW1,$xE>-}okBwjg[Z]\z4oĉZ?X2o6tʼn/hŨ$"՟stZ("~gߎ( ]G-.J."Y'&.o7]~^}|\ӧLiox+}C0xVc^K->8+u~GUj7o7_֦,w?cy qM,xMeP]qk'^|c4?冓w/o<ݓ_ⒾҾY}P򼿿[zrzN1YyVTtIwY3זe>xJȷᏉjZMkB(thZG7ڶ"ly%<֟lʎ _>m==1\\y7^_{TZ-NLFS_ד?" ?KM:X?eVo<߼dUMrX!г#O+ɻԥK:)"kK~#Y|KCXmckEsKkS hZ(ᴆ;Cu6]ZVL^h%Mw<.9|/SO:Ŀ֗5XnZxq~/M'NaC,w|=C4j{մ;]GPFT.̕GEuO2eY(st6[RNUiGyiiWg/j) kڎW?ͻ ~oh?PD 7O+ʟ{o4O>O<ǒ۫c0bF}ccFp؋Nu |Oo5QlVo*Ӣ#qO|3xOMQɨ~Tw@)c zsOrLO-%Ө 痗DW~M?ş,4Ic$xRcIoŨ}_ߟ2t!?&/_'.%T~ˋ笯Ӯ%?  mZM4g}w5~$ƫEs{AO⊼W\)GSD_S]ɩ~Y߯mlGc`\`[/~Қo%rx/v{#MCT$_|Mk++oP?MBb?uM":ʗQ·rXeǺY9~j'{NKZ~'U?^(?wP(嵜<W?]k1j墦Uf5cEqڼʻz>\qCv}CKe#T{ﮧWwZM}*?+k_&X{,5/y&/g>JۋldqMvmѥ?sv=i߿s!Gm<ݼqiu˽bhѨ_$qEOj]M-m;UtZNd:>dr?XU>he2/%G#wK _Ώ.;Ho¥:POvFixOJ> }_<WK/<+i\i~V5գݷo+#j:Z[ՠ)?]X?+ ggoi?zm5[?&6}_YW5z/\^m{O1բɖ6J~U3Nזi2if[._?*ۻ~LQ.umb Ovy&0h~'߷~>hƭ틏[h6Fr󤛿y0\Sߡ?˗S𽝧M4It'QiS+u&8YGޮ?`/ƫ5י\}Gc[3IO,_G$~\rG_WjC֌o-OZ3}"j}~Zo6BU]:O%{U|~<~M֗.Me|YN? .~r|:{:x50?&8uqsR3Vg/~g^hznZy^_?5¾&=_ښt-k?r>#~}hqŨG$_gwכ y8>JǿE_ T&׵dH#}u^IwMxP~ ~/}kƼyiaF(Xx%4G<^[o$iNv}?#BG`/Xeyycf6Rxj'+gŏxonhKUy9gg=> :Knǎ+7'ʵWC4/K/y7-_7zuݞCm츊_Ǻ<4{K?햱^_<߿~dߴ,Z' cfy?𢵮,~WQ~.P7^G_.<3C'NFOjv7"}yku-(Usu,_duɾ/%^_r֮-? k;|_էv" ?M&XX㻇HG[~'>]NRD̋Z:zZK42qii-ż'?~3:s%7 /[Ob7RG&X%z'z=KQP+ceT=<\O/ʚ_(޷w խ>HY}*i|bPq׬o &-K=㊪7zeǝ$UaiEHm><+s3./?yl|qy,I-?O g_t=Zyp'$$hޯ`EwbY,?O+z}⶚|O7̑?uw떗ytrw~oqa_ 92B>}oO Fl>,P4nME?U?<%r!ͼ÷5EǛuKZoꟺլ?w_|,c*" N<~wduV\OKĞ[/{ʋI!\yvRmE(WNaN~Dy \~8#~jFl͹Og1~]z9eEߛr C1C#Ww$5>K~yIeW̵oCc%ޟqmlX _y^\^\T[Kq.s C{w9\J*ʷ}M[G]rŚN$Ys5GcW\8YG._?Oy׏at߲I7W6~Wi~t?hdRI[;qJ3J;3k4z_yV7rh:VrxN8I_|o ;+Hf9"/qU>wsȿ7olo''v<:yMJsajڮgw .|I6>ǞOʓXqyUߙ]ZY4;̰_%zH$+ӟSS{]߳W5-Z]?=^yCǷkwĮɰ>"趯ɿPk F̆/{jڏ>$i6O}}M>oW/(Շ$y4pg*5s'ixY$/P/Zc7ŏ^IuH&??dˣ|1Y?ލ7i:hܷisͪj3o>&迲]Ck}Q;n,g^Vϓ({Nco떚Iۏxd|y5 /O|U6o矻K7Ծ!M7g{m,-uA//$?}kY֭fXs=:z=ܲG{O׍ƹO vCM!檚%ܖzQM,7Z'kh-/Ο+}e)8Μ~-,xx )TjK Eh2[W{T7W=bؕ :Ǔ,rD> Wڅiu G3ӤԵjOyi_"FoPhaZ~GŐg꡻{=:O+͹oj֝HS%B !滊ΖH_Pzyx߿jI~$Wiڵߕ'uJOvSC" ?M'Vf̻_'Tڶy rE"bOk$?ܬ_kʞv?*>>ίLvIi6?<*K'eǶ׮gǴ?FM?'^8QGq9*a!fVc򬣉?yv:f <8zφx|#bVqY z>M_/ny~L,d1EbirM7hPJ6֒Mu]eϯ^24E|.&W]K?q~_ZZI5g_%eP1sX{&w1E7~TUIE~̋YW}Q䖶\ PDy8zp!ռC q g6]ڢ^k?m2[Ŀ"\$i$?:[2ilvN >K:Hr:(Q5r(i>2ͻeoI^Ś滸&=| CGZa.Į_d临Sh։O_E|Waff0q9~?*Y şX.eg/I5)t+Z]ڥtzt2kqk~#RD6Oe]^:q_Yoqyʻq'N BhϛDCwi~_R>i%3yy߻%ҡއ1C>T~o'z_".?:M.% [NdI W?Xp硫xx%JsǸxz+M7PG/]{wyˡ~/oK u+KͶ?hx;Ȧ%gϿsݦ{ i~H)`q,?U=?J-5?TN{ԍ 2/?fJʚ4oOw?"٨o&o|<~Ji3&ɻW>?u.7w\jϙ*l}]_'Y_wy_ltΤ̓Ro#hedo=aeo]c_-(^_7OV<*9vlWOM?TNݔq}xo˹+C=8͒O<?\'u|=;]z+[ē}jg孧R2#Ο>k6֖ikY6\jvwu.ĒǞ3+{{Hm|E7&,W6J<ݏ?׷ձS/=b!'x?x^+ |n"',[8,OyOnեEwےy_xrj8|acWk7z}pIXW}Iޏٽ~Id08zqsCN>~9xAal{??W)yiڧ6y2jo{t^ȞEAxP_68%<kQ5 #{#3Og.խu4=.M2]Ų̻O}WrxP?b8wW~1t6Xҡ״Yv'5t| ૏ ]έcؑ<ΰV)ЏCbr{m.O۸|M\jciʑͪZZW~5 }EK+=vo^axG?4<ޕSŞ1?>+ۣ"76?, Ma8F1q*TӒ ~wz?MIΒK?Y |+H4u %+kf Zi:Z[K7_ۖ}H/ĞX>ovMSЧ8Es]_b8)w/;9?yj.b?{m|SV]-ͤ'ڥMK.& żTqZ={Mn%_Tcc~ծVӠ[x{R+3~j]Nq>^" ?Bδ_j}QI"UM vOg=i2/G_^s{iĻ̐,g󖲿OWWK6i 1Io.ΊH_'^}z~߇'K48~->K;/z~$uk.?:Vj/j_kZOky= o~zU:X߸_*?E6?YyQ]G͡W|YxfUU/bt VD'w+NĞ!8g+GKϻ.G)i,v6>[*[KO_~wia;xK˯SYKXhzl?k{7?z|1'Xm$o\oo|)Ƽ%קN4!'>e|yGR~o,:~{ok*ODoܵj>N~zK^6 $+\'DvMKzx/J&/MhɻJ" bqˇT{ X|i54yQEi|>hqW_w4pMq*?-PoEIUd!Nwp_Ev~ mmqDд?dZO{kHOĿY8-h/1j[6^\jUu|Eu/G[zZ}vul,N/!䤬o]Z?E&iy$Yנ|'ώkHM*Zw49rS-ZKwHdf#ǜ_ָC3ޟgMaH}Ŭ7aR;'h|2%_.W"/^KXN#K?+/jw[Ǽo%}Vϟz5?>W뚕6sӖ/C ߖo?jڼ|gԴsXouyq|{YҽGuoR!ӣ[˱G?w_h%~u dU0%_JkD~?P} _N)d2_6O<릇y_韺W6(#oi$Pξ`t'TPv&*ON+.浒􄸋6 pC-kY}Ox|fXHfs'~GF_v5|CI)g[p2CMkHDzUyg_Z] _jW!mf{ }wz_Oḋ5P喷Ӳ,]L%{>/ fҵ &8K^_D z%ii6ygk_;[D7 =w_,i?|{~ը-m}~C ^/ͼϨF\\?Ï/l^]år9RmB]\Lv$Q\|Y8u˻jiz.|rbAv1d0H}ޯ4K\5IIJ¯+mw-C3Rn3͆}[}sMtKy~'٧o_'̼mc5KqgWoOZu:{=[&y^^ˇJ<O 9~ON,\tt&MJ/^b}/?̙mia '-$K].XkqG^l}kf]?b^2%OyQ==#Cӵh4I7q#ECsKH-,§ﻟ" ?MZo&}m Ewy)G$_< 6I"̏ZKyu,y1Gj9|Ď/wOotWKZGRIiIe/t˸Gr%Լy%[Sd˿P eޟ$^oߓc>ozg NLO4Z_keW"Ļ %D_e>ti3'9"ncOvS׹^*|fݤy/eV?%uSriWQx&X^㭽)ϒz~GOSooдu_ ߗqV,>!hM,,6j_sͮi_g ?:)$Ws3?'ܩtu-JXEOyW'9RJM?)~eK gw$^WKbOPvqyRIǓNs}d(C g2vګ-]^T'?o(e8ϭ[>t1I$^TQ]K c듧mGiڴp/.=#&M3Mʋg$2sOG<=z9[>{qv'WgW'ԅ }CFg7A->Y~Ol3n+Iz'GLxOMwᯠX̒Y?ͬOBkG[p}+_=U5c˒(e 8|& PRD#뤱y]]ytrO8'7g"]_wK4QIW^3LLQͤo2_*9?y7dmdꮭ4p,?ߗ&G=>z}8MԔ!v[Cw~)'?ZߕE4Vʒ$7wW i\\Z~I|ēUͫI ǛG8̶F>[RK?}k /2?'ܯ/ ID5Mǿ3?kʄh@hF˻1,?^SR]+O?yuihKG/xgUW L~!K\Eo/o|kμeRIfX=Zv?.$8"pɩyhԑοC%IǦ5g ^gܕOKw}xi I*uɯզח*Gb>jw4C?ܸ+:}N)B>:ZC>M>k_ky~{!եY^xOJդ1 +ξ!EwEm6xb)ʝot׍J:oGf~ ޥZ[o/Z?:T~kƟEs:qow5̖ĉm[z"ʹV~zw-kˋJn_H{X}.%_jmZOGIO2/C9t]VH+~,zK7-ܩ;UM;Q?|kK~9WP`)[>[kGgi,z_>onU]엑VwI-~wx>T>r7ץht>-?WWK+u/8.h(gQp*m~ kZ ޡqO&];g4/j>>}'Zbcɋcw$1[Hfombx7_.٧e]|fk_?;OEi^H.fk}Zkw ,+?rQ׋-,<+{K=Sc?>egi:M,>#%<_F?4*=V.; ^Gd~Zo n-~[v74;&XyҼN$uia5q<ؿֵy]Wߎu]w-忓Ⱦ+U\aṡͿC" ?oI7XjwiJ/+=6kKoM$X~mOZj^$ӵI/Luy~؞oߍ>~Sϒ7] OAy ^+*5m[ėwz1\Ė_?&}kMXYyE~?:4 R&?+|Mwi6,J/cYU߇!W1y^:ɡߡ瓧Eoo>֗ogڭu\qygC>Mt+~Q)֖sEUԳhvҥ>y?TZɖI?UTB|ѧ K?쫋˹|Ga S?w5OWw.~ u:9|ǒz][+ΥӣԢ=S%kI&ޡy/s%wr'om f4%mn~Y׹p8ݥ^iw)IwGEͯg F}7ޟ7,{{Yq"WPբ_~Z#3YO7$O;X&qy^guV[.ct!9?*ռ[K^gO7g[C*崭o?+|{IkI^?Ukum[8ޞJ>j,^k~k3g6lةGlj8ޯ=HJ~>G5iKGY-u]%s7wrMTλCGogW)Ó>-:=i5)b?J&hѨCȾHquqIqyZ|4 " 뙴vhzWMGXwrM{Iڗ IrD]:h洊8ZX&b/'zWb+{{ca\xzhm-+__JtM>C~?~]d$d~VZ۴#S)wiړ6He|T ;$CwG gy?swMqyXai6eq![ Jy˱MⰧs77TPE̸?ڀW]zx[+cw-dgȿt!_lkFϒk6j6c˵W.xgm^gҩz':q/\]}-xEqyO!ϻ6Ty"4զa?goWN[ F6|ah὎IvMWXm="y!"g6.LZG~_UM[^j?chپ9etXM\\ZCuso^nzOqa T)W7cӾI~:fU|eOd\b򤸏:0sCOe>I:sdܾl}ꦭi#rG}=olќhj:pQiuf~tRI,k|w.Iv6R9I'LGUegdAj_d/*?U~t_u)=fs2zos[m:~gy.;xE|;;H|&[(ֶix/RZŽY8aÝnR{Nic-&i_R̿#׋5Hl,HI%<)?iַiY7ܮ7sCKʇK|[~InwI,E9|E/6W]Rӵ]b+i%y)|v+|=iE͞o;ZZy?2Og_WOS[x5=SUuo'㿗dHVx[\~mܱy&O)W0YdTK_ut [÷WE/#zSN- 躳o641^Y:͕ܳvoZ:w^ˮx M[.[MRʂ}?xk[7=64Q?zi6g7ߕ]<?䕡xEa"zKן^i$5!Ǜ45k;{]ǩj?0W_kg_+yd? xJrG=g~UKl˷~մٮ䴛j]sIY㢝J!H+SMW}|e>[kR]vyru_Z-.\蟼^IcC}4[Ɋ1\8Wꩤ7rqil!)~Ji63+jt=my8{q8BIP~]TP{Rx?n͒9|R~ ^'u"vq.đ/_/;GpGq-Wz쓧Igi r)cel[>A!H||2|1i2vC%:6DzD&%~x4ZN|ARu1\} 1}/7y_>]oMI]\IMwՉĚ}UC"%I=K-WRo9Y<ɺ=0w?6C/1,+/։/Wnc5\R83U]Mi,?-M&7?w>ݰxhe$~~-O:qs^CP5{u\S}Ζ? aXո4qy]ݿ_z4uO 5?g|^~_VݤMiiZNۖ_yuɎ#n&iOOyw?I,D~ws[`o2/*H夿z7̗qI~O]s| R:u *_[G/ߟhiqZ桮G\ܼ/r?wqOYy~eUgDz8Z>}!o{g'nm$<+ }ɋ_ʼ;O 1[Ou_gX]]oPs/ɸW|a<66UtgCO[6˷J?ksMiw_#g۾6*߉Y<:uݞQ7xu &Vܼ{ߝ|MbO,#=0rU:osWVκG:y7M7:}~)#PPg4H坽yt3IOET 5,TFG8)ԡꊟe-:MJ}]s؞t?oZLuޟ6\_~GZn^[$璱5hd]^4B_ C/䰻>m:_Y<3=&D'*FGb;~O#J]0JlK|}9Ԧ-/D_@Ӯ5I|ȼ?5jĩ}?3ҧN1uhZZG7|AZCr\X|EpY,_Gy,G+I/ߒin*gN.M bMˏ:OYSjm|%69PgxO",#ɣ]ZW򰩛ÒSμoyռF'429yߎgL"$b/2 ˯ZLOHw5_rGg5~{b9'ѳ.j?hʹ_2>,ֿoZ^hXG:پ.~//ڮdG-|iB={Śqw \\E:s}Wsjs+( #{&?[V͛P['-vj1kQӼ;[<_eY㲎_g >[v]0ǫI2aڛIm-<ϛ|7嶢tM[%<׵ѩ~ԯJz#" ?4 Ǡ;ȿdqE4MK͋P'y![iˏ_燴&-?K濹Xue %~;]T4p0k?sɭ sˇV߼?wgaiM ?x$z·}=$Ӝ=˨Gk+:tdO~_v:\G&;&?6T*O&/&^TJ۴<ˋ\`w/w?럙-q?e?|1!TwOJ}6ZMFl䨾zuo?sv%IJ~:e5چڣ&O&)|_ӡ ?UըJos~!j6d;B3/ܯ? ޥ}KͷSAk=Ǘ<wi*og~cKgﻅ`B,UUE|B߀'am_G߫zLw/˫__3_܎(qE$?U{{Ǐ_R&?G_YZdhg=%iEwWZ=?&=[O lM h~cJh-G |-߲va<66aΗw5|=y5>9rIkƵODz?uow 1kMV͛mOcmqQi6vRI/s/^ eK{q2xO"+~!Z·r[U. m>VwT[<kKOyy^_=+o>'|OľTqi^m=4nq=V>qws'˨b^K7C|ٵ [>s>V׭jmz(Ymo[-dܟ,+[6gJ܂,־_-OK?'ˏRV]B ^EIf~ӧ =26awSyTֵuGHa\|r^M,WW^ ~W%\*.>4ѨZyVʮp0IՄK ^m肋g䭸tKʷYM^]KiǦ_rO+/aFN' :K4 O~-7Zno}~ټ%?+5w B.ǝ^ŗsiRY6mK多6M?y_w_F5=۳}u`ir֣GW RVOվsyri_o奬Ҳɫy_ bGQwyRvB[w;\,yQyd%[>:Sc}ueK?Zm%.m%egC>W%3W6>G&y-ͿYQ?K[[IeD's~ӧ?if>OhuK{.4jUn+MK#͚_2/3ˬsşl[x?y>|ghϩMIi4> >wXJsluP_jzT֖w_I4pq_Ƶbմ_Q^L9[>I%.o(?t,iEmrK/0) U.!XC7qwINyϭßc<'Ci+䎱&/O{eޟ]ޭ%4K-?<6O5V|S_/$K7sǽ1I|lUNotR!Q|ѓ r_ʱu ZI c['ɨj-s*H/ :M#ˏELu:ؘ{9L>:>^Z]?# ܭWx{Q?o}sY?|CŽ1bIz7/X|B⼓얺տKX䩿&O_סRj6/\ψaG|1oM3K%3%~]&rK'?{Z>c<'idʗ6ig7o'Rן>,զ_E,_Ms_CO*W5Z_\uK#\}Iy|_ N7Z3N~ǨimϿɬj]ZK7~ߕogiA-/62]/ _O^jv^omy'+K<Sy(]u -&_Vw.-C$/y"&jZZDĶ_?^!Ӯ).%}>7xZ=>{O/jrN. Rxjo _1?t'?Uu>:&hϿxڵS9\jiWy?YR2o~L_8{F 3)-4]+BoG=~r7մ]c\.ʎ_1g-X$^i0|e,u(rM]tzt>﮿uGVY?vS*d~2H/ʏyR_?ZOXnn?vܮ U)je]0M?;UN\EEMiϩ]o~x?'o@%r9>Ȇ->8iEȫ[vo^GE~ĎuZ֛5 :(l +W'Z(a1ᇓ8tm<򣎱?-KQ-Ѯ͏C4y,V9uX-%L6chQi{ Q72g^񿇴}:-FI?{ kHiu~>__O_tz/%wg}2iڗcjRD$>?Do~x)drݧ?/iyʸ?~y{\t#:8vy,Oj=de?O&Y?} |,%/3U/y2&-gY]?s͡OVm;M/Vy?{\4ؿwyP'o.Kn[?(xTFSޜyL:tsW=* \^mzݧ5(n㳖̏~d"T?hb$Ζ?evO'Ù/v*#(b?gRˏWr/(oILOdij˓¥l?͓:rE76Wjn߳ǨZ]G=>t _ u+?*8zo(|Qu?gTAsNW<F;9|ϻ{?b4b\mUl4bJqE5|r_9? ~:)i+ʒOioJ՗>7ʎO$QoJe[ya.>BR 'yiqůG4}Ӈ$o2Ifc֬?u9|75ڄCkw/BoիӮ+6I5 F-qx+GÓ3| յ/*;'̪!xViv^o_j߈tI|M"<ء?/橼Ci'ItS[) }S9~V~fTۧ:35"$+ඛ~z$^c?뺽Mew3̖(SU'Bq~Ob ?"z4s'V[mI'ͽ_6}o.?)jQG8<7}toiZuЮL2*忕^M(j %^lE][ ^ErZ'퍢SD$׭g?U}]GWYvVԮqyk?œo5hjyp?5m7¶gݧ?埙{P_{>?+^G=Ϧqqw,ǎX_-hZ|ڏQ^gO7owUC:sKW?,pT6$}j9'LջO9i-=}R[yql%դYnuT6YM?;OkK'e[+oXbs?Q?eO_|5u3~\%l+<=<+ iLﱿ5HXu'YQ_3|L9'Pևxo~QZ>__<}l[I>k_'^_ E8rNP>xR=ytGş$W+&ɏZWRJ;-4tx#Y%to28y_WypG].4u*S݃8lz7ْo yyZ~]Ի4wj&_.9uJY駙d?lĸڰteϧOY:mGRM4GfedrYM_3SV6FGWwy >!<>Ys>涟!okSEW\|7u/#wc7~U'mpk%kj;4o=hdC6Ih|Kw,4/+J ܕ:)|?[OGgiq]n_;gkUγ {Vaz͏ )R|\W|CB$ZK+Fdg/KG|Zwg\Ǖ_deiK̰9}9~:'kۥǔ_?[EZ|Ry_jm;{{}C<[I>o t~RݜW>Wgq ){/揈jG" ?i4?t/ _tD/& _$uma )/|Gi*ɛrWM}vo&Q"%6/O&*fXZdVXj$ZOHn妫mji;dK]kɩS]k*Q\|~!W?sozuVRe~iDٓ~H&X'--.߭;Z-!bGxègc} 28{~0Bm.Hv~?fY+CTMYK /\sZr]~?K#+ʓzUO.+/ šFy'B?Eil|/&o%(S"Ff&*VVwx[Oga?+VkdzޯlH?Z?,jojΦb[z{>X4CWLPwO:IH&%p֢VĞ8a|;fe/+O5UdSZ#oo:[cZ_ֲӣd=٘tm:?kRڏ6Oz ?E'6Oz<='>OHj/a6Ozo3''εfOU=SrzZ>=SZzԿkoTezԾM=S͓ޏ*OzAK@{A!&l~C Ʀ>l"דMhE16ոm dY(ZUMsN|KYۉ=i-XNt_hyϋ<1$0]^ĸ_=?_ι]s7~$O+~_U_;M!HzK>8ǓhgϪo\}ˏ+䒪xE7et X)/4ny]:E|߱ޔ}ngdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_128_dem.tif0000644003401500001440000000317413614004467024177 0ustar rouaultusersII*+$$=S   6 v-32768.gf?qllf?Q@L@@#  mtr@@TXAWGS 84|xRrf|L$\%[V/E$z$Lw ^!?fv~ywtR W$H 7Zwzi׻SJPgIK4i]$?z{p|qvT4g$?kїw>012A<_]}qvrrryF/OPeXq5O4\^^^cn9=pLSdjE*ܨy9bxӤSqnEؚ3՛ag`Y7U>2LfuZ.VfY颤DiT"%*^TfFɺ5EiQFoƃ!rlE]Ef ~/+̆bX^(i֙+VyX<-6sUF b80o"h:"rS(J+U Tb4`hfY` ќHԯZOU?<ӕ_6/%gV#\ o'kUWeg\fQ]rj67m(ڌM!Gs+usݭ3!{s+lEv>wwy`5.9 p8$ 3!Xd6DbQ89bu;QuAPTVM'Eb?!0Lm(ˣ K7Pb3ny=M(T]G:lb/T:[PV9z;`R=0.S\Q;uybkF׬lF6PcqZ>G%2|ă74Z=&MjuZfddQ=S    BR0}{Gz?{Gz?@H@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/utilities/data/path.shp0000644003401500001440000000057413614004467020237 0ustar rouaultusers' &|ZW~/K,I@}9$-uI@&|ZW~/K,I@}9$-uI@&|ZW~/K,I@N9%R>3I@f=(xprI@Y^[&I@|+M9I@'PI@* [F .zI@1yX 'I@oq$I@wXFAI@}9$-mI@z(ҀazI@+ٻ^lI@<_uI@gdalautotest-3.0.4/utilities/data/cutline.csv0000644003401500001440000000014313614004467020737 0ustar rouaultusersID,"WKT" 1,"POLYGON ((445125 3748212,442222 3748212,442222 3750366,445125 3750366,445125 3748212))"gdalautotest-3.0.4/utilities/data/mstones.shx0000644003401500001440000000023413614004467020774 0ustar rouaultusers' N )dbI@Hi`I@2 @ N \ j x gdalautotest-3.0.4/utilities/data/withnodata.asc0000644003401500001440000000023513614004467021413 0ustar rouaultusersncols 2 nrows 2 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 NODATA_value -999 -999 0 0 0 gdalautotest-3.0.4/utilities/data/Fields.csv0000644003401500001440000000030013614004467020475 0ustar rouaultusersa,A_1,a_1_2,aaaaaAAAAAb,aAaaaAAAAAc,aaaaaAAAABa,aaaaaAAAABb,aaaaaAAAABc,aaaaaAAAABd,aaaaaAAAABe,aaaaaAAAABf,aaaaaAAAABg,aaaaaAAAABh,aaaaaAAAABi,aaaaaAAAABj 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 gdalautotest-3.0.4/utilities/data/path.shx0000644003401500001440000000015413614004467020241 0ustar rouaultusers' 6&|ZW~/K,I@}9$-uI@2gdalautotest-3.0.4/utilities/data/mstones.shp0000644003401500001440000000045013614004467020764 0ustar rouaultusers'  )dbI@Hi`I@ Gti`I@ \Sx #I@ HI@ ҙ 6I@  :A S_SI@ fL겕lI@  )dbI@gdalautotest-3.0.4/utilities/data/utmsmall.tif0000644003401500001440000002417013614004467021127 0ustar rouaultusersII*'k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭Δŵ{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť攽s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ{s{{kssksc{cck{kcccsZ{sksskss{sc{{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌ccs{kksks{{k{kskscskkssks{Zֽ楄{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥc{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭk{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽ŽŭޥεkkZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌksZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭ֜{cs{Jsc{ckkskksŽ{εŵν֭Μks΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό޵skkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭΜ{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޜZckcRss޽έބε業{Z{k{ŽŭŌŵŜŭc{{kޔŽť{{sR{֜{s{{{sֵޥֽs{{{{Zc楜{έ{ŽΔΜc{εk΄省ΜΥsks{{Ō攜֔ŔskޜŔs{εޭńŽ֭ﭥ{֔{{ťs{{Ό޽֭歵Z{ŵŵŌťŽŌ{{sֵŔ޽ssŌsνť挥ť޵޽֔楥{ν{ŵε潔޽朔Υ{ֽŭ֌攔ք{Rkŵޔsks{ZŽ楔ޭs歔掠ť{k{kscsc{ť֜c{kޜs{J{c{Rcs{kΥέŔťŵνΜsk{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{k{{Rk{kZ{RťŭνŵΜŌks{sskck{ֵŜsZŭ֔εŵεJkkss{{s{c{ŌޥŜsk歜֜{޽s֭{{{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔s{s{c{ks{s{s{εέֵ{{ssss{{kskkュ{ssތŌkckckcsksks{{ss{{Ό{sŽ歵{΄֜ބksckkk{{{{sks{{ťck{޵޽{έބkksssssc{kc{ccsބŌcsޥŭs{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŌksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭JkJ{kRZksRkkss֭kcŜksέΥ޽֜Zk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{scscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭Zskss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭kksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽ:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތ:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜s1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{Bkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkc)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:cJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkR!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsZ1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcsBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1Bs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{ZkccBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{dd'Q'S ( '*(b(l@A̞LAN@N@ Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/utilities/data/contour_orientation.tif0000644003401500001440000000036313614004467023373 0ustar rouaultusersII*  PS-9993 C C C3 C C C C3 C C Cff C3 C3 C Cff C3 C3 C C C3 Cgdalautotest-3.0.4/utilities/data/mstones.dbf0000644003401500001440000000047213614004467020731 0ustar rouaultusers_aidN posN **********18900.00000000000000 **********18100.00000000000000 **********16900.00000000000000 **********15900.00000000000000 **********14900.00000000000000 **********13700.00000000000000 **********12100.00000000000000gdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_129_upper_left.tif0000644003401500001440000000111213614004467025566 0ustar rouaultusersII*   S   * jz-32768`4"?f`4"?҅Cffffff?#  mtr@@TXAWGS 84|ABBBBBBAABAAABBAAA@@@@AAAA@@???@@@@???>>??????>>>>>>>>>>====>======<<<>====<<<<;>>===<<<;;>>>==<<<;;gdalautotest-3.0.4/utilities/data/grid.csv0000644003401500001440000002500413614004467020224 0ustar rouaultusers440750.000,3751290.000,107 440810.000,3751290.000,123 440870.000,3751290.000,132 440930.000,3751290.000,115 440990.000,3751290.000,132 441050.000,3751290.000,132 441110.000,3751290.000,140 441170.000,3751290.000,132 441230.000,3751290.000,132 441290.000,3751290.000,132 441350.000,3751290.000,107 441410.000,3751290.000,132 441470.000,3751290.000,107 441530.000,3751290.000,132 441590.000,3751290.000,132 441650.000,3751290.000,107 441710.000,3751290.000,123 441770.000,3751290.000,115 441830.000,3751290.000,156 441890.000,3751290.000,148 440750.000,3751230.000,115 440810.000,3751230.000,132 440870.000,3751230.000,107 440930.000,3751230.000,123 440990.000,3751230.000,148 441050.000,3751230.000,115 441110.000,3751230.000,165 441170.000,3751230.000,115 441230.000,3751230.000,140 441290.000,3751230.000,107 441350.000,3751230.000,123 441410.000,3751230.000,123 441470.000,3751230.000,99 441530.000,3751230.000,132 441590.000,3751230.000,123 441650.000,3751230.000,132 441710.000,3751230.000,132 441770.000,3751230.000,132 441830.000,3751230.000,99 441890.000,3751230.000,156 440750.000,3751170.000,115 440810.000,3751170.000,132 440870.000,3751170.000,140 440930.000,3751170.000,132 440990.000,3751170.000,123 441050.000,3751170.000,115 441110.000,3751170.000,140 441170.000,3751170.000,107 441230.000,3751170.000,140 441290.000,3751170.000,115 441350.000,3751170.000,132 441410.000,3751170.000,123 441470.000,3751170.000,107 441530.000,3751170.000,132 441590.000,3751170.000,132 441650.000,3751170.000,115 441710.000,3751170.000,115 441770.000,3751170.000,107 441830.000,3751170.000,115 441890.000,3751170.000,107 440750.000,3751110.000,148 440810.000,3751110.000,132 440870.000,3751110.000,123 440930.000,3751110.000,123 440990.000,3751110.000,115 441050.000,3751110.000,132 441110.000,3751110.000,132 441170.000,3751110.000,123 441230.000,3751110.000,115 441290.000,3751110.000,123 441350.000,3751110.000,115 441410.000,3751110.000,123 441470.000,3751110.000,107 441530.000,3751110.000,115 441590.000,3751110.000,148 441650.000,3751110.000,107 441710.000,3751110.000,115 441770.000,3751110.000,140 441830.000,3751110.000,115 441890.000,3751110.000,132 440750.000,3751050.000,132 440810.000,3751050.000,156 440870.000,3751050.000,132 440930.000,3751050.000,140 440990.000,3751050.000,132 441050.000,3751050.000,132 441110.000,3751050.000,115 441170.000,3751050.000,115 441230.000,3751050.000,115 441290.000,3751050.000,123 441350.000,3751050.000,148 441410.000,3751050.000,123 441470.000,3751050.000,165 441530.000,3751050.000,123 441590.000,3751050.000,132 441650.000,3751050.000,107 441710.000,3751050.000,107 441770.000,3751050.000,132 441830.000,3751050.000,156 441890.000,3751050.000,123 440750.000,3750990.000,189 440810.000,3750990.000,173 440870.000,3750990.000,173 440930.000,3750990.000,148 440990.000,3750990.000,148 441050.000,3750990.000,115 441110.000,3750990.000,148 441170.000,3750990.000,123 441230.000,3750990.000,107 441290.000,3750990.000,132 441350.000,3750990.000,115 441410.000,3750990.000,132 441470.000,3750990.000,156 441530.000,3750990.000,99 441590.000,3750990.000,123 441650.000,3750990.000,115 441710.000,3750990.000,132 441770.000,3750990.000,132 441830.000,3750990.000,206 441890.000,3750990.000,107 440750.000,3750930.000,197 440810.000,3750930.000,173 440870.000,3750930.000,148 440930.000,3750930.000,140 440990.000,3750930.000,140 441050.000,3750930.000,132 441110.000,3750930.000,99 441170.000,3750930.000,132 441230.000,3750930.000,123 441290.000,3750930.000,115 441350.000,3750930.000,140 441410.000,3750930.000,132 441470.000,3750930.000,132 441530.000,3750930.000,99 441590.000,3750930.000,132 441650.000,3750930.000,123 441710.000,3750930.000,132 441770.000,3750930.000,173 441830.000,3750930.000,123 441890.000,3750930.000,115 440750.000,3750870.000,148 440810.000,3750870.000,123 440870.000,3750870.000,148 440930.000,3750870.000,115 440990.000,3750870.000,148 441050.000,3750870.000,123 441110.000,3750870.000,140 441170.000,3750870.000,123 441230.000,3750870.000,107 441290.000,3750870.000,115 441350.000,3750870.000,132 441410.000,3750870.000,115 441470.000,3750870.000,107 441530.000,3750870.000,115 441590.000,3750870.000,99 441650.000,3750870.000,123 441710.000,3750870.000,99 441770.000,3750870.000,181 441830.000,3750870.000,99 441890.000,3750870.000,107 440750.000,3750810.000,123 440810.000,3750810.000,115 440870.000,3750810.000,132 440930.000,3750810.000,115 440990.000,3750810.000,123 441050.000,3750810.000,132 441110.000,3750810.000,115 441170.000,3750810.000,132 441230.000,3750810.000,132 441290.000,3750810.000,123 441350.000,3750810.000,123 441410.000,3750810.000,132 441470.000,3750810.000,99 441530.000,3750810.000,115 441590.000,3750810.000,99 441650.000,3750810.000,123 441710.000,3750810.000,132 441770.000,3750810.000,115 441830.000,3750810.000,115 441890.000,3750810.000,107 440750.000,3750750.000,140 440810.000,3750750.000,140 440870.000,3750750.000,99 440930.000,3750750.000,140 440990.000,3750750.000,99 441050.000,3750750.000,115 441110.000,3750750.000,123 441170.000,3750750.000,107 441230.000,3750750.000,132 441290.000,3750750.000,107 441350.000,3750750.000,115 441410.000,3750750.000,107 441470.000,3750750.000,115 441530.000,3750750.000,123 441590.000,3750750.000,132 441650.000,3750750.000,123 441710.000,3750750.000,107 441770.000,3750750.000,123 441830.000,3750750.000,132 441890.000,3750750.000,132 440750.000,3750690.000,132 440810.000,3750690.000,132 440870.000,3750690.000,132 440930.000,3750690.000,123 440990.000,3750690.000,99 441050.000,3750690.000,132 441110.000,3750690.000,123 441170.000,3750690.000,107 441230.000,3750690.000,148 441290.000,3750690.000,99 441350.000,3750690.000,115 441410.000,3750690.000,123 441470.000,3750690.000,140 441530.000,3750690.000,173 441590.000,3750690.000,123 441650.000,3750690.000,107 441710.000,3750690.000,123 441770.000,3750690.000,123 441830.000,3750690.000,123 441890.000,3750690.000,107 440750.000,3750630.000,123 440810.000,3750630.000,123 440870.000,3750630.000,123 440930.000,3750630.000,107 440990.000,3750630.000,140 441050.000,3750630.000,123 441110.000,3750630.000,123 441170.000,3750630.000,115 441230.000,3750630.000,115 441290.000,3750630.000,90 441350.000,3750630.000,107 441410.000,3750630.000,173 441470.000,3750630.000,107 441530.000,3750630.000,107 441590.000,3750630.000,107 441650.000,3750630.000,107 441710.000,3750630.000,99 441770.000,3750630.000,132 441830.000,3750630.000,123 441890.000,3750630.000,115 440750.000,3750570.000,173 440810.000,3750570.000,148 440870.000,3750570.000,99 440930.000,3750570.000,123 440990.000,3750570.000,123 441050.000,3750570.000,107 441110.000,3750570.000,123 441170.000,3750570.000,99 441230.000,3750570.000,107 441290.000,3750570.000,189 441350.000,3750570.000,173 441410.000,3750570.000,107 441470.000,3750570.000,115 441530.000,3750570.000,115 441590.000,3750570.000,107 441650.000,3750570.000,99 441710.000,3750570.000,140 441770.000,3750570.000,107 441830.000,3750570.000,173 441890.000,3750570.000,140 440750.000,3750510.000,148 440810.000,3750510.000,132 440870.000,3750510.000,132 440930.000,3750510.000,107 440990.000,3750510.000,123 441050.000,3750510.000,99 441110.000,3750510.000,99 441170.000,3750510.000,115 441230.000,3750510.000,99 441290.000,3750510.000,132 441350.000,3750510.000,99 441410.000,3750510.000,140 441470.000,3750510.000,115 441530.000,3750510.000,148 441590.000,3750510.000,123 441650.000,3750510.000,99 441710.000,3750510.000,132 441770.000,3750510.000,123 441830.000,3750510.000,148 441890.000,3750510.000,140 440750.000,3750450.000,140 440810.000,3750450.000,107 440870.000,3750450.000,140 440930.000,3750450.000,90 440990.000,3750450.000,107 441050.000,3750450.000,115 441110.000,3750450.000,107 441170.000,3750450.000,90 441230.000,3750450.000,99 441290.000,3750450.000,123 441350.000,3750450.000,115 441410.000,3750450.000,115 441470.000,3750450.000,115 441530.000,3750450.000,123 441590.000,3750450.000,123 441650.000,3750450.000,148 441710.000,3750450.000,115 441770.000,3750450.000,148 441830.000,3750450.000,99 441890.000,3750450.000,132 440750.000,3750390.000,165 440810.000,3750390.000,148 440870.000,3750390.000,156 440930.000,3750390.000,123 440990.000,3750390.000,107 441050.000,3750390.000,107 441110.000,3750390.000,107 441170.000,3750390.000,115 441230.000,3750390.000,140 441290.000,3750390.000,99 441350.000,3750390.000,115 441410.000,3750390.000,99 441470.000,3750390.000,99 441530.000,3750390.000,107 441590.000,3750390.000,115 441650.000,3750390.000,132 441710.000,3750390.000,115 441770.000,3750390.000,90 441830.000,3750390.000,123 441890.000,3750390.000,115 440750.000,3750330.000,189 440810.000,3750330.000,173 440870.000,3750330.000,140 440930.000,3750330.000,140 440990.000,3750330.000,165 441050.000,3750330.000,115 441110.000,3750330.000,132 441170.000,3750330.000,90 441230.000,3750330.000,99 441290.000,3750330.000,115 441350.000,3750330.000,90 441410.000,3750330.000,99 441470.000,3750330.000,99 441530.000,3750330.000,107 441590.000,3750330.000,99 441650.000,3750330.000,132 441710.000,3750330.000,99 441770.000,3750330.000,107 441830.000,3750330.000,132 441890.000,3750330.000,132 440750.000,3750270.000,156 440810.000,3750270.000,181 440870.000,3750270.000,140 440930.000,3750270.000,173 440990.000,3750270.000,123 441050.000,3750270.000,132 441110.000,3750270.000,99 441170.000,3750270.000,115 441230.000,3750270.000,123 441290.000,3750270.000,74 441350.000,3750270.000,115 441410.000,3750270.000,99 441470.000,3750270.000,123 441530.000,3750270.000,140 441590.000,3750270.000,156 441650.000,3750270.000,132 441710.000,3750270.000,165 441770.000,3750270.000,140 441830.000,3750270.000,140 441890.000,3750270.000,99 440750.000,3750210.000,173 440810.000,3750210.000,247 440870.000,3750210.000,255 440930.000,3750210.000,206 440990.000,3750210.000,132 441050.000,3750210.000,107 441110.000,3750210.000,140 441170.000,3750210.000,123 441230.000,3750210.000,148 441290.000,3750210.000,132 441350.000,3750210.000,165 441410.000,3750210.000,165 441470.000,3750210.000,148 441530.000,3750210.000,140 441590.000,3750210.000,132 441650.000,3750210.000,123 441710.000,3750210.000,107 441770.000,3750210.000,123 441830.000,3750210.000,107 441890.000,3750210.000,123 440750.000,3750150.000,181 440810.000,3750150.000,181 440870.000,3750150.000,156 440930.000,3750150.000,148 440990.000,3750150.000,156 441050.000,3750150.000,156 441110.000,3750150.000,156 441170.000,3750150.000,181 441230.000,3750150.000,132 441290.000,3750150.000,148 441350.000,3750150.000,115 441410.000,3750150.000,132 441470.000,3750150.000,107 441530.000,3750150.000,107 441590.000,3750150.000,107 441650.000,3750150.000,107 441710.000,3750150.000,107 441770.000,3750150.000,115 441830.000,3750150.000,99 441890.000,3750150.000,107 gdalautotest-3.0.4/utilities/data/color_file.txt0000644003401500001440000000020013614004467021427 0ustar rouaultusers500 255 255 255 450 235 220 175 300 190 185 135 150 240 250 150 76 50 180 50 75 200 230 255 -32768 200 230 255 gdalautotest-3.0.4/utilities/data/mstones.qpj0000644003401500001440000000040113614004467020760 0ustar rouaultusersGEOGCS["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"]] gdalautotest-3.0.4/utilities/data/utmsmall.tif.aux.xml0000644003401500001440000000230113614005324022503 0ustar rouaultusers -0.498046875 255.498046875 256 0 0 2|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 255 154.6212 0 54.250980733624 test value gdalautotest-3.0.4/utilities/data/cutline.vrt0000644003401500001440000000173213614004467020764 0ustar rouaultusers cutline.csv cutline wkbPolygon 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"]] gdalautotest-3.0.4/utilities/data/color_file.cpt0000644003401500001440000000026013614004467021404 0ustar rouaultusers# fake cpt file #COLOR_MODEL = RGB # 500 255 255 255 450 235 220 175 300 190 185 135 150 240 250 150 76 50 180 50 75 200 230 255 F 0 0 0 B 0 0 0 N 200 230 255 gdalautotest-3.0.4/utilities/data/path.prj0000644003401500001440000000021713614004467020232 0ustar rouaultusersGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]gdalautotest-3.0.4/utilities/data/unstable_rpc_with_dem_source.tif0000644003401500001440000001203513614004467025207 0ustar rouaultusersII*  E=S \} @@K7Q6@M\@ @@@qHP?0@ĭ?8l?% XLP^"޺_ a?-G#ЉpΠ?E>bճfuaqXA?(80a&?f;7o?O n Xt=2va-?|&z?/N?.s?UN0??jqj9xu+j?xH?BFf;8v?ybxfEc ?XG?~! K1겿WmC> =<7I_ž Qe[|.|J>QD')}q>rD#DHxǾ :V+IgпؿsUҿ6%?Bc?t?S^ V?Oָ?y8.?F wa#hb4v2lUE[9MQQ"? .FKM%r-?Ī3vuhN?G ?/1űT4=?tN5H맑?ah@?<:?2:%qNユj:w4>as?M)׳>'(1V bOO>]vax  oTx  o787hJgdalautotest-3.0.4/utilities/data/path.cpg0000644003401500001440000000000513614004467020203 0ustar rouaultusersUTF-8gdalautotest-3.0.4/utilities/data/unstable_rpc_with_dem_elevation.tif0000644003401500001440000000077113614004467025701 0ustar rouaultusersII*  z =S   " brx?w?@ \@\m'}Z6@#  mtr@@TXAWGS 84|x ~Y ?/ʰ2 Sfe8 T#21<;^ggfg1\d. ?AWh"u:U80gdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_129_lower_right.tif0000644003401500001440000000111213614004467025746 0ustar rouaultusersII*   S   * jz-32768f& 4"?`4"?}\v8TW!"?#  mtr@@TXAWGS 84|''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%gdalautotest-3.0.4/utilities/data/duplicatedfields.csv0000644003401500001440000000011413614004467022577 0ustar rouaultusersfoo,bar,foo,foo2,baz,foo val_foo,val_bar,val_foo3,val_foo2,val_baz,val_foo4 gdalautotest-3.0.4/utilities/data/test_bug_4326_to_3857.tif0000644003401500001440000000137613614004467022756 0ustar rouaultusersII*nS    VfApS? wG)}?2*_ce$5@#  mtr@@TXAWGS 84|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{skkkkksckgdalautotest-3.0.4/utilities/data/onepixelthematic.img0000644003401500001440000002077413614004467022633 0ustar rouaultusersEHFA_HEADER_TAG@RdE rootroot`IAE RRLayer_161412787Eimg_Layer`IA Ehfa_Layer12787Ehfa_Layer`IA0 n0Statistics12787Esta_Statistics`IA?????F(StatisticsParametersEimg_StatisticsParameters830`IADescriptor_TableersEdsc_TableticsParameters830`IAjlFN#Bin_Function#eersEdsc_BinFunctionrameters830`IAo@5FHistogramion#eersEdsc_Columntionrameters830`IAo FzFHistogramParametersEimg_StatisticsParameters830`IAo@opion,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{1:Cdata,}RasterDMS,.R IMGFormatInfo87ImgFormatInfo831`IA7f M 4RasterDMS12787Edms_State`IAc g y `IA  fMap_Info12787Eprj_MapInfo`IA Unknown 1 I ??a other?:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.8gdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_129_upper_right.tif0000644003401500001440000000111213614004467025751 0ustar rouaultusersII*   S   * jz-32768`4"?`4"?\x^2DD?#  mtr@@TXAWGS 84|%#! #!!          #""""""!! %%$$$###""gdalautotest-3.0.4/utilities/data/test_gdalwarp_lib_129_lower_left.tif0000644003401500001440000000111213614004467025563 0ustar rouaultusersII*   S   * jz-32768`4"?`4"?\x raO?#  mtr@@TXAWGS 84|~~~gdalautotest-3.0.4/utilities/data/unstable_rpc_with_dem_blank_output.tif0000644003401500001440000000251313614004467026416 0ustar rouaultusersII*|7O7=RS  0 DT Red Alpha .03@I&d'3@ e<5hAtuzCA 2 2#    ? )#@TXAmtr@PCS Name = WGS_1984_Web_Mercator_Auxiliary_Sphere|GCS_WGS_1984|ESRI PE String = PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Mercator_Auxiliary_Sphere"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Standard_Parallel_1",0.0],PARAMETER["Auxiliary_Sphere_Type",0.0],UNIT["Meter",1.0]]|xàSU|ugdalautotest-3.0.4/utilities/test_nearblack_lib.py0000755003401500001440000001221413614005324022025 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_nearblack_lib.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: nearblack testing # 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 ############################################################################### # Basic test def test_nearblack_lib_1(): src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') ds = gdal.Nearblack('', src_ds, format='MEM', maxNonBlack=0, nearDist=15) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 21106, 'Bad checksum band 1' assert ds.GetRasterBand(2).Checksum() == 20736, 'Bad checksum band 2' assert ds.GetRasterBand(3).Checksum() == 21309, 'Bad checksum band 3' src_gt = src_ds.GetGeoTransform() dst_gt = ds.GetGeoTransform() for i in range(6): assert abs(src_gt[i] - dst_gt[i]) <= 1e-10, 'Bad geotransform' dst_wkt = ds.GetProjectionRef() assert dst_wkt.find('AUTHORITY["EPSG","4326"]') != -1, 'Bad projection' src_ds = None ds = None ############################################################################### # Add alpha band def test_nearblack_lib_2(): ds = gdal.Nearblack('', '../gdrivers/data/rgbsmall.tif', format='MEM', maxNonBlack=0, setAlpha=True) assert ds is not None assert ds.GetRasterBand(4).Checksum() == 22002, 'Bad checksum band 0' ds = None ############################################################################### # Set existing alpha band def test_nearblack_lib_3(): src_ds = gdal.Nearblack('', '../gdrivers/data/rgbsmall.tif', format='MEM', maxNonBlack=0, setAlpha=True) ds = gdal.Nearblack('', src_ds, format='MEM', maxNonBlack=0, setAlpha=True) assert ds is not None assert ds.GetRasterBand(4).Checksum() == 22002, 'Bad checksum band 0' ds = None ############################################################################### # Test -white def test_nearblack_lib_4(): src_ds = gdal.Warp('', '../gdrivers/data/rgbsmall.tif', format='MEM', warpOptions=["INIT_DEST=255"], srcNodata=0) ds = gdal.Nearblack('', src_ds, format='MEM', white=True, maxNonBlack=0, setAlpha=True) assert ds is not None assert ds.GetRasterBand(4).Checksum() == 24151, 'Bad checksum band 0' ds = None ############################################################################### # Add mask band def test_nearblack_lib_5(): ds = gdal.Nearblack('/vsimem/test_nearblack_lib_5.tif', '../gdrivers/data/rgbsmall.tif', format='GTiff', maxNonBlack=0, setMask=True) assert ds is not None assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 22002, \ 'Bad checksum mask band' ds = None gdal.Unlink('/vsimem/test_nearblack_lib_5.tif') gdal.Unlink('/vsimem/test_nearblack_lib_5.tif.msk') ############################################################################### # Test -color def test_nearblack_lib_7(): ds = gdal.Nearblack('', 'data/whiteblackred.tif', format='MEM', colors=((0, 0, 0), (255, 255, 255))) assert ds is not None assert (ds.GetRasterBand(1).Checksum() == 418 and \ ds.GetRasterBand(2).Checksum() == 0 and \ ds.GetRasterBand(3).Checksum() == 0), 'Bad checksum' ds = None ############################################################################### # Test in-place update def test_nearblack_lib_8(): src_ds = gdal.Open('../gdrivers/data/rgbsmall.tif') ds = gdal.GetDriverByName('MEM').CreateCopy('', src_ds) ret = gdal.Nearblack(ds, ds, maxNonBlack=0) assert ret == 1 assert ds.GetRasterBand(1).Checksum() == 21106, 'Bad checksum band 1' assert ds.GetRasterBand(2).Checksum() == 20736, 'Bad checksum band 2' assert ds.GetRasterBand(3).Checksum() == 21309, 'Bad checksum band 3' gdalautotest-3.0.4/utilities/test_ogrtindex.py0000755003401500001440000002204613614005324021264 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_ogrtindex.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: ogrtindex testing # 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 ogr from osgeo import osr import ogrtest import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_ogrtindex_1(srs=None): if test_cli_utilities.get_ogrtindex_path() is None: pytest.skip() shape_drv = ogr.GetDriverByName('ESRI Shapefile') for basename in ['tileindex', 'point1', 'point2', 'point3', 'point4']: for extension in ['shp', 'dbf', 'shx', 'prj']: try: os.remove('tmp/%s.%s' % (basename, extension)) except OSError: pass shape_ds = shape_drv.CreateDataSource('tmp') shape_lyr = shape_ds.CreateLayer('point1', srs=srs) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(49 2)')) shape_lyr.CreateFeature(dst_feat) dst_feat.Destroy() shape_lyr = shape_ds.CreateLayer('point2', srs=srs) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(49 3)')) shape_lyr.CreateFeature(dst_feat) dst_feat.Destroy() shape_lyr = shape_ds.CreateLayer('point3', srs=srs) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(48 2)')) shape_lyr.CreateFeature(dst_feat) dst_feat.Destroy() shape_lyr = shape_ds.CreateLayer('point4', srs=srs) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(48 3)')) shape_lyr.CreateFeature(dst_feat) dst_feat.Destroy() shape_ds.Destroy() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_ogrtindex_path() + ' -skip_different_projection tmp/tileindex.shp tmp/point1.shp tmp/point2.shp tmp/point3.shp tmp/point4.shp') assert (err is None or err == ''), 'got error/warning' ds = ogr.Open('tmp/tileindex.shp') assert ds.GetLayer(0).GetFeatureCount() == 4, 'did not get expected feature count' if srs is not None: assert ds.GetLayer(0).GetSpatialRef() is not None and ds.GetLayer(0).GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), \ 'did not get expected spatial ref' else: assert ds.GetLayer(0).GetSpatialRef() is None, 'did not get expected spatial ref' expected_wkts = ['POLYGON ((49 2,49 2,49 2,49 2,49 2))', 'POLYGON ((49 3,49 3,49 3,49 3,49 3))', 'POLYGON ((48 2,48 2,48 2,48 2,48 2))', 'POLYGON ((48 3,48 3,48 3,48 3,48 3))'] i = 0 feat = ds.GetLayer(0).GetNextFeature() while feat is not None: assert feat.GetGeometryRef().ExportToWkt() == expected_wkts[i], \ ('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) i = i + 1 feat = ds.GetLayer(0).GetNextFeature() ds.Destroy() ############################################################################### # Same test but with a SRS set on the different tiles to index def test_ogrtindex_2(): srs = osr.SpatialReference() srs.ImportFromEPSG(4326) return test_ogrtindex_1(srs) ############################################################################### # Test -src_srs_name, -src_srs_format and -t_srs def test_ogrtindex_3(): if test_cli_utilities.get_ogrtindex_path() is None: pytest.skip() shape_drv = ogr.GetDriverByName('ESRI Shapefile') for basename in ['tileindex', 'point1', 'point2', 'point3', 'point4']: for extension in ['shp', 'dbf', 'shx', 'prj']: try: os.remove('tmp/%s.%s' % (basename, extension)) except OSError: pass shape_ds = shape_drv.CreateDataSource('tmp') srs_4326 = osr.SpatialReference() srs_4326.ImportFromEPSG(4326) wkt_epsg_4326 = srs_4326.ExportToWkt() srs_32631 = osr.SpatialReference() srs_32631.ImportFromEPSG(32631) wkt_epsg_32631 = srs_32631.ExportToWkt() shape_lyr = shape_ds.CreateLayer('point1', srs=srs_4326) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) shape_lyr.CreateFeature(dst_feat) shape_lyr = shape_ds.CreateLayer('point2', srs=srs_32631) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 5538630.70286887)')) shape_lyr.CreateFeature(dst_feat) shape_ds = None for (src_srs_format, expected_srss) in [ ('', ['EPSG:4326', 'EPSG:32631']), ('-src_srs_format AUTO', ['EPSG:4326', 'EPSG:32631']), ('-src_srs_format EPSG', ['EPSG:4326', 'EPSG:32631']), ('-src_srs_format PROJ', ['+proj=longlat +datum=WGS84 +no_defs', '+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs']), ('-src_srs_format WKT', [wkt_epsg_4326, wkt_epsg_32631]) ]: if os.path.exists('tmp/tileindex.shp'): shape_drv.DeleteDataSource('tmp/tileindex.shp') if os.path.exists('tmp/tileindex.db'): os.unlink('tmp/tileindex.db') output_filename = 'tmp/tileindex.shp' output_format = '' if src_srs_format == '-src_srs_format WKT': if ogr.GetDriverByName('SQLite') is None: continue output_filename = 'tmp/tileindex.db' output_format = ' -f SQLite' (_, err) = gdaltest.runexternal_out_and_err( test_cli_utilities.get_ogrtindex_path() + ' -src_srs_name src_srs -t_srs EPSG:4326 ' + output_filename + ' tmp/point1.shp tmp/point2.shp ' + src_srs_format + output_format) assert src_srs_format == '-src_srs_format WKT' or (err is None or err == ''), \ 'got error/warning' ds = ogr.Open(output_filename) assert ds.GetLayer(0).GetFeatureCount() == 2, \ 'did not get expected feature count' assert ds.GetLayer(0).GetSpatialRef().GetAuthorityCode(None) == '4326', \ 'did not get expected spatial ref' expected_wkts = ['POLYGON ((2 49,2 49,2 49,2 49,2 49))', 'POLYGON ((3 50,3 50,3 50,3 50,3 50))'] i = 0 feat = ds.GetLayer(0).GetNextFeature() while feat is not None: if feat.GetField('src_srs') != expected_srss[i]: feat.DumpReadable() pytest.fail(i, src_srs_format) assert ogrtest.check_feature_geometry(feat, expected_wkts[i]) == 0, \ ('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) i = i + 1 feat = ds.GetLayer(0).GetNextFeature() ds = None if os.path.exists('tmp/tileindex.shp'): shape_drv.DeleteDataSource('tmp/tileindex.shp') if os.path.exists('tmp/tileindex.db'): os.unlink('tmp/tileindex.db') ############################################################################### # Cleanup def test_ogrtindex_cleanup(): if test_cli_utilities.get_ogrtindex_path() is None: pytest.skip() shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_drv.DeleteDataSource('tmp/tileindex.shp') shape_drv.DeleteDataSource('tmp/point1.shp') shape_drv.DeleteDataSource('tmp/point2.shp') if os.path.exists('tmp/point3.shp'): shape_drv.DeleteDataSource('tmp/point3.shp') if os.path.exists('tmp/point4.shp'): shape_drv.DeleteDataSource('tmp/point4.shp') gdalautotest-3.0.4/utilities/test_gdaltindex.py0000755003401500001440000002574413614005324021414 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdaltindex.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdaltindex testing # 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 ogr from osgeo import osr import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_gdaltindex_1(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() try: os.remove('tmp/tileindex.shp') except OSError: pass try: os.remove('tmp/tileindex.dbf') except OSError: pass try: os.remove('tmp/tileindex.shx') except OSError: pass try: os.remove('tmp/tileindex.prj') except OSError: pass drv = gdal.GetDriverByName('GTiff') wkt = '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\"]]' ds = drv.Create('tmp/gdaltindex1.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([49, 0.1, 0, 2, 0, -0.1]) ds = None ds = drv.Create('tmp/gdaltindex2.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([49, 0.1, 0, 3, 0, -0.1]) ds = None ds = drv.Create('tmp/gdaltindex3.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([48, 0.1, 0, 2, 0, -0.1]) ds = None ds = drv.Create('tmp/gdaltindex4.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([48, 0.1, 0, 3, 0, -0.1]) ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' tmp/tileindex.shp tmp/gdaltindex1.tif tmp/gdaltindex2.tif') assert (err is None or err == ''), 'got error/warning' (ret_stdout, ret_stderr) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' tmp/tileindex.shp tmp/gdaltindex3.tif tmp/gdaltindex4.tif') ds = ogr.Open('tmp/tileindex.shp') if ds.GetLayer(0).GetFeatureCount() != 4: print(ret_stdout) pytest.fail(ret_stderr) tileindex_wkt = ds.GetLayer(0).GetSpatialRef().ExportToWkt() if tileindex_wkt.find('WGS_1984') == -1: print(ret_stdout) pytest.fail(ret_stderr) expected_wkts = ['POLYGON ((49 2,50 2,50 1,49 1,49 2))', 'POLYGON ((49 3,50 3,50 2,49 2,49 3))', 'POLYGON ((48 2,49 2,49 1,48 1,48 2))', 'POLYGON ((48 3,49 3,49 2,48 2,48 3))'] i = 0 feat = ds.GetLayer(0).GetNextFeature() while feat is not None: assert feat.GetGeometryRef().ExportToWkt() == expected_wkts[i], \ ('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) i = i + 1 feat = ds.GetLayer(0).GetNextFeature() ds.Destroy() ############################################################################### # Try adding the same rasters again def test_gdaltindex_2(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() (_, ret_stderr) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' tmp/tileindex.shp tmp/gdaltindex1.tif tmp/gdaltindex2.tif tmp/gdaltindex3.tif tmp/gdaltindex4.tif') assert (not (ret_stderr.find('File tmp/gdaltindex1.tif is already in tileindex. Skipping it.') == -1 or \ ret_stderr.find('File tmp/gdaltindex2.tif is already in tileindex. Skipping it.') == -1 or \ ret_stderr.find('File tmp/gdaltindex3.tif is already in tileindex. Skipping it.') == -1 or \ ret_stderr.find('File tmp/gdaltindex4.tif is already in tileindex. Skipping it.') == -1)), \ 'got unexpected error messages.' ds = ogr.Open('tmp/tileindex.shp') assert ds.GetLayer(0).GetFeatureCount() == 4 ds.Destroy() ############################################################################### # Try adding a raster in another projection with -skip_different_projection # 5th tile should NOT be inserted def test_gdaltindex_3(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') wkt = """GEOGCS["WGS 72", DATUM["WGS_1972", SPHEROID["WGS 72",6378135,298.26], TOWGS84[0,0,4.5,0,0,0.554,0.2263]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" ds = drv.Create('tmp/gdaltindex5.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([47, 0.1, 0, 2, 0, -0.1]) ds = None (_, ret_stderr) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' -skip_different_projection tmp/tileindex.shp tmp/gdaltindex5.tif') assert (not (ret_stderr.find('Warning : tmp/gdaltindex5.tif is not using the same projection system as other files in the tileindex.') == -1 or \ ret_stderr.find('Use -t_srs option to set target projection system (not supported by MapServer).') == -1)), \ ('got unexpected error message \n[%s]' % (ret_stderr)) ds = ogr.Open('tmp/tileindex.shp') assert ds.GetLayer(0).GetFeatureCount() == 4 ds.Destroy() ############################################################################### # Try adding a raster in another projection with -t_srs # 5th tile should be inserted, will not be if there is a srs transformation error def test_gdaltindex_4(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') wkt = """GEOGCS["WGS 72", DATUM["WGS_1972", SPHEROID["WGS 72",6378135,298.26], TOWGS84[0,0,4.5,0,0,0.554,0.2263]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""" ds = drv.Create('tmp/gdaltindex5.tif', 10, 10, 1) ds.SetProjection(wkt) ds.SetGeoTransform([47, 0.1, 0, 2, 0, -0.1]) ds = None gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' -t_srs EPSG:4326 tmp/tileindex.shp tmp/gdaltindex5.tif') ds = ogr.Open('tmp/tileindex.shp') assert ds.GetLayer(0).GetFeatureCount() == 5, \ ('got %d features, expecting 5' % ds.GetLayer(0).GetFeatureCount()) ds.Destroy() ############################################################################### # Test -src_srs_name, -src_srs_format options def test_gdaltindex_5(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() drv = gdal.GetDriverByName('GTiff') ds = drv.Create('tmp/gdaltindex6.tif', 10, 10, 1) sr = osr.SpatialReference() sr.ImportFromEPSG(4322) ds.SetProjection(sr.ExportToWkt()) ds.SetGeoTransform([47, 0.1, 0, 2, 0, -0.1]) ds = None for src_srs_format in ['', '-src_srs_format AUTO', '-src_srs_format EPSG', '-src_srs_format PROJ', '-src_srs_format WKT']: gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_gdaltindex_5.shp') gdal.PopErrorHandler() gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' -src_srs_name src_srs %s -t_srs EPSG:4326 tmp/test_gdaltindex_5.shp tmp/gdaltindex1.tif tmp/gdaltindex6.tif' % src_srs_format) ds = ogr.Open('tmp/test_gdaltindex_5.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2, \ ('got %d features, expecting 2' % ds.GetLayer(0).GetFeatureCount()) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() if src_srs_format == '-src_srs_format PROJ': if feat.GetField('src_srs').find('+proj=longlat +ellps=WGS72') != 0: feat.DumpReadable() pytest.fail() elif src_srs_format == '-src_srs_format WKT': #if feat.GetField('src_srs').find('GEOGCS["WGS 72"') != 0: # Full definition too long... if feat.GetField('src_srs') is not None: feat.DumpReadable() pytest.fail() else: if feat.GetField('src_srs') != 'EPSG:4322': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test -f, -lyr_name def test_gdaltindex_6(): if test_cli_utilities.get_gdaltindex_path() is None: pytest.skip() for option in ['', '-lyr_name tileindex']: gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_gdaltindex_6.mif') gdal.PopErrorHandler() gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaltindex_path() + ' -f "MapInfo File" %s tmp/test_gdaltindex_6.mif tmp/gdaltindex1.tif' % option) ds = ogr.Open('tmp/test_gdaltindex_6.mif') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1, \ ('got %d features, expecting 1' % lyr.GetFeatureCount()) ds = None ############################################################################### # Cleanup def test_gdaltindex_cleanup(): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/tileindex.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test_gdaltindex_5.shp') ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/test_gdaltindex_6.mif') drv = gdal.GetDriverByName('GTiff') drv.Delete('tmp/gdaltindex1.tif') drv.Delete('tmp/gdaltindex2.tif') drv.Delete('tmp/gdaltindex3.tif') drv.Delete('tmp/gdaltindex4.tif') drv.Delete('tmp/gdaltindex5.tif') drv.Delete('tmp/gdaltindex6.tif') gdalautotest-3.0.4/utilities/test_gdalwarp.py0000755003401500001440000013775213614005324021075 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalwarp.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdalwarp testing # 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 stat from osgeo import gdal import gdaltest import test_cli_utilities import pytest ############################################################################### # Simple test def test_gdalwarp_1(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/byte.tif tmp/testgdalwarp1.tif') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/testgdalwarp1.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -of option def test_gdalwarp_2(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -of GTiff ../gcore/data/byte.tif tmp/testgdalwarp2.tif') ds = gdal.Open('tmp/testgdalwarp2.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -ot option def test_gdalwarp_3(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ot Int16 ../gcore/data/byte.tif tmp/testgdalwarp3.tif') ds = gdal.Open('tmp/testgdalwarp3.tif') assert ds is not None assert ds.GetRasterBand(1).DataType == gdal.GDT_Int16, 'Bad data type' assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -t_srs option def test_gdalwarp_4(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs EPSG:32611 ../gcore/data/byte.tif tmp/testgdalwarp4.tif') ds = gdal.Open('tmp/testgdalwarp4.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test warping from GCPs without any explicit option def test_gdalwarp_5(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -a_srs EPSG:26711 -gcp 0 0 440720.000 3751320.000 -gcp 20 0 441920.000 3751320.000 -gcp 20 20 441920.000 3750120.000 0 -gcp 0 20 440720.000 3750120.000 ../gcore/data/byte.tif tmp/testgdalwarp_gcp.tif') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/testgdalwarp_gcp.tif tmp/testgdalwarp5.tif') ds = gdal.Open('tmp/testgdalwarp5.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test warping from GCPs with -tps def test_gdalwarp_6(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -tps tmp/testgdalwarp_gcp.tif tmp/testgdalwarp6.tif') ds = gdal.Open('tmp/testgdalwarp6.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -tr def test_gdalwarp_7(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -tr 120 120 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp7.tif') ds = gdal.Open('tmp/testgdalwarp7.tif') assert ds is not None expected_gt = (440720.0, 120.0, 0.0, 3751320.0, 0.0, -120.0) assert gdaltest.geotransform_equals(expected_gt, ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -ts def test_gdalwarp_8(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 10 10 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp8.tif') ds = gdal.Open('tmp/testgdalwarp8.tif') assert ds is not None expected_gt = (440720.0, 120.0, 0.0, 3751320.0, 0.0, -120.0) assert gdaltest.geotransform_equals(expected_gt, ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -te def test_gdalwarp_9(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -te 440720.000 3750120.000 441920.000 3751320.000 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp9.tif') ds = gdal.Open('tmp/testgdalwarp9.tif') assert ds is not None assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -rn def test_gdalwarp_10(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 40 40 -rn tmp/testgdalwarp_gcp.tif tmp/testgdalwarp10.tif') ds = gdal.Open('tmp/testgdalwarp10.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test -rb def test_gdalwarp_11(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 40 40 -rb tmp/testgdalwarp_gcp.tif tmp/testgdalwarp11.tif') ds = gdal.Open('tmp/testgdalwarp11.tif') assert ds is not None ref_ds = gdal.Open('ref_data/testgdalwarp11.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) ref_ds = None if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) pytest.fail('Image too different from reference') ds = None ############################################################################### # Test -rc def test_gdalwarp_12(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 40 40 -rc tmp/testgdalwarp_gcp.tif tmp/testgdalwarp12.tif') ds = gdal.Open('tmp/testgdalwarp12.tif') assert ds is not None ref_ds = gdal.Open('ref_data/testgdalwarp12.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) ref_ds = None pytest.fail('Image too different from reference') ds = None ref_ds = None ############################################################################### # Test -rcs def test_gdalwarp_13(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 40 40 -rcs tmp/testgdalwarp_gcp.tif tmp/testgdalwarp13.tif') ds = gdal.Open('tmp/testgdalwarp13.tif') assert ds is not None ref_ds = gdal.Open('ref_data/testgdalwarp13.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ref_ds = None assert maxdiff <= 1, 'Image too different from reference' ds = None ############################################################################### # Test -r lanczos def test_gdalwarp_14(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 40 40 -r lanczos tmp/testgdalwarp_gcp.tif tmp/testgdalwarp14.tif') ds = gdal.Open('tmp/testgdalwarp14.tif') assert ds is not None ref_ds = gdal.Open('ref_data/testgdalwarp14.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds) ref_ds = None assert maxdiff <= 1, 'Image too different from reference' ds = None ############################################################################### # Test -dstnodata def test_gdalwarp_15(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -dstnodata 1 -t_srs EPSG:32610 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp15.tif') ds = gdal.Open('tmp/testgdalwarp15.tif') assert ds is not None assert ds.GetRasterBand(1).GetNoDataValue() == 1, 'Bad nodata value' assert ds.GetRasterBand(1).Checksum() == 4523, 'Bad checksum' ds = None ############################################################################### # Test -of VRT which is a special case def test_gdalwarp_16(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -of VRT tmp/testgdalwarp_gcp.tif tmp/testgdalwarp16.vrt') ds = gdal.Open('tmp/testgdalwarp16.vrt') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -dstalpha def test_gdalwarp_17(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -dstalpha ../gcore/data/rgbsmall.tif tmp/testgdalwarp17.tif') ds = gdal.Open('tmp/testgdalwarp17.tif') assert ds is not None assert ds.GetRasterBand(4) is not None, 'No alpha band generated' ds = None ############################################################################### # Test -wm -multi def test_gdalwarp_18(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() (_, ret_stderr) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalwarp_path() + ' -wm 20 -multi ../gcore/data/byte.tif tmp/testgdalwarp18.tif') # This error will be returned if GDAL is not compiled with thread support if ret_stderr.find('CPLCreateThread() failed in ChunkAndWarpMulti()') != -1: pytest.skip('GDAL not compiled with thread support') ds = gdal.Open('tmp/testgdalwarp18.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -et 0 which is a special case def test_gdalwarp_19(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -et 0 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp19.tif') ds = gdal.Open('tmp/testgdalwarp19.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test -of VRT -et 0 which is a special case def test_gdalwarp_20(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -of VRT -et 0 tmp/testgdalwarp_gcp.tif tmp/testgdalwarp20.vrt') ds = gdal.Open('tmp/testgdalwarp20.vrt') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test cutline from OGR datasource. def test_gdalwarp_21(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/utmsmall.tif tmp/testgdalwarp21.tif -cutline data/cutline.vrt -cl cutline') ds = gdal.Open('tmp/testgdalwarp21.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 19139, 'Bad checksum' ds = None ############################################################################### # Test with a cutline and an output at a different resolution. def test_gdalwarp_22(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/utmsmall.tif tmp/testgdalwarp22.tif -cutline data/cutline.vrt -cl cutline -tr 30 30') ds = gdal.Open('tmp/testgdalwarp22.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 14047, 'Bad checksum' ds = None ############################################################################### # Test cutline with ALL_TOUCHED enabled. def test_gdalwarp_23(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -wo CUTLINE_ALL_TOUCHED=TRUE ../gcore/data/utmsmall.tif tmp/testgdalwarp23.tif -cutline data/cutline.vrt -cl cutline') ds = gdal.Open('tmp/testgdalwarp23.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 20123, 'Bad checksum' ds = None ############################################################################### # Test warping an image crossing the 180E/180W longitude (#3206) def test_gdalwarp_24(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() ds = gdal.GetDriverByName('GTiff').Create('tmp/testgdalwarp24src.tif', 100, 100) ds.SetGeoTransform([179.5, 0.01, 0, 45, 0, -0.01]) ds.SetProjection('GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]') ds.GetRasterBand(1).Fill(255) ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs EPSG:32660 tmp/testgdalwarp24src.tif tmp/testgdalwarp24dst.tif') ds = gdal.Open('tmp/testgdalwarp24dst.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 50634, 'Bad checksum' ds = None ############################################################################### # Test warping a full EPSG:4326 extent to +proj=sinu (#2305) def test_gdalwarp_25(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs "+proj=sinu" data/w_jpeg.tiff tmp/testgdalwarp25.tif') ds = gdal.Open('tmp/testgdalwarp25.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 8016 or cs == 6157, 'Bad checksum' gt = ds.GetGeoTransform() expected_gt = [-20037508.342789248, 78245.302611923355, 0.0, 10001965.729313632, 0.0, -77939.656898595524] for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1, 'Bad gt' ds = None ############################################################################### # Test warping a full EPSG:4326 extent to +proj=eck4 (#2305) def test_gdalwarp_26(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs "+proj=eck4" data/w_jpeg.tiff tmp/testgdalwarp26.tif') ds = gdal.Open('tmp/testgdalwarp26.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 8582 or cs == 3938, 'Bad checksum' gt = ds.GetGeoTransform() expected_gt = [-16921202.922943164, 41752.719393322564, 0.0, 8460601.4614715818, 0.0, -41701.109109770863] for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1, 'Bad gt' ds = None ############################################################################### # Test warping a full EPSG:4326 extent to +proj=vandg (#2305) def test_gdalwarp_27(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs "+proj=vandg" data/w_jpeg.tiff tmp/testgdalwarp27.tif -overwrite') ds = gdal.Open('tmp/testgdalwarp27.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() # 22615 for MacOSX assert cs == 22006 or cs == 22615, 'Bad checksum' gt = ds.GetGeoTransform() expected_gt = [-20015109.356056381, 98651.645855415176, 0.0, 20015109.356056374, 0.0, -98651.645855415176] for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1, 'Bad gt' ds = None ############################################################################### # Test warping a full EPSG:4326 extent to +proj=aeqd +lat_0=45 +lon_0=90 (#2305) def test_gdalwarp_28(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs "+proj=aeqd +lat_0=45 +lon_0=90" data/w_jpeg.tiff tmp/testgdalwarp28.tif') ds = gdal.Open('tmp/testgdalwarp28.tif') assert ds is not None # Check that there is no hole at the south pole location cs = ds.GetRasterBand(1).Checksum() # 1219 for MacOSX assert cs in (1794,1219), 'Bad checksum' gt = ds.GetGeoTransform() expected_gt1 = [-18494092.97555049, 93907.15126464187, 0.0, 20003931.458625447, 0.0, -93907.15126464187] for i in range(6): assert abs(gt[i] - expected_gt1[i]) <= 1 , \ ('Bad gt', gt) ds = None ############################################################################### # Test warping a full EPSG:4326 extent to EPSG:3785 (#2305) def test_gdalwarp_29(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -t_srs EPSG:3785 data/w_jpeg.tiff tmp/testgdalwarp29.tif') ds = gdal.Open('tmp/testgdalwarp29.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 55149 or cs == 56054, 'Bad checksum' gt = ds.GetGeoTransform() expected_gt = [-20037508.342789248, 90054.726863985939, 0.0, 16213801.067583967, 0.0, -90056.750611190684] for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1, 'Bad gt' ds = None ############################################################################### # Test the effect of the -wo OPTIMIZE_SIZE=TRUE and -wo STREAMABLE_OUTPUT=TRUE options (#3459, #1866) def test_gdalwarp_30(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() # First run : no parameter gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + " data/w_jpeg.tiff tmp/testgdalwarp30_1.tif -t_srs EPSG:3785 -co COMPRESS=LZW -wm 500000 --config GDAL_CACHEMAX 1 -ts 1000 500 -co TILED=YES") # Second run : with -wo OPTIMIZE_SIZE=TRUE gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + " data/w_jpeg.tiff tmp/testgdalwarp30_2.tif -t_srs EPSG:3785 -co COMPRESS=LZW -wm 500000 -wo OPTIMIZE_SIZE=TRUE --config GDAL_CACHEMAX 1 -ts 1000 500 -co TILED=YES") # Third run : with -wo STREAMABLE_OUTPUT=TRUE gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + " data/w_jpeg.tiff tmp/testgdalwarp30_3.tif -t_srs EPSG:3785 -co COMPRESS=LZW -wm 500000 -wo STREAMABLE_OUTPUT=TRUE --config GDAL_CACHEMAX 1 -ts 1000 500 -co TILED=YES") file_size1 = os.stat('tmp/testgdalwarp30_1.tif')[stat.ST_SIZE] file_size2 = os.stat('tmp/testgdalwarp30_2.tif')[stat.ST_SIZE] file_size3 = os.stat('tmp/testgdalwarp30_3.tif')[stat.ST_SIZE] ds = gdal.Open('tmp/testgdalwarp30_1.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 64629 or cs == 1302, 'Bad checksum on testgdalwarp30_1' ds = None ds = gdal.Open('tmp/testgdalwarp30_2.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 64629 or cs == 1302, 'Bad checksum on testgdalwarp30_2' ds = None ds = gdal.Open('tmp/testgdalwarp30_3.tif') assert ds is not None cs = ds.GetRasterBand(1).Checksum() assert cs == 64629 or cs == 1302, 'Bad checksum on testgdalwarp30_3' ds = None assert file_size1 > file_size2, \ 'Size with -wo OPTIMIZE_SIZE=TRUE larger than without !' assert file_size1 > file_size3, \ 'Size with -wo STREAMABLE_OUTPUT=TRUE larger than without !' ############################################################################### # Test -overwrite (#3759) def test_gdalwarp_31(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + " ../gcore/data/byte.tif tmp/testgdalwarp31.tif") ds = gdal.Open('tmp/testgdalwarp31.tif') cs1 = ds.GetRasterBand(1).Checksum() ds = None (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalwarp_path() + " ../gcore/data/byte.tif tmp/testgdalwarp31.tif -t_srs EPSG:4326") ds = gdal.Open('tmp/testgdalwarp31.tif') cs2 = ds.GetRasterBand(1).Checksum() ds = None (_, err2) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalwarp_path() + " ../gcore/data/byte.tif tmp/testgdalwarp31.tif -t_srs EPSG:4326 -overwrite") ds = gdal.Open('tmp/testgdalwarp31.tif') cs3 = ds.GetRasterBand(1).Checksum() ds = None assert cs1 == 4672 and cs2 == 4672 and cs3 == 4727 and err != '' and err2 == '' ############################################################################### # Test -tap def test_gdalwarp_32(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdalwarp_path() + ' -tap ../gcore/data/byte.tif tmp/testgdalwarp32.tif', check_memleak=False) assert err.find('-tap option cannot be used without using -tr') != -1, \ 'expected error' gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -tr 100 50 -tap ../gcore/data/byte.tif tmp/testgdalwarp32.tif') ds = gdal.Open('tmp/testgdalwarp32.tif') assert ds is not None expected_gt = (440700.0, 100.0, 0.0, 3751350.0, 0.0, -50.0) got_gt = ds.GetGeoTransform() assert gdaltest.geotransform_equals(expected_gt, got_gt, 1e-9), 'Bad geotransform' assert ds.RasterXSize == 13 and ds.RasterYSize == 25, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) ds = None ############################################################################### # Test warping a JPEG compressed image with a mask into a RGBA image def test_gdalwarp_33(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -dstalpha ../gcore/data/ycbcr_with_mask.tif tmp/testgdalwarp33.tif') src_ds = gdal.Open('../gcore/data/ycbcr_with_mask.tif') ds = gdal.Open('tmp/testgdalwarp33.tif') assert ds is not None # There are expected diffs because of the artifacts due to JPEG compression in 8x8 blocks # that are partially masked. gdalwarp will remove those artifacts max_diff = gdaltest.compare_ds(src_ds, ds) assert max_diff <= 40 src_ds = None gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' -expand gray GTIFF_DIR:2:../gcore/data/ycbcr_with_mask.tif tmp/testgdalwarp33_mask.tif') mask_ds = gdal.Open('tmp/testgdalwarp33_mask.tif') expected_cs = mask_ds.GetRasterBand(1).Checksum() mask_ds = None cs = ds.GetRasterBand(4).Checksum() ds = None assert cs == expected_cs, 'did not get expected checksum on alpha band' ############################################################################### # Test warping multiple sources def test_gdalwarp_34(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() try: os.remove('tmp/testgdalwarp34.tif') except OSError: pass gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif tmp/testgdalwarp34src_1.tif -srcwin 0 0 10 20') gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gcore/data/byte.tif tmp/testgdalwarp34src_2.tif -srcwin 10 0 10 20') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/testgdalwarp34src_1.tif tmp/testgdalwarp34src_2.tif tmp/testgdalwarp34.tif') os.remove('tmp/testgdalwarp34src_1.tif') os.remove('tmp/testgdalwarp34src_2.tif') ds = gdal.Open('tmp/testgdalwarp34.tif') cs = ds.GetRasterBand(1).Checksum() gt = ds.GetGeoTransform() xsize = ds.RasterXSize ysize = ds.RasterYSize ds = None os.remove('tmp/testgdalwarp34.tif') assert xsize == 20 and ysize == 20, 'bad dimensions' assert cs == 4672, 'bad checksum' expected_gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1e-5, 'bad gt' ############################################################################### # Test -ts and -te optimization (doesn't need calling GDALSuggestedWarpOutput2, #4804) def test_gdalwarp_35(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -ts 20 20 -te 440720.000 3750120.000 441920.000 3751320.000 ../gcore/data/byte.tif tmp/testgdalwarp35.tif') ds = gdal.Open('tmp/testgdalwarp35.tif') assert ds is not None assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -tr and -te optimization (doesn't need calling GDALSuggestedWarpOutput2, #4804) def test_gdalwarp_36(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -tr 60 60 -te 440720.000 3750120.000 441920.000 3751320.000 ../gcore/data/byte.tif tmp/testgdalwarp36.tif') ds = gdal.Open('tmp/testgdalwarp36.tif') assert ds is not None assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test metadata copying - stats should not be copied (#5319) def test_gdalwarp_37(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -tr 60 60 ./data/utmsmall.tif tmp/testgdalwarp37.tif') ds = gdal.Open('tmp/testgdalwarp37.tif') assert ds is not None md = ds.GetRasterBand(1).GetMetadata() # basic metadata test assert 'testkey' in md and md['testkey'] == 'test value', \ ('Output file metadata is wrong : { %s }' % md) # make sure stats not copied assert 'STATISTICS_MEAN' not in md, 'Output file contains statistics metadata' assert ds.GetRasterBand(1).GetMinimum() is None, 'Output file has statistics' ds = None ############################################################################### # Test implicit nodata setting (#5675) def test_gdalwarp_38(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' data/withnodata.asc tmp/testgdalwarp38.tif') ds = gdal.Open('tmp/testgdalwarp38.tif') assert ds.GetRasterBand(1).Checksum() == 65531 assert ds.GetRasterBand(1).GetNoDataValue() == -999 ds = None ############################################################################### # Test -oo def test_gdalwarp_39(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gdrivers/data/float64.asc tmp/test_gdalwarp_39.tif -oo DATATYPE=Float64 -overwrite') ds = gdal.Open('tmp/test_gdalwarp_39.tif') assert ds.GetRasterBand(1).DataType == gdal.GDT_Float64 ds = None ############################################################################### # Test -ovr def test_gdalwarp_40(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() src_ds = gdal.Open('../gcore/data/byte.tif') out_ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/test_gdalwarp_40_src.tif', src_ds) cs_main = out_ds.GetRasterBand(1).Checksum() out_ds.BuildOverviews('NONE', overviewlist=[2, 4]) out_ds.GetRasterBand(1).GetOverview(0).Fill(127) cs_ov0 = out_ds.GetRasterBand(1).GetOverview(0).Checksum() out_ds.GetRasterBand(1).GetOverview(1).Fill(255) cs_ov1 = out_ds.GetRasterBand(1).GetOverview(1).Checksum() out_ds = None # Should select main resolution gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == cs_main ds = None # Test -ovr AUTO. Should select main resolution gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ovr AUTO') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == cs_main ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/byte.tif tmp/test_gdalwarp_40.tif -overwrite -ts 5 5') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Test -ovr NONE. Should select main resolution too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ovr NONE -ts 5 5') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/byte.tif tmp/test_gdalwarp_40.tif -overwrite -ts 15 15') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Should select main resolution too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 15 15') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None # Should select overview 0 gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 10 10') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == cs_ov0 ds = None # Should select overview 0 through VRT gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.vrt -overwrite -ts 10 10 -of VRT') ds = gdal.Open('tmp/test_gdalwarp_40.vrt') assert ds.GetRasterBand(1).Checksum() == cs_ov0 ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif -oo OVERVIEW_LEVEL=0 tmp/test_gdalwarp_40.tif -overwrite -ts 7 7') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Should select overview 0 too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 7 7') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif -ovr NONE -oo OVERVIEW_LEVEL=0 tmp/test_gdalwarp_40.tif -overwrite -ts 5 5') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Test AUTO-n. Should select overview 0 too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 5 5 -ovr AUTO-1') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None # Should select overview 1 gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 5 5') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == cs_ov1 ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif -oo OVERVIEW_LEVEL=1 tmp/test_gdalwarp_40.tif -overwrite -ts 3 3') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Should select overview 1 too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ts 3 3') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif -oo OVERVIEW_LEVEL=1 tmp/test_gdalwarp_40.tif -overwrite -ts 20 20') ds = gdal.Open('tmp/test_gdalwarp_40.tif') expected_cs = ds.GetRasterBand(1).Checksum() ds = None # Specify a level >= number of overviews. Should select overview 1 too gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_40_src.tif tmp/test_gdalwarp_40.tif -overwrite -ovr 5') ds = gdal.Open('tmp/test_gdalwarp_40.tif') assert ds.GetRasterBand(1).Checksum() == expected_cs ds = None ############################################################################### # Test source fill ratio heuristics (#3120) def test_gdalwarp_41(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() src_ds = gdal.GetDriverByName('GTiff').Create('tmp/test_gdalwarp_41_src.tif', 666, 666) src_ds.SetGeoTransform([-3333500, 10010.510510510510358, 0, 3333500.000000000000000, 0, -10010.510510510510358]) src_ds.SetProjection("""PROJCS["WGS_1984_Stereographic_South_Pole", 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["Polar_Stereographic"], PARAMETER["latitude_of_origin",-71], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",0], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]]]""") src_ds.GetRasterBand(1).Fill(255) src_ds = None # Check when source fill ratio heuristics is ON gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_41_src.tif tmp/test_gdalwarp_41.tif -overwrite -t_srs EPSG:4326 -te -180 -90 180 90 -wo INIT_DEST=127 -wo SKIP_NOSOURCE=YES') ds = gdal.Open('tmp/test_gdalwarp_41.tif') assert ds.GetRasterBand(1).Checksum() == 25945 ds = None # Check when source fill ratio heuristics is OFF gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/test_gdalwarp_41_src.tif tmp/test_gdalwarp_41.tif -overwrite -t_srs EPSG:4326 -te -180 -90 180 90 -wo INIT_DEST=127 -wo SKIP_NOSOURCE=YES -wo SRC_FILL_RATIO_HEURISTICS=NO') ds = gdal.Open('tmp/test_gdalwarp_41.tif') assert ds.GetRasterBand(1).Checksum() == 65068 ds = None ############################################################################### # Test warping multiple source images, in one step or several, with INIT_DEST/nodata (#5909, #5387) def test_gdalwarp_42(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gdrivers/data/small_world.tif tmp/small_world_left.tif -srcwin 0 0 200 200 -a_nodata 255') gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gdrivers/data/small_world.tif tmp/small_world_right.tif -srcwin 200 0 200 200 -a_nodata 255') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world_left.tif tmp/test_gdalwarp_42.tif -overwrite -te -180 -90 180 90 -dstalpha -wo UNIFIED_SRC_NODATA=YES') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world_right.tif tmp/test_gdalwarp_42.tif -wo UNIFIED_SRC_NODATA=YES') ds = gdal.Open('tmp/test_gdalwarp_42.tif') got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [25382, 27573, 35297, 59540] assert got_cs == expected_cs ds = None # In one step gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world_left.tif tmp/small_world_right.tif tmp/test_gdalwarp_42.tif -overwrite -te -180 -90 180 90 -dstalpha -wo UNIFIED_SRC_NODATA=YES') ds = gdal.Open('tmp/test_gdalwarp_42.tif') got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [25382, 27573, 35297, 59540] assert got_cs == expected_cs ds = None # In one step with -wo INIT_DEST=255,255,255,0 gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world_left.tif tmp/small_world_right.tif tmp/test_gdalwarp_42.tif -wo INIT_DEST=255,255,255,0 -overwrite -te -180 -90 180 90 -dstalpha -wo UNIFIED_SRC_NODATA=YES') ds = gdal.Open('tmp/test_gdalwarp_42.tif') got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [30111, 32302, 40026, 59540] assert got_cs == expected_cs ds = None # In one step with -wo INIT_DEST=0,0,0,0 # Different checksum since there are source pixels at 255, so they get remap to 0 gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world_left.tif tmp/small_world_right.tif tmp/test_gdalwarp_42.tif -wo INIT_DEST=0,0,0,0 -overwrite -te -180 -90 180 90 -dstalpha -wo UNIFIED_SRC_NODATA=YES') ds = gdal.Open('tmp/test_gdalwarp_42.tif') got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [25382, 27573, 35297, 59540] assert got_cs == expected_cs ds = None ############################################################################### # Test that NODATA_VALUES is honoured, but not transferred when adding an alpha channel. def test_gdalwarp_43(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_gdal_translate_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdal_translate_path() + ' ../gdrivers/data/small_world.tif tmp/small_world.tif -mo "FOO=BAR" -mo "NODATA_VALUES=62 93 23"') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' tmp/small_world.tif tmp/test_gdalwarp_43.tif -overwrite -dstalpha') ds = gdal.Open('tmp/test_gdalwarp_43.tif') assert ds.GetMetadataItem('NODATA_VALUES') is None assert ds.GetMetadataItem('FOO') == 'BAR' got_cs = [ds.GetRasterBand(i + 1).Checksum() for i in range(4)] expected_cs = [30106, 32285, 40022, 64261] assert got_cs == expected_cs ############################################################################### # Test effect of -wo SRC_COORD_PRECISION def test_gdalwarp_44(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() # Without -wo SRC_COORD_PRECISION gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -q ../gcore/data/byte.tif tmp/test_gdalwarp_44.tif -wm 10 -overwrite -ts 500 500 -r cubic -ot float32 -t_srs EPSG:4326') ds = gdal.Open('tmp/test_gdalwarp_44.tif') cs1 = ds.GetRasterBand(1).Checksum() ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -q ../gcore/data/byte.tif tmp/test_gdalwarp_44.tif -wm 0.1 -overwrite -ts 500 500 -r cubic -ot float32 -t_srs EPSG:4326') ds = gdal.Open('tmp/test_gdalwarp_44.tif') cs2 = ds.GetRasterBand(1).Checksum() ds = None if cs1 == cs2: print('Unexpected cs1 == cs2') # With -wo SRC_COORD_PRECISION gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -q ../gcore/data/byte.tif tmp/test_gdalwarp_44.tif -wm 10 -et 0.01 -wo SRC_COORD_PRECISION=0.1 -overwrite -ts 500 500 -r cubic -ot float32 -t_srs EPSG:4326') ds = gdal.Open('tmp/test_gdalwarp_44.tif') cs3 = ds.GetRasterBand(1).Checksum() ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -q ../gcore/data/byte.tif tmp/test_gdalwarp_44.tif -wm 0.1 -et 0.01 -wo SRC_COORD_PRECISION=0.1 -overwrite -ts 500 500 -r cubic -ot float32 -t_srs EPSG:4326') ds = gdal.Open('tmp/test_gdalwarp_44.tif') cs4 = ds.GetRasterBand(1).Checksum() ds = None assert cs3 == cs4 ############################################################################### # Test -te_srs def test_gdalwarp_45(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -te_srs EPSG:4267 -te -117.641087629972 33.8915301685897 -117.628190189534 33.9024195619201 ../gcore/data/byte.tif tmp/test_gdalwarp_45.tif -overwrite') ds = gdal.Open('tmp/test_gdalwarp_45.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -te_srs EPSG:4267 -te -117.641087629972 33.8915301685897 -117.628190189534 33.9024195619201 -t_srs EPSG:32611 ../gcore/data/byte.tif tmp/test_gdalwarp_45.tif -overwrite') ds = gdal.Open('tmp/test_gdalwarp_45.tif') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None ############################################################################### # Test -crop_to_cutline def test_gdalwarp_46(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/utmsmall.tif tmp/test_gdalwarp_46.tif -cutline data/cutline.vrt -crop_to_cutline -overwrite') ds = gdal.Open('tmp/test_gdalwarp_46.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18837, 'Bad checksum' ds = None # With explicit -s_srs and -t_srs gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/utmsmall.tif tmp/test_gdalwarp_46.tif -cutline data/cutline.vrt -crop_to_cutline -overwrite -s_srs EPSG:26711 -t_srs EPSG:26711') ds = gdal.Open('tmp/test_gdalwarp_46.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 18837, 'Bad checksum' ds = None # With cutline in another SRS gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/cutline_4326.shp data/cutline.vrt -s_srs EPSG:26711 -t_srs EPSG:4326') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' ../gcore/data/utmsmall.tif tmp/test_gdalwarp_46.tif -cutline tmp/cutline_4326.shp -crop_to_cutline -overwrite -t_srs EPSG:32711') ds = gdal.Open('tmp/test_gdalwarp_46.tif') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 19582, 'Bad checksum' ds = None ############################################################################### # Test gdalwarp -co APPEND_SUBDATASET=YES def test_gdalwarp_47_append_subdataset(): if test_cli_utilities.get_gdalwarp_path() is None: pytest.skip() tmpfilename = 'tmp/test_gdalwarp_47_append_subdataset.tif' gdal.Translate(tmpfilename, '../gcore/data/byte.tif') gdaltest.runexternal(test_cli_utilities.get_gdalwarp_path() + ' -co APPEND_SUBDATASET=YES ../gcore/data/utmsmall.tif ' + tmpfilename) ds = gdal.Open('GTIFF_DIR:2:' + tmpfilename) assert ds.GetRasterBand(1).Checksum() == 50054 ds = None gdal.Unlink(tmpfilename) ############################################################################### # Cleanup def test_gdalwarp_cleanup(): # We don't clean up when run in debug mode. if gdal.GetConfigOption('CPL_DEBUG', 'OFF') == 'ON': return for i in range(37): try: os.remove('tmp/testgdalwarp' + str(i + 1) + '.tif') except OSError: pass try: os.remove('tmp/testgdalwarp' + str(i + 1) + '.vrt') except OSError: pass try: os.remove('tmp/testgdalwarp' + str(i + 1) + '.tif.aux.xml') except OSError: pass try: os.remove('tmp/testgdalwarp_gcp.tif') except OSError: pass try: os.remove('tmp/testgdalwarp24src.tif') except OSError: pass try: os.remove('tmp/testgdalwarp24dst.tif') except OSError: pass try: os.remove('tmp/testgdalwarp30_1.tif') except OSError: pass try: os.remove('tmp/testgdalwarp30_2.tif') except OSError: pass try: os.remove('tmp/testgdalwarp30_3.tif') except OSError: pass try: os.remove('tmp/testgdalwarp33_mask.tif') except OSError: pass try: os.remove('tmp/testgdalwarp37.tif') except OSError: pass try: os.remove('tmp/testgdalwarp38.tif') except OSError: pass try: os.remove('tmp/test_gdalwarp_39.tif') except OSError: pass try: os.remove('tmp/test_gdalwarp_40_src.tif') os.remove('tmp/test_gdalwarp_40.tif') os.remove('tmp/test_gdalwarp_40.vrt') except OSError: pass try: os.remove('tmp/test_gdalwarp_41_src.tif') os.remove('tmp/test_gdalwarp_41.tif') except OSError: pass try: os.remove('tmp/small_world_left.tif') os.remove('tmp/small_world_right.tif') os.remove('tmp/test_gdalwarp_42.tif') except OSError: pass try: os.remove('tmp/small_world.tif') os.remove('tmp/test_gdalwarp_43.tif') except OSError: pass try: os.remove('tmp/test_gdalwarp_44.tif') except OSError: pass try: os.remove('tmp/test_gdalwarp_45.tif') except OSError: pass try: os.remove('tmp/test_gdalwarp_46.tif') except OSError: pass try: os.remove('tmp/cutline_4326.shp') os.remove('tmp/cutline_4326.shx') os.remove('tmp/cutline_4326.dbf') os.remove('tmp/cutline_4326.prj') except OSError: pass gdalautotest-3.0.4/utilities/ref_data/0000755003401500001440000000000013614004467017415 5ustar rouaultusersgdalautotest-3.0.4/utilities/ref_data/grid_maximum.tif0000644003401500001440000000136613614004467022611 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/utilities/ref_data/grid_average_90_90_8p.tif0000644003401500001440000000674613614004467024004 0ustar rouaultusersII*@f S   JM@fffffN@DA̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|98^@88_@`@rq_@88`@ `@q`@qq_@UUUUUU_@98c^@@]@q1^@qq^@UUUUU_@qq^@q]@98c^@rq_@rq_@rq_@_@rqG_@UUUUUu`@rq_@8X`@98#^@UUUUU^@qq^@88]@8x]@j^@88_@UUUUU_@j^@8]@98^@88`@88`@qq`@rq_@88_@qq^@qq^@98]@rqG_@@_@_@88_@ `@qq^@q]@rq]@qq^@88N_@qqb@88b@98#a@UUUUUu`@qq<`@rq_@qq\^@98]@qq\^@_@qq`@_@88`@qDZ]@*^@q1^@rq'a@98Ca@UUUUUud@UUUUU5c@qb@ a@ `@qq^@]@98#^@88_@qq`@98Ca@ `@ `@@]@98^@98`@UUUUUa@8a@qqd@b@*b@`@qǑ`@rq_@qq^@]@*^@UUUUUU_@ `@q1^@]@88\@q]@88`@qqa@98Ca@rq'b@`@`@88`@`@UUUUUU_@98^@qq^@UUUUU^@88N_@98^@88]@qDZ[@88\@]@88`@qq<`@rq_@88`@88N_@UUUUU_@UUUUU^@88_@UUUUU^@qq^@q]@*^@qDZ]@rq]@88\@98[@88]@88\@rqG_@98^@qq^@88_@UUUUUU_@]@q]@8x]@*^@UUUUU_@q1^@98c^@]@qDZ]@88N_@UUUUU_@88_@qDZ]@98]@qq\^@]@rq_@UUUUU_@]@q]@]@]@qq\^@UUUUUU\@88\@rq\@qq^@88`@88N_@qq^@88\@]@98#^@UUUUU^@UUUUUu`@UUUUU^@qDZ]@]@qq\^@88]@qq]@qDZ]@_@UUUUUU`@qq`@qq`@98c^@rq]@qq\@88\@_@_@88`@98c^@]@88]@qq]@qq[@98[@8x]@qq^@88`@88_@88N_@]@qq\@98#\@UUUUU\@8X`@88`@88`@q]@]@qq[@qq[@Z@88Z@@]@88_@qǑ`@98c^@qq\^@qq^@98#^@*^@qq^@UUUUUu`@88`@qqa@rq_@98#^@*[@8Z@Z@8Z@qq\@qq\\@88\@qq\@8x]@]@88_@qq^@qq^@qq\^@88_@qqb@rq`@88`@qDZ]@]@*[@q1[@qZ@98[@qZ@rqGZ@Z@j[@*^@q]@*^@88\@q]@qqd@UUUUUc@8a@UUUUUu`@q1^@qq\@UUUUUU\@qZ@qZ@98#Y@88Z@[@rq]@qq_@88_@98^@qq^@q]@8f@qqf@8xd@UUUUUa@88_@@]@qDZ]@88N\@8x]@rqG]@98^@qq_@rq_@ `@88_@UUUUUU_@qq_@98^@q1g@88ng@88d@98b@88`@`@rq`@UUUUUU`@`@88_@qq<`@ `@qq`@rq_@88_@UUUUU_@98^@@]@gdalautotest-3.0.4/utilities/ref_data/grid_range_90_90_8p.tif0000644003401500001440000000136613614004467023457 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|!!)!2::!!!!!99)!)!2::!!!!1))!)9)!!!!!!:::))!11B2:!!!))!:BB1)!ccA))!111)!2BB!BccJ::!111!199!!RkkR:!!1))!)!!!!RRR11111!!!!!!!RRR))))!)11!)JJJ!))))))::SBBBB!!!J1)))!1cccBBBJ))JBJ1)))cccJB)1))JBJ:2!!!cZZJ))111JJ:BB!22)))1111:::RSKK:*222!11:::1:BBB*2BB)!)99BKK2sscB2:J[[KB99BBB)ssc9RRk[[BB11::B)gdalautotest-3.0.4/utilities/ref_data/grid_count_70_70.tif0000644003401500001440000000136613614004467023100 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/utilities/ref_data/grid_invdist.tif0000644003401500001440000000674613614004467022623 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@gdalautotest-3.0.4/utilities/ref_data/testgdalwarp13.tif0000644003401500001440000000364613614004467022777 0ustar rouaultusersII*((f(@S   J>@>@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|mqw}}yz{uuzztt||utwyyosy||zy|~yuvzxrs{}yxz||~rv{|ywy{vvyzvpqz~|}~}{{tx}~{z|~}yvx{zuoqz~}}}}{wswwz~{|zzx{}{vprz{yxwvsqsw{~|zz~zy}~zy{|{vqryyttuvuttuv}zz}{xyzyyz{zwtswxqrw||zxz{~|}}zwvwy{}}|||{z~wpqw}zwutvz~~uopv~|xusuz{|{uqsy||wsuz~|twyvvyx~~zvvz}~vpvzyzu|yy||ywx|}rov{{||t}xx||xvvz}wpotxzz}zsq~~}zvsty}xtronorvwxqmm~{wuvy}~{upnomkmsvw{nkk}}{z}}}~~}{yz{}{volonkmtyz}wpnm~|{{zyxx{{zy{}~zwxyyuonqrqrwzzzzyxvts}ww{zsquxxwvy~}wstutsrtxzzyyxvvxz|||{yx|ypnsxyvsw~}toprsux~}xutux|~~|{}|{wpov{{vsw~rlotx|{trtvy||zwu}yusv{}|wtw}zoinwupoqvz||xtq|yvvz}}|{wttwtmjp}||zuomlnsz~~{vtytsw}~{yyvrprux||sqpnkjloty|wrsx{zvtutolo{~vsrqnkinvzzystwxvpnpoljm|yvvyxsmjpz~|~xssusmijkkjku~|yzzrnq{~zqnpqmihhihhoy{vuz|y{~yvw{~|piknnljgeegmtvssvvuw|~}~}~|{tkkmnnlighlpssrqpooquwy~|y{yuuy}}sponnmllpuvqoonkiiknqt{yropruxy}ysqqpnpuupkjifeegjlov||uliltzzz|vvrljmomifdcdegklnt{{tmkqy~~}zvqkhjjhedddfinruwz|xwz}zztpnoplechkklrx~wr|yuttx{vllv|{{{to®{z}~}~~}~~|xuss~|xursutpoqszwvtsqonoqpljmowqonnmmllnpnjhjlgdalautotest-3.0.4/utilities/ref_data/testgdalwarp14.tif0000644003401500001440000000364613614004467023000 0ustar rouaultusersII*((f(@S   J>@>@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|hltvr|lnqn|}kivwmzkpxztxynr~mk||rr{}x{ovskqyxwnqzwgh|{}|nzowuowqzxpqiyrdj~~{u_imt|oxpnupsjo}zyxupllors{|~xss}rqzv{ujkxumproqtsmj~xrs{|vwy{xsu|wjdlugmzury~yx|{uy}|xrrx|{zzzytp}udiz|x|vpsutru||seeq~}zuqpsy{t|~qjmpvlwypip}wzuft{sr|zuʽ]ķyxxor~wu~h`vxx±^Ȼykn~~vvzed|~ywn{ik|~snw~wijyvr~dmw{}{xpklxzpoqqnjp}s_{yYfstyus}xpnrz{qgjtp`bwvfvw^dk~wnuto}{||{{{{gdrqa`r~}rigg~}{yyz{xsw~tr{|wv|{idmqlmw}qnwytq}hkpfpyyuputnrusollou{yroryjni]l|vhnphqrijv|slox|~yb`vsfrrequorwnpv{z||up~}}zokstkxgVbxmhlrz~~zrjfvvw}}nn}|xsxsYJTzmw|rllhbl{pmm}vnjv|v{{smmoqrux`_egjkigmy}xjdp~|qr|{l_a{ronjiifcm~ozmht}shisum`_}ôtgnz~}vf[kmuwqu|wh_clsmcp}ttyl[fty|}jesxmb`fnk`fyu_exwvopyoqdXhtrokf`ZYexzmlx|vw}v|qltvkY_kqsof_`jrtwzvoknqttuxvifw~jbeknjgjxkftwjbeilot~}oghotts~|wlkqqnvnejlf`_bghhq~uaS\w{tvo~g\frvpb]bdabgd]h~iWYh{x~xcY\ejf]X]adjqqmtxpr||meiqthSP`f]]kxpcưqzzkel}xVVxxs~ka༎ogq|}szvy|z~wsuwгs{{yyqegtthiu~Ż{ppqonokgjsqedlrrky{kbdhiiijkpspfcfigdalautotest-3.0.4/utilities/ref_data/grid_avdist_150_50_-15.tif0000644003401500001440000000674613614004467023710 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|1S@Yd X@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@z1 :]@\Z@T@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@1S@D InZ@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@Y-|]@D InZ@1S@T@\Z@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@y1 :]@Yd X@1S@gdalautotest-3.0.4/utilities/ref_data/grid_invdistnn.tif0000644003401500001440000000676213614004467023155 0ustar rouaultusersII*@r S   V0M@fffffN@DA̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|^@\@c@b@X@`@^@`@`@`@X@c@`@^@Z@`@`@\@\@Z@\@Z@^@\@^@Z@\@b@Z@\@a@\@`@\@\@^@b@^@d@^@`@Z@Z@`@c@^@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@gdalautotest-3.0.4/utilities/ref_data/grid_invdistnn_250_10maxp_3pow.tif0000644003401500001440000000676213614004467025701 0ustar rouaultusersII*@r S   V0M@fffffN@DA̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|;Z@mTA^@Me`@\@x`@;`@TFa@ܽ<`@,S`@kp`@q^@J \@?Ia@| Z@a@ q\@Y IC`@tZ\^@WZ@_.`@>@>`@\@9\@}?Z@€i\@ZZ@2@b@hq`@cʷ^@̐^@8\@[G`@m`@Lx^@ba|\@ 8C8^@ c]\@+D^@Z@y6\@Bb@tZ@Q6\@V>la@1ӊ\@o`@ `@x<c@]m`@?$]sa@`@Uր`@3\@`4\@d=\@m^@rb@2^@+nf{d@ac^@_`@Z@Z@-T`@J1Ec@94^@;g@(e@hQe@jwb@jƛb@#m \@_pb@e57^@zJ,Z@b~`@V#\@wf`@Hʨc@(OX@F ^@dF\@+S`@l\`@.gi@spZ@Yh@&e@H{b@-Ma@ =a@`@HE X@a`@$LM^@L|\@ѽa@ΐܱ`@`@xX@͜ c`@s|^@$I`@be@^@(3\@ab@k ^@_b@cwH \@^Db@\љ^@ǒa@sA2^@ 4Z@&\@j)`@>p\@6Z@x\@uE%iX@o6|^@^X@7f@r,|X@Z@>^@#F\@w`@Q\@7^@A`@\@`@mz`@ݥY^@-^@#J`@3oX@6^\@hLX@ c^@M8q_`@ gj\@LR8U\@adZ@gB^a@a@0uX@yu7a@ӠX@ޏvj\@I+^@eZ@C\`@BZ@W\@1uZ@j\@눚^@I'u`@ ^@ pZ@K^@վ`@D`@A5`@B`@&n`@d^@1X@P(`@D4O^@*]7Z@wb@˾|X@jh\@uƃ^@va@lVe@X{(^@FZ@Op^@^@l^@əǓZ@^@q^@&^@"Z@Tla@!^@^@\@rO\@&7V@ Z@Ȥte@9Z@!Z@lZ@Z@5mX@]`@GG^@dT\@*e@fb@QL X@RM^@>^@#/tZ@Z5^@:X@&KZ@Ig@He@eeZ@<\@0\@P8Z@ X@a@8Z@aze@a@Cb@2)j`@j2`@#Z@%o^@ X@(BX@\@,X@s|g`@X@=3a@Gk\@ᙸab@o-^@XX@`@n(.^@Ȭyb@a@pMLa@!E Z@a@:jV@vtZ@')\@ɄZ@+~wV@`oX@ ^@Ro \@#\@5f \@׹A^@D\Q^@3b@E6\@b@όUX@``@Pd@VoUb@Jc@T^@cXZ@Z@ȦZ@z\@kS3a@(JfX@Ȥ9R\@AXX@ ~FX@Z@bo\@\`@s \@7V@^@ \@g@Ve@ϳ9a@"a@d@θ\@_)`@B:V@F.7X@\@֬V@MX@ݽCX@`)Z@_gX@Ҡ@`@od/X@V'Z@k`@8`@X.c@ f@Ra@e@e^@"`@)*jX@c\@"^@x֧'R@j`\@lIX@5^@0a@! Jc@9`@ߞ$d@1a@(a@*|X@e@TX"n@/o@D^@=͵UX@ݫZ@6(qg@`٠e@{MZ@%aY0\@w \@lZ@,H NX@̣a@d}Z@޻e@P(`@_`@xla@qxҜV@]#Z@?Iq\@jjdV߿Z@C5 V@d&X@-K^@[\@'YG\@;U \@^@rB ^@UI8b@ZR$\@`"b@+YFX@% !b@ja c@`^@yZ@GEZ@_!ӕ6Z@y\@'Ba@DX@\@-X@ *X@^Z@E\@ ML`@\@]95V@M>^@:1?le@Ha@@"޷&a@Ajd@(\@|IX]`@sWiB)V@|X@["F\@–3hV@ 3DRX@ղ,X@cHZ@^RX@W1`@O/X@Z@b`@ѱjf@qPa@ 5ze@N^@`@Y0X@>\@K?2^@as{R@\@\X@^@Va@1;+c@$a`@ꥢd@.D a@a8a@'Y%n@;co@TrSpi@`@ƾZ@1@ a@Rņ^@RĤb@6=`@Peڃd@Yd@y4b@ZG-a@ƾ`@^@8RZ@1:^@qZ@gdalautotest-3.0.4/utilities/ref_data/grid_avdist.tif0000644003401500001440000000674613614004467022435 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|̽-z@;0U@{biK@k^@64@6Ӓ4@:0ߒX@߲)@2rK@-@-@1rK@ݲ)@80ߒX@8Ӓ4@64@k^@{biK@;0U@̽-z@;0U@x#@wF3@;{@ƻ"WD@7 @)%Y@P@]+J@΍q%&@ύq%&@]+J@P@)%Y@7 @ƻ"WD@;{@wF3@x#@;0U@zbiK@wF3@[]@ @q@U@]@Jlǃ@$fW@o @AJ͌X@AJ͌X@o @$fW@Jlǃ@U@]@q@ @[]@ wF3@|biK@k^@6{@ @8L@6ưx @޿K@_@N>@1@}>ʁ@}>ʁ@1@N>@^@޿K@6ưx @7L@ @8{@k^@64@ƻ"WD@q@6ưx @3"@҉^@C9@kJ@͒@$?Ӏ@$?Ӏ@͒@kJ@C9@҉^@3"@6ưx @q@ƻ"WD@64@;Ӓ4@7 @U@]@޿K@҉^@~2=@Hd@[sHG}@>fqB,@N@M@>fqB,@[sHG}@Hd@~2=@҉^@޿K@U@]@7 @;Ӓ4@=0ߒX@)%Y@Jlǃ@_@C9@Hd@S@m@!X @ ָ~@ ָ~@!X @n@S@Hd@C9@_@Jlǃ@)%Y@?0ߒX@)@P@$fW@N>@kJ@ZsHG}@i@pU޶~@a-~@h.U}@h.U}@a-~@pU޶~@i@ZsHG}@kJ@N>@$fW@P@)@6rK@a+J@t @1@͒@>fqB,@!X @a-~@X6%h}@ho}@ho}@X6%h}@a-~@!X @>fqB,@͒@1@s @a+J@6rK@-@Ѝq%&@CJ͌X@>ʁ@$?Ӏ@M@ָ~@d.U}@co}@&_%n|@(_%n|@do}@d.U}@ָ~@M@$?Ӏ@~>ʁ@CJ͌X@ύq%&@-@-@ύq%&@CJ͌X@}>ʁ@$?Ӏ@N@ ָ~@f.U}@fo}@*_%n|@)_%n|@ho}@h.U}@ָ~@M@$?Ӏ@|>ʁ@BJ͌X@΍q%&@-@3rK@\+J@n @1@͒@=fqB,@!X @a-~@V6%h}@do}@ao}@T6%h}@a-~@!X @:fqB,@͒@1@m @\+J@3rK@)@P@$fW@N>@kJ@XsHG}@h@pU޶~@`-~@`.U}@`.U}@`-~@pU޶~@d@WsHG}@kJ@N>@$fW@P@)@<0ߒX@)%Y@Jlǃ@Y@C9@Hd@S@c@!X @ָ~@ָ~@!X @a@S@Hd@C9@Y@Jlǃ@)%Y@<0ߒX@<Ӓ4@7 @U@]@ܮ޿K@҉^@z2=@Hd@VsHG}@8fqB,@F@F@8fqB,@VsHG}@Hd@z2=@҉^@ܮ޿K@U@]@7 @=Ӓ4@64@Ż"WD@q@6ưx @3"@҉^@C9@kJ@͒@$?Ӏ@$?Ӏ@͒@kJ@C9@҉^@3"@6ưx @q@ƻ"WD@64@k^@<{@ @4L@6ưx @ݮ޿K@[@N>@1@z>ʁ@z>ʁ@1@N>@[@ݮ޿K@6ưx @8L@ @<{@k^@biK@wF3@[]@ @q@U@]@Jlǃ@$fW@p @AJ͌X@AJ͌X@p @$fW@Jlǃ@U@]@q@ @[]@wF3@biK@;0U@x#@wF3@@{@ͻ"WD@#7 @)%Y@P@a+J@эq%&@Ѝq%&@`+J@P@)%Y@!7 @ϻ"WD@@{@wF3@x#@;0U@ҽ-z@;0U@biK@k^@64@IӒ4@I0ߒX@)@?rK@-@-@@rK@)@M0ߒX@IӒ4@64@ k^@biK@;0U@ӽ-z@gdalautotest-3.0.4/utilities/ref_data/grid_count_300_300.tif0000644003401500001440000000136613614004467023230 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|$)-..........-)$%+16777777777761+%$+29?@@@@@@@@@@?92+$)19AHIIIIIIIIIIHA91)-6?HOPPPPPPPPPPOH?6-.7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7..7@IPQQQQQQQQQQPI@7.-6?HOPPPPPPPPPPOH?6-)19AHIIIIIIIIIIHA91)$+29?@@@@@@@@@@?92+$%+16777777777761+%$)-..........-)$gdalautotest-3.0.4/utilities/ref_data/grid_average.tif0000644003401500001440000000674613614004467022555 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@)\_@gdalautotest-3.0.4/utilities/ref_data/testgdalwarp12.tif0000644003401500001440000000364613614004467022776 0ustar rouaultusersII*((f(@S   J>@>@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kow}ww~qq~~qq~~qowyu}mqy}~|wzzst}|op}~utz|y}qu~~usw}|wsvy|wkm|}~|u{swtqyuzysqlz}ufi~~}xeqsw}rxqpvr~vknywwupmnquw{}yvu{rqyv~~wlm{uoqrpqssrq~}ztu}{wxxzxuv{wjhp~tkpxtv{~}z}|vx~|xrsy|zz{zxur{shmw~~xsttstx}|qhhp}~{xusqsy~v}qkms|wyytlp{y~shw{ss{~|­ozxypq~xxjcw}vxmý{mn~{wvzgf}|{yq|ll}{vqwxiiy}zxtrq||}yolowzsqppnjmyvfywjlm~zvu~yqosxzriirpbdvxhushjk~xvur~zz}{{||hdpobdu~~}rnlk~{x{{ywtwut|{wx{zjfqrkmw~~sqvvsqklnhrwywqtsostqnmotx}~~yrpuz~~mmhbpy|xkoohprlmv~{tnox~~~yddz~vjrneotrwxpovzz|~ztqzrlp~wmth^ivqkksy}}{wpm}}}|{op}|ytt{s[T_x~pwwqmlidk~{ytq}wrmt|w{zrooonpuwffgijiihnz}ylfs||qq{yjdfzsqpnmkhckpyohu{|vkjtticbzwkqvzyrjajowxqr{whbejpndnytuxpafw}~lguujdbemlbg{zehwxwop|xrd[ipqokf`]]fx|qpxyuw|y|ru}vi]ekqrng_`hotvusonoquwwxujoz|mhgkljjlumhssieehlos{yoggqvww}zunlppntlelldaacgjlstgZ_w|ywxq{e^gmrna]ababggaii_`j|w~xc\bfjh_\`cejpqmsuoqx~|}lfkoulTRdi`bnyskw~{liqzxYYwts~}piٻvnp~w{y}|yz~utuuɲ|}|ytnnuumlsw{utsrqpnlmrqiglo{w~qkkkkkkkkmqogeikgdalautotest-3.0.4/utilities/ref_data/testgdalwarp11.tif0000644003401500001440000000406013614004467022764 0ustar rouaultusersII* (((Skow}ww~qq~~qq~~qowyu}mqy}~|wzzst}|op}~utz|y}qu~~usw}|wsvy|wkm|}~|u{swwv{z~|xuqy}|ujm|~~xmqsw~w{vuxu~}vmp}zwwvsqpquw{}{yx|vuyx}|wop{wrssssssrq~{wx}{xyyyyxxzwont}vorwwv{~~}yz~{xuuy{{{{{zxv|tmpw~zwvutuy}rlms}|zwtrtzx}rnpvw}|~vpr}}}vnxztt{o~{zss|~{|pjw{wymý|st}zww{mkz{|yq}rr}zvty~xmlw|{{|trq~~zsprx{vsqpnlowwo}|jlm~zzztrtxztmlqogiuwozvhjk~xzxw~{{}zz|~ylipogiu{|~~tnlk~{z{{zxvx}}xw|zxyz}xmjqsnow|}|wvwvsqrrpmtxywsvtqttrqpqvz{|{ytsw{~~~srlhrxzworqlqrprw}zuqrx}~~}~xjjy|wotphotv{zsquxz|}ztqzupr}}xqukemwtnmrw{}|xqm}}}}}zst}~}|yttysd`izuyxrnljio|}ytq~xsqu{xzxropqruyymmmljijlqz}yrlty}{srxvlhk{ytqqpmifl{~u}tntxzwmlrqkhhz}ssuyxrlfmv}yrrxvjfhjnmgp}ywy|rhl}{~oksskgfgkjekz{no~xzxrs|xwibkoonkgbabjwzsrwxuw~}~{}wu}|ndiloolhcdjostsrpooquwxzx~poz|qmkllkklr}|okppjggimpszxpklrvww~{vpnppnr|{nhkjecceilnttkbfv|ywzt{vhcjnokdabcceijhn}}nggn{x{ugbgiigbabehlqsrvxssx~|{pllosm\Zgjehqysk}~zqosx~wcbv}ww~}pi͵~uu~{~|~|z{~|vtuuɲ|}|ytnnuumlsw{utsrqpnlmrqiglo{w~qkkkkkkkkmqogeik(((@S   3>@>@?A˞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/utilities/ref_data/grid_minimum_400_100_120.tif0000644003401500001440000000136613614004467024134 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kkkkskkkkkcccckkcccckkkcckkkkkcccckkkccckkkccckkkkcccccccccckkkcccckkcccccccccccccckccckkccccccccccccccccccckcccccccccccccccccZZckccccccccccccccccZZZcccccccccccccccccZZZZkcccccccccZZccZZcZZZccccccccccZZZcZZZZZZZkccZZccccZZZZZZZZZZZcccZZZccckZZZZZJJZZZZccZZZZcckZZZZZJJJZZZcccZZZcckkZZZZJJJJZZZccZZZZckkZZZZZJJJZZZcccZZZckkZZZZJJJJZZcccZZZZkkZZZZZJJJZZccccZZZkkZZZZJJJJZccccZZZkkZZZZJJJZZccccZZgdalautotest-3.0.4/utilities/ref_data/grid_avdist_150_150.tif0000644003401500001440000000674613614004467023407 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|#rIV@{ ɌV@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@{ ɌV@#rIV@{ ɌV@GkgV@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@_%DK:X@GkgV@{ ɌV@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@W@_%DK:X@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@KܺcY@_%DK:X@W@{ ɌV@GkgV@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@^%DK:X@GkgV@{ ɌV@#rIV@{ ɌV@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@W@{ ɌV@#rIV@gdalautotest-3.0.4/utilities/ref_data/grid_invdistnn_250_8minp.tif0000644003401500001440000000676213614004467024656 0ustar rouaultusersII*@r S   V0M@fffffN@DA̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|/$5sZ@̿^@50.`@/I\\@ju`@FZL `@[a@4k`@<"R`@/L&Z`@Z@=U `@4m`ތZ@`@#i`@m@Z@hpMC^@sg\@~c@vb@xO\@~`@%[Z@|i^@}b@2\@d@,xC\@Sܧ~a@6Z@C ^@T^@5sX@ ``@LQ^@8+o`@mY`@Ki`@eX@Z~c@hX\@`s`@p~a@9zk`@4+^@s\@淠3a@mTZ@Kb~a@OE*'\@7R 9`@빃^@g5,AZ@*n`@b)A`@٦s\@GGϕ\@tNZ@ 6\@Y.Z@~b@F,s`@Q^@^@Zv!\@8+`@K^@9#&\@cG^@7Bj?\@y ^@tݲZ@ZJ\@#&J~b@ATZ@''=H\@3&a@%{E\@0+`@g$݁`@v$>c@ `@#la@Os`@'Ǫ`@9\@h\@6\@q ^@ 0~b@w^@@H0d@z^@V`@A! Z@#|?Z@ *`@ҝBc@-#^@qg@je@8 -e@b@3b@w+j_\@v#KN~b@. ӿ^@j_+Z@({`@By\@4u`@ ~c@GIX@ATlѿ^@Tvs\@{)`@+1|`@dXCEi@H >Z@ĥG6h@ Te@n*b@ga@ a@{f`@?i4wX@UOgc`@^@"@@\@JM`a@rJ`@{P`@ʷsvX@Bwm`@@J^@t{`@|u:Z@m}<\@M"MX@Q^@=X@/kΔf@X@hZ@N}n^@*Lg\@•z`@l\@^^@`@ε)\@-`@Z…`@+OT5տ^@,߿^@kO9t`@,X@7')Ϳ\@WX@a^@a`@l&\@ch@\@!cZ@>Ua@sh~a@<%6tX@naEt~a@4lX@ h\@;^@YUƩdZ@?\`@ݦZ@wv\@BZ@Ȉb\@/@I#^@q`@ҿ^@tqZ@Ve^@q/s`@ωA`@`@)`@y]R`@j^@y1YX@wz_R`@mÿ^@1Z@3a~b@:-2X@Q\@A*d2^@/a@w`e@kXw ^@R ,fZ@O^@jj^@=^@-?jw^Z@Oyʼ^@PAH^@m!Ŀ^@DZ@Xtk~a@Kٿ^@t3!^@1m\@0#\@=Z@;OZ@_T‚X@BY`@;I&^@5:C>\@Je@<~b@j^X@2݉4^@0^@ Z@w-^@eBX@9 Z@e8g@Qe@Z@@H\@dq\@~-Z@NpUX@za@c:Z@re@"Ta@n b@v$`@x(a`@i+Z@)j޾^@7@X@פ#X@BI\@SXX@7`@5nX@a@J<\@b@t^@wyX@1`@_=!^@l]b@إa@@4a@inZ@7%a@1 V@nM\Z@zZ\@?0Z@L8Y|V@#OX@+8`^@V:\@ʤ\@O?d\@鋽 ^@]^@Ϧb@+Mb&\@&*b@&!RX@n=`@lW`d@yڥb@~c@&\o^@YUZ@Q)Z@@Z@y\@I 0a@uX@g\@3L:X@,?6X@  Z@&WJ\@T`@s7J\@6-cD^@+%rR@"\@ ?X@&b^@l:a@c@C`@<"d@x\a@ZSa@] X@I$e@n@ no@wg\Ri@kĀ`@ZӝgZ@]a@VN^@¼4)b@0`@Rkud@t7d@ӻb@pa@dr-`@3ؑ^@$Z@gP^@XZ@Nj^@0f@mf@ QLc@k 1b@#c@ c@4R/c@+f@pq2`@zO-b@g\@X }`@ǸQZ@u.Z@uNsZ@l9OZ@CZZ@| \@@D[tX@Gh'Z@gdalautotest-3.0.4/utilities/ref_data/grid_maximum_100_100.tif0000644003401500001440000000136613614004467023551 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|ŭŭŭ{{{{{{{{{s{s{{s{ΥΜΜ{{{{gdalautotest-3.0.4/utilities/ref_data/grid_average_190_190.tif0000644003401500001440000000674613614004467023537 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|NN,_@_@33333C_@E]t_@F]t`@. `@."`@F]t_@tE]_@tE]^@tE]^@F]te^@]tE7^@]tE}^@]tE^@]tE^@.k_@ _@V_@;{_@_@颋.`@NN_@`@#,4`@#,4`@rO#,_@|a_@iF_@,4r_@|a^@rO#,7_@rO#,^@ =^@{a9^@=M^@GXi%_@@_@_@-----_@`@;`@B!d`@-----`@ `@`@Ҳ_@Ã_@4_@iiiii^@ZZZZZ^@c_@iiiii _@KKKKK^@`^@#^@ZZZZZ:_@|_@b'vb'_@L`@tE]a@FXNa@a@} ȧ`@Z7"u`@)Y7`@n0E_@L_@a| f_@E>S^@>S^@n0E>_@} ^@`|^@#u)^@| _@LϺ_@`@{a`@ `@."b@aa@da@g`^@LϺ_@Ϻ_@_@>_@._@袋.:b@aa@KKKKKa@*Y7Ba@`@Sn0%`@0E>_@} g_@7"u_@E>Sd_@| ^@g`^@n0E^@Ϻy^@LϺ^@#u)`@n0E>_@_@{Z_@袋.:`@.Rb@aa@KKKKKka@a| &a@L`@"u `@} g_@g`<_@LϺ^@L_@L^@g`J^@} g^@Ϻy^@h`|_@#u)2_@^@e_@|a`@]tEG`@.a@#,4²a@<<<<S^@gݠ^@[^@u)Y^@"ui^@g`^@Ϻ^@^@Sn0^@n0E^@e_@FX_@E]t!`@.ba@|a1a@`@Y7"_`@Z7"u_@n0E>_@LϺ^@>Ss^@>S]@g`]@u)Y^@n0E>k^@0E>^@u)]@} ]@S.^@} g^@iiiii _@a{_@颋.h_@/袋a@jFX`@`@| H_@7"u_@S䳮^@g`<^@#u)r]@L:^@| ^@Sn0_@Sn^@gݠ]@g`]@L]@S.^@} g^@ZZZZZ^@jF^@]tE7_@颋.8`@_@E_@>S^@#u)]@L^@>Ss]@L]@#u)r^@u)Y^@^@g`^@a| ]@a| f]@a| ]@L]@Z7"u^@KKKKK^@,4r_@E]t^@袋._@{_@iiiii _@L^@h`|V]@n0E>+]@n0E>+]@Z7"u]@a| ]@к,^@7"u^@к^@a| f^@к,^@| H^@L^@a| ^@-----m^@>^@E]tQ_@/袋`@=`@T_@a| f^@h`|V]@`| \@o0E>\@LϺ]@Z7"u]@Y7"]@g`]@к,^@L:^@} g^@L^@| ^@#u)r^@<<<<<\^@sO#,^@._@a@{`@`@L_@L]@Y7"\@LϺ\@E>S\@Y7"\@Y7"]@к,]@a| f]@} g^@*Y7"^@S䳮]@g`]@7"u^@KKKKK^@{^@E]t_@.a@= a@iiiii`@n0E_@)Y7X^@| H]@к,\@L:\@L:\@a| [@g`\@L]@u)Y]@g ]@gݠ]@u)]@ g^@xxxxxx_@ =\_@袋.:_@.b@FXib@b@#u)a@0E>_@g`]@>Ss\@g`<\@L\@v)Y\@0E>]@"ui]@)Y7]@S䳮]@v)Y]@[^@n0E^@<<<<<_@rO#,_@."_@.bd@,4rc@Ҳb@o0E>a@"u`@a| f_@S.^@)Y7X]@n0E>]@Sn\@"ui]@v)Yw]@Ϻ]@n0E>^@]@v)Yw^@`|M^@-----^@O#,4^@]tE}^@33333Ke@`d@`c@iiiiib@a@xxxxx`@`@KKKKK^@ ^@0^@]@]@]@4^@a^@o^@^@^@؉]@l]@%f@E]t!e@N^d@jFxc@=b@FXia@i垆`@FXi_@{Z_@5rO#^@=ܓ^@=p^@{]@jF^@a^@=p^@FXi^@ى؉]@tE]t]@^@;;f@e@fffffd@.bd@/袋~c@]tEwb@.a@颋.8`@tE]`@颋.`@袋._@^@/袋n_@^@F]tх_@]tE^@F]te^@33333]@]@;;q]@gdalautotest-3.0.4/utilities/ref_data/grid_average_300_100_40.tif0000644003401500001440000000674613614004467024022 0ustar rouaultusersII*@f S   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|*^@q]@NN,_@`@`@"`@D`@F`@`@_@x^@x^@]@X^@8^@<^@_@_@_@;{_@fffff^@۶m۶M_@`@1 0 C`@1 0 C`@<\`@%I$IR`@m۶m_@<<_@zy^@<<^@<<^@= # ############################################################################### # 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 shutil import pytest from osgeo import gdal import gdaltest import test_cli_utilities from gcore import tiff_ovr ############################################################################### # Similar to tiff_ovr_1 def test_gdaladdo_1(): if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() shutil.copy('../gcore/data/mfloat32.vrt', 'tmp/mfloat32.vrt') shutil.copy('../gcore/data/float32.tif', 'tmp/float32.tif') (_, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdaladdo_path() + ' tmp/mfloat32.vrt 2 4') assert (err is None or err == ''), 'got error/warning' ds = gdal.Open('tmp/mfloat32.vrt') ret = tiff_ovr.tiff_ovr_check(ds) ds = None os.remove('tmp/mfloat32.vrt') os.remove('tmp/mfloat32.vrt.ovr') os.remove('tmp/float32.tif') return ret ############################################################################### # Test -r average. Similar to tiff_ovr_5 def test_gdaladdo_2(): if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() shutil.copyfile('../gcore/data/nodata_byte.tif', 'tmp/ovr5.tif') gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' -r average tmp/ovr5.tif 2') ds = gdal.Open('tmp/ovr5.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 1130 assert cs == exp_cs, 'got wrong overview checksum.' ds = None os.remove('tmp/ovr5.tif') ############################################################################### # Test -ro def test_gdaladdo_3(): if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() gdal.Translate('tmp/test_gdaladdo_3.tif', '../gcore/data/nodata_byte.tif', options='-outsize 1024 1024') gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' -ro tmp/test_gdaladdo_3.tif 2') ds = gdal.Open('tmp/test_gdaladdo_3.tif') cs = ds.GetRasterBand(1).GetOverview(0).Checksum() exp_cs = 20683 assert cs == exp_cs, 'got wrong overview checksum.' ds = None try: os.stat('tmp/test_gdaladdo_3.tif.ovr') except OSError: pytest.fail('no external overview.') ############################################################################### # Test -clean def test_gdaladdo_4(): if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' -clean tmp/test_gdaladdo_3.tif') ds = gdal.Open('tmp/test_gdaladdo_3.tif') cnt = ds.GetRasterBand(1).GetOverviewCount() ds = None assert cnt == 0, 'did not clean overviews.' assert not os.path.exists('tmp/test_gdaladdo_3.tif.ovr') os.remove('tmp/test_gdaladdo_3.tif') ############################################################################### # Test implicit levels def test_gdaladdo_5(): if test_cli_utilities.get_gdaladdo_path() is None: pytest.skip() shutil.copyfile('../gcore/data/nodata_byte.tif', 'tmp/test_gdaladdo_5.tif') # Will not do anything given than the file is smaller than 256x256 already gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' tmp/test_gdaladdo_5.tif') ds = gdal.Open('tmp/test_gdaladdo_5.tif') cnt = ds.GetRasterBand(1).GetOverviewCount() ds = None assert cnt == 0 # Will generate overviews of size 10 5 3 2 1 gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' -minsize 1 tmp/test_gdaladdo_5.tif') ds = gdal.Open('tmp/test_gdaladdo_5.tif') cnt = ds.GetRasterBand(1).GetOverviewCount() ds = None assert cnt == 5 gdal.Translate('tmp/test_gdaladdo_5.tif', '../gcore/data/nodata_byte.tif', options='-outsize 257 257') # Will generate overviews of size 129x129 gdaltest.runexternal(test_cli_utilities.get_gdaladdo_path() + ' tmp/test_gdaladdo_5.tif') ds = gdal.Open('tmp/test_gdaladdo_5.tif') cnt = ds.GetRasterBand(1).GetOverviewCount() ds = None assert cnt == 1 os.remove('tmp/test_gdaladdo_5.tif') gdalautotest-3.0.4/utilities/test_gdallocationinfo.py0000755003401500001440000001235413614005324022576 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdallocationinfo.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: gdallocationinfo testing # Author: Even Rouault # ############################################################################### # 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 sys import pytest sys.path.append('../gcore') from osgeo import gdal import gdaltest import test_cli_utilities ############################################################################### # Test basic usage def test_gdallocationinfo_1(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() (ret, err) = gdaltest.runexternal_out_and_err(test_cli_utilities.get_gdallocationinfo_path() + ' ../gcore/data/byte.tif 0 0') assert (err is None or err == ''), 'got error/warning' ret = ret.replace('\r\n', '\n') expected_ret = """Report: Location: (0P,0L) Band 1: Value: 107""" assert ret.startswith(expected_ret) ############################################################################### # Test -xml def test_gdallocationinfo_2(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' -xml ../gcore/data/byte.tif 0 0') ret = ret.replace('\r\n', '\n') expected_ret = """ 107 """ assert ret.startswith(expected_ret) ############################################################################### # Test -valonly def test_gdallocationinfo_3(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' -b 1 -valonly ../gcore/data/byte.tif 0 0') expected_ret = """107""" assert ret.startswith(expected_ret) ############################################################################### # Test -geoloc def test_gdallocationinfo_4(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' -geoloc ../gcore/data/byte.tif 440720.000 3751320.000') ret = ret.replace('\r\n', '\n') expected_ret = """Report: Location: (0P,0L) Band 1: Value: 107""" assert ret.startswith(expected_ret) ############################################################################### # Test -lifonly def test_gdallocationinfo_5(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' -lifonly ../gcore/data/byte.vrt 0 0') expected_ret1 = """../gcore/data/byte.tif""" expected_ret2 = """../gcore/data\\byte.tif""" assert expected_ret1 in ret or expected_ret2 in ret ############################################################################### # Test -overview def test_gdallocationinfo_6(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() src_ds = gdal.Open('../gcore/data/byte.tif') ds = gdal.GetDriverByName('GTiff').CreateCopy('tmp/test_gdallocationinfo_6.tif', src_ds) ds.BuildOverviews('AVERAGE', overviewlist=[2]) ds = None src_ds = None ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' tmp/test_gdallocationinfo_6.tif 10 10 -overview 1') gdal.GetDriverByName('GTiff').Delete('tmp/test_gdallocationinfo_6.tif') expected_ret = """Value: 130""" assert expected_ret in ret def test_gdallocationinfo_wgs84(): if test_cli_utilities.get_gdallocationinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_gdallocationinfo_path() + ' -valonly -wgs84 ../gcore/data/byte.tif -117.6354747 33.8970515') expected_ret = """115""" assert expected_ret in ret gdalautotest-3.0.4/utilities/test_gdalwarp_lib.py0000755003401500001440000022212713614005324021712 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdalwarp_lib.py a84c4ea25b201702c1065405b13656176b5b501e 2019-11-28 20:16:03 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: test librarified gdalwarp # Author: Faza Mahamood # ############################################################################### # Copyright (c) 2015, Faza Mahamood # 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 struct import os from osgeo import gdal, ogr, osr import gdaltest import ogrtest import pytest ############################################################################### # Simple test def test_gdalwarp_lib_1(): ds1 = gdal.Open('../gcore/data/byte.tif') dstDS = gdal.Warp('tmp/testgdalwarp1.tif', ds1) assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' dstDS = None ############################################################################### # Test -of option def test_gdalwarp_lib_2(): ds1 = gdal.Open('../gcore/data/byte.tif') dstDS = gdal.Warp('tmp/testgdalwarp2.tif'.encode('ascii').decode('ascii'), [ds1], format='GTiff') assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' dstDS = None ############################################################################### # Test -ot option def test_gdalwarp_lib_3(): ds1 = gdal.Open('../gcore/data/byte.tif') dstDS = gdal.Warp('', ds1, format='MEM', outputType=gdal.GDT_Int16) assert dstDS.GetRasterBand(1).DataType == gdal.GDT_Int16, 'Bad data type' assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' dstDS = None ############################################################################### # Test -t_srs option def test_gdalwarp_lib_4(): ds1 = gdal.Open('../gcore/data/byte.tif') dstDS = gdal.Warp('', ds1, format='MEM', dstSRS='EPSG:32611') assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' dstDS = None ############################################################################### # Test warping from GCPs without any explicit option def test_gdalwarp_lib_5(): ds = gdal.Open('../gcore/data/byte.tif') gcpList = [gdal.GCP(440720.000, 3751320.000, 0, 0, 0), gdal.GCP(441920.000, 3751320.000, 0, 20, 0), gdal.GCP(441920.000, 3750120.000, 0, 20, 20), gdal.GCP(440720.000, 3750120.000, 0, 0, 20)] ds1 = gdal.Translate('tmp/testgdalwarp_gcp.tif', ds, outputSRS='EPSG:26711', GCPs=gcpList) dstDS = gdal.Warp('', ds1, format='MEM', tps=True) assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(ds.GetGeoTransform(), dstDS.GetGeoTransform(), 1e-9), \ 'Bad geotransform' dstDS = None ############################################################################### # Test warping from GCPs with -tps def test_gdalwarp_lib_6(): ds1 = gdal.Open('tmp/testgdalwarp_gcp.tif') dstDS = gdal.Warp('', ds1, format='MEM', tps=True) assert dstDS.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), dstDS.GetGeoTransform(), 1e-9), \ 'Bad geotransform' dstDS = None ############################################################################### # Test -tr def test_gdalwarp_lib_7(): ds1 = gdal.Open('tmp/testgdalwarp_gcp.tif') dstDS = gdal.Warp('', [ds1], format='MEM', xRes=120, yRes=120) assert dstDS is not None expected_gt = (440720.0, 120.0, 0.0, 3751320.0, 0.0, -120.0) assert gdaltest.geotransform_equals(expected_gt, dstDS.GetGeoTransform(), 1e-9), \ 'Bad geotransform' dstDS = None ############################################################################### # Test -ts def test_gdalwarp_lib_8(): ds1 = gdal.Open('tmp/testgdalwarp_gcp.tif') dstDS = gdal.Warp('', [ds1], format='MEM', width=10, height=10) assert dstDS is not None expected_gt = (440720.0, 120.0, 0.0, 3751320.0, 0.0, -120.0) assert gdaltest.geotransform_equals(expected_gt, dstDS.GetGeoTransform(), 1e-9), \ 'Bad geotransform' dstDS = None ############################################################################### # Test -te def test_gdalwarp_lib_9(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', outputBounds=[440720.000, 3750120.000, 441920.000, 3751320.000]) assert gdaltest.geotransform_equals(gdal.Open('../gcore/data/byte.tif').GetGeoTransform(), ds.GetGeoTransform(), 1e-9), \ 'Bad geotransform' ds = None ############################################################################### # Test -rn def test_gdalwarp_lib_10(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=40, height=40, resampleAlg=gdal.GRIORA_NearestNeighbour) assert ds.GetRasterBand(1).Checksum() == 18784, 'Bad checksum' ds = None ############################################################################### # Test -rb def test_gdalwarp_lib_11(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=40, height=40, resampleAlg=gdal.GRIORA_Bilinear) ref_ds = gdal.Open('ref_data/testgdalwarp11.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) ref_ds = None if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) pytest.fail('Image too different from reference') ds = None ############################################################################### # Test -rc def test_gdalwarp_lib_12(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=40, height=40, resampleAlg=gdal.GRIORA_Cubic) ref_ds = gdal.Open('ref_data/testgdalwarp12.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) ref_ds = None if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) pytest.fail('Image too different from reference') ds = None ############################################################################### # Test -rcs def test_gdalwarp_lib_13(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=40, height=40, resampleAlg=gdal.GRIORA_CubicSpline) ref_ds = gdal.Open('ref_data/testgdalwarp13.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) ref_ds = None if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) pytest.fail('Image too different from reference') ds = None ############################################################################### # Test -r lanczos def test_gdalwarp_lib_14(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=40, height=40, resampleAlg=gdal.GRIORA_Lanczos) ref_ds = gdal.Open('ref_data/testgdalwarp14.tif') maxdiff = gdaltest.compare_ds(ds, ref_ds, verbose=0) ref_ds = None if maxdiff > 1: gdaltest.compare_ds(ds, ref_ds, verbose=1) pytest.fail('Image too different from reference') ds = None ############################################################################### # Test -dstnodata def test_gdalwarp_lib_15(): ds = gdal.Warp('', 'tmp/testgdalwarp_gcp.tif', format='MEM', dstSRS='EPSG:32610', dstNodata=1) assert ds.GetRasterBand(1).GetNoDataValue() == 1, 'Bad nodata value' assert ds.GetRasterBand(1).Checksum() == 4523, 'Bad checksum' ds = None ############################################################################### # Test -of VRT which is a special case def test_gdalwarp_lib_16(): ds = gdal.Warp('/vsimem/test_gdalwarp_lib_16.vrt', 'tmp/testgdalwarp_gcp.tif', format='VRT') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None gdal.Unlink('/vsimem/test_gdalwarp_lib_16.vrt') # Cannot write file with gdaltest.error_handler(): ds = gdal.Warp('/i_dont/exist/test_gdalwarp_lib_16.vrt', 'tmp/testgdalwarp_gcp.tif', format='VRT') assert ds is None ############################################################################### # Test -dstalpha def test_gdalwarp_lib_17(): ds = gdal.Warp('', '../gcore/data/rgbsmall.tif', format='MEM', dstAlpha=True) assert ds is not None assert ds.GetRasterBand(4) is not None, 'No alpha band generated' ds = None ############################################################################### # Test -et 0 which is a special case def test_gdalwarp_lib_19(): ds = gdal.Warp('', 'tmp/testgdalwarp_gcp.tif', format='MEM', errorThreshold=0) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ds = None ############################################################################### # Test cutline from OGR datasource. def test_gdalwarp_lib_21(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 19139, 'Bad checksum' ds = None ############################################################################### # Test cutline with ALL_TOUCHED enabled. def test_gdalwarp_lib_23(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', warpOptions=['CUTLINE_ALL_TOUCHED=TRUE'], cutlineDSName='data/cutline.vrt', cutlineLayer='cutline') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 20123, 'Bad checksum' ds = None ############################################################################### # Test -tap def test_gdalwarp_lib_32(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', targetAlignedPixels=True, xRes=100, yRes=50) assert ds is not None expected_gt = (440700.0, 100.0, 0.0, 3751350.0, 0.0, -50.0) got_gt = ds.GetGeoTransform() assert gdaltest.geotransform_equals(expected_gt, got_gt, 1e-9), 'Bad geotransform' assert ds.RasterXSize == 13 and ds.RasterYSize == 25, \ ('Wrong raster dimensions : %d x %d' % (ds.RasterXSize, ds.RasterYSize)) ds = None ############################################################################### # Test warping multiple sources def test_gdalwarp_lib_34(): srcds1 = gdal.Translate('', '../gcore/data/byte.tif', format='MEM', srcWin=[0, 0, 10, 20]) srcds2 = gdal.Translate('', '../gcore/data/byte.tif', format='MEM', srcWin=[10, 0, 10, 20]) ds = gdal.Warp('', [srcds1, srcds2], format='MEM') cs = ds.GetRasterBand(1).Checksum() gt = ds.GetGeoTransform() xsize = ds.RasterXSize ysize = ds.RasterYSize ds = None assert xsize == 20 and ysize == 20, 'bad dimensions' assert cs == 4672, 'bad checksum' expected_gt = (440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0) for i in range(6): assert abs(gt[i] - expected_gt[i]) <= 1e-5, 'bad gt' ############################################################################### # Test -te_srs def test_gdalwarp_lib_45(): ds = gdal.Warp('', ['../gcore/data/byte.tif'], format='MEM', outputBounds=[-117.641087629972, 33.8915301685897, -117.628190189534, 33.9024195619201], outputBoundsSRS='EPSG:4267') assert ds.GetRasterBand(1).Checksum() == 4672 ds = None ############################################################################### # Test -crop_to_cutline def test_gdalwarp_lib_46(): ds = gdal.Warp('', ['../gcore/data/utmsmall.tif'], format='MEM', cutlineDSName='data/cutline.vrt', cropToCutline=True) assert ds.GetRasterBand(1).Checksum() == 18837, 'Bad checksum' ds = None # Precisely test output raster bounds in no raster reprojection ccase src_ds = gdal.Translate('', '../gcore/data/byte.tif', format='MEM', outputBounds=[2, 49, 3, 48], outputSRS='EPSG:4326') cutlineDSName = '/vsimem/test_gdalwarp_lib_46.json' cutline_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(cutlineDSName) cutline_lyr = cutline_ds.CreateLayer('cutline') f = ogr.Feature(cutline_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2.13 48.13,2.83 48.13,2.83 48.83,2.13 48.83,2.13 48.13))')) cutline_lyr.CreateFeature(f) f = None cutline_lyr = None cutline_ds = None # No CUTLINE_ALL_TOUCHED: the extent should be smaller than the cutline ds = gdal.Warp('', src_ds, format='MEM', cutlineDSName=cutlineDSName, cropToCutline=True) got_gt = ds.GetGeoTransform() expected_gt = (2.15, 0.05, 0.0, 48.8, 0.0, -0.05) assert max([abs(got_gt[i]-expected_gt[i]) for i in range(6)]) <= 1e-8 assert ds.RasterXSize == 13 and ds.RasterYSize == 13 # Same but with CUTLINE_ALL_TOUCHED=YES: the extent should be larger # than the cutline ds = gdal.Warp('', src_ds, format='MEM', cutlineDSName=cutlineDSName, cropToCutline=True, warpOptions=['CUTLINE_ALL_TOUCHED=YES']) got_gt = ds.GetGeoTransform() expected_gt = (2.1, 0.05, 0.0, 48.85, 0.0, -0.05) assert max([abs(got_gt[i]-expected_gt[i]) for i in range(6)]) <= 1e-8 assert ds.RasterXSize == 15 and ds.RasterYSize == 15 # Test numeric stability when the cutline is exactly on pixel boundaries cutline_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(cutlineDSName) cutline_lyr = cutline_ds.CreateLayer('cutline') f = ogr.Feature(cutline_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2.15 48.15,2.85 48.15,2.85 48.85,2.15 48.85,2.15 48.15))')) cutline_lyr.CreateFeature(f) f = None cutline_lyr = None cutline_ds = None for warpOptions in [[], ['CUTLINE_ALL_TOUCHED=YES']]: ds = gdal.Warp('', src_ds, format='MEM', cutlineDSName=cutlineDSName, cropToCutline=True, warpOptions=warpOptions) got_gt = ds.GetGeoTransform() expected_gt = (2.15, 0.05, 0.0, 48.85, 0.0, -0.05) assert max([abs(got_gt[i]-expected_gt[i]) for i in range(6)]) <= 1e-8 assert ds.RasterXSize == 14 and ds.RasterYSize == 14 gdal.Unlink(cutlineDSName) ############################################################################### # Test -crop_to_cutline -tr X Y -wo CUTLINE_ALL_TOUCHED=YES (fixes for #1360) def test_gdalwarp_lib_cutline_all_touched_single_pixel(): cutlineDSName = '/vsimem/test_gdalwarp_lib_cutline_all_touched_single_pixel.json' cutline_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(cutlineDSName) cutline_lyr = cutline_ds.CreateLayer('cutline') f = ogr.Feature(cutline_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2.15 48.15,2.15000001 48.15000001,2.15 48.15000001,2.15 48.15))')) cutline_lyr.CreateFeature(f) f = None cutline_lyr = None cutline_ds = None src_ds = gdal.Translate('', '../gcore/data/byte.tif', format='MEM', outputBounds=[2, 49, 3, 48], outputSRS='EPSG:4326') ds = gdal.Warp('', src_ds, format='MEM', cutlineDSName=cutlineDSName, cropToCutline=True, warpOptions=['CUTLINE_ALL_TOUCHED=YES'], xRes=0.001, yRes=0.001) got_gt = ds.GetGeoTransform() expected_gt = (2.15, 0.001, 0.0, 48.151, 0.0, -0.001) assert max([abs(got_gt[i]-expected_gt[i]) for i in range(6)]) <= 1e-8, got_gt assert ds.RasterXSize == 1 and ds.RasterYSize == 1 gdal.Unlink(cutlineDSName) ############################################################################### # Test callback def mycallback(pct, msg, user_data): # pylint: disable=unused-argument user_data[0] = pct return 1 def test_gdalwarp_lib_100(): tab = [0] ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', callback=mycallback, callback_data=tab) assert ds is not None assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' assert tab[0] == 1.0, 'Bad percentage' ds = None ############################################################################### # Test with color table def test_gdalwarp_lib_101(): ds = gdal.Warp('', '../gdrivers/data/small_world_pct.tif', format='MEM') assert ds.GetRasterBand(1).GetColorTable() is not None, 'Did not get color table' ############################################################################### # Test with a dataset with no bands def test_gdalwarp_lib_102(): no_band_ds = gdal.GetDriverByName('MEM').Create('no band', 1, 1, 0) with gdaltest.error_handler(): ds = gdal.Warp('', ['../gdrivers/data/small_world_pct.tif', no_band_ds], format='MEM') assert ds is None, 'Did not expected dataset' ############################################################################### # Test failed transformer def test_gdalwarp_lib_103(): with gdaltest.error_handler(): ds = gdal.Warp('', ['../gdrivers/data/small_world_pct.tif', '../gcore/data/stefan_full_rgba.tif'], format='MEM') assert ds is None, 'Did not expected dataset' ############################################################################### # Test no usable source image def test_gdalwarp_lib_104(): with gdaltest.error_handler(): ds = gdal.Warp('', [], format='MEM') assert ds is None, 'Did not expected dataset' ############################################################################### # Test failure in GDALSuggestedWarpOutput2 def test_gdalwarp_lib_105(): # with proj 4.9.3 this will success. We limit the width and height # otherwise a very big raster will be created with 4.9.3 which may cause # hangups in Travis MacOSX with gdaltest.error_handler(): gdal.Warp('', ['../gdrivers/data/small_world_pct.tif', '../gcore/data/byte.tif'], format='MEM', dstSRS='EPSG:32645', width=100, height=100) ############################################################################### # Test failure in creation def test_gdalwarp_lib_106(): with gdaltest.error_handler(): ds = gdal.Warp('/not_existing_dir/not_existing_file', ['../gdrivers/data/small_world_pct.tif', '../gcore/data/byte.tif']) assert ds is None, 'Did not expected dataset' ############################################################################### # Test forced width only def test_gdalwarp_lib_107(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', width=20) assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ############################################################################### # Test forced height only def test_gdalwarp_lib_108(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', height=20) assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ############################################################################### # Test wrong cutline name def test_gdalwarp_lib_109(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', cutlineDSName='/does/not/exist') assert ds is None, 'Did not expected dataset' ############################################################################### # Test wrong cutline layer name def test_gdalwarp_lib_110(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='wrong_name') assert ds is None, 'Did not expected dataset' ############################################################################### # Test cutline SQL def test_gdalwarp_lib_111(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='data/cutline.vrt', cutlineSQL='SELECT * FROM cutline', cutlineWhere='1 = 1') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 19139, 'Bad checksum' ds = None ############################################################################### # Test cutline without geometry def test_gdalwarp_lib_112(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/cutline.shp') lyr = ds.CreateLayer('cutline') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='/vsimem/cutline.shp', cutlineSQL='SELECT * FROM cutline') assert ds is None, 'Did not expected dataset' ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/cutline.shp') ############################################################################### # Test cutline with non polygon geometry def test_gdalwarp_lib_113(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/cutline.shp') lyr = ds.CreateLayer('cutline') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None ds = None with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='/vsimem/cutline.shp') assert ds is None, 'Did not expected dataset' ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/cutline.shp') ############################################################################### # Test cutline without feature def test_gdalwarp_lib_114(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/cutline.shp') ds.CreateLayer('cutline') ds = None with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='/vsimem/cutline.shp') assert ds is None, 'Did not expected dataset' ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/cutline.shp') ############################################################################### # Test source dataset without band def test_gdalwarp_lib_115(): no_band_ds = gdal.GetDriverByName('MEM').Create('no band', 1, 1, 0) out_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 0) with gdaltest.error_handler(): ret = gdal.Warp(out_ds, no_band_ds, cutlineDSName='data/cutline.vrt', cutlineLayer='cutline') assert ret == 0, 'Expected failure' ############################################################################### # Test failed cropToCutline due to invalid SRC_SRS def test_gdalwarp_lib_116(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline', cropToCutline=True, transformerOptions=['SRC_SRS=invalid']) assert ds is None, 'Did not expected dataset' ############################################################################### # Test failed cropToCutline due to invalid DST_SRS def test_gdalwarp_lib_117(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline', cropToCutline=True, transformerOptions=['DST_SRS=invalid']) assert ds is None, 'Did not expected dataset' ############################################################################### # Test failed cropToCutline due to no source raster def test_gdalwarp_lib_118(): with gdaltest.error_handler(): ds = gdal.Warp('', [], format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline', cropToCutline=True) assert ds is None, 'Did not expected dataset' ############################################################################### # Test failed cropToCutline due to source raster without projection def test_gdalwarp_lib_119(): no_proj_ds = gdal.GetDriverByName('MEM').Create('no_proj_ds', 1, 1) with gdaltest.error_handler(): ds = gdal.Warp('', no_proj_ds, format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline', cropToCutline=True) assert ds is None, 'Did not expected dataset' ############################################################################### # Test failed cropToCutline due to source raster with dummy projection def test_gdalwarp_lib_120(): dummy_proj_ds = gdal.GetDriverByName('MEM').Create('no_proj_ds', 1, 1) dummy_proj_ds.SetProjection('dummy') with gdaltest.error_handler(): ds = gdal.Warp('', dummy_proj_ds, format='MEM', cutlineDSName='data/cutline.vrt', cutlineLayer='cutline', cropToCutline=True) assert ds is None, 'Did not expected dataset' ############################################################################### # Test internal wrappers def test_gdalwarp_lib_121(): # No option with gdaltest.error_handler(): gdal.wrapper_GDALWarpDestName('', [], None) # Will create an implicit options structure with gdaltest.error_handler(): gdal.wrapper_GDALWarpDestName('', [], None, gdal.TermProgress) # Null dest name try: gdal.wrapper_GDALWarpDestName(None, [], None) except: pass # No option with gdaltest.error_handler(): gdal.wrapper_GDALWarpDestDS(gdal.GetDriverByName('MEM').Create('', 1, 1), [], None) # Will create an implicit options structure with gdaltest.error_handler(): gdal.wrapper_GDALWarpDestDS(gdal.GetDriverByName('MEM').Create('', 1, 1), [], None, gdal.TermProgress) ############################################################################### # Test unnamed output VRT def test_gdalwarp_lib_122(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='VRT') assert ds.GetRasterBand(1).Checksum() == 4672, 'Bad checksum' ############################################################################### # Test failure during warping def test_gdalwarp_lib_123(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/byte_truncated.tif', format='MEM') assert ds is None ############################################################################### # Test warping to dataset with existing nodata def test_gdalwarp_lib_124(): src_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds.SetGeoTransform([10, 1, 0, 10, 0, -1]) src_ds.GetRasterBand(1).SetNoDataValue(12) src_ds.GetRasterBand(1).Fill(12) out_ds = gdal.GetDriverByName('MEM').Create('', 2, 2) out_ds.SetGeoTransform([10, 1, 0, 10, 0, -1]) out_ds.GetRasterBand(1).SetNoDataValue(21) out_ds.GetRasterBand(1).Fill(21) expected_cs = out_ds.GetRasterBand(1).Checksum() gdal.Warp(out_ds, src_ds) cs = out_ds.GetRasterBand(1).Checksum() assert cs == expected_cs, 'Bad checksum' ############################################################################### # Test that statistics are not propagated def test_gdalwarp_lib_125(): for i in range(3): src_ds_1 = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds_1.SetGeoTransform([10, 1, 0, 10, 0, -1]) if i == 1 or i == 3: src_ds_1.GetRasterBand(1).SetMetadataItem('STATISTICS_MINIUM', '5') src_ds_2 = gdal.GetDriverByName('MEM').Create('', 2, 2) src_ds_2.SetGeoTransform([10, 1, 0, 10, 0, -1]) if i == 2 or i == 3: src_ds_2.GetRasterBand(1).SetMetadataItem('STATISTICS_MINIUM', '5') out_ds = gdal.Warp('', [src_ds_1, src_ds_2], format='MEM') assert out_ds.GetRasterBand(1).GetMetadataItem('STATISTICS_MINIUM') is None, i ############################################################################### # Test cutline with invalid geometry def test_gdalwarp_lib_126(): if not ogrtest.have_geos(): pytest.skip() ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/cutline.shp') lyr = ds.CreateLayer('cutline') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,1 1,0 1,1 0,0 0))')) # Self intersecting lyr.CreateFeature(f) f = None ds = None with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', cutlineDSName='/vsimem/cutline.shp') assert ds is None, 'Did not expected dataset' ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/cutline.shp') ############################################################################### # Test -srcnodata (#6315) def test_gdalwarp_lib_127(): ds = gdal.Warp('', '../gcore/data/byte.tif', format='MEM', srcNodata=1) assert ds.GetRasterBand(1).GetNoDataValue() == 1, 'bad nodata value' assert ds.GetRasterBand(1).Checksum() == 4672, 'bad checksum' ############################################################################### # Test automatic densification of cutline (#6375) def test_gdalwarp_lib_128(): mem_ds = gdal.GetDriverByName('MEM').Create('', 1177, 4719) rpc = ["HEIGHT_OFF=109", "LINE_NUM_COEFF=-0.001245683 -0.09427649 -1.006342 -1.954469e-05 0.001033926 2.020534e-08 -3.845472e-07 -0.002075817 0.0005520694 0 -4.642442e-06 -3.271793e-06 2.705977e-05 -7.634384e-07 -2.132832e-05 -3.248862e-05 -8.17894e-06 -3.678094e-07 2.002032e-06 3.693162e-08", "LONG_OFF=7.1477", "SAMP_DEN_COEFF=1 0.01415176 -0.003715018 -0.001205632 -0.0007738299 4.057763e-05 -1.649126e-05 0.0001453584 0.0001628194 -7.354731e-05 4.821444e-07 -4.927701e-06 -1.942371e-05 -2.817499e-06 1.946396e-06 3.04243e-06 2.362282e-07 -2.5371e-07 -1.36993e-07 1.132432e-07", "LINE_SCALE=2360", "SAMP_NUM_COEFF=0.04337163 1.775948 -0.87108 0.007425391 0.01783631 0.0004057179 -0.000184695 -0.04257537 -0.01127869 -1.531228e-06 1.017961e-05 0.000572344 -0.0002941 -0.0001301705 -0.0003289546 5.394918e-05 6.388447e-05 -4.038289e-06 -7.525785e-06 -5.431241e-07", "LONG_SCALE=0.8383", "SAMP_SCALE=593", "SAMP_OFF=589", "LAT_SCALE=1.4127", "LAT_OFF=33.8992", "LINE_OFF=2359", "LINE_DEN_COEFF=1 0.0007273139 -0.0006006867 -4.272095e-07 2.578717e-05 4.718479e-06 -2.116976e-06 -1.347805e-05 -2.209958e-05 8.131258e-06 -7.290143e-08 5.105109e-08 -7.353388e-07 0 2.131142e-06 9.697701e-08 1.237039e-08 7.153246e-08 6.758015e-08 5.811124e-08", "HEIGHT_SCALE=96.3"] mem_ds.SetMetadata(rpc, "RPC") mem_ds.GetRasterBand(1).Fill(255) cutlineDSName = '/vsimem/test_gdalwarp_lib_128.json' cutline_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(cutlineDSName) cutline_lyr = cutline_ds.CreateLayer('cutline') f = ogr.Feature(cutline_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((7.2151 32.51930,7.214316 32.58116,7.216043 32.59476,7.21666 32.5193,7.2151 32.51930))')) cutline_lyr.CreateFeature(f) f = None cutline_lyr = None cutline_ds = None # Default is GDALWARP_DENSIFY_CUTLINE=YES ds = gdal.Warp('', mem_ds, format='MEM', cutlineDSName=cutlineDSName, dstSRS='EPSG:4326', outputBounds=[7.2, 32.52, 7.217, 32.59], xRes=0.000226555, yRes=0.000226555, transformerOptions=['RPC_DEM=data/test_gdalwarp_lib_128_dem.tif']) cs = ds.GetRasterBand(1).Checksum() assert cs == 4248, 'bad checksum' # Below steps depend on GEOS if not ogrtest.have_geos(): gdal.Unlink(cutlineDSName) return gdal.SetConfigOption('GDALWARP_DENSIFY_CUTLINE', 'ONLY_IF_INVALID') ds = gdal.Warp('', mem_ds, format='MEM', cutlineDSName=cutlineDSName, dstSRS='EPSG:4326', outputBounds=[7.2, 32.52, 7.217, 32.59], xRes=0.000226555, yRes=0.000226555, transformerOptions=['RPC_DEM=data/test_gdalwarp_lib_128_dem.tif']) gdal.SetConfigOption('GDALWARP_DENSIFY_CUTLINE', None) cs = ds.GetRasterBand(1).Checksum() assert cs == 4248, 'bad checksum' gdal.SetConfigOption('GDALWARP_DENSIFY_CUTLINE', 'NO') with gdaltest.error_handler(): ds = gdal.Warp('', mem_ds, format='MEM', cutlineDSName=cutlineDSName, dstSRS='EPSG:4326', outputBounds=[7.2, 32.52, 7.217, 32.59], xRes=0.000226555, yRes=0.000226555, transformerOptions=['RPC_DEM=data/test_gdalwarp_lib_128_dem.tif']) gdal.SetConfigOption('GDALWARP_DENSIFY_CUTLINE', None) assert ds is None, 'expected none return' gdal.Unlink(cutlineDSName) ############################################################################### # Test automatic densification of cutline, but with initial guess leading # to an invalid geometry (#6375) def test_gdalwarp_lib_129(): if not ogrtest.have_geos(): pytest.skip() mem_ds = gdal.GetDriverByName('MEM').Create('', 1000, 2000) rpc = ["HEIGHT_OFF=1767", "LINE_NUM_COEFF=0.0004430579 -0.06200816 -1.007087 1.614683e-05 0.0009263463 -1.003745e-07 -2.346893e-06 -0.001179024 -0.0007413534 0 9.41488e-08 -4.566652e-07 2.895947e-05 -2.925327e-07 -2.308839e-05 -1.502702e-05 -4.775127e-06 0 4.290483e-07 2.850458e-08", "LONG_OFF=-.2282", "SAMP_DEN_COEFF=1 -0.01907542 0.01651069 -0.001340671 -0.0005495095 -1.072863e-05 -1.157626e-05 0.0003737224 0.0002712591 -0.0001363199 3.614417e-08 3.584749e-06 9.175671e-06 2.661593e-06 -1.045511e-05 -1.293648e-06 -2.769964e-06 5.931109e-07 -1.018687e-07 2.366109e-07", "LINE_SCALE=11886", "SAMP_NUM_COEFF=0.007334337 1.737166 -0.7954719 -0.004635387 -0.007478255 0.0006381186 -0.0003313475 0.0002313095 -0.002883101 -1.625925e-06 -6.409095e-06 -0.000403506 -0.0004441055 -0.0002360882 8.940442e-06 -0.0001780485 0.0001081517 -6.592931e-06 2.642496e-06 6.316508e-07", "LONG_SCALE=0.6996", "SAMP_SCALE=2945", "SAMP_OFF=2926", "LAT_SCALE=1.4116", "LAT_OFF=.4344", "LINE_OFF=-115", "LINE_DEN_COEFF=1 0.0008882352 -0.0002437686 -2.380782e-06 2.69128e-05 0 2.144654e-07 -2.093549e-05 -7.055149e-06 4.740057e-06 0 -1.588607e-08 -1.397592e-05 0 -7.717698e-07 6.505002e-06 0 -1.225041e-08 3.608499e-08 -4.463376e-08", "HEIGHT_SCALE=1024"] mem_ds.SetMetadata(rpc, "RPC") mem_ds.GetRasterBand(1).Fill(255) cutlineDSName = '/vsimem/test_gdalwarp_lib_129.json' cutline_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource(cutlineDSName) cutline_lyr = cutline_ds.CreateLayer('cutline') f = ogr.Feature(cutline_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((-0.873086 0.511332,-0.626502 0.507654,-0.630715 0.282053,-0.876863 0.285693,-0.873086 0.511332))')) cutline_lyr.CreateFeature(f) f = None cutline_lyr = None cutline_ds = None ds = gdal.Warp('', mem_ds, format='MEM', cutlineDSName=cutlineDSName, dstSRS='EPSG:4326', outputBounds=[-1, 0, 0, 1], xRes=0.01, yRes=0.01, transformerOptions=['RPC_DEM=data/test_gdalwarp_lib_129_dem.vrt']) cs = ds.GetRasterBand(1).Checksum() assert cs == 399, 'bad checksum' gdal.Unlink(cutlineDSName) ############################################################################### # Test automatic detection and setting of alpha channel, and setting RGB on # GTiff output def test_gdalwarp_lib_130(): src_ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/test_gdalwarp_lib_130.tif', 1, 1, 5, options=['PHOTOMETRIC=RGB']) src_ds.SetGeoTransform([100, 1, 0, 200, 0, -1]) src_ds.GetRasterBand(5).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(1).Fill(1) src_ds.GetRasterBand(2).Fill(2) src_ds.GetRasterBand(3).Fill(3) src_ds.GetRasterBand(4).Fill(4) src_ds.GetRasterBand(5).Fill(255) ds = gdal.Warp('/vsimem/test_gdalwarp_lib_130_dst.tif', src_ds) assert ds.GetRasterBand(1).GetColorInterpretation() == gdal.GCI_RedBand, \ 'bad color interpretation' assert ds.GetRasterBand(5).GetColorInterpretation() == gdal.GCI_AlphaBand, \ 'bad color interpretation' expected_val = [1, 2, 3, 4, 255] for i in range(5): data = struct.unpack('B' * 1, ds.GetRasterBand(i + 1).ReadRaster())[0] assert data == expected_val[i], 'bad checksum' # Wrap onto existing file for i in range(5): ds.GetRasterBand(i + 1).Fill(0) gdal.Warp(ds, src_ds) for i in range(5): data = struct.unpack('B' * 1, ds.GetRasterBand(i + 1).ReadRaster())[0] assert data == expected_val[i], 'bad checksum' src_ds = None ds = None assert gdal.VSIStatL('/vsimem/test_gdalwarp_lib_130_dst.tif.aux.xml') is None, \ 'got PAM file' gdal.Unlink('/vsimem/test_gdalwarp_lib_130.tif') gdal.Unlink('/vsimem/test_gdalwarp_lib_130_dst.tif') ############################################################################### # Test -nosrcalpha def test_gdalwarp_lib_131(): src_ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/test_gdalwarp_lib_131.tif', 1, 1, 2) src_ds.SetGeoTransform([100, 1, 0, 200, 0, -1]) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) src_ds.GetRasterBand(1).Fill(1) src_ds.GetRasterBand(2).Fill(0) ds = gdal.Warp('/vsimem/test_gdalwarp_lib_131_dst.tif', src_ds, options='-nosrcalpha') expected_val = [1, 0] for i in range(2): data = struct.unpack('B' * 1, ds.GetRasterBand(i + 1).ReadRaster())[0] assert data == expected_val[i], 'bad checksum' src_ds = None ds = None gdal.Unlink('/vsimem/test_gdalwarp_lib_131.tif') gdal.Unlink('/vsimem/test_gdalwarp_lib_131_dst.tif') gdal.Unlink('/vsimem/test_gdalwarp_lib_131_dst.tif.aux.xml') ############################################################################### # Test that alpha blending works by warping onto an existing dataset # with alpha > 0 and < 255 def test_gdalwarp_lib_132(): for dt in [gdal.GDT_Byte, gdal.GDT_Float32]: src_ds = gdal.GetDriverByName('GTiff').Create( '/vsimem/test_gdalwarp_lib_132.tif', 33, 1, 2, dt) src_ds.SetGeoTransform([100, 1, 0, 200, 0, -1]) src_ds.GetRasterBand(2).SetColorInterpretation(gdal.GCI_AlphaBand) ds = gdal.Translate('/vsimem/test_gdalwarp_lib_132_dst.tif', src_ds) dst_grey = 60 dst_alpha = 100 ds.GetRasterBand(1).Fill(dst_grey) ds.GetRasterBand(2).Fill(dst_alpha) src_grey = 170 src_alpha = 200 src_ds.GetRasterBand(1).Fill(src_grey) src_ds.GetRasterBand(2).Fill(src_alpha) gdal.Warp(ds, src_ds) expected_alpha = int(src_alpha + dst_alpha * (255 - src_alpha) / 255. + 0.5) expected_grey = int((src_grey * src_alpha + dst_grey * dst_alpha * (255 - src_alpha) / 255.) / expected_alpha + 0.5) expected_val = [expected_grey, expected_alpha] for i in range(2): for x in range(33): data = struct.unpack('B' * 1, ds.GetRasterBand(i + 1).ReadRaster(i, 0, 1, 1, buf_type=gdal.GDT_Byte))[0] if abs(data - expected_val[i]) > 1: print(dt) print(x) pytest.fail('bad checksum') ds = None src_ds = None gdal.Unlink('/vsimem/test_gdalwarp_lib_132.tif') gdal.Unlink('/vsimem/test_gdalwarp_lib_132_dst.tif') gdal.Unlink('/vsimem/test_gdalwarp_lib_132_dst.tif.aux.xml') ############################################################################### # Test cutline with multiple touching polygons def test_gdalwarp_lib_133(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/test_gdalwarp_lib_133.shp') lyr = ds.CreateLayer('cutline') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,1 0,1 1,0 1,0 0))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((1 0,2 0,2 1,1 1,1 0))')) lyr.CreateFeature(f) f = None ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 4, 1) src_ds.SetGeoTransform([0, 1, 0, 1, 0, -1]) src_ds.GetRasterBand(1).Fill(255) ds = gdal.Warp('', src_ds, format='MEM', cutlineDSName='/vsimem/test_gdalwarp_lib_133.shp') assert ds is not None assert ds.GetRasterBand(1).Checksum() == 5, 'Bad checksum' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/test_gdalwarp_lib_133.shp') ############################################################################### # Test SRC_METHOD=NO_GEOTRANSFORM and DST_METHOD=NO_GEOTRANSFORM (#6721) def test_gdalwarp_lib_134(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/test_gdalwarp_lib_134.shp') lyr = ds.CreateLayer('cutline') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2 2,2 18,18 18,18 2,2 2))')) lyr.CreateFeature(f) f = None ds = None src_src_ds = gdal.Open('../gcore/data/byte.tif') src_ds = gdal.GetDriverByName('MEM').Create('', 20, 20) src_ds.GetRasterBand(1).WriteRaster(0, 0, 20, 20, src_src_ds.GetRasterBand(1).ReadRaster()) ds = gdal.Warp('', src_ds, format='MEM', transformerOptions=['SRC_METHOD=NO_GEOTRANSFORM', 'DST_METHOD=NO_GEOTRANSFORM'], outputBounds=[1, 2, 4, 6]) assert ds is not None assert ds.GetRasterBand(1).ReadRaster() == src_src_ds.GetRasterBand(1).ReadRaster(1, 2, 4 - 1, 6 - 2), \ 'Bad checksum' ds = None ds = gdal.Warp('', src_ds, format='MEM', transformerOptions=['SRC_METHOD=NO_GEOTRANSFORM', 'DST_METHOD=NO_GEOTRANSFORM'], cutlineDSName='/vsimem/test_gdalwarp_lib_134.shp', cropToCutline=True) assert ds is not None assert ds.GetRasterBand(1).ReadRaster() == src_src_ds.GetRasterBand(1).ReadRaster(2, 2, 16, 16), \ 'Bad checksum' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/test_gdalwarp_lib_134.shp') ############################################################################### # Test vertical datum shift def test_gdalwarp_lib_135(): src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) src_ds.GetRasterBand(1).Fill(100) sr = osr.SpatialReference() sr.SetFromUserInput("WGS84") src_ds_longlat = gdal.GetDriverByName('MEM').Create('', 2, 1) src_ds_longlat.SetProjection(sr.ExportToWkt()) src_ds_longlat.SetGeoTransform([-180, 180, 0, 90, 0, -180]) src_ds_longlat.GetRasterBand(1).Fill(100) grid_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/grid.tif', 1, 1) grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.SetGeoTransform([-180, 360, 0, 90, 0, -180]) grid_ds.GetRasterBand(1).Fill(20) grid_ds = None grid_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/grid2.tif', 1, 1) grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.SetGeoTransform([-180, 360, 0, 90, 0, -180]) grid_ds.GetRasterBand(1).Fill(5) grid_ds = None gdal.GetDriverByName('GTiff').Create('/vsimem/ungeoref_grid.tif', 1, 1) # Forward transform ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' ds = gdal.Warp('', src_ds_longlat, format='MEM', srcSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') assert ds.GetGeoTransform() == (-180, 180, 0, 90, 0, -180) data = struct.unpack('B' * 2, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Inverse transform ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 80, 'Bad value' ds = gdal.Warp('', src_ds_longlat, format='MEM', srcSRS='EPSG:4979', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') assert ds.GetGeoTransform() == (-180, 180, 0, 90, 0, -180) data = struct.unpack('B' * 2, ds.GetRasterBand(1).ReadRaster())[0] assert data == 80, 'Bad value' # Both transforms ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid2.tif +vunits=m +no_defs') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 115, 'Bad value' # Both transforms, but none of them have geoidgrids ds = gdal.Warp('', src_ds, format='MEM', srcSRS='EPSG:32631+5730', dstSRS='EPSG:4326+5621') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' # Both transforms being a no-op ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' # Both transforms to anonymous VRT ds = gdal.Warp('', src_ds, format='VRT', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid2.tif +vunits=m +no_defs') src_ds = None # drop the ref to src_ds before for fun data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 115, 'Bad value' src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) src_ds.GetRasterBand(1).Fill(100) # Both transforms to regular VRT gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/dem.tif', src_ds) gdal.Warp('/vsimem/tmp.vrt', '/vsimem/dem.tif', format='VRT', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/grid2.tif +vunits=m +no_defs') ds = gdal.Open('/vsimem/tmp.vrt') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] ds = None gdal.Unlink('/vsimem/dem.tif') gdal.Unlink('/vsimem/tmp.vrt') assert data == 115, 'Bad value' # Missing grid in forward path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') assert ds is None # Missing grid in forward path with PROJ_LIB old_proj_lib = os.environ.get('PROJ_LIB', None) os.environ['PROJ_LIB'] = '/i_dont/exist' with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') if old_proj_lib: os.environ['PROJ_LIB'] = old_proj_lib else: del os.environ['PROJ_LIB'] assert ds is None # Missing grid in forward path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=~/i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') assert ds is None # Missing grid in forward path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/i_dont/exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') assert ds is None # Ungeoref grid in forward path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/ungeoref_grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') assert ds is None # Missing grid in inverse path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=i_dont_exist.tif +vunits=m +no_defs') assert ds is None # Ungeoref grid in inverse path with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=/vsimem/ungeoref_grid.tif +vunits=m +no_defs') assert ds is None # Missing grid in forward path, but this is OK ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=@i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' # Missing grid in inverse path but this is OK ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs', dstSRS='+proj=longlat +datum=WGS84 +geoidgrids=@i_dont_exist.tif +vunits=m +no_defs') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' # Forward transform with explicit m unit src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(100) src_ds.GetRasterBand(1).SetUnitType('m') ds = gdal.Warp('', src_ds, format='MEM', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Forward transform with explicit ft unit src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1, 1, gdal.GDT_Float32) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(100 / 0.3048) src_ds.GetRasterBand(1).SetUnitType('ft') ds = gdal.Warp('', src_ds, format='MEM', dstSRS='EPSG:4979', outputType=gdal.GDT_Byte) data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Forward transform with explicit unhandled unit src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) sr = osr.SpatialReference() sr.ImportFromProj4('+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif +vunits=m +no_defs') src_ds.SetProjection(sr.ExportToWkt()) src_ds.GetRasterBand(1).Fill(100) src_ds.GetRasterBand(1).SetUnitType('unhandled') with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' grid_ds = gdal.GetDriverByName('GTiff').Create('/vsimem/empty_grid.tif', 1, 1) sr = osr.SpatialReference() sr.SetFromUserInput("WGS84") grid_ds.SetProjection(sr.ExportToWkt()) grid_ds.SetGeoTransform([-180, 360, 0, 90, 0, -180]) grid_ds.GetRasterBand(1).Fill(255) grid_ds.GetRasterBand(1).SetNoDataValue(255) grid_ds = None src_ds = gdal.GetDriverByName('MEM').Create('', 1, 1) src_ds.SetGeoTransform([500000, 1, 0, 4000000, 0, -1]) src_ds.GetRasterBand(1).Fill(100) # Test missing shift values in area of interest ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/empty_grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' # Same, but make it an error with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/empty_grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979', transformerOptions=['ERROR_ON_MISSING_VERT_SHIFT=YES']) if ds is not None: print(data) pytest.fail('Bad value') # Test several grids ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif,/vsimem/empty_grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Same, but different order ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/empty_grid.tif,/vsimem/grid.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Test several grids, with some missing with gdaltest.error_handler(): ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif,i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') if ds is not None: print(data) pytest.fail('Bad value') # Test several grids, with some missing, but that's OK ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=/vsimem/grid.tif,@i_dont_exist.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 120, 'Bad value' # Test several grids, with all missing, but that's OK ds = gdal.Warp('', src_ds, format='MEM', srcSRS='+proj=utm +zone=31 +datum=WGS84 +units=m +geoidgrids=@i_dont_exist.tif,@i_dont_exist_either.tif +vunits=m +no_defs', dstSRS='EPSG:4979') data = struct.unpack('B' * 1, ds.GetRasterBand(1).ReadRaster())[0] assert data == 100, 'Bad value' gdal.GetDriverByName('GTiff').Delete('/vsimem/grid.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/grid2.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/ungeoref_grid.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/empty_grid.tif') ############################################################################### # Test error code path linked with failed warper initialization def test_gdalwarp_lib_136(): with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='MEM', warpOptions=['CUTLINE=invalid']) assert ds is None with gdaltest.error_handler(): ds = gdal.Warp('', '../gcore/data/utmsmall.tif', format='VRT', warpOptions=['CUTLINE=invalid']) assert ds is None ############################################################################### # Test warping two input datasets with different SRS, with no explicit target SRS def test_gdalwarp_lib_several_sources_with_different_srs_no_explicit_target_srs(): src_ds = gdal.Open('../gcore/data/byte.tif') src_ds_32611_left = gdal.Translate('', src_ds, format='MEM', srcWin=[0, 0, 10, 20], outputSRS='EPSG:32611') src_ds_32611_right = gdal.Translate('', src_ds, format='MEM', srcWin=[10, 0, 10, 20], outputSRS='EPSG:32611') src_ds_4326_right = gdal.Warp('', src_ds_32611_right, format='MEM', dstSRS='EPSG:4326') out_ds = gdal.Warp('', [src_ds_4326_right, src_ds_32611_left], format='MEM') assert out_ds is not None assert out_ds.RasterXSize == 23 cs = out_ds.GetRasterBand(1).Checksum() assert cs == 5048 ############################################################################### # Test fix for https://trac.osgeo.org/gdal/ticket/7243 def test_gdalwarp_lib_touching_dateline(): src_ds = gdal.GetDriverByName('MEM').Create('', 100, 100) src_ds.SetGeoTransform([-2050000, 500, 0, 2100000, 0, -500]) sr = osr.SpatialReference() sr.ImportFromEPSG(3411) src_ds.SetProjection(sr.ExportToWkt()) out_ds = gdal.Warp('', src_ds, dstSRS='EPSG:4326', format='MEM') assert out_ds.RasterXSize == 319 ############################################################################### # Test fix for https://trac.osgeo.org/gdal/ticket/7245 def test_gdalwarp_lib_override_default_output_nodata(): drv = gdal.GetDriverByName('netCDF') if drv is None: pytest.skip() creationoptionlist = drv.GetMetadataItem('DMD_CREATIONOPTIONLIST') formats = ['NC'] if 'NC2' in creationoptionlist: formats += ['NC2'] if 'NC4' in creationoptionlist: formats += ['NC4', 'NC4C'] for frmt in formats: gdal.Warp('tmp/out.nc', '../gcore/data/byte.tif', srcNodata=255, format='netCDF', creationOptions=['FORMAT=' + frmt]) ds = gdal.Open('tmp/out.nc') assert ds.GetRasterBand(1).GetNoDataValue() == 255, frmt assert ds.GetProjection() != '', frmt ds = None os.unlink('tmp/out.nc') ############################################################################### # Test automatting setting (or not) of SKIP_NOSOURCE=YES def test_gdalwarp_lib_auto_skip_nosource(): sr = osr.SpatialReference() sr.ImportFromEPSG(4326) src_ds = gdal.GetDriverByName('MEM').Create('', 1000, 500) src_ds.GetRasterBand(1).Fill(255) src_ds.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) src_ds.SetProjection(sr.ExportToWkt()) tmpfilename = '/vsimem/test_gdalwarp_lib_auto_skip_nosource.tif' for options in ['-wo SKIP_NOSOURCE=NO', '', '-wo INIT_DEST=0', '-wo INIT_DEST=NO_DATA', '-dstnodata 0']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, src_ds, options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of GTiff ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 41500, (options, cs) # Same with MEM for options in ['', '-wo INIT_DEST=0', '-dstnodata 0']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, src_ds, options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of MEM ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 41500, (options, cs) # Use fill/nodata at 1 for options in [ # '-wo SKIP_NOSOURCE=NO -dstnodata 1', '-dstnodata 1', '-dstnodata 1 -wo INIT_DEST=NO_DATA', '-dstnodata 1 -wo INIT_DEST=1']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, src_ds, options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of GTiff ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 51132, (options, cs) # Same with MEM for options in [ # '-wo SKIP_NOSOURCE=NO -dstnodata 1', '-dstnodata 1', '-dstnodata 1 -wo INIT_DEST=NO_DATA', '-dstnodata 1 -wo INIT_DEST=1']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, src_ds, options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of MEM ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 51132, (options, cs) # Rather dummy: use a INIT_DEST different of the target dstnodata for options in [ # '-wo SKIP_NOSOURCE=NO -dstnodata 1 -wo INIT_DEST=0', '-dstnodata 127 -wo INIT_DEST=0']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, src_ds, options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of GTiff ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 41500, (options, cs) # Test with 2 input datasets src_ds1 = gdal.GetDriverByName('MEM').Create('', 500, 500) src_ds1.GetRasterBand(1).Fill(255) src_ds1.SetGeoTransform([2, 0.001, 0, 49, 0, -0.001]) src_ds1.SetProjection(sr.ExportToWkt()) src_ds2 = gdal.GetDriverByName('MEM').Create('', 500, 500) src_ds2.GetRasterBand(1).Fill(255) src_ds2.SetGeoTransform([2.5, 0.001, 0, 49, 0, -0.001]) src_ds2.SetProjection(sr.ExportToWkt()) for options in ['']: gdal.Unlink(tmpfilename) out_ds = gdal.Warp(tmpfilename, [src_ds1, src_ds2], options='-te 1.5 48 3.5 49.5 -wm 100000 ' + '-of GTiff ' + options) cs = out_ds.GetRasterBand(1).Checksum() assert cs == 41500, (options, cs) gdal.Unlink(tmpfilename) ############################################################################### # Test warping a full EPSG:4326 extent to +proj=ortho # (https://github.com/OSGeo/gdal/issues/862) def test_gdalwarp_lib_to_ortho(): out_ds = gdal.Warp("/tmp/out.tif", "../gdrivers/data/small_world.tif", options='-of MEM -t_srs "+proj=ortho +datum=WGS84" -ts 1024 1024') line = out_ds.GetRasterBand(1).ReadRaster(0, 0, out_ds.RasterXSize, 1) line = struct.unpack('B' * out_ds.RasterXSize, line) # Fail if the first line is completely black assert line.count(0) != out_ds.RasterXSize, 'first line is completely black' line = out_ds.GetRasterBand(1).ReadRaster(0, out_ds.RasterYSize - 1, out_ds.RasterXSize, 1) line = struct.unpack('B' * out_ds.RasterXSize, line) # Fail if the last line is completely black assert line.count(0) != out_ds.RasterXSize, 'last line is completely black' ############################################################################### def test_gdalwarp_lib_insufficient_dst_band_count(): src_ds = gdal.Translate('', '../gcore/data/byte.tif', options='-of MEM -b 1 -b 1') dst_ds = gdal.Translate('', '../gcore/data/byte.tif', options='-of MEM') with gdaltest.error_handler(): assert gdal.Warp(dst_ds, src_ds) == 0 ############################################################################### # Test -ct def test_gdalwarp_lib_ct(): dstDS = gdal.Warp('', '../gcore/data/byte.tif', options = '-r cubic -f MEM -t_srs EPSG:4326 -ct "proj=pipeline step inv proj=utm zone=11 ellps=clrk66 step proj=unitconvert xy_in=rad xy_out=deg step proj=axisswap order=2,1"') assert dstDS.GetRasterBand(1).Checksum() == 4705, 'Bad checksum' def test_gdalwarp_lib_ct_wkt(): wkt = """CONCATENATEDOPERATION["Inverse of UTM zone 11N + Null geographic offset from NAD27 to WGS 84", SOURCECRS[ PROJCRS["NAD27 / UTM zone 11N", BASEGEOGCRS["NAD27", DATUM["North American Datum 1927", ELLIPSOID["Clarke 1866",6378206.4,294.978698213898, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]]], CONVERSION["UTM zone 11N", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-117, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], USAGE[ SCOPE["unknown"], AREA["North America - 120°W to 114°W and NAD27 by country - onshore"], BBOX[26.93,-120,78.13,-114]], ID["EPSG",26711]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]], ID["EPSG",4326]]], STEP[ CONVERSION["Inverse of UTM zone 11N", METHOD["Inverse of Transverse Mercator", ID["INVERSE(EPSG)",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-117, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",0, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["INVERSE(EPSG)",16011]]], STEP[ COORDINATEOPERATION["Null geographic offset from NAD27 to WGS 84", SOURCECRS[ GEOGCRS["NAD27", DATUM["North American Datum 1927", ELLIPSOID["Clarke 1866",6378206.4,294.978698213898, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], USAGE[ SCOPE["unknown"], AREA["North America - NAD27"], BBOX[7.15,167.65,83.17,-47.74]], ID["EPSG",4267]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]], ID["EPSG",4326]]], METHOD["Geographic2D offsets", ID["EPSG",9619]], PARAMETER["Latitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8601]], PARAMETER["Longitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8602]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]]]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]]]""" dstDS = gdal.Warp('', '../gcore/data/byte.tif', resampleAlg=gdal.GRIORA_Cubic, format='MEM', dstSRS='EPSG:4326', coordinateOperation=wkt) assert dstDS.GetRasterBand(1).Checksum() == 4705, 'Bad checksum' ############################################################################### # Test warping from a RPC dataset to a new dataset larger than needed def test_gdalwarp_lib_restrict_output_dataset_warp_rpc_new(): dstDS = gdal.Warp('', 'data/unstable_rpc_with_dem_source.tif', options = '-f MEM -et 0 -to RPC_DEM=data/unstable_rpc_with_dem_elevation.tif -to RPC_MAX_ITERATIONS=40 -to RPC_DEM_MISSING_VALUE=0 -t_srs EPSG:3857 -te 12693400.445 2547311.740 12700666.740 2553269.051 -ts 380 311') cs = dstDS.GetRasterBand(1).Checksum() assert cs == 53230 with gdaltest.config_option('RESTRICT_OUTPUT_DATASET_UPDATE', 'NO'): dstDS = gdal.Warp('', 'data/unstable_rpc_with_dem_source.tif', options = '-f MEM -et 0 -to RPC_DEM=data/unstable_rpc_with_dem_elevation.tif -to RPC_MAX_ITERATIONS=40 -to RPC_DEM_MISSING_VALUE=0 -t_srs EPSG:3857 -te 12693400.445 2547311.740 12700666.740 2553269.051 -ts 380 311') cs = dstDS.GetRasterBand(1).Checksum() assert cs != 53230 ############################################################################### # Test warping from a RPC dataset to an existing dataset def test_gdalwarp_lib_restrict_output_dataset_warp_rpc_existing(): dstDS = gdal.Translate('', 'data/unstable_rpc_with_dem_blank_output.tif', format = 'MEM') gdal.Warp(dstDS, 'data/unstable_rpc_with_dem_source.tif', options = '-et 0 -to RPC_DEM=data/unstable_rpc_with_dem_elevation.tif -to RPC_MAX_ITERATIONS=40 -to RPC_DEM_MISSING_VALUE=0') cs = dstDS.GetRasterBand(1).Checksum() assert cs == 53230 ############################################################################### # Test warping from a RPC dataset to an existing dataset, with using RPC_FOOTPRINT def test_gdalwarp_lib_restrict_output_dataset_warp_rpc_existing_RPC_FOOTPRINT(): if not ogrtest.have_geos(): pytest.skip() with gdaltest.config_option('RESTRICT_OUTPUT_DATASET_UPDATE', 'NO'): dstDS = gdal.Translate('', 'data/unstable_rpc_with_dem_blank_output.tif', format = 'MEM') gdal.Warp(dstDS, 'data/unstable_rpc_with_dem_source.tif', options = '-et 0 -to RPC_DEM=data/unstable_rpc_with_dem_elevation.tif -to RPC_MAX_ITERATIONS=40 -to RPC_DEM_MISSING_VALUE=0 -to "RPC_FOOTPRINT=POLYGON ((114.070906445526 22.329620213341,114.085953272341 22.3088955493586,114.075520805749 22.3027084861851,114.060942102434 22.3236815197571,114.060942102434 22.3236815197571,114.060942102434 22.3236815197571,114.060942102434 22.3236815197571,114.070906445526 22.329620213341))"') cs = dstDS.GetRasterBand(1).Checksum() assert cs == 53230 ############################################################################### # Test warping from EPSG:4326 to EPSG:3857 def test_gdalwarp_lib_bug_4326_to_3857(): ds = gdal.Warp('', 'data/test_bug_4326_to_3857.tif', options = '-f MEM -t_srs EPSG:3857 -ts 20 20') cs = ds.GetRasterBand(1).Checksum() assert cs == 4672 ############################################################################### # Cleanup def test_gdalwarp_lib_cleanup(): # We don't clean up when run in debug mode. if gdal.GetConfigOption('CPL_DEBUG', 'OFF') == 'ON': return for i in range(2): try: os.remove('tmp/testgdalwarp' + str(i + 1) + '.tif') except OSError: pass try: os.remove('tmp/testgdalwarp_gcp.tif') except OSError: pass gdalautotest-3.0.4/utilities/test_gdal_grid.py0000755003401500001440000010603313614005324021174 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: test_gdal_grid.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: gdal_grid testing # 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 sys import os import struct import pytest sys.path.append('../gcore') from osgeo import gdal from osgeo import ogr import gdaltest import ogrtest import test_cli_utilities # List of output TIFF files that will be created by tests and later deleted # in test_gdal_grid_cleanup() outfiles = [] # Path to gdal_grid utility executable gdal_grid = test_cli_utilities.get_gdal_grid_path() ############################################################################### # def test_gdal_grid_1(): if gdal_grid is None: pytest.skip() shape_drv = ogr.GetDriverByName('ESRI Shapefile') outfiles.append('tmp/n43.tif') try: os.remove('tmp/n43.shp') except OSError: pass try: os.remove('tmp/n43.dbf') except OSError: pass try: os.remove('tmp/n43.shx') except OSError: pass try: os.remove('tmp/n43.qix') except OSError: pass # Create an OGR grid from the values of n43.dt0 ds = gdal.Open('../gdrivers/data/n43.dt0') geotransform = ds.GetGeoTransform() shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_ds = shape_drv.CreateDataSource('tmp') shape_lyr = shape_ds.CreateLayer('n43') data = ds.ReadRaster(0, 0, 121, 121) array_val = struct.unpack('h' * 121 * 121, data) for j in range(121): for i in range(121): wkt = 'POINT(%f %f %s)' % (geotransform[0] + (i + .5) * geotransform[1], geotransform[3] + (j + .5) * geotransform[5], array_val[j * 121 + i]) dst_feat = ogr.Feature(feature_def=shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) shape_lyr.CreateFeature(dst_feat) dst_feat.Destroy() shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON n43') shape_ds.Destroy() # Create a GDAL dataset from the previous generated OGR grid (_, err) = gdaltest.runexternal_out_and_err(gdal_grid + ' -txe -80.0041667 -78.9958333 -tye 42.9958333 44.0041667 -outsize 121 121 -ot Int16 -a nearest:radius1=0.0:radius2=0.0:angle=0.0 -co TILED=YES -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 tmp/n43.shp ' + outfiles[-1]) assert (err is None or err == ''), 'got error/warning' # We should get the same values as in n43.td0 ds2 = gdal.Open(outfiles[-1]) assert ds.GetRasterBand(1).Checksum() == ds2.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds2.GetRasterBand(1).Checksum())) assert ds2.GetRasterBand(1).GetNoDataValue() is None, 'did not expect nodata value' ds = None ds2 = None ############################################################################### # Test Nearest Neighbour gridding algorithm def test_gdal_grid_2(): if gdal_grid is None: pytest.skip() # Open reference dataset ds_ref = gdal.Open('../gcore/data/byte.tif') checksum_ref = ds_ref.GetRasterBand(1).Checksum() ds_ref = None ################# outfiles.append('tmp/grid_near.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Grid nodes are located exactly in raster nodes. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=0.0:radius2=0.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') assert ds.GetRasterBand(1).GetNoDataValue() == 0.0, 'expected a nodata value' ds = None ################# outfiles.append('tmp/grid_near_shift.tif') try: os.remove(outfiles[-1]) except OSError: pass # Now the same, but shift grid nodes a bit in both horizontal and vertical # directions. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=0.0:radius2=0.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') ds = None ################# outfiles.append('tmp/grid_near_search3.tif') try: os.remove(outfiles[-1]) except OSError: pass # Now try the search ellipse larger than the raster cell. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=180.0:radius2=180.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') ds = None ################# outfiles.append('tmp/grid_near_search1.tif') try: os.remove(outfiles[-1]) except OSError: pass # Search ellipse smaller than the raster cell. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=20.0:radius2=20.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') ds = None ################# outfiles.append('tmp/grid_near_shift_search3.tif') try: os.remove(outfiles[-1]) except OSError: pass # Large search ellipse and the grid shift. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=180.0:radius2=180.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') ds = None ################# outfiles.append('tmp/grid_near_shift_search1.tif') try: os.remove(outfiles[-1]) except OSError: pass # Small search ellipse and the grid shift. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=20.0:radius2=20.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) if ds.GetRasterBand(1).Checksum() != checksum_ref: print('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), checksum_ref)) pytest.fail('bad checksum') ds = None ############################################################################### # Test Inverse Distance to a Power gridding algorithm def test_gdal_grid_3(): if gdal_grid is None: pytest.skip() ################# # Test generic implementation (no AVX, no SSE) outfiles.append('tmp/grid_invdist_generic.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". print('Step 1: Disabling AVX/SSE optimized versions...') (_, err) = gdaltest.runexternal_out_and_err(gdal_grid + ' --debug on --config GDAL_USE_AVX NO --config GDAL_USE_SSE NO -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) pos = err.find(' threads') if pos >= 0: pos_blank = err[0:pos - 1].rfind(' ') if pos_blank >= 0: print('Step 1: %s threads used' % err[pos_blank + 1:pos]) # We should get the same values as in "ref_data/gdal_invdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# # Potentially test optimized SSE implementation outfiles.append('tmp/grid_invdist_sse.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". print('Step 2: Trying SSE optimized version...') (_, err) = gdaltest.runexternal_out_and_err(gdal_grid + ' --debug on --config GDAL_USE_AVX NO -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) if 'SSE' in err: print('...SSE optimized version used') else: print('...SSE optimized version NOT used') # We should get the same values as in "ref_data/gdal_invdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# # Potentially test optimized AVX implementation outfiles.append('tmp/grid_invdist_avx.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". print('Step 3: Trying AVX optimized version...') (_, err) = gdaltest.runexternal_out_and_err(gdal_grid + ' --debug on -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) if 'AVX' in err: print('...AVX optimized version used') else: print('...AVX optimized version NOT used') # We should get the same values as in "ref_data/gdal_invdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# # Test GDAL_NUM_THREADS config option to 1 outfiles.append('tmp/grid_invdist_1thread.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". gdaltest.runexternal(gdal_grid + ' --config GDAL_NUM_THREADS 1 -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/gdal_invdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# # Test GDAL_NUM_THREADS config option to 2 outfiles.append('tmp/grid_invdist_2threads.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". gdaltest.runexternal(gdal_grid + ' --config GDAL_NUM_THREADS 2 -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/gdal_invdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# outfiles.append('tmp/grid_invdist_90_90_8p.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Circular window, shifted, test min points and NODATA setting. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdist:power=2.0:radius1=90.0:radius2=90.0:angle=0.0:max_points=0:min_points=8:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_invdist_90_90_8p.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdist_90_90_8p.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ############################################################################### # Test Moving Average gridding algorithm def test_gdal_grid_4(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_average.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # We are using all the points from input dataset to average, so # the result is a raster filled with the same value in each node. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_average.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_average.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ################# outfiles.append('tmp/grid_average_190_190.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # This time using a circular window. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average:radius1=190.0:radius2=190.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_average_190_190.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_average_190_190.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ################# outfiles.append('tmp/grid_average_300_100_40.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Elliptical window, rotated. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average:radius1=300.0:radius2=100.0:angle=40.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_average_300_100_40.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_average_300_100_40.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ################# outfiles.append('tmp/grid_average_90_90_8p.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Circular window, shifted, test min points and NODATA setting. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average:radius1=90.0:radius2=90.0:angle=0.0:min_points=8:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_average_90_90_8p.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_average_90_90_8p.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ############################################################################### # Test Minimum data metric def test_gdal_grid_5(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_minimum.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Search the whole dataset for minimum. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a minimum:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_minimum.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_minimum.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ################# outfiles.append('tmp/grid_minimum_400_100_120.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Elliptical window, rotated. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a minimum:radius1=400.0:radius2=100.0:angle=120.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_minimum_400_100_120.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_minimum_400_100_120.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ############################################################################### # Test Maximum data metric def test_gdal_grid_6(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_maximum.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Search the whole dataset for maximum. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a maximum:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_maximum.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_maximum.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ################# outfiles.append('tmp/grid_maximum_100_100.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Circular window. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a maximum:radius1=100.0:radius2=100.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_maximum_100_100.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_maximum_100_100.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ############################################################################### # Test Range data metric def test_gdal_grid_7(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_range.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Search the whole dataset. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a range:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_range.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_range.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ################# outfiles.append('tmp/grid_range_90_90_8p.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Circular window, fill node with NODATA value if less than required # points found. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a range:radius1=90.0:radius2=90.0:angle=0.0:min_points=8:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_range_90_90_8p.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_range_90_90_8p.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ############################################################################### # Test Count data metric def test_gdal_grid_8(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_count_70_70.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a count:radius1=70.0:radius2=70.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_count_70_70.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_count_70_70.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ################# outfiles.append('tmp/grid_count_300_300.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a count:radius1=300.0:radius2=300.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_count_300_300.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_count_300_300.tif') assert ds.GetRasterBand(1).Checksum() == ds_ref.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds_ref.GetRasterBand(1).checksum_ref)) ds_ref = None ds = None ############################################################################### # Test Average Distance data metric def test_gdal_grid_9(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_avdist.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # We are using all the points from input dataset to average, so # the result is a raster filled with the same value in each node. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average_distance:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_avdist.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_avdist.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ################# outfiles.append('tmp/grid_avdist_150_150.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # We are using all the points from input dataset to average, so # the result is a raster filled with the same value in each node. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average_distance:radius1=150.0:radius2=150.0:angle=0.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_avdist_150_150.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_avdist_150_150.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ############################################################################### # Test Average Distance Between Points data metric def test_gdal_grid_10(): if gdal_grid is None: pytest.skip() ################# outfiles.append('tmp/grid_avdist_150_50_-15.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # We are using all the points from input dataset to average, so # the result is a raster filled with the same value in each node. gdaltest.runexternal(gdal_grid + ' -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a average_distance_pts:radius1=150.0:radius2=50.0:angle=-15.0:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_avdist_150_50_-15.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_avdist_150_50_-15.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) ds_ref = None if maxdiff > 1: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds = None ############################################################################### # Test linear def test_gdal_grid_11(): if gdal_grid is None: pytest.skip() outfiles.append('tmp/n43_linear.tif') # Create a GDAL dataset from the previous generated OGR grid (_, err) = gdaltest.runexternal_out_and_err(gdal_grid + ' -txe -80.0041667 -78.9958333 -tye 42.9958333 44.0041667 -outsize 121 121 -ot Int16 -l n43 -a linear -co TILED=YES -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 tmp/n43.shp ' + outfiles[-1]) assert (err is None or err == ''), 'got error/warning' # We should get the same values as in n43.td0 ds = gdal.Open('../gdrivers/data/n43.dt0') ds2 = gdal.Open(outfiles[-1]) assert ds.GetRasterBand(1).Checksum() == ds2.GetRasterBand(1).Checksum(), \ ('bad checksum : got %d, expected %d' % (ds.GetRasterBand(1).Checksum(), ds2.GetRasterBand(1).Checksum())) ds = None ds2 = None ############################################################################### # Test Inverse Distance to a Power with Nearest Neighbor gridding algorithm def test_gdal_grid_12(): if gdal_grid is None: pytest.skip() ################# # Test generic implementation (no AVX, no SSE) outfiles.append('tmp/grid_invdistnn_generic.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". (_, _) = gdaltest.runexternal_out_and_err(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdistnn:power=2.0:radius=1.0:max_points=12:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/gdal_invdistnn.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdistnn.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 0.00001: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# outfiles.append('tmp/grid_invdistnn_250_8minp.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". # Circular window, shifted, test min points and NODATA setting. gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdistnn:power=2.0:radius=250.0:max_points=12:min_points=8:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/grid_invdistnn_250_8minp.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdistnn_250_8minp.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 0.00001: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ################# # Test generic implementation with max_points and radius specified outfiles.append('tmp/grid_invdistnn_250_10maxp_3pow.tif') try: os.remove(outfiles[-1]) except OSError: pass # Create a GDAL dataset from the values of "grid.csv". gdaltest.runexternal(gdal_grid + ' -txe 440721.0 441920.0 -tye 3751321.0 3750120.0 -outsize 20 20 -ot Float64 -l grid -a invdistnn:power=3.0:radius=250.0:max_points=10:min_points=0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) # We should get the same values as in "ref_data/gdal_invdistnn_250_10maxp_3pow.tif" ds = gdal.Open(outfiles[-1]) ds_ref = gdal.Open('ref_data/grid_invdistnn_250_10maxp_3pow.tif') maxdiff = gdaltest.compare_ds(ds, ds_ref, verbose=0) if maxdiff > 0.00001: gdaltest.compare_ds(ds, ds_ref, verbose=1) pytest.fail('Image too different from the reference') ds_ref = None ds = None ############################################################################### # Test -clipsrc def test_gdal_grid_clipsrc(): if gdal_grid is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() ################# outfiles.append('tmp/grid_clipsrc.tif') try: os.remove(outfiles[-1]) except OSError: pass open('tmp/clip.csv', 'wt').write( 'id,WKT\n1,"POLYGON((440750 3751340,440750 3750100,441900 3750100,441900 3751340,440750 3751340))"\n') # Create a GDAL dataset from the values of "grid.csv". # Grid nodes are located exactly in raster nodes. gdaltest.runexternal_out_and_err(gdal_grid + ' -clipsrc tmp/clip.csv -txe 440720.0 441920.0 -tye 3751320.0 3750120.0 -outsize 20 20 -ot Byte -l grid -a nearest:radius1=0.0:radius2=0.0:angle=0.0:nodata=0.0 data/grid.vrt ' + outfiles[-1]) os.unlink('tmp/clip.csv') # We should get the same values as in "gcore/data/byte.tif" ds = gdal.Open(outfiles[-1]) cs = ds.GetRasterBand(1).Checksum() assert not (cs == 0 or cs == 4672), 'bad checksum' ds = None ############################################################################### # Cleanup def test_gdal_grid_cleanup(): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/n43.shp') drv = gdal.GetDriverByName('GTiff') for outfile in outfiles: drv.Delete(outfile) gdalautotest-3.0.4/generate_sample_gpkg.py0000644003401500001440000004222613614005324020351 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # # Purpose: Generate GPKG sample file # Author: Even Rouault # ############################################################################### # Copyright (c) 2014-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. ############################################################################### import sys from osgeo import gdal from osgeo import ogr from osgeo import osr if int(gdal.VersionInfo('VERSION_NUM')) < 2020000: print('Requires GDAL >= 2.2(dev)') sys.exit(1) sr4326 = osr.SpatialReference() sr4326.SetFromUserInput('WGS84') sr32631 = osr.SpatialReference() sr32631.ImportFromEPSG(32631) byte_src_ds = gdal.OpenEx('https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/gcore/data/byte.tif', allowed_drivers=['GTIFF', 'HTTP']) elev_src_ds = gdal.OpenEx('https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/gdrivers/data/n43.dt0', allowed_drivers=['DTED', 'HTTP']) gdal.SetConfigOption('CREATE_METADATA_TABLES', 'NO') for (out_filename, options) in [ ('gdal_sample_v1.2_no_extensions.gpkg', {}), ('gdal_sample_v1.2_no_extensions_with_gpkg_ogr_contents.gpkg', {'gpkg_ogr_contents': True}), ('gdal_sample_v1.2_spatial_index_extension.gpkg', {'spi': True}), ('gdal_sample_v1.2_spi_nonlinear_webp_elevation.gpkg', {'spi': True, 'nonlinear': True, 'webp': True, 'elevation': True}) ]: dataset_options = ['VERSION=1.2'] if not('gpkg_ogr_contents' in options and options['gpkg_ogr_contents']): dataset_options += ['ADD_GPKG_OGR_CONTENTS=NO'] layer_options = [] if not('spi' in options and options['spi']): layer_options += ['SPATIAL_INDEX=NO'] ds = ogr.GetDriverByName('GPKG').CreateDataSource(out_filename, options=dataset_options) lyr = ds.CreateLayer('attribute_table', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat['intfield'] = 1 lyr.CreateFeature(feat) lyr = ds.CreateLayer('point2d', geom_type=ogr.wkbPoint, options=layer_options) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('datetimefield', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('datefield', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('binaryfield', ogr.OFTBinary)) feat = ogr.Feature(lyr.GetLayerDefn()) feat['intfield'] = 1 feat['strfield'] = 'foo' feat['realfield'] = 1.23456 feat['datetimefield'] = '2014/06/07 14:20:00' feat['datefield'] = '2014/06/07' feat.SetFieldBinaryFromHexString('binaryfield', '007FFF') feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('linestring2d', geom_type=ogr.wkbLineString, srs=sr4326, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('polygon2d', geom_type=ogr.wkbPolygon, srs=sr32631, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multipoint2d', geom_type=ogr.wkbMultiPoint, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1,2 3)')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multilinestring2d', geom_type=ogr.wkbMultiLineString, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1,2 3),(4 5,6 7))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multipolygon2d', geom_type=ogr.wkbMultiPolygon, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((-9 0,-9 10,-1 10,-1 0,-9 0)))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('geomcollection2d', geom_type=ogr.wkbGeometryCollection, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(2 3,4 5),POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),MULTIPOINT(0 1,2 3),MULTILINESTRING((0 1,2 3),(4 5,6 7)),MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((-9 0,-9 10,-1 10,-1 0,-9 0))))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1,2 3)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1,2 3),(4 5,6 7))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((-9 0,-9 10,-1 10,-1 0,-9 0)))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('geometry2d', geom_type=ogr.wkbUnknown, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1,2 3)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1,2 3),(4 5,6 7))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((-9 0,-9 10,-1 10,-1 0,-9 0)))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(2 3,4 5),POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),MULTIPOINT(0 1,2 3),MULTILINESTRING((0 1,2 3),(4 5,6 7)),MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((-9 0,-9 10,-1 10,-1 0,-9 0))))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('point3d', geom_type=ogr.wkbPoint25D, options=layer_options) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2 3)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('linestring3d', geom_type=ogr.wkbLineString25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2 3,4 5 6)')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('polygon3d', geom_type=ogr.wkbPolygon25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multipoint3d', geom_type=ogr.wkbMultiPoint25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1 2,3 4 5)')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multilinestring3d', geom_type=ogr.wkbMultiLineString25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1 2,3 4 5),(6 7 8,9 10 11))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multipolygon3d', geom_type=ogr.wkbMultiPolygon25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),((-9 0 50,-9 10 50,-1 10 50,-1 0 50,-9 0 50)))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('geomcollection3d', geom_type=ogr.wkbGeometryCollection25D, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(1 2 3),LINESTRING(1 2 3,4 5 6),POLYGON((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),MULTIPOINT(0 1 2,3 4 5),MULTILINESTRING((0 1 2,3 4 5),(6 7 8,9 10 11)),MULTIPOLYGON(((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),((-9 0 50,-9 10 50,-1 10 50,-1 0 50,-9 0 50))))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1 2,3 4 5)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1 2,3 4 5),(6 7 8,9 10 11))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),((-9 0 50,-9 10 50,-1 10 50,-1 0 50,-9 0 50)))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr = ds.CreateLayer('geometry3d', geom_type=ogr.wkbUnknown | ogr.wkb25DBit, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2 3)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2 3,4 5 6)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1 2,3 4 5)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((0 1 2,3 4 5),(6 7 8,9 10 11))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),((-9 0 50,-9 10 50,-1 10 50,-1 0 50,-9 0 50)))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(1 2 3),LINESTRING(1 2 3,4 5 6),POLYGON((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),MULTIPOINT(0 1 2,3 4 5),MULTILINESTRING((0 1 2,3 4 5),(6 7 8,9 10 11)),MULTIPOLYGON(((0 0 100,0 10 100,10 10 100,10 0 100,0 0 100),(1 1 100,1 9 100,9 9 100,9 1 100,1 1 100)),((-9 0 50,-9 10 50,-1 10 50,-1 0 50,-9 0 50))))')) lyr.CreateFeature(feat) # Null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) if 'nonlinear' in options and options['nonlinear']: lyr = ds.CreateLayer('circularstring', geom_type=ogr.wkbCircularString, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 1,2 0)')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('compoundcurve', geom_type=ogr.wkbCompoundCurve, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0),(2 0,3 0))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('curvepolygon', geom_type=ogr.wkbCurvePolygon, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0),(2 0,3 0,3 -1,0 -1,0 0)))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multicurve', geom_type=ogr.wkbMultiCurve, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTICURVE(CIRCULARSTRING(0 0,1 1,2 0))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('multisurface', geom_type=ogr.wkbMultiSurface, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTISURFACE(CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0),(2 0,3 0,3 -1,0 -1,0 0))))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('curve', geom_type=ogr.wkbCurve, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1,2 0)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 1,2 0)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0),(2 0,3 0))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('surface', geom_type=ogr.wkbSurface, options=layer_options) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0),(2 0,3 0,3 -1,0 -1,0 0)))')) lyr.CreateFeature(feat) ds = None raster_options = ['APPEND_SUBDATASET=YES'] gdal.GetDriverByName('GPKG').CreateCopy(out_filename, byte_src_ds, options=raster_options + ['TILE_FORMAT=PNG', 'RASTER_TABLE=byte_png']) gdal.GetDriverByName('GPKG').CreateCopy(out_filename, byte_src_ds, options=raster_options + ['TILE_FORMAT=JPEG', 'RASTER_TABLE=byte_jpeg']) if 'webp' in options and options['webp']: gdal.GetDriverByName('GPKG').CreateCopy(out_filename, byte_src_ds, options=raster_options + ['TILE_FORMAT=WEBP', 'RASTER_TABLE=byte_webp']) if 'elevation' in options and options['elevation']: gdal.Translate(out_filename, elev_src_ds, format='GPKG', outputType=gdal.GDT_Float32, creationOptions=raster_options + ['RASTER_TABLE=elev_tiff']) gdal.GetDriverByName('GPKG').CreateCopy(out_filename, elev_src_ds, options=raster_options + ['RASTER_TABLE=elev_png']) gdalautotest-3.0.4/ogr/0000755003401500001440000000000013614005365014422 5ustar rouaultusersgdalautotest-3.0.4/ogr/ogr_pg.py0000755003401500001440000052163713614005324016265 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_pg.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test PostGIS driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import os import sys import shutil import pytest import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal pytestmark = pytest.mark.require_driver('PostgreSQL') ############################################################################### # Return true if 'layer_name' is one of the reported layers of pg_ds def ogr_pg_check_layer_in_list(ds, layer_name): for i in range(0, ds.GetLayerCount()): name = ds.GetLayer(i).GetName() if name == layer_name: return True return False # # To create the required PostGIS instance do something like: # # $ createdb autotest # $ createlang plpgsql autotest # $ psql autotest < ~/postgis.sql # ############################################################################### # Run tests with PostGIS enabled and then with PostGIS disabled @pytest.fixture( params=['postgis', 'no-postgis'], scope='module', autouse=True ) def with_and_without_postgis(request): test_ogr_pg_1() if gdaltest.pg_ds is None: pytest.skip() with_postgis = request.param == 'postgis' if with_postgis and not gdaltest.pg_has_postgis: pytest.skip() with gdaltest.config_option("PG_USE_POSTGIS", 'YES' if with_postgis else 'NO'): yield with_postgis ############################################################################### # Open Database. def test_ogr_pg_1(): gdaltest.pg_ds = None gdaltest.pg_use_copy = gdal.GetConfigOption('PG_USE_COPY', None) val = gdal.GetConfigOption('OGR_PG_CONNECTION_STRING', None) if val is not None: gdaltest.pg_connection_string = val else: gdaltest.pg_connection_string = 'dbname=autotest' # gdaltest.pg_connection_string='dbname=autotest-postgis1.4' # gdaltest.pg_connection_string='dbname=autotest port=5432' # gdaltest.pg_connection_string='dbname=autotest-postgis2.0' # gdaltest.pg_connection_string='dbname=autotest host=127.0.0.1 port=5433 user=postgres' # gdaltest.pg_connection_string='dbname=autotest host=127.0.0.1 port=5434 user=postgres' # gdaltest.pg_connection_string='dbname=autotest port=5435 host=127.0.0.1' # 7.4 # gdaltest.pg_connection_string='dbname=autotest port=5436 user=postgres' try: gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) gdal.PopErrorHandler() except: gdaltest.pg_ds = None gdal.PopErrorHandler() if gdaltest.pg_ds is None: pytest.skip() sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT version()') feat = sql_lyr.GetNextFeature() version_str = feat.GetFieldAsString('version') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdaltest.pg_retrieve_fid = False if version_str[0:11] == "PostgreSQL ": v = version_str[11:14] if v.endswith('b'): v = v[0:-1] if float(v) >= 8.2: gdaltest.pg_retrieve_fid = True gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.pg_ds.ExecuteSQL('SHOW standard_conforming_strings') gdal.PopErrorHandler() gdaltest.pg_quote_with_E = sql_lyr is not None gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT postgis_version()') gdaltest.pg_has_postgis = sql_lyr is not None gdaltest.pg_has_postgis_2 = False if gdaltest.pg_has_postgis: feat = sql_lyr.GetNextFeature() version_str = feat.GetFieldAsString('postgis_version') gdaltest.pg_has_postgis_2 = (float(version_str[0:3]) >= 2.0) gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdal.PopErrorHandler() if gdaltest.pg_has_postgis: if gdal.GetConfigOption('PG_USE_POSTGIS', 'YES') == 'YES': print('PostGIS available !') else: gdaltest.pg_has_postgis = False gdaltest.pg_has_postgis_2 = False print('PostGIS available but will NOT be used because of PG_USE_POSTGIS=NO !') else: gdaltest.pg_has_postgis = False print('PostGIS NOT available !') ############################################################################### # Create table from data/poly.shp def test_ogr_pg_2(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:tpoly') gdal.PopErrorHandler() ###################################################### # Create Layer gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('tpoly', options=['DIM=3']) ###################################################### # Check capabilities if gdaltest.pg_has_postgis: assert gdaltest.pg_lyr.TestCapability(ogr.OLCFastSpatialFilter) assert gdaltest.pg_lyr.TestCapability(ogr.OLCFastGetExtent) else: assert not gdaltest.pg_lyr.TestCapability(ogr.OLCFastSpatialFilter) assert not gdaltest.pg_lyr.TestCapability(ogr.OLCFastGetExtent) assert gdaltest.pg_lyr.TestCapability(ogr.OLCRandomRead) assert gdaltest.pg_lyr.TestCapability(ogr.OLCFastFeatureCount) assert gdaltest.pg_lyr.TestCapability(ogr.OLCFastSetNextByIndex) try: ogr.OLCStringsAsUTF8 assert gdaltest.pg_lyr.TestCapability(ogr.OLCStringsAsUTF8) except: pass assert gdaltest.pg_lyr.TestCapability(ogr.OLCSequentialWrite) assert gdaltest.pg_lyr.TestCapability(ogr.OLCCreateField) assert gdaltest.pg_lyr.TestCapability(ogr.OLCRandomWrite) assert gdaltest.pg_lyr.TestCapability(ogr.OLCTransactions) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.pg_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8), ('REALLIST', ogr.OFTRealList)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] expected_fid = 1 while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.pg_lyr.CreateFeature(dst_feat) if gdaltest.pg_retrieve_fid: got_fid = dst_feat.GetFID() assert got_fid == expected_fid, \ ("didn't get expected fid : %d instead of %d" % (got_fid, expected_fid)) expected_fid = expected_fid + 1 feat = shp_lyr.GetNextFeature() dst_feat.Destroy() ############################################################################### # Test reading a layer extent def test_ogr_pg_19(): if gdaltest.pg_ds is None: pytest.skip() layer = gdaltest.pg_ds.GetLayerByName('tpoly') assert layer is not None, 'did not get tpoly layer' extent = layer.GetExtent() expect = (478315.53125, 481645.3125, 4762880.5, 4765610.5) minx = abs(extent[0] - expect[0]) maxx = abs(extent[1] - expect[1]) miny = abs(extent[2] - expect[2]) maxy = abs(extent[3] - expect[3]) if max(minx, maxx, miny, maxy) > 0.0001: print(extent) pytest.fail('Extents do not match') estimated_extent = layer.GetExtent(force=0) if not gdaltest.pg_has_postgis: # The OGRLayer default implementation in force = 0 returns error if estimated_extent != (0, 0, 0, 0): print(extent) pytest.fail('Wrong estimated extent') else: # Better testing needed ? if estimated_extent == (0, 0, 0, 0): print(extent) pytest.fail('Wrong estimated extent') ############################################################################### # Test reading a SQL result layer extent def test_ogr_pg_19_2(): if gdaltest.pg_ds is None: pytest.skip() sql_lyr = gdaltest.pg_ds.ExecuteSQL('select * from tpoly') extent = sql_lyr.GetExtent() expect = (478315.53125, 481645.3125, 4762880.5, 4765610.5) minx = abs(extent[0] - expect[0]) maxx = abs(extent[1] - expect[1]) miny = abs(extent[2] - expect[2]) maxy = abs(extent[3] - expect[3]) assert max(minx, maxx, miny, maxy) <= 0.0001, 'Extents do not match' gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_pg_3(): if gdaltest.pg_ds is None: pytest.skip() assert gdaltest.pg_lyr.GetFeatureCount() == 10 expect = [168, 169, 166, 158, 165] gdaltest.pg_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.pg_lyr, 'eas_id', expect) assert gdaltest.pg_lyr.GetFeatureCount() == 5 gdaltest.pg_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.pg_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) read_feat.Destroy() orig_feat.Destroy() gdaltest.poly_feat = None assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_pg_4(): if gdaltest.pg_ds is None: pytest.skip() dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) wkt_list = ['10', '2', '1', '3d_1', '4', '5', '6'] for item in wkt_list: wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new Oracle feature. dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) dst_feat.SetFID(-1) gdaltest.pg_lyr.CreateFeature(dst_feat) ###################################################################### # Read back the feature and get the geometry. gdaltest.pg_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.pg_lyr.GetNextFeature() geom_read = feat_read.GetGeometryRef() if ogrtest.check_feature_geometry(feat_read, geom) != 0: print(item) print(wkt) pytest.fail(geom_read) feat_read.Destroy() dst_feat.Destroy() gdaltest.pg_lyr.ResetReading() # to close implicit transaction ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_pg_5(): if gdaltest.pg_ds is None: pytest.skip() expect = [None, 179, 173, 172, 171, 170, 169, 168, 166, 165, 158] sql_lyr = gdaltest.pg_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') assert sql_lyr.GetFeatureCount() == 11 tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_pg_6(): if gdaltest.pg_ds is None: pytest.skip() sql_lyr = gdaltest.pg_ds.ExecuteSQL("select * from tpoly where prfedea = '2'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['2']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'MULTILINESTRING ((5.00121349 2.99853132,5.00121349 1.99853133),(5.00121349 1.99853133,5.00121349 0.99853133),(3.00121351 1.99853127,5.00121349 1.99853133),(5.00121349 1.99853133,6.00121348 1.99853135))') != 0: tr = 0 feat_read.Destroy() sql_lyr.ResetReading() geom = ogr.CreateGeometryFromWkt( 'LINESTRING(-10 -10,0 0)') sql_lyr.SetSpatialFilter(geom) geom.Destroy() assert sql_lyr.GetFeatureCount() == 0 assert sql_lyr.GetNextFeature() is None, 'GetNextFeature() did not return None' gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_pg_7(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.pg_lyr.SetSpatialFilter(geom) geom.Destroy() assert gdaltest.pg_lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(gdaltest.pg_lyr, 'eas_id', [158]) gdaltest.pg_lyr.SetAttributeFilter('eas_id = 158') assert gdaltest.pg_lyr.GetFeatureCount() == 1 gdaltest.pg_lyr.SetAttributeFilter(None) gdaltest.pg_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Write a feature with too long a text value for a fixed length text field. # The driver should now truncate this (but with a debug message). Also, # put some crazy stuff in the value to verify that quoting and escaping # is working smoothly. # # No geometry in this test. def test_ogr_pg_8(): if gdaltest.pg_ds is None: pytest.skip() dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) dst_feat.SetField('PRFEDEA', 'CrazyKey') dst_feat.SetField('SHORTNAME', 'Crazy"\'Long') gdaltest.pg_lyr.CreateFeature(dst_feat) dst_feat.Destroy() gdaltest.pg_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat_read = gdaltest.pg_lyr.GetNextFeature() assert feat_read is not None, 'creating crazy feature failed!' assert feat_read.GetField('shortname') == 'Crazy"\'L', \ ('Vvalue not properly escaped or truncated:' + feat_read.GetField('shortname')) feat_read.Destroy() ############################################################################### # Verify inplace update of a feature with SetFeature(). def test_ogr_pg_9(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.pg_lyr.GetNextFeature() gdaltest.pg_lyr.SetAttributeFilter(None) feat.SetField('SHORTNAME', 'Reset') point = ogr.Geometry(ogr.wkbPoint25D) point.SetPoint(0, 5, 6, 7) feat.SetGeometryDirectly(point) if gdaltest.pg_lyr.SetFeature(feat) != 0: feat.Destroy() pytest.fail('SetFeature() method failed.') fid = feat.GetFID() feat.Destroy() feat = gdaltest.pg_lyr.GetFeature(fid) assert feat is not None, ('GetFeature(%d) failed.' % fid) shortname = feat.GetField('SHORTNAME') assert shortname[:5] == 'Reset', ('SetFeature() did not update SHORTNAME, got %s.' % shortname) if ogrtest.check_feature_geometry(feat, 'POINT(5 6 7)') != 0: print(feat.GetGeometryRef()) pytest.fail('Geometry update failed') feat.SetGeometryDirectly(None) if gdaltest.pg_lyr.SetFeature(feat) != 0: feat.Destroy() pytest.fail('SetFeature() method failed.') feat.Destroy() feat = gdaltest.pg_lyr.GetFeature(fid) assert feat.GetGeometryRef() is None, \ 'Geometry update failed. null geometry expected' feat.SetFieldNull('SHORTNAME') gdaltest.pg_lyr.SetFeature(feat) feat = gdaltest.pg_lyr.GetFeature(fid) assert feat.IsFieldNull('SHORTNAME'), 'SHORTNAME update failed. null value expected' # Test updating non-existing feature feat.SetFID(-10) if gdaltest.pg_lyr.SetFeature(feat) != ogr.OGRERR_NON_EXISTING_FEATURE: feat.Destroy() pytest.fail('Expected failure of SetFeature().') feat.Destroy() ############################################################################### # Verify that DeleteFeature() works properly. def test_ogr_pg_10(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.pg_lyr.GetNextFeature() gdaltest.pg_lyr.SetAttributeFilter(None) fid = feat.GetFID() feat.Destroy() assert gdaltest.pg_lyr.DeleteFeature(fid) == 0, 'DeleteFeature() method failed.' gdaltest.pg_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.pg_lyr.GetNextFeature() gdaltest.pg_lyr.SetAttributeFilter(None) if feat is not None: feat.Destroy() pytest.fail('DeleteFeature() seems to have had no effect.') # Test deleting non-existing feature assert gdaltest.pg_lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of DeleteFeature().' ############################################################################### # Create table from data/poly.shp in INSERT mode. def test_ogr_pg_11(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:tpolycopy') gdal.PopErrorHandler() gdal.SetConfigOption('PG_USE_COPY', 'NO') ###################################################### # Create Layer gdaltest.pgc_lyr = gdaltest.pg_ds.CreateLayer('tpolycopy', options=['DIM=3']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.pgc_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.pgc_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.pgc_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_pg_12(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pgc_lyr.ResetReading() gdaltest.pgc_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.pgc_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) read_feat.Destroy() orig_feat.Destroy() gdaltest.poly_feat = None gdaltest.pgc_lyr.ResetReading() # to close implicit transaction ############################################################################### # Create a table with some date fields. def test_ogr_pg_13(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:datetest') gdal.PopErrorHandler() ###################################################### # Create Table lyr = gdaltest.pg_ds.CreateLayer('datetest') ###################################################### # Setup Schema ogrtest.quick_create_layer_def(lyr, [('ogrdate', ogr.OFTDate), ('ogrtime', ogr.OFTTime), ('ogrdatetime', ogr.OFTDateTime)]) ###################################################### # add some custom date fields. gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datetest ADD COLUMN tsz timestamp with time zone') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datetest ADD COLUMN ts timestamp without time zone') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datetest ADD COLUMN dt date') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datetest ADD COLUMN tm time') ###################################################### # Create a populated records. gdaltest.pg_ds.ExecuteSQL("INSERT INTO datetest ( ogrdate, ogrtime, ogrdatetime, tsz, ts, dt, tm) VALUES ( '2005-10-12 10:41:33-05', '2005-10-12 10:41:33-05', '2005-10-12 10:41:33-05', '2005-10-12 10:41:33-05','2005-10-12 10:41:33-05','2005-10-12 10:41:33-05','2005-10-12 10:41:33-05' )") ############################################################################### # Verify that stuff we just wrote is still OK. # Fetch in several timezones to test our timezone processing. def test_ogr_pg_14(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') lyr = ds.GetLayerByName('datetest') feat = lyr.GetNextFeature() if feat.GetFieldAsString('ogrdatetime') != '2005/10/12 15:41:33+00' \ or feat.GetFieldAsString('ogrdate') != '2005/10/12' \ or feat.GetFieldAsString('ogrtime') != '10:41:33' \ or feat.GetFieldAsString('tsz') != '2005/10/12 15:41:33+00' \ or feat.GetFieldAsString('ts') != '2005/10/12 10:41:33' \ or feat.GetFieldAsString('dt') != '2005/10/12' \ or feat.GetFieldAsString('tm') != '10:41:33': feat.DumpReadable() pytest.fail('UTC value wrong') sql_lyr = ds.ExecuteSQL("select * from pg_timezone_names where name = 'Canada/Newfoundland'") if sql_lyr is None: has_tz = True else: has_tz = sql_lyr.GetFeatureCount() != 0 ds.ReleaseResultSet(sql_lyr) if has_tz: ds.ExecuteSQL('set timezone to "Canada/Newfoundland"') lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetFieldAsString('ogrdatetime') != '2005/10/12 13:11:33-0230' \ or feat.GetFieldAsString('tsz') != '2005/10/12 13:11:33-0230' \ or feat.GetFieldAsString('ts') != '2005/10/12 10:41:33' \ or feat.GetFieldAsString('dt') != '2005/10/12' \ or feat.GetFieldAsString('tm') != '10:41:33': feat.DumpReadable() pytest.fail('Newfoundland value wrong') ds.ExecuteSQL('set timezone to "+5"') lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetFieldAsString('ogrdatetime') != '2005/10/12 20:41:33+05' \ or feat.GetFieldAsString('tsz') != '2005/10/12 20:41:33+05': feat.DumpReadable() pytest.fail('+5 value wrong') feat = None ds.Destroy() ############################################################################### # Test very large query. def test_ogr_pg_15(): if gdaltest.pg_ds is None: pytest.skip() expect = [169] query = 'eas_id = 169' for ident in range(1000): query = query + (' or eas_id = %d' % (ident + 1000)) gdaltest.pg_lyr.SetAttributeFilter(query) tr = ogrtest.check_features_against_list(gdaltest.pg_lyr, 'eas_id', expect) gdaltest.pg_lyr.SetAttributeFilter(None) assert tr ############################################################################### # Test very large statement. def test_ogr_pg_16(): if gdaltest.pg_ds is None: pytest.skip() expect = [169] query = 'eas_id = 169' for ident in range(1000): query = query + (' or eas_id = %d' % (ident + 1000)) statement = 'select eas_id from tpoly where ' + query lyr = gdaltest.pg_ds.ExecuteSQL(statement) tr = ogrtest.check_features_against_list(lyr, 'eas_id', expect) gdaltest.pg_ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test requesting a non-existent table by name (bug 1480). def test_ogr_pg_17(): if gdaltest.pg_ds is None: pytest.skip() count = gdaltest.pg_ds.GetLayerCount() try: layer = gdaltest.pg_ds.GetLayerByName('JunkTableName') except: layer = None assert layer is None, 'got layer for non-existent table!' assert count == gdaltest.pg_ds.GetLayerCount(), 'layer count changed unexpectedly.' ############################################################################### # Test getting a layer by name that was not previously a layer. def test_ogr_pg_18(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() count = gdaltest.pg_ds.GetLayerCount() layer = gdaltest.pg_ds.GetLayerByName('geometry_columns') assert layer is not None, 'did not get geometry_columns layer' assert count + 1 == gdaltest.pg_ds.GetLayerCount(), \ 'layer count unexpectedly unchanged.' ############################################################################### # Test reading 4-dim geometry in EWKT format def test_ogr_pg_20(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() # # Prepare test layer with 4-dim geometries. # # Collection of test geometry pairs: # ( , ) <=> ( , ) geometries = ( ('POINT (10 20 5 5)', 'POINT ZM (10 20 5 5)'), ('LINESTRING (10 10 1 2,20 20 3 4,30 30 5 6,40 40 7 8)', 'LINESTRING ZM (10 10 1 2,20 20 3 4,30 30 5 6,40 40 7 8)'), ('POLYGON ((0 0 1 2,4 0 3 4,4 4 5 6,0 4 7 8,0 0 1 2))', 'POLYGON ZM ((0 0 1 2,4 0 3 4,4 4 5 6,0 4 7 8,0 0 1 2))'), ('MULTIPOINT (10 20 5 5,30 30 7 7)', 'MULTIPOINT ZM ((10 20 5 5),(30 30 7 7))'), ('MULTILINESTRING ((10 10 1 2,20 20 3 4),(30 30 5 6,40 40 7 8))', 'MULTILINESTRING ZM ((10 10 1 2,20 20 3 4),(30 30 5 6,40 40 7 8))'), ('MULTIPOLYGON(((0 0 0 1,4 0 0 1,4 4 0 1,0 4 0 1,0 0 0 1),(1 1 0 5,2 1 0 5,2 2 0 5,1 2 0 5,1 1 0 5)),((-1 -1 0 10,-1 -2 0 10,-2 -2 0 10,-2 -1 0 10,-1 -1 0 10)))', 'MULTIPOLYGON ZM (((0 0 0 1,4 0 0 1,4 4 0 1,0 4 0 1,0 0 0 1),(1 1 0 5,2 1 0 5,2 2 0 5,1 2 0 5,1 1 0 5)),((-1 -1 0 10,-1 -2 0 10,-2 -2 0 10,-2 -1 0 10,-1 -1 0 10)))'), ('GEOMETRYCOLLECTION(POINT(2 3 11 101),LINESTRING(2 3 12 102,3 4 13 103))', 'GEOMETRYCOLLECTION ZM (POINT ZM (2 3 11 101),LINESTRING ZM (2 3 12 102,3 4 13 103))'), ('TRIANGLE ((0 0 0 0,100 0 100 1,0 100 100 0,0 0 0 0))', 'TRIANGLE ZM ((0 0 0 0,100 0 100 1,0 100 100 0,0 0 0 0))'), ('TIN (((0 0 0 0,0 0 1 0,0 1 0 0,0 0 0 0)),((0 0 0 0,0 1 0 0,1 1 0 0,0 0 0 0)))', 'TIN ZM (((0 0 0 0,0 0 1 0,0 1 0 0,0 0 0 0)),((0 0 0 0,0 1 0 0,1 1 0 0,0 0 0 0)))'), ('POLYHEDRALSURFACE (((0 0 0 0,0 0 1 0,0 1 1 0,0 1 0 0,0 0 0 0)),((0 0 0 0,0 1 0 0,1 1 0 0,1 0 0 0,0 0 0 0)),((0 0 0 0,1 0 0 0,1 0 1 0,0 0 1 0,0 0 0 0)),((1 1 0 0,1 1 1 0,1 0 1 0,1 0 0 0,1 1 0 0)),((0 1 0 0,0 1 1 0,1 1 1 0,1 1 0 0,0 1 0 0)),((0 0 1 0,1 0 1 0,1 1 1 0,0 1 1 0,0 0 1 0)))', 'POLYHEDRALSURFACE ZM (((0 0 0 0,0 0 1 0,0 1 1 0,0 1 0 0,0 0 0 0)),((0 0 0 0,0 1 0 0,1 1 0 0,1 0 0 0,0 0 0 0)),((0 0 0 0,1 0 0 0,1 0 1 0,0 0 1 0,0 0 0 0)),((1 1 0 0,1 1 1 0,1 0 1 0,1 0 0 0,1 1 0 0)),((0 1 0 0,0 1 1 0,1 1 1 0,1 1 0 0,0 1 0 0)),((0 0 1 0,1 0 1 0,1 1 1 0,0 1 1 0,0 0 1 0)))') ) # This layer is also used in ogr_pg_21() test. gdaltest.pg_ds.ExecuteSQL("CREATE TABLE testgeom (ogc_fid integer)") # XXX - mloskot - if 'public' is omitted, then OGRPGDataSource::DeleteLayer fails, line 438 sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AddGeometryColumn('public','testgeom','wkb_geometry',-1,'GEOMETRY',4)") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) for i, geom in enumerate(geometries): gdaltest.pg_ds.ExecuteSQL("INSERT INTO testgeom (ogc_fid,wkb_geometry) \ VALUES (%d,GeomFromEWKT('%s'))" % (i, geom[0])) # We need to re-read layers gdaltest.pg_ds.Destroy() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) assert gdaltest.pg_ds is not None, 'can not re-open datasource' # # Test reading 4-dim geometries normalized to OGC WKT form. # layer = gdaltest.pg_ds.GetLayerByName('testgeom') assert layer is not None, 'did not get testgeom layer' # Test updating the geometries for i in range(len(geometries)): feat = layer.GetFeature(i) layer.SetFeature(feat) # Test we get them back as expected for i, geoms in enumerate(geometries): feat = layer.GetFeature(i) geom = feat.GetGeometryRef() assert geom is not None, ('did not get geometry, expected %s' % geoms[1]) wkt = geom.ExportToIsoWkt() feat.Destroy() feat = None assert wkt == geoms[1], \ ('WKT do not match: expected %s, got %s' % (geoms[1], wkt)) layer = None ############################################################################### # Test reading 4-dimension geometries in EWKB format def test_ogr_pg_21(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() layer = gdaltest.pg_ds.ExecuteSQL("SELECT wkb_geometry FROM testgeom") assert layer is not None, 'did not get testgeom layer' feat = layer.GetNextFeature() while feat is not None: geom = feat.GetGeometryRef() if ogr.GT_HasZ(geom.GetGeometryType()) == 0 or ogr.GT_HasM(geom.GetGeometryType()) == 0: feat.Destroy() feat = None gdaltest.pg_ds.ReleaseResultSet(layer) layer = None pytest.fail('expected feature with type >3000') feat.Destroy() feat = layer.GetNextFeature() feat = None gdaltest.pg_ds.ReleaseResultSet(layer) layer = None ############################################################################### # Check if the sub geometries of TIN and POLYHEDRALSURFACE are valid def test_ogr_pg_21_subgeoms(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() subgeom_PS = ['POLYGON ZM ((0 0 0 0,0 0 1 0,0 1 1 0,0 1 0 0,0 0 0 0))', 'POLYGON ZM ((0 0 0 0,0 1 0 0,1 1 0 0,1 0 0 0,0 0 0 0))', 'POLYGON ZM ((0 0 0 0,1 0 0 0,1 0 1 0,0 0 1 0,0 0 0 0))', 'POLYGON ZM ((1 1 0 0,1 1 1 0,1 0 1 0,1 0 0 0,1 1 0 0))', 'POLYGON ZM ((0 1 0 0,0 1 1 0,1 1 1 0,1 1 0 0,0 1 0 0))', 'POLYGON ZM ((0 0 1 0,1 0 1 0,1 1 1 0,0 1 1 0,0 0 1 0))'] subgeom_TIN = ['TRIANGLE ZM ((0 0 0 0,0 0 1 0,0 1 0 0,0 0 0 0))', 'TRIANGLE ZM ((0 0 0 0,0 1 0 0,1 1 0 0,0 0 0 0))'] layer = gdaltest.pg_ds.GetLayerByName('testgeom') for i in range(8, 10): feat = layer.GetFeature(i) geom = feat.GetGeometryRef() assert geom is not None, 'did not get the expected geometry' if geom.GetGeometryName() == "POLYHEDRALSURFACE": for j in range(0, geom.GetGeometryCount()): sub_geom = geom.GetGeometryRef(j) subgeom_wkt = sub_geom.ExportToIsoWkt() assert subgeom_wkt == subgeom_PS[j], \ ('did not get the expected subgeometry, expected %s' % (subgeom_PS[j])) if geom.GetGeometryName() == "TIN": for j in range(0, geom.GetGeometryCount()): sub_geom = geom.GetGeometryRef(j) subgeom_wkt = sub_geom.ExportToIsoWkt() assert subgeom_wkt == subgeom_TIN[j], \ ('did not get the expected subgeometry, expected %s' % (subgeom_TIN[j])) feat.Destroy() feat = None ############################################################################### # Check if the 3d geometries of TIN, Triangle and POLYHEDRALSURFACE are valid def test_ogr_pg_21_3d_geometries(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) gdaltest.pg_ds.ExecuteSQL("CREATE TABLE zgeoms (field_no integer)") sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AddGeometryColumn('public','zgeoms','wkb_geometry',-1,'GEOMETRY',3)") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) wkt_list = ['POLYHEDRALSURFACE (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))', 'TIN (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))', 'TRIANGLE ((48 36 84,32 54 64,86 11 54,48 36 84))'] wkt_expected = ['POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))', 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))', 'TRIANGLE Z ((48 36 84,32 54 64,86 11 54,48 36 84))'] for i in range(0, 3): gdaltest.pg_ds.ExecuteSQL("INSERT INTO zgeoms (field_no, wkb_geometry) VALUES (%d,GeomFromEWKT('%s'))" % (i, wkt_list[i])) gdaltest.pg_ds.Destroy() gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) assert gdaltest.pg_ds is not None, 'Cannot open the dataset' layer = gdaltest.pg_ds.GetLayerByName('zgeoms') assert layer is not None, 'No layer received' for i in range(0, 3): feat = layer.GetFeature(i) geom = feat.GetGeometryRef() wkt = geom.ExportToIsoWkt() assert wkt == wkt_expected[i], \ ('Unexpected WKT, expected %s and got %s' % (wkt_expected[i], wkt)) gdaltest.pg_ds.ExecuteSQL("DROP TABLE zgeoms") ############################################################################### # Create table from data/poly.shp under specified SCHEMA # This test checks if schema support and schema name quoting works well. def test_ogr_pg_22(): if gdaltest.pg_ds is None: pytest.skip() ###################################################### # Create Schema schema_name = 'AutoTest-schema' layer_name = schema_name + '.tpoly' gdaltest.pg_ds.ExecuteSQL('CREATE SCHEMA \"' + schema_name + '\"') ###################################################### # Create Layer gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer(layer_name, options=[ 'DIM=3', 'SCHEMA=' + schema_name] ) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.pg_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8)]) ###################################################### # Copy 3 features from the poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) # Insert 3 features only for ident in range(0, 3): feat = shp_lyr.GetFeature(ident) dst_feat.SetFrom(feat) gdaltest.pg_lyr.CreateFeature(dst_feat) dst_feat.Destroy() # Test if test layer under custom schema is listed found = ogr_pg_check_layer_in_list(gdaltest.pg_ds, layer_name) assert found is not False, ('layer from schema \'' + schema_name + '\' not listed') ############################################################################### # Create table with all data types def test_ogr_pg_23(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:datatypetest') gdal.PopErrorHandler() ###################################################### # Create Table lyr = gdaltest.pg_ds.CreateLayer('datatypetest') ###################################################### # Setup Schema # ogrtest.quick_create_layer_def( lyr, None ) ###################################################### # add some custom date fields. gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numeric numeric') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numeric5 numeric(5)') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numeric5_3 numeric(5,3)') # gdaltest.pg_ds.ExecuteSQL( 'ALTER TABLE datatypetest ADD COLUMN my_bool bool' ) fld = ogr.FieldDefn('my_bool', ogr.OFTInteger) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) # gdaltest.pg_ds.ExecuteSQL( 'ALTER TABLE datatypetest ADD COLUMN my_int2 int2' ) fld = ogr.FieldDefn('my_int2', ogr.OFTInteger) fld.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld) gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_int4 int4') lyr.CreateField(ogr.FieldDefn('my_int8', ogr.OFTInteger64)) # gdaltest.pg_ds.ExecuteSQL( 'ALTER TABLE datatypetest ADD COLUMN my_float4 float4' ) fld = ogr.FieldDefn('my_float4', ogr.OFTReal) fld.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld) gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_float8 float8') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_real real') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_char char') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_varchar character varying') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_varchar10 character varying(10)') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_text text') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_bytea bytea') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_time time') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_date date') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_timestamp timestamp without time zone') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_timestamptz timestamp with time zone') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_chararray char(1)[]') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_textarray text[]') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_varchararray character varying[]') fld = ogr.FieldDefn('my_int2array', ogr.OFTIntegerList) fld.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld) gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_int4array int4[]') lyr.CreateField(ogr.FieldDefn('my_int8array', ogr.OFTInteger64List)) fld = ogr.FieldDefn('my_float4array', ogr.OFTRealList) fld.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld) gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_float8array float8[]') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numericarray numeric[]') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numeric5array numeric(5)[]') gdaltest.pg_ds.ExecuteSQL('ALTER TABLE datatypetest ADD COLUMN my_numeric5_3array numeric(5,3)[]') fld = ogr.FieldDefn('my_boolarray', ogr.OFTIntegerList) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) ###################################################### # Create a populated records. if gdaltest.pg_has_postgis: geom_str = "GeomFromEWKT('POINT(10 20)')" else: geom_str = "'\\\\001\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000$@\\\\000\\\\000\\\\000\\\\000\\\\000\\\\0004@'" if gdaltest.pg_quote_with_E: geom_str = "E" + geom_str sql = "INSERT INTO datatypetest ( my_numeric, my_numeric5, my_numeric5_3, my_bool, my_int2, " sql += "my_int4, my_int8, my_float4, my_float8, my_real, my_char, my_varchar, " sql += "my_varchar10, my_text, my_bytea, my_time, my_date, my_timestamp, my_timestamptz, " sql += "my_chararray, my_textarray, my_varchararray, my_int2array, my_int4array, " sql += "my_int8array, my_float4array, my_float8array, my_numericarray, my_numeric5array, my_numeric5_3array, my_boolarray, wkb_geometry) " sql += "VALUES ( 1.2, 12345, 0.123, 'T', 12345, 12345678, 1234567901234, 0.123, " sql += "0.12345678, 0.876, 'a', 'ab', 'varchar10 ', 'abc', 'xyz', '12:34:56', " sql += "'2000-01-01', '2000-01-01 00:00:00', '2000-01-01 00:00:00+00', " sql += "'{a,b}', " sql += "'{aa,bb}', '{cc,dd}', '{100,200}', '{100,200}', '{1234567901234}', " sql += "'{100.1,200.1}', '{100.12,200.12}', ARRAY[100.12,200.12], ARRAY[10,20], ARRAY[10.12,20.12], '{1,0}', " + geom_str + " )" gdaltest.pg_ds.ExecuteSQL(sql) ############################################################################### def check_value_23(layer_defn, feat): field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_numeric5")) assert field_defn.GetWidth() == 5 and field_defn.GetPrecision() == 0 and field_defn.GetType() == ogr.OFTInteger, \ ('Wrong field defn for my_numeric5 : %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_numeric5_3")) assert field_defn.GetWidth() == 5 and field_defn.GetPrecision() == 3 and field_defn.GetType() == ogr.OFTReal, \ ('Wrong field defn for my_numeric5_3 : %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_varchar10")) assert field_defn.GetWidth() == 10 and field_defn.GetPrecision() == 0, \ ('Wrong field defn for my_varchar10 : %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_bool")) assert field_defn.GetWidth() == 1 and field_defn.GetType() == ogr.OFTInteger and field_defn.GetSubType() == ogr.OFSTBoolean, \ ('Wrong field defn for my_bool : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_boolarray")) assert field_defn.GetType() == ogr.OFTIntegerList and field_defn.GetSubType() == ogr.OFSTBoolean, \ ('Wrong field defn for my_boolarray : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_int2")) assert field_defn.GetType() == ogr.OFTInteger and field_defn.GetSubType() == ogr.OFSTInt16, \ ('Wrong field defn for my_int2 : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_float4")) assert field_defn.GetType() == ogr.OFTReal and field_defn.GetSubType() == ogr.OFSTFloat32, \ ('Wrong field defn for my_float4 : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_int2array")) assert field_defn.GetType() == ogr.OFTIntegerList and field_defn.GetSubType() == ogr.OFSTInt16, \ ('Wrong field defn for my_int2array : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) field_defn = layer_defn.GetFieldDefn(layer_defn.GetFieldIndex("my_float4array")) assert field_defn.GetType() == ogr.OFTRealList and field_defn.GetSubType() == ogr.OFSTFloat32, \ ('Wrong field defn for my_float4array : %d, %d, %d, %d' % (field_defn.GetWidth(), field_defn.GetPrecision(), field_defn.GetType(), field_defn.GetSubType())) if abs(feat.my_numeric - 1.2) > 1e-8 or \ feat.my_numeric5 != 12345 or \ feat.my_numeric5_3 != 0.123 or \ feat.my_bool != 1 or \ feat.my_int2 != 12345 or \ feat.my_int4 != 12345678 or \ feat.my_int8 != 1234567901234 or \ abs(feat.my_float4 - 0.123) > 1e-8 or \ feat.my_float8 != 0.12345678 or \ abs(feat.my_real - 0.876) > 1e-6 or \ feat.my_char != 'a' or \ feat.my_varchar != 'ab' or \ feat.my_varchar10 != 'varchar10 ' or \ feat.my_text != 'abc' or \ feat.GetFieldAsString('my_bytea') != '78797A' or \ feat.GetFieldAsString('my_time') != '12:34:56' or \ feat.GetFieldAsString('my_date') != '2000/01/01' or \ (feat.GetFieldAsString('my_timestamp') != '2000/01/01 00:00:00' and feat.GetFieldAsString('my_timestamp') != '2000/01/01 00:00:00+00') or \ (layer_defn.GetFieldIndex('my_timestamptz') >= 0 and feat.GetFieldAsString('my_timestamptz') != '2000/01/01 00:00:00+00') or \ feat.GetFieldAsString('my_chararray') != '(2:a,b)' or \ feat.GetFieldAsString('my_textarray') != '(2:aa,bb)' or \ feat.GetFieldAsString('my_varchararray') != '(2:cc,dd)' or \ feat.GetFieldAsString('my_int2array') != '(2:100,200)' or \ feat.GetFieldAsString('my_int4array') != '(2:100,200)' or \ feat.my_int8array != [1234567901234] or \ feat.GetFieldAsString('my_boolarray') != '(2:1,0)' or \ abs(feat.my_float4array[0] - 100.1) > 1e-6 or \ abs(feat.my_float8array[0] - 100.12) > 1e-8 or \ abs(feat.my_numericarray[0] - 100.12) > 1e-8 or \ abs(feat.my_numeric5array[0] - 10) > 1e-8 or \ abs(feat.my_numeric5_3array[0] - 10.12) > 1e-8: feat.DumpReadable() pytest.fail('Wrong values') geom = feat.GetGeometryRef() assert geom is not None, 'geom is none' wkt = geom.ExportToWkt() assert wkt == 'POINT (10 20)', ('Wrong WKT :' + wkt) ############################################################################### # Test with PG: connection def test_ogr_pg_24(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') lyr = ds.GetLayerByName('datatypetest') feat = lyr.GetNextFeature() check_value_23(lyr.GetLayerDefn(), feat) feat = None ds.Destroy() ############################################################################### # Test with PG: connection and SELECT query def test_ogr_pg_25(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') sql_lyr = ds.ExecuteSQL('select * from datatypetest') feat = sql_lyr.GetNextFeature() check_value_23(sql_lyr.GetLayerDefn(), feat) ds.ReleaseResultSet(sql_lyr) feat = None ds.Destroy() ############################################################################### # Duplicate all data types in INSERT mode def test_ogr_pg_28(): if gdaltest.pg_ds is None: pytest.skip() gdal.SetConfigOption('PG_USE_COPY', "NO") ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) gdal.PushErrorHandler('CPLQuietErrorHandler') ds.ExecuteSQL('DELLAYER:datatypetest2') gdal.PopErrorHandler() ds.ExecuteSQL('set timezone to "UTC"') src_lyr = ds.GetLayerByName('datatypetest') dst_lyr = ds.CreateLayer('datatypetest2') src_lyr.ResetReading() for i in range(src_lyr.GetLayerDefn().GetFieldCount()): field_defn = src_lyr.GetLayerDefn().GetFieldDefn(i) dst_lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) feat = src_lyr.GetNextFeature() assert feat is not None dst_feat.SetFrom(feat) assert dst_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat.Destroy() src_lyr = None dst_lyr = None ds.Destroy() gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ############################################################################### # Test with PG: connection def test_ogr_pg_29(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') lyr = ds.GetLayerByName('datatypetest2') # my_timestamp has now a time zone... feat = lyr.GetNextFeature() check_value_23(lyr.GetLayerDefn(), feat) geom = feat.GetGeometryRef() wkt = geom.ExportToWkt() assert wkt == 'POINT (10 20)', ('Wrong WKT :' + wkt) feat = None ds.Destroy() ############################################################################### # Duplicate all data types in PG_USE_COPY mode def test_ogr_pg_30(): if gdaltest.pg_ds is None: pytest.skip() gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) gdal.PushErrorHandler('CPLQuietErrorHandler') ds.ExecuteSQL('DELLAYER:datatypetest2') gdal.PopErrorHandler() ds.ExecuteSQL('set timezone to "UTC"') src_lyr = ds.GetLayerByName('datatypetest') dst_lyr = ds.CreateLayer('datatypetest2') src_lyr.ResetReading() for i in range(src_lyr.GetLayerDefn().GetFieldCount()): field_defn = src_lyr.GetLayerDefn().GetFieldDefn(i) dst_lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) feat = src_lyr.GetNextFeature() assert feat is not None dst_feat.SetFrom(feat) assert dst_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat.Destroy() ds.Destroy() gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ############################################################################### # Test the tables= connection string option def test_ogr_pg_31(): if gdaltest.pg_ds is None: pytest.skip() srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = gdaltest.pg_ds.CreateLayer('test_for_tables_equal_param', geom_type=ogr.wkbPoint, srs=srs, options=['OVERWRITE=YES']) lyr.StartTransaction() for i in range(501): f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) lyr.CommitTransaction() ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' tables=tpoly,tpolycopy', update=1) assert ds is not None and ds.GetLayerCount() == 2 sql_lyr = ds.ExecuteSQL('SELECT * FROM test_for_tables_equal_param') i = 0 while True: f = sql_lyr.GetNextFeature() if f is None: break i = i + 1 ds.ReleaseResultSet(sql_lyr) assert i == 501 ds.Destroy() ############################################################################### # Test approximate srtext (#2123, #3508) def test_ogr_pg_32(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() gdaltest.pg_ds.ExecuteSQL("DELETE FROM spatial_ref_sys") ###################################################### # Create Layer with EPSG:4326 srs = osr.SpatialReference() srs.ImportFromEPSG(4326) gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testsrtext', srs=srs) sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() if feat.count != 1: feat.DumpReadable() pytest.fail('did not get expected count after step (1)') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ###################################################### # Create second layer with very approximative EPSG:4326 srs = osr.SpatialReference() srs.SetFromUserInput('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]') gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testsrtext2', srs=srs) # Must still be 1 sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() if feat.count != 1: feat.DumpReadable() pytest.fail('did not get expected count after step (2)') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ###################################################### # Create third layer with very approximative EPSG:4326 but without authority srs = osr.SpatialReference() srs.SetFromUserInput("""GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]""") gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testsrtext3', srs=srs) # Must still be 1 sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() if feat.count != 1: feat.DumpReadable() pytest.fail('did not get expected count after step (3)') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ###################################################### # Create Layer with EPSG:26632 srs = osr.SpatialReference() srs.ImportFromEPSG(26632) gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testsrtext4', geom_type=ogr.wkbPoint, srs=srs) feat = ogr.Feature(gdaltest.pg_lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdaltest.pg_lyr.CreateFeature(feat) feat = None sr = gdaltest.pg_lyr.GetSpatialRef() assert sr.ExportToWkt().find('26632') != -1, 'did not get expected SRS' sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() # Must be 2 now if feat.count != 2: feat.DumpReadable() pytest.fail('did not get expected count after step (4)') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ###################################################### # Test GetSpatialRef() on SQL layer (#4644) sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM testsrtext4') sr = sql_lyr.GetSpatialRef() assert sr.ExportToWkt().find('26632') != -1, 'did not get expected SRS' gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ###################################################### # Test getting SRS and geom type without requiring to fetch the layer defn for i in range(2): # sys.stderr.write('BEFORE OPEN\n') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) # sys.stderr.write('AFTER Open\n') lyr = ds.GetLayerByName('testsrtext4') # sys.stderr.write('AFTER GetLayerByName\n') if i == 0: sr = lyr.GetSpatialRef() # sys.stderr.write('AFTER GetSpatialRef\n') geom_type = lyr.GetGeomType() # sys.stderr.write('AFTER GetGeomType\n') else: geom_type = lyr.GetGeomType() # sys.stderr.write('AFTER GetGeomType\n') sr = lyr.GetSpatialRef() # sys.stderr.write('AFTER GetSpatialRef\n') assert sr.ExportToWkt().find('26632') != -1, 'did not get expected SRS' assert geom_type == ogr.wkbPoint, 'did not get expected geom type' ds = None ###################################################### # Create Layer with non EPSG SRS srs = osr.SpatialReference() srs.SetFromUserInput('+proj=vandg') gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testsrtext5', srs=srs) sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() # Must be 3 now if feat.count != 3: feat.DumpReadable() pytest.fail('did not get expected count after step (5)') gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test encoding as UTF8 def test_ogr_pg_33(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr = gdaltest.pg_ds.GetLayerByName('tpoly') assert gdaltest.pg_lyr is not None, 'did not get tpoly layer' dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) # eacute in UTF8 : 0xc3 0xa9 dst_feat.SetField('SHORTNAME', '\xc3\xa9') gdaltest.pg_lyr.CreateFeature(dst_feat) dst_feat.Destroy() ############################################################################### # Test encoding as Latin1 def test_ogr_pg_34(): if gdaltest.pg_ds is None: pytest.skip() # We only test that on Linux since setting os.environ['XXX'] # is not guaranteed to have effects on system not supporting putenv if sys.platform.startswith('linux'): os.environ['PGCLIENTENCODING'] = 'LATIN1' test_ogr_pg_1() del os.environ['PGCLIENTENCODING'] # For some unknown reasons, some servers don't like forcing LATIN1 # but prefer LATIN9 instead... if gdaltest.pg_ds is None: os.environ['PGCLIENTENCODING'] = 'LATIN9' test_ogr_pg_1() del os.environ['PGCLIENTENCODING'] else: gdaltest.pg_ds.ExecuteSQL('SET client_encoding = LATIN1') gdaltest.pg_lyr = gdaltest.pg_ds.GetLayerByName('tpoly') assert gdaltest.pg_lyr is not None, 'did not get tpoly layer' dst_feat = ogr.Feature(feature_def=gdaltest.pg_lyr.GetLayerDefn()) # eacute in Latin1 : 0xe9 dst_feat.SetField('SHORTNAME', '\xe9') gdaltest.pg_lyr.CreateFeature(dst_feat) dst_feat.Destroy() ############################################################################### # Test for buffer overflows def test_ogr_pg_35(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler() try: gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testoverflows') ogrtest.quick_create_layer_def(gdaltest.pg_lyr, [('0123456789' * 1000, ogr.OFTReal)]) # To trigger actual layer creation gdaltest.pg_lyr.ResetReading() except: pass finally: gdal.PopErrorHandler() gdal.PushErrorHandler() try: gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('testoverflows', options=['OVERWRITE=YES', 'GEOMETRY_NAME=' + ('0123456789' * 1000)]) # To trigger actual layer creation gdaltest.pg_lyr.ResetReading() except: pass finally: gdal.PopErrorHandler() ############################################################################### # Test support for inherited tables : tables inherited from a Postgis Table def test_ogr_pg_36(): if gdaltest.pg_ds is None: pytest.skip() if gdaltest.pg_has_postgis: lyr = gdaltest.pg_ds.CreateLayer('table36_base', geom_type=ogr.wkbPoint) else: lyr = gdaltest.pg_ds.CreateLayer('table36_base') gdaltest.pg_ds.ExecuteSQL('CREATE TABLE table36_inherited ( col1 CHAR(1) ) INHERITS ( table36_base )') gdaltest.pg_ds.ExecuteSQL('CREATE TABLE table36_inherited2 ( col2 CHAR(1) ) INHERITS ( table36_inherited )') # Test fix for #3636 when 2 inherited tables with same name exist in 2 different schemas if gdaltest.pg_has_postgis: # lyr = gdaltest.pg_ds.CreateLayer( 'table36_base', geom_type = ogr.wkbLineString, options = ['SCHEMA=AutoTest-schema'] ) lyr = gdaltest.pg_ds.CreateLayer('AutoTest-schema.table36_base', geom_type=ogr.wkbLineString) else: lyr = gdaltest.pg_ds.CreateLayer('table36_base', options=['SCHEMA=AutoTest-schema']) gdaltest.pg_ds.ExecuteSQL('CREATE TABLE "AutoTest-schema"."table36_inherited" ( col3 CHAR(1) ) INHERITS ( "AutoTest-schema".table36_base )') gdaltest.pg_ds.ExecuteSQL('CREATE TABLE "AutoTest-schema"."table36_inherited2" ( col4 CHAR(1) ) INHERITS ( "AutoTest-schema".table36_inherited )') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(ds, 'table36_inherited') assert found is not False, 'layer table36_inherited not listed' found = ogr_pg_check_layer_in_list(ds, 'table36_inherited2') assert found is not False, 'layer table36_inherited2 not listed' lyr = ds.GetLayerByName('table36_inherited2') assert lyr is not None assert not gdaltest.pg_has_postgis or lyr.GetGeomType() == ogr.wkbPoint, \ 'wrong geometry type for layer table36_inherited2' lyr = ds.GetLayerByName('AutoTest-schema.table36_inherited2') assert lyr is not None assert not gdaltest.pg_has_postgis or lyr.GetGeomType() == ogr.wkbLineString, \ 'wrong geometry type for layer AutoTest-schema.table36_inherited2' ds.Destroy() def test_ogr_pg_36_bis(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' TABLES=table36_base', update=1) found = ogr_pg_check_layer_in_list(ds, 'table36_inherited') assert found is not True, 'layer table36_inherited is listed but it should not' lyr = ds.GetLayerByName('table36_inherited') assert lyr is not None assert not gdaltest.pg_has_postgis or lyr.GetGeomType() == ogr.wkbPoint ds.Destroy() ############################################################################### # Test support for inherited tables : Postgis table inherited from a non-Postgis table def test_ogr_pg_37(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() gdaltest.pg_ds.ExecuteSQL('CREATE TABLE table37_base ( col1 CHAR(1) )') gdaltest.pg_ds.ExecuteSQL('CREATE TABLE table37_inherited ( col2 CHAR(1) ) INHERITS ( table37_base )') sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AddGeometryColumn('public','table37_inherited','wkb_geometry',-1,'POINT',2)") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(ds, 'table37_inherited') assert found is not False, 'layer table37_inherited not listed' lyr = ds.GetLayerByName('table37_inherited') assert lyr is not None assert not gdaltest.pg_has_postgis or lyr.GetGeomType() == ogr.wkbPoint ds.Destroy() ############################################################################### # Test support for multiple geometry columns (RFC 41) def test_ogr_pg_38(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis: pytest.skip() sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AddGeometryColumn('public','table37_base','pointBase',-1,'POINT',2)") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AddGeometryColumn('public','table37_inherited','point25D',-1,'POINT',3)") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) # Check for the layer with the wkb_geometry column found = ogr_pg_check_layer_in_list(ds, 'table37_inherited') assert found is not False, 'layer table37_inherited not listed' lyr = ds.GetLayerByName('table37_inherited') assert lyr is not None gfld_defn = lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex("wkb_geometry")) assert gfld_defn is not None assert gfld_defn.GetType() == ogr.wkbPoint if lyr.GetLayerDefn().GetGeomFieldCount() != 3: for i in range(lyr.GetLayerDefn().GetGeomFieldCount()): print(lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName()) pytest.fail(lyr.GetLayerDefn().GetGeomFieldCount()) # Explicit query to 'table37_inherited(wkb_geometry)' should also work lyr = ds.GetLayerByName('table37_inherited(wkb_geometry)') assert lyr is not None lyr = ds.GetLayerByName('table37_inherited(pointBase)') assert lyr is not None assert lyr.GetGeomType() == ogr.wkbPoint assert lyr.GetGeometryColumn() == 'pointBase', 'wrong geometry column name' lyr = ds.GetLayerByName('table37_inherited(point25D)') assert lyr is not None assert lyr.GetGeomType() == ogr.wkbPoint25D assert lyr.GetGeometryColumn() == 'point25D', 'wrong geometry column name' ds.Destroy() # Check for the layer with the new 'point25D' geometry column when tables= is specified ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' tables=table37_inherited(point25D)', update=1) lyr = ds.GetLayerByName('table37_inherited(point25D)') assert lyr is not None assert lyr.GetGeomType() == ogr.wkbPoint25D assert lyr.GetGeometryColumn() == 'point25D', 'wrong geometry column name' ds.Destroy() ############################################################################### # Test support for named views def test_ogr_pg_39(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: gdaltest.pg_ds.ExecuteSQL("CREATE VIEW testview AS SELECT * FROM table36_base") ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(ds, 'testview') assert found is not False, 'layer testview not listed' ds.Destroy() return gdaltest.pg_ds.ExecuteSQL("CREATE VIEW testview AS SELECT * FROM table37_inherited") if not gdaltest.pg_has_postgis_2: gdaltest.pg_ds.ExecuteSQL("INSERT INTO geometry_columns VALUES ( '', 'public', 'testview', 'wkb_geometry', 2, -1, 'POINT') ") gdaltest.pg_ds.ExecuteSQL("INSERT INTO table37_inherited (col1, col2, wkb_geometry) VALUES ( 'a', 'b', GeomFromEWKT('POINT (0 1)') )") # Check for the layer ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(ds, 'testview') assert found is not False, 'layer testview not listed' lyr = ds.GetLayerByName('testview') assert lyr is not None if gdaltest.pg_has_postgis: gfld_defn = lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex("wkb_geometry")) assert gfld_defn is not None assert gfld_defn.GetType() == ogr.wkbPoint feat = lyr.GetNextFeature() assert feat is not None, 'no feature' assert feat.GetGeomFieldRef("wkb_geometry") is not None and feat.GetGeomFieldRef("wkb_geometry").ExportToWkt() == 'POINT (0 1)', \ ('bad geometry %s' % feat.GetGeometryRef().ExportToWkt()) ds.Destroy() # Test another geometry column if not gdaltest.pg_has_postgis_2: gdaltest.pg_ds.ExecuteSQL("INSERT INTO geometry_columns VALUES ( '', 'public', 'testview', 'point25D', 3, -1, 'POINT') ") gdaltest.pg_ds.ExecuteSQL("UPDATE table37_inherited SET \"point25D\" = GeomFromEWKT('POINT (0 1 2)') ") # Check for the layer ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(ds, 'testview') assert found is not False, 'layer testview not listed' lyr = ds.GetLayerByName('testview(point25D)') assert lyr is not None assert not gdaltest.pg_has_postgis or lyr.GetGeomType() == ogr.wkbPoint25D try: assert lyr.GetGeometryColumn() == 'point25D', 'wrong geometry column name' except: pass feat = lyr.GetNextFeature() assert feat is not None, 'no feature' assert feat.GetGeometryRef() is not None and feat.GetGeometryRef().ExportToWkt() == 'POINT (0 1 2)', \ ('bad geometry %s' % feat.GetGeometryRef().ExportToWkt()) ds.Destroy() ############################################################################### # Test GetFeature() with an invalid id def test_ogr_pg_40(): if gdaltest.pg_ds is None: pytest.skip() layer = gdaltest.pg_ds.GetLayerByName('tpoly') assert layer.GetFeature(0) is None ############################################################################### # Test active_schema= option def test_ogr_pg_41(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' active_schema=AutoTest-schema', update=1) # tpoly without schema refers to the active schema, that is to say AutoTest-schema found = ogr_pg_check_layer_in_list(ds, 'tpoly') assert found is not False, 'layer tpoly not listed' layer = ds.GetLayerByName('tpoly') assert layer.GetFeatureCount() == 3, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'AutoTest-schema.tpoly') assert found is not True, 'layer AutoTest-schema.tpoly is listed, but should not' layer = ds.GetLayerByName('AutoTest-schema.tpoly') assert layer.GetFeatureCount() == 3, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'public.tpoly') assert found is not False, 'layer tpoly not listed' layer = ds.GetLayerByName('public.tpoly') assert layer.GetFeatureCount() == 19, 'wrong feature count' gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:test41') gdal.PopErrorHandler() ds.CreateLayer('test41') found = ogr_pg_check_layer_in_list(ds, 'test41') assert found is not False, 'layer test41 not listed' layer = ds.GetLayerByName('test41') assert layer.GetFeatureCount() == 0, 'wrong feature count' layer = ds.GetLayerByName('AutoTest-schema.test41') assert layer.GetFeatureCount() == 0, 'wrong feature count' ds.Destroy() ############################################################################### # Test schemas= option def test_ogr_pg_42(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' schemas=AutoTest-schema', update=1) # tpoly without schema refers to the active schema, that is to say AutoTest-schema found = ogr_pg_check_layer_in_list(ds, 'tpoly') assert found is not False, 'layer tpoly not listed' layer = ds.GetLayerByName('tpoly') assert layer.GetFeatureCount() == 3, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'AutoTest-schema.tpoly') assert found is not True, 'layer AutoTest-schema.tpoly is listed, but should not' layer = ds.GetLayerByName('AutoTest-schema.tpoly') assert layer.GetFeatureCount() == 3, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'public.tpoly') assert found is not True, 'layer public.tpoly is listed, but should not' layer = ds.GetLayerByName('public.tpoly') assert layer.GetFeatureCount() == 19, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'test41') assert found is not False, 'layer test41 not listed' layer = ds.GetLayerByName('test41') assert layer.GetFeatureCount() == 0, 'wrong feature count' layer = ds.GetLayerByName('AutoTest-schema.test41') assert layer.GetFeatureCount() == 0, 'wrong feature count' ds.Destroy() ############################################################################### # Test schemas= option def test_ogr_pg_43(): if gdaltest.pg_ds is None: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' schemas=public,AutoTest-schema', update=1) # tpoly without schema refers to the active schema, that is to say public found = ogr_pg_check_layer_in_list(ds, 'tpoly') assert found is not False, 'layer tpoly not listed' layer = ds.GetLayerByName('tpoly') assert layer.GetFeatureCount() == 19, 'wrong feature count' found = ogr_pg_check_layer_in_list(ds, 'AutoTest-schema.tpoly') assert found is not False, 'layer AutoTest-schema.tpoly not listed' layer = ds.GetLayerByName('AutoTest-schema.tpoly') assert layer.GetFeatureCount() == 3, 'wrong feature count' ds.Destroy() ############################################################################### # Test for table and column names that need quoting (#2945) def test_ogr_pg_44(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr = gdaltest.pg_ds.CreateLayer('select', options=['OVERWRITE=YES', 'GEOMETRY_NAME=where', 'DIM=3']) ogrtest.quick_create_layer_def(gdaltest.pg_lyr, [('from', ogr.OFTReal)]) feat = ogr.Feature(gdaltest.pg_lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0.5 0.5 1)')) gdaltest.pg_lyr.CreateFeature(feat) feat.Destroy() gdaltest.pg_ds.ExecuteSQL('ALTER TABLE "select" RENAME COLUMN "ogc_fid" to "AND"') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) layer = ds.GetLayerByName('select') geom = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))') layer.SetSpatialFilter(geom) geom.Destroy() assert layer.GetFeatureCount() == 1 feat = layer.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (0.5 0.5 1)' feat = layer.GetFeature(1) assert feat.GetGeometryRef().ExportToWkt() == 'POINT (0.5 0.5 1)' sql_lyr = ds.ExecuteSQL('SELECT * FROM "select"') geom = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))') sql_lyr.SetSpatialFilter(geom) geom.Destroy() assert sql_lyr.GetFeatureCount() == 1 feat = sql_lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (0.5 0.5 1)' ds.ReleaseResultSet(sql_lyr) ds.Destroy() ############################################################################### # Test SetNextByIndex (#3117) def test_ogr_pg_45(): if gdaltest.pg_ds is None: pytest.skip() lyr = gdaltest.pg_ds.GetLayerByName('tpoly') assert lyr.TestCapability(ogr.OLCFastSetNextByIndex), \ 'OLCFastSetNextByIndex returned false' nb_feat = lyr.GetFeatureCount() tab_feat = [None for i in range(nb_feat)] for i in range(nb_feat): tab_feat[i] = lyr.GetNextFeature() lyr.SetNextByIndex(2) feat = lyr.GetNextFeature() assert feat.GetFID() == tab_feat[2].GetFID(), \ 'SetNextByIndex(2) did not return expected feature' feat = lyr.GetNextFeature() assert feat.GetFID() == tab_feat[3].GetFID(), 'did not get expected feature' ############################################################################### # Test that we can read more than 500 features and update each one # with SetFeature() def test_ogr_pg_46(): if gdaltest.pg_ds is None: pytest.skip() nFeatures = 1000 # Create a table with nFeatures records lyr = gdaltest.pg_ds.CreateLayer('bigtable') field_defn = ogr.FieldDefn("field1", ogr.OFTInteger) lyr.CreateField(field_defn) field_defn.Destroy() feature_defn = lyr.GetLayerDefn() lyr.StartTransaction() for i in range(nFeatures): feat = ogr.Feature(feature_defn) feat.SetField(0, i) lyr.CreateFeature(feat) feat.Destroy() lyr.CommitTransaction() # Check that we can read more than 500 features and update each one # with SetFeature() count = 0 sqllyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM bigtable ORDER BY OGC_FID ASC') feat = sqllyr.GetNextFeature() while feat is not None: expected_val = count assert feat.GetFieldAsInteger(0) == expected_val, \ ('expected value was %d. Got %d' % (expected_val, feat.GetFieldAsInteger(0))) feat.SetField(0, -count) lyr.SetFeature(feat) feat.Destroy() count = count + 1 feat = sqllyr.GetNextFeature() assert count == nFeatures, ('did not get expected %d features' % nFeatures) # Check that 1 feature has been correctly updated sqllyr.SetNextByIndex(1) feat = sqllyr.GetNextFeature() expected_val = -1 assert feat.GetFieldAsInteger(0) == expected_val, \ ('expected value was %d. Got %d' % (expected_val, feat.GetFieldAsInteger(0))) feat.Destroy() gdaltest.pg_ds.ReleaseResultSet(sqllyr) ############################################################################### # Test that we can handle 'geography' column type introduced in PostGIS 1.5 def test_ogr_pg_47(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() # Create table with geography column gdaltest.pg_ds.ExecuteSQL("DELETE FROM spatial_ref_sys") gdaltest.pg_ds.ExecuteSQL("""INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'EPSG',4326,'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.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ')""") if gdaltest.pg_ds.GetLayerByName('geography_columns') is None: pytest.skip('autotest database must be created with PostGIS >= 1.5') gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = gdaltest.pg_ds.CreateLayer('test_geog', srs=srs, options=['GEOM_TYPE=geography', 'GEOMETRY_NAME=my_geog']) field_defn = ogr.FieldDefn("test_string", ogr.OFTString) lyr.CreateField(field_defn) field_defn.Destroy() feature_defn = lyr.GetLayerDefn() # Create feature feat = ogr.Feature(feature_defn) feat.SetField(0, "test_string") geom = ogr.CreateGeometryFromWkt('POINT (3 50)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat.Destroy() # Update feature lyr.ResetReading() feat = lyr.GetNextFeature() geom = ogr.CreateGeometryFromWkt('POINT (2 49)') feat.SetGeometry(geom) lyr.SetFeature(feat) feat.Destroy() # Re-open DB gdaltest.pg_ds.Destroy() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) # Check if the layer is listed found = ogr_pg_check_layer_in_list(gdaltest.pg_ds, 'test_geog') assert found is not False, 'layer test_geog not listed' # Check that the layer is recorder in geometry_columns table geography_columns_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT * FROM geography_columns WHERE f_table_name = 'test_geog'") feat = geography_columns_lyr.GetNextFeature() if feat.GetFieldAsString('f_geography_column') != 'my_geog': feat.DumpReadable() pytest.fail() gdaltest.pg_ds.ReleaseResultSet(geography_columns_lyr) # Get the layer by name lyr = gdaltest.pg_ds.GetLayerByName('test_geog') assert lyr.GetExtent() == (2.0, 2.0, 49.0, 49.0), 'bad extent for test_geog' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)', 'bad geometry for test_geog' feat.Destroy() # Check with result set sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM test_geog') assert sql_lyr.GetExtent() == (2.0, 2.0, 49.0, 49.0), \ 'bad extent for SELECT * FROM test_geog' feat = sql_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)', \ 'bad geometry for SELECT * FROM test_geog' feat.Destroy() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) # Check ST_AsText sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT ST_AsText(my_geog) FROM test_geog') feat = sql_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)', \ 'bad geometry for SELECT ST_AsText(my_geog) FROM test_geog' feat.Destroy() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) # Check ST_AsBinary sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT ST_AsBinary(my_geog) FROM test_geog') feat = sql_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)', \ 'bad geometry for SELECT ST_AsBinary(my_geog) FROM test_geog' feat.Destroy() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test that we can read a table without any primary key (#2082) # Test also the effect of PG_LIST_ALL_TABLES with a non spatial table in a # PostGIS DB. def test_ogr_pg_48(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.ExecuteSQL("CREATE TABLE no_pk_table (gid serial NOT NULL, other_id INTEGER)") gdaltest.pg_ds.ExecuteSQL("INSERT INTO no_pk_table (gid, other_id) VALUES (1, 10)") gdaltest.pg_ds.Destroy() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) found = ogr_pg_check_layer_in_list(gdaltest.pg_ds, 'no_pk_table') if gdaltest.pg_has_postgis: # Non spatial table in a PostGIS db -> not listed ... assert not found, 'layer no_pk_table unexpectedly listed' # ... but should be found on explicit request lyr = gdaltest.pg_ds.GetLayer('no_pk_table') assert lyr is not None, 'could not get no_pk_table' # Try again by setting PG_LIST_ALL_TABLES=YES gdal.SetConfigOption('PG_LIST_ALL_TABLES', 'YES') gdaltest.pg_ds.Destroy() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) gdal.SetConfigOption('PG_LIST_ALL_TABLES', None) found = ogr_pg_check_layer_in_list(gdaltest.pg_ds, 'no_pk_table') assert found is not False, 'layer no_pk_table not listed' # Test LIST_ALL_TABLES=YES open option gdaltest.pg_ds.Destroy() gdaltest.pg_ds = gdal.OpenEx('PG:' + gdaltest.pg_connection_string, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['LIST_ALL_TABLES=YES']) found = ogr_pg_check_layer_in_list(gdaltest.pg_ds, 'no_pk_table') assert found is not False, 'layer no_pk_table not listed' lyr = gdaltest.pg_ds.GetLayer('no_pk_table') assert lyr is not None, 'could not get no_pk_table' sr = lyr.GetSpatialRef() assert sr is None, 'did not get expected SRS' feat = lyr.GetNextFeature() assert feat is not None, 'did not get feature' assert lyr.GetFIDColumn() == '', 'got a non NULL FID column' if feat.GetFID() != 0: feat.DumpReadable() pytest.fail('did not get expected FID') if feat.GetFieldAsInteger('gid') != 1: feat.DumpReadable() pytest.fail('did not get expected gid') if feat.GetFieldAsInteger('other_id') != 10: feat.DumpReadable() pytest.fail('did not get expected other_id') ############################################################################### # Go on with previous test but set PGSQL_OGR_FID this time def test_ogr_pg_49(): if gdaltest.pg_ds is None: pytest.skip() gdal.SetConfigOption('PGSQL_OGR_FID', 'other_id') gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayer('no_pk_table') gdal.SetConfigOption('PGSQL_OGR_FID', None) feat = lyr.GetNextFeature() lyr.ResetReading() # to close implicit transaction assert lyr.GetFIDColumn() == 'other_id', 'did not get expected FID column' if feat.GetFID() != 10: feat.DumpReadable() pytest.fail('did not get expected FID') ############################################################################### # Write and read NaN values (#3667) # This tests writing using COPY and INSERT def test_ogr_pg_50(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_lyr = gdaltest.pg_ds.GetLayerByName('tpoly') assert gdaltest.pg_lyr is not None, 'did not get tpoly layer' feature_def = gdaltest.pg_lyr.GetLayerDefn() dst_feat = ogr.Feature(feature_def) try: dst_feat.SetFieldDoubleList bHasSetFieldDoubleList = True except: bHasSetFieldDoubleList = False for option in ['NO', 'YES']: gdal.SetConfigOption('PG_USE_COPY', option) gdaltest.pg_lyr.ResetReading() for value in ['NaN', 'Inf', '-Inf']: dst_feat.SetField('AREA', float(value)) dst_feat.SetField('PRFEDEA', value) dst_feat.SetField('SHORTNAME', option) if bHasSetFieldDoubleList: dst_feat.SetFieldDoubleList(feature_def.GetFieldIndex('REALLIST'), [float(value), float(value)]) dst_feat.SetFID(-1) gdaltest.pg_lyr.CreateFeature(dst_feat) gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) dst_feat.Destroy() for option in ['NO', 'YES']: for value in ['NaN', 'Inf', '-Inf']: gdaltest.pg_lyr.SetAttributeFilter('PRFEDEA = \'' + value + '\' AND SHORTNAME = \'' + option + '\'') feat = gdaltest.pg_lyr.GetNextFeature() got_val = feat.GetField('AREA') if value == 'NaN': if not gdaltest.isnan(got_val): gdaltest.pg_lyr.ResetReading() # to close implicit transaction pytest.fail(feat.GetFieldAsString('AREA') + ' returned for AREA instead of ' + value) elif got_val != float(value): gdaltest.pg_lyr.ResetReading() # to close implicit transaction pytest.fail(feat.GetFieldAsString('AREA') + ' returned for AREA instead of ' + value) if bHasSetFieldDoubleList: got_val = feat.GetFieldAsDoubleList(feature_def.GetFieldIndex('REALLIST')) if value == 'NaN': if not gdaltest.isnan(got_val[0]) or not gdaltest.isnan(got_val[1]): gdaltest.pg_lyr.ResetReading() # to close implicit transaction pytest.fail(feat.GetFieldAsString('REALLIST') + ' returned for REALLIST instead of ' + value) elif got_val[0] != float(value) or got_val[1] != float(value): gdaltest.pg_lyr.ResetReading() # to close implicit transaction pytest.fail(feat.GetFieldAsString('REALLIST') + ' returned for REALLIST instead of ' + value) gdaltest.pg_lyr.ResetReading() # to close implicit transaction ############################################################################### # Run test_ogrsf def test_ogr_pg_51(): if gdaltest.pg_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' "' + 'PG:' + gdaltest.pg_connection_string + '" tpoly testview') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run test_ogrsf with -sql def test_ogr_pg_52(): if gdaltest.pg_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' "' + 'PG:' + gdaltest.pg_connection_string + '" -sql "SELECT * FROM tpoly"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test creating a layer with explicitly wkbNone geometry type. def test_ogr_pg_53(): if gdaltest.pg_ds is None: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('no_geometry_table', geom_type=ogr.wkbNone, options=['OVERWRITE=YES']) field_defn = ogr.FieldDefn('foo') lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'bar') lyr.CreateFeature(feat) lyr.ResetReading() # force above feature to be committed ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert not (gdaltest.pg_has_postgis is True and ogr_pg_check_layer_in_list(ds, 'no_geometry_table') is True), \ 'did not expected no_geometry_table to be listed at that point' lyr = ds.GetLayerByName('no_geometry_table') feat = lyr.GetNextFeature() assert feat.GetField(0) == 'bar' gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('no_geometry_table', geom_type=ogr.wkbNone) gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' lyr = ds.CreateLayer('no_geometry_table', geom_type=ogr.wkbNone, options=['OVERWRITE=YES']) field_defn = ogr.FieldDefn('baz') lyr.CreateField(field_defn) ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.CreateLayer('no_geometry_table', geom_type=ogr.wkbNone, options=['OVERWRITE=YES']) field_defn = ogr.FieldDefn('bar') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('baz') lyr.CreateField(field_defn) assert lyr is not None ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('no_geometry_table') assert lyr.GetLayerDefn().GetFieldCount() == 2 ############################################################################### # Check that we can overwrite a non-spatial geometry table (#4012) def test_ogr_pg_53_bis(): import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() f = open('tmp/no_geometry_table.csv', 'wt') f.write('foo,bar\n') f.write('"baz","foo"\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PostgreSQL "' + 'PG:' + gdaltest.pg_connection_string + '" tmp/no_geometry_table.csv -overwrite') os.unlink('tmp/no_geometry_table.csv') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('no_geometry_table') feat = lyr.GetNextFeature() assert feat.GetField(0) == 'baz' ############################################################################### # Test reading AsEWKB() def test_ogr_pg_54(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() if gdaltest.pg_has_postgis_2: sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT ST_AsEWKB(GeomFromEWKT('POINT (0 1 2)'))") else: sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT AsEWKB(GeomFromEWKT('POINT (0 1 2)'))") feat = sql_lyr.GetNextFeature() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (0 1 2)' ############################################################################### # Test reading geoms as Base64 encoded strings def test_ogr_pg_55(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() layer = gdaltest.pg_ds.CreateLayer('ogr_pg_55', options=['DIM=3']) feat = ogr.Feature(layer.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2 3)')) layer.CreateFeature(feat) feat = None layer.ResetReading() # force above feature to be committed old_val = gdal.GetConfigOption('PG_USE_BASE64') gdal.SetConfigOption('PG_USE_BASE64', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) layer = ds.GetLayerByName('ogr_pg_55') feat = layer.GetNextFeature() gdal.SetConfigOption('PG_USE_BASE64', old_val) assert feat.GetGeometryRef().ExportToWkt() == 'POINT (1 2 3)' ds = None ############################################################################### # Test insertion of features with first field being a 0-character string in a # non-spatial table and without FID in COPY mode (#4040) def test_ogr_pg_56(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.ExecuteSQL('CREATE TABLE ogr_pg_56 ( bar varchar, baz varchar ) WITH (OIDS=FALSE)') gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_56') feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(1, '') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '') feat.SetField(1, '') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'bar') feat.SetField(1, '') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '') feat.SetField(1, 'baz') lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_56') feat = lyr.GetNextFeature() if feat.GetField(0) is not None or feat.GetField(1) is not None: feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetNextFeature() if feat.GetField(0) != '' or feat.GetField(1) is not None: feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetNextFeature() if feat.GetField(0) is not None or feat.GetField(1) != '': feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetNextFeature() if feat.GetField(0) != '' or feat.GetField(1) != '': feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetNextFeature() if feat.GetField(0) != 'bar' or feat.GetField(1) != '': feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetNextFeature() if feat.GetField(0) != '' or feat.GetField(1) != 'baz': feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) ds = None ############################################################################### # Test inserting an empty feature def test_ogr_pg_57(): if gdaltest.pg_ds is None: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_57') lyr.CreateField(ogr.FieldDefn('acolumn', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(feat) feat = None assert ret == 0 ############################################################################### # Test RFC35 def test_ogr_pg_58(): if gdaltest.pg_ds is None: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_58') lyr.CreateField(ogr.FieldDefn('strcolumn', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('aintcolumn', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('aintcolumn', 12345) lyr.CreateFeature(feat) feat = None assert lyr.TestCapability(ogr.OLCReorderFields) == 0 assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 assert lyr.TestCapability(ogr.OLCDeleteField) == 1 fd = ogr.FieldDefn('anotherstrcolumn', ogr.OFTString) fd.SetWidth(5) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('aintcolumn'), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField('anotherstrcolumn') == '12345', 'failed (1)' gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayer('ogr_pg_58') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField('anotherstrcolumn') == '12345', 'failed (2)' feat = None lyr.ResetReading() # to close implicit transaction assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('anotherstrcolumn')) == 0, \ 'failed (3)' gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayer('ogr_pg_58') assert lyr.GetLayerDefn().GetFieldCount() == 1, 'failed (4)' ############################################################################### # Check that we can use -nln with a layer name that is recognized by GetLayerByName() # but which is not the layer name. def test_ogr_pg_59(): if gdaltest.pg_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal( test_cli_utilities.get_ogr2ogr_path() + ' -append -f PostgreSQL "' + 'PG:' + gdaltest.pg_connection_string + '" data/poly.shp -nln public.tpoly') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('tpoly') fc = lyr.GetFeatureCount() ds = None assert fc == 35, 'did not get expected feature count' ############################################################################### # Test that we can insert a feature that has a FID on a table with a # non-incrementing PK. def test_ogr_pg_60(): if gdaltest.pg_ds is None: pytest.skip() sql_lyr = gdaltest.pg_ds.ExecuteSQL("CREATE TABLE ogr_pg_60(id integer," "name varchar(50),primary key (id)) " "without oids") gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_60') assert lyr.GetFIDColumn() == 'id', 'did not get expected name for FID column' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(100) feat.SetField('name', 'a_name') lyr.CreateFeature(feat) assert feat.GetFID() == 100, 'bad FID value' feat = lyr.GetFeature(100) assert feat is not None, 'did not get feature' ############################################################################### # Test insertion of features with FID set in COPY mode (#4495) def test_ogr_pg_61(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds.ExecuteSQL('CREATE TABLE ogr_pg_61 ( id integer NOT NULL PRIMARY KEY, bar varchar )') gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_61') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(10) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(20) feat.SetField(0, 'baz') lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_61') feat = lyr.GetFeature(10) if not feat.IsFieldNull(0): feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) feat = lyr.GetFeature(20) if feat.GetField(0) != 'baz': feat.DumpReadable() pytest.fail('did not get expected value for feat %d' % feat.GetFID()) ds = None ############################################################################### # Test ExecuteSQL() and getting SRID of the request (#4699) def test_ogr_pg_62(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() # Test on a regular request in a table srs = osr.SpatialReference() srs.ImportFromEPSG(32631) gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext2') gdaltest.pg_ds.CreateLayer('testsrtext2', srs=srs) sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM testsrtext2') got_srs = sql_lyr.GetSpatialRef() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert not (got_srs is None or got_srs.ExportToWkt().find('32631') == -1) # Test a request on a table, but with a geometry column not in the table sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT eas_id, GeomFromEWKT('SRID=4326;POINT(0 1)') FROM tpoly") got_srs = sql_lyr.GetSpatialRef() gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert not (got_srs is None or got_srs.ExportToWkt().find('4326') == -1) ############################################################################### # Test COLUMN_TYPES layer creation option (#4788) def test_ogr_pg_63(): if gdaltest.pg_ds is None: pytest.skip() # No need to test it in the non PostGIS case if not gdaltest.pg_has_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_63', options=['COLUMN_TYPES=foo=int8,bar=numeric(10,5),baz=hstore,baw=numeric(20,0)']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('baw', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', '123') feat.SetField('baw', '123456789012345') lyr.StartTransaction() lyr.CreateFeature(feat) lyr.CommitTransaction() feat = None lyr = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_63') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('foo')).GetType() == ogr.OFTInteger64 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('bar')).GetType() == ogr.OFTReal feat = lyr.GetNextFeature() assert feat.GetField('foo') == 123 assert feat.GetField('baw') == 123456789012345 ############################################################################### # Test OGR_TRUNCATE config. option (#5091) def test_ogr_pg_64(): if gdaltest.pg_ds is None: pytest.skip() # No need to test it in the non PostGIS case if not gdaltest.pg_has_postgis: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_63') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', '124') lyr.CreateFeature(feat) assert lyr.GetFeatureCount() == 2 ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_63') gdal.SetConfigOption('OGR_TRUNCATE', 'YES') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', '125') lyr.CreateFeature(feat) gdal.SetConfigOption('OGR_TRUNCATE', None) # Just one feature because of truncation assert lyr.GetFeatureCount() == 1 ############################################################################### # Test RFC 41 def test_ogr_pg_65(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) assert ds.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) != 0 lyr = ds.CreateLayer('ogr_pg_65', geom_type=ogr.wkbNone) assert lyr.TestCapability(ogr.OLCCreateGeomField) != 0 gfld_defn = ogr.GeomFieldDefn('geom1', ogr.wkbPoint) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) gfld_defn.SetSpatialRef(srs) assert lyr.CreateGeomField(gfld_defn) == 0 gfld_defn = ogr.GeomFieldDefn('geom2', ogr.wkbLineString25D) assert lyr.CreateGeomField(gfld_defn) == 0 gfld_defn = ogr.GeomFieldDefn('geom3', ogr.wkbPoint) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) gfld_defn.SetSpatialRef(srs) assert lyr.CreateGeomField(gfld_defn) == 0 lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('intfield', 123) feat.SetGeomFieldDirectly('geom1', ogr.CreateGeometryFromWkt('POINT (1 2)')) feat.SetGeomFieldDirectly('geom2', ogr.CreateGeometryFromWkt('LINESTRING (3 4 5,6 7 8)')) assert lyr.CreateFeature(feat) == 0 feat = ogr.Feature(lyr.GetLayerDefn()) assert lyr.CreateFeature(feat) == 0 lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetField('intfield') != 123 or \ feat.GetGeomFieldRef('geom1').ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef('geom2').ExportToWkt() != 'LINESTRING (3 4 5,6 7 8)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef('geom1') is not None or \ feat.GetGeomFieldRef('geom2') is not None: feat.DumpReadable() pytest.fail() ds = None for i in range(2): ds = ogr.Open('PG:' + gdaltest.pg_connection_string) if i == 0: lyr = ds.GetLayerByName('ogr_pg_65') else: lyr = ds.ExecuteSQL('SELECT * FROM ogr_pg_65') assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'geom1' assert i != 0 or lyr.GetLayerDefn().GetGeomFieldDefn(0).GetType() == ogr.wkbPoint assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetName() == 'geom2' assert i != 0 or lyr.GetLayerDefn().GetGeomFieldDefn(1).GetType() == ogr.wkbLineString25D assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef() is None assert not (i == 0 and lyr.GetLayerDefn().GetGeomFieldDefn(2).GetSpatialRef().ExportToWkt().find('32631') < 0) feat = lyr.GetNextFeature() if feat.GetField('intfield') != 123 or \ feat.GetGeomFieldRef('geom1').ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef('geom2').ExportToWkt() != 'LINESTRING (3 4 5,6 7 8)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef('geom1') is not None or \ feat.GetGeomFieldRef('geom2') is not None: feat.DumpReadable() pytest.fail() if i == 1: ds.ReleaseResultSet(lyr) gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_65') lyr.DeleteFeature(1) lyr.DeleteFeature(2) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomFieldDirectly('geom1', ogr.CreateGeometryFromWkt('POINT (3 4)')) feat.SetGeomFieldDirectly('geom2', ogr.CreateGeometryFromWkt('LINESTRING (4 5 6,7 8 9)')) assert lyr.CreateFeature(feat) == 0 feat = ogr.Feature(lyr.GetLayerDefn()) assert lyr.CreateFeature(feat) == 0 gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_65') feat = lyr.GetNextFeature() if feat.GetGeomFieldRef('geom1').ExportToWkt() != 'POINT (3 4)' or \ feat.GetGeomFieldRef('geom2').ExportToWkt() != 'LINESTRING (4 5 6,7 8 9)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef('geom1') is not None or \ feat.GetGeomFieldRef('geom2') is not None: feat.DumpReadable() pytest.fail() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is not None: gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -update "' + 'PG:' + gdaltest.pg_connection_string + '" "' + 'PG:' + gdaltest.pg_connection_string + '" ogr_pg_65 -nln ogr_pg_65_copied -overwrite') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_65_copied') assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef() is None assert lyr.GetLayerDefn().GetGeomFieldDefn(2).GetSpatialRef().ExportToWkt().find('32631') >= 0 ############################################################################### # Run test_ogrsf def test_ogr_pg_66(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' "' + 'PG:' + gdaltest.pg_connection_string + '" ogr_pg_65') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test retrieving SRID from values (#5131) def test_ogr_pg_67(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_67') lyr.ResetReading() # to trigger layer creation lyr = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_67') assert lyr.GetSpatialRef() is None feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_67') assert lyr.GetSpatialRef() is None ds.ExecuteSQL("ALTER TABLE ogr_pg_67 DROP CONSTRAINT enforce_srid_wkb_geometry") ds.ExecuteSQL("UPDATE ogr_pg_67 SET wkb_geometry = ST_GeomFromEWKT('SRID=4326;POINT(0 1)')") ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_67') assert lyr.GetSpatialRef() is not None ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' tables=fake', update=1) lyr = ds.GetLayerByName('ogr_pg_67') assert lyr.GetSpatialRef() is not None ds = None ############################################################################### # Test retrieving SRID from values even if we don't have select rights on geometry_columns (#5131) def test_ogr_pg_68(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_68', srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(feat) lyr = None sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT current_user') feat = sql_lyr.GetNextFeature() current_user = feat.GetField(0) gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdaltest.pg_ds.ExecuteSQL("REVOKE SELECT ON geometry_columns FROM %s" % current_user) ds = ogr.Open('PG:' + gdaltest.pg_connection_string + ' tables=fake', update=1) lyr = ds.GetLayerByName('ogr_pg_68') got_srs = None if lyr is not None: got_srs = lyr.GetSpatialRef() sql_lyr = ds.ExecuteSQL("select * from ( select 'SRID=4326;POINT(0 0)'::geometry as g ) as _xx") got_srs2 = None if sql_lyr is not None: got_srs2 = sql_lyr.GetSpatialRef() ds.ReleaseResultSet(sql_lyr) ds = None gdaltest.pg_ds.ExecuteSQL("GRANT SELECT ON geometry_columns TO %s" % current_user) assert got_srs is not None assert got_srs2 is not None ############################################################################### # Test deferred loading of tables (#5450) def has_run_load_tables(ds): return int(ds.GetMetadataItem("bHasLoadTables", "_DEBUG_")) def test_ogr_pg_69(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert not has_run_load_tables(gdaltest.pg_ds) gdaltest.pg_ds.GetLayerByName('tpoly') assert not has_run_load_tables(gdaltest.pg_ds) sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM tpoly') assert not has_run_load_tables(gdaltest.pg_ds) feat = sql_lyr.GetNextFeature() assert not has_run_load_tables(gdaltest.pg_ds) del feat gdaltest.pg_ds.ReleaseResultSet(sql_lyr) gdaltest.pg_ds.GetLayer(0) assert has_run_load_tables(gdaltest.pg_ds) # Test that we can find a layer with non lowercase gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string) assert gdaltest.pg_ds.GetLayerByName('TPOLY') is not None ############################################################################### # Test historical non-differed creation of tables (#5547) def test_ogr_pg_70(): if gdaltest.pg_ds is None: pytest.skip() gdal.SetConfigOption('OGR_PG_DEFERRED_CREATION', 'NO') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_70') gdal.SetConfigOption('OGR_PG_DEFERRED_CREATION', None) ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr2 = ds.GetLayerByName('ogr_pg_70') assert lyr2 is not None ds = None lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr2 = ds.GetLayerByName('ogr_pg_70') assert lyr2.GetLayerDefn().GetFieldCount() == 1 ds = None gfld_defn = ogr.GeomFieldDefn('geom', ogr.wkbPoint) lyr.CreateGeomField(gfld_defn) ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr2 = ds.GetLayerByName('ogr_pg_70') assert lyr2.GetLayerDefn().GetGeomFieldCount() == 2 ds = None if gdaltest.pg_has_postgis and gdaltest.pg_ds.GetLayerByName('geography_columns') is not None: print('Trying geography') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_70') gdal.SetConfigOption('OGR_PG_DEFERRED_CREATION', 'NO') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_70', options=['GEOM_TYPE=geography', 'GEOMETRY_NAME=my_geog']) gdal.SetConfigOption('OGR_PG_DEFERRED_CREATION', None) ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr2 = ds.GetLayerByName('ogr_pg_70') assert lyr2.GetLayerDefn().GetGeomFieldCount() == 1 geography_columns_lyr = ds.ExecuteSQL("SELECT * FROM geography_columns WHERE f_table_name = 'ogr_pg_70' AND f_geography_column = 'my_geog'") assert geography_columns_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(geography_columns_lyr) ds = None ############################################################################### # Test interoperability of WKT/WKB with PostGIS. def test_ogr_pg_71(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() curve_lyr = gdaltest.pg_ds.CreateLayer('test_curve') curve_lyr2 = gdaltest.pg_ds.CreateLayer('test_curve_3d', geom_type=ogr.wkbUnknown | ogr.wkb25DBit) # FIXME: the ResetReading() should not be necessary curve_lyr.ResetReading() curve_lyr2.ResetReading() for wkt in ['CIRCULARSTRING EMPTY', 'CIRCULARSTRING Z EMPTY', 'CIRCULARSTRING (0 1,2 3,4 5)', 'CIRCULARSTRING Z (0 1 2,4 5 6,7 8 9)', 'COMPOUNDCURVE EMPTY', 'TRIANGLE ((0 0 0,100 0 100,0 100 100,0 0 0))', 'COMPOUNDCURVE ((0 1,2 3,4 5))', 'COMPOUNDCURVE Z ((0 1 2,4 5 6,7 8 9))', 'COMPOUNDCURVE ((0 1,2 3,4 5),CIRCULARSTRING (4 5,6 7,8 9))', 'COMPOUNDCURVE Z ((0 1 2,4 5 6,7 8 9),CIRCULARSTRING Z (7 8 9,10 11 12,13 14 15))', 'CURVEPOLYGON EMPTY', 'CURVEPOLYGON ((0 0,0 1,1 1,1 0,0 0))', 'CURVEPOLYGON Z ((0 0 2,0 1 3,1 1 4,1 0 5,0 0 2))', 'CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0)))', 'CURVEPOLYGON Z (COMPOUNDCURVE Z (CIRCULARSTRING Z (0 0 2,1 0 3,0 0 2)))', 'MULTICURVE EMPTY', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,1 1))', 'MULTICURVE Z (CIRCULARSTRING Z (0 0 1,1 0 1,0 0 1),(0 0 1,1 1 1))', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,1 1),COMPOUNDCURVE ((0 0,1 1),CIRCULARSTRING (1 1,2 2,3 3)))', 'MULTISURFACE EMPTY', 'MULTISURFACE (((0 0,0 10,10 10,10 0,0 0)),CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0)))', 'MULTISURFACE Z (((0 0 1,0 10 1,10 10 1,10 0 1,0 0 1)),CURVEPOLYGON Z (CIRCULARSTRING Z (0 0 1,1 0 1,0 0 1)))', 'GEOMETRYCOLLECTION (CIRCULARSTRING (0 1,2 3,4 5),COMPOUNDCURVE ((0 1,2 3,4 5)),CURVEPOLYGON ((0 0,0 1,1 1,1 0,0 0)),MULTICURVE ((0 0,1 1)),MULTISURFACE (((0 0,0 10,10 10,10 0,0 0))))', ]: # would cause PostGIS 1.X to crash if not gdaltest.pg_has_postgis_2 and wkt == 'CURVEPOLYGON EMPTY': continue # Parsing error of WKT by PostGIS 1.X if not gdaltest.pg_has_postgis_2 and 'MULTICURVE' in wkt and 'CIRCULARSTRING' in wkt: continue postgis_in_wkt = wkt while True: z_pos = postgis_in_wkt.find('Z ') # PostGIS 1.X doesn't like Z in WKT if not gdaltest.pg_has_postgis_2 and z_pos >= 0: postgis_in_wkt = postgis_in_wkt[0:z_pos] + postgis_in_wkt[z_pos + 2:] else: break # Test parsing PostGIS WKB lyr = gdaltest.pg_ds.ExecuteSQL("SELECT ST_GeomFromText('%s')" % postgis_in_wkt) f = lyr.GetNextFeature() g = f.GetGeometryRef() out_wkt = g.ExportToWkt() g = None f = None gdaltest.pg_ds.ReleaseResultSet(lyr) expected_wkt = wkt if not gdaltest.pg_has_postgis_2 and 'EMPTY' in wkt: expected_wkt = 'GEOMETRYCOLLECTION EMPTY' assert out_wkt == expected_wkt # Test parsing PostGIS WKT if gdaltest.pg_has_postgis_2: fct = 'ST_AsText' else: fct = 'AsEWKT' lyr = gdaltest.pg_ds.ExecuteSQL("SELECT %s(ST_GeomFromText('%s'))" % (fct, postgis_in_wkt)) f = lyr.GetNextFeature() g = f.GetGeometryRef() out_wkt = g.ExportToWkt() g = None f = None gdaltest.pg_ds.ReleaseResultSet(lyr) expected_wkt = wkt if not gdaltest.pg_has_postgis_2 and 'EMPTY' in wkt: expected_wkt = 'GEOMETRYCOLLECTION EMPTY' assert out_wkt == expected_wkt g = ogr.CreateGeometryFromWkt(wkt) if g.GetCoordinateDimension() == 2: active_lyr = curve_lyr else: active_lyr = curve_lyr2 # Use our WKB export to inject into PostGIS and check that # PostGIS interprets it correctly by checking with ST_AsText f = ogr.Feature(active_lyr.GetLayerDefn()) f.SetGeometry(g) ret = active_lyr.CreateFeature(f) assert ret == 0, wkt fid = f.GetFID() # AsEWKT() in PostGIS 1.X does not like CIRCULARSTRING EMPTY if not gdaltest.pg_has_postgis_2 and 'CIRCULARSTRING' in wkt and 'EMPTY' in wkt: continue lyr = gdaltest.pg_ds.ExecuteSQL("SELECT %s(wkb_geometry) FROM %s WHERE ogc_fid = %d" % (fct, active_lyr.GetName(), fid)) f = lyr.GetNextFeature() g = f.GetGeometryRef() out_wkt = g.ExportToWkt() gdaltest.pg_ds.ReleaseResultSet(lyr) g = None f = None assert out_wkt == wkt ############################################################################### # Test 64 bit FID def test_ogr_pg_72(): if gdaltest.pg_ds is None: pytest.skip() # Regular layer with 32 bit IDs lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_72') assert lyr.GetMetadataItem(ogr.OLMD_FID64) is None lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(123456789012345) f.SetField(0, 'bar') assert lyr.CreateFeature(f) == 0 f = lyr.GetFeature(123456789012345) assert f is not None lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_72', options=['FID64=YES', 'OVERWRITE=YES']) assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(123456789012345) f.SetField(0, 'bar') assert lyr.CreateFeature(f) == 0 assert lyr.SetFeature(f) == 0 gdaltest.pg_ds = None # Test with binary protocol # gdaltest.pg_ds = ogr.Open( 'PGB:' + gdaltest.pg_connection_string, update = 1 ) # lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_72') # if lyr.GetMetadataItem(ogr.OLMD_FID64) is None: # gdaltest.post_reason('fail') # return 'fail' # f = lyr.GetNextFeature() # if f.GetFID() != 123456789012345: # gdaltest.post_reason('fail') # f.DumpReadable() # return 'fail' # gdaltest.pg_ds = None # Test with normal protocol gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_72') assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None f = lyr.GetNextFeature() if f.GetFID() != 123456789012345: f.DumpReadable() pytest.fail() lyr.ResetReading() # to close implicit transaction ############################################################################### # Test not nullable fields def test_ogr_pg_73(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() gdal.SetConfigOption('PG_USE_COPY', 'NO') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_73', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_nullable', ogr.wkbPoint) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None gdal.SetConfigOption('PG_USE_COPY', gdaltest.pg_use_copy) lyr.ResetReading() # force above feature to be committed ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_73') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 # Turn not null into nullable src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')) fd = ogr.FieldDefn('now_nullable', src_fd.GetType()) fd.SetNullable(1) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable'), fd, ogr.ALTER_ALL_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_nullable')).IsNullable() == 1 # Turn nullable into not null, but remove NULL values first ds.ExecuteSQL("UPDATE ogr_pg_73 SET field_nullable = '' WHERE field_nullable IS NULL") src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')) fd = ogr.FieldDefn('now_nullable', src_fd.GetType()) fd.SetName('now_not_nullable') fd.SetNullable(0) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable'), fd, ogr.ALTER_ALL_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_not_nullable')).IsNullable() == 0 sql_lyr = ds.ExecuteSQL('SELECT * FROM ogr_pg_73') assert sql_lyr.GetLayerDefn().GetFieldDefn(sql_lyr.GetLayerDefn().GetFieldIndex('now_not_nullable')).IsNullable() == 0 assert sql_lyr.GetLayerDefn().GetFieldDefn(sql_lyr.GetLayerDefn().GetFieldIndex('now_nullable')).IsNullable() == 1 assert sql_lyr.GetLayerDefn().GetGeomFieldDefn(sql_lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert sql_lyr.GetLayerDefn().GetGeomFieldDefn(sql_lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test default values def test_ogr_pg_74(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_74', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime3', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56.123'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_date', ogr.OFTDate) field_defn.SetDefault("CURRENT_DATE") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_time', ogr.OFTTime) field_defn.SetDefault("CURRENT_TIME") lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('field_string') f.SetField('field_int', 456) f.SetField('field_real', 4.56) f.SetField('field_datetime', '2015/06/30 12:34:56') f.SetField('field_datetime2', '2015/06/30 12:34:56') f.SetField('field_datetime3', '2015/06/30 12:34:56.123') f.SetField('field_date', '2015/06/30') f.SetField('field_time', '12:34:56') lyr.CreateFeature(f) f = None # Transition from COPY to INSERT f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None # Transition from INSERT to COPY f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_string', 'b') f.SetField('field_int', 456) f.SetField('field_real', 4.56) f.SetField('field_datetime', '2015/06/30 12:34:56') f.SetField('field_datetime2', '2015/06/30 12:34:56') f.SetField('field_datetime3', '2015/06/30 12:34:56.123') f.SetField('field_date', '2015/06/30') f.SetField('field_time', '12:34:56') lyr.CreateFeature(f) f = None lyr.ResetReading() # force above feature to be committed ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') lyr = ds.GetLayerByName('ogr_pg_74') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() == 'CURRENT_TIMESTAMP' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() == "'2015/06/30 12:34:56'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime3')).GetDefault() == "'2015/06/30 12:34:56.123'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault() == "CURRENT_DATE" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_time')).GetDefault() == "CURRENT_TIME" f = lyr.GetNextFeature() if not f.IsFieldNull('field_string'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56+00' or \ f.GetField('field_datetime3') != '2015/06/30 12:34:56.123+00' or \ not f.IsFieldSet('field_date') or not f.IsFieldSet('field_time'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('field_string') != 'b': f.DumpReadable() pytest.fail() lyr.ResetReading() # to close implicit transaction # Change DEFAULT value src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')) fd = ogr.FieldDefn('field_string', src_fd.GetType()) fd.SetDefault("'c'") lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string'), fd, ogr.ALTER_DEFAULT_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'c'" # Drop DEFAULT value src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')) fd = ogr.FieldDefn('field_int', src_fd.GetType()) fd.SetDefault(None) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int'), fd, ogr.ALTER_DEFAULT_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() is None ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.ExecuteSQL('set timezone to "UTC"') lyr = ds.GetLayerByName('ogr_pg_74') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'c'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() is None ############################################################################### # Test creating a field with the fid name def test_ogr_pg_75(): if gdaltest.pg_ds is None: pytest.skip() if not gdaltest.pg_has_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_75', geom_type=ogr.wkbNone, options=['FID=myfid']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) assert ret == 0 lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 10) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 10 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 if feat.GetFID() < 0: feat.DumpReadable() pytest.fail() if feat.GetField('myfid') != feat.GetFID(): feat.DumpReadable() pytest.fail() feat.SetField('str', 'foo') ret = lyr.SetFeature(feat) assert ret == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) feat.SetField('myfid', 10) gdal.PushErrorHandler() ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat.UnsetField('myfid') gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 12) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 12 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f.GetField('str') != 'first string' or f.GetField('str2') != 'second string' or f.GetField('myfid') != 10: f.DumpReadable() pytest.fail() f = lyr.GetFeature(f.GetFID()) if f.GetFID() != 10 or f.GetField('str') != 'first string' or f.GetField('str2') != 'second string' or f.GetField('myfid') != 10: f.DumpReadable() pytest.fail() f = None lyr.ResetReading() # to close implicit transaction ############################################################################### # Test transactions RFC 54 def ogr_pg_76_get_transaction_state(ds): return (ds.GetMetadataItem("osDebugLastTransactionCommand", "_DEBUG_"), int(ds.GetMetadataItem("nSoftTransactionLevel", "_DEBUG_")), int(ds.GetMetadataItem("bSavePointActive", "_DEBUG_")), int(ds.GetMetadataItem("bUserTransactionActive", "_DEBUG_"))) def test_ogr_pg_76(): if gdaltest.pg_ds is None: pytest.skip() assert gdaltest.pg_ds.TestCapability(ogr.ODsCTransactions) == 1 level = int(gdaltest.pg_ds.GetMetadataItem("nSoftTransactionLevel", "_DEBUG_")) assert level == 0 if gdaltest.pg_has_postgis_2: gdaltest.pg_ds.StartTransaction() lyr = gdaltest.pg_ds.CreateLayer('will_not_be_created', options=['OVERWRITE=YES']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name = 'will_not_be_created'") f = sql_lyr.GetNextFeature() res = f.GetField(0) gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert res == 1 gdaltest.pg_ds.RollbackTransaction() # Rollback doesn't rollback the insertion in geometry_columns if done through the AddGeometryColumn() sql_lyr = gdaltest.pg_ds.ExecuteSQL("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name = 'will_not_be_created'") f = sql_lyr.GetNextFeature() res = f.GetField(0) gdaltest.pg_ds.ReleaseResultSet(sql_lyr) assert res == 0 gdal.SetConfigOption('OGR_PG_CURSOR_PAGE', '1') lyr1 = gdaltest.pg_ds.CreateLayer('ogr_pg_76_lyr1', geom_type=ogr.wkbNone, options=['OVERWRITE=YES']) lyr2 = gdaltest.pg_ds.CreateLayer('ogr_pg_76_lyr2', geom_type=ogr.wkbNone, options=['OVERWRITE=YES']) gdal.SetConfigOption('OGR_PG_CURSOR_PAGE', None) lyr1.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) # lyr2.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) lyr2.CreateFeature(ogr.Feature(lyr2.GetLayerDefn())) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) lyr2.CreateFeature(ogr.Feature(lyr2.GetLayerDefn())) level = int(gdaltest.pg_ds.GetMetadataItem("nSoftTransactionLevel", "_DEBUG_")) assert level == 0 ret = ogr_pg_76_scenario1(lyr1, lyr2) ret = ogr_pg_76_scenario2(lyr1, lyr2) ret = ogr_pg_76_scenario3(lyr1, lyr2) ret = ogr_pg_76_scenario4(lyr1, lyr2) return ret # Scenario 1 : a CreateFeature done in the middle of GetNextFeature() def ogr_pg_76_scenario1(lyr1, lyr2): (_, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (level, savepoint, usertransac) == (0, 0, 0) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 0) lyr1.SetAttributeFilter("foo is NULL") (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 0) f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 0, 0) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 2 # Check that GetFeature() doesn't reset the cursor f = lyr1.GetFeature(f.GetFID()) assert f is not None and f.GetFID() == 2 f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 3 f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 2 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 0, 0) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) lyr1.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 1, 0, 0) lyr2.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) assert lyr1.GetFeatureCount() == 4 # Scenario 2 : a CreateFeature done in the middle of GetNextFeature(), themselves between a user transaction def ogr_pg_76_scenario2(lyr1, lyr2): assert gdaltest.pg_ds.StartTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 1) # Try to re-enter a transaction gdal.ErrorReset() gdal.PushErrorHandler() ret = gdaltest.pg_ds.StartTransaction() gdal.PopErrorHandler() assert not (gdal.GetLastErrorMsg() == '' or ret == 0) (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 1, 0, 1) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 0, 1) f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 3, 0, 1) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 2 f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 3 f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 2 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 3, 0, 1) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) lyr1.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 0, 1) lyr2.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 1, 0, 1) assert gdaltest.pg_ds.CommitTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) assert gdaltest.pg_ds.StartTransaction() == 0 assert gdaltest.pg_ds.RollbackTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('ROLLBACK', 0, 0, 0) # Try to re-commit a transaction gdal.ErrorReset() gdal.PushErrorHandler() ret = gdaltest.pg_ds.CommitTransaction() gdal.PopErrorHandler() assert not (gdal.GetLastErrorMsg() == '' or ret == 0) (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 0, 0, 0) # Try to rollback a non-transaction gdal.ErrorReset() gdal.PushErrorHandler() ret = gdaltest.pg_ds.RollbackTransaction() gdal.PopErrorHandler() assert not (gdal.GetLastErrorMsg() == '' or ret == 0) (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 0, 0, 0) # Scenario 3 : StartTransaction(), GetNextFeature(), CommitTransaction(), GetNextFeature() def ogr_pg_76_scenario3(lyr1, lyr2): assert gdaltest.pg_ds.StartTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 1) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 0, 1) assert gdaltest.pg_ds.CommitTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) gdal.ErrorReset() gdal.PushErrorHandler() f = lyr1.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' and f is None # Must re-issue an explicit ResetReading() lyr1.ResetReading() f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 0) lyr1.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) lyr2.ResetReading() # Scenario 4 : GetNextFeature(), StartTransaction(), CreateFeature(), CommitTransaction(), GetNextFeature(), ResetReading() def ogr_pg_76_scenario4(lyr1, lyr2): (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 0, 0, 0) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('BEGIN', 1, 0, 0) assert gdaltest.pg_ds.StartTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('SAVEPOINT ogr_savepoint', 2, 1, 1) lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 2 f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 3, 1, 1) # Check that it doesn't commit the transaction lyr1.SetAttributeFilter("foo is NULL") (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 2, 1, 1) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 1 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('', 3, 1, 1) f = lyr2.GetNextFeature() assert f is not None and f.GetFID() == 2 assert gdaltest.pg_ds.CommitTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('RELEASE SAVEPOINT ogr_savepoint', 2, 0, 0) lyr2.ResetReading() assert gdaltest.pg_ds.StartTransaction() == 0 assert gdaltest.pg_ds.RollbackTransaction() == 0 (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('ROLLBACK TO SAVEPOINT ogr_savepoint', 1, 0, 0) f = lyr1.GetNextFeature() assert f is not None and f.GetFID() == 2 lyr1.ResetReading() (lastcmd, level, savepoint, usertransac) = ogr_pg_76_get_transaction_state(gdaltest.pg_ds) assert (lastcmd, level, savepoint, usertransac) == ('COMMIT', 0, 0, 0) ############################################################################### # Test ogr2ogr can insert multiple layers at once def test_ogr_pg_77(): import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_77_1') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_77_2') try: shutil.rmtree('tmp/ogr_pg_77') except OSError: pass os.mkdir('tmp/ogr_pg_77') f = open('tmp/ogr_pg_77/ogr_pg_77_1.csv', 'wt') f.write('id,WKT\n') f.write('1,POINT(1 2)\n') f.close() f = open('tmp/ogr_pg_77/ogr_pg_77_2.csv', 'wt') f.write('id,WKT\n') f.write('2,POINT(1 2)\n') f.close() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PostgreSQL "' + 'PG:' + gdaltest.pg_connection_string + '" tmp/ogr_pg_77') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_77_1') feat = lyr.GetNextFeature() assert feat.GetField(0) == '1' feat.SetField(0, 10) lyr.SetFeature(feat) lyr = ds.GetLayerByName('ogr_pg_77_2') feat = lyr.GetNextFeature() assert feat.GetField(0) == '2' ds = None # Test fix for #6018 gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f PostgreSQL "' + 'PG:' + gdaltest.pg_connection_string + '" tmp/ogr_pg_77 -overwrite') ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_77_1') feat = lyr.GetNextFeature() assert feat.GetField(0) == '1' ds = None try: shutil.rmtree('tmp/ogr_pg_77') except OSError: pass ############################################################################### # Test manually added geometry constraints def test_ogr_pg_78(): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis_2: pytest.skip() gdaltest.pg_ds.ExecuteSQL("CREATE TABLE ogr_pg_78 (ID INTEGER PRIMARY KEY)") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78 ADD COLUMN my_geom GEOMETRY") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78 ADD CONSTRAINT ogr_pg_78_my_geom_type CHECK (geometrytype(my_geom)='POINT')") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78 ADD CONSTRAINT ogr_pg_78_my_geom_dim CHECK (st_ndims(my_geom)=3)") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78 ADD CONSTRAINT ogr_pg_78_my_geom_srid CHECK (st_srid(my_geom)=4326)") gdaltest.pg_ds.ExecuteSQL("CREATE TABLE ogr_pg_78_2 (ID INTEGER PRIMARY KEY)") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78_2 ADD COLUMN my_geog GEOGRAPHY") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78_2 ADD CONSTRAINT ogr_pg_78_2_my_geog_type CHECK (geometrytype(my_geog::geometry)='POINT')") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78_2 ADD CONSTRAINT ogr_pg_78_2_my_geog_dim CHECK (st_ndims(my_geog::geometry)=3)") gdaltest.pg_ds.ExecuteSQL("ALTER TABLE ogr_pg_78_2 ADD CONSTRAINT ogr_pg_78_2_my_geog_srid CHECK (st_srid(my_geog::geometry)=4326)") gdaltest.pg_ds = None gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lc = gdaltest.pg_ds.GetLayerCount() # force discovery of all tables ogr_pg_78_found = False ogr_pg_78_2_found = False for i in range(lc): lyr = gdaltest.pg_ds.GetLayer(i) if lyr.GetName() == 'ogr_pg_78': ogr_pg_78_found = True assert lyr.GetGeomType() == ogr.wkbPoint25D assert lyr.GetSpatialRef().ExportToWkt().find('4326') >= 0 if lyr.GetName() == 'ogr_pg_78_2': ogr_pg_78_2_found = True assert lyr.GetGeomType() == ogr.wkbPoint25D assert lyr.GetSpatialRef().ExportToWkt().find('4326') >= 0 assert ogr_pg_78_found assert ogr_pg_78_2_found gdaltest.pg_ds = None # Test with slow method gdal.SetConfigOption('PG_USE_POSTGIS2_OPTIM', 'NO') gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lc = gdaltest.pg_ds.GetLayerCount() # force discovery of all tables ogr_pg_78_found = False ogr_pg_78_2_found = False for i in range(lc): lyr = gdaltest.pg_ds.GetLayer(i) if lyr.GetName() == 'ogr_pg_78': ogr_pg_78_found = True if lyr.GetGeomType() != ogr.wkbPoint25D: # FIXME: why does it fail suddenly on Travis ? Change of PostGIS version ? # But apparently not : # Last good: https://travis-ci.org/OSGeo/gdal/builds/60211881 # First bad: https://travis-ci.org/OSGeo/gdal/builds/60290209 val = gdal.GetConfigOption('TRAVIS', None) if val is not None: print('Fails on Travis. geom_type = %d' % lyr.GetGeomType()) else: pytest.fail() if lyr.GetSpatialRef() is None or lyr.GetSpatialRef().ExportToWkt().find('4326') < 0: val = gdal.GetConfigOption('TRAVIS', None) if val is not None: print('Fails on Travis. GetSpatialRef() = %s' % str(lyr.GetSpatialRef())) else: pytest.fail() if lyr.GetName() == 'ogr_pg_78_2': ogr_pg_78_2_found = True # No logic in geography_columns to get type/coordim/srid from constraints # if lyr.GetGeomType() != ogr.wkbPoint25D: # gdaltest.post_reason('fail') # return 'fail' # if lyr.GetSpatialRef().ExportToWkt().find('4326') < 0: # gdaltest.post_reason('fail') # return 'fail' assert ogr_pg_78_found assert ogr_pg_78_2_found ############################################################################### # Test PRELUDE_STATEMENTS and CLOSING_STATEMENTS open options def test_ogr_pg_79(): if gdaltest.pg_ds is None: pytest.skip() # PRELUDE_STATEMENTS starting with BEGIN (use case: pg_bouncer in transaction pooling) ds = gdal.OpenEx('PG:' + gdaltest.pg_connection_string, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['PRELUDE_STATEMENTS=BEGIN; SET LOCAL statement_timeout TO "1h";', 'CLOSING_STATEMENTS=COMMIT;']) sql_lyr = ds.ExecuteSQL('SHOW statement_timeout') f = sql_lyr.GetNextFeature() if f.GetField(0) != '1h': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ret = ds.StartTransaction() assert ret == 0 ret = ds.CommitTransaction() assert ret == 0 gdal.ErrorReset() ds = None assert gdal.GetLastErrorMsg() == '' # random PRELUDE_STATEMENTS ds = gdal.OpenEx('PG:' + gdaltest.pg_connection_string, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['PRELUDE_STATEMENTS=SET statement_timeout TO "1h"']) sql_lyr = ds.ExecuteSQL('SHOW statement_timeout') f = sql_lyr.GetNextFeature() if f.GetField(0) != '1h': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ret = ds.StartTransaction() assert ret == 0 ret = ds.CommitTransaction() assert ret == 0 gdal.ErrorReset() ds = None assert gdal.GetLastErrorMsg() == '' # Test wrong PRELUDE_STATEMENTS with gdaltest.error_handler(): ds = gdal.OpenEx('PG:' + gdaltest.pg_connection_string, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['PRELUDE_STATEMENTS=BEGIN;error SET LOCAL statement_timeout TO "1h";', 'CLOSING_STATEMENTS=COMMIT;']) assert ds is None # Test wrong CLOSING_STATEMENTS ds = gdal.OpenEx('PG:' + gdaltest.pg_connection_string, gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['PRELUDE_STATEMENTS=BEGIN; SET LOCAL statement_timeout TO "1h";', 'CLOSING_STATEMENTS=COMMIT;error']) gdal.ErrorReset() with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() != '' ############################################################################### # Test retrieving an error from ExecuteSQL() (#6194) def test_ogr_pg_80(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() gdal.ErrorReset() with gdaltest.error_handler(): sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT FROM') assert gdal.GetLastErrorMsg() != '' assert sql_lyr is None ############################################################################### # Test that ogr2ogr -skip properly rollbacks transactions (#6328) def test_ogr_pg_81(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() gdaltest.pg_ds.ReleaseResultSet(gdaltest.pg_ds.ExecuteSQL("create table ogr_pg_81_1(id varchar unique, foo varchar); SELECT AddGeometryColumn('ogr_pg_81_1','dummy',-1,'POINT',2);")) gdaltest.pg_ds.ReleaseResultSet(gdaltest.pg_ds.ExecuteSQL("create table ogr_pg_81_2(id varchar unique, foo varchar); SELECT AddGeometryColumn('ogr_pg_81_2','dummy',-1,'POINT',2);")) # 0755 = 493 gdal.Mkdir('/vsimem/ogr_pg_81', 493) gdal.FileFromMemBuffer('/vsimem/ogr_pg_81/ogr_pg_81_1.csv', """id,foo 1,1""") gdal.FileFromMemBuffer('/vsimem/ogr_pg_81/ogr_pg_81_2.csv', """id,foo 1,1""") gdal.VectorTranslate('PG:' + gdaltest.pg_connection_string, '/vsimem/ogr_pg_81', accessMode='append') gdal.FileFromMemBuffer('/vsimem/ogr_pg_81/ogr_pg_81_2.csv', """id,foo 2,2""") with gdaltest.error_handler(): gdal.VectorTranslate('PG:' + gdaltest.pg_connection_string, '/vsimem/ogr_pg_81', accessMode='append', skipFailures=True) gdal.Unlink('/vsimem/ogr_pg_81/ogr_pg_81_1.csv') gdal.Unlink('/vsimem/ogr_pg_81/ogr_pg_81_2.csv') gdal.Unlink('/vsimem/ogr_pg_81') lyr = gdaltest.pg_ds.GetLayer('ogr_pg_81_2') f = lyr.GetNextFeature() f = lyr.GetNextFeature() if f['id'] != '2': f.DumpReadable() pytest.fail() lyr.ResetReading() # flushes implicit transaction ############################################################################### # Test that GEOMETRY_NAME works even when the geometry column creation is # done through CreateGeomField (#6366) # This is important for the ogr2ogr use case when the source geometry column # is not-nullable, and hence the CreateGeomField() interface is used. def test_ogr_pg_82(with_and_without_postgis): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis or not with_and_without_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_82', geom_type=ogr.wkbNone, options=['GEOMETRY_NAME=another_name']) lyr.CreateGeomField(ogr.GeomFieldDefn('my_geom', ogr.wkbPoint)) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'another_name' ############################################################################### # Test ZM support def test_ogr_pg_83(with_and_without_postgis): if gdaltest.pg_ds is None or not gdaltest.pg_has_postgis or not with_and_without_postgis: pytest.skip() tests = [[ogr.wkbUnknown, [], 'POINT ZM (1 2 3 4)', 'POINT (1 2)'], [ogr.wkbUnknown, ['DIM=XYZM'], 'POINT ZM (1 2 3 4)', 'POINT ZM (1 2 3 4)'], [ogr.wkbUnknown, ['DIM=XYZ'], 'POINT ZM (1 2 3 4)', 'POINT Z (1 2 3)'], [ogr.wkbUnknown, ['DIM=XYM'], 'POINT M (1 2 4)', 'POINT M (1 2 4)'], [ogr.wkbPointZM, [], 'POINT ZM (1 2 3 4)', 'POINT ZM (1 2 3 4)'], [ogr.wkbPoint25D, [], 'POINT ZM (1 2 3 4)', 'POINT Z (1 2 3)'], [ogr.wkbPointM, [], 'POINT ZM (1 2 3 4)', 'POINT M (1 2 4)'], [ogr.wkbUnknown, ['GEOM_TYPE=geography', 'DIM=XYM'], 'POINT ZM (1 2 3 4)', 'POINT M (1 2 4)'], ] for (geom_type, options, wkt, expected_wkt) in tests: lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_83', geom_type=geom_type, options=options + ['OVERWRITE=YES']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) f = None lyr.ResetReading() f = lyr.GetNextFeature() got_wkt = '' if f is not None: geom = f.GetGeometryRef() if geom is not None: got_wkt = geom.ExportToIsoWkt() assert got_wkt == expected_wkt, (geom_type, options, wkt, expected_wkt, got_wkt) lyr.ResetReading() # flushes implicit transaction if 'GEOM_TYPE=geography' in options: continue # Cannot do AddGeometryColumn( 'GEOMETRYM', 3 ) with PostGIS 2, and doesn't accept inserting a XYM geometry if gdaltest.pg_has_postgis_2 and geom_type == ogr.wkbUnknown and options == ['DIM=XYM']: continue lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_83', geom_type=ogr.wkbNone, options=options + ['OVERWRITE=YES']) # To force table creation to happen now so that following # CreateGeomField() is done through a AddGeometryColumn() call lyr.ResetReading() lyr.GetNextFeature() lyr.CreateGeomField(ogr.GeomFieldDefn("my_geom", geom_type)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) f = None lyr.ResetReading() f = lyr.GetNextFeature() got_wkt = '' if f is not None: geom = f.GetGeometryRef() if geom is not None: got_wkt = geom.ExportToIsoWkt() assert got_wkt == expected_wkt, (geom_type, options, wkt, expected_wkt, got_wkt) lyr.ResetReading() # flushes implicit transaction ############################################################################### # Test description def test_ogr_pg_84(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.CreateLayer('ogr_pg_84', geom_type=ogr.wkbPoint, options=['OVERWRITE=YES', 'DESCRIPTION=foo']) # Test that SetMetadata() and SetMetadataItem() are without effect lyr.SetMetadata({'DESCRIPTION': 'bar'}) lyr.SetMetadataItem('DESCRIPTION', 'baz') assert lyr.GetMetadataItem('DESCRIPTION') == 'foo' assert lyr.GetMetadata_List() == ['DESCRIPTION=foo'], lyr.GetMetadata() ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.GetLayerCount() # load all layers lyr = ds.GetLayerByName('ogr_pg_84') assert lyr.GetMetadataItem('DESCRIPTION') == 'foo' assert lyr.GetMetadata_List() == ['DESCRIPTION=foo'], lyr.GetMetadata() # Set with SetMetadata() lyr.SetMetadata(['DESCRIPTION=bar']) ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_84') # load just this layer assert lyr.GetMetadataItem('DESCRIPTION') == 'bar' assert lyr.GetMetadataDomainList() is not None # Set with SetMetadataItem() lyr.SetMetadataItem('DESCRIPTION', 'baz') ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = ds.GetLayerByName('ogr_pg_84') assert lyr.GetMetadataDomainList() is not None assert lyr.GetMetadataItem('DESCRIPTION') == 'baz' # Unset with SetMetadataItem() lyr.SetMetadataItem('DESCRIPTION', None) ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) lyr = ds.GetLayerByName('ogr_pg_84') # load just this layer assert lyr.GetMetadataDomainList() is None assert lyr.GetMetadataItem('DESCRIPTION') is None ds = None ds = ogr.Open('PG:' + gdaltest.pg_connection_string) ds.GetLayerCount() # load all layers lyr = ds.GetLayerByName('ogr_pg_84') # load just this layer assert lyr.GetMetadataItem('DESCRIPTION') is None ds = None ############################################################################### # Test append of several layers in PG_USE_COPY mode (#6411) def test_ogr_pg_85(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() gdaltest.pg_ds.CreateLayer('ogr_pg_85_1') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_85_2') lyr.CreateField(ogr.FieldDefn('foo')) gdaltest.pg_ds.ReleaseResultSet(gdaltest.pg_ds.ExecuteSQL('SELECT 1')) # make sure the layers are well created old_val = gdal.GetConfigOption('PG_USE_COPY') gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) ds.GetLayerCount() ds.StartTransaction() lyr = ds.GetLayerByName('ogr_pg_85_1') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) lyr = ds.GetLayerByName('ogr_pg_85_2') feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldCount() == 1 f = ogr.Feature(feat_defn) assert lyr.CreateFeature(f) == 0 ds.CommitTransaction() ds = None # Although test real ogr2ogr scenario # 0755 = 493 gdal.Mkdir('/vsimem/ogr_pg_85', 493) gdal.FileFromMemBuffer('/vsimem/ogr_pg_85/ogr_pg_85_1.csv', """id,foo 1,1""") gdal.FileFromMemBuffer('/vsimem/ogr_pg_85/ogr_pg_85_2.csv', """id,foo 1,1""") gdal.VectorTranslate('PG:' + gdaltest.pg_connection_string, '/vsimem/ogr_pg_85', accessMode='append') gdal.Unlink('/vsimem/ogr_pg_85/ogr_pg_85_1.csv') gdal.Unlink('/vsimem/ogr_pg_85/ogr_pg_85_2.csv') gdal.Unlink('/vsimem/ogr_pg_85') gdal.SetConfigOption('PG_USE_COPY', old_val) lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_85_2') assert lyr.GetFeatureCount() == 2 ############################################################################### # Test OFTBinary def test_ogr_pg_86(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() old_val = gdal.GetConfigOption('PG_USE_COPY') gdal.SetConfigOption('PG_USE_COPY', 'YES') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_86') lyr.CreateField(ogr.FieldDefn('test', ogr.OFTBinary)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldBinaryFromHexString('test', '3020') lyr.CreateFeature(f) lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField(0) != '3020': gdal.SetConfigOption('PG_USE_COPY', old_val) pytest.fail() gdal.SetConfigOption('PG_USE_COPY', 'NO') lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_86', options=['OVERWRITE=YES']) lyr.CreateField(ogr.FieldDefn('test', ogr.OFTBinary)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldBinaryFromHexString('test', '3020') lyr.CreateFeature(f) lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField(0) != '3020': gdal.SetConfigOption('PG_USE_COPY', old_val) pytest.fail() gdal.SetConfigOption('PG_USE_COPY', old_val) ############################################################################### # Test sequence updating (#7032) def test_ogr_pg_87(with_and_without_postgis): if gdaltest.pg_ds is None or not with_and_without_postgis: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_87') lyr.CreateField(ogr.FieldDefn('test', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(10) lyr.CreateFeature(f) # Test updating of sequence after CreateFeatureViaCopy gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_87') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) assert f.GetFID() == 11 # Test updating of sequence after CreateFeatureViaInsert gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayerByName('ogr_pg_87') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) assert f.GetFID() == 12 ############################################################################### # Test JSON subtype def test_ogr_pg_json(): if gdaltest.pg_ds is None: pytest.skip() lyr = gdaltest.pg_ds.CreateLayer('ogr_pg_json') fld_defn = ogr.FieldDefn('test_json', ogr.OFTString) fld_defn.SetSubType(ogr.OFSTJSON) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) f['test_json'] = '{"a": "b"}' lyr.CreateFeature(f) gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) lyr = gdaltest.pg_ds.GetLayer('ogr_pg_json') assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTJSON f = lyr.GetNextFeature() if f.GetField(0) != '{"a": "b"}': f.DumpReadable() pytest.fail() sql_lyr = gdaltest.pg_ds.ExecuteSQL('SELECT * FROM ogr_pg_json') assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTJSON gdaltest.pg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # def test_ogr_pg_table_cleanup(): if gdaltest.pg_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.pg_ds.ExecuteSQL('DELLAYER:tpoly') gdaltest.pg_ds.ExecuteSQL('DELLAYER:tpolycopy') gdaltest.pg_ds.ExecuteSQL('DELLAYER:test_for_tables_equal_param') gdaltest.pg_ds.ExecuteSQL('DELLAYER:datetest') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testgeom') gdaltest.pg_ds.ExecuteSQL('DELLAYER:datatypetest') # gdaltest.pg_ds.ExecuteSQL( 'DELLAYER:datatypetest_withouttimestamptz' ) gdaltest.pg_ds.ExecuteSQL('DELLAYER:datatypetest2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext3') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext4') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testsrtext5') gdaltest.pg_ds.ExecuteSQL('DELLAYER:testoverflows') gdaltest.pg_ds.ExecuteSQL('DELLAYER:table36_inherited2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:table36_inherited') gdaltest.pg_ds.ExecuteSQL('DELLAYER:table36_base') gdaltest.pg_ds.ExecuteSQL('DELLAYER:table37_inherited') gdaltest.pg_ds.ExecuteSQL('DROP TABLE table37_base CASCADE') gdaltest.pg_ds.ExecuteSQL('DROP VIEW testview') gdaltest.pg_ds.ExecuteSQL("DELETE FROM geometry_columns WHERE f_table_name='testview'") gdaltest.pg_ds.ExecuteSQL('DELLAYER:select') gdaltest.pg_ds.ExecuteSQL('DELLAYER:bigtable') gdaltest.pg_ds.ExecuteSQL('DELLAYER:test_geog') gdaltest.pg_ds.ExecuteSQL('DELLAYER:no_pk_table') gdaltest.pg_ds.ExecuteSQL('DELLAYER:no_geometry_table') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_55') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_56') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_57') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_58') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_60') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_61') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_63') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_65') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_65_copied') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_67') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_68') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_70') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_72') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_73') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_74') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_75') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_76_lyr1') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_76_lyr2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:test_curve') gdaltest.pg_ds.ExecuteSQL('DELLAYER:test_curve_3d') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_77_1') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_77_2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_78') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_78_2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_81_1') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_81_2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_82') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_83') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_84') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_85_1') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_85_2') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_86') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_87') gdaltest.pg_ds.ExecuteSQL('DELLAYER:ogr_pg_json') # Drop second 'tpoly' from schema 'AutoTest-schema' (do NOT quote names here) gdaltest.pg_ds.ExecuteSQL('DELLAYER:AutoTest-schema.tpoly') gdaltest.pg_ds.ExecuteSQL('DELLAYER:AutoTest-schema.test41') gdaltest.pg_ds.ExecuteSQL('DELLAYER:AutoTest-schema.table36_base') gdaltest.pg_ds.ExecuteSQL('DELLAYER:AutoTest-schema.table36_inherited') # Drop 'AutoTest-schema' (here, double quotes are required) gdaltest.pg_ds.ExecuteSQL('DROP SCHEMA \"AutoTest-schema\" CASCADE') gdal.PopErrorHandler() def test_ogr_pg_cleanup(): if gdaltest.pg_ds is None: pytest.skip() gdaltest.pg_ds = ogr.Open('PG:' + gdaltest.pg_connection_string, update=1) test_ogr_pg_table_cleanup() gdaltest.pg_ds.Destroy() gdaltest.pg_ds = None # NOTE: The ogr_pg_19 intentionally executed after ogr_pg_2 gdalautotest-3.0.4/ogr/ogr_db2_hack.py0000755003401500001440000000772413614005324017310 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_db2_hack.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test DB2 V7.2 WKB support. DB2 7.2 had a corrupt WKB format # and OGR supports reading and writing it for compatibility (done # on behalf of Safe Software). # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # # 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. ############################################################################### from osgeo import ogr import pytest ############################################################################### # Create a point in DB2 format, and verify the byte order flag. def test_ogr_db2_hack_1(): if ogr.SetGenerate_DB2_V72_BYTE_ORDER(1) != 0: pytest.skip() # XDR Case. geom = ogr.CreateGeometryFromWkt('POINT(10 20)') wkb = geom.ExportToWkb(byte_order=ogr.wkbXDR).decode('latin1') geom.Destroy() assert wkb[0] == '0', 'WKB wkbXDR point geometry has wrong byte order' # NDR Case. geom = ogr.CreateGeometryFromWkt('POINT(10 20)') wkb = geom.ExportToWkb(byte_order=ogr.wkbNDR).decode('latin1') geom.Destroy() assert wkb[0] == '1', 'WKB wkbNDR point geometry has wrong byte order' ############################################################################### # Verify that we can turn DB2 V7.2 mode back off! def test_ogr_db2_hack_2(): assert ogr.SetGenerate_DB2_V72_BYTE_ORDER(0) == 0, \ 'SetGenerate to turn off hack failed!' # XDR Case. geom = ogr.CreateGeometryFromWkt('POINT(10 20)') wkb = geom.ExportToWkb(byte_order=ogr.wkbXDR).decode('latin1') geom.Destroy() assert wkb[0] == chr(0), 'WKB wkbXDR point geometry has wrong byte order' # NDR Case. geom = ogr.CreateGeometryFromWkt('POINT(10 20)') wkb = geom.ExportToWkb(byte_order=ogr.wkbNDR).decode('latin1') geom.Destroy() assert wkb[0] == chr(1), 'WKB wkbNDR point geometry has wrong byte order' ############################################################################### # Try a more complex geometry, and verify we can read it back. def test_ogr_db2_hack_3(): if ogr.SetGenerate_DB2_V72_BYTE_ORDER(1) != 0: pytest.skip() wkt = 'MULTIPOLYGON (((10.00121344 2.99853145,10.00121344 1.99853145,11.00121343 1.99853148,11.00121343 2.99853148)),((10.00121344 2.99853145,10.00121344 3.99853145,9.00121345 3.99853143,9.00121345 2.99853143)))' geom = ogr.CreateGeometryFromWkt(wkt) wkb = geom.ExportToWkb() geom.Destroy() # Check primary byte order value. assert wkb.decode('latin1')[0] == '0' or wkb.decode('latin1')[0] == '1', \ 'corrupt primary geometry byte order' # Check component geometry byte order assert wkb.decode('latin1')[9] == '0' or wkb.decode('latin1')[9] == '1', \ 'corrupt sub-geometry byte order' geom = ogr.CreateGeometryFromWkb(wkb) assert geom.ExportToWkt() == wkt, ('Conversion to/from DB2 format seems to have ' 'corrupted geometry.') geom.Destroy() ogr.SetGenerate_DB2_V72_BYTE_ORDER(0) gdalautotest-3.0.4/ogr/ogr_layer_algebra.py0000755003401500001440000004224213614005324020436 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: Test topological overlay methods in Layer class. # Author: Ari Jolma # ############################################################################### # Copyright (c) 2012, Ari Jolma # 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Common usage tests. ds = None A = None B = None C = None pointInB = None D1 = None D2 = None empty = None def recreate_layer_C(): global C ds.DeleteLayer('C') C = ds.CreateLayer('C') def print_layer(A): A.ResetReading() while True: f = A.GetNextFeature() if f is None: return g = f.GetGeometryRef() print(g.ExportToWkt()) def is_same(A, B): A.ResetReading() B.ResetReading() while True: fA = A.GetNextFeature() fB = B.GetNextFeature() if fA is None: if fB is not None: return False return True if fB is None: return False if fA.Equal(fB) != 0: return False def test_algebra_setup(): global ds, A, B, C, pointInB, D1, D2, empty if not ogrtest.have_geos(): pytest.skip() # Create three memory layers for intersection. ds = ogr.GetDriverByName('Memory').CreateDataSource('wrk') A = ds.CreateLayer('A') A.CreateField(ogr.FieldDefn("A", ogr.OFTInteger)) B = ds.CreateLayer('B') B.CreateField(ogr.FieldDefn("B", ogr.OFTString)) pointInB = ds.CreateLayer('pointInB') C = ds.CreateLayer('C') # Add polygons. a1 = 'POLYGON((1 2, 1 3, 3 3, 3 2, 1 2))' a2 = 'POLYGON((5 2, 5 3, 7 3, 7 2, 5 2))' b1 = 'POLYGON((2 1, 2 4, 6 4, 6 1, 2 1))' pointInB1 = 'POINT(3 3)' feat = ogr.Feature(A.GetLayerDefn()) feat.SetField('A', 1) feat.SetGeometryDirectly(ogr.Geometry(wkt=a1)) A.CreateFeature(feat) feat = ogr.Feature(A.GetLayerDefn()) feat.SetField('A', 2) feat.SetGeometryDirectly(ogr.Geometry(wkt=a2)) A.CreateFeature(feat) feat = ogr.Feature(B.GetLayerDefn()) feat.SetField('B', 'first') feat.SetGeometryDirectly(ogr.Geometry(wkt=b1)) B.CreateFeature(feat) feat = ogr.Feature(pointInB.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=pointInB1)) pointInB.CreateFeature(feat) d1 = 'POLYGON((1 2, 1 3, 3 3, 3 2, 1 2))' d2 = 'POLYGON((3 2, 3 3, 4 3, 4 2, 3 2))' D1 = ds.CreateLayer('D1') feat = ogr.Feature(D1.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=d1)) D1.CreateFeature(feat) feat = ogr.Feature(D1.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=d2)) D1.CreateFeature(feat) D2 = ds.CreateLayer('D2') feat = ogr.Feature(D2.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=d1)) D2.CreateFeature(feat) feat = ogr.Feature(D2.GetLayerDefn()) feat.SetGeometryDirectly(ogr.Geometry(wkt=d2)) D2.CreateFeature(feat) empty = ds.CreateLayer('empty') def test_algebra_intersection(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Intersection; this should return two rectangles err = A.Intersection(B, C) assert err == 0, \ ('got non-zero result code ' + str(err) + ' from Layer.Intersection') C_defn = C.GetLayerDefn() assert C_defn.GetFieldCount() == 2 and C_defn.GetFieldDefn(0).GetName() == 'A' and C_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger and C_defn.GetFieldDefn(1).GetName() == 'B' and C_defn.GetFieldDefn(1).GetType() == ogr.OFTString, \ 'Did not get expected output schema.' assert C.GetFeatureCount() == 2, \ ('Layer.Intersection returned ' + str(C.GetFeatureCount()) + ' features') f1 = (ogr.Geometry(wkt='POLYGON ((2 3,3 3,3 2,2 2,2 3))'), 1, 'first') f2 = (ogr.Geometry(wkt='POLYGON ((5 2,5 3,6 3,6 2,5 2))'), 2, 'first') C.ResetReading() while 1: feat = C.GetNextFeature() if not feat: break g = feat.GetGeometryRef() if g.Equals(f1[0]): assert feat.GetField('A') == f1[1] and feat.GetField('B') == f1[2], \ 'Did not get expected field values.' elif g.Equals(f2[0]): assert feat.GetField('A') == f2[1] and feat.GetField('B') == f2[2], \ 'Did not get expected field values.' else: pytest.fail('Layer.Intersection returned wrong geometry: ' + g.ExportToWkt()) # This time we test with PROMOTE_TO_MULTI and pre-created output fields. recreate_layer_C() C.CreateField(ogr.FieldDefn("A", ogr.OFTInteger)) C.CreateField(ogr.FieldDefn("B", ogr.OFTString)) err = A.Intersection(B, C, options=['PROMOTE_TO_MULTI=YES']) assert err == 0, \ ('got non-zero result code ' + str(err) + ' from Layer.Intersection') assert C.GetFeatureCount() == 2, \ ('Layer.Intersection returned ' + str(C.GetFeatureCount()) + ' features') f1 = (ogr.Geometry(wkt='MULTIPOLYGON (((2 3,3 3,3 2,2 2,2 3)))'), 1, 'first') f2 = (ogr.Geometry(wkt='MULTIPOLYGON (((5 2,5 3,6 3,6 2,5 2)))'), 2, 'first') C.ResetReading() while 1: feat = C.GetNextFeature() if not feat: break g = feat.GetGeometryRef() if g.Equals(f1[0]): assert feat.GetField('A') == f1[1] and feat.GetField('B') == f1[2], \ 'Did not get expected field values. (1)' elif g.Equals(f2[0]): assert feat.GetField('A') == f2[1] and feat.GetField('B') == f2[2], \ 'Did not get expected field values. (2)' else: pytest.fail('Layer.Intersection returned wrong geometry: ' + g.ExportToWkt()) recreate_layer_C() # Intersection with self ; this should return 2 polygons err = D1.Intersection(D2, C, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) assert err == 0, \ ('got non-zero result code ' + str(err) + ' from Layer.Intersection') assert is_same(D1, C), 'D1 != C' def test_algebra_KEEP_LOWER_DIMENSION_GEOMETRIES(): if not ogrtest.have_geos(): pytest.skip() driver = ogr.GetDriverByName('MEMORY') ds = driver.CreateDataSource('ds') layer1 = ds.CreateLayer('layer1') layer2 = ds.CreateLayer('layer2') g1 = "POLYGON (( 140 360, 140 480, 220 480, 220 360, 140 360 ))" geom1 = ogr.CreateGeometryFromWkt(g1) feat1 = ogr.Feature(layer1.GetLayerDefn()) feat1.SetGeometry(geom1) layer1.CreateFeature(feat1) g2 = "POLYGON (( 220 260, 220 360, 300 360, 300 260, 220 260 ))" geom2 = ogr.CreateGeometryFromWkt(g2) feat2 = ogr.Feature(layer2.GetLayerDefn()) feat2.SetGeometry(geom2) layer2.CreateFeature(feat2) g1 = "LINESTRING (0 0, 1 0)" geom1 = ogr.CreateGeometryFromWkt(g1) feat1 = ogr.Feature(layer1.GetLayerDefn()) feat1.SetGeometry(geom1) layer1.CreateFeature(feat1) g2 = "LINESTRING (1 0, 2 0)" geom2 = ogr.CreateGeometryFromWkt(g2) feat2 = ogr.Feature(layer2.GetLayerDefn()) feat2.SetGeometry(geom2) layer2.CreateFeature(feat2) layer3 = ds.CreateLayer('layer3a') layer1.Intersection(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) assert layer3.GetFeatureCount() == 0, \ 'Lower dimension geometries not removed in intersection' layer3 = ds.CreateLayer('layer3b') layer1.Intersection(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=YES']) assert layer3.GetFeatureCount() == 2, \ 'Lower dimension geometries not kept in intersection' layer3 = ds.CreateLayer('layer3c') layer1.Union(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) assert layer3.GetFeatureCount() == 4, \ 'Lower dimension geometries not removed in union' layer3 = ds.CreateLayer('layer3d') layer1.Union(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=YES']) assert layer3.GetFeatureCount() == 6, 'Lower dimension geometries not kept in union' layer3 = ds.CreateLayer('layer3e') layer1.Identity(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) assert layer3.GetFeatureCount() == 2, \ 'Lower dimension geometries not removed in identity' layer3 = ds.CreateLayer('layer3f') layer1.Identity(layer2, layer3, ['KEEP_LOWER_DIMENSION_GEOMETRIES=YES']) assert layer3.GetFeatureCount() == 4, \ 'Lower dimension geometries not kept in identity' def test_algebra_union(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Union; this should return 5 polygons err = A.Union(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Union') assert C.GetFeatureCount() == 5, \ ('Layer.Union returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.Union(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Union') assert C.GetFeatureCount() == 5, \ ('Layer.Union returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Union with self ; this should return 2 polygons err = D1.Union(D2, C, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Union') assert is_same(D1, C), 'D1 != C' recreate_layer_C() # Union of a polygon and a point within : should return the point and the polygon (#4772) err = B.Union(pointInB, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Union') assert C.GetFeatureCount() == 2, \ ('Layer.Union returned ' + str(C.GetFeatureCount()) + ' features') def test_algebra_symdifference(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # SymDifference; this should return 3 polygons err = A.SymDifference(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.SymDifference') assert C.GetFeatureCount() == 3, \ ('Layer.SymDifference returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.SymDifference(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.SymDifference') assert C.GetFeatureCount() == 3, \ ('Layer.SymDifference returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # SymDifference with self ; this should return 0 features err = D1.SymDifference(D2, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.SymDifference') assert C.GetFeatureCount() == 0, \ ('Layer.SymDifference returned ' + str(C.GetFeatureCount()) + ' features') def test_algebra_identify(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Identity; this should return 4 polygons err = A.Identity(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Identity') assert C.GetFeatureCount() == 4, \ ('Layer.Identity returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.Identity(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Identity') assert C.GetFeatureCount() == 4, \ ('Layer.Identity returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Identity with self ; this should return 2 polygons err = D1.Identity(D2, C, ['KEEP_LOWER_DIMENSION_GEOMETRIES=NO']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Identity') assert is_same(D1, C), 'D1 != C' def test_algebra_update(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Update; this should return 3 polygons err = A.Update(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Update') assert C.GetFeatureCount() == 3, \ ('Layer.Update returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.Update(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Update') assert C.GetFeatureCount() == 3, \ ('Layer.Update returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Update with self ; this should return 2 polygons err = D1.Update(D2, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Update') assert is_same(D1, C), 'D1 != C' def test_algebra_clip(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Clip; this should return 2 polygons err = A.Clip(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Clip') assert C.GetFeatureCount() == 2, \ ('Layer.Clip returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.Clip(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Clip') assert C.GetFeatureCount() == 2, \ ('Layer.Clip returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Clip with self ; this should return 2 polygons err = D1.Update(D2, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Clip') assert is_same(D1, C), 'D1 != C' def test_algebra_erase(): if not ogrtest.have_geos(): pytest.skip() recreate_layer_C() # Erase; this should return 2 polygons err = A.Erase(B, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Erase') assert C.GetFeatureCount() == 2, \ ('Layer.Erase returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() err = A.Erase(B, C, options=['PROMOTE_TO_MULTI=YES']) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Erase') assert C.GetFeatureCount() == 2, \ ('Layer.Erase returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Erase with self ; this should return 0 features err = D1.Erase(D2, C) if ogrtest.have_geos(): assert err == 0, ('got non-zero result code ' + str(err) + ' from Layer.Erase') assert C.GetFeatureCount() == 0, \ ('Layer.Erase returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() # Erase with empty layer (or no intersection) A.Erase(empty, C) assert C.GetFeatureCount() == A.GetFeatureCount(), \ ('Layer.Erase returned ' + str(C.GetFeatureCount()) + ' features') A.ResetReading() feat_a = A.GetNextFeature() feat_c = C.GetNextFeature() if feat_a.Equal(feat_c) != 0: feat_a.DumpReadable() feat_c.DumpReadable() pytest.fail('features not identical') recreate_layer_C() A.Erase(empty, C, options=['PROMOTE_TO_MULTI=YES']) assert C.GetFeatureCount() == A.GetFeatureCount(), \ ('Layer.Erase returned ' + str(C.GetFeatureCount()) + ' features') recreate_layer_C() def test_algebra_cleanup(): if not ogrtest.have_geos(): pytest.skip() global ds, A, B, C, pointInB, D1, D2, empty D2 = None D1 = None pointInB = None C = None B = None A = None empty = None ds = None gdalautotest-3.0.4/ogr/ogr_mitab.py0000755003401500001440000025301413614005324016742 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_mitab.py dee990faf233452aded32fa90abd4d882ebaec3a 2019-12-18 14:06:11 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: MapInfo driver testing. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2012-2014, Even Rouault # # 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. ############################################################################### import os import random import sys import shutil import time import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import test_cli_utilities import pytest ############################################################################### # Create TAB file. def test_ogr_mitab_1(): gdaltest.mapinfo_drv = ogr.GetDriverByName('MapInfo File') gdaltest.mapinfo_ds = gdaltest.mapinfo_drv.CreateDataSource('tmp') if gdaltest.mapinfo_ds is not None: return pytest.fail() ############################################################################### # Create table from data/poly.shp def test_ogr_mitab_2(): if gdaltest.mapinfo_ds is None: pytest.skip() # This should convert to MapInfo datum name 'New_Zealand_GD49' WEIRD_SRS = 'PROJCS["NZGD49 / UTM zone 59S",GEOGCS["NZGD49",DATUM["NZGD49",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993],AUTHORITY["EPSG","6272"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4272"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",171],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27259"]]' gdaltest.mapinfo_srs = osr.SpatialReference() gdaltest.mapinfo_srs.ImportFromWkt(WEIRD_SRS) ####################################################### # Create memory Layer gdaltest.mapinfo_lyr = gdaltest.mapinfo_ds.CreateLayer('tpoly', gdaltest.mapinfo_srs) ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.mapinfo_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.mapinfo_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.mapinfo_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() ####################################################### # Close file. gdaltest.mapinfo_ds = None ############################################################################### # Verify that stuff we just wrote is still OK. # # Note that we allow a fairly significant error since projected # coordinates are not stored with much precision in Mapinfo format. def test_ogr_mitab_3(): if gdaltest.mapinfo_drv is None: pytest.skip() gdaltest.mapinfo_ds = ogr.Open('tmp') gdaltest.mapinfo_lyr = gdaltest.mapinfo_ds.GetLayer(0) expect = [168, 169, 166, 158, 165] gdaltest.mapinfo_lyr.SetAttributeFilter('EAS_ID < 170') tr = ogrtest.check_features_against_list(gdaltest.mapinfo_lyr, 'EAS_ID', expect) gdaltest.mapinfo_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.mapinfo_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.02) == 0), \ ('Geometry check fail. i=%d' % i) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None gdaltest.shp_ds = None assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_mitab_4(): if gdaltest.mapinfo_ds is None: pytest.skip() sql_lyr = gdaltest.mapinfo_ds.ExecuteSQL( "select * from tpoly where prfedea = '35043413'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['35043413']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((479750.688 4764702.000,479658.594 4764670.000,479640.094 4764721.000,479735.906 4764752.000,479750.688 4764702.000))', max_error=0.02) != 0: tr = 0 gdaltest.mapinfo_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_mitab_5(): if gdaltest.mapinfo_ds is None: pytest.skip() gdaltest.mapinfo_lyr.SetAttributeFilter(None) gdaltest.mapinfo_lyr.SetSpatialFilterRect(479505, 4763195, 480526, 4762819) tr = ogrtest.check_features_against_list(gdaltest.mapinfo_lyr, 'eas_id', [158]) gdaltest.mapinfo_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Verify that Non-WGS84 datums are populated correctly def test_ogr_mitab_6(): if gdaltest.mapinfo_drv is None: pytest.skip() srs = gdaltest.mapinfo_lyr.GetSpatialRef() datum_name = srs.GetAttrValue('PROJCS|GEOGCS|DATUM') assert datum_name == "New_Zealand_GD49", \ ("Datum name does not match (expected 'New_Zealand_GD49', got '%s')" % datum_name) ############################################################################### # Create MIF file. def test_ogr_mitab_7(): gdaltest.mapinfo_ds = None gdaltest.mapinfo_drv.DeleteDataSource('tmp') gdaltest.mapinfo_ds = gdaltest.mapinfo_drv.CreateDataSource('tmp/wrk.mif') if gdaltest.mapinfo_ds is not None: return pytest.fail() ############################################################################### # Create table from data/poly.shp def test_ogr_mitab_8(): if gdaltest.mapinfo_ds is None: pytest.skip() ####################################################### # Create memory Layer gdaltest.mapinfo_lyr = gdaltest.mapinfo_ds.CreateLayer('tpoly') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.mapinfo_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.mapinfo_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.mapinfo_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() ####################################################### # Close file. gdaltest.mapinfo_ds = None ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_mitab_9(): if gdaltest.mapinfo_drv is None: pytest.skip() gdaltest.mapinfo_ds = ogr.Open('tmp') gdaltest.mapinfo_lyr = gdaltest.mapinfo_ds.GetLayer(0) expect = [168, 169, 166, 158, 165] gdaltest.mapinfo_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.mapinfo_lyr, 'eas_id', expect) gdaltest.mapinfo_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.mapinfo_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None gdaltest.shp_ds = None assert tr ############################################################################### # Read mif file with 2 character .mid delimiter and verify operation. def test_ogr_mitab_10(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.Open('data/small.mif') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.NAME == " S. 11th St.", 'name attribute wrong.' assert feat.FLOODZONE == 10, 'FLOODZONE attribute wrong.' assert (ogrtest.check_feature_geometry(feat, 'POLYGON ((407131.721 155322.441,407134.468 155329.616,407142.741 155327.242,407141.503 155322.467,407140.875 155320.049,407131.721 155322.441))', max_error=0.000000001) == 0) feat = lyr.GetNextFeature() assert feat.OWNER == 'Guarino "Chucky" Sandra', 'owner attribute wrong.' lyr = None ds = None ############################################################################### # Verify support for NTF datum with non-greenwich datum per # http://trac.osgeo.org/gdal/ticket/1416 # # This test also exercises SRS reference counting as described in issue: # http://trac.osgeo.org/gdal/ticket/1680 def test_ogr_mitab_11(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.Open('data/small_ntf.mif') srs = ds.GetLayer(0).GetSpatialRef() ds = None pm_value = srs.GetAttrValue('PROJCS|GEOGCS|PRIMEM', 1) assert pm_value[:6] == '2.3372', \ ('got unexpected prime meridian, not paris: ' + pm_value) ############################################################################### # Verify that a newly created mif layer returns a non null layer definition def test_ogr_mitab_12(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = gdaltest.mapinfo_drv.CreateDataSource('tmp', options=['FORMAT=MIF']) lyr = ds.CreateLayer('testlyrdef') defn = lyr.GetLayerDefn() assert defn is not None ogrtest.quick_create_layer_def(lyr, [('AREA', ogr.OFTReal)]) ds = None ############################################################################### # Verify that field widths and precisions are propagated correctly in TAB. def test_ogr_mitab_13(): if gdaltest.mapinfo_drv is None: pytest.skip() import ogr_gml_read ogr_gml_read.test_ogr_gml_1() if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/testlyrdef.tab') ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testlyrdef.tab') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f "MapInfo File" tmp/testlyrdef.tab ../ogr/data/testlyrdef.gml') ds = ogr.Open('tmp/testlyrdef.tab') # Check if the width and precision are as preserved. lyr = ds.GetLayer('testlyrdef') assert lyr is not None, 'Layer missing.' defn = lyr.GetLayerDefn() data = [['AREA', ogr.OFTReal, 7, 4], ['VOLUME', ogr.OFTReal, 0, 0], ['LENGTH', ogr.OFTInteger, 10, 0], ['WIDTH', ogr.OFTInteger, 4, 0]] for field in data: fld = defn.GetFieldDefn(defn.GetFieldIndex(field[0])) assert fld.GetType() == field[1] and fld.GetWidth() == field[2] and fld.GetPrecision() == field[3], \ (field[0] + ' field definition wrong.') ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testlyrdef.tab') ############################################################################### # Verify that field widths and precisions are propagated correctly in MIF. def test_ogr_mitab_14(): if gdaltest.mapinfo_drv is None: pytest.skip() import ogr_gml_read ogr_gml_read.test_ogr_gml_1() if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/testlyrdef.mif') ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testlyrdef.mif') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f "MapInfo File" -dsco FORMAT=MIF tmp/testlyrdef.mif ../ogr/data/testlyrdef.gml') ds = ogr.Open('tmp/testlyrdef.mif') # Check if the width and precision are as preserved. lyr = ds.GetLayer('testlyrdef') assert lyr is not None, 'Layer missing.' defn = lyr.GetLayerDefn() data = [['AREA', ogr.OFTReal, 7, 4], ['VOLUME', ogr.OFTReal, 0, 0], ['LENGTH', ogr.OFTInteger, 254, 0], ['WIDTH', ogr.OFTInteger, 254, 0]] for field in data: fld = defn.GetFieldDefn(defn.GetFieldIndex(field[0])) expected_with = field[2] if fld.GetType() == ogr.OFTInteger: expected_with = 0 assert fld.GetType() == field[1] and fld.GetWidth() == expected_with and fld.GetPrecision() == field[3], \ (field[0] + ' field definition wrong.') ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/testlyrdef.mif') ############################################################################### # Test .mif without .mid (#5141) def test_ogr_mitab_15(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.Open('data/nomid.mif') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ds = None # Test opening .mif without .mid even if there are declared attributes ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/nomid.mif') lyr = ds.CreateLayer('empty') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(f) ds = None gdal.Unlink('/vsimem/nomid.mid') ds = ogr.Open('/vsimem/nomid.mif') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.IsFieldSet(0) or f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() gdal.Unlink('/vsimem/nomid.mif') ############################################################################### # Test empty .mif def test_ogr_mitab_16(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('tmp/empty.mif') lyr = ds.CreateLayer('empty') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) ds = None ds = ogr.Open('tmp/empty.mif') assert ds is not None ds = None ############################################################################### # Run test_ogrsf def test_ogr_mitab_17(): if gdaltest.mapinfo_drv is None: pytest.skip() import ogr_gml_read ogr_gml_read.test_ogr_gml_1() if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/wrk.mif') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test EPSG:2154 # (https://github.com/mapgears/mitab/issues/1) def test_ogr_mitab_18(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/ogr_mitab_18.tab') sr = osr.SpatialReference() sr.ImportFromEPSG(2154) lyr = ds.CreateLayer('test', srs=sr) lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) ds = None # Test with our generated file, and with one generated by MapInfo for filename in ['/vsimem/ogr_mitab_18.tab', 'data/lambert93_francais.TAB']: ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) sr_got = lyr.GetSpatialRef() wkt = sr_got.ExportToWkt() if '2154' not in wkt: print(filename) pytest.fail(sr_got) proj4 = sr_got.ExportToProj4() assert proj4.startswith('+proj=lcc +lat_0=46.5 +lon_0=3 +lat_1=49 +lat_2=44 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs') ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('/vsimem/ogr_mitab_18.tab') ############################################################################### # Check that we correctly round coordinate to the appropriate precision # (https://github.com/mapgears/mitab/issues/2) def test_ogr_mitab_19(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.Open('data/utm31.TAB') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() # Strict text comparison to check precision if feat.GetGeometryRef().ExportToWkt() != 'POINT (485248.12 2261.45)': feat.DumpReadable() pytest.fail() ############################################################################### # Check that we take into account the user defined bound file # (https://github.com/mapgears/mitab/issues/3) # Also test BOUNDS layer creation option (http://trac.osgeo.org/gdal/ticket/5642) def test_ogr_mitab_20(): if gdaltest.mapinfo_drv is None: pytest.skip() # Pass i==0: without MITAB_BOUNDS_FILE # Pass i==1: with MITAB_BOUNDS_FILE and French bounds : first load # Pass i==2: with MITAB_BOUNDS_FILE and French bounds : should use already loaded file # Pass i==3: without MITAB_BOUNDS_FILE : should unload the file # Pass i==4: use BOUNDS layer creation option # Pass i==5: with MITAB_BOUNDS_FILE and European bounds # Pass i==6: with MITAB_BOUNDS_FILE and generic EPSG:2154 (Europe bounds expected) for fmt in ['tab', 'mif']: for i in range(7): if i == 1 or i == 2 or i == 5 or i == 6: gdal.SetConfigOption('MITAB_BOUNDS_FILE', 'data/mitab_bounds.txt') ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/ogr_mitab_20.' + fmt) sr = osr.SpatialReference() if i == 1 or i == 2: # French bounds sr.SetFromUserInput("""PROJCS["RGF93 / Lambert-93", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 80",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",49.00000000002], PARAMETER["standard_parallel_2",44], PARAMETER["latitude_of_origin",46.5], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["Meter",1.0], AUTHORITY["EPSG","2154"]]""") elif i == 5: # European bounds sr.SetFromUserInput("""PROJCS["RGF93 / Lambert-93", GEOGCS["RGF93", DATUM["Reseau_Geodesique_Francais_1993", SPHEROID["GRS 80",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",49.00000000001], PARAMETER["standard_parallel_2",44], PARAMETER["latitude_of_origin",46.5], PARAMETER["central_meridian",3], PARAMETER["false_easting",700000], PARAMETER["false_northing",6600000], UNIT["Meter",1.0], AUTHORITY["EPSG","2154"]]""") else: sr.ImportFromEPSG(2154) if i == 4: lyr = ds.CreateLayer('test', srs=sr, options=['BOUNDS=75000,6000000,1275000,7200000']) else: lyr = ds.CreateLayer('test', srs=sr) lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (700000.001 6600000.001)")) lyr.CreateFeature(feat) ds = None gdal.SetConfigOption('MITAB_BOUNDS_FILE', None) ds = ogr.Open('/vsimem/ogr_mitab_20.' + fmt) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert not (i == 6 and lyr.GetSpatialRef().ExportToWkt().find('49.00000000001') < 0), \ fmt # Strict text comparison to check precision if fmt == 'tab': if i == 1 or i == 2 or i == 4: if feat.GetGeometryRef().ExportToWkt() != 'POINT (700000.001 6600000.001)': print(i) feat.DumpReadable() pytest.fail(fmt) else: if feat.GetGeometryRef().ExportToWkt() == 'POINT (700000.001 6600000.001)': print(i) feat.DumpReadable() pytest.fail(fmt) ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('/vsimem/ogr_mitab_20.' + fmt) gdal.SetConfigOption('MITAB_BOUNDS_FILE', 'tmp/mitab_bounds.txt') for i in range(2): if i == 1 and not sys.platform.startswith('linux'): time.sleep(1) f = open('tmp/mitab_bounds.txt', 'wb') if i == 0: f.write( """Source = CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49, 700000, 6600000 Destination=CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029)""".encode('ascii')) else: f.write( """Source = CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49, 700000, 6600000 Destination=CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000002, 700000, 6600000 Bounds (75000, 6000000) (1275000, 7200000)""".encode('ascii')) f.close() if i == 1 and sys.platform.startswith('linux'): os.system('touch -d "1 minute ago" tmp/mitab_bounds.txt') ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/ogr_mitab_20.tab') sr = osr.SpatialReference() sr.ImportFromEPSG(2154) lyr = ds.CreateLayer('test', srs=sr) lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (700000.001 6600000.001)")) lyr.CreateFeature(feat) ds = None ds = ogr.Open('/vsimem/ogr_mitab_20.tab') lyr = ds.GetLayer(0) if i == 0: expected = '49.00000000001' else: expected = '49.00000000002' if lyr.GetSpatialRef().ExportToWkt().find(expected) < 0: print(i) gdal.SetConfigOption('MITAB_BOUNDS_FILE', None) os.unlink('tmp/mitab_bounds.txt') pytest.fail(lyr.GetSpatialRef().ExportToWkt()) ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('/vsimem/ogr_mitab_20.tab') gdal.SetConfigOption('MITAB_BOUNDS_FILE', None) os.unlink('tmp/mitab_bounds.txt') ############################################################################### # Create .tab without explicit field def test_ogr_mitab_21(): if gdaltest.mapinfo_drv is None: pytest.skip() ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/ogr_mitab_21.tab') lyr = ds.CreateLayer('test') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateFeature(feat) gdal.PopErrorHandler() ds = None ds = ogr.Open('/vsimem/ogr_mitab_21.tab') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('FID') != 1: feat.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('/vsimem/ogr_mitab_21.tab') ############################################################################### # Test append in update mode def test_ogr_mitab_22(): filename = '/vsimem/ogr_mitab_22.tab' for nb_features in (2, 1000): if nb_features == 2: nb_runs = 2 else: nb_runs = 1 # When doing 2 runs, in the second one, we create an empty # .tab and then open it for update. This can trigger specific bugs for j in range(nb_runs): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) if j == 0: i = 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (%d %d)" % (i, i))) if lyr.CreateFeature(feat) != 0: print(i) pytest.fail(nb_features) ds = None for i in range(nb_features - (1 - j)): ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1 + (1 - j)) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (%d %d)" % (i + (1 - j), i + (1 - j)))) if lyr.CreateFeature(feat) != 0: print(i) pytest.fail(nb_features) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) for i in range(nb_features): f = lyr.GetNextFeature() assert f is not None and f.GetField('ID') == i + 1, nb_features ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test creating features then reading def test_ogr_mitab_23(): filename = '/vsimem/ogr_mitab_23.tab' for nb_features in (0, 1, 2, 100, 1000): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) for i in range(nb_features): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(feat) lyr.ResetReading() for i in range(nb_features): f = lyr.GetNextFeature() assert f is not None and f.GetField('ID') == i + 1, nb_features f = lyr.GetNextFeature() assert f is None ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test creating features then reading then creating again then reading def test_ogr_mitab_24(): filename = '/vsimem/ogr_mitab_24.tab' for nb_features in (2, 100, 1000): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) for i in range(int(nb_features / 2)): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(feat) lyr.ResetReading() for i in range(int(nb_features / 2)): f = lyr.GetNextFeature() assert f is not None and f.GetField('ID') == i + 1, nb_features f = lyr.GetNextFeature() assert f is None for i in range(int(nb_features / 2)): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', nb_features / 2 + i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (0 0)")) lyr.CreateFeature(feat) lyr.ResetReading() for i in range(nb_features): f = lyr.GetNextFeature() assert f is not None and f.GetField('ID') == i + 1, nb_features f = lyr.GetNextFeature() assert f is None ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test that opening in update mode without doing any change does not alter # file def test_ogr_mitab_25(): filename = 'tmp/ogr_mitab_25.tab' for nb_features in (2, 1000): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) for i in range(int(nb_features / 2)): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (%d %d)" % (i, i))) lyr.CreateFeature(feat) ds = None if sys.platform.startswith('linux'): for ext in ('map', 'tab', 'dat', 'id'): os.system('touch -d "1 minute ago" %s' % filename[0:-3] + ext) mtime_dict = {} for ext in ('map', 'tab', 'dat', 'id'): mtime_dict[ext] = os.stat(filename[0:-3] + ext).st_mtime if not sys.platform.startswith('linux'): time.sleep(1) # Try without doing anything ds = ogr.Open(filename, update=1) ds = None for ext in ('map', 'tab', 'dat', 'id'): mtime = os.stat(filename[0:-3] + ext).st_mtime assert mtime_dict[ext] == mtime, ('mtime of .%s has changed !' % ext) # Try by reading all features ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) lyr.GetFeatureCount(1) ds = None for ext in ('map', 'tab', 'dat', 'id'): mtime = os.stat(filename[0:-3] + ext).st_mtime assert mtime_dict[ext] == mtime, ('mtime of .%s has changed !' % ext) # Try by reading all features with a spatial index ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) lyr.SetSpatialFilterRect(0.5, 0.5, 1.5, 1.5) lyr.GetFeatureCount(1) ds = None for ext in ('map', 'tab', 'dat', 'id'): mtime = os.stat(filename[0:-3] + ext).st_mtime assert mtime_dict[ext] == mtime, ('mtime of .%s has changed !' % ext) if test_cli_utilities.get_test_ogrsf_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro -fsf ' + filename) assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test DeleteFeature() def test_ogr_mitab_26(): filename = '/vsimem/ogr_mitab_26.tab' for nb_features in (2, 1000): if nb_features == 2: nb_runs = 2 else: nb_runs = 1 for j in range(nb_runs): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) for i in range(nb_features): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', i + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (%d %d)" % (i, i))) lyr.CreateFeature(feat) if nb_features == 2: assert lyr.DeleteFeature(int(nb_features / 2)) == 0, j else: for k in range(int(nb_features / 2)): assert lyr.DeleteFeature(int(nb_features / 4) + k) == 0, j if j == 1: # Expected failure : already deleted feature ret = lyr.DeleteFeature(int(nb_features / 2)) if ret != ogr.OGRERR_NON_EXISTING_FEATURE: print(j) pytest.fail(nb_features) feat = lyr.GetFeature(int(nb_features / 2)) if feat is not None: print(j) pytest.fail(nb_features) # Expected failure : illegal feature id ret = lyr.DeleteFeature(nb_features + 1) if ret != ogr.OGRERR_NON_EXISTING_FEATURE: print(j) pytest.fail(nb_features) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == nb_features / 2 ds = None # This used to trigger a bug in DAT record deletion during implementation... if nb_features == 1000: ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) lyr.DeleteFeature(245) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == nb_features / 2 - 1 ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test SetFeature() def test_ogr_mitab_27(): filename = '/vsimem/ogr_mitab_27.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('stringfield', ogr.OFTString)) # Invalid call : feature without FID f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 # Invalid call : feature with FID <= 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(0) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('intfield', 1) f.SetField('realfield', 2.34) f.SetField('stringfield', "foo") f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) lyr.CreateFeature(f) fid = f.GetFID() # Invalid call : feature with FID > feature_count f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(2) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 # Update previously created object with blank feature f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) lyr.SetFeature(f) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField('intfield') != 0 or f.GetField('realfield') != 0 or f.GetField('stringfield') != '' or \ f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() f.SetField('intfield', 1) f.SetField('realfield', 2.34) f.SetField('stringfield', "foo") f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (2 3)')) lyr.SetFeature(f) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField('intfield') != 1 or f.GetField('realfield') != 2.34 or f.GetField('stringfield') != 'foo' or \ f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() lyr.DeleteFeature(f.GetFID()) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) # SetFeature() on a deleted feature lyr.SetFeature(f) f = lyr.GetFeature(1) if f.GetField('intfield') != 1 or f.GetField('realfield') != 2.34 or f.GetField('stringfield') != 'foo' or \ f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(1) # SetFeature() with identical feature : no-op assert lyr.SetFeature(f) == 0 ds = None stat = gdal.VSIStatL(filename[0:-3] + "map") old_size = stat.size # This used to trigger a bug: when using SetFeature() repeatedly, we # can create object blocks in the .map that are made only of deleted # objects. ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(1) for _ in range(100): f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (2 3)')) assert lyr.SetFeature(f) == 0 ds = None stat = gdal.VSIStatL(filename[0:-3] + "map") assert stat.size == old_size ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(1) # SetFeature() with identical geometry : rewrite only attributes f.SetField('intfield', -1) assert lyr.SetFeature(f) == 0 f = lyr.GetFeature(1) if f.GetField('intfield') != -1 or f.GetField('realfield') != 2.34 or f.GetField('stringfield') != 'foo' or \ f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### def generate_permutation(n): tab = [i for i in range(n)] for _ in range(10 * n): ind = random.randint(0, n - 1) tmp = tab[0] tab[0] = tab[ind] tab[ind] = tmp return tab ############################################################################### # Test updating object blocks with deleted objects def test_ogr_mitab_28(): filename = '/vsimem/ogr_mitab_28.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) # Generate 10x10 grid N2 = 10 N = N2 * N2 for n in generate_permutation(N): x = int(n / N2) y = n % N2 f = ogr.Feature(lyr.GetLayerDefn()) # f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%d %d)' % (x,y))) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(%d %d,%f %f,%f %f)' % (x, y, x + 0.1, y, x + 0.2, y))) lyr.CreateFeature(f) # Delete all features for i in range(N): lyr.DeleteFeature(i + 1) # Set deleted features i = 0 permutation = generate_permutation(N) for n in permutation: x = int(n / N2) y = n % N2 f = ogr.Feature(lyr.GetLayerDefn()) # f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%d %d)' % (x,y))) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(%d %d,%f %f,%f %f)' % (x, y, x + 0.1, y, x + 0.2, y))) f.SetFID(i + 1) i = i + 1 lyr.SetFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) i = 0 # Check sequential enumeration for f in lyr: g = f.GetGeometryRef() (x, y, _) = g.GetPoint(0) n = permutation[i] x_ref = int(n / N2) y_ref = n % N2 assert abs(x - x_ref) + abs(y - y_ref) <= 0.1 i = i + 1 # Check spatial index integrity for n in range(N): x = int(n / N2) y = n % N2 lyr.SetSpatialFilterRect(x - 0.5, y - 0.5, x + 0.5, y + 0.5) assert lyr.GetFeatureCount() == 1 ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test updating a file with compressed geometries. def test_ogr_mitab_29(): try: os.stat('tmp/cache/compr_symb_deleted_records.tab') except OSError: try: gdaltest.unzip('tmp/cache', 'data/compr_symb_deleted_records.zip') try: os.stat('tmp/cache/compr_symb_deleted_records.tab') except OSError: pytest.skip() except OSError: pytest.skip() shutil.copy('tmp/cache/compr_symb_deleted_records.tab', 'tmp') shutil.copy('tmp/cache/compr_symb_deleted_records.dat', 'tmp') shutil.copy('tmp/cache/compr_symb_deleted_records.id', 'tmp') shutil.copy('tmp/cache/compr_symb_deleted_records.map', 'tmp') # Is a 100x100 point grid with only the 4 edge lines left (compressed points) ds = ogr.Open('tmp/compr_symb_deleted_records.tab', update=1) lyr = ds.GetLayer(0) # Re-add the 98x98 interior points N2 = 98 N = N2 * N2 permutation = generate_permutation(N) for n in permutation: x = 1 + int(n / N2) y = 1 + n % N2 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%d %d)' % (x, y))) lyr.CreateFeature(f) ds = None # Check grid integrity that after reopening ds = ogr.Open('tmp/compr_symb_deleted_records.tab') lyr = ds.GetLayer(0) N2 = 100 N = N2 * N2 for n in range(N): x = int(n / N2) y = n % N2 lyr.SetSpatialFilterRect(x - 0.01, y - 0.01, x + 0.01, y + 0.01) if lyr.GetFeatureCount() != 1: print(n) pytest.fail(x - 0.01, y - 0.01, x + 0.01, y + 0.01) ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/compr_symb_deleted_records.tab') ############################################################################### # Test SyncToDisk() in create mode def test_ogr_mitab_30(update=0): filename = 'tmp/ogr_mitab_30.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test', options=['BOUNDS=0,0,100,100']) lyr.CreateField(ogr.FieldDefn('ID', ogr.OFTInteger)) assert lyr.SyncToDisk() == 0 ds2 = ogr.Open(filename) lyr2 = ds2.GetLayer(0) assert lyr2.GetFeatureCount() == 0 and lyr2.GetLayerDefn().GetFieldCount() == 1 ds2 = None # Check that the files are not updated in between if sys.platform.startswith('linux'): for ext in ('map', 'tab', 'dat', 'id'): os.system('touch -d "1 minute ago" %s' % filename[0:-3] + ext) stat = {} for ext in ('map', 'tab', 'dat', 'id'): stat[ext] = gdal.VSIStatL(filename[0:-3] + ext) if not sys.platform.startswith('linux'): time.sleep(1) assert lyr.SyncToDisk() == 0 for ext in ('map', 'tab', 'dat', 'id'): stat2 = gdal.VSIStatL(filename[0:-3] + ext) assert stat[ext].size == stat2.size and stat[ext].mtime == stat2.mtime if update == 1: ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) for j in range(100): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('ID', j + 1) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (%d %d)' % (j, j))) lyr.CreateFeature(feat) feat = None if not (j <= 10 or (j % 5) == 0): continue for i in range(2): ret = lyr.SyncToDisk() assert ret == 0 if i == 0: for ext in ('map', 'tab', 'dat', 'id'): stat[ext] = gdal.VSIStatL(filename[0:-3] + ext) else: for ext in ('map', 'tab', 'dat', 'id'): stat2 = gdal.VSIStatL(filename[0:-3] + ext) if stat[ext].size != stat2.size: print(j) pytest.fail(i) ds2 = ogr.Open(filename) lyr2 = ds2.GetLayer(0) assert lyr2.GetFeatureCount() == j + 1, i feat2 = lyr2.GetFeature(j + 1) if feat2.GetField('ID') != j + 1 or feat2.GetGeometryRef().ExportToWkt() != 'POINT (%d %d)' % (j, j): print(i) feat2.DumpReadable() pytest.fail(j) lyr2.ResetReading() for _ in range(j + 1): feat2 = lyr2.GetNextFeature() if feat2.GetField('ID') != j + 1 or feat2.GetGeometryRef().ExportToWkt() != 'POINT (%d %d)' % (j, j): print(i) feat2.DumpReadable() pytest.fail(j) ds2 = None ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test SyncToDisk() in update mode def test_ogr_mitab_31(): return test_ogr_mitab_30(update=1) ############################################################################### # Check read support of non-spatial .tab/.data without .map or .id (#5718) # We only check read-only behaviour though. def test_ogr_mitab_32(): for update in (0, 1): ds = ogr.Open('data/aspatial-table.tab', update=update) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2, update f = lyr.GetNextFeature() assert f.GetField('a') == 1 and f.GetField('b') == 2 and f.GetField('d') == 'hello', \ update f = lyr.GetFeature(2) assert f.GetField('a') == 4, update ds = None ############################################################################### # Test opening and modifying a file created with MapInfo that consists of # a single object block, without index block def test_ogr_mitab_33(): for update in (0, 1): ds = ogr.Open('data/single_point_mapinfo.tab', update=update) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1, update f = lyr.GetNextFeature() assert f.GetField('toto') == '', update ds = None # Test adding a new object shutil.copy('data/single_point_mapinfo.tab', 'tmp') shutil.copy('data/single_point_mapinfo.dat', 'tmp') shutil.copy('data/single_point_mapinfo.id', 'tmp') shutil.copy('data/single_point_mapinfo.map', 'tmp') ds = ogr.Open('tmp/single_point_mapinfo.tab', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1363180 7509810)')) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('tmp/single_point_mapinfo.tab') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 f = lyr.GetNextFeature() assert f is not None f = lyr.GetNextFeature() assert f is not None ds = None # Test replacing the existing object shutil.copy('data/single_point_mapinfo.tab', 'tmp') shutil.copy('data/single_point_mapinfo.dat', 'tmp') shutil.copy('data/single_point_mapinfo.id', 'tmp') shutil.copy('data/single_point_mapinfo.map', 'tmp') ds = ogr.Open('tmp/single_point_mapinfo.tab', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1363180 7509810)')) lyr.SetFeature(f) f = None ds = None ds = ogr.Open('tmp/single_point_mapinfo.tab') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 f = lyr.GetNextFeature() assert f is not None ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/single_point_mapinfo.tab') ############################################################################### # Test updating a line that spans over several coordinate blocks def test_ogr_mitab_34(): filename = '/vsimem/ogr_mitab_34.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_mitab_34', options=['BOUNDS=-1000,0,1000,3000']) lyr.CreateField(ogr.FieldDefn('dummy', ogr.OFTString)) geom = ogr.Geometry(ogr.wkbLineString) for i in range(1000): geom.AddPoint_2D(i, i) for _ in range(2): f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(geom) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() lyr.GetNextFeature() # seek to another object geom = f.GetGeometryRef() geom.SetPoint_2D(0, -1000, 3000) lyr.SetFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() geom = f.GetGeometryRef() assert abs(geom.GetX(0) - -1000) <= 1e-2 and abs(geom.GetY(0) - 3000) <= 1e-2 for i in range(999): assert abs(geom.GetX(i + 1) - (i + 1)) <= 1e-2 and abs(geom.GetY(i + 1) - (i + 1)) <= 1e-2 f = lyr.GetNextFeature() geom = f.GetGeometryRef() for i in range(1000): assert abs(geom.GetX(i) - (i)) <= 1e-2 and abs(geom.GetY(i) - (i)) <= 1e-2 ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test SRS support def get_srs_from_coordsys(coordsys): mif_filename = '/vsimem/foo.mif' f = gdal.VSIFOpenL(mif_filename, "wb") content = """Version 300 Charset "Neutral" Delimiter "," %s Columns 1 foo Char(254) Data NONE """ % coordsys content = content.encode('ascii') gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL(mif_filename[0:-3] + "mid", "wb") content = '""\n' content = content.encode('ascii') gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) ds = ogr.Open(mif_filename) srs = ds.GetLayer(0).GetSpatialRef() if srs is not None: srs = srs.Clone() gdal.Unlink(mif_filename) gdal.Unlink(mif_filename[0:-3] + "mid") return srs def get_coordsys_from_srs(srs): mif_filename = '/vsimem/foo.mif' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(mif_filename) lyr = ds.CreateLayer('foo', srs=srs) lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL(mif_filename, "rb") data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink(mif_filename) gdal.Unlink(mif_filename[0:-3] + "mid") data = data[data.find('CoordSys'):] data = data[0:data.find('\n')] return data def test_ogr_mitab_35(): # Local/non-earth srs = osr.SpatialReference() coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys NonEarth Units "m"' srs = osr.SpatialReference('LOCAL_CS["foo"]') coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys NonEarth Units "m"' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'LOCAL_CS["Nonearth",UNIT["Meter",1]]' # Test units for mif_unit in ['mi', 'km', 'in', 'ft', 'yd', 'mm', 'cm', 'm', 'survey ft', 'nmi', 'li', 'ch', 'rd']: coordsys = 'CoordSys NonEarth Units "%s"' % mif_unit srs = get_srs_from_coordsys(coordsys) # print(srs) got_coordsys = get_coordsys_from_srs(srs) assert coordsys == got_coordsys, srs # Geographic srs = osr.SpatialReference() srs.ImportFromEPSG(4326) coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 104' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'GEOGCS["unnamed",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 104' # Projected srs = osr.SpatialReference() srs.ImportFromEPSG(32631) coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 8, 104, "m", 3, 0, 0.9996, 500000, 0' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'PROJCS["unnamed",GEOGCS["unnamed",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],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]]' coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 8, 104, "m", 3, 0, 0.9996, 500000, 0' # Test round-tripping of projection methods for coordsys in ['CoordSys Earth Projection 1, 104', 'CoordSys Earth Projection 2, 104, "m", 1, 2', 'CoordSys Earth Projection 3, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 4, 104, "m", 1, 90, 90', 'CoordSys Earth Projection 5, 104, "m", 1, 90, 90', 'CoordSys Earth Projection 6, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 7, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 8, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 9, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 10, 104, "m", 1', 'CoordSys Earth Projection 11, 104, "m", 1', 'CoordSys Earth Projection 12, 104, "m", 1', 'CoordSys Earth Projection 13, 104, "m", 1', 'CoordSys Earth Projection 14, 104, "m", 1', 'CoordSys Earth Projection 15, 104, "m", 1', 'CoordSys Earth Projection 16, 104, "m", 1', 'CoordSys Earth Projection 17, 104, "m", 1', 'CoordSys Earth Projection 18, 104, "m", 1, 2, 3, 4', 'CoordSys Earth Projection 19, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 20, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 21, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 22, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 23, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 24, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 25, 104, "m", 1, 2, 3, 4', 'CoordSys Earth Projection 26, 104, "m", 1, 2', 'CoordSys Earth Projection 27, 104, "m", 1, 2, 3, 4', 'CoordSys Earth Projection 28, 104, "m", 1, 2, 90', # 'CoordSys Earth Projection 29, 104, "m", 1, 90, 90', # alias of 4 'CoordSys Earth Projection 30, 104, "m", 1, 2, 3, 4', 'CoordSys Earth Projection 31, 104, "m", 1, 2, 3, 4, 5', 'CoordSys Earth Projection 32, 104, "m", 1, 2, 3, 4, 5, 6', 'CoordSys Earth Projection 33, 104, "m", 1, 2, 3, 4', ]: srs = get_srs_from_coordsys(coordsys) # print(srs) got_coordsys = get_coordsys_from_srs(srs) # if got_coordsys.find(' Bounds') >= 0: # got_coordsys = got_coordsys[0:got_coordsys.find(' Bounds')] assert coordsys == got_coordsys, srs # Test TOWGS84 srs = osr.SpatialReference() srs.ImportFromEPSG(4322) coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 103' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'GEOGCS["unnamed",DATUM["WGS_1972",SPHEROID["WGS 72",6378135,298.26]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 103' # Test Lambert 93 srs = osr.SpatialReference() srs.ImportFromEPSG(2154) coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49, 700000, 6600000' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'PROJCS["RGF93 / Lambert-93",GEOGCS["RGF93",DATUM["Reseau_Geodesique_Francais_1993",SPHEROID["GRS 80",6378137,298.257222101],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","2154"]]' coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49, 700000, 6600000' srs = osr.SpatialReference('PROJCS["RGF93 / Lambert-93",GEOGCS["RGF93",DATUM["Reseau_Geodesique_Francais_1993",SPHEROID["GRS 80",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",49.00000000002],PARAMETER["standard_parallel_2",44],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["Meter",1.0],AUTHORITY["EPSG","2154"]]') coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000002, 700000, 6600000' gdal.SetConfigOption('MITAB_BOUNDS_FILE', 'data/mitab_bounds.txt') coordsys = get_coordsys_from_srs(srs) gdal.SetConfigOption('MITAB_BOUNDS_FILE', None) assert coordsys == 'CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000002, 700000, 6600000 Bounds (75000, 6000000) (1275000, 7200000)' # http://trac.osgeo.org/gdal/ticket/4115 srs = get_srs_from_coordsys('CoordSys Earth Projection 10, 157, "m", 0') wkt = srs.ExportToWkt() assert wkt == 'PROJCS["WGS 84 / Pseudo-Mercator",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["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],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"]]' # We don't round-trip currently # MIF 999 srs = osr.SpatialReference("""GEOGCS["unnamed", DATUM["MIF 999,1,1,2,3", SPHEROID["WGS 72",6378135,298.26]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""") coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 999, 1, 1, 2, 3' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'GEOGCS["unnamed",DATUM["MIF 999,1,1,2,3",SPHEROID["WGS 72",6378135,298.26],TOWGS84[1,2,3,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' # MIF 9999 srs = osr.SpatialReference("""GEOGCS["unnamed", DATUM["MIF 9999,1,1,2,3,4,5,6,7,3", SPHEROID["WGS 72",6378135,298.26]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]]""") coordsys = get_coordsys_from_srs(srs) assert coordsys == 'CoordSys Earth Projection 1, 9999, 1, 1, 2, 3, 4, 5, 6, 7, 3' srs = get_srs_from_coordsys(coordsys) wkt = srs.ExportToWkt() assert wkt == 'GEOGCS["unnamed",DATUM["MIF 9999,1,1,2,3,4,5,6,7,3",SPHEROID["WGS 72",6378135,298.26],TOWGS84[1,2,3,-4,-5,-6,7]],PRIMEM["non-Greenwich",3],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]' ############################################################################### # Test opening and modifying a file with polygons created with MapInfo that consists of # a single object block, without index block def test_ogr_mitab_36(): # Test modifying a new object shutil.copy('data/polygon_without_index.tab', 'tmp') shutil.copy('data/polygon_without_index.dat', 'tmp') shutil.copy('data/polygon_without_index.id', 'tmp') shutil.copy('data/polygon_without_index.map', 'tmp') ds = ogr.Open('tmp/polygon_without_index.tab', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() ring = g.GetGeometryRef(0) ring.SetPoint_2D(1, ring.GetX(1) + 100, ring.GetY()) g = g.Clone() f.SetGeometry(g) lyr.SetFeature(f) f = None ds = None ds = ogr.Open('tmp/polygon_without_index.tab') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() got_g = f.GetGeometryRef() if ogrtest.check_feature_geometry(f, got_g, max_error=0.1): f.DumpReadable() pytest.fail(g) while True: f = lyr.GetNextFeature() if f is None: break ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/polygon_without_index.tab') ############################################################################### # Simple testing of Seamless tables def test_ogr_mitab_37(): ds = ogr.Open('data/seamless.tab') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 4 f = lyr.GetNextFeature() assert f.GetFID() == 4294967297 and f.id == '1' f = lyr.GetNextFeature() assert f.GetFID() == 4294967298 and f.id == '2' f = lyr.GetNextFeature() assert f.GetFID() == 8589934593 and f.id == '3' f = lyr.GetNextFeature() assert f.GetFID() == 8589934594 and f.id == '4' f = lyr.GetFeature(4294967297) assert f.GetFID() == 4294967297 and f.id == '1' f = lyr.GetFeature(8589934594) assert f.GetFID() == 8589934594 and f.id == '4' f = lyr.GetFeature(8589934594 + 1) assert f is None f = lyr.GetFeature(4294967297 * 2 + 1) assert f is None ############################################################################### # Open MIF with MID with TAB delimiter and empty first field (#5405) def test_ogr_mitab_38(): ds = ogr.Open('data/empty_first_field_with_tab_delimiter.mif') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['field1'] != '' or f['field2'] != 'foo': f.DumpReadable() pytest.fail() ############################################################################### # Read various geometry types from .mif def test_ogr_mitab_39(): ds = ogr.Open('data/all_geoms.mif') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/all_geoms.mif.golden.csv') lyr_ref = ds_ref.GetLayer(0) while True: f = lyr.GetNextFeature() f_ref = lyr_ref.GetNextFeature() if f is None: assert f_ref is None break if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0 or \ f.GetStyleString() != f_ref.GetStyleString(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() ############################################################################### # Read various geometry types from .mif but potentially truncated def test_ogr_mitab_40(): content = open('data/all_geoms.mif', 'rt').read() for i in range(len(content)): gdal.FileFromMemBuffer('/vsimem/ogr_mitab_40.mif', content[0:i]) with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_mitab_40.mif') if ds is not None: lyr = ds.GetLayer(0) for _ in lyr: pass gdal.Unlink('/vsimem/ogr_mitab_40.mif') ############################################################################### # Read various geometry types from .tab def test_ogr_mitab_41(): ds = ogr.Open('data/all_geoms.tab') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/all_geoms.mif.golden.csv') lyr_ref = ds_ref.GetLayer(0) while True: f = lyr.GetNextFeature() f_ref = lyr_ref.GetNextFeature() if f is None: assert f_ref is None break if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0 or \ f.GetStyleString() != f_ref.GetStyleString(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() ############################################################################### # Read various geometry types from .tab with block size = 32256 def test_ogr_mitab_42(): ds = ogr.Open('/vsizip/data/all_geoms_block_32256.zip') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/all_geoms.mif.golden.csv') lyr_ref = ds_ref.GetLayer(0) while True: f = lyr.GetNextFeature() f_ref = lyr_ref.GetNextFeature() if f is None: assert f_ref is None break if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0 or \ f.GetStyleString() != f_ref.GetStyleString(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() ############################################################################### # Test creating tab with block size = 32256 def test_ogr_mitab_43(): src_ds = gdal.OpenEx('/vsizip/data/all_geoms_block_32256.zip') gdal.VectorTranslate('/vsimem/all_geoms_block_512.tab', src_ds, format='MapInfo File') gdal.VectorTranslate('/vsimem/all_geoms_block_32256.tab', src_ds, format='MapInfo File', datasetCreationOptions=['BLOCKSIZE=32256']) with gdaltest.error_handler(): out_ds = gdal.VectorTranslate('/vsimem/all_geoms_block_invalid.tab', src_ds, format='MapInfo File', datasetCreationOptions=['BLOCKSIZE=32768']) assert out_ds is None gdal.Unlink('/vsimem/all_geoms_block_invalid.dat') src_ds = None size = gdal.VSIStatL('/vsimem/all_geoms_block_512.map').size assert size == 6144 size = gdal.VSIStatL('/vsimem/all_geoms_block_32256.map').size assert size == 161280 ds = ogr.Open('/vsimem/all_geoms_block_32256.tab') lyr = ds.GetLayer(0) ds_ref = ogr.Open('/vsimem/all_geoms_block_512.tab') lyr_ref = ds_ref.GetLayer(0) while True: f = lyr.GetNextFeature() f_ref = lyr_ref.GetNextFeature() if f is None: assert f_ref is None break if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0 or \ f.GetStyleString() != f_ref.GetStyleString(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() gdaltest.mapinfo_drv.DeleteDataSource('/vsimem/all_geoms_block_512.tab') gdaltest.mapinfo_drv.DeleteDataSource('/vsimem/all_geoms_block_32256.tab') gdal.Unlink('/vsimem/all_geoms_block_32768.dat') ############################################################################### # Test limitation on width and precision of numeric fields in creation (#6392) def test_ogr_mitab_44(): ds = gdaltest.mapinfo_drv.CreateDataSource('/vsimem/ogr_mitab_44.mif') lyr = ds.CreateLayer('test') fld_defn = ogr.FieldDefn('test', ogr.OFTReal) fld_defn.SetWidth(30) fld_defn.SetPrecision(29) lyr.CreateField(fld_defn) ds = None ds = ogr.Open('/vsimem/ogr_mitab_44.mif') lyr = ds.GetLayer(0) fld_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert fld_defn.GetWidth() == 20 and fld_defn.GetPrecision() == 16 ds = None gdaltest.mapinfo_drv.DeleteDataSource('/vsimem/ogr_mitab_44.mif') ############################################################################### # Test read/write MapInfo layers with encoding specified def test_ogr_mitab_45(): lyrNames = ['lyr1', 'lyr2'] fldNames = ['field1', 'поле1'] featNames = ['аз', 'буки', 'веди'] formats = ['MIF', 'TAB', 'MIF', 'TAB'] lyrNums = [1, 1, 2, 2] dsExts = ['.mif', '.tab', '', ''] for formatN, frmt in enumerate(formats): lyrCount = lyrNums[formatN] ext = dsExts[formatN] dsName = '/vsimem/45/ogr_mitab_45_%s_%s%s' % (frmt, lyrCount, ext) ds = gdaltest.mapinfo_drv.CreateDataSource(dsName, options=['FORMAT=' + frmt]) assert ds is not None, ('Can\'t create dataset: ' + dsName) for i in range(lyrCount): lyr = ds.CreateLayer(lyrNames[i], options=['ENCODING=CP1251']) assert lyr is not None, ('Can\'t create layer ' + lyrNames[i] + ' for ' + dsName) if lyr.TestCapability(ogr.OLCStringsAsUTF8) != 1: pytest.skip('skipping test: recode is not possible') for fldName in fldNames: fld_defn = ogr.FieldDefn(fldName, ogr.OFTString) fld_defn.SetWidth(254) lyr.CreateField(fld_defn) for featName in featNames: feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt("POINT (25 72)")) for fldName in fldNames: featValue = fldName + ' ' + featName feat.SetField(fldName, featValue) lyr.CreateFeature(feat) ds = None # reopen and check ds = ogr.Open(dsName) assert ds is not None, ('Can\'t reopen dataset: ' + dsName) for i in range(lyrCount): lyr = ds.GetLayer(i) assert lyr is not None, ('Can\'t get layer ' + lyrNames[i] + ' from ' + dsName) for fldN, expectedName in enumerate(fldNames): fldName = lyr.GetLayerDefn().GetFieldDefn(fldN).GetName() assert fldName == expectedName, ('Can\'t get field name\n' + ' result name: "' + fldName + '"\n' ' expected name: "' + expectedName + '"\n' ' from layer : ' + lyrNames[i] + ' from dataset :' + dsName) for featName in featNames: feat = lyr.GetNextFeature() for fldN, fldName in enumerate(fldNames): expectedValue = fldName + ' ' + featName # column value by number value = feat.GetField(fldN) assert value == expectedValue, \ ('Can\'t get field value by number\n' + ' result value: "' + value + '"\n' ' expected value: "' + expectedValue + '"\n' ' from layer : ' + lyrNames[i] + ' from dataset :' + dsName) # column value by name value = feat.GetField(fldNames[fldN]) assert value == expectedValue, \ ('Can\'t get field value by name\n' + ' result value: "' + value + '"\n' ' expected value: "' + expectedValue + '"\n' ' from layer : ' + lyrNames[i] + ' from dataset :' + dsName) gdaltest.mapinfo_drv.DeleteDataSource(dsName) ############################################################################### # Test read MapInfo layers with encoding specified def test_ogr_mitab_46(): dsNames = ['data/mitab/tab-win1251.TAB', 'data/mitab/win1251.mif'] fldNames = ['Поле_А', 'Поле_Б', 'Поле_В', 'Поле_Г', 'Поле_Д'] fldVal = [['Значение А', 'Значение Б', 'Значение В', 'Значение Г', 'Значение Д'], ['Значение 1', 'Значение 2', 'Значение 3', 'Значение 4', 'Значение 5'], ['Полигон', 'Синий', 'Заливка', 'А а Б б', 'ЪЫЁЩ']] for dsName in dsNames: ds = ogr.Open(dsName) assert ds is not None, ('Can\'t open dataset: ' + dsName) lyr = ds.GetLayer(0) assert lyr is not None, ('Can\'t get layer 0 from ' + dsName) if lyr.TestCapability(ogr.OLCStringsAsUTF8) != 1: pytest.skip('skipping test: recode is not possible') for fldN, expectedName in enumerate(fldNames): fldName = lyr.GetLayerDefn().GetFieldDefn(fldN).GetName() assert fldName == expectedName, ('Can\'t get field\n' + ' result name: "' + fldName + '"\n' ' expected name: "' + expectedName + '"\n' ' from dataset :' + dsName) for featFldVal in fldVal: feat = lyr.GetNextFeature() for fldN, fldName in enumerate(fldNames): expectedValue = featFldVal[fldN] # column value by number value = feat.GetField(fldN) assert value == expectedValue, ('Can\'t get field value by number\n' + ' result value: "' + value + '"\n' ' expected value: "' + expectedValue + '"\n' ' from dataset :' + dsName) # column value by name value = feat.GetField(fldName) assert value == expectedValue, ('Can\'t get field value by name\n' + ' result value: "' + value + '"\n' ' expected value: "' + expectedValue + '"\n' ' from dataset :' + dsName) ############################################################################### # Test opening a dataset with a .ind file def test_ogr_mitab_47(): ds = ogr.Open('data/poly_indexed.tab') lyr = ds.GetLayer(0) lyr.SetAttributeFilter("PRFEDEA = '35043413'") assert lyr.GetFeatureCount() == 1 for ext in ('tab', 'dat', 'map', 'id'): gdal.FileFromMemBuffer('/vsimem/poly_indexed.' + ext, open('data/poly_indexed.' + ext, 'rb').read()) ds = ogr.Open('/vsimem/poly_indexed.tab') lyr = ds.GetLayer(0) lyr.SetAttributeFilter("PRFEDEA = '35043413'") assert lyr.GetFeatureCount() == 1 ds = None for ext in ('tab', 'dat', 'map', 'id'): gdal.Unlink('/vsimem/poly_indexed.' + ext) ############################################################################### # Test writing and reading LCC_1SP def test_ogr_mitab_48(): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('/vsimem/test.mif') sr = osr.SpatialReference() sr.SetFromUserInput("""PROJCS["NTF (Paris) / France IV (deprecated)", GEOGCS["NTF (Paris)", DATUM["Nouvelle_Triangulation_Francaise_Paris", SPHEROID["Clarke 1880 (IGN)",6378249.2,293.4660212936269, AUTHORITY["EPSG","7011"]], TOWGS84[-168,-60,320,0,0,0,0], AUTHORITY["EPSG","6807"]], PRIMEM["Paris",2.33722917, AUTHORITY["EPSG","8903"]], UNIT["grad",0.01570796326794897, AUTHORITY["EPSG","9105"]], AUTHORITY["EPSG","4807"]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",46.85], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["X",EAST], AXIS["Y",NORTH], AUTHORITY["EPSG","27584"]]""") lyr = ds.CreateLayer('foo', srs=sr) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ds = None ds = ogr.Open('/vsimem/test.mif') lyr = ds.GetLayer(0) sr_got = lyr.GetSpatialRef() ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('/vsimem/test.mif') sr_expected = osr.SpatialReference() sr_expected.SetFromUserInput("""PROJCS["unnamed", GEOGCS["unnamed", DATUM["NTF_Paris_Meridian", SPHEROID["Clarke 1880 (modified for IGN)",6378249.2,293.4660213], TOWGS84[-168,-60,320,0,0,0,0]], PRIMEM["Paris",2.33722917], UNIT["degree",0.0174532925199433]], PROJECTION["Lambert_Conformal_Conic_1SP"], PARAMETER["latitude_of_origin",42.165], PARAMETER["central_meridian",0], PARAMETER["scale_factor",0.99994471], PARAMETER["false_easting",234.358], PARAMETER["false_northing",4185861.369], UNIT["metre",1]]""") assert sr_got.IsSame(sr_expected) != 0, sr_got.ExportToPrettyWkt() ############################################################################### # Test reading an aspatial TAB file. def test_ogr_mitab_49_aspatial(): ds = ogr.GetDriverByName('MapInfo File').Open('data/mitab/aspatial.tab') lyr = ds.GetLayer(0) geom_type = lyr.GetLayerDefn().GetGeomType() assert geom_type == ogr.wkbNone assert lyr.GetSpatialRef() is None assert lyr.GetExtent(can_return_null=True) is None ############################################################################### # Test creating an indexed field def test_ogr_mitab_tab_field_index_creation(): layername = 'ogr_mitab_tab_field_index_creation' filename = '/vsimem/' + layername + '.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer(layername) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('other_field', ogr.OFTInteger)) with gdaltest.error_handler(): ds.ExecuteSQL('CREATE INDEX ON foo USING id') ds.ExecuteSQL('CREATE INDEX ON ' + layername + ' USING foo') ds.ExecuteSQL('CREATE INDEX ON ' + layername + ' USING id') ds.ExecuteSQL('CREATE INDEX ON ' + layername + ' USING id') f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 100) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 200) lyr.CreateFeature(f) ds = None assert gdal.VSIStatL('/vsimem/' + layername + '.ind') is not None, 'no ind file' ds = ogr.Open(filename) with gdaltest.error_handler(): ds.ExecuteSQL('CREATE INDEX ON ' + layername + ' USING other_field') lyr = ds.GetLayer(0) lyr.SetAttributeFilter('id = 200') assert lyr.GetFeatureCount() == 1, 'bad feature count' ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Test reading a tab_view file def test_ogr_mitab_tab_view(): ds = ogr.Open('data/mitab/view_first_table_second_table.tab') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2, 'bad field count' f = lyr.GetNextFeature() if f['ID'] != 100 or f['foo'] != 'foo': f.DumpReadable() pytest.fail('bad feature') ds = None ds = ogr.Open('data/mitab/view_select_all_first_table_second_table.tab') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 3, 'bad field count' f = lyr.GetNextFeature() if f['joint_field'] != 1 or f['ID'] != 100 or f['foo'] != 'foo': f.DumpReadable() pytest.fail('bad feature') ds = None ############################################################################### def test_ogr_mitab_style(): tmpfile = '/vsimem/ogr_mitab_style.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(tmpfile) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) f.SetStyleString("BRUSH(fc:#AABBCC,bc:#DDEEFF);PEN(c:#DDEEFF)") lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) f.SetStyleString('BRUSH(fc:#AABBCC,id:"mapinfo-brush-1")') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) f.SetStyleString('BRUSH(fc:#AABBCC00,bc:#ddeeff00)') lyr.CreateFeature(f) ds = None ds = ogr.Open(tmpfile) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetStyleString() != 'BRUSH(fc:#aabbcc,bc:#ddeeff,id:"mapinfo-brush-2,ogr-brush-0");PEN(w:1px,c:#ddeeff,id:"mapinfo-pen-2,ogr-pen-0")': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetStyleString() != 'BRUSH(fc:#aabbcc,id:"mapinfo-brush-1,ogr-brush-1");PEN(w:1px,c:#000000,id:"mapinfo-pen-2,ogr-pen-0")': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetStyleString() != 'BRUSH(fc:#aabbcc,id:"mapinfo-brush-1,ogr-brush-1");PEN(w:1px,c:#000000,id:"mapinfo-pen-2,ogr-pen-0")': f.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(tmpfile) ############################################################################### def test_ogr_mitab_tab_write_field_name_with_dot(): tmpfile = '/vsimem/ogr_mitab_tab_write_field_name_with_dot.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(tmpfile) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('with.dot', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['with.dot'] = 1 f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2 3)')) lyr.CreateFeature(f) with gdaltest.error_handler(): ds = None ds = ogr.Open(tmpfile) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['with_dot'] == 1 ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(tmpfile) ############################################################################### # Test read text labels with local encoding from mif/mid file def test_ogr_mitab_local_encoding_label(): dsNames = ['data/mitab/win1251_text.mif', 'data/mitab/tab-win1251_text.tab'] expectedStyles = ['LABEL(t:"Поле",a:0.000000,s:2.070000g,c:#ff0000,p:2,f:"DejaVu Serif")', 'LABEL(t:"Поле",a:0.000000,s:0.015375g,c:#000000,p:1,f:"Times New Roman")'] for (dsName, expectedStyle) in zip(dsNames, expectedStyles): ds = ogr.Open(dsName) assert ds is not None, ('Can\'t open dataset: ' + dsName) lyr = ds.GetLayer(0) assert lyr is not None, ('Can\'t get layer 0 from ' + dsName) if lyr.TestCapability(ogr.OLCStringsAsUTF8) != 1: pytest.skip('skipping test: recode is not possible') feat = lyr.GetNextFeature() assert lyr is not None, ('Can\'t find text feature in' + dsName) assert feat.GetStyleString() == expectedStyle, (feat.GetStyleString(), expectedStyle) ############################################################################### # Check fix for https://github.com/OSGeo/gdal/issues/1232 def test_ogr_mitab_delete_feature_no_geometry(): filename = '/vsimem/test.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test', geom_type = ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 2 lyr.CreateFeature(f) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) assert lyr.DeleteFeature(1) == 0 ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['id'] == 2 ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # Check fix for https://github.com/OSGeo/gdal/issues/1636 def test_ogr_mitab_too_large_value_for_decimal_field(): filename = '/vsimem/test.tab' ds = ogr.GetDriverByName('MapInfo File').CreateDataSource(filename) lyr = ds.CreateLayer('test', geom_type = ogr.wkbNone) fld = ogr.FieldDefn('f', ogr.OFTReal) fld.SetWidth(20) fld.SetPrecision(12) lyr.CreateField(fld) f = ogr.Feature(lyr.GetLayerDefn()) f['f'] = 1234567.012 assert lyr.CreateFeature(f) == ogr.OGRERR_NONE f = None f = ogr.Feature(lyr.GetLayerDefn()) f['f'] = 123456789.012 with gdaltest.error_handler(): assert lyr.CreateFeature(f) != ogr.OGRERR_NONE f = None ds = None ogr.GetDriverByName('MapInfo File').DeleteDataSource(filename) ############################################################################### # def test_ogr_mitab_cleanup(): if gdaltest.mapinfo_ds is None: pytest.skip() fl = gdal.ReadDir('/vsimem/') if fl is not None: print(fl) gdaltest.mapinfo_ds = None gdaltest.mapinfo_drv.DeleteDataSource('tmp') gdalautotest-3.0.4/ogr/ogr_wkbwkt_geom.py0000755003401500001440000006667313614005324020203 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_wkbwkt_geom.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic OGR translation of WKT and WKB geometries. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2012, Even Rouault # # 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. ############################################################################### import os import pytest import gdaltest from osgeo import ogr from osgeo import gdal ############################################################################### @pytest.mark.parametrize( 'filename', [ f for f in os.listdir(os.path.join(os.path.dirname(__file__), 'data/wkb_wkt')) if f[-4:] == '.wkb' ] ) def test_wkbwkt_geom(filename): raw_wkb = open('data/wkb_wkt/' + filename, 'rb').read() raw_wkt = open('data/wkb_wkt/' + os.path.splitext(filename)[0] + '.wkt').read() ###################################################################### # Compare the WKT derived from the WKB file to the WKT provided # but reformatted (normalized). geom_wkb = ogr.CreateGeometryFromWkb(raw_wkb) wkb_wkt = geom_wkb.ExportToWkt() geom_wkt = ogr.CreateGeometryFromWkt(raw_wkt) normal_wkt = geom_wkt.ExportToWkt() # print(wkb_wkt) # print(normal_wkt) # print(raw_wkt) assert wkb_wkt == normal_wkt, \ ('WKT from WKB (%s) does not match clean WKT (%s).' % (wkb_wkt, normal_wkt)) ###################################################################### # Verify that the geometries appear to be the same. This is # intended to catch problems with the encoding too WKT that might # cause passes above but that are mistaken. assert geom_wkb.GetCoordinateDimension() == geom_wkt.GetCoordinateDimension(), \ 'Coordinate dimension differs!' assert geom_wkb.GetGeometryType() == geom_wkt.GetGeometryType(), \ 'Geometry type differs!' assert geom_wkb.GetGeometryName() == geom_wkt.GetGeometryName(), \ 'Geometry name differs!' # It turns out this test is too picky about coordinate precision. skip. # if geom_wkb.Equal( geom_wkt ) == 0: # gdaltest.post_reason( 'Geometries not equal!' ) # print geom_wkb.ExportToWkt() # print geom_wkt.ExportToWkt() # return 'fail' geom_wkb.Destroy() ###################################################################### # Convert geometry to WKB and back to verify that WKB encoding is # working smoothly. wkb_xdr = geom_wkt.ExportToWkb(ogr.wkbXDR) geom_wkb = ogr.CreateGeometryFromWkb(wkb_xdr) assert str(geom_wkb) == str(geom_wkt), 'XDR WKB encoding/decoding failure.' geom_wkb.Destroy() wkb_ndr = geom_wkt.ExportToWkb(ogr.wkbNDR) geom_wkb = ogr.CreateGeometryFromWkb(wkb_ndr) assert str(geom_wkb) == str(geom_wkt), 'NDR WKB encoding/decoding failure.' geom_wkb.Destroy() geom_wkt.Destroy() ############################################################################### # Test geometry with very large exponents of coordinate values. def test_ogr_wkbwkt_geom_bigexponents(): bigx = -1.79769313486e+308 bigy = -1.12345678901e+308 geom = ogr.Geometry(ogr.wkbPoint) geom.SetPoint(0, bigx, bigy) expect = 'POINT (-1.79769313486e+308 -1.12345678901e+308 0)' wkt = geom.ExportToWkt() assert str(wkt) == str(expect), 'trimming long float numbers failed.' ############################################################################### # Test importing broken/unhandled WKT. def test_ogr_wkbwkt_test_broken_geom(): list_broken = ['POINT', 'POINT UNKNOWN', 'POINT(', 'POINT()', 'POINT(,)', 'POINT(EMPTY', 'POINT(A)', 'POINT(0)', 'POINT(A 0)', 'POINT(0 A)', 'POINT(0 1', 'POINT(0 1,', 'POINT((0 1))', 'POINT Z', 'POINT Z UNKNOWN', 'POINT Z(', 'POINT Z()', 'POINT Z(EMPTY)', 'POINT Z(A)', 'POINT Z(0 1', 'LINESTRING', 'LINESTRING UNKNOWN', 'LINESTRING(', 'LINESTRING()', 'LINESTRING(,)', 'LINESTRING(())', 'LINESTRING(EMPTY', 'LINESTRING(A)', 'LINESTRING(0 1,', 'LINESTRING(0 1,2 3', 'LINESTRING(0 1,,2 3)', 'LINESTRING((0 1,2 3))', 'LINESTRING Z', 'LINESTRING Z UNKNOWN', 'LINESTRING Z(', 'LINESTRING Z()', 'LINESTRING Z(EMPTY)', 'LINESTRING Z(A)', 'LINESTRING Z(0 1', 'LINESTRING Z(0 1,2 3', 'POLYGON', 'POLYGON UNKNOWN', 'POLYGON(', 'POLYGON()', 'POLYGON(,)', 'POLYGON(())', 'POLYGON(EMPTY', 'POLYGON(A)', 'POLYGON(0 1)', 'POLYGON(0 1,2 3', 'POLYGON((0 1,2 3', 'POLYGON((0 1,2 3,', 'POLYGON((0 1,2 3)', 'POLYGON((0 1,2 3),', 'POLYGON((0 1,2 3),EMPTY', 'POLYGON(((0 1,2 3)))', 'POLYGON Z', 'POLYGON Z UNKNOWN', 'POLYGON Z(', 'POLYGON Z()', 'POLYGON Z(EMPTY', 'POLYGON Z(A)', 'POLYGON Z(0 1', 'POLYGON Z(0 1,2 3', 'POLYGON Z((0 1,2 3', 'POLYGON Z((0 1,2 3)', 'POLYGON Z(((0 1,2 3)))', 'MULTIPOINT', 'MULTIPOINT UNKNOWN', 'MULTIPOINT(', 'MULTIPOINT()', 'MULTIPOINT(())', 'MULTIPOINT(EMPTY', 'MULTIPOINT(EMPTY,', 'MULTIPOINT(EMPTY,(0 1)', 'MULTIPOINT(A)', 'MULTIPOINT(0 1', 'MULTIPOINT(0 1,', 'MULTIPOINT(0 1,2 3', 'MULTIPOINT((0 1),,(2 3))', 'MULTIPOINT(0 1,EMPTY', 'MULTIPOINT((0 1),EMPTY', 'MULTIPOINT((0 1)', # 'MULTIPOINT(0 1,2 3)', # This one is not SF compliant but supported for legacy 'MULTIPOINT((0 1),(2 3)', 'MULTIPOINT Z', 'MULTIPOINT Z UNKNOWN', 'MULTIPOINT Z(', 'MULTIPOINT Z()', 'MULTIPOINT Z(EMPTY', 'MULTIPOINT Z(A)', 'MULTIPOINT Z(0 1', 'MULTIPOINT Z((0 1)', 'MULTIPOINT Z(0 1,2 3)', 'MULTILINESTRING', 'MULTILINESTRING UNKNOWN', 'MULTILINESTRING(', 'MULTILINESTRING()', 'MULTILINESTRING(,)', 'MULTILINESTRING(())', 'MULTILINESTRING(EMPTY', 'MULTILINESTRING(EMPTY,', 'MULTILINESTRING(A)', 'MULTILINESTRING(0 1', 'MULTILINESTRING(0 1,', 'MULTILINESTRING(0 1,2 3)', 'MULTILINESTRING((0 1,2 3', 'MULTILINESTRING((0 1,2 3),)', 'MULTILINESTRING((0 1)', 'MULTILINESTRING((0 1),', 'MULTILINESTRING((0 1),EMPTY', 'MULTILINESTRING((0 1),(2 3)', 'MULTILINESTRING Z', 'MULTILINESTRING Z UNKNOWN', 'MULTILINESTRING Z(', 'MULTILINESTRING Z()', 'MULTILINESTRING Z(EMPTY', 'MULTILINESTRING Z(A)', 'MULTILINESTRING Z(0 1', 'MULTILINESTRING Z((0 1)', 'MULTILINESTRING Z((0 1),(2 3)', 'MULTIPOLYGON', 'MULTIPOLYGON UNKNOWN', 'MULTIPOLYGON(', 'MULTIPOLYGON()', 'MULTIPOLYGON(,)', 'MULTIPOLYGON(())', 'MULTIPOLYGON((()))', 'MULTIPOLYGON(EMPTY', 'MULTIPOLYGON(EMPTY,', 'MULTIPOLYGON(A)', 'MULTIPOLYGON(0 1', 'MULTIPOLYGON(0 1,', 'MULTIPOLYGON(0 1,2 3)', 'MULTIPOLYGON((0 1,2 3', 'MULTIPOLYGON((0 1,2 3),)', 'MULTIPOLYGON((0 1)', 'MULTIPOLYGON((0 1),', 'MULTIPOLYGON((0 1),EMPTY', 'MULTIPOLYGON((0 1),(2 3)', 'MULTIPOLYGON((0 1),(2 3))', 'MULTIPOLYGON(((0 1))', 'MULTIPOLYGON(((0 1)),', 'MULTIPOLYGON(((0 1)),,', 'MULTIPOLYGON(((0 1),(2 3))', 'MULTIPOLYGON(((0 1),EMPTY', 'MULTIPOLYGON(((0 1),EMPTY,', 'MULTIPOLYGON((((0 1)),)', 'MULTIPOLYGON Z', 'MULTIPOLYGON Z UNKNOWN', 'MULTIPOLYGON Z(', 'MULTIPOLYGON Z()', 'MULTIPOLYGON Z(EMPTY', 'MULTIPOLYGON Z(A)', 'MULTIPOLYGON Z(0 1', 'MULTIPOLYGON Z((0 1)', 'MULTIPOLYGON Z((0 1),(2 3)', 'GEOMETRYCOLLECTION', 'GEOMETRYCOLLECTION UNKNOWN', 'GEOMETRYCOLLECTION(', 'GEOMETRYCOLLECTION()', 'GEOMETRYCOLLECTION(,)', 'GEOMETRYCOLLECTION(())', 'GEOMETRYCOLLECTION(EMPTY', 'GEOMETRYCOLLECTION(EMPTY,', 'GEOMETRYCOLLECTION(A)', 'GEOMETRYCOLLECTION(POINT(0 1)', 'GEOMETRYCOLLECTION(POINT(0 1),', 'GEOMETRYCOLLECTION(POINT(0 1),)', 'GEOMETRYCOLLECTION(POINT(0 1),UNKNOWN)', 'GEOMETRYCOLLECTION Z', 'GEOMETRYCOLLECTION Z(', 'GEOMETRYCOLLECTION Z()', 'GEOMETRYCOLLECTION Z(EMPTY', 'GEOMETRYCOLLECTION Z(POINT(0 1)', 'COMPOUNDCURVE', 'COMPOUNDCURVE UNKNOWN', 'COMPOUNDCURVE(', 'COMPOUNDCURVE()', 'COMPOUNDCURVE(,)', 'COMPOUNDCURVE(())', 'COMPOUNDCURVE(EMPTY', 'COMPOUNDCURVE(EMPTY,', 'COMPOUNDCURVE(A)', 'COMPOUNDCURVE((0 1,2 3', 'COMPOUNDCURVE((0 1,2 3)', 'COMPOUNDCURVE((0 1,2 3)', 'COMPOUNDCURVE((0 1,2 3),', 'COMPOUNDCURVE((0 1,2 3),)', 'COMPOUNDCURVE((0 1,2 3),UNKNOWN)', 'COMPOUNDCURVE Z', 'COMPOUNDCURVE Z(', 'COMPOUNDCURVE Z()', 'COMPOUNDCURVE Z(EMPTY', 'COMPOUNDCURVE Z((0 1,2 3)', 'CURVEPOLYGON', 'CURVEPOLYGON UNKNOWN', 'CURVEPOLYGON(', 'CURVEPOLYGON()', 'CURVEPOLYGON(,)', 'CURVEPOLYGON(())', 'CURVEPOLYGON(EMPTY', 'CURVEPOLYGON(EMPTY,', 'CURVEPOLYGON(A)', 'CURVEPOLYGON((0 1,2 3', 'CURVEPOLYGON((0 1,2 3)', 'CURVEPOLYGON((0 1,2 3)', 'CURVEPOLYGON((0 1,2 3),', 'CURVEPOLYGON((0 1,2 3),)', 'CURVEPOLYGON((0 1,2 3),UNKNOWN)', 'CURVEPOLYGON Z', 'CURVEPOLYGON Z(', 'CURVEPOLYGON Z()', 'CURVEPOLYGON Z(EMPTY', 'CURVEPOLYGON Z((0 1,2 3)', ] for wkt in list_broken: gdal.PushErrorHandler('CPLQuietErrorHandler') geom = ogr.CreateGeometryFromWkt(wkt) gdal.PopErrorHandler() assert geom is None, ('geom %s instantiated but not expected' % wkt) ############################################################################### # Test importing WKT SF1.2 def test_ogr_wkbwkt_test_import_wkt_sf12(): list_wkt_tuples = [('POINT EMPTY', 'POINT EMPTY'), ('POINT Z EMPTY', 'POINT EMPTY'), ('POINT M EMPTY', 'POINT EMPTY'), ('POINT ZM EMPTY', 'POINT EMPTY'), ('POINT (0 1)', 'POINT (0 1)'), ('POINT Z (0 1 2)', 'POINT (0 1 2)'), ('POINT M (0 1 2)', 'POINT (0 1)'), ('POINT ZM (0 1 2 3)', 'POINT (0 1 2)'), ('LINESTRING EMPTY', 'LINESTRING EMPTY'), ('LINESTRING Z EMPTY', 'LINESTRING EMPTY'), ('LINESTRING M EMPTY', 'LINESTRING EMPTY'), ('LINESTRING ZM EMPTY', 'LINESTRING EMPTY'), ('LINESTRING (0 1,2 3)', 'LINESTRING (0 1,2 3)'), ('LINESTRING Z (0 1 2,3 4 5)', 'LINESTRING (0 1 2,3 4 5)'), ('LINESTRING M (0 1 2,3 4 5)', 'LINESTRING (0 1,3 4)'), ('LINESTRING ZM (0 1 2 3,4 5 6 7)', 'LINESTRING (0 1 2,4 5 6)'), ('POLYGON EMPTY', 'POLYGON EMPTY'), ('POLYGON (EMPTY)', 'POLYGON EMPTY'), ('POLYGON Z EMPTY', 'POLYGON EMPTY'), ('POLYGON Z (EMPTY)', 'POLYGON EMPTY'), ('POLYGON M EMPTY', 'POLYGON EMPTY'), ('POLYGON ZM EMPTY', 'POLYGON EMPTY'), ('POLYGON ((0 1,2 3,4 5,0 1))', 'POLYGON ((0 1,2 3,4 5,0 1))'), ('POLYGON ((0 1,2 3,4 5,0 1),EMPTY)', 'POLYGON ((0 1,2 3,4 5,0 1))'), ('POLYGON (EMPTY,(0 1,2 3,4 5,0 1))', 'POLYGON EMPTY'), ('POLYGON (EMPTY,(0 1,2 3,4 5,0 1),EMPTY)', 'POLYGON EMPTY'), ('POLYGON Z ((0 1 10,2 3 20,4 5 30,0 1 10),(0 1 10,2 3 20,4 5 30,0 1 10))', 'POLYGON ((0 1 10,2 3 20,4 5 30,0 1 10),(0 1 10,2 3 20,4 5 30,0 1 10))'), ('POLYGON M ((0 1 10,2 3 20,4 5 30,0 1 10))', 'POLYGON ((0 1,2 3,4 5,0 1))'), ('POLYGON ZM ((0 1 10 100,2 3 20 200,4 5 30 300,0 1 10 10))', 'POLYGON ((0 1 10,2 3 20,4 5 30,0 1 10))'), ('MULTIPOINT EMPTY', 'MULTIPOINT EMPTY'), ('MULTIPOINT (EMPTY)', 'MULTIPOINT EMPTY'), ('MULTIPOINT Z EMPTY', 'MULTIPOINT EMPTY'), ('MULTIPOINT Z (EMPTY)', 'MULTIPOINT EMPTY'), ('MULTIPOINT M EMPTY', 'MULTIPOINT EMPTY'), ('MULTIPOINT ZM EMPTY', 'MULTIPOINT EMPTY'), ('MULTIPOINT (0 1,2 3)', 'MULTIPOINT (0 1,2 3)'), # Not SF1.2 compliant but recognized ('MULTIPOINT ((0 1),(2 3))', 'MULTIPOINT (0 1,2 3)'), ('MULTIPOINT ((0 1),EMPTY)', 'MULTIPOINT (0 1)'), # We don't output empty points in multipoint ('MULTIPOINT (EMPTY,(0 1))', 'MULTIPOINT (0 1)'), # We don't output empty points in multipoint ('MULTIPOINT (EMPTY,(0 1),EMPTY)', 'MULTIPOINT (0 1)'), # We don't output empty points in multipoint ('MULTIPOINT Z ((0 1 2),(3 4 5))', 'MULTIPOINT (0 1 2,3 4 5)'), ('MULTIPOINT M ((0 1 2),(3 4 5))', 'MULTIPOINT (0 1,3 4)'), ('MULTIPOINT ZM ((0 1 2 3),(4 5 6 7))', 'MULTIPOINT (0 1 2,4 5 6)'), ('MULTILINESTRING EMPTY', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING (EMPTY)', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING Z EMPTY', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING Z (EMPTY)', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING M EMPTY', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING ZM EMPTY', 'MULTILINESTRING EMPTY'), ('MULTILINESTRING ((0 1,2 3,4 5,0 1))', 'MULTILINESTRING ((0 1,2 3,4 5,0 1))'), ('MULTILINESTRING ((0 1,2 3,4 5,0 1),EMPTY)', 'MULTILINESTRING ((0 1,2 3,4 5,0 1))'), ('MULTILINESTRING (EMPTY,(0 1,2 3,4 5,0 1))', 'MULTILINESTRING ((0 1,2 3,4 5,0 1))'), ('MULTILINESTRING (EMPTY,(0 1,2 3,4 5,0 1),EMPTY)', 'MULTILINESTRING ((0 1,2 3,4 5,0 1))'), ('MULTILINESTRING Z ((0 1 10,2 3 20,4 5 30,0 1 10),(0 1 10,2 3 20,4 5 30,0 1 10))', 'MULTILINESTRING ((0 1 10,2 3 20,4 5 30,0 1 10),(0 1 10,2 3 20,4 5 30,0 1 10))'), ('MULTILINESTRING M ((0 1 10,2 3 20,4 5 30,0 1 10))', 'MULTILINESTRING ((0 1,2 3,4 5,0 1))'), ('MULTILINESTRING ZM ((0 1 10 100,2 3 20 200,4 5 30 300,0 1 10 10))', 'MULTILINESTRING ((0 1 10,2 3 20,4 5 30,0 1 10))'), ('MULTIPOLYGON EMPTY', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON (EMPTY)', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON Z EMPTY', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON Z (EMPTY)', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON M EMPTY', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON ZM EMPTY', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON ((EMPTY))', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1)),((2 3,4 5,6 7,2 3)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)),((2 3,4 5,6 7,2 3)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1),(2 3,4 5,6 7,2 3)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1),(2 3,4 5,6 7,2 3)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1)),EMPTY)', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1),EMPTY))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON ((EMPTY,(0 1,2 3,4 5,0 1)))', 'MULTIPOLYGON EMPTY'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1),EMPTY,(2 3,4 5,6 7,2 3)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1),(2 3,4 5,6 7,2 3)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1)),((0 1,2 3,4 5,0 1),(2 3,4 5,6 7,2 3)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)),((0 1,2 3,4 5,0 1),(2 3,4 5,6 7,2 3)))'), ('MULTIPOLYGON (EMPTY,((0 1,2 3,4 5,0 1)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON (((0 1,2 3,4 5,0 1)),EMPTY)', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON Z (((0 1 10,2 3 20,4 5 30,0 1 10)),((0 1 10,2 3 20,4 5 30,0 1 10)))', 'MULTIPOLYGON (((0 1 10,2 3 20,4 5 30,0 1 10)),((0 1 10,2 3 20,4 5 30,0 1 10)))'), ('MULTIPOLYGON M (((0 1 10,2 3 20,4 5 30,0 1 10)))', 'MULTIPOLYGON (((0 1,2 3,4 5,0 1)))'), ('MULTIPOLYGON ZM (((0 1 10 100,2 3 20 200,4 5 30 300,0 1 10 10)))', 'MULTIPOLYGON (((0 1 10,2 3 20,4 5 30,0 1 10)))'), ('GEOMETRYCOLLECTION EMPTY', 'GEOMETRYCOLLECTION EMPTY'), ('GEOMETRYCOLLECTION Z EMPTY', 'GEOMETRYCOLLECTION EMPTY'), ('GEOMETRYCOLLECTION M EMPTY', 'GEOMETRYCOLLECTION EMPTY'), ('GEOMETRYCOLLECTION ZM EMPTY', 'GEOMETRYCOLLECTION EMPTY'), ('GEOMETRYCOLLECTION Z (POINT Z (0 1 2),LINESTRING Z (0 1 2,3 4 5))', 'GEOMETRYCOLLECTION (POINT (0 1 2),LINESTRING (0 1 2,3 4 5))'), ('GEOMETRYCOLLECTION M (POINT M (0 1 2),LINESTRING M (0 1 2,3 4 5))', 'GEOMETRYCOLLECTION (POINT (0 1),LINESTRING (0 1,3 4))'), ('GEOMETRYCOLLECTION ZM (POINT ZM (0 1 2 10),LINESTRING ZM (0 1 2 10,3 4 5 20))', 'GEOMETRYCOLLECTION (POINT (0 1 2),LINESTRING (0 1 2,3 4 5))'), ('GEOMETRYCOLLECTION (POINT EMPTY,LINESTRING EMPTY,POLYGON EMPTY,MULTIPOINT EMPTY,MULTILINESTRING EMPTY,MULTIPOLYGON EMPTY,GEOMETRYCOLLECTION EMPTY)', 'GEOMETRYCOLLECTION (POINT EMPTY,LINESTRING EMPTY,POLYGON EMPTY,MULTIPOINT EMPTY,MULTILINESTRING EMPTY,MULTIPOLYGON EMPTY,GEOMETRYCOLLECTION EMPTY)'), ('GEOMETRYCOLLECTION (POINT Z EMPTY,LINESTRING Z EMPTY,POLYGON Z EMPTY,MULTIPOINT Z EMPTY,MULTILINESTRING Z EMPTY,MULTIPOLYGON Z EMPTY,GEOMETRYCOLLECTION Z EMPTY)', 'GEOMETRYCOLLECTION (POINT EMPTY,LINESTRING EMPTY,POLYGON EMPTY,MULTIPOINT EMPTY,MULTILINESTRING EMPTY,MULTIPOLYGON EMPTY,GEOMETRYCOLLECTION EMPTY)'), # Not SF1.2 compliant but recognized ('GEOMETRYCOLLECTION (POINT(EMPTY),LINESTRING(EMPTY),POLYGON(EMPTY),MULTIPOINT(EMPTY),MULTILINESTRING(EMPTY),MULTIPOLYGON(EMPTY),GEOMETRYCOLLECTION(EMPTY))', 'GEOMETRYCOLLECTION (POINT EMPTY,LINESTRING EMPTY,POLYGON EMPTY,MULTIPOINT EMPTY,MULTILINESTRING EMPTY,MULTIPOLYGON EMPTY,GEOMETRYCOLLECTION EMPTY)'), ('CURVEPOLYGON EMPTY', 'CURVEPOLYGON EMPTY'), ('CURVEPOLYGON (EMPTY)', 'CURVEPOLYGON EMPTY'), ('MULTICURVE EMPTY', 'MULTICURVE EMPTY'), ('MULTICURVE (EMPTY)', 'MULTICURVE EMPTY'), ('MULTISURFACE EMPTY', 'MULTISURFACE EMPTY'), ('MULTISURFACE (EMPTY)', 'MULTISURFACE EMPTY'), ] for wkt_tuple in list_wkt_tuples: geom = ogr.CreateGeometryFromWkt(wkt_tuple[0]) assert geom is not None, ('could not instantiate geometry %s' % wkt_tuple[0]) out_wkt = geom.ExportToWkt() assert out_wkt == wkt_tuple[1], \ ('in=%s, out=%s, expected=%s.' % (wkt_tuple[0], out_wkt, wkt_tuple[1])) ############################################################################### # Test that importing the wkb that would be equivalent to MULTIPOINT(POLYGON((0 0)) # doesn't work def test_ogr_wkbwkt_test_import_bad_multipoint_wkb(): import struct wkb = struct.pack('B' * 30, 0, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0) gdal.PushErrorHandler('CPLQuietErrorHandler') geom = ogr.CreateGeometryFromWkb(wkb) gdal.PopErrorHandler() assert geom is None ############################################################################### # Test WKT -> WKB -> WKT roundtripping for GEOMETRYCOLLECTION def test_ogr_wkbwkt_test_geometrycollection_wktwkb(): wkt_list = ['GEOMETRYCOLLECTION (POINT (0 1))', 'GEOMETRYCOLLECTION (LINESTRING (0 1,2 3))', 'GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))', 'GEOMETRYCOLLECTION (MULTIPOINT (0 1))', 'GEOMETRYCOLLECTION (MULTILINESTRING ((0 1,2 3)))', 'GEOMETRYCOLLECTION (MULTIPOLYGON (((0 0,0 1,1 1,0 0))))', 'GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (POINT (0 1)))', 'GEOMETRYCOLLECTION (CIRCULARSTRING (0 0,1 0,0 0))', 'GEOMETRYCOLLECTION (COMPOUNDCURVE ((0 0,1 0,0 0)))', 'GEOMETRYCOLLECTION (CURVEPOLYGON ((0 0,0 1,1 1,0 0)))', 'GEOMETRYCOLLECTION (MULTICURVE ((0 0,0 1,1 1,0 0)))', 'GEOMETRYCOLLECTION (MULTISURFACE (((0 0,0 1,1 1,0 0))))', ] for wkt in wkt_list: g = ogr.CreateGeometryFromWkt(wkt) wkb = g.ExportToWkb() g = ogr.CreateGeometryFromWkb(wkb) wkt2 = g.ExportToWkt() assert wkt == wkt2, ('fail for %s' % wkt) ############################################################################### # Test that importing too nested WKT doesn't cause stack overflows def test_ogr_wkbwkt_test_geometrycollection_wkt_recursion(): wkt = 'GEOMETRYCOLLECTION (' * 31 + 'GEOMETRYCOLLECTION EMPTY' + ')' * 31 geom = ogr.CreateGeometryFromWkt(wkt) assert geom.ExportToWkt() == wkt, ('expected %s' % wkt) wkt = 'GEOMETRYCOLLECTION (' * 32 + 'GEOMETRYCOLLECTION EMPTY' + ')' * 32 gdal.PushErrorHandler('CPLQuietErrorHandler') geom = ogr.CreateGeometryFromWkt(wkt) gdal.PopErrorHandler() assert geom is None, 'expected None' ############################################################################### # Test that importing too nested WKB doesn't cause stack overflows def test_ogr_wkbwkt_test_geometrycollection_wkb_recursion(): import struct wkb_repeat = struct.pack('B' * 9, 0, 0, 0, 0, 7, 0, 0, 0, 1) wkb_end = struct.pack('B' * 9, 0, 0, 0, 0, 7, 0, 0, 0, 0) wkb = wkb_repeat * 31 + wkb_end geom = ogr.CreateGeometryFromWkb(wkb) assert geom is not None, 'expected a geometry' wkb = struct.pack('B' * 0) + wkb_repeat * 32 + wkb_end gdal.PushErrorHandler('CPLQuietErrorHandler') geom = ogr.CreateGeometryFromWkb(wkb) gdal.PopErrorHandler() assert geom is None, 'expected None' ############################################################################### # Test ISO WKT compliant export of MULTIPOINT def test_ogr_wkbwkt_export_wkt_iso_multipoint(): wkt = 'MULTIPOINT ((0 0),(1 1))' g = ogr.CreateGeometryFromWkt(wkt) out_wkt = g.ExportToIsoWkt() assert out_wkt == wkt ############################################################################### # Test exporting WKT with non finite values (#6319) def test_ogr_wkt_inf_nan(): g = ogr.Geometry(ogr.wkbPoint) g.AddPoint(float('inf'), float('-inf'), float('nan')) out_wkt = g.ExportToWkt() assert out_wkt == 'POINT (inf -inf nan)' ############################################################################### # Test corrupted WKT def test_ogr_wkt_multicurve_compoundcurve_corrupted(): with gdaltest.error_handler(): g = ogr.CreateGeometryFromWkt('MULTICURVE(COMPOUNDCURVE') assert g is None ############################################################################### # Test corrupted WKT def test_ogr_wkt_multipolygon_corrupted(): with gdaltest.error_handler(): g = ogr.CreateGeometryFromWkt('MULTIPOLYGON(POLYGON((N') assert g is None ############################################################################### # When imported build a list of units based on the files available. # print 'hit enter' # sys.stdin.readline() gdalautotest-3.0.4/ogr/ogr_openfilegdb.py0000755003401500001440000015437413614005324020135 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_openfilegdb.py 47d8d3665dcc12f04d5c025ab646e30259059522 2019-03-18 13:31:56 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: OpenFileGDB driver testing. # 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 shutil import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ogrtest.openfilegdb_datalist = [["none", ogr.wkbNone, None], ["point", ogr.wkbPoint, "POINT (1 2)"], ["multipoint", ogr.wkbMultiPoint, "MULTIPOINT (1 2,3 4)"], ["linestring", ogr.wkbLineString, "LINESTRING (1 2,3 4)", "MULTILINESTRING ((1 2,3 4))"], ["multilinestring", ogr.wkbMultiLineString, "MULTILINESTRING ((1 2,3 4))"], ["multilinestring_multipart", ogr.wkbMultiLineString, "MULTILINESTRING ((1 2,3 4),(5 6,7 8))"], ["polygon", ogr.wkbPolygon, "POLYGON ((0 0,0 1,1 1,1 0,0 0))", "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))"], ["multipolygon", ogr.wkbMultiPolygon, "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.75 0.25,0.75 0.75,0.25 0.75,0.25 0.25)),((2 0,2 1,3 1,3 0,2 0)))"], ["point25D", ogr.wkbPoint25D, "POINT (1 2 3)"], ["multipoint25D", ogr.wkbMultiPoint25D, "MULTIPOINT (1 2 -10,3 4 -20)"], ["linestring25D", ogr.wkbLineString25D, "LINESTRING (1 2 -10,3 4 -20)", "MULTILINESTRING ((1 2 -10,3 4 -20))"], ["multilinestring25D", ogr.wkbMultiLineString25D, "MULTILINESTRING ((1 2 -10,3 4 -20))"], ["multilinestring25D_multipart", ogr.wkbMultiLineString25D, "MULTILINESTRING ((1 2 -10,3 4 -20),(5 6 -30,7 8 -40))"], ["polygon25D", ogr.wkbPolygon25D, "POLYGON ((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10))", "MULTIPOLYGON (((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10)))"], ["multipolygon25D", ogr.wkbMultiPolygon25D, "MULTIPOLYGON (((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10)))"], ["multipatch", ogr.wkbGeometryCollection25D, "GEOMETRYCOLLECTION Z (TIN Z (((0.0 0.0 0,0.0 1.0 0,1.0 0.0 0,0.0 0.0 0)),((0.0 1.0 0,1.0 0.0 0,1.0 1.0 0,0.0 1.0 0))),TIN Z (((10.0 0.0 0,10.0 1.0 0,11.0 0.0 0,10.0 0.0 0)),((10.0 0.0 0,11.0 0.0 0,10.0 -1.0 0,10.0 0.0 0))),TIN Z (((5.0 0.0 0,5.0 1.0 0,6.0 0.0 0,5.0 0.0 0))),MULTIPOLYGON Z (((100.0 0.0 0,100.0 1.0 0,101.0 1.0 0,101.0 0.0 0,100.0 0.0 0),(100.25 0.25 0,100.75 0.25 0,100.75 0.75 0,100.75 0.25 0,100.25 0.25 0))))"], ["null_polygon", ogr.wkbPolygon, None], ["empty_polygon", ogr.wkbPolygon, "POLYGON EMPTY", None], ["empty_multipoint", ogr.wkbMultiPoint, "MULTIPOINT EMPTY", None], ] ogrtest.openfilegdb_datalist_m = [["pointm", ogr.wkbPointM, "POINT M (1 2 3)"], ["pointzm", ogr.wkbPointM, "POINT ZM (1 2 3 4)"], ["multipointm", ogr.wkbMultiPointM, "MULTIPOINT M ((1 2 3),(4 5 6))"], ["multipointzm", ogr.wkbMultiPointZM, "MULTIPOINT ZM ((1 2 3 4),(5 6 7 8))"], ["linestringm", ogr.wkbLineStringM, "LINESTRING M (1 2 3,4 5 6)", "MULTILINESTRING M ((1 2 3,4 5 6))"], ["linestringzm", ogr.wkbLineStringZM, "LINESTRING ZM (1 2 3 4,5 6 7 8)", "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8))"], ["multilinestringm", ogr.wkbMultiLineStringM, "MULTILINESTRING M ((1 2 3,4 5 6))"], ["multilinestringzm", ogr.wkbMultiLineStringZM, "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8))"], ["polygonm", ogr.wkbPolygonM, "POLYGON M ((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1))", "MULTIPOLYGON M (((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)))"], ["polygonzm", ogr.wkbPolygonZM, "POLYGON ZM ((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1))", "MULTIPOLYGON ZM (((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1)))"], ["multipolygonm", ogr.wkbMultiPolygonM, "MULTIPOLYGON M (((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)))"], ["multipolygonzm", ogr.wkbMultiPolygonZM, "MULTIPOLYGON ZM (((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1)))"], ["empty_polygonm", ogr.wkbPolygonM, 'POLYGON M EMPTY', None], ] ############################################################################### # Disable FileGDB driver def test_ogr_openfilegdb_init(): ogrtest.fgdb_drv = ogr.GetDriverByName('FileGDB') if ogrtest.fgdb_drv is not None: ogrtest.fgdb_drv.Deregister() ############################################################################### # Make test data def ogr_openfilegdb_make_test_data(): try: shutil.rmtree("data/testopenfilegdb.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource('data/testopenfilegdb.gdb') srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") options = ['COLUMN_TYPES=smallint=esriFieldTypeSmallInteger,float=esriFieldTypeSingle,guid=esriFieldTypeGUID,xml=esriFieldTypeXML'] for data in ogrtest.openfilegdb_datalist: if data[1] == ogr.wkbNone: lyr = ds.CreateLayer(data[0], geom_type=data[1], options=options) elif data[0] == 'multipatch': lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=['CREATE_MULTIPATCH=YES', options[0]]) else: lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=options) lyr.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("smallint", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("int", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("float", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("real", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("adate", ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn("guid", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("xml", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("binary", ogr.OFTBinary)) lyr.CreateField(ogr.FieldDefn("nullint", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("binary2", ogr.OFTBinary)) # We need at least 5 features so that test_ogrsf can test SetFeature() for i in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) if data[1] != ogr.wkbNone and data[2] is not None: feat.SetGeometry(ogr.CreateGeometryFromWkt(data[2])) feat.SetField("id", i + 1) feat.SetField("str", "foo_\xc3\xa9") feat.SetField("smallint", -13) feat.SetField("int", 123) feat.SetField("float", 1.5) feat.SetField("real", 4.56) feat.SetField("adate", "2013/12/26 12:34:56") feat.SetField("guid", "{12345678-9abc-DEF0-1234-567890ABCDEF}") feat.SetFieldBinaryFromHexString("binary", "00FF7F") feat.SetField("xml", "") feat.SetFieldBinaryFromHexString("binary2", "123456") lyr.CreateFeature(feat) if data[0] == 'none': # Create empty feature feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) if False: # pylint: disable=using-constant-test lyr = ds.CreateLayer('sparse_layer', geom_type=ogr.wkbPoint) for i in range(4096): feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr.DeleteFeature(feat.GetFID()) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) if True: # pylint: disable=using-constant-test lyr = ds.CreateLayer('big_layer', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn("real", ogr.OFTReal)) gdal.SetConfigOption('FGDB_BULK_LOAD', 'YES') # for i in range(340*341+1): for i in range(340 + 1): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, i % 4) lyr.CreateFeature(feat) gdal.SetConfigOption('FGDB_BULK_LOAD', None) if True: # pylint: disable=using-constant-test lyr = ds.CreateLayer('hole', geom_type=ogr.wkbPoint, srs=None) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'f1') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'fid2') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'fid3') lyr.CreateFeature(feat) feat = None lyr.CreateField(ogr.FieldDefn('int0', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) for i in range(8): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'fid%d' % (4 + i)) feat.SetField('int0', 4 + i) feat.SetField('str2', ' ') lyr.CreateFeature(feat) feat = None for i in range(8): lyr.CreateField(ogr.FieldDefn('int%d' % (i + 1), ogr.OFTInteger)) lyr.DeleteFeature(1) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'fid13') lyr.CreateFeature(feat) feat = None if True: # pylint: disable=using-constant-test lyr = ds.CreateLayer('no_field', geom_type=ogr.wkbNone, srs=None) for i in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None if True: # pylint: disable=using-constant-test lyr = ds.CreateLayer('several_polygons', geom_type=ogr.wkbPolygon, srs=None) for i in range(3): for j in range(3): feat = ogr.Feature(lyr.GetLayerDefn()) x1 = 2 * i x2 = 2 * i + 1 y1 = 2 * j y2 = 2 * j + 1 geom = ogr.CreateGeometryFromWkt('POLYGON((%d %d,%d %d,%d %d,%d %d,%d %d))' % (x1, y1, x1, y2, x2, y2, x2, y1, x1, y1)) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None if True: # pylint: disable=using-constant-test lyr = ds.CreateLayer('testnotnullable', geom_type=ogr.wkbPoint, srs=None, options=['GEOMETRY_NULLABLE=NO']) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None for data in ogrtest.openfilegdb_datalist_m: lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=[]) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt(data[2])) lyr.CreateFeature(feat) for fld_name in ['id', 'str', 'smallint', 'int', 'float', 'real', 'adate', 'guid', 'nullint']: ds.ExecuteSQL('CREATE INDEX idx_%s ON point(%s)' % (fld_name, fld_name)) ds.ExecuteSQL('CREATE INDEX idx_id ON none(id)') ds.ExecuteSQL('CREATE INDEX idx_real ON big_layer(real)') ds = None gdal.Unlink('data/testopenfilegdb.gdb.zip') os.chdir('data') os.system('zip -r -9 testopenfilegdb.gdb.zip testopenfilegdb.gdb') os.chdir('..') shutil.rmtree('data/testopenfilegdb.gdb') ############################################################################### # Basic tests def test_ogr_openfilegdb_1(filename='data/testopenfilegdb.gdb.zip', version10=True): srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") ds = ogr.Open(filename) for data in ogrtest.openfilegdb_datalist: lyr_name = data[0] if lyr_name == 'multilinestring_multipart' and not version10: continue if lyr_name == 'multilinestring25D_multipart' and not version10: continue lyr = ds.GetLayerByName(lyr_name) expected_geom_type = data[1] if expected_geom_type == ogr.wkbLineString: expected_geom_type = ogr.wkbMultiLineString elif expected_geom_type == ogr.wkbLineString25D: expected_geom_type = ogr.wkbMultiLineString25D elif expected_geom_type == ogr.wkbPolygon: expected_geom_type = ogr.wkbMultiPolygon elif expected_geom_type == ogr.wkbPolygon25D: expected_geom_type = ogr.wkbMultiPolygon25D assert lyr.GetGeomType() == expected_geom_type, lyr.GetName() assert expected_geom_type is ogr.wkbNone or lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 1 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('str')).GetWidth() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('smallint')).GetSubType() == ogr.OFSTInt16 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('float')).GetSubType() == ogr.OFSTFloat32 if data[1] != ogr.wkbNone: assert lyr.GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']) == 1 feat = lyr.GetNextFeature() if data[1] != ogr.wkbNone: try: expected_wkt = data[3] except IndexError: expected_wkt = data[2] geom = feat.GetGeometryRef() if geom: geom = geom.ExportToWkt() if geom != expected_wkt and ogrtest.check_feature_geometry(feat, expected_wkt) == 1: feat.DumpReadable() pytest.fail(expected_wkt) if feat.GetField('id') != 1 or \ feat.GetField('smallint') != -13 or \ feat.GetField('int') != 123 or \ feat.GetField('float') != 1.5 or \ feat.GetField('real') != 4.56 or \ feat.GetField('adate') != "2013/12/26 12:34:56" or \ feat.GetField('guid') != "{12345678-9ABC-DEF0-1234-567890ABCDEF}" or \ (version10 and feat.GetField('xml') != "") or \ feat.GetField('binary') != "00FF7F" or \ feat.GetField('binary2') != "123456": feat.DumpReadable() pytest.fail() if version10: sql_lyr = ds.ExecuteSQL("GetLayerDefinition %s" % lyr.GetName()) assert sql_lyr is not None feat = sql_lyr.GetNextFeature() assert feat is not None feat = sql_lyr.GetNextFeature() assert feat is None lyr.ResetReading() lyr.TestCapability("foo") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("GetLayerMetadata %s" % lyr.GetName()) assert sql_lyr is not None feat = sql_lyr.GetNextFeature() assert feat is not None ds.ReleaseResultSet(sql_lyr) if version10: sql_lyr = ds.ExecuteSQL("GetLayerDefinition foo") assert sql_lyr is None sql_lyr = ds.ExecuteSQL("GetLayerMetadata foo") assert sql_lyr is None if version10: for data in ogrtest.openfilegdb_datalist_m: lyr = ds.GetLayerByName(data[0]) expected_geom_type = data[1] if expected_geom_type == ogr.wkbLineStringM: expected_geom_type = ogr.wkbMultiLineStringM elif expected_geom_type == ogr.wkbLineStringZM: expected_geom_type = ogr.wkbMultiLineStringZM elif expected_geom_type == ogr.wkbPolygonM: expected_geom_type = ogr.wkbMultiPolygonM elif expected_geom_type == ogr.wkbPolygonZM: expected_geom_type = ogr.wkbMultiPolygonZM assert lyr.GetGeomType() == expected_geom_type, data feat = lyr.GetNextFeature() try: expected_wkt = data[3] except IndexError: expected_wkt = data[2] if expected_wkt is None: if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail(data) elif ogrtest.check_feature_geometry(feat, expected_wkt) != 0: feat.DumpReadable() pytest.fail(data) ds = None def test_ogr_openfilegdb_1_92(): return test_ogr_openfilegdb_1(filename='data/testopenfilegdb92.gdb.zip', version10=False) def test_ogr_openfilegdb_1_93(): return test_ogr_openfilegdb_1(filename='data/testopenfilegdb93.gdb.zip', version10=False) ############################################################################### # Run test_ogrsf def test_ogr_openfilegdb_2(filename='data/testopenfilegdb.gdb.zip'): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro ' + filename) assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 def test_ogr_openfilegdb_2_92(): return test_ogr_openfilegdb_2(filename='data/testopenfilegdb92.gdb.zip') def test_ogr_openfilegdb_2_93(): return test_ogr_openfilegdb_2(filename='data/testopenfilegdb93.gdb.zip') ############################################################################### # Open a .gdbtable directly def test_ogr_openfilegdb_3(): ds = ogr.Open('/vsizip/data/testopenfilegdb.gdb.zip/testopenfilegdb.gdb/a00000009.gdbtable') assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr.GetName() == 'none' # Try opening a system table lyr = ds.GetLayerByName('GDB_SystemCatalog') assert lyr.GetName() == 'GDB_SystemCatalog' feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'GDB_SystemCatalog' lyr = ds.GetLayerByName('GDB_SystemCatalog') assert lyr.GetName() == 'GDB_SystemCatalog' ds = None ############################################################################### # Test use of attribute indexes def test_ogr_openfilegdb_4(): ds = ogr.Open('/vsizip/data/testopenfilegdb.gdb.zip/testopenfilegdb.gdb') lyr = ds.GetLayerByName('point') tests = [('id = 1', [1]), ('1 = id', [1]), ('id = 5', [5]), ('id = 0', []), ('id = 6', []), ('id <= 1', [1]), ('1 >= id', [1]), ('id >= 5', [5]), ('5 <= id', [5]), ('id < 1', []), ('1 > id', []), ('id >= 1', [1, 2, 3, 4, 5]), ('id > 0', [1, 2, 3, 4, 5]), ('0 < id', [1, 2, 3, 4, 5]), ('id <= 5', [1, 2, 3, 4, 5]), ('id < 6', [1, 2, 3, 4, 5]), ('id <> 0', [1, 2, 3, 4, 5]), ('id IS NOT NULL', [1, 2, 3, 4, 5]), ('id IS NULL', []), ('nullint IS NOT NULL', []), ('nullint IS NULL', [1, 2, 3, 4, 5]), ("str = 'foo_e'", []), ("str = 'foo_é'", [1, 2, 3, 4, 5]), ("str <= 'foo_é'", [1, 2, 3, 4, 5]), ("str >= 'foo_é'", [1, 2, 3, 4, 5]), ("str <> 'foo_é'", []), ("str < 'foo_é'", []), ("str > 'foo_é'", []), ('smallint = -13', [1, 2, 3, 4, 5]), ('smallint <= -13', [1, 2, 3, 4, 5]), ('smallint >= -13', [1, 2, 3, 4, 5]), ('smallint < -13', []), ('smallint > -13', []), ('int = 123', [1, 2, 3, 4, 5]), ('int <= 123', [1, 2, 3, 4, 5]), ('int >= 123', [1, 2, 3, 4, 5]), ('int < 123', []), ('int > 123', []), ('float = 1.5', [1, 2, 3, 4, 5]), ('float <= 1.5', [1, 2, 3, 4, 5]), ('float >= 1.5', [1, 2, 3, 4, 5]), ('float < 1.5', []), ('float > 1.5', []), ('real = 4.56', [1, 2, 3, 4, 5]), ('real <= 4.56', [1, 2, 3, 4, 5]), ('real >= 4.56', [1, 2, 3, 4, 5]), ('real < 4.56', []), ('real > 4.56', []), ("adate = '2013/12/26 12:34:56'", [1, 2, 3, 4, 5]), ("adate <= '2013/12/26 12:34:56'", [1, 2, 3, 4, 5]), ("adate >= '2013/12/26 12:34:56'", [1, 2, 3, 4, 5]), ("adate < '2013/12/26 12:34:56'", []), ("adate > '2013/12/26 12:34:56'", []), ("guid = '{12345678-9ABC-DEF0-1234-567890ABCDEF}'", [1, 2, 3, 4, 5]), ("guid <= '{12345678-9ABC-DEF0-1234-567890ABCDEF}'", [1, 2, 3, 4, 5]), ("guid >= '{12345678-9ABC-DEF0-1234-567890ABCDEF}'", [1, 2, 3, 4, 5]), ("guid < '{12345678-9ABC-DEF0-1234-567890ABCDEF}'", []), ("guid > '{12345678-9ABC-DEF0-1234-567890ABCDEF}'", []), ("guid = '{'", []), ("guid > '{'", [1, 2, 3, 4, 5]), ("NOT(id = 1)", [2, 3, 4, 5]), ("id = 1 OR id = -1", [1]), ("id = -1 OR id = 1", [1]), ("id = 1 OR id = 1", [1]), ("id = 1 OR id = 2", [1, 2]), # exclusive branches ("id < 3 OR id > 3", [1, 2, 4, 5]), # exclusive branches ("id > 3 OR id < 3", [1, 2, 4, 5]), # exclusive branches ("id <= 3 OR id >= 4", [1, 2, 3, 4, 5]), # exclusive branches ("id >= 4 OR id <= 3", [1, 2, 3, 4, 5]), # exclusive branches ("id < 3 OR id >= 3", [1, 2, 3, 4, 5]), ("id <= 3 OR id >= 3", [1, 2, 3, 4, 5]), ("id <= 5 OR id >= 1", [1, 2, 3, 4, 5]), ("id <= 1.5 OR id >= 2", [1, 2, 3, 4, 5]), ('id IS NULL OR id IS NOT NULL', [1, 2, 3, 4, 5]), ('float < 1.5 OR float > 1.5', []), ('float <= 1.5 OR float >= 1.5', [1, 2, 3, 4, 5]), ('float < 1.5 OR float > 2', []), ('float < 1 OR float > 2.5', []), ("str < 'foo_é' OR str > 'z'", []), ("adate < '2013/12/26 12:34:56' OR adate > '2014/01/01'", []), ("id = 1 AND id = -1", []), ("id = -1 AND id = 1", []), ("id = 1 AND id = 1", [1]), ("id = 1 AND id = 2", []), ("id <= 5 AND id >= 1", [1, 2, 3, 4, 5]), ("id <= 3 AND id >= 3", [3]), ("id = 1 AND float = 1.5", [1]), ("id BETWEEN 1 AND 5", [1, 2, 3, 4, 5]), ("id IN (1)", [1]), ("id IN (5,4,3,2,1)", [1, 2, 3, 4, 5]), ('fid = 1', [1], 0), # no index used ('fid BETWEEN 1 AND 1', [1], 0), # no index used ('fid IN (1)', [1], 0), # no index used ('fid IS NULL', [], 0), # no index used ('fid IS NOT NULL', [1, 2, 3, 4, 5], 0), # no index used ("xml <> ''", [1, 2, 3, 4, 5], 0), # no index used ("id = 1 AND xml <> ''", [1], 1), # index partially used ("xml <> '' AND id = 1", [1], 1), # index partially used ("NOT(id = 1 AND xml <> '')", [2, 3, 4, 5], 0), # no index used ("id = 1 OR xml <> ''", [1, 2, 3, 4, 5], 0), # no index used ('id = id', [1, 2, 3, 4, 5], 0), # no index used ('id = 1 + 0', [1], 0), # no index used (currently...) ] for test in tests: if len(test) == 2: (where_clause, fids) = test expected_attr_index_use = 2 else: (where_clause, fids, expected_attr_index_use) = test lyr.SetAttributeFilter(where_clause) sql_lyr = ds.ExecuteSQL('GetLayerAttrIndexUse %s' % lyr.GetName()) attr_index_use = int(sql_lyr.GetNextFeature().GetField(0)) ds.ReleaseResultSet(sql_lyr) assert attr_index_use == expected_attr_index_use, \ (where_clause, fids, expected_attr_index_use) assert lyr.GetFeatureCount() == len(fids), (where_clause, fids) for fid in fids: feat = lyr.GetNextFeature() assert feat.GetFID() == fid, (where_clause, fids) feat = lyr.GetNextFeature() assert feat is None, (where_clause, fids) lyr = ds.GetLayerByName('none') tests = [('id = 1', [1]), ('id IS NULL', [6]), ('id IS NOT NULL', [1, 2, 3, 4, 5]), ('id IS NULL OR id IS NOT NULL', [1, 2, 3, 4, 5, 6]), ('id = 1 OR id IS NULL', [1, 6]), ('id IS NULL OR id = 1', [1, 6]), ] for test in tests: if len(test) == 2: (where_clause, fids) = test expected_attr_index_use = 2 else: (where_clause, fids, expected_attr_index_use) = test lyr.SetAttributeFilter(where_clause) sql_lyr = ds.ExecuteSQL('GetLayerAttrIndexUse %s' % lyr.GetName()) attr_index_use = int(sql_lyr.GetNextFeature().GetField(0)) ds.ReleaseResultSet(sql_lyr) assert attr_index_use == expected_attr_index_use, \ (where_clause, fids, expected_attr_index_use) assert lyr.GetFeatureCount() == len(fids), (where_clause, fids) for fid in fids: feat = lyr.GetNextFeature() assert feat.GetFID() == fid, (where_clause, fids) feat = lyr.GetNextFeature() assert feat is None, (where_clause, fids) lyr = ds.GetLayerByName('big_layer') tests = [('real = 0', 86, 1), ('real = 1', 85, 2), ('real = 2', 85, 3), ('real = 3', 85, 4), ('real >= 0', 86 + 3 * 85, None), ('real < 4', 86 + 3 * 85, None), ('real > 1 AND real < 2', 0, None), ('real < 0', 0, None), ] for (where_clause, count, start) in tests: lyr.SetAttributeFilter(where_clause) assert lyr.GetFeatureCount() == count, (where_clause, count) for i in range(count): feat = lyr.GetNextFeature() assert (not (feat is None or \ (start is not None and feat.GetFID() != i * 4 + start))), (where_clause, count) feat = lyr.GetNextFeature() assert feat is None, (where_clause, count) ds = None ############################################################################### # Test opening an unzipped dataset def test_ogr_openfilegdb_5(): try: shutil.rmtree('tmp/testopenfilegdb.gdb') except OSError: pass try: gdaltest.unzip('tmp/', 'data/testopenfilegdb.gdb.zip') except OSError: pytest.skip() try: os.stat('tmp/testopenfilegdb.gdb') except OSError: pytest.skip() ds = ogr.Open('tmp/testopenfilegdb.gdb') assert ds is not None ############################################################################### # Test special SQL processing for min/max/count/sum/avg values def test_ogr_openfilegdb_6(): ds = ogr.Open('data/testopenfilegdb.gdb.zip') # With indices sql_lyr = ds.ExecuteSQL("select min(id), max(id), count(id), sum(id), avg(id), min(str), min(smallint), " "avg(smallint), min(float), avg(float), min(real), avg(real), min(adate), avg(adate), min(guid), min(nullint), avg(nullint) from point") assert sql_lyr is not None feat = sql_lyr.GetNextFeature() if feat.GetField('MIN_id') != 1 or \ feat.GetField('MAX_id') != 5 or \ feat.GetField('COUNT_id') != 5 or \ feat.GetField('SUM_id') != 15.0 or \ feat.GetField('AVG_id') != 3.0 or \ feat.GetField('MIN_str')[0:4] != 'foo_' or \ feat.GetField('MIN_smallint') != -13 or \ feat.GetField('AVG_smallint') != -13 or \ feat.GetField('MIN_float') != 1.5 or \ feat.GetField('AVG_float') != 1.5 or \ feat.GetField('MIN_real') != 4.56 or \ feat.GetField('AVG_real') != 4.56 or \ feat.GetField('MIN_adate') != '2013/12/26 12:34:56' or \ feat.GetField('AVG_adate') != '2013/12/26 12:34:56' or \ feat.GetField('MIN_guid') != '{12345678-9ABC-DEF0-1234-567890ABCDEF}' or \ feat.IsFieldSet('MIN_nullint') or \ feat.IsFieldSet('AVG_nullint'): feat.DumpReadable() ds.ReleaseResultSet(sql_lyr) pytest.fail() ds.ReleaseResultSet(sql_lyr) # No index sql_lyr = ds.ExecuteSQL("select min(id), avg(id) from multipoint") feat = sql_lyr.GetNextFeature() if feat.GetField('MIN_id') != 1 or \ feat.GetField('AVG_id') != 3.0: feat.DumpReadable() ds.ReleaseResultSet(sql_lyr) pytest.fail() ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test special SQL processing for ORDER BY def test_ogr_openfilegdb_7(): ds = ogr.Open('data/testopenfilegdb.gdb.zip') tests = [ # Optimized: ("select * from point order by id", 5, 1, 1), ("select id, str from point order by id desc", 5, 5, 1), ("select * from point where id = 1 order by id", 1, 1, 1), ("select * from big_layer order by real", 86 + 3 * 85, 1, 1), ("select * from big_layer order by real desc", 86 + 3 * 85, 4 * 85, 1), # Invalid : ("select foo from", None, None, None), ("select foo from bar", None, None, None), ("select * from point order by foo", None, None, None), # Non-optimized : ("select * from point order by xml", None, None, 0), ("select fid from point order by id", None, None, 0), ("select cast(id as float) from point order by id", None, None, 0), ("select distinct id from point order by id", None, None, 0), ("select 1 from point order by id", None, None, 0), ("select count(*) from point order by id", None, None, 0), ("select * from point order by nullint", None, None, 0), ("select * from point where id = 1 or id = 2 order by id", None, None, 0), ("select * from point where id = 1 order by id, float", None, None, 0), ("select * from point where float > 0 order by id", None, None, 0), ] for (sql, feat_count, first_fid, expected_optimized) in tests: if expected_optimized is None: gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL(sql) if expected_optimized is None: gdal.PopErrorHandler() if expected_optimized is None: if sql_lyr is not None: ds.ReleaseResultSet(sql_lyr) pytest.fail(sql, feat_count, first_fid) continue assert sql_lyr is not None, (sql, feat_count, first_fid) if expected_optimized: if sql_lyr.GetFeatureCount() != feat_count: ds.ReleaseResultSet(sql_lyr) pytest.fail(sql, feat_count, first_fid) feat = sql_lyr.GetNextFeature() if feat.GetFID() != first_fid: ds.ReleaseResultSet(sql_lyr) feat.DumpReadable() pytest.fail(sql, feat_count, first_fid) ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('GetLastSQLUsedOptimizedImplementation') optimized = int(sql_lyr.GetNextFeature().GetField(0)) ds.ReleaseResultSet(sql_lyr) assert optimized == expected_optimized, (sql, feat_count, first_fid) if optimized and 'big_layer' not in sql: import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/testopenfilegdb.gdb.zip -sql "%s"' % sql) assert ret.find('INFO') != -1 and ret.find('ERROR') == -1, \ (sql, feat_count, first_fid) ############################################################################### # Test reading a .gdbtable without .gdbtablx def test_ogr_openfilegdb_8(): ds = ogr.Open('data/testopenfilegdb.gdb.zip') dict_feat_count = {} for i in range(ds.GetLayerCount()): lyr = ds.GetLayer(i) dict_feat_count[lyr.GetName()] = lyr.GetFeatureCount() ds = None dict_feat_count2 = {} gdal.SetConfigOption('OPENFILEGDB_IGNORE_GDBTABLX', 'YES') ds = ogr.Open('data/testopenfilegdb.gdb.zip') for i in range(ds.GetLayerCount()): lyr = ds.GetLayer(i) dict_feat_count2[lyr.GetName()] = lyr.GetFeatureCount() gdal.SetConfigOption('OPENFILEGDB_IGNORE_GDBTABLX', None) assert dict_feat_count == dict_feat_count2 lyr = ds.GetLayerByName('hole') # Not exactly in the order that one might expect, but logical when # looking at the structure of the .gdbtable expected_str = ['fid13', 'fid2', 'fid3', 'fid4', 'fid5', 'fid6', 'fid7', 'fid8', 'fid9', 'fid10', 'fid11', None] i = 0 feat = lyr.GetNextFeature() while feat is not None: if feat.GetField('str') != expected_str[i]: feat.DumpReadable() pytest.fail() i = i + 1 feat = lyr.GetNextFeature() ############################################################################### # Test reading a .gdbtable outside a .gdb def test_ogr_openfilegdb_9(): try: os.stat('tmp/testopenfilegdb.gdb') except OSError: pytest.skip() shutil.copy('tmp/testopenfilegdb.gdb/a00000009.gdbtable', 'tmp/a00000009.gdbtable') shutil.copy('tmp/testopenfilegdb.gdb/a00000009.gdbtablx', 'tmp/a00000009.gdbtablx') ds = ogr.Open('tmp/a00000009.gdbtable') assert ds is not None lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ############################################################################### # Test various error conditions def fuzz(filename, offset): f = open(filename, "rb+") f.seek(offset, 0) v = ord(f.read(1)) f.seek(offset, 0) if sys.version_info >= (3, 0, 0): f.write(('%c' % (255 - v)).encode('ISO-8859-1')) else: f.write('%c' % (255 - v)) f.close() return (filename, offset, v) def unfuzz(backup): (filename, offset, v) = backup f = open(filename, "rb+") f.seek(offset, 0) if sys.version_info >= (3, 0, 0): f.write(('%c' % (v)).encode('ISO-8859-1')) else: f.write('%c' % (v)) f.close() def test_ogr_openfilegdb_10(): try: os.stat('tmp/testopenfilegdb.gdb') except OSError: pytest.skip() shutil.copytree('tmp/testopenfilegdb.gdb', 'tmp/testopenfilegdb_fuzzed.gdb') if False: # pylint: disable=using-constant-test for filename in ['tmp/testopenfilegdb_fuzzed.gdb/a00000001.gdbtable', 'tmp/testopenfilegdb_fuzzed.gdb/a00000001.gdbtablx']: errors = set() offsets = [] last_error_msg = '' last_offset = -1 for offset in range(os.stat(filename).st_size): # print(offset) backup = fuzz(filename, offset) gdal.ErrorReset() # print(offset) ds = ogr.Open('tmp/testopenfilegdb_fuzzed.gdb') error_msg = gdal.GetLastErrorMsg() feat = None if ds is not None: gdal.ErrorReset() lyr = ds.GetLayerByName('GDB_SystemCatalog') if error_msg == '': error_msg = gdal.GetLastErrorMsg() if lyr is not None: gdal.ErrorReset() feat = lyr.GetNextFeature() if error_msg == '': error_msg = gdal.GetLastErrorMsg() if feat is None or error_msg != '': if offset - last_offset >= 4 or last_error_msg != error_msg: if error_msg != '' and error_msg not in errors: errors.add(error_msg) offsets.append(offset) else: offsets.append(offset) last_offset = offset last_error_msg = error_msg ds = None unfuzz(backup) print(offsets) for filename in ['tmp/testopenfilegdb_fuzzed.gdb/a00000004.gdbindexes', 'tmp/testopenfilegdb_fuzzed.gdb/a00000004.CatItemsByPhysicalName.atx']: errors = set() offsets = [] last_error_msg = '' last_offset = -1 for offset in range(os.stat(filename).st_size): # print(offset) backup = fuzz(filename, offset) gdal.ErrorReset() # print(offset) ds = ogr.Open('tmp/testopenfilegdb_fuzzed.gdb') error_msg = gdal.GetLastErrorMsg() feat = None if ds is not None: gdal.ErrorReset() lyr = ds.GetLayerByName('GDB_Items') lyr.SetAttributeFilter("PhysicalName = 'NO_FIELD'") if error_msg == '': error_msg = gdal.GetLastErrorMsg() if lyr is not None: gdal.ErrorReset() feat = lyr.GetNextFeature() if error_msg == '': error_msg = gdal.GetLastErrorMsg() if feat is None or error_msg != '': if offset - last_offset >= 4 or last_error_msg != error_msg: if error_msg != '' and error_msg not in errors: errors.add(error_msg) offsets.append(offset) else: offsets.append(offset) last_offset = offset last_error_msg = error_msg ds = None unfuzz(backup) print(offsets) else: for (filename, offsets) in [('tmp/testopenfilegdb_fuzzed.gdb/a00000001.gdbtable', [4, 5, 6, 7, 32, 33, 41, 42, 52, 59, 60, 63, 64, 72, 73, 77, 78, 79, 80, 81, 101, 102, 104, 105, 111, 180]), ('tmp/testopenfilegdb_fuzzed.gdb/a00000001.gdbtablx', [4, 7, 11, 12, 16, 31, 5136, 5140, 5142, 5144])]: for offset in offsets: backup = fuzz(filename, offset) gdal.PushErrorHandler('CPLQuietErrorHandler') gdal.ErrorReset() ds = ogr.Open('tmp/testopenfilegdb_fuzzed.gdb') error_msg = gdal.GetLastErrorMsg() feat = None if ds is not None: gdal.ErrorReset() lyr = ds.GetLayerByName('GDB_SystemCatalog') if error_msg == '': error_msg = gdal.GetLastErrorMsg() if lyr is not None: gdal.ErrorReset() feat = lyr.GetNextFeature() if error_msg == '': error_msg = gdal.GetLastErrorMsg() if feat is not None and error_msg == '': print('%s: expected problem at offset %d, but did not find' % (filename, offset)) ds = None gdal.PopErrorHandler() unfuzz(backup) for (filename, offsets) in [('tmp/testopenfilegdb_fuzzed.gdb/a00000004.gdbindexes', [0, 4, 5, 44, 45, 66, 67, 100, 101, 116, 117, 148, 149, 162, 163, 206, 207, 220, 221, 224, 280, 281]), ('tmp/testopenfilegdb_fuzzed.gdb/a00000004.CatItemsByPhysicalName.atx', [4, 12, 8196, 8300, 8460, 8620, 8780, 8940, 9100, 12290, 12294, 12298])]: for offset in offsets: # print(offset) backup = fuzz(filename, offset) gdal.PushErrorHandler('CPLQuietErrorHandler') gdal.ErrorReset() ds = ogr.Open('tmp/testopenfilegdb_fuzzed.gdb') error_msg = gdal.GetLastErrorMsg() feat = None if ds is not None: gdal.ErrorReset() lyr = ds.GetLayerByName('GDB_Items') lyr.SetAttributeFilter("PhysicalName = 'NO_FIELD'") if error_msg == '': error_msg = gdal.GetLastErrorMsg() if lyr is not None: gdal.ErrorReset() feat = lyr.GetNextFeature() if error_msg == '': error_msg = gdal.GetLastErrorMsg() if feat is not None and error_msg == '': print('%s: expected problem at offset %d, but did not find' % (filename, offset)) ds = None gdal.PopErrorHandler() unfuzz(backup) ############################################################################### # Test spatial filtering SPI_IN_BUILDING = 0 SPI_COMPLETED = 1 SPI_INVALID = 2 def get_spi_state(ds, lyr): sql_lyr = ds.ExecuteSQL('GetLayerSpatialIndexState %s' % lyr.GetName()) value = int(sql_lyr.GetNextFeature().GetField(0)) ds.ReleaseResultSet(sql_lyr) return value def test_ogr_openfilegdb_11(): # Test building spatial index with GetFeatureCount() ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('several_polygons') assert get_spi_state(ds, lyr) == SPI_IN_BUILDING lyr.ResetReading() assert get_spi_state(ds, lyr) == SPI_IN_BUILDING assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 lyr.SetSpatialFilterRect(0.25, 0.25, 0.5, 0.5) assert lyr.GetFeatureCount() == 1 assert get_spi_state(ds, lyr) == SPI_COMPLETED # Should return cached value assert lyr.GetFeatureCount() == 1 # Should use index c = 0 feat = lyr.GetNextFeature() while feat is not None: c = c + 1 feat = lyr.GetNextFeature() assert c == 1 feat = None lyr = None ds = None # Test iterating without spatial index already built ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('several_polygons') lyr.SetSpatialFilterRect(0.25, 0.25, 0.5, 0.5) c = 0 feat = lyr.GetNextFeature() assert get_spi_state(ds, lyr) == SPI_IN_BUILDING while feat is not None: c = c + 1 feat = lyr.GetNextFeature() assert c == 1 assert get_spi_state(ds, lyr) == SPI_COMPLETED feat = None lyr = None ds = None # Test GetFeatureCount() without spatial index already built, with no matching feature # when GEOS is available if ogrtest.have_geos(): expected_count = 0 else: expected_count = 5 ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('multipolygon') lyr.SetSpatialFilterRect(1.4, 0.4, 1.6, 0.6) assert lyr.GetFeatureCount() == expected_count lyr = None ds = None # Test iterating without spatial index already built, with no matching feature # when GEOS is available ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('multipolygon') lyr.SetSpatialFilterRect(1.4, 0.4, 1.6, 0.6) c = 0 feat = lyr.GetNextFeature() while feat is not None: c = c + 1 feat = lyr.GetNextFeature() assert c == expected_count assert lyr.GetFeatureCount() == expected_count feat = None lyr = None ds = None # GetFeature() should not impact spatial index building ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('several_polygons') lyr.SetSpatialFilterRect(0.25, 0.25, 0.5, 0.5) feat = lyr.GetFeature(1) feat = lyr.GetFeature(1) assert get_spi_state(ds, lyr) == SPI_IN_BUILDING feat = lyr.GetNextFeature() while feat is not None: feat = lyr.GetNextFeature() assert get_spi_state(ds, lyr) == SPI_COMPLETED lyr.ResetReading() c = 0 feat = lyr.GetNextFeature() while feat is not None: c = c + 1 feat = lyr.GetNextFeature() assert c == 1 assert get_spi_state(ds, lyr) == SPI_COMPLETED # This will create an array of filtered features lyr.SetSpatialFilterRect(0.25, 0.25, 0.5, 0.5) assert lyr.TestCapability(ogr.OLCFastSetNextByIndex) == 1 # Test SetNextByIndex() with filtered features assert lyr.SetNextByIndex(-1) != 0 assert lyr.SetNextByIndex(1) != 0 assert lyr.SetNextByIndex(0) == 0 feat = lyr.GetNextFeature() assert feat.GetFID() == 1 assert get_spi_state(ds, lyr) == SPI_COMPLETED feat = None lyr = None ds = None # SetNextByIndex() impacts spatial index building ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('multipolygon') lyr.SetNextByIndex(3) assert get_spi_state(ds, lyr) == SPI_INVALID feat = None lyr = None ds = None # and ResetReading() as well ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('multipolygon') feat = lyr.GetNextFeature() lyr.ResetReading() assert get_spi_state(ds, lyr) == SPI_INVALID feat = None lyr = None ds = None # and SetAttributeFilter() with an index too ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('point') lyr.SetAttributeFilter('id = 1') assert get_spi_state(ds, lyr) == SPI_INVALID feat = None lyr = None ds = None ############################################################################### # Test opening a FGDB with both SRID and LatestSRID set (#5638) def test_ogr_openfilegdb_12(): ds = ogr.Open('/vsizip/data/test3005.gdb.zip') lyr = ds.GetLayer(0) got_wkt = lyr.GetSpatialRef().ExportToWkt() sr = osr.SpatialReference() sr.ImportFromEPSG(3005) expected_wkt = sr.ExportToWkt() assert got_wkt == expected_wkt ds = None ############################################################################### # Test opening a FGDB v9 with a non spatial table (#5673) def test_ogr_openfilegdb_13(): ds = ogr.Open('/vsizip/data/ESSENCE_NAIPF_ORI_PROV_sub93.gdb.zip') lyr = ds.GetLayer(0) assert lyr.GetName() == 'DDE_ESSEN_NAIPF_ORI_VUE' assert lyr.GetSpatialRef() is None assert lyr.GetGeomType() == ogr.wkbNone f = lyr.GetNextFeature() if f.GetField('GEOCODE') != '-673985,22+745574,77': f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test not nullable fields def test_ogr_openfilegdb_14(): ds = ogr.Open('data/testopenfilegdb.gdb.zip') lyr = ds.GetLayerByName('testnotnullable') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 ds = None ############################################################################### # Test default values def test_ogr_openfilegdb_15(): ds = ogr.Open('data/test_default_val.gdb.zip') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('STR')).GetDefault() == "'default_val'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('STR')).GetWidth() == 50 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('INT32')).GetDefault() == "123456788" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('INT16')).GetDefault() == "12345" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('FLOAT32')).GetDefault().find('1.23') == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('FLOAT64')).GetDefault().find('1.23456') == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('DATETIME')).GetDefault() == "'2015/06/30 12:34:56'" ############################################################################### # Read layers with sparse pages def test_ogr_openfilegdb_16(): ds = ogr.Open('data/sparse.gdb.zip') lyr = ds.GetLayer(0) for fid in [2, 3, 4, 7, 8, 9, 10, 2049, 8191, 16384, 10000000, 10000001]: f = lyr.GetNextFeature() assert f.GetFID() == fid f = lyr.GetFeature(100000) assert f is None f = lyr.GetFeature(10000000 - 1) assert f is None f = lyr.GetNextFeature() assert f is None f = lyr.GetFeature(16384) assert f is not None ############################################################################### # Read a MULTILINESTRING ZM with a dummy M array (#6528) def test_ogr_openfilegdb_17(): ds = ogr.Open('data/multilinestringzm_with_dummy_m_array.gdb.zip') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef() is not None ############################################################################### # Read curves def test_ogr_openfilegdb_18(): ds = ogr.Open('data/curves.gdb') lyr = ds.GetLayerByName('line') ds_ref = ogr.Open('data/curves_line.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) lyr = ds.GetLayerByName('polygon') ds_ref = ogr.Open('data/curves_polygon.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) ds = ogr.Open('data/curve_circle_by_center.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/curve_circle_by_center.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) ############################################################################### # Test opening '.' def test_ogr_openfilegdb_19(): os.chdir('data/curves.gdb') ds = ogr.Open('.') os.chdir('../..') assert ds is not None ############################################################################### # Read polygons with M component where the M of the closing point is not the # one of the starting point (#7017) def test_ogr_openfilegdb_20(): ds = ogr.Open('data/filegdb_polygonzm_m_not_closing_with_curves.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/filegdb_polygonzm_m_not_closing_with_curves.gdb.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToIsoWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToIsoWkt()) ds = ogr.Open('data/filegdb_polygonzm_nan_m_with_curves.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/filegdb_polygonzm_nan_m_with_curves.gdb.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToIsoWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToIsoWkt()) ############################################################################### # Test selecting FID column with OGRSQL def test_ogr_openfilegdb_21(): ds = ogr.Open('data/curves.gdb') sql_lyr = ds.ExecuteSQL('SELECT OBJECTID FROM polygon WHERE OBJECTID = 2') assert sql_lyr is not None f = sql_lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) lyr = ds.GetLayerByName('polygon') lyr.SetAttributeFilter('OBJECTID = 2') f = lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1369 # where a polygon with inner rings has its exterior ring with wrong orientation def test_ogr_openfilegdb_weird_winding_order(): if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('/vsizip/data/weird_winding_order_fgdb.zip/roads_clip Drawing.gdb') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryCount() == 1 assert g.GetGeometryRef(0).GetGeometryCount() == 17 ############################################################################### # Cleanup def test_ogr_openfilegdb_cleanup(): if ogrtest.fgdb_drv is not None: ogrtest.fgdb_drv.Register() try: shutil.rmtree('tmp/testopenfilegdb.gdb') except OSError: pass try: os.remove('tmp/a00000009.gdbtable') os.remove('tmp/a00000009.gdbtablx') except OSError: pass try: shutil.rmtree('tmp/testopenfilegdb_fuzzed.gdb') except OSError: pass gdalautotest-3.0.4/ogr/ogr_db2.py0000755003401500001440000001567613614005324016327 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: Test DB2 vector driver # # Author: David Adler # ############################################################################### # Copyright (c) 2015, David Adler # # 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. ############################################################################### # Before this test is run with a real database connection, # set DB2_TEST_SERVER to point to the server and table to be used, like: # DB2_TEST_SERVER=Database=SAMP105;DSN=SAMP105A;tables=TEST.ZIPPOINT # or # DB2_TEST_SERVER=Database=SAMP105;Driver={IBM DB2 CLIDRIVER};Hostname=<>;Port=<>;PROTOCOL=TCPIP;UID=<>;PWD=<>;tables=TEST.ZIPPOINT # # Also before running, the db2 setup script must be run to create the # needed SRS and test tables # In a DB2 command window, connect to a database and issue a command like # db2 -tvf ogr\data\db2\db2_setup.sql # # These tests currently only run on Windows import os import ogrtest from osgeo import ogr import pytest ############################################################################### # Test if driver is available def test_ogr_db2_check_driver(): ogrtest.db2_drv = None ogrtest.db2_drv = ogr.GetDriverByName('DB2ODBC') if ogrtest.db2_drv is None: pytest.skip() ############################################################################### # Test if environment variable for DB2 connection is set and we can connect def test_ogr_db2_init(): if ogrtest.db2_drv is None: pytest.skip() if 'DB2_TEST_SERVER' in os.environ: ogrtest.db2_test_server = "DB2ODBC:" + os.environ['DB2_TEST_SERVER'] else: ogrtest.db2_drv = None pytest.skip('Environment variable DB2_TEST_SERVER not found') ############################################################################### # Test GetFeatureCount() def test_ogr_db2_GetFeatureCount(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None count = lyr.GetFeatureCount() assert count == 5, 'did not get expected feature count' ############################################################################### # Test GetSpatialRef() def test_ogr_db2_GetSpatialRef(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None sr = lyr.GetSpatialRef() assert sr is not None, 'did not get expected srs' txt = sr.ExportToWkt() assert txt.find('GEOGCS[\"GCS_WGS_1984') != -1, 'did not get expected srs' ############################################################################### # Test GetExtent() def test_ogr_db2_GetExtent(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None extent = lyr.GetExtent() assert extent is not None, 'did not get extent' assert extent == (-122.030745, -121.95672, 37.278665, 37.440885), \ 'did not get expected extent' ############################################################################### # Test GetFeature() def test_ogr_db2_GetFeature(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None feat = lyr.GetFeature(5) assert feat is not None, 'did not get a feature' if feat.GetField('ZIP') != '95008': feat.DumpReadable() pytest.fail('did not get expected feature') ############################################################################### # Test SetSpatialFilter() def test_ogr_db2_SetSpatialFilter(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None # set a query envelope so we only get one feature lyr.SetSpatialFilterRect(-122.02, 37.42, -122.01, 37.43) count = lyr.GetFeatureCount() assert count == 1, 'did not get expected feature count (1)' feat = lyr.GetNextFeature() assert feat is not None, 'did not get a feature' if feat.GetField('ZIP') != '94089': feat.DumpReadable() pytest.fail('did not get expected feature') # start over with a larger envelope to get 3 out of 5 of the points lyr.ResetReading() lyr.SetSpatialFilterRect(-122.04, 37.30, -121.80, 37.43) count = lyr.GetFeatureCount() assert count == 3, 'did not get expected feature count (3)' # iterate through the features to make sure we get the same count count = 0 feat = lyr.GetNextFeature() while feat is not None: count = count + 1 feat = lyr.GetNextFeature() assert count == 3, 'did not get expected feature count (3)' # # test what capabilities the DB2 driver provides # def test_ogr_db2_capabilities(): if ogrtest.db2_drv is None: pytest.skip() ds = ogr.Open(ogrtest.db2_test_server) assert ds is not None layer = ds.GetLayer() capabilities = [ ogr.OLCRandomRead, ogr.OLCSequentialWrite, ogr.OLCRandomWrite, ogr.OLCFastSpatialFilter, ogr.OLCFastFeatureCount, ogr.OLCFastGetExtent, ogr.OLCCreateField, ogr.OLCDeleteField, ogr.OLCReorderFields, ogr.OLCAlterFieldDefn, ogr.OLCTransactions, ogr.OLCDeleteFeature, ogr.OLCFastSetNextByIndex, ogr.OLCStringsAsUTF8, ogr.OLCIgnoreFields ] print("Layer Capabilities:") for cap in capabilities: print(" %s = %s" % (cap, layer.TestCapability(cap))) def ogr_db2_listdrivers(): cnt = ogr.GetDriverCount() formatsList = [] # Empty List for i in range(cnt): driver = ogr.GetDriver(i) driverName = driver.GetName() # print driverName if driverName not in formatsList: formatsList.append(driverName) formatsList.sort() # Sorting the messy list of ogr drivers for i in formatsList: print(i) gdalautotest-3.0.4/ogr/ogr_sde.py0000755003401500001440000002305013614005324016414 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_sde.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR ArcSDE driver. # Author: Howard Butler # ############################################################################### # Copyright (c) 2008, Howard Butler # # 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 ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Open ArcSDE datasource. sde_server = '172.16.1.193' sde_port = '5151' sde_db = 'sde' sde_user = 'sde' sde_password = 'sde' gdaltest.sde_dr = None try: gdaltest.sde_dr = ogr.GetDriverByName('SDE') except: pass def test_ogr_sde_1(): "Test basic opening of a database" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(base) if ds is None: gdaltest.sde_dr = None pytest.skip("Could not open %s" % base) ds.Destroy() ds = ogr.Open(base, update=1) ds.Destroy() def test_ogr_sde_2(): "Test creation of a layer" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) ds = ogr.Open(base, update=1) lyr = ds.CreateLayer('SDE.TPOLY', geom_type=ogr.wkbPolygon, srs=shp_lyr.GetSpatialRef(), options=['OVERWRITE=YES']) # lyr = ds.CreateLayer( 'SDE.TPOLY' ,geom_type=ogr.wkbPolygon) ogrtest.quick_create_layer_def(lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('WHEN', ogr.OFTDateTime)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() def test_ogr_sde_3(): "Test basic version locking" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT' % (sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(base, update=1) ds2 = ogr.Open(base, update=1) assert ds2 is None, 'A locked version was able to be opened' ds.Destroy() def test_ogr_sde_4(): "Test basic version creation" if gdaltest.sde_dr is None: pytest.skip() version_name = 'TESTING' gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'TRUE') base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password, version_name) ds = ogr.Open(base, update=1) ds.Destroy() gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'FALSE') base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password, version_name) ds = ogr.Open(base, update=1) ds.Destroy() def test_ogr_sde_5(): "Test versioned editing" if gdaltest.sde_dr is None: pytest.skip() version_name = 'TESTING' gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'TRUE') base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password, version_name) ds = ogr.Open(base, update=1) l1 = ds.GetLayerByName('SDE.TPOLY') f1 = l1.GetFeature(1) f1.SetField("PRFEDEA", 'SDE.TESTING') l1.SetFeature(f1) ds.Destroy() del ds default = 'DEFAULT' gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'FALSE') default = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password, default) # print default ds2 = ogr.Open(default, update=1) l2 = ds2.GetLayerByName('SDE.TPOLY') f2 = l2.GetFeature(1) f2.SetField("PRFEDEA", 'SDE.DEFAULT') f2.SetField("WHEN", 2008, 3, 19, 16, 15, 00, 0) l2.SetFeature(f2) ds2.Destroy() del ds2 ds3 = ogr.Open(base) l3 = ds3.GetLayerByName('SDE.TPOLY') f3 = l3.GetFeature(1) assert f3.GetField("PRFEDEA") == "SDE.TESTING", \ 'versioned editing failed for child version SDE.TESTING' ds3.Destroy() del ds3 ds4 = ogr.Open(default) l4 = ds4.GetLayerByName('SDE.TPOLY') f4 = l4.GetFeature(1) assert f4.GetField("PRFEDEA") == "SDE.DEFAULT", \ 'versioned editing failed for parent version SDE.DEFAULT' idx = f4.GetFieldIndex('WHEN') df = f4.GetField(idx) if df != '2008/03/19 16:15:00': gdaltest.post_reason("datetime handling did not work -- expected '2008/03/19 16:15:00' got '%s' " % df) ds4.Destroy() del ds4 def test_ogr_sde_6(): "Extent fetching" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT' % ( sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(base, update=1) l1 = ds.GetLayerByName('SDE.TPOLY') extent = l1.GetExtent(force=0) if extent != (0.0, 2147483645.0, 0.0, 2147483645.0): gdaltest.post_reason("unforced extent did not equal expected value") extent = l1.GetExtent(force=1) if extent != (478316.0, 481645.0, 4762881.0, 4765611.0): gdaltest.post_reason("forced extent did not equal expected value") def test_ogr_sde_7(): "Bad layer test" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT' % ( sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(base, update=1) l1 = ds.GetLayerByName('SDE.TPOLY2') if l1: gdaltest.post_reason("we got a layer when we should not have") ds.Destroy() default = 'DEFAULT' gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'FALSE') default = 'SDE:%s,%s,%s,%s,%s,SDE.TPOLY,SDE.DEFAULT,%s' % ( sde_server, sde_port, sde_db, sde_user, sde_password, default) ds = ogr.Open(default, update=1) l1 = ds.GetLayerByName('SDE.TPOLY2') if l1: gdaltest.post_reason("we got a layer when we should not have") ds.Destroy() default = 'DEFAULT' gdal.SetConfigOption('SDE_VERSIONOVERWRITE', 'FALSE') default = 'SDE:%s,%s,%s,%s,%s' % ( sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(default) l1 = ds.GetLayerByName('SDE.TPOLY2') if l1: gdaltest.post_reason("we got a layer when we should not have") ds.Destroy() def test_ogr_sde_8(): "Test spatial references" if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) ref = osr.SpatialReference() ref.ImportFromWkt('LOCAL_CS["IMAGE"]') ds = ogr.Open(base, update=1) lyr = ds.CreateLayer('SDE.TPOLY', geom_type=ogr.wkbPolygon, srs=ref, options=['OVERWRITE=YES']) ref.ImportFromEPSG(4326) lyr = ds.CreateLayer('SDE.TPOLY', geom_type=ogr.wkbPolygon, srs=ref, options=['OVERWRITE=YES']) ogrtest.quick_create_layer_def(lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('WHEN', ogr.OFTDateTime)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() def test_ogr_sde_cleanup(): if gdaltest.sde_dr is None: pytest.skip() base = 'SDE:%s,%s,%s,%s,%s' % (sde_server, sde_port, sde_db, sde_user, sde_password) ds = ogr.Open(base, update=1) ds.DeleteLayer('%s.%s' % (sde_user.upper(), 'TPOLY')) ds.Destroy() gdalautotest-3.0.4/ogr/ogr_style.py0000755003401500001440000000763713614005324017016 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_style.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Style testing. # 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 ogr from osgeo import gdal ############################################################################### # # def test_ogr_style_styletable(): style_table = ogr.StyleTable() style_table.AddStyle("style1_normal", 'SYMBOL(id:"http://style1_normal",c:#67452301)') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = style_table.SaveStyleTable('/nonexistingdir/nonexistingfile') gdal.PopErrorHandler() assert ret == 0 assert style_table.SaveStyleTable("/vsimem/out.txt") == 1 style_table = None style_table = ogr.StyleTable() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = style_table.LoadStyleTable('/nonexistent') gdal.PopErrorHandler() assert ret == 0 assert style_table.LoadStyleTable('/vsimem/out.txt') == 1 gdal.Unlink('/vsimem/out.txt') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = style_table.Find("non_existing_style") gdal.PopErrorHandler() assert ret is None assert style_table.Find("style1_normal") == 'SYMBOL(id:"http://style1_normal",c:#67452301)' style = style_table.GetNextStyle() assert style == 'SYMBOL(id:"http://style1_normal",c:#67452301)' style_name = style_table.GetLastStyleName() assert style_name == 'style1_normal' style = style_table.GetNextStyle() assert style is None style_table.ResetStyleStringReading() style = style_table.GetNextStyle() assert style is not None # GetStyleTable()/SetStyleTable() on data source ds = ogr.GetDriverByName('Memory').CreateDataSource('') assert ds.GetStyleTable() is None ds.SetStyleTable(None) assert ds.GetStyleTable() is None ds.SetStyleTable(style_table) style_table2 = ds.GetStyleTable() style = style_table2.GetNextStyle() assert style == 'SYMBOL(id:"http://style1_normal",c:#67452301)' # GetStyleTable()/SetStyleTable() on layer lyr = ds.CreateLayer('foo') assert lyr.GetStyleTable() is None lyr.SetStyleTable(None) assert lyr.GetStyleTable() is None lyr.SetStyleTable(style_table) style_table2 = lyr.GetStyleTable() style = style_table2.GetNextStyle() assert style == 'SYMBOL(id:"http://style1_normal",c:#67452301)' ds = None ############################################################################### # Build tests runner gdalautotest-3.0.4/ogr/ogr_rfc35_sqlite.py0000755003401500001440000002701113614005324020145 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_rfc35_sqlite.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC35 for SQLite 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 from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Initiate the test file def test_ogr_rfc35_sqlite_1(): gdaltest.rfc35_sqlite_ds = None gdaltest.rfc35_sqlite_ds_name = None sqlite_dr = ogr.GetDriverByName('SQLite') if sqlite_dr is None: pytest.skip() gdal.Unlink('tmp/rfc35_test.sqlite') # 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') gdaltest.rfc35_sqlite_ds_name = '/vsimem/rfc35_test.sqlite' gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.rfc35_sqlite_ds = ogr.GetDriverByName('SQLite').CreateDataSource(gdaltest.rfc35_sqlite_ds_name) gdal.PopErrorHandler() if gdaltest.rfc35_sqlite_ds is None: gdaltest.rfc35_sqlite_ds_name = 'tmp/rfc35_test.sqlite' gdaltest.rfc35_sqlite_ds = ogr.GetDriverByName('SQLite').CreateDataSource(gdaltest.rfc35_sqlite_ds_name) lyr = gdaltest.rfc35_sqlite_ds.CreateLayer('rfc35_test') lyr.ReorderFields([]) fd = ogr.FieldDefn('foo5', ogr.OFTString) fd.SetWidth(5) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo0') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('bar10', ogr.OFTString) fd.SetWidth(10) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo1') feat.SetField(1, 'bar1') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baz15', ogr.OFTString) fd.SetWidth(15) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo2') feat.SetField(1, 'bar2_01234') feat.SetField(2, 'baz2_0123456789') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baw20', ogr.OFTString) fd.SetWidth(20) lyr.CreateField(fd) ############################################################################### # Test ReorderField() def Truncate(val, lyr_defn, fieldname): # pylint: disable=unused-argument # Mem driver doesn't actually truncate return val def CheckFeatures(lyr, field1='foo5', field2='bar10', field3='baz15', field4='baw20'): expected_values = [ ['foo0', None, None, None], ['foo1', 'bar1', None, None], ['foo2', 'bar2_01234', 'baz2_0123456789', None], ['foo3', 'bar3_01234', 'baz3_0123456789', 'baw3_012345678901234'] ] lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() i = 0 while feat is not None: if (field1 is not None and feat.GetField(field1) != Truncate(expected_values[i][0], lyr_defn, field1)) or \ (field2 is not None and feat.GetField(field2) != Truncate(expected_values[i][1], lyr_defn, field2)) or \ (field3 is not None and feat.GetField(field3) != Truncate(expected_values[i][2], lyr_defn, field3)) or \ (field4 is not None and feat.GetField(field4) != Truncate(expected_values[i][3], lyr_defn, field4)): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() i = i + 1 def CheckColumnOrder(lyr, expected_order): lyr_defn = lyr.GetLayerDefn() for i, exp_order in enumerate(expected_order): assert lyr_defn.GetFieldDefn(i).GetName() == exp_order def Check(lyr, expected_order): CheckColumnOrder(lyr, expected_order) CheckFeatures(lyr) def test_ogr_rfc35_sqlite_2(): if gdaltest.rfc35_sqlite_ds is None: pytest.skip() lyr = gdaltest.rfc35_sqlite_ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCReorderFields) == 1 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo3') feat.SetField(1, 'bar3_01234') feat.SetField(2, 'baz3_0123456789') feat.SetField(3, 'baw3_012345678901234') lyr.CreateFeature(feat) feat = None assert lyr.ReorderField(1, 3) == 0 Check(lyr, ['foo5', 'baz15', 'baw20', 'bar10']) lyr.ReorderField(3, 1) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 2) Check(lyr, ['bar10', 'baz15', 'foo5', 'baw20']) lyr.ReorderField(2, 0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 1) Check(lyr, ['bar10', 'foo5', 'baz15', 'baw20']) lyr.ReorderField(1, 0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderFields([3, 2, 1, 0]) Check(lyr, ['baw20', 'baz15', 'bar10', 'foo5']) lyr.ReorderFields([3, 2, 1, 0]) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([0, 0, 0, 0]) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # Test AlterFieldDefn() for change of name and width def test_ogr_rfc35_sqlite_3(): if gdaltest.rfc35_sqlite_ds is None: pytest.skip() lyr = gdaltest.rfc35_sqlite_ds.GetLayer(0) fd = ogr.FieldDefn("baz25", ogr.OFTString) fd.SetWidth(25) lyr_defn = lyr.GetLayerDefn() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(-1, fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(lyr_defn.GetFieldCount(), fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz15"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz25') fd = ogr.FieldDefn("baz5", ogr.OFTString) fd.SetWidth(5) lyr_defn = lyr.GetLayerDefn() lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz25"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz5') lyr_defn = lyr.GetLayerDefn() fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('baz5')) assert fld_defn.GetWidth() == 5 CheckFeatures(lyr, field3='baz5') ############################################################################### # Test AlterFieldDefn() for change of type def test_ogr_rfc35_sqlite_4(): if gdaltest.rfc35_sqlite_ds is None: pytest.skip() lyr = gdaltest.rfc35_sqlite_ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 fd = ogr.FieldDefn("intfield", ogr.OFTInteger) lyr.CreateField(fd) lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 12345) lyr.SetFeature(feat) feat = None fd.SetWidth(10) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd.SetWidth(5) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd.SetWidth(4) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() # if feat.GetField("intfield") != 1234: assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(15) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() # if feat.GetField("oldintfld") != '1234': assert feat.GetField("oldintfld") == '12345' feat = None CheckFeatures(lyr, field3='baz5') lyr.DeleteField(lyr_defn.GetFieldIndex("oldintfld")) fd = ogr.FieldDefn("intfield", ogr.OFTInteger) fd.SetWidth(10) assert lyr.CreateField(fd) == 0 assert lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) == 0 lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 98765) assert lyr.SetFeature(feat) == 0 feat = None fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(6) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ############################################################################### # Test DeleteField() def test_ogr_rfc35_sqlite_5(): if gdaltest.rfc35_sqlite_ds is None: pytest.skip() lyr = gdaltest.rfc35_sqlite_ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCDeleteField) == 1 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(-1) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldCount()) gdal.PopErrorHandler() assert ret != 0 assert lyr.DeleteField(0) == 0 CheckFeatures(lyr, field3='baz5') assert lyr.DeleteField(lyr_defn.GetFieldIndex('baw20')) == 0 CheckFeatures(lyr, field3='baz5', field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('baz5')) == 0 CheckFeatures(lyr, field3=None, field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('foo5')) == 0 assert lyr.DeleteField(lyr_defn.GetFieldIndex('bar10')) == 0 CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ############################################################################### # Initiate the test file def test_ogr_rfc35_sqlite_cleanup(): if gdaltest.rfc35_sqlite_ds_name is None: pytest.skip() gdaltest.rfc35_sqlite_ds = None ogr.GetDriverByName('SQLite').DeleteDataSource(gdaltest.rfc35_sqlite_ds_name) gdalautotest-3.0.4/ogr/ogr_gtm.py0000755003401500001440000002774013614005324016442 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_gtm.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GTM driver functionality. # Author: Leonardo de Paula Rosa Piga # ############################################################################### # Copyright (c) 2009, Leonardo de P. R. Piga # 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 import gdaltest import ogrtest from osgeo import ogr import pytest def test_ogr_gtm_init(): gdaltest.gtm_ds = None gdaltest.gtm_ds = ogr.Open('data/samplemap.gtm') if gdaltest.gtm_ds is None: gdaltest.have_gtm = 0 else: gdaltest.have_gtm = 1 if not gdaltest.have_gtm: pytest.skip() assert gdaltest.gtm_ds.GetLayerCount() == 2, 'wrong number of layers' ############################################################################### # Test waypoints gtm layer. def test_ogr_gtm_read_1(): if not gdaltest.have_gtm: pytest.skip() assert gdaltest.gtm_ds is not None lyr = gdaltest.gtm_ds.GetLayerByName('samplemap_waypoints') assert lyr.GetFeatureCount() == 3, 'wrong number of features' # Test 1st feature feat = lyr.GetNextFeature() assert feat.GetField('name') == 'WAY6', 'Wrong name field value' assert feat.GetField('comment') == 'Santa Cruz Stadium', 'Wrong comment field value' assert feat.GetField('icon') == 92, 'Wrong icon field value' assert feat.GetField('time') == '2009/12/18 17:32:41', 'Wrong time field value' wkt = 'POINT (-47.789974212646484 -21.201919555664062)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 2nd feature feat = lyr.GetNextFeature() assert feat.GetField('name') == 'WAY6', 'Wrong name field value' assert feat.GetField('comment') == 'Joe\'s Goalkeeper Pub', \ 'Wrong comment field value' assert feat.GetField('icon') == 4, 'Wrong icon field value' assert feat.GetField('time') == '2009/12/18 17:34:46', 'Wrong time field value' wkt = 'POINT (-47.909481048583984 -21.294229507446289)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 3rd feature feat = lyr.GetNextFeature() assert feat.GetField('name') == '33543400', 'Wrong name field value' assert feat.GetField('comment') == 'City Hall', 'Wrong comment field value' assert feat.GetField('icon') == 61, 'Wrong icon field value' assert feat.GetField('time') is None, 'Wrong time field value' wkt = 'POINT (-47.806097491943362 -21.176849600708007)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' ############################################################################### # Test tracks gtm layer. def test_ogr_gtm_read_2(): if not gdaltest.have_gtm: pytest.skip() assert gdaltest.gtm_ds is not None lyr = gdaltest.gtm_ds.GetLayerByName('samplemap_tracks') assert lyr.GetFeatureCount() == 3, 'wrong number of features' # Test 1st feature feat = lyr.GetNextFeature() assert feat.GetField('name') == 'San Sebastian Street', 'Wrong name field value' assert feat.GetField('type') == 2, 'Wrong type field value' assert feat.GetField('color') == 0, 'Wrong color field value' # if feat.GetField('time') is not None: # gdaltest.post_reason( 'Wrong time field value' ) # return 'fail' wkt = 'LINESTRING (-47.807481607448054 -21.177795963939211,' + \ '-47.808151245117188 -21.177299499511719,' + \ '-47.809136624130645 -21.176562836150087,' + \ '-47.809931418108405 -21.175971104366582)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 2nd feature feat = lyr.GetNextFeature() assert feat.GetField('name') == 'Barao do Amazonas Street', 'Wrong name field value' assert feat.GetField('type') == 1, 'Wrong type field value' assert feat.GetField('color') == 0, 'Wrong color field value' # if feat.GetField('time') is not None: # gdaltest.post_reason( 'Wrong time field value' ) # return 'fail' wkt = 'LINESTRING (-47.808751751608561 -21.178029550275486,' + \ '-47.808151245117188 -21.177299499511719,' + \ '-47.807561550927701 -21.176617693474089,' + \ '-47.806959118447779 -21.175900153727685)' assert not ogrtest.check_feature_geometry(feat, wkt) # Test 3rd feature feat = lyr.GetNextFeature() assert feat.GetField('name') == 'Curupira Park', 'Wrong name field value' assert feat.GetField('type') == 17, 'Wrong type field value' assert feat.GetField('color') == 46848, 'Wrong color field value' # if feat.GetField('time') is not None: # gdaltest.post_reason( 'Wrong time field value' ) # return 'fail' wkt = 'LINESTRING (-47.7894287109375 -21.194473266601562,' + \ '-47.793514591064451 -21.197530536743162,' + \ '-47.797027587890625 -21.19483757019043,' + \ '-47.794818878173828 -21.192028045654297,' + \ '-47.794120788574219 -21.193340301513672,' + \ '-47.792263031005859 -21.194267272949219,' + \ '-47.7894287109375 -21.194473266601562)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' ############################################################################### # Write test ############################################################################### # Waypoint write def test_ogr_gtm_write_1(): ds = ogr.GetDriverByName('GPSTrackMaker').CreateDataSource('tmp/gtm.gtm') lyr = ds.CreateLayer('gtm_waypoints', geom_type=ogr.wkbPoint) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', 'WAY0000000') dst_feat.SetField('comment', 'Waypoint 0') dst_feat.SetField('icon', 10) dst_feat.SetField('time', '2009/12/23 14:25:46') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (-21 -47)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', 'WAY0000001') dst_feat.SetField('comment', 'Waypoint 1') dst_feat.SetField('icon', 31) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (-21.123 -47.231 800)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' lyr = ds.CreateLayer('gtm_tracks', geom_type=ogr.wkbLineString) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', '1st Street') dst_feat.SetField('type', 2) dst_feat.SetField('color', 0x0000FF) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (-21.1 -47.1, -21.2 -47.2, -21.3 -47.3, -21.4 -47.4)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', '2nd Street') dst_feat.SetField('type', 1) dst_feat.SetField('color', 0x000000) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (-21.11 -47.1, -21.21 -47.2, -21.31 -47.3, -21.41 -47.4)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', '3rd Street') dst_feat.SetField('type', 2) dst_feat.SetField('color', 0x000000) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((-21.12 -47.1, -21.22 -47.2, -21.32 -47.3, -21.42 -47.4),' + '(-21.12 -47.1, -21.02 -47.0, -20.92 -46.9))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None ############################################################################### # Check previous test def test_ogr_gtm_check_write_1(): if not gdaltest.have_gtm: pytest.skip() ds = ogr.Open('tmp/gtm.gtm') lyr = ds.GetLayerByName('gtm_waypoints') assert lyr.GetFeatureCount() == 2, 'Bad feature count.' # Test 1st waypoint feat = lyr.GetNextFeature() assert feat.GetField('name') == 'WAY0000000', 'Wrong name field value' assert feat.GetField('comment') == 'Waypoint 0', 'Wrong comment field value' assert feat.GetField('icon') == 10, 'Wrong icon field value' assert feat.GetField('time') == '2009/12/23 14:25:46', 'Wrong time field value' wkt = 'POINT (-21 -47)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 2nd waypoint feat = lyr.GetNextFeature() assert feat.GetField('name') == 'WAY0000001', 'Wrong name field value' assert feat.GetField('comment') == 'Waypoint 1', 'Wrong comment field value' assert feat.GetField('icon') == 31, 'Wrong icon field value' assert feat.GetField('time') is None, 'Wrong time field value' wkt = 'POINT (-21.123 -47.231 800)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test tracks lyr = ds.GetLayerByName('gtm_tracks') assert lyr.GetFeatureCount() == 4, 'Bad feature count.' # Test 1st track feat = lyr.GetNextFeature() assert feat.GetField('name') == '1st Street', 'Wrong name field value' assert feat.GetField('type') == 2, 'Wrong type field value' assert feat.GetField('color') == 0x0000FF, 'Wrong color field value' wkt = 'LINESTRING (-21.1 -47.1, -21.2 -47.2, -21.3 -47.3, -21.4 -47.4)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 2nd track feat = lyr.GetNextFeature() assert feat.GetField('name') == '2nd Street', 'Wrong name field value' assert feat.GetField('type') == 1, 'Wrong type field value' assert feat.GetField('color') == 0x000000, 'Wrong color field value' wkt = 'LINESTRING (-21.11 -47.1, -21.21 -47.2, -21.31 -47.3, -21.41 -47.4)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 3rd track feat = lyr.GetNextFeature() assert feat.GetField('name') == '3rd Street', 'Wrong name field value' assert feat.GetField('type') == 2, 'Wrong type field value' assert feat.GetField('color') == 0x000000, 'Wrong color field value' wkt = 'LINESTRING (-21.12 -47.1, -21.22 -47.2, -21.32 -47.3, -21.42 -47.4)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' # Test 4th track feat = lyr.GetNextFeature() assert feat.GetField('name') == '3rd Street', 'Wrong name field value' assert feat.GetField('type') == 2, 'Wrong type field value' assert feat.GetField('color') == 0x000000, 'Wrong color field value' wkt = 'LINESTRING (-21.12 -47.1, -21.02 -47.0, -20.92 -46.9)' assert not ogrtest.check_feature_geometry(feat, wkt), 'Unexpected geometry' ############################################################################### # def test_ogr_gtm_cleanup(): gdaltest.gtm_ds = None os.remove('tmp/gtm.gtm') gdalautotest-3.0.4/ogr/ogr_virtualogr.py0000755003401500001440000002574613614005324020055 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_virtualogr.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: VirtualOGR testing # 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 sys from osgeo import ogr from osgeo import gdal import gdaltest import pytest # Linter says this isn't used, but it actually is via pytest magic :) from ogr.ogr_sql_sqlite import require_ogr_sql_sqlite # noqa ############################################################################### pytestmark = pytest.mark.usefixtures('require_ogr_sql_sqlite') def ogr_virtualogr_run_sql(sql_statement): ds = ogr.GetDriverByName('SQLite').CreateDataSource(':memory:') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL(sql_statement) gdal.PopErrorHandler() success = gdal.GetLastErrorMsg() == '' ds.ReleaseResultSet(sql_lyr) ds = None if not success: return success ds = ogr.GetDriverByName('Memory').CreateDataSource('') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL(sql_statement, dialect='SQLITE') gdal.PopErrorHandler() success = gdal.GetLastErrorMsg() == '' ds.ReleaseResultSet(sql_lyr) ds = None return success ############################################################################### # Basic tests def test_ogr_virtualogr_1(): # Invalid syntax assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR()") # Nonexistent dataset assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('foo')") # Dataset with 0 layer assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('')") # Dataset with more than 1 layer assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data')") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp')") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0)") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 1)") # Invalid value for update_mode assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 'foo')") # Nonexistent layer assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'foo')") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'poly')") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'poly', 0)") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'poly', 1)") assert ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'poly', 1, 1)") # Too many arguments assert not ogr_virtualogr_run_sql("CREATE VIRTUAL TABLE poly USING VirtualOGR('data/poly.shp', 0, 'poly', 1, 1, bla)") ############################################################################### # Test detection of suspicious use of VirtualOGR def test_ogr_virtualogr_2(): ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_virtualogr_2.db') ds.ExecuteSQL("CREATE VIRTUAL TABLE foo USING VirtualOGR('data/poly.shp')") ds.ExecuteSQL("CREATE TABLE spy_table (spy_content VARCHAR)") ds.ExecuteSQL("CREATE TABLE regular_table (bar VARCHAR)") ds = None # Check that foo isn't listed ds = ogr.Open('/vsimem/ogr_virtualogr_2.db') for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() != 'foo' ds = None # Check that it is listed if OGR_SQLITE_LIST_VIRTUAL_OGR=YES gdal.SetConfigOption('OGR_SQLITE_LIST_VIRTUAL_OGR', 'YES') ds = ogr.Open('/vsimem/ogr_virtualogr_2.db') gdal.SetConfigOption('OGR_SQLITE_LIST_VIRTUAL_OGR', None) found = False for i in range(ds.GetLayerCount()): if ds.GetLayer(i).GetName() == 'foo': found = True assert found ds = None # Add suspicious trigger ds = ogr.Open('/vsimem/ogr_virtualogr_2.db', update=1) ds.ExecuteSQL("CREATE TRIGGER spy_trigger INSERT ON regular_table BEGIN " + "INSERT OR REPLACE INTO spy_table (spy_content) " + "SELECT OGR_STYLE FROM foo; END;") ds = None gdal.ErrorReset() ds = ogr.Open('/vsimem/ogr_virtualogr_2.db') for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() != 'foo' # An error will be triggered at the time the trigger is used gdal.PushErrorHandler('CPLQuietErrorHandler') ds.ExecuteSQL("INSERT INTO regular_table (bar) VALUES ('bar')") gdal.PopErrorHandler() did_not_get_error = gdal.GetLastErrorMsg() == '' ds = None if did_not_get_error: gdal.Unlink('/vsimem/ogr_virtualogr_2.db') pytest.fail('expected a failure') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') gdal.SetConfigOption('OGR_SQLITE_LIST_VIRTUAL_OGR', 'YES') ds = ogr.Open('/vsimem/ogr_virtualogr_2.db') gdal.SetConfigOption('OGR_SQLITE_LIST_VIRTUAL_OGR', None) gdal.PopErrorHandler() if gdal.GetLastErrorMsg() == '': ds = None gdal.Unlink('/vsimem/ogr_virtualogr_2.db') pytest.fail('expected an error message') did_not_get_error = gdal.GetLastErrorMsg() == '' ds = None gdal.Unlink('/vsimem/ogr_virtualogr_2.db') assert not did_not_get_error, 'expected a failure' ############################################################################### # Test GDAL as a SQLite3 dynamically loaded extension def test_ogr_virtualogr_3(): # Find path of libgdal libgdal_name = gdaltest.find_lib('gdal') if libgdal_name is None: pytest.skip() print('Found ' + libgdal_name) # Find path of libsqlite3 or libspatialite libsqlite_name = gdaltest.find_lib('sqlite3') if libsqlite_name is None: libsqlite_name = gdaltest.find_lib('spatialite') if libsqlite_name is None: pytest.skip() print('Found ' + libsqlite_name) python_exe = sys.executable if sys.platform == 'win32': python_exe = python_exe.replace('\\', '/') libgdal_name = libgdal_name.replace('\\', '/') libsqlite_name = libsqlite_name.replace('\\', '/') ret = gdaltest.runexternal(python_exe + ' ogr_as_sqlite_extension.py "%s" "%s"' % (libsqlite_name, libgdal_name), check_memleak=False) if ret.startswith('skip'): pytest.skip() assert gdal.VersionInfo('RELEASE_NAME') in ret ############################################################################### # Test ogr_datasource_load_layers() def test_ogr_virtualogr_4(): ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_virtualogr_4.db') sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp')") ds.ReleaseResultSet(sql_lyr) gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp')") gdal.PopErrorHandler() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT * FROM poly') ret = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_virtualogr_4.db') assert ret == 10 ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_virtualogr_4.db') sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp', 0)") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT * FROM poly') ret = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_virtualogr_4.db') assert ret == 10 ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_virtualogr_4.db') sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp', 0, 'prefix')") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT * FROM prefix_poly') ret = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_virtualogr_4.db') assert ret == 10 # Various error conditions ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_virtualogr_4.db') gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers(0)") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('foo')") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp','a')") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT ogr_datasource_load_layers('data/poly.shp', 0, 0)") ds.ReleaseResultSet(sql_lyr) gdal.PopErrorHandler() ds = None gdal.Unlink('/vsimem/ogr_virtualogr_4.db') ############################################################################### # Test failed CREATE VIRTUAL TABLE USING VirtualOGR def test_ogr_virtualogr_5(): # Create a CSV with duplicate column name fp = gdal.VSIFOpenL('/vsimem/ogr_virtualogr_5.csv', 'wt') line = 'foo,foo\n' gdal.VSIFWriteL(line, 1, len(line), fp) line = 'bar,baz\n' gdal.VSIFWriteL(line, 1, len(line), fp) gdal.VSIFCloseL(fp) ds = ogr.GetDriverByName('Memory').CreateDataSource('') gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL("CREATE VIRTUAL TABLE lyr2 USING VirtualOGR('/vsimem/ogr_virtualogr_5.csv')", dialect='SQLITE') gdal.PopErrorHandler() assert sql_lyr is None ds = None gdal.Unlink('/vsimem/ogr_virtualogr_5.csv') gdalautotest-3.0.4/ogr/ogr_rfc35_shape.py0000755003401500001440000003170613614005324017752 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_rfc35_shape.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC35 for shape 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 ogr from osgeo import gdal import pytest ############################################################################### # def CheckFileSize(src_filename): import test_py_scripts script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogr2ogr', 'tmp/CheckFileSize.dbf ' + src_filename) statBufSrc = gdal.VSIStatL(src_filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) statBufDst = gdal.VSIStatL('tmp/CheckFileSize.dbf', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/CheckFileSize.dbf') assert statBufSrc.size == statBufDst.size, \ ('src_size = %d, dst_size = %d', statBufSrc.size, statBufDst.size) ############################################################################### # Initiate the test file def test_ogr_rfc35_shape_1(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/rfc35_test.dbf') lyr = ds.CreateLayer('rfc35_test') lyr.ReorderFields([]) fd = ogr.FieldDefn('foo5', ogr.OFTString) fd.SetWidth(5) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo0') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('bar10', ogr.OFTString) fd.SetWidth(10) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo1') feat.SetField(1, 'bar1') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baz15', ogr.OFTString) fd.SetWidth(15) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo2') feat.SetField(1, 'bar2_01234') feat.SetField(2, 'baz2_0123456789') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baw20', ogr.OFTString) fd.SetWidth(20) lyr.CreateField(fd) ############################################################################### # Test ReorderField() def Truncate(val, lyr_defn, fieldname): if val is None: return val return val[0:lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex(fieldname)).GetWidth()] def CheckFeatures(lyr, field1='foo5', field2='bar10', field3='baz15', field4='baw20'): expected_values = [ ['foo0', None, None, None], ['foo1', 'bar1', None, None], ['foo2', 'bar2_01234', 'baz2_0123456789', None], ['foo3', 'bar3_01234', 'baz3_0123456789', 'baw3_012345678901234'] ] lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() i = 0 while feat is not None: if (field1 is not None and feat.GetField(field1) != Truncate(expected_values[i][0], lyr_defn, field1)) or \ (field2 is not None and feat.GetField(field2) != Truncate(expected_values[i][1], lyr_defn, field2)) or \ (field3 is not None and feat.GetField(field3) != Truncate(expected_values[i][2], lyr_defn, field3)) or \ (field4 is not None and feat.GetField(field4) != Truncate(expected_values[i][3], lyr_defn, field4)): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() i = i + 1 def CheckColumnOrder(lyr, expected_order): lyr_defn = lyr.GetLayerDefn() for i, exp_order in enumerate(expected_order): assert lyr_defn.GetFieldDefn(i).GetName() == exp_order def Check(lyr, expected_order): CheckColumnOrder(lyr, expected_order) CheckFeatures(lyr) ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr_reopen = ds.GetLayer(0) CheckColumnOrder(lyr_reopen, expected_order) CheckFeatures(lyr_reopen) def test_ogr_rfc35_shape_2(): ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCReorderFields) == 1 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo3') feat.SetField(1, 'bar3_01234') feat.SetField(2, 'baz3_0123456789') feat.SetField(3, 'baw3_012345678901234') lyr.CreateFeature(feat) feat = None assert lyr.ReorderField(1, 3) == 0 Check(lyr, ['foo5', 'baz15', 'baw20', 'bar10']) lyr.ReorderField(3, 1) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 2) Check(lyr, ['bar10', 'baz15', 'foo5', 'baw20']) lyr.ReorderField(2, 0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 1) Check(lyr, ['bar10', 'foo5', 'baz15', 'baw20']) lyr.ReorderField(1, 0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderFields([3, 2, 1, 0]) Check(lyr, ['baw20', 'baz15', 'bar10', 'foo5']) lyr.ReorderFields([3, 2, 1, 0]) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([0, 0, 0, 0]) gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) CheckColumnOrder(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) CheckFeatures(lyr) ############################################################################### # Test AlterFieldDefn() for change of name and width def test_ogr_rfc35_shape_3(): ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) fd = ogr.FieldDefn("baz25", ogr.OFTString) fd.SetWidth(25) lyr_defn = lyr.GetLayerDefn() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(-1, fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(lyr_defn.GetFieldCount(), fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz15"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz25') fd = ogr.FieldDefn("baz5", ogr.OFTString) fd.SetWidth(5) lyr_defn = lyr.GetLayerDefn() lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz25"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('baz5')) assert fld_defn.GetWidth() == 5 CheckFeatures(lyr, field3='baz5') ############################################################################### # Test AlterFieldDefn() for change of type def test_ogr_rfc35_shape_4(): ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 fd = ogr.FieldDefn("intfield", ogr.OFTInteger) lyr.CreateField(fd) lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 12345) lyr.SetFeature(feat) feat = None fd.SetWidth(10) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd.SetWidth(5) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fd.SetWidth(4) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 1234 feat = None CheckFeatures(lyr, field3='baz5') ds = None # Check that the file size has decreased after column shrinking CheckFileSize('tmp/rfc35_test.dbf') ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(15) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '1234' feat = None CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '1234' feat = None CheckFeatures(lyr, field3='baz5') lyr.DeleteField(lyr_defn.GetFieldIndex("oldintfld")) fd = ogr.FieldDefn("intfield", ogr.OFTInteger) fd.SetWidth(10) assert lyr.CreateField(fd) == 0 assert lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) == 0 lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 98765) assert lyr.SetFeature(feat) == 0 feat = None fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(6) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ############################################################################### # Test DeleteField() def test_ogr_rfc35_shape_5(): ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCDeleteField) == 1 assert lyr.DeleteField(0) == 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(-1) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldCount()) gdal.PopErrorHandler() assert ret != 0 CheckFeatures(lyr, field3='baz5') assert lyr.DeleteField(lyr_defn.GetFieldIndex('baw20')) == 0 ds = None # Check that the file size has decreased after column removing CheckFileSize('tmp/rfc35_test.dbf') if ret == 'fail': return ret ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() CheckFeatures(lyr, field3='baz5', field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('baz5')) == 0 CheckFeatures(lyr, field3=None, field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('foo5')) == 0 assert lyr.DeleteField(lyr_defn.GetFieldIndex('bar10')) == 0 CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ds = None ds = ogr.Open('tmp/rfc35_test.dbf', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ############################################################################### # Initiate the test file def test_ogr_rfc35_shape_cleanup(): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/rfc35_test.dbf') gdalautotest-3.0.4/ogr/ogr_wasp.py0000755003401500001440000003500613614005325016620 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_shape.py 26794 2014-01-08 16:02:22Z rouault $ # # Project: GDAL/OGR Test Suite # Purpose: WAsP driver testing. # Author: Vincent Mora # ############################################################################### # Copyright (c) 2014, Oslandia # # 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 math import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Create wasp datasource def test_ogr_wasp_create_ds(): wasp_drv = ogr.GetDriverByName('WAsP') wasp_drv.DeleteDataSource('tmp.map') gdaltest.wasp_ds = wasp_drv.CreateDataSource('tmp.map') if gdaltest.wasp_ds is not None: return pytest.fail() ############################################################################### # Create elevation .map from linestrings z def test_ogr_wasp_elevation_from_linestring_z(): test_ogr_wasp_create_ds() ref = osr.SpatialReference() ref.ImportFromProj4('+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356514.999978254 +pm=2.337229167 +units=m +no_defs') layer = gdaltest.wasp_ds.CreateLayer('mylayer', ref, geom_type=ogr.wkbLineString25D) assert layer is not None, 'unable to create layer' dfn = ogr.FeatureDefn() for i in range(10): feat = ogr.Feature(dfn) line = ogr.Geometry(type=ogr.wkbLineString25D) line.AddPoint(i, 0, i) line.AddPoint(i, 0.5, i) line.AddPoint(i, 1, i) feat.SetGeometry(line) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 for line in f: if not i % 2: [h, n] = line.split() assert int(n) == 3, ('number of points should be 3 and is %s' % n) assert float(h) == j, ('altitude should be %d and is %s' % (j, h)) j += 1 i += 1 assert j == 10, ('nb of feature should be 10 and is %d' % j) ############################################################################### # Create elevation .map from linestrings z with simplification def test_ogr_wasp_elevation_from_linestring_z_toler(): test_ogr_wasp_create_ds() ref = osr.SpatialReference() ref.ImportFromProj4('+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356514.999978254 +pm=2.337229167 +units=m +no_defs') if not ogrtest.have_geos(): gdal.PushErrorHandler('CPLQuietErrorHandler') layer = gdaltest.wasp_ds.CreateLayer('mylayer', ref, options=['WASP_TOLERANCE=.1'], geom_type=ogr.wkbLineString25D) if not ogrtest.have_geos(): gdal.PopErrorHandler() assert layer is not None, 'unable to create layer' dfn = ogr.FeatureDefn() for i in range(10): feat = ogr.Feature(dfn) line = ogr.Geometry(type=ogr.wkbLineString25D) line.AddPoint(i, 0, i) line.AddPoint(i, 0.5, i) line.AddPoint(i, 1, i) feat.SetGeometry(line) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 for line in f: if not i % 2: [h, n] = line.split() if int(n) != 2: if ogrtest.have_geos(): pytest.fail('number of points should be 2 and is %s' % n) elif int(n) != 3: pytest.fail('number of points should be 3 and is %s' % n) assert float(h) == j, ('altitude should be %d and is %s' % (j, h)) j += 1 i += 1 assert j == 10, ('nb of feature should be 10 and is %d' % j) ############################################################################### # Create elevation .map from linestrings field def test_ogr_wasp_elevation_from_linestring_field(): test_ogr_wasp_create_ds() layer = gdaltest.wasp_ds.CreateLayer('mylayer', options=['WASP_FIELDS=elevation'], geom_type=ogr.wkbLineString) assert layer is not None, 'unable to create layer' layer.CreateField(ogr.FieldDefn('elevation', ogr.OFTReal)) for i in range(10): feat = ogr.Feature(layer.GetLayerDefn()) feat.SetField(0, float(i)) line = ogr.Geometry(type=ogr.wkbLineString) line.AddPoint(i, 0) line.AddPoint(i, 0.5) line.AddPoint(i, 1) feat.SetGeometry(line) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 for line in f: if not i % 2: [h, n] = line.split() assert int(n) == 3, ('number of points should be 3 and is %s' % n) assert float(h) == j, ('altitude should be %d and is %s' % (j, h)) j += 1 i += 1 ############################################################################### # Create roughness .map from linestrings fields def test_ogr_wasp_roughness_from_linestring_fields(): test_ogr_wasp_create_ds() layer = gdaltest.wasp_ds.CreateLayer('mylayer', options=['WASP_FIELDS=z_left,z_right'], geom_type=ogr.wkbLineString) assert layer is not None, 'unable to create layer' layer.CreateField(ogr.FieldDefn('dummy', ogr.OFTString)) layer.CreateField(ogr.FieldDefn('z_left', ogr.OFTReal)) layer.CreateField(ogr.FieldDefn('z_right', ogr.OFTReal)) for i in range(10): feat = ogr.Feature(layer.GetLayerDefn()) feat.SetField(0, 'dummy_' + str(i)) feat.SetField(1, float(i) - 1) feat.SetField(2, float(i)) line = ogr.Geometry(type=ogr.wkbLineString) line.AddPoint(i, 0) line.AddPoint(i, 0.5) line.AddPoint(i, 1) feat.SetGeometry(line) assert layer.CreateFeature(feat) == 0, ('unable to create feature %d' % i) del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 for line in f: if not i % 2: [l, r, n] = line.split() assert int(n) == 3, ('number of points should be 3 and is %s' % n) assert float(r) == j and float(l) == j - 1, \ ('roughness should be %d and %d and is %s and %s' % (j - 1, j, l, r)) j += 1 i += 1 assert j == 10, ('nb of feature should be 10 and is %d' % j) ############################################################################### # Create .map from polygons z def test_ogr_wasp_roughness_from_polygon_z(): test_ogr_wasp_create_ds() if not ogrtest.have_geos(): gdal.PushErrorHandler('CPLQuietErrorHandler') layer = gdaltest.wasp_ds.CreateLayer('mylayer', geom_type=ogr.wkbPolygon25D) if not ogrtest.have_geos(): gdal.PopErrorHandler() if layer is None: assert not ogrtest.have_geos(), 'unable to create layer' return dfn = ogr.FeatureDefn() for i in range(6): feat = ogr.Feature(dfn) ring = ogr.Geometry(type=ogr.wkbLinearRing) ring.AddPoint(0, 0, i) ring.AddPoint(round(math.cos(i * math.pi / 3), 6), round(math.sin(i * math.pi / 3), 6), i) ring.AddPoint(round(math.cos((i + 1) * math.pi / 3), 6), round(math.sin((i + 1) * math.pi / 3), 6), i) ring.AddPoint(0, 0, i) poly = ogr.Geometry(type=ogr.wkbPolygon25D) poly.AddGeometry(ring) feat.SetGeometry(poly) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 res = set() for line in f: if not i % 2: [l, r, n] = [v for v in line.split()] assert int(n) == 2, ('number of points should be 2 and is %d' % int(n)) if float(r) > float(l): res.add((float(l), float(r))) else: res.add((float(r), float(l))) j += 1 i += 1 assert j == 6, ('there should be 6 boundaries and there are %d' % j) assert res == set([(0, 1), (0, 5), (1, 2), (2, 3), (3, 4), (4, 5)]), \ 'wrong values f=in boundaries' ############################################################################### # Create .map from polygons field def test_ogr_wasp_roughness_from_polygon_field(): test_ogr_wasp_create_ds() if not ogrtest.have_geos(): gdal.PushErrorHandler('CPLQuietErrorHandler') layer = gdaltest.wasp_ds.CreateLayer('mylayer', options=['WASP_FIELDS=roughness'], geom_type=ogr.wkbPolygon) if not ogrtest.have_geos(): gdal.PopErrorHandler() if layer is None: assert not ogrtest.have_geos(), 'unable to create layer' return layer.CreateField(ogr.FieldDefn('roughness', ogr.OFTReal)) layer.CreateField(ogr.FieldDefn('dummy', ogr.OFTString)) for i in range(6): feat = ogr.Feature(layer.GetLayerDefn()) feat.SetField(0, float(i)) ring = ogr.Geometry(type=ogr.wkbLinearRing) ring.AddPoint(0, 0) ring.AddPoint(round(math.cos(i * math.pi / 3), 6), round(math.sin(i * math.pi / 3), 6)) ring.AddPoint(round(math.cos((i + 1) * math.pi / 3), 6), round(math.sin((i + 1) * math.pi / 3), 6)) ring.AddPoint(0, 0) poly = ogr.Geometry(type=ogr.wkbPolygon) poly.AddGeometry(ring) feat.SetGeometry(poly) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 res = set() for line in f: if not i % 2: [l, r, n] = [v for v in line.split()] assert int(n) == 2, ('number of points should be 2 and is %d' % int(n)) if float(r) > float(l): res.add((float(l), float(r))) else: res.add((float(r), float(l))) j += 1 i += 1 assert j == 6, ('there should be 6 boundaries and there are %d' % j) assert res == set([(0, 1), (0, 5), (1, 2), (2, 3), (3, 4), (4, 5)]), \ 'wrong values f=in boundaries' ############################################################################### # Test merging of linestrings # especially the unwanted merging of a corner point that could be merged with # a continuing line (pichart map) def test_ogr_wasp_merge(): test_ogr_wasp_create_ds() if not ogrtest.have_geos(): gdal.PushErrorHandler('CPLQuietErrorHandler') layer = gdaltest.wasp_ds.CreateLayer('mylayer', geom_type=ogr.wkbPolygon25D) if not ogrtest.have_geos(): gdal.PopErrorHandler() if layer is None: assert not ogrtest.have_geos(), 'unable to create layer' return dfn = ogr.FeatureDefn() for i in range(6): feat = ogr.Feature(dfn) ring = ogr.Geometry(type=ogr.wkbLinearRing) h = i % 2 ring.AddPoint(0, 0, h) ring.AddPoint(round(math.cos(i * math.pi / 3), 6), round(math.sin(i * math.pi / 3), 6), h) ring.AddPoint(round(math.cos((i + 1) * math.pi / 3), 6), round(math.sin((i + 1) * math.pi / 3), 6), h) ring.AddPoint(0, 0, h) poly = ogr.Geometry(type=ogr.wkbPolygon25D) poly.AddGeometry(ring) feat.SetGeometry(poly) assert layer.CreateFeature(feat) == 0, 'unable to create feature' del gdaltest.wasp_ds del layer f = open('tmp.map') for i in range(4): f.readline() i = 0 j = 0 res = [] for line in f: if not i % 2: [l, r, n] = [v for v in line.split()] assert int(n) == 2, \ ('number of points should be 2 and is %d (unwanted merge ?)' % int(n)) if float(r) > float(l): res.append((float(l), float(r))) else: res.append((float(r), float(l))) j += 1 i += 1 assert j == 6, ('there should be 6 boundaries and there are %d' % j) assert res == [(0, 1)] * 6, 'wrong values f=in boundaries' ############################################################################### # Read map file def test_ogr_wasp_reading(): test_ogr_wasp_elevation_from_linestring_z() gdaltest.wasp_ds = None ds = ogr.Open('tmp.map') assert ds is not None and ds.GetLayerCount() == 1 layer = ds.GetLayer(0) feat = layer.GetNextFeature() i = 0 while feat: feat = layer.GetNextFeature() i += 1 assert i == 10 ############################################################################### # Cleanup def test_ogr_wasp_cleanup(): wasp_drv = ogr.GetDriverByName('WAsP') wasp_drv.DeleteDataSource('tmp.map') gdalautotest-3.0.4/ogr/ogr_gmt.py0000755003401500001440000001752213614005325016440 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_gmt.py 73408e4a938d6fb45b1a01af4812236e464c7159 2019-04-19 22:20:14 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR GMT driver functionality. # 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 import ogrtest from osgeo import gdal from osgeo import ogr ############################################################################### # Open Memory datasource. def test_ogr_gmt_1(): gmt_drv = ogr.GetDriverByName('GMT') gdaltest.gmt_ds = gmt_drv.CreateDataSource('tmp/tpoly.gmt') assert gdaltest.gmt_ds is not None ############################################################################### # Create table from data/poly.shp def test_ogr_gmt_2(): ####################################################### # Create gmtory Layer gdaltest.gmt_lyr = gdaltest.gmt_ds.CreateLayer('tpoly') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.gmt_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.gmt_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.gmt_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() gdaltest.gmt_lyr = None gdaltest.gmt_ds = None ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_gmt_3(): gdaltest.gmt_ds = ogr.Open('tmp/tpoly.gmt') gdaltest.gmt_lyr = gdaltest.gmt_ds.GetLayer(0) expect = [168, 169, 166, 158, 165] gdaltest.gmt_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.gmt_lyr, 'eas_id', expect) gdaltest.gmt_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.gmt_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None gdaltest.shp_ds = None gdaltest.gmt_lyr = None gdaltest.gmt_ds = None assert tr ############################################################################### # Verify reading of multilinestring file. (#3802) def test_ogr_gmt_4(): ds = ogr.Open('data/test_multi.gmt') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomType() == ogr.wkbMultiLineString, \ 'did not get expected multilinestring type.' feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((175 -45,176 -45),(180.0 -45.3,179.0 -45.4))') assert feat.GetField('name') == 'feature 1', 'got wrong name, feature 1' feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'MULTILINESTRING ((175.1 -45.0,175.2 -45.1),(180.1 -45.3,180.0 -45.2))') assert feat.GetField('name') == 'feature 2', 'got wrong name, feature 2' feat = lyr.GetNextFeature() assert feat is None, 'did not get null feature when expected.' ############################################################################### # Write a multipolygon file and verify it. def test_ogr_gmt_5(): ####################################################### # Create gmtory Layer gmt_drv = ogr.GetDriverByName('GMT') gdaltest.gmt_ds = gmt_drv.CreateDataSource('tmp/mpoly.gmt') gdaltest.gmt_lyr = gdaltest.gmt_ds.CreateLayer('mpoly') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.gmt_lyr, [('ID', ogr.OFTInteger)]) ####################################################### # Write a first multipolygon dst_feat = ogr.Feature(feature_def=gdaltest.gmt_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly( ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 10,10 10,0 10,0 0),(3 3,4 4, 3 4,3 3)),((12 0,14 0,12 3,12 0)))')) dst_feat.SetField('ID', 15) gdal.SetConfigOption('GMT_USE_TAB', 'TRUE') # Ticket #6453 gdaltest.gmt_lyr.CreateFeature(dst_feat) gdal.SetConfigOption('GMT_USE_TAB', None) dst_feat = ogr.Feature(feature_def=gdaltest.gmt_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly( ogr.CreateGeometryFromWkt('MULTIPOLYGON(((30 20,40 20,30 30,30 20)))')) dst_feat.SetField('ID', 16) gdaltest.gmt_lyr.CreateFeature(dst_feat) gdaltest.gmt_lyr = None gdaltest.gmt_ds = None # Reopen. ds = ogr.Open('tmp/mpoly.gmt') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomType() == ogr.wkbMultiPolygon, \ 'did not get expected multipolygon type.' feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON(((0 0,0 10,10 10,0 10,0 0),(3 3,4 4, 3 4,3 3)),((12 0,14 0,12 3,12 0)))') assert feat.GetField('ID') == 15, 'got wrong id, first feature' feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON(((30 20,40 20,30 30,30 20)))') assert feat.GetField('ID') == 16, 'got wrong ID, second feature' feat = lyr.GetNextFeature() assert feat is None, 'did not get null feature when expected.' ############################################################################### # Test reading a file with just point coordinates def test_ogr_gmt_coord_only(): with gdaltest.tempfile('/vsimem/test.gmt', """1 2 3\n"""): ds = ogr.Open('/vsimem/test.gmt') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(f, 'POINT Z (1 2 3)'), f.GetGeometryRef().ExportToIsoWkt() ############################################################################### # def test_ogr_gmt_cleanup(): if gdaltest.gmt_ds is not None: gdaltest.gmt_lyr = None gdaltest.gmt_ds = None gdaltest.clean_tmp() gdalautotest-3.0.4/ogr/ogr_vdv.py0000755003401500001440000003674313614005325016456 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_vdv.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR VDV 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. ############################################################################### import os import shutil import sys import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### # Basic test of .idf file def test_ogr_idf_1(): ds = ogr.Open('data/test.idf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['NODE_ID'] != 1 or f['foo'] != 'U' or f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (2 49,2.5 49.5,2.7 49.7,3 50)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(2) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2.5 49.5)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(3) f = lyr.GetNextFeature() if f['FOO'] != 1: f.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_idf_1_with_temp_sqlite_db(): if ogr.GetDriverByName('SQLite') is None: pytest.skip() with gdaltest.config_option('OGR_IDF_TEMP_DB_THRESHOLD', '0'): return test_ogr_idf_1() ############################################################################### # Basic test of .idf file def test_ogr_idf_3d(): ds = ogr.Open('data/test_3d.idf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['NODE_ID'] != 1 or f['foo'] != 'U' or f.GetGeometryRef().ExportToWkt() != 'POINT (2 49 10)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (2 49 10,2.5 49.5 10,2.7 49.7 20,3 50 20)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(2) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2.5 49.5 10)': f.DumpReadable() pytest.fail() lyr = ds.GetLayer(3) f = lyr.GetNextFeature() if f['FOO'] != 1: f.DumpReadable() pytest.fail() ############################################################################### # Run test_ogrsf on .idf def test_ogr_idf_2(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.idf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Create a VDV file def test_ogr_vdv_1(filename='tmp/test.x10', dsco=None, lco=None): dsco = [] if dsco is None else dsco lco = [] if lco is None else lco ds = ogr.GetDriverByName('VDV').CreateDataSource(filename, options=dsco) ds.CreateLayer('empty', options=lco) lyr = ds.CreateLayer('lyr_1', options=lco) lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int_field', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64_field', ogr.OFTInteger64)) bool_field = ogr.FieldDefn('bool_field', ogr.OFTInteger) bool_field.SetSubType(ogr.OFSTBoolean) lyr.CreateField(bool_field) fld = ogr.FieldDefn('str2_field', ogr.OFTString) fld.SetWidth(2) lyr.CreateField(fld) fld = ogr.FieldDefn('int2_field', ogr.OFTInteger) fld.SetWidth(2) lyr.CreateField(fld) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('str_field', 'a"b') f.SetField('int_field', 12) f.SetField('bool_field', 1) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) lyr = ds.CreateLayer('another_layer', options=lco) lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) for i in range(5): f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('str_field', i) lyr.CreateFeature(f) ds = None # Do nothing ds = ogr.Open(filename, update=1) ds = None ds = ogr.Open(filename, update=1) ds.CreateLayer('empty2', options=lco) ds = None ############################################################################### # Read it def test_ogr_vdv_2(src_filename='tmp/test.x10'): out_filename = '/vsimem/vdv/ogr_vdv_2.x10' gdal.Unlink(out_filename) src_ds = ogr.Open(src_filename) out_ds = ogr.GetDriverByName('VDV').CreateDataSource(out_filename) layer_names = [src_ds.GetLayer(idx).GetName() for idx in range(src_ds.GetLayerCount())] layer_names.sort() for layer_name in layer_names: src_lyr = src_ds.GetLayer(layer_name) options = ['HEADER_SRC_DATE=01.01.1970', 'HEADER_SRC_TIME=00.00.00', 'HEADER_foo=bar'] dst_lyr = out_ds.CreateLayer(src_lyr.GetName(), options=options) for field_idx in range(src_lyr.GetLayerDefn().GetFieldCount()): dst_lyr.CreateField(src_lyr.GetLayerDefn().GetFieldDefn(field_idx)) for src_f in src_lyr: dst_f = ogr.Feature(dst_lyr.GetLayerDefn()) dst_f.SetFrom(src_f) dst_lyr.CreateFeature(dst_f) out_ds = None expected = """mod; DD.MM.YYYY; HH:MM:SS; free src; "UNKNOWN"; "01.01.1970"; "00.00.00" chs; "ISO8859-1" ver; "1.4" ifv; "1.4" dve; "1.4" fft; "" foo; "bar" tbl; another_layer atr; str_field frm; char[80] rec; "0" rec; "1" rec; "2" rec; "3" rec; "4" end; 5 tbl; lyr_1 atr; str_field; int_field; int64_field; bool_field; str2_field; int2_field frm; char[80]; num[10.0]; num[19.0]; boolean; char[2]; num[1.0] rec; "a""b"; 12; NULL; 1; NULL; NULL rec; NULL; NULL; NULL; NULL; NULL; NULL end; 2 tbl; empty atr; frm; end; 0 tbl; empty2 atr; frm; end; 0 eof; 4 """ f = gdal.VSIFOpenL(out_filename, 'rb') got = gdal.VSIFReadL(1, 10000, f).decode('latin1') gdal.VSIFCloseL(f) assert got == expected gdal.Unlink(out_filename) ############################################################################### # Run test_ogrsf on it def test_ogr_vdv_3(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/test.x10') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Create a VDV directory def test_ogr_vdv_4(): return test_ogr_vdv_1(filename='tmp/test_x10', dsco=['SINGLE_FILE=NO'], lco=['EXTENSION=txt']) ############################################################################### # Read it def test_ogr_vdv_5(): return test_ogr_vdv_2(src_filename='tmp/test_x10') ############################################################################### # Run test_ogrsf on it def test_ogr_vdv_6(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/test_x10') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run VDV452 def test_ogr_vdv_7(): tests = [('VDV-452', 'STOP', 'POINT_LONGITUDE', 'POINT_LATITUDE'), ('VDV-452-ENGLISH', 'STOP', 'POINT_LONGITUDE', 'POINT_LATITUDE'), ('VDV-452', 'REC_ORT', 'ORT_POS_LAENGE', 'ORT_POS_BREITE'), ('VDV-452-GERMAN', 'REC_ORT', 'ORT_POS_LAENGE', 'ORT_POS_BREITE')] out_filename = '/vsimem/vdv/ogr_vdv_7.x10' for (profile, lyrname, longname, latname) in tests: ds = ogr.GetDriverByName('VDV').CreateDataSource(out_filename) lyr = ds.CreateLayer(lyrname, geom_type=ogr.wkbPoint, options=['PROFILE=' + profile]) f = ogr.Feature(lyr.GetLayerDefn()) lng = - (123 + 45. / 60 + 56.789 / 3600) lat = - (23 + 45. / 60 + 56.789 / 3600) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%.10f %.10f)' % (lng, lat))) lyr.CreateFeature(f) ds = None ds = ogr.Open(out_filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f[longname] != -1234556789 or \ f[latname] != -234556789 or \ ogrtest.check_feature_geometry(f, 'POINT (-123.765774722222 -23.7657747222222)') != 0: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/vdv/ogr_vdv_7.x10') tests = [('VDV-452', True), ('VDV-452-ENGLISH', False), ('VDV-452-GERMAN', False)] for (profile, strict) in tests: ds = ogr.GetDriverByName('VDV').CreateDataSource(out_filename) gdal.ErrorReset() gdal.PushErrorHandler() lyr = ds.CreateLayer('UNKNOWN', options=['PROFILE=' + profile, 'PROFILE_STRICT=' + str(strict)]) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' if strict and lyr is not None: pytest.fail() elif not strict and lyr is None: pytest.fail() if profile == 'VDV-452-GERMAN': lyr_name = 'REC_ORT' else: lyr_name = 'STOP' lyr = ds.CreateLayer(lyr_name, options=['PROFILE=' + profile, 'PROFILE_STRICT=' + str(strict)]) gdal.ErrorReset() gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('UNKNOWN')) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' if strict and ret == 0: pytest.fail() elif not strict and ret != 0: pytest.fail() ds = None gdal.Unlink('/vsimem/vdv/ogr_vdv_7.x10') ############################################################################### # Test a few error cases def test_ogr_vdv_8(): gdal.PushErrorHandler() ds = ogr.GetDriverByName('VDV').CreateDataSource('/does/not_exist') gdal.PopErrorHandler() assert ds is None gdal.PushErrorHandler() ds = ogr.GetDriverByName('VDV').CreateDataSource('/does/not_exist', options=['SINGLE_FILE=FALSE']) gdal.PopErrorHandler() assert ds is None # Add layer in non writable directory if sys.platform.startswith('linux'): os.mkdir('tmp/ogr_vdv_8') open('tmp/ogr_vdv_8/empty.x10', 'wb').write('tbl; foo\natr;\nfrm;\n'.encode('latin1')) # 0555 = 365 os.chmod('tmp/ogr_vdv_8', 365) try: open('tmp/ogr_vdv_8/another_file', 'wb').close() shutil.rmtree('tmp/ogr_vdv_8') do_test = False except: do_test = True if do_test: ds = ogr.Open('tmp/ogr_vdv_8', update=1) gdal.PushErrorHandler() lyr = ds.CreateLayer('another_layer') gdal.PopErrorHandler() # 0755 = 493 os.chmod('tmp/ogr_vdv_8', 493) ds = None shutil.rmtree('tmp/ogr_vdv_8') assert lyr is None out_filename = '/vsimem/vdv/ogr_vdv_8.x10' ds = ogr.GetDriverByName('VDV').CreateDataSource(out_filename) # File already exists gdal.PushErrorHandler() ds2 = ogr.GetDriverByName('VDV').CreateDataSource(out_filename) gdal.PopErrorHandler() assert ds2 is None assert ds.TestCapability(ogr.ODsCCreateLayer) == 1 lyr1 = ds.CreateLayer("lyr1") assert lyr1.TestCapability(ogr.OLCSequentialWrite) == 1 assert lyr1.TestCapability(ogr.OLCCreateField) == 1 lyr1.ResetReading() gdal.PushErrorHandler() lyr1.GetNextFeature() gdal.PopErrorHandler() lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) # Layer structure is now frozen assert lyr1.TestCapability(ogr.OLCCreateField) == 0 gdal.PushErrorHandler() ret = lyr1.CreateField(ogr.FieldDefn('not_allowed')) gdal.PopErrorHandler() assert ret != 0 lyr2 = ds.CreateLayer("lyr2") lyr2.CreateFeature(ogr.Feature(lyr2.GetLayerDefn())) # Test interleaved writing assert lyr1.TestCapability(ogr.OLCSequentialWrite) == 0 gdal.PushErrorHandler() ret = lyr1.CreateFeature(ogr.Feature(lyr1.GetLayerDefn())) gdal.PopErrorHandler() assert ret != 0 assert lyr1.GetFeatureCount() == 1 ds = None # Test appending new layer to file without eof gdal.FileFromMemBuffer(out_filename, 'tbl; foo\natr; atr\nfrm; char[40]\nrec; "foo"\n') ds = ogr.Open(out_filename, update=1) lyr = ds.CreateLayer('new_layer') lyr.CreateField(ogr.FieldDefn('atr')) f = ogr.Feature(lyr.GetLayerDefn()) f['atr'] = 'bar' lyr.CreateFeature(f) f = None ds = None expected = """tbl; foo atr; atr frm; char[40] rec; "foo" tbl; new_layer atr; atr frm; char[80] rec; "bar" end; 1 eof; 2 """ f = gdal.VSIFOpenL(out_filename, 'rb') got = gdal.VSIFReadL(1, 10000, f).decode('latin1') gdal.VSIFCloseL(f) assert got == expected # Test we are robust against missing end; ds = ogr.Open(out_filename) for i in range(2): lyr = ds.GetLayer(i) assert lyr.GetFeatureCount() == 1 lyr.ResetReading() fc = 0 for f in lyr: fc += 1 assert fc == 1 lyr = None ds = None # Test appending new layer to file without terminating \n gdal.FileFromMemBuffer(out_filename, 'tbl; foo\natr; atr\nfrm; char[40]\nrec; "foo"\neof; 1') ds = ogr.Open(out_filename, update=1) lyr = ds.CreateLayer('new_layer') lyr.CreateField(ogr.FieldDefn('atr')) f = ogr.Feature(lyr.GetLayerDefn()) f['atr'] = 'bar' lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL(out_filename, 'rb') got = gdal.VSIFReadL(1, 10000, f).decode('latin1') gdal.VSIFCloseL(f) assert got == expected gdal.Unlink(out_filename) ############################################################################### # Cleanup def test_ogr_vdv_cleanup(): gdal.Unlink('tmp/test.x10') gdal.Unlink('/vsimem/vdv/ogr_vdv_2.x10') gdal.Unlink('/vsimem/vdv/ogr_vdv_7.x10') gdal.Unlink('/vsimem/vdv/ogr_vdv_8.x10') files = gdal.ReadDir('tmp/test_x10') if files is not None: for f in files: gdal.Unlink('tmp/test_x10/' + f) gdal.Rmdir('tmp/test_x10') gdalautotest-3.0.4/ogr/ogr_mem.py0000755003401500001440000005065013614005325016426 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_mem.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR Memory driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, 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 gdaltest import ogrtest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Open Memory datasource. def test_ogr_mem_1(): mem_drv = ogr.GetDriverByName('Memory') gdaltest.mem_ds = mem_drv.CreateDataSource('wrk_in_memory') assert gdaltest.mem_ds is not None ############################################################################### # Create table from data/poly.shp def test_ogr_mem_2(): if gdaltest.mem_ds is None: pytest.skip() assert gdaltest.mem_ds.TestCapability(ogr.ODsCCreateLayer) != 0, \ 'ODsCCreateLayer TestCapability failed.' ####################################################### # Create memory Layer gdaltest.mem_lyr = gdaltest.mem_ds.CreateLayer('tpoly') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.mem_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('WHEN', ogr.OFTDateTime)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.mem_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) ret = gdaltest.mem_lyr.CreateFeature(dst_feat) assert ret == 0, 'CreateFeature() failed.' feat = shp_lyr.GetNextFeature() ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_mem_3(): if gdaltest.mem_ds is None: pytest.skip() expect = [168, 169, 166, 158, 165] gdaltest.mem_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.mem_lyr, 'eas_id', expect) gdaltest.mem_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.mem_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None gdaltest.shp_ds = None assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_mem_4(): if gdaltest.mem_ds is None: pytest.skip() dst_feat = ogr.Feature(feature_def=gdaltest.mem_lyr.GetLayerDefn()) wkt_list = ['10', '2', '1', '3d_1', '4', '5', '6'] for item in wkt_list: wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new memory feature. dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) gdaltest.mem_lyr.CreateFeature(dst_feat) ###################################################################### # Read back the feature and get the geometry. gdaltest.mem_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.mem_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom) == 0 ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_mem_5(): if gdaltest.mem_ds is None: pytest.skip() expect = [179, 173, 172, 171, 170, 169, 168, 166, 165, 158, None] sql_lyr = gdaltest.mem_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.mem_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_mem_6(): if gdaltest.mem_ds is None: pytest.skip() sql_lyr = gdaltest.mem_ds.ExecuteSQL( "select * from tpoly where prfedea = '2'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['2']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'MULTILINESTRING ((5.00121349 2.99853132,5.00121349 1.99853133),(5.00121349 1.99853133,5.00121349 0.99853133),(3.00121351 1.99853127,5.00121349 1.99853133),(5.00121349 1.99853133,6.00121348 1.99853135))') != 0: tr = 0 gdaltest.mem_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_mem_7(): if gdaltest.mem_ds is None: pytest.skip() gdaltest.mem_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.mem_lyr.SetSpatialFilter(geom) geom.Destroy() assert not gdaltest.mem_lyr.TestCapability(ogr.OLCFastSpatialFilter), \ 'OLCFastSpatialFilter capability test should have failed.' tr = ogrtest.check_features_against_list(gdaltest.mem_lyr, 'eas_id', [158]) gdaltest.mem_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Test adding a new field. def test_ogr_mem_8(): #################################################################### # Add new string field. field_defn = ogr.FieldDefn('new_string', ogr.OFTString) gdaltest.mem_lyr.CreateField(field_defn) #################################################################### # Apply a value to this field in one feature. gdaltest.mem_lyr.SetAttributeFilter("PRFEDEA = '2'") feat_read = gdaltest.mem_lyr.GetNextFeature() feat_read.SetField('new_string', 'test1') gdaltest.mem_lyr.SetFeature(feat_read) # Test expected failed case of SetFeature() new_feat = ogr.Feature(gdaltest.mem_lyr.GetLayerDefn()) new_feat.SetFID(-2) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = gdaltest.mem_lyr.SetFeature(new_feat) gdal.PopErrorHandler() assert ret != 0 new_feat = None #################################################################### # Now fetch two features and verify the new column works OK. gdaltest.mem_lyr.SetAttributeFilter("PRFEDEA IN ( '2', '1' )") tr = ogrtest.check_features_against_list(gdaltest.mem_lyr, 'new_string', ['test1', None]) gdaltest.mem_lyr.SetAttributeFilter(None) assert tr ############################################################################### # Test deleting a feature. def test_ogr_mem_9(): assert gdaltest.mem_lyr.TestCapability(ogr.OLCDeleteFeature), \ 'OLCDeleteFeature capability test failed.' assert gdaltest.mem_lyr.TestCapability(ogr.OLCFastFeatureCount), \ 'OLCFastFeatureCount capability test failed.' old_count = gdaltest.mem_lyr.GetFeatureCount() #################################################################### # Delete target feature. target_fid = 2 assert gdaltest.mem_lyr.DeleteFeature(target_fid) == 0, \ 'DeleteFeature returned error code.' assert gdaltest.mem_lyr.DeleteFeature(target_fid) != 0, \ 'DeleteFeature should have returned error code.' #################################################################### # Verify that count has dropped by one, and that the feature in question # can't be fetched. new_count = gdaltest.mem_lyr.GetFeatureCount() if new_count != old_count - 1: gdaltest.post_reason('got feature count of %d, not expected %d.' % (new_count, old_count - 1)) assert gdaltest.mem_lyr.TestCapability(ogr.OLCRandomRead), \ 'OLCRandomRead capability test failed.' assert gdaltest.mem_lyr.GetFeature(target_fid) is None, 'Got deleted feature!' assert gdaltest.mem_lyr.GetFeature(-1) is None, 'GetFeature() should have failed' assert gdaltest.mem_lyr.GetFeature(1000) is None, 'GetFeature() should have failed' ############################################################################### # Test GetDriver() / name bug (#1674) # # Mostly we are verifying that this doesn't still cause a crash. def test_ogr_mem_10(): d = ogr.GetDriverByName('Memory') ds = d.CreateDataSource('xxxxxx') d2 = ds.GetDriver() assert d2 is not None and d2.GetName() == 'Memory', \ 'Did not get expected driver name.' ############################################################################### # Verify that we can delete layers properly def test_ogr_mem_11(): assert gdaltest.mem_ds.TestCapability('DeleteLayer') != 0, \ 'Deletelayer TestCapability failed.' gdaltest.mem_ds.CreateLayer('extra') gdaltest.mem_ds.CreateLayer('extra2') layer_count = gdaltest.mem_ds.GetLayerCount() gdaltest.mem_lyr = None # Delete extra layer assert gdaltest.mem_ds.DeleteLayer(layer_count - 2) == 0, 'DeleteLayer() failed' assert gdaltest.mem_ds.DeleteLayer(-1) != 0, 'DeleteLayer() should have failed' assert gdaltest.mem_ds.DeleteLayer(gdaltest.mem_ds.GetLayerCount()) != 0, \ 'DeleteLayer() should have failed' assert gdaltest.mem_ds.GetLayer(-1) is None, 'GetLayer() should have failed' assert gdaltest.mem_ds.GetLayer(gdaltest.mem_ds.GetLayerCount()) is None, \ 'GetLayer() should have failed' lyr = gdaltest.mem_ds.GetLayer(gdaltest.mem_ds.GetLayerCount() - 1) assert lyr.GetName() == 'extra2', 'delete layer seems iffy' ############################################################################### # Test some date handling def test_ogr_mem_12(): if gdaltest.mem_ds is None: pytest.skip() ####################################################### # Create memory Layer lyr = gdaltest.mem_ds.GetLayerByName('tpoly') assert lyr is not None # Set the date of the first feature f = lyr.GetFeature(1) f.SetField("WHEN", 2008, 3, 19, 16, 15, 00, 0) lyr.SetFeature(f) f = lyr.GetFeature(1) idx = f.GetFieldIndex('WHEN') expected = [2008, 3, 19, 16, 15, 0.0, 0] result = f.GetFieldAsDateTime(idx) for i, value in enumerate(result): assert value == expected[i], ('%s != %s' % (result, expected)) ############################################################################### # Test Get/Set on StringList, IntegerList, RealList def test_ogr_mem_13(): if gdaltest.mem_ds is None: pytest.skip() lyr = gdaltest.mem_ds.CreateLayer('listlayer') field_defn = ogr.FieldDefn('stringlist', ogr.OFTStringList) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('intlist', ogr.OFTIntegerList) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('reallist', ogr.OFTRealList) lyr.CreateField(field_defn) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) try: feat.SetFieldStringList except AttributeError: # OG python bindings pytest.skip() feat.SetFieldStringList(0, ['a', 'b']) assert feat.GetFieldAsStringList(0) == ['a', 'b'] feat.SetFieldIntegerList(1, [2, 3]) assert feat.GetFieldAsIntegerList(1) == [2, 3] feat.SetFieldDoubleList(2, [4., 5.]) assert feat.GetFieldAsDoubleList(2) == [4., 5.] ############################################################################### # Test SetNextByIndex def test_ogr_mem_14(): if gdaltest.mem_ds is None: pytest.skip() lyr = gdaltest.mem_ds.CreateLayer('SetNextByIndex') field_defn = ogr.FieldDefn('foo', ogr.OFTString) lyr.CreateField(field_defn) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetField(0, 'first feature') lyr.CreateFeature(feat) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetField(0, 'second feature') lyr.CreateFeature(feat) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetField(0, 'third feature') lyr.CreateFeature(feat) assert lyr.TestCapability(ogr.OLCFastSetNextByIndex), \ 'OLCFastSetNextByIndex capability test failed.' assert lyr.SetNextByIndex(1) == 0, 'SetNextByIndex() failed' feat = lyr.GetNextFeature() assert feat.GetFieldAsString(0) == 'second feature', 'did not get expected feature' assert lyr.SetNextByIndex(-1) != 0, 'SetNextByIndex() should have failed' assert lyr.SetNextByIndex(100) != 0, 'SetNextByIndex() should have failed' lyr.SetAttributeFilter("foo != 'second feature'") assert not lyr.TestCapability(ogr.OLCFastSetNextByIndex), \ 'OLCFastSetNextByIndex capability test should have failed.' assert lyr.SetNextByIndex(1) == 0, 'SetNextByIndex() failed' feat = lyr.GetNextFeature() assert feat.GetFieldAsString(0) == 'third feature', 'did not get expected feature' ############################################################################### # Test non-linear geometries def test_ogr_mem_15(): lyr = gdaltest.mem_ds.CreateLayer('wkbCircularString', geom_type=ogr.wkbCircularString) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 0,0 0)')) lyr.CreateFeature(f) f = None assert lyr.GetGeomType() == ogr.wkbCircularString assert lyr.GetLayerDefn().GetGeomType() == ogr.wkbCircularString assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetType() == ogr.wkbCircularString f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryType() == ogr.wkbCircularString # Test SetNonLinearGeometriesEnabledFlag(False) old_val = ogr.GetNonLinearGeometriesEnabledFlag() ogr.SetNonLinearGeometriesEnabledFlag(False) assert lyr.GetGeomType() == ogr.wkbLineString assert lyr.GetLayerDefn().GetGeomType() == ogr.wkbLineString assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetType() == ogr.wkbLineString lyr.ResetReading() f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryType() == ogr.wkbLineString lyr.ResetReading() f = lyr.GetNextFeature() g = f.GetGeomFieldRef(0) assert g.GetGeometryType() == ogr.wkbLineString ogr.SetNonLinearGeometriesEnabledFlag(old_val) ############################################################################### # Test map implementation def test_ogr_mem_16(): lyr = gdaltest.mem_ds.CreateLayer('ogr_mem_16') f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 assert f.GetFID() == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 assert f.GetFID() == 1 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(100000000) ret = lyr.CreateFeature(f) assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(100000000) ret = lyr.SetFeature(f) assert ret == 0 assert lyr.GetFeatureCount() == 3 assert lyr.GetFeature(0) is not None assert lyr.GetFeature(1) is not None assert lyr.GetFeature(2) is None assert lyr.GetFeature(100000000) is not None lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == 0 f = lyr.GetNextFeature() assert f.GetFID() == 1 f = lyr.GetNextFeature() assert f.GetFID() == 100000000 f = lyr.GetNextFeature() assert f is None f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(100000000) ret = lyr.CreateFeature(f) assert ret == 0 assert f.GetFID() == 2 assert lyr.GetFeatureCount() == 4 ret = lyr.DeleteFeature(1) assert ret == 0 assert lyr.GetFeatureCount() == 3 ret = lyr.DeleteFeature(1) assert ret != 0 assert lyr.GetFeatureCount() == 3 # Test first feature with huge ID lyr = gdaltest.mem_ds.CreateLayer('ogr_mem_16_bis') f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1234567890123) ret = lyr.CreateFeature(f) assert ret == 0 assert f.GetFID() == 1234567890123 f = None # Important we must not have dangling references before modifying the schema ! # Create a field so as to test OGRMemLayerIteratorMap lyr.CreateField(ogr.FieldDefn('foo')) ############################################################################### # Test Dataset.GetNextFeature() implementation def test_ogr_mem_17(): ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = ds.CreateLayer('ogr_mem_1') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) lyr = ds.CreateLayer('ogr_mem_2') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) lyr = ds.CreateLayer('ogr_mem_3') # Empty layer lyr = ds.CreateLayer('ogr_mem_4') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f, lyr = ds.GetNextFeature() assert f is not None and lyr.GetName() == 'ogr_mem_1' f, lyr = ds.GetNextFeature() assert f is not None and lyr.GetName() == 'ogr_mem_1' f, lyr = ds.GetNextFeature() assert f is not None and lyr.GetName() == 'ogr_mem_2' f, lyr = ds.GetNextFeature() assert f is not None and lyr.GetName() == 'ogr_mem_4' f, lyr = ds.GetNextFeature() assert f is None and lyr is None f, lyr = ds.GetNextFeature() assert f is None and lyr is None ds.ResetReading() f, lyr = ds.GetNextFeature() assert f is not None and lyr.GetName() == 'ogr_mem_1' ds.ResetReading() f, lyr, pct = ds.GetNextFeature(include_pct=True) assert f is not None and lyr.GetName() == 'ogr_mem_1' and pct == 0.25 f, pct = ds.GetNextFeature(include_layer=False, include_pct=True) assert f is not None and pct == 0.50 f, pct = ds.GetNextFeature(include_layer=False, include_pct=True) assert f is not None and pct == 0.75 f, pct = ds.GetNextFeature(include_layer=False, include_pct=True) assert f is not None and pct == 1.0 f, pct = ds.GetNextFeature(include_layer=False, include_pct=True) assert f is None and pct == 1.0 f, pct = ds.GetNextFeature(include_layer=False, include_pct=True) assert f is None and pct == 1.0 ds.ResetReading() f = ds.GetNextFeature(include_layer=False) assert f is not None def test_ogr_mem_cleanup(): if gdaltest.mem_ds is None: pytest.skip() ogr.SetNonLinearGeometriesEnabledFlag(True) gdaltest.mem_ds = None gdalautotest-3.0.4/ogr/ogr_gmlas.py0000755003401500001440000033521013614005325016751 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_gmlas.py 74d67acbfdb033d1e062c214f8041ee578b1bd29 2019-04-17 22:56:53 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: GMLAS driver testing. # Author: Even Rouault, # # Initial development funded by the European Earth observation programme # Copernicus # # ****************************************************************************** # 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. ############################################################################### try: from BaseHTTPServer import BaseHTTPRequestHandler except ImportError: from http.server import BaseHTTPRequestHandler import os import os.path import sys import gdaltest import ogrtest import webserver from osgeo import gdal from osgeo import ogr import pytest ############################################################################### def compare_ogrinfo_output(gmlfile, reffile, options=''): import test_cli_utilities if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() tmpfilename = 'tmp/' + os.path.basename(gmlfile) + '.txt' ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al GMLAS:' + gmlfile + ' -oo EXPOSE_METADATA_LAYERS=YES ' + '-oo @KEEP_RELATIVE_PATHS_FOR_METADATA=YES ' + '-oo @EXPOSE_SCHEMAS_NAME_IN_METADATA=NO ' + '-oo @EXPOSE_CONFIGURATION_IN_METADATA=NO' + ' ' + options, encoding='utf-8') ret = ret.replace('\r\n', '\n') ret = ret.replace('data\\gmlas\\', 'data/gmlas/') # Windows expected = open(reffile, 'rb').read().decode('utf-8') expected = expected.replace('\r\n', '\n') if ret != expected: print(ret.encode('utf-8')) open(tmpfilename, 'wb').write(ret.encode('utf-8')) print('Diff:') os.system('diff -u ' + reffile + ' ' + tmpfilename) # os.unlink(tmpfilename) pytest.fail('Got:') ############################################################################### # Basic test def test_ogr_gmlas_basic(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', 'YES') # FileGDB embedded libxml2 cause random crashes with CPLValidateXML() use of external libxml2 ogrtest.old_val_GDAL_XML_VALIDATION = gdal.GetConfigOption('GDAL_XML_VALIDATION') if ogr.GetDriverByName('FileGDB') is not None and ogrtest.old_val_GDAL_XML_VALIDATION is None: gdal.SetConfigOption('GDAL_XML_VALIDATION', 'NO') ds = ogr.Open('GMLAS:data/gmlas/gmlas_test1.xml') assert ds is not None ds = None # Skip tests when -fsanitize is used if gdaltest.is_travis_branch('sanitize'): pytest.skip('Skipping because of -sanitize') return compare_ogrinfo_output('data/gmlas/gmlas_test1.xml', 'data/gmlas/gmlas_test1.txt') ############################################################################### # Run test_ogrsf def test_ogr_gmlas_test_ogrsf(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Skip tests when -fsanitize is used if gdaltest.is_travis_branch('sanitize'): pytest.skip('Skipping because of -sanitize') import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro GMLAS:data/gmlas/gmlas_test1.xml') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test virtual file support def test_ogr_gmlas_virtual_file(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_8.xml', """""") gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_8.xsd', """ """) ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_8.xml') assert ds is not None gdal.Unlink('/vsimem/ogr_gmlas_8.xml') gdal.Unlink('/vsimem/ogr_gmlas_8.xsd') ############################################################################### # Test opening with XSD option def test_ogr_gmlas_datafile_with_xsd_option(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['XSD=data/gmlas/gmlas_test1.xsd']) assert ds is not None ############################################################################### # Test opening with just XSD option def test_ogr_gmlas_no_datafile_with_xsd_option(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xsd']) assert ds is not None ############################################################################### # Test opening with just XSD option but pointing to a non-xsd filename def test_ogr_gmlas_no_datafile_xsd_which_is_not_xsd(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xml']) assert ds is None assert gdal.GetLastErrorMsg().find("invalid content in 'schema' element") >= 0 ############################################################################### # Test opening with nothing def test_ogr_gmlas_no_datafile_no_xsd(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:') assert ds is None assert gdal.GetLastErrorMsg().find('XSD open option must be provided when no XML data file is passed') >= 0 ############################################################################### # Test opening an inexisting GML file def test_ogr_gmlas_non_existing_gml(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/i_do_not_exist.gml') assert ds is None assert gdal.GetLastErrorMsg().find('Cannot open /vsimem/i_do_not_exist.gml') >= 0 ############################################################################### # Test opening with just XSD option but pointing to a non existing file def test_ogr_gmlas_non_existing_xsd(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:', open_options=['XSD=/vsimem/i_do_not_exist.xsd']) assert ds is None assert gdal.GetLastErrorMsg().find('Cannot resolve /vsimem/i_do_not_exist.xsd') >= 0 ############################################################################### # Test opening a GML file without schemaLocation def test_ogr_gmlas_gml_without_schema_location(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_gml_without_schema_location.xml', """""") with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_gml_without_schema_location.xml') assert ds is None assert gdal.GetLastErrorMsg().find('No schema locations found when analyzing data file: XSD open option must be provided') >= 0 gdal.Unlink('/vsimem/ogr_gmlas_gml_without_schema_location.xml') ############################################################################### # Test invalid schema def test_ogr_gmlas_invalid_schema(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_invalid_schema.xml') assert ds is None assert gdal.GetLastErrorMsg().find('invalid content') >= 0 ############################################################################### # Test invalid XML def test_ogr_gmlas_invalid_xml(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_invalid_xml.xml') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() assert f is None assert gdal.GetLastErrorMsg().find('input ended before all started tags were ended') >= 0 ############################################################################### # Test links with gml:ReferenceType def test_ogr_gmlas_gml_Reference(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:data/gmlas/gmlas_test_targetelement.xml') assert ds.GetLayerCount() == 3 lyr = ds.GetLayerByName('main_elt') with gdaltest.error_handler(): f = lyr.GetNextFeature() if f['reference_existing_target_elt_with_required_id_href'] != '#BAZ' or \ f['reference_existing_target_elt_with_required_id_pkid'] != 'BAZ' or \ f['reference_existing_target_elt_with_optional_id_href'] != '#BAZ2' or \ f['refe_exis_targ_elt_with_opti_id_targe_elt_with_optio_id_pkid'] != 'F36BAD21BD2F14DDCA8852DBF8C90DBC_target_elt_with_optional_id_1' or \ f['reference_existing_abstract_target_elt_href'] != '#BAW' or \ f.IsFieldSet('reference_existing_abstract_target_elt_nillable_href') or \ f['reference_existing_abstract_target_elt_nillable_nil'] != 1: f.DumpReadable() pytest.fail() ############################################################################### # Test that we fix ambiguities in class names def test_ogr_gmlas_same_element_in_different_ns(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_same_element_in_different_ns.xml') assert ds is not None # for i in range(ds.GetLayerCount()): # print(ds.GetLayer(i).GetName()) assert ds.GetLayerCount() == 5 lyr = ds.GetLayerByName('elt') f = lyr.GetNextFeature() if f.IsFieldSet('abstractElt_other_ns_realizationOfAbstractElt_pkid') == 0: f.DumpReadable() pytest.fail() assert ds.GetLayerByName('myns_realizationOfAbstractElt') is not None assert ds.GetLayerByName('other_ns_realizationOfAbstractElt') is not None assert ds.GetLayerByName('elt_elt2_abstractElt_myns_realizationOfAbstractElt') is not None assert ds.GetLayerByName('elt_elt2_abstractElt_other_ns_realizationOfAbstractElt') is not None ############################################################################### # Test a corner case of relative path resolution def test_ogr_gmlas_corner_case_relative_path(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:../ogr/data/gmlas/gmlas_test1.xml') assert ds is not None ############################################################################### # Test unexpected repeated element def test_ogr_gmlas_unexpected_repeated_element(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_unexpected_repeated_element.xml') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if f is None or f['foo'] != 'foo_again': # somewhat arbitrary to keep the latest one! f.DumpReadable() pytest.fail() assert gdal.GetLastErrorMsg().find('Unexpected element myns:main_elt/myns:foo') >= 0 f = lyr.GetNextFeature() assert f is None ds = None ############################################################################### # Test unexpected repeated element def test_ogr_gmlas_unexpected_repeated_element_variant(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_unexpected_repeated_element_variant.xml') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if f is None or f['foo'] != 'foo_again': # somewhat arbitrary to keep the latest one! f.DumpReadable() pytest.fail() assert gdal.GetLastErrorMsg().find('Unexpected element myns:main_elt/myns:foo') >= 0 f = lyr.GetNextFeature() assert f is None ds = None ############################################################################### # Test reading geometries embedded in a geometry property element def test_ogr_gmlas_geometryproperty(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32.gml', open_options=[ 'CONFIG_FILE=true']) lyr = ds.GetLayer(0) with gdaltest.error_handler(): geom_field_count = lyr.GetLayerDefn().GetGeomFieldCount() assert geom_field_count == 15 f = lyr.GetNextFeature() if f['geometryProperty_xml'] != ' 49 2 ': f.DumpReadable() pytest.fail() if not f.IsFieldNull('geometryPropertyEmpty_xml'): f.DumpReadable() pytest.fail() if f['pointProperty_xml'] != '50 3': f.DumpReadable() pytest.fail() if f['pointPropertyRepeated_xml'] != [ '0 1', '1 2', '3 4']: f.DumpReadable() pytest.fail(f['pointPropertyRepeated_xml']) geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') sr = lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetSpatialRef() assert not (sr is None or sr.ExportToWkt().find('4326') < 0) wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping if wkt != 'POINT (2 49)': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryPropertyEmpty') if f.GetGeomFieldRef(geom_idx) is not None: f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('pointProperty') sr = lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetSpatialRef() assert not (sr is None or sr.ExportToWkt().find('4326') < 0) wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() if wkt != 'POINT (3 50)': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') sr = lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetSpatialRef() assert not (sr is None or sr.ExportToWkt().find('4326') < 0) assert lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetType() == ogr.wkbLineString wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() if wkt != 'LINESTRING (2 49)': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('pointPropertyRepeated') assert lyr.GetLayerDefn().GetGeomFieldDefn(geom_idx).GetType() == ogr.wkbUnknown wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() if wkt != 'GEOMETRYCOLLECTION (POINT (0 1),POINT (1 2),POINT (3 4))': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('mycustompointproperty_point') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() if wkt != 'POINT (5 6)': f.DumpReadable() pytest.fail() # Test that on-the-fly reprojection works f = lyr.GetNextFeature() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') geom = f.GetGeomFieldRef(geom_idx) if ogrtest.check_feature_geometry(geom, 'POINT (3.0 0.0)') != 0: f.DumpReadable() pytest.fail() # Failed reprojection with gdaltest.error_handler(): f = lyr.GetNextFeature() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') if f.GetGeomFieldRef(geom_idx) is not None: f.DumpReadable() pytest.fail() # Test SWAP_COORDINATES=NO ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32.gml', open_options=['SWAP_COORDINATES=NO']) lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping if wkt != 'POINT (49 2)': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping if wkt != 'LINESTRING (2 49)': f.DumpReadable() pytest.fail() # Test SWAP_COORDINATES=YES ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32.gml', open_options=['SWAP_COORDINATES=YES']) lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping if wkt != 'POINT (2 49)': f.DumpReadable() pytest.fail() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('lineStringProperty') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() # Axis swapping if wkt != 'LINESTRING (49 2)': f.DumpReadable() pytest.fail() ############################################################################### # Test reading geometries referenced by a AbstractGeometry element def test_ogr_gmlas_abstractgeometry(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_abstractgeometry_gml32.gml', open_options=[ 'CONFIG_FILE=true']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldCount() == 2 f = lyr.GetNextFeature() if f['AbstractGeometry_xml'] != '0 1': f.DumpReadable() pytest.fail() if f['repeated_AbstractGeometry_xml'] != [ '0 1', '1 2']: f.DumpReadable() pytest.fail(f['repeated_AbstractGeometry_xml']) wkt = f.GetGeomFieldRef(0).ExportToWkt() if wkt != 'POINT (0 1)': f.DumpReadable() pytest.fail() wkt = f.GetGeomFieldRef(1).ExportToWkt() if wkt != 'GEOMETRYCOLLECTION (POINT (0 1),POINT (1 2))': f.DumpReadable() pytest.fail() ############################################################################### # Test validation against schema class MyHandler(object): def __init__(self): self.error_list = [] def error_handler(self, err_type, err_no, err_msg): if err_type != 1: # 1 == Debug self.error_list.append((err_type, err_no, err_msg)) def test_ogr_gmlas_validate(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # By default check we are silent about validation error ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml') assert ds is not None myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', None) lyr = ds.GetLayer(0) lyr.GetFeatureCount() gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', 'YES') gdal.PopErrorHandler() assert not myhandler.error_list ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml') assert ds is not None myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) lyr = ds.GetLayer(0) lyr.GetFeatureCount() gdal.PopErrorHandler() # Unexpected element with xpath=myns:main_elt/myns:bar (subxpath=myns:main_elt/myns:bar) found assert len(myhandler.error_list) >= 2 # Enable validation on a doc without validation errors myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['VALIDATE=YES']) gdal.PopErrorHandler() assert ds is not None, myhandler.error_list assert not myhandler.error_list # Enable validation on a doc without validation error, and with explicit XSD gdal.FileFromMemBuffer('/vsimem/gmlas_test1.xml', open('data/gmlas/gmlas_test1.xml').read()) myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) ds = gdal.OpenEx('GMLAS:/vsimem/gmlas_test1.xml', open_options=[ 'XSD=' + os.getcwd() + '/data/gmlas/gmlas_test1.xsd', 'VALIDATE=YES']) gdal.PopErrorHandler() gdal.Unlink('/vsimem/gmlas_test1.xml') assert ds is not None, myhandler.error_list assert not myhandler.error_list # Validation errors, but do not prevent dataset opening myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml', open_options=['VALIDATE=YES']) gdal.PopErrorHandler() assert ds is not None assert len(myhandler.error_list) == 5 # Validation errors and do prevent dataset opening myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml', open_options=['VALIDATE=YES', 'FAIL_IF_VALIDATION_ERROR=YES']) gdal.PopErrorHandler() assert ds is None assert len(myhandler.error_list) == 6 # Test that validation without doc doesn't crash myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xsd', 'VALIDATE=YES']) gdal.PopErrorHandler() assert ds is not None, myhandler.error_list assert not myhandler.error_list ############################################################################### # Test correct namespace prefix handling def test_ogr_gmlas_test_ns_prefix(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # The schema doesn't directly import xlink, but indirectly references it ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test_targetelement.xsd']) lyr = ds.GetLayerByName('_ogr_fields_metadata') f = lyr.GetNextFeature() if f['field_xpath'] != 'myns:main_elt/myns:reference_missing_target_elt/@xlink:href': f.DumpReadable() pytest.fail() ############################################################################### # Test parsing documents without namespace def test_ogr_gmlas_no_namespace(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:data/gmlas/gmlas_no_namespace.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['foo'] != 'bar': f.DumpReadable() pytest.fail() ############################################################################### # Test CONFIG_FILE def test_ogr_gmlas_conf(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Non existing file with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['CONFIG_FILE=not_existing']) assert ds is None # Broken conf file gdal.FileFromMemBuffer('/vsimem/my_conf.xml', "") with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['CONFIG_FILE=/vsimem/my_conf.xml']) gdal.Unlink('/vsimem/my_conf.xml') assert ds is None # Valid XML, but not validating gdal.FileFromMemBuffer('/vsimem/my_conf.xml', "") with gdaltest.error_handler(): gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['CONFIG_FILE=/vsimem/my_conf.xml']) gdal.Unlink('/vsimem/my_conf.xml') # Inlined conf file + UseArrays = false ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=[ 'CONFIG_FILE=false']) assert ds is not None lyr = ds.GetLayerByName('main_elt_string_array') assert lyr.GetFeatureCount() == 2 # AlwaysGenerateOGRId = true ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=[ 'CONFIG_FILE=true']) assert ds is not None lyr = ds.GetLayerByName('main_elt') f = lyr.GetNextFeature() if f['ogr_pkid'].find('main_elt_1') < 0 or \ f['otherns_id'] != 'otherns_id': f.DumpReadable() pytest.fail() # IncludeGeometryXML = false ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32.gml', open_options=[ 'CONFIG_FILE=false']) assert ds is not None lyr = ds.GetLayer(0) with gdaltest.error_handler(): assert lyr.GetLayerDefn().GetFieldIndex('geometryProperty_xml') < 0 f = lyr.GetNextFeature() geom_idx = lyr.GetLayerDefn().GetGeomFieldIndex('geometryProperty') wkt = f.GetGeomFieldRef(geom_idx).ExportToWkt() if wkt != 'POINT (2 49)': f.DumpReadable() pytest.fail() # ExposeMetadataLayers = true ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_abstractgeometry_gml32.gml', open_options=[ 'CONFIG_FILE=true']) assert ds is not None assert ds.GetLayerCount() == 5 # Test override with open option ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_abstractgeometry_gml32.gml', open_options=[ 'EXPOSE_METADATA_LAYERS=NO', 'CONFIG_FILE=true']) assert ds is not None assert ds.GetLayerCount() == 1 # Turn on validation and error on validation with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate.xml', open_options=[ 'CONFIG_FILE=true']) assert ds is None and gdal.GetLastErrorMsg().find('Validation') >= 0 ############################################################################### # Test IgnoredXPaths aspect of config file def test_ogr_gmlas_conf_ignored_xpath(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Test unsupported and invalid XPaths for xpath in ['', '1', '@', '@/', '.', ':', '/:', 'a:', 'a:1', 'foo[1]', "foo[@bar='baz']"]: with gdaltest.error_handler(): gdal.OpenEx('GMLAS:', open_options=[ 'XSD=data/gmlas/gmlas_test1.xsd', """CONFIG_FILE= true %s """ % xpath]) assert gdal.GetLastErrorMsg().find('XPath syntax') >= 0, xpath # Test duplicating mapping with gdaltest.error_handler(): gdal.OpenEx('GMLAS:', open_options=[ 'XSD=data/gmlas/gmlas_test1.xsd', """CONFIG_FILE= """]) assert gdal.GetLastErrorMsg().find('Prefix ns was already mapped') >= 0 # Test XPath with implicit namespace, and warning ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=[ """CONFIG_FILE= true @otherns:id """]) assert ds is not None lyr = ds.GetLayerByName('main_elt') assert lyr.GetLayerDefn().GetFieldIndex('otherns_id') < 0 with gdaltest.error_handler(): lyr.GetNextFeature() assert gdal.GetLastErrorMsg().find('Attribute with xpath=myns:main_elt/@otherns:id found in document but ignored') >= 0 # Test XPath with explicit namespace, and warning suppression ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=[ """CONFIG_FILE= @other_ns:id """]) assert ds is not None lyr = ds.GetLayerByName('main_elt') lyr.GetNextFeature() assert gdal.GetLastErrorMsg() == '' # Test various XPath syntaxes ds = gdal.OpenEx('GMLAS:', open_options=[ 'XSD=data/gmlas/gmlas_test1.xsd', """CONFIG_FILE= false myns:main_elt/@optionalStrAttr myns:main_elt//@fixedValUnset myns:main_elt/myns:base_int //myns:string myns:main_elt//myns:string_array a unknown_ns:foo myns:main_elt/myns:int_arra foo/myns:long """]) assert ds is not None lyr = ds.GetLayerByName('main_elt') # Ignored fields assert lyr.GetLayerDefn().GetFieldIndex('optionalStrAttr') < 0 assert lyr.GetLayerDefn().GetFieldIndex('fixedValUnset') < 0 assert lyr.GetLayerDefn().GetFieldIndex('base_int') < 0 assert lyr.GetLayerDefn().GetFieldIndex('string') < 0 assert lyr.GetLayerDefn().GetFieldIndex('string_array') < 0 # Present fields assert lyr.GetLayerDefn().GetFieldIndex('int_array') >= 0 assert lyr.GetLayerDefn().GetFieldIndex('long') >= 0 ############################################################################### do_log = False class GMLASHTTPHandler(BaseHTTPRequestHandler): def log_request(self, code='-', size='-'): pass def do_GET(self): try: if do_log: f = open('/tmp/log.txt', 'a') f.write('GET %s\n' % self.path) f.close() if self.path.startswith('/vsimem/'): f = gdal.VSIFOpenL(self.path, "rb") if f is None: self.send_response(404) self.end_headers() else: gdal.VSIFSeekL(f, 0, 2) size = gdal.VSIFTellL(f) gdal.VSIFSeekL(f, 0, 0) content = gdal.VSIFReadL(1, size, f) gdal.VSIFCloseL(f) self.protocol_version = 'HTTP/1.0' self.send_response(200) self.end_headers() self.wfile.write(content) return return except IOError: pass self.send_error(404, 'File Not Found: %s' % self.path) ############################################################################### # Test schema caching def test_ogr_gmlas_cache(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() (webserver_process, webserver_port) = webserver.launch(handler=GMLASHTTPHandler) if webserver_port == 0: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache.xml', """ bar """ % webserver_port) gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache.xsd', """ """) gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_cache_2.xsd', """ """) # First try with remote schema download disabled with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=false/vsimem/my/gmlas_cache']) assert ds is None and gdal.GetLastErrorMsg().find('Cannot resolve') >= 0 # Test invalid cache directory with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=/inexisting_directory/not/exist']) if ds is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() if ds.GetLayerCount() != 1: webserver.server_stop(webserver_process, webserver_port) pytest.fail(ds.GetLayerCount()) # Will create the directory and download and cache ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=/vsimem/my/gmlas_cache']) if ds is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() if ds.GetLayerCount() != 1: webserver.server_stop(webserver_process, webserver_port) pytest.fail(ds.GetLayerCount()) gdal.Unlink('/vsimem/my/gmlas_cache/' + gdal.ReadDir('/vsimem/my/gmlas_cache')[0]) # Will reuse the directory and download and cache ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=/vsimem/my/gmlas_cache']) if ds is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() if ds.GetLayerCount() != 1: webserver.server_stop(webserver_process, webserver_port) pytest.fail() # With XSD open option ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'XSD=http://localhost:%d/vsimem/ogr_gmlas_cache.xsd' % webserver_port, 'CONFIG_FILE=/vsimem/my/gmlas_cache']) if ds is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() if ds.GetLayerCount() != 1: webserver.server_stop(webserver_process, webserver_port) pytest.fail() webserver.server_stop(webserver_process, webserver_port) # Now re-open with the webserver turned off ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=/vsimem/my/gmlas_cache']) assert ds is not None assert ds.GetLayerCount() == 1 # Re try but ask for refresh with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'REFRESH_CACHE=YES', 'CONFIG_FILE=/vsimem/my/gmlas_cache']) if ds is not None or gdal.GetLastErrorMsg().find('Cannot resolve') < 0: webserver.server_stop(webserver_process, webserver_port) pytest.fail(gdal.GetLastErrorMsg()) # Re try with non existing cached schema gdal.Unlink('/vsimem/my/gmlas_cache/' + gdal.ReadDir('/vsimem/my/gmlas_cache')[0]) with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_cache.xml', open_options=[ 'CONFIG_FILE=/vsimem/my/gmlas_cache']) assert ds is None and gdal.GetLastErrorMsg().find('Cannot resolve') >= 0 # Cleanup gdal.Unlink('/vsimem/ogr_gmlas_cache.xml') gdal.Unlink('/vsimem/ogr_gmlas_cache.xsd') gdal.Unlink('/vsimem/ogr_gmlas_cache_2.xsd') files = gdal.ReadDir('/vsimem/my/gmlas_cache') for my_file in files: gdal.Unlink('/vsimem/my/gmlas_cache/' + my_file) gdal.Rmdir('/vsimem/my/gmlas_cache') gdal.Rmdir('/vsimem/my') ############################################################################### # Test good working of linking to a child through its id attribute def test_ogr_gmlas_link_nested_independant_child(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:data/gmlas/gmlas_link_nested_independant_child.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['second_my_id'] != 'second_id': f.DumpReadable() pytest.fail() ############################################################################### # Test some pattern found in geosciml schemas def test_ogr_gmlas_composition_compositionPart(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:data/gmlas/gmlas_composition_compositionPart.xml') lyr = ds.GetLayerByName('first_composition') f = lyr.GetNextFeature() if f.IsFieldSet('parent_ogr_pkid') == 0 or f.IsFieldSet('CompositionPart_pkid') == 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('parent_ogr_pkid') == 0 or f.IsFieldSet('CompositionPart_pkid') == 0: f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('CompositionPart') f = lyr.GetNextFeature() if f.IsFieldSet('my_id') == 0 or f.IsFieldSet('a') == 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('my_id') == 0 or f.IsFieldSet('a') == 0: f.DumpReadable() pytest.fail() ############################################################################### # Test that when importing GML we expose by default only elements deriving # from _Feature/AbstractFeature def test_ogr_gmlas_instantiate_only_gml_feature(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.tempfile('/vsimem/with space/gmlas_instantiate_only_gml_feature.xsd', open('data/gmlas/gmlas_instantiate_only_gml_feature.xsd', 'rb').read()): with gdaltest.tempfile('/vsimem/with space/gmlas_fake_gml32.xsd', open('data/gmlas/gmlas_fake_gml32.xsd', 'rb').read()): ds = gdal.OpenEx('GMLAS:', open_options=['XSD=/vsimem/with space/gmlas_instantiate_only_gml_feature.xsd']) assert ds.GetLayerCount() == 1 ds = None ############################################################################### # Test that WFS style timeStamp are ignored for hash generation def test_ogr_gmlas_timestamp_ignored_for_hash(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = ogr.Open('GMLAS:data/gmlas/gmlas_timestamp_ignored_for_hash_foo.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() pkid = f['ogr_pkid'] ds = ogr.Open('GMLAS:data/gmlas/gmlas_timestamp_ignored_for_hash_bar.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['ogr_pkid'] != pkid: f.DumpReadable() pytest.fail(pkid) ############################################################################### # Test dataset GetNextFeature() def test_ogr_gmlas_dataset_getnextfeature(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml') assert ds.TestCapability(ogr.ODsCRandomLayerRead) == 1 count = 0 last_l = None while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 last_l = lyr base_count = 59 assert count == base_count assert last_l.GetName() == 'main_elt' f, lyr = ds.GetNextFeature() assert f is None and lyr is None ds.ResetReading() last_pct = 0 while True: f, l, pct = ds.GetNextFeature(include_pct=True) last_pct = pct if f is None: assert l is None break assert last_pct == 1.0 ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['EXPOSE_METADATA_LAYERS=YES']) fc_map = {} for layer_name in ('_ogr_fields_metadata', '_ogr_layers_metadata', '_ogr_layer_relationships', '_ogr_other_metadata'): fc_map[layer_name] = ds.GetLayerByName(layer_name).GetFeatureCount() ds = None ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['EXPOSE_METADATA_LAYERS=YES']) count = 0 while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 expected_count = base_count expected_count += fc_map['_ogr_fields_metadata'] expected_count += fc_map['_ogr_layers_metadata'] expected_count += fc_map['_ogr_layer_relationships'] expected_count += fc_map['_ogr_other_metadata'] assert count == expected_count f, lyr = ds.GetNextFeature() assert f is None and lyr is None ds.ResetReading() count = 0 while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 assert count == expected_count for layers in [['_ogr_fields_metadata'], ['_ogr_layers_metadata'], ['_ogr_layer_relationships'], ['_ogr_fields_metadata', '_ogr_layers_metadata'], ['_ogr_fields_metadata', '_ogr_layer_relationships'], ['_ogr_layers_metadata', '_ogr_layer_relationships'], ]: ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml') expected_count = base_count for layer in layers: ds.GetLayerByName(layer) expected_count += fc_map[layer] count = 0 while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 assert count == expected_count f, lyr = ds.GetNextFeature() assert f is None and lyr is None # Test iterating over metadata layers on XSD-only based dataset ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_test1.xsd', 'EXPOSE_METADATA_LAYERS=YES']) count = 0 last_l = None while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 last_l = lyr assert count != 0 ############################################################################### # Test that with schemas that have a structure like a base:identifier, we # will inline it. def test_ogr_gmlas_inline_identifier(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_inline_identifier.xsd']) if ds.GetLayerCount() != 2: for i in range(ds.GetLayerCount()): print(ds.GetLayer(i).GetName()) pytest.fail(ds.GetLayerCount()) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldIndex('identifier_foo') >= 0 ############################################################################### # Test that we can handle things like gml:name and au:name def test_ogr_gmlas_avoid_same_name_inlined_classes(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_avoid_same_name_inlined_classes.xsd']) assert ds.GetLayerCount() == 3 lyr = ds.GetLayerByName('myFeature_ns1_dt') assert lyr is not None lyr = ds.GetLayerByName('myFeature_ns2_dt') assert lyr is not None ############################################################################### # Test validation with an optional fixed attribute that is ignored def test_ogr_gmlas_validate_ignored_fixed_attribute(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() myhandler = MyHandler() gdal.PushErrorHandler(myhandler.error_handler) gdal.OpenEx('GMLAS:data/gmlas/gmlas_validate_ignored_fixed_attribute.xml', open_options=['VALIDATE=YES', 'CONFIG_FILE=@bar']) gdal.PopErrorHandler() assert not myhandler.error_list ############################################################################### # Test REMOVE_UNUSED_LAYERS and REMOVE_UNUSED_FIELDS options def test_ogr_gmlas_remove_unused_layers_and_fields(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_remove_unused_layers_and_fields.xml', open_options=['REMOVE_UNUSED_LAYERS=YES', 'REMOVE_UNUSED_FIELDS=YES']) assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if lyr.GetLayerDefn().GetFieldCount() != 4: f.DumpReadable() pytest.fail(lyr.GetLayerDefn().GetFieldCount()) assert f['used1'] == 'foo' and f['used2'] == 'bar' and f['nillable_nilReason'] == 'unknown' lyr = ds.GetLayerByName('_ogr_layers_metadata') if lyr.GetFeatureCount() != 1: for f in lyr: f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('_ogr_fields_metadata') if lyr.GetFeatureCount() != 7: for f in lyr: f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('_ogr_layer_relationships') if lyr.GetFeatureCount() != 0: for f in lyr: f.DumpReadable() pytest.fail() ############################################################################### # Test xlink resolution def test_ogr_gmlas_xlink_resolver(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() (webserver_process, webserver_port) = webserver.launch(handler=GMLASHTTPHandler) if webserver_port == 0: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xsd', """ """) gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver_fake_xlink.xsd', open('data/gmlas/gmlas_fake_xlink.xsd', 'rb').read()) gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xml', """ """ % (webserver_port, webserver_port)) # By default, no resolution ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml') lyr = ds.GetLayer(0) if lyr.GetLayerDefn().GetFieldIndex('my_link_rawcontent') >= 0: webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Enable resolution, but only from local cache ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=["""CONFIG_FILE= /vsimem/gmlas_xlink_cache false """]) lyr = ds.GetLayer(0) if lyr.GetLayerDefn().GetFieldIndex('my_link_rawcontent') < 0: webserver.server_stop(webserver_process, webserver_port) pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('my_link_rawcontent'): webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Try again but this time with the cached file cached_file = '/vsimem/gmlas_xlink_cache/localhost_%d_vsimem_resource.xml' % webserver_port gdal.FileFromMemBuffer(cached_file, 'foo') lyr.ResetReading() f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'foo': webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None gdal.Unlink(cached_file) # Enable remote resolution (but local caching disabled) gdal.FileFromMemBuffer('/vsimem/resource.xml', 'bar') gdal.FileFromMemBuffer('/vsimem/resource2.xml', 'baz') gdal.SetConfigOption('GMLAS_XLINK_RAM_CACHE_SIZE', '5') ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=["""CONFIG_FILE= /vsimem/gmlas_xlink_cache true """]) gdal.SetConfigOption('GMLAS_XLINK_RAM_CACHE_SIZE', None) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'bar': webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is not cached if gdal.VSIStatL(cached_file) is not None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Delete the remote file and check that we can retrieve it from RAM cache gdal.Unlink('/vsimem/resource.xml') lyr.ResetReading() f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'bar': webserver.server_stop(webserver_process, webserver_port) pytest.fail() f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'baz': webserver.server_stop(webserver_process, webserver_port) pytest.fail() gdal.Unlink('/vsimem/resource2.xml') lyr.ResetReading() # /vsimem/resource.xml has been evicted from the cache with gdaltest.error_handler(): f = lyr.GetNextFeature() if f['my_link_rawcontent'] is not None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'baz': webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Enable remote resolution and caching gdal.FileFromMemBuffer('/vsimem/resource.xml', 'bar') ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=["""CONFIG_FILE= /vsimem/gmlas_xlink_cache true true """]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'bar': webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is cached if gdal.VSIStatL(cached_file) is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Enable remote resolution and caching and REFRESH_CACHE gdal.FileFromMemBuffer('/vsimem/resource.xml', 'baz') ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=['REFRESH_CACHE=YES', """CONFIG_FILE= /vsimem/gmlas_xlink_cache true true """]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_rawcontent'] != 'baz': webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is cached if gdal.VSIStatL(cached_file) is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Test absent remote resource gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver_absent_resource.xml', """ """ % webserver_port) ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver_absent_resource.xml', open_options=["""CONFIG_FILE= /vsimem/gmlas_xlink_cache true """]) lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if f.IsFieldSet('my_link_rawcontent'): f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Test file size limit gdal.Unlink(cached_file) ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=["""CONFIG_FILE= 1 /vsimem/gmlas_xlink_cache true true """]) lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if gdal.GetLastErrorMsg() == '': webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is not cached if gdal.VSIStatL(cached_file) is not None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Test with URL specific rule with RawContent resolution gdal.FileFromMemBuffer('/vsimem/resource.xml', 'bar') ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=["""CONFIG_FILE= /vsimem/gmlas_xlink_cache http://localhost:%d/vsimem/ true RawContent true """ % webserver_port]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_attr_before'] != 'a' or \ f['my_link_href'] != 'http://localhost:%d/vsimem/resource.xml' % webserver_port or \ f['my_link_rawcontent'] != 'bar' or \ f['my_link_attr_after'] != 'b': f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() # Check that the content is cached if gdal.VSIStatL(cached_file) is None: webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None # Test with URL specific rule with FieldsFromXPath resolution gdal.FileFromMemBuffer('/vsimem/subdir1/resource.xml', """ fooVal 123 """) gdal.FileFromMemBuffer('/vsimem/subdir2/resource2_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_very_long.xml', """ fooVal2 fooVal3 foobar 1234567890123 1.25 2016-10-07T12:34:56Z """) gdal.FileFromMemBuffer('/vsimem/non_matching_resource.xml', 'foo') gdal.FileFromMemBuffer('/vsimem/ogr_gmlas_xlink_resolver.xml', """ """ % (webserver_port, webserver_port, webserver_port, webserver_port)) config_file = """ /vsimem/gmlas_xlink_cache http://localhost:%d/vsimem/subdir1 Accept application/x-iso19135+xml Accept-Language en true FieldsFromXPath true foo string myns:top/myns:foo bar integer myns:top/myns:bar http://localhost:%d/vsimem/subdir2 true FieldsFromXPath true foo string myns:top/myns:foo baz integer /myns:top/myns:baz/@val xml_blob string //myns:xml_blob long long //long double double //double datetime dateTime //datetime """ % (webserver_port, webserver_port) ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=['CONFIG_FILE=' + config_file]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_attr_before'] != 'a' or \ f['my_link_href'] != 'http://localhost:%d/vsimem/subdir1/resource.xml' % webserver_port or \ f['my_link_foo'] != 'fooVal' or \ f['my_link_bar'] != 123 or \ f['my_link_attr_after'] != 'b' or \ f['my_link2_attr_before'] != 'a2' or \ f['my_link2_href'] != 'http://localhost:%d/vsimem/subdir2/resource2_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_very_long.xml' % webserver_port or \ f['my_link2_foo'] != 'fooVal2 fooVal3' or \ f['my_link2_baz'] != 345 or \ f['my_link2_xml_blob'] != """foo bar""" or \ f['my_link2_long'] != 1234567890123 or \ f['my_link2_double'] != 1.25 or \ f['my_link2_datetime'] != '2016/10/07 12:34:56+00' or \ f['my_link2_bar'] is not None or \ f['my_link2_attr_after'] != 'b2': f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() f = lyr.GetNextFeature() if f['my_link2_bar'] != 123: f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() gdal.Unlink('/vsimem/subdir1/resource.xml') gdal.Unlink('/vsimem/subdir2/resource2_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_very_long.xml') # Test caching ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_xlink_resolver.xml', open_options=['CONFIG_FILE=' + config_file]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['my_link_attr_before'] != 'a' or \ f['my_link_href'] != 'http://localhost:%d/vsimem/subdir1/resource.xml' % webserver_port or \ f['my_link_foo'] != 'fooVal' or \ f['my_link_bar'] != 123 or \ f['my_link_attr_after'] != 'b' or \ f['my_link2_attr_before'] != 'a2' or \ f['my_link2_href'] != 'http://localhost:%d/vsimem/subdir2/resource2_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_very_long.xml' % webserver_port or \ f['my_link2_foo'] != 'fooVal2 fooVal3' or \ f['my_link2_baz'] != 345 or \ f['my_link2_bar'] is not None or \ f['my_link2_attr_after'] != 'b2': f.DumpReadable() webserver.server_stop(webserver_process, webserver_port) pytest.fail() ds = None webserver.server_stop(webserver_process, webserver_port) gdal.Unlink('/vsimem/ogr_gmlas_xlink_resolver.xsd') gdal.Unlink('/vsimem/ogr_gmlas_xlink_resolver_fake_xlink.xsd') gdal.Unlink('/vsimem/ogr_gmlas_xlink_resolver.xml') gdal.Unlink('/vsimem/ogr_gmlas_xlink_resolver_absent_resource.xml') fl = gdal.ReadDir('/vsimem/gmlas_xlink_cache') if fl is not None: for filename in fl: gdal.Unlink('/vsimem/gmlas_xlink_cache/' + filename) gdal.Unlink('/vsimem/gmlas_xlink_cache') gdal.Unlink('/vsimem/resource.xml') gdal.Unlink('/vsimem/resource2.xml') gdal.Unlink('/vsimem/subdir1/resource.xml') gdal.Unlink('/vsimem/subdir2/resource2_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_super_very_long.xml') gdal.Unlink('/vsimem/non_matching_resource.xml') ############################################################################### # Test UTF-8 support def test_ogr_gmlas_recoding(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() if sys.version_info >= (3, 0, 0): accent = '\u00e9' else: exec("accent = u'\\u00e9'") accent = accent.encode('UTF-8') ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_recoding.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['attr'] != accent: f.DumpReadable() pytest.fail() ############################################################################### # Test schema without namespace prefix def test_ogr_gmlas_schema_without_namespace_prefix(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Generic http:// namespace URI ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_schema_without_namespace_prefix_generic_http_uri.xsd']) lyr = ds.GetLayerByName('_ogr_layers_metadata') f = lyr.GetNextFeature() if f['layer_xpath'] != 'my_ns:main_elt': f.DumpReadable() pytest.fail() gdal.Unlink('/vsimem/ogr_gmlas_schema_without_namespace_prefix.xsd') # http://www.opengis.net/ namespace URI ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_schema_without_namespace_prefix_opengis_uri.xsd']) lyr = ds.GetLayerByName('_ogr_layers_metadata') f = lyr.GetNextFeature() if f['layer_xpath'] != 'fake_3_0:main_elt': f.DumpReadable() pytest.fail() gdal.Unlink('/vsimem/ogr_gmlas_schema_without_namespace_prefix.xsd') # Non http:// namespace URI ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_schema_without_namespace_prefix_non_http_uri.xsd']) lyr = ds.GetLayerByName('_ogr_layers_metadata') f = lyr.GetNextFeature() if f['layer_xpath'] != 'my_namespace:main_elt': f.DumpReadable() pytest.fail() ############################################################################### # Test parsing truncated XML def test_ogr_gmlas_truncated_xml(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_truncated_xml.xml') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() ############################################################################### # Test identifier truncation def test_ogr_gmlas_identifier_truncation(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=[ 'XSD=data/gmlas/gmlas_identifier_truncation.xsd', 'CONFIG_FILE=10false']) lyr = ds.GetLayerByName('v_l_i_clas') assert lyr is not None, ds.GetLayer(0).GetName() s = lyr.GetLayerDefn().GetFieldDefn(1).GetName() assert s == 'v_l_idTifi' s = lyr.GetLayerDefn().GetFieldDefn(2).GetName() assert s == 'an_lo_ide1' s = lyr.GetLayerDefn().GetFieldDefn(3).GetName() assert s == 'an_lo_ide2' s = lyr.GetLayerDefn().GetFieldDefn(4).GetName() assert s == 'x' s = lyr.GetLayerDefn().GetFieldDefn(5).GetName() assert s == 'noTCAMELCa' s = lyr.GetLayerDefn().GetFieldDefn(6).GetName() assert s == 'suuuuuuuuu' s = lyr.GetLayerDefn().GetFieldDefn(7).GetName() assert s == '_r_l_o_n_g' lyr = ds.GetLayerByName('a_l_i_cla1') assert lyr is not None, ds.GetLayer(1).GetName() lyr = ds.GetLayerByName('a_l_i_cla2') assert lyr is not None, ds.GetLayer(2).GetName() lyr = ds.GetLayerByName('y') assert lyr is not None, ds.GetLayer(3).GetName() ds = None ############################################################################### # Test behaviour when identifiers have same case def test_ogr_gmlas_identifier_case_ambiguity(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=[ 'XSD=data/gmlas/gmlas_identifier_case_ambiguity.xsd', 'CONFIG_FILE=false']) lyr = ds.GetLayerByName('differentcase1') assert lyr is not None, ds.GetLayer(0).GetName() s = lyr.GetLayerDefn().GetFieldDefn(1).GetName() assert s == 'differentcase1' s = lyr.GetLayerDefn().GetFieldDefn(2).GetName() assert s == 'DifferentCASE2' lyr = ds.GetLayerByName('DifferentCASE2') assert lyr is not None, ds.GetLayer(0).GetName() ds = None ############################################################################### # Test writing support def test_ogr_gmlas_writer(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() if ogr.GetDriverByName('SQLite') is None: pytest.skip() src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['EXPOSE_METADATA_LAYERS=YES']) tmp_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer.db', src_ds, format='SQLite') src_ds = None ret_ds = gdal.VectorTranslate('tmp/gmlas_test1_generated.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION']) tmp_ds = None gdal.Unlink('/vsimem/ogr_gmlas_writer.db') assert ret_ds is not None ############################################################################### # Check the generated .xml and .xsd def test_ogr_gmlas_writer_check_xml_xsd(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() if ogr.GetDriverByName('SQLite') is None: pytest.skip() got = open('tmp/gmlas_test1_generated.xml', 'rt').read() got = got.replace('\r\n', '\n') pos = got.find('http://myns ') + len('http://myns ') pos_end = got.find('"', pos) absolute_xsd = got[pos:pos_end] assert absolute_xsd.endswith('gmlas_test1.xsd') and os.path.exists(absolute_xsd) got = got.replace(absolute_xsd, 'gmlas_test1.xsd') expected = open('data/gmlas/gmlas_test1_generated.xml', 'rt').read() expected = expected.replace('\r\n', '\n') if got != expected: print(got) print('') print('Diff:') os.system('diff -u data/gmlas/gmlas_test1_generated.xml tmp/gmlas_test1_generated.xml') pytest.fail('Got:') got = open('tmp/gmlas_test1_generated.xsd', 'rt').read() got = got.replace('\r\n', '\n') pos = got.find('schemaLocation="') + len('schemaLocation="') pos_end = got.find('"', pos) absolute_xsd = got[pos:pos_end] assert absolute_xsd.endswith('gmlas_test1.xsd') and os.path.exists(absolute_xsd) got = got.replace(absolute_xsd, 'gmlas_test1.xsd') expected = open('data/gmlas/gmlas_test1_generated.xsd', 'rt').read() expected = expected.replace('\r\n', '\n') if got != expected: print(got) print('') print('Diff:') os.system('diff -u data/gmlas/gmlas_test1_generated.xsd tmp/gmlas_test1_generated.xsd') pytest.fail('Got:') ############################################################################### # Check that the .xml read back by the GMLAS driver has the same content # as the original one. def test_ogr_gmlas_writer_check_xml_read_back(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() if ogr.GetDriverByName('SQLite') is None: pytest.skip() # Skip tests when -fsanitize is used if gdaltest.is_travis_branch('sanitize'): pytest.skip('Skipping because of -sanitize') import test_cli_utilities if test_cli_utilities.get_ogrinfo_path() is None: gdal.Unlink('tmp/gmlas_test1_generated.xml') gdal.Unlink('tmp/gmlas_test1_generated.xsd') pytest.skip() # Compare the ogrinfo dump of the generated .xml with a reference one ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al GMLAS:tmp/gmlas_test1_generated.xml -oo VALIDATE=YES ' + '-oo EXPOSE_METADATA_LAYERS=YES ' + '-oo @KEEP_RELATIVE_PATHS_FOR_METADATA=YES ' + '-oo @EXPOSE_SCHEMAS_NAME_IN_METADATA=NO ' + '-oo @EXPOSE_CONFIGURATION_IN_METADATA=NO -oo @HASH=fake_hash') expected = open('data/gmlas/gmlas_test1.txt', 'rt').read() expected = expected.replace('\r\n', '\n') expected = expected.replace('data/gmlas/gmlas_test1.xml', 'tmp/gmlas_test1_generated.xml') expected = expected.replace('data/gmlas/gmlas_test1.xsd', os.path.join(os.getcwd(), 'data/gmlas/gmlas_test1.xsd')) expected = expected.replace('\\', '/') ret_for_comparison = ret.replace('\r\n', '\n') ret_for_comparison = ret_for_comparison.replace('\\', '/') ret_for_comparison = ret_for_comparison.replace('fake_hash', '3CF9893502A592E8CF5EA6EF3D8F8C7B') if ret_for_comparison != expected: print(open('tmp/gmlas_test1_generated.xml', 'rt').read()) print('') print('XSD:') print(open('tmp/gmlas_test1_generated.xsd', 'rt').read()) print('') print('ogrinfo dump:') print(ret) print('') open('tmp/gmlas_test1_generated_got.txt', 'wt').write(ret_for_comparison) open('tmp/gmlas_test1_generated_expected.txt', 'wt').write(expected) print('Diff:') os.system('diff -u tmp/gmlas_test1_generated_expected.txt tmp/gmlas_test1_generated_got.txt') os.unlink('tmp/gmlas_test1_generated_expected.txt') os.unlink('tmp/gmlas_test1_generated_got.txt') pytest.fail('XML:') gdal.Unlink('tmp/gmlas_test1_generated.xml') gdal.Unlink('tmp/gmlas_test1_generated.xsd') ############################################################################### # Test writing support with geometries def test_ogr_gmlas_writer_gml(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['EXPOSE_METADATA_LAYERS=YES', '@HASH=hash']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None # Test also with GMLAS: prefix as it is likely people might use it # as it is needed for the read side. ret_ds = gdal.VectorTranslate('GMLAS:/vsimem/ogr_gmlas_writer_gml.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION', 'LAYERS={SPATIAL_LAYERS}']) tmp_ds = None assert ret_ds is not None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_gml.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xml') gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xsd') assert 'xmlns:gml="http://fake_gml32"' in content assert '49 2' in content assert '50 3' in content assert ' 0 1' in content assert ' 1 2' in content ############################################################################### # Test writing support with geometries and -a_srs def test_ogr_gmlas_writer_gml_assign_srs(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['EXPOSE_METADATA_LAYERS=YES', '@HASH=hash']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None ret_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer_gml.xml', tmp_ds, format='GMLAS', dstSRS='EPSG:32631', reproject=False) tmp_ds = None assert ret_ds is not None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_gml.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xml') gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xsd') assert 'http://www.opengis.net/def/crs/EPSG/0/32631' in content # No geometry, but to test that the proxied ExecuteSQL() works src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_test1.xml', open_options=['EXPOSE_METADATA_LAYERS=YES']) tmp_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer.db', src_ds, format='SQLite') src_ds = None gdal.VectorTranslate('/vsimem/gmlas_test1_generated_ref0.xml', tmp_ds, format='GMLAS', dstSRS='EPSG:32631', reproject=False, datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION']) gdal.VectorTranslate('/vsimem/gmlas_test1_generated_asrs.xml', tmp_ds, format='GMLAS', dstSRS='EPSG:32631', reproject=False, datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION']) tmp_ds = None gdal.Unlink('/vsimem/ogr_gmlas_writer.db') assert gdal.VSIStatL('/vsimem/gmlas_test1_generated_ref0.xml').size == gdal.VSIStatL('/vsimem/gmlas_test1_generated_asrs.xml').size gdal.Unlink('/vsimem/gmlas_test1_generated_ref0.xml') gdal.Unlink('/vsimem/gmlas_test1_generated_ref0.xsd') gdal.Unlink('/vsimem/gmlas_test1_generated_asrs.xml') gdal.Unlink('/vsimem/gmlas_test1_generated_asrs.xsd') ############################################################################### # Test writing support with geometries with original XML content preserved def test_ogr_gmlas_writer_gml_original_xml(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['EXPOSE_METADATA_LAYERS=YES', 'CONFIG_FILE=true']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None ret_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer_gml.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION']) tmp_ds = None assert ret_ds is not None ret_ds = None ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_writer_gml.xml', open_options=['VALIDATE=YES']) assert ds is not None and gdal.GetLastErrorMsg() == '' ds = None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_gml.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xml') gdal.Unlink('/vsimem/ogr_gmlas_writer_gml.xsd') assert ' 49 2 ' in content assert ' 0 1' in content assert ' 1 2' in content ############################################################################### # Test writing support with XSD, INDENT_SIZE, COMMENT, OUTPUT_XSD_FILENAME, TIMESTAMP options def test_ogr_gmlas_writer_options(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['@HASH=hash']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None ret_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer_options.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['LAYERS=test', 'WRAPPING=GMLAS_FEATURECOLLECTION', 'INPUT_XSD=data/gmlas/gmlas_geometryproperty_gml32.xsd', 'INDENT_SIZE=4', 'COMMENT=---a comment---', 'SRSNAME_FORMAT=OGC_URN', 'OUTPUT_XSD_FILENAME=/vsimem/my_schema.xsd']) tmp_ds = None assert ret_ds is not None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_options.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') assert gdal.VSIStatL('/vsimem/my_schema.xsd') is not None gdal.Unlink('/vsimem/my_schema.xsd') # Test indentation size assert '\n ' in content # Test comment assert '\n' in content # Test OUTPUT_XSD_FILENAME assert '/vsimem/my_schema.xsd' in content # Test SRSNAME_FORMAT=OGC_URN assert '49 2' in content # Test TIMESTAMP option src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['@HASH=hash', 'EXPOSE_METADATA_LAYERS=YES']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None ret_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer_options.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['TIMESTAMP=1970-01-01T12:34:56Z', '@REOPEN_DATASET_WITH_GMLAS=NO']) tmp_ds = None assert ret_ds is not None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_options.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') assert gdal.VSIStatL('/vsimem/my_schema.xsd') is None assert ('timeStamp="1970-01-01T12:34:56Z"' in content and \ 'xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd ' in content) # Test WFS20_SCHEMALOCATION option src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['@HASH=hash', 'EXPOSE_METADATA_LAYERS=YES']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None ret_ds = gdal.VectorTranslate('/vsimem/ogr_gmlas_writer_options.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['WFS20_SCHEMALOCATION=/vsimem/fake_wfs.xsd']) tmp_ds = None assert ret_ds is not None gdal.FileFromMemBuffer('/vsimem/fake_wfs.xsd', """ """) ds = gdal.OpenEx('GMLAS:/vsimem/ogr_gmlas_writer_options.xml', open_options=['VALIDATE=YES']) gdal.Unlink('/vsimem/fake_wfs.xsd') assert ds is not None and gdal.GetLastErrorMsg() == '' ds = None f = gdal.VSIFOpenL('/vsimem/ogr_gmlas_writer_options.xml', 'rb') assert f is not None content = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_gmlas_writer_options.xml') assert gdal.VSIStatL('/vsimem/my_schema.xsd') is None assert 'xsi:schemaLocation="http://www.opengis.net/wfs/2.0 /vsimem/fake_wfs.xsd ' in content ############################################################################### # Test writing support error handle def test_ogr_gmlas_writer_errors(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Source dataset is empty with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', gdal.GetDriverByName('Memory').Create('', 0, 0, 0, 0), format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('Source dataset has no layers') >= 0 # Missing input schemas src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml') tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', tmp_ds, format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('Cannot establish schema since no INPUT_XSD creation option specified and no _ogr_other_metadata found in source dataset') >= 0 # Invalid input schema with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['INPUT_XSD=/i_do_not/exist.xsd']) assert ret_ds is None and gdal.GetLastErrorMsg().find('Cannot resolve /i_do_not/exist.xsd') >= 0 # Invalid output .xml name src_ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometryproperty_gml32_no_error.gml', open_options=['EXPOSE_METADATA_LAYERS=YES']) tmp_ds = gdal.VectorTranslate('', src_ds, format='Memory') src_ds = None with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/i_am/not/valid.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['GENERATE_XSD=NO']) assert ret_ds is None and gdal.GetLastErrorMsg().find('Cannot create /i_am/not/valid.xml') >= 0 # .xsd extension not allowed with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/i_am/not/valid.xsd', tmp_ds, format='GMLAS', datasetCreationOptions=['GENERATE_XSD=NO']) assert ret_ds is None and gdal.GetLastErrorMsg().find('.xsd extension is not valid') >= 0 # Invalid output .xsd name with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['WRAPPING=GMLAS_FEATURECOLLECTION', 'OUTPUT_XSD_FILENAME=/i_am/not/valid.xsd']) assert ret_ds is None and gdal.GetLastErrorMsg().find('Cannot create /i_am/not/valid.xsd') >= 0 gdal.Unlink('/vsimem/valid.xml') # Invalid CONFIG_FILE with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['CONFIG_FILE=/i/do_not/exist']) assert ret_ds is None and gdal.GetLastErrorMsg().find('Loading of configuration failed') >= 0 # Invalid layer name with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', tmp_ds, format='GMLAS', datasetCreationOptions=['LAYERS=foo']) assert ret_ds is None and gdal.GetLastErrorMsg().find('Layer foo specified in LAYERS option does not exist') >= 0 gdal.Unlink('/vsimem/valid.xml') # _ogr_layers_metadata not found src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, 0) src_ds.CreateLayer('_ogr_other_metadata') with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', src_ds, format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('_ogr_layers_metadata not found') >= 0 # _ogr_fields_metadata not found src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, 0) src_ds.CreateLayer('_ogr_other_metadata') src_ds.CreateLayer('_ogr_layers_metadata') with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', src_ds, format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('_ogr_fields_metadata not found') >= 0 # _ogr_layer_relationships not found src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, 0) src_ds.CreateLayer('_ogr_other_metadata') src_ds.CreateLayer('_ogr_layers_metadata') src_ds.CreateLayer('_ogr_fields_metadata') with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', src_ds, format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('_ogr_layer_relationships not found') >= 0 # Cannot find field layer_name in _ogr_layers_metadata layer src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, 0) src_ds.CreateLayer('_ogr_other_metadata') src_ds.CreateLayer('_ogr_layers_metadata') src_ds.CreateLayer('_ogr_fields_metadata') src_ds.CreateLayer('_ogr_layer_relationships') with gdaltest.error_handler(): ret_ds = gdal.VectorTranslate('/vsimem/valid.xml', src_ds, format='GMLAS') assert ret_ds is None and gdal.GetLastErrorMsg().find('Cannot find field layer_name in _ogr_layers_metadata layer') >= 0 gdal.Unlink('/vsimem/valid.xml') gdal.Unlink('/vsimem/valid.xsd') ############################################################################### # Test reading a particular construct with group, etc... that could cause # crashes def test_ogr_gmlas_read_fake_gmljp2(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/fake_gmljp2.xml') count = 0 while True: f, lyr = ds.GetNextFeature() if f is None: assert lyr is None break count += 1 assert count == 5 ############################################################################### # Test TypingConstraints def test_ogr_gmlas_typing_constraints(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # One substitution, no repetition ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_typing_constraints_one_subst_no_repetition.xml', open_options=["""CONFIG_FILE= myns_modified_for_fun:main_elt/myns_modified_for_fun:foo myns_modified_for_fun:bar """]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if not f.IsFieldSetAndNotNull('foo_bar_pkid'): f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if f.GetField('value') != 'baz': f.DumpReadable() pytest.fail() ds = None # One substitution, with repetition ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_typing_constraints_one_subst_with_repetition.xml', open_options=["""CONFIG_FILE= myns_modified_for_fun:main_elt/myns_modified_for_fun:foo myns_modified_for_fun:bar """]) lyr = ds.GetLayer('main_elt_foo_bar') assert lyr.GetFeatureCount() == 2 lyr = ds.GetLayer('bar') f = lyr.GetNextFeature() if f.GetField('value') != 'baz': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('value') != 'baz2': f.DumpReadable() pytest.fail() ds = None # 2 substitutions ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_typing_constraints_two_subst.xml', open_options=["""CONFIG_FILE= myns_modified_for_fun:main_elt/myns_modified_for_fun:foo myns_modified_for_fun:bar myns_modified_for_fun:baz """]) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if not f.IsFieldSetAndNotNull('foo_bar_pkid'): f.DumpReadable() pytest.fail() if f.IsFieldSetAndNotNull('foo_baz_pkid'): f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if f.GetField('value') != 'baz': f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test swe:DataArray def test_ogr_gmlas_swe_dataarray(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_swe_dataarray.xml') lyr = ds.GetLayerByName('dataarray_1_components') f = lyr.GetNextFeature() if not f.IsFieldSetAndNotNull('parent_ogr_pkid') or \ f.GetField('myTime') != '2016/09/01 00:00:00+01' or \ f.GetField('myCategory') != '1' or \ f.GetField('myQuantity') != 2.34 or \ f.GetField('myCount') != 3 or \ f.GetField('myText') != 'foo' or \ f.GetField('myBoolean') is False: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('myTime') != '2017/09/01 00:00:00' or \ f.GetField('myCategory') != '2' or \ f.GetField('myQuantity') != 3.45: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('dataarray_2') f = lyr.GetNextFeature() if f.GetField('myTime') != '2016/09/01 00:00:00+01' or \ f.GetField('myCategory') != '1' or \ f.GetField('myQuantity') != 2.34: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('myTime') != '2017/09/01 00:00:00' or \ f.GetField('myCategory') is not None or \ f.GetField('myQuantity') != 3.45: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('dataarray_3') f = lyr.GetNextFeature() if f.GetField('myTime') != '2016/09/01 00:00:00+01' or \ f.GetField('myCategory') != '1' or \ f.GetField('myQuantity') != 2.34: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('myTime') != '2017/09/01 00:00:00' or \ f.GetField('myCategory') is not None or \ f.GetField('myQuantity') != 3.45: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test swe:DataRecord def test_ogr_gmlas_swe_datarecord(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() gdal.ErrorReset() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_swe_datarecord.xml', open_options=['VALIDATE=YES']) assert gdal.GetLastErrorMsg() == '' ds = None ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_swe_datarecord.xml') lyr = ds.GetLayerByName('main_elt_foo') assert lyr.GetLayerDefn().GetFieldCount() == 12 f = lyr.GetNextFeature() if f.GetField('mytime_value') != '2017/09/01 00:00:00' or \ f.GetField('mycategory_value') != 'myvalue' or \ f.GetField('mycategory_identifier') != 'myidentifier' or \ f.GetField('mycategory_codespace_href') != 'http://example.com' or \ f.GetField('myquantity_value') != 1.23 or \ f.GetField('mycount_value') != 2 or \ f.GetField('mytext_value') != 'foo' or \ f.GetField('myboolean_value') is False: f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test a xs:any field at end of a type declaration def test_ogr_gmlas_any_field_at_end_of_declaration(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() # Simplified test case for # http://schemas.earthresourceml.org/earthresourceml-lite/1.0/erml-lite.xsd # http://services.ga.gov.au/earthresource/ows?service=wfs&version=2.0.0&request=GetFeature&typenames=erl:CommodityResourceView&count=10 ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_any_field_at_end_of_declaration.xml') lyr = ds.GetLayerByName('main_elt') # Will warn about 'Unexpected element with xpath=main_elt/extra (subxpath=main_elt/extra) found' # This should be fixed at some point gdal.ErrorReset() with gdaltest.error_handler(): f = lyr.GetNextFeature() assert gdal.GetLastErrorMsg() != '' if f.GetField('foo') != 'bar': f.DumpReadable() pytest.fail() if f.GetField('value') != 'baz': print('Expected fail: value != baz') ############################################################################### # Test auxiliary schema without namespace prefix def test_ogr_gmlas_aux_schema_without_namespace_prefix(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_aux_schema_without_namespace_prefix.xml') lyr = ds.GetLayerByName('main_elt') f = lyr.GetNextFeature() if not f.IsFieldSetAndNotNull('generic_pkid'): f.DumpReadable() pytest.fail() ############################################################################### # Test importing a GML geometry that is in an element that is a substitutionGroup # of another one (#6990) def test_ogr_gmlas_geometry_as_substitutiongroup(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_geometry_as_substitutiongroup.xml') lyr = ds.GetLayerByName('foo') f = lyr.GetNextFeature() if f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() ds = None ############################################################################### @pytest.mark.require_run_on_demand def test_ogr_gmlas_extra_piezometre(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() return compare_ogrinfo_output('data/gmlas/real_world/Piezometre.06512X0037.STREMY.2.gml', 'data/gmlas/real_world/output/Piezometre.06512X0037.STREMY.2.txt', options='-oo REMOVE_UNUSED_LAYERS=YES') ############################################################################### @pytest.mark.require_run_on_demand def test_ogr_gmlas_extra_eureg(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() return compare_ogrinfo_output('data/gmlas/real_world/EUReg.example.gml', 'data/gmlas/real_world/output/EUReg.example.txt', options='-oo REMOVE_UNUSED_LAYERS=YES') ############################################################################### # Test a schema that has nothing interesting in it but imports another # schema def test_ogr_gmlas_no_element_in_first_choice_schema(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() ds = gdal.OpenEx('GMLAS:', open_options=['XSD=data/gmlas/gmlas_no_element_in_first_choice_schema.xsd']) lyr = ds.GetLayerByName('_ogr_layers_metadata') f = lyr.GetNextFeature() if f['layer_xpath'] != 'my_ns:main_elt': f.DumpReadable() pytest.fail() ############################################################################### # Test cross-layer links with xlink:href="#my_id" def test_ogr_gmlas_internal_xlink_href(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('GMLAS:data/gmlas/gmlas_internal_xlink_href.xml') lyr = ds.GetLayerByName('main_elt') f = lyr.GetNextFeature() if f['link_to_second_or_third_elt_href'] != '#does_not_exist' or \ f.IsFieldSet('link_to_second_or_third_elt_second_elt_pkid') or \ f.IsFieldSet('link_to_second_or_third_elt_third_elt_pkid') or \ f.IsFieldSet('link_to_third_elt_third_elt_pkid'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['link_to_second_or_third_elt_href'] != '#id2' or \ f['link_to_second_or_third_elt_second_elt_pkid'] != 'id2' or \ f.IsFieldSet('link_to_second_or_third_elt_third_elt_pkid') or \ f.IsFieldSet('link_to_third_elt_third_elt_pkid'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['link_to_second_or_third_elt_href'] != '#id3' or \ f['link_to_second_or_third_elt_second_elt_pkid'] != 'id3' or \ f.IsFieldSet('link_to_second_or_third_elt_third_elt_pkid') or \ f.IsFieldSet('link_to_third_elt_third_elt_pkid'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['link_to_second_or_third_elt_href'] != '#id4' or \ f.IsFieldSet('link_to_second_or_third_elt_second_elt_pkid') or \ f['link_to_second_or_third_elt_third_elt_pkid'] != 'D1013B7E44F28C976B976A4314FA4A09_third_elt_1' or \ f.IsFieldSet('link_to_third_elt_third_elt_pkid'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['link_to_third_elt_href'] != '#id4' or \ f.IsFieldSet('link_to_second_or_third_elt_second_elt_pkid') or \ f.IsFieldSet('link_to_second_or_third_elt_third_elt_pkid') or \ f['link_to_third_elt_third_elt_pkid'] != 'D1013B7E44F28C976B976A4314FA4A09_third_elt_1': f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('_ogr_fields_metadata') f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 1 or \ f['field_name'] != 'link_to_second_or_third_elt_href': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 2 or \ f['field_name'] != 'link_to_second_or_third_elt_second_elt_pkid' or \ f['field_xpath'] != 'main_elt/link_to_second_or_third_elt/second_elt' or \ f['field_type'] != 'string' or \ f['field_is_list'] != 0 or \ f['field_min_occurs'] != 0 or \ f['field_max_occurs'] != 1 or \ f['field_category'] != 'PATH_TO_CHILD_ELEMENT_WITH_LINK' or \ f['field_related_layer'] != 'second_elt': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 3 or \ f['field_name'] != 'link_to_second_or_third_elt_third_elt_pkid' or \ f['field_xpath'] != 'main_elt/link_to_second_or_third_elt/third_elt' or \ f['field_type'] != 'string' or \ f['field_is_list'] != 0 or \ f['field_min_occurs'] != 0 or \ f['field_max_occurs'] != 1 or \ f['field_category'] != 'PATH_TO_CHILD_ELEMENT_WITH_LINK' or \ f['field_related_layer'] != 'third_elt': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 4 or \ f['field_name'] != 'link_to_second_or_third_elt': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 5 or \ f['field_name'] != 'link_to_third_elt_href': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'main_elt' or f['field_index'] != 6 or \ f['field_name'] != 'link_to_third_elt_third_elt_pkid': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['layer_name'] != 'third_elt' or f['field_index'] != 1 or \ f['field_name'] != 'id': f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('_ogr_layer_relationships') f = lyr.GetNextFeature() if f['parent_layer'] != 'main_elt' or \ f['parent_pkid'] != 'ogr_pkid' or \ f['parent_element_name'] != 'link_to_third_elt_third_elt_pkid' or \ f['child_layer'] != 'third_elt' or \ f['child_pkid'] != 'ogr_pkid': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['parent_layer'] != 'main_elt' or \ f['parent_pkid'] != 'ogr_pkid' or \ f['parent_element_name'] != 'link_to_second_or_third_elt_second_elt_pkid' or \ f['child_layer'] != 'second_elt' or \ f['child_pkid'] != 'id': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['parent_layer'] != 'main_elt' or \ f['parent_pkid'] != 'ogr_pkid' or \ f['parent_element_name'] != 'link_to_second_or_third_elt_third_elt_pkid' or \ f['child_layer'] != 'third_elt' or \ f['child_pkid'] != 'ogr_pkid': f.DumpReadable() pytest.fail() ############################################################################### # Cleanup def test_ogr_gmlas_cleanup(): if ogr.GetDriverByName('GMLAS') is None: pytest.skip() files = gdal.ReadDir('/vsimem/') if files is not None: print('Remaining files: ' + str(files)) gdal.SetConfigOption('GMLAS_WARN_UNEXPECTED', None) gdal.SetConfigOption('GDAL_XML_VALIDATION', ogrtest.old_val_GDAL_XML_VALIDATION) gdalautotest-3.0.4/ogr/ogr_feature.py0000755003401500001440000007331413614005325017305 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_mem.py 23065 2011-09-05 20:41:03Z rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR Feature facilities, particularly SetFrom() # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2011, 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 sys from osgeo import gdal from osgeo import ogr import gdaltest import pytest ############################################################################### # Create a destination feature type with one field for each field in the source # feature, with the same names, but all the field types of a specific type. def mk_dst_feature(src_feature, field_type): dst_feat_defn = ogr.FeatureDefn('dst') src_feat_defn = src_feature.GetDefnRef() for i in range(src_feat_defn.GetFieldCount()): src_field_defn = src_feat_defn.GetFieldDefn(i) dst_field_defn = ogr.FieldDefn(src_field_defn.GetName(), field_type) dst_feat_defn.AddFieldDefn(dst_field_defn) return ogr.Feature(dst_feat_defn) ############################################################################### # Create a source feature def mk_src_feature(): feat_def = ogr.FeatureDefn('src') field_def = ogr.FieldDefn('field_integer', ogr.OFTInteger) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integer64', ogr.OFTInteger64) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_real', ogr.OFTReal) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_string', ogr.OFTString) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_binary', ogr.OFTBinary) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_date', ogr.OFTDate) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_time', ogr.OFTTime) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integerlist', ogr.OFTIntegerList) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integer64list', ogr.OFTInteger64List) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_reallist', ogr.OFTRealList) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_stringlist', ogr.OFTStringList) feat_def.AddFieldDefn(field_def) src_feature = ogr.Feature(feat_def) src_feature.SetField('field_integer', 17) src_feature.SetField('field_integer64', 9876543210) src_feature.SetField('field_real', 18.4) src_feature.SetField('field_string', 'abc def') src_feature.SetFieldBinaryFromHexString('field_binary', '0123465789ABCDEF') src_feature.SetField('field_date', '2011/11/11') src_feature.SetField('field_time', '14:10:35') src_feature.SetField('field_datetime', 2011, 11, 11, 14, 10, 35.123, 0) got_vals = src_feature.GetFieldAsDateTime(feat_def.GetFieldIndex('field_datetime')) expected_vals = [2011, 11, 11, 14, 10, 35.123, 0] for i, exp_val in enumerate(expected_vals): if abs(got_vals[i] - exp_val) > 1e-4: print(got_vals) print(expected_vals) src_feature.field_integerlist = '(3:10,20,30)' src_feature.field_integer64list = [9876543210] src_feature.field_reallist = [123.5, 567.0] src_feature.field_stringlist = ['abc', 'def'] return src_feature ############################################################################### # Helper function to check a single field value def check(feat, fieldname, value): if feat.GetField(fieldname) != value: gdaltest.post_reason('did not get value %s for field %s, got %s.' % (str(value), fieldname, str(feat.GetField(fieldname))), frames=3) feat.DumpReadable() return 0 return 1 ############################################################################### # Copy to Integer def test_ogr_feature_cp_integer(): src_feature = mk_src_feature() src_feature.field_integerlist = [15] src_feature.field_reallist = [17.5] dst_feature = mk_dst_feature(src_feature, ogr.OFTInteger) gdal.PushErrorHandler() dst_feature.SetFrom(src_feature) gdal.PopErrorHandler() assert check(dst_feature, 'field_integer', 17) assert check(dst_feature, 'field_integer64', 2147483647) assert check(dst_feature, 'field_real', 18) assert check(dst_feature, 'field_string', 0) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', 15) assert check(dst_feature, 'field_integer64list', 2147483647) assert check(dst_feature, 'field_reallist', 17) assert check(dst_feature, 'field_stringlist', None) vals = [] for val in dst_feature: vals.append(val) assert (vals == [17, 2147483647, 18, 0, None, None, None, None, 15, 2147483647, 17, None]) ############################################################################### # Copy to Integer64 def test_ogr_feature_cp_integer64(): src_feature = mk_src_feature() src_feature.field_integerlist = [15] src_feature.field_reallist = [17.5] dst_feature = mk_dst_feature(src_feature, ogr.OFTInteger64) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', 17) assert check(dst_feature, 'field_integer64', 9876543210) gdal.PushErrorHandler() int32_ovflw = dst_feature.GetFieldAsInteger('field_integer64') gdal.PopErrorHandler() assert int32_ovflw == 2147483647 assert check(dst_feature, 'field_real', 18) assert check(dst_feature, 'field_string', 0) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', 15) assert check(dst_feature, 'field_integer64list', 9876543210) assert check(dst_feature, 'field_reallist', 17) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to Real def test_ogr_feature_cp_real(): src_feature = mk_src_feature() src_feature.field_integerlist = [15] src_feature.field_reallist = [17.5] dst_feature = mk_dst_feature(src_feature, ogr.OFTReal) with gdaltest.error_handler(): dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', 17.0) assert check(dst_feature, 'field_real', 18.4) assert check(dst_feature, 'field_string', 0) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', 15.0) assert check(dst_feature, 'field_reallist', 17.5) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to String def test_ogr_feature_cp_string(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTString) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', '17') assert check(dst_feature, 'field_integer64', '9876543210') assert check(dst_feature, 'field_real', '18.4') assert check(dst_feature, 'field_string', 'abc def') assert check(dst_feature, 'field_binary', '0123465789ABCDEF') assert check(dst_feature, 'field_date', '2011/11/11') assert check(dst_feature, 'field_time', '14:10:35') assert check(dst_feature, 'field_datetime', '2011/11/11 14:10:35.123') assert check(dst_feature, 'field_integerlist', '(3:10,20,30)') assert check(dst_feature, 'field_integer64list', '(1:9876543210)') assert check(dst_feature, 'field_reallist', '(2:123.5,567)') assert check(dst_feature, 'field_stringlist', '(2:abc,def)') ############################################################################### # Copy to Binary def test_ogr_feature_cp_binary(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTBinary) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', None) assert check(dst_feature, 'field_integer64', None) assert check(dst_feature, 'field_real', None) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', '0123465789ABCDEF') expected = '\x01\x23\x46\x57\x89\xAB\xCD\xEF' if sys.version_info >= (3, 0, 0): expected = expected.encode('LATIN1') assert dst_feature.GetFieldAsBinary('field_binary') == expected assert dst_feature.GetFieldAsBinary(dst_feature.GetDefnRef().GetFieldIndex('field_binary')) == expected assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', None) assert check(dst_feature, 'field_integer64list', None) assert check(dst_feature, 'field_reallist', None) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to date def test_ogr_feature_cp_date(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTDate) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', None) assert check(dst_feature, 'field_integer64', None) assert check(dst_feature, 'field_real', None) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', '2011/11/11') assert check(dst_feature, 'field_time', '0000/00/00') assert check(dst_feature, 'field_datetime', '2011/11/11') assert check(dst_feature, 'field_integerlist', None) assert check(dst_feature, 'field_integer64list', None) assert check(dst_feature, 'field_reallist', None) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to time def test_ogr_feature_cp_time(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTTime) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', None) assert check(dst_feature, 'field_integer64', None) assert check(dst_feature, 'field_real', None) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', '00:00:00') assert check(dst_feature, 'field_time', '14:10:35') assert check(dst_feature, 'field_datetime', '14:10:35.123') assert check(dst_feature, 'field_integerlist', None) assert check(dst_feature, 'field_integer64list', None) assert check(dst_feature, 'field_reallist', None) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to datetime def test_ogr_feature_cp_datetime(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTDateTime) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', None) assert check(dst_feature, 'field_integer64', None) assert check(dst_feature, 'field_real', None) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', '2011/11/11 00:00:00') assert check(dst_feature, 'field_time', '0000/00/00 14:10:35') assert check(dst_feature, 'field_datetime', '2011/11/11 14:10:35.123') assert check(dst_feature, 'field_integerlist', None) assert check(dst_feature, 'field_integer64list', None) assert check(dst_feature, 'field_reallist', None) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to integerlist def test_ogr_feature_cp_integerlist(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTIntegerList) gdal.PushErrorHandler() dst_feature.SetFrom(src_feature) gdal.PopErrorHandler() assert check(dst_feature, 'field_integer', [17]) assert check(dst_feature, 'field_integer64', [2147483647]) assert check(dst_feature, 'field_real', [18]) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', [10, 20, 30]) assert check(dst_feature, 'field_integer64list', [2147483647]) assert check(dst_feature, 'field_reallist', [123, 567]) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to integer64list def test_ogr_feature_cp_integer64list(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTInteger64List) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', [17]) assert check(dst_feature, 'field_integer64', [9876543210]) assert check(dst_feature, 'field_real', [18]) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', [10, 20, 30]) assert check(dst_feature, 'field_integer64list', [9876543210]) assert check(dst_feature, 'field_reallist', [123, 567]) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to reallist def test_ogr_feature_cp_reallist(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTRealList) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', [17.0]) assert check(dst_feature, 'field_integer64', [9876543210.0]) assert check(dst_feature, 'field_real', [18.4]) assert check(dst_feature, 'field_string', None) assert check(dst_feature, 'field_binary', None) assert check(dst_feature, 'field_date', None) assert check(dst_feature, 'field_time', None) assert check(dst_feature, 'field_datetime', None) assert check(dst_feature, 'field_integerlist', [10.0, 20.0, 30.0]) assert check(dst_feature, 'field_integer64list', [9876543210.0]) assert check(dst_feature, 'field_reallist', [123.5, 567.0]) assert check(dst_feature, 'field_stringlist', None) ############################################################################### # Copy to stringlist def test_ogr_feature_cp_stringlist(): src_feature = mk_src_feature() dst_feature = mk_dst_feature(src_feature, ogr.OFTStringList) dst_feature.SetFrom(src_feature) assert check(dst_feature, 'field_integer', ["17"]) assert check(dst_feature, 'field_integer64', ["9876543210"]) assert check(dst_feature, 'field_real', ["18.4"]) assert check(dst_feature, 'field_string', ['abc def']) assert check(dst_feature, 'field_binary', ['0123465789ABCDEF']) assert check(dst_feature, 'field_date', ['2011/11/11']) assert check(dst_feature, 'field_time', ['14:10:35']) assert check(dst_feature, 'field_datetime', ['2011/11/11 14:10:35.123']) assert check(dst_feature, 'field_integerlist', ['10', '20', '30']) assert check(dst_feature, 'field_integer64list', ['9876543210']) assert check(dst_feature, 'field_reallist', ['123.5', '567']) assert check(dst_feature, 'field_stringlist', ['abc', 'def']) ############################################################################### # Test SetField() / GetField() with unicode string def test_ogr_feature_unicode(): if sys.version_info >= (3, 0, 0): pytest.skip() feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integer64', ogr.OFTInteger64) feat_def.AddFieldDefn(field_def) src_feature = ogr.Feature(feat_def) src_feature.SetField('field_string', 'abc def'.decode('utf-8')) assert src_feature.GetField('field_string') == 'abc def' assert src_feature.GetField('field_string'.decode('utf-8')) == 'abc def' src_feature = ogr.Feature(feat_def) src_feature.SetField('field_string'.decode('utf-8'), 'abc def'.decode('utf-8')) assert src_feature.GetField('field_string') == 'abc def' src_feature = ogr.Feature(feat_def) src_feature.SetField('field_integer64'.decode('utf-8'), 1) assert src_feature.GetField('field_integer64') == 1 ############################################################################### # Test 64bit FID def test_ogr_feature_64bit_fid(): feat_def = ogr.FeatureDefn('test') f = ogr.Feature(feat_def) f.SetFID(123456789012345) assert f.GetFID() == 123456789012345 ############################################################################### # Test 64bit integer def test_ogr_feature_overflow_64bit_integer(): feat_def = ogr.FeatureDefn('test') feat_def.AddFieldDefn(ogr.FieldDefn('test', ogr.OFTInteger64)) f = ogr.Feature(feat_def) gdal.PushErrorHandler() f.SetField(0, '9999999999999999999') gdal.PopErrorHandler() if f.GetField(0) != 9223372036854775807: f.DumpReadable() pytest.fail() gdal.PushErrorHandler() f.SetField(0, '-9999999999999999999') gdal.PopErrorHandler() if f.GetField(0) != -9223372036854775808: f.DumpReadable() pytest.fail() ############################################################################### # Test SetNullable(), IsNullable() and Validate() def test_ogr_feature_nullable_validate(): # No fields feat_def = ogr.FeatureDefn('test') f = ogr.Feature(feat_def) assert f.Validate() == 1 # Field with default parameter and empty feature feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) assert field_def.IsNullable() == 1 assert feat_def.GetGeomFieldDefn(0).IsNullable() == 1 feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) assert f.Validate() == 1 # Field with not NULL constraint and empty feature feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) field_def.SetNullable(0) assert field_def.IsNullable() == 0 feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) gdal.PushErrorHandler() ret = f.Validate() gdal.PopErrorHandler() assert ret == 0 # Field with not NULL constraint and non-empty feature feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) field_def.SetNullable(0) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetField(0, 'foo') assert f.Validate() == 1 # Field with width constraint that is met feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) field_def.SetWidth(3) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetField(0, 'foo') assert f.Validate() == 1 # Field with width constraint that is not met feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) field_def.SetWidth(2) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetField(0, 'foo') gdal.PushErrorHandler() ret = f.Validate() gdal.PopErrorHandler() assert ret == 0 # Geometry field with not-null geometry constraint that is met feat_def = ogr.FeatureDefn('test') feat_def.SetGeomType(ogr.wkbNone) gfield_def = ogr.GeomFieldDefn('test', ogr.wkbUnknown) gfield_def.SetNullable(0) assert gfield_def.IsNullable() == 0 feat_def.AddGeomFieldDefn(gfield_def) f = ogr.Feature(feat_def) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) assert f.Validate() == 1 # Geometry field with not-null geometry constraint that is not met feat_def = ogr.FeatureDefn('test') feat_def.SetGeomType(ogr.wkbNone) gfield_def = ogr.GeomFieldDefn('test', ogr.wkbPoint) gfield_def.SetNullable(0) feat_def.AddGeomFieldDefn(gfield_def) f = ogr.Feature(feat_def) gdal.PushErrorHandler() ret = f.Validate() gdal.PopErrorHandler() assert ret == 0 # Geometry field with Point geometry type that is met feat_def = ogr.FeatureDefn('test') feat_def.SetGeomType(ogr.wkbPoint) f = ogr.Feature(feat_def) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) assert f.Validate() == 1 # Geometry field with LineString geometry type that is not met feat_def = ogr.FeatureDefn('test') feat_def.SetGeomType(ogr.wkbLineString) f = ogr.Feature(feat_def) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) gdal.PushErrorHandler() ret = f.Validate() gdal.PopErrorHandler() assert ret == 0 ############################################################################### # Test SetDefault(), GetDefault(), IsDefaultDriverSpecific() and FillUnsetWithDefault() def test_ogr_feature_default(): feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) assert field_def.GetDefault() is None assert not field_def.IsDefaultDriverSpecific() field_def.SetDefault("(some_expr)") assert field_def.GetDefault() == "(some_expr)" assert field_def.IsDefaultDriverSpecific() field_def.SetDefault("'a") assert field_def.GetDefault() == "'a" gdal.PushErrorHandler() field_def.SetDefault("'a''") gdal.PopErrorHandler() assert field_def.GetDefault() is None gdal.PushErrorHandler() field_def.SetDefault("'a'b'") gdal.PopErrorHandler() assert field_def.GetDefault() is None field_def.SetDefault("'a''b'''") assert field_def.GetDefault() == "'a''b'''" assert not field_def.IsDefaultDriverSpecific() feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_def.SetDefault("CURRENT_TIMESTAMP") feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_def.SetDefault("'2015/06/30 12:34:56'") feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_int', ogr.OFTInteger) field_def.SetDefault('123') feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.FillUnsetWithDefault() if f.GetField('field_string') != 'a\'b\'' or \ not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56+00' or \ f.GetField('field_int') != 123 or \ f.IsFieldSet('field_nodefault'): f.DumpReadable() pytest.fail() f = ogr.Feature(feat_def) f.SetField('field_string', 'b') f.FillUnsetWithDefault() if f.GetField('field_string') != 'b': f.DumpReadable() pytest.fail() ############################################################################### # Test GetNativeData(), SetNativeData(), GetNativeMediaType(), SetNativeMediaType(): def test_ogr_feature_native_data(): feat_def = ogr.FeatureDefn('test') f = ogr.Feature(feat_def) assert f.GetNativeData() is None assert f.GetNativeMediaType() is None f.SetNativeData('native_data') assert f.GetNativeData() == 'native_data' f.SetNativeMediaType('native_media_type') assert f.GetNativeMediaType() == 'native_media_type' f2 = ogr.Feature(feat_def) f2.SetFrom(f) assert f2.GetNativeData() == 'native_data' assert f2.GetNativeMediaType() == 'native_media_type' f_clone = f.Clone() assert f_clone.GetNativeData() == 'native_data' assert f_clone.GetNativeMediaType() == 'native_media_type' f_clone.SetNativeData(None) f_clone.SetNativeMediaType(None) assert f_clone.GetNativeData() is None assert f_clone.GetNativeMediaType() is None ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('test') lyr.SetMetadataItem('NATIVE_DATA', 'native_data', 'NATIVE_DATA') lyr.SetMetadataItem('NATIVE_MEDIA_TYPE', 'native_media_type', 'NATIVE_DATA') f = ogr.Feature(lyr.GetLayerDefn()) f.SetNativeData('native_data') f.SetNativeMediaType('native_media_type') lyr.CreateFeature(f) f = None dialects = ['OGR_SQL'] if gdal.GetDriverByName('SQLITE') is not None: dialects += ['OGR_SQLITE'] for dialect in dialects: sql_lyr = ds.ExecuteSQL('SELECT * FROM %s' % lyr.GetName(), dialect=dialect) native_data = sql_lyr.GetMetadataItem('NATIVE_DATA', 'NATIVE_DATA') assert native_data == 'native_data', dialect native_media_type = sql_lyr.GetMetadataItem('NATIVE_MEDIA_TYPE', 'NATIVE_DATA') assert native_media_type == 'native_media_type', dialect f = sql_lyr.GetNextFeature() assert f.GetNativeData() == 'native_data', dialect assert f.GetNativeMediaType() == 'native_media_type', dialect ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test assigning our geometry to ourselves def test_ogr_feature_set_geometry_self(): feat_def = ogr.FeatureDefn('test') f = ogr.Feature(feat_def) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (2 49)')) f.SetGeometryDirectly(f.GetGeometryRef()) f.SetGeometryDirectly(f.GetGeometryRef()) f.SetGeometry(f.GetGeometryRef()) f.SetGeometry(f.GetGeometryRef()) assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' ############################################################################### # Test SetFieldNull(), IsFieldNull() def test_ogr_feature_null_field(): feat_def = ogr.FeatureDefn('test') field_def = ogr.FieldDefn('field_string', ogr.OFTString) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) assert not f.IsFieldNull(feat_def.GetFieldIndex("field_string")) assert not f.IsFieldNull("field_string") f.SetFieldNull(feat_def.GetFieldIndex("field_string")) assert f.IsFieldNull(feat_def.GetFieldIndex("field_string")) != 0 f.SetField("field_string", "foo") assert not f.IsFieldNull("field_string") f.SetFieldNull("field_string") assert f.IsFieldNull(feat_def.GetFieldIndex("field_string")) != 0 f = None field_def = ogr.FieldDefn('field_binary', ogr.OFTBinary) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integerlist', ogr.OFTIntegerList) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_integer64list', ogr.OFTInteger64List) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_reallist', ogr.OFTRealList) feat_def.AddFieldDefn(field_def) field_def = ogr.FieldDefn('field_stringlist', ogr.OFTStringList) feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetFieldBinaryFromHexString('field_binary', '0123465789ABCDEF') f.field_integerlist = '(3:10,20,30)' f.field_integer64list = [9876543210] f.field_reallist = [123.5, 567.0] f.field_stringlist = ['abc', 'def'] assert f.IsFieldNull('field_binary') == 0 assert f.IsFieldNull('field_integerlist') == 0 assert f.IsFieldNull('field_integer64list') == 0 assert f.IsFieldNull('field_reallist') == 0 assert f.IsFieldNull('field_stringlist') == 0 f.SetField('field_binary', None) f.SetFieldNull('field_integerlist') f.SetFieldNull('field_integer64list') f.SetFieldNull('field_reallist') f.SetFieldNull('field_stringlist') assert f.IsFieldNull('field_binary') != 0 assert f.IsFieldNull('field_integerlist') != 0 assert f.IsFieldNull('field_integer64list') != 0 assert f.IsFieldNull('field_reallist') != 0 assert f.IsFieldNull('field_stringlist') != 0 f_clone = f.Clone() assert f_clone.IsFieldNull('field_binary') != 0 assert f.Equal(f_clone) f = None def test_ogr_feature_cleanup(): gdaltest.src_feature = None gdalautotest-3.0.4/ogr/ogr_eeda.py0000644003401500001440000004014213614005325016536 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_eeda.py 84b5157d009e5b7fb39b046fe92d818af036be64 2019-05-11 14:03:22 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Earth Engine Data API 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 from osgeo import gdal, ogr import ogrtest import pytest ############################################################################### # Find EEDA driver def test_eeda_1(): ogrtest.eeda_drv = ogr.GetDriverByName('EEDA') if ogrtest.eeda_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ############################################################################### # Nominal case def test_eeda_2(): if ogrtest.eeda_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageSize=1', json.dumps({ 'images': [ { 'properties': { 'string_field': 'bar', 'int_field': 1, 'int64_field': 123456789012, 'double_field': 1.23 } } ] })) # To please the unregistering of the persistent connection gdal.FileFromMemBuffer('/vsimem/ee/', '') gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = ogr.Open('EEDA:collection') gdal.SetConfigOption('EEDA_URL', None) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 assert lyr.TestCapability('foo') == 0 assert lyr.GetLayerDefn().GetFieldCount() == 8 + 7 + 4 assert lyr.GetExtent() == (-180.0, 180.0, -90.0, 90.0) assert lyr.GetFeatureCount() == -1 gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages', json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/first_feature', 'id': 'collection/first_feature', 'updateTime': '2017-01-04T12:34:56.789Z', 'startTime': '2017-01-02T12:34:56.789Z', 'endTime': '2017-01-03T12:34:56.789Z', 'sizeBytes': 1, 'geometry': {'type': 'Polygon', 'coordinates': [[[2, 49], [2.1, 49], [2.1, 49.1], [2, 49.1], [2, 49]]]}, 'properties': { 'string_field': 'bar', 'int_field': 1, 'int64_field': 123456789012, 'double_field': 1.23, 'another_prop': 3 }, '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 } } } ] }, { 'name': 'projects/earthengine-public/assets/collection/second_feature' } ], 'nextPageToken': 'myToken' })) f = lyr.GetNextFeature() if f.GetField('name') != 'projects/earthengine-public/assets/collection/first_feature' or \ f.GetField('id') != 'collection/first_feature' or \ f.GetField('gdal_dataset') != 'EEDAI:projects/earthengine-public/assets/collection/first_feature' or \ f.GetField('updateTime') != '2017/01/04 12:34:56.789+00' or \ f.GetField('startTime') != '2017/01/02 12:34:56.789+00' or \ f.GetField('endTime') != '2017/01/03 12:34:56.789+00' or \ f.GetField('sizeBytes') != 1 or \ f.GetField('band_count') != 1 or \ f.GetField('band_max_width') != 1830 or \ f.GetField('band_max_height') != 1831 or \ f.GetField('band_min_pixel_size') != 60 or \ f.GetField('band_upper_left_x') != 499980 or \ f.GetField('band_upper_left_y') != 4200000 or \ f.GetField('band_crs') != 'EPSG:32610' or \ f.GetField('string_field') != 'bar' or \ f.GetField('int_field') != 1 or \ f.GetField('int64_field') != 123456789012 or \ f.GetField('double_field') != 1.23 or \ f.GetField('other_properties') != '{ "another_prop": 3 }' or \ f.GetGeometryRef().ExportToWkt() != 'MULTIPOLYGON (((2 49,2.1 49.0,2.1 49.1,2.0 49.1,2 49)))': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('name') != 'projects/earthengine-public/assets/collection/second_feature': f.DumpReadable() pytest.fail() gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageToken=myToken', json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/third_feature' } ] })) f = lyr.GetNextFeature() if f.GetField('name') != 'projects/earthengine-public/assets/collection/third_feature': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is None lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField('name') != 'projects/earthengine-public/assets/collection/first_feature': f.DumpReadable() pytest.fail() lyr.SetAttributeFilter('EEDA:raw_filter') gdal.FileFromMemBuffer('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?filter=raw%5Ffilter', json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/raw_filter' } ] })) f = lyr.GetNextFeature() assert f.GetField('name') == 'projects/earthengine-public/assets/collection/raw_filter' lyr.SetAttributeFilter(None) lyr.SetAttributeFilter("startTime >= '1980-01-01T00:00:00Z' AND " + "string_field = 'bar' AND " + "int_field > 0 AND " + "int_field < 2 AND " + "int64_field >= 0 AND " + "int64_field <= 9999999999999 AND " + "double_field != 3.5 AND " + "string_field IN ('bar', 'baz') AND " + "NOT( int_field IN (0) OR double_field IN (3.5) )") ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-public/assets/collection:listImages?region=%7B%20%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%20%5B%20%5B%20%2D180%2E0%2C%20%2D90%2E0%20%5D%2C%20%5B%20%2D180%2E0%2C%2090%2E0%20%5D%2C%20%5B%20180%2E0%2C%2090%2E0%20%5D%2C%20%5B%20180%2E0%2C%20%2D90%2E0%20%5D%2C%20%5B%20%2D180%2E0%2C%20%2D90%2E0%20%5D%20%5D%20%5D%20%7D&filter=%28%28%28%28%28%28%28string%5Ffield%20%3D%20%22bar%22%20AND%20int%5Ffield%20%3E%200%29%20AND%20int%5Ffield%20%3C%202%29%20AND%20int64%5Ffield%20%3E%3D%200%29%20AND%20int64%5Ffield%20%3C%3D%209999999999999%29%20AND%20double%5Ffield%20%21%3D%203%2E5%29%20AND%20string%5Ffield%20%3D%20%22bar%22%20OR%20string%5Ffield%20%3D%20%22baz%22%29%20AND%20%28NOT%20%28int%5Ffield%20%3D%200%20OR%20double%5Ffield%20%3D%203%2E5%29%29%29&startTime=1980%2D01%2D01T00%3A00%3A00Z' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/filtered_feature', 'updateTime': '2017-01-03T12:34:56.789Z', 'startTime': '2017-01-02T12:34:56.789Z', 'sizeBytes': 1, 'geometry': {'type': 'Polygon', 'coordinates': [[[2, 49], [2.1, 49], [2.1, 49.1], [2, 49.1], [2, 49]]]}, 'properties': { 'string_field': 'bar', 'int_field': 1, 'int64_field': 123456789012, 'double_field': 1.23, 'another_prop': 3 } }, { 'name': 'projects/earthengine-public/assets/collection/second_feature' } ] })) lyr.SetSpatialFilterRect(-180, -90, 180, 90) f = lyr.GetNextFeature() gdal.Unlink(ogrtest.eeda_drv_tmpfile) assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' lyr.SetSpatialFilter(None) # Test time equality with second granularity lyr.SetAttributeFilter("startTime >= '1980-01-01T00:00:00Z' AND endTime <= '1980-01-02T23:59:59Z'") ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/filtered_feature', 'startTime': '1980-01-01T00:00:00Z', 'endTime': '1980-01-02T23:59:59Z' }, { 'name': 'projects/earthengine-public/assets/collection/second_feature' } ] })) f = lyr.GetNextFeature() gdal.Unlink(ogrtest.eeda_drv_tmpfile) assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' # Test time equality with day granularity lyr.SetAttributeFilter("startTime = '1980-01-01' AND endTime = '1980-01-02'") ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-public/assets/collection:listImages?startTime=1980%2D01%2D01T00%3A00%3A00Z&endTime=1980%2D01%2D02T23%3A59%3A59Z' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/collection/filtered_feature', 'startTime': '1980-01-01T12:00:00Z', 'endTime': '1980-01-02T23:59:59Z' }, { 'name': 'projects/earthengine-public/assets/collection/second_feature' } ] })) f = lyr.GetNextFeature() gdal.Unlink(ogrtest.eeda_drv_tmpfile) assert f.GetField('name') == 'projects/earthengine-public/assets/collection/filtered_feature' ds = None gdal.SetConfigOption('EEDA_BEARER', None) ############################################################################### # Nominal case where collection is in eedaconf.json def test_eeda_3(): if ogrtest.eeda_drv is None: pytest.skip() gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') ds = ogr.Open('EEDA:##example_collection/example_subcollection') gdal.SetConfigOption('EEDA_URL', None) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 8 + 7 + 4 ds = None gdal.SetConfigOption('EEDA_BEARER', None) ############################################################################### # Test that name and id variants are handled correctly. def test_eeda_4(): if ogrtest.eeda_drv is None: pytest.skip() gdal.SetConfigOption('EEDA_BEARER', 'mybearer') gdal.SetConfigOption('EEDA_URL', '/vsimem/ee/') # User asset ID ("users/**"). ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/users/foo:listImages?pageSize=1' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-legacy/assets/users/foo/bar' } ] })) assert ogr.Open('EEDA:users/foo').GetLayer(0) gdal.Unlink(ogrtest.eeda_drv_tmpfile) # Project asset ID ("projects/**"). ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/projects/foo:listImages?pageSize=1' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-legacy/assets/projects/foo/bar' } ] })) ds = ogr.Open('EEDA:projects/foo') assert ds.GetLayer(0) gdal.Unlink(ogrtest.eeda_drv_tmpfile) ds = None # Multi-folder project asset ID ("projects/foo/bar/baz"). ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-legacy/assets/projects/foo/bar/baz:listImages?pageSize=1' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-legacy/assets/projects/foo/bar/baz/qux' } ] })) ds = ogr.Open('EEDA:projects/foo/bar/baz') assert ds.GetLayer(0) gdal.Unlink(ogrtest.eeda_drv_tmpfile) ds = None # Public-catalog asset ID (e.g. "LANDSAT"). ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/earthengine-public/assets/foo:listImages?pageSize=1' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/earthengine-public/assets/foo/bar' } ] })) ds = ogr.Open('EEDA:foo') assert ds.GetLayer(0) gdal.Unlink(ogrtest.eeda_drv_tmpfile) ds = None # Asset name ("projects/*/assets/**"). ogrtest.eeda_drv_tmpfile = '/vsimem/ee/projects/foo/assets/bar:listImages?pageSize=1' gdal.FileFromMemBuffer(ogrtest.eeda_drv_tmpfile, json.dumps({ 'images': [ { 'name': 'projects/foo/assets/bar/baz' } ] })) ds = ogr.Open('EEDA:projects/foo/assets/bar') assert ds.GetLayer(0) gdal.Unlink(ogrtest.eeda_drv_tmpfile) ds = None gdal.SetConfigOption('EEDA_BEARER', None) gdal.SetConfigOption('EEDA_URL', None) ############################################################################### # def test_eeda_cleanup(): if ogrtest.eeda_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) gdal.SetConfigOption('EEDA_BEARER', None) gdal.SetConfigOption('EEDA_URL', None) gdal.SetConfigOption('EEDA_PRIVATE_KEY', None) gdal.SetConfigOption('EEDA_CLIENT_EMAIL', None) gdal.SetConfigOption('GO2A_AUD', None) gdal.SetConfigOption('GOA2_NOW', None) gdal.Unlink('/vsimem/ee/') gdal.Unlink('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageSize=1') gdal.Unlink('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?pageToken=myToken') gdal.Unlink('/vsimem/ee/projects/earthengine-public/assets/collection:listImages?filter=raw%5Ffilter') gdalautotest-3.0.4/ogr/ogr_osm.py0000755003401500001440000006057113614005325016451 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_osm.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR OSM driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2012-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 from osgeo import ogr from osgeo import gdal import gdaltest import ogrtest import pytest ############################################################################### # Test .pbf def test_ogr_osm_1(filename='data/test.pbf'): ogrtest.osm_drv = ogr.GetDriverByName('OSM') if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open(filename) if ds is None: if filename == 'data/test.osm': ogrtest.osm_drv_parse_osm = False if gdal.GetLastErrorMsg().find('OSM XML detected, but Expat parser not available') == 0: pytest.skip() pytest.fail() else: if filename == 'data/test.osm': ogrtest.osm_drv_parse_osm = True # Test points lyr = ds.GetLayer('points') assert lyr.GetGeomType() == ogr.wkbPoint sr = lyr.GetSpatialRef() assert (sr.ExportToWkt().find('GEOGCS["WGS 84",DATUM["WGS_1984",') == 0 or \ sr.ExportToWkt().find('GEOGCS["GCS_WGS_1984",DATUM["WGS_1984"') == 0) if filename == 'data/test.osm': assert lyr.GetExtent() == (2.0, 3.0, 49.0, 50.0) feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '3' or \ feat.GetFieldAsString('name') != 'Some interesting point' or \ feat.GetFieldAsString('other_tags') != '"foo"=>"bar","bar"=>"baz"': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT (3.0 49.5)')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat is not None: feat.DumpReadable() pytest.fail() # Test lines lyr = ds.GetLayer('lines') assert lyr.GetGeomType() == ogr.wkbLineString feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '1' or \ feat.GetFieldAsString('highway') != 'motorway' or \ feat.GetFieldAsInteger('z_order') != 9 or \ feat.GetFieldAsString('other_tags') != '"foo"=>"bar"': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '6': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 49,3 50,2 50,2 49)')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat is not None: feat.DumpReadable() pytest.fail() # Test multipolygons lyr = ds.GetLayer('multipolygons') if filename == 'tmp/ogr_osm_3': assert lyr.GetGeomType() == ogr.wkbPolygon else: assert lyr.GetGeomType() == ogr.wkbMultiPolygon feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '1' or \ feat.GetFieldAsString('type') != 'multipolygon' or \ feat.GetFieldAsString('natural') != 'forest': feat.DumpReadable() pytest.fail() if filename == 'tmp/ogr_osm_3': if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON ((2 49,2 50,3 50,3 49,2 49),(2.1 49.1,2.2 49.1,2.2 49.2,2.1 49.2,2.1 49.1))')) != 0: feat.DumpReadable() pytest.fail() else: if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('MULTIPOLYGON (((2 49,3 49,3 50,2 50,2 49),(2.1 49.1,2.2 49.1,2.2 49.2,2.1 49.2,2.1 49.1)))')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '5' or \ feat.GetFieldAsString('type') != 'multipolygon' or \ feat.GetFieldAsString('natural') != 'wood': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_way_id') != '8' or \ feat.GetFieldAsString('name') != 'standalone_polygon': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat is not None: feat.DumpReadable() pytest.fail() # Test multilinestrings lyr = ds.GetLayer('multilinestrings') if filename == 'tmp/ogr_osm_3': assert lyr.GetGeomType() == ogr.wkbLineString else: assert lyr.GetGeomType() == ogr.wkbMultiLineString feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '3' or \ feat.GetFieldAsString('type') != 'route': feat.DumpReadable() pytest.fail() if filename == 'tmp/ogr_osm_3': if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)')) != 0: feat.DumpReadable() pytest.fail() else: if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('MULTILINESTRING ((2 49,3 50))')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat is not None: feat.DumpReadable() pytest.fail() # Test other_relations lyr = ds.GetLayer('other_relations') if filename == 'tmp/ogr_osm_3': assert lyr is None else: assert lyr.GetGeomType() == ogr.wkbGeometryCollection feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '4' or \ feat.GetFieldAsString('type') != 'other_type': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (2 49),LINESTRING (2 49,3 50))')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat is not None: feat.DumpReadable() pytest.fail() if ds.GetDriver().GetName() == 'OSM': sql_lyr = ds.ExecuteSQL("GetBytesRead()") assert sql_lyr is not None feat = sql_lyr.GetNextFeature() assert feat is not None feat = sql_lyr.GetNextFeature() assert feat is None sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is not None sql_lyr.GetLayerDefn() sql_lyr.TestCapability("foo") ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test .osm def test_ogr_osm_2(): return test_ogr_osm_1('data/test.osm') ############################################################################### # Test ogr2ogr def test_ogr_osm_3(options=None, all_layers=False): if ogrtest.osm_drv is None: pytest.skip() filepath = 'tmp/ogr_osm_3' if os.path.exists(filepath): ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filepath) if options is not None: options = ' ' + options else: options = '' if all_layers: layers = '' else: layers = 'points lines multipolygons multilinestrings ' with gdaltest.error_handler(): gdal.VectorTranslate('tmp/ogr_osm_3', 'data/test.pbf', options=layers + options) ret = test_ogr_osm_1(filepath) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filepath) return ret ############################################################################### # Test ogr2ogr with --config OSM_USE_CUSTOM_INDEXING NO and -skip def test_ogr_osm_3_sqlite_nodes(): gdal.SetConfigOption('OSM_USE_CUSTOM_INDEXING', 'NO') ret = test_ogr_osm_3(options='-skip') gdal.SetConfigOption('OSM_USE_CUSTOM_INDEXING', None) return ret ############################################################################### # Test ogr2ogr with --config OSM_COMPRESS_NODES YES def test_ogr_osm_3_custom_compress_nodes(): gdal.SetConfigOption('OSM_COMPRESS_NODES', 'YES') ret = test_ogr_osm_3() gdal.SetConfigOption('OSM_COMPRESS_NODES', None) return ret ############################################################################### # Test ogr2ogr with all layers def test_ogr_osm_3_all_layers(): return test_ogr_osm_3(options='-skip', all_layers=True) ############################################################################### # Test optimization when reading only the points layer through a SQL request def test_ogr_osm_4(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/test.pbf') assert ds is not None sql_lyr = ds.ExecuteSQL('SELECT * FROM points') feat = sql_lyr.GetNextFeature() is_none = feat is None ds.ReleaseResultSet(sql_lyr) assert not is_none # Test spatial filter lyr = ds.GetLayerByName('points') lyr.SetSpatialFilterRect(0, 0, 0, 0) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None, 'Zero filter ' with gdaltest.error_handler(): lyr.SetSpatialFilter(None) # Change layer sql_lyr = ds.ExecuteSQL('SELECT * FROM lines') feat = sql_lyr.GetNextFeature() is_none = feat is None ds.ReleaseResultSet(sql_lyr) assert not is_none # Change layer sql_lyr = ds.ExecuteSQL('SELECT * FROM points') feat = sql_lyr.GetNextFeature() is_none = feat is None ds.ReleaseResultSet(sql_lyr) assert not is_none ############################################################################### # Test optimizations for early attribute filter evaluation def test_ogr_osm_5(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/test.pbf') assert ds is not None tests = [['points', '3', True], ['points', 'foo', False], ['lines', '1', True], ['lines', 'foo', False], ['multipolygons', '1', True], ['multipolygons', 'foo', False], ['multilinestrings', '3', True], ['multilinestrings', 'foo', False]] for test in tests: sql_lyr = ds.ExecuteSQL("SELECT * FROM %s WHERE osm_id = '%s'" % (test[0], test[1])) feat = sql_lyr.GetNextFeature() is_none = feat is None feat = None ds.ReleaseResultSet(sql_lyr) assert (test[2] ^ is_none) sql_lyr = ds.ExecuteSQL("select * from multipolygons where type = 'multipolygon'") feat = sql_lyr.GetNextFeature() is_none = feat is None feat = None ds.ReleaseResultSet(sql_lyr) assert not is_none, test ############################################################################### # Test ogr2ogr -sql def test_ogr_osm_6(): if ogrtest.osm_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: os.stat('tmp/ogr_osm_6') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ogr_osm_6') except (OSError, AttributeError): pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' tmp/ogr_osm_6 data/test.pbf -sql "select * from multipolygons" -progress') ds = ogr.Open('tmp/ogr_osm_6') lyr = ds.GetLayer(0) count = lyr.GetFeatureCount() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ogr_osm_6') assert count == 3 ############################################################################### # Test optimization when reading only the points layer through a SQL request # with SQLite dialect (#4825) def test_ogr_osm_7(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/test.pbf') assert ds is not None sql_lyr = ds.ExecuteSQL('SELECT * FROM points LIMIT 10', dialect='SQLite') if sql_lyr is None and gdal.GetLastErrorMsg().find('automatic extension loading failed') != 0: pytest.skip() count = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert count == 1 ############################################################################### # Test 64-bit ids def test_ogr_osm_8(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/base-64.osm.pbf') assert ds is not None lyr = ds.GetLayerByName('points') lyr.SetAttributeFilter("osm_id = '4294967934'") feat = lyr.GetNextFeature() if feat.GetField('name') != 'Treetops' or \ ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT (-61.7964321 17.1498319)')) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multipolygons') feat = lyr.GetFeature(1113) if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('MULTIPOLYGON (((-61.7780345 17.140634,-61.7777002 17.1406069,-61.7776854 17.1407739,-61.7779131 17.1407923,-61.7779158 17.1407624,-61.7780224 17.140771,-61.7780345 17.140634)))')) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Same as ogr_osm_8 but with OSM_USE_CUSTOM_INDEXING=NO def test_ogr_osm_9(): if ogrtest.osm_drv is None: pytest.skip() old_val = gdal.GetConfigOption('OSM_USE_CUSTOM_INDEXING') gdal.SetConfigOption('OSM_USE_CUSTOM_INDEXING', 'NO') ret = test_ogr_osm_8() gdal.SetConfigOption('OSM_USE_CUSTOM_INDEXING', old_val) return ret ############################################################################### # Some error conditions def test_ogr_osm_10(): if ogrtest.osm_drv is None: pytest.skip() # A file that does not exist. ds = ogr.Open('/nonexistent/foo.osm') assert ds is None # Empty .osm file f = gdal.VSIFOpenL('/vsimem/foo.osm', 'wb') gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/foo.osm') assert ds is None gdal.Unlink('/vsimem/foo.osm') # Empty .pbf file f = gdal.VSIFOpenL('/vsimem/foo.pbf', 'wb') gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/foo.pbf') assert ds is None gdal.Unlink('/vsimem/foo.pbf') if ogrtest.osm_drv_parse_osm: # Invalid .osm file f = gdal.VSIFOpenL('/vsimem/foo.osm', 'wb') data = "" gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/foo.osm') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' ds = None gdal.Unlink('/vsimem/foo.osm') # Invalid .pbf file f = gdal.VSIFOpenL('/vsimem/foo.pbf', 'wb') data = "OSMHeader\n" gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/foo.pbf') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' ds = None gdal.Unlink('/vsimem/foo.pbf') # Test million laugh pattern if ogrtest.osm_drv_parse_osm: ds = ogr.Open('data/billionlaugh.osm') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert feat is None and gdal.GetLastErrorMsg() != '' ############################################################################### # Test all_tags def test_ogr_osm_11(): if ogrtest.osm_drv is None: pytest.skip() gdal.SetConfigOption('OSM_CONFIG_FILE', 'data/osmconf_alltags.ini') ds = ogr.Open('data/test.pbf') gdal.SetConfigOption('OSM_CONFIG_FILE', None) lyr = ds.GetLayerByName('points') feat = lyr.GetNextFeature() if feat.GetFieldAsString('osm_id') != '3' or \ feat.GetFieldAsString('name') != 'Some interesting point' or \ feat.GetFieldAsString('all_tags') != '"name"=>"Some interesting point","foo"=>"bar","bar"=>"baz"': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('lines') feat = lyr.GetNextFeature() if feat.GetField('z_order') != 9: feat.DumpReadable() pytest.fail() ############################################################################### # Test that attribute filter set on a line layer is well taken into # account def test_ogr_osm_12(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/test.pbf') for i in range(2): lay = ds.GetLayerByIndex(i) lay.SetAttributeFilter("highway IS NOT NULL") # lay.GetNextFeature() lay.ResetReading() feat = lay.GetNextFeature() count = 0 while feat is not None: count = count + 1 feat = lay.GetNextFeature() assert i != 1 or count == 1 ds = None ############################################################################### # Test test_uncompressed_dense_true_nometadata.pbf def test_ogr_osm_test_uncompressed_dense_true_nometadata_pbf(): return test_ogr_osm_1('data/test_uncompressed_dense_true_nometadata.pbf') ############################################################################### # Test test_uncompressed_dense_false.pbf def test_ogr_osm_test_uncompressed_dense_false_pbf(): return test_ogr_osm_1('data/test_uncompressed_dense_false.pbf') # Special case: if an object has a 'osm_id' key, then do not use it to override # "our" osm_id field. But put it in other_fields (#6347) def test_ogr_osm_13(): if ogrtest.osm_drv is None or not ogrtest.osm_drv_parse_osm: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_osm_13.osm', """""") with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_osm_13.osm') if ds is None: gdal.Unlink('/vsimem/ogr_osm_13.osm') pytest.skip() lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['osm_id'] != '123' or f['other_tags'] != '"osm_id"=>"0"': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_osm_13.osm') ############################################################################### # Test that we handle polygons in other_relations (#6475) def test_ogr_osm_14(): if ogrtest.osm_drv is None or not ogrtest.osm_drv_parse_osm: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_osm_14.osm', """ """) with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_osm_14.osm') if ds is None: gdal.Unlink('/vsimem/ogr_osm_14.osm') pytest.skip() sql_lyr = ds.ExecuteSQL('SELECT * FROM other_relations') f = sql_lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'GEOMETRYCOLLECTION (POLYGON ((49 2,49.0 2.1,49.1 2.1,49 2)))': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_osm_14.osm') ############################################################################### # Test Dataset.GetNextFeature() def ogr_osm_15_progresscbk_return_true(pct, msg, user_data): # pylint: disable=unused-argument user_data[0] = pct return 1 def ogr_osm_15_progresscbk_return_false(pct, msg, user_data): # pylint: disable=unused-argument return 0 def test_ogr_osm_15(): if ogrtest.osm_drv is None: pytest.skip() ds = gdal.OpenEx('data/test.pbf') assert ds.TestCapability(ogr.ODsCRandomLayerRead) == 1 count = 0 last_pct = 0 while True: f, l, pct = ds.GetNextFeature(include_pct=True) assert pct >= last_pct last_pct = pct if f is None: assert l is None break # f.DumpReadable() count += 1 if f.GetDefnRef().GetName() != l.GetName(): f.DumpReadable() pytest.fail(l.GetName()) assert count == 8 assert last_pct == 1.0 f, l, pct = ds.GetNextFeature(include_pct=True) assert f is None and l is None and pct == 1.0 ds.ResetReading() for i in range(count): f, lyr = ds.GetNextFeature() # f.DumpReadable() assert not (f is None or lyr is None), i ds.ResetReading() f, lyr = ds.GetNextFeature(callback=ogr_osm_15_progresscbk_return_false) assert f is None and lyr is None ds.ResetReading() pct_array = [0] f, lyr = ds.GetNextFeature(callback=ogr_osm_15_progresscbk_return_true, callback_data=pct_array) assert not (f is None or lyr is None) assert pct_array[0] == 1.0 # ds = gdal.OpenEx('/home/even/gdal/data/osm/france.osm.pbf') # ds.ExecuteSQL('SET interest_layers = relations') # def test(pct, msg, unused): # print(pct) # f, l = ds.GetNextFeature( callback = test) # print(f) ds = None ############################################################################### # Test laundering of tags (https://github.com/OSGeo/gdal/pull/161) def test_ogr_osm_16(): if ogrtest.osm_drv is None or not ogrtest.osm_drv_parse_osm: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_osm_16.osm', """ """) gdal.FileFromMemBuffer('/vsimem/ogr_osm_16_conf.ini', """# attribute_name_laundering=yes [points] attributes=foo:baar,foo:bar """) ds = gdal.OpenEx('/vsimem/ogr_osm_16.osm', open_options=['CONFIG_FILE=/vsimem/ogr_osm_16_conf.ini']) lyr = ds.GetLayerByName('points') f = lyr.GetNextFeature() if f['foo_baar'] != 'val' or f['foo_bar'] != 'val2': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_osm_16.osm') gdal.Unlink('/vsimem/ogr_osm_16_conf.ini') ############################################################################### # Test converting an empty OSM file (this essentially tests the behaviour of # GDALVectorTranslate() in random feature mode, when there is no feature) def test_ogr_osm_17(): if ogrtest.osm_drv is None or not ogrtest.osm_drv_parse_osm: pytest.skip() with gdaltest.error_handler(): gdal.VectorTranslate('/vsimem/ogr_osm_17', 'data/empty.osm', options='-skip') ds = ogr.Open('/vsimem/ogr_osm_17') layer_count = ds.GetLayerCount() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_osm_17') assert layer_count == 4 ############################################################################### # Test correct reading of .pbf files with multiple densenode blocks and # regarding EOF def test_ogr_osm_18(): if ogrtest.osm_drv is None: pytest.skip() ds = ogr.Open('data/two_points.pbf') lyr = ds.GetLayerByName('points') count = 0 for f in lyr: count += 1 ds = None assert count == 2 gdalautotest-3.0.4/ogr/ogr_dgnv8.py0000755003401500001440000001452713614005325016701 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_dgnv8.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test DGNv8 Driver. # 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. ############################################################################### import os import shutil import gdaltest import ogrtest from osgeo import gdal, ogr import pytest ############################################################################### # Verify we can open the test file. def test_ogr_dgnv8_1(): gdaltest.dgnv8_drv = ogr.GetDriverByName('DGNv8') if gdaltest.dgnv8_drv is None: pytest.skip() ds = ogr.Open('data/test_dgnv8.dgn') assert ds is not None, 'failed to open test file.' ############################################################################### # Compare with a reference CSV dump def test_ogr_dgnv8_2(): if gdaltest.dgnv8_drv is None: pytest.skip() gdal.VectorTranslate('/vsimem/ogr_dgnv8_2.csv', 'data/test_dgnv8.dgn', options='-f CSV -dsco geometry=as_wkt -sql "select *, ogr_style from my_model"') ds_ref = ogr.Open('/vsimem/ogr_dgnv8_2.csv') lyr_ref = ds_ref.GetLayer(0) ds = ogr.Open('data/test_dgnv8_ref.csv') lyr = ds.GetLayer(0) ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=['WKT']) gdal.Unlink('/vsimem/ogr_dgnv8_2.csv') return ret ############################################################################### # Run test_ogrsf def test_ogr_dgnv8_3(): if gdaltest.dgnv8_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test_dgnv8.dgn') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 shutil.copy('data/test_dgnv8.dgn', 'tmp/test_dgnv8.dgn') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/test_dgnv8.dgn') os.unlink('tmp/test_dgnv8.dgn') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test creation code def test_ogr_dgnv8_4(): if gdaltest.dgnv8_drv is None: pytest.skip() tmp_dgn = 'tmp/ogr_dgnv8_4.dgn' gdal.VectorTranslate(tmp_dgn, 'data/test_dgnv8.dgn', format='DGNv8') tmp_csv = '/vsimem/ogr_dgnv8_4.csv' gdal.VectorTranslate(tmp_csv, tmp_dgn, options='-f CSV -dsco geometry=as_wkt -sql "select *, ogr_style from my_model"') gdal.Unlink(tmp_dgn) ds_ref = ogr.Open(tmp_csv) lyr_ref = ds_ref.GetLayer(0) ds = ogr.Open('data/test_dgnv8_write_ref.csv') lyr = ds.GetLayer(0) ret = ogrtest.compare_layers(lyr, lyr_ref, excluded_fields=['WKT']) gdal.Unlink(tmp_csv) return ret ############################################################################### # Test creation options def test_ogr_dgnv8_5(): if gdaltest.dgnv8_drv is None: pytest.skip() tmp_dgn = 'tmp/ogr_dgnv8_5.dgn' options = ['APPLICATION=application', 'TITLE=title', 'SUBJECT=subject', 'AUTHOR=author', 'KEYWORDS=keywords', 'TEMPLATE=template', 'COMMENTS=comments', 'LAST_SAVED_BY=last_saved_by', 'REVISION_NUMBER=revision_number', 'CATEGORY=category', 'MANAGER=manager', 'COMPANY=company'] ds = gdaltest.dgnv8_drv.CreateDataSource(tmp_dgn, options=options) lyr = ds.CreateLayer('my_layer') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) lyr.CreateFeature(f) ds = None ds = ogr.Open(tmp_dgn) got_md = ds.GetMetadata_List('DGN') assert got_md == options ds = None tmp2_dgn = 'tmp/ogr_dgnv8_5_2.dgn' gdaltest.dgnv8_drv.CreateDataSource(tmp2_dgn, options=['SEED=' + tmp_dgn, 'TITLE=another_title']) ds = ogr.Open(tmp2_dgn) assert ds.GetMetadataItem('TITLE', 'DGN') == 'another_title' and ds.GetMetadataItem('APPLICATION', 'DGN') == 'application', \ ds.GetMetadata('DGN') lyr = ds.GetLayer(0) assert lyr.GetName() == 'my_layer' assert lyr.GetFeatureCount() == 0 ds = None ds = gdaltest.dgnv8_drv.CreateDataSource(tmp2_dgn, options=['SEED=' + tmp_dgn]) lyr = ds.CreateLayer('a_layer', options=['DESCRIPTION=my_layer', 'DIM=2']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 3)')) lyr.CreateFeature(f) ds = None ds = ogr.Open(tmp2_dgn, update=1) lyr = ds.GetLayer(0) assert lyr.GetName() == 'a_layer' assert lyr.GetFeatureCount() == 1 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 3)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink(tmp_dgn) gdal.Unlink(tmp2_dgn) ############################################################################### # Cleanup def test_ogr_dgnv8_cleanup(): pass gdalautotest-3.0.4/ogr/ogr_mysql.py0000755003401500001440000007274113614005325017022 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_mysql.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test MySQL driver functionality. # Author: Even Rouault # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import gdaltest import ogrtest from osgeo import ogr from osgeo import gdal from osgeo import osr import pytest # E. Rouault : this is almost a copy & paste from ogr_pg.py # # To create the required MySQL instance do something like: # # $ mysql -u root -p # mysql> CREATE DATABASE autotest; # mysql> GRANT ALL ON autotest.* TO 'THE_USER_THAT_RUNS_AUTOTEST'@'localhost'; # ############################################################################### # Open Database. def test_ogr_mysql_1(): gdaltest.mysql_ds = None try: ogr.GetDriverByName('MySQL') except: pytest.skip() val = gdal.GetConfigOption('OGR_MYSQL_CONNECTION_STRING', None) if val is not None: gdaltest.mysql_connection_string = val else: gdaltest.mysql_connection_string = 'MYSQL:autotest' gdaltest.mysql_ds = ogr.Open(gdaltest.mysql_connection_string, update=1) if gdaltest.mysql_ds is None: pytest.skip() sql_lyr = gdaltest.mysql_ds.ExecuteSQL("SELECT VERSION()") f = sql_lyr.GetNextFeature() print('Version: ' + f.GetField(0)) gdaltest.is_mysql_8_or_later = int(f.GetField(0).split('.')[0]) >= 8 and f.GetField(0).find('MariaDB') < 0 gdaltest.mysql_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Create table from data/poly.shp def test_ogr_mysql_2(): if gdaltest.mysql_ds is None: pytest.skip() shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) ###################################################### # Create Layer gdaltest.mysql_lyr = gdaltest.mysql_ds.CreateLayer('tpoly', srs=shp_lyr.GetSpatialRef(), options=['ENGINE=MyISAM']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.mysql_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8), ('INT64', ogr.OFTInteger64)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.mysql_lyr.GetLayerDefn()) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) dst_feat.SetField('INT64', 1234567890123) gdaltest.mysql_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() assert gdaltest.mysql_lyr.GetFeatureCount() == shp_lyr.GetFeatureCount(), \ 'not matching feature count' assert gdaltest.mysql_lyr.GetSpatialRef().GetAuthorityCode(None) == shp_lyr.GetSpatialRef().GetAuthorityCode(None), \ 'not matching spatial ref' ############################################################################### # Test reading a layer extent def test_ogr_mysql_19(): if gdaltest.mysql_ds is None: pytest.skip() layer = gdaltest.mysql_ds.GetLayerByName('tpoly') if layer is None: pytest.fail('did not get tpoly layer') extent = layer.GetExtent() expect = (478315.53125, 481645.3125, 4762880.5, 4765610.5) minx = abs(extent[0] - expect[0]) maxx = abs(extent[1] - expect[1]) miny = abs(extent[2] - expect[2]) maxy = abs(extent[3] - expect[3]) if max(minx, maxx, miny, maxy) > 0.0001: print(extent) pytest.fail('Extents do not match') ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_mysql_3(): if gdaltest.mysql_ds is None: pytest.skip() assert gdaltest.mysql_lyr.GetGeometryColumn() == 'SHAPE' assert gdaltest.mysql_lyr.GetFeatureCount() == 10 expect = [168, 169, 166, 158, 165] gdaltest.mysql_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.mysql_lyr, 'eas_id', expect) assert gdaltest.mysql_lyr.GetFeatureCount() == 5 gdaltest.mysql_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.mysql_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) assert read_feat.GetField('INT64') == 1234567890123 read_feat.Destroy() orig_feat.Destroy() gdaltest.poly_feat = None gdaltest.shp_ds.Destroy() assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_mysql_4(): if gdaltest.mysql_ds is None: pytest.skip() # E. Rouault : the mySQL driver doesn't seem to like adding new features and # iterating over a query at the same time. # If trying to do so, we get the 'Commands out of sync' error. wkt_list = ['10', '2', '1', '4', '5', '6'] gdaltest.mysql_lyr.ResetReading() feature_def = gdaltest.mysql_lyr.GetLayerDefn() for item in wkt_list: dst_feat = ogr.Feature(feature_def) wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new Oracle feature. dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) gdaltest.mysql_lyr.CreateFeature(dst_feat) dst_feat.Destroy() # FIXME : The source wkt polygons of '4' and '6' are not closed and # mySQL return them as closed, so the check_feature_geometry returns FALSE # Checking them after closing the rings again returns TRUE. wkt_list = ['10', '2', '1', '5', '4', '6'] for item in wkt_list: wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Read back the feature and get the geometry. gdaltest.mysql_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.mysql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, geom) != 0: print('Geometry changed. Closing rings before trying again for wkt #', item) print('(before):', geom.ExportToWkt()) geom.CloseRings() print('(after) :', geom.ExportToWkt()) assert ogrtest.check_feature_geometry(feat_read, geom) == 0 feat_read.Destroy() ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_mysql_5(): if gdaltest.mysql_ds is None: pytest.skip() # E. Rouault : unlike PostgreSQL driver : None is sorted in last position expect = [179, 173, 172, 171, 170, 169, 168, 166, 165, 158, None] sql_lyr = gdaltest.mysql_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') assert sql_lyr.GetFeatureCount() == 11 tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.mysql_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_mysql_6(): if gdaltest.mysql_ds is None: pytest.skip() sql_lyr = gdaltest.mysql_ds.ExecuteSQL("select * from tpoly where prfedea = '2'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['2']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'MULTILINESTRING ((5.00121349 2.99853132,5.00121349 1.99853133),(5.00121349 1.99853133,5.00121349 0.99853133),(3.00121351 1.99853127,5.00121349 1.99853133),(5.00121349 1.99853133,6.00121348 1.99853135))') != 0: tr = 0 feat_read.Destroy() sql_lyr.ResetReading() geom = ogr.CreateGeometryFromWkt( 'LINESTRING(-10 -10,0 0)') sql_lyr.SetSpatialFilter(geom) geom.Destroy() assert sql_lyr.GetFeatureCount() == 0 assert sql_lyr.GetNextFeature() is None, 'GetNextFeature() did not return None' gdaltest.mysql_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_mysql_7(): if gdaltest.mysql_ds is None: pytest.skip() gdaltest.mysql_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.mysql_lyr.SetSpatialFilter(geom) geom.Destroy() assert gdaltest.mysql_lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(gdaltest.mysql_lyr, 'eas_id', [158]) gdaltest.mysql_lyr.SetAttributeFilter('eas_id = 158') assert gdaltest.mysql_lyr.GetFeatureCount() == 1 gdaltest.mysql_lyr.SetAttributeFilter(None) gdaltest.mysql_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Write a feature with too long a text value for a fixed length text field. # The driver should now truncate this (but with a debug message). Also, # put some crazy stuff in the value to verify that quoting and escaping # is working smoothly. # # No geometry in this test. def test_ogr_mysql_8(): if gdaltest.mysql_ds is None: pytest.skip() dst_feat = ogr.Feature(feature_def=gdaltest.mysql_lyr.GetLayerDefn()) dst_feat.SetField('PRFEDEA', 'CrazyKey') dst_feat.SetField('SHORTNAME', 'Crazy"\'Long') # We are obliged to create a fake geometry dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdaltest.mysql_lyr.CreateFeature(dst_feat) dst_feat.Destroy() gdaltest.mysql_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat_read = gdaltest.mysql_lyr.GetNextFeature() assert feat_read is not None, 'creating crazy feature failed!' assert feat_read.GetField('shortname') == 'Crazy"\'L', \ ('Vvalue not properly escaped or truncated:' + feat_read.GetField('shortname')) feat_read.Destroy() ############################################################################### # Verify inplace update of a feature with SetFeature(). def test_ogr_mysql_9(): if gdaltest.mysql_ds is None: pytest.skip() gdaltest.mysql_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.mysql_lyr.GetNextFeature() gdaltest.mysql_lyr.SetAttributeFilter(None) feat.SetField('SHORTNAME', 'Reset') point = ogr.Geometry(ogr.wkbPoint25D) point.SetPoint(0, 5, 6) feat.SetGeometryDirectly(point) if gdaltest.mysql_lyr.SetFeature(feat) != 0: feat.Destroy() pytest.fail('SetFeature() method failed.') fid = feat.GetFID() feat.Destroy() feat = gdaltest.mysql_lyr.GetFeature(fid) assert feat is not None, ('GetFeature(%d) failed.' % fid) shortname = feat.GetField('SHORTNAME') assert shortname[:5] == 'Reset', ('SetFeature() did not update SHORTNAME, got %s.' % shortname) if ogrtest.check_feature_geometry(feat, 'POINT(5 6)') != 0: print(feat.GetGeometryRef()) pytest.fail('Geometry update failed') # Test updating non-existing feature feat.SetFID(-10) if gdaltest.mysql_lyr.SetFeature(feat) != ogr.OGRERR_NON_EXISTING_FEATURE: feat.Destroy() pytest.fail('Expected failure of SetFeature().') # Test deleting non-existing feature if gdaltest.mysql_lyr.DeleteFeature(-10) != ogr.OGRERR_NON_EXISTING_FEATURE: feat.Destroy() pytest.fail('Expected failure of DeleteFeature().') feat.Destroy() ############################################################################### # Verify that DeleteFeature() works properly. def test_ogr_mysql_10(): if gdaltest.mysql_ds is None: pytest.skip() gdaltest.mysql_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.mysql_lyr.GetNextFeature() gdaltest.mysql_lyr.SetAttributeFilter(None) fid = feat.GetFID() feat.Destroy() assert gdaltest.mysql_lyr.DeleteFeature(fid) == 0, 'DeleteFeature() method failed.' gdaltest.mysql_lyr.SetAttributeFilter("PRFEDEA = 'CrazyKey'") feat = gdaltest.mysql_lyr.GetNextFeature() gdaltest.mysql_lyr.SetAttributeFilter(None) if feat is None: return feat.Destroy() pytest.fail('DeleteFeature() seems to have had no effect.') ############################################################################### # Test very large query. def test_ogr_mysql_15(): if gdaltest.mysql_ds is None: pytest.skip() expect = [169] query = 'eas_id = 169' for i in range(1000): query = query + (' or eas_id = %d' % (i + 1000)) gdaltest.mysql_lyr.SetAttributeFilter(query) tr = ogrtest.check_features_against_list(gdaltest.mysql_lyr, 'eas_id', expect) gdaltest.mysql_lyr.SetAttributeFilter(None) assert tr ############################################################################### # Test very large statement. def test_ogr_mysql_16(): if gdaltest.mysql_ds is None: pytest.skip() expect = [169] query = 'eas_id = 169' for ident in range(1000): query = query + (' or eas_id = %d' % (ident + 1000)) statement = 'select eas_id from tpoly where ' + query lyr = gdaltest.mysql_ds.ExecuteSQL(statement) tr = ogrtest.check_features_against_list(lyr, 'eas_id', expect) gdaltest.mysql_ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test requesting a non-existent table by name (bug 1480). def test_ogr_mysql_17(): if gdaltest.mysql_ds is None: pytest.skip() count = gdaltest.mysql_ds.GetLayerCount() layer = gdaltest.mysql_ds.GetLayerByName('JunkTableName') assert layer is None, 'got layer for non-existent table!' assert count == gdaltest.mysql_ds.GetLayerCount(), \ 'layer count changed unexpectedly.' ############################################################################### # Test getting a layer by name that was not previously a layer. def ogr_mysql_18(): if gdaltest.mysql_ds is None: pytest.skip() count = gdaltest.mysql_ds.GetLayerCount() layer = gdaltest.mysql_ds.GetLayerByName('geometry_columns') assert layer is not None, 'did not get geometry_columns layer' assert count + 1 == gdaltest.mysql_ds.GetLayerCount(), \ 'layer count unexpectedly unchanged.' ############################################################################### def test_ogr_mysql_20(): if gdaltest.mysql_ds is None: pytest.skip() layer = gdaltest.mysql_ds.CreateLayer('select', options=['ENGINE=MyISAM']) ogrtest.quick_create_layer_def(layer, [('desc', ogr.OFTString), ('select', ogr.OFTString)]) dst_feat = ogr.Feature(feature_def=layer.GetLayerDefn()) dst_feat.SetField('desc', 'desc') dst_feat.SetField('select', 'select') # We are obliged to create a fake geometry dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 1)')) layer.CreateFeature(dst_feat) dst_feat.Destroy() layer = gdaltest.mysql_ds.GetLayerByName('select') layer.ResetReading() feat = layer.GetNextFeature() if feat.desc == 'desc' and feat.select == 'select': return pytest.fail() ############################################################################### # Test inserting NULL geometries into a table with a spatial index -> must FAIL def test_ogr_mysql_21(): if gdaltest.mysql_ds is None: pytest.skip() layer = gdaltest.mysql_ds.CreateLayer('tablewithspatialindex', geom_type=ogr.wkbPoint, options=['ENGINE=MyISAM']) ogrtest.quick_create_layer_def(layer, [('name', ogr.OFTString)]) dst_feat = ogr.Feature(feature_def=layer.GetLayerDefn()) dst_feat.SetField('name', 'name') # The insertion MUST fail gdal.PushErrorHandler('CPLQuietErrorHandler') layer.CreateFeature(dst_feat) gdal.PopErrorHandler() dst_feat.Destroy() layer.ResetReading() feat = layer.GetNextFeature() assert feat is None ############################################################################### # Test inserting NULL geometries into a table without a spatial index def test_ogr_mysql_22(): if gdaltest.mysql_ds is None: pytest.skip() layer = gdaltest.mysql_ds.CreateLayer('tablewithoutspatialindex', geom_type=ogr.wkbPoint, options=['SPATIAL_INDEX=NO', 'ENGINE=MyISAM']) ogrtest.quick_create_layer_def(layer, [('name', ogr.OFTString)]) dst_feat = ogr.Feature(feature_def=layer.GetLayerDefn()) dst_feat.SetField('name', 'name') layer.CreateFeature(dst_feat) dst_feat.Destroy() layer.ResetReading() feat = layer.GetNextFeature() assert feat is not None ############################################################################### # Check for right precision def test_ogr_mysql_23(): if gdaltest.mysql_ds is None: pytest.skip() fields = ('zero', 'widthonly', 'onedecimal', 'twentynine', 'thirtyone') values = (1, 2, 1.1, 0.12345678901234567890123456789, 0.1234567890123456789012345678901) precision = (0, 0, 1, 29, 0) ###################################################### # Create a layer with a single feature through SQL if gdaltest.is_mysql_8_or_later: gdaltest.mysql_lyr = gdaltest.mysql_ds.ExecuteSQL("SELECT ROUND(1.1,0) AS zero, ROUND(2.0, 0) AS widthonly, ROUND(1.1,1) AS onedecimal, ROUND(0.12345678901234567890123456789,29) AS twentynine, ST_GeomFromText(CONVERT('POINT(1.0 2.0)',CHAR)) as the_geom;") else: gdaltest.mysql_lyr = gdaltest.mysql_ds.ExecuteSQL("SELECT ROUND(1.1,0) AS zero, ROUND(2.0, 0) AS widthonly, ROUND(1.1,1) AS onedecimal, ROUND(0.12345678901234567890123456789,29) AS twentynine, GeomFromText(CONVERT('POINT(1.0 2.0)',CHAR)) as the_geom;") feat = gdaltest.mysql_lyr.GetNextFeature() assert feat is not None ###################################################### # Check the values and the precisions for i in range(4): assert feat.GetFieldIndex(fields[i]) >= 0, 'field not found' assert feat.GetField(feat.GetFieldIndex(fields[i])) == values[i], \ 'value not right' assert feat.GetFieldDefnRef(feat.GetFieldIndex(fields[i])).GetPrecision() == precision[i], \ 'precision not right' gdaltest.mysql_ds.ReleaseResultSet(gdaltest.mysql_lyr) gdaltest.mysql_lyr = None ############################################################################### # Run test_ogrsf def test_ogr_mysql_24(): if gdaltest.mysql_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + " '" + gdaltest.mysql_connection_string + "' tpoly") assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test 64 bit FID def test_ogr_mysql_72(): if gdaltest.mysql_ds is None: pytest.skip() # Regular layer with 32 bit IDs lyr = gdaltest.mysql_ds.CreateLayer('ogr_mysql_72', geom_type=ogr.wkbNone) assert lyr.GetMetadataItem(ogr.OLMD_FID64) is None lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(123456789012345) f.SetField(0, 'bar') assert lyr.CreateFeature(f) == 0 f = lyr.GetFeature(123456789012345) assert f is not None lyr = gdaltest.mysql_ds.CreateLayer('ogr_mysql_72', geom_type=ogr.wkbNone, options=['FID64=YES', 'OVERWRITE=YES']) assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(123456789012345) f.SetField(0, 'bar') assert lyr.CreateFeature(f) == 0 assert lyr.SetFeature(f) == 0 gdaltest.mysql_ds = None # Test with normal protocol gdaltest.mysql_ds = ogr.Open(gdaltest.mysql_connection_string, update=1) lyr = gdaltest.mysql_ds.GetLayerByName('ogr_mysql_72') assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None f = lyr.GetNextFeature() if f.GetFID() != 123456789012345: f.DumpReadable() pytest.fail() ############################################################################### # Test nullable def test_ogr_mysql_25(): if gdaltest.mysql_ds is None: pytest.skip() lyr = gdaltest.mysql_ds.CreateLayer('ogr_mysql_25', geom_type=ogr.wkbPoint, options=['ENGINE=MyISAM']) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field if False: # pylint: disable=using-constant-test # hum mysql seems OK with unset non-nullable fields ?? f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None gdaltest.mysql_ds = None gdaltest.mysql_ds = ogr.Open(gdaltest.mysql_connection_string, update=1) lyr = gdaltest.mysql_ds.GetLayerByName('ogr_mysql_25') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 ############################################################################### # Test default values def test_ogr_mysql_26(): if gdaltest.mysql_ds is None: pytest.skip() lyr = gdaltest.mysql_ds.CreateLayer('ogr_mysql_26', geom_type=ogr.wkbPoint, options=['ENGINE=MyISAM']) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_string_null', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) # field_defn = ogr.FieldDefn( 'field_date', ogr.OFTDate ) # field_defn.SetDefault("CURRENT_DATE") # lyr.CreateField(field_defn) # field_defn = ogr.FieldDefn( 'field_time', ogr.OFTTime ) # field_defn.SetDefault("CURRENT_TIME") # lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('field_string_null') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None gdaltest.mysql_ds = None gdaltest.mysql_ds = ogr.Open(gdaltest.mysql_connection_string, update=1) lyr = gdaltest.mysql_ds.GetLayerByName('ogr_mysql_26') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() == 'CURRENT_TIMESTAMP' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() == "'2015/06/30 12:34:56'" # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault() != "CURRENT_DATE": # gdaltest.post_reason('fail') # print(lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault()) # return 'fail' # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_time')).GetDefault() != "CURRENT_TIME": # gdaltest.post_reason('fail') # return 'fail' f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_string_null') or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56': f.DumpReadable() pytest.fail() gdal.Unlink('/vsimem/ogr_gpkg_24.gpkg') ############################################################################### # def test_ogr_mysql_longlat(): if gdaltest.mysql_ds is None: pytest.skip() srs = osr.SpatialReference() srs.SetFromUserInput('WGS84') lyr = gdaltest.mysql_ds.CreateLayer('ogr_mysql_longlat', geom_type=ogr.wkbPoint, srs=srs, options=['ENGINE=MyISAM']) f = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT(150 2)') f.SetGeometry(geom) lyr.CreateFeature(f) lyr.SetSpatialFilterRect(149.5, 1.5, 150.5, 2.5) f = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(f, geom) == 0 extent = lyr.GetExtent() expect = (150.0, 150.0, 2.0, 2.0) minx = abs(extent[0] - expect[0]) maxx = abs(extent[1] - expect[1]) miny = abs(extent[2] - expect[2]) maxy = abs(extent[3] - expect[3]) if max(minx, maxx, miny, maxy) > 0.0001: print(extent) pytest.fail('Extents do not match') ############################################################################### # def test_ogr_mysql_cleanup(): if gdaltest.mysql_ds is None: pytest.skip() gdaltest.mysql_ds.ExecuteSQL('DROP TABLE tpoly') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE `select`') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE tablewithspatialindex') with gdaltest.error_handler(): gdaltest.mysql_ds.ExecuteSQL('DROP TABLE tablewithoutspatialindex') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE geometry_columns') if not gdaltest.is_mysql_8_or_later: gdaltest.mysql_ds.ExecuteSQL('DROP TABLE spatial_ref_sys') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE ogr_mysql_72') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE ogr_mysql_25') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE ogr_mysql_26') gdaltest.mysql_ds.ExecuteSQL('DROP TABLE ogr_mysql_longlat') gdaltest.mysql_ds.Destroy() gdaltest.mysql_ds = None gdalautotest-3.0.4/ogr/ogr_svg.py0000755003401500001440000001722713614005325016452 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_svg.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test SVG driver functionality. # 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 import ogrtest from osgeo import ogr import pytest def test_ogr_svg_init(): gdaltest.svg_ds = None gdaltest.svg_ds = ogr.Open('data/test.svg') if gdaltest.svg_ds is None: gdaltest.have_svg = 0 else: gdaltest.have_svg = 1 if not gdaltest.have_svg: pytest.skip() assert gdaltest.svg_ds.GetLayerCount() == 3, 'wrong number of layers' ############################################################################### # Test def test_ogr_svg_1(): if not gdaltest.have_svg: pytest.skip() assert gdaltest.svg_ds is not None lyr = gdaltest.svg_ds.GetLayerByName('points') assert lyr.GetFeatureCount() == 1, 'wrong number of features' feat = lyr.GetNextFeature() if feat.GetFieldAsString('building') != 'yes': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, 'POINT (-13610535.695141600444913 4561593.930507560260594)', max_error=0.0001) != 0: feat.DumpReadable() pytest.fail() lyr = gdaltest.svg_ds.GetLayerByName('lines') assert lyr.GetFeatureCount() == 1, 'wrong number of features' feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'LINESTRING (-13609855.59 4561479.26,-13609856.21 4561474.27,-13609860.03 4561468.87,-13609865.74 4561465.69,-13609869.54 4561465.06)', max_error=0.0001) != 0: feat.DumpReadable() pytest.fail() lyr = gdaltest.svg_ds.GetLayerByName('polygons') assert lyr.GetFeatureCount() == 1, 'wrong number of features' feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POLYGON ((-13610027.72 4562403.66,-13609661.58 4562462.95,-13609671.33 4562516.4,-13609676.11 4562532.65,-13609692.36 4562552.71,-13609711.46 4562609.08,-13609721.97 4562634.89,-13609727.7 4562650.16,-13609727.7 4562666.41,-13609716.23 4562699.85,-13609698.09 4562758.14,-13609697.13 4562771.51,-13609706.68 4562811.64,-13609720.06 4562843.18,-13609723.88 4562863.23,-13609725.8 4562891.91,-13609721.02 4562919.61,-13609713.37 4562938.72,-13609701.91 4562954.97,-13609688.53 4562968.34,-13609668.47 4562979.8,-13609614.96 4562993.17,-13609589.16 4563005.6,-13609552.85 4563037.14,-13609530.88 4563053.37,-13609474.5 4563076.3,-13609487.81 4563109.75,-13609491.89 4563149.38,-13609478.48 4563157.66,-13609467.67 4563171.31,-13609462.25 4563189.21,-13609420.46 4563189.32,-13609401.89 4563191.92,-13609395.2 4563201.47,-13609287.23 4563264.53,-13609303.48 4563291.29,-13609330.23 4563313.26,-13609339.78 4563326.63,-13609342.66 4563340.96,-13609344.56 4563458.48,-13609341.7 4563482.38,-13609322.59 4563518.68,-13609304.43 4563574.1,-13609290.1 4563592.26,-13609289.15 4563615.19,-13609290.1 4563655.32,-13609287.23 4563675.38,-13609271.95 4563703.09,-13609263.35 4563739.4,-13609258.57 4563762.32,-13609250.73 4563760.48,-13609226.84 4563718.43,-13609214.42 4563688.81,-13609204.87 4563661.1,-13609191.49 4563641.03,-13609170.47 4563629.56,-13609137.03 4563632.44,-13609109.32 4563648.68,-13609097.85 4563676.39,-13609100.72 4563712.7,-13609102.63 4563800.59,-13609116.0 4563819.7,-13609156.13 4563850.28,-13609151.55 4563861.7,-13609044.54 4563885.58,-13609057.92 4563945.78,-13609058.88 4563959.15,-13609031.17 4563987.81,-13609014.93 4563969.66,-13608988.17 4563981.13,-13608918.43 4563946.74,-13608834.46 4563870.62,-13608756.43 4563811.52,-13608716.02 4563488.23,-13608439.74 4563228.22,-13608483.69 4563167.08,-13608471.27 4563156.56,-13608461.72 4563132.68,-13608457.89 4563102.1,-13608460.76 4563077.26,-13608464.58 4563054.33,-13608444.52 4563044.78,-13608428.02 4562925.57,-13608408.91 4562672.38,-13608471.97 4562671.42,-13608514.96 4562653.27,-13608586.63 4562653.27,-13608728.76 4562628.85,-13609304.17 4562530.01,-13609354.81 4562401.98,-13609349.2 4562281.92,-13609401.52 4562278.13,-13609426.46 4562253.26,-13609385.39 4562165.98,-13609374.88 4561992.09,-13609361.7 4561946.97,-13609413.36 4561935.48,-13609402.85 4561884.85,-13609429.6 4561890.57,-13609487.88 4561880.07,-13609495.53 4561931.65,-13609442.02 4561942.18,-13609454.44 4562017.65,-13609601.59 4561997.59,-13609881.1 4561949.97,-13609858.97 4561817.17,-13609878.07 4561814.31,-13609891.08 4561883.51,-13609912.1 4561880.63,-13609918.79 4561924.59,-13609922.03 4561942.33,-13609949.37 4561938.35,-13609971.5 4562072.19,-13610108.74 4562049.23,-13610117.33 4562098.92,-13610151.73 4562094.14,-13610154.59 4562109.42,-13610224.34 4562097.96,-13610222.43 4562079.81,-13610381.03 4562053.05,-13610401.1 4562051.15,-13610386.77 4561907.82,-13610286.45 4561921.2,-13610210.01 4561869.6,-13610188.04 4561873.42,-13610173.7 4561778.84,-13610177.52 4561770.24,-13610184.21 4561764.51,-13610403.97 4561729.15,-13610429.77 4561711.0,-13610442.18 4561704.31,-13610574.04 4561683.29,-13610579.77 4561748.26,-13610620.86 4561745.4,-13610652.39 4562062.61,-13610802.4 4562037.77,-13610765.13 4561654.62,-13610860.68 4561641.25,-13610892.21 4562001.46,-13610848.26 4562007.19,-13610850.37 4562027.78,-13610870.24 4562264.22,-13610821.87 4562270.93,-13610819.96 4562245.14,-13610749.26 4562250.86,-13610754.03 4562306.29,-13610861.04 4562285.26,-13610864.69 4562319.19,-13610873.3 4562318.24,-13610882.85 4562463.47,-13610835.12 4562470.5,-13610816.0 4562473.37,-13610816.96 4562481.96,-13610737.66 4562493.43,-13610746.26 4562564.13,-13610782.56 4562558.4,-13610784.48 4562580.38,-13610826.52 4562575.6,-13610828.43 4562590.89,-13610845.63 4562588.98,-13610891.49 4562583.24,-13610895.3 4562621.46,-13610829.38 4562629.11,-13610844.67 4562786.76,-13610613.45 4562823.06,-13610570.46 4562334.82,-13610699.56 4562312.97,-13610695.75 4562293.86,-13610689.66 4562256.58,-13610543.47 4562263.26,-13610548.25 4562316.77,-13610487.1 4562326.32,-13610483.27 4562297.66,-13610443.14 4562303.38,-13610446.97 4562333.96,-13610027.72 4562403.66))', max_error=0.0001) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_svg_cleanup(): gdaltest.svg_ds = None gdalautotest-3.0.4/ogr/ogr_sql_test.py0000755003401500001440000013147213614005325017510 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_sql_test.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test various OGR SQL support options. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import sys from osgeo import gdal from osgeo import ogr import gdaltest import ogrtest import pytest ############################################################################### # Test a simple query with a where clause. def test_ogr_sql_1(): gdaltest.ds = ogr.Open('data') gdaltest.lyr = gdaltest.ds.GetLayerByName('poly') gdaltest.lyr.SetAttributeFilter('eas_id < 167') count = gdaltest.lyr.GetFeatureCount() assert count == 3, \ ('Got wrong count with GetFeatureCount() - %d, expecting 3' % count) gdaltest.lyr.SetAttributeFilter('') count = gdaltest.lyr.GetFeatureCount() assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting 10' % count) ############################################################################### # Test DISTINCT handling def test_ogr_sql_2(): expect = [168, 169, 166, 158, 165] sql_lyr = gdaltest.ds.ExecuteSQL('select distinct eas_id from poly where eas_id < 170') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ORDER BY handling def test_ogr_sql_3(): expect = [158, 165, 166, 168, 169] sql_lyr = gdaltest.ds.ExecuteSQL('select distinct eas_id from poly where eas_id < 170 order by eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ORDER BY DESC handling def test_ogr_sql_3_desc(): expect = [169, 168, 166, 165, 158] sql_lyr = gdaltest.ds.ExecuteSQL('select distinct eas_id from poly where eas_id < 170 order by eas_id desc') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test DISTINCT and ORDER BY on strings. def test_ogr_sql_4(): expect = ['_158_', '_165_', '_166_', '_168_', '_170_', '_171_', '_179_'] sql_lyr = gdaltest.ds.ExecuteSQL('select distinct name from idlink order by name asc') tr = ogrtest.check_features_against_list(sql_lyr, 'name', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test column functions. def test_ogr_sql_5(): sql_lyr = gdaltest.ds.ExecuteSQL('select max(eas_id), min(eas_id), avg(eas_id), sum(eas_id), count(eas_id) from idlink') feat = sql_lyr.GetNextFeature() if feat['max_eas_id'] != 179: feat.DumpReadable() pytest.fail() if feat['min_eas_id'] != 158: feat.DumpReadable() pytest.fail() if abs(feat['avg_eas_id'] - 168.142857142857) > 1e-12: feat.DumpReadable() pytest.fail() if feat['count_eas_id'] != 7: feat.DumpReadable() pytest.fail() if feat['sum_eas_id'] != 1177: feat.DumpReadable() pytest.fail() gdaltest.ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test simple COUNT() function. def test_ogr_sql_6(): expect = [10] sql_lyr = gdaltest.ds.ExecuteSQL('select count(*) from poly') tr = ogrtest.check_features_against_list(sql_lyr, 'count_*', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that selecting the FID works properly. def test_ogr_sql_7(): expect = [7, 8] sql_lyr = gdaltest.ds.ExecuteSQL('select eas_id, fid from poly where eas_id in (158,165)') tr = ogrtest.check_features_against_list(sql_lyr, 'fid', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that wildcard expansion works properly. def test_ogr_sql_8(): expect = ['35043369', '35043408'] sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where eas_id in (158,165)') tr = ogrtest.check_features_against_list(sql_lyr, 'PRFEDEA', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that quoted table names work. def test_ogr_sql_9(): expect = ['35043369', '35043408'] sql_lyr = gdaltest.ds.ExecuteSQL('select * from "poly" where eas_id in (158,165)') tr = ogrtest.check_features_against_list(sql_lyr, 'PRFEDEA', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test the ILIKE operator. def test_ogr_sql_10(): expect = [170] sql_lyr = gdaltest.ds.ExecuteSQL("select eas_id from poly where prfedea ilike '%413'") tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test MAX() on empty dataset. def test_ogr_sql_11(): expect = [None] sql_lyr = gdaltest.ds.ExecuteSQL("select max(eas_id) from empty") tr = ogrtest.check_features_against_list(sql_lyr, 'max_eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test DISTINCT on empty dataset. def test_ogr_sql_12(): expect = [] sql_lyr = gdaltest.ds.ExecuteSQL("select distinct eas_id from empty") tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify selection of, and on ogr_geometry. def test_ogr_sql_13(): expect = ['POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON', 'POLYGON'] sql_lyr = gdaltest.ds.ExecuteSQL("select ogr_geometry from poly where ogr_geometry = 'POLYGON'") tr = ogrtest.check_features_against_list(sql_lyr, 'ogr_geometry', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify selection of, and on ogr_style and ogr_geom_wkt. def test_ogr_sql_14(): expect = [ 'BRUSH(fc:#000000,bc:#ffffff,id:"mapinfo-brush-1,ogr-brush-1");PEN(w:1px,c:#000000,id:"mapinfo-pen-2,ogr-pen-0")', 'BRUSH(fc:#000000,bc:#ffffff,id:"mapinfo-brush-1,ogr-brush-1");PEN(w:1px,c:#000000,id:"mapinfo-pen-2,ogr-pen-0")'] ds = ogr.Open('data/small.mif') sql_lyr = ds.ExecuteSQL("select ogr_style from small where ogr_geom_wkt LIKE 'POLYGON%'") tr = ogrtest.check_features_against_list(sql_lyr, 'ogr_style', expect) ds.ReleaseResultSet(sql_lyr) ds = None assert tr ############################################################################### # Verify that selecting with filtering by FID works properly. def test_ogr_sql_15(): expect = [7] sql_lyr = gdaltest.ds.ExecuteSQL('select fid,eas_id,prfedea from poly where fid = %d' % expect[0]) tr = ogrtest.check_features_against_list(sql_lyr, 'fid', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### def test_ogr_sql_16(): expect = [2] ds = ogr.Open('data/small.mif') sql_lyr = ds.ExecuteSQL("select fid from small where owner < 'H'") tr = ogrtest.check_features_against_list(sql_lyr, 'fid', expect) ds.ReleaseResultSet(sql_lyr) ds = None assert tr ############################################################################### # Test the RFC 21 CAST operator. # def test_ogr_sql_17(): expect = ['1', '2'] ds = ogr.Open('data/small.mif') sql_lyr = ds.ExecuteSQL("select CAST(fid as CHARACTER(10)), CAST(data as numeric(7,3)) from small") fld_def = sql_lyr.GetLayerDefn().GetFieldDefn(0) assert fld_def.GetName() == 'fid', 'got wrong fid field name' if fld_def.GetType() != ogr.OFTString: gdaltest.post_reason('got wrong fid field type') print(fld_def.GetType()) if fld_def.GetWidth() != 10: gdaltest.post_reason('got wrong fid field width') print(fld_def.GetWidth()) fld_def = sql_lyr.GetLayerDefn().GetFieldDefn(1) assert fld_def.GetName() == 'data', 'got wrong data field name' if fld_def.GetType() != ogr.OFTReal: gdaltest.post_reason('got wrong data field type') print(fld_def.GetType()) if fld_def.GetWidth() != 7: gdaltest.post_reason('got wrong data field width') print(fld_def.GetWidth()) if fld_def.GetPrecision() != 3: gdaltest.post_reason('got wrong data field precision') print(fld_def.GetPrecision()) tr = ogrtest.check_features_against_list(sql_lyr, 'fid', expect) ds.ReleaseResultSet(sql_lyr) ds = None assert tr ############################################################################### # Test extended character set def test_ogr_sql_18(): if sys.version_info >= (3, 0, 0): pytest.skip() name = 'data/departs.vrt' ds = ogr.Open(name) assert ds is not None sql = 'select * from D\303\251parts' sql_lyr = ds.ExecuteSQL(sql) if sql_lyr is None: ds = None pytest.fail() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None ds.ReleaseResultSet(sql_lyr) # Test #2221 sql = 'select NOMd\303\251PART from D\303\251parts' sql_lyr = ds.ExecuteSQL(sql) if sql_lyr is None: ds = None pytest.fail() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test empty request string def test_ogr_sql_19(): gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL('') gdal.PopErrorHandler() assert sql_lyr is None ############################################################################### # Test query "SELECT * from my_layer" on layer without any field (#2788) def test_ogr_sql_20(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_lyr = mem_ds.CreateLayer("my_layer") feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 1)")) mem_lyr.CreateFeature(feat) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 3)")) mem_lyr.CreateFeature(feat) sql_lyr = mem_ds.ExecuteSQL("SELECT * from my_layer") assert sql_lyr.GetFeatureCount() == 2 mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### # Test query "SELECT *, fid from my_layer" on layer without any field (#2788) def test_ogr_sql_21(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_ds.CreateLayer("my_layer") sql_lyr = mem_ds.ExecuteSQL("SELECT *, fid from my_layer") assert sql_lyr.GetLayerDefn().GetFieldCount() == 1 assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'fid' mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### # Test multiple expansion of '*' as in "SELECT *, fid, *, my_layer.* from my_layer" (#2788) def test_ogr_sql_22(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_lyr = mem_ds.CreateLayer("my_layer") mem_lyr.CreateField(ogr.FieldDefn("test", ogr.OFTString)) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 1)")) mem_lyr.CreateFeature(feat) sql_lyr = mem_ds.ExecuteSQL("SELECT *, fid, *, my_layer.* from my_layer") assert sql_lyr.GetLayerDefn().GetFieldCount() == 4 assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'test' assert sql_lyr.GetLayerDefn().GetFieldDefn(1).GetName() == 'fid' assert sql_lyr.GetLayerDefn().GetFieldDefn(2).GetName() == 'test' assert sql_lyr.GetLayerDefn().GetFieldDefn(3).GetName() == 'my_layer.test' mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### # Test query "SELECT DISTINCT test from my_layer" (#2788) def test_ogr_sql_23(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_lyr = mem_ds.CreateLayer("my_layer") mem_lyr.CreateField(ogr.FieldDefn("test", ogr.OFTString)) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetField("test", 0) feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(0 1)")) mem_lyr.CreateFeature(feat) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetField("test", 1) feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT(2 3)")) mem_lyr.CreateFeature(feat) sql_lyr = mem_ds.ExecuteSQL("SELECT DISTINCT test from my_layer") assert sql_lyr.GetFeatureCount() == 2 mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### # Test that style strings get carried with OGR SQL SELECT results. (#2808) def test_ogr_sql_24(): result = 'success' ds = ogr.Open('data/smalltest.dgn') sql_layer = ds.ExecuteSQL('SELECT * from elements where colorindex=83 and type=3') feat = sql_layer.GetNextFeature() if len(feat.GetStyleString()) < 10: print(feat.GetStyleString()) gdaltest.post_reason('style string apparently not propagated to OGR SQL results.') result = 'fail' feat = None ds.ReleaseResultSet(sql_layer) ds = None return result ############################################################################### # Test for OGR_GEOM_AREA special field (#2949) def test_ogr_sql_25(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_lyr = mem_ds.CreateLayer("my_layer") mem_lyr.CreateField(ogr.FieldDefn("test", ogr.OFTString)) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetField("test", 0) feat.SetGeometry(ogr.CreateGeometryFromWkt("POLYGON((0 0,0 1,1 1,1 0,0 0))")) mem_lyr.CreateFeature(feat) feat = ogr.Feature(mem_lyr.GetLayerDefn()) feat.SetField("test", 1) feat.SetGeometry(ogr.CreateGeometryFromWkt("POLYGON((0 0,0 0.5,0.5 0.5,0.5 0,0 0))")) mem_lyr.CreateFeature(feat) sql_lyr = mem_ds.ExecuteSQL("SELECT test, OGR_GEOM_AREA from my_layer WHERE OGR_GEOM_AREA > 0.9") assert sql_lyr.GetFeatureCount() == 1 feat = sql_lyr.GetNextFeature() assert feat.GetFieldAsDouble('OGR_GEOM_AREA') == 1.0 assert feat.GetFieldAsString('test') == '0' mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### # Test query 'SELECT 'literal_value' AS column_name FROM a_table' # def test_ogr_sql_26(): mem_ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") mem_lyr = mem_ds.CreateLayer("my_layer") feat = ogr.Feature(mem_lyr.GetLayerDefn()) mem_lyr.CreateFeature(feat) sql_lyr = mem_ds.ExecuteSQL("SELECT 'literal_value' AS my_column, 'literal_value2' my_column2 FROM my_layer") assert sql_lyr.GetFeatureCount() == 1 feat = sql_lyr.GetNextFeature() assert feat.GetFieldAsString('my_column') == 'literal_value' assert feat.GetFieldAsString('my_column2') == 'literal_value2' mem_ds.ReleaseResultSet(sql_lyr) mem_ds = None ############################################################################### ############################################################################### # Test query on datetime columns # def test_ogr_sql_27(): ds = ogr.Open('data/testdatetime.csv') sql_lyr = ds.ExecuteSQL("SELECT * FROM testdatetime WHERE " "timestamp < '2010/04/01 00:00:00' AND " "timestamp > '2009/11/15 11:59:59' AND " "timestamp != '2009/12/31 23:00:00' " "ORDER BY timestamp DESC") tr = ogrtest.check_features_against_list(sql_lyr, 'name', ['foo5', 'foo4']) ds.ReleaseResultSet(sql_lyr) ds = None assert tr ############################################################################### # Test robustness against invalid SQL statements. # With RFC 28 new implementation, most of them are directly caught by the generated # code from the grammar def test_ogr_sql_28(): ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") lyr = ds.CreateLayer("my_layer") lyr.GetLayerDefn().GetGeomFieldDefn(0).SetName('geom') # a bit border line but OK for Memory driver... field_defn = ogr.FieldDefn("strfield", ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn("intfield", ogr.OFTInteger) lyr.CreateField(field_defn) lyr = ds.CreateLayer("my_layer2") field_defn = ogr.FieldDefn("strfield", ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn("strfield2", ogr.OFTString) lyr.CreateField(field_defn) with pytest.raises(Exception): sql_lyr = ds.ExecuteSQL(None) pytest.fail('expected exception on NULL query') queries = [ '', '1', '*', 'SELECT', "SELECT ' FROM my_layer", 'SELECT + FROM my_layer', 'SELECT (1 FROM my_layer', 'SELECT (1)) FROM my_layer', 'SELECT (1,) FROM my_layer', 'SELECT 1 + FROM my_layer', "SELECT 1 + 'a' FROM my_layer", 'SELECT 1 - FROM my_layer', 'SELECT 1 * FROM my_layer', 'SELECT 1 % FROM my_layer', 'SELECT *', 'SELECT * FROM', 'SELECT * FROM foo', 'SELECT FROM my_layer', 'SELECT FROM FROM my_layer', "SELECT ('strfield'", "SELECT 'strfield' +", "SELECT 'strfield' 'strfield'", "SELECT CONCAT('strfield')", 'SELECT foo(strfield) FROM my_layer', # Undefined function 'foo' used. 'SELECT strfield, FROM my_layer', 'SELECT strfield, foo FROM my_layer', 'SELECT strfield AS FROM my_layer', 'SELECT strfield AS 1 FROM my_layer', 'SELECT strfield AS strfield2 FROM', 'SELECT strfield + intfield FROM my_layer', 'SELECT CAST', 'SELECT CAST(', 'SELECT CAST(strfield', 'SELECT CAST(strfield AS', 'SELECT CAST(strfield AS foo', 'SELECT CAST(strfield AS foo)', 'SELECT CAST(strfield AS foo) FROM', 'SELECT CAST(strfield AS foo) FROM my_layer', 'SELECT CAST(strfield AS CHARACTER', 'SELECT CAST(strfield AS CHARACTER)', 'SELECT CAST(strfield AS CHARACTER) FROM', 'SELECT CAST(strfield AS CHARACTER) FROM foo', 'SELECT CAST(strfield AS CHARACTER(', 'SELECT CAST(strfield AS CHARACTER(2', 'SELECT CAST(strfield AS CHARACTER(2)', 'SELECT CAST(strfield AS CHARACTER(2))', 'SELECT CAST(strfield AS CHARACTER(2)) FROM', 'SELECT CAST(strfield AS CHARACTER(2)) FROM foo', 'SELECT CAST(strfield AS 1) FROM my_layer', 'SELECT * FROM my_layer WHERE', # 'SELECT * FROM my_layer WHERE strfield', 'SELECT * FROM my_layer WHERE strfield = ', 'SELECT * FROM my_layer WHERE strfield = foo', "SELECT * FROM my_layer WHERE foo = 'a'", "SELECT * FROM my_layer WHERE strfield = 'a" "SELECT * FROM my_layer WHERE strfield = 'a' ORDER ", "SELECT * FROM my_layer WHERE strfield = 'a' ORDER BY", "SELECT * FROM my_layer WHERE strfield = 'a' ORDER BY foo", "SELECT * FROM my_layer WHERE strfield = 'a' ORDER BY strfield UNK", "SELECT * FROM my_layer ORDER BY geom", # Cannot use geometry field 'geom' in a ORDER BY clause "SELECT FOO(*) FROM my_layer", "SELECT FOO(*) AS bar FROM my_layer", "SELECT COUNT", "SELECT COUNT(", "SELECT COUNT() FROM my_layer", "SELECT COUNT(*", "SELECT COUNT(*)", "SELECT COUNT(*) FROM", "SELECT COUNT(*) AS foo FROM", "SELECT COUNT(* FROM my_layer", "SELECT COUNT(FOO intfield) FROM my_layer", "SELECT COUNT(DISTINCT intfield FROM my_layer", "SELECT COUNT(DISTINCT *) FROM my_layer", "SELECT FOO(DISTINCT intfield) FROM my_layer", "SELECT FOO(DISTINCT intfield) as foo FROM my_layer", "SELECT DISTINCT foo FROM my_layer", "SELECT DISTINCT foo AS 'id' 'id2' FROM", "SELECT DISTINCT foo AS id id2 FROM", "SELECT DISTINCT FROM my_layer", "SELECT DISTINCT strfield, COUNT(DISTINCT intfield) FROM my_layer", "SELECT MIN(intfield*2) FROM my_layer", "SELECT MIN(intfield,2) FROM my_layer", "SELECT MIN(foo) FROM my_layer", "SELECT MAX(foo) FROM my_layer", "SELECT SUM(foo) FROM my_layer", "SELECT AVG(foo) FROM my_layer", "SELECT MIN(strfield) FROM my_layer", "SELECT MAX(strfield) FROM my_layer", "SELECT SUM(strfield) FROM my_layer", "SELECT AVG(strfield) FROM my_layer", "SELECT AVG(intfield, intfield) FROM my_layer", "SELECT * FROM my_layer WHERE AVG(intfield) = 1", "SELECT * FROM 'foo' foo", "SELECT * FROM my_layer WHERE strfield =", "SELECT * FROM my_layer WHERE strfield = foo", "SELECT * FROM my_layer WHERE strfield = intfield", "SELECT * FROM my_layer WHERE strfield = 1", "SELECT * FROM my_layer WHERE strfield = '1' AND", # "SELECT * FROM my_layer WHERE 1 AND 2" , "SELECT * FROM my_layer WHERE strfield LIKE", "SELECT * FROM my_layer WHERE strfield LIKE 1", "SELECT * FROM my_layer WHERE strfield IS", "SELECT * FROM my_layer WHERE strfield IS NOT", "SELECT * FROM my_layer WHERE strfield IS foo", "SELECT * FROM my_layer WHERE strfield IS NOT foo", "SELECT * FROM my_layer WHERE (strfield IS NOT NULL", "SELECT * FROM my_layer WHERE strfield IN", "SELECT * FROM my_layer WHERE strfield IN(", "SELECT * FROM my_layer WHERE strfield IN()", "SELECT * FROM my_layer WHERE strfield IN('a'", "SELECT * FROM my_layer WHERE strfield IN('a',", "SELECT * FROM my_layer WHERE strfield IN('a','b'", "SELECT * FROM my_layer WHERE strfield IN('a','b'))", "SELECT * FROM my_layer LEFT", "SELECT * FROM my_layer LEFT JOIN", "SELECT * FROM my_layer LEFT JOIN foo", "SELECT * FROM my_layer LEFT JOIN foo ON my_layer.strfield = my_layer2.strfield", "SELECT * FROM my_layer LEFT JOIN my_layer2 ON my_layer.strfield = foo.strfield", "SELECT * FROM my_layer LEFT JOIN my_layer2 ON my_layer.strfield = my_layer2.foo", # "SELECT * FROM my_layer LEFT JOIN my_layer2 ON my_layer.strfield != my_layer2.strfield", "SELECT *, my_layer2. FROM my_layer LEFT JOIN my_layer2 ON my_layer.strfield = my_layer2.strfield", "SELECT *, my_layer2.foo FROM my_layer LEFT JOIN my_layer2 ON my_layer.strfield = my_layer2.strfield", "SELECT * FROM my_layer UNION", "SELECT * FROM my_layer UNION ALL", "SELECT * FROM my_layer UNION ALL SELECT", "SELECT * FROM my_layer UNION ALL SELECT *", "SELECT * FROM my_layer UNION ALL SELECT * FROM", ] for query in queries: gdal.ErrorReset() # print query gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = ds.ExecuteSQL(query) gdal.PopErrorHandler() if sql_lyr is not None: ds.ReleaseResultSet(sql_lyr) pytest.fail('expected None result on "%s"' % query) assert gdal.GetLastErrorType() != 0, ('expected error on "%s"' % query) ds = None ############################################################################### # Verify that IS NULL and IS NOT NULL are working def test_ogr_sql_29(): ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") lyr = ds.CreateLayer("my_layer") field_defn = ogr.FieldDefn("strfield", ogr.OFTString) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'a') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'b') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) sql_lyr = ds.ExecuteSQL('select * from my_layer where strfield is null') count_is_null = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('select * from my_layer where strfield is not null') count_is_not_null = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds = None assert count_is_null == 1, 'IS NULL failed' assert count_is_not_null == 2, 'IS NOT NULL failed' ############################################################################### # Verify a select mixing a count(*) with something else works without errors def test_ogr_sql_30(): gdal.ErrorReset() sql_lyr = gdaltest.ds.ExecuteSQL('select min(eas_id), count(*) from poly') feat = sql_lyr.GetNextFeature() val_count = feat.GetField(1) gdaltest.ds.ReleaseResultSet(sql_lyr) assert gdal.GetLastErrorMsg() == '' assert val_count == 10 ############################################################################### # Regression test for #4022 def test_ogr_sql_31(): gdal.ErrorReset() sql_lyr = gdaltest.ds.ExecuteSQL('select min(eas_id) from poly where area = 0') feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.ds.ReleaseResultSet(sql_lyr) assert gdal.GetLastErrorMsg() == '' assert val is None ############################################################################### # Regression test for #4022 (same as above, but with dialect = 'OGRSQL') def test_ogr_sql_32(): gdal.ErrorReset() sql_lyr = gdaltest.ds.ExecuteSQL('select min(eas_id) from poly where area = 0', dialect='OGRSQL') feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.ds.ReleaseResultSet(sql_lyr) assert gdal.GetLastErrorMsg() == '' assert val is None ############################################################################### # Check ALTER TABLE commands def test_ogr_sql_33(): ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") lyr = ds.CreateLayer("my_layer") # We support with and without COLUMN keyword for extrakeyword in ('COLUMN ', ''): sql = 'ALTER TABLE my_layer ADD %smyfield NUMERIC(20, 8)' % extrakeyword ds.ExecuteSQL(sql) assert (lyr.GetLayerDefn().GetFieldIndex('myfield') != -1 and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('myfield')).GetType() == ogr.OFTReal and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('myfield')).GetWidth() == 20 and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('myfield')).GetPrecision() == 8), \ ('%s failed' % sql) sql = 'ALTER TABLE my_layer RENAME %smyfield TO "myfield 2"' % extrakeyword ds.ExecuteSQL(sql) assert (lyr.GetLayerDefn().GetFieldIndex('myfield') == -1 and \ lyr.GetLayerDefn().GetFieldIndex('myfield 2') != -1), \ ('%s failed' % sql) sql = 'ALTER TABLE my_layer ALTER %s"myfield 2" TYPE CHARACTER' % extrakeyword ds.ExecuteSQL(sql) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('myfield 2')).GetType() == ogr.OFTString, \ ('%s failed' % sql) sql = 'ALTER TABLE my_layer ALTER %s"myfield 2" TYPE CHARACTER(15)' % extrakeyword ds.ExecuteSQL(sql) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('myfield 2')).GetWidth() == 15, \ ('%s failed' % sql) sql = 'ALTER TABLE my_layer DROP %s"myfield 2"' % extrakeyword ds.ExecuteSQL(sql) assert lyr.GetLayerDefn().GetFieldIndex('myfield 2') == -1, ('%s failed' % sql) ds = None ############################################################################### # Test implicit conversion from string to numeric (#4259) def test_ogr_sql_34(): sql_lyr = gdaltest.ds.ExecuteSQL("select count(*) from poly where eas_id in ('165')") feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.ds.ReleaseResultSet(sql_lyr) assert val == 1 gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL("select count(*) from poly where eas_id in ('a165')") gdal.PopErrorHandler() assert sql_lyr is None ############################################################################### # Test huge SQL queries (#4262) def test_ogr_sql_35(): cols = "area" for _ in range(10): cols = cols + "," + cols sql_lyr = gdaltest.ds.ExecuteSQL("select %s from poly" % cols) count_cols = sql_lyr.GetLayerDefn().GetFieldCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count_cols == 1024 ############################################################################### # Test select distinct on null values (#4353) def test_ogr_sql_36(): ds = ogr.GetDriverByName('Memory').CreateDataSource('ogr_sql_36') lyr = ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('floatfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int64field', ogr.OFTInteger64)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(1, 2.3) feat.SetField(2, "456") feat.SetField(3, 1234567890123) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None for fieldname in ['intfield', 'int64field', 'floatfield', 'strfield']: sql_lyr = ds.ExecuteSQL("select distinct %s from layer order by %s asc" % (fieldname, fieldname)) feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) != 0: feat.DumpReadable() pytest.fail('field %s' % fieldname) feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) == 0: feat.DumpReadable() pytest.fail('field %s' % fieldname) ds.ReleaseResultSet(sql_lyr) for fieldname in ['intfield', 'int64field', 'floatfield', 'strfield']: sql_lyr = ds.ExecuteSQL("select distinct %s from layer order by %s desc" % (fieldname, fieldname)) feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) == 0: feat.DumpReadable() pytest.fail('field %s' % fieldname) feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) != 0: feat.DumpReadable() pytest.fail('field %s' % fieldname) ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test select count([distinct] column) with null values (#4354) def test_ogr_sql_37(): ds = ogr.GetDriverByName('Memory').CreateDataSource('ogr_sql_37') lyr = ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('floatfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('strfield_first_null', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('strfield_never_set', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('intfield_never_set', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(2, "456") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(2, "456") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(1, 2.3) feat.SetField('strfield_first_null', "foo") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(1, 2.3) lyr.CreateFeature(feat) feat = None for fieldname in ['intfield', 'floatfield', 'strfield']: sql_lyr = ds.ExecuteSQL("select count(%s), count(distinct %s), count(*) from layer" % (fieldname, fieldname)) feat = sql_lyr.GetNextFeature() if feat.GetFieldAsInteger(0) != 2: feat.DumpReadable() pytest.fail('field %s' % fieldname) if feat.GetFieldAsInteger(1) != 1: feat.DumpReadable() pytest.fail('field %s' % fieldname) if feat.GetFieldAsInteger(2) != 4: feat.DumpReadable() pytest.fail('field %s' % fieldname) ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("select avg(intfield) from layer where intfield is null") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) != 0: feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # Fix crash when first values is null (#4509) sql_lyr = ds.ExecuteSQL("select distinct strfield_first_null from layer") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull('strfield_first_null'): feat.DumpReadable() pytest.fail() feat = sql_lyr.GetNextFeature() if feat.GetFieldAsString('strfield_first_null') != 'foo': feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("select distinct strfield_never_set from layer") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull('strfield_never_set'): feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("select min(intfield_never_set), max(intfield_never_set), avg(intfield_never_set), sum(intfield_never_set), count(intfield_never_set) from layer") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0) or feat.IsFieldSetAndNotNull(1) or feat.IsFieldSetAndNotNull(2) or feat.IsFieldSetAndNotNull(3) or feat.GetField(4) != 0: feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test "SELECT MAX(OGR_GEOM_AREA) FROM XXXX" (#4633) def test_ogr_sql_38(): sql_lyr = gdaltest.ds.ExecuteSQL("SELECT MAX(OGR_GEOM_AREA) FROM poly") feat = sql_lyr.GetNextFeature() val = feat.GetFieldAsDouble(0) gdaltest.ds.ReleaseResultSet(sql_lyr) if abs(val - 1634833.39062) < 1e-5: return pytest.fail(val) ############################################################################### # Test ORDER BY on a float special field def test_ogr_sql_39(): sql_lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM poly ORDER BY OGR_GEOM_AREA") feat = sql_lyr.GetNextFeature() val = feat.GetFieldAsDouble(0) gdaltest.ds.ReleaseResultSet(sql_lyr) if abs(val - 5268.813) < 1e-5: return pytest.fail(val) ############################################################################### # Test ORDER BY on a int special field def test_ogr_sql_40(): sql_lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM poly ORDER BY FID DESC") feat = sql_lyr.GetNextFeature() gdaltest.ds.ReleaseResultSet(sql_lyr) assert feat.GetFID() == 9 ############################################################################### # Test ORDER BY on a string special field def test_ogr_sql_41(): sql_lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM poly ORDER BY OGR_GEOMETRY") feat = sql_lyr.GetNextFeature() gdaltest.ds.ReleaseResultSet(sql_lyr) assert feat.GetFID() == 0 ############################################################################### # Test comparing to empty string def test_ogr_sql_42(): lyr = gdaltest.ds.GetLayerByName('poly') lyr.SetAttributeFilter("prfedea <> ''") feat = lyr.GetNextFeature() lyr.SetAttributeFilter(None) assert feat is not None sql_lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM poly WHERE prfedea <> ''") feat = sql_lyr.GetNextFeature() gdaltest.ds.ReleaseResultSet(sql_lyr) assert feat is not None ############################################################################### # Test escape sequences def test_ogr_sql_43(): ret = 'success' sql = "SELECT '\"' as a, '\\\'' as b, '\'\'' as c FROM poly" sql_lyr = gdaltest.ds.ExecuteSQL(sql) feat = sql_lyr.GetNextFeature() if feat['a'] != '"' or feat['b'] != '\'' or feat['c'] != '\'': ret = 'fail' gdaltest.ds.ReleaseResultSet(sql_lyr) return ret ############################################################################### # Test hstore_get_value() def test_ogr_sql_44(): # Invalid parameters for sql in ["SELECT hstore_get_value('a') FROM poly", "SELECT hstore_get_value(1, 1) FROM poly"]: gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL(sql) gdal.PopErrorHandler() assert sql_lyr is None, sql # Invalid hstore syntax or empty result for sql in ["SELECT hstore_get_value('a', null) FROM poly", "SELECT hstore_get_value(null, 'a') FROM poly", "SELECT hstore_get_value('a', 'a') FROM poly", "SELECT hstore_get_value('a=>b', 'c') FROM poly", "SELECT hstore_get_value('a=>', 'a') FROM poly", "SELECT hstore_get_value(' a => ', 'a') FROM poly", "SELECT hstore_get_value('a=>b,z,c=>d', 'c') FROM poly", "SELECT hstore_get_value('\"a', 'a') FROM poly", "SELECT hstore_get_value('\"a\"', 'a') FROM poly", "SELECT hstore_get_value('\"a\"=', 'a') FROM poly", "SELECT hstore_get_value('\"a\" =>', 'a') FROM poly", "SELECT hstore_get_value('\"a\" => ', 'a') FROM poly", "SELECT hstore_get_value('\"a\" => \"', 'a') FROM poly", "SELECT hstore_get_value('\"a\" => \"\" z', 'a') FROM poly"]: sql_lyr = gdaltest.ds.ExecuteSQL(sql) f = sql_lyr.GetNextFeature() if f.IsFieldSetAndNotNull(0): f.DumpReadable() pytest.fail(sql) gdaltest.ds.ReleaseResultSet(sql_lyr) # Valid hstore syntax for (sql, expected) in [("SELECT hstore_get_value('a=>b', 'a') FROM poly", 'b'), ("SELECT hstore_get_value(' a => b ', 'a') FROM poly", 'b'), ("SELECT hstore_get_value('\"a\"=>b', 'a') FROM poly", 'b'), ("SELECT hstore_get_value(' \"a\" =>b', 'a') FROM poly", 'b'), ("SELECT hstore_get_value('a=>\"b\"', 'a') FROM poly", 'b'), ("SELECT hstore_get_value('a=> \"b\" ', 'a') FROM poly", 'b'), ("SELECT hstore_get_value('\"a\"=>\"b\"', 'a') FROM poly", 'b'), ("SELECT hstore_get_value(' \"a\" => \"b\" ', 'a') FROM poly", 'b'), ("SELECT hstore_get_value(' \"a\\\"b\" => \"b\" ', 'a\"b') FROM poly", 'b')]: sql_lyr = gdaltest.ds.ExecuteSQL(sql) f = sql_lyr.GetNextFeature() if f.GetField(0) != expected: f.DumpReadable() pytest.fail(sql) gdaltest.ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test 64 bit GetFeatureCount() def test_ogr_sql_45(): ds = ogr.Open(""" data/poly.shp poly wkbPolygon 1000000000000 """) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1000000000000 sql_lyr = ds.ExecuteSQL('SELECT COUNT(*) FROM poly') f = sql_lyr.GetNextFeature() assert f.GetField(0) == 1000000000000 f = None ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT COUNT(AREA) FROM poly') assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger f = sql_lyr.GetNextFeature() assert f.GetField(0) == 10 f = None ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test strict SQL quoting def test_ogr_sql_46(): ds = ogr.GetDriverByName('Memory').CreateDataSource('test') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('from', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(1, "not_from") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 3) feat.SetField(1, "from") lyr.CreateFeature(feat) feat = None sql_lyr = ds.ExecuteSQL("select id, 'id', \"id\" as id2, id as \"id3\", \"from\" from test where \"from\" = 'from'") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 3 or feat.GetField(1) != 'id' or feat.GetField(2) != 3 or feat.GetField(3) != 3 or feat.GetField(4) != 'from': feat.DumpReadable() pytest.fail() feat = sql_lyr.GetNextFeature() assert feat is None ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("select max(\"id\"), max(id), count(\"id\"), count(id) from \"test\"") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 3 or feat.GetField(1) != 3 or feat.GetField(2) != 2 or feat.GetField(3) != 2: feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # Not accepted gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("select * from 'test'") gdal.PopErrorHandler() assert sql_lyr is None # Not accepted gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("select distinct 'id' from 'test'") gdal.PopErrorHandler() assert sql_lyr is None # Not accepted gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("select max('id') from 'test'") gdal.PopErrorHandler() assert sql_lyr is None # Not accepted gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("select id as 'id2' from 'test'") gdal.PopErrorHandler() assert sql_lyr is None ############################################################################### # Test NULL sorting (#6155) def test_ogr_sql_47(): ds = ogr.Open('data/sort_test.dbf') sql_lyr = ds.ExecuteSQL('SELECT * FROM sort_test ORDER BY text_value') prec_val = '' for f in sql_lyr: if f.IsFieldSetAndNotNull('text_value'): new_val = f['text_value'] else: new_val = '' assert new_val >= prec_val, ("new_val = '%s', prec_val = '%s'" % (new_val, prec_val)) prec_val = new_val ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test sorting of more than 100 elements def test_ogr_sql_48(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('int_field', ogr.OFTInteger)) for i in range(1000): f = ogr.Feature(lyr.GetLayerDefn()) if (i % 2) == 0: f.SetField(0, i + 1) else: f.SetField(0, 1001 - i) lyr.CreateFeature(f) sql_lyr = ds.ExecuteSQL('SELECT * FROM test ORDER BY int_field') i = 1 for f in sql_lyr: if f['int_field'] != i: f.DumpReadable() pytest.fail() i = i + 1 ds.ReleaseResultSet(sql_lyr) assert i == 1001 def test_ogr_sql_cleanup(): gdaltest.lyr = None gdaltest.ds = None gdalautotest-3.0.4/ogr/ogr_s57.py0000755003401500001440000003637213614005325016273 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_s57.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR S-57 driver functionality. # 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. ############################################################################### import os import sys import shutil import gdaltest import ogrtest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Verify we can open the test file. def test_ogr_s57_1(): gdaltest.s57_ds = None # Clear S57 options if set or our results will be messed up. if gdal.GetConfigOption('OGR_S57_OPTIONS', '') != '': gdal.SetConfigOption('OGR_S57_OPTIONS', '') gdaltest.s57_ds = ogr.Open('data/1B5X02NE.000') assert gdaltest.s57_ds is not None, 'failed to open test file.' ############################################################################### # Verify we have the set of expected layers and that some rough information # matches our expectations. def test_ogr_s57_2(): if gdaltest.s57_ds is None: pytest.skip() layer_list = [('DSID', ogr.wkbNone, 1), ('COALNE', ogr.wkbUnknown, 1), ('DEPARE', ogr.wkbUnknown, 4), ('DEPCNT', ogr.wkbUnknown, 4), ('LNDARE', ogr.wkbUnknown, 1), ('LNDELV', ogr.wkbUnknown, 2), ('SBDARE', ogr.wkbUnknown, 2), ('SLCONS', ogr.wkbUnknown, 1), ('SLOTOP', ogr.wkbUnknown, 1), ('SOUNDG', ogr.wkbMultiPoint25D, 2), ('M_COVR', ogr.wkbPolygon, 1), ('M_NSYS', ogr.wkbPolygon, 1), ('M_QUAL', ogr.wkbPolygon, 1)] assert gdaltest.s57_ds.GetLayerCount() == len(layer_list), \ 'Did not get expected number of layers, likely cannot find support files.' for i, lyr_info in enumerate(layer_list): lyr = gdaltest.s57_ds.GetLayer(i) assert lyr.GetName() == lyr_info[0], \ ('Expected layer %d to be %s but it was %s.' % (i + 1, lyr_info[0], lyr.GetName())) count = lyr.GetFeatureCount(force=1) assert count == lyr_info[2], \ ('Expected %d features in layer %s, but got %d.' % (lyr_info[2], lyr_info[0], count)) assert lyr.GetLayerDefn().GetGeomType() == lyr_info[1], \ ('Expected %d layer type in layer %s, but got %d.' % (lyr_info[1], lyr_info[0], lyr.GetLayerDefn().GetGeomType())) ############################################################################### # Check the COALNE feature. def test_ogr_s57_3(): if gdaltest.s57_ds is None: pytest.skip() feat = gdaltest.s57_ds.GetLayerByName('COALNE').GetNextFeature() assert feat is not None, 'Did not get expected COALNE feature at all.' assert feat.GetField('RCID') == 1 and feat.GetField('LNAM') == 'FFFF7F4F0FB002D3' and feat.GetField('OBJL') == 30 and feat.GetField('AGEN') == 65535, \ 'COALNE: did not get expected attributes' wkt = 'LINESTRING (60.97683400 -32.49442600,60.97718200 -32.49453800,60.97742400 -32.49477400,60.97774800 -32.49504000,60.97791600 -32.49547200,60.97793000 -32.49581800,60.97794400 -32.49617800,60.97804400 -32.49647600,60.97800200 -32.49703800,60.97800200 -32.49726600,60.97805800 -32.49749400,60.97812800 -32.49773200,60.97827000 -32.49794800,60.97910200 -32.49848600,60.97942600 -32.49866600)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Check the M_QUAL feature. def test_ogr_s57_4(): if gdaltest.s57_ds is None: pytest.skip() feat = gdaltest.s57_ds.GetLayerByName('M_QUAL').GetNextFeature() assert feat is not None, 'Did not get expected M_QUAL feature at all.' assert feat.GetField('RCID') == 15 and feat.GetField('OBJL') == 308 and feat.GetField('AGEN') == 65535, \ 'M_QUAL: did not get expected attributes' wkt = 'POLYGON ((60.97683400 -32.49534000,60.97683400 -32.49762000,60.97683400 -32.49866600,60.97869000 -32.49866600,60.97942600 -32.49866600,60.98215200 -32.49866600,60.98316600 -32.49866600,60.98316600 -32.49755800,60.98316600 -32.49477000,60.98316600 -32.49350000,60.98146800 -32.49350000,60.98029800 -32.49350000,60.97947400 -32.49350000,60.97901600 -32.49350000,60.97683400 -32.49350000,60.97683400 -32.49442600,60.97683400 -32.49469800,60.97683400 -32.49534000))' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Check the SOUNDG feature. def test_ogr_s57_5(): if gdaltest.s57_ds is None: pytest.skip() feat = gdaltest.s57_ds.GetLayerByName('SOUNDG').GetNextFeature() assert feat is not None, 'Did not get expected SOUNDG feature at all.' assert feat.GetField('RCID') == 20 and feat.GetField('OBJL') == 129 and feat.GetField('AGEN') == 65535, \ 'SOUNDG: did not get expected attributes' wkt = 'MULTIPOINT (60.98164400 -32.49449000 3.400,60.98134400 -32.49642400 1.400,60.97814200 -32.49487400 -3.200,60.98071200 -32.49519600 1.200)' assert not ogrtest.check_feature_geometry(feat, wkt) gdaltest.s57_ds = None ############################################################################### # Test reading features from dataset with some double byte attributes. (#1526) def test_ogr_s57_6(): ds = ogr.Open('data/bug1526.000') feat = ds.GetLayerByName('FOGSIG').GetNextFeature() assert feat is not None, 'Did not get expected FOGSIG feature at all.' assert feat.GetField('INFORM') == 'During South winds nautophone is not always heard in S direction from lighthouse' and len(feat.GetField('NINFOM')) >= 1, \ 'FOGSIG: did not get expected attributes' ############################################################################### # Test handling of a dataset with a multilinestring feature (#2147). def test_ogr_s57_7(): ds = ogr.Open('data/bug2147_3R7D0889.000') feat = ds.GetLayerByName('ROADWY').GetNextFeature() assert feat is not None, 'Did not get expected feature at all.' exp_wkt = 'MULTILINESTRING ((22.5659615 44.5541942,22.5652045 44.5531651,22.5654315 44.5517774,22.5663008 44.5510096,22.5656187 44.5500822,22.5654462 44.5495941,22.5637522 44.5486793,22.563408 44.5477286,22.5654087 44.5471198,22.5670327 44.5463937,22.5667729 44.5456512,22.5657613 44.544027,22.5636273 44.5411638,22.5623421 44.5400398,22.559403 44.5367489,22.5579112 44.534544,22.5566466 44.5309514,22.5563888 44.5295231,22.5549946 44.5285915,22.5541939 44.5259331,22.5526434 44.5237888),(22.5656187 44.5500822,22.5670219 44.5493519,22.5684077 44.5491452),(22.5350702 44.4918838,22.5329111 44.4935825,22.5318719 44.4964337,22.5249608 44.5027089,22.5254709 44.5031914,22.5295138 44.5052214,22.5331359 44.5077711,22.5362468 44.5092751,22.5408091 44.5115306,22.5441312 44.5127374,22.5461053 44.5132675,22.5465694 44.5149956),(22.5094658 44.4989464,22.5105135 44.4992481,22.5158217 44.4994216,22.5206067 44.4998907,22.523096 44.5009452,22.5249608 44.5027089),(22.5762962 44.4645734,22.5767653 44.4773213,22.5769802 44.4796618,22.5775485 44.4815858,22.5762434 44.4842544,22.5765836 44.4855091,22.5775087 44.4865991,22.5769145 44.4879336,22.5708196 44.4910838,22.5694028 44.4930833,22.5692354 44.4958977),(22.5763768 44.5029527,22.5799605 44.501315,22.5831172 44.5007428,22.584524 44.4999964,22.5848604 44.4999039),(22.5731362 44.5129105,22.5801378 44.5261859,22.5825748 44.5301187),(22.5093748 44.5311182,22.5107969 44.5285258,22.5108905 44.5267978,22.5076679 44.5223309))' assert not ogrtest.check_feature_geometry(feat, exp_wkt) ############################################################################### # Run test_ogrsf def test_ogr_s57_8(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/1B5X02NE.000') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test S57 to S57 conversion def test_ogr_s57_9(): gdal.Unlink('tmp/ogr_s57_9.000') gdal.SetConfigOption('OGR_S57_OPTIONS', 'RETURN_PRIMITIVES=ON,RETURN_LINKAGES=ON,LNAM_REFS=ON') ds = ogr.GetDriverByName('S57').CreateDataSource('tmp/ogr_s57_9.000') src_ds = ogr.Open('data/1B5X02NE.000') gdal.SetConfigOption('OGR_S57_OPTIONS', None) for src_lyr in src_ds: if src_lyr.GetName() == 'DSID': continue lyr = ds.GetLayerByName(src_lyr.GetName()) for src_feat in src_lyr: feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFrom(src_feat) lyr.CreateFeature(feat) src_ds = None ds = None ds = ogr.Open('tmp/ogr_s57_9.000') assert ds is not None gdaltest.s57_ds = ds test_ogr_s57_2() test_ogr_s57_3() test_ogr_s57_4() test_ogr_s57_5() gdaltest.s57_ds = None gdal.Unlink('tmp/ogr_s57_9.000') gdal.SetConfigOption('OGR_S57_OPTIONS', 'RETURN_PRIMITIVES=ON,RETURN_LINKAGES=ON,LNAM_REFS=ON') gdal.VectorTranslate('tmp/ogr_s57_9.000', 'data/1B5X02NE.000', options="-f S57 IsolatedNode ConnectedNode Edge Face M_QUAL") gdal.SetConfigOption('OGR_S57_OPTIONS', None) ds = gdal.OpenEx('tmp/ogr_s57_9.000', open_options=['RETURN_PRIMITIVES=ON']) assert ds is not None assert ds.GetLayerByName('IsolatedNode') is not None gdaltest.s57_ds = ds test_ogr_s57_4() gdaltest.s57_ds = None gdal.Unlink('tmp/ogr_s57_9.000') ############################################################################### # Test opening a fake very small S57 file def test_ogr_s57_10(): ds = ogr.Open('data/fake_s57.000') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['DSID_EXPP'] == 2 ############################################################################### # Test opening a fake very small S57 file with ISO8211 record with zero length, # using variant (C.1.5.1) logic. def test_ogr_s57_11(): ds = ogr.Open('data/fake_s57_variant_C151.000') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['DSID_EXPP'] == 2 ############################################################################### # Test decoding of Dutch inland ENCs (#3881). def test_ogr_s57_online_1(): if not gdaltest.download_file('ftp://sdg.ivs90.nl/ENC/1R5MK050.000', '1R5MK050.000'): pytest.skip() ds = ogr.Open('tmp/cache/1R5MK050.000') assert ds is not None lyr = ds.GetLayerByName('BUISGL') feat = lyr.GetNextFeature() assert feat is not None, 'Did not get expected feature at all.' exp_wkt = 'POLYGON ((5.6666667 53.0279027,5.6666667 53.0281667,5.6667012 53.0281685,5.666673 53.0282377,5.666788 53.0282616,5.6669018 53.0281507,5.6668145 53.0281138,5.6668121 53.0280649,5.6666686 53.0280248,5.6666713 53.0279647,5.6667572 53.0279713,5.6667568 53.0279089,5.6666667 53.0279027))' assert not ogrtest.check_feature_geometry(feat, exp_wkt) feat = None ds = None ############################################################################### # Test with ENC 3.0 TDS - tile without updates. def test_ogr_s57_online_2(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/s57/enctds/GB5X01SW.000', 'GB5X01SW.000'): pytest.skip() gdaltest.clean_tmp() shutil.copy('tmp/cache/GB5X01SW.000', 'tmp/GB5X01SW.000') ds = ogr.Open('tmp/GB5X01SW.000') assert ds is not None lyr = ds.GetLayerByName('LIGHTS') feat = lyr.GetFeature(542) assert feat is not None, 'Did not get expected feature at all.' assert feat.rver == 1, ('Did not get expected RVER value (%d).' % feat.rver) lyr = ds.GetLayerByName('BOYCAR') feat = lyr.GetFeature(975) assert feat is None, 'unexpected got feature id 975 before update!' feat = None ds = None ############################################################################### # Test with ENC 3.0 TDS - tile with updates. def test_ogr_s57_online_3(): if not gdaltest.download_file('http://download.osgeo.org/gdal/data/s57/enctds/GB5X01SW.001', 'GB5X01SW.001'): pytest.skip() shutil.copy('tmp/cache/GB5X01SW.001', 'tmp/GB5X01SW.001') ds = ogr.Open('tmp/GB5X01SW.000') assert ds is not None lyr = ds.GetLayerByName('LIGHTS') feat = lyr.GetFeature(542) assert feat is not None, 'Did not get expected feature at all.' assert feat.rver == 2, ('Did not get expected RVER value (%d).' % feat.rver) lyr = ds.GetLayerByName('BOYCAR') feat = lyr.GetFeature(975) assert feat is not None, ('unexpected did not get feature id 975 ' 'after update!') feat = None ds = None gdaltest.clean_tmp() ############################################################################### # Test ENC LL2 (#5048) def test_ogr_s57_online_4(): if not gdaltest.download_file('http://www1.kaiho.mlit.go.jp/KOKAI/ENC/images/sample/sample.zip', 'sample.zip'): pytest.skip() try: os.stat('tmp/cache/ENC_ROOT/JP34NC94.000') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/sample.zip') try: os.stat('tmp/cache/ENC_ROOT/JP34NC94.000') except OSError: pytest.skip() except OSError: pytest.skip() gdal.SetConfigOption('OGR_S57_OPTIONS', 'RETURN_PRIMITIVES=ON,RETURN_LINKAGES=ON,LNAM_REFS=ON,RECODE_BY_DSSI=ON') ds = ogr.Open('tmp/cache/ENC_ROOT/JP34NC94.000') gdal.SetConfigOption('OGR_S57_OPTIONS', None) lyr = ds.GetLayerByName('LNDMRK') for feat in lyr: mystr = feat.NOBJNM if mystr and sys.version_info < (3, 0, 0): mystr.decode('UTF-8').encode('UTF-8') ############################################################################### # Cleanup def test_ogr_s57_cleanup(): gdaltest.s57_ds = None gdalautotest-3.0.4/ogr/ogr_pgeo.py0000755003401500001440000002050313614005325016574 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_pgeo.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR PGEO driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-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 ogr import gdaltest import ogrtest import pytest @pytest.fixture( params=['PGeo', 'MDB'], autouse=True, ) def drv(request): """ Run all tests against both PGeo and MDB drivers """ if request.param == 'PGeo': switch_driver('PGeo', 'MDB') else: switch_driver('MDB', 'PGeo') ############################################################################### # Basic testing def switch_driver(tested_driver='PGeo', other_driver='MDB'): ogrtest.pgeo_ds = None ogrtest.other_driver = ogr.GetDriverByName(other_driver) if ogrtest.other_driver is not None: print('Unregistering %s driver' % ogrtest.other_driver.GetName()) ogrtest.other_driver.Deregister() if other_driver == 'PGeo': # Re-register Geomedia and WALK at the end, *after* MDB geomedia_driver = ogr.GetDriverByName('Geomedia') if geomedia_driver is not None: geomedia_driver.Deregister() geomedia_driver.Register() walk_driver = ogr.GetDriverByName('WALK') if walk_driver is not None: walk_driver.Deregister() walk_driver.Register() drv = ogr.GetDriverByName(tested_driver) if drv is None: pytest.skip("Driver not available: %s" % tested_driver) if not gdaltest.download_file('http://download.osgeo.org/gdal/data/pgeo/PGeoTest.zip', 'PGeoTest.zip'): pytest.skip() try: os.stat('tmp/cache/Autodesk Test.mdb') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/PGeoTest.zip') try: os.stat('tmp/cache/Autodesk Test.mdb') except OSError: pytest.skip() except: pytest.skip() ogrtest.pgeo_ds = ogr.Open('tmp/cache/Autodesk Test.mdb') if ogrtest.pgeo_ds is None: pytest.skip('could not open DB. Driver probably misconfigured') assert ogrtest.pgeo_ds.GetLayerCount() == 3, 'did not get expected layer count' lyr = ogrtest.pgeo_ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('OBJECTID') != 1 or \ feat.GetField('IDNUM') != 9424 or \ feat.GetField('OWNER') != 'City': feat.DumpReadable() pytest.fail('did not get expected attributes') if ogrtest.check_feature_geometry(feat, 'LINESTRING (1910941.703951031 445833.57942859828 0,1910947.927691862 445786.43811868131 0)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected geometry') feat_count = lyr.GetFeatureCount() assert feat_count == 9418, 'did not get expected feature count' ############################################################################### # Test spatial filter def test_ogr_pgeo_2(): if ogrtest.pgeo_ds is None: pytest.skip() lyr = ogrtest.pgeo_ds.GetLayer(0) lyr.ResetReading() feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() bbox = geom.GetEnvelope() lyr.SetSpatialFilterRect(bbox[0], bbox[1], bbox[2], bbox[3]) feat_count = lyr.GetFeatureCount() assert feat_count == 6957, 'did not get expected feature count' feat = lyr.GetNextFeature() if feat.GetField('OBJECTID') != 1 or \ feat.GetField('IDNUM') != 9424 or \ feat.GetField('OWNER') != 'City': feat.DumpReadable() pytest.fail('did not get expected attributes') # Check that geometry filter is well cleared lyr.SetSpatialFilter(None) feat_count = lyr.GetFeatureCount() assert feat_count == 9418, 'did not get expected feature count' ############################################################################### # Test attribute filter def test_ogr_pgeo_3(): if ogrtest.pgeo_ds is None: pytest.skip() lyr = ogrtest.pgeo_ds.GetLayer(0) lyr.SetAttributeFilter('OBJECTID=1') feat_count = lyr.GetFeatureCount() assert feat_count == 1, 'did not get expected feature count' feat = lyr.GetNextFeature() if feat.GetField('OBJECTID') != 1 or \ feat.GetField('IDNUM') != 9424 or \ feat.GetField('OWNER') != 'City': feat.DumpReadable() pytest.fail('did not get expected attributes') # Check that attribute filter is well cleared (#3706) lyr.SetAttributeFilter(None) feat_count = lyr.GetFeatureCount() assert feat_count == 9418, 'did not get expected feature count' ############################################################################### # Test ExecuteSQL() def test_ogr_pgeo_4(): if ogrtest.pgeo_ds is None: pytest.skip() sql_lyr = ogrtest.pgeo_ds.ExecuteSQL('SELECT * FROM SDPipes WHERE OBJECTID = 1') feat_count = sql_lyr.GetFeatureCount() assert feat_count == 1, 'did not get expected feature count' feat = sql_lyr.GetNextFeature() if feat.GetField('OBJECTID') != 1 or \ feat.GetField('IDNUM') != 9424 or \ feat.GetField('OWNER') != 'City': feat.DumpReadable() pytest.fail('did not get expected attributes') ogrtest.pgeo_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test GetFeature() def test_ogr_pgeo_5(): if ogrtest.pgeo_ds is None: pytest.skip() lyr = ogrtest.pgeo_ds.GetLayer(0) feat = lyr.GetFeature(9418) if feat.GetField('OBJECTID') != 9418: feat.DumpReadable() pytest.fail('did not get expected attributes') ############################################################################### # Run test_ogrsf def test_ogr_pgeo_6(): if ogrtest.pgeo_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' "tmp/cache/Autodesk Test.mdb"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run test_ogrsf with -sql def test_ogr_pgeo_7(): if ogrtest.pgeo_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' "tmp/cache/Autodesk Test.mdb" -sql "SELECT * FROM SDPipes"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### def test_ogr_pgeo_cleanup(): if ogrtest.other_driver is not None: print('Reregistering %s driver' % ogrtest.other_driver.GetName()) ogrtest.other_driver.Register() if ogrtest.pgeo_ds is None: pytest.skip() ogrtest.pgeo_ds = None gdalautotest-3.0.4/ogr/ogr_segy.py0000755003401500001440000000643713614005325016623 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_segy.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR SEG-Y 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Read SEG-Y def test_ogr_segy_1(): ds = ogr.Open('data/segy/testsegy.segy') assert ds is not None, 'cannot open dataset' assert ds.TestCapability("foo") == 0 assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint, 'bad layer geometry type' assert lyr.GetSpatialRef() is None, 'bad spatial ref' assert lyr.TestCapability("foo") == 0 assert lyr.GetLayerDefn().GetFieldCount() == 71 feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT (500000 4500000)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') feat = lyr.GetNextFeature() assert feat is None lyr = ds.GetLayer(1) assert lyr.GetGeomType() == ogr.wkbNone, 'bad layer geometry type' assert lyr.GetSpatialRef() is None, 'bad spatial ref' assert lyr.TestCapability("foo") == 0 assert lyr.GetLayerDefn().GetFieldCount() == 32 feat = lyr.GetNextFeature() assert feat is not None feat = lyr.GetNextFeature() assert feat is None ############################################################################### # Read ASCII header SEG-Y def test_ogr_segy_2(): ds = ogr.Open('data/segy/ascii-header-with-nuls.sgy') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint, 'bad layer geometry type' gdalautotest-3.0.4/ogr/ogr_geojson.py0000755003401500001440000041256513614005325017323 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_geojson.py b471cd08d02f7f05d658fe7da57f30f1b29d3b52 2020-01-07 22:30:27 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: GeoJSON driver test suite. # Author: Mateusz Loskot # ############################################################################### # Copyright (c) 2007, Mateusz Loskot # Copyright (c) 2009-2014, Even Rouault # Copyright (c) 2013, Kyle Shannon # # 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. ############################################################################### import json import math import os from osgeo import osr from osgeo import ogr from osgeo import gdal import gdaltest import ogrtest import pytest ############################################################################### # Test utilities def validate_layer(lyr, name, features, typ, fields, box): if name is not None and name != lyr.GetName(): print('Wrong layer name') return False if features != lyr.GetFeatureCount(): print('Wrong number of features') return False lyrDefn = lyr.GetLayerDefn() if lyrDefn is None: print('Layer definition is none') return False if typ != lyrDefn.GetGeomType(): print('Wrong geometry type') print(lyrDefn.GetGeomType()) return False if fields != lyrDefn.GetFieldCount(): print('Wrong number of fields') return False extent = lyr.GetExtent() minx = abs(extent[0] - box[0]) maxx = abs(extent[1] - box[1]) miny = abs(extent[2] - box[2]) maxy = abs(extent[3] - box[3]) if max(minx, maxx, miny, maxy) > 0.0001: print('Wrong spatial extent of layer') print(extent) return False return True def verify_geojson_copy(name, fids, names): if gdaltest.gjpoint_feat is None: print('Missing features collection') return False fname = os.path.join('tmp', name + '.geojson') ds = ogr.Open(fname) if ds is None: print('Can not open \'' + fname + '\'') return False lyr = ds.GetLayer(0) if lyr is None: print('Missing layer') return False ###################################################### # Test attributes ret = ogrtest.check_features_against_list(lyr, 'FID', fids) if ret != 1: print('Wrong values in \'FID\' field') return False lyr.ResetReading() ret = ogrtest.check_features_against_list(lyr, 'NAME', names) if ret != 1: print('Wrong values in \'NAME\' field') return False ###################################################### # Test geometries lyr.ResetReading() for i in range(len(gdaltest.gjpoint_feat)): orig_feat = gdaltest.gjpoint_feat[i] feat = lyr.GetNextFeature() if feat is None: print('Failed trying to read feature') return False if ogrtest.check_feature_geometry(feat, orig_feat.GetGeometryRef(), max_error=0.001) != 0: print('Geometry test failed') gdaltest.gjpoint_feat = None return False gdaltest.gjpoint_feat = None lyr = None return True def copy_shape_to_geojson(gjname, compress=None): if gdaltest.geojson_drv is None: return False if compress is not None: if compress[0:5] == '/vsig': dst_name = os.path.join('/vsigzip/', 'tmp', gjname + '.geojson' + '.gz') elif compress[0:4] == '/vsiz': dst_name = os.path.join('/vsizip/', 'tmp', gjname + '.geojson' + '.zip') elif compress == '/vsistdout/': dst_name = compress else: return False else: dst_name = os.path.join('tmp', gjname + '.geojson') ds = gdaltest.geojson_drv.CreateDataSource(dst_name) if ds is None: return False ###################################################### # Create layer lyr = ds.CreateLayer(gjname) if lyr is None: return False ###################################################### # Setup schema (all test shapefiles use common schmea) ogrtest.quick_create_layer_def(lyr, [('FID', ogr.OFTReal), ('NAME', ogr.OFTString)]) ###################################################### # Copy in gjpoint.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) src_name = os.path.join('data', gjname + '.shp') shp_ds = ogr.Open(src_name) shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.gjpoint_feat = [] while feat is not None: gdaltest.gjpoint_feat.append(feat) dst_feat.SetFrom(feat) lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() shp_lyr = None lyr = None ds = None return True ############################################################################### # Find GeoJSON driver def test_ogr_geojson_1(): gdaltest.geojson_drv = ogr.GetDriverByName('GeoJSON') if gdaltest.geojson_drv is not None: return pytest.fail() ############################################################################### # Test file-based DS with standalone "Point" feature object. def test_ogr_geojson_2(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/point.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('point') assert lyr is not None, 'Missing layer called point' extent = (100.0, 100.0, 0.0, 0.0) rc = validate_layer(lyr, 'point', 1, ogr.wkbPoint, 0, extent) assert rc lyr = None ############################################################################### # Test file-based DS with standalone "LineString" feature object. def test_ogr_geojson_3(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/linestring.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('linestring') assert lyr is not None, 'Missing layer called linestring' extent = (100.0, 101.0, 0.0, 1.0) rc = validate_layer(lyr, 'linestring', 1, ogr.wkbLineString, 0, extent) assert rc lyr = None ############################################################################## # Test file-based DS with standalone "Polygon" feature object. def test_ogr_geojson_4(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/polygon.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('polygon') assert lyr is not None, 'Missing layer called polygon' extent = (100.0, 101.0, 0.0, 1.0) rc = validate_layer(lyr, 'polygon', 1, ogr.wkbPolygon, 0, extent) assert rc lyr = None ############################################################################## # Test file-based DS with standalone "GeometryCollection" feature object. def test_ogr_geojson_5(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/geometrycollection.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('geometrycollection') assert lyr is not None, 'Missing layer called geometrycollection' extent = (100.0, 102.0, 0.0, 1.0) rc = validate_layer(lyr, 'geometrycollection', 1, ogr.wkbGeometryCollection, 0, extent) assert rc lyr = None ############################################################################## # Test file-based DS with standalone "MultiPoint" feature object. def test_ogr_geojson_6(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/multipoint.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('multipoint') assert lyr is not None, 'Missing layer called multipoint' extent = (100.0, 101.0, 0.0, 1.0) rc = validate_layer(lyr, 'multipoint', 1, ogr.wkbMultiPoint, 0, extent) assert rc lyr = None ############################################################################## # Test file-based DS with standalone "MultiLineString" feature object. def test_ogr_geojson_7(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/multilinestring.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('multilinestring') assert lyr is not None, 'Missing layer called multilinestring' extent = (100.0, 103.0, 0.0, 3.0) rc = validate_layer(lyr, 'multilinestring', 1, ogr.wkbMultiLineString, 0, extent) assert rc lyr = None ############################################################################## # Test file-based DS with standalone "MultiPolygon" feature object. def test_ogr_geojson_8(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/multipolygon.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('multipolygon') assert lyr is not None, 'Missing layer called multipolygon' extent = (100.0, 103.0, 0.0, 3.0) rc = validate_layer(lyr, 'multipolygon', 1, ogr.wkbMultiPolygon, 0, extent) assert rc lyr = None ############################################################################## # Test translation of data/gjpoint.shp to GeoJSON file def test_ogr_geojson_9(): if gdaltest.geojson_drv is None: pytest.skip() gdaltest.tests = [ ['gjpoint', [1], ['Point 1']], ['gjline', [1], ['Line 1']], ['gjpoly', [1], ['Polygon 1']], ['gjmultipoint', [1], ['MultiPoint 1']], ['gjmultiline', [2], ['MultiLine 1']], ['gjmultipoly', [2], ['MultiPoly 1']] ] for i in range(len(gdaltest.tests)): test = gdaltest.tests[i] rc = copy_shape_to_geojson(test[0]) assert rc, ('Failed making copy of ' + test[0] + '.shp') rc = verify_geojson_copy(test[0], test[1], test[2]) assert rc, ('Verification of copy of ' + test[0] + '.shp failed') ############################################################################## # Test translation of data/gjpoint.shp to GZip compressed GeoJSON file def test_ogr_geojson_10(): if gdaltest.geojson_drv is None: pytest.skip() gdaltest.tests = [ ['gjpoint', [1], ['Point 1']], ['gjline', [1], ['Line 1']], ['gjpoly', [1], ['Polygon 1']], ['gjmultipoint', [1], ['MultiPoint 1']], ['gjmultiline', [2], ['MultiLine 1']], ['gjmultipoly', [2], ['MultiPoly 1']] ] for i in range(len(gdaltest.tests)): test = gdaltest.tests[i] rc = copy_shape_to_geojson(test[0], '/vsigzip/') assert rc, ('Failed making copy of ' + test[0] + '.shp') rc = verify_geojson_copy(test[0], test[1], test[2]) assert rc, ('Verification of copy of ' + test[0] + '.shp failed') ############################################################################### def test_ogr_geojson_11(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/srs_name.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('srs_name') assert lyr is not None, 'Missing layer called srs_name' extent = (100.0, 102.0, 0.0, 1.0) rc = validate_layer(lyr, 'srs_name', 1, ogr.wkbGeometryCollection, 0, extent) assert rc ref = lyr.GetSpatialRef() pcs = int(ref.GetAuthorityCode('PROJCS')) assert pcs == 26915, 'Spatial reference was not valid' feature = lyr.GetNextFeature() geometry = feature.GetGeometryRef().GetGeometryRef(0) srs = geometry.GetSpatialReference() pcs = int(srs.GetAuthorityCode('PROJCS')) assert pcs == 26916, 'Spatial reference for individual geometry was not valid' lyr = None ############################################################################### # Test DS passed as name with standalone "Point" feature object (#3377) def test_ogr_geojson_12(): if gdaltest.geojson_drv is None: pytest.skip() if os.name == 'nt': pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' -ro -al \'{"type": "Point","coordinates": [100.0, 0.0]}\'') assert ret.find(' POINT (100 0)') != -1 ############################################################################### # Test writing to stdout (#3381) def test_ogr_geojson_13(): if gdaltest.geojson_drv is None: pytest.skip() test = ['gjpoint', [1], ['Point 1']] rc = copy_shape_to_geojson(test[0], '/vsistdout/') assert rc, ('Failed making copy of ' + test[0] + '.shp') ############################################################################### # Test reading & writing various degenerated geometries def test_ogr_geojson_14(): if gdaltest.geojson_drv is None: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1800: pytest.skip() with gdaltest.error_handler(): ds = ogr.Open('data/ogr_geojson_14.geojson') lyr = ds.GetLayer(0) out_ds = gdaltest.geojson_drv.CreateDataSource('tmp/out_ogr_geojson_14.geojson') out_lyr = out_ds.CreateLayer('lyr') with gdaltest.error_handler(): for feat in lyr: geom = feat.GetGeometryRef() if geom is not None: # print(geom) out_feat = ogr.Feature(feature_def=out_lyr.GetLayerDefn()) out_feat.SetGeometry(geom) out_lyr.CreateFeature(out_feat) out_ds = None ############################################################################### # Test Feature.ExportToJson (#3870) def test_ogr_geojson_15(): feature_defn = ogr.FeatureDefn() feature_defn.AddFieldDefn(ogr.FieldDefn("foo")) field_defn = ogr.FieldDefn("boolfield", ogr.OFTInteger) field_defn.SetSubType(ogr.OFSTBoolean) feature_defn.AddFieldDefn(field_defn) feature = ogr.Feature(feature_defn) feature.SetField("foo", "bar") feature.SetField("boolfield", True) feature.SetFID(0) geom = ogr.CreateGeometryFromWkt("POINT(1 2)") feature.SetGeometry(geom) try: out = feature.ExportToJson() except ImportError: pytest.skip() expected_out = """{"geometry": {"type": "Point", "coordinates": [1.0, 2.0]}, "type": "Feature", "properties": {"foo": "bar", "boolfield": true}, "id": 0}""" if out != expected_out: out_json = json.loads(out) expected_out_json = json.loads(expected_out) assert out_json == expected_out_json, out out = feature.ExportToJson(as_object=True) expected_out = {'geometry': {'type': 'Point', 'coordinates': [1.0, 2.0]}, 'type': 'Feature', 'properties': {'foo': 'bar', "boolfield": True}, 'id': 0} assert out == expected_out ############################################################################### # Test reading ESRI point file def test_ogr_geojson_16(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esripoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('esripoint') assert lyr is not None, 'Missing layer called esripoint' extent = (2, 2, 49, 49) rc = validate_layer(lyr, 'esripoint', 1, ogr.wkbPoint, 4, extent) assert rc ref = lyr.GetSpatialRef() gcs = int(ref.GetAuthorityCode('GEOGCS')) assert gcs == 4326, "Spatial reference was not valid" feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT(2 49)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() if feature.GetFID() != 1: feature.DumpReadable() pytest.fail() if feature.GetFieldAsInteger('fooInt') != 2: feature.DumpReadable() pytest.fail() if feature.GetFieldAsDouble('fooDouble') != 3.4: feature.DumpReadable() pytest.fail() if feature.GetFieldAsString('fooString') != '56': feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI linestring file def test_ogr_geojson_17(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrilinestring.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (2, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbLineString, 0, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None # MultiLineString ds = ogr.Open("""{ "geometryType": "esriGeometryPolyline", "fields": [], "features": [ { "geometry": { "paths" : [ [ [2,49],[2.1,49.1] ], [ [3,50],[3.1,50.1] ] ] } } ] }""") lyr = ds.GetLayer(0) feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTILINESTRING ((2 49,2.1 49.1),(3 50,3.1 50.1))') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() ############################################################################### # Test reading ESRI polygon file def test_ogr_geojson_18(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esripolygon.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (-3, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbPolygon, 0, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((2 49,2 50,3 50,3 49,2 49),(2.1 49.1,2.1 49.9,2.9 49.9,2.9 49.1,2.1 49.1)),((-2 49,-2 50,-3 50,-3 49,-2 49)))') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ds = ogr.Open('data/esripolygonempty.json') assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayer(0) feature = lyr.GetNextFeature() if feature.GetGeometryRef().ExportToWkt() != 'POLYGON EMPTY': feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI multipoint file def test_ogr_geojson_19(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrimultipoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (2, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbMultiPoint, 4, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,3 50)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading files with no extension (#4314) def test_ogr_geojson_20(): if gdaltest.geojson_drv is None: pytest.skip() from glob import glob geojson_files = glob('data/*.json') geojson_files.extend(glob('data/*.geojson')) for gj in geojson_files: # create tmp file with no file extension data = open(gj, 'rb').read() f = gdal.VSIFOpenL('/vsimem/testgj', 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('/vsimem/testgj') gdal.PopErrorHandler() if ds is None: print(gj) print(data.decode('LATIN1')) pytest.fail('Failed to open datasource') ds = None gdal.Unlink('/vsimem/testgj') ############################################################################### # Test reading output of geocouch spatiallist def test_ogr_geojson_21(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": {"_id":"aid", "_rev":"arev", "type":"Feature", "properties":{"intvalue" : 2, "floatvalue" : 3.2, "strvalue" : "foo", "properties": { "foo": "bar"}}}}]}""") assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('OGRGeoJSON') feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT (1 2)') if feature.GetFieldAsString("_id") != 'aid' or \ feature.GetFieldAsString("_rev") != 'arev' or \ feature.GetFieldAsInteger("intvalue") != 2 or \ ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Same as ogr_geojson_21 with several features def test_ogr_geojson_22(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": {"_id":"aid", "_rev":"arev", "type":"Feature", "properties":{"intvalue" : 2, "floatvalue" : 3.2, "strvalue" : "foo"}}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,4]}, "properties": {"_id":"aid2", "_rev":"arev2", "type":"Feature", "properties":{"intvalue" : 3.5, "str2value" : "bar"}}}]}""") assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('OGRGeoJSON') feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT (1 2)') if feature.GetFieldAsString("_id") != 'aid' or \ feature.GetFieldAsString("_rev") != 'arev' or \ feature.GetFieldAsDouble("intvalue") != 2 or \ ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT (3 4)') if feature.GetFieldAsString("_id") != 'aid2' or \ feature.GetFieldAsString("_rev") != 'arev2' or \ feature.GetFieldAsDouble("intvalue") != 3.5 or \ feature.GetFieldAsString("str2value") != 'bar' or \ ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Write GeoJSON with bbox and test SRS writing&reading back def test_ogr_geojson_23(): if gdaltest.geojson_drv is None: pytest.skip() ds = gdaltest.geojson_drv.CreateDataSource('/vsimem/ogr_geojson_23.json') sr = osr.SpatialReference() sr.ImportFromEPSG(4322) lyr = ds.CreateLayer('foo', srs=sr, options=['WRITE_BBOX=YES']) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 10)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 20)')) lyr.CreateFeature(feat) lyr = None ds = None ds = ogr.Open('/vsimem/ogr_geojson_23.json') lyr = ds.GetLayer(0) sr_got = lyr.GetSpatialRef() ds = None sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) assert sr_got.IsSame(sr), 'did not get expected SRS' fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_23.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_23.json') assert data.find('"bbox": [ 1, 10, 2, 20 ]') != -1, 'did not find global bbox' assert data.find('"bbox": [ 1.0, 10.0, 1.0, 10.0 ]') != -1, \ 'did not find first feature bbox' ############################################################################### # Test alternate form of geojson def test_ogr_geojson_24(): if gdaltest.geojson_drv is None: pytest.skip() content = """loadGeoJSON({"layerFoo": { "type": "Feature", "geometry": { "type": "Point", "coordinates": [2, 49] }, "name": "bar" }, "layerBar": { "type": "FeatureCollection", "features" : [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [2, 49] }, "other_name": "baz" }]}})""" for i in range(2): if i == 0: ds = ogr.Open(content) else: gdal.FileFromMemBuffer('/vsimem/ogr_geojson_24.js', content) ds = ogr.Open('/vsimem/ogr_geojson_24.js') gdal.Unlink('/vsimem/ogr_geojson_24.js') assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('layerFoo') assert lyr is not None, 'cannot find layer' feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT (2 49)') if feature.GetFieldAsString("name") != 'bar' or \ ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('layerBar') assert lyr is not None, 'cannot find layer' feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT (2 49)') if feature.GetFieldAsString("other_name") != 'baz' or \ ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() ds = None ############################################################################### # Test TopoJSON def test_ogr_geojson_25(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/topojson1.topojson') lyr = ds.GetLayer(0) assert lyr.GetName() == 'a_layer' feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (100 1000,110 1000,110 1100)') == 0 lyr = ds.GetLayer(1) assert lyr.GetName() == 'TopoJSON' expected_results = [ (None, None, 'POINT EMPTY'), (None, None, 'POINT EMPTY'), (None, None, 'POINT EMPTY'), (None, None, 'POINT (100 1010)'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, None, 'LINESTRING EMPTY'), (None, '0', 'LINESTRING EMPTY'), (None, 'foo', 'LINESTRING EMPTY'), ('1', None, 'LINESTRING (100 1000,110 1000,110 1100)'), ('2', None, 'LINESTRING (110 1100,110 1000,100 1000)'), (None, None, 'POLYGON EMPTY'), (None, None, 'POLYGON EMPTY'), (None, None, 'POLYGON EMPTY'), (None, None, 'POLYGON ((100 1000,110 1000,110 1100,100 1100,100 1000),(101 1010,101 1090,109 1090,109 1010,101 1010))'), (None, None, 'POLYGON ((110 1100,110 1000,100 1000,100 1100,110 1100),(101 1010,109 1010,109 1090,101 1090,101 1010))'), (None, None, 'MULTIPOINT EMPTY'), (None, None, 'MULTIPOINT EMPTY'), (None, None, 'MULTIPOINT EMPTY'), (None, None, 'MULTIPOINT EMPTY'), (None, None, 'MULTIPOINT (100 1010,101 1020)'), (None, None, 'MULTIPOLYGON EMPTY'), (None, None, 'MULTIPOLYGON EMPTY'), (None, None, 'MULTIPOLYGON EMPTY'), (None, None, 'MULTIPOLYGON (((110 1100,110 1000,100 1000,100 1100,110 1100)),((101 1010,109 1010,109 1090,101 1090,101 1010)))'), (None, None, 'MULTILINESTRING EMPTY'), (None, None, 'MULTILINESTRING EMPTY'), (None, None, 'MULTILINESTRING ((100 1000,110 1000,110 1100))'), (None, None, 'MULTILINESTRING ((100 1000,110 1000,110 1100,100 1100,100 1000))'), (None, None, 'MULTILINESTRING ((100 1000,110 1000,110 1100,100 1100,100 1000),(101 1010,101 1090,109 1090,109 1010,101 1010))'), ] assert lyr.GetFeatureCount() == len(expected_results) for i, exp_result in enumerate(expected_results): feat = lyr.GetNextFeature() if feat.GetField('id') != exp_result[0] or \ feat.GetField('name') != exp_result[1] or \ feat.GetGeometryRef().ExportToWkt() != exp_result[2]: feat.DumpReadable() print(exp_result) print(feat.GetField('name')) pytest.fail('failure at feat index %d' % i) ds = None ds = ogr.Open('data/topojson2.topojson') lyr = ds.GetLayer(0) assert lyr.GetName() == 'a_layer' feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (100 1000,110 1000,110 1100)') == 0 lyr = ds.GetLayer(1) assert lyr.GetName() == 'TopoJSON' feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (100 1000,110 1000,110 1100)') == 0 ds = None ds = ogr.Open('data/topojson3.topojson') lyr = ds.GetLayer(0) assert lyr.GetName() == 'a_layer' feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (0 0,10 0,0 10,10 0,0 0)') == 0 lyr = ds.GetLayer(1) assert lyr.GetName() == 'TopoJSON' feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (0 0,10 0,0 10,10 0,0 0)') == 0 ds = None ############################################################################### # Test 64bit support def test_ogr_geojson_26(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "id": 1, "geometry": {"type":"Point","coordinates":[1,2]}, "properties": { "intvalue" : 1, "int64" : 1234567890123, "intlist" : [1] }}, {"type": "Feature", "id": 1234567890123, "geometry": {"type":"Point","coordinates":[3,4]}, "properties": { "intvalue" : 1234567890123, "intlist" : [1, 1234567890123] }}, ]}""") assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('OGRGeoJSON') assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None feature = lyr.GetNextFeature() if feature.GetFID() != 1: feature.DumpReadable() pytest.fail() if feature.GetField("intvalue") != 1: feature.DumpReadable() pytest.fail() if feature.GetField("int64") != 1234567890123: feature.DumpReadable() pytest.fail() feature = lyr.GetNextFeature() if feature.GetFID() != 1234567890123: feature.DumpReadable() pytest.fail() if feature.GetField("intvalue") != 1234567890123: feature.DumpReadable() pytest.fail() if feature.GetField("intlist") != [1, 1234567890123]: feature.DumpReadable() pytest.fail() lyr = None ds = None ds = gdaltest.geojson_drv.CreateDataSource('/vsimem/ogr_geojson_26.json') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('int64list', ogr.OFTInteger64List)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1234567890123) f.SetField(0, 1234567890123) f.SetFieldInteger64List(1, [1234567890123]) lyr.CreateFeature(f) f = None ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_26.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_26.json') assert '{ "type": "Feature", "id": 1234567890123, "properties": { "int64": 1234567890123, "int64list": [ 1234567890123 ] }, "geometry": null }' in data ############################################################################### # Test workaround for 64bit values (returned as strings) def test_ogr_geojson_27(): if gdaltest.geojson_drv is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') # Warning 1: Integer values probably ranging out of 64bit integer range # have been found. Will be clamped to INT64_MIN/INT64_MAX ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": { "intvalue" : 1 }}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,4]}, "properties": { "intvalue" : 12345678901231234567890123 }}, ]}""") gdal.PopErrorHandler() assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('OGRGeoJSON') feature = lyr.GetNextFeature() if feature.GetField("intvalue") != 1: feature.DumpReadable() pytest.fail() feature = lyr.GetNextFeature() if feature.GetField("intvalue") != 9223372036854775807: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI point file with z value def test_ogr_geojson_28(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrizpoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) # validate layer doesn't check z, but put it in extent = (2, 2, 49, 49, 1, 1) rc = validate_layer(lyr, None, 1, ogr.wkbPoint, 4, extent) assert rc ref = lyr.GetSpatialRef() gcs = int(ref.GetAuthorityCode('GEOGCS')) assert gcs == 4326, "Spatial reference was not valid" feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POINT(2 49 1)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() if feature.GetFID() != 1: feature.DumpReadable() pytest.fail() if feature.GetFieldAsInteger('fooInt') != 2: feature.DumpReadable() pytest.fail() if feature.GetFieldAsDouble('fooDouble') != 3.4: feature.DumpReadable() pytest.fail() if feature.GetFieldAsString('fooString') != '56': feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI linestring file with z def test_ogr_geojson_29(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrizlinestring.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) # validate layer doesn't check z, but put it in extent = (2, 3, 49, 50, 1, 2) rc = validate_layer(lyr, None, 1, ogr.wkbLineString, 0, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('LINESTRING (2 49 1,3 50 2)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI multipoint file with z def test_ogr_geojson_30(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrizmultipoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) # validate layer doesn't check z, but put it in extent = (2, 3, 49, 50, 1, 2) rc = validate_layer(lyr, None, 1, ogr.wkbMultiPoint, 4, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49 1,3 50 2)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI polygon file with z def test_ogr_geojson_31(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrizpolygon.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) # validate layer doesn't check z, but put it in extent = (2, 3, 49, 50, 1, 4) rc = validate_layer(lyr, None, 1, ogr.wkbPolygon, 0, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POLYGON ((2 49 1,2 50 2,3 50 3,3 49 4,2 49 1))') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI multipoint file with m, but no z (hasM=true, hasZ omitted) def test_ogr_geojson_32(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrihasmnozmultipoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (2, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbMultiPoint, 4, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT M ((2 49 1),(3 50 2))') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI multipoint file with hasZ=true, but only 2 components. def test_ogr_geojson_33(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esriinvalidhaszmultipoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (2, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbMultiPoint, 4, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,3 50)') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test reading ESRI multipoint file with z and m def test_ogr_geojson_34(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/esrizmmultipoint.json') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayer(0) extent = (2, 3, 49, 50) rc = validate_layer(lyr, None, 1, ogr.wkbMultiPoint, 4, extent) assert rc feature = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOINT ZM ((2 49 1 100),(3 50 2 100))') if ogrtest.check_feature_geometry(feature, ref_geom) != 0: feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test handling of huge coordinates (#5377) def test_ogr_geojson_35(): if gdaltest.geojson_drv is None: pytest.skip() ds = gdaltest.geojson_drv.CreateDataSource('/vsimem/ogr_geojson_35.json') lyr = ds.CreateLayer('foo') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) geom = ogr.Geometry(ogr.wkbPoint) geom.AddPoint_2D(-1.79769313486231571e+308, -1.79769313486231571e+308) feat.SetGeometry(geom) lyr.CreateFeature(feat) gdal.PushErrorHandler('CPLQuietErrorHandler') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(2) geom = ogr.Geometry(ogr.wkbPoint) geom.AddPoint(-1.7e308 * 2, 1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(3) geom = ogr.Geometry(ogr.wkbLineString) geom.AddPoint_2D(0, 0) geom.AddPoint_2D(-1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(4) geom = ogr.Geometry(ogr.wkbPolygon) geom2 = ogr.Geometry(ogr.wkbLinearRing) geom2.AddPoint_2D(0, 0) geom2.AddPoint_2D(-1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf geom.AddGeometry(geom2) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(5) geom = ogr.Geometry(ogr.wkbMultiPoint) geom2 = ogr.Geometry(ogr.wkbPoint) geom2.AddPoint_2D(0, 0) geom2 = ogr.Geometry(ogr.wkbPoint) geom2.AddPoint_2D(-1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf geom.AddGeometry(geom2) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(6) geom = ogr.Geometry(ogr.wkbMultiLineString) geom2 = ogr.Geometry(ogr.wkbLineString) geom2.AddPoint_2D(0, 0) geom2 = ogr.Geometry(ogr.wkbLineString) geom2.AddPoint_2D(-1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf geom.AddGeometry(geom2) feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(7) geom = ogr.Geometry(ogr.wkbMultiPolygon) geom2 = ogr.Geometry(ogr.wkbPolygon) geom3 = ogr.Geometry(ogr.wkbLinearRing) geom3.AddPoint_2D(0, 0) geom2.AddGeometry(geom3) geom2 = ogr.Geometry(ogr.wkbPolygon) geom3 = ogr.Geometry(ogr.wkbLinearRing) geom3.AddPoint_2D(-1.7e308 * 2, 1.7e308 * 2) # evaluates to -inf, inf geom2.AddGeometry(geom3) geom.AddGeometry(geom2) feat.SetGeometry(geom) lyr.CreateFeature(feat) gdal.PopErrorHandler() ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_35.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_35.json') assert not (data.find('-1.79') == -1 and data.find('e+308') == -1) for ident in range(2, 8): assert data.find('{ "type": "Feature", "id": %d, "properties": { }, "geometry": null }' % ident) != -1 ############################################################################### # Test reading file with UTF-8 BOM (which is supposed to be illegal in JSON...) (#5630) def test_ogr_geojson_36(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/point_with_utf8bom.json') assert ds is not None, 'Failed to open datasource' ds = None ######################################################################### # Test boolean type support def test_ogr_geojson_37(): if gdaltest.geojson_drv is None: pytest.skip() # Test read support ds = ogr.Open("""{"type": "FeatureCollection","features": [ { "type": "Feature", "properties": { "bool" : false, "not_bool": false, "bool_list" : [false, true], "notbool_list" : [false, 3]}, "geometry": null }, { "type": "Feature", "properties": { "bool" : true, "not_bool": 2, "bool_list" : [true] }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert (feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('bool')).GetType() == ogr.OFTInteger and \ feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('bool')).GetSubType() == ogr.OFSTBoolean) assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('not_bool')).GetSubType() == ogr.OFSTNone assert (feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('bool_list')).GetType() == ogr.OFTIntegerList and \ feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('bool_list')).GetSubType() == ogr.OFSTBoolean) assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('notbool_list')).GetSubType() == ogr.OFSTNone f = lyr.GetNextFeature() if f.GetField('bool') != 0 or f.GetField('bool_list') != [0, 1]: f.DumpReadable() pytest.fail() out_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_37.json') out_lyr = out_ds.CreateLayer('test') for i in range(feat_defn.GetFieldCount()): out_lyr.CreateField(feat_defn.GetFieldDefn(i)) out_f = ogr.Feature(out_lyr.GetLayerDefn()) out_f.SetFrom(f) out_lyr.CreateFeature(out_f) out_ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_37.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_37.json') assert '"bool": false, "not_bool": 0, "bool_list": [ false, true ], "notbool_list": [ 0, 3 ]' in data ############################################################################### # Test datetime/date/time type support def test_ogr_geojson_38(): if gdaltest.geojson_drv is None: pytest.skip() # Test read support ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "dt": "2014-11-20 12:34:56+0100", "dt2": "2014\/11\/20", "date":"2014\/11\/20", "time":"12:34:56", "no_dt": "2014-11-20 12:34:56+0100", "no_dt2": "2014-11-20 12:34:56+0100" }, "geometry": null }, { "type": "Feature", "properties": { "dt": "2014\/11\/20", "dt2": "2014\/11\/20T12:34:56Z", "date":"2014-11-20", "time":"12:34:56", "no_dt": "foo", "no_dt2": 1 }, "geometry": null } ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('dt')).GetType() == ogr.OFTDateTime assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('dt2')).GetType() == ogr.OFTDateTime assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('date')).GetType() == ogr.OFTDate assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('time')).GetType() == ogr.OFTTime assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('no_dt')).GetType() == ogr.OFTString assert feat_defn.GetFieldDefn(feat_defn.GetFieldIndex('no_dt2')).GetType() == ogr.OFTString f = lyr.GetNextFeature() if f.GetField('dt') != '2014/11/20 12:34:56+01' or f.GetField('dt2') != '2014/11/20 00:00:00' or \ f.GetField('date') != '2014/11/20' or f.GetField('time') != '12:34:56': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('dt') != '2014/11/20 00:00:00' or f.GetField('dt2') != '2014/11/20 12:34:56+00' or \ f.GetField('date') != '2014/11/20' or f.GetField('time') != '12:34:56': f.DumpReadable() pytest.fail() ds = gdal.OpenEx("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "dt": "2014-11-20 12:34:56+0100", "dt2": "2014\/11\/20", "date":"2014\/11\/20", "time":"12:34:56", "no_dt": "2014-11-20 12:34:56+0100", "no_dt2": "2014-11-20 12:34:56+0100" }, "geometry": null } ] }""", open_options = ['DATE_AS_STRING=YES']) lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() for i in range(feat_defn.GetFieldCount()): assert feat_defn.GetFieldDefn(i).GetType() == ogr.OFTString ############################################################################### # Test id top-object level def test_ogr_geojson_39(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : "foo", "properties": { "bar" : "baz" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTString feat = lyr.GetNextFeature() if feat.GetField('id') != 'foo' or feat.GetField('bar') != 'baz': feat.DumpReadable() pytest.fail() # Crazy case: properties.id has the precedence because we arbitrarily decided that... ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : "foo", "properties": { "id" : 6 }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger feat = lyr.GetNextFeature() if feat.GetField('id') != 6: feat.DumpReadable() pytest.fail() # Same with 2 features ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : "foo", "properties": { "id" : 6 }, "geometry": null }, { "type": "Feature", "id" : "bar", "properties": { "id" : 7 }, "geometry": null } ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger feat = lyr.GetNextFeature() if feat.GetField('id') != 6: feat.DumpReadable() pytest.fail() # Crazy case: properties.id has the precedence because we arbitrarily decided that... ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : "foo", "properties": { "id" : "baz" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTString feat = lyr.GetNextFeature() if feat.GetField('id') != 'baz': feat.DumpReadable() pytest.fail() # id and properties.ID (#6538) ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : 1, "properties": { "ID": 2 }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'ID' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger feat = lyr.GetNextFeature() if feat.GetFID() != 1 or feat.GetField('ID') != 2: feat.DumpReadable() pytest.fail() # Test handling of duplicated id gdal.ErrorReset() with gdaltest.error_handler(): ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : 1, "properties": { "foo": "bar" }, "geometry": null }, { "type": "Feature", "id" : 1, "properties": { "foo": "baz" }, "geometry": null }, { "type": "Feature", "id" : 2, "properties": { "foo": "baw" }, "geometry": null } ] }""") assert gdal.GetLastErrorMsg() != '', 'expected warning' lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() feat = lyr.GetNextFeature() if feat.GetFID() != 1 or feat.GetField('foo') != 'bar': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFID() != 2 or feat.GetField('foo') != 'baz': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFID() != 3 or feat.GetField('foo') != 'baw': feat.DumpReadable() pytest.fail() # negative id ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : -1, "properties": { "foo": "bar" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger feat = lyr.GetNextFeature() if feat.GetField('id') != -1: feat.DumpReadable() pytest.fail() # negative id 64bit ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : -1234567890123, "properties": { "foo": "bar" }, "geometry": null }, { "type": "Feature", "id" : -2, "properties": { "foo": "baz" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger64 feat = lyr.GetNextFeature() if feat.GetField('id') != -1234567890123: feat.DumpReadable() pytest.fail() # negative id ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : -2, "properties": { "foo": "baz" }, "geometry": null }, { "type": "Feature", "id" : -1234567890123, "properties": { "foo": "bar" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTInteger64 feat = lyr.GetNextFeature() if feat.GetField('id') != -2: feat.DumpReadable() pytest.fail() # positive and then negative id ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : 1, "properties": { "foo": "baz" }, "geometry": null }, { "type": "Feature", "id" : -1, "properties": { "foo": "bar" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(1).GetName() == 'id' and feat_defn.GetFieldDefn(1).GetType() == ogr.OFTInteger feat = lyr.GetNextFeature() if feat.GetField('id') != 1: feat.DumpReadable() pytest.fail() # mix of int and string id ds = ogr.Open("""{"type": "FeatureCollection", "features": [ { "type": "Feature", "id" : -2, "properties": { "foo": "baz" }, "geometry": null }, { "type": "Feature", "id" : "str", "properties": { "foo": "bar" }, "geometry": null }, { "type": "Feature", "id" : -3, "properties": { "foo": "baz" }, "geometry": null }, ] }""") lyr = ds.GetLayer(0) feat_defn = lyr.GetLayerDefn() assert feat_defn.GetFieldDefn(0).GetName() == 'id' and feat_defn.GetFieldDefn(0).GetType() == ogr.OFTString feat = lyr.GetNextFeature() if feat.GetField('id') != '-2': feat.DumpReadable() pytest.fail() ############################################################################### # Test nested attributes def test_ogr_geojson_40(): if gdaltest.geojson_drv is None: pytest.skip() ds = gdal.OpenEx("""{ "type": "FeatureCollection", "features" : [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 2, 49 ] }, "properties": { "a_property": 1, "some_object": { "a_property": 1, "another_property": 2 } } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 2, 49 ] }, "properties": { "a_property": "foo", "some_object": { "a_property": 1, "another_property": 2.34 } } } ] }""", gdal.OF_VECTOR, open_options=['FLATTEN_NESTED_ATTRIBUTES=YES', 'NESTED_ATTRIBUTE_SEPARATOR=.']) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() if feat.GetField('a_property') != 'foo' or feat.GetField('some_object.a_property') != 1 or \ feat.GetField('some_object.another_property') != 2.34: feat.DumpReadable() pytest.fail() ############################################################################### # Test ogr.CreateGeometryFromJson() def test_ogr_geojson_41(): if gdaltest.geojson_drv is None: pytest.skip() # Check that by default we return a WGS 84 SRS g = ogr.CreateGeometryFromJson("{ 'type': 'Point', 'coordinates' : [ 2, 49] }") assert g.ExportToWkt() == 'POINT (2 49)' srs = g.GetSpatialReference() g = None assert srs.ExportToWkt().find('WGS 84') >= 0 # But if a crs object is set (allowed originally, but not recommended!), we use it g = ogr.CreateGeometryFromJson('{ "type": "Point", "coordinates" : [ 2, 49], "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::4322" } } }') srs = g.GetSpatialReference() assert srs.ExportToWkt().find('4322') >= 0 # But if a crs object is set to null, set no crs g = ogr.CreateGeometryFromJson('{ "type": "Point", "coordinates" : [ 2, 49], "crs": null }') srs = g.GetSpatialReference() assert not srs ############################################################################### # Test ESRI FeatureService scrolling def test_ogr_geojson_42(): if gdaltest.geojson_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') resultOffset0 = """ { "type":"FeatureCollection", "properties" : { "exceededTransferLimit" : true }, "features" : [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 2, 49 ] }, "properties": { "id": 1, "a_property": 1, } } ] }""" gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1', resultOffset0) ds = ogr.Open('/vsimem/geojson/test.json?resultRecordCount=1') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 f = lyr.GetNextFeature() assert f is None ds = None gdal.Unlink('/vsimem/geojson/test.json?resultRecordCount=1') gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=10', resultOffset0) gdal.PushErrorHandler() ds = ogr.Open('/vsimem/geojson/test.json?resultRecordCount=10') gdal.PopErrorHandler() lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 f = lyr.GetNextFeature() assert f is None ds = None gdal.Unlink('/vsimem/geojson/test.json?resultRecordCount=10') gdal.FileFromMemBuffer('/vsimem/geojson/test.json?', resultOffset0) gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1&resultOffset=0', resultOffset0) ds = ogr.Open('/vsimem/geojson/test.json?') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 f = lyr.GetNextFeature() assert f is None lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 resultOffset1 = """ { "type":"FeatureCollection", "features" : [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 2, 49 ] }, "properties": { "id": 2, "a_property": 1, } } ] }""" gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1&resultOffset=1', resultOffset1) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 2 f = lyr.GetNextFeature() assert f is None gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2 gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1&returnCountOnly=true', """{ "count": 123456}""") fc = lyr.GetFeatureCount() assert fc == 123456 gdal.PushErrorHandler() extent = lyr.GetExtent() gdal.PopErrorHandler() assert extent == (2, 2, 49, 49) gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1&returnExtentOnly=true&f=geojson', """{"type":"FeatureCollection","bbox":[1, 2, 3, 4],"features":[]}""") extent = lyr.GetExtent() assert extent == (1.0, 3.0, 2.0, 4.0) assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCFastGetExtent) == 0 assert lyr.TestCapability('foo') == 0 # Test scrolling with ESRI json resultOffset0 = """ { "objectIdFieldName" : "objectid", "geometryType" : "esriGeometryPoint", "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, ], "features" : [ { "geometry" : { "x" : 2, "y" : 49, "z" : 1 }, "attributes" : { "objectid" : 1 } } ], "exceededTransferLimit": true } """ resultOffset1 = """ { "objectIdFieldName" : "objectid", "geometryType" : "esriGeometryPoint", "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, ], "features" : [ { "geometry": null, "attributes" : { "objectid" : 20 } } ] } """ gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1', resultOffset0) gdal.FileFromMemBuffer('/vsimem/geojson/test.json?resultRecordCount=1&resultOffset=1', resultOffset1) ds = ogr.Open('/vsimem/geojson/test.json?resultRecordCount=1') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 20 ds = None gdal.Unlink('/vsimem/geojson/test.json?resultRecordCount=1') gdal.Unlink('/vsimem/geojson/test.json?resultRecordCount=1&resultOffset=1') ############################################################################### # Test Feature without geometry def test_ogr_geojson_43(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "properties": {"foo": "bar"}}]}""") assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('OGRGeoJSON') feature = lyr.GetNextFeature() if feature.GetFieldAsString("foo") != 'bar': feature.DumpReadable() pytest.fail() lyr = None ds = None ############################################################################### # Test null Feature (#6166) def test_ogr_geojson_44(): if gdaltest.geojson_drv is None: pytest.skip() with gdaltest.error_handler(): ogr.Open("""{"type": "FeatureCollection", "features":[ null ]}""") ############################################################################### # Test native data support def test_ogr_geojson_45(): if gdaltest.geojson_drv is None: pytest.skip() # Test read support content = """{"type": "FeatureCollection", "foo": "bar", "bar": "baz", "features":[ { "type": "Feature", "foo": ["bar", "baz", 1.0, true, false,[],{}], "properties": { "myprop": "myvalue" }, "geometry": null } ]}""" for i in range(2): if i == 0: ds = gdal.OpenEx(content, gdal.OF_VECTOR, open_options=['NATIVE_DATA=YES']) else: gdal.FileFromMemBuffer('/vsimem/ogr_geojson_45.json', content) ds = gdal.OpenEx('/vsimem/ogr_geojson_45.json', gdal.OF_VECTOR, open_options=['NATIVE_DATA=YES']) lyr = ds.GetLayer(0) native_data = lyr.GetMetadataItem("NATIVE_DATA", "NATIVE_DATA") assert native_data == '{ "foo": "bar", "bar": "baz" }' native_media_type = lyr.GetMetadataItem("NATIVE_MEDIA_TYPE", "NATIVE_DATA") assert native_media_type == 'application/vnd.geo+json' f = lyr.GetNextFeature() native_data = f.GetNativeData() if i == 0: expected = [ '{ "type": "Feature", "foo": [ "bar", "baz", 1.000000, true, false, [ ], { } ], "properties": { "myprop": "myvalue" }, "geometry": null }', '{ "type": "Feature", "foo": [ "bar", "baz", 1.0, true, false, [ ], { } ], "properties": { "myprop": "myvalue" }, "geometry": null }'] else: expected = ['{"type":"Feature","foo":["bar","baz",1.0,true,false,[],{}],"properties":{"myprop":"myvalue"},"geometry":null}'] assert native_data in expected native_media_type = f.GetNativeMediaType() assert native_media_type == 'application/vnd.geo+json' ds = None if i == 1: gdal.Unlink('/vsimem/ogr_geojson_45.json') ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_45.json') lyr = ds.CreateLayer('test', options=[ 'NATIVE_DATA={ "type": "ignored", "bbox": [ 0, 0, 0, 0 ], "foo": "bar", "bar": "baz", "features": "ignored" }', 'NATIVE_MEDIA_TYPE=application/vnd.geo+json']) f = ogr.Feature(lyr.GetLayerDefn()) json_geom = """{ "type": "GeometryCollection", "foo_gc": "bar_gc", "geometries" : [ { "type": "Point", "foo_point": "bar_point", "coordinates": [0,1,2, 3] }, { "type": "LineString", "foo_linestring": "bar_linestring", "coordinates": [[0,1,2, 4]] }, { "type": "MultiPoint", "foo_multipoint": "bar_multipoint", "coordinates": [[0,1,2, 5]] }, { "type": "MultiLineString", "foo_multilinestring": "bar_multilinestring", "coordinates": [[[0,1,2, 6]]] }, { "type": "Polygon", "foo_polygon": "bar_polygon", "coordinates": [[[0,1,2, 7]]] }, { "type": "MultiPolygon", "foo_multipolygon": "bar_multipolygon", "coordinates": [[[[0,1,2, 8]]]] } ] }""" f.SetNativeData('{ "type": "ignored", "bbox": "ignored", "properties" : "ignored", "foo_feature": "bar_feature", "geometry": %s }' % json_geom) f.SetNativeMediaType('application/vnd.geo+json') f.SetGeometry(ogr.CreateGeometryFromJson(json_geom)) lyr.CreateFeature(f) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_45.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_45.json') assert ('"bbox": [ 0, 1, 2, 0, 1, 2 ],' in data and \ '"foo": "bar"' in data and '"bar": "baz"' in data and \ '"foo_feature": "bar_feature"' in data and \ '"foo_gc": "bar_gc"' in data and \ '"foo_point": "bar_point"' in data and '3' in data and \ '"foo_linestring": "bar_linestring"' in data and '4' in data and \ '"foo_multipoint": "bar_multipoint"' in data and '5' in data and \ '"foo_multilinestring": "bar_multilinestring"' in data and '6' in data and \ '"foo_polygon": "bar_polygon"' in data and '7' in data and \ '"foo_multipolygon": "bar_multipolygon"' in data and '8' in data) # Test native support with string id src_ds = gdal.OpenEx("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "foobarbaz", "properties": {}, "geometry": null } ] } """, open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON') got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "foobarbaz", "properties": { }, "geometry": null } ] } """ assert json.loads(got) == json.loads(expected) # Test native support with numeric id src_ds = gdal.OpenEx("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": 1234657890123, "properties": {}, "geometry": null } ] } """, open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON') got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": 1234657890123, "properties": { }, "geometry": null } ] } """ assert json.loads(got) == json.loads(expected) ############################################################################### # Test that writing JSon content as value of a string field is serialized as it def test_ogr_geojson_46(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_46.json') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('myprop')) f = ogr.Feature(lyr.GetLayerDefn()) f['myprop'] = '{ "a": "b" }' lyr.CreateFeature(f) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_46.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_46.json') assert '{ "myprop": { "a": "b" } }' in data ############################################################################### # Test update support def test_ogr_geojson_47(): if gdaltest.geojson_drv is None: pytest.skip() # ERROR 6: Update from inline definition not supported with gdaltest.error_handler(): ds = ogr.Open('{"type": "FeatureCollection", "features":[]}', update=1) assert ds is None gdal.FileFromMemBuffer('/vsimem/ogr_geojson_47.json', """{"type": "FeatureCollection", "foo": "bar", "features":[ { "type": "Feature", "bar": "baz", "properties": { "myprop": "myvalue" }, "geometry": null } ]}""") # Test read support ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetField("myprop", "another_value") lyr.SetFeature(f) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_47.json', 'rb') if fp is not None: data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) else: data = None # we don't want crs if there's no in the source assert ('"foo": "bar"' in data and '"bar": "baz"' in data and \ 'crs' not in data and \ '"myprop": "another_value"' in data) # Test append support ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(f) if f.GetFID() != 1: f.DumpReadable() pytest.fail() f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 3)')) lyr.CreateFeature(f) f = lyr.GetNextFeature() if f.GetFID() != 0: f.DumpReadable() pytest.fail() ds = None # Test append support ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(4 5)')) lyr.CreateFeature(f) f.SetField("myprop", "value_of_point_4_5") lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_geojson_47.json') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 4 ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_47.json', 'rb') if fp is not None: data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) else: data = None # we don't want crs if there's no in the source assert ('"foo": "bar"' in data and '"bar": "baz"' in data and \ 'crs' not in data and \ '"myprop": "another_value"' in data and \ '"myprop": "value_of_point_4_5"' in data and \ 'id' not in data) gdal.Unlink('/vsimem/ogr_geojson_47.json') # Test appending to empty features array gdal.FileFromMemBuffer('/vsimem/ogr_geojson_47.json', """{ "type": "FeatureCollection", "features": []}""") ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_geojson_47.json') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ds = None # Test appending to array ending with non feature gdal.FileFromMemBuffer('/vsimem/ogr_geojson_47.json', """{ "type": "FeatureCollection", "features": [ null ]}""") ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_geojson_47.json') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ds = None # Test appending to feature collection not ending with "features" gdal.FileFromMemBuffer('/vsimem/ogr_geojson_47.json', """{ "type": "FeatureCollection", "features": [], "something": "else"}""") ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_geojson_47.json') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_47.json', 'rb') if fp is not None: data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) else: data = None assert 'something' in data with gdaltest.config_option('OGR_GEOJSON_REWRITE_IN_PLACE', 'YES'): # Test appending to feature collection with "bbox" gdal.FileFromMemBuffer('/vsimem/ogr_geojson_47.json', """{ "type": "FeatureCollection", "bbox": [0,0,0,0], "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [0,0]} } ]}""") ds = ogr.Open('/vsimem/ogr_geojson_47.json', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_geojson_47.json') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_47.json', 'rb') if fp is not None: data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) else: data = None assert 'bbox' in data gdal.Unlink('/vsimem/ogr_geojson_47.json') ############################################################################### # Test update support with file that has a single feature not in a FeatureCollection def test_ogr_geojson_48(): if gdaltest.geojson_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_geojson_48.json', """{ "type": "Feature", "bar": "baz", "bbox": [2,49,2,49], "properties": { "myprop": "myvalue" }, "geometry": {"type": "Point", "coordinates": [ 2, 49]} }""") # Test read support ds = ogr.Open('/vsimem/ogr_geojson_48.json', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetField("myprop", "another_value") f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 50)')) lyr.SetFeature(f) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_48.json', 'rb') if fp is not None: data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) else: data = None gdal.Unlink('/vsimem/ogr_geojson_48.json') # we don't want crs if there's no in the source assert ('"bar": "baz"' in data and \ '"bbox": [ 3.0, 50.0, 3.0, 50.0 ]' in data and \ 'crs' not in data and \ 'FeatureCollection' not in data and \ '"myprop": "another_value"' in data) ############################################################################### # Test ARRAY_AS_STRING def test_ogr_geojson_49(): if gdaltest.geojson_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_geojson_49.json', """{ "type": "Feature", "properties": { "foo": ["bar"] }, "geometry": null }""") # Test read support ds = gdal.OpenEx('/vsimem/ogr_geojson_49.json', open_options=['ARRAY_AS_STRING=YES']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTString f = lyr.GetNextFeature() if f['foo'] != '[ "bar" ]': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_geojson_49.json') ############################################################################### # Test that we serialize floating point values with enough significant figures def test_ogr_geojson_50(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_50.json') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('val', ogr.OFTReal)) f = ogr.Feature(lyr.GetLayerDefn()) f['val'] = 1.23456789012456 lyr.CreateFeature(f) # To test smart rounding f = ogr.Feature(lyr.GetLayerDefn()) f['val'] = 5268.813 lyr.CreateFeature(f) f = None ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_50.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_50.json') assert '1.23456789012456' in data or '5268.813 ' in data # If SIGNIFICANT_FIGURES is explicitly specified, and COORDINATE_PRECISION not, # then it also applies to coordinates ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_50.json') lyr = ds.CreateLayer('test', options=['SIGNIFICANT_FIGURES=17']) lyr.CreateField(ogr.FieldDefn('val', ogr.OFTReal)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0.0000123456789012456 0)')) lyr.CreateFeature(f) f = None ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_50.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_50.json') assert '1.23456789012456' in data or '-5' in data # If SIGNIFICANT_FIGURES is explicitly specified, and COORDINATE_PRECISION too, # then SIGNIFICANT_FIGURES only applies to non-coordinates floating point values. ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_50.json') lyr = ds.CreateLayer('test', options=['COORDINATE_PRECISION=15', 'SIGNIFICANT_FIGURES=17']) lyr.CreateField(ogr.FieldDefn('val', ogr.OFTReal)) f = ogr.Feature(lyr.GetLayerDefn()) f['val'] = 1.23456789012456 f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0.0000123456789012456 0)')) lyr.CreateFeature(f) f = None ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_50.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_50.json') assert '0.00001234' in data and '1.23456789012456' in data ############################################################################### # Test writing empty geometries def test_ogr_geojson_51(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_51.json') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 f.SetGeometry(ogr.CreateGeometryFromWkt('POINT EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 2 f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 3 f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 4 f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 5 f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 6 f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 7 f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION EMPTY')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_51.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_51.json') assert '{ "id": 1 }, "geometry": null' in data assert '{ "id": 2 }, "geometry": { "type": "LineString", "coordinates": [ ] } }' in data assert '{ "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ ] } }' in data assert '{ "id": 4 }, "geometry": { "type": "MultiPoint", "coordinates": [ ] } }' in data assert '{ "id": 5 }, "geometry": { "type": "MultiLineString", "coordinates": [ ] } }' in data assert '{ "id": 6 }, "geometry": { "type": "MultiPolygon", "coordinates": [ ] } }' in data assert '{ "id": 7 }, "geometry": { "type": "GeometryCollection", "geometries": [ ] } }' in data ############################################################################### # Test NULL type detection def test_ogr_geojson_52(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('data/nullvalues.geojson') assert ds is not None, 'Failed to open datasource' assert ds.GetLayerCount() is 1, 'Wrong number of layers' lyr = ds.GetLayerByName('nullvalues') assert lyr is not None, 'Missing layer called nullvalues' fld = lyr.GetLayerDefn().GetFieldDefn(0) assert fld.GetNameRef() == 'int' assert fld.GetType() == ogr.OFTInteger fld = lyr.GetLayerDefn().GetFieldDefn(1) assert fld.GetNameRef() == 'string' assert fld.GetType() == ogr.OFTString fld = lyr.GetLayerDefn().GetFieldDefn(2) assert fld.GetNameRef() == 'double' assert fld.GetType() == ogr.OFTReal ############################################################################### # Test that M is ignored (this is a test of OGRLayer::CreateFeature() actually) def test_ogr_geojson_53(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_53.json') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 4)')) lyr.CreateFeature(f) ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_53.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_53.json') assert '{ "type": "Point", "coordinates": [ 1.0, 2.0, 3.0 ] }' in data ############################################################################### # Test NULL type detection when first value is null def test_ogr_geojson_54(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "int": null, "string": null, "double": null, "dt" : null, "boolean": null, "null": null }, "geometry": null }, { "type": "Feature", "properties": { "int": 168, "string": "string", "double": 1.23, "dt" : "2016-05-18T12:34:56Z", "boolean": true }, "geometry": null } ] } """) lyr = ds.GetLayer(0) fld = lyr.GetLayerDefn().GetFieldDefn(0) assert fld.GetType() == ogr.OFTInteger fld = lyr.GetLayerDefn().GetFieldDefn(1) assert fld.GetType() == ogr.OFTString fld = lyr.GetLayerDefn().GetFieldDefn(2) assert fld.GetType() == ogr.OFTReal fld = lyr.GetLayerDefn().GetFieldDefn(3) assert fld.GetType() == ogr.OFTDateTime fld = lyr.GetLayerDefn().GetFieldDefn(4) assert fld.GetType() == ogr.OFTInteger assert fld.GetSubType() == ogr.OFSTBoolean assert fld.GetWidth() == 1 fld = lyr.GetLayerDefn().GetFieldDefn(5) assert fld.GetType() == ogr.OFTString ############################################################################### # Test RFC 7946 def read_file(filename): f = gdal.VSIFOpenL(filename, "rb") if f is None: return None content = gdal.VSIFReadL(1, 10000, f).decode('UTF-8') gdal.VSIFCloseL(f) return content def test_ogr_geojson_55(): if gdaltest.geojson_drv is None: pytest.skip() # Basic test for standard bbox and coordinate truncation gdal.VectorTranslate('/vsimem/out.json', """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": 123, "properties": {}, "geometry": { "type": "Point", "coordinates": [2.123456789, 49] } }, { "type": "Feature", "id": 124, "properties": {}, "geometry": { "type": "Point", "coordinates": [3, 50] } } ] }""", options='-f GeoJSON -lco RFC7946=YES -lco WRITE_BBOX=YES -preserve_fid') got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 2.1234568, 49.0000000, 3.0000000, 50.0000000 ], "features": [ { "type": "Feature", "id": 123, "properties": { }, "bbox": [ 2.1234568, 49.0, 2.1234568, 49.0 ], "geometry": { "type": "Point", "coordinates": [ 2.1234568, 49.0 ] } }, { "type": "Feature", "id": 124, "properties": { }, "bbox": [ 3.0, 50.0, 3.0, 50.0 ], "geometry": { "type": "Point", "coordinates": [ 3.0, 50.0 ] } } ] } """ assert json.loads(got) == json.loads(expected) # Test polygon winding order gdal.VectorTranslate('/vsimem/out.json', """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[[2,49],[3,49],[3,50],[2,50],[2,49]],[[2.1,49.1],[2.1,49.9],[2.9,49.9],[2.9,49.1],[2.1,49.1]]] } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[[2,49],[2,50],[3,50],[3,49],[2,49]],[[2.1,49.1],[2.9,49.1],[2.9,49.9],[2.1,49.9],[2.1,49.1]]] } }, ] } """, format='GeoJSON', layerCreationOptions=['RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 2.0000000, 49.0000000, 3.0000000, 50.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 2.0, 49.0, 3.0, 50.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.0, 49.0 ], [ 3.0, 49.0 ], [ 3.0, 50.0 ], [ 2.0, 50.0 ], [ 2.0, 49.0 ] ], [ [ 2.1, 49.1 ], [ 2.1, 49.9 ], [ 2.9, 49.9 ], [ 2.9, 49.1 ], [ 2.1, 49.1 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 2.0, 49.0, 3.0, 50.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 2.0, 49.0 ], [ 3.0, 49.0 ], [ 3.0, 50.0 ], [ 2.0, 50.0 ], [ 2.0, 49.0 ] ], [ [ 2.1, 49.1 ], [ 2.1, 49.9 ], [ 2.9, 49.9 ], [ 2.9, 49.1 ], [ 2.1, 49.1 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Test foreign member src_ds = gdal.OpenEx("""{ "type": "FeatureCollection", "coordinates": "should not be found in output", "geometries": "should not be found in output", "geometry": "should not be found in output", "properties": "should not be found in output", "valid": "should be in output", "crs": "should not be found in output", "bbox": [0,0,0,0], "features": [ { "type": "Feature", "id": ["not expected as child of features"], "coordinates": "should not be found in output", "geometries": "should not be found in output", "features": "should not be found in output", "valid": "should be in output", "properties": { "foo": "bar" }, "geometry": { "type": "Point", "bbox": [0,0,0,0], "geometry": "should not be found in output", "properties": "should not be found in output", "features": "should not be found in output", "valid": "should be in output", "coordinates": [2,49] } } ] } """, open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['RFC7946=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "valid": "should be in output", "bbox": [ 2.0000000, 49.0000000, 2.0000000, 49.0000000 ], "features": [ { "type": "Feature", "valid": "should be in output", "properties": { "id": [ "not expected as child of features" ], "foo": "bar" }, "geometry": { "type": "Point", "coordinates": [ 2.0, 49.0 ], "valid": "should be in output" } } ] } """ assert json.loads(got) == json.loads(expected) ############################################################################### # Test RFC 7946 (that require geos) def test_ogr_geojson_56(): if gdaltest.geojson_drv is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() # Test offsetting longitudes beyond antimeridian gdal.VectorTranslate('/vsimem/out.json', """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [182, 49] } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-183, 50] } }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[-183, 51],[-182, 48]] } }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[182, 52],[183, 47]] } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[[-183, 51],[-183, 48],[-182, 48],[-183, 48],[-183, 51]]] } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[[183, 51],[183, 48],[182, 48],[183, 48],[183, 51]]] } }, ] }""", format='GeoJSON', layerCreationOptions=['RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ -178.0000000, 47.0000000, 178.0000000, 52.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ -178.0, 49.0, -178.0, 49.0 ], "geometry": { "type": "Point", "coordinates": [ -178.0, 49.0 ] } }, { "type": "Feature", "properties": { }, "bbox": [ 177.0, 50.0, 177.0, 50.0 ], "geometry": { "type": "Point", "coordinates": [ 177.0, 50.0 ] } }, { "type": "Feature", "properties": { }, "bbox": [ 177.0, 48.0, 178.0, 51.0 ], "geometry": { "type": "LineString", "coordinates": [ [ 177.0, 51.0 ], [ 178.0, 48.0 ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ -178.0, 47.0, -177.0, 52.0 ], "geometry": { "type": "LineString", "coordinates": [ [ -178.0, 52.0 ], [ -177.0, 47.0 ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 177.0, 48.0, 178.0, 51.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 177.0, 51.0 ], [ 177.0, 48.0 ], [ 178.0, 48.0 ], [ 177.0, 48.0 ], [ 177.0, 51.0 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ -178.0, 48.0, -177.0, 51.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ -177.0, 51.0 ], [ -177.0, 48.0 ], [ -178.0, 48.0 ], [ -177.0, 48.0 ], [ -177.0, 51.0 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Test geometries across the antimeridian gdal.VectorTranslate('/vsimem/out.json', """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[179, 51],[-179, 48]] } }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [[-179, 52],[179, 47]] } }, { "type": "Feature", "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 179.0, 51.0 ], [ 180.0, 49.5 ] ], [ [ -180.0, 49.5 ], [ -179.0, 48.0 ] ] ] } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[[177, 51],[-175, 51],[-175, 48],[177, 48],[177, 51]]] } }, { "type": "Feature", "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 177.0, 51.0 ], [ 177.0, 48.0 ], [ 180.0, 48.0 ], [ 180.0, 51.0 ], [ 177.0, 51.0 ] ] ], [ [ [ -180.0, 51.0 ], [ -180.0, 48.0 ], [ -175.0, 48.0 ], [ -175.0, 51.0 ], [ -180.0, 51.0 ] ] ] ] } } ] }""", format='GeoJSON', layerCreationOptions=['RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 177.0000000, 47.0000000, -175.0000000, 52.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 179.0, 48.0, -179.0, 51.0 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 179.0, 51.0 ], [ 180.0, 49.5 ] ], [ [ -180.0, 49.5 ], [ -179.0, 48.0 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 179.0, 47.0, -179.0, 52.0 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -179.0, 52.0 ], [ -180.0, 49.5 ] ], [ [ 180.0, 49.5 ], [ 179.0, 47.0 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 179.0, 48.0, -179.0, 51.0 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 179.0, 51.0 ], [ 180.0, 49.5 ] ], [ [ -180.0, 49.5 ], [ -179.0, 48.0 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 177.0, 48.0, -175.0, 51.0 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 177.0, 51.0 ], [ 177.0, 48.0 ], [ 180.0, 48.0 ], [ 180.0, 51.0 ], [ 177.0, 51.0 ] ] ], [ [ [ -180.0, 51.0 ], [ -180.0, 48.0 ], [ -175.0, 48.0 ], [ -175.0, 51.0 ], [ -180.0, 51.0 ] ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 177.0, 48.0, -175.0, 51.0 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 177.0, 51.0 ], [ 177.0, 48.0 ], [ 180.0, 48.0 ], [ 180.0, 51.0 ], [ 177.0, 51.0 ] ] ], [ [ [ -180.0, 51.0 ], [ -180.0, 48.0 ], [ -175.0, 48.0 ], [ -175.0, 51.0 ], [ -180.0, 51.0 ] ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) ############################################################################### # Test RFC 7946 and reprojection def test_ogr_geojson_57(): if gdaltest.geojson_drv is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() # Standard case: EPSG:32662: WGS 84 / Plate Carre src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2000000 2000000,2000000 -2000000,-2000000 -2000000,-2000000 2000000,2000000 2000000))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ -17.9663057, -17.9663057, 17.9663057, 17.9663057 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ -17.9663057, -17.9663057, 17.9663057, 17.9663057 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 17.9663057, 17.9663057 ], [ -17.9663057, 17.9663057 ], [ -17.9663057, -17.9663057 ], [ 17.9663057, -17.9663057 ], [ 17.9663057, 17.9663057 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Polar case: EPSG:3995: WGS 84 / Arctic Polar Stereographic src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2000000 2000000,2000000 -2000000,-2000000 -2000000,-2000000 2000000,2000000 2000000))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((-2000000 -2000000,-1000000 -2000000,-1000000 2000000,-2000000 2000000,-2000000 -2000000))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ -180.0000000, 64.3861643, 180.0000000, 90.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ -180.0, 64.3861643, 180.0, 90.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.0, 64.3861643 ], [ 180.0, 71.7425119 ], [ 180.0, 90.0 ], [ -180.0, 90.0 ], [ -180.0, 71.7425119 ], [ -135.0, 64.3861643 ], [ -45.0, 64.3861643 ], [ 45.0, 64.3861643 ], [ 135.0, 64.3861643 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ -153.4349488, 64.3861643, -26.5650512, 69.6286694 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ -45.0, 64.3861643 ], [ -26.5650512, 69.6286694 ], [ -153.4349488, 69.6286694 ], [ -135.0, 64.3861643 ], [ -45.0, 64.3861643 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Polar case: slice of spherical cap (not intersecting antimeridian, west hemisphere) src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((-2000000 2000000,0 0,-2000000 -2000000,-2000000 2000000))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ -135.0000000, 64.3861643, -45.0000000, 90.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ -135.0, 64.3861643, -45.0, 90.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ -135.0, 64.3861643 ], [ -45.0, 64.3861643 ], [ -45.0, 90.0 ], [ -135.0, 90.0 ], [ -135.0, 64.3861643 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Polar case: slice of spherical cap (not intersecting antimeridian, east hemisphere) src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((2000000 2000000,0 0,2000000 -2000000,2000000 2000000)))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 45.0000000, 64.3861643, 135.0000000, 90.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 45.0, 64.3861643, 135.0, 90.0 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.0, 64.3861643 ], [ 135.0, 90.0 ], [ 45.0, 90.0 ], [ 45.0, 64.3861643 ], [ 135.0, 64.3861643 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Polar case: slice of spherical cap crossing the antimeridian src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((100000 100000,-100000 100000,0 0,100000 100000))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 135.0000000, 88.6984598, -135.0000000, 90.0000000 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 135.0, 88.6984598, -135.0, 90.0 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 180.0, 89.0796531 ], [ 180.0, 90.0 ], [ 135.0, 88.6984598 ], [ 180.0, 89.0796531 ] ] ], [ [ [ -180.0, 90.0 ], [ -180.0, 89.0796531 ], [ -135.0, 88.6984598 ] ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Polar case: EPSG:3031: WGS 84 / Antarctic Polar Stereographic src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((2000000 2000000,2000000 -2000000,-2000000 -2000000,-2000000 2000000,2000000 2000000)))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ -180.0000000, -90.0000000, 180.0000000, -64.3861643 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ -180.0, -90.0, 180.0, -64.3861643 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.0, -64.3861643 ], [ -45.0, -64.3861643 ], [ -135.0, -64.3861643 ], [ -180.0, -71.7425119 ], [ -180.0, -90.0 ], [ 180.0, -90.0 ], [ 180.0, -71.7425119 ], [ 135.0, -64.3861643 ], [ 45.0, -64.3861643 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) # Antimeridian case: EPSG:32660: WGS 84 / UTM zone 60N with polygon and line crossing src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=utm +zone=60 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((670000 4000000,850000 4000000,850000 4100000,670000 4100000,670000 4000000))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((670000 4000000,850000 4100000))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(670000 0,850000 0)')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 178.5275649, 0.0000000, -179.0681936, 37.0308258 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 178.8892102, 36.0816324, -179.0681936, 37.0308258 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 180.0, 36.1071354 ], [ 180.0, 37.0082839 ], [ 178.9112998, 37.0308258 ], [ 178.8892102, 36.1298163 ], [ 180.0, 36.1071354 ] ] ], [ [ [ -179.0681936, 36.9810434 ], [ -180.0, 37.0082839 ], [ -180.0, 36.1071354 ], [ -179.1135277, 36.0816324 ], [ -179.0681936, 36.9810434 ] ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 178.8892102, 36.1298163, -179.0681936, 36.9810434 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 178.8892102, 36.1298163 ], [ 180.0, 36.5995612 ] ], [ [ -180.0, 36.5995612 ], [ -179.0681936, 36.9810434 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 178.5275649, 0.0, -179.8562277, 0.0 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 178.5275649, 0.0 ], [ 180.0, 0.0 ] ], [ [ -180.0, 0.0 ], [ -179.8562277, 0.0 ] ] ] } } ] } """ # with proj 4.9.3 expected2 = """{ "type": "FeatureCollection", "bbox": [ 178.5275649, 0.0000000, -179.0681936, 37.0308258 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 178.8892102, 36.0816324, -179.0681936, 37.0308258 ], "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -179.0681936, 36.9810434 ], [ -180.0, 37.0082839 ], [ -180.0, 36.1071354 ], [ -179.1135277, 36.0816324 ], [ -179.0681936, 36.9810434 ] ] ], [ [ [ 178.8892102, 36.1298163 ], [ 180.0, 36.1071354 ], [ 180.0, 37.0082839 ], [ 178.9112998, 37.0308258 ], [ 178.8892102, 36.1298163 ] ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 178.8892102, 36.1298163, -179.0681936, 36.9810434 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 178.8892102, 36.1298163 ], [ 180.0, 36.5995612 ] ], [ [ -180.0, 36.5995612 ], [ -179.0681936, 36.9810434 ] ] ] } }, { "type": "Feature", "properties": { }, "bbox": [ 178.5275649, 0.0, -179.8562277, 0.0 ], "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 178.5275649, 0.0 ], [ 180.0, 0.0 ] ], [ [ -180.0, 0.0 ], [ -179.8562277, 0.0 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) or json.loads(got) == json.loads(expected2) # Antimeridian case: EPSG:32660: WGS 84 / UTM zone 60N wit polygon on west of antimeridian src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=utm +zone=60 +datum=WGS84 +units=m +no_defs') lyr = src_ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((670000 4000000,700000 4000000,700000 4100000,670000 4100000,670000 4000000))')) lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/out.json', src_ds, format='GeoJSON', layerCreationOptions=['WRITE_NAME=NO', 'RFC7946=YES', 'WRITE_BBOX=YES']) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') expected = """{ "type": "FeatureCollection", "bbox": [ 178.8892102, 36.1240958, 179.2483693, 37.0308258 ], "features": [ { "type": "Feature", "properties": { }, "bbox": [ 178.8892102, 36.1240958, 179.2483693, 37.0308258 ], "geometry": { "type": "Polygon", "coordinates": [ [ [ 178.8892102, 36.1298163 ], [ 179.2223914, 36.1240958 ], [ 179.2483693, 37.0249155 ], [ 178.9112998, 37.0308258 ], [ 178.8892102, 36.1298163 ] ] ] } } ] } """ assert json.loads(got) == json.loads(expected) ############################################################################### # Test using the name member of FeatureCollection def test_ogr_geojson_58(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('{ "type": "FeatureCollection", "name": "layer_name", "features": []}') assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayerByName('layer_name') assert lyr is not None, 'Missing layer called layer_name' ds = None ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_58.json') lyr = ds.CreateLayer('foo') ds = None ds = ogr.Open('/vsimem/ogr_geojson_58.json') assert ds.GetLayerByName('foo') is not None, 'Missing layer called foo' ds = None gdal.Unlink('/vsimem/ogr_geojson_58.json') ############################################################################### # Test using the description member of FeatureCollection def test_ogr_geojson_59(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open('{ "type": "FeatureCollection", "description": "my_description", "features": []}') assert ds is not None, 'Failed to open datasource' lyr = ds.GetLayer(0) assert lyr.GetMetadataItem('DESCRIPTION') == 'my_description', \ 'Did not get DESCRIPTION' ds = None ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('/vsimem/ogr_geojson_59.json') lyr = ds.CreateLayer('foo', options=['DESCRIPTION=my desc']) ds = None ds = ogr.Open('/vsimem/ogr_geojson_59.json') lyr = ds.GetLayerByName('foo') assert lyr.GetMetadataItem('DESCRIPTION') == 'my desc', 'Did not get DESCRIPTION' ds = None gdal.Unlink('/vsimem/ogr_geojson_59.json') ############################################################################### # Test null vs unset field def test_ogr_geojson_60(): if gdaltest.geojson_drv is None: pytest.skip() ds = gdal.OpenEx("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties" : { "foo" : "bar" } }, { "type": "Feature", "properties" : { "foo": null } }, { "type": "Feature", "properties" : { } } ] }""") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['foo'] != 'bar': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if not f.IsFieldNull('foo'): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('foo'): f.DumpReadable() pytest.fail() # Test writing side gdal.VectorTranslate('/vsimem/ogr_geojson_60.json', ds, format='GeoJSON') fp = gdal.VSIFOpenL('/vsimem/ogr_geojson_60.json', 'rb') data = gdal.VSIFReadL(1, 10000, fp).decode('ascii') gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/ogr_geojson_60.json') assert ('"properties": { "foo": "bar" }' in data and \ '"properties": { "foo": null }' in data and \ '"properties": { }' in data) ############################################################################### # Test corner cases def test_ogr_geojson_61(): # Invalid JSon gdal.FileFromMemBuffer('/vsimem/ogr_geojson_61.json', """{ "type": "FeatureCollection", "features": [""") with gdaltest.error_handler(): ds = gdal.OpenEx('/vsimem/ogr_geojson_61.json') assert ds is None gdal.Unlink('/vsimem/ogr_geojson_61.json') # Invalid single geometry with gdaltest.error_handler(): ds = gdal.OpenEx("""{ "type": "Point", "x" : { "coordinates" : null } } """) assert ds is None # Empty property name gdal.FileFromMemBuffer('/vsimem/ogr_geojson_61.json', """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {"": 1}, "geometry": null }] }""") ds = gdal.OpenEx('/vsimem/ogr_geojson_61.json') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetField("") == 1 ds = None gdal.Unlink('/vsimem/ogr_geojson_61.json') ############################################################################### # Test crs object def test_ogr_geojson_62(): # crs type=name tests gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name" }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":null }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":1 }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":null} }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":1} }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name":"x"} }, "features":[] }""") ds = gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name": "urn:ogc:def:crs:EPSG::32631"} }, "features":[] }""") lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs.GetAuthorityCode(None) == '32631' assert srs.GetDataAxisToSRSAxisMapping() == [1, 2] # See https://github.com/OSGeo/gdal/issues/2035 ds = gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"name", "properties":{"name": "urn:ogc:def:crs:OGC:1.3:CRS84"} }, "features":[] }""") lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs.GetAuthorityCode(None) == '4326' assert srs.GetDataAxisToSRSAxisMapping() == [2, 1] # crs type=EPSG (not even documented in GJ2008 spec!) tests. Just for coverage completeness gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG" }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":null }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":1 }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code":null} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code":1} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code":"x"} }, "features":[] }""") ds = gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"EPSG", "properties":{"code": 32631} }, "features":[] }""") lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs.ExportToWkt().find('32631') >= 0 # crs type=link tests gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link" }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":null }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":1 }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":{"href":null} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":{"href":1} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"link", "properties":{"href": "1"} }, "features":[] }""") # crs type=OGC (not even documented in GJ2008 spec!) tests. Just for coverage completeness gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC" }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":null }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":1 }, "features":[] }""") gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":{"urn":null} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":{"urn":1} }, "features":[] }""") with gdaltest.error_handler(): gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":{"urn":"x"} }, "features":[] }""") ds = gdal.OpenEx("""{ "type": "FeatureCollection", "crs": { "type":"OGC", "properties":{"urn": "urn:ogc:def:crs:EPSG::32631"} }, "features":[] }""") lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() assert srs.ExportToWkt().find('32631') >= 0 ############################################################################### # Extensive test of field tye promotion def test_ogr_geojson_63(): ds_ref = ogr.Open('data/test_type_promotion_ref.json') lyr_ref = ds_ref.GetLayer(0) ds = ogr.Open('data/test_type_promotion.json') lyr = ds.GetLayer(0) return ogrtest.compare_layers(lyr, lyr_ref) ############################################################################### # Test exporting XYM / XYZM (#6935) def test_ogr_geojson_64(): g = ogr.CreateGeometryFromWkt('POINT ZM(1 2 3 4)') assert (ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(g.ExportToJson()), ogr.CreateGeometryFromWkt('POINT Z(1 2 3)')) == 0) g = ogr.CreateGeometryFromWkt('POINT M(1 2 3)') assert (ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(g.ExportToJson()), ogr.CreateGeometryFromWkt('POINT (1 2)')) == 0) g = ogr.CreateGeometryFromWkt('LINESTRING ZM(1 2 3 4,5 6 7 8)') assert (ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(g.ExportToJson()), ogr.CreateGeometryFromWkt('LINESTRING Z(1 2 3,5 6 7)')) == 0) g = ogr.CreateGeometryFromWkt('LINESTRING M(1 2 3,4 5 6)') assert (ogrtest.check_feature_geometry(ogr.CreateGeometryFromJson(g.ExportToJson()), ogr.CreateGeometryFromWkt('LINESTRING (1 2,4 5)')) == 0) ############################################################################### # Test feature geometry CRS when CRS set on the FeatureCollection # See https://github.com/r-spatial/sf/issues/449#issuecomment-319369945 def test_ogr_geojson_65(): ds = ogr.Open("""{ "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32631" } }, "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [500000,4500000]}, "properties": { }}]}""") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() srs = f.GetGeometryRef().GetSpatialReference() pcs = int(srs.GetAuthorityCode('PROJCS')) assert pcs == 32631, 'Spatial reference for individual geometry was not valid' ############################################################################### # Test features with properties not being a dictionary def test_ogr_geojson_66(): ds = ogr.Open("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": null, "properties": null }, { "type": "Feature", "geometry": null, "properties": [] } ]}""") lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 0 ############################################################################### # Test reading GeoJSON files starting with {"features":[{"geometry":.... (#7198) def test_ogr_geojson_67(): ds = ogr.Open('data/grenada.geojson') assert ds is not None assert ds.GetDriver().GetName() == 'GeoJSON' lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ############################################################################### # Test reading ESRIJSON files starting with {"features":[{"geometry":.... (#7198) def test_ogr_geojson_68(): ds = ogr.Open('data/esrijsonstartingwithfeaturesgeometry.json') assert ds is not None assert ds.GetDriver().GetName() == 'ESRIJSON' lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ############################################################################### def test_ogr_geojson_id_field_and_id_type(): gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', options='-f GeoJSON -lco ID_TYPE=String -preserve_fid -limit 1 -fid 2') got = read_file('/vsimem/out.json') assert '"id": "2", "properties": { "AREA": 261752.781, "EAS_ID": 171, "PRFEDEA": "35043414" }' in got gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', options='-f GeoJSON -lco ID_TYPE=Integer -preserve_fid -limit 1 -fid 2') got = read_file('/vsimem/out.json') assert '"id": 2, "properties": { "AREA": 261752.781, "EAS_ID": 171, "PRFEDEA": "35043414" }' in got gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_FIELD=EAS_ID'], limit=1) got = read_file('/vsimem/out.json') assert '"id": 168, "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON') src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": 168, "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON', layerCreationOptions=['ID_TYPE=String']) src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": "168", "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON', layerCreationOptions=['ID_TYPE=Integer']) src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": 168, "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got gdal.Unlink('/vsimem/out.json') gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_FIELD=EAS_ID', 'ID_TYPE=String'], limit=1) got = read_file('/vsimem/out.json') assert '"id": "168", "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON') src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": "168", "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON', layerCreationOptions=['ID_TYPE=String']) src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": "168", "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got src_ds = gdal.OpenEx('/vsimem/out.json', open_options=['NATIVE_DATA=YES']) gdal.VectorTranslate('/vsimem/out2.json', src_ds, format='GeoJSON', layerCreationOptions=['ID_TYPE=Integer']) src_ds = None got = read_file('/vsimem/out2.json') gdal.Unlink('/vsimem/out2.json') assert '"id": 168, "properties": { "AREA": 215229.266, "PRFEDEA": "35043411" }' in got gdal.Unlink('/vsimem/out.json') gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_FIELD=PRFEDEA'], limit=1) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') assert '"id": "35043411", "properties": { "AREA": 215229.266, "EAS_ID": 168 }' in got gdal.VectorTranslate('/vsimem/out.json', 'data/poly.shp', format='GeoJSON', layerCreationOptions=['ID_FIELD=PRFEDEA', 'ID_TYPE=Integer'], limit=1) got = read_file('/vsimem/out.json') gdal.Unlink('/vsimem/out.json') assert '"id": 35043411, "properties": { "AREA": 215229.266, "EAS_ID": 168 }' in got ############################################################################### def test_ogr_geojson_geom_export_failure(): g = ogr.CreateGeometryFromWkt('POINT EMPTY') geojson = g.ExportToJson() assert geojson is None g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(TIN EMPTY)') geojson = json.loads(g.ExportToJson()) assert geojson == {"type": "GeometryCollection", "geometries": None} g = ogr.Geometry(ogr.wkbLineString) g.AddPoint_2D(float('nan'), 0) with gdaltest.error_handler(): geojson = g.ExportToJson() assert geojson is None g = ogr.Geometry(ogr.wkbPolygon) lr = ogr.Geometry(ogr.wkbLinearRing) lr.AddPoint_2D(0, 0) lr.AddPoint_2D(0, 1) lr.AddPoint_2D(1, 1) lr.AddPoint_2D(0, 0) g.AddGeometry(lr) lr = ogr.Geometry(ogr.wkbLinearRing) lr.AddPoint_2D(0, 0) lr.AddPoint_2D(float('nan'), 1) lr.AddPoint_2D(1, 1) lr.AddPoint_2D(0, 0) g.AddGeometry(lr) with gdaltest.error_handler(): geojson = g.ExportToJson() assert geojson is None ############################################################################### def test_ogr_geojson_starting_with_crs(): ds = ogr.Open("""{ "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32631" } }, "type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [500000,4500000]}, "properties": { }}]}""") assert ds is not None ############################################################################### # Test we properly flush the file in SyncToDisk() in append situations def test_ogr_geojson_append_flush(): tmpfilename = 'tmp/ogr_geojson_append_flush.json' f = gdal.VSIFOpenL(tmpfilename, 'wb') content = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "x": 1, "y": 2, "z": 3, "w": 4 }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } } ] }""" gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) ds = ogr.Open(tmpfilename, update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f['x'] = 10 lyr.CreateFeature(f) lyr.SyncToDisk() ds2 = ogr.Open(tmpfilename, update=1) lyr = ds2.GetLayer(0) lyr.GetNextFeature() f = lyr.GetNextFeature() assert f is not None and f['x'] == 10 ds = None ds2 = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_empty_geometrycollection(): g = ogr.CreateGeometryFromJson('{"type": "GeometryCollection", "geometries": []}') assert g.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' ############################################################################### def test_ogr_esrijson_without_geometryType(): ds = ogr.Open("""{ "spatialReference" : { "wkid" : 4326 }, "fields": [], "fieldAliases": {}, "features" : [ { "geometry" : { "x" : 2, "y" : 49 }, "attributes" : { } } ] } """) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef() is not None ############################################################################### def test_ogr_geojson_read_fields_with_different_case(): ds = ogr.Open("""{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "my_id", "geometry": null, "properties": { "ID": "MY_ID", "x": "foo", "X": "FOO"} } ]}""") lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField(0) != 'my_id' or f.GetField(1) != 'MY_ID' or f.GetField(2) != 'foo' or f.GetField(3) != 'FOO': f.DumpReadable() pytest.fail() ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1068 def test_ogr_geojson_clip_geometries_rfc7946(): if not ogrtest.have_geos(): pytest.skip() tmpfilename = '/vsimem/out.json' gdal.VectorTranslate(tmpfilename, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[-220,-20],[-220,30],[16,30],[16,-20],[-220,-20]]]} }, { "type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[220,40],[220,70],[-16,70],[-16,40],[220,40]]]} }, { "type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[170,-40],[170,-70],[-16,70],[-16,-40],[170,-40]]]} } ] }""", options='-f GeoJSON -lco RFC7946=YES') ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((-180 30,-180 -20,16 -20,16 30,-180 30)),((140 -20,180 -20,180 30,140 30,140 -20)))') if ogrtest.check_feature_geometry(f, ref_geom) != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((180 40,180 70,-16 70,-16 40,180 40)),((-180 70,-180 40,-140 40,-140 70,-180 70)))') if ogrtest.check_feature_geometry(f, ref_geom) != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() ref_geom = ogr.CreateGeometryFromWkt('POLYGON ((170 -40,-16 -40,-16 70,170 -70,170 -40))') if ogrtest.check_feature_geometry(f, ref_geom) != 0: f.DumpReadable() pytest.fail() ds = None gdal.Unlink(tmpfilename) ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1109 def test_ogr_geojson_non_finite(): json_content = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "inf_prop": infinity, "minus_inf_prop": -infinity, "nan_prop": nan }, "geometry": null } ] }""" with gdaltest.error_handler(): ds = ogr.Open(json_content) if ds is None: # Might fail with older libjson-c versions pytest.skip() lyr = ds.GetLayer(0) f = lyr.GetNextFeature() for i in range(3): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTReal if f['inf_prop'] != float('inf'): f.DumpReadable() pytest.fail() if f['minus_inf_prop'] != float('-inf'): f.DumpReadable() pytest.fail() if not math.isnan(f['nan_prop']): f.DumpReadable() pytest.fail(str(f['nan_prop'])) ds = None tmpfilename = '/vsimem/out.json' with gdaltest.error_handler(): gdal.VectorTranslate(tmpfilename, json_content, options='-f GeoJSON') ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 0 ds = None gdal.VectorTranslate(tmpfilename, json_content, options='-f GeoJSON -lco WRITE_NON_FINITE_VALUES=YES') ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 3 f = lyr.GetNextFeature() if f['inf_prop'] != float('inf'): f.DumpReadable() pytest.fail() if f['minus_inf_prop'] != float('-inf'): f.DumpReadable() pytest.fail() if not math.isnan(f['nan_prop']): f.DumpReadable() pytest.fail(str(f['nan_prop'])) ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_random_reading_with_id(): json_content = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": 1, "properties": { "a": "a" }, "geometry": null }, { "type": "Feature", "id": 2, "properties": { "a": "bc" }, "geometry": null } ] }""" tmpfilename = '/vsimem/temp.json' gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) f1_ref = lyr.GetNextFeature() f2_ref = lyr.GetNextFeature() f1 = lyr.GetFeature(1) f2 = lyr.GetFeature(2) assert f1.Equal(f1_ref) assert f2.Equal(f2_ref) assert not lyr.GetFeature(3) ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_random_reading_without_id(): json_content = """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "a": "a" }, "geometry": null }, { "type": "Feature", "properties": { "a": "bc" }, "geometry": null } ] }""" tmpfilename = '/vsimem/temp.json' gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) f1_ref = lyr.GetNextFeature() f2_ref = lyr.GetNextFeature() f1 = lyr.GetFeature(0) f2 = lyr.GetFeature(1) assert f1.Equal(f1_ref) assert f2.Equal(f2_ref) assert not lyr.GetFeature(2) ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_single_feature_random_reading_with_id(): json_content = """ { "type": "Feature", "id": 1, "properties": { "a": "a" }, "geometry": null } }""" tmpfilename = '/vsimem/temp.json' gdal.FileFromMemBuffer(tmpfilename, json_content) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) f1_ref = lyr.GetNextFeature() f1 = lyr.GetFeature(1) assert f1.Equal(f1_ref) ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_3D_geom_type(): if gdaltest.geojson_drv is None: pytest.skip() ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2,3]}, "properties": null}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2,4]}, "properties": null} ]}""") lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint25D ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2,3]}, "properties": null}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": null} ]}""") lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint25D ds = ogr.Open("""{"type": "FeatureCollection", "features":[ {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2]}, "properties": null}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,2,4]}, "properties": null} ]}""") lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint25D ############################################################################### def test_ogr_geojson_update_in_loop(): if gdaltest.geojson_drv is None: pytest.skip() tmpfilename = '/vsimem/temp.json' # No explicit id gdal.FileFromMemBuffer(tmpfilename, '{"type": "FeatureCollection", "name": "test", "features": [{ "type": "Feature", "properties": { "foo": 1 }, "geometry": null }, { "type": "Feature", "properties": { "foo": 2 }, "geometry": null }]}') ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR | gdal.GA_Update) layer = ds.GetLayer() fids = [] for feature in layer: fids.append(feature.GetFID()) layer.SetFeature(feature) assert fids == [0, 1] ds = None # Explicit id no holes gdal.FileFromMemBuffer(tmpfilename, '{"type": "FeatureCollection", "name": "test", "features": [{ "type": "Feature", "id": 0, "properties": { "foo": 1 }, "geometry": null }, { "type": "Feature", "properties": { "foo": 2 }, "id": 1, "geometry": null }]}') ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR | gdal.GA_Update) layer = ds.GetLayer() fids = [] for feature in layer: fids.append(feature.GetFID()) layer.SetFeature(feature) assert fids == [0, 1] ds = None # Explicit id with holes gdal.FileFromMemBuffer(tmpfilename, '{"type": "FeatureCollection", "name": "test", "features": [{ "type": "Feature", "id": 1, "properties": { "foo": 1 }, "geometry": null }, { "type": "Feature", "properties": { "foo": 2 }, "id": 3, "geometry": null }]}') ds = gdal.OpenEx(tmpfilename, gdal.OF_VECTOR | gdal.GA_Update) layer = ds.GetLayer() fids = [] for feature in layer: fids.append(feature.GetFID()) layer.SetFeature(feature) assert fids == [1, 3] ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_geojson_cleanup(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) try: if gdaltest.tests is not None: gdal.PushErrorHandler('CPLQuietErrorHandler') for i in range(len(gdaltest.tests)): fname = os.path.join('tmp', gdaltest.tests[i][0] + '.geojson') ogr.GetDriverByName('GeoJSON').DeleteDataSource(fname) fname = os.path.join('tmp', gdaltest.tests[i][0] + '.geojson.gz') gdal.Unlink(fname) fname = os.path.join('tmp', gdaltest.tests[i][0] + '.geojson.gz.properties') gdal.Unlink(fname) gdal.PopErrorHandler() gdaltest.tests = None except: pass try: os.remove('tmp/out_ogr_geojson_14.geojson') except OSError: pass for f in gdal.ReadDir('/vsimem/geojson'): gdal.Unlink('/vsimem/geojson/' + f) gdalautotest-3.0.4/ogr/ogr_geoconcept.py0000755003401500001440000002237013614005325017774 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_geoconcept.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR Geoconcept driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # 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 os import gdaltest import ogrtest from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Simple read test of known file. def test_ogr_gxt_1(): gdaltest.gxt_ds = ogr.Open('data/expected_000_GRD.gxt') assert gdaltest.gxt_ds is not None assert gdaltest.gxt_ds.GetLayerCount() == 1, 'Got wrong layer count.' lyr = gdaltest.gxt_ds.GetLayer(0) assert lyr.GetName() == '000_GRD.000_GRD', 'got unexpected layer name.' assert lyr.GetFeatureCount() == 10, 'got wrong feature count.' expect = ['000-2007-0050-7130-LAMB93', '000-2007-0595-7130-LAMB93', '000-2007-0595-6585-LAMB93', '000-2007-1145-6250-LAMB93', '000-2007-0050-6585-LAMB93', '000-2007-0050-7130-LAMB93', '000-2007-0595-7130-LAMB93', '000-2007-0595-6585-LAMB93', '000-2007-1145-6250-LAMB93', '000-2007-0050-6585-LAMB93'] tr = ogrtest.check_features_against_list(lyr, 'idSel', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((50000 7130000,600000 7130000,600000 6580000,50000 6580000,50000 7130000)))', max_error=0.000000001) == 0) srs = osr.SpatialReference() srs.SetFromUserInput('PROJCS["Lambert 93",GEOGCS["unnamed",DATUM["ITRS-89",SPHEROID["GRS 80",6378137,298.257222099657],TOWGS84[0,0,0,0,0,0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",44],PARAMETER["standard_parallel_2",49],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1]]') assert lyr.GetSpatialRef().IsSame(srs), 'SRS is not the one expected.' ############################################################################### # Similar test than previous one with TAB separator. def test_ogr_gxt_2(): gdaltest.gxt_ds = ogr.Open('data/expected_000_GRD_TAB.txt') assert gdaltest.gxt_ds is not None assert gdaltest.gxt_ds.GetLayerCount() == 1, 'Got wrong layer count.' lyr = gdaltest.gxt_ds.GetLayer(0) assert lyr.GetName() == '000_GRD.000_GRD', 'got unexpected layer name.' assert lyr.GetFeatureCount() == 5, 'got wrong feature count.' expect = ['000-2007-0050-7130-LAMB93', '000-2007-0595-7130-LAMB93', '000-2007-0595-6585-LAMB93', '000-2007-1145-6250-LAMB93', '000-2007-0050-6585-LAMB93'] tr = ogrtest.check_features_against_list(lyr, 'idSel', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((50000 7130000,600000 7130000,600000 6580000,50000 6580000,50000 7130000)))', max_error=0.000000001) == 0) ############################################################################### # Read a GXT file containing 2 points, duplicate it, and check the newly written file def test_ogr_gxt_3(): gdaltest.gxt_ds = None src_ds = ogr.Open('data/points.gxt') try: os.remove('tmp/tmp.gxt') except OSError: pass # Duplicate all the points from the source GXT src_lyr = src_ds.GetLayerByName('points.points') gdaltest.gxt_ds = ogr.GetDriverByName('Geoconcept').CreateDataSource('tmp/tmp.gxt') srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') gxt_lyr = gdaltest.gxt_ds.CreateLayer('points', srs, geom_type=ogr.wkbPoint) src_lyr.ResetReading() for i in range(src_lyr.GetLayerDefn().GetFieldCount()): field_defn = src_lyr.GetLayerDefn().GetFieldDefn(i) gxt_lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=gxt_lyr.GetLayerDefn()) feat = src_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) assert gxt_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' feat = src_lyr.GetNextFeature() gdaltest.gxt_ds = None # Read the newly written GXT file and check its features and geometries gdaltest.gxt_ds = ogr.Open('tmp/tmp.gxt') gxt_lyr = gdaltest.gxt_ds.GetLayerByName('points.points') assert gxt_lyr.GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), 'Output SRS is not the one expected.' expect = ['PID1', 'PID2'] tr = ogrtest.check_features_against_list(gxt_lyr, 'Primary_ID', expect) assert tr gxt_lyr.ResetReading() expect = ['SID1', 'SID2'] tr = ogrtest.check_features_against_list(gxt_lyr, 'Secondary_ID', expect) assert tr gxt_lyr.ResetReading() expect = ['TID1', None] tr = ogrtest.check_features_against_list(gxt_lyr, 'Third_ID', expect) assert tr gxt_lyr.ResetReading() feat = gxt_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'POINT(0 1)', max_error=0.000000001) == 0) feat = gxt_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'POINT(2 3)', max_error=0.000000001) == 0) ############################################################################### # def test_ogr_gxt_multipolygon_singlepart_nohole(): ds = ogr.Open('data/geoconcept_multipolygon_singlepart_nohole.txt') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_gxt_multipolygon_singlepart_hole(): if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('data/geoconcept_multipolygon_singlepart_hole.txt') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.1 0.1,0.1 0.9,0.9 0.9,0.1 0.1)))', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_gxt_multipolygon_twoparts_second_with_hole(): if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('data/geoconcept_multipolygon_twoparts_second_with_hole.txt') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((-10 -10,-10 -9,-9 -9,-10 -10)),((0 0,0 1,1 1,1 0,0 0),(0.1 0.1,0.1 0.9,0.9 0.9,0.1 0.1)))', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_gxt_line(): if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('data/line.gxt') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'LINESTRING (440720 3751320,441920 3750120)', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_gxt_cleanup(): gdaltest.gxt_ds = None try: os.remove('tmp/tmp.gxt') except OSError: pass gdalautotest-3.0.4/ogr/ogr_carto.py0000755003401500001440000013672213614005325016765 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_carto.py 7c1371be6c306fc45cfc2b8f556060d67c54e6f3 2019-04-16 16:43:35 +0200 Raul Marin $ # # Project: GDAL/OGR Test Suite # Purpose: Carto driver testing. # Author: Even Rouault # ############################################################################### # 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 uuid import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test if driver is available def test_ogr_carto_init(): ogrtest.carto_drv = None ogrtest.carto_drv = ogr.GetDriverByName('Carto') if ogrtest.carto_drv is None: pytest.skip() ############################################################################### # def test_ogr_carto_vsimem(): if ogrtest.carto_drv is None: pytest.skip() ogrtest.carto_api_key_ori = gdal.GetConfigOption('CARTO_API_KEY') gdal.SetConfigOption('CARTO_API_URL', '/vsimem/carto') gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT postgis_version() LIMIT 500 OFFSET 0&api_key=foo', """{"rows":[{"postgis_version":"2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1"}],"time":0.001,"fields":{"postgis_version":{"type":"string"}},"total_rows":1}""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """Content-Type: text/html\r Error""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None and gdal.GetLastErrorMsg().find('HTML error page') >= 0 gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """""") ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None and gdal.GetLastErrorMsg().find('JSON parsing error') >= 0 gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """ "not_expected_json" """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "error" : [ "bla"] }""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None and gdal.GetLastErrorMsg().find('Error returned by server : bla') >= 0 gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : null } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : "invalid" } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : {} } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : { "foo": "invalid" } } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : { "foo": {} } } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : { "foo": { "type" : null } } } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : { "foo": { "type" : {} } } } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{ "fields" : { "foo": { "type" : "string" } } } """) ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{"rows":[ {"field1": "foo", "field2": "bar"} ],"fields":{"field1":{"type":"string"}, "field2":{"type":"string"}}}""") ds = ogr.Open('CARTO:foo') assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{"rows":[],"fields":{"current_schema":{"type":"string"}}}""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0', """{"rows":[{"current_schema":"public"}],"fields":{"current_schema":{"type":"unknown(19)"}}}""") gdal.PushErrorHandler() ds = ogr.Open('CARTO:foo') gdal.PopErrorHandler() assert ds is None, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT CDB_UserTables() LIMIT 500 OFFSET 0', """{"rows":[{"cdb_usertables":"table1"}],"fields":{"cdb_usertables":{"type":"string"}}}""") ds = ogr.Open('CARTO:foo') assert ds is not None and ds.GetLayerCount() == 1, gdal.GetLastErrorMsg() gdal.PushErrorHandler() lyr_defn = ds.GetLayer(0).GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 # Empty layer gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT * FROM "table1" LIMIT 0', """{"rows":[],"fields":{}}""") ds = ogr.Open('CARTO:foo') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 0 gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT * FROM "table1" LIMIT 500 OFFSET 0', """{"rows":[{}],"fields":{}}}""") f = lyr.GetNextFeature() if f.GetFID() != 0: f.DumpReadable() pytest.fail() # Layer without geometry or primary key gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT * FROM "table1" LIMIT 0', """{"rows":[],"fields":{"strfield":{"type":"string"}, "realfield":{"type":"number"}, "boolfield":{"type":"boolean"}, "datefield":{"type":"date"}}}""") ds = ogr.Open('CARTO:foo') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 4 assert (lyr_defn.GetFieldDefn(0).GetName() == 'strfield' and \ lyr_defn.GetFieldDefn(0).GetType() == ogr.OFTString) assert (lyr_defn.GetFieldDefn(1).GetName() == 'realfield' and \ lyr_defn.GetFieldDefn(1).GetType() == ogr.OFTReal) assert (lyr_defn.GetFieldDefn(2).GetName() == 'boolfield' and \ lyr_defn.GetFieldDefn(2).GetType() == ogr.OFTInteger and \ lyr_defn.GetFieldDefn(2).GetSubType() == ogr.OFSTBoolean) assert (lyr_defn.GetFieldDefn(3).GetName() == 'datefield' and \ lyr_defn.GetFieldDefn(3).GetType() == ogr.OFTDateTime) gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT "strfield", "realfield", "boolfield", "datefield" FROM "table1" LIMIT 500 OFFSET 0', """{"rows":[{ "strfield": "foo", "realfield": 1.23, "boolfield": true, "datefield": "2015-04-24T12:34:56.123Z" }],"fields":{"strfield":{"type":"string"}, "realfield":{"type":"number"}, "boolfield":{"type":"boolean"}, "datefield":{"type":"date"}}}""") f = lyr.GetNextFeature() if f['strfield'] != 'foo' or f['realfield'] != 1.23 or f['boolfield'] != 1 or \ f['datefield'] != '2015/04/24 12:34:56.123+00': f.DumpReadable() pytest.fail() gdal.SetConfigOption('CARTO_API_KEY', 'foo') gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0&api_key=foo', """{"rows":[{"current_schema":"public"}],"fields":{"current_schema":{"type":"unknown(19)"}}}""") gdal.FileFromMemBuffer('/vsimem/carto&POSTFIELDS=q=SELECT CDB_UserTables() LIMIT 500 OFFSET 0&api_key=foo', """{"rows":[{"cdb_usertables":"table1"}],"fields":{"cdb_usertables":{"type":"string"}}}""") ds = ogr.Open('CARTO:foo') gdal.PushErrorHandler() lyr_defn = ds.GetLayer(0).GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 get_full_details_fields_url = """/vsimem/carto&POSTFIELDS=q=SELECT a.attname, t.typname, a.attlen, format_type(a.atttypid,a.atttypmod), a.attnum, a.attnotnull, i.indisprimary, pg_get_expr(def.adbin, c.oid) AS defaultexpr, postgis_typmod_dims(a.atttypmod) dim, postgis_typmod_srid(a.atttypmod) srid, postgis_typmod_type(a.atttypmod)::text geomtyp, srtext FROM pg_class c JOIN pg_attribute a ON a.attnum > 0 AND a.attrelid = c.oid AND c.relname = 'table1' JOIN pg_type t ON a.atttypid = t.oid JOIN pg_namespace n ON c.relnamespace=n.oid AND n.nspname= 'public' LEFT JOIN pg_index i ON c.oid = i.indrelid AND i.indisprimary = 't' AND a.attnum = ANY(i.indkey) LEFT JOIN pg_attrdef def ON def.adrelid = c.oid AND def.adnum = a.attnum LEFT JOIN spatial_ref_sys srs ON srs.srid = postgis_typmod_srid(a.atttypmod) ORDER BY a.attnum LIMIT 500 OFFSET 0&api_key=foo""" gdal.FileFromMemBuffer(get_full_details_fields_url, '') ds = ogr.Open('CARTO:foo') gdal.PushErrorHandler() lyr_defn = ds.GetLayer(0).GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 gdal.FileFromMemBuffer(get_full_details_fields_url, """{"rows":[{"attname":"foo"}], "fields":{"attname":{"type":"string"}}}""") ds = ogr.Open('CARTO:foo') lyr = ds.GetLayer(0) gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 1 gdal.PushErrorHandler() f = lyr.GetFeature(0) gdal.PopErrorHandler() assert f is None gdal.FileFromMemBuffer(get_full_details_fields_url, """{"rows":[{"attname":"strfield", "typname":"varchar", "attnotnull": true, "defaultexpr": "def_value"}, {"attname":"intfield", "typname":"int4"}, {"attname":"doublefield", "typname":"float"}, {"attname":"boolfield", "typname":"bool"}, {"attname":"datetimefield", "typname":"timestamp"}, {"attname":"cartodb_id","typname":"int4","indisprimary":true}, {"attname":"created_at","typname":"date"}, {"attname":"updated_at","typname":"date"}, {"attname":"my_geom","typname":"geometry","dim":3,"srid":4326,"geomtyp":"Point", "srtext":"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\\"]]"}, {"attname":"the_geom_webmercator","typname":"geometry"}], "fields":{"attname":{"type":"string"}, "typname":{"type":"string"}, "attlen":{"type":"number"}, "format_type":{"type":"string"}, "attnum":{"type":"number"}, "attnotnull":{"type":"boolean"}, "indisprimary":{"type":"boolean"}, "defaultexpr":{"type":"string"}, "dim":{"type":"number"}, "srid":{"type":"number"}, "geomtyp":{"type":"string"}, "srtext":{"type":"string"}}}""") ds = ogr.Open('CARTO:foo') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 5 assert (lyr_defn.GetFieldDefn(0).GetName() == 'strfield' and \ lyr_defn.GetFieldDefn(0).GetType() == ogr.OFTString and not \ lyr_defn.GetFieldDefn(0).IsNullable() and \ lyr_defn.GetFieldDefn(0).GetDefault() == 'def_value') assert lyr_defn.GetGeomFieldCount() == 1 assert lyr_defn.GetGeomFieldDefn(0).GetName() == 'my_geom' assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbPoint25D assert lyr_defn.GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT COUNT(*) FROM "table1"&api_key=foo""", """{}""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT COUNT(*) FROM "table1"&api_key=foo""", """{"rows":[{"foo":1}], "fields":{"foo":{"type":"number"}}}""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT COUNT(*) FROM "table1"&api_key=foo""", """{"rows":[{"count":9876543210}], "fields":{"count":{"type":"number"}}}""") assert lyr.GetFeatureCount() == 9876543210 gdal.PushErrorHandler() extent = lyr.GetExtent() gdal.PopErrorHandler() assert extent == (0, 0, 0, 0) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT ST_Extent("my_geom") FROM "table1"&api_key=foo""", """{"rows":[{"foo":1}], "fields":{"foo":{"type":"number"}}}""") gdal.PushErrorHandler() extent = lyr.GetExtent() gdal.PopErrorHandler() assert extent == (0, 0, 0, 0) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT ST_Extent("my_geom") FROM "table1"&api_key=foo""", """{"rows":[{"st_extent":""}], "fields":{"st_extent":{"type":"string"}}}""") gdal.ErrorReset() gdal.PushErrorHandler() lyr.GetExtent() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT ST_Extent("my_geom") FROM "table1"&api_key=foo""", """{"rows":[{"st_extent":"("}], "fields":{"st_extent":{"type":"string"}}}""") gdal.ErrorReset() gdal.PushErrorHandler() lyr.GetExtent() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT ST_Extent("my_geom") FROM "table1"&api_key=foo""", """{"rows":[{"st_extent":"BOX()"}], "fields":{"st_extent":{"type":"string"}}}""") gdal.ErrorReset() gdal.PushErrorHandler() lyr.GetExtent() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT ST_Extent("my_geom") FROM "table1"&api_key=foo""", """{"rows":[{"st_extent":"BOX(0,1,2,3)"}], "fields":{"st_extent":{"type":"string"}}}""") assert lyr.GetExtent() == (0.0, 2.0, 1.0, 3.0) gdal.PushErrorHandler() f = lyr.GetFeature(0) gdal.PopErrorHandler() assert f is None gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" = 0&api_key=foo""", """""") gdal.PushErrorHandler() f = lyr.GetFeature(0) gdal.PopErrorHandler() assert f is None gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" = 0&api_key=foo""", """{"rows":[{"st_extent":"BOX(0,1,2,3)"}], "fields":{"st_extent":{"type":"string"}}}""") f = lyr.GetFeature(0) assert f.GetFID() == -1 and f.IsFieldNull(0) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" = 0&api_key=foo""", """{"rows":[{"cartodb_id":0}], "fields":{"cartodb_id":{"type":"numeric"}}}""") f = lyr.GetFeature(0) assert f.GetFID() == 0 lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" >= 0 ORDER BY "cartodb_id" ASC LIMIT 500&api_key=foo""", """{"rows":[{"cartodb_id":0}], "fields":{"cartodb_id":{"type":"numeric"}}}""") lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == 0 gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None gdal.SetConfigOption('CARTO_PAGE_SIZE', '2') gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" >= 0 ORDER BY "cartodb_id" ASC LIMIT 2&api_key=foo""", """{"rows":[{"cartodb_id":0},{"cartodb_id":10}], "fields":{"cartodb_id":{"type":"numeric"}}}""") lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == 0 f = lyr.GetNextFeature() assert f.GetFID() == 10 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE "cartodb_id" >= 11 ORDER BY "cartodb_id" ASC LIMIT 2&api_key=foo""", """{"rows":[{"cartodb_id":12}], "fields":{"cartodb_id":{"type":"numeric"}}}""") f = lyr.GetNextFeature() assert f.GetFID() == 12 gdal.ErrorReset() f = lyr.GetNextFeature() assert f is None and gdal.GetLastErrorMsg() == '' lyr.SetAttributeFilter('strfield is NULL') gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE (strfield is NULL) AND "cartodb_id" >= 0 ORDER BY "cartodb_id" ASC LIMIT 2&api_key=foo""", """{"rows":[{"cartodb_id":0}], "fields":{"cartodb_id":{"type":"numeric"}}}""") lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE (strfield is NULL) AND "cartodb_id" >= 1 ORDER BY "cartodb_id" ASC LIMIT 2&api_key=foo""", """{"rows":[], "fields":{"cartodb_id":{"type":"numeric"}}}""") gdal.ErrorReset() f = lyr.GetNextFeature() assert f is None and gdal.GetLastErrorMsg() == '' gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT COUNT(*) FROM "table1" WHERE (strfield is NULL)&api_key=foo""", """{"rows":[{"count":9876543210}], "fields":{"count":{"type":"number"}}}""") assert lyr.GetFeatureCount() == 9876543210 lyr.SetSpatialFilterRect(-180, -90, 180, 90) gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT "cartodb_id", "my_geom", "strfield", "intfield", "doublefield", "boolfield", "datetimefield" FROM "table1" WHERE ("my_geom" %26%26 'BOX3D(-180 -90, 180 90)'::box3d) AND (strfield is NULL) AND "cartodb_id" >= 0 ORDER BY "cartodb_id" ASC LIMIT 2&api_key=foo""", """{"rows":[{"cartodb_id":20, "my_geom": "010100000000000000000000400000000000804840" }], "fields":{"cartodb_id":{"type":"numeric"}, "my_geom":{"type":"string"}}}""") lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None and f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 1 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT COUNT(*) FROM "table1" WHERE ("my_geom" %26%26 'BOX3D(-180 -90, 180 90)'::box3d) AND (strfield is NULL)&api_key=foo""", """{"rows":[{"count":9876543210}], "fields":{"count":{"type":"number"}}}""") assert lyr.GetFeatureCount() == 9876543210 # Not permitted in read-only mode f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ds.CreateLayer('foo') ds.DeleteLayer(0) lyr.CreateFeature(f) lyr.SetFeature(f) lyr.DeleteFeature(0) lyr.CreateField(ogr.FieldDefn('foo')) lyr.DeleteField(0) gdal.PopErrorHandler() ds = None gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=DROP FUNCTION IF EXISTS ogr_table_metadata(TEXT,TEXT); CREATE OR REPLACE FUNCTION ogr_table_metadata(schema_name TEXT, table_name TEXT) RETURNS TABLE (attname TEXT, typname TEXT, attlen INT, format_type TEXT, attnum INT, attnotnull BOOLEAN, indisprimary BOOLEAN, defaultexpr TEXT, dim INT, srid INT, geomtyp TEXT, srtext TEXT) AS $$ SELECT a.attname::text, t.typname::text, a.attlen::int, format_type(a.atttypid,a.atttypmod)::text, a.attnum::int, a.attnotnull::boolean, i.indisprimary::boolean, pg_get_expr(def.adbin, c.oid)::text AS defaultexpr, (CASE WHEN t.typname = 'geometry' THEN postgis_typmod_dims(a.atttypmod) ELSE NULL END)::int dim, (CASE WHEN t.typname = 'geometry' THEN postgis_typmod_srid(a.atttypmod) ELSE NULL END)::int srid, (CASE WHEN t.typname = 'geometry' THEN postgis_typmod_type(a.atttypmod) ELSE NULL END)::text geomtyp, srtext FROM pg_class c JOIN pg_attribute a ON a.attnum > 0 AND a.attrelid = c.oid AND c.relname = $2 AND c.relname IN (SELECT CDB_UserTables())JOIN pg_type t ON a.atttypid = t.oid JOIN pg_namespace n ON c.relnamespace=n.oid AND n.nspname = $1 LEFT JOIN pg_index i ON c.oid = i.indrelid AND i.indisprimary = 't' AND a.attnum = ANY(i.indkey) LEFT JOIN pg_attrdef def ON def.adrelid = c.oid AND def.adnum = a.attnum LEFT JOIN spatial_ref_sys srs ON srs.srid = postgis_typmod_srid(a.atttypmod) ORDER BY a.attnum $$ LANGUAGE SQL&api_key=foo""", """""""") gdal.SetConfigOption('CARTO_PAGE_SIZE', None) ds = ogr.Open('CARTO:foo', update=1) lyr = ds.CreateLayer('MY_LAYER') gdal.ErrorReset() gdal.PushErrorHandler() lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT cdb_cartodbfytable('my_layer')&api_key=foo""", """{"rows":[], "fields":{}}""") ds = None gdal.Unlink("""/vsimem/carto&POSTFIELDS=q=SELECT cdb_cartodbfytable('my_layer')&api_key=foo""") ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) gdal.SetConfigOption('CARTO_MAX_CHUNK_SIZE', '0') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr = ds.CreateLayer('MY_LAYER', srs=sr) fld_defn = ogr.FieldDefn('STRFIELD', ogr.OFTString) fld_defn.SetNullable(0) fld_defn.SetDefault("'DEFAULT VAL'") fld_defn.SetWidth(20) lyr.CreateField(fld_defn) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=CREATE TABLE "my_layer" ( cartodb_id SERIAL,the_geom GEOMETRY(GEOMETRY, 4326),"strfield" VARCHAR NOT NULL DEFAULT 'DEFAULT VAL',PRIMARY KEY (cartodb_id) );DROP SEQUENCE IF EXISTS "my_layer_cartodb_id_seq" CASCADE;CREATE SEQUENCE "my_layer_cartodb_id_seq" START 1;ALTER SEQUENCE "my_layer_cartodb_id_seq" OWNED BY "my_layer".cartodb_id;ALTER TABLE "my_layer" ALTER COLUMN cartodb_id SET DEFAULT nextval('"my_layer_cartodb_id_seq"')&api_key=foo""", """{"rows":[], "fields":{}}""") f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None fld_defn = ogr.FieldDefn('INTFIELD', ogr.OFTInteger) # No server answer with gdaltest.error_handler(): ret = lyr.CreateField(fld_defn) assert ret != 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=ALTER TABLE "my_layer" ADD COLUMN "intfield" INTEGER&api_key=foo""", """{"rows":[], "fields":{}}""") assert lyr.CreateField(fld_defn) == 0 fld_defn = ogr.FieldDefn('boolfield', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=ALTER TABLE "my_layer" ADD COLUMN "boolfield" BOOLEAN&api_key=foo""", """{"rows":[], "fields":{}}""") assert lyr.CreateField(fld_defn) == 0 # Invalid field with gdaltest.error_handler(): assert lyr.DeleteField(-1) != 0 # No server answer with gdaltest.error_handler(): assert lyr.DeleteField(0) != 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=ALTER TABLE "my_layer" DROP COLUMN "boolfield"&api_key=foo""", """{"rows":[], "fields":{}}""") fld_pos = lyr.GetLayerDefn().GetFieldIndex(fld_defn.GetName()) assert lyr.DeleteField(fld_pos) == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=ALTER TABLE "my_layer" ADD COLUMN "boolfield" BOOLEAN&api_key=foo""", """{"rows":[], "fields":{}}""") assert lyr.CreateField(fld_defn) == 0 f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'foo') f.SetField('intfield', 1) f.SetField('boolfield', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=INSERT INTO "my_layer" ("strfield", "intfield", "boolfield", "the_geom") VALUES ('foo', 1, 't', '0101000020E610000000000000000000400000000000804840') RETURNING "cartodb_id"&api_key=foo""", """{"rows":[ {"cartodb_id": 1} ], "fields":{"cartodb_id":{"type":"integer"}}}""") ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 1 f.SetFID(-1) gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 f.SetFID(3) gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=UPDATE "my_layer" SET "strfield" = 'foo', "intfield" = 1, "boolfield" = 't', "the_geom" = '0101000020E610000000000000000000400000000000804840' WHERE "cartodb_id" = 3&api_key=foo""", """{"total_rows": 0}""") ret = lyr.SetFeature(f) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=UPDATE "my_layer" SET "strfield" = 'foo', "intfield" = 1, "boolfield" = 't', "the_geom" = '0101000020E610000000000000000000400000000000804840' WHERE "cartodb_id" = 3&api_key=foo""", """{"total_rows": 1}""") ret = lyr.SetFeature(f) assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=INSERT INTO "my_layer" DEFAULT VALUES RETURNING "cartodb_id"&api_key=foo""", """{"rows":[ {"cartodb_id": 4} ], "fields":{"cartodb_id":{"type":"integer"}}}""") ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 4 gdal.PushErrorHandler() ret = lyr.DeleteFeature(0) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=DELETE FROM "my_layer" WHERE "cartodb_id" = 0&api_key=foo""", """{"total_rows": 0}""") ret = lyr.DeleteFeature(0) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=DELETE FROM "my_layer" WHERE "cartodb_id" = 0&api_key=foo""", """{"total_rows": 1}""") ret = lyr.DeleteFeature(0) assert ret == 0 gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT cdb_cartodbfytable('my_layer')&api_key=foo""", """{"rows":[], "fields":{}}""") ds = None gdal.SetConfigOption('CARTO_MAX_CHUNK_SIZE', None) ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT pg_catalog.pg_get_serial_sequence('table1', 'cartodb_id') AS seq_name&api_key=foo""", """{"rows":[{"seq_name":"table1_cartodb_id_seq0"}],"fields":{"seq_name":{"type":"string"}}}""") gdal.FileFromMemBuffer("""/vsimem/carto&POSTFIELDS=q=SELECT nextval('table1_cartodb_id_seq0') AS nextid&api_key=foo""", """{"rows":[{"nextid":11}],"fields":{"nextid":{"type":"number"}}}""") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'foo') ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 11 f = ogr.Feature(lyr.GetLayerDefn()) with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN;INSERT INTO "table1" ("strfield", "cartodb_id") VALUES ('foo', 11);INSERT INTO "table1" DEFAULT VALUES;COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): ret = lyr.CreateFeature(f) ds = None if ret != 0 or f.GetFID() != 12: f.DumpReadable() pytest.fail() ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('strfield') with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN;INSERT INTO "table1" ("strfield", "cartodb_id") VALUES (NULL, 11);COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): ret = lyr.CreateFeature(f) ds = None if ret != 0 or f.GetFID() != 11: f.DumpReadable() pytest.fail() # Now remove default value to strfield gdal.FileFromMemBuffer(get_full_details_fields_url, """{"rows":[{"attname":"strfield", "typname":"varchar"}, {"attname":"intfield", "typname":"int4"}, {"attname":"doublefield", "typname":"float"}, {"attname":"boolfield", "typname":"bool"}, {"attname":"datetimefield", "typname":"timestamp"}, {"attname":"cartodb_id","typname":"int4","indisprimary":true}, {"attname":"created_at","typname":"date"}, {"attname":"updated_at","typname":"date"}, {"attname":"my_geom","typname":"geometry","dim":3,"srid":4326,"geomtyp":"Point", "srtext":"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\\"]]"}, {"attname":"the_geom_webmercator","typname":"geometry"}], "fields":{"attname":{"type":"string"}, "typname":{"type":"string"}, "attlen":{"type":"number"}, "format_type":{"type":"string"}, "attnum":{"type":"number"}, "attnotnull":{"type":"boolean"}, "indisprimary":{"type":"boolean"}, "defaultexpr":{"type":"string"}, "dim":{"type":"number"}, "srid":{"type":"number"}, "geomtyp":{"type":"string"}, "srtext":{"type":"string"}}}""") ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'foo') with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=SELECT nextval('table1_cartodb_id_seq') AS nextid&api_key=foo""", """{"rows":[{"nextid":11}],"fields":{"nextid":{"type":"number"}}}"""): ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 11 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'bar') ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 12 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'baz') ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 13 gdal.ErrorReset() with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN;INSERT INTO "table1" ("strfield", "cartodb_id") VALUES ('foo', 11);INSERT INTO "table1" ("strfield", "intfield", "doublefield", "boolfield", "datetimefield", "my_geom") VALUES ('bar', NULL, NULL, NULL, NULL, NULL), ('baz', NULL, NULL, NULL, NULL, NULL);COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): ds = None assert gdal.GetLastErrorMsg() == '' ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) gdal.PushErrorHandler() lyr = ds.CreateLayer('table1') gdal.PopErrorHandler() assert lyr is None with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN; DROP TABLE IF EXISTS "table1";CREATE TABLE "table1" ( cartodb_id SERIAL,the_geom Geometry(MULTIPOLYGON,0),PRIMARY KEY (cartodb_id) );DROP SEQUENCE IF EXISTS "table1_cartodb_id_seq" CASCADE;CREATE SEQUENCE "table1_cartodb_id_seq" START 1;ALTER SEQUENCE "table1_cartodb_id_seq" OWNED BY "table1".cartodb_id;ALTER TABLE "table1" ALTER COLUMN cartodb_id SET DEFAULT nextval('"table1_cartodb_id_seq"'); COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): lyr = ds.CreateLayer('table1', geom_type=ogr.wkbPolygon, options=['OVERWRITE=YES', 'CARTODBFY=NO']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 0,0 0))')) assert lyr.CreateFeature(f) == 0 gdal.ErrorReset() with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN;INSERT INTO "table1" ("the_geom") VALUES ('0106000020E61000000100000001030000000100000004000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000');COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): ds = None assert gdal.GetLastErrorMsg() == '' ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=NO']) with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN; DROP TABLE IF EXISTS "table1";CREATE TABLE "table1" ( cartodb_id SERIAL,the_geom Geometry(MULTIPOLYGON,0),PRIMARY KEY (cartodb_id) );DROP SEQUENCE IF EXISTS "table1_cartodb_id_seq" CASCADE;CREATE SEQUENCE "table1_cartodb_id_seq" START 1;ALTER SEQUENCE "table1_cartodb_id_seq" OWNED BY "table1".cartodb_id;ALTER TABLE "table1" ALTER COLUMN cartodb_id SET DEFAULT nextval('"table1_cartodb_id_seq"'); COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): lyr = ds.CreateLayer('table1', geom_type=ogr.wkbPolygon, options=['OVERWRITE=YES', 'CARTODBFY=NO']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(100) with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=BEGIN;INSERT INTO "table1" ("cartodb_id") VALUES (100);COMMIT;&api_key=foo""", """{"rows":[], "fields":{}}"""): assert lyr.CreateFeature(f) == 0 assert f.GetFID() == 100 ds = None ds = ogr.Open('CARTO:foo', update=1) gdal.PushErrorHandler() ret = ds.DeleteLayer(0) gdal.PopErrorHandler() assert ret != 0 gdal.ErrorReset() ds = gdal.OpenEx('CARTO:foo', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['COPY_MODE=YES']) assert ds is not None lyr = ds.GetLayerByName('table1') assert lyr is not None with gdaltest.tempfile("""/vsimem/carto/copyfrom?q=COPY%20"table1"%20("strfield","my_geom","cartodb_id")%20FROM%20STDIN%20WITH%20(FORMAT%20text,%20ENCODING%20UTF8)&api_key=foo&POSTFIELDS=copytest\t0101000020E610000000000000000059400000000000005940\t11\n\\.\n""","""{}"""): with gdaltest.tempfile("""/vsimem/carto/copyfrom?q=COPY%20"table1"%20("intfield","my_geom")%20FROM%20STDIN%20WITH%20(FORMAT%20text,%20ENCODING%20UTF8)&api_key=foo&POSTFIELDS=12\t0101000020E610000000000000000059400000000000005940\n\\.\n""","""{}"""): f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('strfield', 'copytest') f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(100 100)')) assert lyr.CreateFeature(f) == 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('intfield', 12) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(100 100)')) assert lyr.CreateFeature(f) == 0 ds = None # force flush ds = ogr.Open('CARTO:foo', update=1) gdal.ErrorReset() with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=DROP TABLE "table1"&api_key=foo""", """{"rows":[], "fields":{}}"""): ds.ExecuteSQL('DELLAYER:table1') assert gdal.GetLastErrorMsg() == '' and ds.GetLayerByName('table1') is None with gdaltest.tempfile('/vsimem/carto&POSTFIELDS=q=SELECT current_schema() LIMIT 500 OFFSET 0&api_key=foo', """{"rows":[{"current_schema":"my_schema"}],"fields":{"current_schema":{"type":"unknown(19)"}}}"""): with gdaltest.tempfile('/vsimem/carto&POSTFIELDS=q=SELECT CDB_UserTables() LIMIT 500 OFFSET 0&api_key=foo', """{"rows":[],"fields":{"cdb_usertables":{"type":"string"}}}"""): with gdaltest.tempfile("""/vsimem/carto&POSTFIELDS=q=SELECT c.relname FROM pg_class c, pg_namespace n WHERE c.relkind in ('r', 'v') AND c.relname !~ '^pg_' AND c.relnamespace=n.oid AND n.nspname = 'my_schema' LIMIT 500 OFFSET 0&api_key=foo""", """{"rows":[{"relname": "a_layer"}],"fields":{"relname":{"type":"string"}}}"""): ds = ogr.Open('CARTO:foo') assert ds.GetLayerByName('a_layer') is not None ############################################################################### # def test_ogr_carto_vsimem_cleanup(): if ogrtest.carto_drv is None: pytest.skip() gdal.SetConfigOption('CARTO_API_URL', None) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) gdal.SetConfigOption('CARTO_PAGE_SIZE', None) gdal.SetConfigOption('CARTO_MAX_CHUNK_SIZE', None) gdal.SetConfigOption('CARTO_API_KEY', ogrtest.carto_api_key_ori) for f in gdal.ReadDir('/vsimem/'): gdal.Unlink('/vsimem/' + f) ############################################################################### # Run test_ogrsf def test_ogr_carto_test_ogrsf(): if ogrtest.carto_drv is None or gdal.GetConfigOption('SKIP_SLOW') is not None: pytest.skip() if gdaltest.skip_on_travis(): pytest.skip() ogrtest.carto_test_server = 'https://gdalautotest2.carto.com' if gdaltest.gdalurlopen(ogrtest.carto_test_server) is None: ogrtest.carto_drv = None pytest.skip('cannot open %s' % ogrtest.carto_test_server) import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' --config CARTO_HTTPS NO --config CARTO_PAGE_SIZE 300 -ro "CARTO:gdalautotest2 tables=tm_world_borders_simpl_0_3"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test if driver is available def ogr_carto_rw_init(): ogrtest.carto_drv = None ogrtest.carto_connection = gdal.GetConfigOption('CARTO_CONNECTION') if ogrtest.carto_connection is None: pytest.skip('CARTO_CONNECTION missing') if gdal.GetConfigOption('CARTO_API_KEY') is None: pytest.skip('CARTO_API_KEY missing') ogrtest.carto_drv = ogr.GetDriverByName('Carto') if ogrtest.carto_drv is None: pytest.skip() ############################################################################### # Read/write/update test def ogr_carto_rw_1(): if ogrtest.carto_drv is None: pytest.skip() ds = ogr.Open(ogrtest.carto_connection, update=1) assert ds is not None a_uuid = str(uuid.uuid1()).replace('-', '_') lyr_name = "LAYER_" + a_uuid # No-op with gdaltest.error_handler(): lyr = ds.CreateLayer(lyr_name) ds.DeleteLayer(ds.GetLayerCount() - 1) # Deferred table creation with gdaltest.error_handler(): lyr = ds.CreateLayer(lyr_name) lyr.CreateField(ogr.FieldDefn("STRFIELD", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("intfield", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("int64field", ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn("doublefield", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("dt", ogr.OFTDateTime)) fd = ogr.FieldDefn("bool", ogr.OFTInteger) fd.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fd) f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 f.SetFID(-1) f.SetField('STRFIELD', "fo'o") f.SetField('intfield', 123) f.SetField('int64field', 12345678901234) f.SetField('doublefield', 1.23) f.SetField('dt', '2014/12/04 12:34:56') f.SetField('bool', 0) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) ret = lyr.CreateFeature(f) assert ret == 0 f.SetField('intfield', 456) f.SetField('bool', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) ret = lyr.SetFeature(f) assert ret == 0 fid = f.GetFID() ds = None ds = ogr.Open(ogrtest.carto_connection, update=1) lyr_name = "layer_" + a_uuid found = False for lyr in ds: if lyr.GetName() == lyr_name: found = True assert found lyr = ds.GetLayerByName(lyr_name) found = False for i in range(lyr.GetLayerDefn().GetFieldCount()): if lyr.GetLayerDefn().GetFieldDefn(i).GetName() == 'strfield': found = True assert found f = lyr.GetFeature(fid) if f.GetField('strfield') != "fo'o" or \ f.GetField('intfield') != 456 or \ f.GetField('int64field') != 12345678901234 or \ f.GetField('doublefield') != 1.23 or \ f.GetField('dt') != '2014/12/04 12:34:56+00' or \ f.GetField('bool') != 1 or \ f.GetGeometryRef().ExportToWkt() != 'POINT (3 4)': f.DumpReadable() ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() lyr.DeleteFeature(fid) f = lyr.GetFeature(fid) if f is not None: ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() # Non-differed field creation lyr.CreateField(ogr.FieldDefn("otherstrfield", ogr.OFTString)) ds.ExecuteSQL("DELLAYER:" + lyr_name) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer(lyr_name, geom_type=ogr.wkbMultiPolygon, srs=srs) lyr.GetNextFeature() ds.ExecuteSQL("DELLAYER:" + lyr_name) # Test that the_geom_webmercator is properly created lyr = ds.CreateLayer(lyr_name, geom_type=ogr.wkbPoint, srs=srs) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) lyr.CreateFeature(f) ds = None ds = ogr.Open(ogrtest.carto_connection, update=1) sql_lyr = ds.ExecuteSQL('SELECT ST_AsText(the_geom_webmercator) AS foo FROM ' + lyr_name) f = sql_lyr.GetNextFeature() if not f.GetField(0).startswith('POINT'): ds.ExecuteSQL("DELLAYER:" + lyr_name) ds.ReleaseResultSet(sql_lyr) pytest.fail() ds.ReleaseResultSet(sql_lyr) ds.ExecuteSQL("DELLAYER:" + lyr_name) # Layer without geometry lyr = ds.CreateLayer(lyr_name, geom_type=ogr.wkbNone) fd = ogr.FieldDefn("nullable", ogr.OFTString) lyr.CreateField(fd) fd = ogr.FieldDefn("not_nullable", ogr.OFTString) fd.SetNullable(0) lyr.CreateField(fd) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime_with_default', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('not_nullable', 'foo') lyr.CreateFeature(f) f = None ds = None ds = ogr.Open(ogrtest.carto_connection, update=1) lyr = ds.GetLayerByName(lyr_name) if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('nullable')).IsNullable() != 1: ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('not_nullable')).IsNullable() != 0: ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() != "'a''b'": ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime_with_default')).GetDefault() != 'CURRENT_TIMESTAMP': ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() f = lyr.GetNextFeature() if f is None or f.GetField('field_string') != 'a\'b' or not f.IsFieldSet('field_datetime_with_default'): ds.ExecuteSQL("DELLAYER:" + lyr_name) pytest.fail() ds.ExecuteSQL("DELLAYER:" + lyr_name) gdaltest_rw_list = [ ogr_carto_rw_init, ogr_carto_rw_1, ] gdalautotest-3.0.4/ogr/ogr_sxf.py0000755003401500001440000000427413614005325016451 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_sxf.py 26513 2013-10-02 11:59:50Z bishop $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR SXF driver functionality. # Author: Dmitry Baryshnikov # ############################################################################### # Copyright (c) 2013, NextGIS # # 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. ############################################################################### import gdaltest from osgeo import ogr import pytest ############################################################################### # Open SXF datasource. def test_ogr_sxf_1(): gdaltest.sxf_ds = None with gdaltest.error_handler(): # Expect Warning 0 and Warning 6. gdaltest.sxf_ds = ogr.Open('data/100_test.sxf') if gdaltest.sxf_ds is not None: return pytest.fail() ############################################################################### # Run test_ogrsf def test_ogr_sxf_2(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' data/100_test.sxf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # def test_ogr_sxf_cleanup(): if gdaltest.sxf_ds is None: pytest.skip() gdaltest.sxf_ds = None gdalautotest-3.0.4/ogr/__init__.py0000644003401500001440000000000013614005325016515 0ustar rouaultusersgdalautotest-3.0.4/ogr/ogr_idrisi.py0000755003401500001440000001447213614005325017135 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_idrisi.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR Idrisi driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011-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 ogr import ogrtest import pytest ############################################################################### # Test point layer def test_ogr_idrisi_1(): ds = ogr.Open('data/points.vct') assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint assert lyr.GetLayerDefn().GetFieldDefn(1).GetName() == 'IntegerField' assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTInteger sr = lyr.GetSpatialRef() assert sr.ExportToWkt().find('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]') > 0 assert lyr.GetFeatureCount() == 2 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1 assert lyr.GetExtent() == (400000.0, 600000.0, 4000000.0, 5000000.0) feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 1.0: feat.DumpReadable() pytest.fail() if feat.GetFieldAsInteger(1) != 2: feat.DumpReadable() pytest.fail() if feat.GetFieldAsDouble(2) != 3.45: feat.DumpReadable() pytest.fail() if feat.GetFieldAsString(3) != 'foo': feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT(400000 5000000)')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 2.0: feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT (600000 4000000)')) != 0: feat.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(600000 - 1, 4000000 - 1, 600000 + 1, 4000000 + 1) lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 2.0: feat.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(0, 0, 1, 1) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None ds = None ############################################################################### # Test linestring layer def test_ogr_idrisi_2(): ds = ogr.Open('data/lines.vct') assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbLineString assert lyr.GetFeatureCount() == 2 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1 assert lyr.GetExtent() == (400000.0, 600000.0, 4000000.0, 5000000.0) feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 10.0: feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (400000 5000000,600000 4500000)')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 20.0: feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (450000 4000000,550000 4500000)')) != 0: feat.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(0, 0, 1, 1) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None ds = None ############################################################################### # Test polygon layer def test_ogr_idrisi_3(): ds = ogr.Open('data/polygons.vct') assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPolygon assert lyr.GetFeatureCount() == 2 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1 assert lyr.GetExtent() == (400000.0, 600000.0, 4000000.0, 5000000.0) feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 1.0: feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON ((400000 4000000,400000 5000000,600000 5000000,600000 4000000,400000 4000000),(450000 4250000,450000 4750000,550000 4750000,550000 4250000,450000 4250000))')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsDouble(0) != 2.0: feat.DumpReadable() pytest.fail() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON ((400000 4000000,400000 5000000,600000 5000000,600000 4000000,400000 4000000))')) != 0: feat.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(0, 0, 1, 1) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None ds = None gdalautotest-3.0.4/ogr/ogr_plscenes.py0000755003401500001440000010011713614005325017456 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_plscenes.py d24c169720c70f0f9f4f1139c610343dd076103d 2019-04-23 23:29:54 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: PlanetLabs scene 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. ############################################################################### from osgeo import ogr from osgeo import gdal import gdaltest import pytest ############################################################################### # Find PLScenes driver def test_ogr_plscenes_init(): gdaltest.plscenes_drv = ogr.GetDriverByName('PLScenes') if gdaltest.plscenes_drv is not None: return pytest.skip() ############################################################################### # Test Data V1 API catalog listing with a single catalog def test_ogr_plscenes_data_v1_catalog_no_paging(): if gdaltest.plscenes_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{ "item_types": [ { "id": "PSScene3Band" } ] }') gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is not None with gdaltest.error_handler(): assert ds.GetLayerByName('non_existing') is None assert ds.GetLayerByName('PSScene3Band') is not None assert ds.GetLayerCount() == 1 with gdaltest.error_handler(): assert ds.GetLayerByName('non_existing') is None gdal.Unlink('/vsimem/data_v1/item-types') ############################################################################### # Test Data V1 API catalog listing with catalog paging def test_ogr_plscenes_data_v1_catalog_paging(): if gdaltest.plscenes_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{"_links": { "_next" : "/vsimem/data_v1/item-types/page_2"}, "item_types": [ { "id": "PSScene3Band" } ] }') gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/page_2', '{ "item_types": [ { "id": "PSScene4Band" } ] }') gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is not None with gdaltest.error_handler(): assert ds.GetLayerByName('non_existing') is None assert ds.GetLayerByName('PSScene3Band') is not None gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSScene4Band', '{ "id": "PSScene4Band"} }') assert ds.GetLayerByName('PSScene4Band') is not None assert ds.GetLayerCount() == 2 assert ds.GetLayerByName('PSScene4Band') is not None with gdaltest.error_handler(): assert ds.GetLayerByName('non_existing') is None gdal.Unlink('/vsimem/data_v1/item-types') gdal.Unlink('/vsimem/data_v1/item-types/page_2') gdal.Unlink('/vsimem/data_v1/item-types/PSScene4Band') ############################################################################### # Test Data V1 API def test_ogr_plscenes_data_v1_nominal(): if gdaltest.plscenes_drv is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', """{ "item_types": [ {"display_description" : "display_description", "display_name" : "display_name", "id": "PSOrthoTile"} ]}""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is not None gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:version=data_v1,api_key=foo,FOLLOW_LINKS=YES', gdal.OF_VECTOR) gdal.SetConfigOption('PL_URL', None) assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetName() == 'PSOrthoTile' assert (lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 and \ lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 and \ lyr.TestCapability(ogr.OLCRandomRead) == 0) # Different serialization depending on libjson versions gdal.FileFromMemBuffer("""/vsimem/data_v1/stats&POSTFIELDS={"interval":"year","item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"RangeFilter","field_name":"cloud_cover","config":{"gte":0.000000}}]}}""", """{ "buckets": [ { "count": 1 }, { "count": 1} ] }""") gdal.FileFromMemBuffer("""/vsimem/data_v1/stats&POSTFIELDS={"interval":"year","item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"RangeFilter","field_name":"cloud_cover","config":{"gte":0}}]}}""", """{ "buckets": [ { "count": 1 }, { "count": 1} ] }""") gdal.FileFromMemBuffer("""/vsimem/data_v1/stats&POSTFIELDS={"interval":"year","item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"RangeFilter","field_name":"cloud_cover","config":{"gte":0.0}}]}}""", """{ "buckets": [ { "count": 1 }, { "count": 1} ] }""") assert lyr.GetFeatureCount() == 2 assert lyr.GetGeomType() == ogr.wkbMultiPolygon ext = lyr.GetExtent() assert ext == (-180.0, 180.0, -90.0, 90.0) field_count = lyr.GetLayerDefn().GetFieldCount() assert field_count == 78 # Regular /items/ fetching gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[]}}""", """{ "_links": { "_next": "/vsimem/data_v1/quick-search?page=2" }, "features" : [ { "id": "id", "_links" : { "_self" : "self", "assets" : "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets" }, "_permissions" : [ "download" ], "properties": { "acquired": "2016/02/11 12:34:56.789+00", "anomalous_pixels": 1.23, "columns": 1, "item_type": "foo", "ground_control": true }, "geometry": { "type": "Polygon", "coordinates" : [ [ [2,49],[2,49.1],[2.1,49.1],[2.1,49],[2,49] ] ] } } ] }""") gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets', """{ "analytic" : { "_permissions": ["download"], "_links": { "_self": "analytic_links_self", "activate": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/activate", }, "location": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff", "status": "active", "expires_at": "2016-02-11T12:34:56.789" } }""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo', 'FOLLOW_LINKS=YES']) gdal.SetConfigOption('PL_URL', None) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetFID() != 1 or f['id'] != 'id' or f['self_link'] != 'self' or \ f['assets_link'] != '/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets' or \ f['acquired'] != '2016/02/11 12:34:56.789+00' or \ f['anomalous_pixels'] != 1.23 or f['item_type'] != 'foo' or f['columns'] != 1 or \ not f['ground_control'] or \ f['asset_analytic_self_link'] != 'analytic_links_self' or \ f['asset_analytic_activate_link'] != '/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/activate' or \ f['asset_analytic_permissions'] != ['download'] or \ f['asset_analytic_expires_at'] != '2016/02/11 12:34:56.789' or \ f['asset_analytic_location'] != '/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff' or \ f['asset_analytic_status'] != 'active' or \ f.GetGeometryRef().ExportToWkt() != 'MULTIPOLYGON (((2 49,2.0 49.1,2.1 49.1,2.1 49.0,2 49)))': f.DumpReadable() pytest.fail() lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 1: f.DumpReadable() pytest.fail() gdal.FileFromMemBuffer('/vsimem/data_v1/quick-search?page=2', """{ "features" : [ { "id": "id2" } ] }""") f = lyr.GetNextFeature() if f.GetFID() != 2 or f['id'] != 'id2': f.DumpReadable() pytest.fail() lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 1: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is None f = lyr.GetNextFeature() assert f is None gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"GeometryFilter","field_name":"geometry","config":{"type":"Point","coordinates":[2.0,49.0]}}]}}""", """{"features" : [ { "id": "id3", "geometry": { "type": "Point", "coordinates": [2,49]} } ] }""") # POINT spatial filter lyr.SetSpatialFilterRect(2, 49, 2, 49) f = lyr.GetNextFeature() if f['id'] != 'id3': f.DumpReadable() pytest.fail() # Cannot find /vsimem/data_v1/stats&POSTFIELDS={"interval":"year","item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"GeometryFilter","field_name":"geometry","config":{"type":"Point","coordinates":[2.0,49.0]}}]}} with gdaltest.error_handler(): assert lyr.GetFeatureCount() == 1 # Reset spatial filter lyr.SetSpatialFilter(0, None) f = lyr.GetNextFeature() if f['id'] != 'id': f.DumpReadable() pytest.fail() # Test attribute filter on id lyr.SetAttributeFilter("id = 'filtered_id'") gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"StringInFilter","field_name":"id","config":["filtered_id"]}]}}""", """{ "id": "filtered_id", "properties": {} }""") f = lyr.GetNextFeature() if f['id'] != 'filtered_id': f.DumpReadable() pytest.fail() # Test attribute filter fully evaluated on server side. lyr.SetAttributeFilter("id != 'a' AND acquired >= '2016/02/11' AND acquired <= '2016/02/12' AND acquired > '1970/01/01 01:23:45' AND acquired < '2100/01/01 01:23:45' AND anomalous_pixels = 1.234567 AND (NOT id = 'b') AND columns > 0 AND columns < 2 AND columns = 1 AND columns IN (1, 2) AND (id IN ('filtered_2') OR id = 'foo') AND permissions = 'download' AND permissions IN ('download')") content = """{ "features" : [ { "id": "filtered_2", "_links" : { "_self" : "self", "assets" : "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets" }, "_permissions" : [ "download" ], "properties": { "acquired": "2016/02/11 12:34:56.789+00", "anomalous_pixels": 1.23, "columns": 1, "item_type": "foo" }, "geometry": { "type": "Polygon", "coordinates" : [ [ [2,49],[2,49.1],[2.1,49.1],[2.1,49],[2,49] ] ] } } ] }""" gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"NotFilter","config":{"type":"StringInFilter","field_name":"id","config":["a"]}},{"type":"DateRangeFilter","field_name":"acquired","config":{"gte":"2016-02-11T00:00:00Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"lte":"2016-02-12T00:00:00Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"gt":"1970-01-01T01:23:45Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"lt":"2100-01-01T01:23:45Z"}}]},{"type":"RangeFilter","field_name":"anomalous_pixels","config":{"gte":1.234567,"lte":1.234567}}]},{"type":"NotFilter","config":{"type":"StringInFilter","field_name":"id","config":["b"]}}]},{"type":"RangeFilter","field_name":"columns","config":{"gt":0}}]},{"type":"RangeFilter","field_name":"columns","config":{"lt":2}}]},{"type":"NumberInFilter","field_name":"columns","config":[1]}]},{"type":"NumberInFilter","field_name":"columns","config":[1,2]}]},{"type":"OrFilter","config":[{"type":"StringInFilter","field_name":"id","config":["filtered_2"]},{"type":"StringInFilter","field_name":"id","config":["foo"]}]}]},{"type":"PermissionFilter","config":["download"]}]},{"type":"PermissionFilter","config":["download"]}]}]}}""", content) gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"AndFilter","config":[{"type":"NotFilter","config":{"type":"StringInFilter","field_name":"id","config":["a"]}},{"type":"DateRangeFilter","field_name":"acquired","config":{"gte":"2016-02-11T00:00:00Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"lte":"2016-02-12T00:00:00Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"gt":"1970-01-01T01:23:45Z"}}]},{"type":"DateRangeFilter","field_name":"acquired","config":{"lt":"2100-01-01T01:23:45Z"}}]},{"type":"RangeFilter","field_name":"anomalous_pixels","config":{"gte":1.23456699,"lte":1.2345670099999999}}]},{"type":"NotFilter","config":{"type":"StringInFilter","field_name":"id","config":["b"]}}]},{"type":"RangeFilter","field_name":"columns","config":{"gt":0}}]},{"type":"RangeFilter","field_name":"columns","config":{"lt":2}}]},{"type":"NumberInFilter","field_name":"columns","config":[1]}]},{"type":"NumberInFilter","field_name":"columns","config":[1,2]}]},{"type":"OrFilter","config":[{"type":"StringInFilter","field_name":"id","config":["filtered_2"]},{"type":"StringInFilter","field_name":"id","config":["foo"]}]}]},{"type":"PermissionFilter","config":["download"]}]},{"type":"PermissionFilter","config":["download"]}]}]}}""", content) f = lyr.GetNextFeature() if f['id'] != 'filtered_2': f.DumpReadable() pytest.fail() # Partly server / partly client lyr.SetAttributeFilter("id = 'filtered_3' AND id > 'a'") gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"StringInFilter","field_name":"id","config":["filtered_3"]}]}}""", """{ "features" : [ { "id": "filtered_3", "properties": { } } ] }""") f = lyr.GetNextFeature() if f['id'] != 'filtered_3': f.DumpReadable() pytest.fail() lyr.SetAttributeFilter("id > 'a' AND id = 'filtered_3'") f = lyr.GetNextFeature() if f['id'] != 'filtered_3': f.DumpReadable() pytest.fail() # Completely client side lyr.SetAttributeFilter("id > 'a' OR id = 'id'") f = lyr.GetNextFeature() if f['id'] != 'id': f.DumpReadable() pytest.fail() # Completely client side lyr.SetAttributeFilter("NOT id > 'z'") f = lyr.GetNextFeature() if f['id'] != 'id': f.DumpReadable() pytest.fail() # Reset attribute filter lyr.SetAttributeFilter(None) f = lyr.GetNextFeature() if f['id'] != 'id': f.DumpReadable() pytest.fail() # Try raster access # Missing catalog gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'SCENE=id']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None and gdal.GetLastErrorMsg().find('Missing catalog') >= 0 # Invalid catalog gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=invalid', 'SCENE=id']) gdal.SetConfigOption('PL_URL', None) # visual not an object gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets', """{ "visual": false }""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # Inactive file, and activation link not working gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets', """{ "analytic" : { "_links": { "_self": "analytic_links_self", "activate": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/activate", }, "_permissions": ["download"], "status": "inactive", } }""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # File in activation gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets', """{ "analytic" : { "_links": { "_self": "analytic_links_self", "activate": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/activate", }, "_permissions": ["download"], "status": "activating", } }""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets', """{ "analytic" : { "_permissions": ["download"], "_links": { "_self": "analytic_links_self", "activate": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/activate", }, "location": "/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff", "status": "active", "expires_at": "2016-02-11T12:34:56.789" } }""") # Missing /vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # JSon content for /vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff', """{}""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # Missing metadata gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile/items/id/assets/analytic/my.tiff', open('../gcore/data/byte.tif', 'rb').read()) gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is not None ds_raster = None # Failed filter by scene id gdal.FileFromMemBuffer('/vsimem/data_v1/item-types/PSOrthoTile', """{"id": "PSOrthoTile"}""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is not None ds_raster = None # Test metadata items attached to dataset gdal.FileFromMemBuffer("""/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSOrthoTile"],"filter":{"type":"AndFilter","config":[{"type":"StringInFilter","field_name":"id","config":["id"]}]}}""", """{ "id": "id", "properties": { "anomalous_pixels": 1.23 }, }""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=analytic']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is not None assert ds_raster.GetMetadataItem('anomalous_pixels') == '1.23' ds_raster = None # Test invalid ASSET gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id', 'ACTIVATION_TIMEOUT=1', 'ASSET=invalid']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # Test subdatasets gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds_raster = gdal.OpenEx('PLScenes:', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'ASSET=list', 'SCENE=id']) gdal.SetConfigOption('PL_URL', None) assert len(ds_raster.GetSubDatasets()) == 1 ds_raster = None # Unsupported option gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds_raster = gdal.OpenEx('PLScenes:unsupported=yes', gdal.OF_RASTER, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile', 'SCENE=id']) gdal.SetConfigOption('PL_URL', None) assert ds_raster is None # Test catalog with vector access gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds2 = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=PSOrthoTile']) gdal.SetConfigOption('PL_URL', None) assert ds2 is not None and ds2.GetLayerCount() == 1 gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') with gdaltest.error_handler(): ds2 = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo', 'ITEMTYPES=invalid']) gdal.SetConfigOption('PL_URL', None) assert ds2 is None fl = gdal.ReadDir('/vsimem/data_v1') for filename in fl: gdal.Unlink(filename) ############################################################################### # Test robustness to errors in Data V1 API def test_ogr_plscenes_data_v1_errors(): if gdaltest.plscenes_drv is None: pytest.skip() # No PL_API_KEY gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') old_key = gdal.GetConfigOption('PL_API_KEY') if old_key: gdal.SetConfigOption('PL_API_KEY', '') with gdaltest.error_handler(): ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1']) if old_key: gdal.SetConfigOption('PL_API_KEY', old_key) gdal.SetConfigOption('PL_URL', None) assert ds is None # Invalid option gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{ "item-types": [] }') with gdaltest.error_handler(): gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:version=data_v1,api_key=foo,invalid=invalid', gdal.OF_VECTOR) gdal.SetConfigOption('PL_URL', None) assert ds is None # Invalid JSON gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{invalid_json') with gdaltest.error_handler(): gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is None # Not an object gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', 'false') with gdaltest.error_handler(): gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is None # Lack of "item_types" gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{}') with gdaltest.error_handler(): gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds is None # Invalid catalog objects gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', """{"item_types": [{}, [], null, {"id":null}, {"id":"foo"}]}""") gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) assert ds.GetLayerCount() == 1 # Invalid next URL gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{"_links": { "_next": "/vsimem/inexisting" }, "item_types": [{"id": "my_catalog"}]}') gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) with gdaltest.error_handler(): lyr_count = ds.GetLayerCount() assert lyr_count == 1 gdal.FileFromMemBuffer('/vsimem/data_v1/item-types', '{"item_types": [{"id": "PSScene3Band"}]}') gdal.SetConfigOption('PL_URL', '/vsimem/data_v1/') ds = gdal.OpenEx('PLScenes:', gdal.OF_VECTOR, open_options=['VERSION=data_v1', 'API_KEY=foo']) gdal.SetConfigOption('PL_URL', None) lyr = ds.GetLayer(0) # Invalid index ds.GetLayer(-1) ds.GetLayer(1) with gdaltest.error_handler(): ds.GetLayerByName('invalid_name') # Cannot find /vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSScene3Band"],"filter":{"type":"AndFilter","config":[]}} with gdaltest.error_handler(): lyr.GetNextFeature() # Empty object gdal.FileFromMemBuffer('/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSScene3Band"],"filter":{"type":"AndFilter","config":[]}}', '{}') lyr.ResetReading() lyr.GetNextFeature() # null feature gdal.FileFromMemBuffer('/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSScene3Band"],"filter":{"type":"AndFilter","config":[]}}', '{ "features": [ null ] }') lyr.ResetReading() lyr.GetNextFeature() gdal.Unlink('/vsimem/data_v1/item-types') gdal.Unlink('/vsimem/data_v1/quick-search?_page_size=250&POSTFIELDS={"item_types":["PSScene3Band"],"filter":{"type":"AndFilter","config":[]}}') ############################################################################### # Test Data V1 API against real server def test_ogr_plscenes_data_v1_live(): if gdaltest.plscenes_drv is None: pytest.skip() api_key = gdal.GetConfigOption('PL_API_KEY') if api_key is None: pytest.skip('Skipping test as PL_API_KEY not defined') gdal.SetConfigOption('PLSCENES_PAGE_SIZE', '10') ds = ogr.Open('PLScenes:version=data_v1,FOLLOW_LINKS=YES') gdal.SetConfigOption('PLSCENES_PAGE_SIZE', None) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None lyr.SetAttributeFilter("permissions = 'assets:download'") f = lyr.GetNextFeature() assert f is not None catalog = lyr.GetName() scene = f['id'] f.DumpReadable() lyr_defn = lyr.GetLayerDefn() asset_name = None for i in range(lyr_defn.GetFieldCount()): fld_defn = lyr_defn.GetFieldDefn(i) name = fld_defn.GetName() if name.startswith('asset_') and name.endswith('_activate_link') and f.GetFieldAsString(i) != '': asset_name = name[len('asset_'):-len('_activate_link')] break elif name.startswith('asset_') and name.endswith('_location') and f.GetFieldAsString(i) != '': asset_name = name[len('asset_'):-len('_location')] break assert asset_name is not None acquired_field = lyr_defn.GetFieldIndex('acquired') assert acquired_field >= 0 and lyr_defn.GetFieldDefn(acquired_field).GetType() == ogr.OFTDateTime if not f.IsFieldSet(acquired_field): f.DumpReadable() pytest.fail() int_field = -1 float_field = -1 string_field = -1 for i in range(lyr_defn.GetFieldCount()): typ = lyr_defn.GetFieldDefn(i).GetType() if int_field < 0 and typ == ogr.OFTInteger and f.IsFieldSet(i): int_field = i elif float_field < 0 and typ == ogr.OFTReal and f.IsFieldSet(i): float_field = i elif string_field < 0 and typ == ogr.OFTString and f.IsFieldSet(i): string_field = i filtr = "acquired='%s'" % f.GetFieldAsString(acquired_field) if int_field >= 0: name = lyr_defn.GetFieldDefn(int_field).GetName() mini = f.GetField(int_field) - 1 maxi = f.GetField(int_field) + 1 filtr += ' AND %s >= %d AND %s <= %d' % (name, mini, name, maxi) if float_field >= 0: name = lyr_defn.GetFieldDefn(float_field).GetName() mini = f.GetField(float_field) - 0.01 maxi = f.GetField(float_field) + 0.01 filtr += ' AND %s BETWEEN %f AND %f' % (name, mini, maxi) if string_field >= 0: name = lyr_defn.GetFieldDefn(string_field).GetName() value = f.GetField(string_field) filtr += " AND %s = '%s'" % (name, value) lyr.SetAttributeFilter(filtr) f = lyr.GetNextFeature() assert f is not None ds = None ds = gdal.Open('PLScenes:version=data_v1,itemtypes=%s,scene=%s,asset=%s' % (catalog, scene, asset_name)) assert ds is not None assert ds.RasterCount != 0 gdalautotest-3.0.4/ogr/ogr_geojsonseq.py0000755003401500001440000001500513614005325020020 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_geojsonseq.py cc22f70e70eb1aaf67807d67d2282105896d0a07 2019-03-17 16:04:54 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGRGeoJSONSeq driver. # 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. ############################################################################### from osgeo import gdal from osgeo import osr from osgeo import ogr import gdaltest import pytest def _ogr_geojsonseq_create(filename, lco, expect_rs): ds = ogr.GetDriverByName('GeoJSONSeq').CreateDataSource(filename) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') lyr = ds.CreateLayer('test', srs=sr, options=lco) lyr.CreateField(ogr.FieldDefn('foo')) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar"d' f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'baz' f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(3 4)')) lyr.CreateFeature(f) assert not ds.TestCapability(ogr.ODsCCreateLayer) with gdaltest.error_handler(): assert ds.CreateLayer('foo') is None ds = None f = gdal.VSIFOpenL(filename, 'rb') first = gdal.VSIFReadL(1, 1, f).decode('ascii') gdal.VSIFCloseL(f) if expect_rs: assert first == '\x1e' else: assert first == '{' ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['foo'] != 'bar"d' or \ f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['foo'] != 'baz' or f.GetGeometryRef().ExportToWkt() != 'POINT (3 4)': f.DumpReadable() pytest.fail() assert lyr.GetNextFeature() is None ds = None ogr.GetDriverByName('GeoJSONSeq').DeleteDataSource(filename) def test_ogr_geojsonseq_lf(): return _ogr_geojsonseq_create('/vsimem/test', [], False) def test_ogr_geojsonseq_rs(): return _ogr_geojsonseq_create('/vsimem/test', ['RS=YES'], True) def test_ogr_geojsonseq_rs_auto(): return _ogr_geojsonseq_create('/vsimem/test.geojsons', [], True) def test_ogr_geojsonseq_inline(): ds = ogr.Open("""{"type":"Feature","properties":{},"geometry":null} {"type":"Feature","properties":{},"geometry":null}""") lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 def test_ogr_geojsonseq_prefix(): ds = ogr.Open("""GeoJSONSeq:data/test.geojsonl""") lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 def test_ogr_geojsonseq_seq_geometries(): with gdaltest.config_option('OGR_GEOJSONSEQ_CHUNK_SIZE', '10'): ds = ogr.Open("""{"type":"Point","coordinates":[2,49]} {"type":"Point","coordinates":[3,50]}""") lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() def test_ogr_geojsonseq_seq_geometries_with_errors(): with gdaltest.error_handler(): ds = ogr.Open("""{"type":"Point","coordinates":[2,49]} {"type":"Point","coordinates":[3,50]} foo "bar" null {"type":"Point","coordinates":[3,51]}""") lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 3 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 51)': f.DumpReadable() pytest.fail() def test_ogr_geojsonseq_reprojection(): filename = '/vsimem/ogr_geojsonseq_reprojection.geojsonl' ds = ogr.GetDriverByName('GeoJSONSeq').CreateDataSource(filename) sr = osr.SpatialReference() sr.SetFromUserInput('+proj=merc +datum=WGS84') lyr = ds.CreateLayer('test', srs=sr) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt( 'POINT(222638.981586547 6242595.9999532)')) lyr.CreateFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('GeoJSONSeq').DeleteDataSource(filename) def test_ogr_geojsonseq_read_rs_json_pretty(): ds = ogr.Open('data/test.geojsons') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['foo'] != 'bar' or \ f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['foo'] != 'baz' or f.GetGeometryRef().ExportToWkt() != 'POINT (3 4)': f.DumpReadable() pytest.fail() assert lyr.GetNextFeature() is None def test_ogr_geojsonseq_test_ogrsf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal( test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.geojsonl') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 gdalautotest-3.0.4/ogr/ogr_elasticsearch.py0000755003401500001440000024350313614005325020463 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_elasticsearch.py 680584c4e6357cd4de9b581781579b8711985cc9 2019-11-21 13:44:27 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: ElasticSearch driver testing (with fake server) # Author: Even Rouault # ############################################################################### # Copyright (c) 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 ogrtest import gdaltest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test driver availability # def test_ogr_elasticsearch_init(): ogrtest.elasticsearch_drv = None ogrtest.srs_wgs84 = osr.SpatialReference() ogrtest.srs_wgs84.SetFromUserInput('WGS84') ogrtest.elasticsearch_drv = ogr.GetDriverByName('ElasticSearch') if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ############################################################################### # Test writing into an nonexistent ElasticSearch datastore. def test_ogr_elasticsearch_nonexistent_server(): if ogrtest.elasticsearch_drv is None: pytest.skip() with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.CreateDataSource( '/vsimem/nonexistent_host') assert ds is None, 'managed to open nonexistent ElasticSearch datastore.' with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.Open('ES:/vsimem/nonexistent_host') assert ds is None, 'managed to open nonexistent ElasticSearch datastore.' gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{}""") with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.Open('ES:/vsimem/fakeelasticsearch') assert ds is None, 'managed to open invalid ElasticSearch datastore.' gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":null}""") with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.Open('ES:/vsimem/fakeelasticsearch') assert ds is None, 'managed to open invalid ElasticSearch datastore.' gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{}}""") with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.Open('ES:/vsimem/fakeelasticsearch') assert ds is None, 'managed to open invalid ElasticSearch datastore.' gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{"number":null}}""") with gdaltest.error_handler(): ds = ogrtest.elasticsearch_drv.Open('ES:/vsimem/fakeelasticsearch') assert ds is None, 'managed to open invalid ElasticSearch datastore.' ############################################################################### # Simple test def test_ogr_elasticsearch_1(): if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{"number":"2.0.0"}}""") ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") assert ds is not None, 'did not managed to open ElasticSearch datastore' assert ds.TestCapability(ogr.ODsCCreateLayer) != 0 assert ds.TestCapability(ogr.ODsCDeleteLayer) != 0 assert ds.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) != 0 # Failed index creation with gdaltest.error_handler(): lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=['FID=']) assert lyr is None assert gdal.GetLastErrorType() == gdal.CE_Failure gdal.ErrorReset() # Successful index creation gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=PUT', '{}') lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=['FID=']) assert lyr is not None assert gdal.GetLastErrorType() == gdal.CE_None gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo/_mapping/FeatureCollection&POSTFIELDS' '={ "FeatureCollection": { "properties": { "type": ' '{ "type": "string" }, "properties": { } } } }', '{}') # OVERWRITE an nonexistent layer. lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, options=['OVERWRITE=TRUE', 'FID=']) assert gdal.GetLastErrorType() == gdal.CE_None # Simulate failed overwrite gdal.FileFromMemBuffer('/vsimem/fakeelasticsearch/foo', '{"foo":{"mappings":{"FeatureCollection":{}}}}') with gdaltest.error_handler(): lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, options=['OVERWRITE=TRUE']) assert gdal.GetLastErrorType() == gdal.CE_Failure gdal.ErrorReset() # Successful overwrite gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=DELETE', '{}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo/FeatureCollection/&POSTFIELDS={ }', '{}') lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone, options=[ 'OVERWRITE=TRUE', 'BULK_INSERT=NO', 'FID=']) assert gdal.GetLastErrorType() == gdal.CE_None assert lyr.TestCapability(ogr.OLCFastFeatureCount) != 0 assert lyr.TestCapability(ogr.OLCStringsAsUTF8) != 0 assert lyr.TestCapability(ogr.OLCSequentialWrite) != 0 assert lyr.TestCapability(ogr.OLCCreateField) != 0 assert lyr.TestCapability(ogr.OLCCreateGeomField) != 0 feat = ogr.Feature(lyr.GetLayerDefn()) gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo/FeatureCollection/&POSTFIELDS={ "properties": { } }', '{}') ret = lyr.CreateFeature(feat) assert ret == 0 feat = None gdal.FileFromMemBuffer('/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=PUT', '{"error":"IndexAlreadyExistsException[[foo] already exists]","status":400}') with gdaltest.error_handler(): lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84) assert gdal.GetLastErrorType() == gdal.CE_Failure assert lyr is None gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/foo/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } } } }""", "") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", '') ds.DeleteLayer(-1) ds.DeleteLayer(10) ret = ds.DeleteLayer(0) assert ret == 0 gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo2&CUSTOMREQUEST=PUT', '{}') gdal.FileFromMemBuffer('/vsimem/fakeelasticsearch/foo2/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { "str_field": { "type": "string", "index": "not_analyzed" }, "int_field": { "type": "integer", "store": "yes" }, "int64_field": { "type": "long", "index": "no" }, "real_field": { "type": "double" }, "real_field_unset": { "type": "double" }, "boolean_field": { "type": "boolean" }, "strlist_field": { "type": "string" }, "intlist_field": { "type": "integer" }, "int64list_field": { "type": "long" }, "reallist_field": { "type": "double" }, "date_field": { "type": "date", "format": "yyyy\/MM\/dd HH:mm:ss.SSSZZ||yyyy\/MM\/dd HH:mm:ss.SSS||yyyy\/MM\/dd" }, "datetime_field": { "type": "date", "format": "yyyy\/MM\/dd HH:mm:ss.SSSZZ||yyyy\/MM\/dd HH:mm:ss.SSS||yyyy\/MM\/dd" }, "time_field": { "type": "date", "format": "HH:mm:ss.SSS" }, "binary_field": { "type": "binary" } } }, "geometry": { "properties": { "type": { "type": "string" }, "coordinates": { "type": "geo_point" } } } }, "_meta": { "fields": { "strlist_field": "StringList", "intlist_field": "IntegerList", "int64list_field": "Integer64List", "reallist_field": "RealList" } } } }', '{}') lyr = ds.CreateLayer('foo2', srs=ogrtest.srs_wgs84, geom_type=ogr.wkbPoint, options=['BULK_INSERT=NO', 'FID=', 'STORED_FIELDS=int_field', 'NOT_ANALYZED_FIELDS=str_field', 'NOT_INDEXED_FIELDS=int64_field']) lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int_field', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64_field', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('real_field', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('real_field_unset', ogr.OFTReal)) fld_defn = ogr.FieldDefn('boolean_field', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) lyr.CreateField(ogr.FieldDefn('strlist_field', ogr.OFTStringList)) lyr.CreateField(ogr.FieldDefn('intlist_field', ogr.OFTIntegerList)) lyr.CreateField(ogr.FieldDefn('int64list_field', ogr.OFTInteger64List)) lyr.CreateField(ogr.FieldDefn('reallist_field', ogr.OFTRealList)) lyr.CreateField(ogr.FieldDefn('date_field', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('datetime_field', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('time_field', ogr.OFTTime)) lyr.CreateField(ogr.FieldDefn('binary_field', ogr.OFTBinary)) ret = lyr.SyncToDisk() assert ret == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str_field', 'a') feat.SetField('int_field', 1) feat.SetField('int64_field', 123456789012) feat.SetField('real_field', 2.34) feat.SetField('boolean_field', 1) feat['strlist_field'] = ['a', 'b'] feat['intlist_field'] = [1, 2] feat['int64list_field'] = [123456789012, 2] feat['reallist_field'] = [1.23, 4.56] feat['date_field'] = '2015/08/12' feat['datetime_field'] = '2015/08/12 12:34:56.789' feat['time_field'] = '12:34:56.789' feat.SetFieldBinaryFromHexString('binary_field', '0123465789ABCDEF') feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) # Simulate server error with gdaltest.error_handler(): ret = lyr.CreateFeature(feat) assert ret != 0 # Success gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo2/FeatureCollection/&POSTFIELDS={ "geometry": { "type": "POINT", "coordinates": [ 0.0, 1.0 ] }, "type": "Feature", "properties": { "str_field": "a", "int_field": 1, "int64_field": 123456789012, "real_field": 2.34, "boolean_field": true, "strlist_field": [ "a", "b" ], "intlist_field": [ 1, 2 ], "int64list_field": [ 123456789012, 2 ], "reallist_field": [ 1.23, 4.56 ], "date_field": "2015\/08\/12", "datetime_field": "2015\/08\/12 12:34:56.789", "time_field": "12:34:56.789", "binary_field": "ASNGV4mrze8=" } }', '{ "_id": "my_id" }') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat['_id'] == 'my_id' # DateTime with TZ gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo2/FeatureCollection/&POSTFIELDS={ "properties": { "datetime_field": "2015\/08\/12 12:34:56.789+03:00" } }', '{}') feat = ogr.Feature(lyr.GetLayerDefn()) feat['datetime_field'] = '2015/08/12 12:34:56.789+0300' ret = lyr.CreateFeature(feat) assert ret == 0 # CreateFeature() with _id set gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo2/FeatureCollection/my_id2&POSTFIELDS={ "properties": { } }', '{}') feat = ogr.Feature(lyr.GetLayerDefn()) feat['_id'] = 'my_id2' ret = lyr.CreateFeature(feat) assert ret == 0 # Failed SetFeature because of missing _id feat = ogr.Feature(lyr.GetLayerDefn()) with gdaltest.error_handler(): ret = lyr.SetFeature(feat) assert ret != 0 # Simulate server error feat['_id'] = 'my_id' with gdaltest.error_handler(): ret = lyr.SetFeature(feat) assert ret != 0 gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo2/FeatureCollection/my_id&POSTFIELDS={ "properties": { } }', '{}') ret = lyr.SetFeature(feat) assert ret == 0 # With explicit GEOM_MAPPING_TYPE=GEO_POINT gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo3&CUSTOMREQUEST=PUT', '{}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo3/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "properties": { "type": { "type": "string" }, "coordinates": { "type": "geo_point", "fielddata": { "format": "compressed", "precision": "1m" } } } } }, "_meta": { "fid": "ogc_fid" } } }', '{}') lyr = ds.CreateLayer('foo3', srs=ogrtest.srs_wgs84, options=[ 'GEOM_MAPPING_TYPE=GEO_POINT', 'GEOM_PRECISION=1m', 'BULK_INSERT=NO']) gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo3/FeatureCollection/&POSTFIELDS={ "ogc_fid": 1, "geometry": { "type": "POINT", "coordinates": [ 0.5, 0.5 ] }, "type": "Feature", "properties": { } }', '{}') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) ret = lyr.CreateFeature(feat) assert ret == 0 feat = None # Test explicit MAPPING first with error case gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4&CUSTOMREQUEST=PUT', '{}') with gdaltest.error_handler(): lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=[ 'MAPPING={ "FeatureCollection": { "properties": {} }}']) assert lyr is None # Test successful explicit MAPPING with inline JSon mapping gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": {} }}', '{}') lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=[ 'MAPPING={ "FeatureCollection": { "properties": {} }}']) assert lyr is not None # Test successful explicit MAPPING with reference to file with mapping gdal.FileFromMemBuffer( '/vsimem/map.txt', '{ "FeatureCollection": { "properties": { "foo": { "type": "string" } } }}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "foo": { "type": "string" } } }}', '{}') lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=['MAPPING=/vsimem/map.txt']) gdal.Unlink('/vsimem/map.txt') assert lyr is not None # Test successful explicit INDEX_DEFINITION with inline JSon mapping gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4&CUSTOMREQUEST=PUT&POSTFIELDS={}', '{}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4/_mapping/FeatureCollection&POSTFIELDS={}', '{}') lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=[ 'INDEX_DEFINITION={}', 'MAPPING={}']) assert lyr is not None # Test successful explicit INDEX_DEFINITION with reference to file gdal.FileFromMemBuffer('/vsimem/map.txt', '{"foo":"bar"}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo4&CUSTOMREQUEST=PUT&POSTFIELDS={"foo":"bar"}', '{}') lyr = ds.CreateLayer('foo4', srs=ogrtest.srs_wgs84, options=['INDEX_DEFINITION=/vsimem/map.txt', 'MAPPING={}']) gdal.Unlink('/vsimem/map.txt') assert lyr is not None ############################################################################### # Geo_shape geometries def test_ogr_elasticsearch_2(): if ogrtest.elasticsearch_drv is None: pytest.skip() ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") assert ds is not None, 'did not managed to open ElasticSearch datastore' gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo&CUSTOMREQUEST=PUT', '{}') gdal.Unlink('/vsimem/fakeelasticsearch/foo') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { }, "geometry": { "type": "geo_shape" } } } }', '{}') lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=['BULK_INSERT=NO', 'FID=']) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt( 'GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(0 1,2 3),POLYGON((0 0,0 10,10 10,0 0),(1 1,1 9,9 9,1 1)),MULTIPOINT(0 1, 2 3),MULTILINESTRING((0 1,2 3),(4 5,6 7)),MULTIPOLYGON(((0 0,0 10,10 10,0 0),(1 1,1 9,9 9,1 1)),((-1 -1,-1 -9,-9 -9,-1 -1))))')) gdal.FileFromMemBuffer('/vsimem/fakeelasticsearch/foo/FeatureCollection/&POSTFIELDS={ "geometry": { "type": "geometrycollection", "geometries": [ { "type": "point", "coordinates": [ 0.0, 1.0 ] }, { "type": "linestring", "coordinates": [ [ 0.0, 1.0 ], [ 2.0, 3.0 ] ] }, { "type": "polygon", "coordinates": [ [ [ 0.0, 0.0 ], [ 0.0, 10.0 ], [ 10.0, 10.0 ], [ 0.0, 0.0 ] ], [ [ 1.0, 1.0 ], [ 1.0, 9.0 ], [ 9.0, 9.0 ], [ 1.0, 1.0 ] ] ] }, { "type": "multipoint", "coordinates": [ [ 0.0, 1.0 ], [ 2.0, 3.0 ] ] }, { "type": "multilinestring", "coordinates": [ [ [ 0.0, 1.0 ], [ 2.0, 3.0 ] ], [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ] ] }, { "type": "multipolygon", "coordinates": [ [ [ [ 0.0, 0.0 ], [ 0.0, 10.0 ], [ 10.0, 10.0 ], [ 0.0, 0.0 ] ], [ [ 1.0, 1.0 ], [ 1.0, 9.0 ], [ 9.0, 9.0 ], [ 1.0, 1.0 ] ] ], [ [ [ -1.0, -1.0 ], [ -1.0, -9.0 ], [ -9.0, -9.0 ], [ -1.0, -1.0 ] ] ] ] } ] }, "type": "Feature", "properties": { } }', '{}') ret = lyr.CreateFeature(feat) assert ret == 0 feat = None # Same but with explicit GEOM_MAPPING_TYPE=GEO_SHAPE lyr = ds.CreateLayer('foo', srs=ogrtest.srs_wgs84, options=[ 'GEOM_MAPPING_TYPE=GEO_SHAPE', 'GEOM_PRECISION=1m', 'BULK_INSERT=NO', 'FID=']) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt( 'GEOMETRYCOLLECTION(POINT(0 1),LINESTRING(0 1,2 3),POLYGON((0 0,0 10,10 10,0 0),(1 1,1 9,9 9,1 1)),MULTIPOINT(0 1, 2 3),MULTILINESTRING((0 1,2 3),(4 5,6 7)),MULTIPOLYGON(((0 0,0 10,10 10,0 0),(1 1,1 9,9 9,1 1)),((-1 -1,-1 -9,-9 -9,-1 -1))))')) gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/foo/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape", "precision": "1m" } } } }', '{}') ret = lyr.CreateFeature(feat) assert ret == 0 feat = None ############################################################################### # Test bulk insert and layer name laundering def test_ogr_elasticsearch_3(): if ogrtest.elasticsearch_drv is None: pytest.skip() ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") assert ds is not None, 'did not managed to open ElasticSearch datastore' gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/name_laundering&CUSTOMREQUEST=PUT', '{}') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/name_laundering/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } } } }', '{}') lyr = ds.CreateLayer( 'NAME/laundering', srs=ogrtest.srs_wgs84, options=['FID=']) feat = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(feat) assert ret == 0 feat = None with gdaltest.error_handler(): ret = lyr.SyncToDisk() assert ret != 0 feat = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(feat) assert ret == 0 feat = None gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"name_laundering", "_type":"FeatureCollection"}} { "properties": { } } """, '{}') ret = lyr.SyncToDisk() assert ret == 0 ds = None ############################################################################### # Test basic read functionality def test_ogr_elasticsearch_4(): if ogrtest.elasticsearch_drv is None: pytest.skip() with gdaltest.error_handler(): ds = ogr.Open('ES:/vsimem/fakeelasticsearch') assert ds is not None # Test case where there's no index gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", '\n') ds = ogr.Open('ES:/vsimem/fakeelasticsearch') assert ds is not None assert ds.GetLayerCount() == 0 # Test opening a layer by name gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", """ { "a_layer": { "mappings": { "FeatureCollection": { "_meta": { "fid": "my_fid", "geomfields": { "a_geoshape": "LINESTRING" }, "fields": { "strlist_field": "StringList", "intlist_field": "IntegerList", "int64list_field": "Integer64List", "doublelist_field": "RealList" } }, "properties": { "type": { "type": "string" }, "a_geoshape": { "type": "geo_shape", }, "a_geopoint": { "properties": { "coordinates": { "type": "geo_point" } } }, "my_fid": { "type": "long" }, "properties" : { "properties": { "str_field": { "type": "string"}, "int_field": { "type": "integer"}, "int64_field": { "type": "long"}, "double_field": { "type": "double"}, "float_field": { "type": "float"}, "boolean_field": { "type": "boolean"}, "binary_field": { "type": "binary"}, "dt_field": { "type": "date"}, "date_field": { "type": "date", "format": "yyyy\/MM\/dd"}, "time_field": { "type": "date", "format": "HH:mm:ss.SSS"}, "strlist_field": { "type": "string"}, "intlist_field": { "type": "integer"}, "int64list_field": { "type": "long"}, "doublelist_field": { "type": "double"} } } } } } } } """) ds = ogr.Open('ES:/vsimem/fakeelasticsearch') assert ds is not None lyr = ds.GetLayerByName('a_layer') assert lyr is not None lyr = ds.GetLayerByName('a_layer') assert lyr is not None with gdaltest.error_handler(): lyr = ds.GetLayerByName('not_a_layer') assert lyr is None ds = None # Test LAYER open option ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', open_options=['LAYER=a_layer']) assert ds.GetLayerCount() == 1 ds = None with gdaltest.error_handler(): ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', open_options=['LAYER=not_a_layer']) assert ds is None ds = None # Test GetLayerByName() and GetLayerCount() ds = ogr.Open('ES:/vsimem/fakeelasticsearch') lyr = ds.GetLayerByName('a_layer') lyr = ds.GetLayerByName('a_layer') assert ds.GetLayerCount() == 1 ds = None # Test GetLayerCount() gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'a_layer \n') ds = ogr.Open('ES:/vsimem/fakeelasticsearch') assert ds is not None assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) with gdaltest.error_handler(): lyr_defn = lyr.GetLayerDefn() idx = lyr_defn.GetFieldIndex("strlist_field") assert lyr_defn.GetFieldDefn(idx).GetType() == ogr.OFTStringList idx = lyr_defn.GetGeomFieldIndex("a_geoshape") assert lyr_defn.GetGeomFieldDefn(idx).GetType() == ogr.wkbLineString assert lyr.GetFIDColumn() == 'my_fid' gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ }""") with gdaltest.error_handler(): lyr.GetFeatureCount() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ "hits": null }""") with gdaltest.error_handler(): lyr.GetFeatureCount() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ "hits": { "count": null } }""") with gdaltest.error_handler(): lyr.GetFeatureCount() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ "hits": { "count": 3 } }""") fc = lyr.GetFeatureCount() assert fc == 3 with gdaltest.error_handler(): f = lyr.GetNextFeature() assert f is None gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ }""") lyr.ResetReading() f = lyr.GetNextFeature() assert f is None gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "hits": null }""") lyr.ResetReading() lyr.GetNextFeature() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "hits": { "hits": null } }""") lyr.ResetReading() lyr.GetNextFeature() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "hits": { "hits": [ null, {}, { "_source":null } ] } }""") lyr.ResetReading() lyr.GetNextFeature() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "my_fid": 5, "a_geopoint" : { "type": "POINT", "coordinates": [2,49] }, "a_geoshape": { "type": "linestring", "coordinates": [[2,49],[3,50]] }, "properties": { "str_field": "foo", "int_field": 1, "int64_field": 123456789012, "double_field": 1.23, "float_field": 3.45, "boolean_field": true, "binary_field": "ASNGV4mrze8=", "dt_field": "2015\/08\/12 12:34:56.789", "date_field": "2015\/08\/12", "time_field": "12:34:56.789", "strlist_field": ["foo"], "intlist_field": [1], "int64list_field": [123456789012], "doublelist_field": [1.23] } }, }] } }""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", "{}") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE""", '{}') ds = ogr.Open('ES:/vsimem/fakeelasticsearch') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 15 gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "a_geopoint" : { "type": "POINT", "coordinates": [2,49] }, "a_geoshape": { "type": "linestring", "coordinates": [[2,49],[3,50]] }, "my_fid": 5, "properties": { "str_field": "foo", "int_field": 1, "int64_field": 123456789012, "double_field": 1.23, "float_field": 3.45, "boolean_field": true, "binary_field": "ASNGV4mrze8=", "dt_field": "2015\/08\/12 12:34:56.789", "date_field": "2015\/08\/12", "time_field": "12:34:56.789", "strlist_field": ["foo"], "intlist_field": [1], "int64list_field": [123456789012], "doublelist_field": [1.23] } }, }, { "_source": { "type": "Feature", "properties": { "non_existing": "foo" } }, } ] } }""") lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None if f.GetFID() != 5 or f['_id'] != 'my_id' or f['str_field'] != 'foo' or f['int_field'] != 1 or f['int64_field'] != 123456789012 or \ f['double_field'] != 1.23 or f['float_field'] != 3.45 or f['boolean_field'] != 1 or \ f['binary_field'] != '0123465789ABCDEF' or f['dt_field'] != '2015/08/12 12:34:56.789' or \ f['date_field'] != '2015/08/12' or f['time_field'] != '12:34:56.789' or \ f['strlist_field'] != ['foo'] or \ f['intlist_field'] != [1] or \ f['int64list_field'] != [123456789012] or \ f['doublelist_field'] != [1.23] or \ f['a_geopoint'].ExportToWkt() != 'POINT (2 49)' or \ f['a_geoshape'].ExportToWkt() != 'LINESTRING (2 49,3 50)': f.DumpReadable() pytest.fail() lyr.ResetReading() lyr.GetNextFeature() f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{ "hits": { "hits":[ { "_source": { "type": "Feature", "properties": { "int_field": 2, } }, } ] } }""") f = lyr.GetNextFeature() assert f['int_field'] == 2 gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{ "hits": { "hits":[] } }""") f = lyr.GetNextFeature() assert f is None f = lyr.GetNextFeature() assert f is None lyr.SetSpatialFilterRect(1, 48, 3, 50) lyr.ResetReading() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "geo_shape": { "a_geoshape": { "shape": { "type": "envelope", "coordinates": [ [ 1.0, 50.0 ], [ 3.0, 48.0 ] ] } } } } } } }""", """{ "hits": { "hits":[ { "_source": { "type": "Feature", "a_geoshape" : { "type": "POINT", "coordinates": [2,49] }, "properties": { "int_field": 3, } }, } ] } }""") f = lyr.GetNextFeature() assert f['int_field'] == 3 lyr.SetSpatialFilterRect(1, 1, 48, 3, 50) lyr.ResetReading() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "geo_bounding_box": { "a_geopoint.coordinates": { "top_left": { "lat": 50.0, "lon": 1.0 }, "bottom_right": { "lat": 48.0, "lon": 3.0 } } } } } } }""", """{ "hits": { "hits":[ { "_source": { "type": "Feature", "a_geopoint" : { "type": "POINT", "coordinates": [2,49] }, "properties": { "int_field": 4, } }, } ] } }""") f = lyr.GetNextFeature() assert f['int_field'] == 4 gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?pretty&POSTFIELDS={ "size": 0, "query": { "constant_score" : { "filter": { "geo_bounding_box": { "a_geopoint.coordinates": { "top_left": { "lat": 50.0, "lon": 1.0 }, "bottom_right": { "lat": 48.0, "lon": 3.0 } } } } } } }""", """{ "hits": { "total": 10 } }""") fc = lyr.GetFeatureCount() assert fc == 10 lyr.SetSpatialFilter(None) lyr.SetSpatialFilterRect(-180, -90, 180, 90) with gdaltest.error_handler(): lyr.SetSpatialFilter(-1, None) lyr.SetSpatialFilter(2, None) lyr.SetAttributeFilter("{ 'FOO' : 'BAR' }") lyr.ResetReading() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", """{ "hits": { "hits":[ { "_source": { "type": "Feature", "a_geoshape" : { "type": "POINT", "coordinates": [2,49] }, "properties": { "int_field": 5, } }, } ] } }""") f = lyr.GetNextFeature() assert f['int_field'] == 5 lyr.SetAttributeFilter(None) sql_lyr = ds.ExecuteSQL("{ 'FOO' : 'BAR' }", dialect='ES') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_search?scroll=1m&size=100&POSTFIELDS={ 'FOO' : 'BAR' }""", """{ "hits": { "hits":[ { "_index": "some_layer", "_type": "some_type", "_source": { "some_field": 5 }, } ] } }""") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/some_layer/_mapping/some_type?pretty""", """ { "some_layer": { "mappings": { "some_type": { "properties": { "some_field": { "type": "string"} } } } } } """) f = sql_lyr.GetNextFeature() if f['some_field'] != '5': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # Invalid index with gdaltest.error_handler(): bbox = lyr.GetExtent(geom_field=-1) # geo_shape bbox = lyr.GetExtent(geom_field=0) # Invalid index with gdaltest.error_handler(): bbox = lyr.GetExtent(geom_field=2) # No response with gdaltest.error_handler(): bbox = lyr.GetExtent(geom_field=1) # Invalid response gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?search_type=count&pretty&POSTFIELDS={ "aggs" : { "bbox" : { "geo_bounds" : { "field" : "a_geopoint.coordinates" } } } }""", """{ "aggregations" : { "bbox" : { "bounds" : { "top_left" : { }, "bottom_right" : { } } } } }""") with gdaltest.error_handler(): bbox = lyr.GetExtent(geom_field=1) # Valid response gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?pretty&POSTFIELDS={ "size": 0, "aggs" : { "bbox" : { "geo_bounds" : { "field" : "a_geopoint.coordinates" } } } }""", """{ "aggregations" : { "bbox" : { "bounds" : { "top_left" : { "lat" : 10, "lon" : 1 }, "bottom_right" : { "lat" : 9, "lon" : 2 } } } } }""") bbox = lyr.GetExtent(geom_field=1) assert bbox == (1.0, 2.0, 9.0, 10.0) # Operations not available in read-only mode with gdaltest.error_handler(): ret = lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) assert ret != 0 with gdaltest.error_handler(): ret = lyr.CreateGeomField(ogr.GeomFieldDefn('shape', ogr.wkbPoint)) assert ret != 0 with gdaltest.error_handler(): ret = lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) assert ret != 0 lyr.ResetReading() with gdaltest.error_handler(): ret = lyr.SetFeature(lyr.GetNextFeature()) assert ret != 0 with gdaltest.error_handler(): lyr = ds.CreateLayer('will_not_work') assert lyr is None with gdaltest.error_handler(): ret = ds.DeleteLayer(0) assert ret != 0 ############################################################################### # Write documents with non geojson structure def test_ogr_elasticsearch_5(): if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/non_geojson&CUSTOMREQUEST=PUT', '') gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/non_geojson/_mapping/my_mapping&POSTFIELDS={ "my_mapping": { "properties": { "str": { "type": "string", "store": "yes" }, "geometry": { "type": "geo_shape" } }, "_meta": { "fid": "ogc_fid" } } }', '{}') lyr = ds.CreateLayer('non_geojson', srs=ogrtest.srs_wgs84, options=[ 'MAPPING_NAME=my_mapping', 'BULK_INSERT=NO', 'STORE_FIELDS=YES']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(5) feat['str'] = 'foo' gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/non_geojson/my_mapping/&POSTFIELDS={ "ogc_fid": 5, "str": "foo" }', '{}') ret = lyr.CreateFeature(feat) assert ret == 0 feat = None ds = None gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'non_geojson\n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_geojson/_mapping?pretty""", """ { "non_geojson": { "mappings": { "my_mapping": { "properties": { "a_geoshape": { "type": "geo_shape", }, "a_geopoint": { "properties": { "type": "string", "coordinates": { "type": "geo_point" } } }, "another_geopoint": { "type": "geo_point" }, "str_field": { "type": "string"}, "superobject": { "properties": { "subfield": { "type": "string" }, "subobject": { "properties": { "subfield": { "type": "string" } } }, "another_geoshape": { "type": "geo_shape" } } } } } } } } """) ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", gdal.OF_UPDATE, open_options=['BULK_INSERT=NO']) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_geojson/my_mapping/_search?scroll=1m&size=100""", """{ "hits": { "hits":[ { "_source": { "a_geopoint" : { "type": "POINT", "coordinates": [2,49] }, "a_geoshape": { "type": "linestring", "coordinates": [[2,49],[3,50]] }, "another_geopoint": "49.5,2.5", "str_field": "foo", "superobject": { "subfield": 5, "subobject": { "subfield": "foo", "another_subfield": 6 }, "another_geoshape": { "type": "point", "coordinates": [3,50] }, "another_geoshape2": { "type": "point", "coordinates": [2,50] } } } }, { "_source": { "another_field": "foo", "another_geopoint": { "lat": 49.1, "lon": 2.1 } } }, { "_source": { "another_geopoint": "49.2,2.2" } }, { "_source": {""" + # "this is the geohash format", """ "another_geopoint": "u09qv80meqh16ve02equ" } }] } }""") index = lyr.GetLayerDefn().GetFieldIndex('another_field') assert index >= 0 f = lyr.GetNextFeature() if f['str_field'] != 'foo' or \ f['superobject.subfield'] != '5' or \ f['superobject.subobject.subfield'] != 'foo' or \ f['superobject.subobject.another_subfield'] != 6 or \ f['a_geopoint'].ExportToWkt() != 'POINT (2 49)' or \ f['another_geopoint'].ExportToWkt() != 'POINT (2.5 49.5)' or \ f['a_geoshape'].ExportToWkt() != 'LINESTRING (2 49,3 50)' or \ f['superobject.another_geoshape'].ExportToWkt() != 'POINT (3 50)' or \ f['superobject.another_geoshape2'].ExportToWkt() != 'POINT (2 50)': f.DumpReadable() pytest.fail() f['_id'] = 'my_id' gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/non_geojson/my_mapping/my_id&POSTFIELDS={ "a_geoshape": { "type": "linestring", "coordinates": [ [ 2.0, 49.0 ], [ 3.0, 50.0 ] ] }, "a_geopoint": { "type": "POINT", "coordinates": [ 2.0, 49.0 ] }, "another_geopoint": [ 2.5, 49.5 ], "superobject": { "another_geoshape": { "type": "point", "coordinates": [ 3.0, 50.0 ] }, "another_geoshape2": { "type": "point", "coordinates": [ 2.0, 50.0 ] }, "subfield": "5", "subobject": { "subfield": "foo", "another_subfield": 6 } }, "str_field": "foo" }""", "{}") ret = lyr.SetFeature(f) assert ret == 0 f = lyr.GetNextFeature() if f['another_geopoint'].ExportToWkt() != 'POINT (2.1 49.1)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['another_geopoint'].ExportToWkt() != 'POINT (2.2 49.2)': f.DumpReadable() pytest.fail() # Test geohash f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f['another_geopoint'], 'POINT (2 49)') != 0: f.DumpReadable() pytest.fail() f = None lyr.CreateField(ogr.FieldDefn('superobject.subfield2', ogr.OFTString)) with gdaltest.error_handler(): lyr.CreateGeomField(ogr.GeomFieldDefn( 'superobject.another_geoshape3', ogr.wkbPoint)) f = ogr.Feature(lyr.GetLayerDefn()) f['superobject.subfield2'] = 'foo' f['superobject.another_geoshape3'] = ogr.CreateGeometryFromWkt( 'POINT (3 50)') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_geojson/_mapping/my_mapping&POSTFIELDS={ "my_mapping": { "properties": { "str_field": { "type": "string" }, "superobject": { "properties": { "subfield": { "type": "string" }, "subobject": { "properties": { "subfield": { "type": "string" }, "another_subfield": { "type": "integer" } } }, "subfield2": { "type": "string" }, "another_geoshape": { "type": "geo_shape" }, "another_geoshape2": { "type": "geo_shape" }, "another_geoshape3": { "properties": { "type": { "type": "string" }, "coordinates": { "type": "geo_point" } } } } }, "another_field": { "type": "string" }, "a_geoshape": { "type": "geo_shape" }, "a_geopoint": { "properties": { "type": { "type": "string" }, "coordinates": { "type": "geo_point" } } }, "another_geopoint": { "type": "geo_point" } }, "_meta": { "geomfields": { "superobject.another_geoshape2": "POINT" } } } }""", '{}') gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/non_geojson/my_mapping/&POSTFIELDS={ "superobject": { "another_geoshape3": { "type": "POINT", "coordinates": [ 3.0, 50.0 ] }, "subfield2": "foo" } }""", "{}") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/non_geojson/my_mapping/_count?pretty""", "{}") lyr.CreateFeature(f) ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", open_options=['FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=0']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['str_field'] != 'foo' or \ f['superobject.subfield'] != '5' or \ f['a_geopoint'].ExportToWkt() != 'POINT (2 49)' or \ f['a_geoshape'].ExportToWkt() != 'LINESTRING (2 49,3 50)' or \ f['superobject.another_geoshape'].ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", open_options=[ 'FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=0', 'FLATTEN_NESTED_ATTRIBUTES=FALSE']) lyr = ds.GetLayer(0) index = lyr.GetLayerDefn().GetFieldIndex('another_field') assert index < 0 f = lyr.GetNextFeature() if f['str_field'] != 'foo' or \ f['superobject'] != '{ "subfield": 5, "subobject": { "subfield": "foo", "another_subfield": 6 }, "another_geoshape": { "type": "point", "coordinates": [ 3, 50 ] }, "another_geoshape2": { "type": "point", "coordinates": [ 2, 50 ] } }' or \ f['a_geopoint'].ExportToWkt() != 'POINT (2 49)' or \ f['a_geoshape'].ExportToWkt() != 'LINESTRING (2 49,3 50)': f.DumpReadable() pytest.fail() ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch", gdal.OF_UPDATE, open_options=['JSON_FIELD=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['str_field'] != 'foo' or \ f['superobject.subfield'] != '5' or \ f['_json'].find('{') != 0 or \ f['a_geopoint'].ExportToWkt() != 'POINT (2 49)' or \ f['a_geoshape'].ExportToWkt() != 'LINESTRING (2 49,3 50)' or \ f['superobject.another_geoshape'].ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f['_id'] = 'my_id' f['_json'] = '{ "foo": "bar" }' gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/non_geojson/my_mapping/my_id&POSTFIELDS={ "foo": "bar" }""", "{}") ret = lyr.SetFeature(f) assert ret == 0 ############################################################################### # Test reading circle and envelope geometries def test_ogr_elasticsearch_6(): if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'non_standard_geometries\n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_standard_geometries/_mapping?pretty""", """ { "non_standard_geometries": { "mappings": { "my_mapping": { "properties": { "geometry": { "type": "geo_shape", } } } } } } """) ds = gdal.OpenEx("ES:/vsimem/fakeelasticsearch") lyr = ds.GetLayer(0) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/non_standard_geometries/my_mapping/_search?scroll=1m&size=100""", """{ "hits": { "hits":[ { "_source": { "geometry": { "type": "envelope", "coordinates": [[2,49],[3,50]] } } }, { "_source": { "geometry": { "type": "circle", "coordinates": [2,49], "radius": 100 } } }, { "_source": { "geometry": { "type": "circle", "coordinates": [2,49], "radius": "100m" } } }, { "_source": { "geometry": { "type": "circle", "coordinates": [2,49], "radius": "0.1km" } } }] } }""") f = lyr.GetNextFeature() if f['geometry'].ExportToWkt() != 'POLYGON ((2 49,3 49,3 50,2 50,2 49))': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() ref_txt = f['geometry'].ExportToWkt() if not ref_txt.startswith('POLYGON (('): f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['geometry'].ExportToWkt() != ref_txt: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['geometry'].ExportToWkt() != ref_txt: f.DumpReadable() pytest.fail() ############################################################################### # Test WRITE_MAPPING option def test_ogr_elasticsearch_7(): if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/test_write_mapping&CUSTOMREQUEST=PUT', '{}') lyr = ds.CreateLayer('test_write_mapping', srs=ogrtest.srs_wgs84, options=[ 'WRITE_MAPPING=/vsimem/map.txt', 'FID=']) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/map.txt', 'rb') assert f is not None data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/map.txt') assert data == '{ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } } } }' ############################################################################### # Test SRS support def test_ogr_elasticsearch_8(): if ogrtest.elasticsearch_drv is None: pytest.skip() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch/_stats", """{"_shards":{"total":0,"successful":0,"failed":0},"indices":{}}""") ds = ogrtest.elasticsearch_drv.CreateDataSource( "/vsimem/fakeelasticsearch") # No SRS gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/no_srs&CUSTOMREQUEST=PUT', '{}') # Will emit a warning gdal.ErrorReset() with gdaltest.error_handler(): lyr = ds.CreateLayer('no_srs') assert gdal.GetLastErrorType() == gdal.CE_Warning, 'warning expected' f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (-100 -200)')) gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/no_srs/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } }, "_meta": { "fid": "ogc_fid" } } }""", '{}') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"no_srs", "_type":"FeatureCollection"}} { "ogc_fid": 1, "geometry": { "type": "point", "coordinates": [ -100.0, -200.0 ] }, "type": "Feature", "properties": { } } """, "{}") # Will emit a warning gdal.ErrorReset() with gdaltest.error_handler(): ret = lyr.CreateFeature(f) assert gdal.GetLastErrorType() == gdal.CE_Warning, 'warning expected' assert ret == 0 # Non EPSG-4326 SRS other_srs = osr.SpatialReference() other_srs.ImportFromEPSG(32631) gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/other_srs&CUSTOMREQUEST=PUT', "{}") lyr = ds.CreateLayer('other_srs', srs=other_srs) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (500000 0)')) gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/other_srs/_mapping/FeatureCollection&POSTFIELDS={ "FeatureCollection": { "properties": { "type": { "type": "string" }, "properties": { "properties": { } }, "geometry": { "type": "geo_shape" } }, "_meta": { "fid": "ogc_fid" } } }""", '{}') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"other_srs", "_type":"FeatureCollection"}} { "ogc_fid": 1, "geometry": { "type": "point", "coordinates": [ 3.0, 0.0 ] }, "type": "Feature", "properties": { } } """, "{}") ret = lyr.CreateFeature(f) assert ret == 0 ############################################################################### # Test ElasticSearch 5.X def test_ogr_elasticsearch_9(): if ogrtest.elasticsearch_drv is None: pytest.skip() ogr_elasticsearch_delete_files() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{"number":"5.0.0"}}""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'a_layer \n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", """ { "a_layer": { "mappings": { "FeatureCollection": { "properties": { "type": { "type": "text" }, "a_geoshape": { "type": "geo_shape", }, "properties" : { "properties": { "str_field": { "type": "text"} } } } } } } } """) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "a_geoshape": { "type": "point", "coordinates": [2.5,49.5] }, "str_field": "foo" } } }] } }""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid""", """{}""") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') ds = ogr.Open('ES:/vsimem/fakeelasticsearch') lyr = ds.GetLayer(0) lyr.SetSpatialFilterRect(2, 49, 3, 50) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty&POSTFIELDS={ "query": { "constant_score" : { "filter": { "geo_shape": { "a_geoshape": { "shape": { "type": "envelope", "coordinates": [ [ 2.0, 50.0 ], [ 3.0, 49.0 ] ] } } } } } } }""", """{ "count" : 2 }""") count = lyr.GetFeatureCount() assert count == 2 gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "geo_shape": { "a_geoshape": { "shape": { "type": "envelope", "coordinates": [ [ 2.0, 50.0 ], [ 3.0, 49.0 ] ] } } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "a_geoshape": { "type": "point", "coordinates": [2.5,49.5] }, "properties": { "str_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None ############################################################################### # Test SQL def test_ogr_elasticsearch_10(): if ogrtest.elasticsearch_drv is None: pytest.skip() ogr_elasticsearch_delete_files() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{"number":"5.0.0"}}""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'a_layer \n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", """ { "a_layer": { "mappings": { "FeatureCollection": { "properties": { "type": { "type": "text" }, "a_geoshape": { "type": "geo_shape", }, "properties" : { "properties": { "text_field": { "type": "text"}, "text_field_with_raw": { "type": "text", "fields" : { "raw" : { "type": "keyword" } } }, "keyword_field": { "type": "keyword"}, "int_field": { "type": "integer"}, "long_field": { "type": "long"}, "double_field": { "type": "double"}, "dt_field": { "type": "date"}, "date_field": { "type": "date", "format": "yyyy\/MM\/dd"}, "time_field": { "type": "date", "format": "HH:mm:ss.SSS"}, } } } } } } } """) gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{}""") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') ds = ogr.Open('ES:/vsimem/fakeelasticsearch') lyr = ds.GetLayer(0) lyr.SetAttributeFilter( "keyword_field = 'foo' AND keyword_field IS NOT NULL") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "must": [ { "term": { "properties.keyword_field": "foo" } }, { "exists": { "field": "properties.keyword_field" } } ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("text_field = 'foo'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "match": { "properties.text_field": "foo" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("CAST(text_field AS CHARACTER) = 'foo_cast'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "match": { "properties.text_field": "foo_cast" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "foo_cast" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("text_field_with_raw = 'foo'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "term": { "properties.text_field_with_raw.raw": "foo" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field_with_raw": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("\"_id\" = 'my_id2'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "ids": { "values": [ "my_id2" ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id2", "_source": { "type": "Feature", "properties": { } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field != 'foo'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "must_not": { "term": { "properties.keyword_field": "foo" } } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "bar" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field IS NULL") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "must_not": { "exists": { "field": "properties.keyword_field" } } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field BETWEEN 'bar' AND 'foo'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "range": { "properties.keyword_field": { "gte": "bar", "lte": "foo" } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "baz" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field IN ('foo', 'bar')") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "terms": { "properties.keyword_field": [ "foo", "bar" ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("text_field IN ('foo', 'bar')") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "should": [ { "match": { "properties.text_field": "foo" } }, { "match": { "properties.text_field": "bar" } } ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("text_field_with_raw IN ('foo', 'bar')") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "terms": { "properties.text_field_with_raw.raw": [ "foo", "bar" ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field_with_raw": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("\"_id\" IN ('my_id', 'bar')") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "ids": { "values": [ "my_id", "bar" ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter( "int_field >= 2 OR long_field >= 9876543210 OR double_field <= 3.123456") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "should": [ { "bool": { "should": [ { "range": { "properties.int_field": { "gte": 2 } } }, { "range": { "properties.long_field": { "gte": 9876543210 } } } ] } }, { "range": { "properties.double_field": { "lte": 3.123456 } } } ] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "double_field": 3, "int_field": 2, "long_field": 9876543210 } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("dt_field > '2016/01/01 12:34:56.123'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "range": { "properties.dt_field": { "gt": "2016\/01\/01 12:34:56.123" } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "dt_field": '2016/01/01 12:34:56.124' } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("NOT dt_field < '2016/01/01 12:34:56.123'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool": { "must_not": { "range": { "properties.dt_field": { "lt": "2016\/01\/01 12:34:56.123" } } } } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "dt_field": '2016/01/01 12:34:56.123' } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field LIKE '_o%'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "wildcard": { "properties.keyword_field": "?o*" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None # Evaluated client-side since the pattern uses ? or * lyr.SetAttributeFilter("text_field LIKE '?*'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "?*" } } }] } }""") f = lyr.GetNextFeature() assert f is not None # Evaluated client-side since the field is analyzed lyr.SetAttributeFilter("text_field LIKE '_Z%'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field": "fZo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("text_field_with_raw LIKE '_xo%' ESCAPE 'x'") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "wildcard": { "properties.text_field_with_raw.raw": "?o*" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "text_field_with_raw": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field = 'foo' AND 1 = 1") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "term": { "properties.keyword_field": "foo" } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("1 = 1 AND keyword_field = 'foo'") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field = 'bar' OR 1 = 0") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "bar" } } }] } }""") f = lyr.GetNextFeature() assert f is not None lyr.SetAttributeFilter("keyword_field = 'foo2'") lyr.SetSpatialFilterRect(2, 49, 2, 49) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "bool" : { "must" : [{ "geo_shape": { "a_geoshape": { "shape": { "type": "envelope", "coordinates": [ [ 2.0, 49.0 ], [ 2.0, 49.0 ] ] } } } }, { "term": { "properties.keyword_field": "foo2" } }] } } } } }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "a_geoshape": { "type": "point", "coordinates": [2.0,49.0] }, "properties": { "keyword_field": "foo2" } } }] } }""") f = lyr.GetNextFeature() assert f is not None # SQL with WHERE sql_lyr = ds.ExecuteSQL( "SELECT * FROM a_layer WHERE keyword_field = 'foo'") f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) # SQL with WHERE and ORDER BY sql_lyr = ds.ExecuteSQL( "SELECT * FROM a_layer WHERE keyword_field = 'foo' ORDER BY keyword_field, int_field DESC, \"_id\"") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "query": { "constant_score" : { "filter": { "term": { "properties.keyword_field": "foo" } } } }, "sort" : [ { "properties.keyword_field": { "order": "asc" } }, { "properties.int_field": { "order": "desc" } }, { "_uid": { "order": "asc" } } ] }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) # SQL with ORDER BY only sql_lyr = ds.ExecuteSQL("SELECT * FROM a_layer ORDER BY keyword_field") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "sort": [ { "properties.keyword_field": { "order": "asc" } } ] }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "keyword_field": "foo" } } }] } }""") f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) # SQL with ORDER BY on a text field with a raw sub-field sql_lyr = ds.ExecuteSQL( "SELECT * FROM a_layer ORDER BY text_field_with_raw") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100&POSTFIELDS={ "sort": [ { "properties.text_field_with_raw.raw": { "order": "asc" } } ] }""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { } } }] } }""") f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test isnull and unset def test_ogr_elasticsearch_11(): if ogrtest.elasticsearch_drv is None: pytest.skip() ogr_elasticsearch_delete_files() gdal.FileFromMemBuffer("/vsimem/fakeelasticsearch", """{"version":{"number":"5.0.0"}}""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i""", 'a_layer \n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/_mapping?pretty""", """ { "a_layer": { "mappings": { "FeatureCollection": { "properties": { "type": { "type": "text" }, "properties" : { "properties": { "str_field": { "type": "text"} } } } } } } } """) gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{}""") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/_search/scroll?scroll_id=my_scrollid&CUSTOMREQUEST=DELETE', '{}') ds = ogr.Open('ES:/vsimem/fakeelasticsearch', update=1) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_search?scroll=1m&size=100""", """{ "_scroll_id": "my_scrollid", "hits": { "hits":[ { "_id": "my_id", "_source": { "type": "Feature", "properties": { "str_field": "foo" } } }, { "_id": "my_id", "_source": { "type": "Feature", "properties": { "str_field": null } } }, { "_id": "my_id", "_source": { "type": "Feature", "properties": { } } } ] } }""") gdal.FileFromMemBuffer( '/vsimem/fakeelasticsearch/_search/scroll?scroll=1m&scroll_id=my_scrollid', '{}') f = lyr.GetNextFeature() if f['str_field'] != 'foo': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['str_field'] is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('str_field'): f.DumpReadable() pytest.fail() gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/FeatureCollection/_count?pretty""", """{ "hits": { "count": 0 } }""") gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/_bulk&POSTFIELDS={"index" :{"_index":"a_layer", "_type":"FeatureCollection"}} { "properties": { "str_field": null } } {"index" :{"_index":"a_layer", "_type":"FeatureCollection"}} { "properties": { } } """, '{}') f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('str_field') ret = lyr.CreateFeature(f) assert ret == 0 f = None f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 f = None assert lyr.SyncToDisk() == 0 ############################################################################### # Test authentication def test_ogr_elasticsearch_authentication(): if ogrtest.elasticsearch_drv is None: pytest.skip() ogr_elasticsearch_delete_files() gdal.FileFromMemBuffer( "/vsimem/fakeelasticsearch&USERPWD=user:pwd", """{"version":{"number":"5.0.0"}}""") gdal.FileFromMemBuffer( """/vsimem/fakeelasticsearch/_cat/indices?h=i&USERPWD=user:pwd""", 'a_layer \n') gdal.FileFromMemBuffer("""/vsimem/fakeelasticsearch/a_layer/_mapping?pretty&USERPWD=user:pwd""", """ { "a_layer": { "mappings": { "FeatureCollection": { "properties": { "type": { "type": "text" }, "properties" : { "properties": { "str_field": { "type": "text"} } } } } } } } """) ds = gdal.OpenEx('ES:/vsimem/fakeelasticsearch', open_options=['USERPWD=user:pwd']) assert ds is not None ############################################################################### # Cleanup def ogr_elasticsearch_delete_files(): for subdir in ['_search', '_cat', 'no_srs', 'non_standard_geometries', 'other_srs', 'a_layer']: lst = gdal.ReadDir('/vsimem/fakeelasticsearch/' + subdir) if lst: for f in lst: gdal.Unlink('/vsimem/fakeelasticsearch/' + subdir + '/' + f) lst = gdal.ReadDir('/vsimem/fakeelasticsearch/' + subdir + '/FeatureCollection') if lst: for f in lst: gdal.Unlink('/vsimem/fakeelasticsearch/' + subdir + '/FeatureCollection/' + f) lst = gdal.ReadDir('/vsimem/fakeelasticsearch') if lst: for f in lst: gdal.Unlink('/vsimem/fakeelasticsearch/' + f) gdal.Unlink('/vsimem/fakeelasticsearch') gdal.Unlink('/vsimem/fakeelasticsearch&USERPWD=user:pwd') def test_ogr_elasticsearch_cleanup(): if ogrtest.elasticsearch_drv is None: pytest.skip() ogr_elasticsearch_delete_files() gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) gdalautotest-3.0.4/ogr/ogr_geom.py0000755003401500001440000041720713614005325016604 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_geom.py e2d634382dd6d3df536ae9d3b1a8dca39ea6b8b0 2019-12-18 13:19:04 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test Misc. OGRGeometry operations. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2014, Even Rouault # # 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. ############################################################################### import math import pickle import random import sys import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Test Area calculation for a MultiPolygon (which exercises lower level # get_Area() methods as well). def test_ogr_geom_area(): geom_wkt = 'MULTIPOLYGON( ((0 0,1 1,1 0,0 0)),((0 0,10 0, 10 10, 0 10),(1 1,1 2,2 2,2 1)) )' geom = ogr.CreateGeometryFromWkt(geom_wkt) area = geom.GetArea() assert abs(area - 99.5) <= 0.00000000001, ('GetArea() result wrong, got %g.' % area) # OGR >= 1.8.0 area = geom.Area() assert abs(area - 99.5) <= 0.00000000001, ('Area() result wrong, got %g.' % area) ############################################################################### # Test Area calculation for a LinearRing (which exercises special case of # getGeometryType value). def test_ogr_geom_area_linearring(): geom = ogr.Geometry(type=ogr.wkbLinearRing) geom.AddPoint_2D(0, 0) geom.AddPoint_2D(10, 0) geom.AddPoint_2D(10, 10) geom.AddPoint_2D(0, 10) geom.AddPoint_2D(0, 0) area = geom.GetArea() assert abs(area - 100.0) <= 0.00000000001, ('Area result wrong, got %g.' % area) ############################################################################### # Test Area calculation for a GeometryCollection def test_ogr_geom_area_geometrycollection(): # OGR >= 1.8.0 geom_wkt = 'GEOMETRYCOLLECTION( POLYGON((0 0,1 1,1 0,0 0)), MULTIPOLYGON(((0 0,1 1,1 0,0 0))), LINESTRING(0 0,1 1), POINT(0 0), GEOMETRYCOLLECTION EMPTY )' geom = ogr.CreateGeometryFromWkt(geom_wkt) area = geom.Area() assert abs(area - 1) <= 0.00000000001, ('Area() result wrong, got %g.' % area) ############################################################################### # Test Area calculation for a LinearRing whose coordinates are shifted by a # huge value With algorithm prior to #3556, this would return 0. def test_ogr_geom_area_linearring_big_offset(): geom = ogr.Geometry(type=ogr.wkbLinearRing) BIGOFFSET = 1.0e11 geom.AddPoint_2D(BIGOFFSET + 0, BIGOFFSET + 0) geom.AddPoint_2D(BIGOFFSET + 10, BIGOFFSET + 0) geom.AddPoint_2D(BIGOFFSET + 10, BIGOFFSET + 10) geom.AddPoint_2D(BIGOFFSET + 0, BIGOFFSET + 10) geom.AddPoint_2D(BIGOFFSET + 0, BIGOFFSET + 0) area = geom.GetArea() assert abs(area - 100.0) <= 0.00000000001, ('Area result wrong, got %g.' % area) ############################################################################### # Test Area calculation for a Triangle def test_ogr_geom_area_triangle(): geom_wkt = 'TRIANGLE((0 0,100 0,0 100,0 0))' geom = ogr.CreateGeometryFromWkt(geom_wkt) area = geom.GetArea() assert abs(area - 4999.5) >= 0.00000000001, \ ('GetArea() result wrong, got %g.' % area) # OGR >= 1.8.0 area = geom.Area() assert abs(area - 4999.5) >= 0.00000000001, ('Area() result wrong, got %g.' % area) def test_ogr_geom_is_empty(): geom_wkt = 'LINESTRING EMPTY' geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" geom_wkt = 'POINT( 1 2 )' geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom, ("A geometry could not be created from wkt: %s" % geom_wkt) assert not geom.IsEmpty(), "IsEmpty returning true for a non-empty geometry" ############################################################################### # Test if a Triangle is Empty def test_ogr_geom_is_empty_triangle(): geom_wkt = 'TRIANGLE EMPTY' geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" geom = ogr.CreateGeometryFromWkb(geom.ExportToWkb()) assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" geom_wkt = 'TRIANGLE((0 0,100 0,0 100,0 0))' geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom, ("A geometry could not be created from wkt: %s" % geom_wkt) assert not geom.IsEmpty(), "IsEmpty returning true for a non-empty geometry" def test_ogr_geom_pickle(): geom_wkt = 'MULTIPOLYGON( ((0 0,1 1,1 0,0 0)),((0 0,10 0, 10 10, 0 10),(1 1,1 2,2 2,2 1)) )' geom = ogr.CreateGeometryFromWkt(geom_wkt) p = pickle.dumps(geom) with gdaltest.error_handler(): g = pickle.loads(p) assert geom.Equal(g), "pickled geometries were not equal" ############################################################################### # Test suite for PolyhedralSurface def test_ogr_geom_polyhedral_surface(): wkt_original = 'POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),\ ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),\ ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),\ ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),\ ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),\ ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))' ps = ogr.CreateGeometryFromWkt(wkt_original) wkb_string = ps.ExportToWkb(ogr.wkbXDR) geom = ogr.CreateGeometryFromWkb(wkb_string) wkt_string = geom.ExportToWkt() assert wkt_string == wkt_original, "Failure in Wkb methods of PolyhedralSurface" wkt_string = geom.Clone().ExportToWkt() assert wkt_string == wkt_original, "Failure in Clone()" polygon_wkt = ogr.ForceTo(geom.Clone(), ogr.wkbPolygon).ExportToWkt() assert polygon_wkt == wkt_original polygon_wkt = ogr.ForceTo(geom.Clone(), ogr.wkbMultiPolygon).ExportToWkt() assert polygon_wkt == 'MULTIPOLYGON (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))' if ogrtest.have_sfcgal(): area = ps.Area() assert area == 6.0, "Wrong area of PolyhedralSurface" size = ps.WkbSize() assert size == 807, "Wrong WkbSize() of PolyhedralSurface" # if ogrtest.have_sfcgal(): # geom = ps.DelaunayTriangulation(0.0,True) # wkt_geom_dt = 'MULTILINESTRING ((0 1 0,1 1 0),(0 0 0,0 1 0),(0 0 0,1 0 0),(1 0 0,1 1 0),(0 1 0,1 0 0))' # wkt_geom = geom.ExportToWkt() # if wkt_geom != wkt_geom_dt: # gdaltest.post_reason ("Failure in DelaunayTriangulation() of PolyhedralSurface") # print(wkt_geom) # return 'fail' if ogrtest.have_geos() or ogrtest.have_sfcgal(): geom = ogr.CreateGeometryFromWkb(wkb_string) assert ps.Contains(geom), "Failure in Contains() of PolyhedralSurface" assert not ps.IsEmpty(), "Failure in IsEmpty() of PolyhedralSurface" ps.Empty() wkt_string = ps.ExportToWkt() assert wkt_string == 'POLYHEDRALSURFACE Z EMPTY', \ "Failure in Empty() of PolyhedralSurface" g = ogr.CreateGeometryFromWkt('POLYHEDRALSURFACE (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)))') assert g.Equals(g) != 0 for wkt in ['MULTIPOLYGON (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)))', 'POLYHEDRALSURFACE (((0 0 0,0 0 1,0 1 1,0 0 0)))', 'POLYHEDRALSURFACE (((0 0 0,0 0 1,0 1 1,0 0 0)),((0 0 0,0 0 1,0 1 1,0 0 0)))', 'POLYHEDRALSURFACE EMPTY']: g2 = ogr.CreateGeometryFromWkt(wkt) if g.Equals(g2): print(wkt) pytest.fail("Unexpected true Equals() return") # Error assert g.AddGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) != 0 # Error assert g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 0)')) != 0 # Test dimension promotion g = ogr.CreateGeometryFromWkt('POLYHEDRALSURFACE EMPTY') g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ZM ((0 0 1 2,0 1 1 2,1 1 1 2,0 0 1 2))')) g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ((10 10,10 11,11 11,10 10))')) wkt = g.ExportToIsoWkt() assert wkt == 'POLYHEDRALSURFACE ZM (((0 0 1 2,0 1 1 2,1 1 1 2,0 0 1 2)),((10 10 0 0,10 11 0 0,11 11 0 0,10 10 0 0)))' ############################################################################### # Test suite for TIN def test_ogr_geom_tin(): poly1 = ogr.CreateGeometryFromWkt("TRIANGLE ((0 0 0,0 0 1,0 1 0,0 0 0))") poly2 = ogr.CreateGeometryFromWkt("TRIANGLE ((0 0 0,0 1 0,1 1 0,0 0 0))") tin = ogr.Geometry(ogr.wkbTIN) tin.AddGeometry(poly1) tin.AddGeometry(poly2) polygon_wkt = [poly1.ExportToWkt(), poly2.ExportToWkt()] for i in range(0, tin.GetGeometryCount()): geom = tin.GetGeometryRef(i) wkt_geom = geom.ExportToWkt() assert polygon_wkt[i] == wkt_geom, "Failure in getting geometries of TIN" wkt_original = 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))' tin = ogr.CreateGeometryFromWkt(wkt_original) wkb_string = tin.ExportToWkb(ogr.wkbXDR) geom = ogr.CreateGeometryFromWkb(wkb_string) wkt_string = geom.ExportToWkt() assert wkt_string == wkt_original, "Failure in Wkb methods of TIN" wkt_string = geom.Clone().ExportToWkt() assert wkt_string == wkt_original, "Failure in Clone()" if ogrtest.have_sfcgal(): area = 12.3 * tin.Area() assert area == 12.3, "Wrong area of TIN" size = tin.WkbSize() assert size == 227, "Wrong WkbSize() of TIN" # geom = tin.DelaunayTriangulation(0.0,True) # wkt_geom_dt = 'MULTILINESTRING ((0 1 0,1 1 0),(0 0 0,0 1 0),(0 0 0,1 1 0))' # wkt_geom = geom.ExportToWkt() # if wkt_geom != wkt_geom_dt: # gdaltest.post_reason ("Failure in DelaunayTriangulation() of TIN") # print(wkt_geom) # return 'fail' # geom = ogr.CreateGeometryFromWkb(wkb_string) # if tin.Contains(geom) != True: # gdaltest.post_reason ("Failure in Contains() of TIN") # return 'fail' assert not tin.IsEmpty(), "Failure in IsEmpty() of TIN" tin.Empty() wkt_string = tin.ExportToWkt() assert wkt_string == 'TIN Z EMPTY', "Failure in Empty() of TIN" wrong_polygon = ogr.CreateGeometryFromWkt('POLYGON ((0 0 0,0 1 0,1 1 0,0 0 1))') geom_count = tin.GetGeometryCount() gdal.PushErrorHandler('CPLQuietErrorHandler') x = tin.AddGeometry(wrong_polygon) gdal.PopErrorHandler() assert tin.GetGeometryCount() == geom_count, \ ("Added wrong geometry in TIN, error has code " + str(x)) if ogrtest.have_geos() or ogrtest.have_sfcgal(): point = tin.PointOnSurface() point_wkt = point.ExportToWkt() point_correct_wkt = 'POINT EMPTY' assert point_wkt == point_correct_wkt, \ "Wrong Point Obtained for PointOnSurface() in TIN" tin = ogr.CreateGeometryFromWkt(wkt_original) # point = tin.PointOnSurface() # point_wkt = point.ExportToWkt() # point_correct_wkt = 'POINT (0.25 0.5)' # if point_wkt != point_correct_wkt: # gdaltest.post_reason ("Wrong Point Obtained for PointOnSurface() in TIN") # print(point_wkt) # return 'fail' tin.FlattenTo2D() assert not tin.IsValid(), "Problem with IsValid() in TIN" # 4 points invalid_wkt = 'TIN (((0 0,0 1,1 1,1 0,0 0)))' with gdaltest.error_handler(): g = ogr.CreateGeometryFromWkt(invalid_wkt) assert g is None # hole invalid_wkt = 'TIN(((0 0,0 1,1 1,0 0),(0.1 0.1,0.1 0.2,0.2 0.2,0.1 0.1)))' with gdaltest.error_handler(): g = ogr.CreateGeometryFromWkt(invalid_wkt) assert g is None invalid_wkt = 'TIN (POLYGON((0 0,0 1,1 1,0 0)))' with gdaltest.error_handler(): g = ogr.CreateGeometryFromWkt(invalid_wkt) assert g is None # Add a POLYGON that can be cast as a TRIANGLE g = ogr.Geometry(ogr.wkbTIN) assert g.AddGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) == 0 assert g.ExportToIsoWkt() == 'TIN (((0 0,0 1,1 1,0 0)))' ############################################################################### # Test OGRGeometry::getBoundary() result for point. def test_ogr_geom_boundary_point(): if not ogrtest.have_geos(): pytest.skip() geom_wkt = 'POINT(1 1)' geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() assert bnd.GetGeometryType() == ogr.wkbGeometryCollection, \ 'GetBoundary not reported as GEOMETRYCOLLECTION EMPTY' bnd = geom.Boundary() assert bnd.GetGeometryType() == ogr.wkbGeometryCollection, \ 'Boundary not reported as GEOMETRYCOLLECTION EMPTY' ############################################################################### # Test OGRGeometry::getBoundary() result for multipoint. def test_ogr_geom_boundary_multipoint(): if not ogrtest.have_geos(): pytest.skip() geom_wkt = 'MULTIPOINT((0 0),(1 1))' geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() assert bnd.GetGeometryType() == ogr.wkbGeometryCollection, \ 'Boundary not reported as GEOMETRYCOLLECTION EMPTY' ############################################################################### # Test OGRGeometry::getBoundary() result for linestring. def test_ogr_geom_boundary_linestring(): if not ogrtest.have_geos(): pytest.skip() geom_wkt = 'LINESTRING(0 0, 1 1, 2 2, 3 2, 4 2)' geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() assert bnd.GetGeometryType() == ogr.wkbMultiPoint, \ 'Boundary not reported as MULTIPOINT' assert bnd.GetGeometryCount() == 2, \ 'Boundary not reported as MULTIPOINT consisting of 2 points' geom_wkt = 'LINESTRING(0 0, 1 0, 1 1, 0 1, 0 0)' geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() assert bnd.GetGeometryType() == ogr.wkbMultiPoint, \ 'Boundary not reported as MULTIPOINT' assert bnd.GetGeometryCount() == 0, 'Boundary not reported as MULTIPOINT EMPTY' ############################################################################### # Test OGRGeometry::getBoundary() result for polygon. def test_ogr_geom_boundary_polygon(): if not ogrtest.have_geos(): pytest.skip() geom_wkt = 'POLYGON((0 0,1 1,1 0,0 0))' geom = ogr.CreateGeometryFromWkt(geom_wkt) bnd = geom.GetBoundary() assert bnd.GetGeometryType() == ogr.wkbLineString, \ 'Boundary not reported as non-empty LINESTRING' ############################################################################### # Test OGRBuildPolygonFromEdges() on a geometry collection of line strings def test_ogr_geom_build_from_edges_1(): if not ogrtest.have_geos(): pytest.skip() link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection) wkt_array = [ 'LINESTRING (-87.601595 30.999522,-87.599623 31.000059,-87.599219 31.00017)', 'LINESTRING (-87.601595 30.999522,-87.604349 30.999493,-87.606935 30.99952)', 'LINESTRING (-87.59966 31.000756,-87.599851 31.000805,-87.599992 31.000805,-87.600215 31.000761,-87.600279 31.000723,-87.600586 31.000624,-87.601256 31.000508,-87.602501 31.000447,-87.602801 31.000469,-87.603108 31.000579,-87.603331 31.000716,-87.603523 31.000909,-87.603766 31.001233,-87.603913 31.00136)', 'LINESTRING (-87.606134 31.000182,-87.605885 31.000325,-87.605343 31.000716,-87.60466 31.001117,-87.604468 31.0012,-87.603913 31.00136)', 'LINESTRING (-87.599219 31.00017,-87.599289 31.0003,-87.599398 31.000426,-87.599564 31.000547,-87.599609 31.000701,-87.59966 31.000756)', 'LINESTRING (-87.606935 30.99952,-87.606713 30.999799,-87.6064 30.999981,-87.606134 31.000182)'] for wkt in wkt_array: geom = ogr.CreateGeometryFromWkt(wkt) # print "geom is",geom link_coll.AddGeometry(geom) try: poly = ogr.BuildPolygonFromEdges(link_coll) assert poly is not None except: pytest.fail() ############################################################################### # Test OGRBuildPolygonFromEdges() on a multilinestring def test_ogr_geom_build_from_edges_2(): if not ogrtest.have_geos(): pytest.skip() link_coll = ogr.Geometry(type=ogr.wkbMultiLineString) wkt_array = [ 'LINESTRING (-87.601595 30.999522,-87.599623 31.000059,-87.599219 31.00017)', 'LINESTRING (-87.601595 30.999522,-87.604349 30.999493,-87.606935 30.99952)', 'LINESTRING (-87.59966 31.000756,-87.599851 31.000805,-87.599992 31.000805,-87.600215 31.000761,-87.600279 31.000723,-87.600586 31.000624,-87.601256 31.000508,-87.602501 31.000447,-87.602801 31.000469,-87.603108 31.000579,-87.603331 31.000716,-87.603523 31.000909,-87.603766 31.001233,-87.603913 31.00136)', 'LINESTRING (-87.606134 31.000182,-87.605885 31.000325,-87.605343 31.000716,-87.60466 31.001117,-87.604468 31.0012,-87.603913 31.00136)', 'LINESTRING (-87.599219 31.00017,-87.599289 31.0003,-87.599398 31.000426,-87.599564 31.000547,-87.599609 31.000701,-87.59966 31.000756)', 'LINESTRING (-87.606935 30.99952,-87.606713 30.999799,-87.6064 30.999981,-87.606134 31.000182)'] for wkt in wkt_array: geom = ogr.CreateGeometryFromWkt(wkt) link_coll.AddGeometry(geom) try: poly = ogr.BuildPolygonFromEdges(link_coll) assert poly is not None except: pytest.fail() ############################################################################### # Test OGRBuildPolygonFromEdges() on invalid geometries def test_ogr_geom_build_from_edges_3(): if not ogrtest.have_geos(): pytest.skip() src_geom = ogr.CreateGeometryFromWkt('POINT (0 1)') try: gdal.PushErrorHandler('CPLQuietErrorHandler') poly = ogr.BuildPolygonFromEdges(src_geom) gdal.PopErrorHandler() assert poly is None except: pass src_geom = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (LINESTRING(0 1,2 3),POINT(0 1),LINESTRING(0 1,-2 3),LINESTRING(-2 3,2 3))') try: gdal.PushErrorHandler('CPLQuietErrorHandler') poly = ogr.BuildPolygonFromEdges(src_geom) gdal.PopErrorHandler() assert poly is None except: pass ############################################################################### # Test OGRBuildPolygonFromEdges() and identify exterior ring (#3610) def test_ogr_geom_build_from_edges_4(): if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') if not ogrtest.have_geos(): pytest.skip() link_coll = ogr.Geometry(type=ogr.wkbGeometryCollection) wkt_array = [ 'LINESTRING EMPTY', 'LINESTRING (1 1,1 2)', 'LINESTRING EMPTY', 'LINESTRING (1 2,2 2)', 'LINESTRING (2 2,2 1)', 'LINESTRING (2 1,1 1)', 'LINESTRING (0 0,0 10)', 'LINESTRING (0 10,10 10)', 'LINESTRING (10 10,10 0)', 'LINESTRING (10 0,0 0)' ] for wkt in wkt_array: geom = ogr.CreateGeometryFromWkt(wkt) # print "geom is",geom link_coll.AddGeometry(geom) try: poly = ogr.BuildPolygonFromEdges(link_coll) assert poly is not None wkt = poly.ExportToWkt() assert wkt == 'POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1))' except: pytest.fail() ############################################################################### # Test GetArea() on empty linear ring (#2792) def test_ogr_geom_area_empty_linearring(): geom = ogr.Geometry(type=ogr.wkbLinearRing) area = geom.GetArea() assert area == 0 ############################################################################### # Test TransformTo() def test_ogr_geom_transform_to(): # Somewhere in Paris suburbs... geom = ogr.CreateGeometryFromWkt('POINT(2 49)') # Input SRS is EPSG:4326 sr = osr.SpatialReference() sr.ImportFromEPSG(4326) sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) geom.AssignSpatialReference(sr) # Output SRS is EPSG:32631 sr2 = osr.SpatialReference() sr2.ImportFromEPSG(32631) ret = geom.TransformTo(sr2) assert ret == 0 and abs(geom.GetX() - 426857) <= 1 and abs(geom.GetY() - 5427937) <= 1, \ geom.ExportToWkt() # Geometry without SRS geom = ogr.CreateGeometryFromWkt('POINT(2 49)') gdal.ErrorReset() with gdaltest.error_handler(): ret = geom.TransformTo(sr2) assert not (ret == 0 or gdal.GetLastErrorMsg() == '') ############################################################################### # Test Transform() def test_ogr_geom_transform(): # Somewhere in Paris suburbs... geom = ogr.CreateGeometryFromWkt('POINT(2 49)') # Input SRS is EPSG:4326 sr = osr.SpatialReference() sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) sr.ImportFromEPSG(4326) # Output SRS is EPSG:32631 sr2 = osr.SpatialReference() sr2.ImportFromEPSG(32631) ct = osr.CoordinateTransformation(sr, sr2) geom.Transform(ct) assert abs(geom.GetX() - 426857) <= 1 and abs(geom.GetY() - 5427937) <= 1, \ geom.ExportToWkt() ############################################################################### # Test CloseRings() def test_ogr_geom_closerings(): geom = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0))') geom.CloseRings() assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' geom.CloseRings() assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' ############################################################################### # Test Segmentize() def test_ogr_geom_segmentize(): # 2D geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 10)') geom.Segmentize(1.00001) assert geom.ExportToWkt() == 'LINESTRING (0 0,0 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,0 10)' # 2D + Z geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0 1,0 10 1)') geom.Segmentize(1.00001) assert geom.ExportToWkt() == 'LINESTRING (0 0 1,0 1 1,0 2 1,0 3 1,0 4 1,0 5 1,0 6 1,0 7 1,0 8 1,0 9 1,0 10 1)' # 2D + M geom = ogr.CreateGeometryFromWkt('LINESTRING M(0 0 1,0 10 2)') geom.Segmentize(5) assert geom.ExportToIsoWkt() == 'LINESTRING M (0 0 1,0 5 2,0 10 2)' # 2D + ZM geom = ogr.CreateGeometryFromWkt('LINESTRING ZM(0 0 1 2,0 10 1 2)') geom.Segmentize(5) assert geom.ExportToIsoWkt() == 'LINESTRING ZM (0 0 1 2,0 5 1 2,0 10 1 2)' # Test distance between points <<<< segmentization threshold # https://github.com/OSGeo/gdal/issues/1414 geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1)') geom.Segmentize(10000) assert geom.ExportToWkt() == 'LINESTRING (0 0,0 1)' # Check segmentize symmetry : do exact binary comparison. in_wkt = 'LINESTRING (0 0,1.2 1,2 0)' g1 = ogr.CreateGeometryFromWkt(in_wkt) g1.Segmentize(0.25) in_wkt = 'LINESTRING (2 0,1.2 1,0 0)' g2 = ogr.CreateGeometryFromWkt(in_wkt) g2.Segmentize(0.25) for i in range(g1.GetPointCount()): if g1.GetPoint(i) != g2.GetPoint(g1.GetPointCount() - 1 - i): print('%.18g' % (g1.GetPoint(i)[0] - g2.GetPoint(g1.GetPointCount() - 1 - i)[0])) pytest.fail('%.18g' % (g1.GetPoint(i)[1] - g2.GetPoint(g1.GetPointCount() - 1 - i)[1])) def test_ogr_geom_segmentize_issue_1341(): expected_geom = 'LINESTRING (0 0,0.4 0.0,0.8 0.0,1.2 0.0,1.6 0.0,2 0,2.4 0.0,2.8 0.0,3.2 0.0,3.6 0.0,4 0,4.4 0.0,4.8 0.0,5.2 0.0,5.6 0.0,6 0,6.4 0.0,6.8 0.0,7.2 0.0,7.6 0.0,8 0,8.4 0.0,8.8 0.0,9.2 0.0,9.6 0.0,10 0)' geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,10 0)') geom.Segmentize(0.399999999999) assert geom.ExportToWkt() == expected_geom geom.Segmentize(0.399999999999) assert geom.ExportToWkt() == expected_geom geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,10 0)') geom.Segmentize(0.4) assert geom.ExportToWkt() == expected_geom geom.Segmentize(0.4) assert geom.ExportToWkt() == expected_geom geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0,10 0)') geom.Segmentize(0.400000000001) assert geom.ExportToWkt() == expected_geom geom.Segmentize(0.400000000001) assert geom.ExportToWkt() == expected_geom ############################################################################### # Test Value() def test_ogr_geom_value(): geom = ogr.CreateGeometryFromWkt('LINESTRING(2 3,5 3,5 0)') p = geom.Value(-1e-3) expected_p = ogr.CreateGeometryFromWkt('POINT (2 3)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = geom.Value(geom.Length() / 4) expected_p = ogr.CreateGeometryFromWkt('POINT (3.5 3)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = geom.Value(geom.Length() / 2) expected_p = ogr.CreateGeometryFromWkt('POINT (5 3)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = geom.Value(3 * geom.Length() / 4) expected_p = ogr.CreateGeometryFromWkt('POINT (5 1.5)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = geom.Value(geom.Length() + 1e-3) expected_p = ogr.CreateGeometryFromWkt('POINT (5 0)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 ############################################################################### # Test FlattenTo2D(), GetDimension() and GetCoordinateDimension() def test_ogr_geom_flattenTo2D(): geom = ogr.CreateGeometryFromWkt('POINT (1 2 3)') # Point is 0 dimension, LineString 1, ... assert geom.GetDimension() == 0 assert geom.GetCoordinateDimension() == 3 geom.FlattenTo2D() assert geom.GetCoordinateDimension() == 2 assert geom.ExportToWkt() == 'POINT (1 2)' ############################################################################### # Test FlattenTo2D(), GetDimension() and GetCoordinateDimension() for Triangle def test_ogr_geom_flattenTo2D_triangle(): geom = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0 0,100 0 100,0 100 100,0 0 0))') # Point is 0 dimension, LineString 1, ... assert geom.GetDimension() == 2 assert geom.GetCoordinateDimension() == 3 geom.FlattenTo2D() assert geom.GetCoordinateDimension() == 2 assert geom.ExportToWkt() == 'TRIANGLE ((0 0,100 0,0 100,0 0))' ############################################################################### def test_ogr_geom_linestring_limits(): geom = ogr.CreateGeometryFromWkt('LINESTRING EMPTY') assert geom.Length() == 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.GetPoint(-1) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.GetPoint(0) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.GetPoint_2D(-1) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.GetPoint_2D(0) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.SetPoint(-1, 5, 6, 7) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') geom.SetPoint_2D(-1, 5, 6) gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() with gdaltest.error_handler(): geom.SetPoint(2147000000, 5, 6, 7) assert gdal.GetLastErrorType() != 0 gdal.ErrorReset() with gdaltest.error_handler(): geom.SetPoint_2D(2147000000, 5, 6) assert gdal.GetLastErrorType() != 0 geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0)') assert geom.Length() == 0 geom = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 1 0)') assert geom.Length() == 1 ############################################################################### def test_ogr_geom_coord_round(): geom = ogr.CreateGeometryFromWkt('POINT(370441.860 5591000.590)') wkt = geom.ExportToWkt() assert wkt == 'POINT (370441.86 5591000.59)', 'did not get expected WKT' ############################################################################### def test_ogr_geom_coord_round_2(): geom = ogr.CreateGeometryFromWkt('POINT(1.0 169.600374)') wkt = geom.ExportToWkt() assert wkt == 'POINT (1.0 169.600374)', 'did not get expected WKT' ############################################################################### # Test Area calculation for a Point def test_ogr_geom_area_point(): geom_wkt = 'POINT(0 0)' geom = ogr.CreateGeometryFromWkt(geom_wkt) with gdaltest.error_handler(): area = geom.Area() assert area == 0, ('Area() result wrong, got %g.' % area) ############################################################################### # Test Length calculation for a Point def test_ogr_geom_length_point(): # OGR >= 1.8.0 geom_wkt = 'POINT(0 0)' geom = ogr.CreateGeometryFromWkt(geom_wkt) with gdaltest.error_handler(): length = geom.Length() assert length == 0, ('Length() result wrong, got %g.' % length) ############################################################################### # Test Length calculation for a MultiLineString def test_ogr_geom_length_multilinestring(): # OGR >= 1.8.0 geom_wkt = 'MULTILINESTRING((0 0,0 1),(0 0,0 1))' geom = ogr.CreateGeometryFromWkt(geom_wkt) length = geom.Length() assert abs(length - 2) <= 0.00000000001, ('Length() result wrong, got %g.' % length) ############################################################################### # Test Length calculation for a GeometryCollection def test_ogr_geom_length_geometrycollection(): # OGR >= 1.8.0 geom_wkt = 'GEOMETRYCOLLECTION( POLYGON((0 0,0 1,1 1,1 0,0 0)), MULTILINESTRING((0 0,0 1),(0 0,0 1)), LINESTRING(0 0,0 1), LINESTRING(0 0,0 1), POINT(0 0), GEOMETRYCOLLECTION EMPTY )' geom = ogr.CreateGeometryFromWkt(geom_wkt) length = geom.Length() assert abs(length - 4) <= 0.00000000001, ('Length() result wrong, got %g.' % length) ############################################################################### # Test Geometry.GetPoints() (#4016) def test_ogr_geom_getpoints(): geom = ogr.CreateGeometryFromWkt('LINESTRING(0 1,2 3)') points = geom.GetPoints() assert points == [(0.0, 1.0), (2.0, 3.0)], 'did not get expected points (1)' points = geom.GetPoints(nCoordDimension=3) assert points == [(0.0, 1.0, 0.0), (2.0, 3.0, 0.0)], \ 'did not get expected points (2)' geom = ogr.CreateGeometryFromWkt('LINESTRING(0 1 2,3 4 5)') points = geom.GetPoints() assert points == [(0.0, 1.0, 2.0), (3.0, 4.0, 5.0)], \ 'did not get expected points (3)' points = geom.GetPoints(nCoordDimension=2) assert points == [(0.0, 1.0), (3.0, 4.0)], 'did not get expected points (4)' geom = ogr.CreateGeometryFromWkt('POINT(0 1)') points = geom.GetPoints() assert points == [(0.0, 1.0)], 'did not get expected points (5)' points = geom.GetPoints(nCoordDimension=3) assert points == [(0.0, 1.0, 0.0)], 'did not get expected points (6)' geom = ogr.CreateGeometryFromWkt('POINT(0 1 2)') points = geom.GetPoints() assert points == [(0.0, 1.0, 2.0)], 'did not get expected points (7)' points = geom.GetPoints(nCoordDimension=2) assert points == [(0.0, 1.0)], 'did not get expected points (8)' ############################################################################### # Test OGRGeometry::empty() def test_ogr_geom_empty(): g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0,1 1,1 2,1 1,0 0))') g1.Empty() wkt = g1.ExportToWkt() assert wkt == 'POLYGON EMPTY' ############################################################################### # Test OGRGeometry::empty() for Triangle def test_ogr_geom_empty_triangle(): g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,100 0,0 100,0 0))') g1.Empty() wkt = g1.ExportToWkt() assert wkt == 'TRIANGLE EMPTY' ############################################################################### # Test parsing WKT made of 2D and 3D parts def test_ogr_geom_mixed_coordinate_dimension(): # first part is 3D, second part is 2D of same length wkt = 'MULTIPOLYGON (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2,-1 -3,-2 -3,-2 -2,-1 -2,50 60)))' expected_wkt = 'MULTIPOLYGON (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2 0,-1 -3 0,-2 -3 0,-2 -2 0,-1 -2 0,50 60 0)))' g = ogr.CreateGeometryFromWkt(wkt) got_wkt = g.ExportToWkt() assert got_wkt == expected_wkt, \ ('for %s: got %s, expected %s' % (wkt, got_wkt, expected_wkt)) # first part is 3D, second part is 2D of same length, except the last point which is 3D wkt = 'MULTIPOLYGON (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2,-1 -3,-2 -3,-2 -2,-1 -2,50 60 7)))' expected_wkt = 'MULTIPOLYGON (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2 0,-1 -3 0,-2 -3 0,-2 -2 0,-1 -2 0,50 60 7)))' g = ogr.CreateGeometryFromWkt(wkt) got_wkt = g.ExportToWkt() assert got_wkt == expected_wkt, \ ('for %s: got %s, expected %s' % (wkt, got_wkt, expected_wkt)) ############################################################################### # Test GetEnvelope3D() def test_ogr_geom_getenvelope3d(): g = ogr.CreateGeometryFromWkt('POINT EMPTY') envelope = g.GetEnvelope3D() expected_envelope = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) assert envelope == expected_envelope, 'did not get expected envelope (1)' g = ogr.CreateGeometryFromWkt('POINT(1 2)') envelope = g.GetEnvelope3D() expected_envelope = (1.0, 1.0, 2.0, 2.0, 0.0, 0.0) assert envelope == expected_envelope, 'did not get expected envelope (2)' g = ogr.CreateGeometryFromWkt('POINT(1 2 3)') envelope = g.GetEnvelope3D() expected_envelope = (1.0, 1.0, 2.0, 2.0, 3.0, 3.0) assert envelope == expected_envelope, 'did not get expected envelope (3)' g = ogr.CreateGeometryFromWkt('POLYGON EMPTY') envelope = g.GetEnvelope3D() expected_envelope = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) assert envelope == expected_envelope, 'did not get expected envelope (4)' g = ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)') envelope = g.GetEnvelope3D() expected_envelope = (1, 3, 2, 4, 0, 0) assert envelope == expected_envelope, 'did not get expected envelope (5)' g = ogr.CreateGeometryFromWkt('MULTIPOLYGON(((1 2 3,-1 2 3,-1 -2 3,-1 2 3,1 2 3),(0.1 0.2 0.3,-0.1 0.2 0.3,-0.1 -0.2 0.3,-0.1 0.2 0.3,0.1 0.2 0.3)),((10 20 -30,-10 20 -30,-10 -20 -30,-10 20 -30,10 20 -30)))') envelope = g.GetEnvelope3D() expected_envelope = (-10, 10, -20, 20, -30, 3.0) assert envelope == expected_envelope, 'did not get expected envelope (6)' g = ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY') envelope = g.GetEnvelope3D() expected_envelope = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) assert envelope == expected_envelope, 'did not get expected envelope (7)' g = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0 0,100 0 100,0 100 100,0 0 0))') envelope = g.GetEnvelope3D() expected_envelope = (0.0, 100.0, 0.0, 100.0, 0.0, 100.0) assert envelope == expected_envelope, 'did not get expected envelope (8)' ############################################################################### # Test importing/exporting XXX Z EMPTY def test_ogr_geom_z_empty(): for geom in ['POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION', 'CIRCULARSTRING', 'COMPOUNDCURVE', 'CURVEPOLYGON', 'MULTICURVE', 'MULTISURFACE']: in_wkt = geom + ' Z EMPTY' g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToIsoWkt() assert in_wkt == out_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToIsoWkb()) out_wkt = g2.ExportToIsoWkt() assert in_wkt == out_wkt ############################################################################### # Test HasCurveGeometry and GetLinearGeometry def test_ogr_geom_getlineargeometry(): for geom in ['POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION', ('CIRCULARSTRING', 'LINESTRING'), ('COMPOUNDCURVE', 'LINESTRING'), ('CURVEPOLYGON', 'POLYGON'), ('MULTICURVE', 'MULTILINESTRING'), ('MULTISURFACE', 'MULTIPOLYGON')]: try: (geom_in, geom_out) = geom except: geom_in = geom_out = geom in_wkt = geom_in + ' EMPTY' g = ogr.CreateGeometryFromWkt(in_wkt) g2 = g.GetLinearGeometry() assert geom_in == geom_out or g.HasCurveGeometry() assert g2.ExportToWkt() == geom_out + ' EMPTY', g g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 1))') assert not g.HasCurveGeometry() assert not g.HasCurveGeometry(True) g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(CIRCULARSTRING (0 0,0 1,0 0))') assert g.HasCurveGeometry() assert g.HasCurveGeometry(True) ############################################################################### # Test GetDimension() def test_ogr_geom_getdimension(): for (geom, dim) in [('POINT EMPTY', 0), ('LINESTRING EMPTY', 1), ('POLYGON EMPTY', 2), ('MULTIPOINT EMPTY', 0), ('MULTILINESTRING EMPTY', 1), ('MULTIPOLYGON EMPTY', 2), ('GEOMETRYCOLLECTION EMPTY', 0), ('CIRCULARSTRING EMPTY', 1), ('COMPOUNDCURVE EMPTY', 1), ('CURVEPOLYGON EMPTY', 2), ('MULTICURVE EMPTY', 1), ('TRIANGLE EMPTY', 2), ('MULTISURFACE EMPTY', 2), ('POLYHEDRALSURFACE EMPTY', 2), ('TIN EMPTY', 2)]: g = ogr.CreateGeometryFromWkt(geom) assert g.GetDimension() == dim g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(LINESTRING EMPTY, POINT (0 1))') assert g.GetDimension() == 1 g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 1), LINESTRING EMPTY, POLYGON EMPTY)') assert g.GetDimension() == 2 ############################################################################### # Test triangle def test_ogr_geom_triangle(): wkt_original = 'TRIANGLE ((0 0,0 1,1 1,0 0))' geom = ogr.CreateGeometryFromWkt(wkt_original) wkb_string = geom.ExportToWkb(ogr.wkbXDR) geom = ogr.CreateGeometryFromWkb(wkb_string) wkt_string = geom.ExportToWkt() assert wkt_string == wkt_original, "Failure in Wkb methods of Triangle" wkt_string = geom.Clone().ExportToWkt() assert wkt_string == wkt_original, "Failure in Clone()" polygon_wkt = ogr.ForceTo(geom.Clone(), ogr.wkbPolygon).ExportToWkt() assert polygon_wkt == 'POLYGON ((0 0,0 1,1 1,0 0))' polygon_wkt = ogr.ForceTo(geom.Clone(), ogr.wkbMultiPolygon).ExportToWkt() assert polygon_wkt == 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))' ############################################################################### # Test importing invalid triangle WKT def test_ogr_geom_triangle_invalid_wkt(): geom_wkt = 'TRIANGLE (0 0)' with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None geom_wkt = 'TRIANGLE ((0 0))' with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None geom_wkt = 'TRIANGLE ((0 0,0 1,1 1,1 0))' with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None geom_wkt = 'TRIANGLE ((0 0,0 1,1 1,1 0,0 0))' with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None geom_wkt = 'TRIANGLE ((0 0,0 1,1 1,0 0),(0 0,0 1,1 1,0 0))' with gdaltest.error_handler(): geom = ogr.CreateGeometryFromWkt(geom_wkt) assert geom is None ############################################################################### # Test OGRTriangle. Tests if the GEOS/SFCGAL methods are working def test_ogr_geom_triangle_sfcgal(): if not ogrtest.have_sfcgal(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,100 0 100,0 100 100,0 0))') g2 = ogr.CreateGeometryFromWkt('TRIANGLE ((-1 -1,100 0 100,0 100 100,-1 -1))') assert g2.Intersects(g1) g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,1 0,0 1,0 0))') g2 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,1 0,1 1,0 0))') g3 = g1.Intersection(g2) g4 = ogr.CreateGeometryFromWkt('TRIANGLE ((0.5 0.5 0,0 0 0,1 0 0,0.5 0.5 0))') assert g4.Equals(g3) ############################################################################### # Test OGRCircularString def test_ogr_geom_circularstring(): in_wkt = 'CIRCULARSTRING (0 0,1 1,1 -1)' # Test export/import Wkt g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCircularString out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt if ogrtest.have_geos(): assert g1.IsValid() # Test GetEnvelope() env = g1.GetEnvelope() expected_env = (0.0, 2.0, -1.0, 1.0) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # Test Length() length = g1.Length() expected_length = 1.5 * math.pi assert abs(length - expected_length) <= 1e-8 # Test Value() p = g1.Value(-1) expected_p = ogr.CreateGeometryFromWkt('POINT (0 0)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(0) expected_p = ogr.CreateGeometryFromWkt('POINT (0 0)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(length / 6.0) expected_p = ogr.CreateGeometryFromWkt('POINT (0.292893218813453 0.707106781186548)') if ogrtest.check_feature_geometry(p, expected_p) != 0: print(p) p = g1.Value(length / 3.0) expected_p = ogr.CreateGeometryFromWkt('POINT (1 1)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(length / 2.0) expected_p = ogr.CreateGeometryFromWkt('POINT (1.707106781186547 0.707106781186547)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(2 * length / 3.0) expected_p = ogr.CreateGeometryFromWkt('POINT (2 0)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(length) expected_p = ogr.CreateGeometryFromWkt('POINT (1 -1)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(length + 1) expected_p = ogr.CreateGeometryFromWkt('POINT (1 -1)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 # Test export/import Wkb g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # With Z in_wkt = 'CIRCULARSTRING Z (0 0 10,1 1 20,2 0 30)' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCircularStringZ out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt wkb = g1.ExportToWkb() isowkb = g1.ExportToIsoWkb() assert wkb == isowkb g2 = ogr.CreateGeometryFromWkb(wkb) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Test stroking gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') in_wkt = 'CIRCULARSTRING (0 0,1 1,1 -1)' g1 = ogr.CreateGeometryFromWkt(in_wkt) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.218168517531969 0.623489801858729,0.777479066043687 0.974927912181831,1.433883739117561 0.900968867902435,1.900968867902463 0.433883739117562,1.974927912181821 -0.222520933956316,1.623489801858719 -0.78183148246804,1 -1)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 in_wkt = 'CIRCULARSTRING (0 0,1 1,1 -1)' g1 = ogr.CreateGeometryFromWkt(in_wkt) in_wkb = g1.ExportToWkb() gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.CreateGeometryFromWkb(in_wkb) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test HasCurveGeometry assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) # Test GetLinearGeometry g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') expected_g2 = ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0.218168517531969 0.623489801858729,0.777479066043687 0.974927912181831,1.433883739117561 0.900968867902435,1.900968867902463 0.433883739117562,1.974927912181821 -0.222520933956316,1.623489801858719 -0.78183148246804,1 -1))') g2 = ogr.ForceToMultiLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Test GEOS operations if ogrtest.have_geos(): g2 = g1.Intersection(g1) assert g2 is not None # Test CIRCULARSTRING wrapped in a GEOMETRYCOLLECTION in_wkt = 'GEOMETRYCOLLECTION(CIRCULARSTRING (0 0,1 1,1 -1))' g1 = ogr.CreateGeometryFromWkt(in_wkt) # Test GEOS operations if ogrtest.have_geos(): g2 = g1.Intersection(g1) assert g2 is not None # Test ForceToLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToMultiLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Test stroking of full circle with 3 points. ISO draft # mentions that this should define a full circle, but there's an # ambiguity on the winding order. We choose counter-clock-wise order like # PostGIS. On the contrary, Microsoft for example forbids # such a possibility : http://msdn.microsoft.com/en-us/library/ff929141.aspx in_wkt = 'CIRCULARSTRING (0 0,1 0,0 0)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 length = g1.Length() expected_length = 2 * math.pi * 0.5 assert abs(length - expected_length) <= 1e-8 # Test stroking of full circle (well defined) in_wkt = 'CIRCULARSTRING (0 0,0.5 0.5,1.0 0.0,0.5 -0.5,0.0 0.0)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.049515566048791 0.216941869558781,0.188255099070638 0.390915741234018,0.388739533021848 0.48746395609092,0.611260466978166 0.48746395609092,0.811744900929369 0.390915741234018,0.950484433951232 0.216941869558781,1 0,0.950484433951232 -0.216941869558781,0.811744900929369 -0.390915741234018,0.611260466978166 -0.48746395609092,0.388739533021848 -0.48746395609092,0.188255099070638 -0.390915741234018,0.049515566048791 -0.216941869558781,0 0)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 length = g1.Length() expected_length = 2 * math.pi * 0.5 assert abs(length - expected_length) <= 1e-8 # Check segmentize g1.Segmentize(0.5) expected_g = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,0.146446609406726 0.353553390593274,0.5 0.5,0.853553390593274 0.353553390593274,1 0,0.853553390593274 -0.353553390593274,0.5 -0.5,0.146446609406726 -0.353553390593274,0 0)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 # Sanity check: the length must remain the same length = g1.Length() expected_length = 2 * math.pi * 0.5 assert abs(length - expected_length) <= 1e-8 # Check segmentize symmetry : do exact binary comparison in_wkt = 'CIRCULARSTRING (0 0,1.2 1,2 0)' g1 = ogr.CreateGeometryFromWkt(in_wkt) g1.Segmentize(0.25) in_wkt = 'CIRCULARSTRING (2 0,1.2 1,0 0)' g2 = ogr.CreateGeometryFromWkt(in_wkt) g2.Segmentize(0.25) for i in range(g1.GetPointCount()): if g1.GetPoint(i) != g2.GetPoint(g1.GetPointCount() - 1 - i): print('%.18g' % (g1.GetPoint(i)[0] - g2.GetPoint(g1.GetPointCount() - 1 - i)[0])) pytest.fail('%.18g' % (g1.GetPoint(i)[1] - g2.GetPoint(g1.GetPointCount() - 1 - i)[1])) # Test stroking of full circle with Z in_wkt = 'CIRCULARSTRING (0 0 1,1 0 2,0 0 1)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0 1,0.116977778440514 -0.321393804843282 1,0.413175911166547 -0.49240387650611 1,0.75 -0.433012701892224 1,0.969846310392967 -0.171010071662835 1,0.969846310392967 0.171010071662835 1,0.75 0.433012701892224 1,0.413175911166547 0.49240387650611 1,0.116977778440514 0.321393804843282 1,0 0 1)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Check segmentize g1.Segmentize(0.5) expected_g = ogr.CreateGeometryFromWkt('CIRCULARSTRING Z (0 0 1,0.146446609406726 -0.353553390593274 1.25,0.5 -0.5 1.5,0.853553390593274 -0.353553390593274 1.75,1 0 2,0.853553390593274 0.353553390593274 1.75,0.5 0.5 1.5,0.146446609406727 0.353553390593274 1.25,0 0 1)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 # Same as above but reverse order in_wkt = 'CIRCULARSTRING (0 0,0.5 -0.5,1.0 0.0,0.5 0.5,0.0 0.0)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.049515566048791 -0.216941869558781,0.188255099070638 -0.390915741234018,0.388739533021848 -0.48746395609092,0.611260466978166 -0.48746395609092,0.811744900929369 -0.390915741234018,0.950484433951232 -0.216941869558781,1 0,0.950484433951232 0.216941869558781,0.811744900929369 0.390915741234018,0.611260466978166 0.48746395609092,0.388739533021848 0.48746395609092,0.188255099070638 0.390915741234018,0.049515566048791 0.216941869558781,0 0)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 length = g1.Length() expected_length = 2 * math.pi * 0.5 assert abs(length - expected_length) <= 1e-8 # Test stroking of a circular string with 3 colinear points in_wkt = 'CIRCULARSTRING (0 0,1 1,2 2)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 2)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 length = g1.Length() expected_length = 2 * math.sqrt(2) assert abs(length - expected_length) <= 1e-8 # Test Value() p = g1.Value(length / 4.0) expected_p = ogr.CreateGeometryFromWkt('POINT (0.5 0.5)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(3.0 * length / 4.0) expected_p = ogr.CreateGeometryFromWkt('POINT (1.5 1.5)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 # Check segmentize g1.Segmentize(0.5) expected_g = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,0.166666666666667 0.166666666666667,0.333333333333333 0.333333333333333,0.5 0.5,0.666666666666667 0.666666666666667,0.833333333333333 0.833333333333333,1 1,1.166666666666667 1.166666666666667,1.333333333333333 1.333333333333333,1.5 1.5,1.666666666666667 1.666666666666667,1.833333333333333 1.833333333333333,2 2)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 # Sanity check: the length must remain the same length = g1.Length() expected_length = 2 * math.sqrt(2) assert abs(length - expected_length) <= 1e-8 # Same with Z in_wkt = 'CIRCULARSTRING (0 0 1,1 1 2,2 2 1)' g1 = ogr.CreateGeometryFromWkt(in_wkt) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0 1,1 1 2,2 2 1)') g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Check segmentize g1.Segmentize(0.5) expected_g = ogr.CreateGeometryFromWkt('CIRCULARSTRING Z (0 0 1,0.166666666666667 0.166666666666667 1.166666666666667,0.333333333333333 0.333333333333333 1.333333333333333,0.5 0.5 1.5,0.666666666666667 0.666666666666667 1.666666666666667,0.833333333333333 0.833333333333333 1.833333333333333,1 1 2,1.166666666666667 1.166666666666667 1.833333333333333,1.333333333333333 1.333333333333333 1.666666666666667,1.5 1.5 1.5,1.666666666666667 1.666666666666667 1.333333333333333,1.833333333333333 1.833333333333333 1.166666666666667,2 2 1)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 # Test Value() p = g1.Value(length / 4.0) expected_p = ogr.CreateGeometryFromWkt('POINT (0.5 0.5 1.5)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(3.0 * length / 4.0) expected_p = ogr.CreateGeometryFromWkt('POINT (1.5 1.5 1.5)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 in_wkt = 'CIRCULARSTRING (0 0,1 1,1 -1)' # Test GetEnvelope() in various cases cx = 1 cy = 2 r = 3 # In quadrant 0 a0 = math.pi / 3 a1 = math.pi / 4 a2 = math.pi / 6 in_wkt = 'CIRCULARSTRING(%.16g %.16g,%.16g %.16g,%.16g %.16g)' % ( cx + r * math.cos(a0), cy + r * math.sin(a0), cx + r * math.cos(a1), cy + r * math.sin(a1), cx + r * math.cos(a2), cy + r * math.sin(a2)) g1 = ogr.CreateGeometryFromWkt(in_wkt) env = g1.GetEnvelope() expected_env = (cx + r * math.cos(a0), cx + r * math.cos(a2), cy + r * math.sin(a2), cy + r * math.sin(a0)) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # From quadrant 0 to quadrant -1 a0 = math.pi / 3 a1 = math.pi / 6 a2 = -math.pi / 6 in_wkt = 'CIRCULARSTRING(%.16g %.16g,%.16g %.16g,%.16g %.16g)' % ( cx + r * math.cos(a0), cy + r * math.sin(a0), cx + r * math.cos(a1), cy + r * math.sin(a1), cx + r * math.cos(a2), cy + r * math.sin(a2)) g1 = ogr.CreateGeometryFromWkt(in_wkt) env = g1.GetEnvelope() expected_env = (cx + r * math.cos(a0), cx + r, cy + r * math.sin(a2), cy + r * math.sin(a0)) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # From quadrant 0 to quadrant 3 a0 = math.pi / 3 a1 = math.pi - math.pi / 3 a2 = -math.pi / 6 in_wkt = 'CIRCULARSTRING(%.16g %.16g,%.16g %.16g,%.16g %.16g)' % ( cx + r * math.cos(a0), cy + r * math.sin(a0), cx + r * math.cos(a1), cy + r * math.sin(a1), cx + r * math.cos(a2), cy + r * math.sin(a2)) g1 = ogr.CreateGeometryFromWkt(in_wkt) env = g1.GetEnvelope() expected_env = (cx - r, cx + r * math.cos(a2), cy - r, cy + r) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # From quadrant 0 to quadrant 4 a0 = math.pi / 3 a1 = math.pi - math.pi / 3 a2 = math.pi / 6 in_wkt = 'CIRCULARSTRING(%.16g %.16g,%.16g %.16g,%.16g %.16g)' % ( cx + r * math.cos(a0), cy + r * math.sin(a0), cx + r * math.cos(a1), cy + r * math.sin(a1), cx + r * math.cos(a2), cy + r * math.sin(a2)) g1 = ogr.CreateGeometryFromWkt(in_wkt) env = g1.GetEnvelope() expected_env = (cx - r, cx + r, cy - r, cy + r) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # Full circle a0 = math.pi / 3 a1 = math.pi + math.pi / 3 a2 = math.pi / 3 in_wkt = 'CIRCULARSTRING(%.16g %.16g,%.16g %.16g,%.16g %.16g)' % ( cx + r * math.cos(a0), cy + r * math.sin(a0), cx + r * math.cos(a1), cy + r * math.sin(a1), cx + r * math.cos(a2), cy + r * math.sin(a2)) g1 = ogr.CreateGeometryFromWkt(in_wkt) env = g1.GetEnvelope() expected_env = (cx - r, cx + r, cy - r, cy + r) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 # Error case : not enough points in_wkt = 'CIRCULARSTRING (0 0)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # EMPTY for in_wkt in ['CIRCULARSTRING EMPTY', 'CIRCULARSTRING Z EMPTY']: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.Length() == 0.0, in_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt ############################################################################### # Test OGRCompoundCurve def test_ogr_geom_compoundcurve(): in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCompoundCurve out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.GetGeometryCount() == 1 assert g1.GetGeometryRef(0).ExportToWkt() == 'CIRCULARSTRING (0 0,1 1,1 -1)' env = g1.GetEnvelope() expected_env = (0.0, 2.0, -1.0, 1.0) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 length = g1.Length() expected_length = 1.5 * math.pi assert abs(length - expected_length) <= 1e-8 g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) # CreateGeometryFromWkt of LINESTRING in_wkt = 'COMPOUNDCURVE ((0 0,0 10))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.HasCurveGeometry() assert not g1.HasCurveGeometry(True) # With Z in_wkt = 'COMPOUNDCURVE Z (CIRCULARSTRING Z (0 0 10,1 1 20,2 0 30),(2 0 30,0 0 10))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCompoundCurveZ out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt env = g1.GetEnvelope() expected_env = (0.0, 2.0, 0.0, 1.0) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 env = g1.GetEnvelope3D() expected_env = (0.0, 2.0, 0.0, 1.0, 10, 30) for i in range(6): assert abs(env[i] - expected_env[i]) <= 1e-8 # Test Value() p = g1.Value(-1e-3) expected_p = ogr.CreateGeometryFromWkt('POINT (0 0 10)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(math.pi / 2.0) expected_p = ogr.CreateGeometryFromWkt('POINT (1 1 20)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(math.pi) expected_p = ogr.CreateGeometryFromWkt('POINT (2 0 30)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(math.pi + 1) expected_p = ogr.CreateGeometryFromWkt('POINT (1 0 20)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 p = g1.Value(math.pi + 2 + 1e-3) expected_p = ogr.CreateGeometryFromWkt('POINT (0 0 10)') assert ogrtest.check_feature_geometry(p, expected_p) == 0 wkb = g1.ExportToWkb() isowkb = g1.ExportToIsoWkb() assert wkb == isowkb g2 = ogr.CreateGeometryFromWkb(wkb) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Several parts in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCompoundCurve out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.Equals(g1) assert g1.Equals(g1.Clone()) assert not g1.Equals(ogr.CreateGeometryFromWkt('POINT(0 0)')) assert not g1.Equals(ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1))')) assert not g1.Equals(ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,0 1))')) length = g1.Length() expected_length = 1.5 * math.pi + math.sqrt(2) assert abs(length - expected_length) <= 1e-8 g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Test stroking gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1))' g1 = ogr.CreateGeometryFromWkt(in_wkt) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.218168517531969 0.623489801858729,0.777479066043687 0.974927912181831,1.433883739117561 0.900968867902435,1.900968867902463 0.433883739117562,1.974927912181821 -0.222520933956316,1.623489801858719 -0.78183148246804,1 -1)') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 in_wkt = 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1))' g1 = ogr.CreateGeometryFromWkt(in_wkt) in_wkb = g1.ExportToWkb() gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.CreateGeometryFromWkb(in_wkb) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.218168517531969 0.623489801858729,0.777479066043687 0.974927912181831,1.433883739117561 0.900968867902435,1.900968867902463 0.433883739117562,1.974927912181821 -0.222520933956316,1.623489801858719 -0.78183148246804,1 -1)') assert ogrtest.check_feature_geometry(g2, expected_g) == 0 g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') expected_g = ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0.218168517531969 0.623489801858729,0.777479066043687 0.974927912181831,1.433883739117561 0.900968867902435,1.900968867902463 0.433883739117562,1.974927912181821 -0.222520933956316,1.623489801858719 -0.78183148246804,1 -1))') g2 = ogr.ForceToMultiLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Check segmentize g1.Segmentize(0.5) expected_g = ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,0.076120467488713 0.38268343236509,0.292893218813453 0.707106781186548,0.61731656763491 0.923879532511287,1 1,1.38268343236509 0.923879532511287,1.707106781186547 0.707106781186547,1.923879532511287 0.38268343236509,2 0,1.923879532511287 -0.38268343236509,1.707106781186547 -0.707106781186547,1.38268343236509 -0.923879532511287,1 -1))') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 # Error case : not enough points in_wkt = 'COMPOUNDCURVE ((0 0))' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case : invalid curve in_wkt = 'COMPOUNDCURVE (COMPOUNDCURVE EMPTY)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case : non contiguous curves in_wkt = 'COMPOUNDCURVE ((0 0,1 1),(2 2,3 3))' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case : non contiguous curves in_wkt = 'COMPOUNDCURVE (EMPTY,(2 2,3 3))' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case : non contiguous curves in_wkt = 'COMPOUNDCURVE ((2 2,3 3), EMPTY)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None g = ogr.Geometry(ogr.wkbCompoundCurve) g.AddGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) assert g.ExportToWkt() == 'COMPOUNDCURVE ((0 0,1 1))' gdal.PushErrorHandler('CPLQuietErrorHandler') g.AddGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) gdal.PopErrorHandler() assert g.ExportToWkt() == 'COMPOUNDCURVE ((0 0,1 1),(1 1,0 0))' g = ogr.Geometry(ogr.wkbCompoundCurve) g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) assert g.ExportToWkt() == 'COMPOUNDCURVE ((0 0,1 1))' gdal.PushErrorHandler('CPLQuietErrorHandler') g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) gdal.PopErrorHandler() assert g.ExportToWkt() == 'COMPOUNDCURVE ((0 0,1 1),(1 1,0 0))' # Cannot add compoundcurve in compoundcurve g = ogr.Geometry(ogr.wkbCompoundCurve) gdal.PushErrorHandler('CPLQuietErrorHandler') g.AddGeometryDirectly(ogr.CreateGeometryFromWkt('COMPOUNDCURVE((1 1,2 2))')) gdal.PopErrorHandler() assert g.ExportToWkt() == 'COMPOUNDCURVE EMPTY' # Check that discretization is not sensitive to winding order g1 = ogr.CreateGeometryFromWkt('COMPOUNDCURVE((-1 0,0 1),CIRCULARSTRING (0 1,0.25 0,0.1 -0.5),(0.1 -0.5,-1 0))') g2 = g1.GetLinearGeometry(1.5) g1 = ogr.CreateGeometryFromWkt('COMPOUNDCURVE((-1 0,0.1 -0.5),CIRCULARSTRING (0.1 -0.5,0.25 0,0 1),(0 1,-1 0))') g3 = g1.GetLinearGeometry(1.5) p_count = g2.GetPointCount() for i in range(p_count): # yes we do strict (binary) comparison. This is really intended. # The curves must be exactly the same, despite our stealth mode if g2.GetX(i) != g3.GetX(p_count - 1 - i) or \ g2.GetY(i) != g3.GetY(p_count - 1 - i): print(abs(g2.GetX(i) - g3.GetX(p_count - 1 - i))) pytest.fail(abs(g2.GetY(i) - g3.GetY(p_count - 1 - i))) # Test Transform sr = osr.SpatialReference() sr.ImportFromEPSG(4326) g.AssignSpatialReference(sr) g.TransformTo(sr) # Invalid wkb wkb_list = ['\x01\x09\x00\x00\x00\x01\x00\x00\x00', # subgeometry declared but not present '\x01\x09\x00\x00\x00\xff\xff\xff\x7f', # 2 billion subgeometries declared ! '\x01\x09\x00\x00\x00\x01\x00\x00\x00\x01\xff\x00\x00\x00\x00\x00\x00\x00', # subgeometry invalid: unknown type '\x01\x09\x00\x00\x00\x01\x00\x00\x00\x01\x02\x00\x00\x00\x01\x00\x00\x00', # subgeometry invalid: linestring truncated '\x01\x09\x00\x00\x00\x01\x00\x00\x00\x01\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', # subgeometry invalid: linestring with one point '\x01\x09\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', # subgeometry invalid: point '\x01\x09\x00\x00\x00\x01\x00\x00\x00\x01\x09\x00\x00\x00\x00\x00\x00\x00', # subgeometry invalid: compoundcurve ] for wkb in wkb_list: gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkb(wkb) gdal.PopErrorHandler() assert g is None, wkb # EMPTY for in_wkt in ['COMPOUNDCURVE EMPTY', 'COMPOUNDCURVE Z EMPTY']: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.Length() == 0.0, in_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt ############################################################################### # Test OGRCurvePolygon def test_ogr_geom_curvepolygon(): in_wkt = 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCurvePolygon out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt if ogrtest.have_geos(): p1 = g1.PointOnSurface() assert (p1.GetX() - 0.5) * (p1.GetX() - 0.5) + p1.GetY() * p1.GetY() <= 0.5 * 0.5 env = g1.GetEnvelope() expected_env = (0.0, 1.0, -0.5, 0.5) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 area = g1.Area() expected_area = math.pi * 0.5 * 0.5 assert abs(area - expected_area) <= 1e-8 g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # CURVEPOLYGON of LINESTRING in_wkt = 'CURVEPOLYGON ((0 0,0 10,10 10,10 0,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.HasCurveGeometry() assert not g1.HasCurveGeometry(True) # With Z in_wkt = 'CURVEPOLYGON Z (CIRCULARSTRING Z (0 0 10,1 0 10,0 0 10))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbCurvePolygonZ out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt wkb = g1.ExportToWkb() isowkb = g1.ExportToIsoWkb() assert wkb == isowkb g2 = ogr.CreateGeometryFromWkb(wkb) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Test stroking gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') in_wkt = 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))') assert ogrtest.check_feature_geometry(g1, expected_g) == 0 in_wkt = 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) in_wkb = g1.ExportToWkb() gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.CreateGeometryFromWkb(in_wkb) gdal.SetConfigOption('OGR_STROKE_CURVE', 'FALSE') gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test HasCurveGeometry assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) # Test GetLinearGeometry g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToPolygon gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToPolygon(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiPolygon gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') expected_g2 = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)))') g2 = ogr.ForceToMultiPolygon(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Test ForceToMultiLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToMultiLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g3 = ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))') assert ogrtest.check_feature_geometry(g2, expected_g3) == 0 # Test GEOS operations if ogrtest.have_geos(): g2 = g1.Intersection(g1) assert g2 is not None # Test CURVEPOLYGON and COMPOUNDCURVE, CIRCULARSTRING, LINESTRING in_wkt = 'CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),(2 0,0 0)),(0.1 0.1,0.1 0.2,0.2 0.2,0.2 0.1,0.1 0.1),CIRCULARSTRING (0.25 0.25,0.75 0.25,0.25 0.25))' g1 = ogr.CreateGeometryFromWkt(in_wkt) g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) assert g2.ExportToWkt() == in_wkt # Test CURVEPOLYGON wrapped in a GEOMETRYCOLLECTION in_wkt = 'GEOMETRYCOLLECTION(CURVEPOLYGON(CIRCULARSTRING (0 0,1 0,0 0)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) assert g1.Equals(g2) # Test GEOS operations if ogrtest.have_geos(): g2 = g1.Intersection(g1) assert g2 is not None # Test ForceToPolygon gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToPolygon(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test ForceToMultiPolygon gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToMultiPolygon(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert ogrtest.check_feature_geometry(g2, expected_g2) == 0 # Error case : not enough points in_wkt = 'CURVEPOLYGON ((0 0,0 1,0 0))' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case : wrong sub-geometry type in_wkt = 'CURVEPOLYGON (POINT EMPTY)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Error case: non closed ring in_wkt = 'CURVEPOLYGON ((0 0,0 1,1 1,1 0))' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None # Area g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,1 1,1 0,0 0))') assert g.Area() == 0.5 g = ogr.CreateGeometryFromWkt('CURVEPOLYGON (COMPOUNDCURVE((0 0,1 1,1 0,0 0)))') assert g.Area() == 0.5 g = ogr.CreateGeometryFromWkt('CURVEPOLYGON (COMPOUNDCURVE((0 0,1 1),(1 1,1 0,0 0)))') assert g.Area() == 0.5 g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((100000000 100000000,100000001 100000001,100000001 100000000,100000000 100000000))') assert g.Area() == 0.5 # Equals g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,1 1,1 0,0 0),CIRCULARSTRING(0.75 0.5,0.85 0.5,0.75 0.5))') assert g1.Equals(g1) assert g1.Equals(g1.Clone()) assert not g1.Equals(ogr.CreateGeometryFromWkt('POINT(0 0)')) assert not g1.Equals(ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,1 1,1 0,0 0))')) # Intersects optimizations on a circle g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,2 0,0 0))') # Point slightly within circle p1 = ogr.CreateGeometryFromWkt('POINT (%.16g %.16g)' % (1 + math.cos(math.pi / 6) - 1e-4, math.sin(math.pi / 6))) # To prove that we don't use discretization gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') res = g1.Intersects(p1) res = res & p1.Intersects(g1) res = res & g1.Contains(p1) res = res & p1.Within(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) assert res # Test point slightly outside circle p2 = ogr.CreateGeometryFromWkt('POINT (%.16g %.16g)' % (1 + math.cos(math.pi / 6) + 1e-4, math.sin(math.pi / 6))) assert not p2.Within(g1) # Full circle defined by 2 arcs g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,2 0,1 -1,0 0))') assert p1.Within(g1) # Same but in reverse order g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,1 -1,2 0,1 1,0 0))') assert p1.Within(g1) # This is not a circle p2 = ogr.CreateGeometryFromWkt('POINT (%.16g %.16g)' % (1 + math.cos(math.pi / 6) - 1e-2, math.sin(math.pi / 6))) g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,2 0,1 1,0 0))') assert not p2.Within(g1) # Test area on circle in 2 pieces g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,2 0,1 -1,0 0))') area = g1.Area() expected_area = math.pi assert abs(area - expected_area) <= 1e-10 # Test area on hippodrome g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,2 0,2 -1,2 -2,1 -3,0 -2,0 -1,0 0))') area = g1.Area() expected_area = math.pi + 2 * 2 assert abs(area - expected_area) <= 1e-10 # Same hippodrome but with different WKT g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (COMPOUNDCURVE(CIRCULARSTRING (0 0,1 1,2 0),(2 0,2 -2),CIRCULARSTRING(2 -2,1 -3,0 -2),(0 -2,0 0)))') area = g1.Area() expected_area = math.pi + 2 * 2 assert abs(area - expected_area) <= 1e-10 # Similar, but with concave part (does not trigger optimization) g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON (COMPOUNDCURVE(CIRCULARSTRING (0 0,1 1,2 0),(2 0,2 -2),CIRCULARSTRING(2 -2,1 -1,0 -2),(0 -2,0 0)))') area = g1.Area() expected_area = 2 * 2 assert abs(area - expected_area) <= 1e-10 # EMPTY for in_wkt in ['CURVEPOLYGON EMPTY', 'CURVEPOLYGON Z EMPTY']: g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.Area() == 0.0, in_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Empty CircularString g = ogr.Geometry(ogr.wkbCurvePolygon) g.AddGeometry(ogr.Geometry(ogr.wkbCircularString)) assert g.Area() == 0 # Non-convex CircularString g = ogr.CreateGeometryFromWkt('CURVEPOLYGON( COMPOUNDCURVE( CIRCULARSTRING(0 0,0.5 -0.5,1 0,1.5 0.5,2 0), (2 0,2 1,0 1,0 0) ) )') assert abs(g.Area() - 2.0) <= 1e-10 ############################################################################### # Test OGRMultiCurve def test_ogr_geom_multicurve(): # Simple test in_wkt = 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbMultiCurve out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.GetDimension() == 1 env = g1.GetEnvelope() expected_env = (0.0, 1.0, -0.5, 0.5) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 length = g1.Length() expected_length = 2 * math.pi * 0.5 assert abs(length - expected_length) <= 1e-8 g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) # MULTICURVE of LINESTRING in_wkt = 'MULTICURVE ((0 0,1 0))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.HasCurveGeometry() assert not g1.HasCurveGeometry(True) # Z in_wkt = 'MULTICURVE Z (CIRCULARSTRING Z (0 0 10,1 0 10,0 0 10))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbMultiCurveZ out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # WKT with all possible sub geometries in_wkt = 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,1 1),COMPOUNDCURVE ((0 0,1 1),CIRCULARSTRING (1 1,2 2,3 3)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Test ForceToMultiLineString gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToMultiLineString(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = 'MULTILINESTRING ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0),(0 0,1 1),(0 0,1 1,2 2,3 3))' assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test GetLinearGeometry g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Error case : wrong sub-geometry type in_wkt = 'MULTILINESTRING (POINT EMPTY)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None ############################################################################### # Test OGRMultiSurface def test_ogr_geom_multisurface(): # Simple test in_wkt = 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbMultiSurface out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt assert g1.GetDimension() == 2 env = g1.GetEnvelope() expected_env = (0.0, 1.0, -0.5, 0.5) for i in range(4): assert abs(env[i] - expected_env[i]) <= 1e-8 area = g1.Area() expected_area = math.pi * 0.5 * 0.5 assert abs(area - expected_area) <= 1e-8 g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt assert g1.HasCurveGeometry() assert g1.HasCurveGeometry(True) # Z in_wkt = 'MULTISURFACE Z (CURVEPOLYGON Z (CIRCULARSTRING Z (0 0 10,1 0 10,0 0 10)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.GetGeometryType() == ogr.wkbMultiSurfaceZ out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # MULTISURFACE of POLYGON in_wkt = 'MULTISURFACE (((0 0,0 10,10 10,10 0,0 0)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) assert g1.HasCurveGeometry() assert not g1.HasCurveGeometry(True) # WKT with all possible sub geometries in_wkt = 'MULTISURFACE (((0 0,0 10,10 10,10 0,0 0)),CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) out_wkt = g1.ExportToWkt() assert in_wkt == out_wkt g2 = ogr.CreateGeometryFromWkb(g1.ExportToWkb()) out_wkt = g2.ExportToWkt() assert in_wkt == out_wkt # Test ForceToMultiPolygon gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') g2 = ogr.ForceToMultiPolygon(g1) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) expected_g = 'MULTIPOLYGON (((0 0,0 10,10 10,10 0,0 0)),((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)))' assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Test GetLinearGeometry g2 = g1.GetLinearGeometry(45) assert ogrtest.check_feature_geometry(g2, expected_g) == 0 # Check that GetLinearGeometry() is idem-potent on MULTIPOLYGON g3 = g2.GetLinearGeometry(45) assert g3.Equals(g2) # PointOnSurface if ogrtest.have_geos(): in_wkt = 'MULTISURFACE (((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,9 1,1 1)),((10 0,10 10,20 10,20 0,10 0),(11 1,11 9,19 9,19 1,11 1)))' g1 = ogr.CreateGeometryFromWkt(in_wkt) p1 = g1.PointOnSurface() assert p1.ExportToWkt() == 'POINT (0.5 5.0)' # Error case : wrong sub-geometry type in_wkt = 'MULTIPOLYGON (POINT EMPTY)' gdal.PushErrorHandler('CPLQuietErrorHandler') g = ogr.CreateGeometryFromWkt(in_wkt) gdal.PopErrorHandler() assert g is None ############################################################################### # Test GetCurveGeometry def test_ogr_geom_getcurvegeometry(): for geom in ['POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION', 'CIRCULARSTRING', 'COMPOUNDCURVE', 'CURVEPOLYGON', 'MULTICURVE', 'MULTISURFACE']: in_wkt = geom + ' EMPTY' g = ogr.CreateGeometryFromWkt(in_wkt) g2 = g.GetCurveGeometry() assert g2.ExportToWkt() == in_wkt, g g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 1))') g2 = g.GetCurveGeometry() assert g.Equals(g2) g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(LINESTRING (0 0,0 1,0 0))') g2 = g.GetCurveGeometry() assert g.Equals(g2) g = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))') g2 = g.GetCurveGeometry() assert g.Equals(g2) g = ogr.CreateGeometryFromWkt('POLYGON Z ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))') g2 = g.GetCurveGeometry() assert g.Equals(g2) # CircularString with large step g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 1,2 0)') g2 = g1.GetLinearGeometry(15) g3 = g2.GetCurveGeometry() assert (g3.GetGeometryType() == ogr.wkbCircularString and \ g1.GetPoint(0) == g3.GetPoint(0) and g1.GetPoint(2) == g3.GetPoint(2) and \ abs((g3.GetX(1) - 1) * (g3.GetX(1) - 1) + g3.GetY(1) * g3.GetY(1) - 1) <= 1e-8) # CurvePolygon with large step g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON( CIRCULARSTRING (0 0,1 1,0 0))') g2 = g1.GetLinearGeometry(15) g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # This is a straight line g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (1 2,3 4,5 6)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.ExportToWkt() == 'LINESTRING (1 2,3 4,5 6)' # "Random" arcs for wkt in ['CIRCULARSTRING (1 2,3 1,5 6)', 'CIRCULARSTRING (1 -2,3 -1,5 -6)', 'CIRCULARSTRING (-1 2,-3 1,-5 6)', 'CIRCULARSTRING (5 6,3 1,1 2)', 'CIRCULARSTRING (-5 6,-3 1,-1 2)', 'CIRCULARSTRING (5 -6,3 -1,1 -2)', 'CIRCULARSTRING (215725 -977513,872751 872597,560240 -7500)', 'CIRCULARSTRING (-492367 816163,537838 -421954,745494 -65479)', 'CIRCULARSTRING (543208 -865295,582257 635396,563925 -68156)', 'CIRCULARSTRING (-481 -193,1 329,-692 -421)', 'CIRCULARSTRING (525407 781005,710737 463833,-674365 340022)', 'CIRCULARSTRING (743949 709309,743952 709307,743964 709298)', 'CIRCULARSTRING (283167 -48388,536492 -197399,-449301 382451)']: g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Really random arcs with coordinates in the [-1000,1000] range for i in range(1000): v = [random.randint(-1000, 1000) for i in range(6)] if v[0] != v[4] or v[1] != v[5]: wkt = 'CIRCULARSTRING (%d %d,%d %d,%d %d)' % (v[0], v[1], v[2], v[3], v[4], v[5]) g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() if g2.GetPointCount() != 3: g3 = g2.GetCurveGeometry() if not g3.Equals(g1): # FIXME sometime... but avoid failing. for now. This randomly fails, but this is not # the end of the world... # gdaltest.post_reason('fail') print('Difference found :') print(g1) print(g3) # return 'fail' # Really random arcs in random displacements, but with small radius for i in range(1000): x = random.randint(-1000000, 1000000) y = random.randint(-1000000, 1000000) v = [random.randint(-10, 10) for i in range(6)] if v[0] != v[4] or v[1] != v[5]: wkt = 'CIRCULARSTRING (%d %d,%d %d,%d %d)' % (x + v[0], y + v[1], x + v[2], y + v[3], x + v[4], y + v[5]) g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() if g2.GetPointCount() != 3: g3 = g2.GetCurveGeometry() if not g3.Equals(g1): # FIXME sometime... but avoid failing. for now. This randomly fails, but this is not # the end of the world... # gdaltest.post_reason('fail') print('Difference found :') print(g1) print(g3) # return 'fail' # Really random arcs with coordinates in the [-1000000,1000000] range for i in range(1000): v = [random.randint(-1000000, 1000000) for i in range(6)] if v[0] != v[4] or v[1] != v[5]: wkt = 'CIRCULARSTRING (%d %d,%d %d,%d %d)' % (v[0], v[1], v[2], v[3], v[4], v[5]) g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() if g2.GetPointCount() != 3: g3 = g2.GetCurveGeometry() if not g3.Equals(g1): # FIXME sometime... but avoid failing. for now. This randomly fails, but this is not # the end of the world... # gdaltest.post_reason('fail') print('Difference found :') print(g1) print(g3) # return 'fail' # 5 points full circle g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,0.5 -0.5,1 0,0.5 0.5,0 0)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # 3 points full circle g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 0,0 0)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert (g3.GetGeometryType() == ogr.wkbCircularString and \ g1.GetPoint(0) == g3.GetPoint(0) and \ g1.GetPoint(1) == g3.GetPoint(2) and \ g1.GetPoint(2) == g3.GetPoint(4) and \ abs((g3.GetX(1) - 0.5) * (g3.GetX(1) - 0.5) + g3.GetY(1) * g3.GetY(1) - 0.5 * 0.5) <= 1e-12 and \ abs((g3.GetX(3) - 0.5) * (g3.GetX(3) - 0.5) + g3.GetY(3) * g3.GetY(3) - 0.5 * 0.5) <= 1e-12) # 3 points full circle in a CurvePolygon for wkt in ['CURVEPOLYGON( CIRCULARSTRING (0 0,1 0,0 0))', 'CURVEPOLYGON( CIRCULARSTRING (0 0,0 1,0 0))', 'CURVEPOLYGON( CIRCULARSTRING (0 0,-1 0,0 0))', 'CURVEPOLYGON( CIRCULARSTRING (0 0,0 -1,0 0))']: g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # 2 curves in the CircularString g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 1,2 0,3 -1,4 0)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # 3 curves in the CircularString g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 1,2 0,3 -1,4 0,5 1,6 0)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # CircularString, LineString, CircularString g1 = ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),(2 0,3 0,4 0),CIRCULARSTRING (4 0,5 1,6 0))') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # LineString, CircularString, LineString, CircularString, LineString g1 = ogr.CreateGeometryFromWkt('COMPOUNDCURVE ((-1 0,-0.5 0.5,0 0),CIRCULARSTRING (0 0,1 1,2 0),(2 0,3 0,4 0),CIRCULARSTRING (4 0,5 1,6 0),(6 0,7 0))') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Check with default discretization method g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.000997093138961 0.068920262501281,0.006738548124866 0.137608197923873,0.017197098230267 0.205737600590167,0.032323074784779 0.272984917348872,0.052044643056421 0.339030784160355,0.076268143401735 0.403561542787492,0.104878536064531 0.466270730389102,0.137739947510866 0.526860534941749,0.174696315705653 0.585043209577972,0.215572131266425 0.640542439124111,0.260173270974444 0.693094652347904,0.30828791968472 0.742450273683876,0.359687576256715 0.788374908491942,0.414128138728451 0.830650456220319,0.471351063580441 0.869076146186235,0.531084593583979 0.903469491055406,0.593045048402615 0.933667153492107,0.656938171817632 0.959525721864054,0.722460529179411 0.980922391318168,0.789300948448056 0.99775554699276,0.857141997979641 1.009945246596371,0.925661494039921 1.017433600061489,0.994534030886182 1.020185044470095,1.063432526150724 1.01818651294542,1.132029774186796 1.01144749670781,1.2 1.0,1.267547127648721 0.983752320094182,1.333803428245673 0.962854851656094,1.398449236893265 0.937408418110045,1.461172658788815 0.907535790143504,1.521671074014578 0.873381093378847,1.579652597579492 0.835109113014538,1.634837487668428 0.792904498790658,1.686959495304612 0.746970874114522,1.73576714891352 0.697529853644598,1.781024967590663 0.644819974072535,1.822514597219645 0.589095543261942,1.860035863959079 0.53062541329644,1.89340774001566 0.469691683356621,1.922469217043826 0.406588338684124,1.94708008295817 0.341619832199361,1.967121598410718 0.27509961561613,1.982497069669296 0.207348627140011,1.993132315133044 0.138693743046887,1.998976023234287 0.069466200612231,2 0)') g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Check with alternate discretization method : ROUND_ANGLE_METHOD g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = ogr.CreateGeometryFromWkt('LINESTRING (0 0,-0.000199980003999 0.02,0.002236456877416 0.089770423644023,0.009533897446083 0.159200932797352,0.021656789305088 0.227953268998521,0.038546070943884 0.295692477776518,0.060119459480029 0.362088540515299,0.086271851533127 0.426817982271309,0.116875835277923 0.489565447710894,0.151782311181914 0.550025237489786,0.190821218403283 0.607902797589577,0.233802363310224 0.662916154355295,0.280516346085201 0.7147972882427,0.330735580899807 0.763293439582565,0.384215404690045 0.80816834000038,0.440695269130182 0.849203363492117,0.499900009998002 0.886198591548151,0.561541187747236 0.918973787136141,0.62531849275604 0.947369272797732,0.690921208405283 0.971246708581086,0.758029724858684 0.990489766019218,0.826317096169807 1.005004694870594,0.895450633129846 1.014720779860886,0.965093524096011 1.019590685200679,1.034906475903993 1.019590685200679,1.104549366870158 1.014720779860886,1.173682903830197 1.005004694870593,1.2 1.0,1.241970275141317 0.990489766019217,1.309078791594718 0.971246708581085,1.374681507243961 0.947369272797731,1.438458812252765 0.91897378713614,1.500099990002 0.886198591548151,1.559304730869819 0.849203363492116,1.615784595309956 0.808168340000379,1.669264419100194 0.763293439582565,1.7194836539148 0.714797288242699,1.766197636689777 0.662916154355294,1.809178781596718 0.607902797589576,1.848217688818087 0.550025237489785,1.883124164722078 0.489565447710893,1.913728148466874 0.426817982271308,1.939880540519971 0.362088540515298,1.961453929056117 0.295692477776516,1.978343210694912 0.227953268998519,1.990466102553917 0.15920093279735,1.997763543122584 0.089770423644022,2.000199980003999 0.02,2 0)') g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Check with PostgreSQL output of SELECT ST_CurveToLine(ST_GeomFromText('CIRCULARSTRING (0 0,1.2 1.0,2 0)')) g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = ogr.CreateGeometryFromWkt('LINESTRING (0 0,0.000223190308279 0.049091765203314,0.002854930521212 0.098113445796116,0.007888880546112 0.146946944256066,0.015312913156447 0.195474616408063,0.025109143207391 0.243579554839372,0.037253970722702 0.291145870539817,0.051718137749134 0.338058972088558,0.068466798841411 0.384205841714863,0.08745960500795 0.429475307567812,0.108650800915124 0.473758311539029,0.131989335115863 0.516948171993215,0.157418983037062 0.558940840773549,0.184878482429505 0.599635153862819,0.214301680953989 0.638933075096389,0.245617695548099 0.676739932339917,0.27875108318972 0.712964645562815,0.31362202264588 0.747519946258017,0.350146506769097 0.780322587679462,0.388236544877951 0.811293545390794,0.427800374734344 0.840358207642151,0.46874268360677 0.867446555116406,0.510964837887032 0.892493329611833,0.554365120707246 0.915438191254836,0.598838976984681 0.936225863863983,0.644279265304116 0.954806268115175,0.690576516030889 0.971134642187118,0.737619195032841 0.985171649596477,0.785293972375802 0.996883473962907,0.833485995345338 1.006241900475673,0.88207916513699 1.013224383865605,0.930956416548473 1.017814102718623,0.98 1.02,1.029091765203309 1.019776809691721,1.078113445796111 1.017145069478788,1.12694694425606 1.012111119453889,1.175474616408058 1.004687086843554,1.223579554839367 0.994890856792611,1.271145870539812 0.9827460292773,1.318058972088553 0.968281862250867,1.364205841714858 0.951533201158591,1.409475307567807 0.932540394992052,1.453758311539024 0.911349199084878,1.49694817199321 0.88801066488414,1.538940840773545 0.862581016962941,1.579635153862814 0.835121517570498,1.618933075096384 0.805698319046015,1.656739932339913 0.774382304451905,1.692964645562811 0.741248916810284,1.727519946258013 0.706377977354124,1.760322587679458 0.669853493230907,1.791293545390791 0.631763455122053,1.820358207642148 0.59219962526566,1.847446555116403 0.551257316393235,1.872493329611831 0.509035162112973,1.895438191254833 0.465634879292759,1.916225863863981 0.421161023015324,1.934806268115173 0.37572073469589,1.951134642187117 0.329423483969116,1.965171649596476 0.282380804967164,1.976883473962906 0.234706027624203,1.986241900475672 0.186514004654668,1.993224383865604 0.137920834863015,1.997814102718623 0.089043583451532,2.0 0.04,2 0)') g3 = g2.GetCurveGeometry() g1_expected = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,0.98 1.02,2 0)') assert g3.Equals(g1_expected) # Test default ( implicit option ADD_INTERMEDIATE_POINT=STEALTH ) g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test with Z g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0 1,1 1 2,2 0 3)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (2 0 3,1 1 2,0 0 1)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test option ADD_INTERMEDIATE_POINT=STEALTH g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = g1.GetLinearGeometry(options=['ADD_INTERMEDIATE_POINT=STEALTH']) g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test option ADD_INTERMEDIATE_POINT=YES g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = g1.GetLinearGeometry(options=['ADD_INTERMEDIATE_POINT=YES']) g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test with big coordinates. The points are (2,49),(3,50),(4,49) reprojected from EPSG:4326 to EPSG:32631 g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (426857.987717275 5427937.52346616,500000.000000001 5538630.70286887,573142.012282726 5427937.52346616)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert ogrtest.check_feature_geometry(g3, g1) == 0 # Same with integer coordinates g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (426858 5427938,500000 5538632,573142 5427938)') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test option ADD_INTERMEDIATE_POINT=FALSE g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.2 1.0,2 0)') g2 = g1.GetLinearGeometry(options=['ADD_INTERMEDIATE_POINT=FALSE']) g3 = g2.GetCurveGeometry() g1_expected = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1.0 1.020199980003999,2 0)') assert ogrtest.check_feature_geometry(g3, g1_expected) == 0 # Test with unrecognized options gdal.PushErrorHandler('CPLQuietErrorHandler') g2_new = g1.GetLinearGeometry(options=['bla', 'ADD_INTERMEDIATE_POINT=FALSE', 'foo=bar']) gdal.PopErrorHandler() assert g2_new.Equals(g2) # Add repeated point at end of line g2 = g1.GetLinearGeometry() g2.AddPoint_2D(2 - 1e-9, 0) g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Add repeated point at end of line g2 = g1.GetLinearGeometry() g2_new = ogr.Geometry(ogr.wkbLineString) g2_new.AddPoint_2D(0, 1e-9) for i in range(g2.GetPointCount()): g2_new.AddPoint_2D(g2.GetX(i), g2.GetY(i)) g3 = g2_new.GetCurveGeometry() assert g3.Equals(g1) # Test various configurations for (wkt, eps) in [('CIRCULARSTRING (0 0,0.5 0.5,0 1,-0.5 0.5,0 0)', 0), ('CIRCULARSTRING (0 0,-0.5 0.5,0 1,0.5 0.5,0 0)', 0), ('CIRCULARSTRING (0 0,0.5 -0.5,0 -1,-0.5 -0.5,0 0)', 0), ('CIRCULARSTRING (0 0,-0.5 -0.5,0 -1,0.5 -0.5,0 0)', 0), ('CIRCULARSTRING (-1 -1,-1 1,1 1,1 -1,-1 -1)', 0), ('CIRCULARSTRING (-1 -1,1 -1,1 1,-1 1,-1 -1)', 0), ('CIRCULARSTRING (0 1,1 0,0 -1,-1 0,0 1)', 0), ('CIRCULARSTRING (0 0.01,0.01 0,0 -0.01,-0.01 0,0 0.01)', 0), ('CIRCULARSTRING (0 0.0001,0.0001 0,0 -0.0001,-0.0001 0,0 0.0001)', 0), ('CIRCULARSTRING (0 1000000,1000000 0,0 -1000000,-1000000 0,0 1000000)', 0), ('CIRCULARSTRING (1234567 8901234,5678901 23456789,0123456 78901234)', 0), ('CIRCULARSTRING (1234567.12 8901234.34,5678901.56 23456789.01,0123456.78 78901234.56)', 1e-1), ('CIRCULARSTRING (1234567 -8901234,-5678901 23456789,0123456 -78901234)', 0), ('CIRCULARSTRING (0 0.000001,0.000001 0,0 -0.000001,-0.000001 0,0 0.000001)', 1e-12), ('CIRCULARSTRING (0 0.00000001,0.00000001 0,0 -0.00000001,-0.00000001 0,0 0.00000001)', 1e-12), ('CIRCULARSTRING (1 0.00000001,1.00000001 0,1 -0.00000001,0.99999999 0,1 0.00000001)', 1e-12), ('CIRCULARSTRING (100000000 1,100000001 0,100000000 -1,99999999 0,100000000 1)', 0), ('CIRCULARSTRING (-100000000 1,-100000001 0,-100000000 -1,-99999999 0,-100000000 1)', 0), ('CIRCULARSTRING (100000000 100000001,100000001 100000000,100000000 99999999,99999999 100000000,100000000 100000001)', 0), ('CIRCULARSTRING (760112.098000001162291 207740.096999999135733,760116.642489952617325 207741.101843414857285,760120.967999998480082 207742.820000000298023,760123.571822694852017 207744.275888498465065,760126.011999998241663 207745.991999998688698,760127.330062366439961 207747.037052432337077,760128.585999999195337 207748.155999999493361)', 1e-5)]: g1 = ogr.CreateGeometryFromWkt(wkt) g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert not (eps == 0 and not g3.Equals(g1)) or (eps > 0 and ogrtest.check_feature_geometry(g3, g1, eps) != 0), \ '' # Test with GEOMETRYCOLLECTION container g1 = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(CIRCULARSTRING (0 0,0.5 0.5,0 1,-0.5 0.5,0 0))') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test with MULTICURVE container g1 = ogr.CreateGeometryFromWkt('MULTICURVE(CIRCULARSTRING (0 0,0.5 0.5,0 1,-0.5 0.5,0 0))') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) # Test with MULTISURFACE container g1 = ogr.CreateGeometryFromWkt('MULTISURFACE(CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING (0 0,0.5 0.5,1 0),(1 0,0 0))))') g2 = g1.GetLinearGeometry() g3 = g2.GetCurveGeometry() assert g3.Equals(g1) if ogrtest.have_geos(): g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON(CIRCULARSTRING (0 0,2 0,0 0))') g2 = ogr.CreateGeometryFromWkt('CURVEPOLYGON(CIRCULARSTRING (1 0,3 1,1 0))') g3 = g1.Intersection(g2) assert g3.GetGeometryType() == ogr.wkbCurvePolygon g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON(CIRCULARSTRING (0 0,2 0,0 0))') g2 = ogr.CreateGeometryFromWkt('CURVEPOLYGON((1 -1,1 1,3 1,3 -1,1 -1))') g3 = g1.Intersection(g2) assert g3.GetGeometryType() == ogr.wkbCurvePolygon g1 = ogr.CreateGeometryFromWkt('CURVEPOLYGON(CIRCULARSTRING (0 0,2 0,0 0))') g2 = ogr.CreateGeometryFromWkt('CURVEPOLYGON(CIRCULARSTRING (3 0,5 0,3 0))') g3 = g1.Union(g2) assert g3.ExportToWkt() == 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,2 0,0 0)),CURVEPOLYGON (CIRCULARSTRING (3 0,5 0,3 0)))' g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 1,2 0))') g2 = ogr.CreateGeometryFromWkt('CIRCULARSTRING (2 0,1 -1,0 0))') g3 = g1.Union(g2) assert g3.ExportToWkt() == 'MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,1 -1,0 0))' g1 = ogr.CreateGeometryFromWkt('POINT(1 2)') g1 = g1.Buffer(0.5) g1 = g1.GetCurveGeometry() assert g1.ExportToWkt() == 'CURVEPOLYGON (CIRCULARSTRING (1.5 2.0,0.5 2.0,1.5 2.0))' ############################################################################### # Test OGR_GT_ functions def test_ogr_geom_gt_functions(): # GT_HasZ tuples = [(ogr.wkbPoint, 0), (ogr.wkbPoint25D, 1), (ogr.wkbPointM, 0), (ogr.wkbPointZM, 1), (ogr.wkbCircularString, 0), (ogr.wkbCircularStringZ, 1), (ogr.wkbCircularStringM, 0), (ogr.wkbCircularStringZM, 1)] for (gt, res) in tuples: assert ogr.GT_HasZ(gt) == res # GT_SetZ tuples = [(ogr.wkbPoint, ogr.wkbPoint25D), (ogr.wkbPoint25D, ogr.wkbPoint25D), (ogr.wkbPointM, ogr.wkbPointZM), (ogr.wkbPointZM, ogr.wkbPointZM), (ogr.wkbCircularString, ogr.wkbCircularStringZ), (ogr.wkbCircularStringZ, ogr.wkbCircularStringZ), (ogr.wkbCircularStringM, ogr.wkbCircularStringZM), (ogr.wkbCircularStringZM, ogr.wkbCircularStringZM)] for (gt, res) in tuples: assert ogr.GT_SetZ(gt) == res # GT_HasM tuples = [(ogr.wkbPoint, 0), (ogr.wkbPoint25D, 0), (ogr.wkbPointM, 1), (ogr.wkbPointZM, 1), (ogr.wkbCircularString, 0), (ogr.wkbCircularStringZ, 0), (ogr.wkbCircularStringM, 1), (ogr.wkbCircularStringZM, 1)] for (gt, res) in tuples: assert ogr.GT_HasM(gt) == res # GT_SetM tuples = [(ogr.wkbPoint, ogr.wkbPointM), (ogr.wkbPoint25D, ogr.wkbPointZM), (ogr.wkbPointM, ogr.wkbPointM), (ogr.wkbPointZM, ogr.wkbPointZM), (ogr.wkbCircularString, ogr.wkbCircularStringM), (ogr.wkbCircularStringZ, ogr.wkbCircularStringZM), (ogr.wkbCircularStringM, ogr.wkbCircularStringM), (ogr.wkbCircularStringZM, ogr.wkbCircularStringZM)] for (gt, res) in tuples: assert ogr.GT_SetM(gt) == res # OGR_GT_SetModifier tuples = [(ogr.wkbPoint, 0, 0, ogr.wkbPoint), (ogr.wkbPoint, 1, 0, ogr.wkbPoint25D), (ogr.wkbPoint, 0, 1, ogr.wkbPointM), (ogr.wkbPoint, 1, 1, ogr.wkbPointZM), (ogr.wkbPoint25D, 0, 0, ogr.wkbPoint), (ogr.wkbPoint25D, 1, 0, ogr.wkbPoint25D), (ogr.wkbPoint25D, 0, 1, ogr.wkbPointM), (ogr.wkbPoint25D, 1, 1, ogr.wkbPointZM), (ogr.wkbPointM, 0, 0, ogr.wkbPoint), (ogr.wkbPointM, 1, 0, ogr.wkbPoint25D), (ogr.wkbPointM, 0, 1, ogr.wkbPointM), (ogr.wkbPointM, 1, 1, ogr.wkbPointZM), (ogr.wkbCircularString, 1, 0, ogr.wkbCircularStringZ), (ogr.wkbCircularStringZ, 1, 0, ogr.wkbCircularStringZ), (ogr.wkbPoint, 0, 0, ogr.wkbPoint), (ogr.wkbPoint25D, 0, 0, ogr.wkbPoint), (ogr.wkbCircularString, 0, 0, ogr.wkbCircularString), (ogr.wkbCircularStringZ, 0, 0, ogr.wkbCircularString)] for (gt, modZ, modM, res) in tuples: assert ogr.GT_SetModifier(gt, modZ, modM) == res # GT_Flatten tuples = [(ogr.wkbPoint, ogr.wkbPoint), (ogr.wkbPoint25D, ogr.wkbPoint), (ogr.wkbPointM, ogr.wkbPoint), (ogr.wkbPointZM, ogr.wkbPoint), (ogr.wkbCircularString, ogr.wkbCircularString), (ogr.wkbTriangleZ, ogr.wkbTriangle), (ogr.wkbCircularStringZ, ogr.wkbCircularString), (ogr.wkbCircularStringM, ogr.wkbCircularString), (ogr.wkbCircularStringZM, ogr.wkbCircularString)] for (gt, res) in tuples: assert ogr.GT_Flatten(gt) == res # GT_IsSubClassOf tuples = [(ogr.wkbPoint, ogr.wkbPoint, 1), (ogr.wkbPoint25D, ogr.wkbPoint, 1), (ogr.wkbPoint, ogr.wkbUnknown, 1), (ogr.wkbPoint, ogr.wkbLineString, 0), (ogr.wkbPolygon, ogr.wkbCurvePolygon, 1), (ogr.wkbTriangle, ogr.wkbCurvePolygon, 1), (ogr.wkbTriangle, ogr.wkbPolygon, 1), (ogr.wkbMultiSurface, ogr.wkbGeometryCollection, 1), (ogr.wkbMultiPolygon, ogr.wkbMultiSurface, 1), (ogr.wkbMultiLineString, ogr.wkbMultiCurve, 1), (ogr.wkbUnknown, ogr.wkbUnknown, 1), (ogr.wkbUnknown, ogr.wkbPoint, 0), (ogr.wkbTIN, ogr.wkbPolyhedralSurface, 1), (ogr.wkbPolyhedralSurface, ogr.wkbTIN, 0), ] for (gt, gt2, res) in tuples: assert ogr.GT_IsSubClassOf(gt, gt2) == res # GT_IsCurve tuples = [(ogr.wkbPoint, 0), (ogr.wkbPoint25D, 0), (ogr.wkbPointM, 0), (ogr.wkbPointZM, 0), (ogr.wkbCircularString, 1), (ogr.wkbCircularStringZ, 1), (ogr.wkbLineString, 1), (ogr.wkbCompoundCurve, 1), (ogr.wkbCompoundCurveZ, 1), (ogr.wkbCompoundCurveM, 1), (ogr.wkbCompoundCurveZM, 1), (ogr.wkbCurvePolygon, 0), (ogr.wkbTriangle, 0), (ogr.wkbPolyhedralSurface, 0), (ogr.wkbTIN, 0)] for (gt, res) in tuples: assert ogr.GT_IsCurve(gt) == res # GT_IsSurface tuples = [(ogr.wkbPoint, 0), (ogr.wkbPoint25D, 0), (ogr.wkbPointM, 0), (ogr.wkbPointZM, 0), (ogr.wkbCircularString, 0), (ogr.wkbCurvePolygon, 1), (ogr.wkbCurvePolygonZ, 1), (ogr.wkbCurvePolygonM, 1), (ogr.wkbCurvePolygonZM, 1), (ogr.wkbPolygon, 1), (ogr.wkbTriangle, 1), (ogr.wkbPolyhedralSurface, 1), (ogr.wkbTIN, 1)] for (gt, res) in tuples: assert ogr.GT_IsSurface(gt) == res # GT_GetCollection tuples = [(ogr.wkbPoint, ogr.wkbMultiPoint), (ogr.wkbPoint25D, ogr.wkbMultiPoint25D), (ogr.wkbPointM, ogr.wkbMultiPointM), (ogr.wkbPointZM, ogr.wkbMultiPointZM), (ogr.wkbCircularString, ogr.wkbMultiCurve), (ogr.wkbCompoundCurve, ogr.wkbMultiCurve), (ogr.wkbCurvePolygon, ogr.wkbMultiSurface), (ogr.wkbLineString, ogr.wkbMultiLineString), (ogr.wkbPolygon, ogr.wkbMultiPolygon)] for (gt, res) in tuples: assert ogr.GT_GetCollection(gt) == res # GT_IsNonLinear tuples = [(ogr.wkbPoint, 0), (ogr.wkbPoint25D, 0), (ogr.wkbPointM, 0), (ogr.wkbPointZM, 0), (ogr.wkbCircularString, 1), (ogr.wkbCircularStringM, 1), (ogr.wkbCircularStringZ, 1), (ogr.wkbCircularStringZM, 1), (ogr.wkbCompoundCurve, 1), (ogr.wkbCurvePolygon, 1), (ogr.wkbMultiCurve, 1), (ogr.wkbMultiSurface, 1), (ogr.wkbLineString, 0), (ogr.wkbPolygon, 0), (ogr.wkbTriangle, 0)] for (gt, res) in tuples: assert ogr.GT_IsNonLinear(gt) == res # GT_GetCurve tuples = [(ogr.wkbPoint, ogr.wkbPoint), (ogr.wkbPoint25D, ogr.wkbPoint25D), (ogr.wkbPointM, ogr.wkbPointM), (ogr.wkbPointZM, ogr.wkbPointZM), (ogr.wkbCircularString, ogr.wkbCircularString), (ogr.wkbCircularStringZ, ogr.wkbCircularStringZ), (ogr.wkbCircularStringM, ogr.wkbCircularStringM), (ogr.wkbCircularStringZM, ogr.wkbCircularStringZM), (ogr.wkbCompoundCurve, ogr.wkbCompoundCurve), (ogr.wkbCurvePolygon, ogr.wkbCurvePolygon), (ogr.wkbLineString, ogr.wkbCompoundCurve), (ogr.wkbPolygon, ogr.wkbCurvePolygon), (ogr.wkbMultiLineString, ogr.wkbMultiCurve), (ogr.wkbMultiPolygon, ogr.wkbMultiSurface), (ogr.wkbMultiCurve, ogr.wkbMultiCurve), (ogr.wkbMultiSurface, ogr.wkbMultiSurface)] for (gt, res) in tuples: assert ogr.GT_GetCurve(gt) == res # GT_GetLinear tuples = [(ogr.wkbPoint, ogr.wkbPoint), (ogr.wkbPoint25D, ogr.wkbPoint25D), (ogr.wkbPointM, ogr.wkbPointM), (ogr.wkbPointZM, ogr.wkbPointZM), (ogr.wkbCircularString, ogr.wkbLineString), (ogr.wkbCircularStringM, ogr.wkbLineStringM), (ogr.wkbCircularStringZ, ogr.wkbLineString25D), (ogr.wkbCircularStringZM, ogr.wkbLineStringZM), (ogr.wkbCompoundCurve, ogr.wkbLineString), (ogr.wkbCurvePolygon, ogr.wkbPolygon), (ogr.wkbLineString, ogr.wkbLineString), (ogr.wkbPolygon, ogr.wkbPolygon), (ogr.wkbMultiLineString, ogr.wkbMultiLineString), (ogr.wkbMultiPolygon, ogr.wkbMultiPolygon), (ogr.wkbMultiCurve, ogr.wkbMultiLineString), (ogr.wkbMultiSurface, ogr.wkbMultiPolygon)] for (gt, res) in tuples: assert ogr.GT_GetLinear(gt) == res ############################################################################### # Limit cases def test_ogr_geom_api_limit_tests(): p = ogr.Geometry(ogr.wkbPoint) lyr = ogr.Geometry(ogr.wkbLineString) poly = ogr.Geometry(ogr.wkbPolygon) with gdaltest.error_handler(): p.GetX(1) p.GetY(1) p.GetZ(1) lyr.GetX(1) lyr.GetY(1) lyr.GetZ(1) poly.GetX() poly.GetY() poly.GetZ() poly.GetPoints() p.GetPoint(1) lyr.GetPoint(1) poly.GetPoint(1) p.SetPoint(1, 0, 0) lyr.SetPoint(-1, 0, 0) poly.SetPoint(0, 0, 0) p.SetPoint_2D(1, 0, 0) lyr.SetPoint_2D(-1, 0, 0) poly.SetPoint_2D(0, 0, 0) poly.AddPoint(0, 0) poly.AddPoint_2D(0, 0) p.GetGeometryRef(1) p.AddGeometry(p) p.AddGeometryDirectly(p) ############################################################################### # Test Equals def test_ogr_geom_equals(): p_empty = ogr.Geometry(ogr.wkbPoint) p_0 = ogr.CreateGeometryFromWkt('POINT (0 0)') p_1 = ogr.CreateGeometryFromWkt('POINT (1 1)') assert p_empty.Equals(p_empty) assert p_0.Equals(p_0) assert p_0.Equals(p_0.Clone()) assert not p_empty.Equals(p_0) assert not p_0.Equals(p_empty) assert not p_0.Equals(p_1) l_empty = ogr.Geometry(ogr.wkbLineString) l_0_1 = ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1)') l_0_1_2 = ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 2)') assert l_0_1.Equals(l_0_1) assert l_0_1.Equals(l_0_1.Clone()) assert not l_empty.Equals(l_0_1) assert not l_0_1.Equals(l_empty) assert not l_0_1.Equals(l_0_1_2) gc_empty = ogr.Geometry(ogr.wkbGeometryCollection) gc_p_0 = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (0 0))') gc_p_1 = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (1 1))') assert gc_empty.Equals(gc_empty) assert gc_p_0.Equals(gc_p_0) assert gc_p_0.Equals(gc_p_0.Clone()) assert not gc_empty.Equals(gc_p_0) assert not gc_p_0.Equals(gc_empty) assert not gc_p_0.Equals(gc_p_1) ############################################################################### # Test FlattenTo2D(), SetCoordinateDimension(2) and SetCoordinateDimension(3) with Measured geometries def test_ogr_geom_measured_geometries_to_2D_or_3D(): list_wkt = [['POINT M (1 2 3)', 'POINT (1 2)', 'POINT Z (1 2 0)'], ['POINT ZM (1 2 3 4)', 'POINT (1 2)', 'POINT Z (1 2 3)'], ['LINESTRING M (1 2 3)', 'LINESTRING (1 2)', 'LINESTRING Z (1 2 0)'], ['LINESTRING ZM (1 2 3 4)', 'LINESTRING (1 2)', 'LINESTRING Z (1 2 3)'], ['POLYGON M ((1 2 3))', 'POLYGON ((1 2))', 'POLYGON Z ((1 2 0))'], ['POLYGON ZM ((1 2 3 4))', 'POLYGON ((1 2))', 'POLYGON Z ((1 2 3))'], ['CIRCULARSTRING M (1 2 3,4 5 6,7 8 9)', 'CIRCULARSTRING (1 2,4 5,7 8)', 'CIRCULARSTRING Z (1 2 0,4 5 0,7 8 0)'], ['CIRCULARSTRING ZM (1 2 3 0,4 5 6 0,7 8 9 0)', 'CIRCULARSTRING (1 2,4 5,7 8)', 'CIRCULARSTRING Z (1 2 3,4 5 6,7 8 9)'], ['COMPOUNDCURVE M ((1 2 3,4 5 6))', 'COMPOUNDCURVE ((1 2,4 5))', 'COMPOUNDCURVE Z ((1 2 0,4 5 0))'], ['COMPOUNDCURVE ZM ((1 2 3 4,5 6 7 8))', 'COMPOUNDCURVE ((1 2,5 6))', 'COMPOUNDCURVE Z ((1 2 3,5 6 7))'], ['MULTIPOINT M ((1 2 3))', 'MULTIPOINT ((1 2))', 'MULTIPOINT Z ((1 2 0))'], ['MULTIPOINT ZM ((1 2 3 4))', 'MULTIPOINT ((1 2))', 'MULTIPOINT Z ((1 2 3))'], ['MULTILINESTRING M ((1 2 3))', 'MULTILINESTRING ((1 2))', 'MULTILINESTRING Z ((1 2 0))'], ['MULTILINESTRING ZM ((1 2 3 4))', 'MULTILINESTRING ((1 2))', 'MULTILINESTRING Z ((1 2 3))'], ['MULTICURVE M ((1 2 3))', 'MULTICURVE ((1 2))', 'MULTICURVE Z ((1 2 0))'], ['MULTICURVE ZM ((1 2 3 4))', 'MULTICURVE ((1 2))', 'MULTICURVE Z ((1 2 3))'], ['MULTIPOLYGON M (((1 2 3)))', 'MULTIPOLYGON (((1 2)))', 'MULTIPOLYGON Z (((1 2 0)))'], ['MULTIPOLYGON ZM (((1 2 3 4)))', 'MULTIPOLYGON (((1 2)))', 'MULTIPOLYGON Z (((1 2 3)))'], ['MULTISURFACE M (((1 2 3)))', 'MULTISURFACE (((1 2)))', 'MULTISURFACE Z (((1 2 0)))'], ['MULTISURFACE ZM (((1 2 3 4)))', 'MULTISURFACE (((1 2)))', 'MULTISURFACE Z (((1 2 3)))'], ['GEOMETRYCOLLECTION M (POINT M (1 2 3))', 'GEOMETRYCOLLECTION (POINT (1 2))', 'GEOMETRYCOLLECTION Z (POINT Z (1 2 0))'], ['GEOMETRYCOLLECTION ZM (POINT ZM (1 2 3 4))', 'GEOMETRYCOLLECTION (POINT (1 2))', 'GEOMETRYCOLLECTION Z (POINT Z (1 2 3))'], ['TRIANGLE M ((0 0 3,0 1 3,1 1 3,0 0 3))', 'TRIANGLE ((0 0,0 1,1 1,0 0))', 'TRIANGLE Z ((0 0 0,0 1 0,1 1 0,0 0 0))'], ['TRIANGLE ZM ((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4))', 'TRIANGLE ((0 0,0 1,1 1,0 0))', 'TRIANGLE Z ((0 0 3,0 1 3,1 1 3,0 0 3))'], ['POLYHEDRALSURFACE M (((0 0 3,0 1 3,1 1 3,0 0 3)))', 'POLYHEDRALSURFACE (((0 0,0 1,1 1,0 0)))', 'POLYHEDRALSURFACE Z (((0 0 0,0 1 0,1 1 0,0 0 0)))'], ['POLYHEDRALSURFACE ZM (((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)))', 'POLYHEDRALSURFACE (((0 0,0 1,1 1,0 0)))', 'POLYHEDRALSURFACE Z (((0 0 3,0 1 3,1 1 3,0 0 3)))'], ['TIN M (((0 0 3,0 1 3,1 1 3,0 0 3)))', 'TIN (((0 0,0 1,1 1,0 0)))', 'TIN Z (((0 0 0,0 1 0,1 1 0,0 0 0)))'], ['TIN ZM (((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)))', 'TIN (((0 0,0 1,1 1,0 0)))', 'TIN Z (((0 0 3,0 1 3,1 1 3,0 0 3)))'], ] for (before, after_2D, after_3D) in list_wkt: geom = ogr.CreateGeometryFromWkt(before) wkb = geom.ExportToIsoWkb() geom2 = ogr.CreateGeometryFromWkb(wkb) if not geom.Equals(geom2): print(before) pytest.fail(geom2.ExportToIsoWkt()) geom = ogr.CreateGeometryFromWkt(before) geom.FlattenTo2D() assert geom.ExportToIsoWkt() == after_2D, before geom = ogr.CreateGeometryFromWkt(before) geom.SetCoordinateDimension(2) assert geom.ExportToIsoWkt() == after_2D, before geom = ogr.CreateGeometryFromWkt(before) geom.SetCoordinateDimension(3) assert geom.ExportToIsoWkt() == after_3D, before # Test no-op geom = ogr.CreateGeometryFromWkt(before) geom.Set3D(geom.Is3D()) geom.SetMeasured(geom.IsMeasured()) assert geom.ExportToIsoWkt() == before assert ogr.CreateGeometryFromWkt('POINT (1 2)').CoordinateDimension() == 2 assert ogr.CreateGeometryFromWkt('POINT M (1 2 3)').CoordinateDimension() == 3 assert ogr.CreateGeometryFromWkt('POINT Z (1 2 3)').CoordinateDimension() == 3 assert ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 4)').CoordinateDimension() == 4 # Unrelated test. Test old-style unqualified non-bracketted ZM import g = ogr.CreateGeometryFromWkt('MULTIPOINT (1 2 3 4)') assert g.ExportToIsoWkt() == 'MULTIPOINT ZM ((1 2 3 4))' ############################################################################### # Test PostGIS EWKT with XYM def test_ogr_geom_postgis_ewkt_xym(): list_wkt = [['POINTM(1 2 3)', 'POINT M (1 2 3)'], ['GEOMETRYCOLLECTIONM(POINTM(1 2 3))', 'GEOMETRYCOLLECTION M (POINT M (1 2 3))'], ] for (before, after) in list_wkt: geom = ogr.CreateGeometryFromWkt(before) assert geom.ExportToIsoWkt() == after, before ############################################################################### # Test ogr.wkbCurve / ogr.wkbSurface def test_ogr_geom_curve_surface(): tests = [[ogr.wkbCurve, "Curve"], [ogr.wkbCurveZ, "3D Curve"], [ogr.wkbCurveM, "Measured Curve"], [ogr.wkbCurveZM, "3D Measured Curve"], [ogr.wkbSurface, "Surface"], [ogr.wkbSurfaceZ, "3D Surface"], [ogr.wkbSurfaceM, "Measured Surface"], [ogr.wkbSurfaceZM, "3D Measured Surface"]] for (wkb_type, name) in tests: assert ogr.GeometryTypeToName(wkb_type) == name ############################################################################### # Test importing corrupted WKB def test_ogr_geom_import_corrupted_wkb(): list_wkt = ['POINT ZM (1 2 3 4)' 'LINESTRING ZM (1 2 3 4)' 'POLYGON ZM ((1 2 3 4))' 'CIRCULARSTRING ZM (1 2 3 0,4 5 6 0,7 8 9 0)', 'COMPOUNDCURVE ZM ((1 2 3 4,5 6 7 8))', 'MULTIPOINT ZM ((1 2 3 4))', 'MULTILINESTRING ZM ((1 2 3 4))', 'MULTICURVE ZM ((1 2 3 4))', 'MULTIPOLYGON ZM (((1 2 3 4)))', 'MULTISURFACE ZM (((1 2 3 4)))', 'GEOMETRYCOLLECTION ZM (POINT ZM (1 2 3 4))', 'TRIANGLE ZM ((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4))', 'POLYHEDRALSURFACE ZM (((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)),((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)))', 'TIN ZM (((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)),((0 0 3 4,0 1 3 4,1 1 3 4,0 0 3 4)))', ] for wkt in list_wkt: g = ogr.CreateGeometryFromWkt(wkt) wkb = bytearray(g.ExportToWkb()) # Test altering the WKB for i, _ in enumerate(wkb): for method in range(4 + 4 + 4 + 1): init_val = wkb[i] if method < 4: wkb[i] = method elif method < 8: wkb[i] = 255 - (method - 4) elif method < 12: wkb[i] = 127 + 2 - (method - 8) else: wkb[i] = 255 - wkb[i] with gdaltest.error_handler(): if sys.version_info >= (3, 0, 0): g = ogr.CreateGeometryFromWkb(bytes(wkb)) else: g = ogr.CreateGeometryFromWkb(str(wkb)) if g: g2 = ogr.CreateGeometryFromWkb(g.ExportToIsoWkb()) assert g.Equals(g2), (wkt, i, method) wkb[i] = init_val # Test truncation of the WKB for i in range(len(wkb)): with gdaltest.error_handler(): if sys.version_info >= (3, 0, 0): g = ogr.CreateGeometryFromWkb(bytes(wkb[0:i])) else: g = ogr.CreateGeometryFromWkb(str(wkb[0:i])) assert g is None, (wkt, i) ############################################################################### # Test conversions from/into triangle, TIN, PS def test_ogr_geom_triangle_ps_tin_conversion(): wkts = ["TRIANGLE ((0 0,0 1,1 1,0 0))", "POLYGON ((0 0,0 1,1 1,0 0))", "CURVEPOLYGON ((0 0,0 1,1 1,0 0))", "MULTIPOLYGON (((0 0,0 1,1 1,0 0)))", "MULTISURFACE (((0 0,0 1,1 1,0 0)))", "TIN (((0 0,0 1,1 1,0 0)))", "POLYHEDRALSURFACE (((0 0,0 1,1 1,0 0)))"] for wkt in wkts: for wkt_target in wkts: # print(wkt, wkt_target) g = ogr.CreateGeometryFromWkt(wkt) g2 = ogr.CreateGeometryFromWkt(wkt_target) got_wkt = ogr.ForceTo(g, g2.GetGeometryType()).ExportToWkt() if not (g.GetGeometryType() in [ogr.wkbTriangle, ogr.wkbTIN, ogr.wkbPolyhedralSurface] or g2.GetGeometryType() in [ogr.wkbTriangle, ogr.wkbTIN, ogr.wkbPolyhedralSurface]): continue wkt_expected = wkt_target if (g.GetGeometryType() == ogr.wkbTIN or g.GetGeometryType() == ogr.wkbPolyhedralSurface) and g2.GetGeometryType() == ogr.wkbCurvePolygon: wkt_expected = wkt assert got_wkt == wkt_expected, (wkt, wkt_target, got_wkt, wkt_expected) g = ogr.ForceTo(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))'), ogr.wkbTriangle) assert g.GetGeometryType() == ogr.wkbPolygon, g.ExportToWkt() g = ogr.ForceTo(ogr.CreateGeometryFromWkt('POLYHEDRALSURFACE (((0 0,0 1,1 1,1 0,0 0)))'), ogr.wkbTIN) assert g.GetGeometryType() == ogr.wkbPolyhedralSurface, g.ExportToWkt() g = ogr.ForceTo(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POLYHEDRALSURFACE (((0 0,0 1,1 1,1 0,0 0))))'), ogr.wkbMultiPolygon) assert g.ExportToWkt() == 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))' g = ogr.ForceTo(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (TRIANGLE ((0 0,0 1,1 1,0 0)))'), ogr.wkbMultiPolygon) assert g.ExportToWkt() == 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))' g = ogr.ForceTo(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))'), ogr.wkbGeometryCollection) assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))' g = ogr.ForceTo(ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,0 1,1 1,0 0))'), ogr.wkbGeometryCollection) assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (TRIANGLE ((0 0,0 1,1 1,0 0)))' g = ogr.ForceTo(ogr.CreateGeometryFromWkt('TIN (((0 0,0 1,1 1,0 0)))'), ogr.wkbGeometryCollection) assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))' g = ogr.ForceTo(ogr.CreateGeometryFromWkt('POLYHEDRALSURFACE (((0 0,0 1,1 1,0 0)))'), ogr.wkbGeometryCollection) assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))' ############################################################################### def test_ogr_geom_multipoint_envelope_bug(): g = ogr.CreateGeometryFromWkt('MULTIPOINT(0 0,1 1)') minx, maxx, miny, maxy = g.GetEnvelope() assert (minx, maxx, miny, maxy) == (0, 1, 0, 1) g = ogr.CreateGeometryFromWkt('MULTIPOINT(0 0 0,1 1 1)') minx, maxx, miny, maxy, minz, maxz = g.GetEnvelope3D() assert (minx, maxx, miny, maxy, minz, maxz) == (0, 1, 0, 1, 0, 1) ############################################################################### def test_ogr_geom_polygon_empty_ring(): g = ogr.Geometry(ogr.wkbPolygon) g2 = ogr.Geometry(ogr.wkbLinearRing) g.AddGeometryDirectly(g2) assert g.IsEmpty() ############################################################################### def test_ogr_geom_polygon_intersects_point(): if not ogrtest.have_geos(): pytest.skip() poly = ogr.CreateGeometryFromWkt('POLYGON((0 0,5 5,10 0,0 0))') point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(10, 0) assert poly.Intersects(point) == 1 assert poly.Contains(point) == 0 ############################################################################### # Test fix for #7128 def test_ogr_geom_geometrycollection(): wkt_list = ['GEOMETRYCOLLECTION (POINT EMPTY)', 'GEOMETRYCOLLECTION (LINESTRING EMPTY)', 'GEOMETRYCOLLECTION (POLYGON EMPTY)', 'GEOMETRYCOLLECTION (MULTIPOINT EMPTY)', 'GEOMETRYCOLLECTION (MULTILINESTRING EMPTY)', 'GEOMETRYCOLLECTION (MULTIPOLYGON EMPTY)', 'GEOMETRYCOLLECTION (GEOMETRYCOLLECTION EMPTY)', 'GEOMETRYCOLLECTION (CIRCULARSTRING EMPTY)', 'GEOMETRYCOLLECTION (COMPOUNDCURVE EMPTY)', 'GEOMETRYCOLLECTION (CURVEPOLYGON EMPTY)', 'GEOMETRYCOLLECTION (MULTICURVE EMPTY)', 'GEOMETRYCOLLECTION (MULTISURFACE EMPTY)', 'GEOMETRYCOLLECTION (TRIANGLE EMPTY)', 'GEOMETRYCOLLECTION (POLYHEDRALSURFACE EMPTY)', 'GEOMETRYCOLLECTION (TIN EMPTY)'] for wkt in wkt_list: g = ogr.CreateGeometryFromWkt(wkt) assert g.ExportToWkt() == wkt ############################################################################### # Test fix for #7126 def test_ogr_geom_assignspatialref(): g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POLYGON((0 0,0 1,1 1,0 0)),COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0)),POLYHEDRALSURFACE(((0 0,0 1,1 1,0 0))))') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) g.AssignSpatialReference(sr) assert g.GetGeometryRef(0).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() assert g.GetGeometryRef(0).GetGeometryRef(0).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() assert g.GetGeometryRef(1).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() assert g.GetGeometryRef(1).GetGeometryRef(0).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() assert g.GetGeometryRef(2).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() assert g.GetGeometryRef(2).GetGeometryRef(0).GetSpatialReference().ExportToWkt() == sr.ExportToWkt() ############################################################################### def test_ogr_geom_swapxy(): g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(1 2,2 3),POLYGON((0 0,0 1,1 1,0 0)),COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,2 0)),POLYHEDRALSURFACE(((0 0,0 1,1 1,0 0))))') g.SwapXY() assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (2 1),LINESTRING (2 1,3 2),POLYGON ((0 0,1 0,1 1,0 0)),COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,0 2)),POLYHEDRALSURFACE (((0 0,1 0,1 1,0 0))))' ############################################################################### def test_ogr_geom_remove_geometry(): # With GEOMETRYCOLLECTION g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,2 3),POINT (3 4))') assert not (g.RemoveGeometry(3) == 0 or g.RemoveGeometry(-2) == 0) assert g.RemoveGeometry(1) == 0 assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (1 2),POINT (3 4))' assert g.RemoveGeometry(1) == 0 assert g.ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (1 2))' assert g.RemoveGeometry(0) == 0 assert g.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,2 3),POINT (3 4))') assert g.RemoveGeometry(-1) == 0 assert g.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' # With POLYHEDRALSURFACE/TIN g = ogr.CreateGeometryFromWkt('TIN (((0 0,0 1,1 1,0 0)),((0 0,1 0,1 1,0 0)))') assert not (g.RemoveGeometry(2) == 0 or g.RemoveGeometry(-2) == 0) assert g.RemoveGeometry(1) == 0 assert g.ExportToWkt() == 'TIN (((0 0,0 1,1 1,0 0)))' assert g.RemoveGeometry(0) == 0 assert g.ExportToWkt() == 'TIN EMPTY' g = ogr.CreateGeometryFromWkt('TIN (((0 0,0 1,1 1,0 0)),((0 0,1 0,1 1,0 0)))') assert g.RemoveGeometry(-1) == 0 assert g.ExportToWkt() == 'TIN EMPTY' # With POLYGON g = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,1 1))') assert not (g.RemoveGeometry(2) == 0 or g.RemoveGeometry(-2) == 0) assert g.RemoveGeometry(1) == 0 assert g.ExportToWkt() == 'POLYGON ((0 0,0 10,10 10,10 0,0 0))' assert g.RemoveGeometry(0) == 0 assert g.ExportToWkt() == 'POLYGON EMPTY' g = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 10,10 10,10 0,0 0),(1 1,1 9,9 9,1 1))') assert g.RemoveGeometry(-1) == 0 assert g.ExportToWkt() == 'POLYGON EMPTY' # Unsupported type g = ogr.CreateGeometryFromWkt('POINT (0 0)') assert g.RemoveGeometry(0) != 0 ############################################################################### def test_ogr_geom_sfcgal(): if not ogrtest.have_sfcgal(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('TIN EMPTY') g2_poly = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))') g2 = g2_poly.GetGeometryRef(0) g1.Distance(g2) g2 = ogr.CreateGeometryFromWkt('CIRCULARSTRING EMPTY') g1.Distance(g2) g2 = ogr.CreateGeometryFromWkt('CURVEPOLYGON EMPTY') g1.Distance(g2) ############################################################################### def test_ogr_geom_cannot_add_triangle_to_multisurface(): g = ogr.Geometry(ogr.wkbMultiSurface) assert g.AddGeometry(ogr.Geometry(ogr.wkbTriangle)) != 0 ############################################################################### def test_ogr_geom_force_polygonzm_to_linestring(): g = ogr.CreateGeometryFromWkt('POLYGON ZM ((0 0 10 20,0 1 30 40,1 1 50 60,0 0 10 70))') wkt = ogr.ForceToLineString(g).ExportToIsoWkt() assert wkt == 'LINESTRING ZM (0 0 10 20,0 1 30 40,1 1 50 60,0 0 10 70)' ############################################################################### def test_ogr_geom_force_polygonzm_to_multilinestring(): g = ogr.CreateGeometryFromWkt('POLYGON ZM ((0 0 10 20,0 1 30 40,1 1 50 60,0 0 10 70))') wkt = ogr.ForceToMultiLineString(g).ExportToIsoWkt() assert wkt == 'MULTILINESTRING ZM ((0 0 10 20,0 1 30 40,1 1 50 60,0 0 10 70))' ############################################################################### def test_ogr_geom_create_from_wkt_polyhedrasurface(): g = ogr.CreateGeometryFromWkt('POLYHEDRALSURFACE (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)))') assert g.ExportToWkt() == 'POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)))' ############################################################################### def test_ogr_geom_makevalid(): if not ogrtest.have_geos(): pytest.skip() g = ogr.CreateGeometryFromWkt('POINT (0 0)') g = g.MakeValid() assert g is None or g.ExportToWkt() == 'POINT (0 0)' g = ogr.CreateGeometryFromWkt('POINT EMPTY') g = g.MakeValid() assert g is None or g.ExportToWkt() == 'POINT EMPTY' g = ogr.CreateGeometryFromWkt('LINESTRING (0 0)') with gdaltest.error_handler(): g = g.MakeValid() assert not g g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,0 1,1 0,0 0))') g = g.MakeValid() assert g is None or g.ExportToWkt() == 'CURVEPOLYGON ((0 0,0 1,1 0,0 0))' # Invalid g = ogr.CreateGeometryFromWkt('POLYGON ((0 0,10 10,0 10,10 0,0 0))') g = g.MakeValid() assert g is None or g.ExportToWkt() == 'MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))' # Invalid g = ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,10 10,0 10,10 0,0 0))') g = g.MakeValid() assert g is None or g.ExportToWkt() == 'MULTIPOLYGON (((0 0,5 5,10 0,0 0)),((5 5,0 10,10 10,5 5)))' return 'success' ############################################################################### def test_ogr_geom_force_multipolygon_z_to_compound_curve(): g = ogr.CreateGeometryFromWkt('MULTIPOLYGON Z (((0 0 0,0 1 0,1 1 0,0 0 0)))') g = ogr.ForceTo(g, ogr.wkbCompoundCurve) assert g.ExportToIsoWkt() == 'COMPOUNDCURVE Z ((0 0 0,0 1 0,1 1 0,0 0 0))' gdalautotest-3.0.4/ogr/ogr_index_test.py0000755003401500001440000003236313614005325020017 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_index_test.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR INDEX support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2010-2012, Even Rouault # # 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. ############################################################################### import os import gdaltest from osgeo import ogr import ogrtest import pytest ############################################################################### # Create a MIF file to be our primary table. def test_ogr_index_1(): from osgeo import gdal gdal.PushErrorHandler('CPLQuietErrorHandler') try: ogr.GetDriverByName('MapInfo File').DeleteDataSource('index_p.mif') except AttributeError: pass try: ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('join_t.dbf') except AttributeError: pass gdal.PopErrorHandler() drv = ogr.GetDriverByName('MapInfo File') gdaltest.p_ds = drv.CreateDataSource('index_p.mif') gdaltest.p_lyr = gdaltest.p_ds.CreateLayer('index_p') ogrtest.quick_create_layer_def(gdaltest.p_lyr, [('PKEY', ogr.OFTInteger)]) ogrtest.quick_create_feature(gdaltest.p_lyr, [5], None) ogrtest.quick_create_feature(gdaltest.p_lyr, [10], None) ogrtest.quick_create_feature(gdaltest.p_lyr, [9], None) ogrtest.quick_create_feature(gdaltest.p_lyr, [4], None) ogrtest.quick_create_feature(gdaltest.p_lyr, [3], None) ogrtest.quick_create_feature(gdaltest.p_lyr, [1], None) # It turns out mapinfo format doesn't allow GetFeatureCount() calls while # writing ... it just blows an assert! # if gdaltest.p_lyr.GetFeatureCount() != 7: # gdaltest.post_reason( 'FeatureCount wrong' ) # return 'fail' # Close and reopen, since it seems the .mif driver does not allow reading # from a newly created (updatable) file. gdaltest.p_ds = None gdaltest.p_ds = ogr.OpenShared('index_p.mif', update=0) gdaltest.p_lyr = gdaltest.p_ds.GetLayerByName('index_p') ############################################################################### # Create a dbf file to be our secondary table. Close it, and reopen shared. def test_ogr_index_2(): drv = ogr.GetDriverByName('ESRI Shapefile') gdaltest.s_ds = drv.CreateDataSource('join_t.dbf') gdaltest.s_lyr = gdaltest.s_ds.CreateLayer('join_t', geom_type=ogr.wkbNone) ogrtest.quick_create_layer_def(gdaltest.s_lyr, [('SKEY', ogr.OFTInteger), ('VALUE', ogr.OFTString, 16)]) for i in range(20): ogrtest.quick_create_feature(gdaltest.s_lyr, [i, 'Value ' + str(i)], None) assert gdaltest.s_lyr.GetFeatureCount() == 20, 'FeatureCount wrong' gdaltest.s_ds.Release() gdaltest.s_lyr = None gdaltest.s_ds = None gdaltest.s_ds = ogr.OpenShared('join_t.dbf', update=1) gdaltest.s_lyr = gdaltest.s_ds.GetLayerByName('join_t') ############################################################################### # Verify a simple join without indexing. def test_ogr_index_3(): expect = ['Value 5', 'Value 10', 'Value 9', 'Value 4', 'Value 3', 'Value 1'] sql_lyr = gdaltest.p_ds.ExecuteSQL( 'SELECT * FROM index_p p ' + 'LEFT JOIN "join_t.dbf".join_t j ON p.PKEY = j.SKEY ') tr = ogrtest.check_features_against_list(sql_lyr, 'VALUE', expect) gdaltest.p_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Create an INDEX on the SKEY and VALUE field in the join table. def test_ogr_index_4(): gdaltest.s_ds.ExecuteSQL('CREATE INDEX ON join_t USING value') gdaltest.s_ds.ExecuteSQL('CREATE INDEX ON join_t USING skey') ############################################################################### # Check that indexable single int lookup works. def test_ogr_index_5(): gdaltest.s_lyr.SetAttributeFilter('SKEY = 5') expect = ['Value 5'] tr = ogrtest.check_features_against_list(gdaltest.s_lyr, 'VALUE', expect) assert tr ############################################################################### # Check that indexable single string lookup works. # # We also close the datasource and reopen to ensure that reloaded indexes # work OK too. def test_ogr_index_6(): gdaltest.s_ds.Release() gdaltest.s_ds = ogr.OpenShared('join_t.dbf', update=1) gdaltest.s_lyr = gdaltest.s_ds.GetLayerByName('join_t') gdaltest.s_lyr.SetAttributeFilter("VALUE='Value 5'") expect = [5] tr = ogrtest.check_features_against_list(gdaltest.s_lyr, 'SKEY', expect) assert tr ############################################################################### # Check that range query that isn't currently implemented using index works. def test_ogr_index_7(): gdaltest.s_lyr.SetAttributeFilter('SKEY < 3') expect = [0, 1, 2] tr = ogrtest.check_features_against_list(gdaltest.s_lyr, 'SKEY', expect) assert tr ############################################################################### # Try join again. def test_ogr_index_8(): expect = ['Value 5', 'Value 10', 'Value 9', 'Value 4', 'Value 3', 'Value 1'] sql_lyr = gdaltest.p_ds.ExecuteSQL( 'SELECT * FROM index_p p ' + 'LEFT JOIN "join_t.dbf".join_t j ON p.PKEY = j.SKEY ') tr = ogrtest.check_features_against_list(sql_lyr, 'VALUE', expect) gdaltest.p_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that dropping both indexes gets rid of them, and that results still # work. def test_ogr_index_9(): gdaltest.s_ds.ExecuteSQL('DROP INDEX ON join_t USING value') gdaltest.s_ds.ExecuteSQL('DROP INDEX ON join_t USING skey') gdaltest.s_lyr.SetAttributeFilter('SKEY = 5') expect = ['Value 5'] tr = ogrtest.check_features_against_list(gdaltest.s_lyr, 'VALUE', expect) assert tr gdaltest.s_ds.Release() # After dataset closing, check that the index files do not exist after # dropping the index for filename in ['join_t.idm', 'join_t.ind']: assert not os.path.exists(filename) # Re-create an index gdaltest.s_ds = ogr.OpenShared('join_t.dbf', update=1) gdaltest.s_ds.ExecuteSQL('CREATE INDEX ON join_t USING value') gdaltest.s_ds.Release() for filename in ['join_t.idm', 'join_t.ind']: try: os.stat(filename) except OSError: pytest.fail("%s should exist" % filename) f = open('join_t.idm', 'rt') xml = f.read() f.close() assert xml.find('VALUE') != -1, 'VALUE column is not indexed (1)' # Close the dataset and re-open gdaltest.s_ds = ogr.OpenShared('join_t.dbf', update=1) # At this point the .ind was opened in read-only. Now it # will be re-opened in read-write mode gdaltest.s_ds.ExecuteSQL('CREATE INDEX ON join_t USING skey') gdaltest.s_ds.Release() f = open('join_t.idm', 'rt') xml = f.read() f.close() assert xml.find('VALUE') != -1, 'VALUE column is not indexed (2)' assert xml.find('SKEY') != -1, 'SKEY column is not indexed (2)' ############################################################################### # Test fix for #4326 def test_ogr_index_10(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_index_10.shp') lyr = ds.CreateLayer('ogr_index_10') lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(1, 1) feat.SetField(2, "foo") lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('create index on ogr_index_10 using intfield') ds.ExecuteSQL('create index on ogr_index_10 using realfield') lyr.SetAttributeFilter('intfield IN (1)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('intfield = 1') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('intfield IN (2)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None lyr.SetAttributeFilter('intfield IN (1.0)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('intfield = 1.0') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('intfield IN (1.1)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None lyr.SetAttributeFilter("intfield IN ('1')") lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('realfield IN (1.0)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('realfield = 1.0') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('realfield IN (1.1)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None lyr.SetAttributeFilter('realfield IN (1)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('realfield = 1') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter('realfield IN (2)') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None lyr.SetAttributeFilter("realfield IN ('1')") lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter("strfield IN ('foo')") lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter("strfield = 'foo'") lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr.SetAttributeFilter("strfield IN ('bar')") lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None ds = None ############################################################################### # Test support for OR and AND expression def ogr_index_11_check(lyr, expected_fids): lyr.ResetReading() for expected_fid in expected_fids: feat = lyr.GetNextFeature() assert feat is not None assert feat.GetFID() == expected_fid def test_ogr_index_11(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_index_11.dbf') lyr = ds.CreateLayer('ogr_index_11', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) ogrtest.quick_create_feature(lyr, [1, "foo"], None) ogrtest.quick_create_feature(lyr, [1, "bar"], None) ogrtest.quick_create_feature(lyr, [2, "foo"], None) ogrtest.quick_create_feature(lyr, [2, "bar"], None) ogrtest.quick_create_feature(lyr, [3, "bar"], None) ds.ExecuteSQL('CREATE INDEX ON ogr_index_11 USING intfield') ds.ExecuteSQL('CREATE INDEX ON ogr_index_11 USING strfield') lyr.SetAttributeFilter("intfield = 1 OR strfield = 'bar'") ogr_index_11_check(lyr, [0, 1, 3]) lyr.SetAttributeFilter("intfield = 1 AND strfield = 'bar'") ogr_index_11_check(lyr, [1]) lyr.SetAttributeFilter("intfield = 1 AND strfield = 'foo'") ogr_index_11_check(lyr, [0]) lyr.SetAttributeFilter("intfield = 3 AND strfield = 'foo'") ogr_index_11_check(lyr, []) lyr.SetAttributeFilter("intfield IN (1, 2, 3)") ogr_index_11_check(lyr, [0, 1, 2, 3, 4]) ds = None ############################################################################### def test_ogr_index_cleanup(): try: gdaltest.p_ds.Release() except: pass gdaltest.p_ds = None gdaltest.s_ds = None gdaltest.p_lyr = None gdaltest.s_lyr = None ogr.GetDriverByName('MapInfo File').DeleteDataSource('index_p.mif') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('join_t.dbf') for filename in ['join_t.idm', 'join_t.ind']: assert not os.path.exists(filename) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource( 'tmp/ogr_index_10.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource( 'tmp/ogr_index_11.dbf') gdalautotest-3.0.4/ogr/ogr_factory.py0000755003401500001440000007411613614005325017322 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_factory.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test some geometry factory methods, like arc stroking. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2008, Frank Warmerdam # Copyright (c) 2010-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 ogrtest from osgeo import gdal from osgeo import ogr import pytest def save_as_csv(geom, filename): csv = 'ID,WKT\n0,"%s"\n' % geom.ExportToWkt() open('/home/warmerda/' + filename, 'w').write(csv) ############################################################################### # 30 degree rotated ellipse, just one quarter. def test_ogr_factory_1(): geom = ogr.ApproximateArcAngles(20, 30, 40, 7, 3.5, 30.0, 270.0, 360.0, 6.0) expected_geom = 'LINESTRING (21.75 33.031088913245533 40,22.374083449152831 32.648634669593925 40,22.972155943227843 32.237161430239802 40,23.537664874825239 31.801177382099848 40,24.064414409750082 31.345459257641004 40,24.546633369868303 30.875 40,24.979038463342047 30.394954059253475 40,25.356892169480634 29.910580919184319 40,25.676054644008637 29.427187473276717 40,25.933029076066084 28.95006988128063 40,26.125 28.484455543377237 40,26.249864142195264 28.035445827688662 40,26.306253464980482 27.607960178621322 40,26.293550155134998 27.206682218403525 40,26.211893392779814 26.836008432340218 40,26.062177826491073 26.5 40)' assert not ogrtest.check_feature_geometry(geom, expected_geom) ############################################################################### # Test forceToPolygon() def test_ogr_factory_2(): src_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))' exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTISURFACE (((0 0,100 0,100 100,0 0)))' exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'CURVEPOLYGON ((0 0,100 0,100 100,0 0))' exp_wkt = 'POLYGON((0 0,100 0,100 100,0 0))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'CURVEPOLYGON (CIRCULARSTRING(0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))' exp_wkt = 'POLYGON ((0 0,0 1,0 2,1 2,2 2,2 1,2 0,1 0,0 0))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() ############################################################################### # Test forceToMultiPolygon() def test_ogr_factory_3(): src_wkt = 'POLYGON((0 0,100 0,100 100,0 0))' exp_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'GEOMETRYCOLLECTION(POLYGON((0 0,100 0,100 100,0 0)))' exp_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'CURVEPOLYGON ((0 0,100 0,100 100,0 0))' exp_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTISURFACE (((0 0,100 0,100 100,0 0)))' exp_wkt = 'MULTIPOLYGON (((0 0,100 0,100 100,0 0)))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPolygon(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() ############################################################################### # Test forceToMultiPoint() def test_ogr_factory_4(): src_wkt = 'POINT(2 5 3)' exp_wkt = 'MULTIPOINT(2 5 3)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPoint(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'GEOMETRYCOLLECTION(POINT(2 5 3),POINT(4 5 5))' exp_wkt = 'MULTIPOINT(2 5 3,4 5 5)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiPoint(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() ############################################################################### # Test forceToMultiLineString() def test_ogr_factory_5(): src_wkt = 'LINESTRING(2 5,10 20)' exp_wkt = 'MULTILINESTRING((2 5,10 20))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'GEOMETRYCOLLECTION(LINESTRING(2 5,10 20),LINESTRING(0 0,10 10))' exp_wkt = 'MULTILINESTRING((2 5,10 20),(0 0,10 10))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'POLYGON((2 5,10 20),(0 0,10 10))' exp_wkt = 'MULTILINESTRING((2 5,10 20),(0 0,10 10))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTIPOLYGON(((2 5,10 20),(0 0,10 10)),((2 5,10 20)))' exp_wkt = 'MULTILINESTRING((2 5,10 20),(0 0,10 10),(2 5,10 20))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToMultiLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() ############################################################################### # Test robustness of forceToXXX() primitives with various inputs (#3504) def test_ogr_factory_6(): src_wkt_list = [None, 'POINT EMPTY', 'LINESTRING EMPTY', 'POLYGON EMPTY', 'MULTIPOINT EMPTY', 'MULTILINESTRING EMPTY', 'MULTIPOLYGON EMPTY', 'GEOMETRYCOLLECTION EMPTY', 'POINT(0 0)', 'LINESTRING(0 0)', 'POLYGON((0 0))', 'POLYGON(EMPTY,(0 0),EMPTY,(1 1))', 'MULTIPOINT(EMPTY,(0 0),EMPTY,(1 1))', 'MULTILINESTRING(EMPTY,(0 0),EMPTY,(1 1))', 'MULTIPOLYGON(((0 0),EMPTY,(1 1)),EMPTY,((2 2)))', 'GEOMETRYCOLLECTION(POINT EMPTY)', 'GEOMETRYCOLLECTION(LINESTRING EMPTY)', 'GEOMETRYCOLLECTION(POLYGON EMPTY)', 'GEOMETRYCOLLECTION(MULTIPOINT EMPTY)', 'GEOMETRYCOLLECTION(MULTILINESTRING EMPTY)', 'GEOMETRYCOLLECTION(MULTIPOLYGON EMPTY)', 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY)', 'GEOMETRYCOLLECTION(POINT(0 0))', 'GEOMETRYCOLLECTION(LINESTRING(0 0),LINESTRING(1 1))', 'GEOMETRYCOLLECTION(POLYGON((0 0),EMPTY,(2 2)), POLYGON((1 1)))', 'CURVEPOLYGON EMPTY', 'CURVEPOLYGON ((0 0,0 1,1 1,1 0,0 0))', 'CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'COMPOUNDCURVE EMPTY', 'COMPOUNDCURVE ((0 0,0 1,1 1,1 0,0 0))', 'COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'CIRCULARSTRING EMPTY', 'CIRCULARSTRING (0 0,1 0,0 0)', 'MULTISURFACE EMPTY', 'MULTISURFACE (((0 0,0 1,1 1,1 0,0 0)))', 'MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,1 0,0 0)))', 'MULTICURVE EMPTY', 'MULTICURVE ((0 0,0 1))', 'MULTICURVE (COMPOUNDCURVE((0 0,0 1)))', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))', ] for src_wkt in src_wkt_list: if src_wkt is None: src_geom = None else: src_geom = ogr.CreateGeometryFromWkt(src_wkt) ogr.ForceToPolygon(src_geom) ogr.ForceToMultiPolygon(src_geom) ogr.ForceToMultiPoint(src_geom) ogr.ForceToMultiLineString(src_geom) ogr.ForceToLineString(src_geom) for target_type in range(ogr.wkbMultiSurface): gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.ForceTo(src_geom, 1 + target_type) gdal.PopErrorHandler() # print(src_geom.ExportToWkt(), dst_geom1.ExportToWkt(), dst_geom2.ExportToWkt(), dst_geom3.ExportToWkt(), dst_geom4.ExportToWkt()) ############################################################################### # Test forceToLineString() def test_ogr_factory_7(): src_wkt = 'LINESTRING(2 5,10 20)' exp_wkt = 'LINESTRING(2 5,10 20)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTILINESTRING((2 5,10 20))' exp_wkt = 'LINESTRING(2 5,10 20)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTICURVE((2 5,10 20))' exp_wkt = 'LINESTRING(2 5,10 20)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTICURVE(COMPOUNDCURVE((2 5,10 20)))' exp_wkt = 'LINESTRING(2 5,10 20)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTILINESTRING((2 5,10 20),(3 4,30 40))' exp_wkt = 'MULTILINESTRING((2 5,10 20),(3 4,30 40))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTILINESTRING((2 5,10 20),(10 20,30 40))' exp_wkt = 'LINESTRING (2 5,10 20,30 40)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'GEOMETRYCOLLECTION(LINESTRING(2 5,10 20),LINESTRING(10 20,30 40))' exp_wkt = 'LINESTRING (2 5,10 20,30 40)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTILINESTRING((2 5,10 20),(10 20))' exp_wkt = 'MULTILINESTRING((2 5,10 20),(10 20))' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'MULTILINESTRING((2 5,10 20),(10 20,30 40),(30 40,50 60))' exp_wkt = 'LINESTRING (2 5,10 20,30 40,50 60)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' exp_wkt = 'LINESTRING (0 0,0 1,1 1,1 0,0 0)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'CURVEPOLYGON ((0 0,0 1,1 1,1 0,0 0))' exp_wkt = 'LINESTRING (0 0,0 1,1 1,1 0,0 0)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() src_wkt = 'CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,1 0,0 0)))' exp_wkt = 'LINESTRING (0 0,0 1,1 1,1 0,0 0)' src_geom = ogr.CreateGeometryFromWkt(src_wkt) dst_geom = ogr.ForceToLineString(src_geom) assert not ogrtest.check_feature_geometry(dst_geom, exp_wkt), dst_geom.ExportToWkt() ############################################################################### # Test forceTo() def test_ogr_factory_8(): tests = [('POINT(2 5)', 'MULTIPOINT (2 5)', ogr.wkbMultiPoint), ('LINESTRING(2 5,10 20)', 'LINESTRING(2 5,10 20)', ogr.wkbLineString), ('LINESTRING(2 5,10 20)', 'COMPOUNDCURVE ((2 5,10 20))', ogr.wkbCompoundCurve), ('LINESTRING(2 5,10 20)', 'MULTILINESTRING ((2 5,10 20))', ogr.wkbMultiLineString), ('LINESTRING(2 5,10 20)', 'MULTICURVE ((2 5,10 20))', ogr.wkbMultiCurve), ('LINESTRING(2 5,10 20)', None, ogr.wkbPolygon), ('LINESTRING(2 5,10 20)', None, ogr.wkbCurvePolygon), ('LINESTRING(2 5,10 20)', None, ogr.wkbMultiSurface), ('LINESTRING(2 5,10 20)', None, ogr.wkbMultiPolygon), ('LINESTRING(0 0,0 1,1 1,0 0)', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('LINESTRING(0 0,0 1,1 1,0 0)', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('LINESTRING(0 0,0 1,1 1,0 0)', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('LINESTRING(0 0,0 1,1 1,0 0)', 'MULTISURFACE (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('LINESTRING EMPTY', 'COMPOUNDCURVE EMPTY', ogr.wkbCompoundCurve), ('LINESTRING EMPTY', 'MULTILINESTRING EMPTY', ogr.wkbMultiLineString), ('LINESTRING EMPTY', 'MULTICURVE EMPTY', ogr.wkbMultiCurve), ('MULTILINESTRING ((2 5,10 20))', 'LINESTRING(2 5,10 20)', ogr.wkbLineString), ('MULTILINESTRING ((2 5,10 20))', 'COMPOUNDCURVE ((2 5,10 20))', ogr.wkbCompoundCurve), ('MULTILINESTRING ((2 5,10 20))', 'MULTICURVE ((2 5,10 20))', ogr.wkbMultiCurve), ('MULTILINESTRING ((2 5,10 20))', None, ogr.wkbPolygon), ('MULTILINESTRING ((2 5,10 20))', None, ogr.wkbCurvePolygon), ('MULTILINESTRING ((2 5,10 20))', None, ogr.wkbMultiPolygon), ('MULTILINESTRING ((2 5,10 20))', None, ogr.wkbMultiSurface), ('MULTILINESTRING ((0 0,0 1,1 1,0 0))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('MULTILINESTRING ((0 0,0 1,1 1,0 0))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('MULTILINESTRING ((0 0,0 1,1 1,0 0))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('MULTILINESTRING ((0 0,0 1,1 1,0 0))', 'MULTISURFACE (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('MULTILINESTRING EMPTY', 'LINESTRING EMPTY', ogr.wkbLineString), ('MULTILINESTRING EMPTY', 'COMPOUNDCURVE EMPTY', ogr.wkbCompoundCurve), ('MULTILINESTRING EMPTY', 'MULTICURVE EMPTY', ogr.wkbMultiCurve), ('CIRCULARSTRING(0 0,1 0,0 0)', 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbCompoundCurve), ('CIRCULARSTRING(0 0,1 0,0 0)', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbMultiCurve), ('CIRCULARSTRING(0 0,1 0,0 0)', 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbCurvePolygon), ('CIRCULARSTRING(0 0,1 0,0 0)', 'POLYGON ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))', ogr.wkbPolygon), ('CIRCULARSTRING(0 0,1 0,0 0)', 'MULTIPOLYGON (((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)))', ogr.wkbMultiPolygon), ('CIRCULARSTRING(0 0,1 0,0 0)', 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0)))', ogr.wkbMultiSurface), ('CIRCULARSTRING(0 0,1 0,0 0)', 'LINESTRING (0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)', ogr.wkbLineString), # Degenerated case ('CIRCULARSTRING(0 0,0 0,0 0)', 'LINESTRING (0 0,0 0,0 0)', ogr.wkbLineString), ('CIRCULARSTRING(0 0,1 1,2 2)', 'LINESTRING (0 0,1 1,2 2)', ogr.wkbLineString), ('CIRCULARSTRING(0 0,1 1,2 2)', 'MULTILINESTRING ((0 0,1 1,2 2))', ogr.wkbMultiLineString), ('CIRCULARSTRING(0 0,1 1,2 2)', None, ogr.wkbPolygon), ('CIRCULARSTRING(0 0,1 1,2 2)', None, ogr.wkbCurvePolygon), ('CIRCULARSTRING(0 0,1 1,2 2)', None, ogr.wkbMultiSurface), ('CIRCULARSTRING(0 0,1 1,2 2)', None, ogr.wkbMultiPolygon), ('COMPOUNDCURVE ((2 5,10 20))', 'LINESTRING(2 5,10 20)', ogr.wkbLineString), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 1,2 2))', 'LINESTRING (0 0,1 1,2 2)', ogr.wkbLineString), ('COMPOUNDCURVE ((2 5,10 20),(10 20,30 40))', 'LINESTRING(2 5,10 20,30 40)', ogr.wkbLineString), ('COMPOUNDCURVE ((2 5,10 20),(10 20,30 40))', 'MULTILINESTRING((2 5,10 20,30 40))', ogr.wkbMultiLineString), ('COMPOUNDCURVE ((2 5,10 20),(10 20,30 40))', 'MULTICURVE (COMPOUNDCURVE ((2 5,10 20),(10 20,30 40)))', ogr.wkbMultiCurve), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0)))', ogr.wkbCurvePolygon), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'POLYGON ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))', ogr.wkbPolygon), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0))))', ogr.wkbMultiSurface), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTIPOLYGON (((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)))', ogr.wkbMultiPolygon), ('COMPOUNDCURVE (CIRCULARSTRING(0 0,1 0,0 0))', 'LINESTRING (0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)', ogr.wkbLineString), ('COMPOUNDCURVE((0 0,0 1,1 1,0 0))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('COMPOUNDCURVE((0 0,0 1,1 1,0 0))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('COMPOUNDCURVE((0 0,0 1,1 1,0 0))', 'MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE ((0 0,0 1,1 1,0 0))))', ogr.wkbMultiSurface), ('COMPOUNDCURVE((0 0,0 1,1 1,0 0))', 'CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', ogr.wkbCurvePolygon), ('POLYGON ((0 0,0 1,1 1,0 0))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('POLYGON ((0 0,0 1,1 1,0 0))', 'MULTISURFACE (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('POLYGON ((0 0,0 1,1 1,0 0))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('POLYGON ((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25))', ogr.wkbCurvePolygon), ('POLYGON ((0 0,0 1,1 1,0 0))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('POLYGON ((0 0,0 1,1 1,0 0))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'MULTILINESTRING ((0 0,0 1,1 1,0 0))', ogr.wkbMultiLineString), ('CURVEPOLYGON ((0 0,0 1,1 1,0 0))', 'MULTICURVE ((0 0,0 1,1 1,0 0))', ogr.wkbMultiCurve), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE ((0 0,0 1,1 1,0 0))))', ogr.wkbMultiSurface), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', ogr.wkbCurvePolygon), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('CURVEPOLYGON (COMPOUNDCURVE((0 0,0 1),(0 1,1 1,0 0)))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'POLYGON ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))', ogr.wkbPolygon), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTISURFACE (CURVEPOLYGON ( CIRCULARSTRING (0 0,1 0,0 0)))', ogr.wkbMultiSurface), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTIPOLYGON (((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0)))', ogr.wkbMultiPolygon), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbCompoundCurve), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbMultiCurve), ('CURVEPOLYGON (CIRCULARSTRING(0 0,1 0,0 0))', 'MULTILINESTRING ((0 0,0.116977778440514 -0.321393804843282,0.413175911166547 -0.49240387650611,0.75 -0.433012701892224,0.969846310392967 -0.171010071662835,0.969846310392967 0.171010071662835,0.75 0.433012701892224,0.413175911166547 0.49240387650611,0.116977778440514 0.321393804843282,0 0))', ogr.wkbMultiLineString), ('MULTICURVE ((2 5,10 20))', 'LINESTRING(2 5,10 20)', ogr.wkbLineString), ('MULTICURVE ((2 5,10 20))', 'COMPOUNDCURVE ((2 5,10 20))', ogr.wkbCompoundCurve), ('MULTICURVE ((2 5,10 20))', 'MULTILINESTRING ((2 5,10 20))', ogr.wkbMultiLineString), ('MULTICURVE (COMPOUNDCURVE((2 5,10 20)))', 'LINESTRING(2 5,10 20)', ogr.wkbLineString), ('MULTICURVE (COMPOUNDCURVE((2 5,10 20)))', 'COMPOUNDCURVE ((2 5,10 20))', ogr.wkbCompoundCurve), ('MULTICURVE (COMPOUNDCURVE((2 5,10 20)))', 'MULTILINESTRING ((2 5,10 20))', ogr.wkbMultiLineString), ('MULTICURVE ((0 0,0 1,1 1,0 0))', 'POLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbPolygon), ('MULTICURVE ((0 0,0 1,1 1,0 0))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('MULTICURVE ((0 0,0 1,1 1,0 0))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('MULTICURVE ((0 0,0 1,1 1,0 0))', 'MULTISURFACE (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('MULTICURVE (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('MULTICURVE (COMPOUNDCURVE((0 0,0 1,1 1,0 0)))', 'MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE ((0 0,0 1,1 1,0 0))))', ogr.wkbMultiSurface), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbUnknown), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'MULTISURFACE (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiSurface), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25))', ogr.wkbCurvePolygon), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'MULTILINESTRING ((0 0,0 1,1 1,0 0))', ogr.wkbMultiLineString), ('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', 'MULTICURVE ((0 0,0 1,1 1,0 0))', ogr.wkbMultiCurve), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('MULTISURFACE (((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25))', ogr.wkbCurvePolygon), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'MULTILINESTRING ((0 0,0 1,1 1,0 0))', ogr.wkbMultiLineString), ('MULTISURFACE (((0 0,0 1,1 1,0 0)))', 'MULTICURVE ((0 0,0 1,1 1,0 0))', ogr.wkbMultiCurve), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))', ogr.wkbMultiPolygon), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))', ogr.wkbCurvePolygon), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25)))', 'CURVEPOLYGON ((0 0,0 1,1 1,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.25 0.25))', ogr.wkbCurvePolygon), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'LINESTRING (0 0,0 1,1 1,0 0)', ogr.wkbLineString), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'COMPOUNDCURVE ((0 0,0 1,1 1,0 0))', ogr.wkbCompoundCurve), ('MULTISURFACE (CURVEPOLYGON(CIRCULARSTRING(0 0,1 0,0 0)))', 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbCompoundCurve), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'MULTILINESTRING ((0 0,0 1,1 1,0 0))', ogr.wkbMultiLineString), ('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,0 0)))', 'MULTICURVE ((0 0,0 1,1 1,0 0))', ogr.wkbMultiCurve), ('MULTISURFACE (CURVEPOLYGON(CIRCULARSTRING(0 0,1 0,0 0)))', 'MULTICURVE (CIRCULARSTRING (0 0,1 0,0 0))', ogr.wkbMultiCurve), ('MULTIPOINT (2 5)', 'POINT(2 5)', ogr.wkbPoint), ] for (src_wkt, exp_wkt, target_type) in tests: src_geom = ogr.CreateGeometryFromWkt(src_wkt) gdal.SetConfigOption('OGR_ARC_STEPSIZE', '45') dst_geom = ogr.ForceTo(src_geom, target_type) gdal.SetConfigOption('OGR_ARC_STEPSIZE', None) if exp_wkt is None: exp_wkt = src_wkt elif target_type != ogr.wkbUnknown and dst_geom.GetGeometryType() != target_type: print(target_type) print(dst_geom.ExportToWkt()) pytest.fail(src_wkt) if ogrtest.check_feature_geometry(dst_geom, exp_wkt): print(src_wkt) print(target_type) pytest.fail(dst_geom.ExportToWkt()) gdalautotest-3.0.4/ogr/ogr_cloudant.py0000755003401500001440000001265013614005325017457 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_cloudant.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Cloudant driver testing. # Author: Norman Barker, norman at cloudant com # Based on the CouchDB driver # ############################################################################### # Copyright (c) 2014, Norman Barker # # 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 import ogrtest from osgeo import ogr import pytest ############################################################################### # Test if driver is available def test_ogr_cloudant_init(): ogrtest.cloudant_drv = None try: ogrtest.cloudant_drv = ogr.GetDriverByName('Cloudant') except: pass if ogrtest.cloudant_drv is None: pytest.skip() if 'CLOUDANT_TEST_SERVER' in os.environ: ogrtest.cloudant_test_server = os.environ['CLOUDANT_TEST_SERVER'] ogrtest.cloudant_test_url = ogrtest.cloudant_test_server else: ogrtest.cloudant_test_server = 'https://yescandrephereddescamill:I1rhuWEIVDRvbpoQNOBW3pGV@normanb.cloudant.com' ogrtest.cloudant_test_url = 'https://normanb.cloudant.com' ogrtest.cloudant_test_layer = 'gdaltest' if gdaltest.gdalurlopen(ogrtest.cloudant_test_url) is None: ogrtest.cloudant_drv = None pytest.skip('cannot open %s' % ogrtest.cloudant_test_url) ############################################################################### # Test GetFeatureCount() def test_ogr_cloudant_GetFeatureCount(): if ogrtest.cloudant_drv is None: pytest.skip() ds = ogr.Open('cloudant:%s/%s' % (ogrtest.cloudant_test_server, ogrtest.cloudant_test_layer)) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None count = lyr.GetFeatureCount() assert count == 52, 'did not get expected feature count' ############################################################################### # Test GetNextFeature() def test_ogr_cloudant_GetNextFeature(): if ogrtest.cloudant_drv is None: pytest.skip() ds = ogr.Open('cloudant:%s/%s' % (ogrtest.cloudant_test_server, ogrtest.cloudant_test_layer)) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None feat = lyr.GetNextFeature() assert feat is not None, 'did not get expected feature' if feat.GetField('_id') != '0400000US01': feat.DumpReadable() pytest.fail('did not get expected feature') ############################################################################### # Test GetSpatialRef() def test_ogr_cloudant_GetSpatialRef(): if ogrtest.cloudant_drv is None: pytest.skip() ds = ogr.Open('cloudant:%s/%s' % (ogrtest.cloudant_test_server, ogrtest.cloudant_test_layer)) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None sr = lyr.GetSpatialRef() if sr is None: return ############################################################################### # Test GetExtent() def test_ogr_cloudant_GetExtent(): if ogrtest.cloudant_drv is None: pytest.skip() ds = ogr.Open('cloudant:%s/%s' % (ogrtest.cloudant_test_server, ogrtest.cloudant_test_layer)) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None extent = lyr.GetExtent() assert extent is not None, 'did not get expected extent' assert extent == (-179.14734, 179.77847, 17.884813, 71.352561), \ 'did not get expected extent' ############################################################################### # Test SetSpatialFilter() def test_ogr_cloudant_SetSpatialFilter(): if ogrtest.cloudant_drv is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('cloudant:%s/%s' % (ogrtest.cloudant_test_server, ogrtest.cloudant_test_layer)) assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None lyr.SetSpatialFilterRect(-104.9847, 39.7392, -104.9847, 39.7392) feat = lyr.GetNextFeature() assert feat is not None, 'did not get expected feature' if feat.GetField('NAME') != 'Colorado': feat.DumpReadable() pytest.fail('did not get expected feature') gdalautotest-3.0.4/ogr/ogr_htf.py0000755003401500001440000000771213614005325016432 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_htf.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR HTF 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 gdaltest import ogrtest from osgeo import ogr import pytest ############################################################################### # Basic test def test_ogr_htf_1(): ds = ogr.Open('data/test.htf') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr.GetName() == 'polygon', 'layer 0 is not polygon' lyr = ds.GetLayerByName('polygon') assert lyr is not None, 'cannot find layer polygon' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POLYGON ((320830 7678810,350840 7658030,308130 7595560,278310 7616820,320830 7678810))', max_error=0.0000001) != 0: print(geom.ExportToWkt()) pytest.fail('did not get expected first geom') feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POLYGON ((320830 7678810,350840 7658030,308130 7595560,278310 7616820,320830 7678810),(0 0,0 1,1 1,0 0))', max_error=0.0000001) != 0: print(geom.ExportToWkt()) pytest.fail('did not get expected first geom') assert feat.GetField('IDENTIFIER') == 2, 'did not get expected identifier' lyr = ds.GetLayerByName('sounding') assert lyr is not None, 'cannot find layer sounding' assert lyr.GetFeatureCount() == 2, 'did not get expected feature count' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POINT (278670 7616330)', max_error=0.0000001) != 0: print(geom.ExportToWkt()) pytest.fail('did not get expected first geom') assert feat.GetField('other3') == 'other3', 'did not get expected other3 val' ############################################################################### # Run test_ogrsf def test_ogr_htf_2(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.htf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.htf metadata') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 gdalautotest-3.0.4/ogr/ogr_openair.py0000755003401500001440000000566313614005325017311 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_openair.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR OpenAir 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Basic test def test_ogr_openair_1(): ds = ogr.Open('data/openair_test.txt') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayerByName('airspaces') assert lyr is not None, 'cannot find layer airspaces' feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POLYGON ((49.75 2.75,49.75 3.0,49.5 3.0,49.5 2.75,49.75 2.75))', max_error=0.0000001) != 0: print('did not get expected first geom') pytest.fail(geom.ExportToWkt()) style = feat.GetStyleString() assert style == 'PEN(c:#0000FF,w:2pt,p:"5px 5px");BRUSH(fc:#00FF00)', \ 'did not get expected style' lyr = ds.GetLayerByName('labels') assert lyr is not None, 'cannot find layer labels' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POINT (49.2625 2.504166666666667)', max_error=0.0000001) != 0: print('did not get expected geom on labels layer') pytest.fail(geom.ExportToWkt()) gdalautotest-3.0.4/ogr/ogr_segukooa.py0000755003401500001440000001407013614005325017461 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_segukooa.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR SEG-P1 / UKOOA P1/90 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Read SEGP1 def test_ogr_segp1_points(): ds = ogr.Open('data/test.segp1') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint, 'bad layer geometry type' feat = lyr.GetNextFeature() expected_values = [ ('LINENAME', 'firstline'), ('POINTNUMBER', 10), ('RESHOOTCODE', ' '), ('LONGITUDE', 2), ('LATITUDE', 49), ('EASTING', 426857), ('NORTHING', 5427937), ('DEPTH', 1234) ] for values in expected_values: if feat.GetField(values[0]) != values[1]: feat.DumpReadable() pytest.fail('did not get expected value for %s' % values[0]) if ogrtest.check_feature_geometry(feat, 'POINT (2 49)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read SEGP1 lines def test_ogr_segp1_lines(): ds = ogr.Open('data/test.segp1') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(1) assert lyr.GetGeomType() == ogr.wkbLineString, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField('LINENAME') != 'firstline': feat.DumpReadable() pytest.fail('did not get expected value for LINENAME') if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 49,2.0 49.5)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') feat = lyr.GetNextFeature() if feat.GetField('LINENAME') != 'secondline': feat.DumpReadable() pytest.fail('did not get expected value for LINENAME') if ogrtest.check_feature_geometry(feat, 'LINESTRING (-2 -49,-2.5 -49.0)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read UKOOA def test_ogr_ukooa_points(): ds = ogr.Open('data/test.ukooa') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint, 'bad layer geometry type' feat = lyr.GetNextFeature() expected_values = [ ('LINENAME', 'firstline'), ('POINTNUMBER', 10), ('LONGITUDE', 2), ('LATITUDE', 49), ('EASTING', 426857), ('NORTHING', 5427937), ('DEPTH', 1234) ] for values in expected_values: if feat.GetField(values[0]) != values[1]: feat.DumpReadable() pytest.fail('did not get expected value for %s' % values[0]) if ogrtest.check_feature_geometry(feat, 'POINT (2 49)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read UKOOA lines def test_ogr_ukooa_lines(): ds = ogr.Open('data/test.ukooa') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 2, 'bad layer count' lyr = ds.GetLayer(1) assert lyr.GetGeomType() == ogr.wkbLineString, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField('LINENAME') != 'firstline': feat.DumpReadable() pytest.fail('did not get expected value for LINENAME') if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 49,2.0 49.5)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') feat = lyr.GetNextFeature() if feat.GetField('LINENAME') != 'secondline': feat.DumpReadable() pytest.fail('did not get expected value for LINENAME') if ogrtest.check_feature_geometry(feat, 'LINESTRING (-2 -49,-2.5 -49.0)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') gdalautotest-3.0.4/ogr/ogr_gpkg.py0000755003401500001440000041573513614005325016611 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_gpkg.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GeoPackage driver functionality. # Author: Paul Ramsey # ############################################################################### # Copyright (c) 2004, Paul Ramsey # 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 struct import sys import pytest from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest ############################################################################### # Validate a geopackage def _validate_check(filename): path = '../../gdal/swig/python/samples' if path not in sys.path: sys.path.append(path) try: import validate_gpkg except ImportError: return validate_gpkg.check(filename) def validate(filename, quiet=False): 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_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 ############################################################################### # Create a fresh database. def test_ogr_gpkg_1(): gdaltest.gpkg_ds = None gdaltest.gpkg_dr = None gdaltest.gpkg_dr = ogr.GetDriverByName('GPKG') if gdaltest.gpkg_dr is None: pytest.skip() try: os.remove('tmp/gpkg_test.gpkg') except OSError: pass # 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') gdaltest.gpkg_ds = gdaltest.gpkg_dr.CreateDataSource('tmp/gpkg_test.gpkg') assert gdaltest.gpkg_ds is not None gdaltest.gpkg_ds = None assert validate('tmp/gpkg_test.gpkg'), 'validation failed' ############################################################################### # Re-open database to test validity def test_ogr_gpkg_2(): if gdaltest.gpkg_dr is None: pytest.skip() gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) # Check there a ogr_empty_table sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM sqlite_master WHERE name = 'ogr_empty_table'") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 1 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Should default to GPKG 1.2 sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('PRAGMA application_id') f = sql_lyr.GetNextFeature() if f['application_id'] != 1196444487: f.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('PRAGMA user_version') f = sql_lyr.GetNextFeature() if f['user_version'] != 10200: f.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Create a layer def test_ogr_gpkg_3(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() # Test invalid FORMAT # gdal.PushErrorHandler('CPLQuietErrorHandler') srs4326 = osr.SpatialReference() srs4326.ImportFromEPSG(4326) lyr = gdaltest.gpkg_ds.CreateLayer('first_layer', geom_type=ogr.wkbPoint, srs=srs4326, options=['GEOMETRY_NAME=gpkg_geometry', 'SPATIAL_INDEX=NO']) # gdal.PopErrorHandler() assert lyr is not None # Test creating a layer with an existing name gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.gpkg_ds.CreateLayer('a_layer', options=['SPATIAL_INDEX=NO']) lyr = gdaltest.gpkg_ds.CreateLayer('a_layer', options=['SPATIAL_INDEX=NO']) gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' ############################################################################### # Close and re-open to test the layer registration def test_ogr_gpkg_4(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() gdaltest.gpkg_ds = None assert validate('tmp/gpkg_test.gpkg'), 'validation failed' gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) gdal.PopErrorHandler() assert gdaltest.gpkg_ds is not None # Check there no ogr_empty_table sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM sqlite_master WHERE name = 'ogr_empty_table'") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 0 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) assert gdaltest.gpkg_ds.GetLayerCount() == 2, 'unexpected number of layers' lyr0 = gdaltest.gpkg_ds.GetLayer(0) assert lyr0.GetFIDColumn() == 'fid', 'unexpected FID name for layer 0' gdaltest.gpkg_ds = None gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) lyr0 = gdaltest.gpkg_ds.GetLayer(0) assert lyr0.GetName() == 'first_layer', 'unexpected layer name for layer 0' gdaltest.gpkg_ds = None gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) lyr0 = gdaltest.gpkg_ds.GetLayer(0) lyr1 = gdaltest.gpkg_ds.GetLayer(1) assert lyr0.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'gpkg_geometry', \ 'unexpected geometry field name for layer 0' assert lyr1.GetName() == 'a_layer', 'unexpected layer name for layer 1' sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Delete a layer def test_ogr_gpkg_5(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() assert gdaltest.gpkg_ds.GetLayerCount() == 2, 'unexpected number of layers' with gdaltest.error_handler(): ret = gdaltest.gpkg_ds.DeleteLayer(-1) assert ret != 0, 'expected error' with gdaltest.error_handler(): ret = gdaltest.gpkg_ds.DeleteLayer(gdaltest.gpkg_ds.GetLayerCount()) assert ret != 0, 'expected error' assert gdaltest.gpkg_ds.DeleteLayer(1) == 0, 'got error code from DeleteLayer(1)' assert gdaltest.gpkg_ds.DeleteLayer(0) == 0, 'got error code from DeleteLayer(0)' assert gdaltest.gpkg_ds.GetLayerCount() == 0, 'unexpected number of layers (not 0)' ############################################################################### # Add fields def test_ogr_gpkg_6(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() srs4326 = osr.SpatialReference() srs4326.ImportFromEPSG(4326) lyr = gdaltest.gpkg_ds.CreateLayer('field_test_layer', geom_type=ogr.wkbPoint, srs=srs4326) assert lyr is not None field_defn = ogr.FieldDefn('dummy', ogr.OFTString) lyr.CreateField(field_defn) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTString, \ 'wrong field type' gdaltest.gpkg_ds = None assert validate('tmp/gpkg_test.gpkg'), 'validation failed' gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) gdal.PopErrorHandler() assert gdaltest.gpkg_ds is not None assert gdaltest.gpkg_ds.GetLayerCount() == 1 lyr = gdaltest.gpkg_ds.GetLayer(0) assert lyr.GetName() == 'field_test_layer' field_defn_out = lyr.GetLayerDefn().GetFieldDefn(0) assert field_defn_out.GetType() == ogr.OFTString, 'wrong field type after reopen' assert field_defn_out.GetName() == 'dummy', 'wrong field name after reopen' ############################################################################### # Add a feature / read a feature / delete a feature def test_ogr_gpkg_7(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() lyr = gdaltest.gpkg_ds.GetLayerByName('field_test_layer') geom = ogr.CreateGeometryFromWkt('POINT(10 10)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) feat.SetField('dummy', 'a dummy value') assert lyr.TestCapability(ogr.OLCSequentialWrite) == 1, \ 'lyr.TestCapability(ogr.OLCSequentialWrite) != 1' assert lyr.CreateFeature(feat) == 0, 'cannot create feature' # Read back what we just inserted lyr.ResetReading() feat_read = lyr.GetNextFeature() assert feat_read.GetField('dummy') == 'a dummy value', 'output does not match input' # Only inserted one thing, so second feature should return NULL feat_read = lyr.GetNextFeature() assert feat_read is None, 'last call should return NULL' # Add another feature geom = ogr.CreateGeometryFromWkt('POINT(100 100)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) feat.SetField('dummy', 'who you calling a dummy?') assert lyr.CreateFeature(feat) == 0, 'cannot create feature' assert lyr.TestCapability(ogr.OLCRandomRead) == 1, \ 'lyr.TestCapability(ogr.OLCRandomRead) != 1' # Random read a feature feat_read_random = lyr.GetFeature(feat.GetFID()) assert feat_read_random.GetField('dummy') == 'who you calling a dummy?', \ 'random read output does not match input' assert lyr.TestCapability(ogr.OLCRandomWrite) == 1, \ 'lyr.TestCapability(ogr.OLCRandomWrite) != 1' # Random write a feature feat.SetField('dummy', 'i am no dummy') lyr.SetFeature(feat) feat_read_random = lyr.GetFeature(feat.GetFID()) assert feat_read_random.GetField('dummy') == 'i am no dummy', \ 'random read output does not match random write input' assert lyr.TestCapability(ogr.OLCDeleteFeature) == 1, \ 'lyr.TestCapability(ogr.OLCDeleteFeature) != 1' # Delete a feature lyr.DeleteFeature(feat.GetFID()) assert lyr.GetFeatureCount() == 1, 'delete feature did not delete' # Test updating non-existing feature feat.SetFID(-10) assert lyr.SetFeature(feat) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of SetFeature().' # Test deleting non-existing feature assert lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of DeleteFeature().' # Delete the layer if gdaltest.gpkg_ds.DeleteLayer('field_test_layer') != 0: gdaltest.post_reason('got error code from DeleteLayer(field_test_layer)') ############################################################################### # Test a variety of geometry feature types and attribute types def test_ogr_gpkg_8(): # try: # os.remove( 'tmp/gpkg_test.gpkg' ) # except: # pass # gdaltest.gpkg_dr = ogr.GetDriverByName( 'GPKG' ) # gdaltest.gpkg_ds = gdaltest.gpkg_dr.CreateDataSource( 'tmp/gpkg_test.gpkg' ) if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() srs = osr.SpatialReference() # Test a non-default SRS srs.ImportFromEPSG(32631) lyr = gdaltest.gpkg_ds.CreateLayer('tbl_linestring', geom_type=ogr.wkbLineString, srs=srs) assert lyr is not None lyr.StartTransaction() lyr.CreateField(ogr.FieldDefn('fld_integer', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('fld_string', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('fld_real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('fld_date', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('fld_datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('fld_binary', ogr.OFTBinary)) fld_defn = ogr.FieldDefn('fld_boolean', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('fld_smallint', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('fld_float', ogr.OFTReal) fld_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld_defn) lyr.CreateField(ogr.FieldDefn('fld_integer64', ogr.OFTInteger64)) geom = ogr.CreateGeometryFromWkt('LINESTRING(5 5,10 5,10 10,5 10)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) for i in range(10): feat.SetFID(-1) feat.SetField('fld_integer', 10 + i) feat.SetField('fld_real', 3.14159 / (i + 1)) feat.SetField('fld_string', 'test string %d test' % i) feat.SetField('fld_date', '2014/05/17 ') feat.SetField('fld_datetime', '2014/05/17 12:34:56') feat.SetFieldBinaryFromHexString('fld_binary', 'fffe') feat.SetField('fld_boolean', 1) feat.SetField('fld_smallint', -32768) feat.SetField('fld_float', 1.23) feat.SetField('fld_integer64', 1000000000000 + i) assert lyr.CreateFeature(feat) == 0, ('cannot create feature %d' % i) lyr.CommitTransaction() feat = ogr.Feature(lyr.GetLayerDefn()) assert lyr.CreateFeature(feat) == 0, 'cannot insert empty' feat.SetFID(6) assert lyr.SetFeature(feat) == 0, 'cannot update with empty' gdaltest.gpkg_ds = None gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) lyr = gdaltest.gpkg_ds.GetLayerByName('tbl_linestring') assert lyr.GetLayerDefn().GetFieldDefn(6).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(7).GetSubType() == ogr.OFSTInt16 assert lyr.GetLayerDefn().GetFieldDefn(8).GetSubType() == ogr.OFSTFloat32 feat = lyr.GetNextFeature() if feat.GetField(0) != 10 or feat.GetField(1) != 'test string 0 test' or \ feat.GetField(2) != 3.14159 or feat.GetField(3) != '2014/05/17' or \ feat.GetField(4) != '2014/05/17 12:34:56+00' or feat.GetField(5) != 'FFFE' or \ feat.GetField(6) != 1 or feat.GetField(7) != -32768 or feat.GetField(8) != 1.23 or \ feat.GetField(9) != 1000000000000: feat.DumpReadable() pytest.fail() lyr = gdaltest.gpkg_ds.CreateLayer('tbl_polygon', geom_type=ogr.wkbPolygon, srs=srs) assert lyr is not None lyr.StartTransaction() lyr.CreateField(ogr.FieldDefn('fld_datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('fld_string', ogr.OFTString)) geom = ogr.CreateGeometryFromWkt('POLYGON((5 5, 10 5, 10 10, 5 10, 5 5),(6 6, 6 7, 7 7, 7 6, 6 6))') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) for i in range(10): feat.SetFID(-1) feat.SetField('fld_string', 'my super string %d' % i) feat.SetField('fld_datetime', '2010-01-01') assert lyr.CreateFeature(feat) == 0, ('cannot create polygon feature %d' % i) lyr.CommitTransaction() feat = lyr.GetFeature(3) geom_read = feat.GetGeometryRef() assert geom.ExportToWkt() == geom_read.ExportToWkt(), \ 'geom output not equal to geom input' # Test out the 3D support... lyr = gdaltest.gpkg_ds.CreateLayer('tbl_polygon25d', geom_type=ogr.wkbPolygon25D, srs=srs) assert lyr is not None lyr.CreateField(ogr.FieldDefn('fld_string', ogr.OFTString)) geom = ogr.CreateGeometryFromWkt('POLYGON((5 5 1, 10 5 2, 10 10 3, 5 104 , 5 5 1),(6 6 4, 6 7 5, 7 7 6, 7 6 7, 6 6 4))') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) lyr.CreateFeature(feat) lyr.ResetReading() feat = lyr.GetNextFeature() geom_read = feat.GetGeometryRef() assert geom.ExportToWkt() == geom_read.ExportToWkt(), \ '3d geom output not equal to geom input' ############################################################################### # Test support for extents and counts def test_ogr_gpkg_9(): if gdaltest.gpkg_dr is None or gdaltest.gpkg_ds is None: pytest.skip() lyr = gdaltest.gpkg_ds.GetLayerByName('tbl_linestring') extent = lyr.GetExtent() assert extent == (5.0, 10.0, 5.0, 10.0), 'got bad extent' fcount = lyr.GetFeatureCount() assert fcount == 11, 'got bad featurecount' ############################################################################### # Test non-SELECT SQL commands def test_ogr_gpkg_11(): if gdaltest.gpkg_dr is None: pytest.skip() gdaltest.gpkg_ds = None gdaltest.gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) gdaltest.gpkg_ds.ExecuteSQL('CREATE INDEX tbl_linestring_fld_integer_idx ON tbl_linestring(fld_integer)') gdaltest.gpkg_ds.ExecuteSQL('ALTER TABLE tbl_linestring RENAME TO tbl_linestring_renamed;') gdaltest.gpkg_ds.ExecuteSQL('VACUUM') gdaltest.gpkg_ds = None gdaltest.gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) lyr = gdaltest.gpkg_ds.GetLayerByName('tbl_linestring_renamed') assert lyr is not None lyr.SetAttributeFilter('fld_integer = 10') assert lyr.GetFeatureCount() == 1 ############################################################################### # Test SELECT SQL commands def test_ogr_gpkg_12(): if gdaltest.gpkg_dr is None: pytest.skip() sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('SELECT * FROM tbl_linestring_renamed') assert sql_lyr.GetFIDColumn() == 'fid' assert sql_lyr.GetGeomType() == ogr.wkbLineString assert sql_lyr.GetGeometryColumn() == 'geom' assert sql_lyr.GetSpatialRef().ExportToWkt().find('32631') >= 0 feat = sql_lyr.GetNextFeature() assert feat.GetFID() == 1 assert sql_lyr.GetFeatureCount() == 11 assert sql_lyr.GetLayerDefn().GetFieldCount() == 10 assert sql_lyr.GetLayerDefn().GetFieldDefn(6).GetSubType() == ogr.OFSTBoolean assert sql_lyr.GetLayerDefn().GetFieldDefn(7).GetSubType() == ogr.OFSTInt16 assert sql_lyr.GetLayerDefn().GetFieldDefn(8).GetSubType() == ogr.OFSTFloat32 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL( 'SELECT ' 'CAST(fid AS INTEGER) AS FID, ' 'CAST(fid AS INTEGER) AS FID, ' '_rowid_ ,' 'CAST(geom AS BLOB) AS GEOM, ' 'CAST(geom AS BLOB) AS GEOM, ' 'CAST(fld_integer AS INTEGER) AS FLD_INTEGER, ' 'CAST(fld_integer AS INTEGER) AS FLD_INTEGER, ' 'CAST(fld_string AS TEXT) AS FLD_STRING, ' 'CAST(fld_real AS REAL) AS FLD_REAL, ' 'CAST(fld_binary as BLOB) as FLD_BINARY, ' 'CAST(fld_integer64 AS INTEGER) AS FLD_INTEGER64 ' 'FROM tbl_linestring_renamed') assert sql_lyr.GetFIDColumn() == 'FID' assert sql_lyr.GetGeometryColumn() == 'GEOM' assert sql_lyr.GetLayerDefn().GetFieldCount() == 5 assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'FLD_INTEGER' assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger assert sql_lyr.GetLayerDefn().GetFieldDefn(1).GetName() == 'FLD_STRING' assert sql_lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTString assert sql_lyr.GetLayerDefn().GetFieldDefn(2).GetName() == 'FLD_REAL' assert sql_lyr.GetLayerDefn().GetFieldDefn(2).GetType() == ogr.OFTReal assert sql_lyr.GetLayerDefn().GetFieldDefn(3).GetName() == 'FLD_BINARY' assert sql_lyr.GetLayerDefn().GetFieldDefn(3).GetType() == ogr.OFTBinary assert sql_lyr.GetLayerDefn().GetFieldDefn(4).GetName() == 'FLD_INTEGER64' assert sql_lyr.GetLayerDefn().GetFieldDefn(4).GetType() == ogr.OFTInteger64 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('SELECT * FROM tbl_linestring_renamed WHERE 0=1') feat = sql_lyr.GetNextFeature() assert feat is None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) for sql in ['SELECT * FROM tbl_linestring_renamed LIMIT 1', 'SELECT * FROM tbl_linestring_renamed ORDER BY fld_integer LIMIT 1', 'SELECT * FROM tbl_linestring_renamed UNION ALL SELECT * FROM tbl_linestring_renamed ORDER BY fld_integer LIMIT 1']: sql_lyr = gdaltest.gpkg_ds.ExecuteSQL(sql) feat = sql_lyr.GetNextFeature() assert feat is not None feat = sql_lyr.GetNextFeature() assert feat is None assert sql_lyr.GetFeatureCount() == 1 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('SELECT sqlite_version()') feat = sql_lyr.GetNextFeature() assert feat is not None assert sql_lyr.GetLayerDefn().GetFieldCount() == 1 assert sql_lyr.GetLayerDefn().GetGeomFieldCount() == 0 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test non-spatial tables def test_ogr_gpkg_13(): if gdaltest.gpkg_dr is None: pytest.skip() lyr = gdaltest.gpkg_ds.CreateLayer('non_spatial', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=OGR_ASPATIAL']) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None lyr.CreateField(ogr.FieldDefn('fld_integer', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('fld_integer', 1) lyr.CreateFeature(feat) feat = None lyr.ResetReading() feat = lyr.GetNextFeature() if not feat.IsFieldNull('fld_integer'): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetField('fld_integer') != 1: feat.DumpReadable() pytest.fail() # Test second aspatial layer lyr = gdaltest.gpkg_ds.CreateLayer('non_spatial2', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=OGR_ASPATIAL']) gdaltest.gpkg_ds = None gdaltest.gpkg_ds = ogr.Open('tmp/gpkg_test.gpkg', update=1) assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' assert gdaltest.gpkg_ds.GetLayerCount() == 5 lyr = gdaltest.gpkg_ds.GetLayer('non_spatial') assert lyr.GetGeomType() == ogr.wkbNone feat = lyr.GetNextFeature() assert feat.IsFieldNull('fld_integer') feat = lyr.GetNextFeature() if feat.GetField('fld_integer') != 1: feat.DumpReadable() pytest.fail() sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name IS NULL AND extension_name = 'gdal_aspatial'") assert sql_lyr.GetFeatureCount() == 1 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Add various geometries to test spatial filtering def test_ogr_gpkg_14(): if gdaltest.gpkg_dr is None: pytest.skip() sr = osr.SpatialReference() sr.ImportFromEPSG(32631) lyr = gdaltest.gpkg_ds.CreateLayer('point_no_spi-but-with-dashes', geom_type=ogr.wkbPoint, options=['SPATIAL_INDEX=NO'], srs=sr) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 -30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 -30000000)')) lyr.CreateFeature(feat) # Test null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) # Test empty geometry feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT EMPTY')) lyr.CreateFeature(feat) f = lyr.GetFeature(5) if f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() f = lyr.GetFeature(6) if f.GetGeometryRef().ExportToWkt() != 'POINT EMPTY': f.DumpReadable() pytest.fail() f = None sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('SELECT * FROM "point_no_spi-but-with-dashes"') res = sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) assert res == 0 lyr = gdaltest.gpkg_ds.CreateLayer('point-with-spi-and-dashes', geom_type=ogr.wkbPoint) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 1 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1000 -30000000)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-1000 -30000000)')) lyr.CreateFeature(feat) # Test null geometry feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) # Test empty geometry feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT EMPTY')) lyr.CreateFeature(feat) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL('SELECT * FROM "point-with-spi-and-dashes"') res = sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) assert res == 1 # Test spatial filer right away lyr.SetSpatialFilterRect(1000, 30000000, 1000, 30000000) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None f = lyr.GetNextFeature() assert f is None ############################################################################### # Test SQL functions def test_ogr_gpkg_15(): if gdaltest.gpkg_dr is None: pytest.skip() sql_lyr = gdaltest.gpkg_ds.ExecuteSQL( 'SELECT ST_IsEmpty(geom), ST_SRID(geom), ST_GeometryType(geom), ' + 'ST_MinX(geom), ST_MinY(geom), ST_MaxX(geom), ST_MaxY(geom) FROM \"point_no_spi-but-with-dashes\" WHERE fid = 1') feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 0 or feat.GetField(1) != 32631 or \ feat.GetField(2) != 'POINT' or \ feat.GetField(3) != 1000 or feat.GetField(4) != 30000000 or \ feat.GetField(5) != 1000 or feat.GetField(6) != 30000000: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL( 'SELECT ST_IsEmpty(geom), ST_SRID(geom), ST_GeometryType(geom), ' + 'ST_MinX(geom), ST_MinY(geom), ST_MaxX(geom), ST_MaxY(geom) FROM tbl_linestring_renamed WHERE geom IS NULL') feat = sql_lyr.GetNextFeature() if not feat.IsFieldNull(0) or not feat.IsFieldNull(1) or not feat.IsFieldNull(2) or \ not feat.IsFieldNull(3) or not feat.IsFieldNull(4) or not feat.IsFieldNull(5) or not feat.IsFieldNull(6): feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) for (expected_type, actual_type, expected_result) in [ ('POINT', 'POINT', 1), ('LINESTRING', 'POINT', 0), ('GEOMETRY', 'POINT', 1), ('POINT', 'GEOMETRY', 0), ('GEOMETRYCOLLECTION', 'MULTIPOINT', 1), ('GEOMETRYCOLLECTION', 'POINT', 0)]: sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT GPKG_IsAssignable('%s', '%s')" % (expected_type, actual_type)) feat = sql_lyr.GetNextFeature() got_result = feat.GetField(0) gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) assert got_result == expected_result, \ ("expected_type=%s actual_type=%s expected_result=%d got_result=%d" % (expected_type, actual_type, expected_result, got_result)) for (sql, expected_result) in [ ("SELECT HasSpatialIndex('point-with-spi-and-dashes', 'geom')", 1), ("SELECT DisableSpatialIndex('point-with-spi-and-dashes', 'geom')", 1), ("SELECT HasSpatialIndex('point-with-spi-and-dashes', 'geom')", 0), ("SELECT DisableSpatialIndex('point-with-spi-and-dashes', 'geom')", 0), ("SELECT CreateSpatialIndex('point-with-spi-and-dashes', 'geom')", 1), ("SELECT HasSpatialIndex('point-with-spi-and-dashes', 'geom')", 1), ("SELECT CreateSpatialIndex('point-with-spi-and-dashes', 'geom')", 0), ("SELECT CreateSpatialIndex('point-with-spi-and-dashes', NULL)", 0), ("SELECT HasSpatialIndex('point-with-spi-and-dashes', NULL)", 0), ("SELECT CreateSpatialIndex(NULL, 'geom')", 0), ("SELECT CreateSpatialIndex('bla', 'geom')", 0), ("SELECT CreateSpatialIndex('point-with-spi-and-dashes', 'bla')", 0), ("SELECT DisableSpatialIndex('point-with-spi-and-dashes', NULL)", 0), ("SELECT DisableSpatialIndex(NULL, 'geom')", 0), ("SELECT DisableSpatialIndex('bla', 'geom')", 0), ("SELECT DisableSpatialIndex('point-with-spi-and-dashes', 'bla')", 0), ("SELECT HasSpatialIndex(NULL, 'geom')", 0), ("SELECT HasSpatialIndex('bla', 'geom')", 0), ("SELECT HasSpatialIndex('point-with-spi-and-dashes', 'bla')", 0), ("SELECT CreateSpatialIndex('non_spatial', '')", 0), ("SELECT CreateSpatialIndex('point_no_spi-but-with-dashes', 'geom')", 1), # Final DisableSpatialIndex: will be effectively deleted at dataset closing ("SELECT DisableSpatialIndex('point_no_spi-but-with-dashes', 'geom')", 1), ]: if expected_result == 0: gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.gpkg_ds.ExecuteSQL(sql) if expected_result == 0: gdal.PopErrorHandler() feat = sql_lyr.GetNextFeature() got_result = feat.GetField(0) gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) assert got_result == expected_result, sql # NULL argument sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT SridFromAuthCRS(NULL, 4326)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != -1: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # NULL argument sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT SridFromAuthCRS('epsg', NULL)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != -1: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Existing entry sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT SridFromAuthCRS('epsg', 4326)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 4326: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Non existing entry sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT SridFromAuthCRS('epsg', 1234)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != -1: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # NULL argument sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ImportFromEPSG(NULL)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != -1: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Existing entry in gpkg_spatial_ref_sys sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ImportFromEPSG(4326)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 4326: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # New entry in gpkg_spatial_ref_sys sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ImportFromEPSG(32633)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 32633: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid code with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ImportFromEPSG(0)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != -1: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # NULL argument sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(NULL, 4326)") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid geometry with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(x'00', 4326)") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # NULL argument sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, NULL) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid target SRID with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, 0) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid source SRID with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, 4326) FROM \"point-with-spi-and-dashes\"") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid spatialite geometry: SRID=4326,MULTIPOINT EMPTY truncated with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(x'0001E610000000000000000000000000000000000000000000000000000000000000000000007C04000000000000FE', 4326) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_Transform(geom, ST_SRID(geom)) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (5 5,10 5,10 10,5 10)': feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_SRID(ST_Transform(geom, 4326)) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 4326: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry: SRID=4326,MULTIPOINT EMPTY sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_SRID(ST_Transform(x'0001E610000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE', 4326)) FROM tbl_linestring_renamed") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 4326: feat.DumpReadable() pytest.fail() gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: less than 8 bytes sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_MinX(x'00')") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: 8 wrong bytes sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_MinX(x'0001020304050607')") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: too short blob sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'4750001100000000')") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: too short blob sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'475000110000000001040000')") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Invalid geometry, but long enough for our purpose... sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'47500011000000000104000000')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 'MULTIPOINT': feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry (MULTIPOINT EMPTY) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 'MULTIPOINT': feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Spatialite geometry (MULTIPOINT EMPTY) sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_IsEmpty(x'00010000000000000000000000000000000000000000000000000000000000000000000000007C0400000000000000FE')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: invalid geometry with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT ST_GeometryType(x'475000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull(0): feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: invalid type sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT GPKG_IsAssignable('POINT', NULL)") feat = sql_lyr.GetNextFeature() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: invalid type sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT GPKG_IsAssignable(NULL, 'POINT')") feat = sql_lyr.GetNextFeature() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Test hstore_get_value sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT hstore_get_value('a=>b', 'a')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) != 'b': feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Test hstore_get_value sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT hstore_get_value('a=>b', 'x')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) is not None: feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: invalid type sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT hstore_get_value('a=>b', NULL)") feat = sql_lyr.GetNextFeature() if feat.GetField(0) is not None: feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) # Error case: invalid type sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT hstore_get_value(NULL, 'a')") feat = sql_lyr.GetNextFeature() if feat.GetField(0) is not None: feat.DumpReadable() pytest.fail() feat = None gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) has_spatialite_4_3_or_later = False with gdaltest.error_handler(): sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("SELECT spatialite_version()") if sql_lyr: f = sql_lyr.GetNextFeature() version = f.GetField(0) version = '.'.join(version.split('.')[0:2]) version = float(version) if version >= 4.3: has_spatialite_4_3_or_later = True # print('Spatialite 4.3 or later found') gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) if has_spatialite_4_3_or_later: sql_lyr = gdaltest.gpkg_ds.ExecuteSQL( "SELECT ST_Buffer(geom, 0) FROM tbl_linestring_renamed") assert sql_lyr.GetGeomType() == ogr.wkbPolygon assert sql_lyr.GetSpatialRef().ExportToWkt().find('32631') >= 0 gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) gdaltest.gpkg_ds = None gdaltest.gpkg_ds = gdaltest.gpkg_dr.Open('tmp/gpkg_test.gpkg', update=1) ############################################################################### # Test unknown extensions def test_ogr_gpkg_16(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpk_16.gpkg') ds.CreateLayer('foo') ds.ExecuteSQL("INSERT INTO gpkg_extensions ( table_name, column_name, " + "extension_name, definition, scope ) VALUES ( 'foo', 'geom', 'myext', 'some ext', 'write-only' ) ") ds = None # No warning since we open as read-only ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') lyr = ds.GetLayer(0) lyr.GetLayerDefn() ds = None assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' # Warning since we open as read-write ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' ds.ExecuteSQL("UPDATE gpkg_extensions SET scope = 'read-write' WHERE extension_name = 'myext'") ds = None # Warning since we open as read-only ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' # and also as read-write ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' ds = None gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') # Test with unsupported geometry type ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpk_16.gpkg') ds.CreateLayer('foo') ds.ExecuteSQL("INSERT INTO gpkg_extensions ( table_name, column_name, " + "extension_name, definition, scope ) VALUES ( 'foo', 'geom', 'gpkg_geom_XXXX', 'some ext', 'read-write' ) ") ds = None ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') # Test with database wide unknown extension ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpk_16.gpkg') ds.CreateLayer('foo') ds.ExecuteSQL("INSERT INTO gpkg_extensions ( " + "extension_name, definition, scope ) VALUES ( 'myext', 'some ext', 'write-only' ) ") ds = None # No warning since we open as read-only ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') lyr = ds.GetLayer(0) lyr.GetLayerDefn() assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' # Warning since we open as read-write gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' ds.ExecuteSQL("UPDATE gpkg_extensions SET scope = 'read-write' WHERE extension_name = 'myext'") ds = None # Warning since we open as read-only gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' # and also as read-write gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('/vsimem/ogr_gpk_16.gpkg', update=1) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'fail : warning expected' ds = None gdal.Unlink('/vsimem/ogr_gpk_16.gpkg') ############################################################################### # Run INDIRECT_SQLITE dialect def test_ogr_gpkg_17(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_17.gpkg') sql_lyr = ds.ExecuteSQL("SELECT ogr_version()", dialect='INDIRECT_SQLITE') f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_gpkg_17.gpkg') ############################################################################### # Test geometry type extension def test_ogr_gpkg_18(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_18.gpkg') lyr = ds.CreateLayer('wkbCircularString', geom_type=ogr.wkbCircularString) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 0,0 0)')) lyr.CreateFeature(f) f = None ds = None assert validate('/vsimem/ogr_gpkg_18.gpkg'), 'validation failed' ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg') assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbCircularString f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryType() == ogr.wkbCircularString sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'wkbCircularString' AND extension_name = 'gpkg_geom_CIRCULARSTRING'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_gpkg_18.gpkg') # Also test with a wkbUnknown layer and add curve geometries afterwards ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_18.gpkg') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 0,0 0)')) lyr.CreateFeature(f) f = None sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'test' AND extension_name = 'gpkg_geom_CIRCULARSTRING'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg') assert gdal.GetLastErrorMsg() == '', 'fail : warning NOT expected' lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryType() == ogr.wkbCircularString ds = None ds = ogr.Open('/vsimem/ogr_gpkg_18.gpkg', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING(0 0,1 0,0 0)')) ret = lyr.CreateFeature(f) assert ret == 0 and gdal.GetLastErrorMsg() == '' f = None ds = None ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_18.gpkg') lyr = ds.CreateLayer('test', geom_type=ogr.wkbTriangle) with gdaltest.error_handler(): # Warning 1: Registering non-standard gpkg_geom_TRIANGLE extension ds.FlushCache() sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'test' AND extension_name = 'gpkg_geom_TRIANGLE'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None ret = validate('/vsimem/ogr_gpkg_18.gpkg', quiet=True) assert not ret, 'validation unexpectedly succeeded' # Test non-linear geometry in GeometryCollection ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_18.gpkg') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(CIRCULARSTRING(0 0,1 0,0 0))')) lyr.CreateFeature(f) f = None sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions WHERE table_name = 'test' AND extension_name LIKE 'gpkg_geom_%'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_gpkg_18.gpkg') ############################################################################### # Test metadata def test_ogr_gpkg_19(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_19.gpkg') assert not ds.GetMetadata() lyr = ds.CreateLayer('test_without_md') assert not lyr.GetMetadata() ds.SetMetadataItem('foo', 'bar') # GEOPACKAGE metadata domain is not allowed in a non-raster context gdal.PushErrorHandler() ds.SetMetadata(ds.GetMetadata('GEOPACKAGE'), 'GEOPACKAGE') ds.SetMetadataItem('foo', ds.GetMetadataItem('foo', 'GEOPACKAGE'), 'GEOPACKAGE') gdal.PopErrorHandler() ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg') assert ds.GetMetadataDomainList() == [''] ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg') assert len(ds.GetMetadata()) == 1 ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg') assert ds.GetMetadataItem('foo') == 'bar', ds.GetMetadata() ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.CreateLayer('test_with_md', options=['IDENTIFIER=ident', 'DESCRIPTION=desc']) lyr.SetMetadataItem('IDENTIFIER', 'ignored_because_of_lco') lyr.SetMetadataItem('DESCRIPTION', 'ignored_because_of_lco') lyr.SetMetadata({'IDENTIFIER': 'ignored_because_of_lco', 'DESCRIPTION': 'ignored_because_of_lco'}) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg') lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadataItem('IDENTIFIER') == 'ident' assert lyr.GetMetadataItem('DESCRIPTION') == 'desc' ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadata() == {'IDENTIFIER': 'ident', 'DESCRIPTION': 'desc'} lyr.SetMetadataItem('IDENTIFIER', 'another_ident') lyr.SetMetadataItem('DESCRIPTION', 'another_desc') ds = None # FIXME? Is it expected to have a .aux.xml here ? gdal.Unlink('/vsimem/ogr_gpkg_19.gpkg.aux.xml') ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadata() == {'IDENTIFIER': 'another_ident', 'DESCRIPTION': 'another_desc'} lyr.SetMetadataItem('foo', 'bar') lyr.SetMetadataItem('bar', 'baz', 'another_domain') ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadataDomainList() == ['', 'another_domain'] ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadata() == {'IDENTIFIER': 'another_ident', 'foo': 'bar', 'DESCRIPTION': 'another_desc'} assert lyr.GetMetadata('another_domain') == {'bar': 'baz'} lyr.SetMetadata(None) lyr.SetMetadata(None, 'another_domain') ds = None ds = ogr.Open('/vsimem/ogr_gpkg_19.gpkg', update=1) lyr = ds.GetLayer('test_with_md') assert lyr.GetMetadata() == {'IDENTIFIER': 'another_ident', 'DESCRIPTION': 'another_desc'} assert lyr.GetMetadataDomainList() == [''] ds = None assert validate('/vsimem/ogr_gpkg_19.gpkg'), 'validation failed' gdal.Unlink('/vsimem/ogr_gpkg_19.gpkg') gdal.Unlink('/vsimem/ogr_gpkg_19.gpkg.aux.xml') ############################################################################### # Test spatial reference system def test_ogr_gpkg_20(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') # "Conflict" with EPSG:4326 srs = osr.SpatialReference() srs.SetFromUserInput("""GEOGCS["my geogcs", DATUM["my datum", SPHEROID["my spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433], AUTHORITY["my_org","4326"]]""") lyr = ds.CreateLayer('my_org_4326', srs=srs) # No authority node srs = osr.SpatialReference() srs.SetFromUserInput("""GEOGCS["another geogcs", DATUM["another datum", SPHEROID["another spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]""") lyr = ds.CreateLayer('without_org', srs=srs) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_20.gpkg') sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='my geogcs' AND srs_id = 100000 AND organization='MY_ORG' AND organization_coordsys_id=4326 AND description is NULL") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_spatial_ref_sys WHERE srs_name='another geogcs' AND srs_id = 100001 AND organization='NONE' AND organization_coordsys_id=100001 AND description is NULL") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 1 lyr = ds.GetLayer('my_org_4326') assert lyr.GetSpatialRef().ExportToWkt().find('my geogcs') >= 0 lyr = ds.GetLayer('without_org') assert lyr.GetSpatialRef().ExportToWkt().find('another geogcs') >= 0 ds = None assert validate('/vsimem/ogr_gpkg_20.gpkg'), 'validation failed' gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('foo4326', srs=srs) ds.ExecuteSQL("UPDATE gpkg_spatial_ref_sys SET definition='invalid', " "organization='', organization_coordsys_id = 0 " "WHERE srs_id = 4326") ds = None # Unable to parse srs_id '4326' well-known text 'invalid' with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_20.gpkg', update=1) ds.ExecuteSQL('DELETE FROM gpkg_spatial_ref_sys WHERE srs_id = 4326') ds = None gdal.SetConfigOption('OGR_GPKG_FOREIGN_KEY_CHECK', 'NO') # Warning 1: unable to read srs_id '4326' from gpkg_spatial_ref_sys with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_20.gpkg', update=1) gdal.SetConfigOption('OGR_GPKG_FOREIGN_KEY_CHECK', None) ds = None gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_20.gpkg') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('foo4326', srs=srs) ds.ExecuteSQL('DROP TABLE gpkg_spatial_ref_sys') ds.ExecuteSQL('CREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT, ' 'srs_id INTEGER, organization TEXT, ' 'organization_coordsys_id INTEGER, definition TEXT)') ds.ExecuteSQL("INSERT INTO gpkg_spatial_ref_sys " "(srs_name,srs_id,organization,organization_coordsys_id," "definition) VALUES (NULL,4326,NULL,NULL,NULL)") ds = None gdal.SetConfigOption('OGR_GPKG_FOREIGN_KEY_CHECK', 'NO') # Warning 1: null definition for srs_id '4326' in gpkg_spatial_ref_sys with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_20.gpkg', update=1) ds = None gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg') ############################################################################### # Test maximum width of text fields def test_ogr_gpkg_21(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_21.gpkg') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('str', ogr.OFTString) field_defn.SetWidth(2) lyr.CreateField(field_defn) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_21.gpkg', update=1) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetWidth() == 2 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 'ab') gdal.ErrorReset() lyr.CreateFeature(f) assert gdal.GetLastErrorMsg() == '' f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldBinaryFromHexString(0, '41E9') gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 'abc') gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' f = lyr.GetFeature(f.GetFID()) assert f.GetField(0) == 'abc' gdal.Unlink('/vsimem/ogr_gpkg_21.gpkg') ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_21.gpkg') lyr = ds.CreateLayer('test', options=['TRUNCATE_FIELDS=YES']) field_defn = ogr.FieldDefn('str', ogr.OFTString) field_defn.SetWidth(2) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldBinaryFromHexString(0, '41E9') gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' f = lyr.GetFeature(f.GetFID()) assert f.GetField(0) == 'A_' f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 'abc') gdal.ErrorReset() gdal.PushErrorHandler() lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' f = lyr.GetFeature(f.GetFID()) if f.GetField(0) != 'ab': gdal.Unlink('/vsimem/ogr_gpkg_21.gpkg') ############################################################################### # Test FID64 support def test_ogr_gpkg_22(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_22.gpkg') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('foo', ogr.OFTString) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 'bar') feat.SetFID(1234567890123) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('/vsimem/ogr_gpkg_22.gpkg') lyr = ds.GetLayerByName('test') assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None f = lyr.GetNextFeature() assert f.GetFID() == 1234567890123 gdal.Unlink('/vsimem/ogr_gpkg_22.gpkg') ############################################################################### # Test not nullable fields def test_ogr_gpkg_23(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_23.gpkg') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Nullable geometry field lyr = ds.CreateLayer('test2', geom_type=ogr.wkbPoint) # Cannot add more than one geometry field gdal.PushErrorHandler() ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foo', ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None # Not-nullable fields and geometry fields created after table creation lyr = ds.CreateLayer('test3', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=OGR_ASPATIAL']) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE data_type = 'features'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 2 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions") fc = sql_lyr.GetFeatureCount() f = sql_lyr.GetNextFeature() ds.ReleaseResultSet(sql_lyr) assert fc == 2 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 2 field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE data_type = 'features'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 3 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_extensions") fc = sql_lyr.GetFeatureCount() f = sql_lyr.GetNextFeature() ds.ReleaseResultSet(sql_lyr) assert fc == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 3 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Not Nullable geometry field lyr = ds.CreateLayer('test4', geom_type=ogr.wkbPoint, options=['GEOMETRY_NULLABLE=NO']) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None ds.CreateLayer('test5', geom_type=ogr.wkbNone) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_23.gpkg') lyr = ds.GetLayerByName('test5') field_defn = ogr.GeomFieldDefn('', ogr.wkbPoint) with gdaltest.error_handler(): assert lyr.CreateGeomField(field_defn) != 0 lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 lyr = ds.GetLayerByName('test2') assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 1 lyr = ds.GetLayerByName('test3') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 lyr = ds.GetLayerByName('test4') assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 ds = None gdal.Unlink('/vsimem/ogr_gpkg_23.gpkg') ############################################################################### # Test default values def test_ogr_gpkg_24(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_24.gpkg') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) # This will be translated as "(strftime('%Y-%m-%dT%H:%M:%fZ','now'))" field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime3', ogr.OFTDateTime) field_defn.SetDefault("(strftime('%Y-%m-%dT%H:%M:%fZ','now'))") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime4', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56.123'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_date', ogr.OFTDate) field_defn.SetDefault("CURRENT_DATE") lyr.CreateField(field_defn) # field_defn = ogr.FieldDefn( 'field_time', ogr.OFTTime ) # field_defn.SetDefault("CURRENT_TIME") # lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None # Test adding columns after "crystallization" field_defn = ogr.FieldDefn('field_datetime5', ogr.OFTDateTime) field_defn.SetDefault("'2016/06/30 12:34:56.123'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime6', ogr.OFTDateTime) field_defn.SetDefault("'2016/06/30 12:34:56'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_string2', ogr.OFTString) field_defn.SetDefault("'X'") lyr.CreateField(field_defn) # Doesn't work currently. Would require rewriting the whole table # field_defn = ogr.FieldDefn( 'field_datetimeX', ogr.OFTDateTime ) # field_defn.SetDefault("CURRENT_TIMESTAMP") # lyr.CreateField(field_defn) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_24.gpkg', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None # Translated from "(strftime('%Y-%m-%dT%H:%M:%fZ','now'))" to CURRENT_TIMESTAMP assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() == 'CURRENT_TIMESTAMP' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() == "'2015/06/30 12:34:56'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime3')).GetDefault() == "CURRENT_TIMESTAMP" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime4')).GetDefault() == "'2015/06/30 12:34:56.123'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault() == "CURRENT_DATE" # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_time')).GetDefault() != "CURRENT_TIME": # gdaltest.post_reason('fail') # return 'fail' f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56+00' or \ f.GetField('field_datetime4') != '2015/06/30 12:34:56.123+00' or \ not f.IsFieldSet('field_datetime3') or \ not f.IsFieldSet('field_date') or \ f.GetField('field_datetime5') != '2016/06/30 12:34:56.123+00' or \ f.GetField('field_datetime6') != '2016/06/30 12:34:56+00' or \ f.GetField('field_string2') != 'X': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_gpkg_24.gpkg') ############################################################################### # Test creating a field with the fid name def test_ogr_gpkg_25(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_25.gpkg') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['FID=myfid']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) assert ret == 0 lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 10) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 10 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 if feat.GetFID() < 0: feat.DumpReadable() pytest.fail() if feat.GetField('myfid') != feat.GetFID(): feat.DumpReadable() pytest.fail() feat.SetField('str', 'foo') ret = lyr.SetFeature(feat) assert ret == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) feat.SetField('myfid', 10) gdal.PushErrorHandler() ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat.UnsetField('myfid') gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f.GetField('str') != 'first string' or f.GetField('str2') != 'second string' or f.GetField('myfid') != 10: f.DumpReadable() pytest.fail() f = lyr.GetFeature(f.GetFID()) if f.GetFID() != 10 or f.GetField('str') != 'first string' or f.GetField('str2') != 'second string' or f.GetField('myfid') != 10: f.DumpReadable() pytest.fail() f = None ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_25.gpkg') ############################################################################### # Test dataset transactions def test_ogr_gpkg_26(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_26.gpkg') assert ds.TestCapability(ogr.ODsCTransactions) == 1 ret = ds.StartTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.StartTransaction() gdal.PopErrorHandler() assert ret != 0 lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ret = ds.RollbackTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update=1) assert ds.GetLayerCount() == 0 ret = ds.StartTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.StartTransaction() gdal.PopErrorHandler() assert ret != 0 lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ret = ds.CommitTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update=1) assert ds.GetLayerCount() == 1 lyr = ds.GetLayerByName('test') ds.StartTransaction() lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None assert lyr.GetFeatureCount() == 1 ds.RollbackTransaction() assert lyr.GetFeatureCount() == 0 ds.StartTransaction() lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 ds.CommitTransaction() # the cursor is still valid after CommitTransaction(), which isn't the case for other backends such as PG ! f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 2 assert lyr.GetFeatureCount() == 2 ds.StartTransaction() lyr = ds.CreateLayer('test2', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() assert ret == 0 ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() assert ret == 0 if False: # pylint: disable=using-constant-test ds.StartTransaction() lyr = ds.CreateLayer('test3', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) # ds.CommitTransaction() ds.ReleaseResultSet(ds.ExecuteSQL('SELECT 1')) # ds = None # ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update = 1) # lyr = ds.GetLayerByName('test3') # ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() # For some reason fails with SQLite 3.6.X with 'failed to execute insert : callback requested query abort' # but not with later versions... assert ret == 0 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_26.gpkg') ############################################################################### # Test interface with Spatialite def test_ogr_gpkg_27(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_27.gpkg') gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("SELECT GeomFromGPB(null)") gdal.PopErrorHandler() if sql_lyr is None: ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_27.gpkg') pytest.skip() ds.ReleaseResultSet(sql_lyr) lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) lyr.CreateFeature(f) sql_lyr = ds.ExecuteSQL('SELECT GeomFromGPB(geom) FROM test') f = sql_lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_27.gpkg') ############################################################################### # Test ogr2ogr -a_srs (as the geopackage driver doesn't clone the passed SRS # but inc/dec its ref count, which can exhibit issues in GDALVectorTanslate()) def test_ogr_gpkg_28(): if gdaltest.gpkg_dr is None: pytest.skip() srcDS = gdal.OpenEx('../ogr/data/poly.shp') ds = gdal.VectorTranslate('/vsimem/ogr_gpkg_28.gpkg', srcDS, format='GPKG', dstSRS='EPSG:4326') assert str(ds.GetLayer(0).GetSpatialRef()).find('1984') != -1 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_28.gpkg') ############################################################################### # Test XYM / XYZM support def test_ogr_gpkg_29(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_29.gpkg') assert ds.TestCapability(ogr.ODsCMeasuredGeometries) == 1 lyr = ds.CreateLayer('pointm', geom_type=ogr.wkbPointM) assert lyr.TestCapability(ogr.OLCMeasuredGeometries) == 1 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT M (1 2 3)')) lyr.CreateFeature(f) lyr = ds.CreateLayer('pointzm', geom_type=ogr.wkbPointZM) assert lyr.TestCapability(ogr.OLCMeasuredGeometries) == 1 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 4)')) lyr.CreateFeature(f) ds = None assert validate('/vsimem/ogr_gpkg_29.gpkg'), 'validation failed' ds = ogr.Open('/vsimem/ogr_gpkg_29.gpkg', update=1) lyr = ds.GetLayerByName('pointm') assert lyr.GetGeomType() == ogr.wkbPointM f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT M (1 2 3)': f.DumpReadable() pytest.fail() # Generate a XYM envelope ds.ExecuteSQL("UPDATE pointm SET geom = x'4750000700000000000000000000F03F000000000000F03F000000000000004000000000000000400000000000000840000000000000084001D1070000000000000000F03F00000000000000400000000000000840'") lyr = ds.GetLayerByName('pointzm') assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': f.DumpReadable() pytest.fail() # Generate a XYZM envelope ds.ExecuteSQL("UPDATE pointzm SET geom = x'4750000900000000000000000000F03F000000000000F03F00000000000000400000000000000040000000000000084000000000000008400000000000001040000000000000104001B90B0000000000000000F03F000000000000004000000000000008400000000000001040'") ds = None # Check again ds = ogr.Open('/vsimem/ogr_gpkg_29.gpkg') lyr = ds.GetLayerByName('pointm') assert lyr.GetGeomType() == ogr.wkbPointM f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT M (1 2 3)': f.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('pointzm') assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': f.DumpReadable() pytest.fail() ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_29.gpkg') ############################################################################### # Test non standard file extension (#6396) def test_ogr_gpkg_30(): if gdaltest.gpkg_dr is None: pytest.skip() with gdaltest.error_handler(): ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_30.geopkg') assert ds is not None assert gdal.GetLastErrorMsg() != '' ds = None with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_30.geopkg', update=1) assert ds is not None assert gdal.GetLastErrorMsg() != '' ds = None with gdaltest.error_handler(): gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_30.geopkg') ############################################################################### # Test CURVE and SURFACE types def test_ogr_gpkg_31(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_31.gpkg') lyr = ds.CreateLayer('curve', geom_type=ogr.wkbCurve) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('COMPOUNDCURVE ((1 2,3 4))')) lyr.CreateFeature(f) lyr = ds.CreateLayer('surface', geom_type=ogr.wkbSurface) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_31.gpkg') lyr = ds.GetLayerByName('curve') assert lyr.GetGeomType() == ogr.wkbCurve lyr = ds.GetLayerByName('surface') assert lyr.GetGeomType() == ogr.wkbSurface ds = None assert validate('/vsimem/ogr_gpkg_31.gpkg'), 'validation failed' gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_31.gpkg') ############################################################################### # Run creating a non-spatial layer that isn't registered as 'aspatial' and # read it back def test_ogr_gpkg_32(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_32.gpkg') ds.CreateLayer('aspatial', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=NOT_REGISTERED']) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_32.gpkg') assert ds.GetLayerCount() == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE table_name != 'ogr_empty_table'") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns WHERE table_name != 'ogr_empty_table'") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) ds = None assert validate('/vsimem/ogr_gpkg_32.gpkg'), 'validation failed' gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_32.gpkg') ############################################################################### # Test OGR_CURRENT_DATE def test_ogr_gpkg_33(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.SetConfigOption('OGR_CURRENT_DATE', '2000-01-01T:00:00:00.000Z') ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_33.gpkg') ds.CreateLayer('test', geom_type=ogr.wkbNone) ds = None gdal.SetConfigOption('OGR_CURRENT_DATE', None) ds = ogr.Open('/vsimem/ogr_gpkg_33.gpkg') sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE last_change = '2000-01-01T:00:00:00.000Z' AND table_name != 'ogr_empty_table'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_33.gpkg') ############################################################################### # Test rename and delete a layer registered in extensions, metadata, spatial index etc def test_ogr_gpkg_34(): if gdaltest.gpkg_dr is None: pytest.skip() layer_name = """weird'layer"name""" dbname = '/vsimem/ogr_gpkg_34.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer(layer_name, geom_type=ogr.wkbCurvePolygon) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) lyr.SetMetadataItem('FOO', 'BAR') ds.ExecuteSQL("""CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, title TEXT, description TEXT, mime_type TEXT, constraint_name TEXT, CONSTRAINT pk_gdc PRIMARY KEY (table_name, column_name), CONSTRAINT fk_gdc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name) )""") ds.ExecuteSQL("INSERT INTO gpkg_data_columns VALUES('weird''layer\"name', 'foo', 'foo_constraints', NULL, NULL, NULL, NULL)") ds = None # Check that there are reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert layer_name in content ds = ogr.Open(dbname, update=1) new_layer_name = """weird2'layer"name""" with gdaltest.error_handler(): ds.ExecuteSQL('ALTER TABLE "weird\'layer""name" RENAME TO gpkg_contents') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() ds.ExecuteSQL('ALTER TABLE "weird\'layer""name" RENAME TO "weird2\'layer""name"') ds.ExecuteSQL('VACUUM') ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert layer_name not in content layer_name = new_layer_name ds = ogr.Open(dbname, update=1) with gdaltest.error_handler(): ds.ExecuteSQL('DELLAYER:does_not_exist') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() ds.ExecuteSQL('DELLAYER:' + layer_name) assert gdal.GetLastErrorMsg() == '' ds.ExecuteSQL('VACUUM') ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert layer_name not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) # Try again with DROP TABLE syntax ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer(layer_name, geom_type=ogr.wkbCurvePolygon) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('CURVEPOLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) lyr.SetMetadataItem('FOO', 'BAR') lyr = ds.CreateLayer('another_layer_name') ds = None ds = ogr.Open(dbname, update=1) ds.ExecuteSQL('DROP TABLE "weird2\'layer""name"') assert gdal.GetLastErrorMsg() == '' ds.ExecuteSQL('DROP TABLE another_layer_name') assert gdal.GetLastErrorMsg() == '' with gdaltest.error_handler(): ds.ExecuteSQL('DROP TABLE "foobar"') assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() ds.ExecuteSQL('VACUUM') ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert layer_name not in content assert 'another_layer_name' not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) ############################################################################### # Test DeleteField() def test_ogr_gpkg_35(): if gdaltest.gpkg_dr is None: pytest.skip() dbname = '/vsimem/ogr_gpkg_35.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('bar_i_will_disappear', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('baz', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(10) f.SetField('foo', 'fooval') f.SetField('bar_i_will_disappear', 'barval') f.SetField('baz', 'bazval') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) lyr_nonspatial = ds.CreateLayer('test_nonspatial', geom_type=ogr.wkbNone) lyr_nonspatial.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr_nonspatial.CreateField(ogr.FieldDefn('bar_i_will_disappear', ogr.OFTString)) lyr_nonspatial.CreateField(ogr.FieldDefn('baz', ogr.OFTString)) f = ogr.Feature(lyr_nonspatial.GetLayerDefn()) f.SetFID(10) f.SetField('foo', 'fooval') f.SetField('bar_i_will_disappear', 'barval') f.SetField('baz', 'bazval') lyr_nonspatial.CreateFeature(f) ds.ExecuteSQL("""CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, title TEXT, description TEXT, mime_type TEXT, constraint_name TEXT, CONSTRAINT pk_gdc PRIMARY KEY (table_name, column_name), CONSTRAINT fk_gdc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name) )""") ds.ExecuteSQL("INSERT INTO gpkg_data_columns VALUES('test', 'bar_i_will_disappear', 'bar_constraints', NULL, NULL, NULL, NULL)") ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('test', 'bar_i_will_disappear', 'extension_name', 'definition', 'scope')") assert lyr.TestCapability(ogr.OLCDeleteField) == 1 with gdaltest.error_handler(): ret = lyr.DeleteField(-1) assert ret != 0 with gdaltest.error_handler(): ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldCount()) assert ret != 0 assert lyr.DeleteField(1) == 0 assert lyr.GetLayerDefn().GetFieldCount() == 2 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f['foo'] != 'fooval' or f['baz'] != 'bazval' or \ f.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': f.DumpReadable() pytest.fail() lyr.StartTransaction() ret = lyr_nonspatial.DeleteField(1) lyr.CommitTransaction() assert ret == 0 lyr_nonspatial.ResetReading() f = lyr_nonspatial.GetNextFeature() if f.GetFID() != 10 or f['foo'] != 'fooval' or f['baz'] != 'bazval': f.DumpReadable() pytest.fail() ds.ExecuteSQL('VACUUM') ds = None # Try on read-only dataset ds = ogr.Open(dbname) lyr = ds.GetLayer(0) with gdaltest.error_handler(): ret = lyr.DeleteField(0) assert ret != 0 ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert 'bar_i_will_disappear' not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) ############################################################################### # Test AlterFieldDefn() def test_ogr_gpkg_36(): if gdaltest.gpkg_dr is None: pytest.skip() dbname = '/vsimem/ogr_gpkg_36.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('baz', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(10) f.SetField('foo', '10.5') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None ds.ExecuteSQL("""CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, title TEXT, description TEXT, mime_type TEXT, constraint_name TEXT, CONSTRAINT pk_gdc PRIMARY KEY (table_name, column_name), CONSTRAINT fk_gdc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name) )""") ds.ExecuteSQL("INSERT INTO gpkg_data_columns VALUES('test', 'foo', 'constraint', NULL, NULL, NULL, NULL)") ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('test', 'foo', 'extension_name', 'definition', 'scope')") ds.ExecuteSQL("CREATE INDEX my_idx ON test(foo)") assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(-1, ogr.FieldDefn('foo'), ogr.ALTER_ALL_FLAG) assert ret != 0 with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(1, ogr.FieldDefn('foo'), ogr.ALTER_ALL_FLAG) assert ret != 0 with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(0, ogr.FieldDefn(lyr.GetGeometryColumn()), ogr.ALTER_ALL_FLAG) assert ret != 0 with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(0, ogr.FieldDefn(lyr.GetFIDColumn()), ogr.ALTER_ALL_FLAG) assert ret != 0 with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('baz'), ogr.ALTER_ALL_FLAG) assert ret != 0 new_field_defn = ogr.FieldDefn('bar', ogr.OFTReal) new_field_defn.SetSubType(ogr.OFSTFloat32) assert lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) == 0 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f['bar'] != 10.5 or \ f.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': f.DumpReadable() pytest.fail() f = None lyr.StartTransaction() new_field_defn = ogr.FieldDefn('baw', ogr.OFTString) assert lyr.AlterFieldDefn(0, new_field_defn, ogr.ALTER_ALL_FLAG) == 0 lyr.CommitTransaction() lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f['baw'] != '10.5' or \ f.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': f.DumpReadable() pytest.fail() f = None # Check that index has been recreated sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'my_idx'") f = sql_lyr.GetNextFeature() assert f is not None f = None ds.ReleaseResultSet(sql_lyr) ds.ExecuteSQL('VACUUM') ds = None # Try on read-only dataset ds = ogr.Open(dbname) lyr = ds.GetLayer(0) with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('foo'), ogr.ALTER_ALL_FLAG) assert ret != 0 ds = None # Check that there is no more any reference to the layer f = gdal.VSIFOpenL(dbname, 'rb') content = gdal.VSIFReadL(1, 1000000, f).decode('latin1') gdal.VSIFCloseL(f) assert 'foo' not in content gdaltest.gpkg_dr.DeleteDataSource(dbname) # Test failed DB re-opening ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) # Unlink before AlterFieldDefn gdal.Unlink(dbname) with gdaltest.error_handler(): ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('bar'), ogr.ALTER_ALL_FLAG) assert ret != 0 with gdaltest.error_handler(): ds = None gdaltest.gpkg_dr.DeleteDataSource(dbname) ############################################################################### # Test ReorderFields() def test_ogr_gpkg_37(): if gdaltest.gpkg_dr is None: pytest.skip() dbname = '/vsimem/ogr_gpkg_37.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(10) f.SetField('foo', 'fooval') f.SetField('bar', 'barval') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) ds.ExecuteSQL("""CREATE TABLE gpkg_data_columns ( table_name TEXT NOT NULL, column_name TEXT NOT NULL, name TEXT UNIQUE, title TEXT, description TEXT, mime_type TEXT, constraint_name TEXT, CONSTRAINT pk_gdc PRIMARY KEY (table_name, column_name), CONSTRAINT fk_gdc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name) )""") ds.ExecuteSQL("INSERT INTO gpkg_data_columns VALUES('test', 'foo', 'constraint', NULL, NULL, NULL, NULL)") ds.ExecuteSQL("INSERT INTO gpkg_extensions VALUES('test', 'foo', 'extension_name', 'definition', 'scope')") ds.ExecuteSQL("CREATE INDEX my_idx_foo ON test(foo)") ds.ExecuteSQL("CREATE INDEX my_idx_bar ON test(bar)") assert lyr.TestCapability(ogr.OLCReorderFields) == 1 with gdaltest.error_handler(): ret = lyr.ReorderFields([-1, -1]) assert ret != 0 assert lyr.ReorderFields([1, 0]) == 0 lyr.ResetReading() assert lyr.GetLayerDefn().GetFieldIndex('foo') == 1 and lyr.GetLayerDefn().GetFieldIndex('bar') == 0 f = lyr.GetNextFeature() if f.GetFID() != 10 or f['foo'] != 'fooval' or f['bar'] != 'barval' or \ f.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': f.DumpReadable() pytest.fail() # Check that index has been recreated sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'my_idx_foo' OR name = 'my_idx_bar'") assert sql_lyr.GetFeatureCount() == 2 ds.ReleaseResultSet(sql_lyr) ds = None # Try on read-only dataset ds = ogr.Open(dbname) lyr = ds.GetLayer(0) with gdaltest.error_handler(): ret = lyr.ReorderFields([1, 0]) assert ret != 0 ds = None gdaltest.gpkg_dr.DeleteDataSource(dbname) ############################################################################### # Test GetExtent() and RECOMPUTE EXTENT ON def test_ogr_gpkg_38(options=['SPATIAL_INDEX=YES']): if gdaltest.gpkg_dr is None: pytest.skip() dbname = '/vsimem/ogr_gpkg_38.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) lyr = ds.CreateLayer('test', geom_type=ogr.wkbLineString, options=options) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)')) lyr.CreateFeature(f) ds = None # Simulate that extent is not recorded ds = ogr.Open(dbname, update=1) ds.ExecuteSQL('UPDATE gpkg_contents SET min_x = NULL, min_y = NULL, max_x = NULL, max_y = NULL') ds = None ds = ogr.Open(dbname, update=1) lyr = ds.GetLayer(0) extent = lyr.GetExtent(force=0, can_return_null=True) assert extent is None # Test that we can compute the extent of a layer that has none registered in gpkg_contents extent = lyr.GetExtent(force=1) assert extent == (1, 3, 2, 4) sql_lyr = ds.ExecuteSQL('SELECT min_x, min_y, max_x, max_y FROM gpkg_contents') f = sql_lyr.GetNextFeature() if f['min_x'] != 1 or f['min_y'] != 2 or f['max_x'] != 3 or f['max_y'] != 4: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) extent = lyr.GetExtent(force=0) assert extent == (1, 3, 2, 4) # Modify feature f = lyr.GetFeature(1) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (-1 -2,-3 -4)')) lyr.SetFeature(f) # The extent has grown extent = lyr.GetExtent(force=0) assert extent == (-3.0, 3.0, -4.0, 4.0) ds.ExecuteSQL('RECOMPUTE EXTENT ON test') extent = lyr.GetExtent(force=0) assert extent == (-3.0, -1.0, -4.0, -2.0) ds = None ds = ogr.Open(dbname) lyr = ds.GetLayer(0) extent = lyr.GetExtent(force=0) assert extent == (-3.0, -1.0, -4.0, -2.0) ds = None ds = ogr.Open(dbname, update=1) lyr = ds.GetLayer(0) # Delete last feature lyr.DeleteFeature(1) # This should cancel NULLify the extent in gpkg_contents ds.ExecuteSQL('RECOMPUTE EXTENT ON test') extent = lyr.GetExtent(force=0, can_return_null=True) assert extent is None ds = None ds = ogr.Open(dbname) lyr = ds.GetLayer(0) extent = lyr.GetExtent(force=0, can_return_null=True) assert extent is None ds = None gdaltest.gpkg_dr.DeleteDataSource(dbname) def test_ogr_gpkg_38_nospi(): return test_ogr_gpkg_38(options=['SPATIAL_INDEX=NO']) ############################################################################### # Test checking of IDENTIFIER unicity def test_ogr_gpkg_39(): if gdaltest.gpkg_dr is None: pytest.skip() dbname = '/vsimem/ogr_gpkg_39.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(dbname) ds.CreateLayer('test') lyr = ds.CreateLayer('test_with_explicit_identifier', options=['IDENTIFIER=explicit_identifier']) assert lyr is not None # Allow overwriting lyr = ds.CreateLayer('test_with_explicit_identifier', options=['IDENTIFIER=explicit_identifier', 'OVERWRITE=YES']) assert lyr is not None with gdaltest.error_handler(): lyr = ds.CreateLayer('test2', options=['IDENTIFIER=test']) assert lyr is None with gdaltest.error_handler(): lyr = ds.CreateLayer('test2', options=['IDENTIFIER=explicit_identifier']) assert lyr is None ds.ExecuteSQL("INSERT INTO gpkg_contents ( table_name, identifier, data_type ) VALUES ( 'some_table', 'another_identifier', 'some_data_type' )") with gdaltest.error_handler(): lyr = ds.CreateLayer('test2', options=['IDENTIFIER=another_identifier']) assert lyr is None ds = None gdaltest.gpkg_dr.DeleteDataSource(dbname) ############################################################################### # Run creating a non-spatial layer that is registered as 'attributes' and # read it back def test_ogr_gpkg_40(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_40.gpkg') ds.CreateLayer('aspatial', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=GPKG_ATTRIBUTES']) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_40.gpkg') assert ds.GetLayerCount() == 1 sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_contents WHERE table_name != 'ogr_empty_table'") assert sql_lyr.GetFeatureCount() == 1 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT * FROM gpkg_geometry_columns WHERE table_name != 'ogr_empty_table'") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_extensions'") assert sql_lyr.GetFeatureCount() == 0 ds.ReleaseResultSet(sql_lyr) ds = None assert validate('/vsimem/ogr_gpkg_40.gpkg'), 'validation failed' gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_40.gpkg') ############################################################################### # Test tables without integer primary key (#6799), and unrecognized column type def test_ogr_gpkg_41(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_41.gpkg') ds.ExecuteSQL('CREATE TABLE foo (mycol VARCHAR_ILLEGAL)') ds.ExecuteSQL("INSERT INTO foo VALUES ('myval')") ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name,data_type,identifier,description,last_change,srs_id) VALUES ('foo','attributes','foo','','',0)") ds = None ds = ogr.Open('/vsimem/ogr_gpkg_41.gpkg') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() if f['mycol'] != 'myval' or f.GetFID() != 1: f.DumpReadable() pytest.fail() ds = None ds = ogr.Open('/vsimem/ogr_gpkg_41.gpkg') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetFeature(1) if f['mycol'] != 'myval' or f.GetFID() != 1: f.DumpReadable() pytest.fail() ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_41.gpkg') ############################################################################### # Test feature_count def foo_has_trigger(ds): sql_lyr = ds.ExecuteSQL( "SELECT COUNT(*) FROM sqlite_master WHERE name = 'trigger_insert_feature_count_foo'", dialect='DEBUG') f = sql_lyr.GetNextFeature() has_trigger = f.GetField(0) == 1 f = None ds.ReleaseResultSet(sql_lyr) return has_trigger def get_feature_count_from_gpkg_contents(ds): sql_lyr = ds.ExecuteSQL('SELECT feature_count FROM gpkg_ogr_contents', dialect='DEBUG') f = sql_lyr.GetNextFeature() val = f.GetField(0) f = None ds.ReleaseResultSet(sql_lyr) return val def test_ogr_gpkg_42(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_42.gpkg') lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('i', ogr.OFTInteger)) for i in range(5): f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, i) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg') lyr = ds.GetLayer(0) assert get_feature_count_from_gpkg_contents(ds) == 5 assert foo_has_trigger(ds) assert lyr.TestCapability(ogr.OLCFastFeatureCount) != 0 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 10) lyr.CreateFeature(f) # Has been invalidated for now assert get_feature_count_from_gpkg_contents(ds) is None assert not foo_has_trigger(ds) fc = lyr.GetFeatureCount() assert fc == 6 ds.ExecuteSQL('DELETE FROM foo WHERE i = 1') assert foo_has_trigger(ds) assert get_feature_count_from_gpkg_contents(ds) is None fc = lyr.GetFeatureCount() assert fc == 5 assert get_feature_count_from_gpkg_contents(ds) == 5 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 5 ds.ExecuteSQL('UPDATE gpkg_ogr_contents SET feature_count = NULL') ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) lyr = ds.GetLayer(0) assert get_feature_count_from_gpkg_contents(ds) is None fc = lyr.GetFeatureCount() assert fc == 5 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) assert get_feature_count_from_gpkg_contents(ds) == 5 # So as to test that we really read from gpkg_ogr_contents ds.ExecuteSQL('UPDATE gpkg_ogr_contents SET feature_count = 5000') ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 5000 # Test renaming ds.ExecuteSQL('ALTER TABLE foo RENAME TO bar') ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) sql_lyr = ds.ExecuteSQL("SELECT feature_count FROM gpkg_ogr_contents WHERE table_name = 'bar'", dialect='DEBUG') f = sql_lyr.GetNextFeature() val = f.GetField(0) f = None ds.ReleaseResultSet(sql_lyr) assert val == 5000 # Test layer deletion ds.DeleteLayer(0) sql_lyr = ds.ExecuteSQL("SELECT feature_count FROM gpkg_ogr_contents WHERE table_name != 'ogr_empty_table'", dialect='DEBUG') f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) ds = None # Test without feature_count column ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_42.gpkg', options=['ADD_GPKG_OGR_CONTENTS=FALSE']) lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('i', ogr.OFTInteger)) for i in range(5): f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, i) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_gpkg_42.gpkg', update=1) # Check that feature_count column is missing sql_lyr = ds.ExecuteSQL('PRAGMA table_info(gpkg_contents)') fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 10 assert not foo_has_trigger(ds) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 0 fc = lyr.GetFeatureCount() assert fc == 5 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 10) lyr.CreateFeature(f) lyr = ds.GetLayer(0) fc = lyr.GetFeatureCount() assert fc == 6 ds.ExecuteSQL('DELETE FROM foo WHERE i = 1') fc = lyr.GetFeatureCount() assert fc == 5 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_42.gpkg') ############################################################################### # Test limitations on number of tables def test_ogr_gpkg_43(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_43.gpkg') ds.StartTransaction() for i in range(1001): ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, data_type, identifier) " + "VALUES ('tiles%d', 'tiles', 'tiles%d')" % (i + 1, i + 1)) ds.ExecuteSQL("INSERT INTO gpkg_tile_matrix_set VALUES " + "('tiles%d', 0, 440720, 3750120, 441920, 3751320)" % (i + 1)) for i in range(1001): ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, data_type, identifier) " + "VALUES ('attr%d', 'attributes', 'attr%d')" % (i + 1, i + 1)) ds.ExecuteSQL("CREATE TABLE attr%d (id INTEGER PRIMARY KEY AUTOINCREMENT)" % (i + 1)) ds.CommitTransaction() ds = None with gdaltest.error_handler(): ds = gdal.Open('/vsimem/ogr_gpkg_43.gpkg') assert len(ds.GetMetadata_List('SUBDATASETS')) == 2 * 1000 ds = None gdal.SetConfigOption('OGR_TABLE_LIMIT', '1000') with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_43.gpkg') gdal.SetConfigOption('OGR_TABLE_LIMIT', None) assert ds.GetLayerCount() == 1000 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_43.gpkg') ############################################################################### # Test GeoPackage without metadata table def test_ogr_gpkg_44(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.SetConfigOption('CREATE_METADATA_TABLES', 'NO') ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_44.gpkg') ds.CreateLayer('foo') ds = None gdal.SetConfigOption('CREATE_METADATA_TABLES', None) assert validate('/vsimem/ogr_gpkg_44.gpkg'), 'validation failed' ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg') md = ds.GetMetadata() assert md == {} md = ds.GetLayer(0).GetMetadata() assert md == {} sql_lyr = ds.ExecuteSQL("SELECT * FROM sqlite_master WHERE name = 'gpkg_metadata'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 0 ds = None ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg', update=1) ds.SetMetadataItem('FOO', 'BAR') ds = None ds = ogr.Open('/vsimem/ogr_gpkg_44.gpkg') md = ds.GetMetadata() assert md == {'FOO': 'BAR'} ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_44.gpkg') ############################################################################### # Test non conformant GeoPackage: table with non INTEGER PRIMARY KEY def test_ogr_gpkg_45(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_45.gpkg') ds.ExecuteSQL('CREATE TABLE test (a INTEGER, b INTEGER, CONSTRAINT pkid_constraint PRIMARY KEY (a, b))') ds.ExecuteSQL("INSERT INTO gpkg_contents ( table_name, identifier, data_type ) VALUES ( 'test', 'test', 'attributes' )") ds = None ds = ogr.Open('/vsimem/ogr_gpkg_45.gpkg') lyr = ds.GetLayer(0) assert lyr.GetFIDColumn() == '' assert lyr.GetLayerDefn().GetFieldCount() == 2 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_45.gpkg') ############################################################################### # Test spatial view and spatial index def test_ogr_gpkg_46(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_46.gpkg') lyr = ds.CreateLayer('foo') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) lyr.CreateFeature(f) ds.ExecuteSQL('CREATE VIEW my_view AS SELECT geom AS my_geom, fid AS my_fid FROM foo') ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'my_view', 'my_view', 'features', 0 )") ds.ExecuteSQL("INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('my_view', 'my_geom', 'GEOMETRY', 0, 0, 0)") ds.ExecuteSQL("CREATE VIEW my_view2 AS SELECT geom, fid AS OGC_FID, 'bla' as another_column FROM foo") ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'my_view2', 'my_view2', 'features', 0 )") ds.ExecuteSQL("INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('my_view2', 'geom', 'GEOMETRY', 0, 0, 0)") ds.ExecuteSQL('CREATE VIEW my_view3 AS SELECT a.fid, a.geom, b.fid as fid2 FROM foo a, foo b') ds.ExecuteSQL("INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'my_view3', 'my_view3', 'features', 0 )") ds.ExecuteSQL("INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('my_view3', 'geom', 'GEOMETRY', 0, 0, 0)") ds = None ds = ogr.Open('/vsimem/ogr_gpkg_46.gpkg', update=1) lyr = ds.GetLayerByName('my_view') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetGeometryColumn() == 'my_geom' # Operations not valid on a view with gdaltest.error_handler(): ds.ReleaseResultSet(ds.ExecuteSQL("SELECT CreateSpatialIndex('my_view', 'my_geom')")) ds.ReleaseResultSet(ds.ExecuteSQL("SELECT DisableSpatialIndex('my_view', 'my_geom')")) lyr.AlterFieldDefn(0, lyr.GetLayerDefn().GetFieldDefn(0), ogr.ALTER_ALL_FLAG) lyr.DeleteField(0) lyr.ReorderFields([0]) lyr.CreateField(ogr.FieldDefn('bar')) # Check if spatial index is recognized sql_lyr = ds.ExecuteSQL("SELECT HasSpatialIndex('my_view', 'my_geom')") f = sql_lyr.GetNextFeature() has_spatial_index = f.GetField(0) == 1 ds.ReleaseResultSet(sql_lyr) if not has_spatial_index: ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_46.gpkg') pytest.skip('SQLite likely built without SQLITE_HAS_COLUMN_METADATA') # Effectively test spatial index lyr.SetSpatialFilterRect(-0.5, -0.5, 0.5, 0.5) assert lyr.GetFeatureCount() == 1 f = lyr.GetNextFeature() assert f is not None f = lyr.GetNextFeature() assert f is None # View with FID lyr = ds.GetLayerByName('my_view2') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetFIDColumn() == 'OGC_FID' f = lyr.GetNextFeature() if f.GetFID() != 1 or f.GetField(0) != 'bla': f.DumpReadable() pytest.fail() # View without valid rowid lyr = ds.GetLayerByName('my_view3') assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() if f.GetFID() != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetFID() != 1: f.DumpReadable() pytest.fail() f2 = lyr.GetFeature(1) if not f.Equal(f2): f.DumpReadable() f2.DumpReadable() pytest.fail() ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_46.gpkg') ############################################################################### # Test corner case of Identify() def test_ogr_gpkg_47(): if gdaltest.gpkg_dr is None: pytest.skip() gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg') # Set wrong application_id fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb+') gdal.VSIFSeekL(fp, 68, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) assert ds is not None assert gdal.GetLastErrorMsg() != '' gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', 'NO') ogr.Open('/vsimem/ogr_gpkg_47.gpkg') gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', None) assert gdal.GetLastErrorMsg() == '' gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg', options=['VERSION=1.2']) # Set wrong user_version fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb+') gdal.VSIFSeekL(fp, 60, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) assert ds is not None assert gdal.GetLastErrorMsg() != '' ds = None gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', 'NO') ogr.Open('/vsimem/ogr_gpkg_47.gpkg') gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', None) assert gdal.GetLastErrorMsg() == '' # Set GPKG 1.2.1 gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg', options=['VERSION=1.2']) # Set user_version fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb+') gdal.VSIFSeekL(fp, 60, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0x27, 0xD9), 4, 1, fp) gdal.VSIFCloseL(fp) ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) assert ds is not None assert gdal.GetLastErrorMsg() == '' ds = None gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', 'NO') ogr.Open('/vsimem/ogr_gpkg_47.gpkg') gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', None) assert gdal.GetLastErrorMsg() == '' # Set GPKG 1.3.0 gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg', options=['VERSION=1.2']) # Set user_version fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb+') gdal.VSIFSeekL(fp, 60, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0x28, 0x3C), 4, 1, fp) gdal.VSIFCloseL(fp) with gdaltest.error_handler(): ds = ogr.Open('/vsimem/ogr_gpkg_47.gpkg', update=1) assert ds is not None assert gdal.GetLastErrorMsg() != '' gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', 'NO') ogr.Open('/vsimem/ogr_gpkg_47.gpkg') gdal.SetConfigOption('GPKG_WARN_UNRECOGNIZED_APPLICATION_ID', None) assert gdal.GetLastErrorMsg() == '' # Just for the sake of coverage testing in DEBUG mode with gdaltest.error_handler(): gdaltest.gpkg_dr.CreateDataSource('/vsimem/.cur_input') # Set wrong application_id fp = gdal.VSIFOpenL('/vsimem/.cur_input', 'rb+') gdal.VSIFSeekL(fp, 68, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) ogr.Open('/vsimem/.cur_input') gdal.Unlink('/vsimem/.cur_input') with gdaltest.error_handler(): gdaltest.gpkg_dr.CreateDataSource('/vsimem/.cur_input', options=['VERSION=1.2']) # Set wrong user_version fp = gdal.VSIFOpenL('/vsimem/.cur_input', 'rb+') gdal.VSIFSeekL(fp, 60, 0) gdal.VSIFWriteL(struct.pack('B' * 4, 0, 0, 0, 0), 4, 1, fp) gdal.VSIFCloseL(fp) ogr.Open('/vsimem/.cur_input') gdal.Unlink('/vsimem/.cur_input') # Test reading in a zip ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_47.gpkg') ds.CreateLayer('foo') ds = None fp = gdal.VSIFOpenL('/vsimem/ogr_gpkg_47.gpkg', 'rb') content = gdal.VSIFReadL(1, 1000000, fp) gdal.VSIFCloseL(fp) fzip = gdal.VSIFOpenL('/vsizip//vsimem/ogr_gpkg_47.zip', 'wb') fp = gdal.VSIFOpenL('/vsizip//vsimem/ogr_gpkg_47.zip/my.gpkg', 'wb') gdal.VSIFWriteL(content, 1, len(content), fp) gdal.VSIFCloseL(fp) gdal.VSIFCloseL(fzip) ds = ogr.Open('/vsizip//vsimem/ogr_gpkg_47.zip') assert ds.GetDriver().GetName() == 'GPKG' ds = None gdal.Unlink('/vsimem/ogr_gpkg_47.zip') gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_47.gpkg') ############################################################################### # Test insertion of features with unset fields def test_ogr_gpkg_48(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_48.gpkg') lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('a')) lyr.CreateField(ogr.FieldDefn('b')) lyr.CreateField(ogr.FieldDefn('c')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('a', 'a') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('b', 'b') f.SetField('c', 'c') lyr.CreateFeature(f) lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField('a') != 'a' or f.GetField('b') is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('b') != 'b' or f.GetField('c') != 'c' or f.GetField('a') is not None: f.DumpReadable() pytest.fail() # No geom field, one single field with default value lyr = ds.CreateLayer('default_field_no_geom', geom_type=ogr.wkbNone) fld_defn = ogr.FieldDefn('foo') fld_defn.SetDefault('x') lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) assert lyr.CreateFeature(f) == 0 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField('foo') != 'x': f.DumpReadable() pytest.fail() f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1) assert lyr.SetFeature(f) == 0 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField('foo') != 'x': f.DumpReadable() pytest.fail() ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_48.gpkg') ############################################################################### # Test CreateGeomField() on a attributes layer def test_ogr_gpkg_49(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_49.gpkg') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['ASPATIAL_VARIANT=GPKG_ATTRIBUTES']) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None field_defn = ogr.GeomFieldDefn('', ogr.wkbPoint) assert lyr.CreateGeomField(field_defn) == 0 ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_49.gpkg') ############################################################################### # Test minimalistic support of definition_12_063 def test_ogr_gpkg_50(): if gdaltest.gpkg_dr is None: pytest.skip() gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', 'YES') gdaltest.gpkg_dr.CreateDataSource('/vsimem/ogr_gpkg_50.gpkg') gdal.SetConfigOption('GPKG_ADD_DEFINITION_12_063', None) ds = ogr.Open('/vsimem/ogr_gpkg_50.gpkg', update=1) srs32631 = osr.SpatialReference() srs32631.ImportFromEPSG(32631) ds.CreateLayer('test', srs=srs32631) # No authority node srs_without_org = osr.SpatialReference() srs_without_org.SetFromUserInput("""GEOGCS["another geogcs", DATUM["another datum", SPHEROID["another spheroid",1000,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]""") lyr = ds.CreateLayer('without_org', srs=srs_without_org) ds = None assert validate('/vsimem/ogr_gpkg_50.gpkg'), 'validation failed' ds = ogr.Open('/vsimem/ogr_gpkg_50.gpkg') lyr = ds.GetLayer('test') assert lyr.GetSpatialRef().IsSame(srs32631) lyr = ds.GetLayer('without_org') assert lyr.GetSpatialRef().IsSame(srs_without_org) sql_lyr = ds.ExecuteSQL('SELECT definition_12_063 FROM gpkg_spatial_ref_sys WHERE srs_id = 32631') f = sql_lyr.GetNextFeature() assert f.GetField(0).startswith('PROJCRS["WGS 84 / UTM zone 31N"') ds.ReleaseResultSet(sql_lyr) ds = None gdaltest.gpkg_dr.DeleteDataSource('/vsimem/ogr_gpkg_50.gpkg') ############################################################################### # Test opening a .gpkg.sql file def test_ogr_gpkg_51(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': pytest.skip() ds = ogr.Open('data/poly.gpkg.sql') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None ############################################################################### # Test opening a .gpkg file def test_ogr_gpkg_52(): if gdaltest.gpkg_dr is None: pytest.skip() ds = ogr.Open('data/poly_non_conformant.gpkg') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() assert f is not None ############################################################################### # Test opening a .gpkg file with inconsistency regarding table case (#6916) def test_ogr_gpkg_53(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': pytest.skip() ds = ogr.Open('data/poly_inconsistent_case.gpkg.sql') assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' data/poly_inconsistent_case.gpkg.sql') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test editing of a database with 2 layers (https://issues.qgis.org/issues/17034) def test_ogr_gpkg_54(): if gdaltest.gpkg_dr is None: pytest.skip() # Must be on a real file system to demonstrate potential locking # issue tmpfile = 'tmp/ogr_gpkg_54.gpkg' ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile) lyr = ds.CreateLayer('layer1', geom_type=ogr.wkbPoint) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('layer2', geom_type=ogr.wkbPoint) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) lyr.CreateFeature(f) f = None ds = None ds1 = ogr.Open(tmpfile, update=1) ds2 = ogr.Open(tmpfile, update=1) lyr1 = ds1.GetLayer(0) lyr2 = ds2.GetLayer(1) f1 = lyr1.GetFeature(1) f1.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) lyr1.SetFeature(f1) f2 = lyr2.GetFeature(1) f2.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) lyr2.SetFeature(f2) f1 = lyr1.GetFeature(1) f1.SetGeometry(ogr.CreateGeometryFromWkt('POINT (5 6)')) lyr1.SetFeature(f1) f2 = lyr2.GetFeature(1) f2.SetGeometry(ogr.CreateGeometryFromWkt('POINT (7 8)')) lyr2.SetFeature(f2) ds1 = None ds2 = None ds = ogr.Open(tmpfile) lyr1 = ds.GetLayer(0) f = lyr1.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (5 6)': f.DumpReadable() pytest.fail() lyr2 = ds.GetLayer(1) f = lyr2.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (7 8)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink(tmpfile) ############################################################################### # Test inserting geometries incompatible with declared layer geometry type def test_ogr_gpkg_55(): if gdaltest.gpkg_dr is None: pytest.skip() tmpfile = '/vsimem/ogr_gpkg_55.gpkg' ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile) lyr = ds.CreateLayer('layer1', geom_type=ogr.wkbLineString) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.ErrorReset() with gdaltest.error_handler(): lyr.CreateFeature(f) assert gdal.GetLastErrorMsg() != '', 'should have warned' f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 1)')) gdal.ErrorReset() lyr.CreateFeature(f) assert gdal.GetLastErrorMsg() == '', 'should NOT have warned' f = None ds = None gdal.Unlink(tmpfile) ############################################################################### # Test FID identification on SQL result layer def test_ogr_gpkg_56(): if gdaltest.gpkg_dr is None: pytest.skip() ds = gdal.VectorTranslate('/vsimem/ogr_gpkg_56.gpkg', 'data/poly.shp', format='GPKG') lyr = ds.ExecuteSQL('select a.fid as fid1, b.fid as fid2 from poly a, poly b order by fid1, fid2') lyr.GetNextFeature() f = lyr.GetNextFeature() if f.GetField('fid1') != 1 or f.GetField('fid2') != 2: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(lyr) ds = None gdal.Unlink('/vsimem/ogr_gpkg_56.gpkg') ############################################################################### # Test opening a corrupted gpkg with duplicated layer names def test_ogr_gpkg_57(): if gdaltest.gpkg_dr is None: pytest.skip() if gdaltest.gpkg_dr.GetMetadataItem("ENABLE_SQL_GPKG_FORMAT") != 'YES': pytest.skip() tmpfile = '/vsimem/tmp.gpkg.txt' gdal.FileFromMemBuffer(tmpfile, """-- SQL GPKG CREATE TABLE gpkg_spatial_ref_sys (srs_name,srs_id,organization,organization_coordsys_id,definition,description); INSERT INTO "gpkg_spatial_ref_sys" VALUES('',0,'NONE',0,'undefined',''); CREATE TABLE gpkg_contents (table_name,data_type,identifier,description,last_change,min_x, min_y,max_x, max_y,srs_id); INSERT INTO "gpkg_contents" VALUES('poly','features','poly','','',NULL,NULL,NULL,NULL,0); INSERT INTO "gpkg_contents" VALUES('poly','features','poly','','',NULL,NULL,NULL,NULL,0); CREATE TABLE gpkg_geometry_columns (table_name,column_name,geometry_type_name,srs_id,z,m); INSERT INTO "gpkg_geometry_columns" VALUES('poly','geom','POLYGON',0,0,0); CREATE TABLE "poly"("fid" INTEGER PRIMARY KEY, "geom" POLYGON); """) with gdaltest.error_handler(): ds = ogr.Open(tmpfile) assert ds.GetLayerCount() == 1, 'bad layer count' assert gdal.GetLastErrorMsg().find('Table poly appearing several times') >= 0, \ 'should NOT have warned' ds = None gdal.Unlink(tmpfile) ############################################################################### # Test overwriting a layer def test_ogr_gpkg_58(): if gdaltest.gpkg_dr is None: pytest.skip() out_filename = '/vsimem/ogr_gpkg_58.gpkg' gdal.VectorTranslate(out_filename, 'data/poly.shp', format='GPKG') gdal.VectorTranslate(out_filename, 'data/poly.shp', format='GPKG', accessMode='overwrite') ds = ogr.Open(out_filename) sql_lyr = ds.ExecuteSQL("SELECT HasSpatialIndex('poly', 'geom')") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 1 ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink(out_filename) ############################################################################### # Test CreateSpatialIndex() def test_ogr_gpkg_59(): if gdaltest.gpkg_dr is None: pytest.skip() out_filename = '/vsimem/ogr_gpkg_59.gpkg' gdal.VectorTranslate(out_filename, 'data/poly.shp', format='GPKG', layerCreationOptions=['SPATIAL_INDEX=NO']) ds = ogr.Open(out_filename, update=1) sql_lyr = ds.ExecuteSQL("SELECT CreateSpatialIndex('poly', 'geom')") f = sql_lyr.GetNextFeature() assert f.GetField(0) == 1 ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink(out_filename) ############################################################################### # Test savepoints def test_ogr_gpkg_savepoint(): if gdaltest.gpkg_dr is None: pytest.skip() filename = '/vsimem/ogr_gpkg_savepoint.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(filename) lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f['str'] = 'foo' lyr.CreateFeature(f) ds = None ds = ogr.Open(filename, update=1) lyr = ds.GetLayer(0) ds.StartTransaction() ds.ExecuteSQL('SAVEPOINT pt') lyr.DeleteFeature(1) ds.ExecuteSQL('ROLLBACK TO SAVEPOINT pt') f = ogr.Feature(lyr.GetLayerDefn()) f['str'] = 'bar' lyr.CreateFeature(f) ds.CommitTransaction() ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2 ds = None gdal.Unlink(filename) ############################################################################### # Test that we don't open file handles behind the back of sqlite3 def test_ogr_gpkg_wal(): if gdaltest.gpkg_dr is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogrinfo_path() is None: pytest.skip() # needs to be a real file filename = 'tmp/ogr_gpkg_wal.gpkg' with gdaltest.config_option('OGR_SQLITE_JOURNAL', 'WAL'): ds = gdaltest.gpkg_dr.CreateDataSource(filename) ds.CreateLayer('foo') ds = None ds = ogr.Open(filename, update=1) os.stat(filename + '-wal') # Re-open in read-only mode ds_ro = ogr.Open(filename) ds_ro.GetName() os.stat(filename + '-wal') # Test external process to read the file gdaltest.runexternal(test_cli_utilities.get_ogrinfo_path() + ' ' + filename) # The file must still exist os.stat(filename + '-wal') ds = None ds_ro = None gdal.Unlink(filename) gdal.Unlink(filename + '-wal') gdal.Unlink(filename + '-shm') ############################################################################### # Run test_ogrsf def test_ogr_gpkg_test_ogrsf(): if gdaltest.gpkg_dr is None: pytest.skip() # Do integrity check first sql_lyr = gdaltest.gpkg_ds.ExecuteSQL("PRAGMA integrity_check") feat = sql_lyr.GetNextFeature() assert feat.GetField(0) == 'ok', 'integrity check failed' gdaltest.gpkg_ds.ReleaseResultSet(sql_lyr) import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() gdaltest.gpkg_ds = None # sys.exit(0) ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/gpkg_test.gpkg --config OGR_SQLITE_SYNCHRONOUS OFF') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/gpkg_test.gpkg -sql "select * from tbl_linestring_renamed" --config OGR_SQLITE_SYNCHRONOUS OFF') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test JSon subtype support def test_ogr_gpkg_json(): if gdaltest.gpkg_dr is None: pytest.skip() filename = '/vsimem/ogr_gpkg_json.gpkg' ds = gdaltest.gpkg_dr.CreateDataSource(filename) lyr = ds.CreateLayer('test') fld_defn = ogr.FieldDefn('test_json', ogr.OFTString) fld_defn.SetSubType(ogr.OFSTJSON) lyr.CreateField(fld_defn) assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTJSON ds.ReleaseResultSet(ds.ExecuteSQL('SELECT 1 FROM test')) # will crystalize fld_defn = ogr.FieldDefn('test2_json', ogr.OFTString) fld_defn.SetSubType(ogr.OFSTJSON) lyr.CreateField(fld_defn) assert lyr.GetLayerDefn().GetFieldDefn(1).GetSubType() == ogr.OFSTJSON fld_defn = ogr.FieldDefn('test_string', ogr.OFTString) lyr.CreateField(fld_defn) ds = None ds = ogr.Open(filename, update = 1) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTJSON assert lyr.GetLayerDefn().GetFieldDefn(1).GetSubType() == ogr.OFSTJSON # Demote field from JSON new_defn = ogr.FieldDefn('test_was_json_now_string', ogr.OFTString) assert lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('test2_json'), new_defn, ogr.ALTER_ALL_FLAG) == 0 # Alter field to JSON new_defn = ogr.FieldDefn('test_was_string_now_json', ogr.OFTString) new_defn.SetSubType(ogr.OFSTJSON) assert lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('test_string'), new_defn, ogr.ALTER_ALL_FLAG) == 0 # Delete JSON field assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('test_json')) == 0 ds = None assert validate(filename), 'validation failed' ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert (lyr.GetLayerDefn().GetFieldDefn( lyr.GetLayerDefn().GetFieldIndex('test_was_json_now_string')).GetSubType() == ogr.OFSTNone) assert (lyr.GetLayerDefn().GetFieldDefn( lyr.GetLayerDefn().GetFieldIndex('test_was_string_now_json')).GetSubType() == ogr.OFSTJSON) sql_lyr = ds.ExecuteSQL("SELECT 1 FROM gpkg_data_columns WHERE table_name = 'test'") fc = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert fc == 1 ds = None gdal.Unlink(filename) ############################################################################### # Remove the test db from the tmp directory def test_ogr_gpkg_cleanup(): if gdaltest.gpkg_dr is None: pytest.skip() gdaltest.gpkg_ds = None if gdal.ReadDir('/vsimem') is not None: print(gdal.ReadDir('/vsimem')) for f in gdal.ReadDir('/vsimem'): gdal.Unlink('/vsimem/' + f) try: os.remove('tmp/gpkg_test.gpkg') except OSError: pass ############################################################################### gdalautotest-3.0.4/ogr/ogr_pds4.py0000755003401500001440000006231113614005326016520 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_pds4.py 74f2ca98e5110097fb45573080d6f51432390160 2019-12-01 18:46:31 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test PDS4 format # Author: Even Rouault, # ############################################################################### # Copyright (c) 2019, 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 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_1B00.xsd', 'pds.nasa.gov_pds4_pds_v1_PDS4_PDS_1B00.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://raw.githubusercontent.com/nasa-pds-data-dictionaries/ldd-cart/master/build/1.B.0.0/PDS4_CART_1B00.xsd', 'raw.githubusercontent.com_nasa_pds_data_dictionaries_ldd_cart_master_build_1.B.0.0_PDS4_CART_1B00.xsd', force_download=True): pytest.skip() 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 ############################################################################### # 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() def test_ogr_pds4_read_table_character(): ds = gdal.OpenEx('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml') assert ds assert ds.GetLayerCount() == 1 fl = ds.GetFileList() assert len(fl) == 2, fl assert 'ele_evt_12hr_orbit_2011-2012_truncated.xml' in fl[0] assert 'ele_evt_12hr_orbit_2011-2012_truncated.tab' in fl[1] assert not ds.GetLayer(-1) assert not ds.GetLayer(1) lyr = ds.GetLayer(0) assert lyr.GetName() == 'ele_evt_12hr_orbit_2011-2012_truncated' assert lyr.GetFeatureCount() == 5 f = lyr.GetNextFeature() assert f.GetFieldCount() == 19 assert f.GetFID() == 1 assert f['Event Number'] == 1.0 assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT Z (224.8604431 28.6008358 408.5436707)' f = lyr.GetNextFeature() assert f.GetFID() == 2 while True: f = lyr.GetNextFeature() if f is None: break last_fid = f.GetFID() assert last_fid == 5 assert not lyr.GetNextFeature() assert not lyr.GetFeature(0) assert not lyr.GetFeature(6) f = lyr.GetFeature(1) assert f.GetFID() == 1 assert f['Event Number'] == 1.0 assert f['BP_LOW'] == 102.4400024 f = lyr.GetFeature(5) assert f.GetFID() == 5 assert f['Event Number'] == 1.0 assert f['BP_LOW'] == 102.9400024 def test_ogr_pds4_read_table_character_test_ogrsf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml') assert 'INFO' in ret and 'ERROR' not in ret def test_ogr_pds4_append_and_modify_table_character(): gdal.FileFromMemBuffer('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml', 'rb').read()) gdal.FileFromMemBuffer('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.tab', open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.tab', 'rb').read()) ds = ogr.Open('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', update = 1) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCSequentialWrite) f = ogr.Feature(lyr.GetLayerDefn()) f['Event Number'] = 123456 assert lyr.CreateFeature(f) == 0 assert f.GetFID() == 6 assert lyr.GetFeatureCount() == 6 f = lyr.GetFeature(6) assert f['Event Number'] == 123456 assert not f.IsFieldSet('MET') ds = None assert validate_xml('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml') # Re-open ds = ogr.Open('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', update = 1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 6 f = lyr.GetFeature(6) assert f['Event Number'] == 123456 assert f.GetGeometryRef() is None ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml') def test_ogr_pds4_delete_from_table_character(): gdal.FileFromMemBuffer('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml', 'rb').read()) gdal.FileFromMemBuffer('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.tab', open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.tab', 'rb').read()) ds = ogr.Open('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', update = 1) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCDeleteFeature) assert lyr.DeleteFeature(2) == 0 assert lyr.GetFeatureCount() == 4 ds = None f = gdal.VSIFOpenL('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'Energetic Electron events, 12 hour orbit, 2011-2012' in data assert 'Target-centric latitude of the spacecraft' in data assert 'EE event number. The value is repeated for' in data assert '' in data assert validate_xml('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml') # Re-open ds = ogr.Open('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml', update = 1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 4 f = lyr.GetNextFeature() assert f.GetFieldCount() == 19 assert f.GetFID() == 1 assert f['Event Number'] == 1.0 assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT Z (224.8604431 28.6008358 408.5436707)' f = lyr.GetFeature(4) assert f['BP_LOW'] == 102.9400024 ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/ele_evt_12hr_orbit_2011-2012_truncated.xml') def test_ogr_pds4_read_write_table_character_test_ogrsf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() open('tmp/ele_evt_12hr_orbit_2011-2012_truncated.xml', 'wb').write( open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml', 'rb').read()) open('tmp/ele_evt_12hr_orbit_2011-2012_truncated.tab', 'wb').write( open('data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.tab', 'rb').read()) ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/ele_evt_12hr_orbit_2011-2012_truncated.xml') gdal.Unlink('tmp/ele_evt_12hr_orbit_2011-2012_truncated.xml') gdal.Unlink('tmp/ele_evt_12hr_orbit_2011-2012_truncated.tab') assert 'INFO' in ret and 'ERROR' not in ret, ret def test_ogr_pds4_create_table_character(): options = ['VAR_LOGICAL_IDENTIFIER=logical_identifier', 'VAR_TITLE=title', 'VAR_INVESTIGATION_AREA_NAME=ian', 'VAR_INVESTIGATION_AREA_LID_REFERENCE=INVESTIGATION_AREA_LID_REFERENCE', 'VAR_OBSERVING_SYSTEM_NAME=osn', 'VAR_TARGET=target', 'VAR_TARGET_TYPE=target'] ds = ogr.GetDriverByName('PDS4').CreateDataSource('/vsimem/test.xml', options=options) lyr = ds.CreateLayer('foo', options=['TABLE_TYPE=CHARACTER']) fld = ogr.FieldDefn('bool', ogr.OFTInteger) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('time', ogr.OFTTime)) f = ogr.Feature(lyr.GetLayerDefn()) f['bool'] = 1 f['int'] = -123456789 f['int64'] = -1234567890123 f['real'] = 1.25 f['str'] = 'foo' f['datetime'] = '2019/01/24 12:34:56.789+00' f['date'] = '2019-01-24' f['time'] = '12:34:56.789' lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/test.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert '_Character' in data assert '_Binary' not in data assert 'LSB' not in data assert 'MSB' not in data assert validate_xml('/vsimem/test.xml') assert gdal.VSIStatL('/vsimem/test/foo.dat') ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 8 f = lyr.GetNextFeature() assert f['bool'] assert f['int'] == -123456789 assert f['int64'] == -1234567890123 assert f['real'] == 1.25 assert f['str'] == 'foo' assert f['datetime'] == '2019/01/24 12:34:56.789+00' assert f['date'] == '2019/01/24' assert f['time'] == '12:34:56.789' ds = None # Add new layer ds = ogr.Open('/vsimem/test.xml', update = 1) lyr = ds.CreateLayer('bar', options=['TABLE_TYPE=CHARACTER']) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['int'] = 123 lyr.CreateFeature(f) ds = None assert validate_xml('/vsimem/test.xml') ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayerByName('bar') f = lyr.GetNextFeature() assert f['int'] == 123 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['int'] == -123456789 ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/test.xml') gdal.Rmdir('/vsimem/test') def test_ogr_pds4_create_with_srs(): ds = ogr.GetDriverByName('PDS4').CreateDataSource('/vsimem/test.xml') sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') lyr = ds.CreateLayer('bar', geom_type = ogr.wkbPoint25D, srs = sr, options=['TABLE_TYPE=CHARACTER', 'SAME_DIRECTORY=YES']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT Z (1 2 3)')) lyr.CreateFeature(f) ds = None assert validate_xml('/vsimem/test.xml') assert gdal.VSIStatL('/vsimem/bar.dat') f = gdal.VSIFOpenL('/vsimem/test.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'bar' in data assert 'bar' in data ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayerByName('bar') assert lyr.GetSpatialRef() assert lyr.GetSpatialRef().IsGeographic() f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT Z (1 2 3)' ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/test.xml') def test_ogr_pds4_create_table_binary(): options = ['VAR_LOGICAL_IDENTIFIER=logical_identifier', 'VAR_TITLE=title', 'VAR_INVESTIGATION_AREA_NAME=ian', 'VAR_INVESTIGATION_AREA_LID_REFERENCE=INVESTIGATION_AREA_LID_REFERENCE', 'VAR_OBSERVING_SYSTEM_NAME=osn', 'VAR_TARGET=target', 'VAR_TARGET_TYPE=target'] for signedness in ['Signed', 'Unsigned']: for endianness in ['LSB', 'MSB']: ds = ogr.GetDriverByName('PDS4').CreateDataSource('/vsimem/test.xml', options=options) layername = endianness with gdaltest.config_options( {'PDS4_ENDIANNESS': endianness, 'PDS4_SIGNEDNESS': signedness} ): lyr = ds.CreateLayer(layername, options = ['TABLE_TYPE=BINARY']) fld = ogr.FieldDefn('bool', ogr.OFTInteger) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) fld = ogr.FieldDefn('byte', ogr.OFTInteger) fld.SetWidth(2) lyr.CreateField(fld) fld = ogr.FieldDefn('int16', ogr.OFTInteger) fld.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) fld = ogr.FieldDefn('float', ogr.OFTReal) fld.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld) lyr.CreateField(ogr.FieldDefn('real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('time', ogr.OFTTime)) sign = -1 if signedness == 'Signed' else 1 f = ogr.Feature(lyr.GetLayerDefn()) f['bool'] = 1 f['byte'] = sign * 9 f['int16'] = sign * 12345 f['int'] = sign * 123456789 f['int64'] = sign * 1234567890123 f['float'] = 1.25 f['real'] = 1.2567 f['str'] = 'foo' f['datetime'] = '2019/01/24 12:34:56.789+00' f['date'] = '2019-01-24' f['time'] = '12:34:56.789' lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/test.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert '_Binary' in data assert '_Character' not in data if endianness == 'LSB': assert 'LSB' in data, data assert 'MSB' not in data, data else: assert 'MSB' in data, data assert 'LSB' not in data, data if signedness == 'Signed': assert 'Signed' in data, data assert 'Unsigned' not in data, data else: assert 'Unsigned' in data, data assert 'Signed' not in data, data assert validate_xml('/vsimem/test.xml') ds = ogr.Open('/vsimem/test.xml') layername = endianness lyr = ds.GetLayerByName(layername) assert lyr.GetLayerDefn().GetFieldCount() == 11 f = lyr.GetNextFeature() assert f['bool'] assert f['byte'] == sign * 9 assert f['int16'] == sign * 12345 assert f['int'] == sign * 123456789 assert f['int64'] == sign * 1234567890123 assert f['float'] == 1.25 assert f['real'] == 1.2567 assert f['str'] == 'foo' assert f['datetime'] == '2019/01/24 12:34:56.789+00' assert f['date'] == '2019/01/24' assert f['time'] == '12:34:56.789' ds = None # Add new layer ds = ogr.Open('/vsimem/test.xml', update = 1) sr = osr.SpatialReference() sr.SetFromUserInput('WGS84') lyr = ds.CreateLayer('bar', geom_type = ogr.wkbPoint25D, srs = sr, options = ['TABLE_TYPE=BINARY']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT Z (1 2 3)')) lyr.CreateFeature(f) ds = None assert validate_xml('/vsimem/test.xml') ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayerByName('bar') f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT Z (1 2 3)' ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/test.xml') gdal.Rmdir('/vsimem/test') def test_ogr_pds4_create_table_delimited(): options = ['VAR_LOGICAL_IDENTIFIER=logical_identifier', 'VAR_TITLE=title', 'VAR_INVESTIGATION_AREA_NAME=ian', 'VAR_INVESTIGATION_AREA_LID_REFERENCE=INVESTIGATION_AREA_LID_REFERENCE', 'VAR_OBSERVING_SYSTEM_NAME=osn', 'VAR_TARGET=target', 'VAR_TARGET_TYPE=target'] ds = ogr.GetDriverByName('PDS4').CreateDataSource('/vsimem/test.xml', options=options) lyr = ds.CreateLayer('foo') fld = ogr.FieldDefn('bool', ogr.OFTInteger) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('time', ogr.OFTTime)) f = ogr.Feature(lyr.GetLayerDefn()) f['bool'] = 1 f['int'] = -123456789 f['int64'] = -1234567890123 f['real'] = 1.25 f['str'] = 'foo' f['datetime'] = '2019/01/24 12:34:56.789+00' f['date'] = '2019-01-24' f['time'] = '12:34:56.789' f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)')) lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/test.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert '_Character' not in data assert '_Binary' not in data assert 'LSB' not in data assert 'MSB' not in data assert validate_xml('/vsimem/test.xml') ds = gdal.OpenEx('/vsimem/test.xml') assert ds assert ds.GetLayerCount() == 1 fl = ds.GetFileList() assert len(fl) == 3, fl assert 'test.xml' in fl[0] assert 'foo.csv' in fl[1] assert 'foo.vrt' in fl[2] ds= None for filename in [ '/vsimem/test.xml', '/vsimem/test/foo.vrt' ]: ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 8, filename f = lyr.GetNextFeature() assert f['bool'] assert f['int'] == -123456789 assert f['int64'] == -1234567890123 assert f['real'] == 1.25 assert f['str'] == 'foo' assert f['datetime'] == '2019/01/24 12:34:56.789+00' assert f['date'] == '2019/01/24' assert f['time'] == '12:34:56.789' assert f.GetGeometryRef().ExportToIsoWkt() == 'LINESTRING (1 2,3 4)' ds = None # Add new layer ds = ogr.Open('/vsimem/test.xml', update = 1) lyr = ds.CreateLayer('no_geom', geom_type = ogr.wkbNone, options=['TABLE_TYPE=DELIMITED']) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['int'] = 123 lyr.CreateFeature(f) ds = None assert validate_xml('/vsimem/test.xml') ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayerByName('no_geom') f = lyr.GetNextFeature() assert f['int'] == 123 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['int'] == -123456789 ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/test.xml') gdal.Rmdir('/vsimem/test') def test_ogr_pds4_read_table_binary_group_field(): ds = ogr.Open('data/pds4/xrs2015091_truncated.xml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 1 + 231 f = lyr.GetNextFeature() assert f['met'] == 70170476 assert f['solar_mon_spectrum_23_253_1'] == 0 assert f['solar_mon_spectrum_23_253_4'] == 12437 assert f['solar_mon_spectrum_23_253_5'] == 31259 def test_ogr_pds4_create_table_delimited_with_srs_no_vrt(): options = ['VAR_LOGICAL_IDENTIFIER=logical_identifier', 'VAR_TITLE=title', 'VAR_INVESTIGATION_AREA_NAME=ian', 'VAR_INVESTIGATION_AREA_LID_REFERENCE=INVESTIGATION_AREA_LID_REFERENCE', 'VAR_OBSERVING_SYSTEM_NAME=osn', 'VAR_TARGET=target', 'VAR_TARGET_TYPE=target'] ds = ogr.GetDriverByName('PDS4').CreateDataSource('/vsimem/test.xml', options=options) srs = osr.SpatialReference() srs.SetFromUserInput('+proj=tmerc +datum=WGS84') lyr = ds.CreateLayer('foo', srs=srs, options=['CREATE_VRT=NO']) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None assert validate_xml('/vsimem/test.xml') ds = ogr.Open('/vsimem/test.xml') lyr = ds.GetLayerByName('foo') wkt = lyr.GetSpatialRef().ExportToWkt() assert wkt.replace('D_WGS_1984', 'WGS_1984') == 'PROJCS["Transverse Mercator target",GEOGCS["GCS_target",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,0]],PRIMEM["Reference_Meridian",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],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]]'.replace('D_WGS_1984', 'WGS_1984'), wkt ds = None ogr.GetDriverByName('PDS4').DeleteDataSource('/vsimem/test.xml') gdal.Rmdir('/vsimem/test') def test_ogr_pds4_read_table_delimited_test_ogrsf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() open('tmp/poly_delimited.xml', 'wb').write( open('data/pds4/poly_delimited.xml', 'rb').read()) open('tmp/poly_delimited.csv', 'wb').write( open('data/pds4/poly_delimited.csv', 'rb').read()) ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/poly_delimited.xml') gdal.Unlink('tmp/poly_delimited.xml') gdal.Unlink('tmp/poly_delimited.csv') assert 'INFO' in ret and 'ERROR' not in ret def test_ogr_pds4_read_table_delimited_group_field(): ds = ogr.Open('data/pds4/test_delimited_group.xml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 5 f = lyr.GetNextFeature() assert f['first_field'] == 1 assert f['group_first_field_1'] == 2 assert f['group_second_field_1'] == '3' assert f['group_first_field_2'] == 4 assert f['group_second_field_2'] == '5' def test_ogr_pds4_read_product_collection(): ds = ogr.Open('data/pds4/product_collection.xml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() assert f['Member Status'] == 'P' assert f['LIDVID_LID'] == 'urn:nasa:pds:orex.ocams:data_reduced:20160919t162205s722_map_l1pan_v031.fits::1.0' gdalautotest-3.0.4/ogr/ogr_couchdb.py0000755003401500001440000001125113614005326017252 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_couchdb.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: CouchDB driver testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011-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 uuid import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### # Test if driver is available def test_ogr_couchdb_init(): ogrtest.couchdb_drv = None ogrtest.couchdb_drv = ogr.GetDriverByName('CouchDB') if ogrtest.couchdb_drv is None: pytest.skip() if 'COUCHDB_TEST_SERVER' in os.environ: ogrtest.couchdb_test_server = os.environ['COUCHDB_TEST_SERVER'] else: ogrtest.couchdb_test_server = 'http://127.0.0.1:5984' ogrtest.couchdb_temp_layer_name = 'layer_' + str(uuid.uuid1()).replace('-', '_') if gdaltest.gdalurlopen(ogrtest.couchdb_test_server) is None: ogrtest.couchdb_drv = None pytest.skip('cannot open %s' % ogrtest.couchdb_test_server) ############################################################################### # Basic test def test_ogr_couchdb_1(): if ogrtest.couchdb_drv is None: pytest.skip() gdal.VectorTranslate('CouchDB:' + ogrtest.couchdb_test_server, 'data/poly.shp', format='CouchDB', layerName=ogrtest.couchdb_temp_layer_name, layerCreationOptions=['UPDATE_PERMISSIONS=ALL']) ds = ogr.Open('couchdb:%s' % ogrtest.couchdb_test_server, update=1) assert ds is not None lyr = ds.GetLayerByName(ogrtest.couchdb_temp_layer_name) f = lyr.GetNextFeature() if f['AREA'] != 215229.266 or f['EAS_ID'] != '168' or f.GetGeometryRef() is None: f.DumpReadable() pytest.fail() ds.ExecuteSQL('DELLAYER:' + ogrtest.couchdb_temp_layer_name) ############################################################################### # Test null / unset def test_ogr_couchdb_2(): if ogrtest.couchdb_drv is None: pytest.skip() ds = ogr.Open('couchdb:%s' % ogrtest.couchdb_test_server, update=1) assert ds is not None lyr = ds.CreateLayer(ogrtest.couchdb_temp_layer_name, geom_type=ogr.wkbNone, options=['UPDATE_PERMISSIONS=ALL']) lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f['str_field'] = 'foo' lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('str_field') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = lyr.GetNextFeature() if f['str_field'] != 'foo': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['str_field'] is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('str_field'): f.DumpReadable() pytest.fail() ############################################################################### # Cleanup def test_ogr_couchdb_cleanup(): if ogrtest.couchdb_drv is None: pytest.skip() ds = ogr.Open('couchdb:%s' % ogrtest.couchdb_test_server, update=1) assert ds is not None ds.ExecuteSQL('DELLAYER:' + ogrtest.couchdb_temp_layer_name) gdalautotest-3.0.4/ogr/ogr_arcgen.py0000755003401500001440000001417513614005326017112 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_arcgen.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR Arc/Info generate 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Read points def test_ogr_arcgen_points(): ds = ogr.Open('data/points.gen') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 1, 'bad layer count' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbPoint, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'POINT (2 49)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read points25d def test_ogr_arcgen_points25d(): ds = ogr.Open('data/points25d.gen') assert ds is not None, 'cannot open dataset' assert ds.GetLayerCount() == 1, 'bad layer count' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbPoint25D, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'POINT (2 49 10)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read lines def test_ogr_arcgen_lines(): ds = ogr.Open('data/lines.gen') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbLineString, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 49,3 50)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read lines25d def test_ogr_arcgen_lines25d(): ds = ogr.Open('data/lines25d.gen') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbLineString25D, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'LINESTRING (2 49 10,3 50 10)', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read polygons def test_ogr_arcgen_polygons(): ds = ogr.Open('data/polygons.gen') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbPolygon, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'POLYGON ((2 49,2 50,3 50,3 49,2 49))', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') ############################################################################### # Read polygons25d def test_ogr_arcgen_polygons25d(): ds = ogr.Open('data/polygons25d.gen') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' assert lyr.GetGeomType() == ogr.wkbPolygon25D, 'bad layer geometry type' feat = lyr.GetNextFeature() if feat.GetField(0) != 1: feat.DumpReadable() pytest.fail('did not get expected ID') if ogrtest.check_feature_geometry(feat, 'POLYGON ((2 49 10,2 50 10,3 50 10,3 49 10,2 49 10))', max_error=0.0000001) != 0: feat.DumpReadable() pytest.fail('did not get expected first geom') gdalautotest-3.0.4/ogr/ogr_ods.py0000755003401500001440000003356313614005326016442 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_ods.py ee6278f8dd1be7064db87be87fe31fa8943730ec 2019-02-01 23:12:48 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR ODS driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 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 import gdaltest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### # Check def ogr_ods_check(ds): assert ds.TestCapability("foo") == 0 assert ds.GetLayerCount() == 8, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'Feuille1', 'bad layer name' assert lyr.GetGeomType() == ogr.wkbNone, 'bad layer geometry type' assert lyr.GetSpatialRef() is None, 'bad spatial ref' assert lyr.GetFeatureCount() == 26 assert lyr.TestCapability("foo") == 0 lyr = ds.GetLayer(6) assert lyr.GetName() == 'Feuille7', 'bad layer name' assert lyr.GetLayerDefn().GetFieldCount() == 12 type_array = [ogr.OFTString, ogr.OFTInteger, ogr.OFTReal, ogr.OFTReal, ogr.OFTDate, ogr.OFTDateTime, ogr.OFTReal, ogr.OFTTime, ogr.OFTReal, ogr.OFTInteger, ogr.OFTReal, ogr.OFTDateTime] for i, typ in enumerate(type_array): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == typ feat = lyr.GetNextFeature() if feat.GetFieldAsString(0) != 'val' or \ feat.GetFieldAsInteger(1) != 23 or \ feat.GetFieldAsDouble(2) != 3.45 or \ feat.GetFieldAsDouble(3) != 0.52 or \ feat.GetFieldAsString(4) != '2012/01/22' or \ feat.GetFieldAsString(5) != '2012/01/22 18:49:00': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.IsFieldSet(2): feat.DumpReadable() pytest.fail() ############################################################################### # Basic tests def test_ogr_ods_1(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() assert drv.TestCapability("foo") == 0 ds = ogr.Open('data/test.ods') assert ds is not None, 'cannot open dataset' return ogr_ods_check(ds) ############################################################################### # Basic tests def test_ogr_ods_kspread_1(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() assert drv.TestCapability("foo") == 0 ds = ogr.Open('data/test_kspread.ods') assert ds is not None, 'cannot open dataset' assert ds.TestCapability("foo") == 0 assert ds.GetLayerCount() == 8, 'bad layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'Feuille1', 'bad layer name' assert lyr.GetGeomType() == ogr.wkbNone, 'bad layer geometry type' assert lyr.GetSpatialRef() is None, 'bad spatial ref' assert lyr.GetFeatureCount() == 26 assert lyr.TestCapability("foo") == 0 lyr = ds.GetLayer(6) assert lyr.GetName() == 'Feuille7', 'bad layer name' assert lyr.GetLayerDefn().GetFieldCount() == 12 type_array = [ogr.OFTString, ogr.OFTInteger, ogr.OFTReal, ogr.OFTReal, ogr.OFTDate, ogr.OFTString, # ogr.OFTDateTime, ogr.OFTReal, ogr.OFTTime, ogr.OFTReal, ogr.OFTInteger, ogr.OFTReal, ogr.OFTString, # ogr.OFTDateTime ] for i, typ in enumerate(type_array): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == typ feat = lyr.GetNextFeature() if feat.GetFieldAsString(0) != 'val' or \ feat.GetFieldAsInteger(1) != 23 or \ feat.GetFieldAsDouble(2) != 3.45 or \ feat.GetFieldAsDouble(3) != 0.52 or \ feat.GetFieldAsString(4) != '2012/01/22' or \ feat.GetFieldAsString(5) != '22/01/2012 18:49:00': # 2012/01/22 18:49:00 feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.IsFieldSet(2): feat.DumpReadable() pytest.fail() ############################################################################### # Test OGR_ODS_HEADERS = DISABLE def test_ogr_ods_2(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() gdal.SetConfigOption('OGR_ODS_HEADERS', 'DISABLE') ds = ogr.Open('data/test.ods') lyr = ds.GetLayerByName('Feuille7') assert lyr.GetFeatureCount() == 3 gdal.SetConfigOption('OGR_ODS_HEADERS', None) ############################################################################### # Test OGR_ODS_FIELD_TYPES = STRING def test_ogr_ods_3(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() gdal.SetConfigOption('OGR_ODS_FIELD_TYPES', 'STRING') ds = ogr.Open('data/test.ods') lyr = ds.GetLayerByName('Feuille7') assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTString gdal.SetConfigOption('OGR_ODS_FIELD_TYPES', None) ############################################################################### # Run test_ogrsf def test_ogr_ods_4(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.ods') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test write support def test_ogr_ods_5(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f ODS tmp/test.ods data/test.ods') ds = ogr.Open('tmp/test.ods') ret = ogr_ods_check(ds) ds = None os.unlink('tmp/test.ods') return ret ############################################################################### # Test formula evaluation def test_ogr_ods_6(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() src_ds = ogr.Open('ODS:data/content_formulas.xml') filepath = '/vsimem/content_formulas.csv' with gdaltest.error_handler(): out_ds = ogr.GetDriverByName('CSV').CopyDataSource(src_ds, filepath) assert out_ds is not None, ('Unable to create %s.' % filepath) out_ds = None src_ds = None fp = gdal.VSIFOpenL('/vsimem/content_formulas.csv', 'rb') res = gdal.VSIFReadL(1, 10000, fp) gdal.VSIFCloseL(fp) gdal.Unlink('/vsimem/content_formulas.csv') res = res.decode('ascii').split() expected_res = """Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10,Field11,Field12,Field13,Field14,Field15,Field16,Field17,Field18,Field19,Field20,Field21,Field22,Field23,Field24,Field25,Field26,Field27,Field28,Field29,Field30,Field31,Field32 of:=[.B1],of:=[.C1],of:=[.A1],,,,,,,,,,,,,,,,,,,,,,,,,,,,, "1","1","1",,,,,,,,,,,,,,,,,,,,,,,,,,,,, ab,ab,ab,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "1",a,,"3.5",MIN,"1",MIN,"3.5",SUM,"4.5",AVERAGE,"2.25",COUNT,"2",COUNTA,"3",,,,,,,,,,,,,,,, abcdef,"6",,a,abcdef,,f,abcdef,"of:=MID([.A5];0;1)",,a,abcdef,,a,ef,ef,,,,,,,,,,,,,,,, "1",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, AB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "2","2","0","3","1","0","0","1","1","1","0","0","0","1","1","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" "0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0" """.split() assert res == expected_res, ('did not get expected result: %s' % res) ############################################################################### # Test update support def test_ogr_ods_7(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() filepath = 'tmp/ogr_ods_7.ods' if os.path.exists(filepath): os.unlink(filepath) shutil.copy('data/test.ods', filepath) ds = ogr.Open(filepath, update=1) lyr = ds.GetLayerByName('Feuille7') feat = lyr.GetNextFeature() if feat.GetFID() != 2: feat.DumpReadable() pytest.fail('did not get expected FID') feat.SetField(0, 'modified_value') lyr.SetFeature(feat) feat = None ds = None ds = ogr.Open('tmp/ogr_ods_7.ods') lyr = ds.GetLayerByName('Feuille7') feat = lyr.GetNextFeature() if feat.GetFID() != 2: feat.DumpReadable() pytest.fail('did not get expected FID') if feat.GetField(0) != 'modified_value': feat.DumpReadable() pytest.fail('did not get expected value') feat = None ds = None os.unlink(filepath) ############################################################################### # Test Integer64 def test_ogr_ods_8(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() ds = drv.CreateDataSource('/vsimem/ogr_ods_8.ods') lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('Field1', ogr.OFTInteger64)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 12345678901234) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_ods_8.ods') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger64 f = lyr.GetNextFeature() f = lyr.GetNextFeature() assert f.GetField(0) == 12345678901234 ds = None gdal.Unlink('/vsimem/ogr_ods_8.ods') ############################################################################### # Test DateTime with milliseconds def test_ogr_ods_9(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() ds = drv.CreateDataSource('/vsimem/ogr_ods_9.ods') lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('Field1', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('Field2', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('Field3', ogr.OFTDateTime)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, '2015/12/23 12:34:56.789') f.SetField(1, '2015/12/23 12:34:56.000') f.SetField(2, '2015/12/23 12:34:56') lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_ods_9.ods') lyr = ds.GetLayer(0) for i in range(3): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTDateTime f = lyr.GetNextFeature() if f.GetField(0) != '2015/12/23 12:34:56.789': f.DumpReadable() pytest.fail() if f.GetField(1) != '2015/12/23 12:34:56': f.DumpReadable() pytest.fail() if f.GetField(2) != '2015/12/23 12:34:56': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_ods_9.ods') ############################################################################### # Test Boolean def test_ogr_ods_boolean(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() out_filename = '/vsimem/ogr_ods_boolean.ods' ds = drv.CreateDataSource(out_filename) lyr = ds.CreateLayer('foo') fld_defn = ogr.FieldDefn('Field1', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, True) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, False) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open(out_filename) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTBoolean f = lyr.GetNextFeature() assert f.GetField(0) f = lyr.GetNextFeature() assert not f.GetField(0) ds = None gdal.Unlink(out_filename) ############################################################################### # Test number-columns-repeated at end of row. def test_ogr_ods_number_columns_repeated_at_end_of_row(): drv = ogr.GetDriverByName('ODS') if drv is None: pytest.skip() ds = ogr.Open('data/testrepeatedcolatendofrow.ods') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f = lyr.GetNextFeature() assert f['vbz'] == 1002 assert f['b'] == 0 gdalautotest-3.0.4/ogr/ogr_vfk.py0000755003401500001440000002561313614005326016440 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_vfk.py 7b4ea5a4561efb2fd15123a55253fbaa358a1c45 2019-03-12 13:39:28 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR VFK driver functionality. # Author: Martin Landa # ############################################################################### # Copyright (c) 2009-2019 Martin Landa # Copyright (c) 2010-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 gdaltest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### # Open file, check number of layers, get first layer, # check number of fields and features def test_ogr_vfk_1(): gdaltest.vfk_drv = ogr.GetDriverByName('VFK') if gdaltest.vfk_drv is None: pytest.skip() gdal.SetConfigOption('OGR_VFK_DB_OVERWRITE', 'YES') gdaltest.vfk_ds = ogr.Open('data/bylany.vfk') assert gdaltest.vfk_ds is not None assert gdaltest.vfk_ds.GetLayerCount() == 61, 'expected exactly 61 layers!' gdaltest.vfk_layer_par = gdaltest.vfk_ds.GetLayer(0) assert gdaltest.vfk_layer_par is not None, 'cannot get first layer' assert gdaltest.vfk_layer_par.GetName() == 'PAR', \ 'did not get expected layer name "PAR"' defn = gdaltest.vfk_layer_par.GetLayerDefn() assert defn.GetFieldCount() == 28, \ ('did not get expected number of fields, got %d' % defn.GetFieldCount()) fc = gdaltest.vfk_layer_par.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) ############################################################################### # Read the first feature from layer 'PAR', check envelope def test_ogr_vfk_2(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_par.ResetReading() feat = gdaltest.vfk_layer_par.GetNextFeature() assert feat.GetFID() == 1, 'did not get expected fid for feature 1' geom = feat.GetGeometryRef() assert geom.GetGeometryType() == ogr.wkbPolygon, \ 'did not get expected geometry type.' envelope = geom.GetEnvelope() area = (envelope[1] - envelope[0]) * (envelope[3] - envelope[2]) exp_area = 2010.5 assert area >= exp_area - 0.5 and area <= exp_area + 0.5, \ ('envelope area not as expected, got %g.' % area) ############################################################################### # Read features from layer 'SOBR', test attribute query def test_ogr_vfk_3(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_sobr = gdaltest.vfk_ds.GetLayer(43) assert gdaltest.vfk_layer_sobr.GetName() == 'SOBR', \ 'did not get expected layer name "SOBR"' gdaltest.vfk_layer_sobr.SetAttributeFilter("CISLO_BODU = '55'") gdaltest.vfk_layer_sobr.ResetReading() feat = gdaltest.vfk_layer_sobr.GetNextFeature() count = 0 while feat: feat = gdaltest.vfk_layer_sobr.GetNextFeature() count += 1 assert count == 1, ('did not get expected number of features, got %d' % count) ############################################################################### # Read features from layer 'SBP', test random access, check length def test_ogr_vfk_4(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_sbp = gdaltest.vfk_ds.GetLayerByName('SBP') assert gdaltest.vfk_layer_sbp, 'did not get expected layer name "SBP"' feat = gdaltest.vfk_layer_sbp.GetFeature(5) length = int(feat.geometry().Length()) assert length == 10, ('did not get expected length, got %d' % length) ############################################################################### # Read features from layer 'HP', check geometry type def test_ogr_vfk_5(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_hp = gdaltest.vfk_ds.GetLayerByName('HP') assert gdaltest.vfk_layer_hp != 'HP', 'did not get expected layer name "HP"' geom_type = gdaltest.vfk_layer_hp.GetGeomType() assert geom_type == ogr.wkbLineString, \ ('did not get expected geometry type, got %d' % geom_type) ############################################################################### # Re-Open file (test .db persistence) def test_ogr_vfk_6(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_par = None gdaltest.vfk_layer_sobr = None gdaltest.vfk_ds = None gdaltest.vfk_ds = ogr.Open('data/bylany.vfk') assert gdaltest.vfk_ds is not None assert gdaltest.vfk_ds.GetLayerCount() == 61, 'expected exactly 61 layers!' gdaltest.vfk_layer_par = gdaltest.vfk_ds.GetLayer(0) assert gdaltest.vfk_layer_par is not None, 'cannot get first layer' assert gdaltest.vfk_layer_par.GetName() == 'PAR', \ 'did not get expected layer name "PAR"' defn = gdaltest.vfk_layer_par.GetLayerDefn() assert defn.GetFieldCount() == 28, \ ('did not get expected number of fields, got %d' % defn.GetFieldCount()) fc = gdaltest.vfk_layer_par.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) ############################################################################### # Read PAR layer, check data types (Integer64 new in GDAL 2.2) def test_ogr_vfk_7(): if gdaltest.vfk_drv is None: pytest.skip() defn = gdaltest.vfk_layer_par.GetLayerDefn() for idx, name, ctype in ((0, "ID", ogr.OFTInteger64), (1, "STAV_DAT", ogr.OFTInteger), (2, "DATUM_VZNIKU", ogr.OFTString), (22, "CENA_NEMOVITOSTI", ogr.OFTReal)): col = defn.GetFieldDefn(idx) assert col.GetName() == name and col.GetType() == ctype, \ "PAR: '{}' column name/type mismatch".format(name) ############################################################################### # Open DB file as datasource (new in GDAL 2.2) def test_ogr_vfk_8(): if gdaltest.vfk_drv is None: pytest.skip() # open by SQLite driver first vfk_ds_db = ogr.Open('data/bylany.db') count1 = vfk_ds_db.GetLayerCount() vfk_ds_db = None # then open by VFK driver os.environ['OGR_VFK_DB_READ'] = 'YES' vfk_ds_db = ogr.Open('data/bylany.db') count2 = vfk_ds_db.GetLayerCount() vfk_ds_db = None assert count1 == count2, \ 'layer count differs when opening DB by SQLite and VFK drivers' del os.environ['OGR_VFK_DB_READ'] ############################################################################### # Open datasource with SUPPRESS_GEOMETRY open option (new in GDAL 2.3) def test_ogr_vfk_9(): if gdaltest.vfk_drv is None: pytest.skip() # open with suppressing geometry vfk_ds = None vfk_ds = gdal.OpenEx('data/bylany.vfk', open_options=['SUPPRESS_GEOMETRY=YES']) vfk_layer_par = vfk_ds.GetLayerByName('PAR') assert vfk_layer_par != 'PAR', 'did not get expected layer name "PAR"' geom_type = vfk_layer_par.GetGeomType() vfk_layer_par = None vfk_ds = None assert geom_type == ogr.wkbNone, \ ('did not get expected geometry type, got %d' % geom_type) ############################################################################### # Open datasource with FILE_FIELD open option (new in GDAL 2.4) def test_ogr_vfk_10(): if gdaltest.vfk_drv is None: pytest.skip() # open with suppressing geometry vfk_ds = None vfk_ds = gdal.OpenEx('data/bylany.vfk', open_options=['FILE_FIELD=YES']) vfk_layer_par = vfk_ds.GetLayerByName('PAR') assert vfk_layer_par != 'PAR', 'did not get expected layer name "PAR"' vfk_layer_par.ResetReading() feat = vfk_layer_par.GetNextFeature() file_field = feat.GetField('VFK_FILENAME') vfk_layer_par = None vfk_ds = None assert file_field == 'bylany.vfk', 'did not get expected file field value' ############################################################################### # Read PAR layer, check sequential feature access consistency def test_ogr_vfk_11(): def count_features(): gdaltest.vfk_layer_par.ResetReading() count = 0 while True: feat = gdaltest.vfk_layer_par.GetNextFeature() if not feat: break count += 1 return count if gdaltest.vfk_drv is None: pytest.skip() count = gdaltest.vfk_layer_par.GetFeatureCount() for i in range(2): # perform check twice, mix with random access if count != count_features(): feat = gdaltest.vfk_layer_par.GetFeature(i) feat.DumpReadable() pytest.fail('did not get expected number of features') ############################################################################### # Read SBP layer, check curved geometry def test_ogr_vfk_12(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_sbp = gdaltest.vfk_ds.GetLayerByName('SBP') gdaltest.vfk_layer_sbp.SetAttributeFilter("PARAMETRY_SPOJENI = '16'") feat = gdaltest.vfk_layer_sbp.GetNextFeature() geom = feat.GetGeometryRef() assert geom.GetGeometryType() == ogr.wkbLineString, \ 'did not get expected geometry type.' assert geom.GetPointCount() == 92, \ 'did not get expected number of points.' ############################################################################### # cleanup def test_ogr_vfk_cleanup(): if gdaltest.vfk_drv is None: pytest.skip() gdaltest.vfk_layer_par = None gdaltest.vfk_layer_hp = None gdaltest.vfk_layer_sobr = None gdaltest.vfk_ds = None try: os.remove('data/bylany.db') except OSError: pass ############################################################################### # gdalautotest-3.0.4/ogr/ogr_gml_geom.py0000755003401500001440000027615513614005326017451 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_gml_geom.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic OGR translation of WKT and WKB geometries. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009-2014, Even Rouault # # 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. ############################################################################### import os import pytest import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal ############################################################################### @pytest.mark.parametrize( 'filename', [ f for f in os.listdir(os.path.join(os.path.dirname(__file__), 'data/wkb_wkt')) if f[-4:] == '.wkt' ] ) def test_gml_geom(filename): raw_wkt = open('data/wkb_wkt/' + filename).read() ###################################################################### # Convert WKT to GML. geom_wkt = ogr.CreateGeometryFromWkt(raw_wkt) gml = geom_wkt.ExportToGML() assert gml is not None and gml, 'Conversion to GML failed.' ###################################################################### # Create geometry from GML. geom_gml = ogr.CreateGeometryFromGML(gml) if ogrtest.check_feature_geometry(geom_wkt, geom_gml, 0.0000000000001) == 1: clean_wkt = geom_wkt.ExportToWkt() gml_wkt = geom_gml.ExportToWkt() pytest.fail('WKT from GML (%s) does not match clean WKT (%s).\ngml was (%s)' % (gml_wkt, clean_wkt, gml)) ############################################################################### # Test geometries with extra spaces at the end, as sometimes are generated # by ESRI WFS software. def test_gml_space_test(): gml = '189999.99995605,624999.99998375 200000.00005735,624999.99998375 200000.00005735,612499.99997125 195791.3593843,612499.99997125 193327.3749823,612499.99997125 189999.99995605,612499.99997125 189999.99995605,619462.31247125 189999.99995605,624999.99998375 \n' geom = ogr.CreateGeometryFromGML(gml) assert geom is not None and geom.GetGeometryType() is ogr.wkbLineString and geom.GetPointCount() == 8, \ 'GML not correctly parsed' ############################################################################### # Test GML 3.x "pos" element for a point. def test_gml_pos_point(): gml = '31 29 16' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POINT (31 29 16)', ' not correctly parsed' ############################################################################### # Test GML 3.1.1 "pos" element for a polygon. (ticket #3244) def test_gml_pos_polygon(): gml = ''' 0 0 4 0 4 4 0 4 0 0 1 1 2 1 2 2 1 2 1 1 ''' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))', \ ' not correctly parsed' ############################################################################### # Test GML 3.x "posList" element for a linestring. def test_gml_posList_line(): gml = '31 42 53 64 55 76' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (31 42,53 64,55 76)', \ ' not correctly parsed' ############################################################################### # Test GML 3.x "posList" element for a 3D linestring. def test_gml_posList_line3d(): gml = '31 42 1 53 64 2 55 76 3' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (31 42 1,53 64 2,55 76 3)', \ ' not correctly parsed' ############################################################################### # Test GML 3.x "posList" element for a 3D linestring, but with srsDimension # set on LineString, not posList def test_gml_posList_line3d_2(): gml = '31 42 1 53 64 2 55 76 3' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (31 42 1,53 64 2,55 76 3)', \ ' not correctly parsed' ############################################################################### # Test GML 3.x "polygon" element for a point. def test_gml_polygon(): gml = '0 0 4 0 4 4 0 4 0 01 1 2 1 2 2 1 2 1 1' geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))', \ ' not correctly parsed' ############################################################################### # Private utility function to convert WKT to GML with assigned WGS 84 as SRS. def _CreateGMLWithSRSFromWkt(wkt, epsg): geom = ogr.CreateGeometryFromWkt(wkt) if geom is None: gdaltest.post_reason('Import geometry from WKT failed') return None # Assign SRS from given EPSG code srs = osr.SpatialReference() srs.ImportFromEPSG(epsg) if srs is None: gdaltest.post_reason('SRS import from EPSG failed') return None geom.AssignSpatialReference(srs) return geom.ExportToGML() ############################################################################### # Test of Point geometry with SRS assigned def test_gml_out_point_srs(): wkt = 'POINT(21.675 53.763)' gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:31] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of Point 3D geometry with SRS assigned def test_gml_out_point3d_srs(): wkt = 'POINT(21.675 53.763 100)' gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:31] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of LineString geometry with SRS assigned def test_gml_out_linestring_srs(): wkt = open('data/wkb_wkt/5.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:36] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of Polygon geometry with SRS assigned def test_gml_out_polygon_srs(): wkt = open('data/wkb_wkt/6.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:33] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of MultiPoint geometry with SRS assigned def test_gml_out_multipoint_srs(): wkt = open('data/wkb_wkt/11.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:36] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of MultiLineString geometry with SRS assigned def test_gml_out_multilinestring_srs(): wkt = open('data/wkb_wkt/2.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:41] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test of MultiPolygon geometry with SRS assigned def test_gml_out_multipolygon_srs(): wkt = open('data/wkb_wkt/4.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:38] == '', \ 'No srsName attribute in GML output' # Verify we have no other srsName's on subelements. assert gml[39:].find('srsName') == -1, \ 'Got extra srsName attributes on subelements.' ############################################################################### # Test of GeometryCollection with SRS assigned def test_gml_out_geometrycollection_srs(): wkt = open('data/wkb_wkt/3.wkt').read() gml = _CreateGMLWithSRSFromWkt(wkt, 4326) assert gml is not None and gml, 'Conversion to GML failed.' assert gml[0:39] == '', \ 'No srsName attribute in GML output' ############################################################################### # Test GML Box def test_gml_Box(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((1 2 0,3 2 0,3 4 0,1 4 0,1 2 0))', \ ' not correctly parsed' ############################################################################### # Test GML Envelope def test_gml_Envelope(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((1 2,3 2,3 4,1 4,1 2))', \ ' not correctly parsed' ############################################################################### # Test GML Curve def test_gml_Curve(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (1 2,3 4)', \ ' not correctly parsed' ############################################################################### # Test GML Curve with pointProperty elements def test_gml_Curve_with_pointProperty(): gml = """ 1 2 3 4 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (1 2,3 4)', \ ' not correctly parsed' ############################################################################### # Test GML MultiCurve def test_gml_MultiCurve(): gml = """ 1 2 2 3 3 4 4 5 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTILINESTRING ((1 2,2 3),(3 4,4 5))', \ ' not correctly parsed' ############################################################################### # Test GML MultiSurface with PolygonPatch def test_gml_MultiSurface(): gml = """ 1 2 3 4 5 6 1 2 2 3 4 5 6 7 2 3 3 4 5 6 7 8 3 4 4 5 6 7 6 7 8 9 8 9 4 5 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOLYGON (((1 2,3 4,5 6,1 2),(2 3,4 5,6 7,2 3),(3 4,5 6,7 8,3 4)),((4 5,6 7,8 9,4 5)))', \ ' not correctly parsed' ############################################################################### # Test GML MultiSurface with surfaceMembers def test_gml_MultiSurface_surfaceMembers(): gml = """ 1 2 3 4 5 6 1 2 2 3 4 5 6 7 2 3 3 4 5 6 7 8 3 4 30 40 50 60 70 80 30 40 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOLYGON (((1 2,3 4,5 6,1 2),(2 3,4 5,6 7,2 3)),((3 4,5 6,7 8,3 4)),((30 40,50 60,70 80,30 40)))', \ ' not correctly parsed' ############################################################################### # Test GML MultiCurve with curveMembers def test_gml_MultiCurve_curveMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTILINESTRING ((0 0,1 1))', \ ' not correctly parsed' ############################################################################### # Test GML MultiGeometry with geometryMembers def test_gml_MultiGeometry_geometryMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'GEOMETRYCOLLECTION (LINESTRING (0 0,1 1))', \ ' not correctly parsed' ############################################################################### # Test GML CompositeCurve with curveMembers def test_gml_CompositeCurve_curveMembers(): gml = """ 0 0 1 1 1 1 2 2 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'LINESTRING (0 0,1 1,2 2)', \ ' not correctly parsed' ############################################################################### # Test GML MultiPoint with pointMembers def test_gml_MultiCurve_pointMembers(): gml = """ 0 0 1 1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOINT (0 0,1 1)', \ ' not correctly parsed' ############################################################################### # Test GML Solid def test_gml_Solid(): gml = """ 1 2 0 3 4 0 5 6 0 1 2 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYHEDRALSURFACE Z (((1 2 0,3 4 0,5 6 0,1 2 0)))', \ ' not correctly parsed' ############################################################################### # Test GML OrientableSurface def test_gml_OrientableSurface(): gml = """ -213.475 24.989 0 -213.475 24.989 8.0 -215.704 25.077 8.0 -215.704 25.077 0 -213.475 24.989 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((-213.475 24.989 0,-213.475 24.989 8,-215.704 25.077 8,-215.704 25.077 0,-213.475 24.989 0))', \ ' not correctly parsed' ############################################################################### # Test GML Triangle def test_gml_Triangle(): gml = """ 0 0 0 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'TRIANGLE ((0 0,0 1,1 1,0 0))', \ ' not correctly parsed' # check the conversion of Triangle from OGR -> GML wkt_original = 'TRIANGLE ((0 0,0 1,0 1,0 0))' triangle = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] gml_string = triangle.ExportToGML(opts) if gml_string != '0 0 0 1 0 1 0 0': print(geom.ExportToWkt()) pytest.fail('incorrect conversion from OGR -> GML for OGRTriangle') ############################################################################### # Test GML Rectangle def test_gml_Rectangle(): gml = """ 0 0 0 1 1 1 1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))', \ ' not correctly parsed' ############################################################################### # Test GML PolyhedralSurface def test_gml_PolyhedralSurface(): # Conversion from GML -> OGR # 2 patches and 2 rings gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 10 11 12 13 14 15 16 17 18 10 11 12 19 20 21 22 23 24 25 26 27 19 20 21 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid PolyhedralSurface # need to assert geom.IsValid() == True to determine the validity of the geometry assert geom.ExportToWkt() == 'POLYHEDRALSURFACE Z (((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12),(19 20 21,22 23 24,25 26 27,19 20 21)))', \ ' not correctly parsed' # 1 patch and 2 rings gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 10 11 12 13 14 15 16 17 18 10 11 12 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid PolyhedralSurface # need to assert geom.IsValid() == True to determine the validity of the geometry assert geom.ExportToWkt() == 'POLYHEDRALSURFACE Z (((1 2 3,4 5 6,7 8 9,1 2 3)),((10 11 12,13 14 15,16 17 18,10 11 12)))', \ ' not correctly parsed' # Variations of empty PolyhedralSurface gml_strings = ['', '', """ """] for string in gml_strings: geom = ogr.CreateGeometryFromGML(string) assert geom.ExportToWkt() == 'POLYHEDRALSURFACE EMPTY', \ 'Empty not correctly parsed' # Conversion from OGR -> GML wkt_original = 'POLYHEDRALSURFACE Z (((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),\ ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),\ ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),\ ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),\ ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),\ ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))' ps = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] string = ps.ExportToGML(opts) if string != '0 0 0 0 0 1 0 1 1 0 1 0 0 0 00 0 0 0 1 0 1 1 0 1 0 0 0 0 00 0 0 1 0 0 1 0 1 0 0 1 0 0 01 1 0 1 1 1 1 0 1 1 0 0 1 1 00 1 0 0 1 1 1 1 1 1 1 0 0 1 00 0 1 1 0 1 1 1 1 0 1 1 0 0 1': print(geom.ExportToWkt()) pytest.fail('incorrect parsing of OGR -> GML for PolyhedralSurface') g2 = ogr.CreateGeometryFromGML(string) if g2.Equals(ps) != 1: print(geom.ExportToWkt()) pytest.fail('incorrect round-tripping') # empty geometry wkt_original = 'POLYHEDRALSURFACE EMPTY' ps = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] string = ps.ExportToGML(opts) if string != '': print(geom.ExportToWkt()) pytest.fail('incorrect parsing of OGR -> GML for empty PolyhedralSurface') # several polygon patches (and test that non elements such as comments are parsed OK) gml = """ 1 2 3 4 5 6 7 8 9 1 2 3 1 2 3 4 5 6 7 8 9 1 2 3 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYHEDRALSURFACE (((1 2 3,4 5 6,7 8 9,1 2 3))),POLYHEDRALSURFACE (((1 2 3,4 5 6,7 8 9,1 2 3))))', \ ' not correctly parsed' # Test PolyhedralSurface with curve section (which we linearize since the SF PolyhedralSurface doesn't support curves) gml = """ 0 -1 0 1 0 1 1 0 0 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt().find('POLYHEDRALSURFACE (((0 -1,0 1,') >= 0, \ ' not correctly parsed' ############################################################################### # Test GML Tin def test_gml_Tin(): gml = """ 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 """ geom = ogr.CreateGeometryFromGML(gml) # NOTE - this is actually an invalid TIN surface, as the triangle is incorrect # need to assert geom.IsValid() == True to determine the validity of the geometry assert geom.ExportToWkt() == 'TIN Z (((0 0 1,0 1 1,1 1 1,1 0 1,0 0 1)))', \ ' not correctly parsed' # Test for gml:TriangulatedSurface gml = """ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))', \ ' not correctly parsed' # substituting gml:trianglePatches for gml:patches gml = """ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))', \ ' not correctly parsed' # Part 2 - Create GML File from OGR Geometries wkt_original = 'TIN Z (((0 0 0,0 0 1,0 1 0,0 0 0)),((0 0 0,0 1 0,1 1 0,0 0 0)))' tin = ogr.CreateGeometryFromWkt(wkt_original) opts = ["FORMAT=GML3"] gml_string = tin.ExportToGML(opts) if gml_string != '0 0 0 0 0 1 0 1 0 0 0 00 0 0 0 1 0 1 1 0 0 0 0': print(geom.ExportToWkt()) pytest.fail('OGRGeometry::TriangulatedSurface incorrectly converted') ############################################################################### # Test concatenated sections (#4451) def test_gml_ConcatenatedDeduplication(): gml = """ 0 -1 0 1 0 1 1 0 0 -1 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = 'CURVEPOLYGON (COMPOUNDCURVE ((0 -1,0 1),CIRCULARSTRING (0 1,1 0,0 -1)))' assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 assert not ogrtest.have_geos() or geom.IsValid(), 'geometry not valid' ############################################################################### # Test OGRFormatDouble() to check for rounding errors (would also apply for KML output, or ogrinfo output) def gml_out_precision(): geom = ogr.CreateGeometryFromWkt('POINT(93538.15 1.23456789)') expected_gml = '93538.15,1.23456789' got_gml = geom.ExportToGML() assert got_gml == expected_gml, 'did not get expected gml' geom = ogr.CreateGeometryFromWkt('POINT(93538.55 1234567.89)') expected_gml = '93538.55,1234567.89' got_gml = geom.ExportToGML() assert got_gml == expected_gml, 'did not get expected gml' ############################################################################### # Test various error cases of gml2ogrgeometry.cpp def test_gml_invalid_geoms(): gml_expected_wkt_list = [ ('', None), ('', None), ('', None), ('31 29 1631 29 16', None), ('', 'POINT EMPTY'), # This is valid GML actually ('0', None), ('0 1', 'POINT (0 1)'), # Support for uncommon formatting of coordinates ('0 1 2', 'POINT (0 1 2)'), # Support for uncommon formatting of coordinates ('0,1 2,3', None), ('0', None), ('', 'POINT EMPTY'), # This is valid GML actually ('', None), ('', None), ('', None), ('', None), ('', 'LINESTRING EMPTY'), # This is valid GML actually ('0', None), ('0 1 2 3', None), ('0 1 2 3', None), ('', None), ('', None), ('0', None), ('', 'POLYGON EMPTY'), # valid GML3, but invalid GML2. Be tolerant ('', 'POLYGON EMPTY'), # valid GML2 ('', None), ('31 29 16', None), ('0 1 2 3 4 5 0 1', None), ('', None), ('0 1 2 3 4 5 0 131 29 16', None), ('', None), ('', None), ('', None), ('', None), ('31 29 16', None), ('', None), ('31 29 16', None), ('', 'MULTIPOLYGON EMPTY'), # valid GML3, but invalid GML2. Be tolerant ('', 'MULTIPOLYGON EMPTY'), # illegal GML, but we are tolerant ('', 'MULTIPOLYGON EMPTY'), # valid in GML3 (accepted by PostGIS too) ('', None), ('31 29 16', None), ('', 'MULTIPOLYGON EMPTY'), # valid GML ('', 'MULTIPOLYGON EMPTY'), # illegal GML, but we are tolerant ('', 'MULTIPOLYGON EMPTY'), # valid GML3 ('', 'MULTIPOINT EMPTY'), ('', 'MULTIPOINT EMPTY'), ('', 'MULTIPOINT EMPTY'), # valid in GML3 (accepted by PostGIS too) ('0 1 2 3', None), ('', 'MULTIPOINT EMPTY'), ('', 'MULTIPOINT EMPTY'), ('', None), ('', 'MULTILINESTRING EMPTY'), ('', 'MULTILINESTRING EMPTY'), ('', None), ('31 29 16', None), ('', 'MULTILINESTRING EMPTY'), ('', 'MULTILINESTRING EMPTY'), ('', 'MULTILINESTRING EMPTY'), # valid in GML3 (accepted by PostGIS too) ('', None), ('', None), ('', None), ('31 29 16', None), ('', 'MULTILINESTRING EMPTY'), ('', None), ('', None), ('', None), ('', None), ('', None), ('', None), ('31 29 16', None), ('', None), ('0 0 0 1', None), ('0 0 0 1 1 0 2 0', None), ('', None), ('0 0 0 1', None), ('0 0 0 1 1 0 2 0', None), ('', None), ('0 0 0 1', None), ('', None), ('', None), ('', None), ('', None), ('31 29 16', None), ('', 'GEOMETRYCOLLECTION EMPTY'), ('', 'GEOMETRYCOLLECTION EMPTY'), ('', 'GEOMETRYCOLLECTION EMPTY'), # valid in GML3 (accepted by PostGIS too) ('', None), ('', None), ('', 'POLYGON EMPTY'), # valid GML3 ('', 'POLYGON EMPTY'), # invalid GML3, but we are tolerant ('', 'POLYGON EMPTY'), # valid GML3 ('', None), ('', 'POLYGON EMPTY'), # valid GML3 ('', 'POLYHEDRALSURFACE EMPTY'), # valid GML3 ('', 'POLYHEDRALSURFACE EMPTY'), # invalid GML3, but we are tolerant ('', 'POLYHEDRALSURFACE EMPTY'), # valid GML3 ('', None), ('0 0 4 0 4 4 0 4 0 0', 'POLYGON ((0 0,4 0,4 4,0 4,0 0))'), ('', None), ('', None), ('', None), ('', None), ('', None), # invalid ('', None), # invalid GML3, but we are tolerant ('', 'POLYGON EMPTY'), # validates the schema ('', None), # invalid ('', None), # invalid GML3, but we are tolerant ('', 'MULTIPOINT EMPTY'), # validates the schema ('', None), ('', None), ('13 4', None), ('1bla2', None), ('1bla2', None), ('1bla2', None), ('1,2', None), ('1,2', None), ('1,2', None), ('1,2', None), ('1,2', None), ('1,2', None), (""" 0 0 1 0 0 0 -10 0 -1 0 0 0 """, "COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,-10 0))"), # non contiguous segments (""" 0 0 1 0 0 0 -10 0 1 0 0 0 0 0 -1 0 0 0 """, None), # non contiguous segments ("2-1", None), ("2 02-1", None), ("2 0 -2 0-1", None), ("2 0 -2 0-1", None), ("", None), ("290270", None), ("1 290270", None), ("1 22270", None), ("1 2290", None), ("2", None), ("1 2", None), ('', None), ('', None), ('', None), ] for (gml, expected_wkt) in gml_expected_wkt_list: gdal.PushErrorHandler('CPLQuietErrorHandler') # print gml geom = ogr.CreateGeometryFromGML(gml) gdal.PopErrorHandler() if geom is None: assert expected_wkt is None, \ ('did not get expected result for %s. Got None instead of %s' % (gml, expected_wkt)) else: wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail('did not get expected result for %s. Got %s instead of None' % (gml, wkt)) else: assert wkt == expected_wkt, \ ('did not get expected result for %s. Got %s instead of %s' % (gml, wkt, expected_wkt)) ############################################################################### # Test write support for GML3 def test_gml_write_gml3_geometries(): gml_list = ['2 3', '2 3 4', '2 3 4 5', '2 3 4 5', '2 3 10 4 5 20', '2 3 10 4 5 20', '0 0 0 1 1 1 1 0 0 0', '0 0 0 1 1 1 1 0 0 010 10 10 11 11 11 10 10', '2 34 5', '0 1 2 3 4 56 7 8 9 10 11', '0 1 2 3 4 56 7 8 9 10 11', '0 1 2 3 4 5 0 16 7 8 9 10 11 6 7', '0 12 3 4 5'] for gml_in in gml_list: geom = ogr.CreateGeometryFromGML(gml_in) if gml_in.find('0 0 1 0 1 1 0 1""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,1 0,1 1,0 1,0 0))', \ ' not correctly parsed' ############################################################################### # Test GML 3.3 SimpleRectangle def test_gml_SimpleRectangle(): gml = """0 0 1 0 1 1 0 1""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,1 0,1 1,0 1,0 0))', \ ' not correctly parsed' ############################################################################### # Test GML 3.3 SimpleTriangle def test_gml_SimpleTriangle(): gml = """0 0 1 0 1 1""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'TRIANGLE ((0 0,1 0,1 1,0 0))', \ ' not correctly parsed' ############################################################################### # Test GML 3.3 SimpleMultiPoint def test_gml_SimpleMultiPoint(): gml = """0 1 2 3""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOINT (0 1,2 3)', \ ' not correctly parsed' ############################################################################### # Test gml:CompositeCurve> in def test_gml_CompositeCurveInRing(): gml = """ 0 0 0 1 0 1 1 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,0 0))' ############################################################################### # Test in (#5369) def test_gml_CompositeSurface_in_surfaceMembers(): gml = """ 0 0 0 1 1 1 1 0 0 0 2 0 2 1 3 1 3 0 2 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)),((2 0,2 1,3 1,3 0,2 0)))' ############################################################################### # Test with only Interior ring (#5421) def test_gml_MultiSurfaceOfSurfaceOfPolygonPatchWithInteriorRing(): gml = """ 0 0 0 1 1 1 1 0 0 0 0.25 0.25 0.25 0.75 0.75 0.75 0.75 0.25 0.25 0.25 0 0 0 -1 -1 -1 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.75 0.25,0.25 0.25)),((0 0,0 -1,-1 -1,-1 0,0 0)))' ############################################################################### # Test ts, cs and decimal attributes of gml:coordinates def test_gml_Coordinates_ts_cs_decimal(): gml_expected_wkt_list = [ ('1,2', 'POINT (1 2)'), # default values ('1,2', 'POINT (1 2)'), # default values ('1,2,3', 'POINT (1 2 3)'), # default values (' 1,2 ', 'POINT (1 2)'), # we accept that... ('1 2', 'POINT (1 2)'), # this is completely out of specification ! but we accept that too ! ('1;2', 'POINT (1 2)'), ('1,2;3,4', 'POINT (1.2 3.4)'), ('1,2;3,4;5,6', 'POINT (1.2 3.4 5.6)'), ('1,2 3,4', 'LINESTRING (1 2,3 4)'), # default values ('1,2 3,4', 'LINESTRING (1 2,3 4)'), # default values ('1,2,2.5 3,4', 'LINESTRING (1 2 2.5,3 4 0)'), # default values ('1,2-3,4', 'LINESTRING (1 2,3 4)'), ('1 2,3 4', 'LINESTRING (1 2,3 4)'), ('1 2 2.5,3 4', 'LINESTRING (1 2 2.5,3 4 0)'), ] for (gml, expected_wkt) in gml_expected_wkt_list: geom = ogr.CreateGeometryFromGML(gml) wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail('did not get expected result for %s. Got %s instead of None' % (gml, wkt)) else: assert wkt == expected_wkt, \ ('did not get expected result for %s. Got %s instead of %s' % (gml, wkt, expected_wkt)) ############################################################################### # Test gml with XML header and comments def test_gml_with_xml_header_and_comments(): gml_expected_wkt_list = [ (' 1,2', 'POINT (1 2)'), (""" 0 0 0 1 1 1 1 0 0 0 0.25 0.25 0.25 0.75 0.75 0.75 0.75 0.25 0.25 0.25 """, 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.25 0.75,0.75 0.75,0.75 0.25,0.25 0.25)))'), ] for (gml, expected_wkt) in gml_expected_wkt_list: geom = ogr.CreateGeometryFromGML(gml) wkt = geom.ExportToWkt() if expected_wkt is None: pytest.fail('did not get expected result for %s. Got %s instead of None' % (gml, wkt)) else: assert wkt == expected_wkt, \ ('did not get expected result for %s. Got %s instead of %s' % (gml, wkt, expected_wkt)) ############################################################################### # Test srsDimension attribute on top-level geometry and not on posList (#5606) def test_gml_srsDimension_topgeometry(): gml = """ 0 0 10 0 1 10 1 1 10 1 0 10 0 0 10 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'POLYGON ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))' ############################################################################### # Test GML Arc def test_gml_Arc(): gml = "1 0 0 1 -1 0" geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('CIRCULARSTRING (1 0,0 1,-1 0)')) == 0 gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '1 0 0 1 -1 0' assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom.Equals(geom2) ############################################################################### # Test GML ArcByBulge def test_gml_ArcByBulge(): gml = "2 0 -2 02-1" geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('CIRCULARSTRING (2 0,0 2,-2 0)')) == 0 ############################################################################### # Test GML ArcByCenterPoint def test_gml_ArcByCenterPoint(): gml = "1 2290270" geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('CIRCULARSTRING (1 4,-1 2,1 0)')) == 0 ############################################################################### # Test compound curve of ArcByCenterPoint whose ends don't exactly match # with ends of neighbouring curves, as found in some AIXM files def test_gml_CompoundCurve_of_ArcByCenterPoint(): gml = """ -80.40 33.86 -80.27 33.63 -80.47 33.98 23 295 249 -80.63 33.62 -80.39 33.85 """ geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('POLYGON ((-80.4 33.86,-80.27 33.63,-80.305028054229538 33.622017309598967,-80.335422529369936 33.613343178471617,-80.366464292754429 33.606448070493634,-80.398003921948742 33.601365147653873,-80.429889693662162 33.598118851265042,-80.461968286017793 33.596724788982847,-80.494085487001527 33.597189662699385,-80.52608690656875 33.599511237590342,-80.557818688893789 33.603678352435914,-80.589128223167393 33.609670971175497,-80.619864849221443 33.617460275496377,-80.63 33.62,-80.39 33.85))')) == 0 ############################################################################### # Test GML CircleByCenterPoint def test_gml_CircleByCenterPoint(): gml = "1 22" geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt('CIRCULARSTRING (-1 2,3 2,-1 2)')) == 0 ############################################################################### # Test GML Circle def test_gml_Circle(): gml = """ -1 0 0 1 -0.707106781186547 -0.707106781186548 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = 'CIRCULARSTRING (-1 0,0 1,-0.707106781186547 -0.707106781186548,-0.923879532511287 -0.38268343236509,-1 0)' assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 geom = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,2 0,0 0)') gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '0 0 1 1 2 0' assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom2.ExportToWkt() == 'CIRCULARSTRING (0 0,1 1,2 0,1 -1,0 0)' geom = ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0 10,2 0 10,0 0 10)') gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '0 0 10 1 1 10 2 0 10' assert gml2 == expected_gml2 gml = """ -1 0 0 1 -0.707106781186547 -0.707106781186548 """ geom = ogr.CreateGeometryFromGML(gml) expected_wkt = 'CURVEPOLYGON ( CIRCULARSTRING (-1 0,0 1,-0.707106781186547 -0.707106781186548,-0.923879532511287 -0.38268343236509,-1 0))' assert ogrtest.check_feature_geometry(geom, ogr.CreateGeometryFromWkt(expected_wkt)) == 0 ############################################################################### # Test ArcString def test_gml_ArcString(): gml = """-2 0 -1 -1 0 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'CIRCULARSTRING (-2 0,-1 -1,0 0)' gml = """-2 0 -1 -1 0 0 1 -1 2 0 0 2 -2 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'CIRCULARSTRING (-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0)' gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '-2 0 -1 -1 0 0 1 -1 2 0 0 2 -2 0' assert gml2 == expected_gml2 geom2 = ogr.CreateGeometryFromGML(gml2) assert geom2.ExportToWkt() == 'CIRCULARSTRING (-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0)' ############################################################################### # Test OGRCompoundCurve def test_gml_OGRCompoundCurve(): wkt = 'COMPOUNDCURVE ((0 0,1 1,2 0))' geom = ogr.CreateGeometryFromWkt(wkt) gml = geom.ExportToGML(['FORMAT=GML3']) expected_gml = '0 0 1 1 2 0' assert gml == expected_gml # CompositeCurve of LineStringSegment gml = expected_gml geom = ogr.CreateGeometryFromGML(gml) # We simplify it in LINESTRING assert geom.ExportToWkt() == 'LINESTRING (0 0,1 1,2 0)' # CompositeCurve of Arc gml = """0 0 1 1 2 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))' gml2 = geom.ExportToGML(['FORMAT=GML3']) assert gml2 == gml # CompositeCurve of 3 arcs gml = """ 0 0 1 1 2 0 2 0 3 1 4 0 4 0 5 1 6 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,3 1,4 0),CIRCULARSTRING (4 0,5 1,6 0))' # Alternative syntax : Curve with 3 Arc segments gml = """ 0 0 1 1 2 0 2 0 3 1 4 0 4 0 5 1 6 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0),CIRCULARSTRING (2 0,3 1,4 0),CIRCULARSTRING (4 0,5 1,6 0))' # Curve with LineStringSegment and Arc segments gml = """ 0 0 1 0 0 0 0 0 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,0 0))' # Composite curve of a LineString and a (Composite) Curve with an Arc and a LineString gml = """ 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'COMPOUNDCURVE ((0 0,1 0,0 0),CIRCULARSTRING (0 0,1 0,0 0),(0 0,-1 0,0 0))' ############################################################################### # Test OGRCurvePolygon def test_gml_OGRCurvePolygon(): # Test one CircularString gml = """0 0 1 0 0 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0))' gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '0 0 0.5 0.5 1 0' assert gml2 == expected_gml2 # Test two CircularString gml = """0 0 1 0 0 00.25 0 0.75 0 0.25 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'CURVEPOLYGON (CIRCULARSTRING (0 0,1 0,0 0),CIRCULARSTRING (0.25 0.0,0.75 0.0,0.25 0.0))' # Test a LinearRing followed by a CircularString gml = """-2 -2 -2 2 2 2 2 -2 -2 -20.25 0 0.75 0 0.25 0""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'CURVEPOLYGON ((-2 -2,-2 2,2 2,2 -2,-2 -2),CIRCULARSTRING (0.25 0.0,0.75 0.0,0.25 0.0))' # Test a CircularString followed by a LinearRing gml = """-1 0 1 2 3 0-2 -2 -2 2 2 2 2 -2 -2 -2""" geom = ogr.CreateGeometryFromGML(gml) assert ogrtest.check_feature_geometry(geom, 'CURVEPOLYGON (CIRCULARSTRING (-1 0,1 2,3 0,1.0 -2.0,-1 0),(-2 -2,-2 2,2 2,2 -2,-2 -2))') == 0, \ geom.ExportToWkt() gml2 = geom.ExportToGML(['FORMAT=GML3']) geom2 = ogr.CreateGeometryFromGML(gml) expected_gml2 = '-1 0 1 2 3 0 1 -2 -1 0-2 -2 -2 2 2 2 2 -2 -2 -2' expected_geom2 = ogr.CreateGeometryFromGML(expected_gml2) assert ogrtest.check_feature_geometry(geom2, expected_geom2) == 0, gml2 ############################################################################### # Test OGRMultiSurface def test_gml_OGRMultiSurface(): # MultiSurface of CurvePolygon gml = """ 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)))', \ ' not correctly parsed' # MultiSurface of Polygon and CurvePolygon gml = """ 0 0 0 1 1 1 0 0 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTISURFACE (((0 0,0 1,1 1,0 0)),CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)))', \ ' not correctly parsed' # MultiSurface of CurvePolygon and Polygon gml = """ 0 0 1 1 1 -1 0 0 0 1 1 1 0 0 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,1 1,1 -1,0.292893218813453 -0.707106781186548,0 0)),((0 0,0 1,1 1,0 0)))', \ ' not correctly parsed' geom = ogr.CreateGeometryFromWkt('MULTISURFACE (CURVEPOLYGON((0 0,0 1,1 1,1 0,0 0)))') gml2 = geom.ExportToGML(['FORMAT=GML3']) expected_gml2 = '0 0 0 1 1 1 1 0 0 0' assert gml2 == expected_gml2 ############################################################################### # Test OGRMultiCurve def test_gml_OGRMultiCurve(): # MultiCurve of Arc gml = """0 0 1 1 1 -1""" geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1))', \ ' not correctly parsed' gml2 = geom.ExportToGML(['FORMAT=GML3']) assert gml2 == gml # MultiCurve of LineString and Arc gml = """ 0 0 1 1 1 -1 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTICURVE ((0 0,1 1,1 -1),CIRCULARSTRING (0 0,1 1,1 -1))', \ ' not correctly parsed' # MultiCurve of Arc and LineString gml = """ 0 0 1 1 1 -1 0 0 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTICURVE (CIRCULARSTRING (0 0,1 1,1 -1),(0 0,1 1,1 -1))', \ ' not correctly parsed' # MultiCurve of CompositeCurve gml = """ 0 0 1 1 1 -1 1 -1 1 1 1 -1 """ geom = ogr.CreateGeometryFromGML(gml) assert geom.ExportToWkt() == 'MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,1 -1),(1 -1,1 1,1 -1)))', \ ' not correctly parsed' ############################################################################### # Test write support for GML namespace declaration def test_gml_write_gml_ns(): geom = ogr.CreateGeometryFromWkt('POINT(500000 4500000)') gml = geom.ExportToGML(options=['NAMESPACE_DECL=YES']) expected_gml = '500000,4500000' assert gml == expected_gml, ('got %s, instead of %s' % (gml, expected_gml)) geom = ogr.CreateGeometryFromWkt('POINT(500000 4500000)') gml = geom.ExportToGML(options=['FORMAT=GML3', 'NAMESPACE_DECL=YES']) expected_gml = '500000 4500000' assert gml == expected_gml, ('got %s, instead of %s' % (gml, expected_gml)) geom = ogr.CreateGeometryFromWkt('POINT(500000 4500000)') gml = geom.ExportToGML(options=['FORMAT=GML32', 'GMLID=foo', 'NAMESPACE_DECL=YES']) expected_gml = '500000 4500000' assert gml == expected_gml, ('got %s, instead of %s' % (gml, expected_gml)) ############################################################################### # When imported build a list of units based on the files available. # print 'hit enter' # sys.stdin.readline() gdalautotest-3.0.4/ogr/ogr_rfc35_mem.py0000755003401500001440000002471613614005326017435 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_rfc35_mem.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC35 for Memory 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 from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Initiate the test file def test_ogr_rfc35_mem_1(): gdaltest.rfc35_mem_ds = ogr.GetDriverByName('Memory').CreateDataSource('rfc35_test') lyr = gdaltest.rfc35_mem_ds.CreateLayer('rfc35_test') lyr.ReorderFields([]) fd = ogr.FieldDefn('foo5', ogr.OFTString) fd.SetWidth(5) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo0') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('bar10', ogr.OFTString) fd.SetWidth(10) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo1') feat.SetField(1, 'bar1') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baz15', ogr.OFTString) fd.SetWidth(15) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo2') feat.SetField(1, 'bar2_01234') feat.SetField(2, 'baz2_0123456789') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baw20', ogr.OFTString) fd.SetWidth(20) lyr.CreateField(fd) ############################################################################### # Test ReorderField() def Truncate(val, lyr_defn, fieldname): # pylint: disable=unused-argument # if val is None: # return val # return val[0:lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex(fieldname)).GetWidth()] # Mem driver doesn't actually truncate return val def CheckFeatures(lyr, field1='foo5', field2='bar10', field3='baz15', field4='baw20'): expected_values = [ ['foo0', None, None, None], ['foo1', 'bar1', None, None], ['foo2', 'bar2_01234', 'baz2_0123456789', None], ['foo3', 'bar3_01234', 'baz3_0123456789', 'baw3_012345678901234'] ] lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() i = 0 while feat is not None: if (field1 is not None and feat.GetField(field1) != Truncate(expected_values[i][0], lyr_defn, field1)) or \ (field2 is not None and feat.GetField(field2) != Truncate(expected_values[i][1], lyr_defn, field2)) or \ (field3 is not None and feat.GetField(field3) != Truncate(expected_values[i][2], lyr_defn, field3)) or \ (field4 is not None and feat.GetField(field4) != Truncate(expected_values[i][3], lyr_defn, field4)): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() i = i + 1 def CheckColumnOrder(lyr, expected_order): lyr_defn = lyr.GetLayerDefn() for i, exp_order in enumerate(expected_order): assert lyr_defn.GetFieldDefn(i).GetName() == exp_order def Check(lyr, expected_order): CheckColumnOrder(lyr, expected_order) CheckFeatures(lyr) def test_ogr_rfc35_mem_2(): lyr = gdaltest.rfc35_mem_ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCReorderFields) == 1 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo3') feat.SetField(1, 'bar3_01234') feat.SetField(2, 'baz3_0123456789') feat.SetField(3, 'baw3_012345678901234') lyr.CreateFeature(feat) feat = None assert lyr.ReorderField(1, 3) == 0 ret = Check(lyr, ['foo5', 'baz15', 'baw20', 'bar10']) lyr.ReorderField(3, 1) ret = Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 2) ret = Check(lyr, ['bar10', 'baz15', 'foo5', 'baw20']) lyr.ReorderField(2, 0) ret = Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 1) ret = Check(lyr, ['bar10', 'foo5', 'baz15', 'baw20']) lyr.ReorderField(1, 0) ret = Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderFields([3, 2, 1, 0]) ret = Check(lyr, ['baw20', 'baz15', 'bar10', 'foo5']) lyr.ReorderFields([3, 2, 1, 0]) ret = Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([0, 0, 0, 0]) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # Test AlterFieldDefn() for change of name and width def test_ogr_rfc35_mem_3(): lyr = gdaltest.rfc35_mem_ds.GetLayer(0) fd = ogr.FieldDefn("baz25", ogr.OFTString) fd.SetWidth(25) lyr_defn = lyr.GetLayerDefn() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(-1, fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(lyr_defn.GetFieldCount(), fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz15"), fd, ogr.ALTER_ALL_FLAG) ret = CheckFeatures(lyr, field3='baz25') fd = ogr.FieldDefn("baz5", ogr.OFTString) fd.SetWidth(5) lyr_defn = lyr.GetLayerDefn() lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz25"), fd, ogr.ALTER_ALL_FLAG) ret = CheckFeatures(lyr, field3='baz5') lyr_defn = lyr.GetLayerDefn() fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('baz5')) assert fld_defn.GetWidth() == 5 ret = CheckFeatures(lyr, field3='baz5') ############################################################################### # Test AlterFieldDefn() for change of type def test_ogr_rfc35_mem_4(): lyr = gdaltest.rfc35_mem_ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 fd = ogr.FieldDefn("intfield", ogr.OFTInteger) lyr.CreateField(fd) lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 12345) lyr.SetFeature(feat) feat = None fd.SetWidth(10) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd.SetWidth(5) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd.SetWidth(4) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() # if feat.GetField("intfield") != 1234: assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(15) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() # if feat.GetField("oldintfld") != '1234': assert feat.GetField("oldintfld") == '12345' feat = None CheckFeatures(lyr, field3='baz5') lyr.DeleteField(lyr_defn.GetFieldIndex("oldintfld")) fd = ogr.FieldDefn("intfield", ogr.OFTInteger) fd.SetWidth(10) assert lyr.CreateField(fd) == 0 assert lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) == 0 lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 98765) assert lyr.SetFeature(feat) == 0 feat = None fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(6) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ############################################################################### # Test DeleteField() def test_ogr_rfc35_mem_5(): lyr = gdaltest.rfc35_mem_ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCDeleteField) == 1 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(-1) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldCount()) gdal.PopErrorHandler() assert ret != 0 assert lyr.DeleteField(0) == 0 ret = CheckFeatures(lyr, field3='baz5') assert lyr.DeleteField(lyr_defn.GetFieldIndex('baw20')) == 0 ret = CheckFeatures(lyr, field3='baz5', field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('baz5')) == 0 ret = CheckFeatures(lyr, field3=None, field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('foo5')) == 0 assert lyr.DeleteField(lyr_defn.GetFieldIndex('bar10')) == 0 ret = CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ############################################################################### # Initiate the test file def test_ogr_rfc35_mem_cleanup(): gdaltest.rfc35_mem_ds = None gdalautotest-3.0.4/ogr/data/0000755003401500001440000000000013614005363015331 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/test_uncompressed_dense_false.pbf0000644003401500001440000000125613614004466024127 0ustar rouaultusers OSMHeader1 -"OsmSchema-V0.60.44.1-9-ge5d77d4-SNAPSHOT- OSMData   type name inner multipolygon bar area yes outer foo natural wood standalone_polygon Some interesting point id_6 motorway forest id_4 id_5 baz highway other_type route @H @H  @H @H  @H  @àH @àH @̚H @̚H B  BB B  BB B Bn" B JR"B JR"BJR"BJR"B JRdgdalautotest-3.0.4/ogr/data/lines25d.gen0000644003401500001440000000006013614004466017450 0ustar rouaultusers1 2,49,10 3,50,10 END 2 3,50,20 2,49,20 END END gdalautotest-3.0.4/ogr/data/solid-less-than-4-vertices.dxf0000644003401500001440000000144213614004466023031 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 SOLID 5 5BB 8 0 10 0.0 20 2.0 30 0.0 11 0.0 21 2.0 31 0.0 12 0.0 22 2.0 32 0.0 13 0.0 23 2.0 33 0.0 0 SOLID 5 5BC 8 0 10 1.0 20 2.0 30 0.0 11 0.5 21 2.0 31 0.0 12 1.0 22 2.0 32 0.0 13 0.5 23 2.0 33 0.0 0 SOLID 5 5BD 8 0 10 1.0 20 1.5 30 0.0 11 0.5 21 1.5 31 0.0 12 0.5 22 1.5 32 0.0 13 0.5 23 1.5 33 0.0 0 SOLID 5 5BE 8 0 10 1.0 20 1.0 30 0.0 11 1.0 21 1.0 31 0.0 12 0.5 22 1.0 32 0.0 13 0.5 23 1.0 33 0.0 0 SOLID 5 5BF 8 0 10 2.0 20 2.0 30 0.0 11 1.5 21 2.0 31 0.0 12 2.0 22 1.5 32 0.0 13 2.0 23 1.5 33 0.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/additional-entities.dxf0000755003401500001440000003031413614004470021770 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $HANDSEED 5 EEFFF 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 330 0 100 AcDbSymbolTable 70 4 0 LTYPE 5 14 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEA1 330 0 100 AcDbSymbolTable 70 1 0 LAYER 5 EEEA2 330 EEEA1 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 347 21 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEF91 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 helloblock 340 0 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEF92 330 EEF91 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 helloblock 70 2 10 0.0 20 0.0 30 0.0 3 helloblock 1 0 LWPOLYLINE 5 EEF9B 330 EEF91 100 AcDbEntity 8 0 6 Continuous 100 AcDbPolyline 90 4 70 1 43 0.0 10 0.0 20 1.0 10 1.0 20 1.0 10 1.0 20 0.0 10 0.0 20 0.0 0 ATTDEF 5 EEF9C 330 EEF91 100 AcDbEntity 8 0 6 Continuous 100 AcDbText 10 -2.566666666666666 20 0.1 30 0.0 40 0.8 1 4 72 1 11 0.5 21 0.5 31 0.0 100 AcDbAttributeDefinition 280 0 3 2 HELLOTAG 70 0 74 2 280 1 0 ENDBLK 5 EEF93 330 EEF91 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 HELIX 5 D4 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 70 0 71 3 72 16 73 12 74 0 42 0.000000001 43 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 0.4107298893330121 40 0.4107298893330121 40 1.094504176141694 40 1.094504176141694 40 1.778278462950377 40 1.778278462950377 40 2.46205274975906 40 2.46205274975906 40 3.141592653589793 40 3.141592653589793 40 3.141592653589793 40 3.141592653589793 10 150.0 20 120.0 30 0.0 10 147.2618007377799 20 119.1284041044942 30 0.8715958955058134 10 144.8926927915345 20 117.6887493305192 30 1.743191791011626 10 140.0048592240064 20 113.026795510705 30 4.065801789247269 10 138.4906486769347 20 109.2801109045903 30 5.516815891977099 10 138.345945529999 20 102.6700544605076 30 8.418844097436759 10 139.6796223054234 20 99.84898558832847 30 9.869858200166589 10 143.3344102259219 20 96.57527120440294 30 12.77188640562625 10 145.6024783549961 20 96.1258650938999 30 14.22290050835607 10 148.949796382595 20 97.14078824640095 30 17.11594307405727 10 150.0 20 98.55797153702864 30 18.55797153702863 10 150.0 20 100.0 30 20.0 100 AcDbHelix 90 31 91 105 10 150.0 20 100.0 30 0.0 11 150.0 21 120.0 31 0.0 12 0.0 22 0.0 32 1.0 40 0.0 41 0.5 42 40.0 290 1 280 1 0 TRACE 5 D8 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 150.0 20 120.5 30 0.0 11 150.0 21 119.5 31 0.0 12 200.0 22 120.5 32 0.0 13 200.0 23 119.5 33 0.0 0 HATCH 5 108 330 1F 100 AcDbEntity 8 0 62 3 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.3 220 0.0 230 -0.953939201417 2 SOLID 70 1 71 1 91 1 92 5 93 3 72 1 10 60.0 20 50.0 11 0.0 21 50.0 72 4 94 3 73 0 74 0 95 10 96 6 40 0.0 40 0.0 40 0.0 40 0.0 40 4.472135954999579 40 10.09554920690307 40 14.82425725191895 40 14.82425725191895 40 14.82425725191895 40 14.82425725191895 10 0.0 20 50.0 10 -2.218004103125363 20 42.13328072122051 10 -7.225000712694471 20 24.37468563937244 10 35.21439645645782 20 25.23785207382124 10 38.49943783173264 20 7.913519305502897 10 40.0 20 0.0 97 4 11 0.0 21 50.0 11 0.0000000000000018 21 30.0 11 30.0 21 20.0 11 40.0 21 0.0000000000000018 12 -1.487882384688529 22 -5.277155720177717 13 0.951990789439181 23 -5.020516743792535 72 1 10 40.0 20 -0.0000000000000071 11 60.0 21 50.0 97 2 330 106 330 107 75 1 76 1 47 0.382709427594011 98 1 10 10.0 20 40.0 450 0 451 0 460 0.0 461 0.0 452 0 462 0.0 453 2 463 0.0 63 5 421 255 463 1.0 63 2 421 16776960 470 LINEAR 0 HATCH 5 EF077 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 4 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 _SOLID 70 1 71 0 91 1 92 1 93 1 72 4 94 3 73 1 74 0 95 11 96 7 40 0.0 40 0.0 40 0.0 40 0.0 40 20.94600890510247 40 48.82577770828017 40 65.41802406807341 40 82.5482354761489 40 82.5482354761489 40 82.5482354761489 40 82.5482354761489 10 77.24099480934673 20 172.430072843974 42 1.210771479263352 10 66.10730220891221 20 168.4798309518848 42 1.0 10 52.05758392371472 20 148.2061680972096 42 1.0 10 94.42286298422361 20 145.1350796615255 42 0.65 10 94.11793457416115 20 174.100096163338 42 2.0 10 83.82412757509678 20 174.7657729360923 42 1.383146083653713 10 77.24099480934673 20 172.430072843974 42 1.210771479263352 97 0 97 0 75 1 76 1 98 1 10 0.0 20 0.0 450 0 451 0 460 0.0 461 0.0 452 0 462 0.0 453 2 463 0.0 63 5 421 255 463 1.0 63 2 421 16776960 470 LINEAR 0 MLINE 5 623 330 70 100 AcDbEntity 8 0 100 AcDbMline 2 STANDARD 340 60 40 20.0 70 0 71 1 72 4 73 2 10 0.0 20 290.0 30 0.0 210 0.0 220 0.0 230 1.0 11 0.0 21 290.0 31 0.0 12 0.9805806756909202 22 -0.196116135138184 32 0.0 13 0.1961161351381841 23 0.9805806756909202 33 0.0 74 2 41 0.0 41 0.0 75 0 74 3 41 -20.0 41 0.0 41 49.07683539937054 75 0 11 50.0 21 280.0 31 0.0 12 0.9805806756909202 22 0.196116135138184 32 0.0 13 -4.440892098500626E-16 23 1.0 33 0.0 74 6 41 0.0 41 0.0 41 4.328115877541078 41 16.99673171197593 41 38.03227033859753 41 48.86560367193085 75 0 74 4 41 -20.39607805437114 41 5.441176156420397 41 33.69893700526417 41 44.53227033859752 75 0 11 150.0 21 300.0 31 0.0 12 -0.2425356250363329 22 -0.9701425001453319 32 0.0 13 0.7237282464487101 23 0.6900850855454531 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -37.4007025686794 41 0.0 75 0 11 140.0 21 260.0 31 0.0 12 -0.2425356250363329 22 -0.9701425001453319 32 0.0 13 0.9701425001453319 23 -0.2425356250363332 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -20.0 41 0.0 75 0 0 MLINE 5 634 330 70 100 AcDbEntity 8 0 100 AcDbMline 2 STANDARD 340 60 40 10.0 70 0 71 1 72 2 73 2 10 70.0 20 290.0 30 0.0 210 0.0 220 0.0 230 1.0 11 70.0 21 290.0 31 0.0 12 -0.447213595499958 22 -0.894427190999916 32 0.0 13 0.8944271909999159 23 -0.4472135954999582 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -10.0 41 0.0 75 0 11 50.0 21 250.0 31 0.0 12 -0.4472135954999579 22 -0.8944271909999159 32 0.0 13 0.8944271909999159 23 -0.4472135954999582 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -10.0 41 0.0 75 0 0 MLINE 5 636 330 70 100 AcDbEntity 8 0 100 AcDbMline 2 TEST 340 157 40 10.0 70 0 71 3 72 4 73 3 10 100.0 20 300.0 30 0.0 210 0.7071067811865 220 0.0 230 0.7071067811865 11 100.0 21 300.0 31 0.0 12 -0.196116135138184 22 -0.9805806756909202 32 0.0 13 0.6956143708941906 23 -0.7184153721945817 33 0.0 74 4 41 0.0 41 0.0 41 10.62295731998498 41 32.28962398665161 75 0 74 4 41 -6.075342587953484 41 0.0 41 16.15734665996341 41 37.8240133266301 75 0 74 4 41 -12.15068517590697 41 0.0 41 21.69173599994184 41 43.35840266660852 75 0 11 90.0 21 250.0 31 0.0 12 0.9899494936611665 22 0.1414213562373094 32 0.0 13 0.7264537217271734 23 0.6872153884982047 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -8.656922528134209 41 0.0 75 0 74 2 41 -17.31384505626842 41 0.0 75 0 11 160.0 21 260.0 31 0.0 12 0.0 22 1.0 32 0.0 13 -0.7554539549957064 23 0.6552017413601291 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -6.618537062299736 41 0.0 75 0 74 2 41 -13.23707412459947 41 0.0 75 0 11 160.0 21 310.0 31 0.0 12 -0.9863939238321435 22 -0.1643989873053572 32 0.0 13 -0.6463748961301961 23 -0.7630199824727254 33 0.0 74 2 41 0.0 41 0.0 75 0 74 2 41 -7.735448932089838 41 0.0 75 0 74 2 41 -15.47089786417967 41 0.0 75 0 0 INSERT 5 EEFA0 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbMInsertBlock 66 1 2 helloblock 10 60.0 20 41.0 30 0.0 41 12.0 42 10.0 50 13.0 70 4 71 2 44 30.0 45 20.0 0 ATTRIB 5 EEFA1 330 EEFA0 100 AcDbEntity 8 0 6 Continuous 100 AcDbText 10 62.50328512705479 20 42.60423301694802 30 0.0 40 7.999999999999997 1 N 50 12.99999999999998 41 1.199999999999999 72 1 11 64.72146511699207 21 47.22155664998934 31 0.0 100 AcDbAttribute 280 0 2 HELLOTAG 70 0 74 2 280 1 0 SEQEND 5 EEFA3 330 EEFA0 100 AcDbEntity 8 0 6 Continuous 0 SPLINE 5 EEFA2 330 EEEEE 100 AcDbEntity 8 0 100 AcDbSpline 210 -0.0871669981298796 220 0.0027239686914402 230 0.9961899891243605 70 8 71 3 72 8 73 4 74 0 42 0.000000001 43 0.0000000001 40 0.9999632527533043 40 0.9999632527533043 40 0.9999632527533043 40 0.9999632527533043 40 1.0 40 1.0 40 1.0 40 1.0 10 0.0 20 20.0 30 0.0 10 5.4 20 18.3 30 0.0 10 7.8 20 13.3 30 0.0 10 8.9 20 4.5 30 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 3 ACAD_MLINESTYLE 350 5F 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 DICTIONARY 5 5F 102 {ACAD_REACTORS 330 C 102 } 330 C 100 AcDbDictionary 281 1 3 Standard 350 60 3 TEST 350 157 0 MLINESTYLE 5 60 102 {ACAD_REACTORS 330 5F 102 } 330 5F 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 MLINESTYLE 5 157 102 {ACAD_REACTORS 330 5F 102 } 330 5F 100 AcDbMlineStyle 2 TEST 70 64 3 62 4 51 70.0 52 90.0 71 3 49 0.5 62 256 6 BYLAYER 49 0.0 62 8 6 BORDERX2 49 -0.5 62 256 6 BYLAYER 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/polygon.geojson0000644003401500001440000000020713614004466020410 0ustar rouaultusers{ "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }gdalautotest-3.0.4/ogr/data/testLookForSimpleType.xml0000644003401500001440000000161013614005326022337 0ustar rouaultusers 249 249 2,49 Eragny gdalautotest-3.0.4/ogr/data/water_main_dist.dbf0000644003401500001440000000135313614004466021164 0ustar rouaultusers Amain_idNdistrict_noNwater_ma_1Cmain_sizeNmaterialCclassNinstalle_1Dproject_noC work_orderCdepth_coverNdrawing_noCmain_lengthNnode_1Nnode_2NremarksCMSLINKN MAPIDN 202 24D 8PVC 15004/25/1989 test 0.00LOM 394 351.81111099999998 567 275 5018 11gdalautotest-3.0.4/ogr/data/polygon_without_index.dat0000644003401500001440000000237613614004466022477 0ustar rouaultuserss!Nom_CommunC2INSEE_CommCINSEE_RgiCNom_RgionCINSEE_DpaCNom_DpartCINSEE_ArroCINSEE_CantCId_BDCartoCStatutCAbscisse_CCOrdonne_CCSuperficieCPopulationCEXTRACTIONCRECETTEC CHALONS-EN-CHAMPAGNE5110821CHAMPAGNE-ARDENNE51MARNE196ePrfecture de rgion: h- 2011-01-00415 COMPERTRIX5116021CHAMPAGNE-ARDENNE51MARNE136eCommune simplen+ hL2011-01-00415 SAINT-MARTIN-SUR-LE-PRE5150421CHAMPAGNE-ARDENNE51MARNE135VeCommune simpleN2 h 2011-01-00415 L'EPINE5123121CHAMPAGNE-ARDENNE51MARNE116WeCommune simpleI uh X2011-01-00415gdalautotest-3.0.4/ogr/data/test_filegdb_field_types.xml0000644003401500001440000001037113614005326023076 0ustar rouaultusers \test test false esriDTTable false false true OBJECTID OBJECTID esriFieldTypeOID false 12 0 0 true esriFieldTypeSmallInteger esriFieldTypeSmallInteger true 2 0 0 esriFieldTypeInteger esriFieldTypeInteger true 12 0 0 esriFieldTypeSingle esriFieldTypeSingle true 12 5 0 esriFieldTypeDouble esriFieldTypeDouble true 24 15 0 esriFieldTypeDate esriFieldTypeDate true 8 0 0 esriFieldTypeGUID esriFieldTypeGUID true 38 0 0 esriFieldTypeBlob esriFieldTypeBlob true 0 0 0 esriFieldTypeString esriFieldTypeString true 80 0 0 esriFieldTypeGlobalID esriFieldTypeGlobalID true 38 0 0 true {7A566981-C114-11D2-8A28-006097AFF44E} true esriFieldTypeGlobalID gdalautotest-3.0.4/ogr/data/emptyshapefilewithsbn.shx0000644003401500001440000000014413614004466022475 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/multipoint.geojson0000644003401500001440000000013413614004466021124 0ustar rouaultusers{ "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }gdalautotest-3.0.4/ogr/data/departs.vrt0000644003401500001440000000030713614004466017533 0ustar rouaultusers departs.shp departs gdalautotest-3.0.4/ogr/data/test_point2.gml0000755003401500001440000000430513614004470020307 0ustar rouaultusers -1.3501138991774910.1666231936981584 -0.52409271914723420.8245083207261725 -0.924357034795764,0.824508320726173 1.000 1 1 -0.524092719147234,0.499452240596797 2.000 2 2 -0.717738710070079,0.166623193698158 3.000 3 3 -1.159493626862817,0.178726068130836 4.000 4 4 -1.350113899177491,0.53576086389483 5.000 5 5 gdalautotest-3.0.4/ogr/data/inspire_cadastralboundary.xml0000644003401500001440000000527413614005327023316 0ustar rouaultusers 49 2 50 3 2000-01-01T00:00:00.0Z 2001-01-01T00:00:00.0Z 1 49 2 50 3 CadastralBoundary-01-localId namespace 2002-01-01T00:00:00.0Z 2003-01-01T00:00:00.0Z 2000-01-01T00:00:00.0Z 49 2 50 3 CadastralBoundary-02-localId namespace gdalautotest-3.0.4/ogr/data/empty.kml0000644003401500001440000000030013614004466017170 0ustar rouaultusers Test gdalautotest-3.0.4/ogr/data/invalid.vrt0000644003401500001440000000564313614004466017527 0ustar rouaultusers foo poly.shp poly.shp bar poly.shp bar poly.shp foo poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp poly.shp foo poly.shp POINT (0 1) poly.shp gdalautotest-3.0.4/ogr/data/departs.dbf0000755003401500001440000000040413614004470017447 0ustar rouaultusersl a6WIDNNOMDPARTC- 0Frdric 0Blict 0Pallassou gdalautotest-3.0.4/ogr/data/wfs11.xsd0000644003401500001440000000332213614005327017012 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/junk_content_after_valid_doc.kml0000644003401500001440000002315113614004466023731 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/circle.dxf0000644003401500001440000000013413614004470017271 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 CIRCLE 8 0 10 1.0 20 2.0 30 3.0 40 4.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/bezier_curve_and_polygon_holes.pdf0000644003401500001440000001274713614004466024311 0ustar rouaultusers%PDF-1.3 % 1 1 obj << /CreationDate (D:20191015235410+02'00') /Producer (PoDoFo - http://podofo.sf.net) >> endobj 4 0 obj << /Length 4652 >> stream BT 0 0 0 rg /RelativeColorimetric ri /T1_0 9.865 Tf 3 Tr -1.104 -1.6677 0.8338 -0.552 7155.5132 5383.6655 Tm (1)Tj 3.831 0.001 Td (3)Tj -1.1039 -1.6678 0.8339 -0.5519 7147.0542 5370.8867 Tm (6)Tj 3.831 0 Td (2)Tj 3.831 0 Td (9)Tj 3.831 -0 Td (9)Tj ET q 0 941.123 m 9600.102 941.123 l 9600.102 13458.877 l 0 13458.877 l 0 941.123 l W* n q 1 0 0 1 7152.7002 5379.3999 cm 0 0 m 8.2 -5.5 l 8.7 -4.8 l 8.4 -4.4 8.3 -3.9 8.2 -3.2 c 8.1 -2.5 8.1 -1.8 8.2 -1.1 c 7.2 -0.4 l 7.2 -0.6 7.1 -0.8 7.1 -1.1 c 7.1 -1.3 7 -1.6 7 -1.8 c 7 -2.4 7 -2.9 7.1 -3.3 c 0.7 1 l 0 0 l f* Q q 1 0 0 1 7153.1001 5375.2998 cm 0 0 m -0.7 0.4 -1.4 0.5 -2.2 0.3 c -2.9 0.1 -3.5 -0.3 -4 -1 c -4.5 -1.8 -4.7 -2.7 -4.6 -3.5 c -4.4 -4.4 -4 -5 -3.3 -5.5 c -2.7 -5.9 -2.2 -6 -1.7 -6 c -1.1 -5.9 -0.7 -5.7 -0.2 -5.3 c -0.3 -5.8 -0.3 -6.2 -0.1 -6.6 c 0.1 -7 0.3 -7.3 0.7 -7.5 c 1.1 -7.8 1.5 -7.9 1.9 -7.9 c 2.4 -8 2.9 -7.8 3.3 -7.6 c 3.7 -7.3 4.1 -7 4.4 -6.5 c 4.8 -5.9 5 -5.2 4.9 -4.5 c 4.9 -3.9 4.5 -3.2 3.9 -2.7 c 3.1 -3.6 l 3.5 -4 3.8 -4.4 3.9 -4.8 c 3.9 -5.2 3.8 -5.6 3.6 -6 c 3.3 -6.4 3 -6.7 2.6 -6.8 c 2.2 -6.8 1.8 -6.8 1.4 -6.5 c 0.9 -6.2 0.7 -5.8 0.7 -5.3 c 0.7 -4.8 0.9 -4.4 1.1 -3.9 c 1.2 -3.9 1.2 -3.8 1.3 -3.8 c 0.4 -3.1 l 0.3 -3.4 0.2 -3.7 0.1 -3.9 c -0.2 -4.3 -0.6 -4.6 -1.1 -4.7 c -1.6 -4.8 -2.1 -4.7 -2.6 -4.4 c -3.1 -4.1 -3.4 -3.7 -3.5 -3.1 c -3.6 -2.6 -3.5 -2.1 -3.2 -1.6 c -2.9 -1.2 -2.6 -0.9 -2.1 -0.8 c -1.7 -0.7 -1.1 -0.8 -0.5 -1 c 0 0 l f* Q q 1 0 0 1 7149.5 5361.1001 cm 0 0 m 0.3 -0.2 0.7 -0.3 1 -0.4 c 1.3 -0.4 1.7 -0.4 2 -0.3 c 2.6 -0.1 3.1 0.3 3.6 0.9 c 4.1 1.8 4.3 2.7 4 3.6 c 3.7 4.7 2.7 5.8 1.1 6.8 c -0.3 7.7 -1.5 8.2 -2.5 8 c -3.4 7.9 -4.2 7.4 -4.8 6.6 c -5.1 6.1 -5.3 5.6 -5.3 5 c -5.3 4.5 -5.2 3.9 -4.9 3.4 c -4.6 2.9 -4.2 2.5 -3.7 2.1 c -2.9 1.6 -2.1 1.4 -1.3 1.6 c -0.5 1.7 0.2 2.1 0.6 2.8 c 0.9 3.2 1 3.6 1.1 4.1 c 1.1 4.6 1.1 5.1 0.8 5.5 c 0.8 5.5 l 1.7 5 2.2 4.5 2.6 4 c 2.9 3.5 3.1 3 3.1 2.6 c 3.1 2.2 3 1.9 2.8 1.5 c 2.5 1.1 2.1 0.9 1.7 0.8 c 1.4 0.8 1 0.8 0.6 1 c 0 0 l -0.8 6.4 m -0.3 6.1 0 5.6 0.1 5.1 c 0.3 4.6 0.2 4.1 -0.1 3.6 c -0.4 3.2 -0.9 2.9 -1.4 2.8 c -1.9 2.7 -2.5 2.9 -3 3.2 c -3.6 3.6 -4 4.1 -4.1 4.6 c -4.3 5.2 -4.2 5.6 -3.9 6.1 c -3.7 6.4 -3.5 6.6 -3.1 6.7 c -2.8 6.9 -2.4 6.9 -2 6.9 c -1.6 6.8 -1.2 6.7 -0.8 6.4 c f* Q q 1 0 0 1 7140 5358.1001 cm 0 0 m 2.6 4 l 2.8 3.8 2.8 3.5 2.9 3.2 c 3 2.9 3.1 2.3 3.2 1.4 c 3.3 0.2 3.4 -0.6 3.6 -1.1 c 3.7 -1.7 3.9 -2.1 4.1 -2.5 c 4.4 -2.8 4.7 -3.1 5 -3.3 c 5.6 -3.8 6.3 -3.9 7.1 -3.7 c 7.8 -3.5 8.4 -3.1 9 -2.3 c 9.5 -1.5 9.7 -0.7 9.6 0 c 9.5 0.7 9.1 1.4 8.4 2 c 7.6 1 l 8.1 0.7 8.4 0.2 8.5 -0.2 c 8.6 -0.7 8.5 -1.2 8.1 -1.7 c 7.8 -2.2 7.5 -2.4 7 -2.5 c 6.5 -2.6 6.1 -2.6 5.7 -2.3 c 5.3 -2.1 5 -1.6 4.8 -1 c 4.6 -0.4 4.4 0.6 4.2 1.9 c 4.2 2.8 4 3.5 3.9 4.1 c 3.7 4.6 3.5 5.1 3.2 5.5 c 3.1 5.7 2.8 5.9 2.6 6.1 c -1 0.6 l 0 0 l f* Q q 1 0 0 1 7140.1001 5356.2002 cm 0 0 m -0.7 0.4 -1.4 0.5 -2 0.3 c -2.6 0.1 -3.2 -0.3 -3.6 -0.9 c -4 -1.5 -4.2 -2.2 -4.1 -2.8 c -4.1 -3.5 -3.9 -4.2 -3.4 -4.8 c -2.9 -5.4 -2.2 -6.1 -1.1 -6.8 c -0.1 -7.5 0.7 -7.9 1.4 -8 c 2.1 -8.1 2.7 -8.1 3.3 -7.8 c 3.9 -7.5 4.4 -7.2 4.7 -6.6 c 5.2 -5.9 5.4 -5.1 5.2 -4.3 c 5 -3.4 4.5 -2.7 3.7 -2.2 c 2.9 -1.7 2 -1.5 1.2 -1.6 c 0.4 -1.8 -0.2 -2.2 -0.6 -2.8 c -0.9 -3.3 -1.1 -3.7 -1.1 -4.2 c -1.1 -4.7 -1 -5.1 -0.9 -5.5 c -0.9 -5.5 l -0.9 -5.5 -1 -5.4 -1.1 -5.4 c -1.5 -5.1 -1.9 -4.8 -2.2 -4.4 c -2.5 -4.1 -2.8 -3.7 -2.9 -3.4 c -3.1 -3.1 -3.1 -2.8 -3.1 -2.5 c -3.1 -2.1 -3 -1.8 -2.8 -1.5 c -2.5 -1.1 -2.2 -0.9 -1.9 -0.8 c -1.5 -0.7 -1.1 -0.8 -0.6 -1 c 0 0 l 0.9 -6.5 m 0.3 -6.1 -0.1 -5.7 -0.2 -5.2 c -0.3 -4.6 -0.2 -4.2 0.1 -3.7 c 0.4 -3.2 0.8 -2.9 1.4 -2.8 c 1.9 -2.7 2.4 -2.9 2.9 -3.2 c 3.5 -3.6 3.9 -4.1 4 -4.7 c 4.2 -5.2 4.1 -5.7 3.8 -6.2 c 3.5 -6.6 3.1 -6.9 2.6 -7 c 2 -7 1.5 -6.9 0.9 -6.5 c f* Q q 1 0 0 1 7135.8999 5349.7998 cm 0 0 m -0.7 0.4 -1.4 0.5 -2 0.3 c -2.7 0.1 -3.2 -0.3 -3.6 -0.9 c -4 -1.5 -4.2 -2.2 -4.2 -2.8 c -4.1 -3.5 -3.9 -4.2 -3.4 -4.8 c -3 -5.4 -2.2 -6.1 -1.1 -6.8 c -0.1 -7.5 0.7 -7.9 1.4 -8 c 2.1 -8.1 2.7 -8 3.3 -7.8 c 3.9 -7.5 4.3 -7.1 4.7 -6.6 c 5.2 -5.9 5.3 -5.1 5.2 -4.3 c 5 -3.4 4.5 -2.7 3.6 -2.2 c 2.8 -1.7 2 -1.5 1.2 -1.6 c 0.4 -1.7 -0.2 -2.2 -0.7 -2.8 c -0.9 -3.2 -1.1 -3.7 -1.1 -4.2 c -1.2 -4.7 -1.1 -5.1 -0.9 -5.5 c -0.9 -5.5 l -1 -5.5 -1 -5.4 -1.1 -5.4 c -1.5 -5.1 -1.9 -4.8 -2.2 -4.4 c -2.6 -4.1 -2.8 -3.7 -2.9 -3.4 c -3.1 -3.1 -3.1 -2.8 -3.1 -2.5 c -3.1 -2.1 -3 -1.8 -2.8 -1.5 c -2.6 -1.1 -2.3 -0.9 -1.9 -0.8 c -1.5 -0.7 -1.1 -0.8 -0.6 -1 c 0 0 l 0.8 -6.5 m 0.3 -6.1 -0.1 -5.7 -0.2 -5.2 c -0.3 -4.6 -0.3 -4.1 0.1 -3.7 c 0.4 -3.2 0.8 -2.9 1.3 -2.8 c 1.9 -2.7 2.4 -2.9 2.9 -3.2 c 3.5 -3.6 3.9 -4.1 4 -4.6 c 4.2 -5.2 4.1 -5.7 3.8 -6.2 c 3.5 -6.6 3.1 -6.9 2.5 -7 c 2 -7 1.4 -6.9 0.8 -6.5 c f* Q Q endstream endobj 5 0 obj << /Type /Font /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 7 0 obj << /Type /Catalog /Pages 8 0 R >> endobj 8 0 obj << /Type /Pages /Count 1 /Kids [ 9 0 R ] >> endobj 9 0 obj << /Type /Page /Contents [ 4 0 R ] /CropBox [ 0 0 9600 14400 ] /MediaBox [ 0 0 9600 14400 ] /Parent 8 0 R /Resources << /Font << /T1_0 5 0 R >> >> /Rotate 0 /TrimBox [ 0 0 9600 14400 ] /UserUnit 1.181100 >> endobj xref 0 10 0000000002 65535 f 0000000015 00001 n 0000000003 00001 f 0000000006 00001 f 0000000118 00000 n 0000004822 00000 n 0000000000 00001 f 0000004921 00000 n 0000004970 00000 n 0000005029 00000 n trailer << /ID [ <102EFC93599C640D4A337FB9FFB8ECDD> <102EFC93599C640D4A337FB9FFB8ECDD> ] /Info 1 1 R /Root 7 0 R /Size 10 >> startxref 5251 %%EOF gdalautotest-3.0.4/ogr/data/esrijsonstartingwithfeaturesgeometry.json0000644003401500001440000000124513614004466026050 0ustar rouaultusers{ "features" : [ { "geometry" : { "rings" : [ [ [ 2, 49, 1 ], [ 2, 50, 2 ], [ 3, 50, 3 ], [ 3, 49, 4 ], [ 2, 49, 1 ] ] ] }, "attributes" : { } } ], "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolygon", "fields" : [ ] } gdalautotest-3.0.4/ogr/data/cswresults.xml0000644003401500001440000000440513614005330020266 0ustar rouaultusers an_identifier a_title dataset a_subject http://foo/ 2015-04-27 an_abstract 2015-04-27 eng -90 -180 90 180 an_identifier2 a_title dataset -90 -180 90 180 an_identifier3 a_title dataset a_subject http://foo/ 2015-04-27 an_abstract -90 -180 90 180 gdalautotest-3.0.4/ogr/data/dimension.dxf0000755003401500001440000002736313614004470020035 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 AA51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 EEEF1 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 -3 390 4CF 347 4E1 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 330 0 100 AcDbSymbolTable 70 4 100 AcDbDimStyleTable 71 2 340 508 340 57 0 DIMSTYLE 105 57 330 A 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 55 0 DIMSTYLE 105 508 330 A 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 housedimensionstyle 70 0 42 0.1 44 0.5 282 1 340 55 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 78 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *D0 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 80 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *U1 340 0 102 {BLKREFS 331 81 102 } 70 0 280 1 281 0 0 BLOCK_RECORD 5 8E 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *U3 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 9C 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *U5 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 AA 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *U7 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 E5 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *D10 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 4C0 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *D11 340 0 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 79 330 78 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *D0 70 1 10 0.0 20 0.0 30 0.0 3 *D0 1 0 LINE 5 7A 330 78 100 AcDbEntity 8 0 62 0 100 AcDbLine 10 320000.0 20 5820010.0625 30 0.0 11 320000.0 21 5820010.430872581 31 0.0 0 LINE 5 7B 330 78 100 AcDbEntity 8 0 62 0 100 AcDbLine 10 320010.0 20 5820010.0625 30 0.0 11 320010.0 21 5820010.430872581 31 0.0 0 LINE 5 7C 330 78 100 AcDbEntity 8 0 62 0 100 AcDbLine 10 320000.1800000001 20 5820010.250872585 30 0.0 11 320004.4752251024 21 5820010.250872585 31 0.0 0 LINE 5 7D 330 78 100 AcDbEntity 8 0 62 0 100 AcDbLine 10 320009.82 20 5820010.250872585 30 0.0 11 320005.5247748977 21 5820010.250872585 31 0.0 0 SOLID 5 7E 330 78 100 AcDbEntity 8 0 62 0 100 AcDbTrace 10 320000.1800000001 20 5820010.280872585 30 0.0 11 320000.1800000001 21 5820010.220872585 31 0.0 12 320000.0 22 5820010.250872585 32 0.0 13 320000.0 23 5820010.250872585 33 0.0 0 SOLID 5 7F 330 78 100 AcDbEntity 8 0 62 0 100 AcDbTrace 10 320009.82 20 5820010.280872585 30 0.0 11 320009.82 21 5820010.220872585 31 0.0 12 320010.0 22 5820010.250872585 32 0.0 13 320010.0 23 5820010.250872585 33 0.0 0 INSERT 5 81 330 78 100 AcDbEntity 8 0 100 AcDbBlockReference 2 *U1 10 0.0 20 0.0 30 0.0 0 POINT 5 82 330 78 100 AcDbEntity 8 DEFPOINTS 62 0 100 AcDbPoint 10 320000.0 20 5820010.0 30 0.0 0 POINT 5 83 330 78 100 AcDbEntity 8 DEFPOINTS 62 0 100 AcDbPoint 10 320010.0 20 5820010.0 30 0.0 0 POINT 5 84 330 78 100 AcDbEntity 8 DEFPOINTS 62 0 100 AcDbPoint 10 320010.0 20 5820010.250872585 30 0.0 0 ENDBLK 5 85 330 78 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 B0 330 80 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *U1 70 1 10 0.0 20 0.0 30 0.0 3 *U1 1 0 TEXT 5 B1 330 80 100 AcDbEntity 8 0 62 0 100 AcDbText 10 320004.5378444747 20 5820010.162407372 30 0.0 40 0.18 1 10.0000 100 AcDbText 0 ENDBLK 5 B2 330 80 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 C2 330 8E 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *U3 70 1 10 0.0 20 0.0 30 0.0 3 *U3 1 0 TEXT 5 C3 330 8E 100 AcDbEntity 8 0 62 0 100 AcDbText 10 320002.149658935 20 5820007.299999998 30 0.0 40 0.4 1 7.1 100 AcDbText 0 ENDBLK 5 C4 330 8E 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 BE 330 9C 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *U5 70 1 10 0.0 20 0.0 30 0.0 3 *U5 1 0 TEXT 5 BF 330 9C 100 AcDbEntity 8 0 62 0 100 AcDbText 10 320001.2571350614 20 5820001.563069577 30 0.0 40 0.18 1 ±2 3 100 AcDbText 0 TEXT 5 C0 330 9C 100 AcDbEntity 8 0 62 0 100 AcDbText 10 320001.2368758527 20 5820001.26116644 30 0.0 40 0.18 1 \P4 ⁵ 100 AcDbText 0 ENDBLK 5 C1 330 9C 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 B3 330 AA 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *U7 70 1 10 0.0 20 0.0 30 0.0 3 *U7 1 0 TEXT 5 B4 330 AA 100 AcDbEntity 8 0 62 0 100 AcDbText 10 320007.1162414734 20 5819999.91153479 30 0.0 40 0.18 1 5.0000 100 AcDbText 0 ENDBLK 5 B5 330 AA 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 E6 330 E5 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *D10 70 1 10 0.0 20 0.0 30 0.0 3 *D10 1 0 LINE 5 EEFA1 330 E5 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320005.0 20 5820002.4 30 0.0 11 320005.0 21 5820001.0 31 0.0 0 LINE 5 EEFA2 330 E5 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320000.0 20 5820002.4 30 0.0 11 320000.0 21 5820001.0 31 0.0 0 LINE 5 EEFA3 330 E5 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320004.8200000001 20 5820001.5 30 0.0 11 320002.5000272852 21 5820001.5 31 0.0 0 MTEXT 5 EEFA4 330 E5 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbMText 10 320001.5 20 5820001.5 30 0.0 40 0.18 41 0.0 46 0.0 71 5 72 1 1 \A1;%%p2\~3\P\\P4 5.0000 73 1 44 1.0 0 SOLID 5 EEFA5 330 E5 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbTrace 10 320004.8200000001 20 5820001.53 30 0.0 11 320004.8200000001 21 5820001.47 31 0.0 12 320005.0 22 5820001.5 32 0.0 13 320005.0 23 5820001.5 33 0.0 0 POINT 5 EEFA6 330 E5 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320005.0 20 5820002.5 30 0.0 0 POINT 5 EEFA7 330 E5 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320000.0 20 5820002.5 30 0.0 0 POINT 5 EEFA8 330 E5 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320000.0 20 5820001.5 30 0.0 0 ENDBLK 5 E7 330 E5 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 4C1 330 4C0 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *D11 70 1 10 0.0 20 0.0 30 0.0 3 *D11 1 0 LINE 5 4CDEE 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320000.0530330088 20 5820010.053033009 30 0.0 11 320000.1527350648 21 5820010.152735064 31 0.0 0 LINE 5 4CE 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320005.0530330087 20 5820005.05303301 30 0.0 11 320005.1527350647 21 5820005.152735064 31 0.0 0 LINE 5 4CF 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320001.0606601718 20 5820008.939339827 30 0.0 11 320002.1520000003 21 5820007.847999999 31 0.0 0 LINE 5 4D0 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 370 -2 100 AcDbLine 10 320003.9393398282 20 5820006.060660172 30 0.0 11 320002.8480000002 21 5820007.152 31 0.0 0 SOLID 5 4D1 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbTrace 10 320001.2374368674 20 5820009.116116524 30 0.0 11 320000.8838834767 21 5820008.762563134 31 0.0 12 320000.0 22 5820010.0 32 0.0 13 320000.0 23 5820010.0 33 0.0 0 SOLID 5 4D2 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbTrace 10 320004.1161165238 20 5820006.237436867 30 0.0 11 320003.7625631332 21 5820005.883883476 31 0.0 12 320005.0 22 5820005.0 32 0.0 13 320005.0 23 5820005.0 33 0.0 0 MTEXT 5 4D3 330 4C0 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbMText 10 320002.4999999991 20 5820007.5 30 0.0 40 0.48 41 0.0 46 0.0 71 5 72 1 1 \A1;7.1 73 1 44 1.0 0 POINT 5 4D4 330 4C0 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320000.0 20 5820010.0 30 0.0 0 POINT 5 4D5 330 4C0 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320005.0 20 5820005.0 30 0.0 0 POINT 5 4D6 330 4C0 100 AcDbEntity 8 DEFPOINTS 62 0 440 16777216 100 AcDbPoint 10 320005.0 20 5820005.0 30 0.0 0 ENDBLK 5 4C2 330 4C0 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 DIMENSION 5 CB 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D0 10 320010.0 20 5820010.250872585 30 0.0 11 320005.0 21 5820010.250872585 31 0.0 71 5 42 -1.0 73 0 74 0 75 0 3 STANDARD 100 AcDbAlignedDimension 13 320000.0 23 5820010.0 33 0.0 14 320010.0 24 5820010.0 34 0.0 100 AcDbRotatedDimension 0 DIMENSION 5 CC 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D11 10 320005.0 20 5820005.0 30 0.0 11 320002.4999999991 21 5820007.5 31 0.0 70 33 71 5 42 7.071067811921238 73 0 74 0 75 0 3 STANDARD 100 AcDbAlignedDimension 13 320000.0 23 5820010.0 33 0.0 14 320005.0 24 5820005.0 34 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 40 1040 1.199999999999999 1070 271 1070 1 1070 170 1070 0 1070 140 1040 0.4 1070 41 1040 1.25 1002 } 0 DIMENSION 5 CD 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D10 10 320000.0 20 5820001.5 30 0.0 11 320001.5 21 5820001.5 31 0.0 70 160 1 %%p2\~3\P\\P4 <> 71 5 42 5.0 73 0 74 0 75 0 3 housedimensionstyle 100 AcDbAlignedDimension 13 320005.0 23 5820002.5 33 0.0 14 320000.0 24 5820002.5 34 0.0 100 AcDbRotatedDimension 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/0000755003401500001440000000000013614004466022566 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000005.gdbtablx0000644003401500001440000001204013614004466025321 0ustar rouaultusers  7_2_"ZQ{GsEvgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.CatRelTypesByBackwardLabel.atx0000644003401500001440000001002613614004466031422 0ustar rouaultusers  Child Folder Of Contained In FeatureDataset Contained In Folder Contained in Dataset Contained in Dataset Dataset of Replicated Dataset Destination Of Participates In Geometric Network Participates In Network Dataset Participates In Network Dataset Participates In Parcel Fabric Participates In Parcel Fabric Participates In Replica Participates In Terrain Participates In Topology Represented Feature Class gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000001.gdbindexes0000644003401500001440000000015613614004466025647 0ustar rouaultusersFDO_IDID TablesByName LOWER(Name)gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.CatRelTypesByUUID.atx0000644003401500001440000001002613614004466027512 0ustar rouaultusers    {0D10B3A7-2F64-45E6-B7AC-2FC27BF2133C}{17E08ADB-2B31-4DCD-8FDD-DF529E88F843}{55D2F4DC-CB17-4E32-A8C7-47591E8C71DE}{583A5BAA-3551-41AE-8AA8-1185719F3889}{5DD0C1AF-CB3D-4FEA-8C51-CB3BA8D77CDB}{5F9085E0-788F-4354-AE3C-34C83A7EA784}{725BADAB-3452-491B-A795-55F32D67229C}{8DB31AF1-DF7C-4632-AA10-3CC44B0C6914}{908A4670-1111-48C6-8269-134FDD3FE617}{A1633A59-46BA-4448-8706-D8ABE2B2B02E}{B32B8563-0B96-4D32-92C4-086423AE9962}{D022DE33-45BD-424C-88BF-5B1B6B957BD3}{D088B110-190B-4229-BDF7-89FDDD14D1EA}{DC739A70-9B71-41E8-868C-008CF46F16D7}{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}{E79B44E3-F833-4B12-90A1-364EC4DDC43E}&gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000005.CatItemTypesByName.atx0000644003401500001440000003002613614004466030000 0ustar rouaultusersRaster Dataset   AbstractTable Catalog Dataset Coded Value Domain Dataset Domain Extension Dataset Feature Class Feature Dataset Folder Geometric Network Historical Marker Item Mosaic Dataset Network Dataset Parcel Fabric Range Domain Raster Catalog Raster Dataset   Relationship Class Replica Replica Dataset Representation Class Resource Schematic Dataset Survey Dataset Table Terrain Tin Toolbox Topology Workspace Workspace Extension  gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000004.gdbtable0000644003401500001440000001306013614004466025300 0ustar rouaultusers0(&ObjectIDUUID &Type &Name PhysicalNamePathDatasetSubtype1DatasetSubtype2 DatasetInfo1 DatasetInfo2URL Definition  Documentation ItemInfo  PropertiesDefaultsShape"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.A>~jt??(@ޭ+x& OpMDo>xeE9ӱ\xwC0J{%gE sƀrO@2 u] Workspace WORKSPACE \ false esriLocalDatabaseWorkspace 3 0 0 @kT VdQIB}y xsp,J",[testTEST\testSHAPE \testtestfalseesriDTFeatureClass3falsefalsetrueOBJECTIDSHAPEesriFieldTypeGeometrytrue000trueOBJECTIDesriFieldTypeOIDfalse1200true{52353152-891A-11D0-BEC6-00805F7C4268}esriFTSimpleesriGeometryPolylineSHAPEfalsefalsefalse-2147483647-214748364710000-100000100000.0010000.001000true @kT VdQIB}y xsp,J",[testTEST\testSHAPE \test test false esriDTFeatureClass 3 false false true OBJECTID SHAPE esriFieldTypeGeometry true 0 0 0 true OBJECTID esriFieldTypeOID false 12 0 0 true id esriFieldTypeString true 65536 0 0 {52353152-891A-11D0-BEC6-00805F7C4268} esriFTSimple esriGeometryPolyline SHAPE false false false -2147483647 -2147483647 10000 -100000 10000 0.001000 0.001000 true gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000006.gdbindexes0000644003401500001440000000047613614004466025661 0ustar rouaultusers FDO_ObjectIDObjectIDFDO_UUIDUUIDCatRelsByOriginIDOriginIDCatRelsByDestinationIDDestID CatRelsByTypeTypegdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000002.gdbtablx0000644003401500001440000001204013614004466025316 0ustar rouaultusersBd4]&^@ Vgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000001.TablesByName.atx0000644003401500001440000001002613614004466026631 0ustar rouaultusers  gdb_dbtune gdb_itemrelationships gdb_itemrelationshiptypes gdb_items gdb_itemtypes gdb_replicalog gdb_spatialrefs gdb_systemcatalog test  gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000003.gdbtable0000644003401500001440000000110613614004466025275 0ustar rouaultusersF( IDSRTEXTFalseXFalseYXYUnitsFalseZZUnitsFalseMMUnits XYTolerance ZTolerance MToleranceޭxGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.A>a`&{B286C06B-0879-11D2-AACA-00C04FA33C20}@j@MbP?MbP?gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000005.CatItemTypesByUUID.atx0000644003401500001440000001002613614004466027664 0ustar rouaultusers       {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{35B601F7-45CE-4AFF-ADB7-7702D3839B12}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5ED667A3-9CA9-44A2-8029-D95BF23704B9}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{77292603-930F-475D-AE4F-B8970F42F394}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{787BEA35-4A86-494F-BB48-500B96145B58}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8C368B12-A12E-4C7E-9638-C9C64E69E98F}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{B606A7E1-FA5B-439C-849C-6E9C2481537B}{C29DA988-8C3E-45F7-8B5C-18E51EE7BEB4}{C673FE0F-7280-404F-8532-20755DD8FC06}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D5A40288-029E-4766-8C81-DE3F61129371}{D98421EB-D582-4713-9484-43304D0810F6}{DB1B697A-3BB6-426A-98A2-6EE7A4C6AED3}{DC64B6E4-DC0F-43BD-B4F5-F22385DCF055}{DC9EF677-1AA3-45A7-8ACD-303A5202D0DC}{E6302665-416B-44FA-BE33-4E15916BA101}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F8413DCB-2248-4935-BFE9-315F397E5110}{FBDD7DD6-4A25-40B7-9A1A-ECC3D1172447}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}& gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.CatRelTypesByName.atx0000644003401500001440000001002613614004466027624 0ustar rouaultusers  DatasetInFeatureDataset DatasetInFolder DatasetOfReplicaDataset DatasetsRelatedThrough DomainInDataset FeatureClassInGeometricNetwork FeatureClassInNetworkDataset FeatureClassInParcelFabric FeatureClassInTerrain FeatureClassInTopology FolderInFolder ItemInFolder ReplicaDatasetInReplica RepresentationOfFeatureClass TableInNetworkDataset TableInParcelFabric gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000005.gdbtable0000644003401500001440000000325513614004466025306 0ustar rouaultusers ^(^ObjectIDUUID & ParentTypeID &Nameޭ%խ'B?3Item'o>xeE9ӱխ'B?3Folder)(p%N|^խ'B?3Resource((mM&Nag}(p%N|^Dataset$}%J@$G(mM&Nag}Tin.b!4nG*i9(mM&Nag} AbstractTable3[Cn$S{(mM&Nag}Relationship Class0IqstWBrN20(mM&Nag}Feature Dataset2fqsKQ & (mM&Nag}Geometric Network)Rqvf%CtB FgN(mM&Nag}Topology/e&0kAD3Nk(mM&Nag}Survey Dataset2՞fG?aq(mM&Nag}Schematic Dataset(zi۶;jBnƮӉ(mM&Nag}Toolbox*sƀrO@2 u](mM&Nag} Workspace4wܣE0:R܉(mM&Nag}Workspace Extension2&)w]GOB󔉞(mM&Nag}Extension Dataset'7fHJ(E\羴7fHJ(@6gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000004.freelist0000644003401500001440000001053013614004466025350 0ustar rouaultusers7gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000006.gdbtable0000644003401500001440000000041313614004466025300 0ustar rouaultusers (ObjectIDUUID &OriginID &DestID &Type & Attributes  PropertiesޭEq_2z@1& OpMDkT VdQIB}yx4CGNgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/timestamps0000644003401500001440000000062013614004466024675 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.gdbindexes0000644003401500001440000000113213614004466025650 0ustar rouaultusers FDO_ObjectIDObjectIDCatRelTypesByUUIDUUIDCatRelTypesByOriginItemTypeIDOrigItemTypeIDCatRelTypesByDestItemTypeIDDestItemTypeIDCatRelTypesByNameNameCatRelTypesByForwardLabel ForwardLabelCatRelTypesByBackwardLabel BackwardLabelgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.CatRelTypesByForwardLabel.atx0000644003401500001440000001002613614004466031310 0ustar rouaultusers  Contains Dataset Contains Dataset Contains Domain Contains Item Feature Class Representation Manages Table Manages Table Origin Of Parent Folder Of Replicated Dataset Replicated Dataset Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000001.gdbtablx0000644003401500001440000001204013614004466025315 0ustar rouaultusers n2gdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/gdb0000644003401500001440000000001013614004466023234 0ustar rouaultusersޭgdalautotest-3.0.4/ogr/data/curve_circle_by_center.gdb/a00000007.gdbtable0000644003401500001440000000433313614004466025306 0ustar rouaultusers(ObjectIDUUID &OrigItemTypeID &DestItemTypeID &Name ForwardLabel BackwardLabel IsContainmentޭc d/E/{xeE9ӱo>xeE9ӱFolderInFolderParent Folder OfChild Folder Ofb]=OQ;|o>xeE9ӱխ'B?3 ItemInFolder Contains ItemContained In FolderxY:cFHDثⲰ.IqstWBrN20(mM&Nag}DatasetInFeatureDatasetContains DatasetContained In FeatureDatasetix4CGNo>xeE9ӱ(mM&Nag}DatasetInFolderContains DatasetContained in Datasethۊ1+MRC(mM&Nag}7fHJ( xsp,J",[ jOF=RepresentationOfFeatureClassFeature Class RepresentationRepresented Feature Classv|2F 00001TPM NBA_RIO NBA_1000_NBA_RIO_2011-02-07T00:00:00Z NBA_NBA_RIO Benutzung 0040 beendet 2011-02-08T01:10:30.000Z 2011-02-08T01:12:30.000Z Ergebnis wohlgeformt und valide gegen seine Schemadateien Meldung ]]> true NBA_NBA_RIO - 3 false 3 true NBA_1000_NBA_RIO_2011-02-07T00:00:00Z NBA_RIO 2011-02-08T00:00:00Z 0 0 0.000 0.000 gdalautotest-3.0.4/ogr/data/ogr_gml_56_schema.xsd0000644003401500001440000000607413614005330021332 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/segy/0000755003401500001440000000000013614004466016303 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/segy/ascii-header-with-nuls.sgy0000644003401500001440000006702013614004466023302 0ustar rouaultusersC1 COMPANY:SIOC2 LINE:1 AREA:La Jolla C3 TAPE NO:8 DAY:320 YEAR:2002 C4 INSTRUMENT: X-star Full Spectrum (tm) Profiler/Vehicle ID: C5 C6 SAMPLES/TRACE:3976 BYTES/SAMPLE:2C7C8 SAMPLE CODE: FIXED POINTC9 GAIN TYPE: FLOATING POINTC10C11 SOURCE: TYPE:FMC12C13C14C15C16C17C18C19 AMPLITUDE RECOVERY: SPHERICAL DIVERGENCE APPLIEDC20C21 PROCESSING: DATA IN ANALYTIC FORM:REAL(0),IMAG(0),...,REAL(2047),IMAG(2047)C22C23 ENVELOPE AMPL= TRACE SCALE FACTOR*SQRT(REAL*REAL+IMAG*IMAG)/32000*1.41e-14C24 CALIBRATED ENVELOPE AMPLITUDE= ENVELOPE AMPL*10^(SYSTEM CONSTANT/200)C25 ENVELOPE SAMPLE INTERVAL = A/D SAMPLE INTERVAL*2C26 SOURCE COORDINATES PROVIDE THE POSITION OF THE VEHICLEC27 IN SECONDS OF ARC (Bytes 73-80)C28 GROUP COORDINATES PROVIDE THE POSITION OF THE VEHICLEC29 IN 1/10000 MINUTES (Bytes 81-88)C30C31C32C33C34C35C36C37C38C39C40Fmi-TdU| a @+7W`4~+l#( ,67UF4@zfvyyg3]KWRdHb -l (k'7v0vZLeYrL?m+I!(w-4.@ҷ. !KAEK] 8$;{ y DijgTI 9G"[t  9%zl k)khAT!h ;}FkV6*HRRVXGJ ]cBS[r[1KjREkkh? A ', 735  H pPF  {0F[yW;0OQQM *"   Q , R yE& eQ'$R * y  c xF t S . 6' 29Lksl!!j"bu  Y,?vZ[7Z  M4+u4X%DEZDxK`RO7z[ [?~)Znr(V%cnRuW M}bna5bKA8gtg!gGN ,0{IS# ll*Bz\ &5ey7}=V)^hC4-/g#/h LB"wHM5*vfJ\wO.7:]BS!42 X^. zI=B>(Ox P E7as+bpV[ |. &  ? 2m ENdd<-HRq|gfn 7F#{{]nk?[jH]76CK}WkQ+;$xGZ-$ ~![x (Q?(\f*glUwAPjmn 2*u8Z(a/}Cf j yZD %H mm8(!A6QtJ{%=b4n "qi!0\c# SI\9G=iPKl]%RvNS)i~d;:'>U9[KF2:6qj , dMyh3kE<['4*3b&u5Cs2lpF[w5&)9<Jmb-k Bf^Y:gJoQmE^F&1BGgE.6w]*5"x**_wav8QUueqrs.{&=\ JCC GT- ',Z! X2 B:P()~y Wyf( H[7u$1xjoxB32'HO>$E$== Jx9;;rWI6"d"D 5.lZr.;!0^Xf0"21fu7YVY)[Y$}`^,%mfE5'\7} ErS!G=cB@pMJr8:m][LbD# @OvHyE]-bQbGMN:i-u@s=T5uzunj=th|p/]KA`%gjyDn&[_/M1&>mNFf!`m&,2:1UhG115XcCGl#zdXAbl$(5PO,*=T2; X EM d%6o|B@+XOL1$/C'6 R&eBra{"\VZ'u (%}a:[ 2 +HSMaUz,||C|<^cg&:[TwAa)mRb[L81&o+Ta6V? B_#&aSx]4s]=9MU;{.Muad,6e=fU%%s-`-G4O"<<{[gf]Ob!pmu&%0&"XAl ? FO6L"2HUAUB 9Xf r1aq[t@W{cv'R18s!^X|tn@0+2nH=#'NU3?+v3@63*A`^8 )HK.+LJ90) & cTo!j1* Y6$dn%4XBOcfMxhL +o->(|B=:S.HG(|S*[hSjh6;y;D|YF p[Tb+M`SK_M%`p5zY}l?v2f1/pj+2?H!"?e[Kkw5u8r=R363zX"I`5GcHHGW($ hXe~@3=Hb} f+#]"B + Oi6$y poA 3KOs s=y;pCxeMk6i)n|2\3HDZ,a^\x>t VL !uO0;hB$qmbnPvdt#tj+a};m})dVGakm47&$;Xiot9oqBn,Q7nd F`atWpNS1j#^\ItjO"\Y@3`V$cY%oa]#cJG 1[.2,q=j.Esm5< sH{.b8m#c;:ZvSHDS@VDBDXgXiw:%y4FFmi-TdU| a @+7W`4~+l#( ,67UF4@zfvyyg3]KWRdHb -l (k'7v0vZLeYrL?m+I!(w-4.@ҷ. !KAEK] 8$;{ y DijgTI 9G"[t  9%zl k)khAT!h ;}FkV6*HRRVXGJ ]cBS[r[1KjREkkh? A ', 735  H pPF  {0F[yW;0OQQM *"   Q , R yE& eQ'$R * y  c xF t S . 6' 29Lksl!!j"bu  Y,?vZ[7Z  M4+u4X%DEZDxK`RO7z[ [?~)Znr(V%cnRuW M}bna5bKA8gtg!gGN ,0{IS# ll*Bz\ &5ey7}=V)^hC4-/g#/h LB"wHM5*vfJ\wO.7:]BS!42 X^. zI=B>(Ox P E7as+bpV[ |. &  ? 2m ENdd<-HRq|gfn 7F#{{]nk?[jH]76CK}WkQ+;$xGZ-$ ~![x (Q?(\f*glUwAPjmn 2*u8Z(a/}Cf j yZD %H mm8(!A6QtJ{%=b4n "qi!0\c# SI\9G=iPKl]%RvNS)i~d;:'>U9[KF2:6qj , dMyh3kE<['4*3b&u5Cs2lpF[w5&)9<Jmb-k Bf^Y:gJoQmE^F&1BGgE.6w]*5"x**_wav8QUueqrs.{&=\ JCC GT- ',Z! X2 B:P()~y Wyf( H[7u$1xjoxB32'HO>$E$== Jx9;;rWI6"d"D 5.lZr.;!0^Xf0"21fu7YVY)[Y$}`^,%mfE5'\7} ErS!G=cB@pMJr8:m][LbD# @OvHyE]-bQbGMN:i-u@s=T5uzunj=th|p/]KA`%gjyDn&[_/M1&>mNFf!`m&,2:1UhG115XcCGl#zdXAbl$(5PO,*=T2; X EM d%6o|B@+XOL1$/C'6 R&eBra{"\VZ'u (%}a:[ 2 +HSMaUz,||C|<^cg&:[TwAa)mRb[L81&o+Ta6V? B_#&aSx]4s]=9MU;{.Muad,6e=fU%%s-`-G4O"<<{[gf]Ob!pmu&%0&"XAl ? FO6L"2HUAUB 9Xf r1aq[t@W{cv'R18s!^X|tn@0+2nH=#'NU3?+v3@63*A`^8 )HK.+LJ90) & cTo!j1* Y6$dn%4XBOcfMxhL +o->(|B=:S.HG(|S*[hSjh6;y;D|YF p[Tb+M`SK_M%`p5zY}l?v2f1/pj+2?H!"?e[Kkw5u8r=R363zX"I`5GcHHGW($ hXe~@3=Hb} f+#]"B + Oi6$y poA 3KOs s=y;pCxeMk6i)n|2\3HDZ,a^\x>t VL !uO0;hB$qmbnPvdt#tj+a};m})dVGakm47&$;Xiot9oqBn,Q7nd F`atWpNS1j#^\ItjO"\Y@3`V$cY%oa]#cJG 1[.2,q=j.Esm5< sH{.b8m#c;:ZvSHDS@VDBDXgXiw:%y4FFmi-TdU| a @+7Pg+kX5A"E6bKM1n +-$) cwX\x- W\NQ6oul\fb$t3 EU~A  > S2qN^iu3OO/D(l3>0vKpJ6h6V(Qy6_}.Q(GbHx *>`.015)P? n Q FLq5^ޅ%԰ X9x^ "D dPE?\a@^y_j \OS1lZt@IH  S AD Oq CnWwTG11tex+s D6|&JYMW. W <<-iI, ) /gY]+sOK4seX,i 7 p MP b\0= y1 m >]")[ LmWvO5x k(}T`4 I L 5sUc\z/ 6@  H e 0y9t2{4JPJWFe?(sz9U`19tc >j '[. `Yy % ^;KPt1$ Vz ^ (^kV4!<Fs QMcXp}XXn / k[9 xJ`3m~HoHGH+)?K@"e`)fw2lL*Vvx52Su" g%5]?r>pf3wEl\YZX.aN.% Ez { a`> A " {  _e8bq Zb $ C\ ? , 48 "(y [t k>5x+gg K&_?* =O]4* `c@/?r%C3+EIGfAVD}|!\VLf3-JXP, v( {'0uGn_[;] > lF6 B  F. M~9 B~Mi8o_&4$|0/fe*)]_ )4+%N:fs#aC/TSHL_"m>B{Yo,9m,sYsjFS7:l%Zsi9:@U9W(.n`fA93nhp(^@ ,(xu! ?/-BA<wXpaU/!Milj*D;, jt;G*v6=@V|v8dXBO;I _H[P>xL)ms:^6Wa8eqX[/hj&/wL{<rb{#qX"/i'Q~Dv$5c7V1ai73w>u_&IUw,_z~(Mp4Z  3pp8F](^,$jKvM53sRIdk-(nNHInw`K<}~P*[/5~WO9#i. wfC" i%n$;i,;)<n}fw4XjxDB(`Dq}%s_ztQ3EQ v[ ?53U'3O.fd+ bU|E;r[Tj<4'g;2{]os/A H,X3bv;LP#]VR/9-Z:Q0|&{`L 0E( "0R7O.^bnL3'%X Y\!Z4x^/h^=crj,2n3oZ->_,g$J\*^<&2;fy3E`nRzrMb/5/;w!/$1WQrO+UL%{BL)yo{@> ;+FV|7aJRz:H'{N)~=h}kO.;CD_eKNw:%U' z4#p{Nue9QN:d5YdxQcA`o1Um SoZ!g1)}0[ >5N5",du7[> E=&]J+|ydoiE:,-< KmYhLz} f~_o$PY}*c#  WOb%Hd7"`NOJ*/,S>fm|:w4}4~F)bf,0|dk^g/!Y=IOD}sk[5)`-Rulem!9 9i,Kof!w_ %I{dVC,%I<7<ZUd"ciel2;BREI.jkIR1t{M`~r)}dE9+/0`YS7P(SG@YeRHnEOOo$} q  +6*%=\FevmmI"\Id2LQ/ PD_@JT}R)T2mVA sh _XP88=*6 $qb""JLP{ f"~ gVyijG..&Q> <xK{ B?v4g] ]dhS\g?L Rc=|W v= $3}{A)O?v2n 3(=msz!<P D.^|xc4-R5KqV _m`]dMdaw!Iz=6] 9)Xv1JY_,f,`w )mY_v[b M$Wg)hEp^84egdalautotest-3.0.4/ogr/data/segy/testsegy.segy0000644003401500001440000000740013614004466021044 0ustar rouaultusers@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ D gdalautotest-3.0.4/ogr/data/emptymultiline.dbf0000644003401500001440000000025113614004466021070 0ustar rouaultusers_aHFIDN NAMEC< 2 MultiLine 1 gdalautotest-3.0.4/ogr/data/expected_000_GRD_TAB.txt0000644003401500001440000000215213614004466021437 0ustar rouaultusers//$DELIMITER "tab" //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 1006} //$FIELDS Class=000_GRD;Subclass=000_GRD;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields idSel nom withdata Private#X Private#Y Private#Graphics -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 gdalautotest-3.0.4/ogr/data/gjpoint.shp0000644003401500001440000000020013614004466017512 0ustar rouaultusers' @Y@Y@ Y@gdalautotest-3.0.4/ogr/data/db2/0000755003401500001440000000000013614004466016003 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/db2/db2_setup.sql0000644003401500001440000001256413614004466020423 0ustar rouaultusers-- You should be connected to a DB2 database before running this. -- Clean up tables DROP TABLE TEST.ZIPPOLY; DROP TABLE TEST.ZIPPOINT; DROP TABLE TEST.NOFID; -- To run this on DB2 for z/OS, change the schema for ST_Create_SRS to SYSPROC -- If the SRS already exists, there will be an error but it can be ignored -- -- create an EPSG standard srs for NAD83 -- change the schema from db2gse to SYSPROC for DB2 on z/OS call db2gse.ST_Drop_srs( 'NAD83_SRS_4269' , ?, ?); call db2gse.ST_Create_srs( 'NAD83_SRS_4269' , 4269, -180.0, 5000000.0, -90.0, 5000000, 0, 1000, 0, 1000, 'GCS_NORTH_AMERICAN_1983', 'EPSG4269', ?, ?) ; -- create an EPSG standard srs for WGS84 -- change the schema from db2gse to SYSPROC for DB2 on z/OS call db2gse.ST_Drop_srs( 'NAD83_SRS_4326' , ?, ?); call db2gse.ST_Create_srs( 'WGS84_SRS_4326' , 4326, -180.0, 5000000.0, -90.0, 5000000, 0, 1000, 0, 1000, 'GCS_WGS_1984', 'EPSG4326', ?, ?) ; -- create an EPSG standard srs for NAD27 UTM zone 11N -- used by autotest\gdrivers\db2.py for byte.tiff -- change the schema from db2gse to SYSPROC for DB2 on z/O call db2gse.ST_Drop_srs( 'NAD27_SRS_26711' , ?, ?); call db2gse.ST_Create_srs( 'NAD27_SRS_26711' , 26711, 0, 1000, 0, 1000, 0, 1000, 0, 1000, 'NAD_1927_UTM_ZONE_11N', 'EPSG26711', ?, ?) ; -- create a table of polygons that has a FID column CREATE TABLE TEST.ZIPPOLY( objectid BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY ,wkt VARCHAR(128) ,zip CHAR(5) ,population INTEGER ,shape db2gse.st_polygon ); INSERT INTO TEST.ZIPPOLY(objectid, wkt, zip, population) VALUES ( 1,'POLYGON ((-122.061890 37.351950, -121.982680 37.351950, -121.982680 37.400610, -122.061890 37.400610, -122.061890 37.351950))','94086',56205 ); INSERT INTO TEST.ZIPPOLY(objectid, wkt, zip, population) VALUES ( 2,'POLYGON ((-122.065560 37.332930, -121.995930 37.332930, -121.995930 37.374340, -122.065560 37.374340, -122.065560 37.332930))','94087',47499 ); INSERT INTO TEST.ZIPPOLY(objectid, wkt, zip, population) VALUES ( 3,'POLYGON ((-122.059870 37.388420, -121.974720 37.388420, -121.974720 37.461520, -122.059870 37.461520, -122.059870 37.388420))','94089',13184 ); INSERT INTO TEST.ZIPPOLY(objectid, wkt, zip, population) VALUES ( 4,'POLYGON ((-122.020870 37.417820, -121.961960 37.417820, -121.961960 37.463950, -122.020870 37.463950, -122.020870 37.417820))','95002',1452 ); INSERT INTO TEST.ZIPPOLY(objectid, wkt, zip, population) VALUES ( 5,'POLYGON ((-121.990950 37.255880, -121.922490 37.255880, -121.922490 37.301450, -121.990950 37.301450, -121.990950 37.255880))','95008',43296 ); -- Use WGS84 standard srid UPDATE TEST.ZIPPOLY SET shape = db2gse.st_polygon(wkt, 1003); SELECT COUNT(*) from TEST.ZIPPOLY; -- Register the spatial column with WGS84 to set the SRS_NAME and SRS_ID -- columns in DB2GSE.ST_GEOMETRY_COLUMNS call db2gse.ST_Register_Spatial_Column( 'TEST' , 'ZIPPOLY', 'SHAPE', 'WGS84_SRS_1003', 1, ?, ?) ; -- create a table of points with a primary key CREATE TABLE TEST.ZIPPOINT( objectid BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY ,wkt VARCHAR(128) ,zip CHAR(5) ,population INTEGER ,location db2gse.st_point ); INSERT INTO TEST.ZIPPOINT(wkt, zip, population) VALUES ( 'POINT (-122.022285 37.376280)','94086',56205 ); INSERT INTO TEST.ZIPPOINT(wkt, zip, population) VALUES ( 'POINT (-122.030745 37.353635)','94087',47499 ); INSERT INTO TEST.ZIPPOINT(wkt, zip, population) VALUES ( 'POINT (-122.017295 37.424970)','94089',13184 ); INSERT INTO TEST.ZIPPOINT(wkt, zip, population) VALUES ( 'POINT (-121.991415 37.440885)','95002',1452 ); INSERT INTO TEST.ZIPPOINT(wkt, zip, population) VALUES ( 'POINT (-121.956720 37.278665)','95008',43296 ); -- Use WGS84 standard srid UPDATE TEST.ZIPPOINT SET location = db2gse.st_point(wkt, 4326); -- Register the spatial column with WGS84 to set the SRS_NAME and SRS_ID -- columns in DB2GSE.ST_GEOMETRY_COLUMNS call db2gse.ST_Register_Spatial_Column( 'TEST' , 'ZIPPOINT', 'LOCATION', 'WGS84_SRS_4326', 1, ?, ?) ; SELECT objectid, VARCHAR(db2gse.st_astext(location),35), zip, population from TEST.ZIPPOINT; -- create a table that doesn't have a FID column - objectid isn't a primary key CREATE TABLE TEST.NOFID( objectid BIGINT ,wkt VARCHAR(128) ,zip CHAR(5) ,population INTEGER ,location db2gse.st_point ); INSERT INTO TEST.NOFID(objectid, wkt, zip, population) VALUES ( 1, 'POINT (-122.022285 37.376280)','94086',56205 ); INSERT INTO TEST.NOFID(objectid, wkt, zip, population) VALUES ( 2, 'POINT (-122.030745 37.353635)','94087',47499 ); INSERT INTO TEST.NOFID(objectid, wkt, zip, population) VALUES ( 3, 'POINT (-122.017295 37.424970)','94089',13184 ); INSERT INTO TEST.NOFID(objectid, wkt, zip, population) VALUES ( 4,'POINT (-121.991415 37.440885)','95002',1452 ); INSERT INTO TEST.NOFID(objectid, wkt, zip, population) VALUES ( 9999,'POINT (-121.956720 37.278665)','95008',43296 ); -- Use NAD83 standard srid UPDATE TEST.NOFID SET location = db2gse.st_point(wkt, 4269); SELECT objectid, VARCHAR(db2gse.st_astext(location),35), zip, population from TEST.NOFID; SELECT VARCHAR(table_name, 16) AS table_name, VARCHAR(column_name, 16) AS column_name, VARCHAR(type_name, 12) AS type_name, VARCHAR(srs_name, 16) AS srs_name, srs_id FROM db2gse.st_geometry_columns WHERE table_schema = 'TEST' ; gdalautotest-3.0.4/ogr/data/test.pbf0000644003401500001440000000106513614004466017006 0ustar rouaultusers OSMHeader/#+xS/ NHM 33SrI+NOI-nbd13 - OSMDatax}1o@ݝ$-W!*u&_8H톄G`b``b`@b@`b+`DL9{i__ gdalautotest-3.0.4/ogr/data/wkb_wkt/0000755003401500001440000000000013614004466017004 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/wkb_wkt/2.wkt0000644003401500001440000000047213614004466017677 0ustar rouaultusersMULTILINESTRING ((5.001213487354107 2.998531323406496,5.001213487004861 1.998531325356453),(5.001213487004861 1.998531325356453,5.001213486772031 0.998531326316879),(3.001213506038766 1.998531273566186,5.001213487004861 1.998531325356453),(5.001213487004861 1.998531325356453,6.001213477458805 1.998531351098791)) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_polygon.wkb0000644003401500001440000000032113614004466023122 0ustar rouaultusers????????@?@??@?@gdalautotest-3.0.4/ogr/data/wkb_wkt/5.wkt0000644003401500001440000000016613614004466017702 0ustar rouaultusersLINESTRING (.001213534618728 1.998531195873511,1.00121352536371 2.998531220131554,1.00121352635324 5.998531215489493) gdalautotest-3.0.4/ogr/data/wkb_wkt/6.wkb0000644003401500001440000000011513614004466017653 0ustar rouaultusers2:|@@~@>@y~@>@j~@::|@@~@gdalautotest-3.0.4/ogr/data/wkb_wkt/db2_poly.wkt0000644003401500001440000000120213614004466021240 0ustar rouaultusersLINESTRING (873039 319213,873039 319214,873040 319215,873041 319216,873041 319217,873042 319217,873042 319218,873043 319219,873043 319220,873044 319221,873045 319222,873045 319223,873046 319224,873046 319225,873047 319226,873047 319227,873048 319228,873048 319229,873049 319230,873049 319231,873050 319232,873050 319233,873050 319234,873051 319235,873051 319236,873051 319237,873052 319238,873052 319239,873052 319240,873052 319241,873053 319242,873053 319243,873053 319244,873053 319245,873054 319246,873054 319247,873054 319248,873054 319249,873054 319250,873054 319251,873054 319252,873054 319253,873055 319254,873055 319255,873055 319257)gdalautotest-3.0.4/ogr/data/wkb_wkt/1.wkb0000644003401500001440000000011013614004466017641 0ustar rouaultusers|>@@ @@v>@ ?gdalautotest-3.0.4/ogr/data/wkb_wkt/8.wkb0000644003401500001440000000002513614004466017655 0ustar rouaultusers@|;tQ4@~>̘gdalautotest-3.0.4/ogr/data/wkb_wkt/10.wkb0000644003401500001440000000002513614004466017726 0ustar rouaultusersy?v~@gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_line.wkt0000644003401500001440000000003013614004466022401 0ustar rouaultusersLINESTRING(1 2 3,2 3 4) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_odd_collection.wkb_hidden0000644003401500001440000000010313614004466024365 0ustar rouaultusers?@@?@gdalautotest-3.0.4/ogr/data/wkb_wkt/9.wkb0000644003401500001440000000002513614004466017656 0ustar rouaultusers;|@@-~@gdalautotest-3.0.4/ogr/data/wkb_wkt/11.wkb0000644003401500001440000000011013614004466017722 0ustar rouaultusers|>@@ @@v>@ ?gdalautotest-3.0.4/ogr/data/wkb_wkt/7.wkb0000644003401500001440000000022113614004466017652 0ustar rouaultusers@& !@Ā@>$@T@>@@& 44@ `Z@$ QW@@$ P>@2~v@ O@@ @]gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_1.wkt0000644003401500001440000000047713614004466020271 0ustar rouaultusersGEOMETRYCOLLECTION (POINT (5.00121349 9.99853131 1),POINT (5.00121349 7.99853132 2),LINESTRING (3.00121351 8.99853126 3,4.00121350 9.99853129 2,5.00121349 8.99853131 1,4.00121350 7.99853129 1),POLYGON ((4.00121350 7.99853129 2,4.00121350 8.99853129,3.00121351 8.99853126,2.00121352 8.99853124,2.00121352 7.99853124))) gdalautotest-3.0.4/ogr/data/wkb_wkt/4.wkt0000644003401500001440000000044513614004466017701 0ustar rouaultusersMULTIPOLYGON (((10.0012134398567 2.99853145316592,10.001213439391 1.99853145478119,11.0012134299031 1.99853148052352,11.0012134303688 2.99853147896647)),((10.0012134398567 2.99853145316592,10.0012134400313 3.99853145200177,9.00121344957734 3.99853142627398,9.0012134493445 2.99853142749635))) gdalautotest-3.0.4/ogr/data/wkb_wkt/3.wkt0000644003401500001440000000056013614004466017676 0ustar rouaultusersGEOMETRYCOLLECTION (POINT (5.0012134894 9.998531313699999),POINT (5.0012134888 7.9985313168),LINESTRING (3.0012135082 8.9985312634,4.0012134989 9.998531287600001,5.0012134891 8.998531314699999,4.0012134982 7.9985312908),POLYGON ((4.0012134982 7.9985312908,4.0012134986 8.998531289300001,3.0012135082 8.9985312634,2.0012135176 8.9985312369,2.0012135173 7.9985312385))) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_point.wkt0000644003401500001440000000004213614004466022606 0ustar rouaultusersPOINT (2.00121352 6.99853124 5.1) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_point.wkb0000644003401500001440000000003513614004466022566 0ustar rouaultusersO;|@ZV/~@ffffff@gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_1.wkb0000644003401500001440000000046113614004466020240 0ustar rouaultuserst>@~?#@?t>@~@@a:|@wC}?!@@:A>@W*E~?#@@t>@~?!@?:A>@T~@?:A>@T~@@:A>@W*E~?!@a:|@wC}?!@O;|@-|?!@O;|@ZV/~@gdalautotest-3.0.4/ogr/data/wkb_wkt/4.wkb0000644003401500001440000000024313614004466017653 0ustar rouaultusersI $@@E $@e? &@N%? &@q@I $@@J $@@ "@_ @ "@ @gdalautotest-3.0.4/ogr/data/wkb_wkt/3.wkb0000644003401500001440000000033113614004466017650 0ustar rouaultusers@>%@#?0@>@~VS@|:PBj@!?}`R@>[`@#?~0@>@!?V6@>|T@~@>|T@~@>3@!?~?'@|:PBj@!?}`R@|;=@!?|} 4@|;@~Hgdalautotest-3.0.4/ogr/data/wkb_wkt/11.wkt0000644003401500001440000000017613614004466017760 0ustar rouaultusersMULTIPOINT ((7.00121346837841 2.998531375167659),(8.001213458890561 2.998531401259243),(7.001213468029164 1.998531376986648)) gdalautotest-3.0.4/ogr/data/wkb_wkt/9.wkt0000644003401500001440000000005413614004466017702 0ustar rouaultusersPOINT (2.001213517040014 6.998531239878503) gdalautotest-3.0.4/ogr/data/wkb_wkt/7.wkt0000644003401500001440000000034213614004466017700 0ustar rouaultusersPOLYGON ((11.0012134319 7.9985314722,7.0012134699 7.9985313685,7.0012134689 4.9985313728,11.0012134308 4.9985314765),(10.0012134409 6.9985314476,10.0012134407 5.9985314488,8.0012134598 5.9985313965,8.0012134601 6.9985313951)) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_line.wkb0000644003401500001440000000007113614004466022364 0ustar rouaultusers?@@@@@gdalautotest-3.0.4/ogr/data/wkb_wkt/db2_poly.wkb0000644003401500001440000000133113614004466021221 0ustar rouaultusers1-*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A{A*A|A*A|A*A|A*A |A*A|A*A|A*A|A*A|A*A |A*A$|A*A(|A*A,|A*A0|A*A4|A*A8|A*A<|A*A@|A*AD|A*AH|A*AL|A*AP|A*AT|A*AX|A*A\|A*Ad|Agdalautotest-3.0.4/ogr/data/wkb_wkt/6.wkt0000644003401500001440000000023213614004466017675 0ustar rouaultusersPOLYGON ((3.001213507319335 5.998531267236103,5.00121348828543 5.998531318837195,5.001213488576468 6.99853131796408,3.001213507552166 6.998531266246573)) gdalautotest-3.0.4/ogr/data/wkb_wkt/1.wkt0000644003401500001440000000017013614004466017671 0ustar rouaultusersMULTIPOINT (7.00121346837841 2.998531375167659,8.001213458890561 2.998531401259243,7.001213468029164 1.998531376986648) gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_odd_collection.wkt_hidden0000644003401500001440000000005613614004466024416 0ustar rouaultusersGEOMETRYCOLLECTION(POINT(1 2 0),POINT(2 1 2)) gdalautotest-3.0.4/ogr/data/wkb_wkt/10.wkt0000644003401500001440000000005413614004466017752 0ustar rouaultusersPOINT (1.001213526586071 6.998531214354443) gdalautotest-3.0.4/ogr/data/wkb_wkt/8.wkt0000644003401500001440000000004313614004466017677 0ustar rouaultusersPOINT (2.0012135167 5.9985312409)) gdalautotest-3.0.4/ogr/data/wkb_wkt/2.wkb0000644003401500001440000000025513614004466017654 0ustar rouaultusers>@@>@?>@?>@?:|@?>@?>@?>@?gdalautotest-3.0.4/ogr/data/wkb_wkt/3d_broken_polygon.wkt0000644003401500001440000000007513614004466023152 0ustar rouaultusersPOLYGON ((0 0 1,1 0 1,1 1 1,0 1 1),(0 0 2,1 0 2,1 1 2,0 1 2))gdalautotest-3.0.4/ogr/data/wkb_wkt/5.wkb0000644003401500001440000000007113614004466017653 0ustar rouaultusersS??Cl`CϿCCeCָC "C_PCݲCCXCCLCRC륺CCL+CeCCECCVC?DIjDsDDGDDDC$DlD `D D D  layer bar layer2 baz layer3 zor layer4 glub gdalautotest-3.0.4/ogr/data/seamless_part1.dat0000644003401500001440000000213413614004466020751 0ustar rouaultusersc aidCstrC 1foo 2bargdalautotest-3.0.4/ogr/data/wfs_typefeature.gml0000644003401500001440000000250213614004466021250 0ustar rouaultusers 558750.703125 4402882.05558750.703125 4402882.05558750.703125 4402882.05558750.703125 4402882.05 558750.703125 4402882.051135552CFF99 gdalautotest-3.0.4/ogr/data/multipolygon.geojson0000644003401500001440000000054413614004466021467 0ustar rouaultusers{ "type": "MultiPolygon", "coordinates": [ [ [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0] ] ], [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] ] ] }gdalautotest-3.0.4/ogr/data/expected_gml_21.gml0000644003401500001440000000270613614004466021004 0ustar rouaultusers 48 249 3 49 249 2 49 2 48 348 3 48 3 foo gdalautotest-3.0.4/ogr/data/extentnan.shp0000644003401500001440000000014413614004466020053 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/gjmultipoint.shp0000644003401500001440000000026413614004466020577 0ustar rouaultusers' ZY@@Y@?$Y@@Y@?Y@@Y@?gdalautotest-3.0.4/ogr/data/multipatch.shx0000644003401500001440000000015413614004466020232 0ustar rouaultusers' 6$@ @$@2gdalautotest-3.0.4/ogr/data/get_feature.xml0000644003401500001440000000352113614005331020341 0ustar rouaultusers 13769.899683 307792.962538 277562.882370 607385.957220 154898.652858 552250.182732 183294.491306 568054.627532 154898.652858 568054.627532 160108.360820 566076.780944 164239.254332 563024.701882 170523.315346 561231.219583 172676.422559 559253.372994 175912.805620 557459.890695 180043.699132 553508.779495 183294.491306 552250.182732 33513. gdalautotest-3.0.4/ogr/data/track_with_time_extension.gpx0000644003401500001440000000313213614004466023324 0ustar rouaultusers Track one 1162.900 1165.300 1173.900 gdalautotest-3.0.4/ogr/data/ionic_wfs.gfs0000644003401500001440000000105113614004466020012 0ustar rouaultusers GEM GEM 1 437.00000 44137.00000 51131.00000 511549.00000 Name Name String 0 gdalautotest-3.0.4/ogr/data/Stacks.dbf0000644003401500001440000000040113614004466017234 0ustar rouaultusers_`IdNNameCRemarksC2CircumN 34 level 0.00000000000gdalautotest-3.0.4/ogr/data/empty.osm0000644003401500001440000000002513614004466017207 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/expected_gml_21_deegree3.xsd0000644003401500001440000000321713614005331022554 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/getcapabilities_wfs.xml0000644003401500001440000001562013614005332022063 0ustar rouaultusers TinyOWS Server - Demo Service WFS 1.0.0,1.1.0 TinyOWS Server tinyows-users@lists.maptools.org 1.1.0 1.0.0 text/xml ServiceIdentification ServiceProvider OperationsMetadata FeatureTypeList ServesGMLObjectTypeList SupportsGMLObjectTypeList text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 results hits text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 application/json Query gml:Envelope gml:Point gml:LineString gml:Polygon EqualTo NotEqualTo LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo Between Like NullCheck abs acos asin atan avg cbrt ceil ceiling cos cot count degrees exp floor length ln log min max radians round sin sqrt tan trunc gdalautotest-3.0.4/ogr/data/virsvd_orb_11187_050618.lbl0000644003401500001440000000453513614004466021601 0ustar rouaultusersPDS_VERSION_ID = "PDS3" /*** FILE FORMAT ***/ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 10458 FILE_RECORDS = 802 /*** GENERAL DATA DESCRIPTION PARAMETERS ***/ PRODUCT_ID = "VIRSVD_ORB_11187_050618_DAT" PRODUCT_VERSION_ID = "V1 " PRODUCT_CREATION_TIME = 2017-02-18T03:42:45 PRODUCT_TYPE = "DDR" SOFTWARE_NAME = "PIPE-MASCS2DDR" SOFTWARE_VERSION_ID = "1.0" INSTRUMENT_HOST_NAME = "MESSENGER" INSTRUMENT_NAME = " MERCURY ATMOSPHERIC AND SURFACE COMPOSITION SPECTROMETER" INSTRUMENT_ID = "MASCS" DETECTOR_ID = "VIRS" DATA_SET_ID = "MESS-E/V/H-MASCS-4-VIRS-DDR-V2.0" STANDARD_DATA_PRODUCT_ID = "VIRSDVIS" MISSION_PHASE_NAME = "MERCURY ORBIT" TARGET_NAME = "MERCURY" SITE_ID = "N/A" START_TIME = 2011-07-06T05:06:19 STOP_TIME = 2011-07-06T05:23:01 SPACECRAFT_CLOCK_START_COUNT = "1/218416246.224" SPACECRAFT_CLOCK_STOP_COUNT = "1/218417248.759" ^TABLE = "VIRSVD_ORB_11187_050618.DAT" OBJECT = TABLE COLUMNS = 62 INTERCHANGE_FORMAT = BINARY ROW_BYTES = 10458 ROWS = 1 DESCRIPTION = " This table contains MESSENGER VIRS spectra collected in the visible wavelength, converted to reflectance and photometrically normalized as well as instrument engineering data. Detailed descriptions for the parameters defined below are contained in the CDR/DDR SIS document. The complete column definitions are contained in an external file found in the LABEL directory of the archive volume. " NOTE = " SPICE Kernels: msgr20110705.bc msgr20110706.bc msgr20110707.bc msgr_dyn_v600.tf msgr_v231.tf msgr_mascs_v100.ti naif0011.tls pck00010_MSGR_v21.tpc messenger_2548.tsc msgr_20040803_20150430_od431sc_2.bsp " ^STRUCTURE = "VIRSVD.FMT" END_OBJECT = TABLE END gdalautotest-3.0.4/ogr/data/nonconformant_shx_ticket5608.shx0000644003401500001440000000015413614004466023511 0ustar rouaultusers' 6?@@2,gdalautotest-3.0.4/ogr/data/test_georss_simple.xml0000644003401500001440000000263713614005332021771 0ustar rouaultusers OGR test http://gdal.org OGR test A point Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 49 2 First category Second category A line Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 48 2 48.1 2.1 48 2.2 A polygon Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 50 2 50.1 2.1 48.1 2.2 46.1 2.1 50 2 A box Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 49 2 49.5 2.2 gdalautotest-3.0.4/ogr/data/polyline_smooth.dxf0000644003401500001440000000130513614004466021262 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 POLYLINE 8 1 66 1 10 0.0 20 0.0 30 0.0 70 1 0 VERTEX 5 51 8 1 10 251297.8179190048 20 412226.82864000782 30 0.0 0 VERTEX 5 52 8 1 10 251297.8179190048 20 412226.82864000782 30 0.0 42 1.4110547181610731 0 VERTEX 5 53 8 1 10 251308.8984362325 20 412208.9379316938 30 0.0 42 -0.2087839309652931 0 VERTEX 5 54 8 1 10 251316.57014238741 20 412213.19721172168 30 0.0 42 1.7181251404792479 0 VERTEX 5 55 8 1 10 251303.57075799999 20 412231.72690827277 30 0.0 42 -0.2147205537362407 0 SEQEND 5 56 8 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/billionlaugh.osm0000644003401500001440000000141613614004466020527 0ustar rouaultusers ]> &lol9; gdalautotest-3.0.4/ogr/data/points.gen0000644003401500001440000000002213614004466017335 0ustar rouaultusers1,2,49 2,3,50 END gdalautotest-3.0.4/ogr/data/truncated.kml0000644003401500001440000000242313614004466020033 0ustar rouaultusers KML Samples 1 Unleash your creativity with the help of these examples! Polygons 0 Examples of polygon shapes Google Campus 0 A collection showing how easy it is to create 3-dimensional buildings -122.084120030116 37.42174011925477 0 276.7870053764046 53.454348562403 -34.82469740081282 Building 40 0 #transRedPoly 1 relativeToGround -122.0848938459612,37.42257124044786,17 -122.0849580979198,37.42211922626856,17 gdalautotest-3.0.4/ogr/data/arcm_without_m.shp0000644003401500001440000000047013614004466021072 0ustar rouaultusers' @@(????:@@??@@@@gdalautotest-3.0.4/ogr/data/point_with_utf8bom.json0000644003401500001440000000010513614004466022053 0ustar rouaultusers{ "geometry": { "type": "Point", "coordinates": [ 100.0, 0.0 ] } }gdalautotest-3.0.4/ogr/data/testopenfilegdb93.gdb.zip0000644003401500001440000015236513614004466022161 0ustar rouaultusersPK l}Ftestopenfilegdb93.gdb/UT {"U"Uux PK-}FgX (testopenfilegdb93.gdb/a00000007.gdbtablxUT "U"Uux Q @ѻ%B0`!Cla Kxvg!Wy #B6r!)Ԥ%=LVH$I$IYPK/}F0##testopenfilegdb93.gdb/a0000003b.spxUT  "U+"Uux ȱ @1~, cd(urPK.}Fj*testopenfilegdb93.gdb/a0000002e.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`diPX4TXvQv@ J@">=8DI1$7ZI(85%Z !fflnahlgcdigdjnddljf 4(55<39CI@ V'3hnj:P,dhnbjldidjhiib Ԋ=^@i+@r#"q[Jݟ/&h% TPK/}FB*testopenfilegdb93.gdb/a00000027.gdbindexesUT  "U*"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Y=d0b(bHeHdHg2 Phr @MĹAj&PK-}FhmzC(testopenfilegdb93.gdb/a00000026.gdbtableUT "U*"Uux cf```baFV5|<3y8\B<\f01e2YXJX@Y8rr0!(Te4j|& !(4$ t#ϒPKh8P!+[DՕ`~dLǗ wqZ]^nԽW7bޟ/?ehTaH63yrj&31n̰+F9?Z c,pg[<81r^6~fFBBlƙL0)%! JJABԪVPI .$lc A)7B};9-vy~W`yY>st0(Fpp(bT"F5R'IE6g' {ұ'k\SS*=bUg`ȷP]Y~[<\LK NA4#ꀻGPB|-)/50ÄށN# yʄE w3E$Ff#{0טR yZ^?2F%7nSݣ 6QxPe_'.^>:ݺooWM{>(uĽy$RFax*_υQ3IէIbnbpEf_ C7pj,TK4v>̻TF<~pzM|̭O#-Vg\M5#kT)a|nr`ˉ@w?yvK9(+:fڶf[Ll˚ۚmY3_i PK.}F o6 (testopenfilegdb93.gdb/a0000002e.gdbtablxUT "U+"Uux  0 A[^_)B([JhF{܈5Q<+]PK.}FU[ 4 (testopenfilegdb93.gdb/a00000031.gdbtablxUT "U+"Uux Q D# T QRSKP$~GDͻ3[uPK,}F,(testopenfilegdb93.gdb/a00000003.gdbtableUT "U"Uux cf```bcFVX5|<3y<\X؂B\"$ `scHda(fH 30s"DBD#P؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F1IjPK-}FˊE+testopenfilegdb93.gdb/a00000029.I4adate.atxUT "U+"Uux c````eF fbf fA`Q@XX@B@sQ0 F(`0(PK.}F)#[(testopenfilegdb93.gdb/a00000030.gdbtableUT "U+"Uux RMHTQ=7oޠ1. ia6Y? FL3D:FJ ,0jS`?1Εb"4s-M a:'IԪ.~ݏo(XQ+uVQa8EЉqСהuA9X ?NJyId_Pwg?IFnib#'py y:23DU$pI\Elߏn~PnBWgk2{/Ͷ3?=.㷻ښwvޅbEI4#hT>KH[`GZZb%8PfӠcw!c2WC aR0VĀ V$cAj$ t@$S2OVHA 󃯓so6]xP٨y3]PV7GYW.8y8zã78r ccf{]a̿_֭mikx{ܞξ^?RCk 9L|ٕ`zpUKprW:X^͍Ů8O](%хZ]J uPK/}F^D3 (testopenfilegdb93.gdb/a00000035.gdbtablxUT  "U+"Uux ǁ 0CV]ȡC9)^ =I]zugyּWhPK/}F{(testopenfilegdb93.gdb/a00000038.gdbtableUT  "U+"Uux R=H[Q_^ *nA6b4iXKj0Qh@Эk"ġP$KBAPEK^0nywwsW`Z-n}רU.0E1&%BS4(i c ݬL`Q'{/Y(w^sK݌<2Lʘ%#&23J)x 1%[$1 {iLK}|ᕽE_G?c^iq~RBH/έU‘Z w^źJZMJu:}HKz4.]iI0MhHL5֑ste F61 KG0r>;aAZ0_5O$/ʮ `$dkwo7Y~Wgl=2fǭfN=uDPx>^VNʻބxeK4/'ܢI[.GӌBm-c[.ŪY15jiT4͸1rYgrsDmV/6Uޥv%0ZͅI>8M㰔 gjxX#a(UHc!FDt74F8DMڨ!]ҩ2FIPعN;}cEgmF!'"qiOEJ+Hm4PKzFW[*testopenfilegdb93.gdb/a00000005.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK.}FlO#testopenfilegdb93.gdb/a00000032.spxUT "U+"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPK/}FKۅ#testopenfilegdb93.gdb/a0000003a.spxUT  "U+"Uux 1 0Nvty ?$OݧZ Q0r 툈3>$+}c;{:{ջ1ܘ1Jnqw9 _GOI?'/| _E_>/| c1~PKzF hR (testopenfilegdb93.gdb/a00000002.gdbtablxUT "U"Uux  @PӀ UX@hAZ&QŜ█r}ݹhyF"Lvrd&I$I$I?T} PK-}F7 (testopenfilegdb93.gdb/a00000026.gdbtablxUT "U*"Uux  PDf.ނ%V7sIs&w/PK-}F'2#testopenfilegdb93.gdb/a00000029.spxUT "U+"Uux  Dщ`Y_+؂v0$=j[}ۘ{/PK/}Fspl*testopenfilegdb93.gdb/a0000003a.gdbindexesUT  "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d >؃"@ۦJKN1_l  ec|r *2 2D@qLg8ClQx7)FarPK/}F0##testopenfilegdb93.gdb/a00000037.spxUT  "U+"Uux ȱ @1~, cd(urPKzFW[*testopenfilegdb93.gdb/a00000006.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK/}F-(testopenfilegdb93.gdb/a0000003b.gdbtableUT  "U+"Uux cf|FV5䙁4#`a` f`pd`pe``g`afpb0b`0cpf0N @ڂ2B.P#P#Xք 7Bg Z3A t֏0/&h<t ! @10 1d2200313RHC"CLh blXgZfK^4ʴ85>, ~w7SM~<&(<PK.}FU8h*testopenfilegdb93.gdb/a0000002b.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`dDCՊee7 `PPZ0($݃ --Lt\CB}\<\=]bfz:FzFFFƦfƱ:A@܋RS33t buBfۅ@y㧆OiK]Ycc>[հ8u~lNg~X +1|[ wFy Raвf"imf3 Xp95 !13ID8& A#^ z7s;e8e3 Pbu1LrMN nRfW 7cL#oo\cNT/0QܕDrKͶ"2c龃I_.s9ŸlbeH=_xqŝrްԳkisk4}fP6=0б0~I5>)Xu(xH}p_`jumxb6]rXLdvߘvmk#V9έUPKzF z(testopenfilegdb93.gdb/a00000004.gdbtableUT "U"Uux cf```r fe@PZJ X},, ~&CPʐΐX205q:R.QR,sNdбzKS>-2ˑ`M' ~mbjbYPK.}Fsv(testopenfilegdb93.gdb/a00000034.gdbtableUT "U+"Uux RKhSA=y,qnKR&~M6~464@KMb[Mua"(E\ •%R.D]S%zfKDw{s=sש&{,[ASE7:`]"Q4X9ᡧ ! ’ +JnS, 8D%-\kf91&*S3Ly٧q)BR*H5 |HX-q<ᖱE\kn+aBl<\.zZx"/+M຿5h+wC'zyAK\/욢0 4,xFh4,8qaO(d}rh+5qAbT8m-y`5u5MqR1MbEXʨ$JZs,d33BQ\={ scn7'r#^=oC;&6^Fp_VvݖVk~T!wK9KYاffb+eYW93h$:2%8_^ mbTyE,o}TRYUVY+_PK-}FTh*testopenfilegdb93.gdb/a0000002a.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d@hZ& J_&E]ݝD|{pcHo PpkKB\@B86V' h{Qjj^yfrANgt8X{40U YG07D:./g?+?^M 0K PK/}Fs (testopenfilegdb93.gdb/a00000027.gdbtablxUT  "U*"Uux uq(*DE*Y=BWQQe^(BQdey\Wu[[X,V?6a،]8$/sJj!Z c&bc-b/bi’QP =QYX؁}8KH  .=zca a6a' 1!QQ C1ӱk{p q|^.܋jFw |'7NFi<:hW 1a.k"}@v܅b('Q/^xc!V[8Ș A<#34J"@?vGed``PJ^ cfGc Q"P$E#,DPK/}Ff*testopenfilegdb93.gdb/a00000036.gdbindexesUT  "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d@aPbEM93L;G+pxCK %ǐPh%$ Oh%qlN@+Լ %=XP?@q1P+xiH;`<Aٳ`nxat?l)]^vV~`a@C PK/}F>8f(testopenfilegdb93.gdb/a00000039.gdbtableUT  "U+"Uux cf``݌ Bk@ y#e` f`pd`pe``g`afpb0b`0cpf0N @ڂ2B.P#P#Xք 7Bg Z3A t֏0/&hFďz\4#9z!<6&b"G`d y,@D]* Qx&(Gx'xxWxxV>kc'{?8 e@jP4m@ы~ bYiVQ,JMҐ-Jwzӟ g$0qLfp1s5s33{Y,a+ygYj^ ]>` o]įArY|(%)KER4)-iKGҝg0Ӳ(G%Qz4hG'A0űLTd2S\\ >KYc,JW|)tvܛlʀ PK/}Ff*testopenfilegdb93.gdb/a00000037.gdbindexesUT  "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d@aPbEM93L;G+pxCK %ǐPh%$ Oh%qlN@+Լ %=XP?@q1P+xiH;`<Aٳ`nxat?l)]^vV~`a@C PKzFy(testopenfilegdb93.gdb/a00000002.gdbtableUT "U"Uux cf``@ʀ;! 1hvoTJr|" oC"P !(]E ~PL 3POCC&C:C0PQd8@Nd`*4&E_7\a2w3L_N:&rbF_Ͷ<.6'˛ cOH0{g|kDrHFBJjZbiNBJbIbZfNBr~^ZfziQbIf~Ng Gנx7 _7 U5!AP%\Eũ)J9ydʡqwBS!1"5>3ʕ0 |A a R x ` BIjEBZ~Qnb Z(iVH Mܝ`V逬r+2sKsqPYB؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F1IjPK-}F=u`6+testopenfilegdb93.gdb/a00000029.I4float.atxUT "U+"Uux  S.[TKN:8$ii^g*:Te;VPK/}F2 (testopenfilegdb93.gdb/a00000038.gdbtablxUT  "U+"Uux  2y9hT,wݧuޞj~PK.}F+ K#testopenfilegdb93.gdb/a0000002d.spxUT "U+"Uux 1 0DY`xQ`cSt)It 7<]m$ם->o=˽PK.}FlO#testopenfilegdb93.gdb/a00000031.spxUT "U+"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPK/}F (testopenfilegdb93.gdb/a0000003b.gdbtablxUT  "U+"Uux cf@VLPK/}F 4(testopenfilegdb93.gdb/a00000036.gdbtableUT  "U+"Uux RMhA QPO=Hm6ML564i IӈmTL)EO VTP^ċP^*7=f޼o͛ ~uͶ!˼ #!Đi7Ađt8^#^D;3Piug#vk=ƵgD^$9-[NQMpӊGI(q-P~ꄨTRWZQ5>/7m#_Txe^_\n7dx>YVB~ƪ^~H_ 46lzz{vPK.}FwA/ (testopenfilegdb93.gdb/a0000002f.gdbtablxUT "U+"Uux  !> ♁-W;5rB{ PK{FW[*testopenfilegdb93.gdb/a0000001c.gdbindexesUT Ŋ"UŊ"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK/}Fه1 (testopenfilegdb93.gdb/a00000036.gdbtablxUT  "U+"Uux   F #h *GDmܮgN v+PK-}F KT4)testopenfilegdb93.gdb/a00000029.I4int.atxUT "U+"Uux  S/y!~xXIC$m=#ъ@? e'WVPK.}F b9(testopenfilegdb93.gdb/a0000002d.gdbtableUT "U+"Uux RKhSA={/ 64cCVhHLFj#c S\A! 7nD@A7 ݨ+BA[ "{Qt7{=s:6?Eǝ/ Q鄖 Bc?`lQQts&eLb1Ɍ UG{,o7 ZO! pBJd*hѤч]Z;BZWzӐ3;OH߁RJ6qu'Pń8a^("(#AyƋK_o̿.~׿|u//> 7>ч??:V0eKV,u%g*J!(5rɨ MՋ,A*SضXkjN]vpjꦶhvY18mU"qz^̂Zԇ9w3``3f,f;VN{TG/sծLVAvqpT 1U ]bD:s.9p'_5%lƌ/ޣ3V8']3ĺ/ 9 p!R@P- Xg[Ϭ^cZR m{g6ZPK/}Fcً(testopenfilegdb93.gdb/a0000003a.gdbtableUT  "U+"Uux cf``PFVbP>HH `GWvvj'# 3g Ġ -,,C t8U8e jM܀|c t0`9D@qLg8YoR=f D4#\=?Б^@830xăW<C*CC:C C \Ȳ E@D%PC .nrY|#]+|qNЃL\~o3yu|zWJA!ØFg?@ ~6[հ8)X6$3?9<]k 4NXnL[]EմvՎh'$u4|E(X \aP]X|T̵> Jv tAwJJ cuBXJئ1/UNoR/ o˥LԘt.VV6?^bxo9~`sV,+bX ժHY4e~a4363ӹ7fhˤv&sS%9Lc}s_#ͱnouLNniEt^Wrwr>PK-}FbQ! testopenfilegdb93.gdb/timestampsUT "U"Uux 0 J# ijĨܩlpPK.}F\:V9(testopenfilegdb93.gdb/a0000002f.gdbtableUT "U+"Uux R;LSQJ*҇&@i!TZ ()@R" ¤a21:`:@1:D(891AM;Q9}Պ/zcQh ;a$C;80(.DFhփϊLqlJ=Fnv%GymB3s^Yo=ĜGO OsM8n/"9,F$sd >e7aPO b|Y|Ֆ92b /Klgmc`"XP`=8]! amYz.C'D{U5 oX7cgga8ϙc&Hdb1Z*c]4Hf&eø)ְ $'ЂiJOʄ9J`2kA^ ^tj]|]({iv߇}4("Vn gD7V];fW:gV_8l~n9Rl|VWϡB'pa񛳅+ZUmԺ+huW`/PK-}F_ (testopenfilegdb93.gdb/a00000008.gdbtableUT "U"Uux R;O`!6~ĉ!LUUe*B 5HLU" P ݪN6*1f@BtjYKJڎlǹ/i"5Eu\U?m2&AUZǯLE5ISM]LU@nd&&-dM47&Ut@9D U‘x.S Q fM2"_Cj0SNu*E(l Y*p WuF :^4_9m=e:k16:j>?*T^+KO:$𻽲jI N}_ Geu}4 ,+(bM.¢$A(&mY /ifؠ җ%*.Hb7AaKVӸ̾GS'/ =&$n +BY7$v9qL2MxaQ\︷Ǿ||p\~y"6qvɵ-/Ov-O@VVT(~Tcw?Q9`,De,l|~je,Qﳿ~x <]D?ܽ;7ⷚfhi'FW::2,URYUPK-}F1*3(testopenfilegdb93.gdb/a00000026.I1id.atxUT "U+"Uux  S/#~Aw%H5tE%Nտ PK.}F4 (testopenfilegdb93.gdb/a00000033.gdbtablxUT "U+"Uux Q D#T QP-KP$>GDͻgUߩPKzFW[*testopenfilegdb93.gdb/a00000001.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK.}F\2 (testopenfilegdb93.gdb/a0000002a.gdbtablxUT "U+"Uux ı AȲ)2w F"{D>+ܬ=#_hPK.}Fk*testopenfilegdb93.gdb/a00000032.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`dDCՊee7 `PPZ0($݃ --Lt\CB}\<\=]bfz:FzFFFƦfƱ:A@܋RS33t buBiכEԱWRWV5}\hG\n}}y3x0T'pud|a [:t\FpꚖGp<x& \A8l 4l_n0+Xcˆ.f$,c=E(1CIN sR)Yd )XKᚺR]ݜ ^W̛V&*/Nm? zyΛsGճeRT\n WyoO~-ʟokm^=/`F^k-h-ZzU{PK.}F4 (testopenfilegdb93.gdb/a00000034.gdbtablxUT "U+"Uux Q D#T QP-KP$>GDͻgUߩPK.}FlO#testopenfilegdb93.gdb/a00000030.spxUT "U+"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPKzF}2(testopenfilegdb93.gdb/a00000005.gdbtableUT "U"Uux cf@ʀg<3RPI@\̐s4DVr<@\fP%!l"# %PžMqm}֍rk] .Tݑs]}d+;xe PK.}Fk*testopenfilegdb93.gdb/a00000031.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`dDCՊee7 `PPZ0($݃ --Lt\CB}\<\=]bfz:FzFFFƦfƱ:A@܋RS33t buBo=˽PK-}F1*3(testopenfilegdb93.gdb/a00000029.I4id.atxUT "U+"Uux  S/#~Aw%H5tE%Nտ PK-}FH*1 (testopenfilegdb93.gdb/a00000029.gdbtablxUT "U*"Uux  2Xn.uHMP%="Zv֕{{n֞j/SPK-}F>e (testopenfilegdb93.gdb/a00000001.gdbtableUT "U"Uux ] PW_AD @8kAٰ"nL6` QTEl֩ *xت(BC(mEYI~}{@R,ߞ: @ d2VzE zj $ $Jj @/MG=cTM.=v1[AgH'E[nț[\LC.3v."^ =&15$:ju5uN)[|,"E)L 48Qv8Bp>yľH&(MlūVo+gVC SMGIgcbjψ&,*TҤ@хl$Ư)O1GId!Z2]qveZU1-Bp j5X]ӧ=RÈ44K @@;wՁ h@$FI=yN6g`U08|%-a7_(ɴO\[a q"ޔJ`a;ul;T'4.C Tdi3cyD Ly8vS4k3g)؟iJ]c,F=n1GPTo-8-)_wK(~$6b./`gOuhK_\BCcnٸq}me /{{w0R5P=Ml>^ o"d;('.K4S"\ Zެfj_}Z /, 2¼92żF`Z5z-=kG] .Y- ?\)S(|JBԚ4NߋTpaXa|2`jVgX1?PI]Ws;gJ\ϪFsgazg+,F*zo,4T D߯U=²+ґ&[K͉;Vp.X+-/ϖ񆭚A`UUyOT X~+v󬭅^ h6GżH>VwgWWAHJK T %b9NkPK.}FΘaf(testopenfilegdb93.gdb/a0000002b.gdbtableUT "U+"Uux ROHa~}QK02?spͅ:I#.);DHTPAbPQ/ J DyJ%:{{*KߜT*hQWY!DqUfԃgM<ى.%/([AcD pf]ps+.}r )2w3LYq <8~l߅w!e7QBWX=j78PE~|Qg9aK\n 5l|}KXf B ةuh!^C6,V Fy'X8F08(XВea0PI,j}|Ṱ)ثc$'+! )VW¶m>?.ExPW9uUqN5+sgw,,<p]O^]rT.a-֪%z˛+oM3<+tijAa4bжd&ӓ)/ȁ/wN^OX|:鏍]ͯUDC}** ɛmGjya-6/PK-}FiMf(testopenfilegdb93.gdb/a0000002a.gdbtableUT "U+"Uux R_HSQvvq ePBу,6kns6Z&El?.hC{ H|(BP= EdHbsIK~4×l7sWjh=D]hZ:Eсzpf4w]S6l d&OFKz'Yk}'.7#cy2P.xBWǚTs-D>5~q.{^(¡ėW."A006ԣhEbY%`jPG0;ʔ@ q+͡ 3{b+̭b bT8E/G:ӐbU45KruhA,؇ \'+A _#' n^}jko?rqV/9r>ffqrKna TZ1I[*(ɉl ;YWl9<ӗ2h⎖ª(W'ujEխUOPK-}Fkq(testopenfilegdb93.gdb/a00000007.gdbtableUT "U"Uux cf``@ʀ g1xRJrГ (+e(B* 4Xg%@JTY` Nߍ!H0008mfaik.aֲ2 1KO Nߜ6ڼ}& _{Zm͸$W'6{ ^|:? ` f 1 AQٱ s@YP9 saw 7v`0v+ @9Q.,"})1 PK/}Ftwg*testopenfilegdb93.gdb/a00000038.gdbindexesUT  "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d@hZ& J_&E]ݝD|{pcHo PpkKB\@B86V' h{Qjj^yfrANgt8X{40U YG07D:./g?+?^M 0K PK.}F (testopenfilegdb93.gdb/a0000002e.gdbtableUT "U+"Uux SKhSA={/RFܸ(ZKI&1`LOښ6h#&j (".DD]u(HH-QZ ̼.o=s=sܙ@oj`i7p鋼BTiBkC3Bh.{FPnz35c|T+сd6.jz3U[,oNFՌʼZ/gQIVjF5w{8!)w`/~0KWuyͪyX I0ӟ[/F #?}-":E%: HAG ;aa!6jM!NA ˞E/px(YJXI2b6\V8^ \?}5Ŝ8h>C2`$(e/%J׃='Euldb 02֥=-ܯz[?yl{YrÛ[d6ͽz]p`+[YYVK.ӎO\wW~P4M?YgX>KHa"@BޘK:&/i; =#sz>oiu7f?}ˣS]u\PW% l ԣuУz PK-}FaJ-(testopenfilegdb93.gdb/a00000029.gdbtableUT "U*"Uux R=hSQ=//$ѱ8 MbФ-R&mD렃8TWAPJ<QJC`5w9~j ~UնF^'uVo' Gf7$`m7#0B+BJ"{ʐ=J6@@'sY\3HO Osy)^@sQHN&C8N|o/O5R[=F :ņs,+.óؿƦp?ѳc*6,Eۄ38~8cv¥j ިn@ ^gypĦ̐@%c21UƺhXjĢVbO"gUHN+/s s-B HX|0pc~'|?yӑ|1ťqϪw|i={?'qRtcm2iewn~+/G6WdݞSݾؓSަbڪ/4\⊞}⯡~McJrz+ɍ"PK/}F0##testopenfilegdb93.gdb/a00000039.spxUT  "U+"Uux ȱ @1~, cd(urPK/}F ky9K (testopenfilegdb93.gdb/a00000039.gdbtablxUT  "U+"Uux ȱ 0CQ%01 Q!4r2TrKnlSp.:kdvtn 2fPK/}F0##testopenfilegdb93.gdb/a00000038.spxUT  "U+"Uux ȱ @1~, cd(urPK.}F-4 (testopenfilegdb93.gdb/a0000002b.gdbtablxUT "U+"Uux  A#K~ Ɩ"n?#SyF:_hwPK/}Fه1 (testopenfilegdb93.gdb/a00000037.gdbtablxUT  "U+"Uux   F #h *GDmܮgN v+PK.}F+ K#testopenfilegdb93.gdb/a00000033.spxUT "U+"Uux 1 0DY`xQ`cSt)It 7<]m$ם->o=˽PK-}F ( (testopenfilegdb93.gdb/a00000008.gdbtablxUT "U"Uux ?sd`3mG70( L'ՠlR(`Efse\u,8k+B /$FZ0 U!4 Ё%\ `?Lh Qm M u5|RJ)RJ)z PK.}F3i*testopenfilegdb93.gdb/a0000002d.gdbindexesUT "U+"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d >؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F,`PK.}FlO#testopenfilegdb93.gdb/a0000002c.spxUT "U+"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPK-}FH(Zf (testopenfilegdb93.gdb/a00000006.gdbtablxUT "U"Uux ̱ 0FaZ,@q<%uY\RFLR *f@='OJJ)s<ț\F:H-Yȇ\̫F:yzLID$I$Iҿ߰PK l}FAtestopenfilegdb93.gdb/UT{"Uux PK-}FgX (Ptestopenfilegdb93.gdb/a00000007.gdbtablxUT"Uux PK/}F0## testopenfilegdb93.gdb/a0000003b.spxUT "Uux PK.}Fj*testopenfilegdb93.gdb/a0000002e.gdbindexesUT"Uux PK/}FB*Xtestopenfilegdb93.gdb/a00000027.gdbindexesUT "Uux PK-}FhmzC(Utestopenfilegdb93.gdb/a00000026.gdbtableUT"Uux PK/}F rl*testopenfilegdb93.gdb/a0000003b.gdbindexesUT "Uux PK-}Fi(*Ttestopenfilegdb93.gdb/a00000026.gdbindexesUT"Uux PK.}Fw3Fx(Jtestopenfilegdb93.gdb/a00000031.gdbtableUT"Uux PK-}Fߥc"-$ testopenfilegdb93.gdb/a00000029.I4nullint.atxUT"Uux PK,}F@!) ( testopenfilegdb93.gdb/a00000003.gdbtablxUT"Uux PK.}F<-B#8 testopenfilegdb93.gdb/a0000002e.spxUT"Uux PK/}F r. ( testopenfilegdb93.gdb/a00000028.gdbtablxUT "Uux PK.}FlO#g testopenfilegdb93.gdb/a0000002a.spxUT"Uux PK.}F-4 (testopenfilegdb93.gdb/a0000002c.gdbtablxUT"Uux PKzFrNhFQtestopenfilegdb93.gdb/gdbUT"Uux PK.}F'2#Btestopenfilegdb93.gdb/a0000002f.spxUT"Uux PK-}F2 (testopenfilegdb93.gdb/a00000001.gdbtablxUT"Uux PK-}FtoE*testopenfilegdb93.gdb/a00000029.I4real.atxUT"Uux PK.}Fsס (testopenfilegdb93.gdb/a00000035.gdbtableUT"Uux PK.}F o6 (testopenfilegdb93.gdb/a0000002e.gdbtablxUT"Uux PK.}FU[ 4 (&testopenfilegdb93.gdb/a00000031.gdbtablxUT"Uux PK,}F,(testopenfilegdb93.gdb/a00000003.gdbtableUT"Uux PK%}FY< "X(testopenfilegdb93.gdb/a0000001c.freelistUT"Uux PK.}FU8h*@testopenfilegdb93.gdb/a0000002c.gdbindexesUT"Uux PK.}Fk* testopenfilegdb93.gdb/a00000034.gdbindexesUT"Uux PK-}FˊE+testopenfilegdb93.gdb/a00000029.I4adate.atxUT"Uux PK.}F)#[(testopenfilegdb93.gdb/a00000030.gdbtableUT"Uux PK/}F^D3 (Btestopenfilegdb93.gdb/a00000035.gdbtablxUT "Uux PK/}F{(testopenfilegdb93.gdb/a00000038.gdbtableUT "Uux PK-}FX{(S"testopenfilegdb93.gdb/a0000001c.gdbtableUT"Uux PKzFW[*0%testopenfilegdb93.gdb/a00000005.gdbindexesUT"Uux PK.}FlO#%testopenfilegdb93.gdb/a00000032.spxUT"Uux PK/}FKۅ#&testopenfilegdb93.gdb/a0000003a.spxUT "Uux PKzF hR (}'testopenfilegdb93.gdb/a00000002.gdbtablxUT"Uux PK-}F7 (1(testopenfilegdb93.gdb/a00000026.gdbtablxUT"Uux PK-}F'2#(testopenfilegdb93.gdb/a00000029.spxUT"Uux PK/}Fspl*Y)testopenfilegdb93.gdb/a0000003a.gdbindexesUT "Uux PK/}F0##*testopenfilegdb93.gdb/a00000037.spxUT "Uux PKzFW[*5+testopenfilegdb93.gdb/a00000006.gdbindexesUT"Uux PK/}F-(+testopenfilegdb93.gdb/a0000003b.gdbtableUT "Uux PK.}FU8h*^-testopenfilegdb93.gdb/a0000002b.gdbindexesUT"Uux PK-}F2X**/testopenfilegdb93.gdb/a00000029.I4guid.atxUT"Uux PK/}F&l*/testopenfilegdb93.gdb/a00000039.gdbindexesUT "Uux PK/}Fd(?1testopenfilegdb93.gdb/a00000027.gdbtableUT "Uux PK.}Fߑi*S2testopenfilegdb93.gdb/a0000002f.gdbindexesUT"Uux PK.}F0}s( 4testopenfilegdb93.gdb/a00000032.gdbtableUT"Uux PKzF z(6testopenfilegdb93.gdb/a00000004.gdbtableUT"Uux PK.}Fsv(7testopenfilegdb93.gdb/a00000034.gdbtableUT"Uux PK-}FTh*:testopenfilegdb93.gdb/a0000002a.gdbindexesUT"Uux PK/}Fs (w<testopenfilegdb93.gdb/a00000027.gdbtablxUT "Uux PK-}FlV *b?testopenfilegdb93.gdb/a00000029.gdbindexesUT"Uux PK/}Ff*Btestopenfilegdb93.gdb/a00000036.gdbindexesUT "Uux PK/}F>8f(Ctestopenfilegdb93.gdb/a00000039.gdbtableUT "Uux PK/}FYJΙ0*Etestopenfilegdb93.gdb/a00000027.I2real.atxUT "Uux PK.}F+ul*Htestopenfilegdb93.gdb/a00000035.gdbindexesUT"Uux PKzF, % ({Jtestopenfilegdb93.gdb/a00000004.gdbtablxUT"Uux PK/}Fk(Ktestopenfilegdb93.gdb/a00000028.gdbtableUT "Uux PK/}Ff*Ktestopenfilegdb93.gdb/a00000037.gdbindexesUT "Uux PKzFy(Mtestopenfilegdb93.gdb/a00000002.gdbtableUT"Uux PK.}Fk*Otestopenfilegdb93.gdb/a00000033.gdbindexesUT"Uux PK-}F=u`6+Qtestopenfilegdb93.gdb/a00000029.I4float.atxUT"Uux PK/}F2 (GRtestopenfilegdb93.gdb/a00000038.gdbtablxUT "Uux PK.}F+ K#Rtestopenfilegdb93.gdb/a0000002d.spxUT"Uux PK.}FlO#Stestopenfilegdb93.gdb/a00000031.spxUT"Uux PK/}F (/Ttestopenfilegdb93.gdb/a0000003b.gdbtablxUT "Uux PK/}F 4(Ttestopenfilegdb93.gdb/a00000036.gdbtableUT "Uux PK.}FwA/ (0Wtestopenfilegdb93.gdb/a0000002f.gdbtablxUT"Uux PK{FW[*Wtestopenfilegdb93.gdb/a0000001c.gdbindexesUTŊ"Uux PK/}Fه1 (Xtestopenfilegdb93.gdb/a00000036.gdbtablxUT "Uux PK-}F KT4)Ytestopenfilegdb93.gdb/a00000029.I4int.atxUT"Uux PK.}F b9(Ytestopenfilegdb93.gdb/a0000002d.gdbtableUT"Uux PK.}FU[ 4 (n\testopenfilegdb93.gdb/a00000032.gdbtablxUT"Uux PK.}FlO#]testopenfilegdb93.gdb/a0000002b.spxUT"Uux PK-}F9IF)]testopenfilegdb93.gdb/a00000029.I4str.atxUT"Uux PK.}Fvj*Y^testopenfilegdb93.gdb/a00000030.gdbindexesUT"Uux PKzF ('`testopenfilegdb93.gdb/a00000005.gdbtablxUT"Uux PK.}F6b2 (`testopenfilegdb93.gdb/a00000030.gdbtablxUT"Uux PK-}Fc.rB:.&atestopenfilegdb93.gdb/a00000029.I4smallint.atxUT"Uux PK-}F?I(atestopenfilegdb93.gdb/a00000006.gdbtableUT"Uux PK/}Fcً(idtestopenfilegdb93.gdb/a0000003a.gdbtableUT "Uux PK/}FةE#Vftestopenfilegdb93.gdb/a00000035.spxUT "Uux PK/}FD+h*ftestopenfilegdb93.gdb/a00000028.gdbindexesUT "Uux PKzFW[*gtestopenfilegdb93.gdb/a00000003.gdbindexesUT"Uux PK.}Fcf(htestopenfilegdb93.gdb/a0000002c.gdbtableUT"Uux PK/}F@A (Kktestopenfilegdb93.gdb/a0000003a.gdbtablxUT "Uux PK-}FbQ! ktestopenfilegdb93.gdb/timestampsUT"Uux PK.}F\:V9(iltestopenfilegdb93.gdb/a0000002f.gdbtableUT"Uux PK-}F_ (otestopenfilegdb93.gdb/a00000008.gdbtableUT"Uux PK.}F!yv(wqtestopenfilegdb93.gdb/a00000033.gdbtableUT"Uux PK-}F1*3(Rttestopenfilegdb93.gdb/a00000026.I1id.atxUT"Uux PK.}F4 (ttestopenfilegdb93.gdb/a00000033.gdbtablxUT"Uux PKzFW[*}utestopenfilegdb93.gdb/a00000001.gdbindexesUT"Uux PK.}F\2 (e (testopenfilegdb93.gdb/a00000001.gdbtableUT"Uux PK.}FΘaf(&testopenfilegdb93.gdb/a0000002b.gdbtableUT"Uux PK-}FiMf(testopenfilegdb93.gdb/a0000002a.gdbtableUT"Uux PK-}Fkq(testopenfilegdb93.gdb/a00000007.gdbtableUT"Uux PK/}Ftwg*testopenfilegdb93.gdb/a00000038.gdbindexesUT "Uux PK.}F (testopenfilegdb93.gdb/a0000002e.gdbtableUT"Uux PK-}FaJ-(֕testopenfilegdb93.gdb/a00000029.gdbtableUT"Uux PK/}F0##etestopenfilegdb93.gdb/a00000039.spxUT "Uux PK/}F ky9K (testopenfilegdb93.gdb/a00000039.gdbtablxUT "Uux PK/}F0##testopenfilegdb93.gdb/a00000038.spxUT "Uux PK.}F-4 (testopenfilegdb93.gdb/a0000002b.gdbtablxUT"Uux PK/}Fه1 (testopenfilegdb93.gdb/a00000037.gdbtablxUT "Uux PK.}F+ K#;testopenfilegdb93.gdb/a00000033.spxUT"Uux PK-}F ( (testopenfilegdb93.gdb/a00000008.gdbtablxUT"Uux PK.}F3i*testopenfilegdb93.gdb/a0000002d.gdbindexesUT"Uux PK.}FlO#ʞtestopenfilegdb93.gdb/a0000002c.spxUT"Uux PK-}FH(Zf (vtestopenfilegdb93.gdb/a00000006.gdbtablxUT"Uux PK{{4>gdalautotest-3.0.4/ogr/data/pointz_without_m.shp0000644003401500001440000000021013614004466021463 0ustar rouaultusers' D ?@?@@@ ?@@gdalautotest-3.0.4/ogr/data/not_all_columns_present.xlsx0000644003401500001440000001065313614004466023211 0ustar rouaultusersPK ^LHxl/UT VVux PK ^LHxl/worksheets/UT VVux PK^LHlm:xl/worksheets/sheet1.xmlUT  V Vux n!F} }eikuIUI] d@fؖtƻqv?w,˒ﶣهhX],yR"V*}]>X6EVm\XeVXkS齯~vZ$VmlLymfM άXД9&of\C@" @%H9t Yv yx z '=arO{ '=A'#gn{T^f>}~%|Qm-,#Dnߎ~PKuNxl/sharedStrings.xmlUT `Vux uj!}bpOaQ4 NG'c)bz9[Ak%*fAݪ1URNR`0wav:qFJ֋j{1amR#52-˹.M9oyWr>I xxxxxxxx^?HzPK;xl/workbook.xmlUT `Vux n1 w"K`@Zuh;H _0w۟{A]104t |$:+iOj]- eL8h|%3ڡ52QḠ |{/S!V1[F 5~(Άr TTGj*9Zjԯc@Pz0&SzᾳY&vtIUF^iȳtdC{Pm1f9o,~PK ^LH xl/_rels/UT VVux PK+)xl/_rels/workbook.xml.relsUT `Vux j0 } {㤅1F^Ơ׮{(qHbIm׷ǠVzIVqPG$b0P%( .]h _揰YV;]bw"IkvGELr4Z):Y,4M 9-4#CCLԢʋH={Dp)ewfykxKX N2-__>PK LA xl/styles.xmlUT `Vux T]O0}W4}#HӨI|[5Dz#{= oׂ4S2vʘc6_Mk͆ +:1!D`V%شʑ.+3D(!N.X R&W{ >=_^ sf;]Atz4B)Z,ݿ0 A4ߤ˯sS; u`+ `y *Q,#;d(bz{EQbcH%6u<ߔRIR{J:OUevnùԗ]0&p[ 8ƹW,/|`T1Jh+=}H [wlfMvjju dYw>,[=|w;|.7L1HN>`?ŭU gnqPKH50`[Content_Types].xmlUT `Vux AK@alAD xԂ,$Y.3kMi-"H/Y{ߛl1]$]%E)2pJc"b#kՀ,+b`5-{C%3BGHO Z BgPng.x@oP%@ H&u0Z8?'gI+ SCouJ/M391$c) (3cA(n;3wt9,ze[`#W} >{1PK ^LH docProps/UT VVux PKovdocProps/app.xmlUT `Vux 0EwtVcH8;Tw> k'DvǛ{r7+dѷP VhZvW"YHe.Բ(4'=Rd1Nj~:ďB8lހOȾfg_zWȾRHbt3qP{٣\'§-Ӓ"y3U܀Cѓ 'a7QNfSZ`2 :-gċ-H/¹#ۍZ׵^3Sje=@{qlz8E/PK ^LH_rels/UT VVux PK? _rels/.relsUT `Vux N0 {ݐBvAH!4$n$@y{"ش$?le^9e'AêiAq0b]5<7.6> stream xRJ@ )rCL2O x[=E]+}}δ(xdhi1RK*S3<^! VPy: ^vFpX77(ȑ rU,Z)Hd9Jr\P٨Qػd!&x ʚb^r(rokkVgd?nutsu:[lTݻV'P&+ޫԋ~vDQ[.E-۽bޔ ҁ endstream endobj 3 0 obj 277 endobj 5 0 obj << >> endobj 6 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 7 0 obj <> endobj 8 0 obj < /Creator /Producer /CreationDate(D:20171124211158+01'00')>> endobj xref 0 9 0000000000 65535 f 0000000462 00000 n 0000000019 00000 n 0000000367 00000 n 0000000604 00000 n 0000000387 00000 n 0000000409 00000 n 0000000702 00000 n 0000000785 00000 n trailer < ] /DocChecksum /2EABC22B7C5C99CC14BCC45316306DC0 >> startxref 1013 %%EOF gdalautotest-3.0.4/ogr/data/testpointzm.shx0000644003401500001440000000015413614004466020460 0ustar rouaultusers' 6 ?@?@@@@@2gdalautotest-3.0.4/ogr/data/testcsvt.csv0000644003401500001440000000024413614004466017730 0ustar rouaultusers"INTCOL","REALCOL","STRINGCOL","INTCOL2","REALCOL2","STRINGCOL2","DATETIME","DATE","TIME" 12,5.7,"foo",12,5.7,"foo",2008-12-25 11:22:33,2008/12/25,11:22:33 ,,,,,,,,gdalautotest-3.0.4/ogr/data/fake_s57_variant_C151.0000000644003401500001440000000036713614004466021404 0ustar rouaultusers001653LE1 0900047 ! 340400010430000DSID07500430600;& ISO 8211 Record Identifier(b12)1600;& Data Set Identification fieldRCNM!RCID!EXPP!xxxx(b11,b14,b11,A)00000 D 00053 550400010000300000DSID0002600003 XXXXXXXXXXXXXXXXXXgdalautotest-3.0.4/ogr/data/testpoly.shp0000644003401500001440000000415013614004466017733 0ustar rouaultusers' 4rhrr@Xr@@rp@pqXr@pqp@pqXr@rXr@rp@pqp@@p@p@pr@(r@pr@p@pr@(r@p@(r@p@p@pr@p@@Pq@hrr@qr@hrr@qPq@qPq@hrr@hr@rXrq(qqXrq(qr(qrXrqXr@h#@f?@f#@f?@h?@h#@f#@@@b`S@`@H@``S@`@H@b@H@b`S@``S@`@ Z@d@S@d@ Z@d@S`@S`@ Z@d@ Z@c@0j@ e@0l@ e@0j@ e@0l@c@0l@c@0j@ e@0j@ @gi@dm@di@dm@gm@gi@di@ @.3@P@S@P@3@P@S@.S@.3@P@3@ @DPj@H@0m@H@Pj@H@0m@D0m@DPj@H@Pj@ @l@`Yn@)@n@`Yn@)@l@)@l@`Yn@`Y j@\@8@p@pg@ \@pg@@\@8@p@;@`p@pg@\@pg@`c@pb@ m@b@`n@G@ c@F@`c@pb@`Sob@@N SkDpmCXT@WW@nb@oZ@@NQ`PSkgdalautotest-3.0.4/ogr/data/aspatial-table.tab0000644003401500001440000000024513614004466020710 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 4 a Integer ; b Integer ; c Integer ; d Char (254) ; gdalautotest-3.0.4/ogr/data/test.svg0000644003401500001440000002372313614004466017043 0ustar rouaultusers 2009-11-10 03:44:57+00:00 residential 1988060.0 44075465 24024676 footway 2008-04-29 07:30:01+01:00 yes 2009-06-28 10:18:25+01:00 Northwest Animal Facility 368166329 gdalautotest-3.0.4/ogr/data/gjmultipoly.shx0000644003401500001440000000015413614004466020437 0ustar rouaultusers' 6Y@Y@@2gdalautotest-3.0.4/ogr/data/ogr_gml_55_included1.xsd0000644003401500001440000000062313614005333021736 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/mixed_shape_type_non_conformant.shp0000644003401500001440000000133013614004466024474 0ustar rouaultusers' l&@@( @@8?????:@??@@?$@@@@@@@@Z&@?$@$@?&@?$@gdalautotest-3.0.4/ogr/data/testtypeautodetect.csv0000644003401500001440000000101113614004466022005 0ustar rouaultusersempty,real1,real2,real3,int1,int2,dt1,dt2,dt3,date,time,str1,str2,str3,str4,str5,str6,str7,str8,dt4 ,1.5,1,1.5,2,,2014-09-27 19:01:00,2014-09-27,2014-09-27 20:00:00,2014-09-27,12:34:56,a,"a","1",1,1.5,2014-09-27 19:01:00,2014-09-27,19:01:00,2014-09-27T00:00:00Z ,1.5,1.5,1,3,4,,2014-09-27 20:00:00,2014-09-27,2014-09-27,12:34:56,a,ab,"2",a,a,a,a,a, ,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a ,,,,a,,,,,,,,,,,,,,, ,,,,3.5,,,,,,,,,,,,,,, ,,,,,,a,,,,,,,,,,,,, ,,,,35,,,,,,,,,,,,,,, ,,,,,,,,,,,abc,,,,,,,, ,.52,,,,,,,,,,,,,,,,,, gdalautotest-3.0.4/ogr/data/expected_tile.gxt0000644003401500001440000000350413614004466020700 0ustar rouaultusers//$DELIMITER " " //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 2001} //$FIELDS Class=TILE;Subclass=TILE;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields IDSEL NOM WITHDATA Private#X Private#Y Private#Graphics -1 TILE TILE TILE 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 TILE TILE TILE 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 TILE TILE TILE 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 -1 TILE TILE TILE 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 TILE TILE TILE 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 TILE TILE TILE 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 gdalautotest-3.0.4/ogr/data/poly.gpkg.sql0000644003401500001440000000454113614004466017773 0ustar rouaultusers-- SQL GPKG CREATE TABLE gpkg_spatial_ref_sys (srs_name,srs_id,organization,organization_coordsys_id,definition,description); INSERT INTO gpkg_spatial_ref_sys VALUES('OSGB 1936 / British National Grid',4327,'NONE',4327,'PROJCS["OSGB 1936 / British National Grid",GEOGCS["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]]',NULL); CREATE TABLE gpkg_contents (table_name,data_type,identifier,description,last_change,min_x,min_y,max_x,max_y,srs_id); INSERT INTO gpkg_contents VALUES('poly','features','poly','','',478316.0,4762880.0,481645.0,4765610.0,4327); CREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count); INSERT INTO gpkg_ogr_contents VALUES('poly',1); CREATE TABLE gpkg_geometry_columns (table_name,column_name,geometry_type_name,srs_id,z,m); INSERT INTO gpkg_geometry_columns VALUES('poly','geom','POLYGON',4327,0,0); CREATE TABLE poly (fid INTEGER PRIMARY KEY, geom POLYGON); INSERT INTO poly VALUES(1,X'47500003E7100000000000007C461D41000000C016521D41000000202E2D5241000000A0EA2D524101030000000100000014000000000000602F491D41000000207F2D5241000000C028471D41000000E0922D5241000000007C461D4100000060AE2D524100000080C9471D4100000020B62D5241000000209C4C1D41000000E0D82D5241000000608D4C1D41000000A0DD2D5241000000207F4E1D41000000A0EA2D524100000020294F1D4100000080CA2D524100000000B4511D41000000E0552D5241000000C016521D4100000080452D5241000000E0174E1D41000000202E2D524100000020414D1D41000000E04C2D5241000000E04B4D1D41000000605E2D524100000040634D1D41000000E0742D5241000000A0EF4C1D41000000E08D2D5241000000E04E4C1D41000000E0A12D5241000000E0B04B1D4100000060B82D524100000080974A1D4100000080AE2D524100000080CF491D4100000080952D5241000000602F491D41000000207F2D5241'); CREATE TABLE gpkg_extensions (table_name,column_name,extension_name,definition,scope); INSERT INTO gpkg_extensions VALUES('poly','geom','gpkg_rtree_index','GeoPackage 1.0 Specification Annex L','write-only'); CREATE VIRTUAL TABLE rtree_poly_geom USING rtree(id, minx, maxx, miny, maxy); INSERT INTO rtree_poly_geom SELECT fid, ST_MinX(geom), ST_MaxX(geom), ST_MinY(geom), ST_MaxY(geom) FROM poly; gdalautotest-3.0.4/ogr/data/test.segp10000644003401500001440000000060213614004466017252 0ustar rouaultusersH SPHEROID: GRS 1980/WGS-84 PROJECTION: Universal Transverse Mercator (UTM) ZONE: 31 UNITS: meters firstline 10 49000000N 2000000E 426857 5427937 1234 firstline 20 49300000N 2000000E 427592 5483521 5678 secondline 1 49000000S 2000000W 134351-5439511 9012 secondline 2 49000000S 2300000W 97802-5442045 3456 gdalautotest-3.0.4/ogr/data/polygonm_without_m.shp0000644003401500001440000000063013614004466022012 0ustar rouaultusers' ??8???????Z???????????????gdalautotest-3.0.4/ogr/data/global_geometry.xsd0000644003401500001440000000126413614005333021224 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/seamless_part1.map0000644003401500001440000000200013614004466020746 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?6e6eʚ;ʚ;H@@P@gdalautotest-3.0.4/ogr/data/rnf_eg.gfs0000644003401500001440000000302413614004466017274 0ustar rouaultusers RoadSegment RoadSegment 1 -63.50995 -63.50041 46.24012 46.24200 ngd_id ngd_id Integer class_ class_ String 0 name name String 0 type type String 0 addrFmLeft addrFmLeft Integer addrToLeft addrToLeft Integer addrFmRght addrFmRght Integer addrToRght addrToRght Integer gdalautotest-3.0.4/ogr/data/arcm_with_m.shp0000644003401500001440000000061013614004466020336 0ustar rouaultusers' @@$@D@8????$@4@$@4@R@@??@@@@$@D@$@4@>@D@gdalautotest-3.0.4/ogr/data/buggymultiline.shx0000644003401500001440000000015413614004466021120 0ustar rouaultusers' 6Y@Y@@2:gdalautotest-3.0.4/ogr/data/choicepolygonmultipolygon.gml0000644003401500001440000000335013614004466023363 0ustar rouaultusers missing 1 0,0 0,1 1,1 1,0 0,0 2 0,0 0,1 1,1 1,0 0,0 10,0 10,1 11,1 11,0 10,0 gdalautotest-3.0.4/ogr/data/ESSENCE_NAIPF_ORI_PROV_sub93.gdb.zip0000644003401500001440000004152013614004466023223 0ustar rouaultusersPK AE!ESSENCE_NAIPF_ORI_PROV_sub93.gdb/UT c0+T+Tux PKtD 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000007.gdbtablxUT ܑcS+Tux cf@VLPKMu>EW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbindexesUT 2*T+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKt>ED+h5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbindexesUT *T+Tux ʼ` Ï2]FFFeh31#i/;_dE!?+3C' g, FD PKOu>Ev74X3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.freelistUT 6*T+Tux ׹ ! EOB=s $ϒ݀K>ٯxP{PKtD 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000003.gdbtablxUT ܑcS+Tux cf@VLPKtD"EQ$ESSENCE_NAIPF_ORI_PROV_sub93.gdb/gdbUT ޑcS+Tux cb``T`@@Ć@!h1׉r+I{Sի25_Z̃Eg1^ef{`$PKOu>E伆 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbtablxUT 6*T+Tux α a:p!hiV`#mp) >"*#ExyXA3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.freelistUT 6*T+Tux ױ B1Лظ#X885+?`%ZxEHzh (c3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbtableUT 6*T+Tux Kƕ~C 2 ,Q'^9\kIQu%I ȑ]]AOSN9@ @ Ǣ豧{3CJqlqVͼy>i9.jxeMwVOއxNӾjmx^8նfi~FiTۆO;ڡ@Gv]ü $HLs0vu4Kڅ`ԀWˍSO{?]}?m7[Yl?^ώ>xvNl^vܺy0]#4\RJk//^[-?l~xxXQl =ӐW%;fS@g8,4@7-o+ZXnZFxcU.޸fTU[J処VHiR6jzbi>mJrY.? ͎_M]2cPo~[ku]8Fq6s\`"5yY JZVY[ M=ӣ#>huw;d+MfI YMi]5M 5ic^šMW !8$|2v=wW^2B{FCFMrq8bwI!"[V}p:*MP? :ݠ Y)Z[-$,TF(YX&ݝ[3"M] ʮ/klxw/>Y*ܟ2r9Q)ln2 B;APe=x8]7 뮽' c  f^r5M! M=ƳL l:{Ս8 g -A/%X ``Zx$Aɒ-Z~tdS=Rf|*a!8@ovp$|R"ʉBp) p&&!-Uj!n0f 8M3#a :asݛ(0%l\f<!~ Ό dރme9o!%DT% i0!a!G ӽvvlIv莨PKŖVMxΥlۆu;kͣX>c\n;l$6 j.SLFAqqB_9@[ek`<[{i8.vnpM5#79:]ѦA[9;H\.[2{"R\C+Og2wP؄4JՒQ2V%#.Y18|9(L,/*|봄Kb2p 'L=#uHjoD!d 7-pz'dG}a Ohi@zM-'I+Azpi?heh4+ Yz"&-]Ja)=q3u@ & i" +Pe\j,LEbR$|QE E)~F]B=V@~B,iHn!r [@;,r8?!`%[C nvlv%Š"Hk9R 7Hwr9eyKp2F$D0,jP4lK(9t?ʕZT H4~"h|O|:!)[V2wpض6auҝ;Y$vv=rLj{?&̰Sg_$aW[ |g? EIrn†Ӈ@ J̗$r'%s 5&orCVk-Oy:[ݴ)F V~ab.p`0 et ة[g w׺֫!`??lVgNec ;& R/PĪa6$`3Cr? phFDp#!]B|Qj6O8r"|SEvC˟gzƠT-\%N_-0'ⰵ&O GJ`xX8-a<xt ԰<׊N#,`LhRajB#-ˑ 8 = !%'ͦ ρcc 0 %@Ӣ#F #31<2}q V y  < a[&4iK:fNsNX>ivقΡAJ-0蓗)1H9xƙB@Oz0+pgCBo_wkqm3/Z™v9Nqv[YҴt{g}G+b2HjL<2w9vzS5)X kaa4bXckLrk) (qM'x")< w$ERP1S0% ]NFū6c"gI4\koAkݡӱCOamk &kŚaz5UWGv NXh \UL_-"ܓKqT+8BjcXɳEkrI<X \gJdXJPe o_'ɅOTԑNjI]GHrvopTy/"E<Ż52 ]8V˱pv̵U:ݜ!؈f,sŵxpe;:4Y`"m@KvНҫ_m+8u<4TA1wb +uɇnnb7!Q!ag̃O'NMsBّ+8nbueQ^<ë}~ۣ=I׼Ž\w#+KC}y-o.Z9DCCQơpڍ#)ҝQeQ9$,+Kʒ$,+Kʒ$,+Kʒ$,+Kʒ$,+Kʒ$,y%4ʒ;O/VJ^⑗x%yG^⑗x% ,)UL~G^׿/V׿/yK^׿/yK^׿/yK^׿/yK^׿/yK^׿/ֿ?{?PKLu>E 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000017.gdbtablxUT 0*T+Tux cf@VLPKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbindexesUT ܑcS+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKtDQO 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000002.gdbtablxUT ܑcS+Tux ȱ@P!@ @RTEHQ`ֈ(>\t<FrMf%;P3 $I$IW^PKOu>E`4X3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.freelistUT 6*T+Tux ׹ !!7-"T$m_ %>uvPKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbindexesUT ܑcS+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKt>Ej)3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbtableUT *TO$+Tux mJAg.e:!+n%~QNka)| ˴QP@,vf7Тz\ܱE\y\>jp `X}@H֪V g+ ]ha`H 'VdH9-CJ+1<] }s>_v^i?gw:^ХV;˕ꡱ GG(L0YKNڌ$C܋ R6I!w$"kLRNsKI8PKMu>E%3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbtableUT 2*T+Tux cf@ʀ'<3̐ÐP `!F`R$JTg| M7$Dzd%6≚\n>)},goĞ4Se:Ƽ"buV/[OK^PKtDໄ~~3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000004.gdbtableUT ޑcS+Tux cf```r fe@PZJ X}@, ~&CPʐΐX205\txr(SeRok;5_vˍtGU|x`PKt>E 2 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbtablxUT *TO$+Tux  D/{4Bfa{UsvY ?PKtD, % 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000004.gdbtablxUT ޑcS+Tux  !,_Bf`KL2^uZ~?PKtDM3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000002.gdbtableUT ܑcS+Tux cf``@ʀ3! 1hvoTJr|" oC"P !(]E ~PL 3POCC&C:C0PQd8@Nd`*4Qj5Vk\KڑrZV>]}?Xyf?G05pqus fqQHUHIMK,)QHI,ILIUHKL/-J,S@)f5$(9?(85E 0 GwW6ϼ̼TEUN0%i E2(x}#<}\=\ C,A\ _hh `Ԋ4O+i6+XLxw'U: |Ċ\DgV*v<)FUhdjVd-X(5qj5+X cQx9p^2<SsSK*,6mzA6PKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbindexesUT cS+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKtD 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbtablxUT ܑcS+Tux cf@VLPKOu>E\93ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbtableUT 6*T+Tux cf```bg = 7#րA  L . l,L<. %@ ~@:H3(0Ldg(g XjX8r2J2p23r0X|.aQ€. `b  < @w0T2u:dO Pr@+d`?]iS8] /Y'_gïtJn kkp_g[g|XZk-qIPKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000003.gdbindexesUT ܑcS+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKZu>Ekח'+ESSENCE_NAIPF_ORI_PROV_sub93.gdb/timestampsUT L*T+Tux 6 J3if fd(9l.  PKLu>E3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.gdbtableUT 0*T+Tux cf```&  Bk@ yfb.vgDb dp 0p1d2Sr@6#P8Uӗ!]JI %Ka(BUd٩ @^XK:a~@2! *y ( M:YV>L0P4 hB%CP ^W /".^%(l x\]QL[\=V ?CBzx Syڍ|W+Es &tXxPKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbindexesUT ڑcS+Tux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPKtD+G93ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbtableUT ܑcS+Tux cf@ʀg<3RPI@\̐s4DVr<@\fP%!l"#g5q*/Wv8 g?9#s߅K-2:pPKMu>E 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbtablxUT 2*T+Tux cf@VLPKOu>EP2 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbtablxUT 6*T+Tux  DXY) L쉻1sVx?)PKLu>EY2X3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.freelistUT 0*T+Tux ׹ sGTN<d- #g{߼PKOu>Eʳ3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbtableUT 6*T+Tux }yPWbU< r uFC6Ш L, d+3vH9 ǣ}kgJdeA8LJXiဂci 7: gTruCooo4^ |4_ m2,OǝlD=~~ KO%hǯҸYyVF!͏2 kC=־Jk leM>sc&'4LFݡ>CqY"W"N4x f:;R=w|,Q98NrKF|k2\-4e68ic;l)/^z=ԩ8Ύ)GekN@d÷$nġa^ݣͩŴճ/jf˖[#A+MYJ{󙗸/=o'I]6A1,bm,juʅm#ޫZyG5 }ǰ1Ҹ񧔾 sLa#vSnTe)Lҟ0} `!9?Z?m,OXȍoqV&悖5Q'N I w=CCVb'j5ɛƇ~ $cn 8}Nv)o"լ㓮s1vH3:~׷/`}obMźX!Jʷ]%kqT f[M,-pC/"JVo=wkMDw(cgFW'sgAtA"k/6Oۖ_nJLux5 G o[~XJ}0;a;|| $@~T/(3Y~H z)/??xbVэӞFXd{EزS:zGFF^#M&;[׫Ym~n/NPMwH?~MR9E^ₘ])ғPKtDTl N3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000007.gdbtableUT ܑcS+Tux cf@ʀ2ZI13$1d12$30830$2' H P.(WPd0T2i;ϐ $K\ @ C&aHa``q \d1dìee`wA3b L@@OWѢیt뼘|RgL^ ,Y,j=./tbPKLu>EZ3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000017.gdbtableUT 0*T+Tux cf@ʀߡ<3R̐ÐP .@AN7LTx P.f`q`a`f(eHb(ad( Yi@@-%@-@-I@"E@\ !hk-!oKqZV4Rk\_N*A˷KcL 99G6L bPKLu>EC$ 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.gdbtablxUT 0*T+Tux  { 6T}O^PKOu>E@$ 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbtablxUT 6*T+Tux  {a, 6T}O^PK AE!AESSENCE_NAIPF_ORI_PROV_sub93.gdb/UTc0+Tux PKtD 3[ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000007.gdbtablxUTܑcSux PKMu>EW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbindexesUT2*Tux PKt>ED+h5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbindexesUT*Tux PKOu>Ev74X3rESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.freelistUT6*Tux PKtD 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000003.gdbtablxUTܑcSux PKtD"EQ$ESSENCE_NAIPF_ORI_PROV_sub93.gdb/gdbUTޑcSux PKOu>E伆 3,ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbtablxUT6*Tux PKtD)_3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000003.gdbtableUTܑcSux PKOu>ExyXA3EESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.freelistUT6*Tux PKOu>EHzh (c3+ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbtableUT6*Tux PKLu>E 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000017.gdbtablxUT0*Tux PKtDW[5vESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbindexesUTܑcSux PKtDQO 3@ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000002.gdbtablxUTܑcSux PKOu>E`4X3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.freelistUT6*Tux PKtDW[5ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbindexesUTܑcSux PKt>Ej)3gESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbtableUT*Tux PKMu>E%3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbtableUT2*Tux PKtDໄ~~3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000004.gdbtableUTޑcSux PKt>E 2 3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000027.gdbtablxUT*Tux PKtD, % 3lESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000004.gdbtablxUTޑcSux PKtDM3ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000002.gdbtableUTܑcSux PKtDW[5IESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbindexesUTcSux PKtD 3 ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbtablxUTܑcSux PKOu>E\93 ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbtableUT6*Tux PKtDW[5/"ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000003.gdbindexesUTܑcSux PKZu>Ekח'+"ESSENCE_NAIPF_ORI_PROV_sub93.gdb/timestampsUTL*Tux PKLu>E3#ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.gdbtableUT0*Tux PKtDW[5%ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbindexesUTڑcSux PKtD+G93%ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000005.gdbtableUTܑcSux PKMu>E 3&ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000018.gdbtablxUT2*Tux PKOu>EP2 3M'ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a0000001c.gdbtablxUT6*Tux PKLu>EY2X3'ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.freelistUT0*Tux PKOu>Eʳ3(ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000001.gdbtableUT6*Tux PKtDTl N3-ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000007.gdbtableUTܑcSux PKLu>EZ3/ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000017.gdbtableUT0*Tux PKLu>EC$ 3=0ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000008.gdbtablxUT0*Tux PKOu>E@$ 30ESSENCE_NAIPF_ORI_PROV_sub93.gdb/a00000006.gdbtablxUT6*Tux PK&&_1gdalautotest-3.0.4/ogr/data/test.geojsonl0000644003401500001440000000027413614004466020060 0ustar rouaultusers{"type":"Feature","properties":{"foo":"bar"},"geometry":{"type":"Point","coordinates":[1,2]}} {"type":"Feature","properties":{"foo":"baz"},"geometry":{"type":"Point","coordinates":[3,4]}} gdalautotest-3.0.4/ogr/data/all_geoms.id0000644003401500001440000000010013614004466017603 0ustar rouaultusers"3Mcy*T gdalautotest-3.0.4/ogr/data/polygon_without_index.tab0000644003401500001440000000131613614004466022466 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table Type NATIVE Charset "WindowsLatin1" Fields 16 Nom_Commune Char (50) ; INSEE_Commune Char (5) ; INSEE_Rgion Char (2) ; Nom_Rgion Char (30) ; INSEE_Dpartement Char (2) ; Nom_Dpartement Char (30) ; INSEE_Arrondissement Char (1) ; INSEE_Canton Char (2) ; Id_BDCarto Integer ; Statut Char (20) ; Abscisse_Commune Integer ; Ordonne_Commune Integer ; Superficie Integer ; Population Integer ; EXTRACTION_IGN Char (16) ; RECETTE Date ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "ce11dd42-b1ea-46b2-b769-4c036defad61" end_metadata gdalautotest-3.0.4/ogr/data/testgeometryelementpath.zip0000644003401500001440000000143413614004466023044 0ustar rouaultusersPKn<testgeometryelementpath.gmlUT 9L9LUx}QO0M'U%eYܓ&OWlRڥtßoY K{?m.[ V '#|K]d}}yĊRkngae|=J_)!u]f UVKCd .wI;tFj7 cNs;[՞`\=izDCNp=?=>lS0ҭB(?ۖ ^`PKn<1M]uNrR XDLMfY໎~/nw oPKn< testgeometryelementpath.gmlUT9LUxPKn< 1685268.99 4829496.98 1748204.00 4920171.81 1Line1-0.4 0.4 -0.3 0.4 2Line2-0.3 0.4 -0.2 0.4 3Line3-0.2 0.7 -0.2 0.4 4Line4-0.2 0.7 -0.2 0.9 0.2 0.9 0.2 0.8 5Line5-0.2 0.4 -0 0.4 6Line6-0.1 0.6 -0.1 0.5 -0 0.4 7Line7-0.1 0.6 -0 0.7 0.2 0.7 8Line80.2 0.8 0.2 0.7 9Line90.2 0.8 0.3 0.8 0.4 0.9 10Line101 0.6 1 0.9 0.4 0.9 11Line110.2 0.7 0.3 0.6 0.5 0.6 12Line12-0 0.4 0.1 0.4 0.1 0.3 13Line130.2 -0.2 -0.1 0 -0.1 0.1 -0.1 0.2 0.1 0.3 14Line14-0.2 -0.4 0.2 -0.4 15Line150.2 -0.2 0.2 -0.4 16Line160.7 0.2 0.9 0.1 0.9 -0.1 0.6 -0.2 0.3 -0.2 0.2 -0.2 17Line170.7 0.2 0.7 0.3 0.9 0.4 0.9 0.6 18Line180.9 0.6 1 0.6 19Line191.1 0.4 1.1 0.6 1 0.6 20Line200.7 -0.4 0.2 -0.4 21Line210.2 0.4 0.4 0.4 0.5 0.2 22Line220.2 0.4 0.2 0.2 23Line230.5 0.2 0.5 0.1 24Line240.6 0.1 0.8 0.1 0.8 -0.1 0.6 -0.1 0.6 0.1 25Line25-0.2 -0.4 -0.4 -0.4 -0.4 0.40.2 0.2 0.2 0 0.5 0 0.5 0.10.9 0.6 0.8 0.6 0.7 0.8 0.5 0.8 0.5 0.6 26Line26-0.3 0.4 -0.3 0.7 -0.2 0.7-0.2 -0.4 -0.2 -0.5 0.2 -0.5 0.2 -0.40.2 0.2 0.5 0.2 27Line271.1 -0.4 1.1 -0.1 28Line281.1 -0.1 1.1 0.4 29Line291.1 -0.4 0.7 -0.4 1Poly101 3Poly103 8Poly108 9Poly109 4Poly104 2Poly102 5Poly105 gdalautotest-3.0.4/ogr/data/departs.shp0000755003401500001440000000027013614004470017507 0ustar rouaultusers' \MbX9?v/?Gz?{Gz? MbX9?{Gz? Gz?ʡE? K7?v/?gdalautotest-3.0.4/ogr/data/bom.gml0000644003401500001440000000724313614004466016620 0ustar rouaultusers Ordnance Survey, (c) Crown Copyright. All rights reserved, 2003-03-29 Unknown 28/03/2007T09:18:12 347231,461214 348231,462214 10198 1 09/11/2001 00:00:00 Terrain And Height 347243.85,461299.5 Terrain And Height 50 8 1 1.500 0 17.1m 10069 1 09/11/2001 00:00:00 Terrain And Height 347251.45,461250.85 Height Control Bench Mark 50 8 1 1.500 0 BM 16.33m 10059 2 19/03/2002 00:00:00 Land 347308.25,461429.1 General Surface 50 Manmade 5 1 1.500 0 Car gdalautotest-3.0.4/ogr/data/idlink.dbf0000644003401500001440000000060013614004466017257 0ustar rouaultusers_a)EAS_IDNNAMEC 168_168_ 179_179_ 171_171_ 170_170_ 165_165_ 158_158_ 166_166_ gdalautotest-3.0.4/ogr/data/multipointz_without_m.shp0000644003401500001440000000032413614004466022544 0ustar rouaultusers' j?@@@@4?@@?@@@@@@gdalautotest-3.0.4/ogr/data/text-fancy.dxf0000755003401500001440000001473213614004470020126 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $HANDSEED 5 FAAAA 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 471 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 0.375 49 0.25 74 0 49 -0.125 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 10 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 347 EE 348 0 0 LAYER 5 65F 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 agreatlayer 70 0 62 5 6 DASHED2 370 211 390 F 347 EE 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 3 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 11 330 3 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 8.5 41 2.5 50 0.0 71 0 42 5.0 3 timesbi.ttf 4 1001 ACAD 1000 Times New Roman 1071 50331666 0 STYLE 5 132 330 3 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Annotative 70 0 40 0.0 41 1.0 50 0.0 71 0 42 2.5 3 arial.ttf 4 1001 ACAD 1000 Arial 1071 34 0 STYLE 5 261 330 3 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Legend 70 0 40 0.0 41 1.0 50 0.0 71 0 42 2.5 3 calibri.ttf 4 1001 ACAD 1000 Calibri 1071 256 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 541 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $MODEL_SPACE 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 543 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $PAPER_SPACE 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 659 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 thebestblock 340 0 70 4 280 1 281 0 0 BLOCK_RECORD 5 A63 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 theMTEXTblock 340 0 70 4 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 542 330 541 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $MODEL_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $MODEL_SPACE 1 0 ENDBLK 5 71 330 541 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 544 330 543 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $PAPER_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $PAPER_SPACE 1 0 ENDBLK 5 6D 330 543 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 65A 330 659 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 thebestblock 70 0 10 0.0 20 0.0 30 0.0 3 thebestblock 1 0 TEXT 5 EBA 330 659 100 AcDbEntity 8 0 100 AcDbText 10 -84.31506849315068 20 15.11175198269647 30 90.0 40 10.0 1 Some nice text 41 1.9 72 4 11 0.0 21 20.0 31 90.0 100 AcDbText 0 LWPOLYLINE 5 EBB 330 659 100 AcDbEntity 8 0 6 ByBlock 62 0 48 10.0 370 -2 100 AcDbPolyline 90 4 70 1 43 0.0 10 -90.0 20 30.0 10 90.0 20 30.0 10 90.0 20 10.0 10 -90.0 20 10.0 0 ENDBLK 5 65B 330 659 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 A64 330 A63 100 AcDbEntity 8 0 62 8 100 AcDbBlockBegin 2 theMTEXTblock 70 0 10 0.0 20 0.0 30 0.0 3 theMTEXTblock 1 0 LWPOLYLINE 5 A78 330 A63 100 AcDbEntity 8 0 6 ByBlock 62 0 48 10.0 370 -2 100 AcDbPolyline 90 4 70 1 43 0.0 10 -90.0 20 30.0 10 90.0 20 30.0 10 90.0 20 -8.0 10 -90.0 20 -8.0 0 MTEXT 5 A79 330 A63 100 AcDbEntity 8 0 100 AcDbMText 10 0.6164383561643945 20 25.11175198269647 30 90.0 40 10.0 41 169.8630136986301 46 0.0 71 2 72 5 1 Some nice MTEXT 73 1 44 1.0 0 ENDBLK 5 A65 330 A63 100 AcDbEntity 8 0 62 8 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 65E 330 EEEEE 100 AcDbEntity 8 agreatlayer 62 1 100 AcDbBlockReference 2 thebestblock 10 310000.0 20 5820000.0 30 0.0 0 TEXT 5 693 330 EEEEE 100 AcDbEntity 8 0 100 AcDbText 10 310000.0 20 5820040.0 30 0.0 40 5.0 1 Good text 100 AcDbText 0 INSERT 5 A74 330 EEEEE 100 AcDbEntity 8 agreatlayer 6 ByBlock 100 AcDbBlockReference 2 theMTEXTblock 10 310000.0 20 5819970.0 30 0.0 0 TEXT 5 AAE 330 EEEEE 100 AcDbEntity 8 0 60 1 100 AcDbText 10 310000.0 20 5820050.0 30 0.0 40 5.0 1 Invisible text 100 AcDbText 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/seamless_part1.tab0000644003401500001440000000021313614004466020743 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 2 id Char (254) ; str Char (254) ; gdalautotest-3.0.4/ogr/data/CoHI_GCS12.shx0000644003401500001440000000020413614004466017475 0ustar rouaultusers' Bd 2@7nYcht;6@2H~ gdalautotest-3.0.4/ogr/data/poly.tar.gz0000644003401500001440000000420113614004466017443 0ustar rouaultusersKXl[W~][R46bi0{jWIhyXNIH L `+6V61'Ih HT l|W'n+ Risݼsfܧ,aSeM3kރh[ٖ"ԥT*Wr%!|Z~׳HlO=I%pfy= 4Y̶~2DŽfm[ivܰT05M4n:I\s\ӍV?[K9q!g:1-o[f9s?~Vr4ׁiznǃqmj䧺-lÌFp~Ű[ڶ hv/.Z%[>`K9u_ gZWoD͌ nkTʳb8W)ssbTDS#m@r|"=ϲllt{*3240IJgFĎeK-s1C7]۴tJ,ÅHTN ˸|1-CwuKs]Sa5H OFKbPTgt2_Hd&N29C3|PDMe:_rsyBN:m\>/7Dr]V5ќ6}99|\)Q$Q/Uf.}|h|%/Ц_=c\{ˍ/ml7mU$z+ Sں'wg{|ڗIv֖ b)_Fb׿=ӌ83Dw`׿q;Ezy}{µ ?2ܶO'ZM1ܶL}$%B.w?>A}SuSK'75lўF.xyXyyxǷ!NoRVoEo!y.oi_k^¨y<妆a{i:jy@y=Ph5 |eOمg@uKaԱ<}WVno5o%\OΣEG*6[pV7 GmDy֫|%ݎkhKP׏4u/; =+Ừ׃y"1?J ~/jEPyb I5\np]u5{tGڐȍ >o束'j3M EeeboES4Vm򬓿(^+꽅}:O'oНxXc4Q:O%~}l-W cGa?Av)<]X 8,.`UN^ȇrJu~>wUp$ c~?x^^7yyGa6+IZy*Sd{;K6uh!/JA~W}p"Uz?]}(Y'p:u9\'r:G[P+gp}G\_r}^\Y]՝Fyُ'J؟B'||%tN~󹙟9cx}o+ 9<q)s}C>?OՆ_ڮ_;|3nL?e.3zN'NɟKuT޷ɾxp?Oz^? '>Zۺۺۺ-h((gdalautotest-3.0.4/ogr/data/emptylayers_without_folder.kml0000644003401500001440000000036713614004466023543 0ustar rouaultusers Test Placemark1 gdalautotest-3.0.4/ogr/data/arcgis-world-wfs.gml0000644003401500001440000001015313614004466021227 0ustar rouaultusers 1 60.0001220703125 -180 61.0001220703125 -180 62.0001220703125 -180 63.0001220703125 -180 64.0001220703125 -180 65.0001220703125 -180 66.0001220703125 -180 67.0001220703125 -180 68.0001220703125 -180 69.0001220703125 -180 70.0001220703125 -180 71.0001220703125 -180 72.0001220703125 -180 73.0001220703125 -180 74.0001220703125 -180 75.0001220703125 -180 76.0001220703125 -180 77.0001220703125 -180 78.0001220703125 -180 79.0001220703125 -180 80.0001220703125 -180 81.0001220703125 -180 82.0001220703125 -180 83.0001220703125 -180 84.0001220703125 -180 85.0001220703125 -180 86.0001220703125 -180 87.0001220703125 -180 88.0001220703125 -180 89.0001220703125 -180 90.0001220703125 -180 90.0001220703125 -179 90.0001220703125 -178 90.0001220703125 -177 90.0001220703125 -176 90.0001220703125 -175 90.0001220703125 -174 90.0001220703125 -173 90.0001220703125 -172 90.0001220703125 -171 90.0001220703125 -170 90.0001220703125 -169 90.0001220703125 -168 90.0001220703125 -167 90.0001220703125 -166 90.0001220703125 -165 90.0001220703125 -164 90.0001220703125 -163 90.0001220703125 -162 90.0001220703125 -161 90.0001220703125 -160 90.0001220703125 -159 90.0001220703125 -158 90.0001220703125 -157 90.0001220703125 -156 90.0001220703125 -155 90.0001220703125 -154 90.0001220703125 -153 90.0001220703125 -152 90.0001220703125 -151 90.0001220703125 -150 89.0001220703125 -150 88.0001220703125 -150 87.0001220703125 -150 86.0001220703125 -150 85.0001220703125 -150 84.0001220703125 -150 83.0001220703125 -150 82.0001220703125 -150 81.0001220703125 -150 80.0001220703125 -150 79.0001220703125 -150 78.0001220703125 -150 77.0001220703125 -150 76.0001220703125 -150 75.0001220703125 -150 74.0001220703125 -150 73.0001220703125 -150 72.0001220703125 -150 71.0001220703125 -150 70.0001220703125 -150 69.0001220703125 -150 68.0001220703125 -150 67.0001220703125 -150 66.0001220703125 -150 65.0001220703125 -150 64.0001220703125 -150 63.0001220703125 -150 62.0001220703125 -150 61.0001220703125 -150 60.0001220703125 -150 60.0001220703125 -151 60.0001220703125 -152 60.0001220703125 -153 60.0001220703125 -154 60.0001220703125 -155 60.0001220703125 -156 60.0001220703125 -157 60.0001220703125 -158 60.0001220703125 -159 60.0001220703125 -160 60.0001220703125 -161 60.0001220703125 -162 60.0001220703125 -163 60.0001220703125 -164 60.0001220703125 -165 60.0001220703125 -166 60.0001220703125 -167 60.0001220703125 -168 60.0001220703125 -169 60.0001220703125 -170 60.0001220703125 -171 60.0001220703125 -172 60.0001220703125 -173 60.0001220703125 -174 60.0001220703125 -175 60.0001220703125 -176 60.0001220703125 -177 60.0001220703125 -178 60.0001220703125 -179 60.0001220703125 -180 1 120 900 gdalautotest-3.0.4/ogr/data/empty.shx0000644003401500001440000000014413614004466017215 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/poly_non_conformant.gpkg0000644003401500001440000001600013614004466022266 0ustar rouaultusersSQLite format 3@ GP10 - XpY9WtablepolypolyCREATE TABLE poly (fid, geom POLYGON)77?tablegpkg_geometry_columnsgpkg_geometry_columnsCREATE TABLE gpkg_geometry_columns (table_name,column_name,geometry_type_name,srs_id,z,m)//1tablegpkg_ogr_contentsgpkg_ogr_contentsCREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count)AU/indexsqlite_autoindex_gpkg_ogr_contents_1gpkg_ogr_contents''stablegpkg_contentsgpkg_contentsCREATE TABLE gpkg_contents (table_name,data_type,identifier,description,last_change,min_x,min_y,max_x,max_y,srs_id)%55mtablegpkg_spatial_ref_sysgpkg_spatial_ref_sysCREATE TABLE gpkg_spatial_ref_sys (srs_name,srs_id,organization,organization_coordsys_id,definition,description) //NOGOSGB 1936 / British National GridNONEPROJCS["OSGB 1936 / British National Grid",GEOGCS["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]] =  polyfeaturespolyA1AR+@AeAR-  poly  poly polygeomPOLYGON y vGP|FARA .-RA-RA`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RAgdalautotest-3.0.4/ogr/data/pointzm_with_all_nodata_m.shx0000644003401500001440000000016413614004466023306 0ustar rouaultusers' : ?@@@@@2Hgdalautotest-3.0.4/ogr/data/bigoffset.shx0000644003401500001440000000015413614004466020030 0ustar rouaultusers' 6vH7BvH7B2jgdalautotest-3.0.4/ogr/data/apt810/0000755003401500001440000000000013614004466016351 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/apt810/apt.dat0000644003401500001440000001763213614004466017640 0ustar rouaultusersI 810 Version - THIS FILE IS A SHORT EXTRACT FROM THE FOLLOWING DATA MADE FOR OGR TESTING. data cycle 2008.08, build 20081030, metadata AptXP810. Copyright 2008, Robin A. Peel (robin@xsquawkbox.net). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. This product was developed using DAFIF (the Defense Aeronautical Flight Information File), a product of the US National Imagery and Mapping Agency (NIMA). NIMA requires the following warranty statements: (A) Under 10 U.S.C. 456, no civil action may be brought against the United States on the basis of the content of a navigational aid prepared or disseminated by either the former Defense Mapping Agency (DMA) or the National Imagery and Mapping Agency (NIMA). (B) The DAFIF product is provided "as is," and no warranty, express or implied, including, but not limited to the implied warranties of merchantability and fitness for particular purpose or arising by statute or otherwise in law or from a course of dealing or usage in trade, is made by NIMA as to the accuracy and functioning of the product. : Neither NIMA nor its personnel will be liable for any claims, losses, or damages arising from or connected with the use of this product. The user agrees to hold harmless the United States National Imagery and Mapping Agency. The user's sole and exclusive remedy is to stop using the DAFIF product. 1 203 0 0 UHP1 [X]Lenino 10 52.910007 156.878342 09x 90.00 11154 0000.0000 0000.0000 249 111111 2 0 0 0.00 0 0300.0300 10 52.908983 156.853257 xxx 179.98 546 0.0 0.0 124 111111 2 0 0 0.00 0 10 52.908988 156.878343 xxx 179.98 546 0.0 0.0 124 111111 2 0 0 0.00 0 10 52.908993 156.903428 xxx 179.98 546 0.0 0.0 124 111111 2 0 0 0.00 0 10 52.908134 156.878343 xxx 89.98 11154 0.0 0.0 124 111111 2 0 0 0.00 0 14 52.911007 156.878342 0 0 Tower Viewpoint 19 52.911030 156.851840 1 WS 19 52.908984 156.904842 1 WS 1 810 0 1 7I6 4 Winds Aerodrome 10 39.825045 -086.883342 18x 179.00 1900 0000.0000 0000.0000 97 121121 3 0 1 0.25 0 0300.0300 18 39.825061 -086.882131 1 BCN 19 39.827923 -086.882889 1 WS 19 39.822166 -086.883794 1 WS 16 0 0 1 6MA8 [S] Acushnet River 10 41.647326 -070.917538 02x 4.00 3500 0000.0000 0000.0000 200 111111 13 0 1 0.25 0 0300.0300 10 41.647326 -070.917538 16x 144.00 3500 0000.0000 0000.0000 200 111111 13 0 1 0.25 0 0300.0300 17 0 0 1 9FD6 [H] Academy 10 27.946966 -082.420927 H1x 0.00 30 0000.0000 0000.0000 30 111111 2 0 2 0.25 0 0300.0300 19 27.947090 -082.420787 1 WS 1 0 0 1 EHVB [X] VALKENBURG 10 52.166167 004.418000 05x 51.49 8001 0000.0000 0000.0000 148 342342 1 0 3 0.25 0 0300.0300 10 52.168734 004.426592 16x 162.74 4912 0000.0327 0000.0000 148 121121 1 0 2 0.25 0 0300.0300 10 52.158920 004.404748 xxx 141.48 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.174889 004.422434 xxx 252.74 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.165692 004.418614 xxx 141.48 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.168553 004.425644 xxx 252.74 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.172464 004.432480 xxx 141.48 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.162216 004.428855 xxx 252.74 325 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.165295 004.419129 xxx 51.48 8001 0.0 0.0 74 161161 1 0 0 0.25 0 10 52.168402 004.424854 xxx 162.74 4912 0.0 0.0 74 161161 1 0 0 0.25 0 54 12210 TWR 54 13415 TWR 55 11970 ROTTERDAM APP 55 12702 ROTTERDAM APP 55 11905 SCHIPHOL APP 55 12120 SCHIPHOL APP 1 10 1 0 EKYT Aalborg 10 57.095113 009.855128 08L 83.25 8674 0000.0000 0895.0728 148 341357 1 0 3 0.25 1 0300.0300 10 57.093247 009.856360 08R 83.27 8330 0000.0000 0492.0491 74 341341 1 0 2 0.25 1 0300.0300 10 57.087151 009.869893 xxx 121.00 201 0.0 0.0 80 111111 1 0 0 0.25 0 10 57.087204 009.867816 xxx 165.00 200 0.0 0.0 60 111111 1 0 0 0.25 0 10 57.096115 009.866931 xxx 48.00 200 0.0 0.0 60 111111 1 0 0 0.25 0 10 57.087307 009.867318 xxx 46.30 192 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.086193 009.869949 xxx 47.00 150 0.0 0.0 100 111111 1 0 0 0.25 0 10 57.095261 009.832298 xxx 0.00 170 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.094170 009.867034 xxx 40.00 141 0.0 0.0 70 161161 1 0 0 0.25 0 10 57.096115 009.867502 xxx 114.00 130 0.0 0.0 80 111111 1 0 0 0.25 0 10 57.086899 009.870508 xxx 140.00 140 0.0 0.0 70 111111 1 0 0 0.25 0 10 57.095638 009.832591 xxx 39.50 160 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.088219 009.867823 xxx 15.90 89 0.0 0.0 110 161161 1 0 0 0.25 0 10 57.096001 009.876568 xxx 110.00 130 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.087654 009.866511 xxx 46.30 130 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.094147 009.867462 xxx 116.00 120 0.0 0.0 70 161161 1 0 0 0.25 0 10 57.095181 009.876778 xxx 55.30 120 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.097916 009.868052 xxx 149.00 100 0.0 0.0 70 161161 1 0 0 0.25 0 10 57.095730 009.867216 xxx 55.33 100 0.0 0.0 70 111111 1 0 0 0.25 0 10 57.097172 009.854255 xxx 83.30 9350 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.091484 009.861605 xxx 142.30 3332 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.095463 009.841162 xxx 141.30 2640 0.0 0.0 50 161161 1 0 0 0.25 0 10 57.087231 009.868841 xxx 48.30 308 0.0 0.0 763 111111 1 0 0 0.25 0 10 57.094799 009.832718 xxx 133.30 920 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.096416 009.857744 xxx 31.50 900 0.0 0.0 50 161161 1 0 0 0.25 0 10 57.097015 009.867682 xxx 20.00 800 0.0 0.0 44 161161 1 0 0 0.25 0 10 57.094959 009.867089 xxx 173.30 680 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.098709 009.836417 xxx 141.30 450 0.0 0.0 200 111111 1 0 0 0.25 0 10 57.092621 009.835478 xxx 130.40 570 0.0 0.0 47 161161 1 0 0 0.25 0 10 57.087139 009.866065 xxx 45.40 281 0.0 0.0 320 161161 1 0 0 0.25 0 10 57.086720 009.868690 xxx 128.00 370 0.0 0.0 100 111111 1 0 0 0.25 0 10 57.092857 009.834799 xxx 145.00 330 0.0 0.0 120 111111 1 0 0 0.25 0 10 57.097015 009.876137 xxx 210.30 370 0.0 0.0 65 161161 1 0 0 0.25 0 10 57.098209 009.876997 xxx 347.00 308 0.0 0.0 120 161161 1 0 0 0.25 0 10 57.095592 009.876713 xxx 353.00 300 0.0 0.0 121 161161 1 0 0 0.25 0 10 57.088013 009.867233 xxx 52.80 281 0.0 0.0 120 111111 1 0 0 0.25 0 10 57.094627 009.832737 xxx 132.00 300 0.0 0.0 100 111111 1 0 0 0.25 0 10 57.097595 009.876892 xxx 210.30 264 0.0 0.0 112 161161 1 0 0 0.25 0 10 57.094975 009.876424 xxx 31.00 300 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.096127 009.876120 xxx 130.00 300 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.093433 009.834688 xxx 29.00 260 0.0 0.0 60 161161 1 0 0 0.25 0 10 57.098370 009.877271 xxx 18.00 210 0.0 0.0 100 161161 1 0 0 0.25 0 10 57.095695 009.866698 xxx 120.30 200 0.0 0.0 100 111111 1 0 0 0.25 0 10 57.094997 009.857070 xxx 29.30 160 0.0 0.0 140 111111 1 0 0 0.25 0 14 57.090347 009.866978 62 0 ATC Tower 18 57.095921 009.854952 1 BCN 19 57.094521 009.833206 1 WS 19 57.095703 009.877051 1 WS 19 57.092312 009.835388 1 WS 19 57.094185 009.877332 1 WS 50 12047 ATIS 54 11830 TWR 55 12397 APP 55 12070 ARR 99 gdalautotest-3.0.4/ogr/data/padding_after_field_defns.dbf0000644003401500001440000000044313614004466023123 0ustar rouaultuserst WidCPfooCP 1 2 gdalautotest-3.0.4/ogr/data/polygon_without_index.map0000644003401500001440000002000013614004466022464 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?Yc=F9<H!guZ|@ sc|@#g v.@@G@F@H@\%AP-YA]thQ%Zu0&{uf&{uRF9<VRxt: =, my PY y %+L..JEϠD#R;ġ1Kj-uc7g# gyN<sk*K/zҢ B!%]@G!0"9-$(_&)(E*Ox,{ȦG,0G2;i:F:0:ذYr;-Ǩ;]9<&9<_;l:o % o % U+@0&QYc=4`fDy8behMvwɺ1PE!{uRF9<U+@0&Z)no!Ƚm"!j2Yj>jKk(tZl\SllI:lTlzxjOiˬhf%gcxe {dcﯷbIbT+b G b#vb7a=H`U0__wTm_?:c5_M#_r=^﭅^49]l]  \ \& 1q\M R\ H](N 9^ ! ^ d^OM \v\X,\ګ [g& [0 [ NZ[F wZ\Z)ZVYL {~X Vv sVo U&-1.VWg=W*HX:YkZD`ZZ;Z_Z)O1qYpLY{VVYD<$Y[ \2\*]X]Gj^EN^nL_Sh_:C``v`(`z:9a^JjabbbDybDy|6cbkc Ycdc{~dۈdGQIJRL6M(=N]J4OuXO tP"tQ&VVzY)W]a|;^])`7_sdb bЏb1+bHhbJcc"ddc!=dj cSd$RdTd1qdudzee[$1fL4`fX+eeڅ1qe$ +@+Yc=[=k?hMvwɺ1{uf&{u#%&v6&w&v&d0v,'4uG(o>t*%,tr(+d5tgK+Wtx+Wt+EqA1*q1+pX1pO1Xjp 1BXpɺ1l]/lO/ k=/t!ei*a( +a'@_7&sd_iT&[#[#Z "Z^Z"Z^Z"I[O T[s YW冷YX#mY WoYXwdXٽzX3`T#ETf qS9%S&MSSsRQ28QuQfPBlVP.﷎O*J4ONNlN8s!Mx_hM@E`M@EM]ŋNkf}mPRXR@,S33T_U1Um&%V[2n>VyGV|Vi}Vh#V;IWBXtZI ZxZ q2[. [&K [0 [g& X,\ګ \ \vd^OM ^ 9^ ! H](N R\ 1q\M \& \ l] ]﭅^49=^M#_rc5_m_?:_wT0_H`U7a=vb b#+b GbTﯷbIc{dcxe gˬhf%Oijlzx:lTlIlZl\Sk(tjKj>j2YȽm"!o>no!iVpo"zp "]thQ%Zu0&{uf&{uRF9<VRxt: =, my PY y %+L..JEϠD#R;ġ1Kj-uc7g# gyN<sk*K/zҢ B!%]@G!0"9-$(_&)(E*Ox,{ȦG,0G2;i:F:0:ذYr;-Ǩ;]9<&9<_;l::x:.:.x:@-98Ф$8skN7RPN7',ȴ7ڣ 7U4C545.I6tm6 7lМ 7rx6Vx6Cޚ7R7﷕7VU6ﱲ`5`M5GGS4lГ33QR3 62}2˵0Rʲ/rp4w/;/ˉ9.*.C|.h܈?.-e,+5+$+)~A%~<0%T}_&T}&(*(v(^*H~_* )+)+X04,ڀ`,o2-o]-IF.Bi.M.zBV*/O3/DV*/@|>,${r(+{+ zL(&y4(wb'w&v6&{u#%&{uf&v&vʉ$kwo"MwgF"wb!*WxX vx~x)x}%y !yz&`%,ziWPzKczyzW {sc{?{(|u$}}6~k*~~vTܾﳫ%,uKm^uׂR K I0gvq1 "n@ @Kɉ+];X CF I` Vv . H "O? V 9 z  ]  h/ eZ Z  Oa~ UL 7 7 Lm͎b﬑^ZVRgdalautotest-3.0.4/ogr/data/bug1526.0000000644003401500001440000002011013614004466016642 0ustar rouaultusers017953LE1 0900234 ! 34040000147000000010430147DSID1650190DSSI1130355VRID0770468ATTV0570545VRPC0700602VRPT0750672SGCC0600747SG2D0480807SG3D0530855FRID1000908FOID0701008ATTF0591078NATF0681137FFPC0901205FFPT0861295FSPC0901381FSPT09014710000;& 0001DSIDDSIDDSSI0001VRIDVRIDATTVVRIDVRPCVRIDVRPTVRIDSGCCVRIDSG2DVRIDSG3D0001FRIDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRIDFFPTFRIDFSPCFRIDFSPT0500;& ISO 8211 Record Identifier(b12)1600;& Data Set Identification fieldRCNM!RCID!EXPP!INTU!DSNM!EDTN!UPDN!UADT!ISDT!STED!PRSP!PSDN!PRED!PROF!AGEN!COMT(b11,b14,2b11,3A,2A(8),R(4),b11,2A,b11,b12,A)1600;& Data Set Structure information fieldDSTR!AALL!NALL!NOMR!NOCR!NOGR!NOLR!NOIN!NOCN!NOED!NOFA(3b11,8b14)1600;& Vecor Record Identifier fieldRCNM!RCID!RVER!RUIN(b11,b14,b12,b11)2600;& Vecor Record Attribute field*ATTL!ATVL(b12,A)1600;& Vecor Record Pointer Control fieldVPUI!VPIX!NVPT(b11,2b12)2000;& Vecor Record Pointer field*NAME!ORNT!USAG!TOPI!MASK(B(40),4b11)1600;& Coordinate Control fieldCCUI!CCIX!CCNC(b11,2b12)2200;& 2-D Coordinate Field*YCOO!XCOO(2b24)2200;& 3-D Coordinate Field*YCOO!XCOO!VE3D(3b24)1600;& Feature record identifier fieldRCNM!RCID!PRIM!GRUP!OBJL!RVER!RUIN(b11,b14,2b11,2b12,b11)1600;& Feature object identifier fieldAGEN!FIDN!FIDS(b12,b14,b12)2600;&-A Feature record attribute field*ATTL!ATVL(b12,A)2600;&%/AFeature record national attribute field*ATTL!ATVL(b12,A)1600;& Feature record to feature object pointer control fieldFFUI!FFIX!NFPT(b11,2b12)2000;& Feature record to feature object pointer field*LNAM!RIND!COMT(B(64),b11,A)1600;& Feature record to spatial record pointer control fieldFSUI!FSIX!NSPT(b11,2b12)2000;& Feature record to spatial record pointer field*NAME!ORNT!USAG!MASK(B(40),3b11)00143 D 00049 220400010300DSID5503DSSI3658 UA4T3402.00717 2006051903.12.0C00074 D 00049 220400010300VRID0903SG3D1312npZh00074 D 00049 220400010300VRID0903SG3D1312npZ<'00064 D 00046 12040001300VRID903SGCC612n00049 D 00037 1104000130VRID93n300049 D 00037 1104000130VRID93n200049 D 00037 1104000130VRID93n100049 D 00037 1104000130VRID93n000049 D 00037 1104000130VRID93 n/00121 D 00065 220400010300FRID1303FOID0916ATTF2225FSPT0947 d*Ŷf}11]1100000npZ00121 D 00065 220400010300FRID1303FOID0916ATTF2225FSPT0947 dًƃ}11]1100000npZ00055 D 00039 21040001030FRID133 d 00055 D 00039 21040001030FRID133 d00055 D 00039 21040001030FRID133d 00055 D 00039 21040001030FRID133d 00055 D 00039 21040001030FRID133d 00055 D 00039 21040001030FRID133d 00055 D 00039 21040001030FRID133d00055 D 00039 21040001030FRID133d00055 D 00039 21040001030FRID133d00055 D 00039 21040001030FRID133d00087 D 00057 220400010300FRID1303FOID0916ATTF0525dvu ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525d[v ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525df2w ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525drO퉄 00087 D 00057 220400010300FRID1303FOID0916ATTF0525dcnm ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525dY[]100087 D 00057 220400010300FRID1303FOID0916ATTF0525d9]100087 D 00057 220400010300FRID1303FOID0916ATTF0525d]]100087 D 00057 220400010300FRID1303FOID0916ATTF0525d DJ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525dR]100087 D 00057 220400010300FRID1303FOID0916ATTF0525 d ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525!dt;; ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525"d?im]100087 D 00057 220400010300FRID1303FOID0916ATTF0525#d@.X00087 D 00057 220400010300FRID1303FOID0916ATTF0525$dA. yX00087 D 00057 220400010300FRID1303FOID0916ATTF0525%dB.FX00087 D 00057 220400010300FRID1303FOID0916ATTF0525&dC.00X00087 D 00057 220400010300FRID1303FOID0916ATTF0525'dD.kX00087 D 00057 220400010300FRID1303FOID0916ATTF0525(dO7I]100087 D 00057 220400010300FRID1303FOID0916ATTF0525)dQ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525*d\3cf'}00087 D 00057 220400010300FRID1303FOID0916ATTF0525+dl3ԹIQ4}00087 D 00057 220400010300FRID1303FOID0916ATTF0525,dV]100087 D 00057 220400010300FRID1303FOID0916ATTF0525-dY2]100087 D 00057 220400010300FRID1303FOID0916ATTF0525.dzӥ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525/d<AC]100087 D 00057 220400010300FRID1303FOID0916ATTF05250d@'_I]100087 D 00057 220400010300FRID1303FOID0916ATTF05251dB$K]100087 D 00057 220400010300FRID1303FOID0916ATTF05252dnb]100087 D 00057 220400010300FRID1303FOID0916ATTF05253d}.V5_X00087 D 00057 220400010300FRID1303FOID0916ATTF05254d.7X00086 D 00057 220400010300FRID1303FOID0916ATTF04255dK_Mo00086 D 00057 220400010300FRID1303FOID0916ATTF04256dK1L00086 D 00057 220400010300FRID1303FOID0916ATTF04257dKtO@N00097 D 00057 220400010300FRID1303FOID0916ATTF15258dK)(01.5)+03.500097 D 00057 220400010300FRID1303FOID0916ATTF15259dK9U(01.5)+03.500318 D 00075 33040001003000FRID013003FOID009016ATTF084025NATF134109:d:n@?fDuring South winds nautophone is not always heard in S direction from lighthouse,i4 G0A ?i245==8E 2iB@i2 =0 S 2i4 <0O:0 =0CB>D>= =5 702648 GCB=>00109 D 00057 220400010300FRID1303FOID0916ATTF2725;d(KS(01.5)+04.5+(04.5)+01.500109 D 00057 220400010300FRID1303FOID0916ATTF2725<d'KІ(01.5)+04.5+(04.5)+01.500087 D 00057 220400010300FRID1303FOID0916ATTF0525=dQUK]100087 D 00057 220400010300FRID1303FOID0916ATTF0525>de@iDn]100087 D 00057 220400010300FRID1303FOID0916ATTF0525?df3o]100087 D 00057 220400010300FRID1303FOID0916ATTF0525@dul,]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Adv}l]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Bdz} ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525CdFě]100087 D 00057 220400010300FRID1303FOID0916ATTF0525DdW]100087 D 00057 220400010300FRID1303FOID0916ATTF0525EdD ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Fd^G]100087 D 00057 220400010300FRID1303FOID0916ATTF0525GdTm׃]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Hdۤ]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Id=]100087 D 00057 220400010300FRID1303FOID0916ATTF0525JdE⽦]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Kd#]100087 D 00057 220400010300FRID1303FOID0916ATTF0525Ldng]1gdalautotest-3.0.4/ogr/data/emptymultiline.shp0000644003401500001440000000034013614004466021126 0ustar rouaultusers' pY@Y@@:Y@Y@@Y@@Y@?Y@@Y@@gdalautotest-3.0.4/ogr/data/testquoteheader1.csv0000644003401500001440000000003613614004466021337 0ustar rouaultusers"test","2000","2000.12" 1,2,3 gdalautotest-3.0.4/ogr/data/gjpoint.dbf0000644003401500001440000000025113614004466017461 0ustar rouaultusers_aHFIDN NAMEC< 1 Point 1 gdalautotest-3.0.4/ogr/data/test_point.gml0000755003401500001440000000425313614004470020227 0ustar rouaultusers -1.3501138991774910.1666231936981584 -0.52409271914723420.8245083207261725 -0.924357034795764,0.824508320726173 1.000 1 1 -0.524092719147234,0.499452240596797 2.000 2 2 -0.717738710070079,0.166623193698158 3.000 3 3 -1.159493626862817,0.178726068130836 4.000 4 4 -1.350113899177491,0.53576086389483 5.000 5 5 gdalautotest-3.0.4/ogr/data/apt.dat0000644003401500001440000023171113614004466016617 0ustar rouaultusersI 850 Version - THIS FILE IS A SHORT EXTRACT FROM THE FOLLOWING DATA MADE FOR OGR TESTING. data cycle 2007.12, build 20070153, metadata AptXP850 and data cycle 2007.12, build 20070154, metadata AptXP810. Copyright 2007, Robin A. Peel (robin@xsquawkbox.net). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. This product was developed using DAFIF (the Defense Aeronautical Flight Information File), a product of the US National Imagery and Mapping Agency (NIMA). NIMA requires the following warranty statements: (A) Under 10 U.S.C. 456, no civil action may be brought against the United States on the basis of the content of a navigational aid prepared or disseminated by either the former Defense Mapping Agency (DMA) or the National Imagery and Mapping Agency (NIMA). (B) The DAFIF product is provided "as is," and no warranty, express or implied, including, but not limited to the implied warranties of merchantability and fitness for particular purpose or arising by statute or otherwise in law or from a course of dealing or usage in trade, is made by NIMA as to the accuracy and functioning of the product. : Neither NIMA nor its personnel will be liable for any claims, losses, or damages arising from or connected with the use of this product. The user agrees to hold harmless the United States National Imagery and Mapping Agency. The user's sole and exclusive remedy is to stop using the DAFIF product. 1 3799 0 1 E46 02 Ranch 100 30.48 4 0 0.25 0 0 0 15 29.88083567 -103.70108085 0.00 0.00 1 0 0 0 33 29.86895821 -103.69317249 0.00 0.00 1 0 0 0 100 30.48 4 0 0.25 0 0 0 05 29.87181142 -103.70136737 0.00 0.00 1 0 0 0 23 29.87798246 -103.69288597 0.00 0.00 1 0 0 0 19 29.87195028 -103.70191469 1 WS 19 29.88127895 -103.70082809 1 WS 19 29.87784357 -103.69233863 1 WS 19 29.86851495 -103.69342525 1 WS 1 189 1 0 CYXX Abbotsford 100 60.96 1 1 0.25 0 2 1 07 49.01911500 -122.37996700 0.00 0.00 3 5 0 0 25 49.02073500 -122.34671100 0.00 0.00 3 11 0 1 100 60.96 1 1 0.25 0 2 1 01 49.01877000 -122.37871800 75.90 0.00 3 0 0 1 19 49.03176400 -122.36917600 0.00 0.00 3 10 0 0 100 28.96 3 0 0.00 0 0 0 01L 49.02608640 -122.37408779 0.00 0.00 1 0 0 0 19R 49.02976278 -122.37147182 0.00 0.00 1 0 0 0 102 H1 49.02736300 -122.37448800 296.45 14.94 14.94 1 0 0 0.25 1 21 49.02972100 -122.36993700 2 205.75 3.00 PAPI-4L 21 49.02146859 -122.37743563 2 23.78 3.00 New PAPI-4L 21 49.01990294 -122.37898033 6 166.61 3.00 New WIG-WAG 21 49.01982551 -122.37932802 6 162.26 3.00 New WIG-WAG 21 49.03083622 -122.36774350 6 323.84 3.00 New WIG-WAG 21 49.03051482 -122.36848817 6 328.85 3.00 New WIG-WAG 21 49.02190379 -122.37660897 6 180.00 3.00 New WIG-WAG 21 49.02109069 -122.35772784 6 145.01 3.00 New WIG-WAG 21 49.02076302 -122.35849745 6 144.87 3.00 New WIG-WAG 21 49.03176880 -122.37035694 6 81.47 3.00 New WIG-WAG 21 49.03152902 -122.37029855 6 81.87 3.00 New WIG-WAG 21 49.02600707 -122.37461594 6 117.90 3.00 New WIG-WAG 21 49.02579076 -122.37479732 6 118.61 3.00 New WIG-WAG 21 49.02014700 -122.34978700 2 265.76 3.00 API PAPI-4L 110 1 0.25 25.70 Taxiway 111 49.02216300 -122.37941500 59 111 49.02217800 -122.37960300 111 49.02216700 -122.37999200 111 49.02205100 -122.37988100 112 49.02205100 -122.37988100 49.02197400 -122.37980700 59 112 49.02182200 -122.37966300 49.02174500 -122.37958900 59 112 49.02150900 -122.37969800 49.02137800 -122.37979500 59 112 49.02128900 -122.37986000 49.02115800 -122.37995700 53 112 49.02088600 -122.37989200 49.02074900 -122.37981600 53 102 111 49.02001000 -122.37941000 53 102 112 49.01980700 -122.37929800 49.01967200 -122.37922300 53 102 112 49.01952300 -122.37907700 49.01946800 -122.37900400 53 112 49.01941700 -122.37948300 49.01940100 -122.37982600 111 49.01941700 -122.37948300 111 49.01888500 -122.37910600 111 49.01879700 -122.37824300 112 49.01879700 -122.37824300 49.01888600 -122.37817700 112 49.01897100 -122.37731100 49.01899800 -122.37675600 111 49.01897100 -122.37731100 111 49.01954200 -122.37689200 112 49.01954200 -122.37689200 49.01951500 -122.37744700 112 49.01999600 -122.37736200 49.02032500 -122.37712000 111 49.01999600 -122.37736200 111 49.02001900 -122.37827200 112 49.02001900 -122.37827200 49.01969000 -122.37851400 53 112 49.01962200 -122.37876500 49.01968700 -122.37885200 53 102 112 49.01990100 -122.37899500 49.02002300 -122.37906200 53 102 111 49.02008400 -122.37909600 53 102 112 49.02087400 -122.37953100 49.02101100 -122.37960600 53 102 112 49.02127700 -122.37949800 49.02140800 -122.37940100 53 102 111 49.02162100 -122.37924400 53 102 111 49.02202100 -122.37894900 53 102 111 49.02417100 -122.37735800 53 102 112 49.02598100 -122.37602000 49.02611200 -122.37592300 53 102 112 49.02607700 -122.37557800 49.02601000 -122.37538100 53 102 111 49.02575200 -122.37462800 53 102 112 49.02567400 -122.37439900 49.02562300 -122.37424600 53 112 49.02510300 -122.37453200 49.02477400 -122.37477400 111 49.02510300 -122.37453200 111 49.02545200 -122.37334900 111 49.02628900 -122.37366100 112 49.02628900 -122.37366100 49.02596000 -122.37390300 53 112 49.02587100 -122.37424900 49.02592200 -122.37439900 53 111 49.02594600 -122.37447400 53 112 49.02627400 -122.37543200 49.02634100 -122.37562900 59 112 49.02657200 -122.37558200 49.02670300 -122.37548500 59 111 49.02921600 -122.37362600 53 102 112 49.03102700 -122.37228600 49.03115800 -122.37218900 53 102 112 49.03128000 -122.37181700 49.03131700 -122.37160200 53 102 111 49.03148400 -122.37064000 53 102 112 49.03152400 -122.37041500 49.03155000 -122.37026400 53 102 112 49.03151200 -122.37002200 49.03147800 -122.36991100 53 111 49.03096700 -122.37021800 111 49.03124900 -122.36928500 111 49.03113600 -122.36916700 53 102 112 49.03111300 -122.36911300 49.03109800 -122.36907700 53 102 112 49.03093100 -122.36889500 49.03082500 -122.36878600 53 102 111 49.03077100 -122.36873000 53 102 111 49.02077600 -122.35845700 53 102 111 49.02058530 -122.35825922 111 49.02055528 -122.35821328 111 49.02060028 -122.35730447 111 49.02063234 -122.35729357 53 102 111 49.02095500 -122.35763500 53 102 111 49.02108200 -122.35776500 53 102 111 49.02568582 -122.36249687 111 49.02675225 -122.36359296 53 102 111 49.03107700 -122.36803800 53 112 49.03128300 -122.36824900 49.03142000 -122.36839000 53 102 112 49.03156100 -122.36863100 49.03161000 -122.36874400 53 102 111 49.03163400 -122.36880000 111 49.03165500 -122.36970000 111 49.03165900 -122.36970900 112 49.03172700 -122.36993400 49.03177200 -122.37008400 53 102 112 49.03175000 -122.37042000 49.03171900 -122.37059300 53 102 112 49.03179200 -122.37073900 49.03185100 -122.37077800 102 111 49.03306300 -122.37160100 102 111 49.03329600 -122.37179400 111 49.03325000 -122.37192200 102 112 49.03314800 -122.37183800 49.03309200 -122.37179100 102 112 49.03302400 -122.37190100 49.03299700 -122.37199000 102 112 49.03298100 -122.37203800 49.03295400 -122.37212700 102 112 49.03298100 -122.37226900 49.03300800 -122.37233400 102 112 49.03307600 -122.37239900 49.03311300 -122.37242000 102 111 49.03313200 -122.37242900 111 49.03310000 -122.37256600 102 112 49.03302800 -122.37252700 49.03298000 -122.37250100 102 112 49.03290600 -122.37236300 49.03287300 -122.37228000 102 112 49.03288300 -122.37230600 49.03285000 -122.37222300 102 112 49.03287300 -122.37204800 49.03290000 -122.37195900 102 112 49.03293800 -122.37183700 49.03296500 -122.37174800 102 112 49.03289000 -122.37164500 49.03283100 -122.37160600 102 112 49.03176700 -122.37088200 49.03170800 -122.37084300 53 102 112 49.03162300 -122.37114600 49.03158600 -122.37136100 53 102 112 49.03146600 -122.37205100 49.03142900 -122.37226600 53 102 112 49.03121300 -122.37252000 49.03108200 -122.37261700 59 111 49.02931200 -122.37392600 59 111 49.02637500 -122.37609900 59 112 49.02450200 -122.37748400 49.02437100 -122.37758100 59 112 49.02434200 -122.37774200 49.02436700 -122.37781700 59 111 49.02469473 -122.37881287 59 102 112 49.02518200 -122.38031200 49.02520600 -122.38038700 59 102 112 49.02529300 -122.38037200 49.02534300 -122.38033700 59 102 111 49.02539500 -122.38030000 59 102 111 49.02565900 -122.38011400 59 102 111 49.02592200 -122.37992900 59 102 111 49.02617800 -122.37974900 59 102 112 49.02638300 -122.37960400 49.02643200 -122.37956900 59 112 49.02642600 -122.37943500 49.02640500 -122.37935800 59 111 49.02638900 -122.37929300 59 112 49.02628800 -122.37897000 49.02626400 -122.37889500 59 112 49.02632600 -122.37880200 49.02637500 -122.37876500 59 111 49.02739100 -122.37801600 111 49.02742700 -122.37812900 59 112 49.02643600 -122.37886000 49.02638700 -122.37889700 59 112 49.02639700 -122.37902800 49.02642000 -122.37910300 59 112 49.02641100 -122.37907200 49.02643400 -122.37914700 59 112 49.02652000 -122.37913100 49.02656900 -122.37909500 59 111 49.02752300 -122.37840200 111 49.02755900 -122.37851500 59 112 49.02655400 -122.37924500 49.02650500 -122.37928100 59 112 49.02651000 -122.37941500 49.02653000 -122.37949200 59 112 49.02651700 -122.37944000 49.02653700 -122.37951700 59 112 49.02656300 -122.37959900 49.02657400 -122.37962800 59 112 49.02665300 -122.37958800 49.02670200 -122.37955300 59 111 49.02764500 -122.37888500 111 49.02768000 -122.37899800 59 112 49.02669400 -122.37969700 49.02664500 -122.37973200 59 112 49.02666100 -122.37985900 49.02668800 -122.37993200 59 112 49.02669300 -122.37994600 49.02672000 -122.38001900 59 112 49.02677700 -122.38002400 49.02680600 -122.38000300 59 111 49.02682000 -122.37999200 59 111 49.02692400 -122.37991600 59 111 49.02702400 -122.37984400 59 111 49.02712100 -122.37977400 59 111 49.02722100 -122.37970100 59 111 49.02731900 -122.37963000 59 111 49.02742300 -122.37955400 59 111 49.02751900 -122.37948500 59 111 49.02762000 -122.37941100 59 111 49.02772100 -122.37933900 59 111 49.02778500 -122.37929100 111 49.02782100 -122.37940400 59 112 49.02779900 -122.37942100 49.02778400 -122.37943200 59 112 49.02779300 -122.37948900 49.02780400 -122.37952400 59 111 49.02781000 -122.37954100 111 49.02777300 -122.37956900 112 49.02775600 -122.37951700 49.02774500 -122.37948200 112 49.02770600 -122.37948800 49.02768500 -122.37950300 112 49.02769100 -122.37956500 49.02770200 -122.37960100 111 49.02770700 -122.37961900 111 49.02767000 -122.37964600 112 49.02765400 -122.37959200 49.02764300 -122.37955600 112 49.02760800 -122.37956000 49.02758900 -122.37957400 112 49.02759600 -122.37963900 49.02760700 -122.37967800 111 49.02761300 -122.37969600 111 49.02756300 -122.37973000 112 49.02754600 -122.37967400 49.02753500 -122.37963600 112 49.02750600 -122.37963400 49.02749100 -122.37964500 112 49.02750100 -122.37970900 49.02751300 -122.37974800 111 49.02751800 -122.37976800 111 49.02746900 -122.37980200 112 49.02745100 -122.37974400 49.02743900 -122.37970500 112 49.02740700 -122.37970600 49.02738900 -122.37971900 112 49.02739900 -122.37978500 49.02741200 -122.37982500 111 49.02741800 -122.37984400 111 49.02736800 -122.37988100 112 49.02734900 -122.37982100 49.02733600 -122.37978100 112 49.02730600 -122.37977900 49.02729000 -122.37979000 112 49.02730000 -122.37985400 49.02731200 -122.37989300 111 49.02731900 -122.37991100 111 49.02726900 -122.37994800 112 49.02725000 -122.37989000 49.02723800 -122.37985100 112 49.02720700 -122.37985100 49.02719000 -122.37986300 112 49.02720100 -122.37992600 49.02721400 -122.37996400 111 49.02721900 -122.37998300 111 49.02717000 -122.38002000 112 49.02715100 -122.37996300 49.02713800 -122.37992400 112 49.02710900 -122.37992200 49.02709400 -122.37993300 112 49.02710600 -122.37999400 49.02711900 -122.38003100 111 49.02712500 -122.38004900 111 49.02707700 -122.38008900 112 49.02705700 -122.38003200 49.02704400 -122.37999300 112 49.02701100 -122.37999300 49.02699400 -122.38000600 112 49.02700400 -122.38006800 49.02701700 -122.38010600 111 49.02702200 -122.38012400 111 49.02697300 -122.38016100 112 49.02695500 -122.38010400 49.02694200 -122.38006600 112 49.02690900 -122.38006700 49.02689100 -122.38008000 112 49.02690200 -122.38014300 49.02691500 -122.38018100 111 49.02692100 -122.38019900 111 49.02687300 -122.38023800 112 49.02685300 -122.38018000 49.02683900 -122.38014100 59 112 49.02676600 -122.38017000 49.02672200 -122.38020100 59 112 49.02665900 -122.38010800 49.02663200 -122.38003500 59 111 49.02652600 -122.37975300 59 112 49.02651000 -122.37970800 49.02649900 -122.37967900 59 112 49.02641800 -122.37971700 49.02636800 -122.37975200 59 112 49.02632600 -122.37978200 49.02627600 -122.37981700 59 112 49.02628800 -122.37994700 49.02631300 -122.38002200 59 111 49.02651200 -122.38061200 111 49.02643900 -122.38066900 59 112 49.02621400 -122.37999900 49.02618900 -122.37992500 59 112 49.02610100 -122.37994100 49.02605100 -122.37997600 59 112 49.02607000 -122.37996300 49.02602000 -122.37999800 59 112 49.02603200 -122.38012800 49.02605700 -122.38020300 59 111 49.02624300 -122.38076900 111 49.02617000 -122.38082500 59 112 49.02595700 -122.38018000 49.02593200 -122.38010500 59 112 49.02584500 -122.38012000 49.02579500 -122.38015500 59 112 49.02580700 -122.38014800 49.02575700 -122.38018300 59 112 49.02577000 -122.38031100 49.02579500 -122.38038500 59 111 49.02598500 -122.38095000 111 49.02591200 -122.38100700 59 112 49.02569500 -122.38036400 49.02567000 -122.38029000 59 112 49.02558200 -122.38030600 49.02553200 -122.38034100 59 112 49.02554400 -122.38033300 49.02549400 -122.38036800 59 112 49.02550800 -122.38049600 49.02553400 -122.38056900 59 111 49.02573100 -122.38113100 111 49.02565800 -122.38119000 59 112 49.02543300 -122.38054800 49.02540700 -122.38047500 59 112 49.02531900 -122.38049000 49.02526900 -122.38052500 59 112 49.02525500 -122.38053600 49.02520500 -122.38057100 59 112 49.02514300 -122.38047600 49.02511800 -122.38040100 59 102 111 49.02462025 -122.37886901 59 112 49.02426800 -122.37779700 49.02424300 -122.37772200 59 112 49.02403400 -122.37783100 49.02390300 -122.37792800 59 114 49.02234500 -122.37908000 49.02221400 -122.37917700 59 112 49.02203000 -122.37947500 49.02202200 -122.37937400 112 49.02193500 -122.37938400 49.02188000 -122.37942500 114 49.02194700 -122.37953600 49.02201000 -122.37959700 110 1 0.25 85.76 Closed taxiway 112 49.02351200 -122.36907200 49.02340900 -122.36930200 111 49.01932400 -122.37844400 111 49.01909700 -122.37820900 112 49.02326800 -122.36887600 49.02337100 -122.36864600 112 49.02345000 -122.36842100 49.02346900 -122.36834800 112 49.02335900 -122.36793500 49.02327900 -122.36768400 111 49.02042400 -122.35874300 111 49.02050900 -122.35698900 112 49.02050900 -122.35698900 49.02048200 -122.35754400 112 49.02057200 -122.35819600 49.02064100 -122.35844500 111 49.02067400 -122.35857100 112 49.02361000 -122.36776600 49.02369000 -122.36801700 112 49.02377100 -122.36817000 49.02379800 -122.36818900 112 49.02408600 -122.36822500 49.02426800 -122.36824300 111 49.03124100 -122.36892700 111 49.03122300 -122.36934400 112 49.02402000 -122.36863700 49.02383800 -122.36861900 112 49.02372600 -122.36859600 49.02371100 -122.36858600 114 49.02368500 -122.36865400 49.02367200 -122.36870300 110 1 0.25 85.76 Closed taxiway 111 49.02436900 -122.37941500 111 49.02424600 -122.37950800 111 49.02412000 -122.37912300 113 49.02424300 -122.37903000 110 1 0.25 25.70 Apron 111 49.02079800 -122.37982300 111 49.02637500 -122.37575200 111 49.02610500 -122.37501000 111 49.02897100 -122.37293500 111 49.02920100 -122.37363700 111 49.03143900 -122.37196300 111 49.03142700 -122.37228600 111 49.03111800 -122.37429100 111 49.02991900 -122.37520900 111 49.02759500 -122.37698100 111 49.02735700 -122.37628000 111 49.02678400 -122.37668200 111 49.02709000 -122.37757700 111 49.02635600 -122.37813300 111 49.02620300 -122.37769600 113 49.02123700 -122.38138000 110 1 0.25 85.76 Apron 111 49.01904900 -122.37888200 111 49.01956500 -122.37885700 111 49.01955600 -122.37913100 113 49.01942600 -122.37924100 110 1 0.25 85.76 Apron 111 49.03174700 -122.37029900 111 49.03106800 -122.36985500 111 49.03164500 -122.36903600 113 49.03181100 -122.36938500 110 2 0.25 55.00 Apron 111 49.02568582 -122.36249687 111 49.02655100 -122.36057100 111 49.02764300 -122.36164700 113 49.02675225 -122.36359296 110 1 0.25 85.76 Apron 111 49.03306800 -122.37258900 111 49.03328300 -122.37176600 111 49.03374100 -122.37203600 113 49.03353800 -122.37285500 120 Linear Feature 2 111 49.02086500 -122.35804500 51 116 49.02018861 -122.35794898 49.02016084 -122.35853068 120 Linear Feature 2 111 49.02658451 -122.37550985 21 111 49.02655900 -122.37553173 21 111 49.02654019 -122.37547993 21 111 49.02656607 -122.37545860 21 115 49.02658451 -122.37550985 120 Linear Feature 1 111 49.03175967 -122.37035175 54 115 49.03153892 -122.37029976 120 Centreline for Taxi A 112 49.03095100 -122.36976600 49.03128000 -122.36952400 51 112 49.03153700 -122.36970600 49.03159800 -122.36990900 51 112 49.03158700 -122.36987100 49.03164800 -122.37007300 51 112 49.03163400 -122.37042900 49.03160500 -122.37059800 51 112 49.03153400 -122.37100600 49.03149700 -122.37122200 51 112 49.03137300 -122.37193400 49.03133600 -122.37214900 51 116 49.03112000 -122.37240300 49.03098800 -122.37250000 120 Centreline for Taxi 112 49.01985400 -122.37914700 49.01972500 -122.37907500 51 112 49.01949600 -122.37882000 49.01938600 -122.37867300 51 112 49.01935800 -122.37863500 49.01924800 -122.37848800 51 116 49.01968700 -122.37805200 49.02001600 -122.37781000 120 Centreline for Taxi 112 49.02507700 -122.37408800 49.02540600 -122.37384600 51 112 49.02567100 -122.37402200 49.02573800 -122.37422100 51 112 49.02574900 -122.37425400 49.02581600 -122.37445200 51 112 49.02595000 -122.37484700 49.02601800 -122.37504500 51 112 49.02622600 -122.37565300 49.02629300 -122.37585000 51 112 49.02613000 -122.37609500 49.02599800 -122.37619200 51 112 49.02441600 -122.37736200 49.02428500 -122.37745900 51 112 49.02402200 -122.37765400 49.02389000 -122.37775100 51 112 49.02226600 -122.37895300 49.02213500 -122.37905000 51 112 49.02187200 -122.37924500 49.02174000 -122.37934200 51 112 49.02186600 -122.37924800 49.02173500 -122.37934500 51 112 49.02147200 -122.37954000 49.02134000 -122.37963700 51 112 49.02128300 -122.37967900 49.02115200 -122.37977600 51 116 49.02088000 -122.37971200 49.02074200 -122.37963600 120 Centreline for Taxi 112 49.03110600 -122.36857200 49.03122800 -122.36869700 51 112 49.03141300 -122.36904700 49.03149600 -122.36923900 51 116 49.03122882 -122.36956923 49.03099458 -122.36974007 120 Centreline for Taxi 112 49.02461500 -122.37871300 49.02464000 -122.37878800 51 112 49.02468900 -122.37893700 49.02471300 -122.37901200 51 112 49.02516200 -122.38039400 49.02518700 -122.38046900 51 112 49.02527400 -122.38045400 49.02532300 -122.38041900 51 112 49.02533700 -122.38040900 49.02538700 -122.38037400 51 112 49.02548700 -122.38030400 49.02553600 -122.38026900 51 112 49.02560100 -122.38022400 49.02565100 -122.38018900 51 112 49.02575100 -122.38011900 49.02580000 -122.38008400 51 112 49.02586400 -122.38003800 49.02591400 -122.38000300 51 112 49.02601400 -122.37993400 49.02606300 -122.37989900 51 112 49.02612000 -122.37985800 49.02617000 -122.37982300 51 112 49.02627000 -122.37975300 49.02631900 -122.37971800 51 112 49.02643500 -122.37963600 49.02648500 -122.37960100 51 116 49.02653600 -122.37965200 49.02655300 -122.37969900 120 Centreline for Taxi A 112 49.02461500 -122.37871300 49.02459100 -122.37863800 51 112 49.02425600 -122.37762000 49.02423100 -122.37754500 51 116 49.02441600 -122.37736200 49.02454800 -122.37726500 120 Centreline for Taxi 112 49.02147200 -122.37954000 49.02160300 -122.37944300 51 112 49.02178500 -122.37950500 49.02186300 -122.37957900 51 112 49.02201100 -122.37972000 49.02208800 -122.37979400 112 49.02211100 -122.37962400 49.02210000 -122.37948500 51 112 49.02208500 -122.37930600 49.02207400 -122.37916800 116 49.02187200 -122.37924500 49.02174000 -122.37934200 120 Centreline for Taxi 112 49.02613000 -122.37609500 49.02626100 -122.37599800 51 112 49.02652400 -122.37580300 49.02665600 -122.37570600 51 112 49.02906700 -122.37392200 49.02919800 -122.37382500 51 112 49.02946100 -122.37363000 49.02959300 -122.37353300 51 116 49.03112000 -122.37240300 49.03125100 -122.37230600 120 Centreline for Taxi D 111 49.02059815 -122.35799549 59 112 49.02098264 -122.35840377 49.02102464 -122.35844777 59 112 49.02150064 -122.35893677 49.02180364 -122.35924777 59 112 49.03058764 -122.36827577 49.03089064 -122.36858677 59 116 49.03122364 -122.36893077 49.03134564 -122.36905577 120 Centreline for Taxi D 111 49.02062041 -122.35753839 59 112 49.02098420 -122.35792466 49.02102620 -122.35796866 59 112 49.02150220 -122.35845766 49.02180520 -122.35876866 59 112 49.03058920 -122.36779666 49.03089220 -122.36810766 59 116 49.03122520 -122.36845166 49.03134720 -122.36857666 120 Centreline for Taxi D 112 49.02023599 -122.35696705 49.02021538 -122.35739058 51 112 49.02086500 -122.35804500 49.02090700 -122.35808900 51 112 49.02138300 -122.35857800 49.02168600 -122.35888900 51 112 49.03047000 -122.36791700 49.03077300 -122.36822800 51 116 49.03110600 -122.36857200 49.03122800 -122.36869700 120 Centreline for Taxi C 112 49.01985400 -122.37914700 49.01998300 -122.37921800 51 112 49.02025300 -122.37936600 49.02039100 -122.37944200 51 116 49.02088000 -122.37971200 49.02101700 -122.37978700 120 Centreline for Taxi 112 49.01923400 -122.37758200 49.01920700 -122.37813700 51 116 49.01935800 -122.37863500 49.01946800 -122.37878200 120 Centreline for Taxi 112 49.02606500 -122.37336200 49.02573600 -122.37360400 51 116 49.02567100 -122.37402200 49.02573800 -122.37422100 120 Centreline for Taxi 112 49.02652400 -122.37580300 49.02639300 -122.37590000 51 116 49.02622600 -122.37565300 49.02615800 -122.37545500 120 Centreline for Taxi join 112 49.03163400 -122.37042900 49.03160500 -122.37059800 51 116 49.03167800 -122.37074200 49.03173600 -122.37078200 120 Centreline for Taxi join 112 49.03153400 -122.37100600 49.03157100 -122.37079100 51 116 49.03167800 -122.37074200 49.03173600 -122.37078200 120 Centreline for Taxi 112 49.02647900 -122.37946700 49.02650000 -122.37954400 51 116 49.02643500 -122.37963600 49.02638600 -122.37967100 120 Centreline for Taxi 112 49.02627000 -122.37975300 49.02622000 -122.37978800 51 116 49.02623200 -122.37991700 49.02625700 -122.37999200 120 Centreline for Taxi 112 49.02623200 -122.37991700 49.02620700 -122.37984300 51 116 49.02612000 -122.37985800 49.02607100 -122.37989300 120 Centreline for Taxi 112 49.02601400 -122.37993400 49.02596400 -122.37996900 51 116 49.02597600 -122.38009800 49.02600100 -122.38017300 120 Centreline for Taxi 112 49.02597600 -122.38009800 49.02595100 -122.38002300 51 116 49.02586400 -122.38003800 49.02581500 -122.38007300 120 Centreline for Taxi 112 49.02575100 -122.38011900 49.02570100 -122.38015400 51 116 49.02571400 -122.38028200 49.02573900 -122.38035700 120 Centreline for Taxi 112 49.02571400 -122.38028200 49.02568900 -122.38020800 51 116 49.02560100 -122.38022400 49.02555200 -122.38025900 120 Centreline for Taxi 112 49.02548700 -122.38030400 49.02543700 -122.38033900 51 116 49.02545100 -122.38046700 49.02547700 -122.38054100 120 Centreline for Taxi 112 49.02533700 -122.38040900 49.02538700 -122.38037400 51 116 49.02545100 -122.38046700 49.02547700 -122.38054100 120 Centreline for Taxi join 112 49.02425600 -122.37762000 49.02423100 -122.37754500 51 116 49.02402200 -122.37765400 49.02389000 -122.37775100 120 Centreline for Taxi join 112 49.02201100 -122.37972000 49.02208800 -122.37979400 51 116 49.02232900 -122.37968100 49.02246300 -122.37958000 120 Centreline for Taxi join 112 49.02211100 -122.37962400 49.02212200 -122.37976200 51 116 49.02232900 -122.37968100 49.02246300 -122.37958000 120 Centreline for Taxi 112 49.02178500 -122.37950500 49.02170800 -122.37943100 116 49.02186600 -122.37924800 49.02199800 -122.37915100 120 Centreline for Taxi 112 49.02226600 -122.37895300 49.02213500 -122.37905000 51 116 49.02208500 -122.37930600 49.02209600 -122.37944500 120 Taxi hold short 111 49.01990100 -122.37899500 54 115 49.01982754 -122.37930720 120 Taxi D hold short 111 49.02108200 -122.35776500 54 115 49.02077600 -122.35845700 120 Taxi hold short 111 49.02580691 -122.37478283 54 115 49.02599819 -122.37462733 120 Taxi D hold short 111 49.03082529 -122.36778666 54 115 49.03052329 -122.36846866 120 Taxi C hold short 111 49.02001100 -122.37940400 55 103 115 49.02008300 -122.37910200 120 Apron edge 111 49.02123200 -122.38138500 102 115 49.02080100 -122.37988200 120 Apron edge 111 49.02615600 -122.37494700 102 111 49.02896900 -122.37294100 102 115 49.02920200 -122.37363300 120 Apron edge 111 49.03137300 -122.37257500 102 115 49.03111900 -122.37428800 120 Apron edge 111 49.02612900 -122.37496600 102 115 49.02589400 -122.37427500 120 Apron edge 111 49.02701579 -122.36301759 102 115 49.02675225 -122.36359296 120 Apron edge 111 49.02568582 -122.36249687 102 115 49.02592793 -122.36195577 14 49.02711300 -122.37642100 90 0 Abbotsford Tower 15 49.02598800 -122.36219400 329.30 Cascade Ramp 15 49.02477900 -122.37848100 205.14 Fuels Ramp 15 49.02767800 -122.37960200 114.63 GA Ramp 1 15 49.02675600 -122.37497500 293.93 GA Ramp 2 15 49.02252000 -122.37953800 27.00 Gate 3 15 49.03322500 -122.37223200 61.39 North GA Ramp 15 49.02706500 -122.37476000 294.74 North West GA Ramp 18 49.02694305 -122.37480663 1 BCN 19 49.01863267 -122.38021143 1 WS 19 49.02601493 -122.37479412 1 WS 19 49.01989486 -122.38089443 1 WS 19 49.03190120 -122.36768214 1 WS 19 49.02983423 -122.37076544 1 WS 19 49.01995487 -122.34578406 1 WS 19 49.02763146 -122.37462541 1 WS 20 49.01978385 -122.37631132 269.35 0 3 {@L}25{@R,^rd}01-19{^lu,@Y}C{^r} 20 49.03143256 -122.37079078 72.18 0 3 {@L}A{@R,^rd}19-01{^lu,@Y}D{^r}{@L}{@@}A{@Y}RAMP-I{^u} 20 49.02595547 -122.37530917 116.25 0 3 {@L}B{@R,^l}1-19{^r}{@L}{@@}B{@Y,^l}C|RAMP-I{^r}|A{^r} 20 49.01987997 -122.37890658 158.57 0 3 {@L}C{@R,^l}07-25{^r,@R}|{^ld}19-1{^ru}{@L}{@@}{@L}C{@Y}PAX_RAMP{^u} 20 49.02107815 -122.35763602 145.62 0 4 {@L}D{@R,^lu}25-7{^rd,}{@L}{@@}D{@Y}RAMP-II{^u} 20 49.03051519 -122.36857908 328.21 0 3 {@L}D{@R,^ru}01-19{^ld,@Y,^l}A{@L}{@@}D{@Y}RAMP-II{^u} 20 49.03058545 -122.37076619 22.61 0 3 {@Y,^l}A 20 49.02541702 -122.37454474 22.99 0 3 {@Y,^l}B 20 49.02656202 -122.37549295 205.38 0 3 {@Y,^l}B|C{^u} 20 49.02054903 -122.35935353 86.77 0 3 {@Y,^l}D 20 49.02435392 -122.37712945 26.89 0 4 {@Y,^l}FUEL{@@}FUEL{^r} 20 49.02574098 -122.37614730 25.06 0 3 {@Y,^u}A|B{^r} 20 49.02264834 -122.37834211 26.89 0 4 {@Y,^u}FUEL{@@}PAX{^r} 20 49.02600151 -122.37411730 203.47 0 3 {@Y}B{^r} 20 49.02051080 -122.37816292 207.69 0 3 {@Y}C{^rd} 20 49.02068202 -122.35660532 264.97 0 3 {@Y}D{^r} 20 49.03020388 -122.36959233 24.50 0 3 {@Y}D{^r} 50 11940 ABBOTSFORD FSS 50 11980 CYXX ATIS 50 12250 ABBOTSFORD FSS 50 12670 ABBOTSFORD FSS 53 12180 ABBOTSFORD GND 54 11940 ABBOTSFORD TWR 54 12100 ABBOTSFORD TWR 55 13269 VICTORIA APP 1 189 1 0 ZZZY Abbotsford_V810 10 49.019925 -122.363339 07x 85.75 7972 0000.0000 0000.0000 200 122136 1 1 3 0.25 1 0300.0300 10 49.025267 -122.373947 01x 25.71 5257 0249.0000 0000.0000 200 131123 1 1 3 0.25 1 0300.0300 10 49.027363 -122.374488 H1x 296.45 49 0000.0000 0000.0000 49 121121 1 0 0 0.25 0 0300.0300 10 49.027925 -122.372780 01L 25.01 1478 0000.0000 0000.0000 95 111111 3 0 1 0.00 0 0300.0300 1 204 1 0 VTX2 Ban Bung 100 39.93 3 0 0.25 0 0 0 04 13.30156637 101.12747763 0.00 0.00 0 0 0 0 22 13.29829572 101.12460651 0.00 0.00 0 0 0 0 110 4 0.00 0.00 motor cross 111 13.29875514 101.12449864 111 13.30020916 101.12470002 112 13.30017393 101.12548142 13.30017393 101.12561068 112 13.30026985 101.12589799 13.30025407 101.12608935 111 13.30026985 101.12589799 112 13.30026985 101.12589799 13.30031656 101.12608321 112 13.30080903 101.12635441 13.30093250 101.12639792 111 13.30080903 101.12635441 112 13.30080903 101.12635441 13.30102129 101.12642998 112 13.30117092 101.12604879 13.30115943 101.12591441 112 13.30095082 101.12563932 13.30086997 101.12554359 112 13.30099780 101.12540722 13.30107170 101.12534924 112 13.30150732 101.12553335 13.30156990 101.12555607 112 13.30162786 101.12569884 13.30164846 101.12580125 112 13.30150005 101.12599284 13.30147126 101.12602399 112 13.30130414 101.12654454 13.30133703 101.12677235 112 13.30159686 101.12682167 13.30171079 101.12683313 112 13.30187330 101.12660727 13.30192028 101.12651383 112 13.30206528 101.12619508 13.30211859 101.12612537 112 13.30243475 101.12572956 13.30248664 101.12563475 112 13.30242140 101.12530868 13.30235016 101.12521524 112 13.30204910 101.12509825 13.30195121 101.12507755 112 13.30080611 101.12488074 13.30072578 101.12486205 112 13.30038663 101.12481438 13.30033056 101.12480503 112 13.30036312 101.12471296 13.30038130 101.12468804 112 13.30041119 101.12459161 13.30040967 101.12455396 111 13.30031006 101.12455653 111 13.29928181 101.12439278 113 13.29892852 101.12436467 112 13.30056755 101.12516741 13.30052663 101.12520322 112 13.30036919 101.12537105 13.30031374 101.12544268 112 13.30024501 101.12557248 13.30023137 101.12551330 112 13.30024197 101.12523042 13.30024804 101.12517748 112 13.30032185 101.12496643 13.30038702 101.12498044 114 13.30069458 101.12502725 13.30075671 101.12503504 112 13.30094765 101.12508543 13.30107041 101.12509945 112 13.30129876 101.12513637 13.30139576 101.12514883 112 13.30216794 101.12532645 13.30225325 101.12536447 112 13.30230564 101.12551791 13.30229806 101.12559889 112 13.30222731 101.12580436 13.30218291 101.12588231 112 13.30193699 101.12618525 13.30189643 101.12628015 112 13.30179195 101.12653875 13.30175816 101.12663027 112 13.30156319 101.12670071 13.30147850 101.12667185 112 13.30141896 101.12651649 13.30140933 101.12643193 112 13.30153672 101.12617914 13.30158371 101.12611062 112 13.30171341 101.12585238 13.30173837 101.12577891 112 13.30170565 101.12556575 13.30165403 101.12548239 112 13.30153762 101.12541835 13.30148609 101.12541524 112 13.30094686 101.12529617 13.30077882 101.12535242 112 13.30081101 101.12562026 13.30086735 101.12571178 112 13.30105554 101.12601948 13.30108460 101.12613078 112 13.30087394 101.12624217 13.30076777 101.12622366 112 13.30048446 101.12601127 13.30044461 101.12596721 112 13.30047991 101.12574580 13.30052413 101.12568589 112 13.30064546 101.12560537 13.30066819 101.12556332 112 13.30066480 101.12545358 13.30064813 101.12539440 114 13.30067729 101.12522283 13.30072864 101.12518344 112 13.30054293 101.12554990 13.30050427 101.12557294 111 13.30054293 101.12554990 112 13.30054293 101.12554990 13.30046560 101.12559599 112 13.30035702 101.12577150 13.30034001 101.12577945 112 13.30038218 101.12553515 13.30043321 101.12545887 114 13.30054334 101.12535744 13.30055378 101.12537353 110 3 0.50 220.50 field 2 111 13.30050936 101.12677726 111 13.30036295 101.12700595 112 13.30078157 101.12737856 13.30085280 101.12744086 112 13.30144530 101.12760451 13.30151805 101.12760763 111 13.30144530 101.12760451 114 13.30144530 101.12760451 13.30137104 101.12753911 110 3 0.50 220.50 field 1 111 13.29849787 101.12444148 111 13.29841621 101.12448112 111 13.30020181 101.12605067 113 13.30020916 101.12470002 130 Airport Boundary 112 13.29761293 101.12485945 13.29752853 101.12491233 112 13.29846455 101.12558401 13.29849979 101.12560846 112 13.29852057 101.12575158 13.29852057 101.12579177 112 13.29857614 101.12667633 13.29857408 101.12672498 112 13.29867371 101.12676954 13.29871488 101.12678646 112 13.29955591 101.12717059 13.29963001 101.12720020 112 13.30040251 101.12729685 13.30046220 101.12731166 112 13.30144530 101.12760451 13.30150912 101.12760663 112 13.30170223 101.12750619 13.30172899 101.12745119 112 13.30182010 101.12714862 13.30183039 101.12709574 112 13.30205173 101.12627165 13.30207643 101.12623358 111 13.30256674 101.12567051 111 13.30258440 101.12494807 112 13.30063334 101.12463521 13.30060040 101.12462675 111 13.30047389 101.12456068 111 13.29994796 101.12356854 114 13.29906228 101.12396256 13.29876998 101.12413177 14 13.29906879 101.12427511 6 0 Viewpoint 15 13.29959176 101.12497517 110.00 Field Start 19 13.30015019 101.12584568 0 Windsock 51 12277 UNICOM 1 392 1 0 LFPG Paris Charles De Gaulle 100 45.11 1 0 0.25 1 3 1 08L 48.99568600 002.55274400 0.00 0.00 3 5 1 0 26R 48.99875300 002.61018300 600.15 0.00 3 5 1 1 100 45.11 1 0 0.25 1 3 1 09R 49.02061700 002.51305800 0.00 0.00 3 5 1 0 27L 49.02369200 002.57029400 600.15 0.00 3 5 1 0 100 60.05 2 0 0.25 1 3 1 08R 48.99291400 002.56566100 0.00 0.00 3 5 1 0 26L 48.99487800 002.60243300 0.00 0.00 3 5 1 0 100 60.05 1 0 0.25 1 3 1 09L 49.02471900 002.52489200 0.00 0.00 3 10 1 1 27R 49.02669400 002.56168900 0.00 0.00 3 10 1 1 21 48.99632689 002.55719132 2 85.33 3.00 08L PAPI-4L 21 48.99360767 002.56984147 2 85.33 3.00 08R PAPI-4L 21 49.02540666 002.52893996 2 85.31 3.00 09L PAPI-4L 21 49.02125991 002.51751543 2 85.30 3.00 09R PAPI-4L 21 48.99418347 002.59821081 2 265.36 3.00 26L PAPI-4L 21 48.99768731 002.59769996 2 265.37 3.00 26R PAPI-4L 21 49.02258989 002.55720716 2 265.34 3.00 27L PAPI-4L 21 49.02597217 002.55697792 2 265.33 3.00 27R PAPI-4L 10 49.02388200 002.52450600 xxx 42.00 689 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02391800 002.52697100 xxx 9.00 538 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02408000 002.53143400 xxx 48.00 1017 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02474400 002.53206400 xxx 72.00 190 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.02458300 002.52743600 xxx 54.00 210 0.0 0.0 131 101101 2 0 0 0.25 0 10 49.02309100 002.52669700 xxx 87.00 1614 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02224700 002.52656000 xxx 357.00 558 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02239100 002.52968100 xxx 357.00 558 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02222900 002.52300000 xxx 21.00 787 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02319900 002.52677900 xxx 54.00 190 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.02316300 002.52401300 xxx 72.00 190 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.02129500 002.52258900 xxx 42.00 217 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.02469000 002.53915600 xxx 60.00 1017 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.02479800 002.54600200 xxx 106.70 1844 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02346700 002.53662900 xxx 42.00 577 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.02242700 002.53559600 xxx 20.10 394 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.02395400 002.53844400 xxx 33.00 577 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.02316300 002.53691100 xxx 75.00 512 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.02120500 002.53921100 xxx 66.00 1555 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02440300 002.55561400 xxx 85.70 2940 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02524700 002.55408000 xxx 313.60 846 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02546300 002.55879000 xxx 334.60 669 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02492400 002.56158300 xxx 355.60 1122 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.02469000 002.56133700 xxx 39.00 190 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.02384600 002.55922800 xxx 357.90 466 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02366600 002.55569600 xxx 357.00 486 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02458300 002.55911900 xxx 39.00 315 0.0 0.0 276 101101 2 0 0 0.25 0 10 49.02337900 002.54983600 xxx 357.00 486 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02172600 002.55588800 xxx 357.00 807 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02187000 002.55944800 xxx 357.00 807 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02138500 002.55008200 xxx 357.00 807 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02620000 002.55827000 xxx 39.00 249 0.0 0.0 262 101101 2 0 0 0.25 0 10 49.02039700 002.55208100 xxx 85.70 5157 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02133100 002.56256900 xxx 357.00 1280 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02302000 002.56213100 xxx 39.00 203 0.0 0.0 217 101101 2 0 0 0.25 0 10 49.02285800 002.55903700 xxx 39.00 203 0.0 0.0 217 101101 2 0 0 0.25 0 10 49.02267800 002.55550400 xxx 39.00 203 0.0 0.0 217 101101 2 0 0 0.25 0 10 49.02152800 002.55145200 xxx 106.70 2133 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02075600 002.55599700 xxx 39.00 164 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.02319900 002.56519800 xxx 39.00 203 0.0 0.0 217 101101 2 0 0 0.25 0 10 49.02337900 002.56892200 xxx 39.00 203 0.0 0.0 217 101101 2 0 0 0.25 0 10 49.02127700 002.56569100 xxx 357.00 1490 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.02142100 002.56947000 xxx 357.00 1490 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.01798900 002.53800600 xxx 85.70 19098 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02027100 002.57045600 xxx 85.70 3687 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01957000 002.56273400 xxx 33.00 335 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.01975000 002.55785900 xxx 39.00 249 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01987600 002.56024200 xxx 39.00 249 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01992900 002.56021400 xxx 357.00 591 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01978600 002.55785900 xxx 357.00 650 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02107900 002.54364700 xxx 106.70 2153 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02070200 002.53715700 xxx 106.70 2178 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02057600 002.53132500 xxx 244.70 1995 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01996500 002.52990100 xxx 357.00 1063 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02028900 002.53529500 xxx 359.10 1076 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.01852800 002.53157100 xxx 85.70 4514 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01975000 002.52677900 xxx 357.00 1024 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01958800 002.52283600 xxx 357.00 1024 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02023500 002.52382100 xxx 63.00 1555 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01987600 002.52086400 xxx 357.00 748 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01872600 002.51809800 xxx 85.70 2343 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01917500 002.52727200 xxx 42.00 289 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.02005500 002.53587000 xxx 42.00 335 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01845600 002.52135700 xxx 126.00 512 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01775500 002.52122000 xxx 39.00 249 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01780900 002.51897400 xxx 39.00 249 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01788100 002.51897400 xxx 357.00 584 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01780900 002.52122000 xxx 357.00 584 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01649800 002.52009700 xxx 86.90 656 0.0 0.0 335 101101 2 0 0 0.25 0 10 49.01554600 002.51689300 xxx 86.90 656 0.0 0.0 335 101101 2 0 0 0.25 0 10 49.01984000 002.51437400 xxx 57.00 1142 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01763000 002.52866800 xxx 36.00 722 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01793500 002.52883300 xxx 120.00 571 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01782700 002.52688800 xxx 357.00 328 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01743200 002.52672400 xxx 138.00 768 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01766600 002.52308200 xxx 357.00 328 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01678500 002.52675100 xxx 27.00 328 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01642600 002.52647800 xxx 87.00 164 0.0 0.0 170 101101 2 0 0 0.25 0 10 49.01666000 002.53055800 xxx 87.00 1831 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01495300 002.51437400 xxx 85.30 5400 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.01664200 002.51264900 xxx 39.00 321 0.0 0.0 341 101101 2 0 0 0.25 0 10 49.01639000 002.51270400 xxx 355.80 1201 0.0 0.0 164 161161 2 0 0 0.25 0 10 49.01694700 002.52582000 xxx 132.30 387 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01565300 002.51404500 xxx 85.80 492 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.01529400 002.50955400 xxx 85.80 1135 0.0 0.0 380 101101 2 0 0 0.25 0 10 49.01878000 002.51229300 xxx 357.00 584 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.02001900 002.51292300 xxx 44.20 518 0.0 0.0 78 161161 2 0 0 0.25 0 10 49.01874400 002.51300500 xxx 126.00 328 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01822300 002.51308700 xxx 225.00 328 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01586900 002.52598500 xxx 44.20 387 0.0 0.0 78 161161 2 0 0 0.25 0 10 49.01412600 002.51347000 xxx 357.00 610 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.01502500 002.51243000 xxx 42.00 177 0.0 0.0 105 101101 2 0 0 0.25 0 10 49.01502500 002.51319700 xxx 135.00 177 0.0 0.0 105 101101 2 0 0 0.25 0 10 49.01333600 002.51190900 xxx 87.00 787 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.01335400 002.51174500 xxx 39.00 249 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01335400 002.51522300 xxx 175.70 715 0.0 0.0 355 101101 2 0 0 0.25 0 10 49.01353300 002.51837200 xxx 175.70 715 0.0 0.0 355 101101 2 0 0 0.25 0 10 49.01479100 002.51872800 xxx 357.00 269 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01459300 002.51456600 xxx 357.00 269 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01277900 002.50908900 xxx 175.70 912 0.0 0.0 755 101101 2 0 0 0.25 0 10 49.01428800 002.50908900 xxx 357.00 269 0.0 0.0 124 161161 2 0 0 0.25 0 10 49.01004800 002.50985600 xxx 175.70 1181 0.0 0.0 657 101101 2 0 0 0.25 0 10 49.01680300 002.53556900 xxx 354.30 1378 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.01285100 002.55517600 xxx 86.90 1253 0.0 0.0 788 101101 2 0 0 0.25 0 10 49.01184500 002.54644000 xxx 86.80 978 0.0 0.0 486 101101 2 0 0 0.25 0 10 49.01200600 002.54194900 xxx 90.00 308 0.0 0.0 190 101101 2 0 0 0.25 0 10 49.00663400 002.55232800 xxx 342.80 4325 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00668800 002.55377900 xxx 342.80 4466 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.01664200 002.55115000 xxx 357.10 1457 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01369500 002.55161600 xxx 348.00 807 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01583300 002.54857600 xxx 355.30 1949 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01277900 002.54923300 xxx 332.10 407 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01793500 002.54761800 xxx 313.10 492 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01761200 002.54972600 xxx 267.60 630 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01698300 002.54972600 xxx 270.60 630 0.0 0.0 137 161161 2 0 0 0.25 0 10 49.01594100 002.54983600 xxx 270.60 630 0.0 0.0 137 161161 2 0 0 0.25 0 10 49.01502500 002.55002800 xxx 270.60 630 0.0 0.0 137 161161 2 0 0 0.25 0 10 49.01398300 002.55013700 xxx 270.60 630 0.0 0.0 137 161161 2 0 0 0.25 0 10 49.01342600 002.55032900 xxx 267.60 630 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01590500 002.54991800 xxx 355.70 1542 0.0 0.0 334 101101 2 0 0 0.25 0 10 49.01331800 002.55038400 xxx 348.30 630 0.0 0.0 334 101101 2 0 0 0.25 0 10 49.01224000 002.55235500 xxx 355.50 406 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01247300 002.55150600 xxx 39.00 275 0.0 0.0 164 161161 2 0 0 0.25 0 10 49.01231200 002.55027400 xxx 93.00 328 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.01233000 002.54890500 xxx 93.00 328 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.01820500 002.54956200 xxx 168.00 197 0.0 0.0 138 161161 2 0 0 0.25 0 10 49.01274300 002.54849400 xxx 228.00 328 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.01202400 002.54271600 xxx 91.30 138 0.0 0.0 79 101101 2 0 0 0.25 0 10 49.01944400 002.55046600 xxx 348.00 669 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01933700 002.54813800 xxx 357.00 669 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01879800 002.55035600 xxx 30.00 197 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.02001900 002.54846700 xxx 51.00 236 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.02009100 002.54978100 xxx 117.00 236 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01870800 002.54854900 xxx 120.00 197 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.02010900 002.55060300 xxx 228.00 197 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.02073800 002.55391600 xxx 15.00 190 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.01842000 002.55145200 xxx 228.00 197 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.01838400 002.55060300 xxx 306.00 197 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.01148500 002.54038900 xxx 357.10 406 0.0 0.0 492 101101 2 0 0 0.25 0 10 49.01639000 002.53493900 xxx 313.10 440 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.01188100 002.53677400 xxx 42.10 328 0.0 0.0 439 101101 2 0 0 0.25 0 10 49.01134200 002.53855400 xxx 0.10 328 0.0 0.0 439 101101 2 0 0 0.25 0 10 49.01128800 002.53743100 xxx 122.20 249 0.0 0.0 190 101101 2 0 0 0.25 0 10 49.01436000 002.53595200 xxx 352.10 440 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.01317400 002.53636300 xxx 343.10 512 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.01642600 002.54011500 xxx 333.90 721 0.0 0.0 210 101101 2 0 0 0.25 0 10 49.01646200 002.54249700 xxx 12.40 689 0.0 0.0 236 101101 2 0 0 0.25 0 10 49.01563500 002.54433200 xxx 56.40 702 0.0 0.0 210 101101 2 0 0 0.25 0 10 49.01421600 002.54493400 xxx 95.40 702 0.0 0.0 190 101101 2 0 0 0.25 0 10 49.01534800 002.53849900 xxx 114.20 728 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.01387500 002.53836200 xxx 258.20 728 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.01265300 002.53962200 xxx 34.80 662 0.0 0.0 223 101101 2 0 0 0.25 0 10 49.01292300 002.54403100 xxx 137.40 597 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.01962400 002.54255200 xxx 129.00 236 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01942600 002.54115500 xxx 213.00 367 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01856400 002.54277100 xxx 213.00 243 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01854600 002.54101800 xxx 159.00 288 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01913900 002.54296300 xxx 174.00 243 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.01721600 002.54112800 xxx 89.40 623 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01666000 002.54411300 xxx 123.90 590 0.0 0.0 170 101101 2 0 0 0.25 0 10 49.01509600 002.54578300 xxx 164.40 590 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01324600 002.54553700 xxx 206.40 590 0.0 0.0 177 101101 2 0 0 0.25 0 10 49.01470100 002.53721200 xxx 182.40 590 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01642600 002.53841700 xxx 224.40 590 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01286900 002.53795100 xxx 323.40 590 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.01549200 002.54282600 xxx 123.00 197 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01471900 002.54359200 xxx 165.00 184 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01572500 002.54140200 xxx 267.00 184 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01540200 002.54011500 xxx 228.00 184 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01452200 002.53954000 xxx 354.00 184 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01362300 002.53981300 xxx 333.00 184 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01380300 002.54356500 xxx 12.00 210 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01252700 002.54038900 xxx 90.00 249 0.0 0.0 138 101101 2 0 0 0.25 0 10 49.01270700 002.54353800 xxx 90.00 288 0.0 0.0 138 101101 2 0 0 0.25 0 10 49.01164700 002.54372900 xxx 357.10 406 0.0 0.0 420 101101 2 0 0 0.25 0 10 49.01216800 002.54055300 xxx 24.00 210 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01234800 002.54340100 xxx 318.00 236 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01294100 002.54066200 xxx 351.00 203 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01308400 002.54312700 xxx 360.00 210 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01536600 002.54693300 xxx 342.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01439600 002.54715200 xxx 0.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01346200 002.54696100 xxx 15.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01621000 002.54635800 xxx 330.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01272500 002.54652200 xxx 27.10 275 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01694700 002.54548200 xxx 315.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01752200 002.54433200 xxx 300.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01793500 002.54307200 xxx 291.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01775500 002.53910100 xxx 240.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01719900 002.53797900 xxx 228.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01651600 002.53707500 xxx 213.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01563500 002.53628100 xxx 207.10 380 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01394700 002.53650000 xxx 318.10 348 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01313800 002.53671900 xxx 186.10 374 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01732400 002.53899200 xxx 267.10 387 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01746800 002.54340100 xxx 255.10 387 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01595900 002.53710200 xxx 0.10 387 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01648000 002.54545400 xxx 0.10 341 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01669500 002.53789700 xxx 177.10 328 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01678500 002.53803400 xxx 90.10 328 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01610300 002.54594700 xxx 108.10 302 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01524000 002.54646800 xxx 78.10 275 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01436000 002.54676900 xxx 36.10 295 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01389300 002.54663200 xxx 141.10 302 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01303000 002.54616600 xxx 120.10 282 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01707300 002.54444100 xxx 36.10 229 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01772000 002.54238800 xxx 318.10 393 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01763000 002.53986800 xxx 210.10 308 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01772000 002.54110000 xxx 174.10 302 0.0 0.0 92 101101 2 0 0 0.25 0 10 49.01545600 002.53650000 xxx 48.10 380 0.0 0.0 66 101101 2 0 0 0.25 0 10 49.01475500 002.53647300 xxx 87.10 275 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01256300 002.53737600 xxx 87.10 315 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.01249100 002.53740400 xxx 36.10 295 0.0 0.0 86 101101 2 0 0 0.25 0 10 49.00710100 002.55287500 xxx 48.00 341 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00690400 002.55243700 xxx 27.00 157 0.0 0.0 151 101101 2 0 0 0.25 0 10 49.00738900 002.55342300 xxx 6.00 157 0.0 0.0 151 101101 2 0 0 0.25 0 10 49.00826900 002.56719700 xxx 84.40 6651 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00929300 002.58527000 xxx 87.00 2127 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00834100 002.58568100 xxx 87.00 1727 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00844900 002.58946000 xxx 44.00 236 0.0 0.0 223 101101 2 0 0 0.25 0 10 49.00564600 002.58981600 xxx 356.40 2831 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00235800 002.58724200 xxx 356.40 2127 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00029200 002.58740600 xxx 44.00 210 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.00040000 002.59028200 xxx 44.00 210 0.0 0.0 197 101101 2 0 0 0.25 0 10 48.99959200 002.59036400 xxx 44.00 210 0.0 0.0 197 101101 2 0 0 0.25 0 10 48.99986100 002.59660700 xxx 44.00 210 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.00656200 002.58688600 xxx 87.00 1010 0.0 0.0 1030 101101 2 0 0 0.25 0 10 49.01342600 002.58203900 xxx 356.40 3716 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.01340800 002.58056000 xxx 356.40 3034 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.00916800 002.58625600 xxx 44.00 144 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.00850300 002.58628400 xxx 44.00 184 0.0 0.0 171 101101 2 0 0 0.25 0 10 49.00846700 002.58992600 xxx 356.40 295 0.0 0.0 98 101101 2 0 0 0.25 0 10 49.00886200 002.58628400 xxx 356.40 295 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.00812600 002.58647500 xxx 87.00 295 0.0 0.0 118 101101 2 0 0 0.25 0 10 49.00167600 002.59480000 xxx 87.40 2147 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00079500 002.59961900 xxx 87.00 4440 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00156800 002.59658000 xxx 42.90 144 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.00164000 002.59874300 xxx 42.50 144 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.00013100 002.59893500 xxx 42.60 144 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.00067000 002.59660700 xxx 42.10 217 0.0 0.0 210 101101 2 0 0 0.25 0 10 49.00077700 002.59890700 xxx 42.10 217 0.0 0.0 210 101101 2 0 0 0.25 0 10 48.99479500 002.56758000 xxx 42.10 217 0.0 0.0 210 101101 2 0 0 0.25 0 10 49.00219700 002.57223600 xxx 357.20 282 0.0 0.0 427 101101 2 0 0 0.25 0 10 49.00162200 002.59428000 xxx 357.90 217 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.00234000 002.59132200 xxx 357.90 217 0.0 0.0 197 101101 2 0 0 0.25 0 10 48.99614200 002.59378700 xxx 85.20 1547 0.0 0.0 132 161161 2 0 0 0.25 0 10 48.99504600 002.58850200 xxx 66.30 1825 0.0 0.0 132 161161 2 0 0 0.25 0 10 48.99538700 002.59556700 xxx 63.20 1602 0.0 0.0 132 161161 2 0 0 0.25 0 10 48.99871100 002.59093900 xxx 67.00 2016 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99838800 002.58436700 xxx 68.00 2232 0.0 0.0 73 161161 2 0 0 0.25 0 10 48.99955600 002.58915900 xxx 86.20 6407 0.0 0.0 60 161161 2 0 0 0.25 0 10 48.99856700 002.56780000 xxx 85.50 3895 0.0 0.0 60 161161 2 0 0 0.25 0 10 48.99977100 002.57554900 xxx 86.20 6906 0.0 0.0 60 161161 2 0 0 0.25 0 10 48.99456100 002.58004000 xxx 102.90 2009 0.0 0.0 132 161161 2 0 0 0.25 0 10 48.99416600 002.57267400 xxx 109.10 1570 0.0 0.0 132 161161 2 0 0 0.25 0 10 48.99386000 002.56495200 xxx 130.10 841 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99666300 002.56738900 xxx 175.10 2545 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99484800 002.56870300 xxx 85.80 3558 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99799300 002.57637100 xxx 68.00 2370 0.0 0.0 73 161161 2 0 0 0.25 0 10 48.99899900 002.59668900 xxx 178.10 1957 0.0 0.0 158 161161 2 0 0 0.25 0 10 48.99889100 002.59044600 xxx 178.10 2259 0.0 0.0 158 161161 2 0 0 0.25 0 10 49.00178300 002.59063800 xxx 357.90 217 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.00492800 002.58987100 xxx 357.90 217 0.0 0.0 197 101101 2 0 0 0.25 0 10 49.00106500 002.59233500 xxx 357.00 367 0.0 0.0 151 161161 2 0 0 0.25 0 10 49.00144200 002.59225300 xxx 41.70 144 0.0 0.0 151 101101 2 0 0 0.25 0 10 49.00070500 002.59236300 xxx 40.60 144 0.0 0.0 151 101101 2 0 0 0.25 0 10 49.00088500 002.59885300 xxx 355.70 682 0.0 0.0 151 161161 2 0 0 0.25 0 10 49.00174800 002.59748300 xxx 309.40 256 0.0 0.0 249 101101 2 0 0 0.25 0 10 49.00074100 002.59767500 xxx 309.80 236 0.0 0.0 230 101101 2 0 0 0.25 0 10 49.00016600 002.59367700 xxx 357.00 315 0.0 0.0 151 161161 2 0 0 0.25 0 10 48.99655500 002.59951000 xxx 85.20 1363 0.0 0.0 224 161161 2 0 0 0.25 0 10 48.99781300 002.56158300 xxx 104.10 3551 0.0 0.0 73 161161 2 0 0 0.25 0 10 48.99770500 002.57116800 xxx 106.30 2010 0.0 0.0 73 161161 2 0 0 0.25 0 10 48.99817200 002.57908200 xxx 106.30 2010 0.0 0.0 73 161161 2 0 0 0.25 0 10 48.99700400 002.57341300 xxx 175.10 1336 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99522600 002.57363200 xxx 37.60 131 0.0 0.0 144 101101 2 0 0 0.25 0 10 49.00065200 002.57078400 xxx 356.60 466 0.0 0.0 591 101101 2 0 0 0.25 0 10 49.00101100 002.57815100 xxx 356.60 492 0.0 0.0 2730 101101 2 0 0 0.25 0 10 49.00111900 002.57218100 xxx 355.70 564 0.0 0.0 151 161161 2 0 0 0.25 0 10 49.00165800 002.56957900 xxx 355.40 1004 0.0 0.0 276 101101 2 0 0 0.25 0 10 49.00138800 002.56448600 xxx 355.90 1220 0.0 0.0 2152 101101 2 0 0 0.25 0 10 49.00650900 002.58340800 xxx 358.40 1017 0.0 0.0 374 101101 2 0 0 0.25 0 10 49.00595200 002.58097100 xxx 358.40 873 0.0 0.0 512 101101 2 0 0 0.25 0 10 49.00774800 002.58130000 xxx 357.20 459 0.0 0.0 735 101101 2 0 0 0.25 0 10 49.00683200 002.57552200 xxx 175.20 866 0.0 0.0 2146 101101 2 0 0 0.25 0 10 49.00688600 002.56810100 xxx 175.20 630 0.0 0.0 1542 101101 2 0 0 0.25 0 10 49.00577200 002.56169300 xxx 175.40 1135 0.0 0.0 938 101101 2 0 0 0.25 0 10 49.00570000 002.57968400 xxx 42.20 282 0.0 0.0 427 101101 2 0 0 0.25 0 10 49.00514300 002.55947500 xxx 355.70 755 0.0 0.0 184 101101 2 0 0 0.25 0 10 49.00552000 002.56437700 xxx 355.70 873 0.0 0.0 335 101101 2 0 0 0.25 0 10 49.00539500 002.56719700 xxx 175.20 433 0.0 0.0 1096 101101 2 0 0 0.25 0 10 49.00532300 002.58234000 xxx 84.90 223 0.0 0.0 157 101101 2 0 0 0.25 0 10 49.00584400 002.55805100 xxx 85.40 243 0.0 0.0 210 101101 2 0 0 0.25 0 10 49.00568200 002.55643500 xxx 84.00 1365 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99953800 002.55854400 xxx 102.00 1365 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99729200 002.55862600 xxx 105.00 2690 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99750700 002.55347800 xxx 88.90 1877 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99867500 002.54567400 xxx 86.70 4518 0.0 0.0 92 161161 2 0 0 0.25 0 10 48.99975300 002.55169800 xxx 86.10 1946 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.00207100 002.58872100 xxx 358.40 1070 0.0 0.0 374 101101 2 0 0 0.25 0 10 49.00284300 002.58863900 xxx 87.00 748 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00124400 002.58891200 xxx 87.00 748 0.0 0.0 86 161161 2 0 0 0.25 0 10 48.99869300 002.59959200 xxx 54.20 783 0.0 0.0 93 161161 2 0 0 0.25 0 10 48.99740000 002.59934600 xxx 355.70 466 0.0 0.0 151 161161 2 0 0 0.25 0 10 49.00007700 002.60917600 xxx 357.20 541 0.0 0.0 93 161161 2 0 0 0.25 0 10 49.00093900 002.60895700 xxx 321.00 177 0.0 0.0 86 161161 2 0 0 0.25 0 10 48.99908800 002.60898500 xxx 33.00 243 0.0 0.0 86 161161 2 0 0 0.25 0 10 48.99874700 002.60205700 xxx 34.10 335 0.0 0.0 86 161161 2 0 0 0.25 0 10 49.00000500 002.60241300 xxx 359.30 689 0.0 0.0 86 161161 2 0 0 0.25 0 10 48.99964500 002.60079700 xxx 358.70 322 0.0 0.0 106 161161 2 0 0 0.25 0 10 48.99752500 002.60161800 xxx 358.70 466 0.0 0.0 106 161161 2 0 0 0.25 0 10 48.99565700 002.59953700 xxx 28.70 663 0.0 0.0 106 161161 2 0 0 0.25 0 10 48.99574700 002.60213900 xxx 358.70 518 0.0 0.0 106 161161 2 0 0 0.25 0 10 48.99377000 002.57245500 xxx 0.00 302 0.0 0.0 131 161161 2 0 0 0.25 0 10 48.99996900 002.58329900 xxx 0.00 472 0.0 0.0 131 161161 2 0 0 0.25 0 10 48.99932200 002.56988100 xxx 0.00 472 0.0 0.0 131 161161 2 0 0 0.25 0 10 48.99838800 002.56968900 xxx 17.90 328 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99831600 002.56303500 xxx 356.90 617 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99707600 002.56303500 xxx 359.90 374 0.0 0.0 85 161161 2 0 0 0.25 0 10 48.99590800 002.56087100 xxx 357.00 696 0.0 0.0 85 161161 2 0 0 0.25 0 10 48.99536900 002.56325400 xxx 357.00 578 0.0 0.0 85 161161 2 0 0 0.25 0 10 48.99792100 002.55816100 xxx 17.90 400 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99472300 002.56117300 xxx 326.90 262 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99707600 002.55402600 xxx 116.40 1786 0.0 0.0 98 161161 2 0 0 0.25 0 10 48.99675300 002.55128700 xxx 116.40 1543 0.0 0.0 98 161161 2 0 0 0.25 0 10 48.99813600 002.54863100 xxx 26.10 413 0.0 0.0 308 101101 2 0 0 0.25 0 10 48.99815400 002.55052000 xxx 120.30 243 0.0 0.0 210 101101 2 0 0 0.25 0 10 48.99344700 002.56851200 xxx 294.00 328 0.0 0.0 66 161161 2 0 0 0.25 0 10 48.99684300 002.56517100 xxx 0.00 302 0.0 0.0 131 161161 2 0 0 0.25 0 10 48.99784900 002.55030100 xxx 27.00 302 0.0 0.0 105 161161 2 0 0 0.25 0 10 48.99925000 002.55043800 xxx 354.00 302 0.0 0.0 105 161161 2 0 0 0.25 0 10 48.99914200 002.54871300 xxx 354.00 302 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.00426300 002.55679100 xxx 0.20 774 0.0 0.0 447 101101 2 0 0 0.25 0 10 49.00478400 002.55586000 xxx 336.20 361 0.0 0.0 178 101101 2 0 0 0.25 0 10 48.99899900 002.55309500 xxx 350.90 604 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00523300 002.55342300 xxx 36.00 216 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00561000 002.55323100 xxx 117.00 216 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00067000 002.55473800 xxx 27.00 334 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00007700 002.55408000 xxx 48.00 256 0.0 0.0 66 161161 2 0 0 0.25 0 10 49.00056200 002.55851600 xxx 318.00 295 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.00180100 002.55807800 xxx 354.20 649 0.0 0.0 617 101101 2 0 0 0.25 0 10 49.00086700 002.55846200 xxx 87.00 918 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.00341800 002.55465500 xxx 75.00 321 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.00458600 002.55528500 xxx 75.00 170 0.0 0.0 85 161161 2 0 0 0.25 0 10 49.00058000 002.55613400 xxx 49.80 269 0.0 0.0 99 161161 2 0 0 0.25 0 10 48.99987900 002.55900900 xxx 345.20 321 0.0 0.0 112 161161 2 0 0 0.25 0 10 49.00020200 002.55580600 xxx 11.00 196 0.0 0.0 99 161161 2 0 0 0.25 0 10 48.99957400 002.55580600 xxx 344.00 196 0.0 0.0 72 161161 2 0 0 0.25 0 10 48.99899900 002.55629800 xxx 323.00 321 0.0 0.0 72 161161 2 0 0 0.25 0 10 48.99890900 002.55862600 xxx 26.00 439 0.0 0.0 72 161161 2 0 0 0.25 0 10 48.99858500 002.55791400 xxx 77.00 255 0.0 0.0 79 101101 2 0 0 0.25 0 10 48.99849600 002.55865300 xxx 143.00 196 0.0 0.0 79 101101 2 0 0 0.25 0 10 48.99926800 002.55525800 xxx 44.00 328 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.00050800 002.55536700 xxx 155.70 360 0.0 0.0 79 161161 2 0 0 0.25 0 10 49.00733500 002.56429400 xxx 353.00 505 0.0 0.0 72 161161 2 0 0 0.25 0 10 49.00834100 002.57459100 xxx 352.00 302 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.00844900 002.57648000 xxx 353.20 302 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.00868300 002.58042300 xxx 355.40 302 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.00801800 002.56812800 xxx 351.00 236 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.00812600 002.56993500 xxx 351.00 236 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.00814400 002.57078400 xxx 351.00 236 0.0 0.0 131 161161 2 0 0 0.25 0 10 49.01489900 002.57680900 xxx 180.10 1351 0.0 0.0 1378 101101 2 0 0 0.25 0 10 49.01470100 002.57286600 xxx 358.40 1083 0.0 0.0 551 101101 2 0 0 0.25 0 10 49.01892300 002.58042300 xxx 83.40 295 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01894100 002.58116300 xxx 149.40 433 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.02037900 002.57872600 xxx 119.40 433 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01978600 002.58009500 xxx 128.70 433 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01806100 002.58004000 xxx 170.40 433 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.01897700 002.57949200 xxx 146.40 380 0.0 0.0 125 161161 2 0 0 0.25 0 10 49.01964200 002.57837000 xxx 119.40 433 0.0 0.0 105 161161 2 0 0 0.25 0 10 49.01495300 002.57990300 xxx 89.40 197 0.0 0.0 98 161161 2 0 0 0.25 0 10 49.01356900 002.49912100 xxx 87.40 2119 0.0 0.0 518 101101 2 0 0 0.25 0 10 49.01312000 002.50528300 xxx 176.60 649 0.0 0.0 650 101101 2 0 0 0.25 0 10 49.01488100 002.50081900 xxx 86.90 1004 0.0 0.0 460 101101 2 0 0 0.25 0 10 49.01547400 002.49520500 xxx 181.70 728 0.0 0.0 414 101101 2 0 0 0.25 0 10 49.01529400 002.50377700 xxx 0.00 663 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01502500 002.49772500 xxx 0.00 636 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01308400 002.50709000 xxx 87.00 276 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01312000 002.50377700 xxx 87.00 177 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01592300 002.49802600 xxx 63.00 223 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01545600 002.50320100 xxx 87.00 276 0.0 0.0 92 161161 2 0 0 0.25 0 10 49.01421600 002.49468500 xxx 159.00 276 0.0 0.0 92 161161 2 0 0 0.25 0 10 48.99899900 002.54288000 xxx 354.00 302 0.0 0.0 105 161161 2 0 0 0.25 0 10 48.99991500 002.54063500 xxx 86.10 3510 0.0 0.0 545 101101 2 0 0 0.25 0 10 48.99871100 002.53669200 xxx 354.00 302 0.0 0.0 249 161161 2 0 0 0.25 0 10 48.99707600 002.53617100 xxx 38.90 1233 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99738200 002.53537700 xxx 38.90 800 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99332100 002.53493900 xxx 353.86 2421 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99351900 002.53258400 xxx 173.10 2730 0.0 0.0 545 101101 2 0 0 0.25 0 10 48.99621400 002.53373400 xxx 84.00 321 0.0 0.0 138 161161 2 0 0 0.25 0 10 48.99213600 002.53447400 xxx 84.00 321 0.0 0.0 138 161161 2 0 0 0.25 0 10 48.99245900 002.53781400 xxx 89.10 525 0.0 0.0 439 101101 2 0 0 0.25 0 10 48.99041100 002.53803400 xxx 89.10 505 0.0 0.0 380 101101 2 0 0 0.25 0 10 48.99152500 002.53614400 xxx 173.10 800 0.0 0.0 387 101101 2 0 0 0.25 0 10 48.99139900 002.53882800 xxx 353.00 360 0.0 0.0 79 161161 2 0 0 0.25 0 10 48.99001600 002.53567900 xxx 89.00 662 0.0 0.0 99 161161 2 0 0 0.25 0 10 48.99292600 002.53592500 xxx 269.00 393 0.0 0.0 79 161161 2 0 0 0.25 0 14 49.00305900 002.57376900 50 0 ATC Tower 15 49.00169400 002.56202200 0.00 A10 15 49.00210700 002.55807800 0.00 A34 15 49.00496300 002.56111800 0.00 B10 15 49.00703000 002.56139200 0.00 B9 15 49.00208900 002.56719700 0.00 C4 15 49.00528700 002.56823800 0.00 D10 15 49.00749700 002.56738900 0.00 D7 15 49.00131600 002.57631600 0.00 E10 15 49.00618500 002.57311200 0.00 F10 15 49.00641900 002.58573600 0.00 F31 15 49.00410100 002.55635300 0.00 G21 15 49.01597700 002.57883500 0.00 H1 15 49.01572500 002.57289300 0.00 H10 15 49.01389300 002.57305700 0.00 H12 15 49.01419800 002.57897200 0.00 H5 15 49.01335700 002.50268100 0.00 I20 15 49.01498000 002.50185600 0.00 I30 15 49.01351600 002.49559800 0.00 I49 15 49.00050800 002.54205900 0.00 M10 15 49.00023800 002.53543200 0.00 M24 15 48.99535200 002.53140700 0.00 N41 15 48.99150700 002.53239200 0.00 N76 15 48.99157900 002.53669200 0.00 P74 15 49.01189000 002.55255900 0.00 Q1 15 49.01203500 002.55675800 0.00 Q10 15 49.01205700 002.55725200 0.00 Q11 15 49.01360800 002.55709900 0.00 Q12 15 49.01358500 002.55670700 0.00 Q13 15 49.01357400 002.55629900 0.00 Q14 15 49.01358500 002.55595900 0.00 Q15 15 49.01357400 002.55573800 0.00 Q16 15 49.01354100 002.55536400 0.00 Q17 15 49.01351800 002.55490500 0.00 Q18 15 49.01350700 002.55444600 0.00 Q19 15 49.01192300 002.55339200 0.00 Q2 15 49.01351800 002.55344300 0.00 Q20 15 49.01349600 002.55293300 0.00 Q21 15 49.01194500 002.55395300 0.00 Q3 15 49.01195700 002.55444600 0.00 Q4 15 49.01196800 002.55493900 0.00 Q5 15 49.01197900 002.55543200 0.00 Q6 15 49.01200100 002.55587400 0.00 Q7 15 49.01202400 002.55624800 0.00 Q8 15 49.01222400 002.55646900 0.00 Q9 15 49.00656200 002.57453600 200.00 Ramp 15 49.01328400 002.54344500 0.00 T1 15 49.01297200 002.54397200 0.00 T2 15 49.01259200 002.54444800 0.00 T3 15 49.01297200 002.54526400 0.00 T4 15 49.01350700 002.54563800 0.00 T5 15 49.01402000 002.54543400 0.00 T6 15 49.01407600 002.54409100 0.00 T7 15 49.01407600 002.54482200 0.00 T8 15 49.01435500 002.54405700 0.00 U1 15 49.01429900 002.54543400 0.00 U2 15 49.01434400 002.54482200 0.00 U3 15 49.01473400 002.54575700 0.00 U4 15 49.01534800 002.54557000 0.00 U5 15 49.01568300 002.54495800 0.00 U6 15 49.01523600 002.54388700 0.00 U7 15 49.01548200 002.54441400 0.00 U8 15 49.01550400 002.54370000 0.00 V1 15 49.01597300 002.54477100 0.00 V2 15 49.01572700 002.54421000 0.00 V3 15 49.01646400 002.54429500 0.00 V4 15 49.01675400 002.54364900 0.00 V5 15 49.01680900 002.54286700 0.00 V6 15 49.01597300 002.54261200 0.00 V7 15 49.01640800 002.54276500 0.00 V8 15 49.01606200 002.54205100 0.00 W1 15 49.01685400 002.54237400 0.00 W2 15 49.01646400 002.54223800 0.00 W3 15 49.01713300 002.54160900 0.00 W4 15 49.01711100 002.54075900 0.00 W5 15 49.01682000 002.54002700 0.00 W6 15 49.01598400 002.54067400 0.00 W7 15 49.01640800 002.54035000 0.00 W8 15 49.01590600 002.54019700 0.00 X1 15 49.01663100 002.53963600 0.00 X2 15 49.01628500 002.53992500 0.00 X3 15 49.01656400 002.53880300 0.00 X4 15 49.01618500 002.53817400 0.00 X5 15 49.01561600 002.53805500 0.00 X6 15 49.01523600 002.53924500 0.00 X7 15 49.01544800 002.53859900 0.00 X8 15 49.01496900 002.53907500 0.00 Y1 15 49.01538100 002.53780000 0.00 Y2 15 49.01518100 002.53841200 0.00 Y3 15 49.01486800 002.53732400 0.00 Y4 15 49.01436600 002.53732400 0.00 Y5 15 49.01389800 002.53771500 0.00 Y6 15 49.01411000 002.53916000 0.00 Y7 15 49.01399800 002.53846300 0.00 Y8 15 49.01383100 002.53926200 0.00 Z1 15 49.01360800 002.53778300 0.00 Z2 15 49.01371900 002.53854800 0.00 Z3 15 49.01302800 002.53793600 0.00 Z4 15 49.01259200 002.53836100 0.00 Z5 15 49.01236900 002.53914300 0.00 Z6 15 49.01273800 002.53958500 0.00 Z7 15 49.01317300 002.53999300 0.00 Z8 18 48.99802800 002.58136300 1 BCN 19 48.99649400 002.55264500 1 WS 19 48.99794400 002.61028300 1 WS 19 49.02142300 002.51296000 1 WS 19 49.02304800 002.57038300 1 WS 19 48.99399200 002.56552800 1 WS 19 48.99380100 002.60256600 1 WS 19 49.02579500 002.52475700 1 WS 19 49.02729600 002.56046100 1 WS 50 12712 DE GAULLE ATIS 53 11810 DE GAULLE TRAFFIC 53 11955 DE GAULLE TRAFFIC 53 12160 DE GAULLE GND 53 12167 DE GAULLE TRAFFIC 53 12177 DE GAULLE GND 53 12177 DE GAULLE GND 53 12180 DE GAULLE GND 53 12192 DE GAULLE TRAFFIC 53 12192 DE GAULLE TRAFFIC 53 12197 DE GAULLE GND 53 12197 DE GAULLE GND 54 11865 DE GAULLE TWR 54 11925 DE GAULLE TWR 54 12090 DE GAULLE TWR 54 12360 DE GAULLE TWR 54 12532 DE GAULLE TWR 55 11815 DE GAULLE APP 55 11985 DE GAULLE APP 55 12115 DE GAULLE APP 55 12582 DE GAULLE APP 55 12582 DE GAULLE APP 55 12642 DE GAULLE APP 55 12642 DE GAULLE APP 56 12435 DE GAULLE DEP 56 12657 DE GAULLE DEP 56 12657 DE GAULLE DEP 56 13120 DE GAULLE DEP 56 13337 DE GAULLE DEP 56 13337 DE GAULLE DEP 1 323 1 0 LECO A Coruna 100 45.11 1 0 0.25 0 2 1 04 43.29478300 -008.38322800 0.00 0.00 3 0 0 1 22 43.30974400 -008.37094700 0.00 0.00 3 0 0 1 21 43.29653382 -008.38243293 2 30.85 3.00 04 PAPI-4L 21 43.30730671 -008.37230639 2 210.86 3.00 22 PAPI-4L 10 43.30240900 -008.37978600 xxx 210.70 974 0.0 0.0 300 161161 2 0 0 0.25 0 10 43.30365100 -008.37860600 xxx 30.00 144 0.0 0.0 105 101101 2 0 0 0.25 0 10 43.30145000 -008.38084400 xxx 167.00 251 0.0 0.0 140 161161 2 0 0 0.25 0 10 43.30330800 -008.37767400 xxx 297.20 551 0.0 0.0 20 161161 2 0 0 0.25 0 10 43.30239400 -008.37758000 xxx 93.00 131 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30236400 -008.38079800 xxx 300.00 328 0.0 0.0 676 161161 2 0 0 0.25 0 10 43.30193600 -008.37761100 xxx 0.00 144 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30289200 -008.37876300 xxx 354.00 98 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30210400 -008.37760100 xxx 348.00 197 0.0 0.0 92 161161 2 0 0 0.25 0 10 43.30236300 -008.37732900 xxx 75.00 164 0.0 0.0 92 161161 2 0 0 0.25 0 10 43.30223400 -008.37774800 xxx 330.00 98 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30253800 -008.37822900 xxx 298.40 518 0.0 0.0 112 161161 2 0 0 0.25 0 10 43.30298000 -008.37886800 xxx 0.00 105 0.0 0.0 66 161161 1 0 0 0.25 0 10 43.30267000 -008.37895000 xxx 261.00 98 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29928300 -008.37982800 xxx 354.00 164 0.0 0.0 92 161161 2 0 0 0.25 0 10 43.29950900 -008.38000300 xxx 300.00 328 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.29954400 -008.37966400 xxx 255.00 151 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29961200 -008.37948600 xxx 240.00 125 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29995200 -008.38066700 xxx 342.00 72 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.30058800 -008.38075200 xxx 2.10 72 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.29943400 -008.37994200 xxx 324.00 112 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30011000 -008.38071400 xxx 354.00 59 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.29915500 -008.37989200 xxx 12.00 118 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30093100 -008.38064800 xxx 15.00 203 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.29979200 -008.38056700 xxx 328.80 72 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.30035200 -008.38074200 xxx 355.80 118 0.0 0.0 59 161161 2 0 0 0.25 0 10 43.29952600 -008.37992200 xxx 276.00 92 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30307200 -008.37664800 xxx 54.00 92 0.0 0.0 66 101101 2 0 0 0.25 0 10 43.30281300 -008.37686800 xxx 9.00 79 0.0 0.0 66 101101 2 0 0 0.25 0 10 43.30300300 -008.37679500 xxx 78.00 79 0.0 0.0 66 101101 2 0 0 0.25 0 10 43.30294200 -008.37685800 xxx 351.00 79 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29495300 -008.38335000 xxx 300.00 98 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29536700 -008.38339300 xxx 33.00 98 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29528400 -008.38318600 xxx 30.00 236 0.0 0.0 66 101101 2 0 0 0.25 0 10 43.30972800 -008.37144100 xxx 79.50 138 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29557400 -008.38298500 xxx 64.40 210 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.29512600 -008.38346000 xxx 357.00 131 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30961100 -008.37172300 xxx 33.00 105 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30922500 -008.37180800 xxx 0.00 230 0.0 0.0 66 161161 2 0 0 0.25 0 10 43.30947900 -008.37155900 xxx 33.00 184 0.0 0.0 66 101101 2 0 0 0.25 0 10 43.30092500 -008.38082800 xxx 6.00 295 0.0 0.0 105 101101 2 0 0 0.25 0 14 43.30250300 -008.38094100 0 0 Tower Viewpoint 15 43.30104700 -008.38079200 340.00 Parking 1 18 43.30041600 -008.37723700 1 BCN 19 43.30135100 -008.37894000 1 WS 53 12170 GND 54 11830 TWR 55 12020 SANTIAGO APP 1 465 0 1 I38 Action Airpark 100 30.48 3 0 0.25 0 0 0 02 39.13079497 -084.82928314 0.00 0.00 1 0 0 0 20 39.13420503 -084.82793910 0.00 0.00 1 0 0 0 101 30.48 0 19 39.13740056 -084.82783540 01 39.12759944 -084.82938684 19 39.12737733 -084.82995637 1 WS 19 39.13065295 -084.82989376 1 WS 19 39.13762266 -084.82726579 1 WS 19 39.13434704 -084.82732845 1 WS 1 302 1 0 LFPM Melun Villaroche 100 45.11 1 0 0.25 0 3 0 10 48.60647800 002.66328600 0.00 829.97 2 0 0 0 28 48.60233600 002.68929400 85.04 0.00 3 0 0 1 100 45.11 1 0 0.25 0 2 1 11 48.60647845 002.66328807 0.00 829.97 3 8 0 0 29 48.60233755 002.68929193 85.04 0.00 3 0 0 1 100 29.87 1 0 0.25 0 0 0 01 48.60614200 002.67097800 0.00 199.95 2 0 0 0 19 48.61753900 002.67485300 0.00 619.96 2 0 0 0 100 29.87 1 0 0.25 0 2 1 02 48.60601940 002.67174468 0.00 199.95 2 0 0 0 20 48.61741460 002.67561932 0.00 619.96 2 0 0 0 99 gdalautotest-3.0.4/ogr/data/sort_test.dbf0000644003401500001440000001005213614004466020035 0ustar rouaultuserss (aetext_valueC2num_valueC2 a 1 b 2 c 3 d 4 e 5 f 6 7 8 9 16 17 24 25 26 g 10 h 11 i 12 j 13 k 14 l 15 m 18 n 19 o 20 p 21 q 22 r 23 aa 27 bb 28 cc 29 dd 30 33 34 35 ee 31 ff 32 gg 36 hh 37 ii 38 aaa 39 bbb 40 gdalautotest-3.0.4/ogr/data/testpointavc/0000755003401500001440000000000013614004466020057 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpointavc/info/0000755003401500001440000000000013614004466021012 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpointavc/info/arc0002.dat0000644003401500001440000000012013614004466022544 0ustar rouaultusers../testpointavc/tic.adf gdalautotest-3.0.4/ogr/data/testpointavc/info/arc0002.nit0000644003401500001440000000066013614004466022577 0ustar rouaultusersIDTIC  XTIC   YTIC    gdalautotest-3.0.4/ogr/data/testpointavc/info/arc.dir0000644003401500001440000000216413614004466022262 0ustar rouaultusersTESTPOINTAVC.BND ARC0000  XX TESTPOINTAVC.PAT ARC0001 . PXX TESTPOINTAVC.TIC ARC0002  XX gdalautotest-3.0.4/ogr/data/testpointavc/info/arc0000.dat0000644003401500001440000000012013614004466022542 0ustar rouaultusers../testpointavc/bnd.adf gdalautotest-3.0.4/ogr/data/testpointavc/info/arc0000.nit0000644003401500001440000000110013614004466022563 0ustar rouaultusersXMIN   YMIN   XMAX    YMAX    gdalautotest-3.0.4/ogr/data/testpointavc/info/arc0001.nit0000644003401500001440000000132013614004466022570 0ustar rouaultusersAREA   PERIMETER   TESTPOINTAVC#   TESTPOINTAVC-ID   DATA  gdalautotest-3.0.4/ogr/data/testpointavc/info/arc0001.dat0000644003401500001440000000012013614004466022543 0ustar rouaultusers../testpointavc/pat.adf gdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/0000755003401500001440000000000013614004466022602 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/lab.adf0000644003401500001440000000514413614004466024020 0ustar rouaultusers' 2J~HJ~HJ~HJ:H(J:H(J:H(JtH)JtH)JtH)JqH֭vJqH֭vJqH֭vJȴHշuJȴHշuJȴHշuJHpJHpJHpJ HJ HJ HJH4JH4JH4 JHJHJH JfHJfHJfH JGHNCJGHNCJGHNC J`HԍJ`HԍJ`Hԍ JHJHJHJ{HծJ{HծJ{HծJWHJWHJWHJTHJTHJTHJTHJTHJTHJHlHCJ>lHCJ>lHC&JHH2JHH2JHH2'JHqH5JHqH5JHqH5(JI7HИuJI7HИuJI7HИu)JKVHМJKVHМJKVHМ*J?9HyJ?9HyJ?9Hy+J> H;J> H;J> H;,J5HРJ5HРJ5HР-J5HРJ5HРJ5HР.J:7H#J:7H#J:7H#/J#HTJ#HTJ#HT0J3HgJ3HgJ3Hg1JNHаEJNHаEJNHаE2J`HaJ`HaJ`Ha3JH4JH4JH44JH·JH·JH·5J2HJ2HJ2H6JHiJHiJHi7J'HH_yJ'HH_yJ'HH_y8J%JHJHJH?JH JH JH @JH5_JH5_JH5_AJHQJHQJHQBJӞHVJӞHVJӞHVCJ8H*J8H*J8H*DJ8H*J8H*J8H*EJH11JH11JH11FJHcJHcJHcGJHϜ'JHϜ'JHϜ'HJuH JuH JuH IJHOJHOJHOJJzHJzHJzHKJKHDmJKHDmJKHDmLJ~;HJ~;HJ~;HMJ|HżJ|HżJ|HżNJuHσJuHσJuHσOJH\wJH\wJH\wPJlHϽJlHϽJlHϽgdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/tic.adf0000644003401500001440000000006013614004466024031 0ustar rouaultusersJQH\wJQHJuH\wJuHgdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/pat.adf0000644003401500001440000000714013614004466024044 0ustar rouaultusers05103084340000 05103052120000 05103083160000 05103085410000 05103086760000 05103052290000 05103089060000 05103089070000 05103089070001 05103080820000 05103083850000 05103072380000 05103087110000 05103088380000 05103084460000 05103092180000 05103092180001 05103080830000 05103081830000 05103084410000 05103070400000 05103051910000 05103076160000 05103051610000 05103086310000 05103077600000 05103051780000 05103051500000 05103077610000 05103051460000 05103070440000 05103076590000 !!05103090240000 ""05103051560000 ##05103051560001 $$05103073550000 %%05103077620000 &&05103051380000 ''05103051430000 ((05103077540000 ))05103087240000 **05103075630000 ++05103076620000 ,,05103059900000 --05103059900001 ..05103091290000 //05103073990000 0005103051220000 1105103080970000 2205103092520000 3305103051350000 4405103075060000 5505103092920000 6605103059910000 7705103050940000 8805103092090000 9905103082160000 ::05103075270000 ;;05103075270001 <<05103075270002 ==05103076110000 >>05103052000000 ??05103084100000 @@05103051740000 AA05103088690000 BB05103074560000 CC05103051150000 DD05103051150001 EE05103051160000 FF05103072340000 GG05103072600000 HH05103081900000 II05103078970000 JJ05103087180000 KK05103080730000 LL05103089900000 MM05103078320000 NN05103088630000 OO05103080740000 PP05103084150000 gdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/bnd.adf0000644003401500001440000000002013614004466024011 0ustar rouaultusersJuH\wJQHgdalautotest-3.0.4/ogr/data/testpointavc/testpointavc/tol.adf0000644003401500001440000000017013614004466024052 0ustar rouaultusers@48CaA6FA6F A6F A6Fgdalautotest-3.0.4/ogr/data/Stacks.shp0000644003401500001440000000121013614004466017272 0ustar rouaultusers' DgGA n jAZ/GgHAe@jAgGA n jAZ/GgHAe@jAgGAQFKjAnz HABY=jAqfHAnjAwn%HAkjAFük#HA&$jA>YHAڧphjA;.HAx&"jAqGA++ejAMN HAAJ0jAބ'HAsVjAkȔ3HAzjjA-HAwr'\jAa?\HAb~QfjAw+699GA ؈jA@GAajAqGA++ejAgdalautotest-3.0.4/ogr/data/schema_with_geom_in_complextype.xsd0000644003401500001440000000212513614005334024470 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/testgeometryelementpath.gfs0000644003401500001440000000105113614004466023014 0ustar rouaultusers LAYER LAYER location1container|location1 attrib1 attrib1 String 13 attrib2 attrib2container|attrib2 String 13 gdalautotest-3.0.4/ogr/data/gjmultipoint.dbf0000644003401500001440000000025113614004466020534 0ustar rouaultusers_aHFIDN NAMEC< 1 MultiPoint 1 gdalautotest-3.0.4/ogr/data/ais.xml0000644003401500001440000000051513614005334016626 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/sparse.gdb.zip0000644003401500001440000004633313614004466020121 0ustar rouaultusersPK YF sparse.gdb/UT 3IU3IUux PK渥FjM!sparse.gdb/a00000006.FDO_UUID.atxUT 1IUg1IUux A 0 Dxw[bKwWԞd"ј^y5oW4RnQbb霽7PK渥F-YW sparse.gdb/a00000007.gdbtablxUT 1IU1IUux ; @D]_I4c;PLNIAqO27yK!uZ>VvB91)3dN˙q6^PK渥F$ \!sparse.gdb/a00000004.FDO_UUID.atxUT 1IU1IUux 10PK7$`Ɨr6zfOBz{*{,.֝DK$Z撞lU_jl΍/6`#YZ6IJ8bN2fSsk4O2h[9357f=يAaEx={ҽ |n,'3ʕ'^=(YӝJ( XzWHuX)M.IM:z`FIe>ۚ׆隂T>Kt:Cīg)PMzh(zz=3Izp34Q}fǍ:fS+efӵ1ErVl$I?dkK98@uMg)%p2^=i8LF?gHACн}dqG>|@Apѽ BUU7"]=+X U"W+l j UV3!ӄ˺읯DM[q+X\2aؘ@Gee܊jLUAJy\Ն Gq^,C^ip嚓vs(qP "EwZڳN=H|X|"70bZ*}K榩ao{ҮȃX7mbm"[61M !_ՠB~6*jA(i-xܪKmRn-b9t–5ΓD;lش3/v-!Aփr-ٵb);t.pd (}a==Z.?뮻뮻/PK渥FA3sparse.gdb/a00000005.CatItemTypesByParentTypeID.atxUT 1IUg1IUux j0awy ,TMwnBA?|ƈ2 :|[ ; {pGp 'p gpp wpO /]5-ly3~|>sRsjHU q $@ܚl!W}USFX)7V$E'+a3ZGB\$\kɵ轄WG e1L,!Pfd$Nd%eWu68l=>}hjfr4OXV47R2PViVFz^PK渥FӰ 6sparse.gdb/a00000004.gdbindexesUT 1IU1IUux u @F`d!tcvAB7>}[.gYfNd8q On\8*&Ok([.SR|l7:Ysԛ#k ;zRF*16xb˨Ciɵv?OPK渥Fݦr(sparse.gdb/a00000005.gdbindexesUT 1IU1IUux ca``b7x NbbHeHf(a10@1兀ؙ!/20T2Y N@V(BT21$ FK0!(Wea2&[!7rp8/ǯ?_wPK渥Fco sparse.gdb/a00000002.gdbtablxUT 1IU1IUux ͱ `E_M:[!EL!(Lp[pY @f:Ӽ),vcXZȗ\5Ad&;HG&[HVR"w2)֒$I$It?PK渥FO2sparse.gdb/a00000007.CatRelTypesByForwardLabel.atxUT 1IUg1IUux J0:uyEB*.ʠkF[/|/Mw1n$I(9I1>G _)>3|'Ru+J -q#Ko"CsZt=0& _ODjIg̬y_밊u=fwV0z!~Fao]8 ޣm'UFGІ3Pn[tpkP3J|?%%%%% G&S_PK渥F>sparse.gdb/a00000006.gdbindexesUT 1IU1IUux m] AFؔ+%$uׯ3&vg3>4}`( rVdυ#^,`,Uqͤ][gT\=)tMR2əZj>MKW|{"q X%6MPK渥Faw(70+sparse.gdb/a00000005.CatItemTypesByName.atxUT 1IU1IUux NP}׾Q/0^E@ QgN E9{&/3S"<*KyMejQ@)Jc L&d2L&dVqͿ/p|/,{z1| _G7uE[1w"w$j P$UK Oّܥp*5i(}Od%'kpgywմsN6 _˸'i]~tKQEQEnq׿{9PK渥FhK8z%sparse.gdb/a00000004.gdbtableUT 1IU1IUux VMlU4u k Ʃ]CRi+*lg{z7n#D)"z J $ĭKT8p*7U0b7nb9fy=o}eߣ;1.sH9@_a n.k@2i dz T.Aq>*!36iV0Cq`f`PܺZ{@:s0Sc2x6~ \'21se/,A3`k240X}6 P>b'`KBҐi<38+JE1BS rXY;uRl;D`9 Pf aE<>g'ZeQfCc0f'^%_Ga{}i(X7/^pAF7.^:?_Dٴ{ҿYߍϿeg#a+nD|C'~9V _?yi!ٛ>Wnn?dYJl?{*MqT @LK5I^ A獂&\"0OE9D ݚזnMe^ L57*/b 13Le1y׬jM6ap($ gg2ꖭyRš&AiZ(e=" ,UP*DpeU+DW@ ѢY-Z\$Fif}QHM- &ۄ s-ca:XmbAZ)hC몆g6W@d` 7&$fZ]dF$gU Bh)`JV$4"ꧭ>|k}zK_^cן8էg>y7IQ2B8ԟN-$>\iP_m6m rʢFlz5mn܆70khIog6EZ'9A!ٔL{Q-tm]^x{%~Jں2KD+OR$4d14=jNo-fZ-!8[3H-A5.MuhMw4CVL K2&ɫ)w 2g!͑WT뤭JBSŘzq46<22>&Eq( r80 Bh,bh)~8V:؛QGޫۇ3ާc=Um&߮G n3Qn3n񧸻вvkx9o <]w6^M[. OpRry<2mR"&YrB{69òM \baS GF]`zO?PK渥FSgy+ sparse.gdb/a00000004.gdbtablxUT 1IU1IUux  cyvd&`2{܈F5w.PK渥F{+Bsparse.gdb/a00000009.gdbindexesUT 1IU1IUux cd``b7x vbbpepfa10@1PK渥Fs Msparse.gdb/a00000002.gdbtableUT 1IU1IUux Tn05!!P`Tl+*-I."Mĕ/8#R|  C4٨dɾsqnB=jⰻ8@#. Q1(4!{q* j9.=6D ?5!6ԉE|Bv',)WiMr&at>(ҤH:o8X%kbv%̝vƘM=?gl6c3zqi&V'YVA<[c7L V7E; yD+aŔWTW<ݕH+^ )8+1yYzz1Xx_~3 lOkⓥy,wh[w.<<,w N/X3]V\˧{%™ǰL tEΜIUD*'#NgqE,MӊjiBD@ЯW5XIPuW_WuqU"77V>CeY2]^mACPK渥FN*sparse.gdb/a00000006.CatRelsByOriginID.atxUT 1IU1IUux A e=Чn+Tt  툈LqN׊mՊ%5ޢy-j!=kJoPK渥F3uX/sparse.gdb/a00000004.CatItemsByPhysicalName.atxUT 1IUg1IUux ׻ 0?HF@l1J .Υy+ Bb;[kiJ9ma``c`ʾ)'PK渥F"B| sparse.gdb/a00000005.gdbtablxUT 1IU1IUux ͡ `E῔b@baa (; QH T"x'a9/O)e*V.Jn[8@=|`37a:p;8ްy GE 쿲 PK渥FRG sparse.gdb/a00000006.gdbtableUT 1IU1IUux cf```i@ʀ܌Zɳ0@3p3$1d12$30x20002B8jL@E @Rcasj)i 0T2A.GL X[C)R+ gB$YX訿)֮俌K5MxRوM:8םքQYU*^t9Us]QT/@?Ձ 3,5e~J3?9<3VV7~f4դ^1z#aBF99_Lfm|7ԞَQ7Sm_<7K9'vܹɜn%e˜l"-qkvWߨw.ƗG}G>Q `'PK渥FK4sparse.gdb/a00000007.CatRelTypesByDestItemTypeID.atxUT 1IUg1IUux j! F>Ew51e4R0]xȇ&Fm޶/k{νw'ٽtoW}qŶ IL sJ26h"G.3J(X$T::RG[mSoJ(d5 6(2ή6| cqx=0)$4Q18b| զXh3n[EASJ\jLM*ߦ 8XTH" 1L~9 W#`Vɦ-ߋbX,|OPK渥FdZsparse.gdb/a00000007.gdbindexesUT 1IU1IUux ] @EOCE=VgL #-+L~]WȰr:{̺[R س!$a,:RVnH4bL9w.89W%{:5>1;I|"?zm\%3*iV>Y{7cL Z/o\ZQ&CKPK渥F3 )sparse.gdb/a00000005.gdbtableUT 1IU1IUux cf``P8 fe@lZɳ ß!!!!%!Rc `Hd(ad(a,~@\{ d]]Wݩ{m hų$5Wȷ|*UĵYe5礤i|0~ju#(8(9y4v=ژ^%$8DZߪ^fI9|Q\]/sHfP]+&ysh}0]cRqIQbrIHbRN1Plۢqn7G1]PPjNbIf~^qFfsNbqPgaq;N,;kwKM,)-JUz'x論q=TS@#螚ZRZR_ AeioUKxuqWs8 HH9 nI5zO_nf~B!Լpɀ(L_UWy{&C촭%S/ -'"2.(ˮ{ȮkwS'bļt`NBN۬Goa42_krOIMQK)iPK渥F/HFsparse.gdb/a00000001.gdbtableUT 1IU1IUux cf``b' fe@7FY@ 83'  C"C.C*PrXC&CP!(Ppob@5.N%Ή%9 c $R  $d&@N{1/L$ ,*Ģ0Ѡ!y`Y9 & / "( '39'? ($Ei)IF PK渥F=Isparse.gdb/a00000007.gdbtableUT 1IU1IUux  Lg (E>:d Qg[ hl,^IwC l%F@#f č7E66bPkl4i{yz {7XyoVNZ`A r/:Q6d;Q"5@m(. GcO_=@m -B4 6"z?)B(SGMvgޫqcP}?鳞N> JY ΄|J:V5&L,0>@Ku. C/G:829yd\XVgBsҺ76U*Y"'L,N -B)M<XeH"ާ0ʼn76%Z۾|'t[n8%,,8[@-v0w[:]N#JWu\b;NR v1Iriޘuw3ds+D5GMȩ|TJi`vǪ,tЙaʎG/"?v(dF%tY4U`QӤWÒ&%)8aU0R2H=yDeM֌6û16"$  e vw8%#ǶX+]&D_G`ZF9HV #ѕfƾ#՝喏^q[*,L2B[EZ¨5k)&THـ.{gx5K֗ueB=~xZ{7Vr_3q S[^R Ov-@ uӢᙄ&ٰ_jژ{.*@BNڒ.qp/|UFj\yP?vTz+(|lO/ *h$.qxߊYC<#ME^IJV}prLHOZ.a6~(= /PK渥F+r_% sparse.gdb/a00000006.gdbtablxUT 1IU1IUux  L_Bf`KL2^uZ~?PK渥FBRN/sparse.gdb/a00000006.CatRelsByDestinationID.atxUT 1IUg1IUux A 0 Dxw*hz)3?f;ZVBaͶ[+3?GPK渥Fn'sparse.gdb/a00000004.CatItemsByType.atxUT 1IU1IUux ;! P%%ؘr=|mI#MBq[쮕lJ,L8SUdN[}F΃I%QS/Z[Úʱ/ƛ.RNER!$7't\}1gPK YF Asparse.gdb/UT3IUux PK渥FjM!Esparse.gdb/a00000006.FDO_UUID.atxUT1IUux PK渥F-YW sparse.gdb/a00000007.gdbtablxUT1IUux PK渥F$ \!sparse.gdb/a00000004.FDO_UUID.atxUT1IUux PK渥FWD' |sparse.gdb/a00000003.gdbtablxUT1IUux PK 渥FKpsparse.gdb/gdbUT1IUux PK渥FY(3Jsparse.gdb/a00000007.CatRelTypesByBackwardLabel.atxUT1IUux PK渥Fܞ{A sparse.gdb/a00000001.gdbtablxUT1IUux PK渥FQJXwsparse.gdb/a00000003.gdbtableUT1IUux PK渥F`3+sparse.gdb/a00000005.CatItemTypesByUUID.atxUT1IUux PK渥FA3 sparse.gdb/a00000005.CatItemTypesByParentTypeID.atxUT1IUux PK渥FӰ 6 sparse.gdb/a00000004.gdbindexesUT1IUux PK渥Fݦr( sparse.gdb/a00000005.gdbindexesUT1IUux PK渥FBPT6 sparse.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxUT1IUux PK渥Fco nsparse.gdb/a00000002.gdbtablxUT1IUux PK渥FO24sparse.gdb/a00000007.CatRelTypesByForwardLabel.atxUT1IUux PK渥F>sparse.gdb/a00000006.gdbindexesUT1IUux PK渥Faw(70+qsparse.gdb/a00000005.CatItemTypesByName.atxUT1IUux PK渥F %sparse.gdb/a00000001.TablesByName.atxUT1IUux PK渥FhK8z%sparse.gdb/a00000004.gdbtableUT1IUux PK渥FSgy+ sparse.gdb/a00000004.gdbtablxUT1IUux PK渥F{+BBsparse.gdb/a00000009.gdbindexesUT1IUux PK渥Fs Msparse.gdb/a00000002.gdbtableUT1IUux PK渥FN*:sparse.gdb/a00000006.CatRelsByOriginID.atxUT1IUux PK渥F3uX/sparse.gdb/a00000004.CatItemsByPhysicalName.atxUT1IUux PK渥F"B|  sparse.gdb/a00000005.gdbtablxUT1IUux PK渥FRG !sparse.gdb/a00000006.gdbtableUT1IUux PK渥F0#"sparse.gdb/a00000004.spxUT1IUux PK渥Fڔ*#sparse.gdb/a00000007.CatRelTypesByUUID.atxUT1IUux PK渥F)!*:%sparse.gdb/a00000003.gdbindexesUT1IUux PK渥Fw%sparse.gdb/timestampsUT1IUux PK縥F[+ =|&sparse.gdb/a00000009.gdbtableUT1IUux PK渥F?5X&sparse.gdb/a00000004.freelistUT1IUux PK渥F˖Pnp'sparse.gdb/a00000001.gdbindexesUT1IUux PK渥Fl5M&(sparse.gdb/a00000006.CatRelsByType.atxUT1IUux PK踥F i(sparse.gdb/a00000009.gdbtablxUT1IUux PK渥FJ+*)sparse.gdb/a00000007.CatRelTypesByName.atxUT1IUux PK渥FK43+sparse.gdb/a00000007.CatRelTypesByDestItemTypeID.atxUT1IUux PK渥FdZ,sparse.gdb/a00000007.gdbindexesUT1IUux PK渥F3 )-sparse.gdb/a00000005.gdbtableUT1IUux PK渥F/HF<2sparse.gdb/a00000001.gdbtableUT1IUux PK渥F=Ih3sparse.gdb/a00000007.gdbtableUT1IUux PK渥F+r_% j8sparse.gdb/a00000006.gdbtablxUT1IUux PK渥FBRN/8sparse.gdb/a00000006.CatRelsByDestinationID.atxUT1IUux PK渥Fn'9sparse.gdb/a00000004.CatItemsByType.atxUT1IUux PK--B:gdalautotest-3.0.4/ogr/data/nomid.mif0000644003401500001440000000066313614004466017144 0ustar rouaultusersVersion 300 Charset "WindowsLatin1" Columns 0 Data Region 1 6 407131.721 155322.441 407134.468 155329.616 407142.741 155327.242 407141.503 155322.467 407140.875 155320.049 407131.721 155322.441 Brush (1, 0, 16777215) Pen (1, 2, 0) Region 1 6 407128.974 155315.266 407131.721 155322.441 407140.875 155320.049 407139.552 155314.949 407138.932 155312.559 407128.974 155315.266 Brush (1, 0, 16777215) Pen (1, 2, 0) gdalautotest-3.0.4/ogr/data/polygons25d.gen0000644003401500001440000000014013614004466020207 0ustar rouaultusers1 2,49,10 2,50,10 3,50,10 3,49,10 2,49,10 END 2 2,49,20 2,50,20 3,50,20 3,49,20 2,49,20 END END gdalautotest-3.0.4/ogr/data/text.dxf0000644003401500001440000000046513614004470017023 0ustar rouaultusers 0 SECTION 2 TABLES 0 TABLE 2 STYLE 0 STYLE 2 abc 41 0.50995 1001 ACAD 1000 SwissCheese 1071 33554432 0 ENDTAB 0 ENDSEC 2 ENTITIES 0 MTEXT 10 1.0 20 2.0 30 3.0 40 10.0 1 \A1;test^Itext\~\pt0.2;{\H0.7x;\Sab\/c\~d%%p^ ef\^ g.h\#i;} j{\L\Ok\ol}m 7 abc 50 45.0 62 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/expected_gml_gml32.gml0000644003401500001440000000314713614004466021506 0ustar rouaultusers 48 249 3 49 249 2 49 2 48 348 3 48 3 foo gdalautotest-3.0.4/ogr/data/mitab_bounds.txt0000644003401500001440000000113713614004466020545 0ustar rouaultusers# Map generic Lambert 93 to French Lambert 93, Europe bounds Source = CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49, 700000, 6600000 Destination=CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029) # French Lambert 93, French bounds CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000002, 700000, 6600000 Bounds (75000, 6000000) (1275000, 7200000) # French Lambert 93, Europe bounds CoordSys Earth Projection 3, 33, "m", 3, 46.5, 44, 49.00000000001, 700000, 6600000 Bounds (-792421, 5278231) (3520778, 9741029) gdalautotest-3.0.4/ogr/data/geometries.kml0000644003401500001440000000623213614004466020207 0ustar rouaultusers APTBoundary 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,00,0 0,1 1,1 1,0 0,0 0,0 0,0 1,1 0,0 1,1 0,0 0,01,1 0,0 1,1 0,0 0,1 1,1 1,0 0,0 0,00,0 1,1 gdalautotest-3.0.4/ogr/data/can_caps.shp0000644003401500001440000000072013614004466017616 0ustar rouaultusers' }ZEh`%IDE@qs*^J}U.T:O@ XSO 4 G@ a|`\OJ@ ; P|eުF@  PO*VF@ 9(aRxF@ whQ :fG@ "T3k'ZR9I@ qs*^JYG@ e7iS%IDE@ c^|r6H@ }ZEh`8\N@ oDGXvKpH@ aE|\}U.T:O@gdalautotest-3.0.4/ogr/data/aspatial-table.dat0000644003401500001440000000127013614004466020711 0ustar rouaultusersc  aCbCcCdC hello worldgdalautotest-3.0.4/ogr/data/prjwithutf8bom.shx0000644003401500001440000000015413614004466021054 0ustar rouaultusers' 6YI@YI@2 gdalautotest-3.0.4/ogr/data/atom_rfc_sample_atom_ns.xml0000644003401500001440000000344513614005334022732 0ustar rouaultusers dive into mark A <em>lot</em> of effort went into making this effortless 2005-07-31T12:29:29Z tag:example.org,2003:3 Copyright (c) 2003, Mark Pilgrim Example Toolkit Atom draft-07 snapshot tag:example.org,2003:3.2397 2005-07-31T12:29:29Z 2003-12-13T08:29:29-04:00 Mark Pilgrim http://example.org/ f8dy@example.com Sam Ruby Joe Gregorio

[Update: The Atom draft is finished.]

gdalautotest-3.0.4/ogr/data/gxtimestamp.kml0000644003401500001440000000101313614004466020376 0ustar rouaultusers foo foo 2016-02-13T12:34:56Z foo foo 2016-02-13T00:00:00Z 2016-02-14T00:00:00Z gdalautotest-3.0.4/ogr/data/duplicate_folder_name.kml0000644003401500001440000000120513614004466022344 0ustar rouaultusers doc layer placemark 0 2,49,0 layer placemark 0 3,50,0 gdalautotest-3.0.4/ogr/data/test_eurostat.tsv0000644003401500001440000000006513614004466021000 0ustar rouaultusersunit,geo\time 2010 2011 2012 NBR,FOO : 1 u 2.34 gdalautotest-3.0.4/ogr/data/fake_gmljp2.xml0000644003401500001440000000055313614005335020236 0ustar rouaultusers
e f
gdalautotest-3.0.4/ogr/data/mixed_shape_type_non_conformant.dbf0000644003401500001440000000017513614004466024443 0ustar rouaultuserssA WidN 1 2 3 4 5 6gdalautotest-3.0.4/ogr/data/topojson3.topojson0000644003401500001440000000037213614004466021071 0ustar rouaultusers{ "type":"Topology", "arcs": [ [[0.0, 0.0], [10, 0], [0, 10]] ], "objects": { "a_layer" : {"type": "GeometryCollection", "geometries" : [ {"type": "LineString", "arcs": [0, -1] } ] }, "foo" : {"type": "LineString", "arcs": [0, -1], "id" : "1" } } } gdalautotest-3.0.4/ogr/data/test_georss_gml.xml0000644003401500001440000000402413614005335021252 0ustar rouaultusers title channel_description channel_link A point Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 49 2 First category Second category A line Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 48 2 48.1 2.1 48 2.2 A polygon Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 50 2 50.1 2.1 48.1 2.2 46.1 2.1 50 2 A box Author http://gdal.org Sun, 07 Dec 2008 20:13:00 +0200 Description 49 2 49.5 2.2 gdalautotest-3.0.4/ogr/data/testpoly.dbf0000644003401500001440000000033313614004466017673 0ustar rouaultusers_A FIDN 0 1 2 3 4 5 6 7 8 9 10 11 12 13gdalautotest-3.0.4/ogr/data/test_uncompressed_dense_true_nometadata.pbf0000644003401500001440000000120013614004466026176 0ustar rouaultusers OSMHeader= 9"OsmSchema-V0.6" DenseNodes0.44.1-9-ge5d77d4-SNAPSHOT9 OSMData   type name inner multipolygon bar area yes outer foo natural wood standalone_polygon Some interesting point id_6 motorway forest id_4 id_5 baz highway other_type routeXV B  zJ zzzR  B  BB B  BB B Bn" B JR"B JR"BJR"BJR"B JRdgdalautotest-3.0.4/ogr/data/test_default_val.gdb.zip0000644003401500001440000005716013614004466022151 0ustar rouaultusersPK DFtest_default_val.gdb/UT BTBTux PK zDFP<1P+test_default_val.gdb/a00000006.FDO_UUID.atxUT )T)Tux A e |--Rݣ"ff9&-k 5YO+ZkHK1z%oOPK zDF"bA^ 'test_default_val.gdb/a00000007.gdbtablxUT )T)Tux M @E7{#6!l!,`Xĥ!\ L4|cSij+CԥԩP}^GYrϭ̅Rs*ce!|PK zDFi|+test_default_val.gdb/a00000004.FDO_UUID.atxUT )T)Tux 10PK7$FCKE{v ?aBbtJ)=ו rº>dp_#yTnE6*oNn*-^ƔA֔IvVk궎Pλ/x}~OPK zDF/) 'test_default_val.gdb/a00000003.gdbtablxUT )T)Tux  V?-8$pըVuzv| PK zDF0#"test_default_val.gdb/a00000009.spxUT )T)Tux ȱ @1~, cd(urPK zDF./test_default_val.gdb/gdbUT )T)Tux PK zDFd,C=test_default_val.gdb/a00000007.CatRelTypesByBackwardLabel.atxUT )T)Tux }J@_qܥEbjh xTk@D dkf71Npv@R{uJ ]꨹o@mS'5}jDmg9 <"x i))W$W,l*LOQѯ#یfL˅/Tĺצpod"lO_NF{5kU\4Q]ܒWFM*w%GK\|m9:q)>:J/|_: o|3L_fܹt2Oo>5#LJ:ݟ# *gz뭷dV `PK zDFA 'test_default_val.gdb/a00000001.gdbtablxUT )T)Tux A D`[v0La%`iƪzsomړ#9+'Y_woPK zDFnwE'test_default_val.gdb/a00000003.gdbtableUT )T)Tux cf```@ʀߘ g1x<\X؂B\"$P`scHda(fH 30s"DBD#P/iI>HYZKVmm8"g Yqם7CZTh[9350kLǁS43V R &/<(GqK2Ђ*oft'^=(YӝJ(+)ZHu(Q[8\,֛t1%:7ulk^^w^K3fzK^׳:~v:@NU*X8c:Rw6?E&㘆qH$I?2n뎗rpS XK;Eedbuh26'-h'PgUm-@>B2Lr˱Zy }`gͯu3BYҧ"99\IzuJh`uA2'2E2,vBՄ]Ӷ"W e&V4:-)1XJmUc%IhW$v{vVC wmߊZpǃm-$U%hm)b9.[dٞgaf>ldzЂG ג{uNd7G G>Yzֳg=XWPK zDF Zg=test_default_val.gdb/a00000005.CatItemTypesByParentTypeID.atxUT )T)Tux j0awy]kj)K/=i]٥~ l $]ugO k [ ; Gp ppwp/p < \:\JyJIJ$U1h=qv}C(mV?aŇQtFP(UV%lE+a3RBlm єiNW+e6L,SbNQw ޒ}XMU1>j11[!oNE2%*iyP7]wqjZ_׿wPK zDFӰ 6)test_default_val.gdb/a00000004.gdbindexesUT )T)Tux u @F`d!tcvAB7>}[.gYfNd8q On\8*&Ok([.SR|l7:Ysԛ#k ;zRF*16xb˨Ciɵv?OPK zDFݦr()test_default_val.gdb/a00000005.gdbindexesUT )T)Tux ca``b7x NbbHeHf(a10@1兀ؙ!/20T2Y N@V(BT21$ FK0!(Wea2&[!7rO?_gM.|\ 7myxC^ Gժfq( \Te17MU` Zβbd^Z皫猱{Vdջ*=p.RaK_KV|v ` yvR2 RX`N&9ʪ`2e%Xxʬi3[zhK.A?nJ0*Pi=K0z W)4 4R Gsƺxβ=HT8ײ~|hsVepsQs4?rqqqqqqqqqqg|E_wPK zDF$ 'test_default_val.gdb/a00000002.gdbtablxUT )T)Tux - QF;+u8t܂p6 -S-`;0S>7O)eYl ^0嶀5OTp/yP>0 \ _n(d,34`fffffffffuPK zDFmy<test_default_val.gdb/a00000007.CatRelTypesByForwardLabel.atxUT )T)Tux Yn0 ,!Z^0+w|o톉VΉ>3JeNcLINhmDo<݁o>j3(##=o3, g?7o޼]W_PK zDF>)test_default_val.gdb/a00000006.gdbindexesUT )T)Tux m] AFؔ+%$uׯ3&vg3>4}`( rVdυ#^,`,Uqͤ][gT\=)tMR2əZj>MKW|{"q X%6MPK zDFD05test_default_val.gdb/a00000005.CatItemTypesByName.atxUT )T)Tux NAE}>` }$j\0ުn銩["'[u#< *@Uz% D1'x&d2L&d2WO(3)x ^w->9xހgEx%x>2 ձ߯zkoE֟E2z_S2Ew_Fx)=wy^ZDCAESM]m|zUeM|uje%fH:[?ikaǵK,U`ڸ(dW5v˿Ӵ;X </ w缣%ZizMΙVyN/ueUQ'N6_$;2~6ӤՄ+fp;%+h_ڙT0L&d2 _PK zDFm</test_default_val.gdb/a00000001.TablesByName.atxUT )T)Tux M0ނMP񨾶ѸyCiX|³`̆Y2+&cR&}-8` g(ON+k=4.PsAϪ~O;?;ז(8݆:[gmE'3.i]4}zAA'pbPK zDFc|Sj9'test_default_val.gdb/a00000004.gdbtableUT )T)Tux [o_tbX`%咢Dk4IɌE )#wHܥw@ (rh Ԁ=ǡhFff?IJ`N9μ7޼fvsLc{<Bs;Ϟ/z@ x&yD]n DPʂLhbC`ϝ9h ©3ĺ $¾ |GA*BhHAeJP gK\އ,G30i9TS JH m2 mMaͯ* ¯%p2;0ˤ"U`z= TC)0OnTg'[`!Yٹ#BE B U[U(SBNXSQhÌ(<e8[22dL ))? ,/%Dn5^㣵A4.u>nR1J~ 1恖>KI}+Yd^!~b[x~_n=Pߘ룯~}e.>x_` { B_m_3QW?o/5~^Zm3'ZgvɫVXJs=G?Ʌyk:Byqo` 0;<'ILҲ{R:kVOYt\ ò#xzc $"hwV-IN%RR]հz n*RRP$(uCYFBW5-t׻ )`kVG5 z[uV(2hv\oVZ.p1F2Mquln:N (Ukщ2uy 6m.ラ$,(5eo"EJM7Z ri{!v4j 3?.?}is .?K'½c`n^G 8n]i"z;FEλBTwd:o1WF'3\Fu;t6 LR[ ͻu@A꽑^!1@n#&*4JNLFJẀ)UաH[+RZVYYm Ieozc[!:1N@SjF;)nZaO:#P V·}&/LRt7,ӯ+RDOf(=+*sl kO3Qhn{%NtʙmH"(:2MqvAc[;*gϣPΤ MyP5]#T+;9Y.-rQ#x}A^h$O3 0>%Vʼn3&Zmd:9Z,2O$KSL&Al!Mk$O$bҮ*6 8a՝mŴ&t6-MhhF̞۟8}'r5xi­Mi*3Spdzf_ɦ3ٌMYY.^ΦRTve^} iV*ڼ$&1h!MQ -%Sۤ5eEEl iam&)^)|KhMqQ*{. G!]}v".h:?5hHc4xږaFp0cN?OLBϳsҸWݶ`}J ;8S)=lqbDI5FAB\ZiH6%iQEn!]!e Y"l 秈rQnPJk+<N{q3BUp׉w(Ga;rq.s{wܥ*1t+-):-_PW%k$]bs!gþ)YpMp>tJZZ;PuuuKeFqfq҄3,ǸK圜YN\2]NnZh4!{RWmB]RzJzb6.Bq}ެFk3饭-EBMku[Y.R`Q^SG^MvQ!佟${)72Ͳ#(7BdAEh[W!0e9MYa& 0ʍ ´/DQjcE ttzK×KkYfOwG-r)0 dM 9Dsaov?ϼлK}÷a"{Wta2SarLo d;@V"/0 s]{DrNT:a %Q&& 9/e{.XS(}SGZxuzUN i`Q!͍X8&9GJ0gBK;j/ڬ$ݼy~ټپqN_{dV/Ӷ +(CreDҗZ"!:qw-"y(2CC5 LErz=t3 핊 0u׉@fods"EE@GrmU;McmO[3=< 4ÒOBO(O!ʧM@U`p4`4,lE@.HWЌ04eqC4_80dd!nD$"6YN-*6AN-"'49DrE"H:D61dm 6K$b1R#Y#R-c}{#PY~X@dJG 6P܅` H)Pp5D%У +̣@Kc)F*c*(2q:wl˱xU75kEZU\J FK)EE|^ND33_&xņ$#M%K#^bW"apYimB(]ZIwy4]cR X4RIM~PV @,qaTlYÁ MsOEܰ2q >g4q X.}%[[1_YȿcyB򤠛v^ہ 1e1e\ɫ#X7uD

dIcӐ}0[E %Aj_<Pj'Eg3 ]ӏ_Wچq˿,zf0rAzK45 >jx3O0iI Y~OjFx(crtW!M@c`W>i<ᠩ#TOg08z֊Q97EWS=.PK zDF , 'test_default_val.gdb/a00000004.gdbtablxUT )T)Tux Ɓ .Fh N!w!="Zֳ:f^PK zDFpzBt)test_default_val.gdb/a00000009.gdbindexesUT )T)Tux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK zDFeo'test_default_val.gdb/a00000002.gdbtableUT )T)Tux Uo@>եAkcgfLvD \/la0@oQل{y~m䩃Xw7t|-"$A@S|m!MpB\bw2֠1Rp#{9HDmÕWTZ{ҕQ׫~$yC *HiM!ڛYSmCjMyK"RޤN ]i;}9=9:R[ |wq": œNOxOC,(/]g1VlbgbN/,նVγU!M(p <*d{!2Ǻf[j\$@~*ȲjTGJi#6s!D/2#9=A8\Y8+oE񃻸ZƔwDv5V:U(TaPSӆ2*(-v=NsQUy+7sZA7()O :1lQ9;7U;?f,&B|ŕBFUwqW_PK zDF4BxO4test_default_val.gdb/a00000006.CatRelsByOriginID.atxUT )T)Tux 1 0D2v !k/%]Tor&jMzȩŲEdJߌ>PK zDFR kQ9test_default_val.gdb/a00000004.CatItemsByPhysicalName.atxUT )T)Tux 1 0DH"beir FyW%-R4bgm%CtI礹Kly2CtI&Q+F<T&^ž܍4[:TsLҽl@i vOVVH(AUfz-rɤBlɳ;<>0})SOU,m" mˣs"C5ҨQ]֖`F%˵"6٫r;*j8Tiʑ#eJJ+GŞRY|^yMjIILR嚄^]0]pX~;5b[e׸jv<W+N,đusTl\+/Ԡ~=*|YSig~PK zDF˖Pn)test_default_val.gdb/a00000001.gdbindexesUT )T)Tux cb```b7xO 3I& qC"CCC*C1C% A10tpЬpW  M8PK zDF O0test_default_val.gdb/a00000006.CatRelsByType.atxUT )T)Tux 1 0D2vCv.*7L9툈Lx-lݲTk⑪ڽ[1z%oOPK zDF 'test_default_val.gdb/a00000009.gdbtablxUT )T)Tux cf@VLPK zDFӴPA4test_default_val.gdb/a00000007.CatRelTypesByName.atxUT )T)Tux N@4 yTvzu|NiӋ> ky\ߣ8 NVWx26z);z* 1Y*o 7㭯8J&{׬#OmƗ&_Ц[mGMIlM̘if8jv-mk-o:Dna"W.?;i}/?PK zDF\84>test_default_val.gdb/a00000007.CatRelTypesByDestItemTypeID.atxUT )T)Tux An1 F(PJivgɥFszh,'y)#eq:^ Çg) Oٻs1ïNnmj48hC{,jS5UhlMD1Ǵ[_v)T̽R` la>c RP]y#11U; (b%WTbKix>Cd0Ԗk)W) WVKt_ĎH RNsTS<;xQ9N5 JIsZ1Ӣ) d\`LjZܜz>]l6fl6?/oPK zDFdZ)test_default_val.gdb/a00000007.gdbindexesUT )T)Tux ] @EOCE=VgL #-+L~]WȰr:{̺[R س!$a,:RVnH4bL9w.89W%{:5>1;I|"?zm\%3*iV>Y{7cL Z/o\ZQ&CKPK zDF\ b 'test_default_val.gdb/a00000005.gdbtableUT )T)Tux cf``P( fe@nvY@ FϐĐŐʐP p0$2UU0T20I?d.Pe\-ni4T{11Vc΅T&Ԭ;%$8DrPaY[U'^t?vt!9镺@?RoDL?:W9jwtw3-:&%&$&太u{]ijتʔ:iƢK=$??')Bvqs4hތdβa|A%E0cCv=]c$=߷eԜbPFOWײUw_cqGPjq~)7asG4D T`N@N:^t޼ n%E'iyLi=&D089#5x>Bw .xh!G}z|'wo\<{vwPθ˙.7•!JvO6luy#z礤TT˥}*v?*=ң]dVZKնĄƑ:{KYd0:JrU@%L}5uhI Haɘ E;{3+j_uuK'mYԪr#^#C%QS@ 4MjvpB|$vp53&RFE(NŬ'*X>dWS6x.:$ayvlq͍=O2ŋuR&zӦ, 36"RHoBo"DK'"!I;!Ek8e~Վ;qu_"sBOt4h89R(mro㲻1'~3)&+GCGN[N l"̖5vupʵ۟} 'z߈.t˟Ǒ$˝ȡt͑bӱT.iEhe× ?Ʊp9@'Qi9v9SftV*h>C(kЋm{T[a k?(MTf Ə |űvmʖk>GG9rvA>c> 6P5׫j0%.M![+A{Vyq;x-9ݠLkL]9qeKTIoxazXƧ:щ(?^k/QeP j*Zbgk<A ȝtL<1PK zDFOsJ% 'test_default_val.gdb/a00000006.gdbtablxUT )T)Tux  ̦_Bf`KL2^uZ~?PK zDF O9test_default_val.gdb/a00000006.CatRelsByDestinationID.atxUT )T)Tux 9 @D2f =t2.*7&=YMm km7'PK zDFYe1test_default_val.gdb/a00000004.CatItemsByType.atxUT )T)Tux =0`K7$bFKE{v } BxwQHܨj4JڌM]{?E|S)q򕗕:Fu|6NYS-QMɦٷo/PK DFAtest_default_val.gdb/UTBTux PK zDFP<1P+Otest_default_val.gdb/a00000006.FDO_UUID.atxUT)Tux PK zDF"bA^ 'test_default_val.gdb/a00000007.gdbtablxUT)Tux PK zDFi|+test_default_val.gdb/a00000004.FDO_UUID.atxUT)Tux PK zDF/) 'test_default_val.gdb/a00000003.gdbtablxUT)Tux PK zDF0#"6test_default_val.gdb/a00000009.spxUT)Tux PK zDF./test_default_val.gdb/gdbUT)Tux PK zDFd,C= test_default_val.gdb/a00000007.CatRelTypesByBackwardLabel.atxUT)Tux PK zDFA 'test_default_val.gdb/a00000001.gdbtablxUT)Tux PK zDFnwE'gtest_default_val.gdb/a00000003.gdbtableUT)Tux PK zDF? g5 test_default_val.gdb/a00000005.CatItemTypesByUUID.atxUT)Tux PK zDF Zg= test_default_val.gdb/a00000005.CatItemTypesByParentTypeID.atxUT)Tux PK zDFӰ 6)s test_default_val.gdb/a00000004.gdbindexesUT)Tux PK zDFݦr()Ytest_default_val.gdb/a00000005.gdbindexesUT)Tux PK zDF@.test_default_val.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxUT)Tux PK zDF$ '+test_default_val.gdb/a00000002.gdbtablxUT)Tux PK zDFmy<test_default_val.gdb/a00000007.CatRelTypesByForwardLabel.atxUT)Tux PK zDF>)test_default_val.gdb/a00000006.gdbindexesUT)Tux PK zDFD05otest_default_val.gdb/a00000005.CatItemTypesByName.atxUT)Tux PK zDFm</test_default_val.gdb/a00000001.TablesByName.atxUT)Tux PK zDFc|Sj9' test_default_val.gdb/a00000004.gdbtableUT)Tux PK zDF , '@'test_default_val.gdb/a00000004.gdbtablxUT)Tux PK zDFpzBt)'test_default_val.gdb/a00000009.gdbindexesUT)Tux PK zDFeo'r(test_default_val.gdb/a00000002.gdbtableUT)Tux PK zDF4BxO4T+test_default_val.gdb/a00000006.CatRelsByOriginID.atxUT)Tux PK zDFR kQ9,test_default_val.gdb/a00000004.CatItemsByPhysicalName.atxUT)Tux PK zDF$ ',test_default_val.gdb/a00000005.gdbtablxUT)Tux PK zDFV'-test_default_val.gdb/a00000006.gdbtableUT)Tux PK zDF0#".test_default_val.gdb/a00000004.spxUT)Tux PK zDF@4_/test_default_val.gdb/a00000007.CatRelTypesByUUID.atxUT)Tux PK zDF)!*)1test_default_val.gdb/a00000003.gdbindexesUT)Tux PK zDFj;2test_default_val.gdb/timestampsUT)Tux PK zDFWw'2test_default_val.gdb/a00000009.gdbtableUT)Tux PK zDF˖Pn)4test_default_val.gdb/a00000001.gdbindexesUT)Tux PK zDF O0K5test_default_val.gdb/a00000006.CatRelsByType.atxUT)Tux PK zDF '6test_default_val.gdb/a00000009.gdbtablxUT)Tux PK zDFӴPA4n6test_default_val.gdb/a00000007.CatRelTypesByName.atxUT)Tux PK zDF\84>8test_default_val.gdb/a00000007.CatRelTypesByDestItemTypeID.atxUT)Tux PK zDFdZ)9test_default_val.gdb/a00000007.gdbindexesUT)Tux PK zDF\ b ':test_default_val.gdb/a00000005.gdbtableUT)Tux PK zDF7?test_default_val.gdb/_gdb.COMPUTER-PC.1836.2492.sr.lockUT)Tux PK zDFj< e;' @test_default_val.gdb/a00000001.gdbtableUT)Tux PK zDF7.Atest_default_val.gdb/test.COMPUTER-PC.1836.2492.sr.lockUT)Tux PK zDFR[( 'Atest_default_val.gdb/a00000007.gdbtableUT)Tux PK zDFOsJ% '(Gtest_default_val.gdb/a00000006.gdbtablxUT)Tux PK zDF O9Gtest_default_val.gdb/a00000006.CatRelsByDestinationID.atxUT)Tux PK zDFYe1pHtest_default_val.gdb/a00000004.CatItemsByType.atxUT)Tux PK//aIgdalautotest-3.0.4/ogr/data/archsites.gml0000644003401500001440000000355213614004466020027 0ustar rouaultusers 589860.0 4914479.0 608355.0 4926490.0 593493.0 4914730.0 593493.0 4914730.0 1 Signature Rock 593493.0 4914730.0 gdalautotest-3.0.4/ogr/data/gmlas/0000755003401500001440000000000013614005344016433 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/gmlas/gmlas_invalid_schema.xsd0000644003401500001440000000035113614005335023303 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_two_subst.xml0000644003401500001440000000046513614005335026417 0ustar rouaultusers baz gdalautotest-3.0.4/ogr/data/gmlas/gmlas_identifier_truncation.xsd0000644003401500001440000000266513614005335024737 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_schema_without_namespace_prefix_non_http_uri.xsd0000644003401500001440000000056613614005335031551 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_validate.xml0000644003401500001440000000035713614005336022137 0ustar rouaultusers bar gdalautotest-3.0.4/ogr/data/gmlas/gmlas_no_namespace.xsd0000644003401500001440000000047313614005336022773 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1_generated.xml0000644003401500001440000002305113614005336023420 0ustar rouaultusers 12 element_id element_string element_string_array 2nd element_string_array 3 3 4 123456789012 123456789012 123456789013 1.23 2.34 3.45 1.23456789012 2.3456 3.4578 1.23456789012 -128 -32768 1 2012-01-01T12:34:56Z 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-01 12:34:56 true true false YmFzZTY0QmluYXJ5 68657842696E617279 10 1 2 3 42 a b c true false 1 2 3 123456789012 2 3 1.25 2.5 5 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z element_compound_simplifiable_subelement2 sequence_1_string_unbounded_1 sequence_1_string_unbounded_2 sequence_unbounded_string_1 sequence_unbounded_string_2 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-03T12:34:56Z 2012-01-04T12:34:56Z 2016-01-01T12:34:56Z 2016-01-02T12:34:56Z 2016-01-03T12:34:56Z 2016-01-04T12:34:56Z sequence_1_unbounded_with_2_subelts_1 sequence_1_unbounded_with_2_subelts_2 sequence_1_unbounded_non_simplifiable_1_1 sequence_1_unbounded_non_simplifiable_1_2 sequence_1_unbounded_non_simplifiable_2_1 sequence_1_unbounded_non_simplifiable_2_2 sequence_unbounded_1_with_2_subelts_1 sequence_unbounded_1_with_2_subelts_2 sequence_with_attr_unbounded_1 sequence_with_attr_unbounded_2 10 20 3 5 4 3 A<blowC 1 2 group1_elt_1_1_1 group1_elt_1_1_2 group1_elt_2_1_1 group1_elt_1_2_1 group1_elt_2_2_1 group2_elt_1 sixthelement sixthelementbis sixthelement_a_b sixthelement_a_b2 2016-01-01T12:34:56Z 2016-01-02T12:34:56Z sixthelement2 sixthelement3 sixthelement3_a_b sixthelement_a_b2 sixthelement4 2016-01-03T12:34:56Z 2016-01-04T12:34:56Z group4_elt_1 group4_elt_2 elt_A4 elt_B3 elt_A3 elt_B2 elt_A2 elt_B elt_A gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1_otherns.xsd0000644003401500001440000000202113614005336023134 0ustar rouaultusers Doc myAttrType gdalautotest-3.0.4/ogr/data/gmlas/gmlas_fake_gml32.xsd0000644003401500001440000001017713614005336022257 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_invalid_xml.xml0000644003401500001440000000027213614005336022650 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_dataarray.xsd0000644003401500001440000000064713614005336023174 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_aux_schema_without_namespace_prefix.xml0000644003401500001440000000062113614005336027631 0ustar rouaultusers bar 1 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_unexpected_repeated_element_variant.xml0000644003401500001440000000050613614005336027614 0ustar rouaultusers foo_first bar foo_again gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_one_subst_no_repetition.xsd0000644003401500001440000000110513614005336031314 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_geometry_as_substitutiongroup.xml0000644003401500001440000000051013614005336026564 0ustar rouaultusers 5 6 gdalautotest-3.0.4/ogr/data/gmlas/real_world/0000755003401500001440000000000013614004466020571 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/gmlas/real_world/output/0000755003401500001440000000000013614004466022131 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/gmlas/real_world/output/Piezometre.06512X0037.STREMY.2.txt0000644003401500001440000047161413614004466027332 0ustar rouaultusersINFO: Open of `GMLAS:data/gmlas/real_world/Piezometre.06512X0037.STREMY.2.gml' using driver `GMLAS' successful. Layer name: environmentalmonitoringfacility Geometry (geometry): Unknown (any) Geometry (representativepoint): Point Feature Count: 1 Extent (geometry): (5.187133, 46.190954) - (5.187133, 46.190954) Extent (representativepoint): (5.187133, 46.190954) - (5.187133, 46.190954) SRS WKT (geometry): 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"]] Data axis to CRS axis mapping: 2,1 SRS WKT (representativepoint): 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"]] Data axis to CRS axis mapping: 2,1 Geometry Column 1 = geometry Geometry Column 2 = representativepoint id: String (0.0) NOT NULL description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) inspireid_pkid: String (0.0) additionaldescription_nilreason: String (0.0) additionaldescription_nil: Integer(Boolean) (0.0) additionaldescription: String (0.0) broader_pkid: String (0.0) measurementregime_owns: Integer(Boolean) (0.0) DEFAULT 'false' measurementregime_href: String (0.0) measurementregime_title: String (0.0) measurementregime_nilreason: String (0.0) mobile_nilreason: String (0.0) mobile: Integer(Boolean) (0.0) specialisedemftype_owns: Integer(Boolean) (0.0) DEFAULT 'false' specialisedemftype_href: String (0.0) specialisedemftype_title: String (0.0) specialisedemftype_nilreason: String (0.0) OGRFeature(environmentalmonitoringfacility):1 id (String) = Piezometre.06512X0037.STREMY.2 description (String) = Water well from national BSS (Banque du Sous-Sol) Data database. Piezometer monitoring ground water level identifier_codespace (String) = http://www.ietf.org/rfc/rfc2616 identifier (String) = http://ressource.brgm-rec.fr/data/Piezometre/06512X0037/STREMY.2 inspireid_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_inspireId_1 broader_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_broader_1 measurementregime_owns (Integer(Boolean)) = 0 mobile (Integer(Boolean)) = 0 specialisedemftype_owns (Integer(Boolean)) = 0 specialisedemftype_href (String) = http://www.sandre.eaufrance.fr/urn.php?urn=urn:sandre:dictionnaire:PTE::entite:Piezometre:ressource:2.1:::html specialisedemftype_title (String) = Piezometre geometry = POINT (5.18713262971692 46.1909541655103) representativepoint = POINT (5.18713262971692 46.1909541655103) Layer name: environmentalmonitoringfacility_ef_name Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL nilreason: String (0.0) value: String (0.0) NOT NULL OGRFeature(environmentalmonitoringfacility_ef_name):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_name_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 value (String) = Piézomètre de St-Rémy - 01 Layer name: environmentalmonitoringfacility_mediamonitored Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(environmentalmonitoringfacility_mediamonitored):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_mediaMonitored_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 href (String) = http://inspire.ec.europa.eu/codelist/MediaValue/water title (String) = water Layer name: environmentalmonitoringfacility_onlineresource Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL nilreason: String (0.0) value: String (0.0) NOT NULL OGRFeature(environmentalmonitoringfacility_onlineresource):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_onlineResource_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 value (String) = http://fichebsseau.brgm.fr/bss_eau/fiche.jsf?code=06512X0037/STREMY Layer name: environmentalmonitoringfacility_purpose Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(environmentalmonitoringfacility_purpose):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_purpose_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 href (String) = http://www.sandre.eaufrance.fr/?urn=urn:sandre:donnees:148::CdElement:2:::referentiel:3.1:xml title (String) = Ground water level measurement Layer name: environmentalmonitoringfacility_supersedes Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' abstractmonitoringobject_environmentamonitoringfacility_pkid: String (0.0) abstractmonitoringobject_environmentalmonitoringnetwork_pkid: String (0.0) abstractmonitoringobject_environmentmonitoringprogramme_pkid: String (0.0) OGRFeature(environmentalmonitoringfacility_supersedes):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_supersedes_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 Layer name: environmentalmonitoringfacility_supersededby Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' abstractmonitoringobject_environmentamonitoringfacility_pkid: String (0.0) abstractmonitoringobject_environmentalmonitoringnetwork_pkid: String (0.0) abstractmonitoringobject_environmentmonitoringprogramme_pkid: String (0.0) OGRFeature(environmentalmonitoringfacility_supersededby):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_supersededBy_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 Layer name: environmentalmonitoringfacility_resultacquisitionsource Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(environmentalmonitoringfacility_resultacquisitionsource):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_resultAcquisitionSource_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 href (String) = http://inspire.ec.europa.eu/codelist/ResultAcquisitionSourceValue/inSitu/ title (String) = in-situ Layer name: environmentalmonitoringfacility_operationalactivityperiod Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' operationalactivityperiod_pkid: String (0.0) OGRFeature(environmentalmonitoringfacility_operationalactivityperiod):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_operationalActivityPeriod_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 operationalactivityperiod_pkid (String) = Piezometre.OperationalActivityPeriod.2.06512X0037-STREMY Layer name: environmentalmonitoringfacility_relatedto Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) anydomainlink_id: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' anydomainlink_description_href: String (0.0) anydomainlink_description_title: String (0.0) anydomainlink_description_nilreason: String (0.0) anydomainlink_description: String (0.0) anydomainlink_descriptionreference_href: String (0.0) anydomainlink_descriptionreference_title: String (0.0) anydomainlink_descriptionreference_nilreason: String (0.0) anydomainlink_identifier_codespace: String (0.0) anydomainlink_identifier: String (0.0) anydomainlink_comment_nilreason: String (0.0) anydomainlink_comment: String (0.0) anydomainlink_relatedto_href: String (0.0) anydomainlink_relatedto_title: String (0.0) anydomainlink_relatedto_nilreason: String (0.0) anydomainlink_relatedto_owns: Integer(Boolean) (0.0) DEFAULT 'false' anydomainlink_relatedto_environmentalmonitoringfacility_pkid: String (0.0) OGRFeature(environmentalmonitoringfacility_relatedto):1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 anydomainlink_relatedto_owns (Integer(Boolean)) = 0 Layer name: environmentalmonitoringfacility_belongsto Geometry: None Feature Count: 8 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' networkfacility_pkid: String (0.0) OGRFeature(environmentalmonitoringfacility_belongsto):1 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_1 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e65 OGRFeature(environmentalmonitoringfacility_belongsto):2 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_2 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e64 OGRFeature(environmentalmonitoringfacility_belongsto):3 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_3 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e63 OGRFeature(environmentalmonitoringfacility_belongsto):4 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_4 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e62 OGRFeature(environmentalmonitoringfacility_belongsto):5 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_5 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e61 OGRFeature(environmentalmonitoringfacility_belongsto):6 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_6 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e60 OGRFeature(environmentalmonitoringfacility_belongsto):7 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_7 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e5f OGRFeature(environmentalmonitoringfacility_belongsto):8 ogr_pkid (String) = Piezometre.06512X0037.STREMY.2_belongsTo_8 parent_id (String) = Piezometre.06512X0037.STREMY.2 owns (Integer(Boolean)) = 0 networkfacility_pkid (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e5e Layer name: operationalactivityperiod Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) id: String (0.0) NOT NULL description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) activitytime_href: String (0.0) activitytime_title: String (0.0) activitytime_nilreason: String (0.0) activitytime_owns: Integer(Boolean) (0.0) DEFAULT 'false' activitytime_abstracttimeobject_timeinstant_pkid: String (0.0) activitytime_abstracttimeobject_timeperiod_pkid: String (0.0) activitytime_abstracttimeobject_timenode_pkid: String (0.0) activitytime_abstracttimeobject_timeedge_pkid: String (0.0) activitytime_abstracttimeobject_timetopologycomplex_pkid: String (0.0) OGRFeature(operationalactivityperiod):1 id (String) = Piezometre.OperationalActivityPeriod.2.06512X0037-STREMY activitytime_owns (Integer(Boolean)) = 0 activitytime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.2.225196 Layer name: timeperiod Geometry: None Feature Count: 9 Layer SRS WKT: (unknown) id: String (0.0) NOT NULL frame: String (0.0) DEFAULT '#ISO-8601' description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) beginposition_frame: String (0.0) DEFAULT '#ISO-8601' beginposition_calendareraname: String (0.0) beginposition_indeterminateposition: String (0.0) beginposition: String (0.0) begin_href: String (0.0) begin_title: String (0.0) begin_nilreason: String (0.0) begin_owns: Integer(Boolean) (0.0) DEFAULT 'false' begin_timeinstant_pkid: String (0.0) endposition_frame: String (0.0) DEFAULT '#ISO-8601' endposition_calendareraname: String (0.0) endposition_indeterminateposition: String (0.0) endposition: String (0.0) end_href: String (0.0) end_title: String (0.0) end_nilreason: String (0.0) end_owns: Integer(Boolean) (0.0) DEFAULT 'false' end_timeinstant_pkid: String (0.0) duration: String (0.0) timeinterval_unit: String (0.0) timeinterval_radix: Integer (0.0) timeinterval_factor: Integer (0.0) timeinterval: Real (0.0) OGRFeature(timeperiod):1 id (String) = TimePeriod.2.225196 frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 endposition (String) = 2014-10-14T06:00:00Z end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):2 id (String) = TimePeriod.0000000029.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-09-30T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):3 id (String) = TimePeriod.0600000004.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-09-30T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):4 id (String) = TimePeriod.0600000007.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):5 id (String) = TimePeriod.0600000215.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):6 id (String) = TimePeriod.0600000233.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):7 id (String) = TimePeriod.0000000070.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):8 id (String) = TimePeriod.0000000131.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1991-10-12T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 OGRFeature(timeperiod):9 id (String) = TimePeriod.0000000073.06512X0037-STREMY frame (String) = #ISO-8601 beginposition_frame (String) = #ISO-8601 beginposition (String) = 1977-10-08T23:00:00Z begin_owns (Integer(Boolean)) = 0 endposition_frame (String) = #ISO-8601 end_owns (Integer(Boolean)) = 0 Layer name: ef_inspireid Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL identifier_localid: String (0.0) NOT NULL identifier_namespace: String (0.0) NOT NULL identifier_versionid_nilreason: String (0.0) identifier_versionid_nil: Integer(Boolean) (0.0) identifier_versionid: String (0.0) OGRFeature(ef_inspireid):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_inspireId_1 identifier_localid (String) = Piezometre/06512X0037/STREMY.2 identifier_namespace (String) = http://ressource.brgm-rec.fr/data Layer name: legalbackground Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' legislationcitation_pkid: String (0.0) OGRFeature(legalbackground):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_legalBackground_1 owns (Integer(Boolean)) = 0 Layer name: broader Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' hierarchy_pkid: String (0.0) OGRFeature(broader):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_broader_1 owns (Integer(Boolean)) = 0 Layer name: reportedto Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL nilreason: String (0.0) reporttolegalact_legalact_href: String (0.0) reporttolegalact_legalact_title: String (0.0) reporttolegalact_legalact_nilreason: String (0.0) reporttolegalact_legalact_owns: Integer(Boolean) (0.0) DEFAULT 'false' reporttolegalact_legalact_legislationcitation_pkid: String (0.0) reporttolegalact_reportdate_nilreason: String (0.0) reporttolegalact_reportdate: DateTime (0.0) reporttolegalact_reportedenvelope_nilreason: String (0.0) reporttolegalact_reportedenvelope_nil: Integer(Boolean) (0.0) reporttolegalact_reportedenvelope: String (0.0) reporttolegalact_observationrequired_nilreason: String (0.0) reporttolegalact_observationrequired: Integer(Boolean) (0.0) reporttolegalact_observingcapabilityrequired_nilreason: String (0.0) reporttolegalact_observingcapabilityrequired: Integer(Boolean) (0.0) reporttolegalact_description_nilreason: String (0.0) reporttolegalact_description_nil: Integer(Boolean) (0.0) reporttolegalact_description: String (0.0) OGRFeature(reportedto):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_reportedTo_1 nilreason (String) = http://inspire.ec.europa.eu/codelist/VoidReasonValue/Unpopulated reporttolegalact_legalact_owns (Integer(Boolean)) = 0 Layer name: hasobservation Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) om_observation_pkid: String (0.0) OGRFeature(hasobservation):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_1 href (String) = http://ressource.brgm-rec.fr/obs/RawOfferingPiezo/06512X0037/STREMY.2&responseFormat=http://www.opengis.net/waterml/2.0&temporalFilter=om%3AphenomenonTime%2Clatest title (String) = Latest value (WaterML 2.0 format): Raw groundwater level measurement from piezometer 06512X0037/STREMY.2 OGRFeature(hasobservation):2 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_2 href (String) = http://ressource.brgm-rec.fr/obs/RawOfferingPiezo/06512X0037/STREMY.2&responseFormat=application/json&temporalFilter=om%3AphenomenonTime%2Clatest title (String) = Latest value (JSON format): Raw groundwater level measurement from piezometer 06512X0037/STREMY.2 OGRFeature(hasobservation):3 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_3 href (String) = http://ressource.brgm-rec.fr/obs/RawOfferingPiezo/06512X0037/STREMY.2&responseFormat=http://www.opengis.net/waterml/2.0 title (String) = All observations (WaterML 2.0 format): Raw groundwater level measurement from piezometer 06512X0037/STREMY.2 OGRFeature(hasobservation):4 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_4 href (String) = http://ressource.brgm-rec.fr/obs/RawOfferingPiezo/06512X0037/STREMY.2&MergeObservationsIntoDataArray=true title (String) = SWEArrayObservation: Raw groundwater level measurement from piezometer 06512X0037/STREMY.2 Layer name: involvedin Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' environmentalmonitoringactivity_pkid: String (0.0) OGRFeature(involvedin):1 ogr_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_involvedIn_1 owns (Integer(Boolean)) = 0 Layer name: networkfacility Geometry: None Feature Count: 8 Layer SRS WKT: (unknown) id: String (0.0) NOT NULL description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) linkingtime_href: String (0.0) linkingtime_title: String (0.0) linkingtime_nilreason: String (0.0) linkingtime_owns: Integer(Boolean) (0.0) DEFAULT 'false' linkingtime_abstracttimeobject_timeinstant_pkid: String (0.0) linkingtime_abstracttimeobject_timeperiod_pkid: String (0.0) linkingtime_abstracttimeobject_timenode_pkid: String (0.0) linkingtime_abstracttimeobject_timeedge_pkid: String (0.0) linkingtime_abstracttimeobject_timetopologycomplex_pkid: String (0.0) belongsto_href: String (0.0) belongsto_title: String (0.0) belongsto_nilreason: String (0.0) belongsto_owns: Integer(Boolean) (0.0) DEFAULT 'false' belongsto_environmentalmonitoringnetwork_pkid: String (0.0) contains_href: String (0.0) contains_title: String (0.0) contains_nilreason: String (0.0) contains_owns: Integer(Boolean) (0.0) DEFAULT 'false' contains_environmentalmonitoringfacility_pkid: String (0.0) OGRFeature(networkfacility):1 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e65 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0000000029.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0000000029 belongsto_title (String) = Réseau patrimonial national de suivi quantitatif des eaux souterraines(RNESP) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):2 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e64 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0600000004.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0600000004 belongsto_title (String) = Réseau de suivi quantitatif des eaux souterraines du bassin Rhône-Méditerranée(RBESOUPRMC) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):3 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e63 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0600000007.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0600000007 belongsto_title (String) = Réseau de suivi quantitatif des eaux souterraines de la région Rhône-Alpes(RRESOUPRHA ) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):4 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e62 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0600000215.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0600000215 belongsto_title (String) = Réseau de suivi quantitatif des eaux souterraines du BRGM Rhône-Alpes(RESOUPBRGMRHA) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):5 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e61 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0600000233.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0600000233 belongsto_title (String) = Surveillance de l'état quantitatif des eaux souterraines du bassin Rhône et cours d'eaux côtiers méditérranéen(FRDSOP) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):6 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e60 linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0000000070.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0000000070 belongsto_title (String) = Surveillance de l'état quantitatif des eaux souterraines de la France(FR_SOP) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):7 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e5f linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0000000131.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0000000131 belongsto_title (String) = Réseau de suivi quantitatif des points d’eau utilisés pour le Bulletin de Situation Hydrologique national (RNESOUPBSH) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 OGRFeature(networkfacility):8 id (String) = ef_networkfacility_2.fid--28738dc3_15d17368ff8_-2e5e linkingtime_owns (Integer(Boolean)) = 0 linkingtime_abstracttimeobject_timeperiod_pkid (String) = TimePeriod.0000000073.06512X0037-STREMY belongsto_href (String) = http://ressource.brgm-rec.fr/data/DispositifCollecte/0000000073 belongsto_title (String) = Réseau national de suivi quantitatif des eaux souterraines sous MO BRGM(RNESOUPMOBRGM) belongsto_owns (Integer(Boolean)) = 0 contains_owns (Integer(Boolean)) = 0 Layer name: environmenmonitoringfacility_legalbackground_legalbackground Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(environmenmonitoringfacility_legalbackground_legalbackground):1 occurrence (Integer) = 1 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_legalBackground_1 Layer name: environmentalmonitoringfacility_reportedto_reportedto Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(environmentalmonitoringfacility_reportedto_reportedto):1 occurrence (Integer) = 1 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_reportedTo_1 Layer name: environmentamonitoringfacility_hasobservation_hasobservation Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(environmentamonitoringfacility_hasobservation_hasobservation):1 occurrence (Integer) = 1 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_1 OGRFeature(environmentamonitoringfacility_hasobservation_hasobservation):2 occurrence (Integer) = 2 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_2 OGRFeature(environmentamonitoringfacility_hasobservation_hasobservation):3 occurrence (Integer) = 3 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_3 OGRFeature(environmentamonitoringfacility_hasobservation_hasobservation):4 occurrence (Integer) = 4 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_hasObservation_4 Layer name: environmentalmonitoringfacility_involvedin_involvedin Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(environmentalmonitoringfacility_involvedin_involvedin):1 occurrence (Integer) = 1 parent_pkid (String) = Piezometre.06512X0037.STREMY.2 child_pkid (String) = 33AA9BE880A93128BEA467A6649B5D8E_involvedIn_1 Layer name: _ogr_fields_metadata Geometry: None Feature Count: 218 Layer SRS WKT: (unknown) layer_name: String (0.0) field_index: Integer (0.0) field_name: String (0.0) field_xpath: String (0.0) field_type: String (0.0) field_is_list: Integer(Boolean) (0.0) field_min_occurs: Integer (0.0) field_max_occurs: Integer (0.0) field_repetition_on_sequence: Integer(Boolean) (0.0) field_default_value: String (0.0) field_fixed_value: String (0.0) field_category: String (0.0) field_related_layer: String (0.0) field_junction_layer: String (0.0) field_documentation: String (0.0) OGRFeature(_ogr_fields_metadata):221 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 1 field_name (String) = id field_xpath (String) = ef:EnvironmentalMonitoringFacility/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):223 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 3 field_name (String) = description_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):224 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 4 field_name (String) = description_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):225 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 5 field_name (String) = description_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):226 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 6 field_name (String) = description field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):227 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):228 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):229 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):230 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):231 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = ef:EnvironmentalMonitoringFacility/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):234 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 14 field_name (String) = inspireid_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:inspireId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = ef_inspireid OGRFeature(_ogr_fields_metadata):235 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 15 field_name (String) = ef_name field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:name field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_ef_name OGRFeature(_ogr_fields_metadata):236 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 16 field_name (String) = additionaldescription_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:additionalDescription/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):237 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 17 field_name (String) = additionaldescription_nil field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:additionalDescription/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):238 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 18 field_name (String) = additionaldescription field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:additionalDescription field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Plain text description of additional information not fitting in other attributes. OGRFeature(_ogr_fields_metadata):239 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 19 field_name (String) = mediamonitored field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_mediamonitored OGRFeature(_ogr_fields_metadata):240 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 20 field_name (String) = legalbackground_legalbackground field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:legalBackground field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = legalbackground field_junction_layer (String) = environmenmonitoringfacility_legalbackground_legalbackground OGRFeature(_ogr_fields_metadata):242 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 22 field_name (String) = geometry field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:geometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Geometry associated to the AbstractMonitoringObject. For mobile facilities the geometry represents the area the facility is expected to measure in. A geometric property may either be any geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same or another document). Note that either the reference or the contained element shall be given, but not both or none. If a feature has a property that takes a geometry element as its value, this is called a geometry property. A generic type for such a geometry property is GeometryPropertyType. OGRFeature(_ogr_fields_metadata):243 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 23 field_name (String) = onlineresource field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:onlineResource field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_onlineresource OGRFeature(_ogr_fields_metadata):244 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 24 field_name (String) = purpose field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_purpose OGRFeature(_ogr_fields_metadata):246 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 26 field_name (String) = broader_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:broader field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = broader OGRFeature(_ogr_fields_metadata):248 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 28 field_name (String) = supersedes field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_supersedes OGRFeature(_ogr_fields_metadata):249 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 29 field_name (String) = supersededby field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_supersededby OGRFeature(_ogr_fields_metadata):250 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 30 field_name (String) = reportedto_reportedto field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:reportedTo field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = reportedto field_junction_layer (String) = environmentalmonitoringfacility_reportedto_reportedto OGRFeature(_ogr_fields_metadata):251 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 31 field_name (String) = hasobservation_hasobservation field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:hasObservation field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = hasobservation field_junction_layer (String) = environmentamonitoringfacility_hasobservation_hasobservation OGRFeature(_ogr_fields_metadata):252 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 32 field_name (String) = involvedin_involvedin field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:involvedIn field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = involvedin field_junction_layer (String) = environmentalmonitoringfacility_involvedin_involvedin OGRFeature(_ogr_fields_metadata):253 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 33 field_name (String) = representativepoint field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:representativePoint field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Representative location for the EnvironmentalMonitoringFacility. -- Description -- A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):254 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 34 field_name (String) = measurementregime_owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:measurementRegime/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):255 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 35 field_name (String) = measurementregime_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:measurementRegime/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):256 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 36 field_name (String) = measurementregime_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:measurementRegime/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):257 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 37 field_name (String) = measurementregime_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:measurementRegime/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):258 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 38 field_name (String) = mobile_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mobile/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):259 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 39 field_name (String) = mobile field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mobile field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Indicate whether the EnvironmentalMonitoringFacility is mobile (repositionable) during the acquisition of the observation. OGRFeature(_ogr_fields_metadata):260 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 40 field_name (String) = resultacquisitionsource field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_resultacquisitionsource OGRFeature(_ogr_fields_metadata):261 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 41 field_name (String) = specialisedemftype_owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:specialisedEMFType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):262 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 42 field_name (String) = specialisedemftype_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:specialisedEMFType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):263 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 43 field_name (String) = specialisedemftype_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:specialisedEMFType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):264 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 44 field_name (String) = specialisedemftype_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:specialisedEMFType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):265 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 45 field_name (String) = operationalactivityperiod field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_operationalactivityperiod OGRFeature(_ogr_fields_metadata):266 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 46 field_name (String) = relatedto field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_relatedto OGRFeature(_ogr_fields_metadata):267 layer_name (String) = environmentalmonitoringfacility field_index (Integer) = 47 field_name (String) = belongsto field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = environmentalmonitoringfacility_belongsto OGRFeature(_ogr_fields_metadata):275 layer_name (String) = environmentalmonitoringfacility_ef_name field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:name/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):276 layer_name (String) = environmentalmonitoringfacility_ef_name field_index (Integer) = 2 field_name (String) = value field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:name field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Plain text denotation of the AbstractMonitoringObject. OGRFeature(_ogr_fields_metadata):277 layer_name (String) = environmentalmonitoringfacility_mediamonitored field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):278 layer_name (String) = environmentalmonitoringfacility_mediamonitored field_index (Integer) = 2 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):279 layer_name (String) = environmentalmonitoringfacility_mediamonitored field_index (Integer) = 3 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):280 layer_name (String) = environmentalmonitoringfacility_mediamonitored field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):281 layer_name (String) = environmentalmonitoringfacility_onlineresource field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:onlineResource/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):282 layer_name (String) = environmentalmonitoringfacility_onlineresource field_index (Integer) = 2 field_name (String) = value field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:onlineResource field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A link to an external document providing further information on the AbstractMonitoringObject. OGRFeature(_ogr_fields_metadata):283 layer_name (String) = environmentalmonitoringfacility_purpose field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):284 layer_name (String) = environmentalmonitoringfacility_purpose field_index (Integer) = 2 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):285 layer_name (String) = environmentalmonitoringfacility_purpose field_index (Integer) = 3 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):286 layer_name (String) = environmentalmonitoringfacility_purpose field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):287 layer_name (String) = environmentalmonitoringfacility_supersedes field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):288 layer_name (String) = environmentalmonitoringfacility_supersedes field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):289 layer_name (String) = environmentalmonitoringfacility_supersedes field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):290 layer_name (String) = environmentalmonitoringfacility_supersedes field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):291 layer_name (String) = environmentalmonitoringfacility_supersedes field_index (Integer) = 5 field_name (String) = abstractmonitoringobject_environmentamonitoringfacility_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes/ef:EnvironmentalMonitoringFacility field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = environmentalmonitoringfacility OGRFeature(_ogr_fields_metadata):294 layer_name (String) = environmentalmonitoringfacility_supersededby field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):295 layer_name (String) = environmentalmonitoringfacility_supersededby field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):296 layer_name (String) = environmentalmonitoringfacility_supersededby field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):297 layer_name (String) = environmentalmonitoringfacility_supersededby field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):298 layer_name (String) = environmentalmonitoringfacility_supersededby field_index (Integer) = 5 field_name (String) = abstractmonitoringobject_environmentamonitoringfacility_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy/ef:EnvironmentalMonitoringFacility field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = environmentalmonitoringfacility OGRFeature(_ogr_fields_metadata):301 layer_name (String) = environmentalmonitoringfacility_resultacquisitionsource field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):302 layer_name (String) = environmentalmonitoringfacility_resultacquisitionsource field_index (Integer) = 2 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):303 layer_name (String) = environmentalmonitoringfacility_resultacquisitionsource field_index (Integer) = 3 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):304 layer_name (String) = environmentalmonitoringfacility_resultacquisitionsource field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):305 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):306 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):307 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):308 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):309 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod field_index (Integer) = 5 field_name (String) = operationalactivityperiod_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod/ef:OperationalActivityPeriod field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = operationalactivityperiod OGRFeature(_ogr_fields_metadata):310 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):311 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):312 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):313 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):314 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 5 field_name (String) = anydomainlink_id field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):316 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 7 field_name (String) = anydomainlink_description_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):317 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 8 field_name (String) = anydomainlink_description_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):318 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 9 field_name (String) = anydomainlink_description_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):319 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 10 field_name (String) = anydomainlink_description field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):320 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 11 field_name (String) = anydomainlink_descriptionreference_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):321 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 12 field_name (String) = anydomainlink_descriptionreference_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):322 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 13 field_name (String) = anydomainlink_descriptionreference_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):323 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 14 field_name (String) = anydomainlink_identifier_codespace field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):324 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 15 field_name (String) = anydomainlink_identifier field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):326 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 17 field_name (String) = anydomainlink_comment_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:comment/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):327 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 18 field_name (String) = anydomainlink_comment field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:comment field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Additional information on the domain link. OGRFeature(_ogr_fields_metadata):328 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 19 field_name (String) = anydomainlink_relatedto_href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:relatedTo/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):329 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 20 field_name (String) = anydomainlink_relatedto_title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:relatedTo/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):330 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 21 field_name (String) = anydomainlink_relatedto_nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:relatedTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):331 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 22 field_name (String) = anydomainlink_relatedto_owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:relatedTo/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):332 layer_name (String) = environmentalmonitoringfacility_relatedto field_index (Integer) = 23 field_name (String) = anydomainlink_relatedto_environmentalmonitoringfacility_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo/ef:AnyDomainLink/ef:relatedTo/ef:EnvironmentalMonitoringFacility field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = environmentalmonitoringfacility OGRFeature(_ogr_fields_metadata):340 layer_name (String) = environmentalmonitoringfacility_belongsto field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):341 layer_name (String) = environmentalmonitoringfacility_belongsto field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):342 layer_name (String) = environmentalmonitoringfacility_belongsto field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):343 layer_name (String) = environmentalmonitoringfacility_belongsto field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):344 layer_name (String) = environmentalmonitoringfacility_belongsto field_index (Integer) = 5 field_name (String) = networkfacility_pkid field_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo/ef:NetworkFacility field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = networkfacility OGRFeature(_ogr_fields_metadata):345 layer_name (String) = operationalactivityperiod field_index (Integer) = 1 field_name (String) = id field_xpath (String) = ef:OperationalActivityPeriod/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):347 layer_name (String) = operationalactivityperiod field_index (Integer) = 3 field_name (String) = description_href field_xpath (String) = ef:OperationalActivityPeriod/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):348 layer_name (String) = operationalactivityperiod field_index (Integer) = 4 field_name (String) = description_title field_xpath (String) = ef:OperationalActivityPeriod/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):349 layer_name (String) = operationalactivityperiod field_index (Integer) = 5 field_name (String) = description_nilreason field_xpath (String) = ef:OperationalActivityPeriod/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):350 layer_name (String) = operationalactivityperiod field_index (Integer) = 6 field_name (String) = description field_xpath (String) = ef:OperationalActivityPeriod/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):351 layer_name (String) = operationalactivityperiod field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = ef:OperationalActivityPeriod/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):352 layer_name (String) = operationalactivityperiod field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = ef:OperationalActivityPeriod/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):353 layer_name (String) = operationalactivityperiod field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = ef:OperationalActivityPeriod/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):354 layer_name (String) = operationalactivityperiod field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = ef:OperationalActivityPeriod/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):355 layer_name (String) = operationalactivityperiod field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = ef:OperationalActivityPeriod/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):358 layer_name (String) = operationalactivityperiod field_index (Integer) = 14 field_name (String) = activitytime_href field_xpath (String) = ef:OperationalActivityPeriod/ef:activityTime/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):359 layer_name (String) = operationalactivityperiod field_index (Integer) = 15 field_name (String) = activitytime_title field_xpath (String) = ef:OperationalActivityPeriod/ef:activityTime/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):360 layer_name (String) = operationalactivityperiod field_index (Integer) = 16 field_name (String) = activitytime_nilreason field_xpath (String) = ef:OperationalActivityPeriod/ef:activityTime/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):361 layer_name (String) = operationalactivityperiod field_index (Integer) = 17 field_name (String) = activitytime_owns field_xpath (String) = ef:OperationalActivityPeriod/ef:activityTime/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):363 layer_name (String) = operationalactivityperiod field_index (Integer) = 19 field_name (String) = activitytime_abstracttimeobject_timeperiod_pkid field_xpath (String) = ef:OperationalActivityPeriod/ef:activityTime/gml:TimePeriod field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = timeperiod OGRFeature(_ogr_fields_metadata):491 layer_name (String) = timeperiod field_index (Integer) = 1 field_name (String) = frame field_xpath (String) = gml:TimePeriod/@frame field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = #ISO-8601 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):492 layer_name (String) = timeperiod field_index (Integer) = 2 field_name (String) = id field_xpath (String) = gml:TimePeriod/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):494 layer_name (String) = timeperiod field_index (Integer) = 4 field_name (String) = description_href field_xpath (String) = gml:TimePeriod/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):495 layer_name (String) = timeperiod field_index (Integer) = 5 field_name (String) = description_title field_xpath (String) = gml:TimePeriod/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):496 layer_name (String) = timeperiod field_index (Integer) = 6 field_name (String) = description_nilreason field_xpath (String) = gml:TimePeriod/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):497 layer_name (String) = timeperiod field_index (Integer) = 7 field_name (String) = description field_xpath (String) = gml:TimePeriod/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):498 layer_name (String) = timeperiod field_index (Integer) = 8 field_name (String) = descriptionreference_href field_xpath (String) = gml:TimePeriod/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):499 layer_name (String) = timeperiod field_index (Integer) = 9 field_name (String) = descriptionreference_title field_xpath (String) = gml:TimePeriod/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):500 layer_name (String) = timeperiod field_index (Integer) = 10 field_name (String) = descriptionreference_nilreason field_xpath (String) = gml:TimePeriod/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):501 layer_name (String) = timeperiod field_index (Integer) = 11 field_name (String) = identifier_codespace field_xpath (String) = gml:TimePeriod/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):502 layer_name (String) = timeperiod field_index (Integer) = 12 field_name (String) = identifier field_xpath (String) = gml:TimePeriod/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):505 layer_name (String) = timeperiod field_index (Integer) = 15 field_name (String) = beginposition_frame field_xpath (String) = gml:TimePeriod/gml:beginPosition/@frame field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = #ISO-8601 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):506 layer_name (String) = timeperiod field_index (Integer) = 16 field_name (String) = beginposition_calendareraname field_xpath (String) = gml:TimePeriod/gml:beginPosition/@calendarEraName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):507 layer_name (String) = timeperiod field_index (Integer) = 17 field_name (String) = beginposition_indeterminateposition field_xpath (String) = gml:TimePeriod/gml:beginPosition/@indeterminatePosition field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):508 layer_name (String) = timeperiod field_index (Integer) = 18 field_name (String) = beginposition field_xpath (String) = gml:TimePeriod/gml:beginPosition field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The method for identifying a temporal position is specific to each temporal reference system. gml:TimePositionType supports the description of temporal position according to the subtypes described in ISO 19108. Values based on calendars and clocks use lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an ordinal reference system . In common with many of the components modelled as data types in the ISO 19100 series of International Standards, the corresponding GML component has simple content. However, the content model gml:TimePositionType is defined in several steps. Three XML attributes appear on gml:TimePositionType: A time value shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. Components for describing temporal reference systems are described in 14.4, but it is not required that the reference system be described in this, as the reference may refer to anything that may be indentified with a URI. For time values using a calendar containing more than one era, the (optional) calendarEraName attribute provides the name of the calendar era. Inexact temporal positions may be expressed using the optional indeterminatePosition attribute. This takes a value from an enumeration. OGRFeature(_ogr_fields_metadata):509 layer_name (String) = timeperiod field_index (Integer) = 19 field_name (String) = begin_href field_xpath (String) = gml:TimePeriod/gml:begin/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):510 layer_name (String) = timeperiod field_index (Integer) = 20 field_name (String) = begin_title field_xpath (String) = gml:TimePeriod/gml:begin/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):511 layer_name (String) = timeperiod field_index (Integer) = 21 field_name (String) = begin_nilreason field_xpath (String) = gml:TimePeriod/gml:begin/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):512 layer_name (String) = timeperiod field_index (Integer) = 22 field_name (String) = begin_owns field_xpath (String) = gml:TimePeriod/gml:begin/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):514 layer_name (String) = timeperiod field_index (Integer) = 24 field_name (String) = endposition_frame field_xpath (String) = gml:TimePeriod/gml:endPosition/@frame field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = #ISO-8601 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):515 layer_name (String) = timeperiod field_index (Integer) = 25 field_name (String) = endposition_calendareraname field_xpath (String) = gml:TimePeriod/gml:endPosition/@calendarEraName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):516 layer_name (String) = timeperiod field_index (Integer) = 26 field_name (String) = endposition_indeterminateposition field_xpath (String) = gml:TimePeriod/gml:endPosition/@indeterminatePosition field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):517 layer_name (String) = timeperiod field_index (Integer) = 27 field_name (String) = endposition field_xpath (String) = gml:TimePeriod/gml:endPosition field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The method for identifying a temporal position is specific to each temporal reference system. gml:TimePositionType supports the description of temporal position according to the subtypes described in ISO 19108. Values based on calendars and clocks use lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an ordinal reference system . In common with many of the components modelled as data types in the ISO 19100 series of International Standards, the corresponding GML component has simple content. However, the content model gml:TimePositionType is defined in several steps. Three XML attributes appear on gml:TimePositionType: A time value shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. Components for describing temporal reference systems are described in 14.4, but it is not required that the reference system be described in this, as the reference may refer to anything that may be indentified with a URI. For time values using a calendar containing more than one era, the (optional) calendarEraName attribute provides the name of the calendar era. Inexact temporal positions may be expressed using the optional indeterminatePosition attribute. This takes a value from an enumeration. OGRFeature(_ogr_fields_metadata):518 layer_name (String) = timeperiod field_index (Integer) = 28 field_name (String) = end_href field_xpath (String) = gml:TimePeriod/gml:end/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):519 layer_name (String) = timeperiod field_index (Integer) = 29 field_name (String) = end_title field_xpath (String) = gml:TimePeriod/gml:end/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):520 layer_name (String) = timeperiod field_index (Integer) = 30 field_name (String) = end_nilreason field_xpath (String) = gml:TimePeriod/gml:end/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):521 layer_name (String) = timeperiod field_index (Integer) = 31 field_name (String) = end_owns field_xpath (String) = gml:TimePeriod/gml:end/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):523 layer_name (String) = timeperiod field_index (Integer) = 33 field_name (String) = duration field_xpath (String) = gml:TimePeriod/gml:duration field_type (String) = duration field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = gml:duration conforms to the ISO 8601 syntax for temporal length as implemented by the XML Schema duration type. OGRFeature(_ogr_fields_metadata):524 layer_name (String) = timeperiod field_index (Integer) = 34 field_name (String) = timeinterval_unit field_xpath (String) = gml:TimePeriod/gml:timeInterval/@unit field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):525 layer_name (String) = timeperiod field_index (Integer) = 35 field_name (String) = timeinterval_radix field_xpath (String) = gml:TimePeriod/gml:timeInterval/@radix field_type (String) = positiveInteger field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):526 layer_name (String) = timeperiod field_index (Integer) = 36 field_name (String) = timeinterval_factor field_xpath (String) = gml:TimePeriod/gml:timeInterval/@factor field_type (String) = integer field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):527 layer_name (String) = timeperiod field_index (Integer) = 37 field_name (String) = timeinterval field_xpath (String) = gml:TimePeriod/gml:timeInterval field_type (String) = decimal field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = gml:timeInterval conforms to ISO 11404 which is based on floating point values for temporal length. ISO 11404 syntax specifies the use of a positiveInteger together with appropriate values for radix and factor. The resolution of the time interval is to one radix ^(-factor) of the specified time unit. The value of the unit is either selected from the units for time intervals from ISO 31-1:1992, or is another suitable unit. The encoding is defined for GML in gml:TimeUnitType. The second component of this union type provides a method for indicating time units other than the six standard units given in the enumeration. OGRFeature(_ogr_fields_metadata):5554 layer_name (String) = ef_inspireid field_index (Integer) = 1 field_name (String) = identifier_localid field_xpath (String) = ef:inspireId/base:Identifier/base:localId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A local identifier, assigned by the data provider. The local identifier is unique within the namespace, that is no other spatial object carries the same unique identifier. -- Description -- NOTE It is the responsibility of the data provider to guarantee uniqueness of the local identifier within the namespace. OGRFeature(_ogr_fields_metadata):5555 layer_name (String) = ef_inspireid field_index (Integer) = 2 field_name (String) = identifier_namespace field_xpath (String) = ef:inspireId/base:Identifier/base:namespace field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Namespace uniquely identifying the data source of the spatial object. -- Description -- NOTE The namespace value will be owned by the data provider of the spatial object and will be registered in the INSPIRE External Object Identifier Namespaces Register. OGRFeature(_ogr_fields_metadata):5556 layer_name (String) = ef_inspireid field_index (Integer) = 3 field_name (String) = identifier_versionid_nilreason field_xpath (String) = ef:inspireId/base:Identifier/base:versionId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5557 layer_name (String) = ef_inspireid field_index (Integer) = 4 field_name (String) = identifier_versionid_nil field_xpath (String) = ef:inspireId/base:Identifier/base:versionId/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5558 layer_name (String) = ef_inspireid field_index (Integer) = 5 field_name (String) = identifier_versionid field_xpath (String) = ef:inspireId/base:Identifier/base:versionId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The identifier of the particular version of the spatial object, with a maximum length of 25 characters. If the specification of a spatial object type with an external object identifier includes life-cycle information, the version identifier is used to distinguish between the different versions of a spatial object. Within the set of all versions of a spatial object, the version identifier is unique. -- Description -- NOTE The maximum length has been selected to allow for time stamps based on ISO 8601, for example, "2007-02-12T12:12:12+05:30" as the version identifier. NOTE 2 The property is void, if the spatial data set does not distinguish between different versions of the spatial object. It is missing, if the spatial object type does not support any life-cycle information. OGRFeature(_ogr_fields_metadata):5559 layer_name (String) = legalbackground field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:legalBackground/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5560 layer_name (String) = legalbackground field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:legalBackground/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5561 layer_name (String) = legalbackground field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:legalBackground/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5562 layer_name (String) = legalbackground field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:legalBackground/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5571 layer_name (String) = broader field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:broader/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5572 layer_name (String) = broader field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:broader/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5573 layer_name (String) = broader field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:broader/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5574 layer_name (String) = broader field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:broader/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5631 layer_name (String) = reportedto field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = ef:reportedTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5632 layer_name (String) = reportedto field_index (Integer) = 2 field_name (String) = reporttolegalact_legalact_href field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:legalAct/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5633 layer_name (String) = reportedto field_index (Integer) = 3 field_name (String) = reporttolegalact_legalact_title field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:legalAct/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5634 layer_name (String) = reportedto field_index (Integer) = 4 field_name (String) = reporttolegalact_legalact_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:legalAct/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5635 layer_name (String) = reportedto field_index (Integer) = 5 field_name (String) = reporttolegalact_legalact_owns field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:legalAct/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5637 layer_name (String) = reportedto field_index (Integer) = 7 field_name (String) = reporttolegalact_reportdate_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:reportDate/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5638 layer_name (String) = reportedto field_index (Integer) = 8 field_name (String) = reporttolegalact_reportdate field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:reportDate field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Time of reporting. OGRFeature(_ogr_fields_metadata):5639 layer_name (String) = reportedto field_index (Integer) = 9 field_name (String) = reporttolegalact_reportedenvelope_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:reportedEnvelope/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5640 layer_name (String) = reportedto field_index (Integer) = 10 field_name (String) = reporttolegalact_reportedenvelope_nil field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:reportedEnvelope/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5641 layer_name (String) = reportedto field_index (Integer) = 11 field_name (String) = reporttolegalact_reportedenvelope field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:reportedEnvelope field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Link to the reported data set according to the date indicated in the attribute reportDate. OGRFeature(_ogr_fields_metadata):5642 layer_name (String) = reportedto field_index (Integer) = 12 field_name (String) = reporttolegalact_observationrequired_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:observationRequired/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5643 layer_name (String) = reportedto field_index (Integer) = 13 field_name (String) = reporttolegalact_observationrequired field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:observationRequired field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Indicates whether an observation is required for the AbstractMonitoringFeature. OGRFeature(_ogr_fields_metadata):5644 layer_name (String) = reportedto field_index (Integer) = 14 field_name (String) = reporttolegalact_observingcapabilityrequired_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:observingCapabilityRequired/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5645 layer_name (String) = reportedto field_index (Integer) = 15 field_name (String) = reporttolegalact_observingcapabilityrequired field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:observingCapabilityRequired field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Indicates whether the observingCapability is required for the AbstractMonitoringFeature. OGRFeature(_ogr_fields_metadata):5646 layer_name (String) = reportedto field_index (Integer) = 16 field_name (String) = reporttolegalact_description_nilreason field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5647 layer_name (String) = reportedto field_index (Integer) = 17 field_name (String) = reporttolegalact_description_nil field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:description/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5648 layer_name (String) = reportedto field_index (Integer) = 18 field_name (String) = reporttolegalact_description field_xpath (String) = ef:reportedTo/ef:ReportToLegalAct/ef:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Additional information on the actual data reported. OGRFeature(_ogr_fields_metadata):5649 layer_name (String) = hasobservation field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:hasObservation/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5650 layer_name (String) = hasobservation field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:hasObservation/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5651 layer_name (String) = hasobservation field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:hasObservation/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5653 layer_name (String) = involvedin field_index (Integer) = 1 field_name (String) = href field_xpath (String) = ef:involvedIn/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5654 layer_name (String) = involvedin field_index (Integer) = 2 field_name (String) = title field_xpath (String) = ef:involvedIn/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5655 layer_name (String) = involvedin field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = ef:involvedIn/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5656 layer_name (String) = involvedin field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = ef:involvedIn/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5658 layer_name (String) = networkfacility field_index (Integer) = 1 field_name (String) = id field_xpath (String) = ef:NetworkFacility/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):5660 layer_name (String) = networkfacility field_index (Integer) = 3 field_name (String) = description_href field_xpath (String) = ef:NetworkFacility/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5661 layer_name (String) = networkfacility field_index (Integer) = 4 field_name (String) = description_title field_xpath (String) = ef:NetworkFacility/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5662 layer_name (String) = networkfacility field_index (Integer) = 5 field_name (String) = description_nilreason field_xpath (String) = ef:NetworkFacility/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5663 layer_name (String) = networkfacility field_index (Integer) = 6 field_name (String) = description field_xpath (String) = ef:NetworkFacility/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):5664 layer_name (String) = networkfacility field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = ef:NetworkFacility/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5665 layer_name (String) = networkfacility field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = ef:NetworkFacility/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5666 layer_name (String) = networkfacility field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = ef:NetworkFacility/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5667 layer_name (String) = networkfacility field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = ef:NetworkFacility/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5668 layer_name (String) = networkfacility field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = ef:NetworkFacility/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):5670 layer_name (String) = networkfacility field_index (Integer) = 13 field_name (String) = linkingtime_href field_xpath (String) = ef:NetworkFacility/ef:linkingTime/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5671 layer_name (String) = networkfacility field_index (Integer) = 14 field_name (String) = linkingtime_title field_xpath (String) = ef:NetworkFacility/ef:linkingTime/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5672 layer_name (String) = networkfacility field_index (Integer) = 15 field_name (String) = linkingtime_nilreason field_xpath (String) = ef:NetworkFacility/ef:linkingTime/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5673 layer_name (String) = networkfacility field_index (Integer) = 16 field_name (String) = linkingtime_owns field_xpath (String) = ef:NetworkFacility/ef:linkingTime/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5675 layer_name (String) = networkfacility field_index (Integer) = 18 field_name (String) = linkingtime_abstracttimeobject_timeperiod_pkid field_xpath (String) = ef:NetworkFacility/ef:linkingTime/gml:TimePeriod field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = timeperiod OGRFeature(_ogr_fields_metadata):5679 layer_name (String) = networkfacility field_index (Integer) = 22 field_name (String) = belongsto_href field_xpath (String) = ef:NetworkFacility/ef:belongsTo/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5680 layer_name (String) = networkfacility field_index (Integer) = 23 field_name (String) = belongsto_title field_xpath (String) = ef:NetworkFacility/ef:belongsTo/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5681 layer_name (String) = networkfacility field_index (Integer) = 24 field_name (String) = belongsto_nilreason field_xpath (String) = ef:NetworkFacility/ef:belongsTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5682 layer_name (String) = networkfacility field_index (Integer) = 25 field_name (String) = belongsto_owns field_xpath (String) = ef:NetworkFacility/ef:belongsTo/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5684 layer_name (String) = networkfacility field_index (Integer) = 27 field_name (String) = contains_href field_xpath (String) = ef:NetworkFacility/ef:contains/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5685 layer_name (String) = networkfacility field_index (Integer) = 28 field_name (String) = contains_title field_xpath (String) = ef:NetworkFacility/ef:contains/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5686 layer_name (String) = networkfacility field_index (Integer) = 29 field_name (String) = contains_nilreason field_xpath (String) = ef:NetworkFacility/ef:contains/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5687 layer_name (String) = networkfacility field_index (Integer) = 30 field_name (String) = contains_owns field_xpath (String) = ef:NetworkFacility/ef:contains/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5688 layer_name (String) = networkfacility field_index (Integer) = 31 field_name (String) = contains_environmentalmonitoringfacility_pkid field_xpath (String) = ef:NetworkFacility/ef:contains/ef:EnvironmentalMonitoringFacility field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = environmentalmonitoringfacility OGRFeature(_ogr_fields_metadata):5708 layer_name (String) = environmenmonitoringfacility_legalbackground_legalbackground field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):5709 layer_name (String) = environmenmonitoringfacility_legalbackground_legalbackground field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):5710 layer_name (String) = environmenmonitoringfacility_legalbackground_legalbackground field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):5720 layer_name (String) = environmentalmonitoringfacility_reportedto_reportedto field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):5721 layer_name (String) = environmentalmonitoringfacility_reportedto_reportedto field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):5722 layer_name (String) = environmentalmonitoringfacility_reportedto_reportedto field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):5723 layer_name (String) = environmentamonitoringfacility_hasobservation_hasobservation field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):5724 layer_name (String) = environmentamonitoringfacility_hasobservation_hasobservation field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):5725 layer_name (String) = environmentamonitoringfacility_hasobservation_hasobservation field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):5726 layer_name (String) = environmentalmonitoringfacility_involvedin_involvedin field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):5727 layer_name (String) = environmentalmonitoringfacility_involvedin_involvedin field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):5728 layer_name (String) = environmentalmonitoringfacility_involvedin_involvedin field_name (String) = child_pkid Layer name: _ogr_layers_metadata Geometry: None Feature Count: 24 Layer SRS WKT: (unknown) layer_name: String (0.0) layer_xpath: String (0.0) layer_category: String (0.0) layer_pkid_name: String (0.0) layer_parent_pkid_name: String (0.0) layer_documentation: String (0.0) OGRFeature(_ogr_layers_metadata):19 layer_name (String) = environmentalmonitoringfacility layer_xpath (String) = ef:EnvironmentalMonitoringFacility layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = -- Name -- environmental monitoring facility -- Definition -- A georeferenced object directly collecting or processing data about objects whose properties (e.g. physical, chemical, biological or other aspects of environmental conditions) are repeatedly observed or measured. An environmental monitoring facility can also host other environmental monitoring facilities. -- Description -- NOTE 1: An EnvironmentalMonitoringFacility is not a facility in the common INSPIRE sense realised by the Generic Conceptual Model class ActivtiyComplex. NOTE 2: Laboratories are not EnvironmentalMonitoringFacilities from an INSPIRE perspective as the exact location of the laboratory does not add further information to the measurement. The methodology used in the laboratory should be provided with observational data. The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):22 layer_name (String) = environmentalmonitoringfacility_ef_name layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:name layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Plain text denotation of the AbstractMonitoringObject. OGRFeature(_ogr_layers_metadata):23 layer_name (String) = environmentalmonitoringfacility_mediamonitored layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:mediaMonitored layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Monitored environmental medium. gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):24 layer_name (String) = environmentalmonitoringfacility_onlineresource layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:onlineResource layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- A link to an external document providing further information on the AbstractMonitoringObject. OGRFeature(_ogr_layers_metadata):25 layer_name (String) = environmentalmonitoringfacility_purpose layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:purpose layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Reason for which the AbstractMonitoringObject has been generated. gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):26 layer_name (String) = environmentalmonitoringfacility_supersedes layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersedes layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- In a genealogy, the AbstractMonitoringObject(s) that has(have) been deactivated/replaced by another one. OGRFeature(_ogr_layers_metadata):27 layer_name (String) = environmentalmonitoringfacility_supersededby layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:supersededBy layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- In a genealogy, the newly active AbstractMonitoringObject(s) that replaces(replace) the superseded one. OGRFeature(_ogr_layers_metadata):28 layer_name (String) = environmentalmonitoringfacility_resultacquisitionsource layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:resultAcquisitionSource layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Source of result acquisition gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):29 layer_name (String) = environmentalmonitoringfacility_operationalactivityperiod layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:operationalActivityPeriod layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Lifespan of the physical object (facility). To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType. This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects. By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object. OGRFeature(_ogr_layers_metadata):30 layer_name (String) = environmentalmonitoringfacility_relatedto layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:relatedTo layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = anydomainlink_id layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- Any Thematic Link to an Environmental Monitoring Facility. The association has additional properties as defined in the association class AnyDomainLink. OGRFeature(_ogr_layers_metadata):33 layer_name (String) = environmentalmonitoringfacility_belongsto layer_xpath (String) = ef:EnvironmentalMonitoringFacility/ef:belongsTo layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- A link pointing to the EnvironmentalMonitoringNetwork(s) this EnvironmentalMonitoringFacility pertains to. The association has additional properties as defined in the association class NetworkFacility. OGRFeature(_ogr_layers_metadata):34 layer_name (String) = operationalactivityperiod layer_xpath (String) = ef:OperationalActivityPeriod layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = -- Name -- operational activity period -- Definition -- Corresponds to a period during which the EnvironmentalMonitoringFacility has been up and running. The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):52 layer_name (String) = timeperiod layer_xpath (String) = gml:TimePeriod layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = gml:TimePeriod acts as a one-dimensional geometric primitive that represents an identifiable extent in time. The location in of a gml:TimePeriod is described by the temporal positions of the instants at which it begins and ends. The length of the period is equal to the temporal distance between the two bounding temporal positions. Both beginning and end may be described in terms of their direct position using gml:TimePositionType which is an XML Schema simple content type, or by reference to an indentifiable time instant using gml:TimeInstantPropertyType. Alternatively a limit of a gml:TimePeriod may use the conventional GML property model to make a reference to a time instant described elsewhere, or a limit may be indicated as a direct position. OGRFeature(_ogr_layers_metadata):547 layer_name (String) = ef_inspireid layer_xpath (String) = ef:inspireId layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- External object identifier. OGRFeature(_ogr_layers_metadata):548 layer_name (String) = legalbackground layer_xpath (String) = ef:legalBackground layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- The legal context, in which the management and regulation of the AbstractMonitoringObject is defined. To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType. This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects. By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object. OGRFeature(_ogr_layers_metadata):551 layer_name (String) = broader layer_xpath (String) = ef:broader layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- A link pointing to a broader AbstractMonitoringObject (a higher level in a hierarchical structure). The association has additional properties as defined in the association class Hierarchy. OGRFeature(_ogr_layers_metadata):558 layer_name (String) = reportedto layer_xpath (String) = ef:reportedTo layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- Information on the involvement of the AbstractMonitoringFeature in reporting. OGRFeature(_ogr_layers_metadata):559 layer_name (String) = hasobservation layer_xpath (String) = ef:hasObservation layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- Observation of emissions, of the state of environmental media and of other ecosystem parameters (biodiversity, ecological conditions of vegetation, etc.) by or on behalf of public authorities at this AbstractMonitoringFeature. OGRFeature(_ogr_layers_metadata):560 layer_name (String) = involvedin layer_xpath (String) = ef:involvedIn layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- EnvironmentalMonitoringActivity(s) in which the AbstractMonitoringFeature is involved. OGRFeature(_ogr_layers_metadata):561 layer_name (String) = networkfacility layer_xpath (String) = ef:NetworkFacility layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = -- Name -- network facility -- Definition -- Link between EnvironmentalMonitoringNetwork and EnvironmentalMonitoringFacility. OGRFeature(_ogr_layers_metadata):568 layer_name (String) = environmenmonitoringfacility_legalbackground_legalbackground layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):572 layer_name (String) = environmentalmonitoringfacility_reportedto_reportedto layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):573 layer_name (String) = environmentamonitoringfacility_hasobservation_hasobservation layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):574 layer_name (String) = environmentalmonitoringfacility_involvedin_involvedin layer_category (String) = JUNCTION_TABLE Layer name: _ogr_layer_relationships Geometry: None Feature Count: 24 Layer SRS WKT: (unknown) parent_layer: String (0.0) parent_pkid: String (0.0) parent_element_name: String (0.0) child_layer: String (0.0) child_pkid: String (0.0) OGRFeature(_ogr_layer_relationships):94 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = inspireid_pkid child_layer (String) = ef_inspireid child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):95 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = ef_name child_layer (String) = environmentalmonitoringfacility_ef_name child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):96 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = mediamonitored child_layer (String) = environmentalmonitoringfacility_mediamonitored child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):97 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = legalbackground_legalbackground child_layer (String) = legalbackground child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):99 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = onlineresource child_layer (String) = environmentalmonitoringfacility_onlineresource child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):100 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = purpose child_layer (String) = environmentalmonitoringfacility_purpose child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):102 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = broader_pkid child_layer (String) = broader child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):104 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = supersedes child_layer (String) = environmentalmonitoringfacility_supersedes child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):105 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = supersededby child_layer (String) = environmentalmonitoringfacility_supersededby child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):106 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = reportedto_reportedto child_layer (String) = reportedto child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):107 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = hasobservation_hasobservation child_layer (String) = hasobservation child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):108 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = involvedin_involvedin child_layer (String) = involvedin child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):109 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = resultacquisitionsource child_layer (String) = environmentalmonitoringfacility_resultacquisitionsource child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):110 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = operationalactivityperiod child_layer (String) = environmentalmonitoringfacility_operationalactivityperiod child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):111 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = relatedto child_layer (String) = environmentalmonitoringfacility_relatedto child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):112 parent_layer (String) = environmentalmonitoringfacility parent_pkid (String) = id parent_element_name (String) = belongsto child_layer (String) = environmentalmonitoringfacility_belongsto child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):113 parent_layer (String) = environmentalmonitoringfacility_supersedes parent_pkid (String) = ogr_pkid parent_element_name (String) = abstractmonitoringobject_environmentamonitoringfacility_pkid child_layer (String) = environmentalmonitoringfacility child_pkid (String) = id OGRFeature(_ogr_layer_relationships):116 parent_layer (String) = environmentalmonitoringfacility_supersededby parent_pkid (String) = ogr_pkid parent_element_name (String) = abstractmonitoringobject_environmentamonitoringfacility_pkid child_layer (String) = environmentalmonitoringfacility child_pkid (String) = id OGRFeature(_ogr_layer_relationships):119 parent_layer (String) = environmentalmonitoringfacility_operationalactivityperiod parent_pkid (String) = ogr_pkid parent_element_name (String) = operationalactivityperiod_pkid child_layer (String) = operationalactivityperiod child_pkid (String) = id OGRFeature(_ogr_layer_relationships):122 parent_layer (String) = environmentalmonitoringfacility_relatedto parent_pkid (String) = anydomainlink_id parent_element_name (String) = anydomainlink_relatedto_environmentalmonitoringfacility_pkid child_layer (String) = environmentalmonitoringfacility child_pkid (String) = id OGRFeature(_ogr_layer_relationships):123 parent_layer (String) = environmentalmonitoringfacility_belongsto parent_pkid (String) = ogr_pkid parent_element_name (String) = networkfacility_pkid child_layer (String) = networkfacility child_pkid (String) = id OGRFeature(_ogr_layer_relationships):128 parent_layer (String) = operationalactivityperiod parent_pkid (String) = id parent_element_name (String) = activitytime_abstracttimeobject_timeperiod_pkid child_layer (String) = timeperiod child_pkid (String) = id OGRFeature(_ogr_layer_relationships):1301 parent_layer (String) = networkfacility parent_pkid (String) = id parent_element_name (String) = linkingtime_abstracttimeobject_timeperiod_pkid child_layer (String) = timeperiod child_pkid (String) = id OGRFeature(_ogr_layer_relationships):1306 parent_layer (String) = networkfacility parent_pkid (String) = id parent_element_name (String) = contains_environmentalmonitoringfacility_pkid child_layer (String) = environmentalmonitoringfacility child_pkid (String) = id Layer name: _ogr_other_metadata Geometry: None Feature Count: 42 Layer SRS WKT: (unknown) key: String (0.0) value: String (0.0) OGRFeature(_ogr_other_metadata):0 key (String) = REMOVE_UNUSED_LAYERS value (String) = YES OGRFeature(_ogr_other_metadata):1 key (String) = document_filename value (String) = data/gmlas/real_world/Piezometre.06512X0037.STREMY.2.gml OGRFeature(_ogr_other_metadata):2 key (String) = namespace_uri_1 value (String) = http://inspire.ec.europa.eu/schemas/ef/4.0 OGRFeature(_ogr_other_metadata):3 key (String) = namespace_location_1 value (String) = http://inspire.ec.europa.eu/schemas/ef/4.0/EnvironmentalMonitoringFacilities.xsd OGRFeature(_ogr_other_metadata):4 key (String) = namespace_prefix_1 value (String) = ef OGRFeature(_ogr_other_metadata):5 key (String) = namespace_uri_2 value (String) = http://inspire.ec.europa.eu/schemas/ad/4.0 OGRFeature(_ogr_other_metadata):6 key (String) = namespace_prefix_2 value (String) = ad OGRFeature(_ogr_other_metadata):7 key (String) = namespace_uri_3 value (String) = http://inspire.ec.europa.eu/schemas/au/4.0 OGRFeature(_ogr_other_metadata):8 key (String) = namespace_prefix_3 value (String) = au OGRFeature(_ogr_other_metadata):9 key (String) = namespace_uri_4 value (String) = http://inspire.ec.europa.eu/schemas/base/3.3 OGRFeature(_ogr_other_metadata):10 key (String) = namespace_prefix_4 value (String) = base OGRFeature(_ogr_other_metadata):11 key (String) = namespace_uri_5 value (String) = http://inspire.ec.europa.eu/schemas/base2/2.0 OGRFeature(_ogr_other_metadata):12 key (String) = namespace_prefix_5 value (String) = base2 OGRFeature(_ogr_other_metadata):13 key (String) = namespace_uri_6 value (String) = http://inspire.ec.europa.eu/schemas/bu-base/4.0 OGRFeature(_ogr_other_metadata):14 key (String) = namespace_prefix_6 value (String) = bu-base OGRFeature(_ogr_other_metadata):15 key (String) = namespace_uri_7 value (String) = http://inspire.ec.europa.eu/schemas/cp/4.0 OGRFeature(_ogr_other_metadata):16 key (String) = namespace_prefix_7 value (String) = cp OGRFeature(_ogr_other_metadata):17 key (String) = namespace_uri_8 value (String) = http://inspire.ec.europa.eu/schemas/gn/4.0 OGRFeature(_ogr_other_metadata):18 key (String) = namespace_prefix_8 value (String) = gn OGRFeature(_ogr_other_metadata):19 key (String) = namespace_uri_9 value (String) = http://inspire.ec.europa.eu/schemas/net/4.0 OGRFeature(_ogr_other_metadata):20 key (String) = namespace_prefix_9 value (String) = net OGRFeature(_ogr_other_metadata):21 key (String) = namespace_uri_10 value (String) = http://inspire.ec.europa.eu/schemas/tn/4.0 OGRFeature(_ogr_other_metadata):22 key (String) = namespace_prefix_10 value (String) = tn OGRFeature(_ogr_other_metadata):23 key (String) = namespace_uri_11 value (String) = http://www.interactive-instruments.de/ShapeChange/AppInfo OGRFeature(_ogr_other_metadata):24 key (String) = namespace_prefix_11 value (String) = sc OGRFeature(_ogr_other_metadata):25 key (String) = namespace_uri_12 value (String) = http://www.isotc211.org/2005/gco OGRFeature(_ogr_other_metadata):26 key (String) = namespace_prefix_12 value (String) = gco OGRFeature(_ogr_other_metadata):27 key (String) = namespace_uri_13 value (String) = http://www.isotc211.org/2005/gmd OGRFeature(_ogr_other_metadata):28 key (String) = namespace_prefix_13 value (String) = gmd OGRFeature(_ogr_other_metadata):29 key (String) = namespace_uri_14 value (String) = http://www.isotc211.org/2005/gsr OGRFeature(_ogr_other_metadata):30 key (String) = namespace_prefix_14 value (String) = gsr OGRFeature(_ogr_other_metadata):31 key (String) = namespace_uri_15 value (String) = http://www.isotc211.org/2005/gss OGRFeature(_ogr_other_metadata):32 key (String) = namespace_prefix_15 value (String) = gss OGRFeature(_ogr_other_metadata):33 key (String) = namespace_uri_16 value (String) = http://www.isotc211.org/2005/gts OGRFeature(_ogr_other_metadata):34 key (String) = namespace_prefix_16 value (String) = gts OGRFeature(_ogr_other_metadata):35 key (String) = namespace_uri_17 value (String) = http://www.opengis.net/gml/3.2 OGRFeature(_ogr_other_metadata):36 key (String) = namespace_prefix_17 value (String) = gml OGRFeature(_ogr_other_metadata):37 key (String) = namespace_uri_18 value (String) = http://www.opengis.net/om/2.0 OGRFeature(_ogr_other_metadata):38 key (String) = namespace_prefix_18 value (String) = om OGRFeature(_ogr_other_metadata):39 key (String) = namespace_uri_19 value (String) = http://www.w3.org/1999/xlink OGRFeature(_ogr_other_metadata):40 key (String) = namespace_prefix_19 value (String) = xlink OGRFeature(_ogr_other_metadata):41 key (String) = gml_version value (String) = 3.2.1 gdalautotest-3.0.4/ogr/data/gmlas/real_world/output/EUReg.example.txt0000644003401500001440000067137413614004466025315 0ustar rouaultusersINFO: Open of `GMLAS:data/gmlas/real_world/EUReg.example.gml' using driver `GMLAS' successful. Layer name: productionfacility Geometry (geometry): Unknown (any) Geometry (surfacegeometry): Surface Feature Count: 1 Extent (geometry): (2.104331, 41.991932) - (2.104331, 41.991932) SRS WKT (geometry): GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AXIS["Latitude",NORTH], AXIS["Longitude",EAST], AUTHORITY["EPSG","4258"]] Data axis to CRS axis mapping: 2,1 SRS WKT (surfacegeometry): (unknown) Geometry Column 1 = geometry Geometry Column 2 = surfacegeometry id: String (0.0) NOT NULL description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) inspireid_identifier_localid: String (0.0) NOT NULL inspireid_identifier_namespace: String (0.0) NOT NULL inspireid_identifier_versionid_nilreason: String (0.0) inspireid_identifier_versionid_nil: Integer(Boolean) (0.0) inspireid_identifier_versionid: String (0.0) act_core_name_nilreason: String (0.0) act_core_name_nil: Integer(Boolean) (0.0) act_core_name: String (0.0) validfrom_nilreason: String (0.0) validfrom: DateTime (0.0) validto_nilreason: String (0.0) validto_nil: Integer(Boolean) (0.0) validto: DateTime (0.0) beginlifespanversion_nilreason: String (0.0) beginlifespanversion: DateTime (0.0) endlifespanversion_nilreason: String (0.0) endlifespanversion_nil: Integer(Boolean) (0.0) endlifespanversion: DateTime (0.0) riverbasindistrict_anyattributes: String (0.0) riverbasindistrict: String (0.0) hostingsite_href: String (0.0) hostingsite_title: String (0.0) hostingsite_nilreason: String (0.0) hostingsite_owns: Integer(Boolean) (0.0) DEFAULT 'false' hostingsite_productionsite_pf_productionsite_pkid: String (0.0) hostingsite_productionsite_eureg_productionsite_pkid: String (0.0) facilityname_owns: Integer(Boolean) (0.0) DEFAULT 'false' facilityname_featurename_nameoffeature: String (0.0) NOT NULL facilityname_featurename_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' facilityname_featurename_confidentialityreason_href: String (0.0) facilityname_featurename_confidentialityreason_title: String (0.0) facilityname_featurename_confidentialityreason_nilreason: String (0.0) parentcompany_owns: Integer(Boolean) (0.0) DEFAULT 'false' parentcompany_parentcompanydetails_parentcompanyname: String (0.0) NOT NULL parentcompany_parentcompanydetails_parentcompanyurl: String (0.0) parentcompany_parentcompanydetails_confidentialitreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' parentcompany_parentcompanydetails_confidentialitreason_href: String (0.0) parentcompany_parentcompanydetails_confidentialireason_title: String (0.0) parentcompany_parentcompanydetails_confidentreason_nilreason: String (0.0) eprtrannexiactivity_owns: Integer(Boolean) (0.0) DEFAULT 'false' eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_owns: Integer(Boolean) (0.0) DEFAULT 'false' eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_href: String (0.0) eprtrannexiactivity_eprtrannexiactivityty_mainactivity_title: String (0.0) eprtrannexiactivit_eprtrannexiactivit_mainactivity_nilreason: String (0.0) remarks: StringList (0.0) dateofstartofoperation_nilreason: String (0.0) dateofstartofoperation: Date (0.0) address_nilreason: String (0.0) address_owns: Integer(Boolean) (0.0) DEFAULT 'false' address_addressdetails_streetname: String (0.0) NOT NULL address_addressdetails_buildingnumber: String (0.0) NOT NULL address_addressdetails_city: String (0.0) NOT NULL address_addressdetails_postalcode: String (0.0) NOT NULL address_addressdetails_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' address_addressdetails_confidentialityreason_href: String (0.0) address_addressdetails_confidentialityreason_title: String (0.0) address_addressdetails_confidentialityreason_nilreason: String (0.0) OGRFeature(productionfacility):1 id (String) = _000000002.FACILITY inspireid_identifier_localid (String) = 000000002.FACILITY inspireid_identifier_namespace (String) = ES.CAED validfrom (DateTime) = (null) beginlifespanversion (DateTime) = (null) hostingsite_href (String) = #_123456789.SITE hostingsite_owns (Integer(Boolean)) = 0 hostingsite_productionsite_eureg_productionsite_pkid (String) = _123456789.SITE facilityname_owns (Integer(Boolean)) = 0 facilityname_featurename_nameoffeature (String) = EXAMPLE FACILITY 1 facilityname_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 parentcompany_owns (Integer(Boolean)) = 0 parentcompany_parentcompanydetails_parentcompanyname (String) = OWNER LIMITED parentcompany_parentcompanydetails_parentcompanyurl (String) = http://www.fakeurl.fake parentcompany_parentcompanydetails_confidentialitreason_owns (Integer(Boolean)) = 0 eprtrannexiactivity_owns (Integer(Boolean)) = 0 eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_owns (Integer(Boolean)) = 0 eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/EPRTRAnnexIActivityValue/1(c) remarks (StringList) = (1:,...) dateofstartofoperation (Date) = 1982/01/01 address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Administrative Street address_addressdetails_buildingnumber (String) = 20 address_addressdetails_city (String) = BARCELONA address_addressdetails_postalcode (String) = EX2 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 address_addressdetails_confidentialityreason_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ReasonValue/Article4(2)(a)/ geometry = POINT (2.104331 41.991932) Layer name: productionfacility_function Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL function_description_nilreason: String (0.0) function_description_characterstring: String (0.0) function_description_pt_freetext_id: String (0.0) function_description_pt_freetext_uuid: String (0.0) OGRFeature(productionfacility_function):1 ogr_pkid (String) = _000000002.FACILITY_function_1 parent_id (String) = _000000002.FACILITY Layer name: productionfacility_function_function_activity Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_ogr_pkid: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(productionfacility_function_function_activity):1 ogr_pkid (String) = _000000002.FACILITY_function_1_activity_1 parent_ogr_pkid (String) = _000000002.FACILITY_function_1 owns (Integer(Boolean)) = 0 href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/NACEValue/35.11 Layer name: productionfacility_status Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL nilreason: String (0.0) statustype_statustype_owns: Integer(Boolean) (0.0) DEFAULT 'false' statustype_statustype_href: String (0.0) statustype_statustype_title: String (0.0) statustype_statustype_nilreason: String (0.0) statustype_description_nilreason: String (0.0) statustype_description_nil: Integer(Boolean) (0.0) statustype_description: String (0.0) statustype_validfrom_nilreason: String (0.0) statustype_validfrom: Date (0.0) statustype_validto_nilreason: String (0.0) statustype_validto_nil: Integer(Boolean) (0.0) statustype_validto: Date (0.0) OGRFeature(productionfacility_status):1 ogr_pkid (String) = _000000002.FACILITY_status_1 parent_id (String) = _000000002.FACILITY statustype_statustype_owns (Integer(Boolean)) = 0 statustype_statustype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ConditionOfFacilityValue/functional statustype_validfrom (Date) = (null) Layer name: productionfacility_groupedinstallation Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' productioninstallation_pf_productioninstallation_pkid: String (0.0) productioninstallation_eureg_productioninstallation_pkid: String (0.0) OGRFeature(productionfacility_groupedinstallation):1 ogr_pkid (String) = _000000002.FACILITY_groupedInstallation_1 parent_id (String) = _000000002.FACILITY href (String) = #_010101011.INSTALLATION owns (Integer(Boolean)) = 0 productioninstallation_eureg_productioninstallation_pkid (String) = _010101011.INSTALLATION OGRFeature(productionfacility_groupedinstallation):2 ogr_pkid (String) = _000000002.FACILITY_groupedInstallation_2 parent_id (String) = _000000002.FACILITY href (String) = #_010101012.INSTALLATION owns (Integer(Boolean)) = 0 productioninstallation_eureg_productioninstallation_pkid (String) = _010101012.INSTALLATION Layer name: productionfacility_competentauthorityeprtr Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' competentauthority_pkid: String (0.0) OGRFeature(productionfacility_competentauthorityeprtr):1 ogr_pkid (String) = _000000002.FACILITY_competentAuthorityEPRTR_1 parent_id (String) = _000000002.FACILITY owns (Integer(Boolean)) = 0 competentauthority_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_1 Layer name: productionfacility_eprtrannexiac_eprtrannexiac_otheractivity Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(productionfacility_eprtrannexiac_eprtrannexiac_otheractivity):1 ogr_pkid (String) = _000000002.FACILITY_otherActivity_1 parent_id (String) = _000000002.FACILITY owns (Integer(Boolean)) = 0 href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/EPRTRAnnexIActivityValue/5(b) Layer name: eureg_productioninstallation Geometry (pointgeometry): Point Geometry (surfacegeometry): Surface Feature Count: 2 Extent (pointgeometry): (2.104327, 41.991929) - (2.104330, 41.991931) SRS WKT (pointgeometry): GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AXIS["Latitude",NORTH], AXIS["Longitude",EAST], AUTHORITY["EPSG","4258"]] Data axis to CRS axis mapping: 2,1 SRS WKT (surfacegeometry): (unknown) Geometry Column 1 = pointgeometry Geometry Column 2 = surfacegeometry id: String (0.0) NOT NULL gml_description_href: String (0.0) gml_description_title: String (0.0) gml_description_nilreason: String (0.0) gml_description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) inspireid_pkid: String (0.0) thematicid_pkid: String (0.0) type_pkid: String (0.0) installationname_owns: Integer(Boolean) (0.0) DEFAULT 'false' installationname_featurename_nameoffeature: String (0.0) NOT NULL installationname_featurename_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' installationname_featurename_confidentialityreason_href: String (0.0) installationname_featurename_confidentialityreason_title: String (0.0) installationname_featurename_confidentialityreason_nilreason: String (0.0) baselinereportpreparedindicator: Integer(Boolean) (0.0) NOT NULL batderogationindicator: Integer(Boolean) (0.0) NOT NULL inspections: Integer (0.0) NOT NULL etsidentifier: StringList (0.0) espirsidentifier: StringList (0.0) iedannexiactivity_owns: Integer(Boolean) (0.0) DEFAULT 'false' iedannexiactivity_iedannexiactivitytype_mainactivity_owns: Integer(Boolean) (0.0) DEFAULT 'false' iedannexiactivity_iedannexiactivitytype_mainactivity_href: String (0.0) iedannexiactivity_iedannexiactivitytype_mainactivity_title: String (0.0) iedannexiactivity_iedannexiactivityty_mainactivity_nilreason: String (0.0) permit_owns: Integer(Boolean) (0.0) DEFAULT 'false' permit_permitdetails_permitgranted: Integer(Boolean) (0.0) NOT NULL permit_permitdetails_permitreconsidered: Integer(Boolean) (0.0) NOT NULL permit_permitdetails_permitupdated: Integer(Boolean) (0.0) NOT NULL permit_permitdetails_dateofgranting: Date (0.0) permit_permitdetails_dateoflastreconsideration: Date (0.0) permit_permitdetails_dateoflastupdate: Date (0.0) permit_permitdetails_permiturl: StringList (0.0) dateofstartofoperation_nilreason: String (0.0) dateofstartofoperation: Date (0.0) OGRFeature(eureg_productioninstallation):1 id (String) = _010101011.INSTALLATION inspireid_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_inspireId_1 type_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_type_1 installationname_owns (Integer(Boolean)) = 0 installationname_featurename_nameoffeature (String) = EXAMPLE INSTALLATION 1 installationname_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 baselinereportpreparedindicator (Integer(Boolean)) = 1 batderogationindicator (Integer(Boolean)) = 0 inspections (Integer) = 2 etsidentifier (StringList) = (1:ETS.5463.fake) espirsidentifier (StringList) = (1:Seveso1235.ES.fake) iedannexiactivity_owns (Integer(Boolean)) = 0 iedannexiactivity_iedannexiactivitytype_mainactivity_owns (Integer(Boolean)) = 0 iedannexiactivity_iedannexiactivitytype_mainactivity_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/IEDAnnexIActivityValue/1.1 permit_owns (Integer(Boolean)) = 0 permit_permitdetails_permitgranted (Integer(Boolean)) = 1 permit_permitdetails_permitreconsidered (Integer(Boolean)) = 0 permit_permitdetails_permitupdated (Integer(Boolean)) = 0 permit_permitdetails_dateofgranting (Date) = 1956/01/01 dateofstartofoperation (Date) = 1956/01/01 pointgeometry = POINT (2.10433 41.991931) OGRFeature(eureg_productioninstallation):2 id (String) = _010101012.INSTALLATION inspireid_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_inspireId_2 type_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_type_2 installationname_owns (Integer(Boolean)) = 0 installationname_featurename_nameoffeature (String) = EXAMPLE INSTALLATION 2 installationname_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 baselinereportpreparedindicator (Integer(Boolean)) = 1 batderogationindicator (Integer(Boolean)) = 1 inspections (Integer) = 0 etsidentifier (StringList) = (1:ETS.54622.fake) espirsidentifier (StringList) = (1:Seveso1235.ES.fake) iedannexiactivity_owns (Integer(Boolean)) = 0 iedannexiactivity_iedannexiactivitytype_mainactivity_owns (Integer(Boolean)) = 0 iedannexiactivity_iedannexiactivitytype_mainactivity_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/IEDAnnexIActivityValue/5.2(a) permit_owns (Integer(Boolean)) = 0 permit_permitdetails_permitgranted (Integer(Boolean)) = 1 permit_permitdetails_permitreconsidered (Integer(Boolean)) = 0 permit_permitdetails_permitupdated (Integer(Boolean)) = 0 permit_permitdetails_dateofgranting (Date) = 1982/01/01 dateofstartofoperation (Date) = 1982/01/01 pointgeometry = POINT (2.104327 41.991929) Layer name: eureg_productioninstallation_groupedinstallationpart Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL href: String (0.0) title: String (0.0) nilreason: String (0.0) owns: Integer(Boolean) (0.0) DEFAULT 'false' productioninstallatiopart_pf_productioninstallationpart_pkid: String (0.0) productioninstallatipart_eureg_productioninstallatipart_pkid: String (0.0) OGRFeature(eureg_productioninstallation_groupedinstallationpart):1 ogr_pkid (String) = _010101011.INSTALLATION_groupedInstallationPart_1 parent_id (String) = _010101011.INSTALLATION href (String) = #_987654321.PART owns (Integer(Boolean)) = 0 productioninstallatipart_eureg_productioninstallatipart_pkid (String) = _987654321.PART OGRFeature(eureg_productioninstallation_groupedinstallationpart):2 ogr_pkid (String) = _010101012.INSTALLATION_groupedInstallationPart_2 parent_id (String) = _010101012.INSTALLATION href (String) = #_987654322.PART owns (Integer(Boolean)) = 0 productioninstallatipart_eureg_productioninstallatipart_pkid (String) = _987654322.PART Layer name: eureg_productioninstallation_competentauthoritypermits Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' competentauthority_pkid: String (0.0) OGRFeature(eureg_productioninstallation_competentauthoritypermits):1 ogr_pkid (String) = _010101011.INSTALLATION_competentAuthorityPermits_1 parent_id (String) = _010101011.INSTALLATION owns (Integer(Boolean)) = 0 competentauthority_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_2 OGRFeature(eureg_productioninstallation_competentauthoritypermits):2 ogr_pkid (String) = _010101012.INSTALLATION_competentAuthorityPermits_2 parent_id (String) = _010101012.INSTALLATION owns (Integer(Boolean)) = 0 competentauthority_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_4 Layer name: eureg_productioninstallation_competentauthorityinspections Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' competentauthority_pkid: String (0.0) OGRFeature(eureg_productioninstallation_competentauthorityinspections):1 ogr_pkid (String) = _010101011.INSTALLATION_competentAuthorityInspections_1 parent_id (String) = _010101011.INSTALLATION owns (Integer(Boolean)) = 0 competentauthority_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_3 OGRFeature(eureg_productioninstallation_competentauthorityinspections):2 ogr_pkid (String) = _010101012.INSTALLATION_competentAuthorityInspections_2 parent_id (String) = _010101012.INSTALLATION owns (Integer(Boolean)) = 0 competentauthority_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_5 Layer name: eureg_productioninstallation_otherrelevantchapters Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL owns: Integer(Boolean) (0.0) DEFAULT 'false' href: String (0.0) title: String (0.0) nilreason: String (0.0) OGRFeature(eureg_productioninstallation_otherrelevantchapters):1 ogr_pkid (String) = _010101011.INSTALLATION_otherRelevantChapters_1 parent_id (String) = _010101011.INSTALLATION owns (Integer(Boolean)) = 0 href (String) = http://dd.eionet.europa.eu/vocabularyconcept/euregistryonindustrialsites/RelevantChapterValue/ChapterIII OGRFeature(eureg_productioninstallation_otherrelevantchapters):2 ogr_pkid (String) = _010101012.INSTALLATION_otherRelevantChapters_2 parent_id (String) = _010101012.INSTALLATION owns (Integer(Boolean)) = 0 href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/RelevantChapterValue/ChapterIV Layer name: eureg_productioninstallationpart Geometry (pointgeometry): Point Geometry (surfacegeometry): Surface Feature Count: 2 Extent (pointgeometry): (2.104327, 41.991929) - (2.104330, 41.991931) SRS WKT (pointgeometry): GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AXIS["Latitude",NORTH], AXIS["Longitude",EAST], AUTHORITY["EPSG","4258"]] Data axis to CRS axis mapping: 2,1 SRS WKT (surfacegeometry): (unknown) Geometry Column 1 = pointgeometry Geometry Column 2 = surfacegeometry id: String (0.0) NOT NULL gml_description_href: String (0.0) gml_description_title: String (0.0) gml_description_nilreason: String (0.0) gml_description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) inspireid_identifier_localid: String (0.0) NOT NULL inspireid_identifier_namespace: String (0.0) NOT NULL inspireid_identifier_versionid_nilreason: String (0.0) inspireid_identifier_versionid_nil: Integer(Boolean) (0.0) inspireid_identifier_versionid: String (0.0) thematicid_thematicidentifier_identifier: String (0.0) thematicid_thematicidentifier_identifierscheme: String (0.0) type_anyattributes: String (0.0) type: String (0.0) technique_owns: Integer(Boolean) (0.0) DEFAULT 'false' technique_href: String (0.0) technique_title: String (0.0) technique_nilreason: String (0.0) installationpartname_owns: Integer(Boolean) (0.0) DEFAULT 'false' installationpartname_featurename_nameoffeature: String (0.0) NOT NULL installationpartname_featurename_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' installationpartname_featurename_confidentialityreason_href: String (0.0) installationpartname_featurename_confidentialityreason_title: String (0.0) installatiopartname_featurename_confidentialreason_nilreason: String (0.0) planttype_owns: Integer(Boolean) (0.0) DEFAULT 'false' planttype_href: String (0.0) planttype_title: String (0.0) planttype_nilreason: String (0.0) nominalcapacity_owns: Integer(Boolean) (0.0) DEFAULT 'false' nomincapac_capacwasteincintype_totalnominacapacianywastetype: Real (0.0) nominacapaci_capacitwasteincinertype_permittcapacithazardous: Real (0.0) totalratedthermalinput: Real (0.0) dateofstartofoperation_nilreason: String (0.0) dateofstartofoperation: Date (0.0) OGRFeature(eureg_productioninstallationpart):1 id (String) = _987654321.PART inspireid_identifier_localid (String) = 987654321.PART inspireid_identifier_namespace (String) = ES.CAED technique_owns (Integer(Boolean)) = 0 technique_href (String) = (null) installationpartname_owns (Integer(Boolean)) = 0 installationpartname_featurename_nameoffeature (String) = Example large combustion plant installationpartname_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 planttype_owns (Integer(Boolean)) = 0 planttype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/PlantTypeValue/LCP nominalcapacity_owns (Integer(Boolean)) = 0 totalratedthermalinput (Real) = 125 dateofstartofoperation (Date) = 1956/01/01 pointgeometry = POINT (2.104327 41.991929) OGRFeature(eureg_productioninstallationpart):2 id (String) = _987654322.PART inspireid_identifier_localid (String) = 987654322.PART inspireid_identifier_namespace (String) = ES.CAED technique_owns (Integer(Boolean)) = 0 technique_href (String) = (null) installationpartname_owns (Integer(Boolean)) = 0 installationpartname_featurename_nameoffeature (String) = Example waste incinerator installationpartname_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 planttype_owns (Integer(Boolean)) = 0 planttype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/PlantTypeValue/WI nominalcapacity_owns (Integer(Boolean)) = 0 nomincapac_capacwasteincintype_totalnominacapacianywastetype (Real) = 80 nominacapaci_capacitwasteincinertype_permittcapacithazardous (Real) = 0 dateofstartofoperation (Date) = 1982/01/01 pointgeometry = POINT (2.10433 41.991931) Layer name: eureg_productioninstallationpart_status Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL nilreason: String (0.0) statustype_statustype_owns: Integer(Boolean) (0.0) DEFAULT 'false' statustype_statustype_href: String (0.0) statustype_statustype_title: String (0.0) statustype_statustype_nilreason: String (0.0) statustype_description_nilreason: String (0.0) statustype_description_nil: Integer(Boolean) (0.0) statustype_description: String (0.0) statustype_validfrom_nilreason: String (0.0) statustype_validfrom: Date (0.0) statustype_validto_nilreason: String (0.0) statustype_validto_nil: Integer(Boolean) (0.0) statustype_validto: Date (0.0) OGRFeature(eureg_productioninstallationpart_status):1 ogr_pkid (String) = _987654321.PART_status_1 parent_id (String) = _987654321.PART statustype_statustype_owns (Integer(Boolean)) = 0 statustype_statustype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ConditionOfFacilityValue/functional statustype_validfrom (Date) = (null) OGRFeature(eureg_productioninstallationpart_status):2 ogr_pkid (String) = _987654322.PART_status_2 parent_id (String) = _987654322.PART statustype_statustype_owns (Integer(Boolean)) = 0 statustype_statustype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ConditionOfFacilityValue/disused statustype_validfrom (Date) = (null) Layer name: eureg_productionsite Geometry (geometry): Multi Surface Geometry (eureg_location): Point Feature Count: 1 Extent (eureg_location): (2.104334, 41.991925) - (2.104334, 41.991925) SRS WKT (geometry): (unknown) SRS WKT (eureg_location): GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AXIS["Latitude",NORTH], AXIS["Longitude",EAST], AUTHORITY["EPSG","4258"]] Data axis to CRS axis mapping: 2,1 Geometry Column 1 = geometry Geometry Column 2 = eureg_location id: String (0.0) NOT NULL gml_description_href: String (0.0) gml_description_title: String (0.0) gml_description_nilreason: String (0.0) gml_description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) gml_location_location_pkid: String (0.0) inspireid_identifier_localid: String (0.0) NOT NULL inspireid_identifier_namespace: String (0.0) NOT NULL inspireid_identifier_versionid_nilreason: String (0.0) inspireid_identifier_versionid_nil: Integer(Boolean) (0.0) inspireid_identifier_versionid: String (0.0) thematicid_thematicidentifier_identifier: String (0.0) thematicid_thematicidentifier_identifierscheme: String (0.0) sitename_owns: Integer(Boolean) (0.0) DEFAULT 'false' sitename_featurename_nameoffeature: String (0.0) NOT NULL sitename_featurename_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' sitename_featurename_confidentialityreason_href: String (0.0) sitename_featurename_confidentialityreason_title: String (0.0) sitename_featurename_confidentialityreason_nilreason: String (0.0) reportdata_href: String (0.0) reportdata_title: String (0.0) reportdata_nilreason: String (0.0) reportdata_owns: Integer(Boolean) (0.0) DEFAULT 'false' reportdata_reportdata_pkid: String (0.0) OGRFeature(eureg_productionsite):1 id (String) = _123456789.SITE inspireid_identifier_localid (String) = 123456789.SITE inspireid_identifier_namespace (String) = ES.CAED sitename_owns (Integer(Boolean)) = 0 sitename_featurename_nameoffeature (String) = EXAMPLE SITE 1 sitename_featurename_confidentialityreason_owns (Integer(Boolean)) = 0 reportdata_href (String) = #ES.RD.2017 reportdata_owns (Integer(Boolean)) = 0 reportdata_reportdata_pkid (String) = ES.RD.2017 eureg_location = POINT (2.104334 41.991925) Layer name: eureg_productionsite_status Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_id: String (0.0) NOT NULL nilreason: String (0.0) statustype_statustype_owns: Integer(Boolean) (0.0) DEFAULT 'false' statustype_statustype_href: String (0.0) statustype_statustype_title: String (0.0) statustype_statustype_nilreason: String (0.0) statustype_description_nilreason: String (0.0) statustype_description_nil: Integer(Boolean) (0.0) statustype_description: String (0.0) statustype_validfrom_nilreason: String (0.0) statustype_validfrom: Date (0.0) statustype_validto_nilreason: String (0.0) statustype_validto_nil: Integer(Boolean) (0.0) statustype_validto: Date (0.0) OGRFeature(eureg_productionsite_status):1 ogr_pkid (String) = _123456789.SITE_status_1 parent_id (String) = _123456789.SITE statustype_statustype_owns (Integer(Boolean)) = 0 Layer name: reportdata Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) id: String (0.0) NOT NULL description_href: String (0.0) description_title: String (0.0) description_nilreason: String (0.0) description: String (0.0) descriptionreference_href: String (0.0) descriptionreference_title: String (0.0) descriptionreference_nilreason: String (0.0) identifier_codespace: String (0.0) identifier: String (0.0) location_location_pkid: String (0.0) reportingyear: Integer (0.0) NOT NULL countryid_owns: Integer(Boolean) (0.0) DEFAULT 'false' countryid_href: String (0.0) countryid_title: String (0.0) countryid_nilreason: String (0.0) OGRFeature(reportdata):1 id (String) = ES.RD.2017 reportingyear (Integer) = 2017 countryid_owns (Integer(Boolean)) = 0 countryid_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/CountryCodeValue/ES Layer name: pf_inspireid Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL identifier_localid: String (0.0) NOT NULL identifier_namespace: String (0.0) NOT NULL identifier_versionid_nilreason: String (0.0) identifier_versionid_nil: Integer(Boolean) (0.0) identifier_versionid: String (0.0) OGRFeature(pf_inspireid):1 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_inspireId_1 identifier_localid (String) = 010101011.INSTALLATION identifier_namespace (String) = ES.CAED OGRFeature(pf_inspireid):2 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_inspireId_2 identifier_localid (String) = 010101012.INSTALLATION identifier_namespace (String) = ES.CAED Layer name: status Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL nilreason: String (0.0) statustype_statustype_owns: Integer(Boolean) (0.0) DEFAULT 'false' statustype_statustype_href: String (0.0) statustype_statustype_title: String (0.0) statustype_statustype_nilreason: String (0.0) statustype_description_nilreason: String (0.0) statustype_description_nil: Integer(Boolean) (0.0) statustype_description: String (0.0) statustype_validfrom_nilreason: String (0.0) statustype_validfrom: Date (0.0) statustype_validto_nilreason: String (0.0) statustype_validto_nil: Integer(Boolean) (0.0) statustype_validto: Date (0.0) OGRFeature(status):1 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_status_1 statustype_statustype_owns (Integer(Boolean)) = 0 statustype_statustype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ConditionOfFacilityValue/functional statustype_validfrom (Date) = (null) OGRFeature(status):2 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_status_2 statustype_statustype_owns (Integer(Boolean)) = 0 statustype_statustype_href (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/ConditionOfFacilityValue/disused statustype_validfrom (Date) = (null) Layer name: type Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL value: String (0.0) OGRFeature(type):1 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_type_1 OGRFeature(type):2 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_type_2 Layer name: competentauthority Geometry: None Feature Count: 5 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL organisationname: String (0.0) NOT NULL individualname: String (0.0) NOT NULL electronicmailaddress: String (0.0) NOT NULL address_owns: Integer(Boolean) (0.0) DEFAULT 'false' address_addressdetails_streetname: String (0.0) NOT NULL address_addressdetails_buildingnumber: String (0.0) NOT NULL address_addressdetails_city: String (0.0) NOT NULL address_addressdetails_postalcode: String (0.0) NOT NULL address_addressdetails_confidentialityreason_owns: Integer(Boolean) (0.0) DEFAULT 'false' address_addressdetails_confidentialityreason_href: String (0.0) address_addressdetails_confidentialityreason_title: String (0.0) address_addressdetails_confidentialityreason_nilreason: String (0.0) telephoneno: String (0.0) NOT NULL faxno: StringList (0.0) OGRFeature(competentauthority):1 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_1 organisationname (String) = MINISTRY FOR PRTR individualname (String) = Mr John Wayne electronicmailaddress (String) = john.wayne@fake.com address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Ministry Street address_addressdetails_buildingnumber (String) = 20 address_addressdetails_city (String) = MADRID address_addressdetails_postalcode (String) = EX1 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 telephoneno (String) = +34 91 000 000 faxno (StringList) = (1:34 91 000 001) OGRFeature(competentauthority):2 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_2 organisationname (String) = MINISTRY FOR IPPC individualname (String) = MR TOM RICHARDSON electronicmailaddress (String) = tom.richardson@fake.com address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Ministry Street address_addressdetails_buildingnumber (String) = 10 address_addressdetails_city (String) = MADRID address_addressdetails_postalcode (String) = EX3 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 telephoneno (String) = +34 91 001 000 faxno (StringList) = (1:+ 34 91 001 001) OGRFeature(competentauthority):3 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_3 organisationname (String) = MINISTRY FOR IPPC – Compliance Department individualname (String) = MRS KEANE WALTER electronicmailaddress (String) = keane.walter@fake.com address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Ministry Street address_addressdetails_buildingnumber (String) = 10 address_addressdetails_city (String) = MADRID address_addressdetails_postalcode (String) = EX4 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 telephoneno (String) = +34 91 002 000 faxno (StringList) = (1:+ 34 91 002 001) OGRFeature(competentauthority):4 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_4 organisationname (String) = MINISTRY FOR IPPC individualname (String) = MR TOM RICHARDSON electronicmailaddress (String) = tom.richardson@fake.com address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Ministry Street address_addressdetails_buildingnumber (String) = 10 address_addressdetails_city (String) = MADRID address_addressdetails_postalcode (String) = EX5 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 telephoneno (String) = +34 91 001 000 faxno (StringList) = (1:+ 34 91 001 001) OGRFeature(competentauthority):5 ogr_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_CompetentAuthority_5 organisationname (String) = MINISTRY FOR IPPC – Compliance Department individualname (String) = MRS KEANE WALTER electronicmailaddress (String) = keane.walter@fake.com address_owns (Integer(Boolean)) = 0 address_addressdetails_streetname (String) = Ministry Street address_addressdetails_buildingnumber (String) = 10 address_addressdetails_city (String) = MADRID address_addressdetails_postalcode (String) = EX6 000 address_addressdetails_confidentialityreason_owns (Integer(Boolean)) = 0 telephoneno (String) = +34 91 002 000 faxno (StringList) = (1:+ 34 91 002 001) Layer name: eureg_productioninstallation_status_status Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(eureg_productioninstallation_status_status):1 occurrence (Integer) = 1 parent_pkid (String) = _010101011.INSTALLATION child_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_status_1 OGRFeature(eureg_productioninstallation_status_status):2 occurrence (Integer) = 1 parent_pkid (String) = _010101012.INSTALLATION child_pkid (String) = 21E08B3E710F7AE45CC37EA656A15D00_status_2 Layer name: _ogr_fields_metadata Geometry: None Feature Count: 314 Layer SRS WKT: (unknown) layer_name: String (0.0) field_index: Integer (0.0) field_name: String (0.0) field_xpath: String (0.0) field_type: String (0.0) field_is_list: Integer(Boolean) (0.0) field_min_occurs: Integer (0.0) field_max_occurs: Integer (0.0) field_repetition_on_sequence: Integer(Boolean) (0.0) field_default_value: String (0.0) field_fixed_value: String (0.0) field_category: String (0.0) field_related_layer: String (0.0) field_junction_layer: String (0.0) field_documentation: String (0.0) OGRFeature(_ogr_fields_metadata):0 layer_name (String) = productionfacility field_index (Integer) = 1 field_name (String) = id field_xpath (String) = EUReg:ProductionFacility/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):2 layer_name (String) = productionfacility field_index (Integer) = 3 field_name (String) = description_href field_xpath (String) = EUReg:ProductionFacility/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):3 layer_name (String) = productionfacility field_index (Integer) = 4 field_name (String) = description_title field_xpath (String) = EUReg:ProductionFacility/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):4 layer_name (String) = productionfacility field_index (Integer) = 5 field_name (String) = description_nilreason field_xpath (String) = EUReg:ProductionFacility/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5 layer_name (String) = productionfacility field_index (Integer) = 6 field_name (String) = description field_xpath (String) = EUReg:ProductionFacility/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):6 layer_name (String) = productionfacility field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = EUReg:ProductionFacility/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):7 layer_name (String) = productionfacility field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = EUReg:ProductionFacility/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):8 layer_name (String) = productionfacility field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = EUReg:ProductionFacility/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):9 layer_name (String) = productionfacility field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = EUReg:ProductionFacility/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):10 layer_name (String) = productionfacility field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = EUReg:ProductionFacility/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):13 layer_name (String) = productionfacility field_index (Integer) = 14 field_name (String) = inspireid_identifier_localid field_xpath (String) = EUReg:ProductionFacility/act-core:inspireId/base:Identifier/base:localId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A local identifier, assigned by the data provider. The local identifier is unique within the namespace, that is no other spatial object carries the same unique identifier. -- Description -- NOTE It is the responsibility of the data provider to guarantee uniqueness of the local identifier within the namespace. OGRFeature(_ogr_fields_metadata):14 layer_name (String) = productionfacility field_index (Integer) = 15 field_name (String) = inspireid_identifier_namespace field_xpath (String) = EUReg:ProductionFacility/act-core:inspireId/base:Identifier/base:namespace field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Namespace uniquely identifying the data source of the spatial object. -- Description -- NOTE The namespace value will be owned by the data provider of the spatial object and will be registered in the INSPIRE External Object Identifier Namespaces Register. OGRFeature(_ogr_fields_metadata):15 layer_name (String) = productionfacility field_index (Integer) = 16 field_name (String) = inspireid_identifier_versionid_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:inspireId/base:Identifier/base:versionId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):16 layer_name (String) = productionfacility field_index (Integer) = 17 field_name (String) = inspireid_identifier_versionid_nil field_xpath (String) = EUReg:ProductionFacility/act-core:inspireId/base:Identifier/base:versionId/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):17 layer_name (String) = productionfacility field_index (Integer) = 18 field_name (String) = inspireid_identifier_versionid field_xpath (String) = EUReg:ProductionFacility/act-core:inspireId/base:Identifier/base:versionId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The identifier of the particular version of the spatial object, with a maximum length of 25 characters. If the specification of a spatial object type with an external object identifier includes life-cycle information, the version identifier is used to distinguish between the different versions of a spatial object. Within the set of all versions of a spatial object, the version identifier is unique. -- Description -- NOTE The maximum length has been selected to allow for time stamps based on ISO 8601, for example, "2007-02-12T12:12:12+05:30" as the version identifier. NOTE 2 The property is void, if the spatial data set does not distinguish between different versions of the spatial object. It is missing, if the spatial object type does not support any life-cycle information. OGRFeature(_ogr_fields_metadata):19 layer_name (String) = productionfacility field_index (Integer) = 20 field_name (String) = act_core_name_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:name/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):20 layer_name (String) = productionfacility field_index (Integer) = 21 field_name (String) = act_core_name_nil field_xpath (String) = EUReg:ProductionFacility/act-core:name/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):21 layer_name (String) = productionfacility field_index (Integer) = 22 field_name (String) = act_core_name field_xpath (String) = EUReg:ProductionFacility/act-core:name field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- name -- Definition -- Descriptive name of the “Activity Complex”. -- Description -- NOTE 1 Several names in different languages may be expressed. NOTE 2 It is recommended that the language of the name (part of the Geographical/Name data type) be filled whenever possible. OGRFeature(_ogr_fields_metadata):22 layer_name (String) = productionfacility field_index (Integer) = 23 field_name (String) = geometry field_xpath (String) = EUReg:ProductionFacility/act-core:geometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- geometry -- Definition -- The geometry used to define the extent or position of the “Activity Complex”. -- Description -- NOTE 1 Based on the provided description, different geometries could be used to represent the Activity Complex as a one legal whole. EXAMPLE 1 E-prtr geometry is given by a single point based on Geographical Coordinates (see below). In other levels of detail or depending on the Data Provider this could be represented [e.g.] by a Multi-poligon. EXAMPLE 2 PRTR - Legal act example: “ … the latitude and longitude coordinates within an arc of 5 minutes that avoid the direct identification of an individual holding….”. A geometric property may either be any geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same or another document). Note that either the reference or the contained element shall be given, but not both or none. If a feature has a property that takes a geometry element as its value, this is called a geometry property. A generic type for such a geometry property is GeometryPropertyType. OGRFeature(_ogr_fields_metadata):23 layer_name (String) = productionfacility field_index (Integer) = 24 field_name (String) = function field_xpath (String) = EUReg:ProductionFacility/act-core:function field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_function OGRFeature(_ogr_fields_metadata):24 layer_name (String) = productionfacility field_index (Integer) = 25 field_name (String) = validfrom_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:validFrom/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):25 layer_name (String) = productionfacility field_index (Integer) = 26 field_name (String) = validfrom field_xpath (String) = EUReg:ProductionFacility/act-core:validFrom field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- valid from -- Definition -- The time when the activity complex started to exist in the real world. OGRFeature(_ogr_fields_metadata):26 layer_name (String) = productionfacility field_index (Integer) = 27 field_name (String) = validto_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:validTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):27 layer_name (String) = productionfacility field_index (Integer) = 28 field_name (String) = validto_nil field_xpath (String) = EUReg:ProductionFacility/act-core:validTo/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):28 layer_name (String) = productionfacility field_index (Integer) = 29 field_name (String) = validto field_xpath (String) = EUReg:ProductionFacility/act-core:validTo field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- valid to -- Definition -- The time when the activity complex no longer exists in the real world. OGRFeature(_ogr_fields_metadata):29 layer_name (String) = productionfacility field_index (Integer) = 30 field_name (String) = beginlifespanversion_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:beginLifespanVersion/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):30 layer_name (String) = productionfacility field_index (Integer) = 31 field_name (String) = beginlifespanversion field_xpath (String) = EUReg:ProductionFacility/act-core:beginLifespanVersion field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- begin lifespan version -- Definition -- Date and time at which this version of the spatial object was inserted or changed in the spatial data set. -- Description -- NOTE This date is recorded to enable the generation of change only update files. OGRFeature(_ogr_fields_metadata):31 layer_name (String) = productionfacility field_index (Integer) = 32 field_name (String) = endlifespanversion_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:endLifespanVersion/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):32 layer_name (String) = productionfacility field_index (Integer) = 33 field_name (String) = endlifespanversion_nil field_xpath (String) = EUReg:ProductionFacility/act-core:endLifespanVersion/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):33 layer_name (String) = productionfacility field_index (Integer) = 34 field_name (String) = endlifespanversion field_xpath (String) = EUReg:ProductionFacility/act-core:endLifespanVersion field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- end lifespan version -- Definition -- Date and time at which this version of the spatial object was superseded or retired in the spatial data set. -- Description -- NOTE This date is recorded primarily for those systems which "close" an entry in the spatial data set in the event of an attribute change. OGRFeature(_ogr_fields_metadata):34 layer_name (String) = productionfacility field_index (Integer) = 35 field_name (String) = surfacegeometry field_xpath (String) = EUReg:ProductionFacility/pf:surfaceGeometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the secondary geometry property for the Production Facility and it is set as an optional property to identify the location area for the Facility. It is intended, if available, to furnish a more detailed spatial information in addition to the basic mandatory geometry. A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):35 layer_name (String) = productionfacility field_index (Integer) = 36 field_name (String) = riverbasindistrict_anyattributes field_xpath (String) = EUReg:ProductionFacility/pf:riverBasinDistrict/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):36 layer_name (String) = productionfacility field_index (Integer) = 37 field_name (String) = riverbasindistrict field_xpath (String) = EUReg:ProductionFacility/pf:riverBasinDistrict field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Code identifier and/or name assigned to the basin district of a watercourse. -- Description -- NOTE Information required (not registered in the Hydrography Theme) according to Article 3(1) of Directive 2000/60/EC of the European Parliament and of the Council of 23 October 2000 establishing a framework for Community action in the field of water policy (OJ L 327, 22.12.2000, p. 1). Directive as amended by Decision No 2455/2001/EC (OJ L 331, 15.12.2001, p. 1). OGRFeature(_ogr_fields_metadata):37 layer_name (String) = productionfacility field_index (Integer) = 38 field_name (String) = status field_xpath (String) = EUReg:ProductionFacility/pf:status field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_status OGRFeature(_ogr_fields_metadata):39 layer_name (String) = productionfacility field_index (Integer) = 40 field_name (String) = hostingsite_href field_xpath (String) = EUReg:ProductionFacility/pf:hostingSite/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):40 layer_name (String) = productionfacility field_index (Integer) = 41 field_name (String) = hostingsite_title field_xpath (String) = EUReg:ProductionFacility/pf:hostingSite/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):41 layer_name (String) = productionfacility field_index (Integer) = 42 field_name (String) = hostingsite_nilreason field_xpath (String) = EUReg:ProductionFacility/pf:hostingSite/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):42 layer_name (String) = productionfacility field_index (Integer) = 43 field_name (String) = hostingsite_owns field_xpath (String) = EUReg:ProductionFacility/pf:hostingSite/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):44 layer_name (String) = productionfacility field_index (Integer) = 45 field_name (String) = hostingsite_productionsite_eureg_productionsite_pkid field_xpath (String) = EUReg:ProductionFacility/pf:hostingSite/EUReg:ProductionSite field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = eureg_productionsite OGRFeature(_ogr_fields_metadata):45 layer_name (String) = productionfacility field_index (Integer) = 46 field_name (String) = groupedinstallation field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_groupedinstallation OGRFeature(_ogr_fields_metadata):47 layer_name (String) = productionfacility field_index (Integer) = 48 field_name (String) = facilityname_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):48 layer_name (String) = productionfacility field_index (Integer) = 49 field_name (String) = facilityname_featurename_nameoffeature field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/EUReg:FeatureName/EUReg:nameOfFeature field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):49 layer_name (String) = productionfacility field_index (Integer) = 50 field_name (String) = facilityname_featurename_confidentialityreason_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/EUReg:FeatureName/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):50 layer_name (String) = productionfacility field_index (Integer) = 51 field_name (String) = facilityname_featurename_confidentialityreason_href field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):51 layer_name (String) = productionfacility field_index (Integer) = 52 field_name (String) = facilityname_featurename_confidentialityreason_title field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):52 layer_name (String) = productionfacility field_index (Integer) = 53 field_name (String) = facilityname_featurename_confidentialityreason_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:facilityName/EUReg:FeatureName/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):53 layer_name (String) = productionfacility field_index (Integer) = 54 field_name (String) = competentauthorityeprtr field_xpath (String) = EUReg:ProductionFacility/EUReg:competentAuthorityEPRTR field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_competentauthorityeprtr OGRFeature(_ogr_fields_metadata):54 layer_name (String) = productionfacility field_index (Integer) = 55 field_name (String) = parentcompany_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):55 layer_name (String) = productionfacility field_index (Integer) = 56 field_name (String) = parentcompany_parentcompanydetails_parentcompanyname field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:parentCompanyName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):56 layer_name (String) = productionfacility field_index (Integer) = 57 field_name (String) = parentcompany_parentcompanydetails_parentcompanyurl field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:parentCompanyURL field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):57 layer_name (String) = productionfacility field_index (Integer) = 58 field_name (String) = parentcompany_parentcompanydetails_confidentialitreason_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):58 layer_name (String) = productionfacility field_index (Integer) = 59 field_name (String) = parentcompany_parentcompanydetails_confidentialitreason_href field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):59 layer_name (String) = productionfacility field_index (Integer) = 60 field_name (String) = parentcompany_parentcompanydetails_confidentialireason_title field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):60 layer_name (String) = productionfacility field_index (Integer) = 61 field_name (String) = parentcompany_parentcompanydetails_confidentreason_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:parentCompany/EUReg:ParentCompanyDetails/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):61 layer_name (String) = productionfacility field_index (Integer) = 62 field_name (String) = eprtrannexiactivity_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):62 layer_name (String) = productionfacility field_index (Integer) = 63 field_name (String) = eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:mainActivity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):63 layer_name (String) = productionfacility field_index (Integer) = 64 field_name (String) = eprtrannexiactivity_eprtrannexiactivitytyp_mainactivity_href field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:mainActivity/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):64 layer_name (String) = productionfacility field_index (Integer) = 65 field_name (String) = eprtrannexiactivity_eprtrannexiactivityty_mainactivity_title field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:mainActivity/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):65 layer_name (String) = productionfacility field_index (Integer) = 66 field_name (String) = eprtrannexiactivit_eprtrannexiactivit_mainactivity_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:mainActivity/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):66 layer_name (String) = productionfacility field_index (Integer) = 67 field_name (String) = eprtrannexiactivity_eprtrannexiactivitytype_otheractivity field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity OGRFeature(_ogr_fields_metadata):67 layer_name (String) = productionfacility field_index (Integer) = 68 field_name (String) = remarks field_xpath (String) = EUReg:ProductionFacility/EUReg:remarks field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):68 layer_name (String) = productionfacility field_index (Integer) = 69 field_name (String) = dateofstartofoperation_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:dateOfStartOfOperation/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):69 layer_name (String) = productionfacility field_index (Integer) = 70 field_name (String) = dateofstartofoperation field_xpath (String) = EUReg:ProductionFacility/EUReg:dateOfStartOfOperation field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):70 layer_name (String) = productionfacility field_index (Integer) = 71 field_name (String) = address_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:address/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):71 layer_name (String) = productionfacility field_index (Integer) = 72 field_name (String) = address_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:address/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):72 layer_name (String) = productionfacility field_index (Integer) = 73 field_name (String) = address_addressdetails_streetname field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:streetName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):73 layer_name (String) = productionfacility field_index (Integer) = 74 field_name (String) = address_addressdetails_buildingnumber field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:buildingNumber field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):74 layer_name (String) = productionfacility field_index (Integer) = 75 field_name (String) = address_addressdetails_city field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:city field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):75 layer_name (String) = productionfacility field_index (Integer) = 76 field_name (String) = address_addressdetails_postalcode field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:postalCode field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):76 layer_name (String) = productionfacility field_index (Integer) = 77 field_name (String) = address_addressdetails_confidentialityreason_owns field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):77 layer_name (String) = productionfacility field_index (Integer) = 78 field_name (String) = address_addressdetails_confidentialityreason_href field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):78 layer_name (String) = productionfacility field_index (Integer) = 79 field_name (String) = address_addressdetails_confidentialityreason_title field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):79 layer_name (String) = productionfacility field_index (Integer) = 80 field_name (String) = address_addressdetails_confidentialityreason_nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):89 layer_name (String) = productionfacility_function field_index (Integer) = 1 field_name (String) = function_activity field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = productionfacility_function_function_activity OGRFeature(_ogr_fields_metadata):92 layer_name (String) = productionfacility_function field_index (Integer) = 4 field_name (String) = function_description_nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:description/@gco:nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):93 layer_name (String) = productionfacility_function field_index (Integer) = 5 field_name (String) = function_description_characterstring field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:description/gco:CharacterString field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):94 layer_name (String) = productionfacility_function field_index (Integer) = 6 field_name (String) = function_description_pt_freetext_id field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:description/gmd:PT_FreeText/@id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):95 layer_name (String) = productionfacility_function field_index (Integer) = 7 field_name (String) = function_description_pt_freetext_uuid field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:description/gmd:PT_FreeText/@uuid field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):97 layer_name (String) = productionfacility_function_function_activity field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):98 layer_name (String) = productionfacility_function_function_activity field_index (Integer) = 2 field_name (String) = href field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):99 layer_name (String) = productionfacility_function_function_activity field_index (Integer) = 3 field_name (String) = title field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):100 layer_name (String) = productionfacility_function_function_activity field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):116 layer_name (String) = productionfacility_status field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionFacility/pf:status/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):117 layer_name (String) = productionfacility_status field_index (Integer) = 2 field_name (String) = statustype_statustype_owns field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:statusType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):118 layer_name (String) = productionfacility_status field_index (Integer) = 3 field_name (String) = statustype_statustype_href field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:statusType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):119 layer_name (String) = productionfacility_status field_index (Integer) = 4 field_name (String) = statustype_statustype_title field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:statusType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):120 layer_name (String) = productionfacility_status field_index (Integer) = 5 field_name (String) = statustype_statustype_nilreason field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:statusType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):121 layer_name (String) = productionfacility_status field_index (Integer) = 6 field_name (String) = statustype_description_nilreason field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):122 layer_name (String) = productionfacility_status field_index (Integer) = 7 field_name (String) = statustype_description_nil field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:description/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):123 layer_name (String) = productionfacility_status field_index (Integer) = 8 field_name (String) = statustype_description field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Descriptive statement about the declared status. OGRFeature(_ogr_fields_metadata):124 layer_name (String) = productionfacility_status field_index (Integer) = 9 field_name (String) = statustype_validfrom_nilreason field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:validFrom/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):125 layer_name (String) = productionfacility_status field_index (Integer) = 10 field_name (String) = statustype_validfrom field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:validFrom field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The starting time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):126 layer_name (String) = productionfacility_status field_index (Integer) = 11 field_name (String) = statustype_validto_nilreason field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:validTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):127 layer_name (String) = productionfacility_status field_index (Integer) = 12 field_name (String) = statustype_validto_nil field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:validTo/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):128 layer_name (String) = productionfacility_status field_index (Integer) = 13 field_name (String) = statustype_validto field_xpath (String) = EUReg:ProductionFacility/pf:status/pf:StatusType/pf:validTo field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The ending time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):175 layer_name (String) = productionfacility_groupedinstallation field_index (Integer) = 1 field_name (String) = href field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):176 layer_name (String) = productionfacility_groupedinstallation field_index (Integer) = 2 field_name (String) = title field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):177 layer_name (String) = productionfacility_groupedinstallation field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):178 layer_name (String) = productionfacility_groupedinstallation field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):180 layer_name (String) = productionfacility_groupedinstallation field_index (Integer) = 6 field_name (String) = productioninstallation_eureg_productioninstallation_pkid field_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation/EUReg:ProductionInstallation field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = eureg_productioninstallation OGRFeature(_ogr_fields_metadata):253 layer_name (String) = productionfacility_competentauthorityeprtr field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionFacility/EUReg:competentAuthorityEPRTR/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):254 layer_name (String) = productionfacility_competentauthorityeprtr field_index (Integer) = 2 field_name (String) = competentauthority_pkid field_xpath (String) = EUReg:ProductionFacility/EUReg:competentAuthorityEPRTR/EUReg:CompetentAuthority field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = competentauthority OGRFeature(_ogr_fields_metadata):255 layer_name (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):256 layer_name (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity field_index (Integer) = 2 field_name (String) = href field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):257 layer_name (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity field_index (Integer) = 3 field_name (String) = title field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):258 layer_name (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):259 layer_name (String) = eureg_productioninstallation field_index (Integer) = 1 field_name (String) = id field_xpath (String) = EUReg:ProductionInstallation/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):261 layer_name (String) = eureg_productioninstallation field_index (Integer) = 3 field_name (String) = gml_description_href field_xpath (String) = EUReg:ProductionInstallation/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):262 layer_name (String) = eureg_productioninstallation field_index (Integer) = 4 field_name (String) = gml_description_title field_xpath (String) = EUReg:ProductionInstallation/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):263 layer_name (String) = eureg_productioninstallation field_index (Integer) = 5 field_name (String) = gml_description_nilreason field_xpath (String) = EUReg:ProductionInstallation/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):264 layer_name (String) = eureg_productioninstallation field_index (Integer) = 6 field_name (String) = gml_description field_xpath (String) = EUReg:ProductionInstallation/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):265 layer_name (String) = eureg_productioninstallation field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = EUReg:ProductionInstallation/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):266 layer_name (String) = eureg_productioninstallation field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = EUReg:ProductionInstallation/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):267 layer_name (String) = eureg_productioninstallation field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = EUReg:ProductionInstallation/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):268 layer_name (String) = eureg_productioninstallation field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = EUReg:ProductionInstallation/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):269 layer_name (String) = eureg_productioninstallation field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = EUReg:ProductionInstallation/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):272 layer_name (String) = eureg_productioninstallation field_index (Integer) = 14 field_name (String) = inspireid_pkid field_xpath (String) = EUReg:ProductionInstallation/pf:inspireId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = pf_inspireid OGRFeature(_ogr_fields_metadata):274 layer_name (String) = eureg_productioninstallation field_index (Integer) = 16 field_name (String) = pointgeometry field_xpath (String) = EUReg:ProductionInstallation/pf:pointGeometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the basic geometry property for the Production Installation and it is set as an optional property to identify the location point for the Installation. It is intended, if available, to furnish an additional spatial information beside the basic mandatory geometry fixed for the Production Facility. A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):275 layer_name (String) = eureg_productioninstallation field_index (Integer) = 17 field_name (String) = surfacegeometry field_xpath (String) = EUReg:ProductionInstallation/pf:surfaceGeometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the secondary geometry property for the Production Installation and it is set as an optional property to identify the location area for the Installation. It is intended, if available, to furnish a detailed spatial information beside the basic mandatory geometry fixed for the Production Facility. A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):278 layer_name (String) = eureg_productioninstallation field_index (Integer) = 20 field_name (String) = status_status field_xpath (String) = EUReg:ProductionInstallation/pf:status field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = status field_junction_layer (String) = eureg_productioninstallation_status_status OGRFeature(_ogr_fields_metadata):279 layer_name (String) = eureg_productioninstallation field_index (Integer) = 21 field_name (String) = type_pkid field_xpath (String) = EUReg:ProductionInstallation/pf:type field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = type OGRFeature(_ogr_fields_metadata):280 layer_name (String) = eureg_productioninstallation field_index (Integer) = 22 field_name (String) = groupedinstallationpart field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productioninstallation_groupedinstallationpart OGRFeature(_ogr_fields_metadata):281 layer_name (String) = eureg_productioninstallation field_index (Integer) = 23 field_name (String) = installationname_owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):282 layer_name (String) = eureg_productioninstallation field_index (Integer) = 24 field_name (String) = installationname_featurename_nameoffeature field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/EUReg:FeatureName/EUReg:nameOfFeature field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):283 layer_name (String) = eureg_productioninstallation field_index (Integer) = 25 field_name (String) = installationname_featurename_confidentialityreason_owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/EUReg:FeatureName/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):284 layer_name (String) = eureg_productioninstallation field_index (Integer) = 26 field_name (String) = installationname_featurename_confidentialityreason_href field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):285 layer_name (String) = eureg_productioninstallation field_index (Integer) = 27 field_name (String) = installationname_featurename_confidentialityreason_title field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):286 layer_name (String) = eureg_productioninstallation field_index (Integer) = 28 field_name (String) = installationname_featurename_confidentialityreason_nilreason field_xpath (String) = EUReg:ProductionInstallation/EUReg:installationName/EUReg:FeatureName/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):287 layer_name (String) = eureg_productioninstallation field_index (Integer) = 29 field_name (String) = baselinereportpreparedindicator field_xpath (String) = EUReg:ProductionInstallation/EUReg:baselineReportPreparedIndicator field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):288 layer_name (String) = eureg_productioninstallation field_index (Integer) = 30 field_name (String) = batderogationindicator field_xpath (String) = EUReg:ProductionInstallation/EUReg:BATDerogationIndicator field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):289 layer_name (String) = eureg_productioninstallation field_index (Integer) = 31 field_name (String) = competentauthoritypermits field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityPermits field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productioninstallation_competentauthoritypermits OGRFeature(_ogr_fields_metadata):290 layer_name (String) = eureg_productioninstallation field_index (Integer) = 32 field_name (String) = competentauthorityinspections field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityInspections field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productioninstallation_competentauthorityinspections OGRFeature(_ogr_fields_metadata):291 layer_name (String) = eureg_productioninstallation field_index (Integer) = 33 field_name (String) = inspections field_xpath (String) = EUReg:ProductionInstallation/EUReg:inspections field_type (String) = integer field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):292 layer_name (String) = eureg_productioninstallation field_index (Integer) = 34 field_name (String) = etsidentifier field_xpath (String) = EUReg:ProductionInstallation/EUReg:ETSIdentifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):293 layer_name (String) = eureg_productioninstallation field_index (Integer) = 35 field_name (String) = espirsidentifier field_xpath (String) = EUReg:ProductionInstallation/EUReg:eSPIRSIdentifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):294 layer_name (String) = eureg_productioninstallation field_index (Integer) = 36 field_name (String) = iedannexiactivity_owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:IEDAnnexIActivity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):295 layer_name (String) = eureg_productioninstallation field_index (Integer) = 37 field_name (String) = iedannexiactivity_iedannexiactivitytype_mainactivity_owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:IEDAnnexIActivity/EUReg:IEDAnnexIActivityType/EUReg:mainActivity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):296 layer_name (String) = eureg_productioninstallation field_index (Integer) = 38 field_name (String) = iedannexiactivity_iedannexiactivitytype_mainactivity_href field_xpath (String) = EUReg:ProductionInstallation/EUReg:IEDAnnexIActivity/EUReg:IEDAnnexIActivityType/EUReg:mainActivity/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):297 layer_name (String) = eureg_productioninstallation field_index (Integer) = 39 field_name (String) = iedannexiactivity_iedannexiactivitytype_mainactivity_title field_xpath (String) = EUReg:ProductionInstallation/EUReg:IEDAnnexIActivity/EUReg:IEDAnnexIActivityType/EUReg:mainActivity/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):298 layer_name (String) = eureg_productioninstallation field_index (Integer) = 40 field_name (String) = iedannexiactivity_iedannexiactivityty_mainactivity_nilreason field_xpath (String) = EUReg:ProductionInstallation/EUReg:IEDAnnexIActivity/EUReg:IEDAnnexIActivityType/EUReg:mainActivity/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):300 layer_name (String) = eureg_productioninstallation field_index (Integer) = 42 field_name (String) = permit_owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):301 layer_name (String) = eureg_productioninstallation field_index (Integer) = 43 field_name (String) = permit_permitdetails_permitgranted field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:permitGranted field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):302 layer_name (String) = eureg_productioninstallation field_index (Integer) = 44 field_name (String) = permit_permitdetails_permitreconsidered field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:permitReconsidered field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):303 layer_name (String) = eureg_productioninstallation field_index (Integer) = 45 field_name (String) = permit_permitdetails_permitupdated field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:permitUpdated field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):304 layer_name (String) = eureg_productioninstallation field_index (Integer) = 46 field_name (String) = permit_permitdetails_dateofgranting field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:dateOfGranting field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):305 layer_name (String) = eureg_productioninstallation field_index (Integer) = 47 field_name (String) = permit_permitdetails_dateoflastreconsideration field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:dateOfLastReconsideration field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):306 layer_name (String) = eureg_productioninstallation field_index (Integer) = 48 field_name (String) = permit_permitdetails_dateoflastupdate field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:dateOfLastUpdate field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):307 layer_name (String) = eureg_productioninstallation field_index (Integer) = 49 field_name (String) = permit_permitdetails_permiturl field_xpath (String) = EUReg:ProductionInstallation/EUReg:permit/EUReg:PermitDetails/EUReg:permitURL field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):308 layer_name (String) = eureg_productioninstallation field_index (Integer) = 50 field_name (String) = otherrelevantchapters field_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productioninstallation_otherrelevantchapters OGRFeature(_ogr_fields_metadata):309 layer_name (String) = eureg_productioninstallation field_index (Integer) = 51 field_name (String) = dateofstartofoperation_nilreason field_xpath (String) = EUReg:ProductionInstallation/EUReg:dateOfStartOfOperation/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):310 layer_name (String) = eureg_productioninstallation field_index (Integer) = 52 field_name (String) = dateofstartofoperation field_xpath (String) = EUReg:ProductionInstallation/EUReg:dateOfStartOfOperation field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):322 layer_name (String) = eureg_productioninstallation_groupedinstallationpart field_index (Integer) = 1 field_name (String) = href field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):323 layer_name (String) = eureg_productioninstallation_groupedinstallationpart field_index (Integer) = 2 field_name (String) = title field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):324 layer_name (String) = eureg_productioninstallation_groupedinstallationpart field_index (Integer) = 3 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):325 layer_name (String) = eureg_productioninstallation_groupedinstallationpart field_index (Integer) = 4 field_name (String) = owns field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):327 layer_name (String) = eureg_productioninstallation_groupedinstallationpart field_index (Integer) = 6 field_name (String) = productioninstallatipart_eureg_productioninstallatipart_pkid field_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart/EUReg:ProductionInstallationPart field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = eureg_productioninstallationpart OGRFeature(_ogr_fields_metadata):328 layer_name (String) = eureg_productioninstallation_competentauthoritypermits field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityPermits/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):329 layer_name (String) = eureg_productioninstallation_competentauthoritypermits field_index (Integer) = 2 field_name (String) = competentauthority_pkid field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityPermits/EUReg:CompetentAuthority field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = competentauthority OGRFeature(_ogr_fields_metadata):330 layer_name (String) = eureg_productioninstallation_competentauthorityinspections field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityInspections/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):331 layer_name (String) = eureg_productioninstallation_competentauthorityinspections field_index (Integer) = 2 field_name (String) = competentauthority_pkid field_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityInspections/EUReg:CompetentAuthority field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = competentauthority OGRFeature(_ogr_fields_metadata):336 layer_name (String) = eureg_productioninstallation_otherrelevantchapters field_index (Integer) = 1 field_name (String) = owns field_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):337 layer_name (String) = eureg_productioninstallation_otherrelevantchapters field_index (Integer) = 2 field_name (String) = href field_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):338 layer_name (String) = eureg_productioninstallation_otherrelevantchapters field_index (Integer) = 3 field_name (String) = title field_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):339 layer_name (String) = eureg_productioninstallation_otherrelevantchapters field_index (Integer) = 4 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):340 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 1 field_name (String) = id field_xpath (String) = EUReg:ProductionInstallationPart/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):342 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 3 field_name (String) = gml_description_href field_xpath (String) = EUReg:ProductionInstallationPart/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):343 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 4 field_name (String) = gml_description_title field_xpath (String) = EUReg:ProductionInstallationPart/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):344 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 5 field_name (String) = gml_description_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):345 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 6 field_name (String) = gml_description field_xpath (String) = EUReg:ProductionInstallationPart/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):346 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = EUReg:ProductionInstallationPart/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):347 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = EUReg:ProductionInstallationPart/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):348 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):349 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = EUReg:ProductionInstallationPart/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):350 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = EUReg:ProductionInstallationPart/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):353 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 14 field_name (String) = inspireid_identifier_localid field_xpath (String) = EUReg:ProductionInstallationPart/pf:inspireId/base:Identifier/base:localId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A local identifier, assigned by the data provider. The local identifier is unique within the namespace, that is no other spatial object carries the same unique identifier. -- Description -- NOTE It is the responsibility of the data provider to guarantee uniqueness of the local identifier within the namespace. OGRFeature(_ogr_fields_metadata):354 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 15 field_name (String) = inspireid_identifier_namespace field_xpath (String) = EUReg:ProductionInstallationPart/pf:inspireId/base:Identifier/base:namespace field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Namespace uniquely identifying the data source of the spatial object. -- Description -- NOTE The namespace value will be owned by the data provider of the spatial object and will be registered in the INSPIRE External Object Identifier Namespaces Register. OGRFeature(_ogr_fields_metadata):355 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 16 field_name (String) = inspireid_identifier_versionid_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:inspireId/base:Identifier/base:versionId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):356 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 17 field_name (String) = inspireid_identifier_versionid_nil field_xpath (String) = EUReg:ProductionInstallationPart/pf:inspireId/base:Identifier/base:versionId/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):357 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 18 field_name (String) = inspireid_identifier_versionid field_xpath (String) = EUReg:ProductionInstallationPart/pf:inspireId/base:Identifier/base:versionId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The identifier of the particular version of the spatial object, with a maximum length of 25 characters. If the specification of a spatial object type with an external object identifier includes life-cycle information, the version identifier is used to distinguish between the different versions of a spatial object. Within the set of all versions of a spatial object, the version identifier is unique. -- Description -- NOTE The maximum length has been selected to allow for time stamps based on ISO 8601, for example, "2007-02-12T12:12:12+05:30" as the version identifier. NOTE 2 The property is void, if the spatial data set does not distinguish between different versions of the spatial object. It is missing, if the spatial object type does not support any life-cycle information. OGRFeature(_ogr_fields_metadata):358 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 19 field_name (String) = thematicid_thematicidentifier_identifier field_xpath (String) = EUReg:ProductionInstallationPart/pf:thematicId/base2:ThematicIdentifier/base2:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- identifier -- Definition -- Unique identifier used to identify the spatial object within the specified identification scheme. OGRFeature(_ogr_fields_metadata):359 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 20 field_name (String) = thematicid_thematicidentifier_identifierscheme field_xpath (String) = EUReg:ProductionInstallationPart/pf:thematicId/base2:ThematicIdentifier/base2:identifierScheme field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- identifier scheme -- Definition -- Identifier defining the scheme used to assign the identifier. -- Description -- NOTE 1: Reporting requirements for different environmental legislation mandate that each spatial object is assigned an identifier conforming to specific lexical rules. NOTE 2: These rules are often inconsistent so a spatial object may be assigned multiple identifiers which are used for object referencing to link information to the spatial object. OGRFeature(_ogr_fields_metadata):360 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 21 field_name (String) = pointgeometry field_xpath (String) = EUReg:ProductionInstallationPart/pf:pointGeometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the basic geometry property for the Production Installation Part and it is set as an optional property to identify the location point for the Installation Part. It is intended, if available, to furnish an additional spatial information beside the basic mandatory geometry fixed for the Production Facility. A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):361 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 22 field_name (String) = surfacegeometry field_xpath (String) = EUReg:ProductionInstallationPart/pf:surfaceGeometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the secondary geometry property for the Production Installation Part and it is set as an optional property to identify the location area for the Installation Part. It is intended, if available, to furnish a detailed spatial information beside the basic mandatory geometry fixed for the Production Facility. A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):364 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 25 field_name (String) = status field_xpath (String) = EUReg:ProductionInstallationPart/pf:status field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productioninstallationpart_status OGRFeature(_ogr_fields_metadata):365 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 26 field_name (String) = type_anyattributes field_xpath (String) = EUReg:ProductionInstallationPart/pf:type/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):366 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 27 field_name (String) = type field_xpath (String) = EUReg:ProductionInstallationPart/pf:type field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Special kind of an installation part, denoting the operative function which has to be performed. -- Description -- EXAMPLE Chimney, pump. OGRFeature(_ogr_fields_metadata):367 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 28 field_name (String) = technique_owns field_xpath (String) = EUReg:ProductionInstallationPart/pf:technique/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):368 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 29 field_name (String) = technique_href field_xpath (String) = EUReg:ProductionInstallationPart/pf:technique/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):369 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 30 field_name (String) = technique_title field_xpath (String) = EUReg:ProductionInstallationPart/pf:technique/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):370 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 31 field_name (String) = technique_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:technique/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):371 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 32 field_name (String) = installationpartname_owns field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):372 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 33 field_name (String) = installationpartname_featurename_nameoffeature field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/EUReg:FeatureName/EUReg:nameOfFeature field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):373 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 34 field_name (String) = installationpartname_featurename_confidentialityreason_owns field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/EUReg:FeatureName/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):374 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 35 field_name (String) = installationpartname_featurename_confidentialityreason_href field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):375 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 36 field_name (String) = installationpartname_featurename_confidentialityreason_title field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):376 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 37 field_name (String) = installatiopartname_featurename_confidentialreason_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:installationPartName/EUReg:FeatureName/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):377 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 38 field_name (String) = planttype_owns field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:plantType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):378 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 39 field_name (String) = planttype_href field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:plantType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):379 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 40 field_name (String) = planttype_title field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:plantType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):380 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 41 field_name (String) = planttype_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:plantType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):382 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 43 field_name (String) = nominalcapacity_owns field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:nominalCapacity/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):383 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 44 field_name (String) = nomincapac_capacwasteincintype_totalnominacapacianywastetype field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:nominalCapacity/EUReg:CapacityWasteIncinerationType/EUReg:totalNominalCapacityAnyWasteType field_type (String) = double field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):384 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 45 field_name (String) = nominacapaci_capacitwasteincinertype_permittcapacithazardous field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:nominalCapacity/EUReg:CapacityWasteIncinerationType/EUReg:permittedCapacityHazardous field_type (String) = double field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):385 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 46 field_name (String) = totalratedthermalinput field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:totalRatedThermalInput field_type (String) = double field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):387 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 48 field_name (String) = dateofstartofoperation_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:dateOfStartOfOperation/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):388 layer_name (String) = eureg_productioninstallationpart field_index (Integer) = 49 field_name (String) = dateofstartofoperation field_xpath (String) = EUReg:ProductionInstallationPart/EUReg:dateOfStartOfOperation field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):400 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):401 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 2 field_name (String) = statustype_statustype_owns field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:statusType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):402 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 3 field_name (String) = statustype_statustype_href field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:statusType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):403 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 4 field_name (String) = statustype_statustype_title field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:statusType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):404 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 5 field_name (String) = statustype_statustype_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:statusType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):405 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 6 field_name (String) = statustype_description_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):406 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 7 field_name (String) = statustype_description_nil field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:description/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):407 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 8 field_name (String) = statustype_description field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Descriptive statement about the declared status. OGRFeature(_ogr_fields_metadata):408 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 9 field_name (String) = statustype_validfrom_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:validFrom/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):409 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 10 field_name (String) = statustype_validfrom field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:validFrom field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The starting time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):410 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 11 field_name (String) = statustype_validto_nilreason field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:validTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):411 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 12 field_name (String) = statustype_validto_nil field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:validTo/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):412 layer_name (String) = eureg_productioninstallationpart_status field_index (Integer) = 13 field_name (String) = statustype_validto field_xpath (String) = EUReg:ProductionInstallationPart/pf:status/pf:StatusType/pf:validTo field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The ending time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):421 layer_name (String) = eureg_productionsite field_index (Integer) = 1 field_name (String) = id field_xpath (String) = EUReg:ProductionSite/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):423 layer_name (String) = eureg_productionsite field_index (Integer) = 3 field_name (String) = gml_description_href field_xpath (String) = EUReg:ProductionSite/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):424 layer_name (String) = eureg_productionsite field_index (Integer) = 4 field_name (String) = gml_description_title field_xpath (String) = EUReg:ProductionSite/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):425 layer_name (String) = eureg_productionsite field_index (Integer) = 5 field_name (String) = gml_description_nilreason field_xpath (String) = EUReg:ProductionSite/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):426 layer_name (String) = eureg_productionsite field_index (Integer) = 6 field_name (String) = gml_description field_xpath (String) = EUReg:ProductionSite/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):427 layer_name (String) = eureg_productionsite field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = EUReg:ProductionSite/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):428 layer_name (String) = eureg_productionsite field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = EUReg:ProductionSite/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):429 layer_name (String) = eureg_productionsite field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = EUReg:ProductionSite/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):430 layer_name (String) = eureg_productionsite field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = EUReg:ProductionSite/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):431 layer_name (String) = eureg_productionsite field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = EUReg:ProductionSite/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):434 layer_name (String) = eureg_productionsite field_index (Integer) = 14 field_name (String) = inspireid_identifier_localid field_xpath (String) = EUReg:ProductionSite/pf:inspireId/base:Identifier/base:localId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A local identifier, assigned by the data provider. The local identifier is unique within the namespace, that is no other spatial object carries the same unique identifier. -- Description -- NOTE It is the responsibility of the data provider to guarantee uniqueness of the local identifier within the namespace. OGRFeature(_ogr_fields_metadata):435 layer_name (String) = eureg_productionsite field_index (Integer) = 15 field_name (String) = inspireid_identifier_namespace field_xpath (String) = EUReg:ProductionSite/pf:inspireId/base:Identifier/base:namespace field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Namespace uniquely identifying the data source of the spatial object. -- Description -- NOTE The namespace value will be owned by the data provider of the spatial object and will be registered in the INSPIRE External Object Identifier Namespaces Register. OGRFeature(_ogr_fields_metadata):436 layer_name (String) = eureg_productionsite field_index (Integer) = 16 field_name (String) = inspireid_identifier_versionid_nilreason field_xpath (String) = EUReg:ProductionSite/pf:inspireId/base:Identifier/base:versionId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):437 layer_name (String) = eureg_productionsite field_index (Integer) = 17 field_name (String) = inspireid_identifier_versionid_nil field_xpath (String) = EUReg:ProductionSite/pf:inspireId/base:Identifier/base:versionId/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):438 layer_name (String) = eureg_productionsite field_index (Integer) = 18 field_name (String) = inspireid_identifier_versionid field_xpath (String) = EUReg:ProductionSite/pf:inspireId/base:Identifier/base:versionId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The identifier of the particular version of the spatial object, with a maximum length of 25 characters. If the specification of a spatial object type with an external object identifier includes life-cycle information, the version identifier is used to distinguish between the different versions of a spatial object. Within the set of all versions of a spatial object, the version identifier is unique. -- Description -- NOTE The maximum length has been selected to allow for time stamps based on ISO 8601, for example, "2007-02-12T12:12:12+05:30" as the version identifier. NOTE 2 The property is void, if the spatial data set does not distinguish between different versions of the spatial object. It is missing, if the spatial object type does not support any life-cycle information. OGRFeature(_ogr_fields_metadata):439 layer_name (String) = eureg_productionsite field_index (Integer) = 19 field_name (String) = thematicid_thematicidentifier_identifier field_xpath (String) = EUReg:ProductionSite/pf:thematicId/base2:ThematicIdentifier/base2:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- identifier -- Definition -- Unique identifier used to identify the spatial object within the specified identification scheme. OGRFeature(_ogr_fields_metadata):440 layer_name (String) = eureg_productionsite field_index (Integer) = 20 field_name (String) = thematicid_thematicidentifier_identifierscheme field_xpath (String) = EUReg:ProductionSite/pf:thematicId/base2:ThematicIdentifier/base2:identifierScheme field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Name -- identifier scheme -- Definition -- Identifier defining the scheme used to assign the identifier. -- Description -- NOTE 1: Reporting requirements for different environmental legislation mandate that each spatial object is assigned an identifier conforming to specific lexical rules. NOTE 2: These rules are often inconsistent so a spatial object may be assigned multiple identifiers which are used for object referencing to link information to the spatial object. OGRFeature(_ogr_fields_metadata):441 layer_name (String) = eureg_productionsite field_index (Integer) = 21 field_name (String) = geometry field_xpath (String) = EUReg:ProductionSite/pf:geometry field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Spatial property of the spatial object with a value that is a vector geometry type from ISO 19107. -- Description -- This is the geometry property for the Production Site and it is set as an optional property to identify the location area for the Site. It is intended, if available, to furnish a detailed spatial information beside the basic mandatory geometry fixed for the Production Facility. A property that has a collection of surfaces as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):445 layer_name (String) = eureg_productionsite field_index (Integer) = 25 field_name (String) = status field_xpath (String) = EUReg:ProductionSite/pf:status field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = eureg_productionsite_status OGRFeature(_ogr_fields_metadata):446 layer_name (String) = eureg_productionsite field_index (Integer) = 26 field_name (String) = sitename_owns field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):447 layer_name (String) = eureg_productionsite field_index (Integer) = 27 field_name (String) = sitename_featurename_nameoffeature field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/EUReg:FeatureName/EUReg:nameOfFeature field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):448 layer_name (String) = eureg_productionsite field_index (Integer) = 28 field_name (String) = sitename_featurename_confidentialityreason_owns field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/EUReg:FeatureName/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):449 layer_name (String) = eureg_productionsite field_index (Integer) = 29 field_name (String) = sitename_featurename_confidentialityreason_href field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):450 layer_name (String) = eureg_productionsite field_index (Integer) = 30 field_name (String) = sitename_featurename_confidentialityreason_title field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/EUReg:FeatureName/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):451 layer_name (String) = eureg_productionsite field_index (Integer) = 31 field_name (String) = sitename_featurename_confidentialityreason_nilreason field_xpath (String) = EUReg:ProductionSite/EUReg:siteName/EUReg:FeatureName/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):452 layer_name (String) = eureg_productionsite field_index (Integer) = 32 field_name (String) = eureg_location field_xpath (String) = EUReg:ProductionSite/EUReg:location field_type (String) = geometry field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. OGRFeature(_ogr_fields_metadata):453 layer_name (String) = eureg_productionsite field_index (Integer) = 33 field_name (String) = reportdata_href field_xpath (String) = EUReg:ProductionSite/EUReg:reportData/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):454 layer_name (String) = eureg_productionsite field_index (Integer) = 34 field_name (String) = reportdata_title field_xpath (String) = EUReg:ProductionSite/EUReg:reportData/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):455 layer_name (String) = eureg_productionsite field_index (Integer) = 35 field_name (String) = reportdata_nilreason field_xpath (String) = EUReg:ProductionSite/EUReg:reportData/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):456 layer_name (String) = eureg_productionsite field_index (Integer) = 36 field_name (String) = reportdata_owns field_xpath (String) = EUReg:ProductionSite/EUReg:reportData/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):457 layer_name (String) = eureg_productionsite field_index (Integer) = 37 field_name (String) = reportdata_reportdata_pkid field_xpath (String) = EUReg:ProductionSite/EUReg:reportData/EUReg:ReportData field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = reportdata OGRFeature(_ogr_fields_metadata):475 layer_name (String) = eureg_productionsite_status field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = EUReg:ProductionSite/pf:status/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):476 layer_name (String) = eureg_productionsite_status field_index (Integer) = 2 field_name (String) = statustype_statustype_owns field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:statusType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):477 layer_name (String) = eureg_productionsite_status field_index (Integer) = 3 field_name (String) = statustype_statustype_href field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:statusType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):478 layer_name (String) = eureg_productionsite_status field_index (Integer) = 4 field_name (String) = statustype_statustype_title field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:statusType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):479 layer_name (String) = eureg_productionsite_status field_index (Integer) = 5 field_name (String) = statustype_statustype_nilreason field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:statusType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):480 layer_name (String) = eureg_productionsite_status field_index (Integer) = 6 field_name (String) = statustype_description_nilreason field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):481 layer_name (String) = eureg_productionsite_status field_index (Integer) = 7 field_name (String) = statustype_description_nil field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:description/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):482 layer_name (String) = eureg_productionsite_status field_index (Integer) = 8 field_name (String) = statustype_description field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Descriptive statement about the declared status. OGRFeature(_ogr_fields_metadata):483 layer_name (String) = eureg_productionsite_status field_index (Integer) = 9 field_name (String) = statustype_validfrom_nilreason field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:validFrom/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):484 layer_name (String) = eureg_productionsite_status field_index (Integer) = 10 field_name (String) = statustype_validfrom field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:validFrom field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The starting time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):485 layer_name (String) = eureg_productionsite_status field_index (Integer) = 11 field_name (String) = statustype_validto_nilreason field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:validTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):486 layer_name (String) = eureg_productionsite_status field_index (Integer) = 12 field_name (String) = statustype_validto_nil field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:validTo/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):487 layer_name (String) = eureg_productionsite_status field_index (Integer) = 13 field_name (String) = statustype_validto field_xpath (String) = EUReg:ProductionSite/pf:status/pf:StatusType/pf:validTo field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The ending time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):488 layer_name (String) = reportdata field_index (Integer) = 1 field_name (String) = id field_xpath (String) = EUReg:ReportData/@gml:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. OGRFeature(_ogr_fields_metadata):490 layer_name (String) = reportdata field_index (Integer) = 3 field_name (String) = description_href field_xpath (String) = EUReg:ReportData/gml:description/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):491 layer_name (String) = reportdata field_index (Integer) = 4 field_name (String) = description_title field_xpath (String) = EUReg:ReportData/gml:description/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):492 layer_name (String) = reportdata field_index (Integer) = 5 field_name (String) = description_nilreason field_xpath (String) = EUReg:ReportData/gml:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):493 layer_name (String) = reportdata field_index (Integer) = 6 field_name (String) = description field_xpath (String) = EUReg:ReportData/gml:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. OGRFeature(_ogr_fields_metadata):494 layer_name (String) = reportdata field_index (Integer) = 7 field_name (String) = descriptionreference_href field_xpath (String) = EUReg:ReportData/gml:descriptionReference/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):495 layer_name (String) = reportdata field_index (Integer) = 8 field_name (String) = descriptionreference_title field_xpath (String) = EUReg:ReportData/gml:descriptionReference/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):496 layer_name (String) = reportdata field_index (Integer) = 9 field_name (String) = descriptionreference_nilreason field_xpath (String) = EUReg:ReportData/gml:descriptionReference/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):497 layer_name (String) = reportdata field_index (Integer) = 10 field_name (String) = identifier_codespace field_xpath (String) = EUReg:ReportData/gml:identifier/@codeSpace field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):498 layer_name (String) = reportdata field_index (Integer) = 11 field_name (String) = identifier field_xpath (String) = EUReg:ReportData/gml:identifier field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. OGRFeature(_ogr_fields_metadata):501 layer_name (String) = reportdata field_index (Integer) = 14 field_name (String) = reportingyear field_xpath (String) = EUReg:ReportData/EUReg:reportingYear field_type (String) = gYear field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):502 layer_name (String) = reportdata field_index (Integer) = 15 field_name (String) = countryid_owns field_xpath (String) = EUReg:ReportData/EUReg:countryId/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):503 layer_name (String) = reportdata field_index (Integer) = 16 field_name (String) = countryid_href field_xpath (String) = EUReg:ReportData/EUReg:countryId/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):504 layer_name (String) = reportdata field_index (Integer) = 17 field_name (String) = countryid_title field_xpath (String) = EUReg:ReportData/EUReg:countryId/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):505 layer_name (String) = reportdata field_index (Integer) = 18 field_name (String) = countryid_nilreason field_xpath (String) = EUReg:ReportData/EUReg:countryId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1010 layer_name (String) = pf_inspireid field_index (Integer) = 1 field_name (String) = identifier_localid field_xpath (String) = pf:inspireId/base:Identifier/base:localId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- A local identifier, assigned by the data provider. The local identifier is unique within the namespace, that is no other spatial object carries the same unique identifier. -- Description -- NOTE It is the responsibility of the data provider to guarantee uniqueness of the local identifier within the namespace. OGRFeature(_ogr_fields_metadata):1011 layer_name (String) = pf_inspireid field_index (Integer) = 2 field_name (String) = identifier_namespace field_xpath (String) = pf:inspireId/base:Identifier/base:namespace field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Namespace uniquely identifying the data source of the spatial object. -- Description -- NOTE The namespace value will be owned by the data provider of the spatial object and will be registered in the INSPIRE External Object Identifier Namespaces Register. OGRFeature(_ogr_fields_metadata):1012 layer_name (String) = pf_inspireid field_index (Integer) = 3 field_name (String) = identifier_versionid_nilreason field_xpath (String) = pf:inspireId/base:Identifier/base:versionId/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1013 layer_name (String) = pf_inspireid field_index (Integer) = 4 field_name (String) = identifier_versionid_nil field_xpath (String) = pf:inspireId/base:Identifier/base:versionId/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1014 layer_name (String) = pf_inspireid field_index (Integer) = 5 field_name (String) = identifier_versionid field_xpath (String) = pf:inspireId/base:Identifier/base:versionId field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The identifier of the particular version of the spatial object, with a maximum length of 25 characters. If the specification of a spatial object type with an external object identifier includes life-cycle information, the version identifier is used to distinguish between the different versions of a spatial object. Within the set of all versions of a spatial object, the version identifier is unique. -- Description -- NOTE The maximum length has been selected to allow for time stamps based on ISO 8601, for example, "2007-02-12T12:12:12+05:30" as the version identifier. NOTE 2 The property is void, if the spatial data set does not distinguish between different versions of the spatial object. It is missing, if the spatial object type does not support any life-cycle information. OGRFeature(_ogr_fields_metadata):1017 layer_name (String) = status field_index (Integer) = 1 field_name (String) = nilreason field_xpath (String) = pf:status/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1018 layer_name (String) = status field_index (Integer) = 2 field_name (String) = statustype_statustype_owns field_xpath (String) = pf:status/pf:StatusType/pf:statusType/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1019 layer_name (String) = status field_index (Integer) = 3 field_name (String) = statustype_statustype_href field_xpath (String) = pf:status/pf:StatusType/pf:statusType/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1020 layer_name (String) = status field_index (Integer) = 4 field_name (String) = statustype_statustype_title field_xpath (String) = pf:status/pf:StatusType/pf:statusType/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1021 layer_name (String) = status field_index (Integer) = 5 field_name (String) = statustype_statustype_nilreason field_xpath (String) = pf:status/pf:StatusType/pf:statusType/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1022 layer_name (String) = status field_index (Integer) = 6 field_name (String) = statustype_description_nilreason field_xpath (String) = pf:status/pf:StatusType/pf:description/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1023 layer_name (String) = status field_index (Integer) = 7 field_name (String) = statustype_description_nil field_xpath (String) = pf:status/pf:StatusType/pf:description/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1024 layer_name (String) = status field_index (Integer) = 8 field_name (String) = statustype_description field_xpath (String) = pf:status/pf:StatusType/pf:description field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- Descriptive statement about the declared status. OGRFeature(_ogr_fields_metadata):1025 layer_name (String) = status field_index (Integer) = 9 field_name (String) = statustype_validfrom_nilreason field_xpath (String) = pf:status/pf:StatusType/pf:validFrom/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1026 layer_name (String) = status field_index (Integer) = 10 field_name (String) = statustype_validfrom field_xpath (String) = pf:status/pf:StatusType/pf:validFrom field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The starting time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):1027 layer_name (String) = status field_index (Integer) = 11 field_name (String) = statustype_validto_nilreason field_xpath (String) = pf:status/pf:StatusType/pf:validTo/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1028 layer_name (String) = status field_index (Integer) = 12 field_name (String) = statustype_validto_nil field_xpath (String) = pf:status/pf:StatusType/pf:validTo/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1029 layer_name (String) = status field_index (Integer) = 13 field_name (String) = statustype_validto field_xpath (String) = pf:status/pf:StatusType/pf:validTo field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = -- Definition -- The ending time of validity for a status type. -- Description -- A date gives values for year, month and day. OGRFeature(_ogr_fields_metadata):1030 layer_name (String) = type field_index (Integer) = 1 field_name (String) = value field_xpath (String) = pf:type/* field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1031 layer_name (String) = competentauthority field_index (Integer) = 1 field_name (String) = organisationname field_xpath (String) = EUReg:CompetentAuthority/EUReg:organisationName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1032 layer_name (String) = competentauthority field_index (Integer) = 2 field_name (String) = individualname field_xpath (String) = EUReg:CompetentAuthority/EUReg:individualName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1033 layer_name (String) = competentauthority field_index (Integer) = 3 field_name (String) = electronicmailaddress field_xpath (String) = EUReg:CompetentAuthority/EUReg:electronicMailAddress field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1034 layer_name (String) = competentauthority field_index (Integer) = 4 field_name (String) = address_owns field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1035 layer_name (String) = competentauthority field_index (Integer) = 5 field_name (String) = address_addressdetails_streetname field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:streetName field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1036 layer_name (String) = competentauthority field_index (Integer) = 6 field_name (String) = address_addressdetails_buildingnumber field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:buildingNumber field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1037 layer_name (String) = competentauthority field_index (Integer) = 7 field_name (String) = address_addressdetails_city field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:city field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1038 layer_name (String) = competentauthority field_index (Integer) = 8 field_name (String) = address_addressdetails_postalcode field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:postalCode field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1039 layer_name (String) = competentauthority field_index (Integer) = 9 field_name (String) = address_addressdetails_confidentialityreason_owns field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@owns field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = false field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1040 layer_name (String) = competentauthority field_index (Integer) = 10 field_name (String) = address_addressdetails_confidentialityreason_href field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@xlink:href field_type (String) = anyURI field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1041 layer_name (String) = competentauthority field_index (Integer) = 11 field_name (String) = address_addressdetails_confidentialityreason_title field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@xlink:title field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1042 layer_name (String) = competentauthority field_index (Integer) = 12 field_name (String) = address_addressdetails_confidentialityreason_nilreason field_xpath (String) = EUReg:CompetentAuthority/EUReg:address/EUReg:AddressDetails/EUReg:confidentialityReason/@nilReason field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1043 layer_name (String) = competentauthority field_index (Integer) = 13 field_name (String) = telephoneno field_xpath (String) = EUReg:CompetentAuthority/EUReg:telephoneNo field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1044 layer_name (String) = competentauthority field_index (Integer) = 14 field_name (String) = faxno field_xpath (String) = EUReg:CompetentAuthority/EUReg:faxNo field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1045 layer_name (String) = eureg_productioninstallation_status_status field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):1046 layer_name (String) = eureg_productioninstallation_status_status field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):1047 layer_name (String) = eureg_productioninstallation_status_status field_name (String) = child_pkid Layer name: _ogr_layers_metadata Geometry: None Feature Count: 22 Layer SRS WKT: (unknown) layer_name: String (0.0) layer_xpath: String (0.0) layer_category: String (0.0) layer_pkid_name: String (0.0) layer_parent_pkid_name: String (0.0) layer_documentation: String (0.0) OGRFeature(_ogr_layers_metadata):0 layer_name (String) = productionfacility layer_xpath (String) = EUReg:ProductionFacility layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):4 layer_name (String) = productionfacility_function layer_xpath (String) = EUReg:ProductionFacility/act-core:function layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Name -- function -- Definition -- Activities performed by the activity complex. Function is described by the activity and potentially complemented with information about inputs and outputs as result of it. -- Description -- NOTE The Activity described as part of the Function “Activity Complex” should be recorded using a controlled vocabulary where a particular controlled vocabulary is in use within a given context, such as SIC codes in the UK, it is acceptable to use these, however, the preferred choice for European interoperability is whenever possible NACE [NACE]. OGRFeature(_ogr_layers_metadata):5 layer_name (String) = productionfacility_function_function_activity layer_xpath (String) = EUReg:ProductionFacility/act-core:function/act-core:Function/act-core:activity layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_ogr_pkid layer_documentation (String) = -- Name -- activity -- Definition -- Categorized description of individual or organized set of technically related processes that are carried out by a economical unit, private or public, profit or non profit character. -- Description -- NOTE The Activity described as part of the Function for “Activity Complex” should be recorded using a controlled vocabulary where a particular controlled vocabulary is in use within a given context, such as SIC codes in the UK, it is acceptable to use these, however, the preferred choice for European interoperability is whenever possible NACE [NACE]. gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):9 layer_name (String) = productionfacility_status layer_xpath (String) = EUReg:ProductionFacility/pf:status layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- The state or condition of the facility, with regard to the functional and operational order, in which it is arranged for a limited or extended time period. OGRFeature(_ogr_layers_metadata):14 layer_name (String) = productionfacility_groupedinstallation layer_xpath (String) = EUReg:ProductionFacility/pf:groupedInstallation layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = An Installation is grouped by one Facility To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType. This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects. By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object. OGRFeature(_ogr_layers_metadata):23 layer_name (String) = productionfacility_competentauthorityeprtr layer_xpath (String) = EUReg:ProductionFacility/EUReg:competentAuthorityEPRTR layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id OGRFeature(_ogr_layers_metadata):24 layer_name (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity layer_xpath (String) = EUReg:ProductionFacility/EUReg:EPRTRAnnexIActivity/EUReg:EPRTRAnnexIActivityType/EUReg:otherActivity layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/EPRTRAnnexIActivityValue/ gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):25 layer_name (String) = eureg_productioninstallation layer_xpath (String) = EUReg:ProductionInstallation layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):30 layer_name (String) = eureg_productioninstallation_groupedinstallationpart layer_xpath (String) = EUReg:ProductionInstallation/pf:groupedInstallationPart layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = An InstallationPart is grouped by one Installation To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType. This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects. By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object. OGRFeature(_ogr_layers_metadata):31 layer_name (String) = eureg_productioninstallation_competentauthoritypermits layer_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityPermits layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id OGRFeature(_ogr_layers_metadata):32 layer_name (String) = eureg_productioninstallation_competentauthorityinspections layer_xpath (String) = EUReg:ProductionInstallation/EUReg:competentAuthorityInspections layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id OGRFeature(_ogr_layers_metadata):34 layer_name (String) = eureg_productioninstallation_otherrelevantchapters layer_xpath (String) = EUReg:ProductionInstallation/EUReg:otherRelevantChapters layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = http://dd.eionet.europa.eu/vocabulary/euregistryonindustrialsites/RelevantChapterValue/ gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. OGRFeature(_ogr_layers_metadata):35 layer_name (String) = eureg_productioninstallationpart layer_xpath (String) = EUReg:ProductionInstallationPart layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):40 layer_name (String) = eureg_productioninstallationpart_status layer_xpath (String) = EUReg:ProductionInstallationPart/pf:status layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- The state or condition of the installation part, with regard to the functional and operational order, in which it is arranged for a limited or extended time period. OGRFeature(_ogr_layers_metadata):43 layer_name (String) = eureg_productionsite layer_xpath (String) = EUReg:ProductionSite layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):49 layer_name (String) = eureg_productionsite_status layer_xpath (String) = EUReg:ProductionSite/pf:status layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_id layer_documentation (String) = -- Definition -- The state or condition of the site, with regard to the functional and operational order, in which it is arranged for a limited or extended time period. OGRFeature(_ogr_layers_metadata):50 layer_name (String) = reportdata layer_xpath (String) = EUReg:ReportData layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = id layer_documentation (String) = The basic feature model is given by the gml:AbstractFeatureType. The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. The value of the gml:location property describes the extent, position or relative location of the feature. OGRFeature(_ogr_layers_metadata):106 layer_name (String) = pf_inspireid layer_xpath (String) = pf:inspireId layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- External object identifier of the spatial object. -- Description -- NOTE An external object identifier is a unique object identifier published by the responsible body, which may be used by external applications to reference the spatial object. The identifier is an identifier of the spatial object, not an identifier of the real-world phenomenon. OGRFeature(_ogr_layers_metadata):108 layer_name (String) = status layer_xpath (String) = pf:status layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- The state or condition of the installation, with regard to its functional and operational order, in which it is arranged for a limited or extended time period. OGRFeature(_ogr_layers_metadata):109 layer_name (String) = type layer_xpath (String) = pf:type layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_documentation (String) = -- Definition -- Special kind of an installation, denoting the operative function which has to be performed. -- Description -- EXAMPLE Radiological installation, containing radiological equipment. OGRFeature(_ogr_layers_metadata):110 layer_name (String) = competentauthority layer_xpath (String) = EUReg:CompetentAuthority layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):111 layer_name (String) = eureg_productioninstallation_status_status layer_category (String) = JUNCTION_TABLE Layer name: _ogr_layer_relationships Geometry: None Feature Count: 22 Layer SRS WKT: (unknown) parent_layer: String (0.0) parent_pkid: String (0.0) parent_element_name: String (0.0) child_layer: String (0.0) child_pkid: String (0.0) OGRFeature(_ogr_layer_relationships):4 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = function child_layer (String) = productionfacility_function child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):5 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = status child_layer (String) = productionfacility_status child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):8 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = hostingsite_productionsite_eureg_productionsite_pkid child_layer (String) = eureg_productionsite child_pkid (String) = id OGRFeature(_ogr_layer_relationships):9 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = groupedinstallation child_layer (String) = productionfacility_groupedinstallation child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):11 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = competentauthorityeprtr child_layer (String) = productionfacility_competentauthorityeprtr child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):12 parent_layer (String) = productionfacility parent_pkid (String) = id parent_element_name (String) = eprtrannexiactivity_eprtrannexiactivitytype_otheractivity child_layer (String) = productionfacility_eprtrannexiac_eprtrannexiac_otheractivity child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):13 parent_layer (String) = productionfacility_function parent_pkid (String) = ogr_pkid parent_element_name (String) = function_activity child_layer (String) = productionfacility_function_function_activity child_pkid (String) = parent_ogr_pkid OGRFeature(_ogr_layer_relationships):22 parent_layer (String) = productionfacility_groupedinstallation parent_pkid (String) = ogr_pkid parent_element_name (String) = productioninstallation_eureg_productioninstallation_pkid child_layer (String) = eureg_productioninstallation child_pkid (String) = id OGRFeature(_ogr_layer_relationships):33 parent_layer (String) = productionfacility_competentauthorityeprtr parent_pkid (String) = ogr_pkid parent_element_name (String) = competentauthority_pkid child_layer (String) = competentauthority child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):37 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = inspireid_pkid child_layer (String) = pf_inspireid child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):41 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = status_status child_layer (String) = status child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):42 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = type_pkid child_layer (String) = type child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):43 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = groupedinstallationpart child_layer (String) = eureg_productioninstallation_groupedinstallationpart child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):44 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = competentauthoritypermits child_layer (String) = eureg_productioninstallation_competentauthoritypermits child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):45 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = competentauthorityinspections child_layer (String) = eureg_productioninstallation_competentauthorityinspections child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):47 parent_layer (String) = eureg_productioninstallation parent_pkid (String) = id parent_element_name (String) = otherrelevantchapters child_layer (String) = eureg_productioninstallation_otherrelevantchapters child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):49 parent_layer (String) = eureg_productioninstallation_groupedinstallationpart parent_pkid (String) = ogr_pkid parent_element_name (String) = productioninstallatipart_eureg_productioninstallatipart_pkid child_layer (String) = eureg_productioninstallationpart child_pkid (String) = id OGRFeature(_ogr_layer_relationships):50 parent_layer (String) = eureg_productioninstallation_competentauthoritypermits parent_pkid (String) = ogr_pkid parent_element_name (String) = competentauthority_pkid child_layer (String) = competentauthority child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):51 parent_layer (String) = eureg_productioninstallation_competentauthorityinspections parent_pkid (String) = ogr_pkid parent_element_name (String) = competentauthority_pkid child_layer (String) = competentauthority child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):57 parent_layer (String) = eureg_productioninstallationpart parent_pkid (String) = id parent_element_name (String) = status child_layer (String) = eureg_productioninstallationpart_status child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):66 parent_layer (String) = eureg_productionsite parent_pkid (String) = id parent_element_name (String) = status child_layer (String) = eureg_productionsite_status child_pkid (String) = parent_id OGRFeature(_ogr_layer_relationships):67 parent_layer (String) = eureg_productionsite parent_pkid (String) = id parent_element_name (String) = reportdata_reportdata_pkid child_layer (String) = reportdata child_pkid (String) = id Layer name: _ogr_other_metadata Geometry: None Feature Count: 46 Layer SRS WKT: (unknown) key: String (0.0) value: String (0.0) OGRFeature(_ogr_other_metadata):0 key (String) = REMOVE_UNUSED_LAYERS value (String) = YES OGRFeature(_ogr_other_metadata):1 key (String) = document_filename value (String) = data/gmlas/real_world/EUReg.example.gml OGRFeature(_ogr_other_metadata):2 key (String) = namespace_uri_1 value (String) = http://dd.eionet.europa.eu/euregistryonindustrialsites OGRFeature(_ogr_other_metadata):3 key (String) = namespace_location_1 value (String) = http://dd.eionet.europa.eu/schemas/euregistryonindustrialsites/EUReg.xsd OGRFeature(_ogr_other_metadata):4 key (String) = namespace_prefix_1 value (String) = EUReg OGRFeature(_ogr_other_metadata):5 key (String) = namespace_uri_2 value (String) = http://inspire.ec.europa.eu/schemas/act-core/4.0 OGRFeature(_ogr_other_metadata):6 key (String) = namespace_prefix_2 value (String) = act-core OGRFeature(_ogr_other_metadata):7 key (String) = namespace_uri_3 value (String) = http://inspire.ec.europa.eu/schemas/ad/4.0 OGRFeature(_ogr_other_metadata):8 key (String) = namespace_prefix_3 value (String) = ad OGRFeature(_ogr_other_metadata):9 key (String) = namespace_uri_4 value (String) = http://inspire.ec.europa.eu/schemas/au/4.0 OGRFeature(_ogr_other_metadata):10 key (String) = namespace_prefix_4 value (String) = au OGRFeature(_ogr_other_metadata):11 key (String) = namespace_uri_5 value (String) = http://inspire.ec.europa.eu/schemas/base/3.3 OGRFeature(_ogr_other_metadata):12 key (String) = namespace_prefix_5 value (String) = base OGRFeature(_ogr_other_metadata):13 key (String) = namespace_uri_6 value (String) = http://inspire.ec.europa.eu/schemas/base2/2.0 OGRFeature(_ogr_other_metadata):14 key (String) = namespace_prefix_6 value (String) = base2 OGRFeature(_ogr_other_metadata):15 key (String) = namespace_uri_7 value (String) = http://inspire.ec.europa.eu/schemas/bu-base/4.0 OGRFeature(_ogr_other_metadata):16 key (String) = namespace_prefix_7 value (String) = bu-base OGRFeature(_ogr_other_metadata):17 key (String) = namespace_uri_8 value (String) = http://inspire.ec.europa.eu/schemas/bu-core2d/4.0 OGRFeature(_ogr_other_metadata):18 key (String) = namespace_prefix_8 value (String) = bu-core2d OGRFeature(_ogr_other_metadata):19 key (String) = namespace_uri_9 value (String) = http://inspire.ec.europa.eu/schemas/cp/4.0 OGRFeature(_ogr_other_metadata):20 key (String) = namespace_prefix_9 value (String) = cp OGRFeature(_ogr_other_metadata):21 key (String) = namespace_uri_10 value (String) = http://inspire.ec.europa.eu/schemas/gn/4.0 OGRFeature(_ogr_other_metadata):22 key (String) = namespace_prefix_10 value (String) = gn OGRFeature(_ogr_other_metadata):23 key (String) = namespace_uri_11 value (String) = http://inspire.ec.europa.eu/schemas/net/4.0 OGRFeature(_ogr_other_metadata):24 key (String) = namespace_prefix_11 value (String) = net OGRFeature(_ogr_other_metadata):25 key (String) = namespace_uri_12 value (String) = http://inspire.ec.europa.eu/schemas/pf/4.0 OGRFeature(_ogr_other_metadata):26 key (String) = namespace_prefix_12 value (String) = pf OGRFeature(_ogr_other_metadata):27 key (String) = namespace_uri_13 value (String) = http://inspire.ec.europa.eu/schemas/tn/4.0 OGRFeature(_ogr_other_metadata):28 key (String) = namespace_prefix_13 value (String) = tn OGRFeature(_ogr_other_metadata):29 key (String) = namespace_uri_14 value (String) = http://www.interactive-instruments.de/ShapeChange/AppInfo OGRFeature(_ogr_other_metadata):30 key (String) = namespace_prefix_14 value (String) = sc OGRFeature(_ogr_other_metadata):31 key (String) = namespace_uri_15 value (String) = http://www.isotc211.org/2005/gco OGRFeature(_ogr_other_metadata):32 key (String) = namespace_prefix_15 value (String) = gco OGRFeature(_ogr_other_metadata):33 key (String) = namespace_uri_16 value (String) = http://www.isotc211.org/2005/gmd OGRFeature(_ogr_other_metadata):34 key (String) = namespace_prefix_16 value (String) = gmd OGRFeature(_ogr_other_metadata):35 key (String) = namespace_uri_17 value (String) = http://www.isotc211.org/2005/gsr OGRFeature(_ogr_other_metadata):36 key (String) = namespace_prefix_17 value (String) = gsr OGRFeature(_ogr_other_metadata):37 key (String) = namespace_uri_18 value (String) = http://www.isotc211.org/2005/gss OGRFeature(_ogr_other_metadata):38 key (String) = namespace_prefix_18 value (String) = gss OGRFeature(_ogr_other_metadata):39 key (String) = namespace_uri_19 value (String) = http://www.isotc211.org/2005/gts OGRFeature(_ogr_other_metadata):40 key (String) = namespace_prefix_19 value (String) = gts OGRFeature(_ogr_other_metadata):41 key (String) = namespace_uri_20 value (String) = http://www.opengis.net/gml/3.2 OGRFeature(_ogr_other_metadata):42 key (String) = namespace_prefix_20 value (String) = gml OGRFeature(_ogr_other_metadata):43 key (String) = namespace_uri_21 value (String) = http://www.w3.org/1999/xlink OGRFeature(_ogr_other_metadata):44 key (String) = namespace_prefix_21 value (String) = xlink OGRFeature(_ogr_other_metadata):45 key (String) = gml_version value (String) = 3.2.1 gdalautotest-3.0.4/ogr/data/gmlas/real_world/Piezometre.06512X0037.STREMY.2.gml0000644003401500001440000002140213614004466025714 0ustar rouaultusersWater well from national BSS (Banque du Sous-Sol) Data database. Piezometer monitoring ground water levelhttp://ressource.brgm-rec.fr/data/Piezometre/06512X0037/STREMY.2Piezometre/06512X0037/STREMY.2http://ressource.brgm-rec.fr/dataPiézomètre de St-Rémy - 0146.1909541655103 5.18713262971692http://fichebsseau.brgm.fr/bss_eau/fiche.jsf?code=06512X0037/STREMY46.1909541655103 5.18713262971692false1977-10-08T23:00:00Z2014-10-14T06:00:00Z1977-09-30T23:00:00Z1977-09-30T23:00:00Z1977-10-08T23:00:00Z1977-10-08T23:00:00Z1977-10-08T23:00:00Z1977-10-08T23:00:00Z1991-10-12T23:00:00Z1977-10-08T23:00:00Zgdalautotest-3.0.4/ogr/data/gmlas/real_world/EUReg.example.gml0000644003401500001440000005152313614004466023701 0ustar rouaultusers 123456789.SITE ES.CAED EXAMPLE SITE 1 41.991925 2.104334 000000002.FACILITY ES.CAED 41.991932 2.104331 EXAMPLE FACILITY 1 MINISTRY FOR PRTR Mr John Wayne john.wayne@fake.com Ministry Street 20 MADRID EX1 000 +34 91 000 000 34 91 000 001 OWNER LIMITED http://www.fakeurl.fake This is a simple example of how a facility would be reported to the EU Registry on Industrial Sites 1982-01-01+01:00 Administrative Street 20 BARCELONA EX2 000 010101011.INSTALLATION ES.CAED 41.991931 2.10433 EXAMPLE INSTALLATION 1 true false MINISTRY FOR IPPC MR TOM RICHARDSON tom.richardson@fake.com Ministry Street 10 MADRID EX3 000 +34 91 001 000 + 34 91 001 001 MINISTRY FOR IPPC – Compliance Department MRS KEANE WALTER keane.walter@fake.com Ministry Street 10 MADRID EX4 000 +34 91 002 000 + 34 91 002 001 2 ETS.5463.fake Seveso1235.ES.fake true false false 1956-01-01+01:00 1956-01-01+01:00 010101012.INSTALLATION ES.CAED 41.991929 2.104327 EXAMPLE INSTALLATION 2 true true MINISTRY FOR IPPC MR TOM RICHARDSON tom.richardson@fake.com Ministry Street 10 MADRID EX5 000 +34 91 001 000 + 34 91 001 001 MINISTRY FOR IPPC – Compliance Department MRS KEANE WALTER keane.walter@fake.com Ministry Street 10 MADRID EX6 000 +34 91 002 000 + 34 91 002 001 0 ETS.54622.fake Seveso1235.ES.fake true false false 1982-01-01+01:00 1982-01-01+01:00 987654321.PART ES.CAED 41.991929 2.104327 Example large combustion plant 125.0 1956-01-01+01:00 987654322.PART ES.CAED 41.991931 2.10433 Example waste incinerator 80.0 0.0 1982-01-01+01:00 2017 gdalautotest-3.0.4/ogr/data/gmlas/real_world/README.TXT0000644003401500001440000000141713614004466022132 0ustar rouaultusersPiezometre.06512X0037.STREMY.2.gml: URL: http://ressource.brgm-rec.fr/data/Piezometre/06512X0037/STREMY.2 or https://wfspoc.brgm-rec.fr/geoserver/ows?service=wfs&version=2.0.0&request=GetFeature&StoredQuery_ID=GetEnvironmentalMonitoringFacilityById&ID=Piezometre.06512X0037.STREMY.2 BRGM. content from our Groundwater Information Network (GIN): piezometers (INSPIRE EF) and associated WaterML2 TimeSeries EUReg.example.gml: URL: http://cdrtest.eionet.europa.eu/help/ied_registry/documents/Example%20XML/EUReg.example.gml Fake data. EU Registry on Industrial Sites, http://cdrtest.eionet.europa.eu/help/ied_registry new data flow combining ePRTR and IED industrial sites data; first reporting, March 2018 Extension of INSPIRE PFgdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_datarecord_swe.xsd0000644003401500001440000001126513614005337024211 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_unexpected_repeated_element.xsd0000644003401500001440000000062613614005337026072 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_geometryproperty_gml32.xsd0000644003401500001440000000702113614005337025004 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_interesting_schema.xsd0000644003401500001440000000063513614005337024217 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_validate_ignored_fixed_attribute.xml0000644003401500001440000000034013614005337027101 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_remove_unused_layers_and_fields.xml0000644003401500001440000000040213614005337026745 0ustar rouaultusers foo bar gdalautotest-3.0.4/ogr/data/gmlas/gmlas_identifier_case_ambiguity.xsd0000644003401500001440000000124313614005337025527 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_avoid_same_name_inlined_classes_ns1.xsd0000644003401500001440000000063213614005337027450 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_truncated_xml.xml0000644003401500001440000000031213614005337023207 0ustar rouaultusers foogdalautotest-3.0.4/ogr/data/gmlas/gmlas_composition_compositionPart.xml0000644003401500001440000000062713614005337026164 0ustar rouaultusers a1 a2 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1.xml0000644003401500001440000002315713614005337021412 0ustar rouaultusers 12 element_id element_string element_string_array 2nd element_string_array 3 3 4 123456789012 123456789012 123456789013 1.23 2.34 3.45 1.23456789012 2.3456 3.4578 1.23456789012 -128 -32768 1 2012-01-01T12:34:56Z 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-01 12:34:56 true true false YmFzZTY0QmluYXJ5 68657842696E617279 10 1 2 3 42 a b c true false 1 2 3 123456789012 2 3 1.25 2.5 5.0 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z element_compound_simplifiable_subelement2 sequence_1_string_unbounded_1 sequence_1_string_unbounded_2 sequence_unbounded_string_1 sequence_unbounded_string_2 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z 2012-01-03T12:34:56Z 2012-01-04T12:34:56Z 2016-01-01T12:34:56Z 2016-01-02T12:34:56Z 2016-01-03T12:34:56Z 2016-01-04T12:34:56Z sequence_1_unbounded_with_2_subelts_1 sequence_1_unbounded_with_2_subelts_2 sequence_1_unbounded_non_simplifiable_1_1 sequence_1_unbounded_non_simplifiable_1_2 sequence_1_unbounded_non_simplifiable_2_1 sequence_1_unbounded_non_simplifiable_2_2 sequence_unbounded_1_with_2_subelts_1 sequence_unbounded_1_with_2_subelts_2 sequence_with_attr_unbounded_1 sequence_with_attr_unbounded_2 10 20 3 4 5 3 A<blowC 1 2 group1_elt_1_1_1 group1_elt_1_1_2 group1_elt_2_1_1 group1_elt_1_2_1 group1_elt_2_2_1 group2_elt_1 sixthelement sixthelementbis sixthelement_a_b sixthelement_a_b2 2016-01-01T12:34:56Z 2016-01-02T12:34:56Z sixthelement2 sixthelement3 sixthelement3_a_b sixthelement_a_b2 sixthelement4 2016-01-03T12:34:56Z 2016-01-04T12:34:56Z group4_elt_1 group4_elt_2 elt_A4 elt_B3 elt_A3 elt_B2 elt_A2 elt_B elt_A gdalautotest-3.0.4/ogr/data/gmlas/gmlas_avoid_same_name_inlined_classes.xsd0000644003401500001440000000143413614005340026662 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_same_element_in_different_ns.xml0000644003401500001440000000057213614005340026212 0ustar rouaultusers bar gdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_datarecord_xlink.xsd0000644003401500001440000000064713614005340024534 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test_targetelement.xsd0000644003401500001440000000506413614005340024236 0ustar rouaultusers other_ns:inexisting_target_elt other_ns:target_elt_with_required_id other_ns:target_elt_with_optional_id myns:existing_abstract_target_elt myns:existing_abstract_target_elt gdalautotest-3.0.4/ogr/data/gmlas/gmlas_any_field_at_end_of_declaration.xml0000644003401500001440000000034213614005340026630 0ustar rouaultusers bar baz gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_one_subst_with_repetition.xml0000644003401500001440000000060013614005340031647 0ustar rouaultusers baz baz2 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_timestamp_ignored_for_hash_bar.xml0000644003401500001440000000025613614005340026546 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_internal_xlink_href.xsd0000644003401500001440000000350013614005340024355 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_recoding.xsd0000644003401500001440000000063113614005340022124 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_schema_without_namespace_prefix_generic_http_uri.xsd0000644003401500001440000000056613614005340032367 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_datarecord.xml0000644003401500001440000000545513614005340023333 0ustar rouaultusers 2017-09-01T00:00:00 myidentifier myvalue 1.23 2 foo true 2017-09-01T00:00:00 myidentifier myvalue 1.23 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_link_nested_independant_child.xsd0000644003401500001440000000071313614005341026347 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_timestamp_ignored_for_hash_foo.xml0000644003401500001440000000025613614005341026566 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_inline_identifier.xsd0000644003401500001440000000217613614005341024021 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_abstractgeometry_gml32.xsd0000644003401500001440000000355513614005341024726 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test_targetelement_fake_xlink.xsd0000644003401500001440000000044613614005341026431 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_geometryproperty_gml32.gml0000644003401500001440000001100613614004466024765 0ustar rouaultusers 49 2 50 3 2 49 0 0 0 1 1 1 1 0 0 0 1.0 1.02.0 2.0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 0 1 1 2 3 4 5 6 500000 0 500000 0 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_unexpected_repeated_element.xml0000644003401500001440000000044113614005341026062 0ustar rouaultusers foo_first foo_again gdalautotest-3.0.4/ogr/data/gmlas/gmlas_timestamp_ignored_for_hash.xsd0000644003401500001440000000057413614005341025724 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_remove_unused_layers_and_fields.xsd0000644003401500001440000000266413614005341026752 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_aux_schema_without_namespace_prefix_main.xsd0000644003401500001440000000102613614005341030627 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_validate_ignored_fixed_attribute.xsd0000644003401500001440000000075013614005341027077 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_no_namespace.xml0000644003401500001440000000025113614005341022763 0ustar rouaultusers bar gdalautotest-3.0.4/ogr/data/gmlas/gmlas_instantiate_only_gml_feature.xsd0000644003401500001440000000245313614005342026276 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_validate.xsd0000644003401500001440000000061013614005342022122 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_avoid_same_name_inlined_classes_ns2.xsd0000644003401500001440000000063213614005342027445 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_two_subst.xsd0000644003401500001440000000137013614005342026407 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_invalid_schema.xml0000644003401500001440000000027613614005342023311 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_aux_schema_without_namespace_prefix_aux.xsd0000644003401500001440000000110213614005342030474 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_geometry_as_substitutiongroup.xsd0000644003401500001440000000135113614005342026563 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_fake_xlink.xsd0000644003401500001440000000040213614005342022443 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_unexpected_repeated_element_variant.xsd0000644003401500001440000000072613614005342027613 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_one_subst_no_repetition.xml0000644003401500001440000000050313614005342031314 0ustar rouaultusers baz gdalautotest-3.0.4/ogr/data/gmlas/gmlas_same_element_in_different_ns_other_ns.xsd0000644003401500001440000000077613614005342030121 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_dataarray.xml0000644003401500001440000001111613614005343023165 0ustar rouaultusers 2 2016-09-01T00:00:00+01:00,1,2.34,3,foo,true@@2017-09-01T00:00:00,2,3.45 2 2016-09-01T00:00:00+01:00,1,2.34,extra_field,extra_field2@@2017-09-01T00:00:00,,3.45@@ 2 2016-09-01T00:00:00+01:00,1,2.34,2017-09-01T00:00:00,,3.45 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_invalid_xml.xsd0000644003401500001440000000062613614005343022647 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1_generated.xsd0000644003401500001440000000130613614005343023413 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_geometryproperty_gml32_no_error.gml0000644003401500001440000000753713614004466026710 0ustar rouaultusers 49 2 50 3 2 49 0 0 0 1 1 1 1 0 0 0 1.0 1.02.0 2.0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 1.0 1.0 0 0 0 1 1 1 1 0 0 0 0 1 1 2 3 4 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_link_nested_independant_child.xml0000644003401500001440000000030113614005343026344 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_swe_datarecord.xsd0000644003401500001440000000172413614005343023327 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test_targetelement_fake_gml.xsd0000644003401500001440000000140013614005343026054 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_abstractgeometry_gml32.gml0000644003401500001440000000131613614004466024707 0ustar rouaultusers 0 1 0 1 1 2 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_schema_without_namespace_prefix_opengis_uri.xsd0000644003401500001440000000061013614005343031351 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_no_element_in_first_choice_schema.xsd0000644003401500001440000000047313614005343027215 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_same_element_in_different_ns.xsd0000644003401500001440000000177413614005343026220 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1.xsd0000644003401500001440000004523213614005343021403 0ustar rouaultusers Doc of myBaseType Doc of main_elt Doc of main_elt complex type Doc of boolean_array Doc of boolean_array simple type Doc of attr Doc myint Doc myAttr Doc of group1 Doc of group2 Doc of group3 Doc of group4 gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test_targetelement_other_ns.xsd0000644003401500001440000000167613614005344026150 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test1.txt0000644003401500001440000026643513614004466021443 0ustar rouaultusersINFO: Open of `GMLAS:data/gmlas/gmlas_test1.xml' using driver `GMLAS' successful. Layer name: abstract_element_realization1 Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL a_int: Integer (0.0) NOT NULL OGRFeature(abstract_element_realization1):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization1_1 a_int (Integer) = 3 OGRFeature(abstract_element_realization1):2 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization1_2 a_int (Integer) = 5 Layer name: abstract_element_realization2 Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL b_int: Integer (0.0) NOT NULL OGRFeature(abstract_element_realization2):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization2_1 b_int (Integer) = 4 Layer name: main_elt Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) otherns_id: String (0.0) NOT NULL optionalstrattr: String (0.0) fixedvalunset: String (0.0) DEFAULT 'fixed_value' fixedvalset: String (0.0) DEFAULT 'fixed_value' defaultvalunset: String (0.0) DEFAULT 'default_value' defaultvalset: String (0.0) DEFAULT 'default_value' myattributegroupattr1: String (0.0) myattributegroupattr2: Integer (0.0) NOT NULL id_attr: String (0.0) base_int: Integer (0.0) NOT NULL id: String (0.0) NOT NULL string: String (0.0) NOT NULL string_array: StringList (0.0) NOT NULL int: Integer (0.0) NOT NULL int_array: IntegerList (0.0) NOT NULL long: Integer64 (0.0) NOT NULL long_array: Integer64List (0.0) NOT NULL float: Real(Float32) (0.0) NOT NULL float_array: RealList(Float32) (0.0) NOT NULL double: Real (0.0) NOT NULL double_array: RealList (0.0) NOT NULL decimal: Real (0.0) NOT NULL byte: Integer (0.0) NOT NULL short: Integer(Int16) (0.0) NOT NULL positiveinteger: Integer (0.0) NOT NULL dt: DateTime (0.0) NOT NULL date: Date (0.0) NOT NULL time: Time (0.0) NOT NULL boolean: Integer(Boolean) (0.0) NOT NULL boolean_array: IntegerList(Boolean) (0.0) NOT NULL base64binary: Binary (0.0) NOT NULL hexbinary: Binary (0.0) NOT NULL myint_myattr: String (8.0) myint: Integer (0.0) required_elt_with_only_optional_attr_attr: String (0.0) optional_elt_with_only_req_attr_attr: String (0.0) int_min_occurs_0: Integer (0.0) int_nillable: Integer (0.0) int_min_occurs_0_nillable: Integer (0.0) int_min_occurs_0_nillable_nil: Integer(Boolean) (0.0) int_min_occurs_0_nillable_bis: Integer (0.0) int_min_occurs_0_nillable_bis_nil: Integer(Boolean) (0.0) simplecontent_extension_min_occurs_0_nillable_nilreason: String (0.0) simplecontent_extension_min_occurs_0_nillable_nil: Integer(Boolean) (0.0) simplecontent_extension_min_occurs_0_nillable: String (0.0) anonymous_type: Integer (0.0) NOT NULL union: String (0.0) NOT NULL list_of_string: StringList (0.0) NOT NULL list_of_boolean: IntegerList(Boolean) (0.0) NOT NULL list_of_integer: IntegerList (0.0) NOT NULL list_of_integer64: Integer64List (0.0) NOT NULL list_of_real: RealList (0.0) NOT NULL list_of_datetime: String (0.0) NOT NULL elt_with_list_of_integer_attr_attr: IntegerList (0.0) compound_simplifiable_subelement: String (0.0) compound_simplifiable_subelement2: String (0.0) NOT NULL compound_simplifiable_optional_attr: String (0.0) compound_simplifiable_optional: String (0.0) sequence_1_string_unbounded_subelement: StringList (0.0) NOT NULL sequence_unbounded_string_1_subelement: StringList (0.0) NOT NULL int_complex_simplifiable: IntegerList (0.0) an_abstract_element_in_other_ns_pkid: String (0.0) any_type_anyattributes: String (0.0) any_type: String (0.0) any_type_optional_anyattributes: String (0.0) any_type_optional: String (0.0) any_attr_anyattributes: String (0.0) any_attr: Integer (0.0) any_attr_no_attr_anyattributes: String (0.0) any_attr_no_attr: Integer (0.0) group2_elt: String (0.0) NOT NULL group4_elt: StringList (0.0) NOT NULL rec_a_pkid: String (0.0) myext_id: String (0.0) myext2_id: String (0.0) OGRFeature(main_elt):1 otherns_id (String) = otherns_id fixedvalunset (String) = fixed_value fixedvalset (String) = fixed_value defaultvalunset (String) = default_value defaultvalset (String) = mydefaultValSet myattributegroupattr2 (Integer) = 3 id_attr (String) = attr_id base_int (Integer) = 12 id (String) = element_id string (String) = element_string string_array (StringList) = (2:element_string_array,2nd element_string_array) int (Integer) = 3 int_array (IntegerList) = (2:3,4) long (Integer64) = 123456789012 long_array (Integer64List) = (2:123456789012,123456789013) float (Real(Float32)) = 1.23 float_array (RealList(Float32)) = (2:2.34,3.45) double (Real) = 1.23456789012 double_array (RealList) = (2:2.3456,3.4578) decimal (Real) = 1.23456789012 byte (Integer) = -128 short (Integer(Int16)) = -32768 positiveinteger (Integer) = 1 dt (DateTime) = 2012/01/01 12:34:56+00 date (Date) = 2012/01/01 time (Time) = 12:34:56 boolean (Integer(Boolean)) = 1 boolean_array (IntegerList(Boolean)) = (2:1,0) base64binary (Binary) = 62617365363442696E617279 hexbinary (Binary) = 68657842696E617279 myint_myattr (String) = 12345678 myint (Integer) = 10 required_elt_with_only_optional_attr_attr (String) = attr_value int_nillable (Integer) = (null) int_min_occurs_0_nillable_bis_nil (Integer(Boolean)) = 1 simplecontent_extension_min_occurs_0_nillable_nilreason (String) = unknown simplecontent_extension_min_occurs_0_nillable_nil (Integer(Boolean)) = 1 anonymous_type (Integer) = 3 union (String) = 42 list_of_string (StringList) = (3:a,b,c) list_of_boolean (IntegerList(Boolean)) = (2:1,0) list_of_integer (IntegerList) = (3:1,2,3) list_of_integer64 (Integer64List) = (3:123456789012,2,3) list_of_real (RealList) = (3:1.25,2.5,5) list_of_datetime (String) = 2012-01-01T12:34:56Z 2012-01-02T12:34:56Z elt_with_list_of_integer_attr_attr (IntegerList) = (3:1,2,3) compound_simplifiable_subelement2 (String) = element_compound_simplifiable_subelement2 sequence_1_string_unbounded_subelement (StringList) = (2:sequence_1_string_unbounded_1,sequence_1_string_unbounded_2) sequence_unbounded_string_1_subelement (StringList) = (2:sequence_unbounded_string_1,sequence_unbounded_string_2) int_complex_simplifiable (IntegerList) = (2:10,20) an_abstract_element_in_other_ns_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_an_abstract_element_in_other_ns_realization1_1 any_type_anyattributes (String) = { "foo": "bar" } any_type (String) = A<blowC any_type_optional (String) = any_attr_anyattributes (String) = { "foo": "bar" } any_attr (Integer) = 1 any_attr_no_attr (Integer) = 2 group2_elt (String) = group2_elt_1 group4_elt (StringList) = (2:group4_elt_1,group4_elt_2) rec_a_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_1 Layer name: main_elt_dt_array Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL value: DateTime (0.0) OGRFeature(main_elt_dt_array):1 ogr_pkid (String) = otherns_id_dt_array_1 parent_otherns_id (String) = otherns_id value (DateTime) = 2012/01/01 12:34:56+00 OGRFeature(main_elt_dt_array):2 ogr_pkid (String) = otherns_id_dt_array_2 parent_otherns_id (String) = otherns_id value (DateTime) = 2012/01/02 12:34:56+00 Layer name: main_elt_myint_repeated Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL myattr: String (8.0) value: Integer (0.0) NOT NULL OGRFeature(main_elt_myint_repeated):1 ogr_pkid (String) = otherns_id_myint_repeated_1 parent_otherns_id (String) = otherns_id myattr (String) = 12345678 value (Integer) = 1 OGRFeature(main_elt_myint_repeated):2 ogr_pkid (String) = otherns_id_myint_repeated_2 parent_otherns_id (String) = otherns_id value (Integer) = 2 Layer name: main_elt_unbounded_sequence_1_dt Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL subelement: DateTime (0.0) NOT NULL OGRFeature(main_elt_unbounded_sequence_1_dt):1 ogr_pkid (String) = otherns_id_unbounded_sequence_1_dt_1 parent_otherns_id (String) = otherns_id subelement (DateTime) = 2012/01/01 12:34:56+00 OGRFeature(main_elt_unbounded_sequence_1_dt):2 ogr_pkid (String) = otherns_id_unbounded_sequence_1_dt_2 parent_otherns_id (String) = otherns_id subelement (DateTime) = 2012/01/02 12:34:56+00 Layer name: main_elt_sequence_1_dt_unbounded_subelement Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL value: DateTime (0.0) OGRFeature(main_elt_sequence_1_dt_unbounded_subelement):1 ogr_pkid (String) = otherns_id_subelement_1 parent_otherns_id (String) = otherns_id value (DateTime) = 2012/01/01 12:34:56+00 OGRFeature(main_elt_sequence_1_dt_unbounded_subelement):2 ogr_pkid (String) = otherns_id_subelement_2 parent_otherns_id (String) = otherns_id value (DateTime) = 2012/01/02 12:34:56+00 Layer name: main_elt_sequence_unbounded_dt_1 Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL subelement: DateTime (0.0) NOT NULL OGRFeature(main_elt_sequence_unbounded_dt_1):1 ogr_pkid (String) = otherns_id_sequence_unbounded_dt_1_1 parent_otherns_id (String) = otherns_id subelement (DateTime) = 2012/01/03 12:34:56+00 OGRFeature(main_elt_sequence_unbounded_dt_1):2 ogr_pkid (String) = otherns_id_subelement_2 parent_otherns_id (String) = otherns_id subelement (DateTime) = 2012/01/04 12:34:56+00 Layer name: main_elt_sequence_sequence_subsequence Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL OGRFeature(main_elt_sequence_sequence_subsequence):1 ogr_pkid (String) = otherns_id_subsequence_1 parent_otherns_id (String) = otherns_id OGRFeature(main_elt_sequence_sequence_subsequence):2 ogr_pkid (String) = otherns_id_subsequence_2 parent_otherns_id (String) = otherns_id Layer name: main_elt_sequence_sequence_subsequence_subelement Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_ogr_pkid: String (0.0) NOT NULL value: DateTime (0.0) OGRFeature(main_elt_sequence_sequence_subsequence_subelement):1 ogr_pkid (String) = otherns_id_subsequence_1_subelement_1 parent_ogr_pkid (String) = otherns_id_subsequence_1 value (DateTime) = 2016/01/01 12:34:56+00 OGRFeature(main_elt_sequence_sequence_subsequence_subelement):2 ogr_pkid (String) = otherns_id_subsequence_1_subelement_2 parent_ogr_pkid (String) = otherns_id_subsequence_1 value (DateTime) = 2016/01/02 12:34:56+00 OGRFeature(main_elt_sequence_sequence_subsequence_subelement):3 ogr_pkid (String) = otherns_id_subsequence_2_subelement_3 parent_ogr_pkid (String) = otherns_id_subsequence_2 value (DateTime) = 2016/01/03 12:34:56+00 OGRFeature(main_elt_sequence_sequence_subsequence_subelement):4 ogr_pkid (String) = otherns_id_subsequence_2_subelement_4 parent_ogr_pkid (String) = otherns_id_subsequence_2 value (DateTime) = 2016/01/04 12:34:56+00 Layer name: main_elt_sequence_1_unbounded_with_2_subelts Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL subelement: String (0.0) NOT NULL subelement2: String (0.0) OGRFeature(main_elt_sequence_1_unbounded_with_2_subelts):1 ogr_pkid (String) = otherns_id_sequence_1_unbounded_with_2_subelts_1 parent_otherns_id (String) = otherns_id subelement (String) = sequence_1_unbounded_with_2_subelts_1 OGRFeature(main_elt_sequence_1_unbounded_with_2_subelts):2 ogr_pkid (String) = otherns_id_subelement_2 parent_otherns_id (String) = otherns_id subelement (String) = sequence_1_unbounded_with_2_subelts_2 Layer name: main_elt_sequence_1_unbounded_non_simplifiable Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL id: String (0.0) OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable):1 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_1 parent_otherns_id (String) = otherns_id id (String) = id1 OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable):2 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_2 parent_otherns_id (String) = otherns_id id (String) = id2 Layer name: main_elt_sequence_1_unbounded_non_simplifiable_sequence Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_ogr_pkid: String (0.0) NOT NULL subelement: String (0.0) NOT NULL OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable_sequence):1 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_1_subelement_1 parent_ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_1 subelement (String) = sequence_1_unbounded_non_simplifiable_1_1 OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable_sequence):2 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_1_subelement_2 parent_ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_1 subelement (String) = sequence_1_unbounded_non_simplifiable_1_2 OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable_sequence):3 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_2_subelement_3 parent_ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_2 subelement (String) = sequence_1_unbounded_non_simplifiable_2_1 OGRFeature(main_elt_sequence_1_unbounded_non_simplifiable_sequence):4 ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_2_subelement_4 parent_ogr_pkid (String) = otherns_id_sequence_1_unbounded_non_simplifiable_2 subelement (String) = sequence_1_unbounded_non_simplifiable_2_2 Layer name: main_elt_sequence_unbounded_1_with_2_subelts Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL subelement: String (0.0) NOT NULL subelement2: String (0.0) OGRFeature(main_elt_sequence_unbounded_1_with_2_subelts):1 ogr_pkid (String) = otherns_id_sequence_unbounded_1_with_2_subelts_1 parent_otherns_id (String) = otherns_id subelement (String) = sequence_unbounded_1_with_2_subelts_1 OGRFeature(main_elt_sequence_unbounded_1_with_2_subelts):2 ogr_pkid (String) = otherns_id_sequence_unbounded_1_with_2_subelts_2 parent_otherns_id (String) = otherns_id subelement (String) = sequence_unbounded_1_with_2_subelts_2 Layer name: main_elt_sequence_with_attr_unbounded Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL id: String (0.0) subelement: String (0.0) NOT NULL subelement2: String (0.0) OGRFeature(main_elt_sequence_with_attr_unbounded):1 ogr_pkid (String) = otherns_id_sequence_with_attr_unbounded_1 parent_otherns_id (String) = otherns_id id (String) = id1 subelement (String) = sequence_with_attr_unbounded_1 OGRFeature(main_elt_sequence_with_attr_unbounded):2 ogr_pkid (String) = otherns_id_sequence_with_attr_unbounded_2 parent_otherns_id (String) = otherns_id id (String) = id2 subelement (String) = sequence_with_attr_unbounded_2 Layer name: main_elt_any_type_repeated Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL anyattributes: String (0.0) value: String (0.0) NOT NULL OGRFeature(main_elt_any_type_repeated):1 ogr_pkid (String) = otherns_id_any_type_repeated_1 parent_otherns_id (String) = otherns_id value (String) = OGRFeature(main_elt_any_type_repeated):2 ogr_pkid (String) = otherns_id_any_type_repeated_2 parent_otherns_id (String) = otherns_id value (String) = Layer name: main_elt_group1 Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL group1_elt_1: StringList (0.0) group1_elt_2: String (0.0) OGRFeature(main_elt_group1):1 ogr_pkid (String) = otherns_id_group1_elt_1_1 parent_otherns_id (String) = otherns_id group1_elt_1 (StringList) = (2:group1_elt_1_1_1,group1_elt_1_1_2) group1_elt_2 (String) = group1_elt_2_1_1 OGRFeature(main_elt_group1):2 ogr_pkid (String) = otherns_id_group1_elt_1_2 parent_otherns_id (String) = otherns_id group1_elt_1 (StringList) = (1:group1_elt_1_2_1) group1_elt_2 (String) = group1_elt_2_2_1 Layer name: main_elt_group3 Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_otherns_id: String (0.0) NOT NULL group3_elt1: String (0.0) NOT NULL group3_elt1bis: String (0.0) group3_elt2_b: String (0.0) group3_elt2bis_attr: String (0.0) group3_elt2bis_b: String (0.0) group3_elt2ter_attr: String (0.0) OGRFeature(main_elt_group3):1 ogr_pkid (String) = otherns_id_group3_elt1_1 parent_otherns_id (String) = otherns_id group3_elt1 (String) = sixthelement group3_elt1bis (String) = sixthelementbis group3_elt2_b (String) = sixthelement_a_b group3_elt2bis_b (String) = sixthelement_a_b2 OGRFeature(main_elt_group3):2 ogr_pkid (String) = otherns_id_group3_elt1_2 parent_otherns_id (String) = otherns_id group3_elt1 (String) = sixthelement2 OGRFeature(main_elt_group3):3 ogr_pkid (String) = otherns_id_group3_elt1_3 parent_otherns_id (String) = otherns_id group3_elt1 (String) = sixthelement3 group3_elt2_b (String) = sixthelement3_a_b group3_elt2bis_attr (String) = foo group3_elt2bis_b (String) = sixthelement_a_b2 group3_elt2ter_attr (String) = bar OGRFeature(main_elt_group3):4 ogr_pkid (String) = otherns_id_group3_elt1_4 parent_otherns_id (String) = otherns_id group3_elt1 (String) = sixthelement4 Layer name: main_elt_group3_group3_elt3_b2 Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL parent_ogr_pkid: String (0.0) NOT NULL value: DateTime (0.0) OGRFeature(main_elt_group3_group3_elt3_b2):1 ogr_pkid (String) = otherns_id_group3_elt1_1_b2_1 parent_ogr_pkid (String) = otherns_id_group3_elt1_1 value (DateTime) = 2016/01/01 12:34:56+00 OGRFeature(main_elt_group3_group3_elt3_b2):2 ogr_pkid (String) = otherns_id_group3_elt1_1_b2_2 parent_ogr_pkid (String) = otherns_id_group3_elt1_1 value (DateTime) = 2016/01/02 12:34:56+00 OGRFeature(main_elt_group3_group3_elt3_b2):3 ogr_pkid (String) = otherns_id_group3_elt1_4_b2_3 parent_ogr_pkid (String) = otherns_id_group3_elt1_4 value (DateTime) = 2016/01/03 12:34:56+00 OGRFeature(main_elt_group3_group3_elt3_b2):4 ogr_pkid (String) = otherns_id_group3_elt1_4_b2_4 parent_ogr_pkid (String) = otherns_id_group3_elt1_4 value (DateTime) = 2016/01/04 12:34:56+00 Layer name: rec_a Geometry: None Feature Count: 4 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL rec_b_pkid: String (0.0) elt_a: String (0.0) OGRFeature(rec_a):4 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_4 elt_a (String) = elt_A4 OGRFeature(rec_a):3 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_3 rec_b_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_3 elt_a (String) = elt_A3 OGRFeature(rec_a):2 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_2 rec_b_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_2 elt_a (String) = elt_A2 OGRFeature(rec_a):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_1 rec_b_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_1 elt_a (String) = elt_A Layer name: rec_b Geometry: None Feature Count: 3 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL rec_a_pkid: String (0.0) elt_b: String (0.0) OGRFeature(rec_b):3 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_3 rec_a_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_4 elt_b (String) = elt_B3 OGRFeature(rec_b):2 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_2 rec_a_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_3 elt_b (String) = elt_B2 OGRFeature(rec_b):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_B_1 rec_a_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_rec_A_2 elt_b (String) = elt_B Layer name: an_abstract_element_in_other_ns_realization1 Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL a_int: Integer (0.0) NOT NULL OGRFeature(an_abstract_element_in_other_ns_realization1):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_an_abstract_element_in_other_ns_realization1_1 a_int (Integer) = 3 Layer name: extension Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) ogr_pkid: String (0.0) NOT NULL value: String (0.0) OGRFeature(extension):1 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_extension_1 value (String) = OGRFeature(extension):2 ogr_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_extension_2 value (String) = Layer name: main_elt_an_abstract_element_abstract_element_realization1 Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(main_elt_an_abstract_element_abstract_element_realization1):1 occurrence (Integer) = 1 parent_pkid (String) = otherns_id child_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization1_1 OGRFeature(main_elt_an_abstract_element_abstract_element_realization1):2 occurrence (Integer) = 2 parent_pkid (String) = otherns_id child_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization1_2 Layer name: main_elt_an_abstract_element_abstract_element_realization2 Geometry: None Feature Count: 1 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(main_elt_an_abstract_element_abstract_element_realization2):1 occurrence (Integer) = 1 parent_pkid (String) = otherns_id child_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_abstract_element_realization2_1 Layer name: main_elt_myext_extension_extension Geometry: None Feature Count: 2 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL OGRFeature(main_elt_myext_extension_extension):1 occurrence (Integer) = 1 parent_pkid (String) = otherns_id child_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_extension_1 OGRFeature(main_elt_myext_extension_extension):2 occurrence (Integer) = 2 parent_pkid (String) = otherns_id child_pkid (String) = 3CF9893502A592E8CF5EA6EF3D8F8C7B_extension_2 Layer name: main_elt_myext2_extension_extension Geometry: None Feature Count: 0 Layer SRS WKT: (unknown) occurrence: Integer (0.0) NOT NULL parent_pkid: String (0.0) NOT NULL child_pkid: String (0.0) NOT NULL Layer name: _ogr_fields_metadata Geometry: None Feature Count: 142 Layer SRS WKT: (unknown) layer_name: String (0.0) field_index: Integer (0.0) field_name: String (0.0) field_xpath: String (0.0) field_type: String (0.0) field_is_list: Integer(Boolean) (0.0) field_min_occurs: Integer (0.0) field_max_occurs: Integer (0.0) field_repetition_on_sequence: Integer(Boolean) (0.0) field_default_value: String (0.0) field_fixed_value: String (0.0) field_category: String (0.0) field_related_layer: String (0.0) field_junction_layer: String (0.0) field_documentation: String (0.0) OGRFeature(_ogr_fields_metadata):0 layer_name (String) = abstract_element_realization1 field_index (Integer) = 1 field_name (String) = a_int field_xpath (String) = myns:abstract_element_realization1/myns:a_int field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):1 layer_name (String) = abstract_element_realization2 field_index (Integer) = 1 field_name (String) = b_int field_xpath (String) = myns:abstract_element_realization2/myns:b_int field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):2 layer_name (String) = main_elt field_index (Integer) = 1 field_name (String) = optionalstrattr field_xpath (String) = myns:main_elt/@optionalStrAttr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):3 layer_name (String) = main_elt field_index (Integer) = 2 field_name (String) = fixedvalunset field_xpath (String) = myns:main_elt/@fixedValUnset field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_fixed_value (String) = fixed_value field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):4 layer_name (String) = main_elt field_index (Integer) = 3 field_name (String) = fixedvalset field_xpath (String) = myns:main_elt/@fixedValSet field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_fixed_value (String) = fixed_value field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):5 layer_name (String) = main_elt field_index (Integer) = 4 field_name (String) = defaultvalunset field_xpath (String) = myns:main_elt/@defaultValUnset field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = default_value field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):6 layer_name (String) = main_elt field_index (Integer) = 5 field_name (String) = defaultvalset field_xpath (String) = myns:main_elt/@defaultValSet field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_default_value (String) = default_value field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):7 layer_name (String) = main_elt field_index (Integer) = 6 field_name (String) = otherns_id field_xpath (String) = myns:main_elt/@otherns:id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):8 layer_name (String) = main_elt field_index (Integer) = 7 field_name (String) = myattributegroupattr1 field_xpath (String) = myns:main_elt/@myAttributeGroupAttr1 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):9 layer_name (String) = main_elt field_index (Integer) = 8 field_name (String) = myattributegroupattr2 field_xpath (String) = myns:main_elt/@myAttributeGroupAttr2 field_type (String) = integer field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):10 layer_name (String) = main_elt field_index (Integer) = 9 field_name (String) = id_attr field_xpath (String) = myns:main_elt/@id field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):11 layer_name (String) = main_elt field_index (Integer) = 10 field_name (String) = base_int field_xpath (String) = myns:main_elt/myns:base_int field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):12 layer_name (String) = main_elt field_index (Integer) = 11 field_name (String) = id field_xpath (String) = myns:main_elt/myns:id field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):13 layer_name (String) = main_elt field_index (Integer) = 12 field_name (String) = string field_xpath (String) = myns:main_elt/myns:string field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):14 layer_name (String) = main_elt field_index (Integer) = 13 field_name (String) = string_array field_xpath (String) = myns:main_elt/myns:string_array field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):15 layer_name (String) = main_elt field_index (Integer) = 14 field_name (String) = int field_xpath (String) = myns:main_elt/myns:int field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):16 layer_name (String) = main_elt field_index (Integer) = 15 field_name (String) = int_array field_xpath (String) = myns:main_elt/myns:int_array field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):17 layer_name (String) = main_elt field_index (Integer) = 16 field_name (String) = long field_xpath (String) = myns:main_elt/myns:long field_type (String) = long field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):18 layer_name (String) = main_elt field_index (Integer) = 17 field_name (String) = long_array field_xpath (String) = myns:main_elt/myns:long_array field_type (String) = long field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):19 layer_name (String) = main_elt field_index (Integer) = 18 field_name (String) = float field_xpath (String) = myns:main_elt/myns:float field_type (String) = float field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):20 layer_name (String) = main_elt field_index (Integer) = 19 field_name (String) = float_array field_xpath (String) = myns:main_elt/myns:float_array field_type (String) = float field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):21 layer_name (String) = main_elt field_index (Integer) = 20 field_name (String) = double field_xpath (String) = myns:main_elt/myns:double field_type (String) = double field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):22 layer_name (String) = main_elt field_index (Integer) = 21 field_name (String) = double_array field_xpath (String) = myns:main_elt/myns:double_array field_type (String) = double field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):23 layer_name (String) = main_elt field_index (Integer) = 22 field_name (String) = decimal field_xpath (String) = myns:main_elt/myns:decimal field_type (String) = decimal field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):24 layer_name (String) = main_elt field_index (Integer) = 23 field_name (String) = byte field_xpath (String) = myns:main_elt/myns:byte field_type (String) = byte field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):25 layer_name (String) = main_elt field_index (Integer) = 24 field_name (String) = short field_xpath (String) = myns:main_elt/myns:short field_type (String) = short field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):26 layer_name (String) = main_elt field_index (Integer) = 25 field_name (String) = positiveinteger field_xpath (String) = myns:main_elt/myns:positiveInteger field_type (String) = positiveInteger field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):27 layer_name (String) = main_elt field_index (Integer) = 26 field_name (String) = dt field_xpath (String) = myns:main_elt/myns:dt field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):28 layer_name (String) = main_elt field_index (Integer) = 27 field_name (String) = dt_array field_xpath (String) = myns:main_elt/myns:dt_array field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_dt_array OGRFeature(_ogr_fields_metadata):29 layer_name (String) = main_elt field_index (Integer) = 28 field_name (String) = date field_xpath (String) = myns:main_elt/myns:date field_type (String) = date field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):30 layer_name (String) = main_elt field_index (Integer) = 29 field_name (String) = time field_xpath (String) = myns:main_elt/myns:time field_type (String) = time field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):31 layer_name (String) = main_elt field_index (Integer) = 30 field_name (String) = boolean field_xpath (String) = myns:main_elt/myns:boolean field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):32 layer_name (String) = main_elt field_index (Integer) = 31 field_name (String) = boolean_array field_xpath (String) = myns:main_elt/myns:boolean_array field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR field_documentation (String) = Doc of boolean_array Doc of boolean_array simple type OGRFeature(_ogr_fields_metadata):33 layer_name (String) = main_elt field_index (Integer) = 32 field_name (String) = base64binary field_xpath (String) = myns:main_elt/myns:base64Binary field_type (String) = base64Binary field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):34 layer_name (String) = main_elt field_index (Integer) = 33 field_name (String) = hexbinary field_xpath (String) = myns:main_elt/myns:hexBinary field_type (String) = hexBinary field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):35 layer_name (String) = main_elt field_index (Integer) = 34 field_name (String) = myint_myattr field_xpath (String) = myns:main_elt/myns:myint/@myAttr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Doc myAttr OGRFeature(_ogr_fields_metadata):36 layer_name (String) = main_elt field_index (Integer) = 35 field_name (String) = myint field_xpath (String) = myns:main_elt/myns:myint field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Doc myint OGRFeature(_ogr_fields_metadata):37 layer_name (String) = main_elt field_index (Integer) = 36 field_name (String) = myint_repeated field_xpath (String) = myns:main_elt/myns:myint_repeated field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_myint_repeated OGRFeature(_ogr_fields_metadata):38 layer_name (String) = main_elt field_index (Integer) = 37 field_name (String) = required_elt_with_only_optional_attr_attr field_xpath (String) = myns:main_elt/myns:required_elt_with_only_optional_attr/@attr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Doc of attr OGRFeature(_ogr_fields_metadata):39 layer_name (String) = main_elt field_index (Integer) = 38 field_name (String) = optional_elt_with_only_req_attr_attr field_xpath (String) = myns:main_elt/myns:optional_elt_with_only_req_attr/@attr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):40 layer_name (String) = main_elt field_index (Integer) = 39 field_name (String) = int_min_occurs_0 field_xpath (String) = myns:main_elt/myns:int_min_occurs_0 field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):41 layer_name (String) = main_elt field_index (Integer) = 40 field_name (String) = int_nillable field_xpath (String) = myns:main_elt/myns:int_nillable field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):42 layer_name (String) = main_elt field_index (Integer) = 41 field_name (String) = int_min_occurs_0_nillable field_xpath (String) = myns:main_elt/myns:int_min_occurs_0_nillable field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):43 layer_name (String) = main_elt field_index (Integer) = 42 field_name (String) = int_min_occurs_0_nillable_nil field_xpath (String) = myns:main_elt/myns:int_min_occurs_0_nillable/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):44 layer_name (String) = main_elt field_index (Integer) = 43 field_name (String) = int_min_occurs_0_nillable_bis field_xpath (String) = myns:main_elt/myns:int_min_occurs_0_nillable_bis field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):45 layer_name (String) = main_elt field_index (Integer) = 44 field_name (String) = int_min_occurs_0_nillable_bis_nil field_xpath (String) = myns:main_elt/myns:int_min_occurs_0_nillable_bis/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):46 layer_name (String) = main_elt field_index (Integer) = 45 field_name (String) = simplecontent_extension_min_occurs_0_nillable_nilreason field_xpath (String) = myns:main_elt/myns:simpleContent_extension_min_occurs_0_nillable/@nilReason field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):47 layer_name (String) = main_elt field_index (Integer) = 46 field_name (String) = simplecontent_extension_min_occurs_0_nillable_nil field_xpath (String) = myns:main_elt/myns:simpleContent_extension_min_occurs_0_nillable/@xsi:nil field_type (String) = boolean field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):48 layer_name (String) = main_elt field_index (Integer) = 47 field_name (String) = simplecontent_extension_min_occurs_0_nillable field_xpath (String) = myns:main_elt/myns:simpleContent_extension_min_occurs_0_nillable field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):49 layer_name (String) = main_elt field_index (Integer) = 48 field_name (String) = anonymous_type field_xpath (String) = myns:main_elt/myns:anonymous_type field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):50 layer_name (String) = main_elt field_index (Integer) = 49 field_name (String) = union field_xpath (String) = myns:main_elt/myns:union field_type (String) = anySimpleType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):51 layer_name (String) = main_elt field_index (Integer) = 50 field_name (String) = list_of_string field_xpath (String) = myns:main_elt/myns:list_of_string field_type (String) = string field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):52 layer_name (String) = main_elt field_index (Integer) = 51 field_name (String) = list_of_boolean field_xpath (String) = myns:main_elt/myns:list_of_boolean field_type (String) = boolean field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):53 layer_name (String) = main_elt field_index (Integer) = 52 field_name (String) = list_of_integer field_xpath (String) = myns:main_elt/myns:list_of_integer field_type (String) = integer field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):54 layer_name (String) = main_elt field_index (Integer) = 53 field_name (String) = list_of_integer64 field_xpath (String) = myns:main_elt/myns:list_of_integer64 field_type (String) = long field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):55 layer_name (String) = main_elt field_index (Integer) = 54 field_name (String) = list_of_real field_xpath (String) = myns:main_elt/myns:list_of_real field_type (String) = double field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):56 layer_name (String) = main_elt field_index (Integer) = 55 field_name (String) = list_of_datetime field_xpath (String) = myns:main_elt/myns:list_of_datetime field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):57 layer_name (String) = main_elt field_index (Integer) = 56 field_name (String) = elt_with_list_of_integer_attr_attr field_xpath (String) = myns:main_elt/myns:elt_with_list_of_integer_attr/@attr field_type (String) = integer field_is_list (Integer(Boolean)) = 1 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):58 layer_name (String) = main_elt field_index (Integer) = 57 field_name (String) = compound_simplifiable_subelement field_xpath (String) = myns:main_elt/myns:compound_simplifiable/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):59 layer_name (String) = main_elt field_index (Integer) = 58 field_name (String) = compound_simplifiable_subelement2 field_xpath (String) = myns:main_elt/myns:compound_simplifiable/myns:subelement2 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):60 layer_name (String) = main_elt field_index (Integer) = 59 field_name (String) = compound_simplifiable_optional_attr field_xpath (String) = myns:main_elt/myns:compound_simplifiable_optional/@attr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):61 layer_name (String) = main_elt field_index (Integer) = 60 field_name (String) = compound_simplifiable_optional field_xpath (String) = myns:main_elt/myns:compound_simplifiable_optional field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):62 layer_name (String) = main_elt field_index (Integer) = 61 field_name (String) = sequence_1_string_unbounded_subelement field_xpath (String) = myns:main_elt/myns:sequence_1_string_unbounded/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):63 layer_name (String) = main_elt field_index (Integer) = 62 field_name (String) = sequence_unbounded_string_1_subelement field_xpath (String) = myns:main_elt/myns:sequence_unbounded_string_1/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):64 layer_name (String) = main_elt field_index (Integer) = 63 field_name (String) = unbounded_sequence_1_dt field_xpath (String) = myns:main_elt/myns:unbounded_sequence_1_dt field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_unbounded_sequence_1_dt OGRFeature(_ogr_fields_metadata):65 layer_name (String) = main_elt field_index (Integer) = 64 field_name (String) = sequence_1_dt_unbounded_subelement field_xpath (String) = myns:main_elt/myns:sequence_1_dt_unbounded/myns:subelement field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_1_dt_unbounded_subelement OGRFeature(_ogr_fields_metadata):66 layer_name (String) = main_elt field_index (Integer) = 65 field_name (String) = sequence_unbounded_dt_1 field_xpath (String) = myns:main_elt/myns:sequence_unbounded_dt_1 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_unbounded_dt_1 OGRFeature(_ogr_fields_metadata):67 layer_name (String) = main_elt field_index (Integer) = 66 field_name (String) = sequence_sequence_subsequence field_xpath (String) = myns:main_elt/myns:sequence_sequence/myns:subsequence field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_sequence_subsequence OGRFeature(_ogr_fields_metadata):68 layer_name (String) = main_elt field_index (Integer) = 67 field_name (String) = sequence_1_unbounded_with_2_subelts field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_with_2_subelts field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_1_unbounded_with_2_subelts OGRFeature(_ogr_fields_metadata):69 layer_name (String) = main_elt field_index (Integer) = 68 field_name (String) = sequence_1_unbounded_non_simplifiable field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_1_unbounded_non_simplifiable OGRFeature(_ogr_fields_metadata):70 layer_name (String) = main_elt field_index (Integer) = 69 field_name (String) = sequence_unbounded_1_with_2_subelts field_xpath (String) = myns:main_elt/myns:sequence_unbounded_1_with_2_subelts field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_unbounded_1_with_2_subelts OGRFeature(_ogr_fields_metadata):71 layer_name (String) = main_elt field_index (Integer) = 70 field_name (String) = sequence_with_attr_unbounded field_xpath (String) = myns:main_elt/myns:sequence_with_attr_unbounded field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_with_attr_unbounded OGRFeature(_ogr_fields_metadata):72 layer_name (String) = main_elt field_index (Integer) = 71 field_name (String) = int_complex_simplifiable field_xpath (String) = myns:main_elt/myns:int_complex_simplifiable field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):73 layer_name (String) = main_elt field_index (Integer) = 72 field_name (String) = an_abstract_element_abstract_element_realization1 field_xpath (String) = myns:main_elt/myns:abstract_element_realization1 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = abstract_element_realization1 field_junction_layer (String) = main_elt_an_abstract_element_abstract_element_realization1 OGRFeature(_ogr_fields_metadata):74 layer_name (String) = main_elt field_index (Integer) = 73 field_name (String) = an_abstract_element_abstract_element_realization2 field_xpath (String) = myns:main_elt/myns:abstract_element_realization2 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = abstract_element_realization2 field_junction_layer (String) = main_elt_an_abstract_element_abstract_element_realization2 OGRFeature(_ogr_fields_metadata):75 layer_name (String) = main_elt field_index (Integer) = 74 field_name (String) = an_abstract_element_in_other_ns_pkid field_xpath (String) = myns:main_elt/otherns:an_abstract_element_in_other_ns_realization1 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = an_abstract_element_in_other_ns_realization1 OGRFeature(_ogr_fields_metadata):76 layer_name (String) = main_elt field_index (Integer) = 75 field_name (String) = any_type_anyattributes field_xpath (String) = myns:main_elt/myns:any_type/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):77 layer_name (String) = main_elt field_index (Integer) = 76 field_name (String) = any_type field_xpath (String) = myns:main_elt/myns:any_type field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):78 layer_name (String) = main_elt field_index (Integer) = 77 field_name (String) = any_type_repeated field_xpath (String) = myns:main_elt/myns:any_type_repeated field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_any_type_repeated OGRFeature(_ogr_fields_metadata):79 layer_name (String) = main_elt field_index (Integer) = 78 field_name (String) = any_type_optional_anyattributes field_xpath (String) = myns:main_elt/myns:any_type_optional/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):80 layer_name (String) = main_elt field_index (Integer) = 79 field_name (String) = any_type_optional field_xpath (String) = myns:main_elt/myns:any_type_optional field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):81 layer_name (String) = main_elt field_index (Integer) = 80 field_name (String) = any_attr_anyattributes field_xpath (String) = myns:main_elt/myns:any_attr/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):82 layer_name (String) = main_elt field_index (Integer) = 81 field_name (String) = any_attr field_xpath (String) = myns:main_elt/myns:any_attr field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):83 layer_name (String) = main_elt field_index (Integer) = 82 field_name (String) = any_attr_no_attr_anyattributes field_xpath (String) = myns:main_elt/myns:any_attr_no_attr/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):84 layer_name (String) = main_elt field_index (Integer) = 83 field_name (String) = any_attr_no_attr field_xpath (String) = myns:main_elt/myns:any_attr_no_attr field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):85 layer_name (String) = main_elt field_index (Integer) = 84 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = GROUP field_related_layer (String) = main_elt_group1 OGRFeature(_ogr_fields_metadata):86 layer_name (String) = main_elt field_index (Integer) = 85 field_name (String) = group2_elt field_xpath (String) = myns:main_elt/myns:group2_elt field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):87 layer_name (String) = main_elt field_index (Integer) = 86 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = GROUP field_related_layer (String) = main_elt_group3 OGRFeature(_ogr_fields_metadata):88 layer_name (String) = main_elt field_index (Integer) = 87 field_name (String) = group4_elt field_xpath (String) = myns:main_elt/myns:group4_elt field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):89 layer_name (String) = main_elt field_index (Integer) = 88 field_name (String) = rec_a_pkid field_xpath (String) = myns:main_elt/myns:rec_A field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = rec_a OGRFeature(_ogr_fields_metadata):90 layer_name (String) = main_elt field_index (Integer) = 89 field_name (String) = myext_id field_xpath (String) = myns:main_elt/myns:myext/@id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):91 layer_name (String) = main_elt field_index (Integer) = 90 field_name (String) = myext_extension_extension field_xpath (String) = myns:main_elt/myns:myext/myns:extension field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = extension field_junction_layer (String) = main_elt_myext_extension_extension OGRFeature(_ogr_fields_metadata):92 layer_name (String) = main_elt field_index (Integer) = 91 field_name (String) = myext2_id field_xpath (String) = myns:main_elt/myns:myext2/@id field_type (String) = ID field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):93 layer_name (String) = main_elt field_index (Integer) = 92 field_name (String) = myext2_extension_extension field_xpath (String) = myns:main_elt/myns:myext2/myns:extension field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_JUNCTION_TABLE field_related_layer (String) = extension field_junction_layer (String) = main_elt_myext2_extension_extension OGRFeature(_ogr_fields_metadata):94 layer_name (String) = main_elt_dt_array field_index (Integer) = 1 field_name (String) = value field_xpath (String) = myns:main_elt/myns:dt_array field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):95 layer_name (String) = main_elt_myint_repeated field_index (Integer) = 1 field_name (String) = myattr field_xpath (String) = myns:main_elt/myns:myint_repeated/@myAttr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Doc myAttr OGRFeature(_ogr_fields_metadata):96 layer_name (String) = main_elt_myint_repeated field_index (Integer) = 2 field_name (String) = value field_xpath (String) = myns:main_elt/myns:myint_repeated field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR field_documentation (String) = Doc myint OGRFeature(_ogr_fields_metadata):97 layer_name (String) = main_elt_unbounded_sequence_1_dt field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:unbounded_sequence_1_dt/myns:subelement field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):98 layer_name (String) = main_elt_sequence_1_dt_unbounded_subelement field_index (Integer) = 1 field_name (String) = value field_xpath (String) = myns:main_elt/myns:sequence_1_dt_unbounded/myns:subelement field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):99 layer_name (String) = main_elt_sequence_unbounded_dt_1 field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_unbounded_dt_1/myns:subelement field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):100 layer_name (String) = main_elt_sequence_sequence_subsequence field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_sequence/myns:subsequence/myns:subelement field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_sequence_subsequence_subelement OGRFeature(_ogr_fields_metadata):101 layer_name (String) = main_elt_sequence_sequence_subsequence_subelement field_index (Integer) = 1 field_name (String) = value field_xpath (String) = myns:main_elt/myns:sequence_sequence/myns:subsequence/myns:subelement field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):102 layer_name (String) = main_elt_sequence_1_unbounded_with_2_subelts field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_with_2_subelts/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):103 layer_name (String) = main_elt_sequence_1_unbounded_with_2_subelts field_index (Integer) = 2 field_name (String) = subelement2 field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_with_2_subelts/myns:subelement2 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):104 layer_name (String) = main_elt_sequence_1_unbounded_non_simplifiable field_index (Integer) = 1 field_name (String) = id field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable/@id field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):105 layer_name (String) = main_elt_sequence_1_unbounded_non_simplifiable field_index (Integer) = 2 field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_sequence_1_unbounded_non_simplifiable_sequence OGRFeature(_ogr_fields_metadata):106 layer_name (String) = main_elt_sequence_1_unbounded_non_simplifiable_sequence field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):107 layer_name (String) = main_elt_sequence_unbounded_1_with_2_subelts field_index (Integer) = 1 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_unbounded_1_with_2_subelts/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):108 layer_name (String) = main_elt_sequence_unbounded_1_with_2_subelts field_index (Integer) = 2 field_name (String) = subelement2 field_xpath (String) = myns:main_elt/myns:sequence_unbounded_1_with_2_subelts/myns:subelement2 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):109 layer_name (String) = main_elt_sequence_with_attr_unbounded field_index (Integer) = 1 field_name (String) = id field_xpath (String) = myns:main_elt/myns:sequence_with_attr_unbounded/@id field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):110 layer_name (String) = main_elt_sequence_with_attr_unbounded field_index (Integer) = 2 field_name (String) = subelement field_xpath (String) = myns:main_elt/myns:sequence_with_attr_unbounded/myns:subelement field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):111 layer_name (String) = main_elt_sequence_with_attr_unbounded field_index (Integer) = 3 field_name (String) = subelement2 field_xpath (String) = myns:main_elt/myns:sequence_with_attr_unbounded/myns:subelement2 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):112 layer_name (String) = main_elt_any_type_repeated field_index (Integer) = 1 field_name (String) = anyattributes field_xpath (String) = myns:main_elt/myns:any_type_repeated/@* field_type (String) = json_dict field_is_list (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):113 layer_name (String) = main_elt_any_type_repeated field_index (Integer) = 2 field_name (String) = value field_xpath (String) = myns:main_elt/myns:any_type_repeated field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):114 layer_name (String) = main_elt_group1 field_index (Integer) = 1 field_name (String) = group1_elt_1 field_xpath (String) = myns:main_elt/myns:group1_elt_1 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):115 layer_name (String) = main_elt_group1 field_index (Integer) = 2 field_name (String) = group1_elt_2 field_xpath (String) = myns:main_elt/myns:group1_elt_2 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):116 layer_name (String) = main_elt_group3 field_index (Integer) = 1 field_name (String) = group3_elt1 field_xpath (String) = myns:main_elt/myns:group3_elt1 field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):117 layer_name (String) = main_elt_group3 field_index (Integer) = 2 field_name (String) = group3_elt1bis field_xpath (String) = myns:main_elt/myns:group3_elt1bis field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):118 layer_name (String) = main_elt_group3 field_index (Integer) = 3 field_name (String) = group3_elt2_b field_xpath (String) = myns:main_elt/myns:group3_elt2/myns:b field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):119 layer_name (String) = main_elt_group3 field_index (Integer) = 4 field_name (String) = group3_elt2bis_attr field_xpath (String) = myns:main_elt/myns:group3_elt2bis/@attr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):120 layer_name (String) = main_elt_group3 field_index (Integer) = 5 field_name (String) = group3_elt2bis_b field_xpath (String) = myns:main_elt/myns:group3_elt2bis/myns:b field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):121 layer_name (String) = main_elt_group3 field_index (Integer) = 6 field_name (String) = group3_elt2ter_attr field_xpath (String) = myns:main_elt/myns:group3_elt2ter/@attr field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):122 layer_name (String) = main_elt_group3 field_index (Integer) = 7 field_name (String) = group3_elt3_b2 field_xpath (String) = myns:main_elt/myns:group3_elt3/myns:b2 field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 2147483647 field_repetition_on_sequence (Integer(Boolean)) = 0 field_category (String) = PATH_TO_CHILD_ELEMENT_NO_LINK field_related_layer (String) = main_elt_group3_group3_elt3_b2 OGRFeature(_ogr_fields_metadata):123 layer_name (String) = main_elt_group3_group3_elt3_b2 field_index (Integer) = 1 field_name (String) = value field_xpath (String) = myns:main_elt/myns:group3_elt3/myns:b2 field_type (String) = dateTime field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):124 layer_name (String) = rec_a field_index (Integer) = 1 field_name (String) = rec_b_pkid field_xpath (String) = myns:rec_A/myns:rec_B field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = rec_b OGRFeature(_ogr_fields_metadata):125 layer_name (String) = rec_a field_index (Integer) = 2 field_name (String) = elt_a field_xpath (String) = myns:rec_A/myns:elt_A field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):126 layer_name (String) = rec_b field_index (Integer) = 1 field_name (String) = rec_a_pkid field_xpath (String) = myns:rec_B/myns:rec_A field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = PATH_TO_CHILD_ELEMENT_WITH_LINK field_related_layer (String) = rec_a OGRFeature(_ogr_fields_metadata):127 layer_name (String) = rec_b field_index (Integer) = 2 field_name (String) = elt_b field_xpath (String) = myns:rec_B/myns:elt_B field_type (String) = string field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):128 layer_name (String) = an_abstract_element_in_other_ns_realization1 field_index (Integer) = 1 field_name (String) = a_int field_xpath (String) = otherns:an_abstract_element_in_other_ns_realization1/otherns:a_int field_type (String) = int field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 1 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):129 layer_name (String) = extension field_index (Integer) = 1 field_name (String) = value field_xpath (String) = myns:extension/* field_type (String) = anyType field_is_list (Integer(Boolean)) = 0 field_min_occurs (Integer) = 0 field_max_occurs (Integer) = 1 field_category (String) = REGULAR OGRFeature(_ogr_fields_metadata):130 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization1 field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):131 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization1 field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):132 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization1 field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):133 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization2 field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):134 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization2 field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):135 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization2 field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):136 layer_name (String) = main_elt_myext_extension_extension field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):137 layer_name (String) = main_elt_myext_extension_extension field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):138 layer_name (String) = main_elt_myext_extension_extension field_name (String) = child_pkid OGRFeature(_ogr_fields_metadata):139 layer_name (String) = main_elt_myext2_extension_extension field_name (String) = occurrence OGRFeature(_ogr_fields_metadata):140 layer_name (String) = main_elt_myext2_extension_extension field_name (String) = parent_pkid OGRFeature(_ogr_fields_metadata):141 layer_name (String) = main_elt_myext2_extension_extension field_name (String) = child_pkid Layer name: _ogr_layers_metadata Geometry: None Feature Count: 27 Layer SRS WKT: (unknown) layer_name: String (0.0) layer_xpath: String (0.0) layer_category: String (0.0) layer_pkid_name: String (0.0) layer_parent_pkid_name: String (0.0) layer_documentation: String (0.0) OGRFeature(_ogr_layers_metadata):0 layer_name (String) = abstract_element_realization1 layer_xpath (String) = myns:abstract_element_realization1 layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):1 layer_name (String) = abstract_element_realization2 layer_xpath (String) = myns:abstract_element_realization2 layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):2 layer_name (String) = main_elt layer_xpath (String) = myns:main_elt layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = otherns_id layer_documentation (String) = Doc of main_elt Doc of main_elt complex type OGRFeature(_ogr_layers_metadata):3 layer_name (String) = main_elt_dt_array layer_xpath (String) = myns:main_elt/myns:dt_array layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):4 layer_name (String) = main_elt_myint_repeated layer_xpath (String) = myns:main_elt/myns:myint_repeated layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id layer_documentation (String) = Doc myint OGRFeature(_ogr_layers_metadata):5 layer_name (String) = main_elt_unbounded_sequence_1_dt layer_xpath (String) = myns:main_elt/myns:unbounded_sequence_1_dt layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):6 layer_name (String) = main_elt_sequence_1_dt_unbounded_subelement layer_xpath (String) = myns:main_elt/myns:sequence_1_dt_unbounded/myns:subelement layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):7 layer_name (String) = main_elt_sequence_unbounded_dt_1 layer_xpath (String) = myns:main_elt/myns:sequence_unbounded_dt_1 layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):8 layer_name (String) = main_elt_sequence_sequence_subsequence layer_xpath (String) = myns:main_elt/myns:sequence_sequence/myns:subsequence layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):9 layer_name (String) = main_elt_sequence_sequence_subsequence_subelement layer_xpath (String) = myns:main_elt/myns:sequence_sequence/myns:subsequence/myns:subelement layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_ogr_pkid OGRFeature(_ogr_layers_metadata):10 layer_name (String) = main_elt_sequence_1_unbounded_with_2_subelts layer_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_with_2_subelts layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):11 layer_name (String) = main_elt_sequence_1_unbounded_non_simplifiable layer_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):12 layer_name (String) = main_elt_sequence_1_unbounded_non_simplifiable_sequence layer_xpath (String) = myns:main_elt/myns:sequence_1_unbounded_non_simplifiable;extra=sequence layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_ogr_pkid OGRFeature(_ogr_layers_metadata):13 layer_name (String) = main_elt_sequence_unbounded_1_with_2_subelts layer_xpath (String) = myns:main_elt/myns:sequence_unbounded_1_with_2_subelts layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):14 layer_name (String) = main_elt_sequence_with_attr_unbounded layer_xpath (String) = myns:main_elt/myns:sequence_with_attr_unbounded layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):15 layer_name (String) = main_elt_any_type_repeated layer_xpath (String) = myns:main_elt/myns:any_type_repeated layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id OGRFeature(_ogr_layers_metadata):16 layer_name (String) = main_elt_group1 layer_xpath (String) = myns:main_elt;extra=group1 layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id layer_documentation (String) = Doc of group1 OGRFeature(_ogr_layers_metadata):17 layer_name (String) = main_elt_group3 layer_xpath (String) = myns:main_elt;extra=group3 layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_otherns_id layer_documentation (String) = Doc of group3 OGRFeature(_ogr_layers_metadata):18 layer_name (String) = main_elt_group3_group3_elt3_b2 layer_xpath (String) = myns:main_elt/myns:group3_elt3/myns:b2 layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid layer_parent_pkid_name (String) = parent_ogr_pkid OGRFeature(_ogr_layers_metadata):19 layer_name (String) = rec_a layer_xpath (String) = myns:rec_A layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):20 layer_name (String) = rec_b layer_xpath (String) = myns:rec_B layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):21 layer_name (String) = an_abstract_element_in_other_ns_realization1 layer_xpath (String) = otherns:an_abstract_element_in_other_ns_realization1 layer_category (String) = TOP_LEVEL_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):22 layer_name (String) = extension layer_xpath (String) = myns:extension layer_category (String) = NESTED_ELEMENT layer_pkid_name (String) = ogr_pkid OGRFeature(_ogr_layers_metadata):23 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization1 layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):24 layer_name (String) = main_elt_an_abstract_element_abstract_element_realization2 layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):25 layer_name (String) = main_elt_myext_extension_extension layer_category (String) = JUNCTION_TABLE OGRFeature(_ogr_layers_metadata):26 layer_name (String) = main_elt_myext2_extension_extension layer_category (String) = JUNCTION_TABLE Layer name: _ogr_layer_relationships Geometry: None Feature Count: 24 Layer SRS WKT: (unknown) parent_layer: String (0.0) parent_pkid: String (0.0) parent_element_name: String (0.0) child_layer: String (0.0) child_pkid: String (0.0) OGRFeature(_ogr_layer_relationships):0 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = dt_array child_layer (String) = main_elt_dt_array child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):1 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = myint_repeated child_layer (String) = main_elt_myint_repeated child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):2 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = unbounded_sequence_1_dt child_layer (String) = main_elt_unbounded_sequence_1_dt child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):3 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_1_dt_unbounded_subelement child_layer (String) = main_elt_sequence_1_dt_unbounded_subelement child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):4 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_unbounded_dt_1 child_layer (String) = main_elt_sequence_unbounded_dt_1 child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):5 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_sequence_subsequence child_layer (String) = main_elt_sequence_sequence_subsequence child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):6 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_1_unbounded_with_2_subelts child_layer (String) = main_elt_sequence_1_unbounded_with_2_subelts child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):7 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_1_unbounded_non_simplifiable child_layer (String) = main_elt_sequence_1_unbounded_non_simplifiable child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):8 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_unbounded_1_with_2_subelts child_layer (String) = main_elt_sequence_unbounded_1_with_2_subelts child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):9 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = sequence_with_attr_unbounded child_layer (String) = main_elt_sequence_with_attr_unbounded child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):10 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = an_abstract_element_abstract_element_realization1 child_layer (String) = abstract_element_realization1 child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):11 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = an_abstract_element_abstract_element_realization2 child_layer (String) = abstract_element_realization2 child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):12 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = an_abstract_element_in_other_ns_pkid child_layer (String) = an_abstract_element_in_other_ns_realization1 child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):13 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = any_type_repeated child_layer (String) = main_elt_any_type_repeated child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):14 parent_layer (String) = main_elt parent_pkid (String) = otherns_id child_layer (String) = main_elt_group1 child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):15 parent_layer (String) = main_elt parent_pkid (String) = otherns_id child_layer (String) = main_elt_group3 child_pkid (String) = parent_otherns_id OGRFeature(_ogr_layer_relationships):16 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = rec_a_pkid child_layer (String) = rec_a child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):17 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = myext_extension_extension child_layer (String) = extension child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):18 parent_layer (String) = main_elt parent_pkid (String) = otherns_id parent_element_name (String) = myext2_extension_extension child_layer (String) = extension child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):19 parent_layer (String) = main_elt_sequence_sequence_subsequence parent_pkid (String) = ogr_pkid parent_element_name (String) = subelement child_layer (String) = main_elt_sequence_sequence_subsequence_subelement child_pkid (String) = parent_ogr_pkid OGRFeature(_ogr_layer_relationships):20 parent_layer (String) = main_elt_sequence_1_unbounded_non_simplifiable parent_pkid (String) = ogr_pkid child_layer (String) = main_elt_sequence_1_unbounded_non_simplifiable_sequence child_pkid (String) = parent_ogr_pkid OGRFeature(_ogr_layer_relationships):21 parent_layer (String) = main_elt_group3 parent_pkid (String) = ogr_pkid parent_element_name (String) = group3_elt3_b2 child_layer (String) = main_elt_group3_group3_elt3_b2 child_pkid (String) = parent_ogr_pkid OGRFeature(_ogr_layer_relationships):22 parent_layer (String) = rec_a parent_pkid (String) = ogr_pkid parent_element_name (String) = rec_b_pkid child_layer (String) = rec_b child_pkid (String) = ogr_pkid OGRFeature(_ogr_layer_relationships):23 parent_layer (String) = rec_b parent_pkid (String) = ogr_pkid parent_element_name (String) = rec_a_pkid child_layer (String) = rec_a child_pkid (String) = ogr_pkid Layer name: _ogr_other_metadata Geometry: None Feature Count: 6 Layer SRS WKT: (unknown) key: String (0.0) value: String (0.0) OGRFeature(_ogr_other_metadata):0 key (String) = document_filename value (String) = data/gmlas/gmlas_test1.xml OGRFeature(_ogr_other_metadata):1 key (String) = namespace_uri_1 value (String) = http://myns OGRFeature(_ogr_other_metadata):2 key (String) = namespace_location_1 value (String) = data/gmlas/gmlas_test1.xsd OGRFeature(_ogr_other_metadata):3 key (String) = namespace_prefix_1 value (String) = myns OGRFeature(_ogr_other_metadata):4 key (String) = namespace_uri_2 value (String) = http://other_ns OGRFeature(_ogr_other_metadata):5 key (String) = namespace_prefix_2 value (String) = otherns gdalautotest-3.0.4/ogr/data/gmlas/gmlas_composition_compositionPart.xsd0000644003401500001440000000137413614005344026160 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_truncated_xml.xsd0000644003401500001440000000063113614005344023207 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_internal_xlink_href.xml0000644003401500001440000000157613614005344024376 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_recoding.xml0000644003401500001440000000034113614005344022130 0ustar rouaultusers é gdalautotest-3.0.4/ogr/data/gmlas/gmlas_typing_constraints_one_subst_with_repetition.xsd0000644003401500001440000000113313614005344031653 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_any_field_at_end_of_declaration.xsd0000644003401500001440000000064713614005344026642 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gmlas/gmlas_test_targetelement.xml0000644003401500001440000000171613614005344024244 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/testpolyavc/0000755003401500001440000000000013614004466017711 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/0000755003401500001440000000000013614004466022266 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/pat.adf0000644003401500001440000000010013614004466023515 0ustar rouaultusers/ExGLDb_GDFLHJzDHuqJzDHtwJz>Dgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/prj.adf0000644003401500001440000000026713614004466023542 0ustar rouaultusersProjection UTM Zone 13 Datum NAD27 Zunits NO Units METERS Spheroid CLARKE1866 Xshift 0.0000000000 Yshift 0.0000000000 Parameters gdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/cnt.adf0000644003401500001440000000027413614004466023531 0ustar rouaultusers' ^H@JzA)H>]JzBHAJz?HOJzAgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/lab.adf0000644003401500001440000000024413614004466023500 0ustar rouaultusers' RH>PJzBH>PJzBH>PJzBHAJz?HAJz?HAJz?gdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/tol.adf0000644003401500001440000000017013614004466023536 0ustar rouaultusers?QqA =?L/?L/ ?L/ ?L/gdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/pax.adf0000644003401500001440000000020413614004466023526 0ustar rouaultusers' B2(^""gdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/cnx.adf0000644003401500001440000000020413614004466023526 0ustar rouaultusers' B2<HTgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/arc.adf0000644003401500001440000000072413614004466023512 0ustar rouaultusers' H)~JzAH|JzAHBJzAH)~JzAH|JzAH6JzDHtJzAH[JzAH[JzAHBJzAHBJzAHNJz@H[JzAH[JzAHgJz>HJz>HJz>H)~JzAgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/bnd.adf0000644003401500001440000000002013614004466023475 0ustar rouaultusersH|Jz>HtJzDgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/pal.adf0000644003401500001440000000061013614004466023513 0ustar rouaultusers' (H|Jz>HtJzD"H|JzAHtJzD"HJz>HgJzAHBJz@H[JzAgdalautotest-3.0.4/ogr/data/testpolyavc/testpolyavc/arx.adf0000644003401500001440000000023413614004466023533 0ustar rouaultusers' N2Jbgdalautotest-3.0.4/ogr/data/testpolyavc/info/0000755003401500001440000000000013614004466020644 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0000.nit0000644003401500001440000000220013614004466022417 0ustar rouaultusersLANDLICP-ID  XLABEL  YLABEL   SIZE   ANGLE  SZLBL  IFONTF  LABEL 44 gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0000.dat0000644003401500001440000000106013614004466022400 0ustar rouaultusers       gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0001.dat0000644003401500001440000000012013614004466022375 0ustar rouaultusers../testpolyavc/bnd.adf gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0001.nit0000644003401500001440000000110013614004466022416 0ustar rouaultusersXMIN   YMIN   XMAX    YMAX    gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc.dir0000644003401500001440000000355413614004466022120 0ustar rouaultusersLANDLICP.ACODE ARC0000 P  TESTPOLYAVC.BND ARC0001  XX TESTPOLYAVC.PAT ARC0002  XX LANDLICP.PCODE ARC0003 P  TESTPOLYAVC.TIC ARC0004  XX gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0002.nit0000644003401500001440000000110013614004466022417 0ustar rouaultusersAREA   PERIMETER   TESTPOLYAVC#   TESTPOLYAVC-ID   gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0002.dat0000644003401500001440000000012013614004466022376 0ustar rouaultusers../testpolyavc/pat.adf gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0003.dat0000644003401500001440000000024013614004466022402 0ustar rouaultusers?p?x=\)LARGE ??t=\)SMALL gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0004.nit0000644003401500001440000000066013614004466022433 0ustar rouaultusersIDTIC  XTIC   YTIC    gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0003.nit0000644003401500001440000000220013614004466022422 0ustar rouaultusersLANDLICP-ID  XLABEL  YLABEL   SIZE   ANGLE  SZLBL  IFONTF  LABEL 44 gdalautotest-3.0.4/ogr/data/testpolyavc/info/arc0004.dat0000644003401500001440000000012013614004466022400 0ustar rouaultusers../testpolyavc/tic.adf gdalautotest-3.0.4/ogr/data/testfmegml_interleaved.gfs0000644003401500001440000000464413614004466022576 0ustar rouaultusers false Layer1 Layer1 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"]] 2 2.00000 2.00000 49.00000 49.00000 Layer2 Layer2 7 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"]] 2 2.00000 3.00000 49.00000 50.00000 Layer3 Layer3 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"]] 2 2.00000 3.00000 49.00000 50.00000 gdalautotest-3.0.4/ogr/data/test3356.shp0000644003401500001440000000346013614004466017353 0ustar rouaultusers' "le@r D{+e@E<Db"le@r D{+e@E<DiI"le@E<Db e@ D3e@2DDڿe@D#.Ee@֘5DTe@zAD~ e@7Ef Dpe@< D& e@j DAGe@FX De@9l Dqde@kE7 D,e@: De@; D`e@hQ DqQe@p0 D&e@DsIe@k8D_Fe@ͰDcje@s D3{e@W~YDe@3D-e@D ve@~EDHe@TDH qe@B[De@# D3ke@5D_2e@"D3ve@oD e@=D?je@ D̀e@c@D.e@܎_.D&e@;ܳSDJʂ.e@C yDJe@;rDre@TD}De@ESDle@FDfw7e@nDq L]e@/' D;e@9 Dre@j5DUhe@`gCDKie@;TDO xe@u^D6 e@`gDe@)yD e@EDe@PDIe@kuD@oʖe@:LEtDQ$e@8O?hDse@#mfDPs'e@)\\DCe@C (RDJ~#e@PD qe@>=%LD8e@De@݄DI|Ke@De@pD)Re@VD%1R9e@_D!Ze@DR".e@)G:D;Ne@D_Fe@.D#pe@(9D^e@ND]yre@D"le@E<D%e@r DK e@9Rb De@Мd DƋ%fe@5 DWe@}zXD?ne@v~D2ۤe@7 Dqڈe@ݶ De@v~D3ue@ϘDNe@P,DNDge@aDQe@I\DRμe@FDVN1e@oDGe@1(Dx/e@D<|e@D#/e@9D#eUe@S DE8e@'D{+e@s( D%e@r Dgdalautotest-3.0.4/ogr/data/geoconcept_multipolygon_twoparts_second_with_hole.txt0000644003401500001440000000072213614004466030406 0ustar rouaultusers//$DELIMITER "tab" //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 17};{TimeZone: 31} //$FIELDS Class=test;Subclass=test;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields id Private#X Private#Y Private#Graphics -1 test test test 1 1 -10.00 -10.00 3 -10.00 -9.00 -9.00 -9.00 -10.00 -10.00 2 0.00 0.00 4 0.00 1.00 1.00 1.00 1.00 0.00 0.00 0.00 0.10 0.10 3 0.10 0.90 0.90 0.90 0.10 0.10 gdalautotest-3.0.4/ogr/data/asm.dbf0000644003401500001440000000111013614004466016562 0ustar rouaultusers_AMETA_DATAC2CNTRY_NAMEC5SOVEREIGNC5ISO_2_CODECISO_3_CODECGEO_IDN GEO_REGIONCGEO_SUBREGCY_VARIOUSN Data Provider: World Resources Institute American Samoa United States of America AS ASM 16Asia + Pacific South Pacific -9999.0gdalautotest-3.0.4/ogr/data/gjpoint.sbx0000644003401500001440000000004113614004466017517 0ustar rouaultusersDummy file. Not really an index. gdalautotest-3.0.4/ogr/data/mtext-ocs-reduced.dxf0000644003401500001440000001417613614004466021404 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 EEEF1 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 -3 390 4CF 347 4E1 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 541 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $MODEL_SPACE 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 543 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $PAPER_SPACE 340 0 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 542 330 541 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $MODEL_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $MODEL_SPACE 1 0 ENDBLK 5 71 330 541 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 544 330 543 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $PAPER_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $PAPER_SPACE 1 0 ENDBLK 5 6D 330 543 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 TEXT 5 D4267 330 EEEEE 100 AcDbEntity 8 0 100 AcDbText 10 320000.0 20 5815010.0 30 0.0 40 1.0 1 TEXT extrusion omitted, no 11/21/31 100 AcDbText 0 TEXT 5 D4345 330 EEEEE 100 AcDbEntity 8 0 100 AcDbText 10 320000.0 20 5815012.5 30 0.0 40 1.0 1 TEXT extrusion 0,0,1, no 11/21/31 210 0.0 220 0.0 230 1.0 100 AcDbText 0 TEXT 5 D4346 330 EEEEE 100 AcDbEntity 8 0 100 AcDbText 10 320000.0 20 5815015.0 30 0.0 40 1.0 1 TEXT extrusion 0.2,0.4,0.894427191, no 11/21/31 210 0.2 220 0.4 230 0.894427191 100 AcDbText 0 MTEXT 5 620 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMText 10 320000.0 20 5815002.5 30 0.0 40 1.0 41 15.0 46 0.0 71 1 72 5 1 MTEXT extrusion omitted 73 1 44 1.0 1001 ACAD 1000 ACAD_MTEXT_COLUMN_INFO_BEGIN 1070 75 1070 2 1070 79 1070 0 1070 76 1070 1 1070 78 1070 0 1070 48 1040 15.0 1070 49 1040 1.0 1070 50 1070 1 1040 0.0 1000 ACAD_MTEXT_COLUMN_INFO_END 0 MTEXT 5 621 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMText 10 320000.0 20 5815005.0 30 0.0 40 1.0 41 15.0 46 0.0 71 1 72 5 1 MTEXT extrusion 0,0,1 210 0.0 220 0.0 230 1.0 73 1 44 1.0 1001 ACAD 1000 ACAD_MTEXT_COLUMN_INFO_BEGIN 1070 75 1070 2 1070 79 1070 0 1070 76 1070 1 1070 78 1070 0 1070 48 1040 15.0 1070 49 1040 1.0 1070 50 1070 1 1040 0.0 1000 ACAD_MTEXT_COLUMN_INFO_END 0 MTEXT 5 622 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMText 10 320000.0 20 5815007.5 30 0.0 40 1.0 41 60.0 46 0.0 71 1 72 5 1 MTEXT extrusion 0.2,0.4,0.894427191 210 0.2 220 0.4 230 0.894427191 73 1 44 1.0 1001 ACAD 1000 ACAD_MTEXT_COLUMN_INFO_BEGIN 1070 75 1070 2 1070 79 1070 0 1070 76 1070 1 1070 78 1070 0 1070 48 1040 60.0 1070 49 1040 1.0 1070 50 1070 1 1040 0.0 1000 ACAD_MTEXT_COLUMN_INFO_END 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/testopenfilegdb.gdb.zip0000644003401500001440000024754313614004466022010 0ustar rouaultusersPK |ZHtestopenfilegdb.gdb/UT aVaVux PK |ZH0#!testopenfilegdb.gdb/a0000001a.spxUT aVaVux ȱ @1~, cd(urPK |ZHlM!testopenfilegdb.gdb/a00000014.spxUT aVaVux c```aF fbf fbV F(``LD@ GchQ0 F(`FhyPK|ZHڔ3testopenfilegdb.gdb/a00000007.CatRelTypesByUUID.atxUT aVaVux XK! ?9Ev06`6KU٥K* jl`}n?n?_WW?y=|~]Jv0]uĩ,wgP a\Iv2)OsSy[zV Rma4[X݈ylBYA,IҳlAi+3]h4%߲Ht!>LQ/=* QkGjQDH{Bj'#Q`V'}!rv;wAaIUlNiFRщֺPUdu)Z>Yj- t"8Ԃl#RUXdY:)PلdM2go궨[GEe_q&!\e3LǞ}q&麗f.n؅ .\p… /~|?PK|ZHaw(704testopenfilegdb.gdb/a00000005.CatItemTypesByName.atxUT aVaVux ZNP}Q4>4B,-iAoTL/Q+c976!L!"')_B uȧ<#O|f0 `0 ø=O@vFn)xg>oSU _C_F_Sr"PD +9CK+y M GO_E'OGkԓX65T4.V/1eeii +8V9.W/{t{Gr1=X49uzt>ײz[*֓HE_ō:;״)V@V3g/u'mig cs2 .wrr򮚺jq %in/vB{%b;ZEY$JPM[^=CI_e~Ug TYmel/ J=ڢM_(V5e0  ?8 PK |ZH+ H!testopenfilegdb.gdb/a00000015.spxUT aVaVux 1 DD!e5BJπJҥ!vW\y kH뙍r=9x_/PK |ZHpzBt(testopenfilegdb.gdb/a00000027.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZH0 &testopenfilegdb.gdb/a0000001e.gdbtablxUT aVaVux ı !'\pw☁'I;8}Y[PK |ZHt:!testopenfilegdb.gdb/a00000025.spxUT aVaVux ر D XX:8jF5`p#\$h+g=,oij{v:?PK |ZH=u`6+testopenfilegdb.gdb/a0000000a.idx_float.atxUT aVaVux  ƺlR-̀>vv`?"ICE-ꑧ;h?P/{?PK |ZHs׶'g&testopenfilegdb.gdb/a00000012.gdbtableUT aVaVux RMHTQB̙yi?cchF،D9F#-z $ʕ1`D.q!߽JJ.{{_j~YUfA VA!Qp+ah،4I #&A%O!^&J`õ"6zAi½7Ӟ^#̕@^h"9cdj"1&%sda\!> ulj5s/T-ŪKJ=ҽ?^wѮ?buy'"< "؀(% i9aB (ngmp#&͈w@Zs<15hȀc4Eb7)Vw $'w\(=ˣ< +Hk\l~w^Դp"w9zmZNc٢bwg;ț_ɍHa|^ # -3:ΉYGj &0j PK |ZHoH &testopenfilegdb.gdb/a00000004.gdbtablxUT aVaVux 1 AQ&1(]I&I)E,d0abTRfeU&fa2_{,D73rĆM^u᱀,`pl8"0w ]at sjtq!ǻwaЊB"n$seTRJ)RJ)ԟ1}PK|ZH=I&testopenfilegdb.gdb/a00000007.gdbtableUT aVaVux  Lg (E>:d Qg[ hl,^IwC l%F@#f č7E66bPkl4i{yz {7XyoVNZ`A r/:Q6d;Q"5@m(. GcO_=@m -B4 6"z?)B(SGMvgޫqcP}?鳞N> JY ΄|J:V5&L,0>@Ku. C/G:829yd\XVgBsҺ76U*Y"'L,N -B)M<XeH"ާ0ʼn76%Z۾|'t[n8%,,8[@-v0w[:]N#JWu\b;NR v1Iriޘuw3ds+D5GMȩ|TJi`vǪ,tЙaʎG/"?v(dF%tY4U`QӤWÒ&%)8aU0R2H=yDeM֌6û16"$  e vw8%#ǶX+]&D_G`ZF9HV #ѕfƾ#՝喏^q[*,L2B[EZ¨5k)&THـ.{gx5K֗ueB=~xZ{7Vr_3q S[^R Ov-@ uӢᙄ&ٰ_jژ{.*@BNڒ.qp/|UFj\yP?vTz+(|lO/ *h$.qxߊYC<#ME^IJV}prLHOZ.a6~(= /PK |ZH\55 &testopenfilegdb.gdb/a00000010.gdbtablxUT aVaVux  D3dAv Vfֈ(}WΨ9_yן~PK |ZHɐ &testopenfilegdb.gdb/a00000001.gdbtablxUT aVaVux !@D]t=xDL/@8izBzA +j_-̧&8mfٶ63"Lg0%`O B20Ra %7x@C (`% ИRJ)RJ)RPK |ZHk| t& &testopenfilegdb.gdb/a00000026.gdbtablxUT aVaVux  SS;۬V PK|ZH¢ &testopenfilegdb.gdb/a00000002.gdbtablxUT aVaVux ͽ PFObim-:.a #.vb'Ik#w ؟|poRb `mk0+_(+|` P (XBgh,F?PK |ZHb*testopenfilegdb.gdb/a00000006.FDO_UUID.atxUT aVaVux Xٮd763L7$cc ^৮N'it6Ev?_o_% xx x ||>SI)G,:m]e V bF2O=vTwB;%ܪfby5W!`a'ݣњjrprc^[#R+F8O:JG+6^6 ٹv]}sԳ*7=uP§ιik{1vQ%V{V"Κ]$pNdԢfy: *^̯vu!wTڇdEVV<ɜeK]6: Bkjj jF9c Wڃi8e+TɤSQKWG6tk,l ^9C6ydCcm|آ*.X#V>4]֞Pd…UsiK]FsPX;[B$FԴnyK*_:%!ZNbq5:z!c)Ot+ߝDBq_o˂SՃD7f%(hqUhLj$M\s .qFt^;X1 VN]VR= fXvi9f4sj\-1(IaY( W+b8GaqKUG:ۂwC;ݪԼ4'D\׸X1LZbL>2ya̹(l-ٌb_+h⨍" (NM920i6/Vb6Z@ sZZq`F:VWUCD5z xjA}D˞#G<x>b\PK|ZH"B| &testopenfilegdb.gdb/a00000005.gdbtablxUT aVaVux ͡ `E῔b@baa (; QH T"x'a9/O)e*V.Jn[8@=|`37a:p;8ްy GE 쿲 PK |ZH*08testopenfilegdb.gdb/a00000004.CatItemsByPhysicalName.atxUT aVaVux NPE"хs-8BbX,bX,dϿ>@mR%dS*Y#g̓?jh>\C(!@^?;+%V>GM; $Z'{4̼ PK |ZHbk:&testopenfilegdb.gdb/a00000011.gdbtableUT aVaVux RKKQ=;Itt!܆D:#]׏nĐԹ( ͈R.Laq${YK`Gm@#s!]omb.'ȧ\d gq[0)ܨ?ħf1/QADڢ+gla.6ʶ'S,v?'q3|z|ꋵ-ݍ%:9q-WǾK멸^_?-/a  f٣ܸo/ 4K ח kybM&Բx-VsRX ;ӔaVȊ] i3i(pk}%m{';FG[Wm藑ۉԯha(X[<9 D _Vho'_{µ FT̪+X7pPK |ZH &testopenfilegdb.gdb/a00000020.gdbtablxUT aVaVux cf@VLPK |ZH0.o"&testopenfilegdb.gdb/a0000002d.gdbtableUT aVaVux NQE* B4 IF0D!> cek XVPྗK0F>=97xzJ8˱DrdD mv M:嵨S%‌ؗgЧEUee`ERoH#] 7|9l='\U ,+4Cn+K93jcOw/X#M_3cIuMx4ǩN4b<=ƟTYݜ ?^=K]RmZ@UeK*{}x|7PK |ZHQ/testopenfilegdb.gdb/a00000006.CatRelsByType.atxUT aVaVux ط0Fa{}DKfuRwHwR^E!( h衏a aXa a]-r]6:u؛wYJVwWJ$I$;=_/PK |ZHn(W5 &testopenfilegdb.gdb/a00000016.gdbtablxUT aVaVux  AH!,2 -QE4#~GDgʼ=*~[<0)My*Sԧ1iM{:ӕe CN<[KP2T 5CЂ6t E?1c͉4&s!Sk,ndXƭnVxl^-C> v?y)@JP Tuh@ZІt %s(HQJRT&uiHSZҖdҝg0ɜY\ĥ\ɵ\lrYmacyymۼG|ʗ|wįOM )JIRԤ. iJKґLӛ f8SU QRըE=ьVMn0! 1yLb.*q=s,as'kX˓3g/q]rA!QrTG#ъvt"aC͌3g"+f1c'{EQ(((NaoPK |ZH{C(ne&testopenfilegdb.gdb/a00000026.gdbtableUT aVaVux cf```/@R g X<\ؕ݁,wg`h%(+!ц  &@P_J{M  TRM19g bF`y= m 3Bc 2u& umC*13d2$3dM6RTuo*C:T=B!`Ah 3 0?=fwv@ÖlgKI0b( %4PZLPA'/`8 n6{k9=/cÕr78r&wÅ5 ĊW7\蜸Yag`bß;>4̼ PK |ZH9 &testopenfilegdb.gdb/a0000001c.gdbtablxUT aVaVux u{]׸lZY(dDY]eVV(d],BF"Tf"ߗsLmLD{`L,:l%A"=(hᘀX ؅#8+h8tA*l^Y@dT@JdE~DeA3Cw "c.6EFTE=D'0,؉8I-4r(G 7cLX؃ף:Ȃ|(JxM6@t,Z|+.$LQ^C tD/ ŧ ;p7"IȅgQ/!]G%6a7~H4 3FqTDm4[1 Ӱk ~/8[ Hl("^耞q%Xp/) ؀]83{I!bQ5q)U؂8"?J2ڡ;a f` qqi?@aAUCKtBo xAXXXXXXXXXXXXc!PK |ZH& &testopenfilegdb.gdb/a00000022.gdbtablxUT aVaVux  Uoz6! L3۬V PK |ZHJD&testopenfilegdb.gdb/a0000001a.gdbtableUT aVaVux R;K#Q=]OǮ >MK`"5.VV,/p`f;+ ;Wl,x; be{{;7Ria0(ذ;zA )̡0COlC?ܙ oJ}#J ^Fe\Pջi?3 <̓L=v<~E(&) >DzEFHi\UsܭmOZp_FƏϞxlp&VSfZuz'8181ump&aw`C!Nk"1uƦe5CbS16J2J$',OVg(a6Ȋ *w6ɌbqXF ;ENgϯHi:{.޷p',8tzkҙZEPK |ZH/N1 &testopenfilegdb.gdb/a0000001b.gdbtablxUT aVaVux  S C; ;0#"ZvϽ#7kvj/[PK |ZHpzBt(testopenfilegdb.gdb/a00000016.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK|ZHBPT?testopenfilegdb.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxUT aVaVux 혹0 @+xTIIO-IRb0g ¾qm.~K?c)~{S*}s^g=VW[`pjS]+.аn]"S){8˞cޞ(q{*gp}lϊGf"^<*6,YkFќ0ABQc` #@N!s+ V> L5{,[SY=u a+GXr`x{RzZk XbYiͭDWZv=!1\%\5-=<# au%XS8?L2QtPZJ*#/x+^ꏯft9((J;7X\kqTjҗj <2eCRϮn]drTIѵLQ qq+'~oPK |ZHKptestopenfilegdb.gdb/gdbUT aVaVux ޭPK |ZHfD^'/`8 ^6{kJmrUGNfPK|ZHݦr((testopenfilegdb.gdb/a00000005.gdbindexesUT aVaVux ca``b7x NbbHeHf(a10@1兀ؙ!/20T2Y N@V(BT21$ FK0!(Wea2&[!7r0[Wј旙߿?:A<<9o&VR.jpH߾KHbq$jy|[f;?dJף栲/iJO'#EfHHC(W4[zfV4T[/PK |ZHt:!testopenfilegdb.gdb/a00000029.spxUT aVaVux ر D XX:8jF5`p#\$h+g=,oij{v:?PK |ZHt:!testopenfilegdb.gdb/a0000002c.spxUT aVaVux ر D XX:8jF5`p#\$h+g=,oij{v:?PK |ZHыmd&testopenfilegdb.gdb/a00000024.gdbtableUT aVaVux cf```/@R gL X<\ؕ݁,wg`h%(+!ц  &@P_J{M  TRM19g bF`y= m 3Bc 2u& umC*13d2$3dM6RTuo*C:T=B!`Ah 3 0?=fwv@ÖlgKI0b( %4PZLPA'/`8 n6{k)g'p /pag>b :'noXp,N, 3oiPK |ZHnb- &testopenfilegdb.gdb/a00000003.gdbtablxUT aVaVux  X]yL*dFDld3uV95gګ\PK |ZHpzBt(testopenfilegdb.gdb/a00000017.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZH& &testopenfilegdb.gdb/a00000029.gdbtablxUT aVaVux  Uoz6! L3۬V PK |ZH1*3(testopenfilegdb.gdb/a00000009.idx_id.atxUT aVaVux  C/KA  Hn{%w  PK |ZHpzBt(testopenfilegdb.gdb/a00000015.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHpzBt(testopenfilegdb.gdb/a00000018.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZH+ H!testopenfilegdb.gdb/a0000000e.spxUT aVaVux 1 DD!e5BJπJҥ!vW\y kH뙍r=9x_/PK |ZH& &testopenfilegdb.gdb/a0000002b.gdbtablxUT aVaVux  Uoz6! L3۬V PK |ZHpzBt(testopenfilegdb.gdb/a0000001b.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK|ZH`34testopenfilegdb.gdb/a00000005.CatItemTypesByUUID.atxUT aVaVux XI+7 <ʎ$R$R$!&P ,UE~z  x|~~>>>>>~~uճ6) C6DU侴$}g5hU)qĻiIRir~=p}7&W6E|=GE{;w1kQ_#xڈ2|T(q\yZddt1*ZD&Ƣ J 8sSD_gեs8Zp]VD1VXD_uhIvYX`u!.as>riWUh/aO䵠6rh {2vč~x],N2jp n#+cM i/d)S+RC}Yƪ[8uu]wu]wϿſPK |ZHI~2 &testopenfilegdb.gdb/a0000000a.gdbtablxUT aVaVux  2hT,wݧy垞j~PK |ZH0#!testopenfilegdb.gdb/a00000019.spxUT aVaVux ȱ @1~, cd(urPK |ZH\`8testopenfilegdb.gdb/a00000006.CatRelsByDestinationID.atxUT aVaVux X׎e9ٜs ~4T}˳߰HutS2P}xxxxxxx xx x x| ||| |X KY4:-Wwٞ-DP[<-&Ok3Lg[ U>'.,Ӭ GRY+v,-+${XhRiխ֌!܅FF9}x,;q)yBG[ZfdM'uSڳ=ck5.kr:@`iPo mejiA0. GGI<"ȍR՜,O}1kB/=;jBzc⍣N4e BhacP C;^ z&nNTNYيDgq+]3h4s/۴kRDddKfcEC/:Jv9su*(a}Ԓf& ּʏIQZ?&J`|NX^k.hT&,nNfVa;Fё1'u \8ԋJ~smrT͖c6W} %4k)vmP6/nq͊T˸g-ڶl`== yQ9k[ӣ62rk>/7`̾W岂3mӜ v3G"tY]17L,^j07*ʠ>nEXz*z50!VkfvLHk>Ro;)G(p빪 MtP=p՞'U`MHlҹv7 wx{8[N=qLKmz2aIaSэ&9999/PK |ZH8Gp(testopenfilegdb.gdb/a0000001c.gdbindexesUT aVaVux cb``b7x vbbpepfa10@1A ) @E 9@&bb8PK |ZHةE!testopenfilegdb.gdb/a00000018.spxUT aVaVux  0DщFO@KIM&? l$j[^noqzh5/{M+PK |ZHl5 &testopenfilegdb.gdb/a00000015.gdbtablxUT aVaVux  A3ťGt-QE4#~GDg|=̬uPK |ZHK;4&testopenfilegdb.gdb/a0000000c.gdbtableUT aVaVux RMHTQ޻M{Bԙyi?OЄ uHͲm#H(B0@D*n\\h̦0};(R]=+}u,@#я$&c(G 7Ѥ)\'m]  2q$r/ه:FޫDIpQDVs-򭴗ѓI23A}8汄[+Y&gCĿɛ+o/PK |ZHpzBt(testopenfilegdb.gdb/a00000012.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHDA &testopenfilegdb.gdb/a0000001f.gdbtablxUT aVaVux A PDn bX 1ELp̅[k6צښ'gr'Pْ#'~PK |ZH+&testopenfilegdb.gdb/a00000016.gdbtableUT aVaVux RMHTQ޻4ZL BGPgl,MѠ&ԉ4i,#("ZBPACx f6Eƅ0~;5\̽swsOlq_#P9n r5A$%.p0nB dcHiXQuRܽx'Iza^D;ǹr9;X11Yg_Yxu+{LYG(A;1aZb𙺞GL <xG5y\G3\yi :AsbM1 Ql"O؜"X2$'o\g(̫g <"+죠xw[k=kwAٗ [m[kws^i7+ b6BalsR)gT l==m2-VuBVwBhZy/ɊSb7Pe0omцQmцPK|ZHY%<testopenfilegdb.gdb/a00000007.CatRelTypesByBackwardLabel.atxUT aVaVux An0E?-Z|*.RCX(e.1'=䧱ƨCSwTz3BRCOp&BPHKò m_2Q"!dsΖ8Vc*e |hLڊm]RɊ\ WmO9W\y^٫$:h,yc`'Bz?[|w:_5җ˞`}^giߕ7 l8_~VT:ZӋdm0_hѢE NPK |ZHk| t& &testopenfilegdb.gdb/a0000002a.gdbtablxUT aVaVux  SS;۬V PK|ZHZ< &testopenfilegdb.gdb/a00000002.gdbtableUT aVaVux Un05BRѡѩTIti2%4%x'^Gx NJQ{νk6y)>X-Kc6;٣epH(/hQ!BUV])e9:R[ѥ/| b{q!: ɓ7o0Qt俄yXz:f0[ة!3KmefYWc8 ~b5'Q޽ aNꚡl tsOekoPK[=~}ƊJsAe i\R̈hr'U,\"u\N.*cdHj,;E bݿ.TaPUG5y$BV`Fi|_UPLjޯ˞\ ǿA)XfЅ)OțB LXG܈D2z|(J\O PK |ZHlL &testopenfilegdb.gdb/a0000001d.gdbtablxUT aVaVux ˱ 0 Qe6`** ,O%׈()7FwrI#/YA.fv$I$I+}PK|ZHdZ(testopenfilegdb.gdb/a00000007.gdbindexesUT aVaVux ] @EOCE=VgL #-+L~]WȰr:{̺[R س!$a,:RVnH4bL9w.89W%{:5>1;I|"?zm\%3*iV>Y{7cL Z/o\ZQ&CKPK|ZH-YW &testopenfilegdb.gdb/a00000007.gdbtablxUT aVaVux ; @D]_I4c;PLNIAqO27yK!uZ>VvB91)3dN˙q6^PK |ZHFQ z&testopenfilegdb.gdb/a0000000f.gdbtableUT aVaVux ROSQ=w0]ACb1 I!,jcjq`"qR0ӄĭ .`b"r}zo}{W۞\0;ԎC1p p[CF1ҸvcM&-E"tb'3GR#OA>L1^'JaO]FWB7c!X;LK!pwyI'M^#p4sfSq >cca{ 7J]׸rvgy'/l$J'ؑQ\/58sl`9bKb,&ꀜfH }N@͒X|T<.!EMi,K/~Hw i/;O~Gʕ/Z\Cx՛6OGW zBbqrscGUE[ 5/MDw՝>ﻨ@`,L8ԌǛ" ٵPK |ZHv2&testopenfilegdb.gdb/a00000015.gdbtableUT aVaVux RKhSA=y..\HqQjS'5BlH )Ij6b+JAERJ TDR)](h%. y,2ޜs=}O`}9XUePD] 3!E hU1\N`80=m12a%3v+E&{,4B8C+ < J;ς! gԌS=&;"iUo`0sdnWɳj9}-ױƑT9?X췫;hoDo-ppDQ1X.B6/g0Dy-^ M+ 4fxG]-<Ӹ sؤ i$0ɡ6DDt _?mc!yz$6tK S{ҊT^RP?l>Hz ygo_<$~b}tjˋ_ZsM#c]rownw韑H~nk)=YluR:jt:[ZW7|FWh wPK |ZHߥc"-testopenfilegdb.gdb/a0000000a.idx_nullint.atxUT aVaVux  @A+Y<W9PK |ZHpzBt(testopenfilegdb.gdb/a0000002a.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHOE#2 &testopenfilegdb.gdb/a00000012.gdbtablxUT aVaVux  2 @NhT,wݧ==7kȭ T6PK|ZHӰ 6(testopenfilegdb.gdb/a00000004.gdbindexesUT aVaVux u @F`d!tcvAB7>}[.gYfNd8q On\8*&Ok([.SR|l7:Ysԛ#k ;zRF*16xb˨Ciɵv?OPK |ZH9IF)testopenfilegdb.gdb/a0000000a.idx_str.atxUT aVaVux ػ =،X-b J;]ʭ-I`dn~JSTM_M}/ PK|ZH3 )&testopenfilegdb.gdb/a00000005.gdbtableUT aVaVux cf``P8 fe@lZɳ ß!!!!%!Rc `Hd(ad(a,~@\{ d]]Wݩ{m hų$5Wȷ|*UĵYe5礤i|0~ju#(8(9y4v=ژ^%$8DZߪ^fI9|Q\]/sHfP]+&ysh}0]cRqIQbrIHbRN1Plۢqn7G1]PPjNbIf~^qFfsNbqPgaq;N,;kwKM,)-JUz'x論q=TS@#螚ZRZR_ AeioUKxuqWs8 HH9 nI5zO_nf~B!Լpɀ(L_UWy{&C촭%S/ -'"2.(ˮ{ȮkwS'bļt`NBN۬Goa42_krOIMQK)iPK |ZH{+B(testopenfilegdb.gdb/a0000001e.gdbindexesUT aVaVux cd``b7x vbbpepfa10@1PK |ZH0#!testopenfilegdb.gdb/a0000001d.spxUT aVaVux ȱ @1~, cd(urPK |ZHO &testopenfilegdb.gdb/a00000006.gdbtableUT aVaVux u 4[𯌥)[h̐z!3=d Ed #bTJDeh敲xixP=7y|ιw=wU LUTE͞ziO iP0BQ"Cb&b e1|GTЩ AV w*pAadIPe~ Ej}9:Y_*4P^]=DQMj|a d{tU4Oe(//V WsL *¸n $ m!WZz][3|2<]o)C%Vjm@])7&Kꂁ][Js.vsHp(n&py5*n-o Anp6-btH, vcP\X[)t5 H1j<;~1#Mt@x9 Ж?6O_N.BxA;U۩0CFheH sEbxb,". ںs^¡č+ZqYYlj¢3,{p(sVsAռq1{\Mx/d[dH]C#ԉ9H)O֗bª%3eԠ#Ъ-EͿ굃CVN鮊o!?A_\ ywdtI8ݰ!&OE!`P (S>+eJjb{ڄ.B(l+50λu{ҟ\~¾cݐz7H4Spг:KF6*$cPjpVe-Y^&;rG5i_m#;j=53꘏a5VKV/v|o\O FI\#;ݸnphxEMهNy/:4h j{gyV …S6w |hӧf bD;^FGh3ZxBv_CmlCx ÷Y~X u|NP,=RxDaPÆE^̺p;1߳4h?y]{ [)[$+"9 Mi['l_ RkA4j41qWBph(AH=͝?3=6:FD]f1CY K$_Fka^ {־_hz hU|BêdA RWe6cy)Y-p%J=W/rmMλ0.& q1pHL˥ Mha;p`(vޱ(^WvoK9OݝűV"8t-ZOqBۜ퉌_'߽  cwEMrigRY:A+πPu߮5oZV)=wrz)kPK |ZH5 &testopenfilegdb.gdb/a0000000e.gdbtablxUT aVaVux  A#ťG9t-QE4#~GDgʼ=*X11Yg_Yxu+{LYG(A;1aZb𙺞GL <xG5y\G3\yi :AsbM1 Ql"O؜"X2$'o\g(̫g <"+죠xw[k=kwAٗ [m[kws^i7+ b6BalsR)gT l==m2-VuBVwBhZy/ɊSb7Pe0omцQmцPK |ZH2W*testopenfilegdb.gdb/a0000000a.idx_guid.atxUT aVaVux ع 05G+d+M!zg D0Oș#[D$%Ԗ=:Uݴ]?hYu5K_OqWw_PK |ZHpzBt(testopenfilegdb.gdb/a00000029.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZH0#!testopenfilegdb.gdb/a0000001b.spxUT aVaVux ȱ @1~, cd(urPK |ZHlM!testopenfilegdb.gdb/a0000000d.spxUT aVaVux c```aF fbf fbV F(``LD@ GchQ0 F(`FhyPK |ZH'2!testopenfilegdb.gdb/a00000011.spxUT aVaVux  DD,ʅ` {/l|Zիz;pڿ/PK |ZHpzBt(testopenfilegdb.gdb/a0000001a.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHlM!testopenfilegdb.gdb/a00000013.spxUT aVaVux c```aF fbf fbV F(``LD@ GchQ0 F(`FhyPK |ZH5 &testopenfilegdb.gdb/a00000018.gdbtablxUT aVaVux  D3bR%fIyUx [#d4Ys=D9m PK|ZHA&testopenfilegdb.gdb/a00000009.gdbtableUT aVaVux cf```;@ʀ3 g1x8\B<\f01e2YXJr32$2a&CP i`ML@>KC*X3P6h0H.F %l+spBV$@+8X YŎ}A~ +?{-BKv yPf"gև{B&aV}mag"3% 1Q8fB]Xe(PK |ZH0#!testopenfilegdb.gdb/a00000020.spxUT aVaVux ȱ @1~, cd(urPK|ZH0#!testopenfilegdb.gdb/a00000004.spxUT aVaVux ȱ @1~, cd(urPK |ZHt:!testopenfilegdb.gdb/a00000024.spxUT aVaVux ر D XX:8jF5`p#\$h+g=,oij{v:?PK |ZHpzBt(testopenfilegdb.gdb/a0000001d.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHpzBt(testopenfilegdb.gdb/a00000014.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHѦm&testopenfilegdb.gdb/a0000002a.gdbtableUT aVaVux uQ=KBQ~WACmN "~ᒖ& R)} -DA84PCRBBRzιGs}{{uOzkb⨊EJ[` i0 0Z^Q"c@'"|3ziΑ%xaG n漲"1%n'LP=n"vUKeTϪ=}ᓽE_qs>0[Wј旙߿?:A<<9o&VR.jpH߾KHbq$jy|[f;?dJף栲/iJO'#EfHHC(W4[zfV4T[/PK |ZH+&testopenfilegdb.gdb/a00000017.gdbtableUT aVaVux RMHTQ޻4ZL BGPgl,MѠ&ԉ4i,#("ZBPACx f6Eƅ0~;5\̽swsOlq_#P9n r5A$%.p0nB dcHiXQuRܽx'Iza^D;ǹr9;[+Y&gCĿɛ+o/PK |ZH&(testopenfilegdb.gdb/a0000000a.gdbindexesUT aVaVux m `E^ꦠC"(+mqlO F,f&zQ;z+YJv,l+a_oA۹.\ @݂DQρTτy Sb#ܩᬦn%2o;?ִ߿V٦sboQVPK |ZHdc d&testopenfilegdb.gdb/a00000018.gdbtableUT aVaVux SMHaؖBaCc6CM$dirF!:PARt^$uP!PËa}KaЭ=y;߄bq[FGzhE \vF]hGq֎q~4$BƓ *mAAn!J`#סc-d$}d&gQ7-dp %sd%>a7!sN3r+ZОt3[eze˪υwHυ@(]|w p  ©)J)4F;YGp I\PQr(ٱ8%\P&I,zi~d̵!܄VsXWs$'p/tOr&d*$lyúO[sXяE8La}e_s0ퟛ,ܖ%ۓM cp7} ȯ{y* wT6^VH/WEzJ_PK |ZH+ H!testopenfilegdb.gdb/a0000000f.spxUT aVaVux 1 DD!e5BJπJҥ!vW\y kH뙍r=9x_/PK|ZHO;testopenfilegdb.gdb/a00000007.CatRelTypesByForwardLabel.atxUT aVaVux Mn0B[~໴E. T.zqCe<"m)p ?&m~ϸ{:WD[ވx]"_j }0J!t&;,?*d~ PK |ZHc.rB9.testopenfilegdb.gdb/a0000000a.idx_smallint.atxUT aVaVux ر Du/_DM-l#\IԴY#%RS0v۹`PK |ZHL5&testopenfilegdb.gdb/a0000000a.gdbtableUT aVaVux RKK[A=ut!2`RK%.R8  +pf&*{j𻌪LvF3л!|ԋA@ ѿ5X$aPl CY8^ 'M(:Oqb$ ׂj-`Z2LQS:XSUcVMc$3ŝMzT4Okˬ2NSm˕I\QU6sBfuXCMbu=WQ\bjPdPNPGMyܺ:.e ׶֖1Mm/[)Sa{:eO1uO]#iid2Lh>]/+x7IxއB`>/=8KI_gɡi|I~O{&!lxׅeˏI)u1ʓ"{$*b3`-J w;P.&4ϹlR;d2x{>gex%w GzY?gI|L^ϹS3_,|_(]G—'Y<򿒿Οԩg~ӓǙw&d2^ $`U+PK |ZHo7)2 &testopenfilegdb.gdb/a0000000f.gdbtablxUT aVaVux  2@hT,wݧ==7kȭ T6PK |ZH/N1 &testopenfilegdb.gdb/a00000019.gdbtablxUT aVaVux  S C; ;0#"ZvϽ#7kvj/[PK |ZHЌ-i&testopenfilegdb.gdb/a00000004.gdbtableUT aVaVux  t՝'??I ,=IzږDd[d K&`{l IHI[$JeY. ,p=nRHJ<]X($BR HyH3zqlŏ9fϝ_s~33YH~cRFY..Wf0ɬgdX1603UUL2ktĄIS@je|L_QbI}|LT.R#AJ5/(> K^9-LS cfeB| xhtɀLcOXH\/y#Ybf3M_ФFVYR_Xb"d?ވ͒H܍ 5)(p 42Ӛ+dF2R,Z12R|NfC>1if\L i|lFԒ5ZhHN"դLG[LZn#m:Hh#(B5>&6rL/Gi~ dza~c#eziټ 2uuUfab+]Oԟtw-ON_!W}rO-Z>~b49{_nzo{鵡OeZ3|e79 #_{YAKw9?_En8W\?3W"WEþnxmen2g*``6e*M|e힦%%&5|]fX,T޸qcCAu jsVk5UJi?ePOh5[r|\7+o5F$6kYxpKG]Y_2B}._kR+WV_U@O嬃aQlAɝxn,Cݾe&ujdʶMX( ,A8펑O.q!MsyϑR >#&gX/;|W"g@ޤNY\!u>a?H-(1D} 9{{x;9q{ZvndxRϾi.ǪZ/bb&i%Ԛkj%ZaVk-1u%Md0XJ6Yx%5i0l/&]=Y)L3}85n|ʪ3,*3_KW:6_>Ǎ{-m6dS]=Q7A?Q@k(GAL ɖvڸFHN0͐H4IӏQɕxݗMyrHNMuԵ" \lVVtg&#cpf WHD'"cKh``̔'㋱c wr۳[fA{rH "& S΅ 9\'`cvQ ĸC[]mu^M".WQf["3 wلLԍ3)vx]!Ѓ_##FknїїCқ&_4J\H_?\~MU},{\Y< /~ʟT.EA8D \N[gWX -fSAM?gBP nh pM4 Ljek&$wZkuKuZ3oi4Xkh4FMuSmAWcFqȃ: ʨ#DCL~iMJ6#18NEag>rM*SP3jHF|bB`b/c{l/ CH9b{S46Ufѽ׵ݥ3*[̞vJjqJF_kk4uu*]u|5ul+i9²FwbMfVrH[ktں:ljR%g4Ku)u)uk:ijTI;cZ3NNO(Fxc3S\FJ׊MQ-~IUJY3}2ϓ_ɐB?3N+zpϯ`^pTU0U-N/RCCѓI柦|F2qJvTbSev=7toT_ Õi~৫ptϦÐv*.KvY5uZC1)릲6QhfRZ9tH]$fP!>>>*MKHq.KS[Gi9/ b~8KgybĔ&r`Se@i5)))))))))))))))HةCe&h?TᒲXyrڅ> =x+Fl]vsě,d(tdqTGN+ŽI>Gh̑yo\r?>g~ژw"S&> pC#,nY)Q.ZnOyW.ۛ!Z/*+Ok6>>>>>>>>>>>>>&<<p rLY&^/PKnz{}*_.L_03U^*?d8GuHҚGZ :Jh4n7=7RM55~LGZD19 HiO}L+% }]p. ;"s)T%T9ϛu# ʩUtttttttttttttttttttG zd݆-v#y mJ: E^&] Nh&kh` + V0Xa` + V0Xa`n6W7궋;+|Klz j)_Eԫ`fkn55$ƫV+W8p^y +W8p^y +q^u-U/?ڰ(m,}-E.C"Erk/Du>]V-\VpYe .+\VpYe .\V궰&XX'q~ =o}dWM7,L{0gƸP`{nOn /@OMSt<nO=v{Oq7E{4B}yS*v˲~pj+9*OXXXXXXXXXXXXXXXX Xu$ UUUُ})/tqGWnVVVSe_q@?\3r4l/5}5KzvoIcy*?[`)ðo[jJU*&lU :Ξz :aɪS 7v]-g]/'iuLa:P]§,TI&j,ot4tdw4ԏg"Y=6͡~cԬڔI@@.rn9~}ݴ%LLg sZS0 qvp0l|XX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X؇ y_vTXŞa[mbbbb'+}7sH}k\ъힷ|~%W 秓.~Ht%ޮkS>;4ە7lʫ$wtxU[vAןuby- tՖl%r1ߖJdo'K{r8ʀ|5[o ~+V[o ~+V#[BVح[e:n]oYpy鴇ȉ߼Lck }!-ش|a‡ >,|Xa‡ >,|Xa‡|4z/"h}톴J3c%ҽ <-r1VlkfUNU ȧj v+Vح[an v+Vح[an hfq 5n_}M}C:/B;]70g]^K* w}We8!^{ +Wx^{ +Wx^W] ub9++e;׮XpAk?v^ Rn ty꩞⩞$)Y9t͍bmSўx'G{ўў"@nxUK-l0۔ }VӑeޔJJsՔteTLɪN ::d:Zd}3NVuN:r<?M.^7W1cwžBd҃DHwqr0K;._]aDZWWWWWWWWWWWWWWWP0LS87dW=XW\֍?0/8D~rZ)Vl峔`iaT:y-±qUӝq`+0 飃Ŝ<)8)D1z$BLQDA"D"b".yԴ۹F.tZC1fu!9 RchэȌY›q =o}dWM7,͸q'riuz} /@uwͅ[GuT²wiQj፾7;o2x|M]}LyzCzܙzRS38\-\jt]>/L}{wÍ}lƝ,yHpAпWhßk{玜6NeE*JӏB-yPuz~TtQʦ[~~S})Ċe`+st%aAz=w(VC|k M'hۜ4CJ;gyӂ(?57@!{Z j?;oݯ.~,EғE.(&Tϰ!V<x5,1\OH\~wF{/<崀Kڳ9X,)xě,404\HK0*E1 !E͇w[aX?Ax4 KEJsx7tnScz[v;s(Vv{^oI+o|)ģBzk5x8g\w Xq! Uʹ`b3 k xeIN0,OA)}a;Ȋ *˛U6=ZmոQs՗?ҹ_fqv{o?of#:;!_cN,1X:st֠PK |ZHpzBt(testopenfilegdb.gdb/a0000000f.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHpzBt(testopenfilegdb.gdb/a00000028.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK|ZH)!*(testopenfilegdb.gdb/a00000003.gdbindexesUT aVaVux cd```b7xO 3I& PK |ZHt:!testopenfilegdb.gdb/a0000002b.spxUT aVaVux ر D XX:8jF5`p#\$h+g=,oij{v:?PK |ZH(T 2 &testopenfilegdb.gdb/a00000011.gdbtablxUT aVaVux  2 C hT,wݧy垞j~PK |ZHA ^Ah(testopenfilegdb.gdb/a00000009.gdbindexesUT aVaVux cb``b7x vbbpepfa10@1ـ8!D3001#PK |ZH1*3(testopenfilegdb.gdb/a0000000a.idx_id.atxUT aVaVux  C/KA  Hn{%w  PK|ZH˖Pn(testopenfilegdb.gdb/a00000001.gdbindexesUT aVaVux cb```b7xO 3I& qC"CCC*C1C% A10tpЬpW  M8PK |ZH& &testopenfilegdb.gdb/a00000025.gdbtablxUT aVaVux  Uoz6! L3۬V PK |ZHi5c&testopenfilegdb.gdb/a0000001e.gdbtableUT aVaVux cf```be( PZJY@ Fgpbbpepfadpa``cav{,PK |ZHq%l*testopenfilegdb.gdb/a00000004.FDO_UUID.atxUT aVaVux XGn-6 tzdE@"HQ2|"Go,3C_/ +M;]O U'u3{KmGWCs75c=#S-[= |t]X"^ёtl VvaNeuedkWM*67Qw 5PٸQfN_*mN~޸ yDm"t8XT&ևݜFAFͬ Ʀ#S9u#0;I]D"|]Zh`HΘM/#j|V3Z5M6\[fEeܳ\[H{b IJ=o_1*V2vq>N5=m3M!67^ٓ1^g δMs*q`Cw ͂ !7ga9z ?{ 9BiYT5YbinaGԮi-ç՛#^PW4ɉɠǠ0gPy}ք6+-nw aG2b'^txoaO&2,1s=s=s=s=W_PK |ZHBL\d&testopenfilegdb.gdb/a00000029.gdbtableUT aVaVux cf```'@R g, L   J@?;3C0C4dhCK  PgC(/X U@=ŦΌ3z @1#61R :@fM!22&Me7!h c {AnCmecRΞus~@;;?aKr%ߤ{̀|N 8& g@to@~ ]→S^a w. +d @`pN s!fPK |ZHlM!testopenfilegdb.gdb/a00000012.spxUT aVaVux c```aF fbf fbV F(``LD@ GchQ0 F(`FhyPK |ZHS&testopenfilegdb.gdb/a0000000e.gdbtableUT aVaVux RMHTQ NEh!.%l&4arpF"dlflBP=ZU6hAb\!f 7Z-4fB{ȝ9|;yKz ڗq( +A#k 7@k#h8nҒF H`ILJS}#ԽN׉(. +lG"*NĻwdn5TOng#qrRQ ?cR¬c-xUmo kuq*~?;CPpFr"WGOg_#=8DI1$7ZI(85%Z !fflnahlgcdigdjnddljf 4(55<39CI@ V'3hnj:P,dhnbjldidjhiib : L79Y? o.~ݟ/&Q0?=KУty9cxQj'# 3g3'] sK]CC#]GGgG]g7Gccg#Z}"h얡-PK |ZHpzBt(testopenfilegdb.gdb/a00000011.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHKۅ!testopenfilegdb.gdb/a0000001f.spxUT aVaVux 1 0Nvty ?$OݧZ Q0r 툈3>$+}c;{:{ջ1ܘ1Jnqw9 _GOI?'/| _E_>/| c1~PK |ZHK.2 &testopenfilegdb.gdb/a00000013.gdbtablxUT aVaVux  2))@>hT,wݧ==7kȭ T6PK |ZHpzBt(testopenfilegdb.gdb/a0000002d.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHzX&testopenfilegdb.gdb/a00000004.freelistUT aVaVux ܱjAohL*b"I+>@RRYh VV@Ao,Om~? [Ln/"~~ /gxy-0btxa23/Ac9 {e;W;O϶_/9g@%үBSW_̰]vfxo`M_Nհl7.jQv}Y0!owWO2F|vY`b{,g= ۥ׾+M~r_0g35_sʽ2BA~yePK|ZH>(testopenfilegdb.gdb/a00000006.gdbindexesUT aVaVux m] AFؔ+%$uׯ3&vg3>4}`( rVdυ#^,`,Uqͤ][gT\=)tMR2əZj>MKW|{"q X%6MPK |ZHpzBt(testopenfilegdb.gdb/a00000024.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHH )+&testopenfilegdb.gdb/a0000001f.gdbtableUT aVaVux J@Oڽ!H!ZMOWayB|utBOI3ON=_n@{KLUy1vᡏm ZX.6ɷe-7᥷nMN..A 8~/ꡓz|xo3Bg0j~?{Ɯ]yZKt+%Ud+= ?&qVWX\S`qlBn@w1_*R&Ԝ@UFrhyEr]&ԼhBUFl_PK |ZHpzBt(testopenfilegdb.gdb/a0000000e.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHpzBt(testopenfilegdb.gdb/a0000002b.gdbindexesUT aVaVux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK |ZHn(W5 &testopenfilegdb.gdb/a00000017.gdbtablxUT aVaVux  AH!,2 -QE4#~GDgʼ=*+ܬ=#_hPK|ZHA<testopenfilegdb.gdb/a00000005.CatItemTypesByParentTypeID.atxUT aVaVux عj0aO}*-U)K/5̻$4!EH79`c3 47u؀M؂m؁]؃}8C8c8S8k[{xX. ֆksh1wRsjHU q $@ܚl!W}UDZRn4IF٩OWf̵$UعHגk3{ ^6bXB̜ɖIK]UNȳ(ri*6$~cZM*NH[ēHBYI[/z^o?/ PK |ZH0`3&testopenfilegdb.gdb/a00000010.gdbtableUT aVaVux RMhAvgg74@.{6?&5Blh IkDS< xR"=EV ۓAh+=`A2C޼}od]Z}<*o-a8i5 ip7SFщH0ӆ>V1fQ}=An;80jlGb:N<ijwbn053T4 ZMGp|pV}׽U_uNŃs^\ZWSv`gsRfϞj{C6=w0'y i'a s hT,wݧ==7kȭ T6PK |ZH"HD7&testopenfilegdb.gdb/a0000001d.gdbtableUT aVaVux S;N@}8_1 @ " D !DKK Q7p.yגH)l(̳g "} 0'Cᝦ=FlB` 1LBBH`A"@DZgEM̌XF-aJaP#eMx8=^ӨZBd=FYKpm^.ps@s }E3bN)4dQ٦MK`"5.VV,/p`f;+ ;Wl,x; be{{;7Ria0(ذ;zA )̡0COlC?ܙ oJ}#J ^Fe\Pջi?3 <̓L=v<~E(&) >DzEFHi\UsܭmOZp_FƏϞxlp&VSfZuz'8181ump&aw`C!Nk"1uƦe5CbS16J2J$',OVg(a6Ȋ *w6ɌbqXF ;ENgϯHi:{.޷p',8tzkҙZEPK |ZHAtestopenfilegdb.gdb/UTaVux PK |ZH0#!Ntestopenfilegdb.gdb/a0000001a.spxUTaVux PK |ZHlM!testopenfilegdb.gdb/a00000014.spxUTaVux PK|ZHڔ3ttestopenfilegdb.gdb/a00000007.CatRelTypesByUUID.atxUTaVux PK|ZHaw(704testopenfilegdb.gdb/a00000005.CatItemTypesByName.atxUTaVux PK |ZH+ H!testopenfilegdb.gdb/a00000015.spxUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000027.gdbindexesUTaVux PK |ZH0 & testopenfilegdb.gdb/a0000001e.gdbtablxUTaVux PK |ZHt:!= testopenfilegdb.gdb/a00000025.spxUTaVux PK |ZH=u`6+ testopenfilegdb.gdb/a0000000a.idx_float.atxUTaVux PK |ZHs׶'g&m testopenfilegdb.gdb/a00000012.gdbtableUTaVux PK |ZHoH & testopenfilegdb.gdb/a00000004.gdbtablxUTaVux PK|ZH=I& testopenfilegdb.gdb/a00000007.gdbtableUTaVux PK |ZH\55 &testopenfilegdb.gdb/a00000010.gdbtablxUTaVux PK |ZHɐ &testopenfilegdb.gdb/a00000001.gdbtablxUTaVux PK |ZHk| t& &testopenfilegdb.gdb/a00000026.gdbtablxUTaVux PK|ZH¢ &testopenfilegdb.gdb/a00000002.gdbtablxUTaVux PK |ZHb*testopenfilegdb.gdb/a00000006.FDO_UUID.atxUTaVux PK|ZH"B| & testopenfilegdb.gdb/a00000005.gdbtablxUTaVux PK |ZH*08testopenfilegdb.gdb/a00000004.CatItemsByPhysicalName.atxUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000010.gdbindexesUTaVux PK |ZH{C(ne&testopenfilegdb.gdb/a00000028.gdbtableUTaVux PK |ZHbk:&v testopenfilegdb.gdb/a00000011.gdbtableUTaVux PK |ZH &"testopenfilegdb.gdb/a00000020.gdbtablxUTaVux PK |ZH0.o"&>#testopenfilegdb.gdb/a0000002d.gdbtableUTaVux PK |ZHQ/$testopenfilegdb.gdb/a00000006.CatRelsByType.atxUTaVux PK |ZHn(W5 &%testopenfilegdb.gdb/a00000016.gdbtablxUTaVux PK |ZHYJΚ0*N&testopenfilegdb.gdb/a0000001c.idx_real.atxUTaVux PK |ZH{C(ne&L)testopenfilegdb.gdb/a00000026.gdbtableUTaVux PK |ZH9 &+testopenfilegdb.gdb/a0000001c.gdbtablxUTaVux PK |ZH& &.testopenfilegdb.gdb/a00000022.gdbtablxUTaVux PK |ZHJD&.testopenfilegdb.gdb/a0000001a.gdbtableUTaVux PK |ZH/N1 &0testopenfilegdb.gdb/a0000001b.gdbtablxUTaVux PK |ZHpzBt(V1testopenfilegdb.gdb/a00000016.gdbindexesUTaVux PK|ZHBPT?1testopenfilegdb.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxUTaVux PK |ZHk| t& &3testopenfilegdb.gdb/a00000024.gdbtablxUTaVux PK |ZHm:Q0M4testopenfilegdb.gdb/a00000004.CatItemsByType.atxUTaVux PK |ZHKp5testopenfilegdb.gdb/gdbUTaVux PK |ZHtestopenfilegdb.gdb/a0000002c.spxUTaVux PK |ZHыmd&>testopenfilegdb.gdb/a00000024.gdbtableUTaVux PK |ZHnb- &r@testopenfilegdb.gdb/a00000003.gdbtablxUTaVux PK |ZHpzBt(@testopenfilegdb.gdb/a00000017.gdbindexesUTaVux PK |ZH& &Atestopenfilegdb.gdb/a00000029.gdbtablxUTaVux PK |ZH1*3()Btestopenfilegdb.gdb/a00000009.idx_id.atxUTaVux PK |ZHpzBt(Btestopenfilegdb.gdb/a00000015.gdbindexesUTaVux PK |ZHpzBt(bCtestopenfilegdb.gdb/a00000018.gdbindexesUTaVux PK |ZH+ H!Dtestopenfilegdb.gdb/a0000000e.spxUTaVux PK |ZH& &Dtestopenfilegdb.gdb/a0000002b.gdbtablxUTaVux PK |ZHpzBt(/Etestopenfilegdb.gdb/a0000001b.gdbindexesUTaVux PK|ZH`34Etestopenfilegdb.gdb/a00000005.CatItemTypesByUUID.atxUTaVux PK |ZHI~2 &tItestopenfilegdb.gdb/a0000000a.gdbtablxUTaVux PK |ZH0#!Jtestopenfilegdb.gdb/a00000019.spxUTaVux PK |ZH\`8Jtestopenfilegdb.gdb/a00000006.CatRelsByDestinationID.atxUTaVux PK |ZH8Gp(Ntestopenfilegdb.gdb/a0000001c.gdbindexesUTaVux PK |ZHةE!;Otestopenfilegdb.gdb/a00000018.spxUTaVux PK |ZHl5 &Otestopenfilegdb.gdb/a00000015.gdbtablxUTaVux PK |ZHK;4&pPtestopenfilegdb.gdb/a0000000c.gdbtableUTaVux PK |ZHpzBt(Rtestopenfilegdb.gdb/a00000012.gdbindexesUTaVux PK |ZHDA &Stestopenfilegdb.gdb/a0000001f.gdbtablxUTaVux PK |ZH+&(Ttestopenfilegdb.gdb/a00000016.gdbtableUTaVux PK |ZHi2'l&Vtestopenfilegdb.gdb/a00000013.gdbtableUTaVux PK|ZHY%<)Ytestopenfilegdb.gdb/a00000007.CatRelTypesByBackwardLabel.atxUTaVux PK |ZHk| t& &Ztestopenfilegdb.gdb/a0000002a.gdbtablxUTaVux PK|ZHZ< &J[testopenfilegdb.gdb/a00000002.gdbtableUTaVux PK |ZHlL &9^testopenfilegdb.gdb/a0000001d.gdbtablxUTaVux PK|ZHdZ(^testopenfilegdb.gdb/a00000007.gdbindexesUTaVux PK|ZH-YW &_testopenfilegdb.gdb/a00000007.gdbtablxUTaVux PK |ZHFQ z&`testopenfilegdb.gdb/a0000000f.gdbtableUTaVux PK |ZH{ &ctestopenfilegdb.gdb/a00000006.gdbtablxUTaVux PK |ZHpzBt(ctestopenfilegdb.gdb/a0000000c.gdbindexesUTaVux PK |ZHˊD+dtestopenfilegdb.gdb/a0000000a.idx_adate.atxUTaVux PK |ZH<-B!>etestopenfilegdb.gdb/a00000010.spxUTaVux PK |ZHz&etestopenfilegdb.gdb/a0000001c.gdbtableUTaVux PK |ZHv2&ftestopenfilegdb.gdb/a00000015.gdbtableUTaVux PK |ZHߥc"-Gitestopenfilegdb.gdb/a0000000a.idx_nullint.atxUTaVux PK |ZHpzBt(itestopenfilegdb.gdb/a0000002a.gdbindexesUTaVux PK |ZHOE#2 &tjtestopenfilegdb.gdb/a00000012.gdbtablxUTaVux PK|ZHӰ 6(ktestopenfilegdb.gdb/a00000004.gdbindexesUTaVux PK |ZH9IF)ktestopenfilegdb.gdb/a0000000a.idx_str.atxUTaVux PK|ZH3 )&ltestopenfilegdb.gdb/a00000005.gdbtableUTaVux PK |ZH{+B(qtestopenfilegdb.gdb/a0000001e.gdbindexesUTaVux PK |ZH0#!qtestopenfilegdb.gdb/a0000001d.spxUTaVux PK |ZHO &(rtestopenfilegdb.gdb/a00000006.gdbtableUTaVux PK |ZH5 &xtestopenfilegdb.gdb/a0000000e.gdbtablxUTaVux PK |ZHpzBt(1ytestopenfilegdb.gdb/a00000021.gdbindexesUTaVux PK |ZH'2!ytestopenfilegdb.gdb/a0000000a.spxUTaVux PK |ZHpzBt(bztestopenfilegdb.gdb/a00000022.gdbindexesUTaVux PK |ZH+ H!{testopenfilegdb.gdb/a00000016.spxUTaVux PK |ZHt:!{testopenfilegdb.gdb/a00000028.spxUTaVux PK |ZHpzBt(>|testopenfilegdb.gdb/a00000025.gdbindexesUTaVux PK |ZHi2'l&|testopenfilegdb.gdb/a00000014.gdbtableUTaVux PK |ZH2W*itestopenfilegdb.gdb/a0000000a.idx_guid.atxUTaVux PK |ZHpzBt($testopenfilegdb.gdb/a00000029.gdbindexesUTaVux PK |ZH0#!Ȁtestopenfilegdb.gdb/a0000001b.spxUTaVux PK |ZHlM!Ftestopenfilegdb.gdb/a0000000d.spxUTaVux PK |ZH'2!testopenfilegdb.gdb/a00000011.spxUTaVux PK |ZHpzBt({testopenfilegdb.gdb/a0000001a.gdbindexesUTaVux PK |ZHlM!testopenfilegdb.gdb/a00000013.spxUTaVux PK |ZH5 &ǃtestopenfilegdb.gdb/a00000018.gdbtablxUTaVux PK|ZHA&\testopenfilegdb.gdb/a00000009.gdbtableUTaVux PK |ZH0#!ʅtestopenfilegdb.gdb/a00000020.spxUTaVux PK|ZH0#!Htestopenfilegdb.gdb/a00000004.spxUTaVux PK |ZHt:!Ɔtestopenfilegdb.gdb/a00000024.spxUTaVux PK |ZHpzBt([testopenfilegdb.gdb/a0000001d.gdbindexesUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000014.gdbindexesUTaVux PK |ZHѦm&testopenfilegdb.gdb/a0000002a.gdbtableUTaVux PK |ZH+&ptestopenfilegdb.gdb/a00000017.gdbtableUTaVux PK |ZHϩ(!testopenfilegdb.gdb/a00000021.spxUTaVux PK |ZH1cL&mtestopenfilegdb.gdb/a00000023.gdbtableUTaVux PK |ZH& &0testopenfilegdb.gdb/a00000023.gdbtablxUTaVux PK |ZHK;4&testopenfilegdb.gdb/a0000000d.gdbtableUTaVux PK |ZH&()testopenfilegdb.gdb/a0000000a.gdbindexesUTaVux PK |ZHdc d&=testopenfilegdb.gdb/a00000018.gdbtableUTaVux PK |ZH+ H!testopenfilegdb.gdb/a0000000f.spxUTaVux PK|ZHO;testopenfilegdb.gdb/a00000007.CatRelTypesByForwardLabel.atxUTaVux PK|ZH testopenfilegdb.gdb/timestampsUTaVux PK |ZHœަ3ltestopenfilegdb.gdb/a00000006.CatRelsByOriginID.atxUTaVux PK |ZH(testopenfilegdb.gdb/a00000006.gdbindexesUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000024.gdbindexesUTaVux PK |ZHH )+&testopenfilegdb.gdb/a0000001f.gdbtableUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a0000000e.gdbindexesUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a0000002b.gdbindexesUTaVux PK |ZHn(W5 &gtestopenfilegdb.gdb/a00000017.gdbtablxUTaVux PK |ZHB-&testopenfilegdb.gdb/a00000022.gdbtableUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000019.gdbindexesUTaVux PK |ZHt:!Btestopenfilegdb.gdb/a00000023.spxUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a00000020.gdbindexesUTaVux PK |ZHt:!{testopenfilegdb.gdb/a0000002a.spxUTaVux PK |ZHw~ 6 &testopenfilegdb.gdb/a00000009.gdbtablxUTaVux PK |ZH9H2 &testopenfilegdb.gdb/a0000000b.gdbtablxUTaVux PK|ZHA<8testopenfilegdb.gdb/a00000005.CatItemTypesByParentTypeID.atxUTaVux PK |ZH0`3&testopenfilegdb.gdb/a00000010.gdbtableUTaVux PK |ZHV/&Ttestopenfilegdb.gdb/a0000000b.gdbtableUTaVux PK |ZHk| t& &testopenfilegdb.gdb/a00000028.gdbtablxUTaVux PK |ZHK.2 &Mtestopenfilegdb.gdb/a00000014.gdbtablxUTaVux PK |ZH"HD7&testopenfilegdb.gdb/a0000001d.gdbtableUTaVux PK|ZHJ'3testopenfilegdb.gdb/a00000007.CatRelTypesByName.atxUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a0000001f.gdbindexesUTaVux PK |ZHpzBt(testopenfilegdb.gdb/a0000002c.gdbindexesUTaVux PK |ZH KT4)_testopenfilegdb.gdb/a0000000a.idx_int.atxUTaVux PK |ZH0#!testopenfilegdb.gdb/a0000002d.spxUTaVux PK |ZHJD&ttestopenfilegdb.gdb/a00000019.gdbtableUTaVux PKTgdalautotest-3.0.4/ogr/data/expected_000_GRD.gxt0000644003401500001440000000364413614004466020743 0ustar rouaultusers//$DELIMITER " " //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 1006} //$FIELDS Class=000_GRD;Subclass=000_GRD;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields idSel nom withdata Private#X Private#Y Private#Graphics -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 gdalautotest-3.0.4/ogr/data/dimension-entities-only.dxf0000755003401500001440000000311213614004470022620 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 DIMSTYLE 5 A 330 0 70 4 71 2 0 DIMSTYLE 105 57 330 A 2 STANDARD 70 0 279 2 0 DIMSTYLE 105 508 330 A 2 housedimensionstyle 70 0 42 0.1 44 0.5 282 1 0 ENDTAB 0 ENDSEC 0 SECTION 2 ENTITIES 0 DIMENSION 5 CB 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D0 10 320010.0 20 5820010.250872585 30 0.0 11 320005.0 21 5820010.250872585 31 0.0 71 5 42 -1.0 73 0 74 0 75 0 3 STANDARD 100 AcDbAlignedDimension 13 320000.0 23 5820010.0 33 0.0 14 320010.0 24 5820010.0 34 0.0 100 AcDbRotatedDimension 0 DIMENSION 5 CC 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D11 10 320005.0 20 5820005.0 30 0.0 11 320002.4999999991 21 5820007.5 31 0.0 70 33 71 5 42 7.071067811921238 73 0 74 0 75 0 3 STANDARD 100 AcDbAlignedDimension 13 320000.0 23 5820010.0 33 0.0 14 320005.0 24 5820005.0 34 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 40 1040 1.199999999999999 1070 271 1070 1 1070 170 1070 0 1070 140 1040 0.4 1070 41 1040 1.25 1002 } 0 DIMENSION 5 CD 330 6F 100 AcDbEntity 8 0 100 AcDbDimension 280 0 2 *D10 10 320000.0 20 5820001.5 30 0.0 11 320001.5 21 5820001.5 31 0.0 70 160 1 %%p2\~3\P\\P4 <> 71 5 42 5.0 73 0 74 0 75 0 3 housedimensionstyle 100 AcDbAlignedDimension 13 320005.0 23 5820002.5 33 0.0 14 320000.0 24 5820002.5 34 0.0 100 AcDbRotatedDimension 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/base-64.osm.pbf0000644003401500001440000004632513614004466017775 0ustar rouaultusers OSMHeader]NYxN ܓ "OsmSchema-V0.6" DenseNodes0.41 CGImap 0.0.2, OSMData֘Θx\I?U޾ \.Q&̙889EőW3Ad$ ""I "*TQI""/78{]]}ΩSVp: ߷ڳ9{v%8m68*[qmmۼj˷~v[br'^k[ɉܽz-;9mlwXnffañ~ޱzw[lށ*عy=[p"ʏ֛8fVp=˗s"K6X[8:,"9{/[ݖY}kks;ǭ;T۪?X[ݨ D?[c额?FEݷ{vXq -6qlxoV[,7Z4[y;m96˝Y6[8z%?ټf'z'N\/j7'صB5-7YbD8zVD },7o#-z'[kI-w`B]p6{lwX#.]DknM6? Zj[^;,A 9y ,Zbe,X1-^jᭃz[΢?XśwlZ ahr~4C 4[m{[,޴ٳr2HH[;Z`k}jvn]V{ؚmec-_cw['ځd"oKW/Qr Nc+mmُ r5ar,[mI-6#Gmo'f[mv}ozV b c=oDÙnm>܁e)*VQmݵ~'splPc-y#oV$vvJdk6[ﰶ3sZ/r=VmPs#}kF?…8֨G;v~gh M-سA6^SEX,?ߍY6ppmiP5~}-wB`kILz_>E-'r5奍۬Fb)¦IH(7l5hyN6 6v#Y7]bG,m-9)ÛȎfl݊FG ĔlXi8%ll!~XpQ!؂ bYMdj='@ hy8؆"xhw6{C~ٸUxn+m |oN7{n$͆yp?17[m{ lvrnu5iV)݌ӑӡ`ED[XB8RKmqp 60py $e;JTBڷ6[fmֻ86,_8fF6Lw+ߝL f~0BEh$0 Q(RI(a&Os;ш]n" }2ȝP,@HlB^Q&&B0Ѩ@%_!ZBap}pT+r8! p|;l@2/jkǐ! * 8!/@.X(8sJRy|/_g%1 Լ(4JKVEl(gjcU*ֈ؄vȭeHI`TgJB~ t#uRM(dBm\t% 0vK; (yFz*2Z14rFH -@E04a$t!=y ]ia]"kD!dxGW5A|B3dLPg"9LPa"I"͈cKSCVWBm%yNߩjam4yZɱ_􇌋.ƈ[枮s$Y:pFSq9) 4WW!ч#0Rpe֖3=(sm8*`2il䴁̵XPMU5gɌG N%BNvy7eu=zxmZ+ͣ:PvP +m 5m^ ;M&D hqm!z6'Tm['\%(SSn|@Ym_Mߏo_OunJ9@o0uzIiRdoP V 偞|yps)n8`Dby:u)tB:s! nE/ð<Bj6b(~;QO~IR=Ay\CIQPyГ{TC*_l5^~dw<o~#*H%ե*OG ]w0\zv7T癇"N.G9A ?0ұʯJ@Pfwl-U>fZwXߧ7[Lj_96a`i`,㽆'ҍ)fnЍb52vޕHBs'7!$%RqxT$ (6ksCMZ,'ñ;;.o^!Y{nB~!aO#. k}ݗK 1ҴEE(5;NttDG J\>Do1!ti4BX݂ѻ@8;ֹǃ[|)Y)XrR<`3F*w!dytQ1!H)EפeXr3s"@$]nU2tqI7fއ%X CBa jn4v_kE~G  m14y܋'z¯53mNwyiw[H{0Sʿq@PӴ4/N!|[1cS !pOɁ`(z6KF}ͩS,_;JJ| a愖-G8Z`;FGdžQc ⃈,dg <@jo%r=_/玮Qf-׸/.RhzkN=r,gtQ钸]F g5wNް~IS8}B +hβ%FE [kY۰]Ps$ LB_%BН/ʳLA<э vNAͿ8xF@=9^"0BanGY`c$Cm;z>>i۩]|%}a WUe;:oD?\Ƅ~(A-/w2Y?䜕ًTtk+>8Zλsݰ5U.V؆H/ oުgfJLUNE%7og2ɚqpQKzstpAb~r:S C*t{huG)#tt3cДDx|5E%L*h*neC9("bSŸKε?b/57i> p/TĠHxt%VG%U%%BR*1< JܕdiZ +!^5ςQ;ωϢKHfI1{?V68 v5W8TsT%(ז`*5 վ=BSϕRR@BUX{96'rT1U.]o^Ca8 RQECgYI9<.囇տ9zRcѫeb. qS.U$E}NMO8E͟؇Uϥ+'8Z 3)9!ayZcߘ[hPaS *751J)G5c}RGQA\xduzh?ҧ,m5]tܟE]+:"iX֐ q)҃ f祘3ǎi>SzzsA68hyNT_R/cs )=,-OoNcP]sNtvnFy}(PR5uQTAiEϮa:dhľ *FM#1X@`cRyƢr<{fW#WTͣYV'?QC! *J"pRI<5|h[|̇>7V<7WoT|V"WhIxxUE"s |y(?@.jmxX$Pe310V7#Y?F뢀 P*[^p.t4kaV7/UҼɚ*ގB _;;-VtTŕ&(^?ެQMε:#*R) ŜX#뮉`E[34y-K·Ii?'&+ 1 n?Cb۔%N=;U@a/8c ?Q 0W1T<8)JE UroR;fByBmwջ<ޠ*u&iq4{] YJXjC*pra4gGġ)(XN>z~ Iz cA16;Ub~L!#(pT86O*jX+֮_zǤJg82%@Džo]vgU f[i4q e jSOuTYu$=צ}x "_Zh)0yO<^[1nPʶ!Ѡ)`|)grg i7%<*Lӽ41g[ ;SBmi7' p$Z`M3W-,Z@PĴkkU s/@Nho= AJδ k{h"]1_e;S鴏J>S:mĩv heutA/A]b k ۗR޻!Y4] jZ=kEF),4t1 Yِ/`n1\W<AtݢlhXiRv3?Hn.K{ӞFUܤO'=܍Ff_uSΈqNo'oEq%xO`bp2ئu]ig-g4{'`4w[(V)wnq{uM|{$%Vgicr_T 蔘e 8˔I n,e;%Sؽ錝h Fr#E Ǵ~}8q oЪݑ~JG%bw9,<ꀳ:=nяg'qo/vdjywҀkR)ןE ^/''J I)A!͌\YAΆ 5^TV J"[]9]ǡ)@7)ϺNǁ=ʁ̌P8qh.C?ٴfQ[_B_)NFiz٩W.K@Oj?9e]y7H^{Ip0 &^10$'0g`A$[m!uUydp' oBiJr,[`}z^M3n7x=f1V5qА Z}AYف^峼yhߌ'JHXi{(Bro9{8]jniWӯ /DEZyfyҰ&) yOcP9͝%v6,Kꟲ.>Mg ZHSL͢Ll\+A3:zQ ʸ8i KJys~Vg89ԩ][{tQ/wdX!Xh0ZO[+/Fh.\U{t/i55c6Ҵzu6 Q<+/o\4opʋVui=aϠ ; e覘Vu7_Ooz!xYCw̺t'/RMyp@El^XPu7.oJ_8+\]]6{~ɾ'Z5үd93&YA~ ڴRL$Cl4<-8P'*riЪ}{FHwCWԸRkAΚň/bAtsaUBqyڏŇ6\y1gfw"_wvVޘtpyWEs͇1ws'ޟv[rKAm3"ʋ:510nIĢ۰Y~`ҝCw-^^oTm]wfwaJswW*eNlsY&njNLU cbqc͢g4ҟ9/Z,әu8h*=-m:&yJxJ!~ Zw$G`^sv..盝Z͠9y >rL{Jn%;]a1shQy!IjZ׊ōZCv0O Mw{qQqmP6e"JoNoaS/)C88ǝ5޴r`fd0jmF6AEX1PoC.iܠvJx)  9; ᫽Z\C:A5\&@W "8𱶭- In,ANJN!+|fG T7 Y5SiI&=uxLO7^a (`A$L=t7tJ3'ɄE^ $u#ZLK|,ny&0J\Oŀ7@ 4웛 zz^{?Uvi b =o7傒`pdyx %҂}2 Ra\mw[s=n#@`.}3 41^I`϶)"qũJ<`5]ЅY͹ lCq]Fߪ8av\ᒦum^ } 9_`;n?6I.\4G?kб]OZ@oNl]յ`qF.H;an൮:;@^Y;?jQOM;κ\ZH=l(Pu~ޟ^9% `]c04DL5 p&6Шm@?7$Eo&t^!Nw׶g+{޻l}}r#s _͍tĔ/ _ *ԉ<ܐK^9 2Cd.U,% wMJ-3J?.2u|P{gjԲ9181ﺭAqW:pEnv&&d?leٸJXx߮| *ZUzaŅa+ -a+9z|Xt ˜KYFC܂K[An'cLn:zg}P;8tK 83`laF*/8GYeGúMmb]S]Y2>^+.ƙ9zaq᥸oݕ!:!3 .":OiT;S"uk7gú3zG(GW̊1N˂v$ 1띙D\ פ~i[h$h9򷦷F18 +qxi|WI\qkZ@+gn^Z8^xãEwiG׍ݍhb'?d߆MWEO߹c|~=?PoDvaÏ|QG"O1fΥ׸2gaqSE,!_y2ӟxP_hSŦ1F=ޕ5I}?|}єIubAqLs t;&?$3s\R$6k-"[]~bv jui= I|U#l^bpnˇ ^äN6}d~T'C|*^Ko$0Net+wVqUtSQa&fp:Bhptp!\~ltIKX'Lwfj=߆ܭši8/Z<b^d'Lr=b t3u'{::%2ns, ݧmFؿW|4+(FwR"_24.cPxh6IAܯFG{phwDxpVy7_xSLP1(QZ=nkA=q_o)Uu&tAߓhUJ 2] _9 A'Io rf x!PxKXմ-K\!BCKW_iEԹc|!78Ur2ax<>^` .ˉsqcRm: N0lu[?x]v{>A/~a[L=tm4AԪNp/_zE^є}aAD鲻)徺{AoAn$w x˹jNp-jP>kxXi)_`-ص$Rp|rxJ"g|89Uk`+:[s ^d["@l =}Ҹ;ρKX? JlSz{ js٘t s=0 рPk\ċ>5~aUr4ɹT5r+RmxwM\VL~׉-~"pD|뽋 q;ŅZo3S4"gsuPZ";>^Ÿn_MMN,@ZlG?c+8Yz޻!B61tL#5kxT'٫sM/j>r} k|]Q J:']vGp: DSw֔ G3i>`c0tz-) |QqxϞ;ʅI[N3}ŮvN$ Z'ف?:ԟ#[&hP] N7 KgfaƯYz1~2qO5z O̲j1Uva[ķK_wY`S 9l[+nm8윔:bbĠPe5"z (@'Y+>D .s^ 48磟26ܼһ!I{ti44"\|t[]0ϴvHp]&0V-<`BщsB̸RGg:\9FN'@+AեJgx\Թ?sߧ-Ʒ;rjТo/r .lS7sZX{uM6L,Vz݅Ä7}ϳv__{֎8sk>*X5Bǀ insaauk/,ojC w4ke|5Ǖ_KcE"Á-C:Yp9]ƝOW ~Wt 2؊Jhrg4rkO-Fـx=7ƥe| tHЩ-OT&޷g^zKC3Zjrkpjx04@5 Zy:z2nqBxaBei$Wg}K:x|AJ+({"QpF#,v3k˦Ϋ:rxѫsgz0#;<=xC|̲0_C nɥ &,vu>XtUPhZ=/T{N6keG3˙+f  vAe&. pfP~e~.sRr *vx$M78ei_/JFǂ8G4{hS"׍w%!.Aqxw|>8pߥAs3L?~{.‹FNo~fp aKg=@6g9C  /XWoII8W٬ EIS(=@I쯳/I{^Wd菩{rkv!({1?/KSJAk[*S_wimϰ@ te,'m>TŘx|jv ٙP˖P 2IPژ՞˘ߝdV=s6\mRHha>$9)R!K N5`KS.3&'3Qg}0ᵧ(kpQo?5A{Y%[ŵsO;nHzRVR@hoN|\o4ƪ9Bg\#;bK2 {q҄É7P-g| D/B3sҜqFrg]źg` [6ld:H?Øtw0`'е'B H04 yfy["EuȟF2 L. 68'DGV\j)6.-ò*MY/ M*QnFa"I ۋiTv)j}r88{U X-.*;ϘEr[8["l>6+M.i`LzιZ[ g>ŲŬ<m2Y}}({ Ń/~@X HVES"KDhW =p<Ζ1R' a A\$HF>Cm? c2pydh)`ǩU塡ԅb`Y1&Ҡ-I41-^-cTA/fc~%$Vg8A fi1.P6UF- ryP\DރА@&*ج:2u5ՄNSPuWىj!ܓGEC3R2-e'e2|1݌Ivvxj8Bf"F=&g4e>y2zaL<19``rY:'Fg鼗vD3>YfI$h`X4M ǘB)@_d$/5eLgͬ0G >S"yMRq)M`H\=7',.SN t5!B/JT h 75'*  .V;SG5JRt{Gqχ;K ūB5]dBcơ,GV-[cZ'x"3ٟ9j!̅QbF .Rv/sUlץ9rMb?z3bu4d穵@C)?n#E<=W<_7]w|'ً3j4 f0mNYsT)H< |џ5  |^ʪh\6.T Ҡ*~gFSSFq~6XմC3L1@pH]BI9K0q<Δ&!OAhGKմ܂e$ة)J^b#Hn'懇1m:Δ% vuUfW `B_&Jh,P5SC:ړ#셫u<\`jCҭQ@" 9J5:$hL%5 # äQP6}Y>-AcZ@E"F:10'N5 |t"eo:jȟ2֒|o'gQQddyM r(Xxi?u( Tѭp$V,!11qIN/ejn.ݥh,=9lM6ib+1a _4^*+ICLU8'J0tͮUo3K[+1ZZ[%oĦ#GN)I$r< 75<_1}Ͼw5 pc<ŨR$3H:LY_{W@ڮőoN#CvՖiZdfxd?NG'5bEicm~M˖ yiuDr] a C}T)0fHU0 娾sDztR?c4܉h>Ж<\Es<"_u u31CRAc AcvXLp x2d33eO IOv?7͞ 6ifDy\pUjM(v|_f$.efo?Qal d >0C,Ex ;dBҷ3q[I!yLjE Hɚ;IZ!*FkI@LjAU:V=fW26fFzRl mMNa&N ~ C?^s=T9t{hDIU B8^եW*j^ I)&DmZOM{$Z?$-`Q4i*y-ԋ-W:MҟU*R贂rK1-̊%bıױVkȪ cs9V"("CmQiE͖KFzdU`k4ʝiBZ7X4Z'׋8tn4!*5 !K&~=`n'X3TY,CU,evX'>me9Fu:"^;t &}m¢ٝ*acnf Dƒv~db Fc6T&QYvL85XRC* 6F UjjHm"9 )@n̚l C}WCSEON'gʫNb9ϊO&&'q)LT_!:T/cD'7ƌ0-9^1ݶ,Am]!?:G0@YlOKfSiJJD+?[̞vƤ)ktLgA^YMQ qX/"Es9OjT[(,r! r/ՕNEFޛ;j+ec~KLA <ٕ]IOhrU* q4cփUd wa^ٜI_4\I{+Q۸fC*M-!/uN`q;w#xjA;YMXWKe2@>c/$}:^e՜ Bs8(?)\*吭w+٧(_N|ɁIpbKeFB\.Y4H={l1> lD2.CFe\wu*ϲ/@V51%L2Ju*@JsŶ'>VeH:\g\B &7 4:H c:Yu>6;B: g< eU?N?8a%zxdk0VX@ }1hNMqQSŤȯ_u6\]xG$&Osq]J & Z;WDNVċ>$1$R])?Jl~ hlG/B7>^R^oߵKxnɁ<χ5ۆp/E|'2vFU.HH'i^*۴U2/,A{ƂS<5c̳Cug+yߗ~{y:Q{]}x ?Mq-ABWqɳJYѴ W'0tG2}ӒhL6 TtWph0?1gXԓUAV-r?]MVy6VR<_#!R 78񒾊)Au25Xw|>X5R .2CtMR>~24dUĢ$*ٴ6}G@fM:1 ·YV͕$.j|*6*dT 4/%C\EaA\#P֘Ųl:+?㝦LcjN?dGr^'r47͛2*I ?(X2X1\LJ71oeKأb H;4 S[ *,9Pַ2| 5atr㦓& Ⱦ<  b͑jPl[D>HEd lZb\J ]J&S3LL+Vr&|Ku-^ KEIYmdAĒmjC+l*<^x[TOJEytF㜑*gYc\<9ЌQ=h[.FVzNd*m sytkX^b %dSpKi;rG!3ϧIR&=0l{}ށ8@ -c˟KjM\U!=T>cw/,Ӣ!s;qUY0 cHbHṭ,vVx:Y31ӱ[|{[\vޣ-TW@*"*y3V(HLvXᾲl5v]J^b$m vۯ,2܃mqޥ5wfQe?|edď͖:uo@ 6FFD^(78-|npi(͉ /`cbsc\@gdalautotest-3.0.4/ogr/data/citygml.gml0000644003401500001440000000421713614004466017511 0ustar rouaultusers aname 0 0 0 1 1 0 2010-01-01+00:00 aname 2 3.45 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 gdalautotest-3.0.4/ogr/data/utm31.TAB0000644003401500001440000000041413614004466016634 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table Type NATIVE Charset "WindowsLatin1" Fields 1 id Integer ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "f0bbc21d-6931-48be-b3f1-91f14480e738" end_metadata gdalautotest-3.0.4/ogr/data/emptymultipoly.shp0000644003401500001440000000062413614004466021167 0ustar rouaultusers' Y@Y@@Y@Y@@ Y@@Y@@Y@@Y@@Y@@Y@Y@?@Y@?@Y@Y@ Y@? Y@?333333Y@?333333Y@? Y@?gdalautotest-3.0.4/ogr/data/buggymultipoint.shx0000644003401500001440000000015413614004466021322 0ustar rouaultusers' 6Y@@Y@?2$gdalautotest-3.0.4/ogr/data/placemark.kml0000644003401500001440000000042513614004466020001 0ustar rouaultusers Simple placemark Some
HTML
content
2,49,0
gdalautotest-3.0.4/ogr/data/ogr_gml_56_registry.xml0000644003401500001440000000037213614005345021745 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/testlistfields.gml0000644003401500001440000000071413614004466021101 0ustar rouaultusers value1 value2 value3 4 5 6.1 7.1 gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/0000755003401500001440000000000013614004466027135 5ustar rouaultusers././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.TablesByName.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.TablesByName.a0000644003401500001440000001002613614004466032624 0ustar rouaultusers  gdb_dbtune gdb_itemrelationships gdb_itemrelationshiptypes gdb_items gdb_itemtypes gdb_replicalog gdb_spatialrefs gdb_systemcatalog polygonarcszm1 gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.FDO_UUID.atx0000644003401500001440000001002613614004466032135 0ustar rouaultusers{F21FF93E-A400-43C1-96FB-C495B27467E5}&././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.CatItemsByPhysicalName.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.CatItemsByPhys0000644003401500001440000001002613614004466032752 0ustar rouaultusers POLYGONARCSZM1 WORKSPACE gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/gdb0000644003401500001440000000000413614004466027606 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000003.gdbtablx0000644003401500001440000001204013614004466031666 0ustar rouaultusers$ gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000002.gdbtable0000644003401500001440000000400713614004466031646 0ustar rouaultusers#e(eKeyword  ParameterName  ConfigString6DEFAULTSUI_TEXT#The default datafile configuration. DEFAULTSCHARACTER_FORMATUTF8%DEFAULTSGEOMETRY_FORMAT Compressed"DEFAULTSGEOMETRY_STORAGEInLineDEFAULTS BLOB_STORAGEInLineDEFAULTS MAX_FILE_SIZE1TB DEFAULTSRASTER_STORAGEInLine9 TEXT_UTF16UI_TEXT$The UTF16 text format configuration.# TEXT_UTF16CHARACTER_FORMATUTF16HMAX_FILE_SIZE_4GBUI_TEXT,The 4GB maximum datafile size configuration.%MAX_FILE_SIZE_4GB MAX_FILE_SIZE4GBLMAX_FILE_SIZE_256TBUI_TEXT.The 256TB maximum datafile size configuration.)MAX_FILE_SIZE_256TB MAX_FILE_SIZE256TBHGEOMETRY_UNCOMPRESSEDUI_TEXT(The Uncompressed Geometry configuration.4GEOMETRY_UNCOMPRESSEDGEOMETRY_FORMAT UncompressedBGEOMETRY_OUTOFLINEUI_TEXT%The Outofline Geometry configuration./GEOMETRY_OUTOFLINEGEOMETRY_STORAGE OutOfLine:BLOB_OUTOFLINEUI_TEXT!The Outofline Blob configuration.'BLOB_OUTOFLINE BLOB_STORAGE OutOfLineTGEOMETRY_AND_BLOB_OUTOFLINEUI_TEXT.The Outofline Geometry and Blob configuration.8GEOMETRY_AND_BLOB_OUTOFLINEGEOMETRY_STORAGE OutOfLine4GEOMETRY_AND_BLOB_OUTOFLINE BLOB_STORAGE OutOfLineFTERRAIN_DEFAULTSUI_TERRAIN_TEXT#The terrains default configuration.-TERRAIN_DEFAULTSGEOMETRY_STORAGE OutOfLine)TERRAIN_DEFAULTS BLOB_STORAGE OutOfLineTMOSAICDATASET_DEFAULTSUI_MOSAIC_TEXT,The Outofline Raster and Blob configuration.1MOSAICDATASET_DEFAULTSRASTER_STORAGE OutOfLine/MOSAICDATASET_DEFAULTS BLOB_STORAGE OutOfLineNMOSAICDATASET_INLINEUI_MOSAIC_TEXT(The mosaic dataset inline configuration.,MOSAICDATASET_INLINECHARACTER_FORMATUTF81MOSAICDATASET_INLINEGEOMETRY_FORMAT Compressed.MOSAICDATASET_INLINEGEOMETRY_STORAGEInLine*MOSAICDATASET_INLINE BLOB_STORAGEInLine(MOSAICDATASET_INLINE MAX_FILE_SIZE1TB,MOSAICDATASET_INLINERASTER_STORAGEInLinegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.FDO_UUID.atx0000644003401500001440000001002613614004466032133 0ustar rouaultusers{881CE33C-F515-4C56-A5B9-239BFC8B1143}{BF546016-3510-4C36-B52B-586F34DC5E72}{D64ED042-C809-4F9F-8ABE-121F87B2F1A4}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.gdbindexes0000644003401500001440000000113213614004466032217 0ustar rouaultusers FDO_ObjectIDObjectIDCatRelTypesByUUIDUUIDCatRelTypesByOriginItemTypeIDOrigItemTypeIDCatRelTypesByDestItemTypeIDDestItemTypeIDCatRelTypesByNameNameCatRelTypesByForwardLabel ForwardLabelCatRelTypesByBackwardLabel BackwardLabelgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.gdbtablx0000644003401500001440000001204013614004466031667 0ustar rouaultusers~Ggdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a0000000a.gdbtablx0000644003401500001440000001204013614004466031744 0ustar rouaultusers  ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByDestinationID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByDesti0000644003401500001440000001002613614004466032725 0ustar rouaultusers{881CE33C-F515-4C56-A5B9-239BFC8B1143}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.gdbtable0000644003401500001440000000341313614004466031651 0ustar rouaultusers"Z (ZObjectIDUUID & ParentTypeID &Name.i3_cI s&)w]GOB Parcel Fabric0!قGC0M(mM&Nag}Replica Dataset(NbC@E(mM&Nag}Replica(7u5vd3Hx<|(&)w]GOBTerrain->E\羴7fHJ(xeE9ӱխ'B?3Folder-eXE#mѠ{G(mM&Nag} Sync Dataset/5EJwӃb!4nG*i9Raster Catalog'7fHJ(MbP?MbP?PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]S@d@ٺAj@j@MbP?MbP?MbP?PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]S@d@ٺAFV1hb@N xB(,iBMbP?MbP?MbP?gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.freelist0000644003401500001440000001053013614004466031714 0ustar rouaultusers.gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000002.gdbtablx0000644003401500001440000001204013614004466031665 0ustar rouaultusers#>`T}F~5`,v,aK}gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.gdbtable0000644003401500001440000003221613614004466031653 0ustar rouaultusers4(RObjectIDUUID &Type &Name PhysicalNamePathDatasetSubtype1DatasetSubtype2 DatasetInfo1 DatasetInfo2URL Definition  Documentation ItemInfo  PropertiesDefaultsShape"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.Aj@j@>MbP?MbP?(ei<@xeE9ӱ\x`T56L+Xo4^rsƀrO@2 u] Workspace WORKSPACE\falseesriLocalDatabaseWorkspace300@힥/sB@ 9t xsp,J",[ polygonArcs1 POLYGONARCS1 \polygonArcs1Shape)\polygonArcs1polygonArcs1falseesriDTFeatureClass3falsefalse10.0trueOBJECTIDOBJECTIDOBJECTIDesriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalseShapeTypeesriFieldTypeStringtrueReadStatusesriFieldTypeStringtrue{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapefalsefalsetrueShape_AreaShape_Length601199.024942978297131790.5946950195604861.330011237417134372.1592573179PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.3910538-10000010000-100000100000.0010.0010.001true3273532735PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.3910538-10000010000-100000100000.0010.0010.001true3273532735falsefalse 20170824104608001.0TRUECalculateField gp_pg zzz ([FID]+10)*5 VB #file://\\VMBASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network .c=׻C@<VL#C xsp,J",[polygonArcsZM1POLYGONARCSZM1\polygonArcsZM1Shape+\polygonArcsZM1polygonArcsZM1falseesriDTFeatureClass4falsefalse10.0trueOBJECTIDOBJECTIDOBJECTIDesriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueET_IDET_IDesriFieldTypeInteger0trueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalseShapeTypeesriFieldTypeStringtrueReadStatusesriFieldTypeStringtrue{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_LengthNaNNaNNaNNaNPROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.39105384962.40883167606631652639985101.53560865029066769.252690.0010.0010.001true3273532735PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.39105384962.40883167606631652639985101.53560865029066769.252690.0010.0010.001true3273532735falsefalsegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.freelist0000644003401500001440000001053013614004466031721 0ustar rouaultusersIgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a0000000a.gdbtable0000644003401500001440000000564113614004466031732 0ustar rouaultusers (OBJECTIDShape0PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]S@d@ٺA(,iBFV1hb@N xBMbP?MbP?MbP?g ehE"A3O-[AW{wʆ"ANt}7[AFV1hJ@zqLb@zqLb@8@ET_ID Shape_Length Shape_Area ShapeType2 ReadStatus2ڧ̣'턩 ͺ鉵 #ܻ7 ܧ"ܪ/a ӽãػӱƖ؂ē샐 zqLb@#BGALinear SegmentsPasses^턩 Ǵ 㒷e*Y"AK*+3[A FV1hJ@Ț@fEA Full CirclePassesv¿Ǖ٬ƅՉ̔ 􀻲 غѼo"A=3[A;7?5vF@ ˚@EUn KDAEllipsePasses  ̗̓  ӽᰭɍظᑈ ɬaభϧ ϧҚ ڈ֖ ⑈ ղѬظpʔٵЦ쐡\ځڧҢԵ2WE"A %2[AO}G"A@ë2[AI"A62[AWL"A]V2[AΑ)O"A7&2[AO"AΨ22[AD;$Q"AQ2[Aaec]Q"ABy2[AkR"AF2[ACMCS"AQx&2[AwT"A^D1[A0T"Aq1[AVtnM S"ABx1[AP;R"A\w* 1[AJQ"At3^0[A#jeXE#mѠ{G(mM&Nag}DatasetOfSyncDatasetReplicated DatasetDataset Of Sync Datasetc d/E/{xeE9ӱo>xeE9ӱFolderInFolderParent Folder OfChild Folder Ofc+ 2Md#b}qwO%c1 xsp,J",[FeatureClassInNetworkDatasetSpatially Manages Feature ClassParticipates In Network Datasetv|2FxeE9ӱ(mM&Nag}DatasetInFolderContains DatasetContained in DatasetpsqAofqsKQ & xsp,J",[FeatureClassInGeometricNetworkSpatially Manages Feature Class!Participates In Geometric Networkb]=OQ;|o>xeE9ӱխ'B?3 ItemInFolder Contains ItemContained In Folderhۊ1+MRC(mM&Nag}7fHJ( xsp,J",[ jOF=RepresentationOfFeatureClassFeature Class RepresentationRepresented Feature Class././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesByName.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesBy0000644003401500001440000003002613614004466032753 0ustar rouaultusersSchematic Dataset    "!AbstractTable Catalog Dataset Coded Value Domain Dataset Domain Extension Dataset Feature Class Feature Dataset Folder Geometric Network Historical Marker Item Mosaic Dataset Network Dataset Parcel Fabric Range Domain Raster Catalog Raster Dataset Relationship Class Replica Replica Dataset Representation Class Resource Schematic Dataset   Survey Dataset Sync Dataset Sync Replica Table Terrain Tin Toolbox Topology Workspace Workspace Extension "././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesByParentTypeID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesBy0000644003401500001440000001002613614004466032751 0ustar rouaultusers"  !" {00000000-0000-0000-0000-000000000000}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.gdbtablx0000644003401500001440000001204013614004466031664 0ustar rouaultusers jC././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByForwardLabel.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByF0000644003401500001440000001002613614004466032705 0ustar rouaultusers    Contains Dataset Contains Dataset Contains Domain Contains Item Feature Class Representation Manages Table Manages Table Origin Of Parent Folder Of Replicated Dataset Replicated Dataset Replicated Dataset Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Sync Dataset gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000003.gdbindexes0000644003401500001440000000005213614004466032213 0ustar rouaultusersFDO_IDIDgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a0000000a.gdbindexes0000644003401500001440000000016413614004466032275 0ustar rouaultusers FDO_OBJECTIDOBJECTID FDO_ShapeShape././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByUUID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByU0000644003401500001440000001002613614004466032724 0ustar rouaultusers    {0D10B3A7-2F64-45E6-B7AC-2FC27BF2133C}{17E08ADB-2B31-4DCD-8FDD-DF529E88F843}{55D2F4DC-CB17-4E32-A8C7-47591E8C71DE}{583A5BAA-3551-41AE-8AA8-1185719F3889}{5DD0C1AF-CB3D-4FEA-8C51-CB3BA8D77CDB}{5F9085E0-788F-4354-AE3C-34C83A7EA784}{725BADAB-3452-491B-A795-55F32D67229C}{79CC71C8-B7D9-4141-9014-B6373E236ABB}{8DB31AF1-DF7C-4632-AA10-3CC44B0C6914}{908A4670-1111-48C6-8269-134FDD3FE617}{A1633A59-46BA-4448-8706-D8ABE2B2B02E}{B32B8563-0B96-4D32-92C4-086423AE9962}{CC28387C-441F-4D7C-A802-41A160317FE0}{D022DE33-45BD-424C-88BF-5B1B6B957BD3}{D088B110-190B-4229-BDF7-89FDDD14D1EA}{DC739A70-9B71-41E8-868C-008CF46F16D7}{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}{E79B44E3-F833-4B12-90A1-364EC4DDC43E}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.freelist0000644003401500001440000001053013614004466031717 0ustar rouaultusersagdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.gdbtable0000644003401500001440000000052013614004466031646 0ustar rouaultusersIP(ObjectIDUUID &OriginID &DestID &Type & Attributes  Propertiesݏ^Lb,-BN ȟO힥/sB@ 9tx4CGNE>CĕtgBN ȟO<VL#Cx4CGN././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesByUUID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000005.CatItemTypesBy0000644003401500001440000001002613614004466032751 0ustar rouaultusers" " !    {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{35B601F7-45CE-4AFF-ADB7-7702D3839B12}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5B966567-FB87-4DDE-938B-B4B37423539D}{5ED667A3-9CA9-44A2-8029-D95BF23704B9}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{77292603-930F-475D-AE4F-B8970F42F394}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{787BEA35-4A86-494F-BB48-500B96145B58}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8C368B12-A12E-4C7E-9638-C9C64E69E98F}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{B606A7E1-FA5B-439C-849C-6E9C2481537B}{C29DA988-8C3E-45F7-8B5C-18E51EE7BEB4}{C673FE0F-7280-404F-8532-20755DD8FC06}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D5A40288-029E-4766-8C81-DE3F61129371}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{DB1B697A-3BB6-426A-98A2-6EE7A4C6AED3}{DC64B6E4-DC0F-43BD-B4F5-F22385DCF055}{DC9EF677-1AA3-45A7-8ACD-303A5202D0DC}{E6302665-416B-44FA-BE33-4E15916BA101}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F8413DCB-2248-4935-BFE9-315F397E5110}{FBDD7DD6-4A25-40B7-9A1A-ECC3D1172447}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.gdbindexes0000644003401500001440000000047613614004466032230 0ustar rouaultusers FDO_ObjectIDObjectIDFDO_UUIDUUIDCatRelsByOriginIDOriginIDCatRelsByDestinationIDDestID CatRelsByTypeType././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByBackwardLabel.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByB0000644003401500001440000001002613614004466032701 0ustar rouaultusers    Child Folder Of Contained In FeatureDataset Contained In Folder Contained in Dataset Contained in Dataset Dataset Of Sync Dataset Dataset of Replicated Dataset Destination Of Participates In Geometric Network Participates In Network Dataset Participates In Network Dataset Participates In Parcel Fabric Participates In Parcel Fabric Participates In Replica Participates In Sync Replica Participates In Terrain Participates In Topology Represented Feature Class gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.gdbtablx0000644003401500001440000001204013614004466031672 0ustar rouaultusers&fk= ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByName.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000007.CatRelTypesByN0000644003401500001440000001002613614004466032715 0ustar rouaultusers     DatasetInFeatureDataset DatasetInFolder DatasetOfReplicaDataset DatasetOfSyncDataset DatasetsRelatedThrough DomainInDataset FeatureClassInGeometricNetwork FeatureClassInNetworkDataset FeatureClassInParcelFabric FeatureClassInTerrain FeatureClassInTopology FolderInFolder ItemInFolder ReplicaDatasetInReplica RepresentationOfFeatureClass SyncDatasetInSyncReplica TableInNetworkDataset TableInParcelFabric ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByOriginID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByOrigi0000644003401500001440000001002613614004466032726 0ustar rouaultusers{D64ED042-C809-4F9F-8ABE-121F87B2F1A4}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.gdbtable0000644003401500001440000000053213614004466031644 0ustar rouaultusers >Z(>IDName FileFormatGDB_SystemCatalog GDB_DBTuneGDB_SpatialRefs GDB_Items GDB_ItemTypesGDB_ItemRelationshipsGDB_ItemRelationshipTypesGDB_ReplicaLog polygonArcs1polygonArcsZM1gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a0000000a.spx0000644003401500001440000001002613614004466030771 0ustar rouaultusers```` a a a a a a aaaaa@gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000001.gdbindexes0000644003401500001440000000015613614004466032216 0ustar rouaultusersFDO_IDID TablesByName LOWER(Name)././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByType.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000006.CatRelsByType.0000644003401500001440000001002613614004466032654 0ustar rouaultusers{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb/a00000004.spx0000644003401500001440000001002613614004466030714 0ustar rouaultusers@ gdalautotest-3.0.4/ogr/data/buggymultipoly.shx0000644003401500001440000000015413614004466021154 0ustar rouaultusers' 6Y@Y@@2gdalautotest-3.0.4/ogr/data/AC1018_signature.dwg0000644003401500001440000000000713614004466020712 0ustar rouaultusersAC1018 gdalautotest-3.0.4/ogr/data/hatch.dxf0000644003401500001440000000224113614004466017125 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 HATCH 5 43 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 SOLID 70 1 71 0 91 1 92 1 93 4 72 2 10 2.0 20 0.5 40 0.5 50 90.0 51 270.0 73 1 72 2 10 2.5 20 0.0 40 0.5 50 180.0 51 0.0 73 1 72 2 10 3.0 20 0.5 40 0.5 50 270.0 51 90.0 73 1 72 2 10 2.5 20 1.0 40 0.5 50 0.0 51 180.0 73 1 97 0 75 0 76 1 98 0 0 HATCH 5 44 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 SOLID 70 1 71 0 91 1 92 1 93 4 72 2 10 0.0 20 0.5 40 0.5 50 90.0 51 270.0 73 0 72 2 10 0.5 20 1.0 40 0.5 50 180.0 51 0.0 73 0 72 2 10 1.0 20 0.5 40 0.5 50 270.0 51 90.0 73 0 72 2 10 0.5 20 0.0 40 0.5 50 0.0 51 180.0 73 0 97 0 75 0 76 1 98 0 0 HATCH 5 43 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 SOLID 70 1 71 0 91 1 92 1 93 3 72 1 10 -1.0 20 -1.0 11 -1.0 21 0.0 72 1 10 -1.0 20 0.0 11 0.0 21 0.0 72 1 10 0.0 20 0.0 11 -1.0 21 -1.0 97 0 75 0 76 1 98 0 0 ENDSEC 0 SECTION 0 EOF gdalautotest-3.0.4/ogr/data/curves.gdb/0000755003401500001440000000000013614004466017376 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/curves.gdb/a00000009.gdbtablx0000644003401500001440000001204013614004466022135 0ustar rouaultusers4gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.gdbindexes0000644003401500001440000000113213614004466022460 0ustar rouaultusers FDO_ObjectIDObjectIDCatRelTypesByUUIDUUIDCatRelTypesByOriginItemTypeIDOrigItemTypeIDCatRelTypesByDestItemTypeIDDestItemTypeIDCatRelTypesByNameNameCatRelTypesByForwardLabel ForwardLabelCatRelTypesByBackwardLabel BackwardLabelgdalautotest-3.0.4/ogr/data/curves.gdb/a00000006.gdbtablx0000644003401500001440000001204013614004466022132 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.gdbtable0000644003401500001440000000471013614004466022115 0ustar rouaultusers (ObjectIDUUID &OrigItemTypeID &DestItemTypeID &Name ForwardLabel BackwardLabel IsContainmentpsqAofqsKQ & xsp,J",[FeatureClassInGeometricNetworkSpatially Manages Feature Class!Participates In Geometric Networkix4CGNo>xeE9ӱ(mM&Nag}DatasetInFolderContains DatasetContained in DatasetsqyٷAA7>#jeXE#mѠ{G(mM&Nag}DatasetOfSyncDatasetReplicated DatasetDataset Of Sync Dataset )BRqvf%CtB FgN xsp,J",[FeatureClassInTopologySpatially Manages Feature ClassParticipates In Topology|3"нELB[k{!قGC0M(mM&Nag}DatasetOfReplicaDatasetReplicated DatasetDataset of Replicated DatasetD3K6N> xsp,J",[ jOF=RepresentationOfFeatureClassFeature Class RepresentationRepresented Feature Classv|8(D|MA`1ge[Mt#SeXE#mѠ{GSyncDatasetInSyncReplica Sync DatasetParticipates In Sync Replicac+ 2Md#b}qwO%c1 xsp,J",[FeatureClassInNetworkDatasetSpatially Manages Feature ClassParticipates In Network Datasets_xTC<4:~i3_cI s;͝xQLg+eTableInParcelFabric Manages TableParticipates In Parcel Fabricv|2FxeE9ӱխ'B?3 ItemInFolder Contains ItemContained In FolderwpFHiO?}qwO%c1;͝xQLg+eTableInNetworkDataset Manages TableParticipates In Network Datasetc[rR4IU-g"(mM&Nag}(mM&Nag}DatasetsRelatedThrough Origin OfDestination Ofhۊ1+MRC(mM&Nag}7fHJ(xeE9ӱo>xeE9ӱFolderInFolderParent Folder OfChild Folder Of[:XQ5Aq8i3_cI s xsp,J",[FeatureClassInParcelFabricSpatially Manages Feature ClassParticipates In Parcel Fabricgdalautotest-3.0.4/ogr/data/curves.gdb/a00000001.gdbtablx0000644003401500001440000001204013614004466022125 0ustar rouaultusers j.>gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByForwardLabel.atx0000644003401500001440000001002613614004466026120 0ustar rouaultusers    Contains Dataset Contains Dataset Contains Domain Contains Item Feature Class Representation Manages Table Manages Table Origin Of Parent Folder Of Replicated Dataset Replicated Dataset Replicated Dataset Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Sync Dataset gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByUUID.atx0000644003401500001440000001002613614004466024322 0ustar rouaultusers   {0D10B3A7-2F64-45E6-B7AC-2FC27BF2133C}{17E08ADB-2B31-4DCD-8FDD-DF529E88F843}{55D2F4DC-CB17-4E32-A8C7-47591E8C71DE}{583A5BAA-3551-41AE-8AA8-1185719F3889}{5DD0C1AF-CB3D-4FEA-8C51-CB3BA8D77CDB}{5F9085E0-788F-4354-AE3C-34C83A7EA784}{725BADAB-3452-491B-A795-55F32D67229C}{79CC71C8-B7D9-4141-9014-B6373E236ABB}{8DB31AF1-DF7C-4632-AA10-3CC44B0C6914}{908A4670-1111-48C6-8269-134FDD3FE617}{A1633A59-46BA-4448-8706-D8ABE2B2B02E}{B32B8563-0B96-4D32-92C4-086423AE9962}{CC28387C-441F-4D7C-A802-41A160317FE0}{D022DE33-45BD-424C-88BF-5B1B6B957BD3}{D088B110-190B-4229-BDF7-89FDDD14D1EA}{DC739A70-9B71-41E8-868C-008CF46F16D7}{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}{E79B44E3-F833-4B12-90A1-364EC4DDC43E}&gdalautotest-3.0.4/ogr/data/curves.gdb/a00000001.TablesByName.atx0000644003401500001440000001002613614004466023441 0ustar rouaultusers  gdb_dbtune gdb_itemrelationships gdb_itemrelationshiptypes gdb_items gdb_itemtypes gdb_replicalog gdb_spatialrefs gdb_systemcatalog line polygon gdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.CatItemTypesByParentTypeID.atx0000644003401500001440000001002613614004466026236 0ustar rouaultusers"   " !{00000000-0000-0000-0000-000000000000}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"gdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.FDO_UUID.atx0000644003401500001440000001002613614004466022374 0ustar rouaultusers{29F0EEC7-5F30-48C4-A83C-CDE1A1E2D258}{2CFF5817-03A0-488F-8CA3-5C54D1FA9809}{ACEE0A2C-38A8-4DBA-8E4A-94737B7E7D5E}{EC135AF0-B580-42B4-BB54-26CF98DEDE2C}&gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByBackwardLabel.atx0000644003401500001440000001002613614004466026232 0ustar rouaultusers    Child Folder Of Contained In FeatureDataset Contained In Folder Contained in Dataset Contained in Dataset Dataset Of Sync Dataset Dataset of Replicated Dataset Destination Of Participates In Geometric Network Participates In Network Dataset Participates In Network Dataset Participates In Parcel Fabric Participates In Parcel Fabric Participates In Replica Participates In Sync Replica Participates In Terrain Participates In Topology Represented Feature Class gdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.gdbindexes0000644003401500001440000000045013614004466022460 0ustar rouaultusers FDO_ObjectIDObjectIDCatItemTypesByUUIDUUIDCatItemTypesByParentTypeID ParentTypeIDCatItemTypesByNameNamegdalautotest-3.0.4/ogr/data/curves.gdb/a00000009.gdbtable0000644003401500001440000000271413614004466022121 0ustar rouaultusers(OBJECTIDSHAPE"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]yydAj@j@EN^JC>MbP?MbP?pf @0.v,'C@fi/(@iXH@433333@ SHAPE_Length SHAPE_AreaTBп ő ۛۛ| @XwG@%C @?1?lZ  ؔ ǫ۫˖f\e!@(; H@! 1D,@k}m?xc?>"Al@t9 @ډ 渌 ٠ک ӱ 񩧖¼փ򐒢 ̊ʖ {EW#@4*tF@2*в@A}v= F@^6p@#5E@/@:\M9oF@I@>F@M(Ym8)@0=a!@ Е ̼עʿל戏 ͓'@NE@+%@cD@2v S"@uLD@A(@0-5"@@ ɇ ߺ ώ ֪Уݫ֚Ⱦ;Ў됋 Ϋ骗 Áȅ卣ͱƓʛ,ցuE&@vPD@}@?l4qeD@ ;N`@2fE@g @;RD@;tK(>IDName FileFormatGDB_SystemCatalog GDB_DBTuneGDB_SpatialRefs GDB_Items GDB_ItemTypesGDB_ItemRelationshipsGDB_ItemRelationshipTypesGDB_ReplicaLog polygon linegdalautotest-3.0.4/ogr/data/curves.gdb/a00000009.gdbindexes0000644003401500001440000000016413614004466022466 0ustar rouaultusers FDO_OBJECTIDOBJECTID FDO_SHAPESHAPEgdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByName.atx0000644003401500001440000001002613614004466024434 0ustar rouaultusers   DatasetInFeatureDataset DatasetInFolder DatasetOfReplicaDataset DatasetOfSyncDataset DatasetsRelatedThrough DomainInDataset FeatureClassInGeometricNetwork FeatureClassInNetworkDataset FeatureClassInParcelFabric FeatureClassInTerrain FeatureClassInTopology FolderInFolder ItemInFolder ReplicaDatasetInReplica RepresentationOfFeatureClass SyncDatasetInSyncReplica TableInNetworkDataset TableInParcelFabric gdalautotest-3.0.4/ogr/data/curves.gdb/a00000003.gdbtablx0000644003401500001440000001204013614004466022127 0ustar rouaultusers$ gdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.CatItemTypesByName.atx0000644003401500001440000003002613614004466024610 0ustar rouaultusersSchematic Dataset    " ! AbstractTable Catalog Dataset Coded Value Domain Dataset Domain Extension Dataset Feature Class Feature Dataset Folder Geometric Network Historical Marker Item Mosaic Dataset Network Dataset Parcel Fabric Range Domain Raster Catalog Raster Dataset Relationship Class Replica Replica Dataset Representation Class Resource Schematic Dataset  Survey Dataset Sync Dataset Sync Replica Table Terrain Tin Toolbox Topology Workspace Workspace Extension "gdalautotest-3.0.4/ogr/data/curves.gdb/a00000002.gdbtable0000644003401500001440000000400713614004466022107 0ustar rouaultusers#e(eKeyword  ParameterName  ConfigString6DEFAULTSUI_TEXT#The default datafile configuration. DEFAULTSCHARACTER_FORMATUTF8%DEFAULTSGEOMETRY_FORMAT Compressed"DEFAULTSGEOMETRY_STORAGEInLineDEFAULTS BLOB_STORAGEInLineDEFAULTS MAX_FILE_SIZE1TB DEFAULTSRASTER_STORAGEInLine9 TEXT_UTF16UI_TEXT$The UTF16 text format configuration.# TEXT_UTF16CHARACTER_FORMATUTF16HMAX_FILE_SIZE_4GBUI_TEXT,The 4GB maximum datafile size configuration.%MAX_FILE_SIZE_4GB MAX_FILE_SIZE4GBLMAX_FILE_SIZE_256TBUI_TEXT.The 256TB maximum datafile size configuration.)MAX_FILE_SIZE_256TB MAX_FILE_SIZE256TBHGEOMETRY_UNCOMPRESSEDUI_TEXT(The Uncompressed Geometry configuration.4GEOMETRY_UNCOMPRESSEDGEOMETRY_FORMAT UncompressedBGEOMETRY_OUTOFLINEUI_TEXT%The Outofline Geometry configuration./GEOMETRY_OUTOFLINEGEOMETRY_STORAGE OutOfLine:BLOB_OUTOFLINEUI_TEXT!The Outofline Blob configuration.'BLOB_OUTOFLINE BLOB_STORAGE OutOfLineTGEOMETRY_AND_BLOB_OUTOFLINEUI_TEXT.The Outofline Geometry and Blob configuration.8GEOMETRY_AND_BLOB_OUTOFLINEGEOMETRY_STORAGE OutOfLine4GEOMETRY_AND_BLOB_OUTOFLINE BLOB_STORAGE OutOfLineFTERRAIN_DEFAULTSUI_TERRAIN_TEXT#The terrains default configuration.-TERRAIN_DEFAULTSGEOMETRY_STORAGE OutOfLine)TERRAIN_DEFAULTS BLOB_STORAGE OutOfLineTMOSAICDATASET_DEFAULTSUI_MOSAIC_TEXT,The Outofline Raster and Blob configuration.1MOSAICDATASET_DEFAULTSRASTER_STORAGE OutOfLine/MOSAICDATASET_DEFAULTS BLOB_STORAGE OutOfLineNMOSAICDATASET_INLINEUI_MOSAIC_TEXT(The mosaic dataset inline configuration.,MOSAICDATASET_INLINECHARACTER_FORMATUTF81MOSAICDATASET_INLINEGEOMETRY_FORMAT Compressed.MOSAICDATASET_INLINEGEOMETRY_STORAGEInLine*MOSAICDATASET_INLINE BLOB_STORAGEInLine(MOSAICDATASET_INLINE MAX_FILE_SIZE1TB,MOSAICDATASET_INLINERASTER_STORAGEInLinegdalautotest-3.0.4/ogr/data/curves.gdb/a00000003.gdbindexes0000644003401500001440000000005213614004466022454 0ustar rouaultusersFDO_IDIDgdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.CatItemsByPhysicalName.atx0000644003401500001440000001002613614004466025440 0ustar rouaultusers LINE POLYGON WORKSPACE gdalautotest-3.0.4/ogr/data/curves.gdb/a0000000a.gdbindexes0000644003401500001440000000016413614004466022536 0ustar rouaultusers FDO_OBJECTIDOBJECTID FDO_SHAPESHAPEgdalautotest-3.0.4/ogr/data/curves.gdb/gdb0000644003401500001440000000000413614004466020047 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/curves.gdb/a0000000a.gdbtablx0000644003401500001440000001204013614004466022205 0ustar rouaultusersU s!gdalautotest-3.0.4/ogr/data/curves.gdb/a0000000a.spx0000644003401500001440000001002613614004466021232 0ustar rouaultusers              @gdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.gdbtablx0000644003401500001440000001204013614004466022130 0ustar rouaultusers~agdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.gdbindexes0000644003401500001440000000046613614004466022466 0ustar rouaultusers FDO_ObjectIDObjectID FDO_ShapeShapeFDO_UUIDUUIDCatItemsByTypeTypeCatItemsByPhysicalName PhysicalNamegdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.spx0000644003401500001440000001002613614004466021155 0ustar rouaultusers@gdalautotest-3.0.4/ogr/data/curves.gdb/a00000006.CatRelsByDestinationID.atx0000644003401500001440000001002613614004466025407 0ustar rouaultusers{ACEE0A2C-38A8-4DBA-8E4A-94737B7E7D5E}{EC135AF0-B580-42B4-BB54-26CF98DEDE2C}&gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByOriginItemTypeID.atx0000644003401500001440000001002613614004466026701 0ustar rouaultusers    {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5B966567-FB87-4DDE-938B-B4B37423539D}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}&gdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.gdbtable0000644003401500001440000000341313614004466022112 0ustar rouaultusers"Z (ZObjectIDUUID & ParentTypeID &Name2fqsKQ & (mM&Nag}Geometric Network.b!4nG*i9(mM&Nag} AbstractTable0IqstWBrN20(mM&Nag}Feature Dataset2՞fG?aq(mM&Nag}Schematic Dataset'o>xeE9ӱխ'B?3Folder-eXE#mѠ{G(mM&Nag} Sync Dataset-ge[Mt#S(mM&Nag} Sync Replica0}qwO%c1&)w]GOBNetwork Dataset(NbC@E(mM&Nag}Replica&;͝xQLg+eb!4nG*i9Table.i3_cI s&)w]GOB Parcel Fabric2dܽC#U(mM&Nag}Historical Marker05{xJOIHP [X&)w]GOBCatalog Dataset0!قGC0M(mM&Nag}Replica Dataset$}%J@$G(mM&Nag}Tin)Rqvf%CtB FgN(mM&Nag}Topology)(p%N|^խ'B?3Resource(7u5vd3Hx<|(&)w]GOBTerrain. xsp,J",[b!4nG*i9 Feature Class36.~L8Ni7fHJ(E\羴7fHJ(MbP?MbP?GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]yydAj@j@EN^JC>MbP?MbP?gdalautotest-3.0.4/ogr/data/curves.gdb/a00000002.gdbtablx0000644003401500001440000001204013614004466022126 0ustar rouaultusers#>`T}F~5`,v,aK}gdalautotest-3.0.4/ogr/data/curves.gdb/a00000001.gdbindexes0000644003401500001440000000015613614004466022457 0ustar rouaultusersFDO_IDID TablesByName LOWER(Name)gdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.CatItemTypesByUUID.atx0000644003401500001440000001002613614004466024474 0ustar rouaultusers" !     "{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{35B601F7-45CE-4AFF-ADB7-7702D3839B12}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5B966567-FB87-4DDE-938B-B4B37423539D}{5ED667A3-9CA9-44A2-8029-D95BF23704B9}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{77292603-930F-475D-AE4F-B8970F42F394}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{787BEA35-4A86-494F-BB48-500B96145B58}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8C368B12-A12E-4C7E-9638-C9C64E69E98F}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{B606A7E1-FA5B-439C-849C-6E9C2481537B}{C29DA988-8C3E-45F7-8B5C-18E51EE7BEB4}{C673FE0F-7280-404F-8532-20755DD8FC06}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D5A40288-029E-4766-8C81-DE3F61129371}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{DB1B697A-3BB6-426A-98A2-6EE7A4C6AED3}{DC64B6E4-DC0F-43BD-B4F5-F22385DCF055}{DC9EF677-1AA3-45A7-8ACD-303A5202D0DC}{E6302665-416B-44FA-BE33-4E15916BA101}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F8413DCB-2248-4935-BFE9-315F397E5110}{FBDD7DD6-4A25-40B7-9A1A-ECC3D1172447}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"gdalautotest-3.0.4/ogr/data/curves.gdb/a00000007.CatRelTypesByDestItemTypeID.atx0000644003401500001440000001002613614004466026351 0ustar rouaultusers    {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}&gdalautotest-3.0.4/ogr/data/curves.gdb/a00000006.gdbindexes0000644003401500001440000000047613614004466022471 0ustar rouaultusers FDO_ObjectIDObjectIDFDO_UUIDUUIDCatRelsByOriginIDOriginIDCatRelsByDestinationIDDestID CatRelsByTypeTypegdalautotest-3.0.4/ogr/data/curves.gdb/a0000000a.gdbtable0000644003401500001440000000306313614004466022167 0ustar rouaultusers 3(OBJECTIDSHAPE"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]yydAj@j@EN^JC>MbP?MbP?_Q`WpQqA@'(C$@Rj<[H@@ SHAPE_Length7-ײ ɮІ ̜uh @bX NJūᅄ.ˉ׽Vc@G@n @LB͘ ̖̖ǩؿoqF@V @dZ嘜 ⾒3y.ȵW@БSBC@tq'mU ?+(?(uv ?>XP%@`Vղ ڮ ´ݠ#6a#?tHF@&$a#?lF@x+ @ˢ  Ś ꈛ Ú $)?$5E@F:l@zE@~Y?b#6aE@h h @~YD@\<œ[@M!D@hlMg?vTD@GO(@lb򿎋 ܋Ӗ?RZ6}qB@ R?sp4&@J?>? ՜ ЗրAr-k?4xSD@*w̿y D@07? V\:D@,~у @lbƻ ڒ ͬȘŮޛټ ȱޏ 6i~:T9'W@uW@J/O@Jq]E?>@@@gdalautotest-3.0.4/ogr/data/curves.gdb/a00000004.gdbtable0000644003401500001440000002072713614004466022120 0ustar rouaultusers+!(RObjectIDUUID &Type &Name PhysicalNamePathDatasetSubtype1DatasetSubtype2 DatasetInfo1 DatasetInfo2URL Definition  Documentation ItemInfo  PropertiesDefaultsShape"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.Aj@j@>MbP?MbP?~jt??(@+x)0_HxeE9ӱ\xX,H\T sƀrO@2 u] Workspace WORKSPACE\falseesriLocalDatabaseWorkspace300+@Z쀵BT&Ϙ, xsp,J",[polygonPOLYGON\polygonSHAPE\polygonpolygonfalseesriDTFeatureClass3falsefalse10.0trueOBJECTIDOBJECTIDOBJECTIDesriFieldTypeOIDfalsetruetruefalseSHAPEesriFieldTypeGeometrytruetruetrueSHAPE_LengthesriFieldTypeDoubletruetruefalseSHAPE_AreaesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonSHAPEfalsefalsetrueSHAPE_AreaSHAPE_LengthGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],AUTHORITY["EPSG",4326]]-400-400999999999.99999988-10000010000-100000100008.983152841195215e-0090.0010.001true-18043264326falsefalseC @, 8MJs{~}^ xsp,J",[lineLINE\lineSHAPE\linelinefalseesriDTFeatureClass4falsefalse10.0trueOBJECTIDOBJECTIDOBJECTIDesriFieldTypeOIDfalsetruetruefalseSHAPEesriFieldTypeGeometrytruetruetrueSHAPE_LengthesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolylineSHAPEfalsefalsetrueSHAPE_LengthGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],AUTHORITY["EPSG",4326]]-400-400999999999.99999988-10000010000-100000100008.983152841195215e-0090.0010.001true-18043264326falsefalsegdalautotest-3.0.4/ogr/data/curves.gdb/a00000005.gdbtablx0000644003401500001440000001204013614004466022131 0ustar rouaultusers""XEo ?gVDuGzgdalautotest-3.0.4/ogr/data/all_geoms.mif0000644003401500001440000000140513614004466017773 0ustar rouaultusersVersion 300 Charset "Neutral" Delimiter "," Columns 0 Data Point 0 1 Point 2 3 Symbol("bla",0,1,2) Point 4 5 Symbol(99,1,2,"foo",1,30.0) Line 0 1 2 3 Pline 2 0 1 2 3 Pline 2 0 1 2 3 PLINE MULTIPLE 2 2 0 1 2 3 2 3 4 5 6 Pen(1,2,3) Smooth Rect -1 -1 1 1 Pen(1,2,3) Brush(1,2,3) RoundRect -1 -1 1 1 1 Pen(1,2,3) Brush(1,2,3) Ellipse -1 -1 1 1 Pen(1,2,3) Brush(1,2,3) Arc -1 -1 1 1 0 360 Pen(1,2,3) Arc -1 -1 1 1 0 360 Text "text" 0 1 2 3 Font("bla",1,2,65535,65535) Spacing 2.0 Justify Center Angle 30.0 Label Line Simple 10.0 20.0 MultiPoint 2 0 1 2 3 Region 1 4 0 1 1 1 1 0 0 1 COLLECTION 3 Region 1 4 0 1 1 1 1 0 0 1 Line 0 1 2 3 MultiPoint 2 0 1 2 3 gdalautotest-3.0.4/ogr/data/ionic_wfs.gml0000644003401500001440000000263213614004466020020 0ustar rouaultusers 4.2296,51.0741 4.7276,51.4863 Aartselaar 44038,511549 44015,511548 43994,511522 43941,511539 43844,511514 43754,511479 43685,511521 43594,511505 43619,511452 43645,511417 4363,511387 437,511346 43749,511298 43808,511229 43819,511205 4379,511185 43728,511167 43617,511175 43604,511151 43655,511125 43746,511143 43886,511154 43885,511178 43928,511186 43977,511217 4404,511223 44008,511229 44099,51131 44095,511335 44106,51135 44127,511379 44124,511435 44137,511455 44105,511467 44098,511484 44086,511499 4407,511506 44067,511535 44038,511549 gdalautotest-3.0.4/ogr/data/esrilinestring.json0000644003401500001440000000062413614004466021272 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolyline", "fields" : [ ], "features" : [ { "geometry" : { "paths" : [ [ [ 2, 49 ], [ 3, 50 ] ] ] }, "attributes" : { } } ] } gdalautotest-3.0.4/ogr/data/test.bna0000644003401500001440000000423113614004466016775 0ustar rouaultusers"PID2","SID2",26 589.032,394.825 693.43,294.539 454.727,181.498 464.879,323.694 589.032,394.825 333.112,277.228 374.816,254.061 401.979,196.466 227.822,162.04 182.757,246.577 333.112,277.228 589.032,394.825 279.884,238.897 320.834,236.685 318.57,231.478 277.552,195.62 241.129,213.582 279.884,238.897 589.032,394.825 554.53,339.834 607.689,329.356 617.498,295.776 527.298,263.627 480.93,280.743 554.53,339.834 589.032,394.825 "PID1","SID1",45 241.198,375.757 441.763,361.57 518.038,594.81 190.851,567.672 249.84,426.518 241.198,375.757 366.654,500.056 372.69,490.294 372.69,470.12 355.336,485.088 366.654,500.056 241.198,375.757 192.771,469.6 202.168,464.198 195.172,449.555 186.118,459.187 192.771,469.6 241.198,375.757 195.172,491.075 216.093,456.714 194.143,428.275 178.984,460.489 195.172,491.075 241.198,375.757 335.65,527.324 357.668,525.697 348.477,509.492 322.274,513.137 335.65,527.324 241.198,375.757 364.253,448.124 391.347,467.908 376.6,524.46 331.054,483.917 347.036,474.48 364.253,448.124 241.198,375.757 359.314,419.945 403.625,420.856 433.12,456.584 396.355,536.565 328.585,545.09 278.238,466.996 359.314,419.945 241.198,375.757 "PID3","SID3",-3 224.598,307.425 333.043,341.461 396.629,304.952 "PID5","SID5",1 573.736,476.563 "PID4","SID4",1 532.991,429.121 "PID6","SID6",2 200,300 100,0 "PID7","SID7",5 0,0 1,0 1,1 0,1 0,0 "PID8","SID8",11 0.0000000000,0.0000000000 0.0000000000,10.0000000000 10.0000000000,10.0000000000 10.0000000000,0.0000000000 0.0000000000,0.0000000000 2.0000000000,2.0000000000 2.0000000000,8.0000000000 8.0000000000,8.0000000000 8.0000000000,2.0000000000 2.0000000000,2.0000000000 0.0000000000,0.0000000000 "PID9","SID9",4 0.0000000000,0.0000000000 0.0000000000,10.0000000000 10.0000000000,10.0000000000 10.0000000000,0.0000000000 "PID10","SID10",11 0.0000000000,0.0000000000 0.0000000000,10.0000000000 10.0000000000,10.0000000000 10.0000000000,0.0000000000 0.0000000000,0.0000000000 0.0000000000,0.0000000000 0.0000000000,10.0000000000 10.0000000000,10.0000000000 10.0000000000,0.0000000000 0.0000000000,0.0000000000 0.0000000000,0.0000000000gdalautotest-3.0.4/ogr/data/testpoly.idm0000644003401500001440000000033513614004466017713 0ustar rouaultusers testpoly.ind 0 FID 1 gdalautotest-3.0.4/ogr/data/testshp/0000755003401500001440000000000013614004466017026 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testshp/poly.shx0000644003401500001440000000026413614004466020537 0ustar rouaultusers' Z 1A @+RA@eA-RA2H@gdalautotest-3.0.4/ogr/data/testshp/poly.dbf0000644003401500001440000000102113614004466020460 0ustar rouaultusers_ (AREAN EAS_IDN PRFEDEAC 215229.266 16835043411 247328.172 17935043423 261752.781 17135043414 547597.188 17335043416 15775.758 17235043415 101429.977 16935043412 268597.625 16635043409 1634833.375 15835043369 596610.313 16535043408 5268.813 17035043413 gdalautotest-3.0.4/ogr/data/testshp/poly.PRJ0000644003401500001440000000063713614004466020374 0ustar rouaultusersPROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["D_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]]gdalautotest-3.0.4/ogr/data/testshp/poly.shp0000644003401500001440000001074413614004466020533 0ustar rouaultusers'  1A @+RA@eA-RA|FA .-RARA-RA`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RA<A3-RA LA-RA`LA-RA LA-RAGA -RA|FA`-RA(GA-RA`/IA -RA`HA`m-RA GAC-RACAC-RABA C-RAAAB-RA?A4-RA@s?A3-RA M>AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RA@7>A@,RA@cMA`-RA`/IA -RAIA-RAJA-RAKA`-RANLA-RALA-RA@cMAt-RAKMA`^-RA LA\-RAJAW-RA\JAR-RAGA@0-RA GA--RA sFA&-RAWFA -RAFA-RA EA -RA DA`-RACDA`,RA@@A@,RA@7>A+-RA@s?A3-RA?A4-RAAAB-RABA C-RACAC-RA GAC-RA`HA`m-RA`/IA -RA 1A,RA'AAv-RA<Av-RA<Am-RA@7>A+-RA@@A@,RA'AA@,RA `@A,RA?A ,RA*>A,RA <A,RA:A,RA@s8A ,RA 4A,RA3A`,RA3A ,RA@3A,RA3A,RA4A`,RAl7A-RA t6A -RA`6A-RA5A-RA3A,RA@ 3A,RA 1A3-RA:Ak-RA<Av-RAH<A+-RA@s?A@o-RA<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RACDA`,RANA`^-RAKMA`^-RA AMAL-RANA .-RAKA-RAHA-RAGA-RA``FA@ -RA`FA,RACDA`,RA DA`-RA EA -RAFA-RAWFA -RA sFA&-RA GA--RAGA@0-RA\JAR-RAJAW-RA LA\-RAKMA`^-RAKA,RAnWAU-RARAE-RAdTAU-RATA=-RAtUA(-RA@VA-RAWA-RA`2UA -RArTA@-RA TA-RAnWA`,RAVA`,RA`VA,RA`=VA`,RA!UA@,RASA,RA QA@,RA@OA,RAtNA,RA@OA,RAPA ,RAPA,RA@^QA@,RA^QA ,RA PA-RANA-RAwMA-RA,LA-RA@KA-RAKA-RANA .-RARAE-RADA @+RA@eAQ-RA=@VA-RAWA-RAXA%-RA hZA,-RAZA--RAa[A2-RA]AB-RA`]AP-RA@`A 3-RA`,`A"-RAbA 2-RAbA@B-RAcAI-RA dAM-RAdAQ-RAeA<-RA`weA`'-RA@eA`-RAeA-RA@M_A,RA@^A`,RA^A,RA^A,RA^A,RA]A,RA]A ,RA`^A,RA]AZ,RA@]AR,RA?\A`<,RAYA,RA@XA,RAWA +RA9VA+RA@_UA,RAgPA +RAvOA`+RAOA@+RA` OA+RAFPA`+RAPAm+RA`'OAT+RA@IA @+RA IA@D+RAGA`+RADA2,RA@DAC,RAMA ,RA@OA,RA QA@,RASA,RA!UA@,RA`=VA`,RA`VA,RAVA`,RAnWA`,RA TA-RArTA@-RA`2UA -RAWA-RA@VA-RA @@A2,RA^QA-RAHA-RAKA-RA@KA-RA,LA-RAwMA-RANA-RA PA-RA^QA ,RA@^QA@,RAPA,RAPA ,RA@OA,RAtNA,RA@OA,RAMA ,RA@DAC,RADA2,RACA 6,RAKCAU,RA0CA],RABAq,RAAA,RA'AA@,RA@@A@,RACDA`,RA`FA,RAHA-RA @``FA,RAHA-RAHA-RA`FA,RA``FA@ -RAGA-RAHA-RAgdalautotest-3.0.4/ogr/data/100_test.sxf0000644003401500001440000010134413614004466017420 0ustar rouaultusersSXFMh201312260.N-40-001100tGfWAp7BɪcA:WA ScA'q[WA*M"@̺cAW:WA%y$cA+ ?Pi1(?$F?Pi1(?$F?ųtLDp?+ ?ųtLDp?20131226PtM9U201312264@l(#ѵ?ADAT40.N-40-001N4 #k,וWAZ8~cA]ޕWAcAwh)WAx%>cA0qTWA~-#cAgWA.cAbʓWA$OcAWA՗ڹcAq;WAeǹcAo'qWAafcA.հWAR2cA8WA뙥RcAz1sWA!/>cA WA]cAɔWAkB PcA`LWAYcAF_WA3jNhcA5.WARp_scAWA^S~cA *vWAc}芹cA&ġWA>cAn=(㏓WAoÅcA5HoWA|X)cAo+JMWAQ=&cAV,WA›cA2WAHEʹcA{#WAʹcAh)WAoɹcA8SWASpcA>cWAcAf|WA EcA׷WAo\᰹cAe~WA|cAޭWAJWcAܹcAc"5WA\ ޹cAWA1cAxi8WAsxcA.WA`cA"Bq WAg)cAbCWAcAM0#ܒWA+)cAxiᚫWAcA&WAf;)cAv̎xWAX:cA$lWA} cAIUWA cAdꙔWAa끹cATMbWA^S~cArVŔWAT}cA wuBÔWAJDcA:yWAp΋cAQ/iWAh>cA\{WA4ygzcANXWAcA!HWA8cA !HWA ScA*\SWAcA$lWA} cA ~ (Lenta)N \O)G99oWAGOcAb{WA*WMRcA\7.WAZ TcA{“WAAuWcA6ړWAIZcAyWAAH]cAm8ѼWA"nzs`cAadWA֔ccAh;1"WAصIgcA9/WA&ќjcA'I:WAncABWArcAE:.EWAEtcAHWAT wcA|KWA!zcAFNWAKm}cAWRWAwcA"OUWAvucA;XWABËcAMh#\WA4cA$_WAIcA%(McWAm&cAqW5gWAŦcAg"jWACocA#mWAXEcAY7ZpWAΧEcAUg_rWA^r·cAYstWA% ȷcAPuWANͷcAP\JvWAmdѷcAlhwWA~%Z/ַcAUGwWA$!ٷcAZ@wWAwbݷcAْvWA`޸߷cAtWAscA4h+bqWAoIcAlWAY|cA"hLigWANcAP`WAecA}XWA cA=kOWAVcAF'EWA`?cA3سf9WA{cA},WAXŪn#cA"eWAfn-cAqpWAgL7cA7'mNWAcT@cA*WAHcA2WA"PcA=WA^VcAؓWA}[cAQىГWA _cAB=]ɓWAGWccA.ÓWAecAnWAu6gcA8̹WAKgcAfWAZgcA.gWA;fcA XFkWAKYdcAEWAvMacAuݠWAdM^cALWAԎ#ZcA1ߐWA6UcAꯧWAzOcAkq}WAQ^IcAuprWA~VAcAJ`fWA9cA7(ZWAWAQE0cA'4"7WAXycA2J1WAs SXcAÄ,WA3 cA.$(WA cA>d%WAqxcA#WAϕ<cA"pB#WA&;{cA*#WA cAb%WAxcA,X)WA77cAzW .WA)cAA4WA|cAj;WA/cA S@DWAcAy8NWAQ_cA_uYWAݷcAPh#fWAշcAg%tWA]$ ͷcA5ItWAu/ͷcAMmjtWA9dͷcA傶tWAlͷcAOtWA ͷcAӪtWAp(xͷcAtWA?kͷcAjtWA1?c_ͷcAp uWAUͷcA !uWALͷcA$4uWA:DͷcAh8EuWA^S>ͷcAlluWA_0ͷcA%]uWAΗ"ͷcAeI uWAÿͷcAYuYuWA}֐ͷcAuWA Q̷cA.-vWAlu>̷cA'vWAX̷cAq4vWA̷cAaGvWA̷cA_WvWA8y̷cAdvWA̷cA߬.wWA_t˷cA1wWAS'ʷcA xWA ɷcA<kyWAWȷcAzWAMtǷcAJzWAOƷcA;v{WAYķcA_|WA÷cA@|WA.~tcAwAP}WAcART}WAWٽcA gi~WA4/cA(~WAׁ9cA :WA͋cAxIWAZcA"WA TucA8WA  cAmWA^cAtWAcAoWA\cACE}WA>=9OcA ܞaWATYcAPC]~WAW(cA`|WA*cA2%{WAdSJcAEcxWA XOjcA|3vWArcA`v#sWAacASrLoWA89cAd1UkWA#cAȐ}gWAgcA7bWA㭑.cAD]WAVcAvtYWA1ucAnTWA]5LcA=nPWAU )cAr$MWA% cA|WAݡ*fcA\@WAT&*ecABWA|PccA4`EWAacA]xcAJRNWAYcA^"SWAϚO8߹cAOYWAoٹcAh9^WA{ԹcAƾ5cWA)@u,йcAdhWA\r̹cAMlWA0]ɹcAQ#kqWA9ƹcAZuWA;!ŹcA1FzWA:ùcA;|WAùcA{[WAPKRùcA(WA+/ùcA EWAw.B ĹcA7WAdSĹcA^"WA `ŹcAf-- WA\ƹcAjjԧWAǹcAWA]=ȹcAJ2WAn %ʹcA&GǕWAw̹cAlҕWA3bιcA="8tݕWAN8йcAy.WA+ѹcAWAiӹcAWAҮ@չcA'fWAֹcA[WAgiu4عcAP7g WA(GٹcAWO WAJ ڹcAfWA&ܹcAL 7WA(w%ݹcA GWA/\:޹cA!+WA߹cA!'WA6cAbXZWA^,cA WAe|ecA WA(fcA GWA]4.cA!2WA.cA!WAKcAb#WAka@cA9 %WA7,cA&WAMQcA#(WA cA G)WA# cA,tq+*WAUGcAa*WAqcAY7+WAFcA ^+WAPccAXG+WA󽪑cAe*WA+![cADA\*WA]VcA6)WAKcAM*(WA0*VcAE'WAcA$hp%WA[ cA~&##WAWT!cA v] WA"cA ;WAD "cA?)iWA #cA@;WAR$cAWAvRe~%cA w WA1s&cA~WAA"xs'cA(WAwn(cAjWAV)cAѭPWWAʭ**cAP6>WAE*cA>ZWA+cAJWACP1,cAd^0WA >޶,cA ݕWAs(-cABUٕWA -cAW8֕WA-cAڵwZҕWAm.cAG˕WAK.cAӐŕWAՉ)v.cATнWA.cAWANM$&cA99WAR%cAnF6WA(g}$cAHu3WAB#cAp-z1WA"cAY[0WA)!cA4hZ.WA  cAl).WAx:cAU-WAh9cAn8,WA)UcAx,WASLcA,WAcA%j,WA)cA=-WAKݸcA-WAF& cAVL.WATLIcAtUsCWAIcAI p >5]뚗WA7 gcA*ņWA/lcA3sWARAqcANaWAtvcA8PWA!:)q{cA3xAWA@}cAQ\2WA0"GcA $WAŠcA6WAcAfo WA>FcAPiWAcAӦ$WA} cA9WArwcAWAlfcABphWAJcAS?2WAcAѨ3WA`}8cA~t WA*cAtWAE@NcAnWAfq&cA WA,2cACWAqqcApeݖWAsA亹cAiŦږWA.McAM9ؖWAƳ rcA୾֖WAKePĹcAbSԖWAƹcAuҖWA= <ɹcAsіWA`TI˹cA ЖWA^͹cADLXЖWA*֒ιcAf%%ЖWAsϹcA^CЖWA9йcA!1ЖWA|mvѹcA-ҖWAv OҹcAyԖWAT,1ӹcAkזWA3ԹcA:ܖWA܄ չcABWA0jֹcAnWAҷu׹cA PWApعcAVȪWA[$ٹcA8WAwx}?ڹcA#Y WAZ!b۹cA*KaWA>HܹcA0e)"WAݹcA ,WA#oʣ޹cAK6WAz߹cANW@WAG|,cA"|HWA.ZcAG<=PWAoX(cA&XWApcA ^WABIcA\{dWAelcAՕiWA ucAmWA\0cA"XrWApŮcAwWAn߹cAg|WAS޹cAEWANݹcA$WA 61ܹcA^GWAF?uڹcAPZ WAyعcAZsWA{?ֹcA{WAӹcABWAp ѹcA /#WA٠ιcAxWALq˹cAջWA[ȹcA —WAlƹcAs~+&ȗWAUcĹcAL*ΗWAT¹cA$ԗWAecAyٗWA(.cA)XWAu]JcAt*YWAʎecAQ@ZWAgcA.[WAO(~cAb[WA:/cAXo \WA cA#NF\WA—cA:6^\WA6cAS\WA* ecAh-/&\WAͫ=ϋcA00[WAI 5ԉcA[WA6{{[ ώWA cAώWAcAЎWA cA.CЎWAxHcAЎWAّcAЎWA,cA/ZюWAs:KcAEюWA'cA юWAڪ}cA9юWAmMcAlQҎWA㖷cAXҎWA ZcA셜ҎWA 㖷cAcҎWAmMcAA\ӎWAڪ}cAnBFӎWA'cAysӎWAs:KcA?ӎWA,cA:ܼӎWAّcA.ӎWAyHcA၄ӎWA cARԎWAcA4r ԎWA cA`4֎WATcAq׎WAncA׎WA cAi '׎WAw"cABzՎWAC{.'cAX,ӎWAoHd,cA8bUώWAl>2cAUˎWA8cA;IƎWA7?cA _%WAkGcA/s WAhPcA`ZȳWAA%VcAaE WAH~b\cA4\{䪎WAkbcANMWA$?@hcAKGWA!ޱmcAW|ԡWAMZIrcA=WAwcAWA |cAFe坎WANcAЦ𸝎WA"xbcA*\WA9JkcA{VWA$M݃cAwrWA!x֍cAWAJccA:0i WA,)cAyУWA)w*cA 祎WA1ecA'j[PWAٜcAdv, WA cA©=WAqcACqWAecA WATFcA[tݸWAtWA絔cA `{}WAnNcAY5ĄWAcAɊWA潸cAWA༸cA WAp_ܻcAYFWAg9ٺcA}#WAcAu\!WAfcAe!*WA"ȮcAjTWAYJ-cA2WA6"fGcA~EWANOcAmWAWcANWAӀcAqשWA/scAeWAY"cABbWA cA+Y_WAݵcA>R[WAfcA WWAUcAkRWA=tFcA)[%MWA=jcAFWATcAnT?WA\hFcAwO8WAocAþ/WA%jcAS'WA+cA'QRWA% cA? WA# cA[ ώWA cAOpNY7 b,{WAϗN/cA 3iWA^cAb׆mWA^cAg마WA}ncAo闵WA}ncAtNЕWAV:WcA ՕWAV:WcAOWAOƴ 4cAb,{WAϗN/cAIP"s:B뵒WA/xcA?WAa2cA {GWAh rXocAG}WAQcA *vWAc}芹cAWA^S~cA5.WARp_scAF_WA3jNhcA`LWAYcAɔWAkB PcAc*WAPBcA!WA*cAB뵒WA/xcA&A@+ ~` e; )m'WA(6cAK:\WAvDcA.\WAӌEcA#M\WA5]FcA/hl\WATGcAT\WAskHcA\WAHcAԁ\WA%HcAF\WAHcA[]WAskHcA "]WATGcAD8<]WA5]FcA!>S]WAҌEcA i]WAvDcA&:|]WA aCcAN.]WAJAcAݝ]WAD?cAK]WAD=cA^x]WAރ:cAraWA(cAJeWA cAZ7njWAԇ.cA'ooWA^7ScAuuWA'cAQz{WA\>cAV˂WAѿcA9WAgjcA ۜ鑎WA~cASZ9WAocA@k WAb޷cAWA.YطcAdrWAsRӷcAN[WAUAϷcAgWAԐ ˷cAn5ŎWA.?ǷcAiɎWAڦ÷cAUWN\͎WA"cAs#ώWA<[cAV\юWAy<9cAtҎWAcAsDٍҎWAZj4cAYIҎWA:icAfюWA=p?cA{̓ώWA`\1cAo͎WAOOcAʎWA RcA2,1ǎWAݷ9cA O7ĎWA: -cA AWAExcA1V^WA턙McAԠ&WA̐ȮcA hWA&^(cAdXWAcA-WAgcAl'WAYͨcA CWAcAe+JWAtcAycsWALХcAK5WAP|cAVWA 沓cA 6GKWA /cA%ӷWApącA-)WAv "ܣcAeʃWAiܻcAFWA(.cA }WAhcACEyWA݈{3cAşuWA7acA pWA+즷cAtskWA cAfWAXcAk _WA7ѪcADJYWAWAhucAf9WA¦1cA9b4WAfxcAKyP0WA<cAbc,WA^dcAP r)WAcA&WAkrcA$WAWücA.HL#WAۘcAzk"WAcF@scAp!WAugcA WA'ۏcAZSWA[#cAKO"WAh|÷cA^WALH@ŷcA6WA8ǷcA)WA=!eɷcA@6WA:W˷cA WA:YηcA\WA!ѷcA;ILWA vAӷcAUWAxַcA'eqWAw1aطcA4-WAos?۷cAgWADVݷcAxwWA??߷cA%|WAacA .WA_HcANsWAާVcAWAzcA{OWAb;$cAdWAZ cAvWA U`cAWA8*mcAny!WA JcANv`#WAdcAwg&WAb^cA{5*WA cA.WA%>cAQ2WAZcA6WA/cA.zcAT^@A 5gÕWAӞŕwcA5gÕWAI?6cA<ҕWA2}cAWALk/cAQWAX cAޫ WAqcAޫ WAJDcAw6WA@qcASWAݺskcA ؕWA*KjcAƕWA8!"epcA5gÕWAӞŕwcA^@T PG7WA9QBcA?$'WAuZ7cA&Ua(WAn7cAے`(WA(<7cA(WA_ 7cA1](WA6cAWA)WA*.6cA}y)WAn6cA)WAx:6cA0*WA6cAYƽC*WA~5cA|*WAa5cAeh*WA4C`5cA 74>WA%ycA;5?WAAcAR?WA| cA;s?WA~]RcAͷ?WAt!cAD?WA'cA`@WA˵cAXCK@WAgcAFF{@WAlcAv@WA&CcA"@WAxcA=AWAgLcAKxRWAcASWAcAg1SWAbcAeaSWAҗ_cAY$SWA]S9cAoSWA7cAmSWA7^]cA7,TWAiӫcAbTWAcAJTWArcAC+TWAIIcA*UWA$ cAIjWAڴcA'kWAӋecA[YIkWAH!cAYzkWAmycA/kWAAScA;QkWAǝ.cA œkWA cAQ#lWAcA FlWAzӂcAflWAZcA߈WArzjιcA[DWAi=ιcA-7WA-}N(ιcAcAhbhӔWA cAՔWAt[cA֔WAdcA֔WA%cA^I9#֔WAw_cA6֔WAcAM֔WA雹cA4`h֔WAS:ڛcA{֔WAțcA5֔WAyٵcAQ֔WABcAK֔WAcA ~ Reka()`PG VVOWA0cAwWAzcA WAcA!WANAncAv}c"WAcA\J*#WA*ecARd'#WAcA$WAZ7cAI%WAcAoE%WAf+cA<&WA cA8j'WAtH]WAe6RcAO~]WAZYAUcA^WA)WcAW^WAcZcA2^WA=]cAh1^WAH`cArqzWACcAzWADcA;zWA՛cAX@{WA&OcAS{WAcA)t{WABcA?|WAcAbB|WAocA`|WAcӱcA|WAs,cA^|WA{cA"A/}WA#cAuz2WAcAa?WA9[VcA'T{WAZcA_.WA*cAoWA-cA:WAf2cA~WA1qcAĔWA}kcAy0 WA%cAn,WWA-iצcA3WA_IcA|WAucAѯWAcAkBtWAcANWA]cA1>WA/cA0-WA98cA\:CWA+cAeؕWA ncA 鶒WA2VcALcA7_4ޒWAcA;WA߳ιcAuiWAKpιcA`4WAwFιcA)~WAcιcAFcWAZ͹cAnWA|͹cAUWA͹cACWA۩͹cAJ_wWACh͹cA8ޢWAް͹cA/leWAMfw͹cAWAm͹cA2WAHEʹcA`&&#(DϐWA$(OcAKMTאWA3cAyאWA%28cAn [ؐWA؈ l`ccAd}WAvbcAn{WAZacA;(yWA/M~`cAvWA+_cA^WAJcAOY0WAcA~WA*cAL||WA3cA .6zWA2|cAjwWArcAuWAxB;cAsWA|cA~?qWAH4cAloWAM֥cA6mWAץgcAFmkWAcA滱WAΓcA1RWAcAҺ_WAKcA WAKcA.AϧWA9cA哤WA'cA!@C WAϱcA՞5WA3cAWAcA4R*WAkcAڊWAtcA^C]WA@cAWA5/cA WA{cAwNLWAZ=cACWA҈McApeWAcA՟aҐWAHcAHYWA xqC-cA`WWAk<8-cA#cUWAZ.cA9RWA./cA?@OWAA]/cAK: WA~ptcAlgsWAU*cAdB WAt|$cAlܔWA4cAwRWAycAȓlWA߆(|cACWAxȹcAV) E,WAZҹcACߓWA$OcA;AWA;lEcA{}WAd cAz-cAY@TV0?WAa2cAϒWAXMcAۢGWA-rhŸcA(V0ϒWAXMcA 4WA6KqcA3WA5cA( ʰWA֣cA 4WA6KqcA^WAt|$cA]WAycAWA*KjcAe7WA*ScA\UFWAv;cA?g;WAɵcA3WA5cA(@ 82WA cAWAL cA| P A>m0eWA cA٠oWAa cA'EyWANG cA>!䂐WA cAyWAUE cA/^XWA_ cA}WA"cA ̤樐WA^cAr:WA/BcAsFxvWA&cAӗĐWAfFcAK͐WA܊scAR2֐WAcAT?ߐWA"cA!䂐WAcA'EyWAMcA٠oWA{mE cAm0eWAcA9iQ\WA{mE cARWAMcA?IWAcA'x?WAsQPcA5WAѝcA^jt,WA-cAt #WA~cAiWA6ywScAg{WAV׼cAN}ZWA@OcALVWAT3 cA1/sWA('cAJWA<cA'WAF(cAb1ۏWA, cA_ӏWA| cA$qEˏWA:cA\ÏWAbcAD-WANzJcA%WAl^TTcAC۬WA;cA7˥WA1cADWA*04!cA=aWA0`($cA@2 WA`/`(cAx ~WAU!,cA](WA#8/cAកWA,3cAF\{WA7cAQcvWAWC!!ՑWAIcAu. WAecA@ >"xDWA:RcAWPWAccA@ >#\WASmcAiE ݒWAW&lcA@ >$kWA@uѹcAutWAe.¹cA@ +dniWAbCcA5xWA, cA0X%EƚWAQ}cA6& ՕWA4 ހcA0='ٹWAYe:7ϹcAH\k .#WAn޸cA~ 0\k /{$WA/xcA63q/WAWcA0X<GWeWAi%[cAR($|( FKWAړӹcAFKWA`mrcA ~`0n- ţEWA~cAţEWAKEoйcA(sity) ~ (sity)T(P|2 Pؾ WAdJcA&kWA!W'^cA ~R(P|4 pq#WA~0cApq#WAPےcA206.6 ~206.6T($|9 yWASLcAyWA LecA. ~.B @WAB'5˪cA@WA(cA@WAcA@WAcA@WAcA@WAcA@WAcA@WAcA@WAԸcA@WAK+cA~6176000.000000C (WAƑcA(WA(cA(WAcA(WAcA(WAcA(WAcA(WAcA(WAcA(WAԸcA(WAW >cA~6180000.000000D WAcAWA(cAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWAHdPcA~6184000.000000E WAse@ cAWA(cAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWAp)bcA~6188000.000000F WA.`!cAWA(cAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWA}9tcA~6192000.000000G ȢWA=97cAȢWAcAȢWAcAȢWAcAȢWAcAȢWAcAȢWAcAȢWAԸcAȢWAIcA~6196000.000000H WAKMcAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWAYcA~6200000.000000I WA_ bcAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWATicA~6204000.000000J WAvxcAWAcAWAcAWAcAWAcAWAcAWAcAWAԸcAWAycA~6208000.000000`KhWAմVcAhWAcAhWAcAhWAcAhWAcAhWAdbJJcA~6212000.000000pL?ގWA(cA@WA(cA(WA(cAWA(cAWA(cAWA(cALWA(cA~10312000.000000M jvǴWAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcAhWAcA3tCWAcA~10316000.000000N `NWAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcAhWAcAbղWAcA~10320000.000000O 0aWAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcAhWAcAMWAcA~10324000.000000P V9L9WAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcAhWAcAWAcA~10328000.000000Q pWAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcA3 [WAcA~10332000.000000R ՔWAcA@WAcA(WAcAWAcAWAcAWAcAȢWAcAWAcAWAcAWAcAAL5WAcA~10336000.000000S ǍWAԸcA@WAԸcA(WAԸcAWAԸcAWAԸcAWAԸcAȢWAԸcAWAԸcAWAԸcAWAԸcAfetWAԸcA~10340000.000000T TU_ WAȺcA~)WAȺcA~10344000.0000000@pU\WAE&^DcA0@pVta@WAjj{cA0@pWW^xWAM̷cA0@pX(\祐WA`cA@ @pYLcA:yWAp΋cA wuBÔWAJDcArVŔWAT}cATMbWA^S~cAdꙔWAa끹cAIUWA cA$lWA} cA*\SWAcA !HWA ScAU$ ~gdalautotest-3.0.4/ogr/data/esrizlinestring.json0000644003401500001440000000066613614004466021472 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolyline", "fields" : [ ], "features" : [ { "geometry" : { "paths" : [ [ [ 2, 49, 1 ], [ 3, 50, 2 ] ] ] }, "attributes" : { } } ] } gdalautotest-3.0.4/ogr/data/utm31.MAP0000644003401500001440000000400013614004466016636 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?ssHhEB|Q^@}U}MY@z@x#?A#y=B`<(> K@+=@LONG_INC>@GS_COUNTN>d@tU0d@㥛@d@㥛nQd@ ףad@1rd@1d@X9d@j+d@d@Cd@d@/;d@hd@o=u<}"O>3d@C =oe@t=C<s@# # gdalautotest-3.0.4/ogr/data/emptyshapefilewithsbn.sbn0000644003401500001440000000015413614004466022456 0ustar rouaultusers' p6gdalautotest-3.0.4/ogr/data/multilinestring.geojson0000644003401500001440000000021513614004466022151 0ustar rouaultusers{ "type": "MultiLineString", "coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ] }gdalautotest-3.0.4/ogr/data/seamless.map0000644003401500001440000000600013614004466017643 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?CC H@@P@J!! $!" ,$2!"H""""""CCgdalautotest-3.0.4/ogr/data/linetypes.dxf0000755003401500001440000001160713614004470020056 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 1000 9 $LTSCALE 40 2.5 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 123 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 123A 330 123 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 320129.8419202125 22 5820106.562168026 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 253.5006261467934 41 2.025608194622279 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 1000 73 1 74 3 75 1 76 1 77 0 78 0 0 ENDTAB 0 TABLE 2 LTYPE 5 124 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 1248 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 1249 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 124A 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 124B 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 0.375 49 0.25 74 0 49 -0.125 74 0 0 LTYPE 5 124BB 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2_FLIPPED 70 0 3 Dashed (.5x) gap first 72 65 73 2 40 0.375 49 -0.125 74 0 49 0.25 74 0 0 LTYPE 5 124C 330 124 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Drain_Pipe_Inv_100 70 0 3 ----- 100ø ----- 72 65 73 4 40 5.75 49 1.75 74 0 49 -0.25 74 2 75 0 340 11 46 0.625 50 0.0 44 0.0 45 -0.318396 9 100%%c 49 -2.0 74 0 49 1.75 74 0 0 ENDTAB 0 TABLE 2 APPID 5 126 330 0 100 AcDbSymbolTable 70 29 0 APPID 5 12 330 9 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 LAYER 5 127 330 0 100 AcDbSymbolTable 70 1 0 LAYER 5 127A 330 127 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 -3 390 F 347 EE 348 0 0 ENDTAB 0 TABLE 2 VIEW 5 128 330 0 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 129 330 0 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 330 0 100 AcDbSymbolTable 70 4 100 AcDbDimStyleTable 71 2 0 DIMSTYLE 105 1B0 330 A 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 70 0 0 ENDTAB 0 TABLE 2 STYLE 5 3 330 0 100 AcDbSymbolTable 70 4 0 STYLE 5 11 330 3 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 1.0 50 0.0 71 0 42 2.5 3 arial.ttf 4 1001 ACAD 1000 Arial 1071 34 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 330 0 100 AcDbSymbolTable 70 2 0 BLOCK_RECORD 5 1F 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 70 0 280 1 281 0 0 BLOCK_RECORD 5 D2 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 D3 70 0 280 1 281 0 0 BLOCK_RECORD 5 D6 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 D7 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 330 1F 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 330 1F 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 D4 330 D2 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 D5 330 D2 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 D8 330 D6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 D9 330 D6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LINE 5 C86 330 1F 100 AcDbEntity 8 0 6 DASHED2 48 20.0 100 AcDbLine 10 320000.0 20 5820100.0 30 0.0 11 320200.0 21 5820100.0 31 0.0 0 LINE 5 F6F 330 1F 100 AcDbEntity 8 0 6 DASHED2 100 AcDbLine 10 320000.0 20 5820090.0 30 0.0 11 320200.0 21 5820090.0 31 0.0 0 LINE 5 F6FA 330 1F 100 AcDbEntity 8 0 6 DASHED2_FLIPPED 100 AcDbLine 10 320000.0 20 5820093.0 30 0.0 11 320200.0 21 5820093.0 31 0.0 0 LINE 5 D29 330 1F 100 AcDbEntity 8 0 6 Drain_Pipe_Inv_100 48 4.0 100 AcDbLine 10 320000.0 20 5820110.0 30 0.0 11 320200.0 21 5820110.0 31 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/mvt/0000755003401500001440000000000013614004466016142 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/mixed/0000755003401500001440000000000013614004466017250 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/mixed/metadata.json0000644003401500001440000000103413614004466021721 0ustar rouaultusers{ "name": "out_mixed", "description": "out_mixed", "version": "2", "minzoom": "0", "maxzoom": "0", "center": "2.000000,49.000000,0", "bounds": "2.000000,49.000000,3.000000,50.000000", "type": "overlay", "format": "pbf", "json": "{\"vector_layers\": [ { \"id\": \"mixed\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"mixed\",\"count\": 2,\"geometry\": \"Point\",\"attributeCount\": 0,\"attributes\": []}]}}" } gdalautotest-3.0.4/ogr/data/mvt/mixed/0/0000755003401500001440000000000013614004466017407 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/mixed/0/0/0000755003401500001440000000000013614004466017546 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/mixed/0/0/0.pbf0000644003401500001440000000007313614004466020376 0ustar rouaultusersR`bͬHMhP`Tb\GTBQGIP )gdalautotest-3.0.4/ogr/data/mvt/with_extension_fields.pbf0000644003401500001440000000005113614004466023224 0ustar rouaultusers' linestring"  !("@( 0xgdalautotest-3.0.4/ogr/data/mvt/limit_cases.pbf0000644003401500001440000000026013614004466021125 0ustar rouaultusers emptyx7 layer1" " b"8x layer2bx layer3b"8x layer4b"8x layer5 " x version_3xgdalautotest-3.0.4/ogr/data/mvt/point_polygon.mbtiles0000644003401500001440000001400013614004466022416 0ustar rouaultusersSQLite format 3@ - C>CK%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)g!#indextile_indextilesCREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row)CcindexnamemetadataCREATE UNIQUE INDEX name on metadata (name)uItabletilestilesCREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)IgtablemetadatametadataCREATE TABLE metadata (name text, value text) >vE5'>f Ijson{"vector_layers": [ { "id": "point", "description": "", "minzoom": 0, "maxzoom": 1, "fields": {} }, { "id": "polygon2", "description": "", "minzoom": 0, "maxzoom": 1, "fields": {"": "String"} } ],"tilestats": {"layerCount": 2,"layers": [{"layer": "point","count": 1,"geometry": "Point","attributeCount": 0,"attributes": []},{"layer": "polygon2","count": 1,"geometry": "Polygon","attributeCount": 1,"attributes": [{"attribute": "","count": 1,"type": "string","values": [""]}]}]}} formatpbftypeoverlay/Ybounds-1.000000,-4.000000,4.000000,49.0000007center-1.000000,42.525564,1 maxzoom1 minzoom0 version2##7descriptionpoint_polygon.mbtiles7namepoint_polygon.mbtiles ,  `b-+hP`TbK[(QSgbPbb2`bb`P\xΊ|F( ]R Q QbR z j^i `b-+hP`Tb-(ϩL3JI1(1q1K0 110(sncCK%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)g!#indextile_indextilesCREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row)CcindexnamemetadataCREATE UNIQUE INDEX name on metadata (name)uItabletilestilesCREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)IgtablemetadatametadataCREATE TABLE metadata (name text, value text) vO?1v0 ]json{"vector_layers": [ { "id": "datatypes", "description": "", "minzoom": 0, "maxzoom": 0, "fields": {"bool_false": "Boolean", "bool_true": "Boolean", "float_value": "Number", formatpbftypeoverlay.Wbounds2.000000,49.000000,2.000000,49.0000005center2.000000,49.000000,0 maxzoom0 minzoom0 version2#/descriptiondatatypes.mbtiles/namedatatypes.mbtiles ==@:XřXXRYZѠ ř_RT*f%Jgė%L3(7/5Y.-'?*JḾyK2!<%& F fPbR`TPoN%&F%VQJNl +$-($ήʹF(M json format type bounds center maxzoom minzoom version#description name  "int64_value": "Number", "neg_int_value": "Number", "pos_int_value": "Number", "real_value": "Number", "string_value": "String"} } ],"tilestats": {"layerCount": 1,"layers": [{"layer": "datatypes","count": 1,"geometry": "Point","attributeCount": 8,"attributes": [{"attribute": "bool_false","count": 1,"type": "boolean","values": [false]},{"attribute": "bool_true","count": 1,"type": "boolean","values": [true]},{"attribute": "float_value","count": 1,"type": "number","values": [1.25],"min": 1.25,"max": 1.25},{"attribute": "int64_value","count": 1,"type": "number","values": [123456789012345],"min": 123456789012345,"max": 123456789012345},{"attribute": "neg_int_value","count": 1,"type": "number","values": [-1],"min": -1,"max": -1},{"attribute": "pos_int_value","count": 1,"type": "number","values": [1],"min": 1,"max": 1},{"attribute": "real_value","count": 1,"type": "number","values": [1.23456789],"min": 1.23456789,"max": 1.23456789},{"attribute": "string_value","count": 1,"type": "string","values": ["str"]}]}]}} metadataname10 1!tilestile_index1 1 1 1gdalautotest-3.0.4/ogr/data/mvt/polygon_larger_than_header.pbf0000644003401500001440000000751713614004466024212 0ustar rouaultusers water" @R@ C  /=h MBY7? AV%D9YP] W@?@3ERc ?O/E eKUWU;IAc[ a_Go5G!a JG!i:)GAKMQu-HLRq[AkR%gAg ]q+>O8d?SVA6)\wC}=i}"1&1UBOF)^I?&QdJ /L@FC$NG#Lqu S=g(B,RRYO(!WQGqmRi,cW$3JZY)E\mV-U_ ?! l;R'B @43 W9? ?TY's9cA OS=W]]!DQC'X+]YK ]7K* OWgWo9@G>?Q"3RVV?dUW;TXFI+P;TKD*[M`D R R[SMBCU9@ MGc CH7i=M>4_s[Q S1?IH?DO0O. F?D)P@E)ZF B\O2BeaUJ=0u@4YXuFVG^K]Ac? NBC %HWHs \j@ LP(OPGD!ZB}J$jB!M`MVs8Nx];DnNE8q!>XVt@7^e7=F[W I(YMZVf!L:@8llDf'@D$tJv/>n ^JFAD+imk)i KNmm3W Oc&tg@/.MI91EOR@|&d\` !    GP  *N0KM%J $a  "O[GX 7-CCrT /J* OP 0  5    "* CS ,Z     !      5    5  **NaU NCN [M  ';OHB   c"&DNEc# : TF:SFM Haj#   UKL   -.     : FC@+?V)] P A U"1c'lL <        (  *o\^<3s 2Q2|,c A1 3 B a 9X W   L12    b6JBHG%Im3?*W9&Lv Bf   V-?  i3IcU[?c-s3Sg3`S7ZDG2Z"@KF(F*CLTLDBP/N "R S5m p6 '  &  'V.EC   +`* Q@tr $* A/~1-M       C?>\   +    * {m)R|P !j0_J'=G_?N?Zh G0`0 :,9E#PR 4HJik     O,   R9iF a  ( )  h< # u  0  !=  c  '      J+KmSG+RJ@!t5        @D4FB;<c E7@?n Xk:i:S*gwRO?qQM W'Si1kWoS*OU*@}0I!DAGU@=|Ft_I AH M~7Wl-PQmMTL9NW`C7O?!EI'M#HWA=qSDPW<"\UqU;C# CE@+M7PR]M!FCF8G? A[mGE/T @@ /RIM6[W)HTAauC;Q 9Q Do2\Wm87EM  'PG.HJeRr6 Tf@ TBDkPp-vy?N7/jJ!TvBRXPBV"RD8-B6`N*HzhqxpRH0l@r&`&Rn>FbWpJ2ZFf>@!-jl`x     5  57  2  ,  -      (<;<  +5 6     ,2U5W$vh) ."M`b)2IE t>  e  x    -LP1K D  */WKB@F     z 'o @IG((PPZ1MHFXTG1a !\)OC.B]??6J?'#BsSKX5b '  k  r  A    GDL'>]9TMGIFWE XF:AAG?&YPOH M;@3KC`;O(?4[K&EVsPFKzFgGSm0F$X_WM[BVW[G~NF-Ee.VhqjID e.<;_IH RpDV@A.L&"JH/pB2fdD LAD8L[b(JE&FEHOJL'G2 `(F FJB", "(aY=dx B?8-G FJZ`3AW   `M %I/GHR CEC KK aOGGIc?sQ"b L-,QE1FDxLBJ,F> ZV [FYB? /eC v/eG{& FXI"fO.\:`!     c"&DNEc# EHa}J6 C  /u8X! rE&LcZ#gU\MN$\BRB]*Y  *) V'( J5gVIf:GTFjqm( xgdalautotest-3.0.4/ogr/data/mvt/datatypes/0000755003401500001440000000000013614004466020140 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/datatypes/0/0000755003401500001440000000000013614004466020277 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/datatypes/0/0/0000755003401500001440000000000013614004466020436 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/datatypes/0/0/0.pbf0000644003401500001440000000042713614004466021271 0ustar rouaultusers:cZaLI,I,,H-c``ddbbffaaeeccg`Tb\GT3)??'4U LK)N-/+/KJCf&P޼tdy(.PP #T *J<2i90)⒢̼tOɂ8~۾SF[? 09O1da&Yy@]<6v k>)20,W└tg{%V.f LCgdalautotest-3.0.4/ogr/data/mvt/datatypes/metadata.json0000644003401500001440000000153613614004466022620 0ustar rouaultusers{ "name": "out_datatypes", "description": "out_datatypes", "version": "2", "minzoom": "0", "maxzoom": "0", "center": "2.000000,49.000000,0", "bounds": "2.000000,49.000000,2.000000,49.000000", "type": "overlay", "format": "pbf", "json": "{\"vector_layers\": [ { \"id\": \"datatypes\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {\"bool_false\": \"Boolean\", \"bool_true\": \"Boolean\", \"float_value\": \"Number\", \"pos_int_value\": \"Number\", \"pos_int64_value\": \"Number\", \"neg_int_value\": \"Number\", \"neg_int64_value\": \"Number\", \"pos_sint_value\": \"Number\", \"pos_sint64_value\": \"Number\", \"neg_sint_value\": \"Number\", \"neg_sint64_value\": \"Number\", \"real_value\": \"Number\", \"string_value\": \"String\", \"uint_value\": \"Number\", \"uint64_value\": \"Number\"} } ]}" } gdalautotest-3.0.4/ogr/data/mvt/point_polygon.sql0000644003401500001440000000470713614004466021573 0ustar rouaultusers-- SQL MBTILES CREATE TABLE metadata (name text, value text); INSERT INTO "metadata" VALUES('name','point_polygon.mbtiles'); INSERT INTO "metadata" VALUES('description','point_polygon.mbtiles'); INSERT INTO "metadata" VALUES('version','2'); INSERT INTO "metadata" VALUES('minzoom','0'); INSERT INTO "metadata" VALUES('maxzoom','1'); INSERT INTO "metadata" VALUES('center','-1.000000,42.525564,1'); INSERT INTO "metadata" VALUES('bounds','-1.000000,-4.000000,4.000000,49.000000'); INSERT INTO "metadata" VALUES('type','overlay'); INSERT INTO "metadata" VALUES('format','pbf'); INSERT INTO "metadata" VALUES('json','{"vector_layers": [ { "id": "point", "description": "", "minzoom": 0, "maxzoom": 1, "fields": {} }, { "id": "polygon2", "description": "", "minzoom": 0, "maxzoom": 1, "fields": {"": "String"} } ],"tilestats": {"layerCount": 2,"layers": [{"layer": "point","count": 1,"geometry": "Point","attributeCount": 0,"attributes": []},{"layer": "polygon2","count": 1,"geometry": "Polygon","attributeCount": 1,"attributes": [{"attribute": "","count": 1,"type": "string","values": [""]}]}]}}'); CREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob); INSERT INTO "tiles" VALUES(0,0,0,X'1F8B08000000000002039312AF60E2622DC8CFCC2BD1685010E294605462E55CA3F04754CA1B28C151909F53999E9F67049493625062E262103291601662626050D2E1BCA5B044DE8A611B63240383AE0E0343A43690E6E764709162D0130733F578A418C4B8191844F901670F28AB66000000'); INSERT INTO "tiles" VALUES(1,0,0,X'1F8B080000000000020393F2AD60E2E228C8CFA94CCFCF33D2685090625062E262103293601662626050D2E35CE0389FD18AE11AD37C460686E8280686AD8C910C0CCEFC9C0C45520C51BA0C0C91FC9C5162520C7AA20C0CBAFC006F0E5DB54F000000'); INSERT INTO "tiles" VALUES(1,1,0,X'1F8B080000000000020393F2AD60E2E228C8CFA94CCFCF33D2685090625062E262103293601662626050D2E3DCC6389FD18AE11AD356460686E8280686AD8C910C0CCEFC9C0C45520C51BA0C0C91FC9C5162520C7AA20C0CBAFC007E53E8BB4F000000'); INSERT INTO "tiles" VALUES(1,1,1,X'1F8B08000000000002039312AB60E2622DC8CFCC2BD1685010E290605462E18CFAA52DE50714E728C8CFA94CCFCF33024A49312831713108994B300B31313028E9736E633C6167C57083692B2303836B1403C356C6480686687E4E862E462986285D0686487ECE283129063D5106065D7E000A58525F68000000'); INSERT INTO "tiles" VALUES(1,0,1,X'1F8B08000000000002039312AF60E2622DC8CFCC2BD1685010E294605462E5BCE5F04B5BCA0F28C151909F53999E9F67049493625062E262103297601662626050D2E75CE078C2CE8AE106D37C460606D7280686AD8C910C0CD1FC9C0C5D8C520C51BA0C0C91FC9C5162520C7AA20C0CBAFC00C96A5E0169000000'); gdalautotest-3.0.4/ogr/data/mvt/multilinestring/0000755003401500001440000000000013614004466021373 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/multilinestring/metadata.json0000644003401500001440000000110113614004466024037 0ustar rouaultusers{ "name": "multilinestring", "description": "multilinestring", "version": "2", "minzoom": "0", "maxzoom": "0", "center": "2.000000,49.000000,0", "bounds": "2.000000,49.000000,7.000000,54.000000", "type": "overlay", "format": "pbf", "json": "{\"vector_layers\": [ { \"id\": \"multilinestring\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"multilinestring\",\"count\": 1,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []}]}}" } gdalautotest-3.0.4/ogr/data/mvt/multilinestring/0/0000755003401500001440000000000013614004466021532 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/multilinestring/0/0/0000755003401500001440000000000013614004466021671 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/multilinestring/0/0/0.pbf0000644003401500001440000000010413614004466022514 0ustar rouaultusers2`-)K-.)KhP`R\GKBSLKLSDP82gdalautotest-3.0.4/ogr/data/mvt/linestring_tilejson_gl/0000755003401500001440000000000013614004466022711 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/linestring_tilejson_gl/0/0000755003401500001440000000000013614004466023050 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/linestring_tilejson_gl/0/0/0000755003401500001440000000000013614004466023207 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/linestring_tilejson_gl/0/0/0.pbf0000644003401500001440000000006513614004466024040 0ustar rouaultusers`K-.)KhP`R\GKBUd!gdalautotest-3.0.4/ogr/data/mvt/polygon/0000755003401500001440000000000013614004466017631 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/polygon/metadata.json0000644003401500001440000000103613614004466022304 0ustar rouaultusers{ "name": "polygon", "description": "polygon", "version": "2", "minzoom": "0", "maxzoom": "0", "center": "2.000000,49.000000,0", "bounds": "2.000000,49.000000,3.000000,50.000000", "type": "overlay", "format": "pbf", "json": "{\"vector_layers\": [ { \"id\": \"polygon\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"polygon\",\"count\": 1,\"geometry\": \"Polygon\",\"attributeCount\": 0,\"attributes\": []}]}}" } gdalautotest-3.0.4/ogr/data/mvt/polygon/0/0000755003401500001440000000000013614004466017770 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/polygon/0/0/0000755003401500001440000000000013614004466020127 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mvt/polygon/0/0/0.pbf0000644003401500001440000000006713614004466020762 0ustar rouaultusersR`b/ϩLhP`VCg!#indextile_indextilesCREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row)CcindexnamemetadataCREATE UNIQUE INDEX name on metadata (name)K%%[tablesqlite_stat1sqlite_stat1CREATE TABLE sqlite_stat1(tbl,idx,stat)uItabletilestilesCREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)IgtablemetadatametadataCREATE TABLE metadata (name text, value text) O?1q _json{"vector_layers": [ { "id": "datatypes", "description": "", "minzoom": 0, "maxzoom": 0, "fields": {} } ]} formatpbftypeoverlay.Wbounds2.000000,49.000000,2.000000,49.0000005center2.000000,49.000000,0 maxzoom0 minzoom0 version2#/descriptiondatatypes.mbtiles/namedatatypes.mbtiles ==@:XřXXRYZѠ ř_RT*f%Jgė%L3(7/5Y.-'?*JḾyK2!<%& F fPbR`TPoN%&F%VQJNl +$-($ήʹF(M metadataname10 1!tilestile_index1 1 1 1  versiontype name minzoom maxzoomjson format #description center bounds  gdalautotest-3.0.4/ogr/data/bylany.vfk0000644003401500001440000003541713614004466017354 0ustar rouaultusers&HVERZE;"3.0" &HVYTVORENO;"14.03.2006 12:05:49" &HPUVOD;"ISKN" &HCODEPAGE;"WE8ISO8859P2" &HSKUPINA;"NEMO";"JEDN";"BDPA";"VLST";"JPVZ";"RIZE";"PKMP";"BPEJ";"GMPL" &HJMENO;"Helena Korbov" &HPLATNOST;"14.03.2006 11:49:31";"14.03.2006 11:49:31" &HZMENY;0 &HNAVRHY;0 &HPOLYG;0 &HKATUZE;KOD N6;OBCE_KOD N6;NAZEV T48;PLATNOST_OD D;PLATNOST_DO D &HOPSUB;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;ID_JE_1_PARTNER_BSM N30;ID_JE_2_PARTNER_BSM N30;ID_ZDROJ N30;OPSUB_TYPE T10;CHAROS_KOD N2;ICO N8;DOPLNEK_ICO N3;NAZEV T255;NAZEV_U T255;RODNE_CISLO T10;TITUL_PRED_JMENEM T35;JMENO T24;JMENO_U T24;PRIJMENI T35;PRIJMENI_U T35;TITUL_ZA_JMENEM T10;CISLO_DOMOVNI N4;CISLO_ORIENTACNI T4;NAZEV_ULICE T32;CAST_OBCE T48;OBEC T48;OKRES T32;STAT T23;PSC N5;MESTSKA_CAST T48;CP_CE N1 &HPAR;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;PKN_ID N30;PAR_TYPE T10;KATUZE_KOD N6;KATUZE_KOD_PUV N6;DRUH_CISLOVANI_PAR N1;KMENOVE_CISLO_PAR N5;ZDPAZE_KOD N1;PODDELENI_CISLA_PAR N3;DIL_PARCELY N1;MAPLIS_KOD N30;ZPURVY_KOD N1;DRUPOZ_KOD N2;ZPVYPA_KOD N4;TYP_PARCELY N1;VYMERA_PARCELY N9;CENA_NEMOVITOSTI N14.2;DEFINICNI_BOD_PAR T100;TEL_ID N30;PAR_ID N30;BUD_ID N30;IDENT_BUD T1 &BPAR;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;PKN_ID N30;PAR_TYPE T10;KATUZE_KOD N6;KATUZE_KOD_PUV N6;DRUH_CISLOVANI_PAR N1;KMENOVE_CISLO_PAR N5;ZDPAZE_KOD N1;PODDELENI_CISLA_PAR N3;DIL_PARCELY N1;MAPLIS_KOD N30;ZPURVY_KOD N1;DRUPOZ_KOD N2;ZPVYPA_KOD N4;TYP_PARCELY N1;VYMERA_PARCELY N9;CENA_NEMOVITOSTI N14.2;DEFINICNI_BOD_PAR T100;TEL_ID N30;PAR_ID N30;BUD_ID N30;IDENT_BUD T1 &DPAR;92340708;0;"09.09.1999 00:00:00";"";3;379087708;;;"PKN";616567;;1;1;;1;;6780;2;13;;;809;;"";64156708;;25735708;"a" &BBUD;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPBUD_KOD N1;CAOBCE_KOD N6;CISLO_DOMOVNI N4;CENA_NEMOVITOSTI N14.2;ZPVYBU_KOD N4;TEL_ID N30 &BZPOCHN;KOD N4;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;POZEMEK T1;BUDOVA T1;JEDNOTKA T1;NEMOCHR N3 &BDRUPOZ;KOD N2;NAZEV T60;ZEMEDELSKA_KULTURA T1;PLATNOST_OD D;TYPPPD_KOD N10;PLATNOST_DO D;ZKRATKA T9;STAVEBNI_PARCELA T1 &BZPVYPO;KOD N4;NAZEV T60;PLATNOST_OD D;TYPPPD_KOD N10;PLATNOST_DO D;ZKRATKA T16 &BZDPAZE;KOD N1;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;ZKRATKA T2 &BZPURVY;KOD N1;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D &BTYPBUD;KOD N1;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;ZADANI_CD T1;ZKRATKA T9 &BMAPLIS;ID N30;OZNACENI_MAPOVEHO_LISTU T100;PLATNOST_OD D;PLATNOST_DO D;MAPA T5 &BKATUZE;KOD N6;OBCE_KOD N6;NAZEV T48;PLATNOST_OD D;PLATNOST_DO D &BOBCE;KOD N6;OKRESY_KOD N4;NAZEV T48;PLATNOST_OD D;PLATNOST_DO D &BCABU;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;BUD_ID N30;TYPBUD_KOD N1;CISLO_DOMOVNI N4;CENA_NEMOVITOSTI N14.2 &BCASOBC;KOD N6;OBCE_KOD N6;NAZEV T48;PLATNOST_OD D;PLATNOST_DO D &BOKRESY;KOD N4;KRAJE_KOD N2;NAZEV T32;PLATNOST_OD D;PLATNOST_DO D &BKRAJE;KOD N2;NAZEV T20;PLATNOST_OD D;PLATNOST_DO D &BRZO;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;ZPOCHR_KOD N4;PAR_ID N30;BUD_ID N30;JED_ID N30 &BZPVYBU;KOD N4;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;ZKRATKA T8 &BJED;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;BUD_ID N30;TYPJED_KOD N2;CISLO_JEDNOTKY N10;CENA_NEMOVITOSTI N14.2;ZPVYJE_KOD N4;TEL_ID N30;PODIL_CITATEL N30;PODIL_JMENOVATEL N30;POPIS T240 &BTYPJED;KOD N2;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;ZKRATKA T7 &BZPVYJE;KOD N4;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D;ZKRATKA T7;DOPLKOD N3 &BBDP;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;PAR_ID N30;BPEJ_KOD T5;VYMERA N9 &BOPSUB;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;ID_JE_1_PARTNER_BSM N30;ID_JE_2_PARTNER_BSM N30;ID_ZDROJ N30;OPSUB_TYPE T10;CHAROS_KOD N2;ICO N8;DOPLNEK_ICO N3;NAZEV T255;NAZEV_U T255;RODNE_CISLO T10;TITUL_PRED_JMENEM T35;JMENO T24;JMENO_U T24;PRIJMENI T35;PRIJMENI_U T35;TITUL_ZA_JMENEM T10;CISLO_DOMOVNI N4;CISLO_ORIENTACNI T4;NAZEV_ULICE T32;CAST_OBCE T48;OBEC T48;OKRES T32;STAT T23;PSC N5;MESTSKA_CAST T48;CP_CE N1 &BVLA;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;OPSUB_ID N30;TYPRAV_KOD T4;TEL_ID N30;PODIL_CITATEL N30;PODIL_JMENOVATEL N30 &BCHAROS;KOD N2;NAZEV T60;OPSUB_TYPE T10;PLATNOST_OD D;PLATNOST_DO D;ZKRATKA T3 &BTEL;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;KATUZE_KOD N6;CISLO_TEL N6 &BJPV;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;PAR_ID_PRO N30;BUD_ID_PRO N30;JED_ID_PRO N30;PAR_ID_K N30;BUD_ID_K N30;JED_ID_K N30;TYPRAV_KOD T4;POPIS_PRAVNIHO_VZTAHU T4000;TEL_ID N30;OPSUB_ID_PRO N30;OPSUB_ID_K N30;PODIL_POHLEDAVKA T60;HJPV_ID N30 &BTYPRAV;KOD T4;TPR_KOD N8;NAZEV T60;VLASTNICTVI T1;PRO_OS T1;PRO_NEMOVITOST T1;K_NEMOVITOSTI T1;PLATNOST_OD D;SEKCE T1;PLATNOST_DO D;VLVZTAH N1;K_OS T1;PODIL_VERITELE T1 &BRIZENI;ID N30;TYPRIZ_KOD T3;PORADOVE_CISLO N8;ROK D;STAV T20;FUNKCE_KOD N4;TYPOPE_KOD N3;FUNKCE_KOD_VYZNAMNA N4;TYPOPE_KOD_VYZNAMNA N4;UZISYS_USERNAME T30;UZIROL_NAZEV T30;OSVOBOZENO T1;HODNOTA_KOLKU N5;DATUM D;DATUM2 D;POPIS T240;DATUM_UZAVRENI D &BOBJRIZ;ID N30;RIZENI_ID N30;PAR_ID N30;BUD_ID N30;JED_ID N30;DATUM_PLOMBY D;DATUM_ODSTRANENI_PLOMBY D &BPRERIZ;RIZENI_ID N30;TYPPRE_KOD N8 &BUCAST;ID N30;RIZENI_ID N30;DRUH_UCASTNIKA N1;JMENO T24;JMENO_U T24;PRIJMENI T35;PRIJMENI_U T35;TITUL_PRED_JMENEM T35;TITUL_ZA_JMENEM T10;RC T10;RODNE_PRIJMENI T35;RODINNY_STAV N1;OBCHODNI_JMENO T255;OBCHODNI_JMENO_U T255;DIC N14;ICO N8;DOPLNEK_ICO N3;OVEREN_PODPIS T1;OVEREN_PROTI_RS N1;OVEREN_PROTI_OS N1 &BADRUC;UCAST_ID N30;TYP_ADRESY N1;OKRES T32;OBEC T48;CAST_OBCE T48;CISLO_DOMOVNI N4;NAZEV_ULICE T48;CISLO_ORIENTACNI T4;PSC N5;STAT T23;TELEFON T33;FAX T33;MESTSKA_CAST T48;CP_CE N1 &BLISTIN;ID N30;TYPLIST_KOD N8;POPIS T2000;OBSAH T1;STRAN N4;DATUM_VYHOTOVENI D;ZHOTOVITEL T60;PORADOVE_CISLO_ZHOTOVITELE T8;ROK_ZHOTOVITELE D;DOPLNENI_ZHOTOVITELE T60;ZKRATKA T10;RIZENI_ID N30;ZMENA_PRAV_VZTAHU T1;DATUM_PRAV_MOCI D;DATUM_VYKONATELNOSTI D;DATUM_HIST_OD D;DATUM_HIST_DO D &DLISTIN;725491306;20;"ze dne 9.11.1993 (""parcely""; z pod`ilu `e. 15 pro k.. Oepe^1n).";"n";;"";"";"98";"01.01.1992 00:00:00";"POLVZ:101994 KATUZ:789151 LISTDRUH:20 I:1";"";2821351306;"a";"";"";"11.06.2001 01:36:14";"" &DLISTIN;725491307;20;"ze dne 9.11.1993 (;""parcely"" z pod`ilu `e. 15 pro k.. Oepe^1n).";"n";;"";"";"98";"01.01.1992 00:00:00";"POLVZ:101994 KATUZ:789151 LISTDRUH:20 I:1";"";2821351306;"a";"";"";"11.06.2001 01:36:14";"" &BLDU;LISTIN_ID N30;DUL_KOD T3 &BTYPLIS;KOD N8;NAZEV T60;PLATNOST_OD D;POPIS T240;PLATNOST_DO D;DRUHLIST N2 &BTYPPRE;KOD N8;NAZEV T60;PLATNOST_OD D;POPIS T240;PLATNOST_DO D &BTYPRIZ;KOD T3;NAZEV T20;POPIS T240;ZPOPLATNENI T1 &BTYPUCA;KOD T2;NAZEV T20;POPIS T240 &BRL;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;LISTIN_ID N30;PAR_ID N30;BUD_ID N30;JED_ID N30;OPSUB_ID N30;JPV_ID N30 &BRIZKU;KATUZE_KOD N6;RIZENI_ID N30 &BUCTYP;UCAST_ID N30;TYPUCA_KOD T2 &BOBESMF;OBESLANI_ID N30;ZPUSOB_OBESLANI N1;TYPOPE_KOD N3;UCAST_ID N30;STAV_OBESLANI N1;DATUM_PRIJETI_DORUCENKY D;OPSUB_ID N30 &BDUL;KOD T3;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D &BSOBR;ID N30;STAV_DAT N2;KATUZE_KOD N6;CISLO_ZPMZ N5;CISLO_TL N4;CISLO_BODU N12;UPLNE_CISLO N12;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;KODCHB_KOD N2 &DSOBR;313775708;0;616567;93;;15;17000930015;651225.68;1069521.5;4 &DSOBR;313776708;0;616567;93;;16;17000930016;651235;1069517.15;4 &DSOBR;313791708;0;616567;93;;32;17000930032;651244.47;1069564.22;4 &DSOBR;313792708;0;616567;93;;33;17000930033;651253.82;1069560.24;4 &DSOBR;313802708;0;616567;93;;43;17000930043;651219.96;1069524.17;4 &DSOBR;313807708;0;616567;93;;48;17000930048;651239.52;1069527.51;4 &DSOBR;313808708;0;616567;93;;49;17000930049;651241.26;1069526.75;4 &DSOBR;313809708;0;616567;93;;50;17000930050;651242.77;1069530.18;4 &DSOBR;313810708;0;616567;93;;51;17000930051;651241.02;1069530.94;4 &DSOBR;313813708;0;616567;93;;55;17000930055;651240.47;1069564.11;4 &DSOBR;313814708;0;616567;93;;56;17000930056;651217.3;1069525.41;4 &DSOBR;313815708;0;616567;93;;57;17000930057;651212.4;1069517.22;4 &DSOBR;313819708;0;616567;93;;63;17000930063;651215.81;1069515.68;4 &BSBP;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;BP_ID N30;PORADOVE_CISLO_BODU N38;OB_ID N30;HP_ID N30;DPM_ID N30;PARAMETRY_SPOJENI T100;ZVB_ID N30 &DSBP;292352708;0;"21.06.2001 17:30:41";"";3;379449708;;313791708;1;;156008708;;"4"; &DSBP;292353708;0;"21.06.2001 17:30:41";"";3;379449708;;313813708;2;;156008708;;"4"; &DSBP;292366708;0;"21.06.2001 17:30:41";"";3;379449708;;313792708;1;;156022708;;"4"; &DSBP;292367708;0;"21.06.2001 17:30:41";"";3;379449708;;313791708;2;;156022708;;"4"; &DSBP;292382708;0;"21.06.2001 17:30:41";"";3;379449708;;313819708;1;;156038708;;"4"; &DSBP;292383708;0;"21.06.2001 17:30:41";"";3;379449708;;313802708;2;;156038708;;"4"; &DSBP;292384708;0;"21.06.2001 17:30:41";"";3;379449708;;313802708;1;;156040708;;"4"; &DSBP;292385708;0;"21.06.2001 17:30:41";"";3;379449708;;313775708;2;;156040708;;"4"; &DSBP;292386708;0;"21.06.2001 17:30:41";"";3;379449708;;313775708;1;;156042708;;"4"; &DSBP;292387708;0;"21.06.2001 17:30:41";"";3;379449708;;313776708;2;;156042708;;"4"; &DSBP;292388708;0;"21.06.2001 17:30:41";"";3;379449708;;313776708;1;;156044708;;"4"; &DSBP;292389708;0;"21.06.2001 17:30:41";"";3;379449708;;313807708;2;;156044708;;"4"; &DSBP;292390708;0;"21.06.2001 17:30:41";"";3;379449708;;313807708;1;;156046708;;"4"; &DSBP;292391708;0;"21.06.2001 17:30:41";"";3;379449708;;313808708;2;;156046708;;"4"; &DSBP;292392708;0;"21.06.2001 17:30:41";"";3;379449708;;313808708;1;;156048708;;"4"; &DSBP;292393708;0;"21.06.2001 17:30:41";"";3;379449708;;313809708;2;;156048708;;"4"; &DSBP;292394708;0;"21.06.2001 17:30:41";"";3;379449708;;313809708;1;;156050708;;"4"; &DSBP;292395708;0;"21.06.2001 17:30:41";"";3;379449708;;313810708;2;;156050708;;"4"; &DSBP;292396708;0;"21.06.2001 17:30:41";"";3;379449708;;313810708;1;;156052708;;"4"; &DSBP;292397708;0;"21.06.2001 17:30:41";"";3;379449708;;313792708;2;;156052708;;"4"; &DSBP;292398708;0;"21.06.2001 17:30:41";"";3;379449708;;313819708;1;;156054708;;"4"; &DSBP;292399708;0;"21.06.2001 17:30:41";"";3;379449708;;313815708;2;;156054708;;"4"; &DSBP;292400708;0;"21.06.2001 17:30:41";"";3;379449708;;313815708;1;;156056708;;"4"; &DSBP;292401708;0;"21.06.2001 17:30:41";"";3;379449708;;313814708;2;;156056708;;"4"; &DSBP;292404708;0;"21.06.2001 17:30:41";"";3;379449708;;313814708;1;;156057708;;"16"; &DSBP;292405708;0;"21.06.2001 17:30:41";"";3;379449708;;313813708;2;;156057708;;"16"; &DSBP;292406708;0;"21.06.2001 17:30:41";"";3;379449708;;313815708;3;;156057708;;"16"; &DSBP;292402708;0;"21.06.2001 17:30:41";"";3;379449708;;313814708;1;;156058708;;"4"; &DSBP;292403708;0;"21.06.2001 17:30:41";"";3;379449708;;313813708;2;;156058708;;"4"; &BSBM;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;PORADOVE_CISLO_BODU N38;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;OP_ID N30;DPM_ID N30;HBPEJ_ID N30;PARAMETRY_SPOJENI T100 &BKODCHB;KOD N2;NAZEV T60;PLATNOST_OD D;PLATNOST_DO D &BTYPSOS;KOD N1;NAZEV T20;PLATNOST_OD D;PLATNOST_DO D &BHP;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;PAR_ID_1 N30;PAR_ID_2 N30 &DHP;156008708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92341708;92340708 &DHP;156022708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92540708;92340708 &DHP;156038708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156040708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156042708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156044708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156046708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156048708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156050708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92545708;92340708 &DHP;156052708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;92545708 &DHP;156054708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92340708;93243708 &DHP;156056708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92389708;92340708 &DHP;156058708;0;"21.06.2001 17:30:41";"";3;379449708;;21900;92389708;92340708 &BOP;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;TEXT T255;VELIKOST N10.2;UHEL N10.4;PAR_ID N30;OPAR_TYPE T10;VZTAZNY_BOD N2 &BOB;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;VELIKOST N10.2;UHEL N10.4;BUD_ID N30;OBRBUD_TYPE T10 &BDPM;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU T240;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;TEXT T255;VELIKOST N10.2;UHEL N10.4;BP_ID N30;DPM_TYPE T10;VZTAZNY_BOD N2 &BOBBP;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;TEXT T255;VELIKOST N10.2;UHEL N10.4;BP_ID N30;OBBP_TYPE T10;VZTAZNY_BOD N2 &BTYPPPD;KOD N10;POLOHOPIS T1;EDITOVATELNY T1;PLATNOST_OD D;VYZNAM T240;KRIVKA T1;TYP_PRVKU N1;PLATNOST_DO D &BZVB;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;KATUZE_KOD N6;HJPV_ID N30 &BHBPEJ;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;BPEJ_KOD_HRANICE_1 N30;BPEJ_KOD_HRANICE_2 N30;KATUZE_KOD N6 &BOBPEJ;ID N30;STAV_DAT N2;DATUM_VZNIKU D;DATUM_ZANIKU D;PRIZNAK_KONTEXTU N1;RIZENI_ID_VZNIKU N30;RIZENI_ID_ZANIKU N30;TYPPPD_KOD N10;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;TEXT T255;VELIKOST N10.2;UHEL N10.4;BPEJ_KOD T5;KATUZE_KOD N6;VZTAZNY_BOD N2 &BNZ;ID N30;STAV_NZ N1;NZ_TYPE T10;PORIZENI_DAT_NZ T1;RIZENI_ID N30;CISLO_PLANU T60;VYHOTOVIL T60;OZNACENI_MAPOVEHO_LISTU T60 &BZPMZ;KATUZE_KOD N6;CISLO_ZPMZ N5;PPZ_ID N30;STAV_ZPMZ N1;MERICKY_NACRT T1;ZAPISNIK_PODROB_MERENI T1;VYPOCET_PROTOKOL_VYMER T1;TYPSOS_KOD N1 &BNZZP;NZ_ID N30;ZPMZ_CISLO_ZPMZ N5;ZPMZ_KATUZE_KOD N6 &BSPOL;ID N30;STAV_DAT N2;KATUZE_KOD N6;CISLO_ZPMZ N5;CISLO_TL N4;CISLO_BODU N12;UPLNE_CISLO N12;SOURADNICE_Y N10.2;SOURADNICE_X N10.2;KODCHB_KOD N2;KATUZE_KOD_MER N6;CISLO_ZPMZ_MER N5 &K gdalautotest-3.0.4/ogr/data/osmconf_alltags.ini0000644003401500001440000000757513614004466021226 0ustar rouaultusers# # Configuration file for OSM import # # put here the name of keys for ways that are assumed to be polygons if they are closed # see http://wiki.openstreetmap.org/wiki/Map_Features closed_ways_are_polygons=aeroway,amenity,boundary,building,craft,geological,historic,landuse,leisure,military,natural,office,place,shop,sport,tourism # comment to avoid laundering of keys ( ':' turned into '_' ) attribute_name_laundering=yes # uncomment to report all nodes, including the ones without any (significant) tag #report_all_nodes=yes # uncomment to report all ways, including the ones without any (significant) tag #report_all_ways=yes [points] # common attributes osm_id=yes osm_version=no osm_timestamp=no osm_uid=no osm_user=no osm_changeset=no # keys to report as OGR fields attributes=name,barrier,highway,ref,address,is_in,place,man_made # keys that, alone, are not significant enough to report a node as a OGR point unsignificant=created_by,converted_by,source,time,ele # keys that should NOT be reported in the "other_tags" field ignore=created_by,converted_by,source,time,ele,note,openGeoDB:,fixme,FIXME # uncomment to avoid creation of "other_tags" field #other_tags=no all_tags=yes [lines] # common attributes osm_id=yes osm_version=no osm_timestamp=no osm_uid=no osm_user=no osm_changeset=no # keys to report as OGR fields attributes=name,highway,waterway,aerialway,barrier,man_made # keys that should NOT be reported in the "other_tags" field ignore=created_by,converted_by,source,time,ele,note,openGeoDB:,fixme,FIXME # uncomment to avoid creation of "other_tags" field #other_tags=no all_tags=yes #computed_attributes must appear before the keywords _type and _sql computed_attributes=z_order z_order_type=Integer # Not the hardcoded default z_order formula (just inserted an extra trailing space :-)) z_order_sql="SELECT (CASE [highway] WHEN 'minor' THEN 3 WHEN 'road' THEN 3 WHEN 'unclassified' THEN 3 WHEN 'residential' THEN 3 WHEN 'tertiary_link' THEN 4 WHEN 'tertiary' THEN 4 WHEN 'secondary_link' THEN 6 WHEN 'secondary' THEN 6 WHEN 'primary_link' THEN 7 WHEN 'primary' THEN 7 WHEN 'trunk_link' THEN 8 WHEN 'trunk' THEN 8 WHEN 'motorway_link' THEN 9 WHEN 'motorway' THEN 9 ELSE 0 END) + (CASE WHEN [bridge] IN ('yes', 'true', '1') THEN 10 ELSE 0 END) + (CASE WHEN [tunnel] IN ('yes', 'true', '1') THEN -10 ELSE 0 END) + (CASE WHEN [railway] IS NOT NULL THEN 5 ELSE 0 END) + (CASE WHEN [layer] IS NOT NULL THEN 10 * CAST([layer] AS INTEGER) ELSE 0 END) " [multipolygons] # common attributes # note: for multipolygons, osm_id=yes instantiates a osm_id field for the id of relations # and a osm_way_id field for the id of closed ways. Both fields are exclusively set. osm_id=yes osm_version=no osm_timestamp=no osm_uid=no osm_user=no osm_changeset=no # keys to report as OGR fields attributes=name,type,aeroway,amenity,admin_level,barrier,boundary,building,craft,geological,historic,land_area,landuse,leisure,man_made,military,natural,office,place,shop,sport,tourism # keys that should NOT be reported in the "other_tags" field ignore=area,created_by,converted_by,source,time,ele,note,openGeoDB:,fixme,FIXME # uncomment to avoid creation of "other_tags" field #other_tags=no [multilinestrings] # common attributes osm_id=yes osm_version=no osm_timestamp=no osm_uid=no osm_user=no osm_changeset=no # keys to report as OGR fields attributes=name,type # keys that should NOT be reported in the "other_tags" field ignore=area,created_by,converted_by,source,time,ele,note,openGeoDB:,fixme,FIXME # uncomment to avoid creation of "other_tags" field #other_tags=no [other_relations] # common attributes osm_id=yes osm_version=no osm_timestamp=no osm_uid=no osm_user=no osm_changeset=no # keys to report as OGR fields attributes=name,type # keys that should NOT be reported in the "other_tags" field ignore=area,created_by,converted_by,source,time,ele,note,openGeoDB:,fixme,FIXME # uncomment to avoid creation of "other_tags" field #other_tags=no gdalautotest-3.0.4/ogr/data/wfsjointlayer.xsd0000644003401500001440000000262313614005345020754 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/small.mif0000644003401500001440000000121413614004466017137 0ustar rouaultusersVersion 300 Charset "WindowsLatin1" Delimiter "," CoordSys Nonearth Units "M" Bounds (406547, 153897) (407967, 155532) Columns 7 NAME Char (50) DATA Integer OWNER Char (64) APPRAISED_VALUE Float TAXES Float FLOODZONE Integer NUM Char (254) Data Region 1 6 407131.721 155322.441 407134.468 155329.616 407142.741 155327.242 407141.503 155322.467 407140.875 155320.049 407131.721 155322.441 Brush (1, 0, 16777215) Pen (1, 2, 0) Region 1 6 407128.974 155315.266 407131.721 155322.441 407140.875 155320.049 407139.552 155314.949 407138.932 155312.559 407128.974 155315.266 Brush (1, 0, 16777215) Pen (1, 2, 0)gdalautotest-3.0.4/ogr/data/huge_geom_start.gml0000644003401500001440000000131613614004466021212 0ustar rouaultusers -21.4282083310724 134.635194391036 455.510024428807 -21.6408640426055 134.581480136827 515.152979662852 -21.686125031254 134.833308274251 518.542363338029 -21.4734274382519 134.886750925145 525.212693365275 -21.4282083310724 134.635194391036 455.510024428807gdalautotest-3.0.4/ogr/data/inspire_cadastralparcel.xml0000644003401500001440000000704613614005345022740 0ustar rouaultusers 49 2 50 3 10 2000-01-01T00:00:00.0Z 2001-01-01T00:00:00.0Z 49 2 50 2 50 3 49 3 CadastralParcel-01-localId namespace label nationalCadastralReference 49.5 2.5 2002-01-01T00:00:00.0Z 2003-01-01T00:00:00.0Z 2000-01-01T00:00:00.0Z 49 2 50 2 50 3 49 3 CadastralParcel-02-localId namespace label nationalCadastralReference gdalautotest-3.0.4/ogr/data/ocs2wcs2.dxf0000644003401500001440000010235013614004466017505 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $HANDSEED 5 F0001 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 330 0 100 AcDbSymbolTable 70 4 0 LTYPE 5 14 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 2 330 0 100 AcDbSymbolTable 70 10 0 LAYER 5 10 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 347 EE 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 APPID 5 214 330 9 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD_OBJECT_CHANGE_GUID 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 POINT 5 1B1 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 4.0 20 4.0 30 0.0 0 LINE 5 1B2 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.0 21 1.0 31 0.0 0 LWPOLYLINE 5 1B3 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 1.0 20 1.0 10 2.0 20 1.0 10 1.0 20 2.0 0 POLYLINE 5 1B4 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 1B5 330 1B4 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 1.0 30 0.0 70 32 0 VERTEX 5 1B6 330 1B4 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 2.0 30 0.0 70 32 0 VERTEX 5 1B7 330 1B4 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 2.0 20 2.0 30 0.0 70 32 0 SEQEND 5 1B8 330 1B4 100 AcDbEntity 8 0 0 CIRCLE 5 1B9 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 4.0 20 4.0 30 0.0 40 2.0 0 LINE 5 1BA 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 2.0 20 4.0 30 0.0 11 4.0 21 4.0 31 0.0 0 LINE 5 1BB 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 4.0 20 4.0 30 0.0 11 6.0 21 4.0 31 0.0 0 LINE 5 1BC 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 4.0 20 3.0 30 0.0 11 4.0 21 4.0 31 0.0 0 LINE 5 1BD 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 4.0 20 4.0 30 0.0 11 4.0 21 5.0 31 0.0 0 ELLIPSE 5 1BE 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 4.0 20 4.0 30 0.0 11 -2.0 21 0.0 31 0.0 210 0.0 220 0.0 230 1.0 40 0.5 41 0.0 42 6.283185307179586 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 ARC 5 1BF 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 2.5 20 2.5 30 0.0 40 0.7071067811865476 100 AcDbArc 50 315.0 51 225.0000000000001 0 3DFACE 5 1C0 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 1.0 20 2.0 30 0.0 11 1.0 21 3.0 31 0.0 12 2.0 22 3.0 32 0.0 13 2.0 23 2.0 33 0.0 0 SOLID 5 1C1 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 3.0 20 4.0 30 0.0 11 4.0 21 4.0 31 0.0 12 3.0 22 3.0 32 0.0 13 4.0 23 3.0 33 0.0 0 HATCH 5 1C3 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 8.0 20 8.0 11 9.0 21 8.0 72 1 10 9.0 20 8.0 11 9.0 21 9.0 72 1 10 9.0 20 9.0 11 8.0 21 9.0 72 1 10 8.0 20 9.0 11 8.0 21 8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 0.0 43 0.0 44 0.0 45 0.0 46 6.985 79 2 49 5.08 49 -1.905 53 90.0 43 0.0 44 0.0 45 -6.985 46 0.0000000000000004 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 1C6 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 2.0 20 2.0 30 0.0 10 2.666666666666666 20 2.666666666666666 30 0.0 10 4.666666666666666 20 4.666666666666666 30 0.0 10 6.666666666666666 20 6.666666666666666 30 0.0 10 8.0 20 8.0 30 0.0 11 2.0 21 2.0 31 0.0 11 4.0 21 4.0 31 0.0 11 8.0 21 8.0 31 0.0 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 SPLINE 5 1C7 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 8.0 20 1.0 30 0.0 10 5.583333333333333 20 0.9166666666666666 30 0.0 10 0.7500000000000002 20 0.75 30 0.0 10 0.9166666666666666 20 5.583333333333332 30 0.0 10 1.0 20 8.0 30 0.0 11 8.0 21 1.0 31 0.0 11 2.0 21 2.0 31 0.0 11 1.0 21 8.0 31 0.0 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 TEXT 5 1C8 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 7.0 20 7.0 30 0.0 40 1.0 1 Text 100 AcDbText 0 POINT 5 1C9 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 -1.999999999999999 20 4.0 30 -3.464101615137755 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 50 90.0 0 LINE 5 1CA 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 -0.4999999999999999 21 1.0 31 -0.8660254037844389 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 LWPOLYLINE 5 1CB 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 1.0 20 -1.0 10 1.0 20 -2.0 10 2.0 20 -1.0 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 POLYLINE 5 1CC 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 1CD 330 1CC 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -0.4999999999999999 20 1.0 30 -0.8660254037844389 70 32 0 VERTEX 5 1CE 330 1CC 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -0.4999999999999999 20 2.0 30 -0.8660254037844389 70 32 0 VERTEX 5 1CF 330 1CC 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -0.9999999999999996 20 2.0 30 -1.732050807568877 70 32 0 SEQEND 5 1D0 330 1CC 100 AcDbEntity 8 0 0 CIRCLE 5 1D1 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 4.0 20 -4.0 30 0.0 40 2.0 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 LINE 5 1D2 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 -0.9999999999999996 20 4.0 30 -1.732050807568877 11 -1.999999999999999 21 4.0 31 -3.464101615137755 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 LINE 5 1D3 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 -1.999999999999999 20 4.0 30 -3.464101615137755 11 -2.999999999999998 21 4.0 31 -5.196152422706632 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 LINE 5 1D4 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 -1.999999999999999 20 3.0 30 -3.464101615137755 11 -1.999999999999999 21 4.0 31 -3.464101615137755 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 LINE 5 1D5 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 -1.999999999999999 20 4.0 30 -3.464101615137755 11 -1.999999999999999 21 5.0 31 -3.464101615137755 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 ELLIPSE 5 1D6 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 -1.999999999999999 20 4.0 30 -3.464101615137755 11 0.9999999999999996 21 0.0 31 1.732050807568877 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 40 0.5 41 0.0 42 6.283185307179586 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 ARC 5 1D7 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 2.5 20 -2.5 30 0.0 40 0.7071067811865476 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 100 AcDbArc 50 225.0 51 134.9999999999999 0 3DFACE 5 1D8 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 -0.4999999999999999 20 2.0 30 -0.8660254037844389 11 -0.4999999999999999 21 3.0 31 -0.8660254037844389 12 -0.9999999999999996 22 3.0 32 -1.732050807568877 13 -0.9999999999999996 23 2.0 33 -1.732050807568877 0 SOLID 5 1D9 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 4.0 20 -3.0 30 0.0 11 4.0 21 -4.0 31 0.0 12 3.0 22 -3.0 32 0.0 13 3.0 23 -4.0 33 0.0 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 0 HATCH 5 1DB 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 8.0 20 -8.0 11 8.0 21 -9.0 72 1 10 8.0 20 -9.0 11 9.0 21 -9.0 72 1 10 9.0 20 -9.0 11 9.0 21 -8.0 72 1 10 9.0 20 -8.0 11 8.0 21 -8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 270.0 43 0.0 44 0.0 45 6.985 46 -0.0000000000000013 79 2 49 5.08 49 -1.905 53 0.0 43 0.0 44 0.0 45 0.0000000000000017 46 6.985 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 1DC 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 -0.894427190999916 220 -0.4472135954999581 230 0.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 -0.9999999999999996 20 2.0 30 -1.732050807568877 10 -1.333333333333332 20 2.666666666666666 30 -2.309401076758503 10 -2.333333333333331 20 4.666666666666666 30 -4.04145188432738 10 -3.333333333333332 20 6.666666666666666 30 -5.773502691896258 10 -3.999999999999998 20 8.0 30 -6.92820323027551 11 -0.9999999999999996 21 2.0 31 -1.732050807568877 11 -1.999999999999999 21 4.0 31 -3.464101615137755 11 -3.999999999999998 21 8.0 31 -6.92820323027551 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 SPLINE 5 1DD 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 -0.8660254037844389 220 -0.0000000000000003 230 0.5 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 -3.999999999999998 20 1.0 30 -6.92820323027551 10 -2.791666666666665 20 0.9166666666666666 30 -4.835308504463116 10 -0.375 20 0.75 30 -0.6495190528383291 10 -0.4583333333333332 20 5.583333333333332 30 -0.7938566201357357 10 -0.4999999999999999 20 8.0 30 -0.8660254037844389 11 -3.999999999999998 21 1.0 31 -6.92820323027551 11 -0.9999999999999996 21 2.0 31 -1.732050807568877 11 -0.4999999999999999 21 8.0 31 -0.8660254037844389 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 TEXT 5 1DE 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 7.0 20 -7.0 30 0.0 40 1.0 1 Text 50 270.0 210 0.8660254037844389 220 0.0 230 -0.4999999999999999 100 AcDbText 0 POINT 5 1DF 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 1.000000000000001 20 -1.999999999999999 30 -5.196152422706631 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 50 116.5650511770779 0 LINE 5 1E0 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 0.2500000000000005 21 -0.5 31 -1.299038105676657 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 LWPOLYLINE 5 1E1 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 0.4472135954999584 20 -1.341640786499873 10 0.0000000000000006 20 -2.236067977499789 10 1.341640786499874 20 -1.788854381999831 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 POLYLINE 5 1E2 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 1E3 330 1E2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 0.2500000000000005 20 -0.5 30 -1.299038105676657 70 32 0 VERTEX 5 1E4 330 1E2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 -1.0 30 -1.732050807568877 70 32 0 VERTEX 5 1E5 330 1E2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 0.500000000000001 20 -0.9999999999999998 30 -2.598076211353315 70 32 0 SEQEND 5 1E6 330 1E2 100 AcDbEntity 8 0 0 CIRCLE 5 1E7 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 1.788854381999833 20 -5.366563145999497 30 0.0000000000000002 40 2.0 210 -0.4330127018922193 220 -0.8660254037844385 230 0.2499999999999998 0 LINE 5 1E8 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 2.000000000000001 20 -2.0 30 -3.464101615137754 11 1.000000000000001 21 -1.999999999999999 31 -5.196152422706631 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 LINE 5 1E9 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 1.000000000000001 20 -1.999999999999999 30 -5.196152422706631 11 0.0000000000000022 21 -1.999999999999999 31 -6.928203230275509 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 LINE 5 1EA 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.2500000000000019 20 -1.499999999999999 30 -4.763139720814412 11 1.000000000000001 21 -1.999999999999999 31 -5.196152422706631 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 LINE 5 1EB 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 1.000000000000001 20 -1.999999999999999 30 -5.196152422706631 11 1.750000000000001 21 -2.499999999999999 31 -5.62916512459885 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 ELLIPSE 5 1EC 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 1.000000000000001 20 -1.999999999999999 30 -5.196152422706631 11 0.9999999999999994 21 -0.0000000000000002 31 1.732050807568877 210 -0.4330127018922195 220 -0.8660254037844385 230 0.2499999999999998 40 0.5000000000000001 41 0.0 42 6.283185307179586 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 ARC 5 1ED 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 1.118033988749896 20 -3.354101966249685 30 0.0000000000000001 40 0.7071067811865475 210 -0.4330127018922193 220 -0.8660254037844385 230 0.2499999999999998 100 AcDbArc 50 198.434948822922 51 108.4349488229219 0 3DFACE 5 1EE 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 1.0 20 -1.0 30 -1.732050807568877 11 1.750000000000001 21 -1.5 31 -2.165063509461095 12 1.250000000000001 22 -1.5 32 -3.031088913245534 13 0.500000000000001 23 -0.9999999999999998 33 -2.598076211353315 0 SOLID 5 1EF 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 2.23606797749979 20 -4.472135954999578 30 0.0 11 1.788854381999833 21 -5.366563145999494 31 0.0 12 1.341640786499874 22 -4.024922359499621 32 0.0 13 0.8944271909999173 23 -4.919349550499537 33 0.0 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 0 HATCH 5 1F1 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 -0.4330127018922195 220 -0.8660254037844389 230 0.2499999999999998 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 3.577708763999666 20 -10.73312629199899 11 3.130495168499707 21 -11.6275534829989 72 1 10 3.130495168499707 20 -11.6275534829989 11 4.024922359499624 21 -12.07476707849886 72 1 10 4.024922359499624 20 -12.07476707849886 11 4.472135954999583 21 -11.18033988749894 72 1 10 4.472135954999583 20 -11.18033988749894 11 3.577708763999666 21 -10.73312629199899 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 243.4349488229221 43 0.0 44 0.0 45 6.247573929134414 46 -3.123786964567202 79 2 49 5.08 49 -1.905 53 333.4349488229221 43 0.0 44 0.0 45 3.123786964567202 46 6.247573929134414 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 1F2 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 -0.8944271909999155 220 -0.4472135954999589 230 0.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.828427124746189 40 8.485281374238569 40 8.485281374238569 40 8.485281374238569 40 8.485281374238569 10 0.500000000000001 20 -0.9999999999999998 30 -2.598076211353315 10 0.6666666666666681 20 -1.333333333333333 30 -3.464101615137753 10 1.166666666666668 20 -2.333333333333332 30 -6.062177826491069 10 1.66666666666667 20 -3.333333333333332 30 -8.660254037844385 10 2.000000000000003 20 -3.999999999999999 30 -10.39230484541326 11 0.500000000000001 21 -0.9999999999999998 31 -2.598076211353315 11 1.000000000000001 21 -1.999999999999999 31 -5.196152422706631 11 2.000000000000003 21 -3.999999999999999 31 -10.39230484541326 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 SPLINE 5 1F3 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.4330127018922193 220 0.8660254037844389 230 -0.2499999999999996 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 -3.249999999999997 20 -0.4999999999999996 30 -7.361215932167728 10 -2.104166666666664 20 -0.4583333333333332 30 -5.232236814530984 10 0.1875000000000009 20 -0.375 30 -0.9742785792574933 10 3.729166666666668 20 -2.791666666666666 30 -3.211510872367292 10 5.500000000000002 20 -4.0 30 -4.330127018922191 11 -3.249999999999997 21 -0.4999999999999996 31 -7.361215932167728 11 0.500000000000001 21 -0.9999999999999998 31 -2.598076211353315 11 5.500000000000002 21 -4.0 31 -4.330127018922191 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 TEXT 5 1F4 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 3.130495168499708 20 -9.391485505499115 30 0.0 40 1.0 1 Text 50 243.4349488229221 210 -0.4330127018922193 220 -0.8660254037844385 230 0.2499999999999998 100 AcDbText 0 POINT 5 1F5 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 5.500000000000002 20 1.0 30 -0.8660254037844394 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 50 206.565051177078 0 LINE 5 1F6 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.375 21 0.2500000000000002 31 -0.2165063509461099 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 LWPOLYLINE 5 1F7 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 -1.341640786499874 20 -0.4472135954999585 10 -2.236067977499791 20 -0.0000000000000002 10 -1.788854381999832 20 -1.341640786499874 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 POLYLINE 5 1F8 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 1F9 330 1F8 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.375 20 0.2500000000000002 30 -0.2165063509461099 70 32 0 VERTEX 5 1FA 330 1F8 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 2.125000000000001 20 -0.25 30 -0.6495190528383294 70 32 0 VERTEX 5 1FB 330 1F8 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 2.750000000000001 20 0.5000000000000005 30 -0.4330127018922198 70 32 0 SEQEND 5 1FC 330 1F8 100 AcDbEntity 8 0 0 CIRCLE 5 1FD 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -5.366563145999499 20 -1.788854381999834 30 0.0000000000000001 40 2.0 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 LINE 5 1FE 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 4.250000000000003 20 -0.5 30 -1.299038105676658 11 5.500000000000002 21 1.0 31 -0.8660254037844394 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 LINE 5 1FF 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 5.500000000000002 20 1.0 30 -0.8660254037844394 11 6.750000000000002 21 2.500000000000002 31 -0.4330127018922196 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 LINE 5 200 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 4.750000000000001 20 1.500000000000001 30 -0.4330127018922198 11 5.500000000000002 21 1.0 31 -0.8660254037844394 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 LINE 5 201 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 5.500000000000002 20 1.0 30 -0.8660254037844394 11 6.250000000000003 21 0.5000000000000009 31 -1.299038105676658 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 ELLIPSE 5 202 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 5.500000000000002 20 1.0 30 -0.8660254037844394 11 -1.25 21 -1.5 31 -0.4330127018922193 210 -0.2165063509461097 220 0.4330127018922192 230 -0.8750000000000001 40 0.5 41 0.0 42 6.283185307179586 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 ARC 5 203 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -3.354101966249687 20 -1.118033988749896 30 0.0000000000000001 40 0.7071067811865483 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 100 AcDbArc 50 108.4349488229219 51 18.43494882292205 0 3DFACE 5 204 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 2.125000000000001 20 -0.25 30 -0.6495190528383294 11 2.875000000000001 21 -0.75 31 -1.082531754730548 12 3.500000000000002 22 0.0000000000000009 32 -0.8660254037844389 13 2.750000000000001 23 0.5000000000000005 33 -0.4330127018922198 0 SOLID 5 205 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 -4.472135954999581 20 -2.236067977499792 30 0.0 11 -5.366563145999498 21 -1.788854381999833 31 0.0 12 -4.024922359499623 22 -1.341640786499874 32 0.0 13 -4.919349550499539 23 -0.8944271909999168 33 0.0 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 0 HATCH 5 207 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 -10.73312629199899 20 -3.577708763999667 11 -11.62755348299891 21 -3.130495168499707 72 1 10 -11.62755348299891 20 -3.130495168499707 11 -12.07476707849887 21 -4.024922359499624 72 1 10 -12.07476707849887 20 -4.024922359499624 11 -11.18033988749895 21 -4.472135954999583 72 1 10 -11.18033988749895 20 -4.472135954999583 11 -10.73312629199899 21 -3.577708763999667 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 153.434948822922 43 0.0 44 0.0 45 -3.123786964567207 46 -6.247573929134412 79 2 49 5.08 49 -1.905 53 243.434948822922 43 0.0 44 0.0 45 6.247573929134412 46 -3.123786964567207 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 208 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.1788854381999835 220 -0.9838699100999075 230 0.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.828427124746191 40 8.485281374238573 40 8.485281374238573 40 8.485281374238573 40 8.485281374238573 10 2.750000000000001 20 0.5000000000000005 30 -0.4330127018922198 10 3.666666666666668 20 0.6666666666666672 30 -0.5773502691896264 10 6.416666666666669 20 1.166666666666667 30 -1.010362971081846 10 9.166666666666669 20 1.666666666666667 30 -1.443375672974065 10 11.0 20 2.000000000000001 30 -1.732050807568878 11 2.750000000000001 21 0.5000000000000005 31 -0.4330127018922198 11 5.500000000000002 21 1.0 31 -0.8660254037844394 11 11.0 21 2.000000000000001 31 -1.732050807568878 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 SPLINE 5 209 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.2165063509461097 220 -0.4330127018922193 230 0.875 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298225 40 12.16552506059645 40 12.16552506059645 40 12.16552506059645 40 12.16552506059645 10 5.750000000000003 20 5.500000000000005 30 1.299038105676658 10 4.177083333333335 20 3.72916666666667 30 0.8118988160479112 10 1.03125 20 0.1875000000000009 30 -0.162379763209582 10 4.760416666666669 20 -2.104166666666667 30 -2.219190097197624 10 6.625000000000004 20 -3.250000000000001 30 -3.247595264191646 11 5.750000000000003 21 5.500000000000005 31 1.299038105676658 11 2.750000000000001 21 0.5000000000000005 31 -0.4330127018922198 11 6.625000000000004 21 -3.250000000000001 31 -3.247595264191646 1001 ACAD_OBJECT_CHANGE_GUID 1070 0 1071 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 1070 0 0 TEXT 5 20A 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 -9.391485505499122 20 -3.130495168499708 30 0.0 40 1.0 1 Text 50 153.434948822922 210 -0.2165063509461097 220 0.4330127018922191 230 -0.8750000000000001 100 AcDbText 0 VIEWPORT 5 102 102 {ACAD_XDICTIONARY 360 260 102 } 330 23 100 AcDbEntity 67 1 8 0 100 AcDbViewport 10 128.5 20 98.14473144822969 30 0.0 40 654.7948017621146 41 223.4694628964594 68 1 69 1 12 128.5 22 98.14473144822969 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 42 50.0 43 0.0 44 0.0 45 223.4694628964594 50 0.0 51 0.0 72 1000 90 32800 1 281 0 71 1 74 0 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 VIEWPORT 5 104 102 {ACAD_XDICTIONARY 360 262 102 } 330 23 100 AcDbEntity 67 1 8 0 100 AcDbViewport 10 128.5 20 97.5 30 0.0 40 205.6 41 156.0 68 2 69 2 12 513.4868045686685 22 175.2385563380282 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 42 50.0 43 0.0 44 0.0 45 347.4734376308731 50 0.0 51 0.0 72 1000 90 32880 1 281 0 71 1 74 0 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/buggymultipoly2.shx0000644003401500001440000000015413614004466021236 0ustar rouaultusers' 6Y@Y@@2gdalautotest-3.0.4/ogr/data/weird_empty_folders.kml0000644003401500001440000000031713614004466022110 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/wfs20.xml0000644003401500001440000000701613614005346017021 0ustar rouaultusers 1 01 3020.0000000000000000 2004 MILFORD 302001.0000000000000000 0130202003 Milford 2 Milford 0 1451 50040 4178397.6250000000000000 10689.3287256000000000 Beaver 325218.003 4250567.050 324469.003 4250572.550 324449.503 4250572.550 323628.003 4250578.550 323628.503 4250991.050 323243.003 4250993.050 322872.003 4250995.550 322875.003 4251797.550 322874.003 4251920.550 323234.003 4251808.050 323249.003 4251803.550 323263.503 4251799.550 323278.503 4251795.550 323293.503 4251792.050 323308.503 4251788.550 323323.503 4251785.050 323339.003 4251782.550 323354.003 4251779.550 323369.003 4251777.550 323384.503 4251775.550 323400.003 4251773.550 323415.003 4251772.050 323430.503 4251770.550 323446.003 4251769.550 323461.503 4251769.050 323476.503 4251768.550 323498.003 4251768.050 323629.003 4251768.550 323629.003 4252187.550 323839.503 4252186.550 323859.503 4252186.550 323944.003 4252186.050 323970.003 4252186.050 324018.003 4252185.550 324018.503 4252205.050 324019.003 4252224.550 324029.503 4252611.550 324063.503 4252611.050 324510.503 4252602.550 324535.503 4252602.050 324582.003 4252601.050 324581.003 4252260.050 324568.003 4252182.550 324739.003 4252181.550 324760.503 4252181.050 325227.503 4252178.050 325284.503 4252176.550 325285.503 4251360.550 326099.003 4251360.050 326085.003 4250552.550 325271.503 4250552.050 325218.003 4250567.050 gdalautotest-3.0.4/ogr/data/lines.gen0000644003401500001440000000004413614004466017137 0ustar rouaultusers1 2,49 3,50 END 2 3,50 2,49 END END gdalautotest-3.0.4/ogr/data/inlineStr.xlsx0000644003401500001440000001747313614004466020237 0ustar rouaultusersPKZ{@L<[Content_Types].xmlUT rO-rOux m.n0DUb袪*>- }C,ҪF 93g<יZ*g+:.GN*⥸#kg;@:^_M;HbEc(0Kcz KX% g#XA ( dC|&qXYLn?efvEZ SrZVk$egs]؟@; x1 }.F5_Hޗ@y2ˤF!e0" 0օՇsn21yd uqȅHOٻȺo:.+uPK Z{@ docProps/UT rOrOux m.PKZ{@jbk-WdocProps/core.xmlUT rOrOux m._K0C{v'ŷmI۷7^|9ԳoAY ZV*nrߡ,Dn$fi Y{}U DŽ,L`5hcC&+5kk%!7XCG`&": w#@ h01`ZPu0*'NEQ۠&cE_֔˸jp+`ַ:"y@a}+,`Gzx\Q[Z ]Գ_> ,OG@;> PKZ{@3)docProps/app.xmlUT rOrOux m.Rn0 ?7rY,a$ΪLBmYOv`YwOO$GSGx4flYVcƞ!)[Y =ʛ/b] `,,f"jWQm:P#wei4l~oO8A` (nɐWit_6Immޡ+)ʵD]߽bU ,KU#~!~j;e7x9_\&8|)PKZ{@+docProps/thumbnail.wmfUT rOrOux m.MU|v:Kv1 x$!dF1K"(Ea+Aa<\4 Y ĐUw%qYTy4>2<bˈ"XCgeo / :'t*ϲ}lKb:yQH?Yw:'y?RKqG-ÚM"{q PgKU:5XUBW٪cZQjsruW[U<0"jy9PcVMU*P Uv)}'UjEJKT"6|JKqwV-@@Rm/U1eE6eGb [RlNb[*RlɍT *U*.ş~XVCT%ۥxIb [Rl╫R(,IUM&3z{S>23q jpY,w:T?>+/n.[71|t~7s:Zq)s=8{^О9=Oy=jI|=O<ȳlJϳ7̌/yn:)dpPK Z{@_rels/UT rOrOux m.PKZ{@%S _rels/.relsUT rOrOux m.j0 ѽqڍ1F^Ơ1Pm%1-ck3 temIz3QQ]ˢAN6yZ܃ ƑUpjB#{+SRFՓX'+-)C'=;'Sluao@4GOcKK 5&-|!08"|}4]-C!bbЕ"93GM$[o{1XqL\)dj.0·xH},?ɑJNR9UKAL\?-<鱱$]sPIӎEBS)c%0]eO_+'4;1`KAeĔ,6k' iD 74]ׇ8A,['쁮AL~ [' inO~;_:oGyg- ]oԼ?fa`bXdsBJ=LÓ؀{BS}7ۖg_G=[.Z"ea3ٱ]7Bo= 'x~ysV{[ /PK Z{@ xl/_rels/UT rOrOux m.PKZ{@p-xl/_rels/workbook.xml.relsUT rORrOux m.݊0oVXd1Fz+B:6 Yoo\«L,q; ; KRh{*T_szpLH,>?k4!zO"R,)d:5%Σ/ (C+6[ݢ[[wLQ BY@TWخiz+gFBOC\@T: :wsū<7gwfػ9.Ar #\PKZ{@]f1 xl/styles.xmlUT rOKrOux m.j0_%*tE=.zD#ɸhquB=73;$TQI !IsO#Xomk\(R2cд̹HmM71靔&e^i,AČsE* B)!̂1ϵd+ f̋EBuF{V,2~m4D̜Gvkٔf^m>@\G_`EۅM Q^4F3Exl RVើ=ruR@I8]1q7|_s}uI~%7Bп ͸:G]u8$^`A7}F e7K֦My')PK Z{@ xl/theme/UT rOrOux m.PKZ{@%Sxl/theme/theme1.xmlUT rOVrOux m.YMD#F;ͮ6٤vnZęӌ=d( 7J\ʯY("/#x3fE9$~CDH\Y>8h[ - If<&mkFue.M &n[RɦmKý1V=F̮jM;4P#`{k<>A5gc+nLD"Î&N#g:Ĭm?B K7V-Xe{ATF>]A03: Nݸ_z^,e`u-3穁UݚWsxctĻ+VnKxwVlw[+[gxN㹈2xkKeWN\=.Ȃ%d}uq4&ڝ|˗+[,$}Aն>N0Tُ/=A/=>~/?@x ǁN/Sד^<ʌ:>/@?<2D7f@liTXޜafuHyw4^I׃PL5Q 9pa4z*K7gfb1>4mo@&SnHJj16HLJ !K}%+tF P23).fpfbCH(L, +**5ӑ7 MJ̄_rT0z#"斘ԽþfQ)70:rO!4uGr)WF%xB5ǕC:[YߦAhNT]#֌nh2\6<ヒ}ksq/ǔ5cZG}b&OB,ĕp5\}BUx8@.$`UΎXQφ 6*F`]aKo&ɁkJs<4TiMӓӬ!c0#9yX=D2#R14t[^Ӥm4L:AŹsRm%Jj9BGW,ma(~2m@qUa+tjD$B,Ü*5u/{n1ЍӢrC-쓡%1UrYSEA8:BC6vQ ό|!B"ʕ_TW4Eu`I--9<^萭4 _Ӕ9⽻ ckc` 9ڶP!. 2YHUB,}J}+7 T4@BS dOvSןsFEY+wH LP8ɠ٦xq+&ǃ ,5}Qf*Q[7[\~&p@4n*|o|%D*o9[q)wZU>5g7*}wgwLZ8(Mۤp2>tPKSZ{@^LXxl/workbook.xmlUT }rO_rOux m.Pn0+[ R_R#%J.,mD]&xg4٠Swh49iRJM@̕@Ot,B*V(e\Cꚗpʾi&\Iΐ" hǺ `>TB}ws1$H-i7UP^6$(ZԆ`~E#[.+5&B0~+$/W=55q2w9艽;T=1rS^WK5KxڙLJ\j<9*f?ҿp=g=K&JX\(pWVM'+.PKZ{@L<[Content_Types].xmlUTrOux m.PK Z{@ AdocProps/UTrOux m.PKZ{@jbk-WdocProps/core.xmlUTrOux m.PKZ{@3)TdocProps/app.xmlUTrOux m.PKZ{@++docProps/thumbnail.wmfUTrOux m.PK Z{@AF _rels/UTrOux m.PKZ{@%S  _rels/.relsUTrOux m.PK SZ{@A xl/UT}rOux m.PK Z{@A xl/worksheets/UT rOux m.PKZ{@sI M xl/worksheets/sheet1.xmlUT rOux m.PK Z{@ Axl/_rels/UTrOux m.PKZ{@p-+xl/_rels/workbook.xml.relsUTrOux m.PKZ{@]f1 Yxl/styles.xmlUTrOux m.PK Z{@ Axl/theme/UTrOux m.PKZ{@%SIxl/theme/theme1.xmlUTrOux m.PKSZ{@^LXHxl/workbook.xmlUT}rOux m.PKHgdalautotest-3.0.4/ogr/data/poly_indexed.tab0000644003401500001440000000027713614004466020515 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 3 AREA Decimal (12,3) Index 1 ; EAS_ID Decimal (11,0); PRFEDEA Char (16) Index 3 ; gdalautotest-3.0.4/ogr/data/smalltest.dgn0000644003401500001440000002500013614004466020033 0ustar rouaultusers  zE [Fd@@2=F*1!*c@@:&@%| @@<QZ|7@@_<^_~|@@[<搾'|7@@_<.b|7@@_<.b|7@@_<.b@@@@ musu@@@@@''9Wm z@Q8X@ zffff`` L @@@pbHPT_DD_IGDS:FONTLIB. ~B,=??]XA BVHCM@R-M@R-M@R-M@R-M@R-M@R-M@R-M@R- @@ @@!'% VBVH@@@@`AHCHHHHHHHH HHHHH@@@@@@@K JBCC' BB{ Cable / Tele }!Nonknkn֤ Demo Text" ?nzi6Hڠ6HڠCH3H -8b!3S+8g!b3+ASbc% Scb%+ASbc% Scb%gdalautotest-3.0.4/ogr/data/testdatetime.csvt0000644003401500001440000000002013614004466020721 0ustar rouaultusersString,DateTime gdalautotest-3.0.4/ogr/data/test_point3.gml0000755003401500001440000000355713614004470020320 0ustar rouaultusers -1.3501138991774910.1666231936981584 -0.52409271914723420.8245083207261725 -0.924357034795764,0.824508320726173 1.000 1 1 -0.717738710070079,0.166623193698158 3.000 3 3 -1.159493626862817,0.178726068130836 4.000 4 4 -0.524092719147234,0.499452240596797 2.000 2 2 gdalautotest-3.0.4/ogr/data/seamless.tab0000644003401500001440000000024713614004466017643 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 2 Table Char (254) ; WKT Char (254) ; "\IsSeamless" = "TRUE" gdalautotest-3.0.4/ogr/data/wfs10.xsd0000644003401500001440000000246313614005346017017 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/solid.dxf0000644003401500001440000000041213614004466017146 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 SOLID 8 0 10 -2.716846 20 2.762514 30 0.0 11 -2.393674 21 1.647962 31 0.0 12 -4.714214 22 2.183362 32 0.0 13 -4.391042 23 1.06881 33 0.0 210 0.0 220 0.0 230 -1.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/poly.shx0000644003401500001440000000026413614004466017045 0ustar rouaultusers' Z 1A @+RA@eA-RA2H@gdalautotest-3.0.4/ogr/data/points25d.gen0000644003401500001440000000003013614004466017647 0ustar rouaultusers1,2,49,10 2,3,50,20 END gdalautotest-3.0.4/ogr/data/nan.dbf0000644003401500001440000000013213614004466016561 0ustar rouaultusers_AWrealN nangdalautotest-3.0.4/ogr/data/ogr_gml_55.gml0000644003401500001440000000146313614004466020000 0ustar rouaultusers 00 11 0 0,0 1,1 1,1 0,0 0 12 gdalautotest-3.0.4/ogr/data/test_missing_row1_data.xlsx0000644003401500001440000001715113614004466022732 0ustar rouaultusersPK`*Lxl/_rels/workbook.xml.relsMk0 FIc8AQ6ֵ~.[ eГH4C vV͢h%؀I/Z8Y.b;]JNɺQ/IӜS[n+Psc _{0 r3Rb+/2m=?"#ʯR6w _fz o ۭP~$E|PKOz%PK`*Lxl/sharedStrings.xmlMs0;>tڙcpHƔ;{5%WI6MrJʓ_ehjJM B+z5Zjfb*;rK߷I]ڔd 戮,^;K!>(7%pq!yI{ȥDBg.3z`{4-N|74iJeByդhX[H"HAWYV-r"q%/H?a}(X`Y,w Y"Wʕ;9y>Dz`1O]:M +lc6է8u"b ׼3/gpU$"~tϲ]kȑ2rE8&Y֭LEw80A%P1kZbX--Kp M5bvMFcwV`{Ph;T&1b?4UIr՝Jn#>8݆e['+4gd"xp'n$L C⊥X_ۇWӢ58 :ZAPx:6Hۮwч,eѬ}?TPgZlMA7ёiHE=~7%BqBE l']R?ZѷN?f)]6oK;z{|1ڷty|vt4`0 Fu$!HLG7PK G PK`*L#xl/worksheets/_rels/sheet1.xml.relsN1D{ڞ(4(|Yw-{AY $"QPn)|`f EoO7W^T uHZÊ+* Em#ڻq7+9qހ9}V%|^ *DgQ.1.?" V۫PKeD3PK`*Lxl/worksheets/sheet1.xmlŝ_SHSnx6 q`Mվ UZ C>vK[ sxHսW4__\G^7(O/"ˇ_ǣFe'gތm$͊s9R d04_#*^3KQS>y spNrePbL,6k^.I͋TU^5ٴpSy!y}%22-U=/==M'ųi z*/Om#ڀ;5+4W}n٦k?yv\z/ފSQi7nVK2_H_w*r.AƗ馐UNGɸc-TJQ(mG {xC"-Ԑu>i/7W8/giҟZ^y]I]VUxGusA];j>1zx9V;jYɟs=WZV~',Q^G^dw[XUO4R\m7ag/eۚOգ;/ۿ7AKCEzo[%$0|^_ҳL޾Wmse;\d`)GN}ɰ/J]G)%#`c'ao_2Kƶo_2K&o_ܭG-j@ցt˜;Bѭ̈́s#Xmm^0>Bѭ͉8~K[+kuw5#:1Ի#*zl6O{Fi\RΦxE+{ٵ?,t`puŏb8sGcaF#a0;4#]E9ÈaDtq1#~F$Y&f rx3dLʒK1kK1K1-!ho-!/(T>w/VYۙvV*76ba3 w(k`AP%!sK! K!_-!F/WC*זC*7?-!vZBw7 !c,3%!.ÀEǘgKNCQCQ?[ʒӐK!a@SBFȭ%$gEW%TRk%2_KIRKNSS?[ʒT07F{= bҋRK+* Y@:Pp3%|HjUj>Z2!5S z*4$xn 1ua 1r] sl 1v2%)d^y Me#LS68KTu=+}~uAfE "]ȯȯȯȯȯȯȯȯȯȯȯ<_y @~+Wȯ<_y A~+W>ȯ|_ A~*UWȯ_ @~*UW!ȯB_ A~*UW!ȯ"_E @~*U3*UW1ȯb_ A~*U@~*UW ȯ_% J@~*A0^(bE!.uQШF]6ꢸQ(¡(0xw#a;y'N(P;wB" }'N(P;wB" 'O( P<8xB" ' O(P8>{+PK9 PK`*Lxl/workbook.xmlSr0}Wxp)0 5x&ɳl,y%@:e>͹3+Y8 *ׅP}{H3YR+,Y[9dZIe:xk:[mċV.7Zʘ9^Q"vP<$TO1]O$ hlnA+,GCݷ$g0]©gzE o:r;OOaKλ*; $f!(`!0nN}TD!l9(? քv.jo@"' Ѣ;RI@' %ُh̦ ZAn'dnӔ&lytPK: }$P.s̶q)w^_PK4\pPK`*L xl/styles.xmlX]o0}߯Bh]?ĴN՚J=8`~6-٤Rb|UApё f1Ox7ޞ@ b VX³/UEmJG9.<%fLȆ(&u=@g"*1_2I;|J6o 䉖3,/g+? 30Q)gkShЗOQ>21\-En۰KDB NΑOWW56*mP bM{^?BiZ K,ϫRr4uo3xK]wEw[y[$e!zW0ETbAW`S*M,HQ1$JB9etSzkzkzWk݂F{sh *KZEܐ( pQ sJ2VU5 9IS5e  ++dYGʹ; Kasd{"s^J7r>vѹiT;.#f|󂘝{ f1>SNG{fWj?qw'nWs}=)雗mlۿWmmaP`k D{-*šYB.,֫Isɋ,ـf% 証Rc:0Mg:9 h2o&PK ?PK`*L _rels/.relsN0 {*5@LH!4$năD Îq~bLn,0&K^UY&c}qy/6͢~8GRoC*rOJAʤ{tJ MKcd=@r]Uw2dYqgVMmk5nIz>3W"!vJL|8 e ye} 0HM!ӷ!阘rpbͼ0gt{M#}HL3_JZPK4PK`*LdocProps/custom.xmlMo0>[PT `4;ė{W4iYWdӗ6֕sJ3c p('"gvN 91h)zUBReՎM:1r&%enW jlP( Fh&ȱ@1$GmDKf'\tzmKsxay Ͳ SC ES8|!듍5/PKZ<pPK`*LdocProps/app.xmlj0E #DŽ +-U'*z!U[H.;w8`Ś1izr_դ'Гܐ"pJ'gHdk"jHE&ԓ#bRHU]v&,i-8M]w@$ U^އs<5< 3h YEK^FxAUYcӍ][4/Hz8kʆ[׷oPK;Y{PK`*L[Content_Types].xmln0E|Em* J]Hʵb?1@"'3;.M- vb2)m{?lXfTkbMs `#"Ô{!gb ߿61i|"\ Q_5@݅ٛsedbVK._XoF{c#(3&qH7h ɹ})zׇYt'}i|v z,FU g_Nty}뗸k8 #sΜt-{҄; p{" ~1j3wd" ~1|tW4" ~1jDQ="~} ~1}!}":h" ~1j,'} $" ~1}"dcL" ~1j6`_"~} ~1}#oDv" ~1j&o8" ~1}$crF" ~1j+zX"~} ~1}%%(J" ~1j@9f" ~1}$u gdalautotest-3.0.4/ogr/data/poly_vrt.vrt0000644003401500001440000000023513614004466017747 0ustar rouaultusers poly.shp gdalautotest-3.0.4/ogr/data/poly_indexed.map0000644003401500001440000001700013614004466020514 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?e9i#HhMDB|Q^@t^}MY@ "@x#?AB5$g`&hNVh"9ix@h[g'h"rgEgh ahlgglgig[7h hh[3h3h4hf3h=uh0hEgh*h1*vh[7higUQg*?guPg ZEgx,gg=UgЬg:g 3H9gQgAUhf+h?hJhRh[h$U^h g"XvPh"u7hvPh *h" hIgMg\ggg"XgpEyug>og3_g]5NgCg`0gX gGi,gl;gsLg:^gI~g\WgwgtQ1g)ggtIg*g<h"u7h=4 eJhIgBfBgVhRho+h(h1hHh\h'ah.ha2h>h(DhJh)hahggF?g:ͻg5g!/rg#ggXg5 g4dfGf,f[Cfۄ;f^$3f32fs?ffvff!\tfYe/e=eVe&].eeǵWe}e4 fb(֤f{6 gX g`0gCg]5Ng3_g>ogpEyug"Xggg\gMgIgif\*gmg*gtIgg)gtQ1gwg\WgI~g:^gsLgl;gGi,gX g{6 gb(֤f4 f YfbfZFf\fo'gUQgiglg[gmg22|12|11|01|*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hhe9i## h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak4211|01|*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak4211|01|*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak4211|01|*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak4211|01|*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42*h4%iF4%ii}xhNV\hjah0h>uhf3h4h3h[3hh h5^Ph9xh1*vh*hjThRhF4%ikA˔'4k42a4 '&Ak42gdalautotest-3.0.4/ogr/data/content_formulas.xml0000644003401500001440000002300613614005346021437 0ustar rouaultusers ab a MIN MIN SUM AVERAGE COUNT COUNTA abcdef gdalautotest-3.0.4/ogr/data/linestring.geojson0000644003401500001440000000013413614004466021076 0ustar rouaultusers{ "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }gdalautotest-3.0.4/ogr/data/testwfs.xml0000644003401500001440000003654113614005347017565 0ustar rouaultusers http://www.tinyows.org/cgi-bin/tinyows TinyOWS Server - Demo Service WFS 1.0.0,1.1.0 TinyOWS Server tinyows-users@lists.maptools.org 1.1.0 1.0.0 text/xml ServiceIdentification ServiceProvider OperationsMetadata FeatureTypeList ServesGMLObjectTypeList SupportsGMLObjectTypeList text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 results hits text/xml; subtype=gml/3.1.1 text/xml; subtype=gml/2.1.2 application/json text/xml; subtype=gml/3.1.1 GenerateNew UseExisting Query tows:world World Administrative Boundaries urn:ogc:def:crs:EPSG::4326 180.000000 -90.000000 -180.000183 83.623032 tows:france French Administrative Sub Boundaries (IGN - GeoFLA Departements) urn:ogc:def:crs:EPSG::27582 9.559832 41.363043 -5.139026 51.089388 tows:frida Frida Parks urn:ogc:def:crs:EPSG::31467 Insert Update Delete 8.178450 52.224478 7.929953 52.335351 gml:AbstractGMLFeatureType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:PointType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:LineStringType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:PolygonType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:MultiPointType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:MultiLineStringType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:MultiPolygonType text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 gml:Envelope gml:Point gml:LineString gml:Polygon EqualTo NotEqualTo LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo Between Like NullCheck abs acos asin atan avg cbrt ceil ceiling cos cot count degrees exp floor length ln log min max radians round sin sqrt tan trunc gdalautotest-3.0.4/ogr/data/block-insert-order.dxf0000644003401500001440000000672513614004466021556 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1009 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 70 1 0 VPORT 2 *ACTIVE 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 18.9973091232442 22 8.8158683010775594 13 0.0 23 0.0 14 0.5 24 0.5 15 0.5 25 0.5 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 25.402675667279428 41 2.0256081946222788 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 1000 73 1 74 3 75 1 76 1 77 0 78 0 0 ENDTAB 0 TABLE 2 LTYPE 70 3 0 LTYPE 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 0.375 49 0.25 49 -0.125 0 ENDTAB 0 TABLE 2 LAYER 70 1 0 LAYER 2 0 70 0 62 7 6 CONTINUOUS 0 ENDTAB 0 TABLE 2 STYLE 70 3 0 STYLE 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 STYLE 2 ANNOTATIVE 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 STYLE 2 LEGEND 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 70 0 0 ENDTAB 0 TABLE 2 UCS 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 70 3 0 DIMSTYLE 2 STANDARD 70 0 3 4 5 6 7 40 1.0 41 0.18 42 0.0625 43 0.38 44 0.18 45 0.0 46 0.0 47 0.0 48 0.0 140 0.18 141 0.09 142 0.0 143 25.399999999999999 144 1.0 145 0.0 146 1.0 147 0.09 71 0 72 0 73 1 74 1 75 0 76 0 77 0 78 0 170 0 171 2 172 0 173 0 174 0 175 0 176 0 177 0 178 0 0 DIMSTYLE 2 ANNOTATIVE 70 0 3 4 5 6 7 40 0.0 41 0.18 42 0.0625 43 0.38 44 0.18 45 0.0 46 0.0 47 0.0 48 0.0 140 0.18 141 0.09 142 0.0 143 25.399999999999999 144 1.0 145 0.0 146 1.0 147 0.09 71 0 72 0 73 1 74 1 75 0 76 0 77 0 78 0 170 0 171 2 172 0 173 0 174 0 175 0 176 0 177 0 178 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 8 0 2 $MODEL_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $MODEL_SPACE 1 0 ENDBLK 5 21 8 0 0 BLOCK 67 1 8 0 2 $PAPER_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $PAPER_SPACE 1 0 ENDBLK 5 5B 67 1 8 0 0 BLOCK 8 0 2 BLOCK1 70 0 10 0.0 20 0.0 30 0.0 3 BLOCK1 1 0 INSERT 5 5E8 8 0 2 BLOCK2 10 0.0 20 0.0 30 0.0 41 2.0 42 0.5 0 ENDBLK 5 5C4 8 0 0 BLOCK 8 0 2 BLOCK2 70 0 10 4.0 20 5.0 30 6.0 3 BLOCK2 1 0 CIRCLE 5 5DF 8 0 10 0.0 20 0.0 30 0.0 40 2.0 0 ENDBLK 5 5D8 8 0 0 BLOCK 8 0 2 BLOCK3 70 0 10 0.0 20 0.0 30 0.0 3 BLOCK3 1 0 INSERT 5 6E8 8 0 2 BLOCK4 10 5.0 20 5.0 30 0.0 0 INSERT 5 6E9 8 0 2 BLOCK4 10 5.0 20 5.0 30 0.0 41 0.4 42 1.0 43 1.5 50 40.0 0 INSERT 5 6EA 8 0 2 BLOCK4 10 5.0 20 5.0 30 0.0 41 0.4 42 1.0 43 1.5 50 40.0 210 0.6 220 0.565685424949238 230 0.565685424949238 0 ENDBLK 5 6C4 8 0 0 BLOCK 8 0 2 BLOCK4 70 0 10 -0.5 20 1.0 30 0.5 3 BLOCK4 1 0 CIRCLE 5 6DF 8 0 10 1.0 20 2.0 30 3.0 40 2.0 210 -0.565685424949238 220 0.6 230 0.565685424949238 0 ENDBLK 5 6D8 8 0 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 5EA 8 0 2 BLOCK1 10 8.0 20 2.5 30 6.0 0 INSERT 5 6EA 8 0 2 BLOCK3 10 -1.0 20 -2.0 30 -3.0 50 100.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/test_point4.gml0000644003401500001440000000354013614004466020313 0ustar rouaultusers -1.3501138991774910.1666231936981584 -0.52409271914723420.8245083207261725 -0.924357034795764,0.824508320726173 1.000 1 1 -0.717738710070079,0.166623193698158 3.000 3 3 -1.159493626862817,0.178726068130836 4.000 4 4 -0.524092719147234,0.499452240596797 2.000 2 2 gdalautotest-3.0.4/ogr/data/insert-recursive-pair.dxf0000644003401500001440000000223613614004466022304 0ustar rouaultusers 0 SECTION 2 TABLES 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 ABC0 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 RecursiveBlock1 70 0 10 0.0 20 0.0 30 0.0 3 RecursiveBlock1 1 0 INSERT 5 ABC1 100 AcDbEntity 100 AcDbBlockReference 8 0 2 RecursiveBlock2 10 0.0 20 0.0 30 0.0 0 ENDBLK 5 ABC2 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 DEF0 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 RecursiveBlock2 70 0 10 0.0 20 0.0 30 0.0 3 RecursiveBlock2 1 0 INSERT 5 DEF1 100 AcDbEntity 100 AcDbBlockReference 8 0 2 RecursiveBlock1 10 0.0 20 0.0 30 0.0 0 INSERT 5 DEF2 100 AcDbEntity 100 AcDbBlockReference 8 0 2 RecursiveBlock1 10 0.0 20 0.0 30 0.0 0 POINT 5 DEF3 100 AcDbEntity 100 AcDbPoint 8 0 10 0.0 20 0.0 30 0.0 0 ENDBLK 5 DEF4 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 1234 100 AcDbEntity 100 AcDbBlockReference 8 0 2 RecursiveBlock1 10 0.0 20 0.0 30 0.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/testlyrdef.gml0000644003401500001440000000153113614004466020222 0ustar rouaultusers 12.4567 12345.09876 1234567890 1234 gdalautotest-3.0.4/ogr/data/testdatetime.csv0000644003401500001440000000032313614004466020543 0ustar rouaultusersname,timestamp foo1,"2010/05/15 12:00:00" foo1bis,"2010/05/15 12:00:00" foo2,"2009/12/31 23:00:00" foo3,"2010/06/15 12:00:00" foo4,"2009/11/15 12:00:00" foo5,"2009/12/30 23:00:00" foo2bis,"2009/12/31 23:00:00" gdalautotest-3.0.4/ogr/data/buggypoint.shp0000644003401500001440000000020013614004466020227 0ustar rouaultusers' @ANAANA ANAgdalautotest-3.0.4/ogr/data/gjline.shx0000644003401500001440000000015413614004466017330 0ustar rouaultusers' 6Y@@Y@?2(gdalautotest-3.0.4/ogr/data/nullvalues.geojson0000644003401500001440000000042713614004466021117 0ustar rouaultusers{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "int": 168, "string": "string", "double": 1.23 }, "geometry": null }, { "type": "Feature", "properties": { "int": null, "string": null, "double": null }, "geometry": null } ] } gdalautotest-3.0.4/ogr/data/asm.shp0000644003401500001440000000245413614004466016635 0ustar rouaultusers' sCIOAcJTmA[ƒ}QALcTmA`sCIOAcJTmA[ƒ}QALcTmAH+?SPA9!ImAΆPA1 BmAPA|mAn>!PAk,-mA'PAmArPAߒ\rmA.+PAlmA~RuPA:kmA6HPAy!mA'1 PA֐mAc: PAB0mA2f PAdmA"{ PA:mAVҹPAmASPA9!ImA7PA( mA#  PAᮁmAfPA6N<mA}dCPAT}mA2PA{vF_pmAnRGPAcJTmArΩPAWt}EZmAIPAF'}mAPAQ)mAOkmPAhmA7PA( mAp"_OA8mA&LnxOA#r'mAԾռOA%mAr-iOA6Y*mAOA!ymAEOA?ΧcmAEOAچGmAoOA=mAOAS)*mA< }OA6YX%mA YϐOA)imALOAmA OA#1 mAsCIOAYkymAh.OAO,>mAOAfFmAp"_OA8mAJHnQALcTmAx33pQAk)mA8O7vQA6mA6CBQAmmA[ƒ}QAcmA R5QAo$ڶmA``݃QA2qmAgEQAz&umAg1QA_.omA'ZQAm[$mA("UQA@$mA:RQA)mA̸I5QAި#bbmAB|'4QA TsmAVd2QAXƣmAٟީ2QA<<mA~3QAӢ:mA-8QAR1mA@ KQA_mAJHnQALcTmA>-QA=Zui?mA W/QAUzGX;mAGt7c&1QAցڬ(mAI @2QAmA7~*.QAmA\+QAzomA5 *QArc@]mA49',QAq<mA>-QA=Zui?mAgdalautotest-3.0.4/ogr/data/testnumheader1.csv0000644003401500001440000000001613614004466020777 0ustar rouaultusers1 - 2,2-3 1,2 gdalautotest-3.0.4/ogr/data/CoHI_GCS12.sbn0000644003401500001440000000027413614004466017464 0ustar rouaultusers' p^d@2 cYn7@6;th eiz˲8gdalautotest-3.0.4/ogr/data/testfmegml.gml0000644003401500001440000000441713614004466020212 0ustar rouaultusers 49 2 50 3 49 2 49 2 49 2 49 3 50 3 50 2 49 2 49 2 49 3 50 3 50 2 49 2 49 2 50 3 49 2 50 3 gdalautotest-3.0.4/ogr/data/utm31.DAT0000644003401500001440000000010713614004466016635 0ustar rouaultusersrAidC gdalautotest-3.0.4/ogr/data/ogr_geojson_14.geojson0000644003401500001440000000606413614004466021547 0ustar rouaultusers{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties" : {}}, { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [null] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [null,1] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [1,null] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [null,null] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [1,1,null] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [1,2], null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [1,2], [3,4] ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [[0, 1],[0, 1],[0, 1] ], null,[[0, 1],[0, 1],[0, 1] ]] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPoint", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPoint", "coordinates": [ null, null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPoint", "coordinates": [ [0, 1], null, [2,3] ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiLineString", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiLineString", "coordinates": [ null, null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiLineString", "coordinates": [ [ null ] , [[0, 1],[0, 1],[0, 1] ], [ null ] ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ null, null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 0.000000, 1.000000 ], [ 2.000000, 3.000000 ], [ 4.000000, 5.000000 ], [ 0.000000, 1.000000 ] ] ], null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ ], [ ] ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "GeometryCollection", "geometries": null } } , { "type": "Feature", "properties": { }, "geometry": { "type": "GeometryCollection", "geometries": [ null, null ] } } , { "type": "Feature", "properties": { }, "geometry": { "type": "GeometryCollection", "geometries": [ { "type": "Polygon", "coordinates": [ null ] } , null ] } } ] } gdalautotest-3.0.4/ogr/data/testfmegml_interleaved.gml0000644003401500001440000000452713614004466022576 0ustar rouaultusers 49 2 50 3 49 2 49 2 49 3 50 3 50 2 49 2 49 2 50 3 49 2 49 2 49 3 50 3 50 2 49 2 49 2 50 3 gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb.csv0000644003401500001440000000255213614004466026114 0ustar rouaultusersWKT,ID "MULTIPOLYGON Z (((534586.835368027 725756.198823342 0,535288.413990388 726139.414037239 0,535341.474558465 725190.219430519 0,534899.303157819 724718.569936493 0,534156.455204732 725266.862473296 0,534586.835368027 725756.198823342 0)))",1 "MULTIPOLYGON Z (((534810.868877688 727047.339313235 0,535093.858574103 726835.097040925 0,535435.804457271 726846.888278278 0,535388.639507869 726469.568683054 0,534975.946200596 726351.656309549 0,534639.895936104 726546.211725833 0,534563.252893327 726923.531321056 0,534810.868877688 727047.339313235 0)))",2 "MULTISURFACE Z (CURVEPOLYGON Z (COMPOUNDCURVE Z ((532617.698730478 726263.222029418 0,533778.749499125 726793.621209962 0),CIRCULARSTRING Z (533778.749499125 726793.621209962 0,534031.164724155 726758.132658406 0,534250.785103535 726628.750387289 0),(534250.785103535 726628.750387289 0,534489.027379339 726416.087902565 0),CIRCULARSTRING Z (534489.027379339 726416.087902565 0,534383.792710315 726183.927295322 0,534197.724535458 726009.710426385 0),(534197.724535458 726009.710426385 0,533543.310862501 725602.912737787 0,532617.698730478 726263.222029418 0))))",3 "MULTISURFACE Z (CURVEPOLYGON Z (COMPOUNDCURVE Z (CIRCULARSTRING Z (533017.463810447 724362.047854263 0,532446.342873672 724777.166915435 0,532887.178590107 725328.680134213 0),(532887.178590107 725328.680134213 0,533017.463810447 724362.047854263 0))))",4 gdalautotest-3.0.4/ogr/data/assorted.dxf0000644003401500001440000003614313614004466017672 0ustar rouaultusers999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $INSUNITS 70 4 9 $DIMEXO 40 0.625 9 $DIMTXT 40 2.5 9 $DIMSTYLE 2 Standard 9 $PLIMMIN 10 0.0 20 0.0 9 $PLIMMAX 10 210.0 20 297.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 BLOCK_RECORD 5 A43 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 STAR 340 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 A44 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 STAR 70 0 10 0.0 20 0.0 30 0.0 3 STAR 1 0 LINE 5 A45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.0281474976710656 20 1.0414574138294284 30 0.0 11 0.6192449487634439 21 -1.0696049115004942 31 0.0 0 LINE 5 A46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.6192449487634439 20 -1.0696049115004942 30 0.0 11 -0.9570149208162315 21 0.4785074604081158 31 0.0 0 LINE 5 A47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.9570149208162315 20 0.4785074604081158 30 0.0 11 1.0414574138294284 21 0.3659174697238533 31 0.0 0 LINE 5 A48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.0414574138294284 20 0.3659174697238533 30 0.0 11 -0.4785074604081158 21 -1.0414574138294284 31 0.0 0 LINE 5 A49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.4785074604081158 20 -1.0414574138294284 30 0.0 11 -0.0562949953421313 21 1.0133099161583627 31 0.0 0 MTEXT 5 A4A 100 AcDbEntity 100 AcDbMText 8 0 62 256 370 -1 6 ByLayer 10 -1.4954523489932918 20 0.8137020134228206 30 0.0 40 0.5 41 100.0 71 5 72 0 1 Text\~Sample1\U+03bb\P"abc" 7 normallatin1 50 45.0 73 1 44 1.0 0 MTEXT 5 A4B 100 AcDbEntity 100 AcDbMText 8 0 62 256 370 -1 6 ByLayer 10 0.8796778523489952 20 -0.2639033557046986 30 0.0 40 0.5 41 100.0 71 1 72 0 1 Second 7 normallatin1 50 0.0 73 1 44 1.0 0 ENDBLK 5 B4A 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 ELLIPSE 5 43 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 53.25 20 121.25 30 0.0 11 20.0 21 18.5 31 0.0 40 0.2793869989895588 41 0.0 42 6.2831853071795862 0 ELLIPSE 5 44 100 AcDbEntity 100 AcDbEllipse 8 0 62 256 370 -1 6 ByLayer 10 72.75 20 103.25 30 0.0 11 14.25 21 -12.5 31 0.0 40 0.4432075143503218 41 1.4259840799113455 42 4.2201457807096334 0 POINT 5 45 100 AcDbEntity 100 AcDbPoint 8 0 62 254 420 16760504 370 -1 6 ByLayer 10 83.5 20 160.0 30 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 97.0 20 159.5 30 0.0 11 108.5 21 132.25 31 0.0 0 MTEXT 5 47 100 AcDbEntity 100 AcDbMText 8 0 62 256QSW 370 -1 6 ByLayer 10 84.0 20 126.0 40 5.0 41 100.0 71 1 72 2 1 Test 7 normallatin1 50 30.0 73 0 44 1.0 0 ARC 5 48 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbCircle 10 105.8857647814910052 20 102.168059125964021 30 0.0 40 10.9298946956641885 100 AcDbArc 50 119.8459319496874116 51 30.9637565320735213 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 67 1 8 0 62 256 370 -1 6 ByLayer 10 100.5157455012853518 20 111.6688624678663331 30 0.0 11 115.1111825192802058 21 107.9511568123393346 31 0.0 0 DIMENSION 5 4A 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 63.8628719444824569 20 149.209935992088333 30 0.0 11 42.8159077526357095 21 131.936242584545397 31 0.0 70 1 71 5 72 0 41 1.0 42 0.0 1 3 Standard 100 AcDbAlignedDimension 13 33.2334935729426135 23 102.5073636219480022 33 0.0 14 72.7544048488743726 24 139.782768575383642 34 0.0 0 DIMENSION 5 4B 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 115.1944743440510877 20 114.2962718150526484 30 0.0 11 107.8965787959386944 21 116.1712718150526484 31 0.0 70 0 71 5 72 0 41 1.0 42 0.0 1 3 Standard 100 AcDbAlignedDimension 13 100.5986832478263011 23 111.4893889119324939 33 0.0 14 115.1944743440510877 24 107.7843034798138859 34 0.0 50 0.0 100 AcDbRotatedDimension 0 DIMENSION 5 4C 100 AcDbEntity 8 0 62 256 370 -1 6 ByLayer 100 AcDbDimension 10 93.0403170057860933 20 90.808901686564937 30 0.0 11 91.1653170057860933 21 101.1413247951324195 31 0.0 70 0 71 5 72 1 41 1.0 42 0.0 1 3 Standard 100 AcDbAlignedDimension 13 100.4136893649516225 23 111.4737479036999162 33 0.0 14 101.4808879958834638 24 90.808901686564937 34 0.0 50 90.0 100 AcDbRotatedDimension 0 INSERT 5 55 100 AcDbEntity 100 AcDbBlockReference 8 0 62 256 370 -1 6 ByLayer 2 STAR 10 79.0976537766561876 20 119.9621950624433424 30 0.0 44 1.0 45 1.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 4D 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 2 C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 4D 100 AcDbDictionary 281 1 3 DIMASSOC 350 4F 3 HIDETEXT 350 4E 0 DICTIONARYVAR 5 4E 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 4F 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/emptymultipoly.dbf0000644003401500001440000000025113614004466021124 0ustar rouaultusers_aHFIDN NAMEC< 2 MultiPoly 1 gdalautotest-3.0.4/ogr/data/replace_nas.xml0000644003401500001440000002202413614005347020331 0ustar rouaultusers 000041AC NBA_RIO NBA_1000_NBA_RIO_2011-04-29T00:00:00Z NBA_NBA_RIO Benutzung 0040 beendet 2011-04-30T01:03:21.000Z 2011-04-30T01:05:02.000Z Ergebnis wohlgeformt und valide gegen seine Schemadateien Meldung ]]> true NBA_NBA_RIO - 3 false 3 true urn:adv:oid:DENW44AL00003IkM20110429T070635Z 2011-04-29T07:06:35Z DLKM 010402 http://www.bezreg-koeln.nrw.de/extra/33alkis/art.htm#5200 1988/ - http://www.bezreg-koeln.nrw.de/extra/33alkis/art.htm#5300 2007/15545-53 urn:adv:fachdatenverbindung:AA_Antrag urn:adv:oid:DENW44AL0000ol3u 405587.077 5645095.264 405619.756 5645088.037 405619.756 5645088.037 405624.623 5645148.000 405624.623 5645148.000 405601.501 5645143.163 405601.501 5645143.163 405603.970 5645134.207 405591.735 5645131.468 405591.735 5645131.468 405592.874 5645126.920 405592.874 5645126.920 405592.875 5645107.339 405592.875 5645107.339 405587.077 5645095.264 05 4208 63 05420801400063______ 1520.00 14 false false 1988-01-01 05 3 74 040 05 5212 NBA_1000_NBA_RIO_2011-04-29T00:00:00Z NBA_RIO 2011-04-30T00:00:00Z 0 0 0.000 0.000 gdalautotest-3.0.4/ogr/data/byblock-bylayer.dxf0000755003401500001440000002730613614004470021137 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $HANDSEED 5 2CC0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 330 0 100 AcDbSymbolTable 70 4 0 LTYPE 5 14 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 370 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 0.375 49 0.25 74 0 49 -0.125 74 0 0 LTYPE 5 E7C 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Dash 1_16_ 70 0 3 72 65 73 2 40 3.175 49 1.5875 74 0 49 -1.5875 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 330 0 100 AcDbSymbolTable 70 10 0 LAYER 5 10 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 347 EE 348 0 0 LAYER 5 E7D 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 Defpoints 70 0 62 7 6 Continuous 290 0 370 -3 390 F 347 EE 348 0 0 LAYER 5 E7F 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 _K_POINTS 70 0 62 1 6 Continuous 370 -3 390 F 347 EE 348 0 0 LAYER 5 E84 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 TheYellowLayer 70 0 62 2 6 Continuous 370 -3 390 F 347 EE 348 0 0 LAYER 5 EF238 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 TrueColorLayer 70 0 62 101 420 9367964 6 Continuous 370 -3 390 F 347 EE 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 541 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $MODEL_SPACE 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 543 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 $PAPER_SPACE 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 135C 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *D54 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 2959 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 testingbyblock 340 0 70 6 280 1 281 0 0 BLOCK_RECORD 5 2A25 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 _BoxFilled 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEF65 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 BlockWithLineByLayer 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEFFE 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 BlockWithLineByBlock 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 EF221 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 BlockWithTrueColorLine 340 0 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 542 330 541 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $MODEL_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $MODEL_SPACE 1 0 ENDBLK 5 71 330 541 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 544 330 543 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 $PAPER_SPACE 70 0 10 0.0 20 0.0 30 0.0 3 $PAPER_SPACE 1 0 ENDBLK 5 6D 330 543 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 135D 330 135C 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *D54 70 1 10 0.0 20 0.0 30 0.0 3 *D54 1 0 LINE 5 2C51 330 135C 100 AcDbEntity 8 _K_POINTS 6 Dash 1_16_ 62 0 440 16777216 370 -2 100 AcDbLine 10 316828.0939170073 20 5814531.484526424 30 0.0 11 316828.2614803678 21 5814532.59179733 31 0.0 0 LINE 5 2C52 330 135C 100 AcDbEntity 8 _K_POINTS 6 Dash 1_16_ 62 0 440 16777216 370 -2 100 AcDbLine 10 316838.1207556715 20 5814529.967164436 30 0.0 11 316838.288319032 21 5814531.074435341 31 0.0 0 LINE 5 2C53 330 135C 100 AcDbEntity 8 _K_POINTS 62 5 440 16777216 370 -2 100 AcDbLine 10 316828.7289189021 20 5814532.339010431 30 0.0 11 316832.0380456763 21 5814531.838240112 31 0.0 0 LINE 5 2C54 330 135C 100 AcDbEntity 8 _K_POINTS 62 5 440 16777216 370 -2 100 AcDbLine 10 316837.7670149703 20 5814530.971274906 30 0.0 11 316834.4578881959 21 5814531.472045225 31 0.0 0 INSERT 5 2C55 330 135C 100 AcDbEntity 8 _K_POINTS 62 5 440 16777216 370 -2 100 AcDbBlockReference 2 _BoxFilled 10 316828.234547604 20 5814532.413823664 30 0.0 41 0.5 42 0.5 43 0.5 50 171.3947196696292 0 SOLID 5 2C56 330 135C 100 AcDbEntity 8 _K_POINTS 62 5 440 16777216 100 AcDbTrace 10 316837.7794838423 20 5814531.053670123 30 0.0 11 316837.7545460982 21 5814530.888879691 31 0.0 12 316838.2613862682 22 5814530.896461674 32 0.0 13 316838.2613862682 23 5814530.896461674 33 0.0 0 MTEXT 5 2C57 330 135C 100 AcDbEntity 8 _K_POINTS 62 0 440 16777216 100 AcDbMText 10 316833.2479669361 20 5814531.655142667 30 0.0 40 0.4 41 0.0 46 0.0 71 5 72 1 1 \A1;10.141 (2C) 73 1 44 1.0 0 POINT 5 2C58 330 135C 100 AcDbEntity 8 Defpoints 62 0 440 16777216 100 AcDbPoint 10 316828.0845653531 20 5814531.422730014 30 0.0 0 POINT 5 2C59 330 135C 100 AcDbEntity 8 Defpoints 62 0 440 16777216 100 AcDbPoint 10 316838.1114040173 20 5814529.905368025 30 0.0 0 POINT 5 2C5A 330 135C 100 AcDbEntity 8 Defpoints 62 0 440 16777216 100 AcDbPoint 10 316838.2613862682 20 5814530.896461674 30 0.0 0 ENDBLK 5 135E 330 135C 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 2A28 330 2A25 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 _BoxFilled 70 0 10 0.0 20 0.0 30 0.0 3 _BoxFilled 1 0 SOLID 5 2C62 330 2A25 100 AcDbEntity 8 0 6 ByBlock 100 AcDbTrace 10 -0.5 20 0.5 30 0.0 11 0.5 21 0.5 31 0.0 12 -0.5 22 -0.5 32 0.0 13 0.5 23 -0.5 33 0.0 0 LINE 5 2C63 330 2A25 100 AcDbEntity 8 0 6 ByBlock 62 0 370 -2 100 AcDbLine 10 -0.5 20 0.0 30 0.0 11 -1.0 21 0.0 31 0.0 0 ENDBLK 5 2A29 330 2A25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 295A 330 2959 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 testingbyblock 70 0 10 0.0 20 0.0 30 0.0 3 testingbyblock 1 0 LWPOLYLINE 5 2963 330 2959 100 AcDbEntity 8 0 100 AcDbPolyline 90 4 70 0 43 0.0 10 0.0 20 50.0 10 50.0 20 50.0 10 50.0 20 0.0 10 0.0 20 50.0 0 LWPOLYLINE 5 2964 330 2959 100 AcDbEntity 8 0 62 0 100 AcDbPolyline 90 4 70 0 43 0.0 10 0.0 20 50.0 10 0.0 20 0.0 10 40.0 20 0.0 10 0.0 20 40.0 0 INSERT 5 EEF91 330 2959 100 AcDbEntity 8 TheYellowLayer 6 Continuous 62 4 100 AcDbBlockReference 2 BlockWithLineByLayer 10 27.0 20 39.0 30 0.0 41 20.0 0 INSERT 5 EF024 330 2959 100 AcDbEntity 8 0 6 Continuous 62 0 100 AcDbBlockReference 2 BlockWithLineByBlock 10 27.0 20 35.0 30 0.0 41 20.0 0 ENDBLK 5 295B 330 2959 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEF66 330 EEF65 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 BlockWithLineByLayer 70 0 10 0.0 20 0.0 30 0.0 3 BlockWithLineByLayer 1 0 LINE 5 EEF76 330 EEF65 100 AcDbEntity 8 0 6 Continuous 100 AcDbLine 10 0.0 20 1.0 30 0.0 11 1.0 21 0.0 31 0.0 0 ENDBLK 5 EEF67 330 EEF65 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEFFF 330 EEFFE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 BlockWithLineByBlock 70 0 10 0.0 20 0.0 30 0.0 3 BlockWithLineByBlock 1 0 LINE 5 EF00F 330 EEFFE 100 AcDbEntity 8 _K_POINTS 6 Continuous 62 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.0 21 1.0 31 0.0 0 ENDBLK 5 EF000 330 EEFFE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EF222 330 EF221 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 BlockWithTrueColorLine 70 0 10 0.0 20 0.0 30 0.0 3 BlockWithTrueColorLine 1 0 LINE 5 EF232 330 EF221 100 AcDbEntity 8 0 6 Continuous 62 194 420 6162587 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.0 21 1.0 31 0.0 0 ENDBLK 5 EF223 330 EF221 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 DIMENSION 5 11B6 330 1F 100 AcDbEntity 8 _K_POINTS 62 6 100 AcDbDimension 280 0 2 *D54 10 316838.2613862682 20 5814530.896461674 30 0.0 11 316833.2479669361 21 5814531.655142668 31 0.0 70 33 1 <> (2C) 71 5 42 10.14100000017788 73 0 74 0 75 0 3 Standard 100 AcDbAlignedDimension 13 316828.0845653532 23 5814531.422730014 33 0.0 14 316838.1114040173 24 5814529.905368025 34 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 343 1005 2A25 1070 173 1070 1 1070 344 1005 0 1070 176 1070 5 1070 41 1040 0.5 1070 347 1005 E7C 1070 346 1005 E7C 1070 271 1070 3 1070 140 1040 0.4 1070 40 1040 1.0 1002 } 0 INSERT 5 2967 330 1F 100 AcDbEntity 8 _K_POINTS 62 213 100 AcDbBlockReference 2 testingbyblock 10 316837.5898570446 20 5814531.789244315 30 0.0 41 0.02 42 0.02 43 0.02 0 CIRCLE 5 2A3D 330 1F 100 AcDbEntity 8 TheYellowLayer 62 0 100 AcDbCircle 10 316834.0174588577 20 5814534.265276623 30 0.0 40 1.649074916130547 0 INSERT 5 EF218 330 EEEEE 100 AcDbEntity 8 TrueColorLayer 6 Continuous 62 132 420 1629409 100 AcDbBlockReference 2 BlockWithLineByBlock 10 316837.2095681315 20 5814533.908666889 30 0.0 0 INSERT 5 EF236 330 EEEEE 100 AcDbEntity 8 TrueColorLayer 6 Continuous 62 4 100 AcDbBlockReference 2 BlockWithTrueColorLine 10 316837.3334775944 20 5814533.512409018 30 0.0 0 INSERT 5 EF237 330 EEEEE 100 AcDbEntity 8 TrueColorLayer 6 Continuous 100 AcDbBlockReference 2 BlockWithLineByBlock 10 316837.0689098563 20 5814534.325012657 30 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/prjwithutf8bom.prj0000644003401500001440000000025413614004466021046 0ustar rouaultusersGEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] gdalautotest-3.0.4/ogr/data/testgeometryelementpath.gml0000644003401500001440000000130313614004466023014 0ustar rouaultusers attrib1_value attrib2_value 3,50 2,49 gdalautotest-3.0.4/ogr/data/huge_attribute_start.gml0000644003401500001440000000052213614004466022264 0ustar rouaultusers xgdalautotest-3.0.4/ogr/data/PERMANENT/0000755003401500001440000000000013614004466016665 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/PERMANENT/dbf/0000755003401500001440000000000013614004466017420 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/PERMANENT/dbf/point.dbf0000644003401500001440000000016713614004466021232 0ustar rouaultusers_acatN nameC 1my point gdalautotest-3.0.4/ogr/data/PERMANENT/README.txt0000644003401500001440000000012513614004466020361 0ustar rouaultusersThis is an extract from the demolocation/PERMANENT dataset from the GRASS repository.gdalautotest-3.0.4/ogr/data/PERMANENT/PROJ_UNITS0000644003401500001440000000005013614004466020337 0ustar rouaultusersunit: degree units: degrees meters: 1.0 gdalautotest-3.0.4/ogr/data/PERMANENT/vector/0000755003401500001440000000000013614004466020167 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/0000755003401500001440000000000013614004466021320 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/head0000644003401500001440000000022113614004466022137 0ustar rouaultusersORGANIZATION: DIGIT DATE: DIGIT NAME: MAP NAME: MAP DATE: MAP SCALE: 1 OTHER INFO: ZONE: 0 MAP THRESH: 0.000000 gdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/topo0000644003401500001440000000026313614004466022225 0ustar rouaultusers+gdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/cidx0000644003401500001440000000006513614004466022173 0ustar rouaultusers )gdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/coor0000644003401500001440000000005313614004466022203 0ustar rouaultusers+gdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/hist0000644003401500001440000000177213614004466022221 0ustar rouaultusersCOMMAND: v.convert input="point" output="point" endian="big" GISDBASE: /home/neteler/grass63 LOCATION: demolocation MAPSET: PERMANENT USER: neteler DATE: Fri Apr 25 21:41:49 2008 --------------------------------------------------------------------------------- COMMAND: v.db.connect map="point" driver="dbf" database="$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/" table="point" key="cat" layer=1 GISDBASE: /home/neteler/grass63 LOCATION: demolocation MAPSET: PERMANENT USER: neteler DATE: Fri Apr 25 21:42:28 2008 --------------------------------------------------------------------------------- COMMAND: v.db.addtable "point" "col=name varchar(10)" GISDBASE: /home/neteler/grass63 LOCATION: demolocation MAPSET: PERMANENT USER: neteler DATE: Fri Apr 25 21:42:29 2008 --------------------------------------------------------------------------------- COMMAND: v.db.update "point" "col=name" "value=my point" GISDBASE: /home/neteler/grass63 LOCATION: demolocation MAPSET: PERMANENT USER: neteler DATE: Fri Apr 25 21:42:57 2008 gdalautotest-3.0.4/ogr/data/PERMANENT/vector/point/dbln0000644003401500001440000000006613614004466022164 0ustar rouaultusers1 point cat $GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ dbf gdalautotest-3.0.4/ogr/data/PERMANENT/PROJ_INFO0000644003401500001440000000011413614004466020171 0ustar rouaultusersname: Lat/Lon datum: wgs84 towgs84: 0.000,0.000,0.000 proj: ll ellps: wgs84 gdalautotest-3.0.4/ogr/data/point.geojson0000644003401500001440000000007113614004466020051 0ustar rouaultusers{ "type": "Point", "coordinates": [100.0, 0.0] }gdalautotest-3.0.4/ogr/data/attrib.dxf0000755003401500001440000000417613614004470017332 0ustar rouaultusers 0 SECTION 2 TABLES 0 TABLE 2 STYLE 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 1.0 50 0.0 71 0 42 8.0 3 arial.ttf 4 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 53B 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 AttBlock 70 2 10 0.0 20 0.0 30 0.0 3 AttBlock 1 0 CIRCLE 5 BE9 100 AcDbEntity 8 0 100 AcDbCircle 10 0.0 20 0.0 30 0.0 40 50.0 0 ATTDEF 5 BEA 100 AcDbEntity 8 0 100 AcDbText 10 -21.82912886047243 20 6.932116009123141 30 0.0 40 8.0 1 Test of the default value 50 8.0 72 1 11 0.0 21 10.0 31 0.0 100 AcDbAttributeDefinition 3 Enter a value for MyAtt1 2 MYATT1 70 0 0 ATTDEF 5 BEF 100 AcDbEntity 8 0 100 AcDbText 10 -35.69986357435198 20 -18.0 30 0.0 40 8.0 1 72 1 11 0.0 21 -10.0 31 0.0 100 AcDbAttributeDefinition 3 Say something for my multi attribute... 2 MYATTMULTI 70 0 74 3 0 ENDBLK 5 53C 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 56B 100 AcDbEntity 8 0 100 AcDbBlockReference 66 1 2 AttBlock 10 10.0 20 20.0 30 0.0 0 ATTRIB 5 56C 100 AcDbEntity 8 0 62 1 100 AcDbText 10 -20.29303705320601 20 30.0 30 0.0 40 8.000000000000001 1 super test 41 2.34567 72 1 11 10.0 21 30.0 31 0.0 100 AcDbAttribute 2 MYATT1 70 0 0 ATTRIB 5 572 100 AcDbEntity 8 0 100 AcDbText 10 -5.045020463847202 20 1.863574351978172 30 0.0 40 8.0 1 %%UCorps 100 AcDbAttribute 2 MYATTMULTI_001 70 0 0 ATTRIB 5 C18 100 AcDbEntity 8 0 100 AcDbText 10 1.326057298772169 20 -11.46975898135516 30 0.0 40 8.0 1 plpl 100 AcDbAttribute 2 MYATTMULTI_002 70 0 0 SEQEND 5 573 100 AcDbEntity 8 0 0 INSERT 5 C07 100 AcDbEntity 8 0 100 AcDbBlockReference 66 1 2 AttBlock 10 110.0 20 -10.0 30 0.0 0 ATTRIB 5 C0A 100 AcDbEntity 8 0 100 AcDbText 10 74.30013642564802 20 -28.0 30 0.0 40 8.0 1 72 1 11 110.0 21 -20.0 31 0.0 100 AcDbAttribute 2 MYATTMULTI 70 0 74 3 0 SEQEND 5 C0B 100 AcDbEntity 8 0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/polygon_without_index.id0000644003401500001440000000002013614004466022303 0ustar rouaultusers=fgdalautotest-3.0.4/ogr/data/small_ntf.mif0000644003401500001440000000136313614004466020013 0ustar rouaultusersVersion 300 Charset "WindowsLatin1" Delimiter "," CoordSys Earth Projection 3, 1002, "m", 0, 46.8, 45.898918964419, 47.696014502038, 600000, 2200000 Bounds (-113967455.417, - 106367759.649) (115167455.417, 122767151.185) Columns 7 NAME Char (50) BLOCK Integer OWNER Char (64) APPRAISED_VALUE Float TAXES Float FLOODZONE Integer NUM Char (254) Data Region 1 6 407131.721 155322.441 407134.468 155329.616 407142.741 155327.242 407141.503 155322.467 407140.875 155320.049 407131.721 155322.441 Brush (1, 0, 16777215) Pen (1, 2, 0) Region 1 6 407128.974 155315.266 407131.721 155322.441 407140.875 155320.049 407139.552 155314.949 407138.932 155312.559 407128.974 155315.266 Brush (1, 0, 16777215) Pen (1, 2, 0)gdalautotest-3.0.4/ogr/data/poly_nonoptimized_vrt.vrt0000644003401500001440000000027513614004466022552 0ustar rouaultusers poly.shp poly gdalautotest-3.0.4/ogr/data/more_than_100_geom_fields.csv0000644003401500001440000000077013614004466022746 0ustar rouaultusersWKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT,WKT ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,gdalautotest-3.0.4/ogr/data/emptymultipoint.shx0000644003401500001440000000015413614004466021343 0ustar rouaultusers' 6Y@@Y@?2$gdalautotest-3.0.4/ogr/data/topojson2.topojson0000644003401500001440000000046313614004466021071 0ustar rouaultusers{ "type":"Topology", "arcs": [ [[0.0, 0.0], [10, 0], [0, 10]], ], "transform": { "scale": [1.0,10.0],"translate": [100.0,1000.0] }, "objects": { "a_layer" : {"type": "GeometryCollection", "geometries" : [ {"type": "LineString", "arcs": [0] } ] }, "foo" : {"type": "LineString", "arcs": [0], "id" : "1" } } }gdalautotest-3.0.4/ogr/data/awy.dat0000644003401500001440000000531313614004466016630 0ustar rouaultusersI 640 Version - THIS FILE IS A SHORT EXTRACT FROM THE FOLLOWING DATA MADE FOR OGR TESTING. data cycle 2007.12, build 20070153, metadata AwyXP700. Copyright 2007, Robin A. Peel (robin@xsquawkbox.net). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. This product was developed using DAFIF (the Defense Aeronautical Flight Information File), a product of the US National Imagery and Mapping Agency (NIMA). NIMA requires the following warranty statements: (A) Under 10 U.S.C. 456, no civil action may be brought against the United States on the basis of the content of a navigational aid prepared or disseminated by either the former Defense Mapping Agency (DMA) or the National Imagery and Mapping Agency (NIMA). (B) The DAFIF product is provided "as is," and no warranty, express or implied, including, but not limited to the implied warranties of merchantability and fitness for particular purpose or arising by statute or otherwise in law or from a course of dealing or usage in trade, is made by NIMA as to the accuracy and functioning of the product. : Neither NIMA nor its personnel will be liable for any claims, losses, or damages arising from or connected with the use of this product. The user agrees to hold harmless the United States National Imagery and Mapping Agency. The user's sole and exclusive remedy is to stop using the DAFIF product. 00MKK 22.528056 -156.170961 BITTA 23.528031 -155.478836 1 012 460 R464 00MKK 22.528056 -156.170961 CKH99 22.316668 -156.341660 1 012 460 R464 00UPP 20.566668 -154.125000 BYROW 20.369456 -155.058992 1 140 460 R578 00UPP 20.566668 -154.125000 FITES 20.794556 -153.000633 1 210 460 R578 03SML 25.610000 030.635278 57SML 26.482222 030.328333 1 195 600 L321 03SML 25.610000 030.635278 AST 27.031222 031.032500 1 085 600 W8 03SML 25.610000 030.635278 KHG 25.448386 030.590792 1 085 600 W8 03SML 25.610000 030.635278 KUNAK 25.462500 030.686667 1 195 600 L321 04THT 73.147778 -068.683056 JULET 72.761667 -068.658333 1 055 180 5E42-BR20 04THT 73.147778 -068.683056 LIPSI 74.833336 -068.566666 1 055 600 5E42 99 gdalautotest-3.0.4/ogr/data/poly_indexed.dat0000644003401500001440000000102213614004466020504 0ustar rouaultusersc (AREAN EAS_IDN PRFEDEAC 215229.266 16835043411 247328.172 17935043423 261752.781 17135043414 547597.188 17335043416 15775.758 17235043415 101429.977 16935043412 268597.625 16635043409 1634833.375 15835043369 596610.313 16535043408 5268.813 17035043413gdalautotest-3.0.4/ogr/data/single_point_mapinfo.id0000644003401500001440000000000413614004466022047 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/geoconcept_multipolygon_singlepart_nohole.txt0000644003401500001440000000055713614004466026650 0ustar rouaultusers//$DELIMITER "tab" //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 17};{TimeZone: 31} //$FIELDS Class=test;Subclass=test;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields id Private#X Private#Y Private#Graphics -1 test test test 1 1 0.00 0.00 4 0.00 1.00 1.00 1.00 1.00 0.00 0.00 0.00 gdalautotest-3.0.4/ogr/data/fix.dat0000644003401500001440000000400613614004466016614 0ustar rouaultusersI 600 Version - THIS FILE IS A SHORT EXTRACT FROM THE FOLLOWING DATA MADE FOR OGR TESTING. data cycle 2007.12, build 20070153, metadata FixXP700. Copyright 2007, Robin A. Peel (robin@xsquawkbox.net). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. This product was developed using DAFIF (the Defense Aeronautical Flight Information File), a product of the US National Imagery and Mapping Agency (NIMA). NIMA requires the following warranty statements: (A) Under 10 U.S.C. 456, no civil action may be brought against the United States on the basis of the content of a navigational aid prepared or disseminated by either the former Defense Mapping Agency (DMA) or the National Imagery and Mapping Agency (NIMA). (B) The DAFIF product is provided "as is," and no warranty, express or implied, including, but not limited to the implied warranties of merchantability and fitness for particular purpose or arising by statute or otherwise in law or from a course of dealing or usage in trade, is made by NIMA as to the accuracy and functioning of the product. : Neither NIMA nor its personnel will be liable for any claims, losses, or damages arising from or connected with the use of this product. The user agrees to hold harmless the United States National Imagery and Mapping Agency. The user's sole and exclusive remedy is to stop using the DAFIF product. 22.528056 -156.170961 00MKK 99 gdalautotest-3.0.4/ogr/data/huge_attribute_gml_sparse.xml0000644003401500001440000000122113614005347023300 0ustar rouaultusers 2200000076 huge_attribute_start.gml 0 0 338 338 2199999662 32 huge_attribute_end.gml 2200000000 0 76 gdalautotest-3.0.4/ogr/data/gjmultiline.shx0000644003401500001440000000015413614004466020403 0ustar rouaultusers' 6Y@Y@@2:gdalautotest-3.0.4/ogr/data/ili/0000755003401500001440000000000013614005350016102 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/ili/Beispiel.ili0000644003401500001440000000172513614004466020351 0ustar rouaultusersTRANSFER Beispiel; DOMAIN LKoord = COORD2 100.00 100.00 300.00 300.00; MODEL Beispiel TOPIC Bodenbedeckung = TABLE BoFlaechen = Art: (Gebaeude, befestigt, humusiert, Gewaesser, bestockt, vegetationslos); Form: AREA WITH (STRAIGHTS, ARCS) VERTEX LKoord WITHOUT OVERLAPS > 0.10; NO IDENT END BoFlaechen; TABLE Strasse = Achse : POLYLINE WITH (ARCS,STRAIGHTS) VERTEX LKoord; NO IDENT END Strasse; TABLE Gebaeude = PositionHauseingang : LKoord; AssNr: TEXT*6; Flaeche: -> BoFlaechen // Art = Gebaeude //; IDENT AssNr; !! Annahme AssNr sei eindeutig. Flaeche; !! Dem Gebaeude ist genau eine !! Flaeche zugeordnet END Gebaeude; END Bodenbedeckung. END Beispiel. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/format-default.ili0000644003401500001440000000060313614004466021521 0ustar rouaultusersTRANSFER FormatDefault; MODEL FormatDefault TOPIC FormatTests = TABLE FormatTable = Text1: TEXT*6; Text2: TEXT*6; Text3: TEXT*6; Number: [0..99]; NO IDENT END FormatTable; END FormatTests. END FormatDefault. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; !! BLANK = _ UNDEFINED = @ CONTINUE = \ TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/Beispiel-rename.vrt0000644003401500001440000000050013614004466021642 0ustar rouaultusers data/ili/Beispiel.itf,data/ili/Beispiel.imd Bodenbedeckung__Gebaeude gdalautotest-3.0.4/ogr/data/ili/format-test.imd0000644003401500001440000021173713614004466021064 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse FormatTest1falseNormalMFormatTesttrue943496TID_ANY FormatTests BASKETfalsefalsefalseFormatTest.FormatTests FormatTablefalsefalseClassfalsefalse TYPEfalsefalsetrueText6 Text1falsefalseNoSubDivfalse TYPEfalsefalsetrueText6 Text2falsefalseNoSubDivfalse TYPEfalsefalsetrueText6 Text3falsefalseNoSubDivfalse TYPEfalsefalsetrue099false NumberfalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/RoadsExdm2ben.ili0000644003401500001440000000324313614004466021247 0ustar rouaultusers!! File RoadsExdm2ben.ili Release 2005-06-16 INTERLIS 2.3; MODEL RoadsExdm2ben (en) AT "http://www.interlis.ch/models" VERSION "2005-06-16" = UNIT Angle_Degree = 180 / PI [INTERLIS.rad]; DOMAIN Point2D = COORD 0.000 .. 200.000 [INTERLIS.m], !! Min_East Max_East 0.000 .. 200.000 [INTERLIS.m], !! Min_North Max_North ROTATION 2 -> 1; Orientation = 0.0 .. 359.9 CIRCULAR [Angle_Degree]; TOPIC Roads = STRUCTURE LAttrs = LArt: ( welldefined, fuzzy); END LAttrs; CLASS LandCover = Type: MANDATORY ( building, street, water, other); Geometry: MANDATORY SURFACE WITH (STRAIGHTS) VERTEX Point2D WITHOUT OVERLAPS > 0.100 LINE ATTRIBUTES LAttrs; END LandCover; CLASS Street = Name: MANDATORY TEXT*32; END Street; CLASS StreetAxis = Geometry: MANDATORY POLYLINE WITH (STRAIGHTS) VERTEX Point2D; END StreetAxis; ASSOCIATION StreetAxisAssoc = Street -- {1} Street; StreetAxis -- StreetAxis; END StreetAxisAssoc; CLASS StreetNamePosition = NamPos: MANDATORY Point2D; NamOri: MANDATORY Orientation; END StreetNamePosition; ASSOCIATION StreetNamePositionAssoc = Street -- {0..1} Street; StreetNamePosition -- StreetNamePosition; END StreetNamePositionAssoc; CLASS RoadSign = Type: MANDATORY ( prohibition, indication, danger, velocity); Position: MANDATORY Point2D; END RoadSign; END Roads; !! of TOPIC END RoadsExdm2ben. !! of MODEL gdalautotest-3.0.4/ogr/data/ili/surface.itf0000644003401500001440000000771713614004466020261 0ustar rouaultusersSCNT //// MTID SURFC_TRA MODL SURFC TOPI SURFC_TOP TABL SURFC_TBL OBJE 103 1 3 1 23 25000 20060111 OBJE 104 2 3 1 23 25000 20060111 OBJE 105 3 3 1 23 25000 20060111 OBJE 106 3 3 1 23 25000 20060111 ETAB TABL SURFC_TBL_SHAPE OBJE 404 103 STPT 598600.961 249487.174 LIPT 598608.899 249538.768 LIPT 598624.774 249594.331 LIPT 598648.586 249630.050 LIPT 598684.305 249661.800 LIPT 598763.680 249685.612 LIPT 598850.993 249685.612 LIPT 598854.962 249618.143 LIPT 598843.055 249550.675 LIPT 598819.243 249514.956 LIPT 598763.680 249479.237 LIPT 598692.243 249447.487 LIPT 598612.868 249427.643 LIPT 598600.961 249487.174 ELIN OBJE 405 104 STPT 598131.445 249100.621 LIPT 598170.131 249095.094 LIPT 598200.448 249085.393 ARCP 598239.253 249062.352 LIPT 598246.529 249044.162 LIPT 598245.316 249025.972 LIPT 598229.552 249017.483 LIPT 598165.280 249035.673 LIPT 598134.963 249049.013 LIPT 598130.273 249052.095 LIPT 598131.445 249100.621 ELIN OBJE 406 105 STPT 598330.204 249028.397 LIPT 598344.756 249057.501 LIPT 598390.838 249074.479 LIPT 598422.367 249081.755 LIPT 598459.960 249093.882 LIPT 598493.915 249101.158 LIPT 598523.019 249106.008 LIPT 598563.038 249084.180 LIPT 598589.716 249042.949 LIPT 598603.056 249011.420 LIPT 598607.907 248966.551 LIPT 598577.590 248960.487 LIPT 598493.915 248983.528 LIPT 598424.793 248996.868 LIPT 598359.308 249010.207 LIPT 598330.204 249028.397 ELIN OBJE 406 106 STPT 747925.762 265857.606 LIPT 747927.618 265861.533 LIPT 747928.237 265860.794 LIPT 747930.956 265857.547 LIPT 747925.762 265857.606 ELIN OBJE 407 106 STPT 747951.240 265833.326 LIPT 747955.101 265828.716 LIPT 747954.975 265827.862 LIPT 747951.166 265828.348 LIPT 747951.240 265833.326 ELIN ETAB TABL SURFC_TBL_TEXT_ID OBJE AAA_EZ20156 1 3 1 23 25000 20060111 OBJE AAA_EZ20160 2 3 1 23 25000 20060111 OBJE AAA_EZ20161 3 3 1 23 25000 20060111 OBJE AAA_EZ36360 3 3 1 23 25000 20060111 ETAB TABL SURFC_TBL_TEXT_ID_SHAPE OBJE 404 AAA_EZ20156 STPT 598600.961 249487.174 LIPT 598608.899 249538.768 LIPT 598624.774 249594.331 LIPT 598648.586 249630.050 LIPT 598684.305 249661.800 LIPT 598763.680 249685.612 LIPT 598850.993 249685.612 LIPT 598854.962 249618.143 LIPT 598843.055 249550.675 LIPT 598819.243 249514.956 LIPT 598763.680 249479.237 LIPT 598692.243 249447.487 LIPT 598612.868 249427.643 LIPT 598600.961 249487.174 ELIN OBJE 405 AAA_EZ20160 STPT 598131.445 249100.621 LIPT 598170.131 249095.094 LIPT 598200.448 249085.393 ARCP 598239.253 249062.352 LIPT 598246.529 249044.162 LIPT 598245.316 249025.972 LIPT 598229.552 249017.483 LIPT 598165.280 249035.673 LIPT 598134.963 249049.013 LIPT 598130.273 249052.095 LIPT 598131.445 249100.621 ELIN OBJE 406 AAA_EZ20161 STPT 598330.204 249028.397 LIPT 598344.756 249057.501 LIPT 598390.838 249074.479 LIPT 598422.367 249081.755 LIPT 598459.960 249093.882 LIPT 598493.915 249101.158 LIPT 598523.019 249106.008 LIPT 598563.038 249084.180 LIPT 598589.716 249042.949 LIPT 598603.056 249011.420 LIPT 598607.907 248966.551 LIPT 598577.590 248960.487 LIPT 598493.915 248983.528 LIPT 598424.793 248996.868 LIPT 598359.308 249010.207 LIPT 598330.204 249028.397 ELIN OBJE AAA_EZ36360.1 AAA_EZ36360 STPT 747925.762 265857.606 LIPT 747927.618 265861.533 LIPT 747928.237 265860.794 LIPT 747930.956 265857.547 LIPT 747925.762 265857.606 ELIN OBJE AAA_EZ36360.2 AAA_EZ36360 STPT 747951.240 265833.326 LIPT 747955.101 265828.716 LIPT 747954.975 265827.862 LIPT 747951.166 265828.348 LIPT 747951.240 265833.326 ELIN ETAB TABL Flaechenelement OBJE 72015948 71006210 OBJE 72021597 71002155 ETAB TABL Flaechenelement_Geometrie OBJE 73594800 72015948 11 STPT 697064.616 245051.751 LIPT 697064.773 245052.007 LIPT 697067.630 245050.258 LIPT 697067.473 245050.002 LIPT 697064.616 245051.751 ELIN OBJE 74159700 72021597 11 STPT 698298.028 246754.897 LIPT 698295.899 246752.775 LIPT 698293.113 246755.525 LIPT 698295.243 246757.648 ELIN OBJE 722159701 72021597 2 STPT 698295.243 246757.648 LIPT 698298.028 246754.897 ELIN ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/multicoord.itf0000644003401500001440000000025313614004466020776 0ustar rouaultusersSCNT Multicoord Transfer-File //// MTID Multicoord MODL Multicoord TOPI MulticoordTests TABL MulticoordTable OBJE 0 102.1 102.2 103.1 103.2 103.3 ELIN ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/format-test.ili0000644003401500001440000000055313614004466021060 0ustar rouaultusersTRANSFER FormatTest; MODEL FormatTest TOPIC FormatTests = TABLE FormatTable = Text1: TEXT*6; Text2: TEXT*6; Text3: TEXT*6; Number: [0..99]; NO IDENT END FormatTable; END FormatTests. END FormatTest. FORMAT FREE; CODE BLANK = 94, UNDEFINED = 34, CONTINUE = 96; !! BLANK = ^ UNDEFINED = " CONTINUE = ` TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/RoadsExdm2ben.imd0000644003401500001440000025431613614004466021254 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalse ANYSTRUCTUREfalsefalseStructurefalse METAOBJECTtruefalseClassfalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalse REFSYSTEMtruefalseClassfalse COORDSYSTEMtruefalseClassfalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalse StraightSegmentfalsetrueStructurefalse ArcSegmentfalsetrueStructurefalse SurfaceEdgefalsefalseStructurefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse RoadsExdm2ben2.3falseNormalMenhttp://www.interlis.ch/models2005-06-16 Angle_DegreefalsefalseDerivedU C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false Point2Dfalsefalsefalse Orientationfalsefalsefalse0.0359.9true Roads BASKETfalsefalsefalseRoadsExdm2ben.Roads LAttrsfalsefalseStructurefalse TOPfalsefalse welldefinedfalsefalse fuzzyfalsefalse TYPEfalsefalsefalseUnordered LArtfalsefalseNoSubDivfalse LandCoverfalsefalseClassfalse TOPfalsefalse buildingfalsefalse streetfalsefalse waterfalsefalse otherfalsefalse TYPEfalsefalsetrueUnordered TypefalsefalseNoSubDivfalse TYPEfalsefalsetrueSurface0.100 GeometryfalsefalseNoSubDivfalse StreetfalsefalseClassfalse TYPEfalsefalsetrueText32 NamefalsefalseNoSubDivfalse StreetAxisfalsefalseClassfalse TYPEfalsefalsetruePolyline GeometryfalsefalseNoSubDivfalse StreetfalsefalsetruefalseAssocfalse11true StreetAxisfalsefalsetruefalseAssocfalse0false StreetAxisAssocfalsefalseAssociationtrue StreetNamePositionfalsefalseClassfalse C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false TYPEfalsefalsetrue NamPosfalsefalseNoSubDivfalse TYPEfalsefalsetrue0.0359.9true NamOrifalsefalseNoSubDivfalse StreetfalsefalsetruefalseAssocfalse01true StreetNamePositionfalsefalsetruefalseAssocfalse0false StreetNamePositionAssocfalsefalseAssociationtrue RoadSignfalsefalseClassfalse TOPfalsefalse prohibitionfalsefalse indicationfalsefalse dangerfalsefalse velocityfalsefalse TYPEfalsefalsetrueUnordered TypefalsefalseNoSubDivfalse C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false TYPEfalsefalsetrue PositionfalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/enum-test.itf0000644003401500001440000000023113614004466020532 0ustar rouaultusersSCNT EnumTest Transfer-File //// MTID EnumTest MODL EnumTest TOPI Bodenbedeckung TABL BoFlaechen OBJE 10 0 1 OBJE 20 1 2 OBJE 30 2 3 ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/multigeom.itf0000644003401500001440000000035313614004466020620 0ustar rouaultusersSCNT Multigeom Transfer-File //// MTID Multigeom MODL Multigeom TOPI MultigeomTests TABL MultigeomTable OBJE 0 aa_bb 40 148.41 175.96 STPT 190.26 208.00 ARCP 187.00 186.00 LIPT 173.10 171.00 LIPT 141.08 152.94 ELIN ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/Beispiel.imd0000644003401500001440000023465513614004466020357 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse Beispiel1falseNormalMBeispieltrue956492TID_ANY C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false LKoordfalsefalsefalse Bodenbedeckung BASKETfalsefalsefalseBeispiel.Bodenbedeckung BoFlaechenfalsefalseClassfalsefalse TOPfalsefalse Gebaeudefalsefalse befestigtfalsefalse humusiertfalsefalse Gewaesserfalsefalse bestocktfalsefalse vegetationslosfalsefalse TYPEfalsefalsetrueUnordered ArtfalsefalseNoSubDivfalse TYPEfalsefalsetrueArea0.10 FormfalsefalseNoSubDivfalse StrassefalsefalseClassfalsefalse TYPEfalsefalsetruePolyline AchsefalsefalseNoSubDivfalse GebaeudefalsefalseClassGlobalUAttributeGlobalURolefalsefalse C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false TYPEfalsefalsetrue PositionHauseingangfalsefalseNoSubDivfalse TYPEfalsefalsetrueText6 AssNrfalsefalseNoSubDivfalse GebaeudefalsefalsetruefalseAssocfalse0false FlaechefalsefalsetruefalseAssocfalse11true GebaeudeFlaechefalsefalseAssociationtrue gdalautotest-3.0.4/ogr/data/ili/format-default.imd0000644003401500001440000021213213614004466021517 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse FormatDefault1falseNormalMFormatDefaulttrue956492TID_ANY FormatTests BASKETfalsefalsefalseFormatDefault.FormatTests FormatTablefalsefalseClassfalsefalse TYPEfalsefalsetrueText6 Text1falsefalseNoSubDivfalse TYPEfalsefalsetrueText6 Text2falsefalseNoSubDivfalse TYPEfalsefalsetrueText6 Text3falsefalseNoSubDivfalse TYPEfalsefalsetrue099false NumberfalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/encoding-test.itf0000644003401500001440000000022513614004466021357 0ustar rouaultusersSCNT FormatDefault Transfer-File //// MTID FormatDefault MODL FormatDefault TOPI FormatTests TABL FormatTable OBJE 0 @ 1 ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/multigeom.ili0000644003401500001440000000074713614004466020622 0ustar rouaultusersTRANSFER Multigeom; DOMAIN LKoord = COORD2 100.00 100.00 300.00 300.00; MODEL Multigeom TOPIC MultigeomTests = TABLE MultigeomTable = Text1: TEXT*6; GeomLine: POLYLINE WITH (ARCS,STRAIGHTS) VERTEX LKoord; Number: [0..99]; GeomPoint: LKoord; NO IDENT END MultigeomTable; END MultigeomTests. END Multigeom. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/enum-test.ili0000644003401500001440000000106413614004466020532 0ustar rouaultusersTRANSFER EnumTest; DOMAIN LKoord = COORD2 100.00 100.00 300.00 300.00; MODEL EnumTest DOMAIN Nested = (Enum0, Subenums (Enum1, Enum2), Enum3); TOPIC Bodenbedeckung = TABLE BoFlaechen = Art: (Gebaeude, befestigt, humusiert, Gewaesser, bestockt, vegetationslos); NestedEnum: Nested; NO IDENT END BoFlaechen; END Bodenbedeckung. END EnumTest. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/RoadsExdm2ien.xml0000644003401500001440000006105013614005350021272 0ustar rouaultusers example dataset ili2 refmanual appendix C water welldefined 39.03860.315 41.20059.302 43.36260.315 44.71366.268 45.79467.662 48.76667.408 53.36064.115 56.19762.595 57.81863.862 58.89968.928 55.92772.348 47.95575.515 42.28175.388 39.30873.235 36.74169.688 35.52566.268 35.66163.735 37.95761.455 39.03860.315 building welldefined 101.45965.485 108.18669.369 102.08679.936 95.35976.053 101.45965.485 building welldefined 60.48949.608 79.90055.839 75.35170.932 67.67868.781 69.93861.721 57.58258.029 60.48949.608 street welldefined 45.06758.655 50.66942.579 57.06044.638 51.43260.469 45.06758.655 other welldefined 114.02799.314 31.35199.314 31.14092.530 70.41986.177 86.48179.710 114.02799.314 other welldefined 113.55962.880 114.02799.314 86.48179.710 94.38166.289 96.77957.177 113.55962.880 welldefined 108.18669.369 101.45965.485 95.35976.053 102.08679.936 108.18669.369 street welldefined 100.62124.239 109.72924.239 105.64048.068 96.77945.088 100.62124.239 other welldefined 30.90024.478 100.62124.239 96.77945.088 30.90024.478 other welldefined 31.11083.750 31.14036.458 50.66942.579 45.06758.655 51.43260.469 57.06044.638 87.83954.138 85.28263.410 78.84773.433 67.54977.788 31.11083.750 welldefined 41.20059.302 39.03860.315 37.95761.455 35.66163.735 35.52566.268 36.74169.688 39.30873.235 42.28175.388 47.95575.515 55.92772.348 58.89968.928 57.81863.862 56.19762.595 53.36064.115 48.76667.408 45.79467.662 44.71366.268 43.36260.315 41.20059.302 welldefined 79.90055.839 60.48949.608 57.58258.029 69.93861.721 67.67868.781 75.35170.932 79.90055.839 street welldefined 31.14092.530 31.11083.750 67.54977.788 78.84773.433 85.28263.410 87.83954.138 96.77957.177 94.38166.289 86.48179.710 70.41986.177 31.14092.530 other welldefined 113.81151.168 105.64048.068 109.72924.239 114.26924.017 113.81151.168 street welldefined 105.64048.068 113.81151.168 113.55962.880 96.77957.177 87.83954.138 57.06044.638 50.66942.579 31.14036.458 30.90024.478 96.77945.088 105.64048.068 Austrasse Eymattstrasse Feldweg Seeweg 55.60037.649 15.57325.785 precise 55.60037.649 94.99050.109 precise 94.99050.109 101.09952.279 precise 101.09952.279 126.10062.279 precise 94.99050.109 89.50465.795 83.59475.598 71.77480.712 11.42391.154 precise 101.09952.279 107.40014.603 unprecise 55.60037.649 49.35956.752 unprecise 71.66045.231 15.0 58.24985.081 351.0 106.09533.554 280.0 53.03151.367 291.3 prohibition.noparking 69.38992.056 prohibition.noparking 80.60888.623 prohibition.noparking 58.05993.667 danger 92.74138.295 gdalautotest-3.0.4/ogr/data/ili/format-test.itf0000644003401500001440000000024013614004466021056 0ustar rouaultusersSCNT FormatDefault Transfer-File //// MTID FormatDefault MODL FormatDefault TOPI FormatTests TABL FormatTable OBJE 0 aa_bb ` CONT cc^dd " 1 ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/multicoord.ili0000644003401500001440000000074413614004466020776 0ustar rouaultusersTRANSFER Multicoord; DOMAIN LKoord = COORD2 100.00 100.00 300.00 300.00; LKoord3 = COORD3 100.00 100.00 100.0 300.00 300.00 300.0; MODEL Multicoord TOPIC MulticoordTests = TABLE MulticoordTable = coordPoint1: LKoord; coordPoint2: LKoord3; NO IDENT END MulticoordTable; END MulticoordTests. END Multicoord. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/surface.ili0000644003401500001440000000315713614004466020246 0ustar rouaultusersTRANSFER SURFC_TRA; MODEL SURFC DOMAIN LKoord = COORD2 480000.000 70000.000 840000.000 300000.000; I4 = [1 .. 9999]; I8 = [1 .. 99999999]; I9 = [1 .. 999999999]; FLOAT = [1.0 .. 10.0]; TOPIC SURFC_TOP = TABLE SURFC_TBL = SHAPE : SURFACE WITH (STRAIGHTS, ARCS) VERTEX LKoord; ID1: I9; ID2: I9; ID3: I9; ID4: I9; ID5: I9; ID6: I8; IDENT ID1; END SURFC_TBL; TABLE SURFC_TBL_TEXT_ID = SHAPE : SURFACE WITH (STRAIGHTS, ARCS) VERTEX LKoord; OBJ_ID: TEXT*20; ID2: I9; ID3: I9; ID4: I9; ID5: I9; ID6: I8; IDENT OBJ_ID; END SURFC_TBL_TEXT_ID; TABLE Flaechenelement = Flaechenelement_von: I9; !!-> Einzelobjekt Geometrie: SURFACE WITH (STRAIGHTS, ARCS) VERTEX LKoord WITHOUT OVERLAPS > 0.050 LINEATTR = Linienart: OPTIONAL ( !! undefiniert bedeutet gemaess Objektart Mauer_hinterfuellt, unterirdisches_Gebaeude_sichtbar, Gebaeudeunterteilung, Reservoir_sichtbar, Unterstand_geschlossen, Schwelle_hinterfuellt, Ruine_unterirdisch, Druckleitung_oberirdisch, unterdrueckte_Linie, !! z.B. bei gleichartigen Objekten verdeckte_Linie, !! durch andere BB-, EO-Objekte verdeckt unsichere_Linie, !! Lage unsicher, keine AV93-Genauigkeit weitere); END; NO IDENT END Flaechenelement; END SURFC_TOP. END SURFC. FORMAT FREE; CODE BLANK = DEFAULT, UNDEFINED = DEFAULT, CONTINUE = DEFAULT; TID = ANY; END. gdalautotest-3.0.4/ogr/data/ili/ch.bazl.sicherheitszonenplan.oereb_20131118.imd0000644003401500001440000225344713614004466026457 0ustar rouaultusers INTERLIS 2.3 true NormalM en http://www.interlis.ch 20060126 STRAIGHTS ARCS ANYUNIT true false BaseU DIMENSIONLESS true false BaseU LENGTH true false BaseU MASS true false BaseU TIME true false BaseU ELECTRIC_CURRENT true false BaseU TEMPERATURE true false BaseU AMOUNT_OF_MATTER true false BaseU ANGLE true false BaseU SOLID_ANGLE true false BaseU LUMINOUS_INTENSITY true false BaseU MONEY true false BaseU m false false BaseU kg false false BaseU s false false BaseU A false false BaseU K false false BaseU mol false false BaseU rad false false BaseU sr false false BaseU cd false false BaseU URI false true false Text 1023 NAME false true false Text 255 INTERLIS_1_DATE false true false Text 8 TOP false false false false false true false false BOOLEAN false true false Ordered TOP false false Left false false Center false false Right false false HALIGNMENT false true false Ordered TOP false false Top false false Cap false false Half false false Base false false Bottom false false VALIGNMENT false true false Ordered ANYOID true false false I32OID false false false 0 2147483647 false STANDARDOID false false false Text 16 UUIDOID false false false Text 36 C1 true false true false C2 true false true false LineCoord true false false TYPE false false false Object false false false false Object Type myClass TYPE false false false potSubClass false false false potSubClass Type potSuperClass false false false potSuperClass Type isSubClass TYPE false false false Object false false false false Object Type Class false false false Class Type isOfClass TYPE true false false false bag false false false false 0 bag Type elementCount TYPE true false false false Objects false false false true Objects Type objectCount TYPE true false false false TextVal false false false Text TextVal Type len TYPE true false false false TextVal false false false MText TextVal Type lenM TYPE false false false Text TextVal false false false Text TextVal Type trim TYPE false false false MText TextVal false false false MText TextVal Type trimM TYPE false false false SubVal EnumTreeVal NodeVal EnumTreeVal isEnumSubVal TYPE false false false Enum EnumVal MinVal EnumTreeVal MaxVal EnumTreeVal inEnumRange TYPE true false false false from true false false false from Type convertUnit TYPE false false false Objects false false false true Objects Type SurfaceBag false false false SurfaceBag Type SurfaceAttr false false false SurfaceAttr Type areAreas ANYCLASS false false Class false ANYSTRUCTURE false false Structure false METAOBJECT true false Class false TYPE false false true Text 255 Name false false NoSubDiv false METAOBJECT_TRANSLATION true false Class false TYPE false false true Text 255 Name false false NoSubDiv false TYPE false false true Text 255 NameInBaseLanguage false false NoSubDiv false TYPE true false false false Unit false false AXIS false false Structure false REFSYSTEM true false Class false COORDSYSTEM true false Class false TYPE false false true true 1 3 Axis false false NoSubDiv false TYPE true false false false Unit false false SCALSYSTEM true false Class false TYPE false false false Sign false false SIGN true false Class false TIMESYSTEMS BASKET false false false INTERLIS.TIMESYSTEMS TYPE true false false false Unit false false CALENDAR false false Class false TYPE true false false false Unit false false TIMEOFDAYSYS false false Class false min false false DerivedU h false false DerivedU d false false DerivedU M false false BaseU Y false false BaseU BaseTimeSystems false false RefSystemB GregorianCalendar true UTC true TimeOfDay true false Structure false TYPE false false false 0 23 true Hours false false NoSubDiv false TYPE false false false 0 59 true Minutes false false ContSubDiv false TYPE false false false 0.000 59.999 true Seconds false false ContSubDiv false UTC false false Structure false GregorianYear false false false 1582 2999 false GregorianDate false false Structure false Year false false NoSubDiv false TYPE false false false 1 12 false Month false false SubDiv false TYPE false false false 1 31 false Day false false SubDiv false GregorianDateTime false false Structure false TYPE false false false 0 23 true Hours false false SubDiv false TYPE false false false 0 59 true Minutes false false ContSubDiv false TYPE false false false 0.000 59.999 true Seconds false false ContSubDiv false XMLTime false false false 0:0:0.000 23:59:59.999 Hours/2":"Minutes":"Seconds XMLDate false false false 1582-1-1 2999-12-31 Year"-"Month"-"Day XMLDateTime false false false 1582-1-1T0:0:0.000 2999-12-31T23:59:59.999 Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegment true false Structure false C1 true false true false C2 true false true false TYPE true false true SegmentEndPoint true false NoSubDiv false StartSegment false true Structure false StraightSegment false true Structure false ArcSegment false true Structure false SurfaceEdge false false Structure false TYPE true false false DirectedPolyline Geometry false false NoSubDiv false TYPE false false false false 0 1 LineAttrs false false NoSubDiv false SurfaceBoundary false false Structure false TYPE false false false true 0 Lines false false NoSubDiv false LineGeometry false false Structure false TYPE false false false true 0 Segments false false NoSubDiv false chGeoId10 In der ganzen Schweiz benutzbare, allgemein gebräuchliche (auch ausserhalb der Geo-Szene) geografische Identifikatoren. 2.3 false NormalM de mailto:ce@eisenhutinformatik.ch 2010-05-03 BFSNr BfS-Gemeindenummer false false false 1 9999 false TOP false false AG false false AR false false AI false false BL false false BS false false BE false false FR false false GE false false GL false false GR false false JU false false LU false false NE false false NW false false OW false false SG false false SH false false SO false false SZ false false TG false false TI false false UR false false VS false false VD false false ZG false false ZH false false Kanton Liste der offizielen Kürzel der Kantone. false false false Unordered TOP false false AG false false AR false false AI false false BL false false BS false false BE false false FR false false GE false false GL false false GR false false JU false false LU false false NE false false NW false false OW false false SG false false SH false false SO false false SZ false false TG false false TI false false UR false false VS false false VD false false ZG false false ZH false false FL false false KantonInklFl Liste der offizielen Kürzel der Kantone inkl FL. false false false Unordered BFSNr_ false false Structure false TYPE false false true 1 9999 false value false false NoSubDiv false Kanton_ false false Structure false TOP false false AG false false AR false false AI false false BL false false BS false false BE false false FR false false GE false false GL false false GR false false JU false false LU false false NE false false NW false false OW false false SG false false SH false false SO false false SZ false false TG false false TI false false UR false false VS false false VD false false ZG false false ZH false false TYPE false false true Unordered value false false NoSubDiv false KantonInklFl_ false false Structure false TOP false false AG false false AR false false AI false false BL false false BS false false BE false false FR false false GE false false GL false false GR false false JU false false LU false false NE false false NW false false OW false false SG false false SH false false SO false false SZ false false TG false false TI false false UR false false VS false false VD false false ZG false false ZH false false FL false false TYPE false false true Unordered value false false NoSubDiv false CodeISO 2.3 false TypeM de http://www.kogis.ch 20060808 TOP false false AF false false AX false false AL false false DZ false false AS_ false false AD false false AO false false AI false false AQ false false AG false false AR false false AM false false AW false false AU false false AT_ false false AZ false false BS false false BH false false BD false false BB false false BY_ false false BE false false BZ false false BJ false false BM false false BT false false BO false false BA false false BW false false BV false false BR false false IO false false BN false false BG false false BF false false BI false false KH false false CM false false CA false false CV false false KY false false CF false false TD false false CL false false CN false false CX false false CC false false CO false false KM false false CG false false CD false false CK false false CR false false CI false false HR false false CU false false CY false false CZ false false DK false false DJ false false DM false false DO false false EC false false EG false false SV false false GQ false false ER false false EE false false ET false false FK false false FO false false FJ false false FI false false FR false false GF false false PF false false TF false false GA false false GM false false GE false false DE false false GH false false GI false false GR false false GL false false GD false false GP false false GU false false GT false false GN false false GW false false GY false false HT false false HM false false VA false false HN false false HK false false HU false false IS false false IN_ false false ID false false IR false false IQ false false IE false false IL false false IT false false JM false false JP false false JO false false KZ false false KE false false KI false false KP false false KR false false KW false false KG false false LA false false LV false false LB false false LS false false LR false false LY false false LI false false LT false false LU false false MO false false MK false false MG false false MW false false MY false false MV false false ML false false MT false false MH false false MQ false false MR false false MU false false YT false false MX false false FM false false MD false false MC false false MN false false MS false false MA false false MZ false false MM false false NA false false NR false false NP false false NL false false AN false false NC false false NZ false false NI false false NE false false NG false false NU false false NF false false MP false false NO_ false false OM false false PK false false PW false false PS false false PA false false PG false false PY false false PE false false PH false false PN false false PL false false PT false false PR false false QA false false RE false false RO false false RU false false RW false false SH false false KN false false LC false false PM false false VC false false WS false false SM false false ST false false SA false false SN false false CS false false SC false false SL false false SG false false SK false false SI false false SB false false SO false false ZA false false GS false false ES false false LK false false SD false false SR false false SJ false false SZ false false SE false false CH false false SY false false TW false false TJ false false TZ false false TH false false TL false false TG false false TK false false TO_ false false TT false false TN false false TR false false TM false false TC false false TV false false UG false false UA false false AE false false GB false false US false false UM false false UY false false UZ false false VU false false VE false false VN false false VG false false VI false false WF false false EH false false YE false false ZM false false ZW false false CountryCodeISO false false false Unordered TOP false false aa false false ab false false af false false am false false ar false false as_ false false ay false false az false false ba false false be false false bg false false bh false false bi false false bn false false bo false false br false false ca false false co false false cs false false cy false false da false false de false false dz false false el false false en false false eo false false es false false et false false eu false false fa false false fi false false fj false false fo false false fr false false fy false false ga false false gd false false gl false false gn false false gu false false ha false false hi false false hr false false hu false false hy false false ia false false ie false false ik false false in_ false false is false false it false false iw false false ja false false ji false false jw false false ka false false kk false false kl false false km false false kn false false ko false false ks false false ku false false ky false false la false false ln false false lo false false lt false false lv false false mg false false mi false false mk false false ml false false mn false false mo false false mr false false ms false false mt false false my false false na false false ne false false nl false false no_ false false oc false false om false false or_ false false pa false false pl false false ps false false pt false false qu false false rm false false rn false false ro false false ru false false rw false false sa false false sd false false sg false false sh false false si false false sk false false sl false false sm false false sn false false so false false sq false false sr false false ss false false st false false su false false sv false false sw false false ta false false te false false tg false false th false false ti false false tk false false tl false false tn false false to_ false false tr false false ts false false tt false false tw false false uk false false ur false false uz false false vi false false vo false false wo false false xh false false yo false false zh false false zu false false LanguageCodeISO false false false Unordered CountryCodeISO_ false false Structure false TOP false false AF false false AX false false AL false false DZ false false AS_ false false AD false false AO false false AI false false AQ false false AG false false AR false false AM false false AW false false AU false false AT_ false false AZ false false BS false false BH false false BD false false BB false false BY_ false false BE false false BZ false false BJ false false BM false false BT false false BO false false BA false false BW false false BV false false BR false false IO false false BN false false BG false false BF false false BI false false KH false false CM false false CA false false CV false false KY false false CF false false TD false false CL false false CN false false CX false false CC false false CO false false KM false false CG false false CD false false CK false false CR false false CI false false HR false false CU false false CY false false CZ false false DK false false DJ false false DM false false DO false false EC false false EG false false SV false false GQ false false ER false false EE false false ET false false FK false false FO false false FJ false false FI false false FR false false GF false false PF false false TF false false GA false false GM false false GE false false DE false false GH false false GI false false GR false false GL false false GD false false GP false false GU false false GT false false GN false false GW false false GY false false HT false false HM false false VA false false HN false false HK false false HU false false IS false false IN_ false false ID false false IR false false IQ false false IE false false IL false false IT false false JM false false JP false false JO false false KZ false false KE false false KI false false KP false false KR false false KW false false KG false false LA false false LV false false LB false false LS false false LR false false LY false false LI false false LT false false LU false false MO false false MK false false MG false false MW false false MY false false MV false false ML false false MT false false MH false false MQ false false MR false false MU false false YT false false MX false false FM false false MD false false MC false false MN false false MS false false MA false false MZ false false MM false false NA false false NR false false NP false false NL false false AN false false NC false false NZ false false NI false false NE false false NG false false NU false false NF false false MP false false NO_ false false OM false false PK false false PW false false PS false false PA false false PG false false PY false false PE false false PH false false PN false false PL false false PT false false PR false false QA false false RE false false RO false false RU false false RW false false SH false false KN false false LC false false PM false false VC false false WS false false SM false false ST false false SA false false SN false false CS false false SC false false SL false false SG false false SK false false SI false false SB false false SO false false ZA false false GS false false ES false false LK false false SD false false SR false false SJ false false SZ false false SE false false CH false false SY false false TW false false TJ false false TZ false false TH false false TL false false TG false false TK false false TO_ false false TT false false TN false false TR false false TM false false TC false false TV false false UG false false UA false false AE false false GB false false US false false UM false false UY false false UZ false false VU false false VE false false VN false false VG false false VI false false WF false false EH false false YE false false ZM false false ZW false false TYPE false false true Unordered value false false NoSubDiv false LanguageCodeISO_ false false Structure false TOP false false aa false false ab false false af false false am false false ar false false as_ false false ay false false az false false ba false false be false false bg false false bh false false bi false false bn false false bo false false br false false ca false false co false false cs false false cy false false da false false de false false dz false false el false false en false false eo false false es false false et false false eu false false fa false false fi false false fj false false fo false false fr false false fy false false ga false false gd false false gl false false gn false false gu false false ha false false hi false false hr false false hu false false hy false false ia false false ie false false ik false false in_ false false is false false it false false iw false false ja false false ji false false jw false false ka false false kk false false kl false false km false false kn false false ko false false ks false false ku false false ky false false la false false ln false false lo false false lt false false lv false false mg false false mi false false mk false false ml false false mn false false mo false false mr false false ms false false mt false false my false false na false false ne false false nl false false no_ false false oc false false om false false or_ false false pa false false pl false false ps false false pt false false qu false false rm false false rn false false ro false false ru false false rw false false sa false false sd false false sg false false sh false false si false false sk false false sl false false sm false false sn false false so false false sq false false sr false false ss false false st false false su false false sv false false sw false false ta false false te false false tg false false th false false ti false false tk false false tl false false tn false false to_ false false tr false false ts false false tt false false tw false false uk false false ur false false uz false false vi false false vo false false wo false false xh false false yo false false zh false false zu false false TYPE false false true Unordered value false false NoSubDiv false MultilingualText09 Defines basics types for multilingual texts. Example usage: IMPORTS MultinilingualText09; CLASS Building = description: MultilingualText09.MultilingualText; END Building; 2.3 false NormalM de mailto:ce@eisenhutinformatik.ch 2010-02-26 LocalizedMText false false Structure false TOP false false aa false false ab false false af false false am false false ar false false as_ false false ay false false az false false ba false false be false false bg false false bh false false bi false false bn false false bo false false br false false ca false false co false false cs false false cy false false da false false de false false dz false false el false false en false false eo false false es false false et false false eu false false fa false false fi false false fj false false fo false false fr false false fy false false ga false false gd false false gl false false gn false false gu false false ha false false hi false false hr false false hu false false hy false false ia false false ie false false ik false false in_ false false is false false it false false iw false false ja false false ji false false jw false false ka false false kk false false kl false false km false false kn false false ko false false ks false false ku false false ky false false la false false ln false false lo false false lt false false lv false false mg false false mi false false mk false false ml false false mn false false mo false false mr false false ms false false mt false false my false false na false false ne false false nl false false no_ false false oc false false om false false or_ false false pa false false pl false false ps false false pt false false qu false false rm false false rn false false ro false false ru false false rw false false sa false false sd false false sg false false sh false false si false false sk false false sl false false sm false false sn false false so false false sq false false sr false false ss false false st false false su false false sv false false sw false false ta false false te false false tg false false th false false ti false false tk false false tl false false tn false false to_ false false tr false false ts false false tt false false tw false false uk false false ur false false uz false false vi false false vo false false wo false false xh false false yo false false zh false false zu false false TYPE false false true Unordered Language false false NoSubDiv false TYPE false false true MText Text false false NoSubDiv false LocalizedText false false Structure false TOP false false aa false false ab false false af false false am false false ar false false as_ false false ay false false az false false ba false false be false false bg false false bh false false bi false false bn false false bo false false br false false ca false false co false false cs false false cy false false da false false de false false dz false false el false false en false false eo false false es false false et false false eu false false fa false false fi false false fj false false fo false false fr false false fy false false ga false false gd false false gl false false gn false false gu false false ha false false hi false false hr false false hu false false hy false false ia false false ie false false ik false false in_ false false is false false it false false iw false false ja false false ji false false jw false false ka false false kk false false kl false false km false false kn false false ko false false ks false false ku false false ky false false la false false ln false false lo false false lt false false lv false false mg false false mi false false mk false false ml false false mn false false mo false false mr false false ms false false mt false false my false false na false false ne false false nl false false no_ false false oc false false om false false or_ false false pa false false pl false false ps false false pt false false qu false false rm false false rn false false ro false false ru false false rw false false sa false false sd false false sg false false sh false false si false false sk false false sl false false sm false false sn false false so false false sq false false sr false false ss false false st false false su false false sv false false sw false false ta false false te false false tg false false th false false ti false false tk false false tl false false tn false false to_ false false tr false false ts false false tt false false tw false false uk false false ur false false uz false false vi false false vo false false wo false false xh false false yo false false zh false false zu false false TYPE false false true Unordered Language false false NoSubDiv false TYPE false false true Text Text false false NoSubDiv false LocalizedURI false false Structure false TOP false false aa false false ab false false af false false am false false ar false false as_ false false ay false false az false false ba false false be false false bg false false bh false false bi false false bn false false bo false false br false false ca false false co false false cs false false cy false false da false false de false false dz false false el false false en false false eo false false es false false et false false eu false false fa false false fi false false fj false false fo false false fr false false fy false false ga false false gd false false gl false false gn false false gu false false ha false false hi false false hr false false hu false false hy false false ia false false ie false false ik false false in_ false false is false false it false false iw false false ja false false ji false false jw false false ka false false kk false false kl false false km false false kn false false ko false false ks false false ku false false ky false false la false false ln false false lo false false lt false false lv false false mg false false mi false false mk false false ml false false mn false false mo false false mr false false ms false false mt false false my false false na false false ne false false nl false false no_ false false oc false false om false false or_ false false pa false false pl false false ps false false pt false false qu false false rm false false rn false false ro false false ru false false rw false false sa false false sd false false sg false false sh false false si false false sk false false sl false false sm false false sn false false so false false sq false false sr false false ss false false st false false su false false sv false false sw false false ta false false te false false tg false false th false false ti false false tk false false tl false false tn false false to_ false false tr false false ts false false tt false false tw false false uk false false ur false false uz false false vi false false vo false false wo false false xh false false yo false false zh false false zu false false TYPE false false true Unordered Language false false NoSubDiv false TYPE false false true Uri 1023 Text false false NoSubDiv false MultilingualMText false false Structure false TYPE false false true false 1 localizedText false false NoSubDiv false MultilingualText false false Structure false TYPE false false true false 1 localizedText false false NoSubDiv false MultilingualURI false false Structure false TYPE false false true false 1 localizedText false false NoSubDiv false OeREBKRM09 Basisdefinitionen für das OEREB-Katasterrahmenmodell 2.3 false NormalM de mailto:ce@eisenhutinformatik.ch 2010-10-26 ArtEigentumsbeschraenkung Themenspezifische, maschinen-lesbare Art der Eigentumsbeschränkung false false false Text 40 ArtikelInhalt Wertebereich für den Artikeltext einer Rechtsvorschrift oder einer gesetzlichen Grundlage. false false false MText ArtikelNummer Nummer eines Artikels in einer Rechtsvorschrift oder gesetzlichen Grundlage. false false false Text 20 Datum false false false 1848-1-1 2100-12-31 Year"-"Month"-"Day C1 false false true 480000.000 850000.000 false true C2 false false true 70000.000 310000.000 false true LKoord Wertebereich für Koordinaten. false false false OEREBOID Wertebereich für Objektidentifikatoren. Der Wert soll mit einem gültigen Internet Domain-Name anfangen, z.B. "ch.admin.sr.720" false false false Text TOP false false inKraft false false laufendeAenderung false false RechtsStatus Werteliste zur Unterscheidung ob eine Eigentumsbeschränkung in Kraft ist oder nicht. false false false Unordered TOP false false Nutzungsplanung false false ProjektierungszonenNationalstrassen false false BaulinienNationalstrassen false false ProjektierungszonenEisenbahnanlagen false false BaulinienEisenbahnanlagen false false ProjektierungszonenFlughafenanlagen false false BaulinienFlughafenanlagen false false SicherheitszonenplanFlughafen false false BelasteteStandorte false false BelasteteStandorteMilitaer false false BelasteteStandorteZivileFlugplaetze false false BelasteteStandorteOeffentlicherVerkehr false false Grundwasserschutzzonen false false Grundwasserschutzareale false false Laermemfindlichkeitsstufen false false Waldgrenzen false false Waldabstandslinien false false Thema Liste der Geobasisdaten die ÖREB-Themen sind (Wird durch den Bundesrat definiert). Die Liste kann durch Kantone erweitert werden. false false false Unordered WebReferenz Verweis auf ein Dokument im Web (z.B. eine HTML Seite oder ein PDF-Dokument) false false false Uri 1023 ArtikelNummer_ false false Structure false TYPE false false true Text 20 value false false NoSubDiv false Datum_ false false Structure false TYPE false false true 1848-1-1 2100-12-31 Year"-"Month"-"Day value false false NoSubDiv false Thema_ false false Structure false TOP false false Nutzungsplanung false false ProjektierungszonenNationalstrassen false false BaulinienNationalstrassen false false ProjektierungszonenEisenbahnanlagen false false BaulinienEisenbahnanlagen false false ProjektierungszonenFlughafenanlagen false false BaulinienFlughafenanlagen false false SicherheitszonenplanFlughafen false false BelasteteStandorte false false BelasteteStandorteMilitaer false false BelasteteStandorteZivileFlugplaetze false false BelasteteStandorteOeffentlicherVerkehr false false Grundwasserschutzzonen false false Grundwasserschutzareale false false Laermemfindlichkeitsstufen false false Waldgrenzen false false Waldabstandslinien false false TYPE false false true Unordered value false false NoSubDiv false WebReferenz_ false false Structure false TYPE false false true Uri 1023 value false false NoSubDiv false ArtikelInhaltMehrsprachig Wertebereich für den Artikeltext einer Rechtsvorschrift oder einer gesetzlichen Grundlage. false false Structure false OeREBKRM09vs Basisdefinition f�r Erlasse (Rechtsvorschriften, Hinweise auf Gesetzliche Grundlagen) 2.3 false NormalM de mailto:ce@eisenhutinformatik.ch 2010-10-26 Vorschriften Dieses Teilmodell definiert die Struktur f�r die Erlasse im Allgemeinen. OID als URIs damit der Verweis auf Grundlagenerlasse (z.B. Kantonale Gesetze auf Bundesgesetze) in einem anderen Beh�lter (da durch eine andere Stelle erfasst/nachgef�hrt) verweisen k�nnen. BASKET false false false OeREBKRM09vs.Vorschriften Amt Eine organisatorische Einheit innerhalb der �ffentlichen Verwaltung, z.B. eine f�r Geobasisdaten zust�ndige Stelle. false false Class false TYPE false false true false 1 1 Name Name des Amtes z.B. "Amt f�r Gemeinden und Raumordnung des Kantons Bern". false false NoSubDiv false AmtImWeb Verweis auf die Website des Amtes z.B. "http://www.jgk.be.ch/site/agr/". false false NoSubDiv false DokumentElement Vorschriften (Gesetze, Verordnungen, Rechtsvorschriften) oder einzelne Artikel davon. true false Class false TextImWeb Verweis auf das Element im Web; z.B. "http://www.admin.ch/ch/d/sr/700/a18.html" false false NoSubDiv false TOP false false inKraft false false laufendeAenderung false false TYPE false false true Unordered Rechtsstatus Status, ob dieses Element in Kraft ist false false NoSubDiv false TYPE false false true 1848-1-1 2100-12-31 Year"-"Month"-"Day publiziertAb Datum, ab dem dieses Element in Ausz�gen erscheint false false NoSubDiv false Artikel Einzelner Artikel einer Rechtsvorschrift oder einer gesetzlichen Grundlage. false false Class false TYPE false false true Text 20 Nr Nummer des Artikels innerhalb der gesetzlichen Grundlage oder der Rechtsvorschrift. z.B. "23" false false NoSubDiv false TYPE false false false false 0 1 Text z.B. "Ausnahmen innerhalb der Bauzonen regelt das kantonale Recht." false false NoSubDiv false Dokument Dokumente im allgemeinen (Gesetze, Verordnungen, Rechtsvorschriften) false false Class false TYPE false false true false 1 1 Titel Titel (oder falls vorhanden Kurztitel) des Dokuments; z.B. "Baureglement" oder "Raumplanungsgesetz" false false NoSubDiv false TYPE false false false false 0 1 OffiziellerTitel Offizieller Titel des Dokuments; z.B. "Baureglement Thun, vom 06.2002" oder "Bundesgesetz �ber die Raumplanung" false false NoSubDiv false TYPE false false false false 0 1 Abkuerzung Abk�rzung des Gesetzes; z.B. "RPG" false false NoSubDiv false TYPE false false false Text 20 OffizielleNr Offizielle Nummer des Gesetzes; z.B. "SR 700" oder "sGS 731.1" false false NoSubDiv false Kanton Kantonsk�rzel falls Vorschrift des Kantons oder der Gemeinde. Falls die Angabe fehlt, ist es eine Vorschrift des Bundes. z.B. "BE" false false NoSubDiv false Gemeinde Falls die Angabe fehlt, ist es ein Erlass des Kantons oder des Bundes. z.B. "942" false false NoSubDiv false TYPE false false false Binary Dokument Das Dokument als PDF-Datei false false NoSubDiv false Rechtsvorschrift Reglemente, Vorschriften etc. die generell konkret sind (generell f�r die Person, die nicht bekannt ist, konkret f�r dass der Raumbezug mit Karte definiert ist), die zusammen mit der exakten geometrischen Definition als Einheit die Eigentumsbeschr�nkung unmittelbar beschreiben und innerhalb desselben Verfahrens verabschiedet worden sind. false false Class false Dokument false false true false Comp false 1 1 true Artikel OPTIONAL: Artikel zu diesem Dokument false false true false Assoc false 0 false DokumentArtikel false false Association true Ursprung false false true false Assoc false 0 false Hinweis false false true true Assoc false 0 false HinweisWeitereDokumente false false Association false TYPE false false false false 0 ArtikelNr Hinweis auf spezifische Artikel. false false NoSubDiv false ZustaendigeStelle false false true false Assoc false 1 1 true Dokument false false true false Aggr false 0 false ZustaendigeStelleDokument false false Association true HinweiseGesetzlicheGrundlagen Dieses Teilmodell definiert die Struktur f�r die Hinweise auf die gesetzlichen Grundlagen, die als solche nicht Teil des �REB-Katasters sind, von diesem aber referenziert werden k�nnen. OID als URIs damit der Verweis auf Grundlagengesetze (z.B. Kantonale Gesetze auf Bundesgesetze) in einem anderen Beh�lter (da durch eine andere Stelle erfasst/nachgef�hrt) verweisen k�nnen. BASKET false false false OeREBKRM09vs.HinweiseGesetzlicheGrundlagen OeREBKRM09trsfr Schnittstelle zwischen zuständiger Stelle für die Geobasisdaten und Katasterorganisation des Kantons. 2.3 false NormalM de mailto:ce@eisenhutinformatik.ch 2010-10-26 Transferstruktur Dieses Teilmodell definiert die Struktur der Daten, wie sie von der zuständigen Stelle für die Geobasisdaten an die Abgabestelle des ÖREB-Kataster-Auszugs geliefert werden müssen. Dieses Datenmodell definiert somit, welche Daten ein minimales Datenmodell enthalten muss, um als ÖREB-Kataster fähiges Datenmodell zu gelten. BASKET false false false OeREBKRM09trsfr.Transferstruktur DarstellungsDienst Angaben zum Darstellungsdienst. false false Class false TYPE false false true Uri 1023 VerweisWMS WMS GetMap-Request (für Maschine-Maschine-Kommunikation) inkl. alle benötigten Parameter, z.B. "http://ecogis.admin.ch/de/wms?version=1.1.1&service=WMS&request=GetMap&LAYERS=invent_leit&srs=EPSG:21781&WIDTH=500&HEIGHT=500&bbox=500000,100000,700000,300000&FORMAT=image/png&TRANSPARENT=TRUE" false false NoSubDiv false TYPE false false true Uri 1023 LegendeImWeb Verweis auf ein Dokument das die Karte beschreibt; z.B. "http://www.apps.be.ch/geoportal/output/gdp_adm_x3012app0081524772611.png" false false NoSubDiv false Eigentumsbeschraenkung Wurzelelement für Informationen über eine Beschränkung des Grundeigentums, die rechtskräftig, z.B. auf Grund einer Genehmigung oder eines richterlichen Entscheids, zustande gekommen ist. false false Class false TYPE false false true false 1 1 Aussage Textliche Beschreibung der Beschränkung; z.B. "Wohnen W3" false false NoSubDiv false TOP false false Nutzungsplanung false false ProjektierungszonenNationalstrassen false false BaulinienNationalstrassen false false ProjektierungszonenEisenbahnanlagen false false BaulinienEisenbahnanlagen false false ProjektierungszonenFlughafenanlagen false false BaulinienFlughafenanlagen false false SicherheitszonenplanFlughafen false false BelasteteStandorte false false BelasteteStandorteMilitaer false false BelasteteStandorteZivileFlugplaetze false false BelasteteStandorteOeffentlicherVerkehr false false Grundwasserschutzzonen false false Grundwasserschutzareale false false Laermemfindlichkeitsstufen false false Waldgrenzen false false Waldabstandslinien false false TYPE false false true Unordered Thema Einordnung der Eigentumsbeschränkung in ein ÖREBK-Thema false false NoSubDiv false ArtCode Themenspezifische, maschinen-lesbare Art gem. Originalmodell der Eigentumsbeschränkung false false NoSubDiv false TYPE false false false Uri 1023 ArtCodeliste Identifikation der Codeliste bzw. des Wertebereichs für ArtCode false false NoSubDiv false TOP false false inKraft false false laufendeAenderung false false TYPE false false true Unordered Rechtsstatus Status, ob diese Eigentumsbeschränkung in Kraft ist false false NoSubDiv false TYPE false false true 1848-1-1 2100-12-31 Year"-"Month"-"Day publiziertAb Datum, ab dem diese Eigentumsbeschränkung in Auszügen erscheint false false NoSubDiv false Geometrie Punkt-, linien-, oder flächenförmige Geometrie. Neu zu definierende Eigentumsbeschränkungen sollten i.d.R. flächenförmig sein. false false Class MandC Or Defined Attribute Defined Attribute Defined Attribute false Punkt Punktgeometrie false false NoSubDiv false TYPE false false false Polyline Linie Linienförmige Geometrie false false NoSubDiv false TYPE false false false Surface 0.0001 Flaeche Flächenförmige Geometrie false false NoSubDiv false TOP false false inKraft false false laufendeAenderung false false TYPE false false true Unordered Rechtsstatus Status, ob diese Geometrie in Kraft ist false false NoSubDiv false TYPE false false true 1848-1-1 2100-12-31 Year"-"Month"-"Day publiziertAb Datum, ab dem diese Geometrie in Auszügen erscheint false false NoSubDiv false TYPE false false false Uri 1023 MetadatenGeobasisdaten Verweis auf maschinenlesbare Metadaten (XML) der zugrundeliegenden Geobasisdaten. z.B. http://www.geocat.ch/geonetwork/srv/deu/gm03.xml?id=705 false false NoSubDiv false HinweisDefinition false false Class false Thema false false NoSubDiv false Kanton false false NoSubDiv false Gemeinde false false NoSubDiv false DarstellungsDienst Darstellungsdienst, auf dem diese Eigentumsbeschränkung sichtbar, aber nicht hervorgehoben, ist. false false true false Assoc false 0 1 true Eigentumsbeschraenkung false false true false Aggr false 1 false DarstellungsDienstEigentumsbeschraenkung false false Association true Geometrie Geometrie der Eigentumsbeschränkung, die Rechtswirkung hat (als Basis für den Verschnitt mit den Liegenschaften) false false true false Assoc false 0 false Eigentumsbeschraenkung false false true false Comp false 1 1 true GeometrieEigentumsbeschraenkung false false Association true Grundlage false false true true Assoc false 0 false Verfeinerung false false true false Assoc false 0 false GrundlageVerfeinerung false false Association false HinweisDefinition false false true false Assoc false 0 false Dokument false false true false Assoc false 1 false HinweisDefinitionDokument false false Association false HinweisDefinition false false true false Aggr false 0 false ZustaendigeStelle false false true false Assoc false 1 1 true HinweisDefinitionZustaendigeStelle false false Association true Eigentumsbeschraenkung false false true false Assoc false 0 false Vorschrift Rechtsvorschrift der Eigentumsbeschränkung false false true false Assoc false 1 false HinweisVorschrift false false Association false TYPE false false false false 0 ArtikelNr Hinweis auf spezifische Artikel. false false NoSubDiv false ZustaendigeStelle Zuständige Stelle für die Geobasisdaten (Originaldaten) gem. GeoIG Art. 8 Abs. 1 false false true false Assoc false 1 1 true Eigentumsbeschraenkung false false true false Aggr false 0 false ZustaendigeStelleEigentumsbeschraenkung false false Association true ZustaendigeStelle false false true false Assoc false 1 1 true Geometrie false false true false Aggr false 0 false ZustaendigeStelleGeometrie false false Association true gdalautotest-3.0.4/ogr/data/ili/RoadsExdm2ien.imd0000644003401500001440000027411213614004466021257 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalse ANYSTRUCTUREfalsefalseStructurefalse METAOBJECTtruefalseClassfalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalse REFSYSTEMtruefalseClassfalse COORDSYSTEMtruefalseClassfalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalse StraightSegmentfalsetrueStructurefalse ArcSegmentfalsetrueStructurefalse SurfaceEdgefalsefalseStructurefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse RoadsExdm2ben2.3falseNormalMenhttp://www.interlis.ch/models2005-06-16 Angle_DegreefalsefalseDerivedU C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false Point2Dfalsefalsefalse Orientationfalsefalsefalse0.0359.9true Roads BASKETfalsefalsefalseRoadsExdm2ben.Roads LAttrsfalsefalseStructurefalse TOPfalsefalse welldefinedfalsefalse fuzzyfalsefalse TYPEfalsefalsefalseUnordered LArtfalsefalseNoSubDivfalse LandCoverfalsefalseClassfalse TOPfalsefalse buildingfalsefalse streetfalsefalse waterfalsefalse otherfalsefalse TYPEfalsefalsetrueUnordered TypefalsefalseNoSubDivfalse TYPEfalsefalsetrueSurface0.100 GeometryfalsefalseNoSubDivfalse StreetfalsefalseClassfalse TYPEfalsefalsetrueText32 NamefalsefalseNoSubDivfalse StreetAxisfalsefalseClassfalse TYPEfalsefalsetruePolyline GeometryfalsefalseNoSubDivfalse StreetfalsefalsetruefalseAssocfalse11true StreetAxisfalsefalsetruefalseAssocfalse0false StreetAxisAssocfalsefalseAssociationtrue StreetNamePositionfalsefalseClassfalse C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false TYPEfalsefalsetrue NamPosfalsefalseNoSubDivfalse TYPEfalsefalsetrue0.0359.9true NamOrifalsefalseNoSubDivfalse StreetfalsefalsetruefalseAssocfalse01true StreetNamePositionfalsefalsetruefalseAssocfalse0false StreetNamePositionAssocfalsefalseAssociationtrue RoadSignfalsefalseClassfalse TOPfalsefalse prohibitionfalsefalse indicationfalsefalse dangerfalsefalse velocityfalsefalse TYPEfalsefalsetrueUnordered TypefalsefalseNoSubDivfalse C1falsefalsetrue0.000200.000false C2falsefalsetrue0.000200.000false TYPEfalsefalsetrue PositionfalsefalseNoSubDivfalse RoadsExdm2ien2.3falseNormalMenhttp://www.interlis.ch/models2005-06-16 RoadsExtended BASKETfalsefalsefalseRoadsExdm2ien.RoadsExtended StreetAxisfalsefalseClassfalse TOPfalsefalse precisefalsefalse unprecisefalsefalse TYPEfalsefalsetrueUnordered PrecisionfalsefalseNoSubDivfalse RoadSignfalsefalseClassfalse TOPfalsefalse prohibitionfalsefalse noentryfalsefalse noparkingfalsefalse otherfalsefalse TYPEfalsefalsefalseUnordered TypefalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/surface.imd0000644003401500001440000031334513614004466020245 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse SURFC1falseNormalMSURFC_TRAtrue956492TID_ANY C1falsefalsetrue480000.000840000.000false C2falsefalsetrue70000.000300000.000false LKoordfalsefalsefalse I4falsefalsefalse19999false I8falsefalsefalse199999999false I9falsefalsefalse1999999999false FLOATfalsefalsefalse1.010.0false SURFC_TOP BASKETfalsefalsefalseSURFC.SURFC_TOP SURFC_TBLfalsefalseClassGlobalUAttributefalsefalse TYPEfalsefalsetrueSurface SHAPEfalsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID1falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID2falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID3falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID4falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID5falsefalseNoSubDivfalse TYPEfalsefalsetrue199999999false ID6falsefalseNoSubDivfalse SURFC_TBL_TEXT_IDfalsefalseClassGlobalUAttributefalsefalse TYPEfalsefalsetrueSurface SHAPEfalsefalseNoSubDivfalse TYPEfalsefalsetrueText20 OBJ_IDfalsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID2falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID3falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID4falsefalseNoSubDivfalse TYPEfalsefalsetrue1999999999false ID5falsefalseNoSubDivfalse TYPEfalsefalsetrue199999999false ID6falsefalseNoSubDivfalse LineAttrib1falsefalseStructurefalsefalse TOPfalsefalse Mauer_hinterfuelltfalsefalse unterirdisches_Gebaeude_sichtbarfalsefalse Gebaeudeunterteilungfalsefalse Reservoir_sichtbarfalsefalse Unterstand_geschlossenfalsefalse Schwelle_hinterfuelltfalsefalse Ruine_unterirdischfalsefalse Druckleitung_oberirdischfalsefalse unterdrueckte_Liniefalsefalse verdeckte_Liniefalsefalse unsichere_Liniefalsefalse weiterefalsefalse TYPEfalsefalsefalseUnordered LinienartfalsefalseNoSubDivfalse FlaechenelementfalsefalseClassfalsefalse TYPEfalsefalsetrue1999999999false Flaechenelement_vonfalsefalseNoSubDivfalse TYPEfalsefalsetrueSurface0.050 GeometriefalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/multicoord.imd0000644003401500001440000022051113614004466020766 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse Multicoord1falseNormalMMulticoordtrue956492TID_ANY C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false LKoordfalsefalsefalse C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false C3falsefalsetrue100.0300.0false LKoord3falsefalsefalse MulticoordTests BASKETfalsefalsefalseMulticoord.MulticoordTests MulticoordTablefalsefalseClassfalsefalse C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false TYPEfalsefalsetrue coordPoint1falsefalseNoSubDivfalse C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false C3falsefalsetrue100.0300.0false TYPEfalsefalsetrue coordPoint2falsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/ch.bazl.sicherheitszonenplan.oereb_20131118.xtf0000644003401500001440000075123513614004466026503 0ustar rouaultusers deBundesamt für Zivilluftfahrt BAZLfrOffice fédéral de l'aviation civile OFACitUfficio federale dell'aviazione civile UFAChttp://www.bazl.admin.ch https://wms.geo.admin.ch/?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ch.bazl.sicherheitszonenplan.oereb&STYLES=default&SRS=EPSG:21781&BBOX=475000,60000,845000,310000&WIDTH=740&HEIGHT=500&FORMAT=image/pnghttps://wms.geo.admin.ch/?VERSION=1.1.1&SERVICE=WMS&REQUEST=GetLegendGraphic&LAYER=ch.bazl.sicherheitszonenplan.oereb&FORMAT=image/png&STYLE=default http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-INFO-D.pdfinKraft2014-01-01deWichtige Hinweise http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-INFO-F.pdfinKraft2014-01-01frRemarques importantes http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-INFO-I.pdfinKraft2014-01-01itAvvertenze importanti deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1975-06-27 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1980-08-04 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2001-03-02 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1990-11-09 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1981-03-06 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1989-06-23 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1989-06-23 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2005-09-21 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2001-09-10 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1971-09-25 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2009-07-01 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2001-02-28 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1985-02-18 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2013-01-25 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1983-07-04 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft1978-12-28 deHöhenbeschränkung für Bauten und andere HindernissefrLimitation de la hauteur des bâtiments et autres obstaclesitLimitazione di altezza per gli edifici e altri ostacoliSicherheitszonenplanFlughafeninKraft2004-08-25 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0001.pdfinKraft1971-09-25frPlan de zone "Aérodrome d'Ecuvillens" 1:1000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0002.pdfinKraft1975-06-27deSicherheitszonenplan "Flughafen Birrfeld", 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0004.pdfinKraft1978-12-28frPlan de zones "Aérodrome régional des Eplatures", 1:5000 Commune de la Chaux-de-Fonds http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0005.pdfinKraft1978-12-28frPlan de zones "Aérodrome régional des Eplatures" 1:5000 Commune du Locle http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0007.pdfinKraft1980-08-04frPlan de zones de sécurité "Aérodrome de la Blecherette", 1:1000 Commune de Romanel http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0008.pdfinKraft1980-08-04frPlan de zones de sécurité "Aérodrome de la Blecherette", 1:1000 Commune de le Mont http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0009.pdfinKraft1980-08-04frPlan de zones de sécurité "Aérodrome de la Blecherette", 1:1000 Commune de Lausanne http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0010.pdfinKraft1981-03-06frPlan des zones de sécurité "Aéroport de Sion", 1:2000 Situation Ouest http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0011.pdfinKraft1981-03-06frPlan des zones de sécurité "Aéroport de Sion", 1:2000 Situation Est http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0014.pdfinKraft2009-07-01frProjet de FATO (zone sud-est) "Aeroport de Sion", 1:5000 Plan situation, et 1:2000 Parcelle concernée http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0016.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Dietlikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0017.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Regensdorf http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0018.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Stadt Zürich http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0019.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Niederglatt http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0020.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Höri http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0021.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Hochfelden http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0022.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Stadt Bülach http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0023.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Neerach http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0024.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Rorbas http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0025.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Stadt Kloten http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0026.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Bachenbülach http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0027.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Wallisellen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0028.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Bassersdorf http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0029.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Oberembrach http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0030.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Embrach http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0031.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Nürensdorf http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0032.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Buchs http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0033.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Niederhasli http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0034.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Lufingen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0035.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Winkel http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0036.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Stadel http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0037.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Rümlang http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0038.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Stadt Opfikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0039.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", 1:5000 Gemeinde Oberglatt http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0041.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Dübendorf http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0042.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Fällanden http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0043.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Kloten http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0044.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Küsnacht http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0045.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Maur http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0046.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Opfikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0047.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Rümlang http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0048.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Wallisellen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0049.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Zollikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0050.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Zumikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0051.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Zürich-Hottingen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0052.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Zürich-Schwamendingen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0053.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:5000 Gemeinde Zürich-Witikon http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0056.pdfinKraft1985-02-18frPlan des zones de sécurité "Aéroport de Genève-Cointrin", 1:2500 Secteur Bellevue-Versoix http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0057.pdfinKraft1985-02-18frPlan des zones de sécurité "Aéroport de Genève-Cointrin", 1:2500 Secteur Vernier-Bellevue http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0058.pdfinKraft1985-02-18frPlan des zones de sécurité "Aéroport de Genève-Cointrin", 1:2500 Secteur Satigny-Vernier http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0061.pdfinKraft1989-06-23deSicherheitszonenplan "Flughafen Basel-Mulhouse" 1:5000 Gemeinde Allschwil http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0062.pdfinKraft1989-06-23deSicherheitszonenplan "Flughafen Basel-Mulhouse" 1:5000 Gemeinde Binningen http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0063.pdfinKraft1989-06-23deSicherheitszonenplan "Flughafen Basel-Mulhouse" 1:5000 Gemeinde Schönenbuch http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0064.pdfinKraft1989-06-23deSicherheitszonenplan "Flughafen Basel-Mulhouse" 1:10000 Basel http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0067.pdfinKraft1990-11-09deSicherzeitszonenplan "Flughafen Samedan", 1:2000 Gemeinde Bever http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0068.pdfinKraft1990-11-09deSicherzeitszonenplan "Flughafen Samedan", 1:2000 Gemeinde Celerina http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0069.pdfinKraft1990-11-09deSicherzeitszonenplan "Flughafen Samedan", 1:2000 Gemeinde St. Moritz http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0070.pdfinKraft1990-11-09deSicherzeitszonenplan "Flughafen Samedan", 1:2000 Gemeinde Samedan http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0073.pdfinKraft2001-03-02deSicherheitszonenplan "Regionalflugplatz Grenchen", 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0075.pdfinKraft2001-09-10deSicherheitszonenplan "Flughafen Bern-Belp", 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0077.pdfinKraft2004-08-25itPiano delle zone di sicurezza "Lugano Airport", 1:2000 Comune di Agno http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0078.pdfinKraft2004-08-25itPiano delle zone di sicurezza "Lugano Airport", 1:2000 Comune di Bioggio http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0079.pdfinKraft2004-08-25itPiano delle zone di sicurezza "Lugano Airport", 1:2000 Comune di Manno http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0080.pdfinKraft2004-08-25itPiano delle zone di sicurezza "Lugano Airport", 1:2000 Comune di Muzzano http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0083.pdfinKraft2005-09-21frPlan de la zone de sécurité "Aérodrome régional de Bressaucourt", Situation 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0003.pdfinKraft1975-06-27deVerfügung "Sicherheitszonenplan für den Regionalflugplatz Birrfeld" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0006.pdfinKraft1978-12-28frApprobation "Plans des zones de sécurité de l'aéroport des Eplatures à La Chaux-de-Fonds" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0012.pdfinKraft1981-03-06frPlan des zones de sécurité "Aéroport de Sion", 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0013.pdfinKraft1981-03-06frLettre "Plan des zones de sécurité de l'aéroport de Sion" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0015.pdfinKraft2009-07-01frApprobation de Ia modification du plan de Ia zone de sécurité "Aéroport civil de Sion" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0040.pdfinKraft1983-07-04deSicherzeitszonenplan "Flughafen Zuerich", Uebersichtssituation 1:25000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0054.pdfinKraft2013-01-25deSicherheitszonenplan (Anpassung Anflug 34) "Flughafen Zuerich", 1:25000 Gesamtübersicht http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0055.pdfinKraft2013-01-25deVerfügung "Flughafen Zürich; Sicherheitszonenplan: Anpassung für den Anflug auf Piste 34 (Südanflug)" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0059.pdfinKraft1985-02-18frPlan des zones de sécurité "Aéroport de Genève-Cointrin", 1:25000 Situation générale http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0060.pdfinKraft1985-02-18frApprobation "Plans des zones de sécurité de l'aéroport de Genève-Cointrin" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0065.pdfinKraft1989-06-23deSicherheitszonenplan "Flughafen Basel-Mulhouse" 1:25000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0066.pdfinKraft1989-06-23deVerfügung "Sicherheitszonenplan für den Flughafen Basel-Mülhausen" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0071.pdfinKraft1990-11-09deSicherzeitszonenplan "Flughafen Samedan", 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0072.pdfinKraft1990-11-09deVerfügung "Sicherheitszonenplan für den Flugplatz Samedan" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0074.pdfinKraft2001-03-02deGenehmigung des Sicherheitszonenplanes "Flughafen Grenchen SO" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0076.pdfinKraft2001-09-10dePlangenehmigung "Pistenverlängerung Flughafen Bern-Belp" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0081.pdfinKraft2004-08-25itPiano delle zone di sicurezza "Lugano Airport", piano generale 1:5000 http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0082.pdfinKraft2004-08-25itApprovazione del piano delle zone di sicurezza "Aeroporto Città di Lugano Agno" http://data.geo.admin.ch/ch.bazl.sicherheitszonenplan.oereb/Rechtsvorschriften/108-D-0084.pdfinKraft2005-09-21frApprobation du plan de la zone de sécurité "Aérodrome régional de Bressaucourt" 658593.928254957.714658511.628254948.614658418.028254938.516658106.426254913.918658192.222254445.914658771.228254619.412659667.232254699.606660369.238254827.202661016.442255010.1661279.644255090.198661866.648255138.094661784.45255601.798661211.146255432.8660320.54255352.806659523.436255206.71658703.528254966.814658624.228254961.014658593.928254957.714inKraft1975-06-27http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 536980.824156798.82536984.324156788.92536986.324156782.62536989.124156776.62536991.724156772.42536996.724156769.22537002.324156767.72537008.824156767.12537015.324156768.32537020.024156769.82537024.224156772.12537028.024156775.42537031.024156779.52537036.324156786.02537048.024156800.72537074.926156831.72537223.926156820.218537135.122156306.416537136.522156282.316537136.522156263.116537141.022156128.314537141.92156054.414537149.518155737.012537161.116155219.21537157.614155105.908537152.614154971.608537134.312154750.908537010.408154076.204537004.208154081.404537000.308154085.004536998.008154086.504536995.908154086.404536991.908154085.404536988.408154083.804536978.208154097.104536974.308154103.504536971.408154096.304536959.608154094.904536955.208154100.104536949.608154102.804536940.908154104.404536900.608154173.206536881.908154178.006536877.808154185.206536876.908154185.306536872.008154193.406536856.808154201.306536849.508154205.306536842.308154211.206536838.708154214.606536834.708154219.406536830.508154225.906536825.608154234.706536824.308154237.606536823.608154242.306536822.808154247.406536821.708154254.206536820.808154260.006536819.608154265.606536819.108154270.606536818.008154276.106536816.808154281.306536815.808154286.406536814.408154292.106536806.408154326.906536795.308154384.208536793.808154390.708536793.208154401.508536793.508154411.108536793.208154420.908536792.908154429.108536790.608154439.808536786.608154464.108536782.908154483.508536780.508154498.808536773.51154537.808536769.91154556.408536768.11154566.508536765.31154579.008536763.71154586.408536761.31154599.108536759.61154610.508536757.81154631.008536756.41154646.408536755.51154660.508536755.21154668.908536754.81154673.11536751.81154681.91536747.11154692.21536740.51154703.11536737.81154706.91536735.51154711.01536732.21154718.21536727.91154731.31536726.41154741.81536724.51154757.11536722.91154772.61536722.11154783.11536721.31154788.91536717.71154803.91536714.11154818.11536712.71154824.11536711.51154828.41536710.21154834.41536709.51154839.01536709.51154841.91536709.71154844.21536710.41154847.11536711.41154852.11536712.01154855.11536712.31154858.61536712.41154865.81536712.41154873.31536712.01154880.61536712.41154884.91536713.31154890.31536713.91154894.01536715.21154898.81536716.31154900.71536717.51154902.71536718.51154904.61536719.712154907.71536721.512154911.21536723.112154912.61536724.112154913.01536725.312154912.91536727.912154912.51536729.012154912.71536730.012154913.31536730.712154914.61536731.212154916.11536731.412154918.71536731.312154922.21536730.912154926.81536730.712154929.71536730.612154932.71536731.012154940.71536731.812154952.41536732.612154959.21536733.212154963.21536735.612154975.11536737.012154982.71536737.212154984.91536737.112154986.31536736.012154989.51536735.312154991.51536734.612154994.21536734.012154996.91536733.912154999.61536734.112155002.012536734.812155004.612536735.612155006.712536737.612155009.912536737.912155011.312536738.012155013.212536737.612155015.012536736.612155016.812536735.812155019.712536735.312155023.912536734.712155026.912536734.512155029.012536733.512155031.712536733.112155034.012536733.112155036.112536733.012155038.312536733.312155041.412536733.212155045.112536732.412155052.912536732.812155061.012536733.012155064.112536732.612155066.912536731.812155068.912536731.012155070.712536729.712155073.712536750.014155240.612536942.222156321.218536929.524156842.12536933.324156841.82536955.124156825.02536980.824156798.82inKraft1980-08-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 600868.222226501.514600810.022226527.416600727.02226480.416600731.02226454.816600200.316226274.416600104.716226241.918600163.216226102.118599890.314226010.418599872.014226021.418599735.012226044.42599607.012225996.42599512.01225925.42599479.91225866.82598730.202225364.622598164.498225107.824597302.692224880.228596684.786224522.23596629.486224641.73596575.614224610.384596543.386224591.632596384.986224937.734596397.786224943.034596371.886225005.434596401.098225016.006596434.888225028.234597036.692225235.732597878.5225767.63598281.504225946.728599207.21226219.024599791.316226562.722599840.616226458.522600059.868226586.214601015.926227143.018601249.824226631.214600868.222226501.514inKraft2001-03-02http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 598140.188223613.616598162.988223631.416598249.99223782.416598305.992223997.416598392.994224337.418598484.996224482.418598630.998224567.418598837.998224631.418599028.0224655.416599175.002224715.416599314.002224806.416599402.004224900.416599473.004225068.416599457.006225282.416599415.008225577.418599425.01225766.42599479.91225866.82599497.01225878.22599890.314226010.418599965.014225965.418599990.304225930.38600096.716225522.162600150.838225427.676600242.0225364.0600305.868225366.216600257.01225105.81600179.208224867.01600071.906224639.81599937.004224427.81599776.402224234.308599592.8224062.41599389.098223914.81599168.396223793.91598934.194223701.412598690.192223639.012598440.29223607.514598188.488223607.516598140.188223613.616inKraft2001-02-28http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 789088.37160370.54788980.27160190.356788876.268159993.054788784.966159781.254788377.744158695.814787595.174157572.32786813.708155937.442786492.71155275.52785912.698155056.356785899.416154978.874785904.95154908.032785962.508154655.662785970.256154609.172785961.402154262.716785829.682154088.934785296.16153224.452784764.854152365.504784923.138152244.854785607.196152985.362786303.432153736.942786620.002154138.744786915.542154087.826787132.494154012.558787155.738154010.344787206.656154028.054787228.12154029.732787237.42154039.832787244.922154055.332787021.804154844.94787450.17155600.946787731.436156084.04788340.11157183.8788814.968158467.794789545.516159520.45789681.664159686.482789804.528159808.24789088.37160370.54inKraft1990-11-09http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 588095.97117973.182590254.288118728.372592286.202119334.262594397.018119888.752594582.02119965.652594813.422120063.05595125.024120193.55595239.124120244.65595374.126120313.248595497.826120383.648595630.228120466.948596078.332120749.646596289.334120883.246596743.532119975.238596508.53119885.94596273.728119796.64596040.126119707.342595880.024119646.442595693.324119577.142595510.522119522.044595326.32119479.444595278.92119469.844595011.418119416.546594566.516119327.148592508.4118607.258590485.684117973.366588273.668117392.376588084.966117313.578587847.364117214.678587675.162117142.08587460.66117042.38587259.258116929.98587065.558116800.28586599.96117537.188586906.162117679.686587177.164117775.386587456.666117845.184587652.468117884.684587898.768117933.282588095.97117973.182inKraft1981-03-06http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 604758.788265362.612604939.488265365.31605083.088265319.81605361.89265248.508605726.492265376.806606102.696265518.604606484.7265677.802606918.802265877.5607379.006266107.1607862.212266377.198608422.716266724.396608408.216266628.896608670.618266703.194608902.12266796.794609054.522266871.094609204.822266957.192609320.724267038.992609223.022266787.992609050.022266857.994608950.018266439.992608865.016266144.99608810.014265999.99608825.014265961.99608905.014265964.988609027.016265984.988609090.016265999.988609093.016266009.988609190.016266029.988609273.018266059.988609435.018266099.986609485.02266122.986609560.02266109.986609705.02266067.984610035.022265999.982610152.022265974.982610285.022265939.98610286.422265939.78610288.022265937.38610562.922265519.276610146.218265324.078610544.614264472.17610638.114264280.268610565.614264283.068610515.514264273.27610487.614264263.57610377.512264202.27610200.512264214.77609871.61264223.172609753.208264237.074609579.008264264.976609572.008264281.676609392.208264299.776609378.306264230.076609330.906264238.476609229.208264451.678608770.004264247.58608446.708265279.988608409.708265403.588608418.108265448.19608439.01265482.99608459.91265521.99608473.81265559.69608503.11265626.59608518.41265647.49608528.21265687.89608543.512265712.99608572.412265759.79608603.812265771.59608570.412265842.59608547.012265897.39608441.514266114.892608344.914266325.894608316.312266198.594608247.812266000.794608209.81265901.992608156.61265757.492608057.708265552.092607951.306265362.592607795.104265114.392607745.002265047.99607672.502264949.99607540.5264791.59607462.098264704.89607363.098264603.79607211.896264464.89607107.694264377.092606959.692264264.692606908.594264372.992606870.794264437.292606732.894264560.894606659.394264660.996606644.094264681.396606626.694264676.296606600.194264662.996606581.794264638.496606550.092264606.796606505.192264598.696606465.392264570.096606415.292264617.096606352.992264671.198606253.992264761.098606177.392264825.4606084.392264888.7606029.292264855.0605973.89264822.0605909.79264771.3605818.89264694.702605761.688264613.0605704.488264519.0605589.086264455.702605574.786264414.8605434.884264254.5605245.982264161.602605196.882264155.402604999.782264256.504604938.582264234.104604877.28264209.604604794.58264189.104604694.48264260.606604658.68264377.006604730.182264609.908604595.384264925.51604472.784265047.012604571.886265358.512604758.788265362.612inKraft1989-06-23http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 609320.724267038.992609326.924267043.392609419.524266865.89609591.224266977.79610185.422266092.182610286.422265939.78610285.022265939.98610152.022265974.982610035.022265999.982609705.02266067.984609560.02266109.986609485.02266122.986609435.018266099.986609273.018266059.988609190.016266029.988609093.016266009.988609090.016265999.988609027.016265984.988608905.014265964.988608825.014265961.99608810.014265999.99608865.016266144.99608950.018266439.992609050.022266857.994609223.022266787.992609320.724267038.992inKraft1989-06-23http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 571048.598249648.134570921.398250006.036570264.994249696.138569393.788249526.242568580.28249247.446567762.674248810.848567095.868248646.352567223.268248288.35567844.172248581.548568753.978248758.942569560.986249056.238570341.792249473.736571048.598249648.134inKraft2005-09-21http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 608605.448191899.27607745.938191047.87607294.44191590.676606724.43192470.328605684.546194075.1605664.446194096.202605554.544194004.402604948.74193694.804604709.942194361.808604199.644195144.416603959.848195794.222603514.648196507.928603136.25196873.932602330.746197056.438602181.646197103.34602031.644197163.542601903.644197232.342601814.844197288.644601731.644197340.244601663.844197386.144601509.644197483.946601450.844197522.748601987.75198163.048602370.95197757.842602893.556198201.242603607.454197161.932604372.854196622.324605417.852195350.81606034.05194388.6607446.15193077.884608216.25192363.076608605.448191899.27inKraft2001-09-10http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 603783.068199168.942603830.668199111.742603959.366198980.74604011.768199054.54604185.968198843.238606204.468197209.716606547.668196938.012606797.768196733.11606981.37196573.408607090.968196439.906607300.668196151.502607469.868195915.6607581.866195658.198607941.764194742.89608163.36194182.886607926.756193705.384607742.954193432.484607611.452193265.284607482.95193109.284607446.15193077.884606034.05194388.6605417.852195350.81604372.854196622.324603607.454197161.932602893.556198201.242602370.95197757.842601987.75198163.048601450.844197522.748601509.644197483.946601663.844197386.144601731.644197340.244601814.844197288.644601903.644197232.342602031.644197163.542602181.646197103.34602330.746197056.438603136.25196873.932603514.648196507.928603959.848195794.222604199.644195144.416604709.942194361.808604948.74193694.804605554.544194004.402605664.446194096.202605684.546194075.1606724.43192470.328606563.84192370.886606296.238192223.486606135.736192138.388605836.834192025.288605553.132191963.09605456.032192070.092604648.134192935.502604521.334193187.004604448.134193321.704604380.734193432.606604301.534193555.306604186.736193697.908604101.536193870.21603974.836194056.412603770.836194325.814603600.536194476.316603442.136194614.918603297.536194741.72603212.436194793.12603137.136194842.722603032.236194973.322602917.336195058.524602792.536195163.426602646.036195244.626602505.436195319.928602426.236195381.328602348.936195506.03602269.736195690.232602180.638195894.234602081.638196112.136601978.638196286.436601885.638196377.538601812.338196448.838601764.84196500.34601721.24196565.64601693.54196619.14601661.84196678.54601622.24196741.942601546.94196823.142601449.94196936.044601350.94197044.944601265.74197126.146601190.54197169.646601129.14197187.548601028.14197229.148600946.94197276.648600838.64197374.85600892.74197485.65601056.844197802.852601153.344197962.852601210.546198048.152601300.746198178.052601402.748198309.452601475.45198396.752601588.65198526.652601695.552198639.852601787.654198730.752601908.554198836.952602028.756198941.052602240.458199097.552602384.36199204.45602663.862199352.55603027.166199514.648603408.868199662.346603439.868199612.346603411.266199350.146603527.966199281.044603547.066199335.844603611.466199242.844603783.068199168.942inKraft2001-09-10http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 573109.164178482.916571682.656178608.026571657.354178091.124573077.16177966.714573109.164178482.916inKraft1971-09-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 591669.496118814.364591682.296118731.462592498.8118852.358592782.302118924.358592807.702118929.156593097.904118958.256593912.41119119.952593895.81119201.552593570.908119136.754593080.804119040.556592802.802118954.758592776.802118949.658592485.9118934.56591669.496118814.364inKraft2009-07-01http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 608728.728268189.502608823.028268120.002608913.028268043.0608973.028268000.0609020.028267930.0609098.028267829.998609148.028267737.998609228.028267642.996609335.026267534.996609478.026267402.994609478.026267367.994609360.024267139.992609320.724267038.992609204.822266957.192609054.522266871.094608902.12266796.794608670.618266703.194608408.216266628.896608422.716266724.396607862.212266377.198607379.006266107.1606918.802265877.5606484.7265677.802606102.696265518.604605726.492265376.806605361.89265248.508605083.088265319.81604939.488265365.31604622.888265482.112604645.588265502.912604652.188265526.814604656.888265537.414604663.288265539.014604672.088265538.614604677.788265548.114604683.288265559.414604688.888265567.114604694.788265571.514604703.188265572.814604707.288265580.314604707.288265590.714604711.388265599.114604722.688265606.814604734.288265613.914604747.688265624.114604755.79265632.014604763.59265639.714604773.09265644.912604781.89265645.412604787.09265646.812604788.29265653.812604786.69265662.012604800.29265673.512604808.89265672.812604815.49265671.912604820.29265675.312604828.19265688.312604831.19265695.312604829.29265705.712604829.29265712.814604833.39265723.014604848.89265734.614604861.19265744.612604876.09265756.712604893.29265770.612604910.69265784.712604931.292265793.812604940.092265800.512604941.292265808.312604938.292265817.112604944.992265820.612604944.192265833.112604940.692265852.014604943.892265860.214604954.392265870.114604977.992265889.314604995.392265903.914605010.292265926.014605019.592265935.114605031.892265947.914605037.692265957.514605046.092265964.214605056.292265968.914605065.392265973.814605077.594265984.614605084.894265991.612605098.294265996.812605114.594265999.812605138.194266000.612605153.594266012.612605164.994266021.312605174.894266028.012605181.294266029.212605187.094266025.412605190.594266019.312605196.694266012.612605207.194266012.012605212.494266014.612605219.194266019.912605230.494266028.912605237.794266031.212605246.594266031.512605258.494266031.512605266.994266037.012605280.694266051.612605292.594266060.112605308.294266067.912605317.696266078.412605325.196266099.712605329.596266127.912605407.396266028.912605453.696265975.31605479.096265981.71605592.096266012.01605680.696266036.21605721.998266042.91605884.598266074.308606043.1266178.308606170.102266309.208606303.802266442.608606275.302266468.808606534.506266687.908606488.506266750.508606676.108266895.908606849.81266997.008606936.61267038.108606930.51267055.008607153.912267123.406607367.814267194.806607475.016267326.506607588.316267479.806607654.116267396.404607882.22267626.804608138.722267865.304608539.926268081.804608724.128268187.902608728.728268189.502inKraft1989-06-23http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 608446.708265279.988608366.108265264.488608365.208265267.288608361.408265274.988608355.108265286.988608350.808265293.188608356.608265298.888608366.608265306.988608374.308265318.988608381.408265329.488608384.808265337.588608386.208265346.188608387.708265359.588608393.908265368.688608403.908265376.788608409.708265403.588608446.708265279.988inKraft1989-06-23http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 612670.26269719.786612512.458269698.788612513.358269704.988612515.458269720.488612542.86269921.288612524.96269957.088612523.86269959.288612519.26269965.09612493.46269997.29612500.66270037.09612501.06270039.19612500.26270041.59612489.66270075.29612453.26270087.99612452.96270088.09612445.96270090.49612466.062270159.89612487.762270234.99612504.864270484.092612499.564270487.492612368.764270571.594612031.462270788.296611902.462270833.598611710.062270901.2611318.66271038.802611313.36271023.402611206.258270712.202611083.356270428.4611071.254270400.4611065.954270377.0611050.954270310.0611016.152270155.2611005.152270089.0611004.752270086.7610972.252269890.798610977.148269444.696610977.248269435.496610538.946269558.2610369.746269535.3610289.444269504.8610240.344269523.0610116.044269569.102609982.644269618.602609642.442269674.506609621.342269678.006609621.142269677.606609536.94269503.006608896.334269080.606608879.134269069.306608873.434269011.006608869.534268971.106608869.534268970.706609078.834268741.304609082.034268737.804608992.63268478.602608959.53268364.802608929.33268261.002608928.23268257.202608728.728268189.502608823.028268120.002608913.028268043.0608973.028268000.0609020.028267930.0609098.028267829.998609148.028267737.998609228.028267642.996609335.026267534.996609478.026267402.994609478.026267367.994609360.024267139.992609320.724267038.992609326.924267043.392609419.524266865.89609591.224266977.79610185.422266092.182610600.228266402.78611110.832266857.38611585.838267396.78611952.044267936.182612278.65268539.882612417.352268871.784612552.356269265.384612670.26269719.786inKraft1989-06-23http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 599890.314226010.418599497.01225878.22599479.91225866.82599512.01225925.42599607.012225996.42599735.012226044.42599872.014226021.418599890.314226010.418inKraft2001-02-28http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 600868.222226501.514600731.02226454.816600727.02226480.416600810.022226527.416600868.222226501.514inKraft2001-02-28http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 600059.868226586.214599840.616226458.522599791.316226562.722599207.21226219.024598281.504225946.728597878.5225767.63597036.692225235.732596434.888225028.234596401.088225016.034596371.788225105.836596324.588225352.436596308.79225603.038596324.592225853.64596371.794226100.24596449.596226339.042596556.898226566.242596691.8226778.242596852.402226971.742597036.004227143.642597239.706227291.242597460.408227412.142597694.61227504.64597938.612227567.04598188.514227598.538598440.314227598.536598690.216227567.034598934.218227504.632599168.418227412.13599389.118227291.228599592.818227143.626599776.418226971.724599937.018226778.222600059.868226586.214inKraft2001-03-02http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 600305.868225366.216600242.572225364.38600150.838225427.676600096.716225522.162599990.304225930.38599965.014225965.418599890.314226010.418600163.216226102.118600104.716226241.918600200.316226274.418600257.016226100.216600304.214225853.614600320.014225603.014600305.868225366.216inKraft2001-03-02http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 596575.586224610.432596629.486224641.73596684.786224522.23597302.692224880.228598164.498225107.824598730.202225364.622599479.91225866.82599425.01225766.42599415.008225577.418599457.006225282.416599473.004225068.416599402.004224900.416599314.002224806.416599175.002224715.416599028.0224655.416598837.998224631.418598630.998224567.418598484.996224482.418598392.994224337.418598305.992223997.416598249.99223782.416598162.988223631.416598140.188223613.616597938.588223639.018597694.586223701.418597460.386223793.92597239.686223914.824597035.984224062.426596852.384224234.328596691.786224427.83596575.586224610.432inKraft2001-03-02http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 492415.03117976.678492550.23117829.576492506.43117781.776493353.43116898.966493397.13116938.766493528.43116787.664495218.352118931.466496539.368120217.966497191.676120769.064497510.878121038.864497573.58121100.864499231.498122637.262501004.918124288.26502300.232125240.058502194.232125353.658502197.132125356.458501401.032126196.068501398.632126193.168501290.332126305.87500300.32125032.768498558.198123346.57498498.298123289.67498514.198123282.17498533.698123272.17498543.998123270.77498553.498123262.07498550.998123252.07498553.498123241.47498575.598123237.57498581.398123230.87498573.898123223.07498582.798123215.47498605.098123212.67498613.798123206.27498625.498123207.67498644.698123207.168498660.898123202.368498659.898123196.668498611.998123116.968498658.898123051.868498500.696122899.368498400.994122809.268498333.894122750.768498370.394122699.968497430.982121808.968497282.384121959.27496856.578121569.47496764.878121653.372496517.176121407.672496468.474121343.872496209.572121009.772495998.968120786.672495915.968120708.872494654.354119529.774492415.03117976.678inKraft1985-02-18http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 676804.548257815.054676839.604257641.376676925.518257650.264676922.556257687.296676909.156257749.804676868.998257838.878676804.548257815.054inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 689512.31255777.324688380.506256438.736688409.11256917.738687276.504256892.346687156.002256917.746687010.002256933.648686838.702256949.448686645.3256956.65685265.194257152.56685081.194257412.762685227.096257577.662684203.198258761.476682999.698259930.59682440.998260538.096682163.1261114.002681049.216264659.628681077.018264676.628681624.022264806.026682034.024264863.724682437.126264898.422683054.23264891.018683543.232264843.214684059.534264743.21684436.536264647.108684880.238264502.804685356.04264289.6685656.04264137.096685963.04263986.094686373.142263797.39686746.342263612.886687131.844263383.182687480.444263149.38687861.844262845.976688120.244262620.372688419.644262316.868688686.244261992.866688783.544261864.164688928.242261672.962689153.742261312.058689342.44260959.356689551.54260524.652689732.036259921.746689875.534259368.042689945.33258773.44689953.526258154.136689928.924257629.132689822.218257018.03689670.514256390.628689512.31255777.324inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 677383.442256134.706677601.844256216.802678757.154256637.698679168.256256787.396679355.858256834.894679506.36256863.994681360.57256933.582683297.28256622.868683583.878256035.964683504.476255797.762683649.474255628.56683687.476255638.96683886.574255398.958684648.27253789.744685442.602251253.584685214.756251176.626684565.852251039.028683663.146250957.934683112.942250979.138682535.44251053.742681723.536251257.648680757.334251666.756679949.732252202.764679473.632252615.37679106.932252989.174678757.234253438.38678623.734253609.88678281.736254188.186677699.34255432.698677383.442256134.706inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 678145.874260606.324678163.676260668.824678181.576260713.424678274.376260799.224678301.178260824.224678192.276260851.024677963.674260625.924677643.974260859.928677651.174260893.828677467.172260901.03677399.374261024.23677426.174261038.53677435.074261095.63677415.374261165.332677472.574261213.532677376.076261581.434677417.178261604.634677366.878261685.234677608.782262115.936677908.186262554.736678224.89262924.236679597.892261856.522680981.692260780.306681568.592260176.8682866.682257426.776681401.374257451.686679506.666257840.6679229.864257862.402679001.862257859.902678762.762257836.704677246.694257682.856677243.952257700.712677320.752257807.912677301.152257854.314677361.854257981.114677483.256258068.614677481.456258188.314677547.556258229.314677549.356258265.014677802.96258388.314677795.76258425.814677858.26258445.414677852.962258666.914677817.262258824.016677794.062258904.416677736.862259047.218677743.964259245.518677849.366259427.618677936.868259652.72678076.27260022.52678101.172260068.82678138.672260229.522678140.474260408.122678145.874260606.324inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 689060.098254510.22688944.596254188.22688649.292253675.618688415.588253368.018688214.586253113.718687872.58252731.618687585.478252466.518687135.772252111.018687130.872252108.218686971.872252221.12686721.572252400.224685548.076254136.44684377.484256514.562685393.49256481.354685691.69256072.75686538.394256080.146686177.594256477.65686497.096256470.448686702.298256435.646686898.998256372.144687082.998256289.642687206.698256229.342687387.5256121.54687533.5256000.938689060.098254510.22inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 685168.166252721.734685316.964252386.832685448.164252152.03685586.262251938.028685876.262251575.424686148.962251250.92686449.362250898.816686680.66250632.914687001.36250245.51687067.56250220.908687178.06250135.008687246.762250257.708687389.062250179.206687379.262250260.206687445.564250412.308687254.164250490.908687364.566250753.51687182.964250819.712687342.468251256.612687423.468251249.212687450.468251237.012687467.67251266.412687578.07251229.612687818.57250998.908687867.67251040.608688125.372251072.506688127.872251202.608688203.874251232.008688228.474251330.208694903.332245176.83693682.07243860.188690667.868246649.54692856.15243475.734688534.012241383.25685442.602251253.584684648.27253789.744683886.574255398.958683939.474255335.158684005.076255380.058684502.574254614.85684906.168253453.54684937.168253467.34685168.166252721.734inKraft2013-01-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 684327.79257260.966684000.588257299.368683750.29257835.272684327.79257260.966inKraft2013-01-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 684377.484256514.562684971.778254847.048685609.874253786.938685572.974253764.838685769.374253433.434686122.772252913.13686427.072252616.226686721.572252400.224685548.076254136.44684377.484256514.562inKraft2013-01-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 685393.49256481.354685691.69256072.75686538.394256080.146686177.594256477.65685712.492256489.552685393.49256481.354inKraft2013-01-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 675938.788264738.262675886.188264843.562675865.49264928.162675829.79264961.964675795.99264978.864675779.09265029.664675762.09265067.264675716.99265102.964675673.79265174.366675626.79265247.666675662.49265322.866675799.692265388.666675395.59265559.77675418.192265685.67675406.892265708.27675410.692265728.87675433.192265736.37675480.192265805.97675502.792265843.57675530.994265860.47675592.994265860.47675643.694265845.47675758.394265753.368675854.294265815.368675809.196265963.868675835.496266022.17675794.196266101.07675983.998266178.168676061.098266251.468676081.698266249.568676132.5266345.47676081.7266347.37676038.5266373.67676010.3266403.67675972.7266424.37675925.7266448.87675910.7266473.272675929.5266493.972675961.4266484.57676017.8266467.67676058.9266443.97676089.5266447.17676123.1266450.67676160.7266471.37676203.902266510.87676215.202266550.37676258.402266629.27676296.002266672.57676358.004266783.47676262.204266849.172676312.904266956.372676455.804266867.97676547.906266978.87676499.006267027.77676476.506267061.67676467.106267087.972676482.106267108.572676523.406267093.57676561.008267161.17676549.708267172.472676557.208267204.472676568.508267305.972676611.808267320.972676615.508267337.872676559.108267382.972676600.508267401.772676606.11267424.372676589.21267469.472676551.01267507.372676527.21267580.374676525.31267623.674676536.61267672.474676551.61267708.174676619.312267802.174676551.612267877.376676517.812267892.476676450.112267905.576676555.412267990.176676617.412267986.376676664.412267945.074676696.312267884.874676752.712267841.674676796.012267813.474676841.112267775.872676897.512267725.172676955.714267845.472677049.714267841.672677126.814267828.472677203.916267841.67677260.316267841.67677258.416267898.07677303.516267999.572677412.518268010.87677446.418268112.37677564.82268161.27677709.52268193.17677760.82268116.768677827.92268001.468677861.82267939.368677859.92267903.668677835.518267866.066677805.418267847.268677807.318267820.966677827.918267802.166677873.118267790.866677886.218267811.566677893.718267790.866677942.618267760.866677989.62267828.466678006.52267817.166677999.02267807.766678014.02267794.666677978.318267762.666678081.72267721.364678185.12267679.964678235.82267655.564678250.92267672.464678264.02267668.764678277.22267689.364678730.22267364.258678749.022267424.358678792.222267411.158678790.322267364.258678815.422267371.958678848.622267366.058678921.922267320.958678974.622267289.056679021.522267268.356679076.122267258.956679108.022267243.956679121.222267211.956679149.422267211.954679175.722267213.854679192.622267196.954679200.122267161.254679218.922267148.054679235.822267112.354679241.522267087.954679267.822267074.754679299.722267040.954679337.322267022.152679361.822267001.452680333.628266937.546681049.21264659.626681928.804261859.608682163.1261114.002682440.998260538.096682999.698259930.59684203.198258761.476685227.096257577.662685081.194257412.762685265.194257152.56686645.3256956.65686838.702256949.448687010.002256933.648687156.002256917.746687276.504256892.346688409.11256917.738688380.506256438.736689512.31255777.324691509.852254600.558692072.614254174.6692017.412254122.1692114.112253934.198691865.41253657.898691768.608253599.798691846.008253340.096692230.108253069.292692015.006252892.292691867.004252951.794691882.106253037.394691856.106253049.694691801.306253053.794691765.704253046.996691769.804253031.294691712.304253002.496691693.804252955.194691595.204252975.096691595.204253007.296691589.704253010.696691589.704252997.696691530.104253017.596691538.304253027.096691500.004253076.396691441.104253119.598691372.604253164.798691294.604253227.1691164.404253355.8690989.102253392.102690992.502253409.902690867.902253433.902690870.002253454.402690843.302253462.704690834.402253496.204690796.702253505.804690666.602253555.804690612.302253567.506690464.0253572.406690410.1253571.206690381.9253583.406690373.3253607.906690335.3253601.808690356.2253665.508690231.1253636.108690236.1253812.61690195.6253827.31690097.6253763.61690025.3253748.91689994.6253791.81689983.6253938.812689965.2253996.412689907.6254012.412689872.1254006.212689842.7253986.612689704.198253881.212689060.098254510.22687533.5256000.938687387.5256121.54687206.698256229.342687082.998256289.642686898.998256372.144686702.298256435.646686497.096256470.448686177.594256477.65685712.492256489.552685393.49256481.354684377.484256514.562684971.778254847.048685609.874253786.938685572.974253764.838685769.374253433.434685931.372253197.832686122.772252913.13686279.872252756.128686427.072252616.226686721.572252400.224686971.872252221.12687130.872252108.218687479.972251860.316688100.874251416.108688228.474251330.208688203.874251232.008688127.872251202.608688125.372251072.506687867.67251040.608687818.57250998.908687578.07251229.612687467.67251266.412687450.468251237.012687423.468251249.212687342.468251256.612687182.964250819.712687364.566250753.51687254.164250490.908687445.564250412.308687379.262250260.206687389.062250179.206687246.762250257.708687178.06250135.008687067.56250220.908687001.36250245.51686680.66250632.914686449.362250898.816686148.962251250.92685876.262251575.424685586.262251938.028685448.164252152.03685316.964252386.832685168.166252721.734684937.168253467.34684906.168253453.54684502.574254614.85684005.076255380.058683939.474255335.158683886.574255398.958683687.476255638.96683649.474255628.56683504.476255797.762683583.878256035.964683297.28256622.868681360.57256933.582679506.36256863.994679355.858256834.894679168.256256787.396678757.154256637.698677601.844256216.802677383.442256134.706676547.836255820.606675610.13255622.512675549.33255810.112673987.496255902.118673988.222255976.524673695.02255915.726673961.824256164.024673866.722256187.826673803.0256443.204673598.35256457.156673713.078256858.708673816.954256801.342673892.924256804.444673936.334257060.258676188.16257573.916676839.604257641.376676925.518257650.264677246.694257682.856678762.762257836.704679001.862257859.902679229.864257862.402679506.666257840.6681401.374257451.686682866.682257426.776681568.592260176.8680981.692260780.306679597.892261856.522678224.904262924.256676143.688264542.758675938.788264738.262684000.588257299.368683750.29257835.272684327.79257260.966684000.588257299.368inKraft1983-07-04http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 553897.488215602.346553787.99216184.35552434.08215823.158553638.292216510.054553295.192216994.358552403.082216208.66551263.972215552.464550385.962214887.264549531.854214146.066549382.852214061.566548330.042213464.97548623.642213049.366548616.642213043.366549062.142212652.56549656.85213497.362549885.054213815.162550084.656214093.162550705.862214452.16551617.97215050.858552123.776215495.858552607.38215534.254553098.582215555.252553897.488215602.346inKraft1978-12-28http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 715256.66698742.474715241.16698824.074714731.56498990.678714688.16298789.378714669.66298795.878714458.05697792.474714366.95297360.572713949.24496398.77713911.24296289.968713567.63495306.066713508.03295020.164713408.9394557.262713319.82694130.96713216.92493893.26713594.12693897.858713629.52894040.658713901.83294673.86714100.13695134.962714296.54295805.764714425.54696246.466714644.75497277.57714849.35897749.972715224.26498615.774715205.26498622.074715256.66698742.474inKraft2004-08-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 714731.56498990.678714697.36499002.58714690.76498964.38714682.86498928.878714667.06498902.478714657.86498890.678714652.56498870.978714636.76498849.878714607.86298822.278714605.16298782.778714599.96298743.278714595.96298712.978714592.06298690.578714582.86298660.378714578.86298633.978714585.46298608.978714578.86298587.978714576.2698564.278714577.5698543.178714573.5698514.278714567.0698494.478714574.9698474.776714570.9698454.976714565.6698437.876714565.6698414.176714543.3698390.576714515.6698365.476714526.2698336.576714518.3698311.476714503.85898283.876714501.25898262.776714499.85898241.776714501.25898203.576714491.95898165.476714484.05898115.376714477.55898077.276714457.75698008.776714415.65697900.874714380.85497797.674714312.05497593.874714244.25297386.172713968.04897071.572713861.24696946.672713654.24496617.772713652.34496615.272713516.54296435.672713408.93896088.67713362.23895993.87713322.33895923.87713297.53695848.67713259.93695724.47713220.73495656.77713192.93495604.87713191.43495581.47713192.13495554.37713194.43495506.968713185.33495444.468713151.53295325.568713127.43295248.868713112.33295150.968713109.3395093.768713107.8395047.866713122.1395023.866713143.2395008.766713168.8394975.666713166.5394934.266713163.5394892.066713150.0394849.966713131.9394813.866713106.62894766.366713089.92894729.266713070.22894670.066713052.12894611.364713021.32694549.664712985.92694506.064712972.32694476.664712998.72694487.964713021.32694490.964713040.12694487.264713056.62694484.264713073.22694478.964713092.02694478.164713099.52694485.764713113.12694487.264713133.42894484.964713139.42894481.264713145.42894469.964713157.52894464.664713170.32894463.864713184.62894455.564713194.42894450.364713202.62894434.562713216.92894422.462713229.02894406.662713251.62894408.162713283.22894399.962713297.52894409.762713310.32894421.762713324.62894430.062713326.82894445.862713333.62894458.662713346.42894463.862713363.72894469.962713369.72894479.762713366.72894494.062713362.22894506.062713366.02894522.562713374.22894533.162713393.82894543.662713408.9394557.262713508.03295020.164713567.63495306.066713911.24296289.968713949.24496398.77714366.95297360.572714458.05697792.474714669.66298795.878714688.16298789.378714731.56498990.678inKraft2004-08-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple 715372.26498289.87715370.86498300.67715361.46498327.472715338.66498380.372715326.66498405.872715324.66498432.672715318.56498480.272715282.36498569.474715278.36698619.074715270.96698653.274715256.66698742.474715205.26498622.074715224.26498615.774714849.35897749.972714644.75497277.57714425.54696246.466714296.54295805.764714100.13695134.962713901.83294673.86713932.13294660.06713933.43294639.96713942.03294623.96713947.53294595.96713953.03294586.86713966.93294589.358713983.33294594.758713998.53294600.858714014.33294599.058714030.13294591.158714054.43294580.858714064.13294557.758714072.63294538.958714073.83294522.558714067.13294503.758714069.53294469.158714073.83294436.358714074.43294396.858714079.23294381.658714091.43294368.356714102.33294349.556714112.03294333.756714115.73294320.956714117.53294302.756714206.73294417.456714231.03294430.256714272.33494460.656714254.13494537.156714244.43494569.858714243.23494593.558714264.43494630.558714280.83494659.758714309.33694705.858714347.63694771.458714364.03694806.058714373.13694847.358714381.03694887.958714382.83694932.958714393.73894974.858714398.63895009.458714448.43895165.46714432.6495226.76714427.8495257.16714424.1495302.66714419.9495364.66714419.3495405.86714422.3495462.36714425.34295551.662714427.04295554.662714422.94295593.462714418.64295640.862714408.94295697.362714400.44295741.062714404.74295777.462714400.14295818.964714398.64295832.064714395.04295878.864714393.24495940.164714404.14495983.864714422.94496031.864714442.34496070.664714462.94496104.764714498.24696147.264714530.94696187.364714564.94696247.464714569.34696254.764714580.74696273.564714585.64696291.764714591.74696319.064714603.24896339.064714622.04896374.564714625.14896380.364714636.14896396.164714657.24896426.464714699.14896485.966714725.94896532.766714745.3596571.566714752.4596596.266714754.4596603.166714775.0596652.366714776.8596654.766714800.8596686.966714803.0596689.966714824.5596709.466714836.4596720.366714838.6596722.966714864.35296753.166714880.45296767.666714888.65296774.966714894.55296785.466714903.55296801.466714920.35296834.966714935.05296861.766714936.65296864.866714987.35496961.766715010.05497001.066715106.85697168.266715118.75697188.966715120.35697192.566715152.95697265.466715204.55697364.066715321.3697614.168715325.9697624.168715309.2697634.868715321.2697695.868715322.6697736.168715321.9697764.968715318.5697799.768715305.1697827.968715296.4697872.27715290.4697919.17715293.16297972.17715304.56298017.77715313.86298074.07715321.96298115.67715321.96298165.87715326.66298199.37715337.36498232.97715361.46498271.77715372.26498289.87inKraft2004-08-25http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616&currTab=simple gdalautotest-3.0.4/ogr/data/ili/surface_complex.itf0000644003401500001440000000060413614004466021774 0ustar rouaultusersSCNT //// MTID SURFC_TRA MODL SURFC TOPI SURFC_TOP TABL SURFC_TBL OBJE 107 3 3 1 23 25000 20060111 ETAB TABL SURFC_TBL_SHAPE OBJE 408 107 STPT 747955.101 265828.716 LIPT 747954.975 265827.862 ELIN OBJE 409 107 STPT 747951.240 265833.326 LIPT 747955.101 265828.716 ELIN OBJE 410 107 STPT 747954.975 265827.862 LIPT 747951.166 265828.348 LIPT 747951.240 265833.326 ELIN ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/RoadsExdm2ien.ili0000644003401500001440000000113113614004466021250 0ustar rouaultusers!! File RoadsExdm2ien.ili Release 2005-06-16 INTERLIS 2.3; MODEL RoadsExdm2ien (en) AT "http://www.interlis.ch/models" VERSION "2005-06-16" = IMPORTS RoadsExdm2ben; TOPIC RoadsExtended EXTENDS RoadsExdm2ben.Roads = CLASS StreetAxis (EXTENDED) = Precision: MANDATORY ( precise, unprecise); END StreetAxis; CLASS RoadSign (EXTENDED) = Type (EXTENDED): ( prohibition ( noentry, noparking, other)); END RoadSign; END RoadsExtended; !! of TOPIC END RoadsExdm2ien. !! of MODEL gdalautotest-3.0.4/ogr/data/ili/format-default.itf0000644003401500001440000000024013614004466021523 0ustar rouaultusersSCNT FormatDefault Transfer-File //// MTID FormatDefault MODL FormatDefault TOPI FormatTests TABL FormatTable OBJE 0 aa_bb \ CONT cc^dd @ 1 ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/ili/enum-test.imd0000644003401500001440000022264113614004466020534 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse EnumTest1falseNormalMEnumTesttrue956492TID_ANY C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false LKoordfalsefalsefalse TOPfalsefalse Enum0falsefalse Subenumsfalsefalse Enum1falsefalse Enum2falsefalse Enum3falsefalse NestedfalsefalsefalseUnordered Bodenbedeckung BASKETfalsefalsefalseEnumTest.Bodenbedeckung BoFlaechenfalsefalseClassfalsefalse TOPfalsefalse Gebaeudefalsefalse befestigtfalsefalse humusiertfalsefalse Gewaesserfalsefalse bestocktfalsefalse vegetationslosfalsefalse TYPEfalsefalsetrueUnordered ArtfalsefalseNoSubDivfalse TOPfalsefalse Enum0falsefalse Subenumsfalsefalse Enum1falsefalse Enum2falsefalse Enum3falsefalse TYPEfalsefalsetrueUnordered NestedEnumfalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/multigeom.imd0000644003401500001440000021711513614004466020615 0ustar rouaultusers INTERLIS2.3trueNormalMenhttp://www.interlis.ch20060126 STRAIGHTS ARCS ANYUNITtruefalseBaseU DIMENSIONLESStruefalseBaseU LENGTHtruefalseBaseU MASStruefalseBaseU TIMEtruefalseBaseU ELECTRIC_CURRENTtruefalseBaseU TEMPERATUREtruefalseBaseU AMOUNT_OF_MATTERtruefalseBaseU ANGLEtruefalseBaseU SOLID_ANGLEtruefalseBaseU LUMINOUS_INTENSITYtruefalseBaseU MONEYtruefalseBaseU mfalsefalseBaseU kgfalsefalseBaseU sfalsefalseBaseU AfalsefalseBaseU KfalsefalseBaseU molfalsefalseBaseU radfalsefalseBaseU srfalsefalseBaseU cdfalsefalseBaseU URIfalsetruefalseText1023 NAMEfalsetruefalseText255 INTERLIS_1_DATEfalsetruefalseText8 TOPfalsefalse falsefalsefalse truefalsefalse BOOLEANfalsetruefalseOrdered TOPfalsefalse Leftfalsefalse Centerfalsefalse Rightfalsefalse HALIGNMENTfalsetruefalseOrdered TOPfalsefalse Topfalsefalse Capfalsefalse Halffalsefalse Basefalsefalse Bottomfalsefalse VALIGNMENTfalsetruefalseOrdered ANYOIDtruefalsefalse I32OIDfalsefalsefalse02147483647false STANDARDOIDfalsefalsefalseText16 UUIDOIDfalsefalsefalseText36 C1truefalsetruefalse C2truefalsetruefalse LineCoordtruefalsefalse TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType myClass TYPEfalsefalsefalse potSubClassfalsefalsefalse potSubClassType potSuperClassfalsefalsefalse potSuperClassType isSubClass TYPEfalsefalsefalse Objectfalsefalsefalsefalse ObjectType Classfalsefalsefalse ClassType isOfClass TYPEtruefalsefalsefalse bagfalsefalsefalsefalse0 bagType elementCount TYPEtruefalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType objectCount TYPEtruefalsefalsefalse TextValfalsefalsefalseText TextValType len TYPEtruefalsefalsefalse TextValfalsefalsefalseMText TextValType lenM TYPEfalsefalsefalseText TextValfalsefalsefalseText TextValType trim TYPEfalsefalsefalseMText TextValfalsefalsefalseMText TextValType trimM TYPEfalsefalsefalse SubValEnumTreeVal NodeValEnumTreeVal isEnumSubVal TYPEfalsefalsefalse EnumEnumVal MinValEnumTreeVal MaxValEnumTreeVal inEnumRange TYPEtruefalsefalsefalse fromtruefalsefalsefalse fromType convertUnit TYPEfalsefalsefalse Objectsfalsefalsefalsetrue ObjectsType SurfaceBagfalsefalsefalse SurfaceBagType SurfaceAttrfalsefalsefalse SurfaceAttrType areAreas ANYCLASSfalsefalseClassfalsefalse ANYSTRUCTUREfalsefalseStructurefalsefalse METAOBJECTtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse METAOBJECT_TRANSLATIONtruefalseClassfalsefalse TYPEfalsefalsetrueText255 NamefalsefalseNoSubDivfalse TYPEfalsefalsetrueText255 NameInBaseLanguagefalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse AXISfalsefalseStructurefalsefalse REFSYSTEMtruefalseClassfalsefalse COORDSYSTEMtruefalseClassfalsefalse TYPEfalsefalsetruetrue13 AxisfalsefalseNoSubDivfalse TYPEtruefalsefalsefalse Unitfalsefalse SCALSYSTEMtruefalseClassfalsefalse TYPEfalsefalsefalse Signfalsefalse SIGNtruefalseClassfalsefalse TIMESYSTEMS BASKETfalsefalsefalseINTERLIS.TIMESYSTEMS TYPEtruefalsefalsefalse Unitfalsefalse CALENDARfalsefalseClassfalsefalse TYPEtruefalsefalsefalse Unitfalsefalse TIMEOFDAYSYSfalsefalseClassfalsefalse minfalsefalseDerivedU hfalsefalseDerivedU dfalsefalseDerivedU MfalsefalseBaseU YfalsefalseBaseU BaseTimeSystemsfalsefalseRefSystemB GregorianCalendartrue UTCtrue TimeOfDaytruefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseNoSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse UTCfalsefalseStructurefalsefalse GregorianYearfalsefalsefalse15822999false GregorianDatefalsefalseStructurefalsefalse YearfalsefalseNoSubDivfalse TYPEfalsefalsefalse112false MonthfalsefalseSubDivfalse TYPEfalsefalsefalse131false DayfalsefalseSubDivfalse GregorianDateTimefalsefalseStructurefalsefalse TYPEfalsefalsefalse023true HoursfalsefalseSubDivfalse TYPEfalsefalsefalse059true MinutesfalsefalseContSubDivfalse TYPEfalsefalsefalse0.00059.999true SecondsfalsefalseContSubDivfalse XMLTimefalsefalsefalse0:0:0.00023:59:59.999Hours/2":"Minutes":"Seconds XMLDatefalsefalsefalse1582-1-12999-12-31Year"-"Month"-"Day XMLDateTimefalsefalsefalse1582-1-1T0:0:0.0002999-12-31T23:59:59.999Year"-"Month"-"Day"T"Hours/2":"Minutes":"Seconds LineSegmenttruefalseStructurefalsefalse C1truefalsetruefalse C2truefalsetruefalse TYPEtruefalsetrue SegmentEndPointtruefalseNoSubDivfalse StartSegmentfalsetrueStructurefalsefalse StraightSegmentfalsetrueStructurefalsefalse ArcSegmentfalsetrueStructurefalsefalse SurfaceEdgefalsefalseStructurefalsefalse TYPEtruefalsefalseDirectedPolyline GeometryfalsefalseNoSubDivfalse TYPEfalsefalsefalsefalse01 LineAttrsfalsefalseNoSubDivfalse SurfaceBoundaryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 LinesfalsefalseNoSubDivfalse LineGeometryfalsefalseStructurefalsefalse TYPEfalsefalsefalsetrue0 SegmentsfalsefalseNoSubDivfalse Multigeom1falseNormalMMultigeomtrue956492TID_ANY C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false LKoordfalsefalsefalse MultigeomTests BASKETfalsefalsefalseMultigeom.MultigeomTests MultigeomTablefalsefalseClassfalsefalse TYPEfalsefalsetrueText6 Text1falsefalseNoSubDivfalse TYPEfalsefalsetruePolyline GeomLinefalsefalseNoSubDivfalse TYPEfalsefalsetrue099false NumberfalsefalseNoSubDivfalse C1falsefalsetrue100.00300.00false C2falsefalsetrue100.00300.00false TYPEfalsefalsetrue GeomPointfalsefalseNoSubDivfalse gdalautotest-3.0.4/ogr/data/ili/Beispiel.itf0000644003401500001440000000150513614004466020352 0ustar rouaultusersSCNT Beispiel Transfer-File //// MTID Beispiel MODL Beispiel TOPI Bodenbedeckung TABL BoFlaechen_Form OBJE 1 STPT 146.92 174.98 LIPT 138.68 187.51 LIPT 147.04 193.00 LIPT 149.79 188.82 LIPT 158.15 194.31 LIPT 163.64 185.96 LIPT 146.92 174.98 ELIN OBJE 2 STPT 140.69 156.63 LIPT 118.19 179.82 LIPT 113.00 219.97 LIPT 148.30 228.97 LIPT 186.38 206.82 ELIN OBJE 3 STPT 186.38 206.82 ARCP 183.26 188.19 LIPT 170.18 176.00 LIPT 140.69 156.63 ELIN OBJE 4 STPT 186.38 206.82 LIPT 194.26 208.19 ARCP 190.75 185.21 LIPT 174.10 169.00 LIPT 145.08 149.94 LIPT 140.69 156.63 ELIN ETAB TABL BoFlaechen OBJE 10 0 148.20 183.48 OBJE 20 1 168.27 170.85 OBJE 30 2 133.95 206.06 ETAB TABL Strasse OBJE 100 STPT 190.26 208.00 ARCP 187.00 186.00 LIPT 173.10 171.00 LIPT 141.08 152.94 ELIN ETAB TABL Gebaeude OBJE 40 148.41 175.96 958 10 ETAB ETOP EMOD ENDE gdalautotest-3.0.4/ogr/data/empty_first_field_with_tab_delimiter.mid0000644003401500001440000000000513614004466025451 0ustar rouaultusers foo gdalautotest-3.0.4/ogr/data/emptylayers.kml0000644003401500001440000000066713614004466020430 0ustar rouaultusers Test Layer1 Placemark1 Layer2 gdalautotest-3.0.4/ogr/data/huge_geom_end.gml0000644003401500001440000000022413614004466020620 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/3d.dxf0000755003401500001440000003266313614004470016355 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 EEEF1 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 370 -3 390 4CF 347 4E1 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 Arial 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEFC4 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 innerblk 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEFD4 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 outerblk 340 0 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEFC5 330 EEFC4 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 innerblk 70 0 10 0.0 20 0.0 30 0.0 3 innerblk 1 0 3DSOLID 5 EEFE3 330 EEFC4 100 AcDbEntity 8 0 6 Continuous 62 0 100 AcDbModelerGeometry 290 1 2 {3EE7EF10-EE2A-4735-BD73-5282937C61CC} 100 AcDb3dSolid 350 EEFE4 0 ENDBLK 5 EEFC6 330 EEFC4 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEFD5 330 EEFD4 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 outerblk 70 0 10 0.0 20 0.0 30 0.0 3 outerblk 1 0 INSERT 5 EEFF8 330 EEFD4 100 AcDbEntity 8 0 6 Continuous 62 0 100 AcDbBlockReference 2 innerblk 10 1.0 20 2.5 30 0.0 41 1.5 42 0.4 50 60.0 0 ENDBLK 5 EEFD6 330 EEFD4 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 POLYLINE 5 AAAA 330 EEEEE 100 AcDbEntity 8 0 100 AcDbPolyFaceMesh 66 1 70 64 71 8 72 6 0 VERTEX 5 BB8B 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 0.0 20 0.0 30 0.0 70 192 0 VERTEX 5 BB8C 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 1.0 20 0.0 30 0.0 70 192 0 VERTEX 5 BB8D 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 1.0 20 1.0 30 0.0 70 192 0 VERTEX 5 BB8E 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 0.0 20 1.0 30 0.0 70 192 0 VERTEX 5 BB8F 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 1.0 20 0.0 30 1.0 70 192 0 VERTEX 5 BB90 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 0.0 20 0.0 30 1.0 70 192 0 VERTEX 5 BB91 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 1.0 20 1.0 30 1.0 70 192 0 VERTEX 5 BB92 330 AAAA 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDbPolyFaceMeshVertex 10 0.0 20 1.0 30 1.0 70 192 0 VERTEX 5 BB93 330 AAAA 100 AcDbEntity 8 0 62 1 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 1 72 2 73 3 74 4 0 VERTEX 5 BB94 330 AAAA 100 AcDbEntity 8 0 62 2 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 1 72 2 73 5 74 6 0 VERTEX 5 BB95 330 AAAA 100 AcDbEntity 8 0 62 3 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 2 72 3 73 -7 74 5 0 VERTEX 5 BB96 330 AAAA 100 AcDbEntity 8 0 62 4 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 3 72 7 73 8 74 4 0 VERTEX 5 BB97 330 AAAA 100 AcDbEntity 8 0 62 5 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 1 72 4 73 8 74 6 0 VERTEX 5 BB98 330 AAAA 100 AcDbEntity 8 0 62 6 100 AcDbFaceRecord 10 0.0 20 0.0 30 0.0 70 128 71 6 72 -5 73 7 74 8 0 SEQEND 5 BB99 330 AAAA 100 AcDbEntity 8 0 62 6 0 CIRCLE 5 EEF9D 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbCircle 39 -1.8 10 2.399999999999999 20 0.0 30 -0.0000000000000005 40 0.4 210 -0.0000000000000002 220 -1.0 230 -0.0000000000000002 0 3DSOLID 5 EEFB6 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbModelerGeometry 290 1 2 {C79C0DD8-8E21-43B4-9864-9B93B2743111} 100 AcDb3dSolid 350 EEFB9 0 INSERT 5 EEFDF 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 1 100 AcDbBlockReference 2 outerblk 10 -6.0 20 0.5 30 0.0 41 0.25 42 0.25 210 0.0 220 0.0 230 -1.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 SECTION 2 ACDSDATA 70 2 71 8 0 ACDSSCHEMA 90 0 1 AcDb_Thumbnail_Schema 2 AcDbDs::ID 280 10 91 8 2 Thumbnail_Data 280 15 91 0 101 ACDSRECORD 95 0 90 2 2 AcDbDs::TreatedAsObjectData 280 1 291 1 101 ACDSRECORD 95 0 90 3 2 AcDbDs::Legacy 280 1 291 1 101 ACDSRECORD 1 AcDbDs::ID 90 4 2 AcDs:Indexable 280 1 291 1 101 ACDSRECORD 1 AcDbDs::ID 90 5 2 AcDbDs::HandleAttribute 280 7 282 1 0 ACDSSCHEMA 90 1 1 AcDb3DSolid_ASM_Data 2 AcDbDs::ID 280 10 91 8 2 ASM_Data 280 15 91 0 101 ACDSRECORD 95 1 90 2 2 AcDbDs::TreatedAsObjectData 280 1 291 1 101 ACDSRECORD 95 1 90 3 2 AcDbDs::Legacy 280 1 291 1 101 ACDSRECORD 1 AcDbDs::ID 90 4 2 AcDs:Indexable 280 1 291 1 101 ACDSRECORD 1 AcDbDs::ID 90 5 2 AcDbDs::HandleAttribute 280 7 282 1 0 ACDSSCHEMA 90 2 1 AcDbDs::TreatedAsObjectDataSchema 2 AcDbDs::TreatedAsObjectData 280 1 91 0 0 ACDSSCHEMA 90 3 1 AcDbDs::LegacySchema 2 AcDbDs::Legacy 280 1 91 0 0 ACDSSCHEMA 90 4 1 AcDbDs::IndexedPropertySchema 2 AcDs:Indexable 280 1 91 0 0 ACDSSCHEMA 90 5 1 AcDbDs::HandleAttributeSchema 2 AcDbDs::HandleAttribute 280 7 91 1 284 1 0 ACDSRECORD 90 0 2 AcDbDs::ID 280 10 320 EEFAA 2 Thumbnail_Data 280 15 94 1362 310 89504E470D0A1A0A0000000D49484452000001000000007E0803000000FCF33F5100000300504C5445D7D7D7000000C8C8C80000000000000000000000000000000000000000000000000000330000660000990000CC0000FF0033000033330033660033990033CC0033FF0066000066330066660066990066CC0066FF0099 310 000099330099660099990099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF0000FF3300FF6600FF9900FFCC00FFFF3300003300333300663300993300CC3300FF3333003333333333663333993333CC3333FF3366003366333366663366993366CC3366FF3399003399333399663399993399CC3399FF33CC00 310 33CC3333CC6633CC9933CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF6600006600336600666600996600CC6600FF6633006633336633666633996633CC6633FF6666006666336666666666996666CC6666FF6699006699336699666699996699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066 310 FF3366FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF9933009933339933669933999933CC9933FF9966009966339966669966999966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC3399CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFFCC0000CC00 310 33CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFFCCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0000FF0033FF0066FF0099FF00CCFF00FFFF3300FF3333 310 FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33FFCC66FFCC99FFCCCCFFCCFFFFFF00FFFF33FFFF66FFFF99FFFFCCFFFFFF0000000D0D0D1A1A1A2828283535354343435050505D5D5D6B6B6B787878868686939393A1A1A1AEAEAEBB 310 BBBBC9C9C9D6D6D6E4E4E4F1F1F1FFFFFF000000000000000000000000000000000000000000000000000000000000BF72962F0000020D4944415478DAED9A516EC3200C40B9FFA17C189F644A43884D690651FA61F7BD4EDB146593FC620C989402000000000000000000000000000000BF898E78E43F8B480C0165FF9CDF 310 1E11209252C074926CD16F9F5402F6B0B5FDB88CBF6CF1A712D0C2D6A6E232FE6C025AD835EE970ABD78FEAF1CC823C05C55F7A79FEA5F32016AC3D6D1652BA0D40A9047809E79BFDF7058181990A302E611A0AEEAE939127460404E01259100F3B07578D5E6FFA1208B801AE4A808BE1BD8670009B3109C12A0AEF8A9AF86 310 FE6EA92950120D8173F6D7B6163E2F740644EA2E204AFCB302D4FFAAA620DADB653750B20A308FDD0C07EDA6805009F0BF001FBFFA0CE852A0E67FA00A705FC0680C484BFE38F12F09D0CE412740C47D2511A05DB4473F602820DC14302360863EFE1227FE0733E0A8002550FE3F5A03DA14102A011E9C05C42C83D209E857 310 8245DFD701C71650249700BF14D68F4BE13DF9C3F441EE6E86CE6668970C72EC0383C53F23C08F7A9BFD261924640158EB070C1B22A602446A83DCE808E97547A876C1C3C53FDD13D4A6C08C04D31495A0F1AFB6C57DE5334723126A07B42AC03404DDE1B039248938FC1704B8A3A1D1C51235FE85C3D14157584B7CE68FC7 310 DF56C519C25F794142D5BF219223FEA55764D41E8E26897FFD25A93CA1DF14900D0420000108F87101DF7A591A0000000000000000000000000000000000000000000000E0EBFC0108C3EC605957B5C70000000049454E44AE426082 0 ACDSRECORD 90 1 2 AcDbDs::ID 280 10 320 EEFB6 2 ASM_Data 280 15 94 689 310 414349532042696E61727946696C652855000000000000020000000C00000007104175746F6465736B204175746F434144071341534D203232312E302E302E31383731204E54071853756E204D61722030342031353A31303A32302032303138066666666666663940068DEDB5A0F7C6B03E06BBBDD7D9DF7CDB3D0D096173 310 6D6865616465720CFFFFFFFF04FFFFFFFF070C3232312E302E302E31383731110D04626F64790CFFFFFFFF04FFFFFFFF0CFFFFFFFF0C020000000CFFFFFFFF0C03000000110D046C756D700CFFFFFFFF04FFFFFFFF0CFFFFFFFF0CFFFFFFFF0C040000000C01000000110D097472616E73666F726D0CFFFFFFFF04FFFFFFFF 310 14000000000000F03F00000000000000000000000000000000140000000000000000000000000000F03F00000000000000001400000000000000000000000000000000000000000000F03F140000000000001040000000000000F03F000000000000000006000000000000F03F0B0B0B110D057368656C6C0CFFFFFFFF04FF 310 FFFFFF0CFFFFFFFF0CFFFFFFFF0CFFFFFFFF0C050000000CFFFFFFFF0C02000000110D04666163650C0600000004FFFFFFFF0CFFFFFFFF0CFFFFFFFF0CFFFFFFFF0C040000000CFFFFFFFF0C070000000B0B110E09706572737562656E740E1061636164536F6C6964486973746F72790D066174747269620CFFFFFFFF04FF 310 FFFFFF0CFFFFFFFF0CFFFFFFFF0C050000000401000000040200000004010000000400000000110E067370686572650D07737572666163650CFFFFFFFF04FFFFFFFF0CFFFFFFFF1300000000000000000000000000000000000000000000000006CD3B7F669EA0E63F14000000000000F03F00000000000000000000000000 310 0000001400000000000000000000000000000000000000000000F03F0B0B0B0B0B110E03456E640E026F660E0341534D0D0464617461 0 ACDSRECORD 90 1 2 AcDbDs::ID 280 10 320 EEFE3 2 ASM_Data 280 15 94 689 310 414349532042696E61727946696C652855000000000000020000000C00000007104175746F6465736B204175746F434144071341534D203232312E302E302E31383731204E54071853756E204D61722030342031353A31303A32302032303138066666666666663940068DEDB5A0F7C6B03E06BBBDD7D9DF7CDB3D0D096173 310 6D6865616465720CFFFFFFFF04FFFFFFFF070C3232312E302E302E31383731110D04626F64790CFFFFFFFF04FFFFFFFF0CFFFFFFFF0C020000000CFFFFFFFF0C03000000110D046C756D700CFFFFFFFF04FFFFFFFF0CFFFFFFFF0CFFFFFFFF0C040000000C01000000110D097472616E73666F726D0CFFFFFFFF04FFFFFFFF 310 14000000000000F03F00000000000000000000000000000000140000000000000000000000000000F03F00000000000000001400000000000000000000000000000000000000000000F03F1400000000000000000000000000000000000000000000000006000000000000F03F0B0B0B110D057368656C6C0CFFFFFFFF04FF 310 FFFFFF0CFFFFFFFF0CFFFFFFFF0CFFFFFFFF0C050000000CFFFFFFFF0C02000000110D04666163650C0600000004FFFFFFFF0CFFFFFFFF0CFFFFFFFF0CFFFFFFFF0C040000000CFFFFFFFF0C070000000B0B110E09706572737562656E740E1061636164536F6C6964486973746F72790D066174747269620CFFFFFFFF04FF 310 FFFFFF0CFFFFFFFF0CFFFFFFFF0C050000000401000000040400000004010000000400000000110E067370686572650D07737572666163650CFFFFFFFF04FFFFFFFF0CFFFFFFFF1300000000000000000000000000000000000000000000000006000000000000004014000000000000F03F00000000000000000000000000 310 0000001400000000000000000000000000000000000000000000F03F0B0B0B0B0B110E03456E640E026F660E0341534D0D0464617461 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/atom_rfc_sample.xml0000644003401500001440000000307213614005350021204 0ustar rouaultusers dive into mark A <em>lot</em> of effort went into making this effortless 2005-07-31T12:29:29Z tag:example.org,2003:3 Copyright (c) 2003, Mark Pilgrim Example Toolkit Atom draft-07 snapshot tag:example.org,2003:3.2397 2005-07-31T12:29:29Z 2003-12-13T08:29:29-04:00 Mark Pilgrim http://example.org/ f8dy@example.com Sam Ruby Joe Gregorio

[Update: The Atom draft is finished.]

gdalautotest-3.0.4/ogr/data/CoHI_GCS12.prj0000644003401500001440000000024713614004466017475 0ustar rouaultusersGEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]gdalautotest-3.0.4/ogr/data/polygonm_with_m.shx0000644003401500001440000000016413614004466021274 0ustar rouaultusers' :??$@T@2Pgdalautotest-3.0.4/ogr/data/rnf_eg.gml0000644003401500001440000000244613614004466017303 0ustar rouaultusers -64.41076248151016,45.949157446373746 -61.975049577832905,47.056845876958114817792HITrans-Canada - RTE 1HWY20527206112051820658-63.500411040289066,46.24012250777137 -63.50100971490974,46.240344881690326 -63.50217046237347,46.24104185563962 -63.505862621395394,46.24195250605576 -63.50671918453118,46.242002742901576 -63.50719727260221,46.241931577811606 -63.508403092799554,46.24175228346016 -63.50994657345562,46.24174539797723 gdalautotest-3.0.4/ogr/data/test.xlsx0000644003401500001440000003331213614004466017235 0ustar rouaultusersPK7@ _rels/.relsJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTuާ/mFWMȦRfr_a*Q7r&Y&-'XpA:\-Cc/O:tqZnt l K!J{alG#)+9*Ճj`4*l-\'!ɍW#նmҦ}2jLUP\:b-/`И^pzMBGqLܬĪ=9‡Yws]ʦ%#"$I| 1NԾ4CHNa9ӑavAxdi &oTEM_[œ:-_9jr_ mgo'7/[?@#ky|=Te+oM'PK(jPK7@xl/_rels/workbook.xml.relsձn =Oa^c;TYJY>+6 mj:R:DL&}LcJR \)*5G+mFZ 9H'fSQN95=ьXȲy4Wɡ`m?٪{Jw2(|Svߕ9Y%ZfS0ȘeY0ed:DƔ!L a1Ug5۠澿`gfQ|PKrU PK7@xl/drawings/drawing1.xmlM @ F=d_vQ=@p8Iu_ R/?guk8d}n Fds`M m^Vʧv%'yX6)9xt _^~0=q\%B3Ԯ[t?ztBQl6PKا+PK7@#xl/worksheets/_rels/sheet7.xml.rels 0E~EIBDv#BR? $4XAI%+:= ckItej `C!28 2sb , I5T3}l=BZh XhɅAYh 6mbM. Z&_4~>/NwB #7B nnAma_^CwaNn7ٞJxi.${&|TN;*5['"r`anx6~썆 CRsCj&ڱ^#l+gLLS{ QB*]LTʩ$I +jE}7qaBT #V#5GԒ0$yC契x|PckSLuM`KKM}šz5iAD.Mewk׊Ti}1o {=Uj "vk&^ ۫PKi ^PK7@xl/worksheets/sheet4.xmlUM6W<v#I%oFIhqdK*IdI٤@r͛7t{Wd|1sRC?߯_a@woɺ_xB6I|QA-6`SZW[wH|@xr>Jj "u'-KU-L8" |_<JpDإ׈ |n?-$OrJ%YauɌ_]p&:%Wdxp-pԡ|wPs>+{Zcu#ݾS67mh={mO:!4,؆@,8;bA7D줌E{k~edm+F:S J߉GF9.#a5t 9bE;]cϰS7LO0VXyyKEAsH͉*-fWW7uYoEy[?i忀g\NwpaؖbA ,ъi,E ~әd &PI@mCvRskAGmVmfd^7!"Wd܀x#Ӻ(&|h  qmqbg^q ENIǩixV};]Uhlր;ǣITn_^_^:|]{,;f'⮏꒾!mVMr7Z5%` p>zψ@PӡM] `^QɍXBRW*}?֧k9APH$~_߫URx/!/4[HAPC\2hx%(hPKuL{r PK7@xl/worksheets/sheet3.xmlUM6 Whxȭʇ[7ĞzFYdI/@ɖigzM$@￷*9e9K@WFH/ׇկYׂ+`OhܣoB/X}j~f,hƵh4"O?DM:9JT>&_ZpNkF8& d#G3w{U02{_(j$mǣAŎ8;udnMvEW%efZH$>>1o`BgiQ*sX_?#煑Be.>Gq˸KP 7 y 𴵇 *̧ӛ wErx ZxJU8KC =O( v!;_O%ٝdi]R(Y(~'?h&UI(DVۗ đUB>B!#WiM 6Z|Qpl4^mRQO#L;4dc͈V5GGJhf]IEOBtϜ?gNXrt2!q7|̻# }ܑ~RC!jFjfZnDE!J|ckZ*VKᅳ2/җdMn6nc‹,xpy5{59L8SX6ws0Rhk PD*Fwe:0)EDo<jN&Y- ްe ES#~ |>KVJG߬ĶK`̉-!޹v}8ϲ.y> +*C)S]Ya_eO9PF^s}y q_qFI7@gsDcYa/.9o{G5h("ȾX:ZiF䚳2VFLK 4?My^B#{%oģm݄K`krNq?#9C/q #(*%% /|xGEA{HM+MNNϏӳT^(2qFY,r |o_zP{*Փ5Q qިׁ7 뤼N8q76F[fd5\--a~6ZFT׊ִegVh'JC$q|o ՙvS@q0ʩЅD+Zg}BER>̓6%G~sdz&˞^1"n_[^w8H^'TelzRO3+ev{9?]i_P,W^eNPKgPK7@xl/worksheets/sheet2.xmlUM6Wp-2r )~= $9Ci'ƂFOe\n.Rtz6\jֽpd lС{āZZϊ,FX*`®>wFx4k4i"#+*gw۷s:%G4ʸ"gח,PV? ,XƐPc[wF 5m2ڠжynF}d;gNPP`XB(M1ib] 03&Qly)scM2:cV?6rMzga߇:ǏWj($;^cͰR7LqGTR2lW<¥$u))"Bz~q5}9\_]^d%\`el3;^0",G01?Zi>Z<)c_\d1G`s`g{IV6jiIlJJK, J:HYf Iwqo17VD& ;[2vr1 Bam ~ S]k-ndrB~w2c?f!X"~e`#:Y:Fӟa PKGPPK7@xl/worksheets/sheet5.xmlUM8 0tqA.0mfXt,,z%9̯/)';{H"5&ك\dHŗD⃴J0OŻ!EB&M}YC#[52R:*^jL:NFj+oUKòk>#n(aJ#*]I|—6prE/ҔYITsq{[I_j./E :l:ӻCN_aIuF|^[l\umlإFó! 9Y-1ɞ ˔UxX; t-*xۿE|r3b)!:x){ievCnʭtI?{p cV6eC9xM=N3#[?JPa#1-5W7e^TɖMgWחYvs}ys9b;d;<"]2jV {ل{ALEb K^`tb_\҇0AN۰j%5)AA/-4M'3 ͂ܨZza.vH~n)1ܼ:̰^[@DupBROσߵ֪00OZ`ïg[adjrr4v>?u͖dMN;u2&2Q:V.8+{+5ǎF?Ѭu/1kͽw׿LO=_tUQlR4_wٴo6O;0$.љc$=PK*}9PK7@xl/worksheets/sheet8.xmlVMs6WpxȭDrP8TdƉ4Kc`P R$-3=5۷]'~28BE8TPE׷a`SI`> ?,I<xp"P2;(ڔ#[`;2yT2_y.2X.A9o QpB:0_4G9PW=l}= NhD2#+|NnV3 8wig0Zߍ)35CCN![&XKf_^('ok'Q}*wZ*;c-H.!JAJJ3 "Tĺ P\7F;tMQ~)sgm$2:_eR=s܍zz\ W1?fw[tkj~fUv@E!8>Ò ~ z(1]hOwz>>9L>.o3'^7`#|i{8 Hy8,qbk󱳉ZIH^8M:S|s/$iJτ?O/UKtzq:D6?C I fErM;i7х(FHQيgDf@j wZPmuk/!B&<yR_u5v_&f.߰z$dޚn]L!f˅#FNc ) _{WDϾ9p ɵydz5c<γ=< N|d r5xMzMfwuX5/U-jci- #@Eψ y."5BFUYB(MRiHJ,X_݀=ZjD]L*L@xQyplN2[0CЄ3DEtӢؕJXT_% -"%T#Щ#崡ۘҡ4p7⌒ ƥ)!z>s-Ķ Sezu /E`yUD=̰P sBk*2 žFOdZ-KP$Q} x)Z8*AG;swebzTYlmbbYbۛTf`{3{3{3{3{3k~.TnrS)ČݾG>޲VE:^LXe5,;\ K<)Kja՘8 [}c+$ +rd@eFa3B%aqGY wa}؆Wp.{g|^/s=%*VP 3RzTuLE(Tjl,TWBs*/?jp/PKjF'PK7@xl/workbook.xmlKs05c L'Osc49 Bb$n`(d՟FxGІ+pdz~Ng, %!'`Pj!/MNjkەjAbRMM2SFQ$~C$g*^* H{ M[C6 x<ѶNljn1;'pZ~8xZ RH(Xɼ;ӣpZ7[qm}}UURq_j%DN>\Z35G?BNO\2Tf{yzgw&~[8p! B-CR,B`[z1oYiGM~ >c'p'r_:rOG >3&|T%1ֽM&w[Шvo8ZCM1,oyxij {PKR.PK7@xl/sharedStrings.xml׽N0񝧰#ܾtN_ Q1Xg6 &!ӓu d%F)mG!7 5!݆p5cO7L`{];q)ޗ<w;;ĎvqkPKt+h PK7@f; _rels/.relsPK7@@*eOEdocProps/core.xmlPK7@(jdocProps/app.xmlPK7@rU xl/_rels/workbook.xml.relsPK7@ا+xl/drawings/drawing1.xmlPK7@1#xl/worksheets/_rels/sheet7.xml.relsPK7@i ^xl/worksheets/sheet1.xmlPK7@]; xl/worksheets/sheet4.xmlPK7@uL{r xl/worksheets/sheet7.xmlPK7@R8xl/worksheets/sheet3.xmlPK7@;4FPOxl/worksheets/sheet6.xmlPK7@gxl/worksheets/sheet9.xmlPK7@GPxl/worksheets/sheet2.xmlPK7@*}9!xl/worksheets/sheet5.xmlPK7@Mz %xl/worksheets/sheet8.xmlPK7@jF' )xl/styles.xmlPK7@R.,xl/workbook.xmlPK7@ /.xl/sharedStrings.xmlPK7@t+h 0[Content_Types].xmlPK1gdalautotest-3.0.4/ogr/data/leader-mleader.dxf0000644003401500001440000005212613614004466020710 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $DIMASZ 40 0.1234 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 EEEF1 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 -3 390 4CF 347 4E1 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 Arial 4 0 STYLE 5 261 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Legend 70 0 40 0.0 41 0.4 50 0.0 71 0 42 2.5 3 calibrii.ttf 4 1001 ACAD 1000 Calibri 1071 16777250 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 DIMSTYLE 105 EEF66 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 ISO-25 70 0 41 2.5 42 1.234 43 3.75 44 1.25 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 BLOCK_RECORD 5 DD7A2 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 _None 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 DD7D5 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 _BoxFilled 340 0 70 0 280 1 281 0 0 BLOCK_RECORD 5 270 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 myblock 340 0 70 4 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 DD7A3 330 DD7A2 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 _None 70 0 10 0.0 20 0.0 30 0.0 3 _None 1 0 ENDBLK 5 DD7A4 330 DD7A2 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 DD7D8 330 DD7D5 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 _BoxFilled 70 0 10 0.0 20 0.0 30 0.0 3 _BoxFilled 1 0 SOLID 5 DD7D6 330 DD7D5 100 AcDbEntity 8 0 6 ByBlock 62 0 100 AcDbTrace 10 -0.5 20 0.5 30 0.0 11 0.5 21 0.5 31 0.0 12 -0.5 22 -0.5 32 0.0 13 0.5 23 -0.5 33 0.0 0 LINE 5 DD7D7 330 DD7D5 100 AcDbEntity 8 0 6 ByBlock 62 0 370 -2 100 AcDbLine 10 -0.5 20 0.0 30 0.0 11 -1.0 21 0.0 31 0.0 0 ENDBLK 5 DD7D9 330 DD7D5 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 271 330 270 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 myblock 70 2 10 0.0 20 0.0 30 0.0 3 myblock 1 0 HATCH 5 ED5 330 270 100 AcDbEntity 8 0 440 16777216 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 _SOLID 70 1 71 0 91 5 92 7 72 0 73 1 93 4 10 2.0 20 2.0 10 0.0 20 2.0 10 0.0 20 0.0 10 2.0 20 0.0 97 0 92 22 72 0 73 1 93 4 10 1.199999999999999 20 0.8 10 1.6 20 0.8 10 1.6 20 0.4 10 1.199999999999999 20 0.4 97 0 92 22 72 0 73 1 93 4 10 1.199999999999999 20 1.199999999999999 10 1.199999999999999 20 1.6 10 1.6 20 1.6 10 1.6 20 1.199999999999999 97 0 92 22 72 0 73 1 93 4 10 0.8 20 0.8 10 0.8 20 0.4000000000000002 10 0.4 20 0.4 10 0.4000000000000002 20 0.8 97 0 92 22 72 0 73 1 93 4 10 0.8 20 1.199999999999999 10 0.3999999999999999 20 1.199999999999999 10 0.4 20 1.6 10 0.8 20 1.6 97 0 75 1 76 1 47 0.004292710654411 98 5 10 1.199999999999999 20 1.0 10 1.199999999999999 20 1.0 10 1.199999999999999 20 1.0 10 1.199999999999999 20 1.0 10 1.199999999999999 20 1.0 450 0 451 0 460 0.0 461 0.0 452 0 462 0.0 453 2 463 0.0 63 5 421 255 463 1.0 63 2 421 16776960 470 LINEAR 0 ATTDEF 5 ED6 330 270 100 AcDbEntity 8 0 62 0 440 16777216 100 AcDbText 10 1.0 20 2.1 30 0.0 40 0.5 1 72 1 11 1.0 21 2.1 31 0.0 100 AcDbAttributeDefinition 280 0 3 2 SITSABOVE 70 4 280 0 0 ENDBLK 5 272 330 270 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LEADER 5 13C6 330 EEEEE 100 AcDbEntity 8 0 100 AcDbLeader 3 ISO-25 73 0 75 1 40 2.585266030013642 41 22.97407912687585 76 4 10 30.0 20 40.0 30 0.0 10 10.0 20 40.0 30 0.0 10 19.3125 20 34.6875 30 0.0 10 10.3125 20 34.6875 30 0.0 340 13C7 1001 ACAD 1000 DSTYLE 1002 { 1070 77 1070 2 1070 371 1070 -2 1070 40 1040 1.5 1070 341 1005 0 1070 41 1040 6.0 1002 } 0 MTEXT 5 13C7 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMText 10 9.374999999999998 20 35.625 30 0.0 40 2.5 41 0.0 46 0.0 71 9 72 1 1 Classic Leader 73 1 44 1.0 0 LEADER 5 15CE 330 EEEEE 100 AcDbEntity 8 0 62 1 100 AcDbLeader 3 Standard 73 0 74 0 75 1 40 2.540927694406548 41 11.09481582537517 76 4 10 -21.12164573199204 20 38.03557987350803 30 30.0 10 -12.21523579263751 20 44.79397184143699 30 30.0 10 -13.72561660097652 20 49.07485601862719 30 30.0 10 -13.90252932627231 20 49.04166132585237 30 30.0 340 15CF 211 -0.9828484738655214 221 -0.1844149598601359 231 0.0 213 0.1368159331449448 223 -0.4973012744972821 233 0.0 0 LEADER 5 22AD 330 EEEEE 100 AcDbEntity 8 0 100 AcDbLeader 3 ISO-25 73 0 74 0 40 44.20190995907229 41 120.6575716234652 76 6 10 30.0 20 80.0 30 0.0 10 10.0 20 65.0 30 0.0 10 25.0 20 55.0 30 0.0 10 25.0 20 50.0 30 0.0 10 40.0 20 65.0 30 0.0 10 48.0 20 65.0 30 0.0 340 22AF 1001 ACAD 1000 DSTYLE 1002 { 1070 176 1070 3 1070 41 1040 4.0 1070 341 1005 DD7D5 1070 77 1070 1 1002 } 0 MTEXT 5 22AF 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMText 10 48.625 20 65.625 30 0.0 40 4.0 41 122.2726251124662 46 0.0 71 7 72 1 3 I want to put a really long text in my leader. \PLike, so long that I don't know how I am going\Pto cope when I keep typing this much information into the box. A real test of the character limit. \PEven more characters in the box. Even more character 1 s in the box. More and more and more and more and more and more and more 73 1 44 1.0 0 MULTILEADER 5 797 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 48.0 20 20.0 30 0.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 0 290 1 304 Basic Multileader 11 0.0 21 0.0 31 1.0 340 11 12 50.0 22 22.03274215552524 32 0.0 13 1.0 23 0.0 33 0.0 42 0.0 43 0.0 44 0.0 45 1.0 170 1 90 -1073741824 171 1 172 5 91 -1073741824 141 0.0 92 0 291 0 292 0 173 0 293 0 142 0.0 143 0.0 294 0 295 0 296 0 110 25.0 120 5.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 40.0 20 20.0 30 0.0 11 1.0 21 0.0 31 0.0 90 0 40 8.0 304 LEADER_LINE{ 10 30.0 20 35.0 30 0.0 10 10.0 20 20.0 30 0.0 10 25.0 20 10.0 30 0.0 10 25.0 20 5.0 30 0.0 91 0 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 279808 170 1 91 -1056964608 341 14 171 -2 290 1 291 1 41 8.0 342 DD7D5 42 4.0 172 2 343 11 173 1 95 1 174 1 175 0 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 LEADER 5 EF0A0 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbLeader 3 STANDARD 76 3 10 100.0 20 25.0 30 0.0 10 105.0 20 21.0 30 0.0 10 110.0 20 21.0 30 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 341 1005 DD7A2 1002 } 0 LEADER 5 EF0FB 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbLeader 3 STANDARD 76 3 10 100.0 20 16.0 30 0.0 10 105.0 20 16.0 30 0.0 10 110.0 20 16.0 30 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 41 1040 2.5001 1002 } 0 LEADER 5 EF10B 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbLeader 3 STANDARD 71 0 76 3 10 100.0 20 10.0 30 0.0 10 105.0 20 6.0 30 0.0 10 110.0 20 6.0 30 0.0 0 MULTILEADER 5 798 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 48.0 20 35.0 30 0.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 0 290 1 304 arrowemptyblock 11 0.0 21 0.0 31 1.0 340 11 12 50.0 22 37.03274215552524 32 0.0 13 1.0 23 0.0 33 0.0 42 0.0 43 0.0 44 0.0 45 1.0 170 1 90 -1073741824 171 1 172 5 91 -1073741824 141 0.0 92 0 291 0 292 0 173 0 293 0 142 0.0 143 0.0 294 0 295 0 296 0 110 25.0 120 20.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 40.0 20 35.0 30 0.0 11 1.0 21 0.0 31 0.0 90 0 40 8.0 304 LEADER_LINE{ 10 25.0 20 20.0 30 0.0 91 0 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 279808 170 1 91 -1056964608 341 14 171 -2 290 1 291 1 41 8.0 342 DD7A2 42 4.0 172 2 343 11 173 1 95 1 174 1 175 0 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 1E9B 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 79.04365620736697 20 42.2087312414734 30 0.0 41 4.0 140 12.0 145 2.0 174 0 175 7 176 2 177 0 290 1 304 arrowtoolarge 11 0.0 21 0.0 31 1.0 340 11 12 114.7762619372442 22 42.2087312414734 32 0.0 13 1.0 23 0.0 33 0.0 42 0.0 43 0.0 44 0.0 45 1.0 170 1 90 -1073741824 171 3 172 5 91 -1073741824 141 0.0 92 0 291 0 292 0 173 0 293 0 142 0.0 143 0.0 294 0 295 0 296 0 110 70.0 120 20.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 124.7762619372442 20 37.03274215552524 30 0.0 11 -1.0 21 0.0 31 0.0 90 1 40 8.0 304 LEADER_LINE{ 10 145.0 20 45.0 30 0.0 91 0 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 33838848 170 1 91 -1056964608 341 14 171 -2 290 1 291 1 41 8.0 42 12.0 172 2 343 11 173 0 95 7 174 1 175 0 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 3 45 1.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 26C 330 1F 100 AcDbEntity 8 0 62 5 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 38.0 20 -20.0 30 90.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 0 290 1 304 ????????? 11 0.0 21 0.0 31 1.0 340 261 12 40.0 22 -17.98461538461539 32 90.0 13 1.0 23 0.0 33 0.0 42 0.0 43 0.0 44 0.0 45 1.0 170 1 90 -1023410171 171 1 172 5 91 -1073741824 141 0.0 92 0 291 0 292 0 173 0 293 0 142 0.0 143 0.0 294 0 295 0 296 0 110 5.0 120 -5.0 130 90.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 18.2 20 -20.0 30 90.0 11 1.0 21 0.0 31 0.0 90 0 40 19.8 304 LEADER_LINE{ 10 5.0 20 -5.0 30 90.0 91 0 305 } 304 LEADER_LINE{ 10 20.0 20 -10.0 30 90.0 91 1 305 } 271 0 303 } 302 LEADER{ 290 1 291 1 10 60.22276923076923 20 -20.0 30 90.0 11 -1.0 21 0.0 31 0.0 90 1 40 8.0 304 LEADER_LINE{ 10 54.82049211375453 20 -22.58007536573268 30 90.0 91 2 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 67390592 170 1 91 -1056964608 341 14 171 -2 290 1 291 1 41 8.0 42 4.0 172 2 343 261 173 1 95 1 174 1 175 0 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 2D8 330 EEEEE 100 AcDbEntity 8 0 62 1 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 -43.99999999999999 20 -18.99999999999999 30 0.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 1 290 0 296 1 341 270 14 0.0 24 0.0 34 1.0 15 -44.0 25 -19.0 35 0.0 16 1.999999999999998 26 1.999999999999998 36 1.999999999999998 46 0.174532925199433 93 -1023410175 47 1.969615506024414 47 -0.3472963553338605 47 0.0 47 -44.0 47 0.3472963553338605 47 1.969615506024414 47 0.0 47 -19.0 47 0.0 47 0.0 47 1.999999999999998 47 0.0 47 0.0 47 0.0 47 0.0 47 1.0 110 -44.81115957534527 120 -20.15845593067914 130 0.0 111 0.9848077530122079 121 0.1736481776669303 131 0.0 112 -0.1736481776669303 122 0.9848077530122079 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 -36.12153797590233 20 -17.61081457866455 30 0.0 11 -0.9848077530122081 21 -0.1736481776669303 31 0.0 90 0 40 7.999999999999998 304 LEADER_LINE{ 10 -41.8919467995818 20 -22.89308511391757 30 0.0 91 0 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 15205378 170 1 91 -1023410170 341 14 171 -2 290 1 291 1 41 8.0 42 4.0 172 1 343 11 173 1 95 1 174 1 175 0 92 -1056964608 292 0 344 270 93 -1056964608 10 2.0 20 2.0 30 2.0 43 0.0 176 1 293 0 330 ED6 177 1 44 0.0 302 Apples%%p 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 EEB 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 -3.984232524562343 20 -23.11052376011906 30 0.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 0 290 0 296 1 341 270 14 0.0 24 0.0 34 1.0 15 -4.984232524562338 25 -24.11052376011906 35 0.0 16 1.0 26 1.0 36 1.0 46 0.0 93 -1073741824 47 1.0 47 0.0 47 0.0 47 -4.984232524562338 47 0.0 47 1.0 47 0.0 47 -24.11052376011906 47 0.0 47 0.0 47 1.0 47 0.0 47 0.0 47 0.0 47 0.0 47 1.0 110 -8.98423252456234 120 -22.11052376011907 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 4.015767475437656 20 -23.11052376011906 30 0.0 11 -1.0 21 0.0 31 0.0 90 0 40 8.0 304 LEADER_LINE{ 10 -1.669648952481109 20 -10.58676396047542 30 0.0 91 0 305 } 271 0 303 } 302 LEADER{ 290 1 291 1 10 -11.98423252456233 20 -23.11052376011906 30 0.0 11 1.0 21 0.0 31 0.0 90 1 40 8.0 304 LEADER_LINE{ 10 -30.0 20 -20.0 30 0.0 91 1 305 } 271 0 303 } 272 9 273 9 301 } 340 12E 90 6816832 170 1 91 -1056964608 341 14 171 -2 290 1 291 0 41 8.0 42 4.0 172 1 343 11 173 1 95 1 174 1 175 0 92 -1056964608 292 0 344 270 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 330 ED6 177 1 44 0.0 302 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 EF0 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 1.0 10 -5.984232524562338 20 -23.11052376011906 30 0.0 41 4.0 140 4.0 145 2.0 174 1 175 1 176 0 177 0 290 0 296 1 341 270 14 0.0 24 0.0 34 1.0 15 -6.98423252456234 25 -24.11052376011906 35 0.0 16 1.0 26 1.0 36 1.0 46 0.0 93 -1073741824 47 1.0 47 0.0 47 0.0 47 -6.98423252456234 47 0.0 47 1.0 47 0.0 47 -24.11052376011906 47 0.0 47 0.0 47 1.0 47 0.0 47 0.0 47 0.0 47 0.0 47 1.0 110 1.015767475437655 120 -22.11052376011907 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 272 9 273 9 301 } 340 12E 90 6816832 170 1 91 -1056964608 341 14 171 -2 290 1 291 0 41 8.0 42 4.0 172 1 343 11 173 1 95 1 174 1 175 0 92 -1056964608 292 0 344 270 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 330 ED6 177 1 44 0.0 302 294 0 178 0 179 1 45 1.0 271 0 272 9 273 9 295 0 0 LEADER 5 595 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 100 AcDbLeader 3 STANDARD 72 1 76 3 10 75.0 20 -5.0 30 0.0 10 83.0 20 -12.0 30 0.0 10 79.0 20 -16.0 30 0.0 213 0.0 223 0.09 233 0.0 1001 ACAD 1000 DSTYLE 1002 { 1070 341 1005 DD7A2 1070 40 1040 15.0 1002 } 0 MULTILEADER 5 592 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 4.0 10 108.0 20 -6.0 30 0.0 41 2.0 140 4.0 145 2.0 174 6 175 1 176 0 177 0 290 1 304 Splines 11 0.0 21 0.0 31 1.0 340 EEEF2 12 110.7043505591004 22 -4.206734036162956 32 0.0 13 0.9488697486943882 23 -0.3156678634461367 33 0.0 42 5.962024883905141 43 6.0 44 4.0 45 1.0 170 1 90 -1073741824 171 1 172 5 91 -1073741824 141 0.0 92 0 291 0 292 0 173 0 293 0 142 0.0 143 0.0 294 0 295 0 296 0 110 96.14491626660448 120 -16.22864587748747 130 0.0 111 0.9488697486943882 121 -0.3156678634461367 131 0.0 112 0.3156678634461367 122 0.9488697486943882 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 100.4090420104449 20 -3.474657092430906 30 0.0 11 0.948869748694388 21 -0.3156678634461367 31 0.0 90 1 40 8.0 304 LEADER_LINE{ 10 96.0 20 -28.0 30 0.0 91 2 305 } 304 LEADER_LINE{ 10 99.0 20 -4.0 30 0.0 10 102.9105572809 20 -4.178885438199983 30 0.0 91 4 305 } 271 0 303 } 272 9 273 9 301 } 340 EF158 90 17127073 170 2 91 -1056964608 341 51A 171 -2 290 1 291 1 41 2.0 42 1.0 172 2 343 EEEF2 173 6 95 1 174 1 175 2 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 1 45 4.0 271 0 272 9 273 9 295 0 0 MULTILEADER 5 1C69 330 EEEEE 100 AcDbEntity 8 0 100 AcDbMLeader 270 2 300 CONTEXT_DATA{ 40 10.0 10 63.6 20 50.0 30 0.0 41 1.799999999999999 140 1.799999999999999 145 0.9 174 1 175 6 176 0 177 0 290 0 296 0 110 60.0 120 50.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 297 0 302 LEADER{ 290 1 291 1 10 60.0 20 50.0 30 0.0 11 1.0 21 0.0 31 0.0 12 60.0 22 50.0 32 0.0 13 60.625 23 50.0 33 0.0 12 61.875 22 50.0 32 0.0 13 63.125 23 50.0 33 0.0 90 0 40 3.599999999999998 304 LEADER_LINE{ 10 50.0 20 40.0 30 0.0 10 54.31089621338014 20 47.55851732694476 30 0.0 90 0 11 51.28779034038786 21 42.25794941921406 31 0.0 12 51.90706967405771 22 43.34376390930407 32 0.0 90 1 11 55.92707343265128 21 48.25210085528842 31 0.0 12 57.07576367530417 22 48.74506203675614 32 0.0 11 59.42565487867355 21 49.75351940926614 31 0.0 12 60.0 22 50.0 32 0.0 91 0 305 } 271 0 303 } 272 9 273 9 301 } 340 67 90 16778240 170 1 91 -1056964608 341 5B 171 -2 290 1 291 1 41 0.36 42 0.18 172 0 343 55 173 1 95 6 174 1 175 0 92 -1056964608 292 0 93 -1056964608 10 1.0 20 1.0 30 1.0 43 0.0 176 0 293 0 294 0 178 0 179 1 45 10.0 271 0 272 9 273 9 295 1 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/samples.kml0000644003401500001440000010763613614004466017522 0ustar rouaultusers KML Samples 1 Unleash your creativity with the help of these examples! Placemarks These are just some of the different kinds of placemarks with which you can mark your favorite places -122.0839597145766 37.42222904525232 0 500.6566641072245 40.5575073395506 -148.4122922628044 Simple placemark Attached to the ground. Intelligently places itself at the height of the underlying terrain. -122.0822035425683,37.42228990140251,0 Floating placemark 0 Floats a defined distance above the ground. -122.0839597145766 37.42222904525232 0 500.6566641072245 40.5575073395506 -148.4122922628044 #downArrowIcon relativeToGround -122.084075,37.4220033612141,50 Extruded placemark 0 Tethered to the ground by a customizable "tail" -122.0845787421525 37.42215078737763 0 365.2646606980322 40.55750733918048 -148.4126684946234 #globeIcon 1 relativeToGround -122.0857667006183,37.42156927867553,50 Styles and Markup 0 With KML it is easy to create rich, descriptive markup to annotate and enrich your placemarks -122.0845787422371 37.42215078726837 0 365.2646826292919 40.55750733930874 -148.4126777488172 #noDrivingDirections Highlighted Icon 0 Place your mouse over the icon to see it display the new icon -122.0856552124024 37.4224281311035 0 265.8520424250024 0 0 normal #normalPlacemark highlight #highlightPlacemark Roll over this icon 0 #exampleStyleMap -122.0856545755255,37.42243077405461,0 Descriptive HTML 0
Placemark descriptions can be enriched by using many standard HTML tags.
For example:
Styles:
Italics, Bold, Underlined, Strike Out, subscriptsubscript, superscriptsuperscript, Big, Small, Typewriter, Emphasized, Strong, Code
Fonts:
red by name, leaf green by hexadecimal RGB
size 1, size 2, size 3, size 4, size 5, size 6, size 7
Times, Verdana, Arial

Links:
Google Earth!
or: Check out our website at www.google.com
Alignment:

left

center

right


Ordered Lists:
  1. First
  2. Second
  3. Third
  1. First
  2. Second
  3. Third
  1. First
  2. Second
  3. Third

Unordered Lists:
  • A
  • B
  • C
  • A
  • B
  • C
  • A
  • B
  • C

Definitions:
Google:
The best thing since sliced bread

Centered:
Time present and time past
Are both perhaps present in time future,
And time future contained in time past.
If all time is eternally present
All time is unredeemable.

Block Quote:
We shall not cease from exploration
And the end of all our exploring
Will be to arrive where we started
And know the place for the first time.
-- T.S. Eliot


Headings:

Header 1

Header 2

Header 3

Header 4

Header 5


Images:
Remote image

Scaled image


Simple Tables:
12345
abcde

[Did you notice that double-clicking on the placemark doesn't cause the viewer to take you anywhere? This is because it is possible to directly author a "placeless placemark". If you look at the code for this example, you will see that it has neither a point coordinate nor a LookAt element.]]]>
Ground Overlays 0 Examples of ground overlays Large-scale overlay on terrain 0 Overlay shows Mount Etna erupting on July 13th, 2001. 15.02468937557116 37.67395167941667 0 30350.36838438907 58.31228652890705 -16.5581842842829 http://code.google.com/apis/kml/documentation/etna.jpg 37.91904192681665 37.46543388598137 15.35832653742206 14.60128369746704 -0.1556640799496235 Screen Overlays 0 Screen overlays have to be authored directly in KML. These examples illustrate absolute and dynamic positioning in screen space. Simple crosshairs 0 This screen overlay uses fractional positioning to put the image in the exact center of the screen http://code.google.com/apis/kml/documentation/crosshairs.png Absolute Positioning: Top left 0 http://code.google.com/apis/kml/documentation/top_left.jpg Absolute Positioning: Top right 0 http://code.google.com/apis/kml/documentation/top_right.jpg Absolute Positioning: Bottom left 0 http://code.google.com/apis/kml/documentation/bottom_left.jpg Absolute Positioning: Bottom right 0 http://code.google.com/apis/kml/documentation/bottom_right.jpg Dynamic Positioning: Top of screen 0 http://code.google.com/apis/kml/documentation/dynamic_screenoverlay.jpg Dynamic Positioning: Right of screen 0 http://code.google.com/apis/kml/documentation/dynamic_right.jpg Paths 0 Examples of paths. Note that the tessellate tag is by default set to 0. If you want to create tessellated lines, they must be authored (or edited) directly in KML. Tessellated 0 tag has a value of 1, the line will contour to the underlying terrain]]> -112.0822680013139 36.09825589333556 0 2889.145007690472 62.04855796276328 103.8120432044965 1 -112.0814237830345,36.10677870477137,0 -112.0870267752693,36.0905099328766,0 Untessellated 0 tag has a value of 0, the line follow a simple straight-line path from point to point]]> -112.0822680013139 36.09825589333556 0 2889.145007690472 62.04855796276328 103.8120432044965 0 -112.080622229595,36.10673460007995,0 -112.085242575315,36.09049598612422,0 Absolute 0 Transparent purple line -112.2719329043177 36.08890633450894 0 2569.386744398339 44.60763714063257 -106.8161545998597 #transPurpleLineGreenPoly 1 absolute -112.265654928602,36.09447672602546,2357 -112.2660384528238,36.09342608838671,2357 -112.2668139013453,36.09251058776881,2357 -112.2677826834445,36.09189827357996,2357 -112.2688557510952,36.0913137941187,2357 -112.2694810717219,36.0903677207521,2357 -112.2695268555611,36.08932171487285,2357 -112.2690144567276,36.08850916060472,2357 -112.2681528815339,36.08753813597956,2357 -112.2670588176031,36.08682685262568,2357 -112.2657374587321,36.08646312301303,2357 Absolute Extruded 0 Transparent green wall with yellow outlines -112.2643334742529 36.08563154742419 0 4451.842204068102 44.61038665812578 -125.7518698668815 #yellowLineGreenPoly 1 1 absolute -112.2550785337791,36.07954952145647,2357 -112.2549277039738,36.08117083492122,2357 -112.2552505069063,36.08260761307279,2357 -112.2564540158376,36.08395660588506,2357 -112.2580238976449,36.08511401044813,2357 -112.2595218489022,36.08584355239394,2357 -112.2608216347552,36.08612634548589,2357 -112.262073428656,36.08626019085147,2357 -112.2633204928495,36.08621519860091,2357 -112.2644963846444,36.08627897945274,2357 -112.2656969554589,36.08649599090644,2357 Relative 0 Black line (10 pixels wide), height tracks terrain -112.2580438551384 36.1072674824385 0 2927.61105910266 44.61324882043339 4.947421249553717 #thickBlackLine 1 relativeToGround -112.2532845153347,36.09886943729116,645 -112.2540466121145,36.09919570465255,645 -112.254734666947,36.09984998366178,645 -112.255493345654,36.10051310621746,645 -112.2563157098468,36.10108441943419,645 -112.2568033076439,36.10159722088088,645 -112.257494011321,36.10204323542867,645 -112.2584106072308,36.10229131995655,645 -112.2596588987972,36.10240001286358,645 -112.2610581199487,36.10213176873407,645 -112.2626285262793,36.10157011437219,645 Relative Extruded 0 Opaque blue walls with red outline, height tracks terrain -112.2683594333433 36.09884362144909 0 2184.193522571467 44.60855445139561 -72.24271551768405 #redLineBluePoly 1 1 relativeToGround -112.2656634181359,36.09445214722695,630 -112.2652238941097,36.09520916122063,630 -112.2645079986395,36.09580763864907,630 -112.2638827428817,36.09628572284063,630 -112.2635746835406,36.09679275951239,630 -112.2635711822407,36.09740038871899,630 -112.2640296531825,36.09804913435539,630 -112.264327720538,36.09880337400301,630 -112.2642436562271,36.09963644790288,630 -112.2639148687042,36.10055381117246,630 -112.2626894973474,36.10149062823369,630 Polygons 0 Examples of polygon shapes Google Campus 0 A collection showing how easy it is to create 3-dimensional buildings -122.084120030116 37.42174011925477 0 276.7870053764046 53.454348562403 -34.82469740081282 Building 40 0 #transRedPoly 1 relativeToGround -122.0848938459612,37.42257124044786,17 -122.0849580979198,37.42211922626856,17 -122.0847469573047,37.42207183952619,17 -122.0845725380962,37.42209006729676,17 -122.0845954886723,37.42215932700895,17 -122.0838521118269,37.42227278564371,17 -122.083792243335,37.42203539112084,17 -122.0835076656616,37.42209006957106,17 -122.0834709464152,37.42200987395161,17 -122.0831221085748,37.4221046494946,17 -122.0829247374572,37.42226503990386,17 -122.0829339169385,37.42231242843094,17 -122.0833837359737,37.42225046087618,17 -122.0833607854248,37.42234159228745,17 -122.0834204551642,37.42237075460644,17 -122.083659133885,37.42251292011001,17 -122.0839758438952,37.42265873093781,17 -122.0842374743331,37.42265143972521,17 -122.0845036949503,37.4226514386435,17 -122.0848020460801,37.42261133916315,17 -122.0847882750515,37.42256395055121,17 -122.0848938459612,37.42257124044786,17 Building 41 0 #transBluePoly 1 relativeToGround -122.0857412771483,37.42227033155257,17 -122.0858169768481,37.42231408832346,17 -122.085852582875,37.42230337469744,17 -122.0858799945639,37.42225686138789,17 -122.0858860101409,37.4222311076138,17 -122.0858069157288,37.42220250173855,17 -122.0858379542653,37.42214027058678,17 -122.0856732640519,37.42208690214408,17 -122.0856022926407,37.42214885429042,17 -122.0855902778436,37.422128290487,17 -122.0855841672237,37.42208171967246,17 -122.0854852065741,37.42210455874995,17 -122.0855067264352,37.42214267949824,17 -122.0854430712915,37.42212783846172,17 -122.0850990714904,37.42251282407603,17 -122.0856769818632,37.42281815323651,17 -122.0860162273783,37.42244918858722,17 -122.0857260327004,37.42229239604253,17 -122.0857412771483,37.42227033155257,17 Building 42 0 #transGreenPoly 1 relativeToGround -122.0857862287242,37.42136208886969,25 -122.0857312990603,37.42136935989481,25 -122.0857312992918,37.42140934910903,25 -122.0856077073679,37.42138390166565,25 -122.0855802426516,37.42137299550869,25 -122.0852186221971,37.42137299504316,25 -122.0852277765639,37.42161656508265,25 -122.0852598189347,37.42160565894403,25 -122.0852598185499,37.42168200156,25 -122.0852369311478,37.42170017860346,25 -122.0852643957828,37.42176197982575,25 -122.0853239032746,37.42176198013907,25 -122.0853559454324,37.421852864452,25 -122.0854108752463,37.42188921823734,25 -122.0854795379357,37.42189285337048,25 -122.0855436229819,37.42188921797546,25 -122.0856260178042,37.42186013499926,25 -122.085937287963,37.42186013453605,25 -122.0859428718666,37.42160898590042,25 -122.0859655469861,37.42157992759144,25 -122.0858640462341,37.42147115002957,25 -122.0858548911215,37.42140571326184,25 -122.0858091162768,37.4214057134039,25 -122.0857862287242,37.42136208886969,25 Building 43 0 #transYellowPoly 1 relativeToGround -122.0844371128284,37.42177253003091,19 -122.0845118855746,37.42191111542896,19 -122.0850470999805,37.42178755121535,19 -122.0850719913391,37.42143663023161,19 -122.084916406232,37.42137237822116,19 -122.0842193868167,37.42137237801626,19 -122.08421938659,37.42147617161496,19 -122.0838086419991,37.4214613409357,19 -122.0837899728564,37.42131306410796,19 -122.0832796534698,37.42129328840593,19 -122.0832609819207,37.42139213944298,19 -122.0829373621737,37.42137236399876,19 -122.0829062425667,37.42151569778871,19 -122.0828502269665,37.42176282576465,19 -122.0829435788635,37.42176776969635,19 -122.083217411188,37.42179248552686,19 -122.0835970430103,37.4217480074456,19 -122.0839455556771,37.42169364237603,19 -122.0840077894637,37.42176283815853,19 -122.084113587521,37.42174801104392,19 -122.0840762473784,37.42171341292375,19 -122.0841447047739,37.42167881534569,19 -122.084144704223,37.42181720660197,19 -122.0842503333074,37.4218170700446,19 -122.0844371128284,37.42177253003091,19 Extruded Polygon A simple way to model a building The Pentagon -77.05580139178142 38.870832443487 742.0552506670548 48.09646074797388 59.88865561738225 1 relativeToGround -77.05788457660967,38.87253259892824,100 -77.05465973756702,38.87291016281703,100 -77.05315536854791,38.87053267794386,100 -77.05552622493516,38.868757801256,100 -77.05844056290393,38.86996206506943,100 -77.05788457660967,38.87253259892824,100 -77.05668055019126,38.87154239798456,100 -77.05542625960818,38.87167890344077,100 -77.05485125901024,38.87076535397792,100 -77.05577677433152,38.87008686581446,100 -77.05691162017543,38.87054446963351,100 -77.05668055019126,38.87154239798456,100 Absolute and Relative 0 Four structures whose roofs meet exactly. Turn on/off terrain to see the difference between relative and absolute positioning. -112.3348969157552 36.14845533214919 0 990.6761201087104 49.30695423894192 -86.91235037566909 Absolute 0 #transBluePoly 1 absolute -112.3372510731295,36.14888505105317,1784 -112.3356128688403,36.14781540589019,1784 -112.3368169371048,36.14658677734382,1784 -112.3384408457543,36.14762778914076,1784 -112.3372510731295,36.14888505105317,1784 Absolute Extruded 0 #transRedPoly 1 1 absolute -112.3396586818843,36.14637618647505,1784 -112.3380597654315,36.14531751871353,1784 -112.3368254237788,36.14659596244607,1784 -112.3384555043203,36.14762621763982,1784 -112.3396586818843,36.14637618647505,1784 Relative 0 -112.3350152490417 36.14943123077423 0 345.5169113679813 37.92486261093203 -118.9214100848499 #transGreenPoly 1 relativeToGround -112.3349463145932,36.14988705767721,100 -112.3354019540677,36.14941108398372,100 -112.3344428289146,36.14878490381308,100 -112.3331289492913,36.14780840132443,100 -112.3317019516947,36.14680755678357,100 -112.331131440106,36.1474173426228,100 -112.332616324338,36.14845453364654,100 -112.3339876620524,36.14926570522069,100 -112.3349463145932,36.14988705767721,100 Relative Extruded 0 -112.3351587892382 36.14979247129029 0 401.0997279712519 56.10280503739589 -55.42811560891606 #transYellowPoly 1 1 relativeToGround -112.3348783983763,36.1514008468736,100 -112.3372535345629,36.14888517553886,100 -112.3356068927954,36.14781612679284,100 -112.3350034807972,36.14846469024177,100 -112.3358353861232,36.1489624162954,100 -112.3345888301373,36.15026229372507,100 -112.3337937856278,36.14978096026463,100 -112.3331798208424,36.1504472788618,100 -112.3348783983763,36.1514008468736,100
gdalautotest-3.0.4/ogr/data/polygons.gen0000644003401500001440000000010213614004466017672 0ustar rouaultusers1 2,49 2,50 3,50 3,49 2,49 END 2 2,49 2,50 3,50 3,49 2,49 END END gdalautotest-3.0.4/ogr/data/seamless.dat0000644003401500001440000000213413614004466017642 0ustar rouaultusersc aTableCWKTC seamless_part1.tabPOLYGON((0 0,0 1,1 1,1 0,0 0)) seamless_part2.tabPOLYGON((1 0,1 1,2 1,2 0,1 0))gdalautotest-3.0.4/ogr/data/wkt.csv0000644003401500001440000000032113614004466016652 0ustar rouaultusersCounter,WKT,Desc 1,"POLYGON((6.25 1.25,7.25 1.25,7.25 2.25,6.25 2.25,6.25 1.25))", 2,"POLYGON((4.25 4.25,6.25 4.25,6.25 6.25,4.25 6.25,4.25 4.25))", 3,"POLYGON((1.001 1.001,3.999 3.999,3.2 1.6,1.001 1.001))", gdalautotest-3.0.4/ogr/data/testopenfilegdb92.gdb.zip0000644003401500001440000015231313614004466022151 0ustar rouaultusersPK l}Ftestopenfilegdb92.gdb/UT {"U"Uux PK|F=u`6+testopenfilegdb92.gdb/a00000028.I4float.atxUT "U"Uux  S.[TKN:8$ii^g*:Te;VPK|Fc.rB:.testopenfilegdb92.gdb/a00000028.I4smallint.atxUT "U"Uux ر oԽ 5Ҫ$u3z溓} F`PK|FgX (testopenfilegdb92.gdb/a00000007.gdbtablxUT "U"Uux Q @ѻ%B0`!Cla Kxvg!Wy #B6r!)Ԥ%=LVH$I$IYPK|Fߑi*testopenfilegdb92.gdb/a0000002e.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d U+]$?AAk1;Dspw70Qqq VrA p tVB[YZyMp/JM+LP13  YZZbP0?=fwv@ÖlgKI0I TPK|FD+h*testopenfilegdb92.gdb/a00000027.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE!?+3C' g, FD PK|F` *Hz{(+6|mc,G.gU{Qn sMpUo~U@/5d3rTcd&8Q?ipO~ W~S$wivWMgpSo1O9*+k pZ>.d+[EycnDuWDl=nIMvڞ=scl'\4Ä(cwAc.2]dSIgD m!"O@͐Xr*FwyBr0]s?Ka-ؖVA~;7~iL+>/ xڣQ4+S8|vH{v:۳cbכc?O尶D ʖRzcmq_uv}8zq;썬^yO~TRAﻧzWybh 4طzgEgқPK|FwA/ (testopenfilegdb92.gdb/a0000002e.gdbtablxUT "U"Uux  !> ♁-W;5rB{ PK|FU[ 4 (testopenfilegdb92.gdb/a00000031.gdbtablxUT "U"Uux Q D# T QRSKP$~GDͻ3[uPK|FFk(testopenfilegdb92.gdb/a00000003.gdbtableUT "U"Uux cf```bcFVX5|<3y<\X؂B\"$ `scHda(fH 30s"DBD#P؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F,`PK|F+ul*testopenfilegdb92.gdb/a00000034.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d8ATՊee7 `PPZ0($݃ --Lt\CB}\<\=]bfz:FzFFFƦfƱ:A@܋RS33t buB^yVU -&!ciiGg4WaJrT0<̔;Ch_" =N wnT+ed c.7Wy̭oVۇG%$!:M:j5V26Uuu/NIbΈߘgWm[u & Ba^`a1S[p>6ͪ(݈5~V|.#KlR?̵ؠř%B*$v@3![;qṞGSHNCG(=(zd䒰FN»[}+v/}ɟ|ge<=8|xq$U2 E*%fۂ䧹wS9M.MH.޼;yvߏ⽽uTmc"3@hft%SiH+⎚bV62>28f[9J~W9*GPK|Fه1 (testopenfilegdb92.gdb/a00000035.gdbtablxUT "U"Uux   F #h *GDmܮgN v+PK|F KT4)testopenfilegdb92.gdb/a00000028.I4int.atxUT "U"Uux  S/y!~xXIC$m=#ъ@? e'WVPK|F·4f(testopenfilegdb92.gdb/a00000038.gdbtableUT "U"Uux cf``݌ Bk@ y#e` f`pd`pe``g`afpb0b`0cpf0N @ڂ2B.P#P#Xք 7Bg Z3A t֏0/&hFďz\4#9z!<6&b"G`d y,@D]* Qx&(2FI&PعN;}5`EgmF'!qiOE<J+H m4PKzFW[*testopenfilegdb92.gdb/a00000005.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK|F+ K#testopenfilegdb92.gdb/a00000032.spxUT "U"Uux 1 0DY`xQ`cSt)It 7<]m$ם->o=˽PK|FtoE*testopenfilegdb92.gdb/a00000028.I4real.atxUT "U"Uux c````eF fbf fA`Q@庾Vȁ=`Q0 F(#p$z < PK|F0##testopenfilegdb92.gdb/a0000003a.spxUT "U"Uux ȱ @1~, cd(urPKzF hR (testopenfilegdb92.gdb/a00000002.gdbtablxUT "U"Uux  @PӀ UX@hAZ&QŜ█r}ݹhyF"Lvrd&I$I$I?T} PK|Fs (testopenfilegdb92.gdb/a00000026.gdbtablxUT "U"Uux uq(*DE*Y=BWQQe^(BQdey\Wu[[X,V?6a،]8$/sJj!Z c&bc-b/bi’QP =QYX؁}8KH  .=zca a6a' 1!QQ C1ӱk{p q|^.܋jFw |'7NFi<:hW 1a.k"}@v܅b('Q/^xc!V[8Ș A<؃"@ۦJKN1_l  ec|r *2 2D@qLg8ClQx7)FarPK|F_Z????X((e$\Y.ߒ%*O'гKK/\Ϲe*} ~ }:ki>Fy;̥ =ܶ -8f l_"˝6R9>9[w`Lu:v~~b"W'zϨ:_Xr_- d/ | ֕䄽O4RyԄ"^J8MO1ZB^tUmF=a|GO;N)R9TX0k%\<֒X1כprXNC$9:_]n!0bIXuRq]㇪mM[z?tUq:Ԓh˛ n ^>3fW2E,˳i^78k8kzoQu]3TͲ>ݾٶ-iB8Lϕ@daX<៸RB^=UlsG + 3.֚с勲Ɋs&+Wb|'ܜ}01ٙհ|Yc?LjnʹfLjn͌/PK|FU8h*testopenfilegdb92.gdb/a0000002a.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`dDCՊee7 `PPZ0($݃ --Lt\CB}\<\=]bfz:FzFFFƦfƱ:A@܋RS33t buBHH `GWvvj'# 3g Ġ -,,C t8U8e jM܀|c t0`9D@qLg8YoR=f D4#\=?Б^@830xăW<C*CC:C C \Ȳ E@D%PC f.2*K.K^uBv-%6[}:qu;k%,*p cVV&M9Ä9@pa9087iT6mQ[Ѭ<%AC[t‘]F E(詃С|wHb}<{_ l}|kF #!# 6e^ hsq\'AJ2Q9TCd"Qw f䓶e$s~=A89mn"Ù}dq7$sdQtQǢF@j ] sG]lnr_7wkΞ+l8ҷjOBu E*'5pf1Gx NtU" hӘKW iF 8l T_,0&YXeLVS$ c} ZZ0\?EYp< +A~ ލtsGKכֿGg7+#+ϣ_^H+K׹.nlR澭*}YF&ŝCٯbǛ;+>ǒ?Å1q /ʿ==\%5$ךI7_PK|Ftwg*testopenfilegdb92.gdb/a00000037.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d@hZ& J_&E]ݝD|{pcHo PpkKB\@B86V' h{Qjj^yfrANgt8X{40U YG07D:./g?+?^M 0K PKzFݷ"(testopenfilegdb92.gdb/a00000002.gdbtableUT "U"Uux cf``@ʀ;! 1hvoTJr|" oC"P !(]E ~PL 3POCC&C:C0PQd8@Nd`*4q7&Y|Z\}XvZ>"xTHw7G߉ceSA f@M8\\C}BC=C\#BC2RRRKsJRK2sR2KK2Pt 8{89:Ż:Ywwu *r-(J-.NMQB5 08?ݕ3'3/UE n>Q̆!N r  K.P0`h PEJR+JrKBEM3F=@QoJdX[*Pn"> ¨ LBꁬe&.Pf}, P?g߀ `WK ԒJ4MpxPK|Fk*testopenfilegdb92.gdb/a00000033.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d >؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F1IjPK|F ky9K (testopenfilegdb92.gdb/a00000038.gdbtablxUT "U"Uux ȱ 0CQ%01 Q!4r2TrKnlSp.:kdvtn 2fPK|F<-B#testopenfilegdb92.gdb/a0000002d.spxUT "U"Uux A DѱP\ţMQp|A"IE]r;0Uݳ0 l[\PK|FlO#testopenfilegdb92.gdb/a00000031.spxUT "U"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPK|Fd2(testopenfilegdb92.gdb/a00000036.gdbtableUT "U"Uux R=hSQ{y!H VD:XhTZ1I#VKH4ڦSPY Au,$G:w{19~߹^,XIIL".&^8&Ek{\'A #L?ƹ3rTd&%$!qW rͧӓ9~2O3F]+" )< 6N~-ueAmUVez=›nppLEbP:`( Gu⸀)8cv©kZ933pcY,)$}XdD c."w@͒X|T6g Q&9.yşZ0WlRf;ȧ`__lVe*_1o;UUD-~>k_:^o52B'!txfGԹX*ev{ͻШSeu~6m"5\NcIp(J HڮQyq [0w&3af>WqX]x_t2VfE+LER 6.۴ E7Vn<]x9oh/״0Hi"@a%~\mvNŹ)yF4l{tdKl".Y e&ny 6&̗SGQ=;G_PK|F4 (testopenfilegdb92.gdb/a00000032.gdbtablxUT "U"Uux Q D#T QP-KP$>GDͻgUߩPK|FlO#testopenfilegdb92.gdb/a0000002b.spxUT "U"Uux c```aF fbf fbV F(``LD@ iQ0 F(`Q0XȣPK|F/C(testopenfilegdb92.gdb/a00000025.gdbtableUT "U"Uux cf```baFV5|<3y8\B<\f01e2YXJX@Y8rr0!(Te4j|& !(4$ t#ϒPKh8P!+[DՕ`N"Tx8a~(%(!AyƧ'W~0I|}iPOw?_7}|_ӷ&4H;)ZaL5_VB^U+Z޴43(R*ZZPTX{l"K;6, Ai9ι]wT.nlg*zX.h9Źӽ[2c)0ǵqKp>8b}A-km=6z|dw9 WA jzeaN.U/NT> Թŵ X2)aKf~u?/1֚wͲ^UOP.׹Ql?`uunbݶO}z>l뾠_PK|F7 (testopenfilegdb92.gdb/a00000025.gdbtablxUT "U"Uux  PDf.ނ%V7sIs&w/PK|Fi(*testopenfilegdb92.gdb/a00000025.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Y=d0ddHFGAnhdBgkGq0#qePK|F^'(testopenfilegdb92.gdb/a0000003a.gdbtableUT "U"Uux cf|FV5䙁4#`a` f`pd`pe``g`afpb0b`0cpf0N @ڂ2B.P#P#Xք 7Bg Z3A t֏0/&h<t ! @10 1d2200313RHC"CLh blXgZf #34J"@?vGed``PJ^ cfGc Q"P$E#,DPKzFW[*testopenfilegdb92.gdb/a00000003.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK|F8{ITb9(testopenfilegdb92.gdb/a0000002c.gdbtableUT "U"Uux R=hSQ_^hB8?ILK06MECj4-f,UġP,8,"8B v[F P߽FM!w=ι\ K}׈: zE݀ El=abR8ə@/8#a$̮KA%Oۈs&g8ZUW~׭<~]ܷ1^]H[9Lt6wCyU )+s#2 T|kٶso5˔}۲(=|ܔ( F61V(6ΔáB+ᏑB;02uQKswtvVuH883Wq?PK|F (testopenfilegdb92.gdb/a0000003a.gdbtablxUT "U"Uux cf@VLPK|FbQ! testopenfilegdb92.gdb/timestampsUT "U"Uux 0 J# ijĨܩlpPK|FC_(testopenfilegdb92.gdb/a0000002f.gdbtableUT "U"Uux R_HSQvp"1^snjlҌi`6uQNjVOգDC'`dXKЃC^ s$QO{;;? @㿬vgXUZEE Zmz^Z@'Qnz}8AOX8+h0ȖBdo#ky%:F.i+Q\W0W'*E كf%qÒJ |76aB㡆[j ]ѣ9sLe7m_4w#?1=oآ7MSߖ͛XoN>}6cxl!s^K6,V yGXYpsHd6Z c8jĢ#clH=$9vhtJ& )}+Z¼āʏv>-]LZ9“ᚒh]zBqnW˫_9kVGgusˬLH/޸>/[ofObDon*_"'mn,Yy0=}3ٗ8Mpzzs_ ꫴ:b0V ɜ L-=g6ЮC} k#k/NuD-5tP| URaVTP3mE%d5JLSt>7ɷ;~.T?͡í_.wW~(qdy9[Y*ۃԝS B|PxMmtR&yGɧvHno|x:iI%eH2x $#hֺFZ~͈3b X<#HHţ>+PK|F1C]wv(testopenfilegdb92.gdb/a00000033.gdbtableUT "U"Uux RKhSA={//K\"EJ4hTiCVP4ӊblV"bA\+.! ZJWt%ѝ.2ޜsϜ{g(4vf`i ?? ubt g"%p3.xzŝq!,]aŨj?\Z7ws͙`goral!>I IeT>7M!cY.0[qE^ͨq2ؒ|4O4֯,WVmɫ݁KE_eۑRܢދx,qV0EՠagJ>3ia^8%$sAK7Jm+mU\N/GF[GDͻgUߩPKzFW[*testopenfilegdb92.gdb/a00000001.gdbindexesUT "U"Uux ʼ` Ï2]FFFeh31#i/;_dE6' H#T? TR€`DbPK|F-4 (testopenfilegdb92.gdb/a0000002a.gdbtablxUT "U"Uux  A#K~ Ɩ"n?#SyF:_hwPK|Fk*testopenfilegdb92.gdb/a00000032.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d >؃¢jŲr0((}-fguwwwV&J:.!J.HBA.J13cs Ccs=#K =#Ss##cS3X O_W EyJ:z:~!@sSӁ`!CsSc#K#SCKKcVҐvJ;UyFgܬRx7)F1IjPK|F1{(testopenfilegdb92.gdb/a00000037.gdbtableUT "U"Uux R=LSQ޻504NRH b@HFRkJHtBtqq ib\H4JH}1{{Ͻnd˼ֹ4L=:`jh Q$pM51ZRB̴I d'0yo%õ#|J{Ƙ_WS$.䌑=12#xď&Igd_}Pe_ceqa+ҥRrȿ~ȕ^vmMĻZS4tx(! 90!PK sF SRNcs<1up3"eY+ܬ=#_hPK|FCs (testopenfilegdb92.gdb/a00000001.gdbtableUT "U"Uux ] Pg7BNC ( 8d 2[nV]H6 ,( B[B(V7mEATAAQANv}5 ȟvQ'usAll!$ یPPR^C(Q` Kl6${Q$-'2^Pס0XcjQϻIK ~?\5G}~/*X /~|eӤ|b=Ј}yaq;Vբ;eaD6f+czrZޕxnO4`WEmI͖fk9u2Bh,ɀIm="zd:6X\2_:5A缕t?m*٧r@DEL43=)Xr#?g6)TD)s*r& 9I7>xb_X$oQͤP1t C@GœcL)isɋh;{ KyNc;8U]dw5OY;_dC.ݕGn_:պgjyLD(@R|[ok|tHw,t8agew\cmB08h-Uil$7.Qz|00%qM,ggZxL]*> (0REUH$,. [s #:Ruf^h\PlB3 HdϬ>bfIcJ4R-[T6?v4 i TxJT4'U"!ļ#XRpvH瘌TÇ;Qhjӿ|\#8cvW`7g\i"2#gf֜;VB_ Ns{Q3%r-ֻu=OujHY?ϯ7 Lꐀ7]4, ǰ(Gx'xxWxxV>kc'{?8 e@jP4m@ы~ bYiVQ,JMҐ-Jwzӟ g$0qLfp1s5s33{Y,a+ygYj^ ]>` o]įArY|(%)KER4)-iKGҝg0Ӳ(G%Qz4hG'A0űLTd2S\\ >KYcB ia,|zrfb)ʴ _,}. ees0OT˄U:=:a[hCmh  PK|F xf(testopenfilegdb92.gdb/a0000002a.gdbtableUT "U"Uux RMHTQ=޼ynڵE?3S)14iTtT(bGбQD\BDb"7Bh2D{%j-|~w94>+^X1+u^9E+N:tQ F;mE1t1ըRdHd_Pdo$ky%UJ_ yd<\^Fym䌐=bu;W?++$wo) ^-tEZ9Ǒ/sV=/l9wHOkh&Ihi n-C/58+JͮADw)sWЍ\}J AV,hI0W@ NVI,j >* Ŋj0 tBsHnJ =BJ H؁Yǥ*η3]Uoǎ/_5X2762͚@5w/GV aL k\Ul٥/\ +3e'g߾?M;U(F ڑLc 9Ph@1+{9|o2牠\Xۣ* com( uamh_PK|F (testopenfilegdb92.gdb/a00000007.gdbtableUT "U"Uux cf``@ʀ g1xRJrГ (+e(B* 4Xg%@JTY` Nߍ!H0008mfaik.aֲ2 1KO x}2-)^wU9Q}>> 3]4? ` f 1 AQٱ s@YP9 saw 7v`0v+ @9Q.,"})1 PK|F&l*testopenfilegdb92.gdb/a00000038.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`d 6Ur\\ubfh(CC63IWIAAa0G=%ߤ{  d?(PK|F)p;(testopenfilegdb92.gdb/a0000002e.gdbtableUT "U"Uux R;hSQrSRڼ|D&5 MAђ6iت)Rm v(NAB:EZJ@ѡJ` j7s|99*ߚRUCf,*E^1 Q NK7t#iz8MOX78+-seCHdxT=d$o/Q/xq[Vz+a<^zỹ䌐=b*Ҝ FqA2$qsi:>jx{35UjgVj‘*dxg5ԽPgyH4Pv`J+öc-uk !KVMQ2H5yFX,lS$.sfؤi(X%X +XMX|dq\k:9hnIJȄ1A`2A 󃯓^oxwi};ǷFo^l?΋nl:̯7_-ڟAݲeRlJid#xj4%K/mtO [vlo* *( WP5\A_ PK|F9Kf(testopenfilegdb92.gdb/a00000029.gdbtableUT "U"Uux R_hRQ׫2a=C ctet 9jF.r!{ zao{ !zE"h`9J#%݃s~_U}v#}^i@/:G7`iaԏD8(CwÏӆ.Lb1 *A^Q'nx[zYȾ~k./#jxg5T'g/Sut^8=Z2/bP$+Nֽ-l}i~Dy! YQ& f|"N \yeBؠ+\an;MX|T#8 )ֲMSK$'2,Ӕ8kdu-#a~5r@m󛟎n}v#jY(l|Rrݕ };> Lq,lJWrua^03MgޯJ#&i z㬜l(زxd{|<>\9\y Vj_VE?+몮y]յPK|FKۅ#testopenfilegdb92.gdb/a00000039.spxUT "U"Uux 1 0Nvty ?$OݧZ Q0r 툈3>$+}c;{:{ջ1ܘ1Jnqw9 _GOI?'/| _E_>/| c1~PK|F@A (testopenfilegdb92.gdb/a00000039.gdbtablxUT "U"Uux  0DSLI1ZLX3&`>LNniEt^Wrwr>PK|F0##testopenfilegdb92.gdb/a00000038.spxUT "U"Uux ȱ @1~, cd(urPK|F-4 (testopenfilegdb92.gdb/a0000002b.gdbtablxUT "U"Uux  A#K~ Ɩ"n?#SyF:_hwPK|F2 (testopenfilegdb92.gdb/a00000037.gdbtablxUT "U"Uux  2y9hT,wݧuޞj~PK|F+ K#testopenfilegdb92.gdb/a00000033.spxUT "U"Uux 1 0DY`xQ`cSt)It 7<]m$ם->o=˽PK|F ( (testopenfilegdb92.gdb/a00000008.gdbtablxUT "U"Uux ?sd`3mG70( L'ՠlR(`Efse\u,8k+B /$FZ0 U!4 Ё%\ `?Lh Qm M u5|RJ)RJ)z PK|Fj*testopenfilegdb92.gdb/a0000002d.gdbindexesUT "U"Uux ʼ` Ï2]F&Fe( d@?Ͽ 8CC|SPB@'/WgO$ c$Yx=@y2  @5@aGw`8:wE9ˁ`diPX4TXvQv@ J@">=8DI1$7ZI(85%Z !fflnahlgcdigdjnddljf 4(55<39CI@ V'3hnj:P,dhnbjldidjhiib Ԋ=^@i+@r#"q[Jݟ/&h% TPK|F+ K#testopenfilegdb92.gdb/a0000002c.spxUT "U"Uux 1 0DY`xQ`cSt)It 7<]m$ם->o=˽PK|FH(Zf (testopenfilegdb92.gdb/a00000006.gdbtablxUT "U"Uux ̱ 0FaZ,@q<%uY\RFLR *f@='OJJ)s<ț\F:H-Yȇ\̫F:yzLID$I$Iҿ߰PK l}FAtestopenfilegdb92.gdb/UT{"Uux PK|F=u`6+Ptestopenfilegdb92.gdb/a00000028.I4float.atxUT"Uux PK|Fc.rB:.testopenfilegdb92.gdb/a00000028.I4smallint.atxUT"Uux PK|FgX (testopenfilegdb92.gdb/a00000007.gdbtablxUT"Uux PK|Fߑi*Gtestopenfilegdb92.gdb/a0000002e.gdbindexesUT"Uux PK|FD+h*testopenfilegdb92.gdb/a00000027.gdbindexesUT"Uux PK|F`testopenfilegdb92.gdb/a00000039.gdbtableUT"Uux PK|Ff*@testopenfilegdb92.gdb/a00000035.gdbindexesUT"Uux PKzF, % (_Btestopenfilegdb92.gdb/a00000004.gdbtablxUT"Uux PK|FҰ+(Btestopenfilegdb92.gdb/a00000028.gdbtableUT"Uux PK|Ftwg*sEtestopenfilegdb92.gdb/a00000037.gdbindexesUT"Uux PKzFݷ"(>Gtestopenfilegdb92.gdb/a00000002.gdbtableUT"Uux PK|Fk*Itestopenfilegdb92.gdb/a00000033.gdbindexesUT"Uux PK|F ky9K (QKtestopenfilegdb92.gdb/a00000038.gdbtablxUT"Uux PK|F<-B#Ktestopenfilegdb92.gdb/a0000002d.spxUT"Uux PK|FlO#Ltestopenfilegdb92.gdb/a00000031.spxUT"Uux PK|Fd2(IMtestopenfilegdb92.gdb/a00000036.gdbtableUT"Uux PK|F6b2 (Otestopenfilegdb92.gdb/a0000002f.gdbtablxUT"Uux PK|F1*3(qPtestopenfilegdb92.gdb/a00000025.I1id.atxUT"Uux PK{FW[*Qtestopenfilegdb92.gdb/a0000001c.gdbindexesUTE"Uux PK|Fه1 (Qtestopenfilegdb92.gdb/a00000036.gdbtablxUT"Uux PK|F E(XRtestopenfilegdb92.gdb/a0000002d.gdbtableUT"Uux PK|F4 (CUtestopenfilegdb92.gdb/a00000032.gdbtablxUT"Uux PK|FlO#Utestopenfilegdb92.gdb/a0000002b.spxUT"Uux PK|F/C(Vtestopenfilegdb92.gdb/a00000025.gdbtableUT"Uux PK|Fk**Xtestopenfilegdb92.gdb/a00000030.gdbindexesUT"Uux PK|F1*3(Ytestopenfilegdb92.gdb/a00000028.I4id.atxUT"Uux PKzF (Ztestopenfilegdb92.gdb/a00000005.gdbtablxUT"Uux PK|FU[ 4 (Ztestopenfilegdb92.gdb/a00000030.gdbtablxUT"Uux PK|Fߥc"-[testopenfilegdb92.gdb/a00000028.I4nullint.atxUT"Uux PK|F 9I(\testopenfilegdb92.gdb/a00000006.gdbtableUT"Uux PK|F7 (^testopenfilegdb92.gdb/a00000025.gdbtablxUT"Uux PK|Fi(*L_testopenfilegdb92.gdb/a00000025.gdbindexesUT"Uux PK|F^'(B`testopenfilegdb92.gdb/a0000003a.gdbtableUT"Uux PK|F0##atestopenfilegdb92.gdb/a00000035.spxUT"Uux PK|FlV *,btestopenfilegdb92.gdb/a00000028.gdbindexesUT"Uux PKzFW[*dtestopenfilegdb92.gdb/a00000003.gdbindexesUT"Uux PK|F8{ITb9(etestopenfilegdb92.gdb/a0000002c.gdbtableUT"Uux PK|F (ihtestopenfilegdb92.gdb/a0000003a.gdbtablxUT"Uux PK|FbQ! htestopenfilegdb92.gdb/timestampsUT"Uux PK|FC_(Oitestopenfilegdb92.gdb/a0000002f.gdbtableUT"Uux PK|F1 (ltestopenfilegdb92.gdb/a00000008.gdbtableUT"Uux PK|F1C]wv(ntestopenfilegdb92.gdb/a00000033.gdbtableUT"Uux PK|F4 (Yqtestopenfilegdb92.gdb/a00000033.gdbtablxUT"Uux PKzFW[*qtestopenfilegdb92.gdb/a00000001.gdbindexesUT"Uux PK|F-4 (rtestopenfilegdb92.gdb/a0000002a.gdbtablxUT"Uux PK|Fk*Dstestopenfilegdb92.gdb/a00000032.gdbindexesUT"Uux PK|F1{(utestopenfilegdb92.gdb/a00000037.gdbtableUT"Uux PK|F^D3 (wtestopenfilegdb92.gdb/a00000034.gdbtablxUT"Uux PK|FlO#&xtestopenfilegdb92.gdb/a00000030.spxUT"Uux PK|F2X*xtestopenfilegdb92.gdb/a00000028.I4guid.atxUT"Uux PKzF݀(ytestopenfilegdb92.gdb/a00000005.gdbtableUT"Uux PK|Fk*ztestopenfilegdb92.gdb/a00000031.gdbindexesUT"Uux PK|F*3ay (P|testopenfilegdb92.gdb/a0000001c.gdbtablxUT"Uux PK|F o6 (+}testopenfilegdb92.gdb/a0000002d.gdbtablxUT"Uux PK|F0##}testopenfilegdb92.gdb/a00000036.spxUT"Uux PK|FةE#C~testopenfilegdb92.gdb/a00000034.spxUT"Uux PK|F9IF)~testopenfilegdb92.gdb/a00000028.I4str.atxUT"Uux PK|F\2 (testopenfilegdb92.gdb/a00000029.gdbtablxUT"Uux PK|FCs ("testopenfilegdb92.gdb/a00000001.gdbtableUT"Uux PK|FYJΙ0*8testopenfilegdb92.gdb/a00000026.I2real.atxUT"Uux PK|Fր4d(5testopenfilegdb92.gdb/a0000002b.gdbtableUT"Uux PK|F xf(testopenfilegdb92.gdb/a0000002a.gdbtableUT"Uux PK|F (Ïtestopenfilegdb92.gdb/a00000007.gdbtableUT"Uux PK|F&l*Btestopenfilegdb92.gdb/a00000038.gdbindexesUT"Uux PK|F)p;(testopenfilegdb92.gdb/a0000002e.gdbtableUT"Uux PK|F9Kf(8testopenfilegdb92.gdb/a00000029.gdbtableUT"Uux PK|FKۅ#testopenfilegdb92.gdb/a00000039.spxUT"Uux PK|F@A (ǘtestopenfilegdb92.gdb/a00000039.gdbtablxUT"Uux PK|F0##jtestopenfilegdb92.gdb/a00000038.spxUT"Uux PK|F-4 (testopenfilegdb92.gdb/a0000002b.gdbtablxUT"Uux PK|F2 (testopenfilegdb92.gdb/a00000037.gdbtablxUT"Uux PK|F+ K#testopenfilegdb92.gdb/a00000033.spxUT"Uux PK|F ( (testopenfilegdb92.gdb/a00000008.gdbtablxUT"Uux PK|Fj*֜testopenfilegdb92.gdb/a0000002d.gdbindexesUT"Uux PK|F+ K#testopenfilegdb92.gdb/a0000002c.spxUT"Uux PK|FH(Zf (Ltestopenfilegdb92.gdb/a00000006.gdbtablxUT"Uux PK{{4gdalautotest-3.0.4/ogr/data/esrizpoint.json0000644003401500001440000000156313614004466020442 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "x" : 2, "y" : 49, "z" : 1 }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/polygons.vct0000644003401500001440000000114113614004466017721 0ustar rouaultusers?jANAO"ASA jANAjASAO"ASAO"ANAjANA@wAd6PA@wARA ARA Ad6PA@wAd6PA@jANAO"ASAjANAjASAO"ASAO"ANAjANAgdalautotest-3.0.4/ogr/data/empty_first_field_with_tab_delimiter.mif0000644003401500001440000000013113614004466025453 0ustar rouaultusersVersion 300 Charset "Neutral" Columns 2 field1 Char(254) field2 Char(254) Data NONE gdalautotest-3.0.4/ogr/data/test_point.xsd0000755003401500001440000000401713614005351020243 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/gnis_pop_100.gml0000644003401500001440000004026513614004466020242 0ustar rouaultusers -179.5,-90 179.83000183,78.93000031 2.09,34.12 2.09,34.12 2.09,34.12 84683 Algeria place Aflu 11.53,50.83 11.53,50.83 11.53,50.83 731 Germany place Altenberga -80.17,8.6 -80.17,8.6 -80.17,8.6 1081 Panama place Alto de la Estancia 69.21,35.62 69.21,35.62 69.21,35.62 27034 Afghanistan place Andarab 10.87,45.92 10.87,45.92 10.87,45.92 15373 Italy place Arco 16.75,47.39 16.75,47.39 16.75,47.39 3174 Hungary place Buek 3.33,49.58 3.33,49.58 3.33,49.58 680 France place Barisis 2.4,50.08 2.4,50.08 2.4,50.08 1273 France place Beauquesne 7.29,49.98 7.29,49.98 7.29,49.98 150 Germany place Belg 24.02,50.38 24.02,50.38 24.02,50.38 2386 Ukraine place Belz 76.58,28.7 76.58,28.7 76.58,28.7 16727 India place Beri 4.85,46.22 4.85,46.22 4.85,46.22 246 France place Bey 8.03,48.2 8.03,48.2 8.03,48.2 1755 Germany place Biederbach 14.6,10.74 14.6,10.74 14.6,10.74 16952 Cameroon place Bogo 8.72,51 8.72,51 8.72,51 5233 Germany place Burgwald -71.97,-13.32 -71.97,-13.32 -71.97,-13.32 9179 Peru place Calca -0.62,45.13 -0.62,45.13 -0.62,45.13 1301 France place Cars -67.86,46 -67.86,46 -67.86,46 226 United States of America place Cary 3.1,45.68 3.1,45.68 3.1,45.68 1487 France place Chanonat 4.67,47.42 4.67,47.42 4.67,47.42 34 France place Charencey gdalautotest-3.0.4/ogr/data/test_type_promotion.json0000644003401500001440000002372113614004466022362 0ustar rouaultusers{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": null, "properties": { "bool_then_bool": true, "bool_then_int": true, "bool_then_int64": true, "bool_then_real": true, "bool_then_string": true, "bool_then_boollist": true, "bool_then_intlist": true, "bool_then_int64list": true, "bool_then_reallist": true, "bool_then_stringlist": true, "int_then_bool": 1, "int_then_int": 1, "int_then_int64": 1, "int_then_real": 1, "int_then_string": 1, "int_then_boollist": 1, "int_then_intlist": 1, "int_then_int64list": 1, "int_then_reallist": 1, "int_then_stringlist": 1, "int64_then_bool": 1234567890123, "int64_then_int": 1234567890123, "int64_then_int64": 1234567890123, "int64_then_real": 1234567890123, "int64_then_string": 1234567890123, "int64_then_boollist": 1234567890123, "int64_then_intlist": 1234567890123, "int64_then_int64list": 1234567890123, "int64_then_reallist": 1234567890123, "int64_then_stringlist": 1234567890123, "real_then_bool": 0.015625, "real_then_int": 0.015625, "real_then_int64": 0.015625, "real_then_real": 0.015625, "real_then_string": 0.015625, "real_then_boollist": 0.015625, "real_then_intlist": 0.015625, "real_then_int64list": 0.015625, "real_then_reallist": 0.015625, "real_then_stringlist": 0.015625, "string_then_bool": "x", "string_then_int": "x", "string_then_int64": "x", "string_then_real": "x", "string_then_string": "x", "string_then_boollist": "x", "string_then_intlist": "x", "string_then_int64list": "x", "string_then_reallist": "x", "string_then_stringlist": "x", "string_then_datetime": "x", "datetime_then_string": "1970-01-01T00:00:00", "datetime_then_datetime": "1970-01-01T00:00:00", "boollist_then_bool": [true], "boollist_then_int": [true], "boollist_then_int64": [true], "boollist_then_real": [true], "boollist_then_string": [true], "boollist_then_boollist": [true], "boollist_then_intlist": [true], "boollist_then_int64list": [true], "boollist_then_reallist": [true], "boollist_then_stringlist": [true], "intlist_then_bool": [1], "intlist_then_int": [1], "intlist_then_int64": [1], "intlist_then_real": [1], "intlist_then_string": [1], "intlist_then_boollist": [1], "intlist_then_intlist": [1], "intlist_then_int64list": [1], "intlist_then_reallist": [1], "intlist_then_stringlist": [1], "int64list_then_bool": [1234567890123], "int64list_then_int": [1234567890123], "int64list_then_int64": [1234567890123], "int64list_then_real": [1234567890123], "int64list_then_string": [1234567890123], "int64list_then_boollist": [1234567890123], "int64list_then_intlist": [1234567890123], "int64list_then_int64list": [1234567890123], "int64list_then_reallist": [1234567890123], "int64list_then_stringlist": [1234567890123], "reallist_then_bool": [0.015625], "reallist_then_int": [0.015625], "reallist_then_int64": [0.015625], "reallist_then_real": [0.015625], "reallist_then_string": [0.015625], "reallist_then_boollist": [0.015625], "reallist_then_intlist": [0.015625], "reallist_then_int64list": [0.015625], "reallist_then_reallist": [0.015625], "reallist_then_stringlist": [0.015625], "stringlist_then_bool": ["x"], "stringlist_then_int": ["x"], "stringlist_then_int64": ["x"], "stringlist_then_real": ["x"], "stringlist_then_string": ["x"], "stringlist_then_boollist": ["x"], "stringlist_then_intlist": ["x"], "stringlist_then_int64list": ["x"], "stringlist_then_reallist": ["x"], "stringlist_then_stringlist": ["x"] } }, { "type": "Feature", "geometry": null, "properties": { "bool_then_bool": true, "bool_then_int": 1, "bool_then_int64": 1234567890123, "bool_then_real": 0.015625, "bool_then_string": "x", "bool_then_boollist": [true], "bool_then_intlist": [1], "bool_then_int64list": [1234567890123], "bool_then_reallist": [0.015625], "bool_then_stringlist": ["x"], "int_then_bool": true, "int_then_int": 1, "int_then_int64": 1234567890123, "int_then_real": 0.015625, "int_then_string": "x", "int_then_boollist": [true], "int_then_intlist": [1], "int_then_int64list": [1234567890123], "int_then_reallist": [0.015625], "int_then_stringlist": ["x"], "int64_then_bool": true, "int64_then_int": 1, "int64_then_int64": 1234567890123, "int64_then_real": 0.015625, "int64_then_string": "x", "int64_then_boollist": [true], "int64_then_intlist": [1], "int64_then_int64list": [1234567890123], "int64_then_reallist": [0.015625], "int64_then_stringlist": ["x"], "real_then_bool": true, "real_then_int": 1, "real_then_int64": 1234567890123, "real_then_real": 0.015625, "real_then_string": "x", "real_then_boollist": [true], "real_then_intlist": [1], "real_then_int64list": [1234567890123], "real_then_reallist": [0.015625], "real_then_stringlist": ["x"], "string_then_bool": true, "string_then_int": 1, "string_then_int64": 1234567890123, "string_then_real": 0.015625, "string_then_string": "x", "string_then_boollist": [true], "string_then_intlist": [1], "string_then_int64list": [1234567890123], "string_then_reallist": [0.015625], "string_then_stringlist": ["x"], "string_then_datetime": "1970-01-01T00:00:00", "datetime_then_string": "x", "datetime_then_datetime": "1970-01-01T00:00:00", "boollist_then_bool": true, "boollist_then_int": 1, "boollist_then_int64": 1234567890123, "boollist_then_real": 0.015625, "boollist_then_string": "x", "boollist_then_boollist": [true], "boollist_then_intlist": [1], "boollist_then_int64list": [1234567890123], "boollist_then_reallist": [0.015625], "boollist_then_stringlist": ["x"], "intlist_then_bool": true, "intlist_then_int": 1, "intlist_then_int64": 1234567890123, "intlist_then_real": 0.015625, "intlist_then_string": "x", "intlist_then_boollist": [true], "intlist_then_intlist": [1], "intlist_then_int64list": [1234567890123], "intlist_then_reallist": [0.015625], "intlist_then_stringlist": ["x"], "int64list_then_bool": true, "int64list_then_int": 1, "int64list_then_int64": 1234567890123, "int64list_then_real": 0.015625, "int64list_then_string": "x", "int64list_then_boollist": [true], "int64list_then_intlist": [1], "int64list_then_int64list": [1234567890123], "int64list_then_reallist": [0.015625], "int64list_then_stringlist": ["x"], "reallist_then_bool": true, "reallist_then_int": 1, "reallist_then_int64": 1234567890123, "reallist_then_real": 0.015625, "reallist_then_string": "x", "reallist_then_boollist": [true], "reallist_then_intlist": [1], "reallist_then_int64list": [1234567890123], "reallist_then_reallist": [0.015625], "reallist_then_stringlist": ["x"], "stringlist_then_bool": true, "stringlist_then_int": 1, "stringlist_then_int64": 1234567890123, "stringlist_then_real": 0.015625, "stringlist_then_string": "x", "stringlist_then_boollist": [true], "stringlist_then_intlist": [1], "stringlist_then_int64list": [1234567890123], "stringlist_then_reallist": [0.015625], "stringlist_then_stringlist": ["x"], } } ] } gdalautotest-3.0.4/ogr/data/compr_symb_deleted_records.zip0000644003401500001440000015343713614004466023456 0ustar rouaultusersPK/EL;9 compr_symb_deleted_records.tabUT XTXTux UOk@ ƽ6$ Ń4 ڂ "Ȭ; q"ⷯI={ǛQDې+u ]ߞ]=RHQRǾYBn P<5.@kSH'M K'χ3EtQ 7aK>)Z-_K}6?i:O\cE i{MiPK/EKBcompr_symb_deleted_records.mapUT XTXTux [yձ_O2=N/ @ 4+((GDl|S aS( pE1*CP_3x`PO@Mխݪ[U)/KΜ3M-x?Vg{f7c^yuz-ټ|#۞?[o[{e,_;G5/`\߮Dˤ;j CuSPW.U y_HH.*߬Ublm;pv@U*x^P!# U9 "y['U'ynrgnP:ceqH!KqHG$j2.Vg19H!My+Y7Yen<8Q?vŽLGeuё`2:dmjcp>;wZTȮN+]h:.] [0j7p24 )xS #k!KtY#y ~U~]L㉀`t³Zgl;E PϏ (`.yzF-)oqljT$ y@ pe,ظFXdl3Q<@[7:ybxX­ozPc̝Ch?fW4n-zlY?ʪd\aAh VJgkVk5\Mm7ʼsL\Senwgj̯6i5V=lzv&:m3*z*9nk':ui|z5_9DLsn( 9rw{wxh^SO [Ѹf MW;CW&;=y;cTxT7whTvq;cHBiKtV¬c  Mj0qh/ HƸ`=wжzmIDv8'ӬOfxyhjMZ8e"?EƝE+AE-bQR21X|2dݵ 9 ZePĪE6h 9NPk/ƽ#BRܵ/ pղF4?x{Hۿ `^ b sApОS$ZMq@,qfC28ڥ;m͘.nl!\䁣9@}{i }YiQ{U;mV%ayCZ-7n>^NՆq'kh8@o:#ɵ\CVm1&q 5`$ @7%*xI@49-`x'gS_Q8XL.B8l1ߌugQ_P,u[sI:wjZBvnyx@"eeeUfW/N7Cc3qLy]q1>zVWXELLyW +uNCg@]x"HqeY1Ą"Eh/c  J]ϢFo?Xov[-xo]+N6V׏8 .`6::XKq7뵀c<gLpOfybXl>s0c.Q(W:Yg3Tg[ٿ#ulsٸKgJL7vF wUN9pfIxG  {ϝr~(:B^!OTrA8PˀЃƄ7^-VΡȡ]ms*~UeS 9sεb0.+4c ' J8A^ܵ^34 e@m@=f.z% Ac |IP_C3t_*y)Y 5RʌBT3OLWze`).6׳R='Rep43_smRU22/Gi3?+N+ O{)E"ĉE F5ku}"R]\?Qz,q-6nrrf:F x@Pz* b 6)."Tj(O c;gqQKx~zar:~3t%ɀlY0cp~ؕyx]=[tWΆgYvV5ZbU'\[@Ed|LKGj8R"G-Q%8 !'wAPGC- HO pLWΎ>& p*9]D~aca:̆yց Wj oW 1nq˥ J+tJA?ޞ¼mm3 ,a\,o?`\Sq!@pF 8A}A' yD}P%@.-os y Aݖ8e0YH@܀H }0xG0rNlݪ`?gYп|Q?.Uʃy:#IOT o h8@]fG33N8@%apl ܹ^P{ÇyQGԭz9b0ndBwk=44Ɓzfhx$_V8@= _ 1nR w s-7#})= f=``?ewZnN;5᷵@on={ DZvwԲvfys㻃BT@إ;+Ʒ$Elb'); 75\}H:;Kfx8Jn>Npהda#+7>F]+w5lWûm7񚕷%b6~j~+s;^uaշ>|>U} |L} Q0ʎ8mQw3.IKj_7dw$ܑizǃic9;CO}=;4>v\徆1;PiMJ,*o>u8ZIܦ`Ĺr5KF@묌Jr',q3cz@ʳ>pM~v ܞcs05 Vx1<(zc1&j1ܖ~&=aP\NrR cJ~)8`^;sOqruw1>Qٷ5&ky!ci//w;^w}'6}~Ɠ%~fA9aZ1ꝰS#9 0!ؼ ۡ1:8+ Q=mwI=zQ"˻,YҚs<=_P![R28O{39՚t' ݍ5h9u/Mo{?!'Aڵ}Uv3b@^6~Kǖ%h6I֘7HMIz$X?M/E&,~H}C]£_i2ެ2?hcƸة5n'bdZYbK50nrU1k~OF 1 1OԄg2##{uK83JyD=c=X(nљ:dA9pƙߢ2>=oV[[׷2)4 2SkW#EF\Z~PaFaWs" h[-Fhc[TpU'M иx?3n=kʐ9 {RMC&NM4eݨi*eF-2ǐ s&tD&ʏOܿF]]wQy3Y㮜}}眣hXR Mi1*FFJPF)ERN$dz&&7-BR̛^||x}̛w8<~]H˯дN5ZOf5𾵖U܎Hw-֭kS'yYc/=q;+4]L) eVr6ҹ iOt|AZ*=XZ/O~bP7bA@B BXcF(|!;^42@ݒuFv]哳Ә![,AgebNڧhڠd1M  U@?h:nGFU21#cqE-hEVh +VX7O #;ܑUb~/_s*/ИGuczo̴ 3Vuu6W:+K\;3mnIkNZ;7lҊKd }3,5EYv{Y!5-q"%x)j+2Su?h*O[*_wT1%Z쿷&Z<+K:u'6RMh+l|ͬ4oV9_DE(ۣ|* -2hvaO#QZ9ދSYO6ېu,5YE9ڶ{b9&Oj&{weZCjO{Ku~'ο F|o*-3C|Cl^=RY'y"m=J?.xӖ[ىO\}`'<,;U2#."#N8)ڶ8g2ې;(śzXM,,Ks^itTن5@h R'ܫ ED`aGF6F63r@OK9΍c]i @MRC,VdGẏ T);Vr}Ѐ~ѷH=25~߽3hکw4#n)(H靖{X БVb콒mh{-q{v#p7кÁk0=E+ač^ O =@?@˜P>]aQ 1$f<XmQ;|Ch@v710KScD-`]׀ѫVp7Y=[֖ѯͿfo?NJ2[6n!hf#F~rI:IMy\I76/}ͽ;ZsWȇwD#𙘒h m%(T2+Ma!r3Ss*W>6l 5?D*)L nBy_lì=` i}'prx.nȡ֙ZN^oQ|wZDH50 î~@Gz@5<3)fѼk/YʀΆHs0`4he473bJ*r5'uBqk9rM~}uQN8x>~J1!jơȣJZ]%pRz)J3Ծ;d(4*^RNHd)L K9@H.Dw`T`-|-~?yd^ےm$SOFoW Um98Hez\*Ͽ~AE;MbC4L]t2K'! Bj})>X`͂e+,#c&+uc{Yl _Y(%'bA=&8\S0@k%La/(5{&tX}ရ$yb+a~ aO|st׋ui:y } Ϳ2kL侫L_;Vz|5l#̻P:TR/oI2o8!R0Jc~<|wR%1qJ>t$VI% (4OS.!oPsr9JM)9aG"% ET坷˔vkȑ9SwYobw(X#ob͵̬*T쬾1Xf =,:!wXic֢8=z3U!Vb͒'y! qH'XcSKIvU3 RhSd-xrQƓHAҴ_fә: ;M_μvMVkgQfrJVdWq103/!1~5.0 ¬xY(kcq`.fk 'yHnw4Yل?o~dYkcgTTO 7`oi*:]/o~~po+pFل \'x{N=1o,ݭY,oyO}XOFR.1*o~{`vY߭}+(81hUز5:c.20m>41b0efR^﬌Z;Êk2oc0;ls2n #Jq=e/OE鉅V9,ŶF ֢烌Į=ft,,H2RfF)i;vϲv}91N' lj`tūw]-k)mzr#%MF+K%k;wR)_7mtRF>K)/^'(S+)P~%BuJ'x7J(LPO$)oOR霢.rcԼygʹ4u5Ee+YLS?KZش+GFL]grMkۿkBwb׹-:p(Mp8쿫ۚ>r>roޝsv}[x#J-0 uGxcDMOxw1V$4q,Cr ?~A?M!EjZ^#R9u xB'k*.Yhmɞ*9ZZ>kfFڪӺV]7uҴGUDאw8%hH7H^;NҨi[-_Xj~@?YrOs{wy6O=o^~پ9CGWZ{ APd e[M',OF;씪LJU '#(]1J%?# Q>E(΍0mw$h?(;.<%pg)c':O-Ǣ28H~bMb>_HifFM_iAjGu_V@ 8yK>wS?Ciy>b`tE:Aބy!H/ZakWl>S4Aƨ㼁7ũ׭.OQ+ٞV6M-.Wn gyB@T\ciW$wZu\  IӺYyziVR%Vx;Gjɯjomsh.p$%$h$߹'5A% Dp{6h7Fg>X@bYK;Kzː/˓Nh YѢ~N?o-r G hշƨڌ+B@/F7_V7Ty/FYY\ׂ[K֕1քtJ L+QڀOc>a5/Cuº F$#Є<+F"<7RUPz6pWYzo\>OYvsށ.Z_7nDL{yoB-!;WmN˽E:J'i'yg%Ur_*r*][Q[EQTP\ n4J+" .ʪ- 0.H,* VqV\9Tx/"_{/} Ol OXi$pv|{aXD,>%I$m(9~_< D9,w(J,FW~+T#wcbn/kzf`#_ pILHCQg\Z*r&<1GC Z^:T+!*BuФ(>(yl}41q<  ͆^_/<^kJPd*-.+/){"/ʳ;+8bmw o&+"H'( .i..0 zMwj%Rv<9 A T>4 !D 8I0ЃRO"OȀOܚ!8v<3yAL<cPvEEo`o@H(__E/o/\vjzl}dC7e+]))ׁAZ+C;(G'Gd}'OHF(?5̪T-JEF|Ew(UNГu=SrU*'i4dQ ;Cko5:u`zW5sF4@/߭0 e9mnvPeѸGJZ kd] ꃴfJ]]nz8ee_ư"c›}4 ۃvdPewwd>Ѭx6 |EElawX_1]ߌ@ݬ&( UOƆ֙v*ꫲsx7w~mq[u5 /Ұ}(Кu!lַ¬E";7DQ ,D _gxý9V+rEyؙEi|k*Օj/XֶxLCV|S*[ZSr0;  .^k(3%F?\z,x3`k39T~~5?XDYbqm_VF2Ż+P.U}sObؔ_3s~RsUn\/x^U}fa?=5p߇`,cgkAtK@oumJOFȰ& .Qm.;#G?s֔KWdiP_׸GTdUAy֥j՗J%J'NZZ?iOƾlB9$@wV̝.+noYTV!{רAZTNOxG#T̷B"_=EҚ'$#P>hN;Ũ1?Yi32BP6fO~b0%0NQ| x6qXR_c1^!>'OXF'a4k jғ(WA澟ƚkubyVs 9NT-W_n,x3lOѾ|ˎ Ț&}k>~y:Ttϓ L Ss͑1ׅ%}c4vB" z'-- zRUw*ȯj̝ɔ؇ԌYpy`eiVvZH)}_8<uXQde yc2sh雩?eT4GQU2;(WXiT\G*e*( QUl9OD%Mʵ(~:+c2B̘\'QBHBZ2RkR2BfykҒzeW^@FU(̲C{RTCvD2\ʲ}={b -_ii.e%f#L+r8?Y=k,$N0,D5#TоEO(y8i^ud\]ACop eM1͠_8S'-1J,HEtf Ɂ::-ߡ(ɢ0?G5D@="q_ᬕjvOQ/Jzn }z7yq'8|?'T'v&&xoYĵ~"DAڷc\g ͟!*qG~U `Hi%*G$q[rD .5ٮ+AS$:LʏF_Y4Fw h剿ϪmX'i]''C'|\ܬOu Ok 'Ett߆Oȥ˹OgIWI љ[x*k ?dx̐tnm4w*! 47Ob+ z4Xc _U+xԹߑٵߌ)>'->fe i7{x^?|{b},RY{uE-vDZWwk;({ձ#;T@oRqAqvJdEP(B4v4~ VSiURKvQɥS<<9zM?F΍D_Z"+m +_CE T|I>, ̇;@ P ?u} V:9*󭭓@Zu1>NUlRZHX9杖\KKK{Y:$'}2b,Ii.5E*9﫢\ݯ$}Kڮ{O1'y9k`3tǑkDcQume_Tu߸x>yjb a-|1ćey_. `}ݣBA9OF|PWb<{rVZwbجe\K2)4]$$vl<| 98U7+3KYlNJrTkYel'7j?]o6kK+d:̂m '6 'Cn,lK&_z"Z.1!*UVk'اF؋VjND1H}${)vرi5׹iJ{6}Q;lr"ve|C_Cz.4[Ǜ\;MkcmD _eyW8DJEߝzT<+fx~Pypd_Wؑ ȳ*|vZkm"-TGlcFk=X^I4gڃxug 4M<M~LԶhi3 ;3v$'K](w.u`]GƨEO֢c;vu͚!1"Px:HeggP's{mgGHկBeHфZF ꪟWW{?uo0#gf_loNz;;v#`s5חbPhZ otJ+GLh'y; c9`\_[6*wUOs׀fL&y=-\b%86/ldUfrg[di׼J.7uG> 8H&r"T!uMp9oS*CtO$FSd~i^zDܞvaoqAƆy{΃u|kjeNxZ,j?³"-o6 yETJiqtS4O/QJ$ʹ.E1&Vcib'fr(c74F(2 e|ꝚO q@^;|4Uʦzlk0N6am<,≐V+\cmpxʌk p󞥪eCZbqKkC'_d҉p0 ?mC "Qe .o|IJ<%Q1vg;JYfaM`9~0'r2E.Ex[nScxZY~51\e4k~?|Ӳ?Q&;|ݔ%(/ݭZ2bjy-2BV,#rThYdθήz={ :Tt-vǽAu!=qE`p"}cKIkQ]w3-#O`,`wQ-`mܧ E,+ccL`|kGcfoGTxt[A:<+gk]1Wp&#J*(ޏOI{,vASΊnGWGyd5-/~$Wn0ثּ:-rqiU7;}ny'AK|I^lja}T9As6-ܷfhg[ U` H9ˮ+*6T!yaYG7/?,ɾnK7 jA}͂zc3. 8A_xitNy2/t. |\(AH1/T\P&*Qk}EUiItb(c%vrQEԧn9*}y`9BUxֈ$}T*oٲފMZg 7sg/Eu~ݯzy7@\pCHEw0 F7!AQQqCFDY&0!(yh4BFL[LJLt0W{o׭{YG"kҊUd$lm)iO6msJ{*!g3ΒvvN'-R lNlJ Q:[YBmvM|=xwPg :[s9uŠK]nsKŃK3,iB!IGD@4#B"}=<~pOjCeỠHi<_,aB3oRYLhsih}iYs EϚnp/UagHs[ܼۻe1:ŏiF;* ߁+B\a۔'XעȝCcw8320tT&/z`me"}YvtUQ I{Ԑc[o6n3 aBcƩxWnÿ0ΉE~^^iO׽7@Pɇ`DA*}B' .0:,׵^1#~S l$4}X k~)⫬E؜/JAZcoEeI7*M̨aEث._ڈ>pnA\h(ĘEĆhMN|O̤ES5dBS~ӭ\h˅6lHVv,+4ib4Om6$aѤEhG( nއM/7^!m>6X4Ch-ڨES}nvzv4~"KggW4vJ\BZsIû$QIn2ꑨEE:zć,uoymO/wc|b0zhtTT ޘYYl^# B`JJhri["흕)sd4n!c^UsU ,bmUSCҊ?m'h=(`/7x: K8A n0gA]xIo{$X 9?)bnӑzAUHd٧# pƓ%@x]D:x!E4Y//ъܱ%䳨 y" e0^? rQt?!\7#N*i(6Ma _o* Ma)bkGF7&ka1M΅[a'M[V7-Z̦>޴U-~Mfna3¯4J 7_jouߘe1˛cwp/X&_yll;5BM΅y̪Ƙ5[}Hߪ+:s> )TVAŅ~E3<>׍^_ { /'}k#pmxi}%gOޑ dx"RJ}ъ {B4βod`nDŶRTZ*tX%UP*U /9s,gl<?c'V ` Y$H&y3\H!_:~k}y]wfb~fM" nAc,*"/E41UҭIu'_۱cn_ ِ}[^8&]&owTU=|'<ޱwyaP =mK:w Xm}}z0:YrI֌$32>~K;.;Yd0GݑX5f]2\2_y]gTe?YYzWɦN u/Y}Cu%=:B/0CsC>]gZg[6\1/eaFs;!:wD{V#:bdsĢN33X-gJ6~PBBZVŸT R܀o]+f[%vw *#ȮZQ*ݐ Uf"|nJ^} &ܜu2|>vTN\]'[ټ y.WdM ܥ~tۊ&-V/rufQ~71$cNKȒdLeYrU;~S _ 3N6{u;yWz?_2Ye]zluw'h'_\'Z;}{xjMd2%>tӯDܛgF,#pbq҈zA y Yxۧ:7Qd GTk+N+E)"|JԇyR7R z~^᛽x_O Kd8yvFxZ1x8bh{$L0,}iL ZiE뿰 QssD,m.}T"`];B,BBA=b V%*v 0ԉQޮ f1Wt\W(A{'1hľ,JĹTٜv,W>zai;5,\P }*4i93Vfť^)MKLUY8rM0Ohj,ME[nߧMWc7XJ]wuە~v߾/{<Ć|ށK>Ē>=XGO5aDpO 61,Kx c}_ߒg0PImb(+cVhYx9×Ƿq\[E<ˊx%<G<\CXŷѵgfA||X&oIiaCP&jb'3|;͗p9$ J߯3ARQQ(X53<|5\OVxk[*_cڔᛸE._BϳV-ޥP *|1Sk|hgju`P#G1ڰ* _†5e)e| #* *X"^ɖ N_7 zQ6Qe]5Wj& J7W~NL5W^*G)~-8Hݙ!lR Td8I:$iϐ g{GUd~FCHj 47Xؘ:Gcn6-gՄ&S+M^pL Yd82Pqi'&cBSkeiȳ[}ro! @Pj$V-ʳ_JfgZ={|S\SnR}"_M87E{Ӧg"JٜaH<+z+&Dҋ6[4yVhj̧Z򬴡 9:EH"nV;7Tl M+i8!4{߄&(]]KelG+pzjkxMpzu5OsXGVZ>*?:!V\dIN>Ě2_ct' rsIp$|lT Q ѣ|Rsp͵esQ ebA47a})z<^?(J9A,(W=}u;?ľyy[{!,2cy7Ql gSGfy4֗' ^v4"6eض*,_kO[ޥuR;ful%'UԯJ`_:n\nu/ C=/@t ]#^͵-HbD^'񲤌YRKs{S c]E:wj'2D9"΢ytjCCFqZ:&lQb"ㄢrKD*XEgiP_Q ͢_h}<4;mb;suƮ`#r`ґsҤ?m.uårB>?~:|/W@ 8Fsg`,J%kI5&}ǭ`slh_P寕~_˂ һM΄Se٣H㿊Ҋ\udrvMV'SF0)4o^ u9$_?uZB <=b.pJwk 48@:uA+ nh\`=w||atY |hϢ?Y*U Y=;HEJӽD> z}&%rOkɛ;}Gs/`صH7^Zjq5Ƽ&'Nc\~x[Mf,w}_ǹ\wkf'8_WCKJ@ ED}jqy;0FMl'g;A87/VuQ;:ug2RBF|}rl̗ޖ}tOhmMtM {{Zz|r['sD|DL%^,RCd}1z>,TCO!ߌ!J"7r>TF' .MO`zŻ`;ϼXZ_cf7i{Gl6gsv̑~rO8>,wN/e>jlL~us6$FktG?Hn}a&9-, ,,gTkş ?༞ZDWGL'my8ח)q=l綣b#u%}ncE a zBE;F9Qlsn<b127hEk&;|'}2$+Y/7u;ԄȬOy,m;y%Z]zɒ_kހ.u9&Vwcܽ;0+d>.Z<ѿ2cpepV;h_wpcnv}WB\RF+}V]oym.YGO@5[?7`UǁL+v]l}>ai`' BXV `6ƣόb`m/ǰ1VXg%aa +ilҰ\_xLʗ6W送zXv`!6S[iaV_2ɥe_=مq~ {Kul?nYqgr$#uӦܔw:|y}߽莏`K:Ų c xlMs"Y}E%:(Ol.8|M$`e%uJ S0`YĎ2P 8?WEyt[O;zv?u?S$g5YI Z7+pV63NUUۻɆU|&OMV}}ȧ)HHau;&7hv'DAsn t8Xi:0ҽT;_3j].sz w材O8d;k2f ڵ &_~&m3߬O8KlGaPx7"-gX"ȨK/{AUI?.$r1ͷyJZ,-Ĉ;>F4ѡ$q&?I,XvNDĢ[ʧ;Wr\ͽaCu!;F>\#*n  "n{ FO+u[<ݣ}ퟅtONp \/2GAշ i7a;(>ZkML!H&8#UHӧysMM3^} Ҋqގ'l'$;7BƴY]6YX.5]1Efo0~T~Z+`?݄v6,RuxvT0Bed?ԗk\)8Y/W{4/N0rF۰v[N-k#XiZTk=cXg[#:<-8&EdCOcE&'2اYYEN\d|r3,cePXdϫva ӂf <ڳ)>>2^Sewҟ"o^Oں"u+Qj~#j$Urd '_Į;xibȽ Kgi e|T6J~ڣ5;}Vܱ{Z^mQ?7l|{}|AS||ic|i zB>ȉqljN/0HhLrVq88߿tONwʲMm􎉖;_}%IkJClÊw}EζuEpe6b|Qs:gݠZy5җa?owUa3`O h Ȳn@%@dK&'A/Y\MLȞIY mH gy7* Rf"us:@s,|o/1/u6:&8A%g(zs`Nߨ^]r3ZN5 ?hZaozMKd<^'$ y˂p"_c{<'tA#d n%p(^rI?J]SdмY2_r2ԲOkfJٽErGaWrQtqb'٠ 9z}cF;oa9*|Pr7@Y.Ps{'/ղ>ji&xO cZygZݱ!js{oGm95-YƖƨS1-:zƮ)*x5Q]# 'h@Wӡ>^AEE/.R{N]d9@~AJ7]/S|XsLޡ{F襪4:蓺+O`ƽ5*/iK SszRrݵѷ. ?/{5^"w "TZ 3C>6ga8&Nh#y߈{YeqWƉ6>1E i"|Wj8"|poY9/4' DMnou8jEUӽh%SE??/3PZ:;0uiǻ=br~T F?bkLLnivZNqf;$~N slT8ײAR!#J}EN;Ɇ h zgf Z7;ْ[nws/sos]Z!d45w="9ȡvޙEyx{ydy} мHs& /OF'P߄ ~E ? 9 tE, '5OݞFʹ,8Rv 5n)"SRgJ *EkV*f#u/wiTk?3vbR5Q5.=uPɝ_A4np֮ 0K;PMՉMlokqomyt\t߸p~΋>կyj}wyk_m+q?݆^_` );&~ָMYcH}9iu$޷lUIռRh铲XЯt&ÿβ"=ݱaĝ^ӽ*[7zf˺'oVc<a}_"s:yxw>dǏ<<> !8! dQuV\=i#gc`iay>>8vb ;5ގ˛`IMe='?}'?&]'|Wuy4p@})WWv.QM\6^ƪbܑ8;2 jFu bckޢ̣<^kWu[U"" 2 "(;:*Fȸ*,p5Ȩ"QDݪM$'FL}~ocweE~c S}Zi / l(3¯DY6DEe+m~ fnMK.:Eh`g3mzF:AJ ]v[2T-,"of7D߼B$Fd̴fsV9]lԹc:{axyYW|ݳ /_1$:/@VpBͥc gg n85 9\Ycz;MnihErǸ_N.Fr.1ex+۲4}G; VAg++l}o;1;8X-KOF8هot1Ǽ'n#O \bER8̚F+yQklDzQ':% i:cԴUDOgًn2Od9V}Igjuv?42?ۗO>+NwIzw{ ?a2BgXn3+64i;Ɂ0fKcY:tCWSepttQ:lM1>a+ rl/p=Mz412ke#D3wg^ |=I4"K PXK-u>́n\,¿.rz r KGA7s^G.ZA ]!Xd?=!{ ܼ9"1U8|G9%uUw +MF7-ЈgZ#lCXu\hUco cXT,5s tbA %.,T`2Mۇ>as[#Xz,c?ЫayDR(@=c\$v=/'ِ® vLOz:>O ct]K  ˧r KXM/cӥ=J5_R٤^GkA'Px϶c!3p+0=+)u }&s3@4[륅]2J?WVRwldƈO.%uK݂ ~YXAY"-͢;h#vH%I/S >(tk~D-~/C^ h?ĊDv )rՎt3H[ts!Kp!s]sMp# j '2&mqqa #h Qq$J{aCgi/utȻO`M,_TBs bič%v"_$.5#eQ9"'b/v7RH>xVm+6 ky&U{mj;YOն҇z U'eS̢JCwD5ԩw`16[a|k:)Ki_]W8֯QIY3:efKMr355fSmSպY^9ӬHݜL>i5kmVgHzFfF'_r㿏bXi\zh, h 9+x}Bʩ5ʝg$쬪uv4Kv4rtг]؉=Y]di~+{7|rҹc3N JD_:U-]Lq8R21Az^^h^z rUZܡcGjB^eX!<-^<qoLdGM4we V1jaGsׁ nH==mh. "!U?GihÅC @4qp8y %@L1nI4lbd= AHoF৮E/j _o=z=3\A'xB}gJMS?sw N6AoY@_`{ܠn /yK>"At pE Lf`NMd`4^薇IT{D0Gaa&1>8zg.b3߾l98` o7N%Ȝ_XYml';F{'aɉ'^'{.N~bMtyXOzJgeB SPE Όj?(%YNwMೲ4 >U >m`k$/ҊFNߕ9"Ϋ?3Rg_)$m26zYR.~ /$mz/Z`a'j.⑻+O>eyfirz)I]S! Ng'Nz9%o8fMkmH4;9gw>J/rQsNts}y"t){\IRGs2>UJ͋@Qi[2ѥ7@-MHACnAY}eGV:+h7:,hZ'{D/=o&uh;Ƃ0FzmYB30nQ|.]eRh'Nޒ1*y55{8gum`Y5wY@郭zi[ߒ \orK۩=A_1O݅AA/0zOnx|ݘ4|^s`jopWh=Y<w8>+YÕN .Ƀr[Y[l[Y[jl?W{k]KJUtga::+h^daTБnZjWhc>mPu6c1 ܣD^i{f>iHTtR4(cb; ub!1Ę ;8k+ədkOKWdG\OEK}+q Vr8kmH_wؐv..n0nP[rC ^UքFј;s8DJK1p1~OOPN J ;8. gqd ac GR8pe\45׵v9@nӜYN 'HfK>gPt@zD=(r__N,F@iE@x#b gc`m1pqZضo9=' w+pR9)0 dsRRv 9ZOoS+G+ ˥J f7g9/0f Ӝfo}O›XFN,#8A". { Y<,'y1;ًl;b'l ^uڧm8sY?aõ$dqt۶%X:;$ G)+Um~#'K 'д t%Vٞ?_sYqLC{[1\`jocN1A:^f>E- 0‹$qJ3`.297ڄ8UW[#U:r-(`v`H0w֧i?aO2wkGymYgnoϳ~,,Eō̉ڜmw7w;y.Nd bg bV"=i%G2+1FډA UfsjxyGԿ~u #XO֯MD*<&D!d,Fd1bY̓$Y"7b2Y:VدRˁֲi4x/2#h:Kf[sKs/eS땦!|kFמe\`0:NRb j['F'WCIYTQWY\R׉U>>Hoi䨶=Yk{_?9žbX?㲧s2X}Wr;VP!o*Ud=#W'ܧ\W#AS2` l>Z:%#`#Jҕ%q:<\AinL 0R&ML$I:'?Y}dEbӢS53FKy`_#Ot:ӫ&sO=hH8+oyo#Hd/Dc;jLp[Y2ܘpV $`_f&E2}3pQ2z5@ٳkR/Q!FH^ӾkLRiiPn Wϻ  U7'Vh;Tuh FFj\Wd=U%޷n:9?SMuSMߟlNJjTvzBTnU=OTu]NŽYTOR}6 JcM1{RB*»ߚ43uMmxYyk[(0+*-(f7wIIiچM_. ]Z(Mׯ"<)Ź>9wssܤeZdq T9K79K jpR7.ĩ #;A{G*]BFy$T2(1+fg]>$uy#H%7"1^BNx*wP YQ1XU´޼CpSu$]Ĵ#<\і""]DuZS+lDLZ1:g y MeKϱ}2"/x:;KCGn<=ٍLM̅}Ddxۏ&?_[_uZ!3qjoG##&YCݙKYyfsgsg;3wfLTP\H@pAD+܈LH_$)@*Ҕ2p)%pE=w?g}^.ܳ=ϝ<~>d-sV'[fS\ v".H`yx|4w;ܞ DK|!/ 1NcQƔ(#C66TlR8,h,ěıERzAÏA *8& & Ϫٳ:XڇG:Sv.mZ緳d!vՅ]Șvs/b~ 4:~}"O1v,+,D-M!O`b7,RiDpX}}CjcH@E>p{whI_q{O>9x^Ԇw>bxHg|Ww4y?#Ȣ~Q]e>7$ oe~+O ",36װWT {]5!dвvg[/2|:r}'?gBXևu~vs;H]-N)L{7gc]\s^QE@Jl?N"iwJnLs;s2"αY3.}rYg ~r&Gz6T_E_d] xz>woi:BD>ފj~}Atot_K=FC)1~dY ~:Ep[OnNZ)iɎp<1Ϲ1y"|~ș=ӊ0qV3Y\½^LO6[~ Xm2m9Ȣ]x271)&9!*i"ô'\w%D2Uu[ 4b]$VT~?U1eƃca}_>N xKqYN ^_eڐwa鷹^dOfHm Z @5'`T#X/GĐccc‡s z2þ>;K @WUmzA'@֐zK,Ko.?|m#5BAU z0&Su J;zG?Ϋ:|vUip`ϽĄvN`C v[Ct&H>LXgןhD2Ie R#6r;iSiW'\Z wEg27mC{49QFT}5˪^͢ҏL^W^hhMv/7-M^ߗ< uJ1:J8>A7m-;At giIA6:N2i>ϵL`${‘6RoVdZi">>9P}n/}'sʜ,.5B4u{X%-Sm l|ѭ]gJC&߳Y~þyt PLAjzy4?Hމm6.N_oCGy'XBi3!o~e}%CP~o6O,۩ZMCdA75mTJYn_ZYE]C~zLnn7ZGEaog(:*2T*9MfxO#=JK}%R&Ȱw1R95yjwEV>PM5N1ٜziR.X'YTwgtGXi sfyOVuzW%]]WfoVY*u@A_sћ/Qߟ􁾲~5?_$ed Y6\z57F|שg% F >X'[6$@k_f'AAi{ۼR Evzh]fgYPsX[u]ֿ9V_'Y?s, Zz]60ZEҏ}X j]7s=0nik8Ʊ&~GBU.nȶJc!G+ighܑòpY6Kȕ%l3{ݫ zkåe"3+z>ͷK/6gjxulױ;]oYC6767.'޼AҴvUnI׿anSkġ]6-5Ɇ#{4VuEc1Rm;t7˨UBNh;TwV c =3oquԩmcQ=ҙe5lf]5vyEuW*Yu;U?UFohrBfdAdavљd6&>/86bt@1:ށշ`Wn,R槱o9+I.`םCcEExQ4 v,ߩ`>vT3Ֆu=͝Q?VoIMY~?(ЃyiDSPª[kxbT.GF=S#xd8UusnX s֯e0&sJT*l>4,ӪYMYTZjNU6^3_Wf9pR֨PEͧґ&KF3\OU .j>ݫWϢӆC3OoUSSEk?wa \}F] _}ڲ tP;@Ќ.:vs{*̎(n6& &e#΍]nz=G|,ɞUf[^IiZY|B?c64{7nX*oo{\߿!7 K_~չ y`P7n\jֻMoGI!.P0r0CoίZ:zS3Oښu\ɠ71uGuucfͱϴ4sTh.w.tMͧ6npJqj8{p9ήz&gi5<_9ÚVOnSe1uϜ.nճo< 8ݷ5*'z }3r3խ6%8:Vt7Y>ƒ~QНxUX}7[ l|Rj5Kӓ!&ԛo<1C DN*hFV"RuEfV{UR݄iDxv7ـlM \>бې pҿ`pP62LdP( #WIwah+C9X"µ]d7!3„YR1C1 N*>$_dX$Ų9!~&cXh3̑/e9|9 k仸]C?afeja^$^,ϷaӜ؎vY,^Ƨ-_Љ< rnn!$ aք^;Zcq,I`O~>Z NѼ؍yx[,6sػ߱6 XQD_YNp?Z}`D[*VߥXհ{D5ZcO2?4G&M6[PGU:՗&ެAm7"VdJdxTƪgf֕N31F4NXX, *=ev&*bJjS?wj\cz^\|}BO?zT)g2yv K8ֆM1SJ޷)HkS?k,֦Y=ls=-`w]DSlߩmW^6᩽jh_&;| Y? /^oz.2˸0zG)m0wis;>X͜ `p4=.iF,*D\4?v =J$w#4szfy ^.-ࡒ1`y)ݞJ`EϢҰF4Z>ε?ϝije-=k9K߿fVa/Nsa}GzAʋԟEΝ܆o >d?-?~v{E U n9Zn)0) eG<C#&i7 pBާ̺ 9*{,Ƣ Bz(=kk`m0d0U6w^775C&s]/?ăHo+CP;~4mS|ЛEX|ddz]ލ?2o^OVTjJkoE9<'T?GEoerQ^X`ǫdՔ4Ak5z+ǹ%Wl^~?}u7^a2tH;Úk9>l:"#b9^NTO`FGcaDz=IyWtc X:><KРdV차~_ c{k: yױ,ְyh*<޷uzM48Q[A4 EDGB4K4q_8#(K4 ( ¼S}LF?"msnU:w~gEQd m:x+][no!+1_[ Ԁ=N ӑDUG{FokZa?qDd 4J'f8XOgxWwd^_{mhsDw>(oFn?C'?Jg^S1WT9g"6@k%.CeZEl"Sk/#W{N|("S&O)S{j|CޜU='^aக1ݎl'6\zj?f;/e&%]` DK?5kƴ9Uj` dӾ>zw7,ȱsq7= T^b{i c@U7T5\5w?Fڍ4jXV87b=7YupzSsu##k%F+kq铷I}$"oN(3"k"M"EI"Oo}2Ҟ Hyyy)f26+f =s_OH~ JuF(6uq2 .sgn^yH[T8!CKC چmJ"soϏ°)¬cn^'EI;9Y'QAdJWE?+^nUOyj.s?eymu}?p_hj#s ͸Flk@'9x8GX z4;!tI:8RsoLKň$zxf}o˰lɢoax7e"|uQgi&^]m(,ƫF~%6cW!vd*/YAxp+ k7񥟱e)vxXzVշ~>XPhq \ׇbܬJ.~p E 򿿨37W#؄r5oo$;ٺXapryy?!E,U2}u\a:+h)UM6fto[X?5[/;=_8YGow𷆉1Xf.-0*]q4|8=?K1gtdfO3*3,].06W53ǗL]Y~lT?d:-Yo7:^]{Ao⥝tM ""&`F/ --߿ %1NLd1N!7:z4i<ˏ5R!,Ym,*ܿjF%ԯ%/c?mc6|#sFfN \Q.4[^t̝: 3{L==N C2K:_ZHO.O1-i4І:fe}˲mU?%?{gȖ7xL[fa~ 2ҙncwkI(u+-_e 11Ӣat aCcfx+ *&&E;WH{h h{h%Rқ5c ]%4+:s2'UJW*/e8_`vEnV6rEr~͹yWj(\34;ea+ s^vR:;"z8V:WRu"_%9}C꾠uq=4yweSn2 ҊpNj q{q3+,0Gc4~vx;u6#&^zȖQ!"ex mt[Ռw_{~ƲQp@c %]Mrrn7nk&;fYv5'2^&DZ'2^'=]5<'2ܙ;y;:b쾚l8P k^irY9)Kף7%翜c7 "J*ߦR G?hFyn:IE:H$;ҩ$(u[F#Wd^_`8/@pn PL"{SYx{ȒCJ&Rb1Aju6喖g'+@J *ؔcK1%X?U6ay^R~FflzV *iVpiKM.ݺ9W#d7()w)Y|pG,c Їu:̢(5ٔ`<^gk9<͉F*6_dp csyqp!Ւ0Fn4/㝌dy]!ퟐ*r}z*2_X?yΣؼ$i:KSg$BWړҭ/MKIR4Ia6(=yq poٖDnR~ݬ[WHyBK rWq:KiEiO-L{pU{_7%G[־_g*_auލ/I}N!ύvX~yNڻ' uy s^5Ld\߰wwݧRC[%oe >0cRD{Ubn1jVړw#/QVm KRۻ,u"KRCURX!񾊴"mPwmݫRWJs~{e4jԇn4+V:;+Qg+iv>W:uaͭ<\^`TcYOETE'ůҘ <2kEYҼ>d^Þ49kGM{)`ǺR5}j?f~K9oj06j229iebcgog=YX{%>'4[+ m<b?1+Nmu{j}8\t[TFXp1؟..g|ùEv/TU[5u|Ol_y,.2DC1A+mWi$hfdl h ;5.s5pm'E2ͧQ~lGALpF@%b;k[%OfhhίhÅ0anG{%l[XwVMMU_.z?濰WrC^E6Ii1SE6Tz)]i'˟=DSgBic U^/) PzBjRCUAdaeVV1V_d Ij_8d4C6 4WQs]J ßbU^?y- +%3?Ma-[ /6)RCF"2e#dQ~5\E&65af\zGت0ӗ;na҆댵Xzkυxnd^5 SZzg\D6J}UWHdҎޱVW-d;]a-,)6P "; @6`0ןG@x7GjL;_ǯSk)Aߪ 1nT `̓2{f7 )mc'T mc"ׇ?Z2cfYcN6d om礗u_7g'xį')zc>A|+7M&jo(>m7'@/ћ6t?huC.$wݞum`낗 Id ~5؜ !2# sWa$@w'_@w|@+uR艷R',#(6C 6incƧԯ~"h̑+d߷n@7_ .w#NNa>{P|7OK&!8wR18a:.u&j%m F'aM[Uj0gȤ3xxmfhwf!N%$5e7E* T5ׇ?_852晑t.zIsp0odF^&({қa[tj95aҡTaYZlB?M?Ƭ0&x(fAr?.Np8fbڞfXK9dl`w[Y#XþJC{7aƋ?.b?!!v%İIOdm~8bYRX83ú>;'tV?4T·ѣbnrԩS_ ِmDαR<\ o8L3}lnٷBׁa֖&z2;܅Qybs&`dߖ"ۑ_0j_Vzie]P<'u !ϝRoVCTU73?Pcןq\ AKO_%WMx?1]|¿%wȀJ؞?9 &`tEp ,<_p@ |oJ oJWA|P5QzDn 0?$V}@N|G:%bp>T"Z$JgQ|9&b}E -?yx֦ElH3C\Ey.mVLA^?\ƪ"4oA߬ṩ8+ssnwyWUߛtL٧3%a@L\1X٥$5$[0(i"h\ 5AH"qk?0ޛ=|E5xw1>lT#%QY][J7AHءw֔d?/B=i弳fxw=R6-߰8oormbpp%lc/}s5aj!G8VxT{rYN/Tu'5:bQaGu30169q|\1rup'xu̐9 ^ڐwiXw#=:y-V[/1NJEvH,#,Kh+NԅDC&rʭzʡnZ5/Enc[dC|$En*bE9=az!m2 1_ܟ}yB9ЇXiAۼM6ڎk\888x6hy5N ޱȉ!e']Jr+3mG^s5w3OҮcX@jp#BO2iH$ uE)Oi''<">FwJ2\ɢr+ ZjpWJg1L3_YAh<)Cy0/Љ;)?uw^jӴ"% uDO_ dY$rXB;  }_~~PJy&HDķ>&.H6! ΢eRSSɳa&;7s`> We)"7Wm3:z$BBr.[%l~37dEz w-&Msʫz'#VaH =Œe'k</7MϤFYwWvEZ$75bQ^A>Rmaj'&y@(OhwR{Y$_SD/]X7aCNmO2a݂׽??ECM0YCغwk:`Uy@$R>ܪ:ƭC{E7E -#mVކA@ݾ!CZIuCZX C"hE9HEBuH=~_ȝ1vX3N;b9&X8 F;DTt n)u?G:zcLm~m_q)u7cA)!%1>Cl/bګ|oYFmm ao) B'`C8v^WVK,Uo]2{Dq3kp]E=R2@-Iʏፙʡ:S*Z4kwi^֌M՝󆑙6BL ~o㕫2C3).FC]e'K!<\?X iyĘLS8yo2c ޗۄu¾ο ܫ2mݿK$>VNyo9)][؂sDHnfoK Ή8׀3wcC@v.NMP|Gdؘ1GqDO.5鑗+FsiFb> 'gm|9~_~3r|k@EOBVdigjnBn&& }n("{-[le֔eJJ =Jv*`845I57q!'vaF!1xϥG!#ZWemI)}nxT=iA-B q/okm Co[YFN<,1Sz|y-)4fevD6qr]. М~hRPalʭnߖ&Eؾ̱iĕ,GafEM݋++`wC|w$̡j$Qض"E- iI'Z/}9^ E s:&\cUnY[17&K}sq01Ra=drOEǭ-}AH`_"A}\\m {8X Bϊs uj_@@XxA @m>w:ߝ^wW/TZ/淃t_i$q:3XEszR2@6a9߶qEKջ#^ 3W눱r4?7sVPK/E_gcompr_symb_deleted_records.datUT XTXTux 횱U1 D[P@;)7v<Mb|}&|ӑ`q\ WeiQ?[3Sن*^ }$)`UMF$Ej$$)WɊ''UX~~j&eT|~G-a`fn?' Kv܂4E Y|6>ҸD2i)AV[hJH0BlZtnDBj!WUԅEԾu.ZZ|ꍝyM0Xщ tV6@4[N+-ʇti Q}m3T=G-!##t`W*ZyiJ`ӹ 7ດu'n$% qw ) ]U攻7zt`NݥNӜT$QU&)Ĵs7hI׆y]%*lMepȺ۴- B yc, V'pm ;w1zIA}ÐesyLC^Q_)nT8L N;(HT^ 2 -Ϣr n+(ӾX3 q$POhb#`ie38"A3KZp4.vlUyUQi=Bϖ_ؔzZI78-d2[Y%PpbiݞiA)n-9$'`}8LVK07N4(o^PK/EL;9 compr_symb_deleted_records.tabUTXTux PK/EKBcompr_symb_deleted_records.mapUTXTux PK/EE#@compr_symb_deleted_records.idUTXTux PK/E_gcompr_symb_deleted_records.datUTXTux PKzgdalautotest-3.0.4/ogr/data/invalid2.vrt0000644003401500001440000000030313614004466017575 0ustar rouaultusers poly.shp foo gdalautotest-3.0.4/ogr/data/gjmultiline.shp0000644003401500001440000000034013614004466020370 0ustar rouaultusers' pY@Y@@:Y@Y@@Y@@Y@?Y@@Y@@gdalautotest-3.0.4/ogr/data/arcgis-world-wfs.xsd0000644003401500001440000000260713614005351021245 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/describe_feature_type.xml0000644003401500001440000000175613614005351022415 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/test_3d.idf0000644003401500001440000000117513614004466017371 0ustar rouaultuserschs;ISO_LATIN_1 eoh; tbl;Node atr;NODE_ID;X;Y;Z;foo frm;decimal(10);decimal(9,7);decimal(9,7);decimal(9,7);string(1) num;2 rec;1;2;49;10;"U" rec;2;3;50;20;"U" end;2 tbl;Link atr;LINK_ID;FROM_NODE;TO_NODE;foo frm;decimal(10);decimal(10);decimal(10);string(1) num;1 rec;1;1;2;"U" rec;2;-1;2;"U" rec;3;1;-2;"U" rec;4;1;2;"U" end;1 tbl;LinkCoordinate atr;LINK_ID;COUNT;X;Y;Z;foo frm;decimal(10);decimal(4);decimal(9,7);decimal(9,7);decimal(9,7);string(1) num;1 rec;1;1;2.5;49.5;10;"U" rec;1;2;2.7;49.7;20;"U" rec;10;1;2.5;49.5;30;"U" end;1 tbl;Other atr;FOO frm;decimal(10) num;1 rec;1 end;1 eof;4 gdalautotest-3.0.4/ogr/data/test.e000000644003401500001440000001156313614004466016627 0ustar rouaultusersEXP 0 /HOME/ME/ARC/SAMPLE.E00 ARC 2 1 1 0 0 0 0 4 3.4009988E+05 4.1002000E+06 3.4040006E+05 4.1003995E+06 3.4090012E+05 4.1002000E+06 3.4070003E+05 4.1001995E+06 2 2 0 0 0 0 2 3.4029994E+05 4.1001998E+06 3.4009988E+05 4.1002000E+06 3 3 0 0 0 0 2 3.4050000E+05 4.1001998E+06 3.4029994E+05 4.1001998E+06 4 4 0 0 0 0 2 3.4070003E+05 4.1001995E+06 3.4050000E+05 4.1001998E+06 5 5 0 0 0 0 2 3.4019978E+05 4.1000000E+06 3.4029994E+05 4.1001998E+06 6 6 0 0 0 0 3 3.4050000E+05 4.1001998E+06 3.4059997E+05 4.1001002E+06 3.4070003E+05 4.1001995E+06 7 7 0 0 0 0 3 3.4070003E+05 4.1001995E+06 3.4079997E+05 4.1000002E+06 3.4019978E+05 4.1000000E+06 -1 0 0 0 0 0 0 LAB 2 1 0 3.4046650E+05 4.1002668E+06 3.4046650E+05 4.1002668E+06 3.4046650E+05 4.1002668E+06 2 0 3.4048869E+05 4.1000852E+06 3.4048869E+05 4.1000852E+06 3.4048869E+05 4.1000852E+06 -1 0 0.0000000E+00 0.0000000E+00 TOL 2 1 2 8.0756250E-02 2 2 0.0000000E+00 3 2 0.0000000E+00 4 2 0.0000000E+00 5 2 0.0000000E+00 6 2 8.0756250E+00 7 2 8.0756250E-01 8 2 8.0756250E-01 9 2 8.0756250E-01 10 2 8.0756250E-01 -1 0 0 0 0 0 0 SIN 2 EOX PRJ 2 Projection UTM ~ Zone 13 ~ Datum NAD27 ~ Zunits NO ~ Units METERS ~ Spheroid CLARKE1866 ~ Xshift 0.0000000000 ~ Yshift 0.0000000000 ~ Parameters ~ EOP IFO 2 LANDLI.ACODE 8 8 80 7 LANDLI-ID 4-1 14-1 8-1 50-1 -1 -1-1 1- XLABEL 4-1 54-1 8 2 60-1 -1 -1-1 2- YLABEL 4-1 94-1 8 2 60-1 -1 -1-1 3- SIZE 4-1 134-1 8 2 60-1 -1 -1-1 4- ANGLE 4-1 174-1 8 2 60-1 -1 -1-1 5- SZLBL 4-1 214-1 4-1 50-1 -1 -1-1 6- IFONTF 4-1 254-1 4-1 50-1 -1 -1-1 7- LABEL 52-1 294-1 52-1 20-1 -1 -1-1 8- 1 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 2 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 3 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 4 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 5 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 6 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 7 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 LANDLI.BND XX 4 4 16 1 XMIN 4-1 14-1 12 3 60-1 -1 -1-1 1- YMIN 4-1 54-1 12 3 60-1 -1 -1-1 2- XMAX 4-1 94-1 12 3 60-1 -1 -1-1 3- YMAX 4-1 134-1 12 3 60-1 -1 -1-1 4- 3.4009612E+05 4.0999870E+06 3.4090369E+05 4.1004052E+06 LANDLI.PCODE 8 8 80 2 LANDLI-ID 4-1 14-1 8-1 50-1 -1 -1-1 1- XLABEL 4-1 54-1 8 2 60-1 -1 -1-1 2- YLABEL 4-1 94-1 8 2 60-1 -1 -1-1 3- SIZE 4-1 134-1 8 2 60-1 -1 -1-1 4- ANGLE 4-1 174-1 8 2 60-1 -1 -1-1 5- SZLBL 4-1 214-1 4-1 50-1 -1 -1-1 6- IFONTF 4-1 254-1 4-1 50-1 -1 -1-1 7- LABEL 52-1 294-1 52-1 20-1 -1 -1-1 8- 1 1.6050000E+00 1.4490000E+00 7.0000000E-02 0.0000000E+00 5 0LARGE 2 1.6470000E+00 1.1520000E+00 7.0000000E-02 0.0000000E+00 5 0SMALL LANDLI.TIC XX 3 3 12 4 IDTIC 4-1 14-1 5-1 50-1 -1 -1-1 1- XTIC 4-1 54-1 12 3 60-1 -1 -1-1 2- YTIC 4-1 94-1 12 3 60-1 -1 -1-1 3- 1 3.4009244E+05 4.1000002E+06 2 3.4010028E+05 4.1004150E+06 3 3.4090753E+05 4.1003998E+06 4 3.4089972E+05 4.0999850E+06 EOI EOS gdalautotest-3.0.4/ogr/data/testavc/0000755003401500001440000000000013614004466017005 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testavc/testavc/0000755003401500001440000000000013614004466020456 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testavc/testavc/tol.adf0000644003401500001440000000017013614004466021726 0ustar rouaultusers=cA5?Nj?Nj ?Nj ?Njgdalautotest-3.0.4/ogr/data/testavc/testavc/arc.adf0000644003401500001440000000072413614004466021702 0ustar rouaultusers' H|JzAH6JzDHtJzAH[JzAH)~JzAH|JzAHBJzAH)~JzAH[JzAHBJzAHJz>H)~JzAHBJzAHNJz@H[JzAH[JzAHgJz>HJz>gdalautotest-3.0.4/ogr/data/testavc/testavc/bnd.adf0000644003401500001440000000002013614004466021665 0ustar rouaultusersHJz>LHtJzDgdalautotest-3.0.4/ogr/data/testavc/testavc/arx.adf0000644003401500001440000000023413614004466021723 0ustar rouaultusers' N2Rjgdalautotest-3.0.4/ogr/data/testavc/testavc/tic.adf0000644003401500001440000000006013614004466021705 0ustar rouaultusersHJz>HJzDHuqJzDHtwJz>Dgdalautotest-3.0.4/ogr/data/testavc/testavc/prj.adf0000644003401500001440000000026713614004466021732 0ustar rouaultusersProjection UTM Zone 13 Datum NAD27 Zunits NO Units METERS Spheroid CLARKE1866 Xshift 0.0000000000 Yshift 0.0000000000 Parameters gdalautotest-3.0.4/ogr/data/testavc/testavc/lab.adf0000644003401500001440000000024413614004466021670 0ustar rouaultusers' RH>PJzBH>PJzBH>PJzBHAJz?HAJz?HAJz?gdalautotest-3.0.4/ogr/data/testavc/info/0000755003401500001440000000000013614004466017740 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/testavc/info/arc0003.nit0000644003401500001440000000066013614004466021526 0ustar rouaultusersIDTIC  XTIC   YTIC    gdalautotest-3.0.4/ogr/data/testavc/info/arc0004.dat0000644003401500001440000000012013614004466021474 0ustar rouaultusers../testavc2/bnd.adf gdalautotest-3.0.4/ogr/data/testavc/info/arc0003.dat0000644003401500001440000000012013614004466021473 0ustar rouaultusers../testavc/tic.adf gdalautotest-3.0.4/ogr/data/testavc/info/arc0004.nit0000644003401500001440000000110013614004466021515 0ustar rouaultusersXMIN   YMIN   XMAX    YMAX    gdalautotest-3.0.4/ogr/data/testavc/info/arc.dir0000644003401500001440000000435013614004466021207 0ustar rouaultusersLANDLI.ACODE ARC0000 P  TESTAVC.BND ARC0001  XX LANDLI.PCODE ARC0002 P  TESTAVC.TIC ARC0003  XX TESTAVC2.BND ARC0004  XX TESTAVC2.TIC ARC0005  XX gdalautotest-3.0.4/ogr/data/testavc/info/arc0002.dat0000644003401500001440000000024013614004466021475 0ustar rouaultusers?p?x=\)LARGE ??t=\)SMALL gdalautotest-3.0.4/ogr/data/testavc/info/arc0005.nit0000644003401500001440000000066013614004466021530 0ustar rouaultusersIDTIC  XTIC   YTIC    gdalautotest-3.0.4/ogr/data/testavc/info/arc0002.nit0000644003401500001440000000220013614004466021515 0ustar rouaultusersLANDLI-ID  XLABEL  YLABEL   SIZE   ANGLE  SZLBL  IFONTF  LABEL 44 gdalautotest-3.0.4/ogr/data/testavc/info/arc0005.dat0000644003401500001440000000012013614004466021475 0ustar rouaultusers../testavc2/tic.adf gdalautotest-3.0.4/ogr/data/testavc/info/arc0001.nit0000644003401500001440000000110013614004466021512 0ustar rouaultusersXMIN   YMIN   XMAX    YMAX    gdalautotest-3.0.4/ogr/data/testavc/info/arc0001.dat0000644003401500001440000000012013614004466021471 0ustar rouaultusers../testavc/bnd.adf gdalautotest-3.0.4/ogr/data/testavc/info/arc0000.dat0000644003401500001440000000106013614004466021474 0ustar rouaultusers       gdalautotest-3.0.4/ogr/data/testavc/info/arc0000.nit0000644003401500001440000000220013614004466021513 0ustar rouaultusersLANDLI-ID  XLABEL  YLABEL   SIZE   ANGLE  SZLBL  IFONTF  LABEL 44 gdalautotest-3.0.4/ogr/data/testnumheader2.csv0000644003401500001440000000001013614004466020772 0ustar rouaultusers1,2 1,2 gdalautotest-3.0.4/ogr/data/placemark_in_root_and_subfolder.kml0000644003401500001440000000114013614004466024414 0ustar rouaultusers TopLevel clampToGround 2,49 3,50 SubFolder1 clampToGround 3,50 4,51 gdalautotest-3.0.4/ogr/data/placemark_with_kml_prefix.kml0000644003401500001440000000041013614004466023246 0ustar rouaultusers Simple placemark 2,49,0 gdalautotest-3.0.4/ogr/data/all_geoms.dat0000644003401500001440000000014213614004466017765 0ustar rouaultusersc ANAMEC gdalautotest-3.0.4/ogr/data/test_empty_last_field.xlsx0000644003401500001440000001712613614004466022646 0ustar rouaultusersPKN$Lxl/_rels/workbook.xml.relsMk0 FIc8AQ6ֵ~.[ eГH4C vV͢h%؀I/Z8Y.b;]JNɺQ/IӜS[n+Psc _{0 r3Rb+/2m=?"#ʯR6w _fz o ۭP~$E|PKOz%PKN$Lxl/sharedStrings.xmlMs@ :L? |@J McJL[]wwI_L[Gl]IHﲀg4Vj5NTgR'ޏDNw=}3IxsՕ4R؎P?;mJ4{VEfsDW~}RyrypTzo:r:n7HioZŢyFo:lpűc&ݲ|ךқ댷6 LAʔ6EY9*=/EAqUl\+'R+Q҉,VPV9q`sې<,R!tK( f5]`4 *bK|i=c;/[Q@ P8:m]nqChlA L^Xu3hH{N؁JgaXB26vFT,4See)=x[?a>{؜}K߂ۚLpQ0 A0x?o.?PKBɟ~ PKN$L#xl/worksheets/_rels/sheet1.xml.relsN1D{ڞ(4(|Yw-{AY $"QPn)|`f EoO7W^T uHZÊ+* Em#ڻq7+9qހ9}V%|^ *DgQ.1.?" V۫PKeD3PKN$Lxl/worksheets/sheet1.xmlŝ[oHW|_ռfĞȱ'l}ŖDbsɖ=ί&ER=3,=$L*d WIVX Cٌz IR| 6?R<_>yRoӵ?UY: j*D~⿼UX|.w)eps><ݿv-sUe ]ϓu.T9Qm?Vь5W)Eٔ8y>n̚k?!V$WC"^m9M^ĺKwʃ͡&,R{xˤUׅ5H'ktP]un^M\QKMB7SUk5~7_?\E9nf|yRuIgZ,,4共l[szTgEw-_%hIC޷$J2CIA%ݮk(1Elv]IP2 8~AW2ؕ׻ R2JFv޿dԕL%}޿dܕM%C߿$9[+p̣0Zр=Fѭ3ّ{[" kGCAt[#"qVD׊c1tkFdr#7cwkGd#UunUMA+}p9Od2UyPm/_65dSC675?3>5]vGaY?F#È~wqُ#>#È~Dxqݏ#~Gć ӆ:5hS1hcbzk{g&!DWClJ;މXgmgNY-|?k_[3CR̋^좟i!N 9u Bt lCN]m  ! ސb =]} =]]RgWC&鸞KАS!D!DSgCfjӟm'dC ! rp2! 1e#LS;H]=?a]YȭdW+++++++++++W.ȯ\_ rA~ +W.ȯ<_y @~+Wȯ<_y A~+W>ȯ|_ A~*UWȯ_ @~*UW!ȯB_ A~*D A~*UWȯ"_E @~+_E A~*U W1ȯb_ Q(EuPȨbF4꠨Q:(nAʹp;ʹ`;v0Èwb z'N(P;wBb ~'N(P<xB!b 'O(P P<yB!b '&O(NPO(~P=zB!bg(zbg(zbg(zbg(zbg(z{o<7ǣ xao>x Q =C1 3CP =C1 3CP =C1 3CP =C1 3CP =C1 3CP =C1 3CP =C1 ^r.LF˗Wzo{PNӬ.elտ$XYCu?UYe-e&zIzҩp䞫;պ}Qe?D! x%YjL&*(ͬm)vKAH5^(=(r̅S]M}ZVyVN~YL1M|R7_nWU7ioT<ߖUwԍ'tV)*Y%T7'ǏE}IUZ%WxJ]_B[Rn+Ye_D06Cl43*d[൧4xzUd$M677w[qOPKG *PKN$Lxl/workbook.xmlSr0}Wxp)0 5x&ɳl,y%@:e>͹3+Y8 *ׅP}{H3YR+,Y[9dZIe:xk:[mċV.7Zʘ9^Q"vP<$TO1]O$ hlnA+,GCݷ$g0]©gzE o:r;OOaKλ*; $f!(`!0nN}TD!l9(? քv.jo@"' Ѣ;RI@' %ُh̦ ZAn'dnӔ&lytPK: }$P.s̶q)w^_PK4\pPKN$L xl/styles.xmlX]o0}߯Bh]?ĴN՚J=8`~6-٤Rb|UApё f1Ox7ޞ@ b VX³/UEmJG9.<%fLȆ(&u=@g"*1_2I;|J6o 䉖3,/g+? 30Q)gkShЗOQ>21\-En۰KDB NΑOWW56*mP bM{^?BiZ K,ϫRr4uo3xK]wEw[y[$e!zW0ETbAW`S*M,HQ1$JB9etSzkzkzWk݂F{sh *KZEܐ( pQ sJ2VU5 9IS5e  ++dYGʹ; Kasd{"s^J7r>vѹiT;.#f|󂘝{ f1>SNG{fWj?qw'nWs}=)雗mlۿWmmaP`k D{-*šYB.,֫Isɋ,ـf% 証Rc:0Mg:9 h2o&PK ?PKN$L _rels/.relsN0 {*5@LH!4$năD Îq~bLn,0&K^UY&c}qy/6͢~8GRoC*rOJAʤ{tJ MKcd=@r]Uw2dYqgVMmk5nIz>3W"!vJL|8 e ye} 0HM!ӷ!阘rpbͼ0gt{M#}HL3_JZPK4PKN$LdocProps/custom.xmlMo0>[PT `4;ė{W4iYWdӗ6֕sJ3c p('"gvN 91h)zUBReՎM:1r&%enW jlP( Fh&ȱ@1$GmDKf'\tzmKsxay Ͳ SC ES8|!듍 1,2,3 4,5,6 gdalautotest-3.0.4/ogr/data/poly_indexed.ind0000644003401500001440000000400013614004466020505 0ustar rouaultusersqd a)) ě $/_ E ě1`A7?|dր `A7"5A7 8` cd dee e@ e`eef` 3504336935043408 35043409350434113504341235043413 35043414350434153504341635043423gdalautotest-3.0.4/ogr/data/poly.PRJ0000644003401500001440000000063713614004466016702 0ustar rouaultusersPROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["D_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]]gdalautotest-3.0.4/ogr/data/gmlsubfeature.gfs0000644003401500001440000000053113614004466020701 0ustar rouaultusers Object featureMember|TopLevelObject|content|Object 3 foo foo String gdalautotest-3.0.4/ogr/data/test_multi.gmt0000644003401500001440000000144713614004466020244 0ustar rouaultusers# @VGMT1.0 @GMULTILINESTRING # @R175/180.1/-45.4/-45 # @Je4326 # @Jp"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs " # @Jw"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.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]" # @Ntimer|id|name # @Tdatetime|integer|string # FEATURE_DATA > # @D"2010/10/27 6:08:48+13"|1|"feature 1" 175 -45 176 -45 > 180.0 -45.299999999999997 179.0 -45.399999999999999 > # @D"2010/10/27 6:08:48+13"|2|"feature 2" 175.099999999999994 -45.0 175.199999999999989 -45.1 > 180.099999999999994 -45.299999999999997 180.0 -45.200000000000003 gdalautotest-3.0.4/ogr/data/expected_tile.txt0000644003401500001440000000206513614004466020716 0ustar rouaultusers//$DELIMITER " " //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 2001} //$FIELDS Class=TILE;Subclass=TILE;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields IDSEL NOM WITHDATA Private#X Private#Y Private#Graphics -1 TILE TILE TILE 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 TILE TILE TILE 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 TILE TILE TILE 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 TILE TILE TILE 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 gdalautotest-3.0.4/ogr/data/bug2147_3R7D0889.0000000644003401500001440000012243313614004466017745 0ustar rouaultusers019593LE1 0900245 ! 34040000167000000010430167DSID1650210DSSI1130375DSPM1300488FRID1000618FOID0700718ATTF0590788NATF0680847FFPC0900915FFPT0861005FSPC0901091FSPT0891181VRID0781270ATTV0581348VRPC0711406VRPT0761477SGCC0601553SG2D0481613SG3D05316610000;& 3R7D0889.0000001DSIDDSIDDSSI0001DSPM0001FRIDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRIDFFPTFRIDFSPCFRIDFSPT0001VRIDVRIDATTVVRIDVRPCVRIDVRPTVRIDSGCCVRIDSG2DVRIDSG3D0500;& ISO 8211 Record Identifier(b12)1600;& Data Set Identification FieldRCNM!RCID!EXPP!INTU!DSNM!EDTN!UPDN!UADT!ISDT!STED!PRSP!PSDN!PRED!PROF!AGEN!COMT(b11,b14,2b11,3A,2A(8),R(4),b11,2A,b11,b12,A)1600;& Data Set Structure Information FieldDSTR!AALL!NALL!NOMR!NOCR!NOGR!NOLR!NOIN!NOCN!NOED!NOFA(3b11,8b14)1600;& Data Set Parameter FieldRCNM!RCID!HDAT!VDAT!SDAT!CSCL!DUNI!HUNI!PUNI!COUN!COMF!SOMF!COMT(b11,b14,3b11,b14,4b11,2b14,A)1600;& Feature Record Identifier FieldRCNM!RCID!PRIM!GRUP!OBJL!RVER!RUIN(b11,b14,2b11,2b12,b11)1600;& Feature Object Identifier FieldAGEN!FIDN!FIDS(b12,b14,b12)2600;&-A Feature Record Attribute Field*ATTL!ATVL(b12,A)2600;&-A Feature Record National Attribute Field*ATTL!ATVL(b12,A)1600;& Feature Record To Feature Object Pointer Control FieldFFUI!FFIX!NFPT(b11,2b12)2000;& Feature Record To Feature Object Pointer Field*LNAM!RIND!COMT(B(64),b11,A)1600;& Feature Record To Spatial Record Pointer Control FieldFSUI!FSIX!NSPT(b11,2b12)2000;& Feature Record To Spatial Recor Pointer Field*NAME!ORNT!USAG!MASK(B(40),3b11)1600;& Vector Record Identifier FieldRCNM!RCID!RVER!RUIN(b11,b14,b12,b11)2600;& Vector Record Attribute Field*ATTL!ATVL(b12,A)1600;& Vector Record Pointer Control FielsVPUI!VPIX!NVPT(b11,2b12)2000;& Vector Record Pointer Field*NAME!ORNT!USAG!TOPI!MASK(B(40),4b11)1600;& Coordinate Control FieldCCUI!CCIX!CCNC(b11,2b12)2200;& 2-D Coordinate Field*YCOO!XCOO(2b24)2200;& 3-D Coordinate Field*YCOO!XCOO!VE3D(3b24)00179 D 00049 220400010300DSID9103DSSI3694 3R7D0889.00010200901282009012803.1 1.02K?-Formatted by SevenCs ENC Designer-O@J00068 D 00039 21040001030DSPM263  00067 D 00046 12040001300VRID903SG2D912n |Gk 00067 D 00046 12040001300VRID903SG2D912nt݊Ls 00067 D 00046 12040001300VRID903SG2D912nwq 00067 D 00046 12040001300VRID903SG2D912n+vl 00067 D 00046 12040001300VRID903SG2D912nǂNo 00067 D 00046 12040001300VRID903SG2D912n -v#q 00067 D 00046 12040001300VRID903SG2D912 n!Sr 00067 D 00046 12040001300VRID903SG2D912 n"69l 00067 D 00046 12040001300VRID903SG2D912 n#Ck16l 00067 D 00046 12040001300VRID903SG2D912 n$?m 00067 D 00046 12040001300VRID903SG2D912 n%؁{m 00067 D 00046 12040001300VRID903SG2D912n&%n 00067 D 00046 12040001300VRID903SG2D912n'!io 00067 D 00046 12040001300VRID903SG2D912n(h͞o 00067 D 00046 12040001300VRID903SG2D912n)yUDq 00067 D 00046 12040001300VRID903SG2D912n*n?Lp 00067 D 00046 12040001300VRID903SG2D912n+>Wgr 00067 D 00046 12040001300VRID903SG2D912n,o 7s 00067 D 00046 12040001300VRID903SG2D912n-!Gq 00067 D 00046 12040001300VRID903SG2D912n.!Es 00067 D 00046 12040001300VRID903SG2D912n/Վq 00067 D 00046 12040001300VRID903SG2D912n0jK_s 00067 D 00046 12040001300VRID903SG2D912n1ۊq 00067 D 00046 12040001300VRID903SG2D912n2nլs 00067 D 00046 12040001300VRID903SG2D912n34r 00067 D 00046 12040001300VRID903SG2D912n4 s 00067 D 00046 12040001300VRID903SG2D912n5~s 00067 D 00046 12040001300VRID903SG2D912n61Mt 00067 D 00046 12040001300VRID903SG2D912nEL-p 00067 D 00046 12040001300VRID903SG2D912 nMCȶr 00067 D 00046 12040001300VRID903SG2D912!nNpC}l 00067 D 00046 12040001300VRID903SG2D912"xJtk 00067 D 00046 12040001300VRID903SG2D912#xx]6.n 00067 D 00046 12040001300VRID903SG2D912?x^H m 00067 D 00046 12040001300VRID903SG2D912@x_"j 00067 D 00046 12040001300VRID903SG2D912Ax`tj 00067 D 00046 12040001300VRID903SG2D912BxbʉBq 00067 D 00046 12040001300VRID903SG2D912Cxc-8u 00067 D 00046 12040001300VRID903SG2D912Dxfs 00067 D 00046 12040001300VRID903SG2D912Exgt 00067 D 00046 12040001300VRID903SG2D912Fxi!"ct 00067 D 00046 12040001300VRID903SG2D912Gxku 00067 D 00046 12040001300VRID903SG2D912Hxl%-v 00067 D 00046 12040001300VRID903SG2D912Ixmft 00067 D 00046 12040001300VRID903SG2D912Jxn}KPu 00067 D 00046 12040001300VRID903SG2D912Kxoj 00067 D 00046 12040001300VRID903SG2D912Lxp._5j 00067 D 00046 12040001300VRID903SG2D912Mxq=Jj 00067 D 00046 12040001300VRID903SG2D912Nxr6nJs 00067 D 00046 12040001300VRID903SG2D912Oxs"j 00067 D 00046 12040001300VRID903SG2D912Pxttj 00067 D 00046 12040001300VRID903SG2D912Qxutj 00067 D 00046 12040001300VRID903SG2D912Rxwej 00067 D 00046 12040001300VRID903SG2D912Sxx /s 00067 D 00046 12040001300VRID903SG2D912Txy\gYs 00067 D 00046 12040001300VRID903SG2D912Uxz`Nn 00067 D 00046 12040001300VRID903SG2D912Vx{jJ,p 00067 D 00046 12040001300VRID903SG2D912Wx|rYp 00067 D 00046 12040001300VRID903SG2D912Xx}q 00067 D 00046 12040001300VRID903SG2D912Yx~q 00067 D 00046 12040001300VRID903SG2D912ZxSs 00067 D 00046 12040001300VRID903SG2D912[x-8u 00067 D 00046 12040001300VRID903SG2D912\xms 00067 D 00046 12040001300VRID903SG2D912]xSs 00067 D 00046 12040001300VRID903SG2D912^x9s 00067 D 00046 12040001300VRID903SG2D912_x]u 00067 D 00046 12040001300VRID903SG2D912`xj 00067 D 00046 12040001300VRID903SG2D912axl%u 00197 D 00061 3204000100300VRID00903VRPT01912SG2D10531bx7x8j z}j  j j 6j Qj ~ k 7k r k j "j bjj 1j 00129 D 00057 220400010300VRID0903VRPT1912SG2D4131cxHx3jiQBk wi/>k j-k j%k kk 00253 D 00061 3204000100300VRID00903VRPT01912SG2D16131dxx9Jsk J}pk Kkk Ifk FHbk E[k 5F*Tk G'Lk H*Jk JHk }L5Ck +N;k Q1k R+k Vt%k X!k Zo k [lk F^j `j 00637 D 00061 3204000100300VRID00903VRPT01912SG2D54531exx>t S !t ct Kt t _t t Vt >t t 0=t mt 4t :t 9t mt nt Lft ؋1t Sԋu ы)u ΋,t ͋t +ʋ/t Ƌ$t nNjt a͋t YӋ7t [׋=t t 4$t t +t Lt ދt <ًt Uԋt ы˨t ^ϋjt K̋t ˋpt ̋t ΋t ֋t ًt ًt ؋~t ԋxt ԋot gۋjt S mt POst t ]t gt t t 6ԏt g-t t >wt t t 5t t at ct ^Jt 00185 D 00057 220400010300VRID0903VRPT1912SG2D9731fxxt Vt [t t :t |t t u Vu nt 6t t 00121 D 00057 220400010300VRID0903VRPT1912SG2D3331gxx#rk +#xk 'Yk *ǀk 00197 D 00061 3204000100300VRID00903VRPT01912SG2D10531hxxs 4s ͙s qRs ފƑs ڊ;s ֊s %Ԋs Պs ي3s s Fs s 00153 D 00057 220400010300VRID0903VRPT1912SG2D6531ixxE1Ss ,s )s &cs F&ss *s ,Hs 2.s 00145 D 00057 220400010300VRID0903VRPT1912SG2D5731j xxәs s &as >s *s \s ҥs 00161 D 00057 220400010300VRID0903VRPT1912SG2D7331k!xxuڎs rxs ns rn+s js m*s rs us 7ws 00177 D 00057 220400010300VRID0903VRPT1912SG2D8931l"xx#as U[s +@s $As Js Ts s^^s Als ss g rs 5'nps 00261 D 00061 3204000100300VRID00903VRPT01912SG2D16931m#xx$?ws (|s 3~s 5 s Z9s ;=s ;ԓs 3As Cqs Cs Ezs Byus =ss T>ms ?gs >Lcs 9Nes 6is 38ws 0xs -2vs 00405 D 00061 3204000100300VRID00903VRPT01912SG2D31331n$xxiHm5p iH?p VDp 8xDp [ye=p s:p p6p 8x:p yp 偈p 偈o o ro ro uo o ۠o No 2o ȏo |Ro uFo xo [y*o 4|o 4|o umo oo fo )c#o -_Vo XVo aPo Lo J}p ? p u<p R;}%p =*p 00213 D 00061 3204000100300VRID00903VRPT01912SG2D12131o2x<xA%u ?:u @twu @"su G@pu <gu G<bu 9Tu 4Eu 3Au 0/0u .]/u F+.,u &%u u 03593 D 00065 42040001000300VRID000903VRPT001912SG2D349731p5x@xyh7u ߷ȝu ׮lu 3u |su ❌rgu ׍'Gu |&+u y>'u vu cu &UWt Qt Ft ?t 6t 12t *t &t $Nt "t & t kt t t @t t k8t 3 t /t +Ks $`s is s s Js s Es s s s sVt tt t t ps gs us s ?Zs s s :s ls "s POs ^s s *s DAs {s s Vs s )s s s '&s =s Gs Tߊs =܊s Aڊs ؊ns ؊vs ֊s wԊs Ɗs sfs %s s s s 檊s $s As 9s Os s : s ¿ns s s t J* t V"t ٟ"t T t /t Rt s s Νs s [Fs s $s |ns s T.s 顊$s ߶s Ss Ws 吊Es a9s ~߬s Vys nwes w֜s ys (|Bs tΎs s ҅$s s ݊=s ,"s 59s 5s Cs is s Hs Ns ɦOs ̧s 騊Es 媊Ss ;s  s ȵs *s /s bs ws ࿊Ns -Ċus ʊs ʊ%s Zʊs .Ȋ0s Ŋs ws Ԟus _#us Dzs y~s _rs os ms m0s ns +ms lkes ds Xs H^s =Gs DDs C,s mCs E.s Ms N~s *O-s #Os 1Ls H8s Ds WAs ;s 3s 2s 2s 3s P5Xs %:s <s >5s ?s @&s @s p?7s <*t 8t 62t 42$t 3 't e2(t 0W)t .'t * t )4t (t (t D(t *dt W-}s .s /Cs .s $.}s /s f/s -s A"s s  s hs þs }s lٿs s s s Ms s s s ڹs #ִs Os s Eۉs bΉHs ˉ٥s Ɖs ‰s ̺s [s zs sYs gs ݒas s ͣs Ws O^s ؟s :s ~ߡs }ms }s X~fs B~s }s ts qRs os oos ps vs zs {s h{xs iss qs ot Blt He t aA t Y t jW t zV t Ut Vs s[Us [s ^s t^s ]s 9[s LUs -Sԩs P/s uNs Kfs >s /xs p']s s ]ns  s s >s s ]~s ks s Rs dEs s Ks ܽs %s |$Fs '6s "*s [*ns C)ҟs ')s s 1۝s s tFs = ѿs s )Ts s s s ٲs \os Ĩs D}s \ms ds {Ζs ݈*s >s [s 8s LIs ߴs s s zs rs ܶ qs $os als ]is ڗZs 팈Ws Ws $Ys w[s onc[s gYs 00105 D 00057 220400010300VRID0903VRPT1912SG2D1731q8x3xm`k `,k 00080 D 00049 220400010300VRID0903VRPT1912r<x4xM00080 D 00049 220400010300VRID0903VRPT1912s=x6x400080 D 00049 220400010300VRID0903VRPT1912t?x7x600080 D 00049 220400010300VRID0903VRPT1912u@x8x700080 D 00049 220400010300VRID0903VRPT1912vAx9x800080 D 00049 220400010300VRID0903VRPT1912wBx<xn00080 D 00049 220400010300VRID0903VRPT1912xExQxN00080 D 00049 220400010300VRID0903VRPT1912yFx@xQ00373 D 00061 3204000100300VRID00903VRPT01912SG2D28131zRxNxMPTu lKt d$t h8s ZQs Pr r 6Dxr |0r -r q $=|n  p 00145 D 00057 220400010300VRID0903VRPT1912SG2D5731cx^xUꥆ5m 6"m XHn $n [to  o /=Cp 00105 D 00057 220400010300VRID0903VRPT1912SG2D1731dx`xqMkj Ygj 00080 D 00049 220400010300VRID0903VRPT1912fxbxV00213 D 00061 3204000100300VRID00903VRPT01912SG2D12131gxRxb6s ɖr q r YG5s =ts js  Cs 6qr NE}r ċJr nhr Jq q zq C3q 00137 D 00057 220400010300VRID0903VRPT1912SG2D4931hxSxc20s UGt @=it ]Zlt ]t -<t 00097 D 00057 220400010300VRID0903VRPT1912SG2D0931ixcxnD2iu 00097 D 00057 220400010300VRID0903VRPT1912SG2D0931kxfxx Zs 00113 D 00057 220400010300VRID0903VRPT1912SG2D2531lxgxl\mu DFu )v 00105 D 00057 220400010300VRID0903VRPT1912SG2D1731mxgxf-t ז7t 00097 D 00057 220400010300VRID0903VRPT1912SG2D0931nxixk#(tu 00161 D 00057 220400010300VRID0903VRPT1912SG2D7331oxmxf]t Jt Y}u 0ƒt 3t  u Qt ̄t Ls 00121 D 00057 220400010300VRID0903VRPT1912SG2D3331pxox^ j Ik $3_l ,Npl 00177 D 00057 220400010300VRID0903VRPT1912SG2D8931qxpx_8j }j ً2j ~Ջk ҋk Xj Dj $kij |%j N@k 3%j 00113 D 00057 220400010300VRID0903VRPT1912SG2D2531rxrxRFM-s +6s  Xs 00080 D 00049 220400010300VRID0903VRPT1912sxox900080 D 00049 220400010300VRID0903VRPT1912txqxw00080 D 00049 220400010300VRID0903VRPT1912uxpxq00105 D 00057 220400010300VRID0903VRPT1912SG2D1731vxrxpV!k 0 j 00097 D 00057 220400010300VRID0903VRPT1912SG2D0931wxnxru 00080 D 00049 220400010300VRID0903VRPT1912xxkx@00080 D 00049 220400010300VRID0903VRPT1912yxlxk00097 D 00057 220400010300VRID0903VRPT1912SG2D0931zxmxltҀ8v 00080 D 00049 220400010300VRID0903VRPT1912{xsxt00105 D 00057 220400010300VRID0903VRPT1912SG2D1731|xuxwj @j 00097 D 00057 220400010300VRID0903VRPT1912SG2D0931}xwxo_<j 02545 D 00065 42040001000300VRID000903VRPT001912SG2D244931~xxxH{\+s Yy4*s t%s q#s Oehs @[s ?ws 5i s O,1s V#r ar r r er cr r r xr -ɰr /r tHr 7FOo )>vKo *>?o l>=o ?T;o @l:o @9o 7?K5o /;.o 6z(o /] o -o O,o [*o f*Z o +3 o -o 41n G1n /n -n ,n *n \(nn G%n "n p!n jn Ybn 8ڭn an n en *{n % un v kn ""en Q`n \n *Zn Xn PmUn Sn TPn 0Nn EGn =Dn "?n 6n 97/n LZ"n %n }n : n ݁Hn ӁCm ΁m x́6m !́m 2́m ́m &́m aʁmm ǁm >Łom Jā-m C̣m xSm ޾#m m ׻m Z}m vm om ᲁVdm ﰁ_m jm[m Pm D:Mm Fm bBm %=m 䧁rAs !?s @s r?s ,As Æ:Fs !EGs bGs Fs RqIs diLs ke Os 1cQs ?aUs D_![s ]as U]Yhs [ks NYns H\ys E@Ms c:hs `4s +Ws |&cs D$s %$9s %s )s 8Ёs =3}s Wjs @[Ces [bs 3Z[s W$Vs USs IMIs D>Fs R=Bs *n aF4n _N/n ^+n ^#n ZIn &V n Un STn MRm Qm [Pcm Nm N m Km Bm %=m ;ơm 8mm 6.lm u-ym /m 1m 5wm 5pm t5gm 2Tm 2LLm 31tl "1kl 1(l 1l 1l ^0+l >0$l 0l 0l /l X/l /|l -ol c-Gil .Yl 0/(Nl +/Bl ?-=l -;l -2l 1l 1l D10l .0k E(k J(9k (k 5,k /k 1k >23k 12k 1Gk {.Zk )k R)5k V)3k )k 9+k ~4k ;$k ==k G?k IC-k D5k F֔k SIvk K6~k Lyk Kxk JTuk 00121 D 00057 220400010300VRID0903VRPT1912SG2D3331xzx]F1n -aZWn /gn #Fn 00997 D 00061 3204000100300VRID00903VRPT01912SG2D90531x{xzi+p m(p <$p  p  p #p J#$p !p Bp p ۄH p քp ӄep (τp ̄p ˄p ȄPo „o ޾o %o o o ⠄fo (o mo 'o l0o Lo o o o o 4o ʻo ~Po T~No |o >|Jo xLo fvto Bspo Pmo euo L\Vo S[o P*o FԄo B(o dBoo 2B$|o {A0xo @wo <wo <;vo 8to 6to 4qo d3po 1po 6/mo X.ko o) fo &eo $Ffo "Veo ! do Uao ]o [o Wo )Uo So Z]So vANo Q Mo Ko 6 tHo Bo gAo Ed>o qp ?p 5p >p p ݇ q ݇q ۇq ӇR%q Ї'q Ї/q χ(1q ·2q ʇ5q DÇ5q 6q 6q ;q d Cq Nq !Xq u]q ޔkq 8mq Бgnq inq nq jhq <\q 5s[q ,Wq ,"Rq CNq Lq 0DKq Iq J Eq Aq 5߆:Aq نAq ؆:Aq 4ֆZ>q Ԇ=q φ?p ;p $9p A6p A4p r0p -p %-p 00837 D 00061 3204000100300VRID00903VRPT01912SG2D74531x}x|үq q mq ļq b|q ͑Gq ㏉yq )q ≉q q q #q @z)q cfq AYcq Nq IJjq G q Dq }?Pq U;q 8>q 3q h2wq /q N-mq A,!q #ަq q pYq %q q Pq q Cq q }tq :2q ˯Zq ܔq Ptq \ߒq בq eq ~q \q ΍q M͈q yq wq u~q tzq gtwq |tqq uPlq qVq qRq irMq pHq q$Gq rcDq w@q 4y=q G|0q {[.q A|!q }q ~q q Dp .p 끈Ep ဈp I}p A{p LzJp 4z-p yp wp Tw-p 9wp 6vp tp }tp rp mp mUp oBp rp /u }p N~np ~)gp x_p 00080 D 00049 220400010300VRID0903VRPT1912x~xV00105 D 00057 220400010300VRID0903VRPT1912SG2D1731xxjs }s 00080 D 00049 220400010300VRID0903VRPT1912xx00080 D 00049 220400010300VRID0903VRPT1912xx02497 D 00065 42040001000300VRID000903VRPT001912SG2D240131xx}€s |4s xs xs ys {ss s Ms ۻs Ǎs p=s ɞڍs As s ͭ9ss Qps 髍/os ns }fms wIls D.es cs Wbs ]s e\s [s 9wZs :Vs fRs 轍SMs 6Ds 3Bs j@s )>s ]=s  ߍfs s s s Vcs ~s Hs s (s 1Js z|s s Us g s d s  s s p܍ s ֍!s G΍s ˍr Ǎpr ;Ǎr AǍVr Ǎr ɍhr v΍r Cύr Pύ r ΍r ʍr ɍr ƍFr ōr r Br r 2sr r r r Rr Or pr &r r r 4r s]s  s  s es 맍s Rs ).s #s ls ks ]s *s }s ЃSs s X|s ?x s s,s Jr6s "r4s fsis yF&s l,s .s (a1s g8s s7;r t;r :r 6r 4r u1r +%r r 4Wr r r ` jr r r r )r ~r }r 1_{r xr ߋor Z؋kr ŋ\r 7Xr !YRr Mr ?Lr [Jr ϓ>r P7r z6r w6r )ti8r Wq gdalautotest-3.0.4/ogr/data/za.sua0000644003401500001440000000532713614004466016467 0ustar rouaultusers# Cut to 1 airspace by E. Rouault # # Airspace for South Africa # File created Sunday, 29 November 2009 at 12:15 GMT # Latitudes from -34.7 to -22.2 and Longitudes from 16.5 to 32.6 extracted from # # Airspace for South Africa # Courtesy of Iain Baker # iainzbaker@googlemail.com # Dated 17 November 2009 # # >>>>>>>>>> UNOFFICIAL, USE AT YOUR OWN RISK <<<<<<<<<< # # Do not use for navigation, for flight verification only. # # Always consult the relevant publications # for current and correct information. This # service is provided free of charge with # no warrantees, expressed or implied. # User assumes all risk of use. # # Original filename: SAGlidingAirspace16Feb09.txt # # Winpilot format airspace file for gliding at New Tempe RJR 10th Dec 2002 # reVised RJR 10/1/2005 # reVised DB 11/2/2006 # reVised DB/RJR 13/11/2006 # reVised QM 27/11/06 Jhb gliding CTA and TMA window replaced. lanseria TMA added. # reVised RJR 28/11/06 # new Kimberley TMA-A 9th dec 2007 # reVised RJR 14/12/07 to include all known modifications to local airspace # Valid from 20th Dec 2007 # reVised RJR/DB 20/12/07 with corrections from Peter Howe # revised RJR 24/12/07 to make it work for Winpilot # winpilot version RJR 26/12/07 # revised RJR 12/2/2009 to include FAR20,FAR23 and FAR25 # revised RJR 16/2/2009 Durban # no liability for use hereof. # # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ INCLUDE=YES TYPE=CTA/CTR TITLE=KIMB TMA-A 123.8 BASE=5500ALT TOPS=FL145 CIRCLE RADIUS=20.00 CENTRE=S284800 E0244537 # # new Kimberley TMA-B 9th dec 2007 # AC B # V T=1 # AN KIMB TMA-B 123.8 # AL FL085 # AH FL145 # DP 28:44:06 S 025:19:28 E # V X=28:48:00 S 024:45:37 E # V D=+ # DB 28:44:06 S 025:19:28 E, 29:16:23 S 024:34:20 E # DP 29:16:23 S 024:34:20 E # DP 29:07:26 S 024:40:03 E # V X=28:48:00 S 024:45:37 E # V D=- # DB 29:07:26 S 024:40:03 E, 28:48:43 S 025:08:22 E # DP 28:48:43 S 025:08:22 E # DP 28:44:06 S 025:19:28 E # # new Kimberley TMA-C 9th dec 2007 INCLUDE=YES TYPE=CTA/CTR TITLE=KIMB TMA-C 123.8 BASE=FL085 TOPS=FL145 POINT=S284406 E0251928 POINT=S284406 E0251928 CLOCKWISE RADIUS=30.00 CENTRE=S284800 E0244537 TO=S281924 E0245610 POINT=S281924 E0245610 POINT=S282758 E0244424 POINT=S282758 E0244424 CLOCKWISE RADIUS=20.00 CENTRE=S284800 E0244537 TO=S284843 E0250822 POINT=S284843 E0250822 POINT=S284406 E0251928 # END gdalautotest-3.0.4/ogr/data/polygonm_with_m.shp0000644003401500001440000000103013614004466021255 0ustar rouaultusers'  ??$@T@P?????$@D@$@4@>@D@?????????????$@T@$@4@>@D@I@N@Q@T@gdalautotest-3.0.4/ogr/data/global_geometry.xml0000644003401500001440000000150313614005352021223 0ustar rouaultusers 49 2 50 3 49 2 50 3 gdalautotest-3.0.4/ogr/data/spline_closed.dxf0000644003401500001440000000343213614004466020664 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 SPLINE 5 24B 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1067 71 3 72 11 73 7 74 5 42 0.0000000001 43 0.0000000001 44 0.0000000001 12 -0.7071067811865475 22 0.7071067811865478 32 0.0 13 -0.7071067811865475 23 0.7071067811865478 33 0.0 40 0.0 40 0.0 40 0.0 40 0.0 40 2.0 40 4.0 40 6.0 40 8.0 40 8.0 40 8.0 40 8.0 10 14.0 20 2.0 30 0.0 10 13.52859547920897 20 2.471404520791031 30 0.0 10 13.48774479462473 20 4.512255205375272 30 0.0 10 16.5 20 4.5 30 0.0 10 16.51225520537527 20 1.487744794624727 30 0.0 10 14.47140452079103 20 1.528595479208968 30 0.0 10 14.0 20 2.0 30 0.0 11 14.0 21 2.0 31 0.0 11 14.0 21 4.0 31 0.0 11 16.0 21 4.0 31 0.0 11 16.0 21 2.0 31 0.0 11 14.0 21 2.0 31 0.0 0 SPLINE 5 24C 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1067 71 3 72 11 73 7 74 5 42 0.0000000001 43 0.0000000001 44 0.0000000001 12 -0.7071067811865475 22 0.7071067811865478 32 0.0 13 -0.7071067811865475 23 0.7071067811865478 33 0.0 10 14.0 20 2.0 30 0.0 10 13.52859547920897 20 2.471404520791031 30 0.0 10 13.48774479462473 20 4.512255205375272 30 0.0 10 16.5 20 4.5 30 0.0 10 16.51225520537527 20 1.487744794624727 30 0.0 10 14.47140452079103 20 1.528595479208968 30 0.0 10 14.0 20 2.0 30 0.0 11 14.0 21 2.0 31 0.0 11 14.0 21 4.0 31 0.0 11 16.0 21 4.0 31 0.0 11 16.0 21 2.0 31 0.0 11 14.0 21 2.0 31 0.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/insert-too-many-errors.dxf0000644003401500001440000000023713614004466022420 0ustar rouaultusers0 SECTION 2 HEADER 0 ENDSEC 0 BLOCKS 0 BLOCK 2 x 0 INSERT 71 7 0 unknown -1 0 BLOCK 0 DIMENSION 0 INSERT 71 755 0 unknown -1 0 BLOCK 2 0 0 DIMENSION 2 x 0 0 gdalautotest-3.0.4/ogr/data/choicepolygonmultipolygon.xsd0000644003401500001440000000231313614005352023373 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/poly.dbf0000644003401500001440000000102113614004466016766 0ustar rouaultusersv (AREAN EAS_IDN PRFEDEAC 215229.266 16835043411 247328.172 17935043423 261752.781 17135043414 547597.188 17335043416 15775.758 17235043415 101429.977 16935043412 268597.625 16635043409 1634833.375 15835043369 -596610.313 16535043408 5268.813 17035043413 gdalautotest-3.0.4/ogr/data/huge_geom_gml_sparse.xml0000644003401500001440000000121013614005352022216 0ustar rouaultusers 2200000148 huge_geom_start.gml 0 0 718 718 2199999282 32 huge_geom_end.gml 2200000000 0 148 gdalautotest-3.0.4/ogr/data/gxmultitrack.kml0000644003401500001440000000107213614004466020557 0ustar rouaultusers layer feature clampToGround 2013-05-28T12:00:00 2013-05-28T13:00:00 2 49 3 50 gdalautotest-3.0.4/ogr/data/archsites.xsd0000644003401500001440000000255713614005353020046 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/header_extended.dxf0000644003401500001440000002446413614004466021161 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1018 9 $ACADMAINTVER 70 0 9 $DWGCODEPAGE 3 ANSI_1252 9 $INSBASE 10 0.0 20 0.0 30 0.0 9 $EXTMIN 10 30.0 20 49.75 30 0.0 9 $EXTMAX 10 130.5 20 163.1318914119703 30 0.0 9 $LIMMIN 10 0.0 20 0.0 9 $LIMMAX 10 12.0 20 9.0 9 $ORTHOMODE 70 0 9 $REGENMODE 70 1 9 $FILLMODE 70 1 9 $QTEXTMODE 70 0 9 $MIRRTEXT 70 1 9 $LTSCALE 40 1.0 9 $ATTMODE 70 1 9 $TEXTSIZE 40 0.2 9 $TRACEWID 40 0.05 9 $TEXTSTYLE 7 Standard 9 $CLAYER 8 0 9 $CELTYPE 6 ByLayer 9 $CECOLOR 62 256 9 $CELTSCALE 40 1.0 9 $DISPSILH 70 0 9 $DIMSCALE 40 1.0 9 $DIMASZ 40 0.18 9 $DIMEXO 40 0.0625 9 $DIMDLI 40 0.38 9 $DIMRND 40 0.0 9 $DIMDLE 40 0.0 9 $DIMEXE 40 0.18 9 $DIMTP 40 0.0 9 $DIMTM 40 0.0 9 $DIMTXT 40 0.18 9 $DIMCEN 40 0.09 9 $DIMTSZ 40 0.0 9 $DIMTOL 70 0 9 $DIMLIM 70 0 9 $DIMTIH 70 1 9 $DIMTOH 70 1 9 $DIMSE1 70 0 9 $DIMSE2 70 0 9 $DIMTAD 70 0 9 $DIMZIN 70 0 9 $DIMBLK 1 9 $DIMASO 70 1 9 $DIMSHO 70 1 9 $DIMPOST 1 9 $DIMAPOST 1 9 $DIMALT 70 0 9 $DIMALTD 70 2 9 $DIMALTF 40 25.4 9 $DIMLFAC 40 1.0 9 $DIMTOFL 70 0 9 $DIMTVP 40 0.0 9 $DIMTIX 70 0 9 $DIMSOXD 70 0 9 $DIMSAH 70 0 9 $DIMBLK1 1 9 $DIMBLK2 1 9 $DIMSTYLE 2 Standard 9 $DIMCLRD 70 0 9 $DIMCLRE 70 0 9 $DIMCLRT 70 0 9 $DIMTFAC 40 1.0 9 $DIMGAP 40 0.09 9 $DIMJUST 70 0 9 $DIMSD1 70 0 9 $DIMSD2 70 0 9 $DIMTOLJ 70 1 9 $DIMTZIN 70 0 9 $DIMALTZ 70 0 9 $DIMALTTZ 70 0 9 $DIMUPT 70 0 9 $DIMDEC 70 4 9 $DIMTDEC 70 4 9 $DIMALTU 70 2 9 $DIMALTTD 70 2 9 $DIMTXSTY 7 Standard 9 $DIMAUNIT 70 0 9 $DIMADEC 70 0 9 $DIMALTRND 40 0.0 9 $DIMAZIN 70 0 9 $DIMDSEP 70 46 9 $DIMATFIT 70 3 9 $DIMFRAC 70 0 9 $DIMLDRBLK 1 9 $DIMLUNIT 70 2 9 $DIMLWD 70 -2 9 $DIMLWE 70 -2 9 $DIMTMOVE 70 0 9 $LUNITS 70 2 9 $LUPREC 70 4 9 $SKETCHINC 40 0.1 9 $FILLETRAD 40 0.5 9 $AUNITS 70 0 9 $AUPREC 70 0 9 $MENU 1 . 9 $ELEVATION 40 0.0 9 $PELEVATION 40 0.0 9 $THICKNESS 40 0.0 9 $LIMCHECK 70 0 9 $CHAMFERA 40 0.5 9 $CHAMFERB 40 0.5 9 $CHAMFERC 40 1.0 9 $CHAMFERD 40 0.0 9 $SKPOLY 70 0 9 $TDCREATE 40 2455343.56230316 9 $TDUCREATE 40 2455343.728969826 9 $TDUPDATE 40 2455343.562303171 9 $TDUUPDATE 40 2455343.728969838 9 $TDINDWG 40 0.0000000116 9 $TDUSRTIMER 40 0.0000000116 9 $USRTIMER 70 1 9 $ANGBASE 50 0.0 9 $ANGDIR 70 0 9 $PDMODE 70 0 9 $PDSIZE 40 0.0 9 $PLINEWID 40 0.0 9 $SPLFRAME 70 0 9 $SPLINETYPE 70 6 9 $SPLINESEGS 70 8 9 $HANDSEED 5 44 9 $SURFTAB1 70 6 9 $SURFTAB2 70 6 9 $SURFTYPE 70 6 9 $SURFU 70 6 9 $SURFV 70 6 9 $UCSBASE 2 9 $UCSNAME 2 9 $UCSORG 10 0.0 20 0.0 30 0.0 9 $UCSXDIR 10 1.0 20 0.0 30 0.0 9 $UCSYDIR 10 0.0 20 1.0 30 0.0 9 $UCSORTHOREF 2 9 $UCSORTHOVIEW 70 0 9 $UCSORGTOP 10 0.0 20 0.0 30 0.0 9 $UCSORGBOTTOM 10 0.0 20 0.0 30 0.0 9 $UCSORGLEFT 10 0.0 20 0.0 30 0.0 9 $UCSORGRIGHT 10 0.0 20 0.0 30 0.0 9 $UCSORGFRONT 10 0.0 20 0.0 30 0.0 9 $UCSORGBACK 10 0.0 20 0.0 30 0.0 9 $PUCSBASE 2 9 $PUCSNAME 2 9 $PUCSORG 10 0.0 20 0.0 30 0.0 9 $PUCSXDIR 10 1.0 20 0.0 30 0.0 9 $PUCSYDIR 10 0.0 20 1.0 30 0.0 9 $PUCSORTHOREF 2 9 $PUCSORTHOVIEW 70 0 9 $PUCSORGTOP 10 0.0 20 0.0 30 0.0 9 $PUCSORGBOTTOM 10 0.0 20 0.0 30 0.0 9 $PUCSORGLEFT 10 0.0 20 0.0 30 0.0 9 $PUCSORGRIGHT 10 0.0 20 0.0 30 0.0 9 $PUCSORGFRONT 10 0.0 20 0.0 30 0.0 9 $PUCSORGBACK 10 0.0 20 0.0 30 0.0 9 $USERI1 70 0 9 $USERI2 70 0 9 $USERI3 70 0 9 $USERI4 70 0 9 $USERI5 70 0 9 $USERR1 40 0.0 9 $USERR2 40 0.0 9 $USERR3 40 0.0 9 $USERR4 40 0.0 9 $USERR5 40 0.0 9 $WORLDVIEW 70 1 9 $SHADEDGE 70 3 9 $SHADEDIF 70 70 9 $TILEMODE 70 1 9 $MAXACTVP 70 64 9 $PINSBASE 10 0.0 20 0.0 30 0.0 9 $PLIMCHECK 70 0 9 $PEXTMIN 10 1.000000000000000E+20 20 1.000000000000000E+20 30 1.000000000000000E+20 9 $PEXTMAX 10 -1.000000000000000E+20 20 -1.000000000000000E+20 30 -1.000000000000000E+20 9 $PLIMMIN 10 0.0 20 0.0 9 $PLIMMAX 10 12.0 20 9.0 9 $UNITMODE 70 0 9 $VISRETAIN 70 1 9 $PLINEGEN 70 0 9 $PSLTSCALE 70 1 9 $TREEDEPTH 70 3020 9 $CMLSTYLE 2 Standard 9 $CMLJUST 70 0 9 $CMLSCALE 40 1.0 9 $PROXYGRAPHICS 70 1 9 $MEASUREMENT 70 0 9 $CELWEIGHT 370 -1 9 $ENDCAPS 280 0 9 $JOINSTYLE 280 0 9 $LWDISPLAY 290 0 9 $INSUNITS 70 1 9 $HYPERLINKBASE 1 9 $STYLESHEET 1 9 $XEDIT 290 1 9 $CEPSNTYPE 380 0 9 $PSTYLEMODE 290 1 9 $FINGERPRINTGUID 2 {E7F7769E-AACA-40AB-9EF3-61BBAFBCBA26} 9 $VERSIONGUID 2 {FAEB1C32-E019-11D5-929B-00C0DF256EC4} 9 $EXTNAMES 290 1 9 $PSVPSCALE 40 0.0 9 $OLESTARTUP 290 0 9 $SORTENTS 280 127 9 $INDEXCTL 280 0 9 $HIDETEXT 280 1 9 $XCLIPFRAME 290 0 9 $HALOGAP 280 0 9 $OBSCOLOR 70 257 9 $OBSLTYPE 280 0 9 $INTERSECTIONDISPLAY 280 0 9 $INTERSECTIONCOLOR 70 257 9 $DIMASSOC 280 2 9 $PROJECTNAME 1 0 ENDSEC 0 SECTION 2 CLASSES 0 CLASS 1 ACDBDICTIONARYWDFLT 2 AcDbDictionaryWithDefault 3 ObjectDBX Classes 90 0 91 4 280 0 281 0 0 CLASS 1 VISUALSTYLE 2 AcDbVisualStyle 3 ObjectDBX Classes 90 4095 91 4 280 0 281 0 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 29 330 8 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 80.25 22 106.4409457059851 13 0.0 23 0.0 14 0.5 24 0.5 15 0.5 25 0.5 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 113.3818914119703 41 0.8863849310366128 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 1000 73 1 74 3 75 0 76 0 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 330 0 100 AcDbSymbolTable 70 1 0 LTYPE 5 14 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 34FF 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.1234567891999994 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 330 0 100 AcDbSymbolTable 70 1 0 LAYER 5 10 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 330 0 100 AcDbSymbolTable 70 1 0 STYLE 5 11 330 3 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 330 0 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 330 0 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 12 330 9 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 330 0 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 0 DIMSTYLE 105 27 330 A 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 70 0 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 330 0 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 330 1 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 BLOCK_RECORD 5 43 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 STAR 340 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 330 1F 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 330 1F 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 330 1B 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 330 1B 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 330 23 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 330 23 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 44 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 STAR 70 0 10 0.0 20 0.0 30 0.0 3 STAR 1 0 LINE 5 45 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.0281474976710656 20 1.0414574138294284 30 0.0 11 0.6192449487634439 21 -1.0696049115004942 31 0.0 0 LINE 5 46 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 0.6192449487634439 20 -1.0696049115004942 30 0.0 11 -0.9570149208162315 21 0.4785074604081158 31 0.0 0 LINE 5 47 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.9570149208162315 20 0.4785074604081158 30 0.0 11 1.0414574138294284 21 0.3659174697238533 31 0.0 0 LINE 5 48 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 1.0414574138294284 20 0.3659174697238533 30 0.0 11 -0.4785074604081158 21 -1.0414574138294284 31 0.0 0 LINE 5 49 100 AcDbEntity 100 AcDbLine 8 0 62 256 370 -1 6 ByLayer 10 -0.4785074604081158 20 -1.0414574138294284 30 0.0 11 -0.0562949953421313 21 1.0133099161583627 31 0.0 0 ENDBLK 5 4A 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES gdalautotest-3.0.4/ogr/data/CoHI_GCS12.sbx0000644003401500001440000000020413614004466017467 0ustar rouaultusers' pBd@2 cYn7@6;th2 BJVgdalautotest-3.0.4/ogr/data/inspire_cadastralzoning.xml0000644003401500001440000001105713614005353022772 0ustar rouaultusers 49 2 50 3 2000-01-01T00:00:00.0Z 2001-01-01T00:00:00.0Z 1 49 2 50 2 50 3 49 3 CadastralZoning-01-localId namespace label 3 English Francais Deutsch language nativeness nameStatus sourceOfName text script nationalCadastalZoningReference 1000 49.5 2.5 2002-01-01T00:00:00.0Z 2003-01-01T00:00:00.0Z 2000-01-01T00:00:00.0Z 49 2 50 2 50 3 49 3 label 3 English nationalCadastalZoningReference gdalautotest-3.0.4/ogr/data/empty.gml0000644003401500001440000000054013614004466017172 0ustar rouaultusers missing gdalautotest-3.0.4/ogr/data/lambert93_francais.TAB0000644003401500001440000000041713614004466021336 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table Type NATIVE Charset "WindowsLatin1" Fields 1 foo Char (10) ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "5afb8cce-1842-4a1a-aafc-2a9c10687b3a" end_metadata gdalautotest-3.0.4/ogr/data/test.geojsons0000644003401500001440000000035413614004466020066 0ustar rouaultusers{ "type": "Feature", "properties": { "foo": "bar" }, "geometry": { "type": "Point", "coordinates": [ 1.0, 2.0 ] } }{ "type": "Feature", "properties": { "foo": "baz" }, "geometry": { "type": "Point", "coordinates": [ 3.0, 4.0 ] } }gdalautotest-3.0.4/ogr/data/esripoint.json0000644003401500001440000000154213614004466020245 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "x" : 2, "y" : 49 }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/test_kspread.ods0000644003401500001440000001106313614004466020534 0ustar rouaultusersPK;Gl9..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK;G!N content.xml\Ko6T4F۱8袇(bD^L:9oR廏Q(=,x!M`&^_>)3:^&1%,Nպ,vr$q#t{;AJ]YVC]yPiҷ' `]i/¤/IW<`;TFn0]>zXl]i?ɢ¤oW6w ݓG+;w"Zl@논F(uTuL6$V>X~<~+QCv~2tFf fAB LBaA!G >H\!0\ oԙ%rjޫ1C<Ru9i^[N~~E2yOZ4Vni=li9K51y?[J6̿mDc'=[˾g9?Fg8ar'1\cZǽ/>}3[ƺ1nu(Rr%<q\dR*mG擛< z 5vюwzEA_*3xf-ÒP..tVȯr#SlPcD#]ۿs^w~ o_hk_wPK;G/AQ styles.xmlV˒0WPA`^CS*UI>@a%ś@Y[[̴4xiIa'ah*LEhO{V׸DyʾETFB$E"Es3()leщle#-З.dg_E|.җ .< eWdU#Pd\2uʺZ@Av5/Yc](9_aolڷ'Ľ%hl!1gfE˜AWШdm:v5ո쁌h1NFaȼN3X%839n9êJ)냎g`vvȩ@U=_`c5TսߪJҷT$w!XN:\鳰Mdu2&p'JN^*z6uKD=n%Sэ.KW곸MƳ6y]VkmPc8J~Raϊ~!΢7Hz$q+N1nU[CǸ\MBZA^sn=o{G3Ee\u g*qTk_u'.!tщKcx1W W?OPK;GĒ|i: settings.xml]o0+P!֭D@!1UjJж;7qcGǿJPt禨s|D^"Z`! g=8uj< lssaH|O"T]bDִI/9`GHKO1[ڼKe#VmyYHFL+bk]mc$$.FkK<-ّb,mEuj fHZ]'w1Ŧ6MwQžJ:qYR[n9=T.Б}ԉ‘`m1ls&OWp4,ULO"z/=UtcJc?aq9b\+"u1_PK;G+9meta.xmlROo S5Didi?WGv~J͞v )UL,6U|<%/oJs:) 6k}҂ EPwN9Ǽd8K_6 A{N>a- #YېZ0:9BSJfM+d/j˸]|PK;G>Thumbnails/thumbnail.png sb``p  $%R |G@q64PcHŭ2ppk[lx]߼sOÀr=(6daR{@3xsJhPK;GzcMETA-INF/manifest.xmlj0 y{VLhlDJi~I #7 ~}@ 9_TԦ٩[uPǦ#ދr#jF س%VZ2R)") ra硒9Ss-ȲPo.]96H?Pe)SNeǴ65'ecQd>)~OKk뭛PK;Gl9.. mimetypeUTPK;G!N Tcontent.xmlUTPK;G/AQ styles.xmlUTPK;GĒ|i: q settings.xmlUTPK;G+9  meta.xmlUTPK;G> vThumbnails/thumbnail.pngUTPK;Gzc +META-INF/manifest.xmlUTPK>gdalautotest-3.0.4/ogr/data/testograpispy.py0000644003401500001440000001135713614005353020626 0ustar rouaultusers# This file is generated by the OGR_API_SPY mechanism. import os import shutil from osgeo import gdal from osgeo import ogr from osgeo import osr os.access shutil.copy gdal.SetConfigOption('FOO', 'BAR') ogr.Open('non_existing', update=0) ogr.Open('non_existing', update=1) ds1 = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/test.csv', options=['GEOMETRY=AS_WKT']) ds1_lyr1 = ds1.CreateLayer('test', srs=None, geom_type=ogr.wkbUnknown, options=[]) geom_fd = ogr.GeomFieldDefn('geomfield', ogr.wkbPolygon) geom_fd.SetSpatialRef(osr.SpatialReference("""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"]]""")) geom_fd.SetNullable(0) ds1_lyr1.CreateGeomField(geom_fd, approx_ok=1) ds1 = None ds1 = ogr.Open('/vsimem/test.csv', update=1) ds1 = None ogr.GetDriverByName('CSV').DeleteDataSource('/vsimem/test.csv') ds1 = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/test', options=[]) ds1_lyr1 = ds1.CreateLayer('test', srs=osr.SpatialReference("""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"]]"""), geom_type=ogr.wkbPoint, options=['ENCODING=UTF-8', 'ENCODING=UTF-8']) fdefn1 = ds1_lyr1.GetLayerDefn() f = ogr.Feature(fdefn1) ds1_lyr1.CreateFeature(f) f = None fd = ogr.FieldDefn('intfield', ogr.OFTInteger) ds1_lyr1.CreateField(fd, approx_ok=1) fd = ogr.FieldDefn('realfield', ogr.OFTReal) fd.SetWidth(24) fd.SetPrecision(15) fd.SetNullable(0) fd.SetDefault('3') ds1_lyr1.CreateField(fd, approx_ok=1) fd = ogr.FieldDefn('strfield', ogr.OFTString) ds1_lyr1.CreateField(fd, approx_ok=1) fdefn1 = ds1_lyr1.GetLayerDefn() fdefn1.GetGeomType() fdefn1.GetFieldCount() fdefn1.GetFieldIndex('foo') fdefn1_fielddefn1 = fdefn1.GetFieldDefn(1) fdefn1_fielddefn1.GetType() fdefn1_fielddefn1.GetNameRef() fdefn1_fielddefn1.GetSubType() fdefn1.GetGeomFieldCount() fdefn1.GetGeomFieldIndex('foo') fdefn1_geomfielddefn0 = fdefn1.GetGeomFieldDefn(0) fdefn1_geomfielddefn0.GetType() fdefn1_geomfielddefn0.GetNameRef() fdefn1_geomfielddefn0.GetSpatialRef() f = ogr.Feature(fdefn1) f.SetField(0, 1) f.SetField(1, 2.34) f.SetField(2, 'bla') ds1_lyr1.CreateFeature(f) f = None f = ogr.Feature(fdefn1) f.SetFID(1) f.SetField(0, 1) f.SetField(2, 'bla') f.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (1 2)')) f.SetStyleString('foo') ds1_lyr1.SetFeature(f) f = None ds1_lyr1.DeleteFeature(1) ds1_lyr1.ReorderField(0, 2) fdefn1 = ds1_lyr1.GetLayerDefn() fdefn1.GetFieldCount() ds1_lyr1.ReorderFields([2, 1, 0]) fdefn1 = ds1_lyr1.GetLayerDefn() ds1_lyr1.DeleteField(1) fd = ogr.FieldDefn('foo', ogr.OFTString) ds1_lyr1.AlterFieldDefn(0, fd, 65535) ds1_lyr1.StartTransaction() ds1_lyr1.CommitTransaction() ds1_lyr1.RollbackTransaction() ds1_lyr1.FindFieldIndex('foo', 1) ds1_lyr1.GetFeatureCount(force=1) ds1_lyr1.GetExtent(geom_field=0, force=0) ds1_lyr1.GetExtent(geom_field=0, force=1) ds1_lyr1.GetSpatialRef() ds1_lyr1.TestCapability('FastFeatureCount') ds1_lyr1.GetSpatialFilter() ds1_lyr1.SetAttributeFilter('foo = \'2\'') ds1_lyr1.SetAttributeFilter(None) ds1_lyr1.ResetReading() ds1_lyr1.GetFeature(0) ds1_lyr1.GetNextFeature() ds1_lyr1.SetNextByIndex(0) for i in range(3): ds1_lyr1.GetNextFeature() ds1_lyr1.SyncToDisk() ds1_lyr1.GetFIDColumn() ds1_lyr1.GetGeometryColumn() ds1_lyr1.GetName() ds1_lyr1.GetGeomType() ds1_lyr1.SetIgnoredFields([]) ds1_lyr1.SetSpatialFilter(None) ds1_lyr1.SetSpatialFilter(0, None) ds1_lyr1.SetSpatialFilter(ogr.CreateGeometryFromWkt('POINT (1 2)')) ds1_lyr1.SetSpatialFilterRect(0, 1, 2, 3) ds1_lyr1.SetSpatialFilterRect(0, 0, 1, 2, 3) ds1.GetLayerCount() ds1_lyr1 = ds1.GetLayer(0) ds1_lyr1 = ds1.GetLayerByName('test') ds1.GetLayerByName('foo') ds1_lyr2 = ds1.ExecuteSQL('SELECT * FROM test', None, '') ds1.ReleaseResultSet(ds1_lyr2) ds1_lyr2 = ds1.ExecuteSQL('SELECT * FROM test', ogr.CreateGeometryFromWkt('POINT (1 2)'), 'OGRSQL') ds1.ReleaseResultSet(ds1_lyr2) ds1.ReleaseResultSet(None) ds1_lyr2 = ds1.CreateLayer('foo', srs=None, geom_type=ogr.wkbUnknown, options=[]) fdefn2 = ds1_lyr2.GetLayerDefn() ds1.DeleteLayer(1) ds1.StartTransaction(0) ds1.CommitTransaction() ds1.RollbackTransaction() ds1 = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/test') ds1 = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/test2.csv', options=['GEOMETRY=AS_WKT']) ds1_lyr1 = ds1.CreateLayer('test2', srs=None, geom_type=ogr.wkbUnknown, options=[]) fdefn1 = ds1_lyr1.GetLayerDefn() ds1 = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/test2.csv') gdalautotest-3.0.4/ogr/data/elliptical-arc-hatch-min.dxf0000644003401500001440000000134113614004470022564 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 HATCH 5 5CF 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 70 1 71 0 91 1 92 5 93 3 72 3 10 15.0 20 5.0 11 0.0 21 60.0 40 0.0833333333333333 50 89.99999999999996 51 404.9999999999998 73 1 72 1 10 10.0172712087756 20 9.982728791224404 11 13.30276262356028 21 8.266309444692355 72 1 10 13.30276262356028 20 8.266309444692355 11 9.999999999999998 21 5.000000000000003 97 0 75 1 76 1 47 0.0521536549324575 98 1 10 14.76401067999723 20 19.06211598284125 0 ENDSEC gdalautotest-3.0.4/ogr/data/fake_gmljp2.xsd0000644003401500001440000000320613614005353020232 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/Stacks.prj0000644003401500001440000000110313614004466017274 0ustar rouaultusersPROJCS["NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",13123333.33333333],PARAMETER["Central_Meridian",-99.0],PARAMETER["Standard_Parallel_1",28.38333333333333],PARAMETER["Standard_Parallel_2",30.28333333333334],PARAMETER["Latitude_Of_Origin",27.83333333333333],UNIT["Foot_US",0.30480060960121924]]gdalautotest-3.0.4/ogr/data/asm.shx0000644003401500001440000000015413614004466016640 0ustar rouaultusers' 6sCIOAcJTmA[ƒ}QALcTmA2`gdalautotest-3.0.4/ogr/data/poly_spatialite4.sqlite0000644003401500001440000041000013614004466022040 0ustar rouaultusersSQLite format 3@ uRf~ytoje`[VQLGB=83.)$ zupkfrpn~k}j|i{hzgyfxewdvcubtas`r_q^p]o\n[mZlYkXjWiVhUgTfSeRdQcPbOaN`M_L^K]J\I[HZGYFXEWDVCUBT@S>R=Q<P;O:N9M8L7K6J5I4H3G2F1E0D/C-B+A*@)?(>'1&+ (%"   //LJO GOGROSGB 1936 / British National GridPROJCS["OSGB 1936 / British National Grid",GEOGCS["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]]76 1spatialite_history polygeometry polygeometry }}++[tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT NOT NULL DEFAULT 'Unknown', proj4text TEXT NOT NULL, srtext TEXT NOT NULL DEFAULT 'Undefined')11]tablespatialite_historyspatialite_historyCREATE TABLE spatialite_history ( event_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, table_name TEXT NOT NULL, geometry_column TEXT, event TEXT NOT NULL, timestamp TEXT NOT NULL, ver_sqlite TEXT NOT NULL, ver_splite TEXT NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq) ]--mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid), CONSTRAINT ck_gc_rtree CHECK (spatial_index_enabled IN (0,1,2)))?S-indexsqlite_autoindex_geometry_columns_1geometry_columns   0}99Wtableviews_geometry_columnsviews_geometry_columns CREATE TABLE views_geometry_columns ( view_name TEXT NOT NULL, view_geometry TEXT NOT NULL, view_rowid TEXT NOT NULL, f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, read_only INTEGER NOT NULL, CONSTRAINT pk_geom_cols_views PRIMARY KEY (view_name, view_geometry), CONSTRAINT fk_views_geom_cols FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE, CONSTRAINT ck_vw_rdonly CHECK (read_only IN (0,1)))K_9indexsqlite_autoindex_views_geometry_columns_1views_geometry_columns 99tablevirts_geometry_columnsvirts_geometry_columns CREATE TABLE virts_geometry_columns ( virt_name TEXT NOT NULL, virt_geometry TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, CONSTRAINT pk_geom_cols_virts PRIMARY KEY (virt_name, virt_geometry), CONSTRAINT fk_vgc_srid FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))   IIK _9indexsqlite_autoindex_virts_geometry_columns_1virts_geometry_columns  CC'tablegeometry_columns_statisticsgeometry_columns_statisticsCREATE TABLE geometry_columns_statistics ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, last_verified TIMESTAMP, row_count INTEGER, extent_min_x DOUBLE, extent_min_y DOUBLE, extent_max_x DOUBLE, extent_max_y DOUBLE, CONSTRAINT pk_gc_statistics PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_statistics FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE)U iCindexsqlite_autoindex_geometry_columns_statistics_1geometry_columns_statistics N =polygeometry2012-10-14T21:45:02.164Z A1 AR+@ Ae@AR- polygeometry    OOtableviews_geometry_columns_statisticsviews_geometry_columns_statisticsCREATE TABLE views_geometry_columns_statistics ( view_name TEXT NOT NULL, view_geometry TEXT NOT NULL, last_verified TIMESTAMP, row_count INTEGER, extent_min_x DOUBLE, extent_min_y DOUBLE, extent_max_x DOUBLE, extent_max_y DOUBLE, CONSTRAINT pk_vwgc_statistics PRIMARY KEY (view_name, view_geometry), CONSTRAINT fk_vwgc_statistics FOREIGN KEY (view_name, view_geometry) REFERENCES views_geometry_columns (view_name, view_geometry) ON DELETE CASCADE)a uOindexsqlite_autoindex_views_geometry_columns_statistics_1views_geometry_columns_statistics   OOtablevirts_geometry_columns_statisticsvirts_geometry_columns_statisticsCREATE TABLE virts_geometry_columns_statistics ( virt_name TEXT NOT NULL, virt_geometry TEXT NOT NULL, last_verified TIMESTAMP, row_count INTEGER, extent_min_x DOUBLE, extent_min_y DOUBLE, extent_max_x DOUBLE, extent_max_y DOUBLE, CONSTRAINT pk_vrtgc_statistics PRIMARY KEY (virt_name, virt_geometry), CONSTRAINT fk_vrtgc_statistics FOREIGN KEY (virt_name, virt_geometry) REFERENCES virts_geometry_columns (virt_name, virt_geometry) ON DELETE CASCADE)auOindexsqlite_autoindex_virts_geometry_columns_statistics_1virts_geometry_columns_statistics pC)polygeometryprfedea +polygeometryeas_id 5polygeometryarea @ ěA8`+polygeometryGEOMETRY *polygeometryOGC_FID  wwpolygeometryprfedeapolygeometryeas_idpolygeometryareapolygeometryGEOMETRYpolygeometryOGC_FID WEE1tablegeometry_columns_field_infosgeometry_columns_field_infosCREATE TABLE geometry_columns_field_infos ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, ordinal INTEGER NOT NULL, column_name TEXT NOT NULL, null_values INTEGER NOT NULL, integer_values INTEGER NOT NULL, double_values INTEGER NOT NULL, text_values INTEGER NOT NULL, blob_values INTEGER NOT NULL, max_size INTEGER, integer_min INTEGER, integer_max INTEGER, double_min DOUBLE, double_max DOUBLE, CONSTRAINT pk_gcfld_infos PRIMARY KEY (f_table_name, f_geometry_column, ordinal, column_name), CONSTRAINT fk_gcfld_infos FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE)WkEindexsqlite_autoindex_geometry_columns_field_infos_1geometry_columns_field_infos   WQQtableviews_geometry_columns_field_infosviews_geometry_columns_field_infosCREATE TABLE views_geometry_columns_field_infos ( view_name TEXT NOT NULL, view_geometry TEXT NOT NULL, ordinal INTEGER NOT NULL, column_name TEXT NOT NULL, null_values INTEGER NOT NULL, integer_values INTEGER NOT NULL, double_values INTEGER NOT NULL, text_values INTEGER NOT NULL, blob_values INTEGER NOT NULL, max_size INTEGER, integer_min INTEGER, integer_max INTEGER, double_min DOUBLE, double_max DOUBLE, CONSTRAINT pk_vwgcfld_infos PRIMARY KEY (view_name, view_geometry, ordinal, column_name), CONSTRAINT fk_vwgcfld_infos FOREIGN KEY (view_name, view_geometry) REFERENCES views_geometry_columns (view_name, view_geometry) ON DELETE CASCADE)cwQindexsqlite_autoindex_views_geometry_columns_field_infos_1views_geometry_columns_field_infos   YQQtablevirts_geometry_columns_field_infosvirts_geometry_columns_field_infosCREATE TABLE virts_geometry_columns_field_infos ( virt_name TEXT NOT NULL, virt_geometry TEXT NOT NULL, ordinal INTEGER NOT NULL, column_name TEXT NOT NULL, null_values INTEGER NOT NULL, integer_values INTEGER NOT NULL, double_values INTEGER NOT NULL, text_values INTEGER NOT NULL, blob_values INTEGER NOT NULL, max_size INTEGER, integer_min INTEGER, integer_max INTEGER, double_min DOUBLE, double_max DOUBLE, CONSTRAINT pk_vrtgcfld_infos PRIMARY KEY (virt_name, virt_geometry, ordinal, column_name), CONSTRAINT fk_vrtgcfld_infos FOREIGN KEY (virt_name, virt_geometry) REFERENCES virts_geometry_columns (virt_name, virt_geometry) ON DELETE CASCADE)cwQindexsqlite_autoindex_virts_geometry_columns_field_infos_1virts_geometry_columns_field_infos Z===polygeometry2012-10-14T21:43:33.625Z0000-01-01T00:00:00.000Z0000-01-01T00:00:00.000Z polygeometry ww;77tablegeometry_columns_timegeometry_columns_time CREATE TABLE geometry_columns_time ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, last_insert TIMESTAMP NOT NULL DEFAULT '0000-01-01T00:00:00.000Z', last_update TIMESTAMP NOT NULL DEFAULT '0000-01-01T00:00:00.000Z', last_delete TIMESTAMP NOT NULL DEFAULT '0000-01-01T00:00:00.000Z', CONSTRAINT pk_gc_time PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_time FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE)I]7indexsqlite_autoindex_geometry_columns_time_1geometry_columns_time! polygeometry polygeometry  775tablegeometry_columns_authgeometry_columns_auth#CREATE TABLE geometry_columns_auth ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, read_only INTEGER NOT NULL, hidden INTEGER NOT NULL, CONSTRAINT pk_gc_auth PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_auth FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE, CONSTRAINT ck_gc_ronly CHECK (read_only IN (0,1)), CONSTRAINT ck_gc_hidden CHECK (hidden IN (0,1)))I]7indexsqlite_autoindex_geometry_columns_auth_1geometry_columns_auth$   $$<>CCtableviews_geometry_columns_authviews_geometry_columns_auth&CREATE TABLE views_geometry_columns_auth ( view_name TEXT NOT NULL, view_geometry TEXT NOT NULL, hidden INTEGER NOT NULL, CONSTRAINT pk_vwgc_auth PRIMARY KEY (view_name, view_geometry), CONSTRAINT fk_vwgc_auth FOREIGN KEY (view_name, view_geometry) REFERENCES views_geometry_columns (view_name, view_geometry) ON DELETE CASCADE, CONSTRAINT ck_vwgc_hidden CHECK (hidden IN (0,1)))UiCindexsqlite_autoindex_views_geometry_columns_auth_1views_geometry_columns_auth'ACC tablevirts_geometry_columns_authvirts_geometry_columns_auth)CREATE TABLE virts_geometry_columns_auth ( virt_name TEXT NOT NULL, virt_geometry TEXT NOT NULL, hidden INTEGER NOT NULL, CONSTRAINT pk_vrtgc_auth PRIMARY KEY (virt_name, virt_geometry), CONSTRAINT fk_vrtgc_auth FOREIGN KEY (virt_name, virt_geometry) REFERENCES virts_geometry_columns (virt_name, virt_geometry) ON DELETE CASCADE, CONSTRAINT ck_vrtgc_hidden CHECK (hidden IN (0,1)))   *xUiCindexsqlite_autoindex_virts_geometry_columns_auth_1virts_geometry_columns_auth*611tablesql_statements_logsql_statements_log,CREATE TABLE sql_statements_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, time_start TIMESTAMP NOT NULL DEFAULT '0000-01-01T00:00:00.000Z', time_end TIMESTAMP NOT NULL DEFAULT '0000-01-01T00:00:00.000Z', user_agent TEXT NOT NULL, sql_statement TEXT NOT NULL, success INTEGER NOT NULL DEFAULT 0, error_cause TEXT NOT NULL DEFAULT 'ABORTED', CONSTRAINT sqllog_success CHECK (success IN (0,1)))tablepolypoly-CREATE TABLE 'poly' ( OGC_FID INTEGER PRIMARY KEY, "GEOMETRY" POLYGON, 'area' FLOAT, 'eas_id' FLOAT, 'prfedea' VARCHAR(16)) 99%tableidx_poly_GEOMETRY_nodeidx_poly_GEOMETRY_node.CREATE TABLE "idx_poly_GEOMETRY_node"(nodeno INTEGER PRIMARY KEY, data BLOB) =;:98 99D H3HꐶJiqJoUHHdJiJnHHkJfJmHqH AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RAA1`A735043423 t|FA .-RARA-RA|`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RAA E ě35043411 @7>A@,RA@cMA`-RA|`/IA -RAIA-RAJA-RAKA`-RANLA-RALA-RA@cMAt-RAKMA`^-RA LA\-RAJAW-RA\JAR-RAGA@0-RA GA--RA sFA&-RAWFA -RAFA-RA EA -RA DA`-RACDA`,RA@@A@,RA@7>A+-RA@s?A3-RA?A4-RAAAB-RABA C-RACAC-RA GAC-RA`HA`m-RA`/IA -RAA?|35043414 ``-4<A+-RA@s?A@o-RA|<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RA@$/35043415m4 1A,RA'AAv-RA|<Av-RA<Am-RA@7>A+-RA@@A@,RA'AA@,RA `@A,RA?A ,RA*>A,RA <A,RA:A,RA@s8A ,RA 4A,RA3A`,RA3A ,RA@3A,RA3A,RA4A`,RAl7A-RA t6A -RA`6A-RA5A-RA3A,RA@ 3A,RA 1A3-RA:Ak-RA<Av-RAA `A735043416 0p0=TKA,RAnWAU-RA|RAE-RAdTAU-RATA=-RAtUA(-RA@VA-RAWA-RA`2UA -RArTA@-RA TA-RAnWA`,RAVA`,RA`VA,RA`=VA`,RA!UA@,RASA,RA QA@,RA@OA,RAtNA,RA@OA,RAPA ,RAPA,RA@^QA@,RA^QA ,RA PA-RANA-RAwMA-RA,LA-RA@KA-RAKA-RANA .-RARAE-RAAdր35043409 tCDA`,RANA`^-RA|KMA`^-RA AMAL-RANA .-RAKA-RAHA-RAGA-RA``FA@ -RA`FA,RACDA`,RA DA`-RA EA -RAFA-RAWFA -RA sFA&-RA GA--RAGA@0-RA\JAR-RAJAW-RA LA\-RAKMA`^-RA@_35043412-RA hZA,-RAZA--RAa[A2-RA]AB-RA`]AP-RA@`A 3-RA`,`A"-RAbA 2-RAbA@B-RAcAI-RA dAM-RAdAQ-RAeA<-RA`weA`'-RA@eA`-RAeA-RA@M_A,RA@^A`,RA^A,RA^A,RA^A,RA]A,RA]A ,RA`^A,RA]AZ,RA@]AR,RA?\A`<,RAYA,RA@XA,RAWA +RA9VA+RA@_UA,RAgPA +RAvOA`+RAOA@+RA` OA+RAFPA`+RAPAm+RA`'OAT+RA@IA @+RA IA@D+RAGA`+RADA2,RA@DAC,RAMA ,RA@OA,RA QA@,RASA,RA!UA@,RA`=VA`,RA`VA,RAVA`,RAnWA`,RA TA-RArTA@-RA`2UA -RAWA-RA@VA-RAA8`35043369  ``FA,RAHA-RA|HA-RA`FA,RA``FA@ -RAGA-RAHA-RA@ ě35043413} T@@A2,RA^QA-RA|HA-RAKA-RA@KA-RA,LA-RAwMA-RANA-RA PA-RA^QA ,RA@^QA@,RAPA,RAPA ,RA@OA,RAtNA,RA@OA,RAMA ,RA@DAC,RADA2,RACA 6,RAKCAU,RA0CA],RABAq,RAAA,RA'AA@,RA@@A@,RACDA`,RA`FA,RAHA-RAA"5A735043408DA @+RA@eAQ-RA|=@VA-RAWA-RAXA%< oo'U-#triggergeometry_columns_f_table_name_insertgeometry_columnsCREATE TRIGGER geometry_columns_f_table_name_insert BEFORE INSERT ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END ^^(U-Etriggergeometry_columns_f_table_name_updategeometry_columnsCREATE TRIGGER geometry_columns_f_table_name_update BEFORE UPDATE OF 'f_table_name' ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END BB;)_-striggergeometry_columns_f_geometry_column_insertgeometry_columnsCREATE TRIGGER geometry_columns_f_geometry_column_insert BEFORE INSERT ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END ,,Q*_-triggergeometry_columns_f_geometry_column_updategeometry_columnsCREATE TRIGGER geometry_columns_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END +W-7triggergeometry_columns_geometry_type_insertgeometry_columnsCREATE TRIGGER geometry_columns_geometry_type_insert BEFORE INSERT ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'geometry_type must be one of 0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007') WHERE NOT(NEW.geometry_type IN (0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007)); END ,,W-]triggergeometry_columns_geometry_type_updategeometry_columnsCREATE TRIGGER geometry_columns_geometry_type_update BEFORE UPDATE OF 'geometry_type' ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'geometry_type must be one of 0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007') WHERE NOT(NEW.geometry_type IN (0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007)); END-[-;triggergeometry_columns_coord_dimension_insertgeometry_columnsCREATE TRIGGER geometry_columns_coord_dimension_insert BEFORE INSERT ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'coord_dimension must be one of 2,3,4') WHERE NOT(NEW.coord_dimension IN (2,3,4)); END 2.[-etriggergeometry_columns_coord_dimension_updategeometry_columnsCREATE TRIGGER geometry_columns_coord_dimension_update BEFORE UPDATE OF 'coord_dimension' ON 'geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'coord_dimension must be one of 2,3,4') WHERE NOT(NEW.coord_dimension IN (2,3,4)); ENDD///9viewgeom_cols_ref_sysgeom_cols_ref_sysCREATE VIEW geom_cols_ref_sys AS SELECT f_table_name, f_geometry_column, geometry_type, coord_dimension, spatial_ref_sys.srid AS srid, auth_name, auth_srid, ref_sys_name, proj4text, srtext FROM geometry_columns, spatial_ref_sys WHERE geometry_columns.srid = spatial_ref_sys.srid y079 triggervwgc_view_name_insertviews_geometry_columnsCREATE TRIGGER vwgc_view_name_insert BEFORE INSERT ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END vv179'triggervwgc_view_name_updateviews_geometry_columnsCREATE TRIGGER vwgc_view_name_update BEFORE UPDATE OF 'view_name' ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END ``2?9Ktriggervwgc_view_geometry_insertviews_geometry_columnsCREATE TRIGGER vwgc_view_geometry_insert BEFORE INSERT ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END MM03?9qtriggervwgc_view_geometry_updateviews_geometry_columnsCREATE TRIGGER vwgc_view_geometry_update BEFORE UPDATE OF 'view_geometry' ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END ee499Gtriggervwgc_view_rowid_updateviews_geometry_columnsCREATE TRIGGER vwgc_view_rowid_update BEFORE UPDATE OF 'view_rowid' ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_rowid value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_rowid value must not contain a double quote') WHERE NEW.view_rowid LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: view_rowid value must be lower case') WHERE NEW.view_rowid <> lower(NEW.view_rowid); END {{599triggervwgc_view_rowid_insertviews_geometry_columnsCREATE TRIGGER vwgc_view_rowid_insert BEFORE INSERT ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_rowid value must not contain a single quote') WHERE NEW.view_rowid LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_rowid value must not contain a double quote') WHERE NEW.view_rowid LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: view_rowid value must be lower case') WHERE NEW.view_rowid <> lower(NEW.view_rowid); END ii6=9;triggervwgc_f_table_name_insertviews_geometry_columnsCREATE TRIGGER vwgc_f_table_name_insert BEFORE INSERT ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END XX%7=9]triggervwgc_f_table_name_updateviews_geometry_columnsCREATE TRIGGER vwgc_f_table_name_update BEFORE UPDATE OF 'f_table_name' ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END <<A8G9 triggervwgc_f_geometry_column_insertviews_geometry_columnsCREATE TRIGGER vwgc_f_geometry_column_insert BEFORE INSERT ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END &&W9G97triggervwgc_f_geometry_column_updateviews_geometry_columnsCREATE TRIGGER vwgc_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'views_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END y:79 triggervtgc_virt_name_insertvirts_geometry_columnsCREATE TRIGGER vtgc_virt_name_insert BEFORE INSERT ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END vv;79'triggervtgc_virt_name_updatevirts_geometry_columnsCREATE TRIGGER vtgc_virt_name_update BEFORE UPDATE OF 'virt_name' ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END ``<?9Ktriggervtgc_virt_geometry_insertvirts_geometry_columnsCREATE TRIGGER vtgc_virt_geometry_insert BEFORE INSERT ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END MM0=?9qtriggervtgc_virt_geometry_updatevirts_geometry_columnsCREATE TRIGGER vtgc_virt_geometry_update BEFORE UPDATE OF 'virt_geometry' ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END  >?9+triggervtgc_geometry_type_insertvirts_geometry_columnsCREATE TRIGGER vtgc_geometry_type_insert BEFORE INSERT ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'geometry_type must be one of 0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007') WHERE NOT(NEW.geometry_type IN (0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007)); END  ??9Qtriggervtgc_geometry_type_updatevirts_geometry_columnsCREATE TRIGGER vtgc_geometry_type_update BEFORE UPDATE OF 'geometry_type' ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'geometry_type must be one of 0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007') WHERE NOT(NEW.geometry_type IN (0,1,2,3,4,5,6,7,1000,1001,1002,1003,1004,1005,1006,1007,2000,2001,2002,2003,2004,2005,2006,2007,3000,3001,3002,3003,3004,3005,3006,3007)); END@C9/triggervtgc_coord_dimension_insertvirts_geometry_columnsCREATE TRIGGER vtgc_coord_dimension_insert BEFORE INSERT ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'coord_dimension must be one of 2,3,4') WHERE NOT(NEW.coord_dimension IN (2,3,4)); END ))R&AC9Ytriggervtgc_coord_dimension_updatevirts_geometry_columnsCREATE TRIGGER vtgc_coord_dimension_update BEFORE UPDATE OF 'coord_dimension' ON 'virts_geometry_columns' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'coord_dimension must be one of 2,3,4') WHERE NOT(NEW.coord_dimension IN (2,3,4)); END+B;Catriggergcs_f_table_name_insertgeometry_columns_statisticsCREATE TRIGGER gcs_f_table_name_insert BEFORE INSERT ON 'geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END AA lower(NEW.f_table_name); END %%XDEC1triggergcs_f_geometry_column_insertgeometry_columns_statisticsCREATE TRIGGER gcs_f_geometry_column_insert BEFORE INSERT ON 'geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_statistics violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END nEEC]triggergcs_f_geometry_column_updategeometry_columns_statisticsCREATE TRIGGER gcs_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_statistics violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_statistics violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_statistics violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END KK2F9Oetriggervwgcs_view_name_insertviews_geometry_columns_statisticsCREATE TRIGGER vwgcs_view_name_insert BEFORE INSERT ON 'views_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END ==@G9Otriggervwgcs_view_name_updateviews_geometry_columns_statisticsCREATE TRIGGER vwgcs_view_name_update BEFORE UPDATE OF 'view_name' ON 'views_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END ''VHAO%triggervwgcs_view_geometry_insertviews_geometry_columns_statisticsCREATE TRIGGER vwgcs_view_geometry_insert BEFORE INSERT ON 'views_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_statistics violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END iIAOKtriggervwgcs_view_geometry_updateviews_geometry_columns_statisticsCREATE TRIGGER vwgcs_view_geometry_update BEFORE UPDATE OF 'view_geometry' ON 'views_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_statistics violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END KK2J9Oetriggervtgcs_virt_name_insertvirts_geometry_columns_statisticsCREATE TRIGGER vtgcs_virt_name_insert BEFORE INSERT ON 'virts_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END ==@K9Otriggervtgcs_virt_name_updatevirts_geometry_columns_statisticsCREATE TRIGGER vtgcs_virt_name_update BEFORE UPDATE OF 'virt_name' ON 'virts_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END ''VLAO%triggervtgcs_virt_geometry_insertvirts_geometry_columns_statisticsCREATE TRIGGER vtgcs_virt_geometry_insert BEFORE INSERT ON 'virts_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_statistics violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END iMAOKtriggervtgcs_virt_geometry_updatevirts_geometry_columns_statisticsCREATE TRIGGER vtgcs_virt_geometry_update BEFORE UPDATE OF 'virt_geometry' ON 'virts_geometry_columns_statistics' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_statistics violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END KK2N=Ektriggergcfi_f_table_name_insertgeometry_columns_field_infosCREATE TRIGGER gcfi_f_table_name_insert BEFORE INSERT ON 'geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END ::CO=E triggergcfi_f_table_name_updategeometry_columns_field_infosCREATE TRIGGER gcfi_f_table_name_update BEFORE UPDATE OF 'f_table_name' ON 'geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END _PGE;triggergcfi_f_geometry_column_insertgeometry_columns_field_infosCREATE TRIGGER gcfi_f_geometry_column_insert BEFORE INSERT ON 'geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_field_infos violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END uQGEgtriggergcfi_f_geometry_column_updategeometry_columns_field_infosCREATE TRIGGER gcfi_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_field_infos violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END DD9R;Qotriggervwgcfi_view_name_insertviews_geometry_columns_field_infosCREATE TRIGGER vwgcfi_view_name_insert BEFORE INSERT ON 'views_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END 66GS;Q triggervwgcfi_view_name_updateviews_geometry_columns_field_infosCREATE TRIGGER vwgcfi_view_name_update BEFORE UPDATE OF 'view_name' ON 'views_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END   ]TCQ/triggervwgcfi_view_geometry_insertviews_geometry_columns_field_infosCREATE TRIGGER vwgcfi_view_geometry_insert BEFORE INSERT ON 'views_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_field_infos violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END   pUCQUtriggervwgcfi_view_geometry_updateviews_geometry_columns_field_infosCREATE TRIGGER vwgcfi_view_geometry_update BEFORE UPDATE OF 'view_geometry' ON 'views_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_field_infos violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END DD9V;Qotriggervtgcfi_virt_name_insertvirts_geometry_columns_field_infosCREATE TRIGGER vtgcfi_virt_name_insert BEFORE INSERT ON 'virts_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END 66GW;Q triggervtgcfi_virt_name_updatevirts_geometry_columns_field_infosCREATE TRIGGER vtgcfi_virt_name_update BEFORE UPDATE OF 'virt_name' ON 'virts_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END   ]XCQ/triggervtgcfi_virt_geometry_insertvirts_geometry_columns_field_infosCREATE TRIGGER vtgcfi_virt_geometry_insert BEFORE INSERT ON 'virts_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_field_infos violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END   pYCQUtriggervtgcfi_virt_geometry_updatevirts_geometry_columns_field_infosCREATE TRIGGER vtgcfi_virt_geometry_update BEFORE UPDATE OF 'virt_geometry' ON 'virts_geometry_columns_field_infos' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_field_infos violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END nnZ=73triggergctm_f_table_name_insertgeometry_columns_timeCREATE TRIGGER gctm_f_table_name_insert BEFORE INSERT ON 'geometry_columns_time' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END ]] [=7Utriggergctm_f_table_name_updategeometry_columns_timeCREATE TRIGGER gctm_f_table_name_update BEFORE UPDATE OF 'f_table_name' ON 'geometry_columns_time' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END AA<\G7triggergctm_f_geometry_column_insertgeometry_columns_timeCREATE TRIGGER gctm_f_geometry_column_insert BEFORE INSERT ON 'geometry_columns_time' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_time violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END ++R]G7/triggergctm_f_geometry_column_updategeometry_columns_timeCREATE TRIGGER gctm_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'geometry_columns_time' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_time violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END nn^=73triggergcau_f_table_name_insertgeometry_columns_authCREATE TRIGGER gcau_f_table_name_insert BEFORE INSERT ON 'geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END ]] _=7Utriggergcau_f_table_name_updategeometry_columns_authCREATE TRIGGER gcau_f_table_name_update BEFORE UPDATE OF 'f_table_name' ON 'geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_table_name value must not contain a single quote') WHERE NEW.f_table_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_table_name value must not contain a double quote') WHERE NEW.f_table_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_table_name value must be lower case') WHERE NEW.f_table_name <> lower(NEW.f_table_name); END AA<`G7triggergcau_f_geometry_column_insertgeometry_columns_authCREATE TRIGGER gcau_f_geometry_column_insert BEFORE INSERT ON 'geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'insert on geometry_columns_auth violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END ++RaG7/triggergcau_f_geometry_column_updategeometry_columns_authCREATE TRIGGER gcau_f_geometry_column_update BEFORE UPDATE OF 'f_geometry_column' ON 'geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_geometry_column value must not contain a single quote') WHERE NEW.f_geometry_column LIKE ('%''%'); SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_geometry_column value must not contain a double quote') WHERE NEW.f_geometry_column LIKE ('%"%'); SELECT RAISE(ABORT,'update on geometry_columns_auth violates constraint: f_geometry_column value must be lower case') WHERE NEW.f_geometry_column <> lower(NEW.f_geometry_column); END ggb;C7triggervwgcau_view_name_insertviews_geometry_columns_authCREATE TRIGGER vwgcau_view_name_insert BEFORE INSERT ON 'views_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END YY$c;CStriggervwgcau_view_name_updateviews_geometry_columns_authCREATE TRIGGER vwgcau_view_name_update BEFORE UPDATE OF 'view_name' ON 'views_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_name value must not contain a single quote') WHERE NEW.view_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_name value must not contain a double quote') WHERE NEW.view_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_name value must be lower case') WHERE NEW.view_name <> lower(NEW.view_name); END CC:dCCwtriggervwgcau_view_geometry_insertviews_geometry_columns_authCREATE TRIGGER vwgcau_view_geometry_insert BEFORE INSERT ON 'views_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on views_geometry_columns_auth violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END //NeCCtriggervwgcau_view_geometry_updateviews_geometry_columns_authCREATE TRIGGER vwgcau_view_geometry_update BEFORE UPDATE OF 'view_geometry' ON 'views_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_geometry value must not contain a single quote') WHERE NEW.view_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_geometry value must not contain a double quote') WHERE NEW.view_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on views_geometry_columns_auth violates constraint: view_geometry value must be lower case') WHERE NEW.view_geometry <> lower(NEW.view_geometry); END ggf;C7triggervtgcau_virt_name_insertvirts_geometry_columns_authCREATE TRIGGER vtgcau_virt_name_insert BEFORE INSERT ON 'virts_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END YY$g;CStriggervtgcau_virt_name_updatevirts_geometry_columns_authCREATE TRIGGER vtgcau_virt_name_update BEFORE UPDATE OF 'virt_name' ON 'virts_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_name value must not contain a single quote') WHERE NEW.virt_name LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_name value must not contain a double quote') WHERE NEW.virt_name LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_name value must be lower case') WHERE NEW.virt_name <> lower(NEW.virt_name); END CC:hCCwtriggervtgcau_virt_geometry_insertvirts_geometry_columns_authCREATE TRIGGER vtgcau_virt_geometry_insert BEFORE INSERT ON 'virts_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'insert on virts_geometry_columns_auth violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END 00MiCCtriggervtgcau_virt_geometry_updatevirts_geometry_columns_authCREATE TRIGGER vtgcau_virt_geometry_update BEFORE UPDATE OF 'virt_geometry' ON 'virts_geometry_columns_auth' FOR EACH ROW BEGIN SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_geometry value must not contain a single quote') WHERE NEW.virt_geometry LIKE ('%''%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_geometry value must not contain a double quote') WHERE NEW.virt_geometry LIKE ('%"%'); SELECT RAISE(ABORT,'update on virts_geometry_columns_auth violates constraint: virt_geometry value must be lower case') WHERE NEW.virt_geometry <> lower(NEW.virt_geometry); END ,,Qj''cviewvector_layersvector_layersCREATE VIEW vector_layers AS SELECT 'SpatialTable' AS layer_type, f_table_name AS table_name, f_geometry_column AS geometry_column, geometry_type AS geometry_type, coord_dimension AS coord_dimension, srid AS srid, spatial_index_enabled AS spatial_index_enabled FROM geometry_columns UNION SELECT 'SpatialView' AS layer_type, a.view_name AS table_name, a.view_geometry AS geometry_column, b.geometry_type AS geometry_type, b.coord_dimension AS coord_dimension, b.srid AS srid, b.spatial_index_enabled AS spatial_index_enabled FROM views_geometry_columns AS a LEFT JOIN geometry_columns AS b ON (Upper(a.f_table_name) = Upper(b.f_table_name) AND Upper(a.f_geometry_column) = Upper(b.f_geometry_column)) UNION SELECT 'VirtualShape' AS layer_type, virt_name AS table_name, virt_geometry AS geometry_column, geometry_type AS geometry_type, coord_dimension AS coord_dimension, srid AS srid, 0 AS spatial_index_enabled FROM virts_geometry_columns bk11qviewvector_layers_authvector_layers_authCREATE VIEW vector_layers_auth AS SELECT 'SpatialTable' AS layer_type, f_table_name AS table_name, f_geometry_column AS geometry_column, read_only AS read_only, hidden AS hidden FROM geometry_columns_auth UNION SELECT 'SpatialView' AS layer_type, a.view_name AS table_name, a.view_geometry AS geometry_column, b.read_only AS read_only, a.hidden AS hidden FROM views_geometry_columns_auth AS a JOIN views_geometry_columns AS b ON (Upper(a.view_name) = Upper(b.view_name) AND Upper(a.view_geometry) = Upper(b.view_geometry)) UNION SELECT 'VirtualShape' AS layer_type, virt_name AS table_name, virt_geometry AS geometry_column, 1 AS read_only, hidden AS hidden FROM virts_geometry_columns_authECT 'SpatialTable' AS layer_type, f_table_name AS table_name, f_geometry_column AS geometry_column, last_verified AS last_verified, row_count AS row_count, extent_min_x AS extent_min_x, extent_min_y AS extent_min_y, extent_max_x AS extent_max_x, extent_max_y AS extent_max_y FROM geometry_columns_statistics UNION SELECT 'SpatialView' AS layer_type, view_name AS table_name, view_geometry AS geometry_column, last_verified AS last_verified, row_count AS row_count, extent_min_x AS extent_min_x, extent_min_y AS extent_min_y, extent_max_x AS extent_max_x, extent_max_y AS extent_max_y FROM views_geometry_columns_statistics UNION SELECT 'VirtualShape' AS layer_type, virt_name AS table_name, virt_geometry AS geometry_column, last_verified AS last_verified, row_count AS row_count, extent_min_x AS extent_min_x, extent_min_y AS extent_min_y, extent_max_x AS extent_max_x, extent_max_y AS extent_max_y FROM virts_geometry_columns_statisticser_max, double_min AS double_min, double_max double_max FROM geometry_columns_field_infos UNION SELECT 'SpatialView' AS layer_type, view_name AS table_name, view_geometry AS geometry_column, ordinal AS ordinal, column_name AS column_name, null_values AS null_values, integer_values AS integer_values, double_values AS double_values, text_values AS text_values, blob_values AS blob_values, max_size AS max_size, integer_min AS integer_min, integer_max AS integer_max, double_min AS double_min, double_max double_max FROM views_geometry_columns_field_infos UNION SELECT 'VirtualShape' AS layer_type, virt_name AS table_name, virt_geometry AS geometry_column, ordinal AS ordinal, column_name AS column_name, null_values AS null_values, integer_values AS integer_values, double_values AS double_values, text_values AS text_values, blob_values AS blob_values, max_size AS max_size, integer_min AS integer_min, integer_max AS integer_max, double_min AS double_min, double_max double_max FROM virts_geometry_columns_field_infos MMl==7viewvector_layers_statisticsvector_layers_statisticsCREATE VIEW vector_layers_statistics AS SELVm??=viewvector_layers_field_infosvector_layers_field_infosCREATE VIEW vector_layers_field_infos AS SELECT 'SpatialTable' AS layer_type, f_table_name AS table_name, f_geometry_column AS geometry_column, ordinal AS ordinal, column_name AS column_name, null_values AS null_values, integer_values AS integer_values, double_values AS double_values, text_values AS text_values, blob_values AS blob_values, max_size AS max_size, integer_min AS integer_min, integer_max AS integbn%%tableSpatialIndexSpatialIndexCREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex() K2o/)triggerggi_poly_GEOMETRYpolyCREATE TRIGGER "ggi_poly_GEOMETRY" BEFORE INSERT ON "poly" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'poly.GEOMETRY violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT geometry_type FROM geometry_columns WHERE Lower(f_table_name) = Lower('poly') AND Lower(f_geometry_column) = Lower('GEOMETRY') AND GeometryConstraints(NEW."GEOMETRY", geometry_type, srid) = 1) IS NULL; END2p/)triggerggu_poly_GEOMETRYpolyCREATE TRIGGER "ggu_poly_GEOMETRY" BEFORE UPDATE ON "poly" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'poly.GEOMETRY violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT geometry_type FROM geometry_columns WHERE Lower(f_table_name) = Lower('poly') AND Lower(f_geometry_column) = Lower('GEOMETRY') AND GeometryConstraints(NEW."GEOMETRY", geometry_type, srid) = 1) IS NULL; END _q/triggergii_poly_GEOMETRYpolyCREATE TRIGGER "gii_poly_GEOMETRY" AFTER INSERT ON "poly" FOR EACH ROW BEGIN UPDATE geometry_columns_time SET last_insert = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE Lower(f_table_name) = Lower('poly') AND Lower(f_geometry_column) = Lower('GEOMETRY'); DELETE FROM "idx_poly_GEOMETRY" WHERE pkid=NEW.ROWID; SELECT RTreeAlign('idx_poly_GEOMETRY', NEW.ROWID, NEW."GEOMETRY"); ENDr/triggergiu_poly_GEOMETRYpolyCREATE TRIGGER "giu_poly_GEOMETRY" AFTER UPDATE ON "poly" FOR EACH ROW BEGIN UPDATE geometry_columns_time SET last_update = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE Lower(f_table_name) = Lower('poly') AND Lower(f_geometry_column) = Lower('GEOMETRY'); DELETE FROM "idx_poly_GEOMETRY" WHERE pkid=NEW.ROWID; SELECT RTreeAlign('idx_poly_GEOMETRY', NEW.ROWID, NEW."GEOMETRY"); END t//1tableidx_poly_GEOMETRYidx_poly_GEOMETRYCREATE VIRTUAL TABLE "idx_poly_GEOMETRY" USING rtree(pkid, xmin, xmax, ymin, ymax)[s/{triggergid_poly_GEOMETRYpolyCREATE TRIGGER "gid_poly_GEOMETRY" AFTER DELETE ON "poly" FOR EACH ROW BEGIN UPDATE geometry_columns_time SET last_delete = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE Lower(f_table_name) = Lower('poly') AND Lower(f_geometry_column) = Lower('GEOMETRY'); DELETE FROM "idx_poly_GEOMETRY" WHERE pkid=OLD.ROWID; ENDgdalautotest-3.0.4/ogr/data/gml_jpfgd/0000755003401500001440000000000013614005353017261 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/gml_jpfgd/ElevPt.xml0000644003401500001440000000215713614005353021207 0ustar rouaultusers GMLドライバテスト用データ. FG-GML-523336-ElevPt-20150101-0001.xmlの一部をもとに作成. 基盤地図情報メタデータ ID=fmdid:15-0101 基盤地図情報ダウンロードデータ(GML版) 99999-99999-i-1 2013-12-10 2015-01-07 25000 表示 34.123456789 133.123456789 標高点(測点) 123 gdalautotest-3.0.4/ogr/data/gml_jpfgd/BldA.xml0000644003401500001440000000266413614005353020615 0ustar rouaultusers テストデータ 基盤地図情報テストデータ(GML版) 20170303-12345-12345-s-12345 2017-03-03 2017-03-07 2500 35.695217139713343 139.718509733734351 35.695312194713338 139.718444177734369 35.695349894966789 139.718496754142762 35.695235944713339 139.718550483734361 35.695217139713343 139.718509733734351 普通建物 gdalautotest-3.0.4/ogr/data/points.vdc0000644003401500001440000000073013614004466017346 0ustar rouaultusersfile format : IDRISI Vector A.1 file title : id type : integer file type : binary object type : point ref. system : utm-31n ref. units : m unit dist. : 1 min. X : 400000 max. X : 600000 min. Y : 4000000 max. Y : 5000000 pos'n error : unknown resolution : unknown min. value : 1 max. value : 1 display min : 1 display max : 1 value units : value error : unknown flag value : none flag def'n : none legend cats : 0 gdalautotest-3.0.4/ogr/data/buggypoint.shx0000644003401500001440000000015413614004466020247 0ustar rouaultusers' 6ANAANA2 gdalautotest-3.0.4/ogr/data/gjline.shp0000644003401500001440000000027413614004466017323 0ustar rouaultusers' ^Y@@Y@?(Y@@Y@?Y@@Y@?gdalautotest-3.0.4/ogr/data/test_dgnv8.dgn0000644003401500001440000006600013614004466020115 0ustar rouaultusersࡱ> ,34Oh+'0B P X d p | BB1@@@ @px GB(X=Ki--iK9-KKMiWakuiiZZii\fpzxxzZxŰ`s7:000 @.C%C!c T-4>q͜X+jJcPGʁ="Dv#QXP1H ͍́g~.OGEi윺Iʃ RIs)m4>.xWR_Q\#x[{lE*hҤD))T(w[8^-$4#H"!*GMI iUh0K_w7v`<}qzP:aC@E5d!B^ =U~6Nܹ;"ĮX+JC=1-b\ePB=oeNUR# 9Ӫ &L0aCM&L@@K5GlDVk„ hr#R hG8|#>zF]' $eoGF[>xrH(g}64,PJA~-~{VJ8K̵E7J&n+$0a„ &L0a„/cug G2WIOK#g'0O9|J0HCM#  L &18ɲ9+opX!7CEW=,eA6&xc`Y I,Κ0wcL_g:&JF(Q(ѭA/+Է:ЯšB^ L Iʞ[ k1W${ dMqP^3z3tsqK|˜ѦAb1Y56q1cr߄ XGMM9+w OW;Ab352wRu\$_8:+)MޛNDON! 'SB9VJ@̱Op 4O՚}M[ϻ7nDj{XSOFrg{P82cc@~\/Z- ׂ -*6s6&azk\ДJm؛Xb[Q63{`ɵBKVXPyﳏOXo-ݟ R|JCܔumT`;>S? \;9}ַ ]ؾ7v]n}@Om~VS_wzK T oqM9~b߷y(m3ysߴ}@sXP2͛1,jٳg>rI?o Rp@"iC"{FXb%Xܶ؄Ur@JO@n#݌r}2~7^%j\>گ;_;zDZ˽ꐗm2\2|֐t;kCܜinE4HlB79n=K-{?c A965G{lnK')O|99N$/r^TDetW㖝ʝM'JbӼ:EmCXiLj=M ^D0[X\j\rJ ( r\"bak\(4WGr}m=!/G~H%2qYyd/g$z1Ltɥ.F RIK/A6toR:rYi9gg;P#3bPi8p%1>$l-J~C]/fyӿiC"{FXb%Xܶ؄Ur@JOxcd`Q0 F(`Q0 FHN@lH+1?\f܍N,@#\@,b`B;;c7[ 4L6.hC BɎB ƒ6_R(䄀\Jx\|T8P H!Ƀ2 Jd>C^SnFRb}j'j$ySj/~\9hxXc˵--KKii``--------ii``KK@@@KKKZZZWakuiiiiZZZiiixxxfpzxxxzii`ii`ZZZZZZZZZZiiixxx`xxxxiiixxxxxxzxxxp MOe|p BU: 2:k|mhp!P.hB) v>'Hi?rbɧ|6$@9<x$4xĶ+@[lA\->a=҇7B׃؈TR\ Wxv&l>PIG+r6m v )d\iݢ N yPXxK't{׬ Q^*Y OI#\UxKQb~;ߡ ՗c |(bx= O;Vݼ P}.na}BX>1 7\n7 'dWb8 Q3Ez1o27}!̛rЮ5ѯ+9k$T3^/*FƝI _l -?G{)#QxVuBҋ%; /_3.4FL/`kȶġ-z֑ 1VRX?%Ʋz d ȳσ%h/ЀH{/P $}N9 dqPzZhƜǏWؾ*\݃2z_3~nbx@^G.T)͙]:'9=mnX %ZKG8"[`!ѓuR3p_|jԧ9=o\:![fwWY%dw^w;O{|׉c6?;؝G*Ydo_ ./N8nYBAܚWZVxTg5w(%i^SnFRb}j'j$ySj/~\9hxXc˵ZSpZd}sϾr12􅕭wDzkd: Κm}.[*-+66`5/TJӼc⹪S]_]&/ݸuJY7x.1ؑռX)ILL}xhn|f9 Us~ȵCOx~`_r')^t4,yR擘Hi {3z{9SY oߊ"Ks6'HHH=8ZZZiiixxxxxxxxxoooooooooooooooooooooooooooooooooooooooooTeigha DGN 4.02.2.0 Root Entry???>ޱ Dgn^Ix?  Dgn~Mix??𿪪  EDgn-Mdoo  #000000  Dgn^G    $1  Dgn^GA   $1   ^AH  Dgn^C   Dgn^CA   ^AH[ rj   Dgn~Mh  Dgn^Nm  $1  !xDgn^NmA  $1  ?^AH  BDgn~H   CDOda~SH  EDgn~S   FSummaryInformation(  CDocumentSummaryInformation8  JDgn~Mf  MTTT>ޱ>ޱ>ޱ>ޱ>ޱ>ޱ  "#$%&'()*+,-./0123456789:;<=>@ADGHIKL    !"#$%&'()*+-./012gdalautotest-3.0.4/ogr/data/small_ntf.mid0000644003401500001440000000021713614004466020006 0ustar rouaultusers" S. 11th St.",4,"Shiffer James A and Martha L",56115.58,637.68,10,"230" " S. 11th St.",4,"Guarino ""Chucky"" Sandra",62480.53,710.01,10,"232" gdalautotest-3.0.4/ogr/data/emptymultipoint.shp0000644003401500001440000000026413614004466021335 0ustar rouaultusers' ZY@@Y@?$Y@@Y@?Y@@Y@?gdalautotest-3.0.4/ogr/data/lambert93_francais.MAP0000644003401500001440000000200013614004466021333 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?H!pNw猠!@أw猠!@^W ^@@G@F@H@\%AP-YA#y=B`<(> K@+=@LONG_INC>@GS_COUNTN>d@tU0d@㥛@d@㥛nQd@ ףad@1rd@1d@X9d@j+d@d@Cd@d@/;d@hd@o=u<}"O>3d@C =oe@t=C 0 gdalautotest-3.0.4/ogr/data/get_capabilities.xml0000644003401500001440000002166713614005354021357 0ustar rouaultusers Overzichtskaart NL Overzichtskaart NL OGC WFS 1.1.0 WFS 1.0.0 1.1.0 text/xml XMLSCHEMA text/xml; subtype=gml/2.1.2 text/xml; subtype=gml/3.1.1 results text/xml; subtype=gml/3.1.1 Query rijkswegen rijkswegen rijkswegen EPSG:28992 text/xml; subtype=gml/3.1.1 3.20018847986592 50.7175338039051 7.2735430151281 53.5582047896104 vaarwegen vaarwegen vaarwegen EPSG:28992 text/xml; subtype=gml/3.1.1 3.20018847986592 50.7175338039051 7.2735430151281 53.5582047896104 bebouwing bebouwing bebouwing EPSG:28992 text/xml; subtype=gml/3.1.1 3.20018847986592 50.7175338039051 7.2735430151281 53.5582047896104 NL-prov NL-prov NL-prov EPSG:28992 text/xml; subtype=gml/3.1.1 3.20018847986592 50.7175338039051 7.2735430151281 53.5582047896104 gml:Point gml:LineString gml:Polygon gml:Envelope LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo EqualTo NotEqualTo Like Between gdalautotest-3.0.4/ogr/data/esrizmultipoint.json0000644003401500001440000000156013614004466021512 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryMultiPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "points" : [ [2,49,1], [3,50,2] ], }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/topojson1.topojson0000644003401500001440000000535113614004466021071 0ustar rouaultusers{ "type":"Topology", "arcs": [ [[0, 0], [10, 0], [0, 10]], [[10, 10], [-10, 0], [0, -10]], [[1,1],[0,8],[8,0],[0,-8],[-8,0]], null, [], [null], [[]], [[0]], [[null, null]], ], "transform": { "scale": [1,10],"translate": [100,1000] }, "objects": [ null, 0, {}, {"type": "GeometryCollection" }, {"type": "GeometryCollection", "geometries" : null }, {"type": "GeometryCollection", "geometries" : [ {"type": "LineString", "arcs": [0] } ], "id" : "a_layer" }, {"type": "invalid" }, {"type": 1 }, {"type": "Point" }, {"type": "Point", "coordinates": null }, {"type": "Point", "coordinates": "null" }, {"type": "Point", "coordinates": [] }, {"type": "Point", "coordinates": [null] }, {"type": "Point", "coordinates": [0] }, {"type": "Point", "coordinates": [0,1] }, {"type": "LineString" }, {"type": "LineString", "arcs": null }, {"type": "LineString", "arcs": "null" }, {"type": "LineString", "arcs": [] }, {"type": "LineString", "arcs": [null] }, {"type": "LineString", "arcs": [10] }, {"type": "LineString", "arcs": [-10] }, {"type": "LineString", "arcs": [3], "properties" : null }, {"type": "LineString", "arcs": [4], "properties" : [] }, {"type": "LineString", "arcs": [5], "properties" : {} }, {"type": "LineString", "arcs": [6], "properties" : { "name": null } }, {"type": "LineString", "arcs": [7], "properties" : { "name": 0 } }, {"type": "LineString", "arcs": [8], "properties" : { "name": "foo" } }, {"type": "LineString", "arcs": [0], "id" : 1 }, {"type": "LineString", "arcs": [-1], "id" : "2" }, {"type": "Polygon" }, {"type": "Polygon", "arcs": null }, {"type": "Polygon", "arcs": "null" }, {"type": "Polygon", "arcs": []}, {"type": "Polygon", "arcs": [null]}, {"type": "Polygon", "arcs": [0]}, {"type": "Polygon", "arcs": [[0, 1],[2]]}, {"type": "Polygon", "arcs": [[-1, -2],[-3]]}, {"type": "MultiPoint" }, {"type": "MultiPoint", "coordinates": null }, {"type": "MultiPoint", "coordinates": "null" }, {"type": "MultiPoint", "coordinates": [] }, {"type": "MultiPoint", "coordinates": [null] }, {"type": "MultiPoint", "coordinates": [0] }, {"type": "MultiPoint", "coordinates": [[]] }, {"type": "MultiPoint", "coordinates": [[0,1],[1,2]] }, {"type": "MultiPolygon" }, {"type": "MultiPolygon", "arcs": null }, {"type": "MultiPolygon", "arcs": "null" }, {"type": "MultiPolygon", "arcs": [] }, {"type": "MultiPolygon", "arcs": [null] }, {"type": "MultiPolygon", "arcs": [[]] }, {"type": "MultiPolygon", "arcs": [[[-1, -2]],[[-3]]]}, {"type": "MultiLineString" }, {"type": "MultiLineString", "arcs": null }, {"type": "MultiLineString", "arcs": "null" }, {"type": "MultiLineString", "arcs": [] }, {"type": "MultiLineString", "arcs": [null] }, {"type": "MultiLineString", "arcs": [[0]] }, {"type": "MultiLineString", "arcs": [[0,1]] }, {"type": "MultiLineString", "arcs": [[0,1],[2]] }, ] }gdalautotest-3.0.4/ogr/data/testnull.csv0000644003401500001440000000011513614004466017720 0ustar rouaultusers"INTCOL","REALCOL","INTCOL2","REALCOL2","STRINGCOL" 12,5.7,"foo","foo","foo" gdalautotest-3.0.4/ogr/data/flat.dbf0000644003401500001440000000055713614004466016746 0ustar rouaultusers_GfidNotherCxNyNzNwktC 1First 12.500 17.000 1.200POINT(12.5 17 1.2) 2Second 100.000 200.000 0.000POINT(100 200 0) gdalautotest-3.0.4/ogr/data/schema_with_geom_in_complextype.xml0000644003401500001440000000151213614005354024473 0ustar rouaultusers 2 49,2 49 2 49 1 gdalautotest-3.0.4/ogr/data/testpoly.e000000644003401500001440000001507213614004466017532 0ustar rouaultusersEXP 0 /HOME/ME/SAMPLE.E00 ARC 2 1 2 2 1 1 2 2 3.4029994E+05 4.1001998E+06 3.4009988E+05 4.1002000E+06 2 3 3 2 3 2 2 3.4050000E+05 4.1001998E+06 3.4029994E+05 4.1001998E+06 3 1 1 4 1 2 4 3.4009988E+05 4.1002000E+06 3.4040006E+05 4.1003995E+06 3.4090012E+05 4.1002000E+06 3.4070003E+05 4.1001995E+06 4 4 4 3 4 2 2 3.4070003E+05 4.1001995E+06 3.4050000E+05 4.1001998E+06 5 6 3 4 4 3 3 3.4050000E+05 4.1001998E+06 3.4059997E+05 4.1001002E+06 3.4070003E+05 4.1001995E+06 6 7 4 5 1 3 3 3.4070003E+05 4.1001995E+06 3.4079997E+05 4.1000002E+06 3.4019978E+05 4.1000000E+06 7 5 5 2 1 3 2 3.4019978E+05 4.1000000E+06 3.4029994E+05 4.1001998E+06 -1 0 0 0 0 0 0 CNT 2 0 3.4048516E+05 4.1001702E+06 1 3.4046691E+05 4.1002662E+06 1 1 3.4048875E+05 4.1000852E+06 2 0 3.4060000E+05 4.1001665E+06 -1 0 0 0 0 0 0 LAB 2 1 2 3.4046650E+05 4.1002668E+06 3.4046650E+05 4.1002668E+06 3.4046650E+05 4.1002668E+06 2 3 3.4048869E+05 4.1000852E+06 3.4048869E+05 4.1000852E+06 3.4048869E+05 4.1000852E+06 -1 0 0.0000000E+00 0.0000000E+00 PAL 2 5 3.4009988E+05 4.1000000E+06 3.4090012E+05 4.1003995E+06 0 0 0 -1 1 2 -7 2 3 -6 5 3 -3 4 2 4 3.4009988E+05 4.1001995E+06 3.4090012E+05 4.1003995E+06 1 2 1 3 1 1 4 4 4 2 3 3 4 3.4019978E+05 4.1000000E+06 3.4079997E+05 4.1001998E+06 -2 2 2 5 3 4 6 4 1 7 5 1 2 3.4050000E+05 4.1001002E+06 3.4070003E+05 4.1001998E+06 -4 3 2 -5 4 3 -1 0 0 0 0 0 0 TOL 2 1 1 8.1813842E-01 2 2 0.0000000E+00 3 2 0.0000000E+00 4 1 0.0000000E+00 5 2 0.0000000E+00 6 2 8.0025000E+00 7 2 8.0025000E-01 8 2 8.0025000E-01 9 2 8.0025000E-01 10 2 8.0025000E-01 -1 0 0 0 0 0 0 SIN 2 EOX LOG 2 19940118 849 0 3 35export cover landli stdfigc none ~ 19940118 850 0 7 190clean landli landlicp # # poly ~ EOL PRJ 2 Projection UTM ~ Zone 13 ~ Datum NAD27 ~ Zunits NO ~ Units METERS ~ Spheroid CLARKE1866 ~ Xshift 0.0000000000 ~ Yshift 0.0000000000 ~ Parameters ~ EOP IFO 2 LANDLICP.ACODE 8 8 80 7 LANDLICP-ID 4-1 14-1 8-1 50-1 -1 -1-1 1- XLABEL 4-1 54-1 8 2 60-1 -1 -1-1 2- YLABEL 4-1 94-1 8 2 60-1 -1 -1-1 3- SIZE 4-1 134-1 8 2 60-1 -1 -1-1 4- ANGLE 4-1 174-1 8 2 60-1 -1 -1-1 5- SZLBL 4-1 214-1 4-1 50-1 -1 -1-1 6- IFONTF 4-1 254-1 4-1 50-1 -1 -1-1 7- LABEL 52-1 294-1 52-1 20-1 -1 -1-1 8- 1 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 2 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 3 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 4 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 5 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 6 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 7 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0 0 LANDLICP.BND XX 4 4 16 1 XMIN 4-1 14-1 12 3 60-1 -1 -1-1 1- YMIN 4-1 54-1 12 3 60-1 -1 -1-1 2- XMAX 4-1 94-1 12 3 60-1 -1 -1-1 3- YMAX 4-1 134-1 12 3 60-1 -1 -1-1 4- 3.4009988E+05 4.1000000E+06 3.4090012E+05 4.1003995E+06 LANDLICP.PAT XX 4 4 16 4 AREA 4-1 14-1 12 3 60-1 -1 -1-1 1- PERIMETER 4-1 54-1 12 3 60-1 -1 -1-1 2- LANDLICP# 4-1 94-1 5-1 50-1 -1 -1-1 3- LANDLICP-ID 4-1 134-1 5-1 50-1 -1 -1-1 4- -1.7982806E+05 2.3455293E+03 1 0 8.0025000E+04 1.6990741E+03 2 1 8.9864000E+04 1.5285940E+03 3 2 9.9390586E+03 4.8201389E+02 4 0 LANDLICP.PCODE 8 8 80 2 LANDLICP-ID 4-1 14-1 8-1 50-1 -1 -1-1 1- XLABEL 4-1 54-1 8 2 60-1 -1 -1-1 2- YLABEL 4-1 94-1 8 2 60-1 -1 -1-1 3- SIZE 4-1 134-1 8 2 60-1 -1 -1-1 4- ANGLE 4-1 174-1 8 2 60-1 -1 -1-1 5- SZLBL 4-1 214-1 4-1 50-1 -1 -1-1 6- IFONTF 4-1 254-1 4-1 50-1 -1 -1-1 7- LABEL 52-1 294-1 52-1 20-1 -1 -1-1 8- 1 1.6050000E+00 1.4490000E+00 7.0000000E-02 0.0000000E+00 5 0LARGE 2 1.6470000E+00 1.1520000E+00 7.0000000E-02 0.0000000E+00 5 0SMALL LANDLICP.TIC XX 3 3 12 4 IDTIC 4-1 14-1 5-1 50-1 -1 -1-1 1- XTIC 4-1 54-1 12 3 60-1 -1 -1-1 2- YTIC 4-1 94-1 12 3 60-1 -1 -1-1 3- 1 3.4009244E+05 4.1000002E+06 2 3.4010028E+05 4.1004150E+06 3 3.4090753E+05 4.1003998E+06 4 3.4089972E+05 4.0999850E+06 EOI EOS gdalautotest-3.0.4/ogr/data/esrimultipoint.json0000644003401500001440000000155413614004466021323 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryMultiPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "points" : [ [2,49], [3,50] ], }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/test_dgnv8_ref.csv0000644003401500001440000006052713614004466021004 0ustar rouaultusersWKT,Type,Level,GraphicGroup,ColorIndex,Weight,Style,Text,ogr_style "POINT Z (0 1 2)",3,1,2,3,5,4,, "POINT (0 1)",3,64,0,0,0,0,, "LINESTRING Z (0 1 2,3 4 5)",3,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0 1,2 3)",3,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POINT (0 1)",17,64,0,256,0,0,myTéxt,"LABEL(t:""myTéxt"",c:#ffc896,s:1.000000g,f:""Arial"",p:7,a:-45)" "POINT Z (0 1 2)",17,64,0,0,0,0,x,"LABEL(t:""x"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "POINT (0 1)",17,64,0,0,0,0,z,"LABEL(t:""z"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "POINT Z (0 1 2)",17,64,0,0,0,0,z,"LABEL(t:""z"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "LINESTRING Z (0 1 2,3 4 5,6 7 8)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0 1,3 4,6 7)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "MULTIPOINT ((0 1),(3 4))",22,64,0,0,0,0,, "MULTIPOINT Z ((0 1 2),(3 4 2))",22,64,0,0,0,0,, "LINESTRING Z (0 1 2)",36,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (1 1,0.997509025150764 1.14107791808462,0.990048510514454 1.28145299307778,0.977655623999714 1.42042588341694,0.960392106343779 1.55730423315298,0.938343963523229 1.69140612123271,0.911621038276542 1.82206345879524,0.880356462873091 1.9486253175571,0.844705995854882 2.0704611727042,0.804847246055326 2.18696404413471,0.760978787760968 2.29755352040345,0.71331917142438 2.40167865030247,0.6621058348568 2.49882068767225,0.607593920324899 2.58849567576902,0.550055003444841 2.67025685831287,0.489775740206228 2.74369690520508,0.427056438866376 2.80844994182617,0.362209563829682 2.86419337180488,0.295558178965684 2.91064948417703,0.227434338121107 2.9475868369276,0.158177430844304 2.97482141002319,0.088132491563602 2.99221752219058,0.017648480643129 2.999688506874,-0.052923454120163 2.99719714400356,-0.123231726897159 2.98475584542376,-0.192926065409497 2.96242659305831,-0.261659255968441 2.9303206301193,-0.32908887327601 2.88859790689911,-0.394878986370591 2.83746628390611,-0.45870183221809 2.77718049631405,-0.520239448610882 2.70804088488425,-0.579185258239533 2.63039189968302,-0.635245596045539 2.54462038404878,-0.688141172245869 2.45115364735797,-0.737608463740622 2.35045733619126,-0.783401026971853 2.24303311450572,-0.825290725692977 2.12941616437017,-0.863068867532084 2.01017251971509,-0.896547243686828 1.88589624638002,-0.925559066571221 1.75720648250741,-0.949959800742991 1.62474435402759,-0.969627882971888 1.4891697806016,-0.984465327861583 1.35115818793464,-0.994398216007982 1.21139714283919,-0.999377062261978 1.07058292781171,-0.999377062261978 0.929417072188295,-0.994398216007982 0.788602857160815,-0.984465327861583 0.648841812065358,-0.969627882971888 0.5108302193984,-0.949959800742991 0.375255645972412,-0.925559066571221 0.242793517492593,-0.896547243686829 0.114103753619984,-0.863068867532084 -0.010172519715095,-0.825290725692977 -0.129416164370174,-0.783401026971853 -0.243033114505718,-0.737608463740622 -0.350457336191261,-0.688141172245869 -0.451153647357965,-0.635245596045539 -0.544620384048777,-0.579185258239534 -0.630391899683024,-0.520239448610882 -0.708040884884253,-0.458701832218091 -0.777180496314054,-0.394878986370591 -0.837466283906112,-0.32908887327601 -0.888597906899111,-0.26165925596844 -0.930320630119299,-0.192926065409497 -0.962426593058309,-0.123231726897159 -0.984755845423758,-0.052923454120163 -0.997197144003557,0.017648480643128 -0.999688506873997,0.088132491563602 -0.992217522190578,0.158177430844304 -0.97482141002319,0.227434338121106 -0.947586836927601,0.295558178965684 -0.910649484177031,0.362209563829682 -0.86419337180488,0.427056438866376 -0.80844994182617,0.489775740206228 -0.743696905205077,0.550055003444841 -0.670256858312871,0.607593920324898 -0.588495675769023,0.662105834856801 -0.49882068767225,0.71331917142438 -0.401678650302467,0.760978787760968 -0.297553520403453,0.804847246055326 -0.186964044134713,0.844705995854882 -0.0704611727042,0.880356462873091 0.051374682442894,0.911621038276542 0.177936541204757,0.938343963523229 0.308593878767287,0.960392106343779 0.442695766847016,0.977655623999714 0.579574116583056,0.990048510514454 0.718547006922218,0.997509025150764 0.858922081915375,1.0 1.0)",15,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CIRCULARSTRING (0.707106781186548 1.70710678118655,-0.707106781186547 1.70710678118655,-0.707106781186548 0.292893218813453,0.707106781186547 0.292893218813452,0.707106781186548 1.70710678118655)",15,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CIRCULARSTRING Z (1 1 2,0.0 2.0 2,-1.0 1.0 2,-0.0 0.0 2,1.0 1.0 2)",15,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0.984807753012208 1.34729635533386,0.969910656567805 1.48692224544052,0.950071117740945 1.62406689139697,0.925390234273861 1.7580314355238,0.895993774291336 1.88813322521155,0.862031535415169 2.01370929156197,0.823676581429833 2.13411972772554,0.781124360389093 2.24875094972013,0.734591708657533 2.35701882311426,0.684315745962138 2.45837163964235,0.630552667084523 2.55229292858351,0.573576436351046 2.63830408857798,0.513677391573406 2.71596682646995,0.451160764553701 2.78488539074902,0.386345125693129 2.84470858820916,0.31956076063025 2.89513157354883,0.251147987181079 2.93589740279271,0.181455421157503 2.96679834261935,0.110838199901011 2.98767692892251,0.039656172584212 2.99842676921219,-0.031727933498068 2.99899308476637,-0.102950361303934 2.98937298977079,-0.17364817766693 2.96961550602442,-0.243461122720259 2.93982131313561,-0.312033445698487 2.90014223548189,-0.3790157177619 2.85078046854772,-0.444066612605774 2.79198754858267,-0.506854645780983 2.72406307083034,-0.567059863862771 2.64735316285967,-0.624375474860063 2.56224872077819,-0.678509411557132 2.46918341731507,-0.729185819821177 2.36863149192428,-0.776146464291757 2.26110533416905,-0.819152044288992 2.14715287270209,-0.857983413234977 2.02735478314681,-0.89244269537451 1.9023215291074,-0.922354294104581 1.77269025138626,-0.947565786774415 1.6391215212605,-0.967948701396356 1.50229597436216,-0.983399171309674 1.36291084231501,-0.993838464461254 1.22167639980202,-0.999213384606097 1.07931234516843,-0.999496542383185 0.936544133003865,-0.994686494885393 0.794099277392132,-0.984807753012208 0.652703644666141)",16,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CIRCULARSTRING (0.573576436351046 1.81915204428899,-0.819152044288992 1.57357643635105,-0.573576436351046 0.180847955711008)",16,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CIRCULARSTRING Z (0.984807753012208 1.17364817766693 2,-0.17364817766693 1.98480775301221 2,-0.984807753012208 0.82635182233307 2)",16,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (1 1,1.03550295857988 0.953117888029131,1.06508875739645 0.891215293582157,1.0887573964497 0.817023213472918,1.10650887573965 0.733272644515248,1.11834319526627 0.642694583522986,1.12426035502959 0.548020027309968,1.12426035502959 0.451979972690032,1.11834319526627 0.357305416477014,1.10650887573965 0.266727355484752,1.0887573964497 0.182976786527082,1.06508875739645 0.108784706417842,1.03550295857988 0.046882111970869,1 0,0.953117888029131 -0.035502958579882,0.891215293582158 -0.06508875739645,0.817023213472918 -0.088757396449704,0.733272644515248 -0.106508875739645,0.642694583522986 -0.118343195266272,0.548020027309968 -0.124260355029586,0.451979972690032 -0.124260355029586,0.357305416477014 -0.118343195266272,0.266727355484752 -0.106508875739645,0.182976786527082 -0.088757396449704,0.108784706417842 -0.06508875739645,0.046882111970869 -0.035502958579882,0 0,-0.035502958579882 0.046882111970869,-0.06508875739645 0.108784706417842,-0.088757396449704 0.182976786527082,-0.106508875739645 0.266727355484752,-0.118343195266272 0.357305416477014,-0.124260355029586 0.451979972690032,-0.124260355029586 0.548020027309968,-0.118343195266272 0.642694583522986,-0.106508875739645 0.733272644515248,-0.088757396449704 0.817023213472918,-0.06508875739645 0.891215293582158,-0.035502958579882 0.95311788802913,0 1)",11,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (1 1 1,1.03550295857988 0.953117888029131 1,1.06508875739645 0.891215293582157 1,1.0887573964497 0.817023213472918 1,1.10650887573965 0.733272644515248 1,1.11834319526627 0.642694583522986 1,1.12426035502959 0.548020027309968 1,1.12426035502959 0.451979972690032 1,1.11834319526627 0.357305416477014 1,1.10650887573965 0.266727355484752 1,1.0887573964497 0.182976786527082 1,1.06508875739645 0.108784706417842 1,1.03550295857988 0.046882111970869 1,1 0 1,0.953117888029131 -0.035502958579882 1,0.891215293582158 -0.06508875739645 1,0.817023213472918 -0.088757396449704 1,0.733272644515248 -0.106508875739645 1,0.642694583522986 -0.118343195266272 1,0.548020027309968 -0.124260355029586 1,0.451979972690032 -0.124260355029586 1,0.357305416477014 -0.118343195266272 1,0.266727355484752 -0.106508875739645 1,0.182976786527082 -0.088757396449704 1,0.108784706417842 -0.06508875739645 1,0.046882111970869 -0.035502958579882 1,0 0 1,-0.035502958579882 0.046882111970869 1,-0.06508875739645 0.108784706417842 1,-0.088757396449704 0.182976786527082 1,-0.106508875739645 0.266727355484752 1,-0.118343195266272 0.357305416477014 1,-0.124260355029586 0.451979972690032 1,-0.124260355029586 0.548020027309968 1,-0.118343195266272 0.642694583522986 1,-0.106508875739645 0.733272644515248 1,-0.088757396449704 0.817023213472918 1,-0.06508875739645 0.891215293582158 1,-0.035502958579882 0.95311788802913 1,0 1 1)",11,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (-1.16666666666667 0.916666666666667 0,-1.22161572152053 0.939262303213449 0,-1.28463185337426 0.956809978404035 0,-1.35368621651529 0.969309692238426 0,-1.42674996523111 0.97676144471662 0,-1.50179425380916 0.979165235838618 0,-1.57679023653692 0.97652106560442 0,-1.64970906770184 0.968828934014026 0,-1.71852190159138 0.956088841067436 0,-1.78119989249301 0.93830078676465 0,-1.83571423120655 0.915464789361847 0,-1.88042474607572 0.887775185887156 0,-1.91503933823249 0.856100349762836 0,-1.93955800767687 0.821454703845157 0,-1.95398075440886 0.784852670990387 0,-1.95830757842845 0.747308674054796 0,-1.95253847973566 0.709837135894653 0,-1.93667345833047 0.673452479366227 0,-1.91071251421289 0.639169127325787 0,-1.87465564738292 0.608001502629602 0,-1.82850285784056 0.58096380905979 0,-1.7722541455858 0.55873794229565 0,-1.70590951061865 0.541004519609273 0,-1.62946895293911 0.527256329572524 0,-1.54293247254718 0.516986160757269 0,-1.44630006944285 0.509686801735374 0,-1.33957174362614 0.504851041078703 0,-1.22274749509703 0.501971667359124 0,-1.09582732385553 0.500541469148499 0,-0.958811229901635 0.500053235018696 0,-0.811700199069029 0.5 0,-0.654996020700608 0.5 0,-0.490514600434124 0.5 0,-0.320284783982116 0.5 0,-0.146335417057121 0.5 0,0.029304654628324 0.5 0,0.204606585361678 0.5 0,0.377541529430404 0.5 0,0.546080641121964 0.5 0,0.70819507472382 0.5 0,0.861858321314378 0.500000584197736 0,1.00560503040987 0.5001426264004 0,1.13925581679296 0.500888491731795 0,1.26281068046366 0.502745391620056 0,1.37626962142198 0.506220537493318 0,1.4796326396679 0.511821140779715 0,1.57289973520142 0.520054412907382 0,1.65607090802256 0.531427565304453 0,1.7291461581313 0.546447809399062 0,1.79212548552765 0.565622356619346 0,1.84500889021161 0.589454995359827 0,1.88779637218318 0.617981900239693 0,1.92048793144235 0.650300814367993 0,1.94308356798913 0.685397314888458 0,1.95558328182352 0.72225697894482 0,1.95798707294552 0.759865383680809 0,1.95029494135513 0.797208106240156 0,1.93250688705234 0.833270723766592 0,1.90462291003716 0.867038813403848 0,1.86664301030959 0.897497952295654 0,1.81857507453907 0.923637660920461 0,1.76111411546968 0.944791022794045 0,1.69616574960401 0.960896423311432 0,1.62575882265462 0.971953862472624 0,1.55192218033403 0.977963340277619 0,1.47668466835478 0.978924856726418 0,1.40207513242941 0.974838411819021 0,1.33012241827046 0.965704005555428 0,1.26285537159047 0.95152163793564 0,1.20230283810197 0.932291308959654 0,1.15047487790906 0.908013018627473 0,1.10825441460886 0.878686766939096 0,1.07477731021269 0.844312553894523 0,1.04902914186428 0.804890379493754 0,1.02999548670737 0.760420243736788 0,1.01666192188568 0.710902146623627 0,1.00801402454295 0.65633608815427 0,1.00303737182291 0.596722068328716 0,1.00071754086929 0.532060087146967 0,1.00004010882581 0.462350144609021 0,1.0 0.387601587878656 0,1.0 0.308231625420298 0,1.0 0.225214571264401 0,1.0 0.139564848267234 0,1.0 0.052296879285067 0,1.0 -0.035574912825832 0,1.0 -0.123036105209193 0,1.0 -0.209072275008748 0,1.0 -0.292668999368227 0,1.0 -0.372811855431362 0,1.00001330875467 -0.448499729096557 0,1.00049291683978 -0.519171188083301 0,1.00242170043384 -0.58479468571385 0,1.00681408239313 -0.645370221988202 0,1.01468448557391 -0.700897796906359 0,1.02704733283246 -0.75137741046832 0,1.04491704702503 -0.796809062674084 0,1.06930805100791 -0.837192753523653 0,1.10123476763736 -0.872528483017025 0,1.14171161976965 -0.902816251154201 0,1.19169826172329 -0.928056057935182 0,1.2507418124596 -0.948247903359966 0,1.3168863231898 -0.963391787428554 0,1.38810294820134 -0.973487710140946 0,1.46236284178169 -0.978535671497142 0,1.53763715821831 -0.978535671497142 0,1.61189705179866 -0.973487710140946 0,1.6831136768102 -0.963391787428554 0,1.7492581875404 -0.948247903359966 0,1.80830173827671 -0.928056057935182 0,1.85826408125577 -0.902840550128785 0,1.89816701388094 -0.873126701498727 0,1.92797402379372 -0.839910678722025 0,1.9476851109941 -0.804206904654949 0,1.95730027548209 -0.767029802153769 0,1.95681951725769 -0.729393794074753 0,1.9462428363209 -0.692313303274169 0,1.92557023267172 -0.656802752608287 0,1.89480170631014 -0.623876564933378 0,1.85393725723617 -0.594549163105708 0,1.80297688544981 -0.569787649964928 0,1.74192059095106 -0.549764299946542 0,1.67076837373992 -0.533991864754427 0,1.58952023381638 -0.521963132960447 0,1.49817617118045 -0.513170893136469 0,1.39673618583213 -0.507107933854357 0,1.28520027777142 -0.503267043685978 0,1.16356844699831 -0.501141011203196 0,1.03184069351282 -0.500222624977878 0,0.890017017314927 -0.500004673581888 0,0.738177636056274 -0.5 0,0.577516978520544 -0.5 0,0.410045196092726 -0.5 0,0.237791134485349 -0.5 0,0.062783639410957 -0.5 0,-0.112948443417913 -0.5 0,-0.28737626828872 -0.5 0,-0.458470989488931 -0.5 0,-0.624203761306007 -0.5 0,-0.782545738027407 -0.5 0,-0.931568263852325 -0.500025047477933 0,-1.07050739070381 -0.500391366842696 0,-1.19935059484291 -0.501603038587685 0,-1.31809787626962 -0.504167274141031 0,-1.42674923498394 -0.508591284930871 0,-1.52530467098586 -0.515382282385339 0,-1.61376418427539 -0.52504747793257 0,-1.69212777485253 -0.538094083000697 0,-1.76039544271728 -0.555029309017855 0,-1.81856718786963 -0.576360367412179 0,-1.86664301030959 -0.602502047704345 0,-1.90462291003716 -0.632961186596153 0,-1.93250688705234 -0.666729276233409 0,-1.95029494135513 -0.702791893759845 0,-1.95798707294552 -0.740134616319191 0,-1.95558328182352 -0.77774302105518 0,-1.94308356798913 -0.814602685111542 0,-1.92048793144235 -0.849699185632008 0,-1.88779637218318 -0.882018099760307 0,-1.84500889021161 -0.910545004640173 0,-1.79227504014808 -0.934340254725548 0,-1.73099561862652 -0.953089825477134 0,-1.66319490731466 -0.966791434872523 0,-1.59090175192503 -0.975445082911716 0,-1.51614499817018 -0.979050769594713 0,-1.44095349176265 -0.977608494921514 0,-1.36735607841496 -0.971118258892119 0,-1.29738160383967 -0.959580061506528 0,-1.2330589137493 -0.942993902764741 0,-1.1764168538564 -0.921359782666758 0,-1.12921519204752 -0.894677701212579 0,-1.09128474830954 -0.862947658402203 0,-1.06161460497261 -0.826169654235633 0,-1.03919033918046 -0.784343688712865 0,-1.02299752807682 -0.737469761833901 0,-1.01202174880542 -0.685547873598742 0,-1.00524857850999 -0.628578024007387 0,-1.00166359433426 -0.566560213059835 0,-1.00025237342197 -0.499494440756087 0,-1.00000049291684 -0.427380707096143 0,-1.0 -0.350378717136092 0,-1.0 -0.269633763153167 0,-1.0 -0.186666740056507 0,-1.0 -0.102999282130519 0,-1.0 -0.020153023659606 0,-1.0 0.060350401071827 0,-1.0 0.13698935777938 0,-1.0 0.208242212178646 0,-1.0 0.272587329985224 0,-1.0 0.328503076914707 0,-1.0 0.374843476083145 0,-1.0 0.412465107421002 0,-1.0 0.442889167064378 0,-1.0 0.467637289297677 0,-1.0 0.488231108405302 0,-1.0 0.506192258671658 0,-1.0 0.523042374381148 0,-1.0 0.540303089818175 0,-1.0 0.559496039267143 0,-1.0 0.582142857012456 0,-1.00014604943401 0.609400053753494 0,-1.00125823413017 0.64073904920431 0,-1.00435095868857 0.675145466149082 0,-1.01043864596547 0.711604881731541 0,-1.02053571881716 0.74910287309542 0,-1.03565660009989 0.786625017384447 0,-1.05681571266994 0.823156891742354 0,-1.08502747938357 0.857684073312872 0,-1.12130632309706 0.889192139239733 0,-1.16666666666667 0.916666666666667 0)",27,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (-1.16666666666667 0.916666666666667,-1.22161572152053 0.939262303213449,-1.28463185337426 0.956809978404035,-1.35368621651529 0.969309692238426,-1.42674996523111 0.97676144471662,-1.50179425380916 0.979165235838618,-1.57679023653692 0.97652106560442,-1.64970906770184 0.968828934014026,-1.71852190159138 0.956088841067436,-1.78119989249301 0.93830078676465,-1.83571423120655 0.915464789361847,-1.88042474607572 0.887775185887156,-1.91503933823249 0.856100349762836,-1.93955800767687 0.821454703845157,-1.95398075440886 0.784852670990387,-1.95830757842845 0.747308674054796,-1.95253847973566 0.709837135894653,-1.93667345833047 0.673452479366227,-1.91071251421289 0.639169127325787,-1.87465564738292 0.608001502629602,-1.82850285784056 0.58096380905979,-1.7722541455858 0.55873794229565,-1.70590951061865 0.541004519609273,-1.62946895293911 0.527256329572524,-1.54293247254718 0.516986160757269,-1.44630006944285 0.509686801735374,-1.33957174362614 0.504851041078703,-1.22274749509703 0.501971667359124,-1.09582732385553 0.500541469148499,-0.958811229901635 0.500053235018696,-0.811700199069029 0.5,-0.654996020700608 0.5,-0.490514600434124 0.5,-0.320284783982116 0.5,-0.146335417057121 0.5,0.029304654628324 0.5,0.204606585361678 0.5,0.377541529430404 0.5,0.546080641121964 0.5,0.70819507472382 0.5,0.861858321314378 0.500000584197736,1.00560503040987 0.5001426264004,1.13925581679296 0.500888491731795,1.26281068046366 0.502745391620056,1.37626962142198 0.506220537493318,1.4796326396679 0.511821140779715,1.57289973520142 0.520054412907382,1.65607090802256 0.531427565304453,1.7291461581313 0.546447809399062,1.79212548552765 0.565622356619346,1.84500889021161 0.589454995359827,1.88779637218318 0.617981900239693,1.92048793144235 0.650300814367993,1.94308356798913 0.685397314888458,1.95558328182352 0.72225697894482,1.95798707294552 0.759865383680809,1.95029494135513 0.797208106240156,1.93250688705234 0.833270723766592,1.90462291003716 0.867038813403848,1.86664301030959 0.897497952295654,1.81857507453907 0.923637660920461,1.76111411546968 0.944791022794045,1.69616574960401 0.960896423311432,1.62575882265462 0.971953862472624,1.55192218033403 0.977963340277619,1.47668466835478 0.978924856726418,1.40207513242941 0.974838411819021,1.33012241827046 0.965704005555428,1.26285537159047 0.95152163793564,1.20230283810197 0.932291308959654,1.15047487790906 0.908013018627473,1.10825441460886 0.878686766939096,1.07477731021269 0.844312553894523,1.04902914186428 0.804890379493754,1.02999548670737 0.760420243736788,1.01666192188568 0.710902146623627,1.00801402454295 0.65633608815427,1.00303737182291 0.596722068328716,1.00071754086929 0.532060087146967,1.00004010882581 0.462350144609021,1.0 0.387601587878656,1.0 0.308231625420298,1.0 0.225214571264401,1.0 0.139564848267234,1.0 0.052296879285067,1.0 -0.035574912825832,1.0 -0.123036105209193,1.0 -0.209072275008748,1.0 -0.292668999368227,1.0 -0.372811855431362,1.00001330875467 -0.448499729096557,1.00049291683978 -0.519171188083301,1.00242170043384 -0.58479468571385,1.00681408239313 -0.645370221988202,1.01468448557391 -0.700897796906359,1.02704733283246 -0.75137741046832,1.04491704702503 -0.796809062674084,1.06930805100791 -0.837192753523653,1.10123476763736 -0.872528483017025,1.14171161976965 -0.902816251154201,1.19169826172329 -0.928056057935182,1.2507418124596 -0.948247903359966,1.3168863231898 -0.963391787428554,1.38810294820134 -0.973487710140946,1.46236284178169 -0.978535671497142,1.53763715821831 -0.978535671497142,1.61189705179866 -0.973487710140946,1.6831136768102 -0.963391787428554,1.7492581875404 -0.948247903359966,1.80830173827671 -0.928056057935182,1.85826408125577 -0.902840550128785,1.89816701388094 -0.873126701498727,1.92797402379372 -0.839910678722025,1.9476851109941 -0.804206904654949,1.95730027548209 -0.767029802153769,1.95681951725769 -0.729393794074753,1.9462428363209 -0.692313303274169,1.92557023267172 -0.656802752608287,1.89480170631014 -0.623876564933378,1.85393725723617 -0.594549163105708,1.80297688544981 -0.569787649964928,1.74192059095106 -0.549764299946542,1.67076837373992 -0.533991864754427,1.58952023381638 -0.521963132960447,1.49817617118045 -0.513170893136469,1.39673618583213 -0.507107933854357,1.28520027777142 -0.503267043685978,1.16356844699831 -0.501141011203196,1.03184069351282 -0.500222624977878,0.890017017314927 -0.500004673581888,0.738177636056274 -0.5,0.577516978520544 -0.5,0.410045196092726 -0.5,0.237791134485349 -0.5,0.062783639410957 -0.5,-0.112948443417913 -0.5,-0.28737626828872 -0.5,-0.458470989488931 -0.5,-0.624203761306007 -0.5,-0.782545738027407 -0.5,-0.931568263852325 -0.500025047477933,-1.07050739070381 -0.500391366842696,-1.19935059484291 -0.501603038587685,-1.31809787626962 -0.504167274141031,-1.42674923498394 -0.508591284930871,-1.52530467098586 -0.515382282385339,-1.61376418427539 -0.52504747793257,-1.69212777485253 -0.538094083000697,-1.76039544271728 -0.555029309017855,-1.81856718786963 -0.576360367412179,-1.86664301030959 -0.602502047704345,-1.90462291003716 -0.632961186596153,-1.93250688705234 -0.666729276233409,-1.95029494135513 -0.702791893759845,-1.95798707294552 -0.740134616319191,-1.95558328182352 -0.77774302105518,-1.94308356798913 -0.814602685111542,-1.92048793144235 -0.849699185632008,-1.88779637218318 -0.882018099760307,-1.84500889021161 -0.910545004640173,-1.79227504014808 -0.934340254725548,-1.73099561862652 -0.953089825477134,-1.66319490731466 -0.966791434872523,-1.59090175192503 -0.975445082911716,-1.51614499817018 -0.979050769594713,-1.44095349176265 -0.977608494921514,-1.36735607841496 -0.971118258892119,-1.29738160383967 -0.959580061506528,-1.2330589137493 -0.942993902764741,-1.1764168538564 -0.921359782666758,-1.12921519204752 -0.894677701212579,-1.09128474830954 -0.862947658402203,-1.06161460497261 -0.826169654235633,-1.03919033918046 -0.784343688712865,-1.02299752807682 -0.737469761833901,-1.01202174880542 -0.685547873598742,-1.00524857850999 -0.628578024007387,-1.00166359433426 -0.566560213059835,-1.00025237342197 -0.499494440756087,-1.00000049291684 -0.427380707096143,-1.0 -0.350378717136092,-1.0 -0.269633763153167,-1.0 -0.186666740056507,-1.0 -0.102999282130519,-1.0 -0.020153023659606,-1.0 0.060350401071827,-1.0 0.13698935777938,-1.0 0.208242212178646,-1.0 0.272587329985224,-1.0 0.328503076914707,-1.0 0.374843476083145,-1.0 0.412465107421002,-1.0 0.442889167064378,-1.0 0.467637289297677,-1.0 0.488231108405302,-1.0 0.506192258671658,-1.0 0.523042374381148,-1.0 0.540303089818175,-1.0 0.559496039267143,-1.0 0.582142857012456,-1.00014604943401 0.609400053753494,-1.00125823413017 0.64073904920431,-1.00435095868857 0.675145466149082,-1.01043864596547 0.711604881731541,-1.02053571881716 0.74910287309542,-1.03565660009989 0.786625017384447,-1.05681571266994 0.823156891742354,-1.08502747938357 0.857684073312872,-1.12130632309706 0.889192139239733,-1.16666666666667 0.916666666666667)",27,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "MULTILINESTRING ((0 1,2 3),(2 3,4 5))",12,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "MULTILINESTRING Z ((0 1 2,2 3 2),(2 3 2,4 5 2))",12,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "COMPOUNDCURVE ((0 1,2 1),CIRCULARSTRING (2 1,3 0,4.0 1.0))",12,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,0 0))",6,64,0,0,0,0,,"BRUSH(fc:#c8ff96,id:""ogr-brush-0"");PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON Z ((0 0 1,0 1 1,1 1 1,0 0 1))",6,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,0 0),(0.1 0.1,0.1 0.9,0.9 0.9,0.1 0.1))",2,0,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON Z ((0 0 1,0 1 1,1 1 1,0 0 1),(0.1 0.1 1,0.1 0.9 1,0.9 0.9 1,0.1 0.1 1))",2,0,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,1 0,0 0))",14,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CURVEPOLYGON (COMPOUNDCURVE ((0 0,0 1),CIRCULARSTRING (0 1,0.5 1.5,1 1),(1 1,0 0)))",14,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,0 0,1 0,1 1,0 0))",14,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POINT Z (0 1 2)",35,64,0,0,0,0,Named definition, gdalautotest-3.0.4/ogr/data/two_points.pbf0000644003401500001440000000042313614004466020231 0ustar rouaultusers OSMHeader1%-xS/ NHM 33SrI+NOI-nbd3313 OSMDataXNTxb,M/-N-bNJiB:BZ\LZ\B nbdR0296ZvًaKp33CcǕ OSMData[NWxb,M/-N-bNJbNbdbdbm8t?###kWXt 1331t0L`|'gdalautotest-3.0.4/ogr/data/gjmultiline.dbf0000644003401500001440000000025113614004466020332 0ustar rouaultusers_aHFIDN NAMEC< 2 MultiLine 1 gdalautotest-3.0.4/ogr/data/all_geoms.tab0000644003401500001440000000016613614004466017771 0ustar rouaultusers!table !version 650 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 1 NAME Char (1) ; gdalautotest-3.0.4/ogr/data/poly.tar0000644003401500001440000002400013614004466017023 0ustar rouaultuserspoly.dbf0000644000175000017500000000102112116430201011152 0ustar eveneven_ (AREAN EAS_IDN PRFEDEAC 215229.266 16835043411 247328.172 17935043423 261752.781 17135043414 547597.188 17335043416 15775.758 17235043415 101429.977 16935043412 268597.625 16635043409 1634833.375 15835043369 596610.313 16535043408 5268.813 17035043413 poly.PRJ0000644000175000017500000000063711773405744011114 0ustar evenevenPROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["D_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]]poly.shp0000644000175000017500000001074412116430164011235 0ustar eveneven'  1A @+RA@eA-RA|FA .-RARA-RA`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RA<A3-RA LA-RA`LA-RA LA-RAGA -RA|FA`-RA(GA-RA`/IA -RA`HA`m-RA GAC-RACAC-RABA C-RAAAB-RA?A4-RA@s?A3-RA M>AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RA@7>A@,RA@cMA`-RA`/IA -RAIA-RAJA-RAKA`-RANLA-RALA-RA@cMAt-RAKMA`^-RA LA\-RAJAW-RA\JAR-RAGA@0-RA GA--RA sFA&-RAWFA -RAFA-RA EA -RA DA`-RACDA`,RA@@A@,RA@7>A+-RA@s?A3-RA?A4-RAAAB-RABA C-RACAC-RA GAC-RA`HA`m-RA`/IA -RA 1A,RA'AAv-RA<Av-RA<Am-RA@7>A+-RA@@A@,RA'AA@,RA `@A,RA?A ,RA*>A,RA <A,RA:A,RA@s8A ,RA 4A,RA3A`,RA3A ,RA@3A,RA3A,RA4A`,RAl7A-RA t6A -RA`6A-RA5A-RA3A,RA@ 3A,RA 1A3-RA:Ak-RA<Av-RAH<A+-RA@s?A@o-RA<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RACDA`,RANA`^-RAKMA`^-RA AMAL-RANA .-RAKA-RAHA-RAGA-RA``FA@ -RA`FA,RACDA`,RA DA`-RA EA -RAFA-RAWFA -RA sFA&-RA GA--RAGA@0-RA\JAR-RAJAW-RA LA\-RAKMA`^-RAKA,RAnWAU-RARAE-RAdTAU-RATA=-RAtUA(-RA@VA-RAWA-RA`2UA -RArTA@-RA TA-RAnWA`,RAVA`,RA`VA,RA`=VA`,RA!UA@,RASA,RA QA@,RA@OA,RAtNA,RA@OA,RAPA ,RAPA,RA@^QA@,RA^QA ,RA PA-RANA-RAwMA-RA,LA-RA@KA-RAKA-RANA .-RARAE-RADA @+RA@eAQ-RA=@VA-RAWA-RAXA%-RA hZA,-RAZA--RAa[A2-RA]AB-RA`]AP-RA@`A 3-RA`,`A"-RAbA 2-RAbA@B-RAcAI-RA dAM-RAdAQ-RAeA<-RA`weA`'-RA@eA`-RAeA-RA@M_A,RA@^A`,RA^A,RA^A,RA^A,RA]A,RA]A ,RA`^A,RA]AZ,RA@]AR,RA?\A`<,RAYA,RA@XA,RAWA +RA9VA+RA@_UA,RAgPA +RAvOA`+RAOA@+RA` OA+RAFPA`+RAPAm+RA`'OAT+RA@IA @+RA IA@D+RAGA`+RADA2,RA@DAC,RAMA ,RA@OA,RA QA@,RASA,RA!UA@,RA`=VA`,RA`VA,RAVA`,RAnWA`,RA TA-RArTA@-RA`2UA -RAWA-RA@VA-RA @@A2,RA^QA-RAHA-RAKA-RA@KA-RA,LA-RAwMA-RANA-RA PA-RA^QA ,RA@^QA@,RAPA,RAPA ,RA@OA,RAtNA,RA@OA,RAMA ,RA@DAC,RADA2,RACA 6,RAKCAU,RA0CA],RABAq,RAAA,RA'AA@,RA@@A@,RACDA`,RA`FA,RAHA-RA @``FA,RAHA-RAHA-RA`FA,RA``FA@ -RAGA-RAHA-RApoly.shx0000644000175000017500000000026412116430164011241 0ustar eveneven' Z 1A @+RA@eA-RA2H@gdalautotest-3.0.4/ogr/data/idlink2.dbf0000644003401500001440000001013013614004466017340 0ustar rouaultusers_1WEAS_IDCPNAMECPF1CPF2CPF3CPF4CPF5CP 168 _168_ 179 _179_ 171 _171_ 170 _170_ 165 _165_ 158 _158_ 166 _166_ gdalautotest-3.0.4/ogr/data/buggymultipoly2.shp0000644003401500001440000000062413614004466021230 0ustar rouaultusers' Y@Y@@Y@Y@@ Y@@Y@@Y@@Y@@Y@@Y@Y@?@Y@?@Y@Y@ Y@? Y@?333333Y@?333333Y@? Y@?gdalautotest-3.0.4/ogr/data/gxtrack.kml0000644003401500001440000000101513614004466017501 0ustar rouaultusers layer feature clampToGround 2013-05-28T12:00:00 2013-05-28T13:00:00 2 49 3 50 gdalautotest-3.0.4/ogr/data/entities_only.dxf0000644003401500001440000000023613614004466020725 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 POINT 8 POINTS 10 672500. 20 242000. 30 539.986 0 POINT 8 POINTS 10 672750. 20 242000. 30 558.974 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/poly_spatialite.sqlite0000644003401500001440000007600013614004466021764 0ustar rouaultusersSQLite format 3@ ]    D] D[_3polyGEOMETRYR*Tree Spatial Index successfully created2012-04-07 16:29:533.6.223.0.1gw3polyGEOMETRYGeometry [POLYGON,XY,SRID=32631] successfully created2012-04-07 16:29:523.6.223.0.1Q+E3spatial_ref_systable successfully populated2012-04-07 16:29:523.6.223.0.1P-A3geometry_columnstable successfully created2012-04-07 16:29:513.6.223.0.1O+A3spatial_ref_systable successfully created2012-04-07 16:29:513.6.223.0.1 1spatialite_history polyGEOMETRYPOLYGONXYw polyGEOMETRY $$p[++mtablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT, proj4text TEXT NOT NULL, srs_wkt TEXT)11]tablespatialite_historyspatialite_historyCREATE TABLE spatialite_history ( event_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, table_name TEXT NOT NULL, geometry_column TEXT, event TEXT NOT NULL, timestamp TEXT NOT NULL, ver_sqlite TEXT NOT NULL, ver_splite TEXT NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq) --Mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, type TEXT NOT NULL, coord_dimension TEXT NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid)) 55vW?S-indexsqlite_autoindex_geometry_columns_1geometry_columns^99Wtableviews_geometry_columnsviews_geometry_columns CREATE TABLE views_geometry_columns ( view_name TEXT NOT NULL, view_geometry TEXT NOT NULL, view_rowid TEXT NOT NULL, f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, CONSTRAINT pk_geom_cols_views PRIMARY KEY (view_name, view_geometry), CONSTRAINT fk_views_geom_cols FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE)K_9indexsqlite_autoindex_views_geometry_columns_1views_geometry_columns Y99Mtablevirts_geometry_columnsvirts_geometry_columns CREATE TABLE virts_geometry_columns ( virt_name TEXT NOT NULL, virt_geometry TEXT NOT NULL, type VARCHAR(30) NOT NULL, srid INTEGER NOT NULL, CONSTRAINT pk_geom_cols_virts PRIMARY KEY (virt_name, virt_geometry), CONSTRAINT fk_vgc_srid FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))     xK _9indexsqlite_autoindex_virts_geometry_columns_1virts_geometry_columns 7 77 tablegeometry_columns_authgeometry_columns_authCREATE TABLE geometry_columns_auth ( f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, read_only INTEGER NOT NULL, hidden INTEGER NOT NULL, CONSTRAINT pk_gc_auth PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_auth FOREIGN KEY (f_table_name, f_geometry_column) REFERENCES geometry_columns (f_table_name, f_geometry_column) ON DELETE CASCADE)I ]7indexsqlite_autoindex_geometry_columns_auth_1geometry_columns_auth tablepolypolyCREATE TABLE 'poly' ( OGC_FID INTEGER PRIMARY KEY, "GEOMETRY" POLYGON, 'area' FLOAT, 'eas_id' FLOAT, 'prfedea' VARCHAR) 99%tableidx_poly_GEOMETRY_nodeidx_poly_GEOMETRY_nodeCREATE TABLE "idx_poly_GEOMETRY_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   99D H3HꐶJiqJoUHHkJfJmHqH A@,RA@cMA`-RA|CB`/IA -RA BBHBBBBB B@A`` `XP@,(,CBB=A`@XCdBiB?@bB@UC B)C`/IA -RAA?|35043414 tw<A3-RA LA-RA|`LA-RA LA-RAGA -RA|FA`-RA(GA-RA`/IA -RA`HA`m-RA GAC-RACAC-RABA C-RAAAB-RA?A4-RA@s?A3-RA M>AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RAA1`A735043423}Tw|FA .-RARA-RA|CB`/IA -RAB,BBATC ClABPB*B"C@AVB,@B@B@B BBH`/IA -RAA E ě35043411    }TwCDA`,RANA`^-RA|CBKMA`^-RA,VB%YlHBALr,BBBAA(B@A,B@ABA`XBPA CC`BABAKMA`^-RA@_35043412-4w<A+-RA@s?A@o-RA|<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RA@$/35043415-4w 1A,RA'AAv-RA|CB<Av-RAlA0BB B`G: ptC> zu %B|Bx@VB`?BVB A4C=CwhB@PB^CnD`C<Av-RAA `A735043416 ``EdwDA @+RA@eAQ-RA|CB=@VA-RAqB B~B(B BA A? VBABtBBBjBxCA.CzBB QBAAxA`BAAAwAT) [?hB@a)R@[bZBq,0BBrDAP@C0l DeBBDC0B8&CB CFBBAB2BA&BeAhABBXCA8B?BPBH@VA-RAA8`35043369UwKA,RAnWAU-RA|CBRAE-RAxCBA B BA>PHB??8XCeh&2 F8& B`BB@[B2BA:BAB >^B`jCЦfB`B%CBRAE-RAAdր35043409 (( w``FA,RAHA-RA|HA-RA`FA,RA``FA@ -RAGA-RAHA-RA@ ě350434135 Dw@@A2,RA^QA-RA|CBHA-RAYCBA`AfBAЦBBBA`Bj ^:@[2` B0@ehA4BB@B@EC/C CCBCrBHA-RAA"5A735043408 s3//viewgeom_cols_ref_sysgeom_cols_ref_sysCREATE VIEW geom_cols_ref_sys AS SELECT f_table_name, f_geometry_column, type, coord_dimension, spatial_ref_sys.srid AS srid, auth_name, auth_srid, ref_sys_name, proj4text FROM geometry_columns, spatial_ref_sys WHERE geometry_columns.srid = spatial_ref_sys.sridb%%tableSpatialIndexSpatialIndexCREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex() /Ytriggerggi_poly_GEOMETRYpolyCREATE TRIGGER "ggi_poly_GEOMETRY" BEFORE INSERT ON "poly" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'poly.GEOMETRY violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT type FROM geometry_columns WHERE f_table_name = 'poly' AND f_geometry_column = 'GEOMETRY' AND GeometryConstraints(NEW."GEOMETRY", type, srid, 'XY') = 1) IS NULL; END  /Ytriggerggu_poly_GEOMETRYpolyCREATE TRIGGER "ggu_poly_GEOMETRY" BEFORE UPDATE ON "poly" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'poly.GEOMETRY violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT type FROM geometry_columns WHERE f_table_name = 'poly' AND f_geometry_column = 'GEOMETRY' AND GeometryConstraints(NEW."GEOMETRY", type, srid, 'XY') = 1) IS NULL; ENDl/triggergii_poly_GEOMETRYpolyCREATE TRIGGER "gii_poly_GEOMETRY" AFTER INSERT ON "poly" FOR EACH ROW BEGIN DELETE FROM "idx_poly_GEOMETRY" WHERE pkid=NEW.ROWID; SELECT RTreeAlign('idx_poly_GEOMETRY', NEW.ROWID, NEW."GEOMETRY");END bQ//3tableidx_poly_GEOMETRYidx_poly_GEOMETRYCREATE VIRTUAL TABLE "idx_poly_GEOMETRY" USING rtree( pkid, xmin, xmax, ymin, ymax)l/triggergiu_poly_GEOMETRYpolyCREATE TRIGGER "giu_poly_GEOMETRY" AFTER UPDATE ON "poly" FOR EACH ROW BEGIN DELETE FROM "idx_poly_GEOMETRY" WHERE pkid=NEW.ROWID; SELECT RTreeAlign('idx_poly_GEOMETRY', NEW.ROWID, NEW."GEOMETRY");END,/triggergid_poly_GEOMETRYpolyCREATE TRIGGER "gid_poly_GEOMETRY" AFTER DELETE ON "poly" FOR EACH ROW BEGIN DELETE FROM "idx_poly_GEOMETRY" WHERE pkid = OLD.ROWID; ENDgdalautotest-3.0.4/ogr/data/several_schema_outside_layer.kml0000644003401500001440000000230013614004466023745 0ustar rouaultusers An instance of A fieldAValue commonAValue An instance of B fieldBValue commonBValue gdalautotest-3.0.4/ogr/data/test.ukooa0000644003401500001440000000165113614004466017356 0ustar rouaultusersH0100 SURVEY AREA FOOBAR H0200 SURVEY DATE 01 JAN 2011 H1000 CLOCK TIME UTC H1400 GEODETIC DATUM SURVEYED WGS84 EGM96 6378137.000 298.2572236 H1401 TRANSFORMATION PARAMETERS N/A H1500 GEODETIC DATUM AS PLOTTED WGS84 EGM96 6378137.000 298.2572236 H1800 PROJECTION 001 UTM NORTHERN HEMISPHERE H1810 TOWNSHIP REL COORDINATES N/A H1900 ZONE 31X H2000 GRID UNIT 1 INTERNATIONAL METRE 1.00 H2001 HEIGHT UNIT 1 INTERNATIONAL METRE 1.00 H2002 ANGULAR UNITS 1 DEGREES Afirstline 10490000.00N 20000.00E 426857.05427937.0 1234001123456 Afirstline 20493000.00N 20000.00E 427592.05483521.0 5678001123457 Asecondline 1490000.00S 20000.00W 134351.0-5439511 9012001123458 Asecondline 2490000.00S 23000.00W 97802.0-5442045 3456001123459 gdalautotest-3.0.4/ogr/data/small.mid0000644003401500001440000000021713614004466017137 0ustar rouaultusers" S. 11th St.",4,"Shiffer James A and Martha L",56115.58,637.68,10,"230" " S. 11th St.",4,"Guarino ""Chucky"" Sandra",62480.53,710.01,10,"232" gdalautotest-3.0.4/ogr/data/all_geoms.map0000644003401500001440000001000013614004466017764 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?pH@@@@ , )c,   %0$$ <<      82,' N 4< D  \<< 0 @<<  text   p = 7 $$h $ $  $       blafoo# #gdalautotest-3.0.4/ogr/data/ruian_st_v1.xml.gz0000644003401500001440000000207413614004466020732 0ustar rouaultusers|NSruian_st_v1.xmlVr6)PDَ123MT'Hɚ.d$H3:=N߫Kð߷v||#S]Ǵr_/wKC+<Ĕͥ1Iи8>i- kLNS lk)b<?k9??Xgێ11W)>Y$V&9\a1±h StI68wj(/Zc}&*/}zq+Qı0k vEһqP$~LVҍR#6a;)T5ˆʙӈ4گj"cTot=4vS&e~PĔ k,jEM:gzOúu)#s*!,Ng] D֢ݒ-ͽP<#IlҨqE v *ѣ&ʾҘ/X=6 nI.4F7ˌT]֥S*$b Asoq$ %-/q@Wؗ cACi?n/3cۦ αUKIGʜ2;|6^ݝB gdalautotest-3.0.4/ogr/data/all_geoms_block_32256.zip0000644003401500001440000000325213614004466021737 0ustar rouaultusersPK̬%HK!ball_geoms_block_32256.datUT )V)Vux cN```pd`b}]Lg&ϫJPK̬%H::h}-@all_geoms_block_32256.idUT )Vh)Vux c`Pbc d ~ ħ%330hqwn ~PK̬%HAvall_geoms_block_32256.mapUT )V)Vux kEwlISM ]mE*'=IZB{A<͋GEh/^J@A*E]b֙ۅ5 E*Xٝwfޙo{l|3>~[?Ypf,ҧ=TEo;r6bڽfzt:봗ݥUi3:ˇ53Sޥ}3ݿ滍CjJ)*+æ'%3kR8[Ky?OMvwRuf>O9:J_"'+lzV{oϵbKyRaT?= x[]"/UkKu\if%7(+Mh% 8Re7r?gig8,Bą< ׎>MUJ[UhUo}oϟoҡrm}'PK̬%HRkavall_geoms_block_32256.tabUT )Vq)Vux S,ILIR,K-*S035RLH,*N-QK--)JrIM,)WP,HUs sUpWjPʻe+ @uU  \PK̬%HK!ball_geoms_block_32256.datUT)Vux PK̬%H::h}-@tall_geoms_block_32256.idUT)Vux PK̬%HAvall_geoms_block_32256.mapUT)Vux PK̬%HRkaveall_geoms_block_32256.tabUT)Vux PK{gdalautotest-3.0.4/ogr/data/wfs11.xml0000644003401500001440000000250213614005355017014 0ustar rouaultusers 558750.703125 4402882.05558750.703125 4402882.05558750.703125 4402882.05558750.703125 4402882.05 558750.703125 4402882.051135552CFF99 gdalautotest-3.0.4/ogr/data/empty_nas.xml0000644003401500001440000000607513614005355020063 0ustar rouaultusers <?xml version="1.0" encoding="utf-8"?><Protocol xmlns="http://www.aed-sicad.de/namespaces/va" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><auftragsid>AMGR000000161077</auftragsid><profilkennung>NBABenutzerLA</profilkennung><auftragsnummer>Admin_100413082150_001_0006</auftragsnummer><antragsnummer>Admin_100413082150_0006</antragsnummer><nasoperation>NutzerbezogeneBestandsdatenaktualisierung_NBA</nasoperation><status>beendet</status><startzeitreal>2010-10-13T22:29:43.66646+02:00</startzeitreal><endzeitreal>2010-10-13T22:29:43.66646+02:00</endzeitreal><Message><Category>NOTHING</Category><MessageLevel>Info</MessageLevel><MessageObject><FeatureClass /><Id /></MessageObject><MessageText>Das Ergebnis wurde mit der 3A-Version 6.0.9.3 erstellt.</MessageText><ProcessingTime>2010-10-13T22:29:43.66646+02:00</ProcessingTime></Message></Protocol> true Admin_100413082150_0006 true Admin_100413082150_001_0006 NBABenutzerLA 2010-10-13T20:10:14Z 16 130 484560.000 5753705.000 gdalautotest-3.0.4/ogr/data/sample_gml_face_hole_negative_no.xml0000644003401500001440000012223713614005356024547 0ustar rouaultusers 1685268.99 4829496.98 1748204.00 4920171.81 100101ciabatta -0.4 0.4 -0.3 0.4 200102ciabatta -0.3 0.4 -0.2 0.4 300103ciabatta -0.2 0.7 -0.2 0.4 400104ciabatta -0.2 0.7 -0.2 0.9 0.2 0.9 0.2 0.8 500105ciabatta -0.2 0.4 -0 0.4 600106ciabatta -0 0.4 -0.1 0.5 -0.1 0.6 700107ciabatta -0.1 0.6 -0 0.7 0.2 0.7 800108ciabatta 0.2 0.8 0.2 0.7 900109ciabatta 0.2 0.8 0.3 0.8 0.4 0.9 10001010ciabatta 0.4 0.9 1 0.9 1 0.6 11001011ciabatta 0.2 0.7 0.3 0.6 0.5 0.6 12001012ciabatta -0 0.4 0.1 0.4 0.1 0.3 13001013ciabatta 0.1 0.3 -0.1 0.2 -0.1 0.1 -0.1 0 0.2 -0.2 14001014ciabatta -0.2 -0.4 0.2 -0.4 15001015ciabatta 0.2 -0.2 0.2 -0.4 16001016ciabatta 0.2 -0.2 0.3 -0.2 0.6 -0.2 0.9 -0.1 0.9 0.1 0.7 0.2 17001017ciabatta 0.7 0.2 0.7 0.3 0.9 0.4 0.9 0.6 18001018ciabatta 0.9 0.6 1 0.6 19001019ciabatta 1.1 0.4 1.1 0.6 1 0.6 20001020ciabatta 0.2 -0.4 0.7 -0.4 21001021ciabatta 0.2 0.4 0.4 0.4 0.5 0.2 22001022ciabatta 0.2 0.2 0.2 0.4 23001023ciabatta 0.5 0.1 0.5 0.2 24001024ciabatta 0.6 0.1 0.8 0.1 0.8 -0.1 0.6 -0.1 0.6 0.1 25001025ciabatta -0.2 -0.4 -0.4 -0.4 -0.4 0.4 0.2 0.2 0.2 0 0.5 0 0.5 0.1 0.5 0.6 0.5 0.8 0.7 0.8 0.8 0.6 0.9 0.6 26001026ciabatta -0.3 0.4 -0.3 0.7 -0.2 0.7 -0.2 -0.4 -0.2 -0.5 0.2 -0.5 0.2 -0.4 0.2 0.2 0.5 0.2 27001027ciabatta 1.1 -0.4 1.1 -0.1 28001028ciabatta 1.1 -0.1 1.1 0.4 29001029ciabatta 0.7 -0.4 1.1 -0.4 100104ciabatta 2001045ciabatta 3001046ciabatta 4001047ciabatta 5001048ciabatta 6001049ciabatta 7001051ciabatta 0.63 -0.049 0.63 0.067 0.78 -0.049 0.63 -0.049 0.78 0.067 0.78 -0.049 0.63 0.067 0.78 0.067 0.66 -0.039 0.66 0.057 0.75 -0.039 0.66 -0.039 0.75 0.057 0.75 -0.039 0.66 0.057 0.75 0.057 0.72 -0.029 0.69 -0.029 0.72 0 0.72 -0.029 0.72 0.047 0.72 0 0.69 0.047 0.72 0.047 0.69 0 0.69 0.047 0.69 -0.029 0.69 0 0.69 0 0.72 0 gdalautotest-3.0.4/ogr/data/curves_line.csv0000644003401500001440000001660713614004466020401 0ustar rouaultusersWKT,SHAPE_Length "MULTILINESTRING ((-1.02439 48.4878,2.471545 48.45528))",3.49608621305261 "MULTICURVE (COMPOUNDCURVE ((-0.9105691 47.21951,1.414634 47.17073),CIRCULARSTRING (1.414634 47.17073,2.423818 47.48377,1.407531 46.72668),(1.407531 46.72668,-0.9243407 46.72668)))",8.39459167219456 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (-0.3902439 46.42109,0.2422325 45.78862,-0.3902439 45.15614,-1.02272 45.78862,-0.3902439 46.42109)))",3.97396663612273 "MULTILINESTRING ((2.404137 38.88428,2.475991 38.93491,2.54878 38.98351,2.622149 39.02986,2.69574 39.07372,2.769195 39.11488,2.842157 39.15314,2.914269 39.18832,2.98518 39.22023,3.054546 39.24874,3.122027 39.2737,3.187295 39.29498,3.250033 39.31248,3.309934 39.32613,3.366707 39.33584,3.420075 39.34158,3.469778 39.34331,3.515575 39.34104,3.557241 39.33476,3.594574 39.32451,3.627391 39.31034,3.655534 39.29232,3.678865 39.27053,3.697271 39.24509,3.710661 39.21612,3.71897 39.18375,3.722158 39.14814,3.72021 39.10948,3.713135 39.06794,3.700967 39.02373,3.683765 38.97707,3.661614 38.92818,3.634622 38.87729,3.602919 38.82467,3.566661 38.77056,3.526023 38.71523,3.481205 38.65895,3.432424 38.60199,3.379918 38.54462,3.323942 38.48714,3.26477 38.42982,3.20269 38.37293,3.138004 38.31676,3.071028 38.26158,3.002087 38.20766,2.931517 38.15525,2.859663 38.10463,2.786874 38.05602,2.713506 38.00968,2.639914 37.96582,2.566459 37.92466,2.493498 37.88639,2.421386 37.85122,2.350474 37.8193,2.281109 37.79079,2.213628 37.76584,2.148359 37.74456,2.085621 37.72705,2.02572 37.71341,1.968947 37.70369,1.915579 37.69795,1.865876 37.69622,1.82008 37.6985,1.778414 37.70477,1.741081 37.71502,1.708263 37.72919,1.68012 37.74721,1.656789 37.769,1.638384 37.79444,1.624994 37.82342,1.616684 37.85579,1.613496 37.89139,1.615444 37.93006,1.62252 37.97159,1.634688 38.0158,1.651889 38.06247,1.67404 38.11136,1.701033 38.16224,1.732735 38.21486,1.768994 38.26897,1.809631 38.3243,1.854449 38.38059,1.90323 38.43755,1.955737 38.49491,2.011712 38.55239,2.070884 38.60972,2.132964 38.6666,2.19765 38.72277,2.264627 38.77795,2.333568 38.83188,2.404137 38.88428))",5.67762431364471 "MULTILINESTRING ((-0.6666667 44.03252,-0.6056813 44.10943,-0.5428571 44.18257,-0.4782797 44.25197,-0.4120346 44.31763,-0.3442073 44.37959,-0.2748833 44.43785,-0.2041482 44.49243,-0.1320875 44.54336,-0.0587867 44.59064,0.0156686 44.63431,0.091193 44.67437,0.167701 44.71084,0.2451069 44.74375,0.3233253 44.77311,0.4022706 44.79894,0.4818574 44.82125,0.5620001 44.84007,0.6426132 44.85542,0.7236111 44.8673,0.8049083 44.87574,0.8864194 44.88076,0.9680587 44.88238,1.049741 44.88061,1.13138 44.87547,1.212891 44.86698,1.294188 44.85516,1.375186 44.84003,1.455799 44.8216,1.535942 44.79989,1.615529 44.77492,1.694474 44.74671,1.772693 44.71528,1.850099 44.68064,1.926607 44.64281,2.002131 44.60182,2.076586 44.55767,2.149887 44.51039,2.221948 44.46,2.292683 44.4065))",3.34511332340398 "MULTICURVE (COMPOUNDCURVE ((-1.300813 42.89431,0.3902439 43.31707),CIRCULARSTRING (0.3902439 43.31707,1.4163 43.74383,2.455285 43.34959),(2.455285 43.34959,2.455121 43.34941,2.454636 43.34885,2.453842 43.34794,2.452751 43.34666,2.451373 43.34503,2.44972 43.34305,2.447803 43.34073,2.445634 43.33807,2.443223 43.33507,2.440583 43.33175,2.437724 43.3281,2.434658 43.32413,2.431396 43.31985,2.42795 43.31526,2.42433 43.31037,2.420549 43.30517,2.416617 43.29968,2.412546 43.2939,2.408347 43.28784,2.404032 43.28149,2.399611 43.27487,2.395096 43.26799,2.390499 43.26083,2.385831 43.25342,2.381103 43.24575,2.376327 43.23783,2.371513 43.22966,2.366673 43.22126,2.361819 43.21262,2.356962 43.20374,2.352112 43.19465,2.347283 43.18533,2.342484 43.17579,2.337727 43.16605,2.333023 43.1561,2.328385 43.14594,2.323822 43.13559,2.319347 43.12505,2.314971 43.11433,2.310704 43.10342,2.30656 43.09233,2.302547 43.08108,2.29868 43.06965,2.294967 43.05807,2.291421 43.04633,2.288054 43.03443,2.284875 43.02239,2.281898 43.01021,2.279132 42.99789,2.27659 42.98543,2.274283 42.97285,2.272222 42.96015,2.270418 42.94733,2.268883 42.9344,2.267628 42.92136,2.266664 42.90821,2.266003 42.89497,2.265657 42.88164,2.265635 42.86821,2.265951 42.85471,2.266614 42.84112,2.267637 42.82747,2.26903 42.81374,2.270806 42.79995,2.272975 42.7861,2.275548 42.7722,2.278538 42.75825,2.281955 42.74426,2.28581 42.73022,2.290116 42.71616,2.294883 42.70206,2.300123 42.68794,2.305847 42.6738,2.312066 42.65965,2.318792 42.64548,2.326036 42.63132,2.333809 42.61715,2.342123 42.60299,2.350989 42.58883,2.360418 42.5747,2.370422 42.56058,2.381012 42.54649,2.392199 42.53243,2.403995 42.5184,2.416411 42.50442,2.429458 42.49047,2.443148 42.47658,2.457492 42.46274,2.472501 42.44896,2.488187 42.43525,2.504561 42.4216,2.521634 42.40803,2.539418 42.39454,2.557924 42.38113,2.577163 42.36781,2.597146 42.35459,2.617886 42.34146),(2.617886 42.34146,2.636783 42.32997,2.656209 42.31853,2.676146 42.30716,2.696577 42.29584,2.717483 42.28458,2.738844 42.27338,2.760644 42.26223,2.782863 42.25113,2.805484 42.24007,2.828486 42.22907,2.851854 42.21811,2.875567 42.2072,2.899607 42.19633,2.923957 42.18549,2.948598 42.1747,2.97351 42.16394,2.998677 42.15321,3.024079 42.14252,3.049698 42.13186,3.075516 42.12122,3.101515 42.11062,3.127675 42.10003,3.153979 42.08947,3.180407 42.07893,3.206943 42.06841,3.233567 42.0579,3.260261 42.04741,3.287006 42.03694,3.313785 42.02647,3.340578 42.01602,3.367367 42.00557,3.394135 41.99512,3.420862 41.98468,3.44753 41.97424,3.474121 41.96381,3.500616 41.95336,3.526997 41.94292,3.553246 41.93247,3.579344 41.92201,3.605273 41.91154,3.631014 41.90106,3.656549 41.89057,3.681859 41.88006,3.706927 41.86953,3.731733 41.85898,3.75626 41.84841,3.780489 41.83782,3.804401 41.82721,3.827979 41.81656,3.851203 41.80589,3.874056 41.79519,3.896518 41.78445,3.918573 41.77368,3.9402 41.76288,3.961382 41.75203,3.982101 41.74115,4.002337 41.73022,4.022073 41.71925,4.041291 41.70823,4.059971 41.69717,4.078095 41.68605,4.095646 41.67488,4.112604 41.66366,4.128951 41.65239,4.144669 41.64105,4.15974 41.62966,4.174144 41.6182,4.187864 41.60669,4.200882 41.5951,4.213178 41.58345,4.224734 41.57174,4.235533 41.55995,4.245555 41.54808,4.254783 41.53615,4.263197 41.52413,4.27078 41.51204,4.277512 41.49987,4.283376 41.48762,4.288354 41.47528,4.292426 41.46285,4.295575 41.45034,4.297782 41.43774,4.299028 41.42504,4.299296 41.41226,4.298567 41.39937,4.296822 41.38639,4.294043 41.37331,4.290211 41.36013,4.285309 41.34685,4.279318 41.33346,4.272219 41.31996,4.263995 41.30635,4.254626 41.29264,4.244094 41.27881,4.232381 41.26486,4.219468 41.2508,4.205338 41.23662,4.189971 41.22232,4.17335 41.2079,4.155455 41.19336,4.136269 41.17868,4.115773 41.16388,4.093948 41.14896,4.070777 41.13389,4.046241 41.1187,4.020321 41.10337,3.993 41.0879,3.964258 41.07229,3.934077 41.05654,3.902439 41.04065),CIRCULARSTRING (3.902439 41.04065,1.775383 40.65987,0.3414634 42.27642)))",12.2623236074563 "MULTILINESTRING ((-0.2762998 38.32375,-0.2637102 38.43947,-0.2447018 38.55117,-0.2193601 38.65833,-0.1877989 38.76047,-0.1501601 38.85714,-0.1066131 38.94789,-0.0573536 39.03233,-0.002603 39.11007,0.0573925 39.18076,0.1223631 39.24409,0.1920168 39.29976,0.2660403 39.34754,0.3441008 39.3872))",1.29261161044762 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (-1.389372 40.02584,-1.109435 40.65503,-0.4250745 40.73184),CIRCULARSTRING (-0.4250745 40.73184,-0.2233581 40.09231,0.4014657 40.33579)),COMPOUNDCURVE (CIRCULARSTRING (0.9008338 40.26691,1.138662 40.45594,1.434641 40.38745)))",3.57349361227513 "MULTILINESTRING ((1.383736 39.35035,1.012627 38.5647,0.5434618 37.97689,-0.0220862 37.58902))",2.3133339931156 gdalautotest-3.0.4/ogr/data/lines.vct0000644003401500001440000000063513614004466017170 0ustar rouaultusers$@jA*QAO"ASAjASAO"A*QA4@jANAO"A*QA@wANA A*QAgdalautotest-3.0.4/ogr/data/lambert93_francais.ID0000644003401500001440000000000013614004466021210 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/poly.shp0000644003401500001440000001074413614004466017041 0ustar rouaultusers'  1A @+RA@eA-RA|FA .-RARA-RA`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RA<A3-RA LA-RA`LA-RA LA-RAGA -RA|FA`-RA(GA-RA`/IA -RA`HA`m-RA GAC-RACAC-RABA C-RAAAB-RA?A4-RA@s?A3-RA M>AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RA@7>A@,RA@cMA`-RA`/IA -RAIA-RAJA-RAKA`-RANLA-RALA-RA@cMAt-RAKMA`^-RA LA\-RAJAW-RA\JAR-RAGA@0-RA GA--RA sFA&-RAWFA -RAFA-RA EA -RA DA`-RACDA`,RA@@A@,RA@7>A+-RA@s?A3-RA?A4-RAAAB-RABA C-RACAC-RA GAC-RA`HA`m-RA`/IA -RA 1A,RA'AAv-RA<Av-RA<Am-RA@7>A+-RA@@A@,RA'AA@,RA `@A,RA?A ,RA*>A,RA <A,RA:A,RA@s8A ,RA 4A,RA3A`,RA3A ,RA@3A,RA3A,RA4A`,RAl7A-RA t6A -RA`6A-RA5A-RA3A,RA@ 3A,RA 1A3-RA:Ak-RA<Av-RAH<A+-RA@s?A@o-RA<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RACDA`,RANA`^-RAKMA`^-RA AMAL-RANA .-RAKA-RAHA-RAGA-RA``FA@ -RA`FA,RACDA`,RA DA`-RA EA -RAFA-RAWFA -RA sFA&-RA GA--RAGA@0-RA\JAR-RAJAW-RA LA\-RAKMA`^-RAKA,RAnWAU-RARAE-RAdTAU-RATA=-RAtUA(-RA@VA-RAWA-RA`2UA -RArTA@-RA TA-RAnWA`,RAVA`,RA`VA,RA`=VA`,RA!UA@,RASA,RA QA@,RA@OA,RAtNA,RA@OA,RAPA ,RAPA,RA@^QA@,RA^QA ,RA PA-RANA-RAwMA-RA,LA-RA@KA-RAKA-RANA .-RARAE-RADA @+RA@eAQ-RA=@VA-RAWA-RAXA%-RA hZA,-RAZA--RAa[A2-RA]AB-RA`]AP-RA@`A 3-RA`,`A"-RAbA 2-RAbA@B-RAcAI-RA dAM-RAdAQ-RAeA<-RA`weA`'-RA@eA`-RAeA-RA@M_A,RA@^A`,RA^A,RA^A,RA^A,RA]A,RA]A ,RA`^A,RA]AZ,RA@]AR,RA?\A`<,RAYA,RA@XA,RAWA +RA9VA+RA@_UA,RAgPA +RAvOA`+RAOA@+RA` OA+RAFPA`+RAPAm+RA`'OAT+RA@IA @+RA IA@D+RAGA`+RADA2,RA@DAC,RAMA ,RA@OA,RA QA@,RASA,RA!UA@,RA`=VA`,RA`VA,RAVA`,RAnWA`,RA TA-RArTA@-RA`2UA -RAWA-RA@VA-RA @@A2,RA^QA-RAHA-RAKA-RA@KA-RA,LA-RAwMA-RANA-RA PA-RA^QA ,RA@^QA@,RAPA,RAPA ,RA@OA,RAtNA,RA@OA,RAMA ,RA@DAC,RADA2,RACA 6,RAKCAU,RA0CA],RABAq,RAAA,RA'AA@,RA@@A@,RACDA`,RA`FA,RAHA-RA @``FA,RAHA-RAHA-RA`FA,RA``FA@ -RAGA-RAHA-RAgdalautotest-3.0.4/ogr/data/poly.zip0000644003401500001440000000466313614004466017054 0ustar rouaultusersPKiK8/poly.dbfUT GKUxm͊1 aU=&i~zt/",SlV6Riմ !`}PKiK8PTOgpoly.shpUT GKUxXmhVe~ֶr)-枂V6M+6wԜsSk<墠,jC %Ee肓0 %exhcB~s]so4xqlT\or6oL!=t_Y}ۙv>cOcW =8jĊgfι6w;}>X!`ov)_ >`-:]kbf#p-8ݒ75Mn^` GăM8ZzϠ?{OuU}Ķ`A7q/'YsҼܝ+῅oo_/~񗲏{࿐}Kڼs1v^`G$ vBܼʏ(Ͼ;qLq iWP(OIgy'q+3?99VOwҿ8_lfѿo9F<  IDy3Ty+z"W>ñ(YuJ'օ?>>`sTnvCBZ|q? p1s C"+cogsn3G<ƛ@Woy$l yb^ln=FsMf%뵙UT:w]J]zUz=&s+{6=s w2^ޫ.n.nehJ'|`oXȽ}/]~okmC>[p_>Wx/!C2W,Swpp/;>g{ pr>I{l7}XzS&gyb;OO>00׀<6^7I{{-d{l8opyR9*%>yA>Ӂ+i#㨳y{ײBRJ`v⓰3w Igo}Ӻwgj5o[v͛eb$/Gr`ϱߒ#,` V:O ǐo!7wü$<>ɝM;O'nb|%H4+֔Hn5s~\.Pޘ+xEM $l=xߛ=;{;YNw'ߊ9'o Hќ䈣{J[PKiK8G\poly.shxUT GKUxc`Pb^030B eAvvؚ /x F@AhU@ d2/gi "ϲ(/}P P}RPKiK8/ poly.dbfUTGUxPKiK8RN poly.PRJUTGUxPKiK8PTOg Xpoly.shpUTGUxPKiK8G\ poly.shxUTGUxPK gdalautotest-3.0.4/ogr/data/testLookForSimpleType.xsd0000644003401500001440000000271113614005356022343 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/wfs_200_multiplelayers.gml0000644003401500001440000000644113614004466022355 0ustar rouaultusers 2258982.00000 -70747.91406 2615354.50000 495480.93750 2258982.00000 -70747.91406 2615354.50000 495480.93750 2577257.00000 402717.03125 2580978.50000 430271.18750 2577257.00000 430271.18750 2577292.00000 420127.65625 2577297.50000 418604.78125 2577491.75000 417462.90625 2578069.00000 415941.46875 2578836.50000 414230.25000 2579413.25000 412899.18750 2580247.50000 412070.84375 2580693.50000 411149.46875 2580978.50000 408984.37500 2580750.50000 407559.96875 2580066.75000 405736.68750 2579326.00000 403970.43750 2578927.50000 402717.03125 2279399.00000 -55344.50390 2600377.00000 461586.81250 2281604.25000 340848.93750 2281604.25000 340848.93750 2281604.25000 340848.93750 gdalautotest-3.0.4/ogr/data/pds4/0000755003401500001440000000000013614005356016205 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/pds4/product_collection.xml0000644003401500001440000002047213614005356022627 0ustar rouaultusers urn:nasa:pds:orex.ocams:data_reduced 2.0 Origins, Spectral Interpretation, Resource Identification, Security, Regolith Explorer (OSIRIS-REx): OSIRIS-REx Camera Suite (OCAMS) reduced science image data products. 1.7.0.0 Product_Collection Rizk, B.; Drouet d’Aubigny, C.; Golish, D.; DellaGiustina, D.N.; Lauretta, D.S. Crombie, M.K.; Selznick, S. 2018 This collection contains the reduced (processing level 1 - bias, dark and flat field corrected) science image data products produced by the OCAMS instrument onboard the OSIRIS-REx spacecraft. 2018-03-19 1.0 Initial Draft of collection label. 2018-07-10 1.0 Label and data products updated to use updated calibration files. 2016-09-08Z Science Partially Processed Origins, Spectral Interpretation, Resource Identification, Security, Regolith Explorer (OSIRIS-REx) Mission urn:nasa:pds:context:investigation:mission.orex collection_to_investigation OSIRIS-REx Spacecraft Spacecraft The OSIRIS-REx spacecraft is comprised of the Telecommunications subsystem, the Guidance, Navigation and Control sub-system, the Propulsion sub-system, the Power sub-system, as well as playing host to five science instruments, the Touch-And-Go Sample Acquisition System (TAGSAM), and the Sample Return Capsule (SRC) allow the spacecraft to gather data, collect a sample, and safely return it to Earth. urn:nasa:pds:context:instrument_host:spacecraft.orex is_instrument_host OCAMS Instrument urn:nasa:pds:context:instrument:ocams.orex is_instrument TAGCAMS Instrument urn:nasa:pds:context:instrument:tagcams.orex is_instrument OLA Instrument urn:nasa:pds:context:instrument:ola.orex is_instrument OTES Instrument urn:nasa:pds:context:instrument:otes.orex is_instrument OVIRS Instrument urn:nasa:pds:context:instrument:ovirs.orex is_instrument REXIS Instrument urn:nasa:pds:context:instrument:rexis.orex is_instrument (101955) Bennu 1999 RQ36 Asteroid urn:nasa:pds:orex.mission:document:orexmissioninfo collection_to_document urn:nasa:pds:orex.ocams:document:ocamssis collection_to_document Data product_collection.csv 0 PDS DSV 1 2 Carriage-Return Line-Feed Comma 2 0 Member Status 1 ASCII_String 1 %1s LIDVID_LID 2 ASCII_LIDVID_LID 255 %-255s inventory_has_member_product gdalautotest-3.0.4/ogr/data/pds4/test_delimited_group.xml0000644003401500001440000000702013614005356023141 0ustar rouaultusers ${LOGICAL_IDENTIFIER} 1.0 poly_delimited.xml 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 test_delimited_group.csv 0 PDS DSV 1 10 Carriage-Return Line-Feed Comma 1 1 first_field 1 ASCII_Real 1 2 2 1 group_first_field 1 ASCII_Integer group_second_field 2 UTF8_String gdalautotest-3.0.4/ogr/data/pds4/poly_delimited.xml0000644003401500001440000001562713614005356021745 0ustar rouaultusers ${LOGICAL_IDENTIFIER} 1.0 poly_delimited.xml 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 image display_settings_to_array Sample Left to Right Line Top to Bottom -2.04318650036216676 -2.04318650036216676 89.9999999999999716 89.9999999999999716 Transverse Mercator 0.999601271700000016 -2 49 Coordinate Pair 0 0 0 0 Planetocentric OSGB_1936 6377563.39599999972 6377563.39599999972 6356256.90923728514 Positive East poly_delimited.csv 25 PDS DSV 1 10 Carriage-Return Line-Feed Comma 4 0 AREA 1 ASCII_Real 12 EAS_ID 2 ASCII_Integer 11 PRFEDEA 3 UTF8_String 16 WKT 4 ASCII_String gdalautotest-3.0.4/ogr/data/pds4/poly_delimited.csv0000644003401500001440000001325013614004466021727 0ustar rouaultusersAREA,EAS_ID,PRFEDEA,WKT 215229.266,168,35043411,"POLYGON ((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))" 247328.172,179,35043423,"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))" 261752.781,171,35043414,"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))" 547597.188,173,35043416,"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))" 15775.758,172,35043415,"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))" 101429.977,169,35043412,"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))" 268597.625,166,35043409,"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))" 1634833.375,158,35043369,"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))" -596610.313,165,35043408,"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))" 5268.813,170,35043413,"POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))" gdalautotest-3.0.4/ogr/data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.xml0000644003401500001440000003502213614005356025505 0ustar rouaultusers urn:nasa:pds:izenberg_pdart14_meap:data_eetable:ele_evt_12hr_orbit_2011-2012 1.0 Mercury Energetic Electrons Events Table 1.7.0.0 Product_Observational 2017-02-09 1.0 Izenberg PDART 2014 MEAP Energetic Electron Events Table. 12 hr orbit 2011-2012. 2011-03-25Z 2012-04-15Z Science Derived Data from the MESSENGER Neutron Spectrometer (NS) have been used to detect and characterize energetic electron (EE) events within Mercury's magnetosphere. MESSENGER Mission urn:nasa:pds:context:investigation:mission.messenger data_to_investigation MESSENGER NS MESSENGER Spacecraft urn:nasa:pds:context:instrument_host:spacecraft.mess is_instrument_host NS Instrument urn:nasa:pds:context:instrument:ns.mess is_instrument Mercury Planet urn:nasa:pds:context:target:planet.mercury collection_to_target 10.1126/science.1211141 Ho et al., 2011, MESSENGER observations of transient bursts of energetic electrons in Mercury's magnetosphere, Science, 333, 1865-8. ele_evt_12hr_orbit_2011-2012_truncated.tab 2017-02-09T12:44:00Z 2124
0 354 7-Bit ASCII Text The first row of the table contains column headings.
Energetic Electron events, 12 hour orbit, 2011-2012 354 5 Carriage-Return Line-Feed 22 0 354 Event Number 1 1 ASCII_Real 16 EE event number. The value is repeated for 'Event Length' rows in the file. Event Length 2 17 ASCII_Real 16 Number of 20-second accumulations. The value is repeated for 'Event Length' rows in the file. Day of Year 3 33 ASCII_Real 16 Day of year on which the 20-second accumulation occurs. Month 4 49 ASCII_Real 16 Month in which the 20-second accumulation occurs. Day 5 65 ASCII_Real 16 Day in the month in which the 20-second accumulation occurs. Year 6 81 ASCII_Real 16 Year in which the 20-second accumulation occurs. Hour 7 97 ASCII_Real 16 Hour within the day in which the 20-second accumulation occurs. Minute 8 113 ASCII_Real 16 Minute within the hour in which the 20-second accumulation occurs. Second 9 129 ASCII_Real 16 Second within the minute in which the 20-second accumulation occurs. MET 10 145 ASCII_Real 16 s Mission elapsed time, and is the mission tag time in seconds of the start of the associated accumulated period. Orbit Number 11 161 ASCII_Real 16 Unique identifier for a given orbit of MESSENGER around Mercury. Orbit number is defined as starting at apoherm and is calculated using the MET value and the appropriate SPICE kernels. Orbit numbering does not start until MESSENGER performs the Mercury orbit insertion. Until that time the value for orbit number is 0. Altitude 12 177 ASCII_Real 16 km Spacecraft altitude above the subsatellite point on the target in units of km. Latitude 13 193 ASCII_Real 16 deg Target-centric latitude of the spacecraft subsatellite point in degrees. Longitude 14 209 ASCII_Real 16 deg Target-centric longitude of the spacecraft subsatellite point in degrees. Local Time 15 225 ASCII_Real 16 hr Local time of the spacecraft subsatellite point in hours from 0 to 24. Beta Angle 16 241 ASCII_Real 16 deg Angle of the normal of the spacecraft orbital plane with respect to Mercury-to-Sun vector in degrees. Sun Distance 17 257 ASCII_Real 16 km Distance of the spacecraft to the Sun in units of km. Periapsis Latitude 18 273 ASCII_Real 16 deg Target-centric latitude of the spacecraft when it is at the periapsis (lowest) altitude for the given orbit number. Event Length Minute 19 289 ASCII_Real 16 min Length of the EE event in minutes. The value is repeated for 'Event Length' rows in the file. SN 20 305 ASCII_Real 16 none Event signal-to-noise, and is the measure of the size of the event within each 20-second accumulation. BP_TOT 21 321 ASCII_Real 16 Total counts within the Borated Plastic sensor, 64-channel, 20-s spectral accumulation. BP_LOW 22 337 ASCII_Real 16 Total counts within the lowest 12 channels of the Borated Plastic sensor, 64-channel, 20-s spectral accumulation. -9.99
gdalautotest-3.0.4/ogr/data/pds4/xrs2015091_truncated.dat0000644003401500001440000000432213614004466022330 0ustar rouaultusers.l V >:XC,uuuuuu%˶  ه LДЙqbh9]Qye7#NmPs8&0zW7$ >$_tcqoZSB?" {}iWY`FSJ8@D9<=8#,-(, !##$                       gdalautotest-3.0.4/ogr/data/pds4/ele_evt_12hr_orbit_2011-2012_truncated.tab0000644003401500001440000000411413614004466025452 0ustar rouaultusers EVT_NUM EVT_LENGTH DOY MON DAY YEAR HOUR MIN SEC MET ORBIT_NUMBER ALT LAT LON LOCALT BETA_ANG SUN_DIST PERIAPSIS_LAT EVT_LENGTH_MI SN BP_TOT BP_LOW 1.000000000 9.000000000 84.00000000 3.000000000 25.00000000 2011.000000 1.000000000 55.00000000 29.62561989 209505573.0 14.00000000 408.5436707 28.60083580 224.8604431 3.030277729 41.13009262 48637408.00 59.23259354 3.000000000 -0.3153119683 319.1000061 102.4400024 1.000000000 9.000000000 84.00000000 3.000000000 25.00000000 2011.000000 1.000000000 56.00000000 19.65121841 209505623.0 14.00000000 453.6546936 25.12460136 225.4086151 3.066944361 41.13322830 48637872.00 59.23259354 3.000000000 10.15142536 331.4200134 112.0199966 1.000000000 9.000000000 84.00000000 3.000000000 25.00000000 2011.000000 1.000000000 57.00000000 9.590396881 209505673.0 14.00000000 502.7066345 21.75779533 225.9099274 3.100277662 41.13636017 48638336.00 59.23259354 3.000000000 12.55612278 322.0599976 112.8799973 1.000000000 9.000000000 84.00000000 3.000000000 25.00000000 2011.000000 1.000000000 57.00000000 59.61599350 209505723.0 14.00000000 555.4001465 18.50399590 226.3720398 3.131110907 41.13949203 48638792.00 59.23259354 3.000000000 7.436828136 302.9599915 105.0000000 1.000000000 9.000000000 84.00000000 3.000000000 25.00000000 2011.000000 1.000000000 58.00000000 49.64159393 209505773.0 14.00000000 611.4388428 15.36514091 226.8010406 3.159722328 41.14262772 48639248.00 59.23259354 3.000000000 7.129745960 297.0400085 102.9400024 gdalautotest-3.0.4/ogr/data/pds4/xrs2015091_truncated.xml0000644003401500001440000001361513614005356022364 0ustar rouaultusers urn:nasa:pds:mess_xrs_raw:data_edr:xrs2015091_dat 1.0 MESSENGER XRS Raw Spectra product: xrs2015091_dat 1.10.1.0 Product_Observational 2018-06-08 1.0 PDS4 migrated product 2015-04-01T00:01:20Z 2015-04-01T23:57:41Z MESSENGER Mission urn:nasa:pds:context:investigation:mission.messenger data_to_investigation MESSENGER Spacecraft urn:nasa:pds:context:instrument_host:spacecraft.mess is_instrument_host X-Ray Spectrometer Instrument urn:nasa:pds:context:instrument:xrs.mess is_instrument Mercury Planet urn:nasa:pds:context:target:planet.mercury data_to_target Mercury Orbit Year 5 2/070170476 2/070256656 xrsedr pipe-xrs2edr 1.1 xrs2015091_truncated.dat 2015-04-05T01:26:12Z 0 1 This table contains X-ray spectra and associated instrument parameters, as observed by the MESSENGER X-Ray Spectrometer (XRS). Detailed descriptions for the parameters defined below are contained in the EDR SIS document. An XRS flight software upload was implemented on 2007-08-17 UTC that affects COLUMN 40 of the XRS raw binary table. Prior to 2007-08-17, column 40 was named LVPS_SPARE2 and was a spare, unused data column. On and after 2007-08-17 the column is used to indicate the SAX_TEMP_MODE. 170 5 2258 met 1 1 UnsignedMSB4 4 Mission Elapsed Time in seconds. 2 231 1 0 333 462 solar_mon_spectrum_23_253 1 1 UnsignedMSB2 2 Solar monitor spectra channels (23-253). gdalautotest-3.0.4/ogr/data/pds4/test_delimited_group.csv0000644003401500001440000000001313614004466023130 0ustar rouaultusers1,2,3,4,5 gdalautotest-3.0.4/ogr/data/pds4/product_collection.csv0000644003401500001440000000025213614004466022615 0ustar rouaultusersP,urn:nasa:pds:orex.ocams:data_reduced:20160919t162205s722_map_l1pan_v031.fits::1.0 P,urn:nasa:pds:orex.ocams:data_reduced:20160919t162218s417_map_l1pan_v031.fits::1.0 gdalautotest-3.0.4/ogr/data/testpoint.e000000644003401500001440000003622413614004466017702 0ustar rouaultusersEXP 0 /HOME/SAMPLES/WELLS.E00 LAB 2 1 0 5.0494070E+06 4.4200809E+05 5.0494070E+06 4.4200809E+05 5.0494070E+06 4.4200809E+05 2 0 5.0537115E+06 4.3450244E+05 5.0537115E+06 4.3450244E+05 5.0537115E+06 4.3450244E+05 3 0 5.0458180E+06 4.4065578E+05 5.0458180E+06 4.4065578E+05 5.0458180E+06 4.4065578E+05 4 0 5.0413365E+06 4.3965969E+05 5.0413365E+06 4.3965969E+05 5.0413365E+06 4.3965969E+05 5 0 5.0391940E+06 4.3769166E+05 5.0391940E+06 4.3769166E+05 5.0391940E+06 4.3769166E+05 6 0 5.0471285E+06 4.3712497E+05 5.0471285E+06 4.3712497E+05 5.0471285E+06 4.3712497E+05 7 0 5.0398785E+06 4.3613550E+05 5.0398785E+06 4.3613550E+05 5.0398785E+06 4.3613550E+05 8 0 5.0398655E+06 4.3613762E+05 5.0398655E+06 4.3613762E+05 5.0398655E+06 4.3613762E+05 9 0 5.0398660E+06 4.3612434E+05 5.0398660E+06 4.3612434E+05 5.0398660E+06 4.3612434E+05 10 0 5.0385150E+06 4.3638369E+05 5.0385150E+06 4.3638369E+05 5.0385150E+06 4.3638369E+05 11 0 5.0390115E+06 4.3480209E+05 5.0390115E+06 4.3480209E+05 5.0390115E+06 4.3480209E+05 12 0 5.0441440E+06 4.3530462E+05 5.0441440E+06 4.3530462E+05 5.0441440E+06 4.3530462E+05 13 0 5.0352635E+06 4.4242825E+05 5.0352635E+06 4.4242825E+05 5.0352635E+06 4.4242825E+05 14 0 5.0293195E+06 4.3762103E+05 5.0293195E+06 4.3762103E+05 5.0293195E+06 4.3762103E+05 15 0 5.0300595E+06 4.3851244E+05 5.0300595E+06 4.3851244E+05 5.0300595E+06 4.3851244E+05 16 0 5.0370980E+06 4.3818822E+05 5.0370980E+06 4.3818822E+05 5.0370980E+06 4.3818822E+05 17 0 5.0370980E+06 4.3818822E+05 5.0370980E+06 4.3818822E+05 5.0370980E+06 4.3818822E+05 18 0 5.0366810E+06 4.3670638E+05 5.0366810E+06 4.3670638E+05 5.0366810E+06 4.3670638E+05 19 0 5.0375905E+06 4.3566803E+05 5.0375905E+06 4.3566803E+05 5.0375905E+06 4.3566803E+05 20 0 5.0370205E+06 4.3429197E+05 5.0370205E+06 4.3429197E+05 5.0370205E+06 4.3429197E+05 21 0 5.0533465E+06 4.3411053E+05 5.0533465E+06 4.3411053E+05 5.0533465E+06 4.3411053E+05 22 0 5.0514510E+06 4.3142975E+05 5.0514510E+06 4.3142975E+05 5.0514510E+06 4.3142975E+05 23 0 5.0567580E+06 4.3187972E+05 5.0567580E+06 4.3187972E+05 5.0567580E+06 4.3187972E+05 24 0 5.0567670E+06 4.2965009E+05 5.0567670E+06 4.2965009E+05 5.0567670E+06 4.2965009E+05 25 0 5.0566960E+06 4.2973056E+05 5.0566960E+06 4.2973056E+05 5.0566960E+06 4.2973056E+05 26 0 5.0549180E+06 4.3022238E+05 5.0549180E+06 4.3022238E+05 5.0549180E+06 4.3022238E+05 27 0 5.0506190E+06 4.3073538E+05 5.0506190E+06 4.3073538E+05 5.0506190E+06 4.3073538E+05 28 0 5.0489275E+06 4.2872991E+05 5.0489275E+06 4.2872991E+05 5.0489275E+06 4.2872991E+05 29 0 5.0486655E+06 4.2847866E+05 5.0486655E+06 4.2847866E+05 5.0486655E+06 4.2847866E+05 30 0 5.0517210E+06 4.2850744E+05 5.0517210E+06 4.2850744E+05 5.0517210E+06 4.2850744E+05 31 0 5.0535690E+06 4.2891612E+05 5.0535690E+06 4.2891612E+05 5.0535690E+06 4.2891612E+05 32 0 5.0536800E+06 4.2893353E+05 5.0536800E+06 4.2893353E+05 5.0536800E+06 4.2893353E+05 33 0 5.0536210E+06 4.2787484E+05 5.0536210E+06 4.2787484E+05 5.0536210E+06 4.2787484E+05 34 0 5.0548110E+06 4.2931866E+05 5.0548110E+06 4.2931866E+05 5.0548110E+06 4.2931866E+05 35 0 5.0548110E+06 4.2931866E+05 5.0548110E+06 4.2931866E+05 5.0548110E+06 4.2931866E+05 36 0 5.0544295E+06 4.2930706E+05 5.0544295E+06 4.2930706E+05 5.0544295E+06 4.2930706E+05 37 0 5.0542620E+06 4.2857597E+05 5.0542620E+06 4.2857597E+05 5.0542620E+06 4.2857597E+05 38 0 5.0555765E+06 4.2804956E+05 5.0555765E+06 4.2804956E+05 5.0555765E+06 4.2804956E+05 39 0 5.0555445E+06 4.2845644E+05 5.0555445E+06 4.2845644E+05 5.0555445E+06 4.2845644E+05 40 0 5.0556435E+06 4.2720366E+05 5.0556435E+06 4.2720366E+05 5.0556435E+06 4.2720366E+05 41 0 5.0559150E+06 4.2723225E+05 5.0559150E+06 4.2723225E+05 5.0559150E+06 4.2723225E+05 42 0 5.0543645E+06 4.2764378E+05 5.0543645E+06 4.2764378E+05 5.0543645E+06 4.2764378E+05 43 0 5.0542240E+06 4.2646362E+05 5.0542240E+06 4.2646362E+05 5.0542240E+06 4.2646362E+05 44 0 5.0530570E+06 4.2726859E+05 5.0530570E+06 4.2726859E+05 5.0530570E+06 4.2726859E+05 45 0 5.0530570E+06 4.2726859E+05 5.0530570E+06 4.2726859E+05 5.0530570E+06 4.2726859E+05 46 0 5.0537235E+06 4.2626819E+05 5.0537235E+06 4.2626819E+05 5.0537235E+06 4.2626819E+05 47 0 5.0508765E+06 4.2666153E+05 5.0508765E+06 4.2666153E+05 5.0508765E+06 4.2666153E+05 48 0 5.0500095E+06 4.2681334E+05 5.0500095E+06 4.2681334E+05 5.0500095E+06 4.2681334E+05 49 0 5.0497670E+06 4.2739416E+05 5.0497670E+06 4.2739416E+05 5.0497670E+06 4.2739416E+05 50 0 5.0501600E+06 4.2676775E+05 5.0501600E+06 4.2676775E+05 5.0501600E+06 4.2676775E+05 51 0 5.0490515E+06 4.2763362E+05 5.0490515E+06 4.2763362E+05 5.0490515E+06 4.2763362E+05 52 0 5.0485480E+06 4.2558822E+05 5.0485480E+06 4.2558822E+05 5.0485480E+06 4.2558822E+05 53 0 5.0487290E+06 4.2603975E+05 5.0487290E+06 4.2603975E+05 5.0487290E+06 4.2603975E+05 54 0 5.0497000E+06 4.2478025E+05 5.0497000E+06 4.2478025E+05 5.0497000E+06 4.2478025E+05 55 0 5.0513000E+06 4.2469978E+05 5.0513000E+06 4.2469978E+05 5.0513000E+06 4.2469978E+05 56 0 5.0510380E+06 4.2513288E+05 5.0510380E+06 4.2513288E+05 5.0510380E+06 4.2513288E+05 57 0 5.0397800E+06 4.3356584E+05 5.0397800E+06 4.3356584E+05 5.0397800E+06 4.3356584E+05 58 0 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 59 0 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 60 0 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 5.0401625E+06 4.3247184E+05 61 0 5.0401695E+06 4.3127716E+05 5.0401695E+06 4.3127716E+05 5.0401695E+06 4.3127716E+05 62 0 5.0408640E+06 4.3217603E+05 5.0408640E+06 4.3217603E+05 5.0408640E+06 4.3217603E+05 63 0 5.0445585E+06 4.3188038E+05 5.0445585E+06 4.3188038E+05 5.0445585E+06 4.3188038E+05 64 0 5.0451130E+06 4.3050697E+05 5.0451130E+06 4.3050697E+05 5.0451130E+06 4.3050697E+05 65 0 5.0425620E+06 4.3073538E+05 5.0425620E+06 4.3073538E+05 5.0425620E+06 4.3073538E+05 66 0 5.0405910E+06 4.3007469E+05 5.0405910E+06 4.3007469E+05 5.0405910E+06 4.3007469E+05 67 0 5.0442520E+06 4.2632441E+05 5.0442520E+06 4.2632441E+05 5.0442520E+06 4.2632441E+05 68 0 5.0442520E+06 4.2632441E+05 5.0442520E+06 4.2632441E+05 5.0442520E+06 4.2632441E+05 69 0 5.0442280E+06 4.2637753E+05 5.0442280E+06 4.2637753E+05 5.0442280E+06 4.2637753E+05 70 0 5.0438295E+06 4.2678347E+05 5.0438295E+06 4.2678347E+05 5.0438295E+06 4.2678347E+05 71 0 5.0406350E+06 4.2518522E+05 5.0406350E+06 4.2518522E+05 5.0406350E+06 4.2518522E+05 72 0 5.0284905E+06 4.3221456E+05 5.0284905E+06 4.3221456E+05 5.0284905E+06 4.3221456E+05 73 0 5.0306535E+06 4.2976247E+05 5.0306535E+06 4.2976247E+05 5.0306535E+06 4.2976247E+05 74 0 5.0292090E+06 4.3021500E+05 5.0292090E+06 4.3021500E+05 5.0292090E+06 4.3021500E+05 75 0 5.0304375E+06 4.2653141E+05 5.0304375E+06 4.2653141E+05 5.0304375E+06 4.2653141E+05 76 0 5.0296615E+06 4.2622000E+05 5.0296615E+06 4.2622000E+05 5.0296615E+06 4.2622000E+05 77 0 5.0293845E+06 4.2551788E+05 5.0293845E+06 4.2551788E+05 5.0293845E+06 4.2551788E+05 78 0 5.0285980E+06 4.2498803E+05 5.0285980E+06 4.2498803E+05 5.0285980E+06 4.2498803E+05 79 0 5.0304695E+06 4.2467572E+05 5.0304695E+06 4.2467572E+05 5.0304695E+06 4.2467572E+05 80 0 5.0314780E+06 4.2545294E+05 5.0314780E+06 4.2545294E+05 5.0314780E+06 4.2545294E+05 -1 0 0.0000000E+00 0.0000000E+00 TOL 2 1 2 2.8276500E+00 2 2 0.0000000E+00 3 2 0.0000000E+00 4 2 0.0000000E+00 5 2 0.0000000E+00 6 2 2.8276500E+02 7 2 2.8276500E+01 8 2 2.8276500E+01 9 2 2.8276500E+01 10 2 2.8276500E+01 -1 0 0 0 0 0 0 SIN 2 EOX IFO 2 WELLS.BND XX 4 4 16 1 XMIN 4-1 14-1 12 3 60-1 -1 -1-1 1- YMIN 4-1 54-1 12 3 60-1 -1 -1-1 2- XMAX 4-1 94-1 12 3 60-1 -1 -1-1 3- YMAX 4-1 134-1 12 3 60-1 -1 -1-1 4- 5.0284905E+06 4.2467572E+05 5.0567670E+06 4.4242825E+05 WELLS.PAT XX 5 5 46 80 AREA 4-1 14-1 12 3 60-1 -1 -1-1 1- PERIMETER 4-1 54-1 12 3 60-1 -1 -1-1 2- WELLS# 4-1 94-1 5-1 50-1 -1 -1-1 3- WELLS-ID 4-1 134-1 5-1 50-1 -1 -1-1 4- DATA 30-1 174-1 30-1 20-1 -1 -1-1 5- 0.0000000E+00 0.0000000E+00 1 105103084340000 0.0000000E+00 0.0000000E+00 2 205103052120000 0.0000000E+00 0.0000000E+00 3 305103083160000 0.0000000E+00 0.0000000E+00 4 405103085410000 0.0000000E+00 0.0000000E+00 5 505103086760000 0.0000000E+00 0.0000000E+00 6 605103052290000 0.0000000E+00 0.0000000E+00 7 705103089060000 0.0000000E+00 0.0000000E+00 8 805103089070000 0.0000000E+00 0.0000000E+00 9 905103089070001 0.0000000E+00 0.0000000E+00 10 1005103080820000 0.0000000E+00 0.0000000E+00 11 1105103083850000 0.0000000E+00 0.0000000E+00 12 1205103072380000 0.0000000E+00 0.0000000E+00 13 1305103087110000 0.0000000E+00 0.0000000E+00 14 1405103088380000 0.0000000E+00 0.0000000E+00 15 1505103084460000 0.0000000E+00 0.0000000E+00 16 1605103092180000 0.0000000E+00 0.0000000E+00 17 1705103092180001 0.0000000E+00 0.0000000E+00 18 1805103080830000 0.0000000E+00 0.0000000E+00 19 1905103081830000 0.0000000E+00 0.0000000E+00 20 2005103084410000 0.0000000E+00 0.0000000E+00 21 2105103070400000 0.0000000E+00 0.0000000E+00 22 2205103051910000 0.0000000E+00 0.0000000E+00 23 2305103076160000 0.0000000E+00 0.0000000E+00 24 2405103051610000 0.0000000E+00 0.0000000E+00 25 2505103086310000 0.0000000E+00 0.0000000E+00 26 2605103077600000 0.0000000E+00 0.0000000E+00 27 2705103051780000 0.0000000E+00 0.0000000E+00 28 2805103051500000 0.0000000E+00 0.0000000E+00 29 2905103077610000 0.0000000E+00 0.0000000E+00 30 3005103051460000 0.0000000E+00 0.0000000E+00 31 3105103070440000 0.0000000E+00 0.0000000E+00 32 3205103076590000 0.0000000E+00 0.0000000E+00 33 3305103090240000 0.0000000E+00 0.0000000E+00 34 3405103051560000 0.0000000E+00 0.0000000E+00 35 3505103051560001 0.0000000E+00 0.0000000E+00 36 3605103073550000 0.0000000E+00 0.0000000E+00 37 3705103077620000 0.0000000E+00 0.0000000E+00 38 3805103051380000 0.0000000E+00 0.0000000E+00 39 3905103051430000 0.0000000E+00 0.0000000E+00 40 4005103077540000 0.0000000E+00 0.0000000E+00 41 4105103087240000 0.0000000E+00 0.0000000E+00 42 4205103075630000 0.0000000E+00 0.0000000E+00 43 4305103076620000 0.0000000E+00 0.0000000E+00 44 4405103059900000 0.0000000E+00 0.0000000E+00 45 4505103059900001 0.0000000E+00 0.0000000E+00 46 4605103091290000 0.0000000E+00 0.0000000E+00 47 4705103073990000 0.0000000E+00 0.0000000E+00 48 4805103051220000 0.0000000E+00 0.0000000E+00 49 4905103080970000 0.0000000E+00 0.0000000E+00 50 5005103092520000 0.0000000E+00 0.0000000E+00 51 5105103051350000 0.0000000E+00 0.0000000E+00 52 5205103075060000 0.0000000E+00 0.0000000E+00 53 5305103092920000 0.0000000E+00 0.0000000E+00 54 5405103059910000 0.0000000E+00 0.0000000E+00 55 5505103050940000 0.0000000E+00 0.0000000E+00 56 5605103092090000 0.0000000E+00 0.0000000E+00 57 5705103082160000 0.0000000E+00 0.0000000E+00 58 5805103075270000 0.0000000E+00 0.0000000E+00 59 5905103075270001 0.0000000E+00 0.0000000E+00 60 6005103075270002 0.0000000E+00 0.0000000E+00 61 6105103076110000 0.0000000E+00 0.0000000E+00 62 6205103052000000 0.0000000E+00 0.0000000E+00 63 6305103084100000 0.0000000E+00 0.0000000E+00 64 6405103051740000 0.0000000E+00 0.0000000E+00 65 6505103088690000 0.0000000E+00 0.0000000E+00 66 6605103074560000 0.0000000E+00 0.0000000E+00 67 6705103051150000 0.0000000E+00 0.0000000E+00 68 6805103051150001 0.0000000E+00 0.0000000E+00 69 6905103051160000 0.0000000E+00 0.0000000E+00 70 7005103072340000 0.0000000E+00 0.0000000E+00 71 7105103072600000 0.0000000E+00 0.0000000E+00 72 7205103081900000 0.0000000E+00 0.0000000E+00 73 7305103078970000 0.0000000E+00 0.0000000E+00 74 7405103087180000 0.0000000E+00 0.0000000E+00 75 7505103080730000 0.0000000E+00 0.0000000E+00 76 7605103089900000 0.0000000E+00 0.0000000E+00 77 7705103078320000 0.0000000E+00 0.0000000E+00 78 7805103088630000 0.0000000E+00 0.0000000E+00 79 7905103080740000 0.0000000E+00 0.0000000E+00 80 8005103084150000 WELLS.TIC XX 3 3 12 4 IDTIC 4-1 14-1 5-1 50-1 -1 -1-1 1- XTIC 4-1 54-1 12 3 60-1 -1 -1-1 2- YTIC 4-1 94-1 12 3 60-1 -1 -1-1 3- 1 5.0567670E+06 4.2467572E+05 4 5.0567670E+06 4.4242825E+05 2 5.0284905E+06 4.2467572E+05 3 5.0284905E+06 4.4242825E+05 EOI EOS gdalautotest-3.0.4/ogr/data/lwpolyline_smooth.dxf0000644003401500001440000000071113614004466021625 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 LWPOLYLINE 330 2 8 1 48 0.5 90 5 70 1 43 0.0 10 251297.8179190048 20 412226.8286400078 10 251297.8179190048 20 412226.8286400078 42 1.411054718161073 10 251308.8984362325 20 412208.9379316938 42 -0.2087839309652931 10 251316.5701423874 20 412213.1972117217 42 1.718125140479248 10 251303.570758 20 412231.7269082728 42 -0.2147205537362407 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/gjpoint.sbn0000644003401500001440000000004113614004466017505 0ustar rouaultusersDummy file. Not really an index. gdalautotest-3.0.4/ogr/data/testpoly.ind0000644003401500001440000000200013614004466017703 0ustar rouaultusersqd a> gdalautotest-3.0.4/ogr/data/ocs2wcs1.dxf0000644003401500001440000005704413614004466017515 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 9 $HANDSEED 5 F0001 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 330 0 100 AcDbSymbolTable 70 4 0 LTYPE 5 14 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 330 5 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 Continuous 70 0 3 Solid line 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 2 330 0 100 AcDbSymbolTable 70 10 0 LAYER 5 10 330 2 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 Continuous 370 -3 390 F 347 EE 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 POINT 5 1EF 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 4.0 20 4.0 30 0.0 0 LINE 5 1F0 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.0 21 1.0 31 0.0 0 LWPOLYLINE 5 1F1 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 1.0 20 1.0 10 2.0 20 1.0 10 1.0 20 2.0 0 POLYLINE 5 1F2 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 1F3 330 1F2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 1.0 30 0.0 70 32 0 VERTEX 5 1F4 330 1F2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 2.0 30 0.0 70 32 0 VERTEX 5 1F5 330 1F2 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 2.0 20 2.0 30 0.0 70 32 0 SEQEND 5 1F6 330 1F2 100 AcDbEntity 8 0 0 CIRCLE 5 1F7 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 4.0 20 4.0 30 0.0 40 2.0 0 ELLIPSE 5 1F8 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 4.0 20 4.0 30 0.0 11 -2.0 21 0.0 31 0.0 210 0.0 220 0.0 230 1.0 40 0.5 41 0.0 42 6.283185307179586 0 ARC 5 1F9 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 2.5 20 2.5 30 0.0 40 0.7071067811865476 100 AcDbArc 50 315.0 51 225.0000000000001 0 3DFACE 5 1FA 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 1.0 20 2.0 30 0.0 11 1.0 21 3.0 31 0.0 12 2.0 22 3.0 32 0.0 13 2.0 23 2.0 33 0.0 0 SOLID 5 1FB 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 3.0 20 4.0 30 0.0 11 4.0 21 4.0 31 0.0 12 3.0 22 3.0 32 0.0 13 4.0 23 3.0 33 0.0 0 HATCH 5 1FD 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0 230 1.0 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 8.0 20 8.0 11 9.0 21 8.0 72 1 10 9.0 20 8.0 11 9.0 21 9.0 72 1 10 9.0 20 9.0 11 8.0 21 9.0 72 1 10 8.0 20 9.0 11 8.0 21 8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 0.0 43 0.0 44 0.0 45 0.0 46 6.985 79 2 49 5.08 49 -1.905 53 90.0 43 0.0 44 0.0 45 -6.985 46 0.0000000000000004 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 200 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 2.0 20 2.0 30 0.0 10 2.666666666666666 20 2.666666666666666 30 0.0 10 4.666666666666666 20 4.666666666666666 30 0.0 10 6.666666666666666 20 6.666666666666666 30 0.0 10 8.0 20 8.0 30 0.0 11 2.0 21 2.0 31 0.0 11 4.0 21 4.0 31 0.0 11 8.0 21 8.0 31 0.0 0 SPLINE 5 201 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 8.0 20 1.0 30 0.0 10 5.583333333333333 20 0.9166666666666666 30 0.0 10 0.7500000000000002 20 0.75 30 0.0 10 0.9166666666666666 20 5.583333333333332 30 0.0 10 1.0 20 8.0 30 0.0 11 8.0 21 1.0 31 0.0 11 2.0 21 2.0 31 0.0 11 1.0 21 8.0 31 0.0 0 TEXT 5 202 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 7.0 20 7.0 30 0.0 40 1.0 1 Text 100 AcDbText 0 POINT 5 203 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 -4.0 20 4.0 30 -0.0000000000000005 210 0.0000000000000001 220 0.0 230 -1.0 0 LINE 5 204 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 -1.0 21 1.0 31 -0.0000000000000001 210 0.0000000000000001 220 0.0 230 -1.0 0 LWPOLYLINE 5 205 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 1.0 20 1.0 10 2.0 20 1.0 10 1.0 20 2.0 210 0.0000000000000001 220 0.0 230 -1.0 0 POLYLINE 5 206 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 207 330 206 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -1.0 20 1.0 30 -0.0000000000000001 70 32 0 VERTEX 5 208 330 206 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -1.0 20 2.0 30 -0.0000000000000001 70 32 0 VERTEX 5 209 330 206 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -2.0 20 2.0 30 -0.0000000000000002 70 32 0 SEQEND 5 20A 330 206 100 AcDbEntity 8 0 0 CIRCLE 5 20B 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 4.0 20 4.0 30 0.0 40 2.0 210 0.0000000000000001 220 0.0 230 -1.0 0 ELLIPSE 5 20C 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 -4.0 20 4.0 30 -0.0000000000000005 11 2.0 21 0.0 31 0.0000000000000002 210 0.0000000000000001 220 0.0 230 -1.0 40 0.5 41 0.0 42 6.283185307179586 0 ARC 5 20D 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 2.5 20 2.5 30 0.0 40 0.7071067811865476 210 0.0000000000000001 220 0.0 230 -1.0 100 AcDbArc 50 315.0 51 225.0000000000001 0 3DFACE 5 20E 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 -1.0 20 2.0 30 -0.0000000000000001 11 -1.0 21 3.0 31 -0.0000000000000001 12 -2.0 22 3.0 32 -0.0000000000000002 13 -2.0 23 2.0 33 -0.0000000000000002 0 SOLID 5 20F 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 3.0 20 4.0 30 0.0 11 4.0 21 4.0 31 0.0 12 3.0 22 3.0 32 0.0 13 4.0 23 3.0 33 0.0 210 0.0000000000000001 220 0.0 230 -1.0 0 HATCH 5 211 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0000000000000001 220 0.0 230 -1.0 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 8.0 20 8.0 11 9.0 21 8.0 72 1 10 9.0 20 8.0 11 9.0 21 9.0 72 1 10 9.0 20 9.0 11 8.0 21 9.0 72 1 10 8.0 20 9.0 11 8.0 21 8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 0.0 43 0.0 44 0.0 45 0.0 46 6.985 79 2 49 5.08 49 -1.905 53 90.0 43 0.0 44 0.0 45 -6.985 46 0.0000000000000004 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 212 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 -2.0 20 2.0 30 -0.0000000000000002 10 -2.666666666666666 20 2.666666666666666 30 -0.0000000000000003 10 -4.666666666666666 20 4.666666666666666 30 -0.0000000000000006 10 -6.666666666666666 20 6.666666666666666 30 -0.0000000000000008 10 -8.0 20 8.0 30 -0.000000000000001 11 -2.0 21 2.0 31 -0.0000000000000002 11 -4.0 21 4.0 31 -0.0000000000000005 11 -8.0 21 8.0 31 -0.000000000000001 0 SPLINE 5 213 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 -8.0 20 1.0 30 -0.000000000000001 10 -5.583333333333333 20 0.9166666666666666 30 -0.0000000000000007 10 -0.7500000000000002 20 0.75 30 -0.0000000000000001 10 -0.9166666666666666 20 5.583333333333332 30 -0.0000000000000001 10 -1.0 20 8.0 30 -0.0000000000000001 11 -8.0 21 1.0 31 -0.000000000000001 11 -2.0 21 2.0 31 -0.0000000000000002 11 -1.0 21 8.0 31 -0.0000000000000001 0 TEXT 5 214 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 7.0 20 7.0 30 0.0 40 1.0 1 Text 210 0.0000000000000001 220 0.0 230 -1.0 100 AcDbText 0 POINT 5 215 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 -4.0 20 -4.0 30 -0.000000000000001 50 180.0 0 LINE 5 216 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 -0.0000000000000002 11 -1.0 21 -1.0 31 -0.0000000000000005 0 LWPOLYLINE 5 217 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 -1.0 20 -1.0 10 -2.0 20 -1.0 10 -1.0 20 -2.0 0 POLYLINE 5 218 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 219 330 218 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -1.0 20 -1.0 30 -0.0000000000000002 70 32 0 VERTEX 5 21A 330 218 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -1.0 20 -2.0 30 -0.0000000000000004 70 32 0 VERTEX 5 21B 330 218 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 -2.0 20 -2.0 30 -0.0000000000000005 70 32 0 SEQEND 5 21C 330 218 100 AcDbEntity 8 0 0 CIRCLE 5 21D 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -4.0 20 -4.0 30 0.0 40 2.0 0 ELLIPSE 5 21E 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 -4.0 20 -4.0 30 -0.000000000000001 11 2.0 21 0.0 31 0.0000000000000002 210 -0.0000000000000001 220 -0.0000000000000001 230 1.0 40 0.5 41 0.0 42 6.283185307179586 0 ARC 5 21F 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -2.5 20 -2.5 30 0.0 40 0.7071067811865476 100 AcDbArc 50 135.0 51 45.0 0 3DFACE 5 220 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 -1.0 20 -2.0 30 -0.0000000000000004 11 -1.0 21 -3.0 31 -0.0000000000000005 12 -2.0 22 -3.0 32 -0.0000000000000006 13 -2.0 23 -2.0 33 -0.0000000000000005 0 SOLID 5 221 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 -3.0 20 -4.0 30 0.0 11 -4.0 21 -4.0 31 0.0 12 -3.0 22 -3.0 32 0.0 13 -4.0 23 -3.0 33 0.0 0 HATCH 5 223 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 -0.0000000000000001 220 -0.0000000000000001 230 1.0 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 -8.0 20 -8.0 11 -9.0 21 -8.0 72 1 10 -9.0 20 -8.0 11 -9.0 21 -9.0 72 1 10 -9.0 20 -9.0 11 -8.0 21 -9.0 72 1 10 -8.0 20 -9.0 11 -8.0 21 -8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 180.0 43 0.0 44 0.0 45 -0.0000000000000009 46 -6.985 79 2 49 5.08 49 -1.905 53 270.0 43 0.0 44 0.0 45 6.985 46 -0.0000000000000013 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 224 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 -2.0 20 -2.0 30 -0.0000000000000005 10 -2.666666666666666 20 -2.666666666666666 30 -0.0000000000000007 10 -4.666666666666666 20 -4.666666666666666 30 -0.0000000000000011 10 -6.666666666666666 20 -6.666666666666666 30 -0.0000000000000016 10 -8.0 20 -8.0 30 -0.000000000000002 11 -2.0 21 -2.0 31 -0.0000000000000005 11 -4.0 21 -4.0 31 -0.000000000000001 11 -8.0 21 -8.0 31 -0.000000000000002 0 SPLINE 5 225 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 -8.0 20 -1.0 30 -0.0000000000000011 10 -5.583333333333333 20 -0.9166666666666666 30 -0.0000000000000008 10 -0.7500000000000002 20 -0.75 30 -0.0000000000000002 10 -0.9166666666666666 20 -5.583333333333332 30 -0.0000000000000008 10 -1.0 20 -8.0 30 -0.0000000000000011 11 -8.0 21 -1.0 31 -0.0000000000000011 11 -2.0 21 -2.0 31 -0.0000000000000005 11 -1.0 21 -8.0 31 -0.0000000000000011 0 TEXT 5 226 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 -7.0 20 -7.0 30 0.0 40 1.0 1 Text 50 180.0 100 AcDbText 0 POINT 5 227 330 1F 100 AcDbEntity 8 0 100 AcDbPoint 10 4.0 20 -4.0 30 -0.0000000000000005 210 0.0 220 0.0000000000000001 230 -1.0 50 180.0 0 LINE 5 228 330 1F 100 AcDbEntity 8 0 100 AcDbLine 10 0.0 20 0.0 30 0.0 11 1.0 21 -1.0 31 -0.0000000000000001 210 0.0 220 0.0000000000000001 230 -1.0 0 LWPOLYLINE 5 229 330 1F 100 AcDbEntity 8 0 100 AcDbPolyline 90 3 70 1 43 0.0 10 -1.0 20 -1.0 10 -2.0 20 -1.0 10 -1.0 20 -2.0 210 0.0 220 0.0000000000000001 230 -1.0 0 POLYLINE 5 22A 330 1F 100 AcDbEntity 8 0 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 9 0 VERTEX 5 22B 330 22A 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 -1.0 30 -0.0000000000000001 70 32 0 VERTEX 5 22C 330 22A 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 1.0 20 -2.0 30 -0.0000000000000002 70 32 0 VERTEX 5 22D 330 22A 100 AcDbEntity 8 0 100 AcDbVertex 100 AcDb3dPolylineVertex 10 2.0 20 -2.0 30 -0.0000000000000002 70 32 0 SEQEND 5 22E 330 22A 100 AcDbEntity 8 0 0 CIRCLE 5 22F 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -4.0 20 -4.0 30 0.0 40 2.0 210 0.0 220 0.0000000000000001 230 -1.0 0 ELLIPSE 5 230 330 1F 100 AcDbEntity 8 0 100 AcDbEllipse 10 4.0 20 -4.0 30 -0.0000000000000005 11 -2.0 21 0.0 31 0.0 210 0.0 220 0.0000000000000001 230 -1.0 40 0.5 41 0.0 42 6.283185307179586 0 ARC 5 231 330 1F 100 AcDbEntity 8 0 100 AcDbCircle 10 -2.5 20 -2.5 30 0.0 40 0.7071067811865476 210 0.0 220 0.0000000000000001 230 -1.0 100 AcDbArc 50 135.0 51 45.0 0 3DFACE 5 232 330 1F 100 AcDbEntity 8 0 100 AcDbFace 10 1.0 20 -2.0 30 -0.0000000000000002 11 1.0 21 -3.0 31 -0.0000000000000004 12 2.0 22 -3.0 32 -0.0000000000000004 13 2.0 23 -2.0 33 -0.0000000000000002 0 SOLID 5 233 330 1F 100 AcDbEntity 8 0 100 AcDbTrace 10 -3.0 20 -4.0 30 0.0 11 -4.0 21 -4.0 31 0.0 12 -3.0 22 -3.0 32 0.0 13 -4.0 23 -3.0 33 0.0 210 0.0 220 0.0000000000000001 230 -1.0 0 HATCH 5 235 330 1F 100 AcDbEntity 8 0 100 AcDbHatch 10 0.0 20 0.0 30 0.0 210 0.0 220 0.0000000000000001 230 -1.0 2 ANGLE 70 0 71 0 91 1 92 1 93 4 72 1 10 -8.0 20 -8.0 11 -9.0 21 -8.0 72 1 10 -9.0 20 -8.0 11 -9.0 21 -9.0 72 1 10 -9.0 20 -9.0 11 -8.0 21 -9.0 72 1 10 -8.0 20 -9.0 11 -8.0 21 -8.0 97 0 75 0 76 1 52 0.0 41 1.0 77 0 78 2 53 180.0 43 0.0 44 0.0 45 -0.0000000000000009 46 -6.985 79 2 49 5.08 49 -1.905 53 270.0 43 0.0 44 0.0 45 6.985 46 -0.0000000000000013 79 2 49 5.08 49 -1.905 98 1 10 0.0 20 0.0 1001 ACAD 1010 0.0 1020 0.0 1030 0.0 0 SPLINE 5 236 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1080 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 40 8.485281374238571 10 2.0 20 -2.0 30 -0.0000000000000002 10 2.666666666666666 20 -2.666666666666666 30 -0.0000000000000003 10 4.666666666666666 20 -4.666666666666666 30 -0.0000000000000006 10 6.666666666666666 20 -6.666666666666666 30 -0.0000000000000008 10 8.0 20 -8.0 30 -0.000000000000001 11 2.0 21 -2.0 31 -0.0000000000000002 11 4.0 21 -4.0 31 -0.0000000000000005 11 8.0 21 -8.0 31 -0.000000000000001 0 SPLINE 5 237 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0000000000000001 220 -0.0000000000000002 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 6.082762530298219 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 40 12.16552506059644 10 8.0 20 -1.0 30 -0.0000000000000001 10 5.583333333333333 20 -0.9166666666666666 30 -0.0000000000000001 10 0.7500000000000002 20 -0.75 30 -0.0000000000000001 10 0.9166666666666666 20 -5.583333333333332 30 -0.0000000000000007 10 1.0 20 -8.0 30 -0.000000000000001 11 8.0 21 -1.0 31 -0.0000000000000001 11 2.0 21 -2.0 31 -0.0000000000000002 11 1.0 21 -8.0 31 -0.000000000000001 0 TEXT 5 238 330 1F 100 AcDbEntity 8 0 100 AcDbText 10 -7.0 20 -7.0 30 0.0 40 1.0 1 Text 50 180.0 210 0.0 220 0.0000000000000001 230 -1.0 100 AcDbText 0 VIEWPORT 5 102 102 {ACAD_XDICTIONARY 360 373 102 } 330 23 100 AcDbEntity 67 1 8 0 100 AcDbViewport 10 128.5 20 98.14473144822969 30 0.0 40 654.7948017621146 41 223.4694628964594 68 1 69 1 12 128.5 22 98.14473144822969 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 42 50.0 43 0.0 44 0.0 45 223.4694628964594 50 0.0 51 0.0 72 1000 90 32800 1 281 0 71 1 74 0 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 VIEWPORT 5 104 102 {ACAD_XDICTIONARY 360 375 102 } 330 23 100 AcDbEntity 67 1 8 0 100 AcDbViewport 10 128.5 20 97.5 30 0.0 40 205.6 41 156.0 68 2 69 2 12 513.4868045686685 22 175.2385563380282 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 42 50.0 43 0.0 44 0.0 45 347.4734376308731 50 0.0 51 0.0 72 1000 90 32880 1 281 0 71 1 74 0 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/testtypeautodetectinteger64.csv0000644003401500001440000000013013614004466023536 0ustar rouaultuserscol1,col2,col3,col4 1,10000000000,10000000000,10000000000 10000000000,1,10000000000,1.0 gdalautotest-3.0.4/ogr/data/testtypeautodetectboolean.csv0000644003401500001440000000020413614004466023350 0ustar rouaultusersb1,b2,b3,b4,b5,b6,b7,b8,b9,b10,other1,other2,other3 y,yes,t,true,on,n,no,f,false,off,0,1,y y,yes,t,true,on,n,no,f,false,off,0,1,foo gdalautotest-3.0.4/ogr/data/test_dgnv8_write_ref.csv0000644003401500001440000007245513614004466022221 0ustar rouaultusersWKT,Type,Level,GraphicGroup,ColorIndex,Weight,Style,Text,ogr_style "POINT Z (0 1 2)",3,1,2,3,5,4,, "POINT (0 1)",3,64,0,0,0,0,, "LINESTRING Z (0 1 2,3 4 5)",3,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0 1,2 3)",3,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POINT (0 1)",17,64,0,256,0,0,myTéxt,"LABEL(t:""myTéxt"",c:#c8ff96,s:1.000000g,f:""CHAR_FAST_FONT"",p:7,a:-45)" "POINT (0 1)",17,64,0,0,0,0,x,"LABEL(t:""x"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "POINT (0 1)",17,64,0,0,0,0,z,"LABEL(t:""z"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "POINT (0 1)",17,64,0,0,0,0,z,"LABEL(t:""z"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" "LINESTRING Z (0 1 2,3 4 5,6 7 8)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0 1,3 4,6 7)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POINT (0 1)",3,64,0,0,0,0,, "POINT (3 4)",3,64,0,0,0,0,, "POINT Z (0 1 2)",3,64,0,0,0,0,, "POINT Z (3 4 2)",3,64,0,0,0,0,, "LINESTRING Z (0 1 2)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (1 1,0.997509025150764 1.14107791808462,0.990048510514454 1.28145299307778,0.977655623999715 1.42042588341694,0.960392106343779 1.55730423315298,0.938343963523229 1.69140612123271,0.911621038276542 1.82206345879524,0.880356462873091 1.9486253175571,0.844705995854882 2.0704611727042,0.804847246055326 2.18696404413471,0.760978787760968 2.29755352040345,0.71331917142438 2.40167865030247,0.662105834856801 2.49882068767225,0.607593920324899 2.58849567576902,0.550055003444841 2.67025685831287,0.489775740206228 2.74369690520508,0.427056438866376 2.80844994182617,0.362209563829682 2.86419337180488,0.295558178965684 2.91064948417703,0.227434338121107 2.9475868369276,0.158177430844304 2.97482141002319,0.088132491563602 2.99221752219058,0.017648480643129 2.999688506874,-0.052923454120163 2.99719714400356,-0.123231726897159 2.98475584542376,-0.192926065409497 2.96242659305831,-0.261659255968441 2.9303206301193,-0.32908887327601 2.88859790689911,-0.394878986370591 2.83746628390611,-0.45870183221809 2.77718049631405,-0.520239448610882 2.70804088488425,-0.579185258239533 2.63039189968302,-0.635245596045539 2.54462038404878,-0.688141172245869 2.45115364735797,-0.737608463740622 2.35045733619126,-0.783401026971853 2.24303311450572,-0.825290725692977 2.12941616437017,-0.863068867532084 2.01017251971509,-0.896547243686828 1.88589624638002,-0.925559066571221 1.75720648250741,-0.949959800742991 1.62474435402759,-0.969627882971888 1.4891697806016,-0.984465327861583 1.35115818793464,-0.994398216007982 1.21139714283919,-0.999377062261978 1.07058292781171,-0.999377062261978 0.929417072188295,-0.994398216007982 0.788602857160815,-0.984465327861583 0.648841812065358,-0.969627882971888 0.5108302193984,-0.949959800742991 0.375255645972412,-0.925559066571221 0.242793517492593,-0.896547243686829 0.114103753619984,-0.863068867532084 -0.010172519715095,-0.825290725692977 -0.129416164370174,-0.783401026971853 -0.243033114505718,-0.737608463740622 -0.350457336191261,-0.688141172245869 -0.451153647357965,-0.635245596045539 -0.544620384048777,-0.579185258239534 -0.630391899683024,-0.520239448610882 -0.708040884884253,-0.458701832218091 -0.777180496314054,-0.394878986370591 -0.837466283906112,-0.329088873276011 -0.888597906899111,-0.26165925596844 -0.9303206301193,-0.192926065409497 -0.962426593058309,-0.123231726897159 -0.984755845423758,-0.052923454120163 -0.997197144003557,0.017648480643128 -0.999688506873997,0.088132491563602 -0.992217522190578,0.158177430844304 -0.97482141002319,0.227434338121106 -0.947586836927601,0.295558178965684 -0.910649484177031,0.362209563829682 -0.86419337180488,0.427056438866376 -0.80844994182617,0.489775740206228 -0.743696905205077,0.550055003444841 -0.670256858312871,0.607593920324898 -0.588495675769023,0.662105834856801 -0.49882068767225,0.71331917142438 -0.401678650302467,0.760978787760968 -0.297553520403453,0.804847246055326 -0.186964044134713,0.844705995854882 -0.0704611727042,0.880356462873091 0.051374682442894,0.911621038276542 0.177936541204757,0.938343963523229 0.308593878767287,0.960392106343779 0.442695766847016,0.977655623999714 0.579574116583056,0.990048510514454 0.718547006922218,0.997509025150764 0.858922081915375,1.0 1.0)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "COMPOUNDCURVE (CIRCULARSTRING (0.707106781186547 1.70710678118655,-0.707106781186547 1.70710678118655,-0.707106781186548 0.292893218813453),CIRCULARSTRING (-0.707106781186548 0.292893218813453,0.707106781186547 0.292893218813452,0.707106781186548 1.70710678118655))",12,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (1 1 2,0.997564050259825 1.06975647374418 2,0.990268068741585 1.13917310096005 2,0.97814760073382 1.20791169081781 2,0.961261695938333 1.27563735581703 2,0.939692620785934 1.34202014332567 2,0.913545457642613 1.40673664307582 2,0.882947592858954 1.46947156278594 2,0.848048096156447 1.52991926423323 2,0.809016994374957 1.58778525229252 2,0.766044443119 1.64278760968659 2,0.719339800338673 1.69465837045902 2,0.669130606358863 1.74314482547743 2,0.61566147532568 1.78801075360673 2,0.559192903470773 1.82903757255508 2,0.5 1.86602540378448 2,0.438371146789081 1.8987940462992 2,0.374606593415919 1.92718385456681 2,0.309016994374957 1.95105651629518 2,0.241921895599674 1.97029572627605 2,0.173648177666934 1.98480775301226 2,0.104528463267656 1.99452189536828 2,0.034899496702501 1.99939082701911 2,-0.034899496702502 1.99939082701911 2,-0.104528463267656 1.99452189536828 2,-0.173648177666934 1.98480775301226 2,-0.241921895599674 1.97029572627605 2,-0.309016994374957 1.95105651629518 2,-0.374606593415919 1.92718385456681 2,-0.438371146789081 1.8987940462992 2,-0.5 1.86602540378448 2,-0.559192903470773 1.82903757255508 2,-0.61566147532568 1.78801075360673 2,-0.669130606358863 1.74314482547743 2,-0.719339800338673 1.69465837045902 2,-0.766044443119 1.64278760968659 2,-0.809016994374957 1.58778525229252 2,-0.848048096156447 1.52991926423323 2,-0.882947592858954 1.46947156278594 2,-0.913545457642613 1.40673664307582 2,-0.939692620785934 1.34202014332567 2,-0.961261695938333 1.27563735581703 2,-0.97814760073382 1.20791169081781 2,-0.990268068741585 1.13917310096005 2,-0.997564050259825 1.06975647374418 2,-1.0 1.0 2,-0.997564050259825 0.930243526255879 2,-0.990268068741585 0.860826899039935 2,-0.97814760073382 0.792088309182247 2,-0.961261695938333 0.724362644183031 2,-0.939692620785934 0.657979856674359 2,-0.913545457642613 0.593263356924211 2,-0.882947592858954 0.530528437214116 2,-0.848048096156447 0.4700807357668 2,-0.809016994374957 0.412214747707537 2,-0.766044443119 0.357212390313464 2,-0.719339800338673 0.305341629541004 2,-0.669130606358863 0.256855174522613 2,-0.61566147532568 0.21198924639328 2,-0.559192903470773 0.170962427444962 2,-0.5 0.133974596215566 2,-0.438371146789081 0.101205953700834 2,-0.374606593415919 0.072816145433215 2,-0.309016994374957 0.048943483704848 2,-0.241921895599674 0.029704273724004 2,-0.173648177666934 0.015192246987792 2,-0.104528463267656 0.005478104631727 2,-0.034899496702502 0.000609172980904 2,0.034899496702501 0.000609172980904 2,0.104528463267656 0.005478104631727 2,0.173648177666934 0.015192246987792 2,0.241921895599674 0.029704273724004 2,0.309016994374957 0.048943483704848 2,0.374606593415919 0.072816145433215 2,0.438371146789081 0.101205953700834 2,0.5 0.133974596215566 2,0.559192903470773 0.170962427444962 2,0.61566147532568 0.21198924639328 2,0.669130606358863 0.256855174522613 2,0.719339800338673 0.305341629541004 2,0.766044443119 0.357212390313464 2,0.809016994374957 0.412214747707537 2,0.848048096156447 0.4700807357668 2,0.882947592858954 0.530528437214116 2,0.913545457642613 0.593263356924211 2,0.939692620785934 0.657979856674359 2,0.961261695938333 0.724362644183003 2,0.97814760073382 0.792088309182247 2,0.990268068741585 0.860826899039935 2,0.997564050259825 0.930243526255879 2,1.0 1.0 2)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0.984807753012208 1.34729635533386,0.969910656567805 1.48692224544052,0.950071117740945 1.62406689139697,0.925390234273861 1.7580314355238,0.895993774291336 1.88813322521155,0.862031535415169 2.01370929156197,0.823676581429833 2.13411972772554,0.781124360389093 2.24875094972013,0.734591708657533 2.35701882311426,0.684315745962138 2.45837163964235,0.630552667084523 2.55229292858351,0.573576436351046 2.63830408857798,0.513677391573406 2.71596682646995,0.451160764553701 2.78488539074902,0.386345125693129 2.84470858820916,0.31956076063025 2.89513157354883,0.251147987181079 2.93589740279271,0.181455421157503 2.96679834261935,0.110838199901011 2.98767692892251,0.039656172584212 2.99842676921219,-0.031727933498068 2.99899308476637,-0.102950361303934 2.98937298977079,-0.17364817766693 2.96961550602442,-0.243461122720259 2.93982131313561,-0.312033445698487 2.90014223548189,-0.3790157177619 2.85078046854772,-0.444066612605774 2.79198754858267,-0.506854645780983 2.72406307083034,-0.567059863862771 2.64735316285967,-0.624375474860063 2.56224872077819,-0.678509411557132 2.46918341731507,-0.729185819821177 2.36863149192428,-0.776146464291757 2.26110533416905,-0.819152044288992 2.14715287270209,-0.857983413234977 2.02735478314681,-0.89244269537451 1.9023215291074,-0.922354294104581 1.77269025138626,-0.947565786774415 1.6391215212605,-0.967948701396356 1.50229597436216,-0.983399171309674 1.36291084231501,-0.993838464461254 1.22167639980202,-0.999213384606097 1.07931234516843,-0.999496542383185 0.936544133003865,-0.994686494885393 0.794099277392132,-0.984807753012208 0.652703644666141)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CIRCULARSTRING (0.573576436351046 1.81915204428899,-0.819152044288992 1.57357643635105,-0.573576436351047 0.180847955711009)",16,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (0.984807753012208 1.17364817766693 2,0.970295726276021 1.24192189559972 2,0.951056516295154 1.30901699437496 2,0.927183854566806 1.37460659341593 2,0.898794046299173 1.43837114678911 2,0.866025403784448 1.5 2,0.829037572555052 1.55919290347077 2,0.788010753606727 1.61566147532568 2,0.743144825477401 1.66913060635886 2,0.694658370459024 1.71933980033867 2,0.642787609686564 1.76604444311903 2,0.587785252292491 1.80901699437499 2,0.529919264233229 1.84804809615645 2,0.469471562785898 1.88294759285895 2,0.406736643075803 1.91354545764261 2,0.342020143325683 1.93969262078593 2,0.275637355817011 1.96126169593833 2,0.207911690817767 1.97814760073385 2,0.139173100960072 1.99026806874161 2,0.069756473744128 1.99756405025983 2,0.0 2.0 2,-0.069756473744125 1.99756405025983 2,-0.139173100960065 1.99026806874161 2,-0.20791169081776 1.97814760073385 2,-0.275637355817011 1.96126169593833 2,-0.342020143325669 1.93969262078593 2,-0.406736643075803 1.91354545764261 2,-0.469471562785898 1.88294759285895 2,-0.529919264233229 1.84804809615645 2,-0.587785252292491 1.80901699437499 2,-0.642787609686564 1.76604444311903 2,-0.694658370459024 1.71933980033867 2,-0.743144825477401 1.66913060635886 2,-0.788010753606727 1.61566147532568 2,-0.829037572555052 1.55919290347077 2,-0.866025403784448 1.5 2,-0.898794046299173 1.43837114678911 2,-0.927183854566806 1.37460659341593 2,-0.951056516295154 1.30901699437499 2,-0.970295726276021 1.24192189559972 2,-0.984807753012234 1.17364817766696 2,-0.99452189536828 1.10452846326768 2,-0.999390827019113 1.03489949670251 2,-0.999390827019113 0.965100503297506 2,-0.99452189536828 0.895471536732373 2,-0.984807753012208 0.82635182233307 2)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (1 1,1.03550295857988 0.953117888029131,1.06508875739645 0.891215293582157,1.0887573964497 0.817023213472918,1.10650887573965 0.733272644515248,1.11834319526627 0.642694583522986,1.12426035502959 0.548020027309968,1.12426035502959 0.451979972690032,1.11834319526627 0.357305416477014,1.10650887573965 0.266727355484752,1.0887573964497 0.182976786527082,1.06508875739645 0.108784706417843,1.03550295857988 0.046882111970869,1 0,0.953117888029131 -0.035502958579882,0.891215293582158 -0.06508875739645,0.817023213472918 -0.088757396449704,0.733272644515248 -0.106508875739645,0.642694583522986 -0.118343195266272,0.548020027309968 -0.124260355029586,0.451979972690032 -0.124260355029586,0.357305416477014 -0.118343195266272,0.266727355484752 -0.106508875739645,0.182976786527082 -0.088757396449704,0.108784706417842 -0.06508875739645,0.046882111970869 -0.035502958579882,0 0,-0.035502958579882 0.046882111970869,-0.06508875739645 0.108784706417842,-0.088757396449704 0.182976786527082,-0.106508875739645 0.266727355484752,-0.118343195266272 0.357305416477014,-0.124260355029586 0.451979972690032,-0.124260355029586 0.548020027309968,-0.118343195266272 0.642694583522986,-0.106508875739645 0.733272644515248,-0.088757396449704 0.817023213472918,-0.06508875739645 0.891215293582158,-0.035502958579882 0.953117888029131,0 1)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (1 1 1,1.03550295857988 0.953117888029131 1,1.06508875739645 0.891215293582157 1,1.0887573964497 0.817023213472918 1,1.10650887573965 0.733272644515248 1,1.11834319526627 0.642694583522986 1,1.12426035502959 0.548020027309968 1,1.12426035502959 0.451979972690032 1,1.11834319526627 0.357305416477014 1,1.10650887573965 0.266727355484752 1,1.0887573964497 0.182976786527082 1,1.06508875739645 0.108784706417843 1,1.03550295857988 0.046882111970869 1,1 0 1,0.953117888029131 -0.035502958579882 1,0.891215293582158 -0.06508875739645 1,0.817023213472918 -0.088757396449704 1,0.733272644515248 -0.106508875739645 1,0.642694583522986 -0.118343195266272 1,0.548020027309968 -0.124260355029586 1,0.451979972690032 -0.124260355029586 1,0.357305416477014 -0.118343195266272 1,0.266727355484752 -0.106508875739645 1,0.182976786527082 -0.088757396449704 1,0.108784706417842 -0.06508875739645 1,0.046882111970869 -0.035502958579882 1,0 0 1,-0.035502958579882 0.046882111970869 1,-0.06508875739645 0.108784706417842 1,-0.088757396449704 0.182976786527082 1,-0.106508875739645 0.266727355484752 1,-0.118343195266272 0.357305416477014 1,-0.124260355029586 0.451979972690032 1,-0.124260355029586 0.548020027309968 1,-0.118343195266272 0.642694583522986 1,-0.106508875739645 0.733272644515248 1,-0.088757396449704 0.817023213472918 1,-0.06508875739645 0.891215293582158 1,-0.035502958579882 0.953117888029131 1,0 1 1)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (-1.16666666666667 0.916666666666667 0,-1.22161572152053 0.939262303213449 0,-1.28463185337426 0.956809978404035 0,-1.35368621651529 0.969309692238426 0,-1.42674996523111 0.97676144471662 0,-1.50179425380916 0.979165235838618 0,-1.57679023653692 0.97652106560442 0,-1.64970906770184 0.968828934014026 0,-1.71852190159138 0.956088841067436 0,-1.78119989249301 0.93830078676465 0,-1.83571423120655 0.915464789361847 0,-1.88042474607572 0.887775185887156 0,-1.91503933823249 0.856100349762836 0,-1.93955800767687 0.821454703845157 0,-1.95398075440886 0.784852670990387 0,-1.95830757842845 0.747308674054796 0,-1.95253847973566 0.709837135894653 0,-1.93667345833047 0.673452479366227 0,-1.91071251421289 0.639169127325787 0,-1.87465564738292 0.608001502629602 0,-1.82850285784056 0.58096380905979 0,-1.7722541455858 0.55873794229565 0,-1.70590951061865 0.541004519609273 0,-1.62946895293911 0.527256329572524 0,-1.54293247254718 0.516986160757269 0,-1.44630006944285 0.509686801735374 0,-1.33957174362614 0.504851041078703 0,-1.22274749509703 0.501971667359124 0,-1.09582732385553 0.500541469148499 0,-0.958811229901635 0.500053235018696 0,-0.811700199069029 0.5 0,-0.654996020700608 0.5 0,-0.490514600434124 0.5 0,-0.320284783982116 0.5 0,-0.146335417057121 0.5 0,0.029304654628324 0.5 0,0.204606585361678 0.5 0,0.377541529430404 0.5 0,0.546080641121964 0.5 0,0.70819507472382 0.5 0,0.861858321314378 0.500000584197736 0,1.00560503040987 0.5001426264004 0,1.13925581679296 0.500888491731795 0,1.26281068046366 0.502745391620056 0,1.37626962142198 0.506220537493318 0,1.4796326396679 0.511821140779715 0,1.57289973520142 0.520054412907382 0,1.65607090802256 0.531427565304453 0,1.7291461581313 0.546447809399063 0,1.79212548552765 0.565622356619346 0,1.84500889021161 0.589454995359827 0,1.88779637218318 0.617981900239693 0,1.92048793144235 0.650300814367993 0,1.94308356798913 0.685397314888458 0,1.95558328182352 0.72225697894482 0,1.95798707294552 0.759865383680809 0,1.95029494135513 0.797208106240156 0,1.93250688705234 0.833270723766592 0,1.90462291003716 0.867038813403848 0,1.86664301030959 0.897497952295654 0,1.81857507453907 0.923637660920461 0,1.76111411546968 0.944791022794045 0,1.69616574960401 0.960896423311432 0,1.62575882265462 0.971953862472624 0,1.55192218033403 0.977963340277619 0,1.47668466835478 0.978924856726418 0,1.40207513242941 0.974838411819021 0,1.33012241827046 0.965704005555428 0,1.26285537159047 0.95152163793564 0,1.20230283810197 0.932291308959654 0,1.15047487790906 0.908013018627473 0,1.10825441460886 0.878686766939096 0,1.07477731021269 0.844312553894523 0,1.04902914186428 0.804890379493754 0,1.02999548670737 0.760420243736788 0,1.01666192188568 0.710902146623627 0,1.00801402454295 0.65633608815427 0,1.00303737182291 0.596722068328716 0,1.00071754086929 0.532060087146967 0,1.00004010882581 0.462350144609022 0,1.0 0.387601587878656 0,1.0 0.308231625420298 0,1.0 0.225214571264401 0,1.0 0.139564848267234 0,1.0 0.052296879285067 0,1.0 -0.035574912825832 0,1.0 -0.123036105209193 0,1.0 -0.209072275008748 0,1.0 -0.292668999368227 0,1.0 -0.372811855431362 0,1.00001330875467 -0.448499729096557 0,1.00049291683978 -0.519171188083301 0,1.00242170043384 -0.58479468571385 0,1.00681408239313 -0.645370221988202 0,1.01468448557391 -0.700897796906359 0,1.02704733283246 -0.75137741046832 0,1.04491704702503 -0.796809062674084 0,1.06930805100791 -0.837192753523653 0,1.10123476763736 -0.872528483017025 0,1.14171161976965 -0.902816251154201 0,1.19169826172329 -0.928056057935182 0,1.2507418124596 -0.948247903359966 0,1.3168863231898 -0.963391787428554 0,1.38810294820134 -0.973487710140946 0,1.46236284178169 -0.978535671497142 0,1.53763715821831 -0.978535671497142 0,1.61189705179866 -0.973487710140946 0,1.6831136768102 -0.963391787428554 0,1.7492581875404 -0.948247903359966 0,1.80830173827671 -0.928056057935182 0,1.85826408125577 -0.902840550128785 0,1.89816701388094 -0.873126701498727 0,1.92797402379372 -0.839910678722025 0,1.9476851109941 -0.804206904654949 0,1.95730027548209 -0.767029802153769 0,1.95681951725769 -0.729393794074753 0,1.9462428363209 -0.692313303274169 0,1.92557023267172 -0.656802752608287 0,1.89480170631014 -0.623876564933378 0,1.85393725723617 -0.594549163105708 0,1.80297688544981 -0.569787649964928 0,1.74192059095106 -0.549764299946542 0,1.67076837373992 -0.533991864754427 0,1.58952023381638 -0.521963132960447 0,1.49817617118045 -0.513170893136469 0,1.39673618583213 -0.507107933854357 0,1.28520027777142 -0.503267043685978 0,1.16356844699831 -0.501141011203197 0,1.03184069351282 -0.500222624977878 0,0.890017017314927 -0.500004673581888 0,0.738177636056274 -0.5 0,0.577516978520544 -0.5 0,0.410045196092726 -0.5 0,0.237791134485349 -0.5 0,0.062783639410957 -0.5 0,-0.112948443417913 -0.5 0,-0.28737626828872 -0.5 0,-0.458470989488931 -0.5 0,-0.624203761306007 -0.5 0,-0.782545738027407 -0.5 0,-0.931568263852325 -0.500025047477933 0,-1.07050739070381 -0.500391366842696 0,-1.19935059484291 -0.501603038587685 0,-1.31809787626962 -0.504167274141031 0,-1.42674923498394 -0.508591284930871 0,-1.52530467098586 -0.515382282385339 0,-1.61376418427539 -0.52504747793257 0,-1.69212777485253 -0.538094083000697 0,-1.76039544271728 -0.555029309017855 0,-1.81856718786963 -0.576360367412179 0,-1.86664301030959 -0.602502047704345 0,-1.90462291003716 -0.632961186596153 0,-1.93250688705234 -0.666729276233409 0,-1.95029494135513 -0.702791893759845 0,-1.95798707294552 -0.740134616319191 0,-1.95558328182352 -0.77774302105518 0,-1.94308356798913 -0.814602685111542 0,-1.92048793144235 -0.849699185632008 0,-1.88779637218318 -0.882018099760307 0,-1.84500889021161 -0.910545004640173 0,-1.79227504014808 -0.934340254725548 0,-1.73099561862652 -0.953089825477134 0,-1.66319490731466 -0.966791434872523 0,-1.59090175192503 -0.975445082911716 0,-1.51614499817018 -0.979050769594713 0,-1.44095349176265 -0.977608494921514 0,-1.36735607841496 -0.971118258892119 0,-1.29738160383967 -0.959580061506528 0,-1.2330589137493 -0.942993902764742 0,-1.1764168538564 -0.921359782666758 0,-1.12921519204752 -0.894677701212579 0,-1.09128474830954 -0.862947658402203 0,-1.06161460497261 -0.826169654235633 0,-1.03919033918046 -0.784343688712865 0,-1.02299752807682 -0.737469761833901 0,-1.01202174880542 -0.685547873598742 0,-1.00524857850999 -0.628578024007387 0,-1.00166359433426 -0.566560213059835 0,-1.00025237342197 -0.499494440756087 0,-1.00000049291684 -0.427380707096143 0,-1.0 -0.350378717136092 0,-1.0 -0.269633763153167 0,-1.0 -0.186666740056507 0,-1.0 -0.102999282130519 0,-1.0 -0.020153023659606 0,-1.0 0.060350401071827 0,-1.0 0.13698935777938 0,-1.0 0.208242212178646 0,-1.0 0.272587329985224 0,-1.0 0.328503076914707 0,-1.0 0.374843476083146 0,-1.0 0.412465107421002 0,-1.0 0.442889167064378 0,-1.0 0.467637289297677 0,-1.0 0.488231108405302 0,-1.0 0.506192258671658 0,-1.0 0.523042374381148 0,-1.0 0.540303089818175 0,-1.0 0.559496039267143 0,-1.0 0.582142857012456 0,-1.00014604943401 0.609400053753494 0,-1.00125823413017 0.64073904920431 0,-1.00435095868857 0.675145466149082 0,-1.01043864596547 0.711604881731541 0,-1.02053571881716 0.74910287309542 0,-1.03565660009989 0.786625017384447 0,-1.05681571266994 0.823156891742355 0,-1.08502747938357 0.857684073312872 0,-1.12130632309706 0.889192139239733 0,-1.16666666666667 0.916666666666667 0)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (-1.16666666666667 0.916666666666667,-1.22161572152053 0.939262303213449,-1.28463185337426 0.956809978404035,-1.35368621651529 0.969309692238426,-1.42674996523111 0.97676144471662,-1.50179425380916 0.979165235838618,-1.57679023653692 0.97652106560442,-1.64970906770184 0.968828934014026,-1.71852190159138 0.956088841067436,-1.78119989249301 0.93830078676465,-1.83571423120655 0.915464789361847,-1.88042474607572 0.887775185887156,-1.91503933823249 0.856100349762836,-1.93955800767687 0.821454703845157,-1.95398075440886 0.784852670990387,-1.95830757842845 0.747308674054796,-1.95253847973566 0.709837135894653,-1.93667345833047 0.673452479366227,-1.91071251421289 0.639169127325787,-1.87465564738292 0.608001502629602,-1.82850285784056 0.58096380905979,-1.7722541455858 0.55873794229565,-1.70590951061865 0.541004519609273,-1.62946895293911 0.527256329572524,-1.54293247254718 0.516986160757269,-1.44630006944285 0.509686801735374,-1.33957174362614 0.504851041078703,-1.22274749509703 0.501971667359124,-1.09582732385553 0.500541469148499,-0.958811229901635 0.500053235018696,-0.811700199069029 0.5,-0.654996020700608 0.5,-0.490514600434124 0.5,-0.320284783982116 0.5,-0.146335417057121 0.5,0.029304654628324 0.5,0.204606585361678 0.5,0.377541529430404 0.5,0.546080641121964 0.5,0.70819507472382 0.5,0.861858321314378 0.500000584197736,1.00560503040987 0.5001426264004,1.13925581679296 0.500888491731795,1.26281068046366 0.502745391620056,1.37626962142198 0.506220537493318,1.4796326396679 0.511821140779715,1.57289973520142 0.520054412907382,1.65607090802256 0.531427565304453,1.7291461581313 0.546447809399063,1.79212548552765 0.565622356619346,1.84500889021161 0.589454995359827,1.88779637218318 0.617981900239693,1.92048793144235 0.650300814367993,1.94308356798913 0.685397314888458,1.95558328182352 0.72225697894482,1.95798707294552 0.759865383680809,1.95029494135513 0.797208106240156,1.93250688705234 0.833270723766592,1.90462291003716 0.867038813403848,1.86664301030959 0.897497952295654,1.81857507453907 0.923637660920461,1.76111411546968 0.944791022794045,1.69616574960401 0.960896423311432,1.62575882265462 0.971953862472624,1.55192218033403 0.977963340277619,1.47668466835478 0.978924856726418,1.40207513242941 0.974838411819021,1.33012241827046 0.965704005555428,1.26285537159047 0.95152163793564,1.20230283810197 0.932291308959654,1.15047487790906 0.908013018627473,1.10825441460886 0.878686766939096,1.07477731021269 0.844312553894523,1.04902914186428 0.804890379493754,1.02999548670737 0.760420243736788,1.01666192188568 0.710902146623627,1.00801402454295 0.65633608815427,1.00303737182291 0.596722068328716,1.00071754086929 0.532060087146967,1.00004010882581 0.462350144609022,1.0 0.387601587878656,1.0 0.308231625420298,1.0 0.225214571264401,1.0 0.139564848267234,1.0 0.052296879285067,1.0 -0.035574912825832,1.0 -0.123036105209193,1.0 -0.209072275008748,1.0 -0.292668999368227,1.0 -0.372811855431362,1.00001330875467 -0.448499729096557,1.00049291683978 -0.519171188083301,1.00242170043384 -0.58479468571385,1.00681408239313 -0.645370221988202,1.01468448557391 -0.700897796906359,1.02704733283246 -0.75137741046832,1.04491704702503 -0.796809062674084,1.06930805100791 -0.837192753523653,1.10123476763736 -0.872528483017025,1.14171161976965 -0.902816251154201,1.19169826172329 -0.928056057935182,1.2507418124596 -0.948247903359966,1.3168863231898 -0.963391787428554,1.38810294820134 -0.973487710140946,1.46236284178169 -0.978535671497142,1.53763715821831 -0.978535671497142,1.61189705179866 -0.973487710140946,1.6831136768102 -0.963391787428554,1.7492581875404 -0.948247903359966,1.80830173827671 -0.928056057935182,1.85826408125577 -0.902840550128785,1.89816701388094 -0.873126701498727,1.92797402379372 -0.839910678722025,1.9476851109941 -0.804206904654949,1.95730027548209 -0.767029802153769,1.95681951725769 -0.729393794074753,1.9462428363209 -0.692313303274169,1.92557023267172 -0.656802752608287,1.89480170631014 -0.623876564933378,1.85393725723617 -0.594549163105708,1.80297688544981 -0.569787649964928,1.74192059095106 -0.549764299946542,1.67076837373992 -0.533991864754427,1.58952023381638 -0.521963132960447,1.49817617118045 -0.513170893136469,1.39673618583213 -0.507107933854357,1.28520027777142 -0.503267043685978,1.16356844699831 -0.501141011203197,1.03184069351282 -0.500222624977878,0.890017017314927 -0.500004673581888,0.738177636056274 -0.5,0.577516978520544 -0.5,0.410045196092726 -0.5,0.237791134485349 -0.5,0.062783639410957 -0.5,-0.112948443417913 -0.5,-0.28737626828872 -0.5,-0.458470989488931 -0.5,-0.624203761306007 -0.5,-0.782545738027407 -0.5,-0.931568263852325 -0.500025047477933,-1.07050739070381 -0.500391366842696,-1.19935059484291 -0.501603038587685,-1.31809787626962 -0.504167274141031,-1.42674923498394 -0.508591284930871,-1.52530467098586 -0.515382282385339,-1.61376418427539 -0.52504747793257,-1.69212777485253 -0.538094083000697,-1.76039544271728 -0.555029309017855,-1.81856718786963 -0.576360367412179,-1.86664301030959 -0.602502047704345,-1.90462291003716 -0.632961186596153,-1.93250688705234 -0.666729276233409,-1.95029494135513 -0.702791893759845,-1.95798707294552 -0.740134616319191,-1.95558328182352 -0.77774302105518,-1.94308356798913 -0.814602685111542,-1.92048793144235 -0.849699185632008,-1.88779637218318 -0.882018099760307,-1.84500889021161 -0.910545004640173,-1.79227504014808 -0.934340254725548,-1.73099561862652 -0.953089825477134,-1.66319490731466 -0.966791434872523,-1.59090175192503 -0.975445082911716,-1.51614499817018 -0.979050769594713,-1.44095349176265 -0.977608494921514,-1.36735607841496 -0.971118258892119,-1.29738160383967 -0.959580061506528,-1.2330589137493 -0.942993902764742,-1.1764168538564 -0.921359782666758,-1.12921519204752 -0.894677701212579,-1.09128474830954 -0.862947658402203,-1.06161460497261 -0.826169654235633,-1.03919033918046 -0.784343688712865,-1.02299752807682 -0.737469761833901,-1.01202174880542 -0.685547873598742,-1.00524857850999 -0.628578024007387,-1.00166359433426 -0.566560213059835,-1.00025237342197 -0.499494440756087,-1.00000049291684 -0.427380707096143,-1.0 -0.350378717136092,-1.0 -0.269633763153167,-1.0 -0.186666740056507,-1.0 -0.102999282130519,-1.0 -0.020153023659606,-1.0 0.060350401071827,-1.0 0.13698935777938,-1.0 0.208242212178646,-1.0 0.272587329985224,-1.0 0.328503076914707,-1.0 0.374843476083146,-1.0 0.412465107421002,-1.0 0.442889167064378,-1.0 0.467637289297677,-1.0 0.488231108405302,-1.0 0.506192258671658,-1.0 0.523042374381148,-1.0 0.540303089818175,-1.0 0.559496039267143,-1.0 0.582142857012456,-1.00014604943401 0.609400053753494,-1.00125823413017 0.64073904920431,-1.00435095868857 0.675145466149082,-1.01043864596547 0.711604881731541,-1.02053571881716 0.74910287309542,-1.03565660009989 0.786625017384447,-1.05681571266994 0.823156891742355,-1.08502747938357 0.857684073312872,-1.12130632309706 0.889192139239733,-1.16666666666667 0.916666666666667)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (0 1,2 3)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING (2 3,4 5)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (0 1 2,2 3 2)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "LINESTRING Z (2 3 2,4 5 2)",4,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "COMPOUNDCURVE ((0 1,2 1),CIRCULARSTRING (2 1,3.0 -0.0,4.0 1.0))",12,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,0 0))",6,64,0,0,0,0,,"BRUSH(fc:#c8ff96,id:""ogr-brush-0"");PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON Z ((0 0 1,0 1 1,1 1 1,0 0 1))",6,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,0 0),(0.1 0.1,0.1 0.9,0.9 0.9,0.1 0.1))",2,0,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON Z ((0 0 1,0 1 1,1 1 1,0 0 1),(0.1 0.1 1,0.1 0.9 1,0.9 0.9 1,0.1 0.1 1))",2,0,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,1 1,1 0,0 0))",6,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "CURVEPOLYGON (COMPOUNDCURVE ((0 0,0 1),CIRCULARSTRING (0 1,0.5 1.5,1 1),(1 1,0 0)))",14,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POLYGON ((0 0,0 1,0 0,1 0,1 1,0 0))",6,64,0,0,0,0,,"PEN(id:""ogr-pen-0"",c:#ffffff)" "POINT (0 1)",17,64,0,0,0,0,Named definition,"LABEL(t:""Named definition"",c:#ffffff,s:1.000000g,f:""CHAR_FAST_FONT"",p:7)" gdalautotest-3.0.4/ogr/data/buggymultipoint.shp0000644003401500001440000000026413614004466021314 0ustar rouaultusers' ZY@@Y@?$Y@@Y@?Y@@Y@?gdalautotest-3.0.4/ogr/data/ellipse_z_extrusion_minus_1.dxf0000644003401500001440000000122013614004466023573 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 ELLIPSE 5 21C 330 1F 100 AcDbEntity 8 FURN 100 AcDbEllipse 10 247.3507636351557 20 528.3475434420069 30 0.0 11 -0.6157610413936399 21 -2.598211223441448 31 0.0 210 0.0 220 0.0 230 -1.0 40 0.9999999999987393 41 -1.32730020685773 42 -0.2434961199352457 0 ELLIPSE 5 25E 330 1F 100 AcDbEntity 8 FURN 100 AcDbEllipse 10 293.2762731660328 20 532.3905559219506 30 0.0 11 -1.888102648390083 21 -1.888102648390081 31 0.0 210 0.0 220 0.0 230 1.0 40 0.9999999999987395 41 -1.32730020685773 42 -0.2434961199352457 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/grenada.geojson0000644003401500001440000003117213614004466020327 0ustar rouaultusers{"features":[{"geometry":{"coordinates":[[[[-61.173214300000005,12.516654800000001],[-61.3827217,12.5301363],[-61.665747100000004,12.5966532],[-61.6661847,12.596],[-61.66814250000001,12.593],[-61.6700247,12.59],[-61.6718337,12.587],[-61.673571700000004,12.584],[-61.6752407,12.581],[-61.6768427,12.578],[-61.678379400000004,12.575000000000001],[-61.6803295,12.571],[-61.6830501,12.565000000000001],[-61.68553430000001,12.559000000000001],[-61.687063699999996,12.555000000000001],[-61.6884946,12.551],[-61.6898391,12.546999999999999],[-61.69209600000001,12.540999999999999],[-61.69413360000001,12.535],[-61.69595870000001,12.529],[-61.697577200000005,12.523],[-61.69899410000001,12.517],[-61.700213700000006,12.511],[-61.7012395,12.505],[-61.7020744,12.499],[-61.702626200000005,12.494],[-61.7033841,12.493],[-61.706211800000005,12.491],[-61.7089415,12.489],[-61.7141311,12.485000000000001],[-61.718995500000005,12.481],[-61.72356890000001,12.477],[-61.727879200000004,12.473],[-61.7319495,12.469000000000001],[-61.73579920000001,12.465000000000002],[-61.74032590000001,12.46],[-61.74373590000001,12.456000000000001],[-61.746971,12.452000000000002],[-61.7500412,12.447999999999999],[-61.75295580000001,12.443999999999999],[-61.753784499999995,12.443],[-61.756858300000005,12.44],[-61.7598054,12.437],[-61.762633400000006,12.434],[-61.76534870000001,12.431],[-61.767957200000005,12.427999999999999],[-61.7704641,12.425],[-61.7728741,12.422],[-61.775191500000005,12.419],[-61.7774201,12.416],[-61.7802595,12.412],[-61.782954800000006,12.408],[-61.78551270000001,12.404],[-61.7873446,12.401],[-61.789675900000006,12.397],[-61.7918847,12.393],[-61.79397550000001,12.389000000000001],[-61.794998400000004,12.388],[-61.79830060000001,12.386000000000001],[-61.8030062,12.383000000000001],[-61.8059936,12.381],[-61.810272399999995,12.378],[-61.8130009,12.376000000000001],[-61.815637599999995,12.374],[-61.8181882,12.372000000000002],[-61.82186339999999,12.369000000000002],[-61.8265048,12.365000000000002],[-61.830876599999996,12.361],[-61.8329692,12.359000000000002],[-61.835999,12.356000000000002],[-61.8413082,12.351],[-61.845319800000006,12.347],[-61.8464439,12.346],[-61.8501187,12.343],[-61.853625699999995,12.34],[-61.85697739999999,12.337],[-61.86122339999999,12.333],[-61.864252900000004,12.33],[-61.8671584,12.327],[-61.8699469,12.324],[-61.872645999999996,12.321],[-61.8754727,12.318],[-61.87906749999999,12.314],[-61.8833,12.309000000000001],[-61.88726319999999,12.304],[-61.88952,12.301],[-61.891690399999995,12.297999999999998],[-61.8937778,12.295],[-61.895785200000006,12.292],[-61.89771530000001,12.289],[-61.899570800000006,12.286],[-61.90251490000001,12.280999999999999],[-61.904753,12.277],[-61.9068719,12.273],[-61.908875900000005,12.269],[-61.911674299999994,12.263],[-61.9134062,12.259],[-61.9150578,12.255],[-61.9179797,12.248999999999999],[-61.920656900000004,12.242999999999999],[-61.92290190000001,12.238999999999999],[-61.925082,12.235],[-61.92666,12.232],[-61.9286637,12.227999999999998],[-61.930556100000004,12.223999999999998],[-61.9332651,12.217999999999998],[-61.936145100000005,12.212],[-61.938782200000006,12.206],[-61.943587599999994,12.193999999999999],[-61.94511500000001,12.19],[-61.9465439,12.186],[-61.9485074,12.18],[-61.95028749999999,12.174],[-61.95186999999999,12.168],[-61.9532519,12.162],[-61.95443739999999,12.156],[-61.954975999999995,12.154],[-61.9570107,12.147999999999998],[-61.9594482,12.139999999999999],[-61.961132600000006,12.133999999999999],[-61.962614,12.127999999999998],[-61.96295200000001,12.126999999999999],[-61.9668105,12.122],[-61.9704259,12.116999999999999],[-61.9738135,12.112],[-61.9769866,12.107],[-61.9799566,12.102],[-61.9827336,12.097],[-61.9853262,12.092],[-61.9882048,12.086],[-61.990875800000005,12.08],[-61.99252880000001,12.076],[-61.994819,12.07],[-61.996888999999996,12.064],[-61.99874590000001,12.058],[-62.000395600000004,12.052000000000001],[-62.0018433,12.046],[-62.0030933,12.04],[-62.003818700000004,12.036],[-62.0047472,12.03],[-62.0052609,12.026],[-62.005875200000006,12.02],[-62.0061812,12.016],[-62.0064861,12.01],[-62.0065868,12.006],[-62.006584499999995,12],[-62.006398100000006,11.994],[-62.0061714,11.99],[-62.0056768,11.984],[-62.0052436,11.98],[-62.004436999999996,11.974],[-62.003794,11.97],[-62.0026693,11.964],[-62.001811399999994,11.96],[-62.0003595,11.954],[-61.999279800000004,11.950000000000001],[-61.9974886,11.943999999999999],[-61.9961776,11.94],[-61.9940313,11.934],[-61.9924772,11.93],[-61.9908218,11.926],[-61.989062399999995,11.922],[-61.9871961,11.918],[-61.984707699999994,11.913],[-61.9825882,11.909],[-61.9803498,11.905000000000001],[-61.9773776,11.9],[-61.9748543,11.896],[-61.972195400000004,11.892000000000001],[-61.9693945,11.888],[-61.9664442,11.884],[-61.9641286,11.881],[-61.9617206,11.878],[-61.959215900000004,11.875000000000002],[-61.9557177,11.871],[-61.9520267,11.867],[-61.9496952,11.864],[-61.94728729999999,11.861],[-61.9430571,11.856000000000002],[-61.93853550000001,11.851],[-61.934690599999996,11.847],[-61.9306255,11.843],[-61.9274208,11.84],[-61.922921800000005,11.836],[-61.9193636,11.833],[-61.9156332,11.83],[-61.911715,11.827],[-61.9075906,11.824],[-61.903238,11.821],[-61.89863020000001,11.818],[-61.8937341,11.815000000000001],[-61.888507499999996,11.812000000000001],[-61.88481339999999,11.81],[-61.8789067,11.807],[-61.87468659999999,11.805000000000001],[-61.870200499999996,11.803],[-61.86540230000001,11.801],[-61.8602301,11.799],[-61.854597299999995,11.796999999999999],[-61.848375600000004,11.795],[-61.84498479999999,11.793999999999999],[-61.8413608,11.793],[-61.8374527,11.792],[-61.8331873,11.790999999999999],[-61.828452500000004,11.79],[-61.8230605,11.789],[-61.81664609999999,11.787999999999998],[-61.808274399999995,11.786999999999999],[-61.790283900000006,11.786],[-61.7840631,11.786],[-61.76607270000001,11.786999999999999],[-61.7573236,11.787999999999998],[-61.73933300000001,11.789],[-61.730961300000004,11.79],[-61.72079310000001,11.790999999999999],[-61.70280230000001,11.792],[-61.6944305,11.793],[-61.688016000000005,11.793999999999999],[-61.6826238,11.795],[-61.6732043,11.796999999999999],[-61.667812100000006,11.797999999999998],[-61.663077200000004,11.799],[-61.6588117,11.8],[-61.654903499999996,11.801],[-61.6512793,11.802000000000001],[-61.64788839999999,11.803],[-61.644693499999995,11.804],[-61.63878580000001,11.806000000000001],[-61.636033600000005,11.807],[-61.6308613,11.809000000000001],[-61.62841970000001,11.81],[-61.623784,11.812000000000001],[-61.621576700000006,11.813],[-61.6173564,11.815000000000001],[-61.6133668,11.817],[-61.60957990000001,11.819],[-61.6042318,11.822000000000001],[-61.6008621,11.824],[-61.5976324,11.826],[-61.5930244,11.829],[-61.590096,11.831],[-61.5872727,11.833],[-61.585739600000004,11.834],[-61.5816382,11.836],[-61.5758831,11.839],[-61.5705345,11.842],[-61.565532900000015,11.845],[-61.56375870000001,11.846],[-61.55785109999999,11.849],[-61.552374300000004,11.852000000000002],[-61.5472238,11.855000000000002],[-61.543925300000005,11.857000000000001],[-61.5407605,11.859000000000002],[-61.5362404,11.862000000000002],[-61.533365200000006,11.864],[-61.530591300000005,11.866000000000001],[-61.52791200000001,11.868],[-61.5240577,11.871],[-61.5215904,11.873000000000001],[-61.5180317,11.876000000000001],[-61.515748300000006,11.878],[-61.5124482,11.881],[-61.5103269,11.883000000000001],[-61.5072563,11.886000000000001],[-61.49835930000001,11.895000000000001],[-61.494617399999996,11.899000000000001],[-61.4902146,11.904],[-61.48533390000001,11.909],[-61.4816423,11.913],[-61.47729749999999,11.918],[-61.4732301,11.923],[-61.4694197,11.927999999999999],[-61.464353900000006,11.935],[-61.4615887,11.939],[-61.458328800000004,11.943999999999999],[-61.4552762,11.949],[-61.452420399999994,11.954],[-61.450271099999995,11.958],[-61.4482377,11.962000000000002],[-61.4454269,11.967],[-61.4438039,11.97],[-61.4412339,11.975000000000001],[-61.4388714,11.979000000000001],[-61.436091399999995,11.984],[-61.43451230000001,11.987],[-61.4329978,11.99],[-61.4310762,11.994],[-61.428396400000004,12],[-61.42595080000001,12.006],[-61.423730500000005,12.012],[-61.42313910000001,12.013],[-61.4211047,12.016],[-61.41851320000001,12.02],[-61.4166569,12.023],[-61.41487299999999,12.026],[-61.4131591,12.029],[-61.4109797,12.033],[-61.409422,12.036],[-61.40744449999999,12.04],[-61.405577300000004,12.043999999999999],[-61.4038171,12.047999999999998],[-61.402161,12.052000000000001],[-61.399865999999996,12.058],[-61.39845880000001,12.062000000000001],[-61.3971473,12.066],[-61.3959295,12.07],[-61.394275,12.076],[-61.393596300000006,12.078],[-61.3910564,12.081],[-61.38782199999999,12.085],[-61.3855047,12.088],[-61.382552100000005,12.092],[-61.3804362,12.095],[-61.37774039999999,12.099],[-61.3758089,12.102],[-61.3733493,12.106],[-61.37158839999999,12.109],[-61.369348200000005,12.113],[-61.367746499999996,12.116],[-61.36571180000001,12.12],[-61.3637893,12.123999999999999],[-61.3619754,12.127999999999998],[-61.360267099999994,12.132],[-61.35866139999999,12.136],[-61.35643999999999,12.142],[-61.35508039999999,12.145999999999999],[-61.3538123,12.15],[-61.3520543,12.156],[-61.3509963,12.16],[-61.35002769999999,12.164],[-61.3487397,12.17],[-61.34798939999999,12.174],[-61.34732449999999,12.177999999999999],[-61.3464859,12.184],[-61.346031399999994,12.187999999999999],[-61.345660099999996,12.192],[-61.3452579,12.197999999999999],[-61.3450925,12.202],[-61.3450091,12.206],[-61.345007599999995,12.209999999999999],[-61.345087899999996,12.213999999999999],[-61.3452502,12.217999999999998],[-61.345494599999995,12.222],[-61.34582149999999,12.225999999999999],[-61.3462313,12.229999999999999],[-61.347002499999995,12.235999999999999],[-61.34762189999999,12.239999999999998],[-61.3483264,12.243999999999998],[-61.3495448,12.25],[-61.345779300000004,12.253],[-61.3421596,12.256],[-61.339838,12.258],[-61.3364839,12.261],[-61.333273999999996,12.264],[-61.330199,12.267],[-61.3272505,12.27],[-61.324421099999995,12.273],[-61.3217043,12.276],[-61.31824699999999,12.28],[-61.3157713,12.283],[-61.3126179,12.286999999999999],[-61.30962449999999,12.290999999999999],[-61.3067826,12.295],[-61.30408469999999,12.299],[-61.301524099999995,12.303],[-61.300435,12.304],[-61.297963700000004,12.306000000000001],[-61.29439910000001,12.309000000000001],[-61.29211200000002,12.311],[-61.2888064,12.314],[-61.286681699999995,12.316],[-61.283606,12.319],[-61.280656900000004,12.322000000000001],[-61.277826999999995,12.325000000000001],[-61.27510960000001,12.328],[-61.272499,12.331],[-61.26999000000001,12.334],[-61.267577800000005,12.337],[-61.26525820000001,12.34],[-61.262302800000015,12.344],[-61.260184900000006,12.347],[-61.25748639999999,12.351],[-61.256502700000006,12.352000000000002],[-61.25251010000001,12.355000000000002],[-61.248711400000005,12.358],[-61.245090100000006,12.361],[-61.2416324,12.364],[-61.23832620000001,12.367],[-61.235161000000005,12.370000000000001],[-61.23212780000001,12.373000000000001],[-61.22827520000001,12.377],[-61.22552040000001,12.38],[-61.22287430000001,12.383000000000001],[-61.220331400000006,12.386000000000001],[-61.2170932,12.39],[-61.2147732,12.393],[-61.2118172,12.397],[-61.209698800000005,12.4],[-61.206999800000006,12.404],[-61.205066,12.407],[-61.20258810000001,12.411],[-61.2008015,12.414],[-61.199085100000005,12.417],[-61.19743690000001,12.42],[-61.19585520000001,12.423],[-61.19433810000001,12.426],[-61.19241330000001,12.43],[-61.1897291,12.436],[-61.1872793,12.442],[-61.18505530000001,12.447999999999999],[-61.1836941,12.452000000000002],[-61.1824277,12.456000000000001],[-61.18125439999999,12.46],[-61.180172500000005,12.464],[-61.1791805,12.468],[-61.178277,12.472000000000001],[-61.1770853,12.478],[-61.17603230000001,12.484],[-61.175387900000004,12.488],[-61.1745797,12.494],[-61.1741456,12.498],[-61.1737945,12.502],[-61.173526,12.506],[-61.17333980000001,12.51],[-61.17323580000001,12.514],[-61.173214300000005,12.516654800000001]]]],"type":"MultiPolygon"},"id":550727,"osm_type":"relation","type":"Feature","name":"Grenada","properties":{"flag":"http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Grenada.svg","name":"Grenada","name:cs":"Grenada","name:de":"Grenada","name:en":"Grenada","name:eo":"Grenado","name:fr":"Grenade","name:fy":"Grenada","name:hr":"Grenada","name:nl":"Grenada","name:ru":"Гренада","name:sl":"Grenada","name:ta":"கிரெனடா","name:uk":"Гренада","boundary":"administrative","name:tzl":"Grenada","timezone":"America/Grenada","wikidata":"Q769","ISO3166-1":"GD","wikipedia":"en:Grenada","admin_level":"2","is_in:continent":"North America","ISO3166-1:alpha2":"GD","ISO3166-1:alpha3":"GRD","ISO3166-1:numeric":"308"}}],"type":"FeatureCollection","geocoding":{"creation_date":"2016-10-12","generator":{"author":{"name":"Mapzen"},"package":"fences-builder","version":"0.1.2"},"license":"ODbL (see http://www.openstreetmap.org/copyright)"}} gdalautotest-3.0.4/ogr/data/testcondition.gfs0000644003401500001440000000170313614004466020724 0ustar rouaultusers testcondition testcondition 100 name_en names|name @lang='en' String name_fr names|name @lang='fr' String name_others_lang names|name@lang @lang!='en' and @lang!='fr' StringList name_others names|name @lang!='en' and @lang!='fr' StringList gdalautotest-3.0.4/ogr/data/emptymultipoly.shx0000644003401500001440000000015413614004466021175 0ustar rouaultusers' 6Y@Y@@2gdalautotest-3.0.4/ogr/data/line.gxt0000644003401500001440000000062213614004466017007 0ustar rouaultusers//$DELIMITER "tab" //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 17};{TimeZone: 31} //$FIELDS Class=test;Subclass=test;Kind=2;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields id Private#X Private#Y Private#XP Private#YP Private#Graphics -1 test test test 1 1 440720.00 3751320.00 441920.00 3750120.00 1 441920.00 3750120.00 gdalautotest-3.0.4/ogr/data/gjline.dbf0000644003401500001440000000025113614004466017257 0ustar rouaultusers_aHFIDN NAMEC< 1 Line 1 gdalautotest-3.0.4/ogr/data/multilinestringzm_with_dummy_m_array.gdb.zip0000644003401500001440000005040613614004466026400 0ustar rouaultusersPKeH sample.gdb/PK&dH˖Rnsample.gdb/a00000001.gdbindexes=1 @ G -|~CTDAKQ^Mr#=+'&L]UbñHRRu0ѤL+?PKdHj< e;sample.gdb/a00000001.gdbtablem 0A}C-xKX 66>ՋI7m=Ҏom[s[ o ]$R(2_6@ごlCEB`A๗sU:gsgp!M"un%!y@-, BY"*MM'uפ?[?8B'Wyc04yPKdHC sample.gdb/a00000001.gdbtablxA 0D(ЁdTCUTIiU4/CRܙ{>wSt P-PKdHm<%sample.gdb/a00000001.TablesByName.atxK0E/w("T%؍K8XmڤIl1Kf̙fr&s~{lhpjk`hvƍŽWj8koO}gq{E~X}g*>?u8×_4S AA(ve?PK&dHeosample.gdb/a00000002.gdbtableUo@>\Ο_4Df& [[K{$/MlB[Ӗ cy}] !Q\f>_- BYK ,'dD@_ -p\"g֤F98Ӑ՘6W~ba]gL8< \z9}5,Q"-2J]u^uӉs^U6sV&_EӍƎ7Oυ'L܈Āqe$˨Jz\tZ'\}PK&dH$ sample.gdb/a00000002.gdbtablx=aF; DVh-MFlAb  XNtFHTasi~͈(r\;6` 76)p79#`  _.`:6p^L=\033333333+PK&dH)(*sample.gdb/a00000003.gdbindexes%ɱ 0Dџ3TX9O' 8y8iJf-PKdH_Ïsample.gdb/a00000003.gdbtable͑OPǏJhEL B !&cj^c$^.佻]r>{09>ǮrP ,A7( P! n@:p*bd! e 䳪K*?hKȬf kc;=Jfٹ y]y2b>>\gdR$UJBraSYJMXK$., r8W)KDeuUk6EG‘]e 8gc G9joe:d,ág'sutL kcXyݠtI&%R*5Z—jz]f& Pusl?nA^lmPKdH/) sample.gdb/a00000003.gdbtablx s Ѕ$jTnPKdHR kM/sample.gdb/a00000004.CatItemsByPhysicalName.atx1 0 F^WhyT ֹ}?m2$[WwƓ_9Xؘ+#m$I$I:CQPKdHYe'sample.gdb/a00000004.CatItemsByType.atx=0`K7$bFKE{=Ro!`xb',ϕ|l,\TnT5BmHѦͮG;_">٩ʔ8jqQqN_df)鞨ʮdSZч^a?PKdH&e!sample.gdb/a00000004.FDO_UUID.atx1@ @Hg)͝A$yC v$KfNcP%Ldy|%GeȽ|tlE)줧PKdHbHOsample.gdb/a00000004.gdbtableWK@+$_ƲŢl&-x"NqÍA"qppHDD8 ADtmw3"ݙfB@;>φ8.BvmDA"ZB1]S:څJ-AJD+:=d ,LHQT `: G 8b滍6!ΐ KnP-n}dm@lseVP'˦S&Խ Pr SB.t.eC~ 0@{5X!#X枨.󑂖Axo=Z=h!,@S@3)t11,KhZyao)-oʠ ҀIL?کI@2w"\9U] [,1l4%W%)`#CmS,`n'n[9<99.|s+eicOGym͙;?c䋻|t|w Q =UȀw+_y^DttŻs]:4s=zp-6BzXZ^),+ ͈9ߵKmoFL9vέ@5fŽ;&Lvܚ ӢR]Ud1ɴ=߰~>(2I>\sr*x y2 bz86 oXNdZ,EJrXBݴ. JMьF:x;ÒaꍆGB5M2︻JS+ǶI7[]ӮaeI 9,;[ X̻k@?V͎L`!.ִ#) ڸv6;c$İQes;'mNmx&z̧O%#M{˕/UEW|rz@kznnXZ$6JtmP/NN[xR׬vnҔ4<^U8Lr39h::`,X1  Ü69? }uLvKc(fJTa8`6E0Ӫ-Z5]`%X}꼰MbǮ~g@kE;,.1kB xyAcU0Q$v{  gZII{%Re=Kl}oPKdH + sample.gdb/a00000004.gdbtablxƁ  EEldGr׈(4s<r{6PKdH0!sample.gdb/a00000004.spxDZ0e, X ؜_PK&dHJc0+sample.gdb/a00000005.CatItemTypesByName.atxN@;&ƨ߀  CZPx3l1`(7枛ô͔| 4c4X=RPT2tnJRT*JRTUc;>ixއ%wgEw| Ϻ}x>7x O)G1VyO(sR]g^ M0^grS)Q i鷸-]L%V%LS8C&w|.3uW­;> +ool\S&O@\E 6zã7% yGt@{δ5]x`K kԿ9sMa=\qY'I+m?쑰YQPl oUdFO;^&eVwOjRT*J>3?qWPK&dH=ډ3sample.gdb/a00000005.CatItemTypesByParentTypeID.atxعj0ɾ.hJY}a=dB4S 9c__ !:Tb"B^KD%, >m0@9-8ї]UNȳ(rq,6$~bZM*NH[4x^@BYIZ&^zo |++PK&dH11a+sample.gdb/a00000005.CatItemTypesByUUID.atxXΜ1Lv {OyY}ڝ< v/!\ρ:x\͹<okp x |w3#px> o7#}9^HmFɳZoҦz:i[IP٩[\Ƭhd\iQ [935omf;iO:+KYdX1H5=<,߿ҥ{( }x@y7př5)ZΉYٸ3H3թ7botO,b'7L[aTtvLZbST'VMXi#B 7 [Oy,/t<¤C3PAYm+1V- -(qsU2jl,C^i[+|b XQjS;XÕkNPv+4x-uA2a;ɠB-`a\R X0Ni52!+jMR$(&jB~6VԂ3KmR*Ɩyr]$l x{&c5፽q`-AZzv^ E`z\H?/PK&dHݦw(sample.gdb/a00000005.gdbindexes @EOB)B|N"Zh-*6"j].w3ܝy/#r2RZ,7Oi?ҟx[JQOQ;u18_3Y;N;]+mg\PK&dH8b sample.gdb/a00000005.gdbtableuT LA]KmQ*h4jt=xI)(zD<]ݭ(A(%"%F#x`H+DG@ Dn;x0l|W+!us.6]_uHXI"lGw8`F`,K,p=ku_TGQvĞ8*z00AdZewp 5x 'LQHl5b}bxe6kS[~QUsdm{zEOIy)\Mﺺ㹥OB3:qrS1 0fkʰaѼіU_YԣOr4̓ W h+ʯ:h" !"GC(IUq.TZ< "aF@g?Bb;0FPá]PeOQv|#.Hq:? R0 _Jb^U':eKϭó$Cq<Lx&vPQ9_+ #h;;G$ EV ]2bKF4L` ͭ,DpHcn>ʭ}L~RD׬o;FF:>f42v 5^5YC̋v\c\UOL@+1^gfʝyI=5 {74qfCjO",ο+˓P.p%pܚ=[̰妉ko^ %g'@ʍW-91qBTqn!@&y+6\ӷ0 ZFx+Uޞ_^ !&\9ɋ #q n442XIuգv jΖxbPے-;lZK=mҁ7pxZL|~ϾPK&dH>sample.gdb/a00000006.gdbindexesm@EA ah$Va-%AiUJ;39,Y=gRd,UƒHz:?.(\=^rɌ'r_mPJ)+rRuV(oPKdHsample.gdb/a00000006.gdbtableEOMQ~^s_wY,g64f1M3J) !_ŽHE>v~  [QJʹ.{q:Dhd܎N.:0pC Y$G.-ӰBxkȡ"4!/HEϴ6(r%Xub!cԼB?#dOdSAb241"#e:\?>Wno\Q{k ZCm5Ǜ-'PKdHOsJ" sample.gdb/a00000006.gdbtablx {̦) 6? PK&dHN9N3sample.gdb/a00000007.CatRelTypesByBackwardLabel.atx[N0Eoy_+^Zl "ݰTЪ28h8V1:DGh)ZGhBhR=*ҹ2 ]IQއib-%d1wޕ L ⩷j8[t[>Eu]|KN3ΟY[R: `6^% TJФV1/2َ[]C#|Uָ|~Xjla|K;Zx[ԍ w?o$5 nrÄ]V=sDjw[1wYgϨg_2PK&dH  )4sample.gdb/a00000007.CatRelTypesByDestItemTypeID.atxn5 Foݑ( E_{I}nēvz /«.| Û#{^g2<oÇ;QkivqІ<',YjӏMTjj%6Jo}M)bԗ#Veh %H%RBu*lGWT4NGCK 8-f OIU,RR[ƮMWSR}@ܳjyv\sl5 JIsZ1mєRE̠ IMSϧfl6fU>>ίPK&dH掎 2sample.gdb/a00000007.CatRelTypesByForwardLabel.atxI0Ez.j-pA܆ @U|^DؗW`xo3׹~VfjkH?U|b><3.Q_O]}DFΙWQϹR<76͔6q|3x|s Fq 9T]_M)ˢsFs^ήGVD15OԫCS`}Ջ+Z[; o޼y;-À6XPK&dH%knS*sample.gdb/a00000007.CatRelTypesByName.atxXN@=x߾*bKЀoTԸZv_n;{2 3 ]Sr<$/-$;9yFGnhx#+$ ǘZ{GIO -0EgSbޕmWI2YKx#y sk.0 I$k^K*Bi ՋRV~v>]MO5黧_"h&}Nkn`W`If +k.cZx8=BL-FҬ[jO4J2vmi ʹNT_7E7Y` 6K ~PK&dHT!6sample.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxI1{#|KrQKSM>`_PPQYnU/M~O?Wcom%z9 W[x/] 8GժfĊcqP0ATe1oWMU`Zβbd^Z>3f1v]Uр;t s^zTT,YkF\}a͐ +%1!"e`:s6чq .XZ&p,V5bY=mAwjZ^>ʛ% *޳Z-W)4ZZle՜ƀ%ٳs l]7ɄnP=gU*0Fp8p8<+~PK&dH8ﺹ*sample.gdb/a00000007.CatRelTypesByUUID.atxXI! Y؀Y.zNU.$7]UM7W>oW#~_7 ¿VTOWҶ;cHoPr+9ХJkSdZpmĒ p?K@U'M_CC#8 ݒJ<5~o j NP1Cqa\02g;uT .\p… .W߿PK&dHdZsample.gdb/a00000007.gdbindexes] A_R\ .?öDk"XĖ)L̙s9S_ZCv(D$Ix 8/K7FX+f ?tݧ]>msg-cťhKɌHO+ XFe=uSAoPK&dH9% sample.gdb/a00000007.gdbtableU p QKܭ8`PV:ڤ U6M,nHGݭQt0:κ`QʸڪcP6yMhfoc}{)?C:P5W/^L0Ah*j)&DѰ`ʋ(XN CD%( @!7pw8IfF P엓Or0):FpB9BPVHBC3͖MǤg0 oc'Ce[*V,įf/CԽ?vo.n)L(dct, ꣧8ʈ*g8JX$q*KehZv ;5gqH˻N$)Gk5#߼zqu\xk\ l8fY$4>ߞkȺ1mds٣vs'i4#h0@\M,$ Dk4Z,,2.?#usKcnbBGr8@z4-W:uqN}p=_hW2?*ٍ :ujy<'؁trN/eiQ! Y' ^4Z[GbT?VZشI`iO!JUregdž%n=k7,.A[_ F%fmZa)6Ů6xT՟Q2RenGnK.Wx> \H5:dWǠ 8<ƮGe,:[ΆF}k;d"s`u9}]kt?Yv_Ho6`;v&}s!CYvԟ*u;d)C\(MR9SgcERCݽy7$^'PykȠ^`/L_fL?4^#PKت# ^歓ʶq^4Wؓc"^}!QHkwKω_ fq^_{p"44=g&$vRmSr9b}˫eio~ϒjOe'=fE'Uz9c X5=&Hy2y|YMɫUu^YMj:~PK&dH?^ sample.gdb/a00000007.gdbtablx= 0Eז߉8@ sW LhA `|=IdfJ_ǦYO ϬJũs)S9>PKeHCZ+Xsample.gdb/a00000009.freelist1 0 t7tnsdQ=>wPKdHpzCtsample.gdb/a00000009.gdbindexeseA ((З*w ]o vbdq<$~)Jԛ޽#mVћ PKeHXsample.gdb/a00000009.gdbtableSKHQ=qF0~]JkBHRh0HZK M+tnh7-;ōDA"*~Q=DEԵ1s?9^)l|tW`IŴnRE(DO.SA#4pFR|J#(Jܲ0* A"'I Dz@'ky)+CFi\<Ϣ\JO _rg ڏr3jPdlZKWmPRCBW֘ǜzZ. %gtagW ڣNN5#LNĊUI_yNA\;vg}"i"## mɸUcq֍ M ?ig^$>nW*ZD74Gݭ\IgY&kiQut%x*j=JU=v[|Zknq|WG\hnX߸=s;l -=ƷZb ƗFhPKeH# sample.gdb/a00000009.gdbtablxÁ ClmxL!mґ^g5PKeHUh&.sample.gdb/a00000009.spxű CA*eF(?_62=x{ePK &dH./sample.gdb/gdbPKeH.ADsample.gdb/timestampsű G-a VB\Hr}S PK?eH $sample.gdb/ C12C12WoPK?&dH˖Rn$ )sample.gdb/a00000001.gdbindexes goZoZoPK?dHj< e;$ sample.gdb/a00000001.gdbtable *IVx ox oPK?dHC $ sample.gdb/a00000001.gdbtablx IV3o3oPK?dHm<%$ 1sample.gdb/a00000001.TablesByName.atx HoO>oPK?&dH=ډ3$ Csample.gdb/a00000005.CatItemTypesByParentTypeID.atx oooPK?&dH11a+$ sample.gdb/a00000005.CatItemTypesByUUID.atx ]o5o5oPK?&dHݦw($ Tsample.gdb/a00000005.gdbindexes ژoXoXoPK?&dH8b $ sample.gdb/a00000005.gdbtable Fo1o1oPK?&dHN $ !sample.gdb/a00000005.gdbtablx »o1o1oPK?dHk_K/$ c"sample.gdb/a00000006.CatRelsByDestinationID.atx ҥYV o oPK?dH L*$ "sample.gdb/a00000006.CatRelsByOriginID.atx  YVrGorGoPK?dH K&$ #sample.gdb/a00000006.CatRelsByType.atx ZVICoICoPK?dH( K!$ $sample.gdb/a00000006.FDO_UUID.atx XVooPK?&dH>$ $sample.gdb/a00000006.gdbindexes -oooPK?dH$ f%sample.gdb/a00000006.gdbtable  WVroroPK?dHOsJ" $ &sample.gdb/a00000006.gdbtablx MmXVroroPK?&dHN9N3$ &sample.gdb/a00000007.CatRelTypesByBackwardLabel.atx oDHoDHoPK?&dH  )4$ |(sample.gdb/a00000007.CatRelTypesByDestItemTypeID.atx s8o*o*oPK?&dH掎 2$ )sample.gdb/a00000007.CatRelTypesByForwardLabel.atx lo]o]oPK?&dH%knS*$ P+sample.gdb/a00000007.CatRelTypesByName.atx )oooPK?&dHT!6$ ,sample.gdb/a00000007.CatRelTypesByOriginItemTypeID.atx {oŨoŨoPK?&dH8ﺹ*$ .sample.gdb/a00000007.CatRelTypesByUUID.atx @o)o)oPK?&dHdZ$ 0sample.gdb/a00000007.gdbindexes AototoPK?&dH9% $ 1sample.gdb/a00000007.gdbtable 5ocۧocۧoPK?&dH?^ $ *7sample.gdb/a00000007.gdbtablx NocۧocۧoPK?eHCZ+X$ 7sample.gdb/a00000009.freelist u1llPK?dHpzCt$ )8sample.gdb/a00000009.gdbindexes HVDVDVPK?eHX$ 8sample.gdb/a00000009.gdbtable wٺ1HDVHDVPK?eH# $ :sample.gdb/a00000009.gdbtablx 1oDVoDVPK?eHUh&.$ B;sample.gdb/a00000009.spx ʜ1FVFVPK? &dH./$ ;sample.gdb/gdb WoWoWoPK?eH.AD$ ;sample.gdb/timestamps C12gogoPK..(<gdalautotest-3.0.4/ogr/data/lambert93_francais.DAT0000644003401500001440000000010213614004466021327 0ustar rouaultusersr A fooC gdalautotest-3.0.4/ogr/data/empty.mdb0000644003401500001440000030000013614004466017147 0ustar rouaultusersStandard Jet DBnb` Ugr@?~1y0̝cßFNyo7М9("`{6 ߱`C0;3y[m!|*|=U靡f_Љ$g'DeFx -bT4.0dv YS  Y   Y Y  Y Y  Y  Y  Y   Y  Y  Y  Y  Y 2Y  Y   Y  Y ConnectDatabaseDateCreateDateUpdate FlagsForeignNameIdLvLvExtraLvModule LvPropName OwnerParentIdRmtInfoLongRmtInfoShortTypeYYIdParentIdName        OY4SY Y Y  Y 2ACMFInheritableObjectIdSID  AtYObjectId YSY  Y Y Y  Y  Y Y  Y AttributeExpressionFlagLvExtra Name1 Name2ObjectId Ordernzf edY"ObjectIdAttribute -YSY Y Y  Y  Y  Y  Y  Y ccolumn grbiticolumnszColumnszObject$szReferencedColumn$szReferencedObjectszRelationship  MSn YYYszObject$szReferencedObjectszRelationshipYv1b N  : k & W  C t/  @@@@   @ OJmJJMMQkkfJUQkOJmJLJkQkSdi`k `dOo^Qk iQ^JmYdbkWYfkiQfdimk kMiYfmk kvkiQ^ mJL^Qk`kvkJMMQkkdL[QMmk`kvkJMQk`kvkdL[QMmk`kvkhoQiYQk`kvkiQ^JmYdbkWYfkJMMQkk^Jvdom`kvkOLko``JivYbSdokQiOQSYbQO~  @ @     L  @ @ @ @ @ @    $%+,-)*./0123&'(  !"#     d _ Z g  ~  r}@r}@MSysAccessObjects3DDDDDDDDDDB  s.ő@s.ő@UserDefined3A@DDD88888886 @ s.ő@s.ő@SummaryInfo3@DDD88888886 @ Tm@P}@AccessLayout34MR2KeepLocal T@zz:::::::8 @s.ő@s.ő@SysRel3.........., s.ő@s.ő@Scripts30000000000. s.ő@s.ő@Reports30000000000. s.ő@s.ő@Modules30000000000. s.ő@s.ő@Forms3,,,,,,,,,,* s.ő@s.ő@DataAccessPages3@@@@@@@@@@> >ő@>ő@MSysRelationships1DDDDDDDDDDB >ő@>ő@MSysQueries188888888886 >ő@>ő@MSysACEs122222222220 >ő@>ő@MSysObjects188888888886 >ő@>ő@MSysDb3\@:::......., @>ő@>ő@Relationships1<<<<<<<<<<: >ő@>ő@Databases144444444442 >ő@>ő@Tables1..........,  Yl NY Y DataIDYAOIndexv1K[wSysAccessObjects_LLLLLLLLLLJ [| | e}SH|| j}u}@t} x}g}ph}u}@i}f}f}j}`w}v}q}ps}r}q}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||`{}pz}x}y}P8|MSysObjectsXJ_`      K[ࡱ>   Root Entry p-K VBAp-Kp-KVBAProjectp-Kp-KVBAp-Kp-Kdir_VBA_PROJECTPROJECT&"PROJECTwm+  !"#$%'()*~0* pHd empty @8= Vh 8@"B J< rstdole>stdole f%\*\G{00020430-C 0046}#2.0#0#C:\WINNT\system32\STDOLE2.TLB# Automation^ADODB> ADOՀBCCD1C10-8CAA006D2EA4C1CProgram Files\Commo nSM\ado\ms21.tlb#Microsoft ActiveX Data Objects 2.1 Li`braryH am  *\G{000204EF-0000-0000-C000-000000000046}#4.0#9#C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA6\VBE6.DLL#Visual Basic For Applications*\G{4AFFC9A0-5F99-101B-AF4E-00AA003F0F07}#9.0#0#C:\Program Files\Microsoft Office\Office\MSACC9.OLB#Microsoft Access 9.0 Object Library*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\system32\STDOLE2.TLB#OLE Automation*\G{00000201-0000-0010-8000-00AA006D2EA4}#2.1#0#C:\Program Files\Common Files\System\ado\msado21.tlb#K[Microsoft ActiveX Data Objects 2.1 Library8"Bx $AccessFemptyVBAWin16~Win32MacVBA6#Project1 stdole`ADODBs<  ID="{2BA67D01-E4C2-4D2C-AC6E-8F2A245485B4}" Name="empty" HelpContextID="0" VersionCompatible32="393222000" CMG="EEEC1E32E2CED4D2D4D2D4D2D4D2" DPB="DCDE2C20F40FF50FF50F" GC="CAC83A5629572957D6" [Host Extender Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 ijMSysDbAcessVBAData,Forms  p-Kp-KCmdbarsp-Kp-KModules p-Kp-KReportsp-Kp-KScripts p-Kp-KPropData-Databasesp-Kp-K0p-Kp-KBlob DirData.CustomGroupsp-Kp-KDataAccessPages p-Kp-K64vcP=*z @ -  } j C 0  m Z G p\I63 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 TFgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 TFgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 6 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 6 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 3 6 3 FgqgױvfQҝMK9Rf [}ݳe<%j4WP0,5U?϶p`t{{_[~7p 3 .LVAL>ʾCreate table in Design view f^3LVALMR2( ReplicateProject MR20 Title AuthorCompanyn test Rob Di Marco2 *Health Market ScienceMR2.AccessVersion Build* 08.50 gdalautotest-3.0.4/ogr/data/paris_typical_strike_demonstration.xml0000644003401500001440000003142513614005357025255 0ustar rouaultusers PT37M46S 2.3625946 48.8484780 2.3967289 48.8677839 2.3625946 48.8677839 2.3625945889249986 48.86778388120352 2.3632955 48.8673709 2.3634617 48.8672685 2.3636857 48.8671902 2.3637854 48.8671301 2.3646819 48.8666156 2.3649109 48.8665827 2.3651848 48.8666983 2.3663243 48.8660206 2.3670735 48.8655749 2.3677434 48.8651764 2.3680899 48.8649702 2.369006 48.8644249 2.3691022 48.8643676 2.3701011 48.863773 2.3712963 48.8630498 2.3715675 48.8628975 2.3716926 48.8628206 2.3724845 48.8623541 2.3726003 48.8622864 2.3729486 48.8620736 2.3747721 48.8609865 2.3752786 48.8606752 2.3754491 48.8605734 2.3768495 48.8597508 2.3785832 48.8587163 2.3792805 48.8583074 2.3795299 48.8581612 2.3797982 48.8579988 2.3799807 48.8578795 2.3800554 48.8578469 2.3800374 48.8577898 2.3800504 48.8577321 2.3800807 48.8576914 2.3801382 48.8576513 2.380217 48.8576246 2.3803255 48.8576185 2.3803954 48.8576313 2.3805769 48.8575289 2.3807109 48.857476 2.3817008 48.85687 2.3822292 48.8565466 2.3828179 48.8561988 2.3833463 48.8558851 2.3838503 48.8555562 2.3842279 48.8553374 2.384278 48.8553115 2.3853203 48.8546798 2.3877226 48.8532477 2.3885223 48.852771 2.3886124 48.8527172 2.3890806 48.8524381 2.3891474 48.8523983 2.3896875 48.8520763 2.3898715 48.8519666 2.3905195 48.8515803 2.3921925 48.8505829 2.3925259 48.8503841 2.3947154 48.8490817 2.3952701 48.8487526 2.3954284 48.8488449 2.3955854 48.8489004 2.3958363 48.8489397 2.3960575 48.8489322 2.3963001 48.8488763 2.3964707 48.8487972 2.3965338 48.8487552 2.3966841 48.8485964 2.3967289383112758 48.848478014510334 2.3967289 48.848478 Votre point de départ est : (Southeast) sur Place de la République 2.3625946 48.8677839 2.3625945889249986 48.86778388120352 2.3632955 48.8673709 2.3634617 48.8672685 Suivez à pied à moitié à gauche sur Place de la République 2.3634617 48.8672685 2.3636857 48.8671902 2.3637854 48.8671301 2.3646819 48.8666156 2.3649109 48.8665827 Suivez à pied à gauche sur Place de la République 2.3649109 48.8665827 2.3651848 48.8666983 Suivez à pied à droite sur Boulevard Voltaire 2.3651848 48.8666983 2.3663243 48.8660206 2.3670735 48.8655749 2.3677434 48.8651764 2.3680899 48.8649702 2.369006 48.8644249 2.3691022 48.8643676 2.3701011 48.863773 2.3712963 48.8630498 2.3715675 48.8628975 2.3716926 48.8628206 2.3724845 48.8623541 2.3726003 48.8622864 2.3729486 48.8620736 2.3747721 48.8609865 2.3752786 48.8606752 2.3754491 48.8605734 2.3768495 48.8597508 2.3785832 48.8587163 2.3792805 48.8583074 2.3795299 48.8581612 2.3797982 48.8579988 2.3799807 48.8578795 2.3800554 48.8578469 Suivez à pied à droite sur Place Voltaire 2.3800554 48.8578469 2.3800374 48.8577898 2.3800504 48.8577321 2.3800807 48.8576914 2.3801382 48.8576513 2.380217 48.8576246 2.3803255 48.8576185 2.3803954 48.8576313 Suivez à pied à droite sur Boulevard Voltaire 2.3803954 48.8576313 2.3805769 48.8575289 2.3807109 48.857476 2.3817008 48.85687 2.3822292 48.8565466 2.3828179 48.8561988 2.3833463 48.8558851 2.3838503 48.8555562 2.3842279 48.8553374 2.384278 48.8553115 2.3853203 48.8546798 2.3877226 48.8532477 2.3885223 48.852771 2.3886124 48.8527172 2.3890806 48.8524381 2.3891474 48.8523983 2.3896875 48.8520763 2.3898715 48.8519666 2.3905195 48.8515803 2.3921925 48.8505829 2.3925259 48.8503841 2.3947154 48.8490817 2.3952701 48.8487526 Suivez à pied à gauche sur Place de la Nation 2.3952701 48.8487526 2.3954284 48.8488449 2.3955854 48.8489004 2.3958363 48.8489397 2.3960575 48.8489322 Suivez à pied à moitié à droite sur Place de la Nation 2.3960575 48.8489322 2.3963001 48.8488763 2.3964707 48.8487972 2.3965338 48.8487552 Suivez à pied à moitié à droite - Vous êtes arrivé à votre but ! 2.3965338 48.8487552 2.3966841 48.8485964 2.3967289383112758 48.848478014510334 2.3967289 48.848478 gdalautotest-3.0.4/ogr/data/ogr_gml_56.gml0000644003401500001440000000367313614004466020006 0ustar rouaultusers 0 0 1 1 0 0,0 1,1 1,1 0,0 0 10 10 bar baz gdalautotest-3.0.4/ogr/data/CoHI_GCS12_README.txt0000644003401500001440000000666513614004466020550 0ustar rouaultusersU.S. Census of Agriculture County-Level Boundaries: CoGenAll_GCS12 contains U.S. Census of Agriculture county-level boundaries for the continental U.S., Alaska, Puerto Rico and Hawaii. U.S. Census of Agriculture State-Level Boundaries: StGenAll_GCS12 contains U.S. state-level boundaries for the continental U.S., Alaska, Puerto Rico and Hawaii. U.S. Census of Agriculture State-Level and County-Level Boundaries: StCoGenAll_GCS12 contains U.S. state-level and county-level boundaries for the continental U.S., Alaska, Puerto Rico and Hawaii. Purpose: County-level and state-level boundary files are provided to be used with the statistical data in the 2012 Census of Agriculture, Volume 1. The boundary files can be employed in a Geographic Information System (GIS) with the 2012 Agricultural Census Statistical data by using the Agricultural Census county codes to associate the county-level spatial entities with the county-level statistical data and the Agricultural Census state codes to associate the state-level spatial entities with the state-level statistical data. The statistical data can be obtained from the NASS census website (http://www.agcensus.usda.gov/). GIS software must be provided by the user in order to use the county-level and state-level boundary files. Source: The files were created from boundaries provided by the U.S. Census Bureau with a vintage year of 2012. County and state areas are for land area (excludes water) and were provided by the U.S. Census Bureau with a vintage year of 2012. Modifications were made to the County and State boundary files to show geographic areas for which the 2012 Agricultural Census Statistics are reported at the county- and state-levels. Format: The boundary files are provided in an ESRI shapefile format. The shapefile format can be used with ESRI software(ArcView/ArcGIS) or if available, a translator can be used to import into other GIS software. On Unix it may be necessary to use lower case for shapefile names. Coordinate System: The datum is NAD 83 and the files are unprojected (GCS - Geographic Coordinate System - latitude and longitude decimal degrees). U.S. Census of Agriculture County-Level Boundaries - Continental U.S.: CoUS_GCS12.dbf CoUS_GCS12.prj CoUS_GCS12.sbn CoUS_GCS12.sbx CoUS_GCS12.shp CoUS_GCS12.shx Alaska: CoAK_GCS12.dbf CoAK_GCS12.prj CoAK_GCS12.sbn CoAK_GCS12.sbx CoAK_GCS12.shp CoAK_GCS12.shx Hawaii: CoHI_GCS12.dbf CoHI_GCS12.prj CoHI_GCS12.sbn CoHI_GCS12.sbx CoHI_GCS12.shp CoHI_GCS12.shx Puerto Rico: CoPR_GCS12.dbf CoPR_GCS12.prj CoPR_GCS12.sbn CoPR_GCS12.sbx CoPR_GCS12.shp CoPR_GCS12.shx U.S. Census of Agriculture State-Level Boundaries - Continental U.S.: StUS_GCS12.dbf StUS_GCS12.prj StUS_GCS12.sbn StUS_GCS12.sbx StUS_GCS12.shp StUS_GCS12.shx Alaska: StAK_GCS12.dbf StAK_GCS12.prj StAK_GCS12.sbn StAK_GCS12.sbx StAK_GCS12.shp StAK_GCS12.shx Hawaii: StHI_GCS12.dbf StHI_GCS12.prj StHI_GCS12.sbn StHI_GCS12.sbx StHI_GCS12.shp StHI_GCS12.shx Puerto Rico: StPR_GCS12.dbf StPR_GCS12.prj StPR_GCS12.sbn StPR_GCS12.sbx StPR_GCS12.shp StPR_GCS12.shx Text metadata files for the boundary files are also provided - U.S. Census of Agriculture County-Level Boundary metadata: ag_co_metadata_12.txt, ag_co_metadata_faq_12.html U.S. Census of Agriculture State-Level Boundary metadata: ag_st_metadata_12.txt, ag_st_metadata_faq_12.html gdalautotest-3.0.4/ogr/data/spline_qcad.dxf0000644003401500001440000002604413614004466020327 0ustar rouaultusers999 dxflib 2.0.4.8 0 SECTION 2 HEADER 9 $ACADVER 1 AC1015 9 $HANDSEED 5 FFFF 9 $DIMASZ 40 2.5 9 $DIMGAP 40 0.625 9 $DIMEXO 40 0.625 9 $INSUNITS 70 4 9 $DIMTXT 40 2.5 9 $PLIMMAX 10 210.0 20 297.0 9 $PLIMMIN 10 0.0 20 0.0 9 $DIMEXE 40 1.25 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 8 100 AcDbSymbolTable 70 1 0 VPORT 5 30 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *Active 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 286.3055555555554861 22 148.5 13 0.0 23 0.0 14 10.0 24 10.0 15 10.0 25 10.0 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 297.0 41 1.92798353909465 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 100 73 1 74 3 75 1 76 1 77 0 78 0 281 0 65 1 110 0.0 120 0.0 130 0.0 111 1.0 121 0.0 131 0.0 112 0.0 122 1.0 132 0.0 79 0 146 0.0 0 ENDTAB 0 TABLE 2 LTYPE 5 5 100 AcDbSymbolTable 70 21 0 LTYPE 5 14 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 15 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 16 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 LTYPE 5 31 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT 70 0 3 Dot . . . . . . . . . . . . . . . . . . . . . . 72 65 73 2 40 6.3499999999999996 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 32 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOT2 70 0 3 Dot (.5x) ..................................... 72 65 73 2 40 3.1749999999999998 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 33 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DOTX2 70 0 3 Dot (2x) . . . . . . . . . . . . . 72 65 73 2 40 12.6999999999999993 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 34 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED 70 0 3 Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ 72 65 73 2 40 19.0500000000000007 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 35 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHED2 70 0 3 Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 72 65 73 2 40 9.5250000000000004 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 36 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHEDX2 70 0 3 Dashed (2x) ____ ____ ____ ____ ____ ___ 72 65 73 2 40 38.1000000000000014 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 37 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT 70 0 3 Dash dot __ . __ . __ . __ . __ . __ . __ . __ 72 65 73 4 40 25.3999999999999986 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 38 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOT2 70 0 3 Dash dot (.5x) _._._._._._._._._._._._._._._. 72 65 73 4 40 12.6999999999999993 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 39 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DASHDOTX2 70 0 3 Dash dot (2x) ____ . ____ . ____ . ___ 72 65 73 4 40 50.7999999999999972 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3A 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE 70 0 3 Divide ____ . . ____ . . ____ . . ____ . . ____ 72 65 73 6 40 31.75 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3B 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDE2 70 0 3 Divide (.5x) __..__..__..__..__..__..__..__.._ 72 65 73 6 40 15.875 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3C 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 DIVIDEX2 70 0 3 Divide (2x) ________ . . ________ . . _ 72 65 73 6 40 63.5 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 3D 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER 70 0 3 Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ 72 65 73 4 40 50.7999999999999972 49 31.75 74 0 49 -6.3499999999999996 74 0 49 6.3499999999999996 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 3E 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTER2 70 0 3 Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ 72 65 73 4 40 28.5749999999999993 49 19.0500000000000007 74 0 49 -3.1749999999999998 74 0 49 3.1749999999999998 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 3F 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 CENTERX2 70 0 3 Center (2x) ________ __ ________ __ _____ 72 65 73 4 40 101.5999999999999943 49 63.5 74 0 49 -12.6999999999999993 74 0 49 12.6999999999999993 74 0 49 -12.6999999999999993 74 0 0 LTYPE 5 40 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER 70 0 3 Border __ __ . __ __ . __ __ . __ __ . __ __ . 72 65 73 6 40 44.4500000000000028 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 12.6999999999999993 74 0 49 -6.3499999999999996 74 0 49 0.0 74 0 49 -6.3499999999999996 74 0 0 LTYPE 5 41 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDER2 70 0 3 Border (.5x) __.__.__.__.__.__.__.__.__.__.__. 72 65 73 6 40 22.2250000000000014 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 6.3499999999999996 74 0 49 -3.1749999999999998 74 0 49 0.0 74 0 49 -3.1749999999999998 74 0 0 LTYPE 5 42 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 BORDERX2 70 0 3 Border (2x) ____ ____ . ____ ____ . ___ 72 65 73 6 40 88.9000000000000057 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 25.3999999999999986 74 0 49 -12.6999999999999993 74 0 49 0.0 74 0 49 -12.6999999999999993 74 0 0 ENDTAB 0 TABLE 2 LAYER 5 2 100 AcDbSymbolTable 70 1 0 LAYER 5 10 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 0 390 F 0 ENDTAB 0 TABLE 2 STYLE 5 3 100 AcDbSymbolTable 70 1 0 STYLE 5 11 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 Standard 70 0 40 0.0 41 0.75 50 0.0 71 0 42 2.5 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 5 6 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 UCS 5 7 100 AcDbSymbolTable 70 0 0 ENDTAB 0 TABLE 2 APPID 5 9 100 AcDbSymbolTable 70 1 0 APPID 5 12 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 A 100 AcDbSymbolTable 70 1 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 27 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 Standard 41 2.5 42 0.625 43 3.75 44 1.25 70 0 73 0 74 0 77 1 78 8 140 2.5 141 2.5 143 0.03937007874016 147 0.625 171 3 172 1 271 2 272 2 274 3 278 44 283 0 284 8 340 11 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 1 100 AcDbSymbolTable 70 1 0 BLOCK_RECORD 5 1F 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 22 0 BLOCK_RECORD 5 1B 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 1E 0 BLOCK_RECORD 5 23 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space0 340 26 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 20 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 21 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 1C 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 1D 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 BLOCK 5 24 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Paper_Space0 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space0 1 0 ENDBLK 5 25 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 SPLINE 5 43 8 0 62 256 370 -1 6 ByLayer 100 AcDbEntity 100 AcDbSpline 70 8 71 3 72 12 73 8 74 0 40 0.0 40 0.0 40 0.0 40 0.0 40 0.2 40 0.4 40 0.6000000000000001 40 0.8 40 1.0 40 1.0 40 1.0 40 1.0 10 10.75 20 62.75 30 0.0 10 55.0 20 67.25 30 0.0 10 73.5 20 34.0 30 0.0 10 52.25 20 8.5 30 0.0 10 95.0 20 8.25 30 0.0 10 95.0 20 8.25 30 0.0 10 93.0 20 65.5 30 0.0 10 57.25 20 85.5 30 0.0 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 C 100 AcDbDictionary 280 0 281 1 3 ACAD_GROUP 350 D 3 ACAD_LAYOUT 350 1A 3 ACAD_MLINESTYLE 350 17 3 ACAD_PLOTSETTINGS 350 19 3 ACAD_PLOTSTYLENAME 350 E 3 AcDbVariableDictionary 350 44 0 DICTIONARY 5 D 100 AcDbDictionary 280 0 281 1 0 ACDBDICTIONARYWDFLT 5 E 100 AcDbDictionary 281 1 3 Normal 350 F 100 AcDbDictionaryWithDefault 340 F 0 ACDBPLACEHOLDER 5 F 0 DICTIONARY 5 17 100 AcDbDictionary 280 0 281 1 3 Standard 350 18 0 MLINESTYLE 5 18 100 AcDbMlineStyle 2 STANDARD 70 0 3 62 256 51 90.0 52 90.0 71 2 49 0.5 62 256 6 BYLAYER 49 -0.5 62 256 6 BYLAYER 0 DICTIONARY 5 19 100 AcDbDictionary 280 0 281 1 0 DICTIONARY 5 1A 100 AcDbDictionary 281 1 3 Layout1 350 1E 3 Layout2 350 26 3 Model 350 22 0 LAYOUT 5 1E 100 AcDbPlotSettings 1 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout1 70 1 71 1 10 0.0 20 0.0 11 420.0 21 297.0 12 0.0 22 0.0 32 0.0 14 100000000000000000000.0 24 100000000000000000000.0 34 100000000000000000000.0 15 -100000000000000000000.0 25 -100000000000000000000.0 35 -100000000000000000000.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1B 0 LAYOUT 5 22 100 AcDbPlotSettings 1 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 1712 72 0 73 0 74 0 7 75 0 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Model 70 1 71 0 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 1F 0 LAYOUT 5 26 100 AcDbPlotSettings 1 4 6 40 0.0 41 0.0 42 0.0 43 0.0 44 0.0 45 0.0 46 0.0 47 0.0 48 0.0 49 0.0 140 0.0 141 0.0 142 1.0 143 1.0 70 688 72 0 73 0 74 5 7 75 16 147 1.0 148 0.0 149 0.0 100 AcDbLayout 1 Layout2 70 1 71 2 10 0.0 20 0.0 11 12.0 21 9.0 12 0.0 22 0.0 32 0.0 14 0.0 24 0.0 34 0.0 15 0.0 25 0.0 35 0.0 146 0.0 13 0.0 23 0.0 33 0.0 16 1.0 26 0.0 36 0.0 17 0.0 27 1.0 37 0.0 76 0 330 23 0 DICTIONARY 5 44 100 AcDbDictionary 281 1 3 DIMASSOC 350 46 3 HIDETEXT 350 45 0 DICTIONARYVAR 5 45 100 DictionaryVariables 280 0 1 2 0 DICTIONARYVAR 5 46 100 DictionaryVariables 280 0 1 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/emptymultipoint.dbf0000644003401500001440000000025113614004466021272 0ustar rouaultusers_aHFIDN NAMEC< 1 MultiPoint 1 gdalautotest-3.0.4/ogr/data/vm2alv2_texash/0000755003401500001440000000000013614004470020174 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/0000755003401500001440000000000013614004470021470 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/cat0000755003401500001440000000120113614004470022157 0ustar rouaultusersL;Coverage Attribute (Description) Table;-;id=I,1,P,Row Identifier,-,-,-,:coverage_name=T,8,N,Coverage name,-,-,-,:description=T,24,N,Coverage description,-,-,-,:level=I,1,N,Topology level,-,-,-,:;libref Library Reference tileref Tile Reference bnd Boundaries elev Elevation hydro Hydrography ind Industry phys Physiography pop Population  trans Transportation  util Utilities  veg Vegetation gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/dqx0000755003401500001440000000002013614004470022202 0ustar rouaultusersKKgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/grt0000755003401500001440000000133513614004470022214 0ustar rouaultusersDL;Geographic Reference Table;-;id=I,1,P,Row Identifier,-,-,-,:data_type=T,3,N,Data Type,-,-,-,:units=T,3,N,Units of Measure Code for Library,-,-,-,:ellipsoid_name=T,15,N,Ellipsoid,-,-,-,:ellipsoid_detail=T,50,N,Ellipsoid Details,-,-,-,:vert_datum_name=T,15,N,Datum Vertical Reference,-,-,-,:vert_datum_code=T,3,N,Vertical Datum Code,-,-,-,:sound_datum_name=T,15,N,Sounding Datum,-,-,-,:sound_datum_code=T,3,N,Sounding Datum Code,-,-,-,:geo_datum_name=T,15,N,Datum Geodetic Name,-,-,-,:geo_datum_code=T,3,N,Datum Geodetic Code,-,-,-,:projection_name=T,20,N,Projection Name,-,-,-,:;GEOM WGS 84 A=6378137 B=6356752 Meters MEAN SEA LEVEL 015NA NA WGS 84 WGEN/A gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/0000755003401500001440000000000013614004470023122 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/nsi0000755003401500001440000000007013614004470023636 0ustar rouaultusers']A&ZAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/tilereft.tft0000755003401500001440000000024113614004470025457 0ustar rouaultusersL;Tile Reference Text Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:tile_name=T,8,N,Tile Name,-,-,-,:txt_id=I,1,N,Text Primitive ID,-,-,-,:; FJHB150gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/esi0000755003401500001440000000022013614004470023622 0ustar rouaultusers ']A&ZA8TT TU U U UTgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/cnd0000755003401500001440000000063713614004470023622 0ustar rouaultusersL;Connected Node Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:first_edge=I,1,N,Foreign Key to Edge Table,-,-,-,:coordinate=Z,1,N,Coordinates of Connected Node,-,-,-,:;'ZAUZA*ZA&ZA&`VA'_VA&ZA'XA &_A U^A *^A ']Agdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fcs0000755003401500001440000000077613614004470023635 0ustar rouaultusers"L;Tile Reference Feature Class Schema Table;-;id=I,1,P,Row ID,-,-,-,:feature_class=T,8,N,Name of Feature Class,-,-,-,:table1=T,12,N,First Table,-,-,-,:table1_key=T,16,N,Column Name in First Table,-,-,-,:table2=T,12,N,Second Table,-,-,-,:table2_key=T,2,N,Column Name in Second Table,-,-,-,:;tileref tileref.aft fac_id fac idtileref fac tileref.aft_id tileref.aft idtilerefttilereft.tfttxt_id txt idtilerefttxt tilereft.tft_id tilereft.tftidgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/edg0000755003401500001440000000163513614004470023614 0ustar rouaultusersYL;Edge Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:start_node=I,1,N,Start/Left Node,-,-,-,:end_node=I,1,N,End/Right Node,-,-,-,:right_face=K,1,N,Right Face,-,-,-,:left_face=K,1,N,Left Face,-,-,-,:right_edge=K,1,N,Right Edge from End Node,-,-,-,:left_edge=K,1,N,Left Edge from Start Node,-,-,-,:coordinates=Z,*,N,Coordinates of Edge,-,-,-,:;@@@@'ZAUZA@@@@UZA*ZA@@@@*ZA&ZA@@@@&ZA&`VA@@@@'ZA'_VA@@@@&`VA&ZA@@@ @'_VA'XA @@@ @&ZA&_A @@@@ *^A&_A @@@ @ U^A*^A @@@ @ ']AU^A  @@@ @'XA']Agdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fsi0000755003401500001440000000006013614004470023625 0ustar rouaultusers']A&ZAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/txt0000755003401500001440000000036413614004470023672 0ustar rouaultusersL;Text Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:tilereft.tft_id=I,1,N,Tile Reference Text Feature Table ID,-,-,-,:string=T,*,N,Text String,-,-,-,:shape_line=C,*,N,Shape of Text String,-,-,-,:;FJHB1500[ŸA[ŸAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fcx0000755003401500001440000000003013614004470023621 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/ebr0000755003401500001440000000070513614004470023622 0ustar rouaultusersL;EBR, Edge Bounding Rectangle Table;-;id=I,1,P,Row ID,-,-,:xmin=F,1,N,Minimum X Coordinate,-,-,:ymin=F,1,N,Minimum Y Coordinate,-,-,:xmax=F,1,N,Maximum X Coordinate,-,-,:ymax=F,1,N,Maximum Y Coordinate,-,-,:;'ZAUZAUZA*ZA*ZA&ZA&`VA&ZA'_VA'ZA&ZA&`VA'XA'_VA&_A&ZA *^A&_A U^A*^A ']AU^A ']A'XAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/rng0000755003401500001440000000024313614004470023635 0ustar rouaultusersL;RNG, Ring Table;-;id=I,1,P,Row ID,-,-,:face_id=I,1,N,Foreign key to face table,-,-,:start_edge=I,1,N,Foreign Key to edge table,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fca0000755003401500001440000000037613614004470023607 0ustar rouaultusersL;Tile Reference Feature Class Attribute Table;-;id=I,1,P,Row ID,-,-,-,:fclass=T,8,U,Feature Class Name,-,-,-,:type=T,1,N,Feature Class Type,-,-,-,:descr=T,*,N,Feature Class Description,-,-,-,:;tileref A Tile ExtentstilereftT Tile Namesgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/tsi0000755003401500001440000000007013614004470023644 0ustar rouaultusers']A&ZAHeIfgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fbr0000755003401500001440000000037513614004470023626 0ustar rouaultusersL;FBR, Face Bounding Rectangle Table;-;id=I,1,P,Row ID,-,-,:xmin=F,1,N,Minimum X Coordinate,-,-,:ymin=F,1,N,Minimum Y Coordinate,-,-,:xmax=F,1,N,Maximum X Coordinate,-,-,:ymax=F,1,N,Maximum Y Coordinate,-,-,:;&]A&ZAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/txx0000755003401500001440000000002013614004470023663 0ustar rouaultusers(gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/fac0000755003401500001440000000026713614004470023606 0ustar rouaultusersL;Face Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:tileref.aft_id=I,1,N,Area Feature Table ID,-,-,-,:ring_ptr=I,1,N,Foreign Key to Ring Table,-,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/tileref.aft0000755003401500001440000000027213614004470025254 0ustar rouaultusersL;Tile Reference Area Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:tile_name=T,13,N,VMap Library Tile Path Name,-,-,-,:fac_id=I,1,N,Face Primitive ID,-,-,-,:;F/J/HB/1500  gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/tileref/edx0000755003401500001440000000015013614004470023624 0ustar rouaultusers ]]00000M0}000 0=0m0gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/0000755003401500001440000000000013614004470022233 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/tile1_id.ati0000755003401500001440000000012213614004470024422 0ustar rouaultusersFISSpolbnda.aft TILE_ID SFgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/markersp.pfx0000755003401500001440000000051013614004470024575 0ustar rouaultusers(``x 8Ph(@Xp0H`xgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/fcx0000755003401500001440000000007013614004470022736 0ustar rouaultusers%1D%i'gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/polbndl.lft0000755003401500001440000000106413614004470024400 0ustar rouaultusersL;Political Boundary Line Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:f_code=T,5,N,FACC Feature Code,char.vdt,f_code3.lti,-,:acc=S,1,N,Accuracy Category,int.vdt,-,-,:bst=S,1,N,Boundary Status Type,int.vdt,-,-,:nm3=T,*,N,Name 3,char.vdt,-,-,:nm4=T,*,N,Name 4,char.vdt,-,-,:txt=T,*,N,Text Attribute,char.vdt,-,-,:use=S,1,N,Usage,int.vdt,-,-,:tile_id=S,1,N,Tile Reference ID,-,tile3_id.lti,-,:edg_id=I,1,N,Edge Primitive ID,-,edg3_id.lti,-,:;FA000CORYELL COUNTY BELL COUNTY FA000CORYELL COUNTY BELL COUNTY gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/fca0000755003401500001440000000062013614004470022710 0ustar rouaultusersL;Boundaries Feature Class Attribute Table;-;id=I,1,P,Row Identifier,-,-,-,:fclass=T,8,U,Feature Class Name,-,-,-,:type=T,1,N,Feature Type,char.vdt,-,-,:descr=T,*,N,Description,-,-,-,:;markerspPMarkersbarrierlLBarrierspolbndl LPolitical BoundariesbndvoidaA Boundaries Void Collection Areaspolbnda AAdministrative Areasbndtxt TBoundary Coverage Textgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/end1_id.pti0000755003401500001440000000103413614004470024255 0ustar rouaultusers((TISmarkersp.pftEND_ID@S  !!""##$$%%&&''((gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/char.vdt0000755003401500001440000000317213614004470023675 0ustar rouaultusersL;Boundaries Character Value Description Table;-;id=I,1,P,Row Identifier,-,-,-,:table=T,12,N,Name of the Feature Table,-,-,-,:attribute=T,6,N,Column Name,-,-,-,:value=T,5,N,Unique Value of Attribute,-,-,-,:description=T,29,N,Description of Value,-,-,-,:;markersp.pftf_codeAL025Cairn markersp.pftf_codeZB030Boundary Monument markersp.pftf_codeZB035Control Point/Control Stationmarkersp.pftnam UNK No entry present for feature barrierl.lftf_codeAL070Fence barrierl.lftf_codeAL260Wall polbndl.lft f_codeFA000Administrative Boundary polbndl.lft f_codeFA020Armistice Line polbndl.lft f_codeFA030Cease-Fire Line polbndl.lft f_codeFA060De facto Boundary polbndl.lft f_codeFA110International Date Line polbndl.lft nm3 UNK No entry present for feature polbndl.lft nm4 UNK No entry present for feature polbndl.lft txt UNK No entry present for feature bndvoida.aftf_codeZD020Void Collection Area polbnda.aft f_codeFA001Administrative Area polbnda.aft f_codeFA070Demilitarized Zone polbnda.aft f_codeFA170Zone of Occupation polbnda.aft nam UNK No entry present for feature bndtxt.tft f_codeZD040Named Location bndtxt.tft f_codeZD045Text Description fca type A Area Feature fca type L Line Feature fca type P Point/Node Feature fca type T Text Feature gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/0000755003401500001440000000000013614004466022465 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/0000755003401500001440000000000013614004466022716 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/0000755003401500001440000000000013614004466023307 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/0000755003401500001440000000000013614004470023667 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/fbr0000755003401500001440000000054113614004470024366 0ustar rouaultusersL;FBR, Face Bounding Rectangle Table;-;id=I,1,P,Row ID,-,-,:xmin=F,1,N,Minimum X Coordinate,-,-,:ymin=F,1,N,Minimum Y Coordinate,-,-,:xmax=F,1,N,Maximum X Coordinate,-,-,:ymax=F,1,N,Maximum Y Coordinate,-,-,:;&3A#ZA'žAZA&]A&ZA&AJžA&qANA^%rAAAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/fac0000755003401500001440000000036313614004470024350 0ustar rouaultusersL;Face Primitive Table;-;id=I,1,P,Row Idenfifier,-,-,-,:polbnda.aft_id=I,1,N,Area Feature Table ID,-,-,-,:ring_ptr=I,1,N,Foreign Key to Ring Table,-,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/txx0000755003401500001440000000005013614004470024433 0ustar rouaultusers>;?>};gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/edx0000755003401500001440000000030013614004470024366 0ustar rouaultusers@4dgP@44##4W34g3T'44;4oo#d ,$-gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/rng0000755003401500001440000000033713614004470024406 0ustar rouaultusersL;RNG, Ring Table;-;id=I,1,P,Row ID,-,-,:face_id=I,1,N,Foreign key to face table,-,-,:start_edge=I,1,N,Foreign Key to edge table,-,-,:; gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/ebr0000755003401500001440000000124113614004470024363 0ustar rouaultusersL;EBR, Edge Bounding Rectangle Table;-;id=I,1,P,Row ID,-,-,:xmin=F,1,N,Minimum X Coordinate,-,-,:ymin=F,1,N,Minimum Y Coordinate,-,-,:xmax=F,1,N,Maximum X Coordinate,-,-,:ymax=F,1,N,Maximum Y Coordinate,-,-,:;UZA'ZA'ZAZA#žAZA'žA#ZA'_VAUZA'3A#žA'3A'_VA'A'3A eGANA OAOGA …AeA '…AA 5FAJžAOA!AUXAOAUXATA'A…A'A'A'XA'A^m{AWA~[%rAA5A'qA~[A']A&ZAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/end0000755003401500001440000000225213614004470024364 0ustar rouaultusersL;Entity Node Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:markersp.pft_id=I,1,N,Point Feature Table Identifier,-,-,-,:containing_face=I,1,N,Foreign Key to Face Table,-,-,-,:coordinate=Z,1,N,Coordinates of Entity Node,-,-,-,:;\i•A =A5vAg?OA(*`Ak AYnA!CA t²A vMA qiA HA ŞAh‚AzyAVucA-¡ZA#rb)A%%¼AcAA;AoV0A${A©vAJkAzCYjANw\Arw[AYAQNA a LA!!o@¨FA""X;FA##oDA$$A5A.A(A#žA@@@@'_VA'3A@@@ @'3A'A @@@ @ OGANxAPBAnR5ASoAS€AfTdATºAU© AU A(Vy A[Vš AV! AWiA+ZA^@Ac=AUeAeA @@@@OAOGA  @@@ @ eAgANhAimAi Aj–A(p{ At®Ahx°AyAz» A-|QAw}EA}²AkzA…A  @@@@'A…A  @@@@#žA#QA#A`#™A"ªA"mAK"2A"A!A|!½A3!‹A YA ¶A ŠAj RAg GA'!A2A{uADA)Av¼A´AA`AAwA8AAºA%OAA\²A%‰AhAOAAžAZAAA~~AX@AAA‹AzdAZJAzAuAKAAAYoA(AAAQA6AwAALA-£A ]A |Ai XA A AI +A ŽA[ A iAJ ȳAXA ´A& A šA§AAA0AaA۵A(–AEǶAQAAVA²A9Am=AA iA£AAA’A¨A¼AA׬AU,AxA A ¡A_ 5A ;A&¹AB¿AXAnARA ʣAu AI ³Aw A# "A>£A}AMأA“AA.AʠACA¼AQ8At¤AuABAfA²AqA,A0OAdJANA¸A AFA¢A}5AAAµAA EAr AT šA A A A` AA!^|AL~yAªyAUwA1uA*vA&wAJ^xA"'yA3yA`yA=wA tAB˜pATmA+lAnfAfAL©fA.dAcAJ_A^ fA ToA #nA »rA1 »oA fpA&pAypsAgrA.upAnAlA®mA lA hA dgA\ Š_A ]A w\A5 UA ¡UA wUA SUA# UA VA.¨\A«^A'³\AJVAŒRA *QANA3NAzšMADMAaQKA#"KAgKAKAX|LA ŒMA0 ?NAœJA`FA EA BA µ@A* >A¹@A(>A 6A3A\x/A4{/A/A0A¥/A& 0AX o1A 3A 4AQ 7AB kA™>AQ;A£GAfLANAEiQA4VA¢WA™YA}[A"^A_A,^A! `At!DcA!*jA"hA=#±jAq"ׁA#A$ƒyA$yA%sxA&A:)ˆAr)EA(RA[)±yA)4zA/.<}A#1ʀAb1ˆA:3؁A3ՆAj5ΈA5,A$5A6«A6A7VA98UA85A8µA;:%Ah:€A:|A9£A:A:‰A;PA%<°A]<As>4A> AI>Ab>‡A?gA?µAAAAABՠABACvAEAtEºAEMAFAE9AE–AEAEAEŒAEAC¡ACAC˜AC‹A+C“A}BjAAYA@:A@'A@jABA-CšA^C AMD/~ADŸ}AD}A|EQ|AE|AF¸{A5F{AE_zA>E„zAcD{ACxAQC{AByABxAFBxAB,{A\@~Ao@ A?A}=A;A-:¶A9Ÿ|A9{A9¿wA79wA8sA7nAL7½iA=5eA5šaA3^A~3bA1$bAA/³YA+vXAE,oUA8+SA+ªOA*†NAZ*ŒJA)=JA)GA*¸CAw*@A3)@A'H>A'£BA@'BA&‡=A)¦1A\(¡.A8'0A%0A#£(A"i,AU!.Az®+A`(A +A"¤)A5†&AN AA2XAU;AQAAA-AtAh6AAk¹A·A-Ad˜A‡AARlAuƒAA7?AAd AA0AFeA A{šA6#AA @@@ @ AA" A$A)¨Au-lA/›A0$AR3A5ŠA7A9}A(<,A =DAR=A@AgB!A}BA3CsAC AADAGnAF,A,J³AmL{AOGA @@@ @ UXAWŠA}UASASAfRAR®AVQœAPAAOAOA @@@@ UXAWKAVQAV†A@VAUAUATAdTSATA @@@@ …A'A@@@@'A'A@@@@'A'XA @@@@S~[m{A\8A] A7^8A^ A^A^EA^ŠA^A^nA^ŸA^A^;A^}A^¸A^A^TA^…A^ǟA^A^-A^WA^”A^½A^Az^0Ao^eAe^¡AU^AE^2A9^tA(^©A^٢A^A](A]QA]|A]¥A]ʣA]ɣAr]A[]AE](A3]AA]YA\eA\eA\wA\wA\vAs\vAY\A?\¥A#\¸A\½A[֤A[A[A[A}[A^[ AB[A-[A[/AZFAZjAZ“AZ¾AZ֥AZAnZA]ZAFZA'ZAYnAiX`AWAW˹AYA?ZAZ»AXRAUXA@@@@~[m{AY[zAO[zAH[zA=[zA*[zA~X'~AYXW~ADX]~A8Xh~AX†~AWž~AWª~AWª~AWª~AWª~AW˜~AW‹~AWs~AuW\~AeW+~A`W~AUW~AIW}A;W¿}A/W¡}A&W”}AWŽ}A`UA*T]AFRwAQ©uAQmuAQIuAQuAQtAQtAQ¿tAQ²tAzQštAO%rAN¥}ANS~AM¡~AM~AM%AMZAMsAM®AM!AMJAM¤AMAuMkAlM³AaMցA\MASMOARM‹APMقAPMAPM-APMdAPM“APMσANMANMNAJMŠAJM҄AEMACMPA@MŒA9M΅A2M A"M:AM|ALALAL`AL¨ALAL>AL‡ALÈALA|L4ApLRAeLŽA^L܉A\LAWLOAULrAPL£AMLيAKLAGL'ADLKA@L{A=LŸALŸALŸAK†AK]AK8AK AKAK݊AjK®AJKwA+J¦AHjAGŒAF¿AnF܍AED4ABA4BšAAABfAB/AAzAAΜA0B^ALBwAhBŽAB¿AB؝ABABAB,AC'AiCADCA-D A?D#ADD4APD:AcDSAwDYADeADxADxADxAD„AD~A E…AE…A/E…AFEAREsAbEsAuEgAEaAE[AEUAEJAE>AE8AF8AF\AFzA'F™A0FȔA9FA9FLAEšAEAE¬AEAEŢAEAE%AEIAEaAE€AFªAFA5F#AHF@A_FqAF‰AG¢A$IµAHAHAGSADGάAG»A H¦AJ‘AJA MBA)OAnO5AO AhP"ARoATA@@@@'A{RAyͦAlw AtAq©AolAvm±A.l/AkɖAk¶AkA3j¿AfA eh~Ad.uAcarAcqA`*vA$]uyA[{A~[m{A@@@@ 'XA']AU^A*^A&_A&ZA&`VA&ZAZAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/txt0000755003401500001440000000067013614004470024437 0ustar rouaultusersL;Text Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:bndtxt.tft_id=I,1,N,Boundaries Text Feature Table ID,-,-,-,:string=T,*,N,Text String,-,-,-,:shape_line=C,*,N,Shape of Text String,-,-,-,:;CORYELL COUNTY3A3A/œA+xA BELL COUNTY1A1A2.©A+rACORYELL COUNTYmg>fAmg>fA&coAR_ªvA BELL COUNTYedAedAbjA_nqAgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/fsi0000755003401500001440000000013013614004470024370 0ustar rouaultusers']A&ZAB8}g8cggdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/nsi0000755003401500001440000000072013614004470024405 0ustar rouaultusers(5viA•A (H  ]^ ,- ˼̽ױز('$%& uvefabJK:; !"#ij }~ABuv  HKILc4d5t4u5Z-[.S&T'{"|#!D"E#"&/0%)n*o,-gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/esi0000755003401500001440000000041013614004470024370 0ustar rouaultusers']A&ZA HHhhh`g{sg `za{ TV]4zc p5 p U8JWI8}cB=QgTWOfa{ObXg\qgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f/j/hb/1500/cnd0000755003401500001440000000102713614004470024361 0ustar rouaultusersL;Connected Node Primitive Table;-;id=I,1,P,Row Identifier,-,-,-,:first_edge=I,1,N,Foreign Key to Edge Table,-,-,-,:coordinate=Z,1,N,Coordinates of Connected Node,-,-,-,:;UZA'ZAZA#žA'_VA'3A'A eA OGA OA …A A UXATA'A'A'XA~[m{Agdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/polbnda.aft0000755003401500001440000000114413614004470024351 0ustar rouaultusersFL;Political Boundary Area Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:f_code=T,5,N,FACC Feature Code,char.vdt,f_code1.ati,-,:acc=S,1,N,Accuracy Category,int.vdt,-,-,:nam=T,*,N,Name,char.vdt,-,-,:use=S,1,N,Usage,int.vdt,-,-,:tile_id=S,1,N,Tile Reference ID,-,tile1_id.ati,-,:fac_id=I,1,N,Face Primitive ID,-,fac1_id.ati,-,:;FA001United States of AmericaFA001United States of AmericaFA001United States of AmericaFA001United States of AmericaFA001United States of AmericaFA001United States of Americagdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f_code1.ati0000755003401500001440000000012513614004470024233 0ustar rouaultusersITTSpolbnda.aft F_CODEH@SFA001Igdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/fac1_id.ati0000755003401500001440000000020413614004470024217 0ustar rouaultusersTISpolbnda.aft FAC_IDH@Sgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/edg.fit0000755003401500001440000000036613614004470023506 0ustar rouaultusersL;Feature Index Table;-;id=I,1,P,Row Identifier,-,-,-,:prim_id=I,1,N,Primitive ID,-,-,-,:tile_id=S,1,N,Tile Reference ID,-,-,-,:fc_id=I,1,N,Feature Class ID,-,-,-,:feature_id=I,1,N,Feature Table ID,-,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/end.fit0000755003401500001440000000164213614004470023513 0ustar rouaultusersL;Feature Index Table;-;id=I,1,P,Row Identifier,-,-,-,:prim_id=I,1,N,Primitive ID,-,-,-,:tile_id=S,1,N,Tile Reference ID,-,-,-,:fc_id=I,1,N,Feature Class ID,-,-,-,:feature_id=I,1,N,Feature Table ID,-,-,-,:;        !!!"""###$$$%%%&&&'''(((gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f_code3.lti0000755003401500001440000000011513614004470024247 0ustar rouaultusersITTSpolbndl.lft F_CODEH@SFA000Igdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/edg3_id.lti0000755003401500001440000000012413614004470024243 0ustar rouaultusersTTISpolbndl.lft EDG_IDH@Sgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/markersp.pft0000755003401500001440000000244013614004470024575 0ustar rouaultusers\L;Markers Point Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:f_code=T,5,N,FACC Feature Code,char.vdt,f_code1.pti,-,:cpa=S,1,N,Control Point Attribute,int.vdt,-,-,:nam=T,*,N,Name,char.vdt,-,-,:zv2=S,1,N,Highest Z-value (meters),int.vdt,-,-,:tile_id=S,1,N,Tile Reference ID,-,tile1_id.pti,-,:end_id=I,1,N,Entity Node Primitive ID,-,end1_id.pti,-,:;ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 ZB035  ZB035  ZB035  ZB035  ZB035  ZB035  ZB035 +ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 ZB035 /uZB035 ZB035 /uZB035 ZB035 ZB035 ZB035 ZB035 ZB035  ZB035  !ZB035 !"ZB035 "#ZB035 #$ZB035 $%ZB035 %&ZB035 &'ZB035 '(ZB035 (gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/tile3_id.lti0000755003401500001440000000011213614004470024436 0ustar rouaultusersFISSpolbndl.lft TILE_ID SFgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/polbndl.lfx0000755003401500001440000000003013614004470024374 0ustar rouaultusers;;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/fac.fit0000755003401500001440000000047613614004470023502 0ustar rouaultusersL;Feature Index Table;-;id=I,1,P,Row Identifier,-,-,-,:prim_id=I,1,N,Primitive ID,-,-,-,:tile_id=S,1,N,Tile Reference ID,-,-,-,:fc_id=I,1,N,Feature Class ID,-,-,-,:feature_id=I,1,N,Feature Table ID,-,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/tile_id.tti0000755003401500001440000000011613614004470024367 0ustar rouaultusersFISSbndtxt.tft TILE_ID,ꍟSFgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/int.vdt0000755003401500001440000000422213614004470023547 0ustar rouaultusersL;Boundaries Integer Value Description Table;-;id=I,1,P,Row Identifier,-,-,-,:table=T,12,N,Name of the Feature Table,-,-,-,:attribute=T,3,N,Column Name,-,-,-,:value=S,1,N,Unique Value of Attribute,-,-,-,:description=T,30,N,Description of Value,-,-,-,:;markersp.pftcpaUnknown markersp.pftcpaBench Mark markersp.pftcpaHorizontal markersp.pftcpaHorizontal With Bench Mark markersp.pftcpaVertical markersp.pftzv2/uUnknown barrierl.lftpfhUnknown polbndl.lft accUnknown polbndl.lft accAccurate polbndl.lft accApproximate polbndl.lft accDisputed polbndl.lft accUndisputed polbndl.lft bstUnknown polbndl.lft bstDefinite polbndl.lft bstIndefinite polbndl.lft bstIn Dispute polbndl.lft bstNo Defined Boundary polbndl.lft useUnknown polbndl.lft useInternational polbndl.lft usePrimary/1st Order bndvoida.aftvcaUnknown bndvoida.aftvcaArea Too Rough to Collect bndvoida.aftvcaNo Available Imagery bndvoida.aftvcaNo Available Map Source bndvoida.aftvcaNo Suitable Imagery polbnda.aft accUnknown polbnda.aft accAccurate polbnda.aft accApproximate polbnda.aft useInternational polbnda.aft usePrimary/1st Order symbol.rat fonMachine Default symbol.rat styKern !symbol.rat styProportional "symbol.rat styConstant #symbol.rat colBlack $symbol.rat colBlue %symbol.rat col Red-Brown &symbol.rat col Magenta gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/fcs0000755003401500001440000000151713614004470022740 0ustar rouaultusers&L;Boundaries Feature Class Schema Table;-;id=I,1,P,Row Identifier,-,-,-,:feature_class=T,8,N,Name of Feature Class,-,-,-,:table1=T,12,N,First Table,-,-,-,:table1_key=T,16,N,Column Name in First Table,-,-,-,:table2=T,12,N,Second Table,-,-,-,:table2_key=T,9,N,Column Name in Second Table,-,-,-,:;markerspmarkersp.pftend_id end id markerspend markersp.pft_id markersp.pftid polbndl polbndl.lft edg_id edg id polbndl edg polbndl.lft_id polbndl.lft id polbnda polbnda.aft fac_id fac id polbnda fac polbnda.aft_id polbnda.aft id bndtxt bndtxt.tft txt_id txt id bndtxt txt bndtxt.tft_id bndtxt.tft id bndtxt bndtxt.tft symbol_id symbol.rat symbol_idgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/txt_id.tti0000755003401500001440000000015413614004470024253 0ustar rouaultuserslTISbndtxt.tft TXT_IDHSgdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/polbnda.afx0000755003401500001440000000007013614004470024352 0ustar rouaultusersJJ/y////5/gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/f_code.tti0000755003401500001440000000012113614004470024171 0ustar rouaultusersITTSbndtxt.tft F_CODEHSZD040Igdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/bndtxt.tft0000755003401500001440000000051513614004470024261 0ustar rouaultusersL;Boundaries Text Feature Table;-;id=I,1,P,Row Identifier,-,-,-,:f_code=T,5,N,FACC Feature Code,char.vdt,f_code.tti,-,:symbol_id=S,1,N,Symbol Identification,-,-,-,:tile_id=S,1,N,Tile Reference ID,-,tile_id.tti,-,:txt_id=I,1,N,Text Primitive ID,-,txt_id.tti,-,:;ZD040ZD040ZD040ZD040gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/symbol.rat0000755003401500001440000000105613614004470024255 0ustar rouaultusersL;Symbol Related Attribute Table;-;id=I,1,P,Row Identifier,-,-,-,:symbol_id=S,1,N,Symbol Identification,-,-,-,:fon=S,1,N,Type of Font,int.vdt,-,-,:sty=S,1,N,Style of Text,int.vdt,-,-,:size=S,1,N,Font Size in Points,-,-,-,:col=S,1,N,Color of Text,int.vdt,-,-,:;           " # $ % gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/bnd/txt.fit0000755003401500001440000000043213614004470023560 0ustar rouaultusersL;Feature Index Table;-;id=I,1,P,Row Identifier,-,-,-,:prim_id=I,1,N,Primitive ID,-,-,-,:tile_id=S,1,N,Tile Reference ID,-,-,-,:fc_id=I,1,N,Feature Class ID,-,-,-,:feature_id=I,1,N,Feature Table ID,-,-,-,:;gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/dqt0000755003401500001440000000544013614004470022211 0ustar rouaultusersG;Library Data Quality Table;lineage.doc;id=I,1,P,Row Identifier,-,-,-,:vpf_level=T,8,N,VPF Level,-,-,-,:vpf_level_name=T,8,N,Name of VPF Level,-,-,-,:feature_complete=T,*,N,Feature Completeness Percent,-,-,-,:attrib_complete=T,*,N,Attribute Completeness Percent,-,-,-,:logical_consist=T,*,N,Logical Consistency,-,-,-,:edition_num=T,8,N,Edition Number,-,-,-,:creation_date=D,1,N,Creation Date,-,-,-,:revision_date=D,1,N,Revision Date,-,-,-,:spec_name=T,*,N,Product Specification Name,-,-,-,:spec_date=D,1,N,Product Specification Date,-,-,-,:earliest_source=D,1,N,Date of Earliest Source,-,-,-,:latest_source=D,1,N,Date of Latest Source,-,-,-,:collection_spec=T,*,N,Collection Specification Name,-,-,-,:abs_horiz_acc=T,*,N,Absolute Horizontal Accuracy of VPF Level,-,-,-,:abs_horiz_units=T,20,N,Unit of Measure for Absolute Horizontal Accuracy,-,-,-,:abs_vert_acc=T,*,N,Absolute Vertical Accuracy of VPF Level,-,-,-,:abs_vert_units=T,20,N,Unit of Measure for Absolute Vertical Accuracy,-,-,-,:rel_horiz_acc=T,*,N,Point to Point Horizontal Accuracy of VPF Level,-,-,-,:rel_horiz_units=T,20,N,Unit of Measure for Point to Point Horizontal Accuracy,-,-,-,:rel_vert_acc=T,*,N,Point to Point Vertical Accuracy of VPF Level,-,-,-,:rel_vert_units=T,20,N,Unit of Measure for Point to Point Vertical Accuracy,-,-,-,:comments=T,*,N,Miscellaneous Comments,-,-,-,:;LIBRARY TEXASH All features in this library are captured from the source materials using the rules for feature extraction and inclusion conditions in accordance with this specification.oAll features in this library have valid attribute codes assigned to them in accordance with this specification.All data are topologically correct. No duplicate features are present within a coverage. All areas are completely described as extracted from the source materials. No undershoots or overshoots are present. All data were consistently captured using the rules described in the documentation table associated with this table and in the various feature table narrative files present at the coverage level within the library.2 19921015000000.0000019930915000000.00000VMap LV2 MILSPEC MIL-V-8903219930803000000.0000019760000000000.0000019760000000000.00000VMap LV2 MILSPEC MIL-V-89032+/- 23 meters: This figure represents the overall absolute horizontal accuracy in the TEXASH library in accordance with this specification.Meters +/- 4 meters: This figure represents the overall absolute vertical accuracy in the TEXASH in accordance with this specification. The contour interval for the TEXASH library is 50 meters.Meters UnknownN/A UnknownN/A Additional descriptions of data lineage are available in the documentation table associated with this data quality table (called LINEAGE.DOC).gdalautotest-3.0.4/ogr/data/vm2alv2_texash/texash/lht0000755003401500001440000000202413614004470022203 0ustar rouaultusersL;Library Header Table;-;id=I,1,P,Row Identifier,-,-,-,:product_type=T,12,N,Product Type,-,-,-,:library_name=T,12,N,Name,-,-,-,:description=T,100,N,Description of the library,-,-,-,:data_struct_code=T,1,N,Data Structure Code,-,-,-,:scale=I,1,N,Scale of the library,-,-,-,:source_series=T,15,N,Series,-,-,-,:source_id=T,30,N,Identifier of the source reference,-,-,-,:source_edition=T,20,N,Edition number of the source,-,-,-,:source_name=T,100,N,Name of library source,-,-,-,:source_date=D,1,N,Source Date,-,-,-,:security_class=T,1,N,Security Classification,-,-,-,:downgrading=T,3,N,Downgrading,-,-,-,:downgrading_date=D,1,N,Date,-,-,-,:releasability=T,20,N,Releasability,-,-,-,:;VMap LEVEL 2texash This library contains digital data collected from the 1:50,000-scale Killeen, Texas TLM map sheet. 8PV782 6446 II 5-DMATC Topographic Line Map 19760000000000.00000UNO 00000000000000.00000RESTRICTED gdalautotest-3.0.4/ogr/data/vm2alv2_texash/README0000644003401500001440000000023113614004466021055 0ustar rouaultusersThis is an extract of a few coverages from the vpf/vm2alv2 dataset of http://freefr.dl.sourceforge.net/project/ogdi/OGDI_Test_Suite/3.1/ogdits-3.1.0.zip gdalautotest-3.0.4/ogr/data/vm2alv2_texash/dht0000755003401500001440000000235413614004470020705 0ustar rouaultusersvL;Database Header Table;-;id=I,1,P,Row Identifier,-,-,-,:vpf_version=T,10,N,VPF version number,-,-,-,:database_name=T,8,N,Directory name of this database,-,-,-,:database_desc=T,100,N,Description of this database,-,-,-,:media_standard=T,20,N,Media Standard,-,-,-,:originator=T,50,N,Producer of this database,-,-,-,:addressee=T,100,N,Address of the producer,-,-,-,:media_volumes=T,1,N,Number of Volumes in this database,-,-,-,:seq_numbers=T,1,N,The Sequential Number(s) in this database,-,-,-,:num_data_sets=T,1,N,Number of Data Sets,-,-,-,:security_class=T,1,N,Security Classification,-,-,-,:downgrading=T,3,N,Downgrading,-,-,-,:downgrade_date=D,1,N,Date,-,-,-,:releasability=T,20,N,Releasability restrictions of data,-,-,-,:transmittal_id=T,1,N,Unique Transmittal Identifier,-,-,-,:edition_number=T,10,N,Edition Number of this database,-,-,-,:edition_date=D,1,N,Date of edition,-,-,-,:;1.0 vmaplv2 General-purpose, high-resolution database to support GIS applications. ISO 9660 DEFENSE MAPPING AGENCY HEADQUARTERS, DEFENSE MAPPING AGENCY, ATTN: PR 8613, LEE HWY, FAIRFAX, VA 22031-2137 111UNO 00000000000000.00000RESTRICTED 13 199311150000000.0000gdalautotest-3.0.4/ogr/data/vm2alv2_texash/lat0000755003401500001440000000060013614004470020676 0ustar rouaultusers L;Library Extent (Attribute) Table;-;id=I,1,N,Row Identifier,-,-,-,:library_name=T,8,P,Library name,-,-,-,:xmin=F,1,N,Westernmost longitude,-,-,-,:ymin=F,1,N,Southernmost latitude,-,-,-,:xmax=F,1,N,Easternmost longitude,-,-,-,:ymax=F,1,N,Northernmost latitude,-,-,-,:;texash AAnorfolk B)ܗBsarajevoffA/B̔A0Brference44CBgdalautotest-3.0.4/ogr/data/allCountries.txt0000644003401500001440000000204413614004466020541 0ustar rouaultusers3038814 Costa de Xurius Costa de Xurius,added comma 42.5 1.48333 T SLP AD 00 0 1434 Europe/Andorra 1993-12-23 3038815 Font de la Xona 'initial single quote and " double quote Font de la Xona 42.55003 1.44986 H SPNG AD 04 0 1976 Europe/Andorra 2010-01-11 3038816 Xixerella Xixerella 42.55327 1.48736 P PPL AD 04 0 1417 Europe/Andorra 2009-04-24 3038817 Xixerella Xixerella Xixerella 42.55294 1.48764 A ADMD AD 00 0 1417 Europe/Andorra 2012-04-13 3038818 Riu Xic Riu Xic 42.56667 1.68333 H STM AD 00 0 2121 Europe/Andorra 1993-12-23 3038819 Pas del Xic Pas del Xic 42.5 1.58333 R TRL AD 00 0 1961 Europe/Andorra 1993-12-23 3038820 Roc del Xeig Roc del Xeig 42.56667 1.48333 T RK AD 00 0 1740 Europe/Andorra 1993-12-23 3038821 Collada del Xeig Collada del Xeig 42.56667 1.48333 T PK AD 00 0 1740 Europe/Andorra 1993-12-23 3038822 Fonts Vives Fonts Vives 42.5 1.56667 H SPNG AD 00 0 1684 Europe/Andorra 1993-12-23 3038823 Roc de Vista Roc de Vista 42.5 1.48333 T RK AD 00 0 1434 Europe/Andorra 1993-12-23 gdalautotest-3.0.4/ogr/data/points.avl0000644003401500001440000000003213614004466017347 0ustar rouaultusers1 2 3.45 foo 2 3 4.56 bar gdalautotest-3.0.4/ogr/data/expected_gml_21.xsd0000644003401500001440000000421613614005357021021 0ustar rouaultusers 0 http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd gdalautotest-3.0.4/ogr/data/emptyshapefilewithsbn.sbx0000644003401500001440000000015413614004466022470 0ustar rouaultusers' p62gdalautotest-3.0.4/ogr/data/utf8.gml0000644003401500001440000000173413614004466016730 0ustar rouaultusers -20036395.1478813-14581536.7915664 19966985.820107134619289.3719468 -17580408.88225470110774,2418673.458618159871548 Āliamanu 150916687 853 hamlet gdalautotest-3.0.4/ogr/data/buggymultipoly.shp0000644003401500001440000000062413614004466021146 0ustar rouaultusers' Y@Y@@Y@Y@@ Y@@Y@@Y@@Y@@Y@@Y@Y@?@Y@?@Y@Y@ Y@? Y@?333333Y@?333333Y@? Y@?gdalautotest-3.0.4/ogr/data/esrizpolygon.json0000644003401500001440000000124513614004466020775 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolygon", "fields" : [ ], "features" : [ { "geometry" : { "rings" : [ [ [ 2, 49, 1 ], [ 2, 50, 2 ], [ 3, 50, 3 ], [ 3, 49, 4 ], [ 2, 49, 1 ] ] ] }, "attributes" : { } } ] } gdalautotest-3.0.4/ogr/data/seamless_part2.id0000644003401500001440000000001013614004466020565 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/extended_data_without_schema_data.kml0000644003401500001440000000125613614004466024732 0ustar rouaultusers layer_name feature1 1_1 1_2 2,48 feature2 2_1 2_3 3,49 gdalautotest-3.0.4/ogr/data/can_caps.shx0000644003401500001440000000031413614004466017625 0ustar rouaultusers' f}ZEh`%IDE@qs*^J}U.T:O@2 @ N \ j x gdalautotest-3.0.4/ogr/data/nonconformant_shx_ticket5608.dbf0000644003401500001440000000022213614004466023436 0ustar rouaultusers_AQWidCP 1 gdalautotest-3.0.4/ogr/data/testpoly.qix0000644003401500001440000000044413614004466017744 0ustar rouaultusersSQTrhrr@Xr@ rhr;3333<@nffff<@rnffff=;3333<@Xr@;3333>hrr@nffff<@ ;3333>nffff=r@Xr@ gdalautotest-3.0.4/ogr/data/text-block-transform.dxf0000755003401500001440000000212213614004470022117 0ustar rouaultusers 0 SECTION 2 TABLES 0 TABLE 2 STYLE 70 3 0 STYLE 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 1.0 3 arial.ttf 4 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 8 0 2 TEXTBLOCK 70 0 10 0.0 20 0.0 30 0.0 3 TEXTBLOCK 1 0 TEXT 5 9C 8 0 10 -1.0279672578444741 20 1.0 30 0.0 40 1.0 1 some text 72 1 11 2.0 21 1.0 31 0.0 0 ENDBLK 5 13D 8 0 0 BLOCK 8 0 2 TEXTBLOCK2 70 0 10 0.0 20 0.0 30 0.0 3 TEXTBLOCK2 1 0 TEXT 5 A7 8 0 10 -3.083901773533424 20 0.5 30 0.0 40 0.5 1 some text 41 6.0 72 1 11 6.0 21 0.5 31 0.0 0 ENDBLK 5 1A1 8 0 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 14B 8 0 2 TEXTBLOCK 10 2.0 20 3.0 30 0.0 41 0.75 42 3.0 50 330.0 0 INSERT 5 1AC 8 0 2 TEXTBLOCK2 10 2.0 20 3.0 30 0.0 41 0.25 42 6.0 50 330.0 0 TEXT 5 80 8 0 10 2.8323156803360439 20 5.9835639330449908 30 0.0 40 2.9999999999999991 1 some text 50 330.0 41 0.2499999999999999 72 1 11 4.799038105676658 21 4.8480762113533133 31 0.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/multipatch.dbf0000644003401500001440000000011613614004466020161 0ustar rouaultusersbA WIDN 1gdalautotest-3.0.4/ogr/data/seamless_part2.map0000644003401500001440000000200013614004466020747 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?6e6eʚ;ʚ;H@@P@gdalautotest-3.0.4/ogr/data/Stacks.shx0000644003401500001440000000015413614004466017310 0ustar rouaultusers' 6gGA n jAZ/GgHAe@jA2gdalautotest-3.0.4/ogr/data/block-basepoint.dxf0000755003401500001440000000275413614004470021121 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1009 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 70 1 0 VPORT 2 *ACTIVE 70 0 10 0.0 20 0.0 11 1.0 21 1.0 12 300.0 22 150.0 13 0.0 23 0.0 14 0.5 24 0.5 15 0.5 25 0.5 16 0.0 26 0.0 36 1.0 17 0.0 27 0.0 37 0.0 40 25.402675667279428 41 2.0256081946222788 42 50.0 43 0.0 44 0.0 50 0.0 51 0.0 71 0 72 1000 73 1 74 3 75 1 76 1 77 0 78 0 0 ENDTAB 0 TABLE 2 LTYPE 70 3 0 LTYPE 2 CONTINUOUS 70 0 3 Solid line 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 70 1 0 LAYER 2 0 70 0 62 7 6 CONTINUOUS 0 ENDTAB 0 TABLE 2 STYLE 70 3 0 STYLE 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 txt 4 0 ENDTAB 0 TABLE 2 VIEW 70 0 0 ENDTAB 0 TABLE 2 UCS 70 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 8 0 2 INNERBLOCK 70 0 10 50.0 20 200.0 30 0.0 3 INNERBLOCK 1 0 LINE 5 660 8 0 10 40.0 20 210.0 30 0.0 11 60.0 21 190.0 31 0.0 0 LINE 5 661 8 0 10 60.0 20 210.0 30 0.0 11 40.0 21 190.0 31 0.0 0 ENDBLK 5 62C 8 0 0 BLOCK 8 0 2 OUTERBLOCK 70 0 10 60.0 20 250.0 30 0.0 3 OUTERBLOCK 1 0 INSERT 5 A3B 8 0 2 INNERBLOCK 10 60.0 20 250.0 30 0.0 0 ENDBLK 5 A34 8 0 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 E06 8 0 2 OUTERBLOCK 10 300.0 20 150.0 30 0.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/absolute_sheet_filename.xlsx0000644003401500001440000001315713614004466023131 0ustar rouaultusersPK}I_6X0W[Content_Types].xmlUT <=X<=Xux AK1KmG-Xnnfb{'k"B[ZdɃ}mzWiQ ƺ/ˇVgj @:Ect p|ث[ldPzey#w\cqh d QP Б,*/AbBY"'7;RR=@W $} E; W+={0Ҁ[F DZG8}פ>8th?<߼_'}Y)S@PZÏuХ7$2?hyȯA{Tr(fPK }Ixl/UT =X=Xux PK }Ixl/worksheets/UT =X=Xux PK}IMXi\xl/worksheets/sheet1.xmlUT <=X<=Xux UMs6W`xȩ)9݄b#WMgK9Lo1 J}g:Ռdbx+N`D$bsRWї/kjXE/`Oͳ-#mWQ\.m^B k)Tc["\THRG-;_0(d7hׂP}[FY" +r`> WW#}= ;ҸBR 3PwvR < :]бc77R{M|B^nXD#^eۤLPs_M'jN #xUbvwr׫xmΝƒWoG'ʏϋʧ,+6-v~}^^m;{ɠ}Ϩ3b pyqmx.i:eI&dQP #޼YB0{ë:֠{DٲGZv봾|ܥ[. +.vPi<͒?oPK}IY xl/styles.xmlUT <=X<=Xux ]o0+,߯4IۉP2fT4Vl ;@ U%X*9_m$\ 6L9Q|KdJt+je!2" H3Dž 0IA1'dJ baԸ$qAq$Wb!AZI 6: k lݨ|jqGAL gG=ЅK"_i W^HGzx0u82^XK\5eUBe%,q5Fi/n`SZeJɕ$pCq'}VϲXpUe *6M]O(wn6otWwޛ'5RZ(zEHWRЭ[,Ml}j9H ͶvҲI}1tm+K<<=kR.AdZO L|\C*yik`)"uUpSѾuj|n/+ncf|4󆙽>f&K9Al&_ew{_gwpR>pOESsonޫÊqd3JV^k17JRFtG Pjj5IՑiT'b X`MPK}I&xl/sharedStrings.xmlUT <=X<=Xux 5M 0"ަ)iΞ=OXUqu&u'Sm1LNbӁq4 x c-keq{BuP?3O\Apz-Ɓ`}!FkĜ؛ ^~WU?/Ǧuq30@!cX]68&PK}I1jCadocProps/core.xmlUT <=X<=Xux R]O0}WC)l%j3jcUZۿ`S=tUcE2Dx]Ufeg(U y~rMym`o,:C4 Hf#P\F2)f8b 1ztDG˂zkΠ*$"u`cΔRҁ{+Fa4Q3餾ߖݨP8<=6B ~@yiHHܬ %^')5-{>.r#7 +ʭ_x6⩓n鏾PDžБIn3[܇0I88{ 1>C$lK-d*zpNs7^$gO`|<,dHdUcf]8o:SQt>秅TelۨEIW7^9(Ey_T|Ï>s{*OK($2 -0aN 7mdĩ.̝ݝ~xu4)3F3{ULLZB\Jf4 ՖOt[;-p ~ CB9]KZs NE0ǍlRFi.AZFak`v85Dv_= A3X|[qzy@$NLg)[.i?dV1QGp}μosb?&i8ϐhxnV%Yu1a'qi3X;Sxf9f(^frSLk3TM,FpCcƌMHSEzE׸*3J*J:#kÓ`wN cY8اwg__?J9beUr8}g+󩠙#ݬ6UPKAN<7\{ content.xmlUT cT\cT\ux r8y q2aH% cO 0[)ϬspVw<<"؃6\V0^*&3^cK Y6< ?<< L&+tWTrDRMR%RA卒r҆:K{]uǶcLf*s`%VTlÝ*iVJ"V:AOZZ@ fxG^ŵgғ@M-2jMrsl^S$&dAm?8«\_%Q :%fH`Dfa (PrZ 5L; -υ.3eDim9 I~!)R_WWoxfwpןVш n}[fcNw.JY RY^RA:V?da|qM-*OoZ|3nG6[\P:,s;=ٱOdf`ЎQjdE Xał , t'4@59%em,J#4;OOrWp13HC,y!$k92"h bЉNrk?{>9}&b4޽~flI[W5j!}ZYLւ[7љ3ݴaSQGFj؝s辳>9NjN..% X.%,oヌ^+/p"AzK|;,W+ە owo~W+ە`x}v.WЏw'vjp޽OrPK!nuLmeta.xmlUTux PK!l9,.mimetypeUTux PK!Y)] styles.xmlUTux PK AN AiMETA-INF/UTYT\ux PK!xMETA-INF/manifest.xmlUTux PKAN<7\{ content.xmlUTcT\ux PK gdalautotest-3.0.4/ogr/data/ruian_ob_v1.xml.gz0000644003401500001440000000412213614004466020700 0ustar rouaultusersNSruian_ob_v1.xmlZnFSluH:q"#>M"֊%xgh ȕ/}a Y]$v;-;7K!?x.JIQ濬i o1/kgڏ~ze\L=,p̏k}Yq`(ʇ, 5>)zYˠ7.5kEЈ)ޜZc:YZa7A42„b߈:2gȏϦHG& Gpdm_* 1I*| B<6J`ۆ*m#R9FNHaIx9E\\bW}T',ٶ JwT z_A(vՆ1KF଄Q[iwҲ2IyxD%H*mkr6twl,Np$ p,z_ 5@)7J@-jwB)h6u\l{gd+:Y oa.}A0D\dC3L1!Q2R~/4%#sș$ E.^~W),&|4a}(Z%KL" i:ĩ3)P#&s$&̦*igjzFK`860l HH.qauSoT;F%K b~]v:h5ubNV|@b H\F< qHJfNÚe$2k;Wu]{ymwZNWEXS"Zh35\sZu&@,B16ňǁ5 X!H@h&K`CbC6Hg@[K`U<qPnw.N;-T5mf#7%ɘ[4 (XcB|[|u\?{!/ lB⋛օDSПqWpSGlCe0nzCRpG$q'KԋmdEtАfuvH(̧yc$nLOO-"vm6202enC (?5roߔRMCM"mw.[j+Y J\|QoׅD<'%2y\ch }״gzbxK(~.1>ZRU"EΗ#L/G|UK۫/e~cgJ>x5y18ُR,BQkJ. ? 948f&\/L+VeB],LVA\P^zGp;:#\aj{ij[eO޷o`/J[xin]?V.٦n[:j_n\oޟ́ gdalautotest-3.0.4/ogr/data/test3356.shx0000644003401500001440000000015413614004466017360 0ustar rouaultusers' 6"le@r D{+e@E<D2bgdalautotest-3.0.4/ogr/data/test_type_promotion_ref.json0000644003401500001440000001577313614004466023226 0ustar rouaultusers{ "type": "FeatureCollection", "name": "test_type_promotion", "features": [ { "type": "Feature", "properties": { "bool_then_bool": true, "bool_then_int": 1, "bool_then_int64": 1, "bool_then_real": 1.0, "bool_then_string": "true", "bool_then_boollist": [ true ], "bool_then_intlist": [ 1 ], "bool_then_int64list": [ 1 ], "bool_then_reallist": [ 1.0 ], "bool_then_stringlist": [ "true" ], "int_then_bool": 1, "int_then_int": 1, "int_then_int64": 1, "int_then_real": 1.0, "int_then_string": "1", "int_then_boollist": [ 1 ], "int_then_intlist": [ 1 ], "int_then_int64list": [ 1 ], "int_then_reallist": [ 1.0 ], "int_then_stringlist": [ "1" ], "int64_then_bool": 1234567890123, "int64_then_int": 1234567890123, "int64_then_int64": 1234567890123, "int64_then_real": 1234567890123.0, "int64_then_string": "1234567890123", "int64_then_boollist": [ 1234567890123 ], "int64_then_intlist": [ 1234567890123 ], "int64_then_int64list": [ 1234567890123 ], "int64_then_reallist": [ 1234567890123.0 ], "int64_then_stringlist": [ "1234567890123" ], "real_then_bool": 0.015625, "real_then_int": 0.015625, "real_then_int64": 0.015625, "real_then_real": 0.015625, "real_then_string": "0.015625", "real_then_boollist": [ 0.015625 ], "real_then_intlist": [ 0.015625 ], "real_then_int64list": [ 0.015625 ], "real_then_reallist": [ 0.015625 ], "real_then_stringlist": [ "0.015625" ], "string_then_bool": "x", "string_then_int": "x", "string_then_int64": "x", "string_then_real": "x", "string_then_string": "x", "string_then_boollist": "x", "string_then_intlist": "x", "string_then_int64list": "x", "string_then_reallist": "x", "string_then_stringlist": [ "x" ], "string_then_datetime": "x", "datetime_then_string": "1970-01-01T00:00:00", "datetime_then_datetime": "1970\/01\/01 00:00:00", "boollist_then_bool": [ true ], "boollist_then_int": [ 1 ], "boollist_then_int64": [ 1 ], "boollist_then_real": [ 1.0 ], "boollist_then_string": [ true ], "boollist_then_boollist": [ true ], "boollist_then_intlist": [ 1 ], "boollist_then_int64list": [ 1 ], "boollist_then_reallist": [ 1.0 ], "boollist_then_stringlist": [ "true" ], "intlist_then_bool": [ 1 ], "intlist_then_int": [ 1 ], "intlist_then_int64": [ 1 ], "intlist_then_real": [ 1.0 ], "intlist_then_string": [ 1 ], "intlist_then_boollist": [ 1 ], "intlist_then_intlist": [ 1 ], "intlist_then_int64list": [ 1 ], "intlist_then_reallist": [ 1.0 ], "intlist_then_stringlist": [ "1" ], "int64list_then_bool": [ 1234567890123 ], "int64list_then_int": [ 1234567890123 ], "int64list_then_int64": [ 1234567890123 ], "int64list_then_real": [ 1234567890123.0 ], "int64list_then_string": [ 1234567890123 ], "int64list_then_boollist": [ 1234567890123 ], "int64list_then_intlist": [ 1234567890123 ], "int64list_then_int64list": [ 1234567890123 ], "int64list_then_reallist": [ 1234567890123.0 ], "int64list_then_stringlist": [ "1234567890123" ], "reallist_then_bool": [ 0.015625 ], "reallist_then_int": [ 0.015625 ], "reallist_then_int64": [ 0.015625 ], "reallist_then_real": [ 0.015625 ], "reallist_then_string": [ 0.015625 ], "reallist_then_boollist": [ 0.015625 ], "reallist_then_intlist": [ 0.015625 ], "reallist_then_int64list": [ 0.015625 ], "reallist_then_reallist": [ 0.015625 ], "reallist_then_stringlist": [ "0.015625" ], "stringlist_then_bool": [ "x" ], "stringlist_then_int": [ "x" ], "stringlist_then_int64": [ "x" ], "stringlist_then_real": [ "x" ], "stringlist_then_string": [ "x" ], "stringlist_then_boollist": [ "x" ], "stringlist_then_intlist": [ "x" ], "stringlist_then_int64list": [ "x" ], "stringlist_then_reallist": [ "x" ], "stringlist_then_stringlist": [ "x" ] }, "geometry": null }, { "type": "Feature", "properties": { "bool_then_bool": true, "bool_then_int": 1, "bool_then_int64": 1234567890123, "bool_then_real": 0.015625, "bool_then_string": "x", "bool_then_boollist": [ true ], "bool_then_intlist": [ 1 ], "bool_then_int64list": [ 1234567890123 ], "bool_then_reallist": [ 0.015625 ], "bool_then_stringlist": [ "x" ], "int_then_bool": 1, "int_then_int": 1, "int_then_int64": 1234567890123, "int_then_real": 0.015625, "int_then_string": "x", "int_then_boollist": [ 1 ], "int_then_intlist": [ 1 ], "int_then_int64list": [ 1234567890123 ], "int_then_reallist": [ 0.015625 ], "int_then_stringlist": [ "x" ], "int64_then_bool": 1, "int64_then_int": 1, "int64_then_int64": 1234567890123, "int64_then_real": 0.015625, "int64_then_string": "x", "int64_then_boollist": [ 1 ], "int64_then_intlist": [ 1 ], "int64_then_int64list": [ 1234567890123 ], "int64_then_reallist": [ 0.015625 ], "int64_then_stringlist": [ "x" ], "real_then_bool": 1.0, "real_then_int": 1.0, "real_then_int64": 1234567890123.0, "real_then_real": 0.015625, "real_then_string": "x", "real_then_boollist": [ 1.0 ], "real_then_intlist": [ 1.0 ], "real_then_int64list": [ 1234567890123.0 ], "real_then_reallist": [ 0.015625 ], "real_then_stringlist": [ "x" ], "string_then_bool": "true", "string_then_int": "1", "string_then_int64": "1234567890123", "string_then_real": "0.015625", "string_then_string": "x", "string_then_boollist": [ true ], "string_then_intlist": [ 1 ], "string_then_int64list": [ 1234567890123 ], "string_then_reallist": [ 0.015625 ], "string_then_stringlist": [ "x" ], "string_then_datetime": "1970-01-01T00:00:00", "datetime_then_string": "x", "datetime_then_datetime": "1970\/01\/01 00:00:00", "boollist_then_bool": [ true ], "boollist_then_int": [ 1 ], "boollist_then_int64": [ 1234567890123 ], "boollist_then_real": [ 0.015625 ], "boollist_then_string": "x", "boollist_then_boollist": [ true ], "boollist_then_intlist": [ 1 ], "boollist_then_int64list": [ 1234567890123 ], "boollist_then_reallist": [ 0.015625 ], "boollist_then_stringlist": [ "x" ], "intlist_then_bool": [ 1 ], "intlist_then_int": [ 1 ], "intlist_then_int64": [ 1234567890123 ], "intlist_then_real": [ 0.015625 ], "intlist_then_string": "x", "intlist_then_boollist": [ 1 ], "intlist_then_intlist": [ 1 ], "intlist_then_int64list": [ 1234567890123 ], "intlist_then_reallist": [ 0.015625 ], "intlist_then_stringlist": [ "x" ], "int64list_then_bool": [ 1 ], "int64list_then_int": [ 1 ], "int64list_then_int64": [ 1234567890123 ], "int64list_then_real": [ 0.015625 ], "int64list_then_string": "x", "int64list_then_boollist": [ 1 ], "int64list_then_intlist": [ 1 ], "int64list_then_int64list": [ 1234567890123 ], "int64list_then_reallist": [ 0.015625 ], "int64list_then_stringlist": [ "x" ], "reallist_then_bool": [ 1.0 ], "reallist_then_int": [ 1.0 ], "reallist_then_int64": [ 1234567890123.0 ], "reallist_then_real": [ 0.015625 ], "reallist_then_string": "x", "reallist_then_boollist": [ 1.0 ], "reallist_then_intlist": [ 1.0 ], "reallist_then_int64list": [ 1234567890123.0 ], "reallist_then_reallist": [ 0.015625 ], "reallist_then_stringlist": [ "x" ], "stringlist_then_bool": [ "true" ], "stringlist_then_int": [ "1" ], "stringlist_then_int64": [ "1234567890123" ], "stringlist_then_real": [ "0.015625" ], "stringlist_then_string": [ "x" ], "stringlist_then_boollist": [ "true" ], "stringlist_then_intlist": [ "1" ], "stringlist_then_int64list": [ "1234567890123" ], "stringlist_then_reallist": [ "0.015625" ], "stringlist_then_stringlist": [ "x" ] }, "geometry": null } ] } gdalautotest-3.0.4/ogr/data/testquoteheader2.csv0000644003401500001440000000003013614004466021332 0ustar rouaultuserstest,2000,2000.12 1,2,3 gdalautotest-3.0.4/ogr/data/gjmultipoly.dbf0000644003401500001440000000025113614004466020366 0ustar rouaultusers_aHFIDN NAMEC< 2 MultiPoly 1 gdalautotest-3.0.4/ogr/data/test.osm0000644003401500001440000001040713614004466017035 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/single_point_mapinfo.dat0000644003401500001440000000011513614004466022226 0ustar rouaultusersr A totoC gdalautotest-3.0.4/ogr/data/points.gxt0000644003401500001440000000057413614004466017402 0ustar rouaultusers//$DELIMITER " " //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 101} //$FIELDS Class=points;Subclass=points;Kind=1;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields Primary_ID Secondary_ID Third_ID Private#X Private#Y -1 points points points 3 PID1 SID1 TID1 0 1 -1 points points points 3 PID2 SID2 2 3 gdalautotest-3.0.4/ogr/data/seamless_part2.tab0000644003401500001440000000021313614004466020744 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 2 id Char (254) ; str Char (254) ; gdalautotest-3.0.4/ogr/data/test972000xp.xls0000644003401500001440000001600013614004466020072 0ustar rouaultusersࡱ;   Root Entry  !"#$%&'()*+,-./013678:  \pCalc Ba==@ 8@"1Arial1Arial1Arial1Arial GENERAL DD/MM/YYDD/MM/YYYY\ HH:MM:SS HH:MM:SS                + ) , *          `Feuille1Feuille2 Feuille3!!Tjb( 3  @@  UFirstCol SecondColThirdCol FourthColFifthColVal2 Val_avec_  cc   dMbP?_%*+# &C&"Times New Roman,Normal"&12&A(%&C&"Times New Roman,Normal"&12Page &P&333333?'333333?(-؂-?)-؂-?" d,,333333?333333?U }  } h}       ~  ~ Iv@ 9Z?PH0(  >@gg   dMbP?_%*+# &C&"Times New Roman,Normal"&12&A(%&C&"Times New Roman,Normal"&12Page &P&333333?'333333?(-؂-?)-؂-?" d,,333333?333333?U }  PH 0(  >@gg   dMbP?_%*+# &C&"Times New Roman,Normal"&12&A(%&C&"Times New Roman,Normal"&12Page &P&333333?'333333?(-؂-?)-؂-?" d,,333333?333333?U }  PH0 0(   >@gg  FMicrosoft Excel 97-TabelleBiff8Oh+'0HPh  Even Rouault Even Rouault8@e+@@T@Po՜.+,D՜.+,\Root EntryFWorkbook CompObj2IOle 4SummaryInformation(5DocumentSummaryInformation89tgdalautotest-3.0.4/ogr/data/testfmegml.xsd0000644003401500001440000000331313614005357020223 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/prjwithutf8bom.shp0000644003401500001440000000020013614004466021034 0ustar rouaultusers' @YI@YI@ YI@gdalautotest-3.0.4/ogr/data/poly.pdf0000644003401500001440000000611113614004466017011 0ustar rouaultusers%PDF-1.6 % 7 0 obj << /BBox [ 0 0 1024 679 ] /Measure 8 0 R /Name (Layer) /Type /Viewport >> endobj 8 0 obj << /Bounds [ 0 1 0 0 1 0 1 1 ] /GCS 9 0 R /GPTS [ 43.0424273363873979 2.7423636773173032 43.0363084815124353 2.7423892766913944 43.0363360882442052 2.754960843272547 43.0424549489906028 2.7549364931328855 ] /LPTS [ 0 1 0 0 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 9 0 obj << /EPSG 32631 /Type /PROJCS /WKT (PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],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["Meter",1]]) >> endobj 3 0 obj << /Annots 6 0 R /Contents 4 0 R /MediaBox [ 0 0 1024 679 ] /Parent 1 0 R /Resources 5 0 R /StructParents 0 /Type /Page /UserUnit 1 /VP [ 7 0 R ] >> endobj 10 0 obj << /Name (poly) /Type /OCG >> endobj 12 0 obj << /BBox [ -1 -1 1026 680 ] /Length 13 0 R /Resources << /ExtGState << /GS1 << /Type /ExtGState /ca 0.5 >> >> >> /Subtype /Form /Type /XObject >> stream q /GS1 gs 1.000000 w 0 J 0 j 10 M []0 d 0.000000 0.000000 0.000000 RG 0.498039 0.498039 0.498039 rg 1020.312838 679.000000 m 1024.000000 660.013981 l 715.372006 521.116262 l 632.004638 490.139073 l 675.188185 380.220015 l 804.832565 301.278146 l 764.836227 230.330390 l 666.782704 60.955114 l 453.021025 63.453274 l 396.463703 61.454746 l 338.031552 60.455482 l 193.701016 3.497425 l 181.858350 0.000000 l 108.333832 135.899926 l 31.590858 237.824871 l 14.779897 231.329654 l 0.000000 268.302428 l 134.987642 321.263429 l 624.630313 520.116998 l 1020.312838 679.000000 l h b* Q endstream endobj 13 0 obj 577 endobj 14 0 obj << /A << /O /UserProperties /P [ << /N (AREA) /V 247328.1719999999913853 >> << /N (EAS_ID) /V 179 >> << /N (PRFEDEA) /V (35043423) >> ] >> /K 0 /P 11 0 R /Pg 3 0 R /S /feature /T (feature1) >> endobj 11 0 obj << /A << /O /UserProperties >> /K [ 14 0 R ] /P 15 0 R /S /Feature /T (poly) >> endobj 4 0 obj << /Length 16 0 R >> stream /OC /Lyr10 BDC /feature <> BDC /Vector12 Do EMC EMC endstream endobj 16 0 obj 61 endobj 17 0 obj << /Nums [ 0 [ 14 0 R ] ] >> endobj 15 0 obj << /Type /StructTreeRoot /ParentTree 17 0 R /K [ 11 0 R ] >> endobj 5 0 obj << /Properties << /Lyr10 10 0 R >> /XObject << /Vector12 12 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /MarkInfo << /UserProperties true >> /OCProperties << /D << /Order [ 10 0 R ] >> /OCGs [ 10 0 R ] >> /Pages 1 0 R /StructTreeRoot 15 0 R /Type /Catalog >> endobj xref 0 18 0000000000 65535 f 0000002487 00000 n 0000002546 00000 n 0000000827 00000 n 0000002122 00000 n 0000002383 00000 n 0000002468 00000 n 0000000015 00000 n 0000000104 00000 n 0000000384 00000 n 0000000991 00000 n 0000002026 00000 n 0000001037 00000 n 0000001794 00000 n 0000001817 00000 n 0000002306 00000 n 0000002236 00000 n 0000002258 00000 n trailer << /Root 2 0 R /Size 18 >> startxref 2719 %%EOF gdalautotest-3.0.4/ogr/data/testnull.csvt0000644003401500001440000000006513614004466020110 0ustar rouaultusers"Integer(5)","Real (10.7)","Integer","Real","String" gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/0000755003401500001440000000000013614004466025373 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.gdbtable0000644003401500001440000000052013614004466030104 0ustar rouaultusersIP(ObjectIDUUID &OriginID &DestID &Type & Attributes  PropertiesEq٘uANBN ȟO5L+x4CGN>CĕtgBN ȟO<VL#Cx4CGNgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.freelist0000644003401500001440000006053013614004466030162 0ustar rouaultusersP)aGGm %UQWXZXcYVUZ[ } y\ 4J} gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.CatItemTypesByName.atx0000644003401500001440000003002613614004466032605 0ustar rouaultusersSchematic Dataset    "!AbstractTable Catalog Dataset Coded Value Domain Dataset Domain Extension Dataset Feature Class Feature Dataset Folder Geometric Network Historical Marker Item Mosaic Dataset Network Dataset Parcel Fabric Range Domain Raster Catalog Raster Dataset Relationship Class Replica Replica Dataset Representation Class Resource Schematic Dataset   Survey Dataset Sync Dataset Sync Replica Table Terrain Tin Toolbox Topology Workspace Workspace Extension "gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a0000000b.gdbtablx0000644003401500001440000001204013614004466030203 0ustar rouaultusers(dgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByUUID.atx0000644003401500001440000001002613614004466032317 0ustar rouaultusers    {0D10B3A7-2F64-45E6-B7AC-2FC27BF2133C}{17E08ADB-2B31-4DCD-8FDD-DF529E88F843}{55D2F4DC-CB17-4E32-A8C7-47591E8C71DE}{583A5BAA-3551-41AE-8AA8-1185719F3889}{5DD0C1AF-CB3D-4FEA-8C51-CB3BA8D77CDB}{5F9085E0-788F-4354-AE3C-34C83A7EA784}{725BADAB-3452-491B-A795-55F32D67229C}{79CC71C8-B7D9-4141-9014-B6373E236ABB}{8DB31AF1-DF7C-4632-AA10-3CC44B0C6914}{908A4670-1111-48C6-8269-134FDD3FE617}{A1633A59-46BA-4448-8706-D8ABE2B2B02E}{B32B8563-0B96-4D32-92C4-086423AE9962}{CC28387C-441F-4D7C-A802-41A160317FE0}{D022DE33-45BD-424C-88BF-5B1B6B957BD3}{D088B110-190B-4229-BDF7-89FDDD14D1EA}{DC739A70-9B71-41E8-868C-008CF46F16D7}{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}{E79B44E3-F833-4B12-90A1-364EC4DDC43E}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.gdbtablx0000644003401500001440000001204013614004466030130 0ustar rouaultusers&fk= gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.gdbindexes0000644003401500001440000000046613614004466030463 0ustar rouaultusers FDO_ObjectIDObjectID FDO_ShapeShapeFDO_UUIDUUIDCatItemsByTypeTypeCatItemsByPhysicalName PhysicalNamegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000001.gdbtable0000644003401500001440000000053213614004466030102 0ustar rouaultusers >Z(>IDName FileFormatGDB_SystemCatalog GDB_DBTuneGDB_SpatialRefs GDB_Items GDB_ItemTypesGDB_ItemRelationshipsGDB_ItemRelationshipTypesGDB_ReplicaLog sample2polygonArcsZM1gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000003.gdbindexes0000644003401500001440000000005213614004466030451 0ustar rouaultusersFDO_IDID././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.CatItemTypesByParentTypeID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.CatItemTypesByParentTy0000644003401500001440000001002613614004466032676 0ustar rouaultusers"  !" {00000000-0000-0000-0000-000000000000}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{77292603-930F-475D-AE4F-B8970F42F394}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D4912162-3413-476E-9DA4-2AEFBBC16939}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByBackwardLabel.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByBackwardL0000644003401500001440000001002613614004466032610 0ustar rouaultusers    Child Folder Of Contained In FeatureDataset Contained In Folder Contained in Dataset Contained in Dataset Dataset Of Sync Dataset Dataset of Replicated Dataset Destination Of Participates In Geometric Network Participates In Network Dataset Participates In Network Dataset Participates In Parcel Fabric Participates In Parcel Fabric Participates In Replica Participates In Sync Replica Participates In Terrain Participates In Topology Represented Feature Class gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.CatRelsByOriginID.atx0000644003401500001440000001002613614004466032352 0ustar rouaultusers{D64ED042-C809-4F9F-8ABE-121F87B2F1A4}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.gdbtablx0000644003401500001440000001204013614004466030127 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByName.atx0000644003401500001440000001002613614004466032431 0ustar rouaultusers     DatasetInFeatureDataset DatasetInFolder DatasetOfReplicaDataset DatasetOfSyncDataset DatasetsRelatedThrough DomainInDataset FeatureClassInGeometricNetwork FeatureClassInNetworkDataset FeatureClassInParcelFabric FeatureClassInTerrain FeatureClassInTopology FolderInFolder ItemInFolder ReplicaDatasetInReplica RepresentationOfFeatureClass SyncDatasetInSyncReplica TableInNetworkDataset TableInParcelFabric ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByForwardLabel.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByForwardLa0000644003401500001440000001002613614004466032637 0ustar rouaultusers    Contains Dataset Contains Dataset Contains Domain Contains Item Feature Class Representation Manages Table Manages Table Origin Of Parent Folder Of Replicated Dataset Replicated Dataset Replicated Dataset Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Spatially Manages Feature Class Sync Dataset gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.CatItemTypesByUUID.atx0000644003401500001440000001002613614004466032471 0ustar rouaultusers" " !    {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{35B601F7-45CE-4AFF-ADB7-7702D3839B12}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5B966567-FB87-4DDE-938B-B4B37423539D}{5ED667A3-9CA9-44A2-8029-D95BF23704B9}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{77292603-930F-475D-AE4F-B8970F42F394}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{787BEA35-4A86-494F-BB48-500B96145B58}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{8C368B12-A12E-4C7E-9638-C9C64E69E98F}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{B606A7E1-FA5B-439C-849C-6E9C2481537B}{C29DA988-8C3E-45F7-8B5C-18E51EE7BEB4}{C673FE0F-7280-404F-8532-20755DD8FC06}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D4912162-3413-476E-9DA4-2AEFBBC16939}{D5A40288-029E-4766-8C81-DE3F61129371}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{DB1B697A-3BB6-426A-98A2-6EE7A4C6AED3}{DC64B6E4-DC0F-43BD-B4F5-F22385DCF055}{DC9EF677-1AA3-45A7-8ACD-303A5202D0DC}{E6302665-416B-44FA-BE33-4E15916BA101}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F8413DCB-2248-4935-BFE9-315F397E5110}{FBDD7DD6-4A25-40B7-9A1A-ECC3D1172447}{FFD09C28-FE70-4E25-907C-AF8E8A5EC5F3}&"././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.CatItemsByPhysicalName.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.CatItemsByPhysicalName0000644003401500001440000001002613614004466032642 0ustar rouaultusers SAMPLE2 WORKSPACE gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a0000000b.gdbtable0000644003401500001440000000561413614004466030171 0ustar rouaultusersqZ vˋ 䪉ݞׄ Ԅ˼ Ů گ󩉤 ֹB Y@`Z,APassԬ ʧȹõĤВ䝬ג'ʠՄ ыǹՄ ĵֹB6 @l!APassؿۙ Ǎۼóܷ ƶښց ń ǺߡȧֹBrVTL AtC-&A\ ޕN AsO)&AD7K@w2AFailalse_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0]]~(SlAWԽ׺Aj@j@MbP?MbP?MbP?[k? A<$[&AW Av0&Aw@ Shape_Length Shape_AreaadStatusj᨞ ٺ Ѽ؁ֹ̲BQ#? AuUR&AŻ@ i{.AFail,A^Ԭ ʧȹõĤВ䝬ג'ʠՄ ыǹՄ ĵֹB6 @l!A9ؿۙ Ǎۼóܷ ƶښց ń ǺߡȧֹBrVTL AtC-&A\ ޕN AsO)&AD7K@w2Aj᨞ ٺ Ѽ؁ֹ̲BQ#? AuUR&AŻ@ i{.Aq OBJECTID_1ShapeJPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0]]~(SlAWԽ׺Aj@j@MbP?MbP?MbP?Xk? A<$[&AW Av0&Aw@ Shape_Length Shape_Area ReadStatus2gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.gdbindexes0000644003401500001440000000047613614004466030466 0ustar rouaultusers FDO_ObjectIDObjectIDFDO_UUIDUUIDCatRelsByOriginIDOriginIDCatRelsByDestinationIDDestID CatRelsByTypeTypegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a0000000b.spx0000644003401500001440000001002613614004466027230 0ustar rouaultusers:rstuvwxr s t u v w x uvwxu v w x stuuvvwxs t u u v v w w x x y stuvwxys t u v w x y wxy@:gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.gdbtable0000644003401500001440000000471013614004466030112 0ustar rouaultusers (ObjectIDUUID &OrigItemTypeID &DestItemTypeID &Name ForwardLabel BackwardLabel IsContainment[:XQ5Aq8i3_cI s xsp,J",[FeatureClassInParcelFabricSpatially Manages Feature ClassParticipates In Parcel Fabric )BRqvf%CtB FgN xsp,J",[FeatureClassInTopologySpatially Manages Feature ClassParticipates In TopologywpFHiO?}qwO%c1;͝xQLg+eTableInNetworkDataset Manages TableParticipates In Network Datasets_xTC<4:~i3_cI s;͝xQLg+eTableInParcelFabric Manages TableParticipates In Parcel FabricU2NGYq7u5vd3Hx<|( xsp,J",[FeatureClassInTerrainSpatially Manages Feature ClassParticipates In Terrainv|8(D|MA`1ge[Mt#SeXE#mѠ{GSyncDatasetInSyncReplica Sync DatasetParticipates In Sync ReplicasqyٷAA7>#jeXE#mѠ{G(mM&Nag}DatasetOfSyncDatasetReplicated DatasetDataset Of Sync Datasetc d/E/{xeE9ӱo>xeE9ӱFolderInFolderParent Folder OfChild Folder Ofc+ 2Md#b}qwO%c1 xsp,J",[FeatureClassInNetworkDatasetSpatially Manages Feature ClassParticipates In Network Datasetv|2FxeE9ӱ(mM&Nag}DatasetInFolderContains DatasetContained in DatasetpsqAofqsKQ & xsp,J",[FeatureClassInGeometricNetworkSpatially Manages Feature Class!Participates In Geometric Networkb]=OQ;|o>xeE9ӱխ'B?3 ItemInFolder Contains ItemContained In Folderhۊ1+MRC(mM&Nag}7fHJ( xsp,J",[ jOF=RepresentationOfFeatureClassFeature Class RepresentationRepresented Feature Classgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000001.gdbtablx0000644003401500001440000001204013614004466030122 0ustar rouaultusers j.gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000001.gdbindexes0000644003401500001440000000015613614004466030454 0ustar rouaultusersFDO_IDID TablesByName LOWER(Name)gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.CatItemsByType.atx0000644003401500001440000001002613614004466032001 0ustar rouaultusers{70737809-852C-4A03-9E22-2CECEA5B9BFA}{C673FE0F-7280-404F-8532-20755DD8FC06}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}&././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByOriginIte0000644003401500001440000001002613614004466032647 0ustar rouaultusers     {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{4ED4A58E-621F-4043-95ED-850FBA45FCBC}{5B966567-FB87-4DDE-938B-B4B37423539D}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{73718A66-AFB9-4B88-A551-CFFA0AE12620}{74737149-DCB5-4257-8904-B9724E32A530}{76357537-3364-48AF-A4BE-783C7C28B5CB}{767152D3-ED66-4325-8774-420D46674E07}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{7771FC7D-A38B-4FD3-8225-639D17E9A131}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{A3803369-5FC2-4963-BAE0-13EFFC09DD73}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}&././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.CatRelsByDestinationID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.CatRelsByDestinationID0000644003401500001440000001002613614004466032611 0ustar rouaultusers{90950FC0-0435-4C1C-B09F-14FBCBE5802B}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000001.freelist0000644003401500001440000001053013614004466030152 0ustar rouaultusersC././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByDestItemTypeID.atxgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.CatRelTypesByDestItemT0000644003401500001440000001002613614004466032620 0ustar rouaultusers   {28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{28DA9E89-FF80-4D6D-8926-4EE2B161677D}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{70737809-852C-4A03-9E22-2CECEA5B9BFA}{8405ADD5-8DF8-4227-8FAC-3FCADE073386}{8637F1ED-8C04-4866-A44A-1CB8288B3C63}{A300008D-0CEA-4F6A-9DFA-46AF829A3DF2}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{CD06BC3B-789D-4C51-AAFA-A467912B8965}{D86502F9-9758-45C6-9D23-6DD1A0107B47}{D98421EB-D582-4713-9484-43304D0810F6}{F3783E6F-65CA-4514-8315-CE3985DAD3B1}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000003.gdbtable0000644003401500001440000000375213614004466030113 0ustar rouaultusers( IDSRTEXTFalseXFalseYXYUnitsFalseZZUnitsFalseMMUnits XYTolerance ZTolerance MToleranceGEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.Aj@j@>MbP?MbP?PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]S@d@ٺAj@j@MbP?MbP?MbP?PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]S@d@ٺAFV1hb@N xB(,iBMbP?MbP?MbP?PROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0]]~(SlAWԽ׺Aj@j@MbP?MbP?MbP?gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a0000000b.gdbindexes0000644003401500001440000000017413614004466030535 0ustar rouaultusersFDO_OBJECTID_1 OBJECTID_1 FDO_ShapeShapegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000002.gdbtablx0000644003401500001440000001204013614004466030123 0ustar rouaultusers#>`T}F~5`,v,aK}gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.spx0000644003401500001440000001002613614004466027152 0ustar rouaultusersV W X VWXV W X VWXV W X @gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.freelist0000644003401500001440000001053013614004466030157 0ustar rouaultusersIgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.gdbtable0000644003401500001440000014004113614004466030105 0ustar rouaultusers'!(RObjectIDUUID &Type &Name PhysicalNamePathDatasetSubtype1DatasetSubtype2 DatasetInfo1 DatasetInfo2URL Definition  Documentation ItemInfo  PropertiesDefaultsShape"GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]fV.Aj@j@>MbP?MbP?%"xeE9ӱ\x`T56L+Xo4^rsƀrO@2 u] Workspace WORKSPACE\falseesriLocalDatabaseWorkspace3005L+@5L+ xsp,J",[sample2SAMPLE2\sample2Shape.\sample2sample2falseesriDTFeatureClass5falsefalse10.0trueOBJECTID_1OBJECTID_1OBJECTID_1esriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetruelongString123456789longString123456789esriFieldTypeStringtrueLongInteger1234567890LongInteger1234567890esriFieldTypeSmallIntegertrueLongDate12345678912345LongDate12345678912345esriFieldTypeDatetrueaaaaaaesriFieldTypeStringtrueint1int1esriFieldTypeSmallIntegertrueguid1guid1esriFieldTypeGUIDtrues10s10esriFieldTypeStringtrues20s20esriFieldTypeStringtrueertewrtertewrtesriFieldTypeSmallIntegertruewertwertwertwertesriFieldTypeSmallIntegertrueararesriFieldTypeDoubletrueShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_LengthPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157falsefalseties> .c=׻@<VL#C xsp,J",[polygonArcsZM1POLYGONARCSZM1\polygonArcsZM1Shape+\polygonArcsZM1polygonArcsZM1falseesriDTFeatureClass4falsefalse10.0trueOBJECTIDOBJECTIDOBJECTIDesriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueET_IDET_IDesriFieldTypeInteger0trueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalseShapeTypeesriFieldTypeStringtrueReadStatusesriFieldTypeStringtrue{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_LengthNaNNaNNaNNaNPROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.39105384962.40883167606631652639985101.53560865029066769.252690.0010.0010.001true3273532735PROJCS["WGS_1984_UTM_Zone_35S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",27.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["EPSG",32735]]-51209001900450445547.39105384962.40883167606631652639985101.53560865029066769.252690.0010.0010.001true3273532735falsefalsem@5L+ xsp,J",[sample2SAMPLE2\sample2Shape(\sample2sample2falseesriDTFeatureClass5falsefalse10.0trueOBJECTID_1OBJECTID_1OBJECTID_1esriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_Length532441.96799788938724354.17940629227535435.80445727054727047.3393132351300NaNNaNPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157PROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157falsefalse 20170824142733001.0TRUECalculateField aPgZM LongInteger1234567890 "Now ( )" VB #CalculateField aPgZM longString123456789 sdafsadfasdfasf VB #CalculateField aPgZM longString123456789 "sdafsadfasdfasf" VB #CalculateField aPgZM LongInteger1234567890 "[OBJECTID_1]* [OBJECTID_1]" VB #CalculateField aPgZM LongDate12345678912345 "Now ( )" VB #CalculateField aPgZM LongDate12345678912345 3245345425 VB #CalculateField aPgZM guid1 222 VB #CalculateField aPgZM aaa "a" VB #CalculateField aPgZM aaa "aa" VB #CalculateField aPgZM LongInteger1234567890 [OBJECTID_1] VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & a" VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & " a"" VB #file://\\VMBASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽVrotocol Sync="TRUE">Local Area Network 4QțDЈŽDDB.gdbLocal Area Network 4QțDЈŽF.gdbLocal Area Network 4QțDЈŽTLocal Area Network 4QțDЈŽTLocal Area Network 4QțDЈŽRe>Local Area Network 4QțDЈŽLlinkage>Local Area Network 4QțDЈŽTLocal Area Network 4QțDЈŽ01GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽ*BASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽm@5L+ xsp,J",[sample2SAMPLE2\sample2Shape(\sample2sample2falseesriDTFeatureClass5falsefalse10.0trueOBJECTID_1OBJECTID_1OBJECTID_1esriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_Length532441.96799788938724354.17940629227535435.80445727054727047.3393132351300NaNNaNPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157PROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157falsefalse 20170824142733001.0TRUECalculateField aPgZM LongInteger1234567890 "Now ( )" VB #CalculateField aPgZM longString123456789 sdafsadfasdfasf VB #CalculateField aPgZM longString123456789 "sdafsadfasdfasf" VB #CalculateField aPgZM LongInteger1234567890 "[OBJECTID_1]* [OBJECTID_1]" VB #CalculateField aPgZM LongDate12345678912345 "Now ( )" VB #CalculateField aPgZM LongDate12345678912345 3245345425 VB #CalculateField aPgZM guid1 222 VB #CalculateField aPgZM aaa "a" VB #CalculateField aPgZM aaa "aa" VB #CalculateField aPgZM LongInteger1234567890 [OBJECTID_1] VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & a" VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & " a"" VB #file://\\VMBASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽac="TRUE">Local Area Network 4QțDЈŽm@5L+ xsp,J",[sample2SAMPLE2\sample2Shape(\sample2sample2falseesriDTFeatureClass5falsefalse10.0trueOBJECTID_1OBJECTID_1OBJECTID_1esriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalse{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_Length532441.96799788938724354.17940629227535435.80445727054727047.3393132351300NaNNaNPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157PROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157falsefalse 20170824142733001.0TRUECalculateField aPgZM LongInteger1234567890 "Now ( )" VB #CalculateField aPgZM longString123456789 sdafsadfasdfasf VB #CalculateField aPgZM longString123456789 "sdafsadfasdfasf" VB #CalculateField aPgZM LongInteger1234567890 "[OBJECTID_1]* [OBJECTID_1]" VB #CalculateField aPgZM LongDate12345678912345 "Now ( )" VB #CalculateField aPgZM LongDate12345678912345 3245345425 VB #CalculateField aPgZM guid1 222 VB #CalculateField aPgZM aaa "a" VB #CalculateField aPgZM aaa "aa" VB #CalculateField aPgZM LongInteger1234567890 [OBJECTID_1] VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & a" VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & " a"" VB #file://\\VMBASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽac="TRUE">Local Area Network 4QțDЈŽ0!@5L+ xsp,J",[sample2SAMPLE2\sample2Shape)\sample2sample2falseesriDTFeatureClass5falsefalse10.0trueOBJECTID_1OBJECTID_1OBJECTID_1esriFieldTypeOIDfalsetruefalseShapeShapeesriFieldTypeGeometrytruetrueShape_LengthShape_LengthesriFieldTypeDoubletruetruefalseShape_AreaShape_AreaesriFieldTypeDoubletruetruefalseReadStatusesriFieldTypeStringtrue{52353152-891A-11D0-BEC6-00805F7C4268}falsefalsetrueesriFTSimpleesriGeometryPolygonShapetruetruetrueShape_AreaShape_Length532441.96799788938724354.17940629227535435.80445727054727047.3393132351300NaNNaNPROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157PROJCS["IRENET95_Irish_Transverse_Mercator",GEOGCS["GCS_IRENET95",DATUM["D_IRENET95",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",750000.0],PARAMETER["Central_Meridian",-8.0],PARAMETER["Scale_Factor",0.99982],PARAMETER["Latitude_Of_Origin",53.5],UNIT["Meter",1.0],AUTHORITY["EPSG",2157]]-5022200-15179500450346452.34347922-10000010000-100000100000.0010.0010.001true21572157falsefalse 20170824142733001.0TRUECalculateField aPgZM LongInteger1234567890 "Now ( )" VB #CalculateField aPgZM longString123456789 sdafsadfasdfasf VB #CalculateField aPgZM longString123456789 "sdafsadfasdfasf" VB #CalculateField aPgZM LongInteger1234567890 "[OBJECTID_1]* [OBJECTID_1]" VB #CalculateField aPgZM LongDate12345678912345 "Now ( )" VB #CalculateField aPgZM LongDate12345678912345 3245345425 VB #CalculateField aPgZM guid1 222 VB #CalculateField aPgZM aaa "a" VB #CalculateField aPgZM aaa "aa" VB #CalculateField aPgZM LongInteger1234567890 [OBJECTID_1] VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & a" VB #CalculateField aPgZM longString123456789 "[OBJECTID_1] & " a"" VB #file://\\VMBASEW81GEN1\C$\00\sampleFGDB.gdbLocal Area Network 4QțDЈŽgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000007.gdbindexes0000644003401500001440000000113213614004466030455 0ustar rouaultusers FDO_ObjectIDObjectIDCatRelTypesByUUIDUUIDCatRelTypesByOriginItemTypeIDOrigItemTypeIDCatRelTypesByDestItemTypeIDDestItemTypeIDCatRelTypesByNameNameCatRelTypesByForwardLabel ForwardLabelCatRelTypesByBackwardLabel BackwardLabelgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.gdbtablx0000644003401500001440000001204013614004466030126 0ustar rouaultusers"Du<p$WV"M~ ?lgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000003.gdbtablx0000644003401500001440000001204013614004466030124 0ustar rouaultusers$ gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.FDO_UUID.atx0000644003401500001440000001002613614004466030371 0ustar rouaultusers{90950FC0-0435-4C1C-B09F-14FBCBE5802B}{BF546016-3510-4C36-B52B-586F34DC5E72}{D64ED042-C809-4F9F-8ABE-121F87B2F1A4}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/timestamps0000644003401500001440000000062013614004466027502 0ustar rouaultusersPgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.FDO_UUID.atx0000644003401500001440000001002613614004466030373 0ustar rouaultusers{E9A371EE-98D9-4175-9E07-844EAE8684BA}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000002.gdbtable0000644003401500001440000000400713614004466030104 0ustar rouaultusers#e(eKeyword  ParameterName  ConfigString6DEFAULTSUI_TEXT#The default datafile configuration. DEFAULTSCHARACTER_FORMATUTF8%DEFAULTSGEOMETRY_FORMAT Compressed"DEFAULTSGEOMETRY_STORAGEInLineDEFAULTS BLOB_STORAGEInLineDEFAULTS MAX_FILE_SIZE1TB DEFAULTSRASTER_STORAGEInLine9 TEXT_UTF16UI_TEXT$The UTF16 text format configuration.# TEXT_UTF16CHARACTER_FORMATUTF16HMAX_FILE_SIZE_4GBUI_TEXT,The 4GB maximum datafile size configuration.%MAX_FILE_SIZE_4GB MAX_FILE_SIZE4GBLMAX_FILE_SIZE_256TBUI_TEXT.The 256TB maximum datafile size configuration.)MAX_FILE_SIZE_256TB MAX_FILE_SIZE256TBHGEOMETRY_UNCOMPRESSEDUI_TEXT(The Uncompressed Geometry configuration.4GEOMETRY_UNCOMPRESSEDGEOMETRY_FORMAT UncompressedBGEOMETRY_OUTOFLINEUI_TEXT%The Outofline Geometry configuration./GEOMETRY_OUTOFLINEGEOMETRY_STORAGE OutOfLine:BLOB_OUTOFLINEUI_TEXT!The Outofline Blob configuration.'BLOB_OUTOFLINE BLOB_STORAGE OutOfLineTGEOMETRY_AND_BLOB_OUTOFLINEUI_TEXT.The Outofline Geometry and Blob configuration.8GEOMETRY_AND_BLOB_OUTOFLINEGEOMETRY_STORAGE OutOfLine4GEOMETRY_AND_BLOB_OUTOFLINE BLOB_STORAGE OutOfLineFTERRAIN_DEFAULTSUI_TERRAIN_TEXT#The terrains default configuration.-TERRAIN_DEFAULTSGEOMETRY_STORAGE OutOfLine)TERRAIN_DEFAULTS BLOB_STORAGE OutOfLineTMOSAICDATASET_DEFAULTSUI_MOSAIC_TEXT,The Outofline Raster and Blob configuration.1MOSAICDATASET_DEFAULTSRASTER_STORAGE OutOfLine/MOSAICDATASET_DEFAULTS BLOB_STORAGE OutOfLineNMOSAICDATASET_INLINEUI_MOSAIC_TEXT(The mosaic dataset inline configuration.,MOSAICDATASET_INLINECHARACTER_FORMATUTF81MOSAICDATASET_INLINEGEOMETRY_FORMAT Compressed.MOSAICDATASET_INLINEGEOMETRY_STORAGEInLine*MOSAICDATASET_INLINE BLOB_STORAGEInLine(MOSAICDATASET_INLINE MAX_FILE_SIZE1TB,MOSAICDATASET_INLINERASTER_STORAGEInLinegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/gdb0000644003401500001440000000000413614004466026044 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000001.TablesByName.atx0000644003401500001440000001002613614004466031436 0ustar rouaultusers  gdb_dbtune gdb_itemrelationships gdb_itemrelationshiptypes gdb_items gdb_itemtypes gdb_replicalog gdb_spatialrefs gdb_systemcatalog sample2 gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000004.gdbtablx0000644003401500001440000001204013614004466030125 0ustar rouaultusers~gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000006.CatRelsByType.atx0000644003401500001440000001002613614004466031627 0ustar rouaultusers{DC78F1AB-34E4-43AC-BA47-1C4EABD0E7C7}&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.gdbindexes0000644003401500001440000000045013614004466030455 0ustar rouaultusers FDO_ObjectIDObjectIDCatItemTypesByUUIDUUIDCatItemTypesByParentTypeID ParentTypeIDCatItemTypesByNameNamegdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a0000000b.freelist0000644003401500001440000004053013614004466030236 0ustar rouaultusersL4&gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_nan_m_with_curves.gdb/a00000005.gdbtable0000644003401500001440000000341313614004466030107 0ustar rouaultusers"Z (ZObjectIDUUID & ParentTypeID &Name.i3_cI s&)w]GOB Parcel Fabric0!قGC0M(mM&Nag}Replica Dataset(NbC@E(mM&Nag}Replica(7u5vd3Hx<|(&)w]GOBTerrain->E\羴7fHJ(xeE9ӱխ'B?3Folder-eXE#mѠ{G(mM&Nag} Sync Dataset/5EJwӃb!4nG*i9Raster Catalog'7fHJ( 48 2 49 2 49 3 48 3 48 2 bar -48 2 -49 2 -49 3 -48 3 -48 2 baz gdalautotest-3.0.4/ogr/data/multipointz_without_m.shx0000644003401500001440000000015413614004466022555 0ustar rouaultusers' 6?@@@@24gdalautotest-3.0.4/ogr/data/ramapping.fmt0000644003401500001440000003744113614004466020033 0ustar rouaultusersROW_BYTES = 172 COLUMNS = 25 OBJECT = COLUMN COLUMN_NUMBER = 1 NAME = LONGITUDE DATA_TYPE = ASCII_REAL POSITIVE_LONGITUDE_DIRECTION = EAST START_BYTE = 1 BYTES = 8 FORMAT = "F8.4" UNIT = DEGREE DESCRIPTION = "East longitude of the target of the detector boresight in body fixed (IAU2000), planetocentric coordinates. Values of latitude, longitude and radius are interpolated from the frame midpoint in the MOLA PEDR and are not as precise as individual altimetry data." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 2 NAME = LATITUDE DATA_TYPE = ASCII_REAL START_BYTE = 9 BYTES = 9 FORMAT = "F9.4" UNIT = DEGREE DESCRIPTION = "North latitude of the target of the detector boresight in body fixed (IAU2000), planetocentric coordinates." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 3 NAME = MARS_RADIUS DATA_TYPE = ASCII_REAL START_BYTE = 18 BYTES = 10 FORMAT = "F10.1" UNIT = METER DESCRIPTION = "The magnitude of the vector from the center of mass of Mars to the detector boresight target point, in meters, averaged at the frame midpoint." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 4 NAME = EPHEMERIS_TIME DATA_TYPE = ASCII_REAL START_BYTE = 28 BYTES = 13 FORMAT = "F13.2" UNIT = SECOND DESCRIPTION = "Ephemeris Time in seconds past J2000. For a half-frame of 10 shots, this corresponds to the end of noise counting for shot 5, and the start of noise counting for shot 6. The target position of the detector boresight is calculated at this time." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 5 NAME = NORMALIZED_POWER_1 DATA_TYPE = ASCII_REAL START_BYTE = 41 BYTES = 7 FORMAT = "F7.3" DESCRIPTION = "Spectral radiance of surface in the detector field of view at 1064 nm wavelength from MOLA channel 1, averaged over the 1 s half-frame. Power has been normalized to a constant Mars mean solar distance. The solar irradiance at 1 AU at 1064 nm is 647 mW per meter squared per nm, or 279 mW per meter squared per nm at Mars. Spectral SOLAR_RADIANCE from a perfectly Lambertian scattering surface is nominally 279 times the cosine of the SOLAR_ZENITH_ANGLE divided by pi steradians, or ~89 mW/(m^2 sr nm), although at high solar incidence the contribution of scattered light may be substantial. The radiance factor I/F commonly used in astronomy is given by: I/F = NORMALIZED_POWER/SOLAR_RADIANCE. This ratio may range from 0 to greater than 1, depending on surface albedo and phase angle. The MOLA measurements of I/F often exceed unity, owing to an undetermined calibration scale factor. An empirical factor of 0.7 applied to NORMALIZED_POWER produces values of I/F similar to those observed by the Hubble Space Telescope and other terrestrial instruments. Units are milliwatts per meter squared per steradian per nanometer." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 6 NAME = NORMALIZED_POWER_2 DATA_TYPE = ASCII_REAL START_BYTE = 48 BYTES = 7 FORMAT = "F7.3" DESCRIPTION = "Spectral radiance from MOLA channel 2, averaged over the 1 s half-frame, as described above. Units are milliwatts per meter squared per steradian per nanometer." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 7 NAME = RECEIVER_THRESHOLD_1 DATA_TYPE = ASCII_INTEGER START_BYTE = 55 BYTES = 4 FORMAT = "I4" DESCRIPTION = "An instrument parameter that sets the trigger threshold for photon detection on channel 1." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 8 NAME = RECEIVER_THRESHOLD_2 DATA_TYPE = ASCII_INTEGER START_BYTE = 59 BYTES = 4 FORMAT = "I4" DESCRIPTION = "An instrument parameter that sets the trigger threshold for photon detection on channel 2." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 9 NAME = RECEIVER_THRESHOLD_3 DATA_TYPE = ASCII_INTEGER START_BYTE = 63 BYTES = 4 FORMAT = "I4" DESCRIPTION = "An instrument parameter that sets the trigger threshold for photon detection on channel 3." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 10 NAME = RECEIVER_THRESHOLD_4 DATA_TYPE = ASCII_INTEGER START_BYTE = 67 BYTES = 4 FORMAT = "I4" DESCRIPTION = "An instrument parameter that sets the trigger threshold for photon detection on channel 4." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 11 NAME = MARS_RANGE DATA_TYPE = ASCII_REAL START_BYTE = 71 BYTES = 8 FORMAT = "F8.0" UNIT = METER DESCRIPTION = "The magnitude of the vector from the MOLA instrument to the target point, averaged from the valid MOLA ground returns in the 1-second half frame." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 12 NAME = EMISSION_ANGLE DATA_TYPE = ASCII_REAL START_BYTE = 79 BYTES = 8 FORMAT = "F8.3" UNIT = DEGREE DESCRIPTION = "The angle between the vector from Mars center of mass to the target point, and the vector from the target point to MOLA. This angle varies slowly and thus is computed once at the midpoint of each 2-second data frame, likewise values in columns 13-18." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 13 NAME = OFF_NADIR_ANGLE DATA_TYPE = ASCII_REAL START_BYTE = 87 BYTES = 8 FORMAT = "F8.3" UNIT = DEGREE DESCRIPTION = "The angle between the vector from MOLA to the target point and the vector from MOLA to Mars center of mass. Also known as LOOK_ANGLE." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 14 NAME = LOCAL_TIME DATA_TYPE = ASCII_REAL START_BYTE = 95 BYTES = 8 FORMAT = "F8.4" DESCRIPTION = "The local true solar time in hours of 24 in a Martian Sol at the target point, as a decimal number." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 15 NAME = SOLAR_PHASE_ANGLE DATA_TYPE = ASCII_REAL START_BYTE = 103 BYTES = 8 FORMAT = "F8.3" UNIT = DEGREE DESCRIPTION = "The solar phase angle between a vector from the target point to the Sun, and a vector from the target point to MOLA." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 16 NAME = SOLAR_ZENITH_ANGLE DATA_TYPE = ASCII_REAL START_BYTE = 111 BYTES = 8 FORMAT = "F8.3" UNIT = DEGREE DESCRIPTION = "The solar zenith angle between a vector from the target point to the Sun, and a vector from Mars center of mass to the target point. Also known as SOLAR_INCIDENCE_ANGLE." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 17 NAME = SOLAR_LONGITUDE DATA_TYPE = ASCII_REAL START_BYTE = 119 BYTES = 9 FORMAT = "F9.4" UNIT = DEGREE DESCRIPTION = "The solar longitude at Mars, a seasonal variable that is usually abbreviated L sub s." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 18 NAME = ANOMALY_FLAG DATA_TYPE = ASCII_INTEGER START_BYTE = 128 BYTES = 2 FORMAT = "I2" DESCRIPTION = "A flag that is set to 0 for an error-free packet. If spacecraft attitude data was absent for some (2) or all (3) of the 2-second data frame, the MGS Spacecraft pointing is assumed nadir and the observation angles are approximated accordingly. If there were no ground returns in the data frame, this flag is increased by 4." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 19 NAME = NOISE_COUNTS_1 DATA_TYPE = ASCII_INTEGER START_BYTE = 130 BYTES = 7 FORMAT = "I7" DESCRIPTION = "The number of noise counts received on channel 1, sum of ten values taken at the RECEIVER_THRESHOLD_1 during the ten measurements that make up a 1 second half-frame. These have been stored in the packet as a 5-bit binary logarithm with 3-bit mantissa. Due to downward rounding these values may be as much as 12% lower than the actual noise counts during a 1 second half-frame." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 20 NAME = NOISE_COUNTS_2 DATA_TYPE = ASCII_INTEGER START_BYTE = 137 BYTES = 7 FORMAT = "I7" DESCRIPTION = "The decimal number of noise counts received on channel 2, sum of ten values taken at the RECEIVER_THRESHOLD_2 during the ten measurements that make up a 1 second half-frame. These have been stored in the packet as described above." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 21 NAME = NOISE_COUNTS_3 DATA_TYPE = ASCII_INTEGER START_BYTE = 144 BYTES = 7 FORMAT = "I7" DESCRIPTION = "The decimal number of noise counts received on channel 3, sum of ten values taken at the RECEIVER_THRESHOLD_3 during the ten measurements that make up a 1 second half-frame. These have been stored in the packet as described above." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 22 NAME = NOISE_COUNTS_4 DATA_TYPE = ASCII_INTEGER START_BYTE = 151 BYTES = 7 FORMAT = "I7" DESCRIPTION = "The decimal number of noise counts received on channel 4, sum of ten values taken at the RECEIVER_THRESHOLD_4 during the ten measurements that make up a 1 second half-frame. These have been stored in the packet as described above." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 23 NAME = SEQUENCE_COUNT DATA_TYPE = ASCII_INTEGER START_BYTE = 154 BYTES = 6 FORMAT = "I6" MINIMUM = 0 MAXIMUM = 16383 DESCRIPTION = "This field contains a sequential count (modulo 16385) of each packet generated by the MOLA flight software. This counter is initialized at 0 at instrument restart, and increments by 1 on succeeding packets. When the counter reaches 16384, it is recorded as 0, as is the following packet. Each packet contains 14 half-frames of 10 shots. The spacecraft clock is not recorded in the first packet following instrument restart, so SEQUENCE_COUNT may be used to determine the timing of packets following instrument reset." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 24 NAME = ORBIT_NUMBER DATA_TYPE = ASCII_INTEGER START_BYTE = 160 BYTES = 6 FORMAT = "I6" DESCRIPTION = "The mapping mission orbit number determined by the Mars Global Surveyor Flight Operations system, plus 10000. Orbits increment at each spacecraft descending equator crossing. Numbers below 10000 were reserved for the Aerobraking Mission Phase, during which periapse passes numbered from 1 to 1682 were used as orbit number." END_OBJECT = COLUMN OBJECT = COLUMN COLUMN_NUMBER = 25 NAME = DETECTOR_TEMPERATURE DATA_TYPE = ASCII_REAL START_BYTE = 166 BYTES = 5 FORMAT = "F5.2" UNIT = DEGREES DESCRIPTION = "Temperature of the MOLA detector in degrees Centigrade obtained from a thermal model of the detector subassembly and temperature readings of the detector interface plate. This temperature is used to correct for the temperature response of the detector photodiode." END_OBJECT = COLUMN gdalautotest-3.0.4/ogr/data/nav.dat0000644003401500001440000000755613614004466016627 0ustar rouaultusersI 810 Version - THIS FILE IS A SHORT EXTRACT FROM THE FOLLOWING DATA MADE FOR OGR TESTING. data cycle 2007.12, build 20070153, metadata NavXP810. Copyright � 2007, Robin A. Peel (robin@xsquawkbox.net). This data is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program ("AptNavGNULicence.txt"); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. This product was developed using DAFIF (the Defense Aeronautical Flight Information File), a product of the US National Imagery and Mapping Agency (NIMA). NIMA requires the following warranty statements: (A) Under 10 U.S.C. 456, no civil action may be brought against the United States on the basis of the content of a navigational aid prepared or disseminated by either the former Defense Mapping Agency (DMA) or the National Imagery and Mapping Agency (NIMA). (B) The DAFIF product is provided "as is," and no warranty, express or implied, including, but not limited to the implied warranties of merchantability and fitness for particular purpose or arising by statute or otherwise in law or from a course of dealing or usage in trade, is made by NIMA as to the accuracy and functioning of the product. �: Neither NIMA nor its personnel will be liable for any claims, losses, or damages arising from or connected with the use of this product. The user agrees to hold harmless the United States National Imagery and Mapping Agency. The user's sole and exclusive remedy is to stop using the DAFIF product. 2 38.08776900 -077.32491900 284 396 25 0.0 APH A P HILL NDB 2 39.95305600 032.82805600 2749 356 100 0.0 ANK ANKARA NDB-DME 2 -18.79336100 047.45491700 0 364 25 0.0 IA ANTANANARIVO IVATO NDB 2 55.73616900 009.01858300 50 395 15 0.0 GE Billund LOM 3 57.10371900 009.99557800 57 11670 100 1.0 AAL AALBORG VOR-DME 3 25.27913900 049.48402800 576 11660 130 0.0 HSA AL AHSA VORTAC 3 30.51941700 -090.41750000 40 10960 25 3.0 HMU HAMMOND VOR 4 39.98091100 -075.87781400 660 10850 18 281.662 IMQS 40N 29 ILS-cat-I 4 63.98500000 -022.58361100 171 10950 18 90.103 IKF BIKF 11 ILS-cat-II 4 49.20028600 -123.15885700 1 11055 18 99.847 ITL CYVR 08L ILS-cat-III 5 40.03460600 -079.02328100 2272 10870 18 236.086 ISOZ 2G9 25 LOC 5 38.53261100 -077.85474700 315 10995 18 28.151 IDZH KCJR 04 LDA 5 40.02517500 -082.44837500 860 11090 18 87.061 IRXK KVTA 09 SDF 6 39.97729400 -075.86027500 655 10850 10 300281.662 IMQS 40N 29 GS 7 39.96071900 -075.75077800 660 0 0 281.662 ---- 40N 29 OM 8 -09.42187500 147.20833100 91 0 0 148.638 ---- AYPY 14L MM 9 65.60944400 -018.05222200 32 0 0 21.368 ---- BIAR 01 IM 12 -09.43270300 147.21644400 128 11010 18 0.200 IWG AYPY 14L DME-ILS 12 011.35347500 1911 11110 27 0.100 OEV LOWI 26 DME-ILS 12 57.10393300 009.99280800 57 11670 100 0.0 AAL AALBORG VOR-DME DME 12 32.48132800 -099.86345800 1810 11370 130 0.0 ABI ABILENE VORTAC DME 13 57.10393300 009.99280800 57 11670 199 0.0 AAL AALBORG TACAN DME 13 68.71941900 -052.79275300 172 10875 25 0.0 AS AASIAAT DME 13 10.83161100 072.17994400 13 11590 100 0.0 AT AGATTI NDB-DME DME 13 34.52852800 136.67516700 20 11205 50 0.0 AKT AKENO TACAN DME 99 gdalautotest-3.0.4/ogr/data/departs.shx0000755003401500001440000000017413614004470017522 0ustar rouaultusers' >MbX9?v/?Gz?{Gz?2 @ N gdalautotest-3.0.4/ogr/data/test.ods0000644003401500001440000002351213614004466017025 0ustar rouaultusersPK7@l9..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK7@ content.xml\ێ6}߯0ȼl.mMwy b h $n{KRԕ%uz =tȺ*Eo_p qhpc/x8x,'21S$f{1unh@Es%+Ru(͞ 0YfN3b'h%i",e~2KQX% ϏciJ]YjB1LUt钄i8\ J3$ӊe4D5QM @$l\:-nHYF*/*/F-Zw}LJu\HVpGT̜ZOɞ5u{z|E@%PUO&yW;0Z]SU?-pj0Ĕ j&U'_-¶`Q؞:xoI:'H p, Lb9o02*p-/)&< 87+^HٶjrB >\2b)TU ~j6 WYK, ECF3nO)U 3Xkc/Oy=q XInYy218]nP <#壤W/r JVCZSC6?h>8ɩܰKJY;OXeKNQI!^0aYN F)\u) _>j(/هͼ6K5&nجasQ7l٪16as7ۘ@0hQ]q1]CdABEfdq3ԌlDI+eޚeȶ ~?iBOWI!Qtj^ (ޅa +נl{JEOي5`05vynN+y#BR\Ԅ|"HX.L60m XikV[YSsòd-"Y*m! bamKc4sAkWӰz`| QNKb/I̟ݖUgme3EnoA lV0muNT uڶ2Dk*Ԏ.vt /RwNzg*A myC".)PR=C#%UBBA+mIrgap{evp`Xlmj4Ȫ .2`2oa2sUߙW;416Wh:f#z +c9杮s:<D.Z7LE7SlS 8*7ǂd]{6*N2(;gL=G> _.r'ƧM{$3{5#N€?NNxzoKQ@L<(IAO0c_V?WfAtXS?D(?l?/_PK"WPK7@ styles.xmlYm6_$RNvK 9UEJ!ݗ8Y$lg=U%;q6--8<~f<~f뛻, \"y"'{;[&1 H.!)(¯&vsaA_>+Hn6KUml%KomReN1[|'R'fNȲK.۽}:NfxnlpD-&fD)lۥn _L xՂخe::&L0_gMMcqU)T]voP5nO<8 Y6F<U4WqR0.GnAfQU(;stչ! n^җBE}jc/u]m %5 AqHވjHq8|UՌp Y!NT2ssĠ6~F~ÿO-L%w,$ MT˫Jk|H˴rT_M]DN!n\RTH3 ),*](*0 a&auV8C<CENc8OJ,Z2vWt p;`fjfWCOݼt}tDGB\W5.UrȪGK^D*!X:Vhfc#,9N<>y]Y G]Adʉ~}1랙M8+ Lj1$=svRc,Jh,#C=:iSUߤ3ώߊ #Z#NKуD>7"v:>2V/}I%]i#$tGo׵<3ɡh~444#J FFCM Tԋۍ'BUa"gAtx. G'03m`%WZLqxȄ3}1N/FvF,Tm!`֌zD J918p(wIkJn n__3gVΞ^gN2lXz)w%&ݥCb |kP]=yA{'0XMtwLJw7v ADo9EO2o{n7u(pT}>5j8|y[*t՟ ReA.W?UOdX4&ĥABeiir?֟8Rk֒GB/*dS yP*n_vռY%`LuHu x7ffMOTS' 'Lېjh@DgHLɾ v\Yo`AB-0xv߸c唅@` v6CO;/PK%'YPPK7@8-m~meta.xml Even Rouault2012-01-22T15:17:192012-01-23T20:32:30Even RouaultPT09H04M57S42OpenOffice.org/3.2$Unix OpenOffice.org_project/320m12$Build-9483PK7@Thumbnails/thumbnail.png? BZO-8]pjEQ}!h\J8[K6jfn 3dnh1bfcW<Ϋ{8n~&زێZ^n'pރ`$q#cݍ:D/bhA;Π{6ɩ PG/M4-VѠo5;ȱ$TנF9NoǷ+(#gv`>/0Vegr4(VĄ#/ ,U */eκq?L./wNS~8eUO/nyBAR{Ick\L6C~7!Nm~~S]i sZfCEWʞߢ< !'պWbG׆o-e /,(%N-ςf4t'mKhޒ4khx=W TN9r̀ s/ÙXlTA?+ױ#O9-7MÎ`1mdO9Ox;hԒ<.:,lrXSR5:N쮽Ϸ3QkAە¤vaajK7Ћ:Ō)JH#op_h2G˲ԯRe kfSZ '}v!)SqTwQ>;un_Np:.t=tC:E\vS'DRUnI㻻kc{Fݩ3W*jh:B15:Nm]"YQSݏM!⃡BX^?ſvHw19 m6#Nm|h5':T 2I *Ѕ+W?=yL忨YҭzYlzu)*rKev'"Ky)ƫr!e Bp %Uz%?Yr(7䊰Q=Hw1BQהz7w]Z}H,yJMoJdyPQZ~'g EZ҈Do Ӫ1eۀ 9.4 "!d+g\|yf5.<ͼ%---- Htv(M---2}Ѳ~Ô~%DZOox]i i i _6~ː~oҝ}Ϥ^@:82Z1.ڜI߸3|\M=n4b wty7%LD\3_A.)rpr:@"%0Dfl+z~5*DjCqyah4k _/bhO'J8 8$RAYܜ4faRwK!xKgo(? ']PY;-ī織|ъs~lf Ae.2gBA~9>cc:Pd@ %%: IbtEM+/H"0ODq˪Z'I?ynH[;^{ks$ tʷ|/uXYpC<(}.Fjv`jVZEzTZ/+!0J>l`|ʽkV5(Dv,Irr)RȻ0Xܦ)xt3%>ٱކmvnhC*~n,w:ݧxzS>Jb|"#m!@g<0rC CM<`{ -HM5#w⬒T6m<|ּ~PKDՀJhPK7@l9..mimetypePK7@"W Tcontent.xmlPK7@%'YP # styles.xmlPK7@8-m~Emeta.xmlPK7@q_ RThumbnails/thumbnail.pngPK7@'Configurations2/accelerator/current.xmlPK7@NConfigurations2/progressbar/PK7@Configurations2/floater/PK7@Configurations2/popupmenu/PK7@Configurations2/menubar/PK7@,Configurations2/toolbar/PK7@bConfigurations2/images/Bitmaps/PK7@Configurations2/statusbar/PK7@qz^yK settings.xmlPK7@DՀJh!META-INF/manifest.xmlPKF#gdalautotest-3.0.4/ogr/data/one_point_srid_4326.jml0000644003401500001440000000155513614004466021537 0ustar rouaultusers featureCollection feature geometry boundedBy 26.47,45.48 26.47,45.48 26.469678571428567,45.475142857142856 gdalautotest-3.0.4/ogr/data/natl_prof_bot.cdp.das0000644003401500001440000000164713614004466021432 0ustar rouaultusersAttributes { ogr_layer_info_1 { string layer_name normalized; string spatial_ref WGS84; string target_container location.profile; x_field { string name location.lon; string scope dds; } y_field { string name location.lat; string scope dds; } } ogr_layer_info_2 { string layer_name profiles; string spatial_ref WGS84; string target_container location; x_field { string name location.lon; string scope dds; } y_field { string name location.lat; string scope dds; } } ogr_layer_info_3 { string layer_name lines; string spatial_ref WGS84; string target_container location; x_field { string name location.profile.depth; string scope dds; } y_field { string name location.profile.T_20; string scope dds; } } } gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/0000755003401500001440000000000013614004466022550 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01AHDR.DDF0000644003401500001440000000176013614004466024220 0ustar rouaultusers007112L 0600061 3204000001500000102815ATPR04043ATTP567830000;&TR01AHDR0100;&DDF RECORD IDENTIFIER1600;&ATTRIBUTE PRIMARYMODN!RCID(A,I)1600;&PRIMARY ATTRIBUTESBANNER !SOURCE_DATE !DATE_QUALIFIER !QUAD_NUMBER !L_PRIM_INTERVAL !L_PB_INTERVAL !S_PRIM_INTERVAL !S_PB_INTERVAL !CODED_FLAG !EDGEWS !EDGEWR !EDGENS !EDGENR !EDGEES !EDGEER !EDGESS !EDGESR !VERTICAL_DATUM !SW_LATITUDE !SW_LONGITUDE !NW_LATITUDE !NW_LONGITUDE !NE_LATITUDE !NE_LONGITUDE !SE_LATITUDE !SE_LONGITUDE (A(72),A(4),A(1),A(3),4R(5),9A(1),A(20),8R(12))00297 R 00052 3204000100700ATPR01207ATTP22619 1AHDR 1USGS-NMD DLG DATA - CHARACTER FORMAT - 09-29-87 VERSION 1982 60 4 40 NGVD 36.125000 -75.750000 36.250000 -75.750000 36.250000 -75.625000 36.125000 -75.625000gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01ARDF.DDF0000644003401500001440000001740613614004466024222 0ustar rouaultusers005132L 0600061 3204000001500000102815ATPR04643ATTP363890000;&TR01ARDF0100;&DDF RECORD IDENTIFIER1600;&ATTRIBUTE PRIMARYMODN!RCID(A(4),I(6))1600;&PRIMARY ATTRIBUTESENTITY_LABEL !ARBITRARY_EXT !RELATION_TO_GROUND!VERTICAL_RELATION !OPERATIONAL_STATUS!ACCESS_RESTRICTION!OLD_RAILROAD_GRADE!WITH_RAILROAD !COVERED !HISTORICAL !LIMITED_ACCESS !PHOTOREVISED !LANES !ROAD_WIDTH !BEST_ESTIMATE !FUNCTIONAL_CLASS (A(7),11A(1),I(2),I(3),A(1),A(2))00094 R 00049 220400010700ATPR1107ATTP2718 1ARDF 11700005 -9-99  2ARDF 21700005 -9-99  3ARDF 31700005 -9-99  4ARDF 41700209 -9-99  5ARDF 51700209 -9-99  6ARDF 61700209 -9-99  7ARDF 71700209 -9-99  8ARDF 81700209 -9-99  9ARDF 91700209 -9-99  10ARDF 101700209 -9-99  11ARDF 111700209 -9-99  12ARDF 121700209 -9-99  13ARDF 131700209 -9-99  14ARDF 141700209 -9-99  15ARDF 151700209 -9-99  16ARDF 161700209 -9-99  17ARDF 171700005 -9-99  18ARDF 181700209 -9-99  19ARDF 191700005 -9-99  20ARDF 201700210 -9-99  21ARDF 211700005 -9-99  22ARDF 221700405 -9-99  23ARDF 231700405 -9-99  24ARDF 241700210 -9-99  25ARDF 251700210 -9-99  26ARDF 261700205 -9-99  27ARDF 271700205 -9-99  28ARDF 281700205 -9-99  29ARDF 291700205 -9-99  30ARDF 301700205 -9-99  31ARDF 311700205 -9-99  32ARDF 321700205 -9-99  33ARDF 331700205 -9-99  34ARDF 341700205 -9-99  35ARDF 351700205 -9-99  36ARDF 361700205 -9-99  37ARDF 371700205 -9-99  38ARDF 381700205 -9-99  39ARDF 391700205 -9-99  40ARDF 401700205 -9-99  41ARDF 411700205 -9-99  42ARDF 421700205 -9-99  43ARDF 431700205 -9-99  44ARDF 441700205 -9-99  45ARDF 451700205 -9-99  46ARDF 461700205 -9-99  47ARDF 471700209 -9-99  48ARDF 481700209 -9-99  49ARDF 491700209 -9-99  50ARDF 501700209 -9-99  51ARDF 511700209 -9-99  52ARDF 521700209 -9-99  53ARDF 531700209 -9-99  54ARDF 541700209 -9-99  55ARDF 551700209 -9-99  56ARDF 561700209 -9-99  57ARDF 571700209 -9-99  58ARDF 581700209 -9-99  59ARDF 591700209 -9-99  60ARDF 601700209 -9-99  61ARDF 611700209 -9-99  62ARDF 621700209 -9-99  63ARDF 631700209 -9-99  64ARDF 641700209 -9-99  65ARDF 651700209 -9-99  66ARDF 661700209 -9-99  67ARDF 671700209 -9-99  68ARDF 681700209 -9-99  69ARDF 691700209 -9-99  70ARDF 701700209 -9-99  71ARDF 711700209 -9-99  72ARDF 721700209 -9-99  73ARDF 731700209 -9-99  74ARDF 741700209 -9-99  75ARDF 751700209 -9-99  76ARDF 761700209 -9-99  77ARDF 771700209 -9-99  78ARDF 781700209 -9-99  79ARDF 791700209 -9-99  80ARDF 801700209 -9-99  81ARDF 811700209 -9-99  82ARDF 821700209 -9-99  83ARDF 831700209 -9-99  84ARDF 841700209 -9-99  85ARDF 851700209 -9-99  86ARDF 861700209 -9-99  87ARDF 871700209 -9-99  88ARDF 881700209 -9-99  89ARDF 891700209 -9-99  90ARDF 901700209 -9-99  91ARDF 911700209 -9-99  92ARDF 921700209 -9-99  93ARDF 931700209 -9-99  94ARDF 941700209 -9-99  95ARDF 951700209 -9-99  96ARDF 961700209 -9-99  97ARDF 971700209 -9-99  98ARDF 981700209 -9-99  99ARDF 991700209 -9-99  100ARDF 1001700209 -9-99  101ARDF 1011700209 -9-99  102ARDF 1021700209 -9-99  103ARDF 1031700209 -9-99  104ARDF 1041700209 -9-99  105ARDF 1051700209 -9-99  106ARDF 1061700209 -9-99  107ARDF 1071700209 -9-99  108ARDF 1081700209 -9-99  109ARDF 1091700209 -9-99  110ARDF 1101700209 -9-99  111ARDF 1111700209 -9-99  112ARDF 1121700209 -9-99  113ARDF 1131700209 -9-99  114ARDF 1141700209 -9-99  115ARDF 1151700209 -9-99  116ARDF 1161700209 -9-99  117ARDF 1171700209 -9-99  118ARDF 1181700209 -9-99  119ARDF 1191700209 -9-99  120ARDF 1201700209 -9-99  121ARDF 1211700209 -9-99  122ARDF 1221700209 -9-99  123ARDF 1231700209 -9-99  124ARDF 1241700209 -9-99  125ARDF 1251700209 -9-99  126ARDF 1261700209 -9-99  127ARDF 1271700209 -9-99  128ARDF 1281700209 -9-99  129ARDF 1291700209 -9-99  130ARDF 1301700209 -9-99  131ARDF 1311700209 -9-99  132ARDF 1321700209 -9-99  133ARDF 1331700209 -9-99  134ARDF 1341700209 -9-99  135ARDF 1351700209 -9-99  136ARDF 1361700209 -9-99  137ARDF 1371700209 -9-99  138ARDF 1381700209 -9-99  139ARDF 1391700209 -9-99  140ARDF 1401700209 -9-99  141ARDF 1411700209 -9-99  142ARDF 1421700209 -9-99  143ARDF 1431700209 -9-99  144ARDF 1441700209 -9-99  145ARDF 1451700209 -9-99  146ARDF 1461700209 -9-99  147ARDF 1471700209 -9-99  148ARDF 1481700209 -9-99  149ARDF 1491700209 -9-99  150ARDF 1501700209 -9-99  151ARDF 1511700209 -9-99  152ARDF 1521700209 -9-99  153ARDF 1531700209 -9-99  154ARDF 1541700209 -9-99  155ARDF 1551700209 -9-99  156ARDF 1561700209 -9-99  157ARDF 1571700218 -9-99  158ARDF 1581700218 -9-99  159ARDF 1591700218 -9-99  160ARDF 1601700218 -9-99  161ARDF 1611700218 -9-99  162ARDF 1621700218 -9-99  163ARDF 1631700218 -9-99  164ARDF 1641700218 -9-99 gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01CATD.DDF0000644003401500001440000000360713614004466024217 0ustar rouaultusers001602L 0600049 22040000150000012815CATD68430000;&TR01CATD0100;&DDF RECORD IDENTIFIER1600;&CATALOG/DIRECTORYMODN!RCID!NAME!TYPE!FILE!EXTR!MVER(A,I,5A)00111 R 00039 21040001070CATD657 1CATD 1IDENIdentification TR01IDEN.DDFN  2CATD 2CATDCatalog/Directory TR01CATD.DDFN  3CATD 3CATXCatalog/Cross-Reference TR01CATX.DDFN  4CATD 4CATSCatalog/Spatial Domain TR01CATS.DDFN  5CATD 5IREFInternal Spatial ReferenceTR01IREF.DDFN  6CATD 6XREFExternal Spatial ReferenceTR01XREF.DDFN  7CATD 7MDEFData Dictionary/DefinitionDLG3MDEF.DDFY 3.00 8CATD 8MDOMData Dictionary/Domain DLG3MDOM.DDFY 3.00 9CATD 9DDSHData Dictionary/Schema TR01DDSH.DDFN  10CATD 10STATTransfer Statistics TR01STAT.DDFN  11CATD 11DQHLLineage TR01DQHL.DDFN  12CATD 12DQPAPositional Accuracy TR01DQPA.DDFN  13CATD 13DQAAAttribute Accuracy TR01DQAA.DDFN  14CATD 14DQLCLogical Consistency TR01DQLC.DDFN  15CATD 15DQCGCompleteness TR01DQCG.DDFN  16CATD 16ARDFAttribute Primary TR01ARDF.DDFN  17CATD 17ARDMAttribute Primary TR01ARDM.DDFN  18CATD 18AHDRAttribute Primary TR01AHDR.DDFN  19CATD 19FF01Composite TR01FF01.DDFN  20CATD 20NP01Point-Node TR01NP01.DDFN  21CATD 21NA01Point-Node TR01NA01.DDFN  22CATD 22NO01Point-Node TR01NO01.DDFN  23CATD 23LE01Line TR01LE01.DDFN  24CATD 24PC01Polygon TR01PC01.DDFN gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01NP01.DDF0000644003401500001440000000053513614004466024157 0ustar rouaultusers001842L 0600057 22040000150000012815PNTS4943SADR35920000;&TR01NP010100;&DDF RECORD IDENTIFIER1600;&POINT-NODEMODN!RCID!OBRP(A(4),I(6),A(2))1600;&SPATIAL ADDRESSX!Y(2B(32))00078 R 00049 220400010700PNTS1307SADR0920 1NP01 1NPE 2NP01 2NPl 3NP01 3NPAM 4NP01 4NP%gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/README0000644003401500001440000000102613614004466023427 0ustar rouaultusersDataset originally downloaded at wget http://thor-f5.er.usgs.gov/sdts/datasets/tvp/dlg3/24K/martin_point/D3607551_rd0s_1_sdts.tar.gz This is an extract to make it small. The following files have been removed as unncesseray for the OGR SDTS driver : 3961 TR01CATS.DDF 4709 TR01DDSH.DDF 1177 TR01DQAA.DDF 983 TR01DQCG.DDF 3637 TR01DQHL.DDF 2369 TR01DQLC.DDF 2202 TR01DQPA.DDF 1629 TR01STAT.DDF And the following files have been truncated to be smaller : (original size below) 41420 TR01LE01.DDF 11684 TR01NO01.DDF gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01LE01.DDF0000644003401500001440000001717413614004466024151 0ustar rouaultusers004412L 0600106 2304000015000000128015LINE43043ATID42086PIDL44128PIDR45172SNID41217ENID39258SADR382970000;&TR01LE010100;&DDF RECORD IDENTIFIER1600;&LINEMODN!RCID!OBRP(A(4),I(6),A(2))2600;&ATTRIBUTE ID*MODN!RCID(A(4),I(6))1600;&POLYGON ID LEFTMODN!RCID(A(4),I(6))1600;&POLYGON ID RIGHTMODN!RCID(A(4),I(6))1600;&STARTNODE IDMODN!RCID(A(4),I(6))1600;&ENDNODE IDMODN!RCID(A(4),I(6))2600;&SPATIAL ADDRESS*X!Y((2B(32)))00881 D 00088 3204000100700LINE01307PIDL01120PIDR01131SNID01142ENID01153SADR72964 1LE01 1LEPC01 2PC01 1NO01 143NO01 144%&b-Ԟ/m l R! Վ!v+!i"PCk"#*ֻ#Z#4($4pg$׬h%j%{$%`&؜&(&f'^Qh'ٍ'(i$(B%)C~d)ں**2*o!+'۫`+a,#,n_,ܛ- -w]-P_.Q݌./+/[A/}[06޹0121}nU1ߪ22"2_3`3S4;4kO45E5O6@Q6|67) 718mM8p㩋89 !9z^ 9 :SJ:;.N;];<7F<?H={=~=>0>lD>稃?b? @<]@l@@BAFAM00881 D 00088 3204000100700LINE01307PIDL01120PIDR01131SNID01142ENID01153SADR72964 2LE01 2LEPC01 2PC01 1NO01 144NO01 145AMNNpN~O MO;JOyOPDPZEP)tQMQQ?RVfoRq5R S":SziSrT*BT5TU3UUNmV<VVWEhWZW)X3XibXYfYr6.Y]Z#ԍZ{6Zse[+B[[\5\\N]=]]N^F}^Z^*_OI_x``g`6DaFtaabNs?bBbcW c:dd`Ndereief[>f*mgg_g8hghhh6hi3iqcisj_Bj/k^kgklO*lpl00745 D 00088 3204000100700LINE01307PIDL01120PIDR01131SNID01142ENID01153SADR59364 3LE01 3LEPC01 2PC01 1NO01 1NO01 143>>c\>S,===J&<Wn<\><;;R:K:|:I^9/99@?8p8q87B7737.d66}T6$%5'5tX54g4j43MR3`~#322W1Ae1r51N000E5w/fH//;&..).2Z-h-8-( - ,N,\{,K++S*B*sP*J!)))A6)&gc(4(u('*'l[v'F&&b&G%00178 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR3364 4LE01 4LEPC01 3PC01 1NO01 2NO01 1??1>>>00162 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR1764 5LE01 5LEPC01 4PC01 1NO01 3NO01 2?\?00162 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR1764 6LE01 6LEPC01 5PC01 1NO01 4NO01 3X??\00194 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR4964 7LE01 7LEPC01 6PC01 1NO01 5NO01 4_A9 @>y@eoI@ ?X?00178 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR3364 8LE01 8LEPC01 7PC01 1NO01 6NO01 5,AA^AT_A900170 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR2564 9LE01 9LEPC01 8PC01 1NO01 7NO01 6yOB{7B,A00178 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR3364 10LE01 10LEPC01 9PC01 1NO01 8NO01 7C"BJgB\yOB00194 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR4964 11LE01 11LEPC01 10PC01 1NO01 146NO01 9E%DVTD%CCfCX00170 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR2564 12LE01 12LEPC01 11PC01 1NO01 9NO01 8CXC C"00617 D 00088 3204000100700LINE01307PIDL01120PIDR01131SNID01142ENID01153SADR46564 13LE01 13LEPC01 2PC01 1NO01 145NO01 108l)0P踆|9@G_OKnJ ^'"MNn62\乒}SARkP$V_3#ZYoB2  iຝ ~^ B] " x ߍ Q 1a  Wޜ`?$hffݬ(o3uܻk,C+|2C00162 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR1764 14LE01 14LEPC01 12PC01 1NO01 108NO01 109|2C6 600170 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR2564 15LE01 15LEPC01 13PC01 1NO01 109NO01 1106 6.00170 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR2564 16LE01 16LEPC01 2PC01 1NO01 110NO01 111ʮ۸X00194 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR4964 17LE01 17LEPC01 2PC01 1NO01 111NO01 112۸XێpRn=0ڼ00170 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR2564 18LE01 18LEPC01 2PC01 1NO01 112NO01 113ڼcڝo00186 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR4164 19LE01 19LEPC01 2PC01 1NO01 113NO01 114oaL%s400162 D 00081 220400010700LINE1307PIDL1120PIDR1131SNID1142ENID1153SADR1764 20LE01 20LEPC01 2PC01 1NO01 114NO01 115X00353 D 00088 3204000100700LINE01307PIDL01120PIDR01131SNID01142ENID01153SADR20164 21LE01 21LEPC01 10PC01 1NO01 115NO01 146Xr٭3p4+ؼv؀8C:˹`׏zSyI;o֞b&~(?ծ>q58Խ]ԁBE00181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 22LE01 22LEARDF 4PC01 2PC01 2NO01 103NO01 104jd00181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 23LE01 23LEARDF 5PC01 13PC01 2NO01 104NO01 105dY>.00181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 24LE01 24LEARDF 6PC01 12PC01 2NO01 105NO01 106Y>.L400181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 25LE01 25LEARDF 7PC01 2PC01 2NO01 106NO01 107L4EM00181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 26LE01 26LEARDF 8PC01 12PC01 2NO01 106NO01 108L4|2C00181 D 00089 220400010700LINE1307ATID1120PIDL1131PIDR1142SNID1153ENID1164SADR1775 27LE01 27LEARDF 9PC01 13PC01 12NO01 105NO01 109Y>.6 6gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01CATX.DDF0000644003401500001440000000130513614004466024234 0ustar rouaultusers001662L 0600049 22040000150000012815CATX74430000;&TR01CATX0100;&DDF RECORD IDENTIFIER1600;&CATALOG/CROSS-REFERENCEMODN!RCID!NAM1!TYP1!NAM2!TYP2!COMT(A,I,5A)00264 D 00041 310400010070CATX2167 1CATX 1DQHLLineageNP*Point-NodeThe modules starting with "NP" are part of the Data Quality/Lineage report. The NP modules contain control points used for transformations in the DLG data collection process.00279 D 00041 310400010070CATX2317 2CATX 2DQLCLogical ConsistencyA*Attribute PrimaryThe attribute modules (all modules with the name starting with "A") use the null scheme for fixed length subfields mentioned in the Data Quality/Logical Consistency report.gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01PC01.DDF0000644003401500001440000000431513614004466024144 0ustar rouaultusers001882L 0600057 22040000150000012815POLY4643ATID42890000;&TR01PC010100;&DDF RECORD IDENTIFIER1600;&POLYGONMODN!RCID!OBRP(A(4),I(6),A(2))2600;&ATTRIBUTE ID*MODN!RCID(A(4),I(6))00059 D 00039 21040001070POLY137 1PC01 1PW00059 D 00039 21040001070POLY137 2PC01 2PC00059 D 00039 21040001070POLY137 3PC01 3PC00059 D 00039 21040001070POLY137 4PC01 4PC00059 D 00039 21040001070POLY137 5PC01 5PC00059 D 00039 21040001070POLY137 6PC01 6PC00059 D 00039 21040001070POLY137 7PC01 7PC00059 D 00039 21040001070POLY137 8PC01 8PC00059 D 00039 21040001070POLY137 9PC01 9PC00059 D 00039 21040001070POLY137 10PC01 10PC00059 D 00039 21040001070POLY137 11PC01 11PC00059 D 00039 21040001070POLY137 12PC01 12PC00059 D 00039 21040001070POLY137 13PC01 13PC00059 D 00039 21040001070POLY137 14PC01 14PC00059 D 00039 21040001070POLY137 15PC01 15PC00059 D 00039 21040001070POLY137 16PC01 16PC00059 D 00039 21040001070POLY137 17PC01 17PC00059 D 00039 21040001070POLY137 18PC01 18PC00059 D 00039 21040001070POLY137 19PC01 19PC00059 D 00039 21040001070POLY137 20PC01 20PC00059 D 00039 21040001070POLY137 21PC01 21PC00059 D 00039 21040001070POLY137 22PC01 22PC00059 D 00039 21040001070POLY137 23PC01 23PC00059 D 00039 21040001070POLY137 24PC01 24PC00059 D 00039 21040001070POLY137 25PC01 25PC00059 D 00039 21040001070POLY137 26PC01 26PC00059 D 00039 21040001070POLY137 27PC01 27PC00059 D 00039 21040001070POLY137 28PC01 28PC00059 D 00039 21040001070POLY137 29PC01 29PC00059 D 00039 21040001070POLY137 30PC01 30PC00059 D 00039 21040001070POLY137 31PC01 31PC00059 D 00039 21040001070POLY137 32PC01 32PC00059 D 00039 21040001070POLY137 33PC01 33PC00059 D 00039 21040001070POLY137 34PC01 34PC00059 D 00039 21040001070POLY137 35PC01 35PCgdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01NA01.DDF0000644003401500001440000000316213614004466024137 0ustar rouaultusers002332L 0600070 2304000015000000128015PNTS49043SADR35092ARID361270000;&TR01NA010100;&DDF RECORD IDENTIFIER1600;&POINT-NODEMODN!RCID!OBRP(A(4),I(6),A(2))1600;&SPATIAL ADDRESSX!Y(2B(32))1600;&AREA IDMODN!RCID(A(4),I(6))00097 R 00057 220400010700PNTS1307SADR0920ARID1129 1NA01 2NA+rPC01 2 2NA01 3NA.OPC01 3 3NA01 4NAEPC01 4 4NA01 5NAԉPC01 5 5NA01 6NATtePC01 6 6NA01 7NAdPC01 7 7NA01 8NA}jԍPC01 8 8NA01 9NA0ԕ.PC01 9 9NA01 10NAJPC01 10 10NA01 11NA GPC01 11 11NA01 12NA-!PC01 12 12NA01 13NA3~YPC01 13 13NA01 14NAaU՝PC01 14 14NA01 15NA "PC01 15 15NA01 16NAԦsPC01 16 16NA01 17NA6ֹPC01 17 17NA01 18NA[֥PC01 18 18NA01 19NA>ձPC01 19 19NA01 20NA4KV^PC01 20 20NA01 21NAaAPC01 21 21NA01 22NAPC01 22 22NA01 23NAPC01 23 23NA01 24NA,֔=PC01 24 24NA01 25NAiPC01 25 25NA01 26NA\ԈPC01 26 26NA01 27NA@PC01 27 27NA01 28NA`PC01 28 28NA01 29NA7YԨ PC01 29 29NA01 30NA$PC01 30 30NA01 31NAמKPC01 31 31NA01 32NAdPC01 32 32NA01 33NAg/ۻ6PC01 33 33NA01 34NAf PC01 34 34NA01 35NApԩPC01 35gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01XREF.DDF0000644003401500001440000000034413614004466024243 0ustar rouaultusers001592L 0600049 22040000150000012815XREF67430000;&TR01XREF0100;&DDF RECORD IDENTIFIER1600;&EXTERNAL SPATIAL REFERENCEMODN!RCID!RSNM!HDAT!ZONE(A,I,3A)00069 D 00039 21040001070XREF237 1XREF 1UTMNAS18gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01ARDM.DDF0000644003401500001440000000175513614004466024231 0ustar rouaultusers002212L 0600057 22040000150000012815ATPR4643ATTP75890000;&TR01ARDM0100;&DDF RECORD IDENTIFIER1600;&ATTRIBUTE PRIMARYMODN!RCID(A(4),I(6))1600;&PRIMARY ATTRIBUTESROUTE_NUMBER !ROUTE_TYPE (A(7),A(9))00084 R 00049 220400010700ATPR1107ATTP1718 1ARDM 1SR 1200  2ARDM 2SR 1200  3ARDM 3SR 1200  4ARDM 4SR 1200  5ARDM 5SR 1200  6ARDM 6SR 1200  7ARDM 7SR 1200  8ARDM 8SR 1200  9ARDM 9SR 1200  10ARDM 10SR 1200  11ARDM 11SR 1200  12ARDM 12SR 1200  13ARDM 13SR 1200  14ARDM 14SR 1200  15ARDM 15SR 1200  16ARDM 16SR 1200  17ARDM 17SR 1200  18ARDM 18SR 1200  19ARDM 19SR 1200  20ARDM 20SR 1200  21ARDM 21SR 1200 gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01NO01.DDF0000644003401500001440000001567713614004466024173 0ustar rouaultusers002392L 0600070 2304000015000000128015PNTS49043SADR35092ATID421270000;&TR01NO010100;&DDF RECORD IDENTIFIER1600;&POINT-NODEMODN!RCID!OBRP(A(4),I(6),A(2))1600;&SPATIAL ADDRESSX!Y(2B(32))2600;&ATTRIBUTE ID*MODN!RCID(A(4),I(6))00078 D 00049 220400010700PNTS1307SADR0920 1NO01 1NO>>00078 D 00049 220400010700PNTS1307SADR0920 2NO01 2NO?00078 D 00049 220400010700PNTS1307SADR0920 3NO01 3NO?\00078 D 00049 220400010700PNTS1307SADR0920 4NO01 4NOX?00078 D 00049 220400010700PNTS1307SADR0920 5NO01 5NO_A900078 D 00049 220400010700PNTS1307SADR0920 6NO01 6NO,A00078 D 00049 220400010700PNTS1307SADR0920 7NO01 7NOyOB00078 D 00049 220400010700PNTS1307SADR0920 8NO01 8NOC"00078 D 00049 220400010700PNTS1307SADR0920 9NO01 9NOCX00078 D 00049 220400010700PNTS1307SADR0920 10NO01 10NO6)fi00078 D 00049 220400010700PNTS1307SADR0920 11NO01 11NOM00078 D 00049 220400010700PNTS1307SADR0920 12NO01 12NO600078 D 00049 220400010700PNTS1307SADR0920 13NO01 13NOu00078 D 00049 220400010700PNTS1307SADR0920 14NO01 14NOρ00078 D 00049 220400010700PNTS1307SADR0920 15NO01 15NOLԸ00078 D 00049 220400010700PNTS1307SADR0920 16NO01 16NOO{Դ00078 D 00049 220400010700PNTS1307SADR0920 17NO01 17NOԗM00078 D 00049 220400010700PNTS1307SADR0920 18NO01 18NO"|ԓw00078 D 00049 220400010700PNTS1307SADR0920 19NO01 19NO~00078 D 00049 220400010700PNTS1307SADR0920 20NO01 20NO#00078 D 00049 220400010700PNTS1307SADR0920 21NO01 21NOԓu00078 D 00049 220400010700PNTS1307SADR0920 22NO01 22NOc00078 D 00049 220400010700PNTS1307SADR0920 23NO01 23NOYS00078 D 00049 220400010700PNTS1307SADR0920 24NO01 24NO@900078 D 00049 220400010700PNTS1307SADR0920 25NO01 25NO00078 D 00049 220400010700PNTS1307SADR0920 26NO01 26NOsl00078 D 00049 220400010700PNTS1307SADR0920 27NO01 27NOO00078 D 00049 220400010700PNTS1307SADR0920 28NO01 28NO+ԏ00078 D 00049 220400010700PNTS1307SADR0920 29NO01 29NO6P00078 D 00049 220400010700PNTS1307SADR0920 30NO01 30NOqXx00078 D 00049 220400010700PNTS1307SADR0920 31NO01 31NO`Ԭ00078 D 00049 220400010700PNTS1307SADR0920 32NO01 32NO(00078 D 00049 220400010700PNTS1307SADR0920 33NO01 33NOE 00078 D 00049 220400010700PNTS1307SADR0920 34NO01 34NO00078 D 00049 220400010700PNTS1307SADR0920 35NO01 35NO_1՝,00078 D 00049 220400010700PNTS1307SADR0920 36NO01 36NO/X00078 D 00049 220400010700PNTS1307SADR0920 37NO01 37NO$eC00078 D 00049 220400010700PNTS1307SADR0920 38NO01 38NOUչ00078 D 00049 220400010700PNTS1307SADR0920 39NO01 39NOyL00078 D 00049 220400010700PNTS1307SADR0920 40NO01 40NOnF 00078 D 00049 220400010700PNTS1307SADR0920 41NO01 41NO?|00078 D 00049 220400010700PNTS1307SADR0920 42NO01 42NO00078 D 00049 220400010700PNTS1307SADR0920 43NO01 43NOF^00078 D 00049 220400010700PNTS1307SADR0920 44NO01 44NO00078 D 00049 220400010700PNTS1307SADR0920 45NO01 45NO=00078 D 00049 220400010700PNTS1307SADR0920 46NO01 46NOq00078 D 00049 220400010700PNTS1307SADR0920 47NO01 47NON 00078 D 00049 220400010700PNTS1307SADR0920 48NO01 48NO00078 D 00049 220400010700PNTS1307SADR0920 49NO01 49NOT00078 D 00049 220400010700PNTS1307SADR0920 50NO01 50NOrլ00078 D 00049 220400010700PNTS1307SADR0920 51NO01 51NO*00078 D 00049 220400010700PNTS1307SADR0920 52NO01 52NOս00078 D 00049 220400010700PNTS1307SADR0920 53NO01 53NOխ00078 D 00049 220400010700PNTS1307SADR0920 54NO01 54NOՇV00078 D 00049 220400010700PNTS1307SADR0920 55NO01 55NOʉ՗00078 D 00049 220400010700PNTS1307SADR0920 56NO01 56NO2|00078 D 00049 220400010700PNTS1307SADR0920 57NO01 57NOq.00078 D 00049 220400010700PNTS1307SADR0920 58NO01 58NOb]00078 D 00049 220400010700PNTS1307SADR0920 59NO01 59NO{U00078 D 00049 220400010700PNTS1307SADR0920 60NO01 60NO"e%00078 D 00049 220400010700PNTS1307SADR0920 61NO01 61NOT {.00078 D 00049 220400010700PNTS1307SADR0920 62NO01 62NOlT00078 D 00049 220400010700PNTS1307SADR0920 63NO01 63NODn00078 D 00049 220400010700PNTS1307SADR0920 64NO01 64NOxW00078 D 00049 220400010700PNTS1307SADR0920 65NO01 65NOc00078 D 00049 220400010700PNTS1307SADR0920 66NO01 66NO jM!00078 D 00049 220400010700PNTS1307SADR0920 67NO01 67NO %A00078 D 00049 220400010700PNTS1307SADR0920 68NO01 68NOY6600078 D 00049 220400010700PNTS1307SADR0920 69NO01 69NO!00078 D 00049 220400010700PNTS1307SADR0920 70NO01 70NO.<00078 D 00049 220400010700PNTS1307SADR0920 71NO01 71NO1&00078 D 00049 220400010700PNTS1307SADR0920 72NO01 72NO5!00078 D 00049 220400010700PNTS1307SADR0920 73NO01 73NO>־00078 D 00049 220400010700PNTS1307SADR0920 74NO01 74NOBֳ00078 D 00049 220400010700PNTS1307SADR0920 75NO01 75NOG֪00078 D 00049 220400010700PNTS1307SADR0920 76NO01 76NOQq֒00078 D 00049 220400010700PNTS1307SADR0920 77NO01 77NOUֈ00078 D 00049 220400010700PNTS1307SADR0920 78NO01 78NOZX~V00078 D 00049 220400010700PNTS1307SADR0920 79NO01 79NOiUZ00078 D 00049 220400010700PNTS1307SADR0920 80NO01 80NOs-DK00078 D 00049 220400010700PNTS1307SADR0920 81NO01 81NOw800078 D 00049 220400010700PNTS1307SADR0920 82NO01 82NO,P00078 D 00049 220400010700PNTS1307SADR0920 83NO01 83NO:200078 D 00049 220400010700PNTS1307SADR0920 84NO01 84NOI00078 D 00049 220400010700PNTS1307SADR0920 85NO01 85NO{00078 D 00049 220400010700PNTS1307SADR0920 86NO01 86NOº֪E00078 D 00049 220400010700PNTS1307SADR0920 87NO01 87NO&Y00078 D 00049 220400010700PNTS1307SADR0920 88NO01 88NOgdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01IDEN.DDF0000644003401500001440000000131613614004466024216 0ustar rouaultusers002692L 0600065 330400000150000001028015IDEN105043CONF0561480000;&TR01IDEN0100;&DDF RECORD IDENTIFIER1600;&IDENTIFICATIONMODN!RCID!STID!STVS!DOCU!PRID!PRVS!PDOC!TITL!DAST!MPDT!DCDT!SCAL!COMT(A,I,10A,I,A)1600;&CONFORMANCEFFYN!VGYN!GTYN!RCYN!EXSP!FTLV(4A,2I)00449 R 00055 33040001007000IDEN375007CONF012382 1IDEN 1SPATIAL DATA TRANSFER STANDARD1994 JUNE 10FIPS PUB 173-1SDTS TOPOLOGICAL VECTOR PROFILEVERSION 1.0 JUNE 10, 1994FIPS 173-1 PART 4MARTIN POINT, NC / TRANSPORTATIONDLG-3198219960815 24000This transfer requires an external data dictionary from the U.S. Geological Survey, National Mapping Division, with a 4-character code of DLG3, version number 3.00YYYN14gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01IREF.DDF0000644003401500001440000000050413614004466024222 0ustar rouaultusers002002L 0600052 3204000001500000102815IREF105430000;&TR01IREF0100;&DDF RECORD IDENTIFIER1600;&INTERNAL SPATIAL REFERENCEMODN!RCID!SATP!XLBL!YLBL!HFMT!SFAX!SFAY!XORG!YORG!XHRS!YHRS(A,I,4A,6R)00124 D 00039 21040001070IREF787 1IREF 12-TUPLEEASTINGNORTHINGBI320.010.010.00.00.6100000.610000gdalautotest-3.0.4/ogr/data/D3607551_rd0s_1_sdts_truncated/TR01FF01.DDF0000644003401500001440000000057613614004466024142 0ustar rouaultusers002432L 0600070 2304000015000000128015COMP48043ATID42091FRID401330000;&TR01FF010100;&DDF RECORD IDENTIFIER1600;&COMPOSITEMODN!RCID!OBRP(A(4),I(6),A(2))2600;&ATTRIBUTE ID*MODN!RCID(A(4),I(6))2600;&FOREIGN ID*MODN!RCID(A(4),I(6))00139 D 00057 220400010700COMP1307ATID1120FRID5131 1FF01 1FFAHDR 1NP01 -4NA01 -35NO01 -146LE01 -179PC01 -35gdalautotest-3.0.4/ogr/data/esrihasmnozmultipoint.json0000644003401500001440000000160713614004466022722 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryMultiPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "hasM" : true, "points" : [ [2,49,1], [3,50,2] ], }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/ap01578l.lbl0000644003401500001440000000353113614004466017212 0ustar rouaultusersPDS_VERSION_ID = PDS3 RECORD_TYPE = FIXED_LENGTH FILE_RECORDS = 74786 RECORD_BYTES = 172 DATA_SET_ID = "MGS-M-MOLA-3-PRDR-L1A-V1.0" PRODUCT_ID = "MOLA-AP01578L.TAB" SPACECRAFT_NAME = "MARS GLOBAL SURVEYOR" INSTRUMENT_ID = MOLA INSTRUMENT_NAME = "MARS ORBITER LASER ALTIMETER" TARGET_NAME = MARS SOFTWARE_NAME = "DUMPRADIO3" NATIVE_START_TIME = -26518296.78241 NATIVE_STOP_TIME = -26416736.96149 SPACECRAFT_CLOCK_START_COUNT = "604676861:198" SPACECRAFT_CLOCK_STOP_COUNT = "604778421:155" START_TIME = 1999-059T13:47:19 STOP_TIME = 1999-060T17:59:59 MISSION_PHASE_NAME = "MAPPING" PRODUCT_CREATION_TIME = 2005-03-10T17:06:35 PRODUCER_ID = MGS_MOLA_TEAM PRODUCER_FULL_NAME = "DAVID E. SMITH" PRODUCER_INSTITUTION_NAME = "GODDARD SPACE FLIGHT CENTER" SOURCE_PRODUCT_ID = "AP01578L.B" ^TABLE = ("AP01578L.TAB",1) OBJECT = TABLE NAME = RAMAPPING INTERCHANGE_FORMAT = ASCII PRIMARY_KEY = "EPHEMERIS_TIME" START_PRIMARY_KEY = -26493039.38 STOP_PRIMARY_KEY = -26418159.56 ROWS = 74786 ^STRUCTURE = "RAMAPPING.FMT" DESCRIPTION = "The PRDR data product contains the along-track, time series of MOLA radiometry data from altimetry mode data in physical units, for a single UTC calendar day, with a filename APnnnnnv.TAB where nnnnn is the mapping orbit number plus 10000, and v stands for version." END_OBJECT = TABLE END gdalautotest-3.0.4/ogr/data/mitab/0000755003401500001440000000000013614004466016430 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/mitab/tab-win1251_text.map0000644003401500001440000000500013614004466022040 0ustar rouaultusers */#+#OWc9 7ܽ+/UWZ}EQ@M;@BH .A.Atem.Collections.IListClearSystem.Collections.IListIndexOfSystem.Collections.IListInsertSystem.Collections.IListRemoveSystem.Collections.IListRemoveAtSystem.Collections.IList get_CountSystem.Collections.IList get_SyncRootSystem.Collections.IListget_IsSynchronizedSystem.Collections.IListget_ItemSystem.Collections.IListset_ItemSystem.Collections.IListget_IsReadOnlySystem.Collections.IListget_IsFixedSizeSystem.Collections.IListAddESyj9 n@9 nfM;E X Wׄu-@BJTahomaTimes New Romangdalautotest-3.0.4/ogr/data/mitab/tab-win1251_text.tab0000644003401500001440000000042713614004466022041 0ustar rouaultusers!table !version 300 !charset WindowsCyrillic Definition Table Type NATIVE Charset "WindowsCyrillic" Fields 1 Char (10) ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "c81bf318-8ce1-4c02-9ac2-10b438b39bab" end_metadata gdalautotest-3.0.4/ogr/data/mitab/view_select_all_first_table_second_table.tab0000644003401500001440000000034513614004466027343 0ustar rouaultusers!Table !Version 100 Open Table "first_table" Hide Open Table "second_table" Hide Create View view_first_table_second_table As Select * From second_table, first_table Where second_table.joint_field=first_table.joint_fieldgdalautotest-3.0.4/ogr/data/mitab/win1251.mid0000644003401500001440000000026213614004466020231 0ustar rouaultusers" "," "," "," "," " " 1"," 2"," 3"," 4"," 5" "","",""," ","ۨ" gdalautotest-3.0.4/ogr/data/mitab/win1251_text.mid0000644003401500001440000000000213614004466021265 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/mitab/second_table.ind0000644003401500001440000000200013614004466021536 0ustar rouaultusersqd a>gdalautotest-3.0.4/ogr/data/mitab/tab-win1251_text.dat0000644003401500001440000000011513614004466022035 0ustar rouaultusersv A C gdalautotest-3.0.4/ogr/data/mitab/first_table.id0000644003401500001440000000000413614004466021236 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/mitab/view_first_table_second_table.tab0000644003401500001440000000035213614004466025152 0ustar rouaultusers!Table !Version 100 Open Table "first_table" Hide Open Table "second_table" Hide Create View view_first_table_second_table As Select ID,foo From second_table, first_table Where second_table.joint_field=first_table.joint_fieldgdalautotest-3.0.4/ogr/data/mitab/first_table.map0000644003401500001440000000500013614004466021420 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?!!H@@P@!!!! # gdalautotest-3.0.4/ogr/data/mitab/tab-win1251_text.id0000644003401500001440000000000413614004466021656 0ustar rouaultusersIgdalautotest-3.0.4/ogr/data/mitab/first_table.tab0000644003401500001440000000023113614004466021412 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 2 joint_field Integer Index 1 ; foo Char (254) ; gdalautotest-3.0.4/ogr/data/mitab/first_table.dat0000644003401500001440000000054513614004466021424 0ustar rouaultusersc ajoint_fielCfooC foogdalautotest-3.0.4/ogr/data/mitab/aspatial.dat0000644003401500001440000000014313614004466020716 0ustar rouaultusersc A idN 1 2 3gdalautotest-3.0.4/ogr/data/mitab/first_table.ind0000644003401500001440000000200013614004466021412 0ustar rouaultusersqd a>gdalautotest-3.0.4/ogr/data/mitab/tab-win1251.DAT0000644003401500001440000000053313614004466020635 0ustar rouaultuserst 3_C _C _C _C _C 1 2 3 4 5 ۨgdalautotest-3.0.4/ogr/data/mitab/aspatial.tab0000644003401500001440000000017213614004466020716 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 1 id Decimal (10,0) ; gdalautotest-3.0.4/ogr/data/mitab/aspatial.id0000644003401500001440000000001413614004466020537 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/mitab/aspatial.map0000644003401500001440000000200013614004466020715 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?6e6eʚ;ʚ;H@@P@gdalautotest-3.0.4/ogr/data/mitab/tab-win1251.TAB0000644003401500001440000000056613614004466020641 0ustar rouaultusers!table !version 300 !charset WindowsCyrillic Definition Table Type NATIVE Charset "WindowsCyrillic" Fields 5 _ Char (10) ; _ Char (10) ; _ Char (10) ; _ Char (10) ; _ Char (10) ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "9aed27fd-b1d1-4a40-a770-e305bca5cba2" end_metadata gdalautotest-3.0.4/ogr/data/mitab/tab-win1251.MAP0000644003401500001440000000500013614004466020634 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?›O,ǝ$ؤO:̝$HH}\[@N^@ޡX@VܞjC@?8\A8@^W{Gz?p= ף??tem.Collections.IListClearSystem.Collections.IListIndexOfSystem.Collections.IListInsertSystem.Collections.IListRemoveSystem.Collections.IListRemoveAtSystem.Collections.IList get_CountSystem.Collections.IList get_SyncRootSystem.Collections.IListget_IsSynchronizedSystem.Collections.IListget_ItemSystem.Collections.IListset_ItemSystem.Collections.IListget_IsReadOnlySystem.Collections.IListget_IsFixedSizeSystem.Collections.IListAddESyQOGʝ$MOɝ$uy HYOʝ$\%# 8uyZ\j\lngdalautotest-3.0.4/ogr/data/mitab/second_table.dat0000644003401500001440000000015313614004466021543 0ustar rouaultusersc a joint_fielCIDC dgdalautotest-3.0.4/ogr/data/mitab/win1251_text.mif0000644003401500001440000000023713614004466021301 0ustar rouaultusersVersion 650 Charset "WindowsCyrillic" DELIMITER ";" Columns 0 DATA TEXT "" 10 20 94 23 FONT ("DejaVu Serif",0,14,16711680) Justify Center gdalautotest-3.0.4/ogr/data/mitab/second_table.id0000644003401500001440000000000413614004466021362 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/mitab/win1251.mif0000644003401500001440000000132213614004466020231 0ustar rouaultusersVersion 300 Charset "WindowsCyrillic" Delimiter "," CoordSys Earth Projection 8, 1001, "m", 39, 0, 1, 7500000, 0 Bounds (-749281.53901, -10002137.4978) (15749281.539, 10002137.4978) Columns 5 _ Char(10) _ Char(10) _ Char(10) _ Char(10) _ Char(10) Data Point 7404648.72 6144520.22 Symbol (35,16711680,12) Pline 4 7404638.32 6144512.27 7404646.55 6144515.77 7404653.33 6144520.94 7404657.51 6144525.21 Pen (2,2,65280) Region 1 6 7404649.37 6144522.85 7404646.78 6144518.96 7404642.44 6144519.88 7404642.59 6144522.85 7404645.79 6144523.76 7404649.37 6144522.85 Pen (1,2,0) Brush (2,16777215,16777215) Center 7404645.9 6144521.36 gdalautotest-3.0.4/ogr/data/mitab/second_table.tab0000644003401500001440000000022513614004466021541 0ustar rouaultusers!table !version 300 !charset Neutral Definition Table Type NATIVE Charset "Neutral" Fields 2 joint_field Integer Index 1 ; ID Integer ; gdalautotest-3.0.4/ogr/data/mitab/tab-win1251.ID0000644003401500001440000000001413614004466020513 0ustar rouaultusers@gdalautotest-3.0.4/ogr/data/mitab/second_table.map0000644003401500001440000000200013614004466021541 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?6e6eʚ;ʚ;H@@P@gdalautotest-3.0.4/ogr/data/buggymultiline.shp0000644003401500001440000000034013614004466021105 0ustar rouaultusers' pY@Y@@:Y@Y@@Y@@Y@?Y@@Y@@gdalautotest-3.0.4/ogr/data/arcm_with_m.shx0000644003401500001440000000016413614004466020352 0ustar rouaultusers' :@@$@D@28nRgdalautotest-3.0.4/ogr/data/lines.vdc0000644003401500001440000000072713614004466017152 0ustar rouaultusersfile format : IDRISI Vector A.1 file title : id type : integer file type : binary object type : line ref. system : utm-31n ref. units : m unit dist. : 1 min. X : 400000 max. X : 600000 min. Y : 4000000 max. Y : 5000000 pos'n error : unknown resolution : unknown min. value : 1 max. value : 1 display min : 1 display max : 1 value units : value error : unknown flag value : none flag def'n : none legend cats : 0 gdalautotest-3.0.4/ogr/data/polygonm_without_m.shx0000644003401500001440000000016413614004466022024 0ustar rouaultusers' :??28nZgdalautotest-3.0.4/ogr/data/insert_only.dxf0000644003401500001440000000236613614004466020413 0ustar rouaultusers 0 SECTION 2 TABLES 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 44 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 STAR 70 0 10 0.0 20 0.0 30 0.0 3 STAR 1 0 LINE 5 45 100 AcDbEntity 8 0 62 256 100 AcDbLine 10 -0.0281474976710656 20 1.0414574138294284 30 0.0 11 0.6192449487634439 21 -1.0696049115004942 31 0.0 0 LINE 5 46 100 AcDbEntity 8 0 62 256 100 AcDbLine 10 0.6192449487634439 20 -1.0696049115004942 30 0.0 11 -0.9570149208162315 21 0.4785074604081158 31 0.0 0 LINE 5 47 100 AcDbEntity 8 0 62 256 100 AcDbLine 10 -0.9570149208162315 20 0.4785074604081158 30 0.0 11 1.0414574138294284 21 0.3659174697238533 31 0.0 0 LINE 5 48 100 AcDbEntity 8 0 62 256 100 AcDbLine 10 1.0414574138294284 20 0.3659174697238533 30 0.0 11 -0.4785074604081158 21 -1.0414574138294284 31 0.0 0 LINE 5 49 100 AcDbEntity 8 0 62 256 100 AcDbLine 10 -0.4785074604081158 20 -1.0414574138294284 30 0.0 11 -0.0562949953421313 21 1.0133099161583627 31 0.0 0 ENDBLK 5 4A 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 INSERT 5 55 100 AcDbEntity 8 0 62 256 100 AcDbBlockReference 2 STAR 10 79.0976537766561876 20 119.9621950624433424 30 0.0 44 1.0 45 1.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/expected_000_GRD.txt0000644003401500001440000000215013614004466020747 0ustar rouaultusers//$DELIMITER " " //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 1006} //$FIELDS Class=000_GRD;Subclass=000_GRD;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields idSel nom withdata Private#X Private#Y Private#Graphics -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-7130-LAMB93 0 50000.00 7130000.00 4 600000.00 7130000.00 600000.00 6580000.00 50000.00 6580000.00 50000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-7130-LAMB93 0 595000.00 7130000.00 4 1145000.00 7130000.00 1145000.00 6580000.00 595000.00 6580000.00 595000.00 7130000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0595-6585-LAMB93 0 595000.00 6585000.00 4 1145000.00 6585000.00 1145000.00 6035000.00 595000.00 6035000.00 595000.00 6585000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-1145-6250-LAMB93 0 1145000.00 6250000.00 4 1265000.00 6250000.00 1265000.00 6030000.00 1145000.00 6030000.00 1145000.00 6250000.00 -1 000_GRD 000_GRD 000_GRD 3 000-2007-0050-6585-LAMB93 0 50000.00 6585000.00 4 600000.00 6585000.00 600000.00 6035000.00 50000.00 6035000.00 50000.00 6585000.00 gdalautotest-3.0.4/ogr/data/folder_with_subfolder_placemark.kml0000644003401500001440000000020213614004466024425 0ustar rouaultusers MainFolder gdalautotest-3.0.4/ogr/data/poly_indexed.id0000644003401500001440000000005013614004466020330 0ustar rouaultusers=f 3gdalautotest-3.0.4/ogr/data/emptymultiline.shx0000644003401500001440000000015413614004466021141 0ustar rouaultusers' 6Y@Y@@2:gdalautotest-3.0.4/ogr/data/1B5X02NE.0000000644003401500001440000002222213614004466016621 0ustar rouaultusers019703LE1 0900245 ! 34040000155000000010470155DSID1650202DSSI1130367DSPM1300480VRID0780610ATTV0580688VRPC0720746VRPT0760818SGCC0600894SG2D0480954SG3D0701002FRID1001072FOID0701172ATTF0591242NATF0681301FFPC0901369FFPT0861459FSPC0901545FSPT09016350000;& 0001DSIDDSIDDSSI0001DSPM0001VRIDVRIDATTVVRIDVRPCVRIDVRPTVRIDSGCCVRIDSG2DVRIDSG3D0001FRIDFRIDFOIDFRIDATTFFRIDNATFFRIDFFPCFRIDFFPTFRIDFSPCFRIDFSPT0500;& ISO/IEC 8211 Record Identifier(b12)1600;& Data set identification fieldRCNM!RCID!EXPP!INTU!DSNM!EDTN!UPDN!UADT!ISDT!STED!PRSP!PSDN!PRED!PROF!AGEN!COMT(b11,b14,2b11,3A,2A(8),R(4),b11,2A,b11,b12,A)1600;& Data set structure information fieldDSTR!AALL!NALL!NOMR!NOCR!NOGR!NOLR!NOIN!NOCN!NOED!NOFA(3b11,8b14)1600;& Data set parameter fieldRCNM!RCID!HDAT!VDAT!SDAT!CSCL!DUNI!HUNI!PUNI!COUN!COMF!SOMF!COMT(b11,b14,3b11,b14,4b11,2b14,A)1600;& Vector record identifier fieldRCNM!RCID!RVER!RUIN(b11,b14,b12,b11)2600;& Vector record attribute field*ATTL!ATVL(b12,A)1600;& Vector record pointer control field*VPUI!VPIX!NVPT(b11,2b12)2600;& Vector record pointer field*NAME!ORNT!USAG!TOPI!MASK(B(40),4b11)1600;& Coordinate control fieldCCUI!CCIX!CCNC(b11,2b12)2500;& 2-D Coordinate field*YCOO!XCOO(2b24)2500;& 3-D Coordinate (sounding array) field*YCOO!XCOO!VE3D(3b24)1600;& Feature record identifier fieldRCNM!RCID!PRIM!GRUP!OBJL!RVER!RUIN(b11,b14,2b11,2b12,b11)1600;& Feature object identifier fieldAGEN!FIDN!FIDS(b12,b14,b12)2600;&-A Feature record attribute field*ATTL!ATVL(b12,A)2600;&-A Feature record national attribute field*ATTL!ATVL(b12,A)1600;& Feature record to feature object pointer control fieldFFUI!FFIX!NFPT(b11,2b12)2600;& Feature record to feature object pointer field*LNAM!RIND!COMT(B(64),b11,A)1600;& Feature record to spatial record pointer control fieldFSUI!FSIX!NSPT(b11,2b12)2600;& Feature record to spatial record pointer field*NAME!ORNT!USAG!MASK(B(40),3b11)00143 D 00049 220400010300DSID5503DSSI3658 1B5X02NE.00010199802231998022303.01.000068 D 00039 21040001030DSPM263 N  00110 D 00049 220400010300VRID0903SG3D4912n3@"l0@s9> 00146 D 00049 220400010300VRID0903SG3D8512nS*;AC?W8%>8`<S*;00067 D 00046 12040001300VRID903SG2D912n=$B00079 D 00053 12040001300VRID903ATTV512SG2D917x1Sa700079 D 00053 12040001300VRID903ATTV512SG2D917x1";00079 D 00053 12040001300VRID903ATTV512SG2D917x1 A00079 D 00053 12040001300VRID903ATTV512SG2D917 x1 q<00079 D 00053 12040001300VRID903ATTV512SG2D917 x1800067 D 00046 12040001300VRID903SG2D912 x^@:00067 D 00046 12040001300VRID903SG2D912 xy800067 D 00046 12040001300VRID903SG2D912 x900079 D 00053 12040001300VRID903ATTV512SG2D917x1NA00079 D 00053 12040001300VRID903ATTV512SG2D917x1B00079 D 00053 12040001300VRID903ATTV512SG2D917x1"<00079 D 00053 12040001300VRID903ATTV512SG2D917x 1"%>00079 D 00053 12040001300VRID903ATTV512SG2D917x 1"n@00079 D 00053 12040001300VRID903ATTV512SG2D917x 1C00079 D 00053 12040001300VRID903ATTV512SG2D917x 15C00067 D 00046 12040001300VRID903SG2D912x a700067 D 00046 12040001300VRID903SG2D912xa700067 D 00046 12040001300VRID903SG2D912xa700067 D 00046 12040001300VRID903SG2D912x ;00129 D 00057 220400010300VRID0903VRPT1912SG2D4131xx298,8&9700291 D 00070 3204000100300VRID00903ATTV00512VRPT01917SG2D185361xxA@R@?W>>Y==<;V;;F<F2<|;>j;;<|<L;<)J;^;00093 D 00057 220400010300VRID0903ATTV0512VRPT19171xx00190 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D89361xx *9H~999R9999U99r/:e;00110 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D09361xx800110 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D09361xx"a700097 D 00057 220400010300VRID0903VRPT1912SG2D0931xx BU800105 D 00057 220400010300VRID0903VRPT1912SG2D1731 xx.`8700097 D 00057 220400010300VRID0903VRPT1912SG2D0931!xx  C00080 D 00049 220400010300VRID0903VRPT1912"xx00080 D 00049 220400010300VRID0903VRPT1912#xx00142 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D4136$1xx Ad>=w==00142 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D4136% 1x x B@-?I?>00126 D 00065 220400010300VRID0903ATTV0512VRPT1917SG2D2536& 1x x @ANC00097 D 00057 220400010300VRID0903VRPT1912SG2D0931' x x "C00080 D 00049 220400010300VRID0903VRPT1912(xx 00080 D 00049 220400010300VRID0903VRPT1912)xx00080 D 00049 220400010300VRID0903VRPT1912*xx00080 D 00049 220400010300VRID0903VRPT1912+xx00080 D 00049 220400010300VRID0903VRPT1912,x x00080 D 00049 220400010300VRID0903VRPT1912- x x 00080 D 00049 220400010300VRID0903VRPT1912. x x 00093 D 00057 220400010300VRID0903ATTV0512VRPT1917/1xx00080 D 00049 220400010300VRID0903VRPT19120xx00097 D 00057 220400010300VRID0903VRPT1912SG2D09311x x a700205 D 00070 3204000100300FRID01303FOID00916ATTF00525FSPT105302d .O1   00207 D 00070 3204000100300FRID01303FOID00916ATTF00725FSPT105323d2Omu   00204 D 00070 3204000100300FRID01303FOID00916ATTF00425FSPT105294d4fOH   00104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT09305d<p}1n00112 D 00065 220400010300FRID1303FOID0916ATTF1325FSPT09386d<p}140000n00099 D 00057 220400010300FRID1303FOID0916FSPT17257dO00165 D 00065 220400010300FRID1303FOID0916ATTF1025FSPT65358d*EOW-5X000132 D 00065 220400010300FRID1303FOID0916ATTF0925FSPT33349d*OW2X5    00117 D 00065 220400010300FRID1303FOID0916ATTF1025FSPT1735:d*.OW5X10  00148 D 00065 220400010300FRID1303FOID0916ATTF0925FSPT4934;d*OW0X2 00104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930<d+O000104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930=d+O000104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930>d+O2 00104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930?d +mO5 00139 D 00057 220400010300FRID1303FOID0916FSPT5725@d GUO00105 D 00065 220400010300FRID1303FOID0916ATTF0625FSPT0931Ad HOZ3000105 D 00065 220400010300FRID1303FOID0916ATTF0625FSPT0931Bd HtOZ2000104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930CdyHOq9n00148 D 00065 220400010300FRID1303FOID0916ATTF0925FSPT4934Ddy7Oq9400108 D 00065 220400010300FRID1303FOID0916ATTF0925FSPT0934EdzeO<4200104 D 00065 220400010300FRID1303FOID0916ATTF0525FSPT0930Fd~O@6gdalautotest-3.0.4/ogr/data/esripolygonempty.json0000644003401500001440000000037713614004466021667 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolygon", "fields" : [ ], "features" : [ { "geometry" : { "rings" : [ ] }, "attributes" : { } } ] } gdalautotest-3.0.4/ogr/data/cad/0000755003401500001440000000000013614004466016063 5ustar rouaultusersgdalautotest-3.0.4/ogr/data/cad/ellipse_r2000.dwg0000644003401500001440000045052313614004466021057 0ustar rouaultusersAC1015iD/FMOQa{ꕠN(^A_:Mwi=]ii%Q[$%%%m6((W?D+CPShC(X@?0(!TSot00rp0f3RfVPs23133Pf3o3O343Fff3fRffVfPfsf213Pfo4̙Clr3nfeZT3Sfot003r33pf313o3o3R33B333f33f33R33V33Pf3s3f32ff31f3Pf3of3O3433Ff3f3R̙3V3P3s332f313P3o343Z33f33T3S3oft3f0ff0frfpfp3f233ff3f3fT3fS3fofft3ff0fff0ffrffpff3f3ffffRfV̙fPfsf23f1ffPfofOf4fF3ffffRfVfPfs231fPo4C3l33rf3n3e3Z3f3fTffSfoftf003rfp4̙oo̙R3̙Bf̙̙f̙R̙VP3sf21PoO34fFfRV3P33sf32313P3of43ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3f (((555CCCPPP]]]kkkxxxڒ+b5b{#8_|hNm3_ UЕ@@* 4@L Ad@i@B$@PEl%A#T4@0 ,EU 2vU@xD#-^kQW\A2vW@x@z@r@je B8{vQ]dmie Jc@oBҘ  $ PP*?C"DuBP(?d?U HQ!@UT  $(-D5E|1QEED8*A$ شܴ Ĵ  '{DCD02D96-48D7-47CC-B0F1-D0F98A9FCCB3}QlQpQ\Q[Q].Ġm0!VG̠ĸĩ_϶=dI= ` ͕AcDbDictionaryWithDefaultEPPSӐTU @"IMLnKm.nl`j #k +K `;@PB@tH \ *oMs=WL`4F%6fVD'&V7EfW'6` Bۘ\X[ 33333>;$ @PA@t H L )gh=AM`4F%6fVD'&V7EfW'6` A[@ 33333>;@PA@tH g )m=KPQ`4F%6fVD'&V7EfW'6` CQYPܓٙd 33333>;@PA@tH \ +oOl=IN`4F%6fVD'&V7EfW'6` CX\]\ 33333>;@PA@tH \ *O;@@PA@tH X (Uo=OJ`4F%6fVD'&V7EfW'6` C]]Y\ @C33333>;@@P@T@tH \$ (eeg=K`4F%6fVD'&V7EfW'6` B\]Y$ @C33333>;@@PA@tH \4 (@r=UKQ`4F%6fVD'&V7EfW'6` DQ\]Y]Y\4 @C33333>;@@P@T@tH \D (p=QLQ`4F%6fVD'&V7EfW'6` AY[d@33333>;$ @P @T@t H L )oj=EO`4F%6fVD'&V7EfW'6` B]\ٙD 33333>;@P A@tH \d +/l=IM`4F%6fVD'&V7EfW'6` C[\]\ 33333>;@PuA@tH:\ */l=IP`4F%6fVD'&V7EfW'6` Cݙ\[ٙT 33333>;@P A@tH \t +OCj=EL`4F%6fVD'&V7EfW'6` BX[\X 33333>;@@P@T@t H L )di=CO`4F%6fVD'&V7EfW'6` AYY @C33333>;@@P@T@ H LT +u=[OQ`4F%6fVD'&V7EfW'6` DYY]Y\ @C33333>;@)@P%@T@t H LD *w=_N`4F%6fVD'&V7EfW'6` CY\وܘ^@t @33333>;$ AA@t H L * p=QN`4F%6fVD'&V7EfW'6` B]@@33333>;$ A A@tH L$ *\h=AM`4F%6fVD'&V7EfW'6` BX[ 33333>;@P A@tH \ *8i=CL`4F%6fVD'&V7EfW'6` B\Y[Y@Y33333>;@P@T@t H Lt )O Jg=O`4F%6fVD'&V7EfW'6` A T^@ @@@P@PA@t H L4 *Ͼr"SZJe@PCC ?O6Jc@@444P9 51IMQe1 CTABLESTYLEDPՒQUURSS@$5dUu4T5D5EP%%5MM=  HIDETEXTBRSVU$Ud11eI9=Q%dLIGHTINGUNITSBTS@4%DTE0-a 1%AI510PD@HL , ( $ S?jd Metric50A0N?jd Metric50A0?^2AA0?^1AA0g,?^d0AA0?^0AA0s?^0AA0?^d2AA0 ?^$1AA0oq?b$127AA0fj?^e$2AA0ʛ9J@5d` @1Iɑ AcDsSchemasA A 0""Sց@$DWGPROPS COOKIEsim ,=-=.=/=0=1=2=3=4=5=(.7 N?)OſBA*,ſBAZ@PCC ?)&Ls@]) *Paper_SpaceUR AU]4!#OP(Ls@\) *Model_SpaceUR  KH`4!eY@'z$'?EOOrAU\4!Oל&Ls@[) *Paper_SpaceUR jrWOAU[4!OM%JRi@@Q4EU%5DDU0# LU)0 A0PQQ]$'MD@Ui Standard`txt@?HMGVFFfTFF `` B[]]@0?A$3l'NF@Wi Continuous-MAA0P8NhVByBlockAA0PNhW)ByLayerAA0P3(J@@@QD4E$T5$TEE$ (OqPuU5` B X]@0r@0W70W7$*P(@<<@  HHԂ`PUACADPWAcadAnnotative"P^ACAD_NAV_VCDISPLAY3.P@_)ACAD_EXEMPT_FROM_CAD_STANDARDSQyV +hEOATL@2?C"DuBP(?d?U HQ!@`ЪQ[VQFFfTFF `` B[]]@2+^+?zvz7Ьs*Bz7Ыsffffff9@d ףp= ?U "RP@`d!Jd@@DԤtp 'wY1Sր@^ ,ACD,2016, ACD_F_S_TL@PCC ?rJX@@CC ?KJZ@@WG&3S(?\[F[[XYHܚ]\ *ZdA!1@j@z@r@@xD#-^kQWTA2vW@x#-^kq0CPXP[?k?|]F[[XYHܚ]\ *ZdA!1@j(@"@EPX]?Ig?r\F[[XYHܚ]\ ji5@j(@"@DPX\U?=@b@FdByBlockUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@0BPD Fp=@b@DdByLayerUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@ D Dn=@`@HdGlobalUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@DD HM k>@|Y5 +` @?VU ףp= ?BT[\z7ЬsAB+^+Wd0YVUT?o?Ru@X$ STANDARD-DT!? Q>~O8/|Ø?SC8Æ=_PA N@a.=oQ$A Na=oQdA NAa7>SBZdBSY]XL̀('(),-Ι`(\D,j.D ,ln-n.N,ĥ,j.D ,ln-ȭ̉,Ĥ,j.D ,ll- DmGĥ )1@j"Zp~cSxe X:Jz AꊪꊯN>aYd Standard?$ 0@    0@`,`@8  0@`Xp 0  0@`?dꢪ"k=GK`4F%6fVD'&V7EfW'6` C \Y[Y@I33333>;@P@T@tH Ld )/e={K`4F%6fVD'&V7EfW'6` A\Xt@C33333>;@PA@tH \T )Zj=EMQ`4F%6fVD'&V7EfW'6` BPY[ 33333>;@PA@tH \ )XQ(J@@@QD4E$T5$TEE$ *(J@)@@QD4E$T5$TEE$# )(J@)@@QD4E$T5$TEE$C )(J@@@QD4E$T5$TEE$ +((J@)@@QD4E$T5$TEE$ *_ (J@)@@QD4E$T5$TEE$ (E(J@@@QD4E$T5$TEE$ ((J@)@@QD4E$T5$TEE$ (ߩ(J@@@QD4E$T5$TEE$ ( &(J@@@QD4E$T5$TEE$ )I(J@@@QD4E$T5$TEE$ +?Ē(J@@@QD4E$T5$TEE$s *?u(J@)@@QD4E$T5$TEE$ +_(J@@@QD4E$T5$TEE$3 )|@(J@)@@QD4E$T5$TEE$ +MI(J@@@QD4E$T5$TEE$ *AT(J@)@@QD4E$T5$TEE$ *$(J@@@QD4E$T5$TEE$ *l(J@)@@QD4E$T5$TEE$c *(J@)@@QD4E$T5$TEE$ )_ (J@)@@QD4E$T5$TEE$ *ȏ?`e$1:1A0h?jdd STANDARDA0?jd$ STANDARDA04J@@0@ ?-_Jd@@##c@, 2129690920B̌LMLL##c3` ( ' ' ' ' '{QSԀ>AcDbDs::IndexedPropertySchemaAcDs:Indexable[@h@ЀL?1]S쀀JAcDbDs::HandleAttributeSchemaAcDbDs::HandleAttribute[@h@L?B A3]a4!8A}MESA1\e4!45}MESuA1[c4!4A}MESYJR@@ RL? G|S$gf'VTR_0.000_0.000_1.000_1.000_VISUALSTYLET/f'VTR_0.000_0.000_1.000_1.000_GRIDDISPLAYFf%VTR_0.000_0.000_1.000_1.000_GRIDMAJORFf+VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGf/VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPEFf&VTR_0.000_0.000_1.000_1.000_BRIGHTNESSf$VTR_0.000_0.000_1.000_1.000_CONTRAST@`?ES (-DT!?@`L?~>BZBSY]XLFz~π\,j.D ,茮--,Ĥ,j.D ,ll- DmGĥ Ό-F@W* +*++(J@i@@QD4E$T5$TEE$ ,/(J@@@QD4E$T5$TEE$s , FJ@@@QD4E$T5$TEE$iM-}aI }1e=UQQ!U5 9%0  2JF@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!! !SG@pAF?~SH$@pAF?CSGd@p@F?ӂJD@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!!!SE@pAD?6SF$@pAD?rjSEd@p@D? JH@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!$!#!'!&!(!%SI@pAH?TSJ$@pAH?8SId@p@H?ب(J@@@QD4E$T5$TEE$s +9](J@i@@QD4E$T5$TEE$ +SXJi@@R4E$TEE$#D$U5EU4T5ETQ }aI }I=U9QI%@ ؈ 4(J@@@QD4E$T5$TEE$ )?(J@)@@QD4E$T5$TEE$ ),;(J@@@QD4E$T5$TEE$S )x Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?I Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?!w Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?*u Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?Ɖ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?_ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?^Љ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?x Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?( Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?( Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?0 Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?q Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?A Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?މ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?gQ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?n Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?SpAcDb_Thumbnail_Schemaf {ATTRRECORDU|AcDbDs::TreatedAsObjectData#f ATTRRECORD}f {ATTRRECORDU}AcDbDs::Legacy#f ATTRRECORD} AcDbDs::ID [f {ATTRRECORDU~AcDs:Indexable#f ATTRRECORD}f {ATTRRECORDUAcDbDs::HandleAttributef ATTRRECORD}Thumbnail_Data[@hAL?|bS$O!AcDbDs::TreatedAsObjectDataSchemaAcDbDs::TreatedAsObjectData[@hAPL?1&HS€d5AcDbDs::LegacySchemaAcDbDs::Legacy[@hAL? y(J@@@QD4E$T5$TEE$ ,VYS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`L?RYS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?cYS怀$Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?+MS̈d76(}}0(!TSot00rp0f3RfVPs23133Pf3o3O3436Fff3fRffVfPfsf213Pfo4̙Clr3nfeZT3Sfot003r33pf313o3o3R33B3363f33f33R33V33Pf3s3f32ff31f3Pf3of3O3433Ff3f3R̙3V3P3s332f313P3o343Z33f33T3S3oft3f0ff06frfpfp3f233ff3f3fT3fS3fofft3ff0fff0ffrffpff3f3ffffRfV̙fPfsf23f1ffPfofOf4fF3ffffRfVfP6fs231fPo4C3l33rf3n3e3Z3f3fTffSfoftf003rfp4̙oo̙R3̙Bf̙̙f̙R̙V6P3sf21PoO34fFfRV3P33sf32313P3of43ffffff3f̙3f63f3f333f3333f3ffffff3f63f3f (((555CCCPPP]]]kkkxxx6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666,@p@?#adSRfMATERIAL]^HM@PFF?JGSG$@p@F?ӖSF@`F?(SG@pAPF?jdSdRfMATERIAL]^HM@PDD?SE$@p@D? SD@`D?(SE@pAPD?6dSRfMATERIAL]^HM@PHH?muSI$@p@H?ؼSH@`H?+SI@pAPH?@;S@$)f!ACAD_ROUNDTRIP_2012_MLEADER_STYLE*@`??S@-f DISPLAYNAMEMetric50fFLAGSZ@`L?H?@C@AP  0@?>@d@`# @`#@`#"@`#B@`#@`#AU@T  I>?$????? ?@PTDU @h@@@@?>$I@d0@?@0@?A$0@?B$0@?D$0@?H$0@?@$}Q EUAAAAAAEUAAAAAAEUAAAAACWlSʀdYf!ACAD_ROUNDTRIP_PRE2007_TABLESTYLEZ[\]^_@pQL?e6 Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?  Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?Ho Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`??S@$-f DISPLAYNAMEMetric50fFLAGSZ@`?:{6]FzFa]FzF\]FzF@0@fHF I6hFFCD@CGJ:!y!!""""""#!!!" AKDm:yA2k8}9s6Im*iP*iR+jEBK F.^l+f)JnrXpJ:GDl*W^!AFAAAAFFDB3oBvGCBӃASCCDC͐CBBرAٳGFBGDDD@XX{!(S$@ <t.PL M@AD O`M2V     _ ܔϥ+1l`@ۿUgdalautotest-3.0.4/ogr/data/cad/point2d_r2000.dwg0000644003401500001440000034412613614004466021002 0ustar rouaultusersAC1015iD/FRa{IDN(^A_:Mwi\ii%%GT%m6((W?D+CPShC(X@?0(!3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3f (((555CCCPPP]]]kkkxxxڒ+b5b{#8_|hNm3_ UЕ@@* 4@L Ad@i@B$@wP^%+#O043@0 %EEU 2vU@xD#-^kQW\A2vW@x@z@r@je BPI@P  $ PP*?C"DuBP(?d?U HQ!@UT  $(-D5E|1QEED8*A$ Դ'{22E231EA-446B-4838-BF0E-922DA36D6315}QlQpQ\Q[Q]&C9{0!VG̠ĸĩ_϶=dI= ` ͕AcDbDictionaryWithDefaultEPPSӐTU @"IMLnKm.nl`j #k +K `;@PB@tH \ "J^s=WL`4F%6fVD'&V7EfW'6` Bۘ\X[ 33333>;$ @PA@t H L "`Th=AM`4F%6fVD'&V7EfW'6` A[@ 33333>;@PA@tH g "_m=KPQ`4F%6fVD'&V7EfW'6` CQYPܓٙd 33333>;@PA@tH \ #l=IN`4F%6fVD'&V7EfW'6` CX\]\ 33333>;@PA@tH \ "߉c=yJ`4F%6fVD'&V7EfW'6` AQ]$ @C33333>;@@PA@tH X !So=OJ`4F%6fVD'&V7EfW'6` C]]Y\ @C33333>;@@P@T@tH \$ !?cYg=K`4F%6fVD'&V7EfW'6` B\]Y$ @C33333>;@@PA@tH \4 !_Fr=UKQ`4F%6fVD'&V7EfW'6` DQ\]Y]Y\4 @C33333>;@@P@T@tH \D !p=QLQ`4F%6fVD'&V7EfW'6` AY[d@33333>;$ @P @T@t H L ! j=EO`4F%6fVD'&V7EfW'6` B]\ٙD 33333>;@P A@tH \d #ol=IM`4F%6fVD'&V7EfW'6` C[\]\ 33333>;@PuA@tH:\ "l=IP`4F%6fVD'&V7EfW'6` Cݙ\[ٙT 33333>;@P A@tH \t #Dj=EL`4F%6fVD'&V7EfW'6` BX[\X 33333>;@@P@T@t H L "?ci=CO`4F%6fVD'&V7EfW'6` AYY @C33333>;@@P@T@ H LT #uu=[OQ`4F%6fVD'&V7EfW'6` DYY]Y\ @C33333>;@)@P%@T@t H LD #w=_N`4F%6fVD'&V7EfW'6` CY\وܘ^@t @33333>;$ AA@t H L #p=QN`4F%6fVD'&V7EfW'6` B]@@33333>;$ A A@tH L$ #?`h=AM`4F%6fVD'&V7EfW'6` BX[ 33333>;@P A@tH \ "?9i=CL`4F%6fVD'&V7EfW'6` B\Y[Y@Y33333>;@P@T@t H Lt ! g=O`4F%6fVD'&V7EfW'6` A T^@ @@@P@PA@t H L4 #_N"S$ZJe@PCC ?NJb$@@444P9 51IMQe1 CTABLESTYLEDPՒQUURSS@$5dUu4T5D5EP%%5MM=  HIDETEXTBRSVU$Ud11eI9=Q%dLIGHTINGUNITSBTS@4%DTE0-a 1%AI5104($,0 L H D  @O?jb Metric50A0"?jc$ Metric50A0?^2AA0?^1AA0?^d0AA0?^p0AA0?^q$0AA0/?^p2AA0?^pd1AA0b?b$127AA0B?^O2AA0{Sց@dDWGPROPS COOKIEsim ,=-=.=/=0=1=2=3=4=5=(^V?)9ĿBA*sfĿBAZ@PCC ?1&Ls@]) *Paper_SpaceUR AU]4!#OP(Ls@\) *Model_SpaceUR ዒT!F_%4!%I@ES:AU\4!Oל&Ls@[) *Paper_SpaceUR jrWOAU[4!OMLU)0 A0PQQ]$'MD@Ui Standard`txt@?HMGVFFfTFF `` B[]]@0?A$3l'NF@Wi Continuous-MAA0P8NhVByBlockAA0PNhW)ByLayerAA0P3(J@)@@QD4E$T5$TEE$ /ݡPuU5` B X]@0r@0W70W7$*P(@<<@  HHԂ`PUACADPWAcadAnnotative"P^ACAD_NAV_VCDISPLAY36P@i&ACAD_DSTYLE_DIMJOGGED_JOGANGLE_SYMBOLQyV $hEOATL@2?C"DuBP(?d?U HQ!@`~%Q[VQFFfTFF `` B[]]@2+^+?zvz7Ьs*Bz7Ыsffffff9@d ףp= ?U "RP@`d!J@@DԤtp 6%1Sր@^ ,ACD,2016, ACD_F_S_TL@PCC ?rJX@@CC ?KJZ@@WG&3S(?\[F[[XYHܚ]\ *ZdA!1@j@z@r@@xD#-^kQWTA2vW@x#-^kq0CPX[?k?|]F[[XYHܚ]\ *ZdA!1@j(@"@EPX]?Kg?r\F[[XYHܚ]\ ji5@j(@"@DPX\U?o =@b@FdByBlockUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@0BPD Fp=@b@DdByLayerUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@ D Dn=@`@HdGlobalUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@DD HM k>@|Y5 $4` @?VU ףp= ?BT[\z7ЬsAB+^+Wd0YVUT??Ru@X$ STANDARD-DT!? Q>~O8/|Ø?SC8Æ=_PA N@a.=oQ$A Na=oQdA NAa7>SBZdBSY]XL̀('(),-Ι`(\D,j.D ,ln-n.N,ĥ,j.D ,ln-ȭ̉,Ĥ,j.D ,ll- DmGĥ )1@j"Zp~cSxe X:Jz A2ꊯ&>aYd Standard?$ 0@    0@`,`@8  0@`Xp 0  0@`?d k=GK`4F%6fVD'&V7EfW'6` C \Y[Y@I33333>;@P@T@tH Ld !We={K`4F%6fVD'&V7EfW'6` A\Xt@C33333>;@PA@tH \T !]gj=EMQ`4F%6fVD'&V7EfW'6` BPY[ 33333>;@PA@tH \ "_ (J@@@QD4E$T5$TEE$ #(J@i@@QD4E$T5$TEE$# "/^(J@i@@QD4E$T5$TEE$C "o(J@@@QD4E$T5$TEE$ $Q(J@i@@QD4E$T5$TEE$ "j(J@i@@QD4E$T5$TEE$ !/-(J@@@QD4E$T5$TEE$ !O(J@i@@QD4E$T5$TEE$ !ob(J@@@QD4E$T5$TEE$ !(J@@@QD4E$T5$TEE$ "2(J@@@QD4E$T5$TEE$ #Ͼ(J@@@QD4E$T5$TEE$s "T(J@i@@QD4E$T5$TEE$ #ڡ(J@@@QD4E$T5$TEE$3 "O(J@i@@QD4E$T5$TEE$ #6(J@@@QD4E$T5$TEE$ #(J@i@@QD4E$T5$TEE$ #/_(J@@@QD4E$T5$TEE$ #Ogt(J@i@@QD4E$T5$TEE$c "(J@i@@QD4E$T5$TEE$ !ﻵ(J@i@@QD4E$T5$TEE$ #og?`cd1:1A0w?jb STANDARDA0?jbd STANDARDA0/Y A3]a4!8A}MESA1\e4!45}MESuA1[c4!4A}MESY|Sdgf'VTR_0.000_0.000_1.000_1.000_VISUALSTYLET/f'VTR_0.000_0.000_1.000_1.000_GRIDDISPLAYFf%VTR_0.000_0.000_1.000_1.000_GRIDMAJORFf+VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGf/VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPEFf&VTR_0.000_0.000_1.000_1.000_BRIGHTNESSf$VTR_0.000_0.000_1.000_1.000_CONTRAST@` ?y5S (-DT!?@`?*>BZBSY]XLFz~π\,j.D ,茮--,Ĥ,j.D ,ll- DmGĥ Ό-F@I * +*++A(J@@@QD4E$T5$TEE$ $^(J@@@QD4E$T5$TEE$s $a(J@)@@QD4E$T5$TEE$3 $߬JF@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!! !nSG@pAF?~SH$@pAF?CSGd@p@F?ӂJD@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!!!iSE@pAD?6SF$@pAD?rjSEd@p@D? JH@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!$!#!'!&!(!%ZSI@pAH?TSJ$@pAH?8SId@p@H?ب(J@)@@QD4E$T5$TEE$s $_t(J@@@QD4E$T5$TEE$ $XJ@@R4E$TEE$#D$U5EU4T5ETQ }aI }I=U9QI%@ e(J@@@QD4E$T5$TEE$ !ߩ(J@i@@QD4E$T5$TEE$ !W(J@@@QD4E$T5$TEE$S ";c Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?, Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?I Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?oJ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?Mԉ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?^d Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?+ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?Չ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?= Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?b Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?g Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?R Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?(J@)@@QD4E$T5$TEE$ $YS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?YS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?%YS怀dGf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@` ?dSRfMATERIAL]^HM@PFF?SG$@p@F?ӖSF@`F?(SG@pAPF?jdSRfMATERIAL]^HM@PDD?HSE$@p@D? SD@`D?(SE@pAPD?6dS$RfMATERIAL]^HM@PHH?SI$@p@H?ؼSH@`H?+SI@pAPH?@;S@d)f!ACAD_ROUNDTRIP_2012_MLEADER_STYLE*@` ??S@-f DISPLAYNAMEMetric50fFLAGSZ@`?)?@C@AP  0@?>@d@`# @`#@`#"@`#B@`#@`#AU@T  I>?$????? ?@PTDU @h@@@@?>$I@d0@?@0@?A$0@?B$0@?D$0@?H$0@?@$}QEUAAAAAAEUAAAAAAEUAAAAAC.lSʀYf!ACAD_ROUNDTRIP_PRE2007_TABLESTYLEZ[\]^_@pO?2 Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?R Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?3 Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?2?S@d-f DISPLAYNAMEMetric50fFLAGSZ@` ?<?9z5]DzD^]DzDY]DzD@/@eHF I5gFFCD@CGJ8!x!!""""""#!!!" AKDl9xA1j6|8r4Ij'gO'gR(gEN F-^k*irXpB6DbADЛAAAADD֕DԆB0lBvECʾBAPCCۮDƧCCݠBB@ŢEDGơEDDD@XXa{!(S$@ <t/@PL M@AD O`(VT     _ p2^vlMn+1l`@ۿUgdalautotest-3.0.4/ogr/data/cad/text_mtext_attdef_r2000.dwg0000644003401500001440000053554613614004466023167 0ustar rouaultusersAC1015sJLba{N(^A_:Ms27h% ..e  %I Q%Q=SM+2%m6((W?D+IPS(I(`E0(!3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3f (((555CCCPPP]]]kkkxxxڒ+b5b{#8_|hNm3_UЕ@@* 4@L Ad@i@A$&ffffrOɩjfffff@P$-D%OTbd$ 0 $Uu(@"@je B'n9·S0o~-OQ@!>E $ PP*+^+?zvz7Ьs*Bz7Ыsffffff9@d ףp= ?U "RP@DT  $(D5D\1QDiDeD8(@d ȵ '{5C6246D2-6C5A-5E4A-BC7C-4C8DCC67B0C1}QXQQQQ c$&"0!VG̠ĸĩ_϶=dI= ` ͕AcDbDictionaryWithDefaultEPPSӐTU "IMLnKm.nl` #c *C{c#+ qIA N@Qla@>qIA NlaD0>sJ$ALNLlah>sJdALNMla>sJALNlas>sJALNla>sK$ALN la>sKdALNL%laO >uKANL elaPV>qKA @la>qL$A @lab>qLdA@la_O>sLALL@Dla >uLAL @la1>W@M$CKLH ILla0>U@MdCK͍H IL la0>U@MCK̈H IL la 50>U@MCKMH IL la0>U@N$C̈H IL la/>S@NdCLKH IL la0>U@NCMH IL la|/>S@NCLKH IL  la/>S@O$CLH IL  lay/>S@OdCLK̈H ILlaǴ/>S@OCLH ILla[P%>OBHH ILla1>W@P$CKLK̈H ILlaVQ->O@PdBȈH ILlao->O@PB͈H ILla0>U@PCILH ILla "Jj$@@W&#@ <Ja@@7FF&@}^J@fd@@&Ev&Vg&P ͥ BrightenCܐ[@66WGV EdgeColorOffCX\]\Tf@9]ѡGouraudDQ\]Y]Y\tFFV))ѕ= LinepatternCݙ\[ٙ&VƗ7F0MShaded with edgesCY\وܘ^@6WF6!Q WireframeA T^@CC ggiHjHhi]HjffggHhH\iȀ]hȀ``H__ih`?m>KjQ 4F%6fVD'&V7EfW'6` Cܐ[@ @33333>;@PB@tH \ #?\t>Yh 4F%6fVD'&V7EfW'6` Bۘ\X[ @C33333>;$ @PA@t H L "_i>Ci 4F%6fVD'&V7EfW'6` A[@ @C33333>;@PA@tH g "n>M]Q 4F%6fVD'&V7EfW'6` CQYPܓٙd 33333>;@PA@tH T #Gm>Kj 4F%6fVD'&V7EfW'6` CX\]\ @C33333>;@PA@tH \ #c>yf 4F%6fVD'&V7EfW'6` AQ]$ @C33333>;@@PA@tH X !_1o>Of 4F%6fVD'&V7EfW'6` C]]Y\ @C33333>;@@P@T@tH \$ !g>g 4F%6fVD'&V7EfW'6` B\]Y$ @C33333>;@@PA@tH \4 !*r>UgQ 4F%6fVD'&V7EfW'6` DQ\]Y]Y\4 @C33333>;@@P@T@tH \D !p>QhQ 4F%6fVD'&V7EfW'6` AY[d@33333>;$ @P @T@t H L "?k>G\ 4F%6fVD'&V7EfW'6` B]\ٙD 33333>;@P A@tH T #_(m>Ki 4F%6fVD'&V7EfW'6` C[\]\ @C33333>;@PuA@tH:\ "m>K] 4F%6fVD'&V7EfW'6` Cݙ\[ٙT 33333>;@P A@tH T # j>Eh 4F%6fVD'&V7EfW'6` BX[\X 33333>;@@P@T@t H L "rj>E` 4F%6fVD'&V7EfW'6` AYY @C33333>;@@P@T@ H D $?v>]`Q 4F%6fVD'&V7EfW'6` DYY]Y\ @C33333>;@)@P%@T@t H D $x>a_ 4F%6fVD'&V7EfW'6` CY\وܘ^@t @33333>;$ AA@t H D #pq>S_ 4F%6fVD'&V7EfW'6` B]@@33333>;$ A A@tH D #ߑi>Ci 4F%6fVD'&V7EfW'6` BX[ @C33333>;@P A@tH \ "'i>Ch 4F%6fVD'&V7EfW'6` B\Y[Y@Y33333>;@P@T@t H Lt "h>A` 4F%6fVD'&V7EfW'6` A T^@ @@@P@PA@t H D #(,S̀@ZJJ@PCC ?;`JY@@444P9 51IMQe1 CTABLESTYLEDPՒQUURSS@$5dUu4T5D5EP%%5MM=  HIDETEXTBRSVU$Ud11eI9=Q%dLIGHTINGUNITSBTS@4%DTE0-a 1%AI510$܈ ,48 $ ( 3=pm Imperial24AfAf0=pn$ Imperial24AfAf0=\Y2Af0=\Z1Af0d =^0AfAf0=^Sd0AfAf0=^S0AfAf06=^d2AfAf0=^$1AfAf0qn=b127AfAf0R=^$2AfAf09J@5$` @1Iɑ AcDsSchemasA A 0""aS@$DWGPROPS COOKIE aleksandr ,=-=.=/=0=1=2=3=4=5=(VeO[?)FBA*a-EFBAZ@PCC ?&Ls@Wi *Paper_SpaceUR AUX!4!3.>,Ls@G *Model_SpaceUR ꁉ 2Z;@h@~4! Ǿsjffffg$ 0@`QQW K  4EDUE4Td$Ttd` d`d`d`c B0cc `4EDUE4TdT@DUD$Ttd`bd`DUDTI]t@K*Z,u _P GQ%]ơ]A͠ѕF " "?(1Z@Pe $t`` MwCؗ#M ?A]]DU5EDpVisibleTextString0@QQ,AUHe4!&Ls@V) *Paper_SpaceUR ڊ)LAUV4!%Jc@@Q4EU%5DDU0# \LD)0 A1PQQ*>Ms@DP P&r BT[\0?B\X[ $33_MuwFFfTFF `` 9DHuɥFFfP &&ffffrOФ&GF`  C8('NF@E Continuous-MAA0PaNhE)ByBlockAA0P}NhEiByLayerAA0PL(J@i@@QD4E$T5$TEE$ f9Pwe5 d`0 B X]@0H}F+@tcP51ȏ.QNP*P(@<<@pp~~Ԃ`wPDACADPwi AcadAnnoPOAPwAcadAnnotative}"PwACAD_DSTYLE_DIMJAGnwQY@I Standard@z7ЬsRQ?Bꌨ ףp= ?Bᙙ+^* AT H]BQ?QQL@xQFFfTFF `` 1G}QFF-хѥٔ*B JzG` ףp= ?2+^+ ףp= ?fffffc@z7ЫsR H Iu D ?!F "* 05Sހ@id#,ACDMAC,2016, ACDMAC_F_S@PCC ?J\@@CC ?^"Jj@@W&#@ JCd@@ C ?X=VVdASۙ@ *ZdA!1@j(@"@FFPV?MNX=VWASۙ@ *ZdA!1@j(@"@FFWP?Vۺ=X@HCۙW]X@ e 3@P 43`fvq@GPSWW LLK [\@*@j+7kA(7[\?5@j(@"@BFeGe?/%Z>@eeByBlockjj8 j@@Z@djP j T# ?Z>@eeByLayerjj8 j@@Z@djP j D# o>@S@fU$o`0`p` Aؘ[ @@@ Sa2T@`j`L?&%OꚤP a2T`L?j&%O SjCĮj?|yP5 t` @?VU ףp= ?BT[\z7Ьs@PB+^+Wf0CuEDT?-i?|v5 t` @?VU ףp= ?BT[\z7Ьs@PB+^+Wd0uEDT?6?Ru@F$ STANDARD-DT!? Q>~O8/\P=@SC8ÄC>_mA N@la`>qI$A N܃la>qIdA NAރlaWU=B@jB[\\X[ нj7p= ֣q~'(),-нj7Ιe/Zqp= ֣qнj7~,j.D ,. Df$GĤ,j.D ,ln-n.N,ĥ,j.D ,ln-ȭ̉,ī hh),j.D ,ll- DmGĠ)0ZnX @j"Zp~cSxe X:Jz A"a>aa StandardzFQ?z7Ьs 0@    0@`,`@8  0@`BXp 0  0@`? d""#l>Ig 4F%6fVD'&V7EfW'6` C \Y[Y@I@C33333>;@P@T@tH Ld !פe>{g 4F%6fVD'&V7EfW'6` A\Xt@C33333>;@PA@tH \T !k>GiQ 4F%6fVD'&V7EfW'6` BPY[ @C33333>;@PA@tH \ " (J@@@QD4E$T5$TEE$ #O*(J@i@@QD4E$T5$TEE$# "o2y(J@i@@QD4E$T5$TEE$C "!(J@i@@QD4E$T5$TEE$ C #?(J@i@@QD4E$T5$TEE$ #/n(J@i@@QD4E$T5$TEE$ !of(J@@@QD4E$T5$TEE$ !j(J@i@@QD4E$T5$TEE$ !>(J@@@QD4E$T5$TEE$ !_(J@@@QD4E$T5$TEE$ "OW(J@i@@QD4E$T5$TEE$ # #o (J@@@QD4E$T5$TEE$s #c(J@@@QD4E$T5$TEE$ 3 #(J@@@QD4E$T5$TEE$3 "(J@@@QD4E$T5$TEE$  $O}(J@i@@QD4E$T5$TEE$  $/(J@@@QD4E$T5$TEE$  #Ϸ(J@i@@QD4E$T5$TEE$  #H(J@i@@QD4E$T5$TEE$c "(J@i@@QD4E$T5$TEE$ "/ߎ(J@@@QD4E$T5$TEE$  $Y=`|$1:1AfAf0=j{ STANDARDAfAf0=jbd STANDARD#Af0ءJ$@@0@?}]xJ@@Cc##Cs3S#`@140622147315248D M M MLCc##Cs3S# c  " 2 B _HQSԀ$>AcDbDs::IndexedPropertySchemaAcDs:Indexable[@h@Ѐ?]S쀀dJAcDbDs::HandleAttributeSchemaAcDbDs::HandleAttribute[@h@?!A3W4!8A}MDCGJWj@@PG?A1H%4!45}MDC5ZA1V4!4A}MDCJc@@ c?Jy@@PD ?|Sgf'VTR_0.000_0.000_1.000_1.000_VISUALSTYLETf'VTR_0.000_0.000_1.000_1.000_GRIDDISPLAYFf%VTR_0.000_0.000_1.000_1.000_GRIDMAJORFf+VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGf/VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPEFf&VTR_0.000_0.000_1.000_1.000_BRIGHTNESSf$VTR_0.000_0.000_1.000_1.000_CONTRAST@`L?$b@k$B[\\X[ нj7Fz~нj7ϗнj7~d,j.D ,. Df$GĤ,j.D ,茮--,ī hh),j.D ,ll- DmGĠΌ@5f@8"* ""*""1(J@i@@QD4E$T5$TEE$ ˟(J@@@QD4E$T5$TEE$ !ÌFJ@e)@@QD4E$T5$TEE$iM-}aI }1e=UQQ!U5 9%0,35J@b)@@QD4E$T5$TEE$% aMMP\L'5J@a@@QD4E$T5$TEE$% aMMPXH>vJD)@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILEBQTU4EDP=I1 Q%=9Q%1PHD(LSSD@p@ЀD ?ҽSE$@pAD ?ҽ(J@q)@@QD4E$T5$TEE$  $_XJA)@@R4E$TEE$#D$U5EU4T5ETQ }aI }I=U9QI%@G(J@@@QD4E$T5$TEE$ "(J@i@@QD4E$T5$TEE$ !:(J@@@QD4E$T5$TEE$S "ώ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?g Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?oJ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?R Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?ǔ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?b Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?+ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?3 Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?, Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?2݉ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?Ɖ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?A Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?(5 Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?z Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?I Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?SdpAcDb_Thumbnail_Schemaf {ATTRRECORDUAcDbDs::TreatedAsObjectData#f ATTRRECORD}f {ATTRRECORDUAcDbDs::Legacy#f ATTRRECORD} AcDbDs::ID [f {ATTRRECORDUAcDs:Indexable#f ATTRRECORD}f {ATTRRECORDUAcDbDs::HandleAttributef ATTRRECORD}Thumbnail_Data[@hA?+bSO!AcDbDs::TreatedAsObjectDataSchemaAcDbDs::TreatedAsObjectData[@hAP?!HS€5AcDbDs::LegacySchemaAcDbDs::Legacy[@hA?)(J@q@@QD4E$T5$TEE$  $oYYS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`L?VYS怀$Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?xZS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@p]Ѐe ?Sп$ٟ6(0(!3f333f33336f3ffffff3f̙3f3f333f3333333363f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3fff6fff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3fffff6f3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙63f3f333f3333f3ffffff3f̙3f63f3f333f3333f3ffffff3f63f3f (((555CCCPPP]]]kkkxxx6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666b@p^e ?geSRfMATERIAL]^?HM@pbЀb ?SȭbdFZ$508B35C9-AEE7-456F-BE74-D52651303AC66PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;((k|core.xmlAn Ef[a!maTvO L\,U_8RjF}qoˬz- :Hk@')V/ f6&ӲKڻh\̪E-7ifU#\E髚LA]S#zcg/֬ 0r#3k4KWAV4RL[rh-!6uU,@r"{PnPKpb;U_|cnx.xmlM; Eѭ,E f az}Be %J&dM(2`8G6+1(%*Gƺh \ ϶PKpb;{q fbx/core.xmlSn }EkmK' PT >Mץk_ss9756*3Bҹ)*]fػch#5}+HFex5hTB͠:0kXd?U#CTtI*d!P'x,@Ӑpd*f*`Zu"exAΒ-Y-6nvuQ,*TEDi0%kX'ZSP~&_iGܩÂ"r=!!D  @Nꋏ@ʝ 0WW0t| NN:n6xG8jK0!, :aU6icY?g?QWw%6{>/PKpb;p*H} fbx/cnx.xmlM [ܕ5e!3 6c胇WtգM/r guJ PW+`PbIl'Mvϻz'\ӖL!4ìno*%_i#PKpb;63)16fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/core.xmlQ[n  +U Dn>A/IQbxT9~v/?,X7}0vTmS^:6?40 ~.M $ƌZ!KP )fFV EWKӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 PK6pb;.;i<4fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/objects.xmlW]s8+ NB'SO;D#6z?`GW}[/TȌw'EY̓7vvΕm--F zci; RL%tG\fX2V)ol?тRVdgeNo3=l?ό%;. Ɲ?kҾ8 lxM7^g0Ss7Y &&96!cHsLw`J0;v<rx/F6تV{2$tķg0?bYl{,GN4H|rΗ;g6wwfj~q9򲳨$6 _&NĠ l(}h K緵862eh>+AW1̯ 3|ـ3}ѥF٥BSUDdhq-YjnC=Fozd>TcꋇVZʼJ%9̕.p02K_]3@qɋ335wYkiZ!/&Xw6".I3&ڂ@&hzec5hnxQJ,˟6^`hÿPKpb;5fbx/B8A508C4-431F-45F1-BCA5-5624426FEA3DF/vertices.binPKpb;p36fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/triangles.bincf``PKpb6;7fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/attributes.binPKpb; ѐA6fbx/B8A508C4-431F-45F1-BC6A5-524426FEA3DF/directory.xmlA E"oS 5 $NDHb45FJH] =l09 }Gy+!t* #JX0(aWE{Ϝ6C׶-(.*,f1z{+ !I}PKpb;;F;fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/resources/6core.xmlPKn0 me4T',3!Vz@v}4OGkkz`9 6S1\IIpgm%{Xa|r6.; hBBq St gE60gyNp\ mO ¡)Xcc|m5j*R͑\3kӶe͋,xOFPA1BVwՇtb1e)jr<< 6ev+PK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ6[Content_Types].xmlPKpb;((k|core.xmlPKpb;U_|cnx.xmlP6Kpb;{q fbx/core.xmlPKpb;p*H} fbx/cnx.xmlPK6pb;63)1Yfbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/core.xmlPKpb;N306fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/cnx.xmlPKpb;.;i<4mfbx/B8A508C4-431F-45F1-BCA5-5244626FEA3DF/objects.xmlPKpb;5(fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/vertices.binPK6pb;p36{fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/triangles.binPKpb;76fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/attributes.binPKpb; ѐA6*fbx/B8A508C4-4361F-45F1-BCA5-524426FEA3DF/directory.xmlPKpb;;F;fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/r6'esources/core.xmlPKe@`b ?eSRfMATERIAL]^?HM@pca?VSaFZ$887D55A9-D0DD-414E-B741-A7DCD4DA2B4C6PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;8|core.xmlAn Ef[akDqۜ@@,U_8RjF}~n,z- ֍=x{@/ ''6*ӼIʻh\̪l D@ꖛI2b*GSgᔬF#V}lUC -9pƎhxzg4-/WXh}QbJ1>i;Bx@i6u}`͏k܃uMPKpb;U_|cnx.xmlM; Eѭ,E f az}Be %J&dM(2`86G+1(%*Gƺh \ ϶PKpb;5q fbx/core.xmlSn }EAmm' PT >Mץ[_ss9756*s#)*]ػchÙ5})HFx1g5!iSMfPtr9jD(BD(8h21?ΌL8gWVL.^$~$/6ޖ6`M)]f.[024sNZ%*0)͂( h%k֔224xW=dzܩ<!#-DP'zC8#C 8'z% 0WW0t| FN:n6ΈpB`B8XtIZlл36~/D]ߕ$Mm)" }PKpb;B } fbx/cnx.xmlM [B5>bYJ6F;g[ۥAFguJ P7'dPbIMn˚]}x^hہQ(nZSck9 6ZCD+{PKpb;/)16fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/core.xmlQ[n  +U .8n zHţ #a}oqh+2Ϩ`+w.6A`QPwiZ l6f:pAG-_zjH13µy."Ung!C q}bt(jѮÇ=Yg)ȍqhI /VP4#B6n>`wy]DiROYβ\y{ʼU \az&gǖ.!:wu\fۖ ^ \6PKpb;N30fb6x/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/cnx.xmlՓn Dqlԉ~Ab$4,U]C kvY=a-w=mkF 8qiW) Ow66JY"i&Tq"~ "&^IE4kWAq8tA *E!x>Kӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 P6Kpb;)e!c<4fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/objects.xmlW]s8+ 4c$>d#Lb$:{6[ <3rti"bqZ$f%ֵi|Θ-3Tf'UT4DD jQF5ELsbJ;&vgvp(6| - / hr6É׫W9?Ci!$)e#1S ..oKϛZ޻ ךC˽N  !I[ F|,ֆ3)bEAxX۬%ƴEOXOUG6OPk{[6q* UM| &mT9$3t 3,UK F++ۊ5vYLA jd*EmY`rUɷԓ H6хeh7KJʥ&}(iYS |A?| o=F6`}Uzvj\囂hv.D݆{6H}`Ypb#,6s ߕpצd֒g8@5Hp -nMv t!R}kdQaop<Ƨ H'En6un '-9[~ 7'eS{@mZAo16/ΙZM;-ċVC}-׮ "r= hZkfgdY K8+U@PeDߟ>shnܧӂ9+`7 @C\L\Ed6!$/h Ny0yp뙣r0Z }`xZ)mGUɲiK=PKpb;5fbx/E7F54B54-67C2-4824-80DC-C4EFE06565DBB/vertices.binPKpb;p36fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/triangles.bincf``PKpb;67fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/attributes.binPKpb; ѐA6fbx/E7F54B54-67C2-4824-80DC-C46EFE0565DBB/directory.xmlA E"oS 5 $NDHb45FJH] =l09 }Gy+!t* #JX0(aWE{ϜC6׶-(.*,f1z{+ !I}PKpb;cxM;fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/resources/core.6xmlPKn0 me NBd9A/`Ib%ȟǯ Tjw̌Gk|qVR(j7{ Cq;ɠjfzF1 *PG>:*UY]]6deN}P,O cpk ZX)R2ê1Ci.=H^4Dݞo]v+,E4OFQE@֔1B(?4j1i)7w,yRTs_y={6V~PK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ[Con6tent_Types].xmlPKpb;8|core.xmlPKpb;U_|cnx.xmlPK6pb;5q fbx/core.xmlPKpb;B } fbx/cnx.xmlPKpb;/6)1Zfbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/core.xmlPKpb;N30fbx6/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/cnx.xmlPKpb;)e!c<4nfbx/E7F54B54-67C2-4824-80DC-C4EFE05665DBB/objects.xmlPKpb;5#fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/vertices.binPK6pb;p36vfbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/triangles.binPKpb;76fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/attributes.binPKpb; ѐA6%fbx/E7F54B54-67C2-46824-80DC-C4EFE0565DBB/directory.xmlPKpb;cxM; fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/resou6#rces/core.xmlPKa@`a?fS$RfMATERIAL]^?HM@pAD ?SD@p@D ?ƽSDd@`D ?\SbFZXj$9BF507EE-FAF7-4A99-A33D-4EE51894BC406PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;|core.xmlAn0EbͶ2@ (e;J&!RjF}vK8 mSN=pG@'V/ +f6&gK٠mHuJ^@Yd"l&&WB#F}b v(eEq |P7E ,u_ZRLOZuU7rafE6Ɔ}b8M<[Ό1] 6V|T.kUeٓhǙ~)HVfx1gѮ[B++TR.{i1*Xd/>d+|,TgYT|!Ȍs\].l]´TKy6yx</Nsm}6-I5 SFfl^F +KCJ7^x4|-]m ]o)ed,kr]dEc"!1DL  @V3@,610v7j0tz FN:m6pBU`BXXuYZ'7 Rڴy/D?TFRD"A?PKpb;qݶ~ fbx/cnx.xmlM [ܥM?P#X62p9v>xxUy)j'G|4u5*݀~vvrƾu@(k'@yz/X-TFUҶ{|PKpb;4(61fbx/858427A4-485F-4042-85A9-C1031689EE1E/core.xmlQ[n  +U $DQ (1X<P;R6!ZzH q]zqR6NR\ %RAfU&A0ʥq2jTNͤ4]xRJ0'qڽ(} i8;l;kE; EnucքgMXdG!x6A$tَWweҺ[β%ܐB|=˜Cu*J`㢝qCǘ|(߻ vChJ]_uPKpb;N30f6bx/858427A4-485F-4042-85A9-C1031689EE1E/cnx.xmlՓn Dqlԉ~Ab$4,U]C kvY=a-w=mkF 8qiW) O6w6JY"i&Tq"~ "&^IE4kWAq8tA *E!x>Kӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 6PKpb;Y3"c;4fbx/858427A4-485F-4042-85A9-C1031689EE1E/objects.xmlW[o8+}BNe&M:SM>T 8-`dN~?!6@N~b.K7EӵGAEIߘZצ8cCf9荩Mߋ9+ -)S9]a4”qcf&dvD$v횰6x0-Ũr6ˑTTNeO_~ I@؀؝,..d2&.\vyܫhi>,$' [ӿoxzNX+~L9 +aaтPiG|H(trpe{~]]1-e*h~ O4K4XI.A򽠦?jc|?֎4)r6Y:WZe[|<.ଠ\*ZM9u|wwx+w Ɠd7R$'2!6j_Pԇ4ο"V~8?Kǯ.R;7$cuH6R$G@(a |LJʎS$[xjUa+@ $jM H?urSq7Qݖe@6uɟFbgL|#+  2+6$ce.qӨѾebO"_WO;>T=tĦ^xݝ-l:fš]|.O6AuSDCJh7?YkD ''O+S \eEJ3K^CEGHL~=;g{TFݹʅLK9IAm]6qe zT+OIz1e6:g{QtH_8V)m4y!STne(oucٯӉh& ;@wTsO@q>ԮS7(?hZ~Krΰ݌vVi?2Q 6A)[[1LZY](O cpk zRdMc\ zMsF~dՌHIלZr>ѷw-oEfɨ=HNiG#޿COVSO4%coq Bj+Gy6oPK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ[Con6tent_Types].xmlPKpb;|core.xmlPKpb;U_|cnx.xmlPK6pb;h rr fbx/core.xmlPKpb;qݶ~ fbx/cnx.xmlPKpb;64(1\fbx/858427A4-485F-4042-85A9-C1031689EE1E/core.xmlPKpb;N30fbx6/858427A4-485F-4042-85A9-C1031689EE1E/cnx.xmlPKpb;Y3"c;4ofbx/858427A4-485F-4042-85A9-C10316896EE1E/objects.xmlPKpb;5$fbx/858427A4-485F-4042-85A9-C1031689EE1E/vertices.binPK6pb;p36wfbx/858427A4-485F-4042-85A9-C1031689EE1E/triangles.binPKpb;76fbx/858427A4-485F-4042-85A9-C1031689EE1E/attributes.binPKpb; ѐA6&fbx/858427A4-485F-46042-85A9-C1031689EE1E/directory.xmlPKpb;٣g; fbx/858427A4-485F-4042-85A9-C1031689EE1E/resou6#rces/core.xmlPKa@p^D ?%BS@d/f DISPLAYNAME Imperial24fFLAGSZ@p`Pq ??@C@AP  0@ Q?.zn+ˁ^zF ףp= ?Bd@`z7Ъs @`z7Ъs@`z7Ъs"@`z7ЪsB@`z7Ъs@`z7ЪsAU@T  +^+.zn+ˁ^zFQ?Bz7Ьs?+^*?+^*?+^*?+^*?+^* ?+^*@PTDU @h@ ףp= ?@K^zFQ?.zn+z7Ьs+^+@d0@ ףp= ?@0@ ףp= ?A$0@ ףp= ?B$0@ ףp= ?D$0@ ףp= ?H$0@ ףp= ?@$}QDEAAAAAADEAAAAAADEAAAAACmSʀdYf!ACAD_ROUNDTRIP_PRE2007_TABLESTYLEZ[\]^_@PAA ?I Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?; Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?BS@/f DISPLAYNAME Imperial24fFLAGSZ@p`q?4'|V FDo@A*-jD1KiDmFf<n: ] @s3@iHG I9kFFC O @T " DY @ _G["@""######$"""#$54444343333)511 1~G D@ܳGޒH*a@8I v! ;ٿ/ɤE@/?HDo-W]!DD@nGڛAAAA®HHDކB0lBvHCԾBARBB@CCDЧCÌI+X0@_{!(S$@ <u3nPL M@A1JI`6VM      HF;+1l`@ۿUgdalautotest-3.0.4/ogr/data/cad/triple_circles_r2000.dwg0000644003401500001440000053340713614004466022430 0ustar rouaultusersAC1015sJLa{7N(^A_:Ms6h& ..e %%tr,,6%m6((W?D+IPS(I(`E0(!0f3f3333ff3f33f3f3fff̙ffff3f̙33ff3333f̙3ff3333ff33333333333f33f3333333f333f3ff3̙f3ff3f3f3f33f33f̙3333f33ff3f3f3f33f33f3̙3f33fff3fffffff3f33ff3ff3f3f3fff3ff3fff̙fffffffff3fffff̙fff3ffffffff3fff̙ffff3f3333ff3f33f3f3fff̙ffff3f̙̙3̙f̙f̙̙̙33f̙ff3ff̙333f3f333f3fff̙ff f53CfPk̙x̡̆3̮f̻3f3fTA333Qf3o333fd3ffffKfIf34fA̙F>3 f/34f {(((5550CCCPPP]]]kkk|xxx#X+Nsڒ+b5b{#8_|hNm3_UЕ@@* 4@L Ad@i@A$&ffffrOɩjfffff@ WPH%rh%0 2 *uUu(@"@je B 0 4@  t$ PP*+^+?zvz7Ьs*Bz7Ыsffffff9@d ףp= ?U "RP@DT  $(D5D\1QDiDeD8(@dԵܵ'{5E427B2A-150B-9748-80A7-E4ECAB1F4EBF}QXQQQQCх30!VG̠ĸĩ_϶=dI= ` ͕AcDbDictionaryWithDefaultEPPSӐTU "IMLnKm.nl` #c *C{c#+ qIA N@Qla@>qIA NlaD0>sJ$ALNLlah>sJdALNMla>sJALNlas>sJALNla>sK$ALN la>sKdALNL%laO >uKANL elaPV>qKA @la>qL$A @lab>qLdA@la_O>sLALL@Dla >uLAL @la1>W@M$CKLH ILla0>U@MdCK͍H IL la0>U@MCK̈H IL la 50>U@MCKMH IL la0>U@N$C̈H IL la/>S@NdCLKH IL la0>U@NCMH IL la|/>S@NCLKH IL  la/>S@O$CLH IL  lay/>S@OdCLK̈H ILlaǴ/>S@OCLH ILla[P%>OBHH ILla1>W@P$CKLK̈H ILlaVQ->O@PdBȈH ILlao->O@PB͈H ILla0>U@PCILH ILla "Jj$@@W&#@ <Ja@@7FF&@}^J@fd@@&Ev&Vg&P ͥ BrightenCܐ[@66WGV EdgeColorOffCX\]\Tf@9]ѡGouraudDQ\]Y]Y\tFFV))ѕ= LinepatternCݙ\[ٙ&VƗ7F0MShaded with edgesCY\وܘ^@6WF6!Q WireframeA T^@CC ggiHjHhi]HjffggHhH\iȀ]hȀ``H__ih`?m>KjQ 4F%6fVD'&V7EfW'6` Cܐ[@ @33333>;@PB@tH \ 1_Pt>Yh 4F%6fVD'&V7EfW'6` Bۘ\X[ @C33333>;$ @PA@t H L 0ci>Ci 4F%6fVD'&V7EfW'6` A[@ @C33333>;@PA@tH g 0 fn>M]Q 4F%6fVD'&V7EfW'6` CQYPܓٙd 33333>;@PA@tH T 1Jm>Kj 4F%6fVD'&V7EfW'6` CX\]\ @C33333>;@PA@tH \ 1?c>yf 4F%6fVD'&V7EfW'6` AQ]$ @C33333>;@@PA@tH X /o>Of 4F%6fVD'&V7EfW'6` C]]Y\ @C33333>;@@P@T@tH \$ /g>g 4F%6fVD'&V7EfW'6` B\]Y$ @C33333>;@@PA@tH \4 /r>UgQ 4F%6fVD'&V7EfW'6` DQ\]Y]Y\4 @C33333>;@@P@T@tH \D /߶p>QhQ 4F%6fVD'&V7EfW'6` AY[d@33333>;$ @P @T@t H L 0_ܓk>G\ 4F%6fVD'&V7EfW'6` B]\ٙD 33333>;@P A@tH T 1%m>Ki 4F%6fVD'&V7EfW'6` C[\]\ @C33333>;@PuA@tH:\ 1Nm>K] 4F%6fVD'&V7EfW'6` Cݙ\[ٙT 33333>;@P A@tH T 1=j>Eh 4F%6fVD'&V7EfW'6` BX[\X 33333>;@@P@T@t H L 0Zj>E` 4F%6fVD'&V7EfW'6` AYY @C33333>;@@P@T@ H D 2_qv>]`Q 4F%6fVD'&V7EfW'6` DYY]Y\ @C33333>;@)@P%@T@t H D 2?x>a_ 4F%6fVD'&V7EfW'6` CY\وܘ^@t @33333>;$ AA@t H D 1q>S_ 4F%6fVD'&V7EfW'6` B]@@33333>;$ A A@tH D 1i>Ci 4F%6fVD'&V7EfW'6` BX[ @C33333>;@P A@tH \ 0*i>Ch 4F%6fVD'&V7EfW'6` B\Y[Y@Y33333>;@P@T@t H Lt 0?mh>A` 4F%6fVD'&V7EfW'6` A T^@ @@@P@PA@t H D 2%v"SZJ@PCC ?-,JY@@444P9 51IMQe1 CTABLESTYLEDPՒQUURSS@$5dUu4T5D5EP%%5MM=  HIDETEXTBRSVU$Ud11eI9=Q%dLIGHTINGUNITSBTS@4%DTE0-a 1%AI510$܈ |48 t p x =pm Imperial24AfAf0=pn$ Imperial24AfAf0=\Y2Af0=\Z1Af0d =^0AfAf0=^Sd0AfAf0=^S0AfAf06=^d2AfAf0[=^$1AfAf0="=b127AfAf0g=^2AfAf0rS@$DWGPROPS COOKIE aleksandr ,=-=.=/=0=1=2=3=4=5=(2?)~ߥʿBA*BAZ@PCC ?s&Ls@Wi *Paper_SpaceUR AUX!4!3.>,Ls@G *Model_SpaceUR ꁉ "D4!ډfffffg0@`Q9D@%t!$@ D0Rh+D@e4!45333330@RAUHe4!&Ls@V) *Paper_SpaceUR ڊ)LAUV4!%Jc@@Q4EU%5DDU0# \LD)0 A1PQQ*.L@ *PH # <t#o5.L@Ѕ *PH # <t#oi>Ms@DP P&r BT[\0?B\X[ $33_MuwFFfTFF `` 9DHuɥFFfP &&ffffrOФ&GF`  C8('NF@E Continuous-MAA0PaNhE)ByBlockAA0P}NhEiByLayerAA0PL(J@@@QD4E$T5$TEE$ .zPwe5 d`0 B X]@0n D@M2Ԑ< mB  eP(@<<@pp~~Ԃ`JPDACADPwi AcadAnnoPOAPwAcadAnnotative}"PwACAD_DSTYLE_DIMJAGnwQY@I Standard@z7ЬsRQ?Bꌨ ףp= ?Bᙙ+^* AT H]BQ?QQL@xQFFfTFF `` 1G}QFF-хѥٔ*B JzG` ףp= ?2+^+ ףp= ?fffffc@z7ЫsR H Iu D ?!F "* 05Sހ@id#,ACDMAC,2016, ACDMAC_F_S@PCC ?J\@@CC ?^"Jj@@W&#@ JCd@@ C ?X=VVdASۙ@ *ZdA!1@j(@"@FFV?MX=VWASۙ@ *ZdA!1@j(@"@FFPWP?=X@HCۙW]X@ e 3@P 43`fvq@GPSWW LLK [\@*@j+7kA(7[\?5@j(@"@BFeGe?/%Z>@eeByBlockjj8 j@@Z@djP j T# ?Z>@eeByLayerjj8 j@@Z@djP j D# o>@S@fU$o`0`p` Aؘ[ @@@ Sa2T@`j`L?&%OꚤP a2T`L?j&%O SjCĮj?|yP5 t` @?VU ףp= ?BT[\z7Ьs@PB+^+Wf0CuEDT?-i?|v5 t` @?VU ףp= ?BT[\z7Ьs@PB+^+Wd0uEDT?6?Ru@F$ STANDARD-DT!? Q>~O8/\P=@SC8ÄC>_mA N@la`>qI$A N܃la>qIdA NAރlaWU=B@jB[\\X[ нj7p= ֣q~'(),-нj7Ιe/Zqp= ֣qнj7~,j.D ,. Df$GĤ,j.D ,ln-n.N,ĥ,j.D ,ln-ȭ̉,ī hh),j.D ,ll- DmGĠ)0ZnX @j"Zp~cSxe X:Jz A:+/>aa StandardzFQ?z7Ьs 0@    0@`,`@8  0@`BXp 0  0@`? d""#l>Ig 4F%6fVD'&V7EfW'6` C \Y[Y@I@C33333>;@P@T@tH Ld 0|e>{g 4F%6fVD'&V7EfW'6` A\Xt@C33333>;@PA@tH \T /k>GiQ 4F%6fVD'&V7EfW'6` BPY[ @C33333>;@PA@tH \ 0g(J@i@@QD4E$T5$TEE$ 1oJ(J@@@QD4E$T5$TEE$# 0(J@@@QD4E$T5$TEE$C 0#q)J@@@QD4E$T5$TEE$ S 1ϒ~(J@@@QD4E$T5$TEE$ 1OKQ(J@@@QD4E$T5$TEE$ /(J@i@@QD4E$T5$TEE$ /](J@@@QD4E$T5$TEE$ /ϻ~(J@i@@QD4E$T5$TEE$ /_e(J@i@@QD4E$T5$TEE$ 0o)J@@@QD4E$T5$TEE$ 3 1(J@i@@QD4E$T5$TEE$s 1/B)J@i@@QD4E$T5$TEE$ C 1Rc(J@i@@QD4E$T5$TEE$3 0+R)J@i@@QD4E$T5$TEE$ # 2o)J@@@QD4E$T5$TEE$  2O)J@i@@QD4E$T5$TEE$  1g)J@@@QD4E$T5$TEE$  2*(J@@@QD4E$T5$TEE$c 1ζ(J@@@QD4E$T5$TEE$ 0O)J@i@@QD4E$T5$TEE$  2/P=`|$1:1AfAf0=j{ STANDARDAfAf0=jbd STANDARD#Af0ء!A3W4!8A}MDCGJWj@@PG?A1H%4!45}MDC5ZA1V4!4A}MDCJc@@ c?Jy@@PD ?}Sdgf'VTR_0.000_0.000_1.000_1.000_VISUALSTYLETf'VTR_0.000_0.000_1.000_1.000_GRIDDISPLAYFf%VTR_0.000_0.000_1.000_1.000_GRIDMAJORFf+VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGf/VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPEFf&VTR_0.000_0.000_1.000_1.000_BRIGHTNESSf$VTR_0.000_0.000_1.000_1.000_CONTRAST@pcЀ?Ļ@k$B[\\X[ нj7Fz~нj7ϗнj7~d,j.D ,. Df$GĤ,j.D ,茮--,ī hh),j.D ,ll- DmGĠΌ@5f@e*"* ""*""`f(J@@@QD4E$T5$TEE$ /(J@i@@QD4E$T5$TEE$ //FJ@e)@@QD4E$T5$TEE$iM-}aI }1e=UQQ!U5 9%0 15J@b)@@QD4E$T5$TEE$% aMMP\ Ԉ'5J@a@@QD4E$T5$TEE$% aMMPX Ј^vJD)@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILEBQTU4EDP=I1 Q%=9Q%1 ؈HD(LSSD@p@ЀD ?ҽSE$@pAD ?ҽ)J@@@QD4E$T5$TEE$  2XJA)@@R4E$TEE$#D$U5EU4T5ETQ }aI }I=U9QI%@ ϐG(J@i@@QD4E$T5$TEE$ 0/(J@@@QD4E$T5$TEE$ 0_(J@i@@QD4E$T5$TEE$S 0j SƛŤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? b Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?K Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?ۉ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?- Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?< Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?t Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?. Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`? Ӊ SƛĤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?* SƛƤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?9\ Sƛ¤t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛɤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L? Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?=L SƛǤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?C Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?zG Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?_ Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?͉ SƛȤt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?)J@i@@QD4E$T5$TEE$  2YS怀$Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?YS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`L?q[S怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@pVe ?Sпdٟ6(0(!3f333f33336f3ffffff3f̙3f3f333f3333333363f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3fff6fff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3fffff6f3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙63f3f333f3333f3ffffff3f̙3f63f3f333f3333f3ffffff3f63f3f (((555CCCPPP]]]kkkxxx6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666b@psPe ?fSdRfMATERIAL]^?HM@p[Pb ?SȭbdFZ$508B35C9-AEE7-456F-BE74-D52651303AC66PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;((k|core.xmlAn Ef[a!maTvO L\,U_8RjF}qoˬz- :Hk@')V/ f6&ӲKڻh\̪E-7ifU#\E髚LA]S#zcg/֬ 0r#3k4KWAV4RL[rh-!6uU,@r"{PnPKpb;U_|cnx.xmlM; Eѭ,E f az}Be %J&dM(2`8G6+1(%*Gƺh \ ϶PKpb;{q fbx/core.xmlSn }EkmK' PT >Mץk_ss9756*3Bҹ)*]fػch#5}+HFex5hTB͠:0kXd?U#CTtI*d!P'x,@Ӑpd*f*`Zu"exAΒ-Y-6nvuQ,*TEDi0%kX'ZSP~&_iGܩÂ"r=!!D  @Nꋏ@ʝ 0WW0t| NN:n6xG8jK0!, :aU6icY?g?QWw%6{>/PKpb;p*H} fbx/cnx.xmlM [ܕ5e!3 6c胇WtգM/r guJ PW+`PbIl'Mvϻz'\ӖL!4ìno*%_i#PKpb;63)16fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/core.xmlQ[n  +U Dn>A/IQbxT9~v/?,X7}0vTmS^:6?40 ~.M $ƌZ!KP )fFV EWKӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 PK6pb;.;i<4fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/objects.xmlW]s8+ NB'SO;D#6z?`GW}[/TȌw'EY̓7vvΕm--F zci; RL%tG\fX2V)ol?тRVdgeNo3=l?ό%;. Ɲ?kҾ8 lxM7^g0Ss7Y &&96!cHsLw`J0;v<rx/F6تV{2$tķg0?bYl{,GN4H|rΗ;g6wwfj~q9򲳨$6 _&NĠ l(}h K緵862eh>+AW1̯ 3|ـ3}ѥF٥BSUDdhq-YjnC=Fozd>TcꋇVZʼJ%9̕.p02K_]3@qɋ335wYkiZ!/&Xw6".I3&ڂ@&hzec5hnxQJ,˟6^`hÿPKpb;5fbx/B8A508C4-431F-45F1-BCA5-5624426FEA3DF/vertices.binPKpb;p36fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/triangles.bincf``PKpb6;7fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/attributes.binPKpb; ѐA6fbx/B8A508C4-431F-45F1-BC6A5-524426FEA3DF/directory.xmlA E"oS 5 $NDHb45FJH] =l09 }Gy+!t* #JX0(aWE{Ϝ6C׶-(.*,f1z{+ !I}PKpb;;F;fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/resources/6core.xmlPKn0 me4T',3!Vz@v}4OGkkz`9 6S1\IIpgm%{Xa|r6.; hBBq St gE60gyNp\ mO ¡)Xcc|m5j*R͑\3kӶe͋,xOFPA1BVwՇtb1e)jr<< 6ev+PK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ6[Content_Types].xmlPKpb;((k|core.xmlPKpb;U_|cnx.xmlP6Kpb;{q fbx/core.xmlPKpb;p*H} fbx/cnx.xmlPK6pb;63)1Yfbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/core.xmlPKpb;N306fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/cnx.xmlPKpb;.;i<4mfbx/B8A508C4-431F-45F1-BCA5-5244626FEA3DF/objects.xmlPKpb;5(fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/vertices.binPK6pb;p36{fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/triangles.binPKpb;76fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/attributes.binPKpb; ѐA6*fbx/B8A508C4-4361F-45F1-BCA5-524426FEA3DF/directory.xmlPKpb;;F;fbx/B8A508C4-431F-45F1-BCA5-524426FEA3DF/r6'esources/core.xmlPKe@`b ?fS$RfMATERIAL]^?HM@p[a? VSaFZ$887D55A9-D0DD-414E-B741-A7DCD4DA2B4C6PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;8|core.xmlAn Ef[akDqۜ@@,U_8RjF}~n,z- ֍=x{@/ ''6*ӼIʻh\̪l D@ꖛI2b*GSgᔬF#V}lUC -9pƎhxzg4-/WXh}QbJ1>i;Bx@i6u}`͏k܃uMPKpb;U_|cnx.xmlM; Eѭ,E f az}Be %J&dM(2`86G+1(%*Gƺh \ ϶PKpb;5q fbx/core.xmlSn }EAmm' PT >Mץ[_ss9756*s#)*]ػchÙ5})HFx1g5!iSMfPtr9jD(BD(8h21?ΌL8gWVL.^$~$/6ޖ6`M)]f.[024sNZ%*0)͂( h%k֔224xW=dzܩ<!#-DP'zC8#C 8'z% 0WW0t| FN:n6ΈpB`B8XtIZlл36~/D]ߕ$Mm)" }PKpb;B } fbx/cnx.xmlM [B5>bYJ6F;g[ۥAFguJ P7'dPbIMn˚]}x^hہQ(nZSck9 6ZCD+{PKpb;/)16fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/core.xmlQ[n  +U .8n zHţ #a}oqh+2Ϩ`+w.6A`QPwiZ l6f:pAG-_zjH13µy."Ung!C q}bt(jѮÇ=Yg)ȍqhI /VP4#B6n>`wy]DiROYβ\y{ʼU \az&gǖ.!:wu\fۖ ^ \6PKpb;N30fb6x/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/cnx.xmlՓn Dqlԉ~Ab$4,U]C kvY=a-w=mkF 8qiW) Ow66JY"i&Tq"~ "&^IE4kWAq8tA *E!x>Kӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 P6Kpb;)e!c<4fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/objects.xmlW]s8+ 4c$>d#Lb$:{6[ <3rti"bqZ$f%ֵi|Θ-3Tf'UT4DD jQF5ELsbJ;&vgvp(6| - / hr6É׫W9?Ci!$)e#1S ..oKϛZ޻ ךC˽N  !I[ F|,ֆ3)bEAxX۬%ƴEOXOUG6OPk{[6q* UM| &mT9$3t 3,UK F++ۊ5vYLA jd*EmY`rUɷԓ H6хeh7KJʥ&}(iYS |A?| o=F6`}Uzvj\囂hv.D݆{6H}`Ypb#,6s ߕpצd֒g8@5Hp -nMv t!R}kdQaop<Ƨ H'En6un '-9[~ 7'eS{@mZAo16/ΙZM;-ċVC}-׮ "r= hZkfgdY K8+U@PeDߟ>shnܧӂ9+`7 @C\L\Ed6!$/h Ny0yp뙣r0Z }`xZ)mGUɲiK=PKpb;5fbx/E7F54B54-67C2-4824-80DC-C4EFE06565DBB/vertices.binPKpb;p36fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/triangles.bincf``PKpb;67fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/attributes.binPKpb; ѐA6fbx/E7F54B54-67C2-4824-80DC-C46EFE0565DBB/directory.xmlA E"oS 5 $NDHb45FJH] =l09 }Gy+!t* #JX0(aWE{ϜC6׶-(.*,f1z{+ !I}PKpb;cxM;fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/resources/core.6xmlPKn0 me NBd9A/`Ib%ȟǯ Tjw̌Gk|qVR(j7{ Cq;ɠjfzF1 *PG>:*UY]]6deN}P,O cpk ZX)R2ê1Ci.=H^4Dݞo]v+,E4OFQE@֔1B(?4j1i)7w,yRTs_y={6V~PK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ[Con6tent_Types].xmlPKpb;8|core.xmlPKpb;U_|cnx.xmlPK6pb;5q fbx/core.xmlPKpb;B } fbx/cnx.xmlPKpb;/6)1Zfbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/core.xmlPKpb;N30fbx6/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/cnx.xmlPKpb;)e!c<4nfbx/E7F54B54-67C2-4824-80DC-C4EFE05665DBB/objects.xmlPKpb;5#fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/vertices.binPK6pb;p36vfbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/triangles.binPKpb;76fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/attributes.binPKpb; ѐA6%fbx/E7F54B54-67C2-46824-80DC-C4EFE0565DBB/directory.xmlPKpb;cxM; fbx/E7F54B54-67C2-4824-80DC-C4EFE0565DBB/resou6#rces/core.xmlPKa@`a?fSRfMATERIAL]^?HM@PDD ?DSD@p@D ?ƽSDd@`D ?\SbFZXj$9BF507EE-FAF7-4A99-A33D-4EE51894BC406PK pb;=3nyyautodesk-design-package.xmlhttp://schema.6autodesk.com/design-package/2009PKpb;Ԇ[Content_Types].xml}0 _e1 sXn6يw_uΓzSLγCY"xаH_AM}%YNFpALv٤>F ƾ@xZB,lhfD׼{A]w˘䬑z+$EHf)[6pS PKpb;|core.xmlAn0EbͶ2@ (e;J&!RjF}vK8 mSN=pG@'V/ +f6&gK٠mHuJ^@Yd"l&&WB#F}b v(eEq |P7E ,u_ZRLOZuU7rafE6Ɔ}b8M<[Ό1] 6V|T.kUeٓhǙ~)HVfx1gѮ[B++TR.{i1*Xd/>d+|,TgYT|!Ȍs\].l]´TKy6yx</Nsm}6-I5 SFfl^F +KCJ7^x4|-]m ]o)ed,kr]dEc"!1DL  @V3@,610v7j0tz FN:m6pBU`BXXuYZ'7 Rڴy/D?TFRD"A?PKpb;qݶ~ fbx/cnx.xmlM [ܥM?P#X62p9v>xxUy)j'G|4u5*݀~vvrƾu@(k'@yz/X-TFUҶ{|PKpb;4(61fbx/858427A4-485F-4042-85A9-C1031689EE1E/core.xmlQ[n  +U $DQ (1X<P;R6!ZzH q]zqR6NR\ %RAfU&A0ʥq2jTNͤ4]xRJ0'qڽ(} i8;l;kE; EnucքgMXdG!x6A$tَWweҺ[β%ܐB|=˜Cu*J`㢝qCǘ|(߻ vChJ]_uPKpb;N30f6bx/858427A4-485F-4042-85A9-C1031689EE1E/cnx.xmlՓn Dqlԉ~Ab$4,U]C kvY=a-w=mkF 8qiW) O6w6JY"i&Tq"~ "&^IE4kWAq8tA *E!x>Kӝee=圼xLnk׃~Hp!lT#G6P+t 9M(rs6^<ƥUWtðLdF(@&T,{ڶb۰[>1d\~"ʻ.Q&+>M@> [Ӝ7 6PKpb;Y3"c;4fbx/858427A4-485F-4042-85A9-C1031689EE1E/objects.xmlW[o8+}BNe&M:SM>T 8-`dN~?!6@N~b.K7EӵGAEIߘZצ8cCf9荩Mߋ9+ -)S9]a4”qcf&dvD$v횰6x0-Ũr6ˑTTNeO_~ I@؀؝,..d2&.\vyܫhi>,$' [ӿoxzNX+~L9 +aaтPiG|H(trpe{~]]1-e*h~ O4K4XI.A򽠦?jc|?֎4)r6Y:WZe[|<.ଠ\*ZM9u|wwx+w Ɠd7R$'2!6j_Pԇ4ο"V~8?Kǯ.R;7$cuH6R$G@(a |LJʎS$[xjUa+@ $jM H?urSq7Qݖe@6uɟFbgL|#+  2+6$ce.qӨѾebO"_WO;>T=tĦ^xݝ-l:fš]|.O6AuSDCJh7?YkD ''O+S \eEJ3K^CEGHL~=;g{TFݹʅLK9IAm]6qe zT+OIz1e6:g{QtH_8V)m4y!STne(oucٯӉh& ;@wTsO@q>ԮS7(?hZ~Krΰ݌vVi?2Q 6A)[[1LZY](O cpk zRdMc\ zMsF~dՌHIלZr>ѷw-oEfɨ=HNiG#޿COVSO4%coq Bj+Gy6oPK pb;=3nyyautodesk-design-package.xmlPKpb;Ԇ[Con6tent_Types].xmlPKpb;|core.xmlPKpb;U_|cnx.xmlPK6pb;h rr fbx/core.xmlPKpb;qݶ~ fbx/cnx.xmlPKpb;64(1\fbx/858427A4-485F-4042-85A9-C1031689EE1E/core.xmlPKpb;N30fbx6/858427A4-485F-4042-85A9-C1031689EE1E/cnx.xmlPKpb;Y3"c;4ofbx/858427A4-485F-4042-85A9-C10316896EE1E/objects.xmlPKpb;5$fbx/858427A4-485F-4042-85A9-C1031689EE1E/vertices.binPK6pb;p36wfbx/858427A4-485F-4042-85A9-C1031689EE1E/triangles.binPKpb;76fbx/858427A4-485F-4042-85A9-C1031689EE1E/attributes.binPKpb; ѐA6&fbx/858427A4-485F-46042-85A9-C1031689EE1E/directory.xmlPKpb;٣g; fbx/858427A4-485F-4042-85A9-C1031689EE1E/resou6#rces/core.xmlPKa@p^D ?%AS@$/f DISPLAYNAME Imperial24fFLAGSZ@`?޿?@C@AP  0@ Q?.zn+ˁ^zF ףp= ?Bd@`z7Ъs @`z7Ъs@`z7Ъs"@`z7ЪsB@`z7Ъs@`z7ЪsAU@T  +^+.zn+ˁ^zFQ?Bz7Ьs?+^*?+^*?+^*?+^*?+^* ?+^*@PTDU @h@ ףp= ?@K^zFQ?.zn+z7Ьs+^+@d0@ ףp= ?@0@ ףp= ?A$0@ ףp= ?B$0@ ףp= ?D$0@ ףp= ?H$0@ ףp= ?@$}QDEAAAAAADEAAAAAADEAAAAACGmSʀYf!ACAD_ROUNDTRIP_PRE2007_TABLESTYLEZ[\]^_@PAA ? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?1 Sƛ$t fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?B Sƛät fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`L?RAS@ʤ/f DISPLAYNAME Imperial24fFLAGSZ@`L? '>zW FDm@A*)hD1LhBiEf:l8 ] @q1@gHG I7iFFC O @T "}> AY @ _GX"@""######$"""#$54444343333)511 ,yG D@=GˌH(_6I q!=iA.&=] ;DX0@p'0CH,DDȿ@nGAϳAAAHHDB.jBvHC߹B@OBB@CCêDCBCߖIKR{!(S$@ <uPL M@A1JI`2V,      A;ΐޭ+1l`@ۿUgdalautotest-3.0.4/ogr/data/cad/line_r2000.dwg0000644003401500001440000034424313614004466020352 0ustar rouaultusersAC1015iD/Fda{V䕠N(^A_:Mwi\ii%#%[%m6((W?D+CPShC(X@?0(!3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3f (((555CCCPPP]]]kkkxxxڒ+b5b{#8_|hNm3_ UЕ@@* 4@L Ad@i@B$@wP%=h N@0 %EU 2vU@xD#-^kQW\A2vW@x@z@r@je BPY@P  $ PP*?C"DuBP(?d?U HQ!@UT  $(-D5E|1QEED8*A$ص ȵ '{DBA90BE5-1E63-4E4D-952D-3D49245E49DD}QlQpQ\Q[Q]8ذ: 0!VG̠ĸĩ_϶=dI= ` ͕AcDbDictionaryWithDefaultEPPSӐTU @"IMLnKm.nl`j #k +K `;@PB@tH \ #oKs=WL`4F%6fVD'&V7EfW'6` Bۘ\X[ 33333>;$ @PA@t H L "`8h=AM`4F%6fVD'&V7EfW'6` A[@ 33333>;@PA@tH g "m=KPQ`4F%6fVD'&V7EfW'6` CQYPܓٙd 33333>;@PA@tH \ $ol=IN`4F%6fVD'&V7EfW'6` CX\]\ 33333>;@PA@tH \ #Olc=yJ`4F%6fVD'&V7EfW'6` AQ]$ @C33333>;@@PA@tH X !So=OJ`4F%6fVD'&V7EfW'6` C]]Y\ @C33333>;@@P@T@tH \$ !c5g=K`4F%6fVD'&V7EfW'6` B\]Y$ @C33333>;@@PA@tH \4 !Fr=UKQ`4F%6fVD'&V7EfW'6` DQ\]Y]Y\4 @C33333>;@@P@T@tH \D !ﱄp=QLQ`4F%6fVD'&V7EfW'6` AY[d@33333>;$ @P @T@t H L "oj=EO`4F%6fVD'&V7EfW'6` B]\ٙD 33333>;@P A@tH \d $/3l=IM`4F%6fVD'&V7EfW'6` C[\]\ 33333>;@PuA@tH:\ #/l=IP`4F%6fVD'&V7EfW'6` Cݙ\[ٙT 33333>;@P A@tH \t $OFj=EL`4F%6fVD'&V7EfW'6` BX[\X 33333>;@@P@T@t H L "ci=CO`4F%6fVD'&V7EfW'6` AYY @C33333>;@@P@T@ H LT $)u=[OQ`4F%6fVD'&V7EfW'6` DYY]Y\ @C33333>;@)@P%@T@t H LD #ոw=_N`4F%6fVD'&V7EfW'6` CY\وܘ^@t @33333>;$ AA@t H L #pp=QN`4F%6fVD'&V7EfW'6` B]@@33333>;$ A A@tH L$ # h=AM`4F%6fVD'&V7EfW'6` BX[ 33333>;@P A@tH \ #>i=CL`4F%6fVD'&V7EfW'6` B\Y[Y@Y33333>;@P@T@t H Lt "O zg=O`4F%6fVD'&V7EfW'6` A T^@ @@@P@PA@t H L4 #ϸ""SZJe@PCC ?OJc@@444P9 51IMQe1 CTABLESTYLEDPՒQUURSS@$5dUu4T5D5EP%%5MM=  HIDETEXTBRSVU$Ud11eI9=Q%dLIGHTINGUNITSBTS@4%DTE0-a 1%AI510PD@HL h d `(,$ \?jd Metric50A0N?jd Metric50A0?^2AA0$\?^d1AA0_?^$0AA0^?^r0AA0t?^r0AA0!l?^rd2AA0n?^r$1AA0ͯ?b127AA0@L?^Q2AA0ֱSց@$DWGPROPS COOKIEsim ,=-=.=/=0=1=2=3=4=5=(EaU?)ĿBA*!<ĿBAZ@PCC ?eF&Ls@]) *Paper_SpaceUR AU]4!#OP(Ls@\) *Model_SpaceUR  1D@`4!J,f * AU\4!Oל&Ls@[) *Paper_SpaceUR jrWOAU[4!OMLU)0 A0PQQ]$'MD@Ui Standard`txt@?HMGVFFfTFF `` B[]]@0?A$3l'NF@Wi Continuous-MAA0P8NhVByBlockAA0PNhW)ByLayerAA0P3(J@@@QD4E$T5$TEE$ !OGPuU5` B X]@0 E r@+nb`w;ؓ\$*P(@<<@  HHԂ`PUACADPWAcadAnnotative"P^ACAD_NAV_VCDISPLAY3.P@_)ACAD_EXEMPT_FROM_CAD_STANDARDSQyV $hEOATL@2?C"DuBP(?d?U HQ!@`Q[VQFFfTFF `` B[]]@2+^+?zvz7Ьs*Bz7Ыsffffff9@d ףp= ?U "RP@`d!Jd@@DԤtp !/f1Sր@^ ,ACD,2016, ACD_F_S_TL@PCC ?rJX@@CC ?KJZ@@WG&3S(?\[F[[XYHܚ]\ *ZdA!1@j@z@r@@xD#-^kQWTA2vW@x#-^kq0CPXP[?k?|]F[[XYHܚ]\ *ZdA!1@j(@"@EPXP]?Kg?r\F[[XYHܚ]\ ji5@j(@"@DPX\U?=@b@FdByBlockUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@0BPD Fp=@b@DdByLayerUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@ D Dn=@`@HdGlobalUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUeOUUUUUYSP UUUUUVTUUUUUU?jUUUUUU?UUUUUeOꚤ@@EUUUUUYSUUUUUVT@DD HM k>@|Y5 $` @?VU ףp= ?BT[\z7ЬsAB+^+Wd0YVUT??Ru@X$ STANDARD-DT!? Q>~O8/|Ø?SC8Æ=_PA N@a.=oQ$A Na=oQdA NAa7>SBZdBSY]XL̀('(),-Ι`(\D,j.D ,ln-n.N,ĥ,j.D ,ln-ȭ̉,Ĥ,j.D ,ll- DmGĥ )1@j"Zp~cSxe X:Jz AjꊯG>aYd Standard?$ 0@    0@`,`@8  0@`Xp 0  0@`?d-k=GK`4F%6fVD'&V7EfW'6` C \Y[Y@I33333>;@P@T@tH Ld "/e={K`4F%6fVD'&V7EfW'6` A\Xt@C33333>;@PA@tH \T "]j=EMQ`4F%6fVD'&V7EfW'6` BPY[ 33333>;@PA@tH \ "_a(J@@@QD4E$T5$TEE$ #(J@)@@QD4E$T5$TEE$# "d(J@)@@QD4E$T5$TEE$C "O\(J@@@QD4E$T5$TEE$ $:(J@)@@QD4E$T5$TEE$ #_'|(J@)@@QD4E$T5$TEE$ !s(J@@@QD4E$T5$TEE$ !B(J@)@@QD4E$T5$TEE$ !ߟ(J@@@QD4E$T5$TEE$ !z(J@@@QD4E$T5$TEE$ "((J@@@QD4E$T5$TEE$ $?Qk(J@@@QD4E$T5$TEE$s #?CA(J@)@@QD4E$T5$TEE$ $_4(J@@@QD4E$T5$TEE$3 "*(J@)@@QD4E$T5$TEE$ $ذ(J@@@QD4E$T5$TEE$ #w(J@)@@QD4E$T5$TEE$ #(J@@@QD4E$T5$TEE$ #0(J@)@@QD4E$T5$TEE$c #ʚ(J@)@@QD4E$T5$TEE$ "_(J@)@@QD4E$T5$TEE$ #?`e$1:1A0h?jdd STANDARDA0?jd$ STANDARDA04 A3]a4!8A}MESA1\e4!45}MESuA1[c4!4A}MESY|S$gf'VTR_0.000_0.000_1.000_1.000_VISUALSTYLET/f'VTR_0.000_0.000_1.000_1.000_GRIDDISPLAYFf%VTR_0.000_0.000_1.000_1.000_GRIDMAJORFf+VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGf/VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPEFf&VTR_0.000_0.000_1.000_1.000_BRIGHTNESSf$VTR_0.000_0.000_1.000_1.000_CONTRAST@`?pS (-DT!?@`L?5>BZBSY]XLFz~π\,j.D ,茮--,Ĥ,j.D ,ll- DmGĥ Ό-F@I* +*++(J@i@@QD4E$T5$TEE$ %/(J@i@@QD4E$T5$TEE$s %o(J@@@QD4E$T5$TEE$3 %OċJF@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!! !MSG@pAF?~SH$@pAF?CSGd@p@F?ӂJD@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!!!!!!MSE@pAD?6SF$@pAD?rjSEd@p@D? JH@@QD4E$T5$TEE$% U5AQ%1 DIFFUSETILECPUUS@$TdT5DDP=II Q%=9Q%1 SPECULARTILE0"!$!#!'!&!(!%QSI@pAH?TSJ$@pAH?8SId@p@H?ب(J@@@QD4E$T5$TEE$s $Ϭ(J@i@@QD4E$T5$TEE$ $XJi@@R4E$TEE$#D$U5EU4T5ETQ }aI }I=U9QI%@8 '(J@@@QD4E$T5$TEE$ "?(J@)@@QD4E$T5$TEE$ "z(J@@@QD4E$T5$TEE$S "Ƈ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?q- Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?AZ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?g Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?҉ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?; Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?! Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?| Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?͉ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?; Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?W Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?] Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?Չ Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?FI Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?> Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?ܺ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?5 Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?j Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?(B Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ?r(J@@@QD4E$T5$TEE$ %YS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`L?lYS怀Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`L?_YS怀$Gf SHADEPLOTFfSHADEPLOTRESLEVELFfSHADEPLOTCUSTOMDPIF,@`?½dSRfMATERIAL]^HM@PFF?HSG$@p@F?ӖSF@`F?(SG@pAPF?jdSdRfMATERIAL]^HM@PDD?SE$@p@D? SD@`D?(SE@pAPD?6dSRfMATERIAL]^HM@PHH?zSI$@p@H?ؼSH@`H?+SI@pAPH?@;S@$)f!ACAD_ROUNDTRIP_2012_MLEADER_STYLE*@`?:?S@-f DISPLAYNAMEMetric50fFLAGSZ@`L?t?@C@AP  0@?>@d@`# @`#@`#"@`#B@`#@`#AU@T  I>?$????? ?@PTDU @h@@@@?>$I@d0@?@0@?A$0@?B$0@?D$0@?H$0@?@$}Q4EUAAAAAAEUAAAAAAEUAAAAAClSʀdYf!ACAD_ROUNDTRIP_PRE2007_TABLESTYLEZ[\]^_@pOL?{ Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`?L Sƛdt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@` ? Sƛt fRTVSPost2010Prop28fRTVSPost2010PropOp28FfRTVSPost2010Prop29fRTVSPost2010PropOp29FfRTVSPost2010Prop30fRTVSPost2010PropOp30FfRTVSPost2010Prop31fRTVSPost2010PropOp31FfRTVSPost2010Prop32fRTVSPost2010PropOp32FfRTVSPost2010Prop33fRTVSPost2010PropOp33FfRTVSPost2010Prop34fRTVSPost2010PropOp34FfRTVSPost2010Prop35fRTVSPost2010PropOp35FfRTVSPost2010Prop36fRTVSPost2010PropOp36FfRTVSPost2010Prop37Z2fRTVSPost2010PropOp37FfRTVSPost2010Prop38fRTVSPost2010PropOp38FfRTVSPost2010Prop39?fRTVSPost2010PropOp39FfRTVSPost2010Prop40ZfRTVSPost2010PropOp40FfRTVSPost2010Prop41ColorIndexZfRTVSPost2010Prop41ColorRGBZfRTVSPost2010PropOp41FfRTVSPost2010Prop42Z2fRTVSPost2010PropOp42FfRTVSPost2010Prop43ZfRTVSPost2010PropOp43FfRTVSPost2010Prop44ColorIndexZfRTVSPost2010Prop44ColorRGBZfRTVSPost2010PropOp44FfRTVSPost2010Prop45fRTVSPost2010PropOp45FfRTVSPost2010Prop46Z2fRTVSPost2010PropOp46FfRTVSPost2010Prop47Z2fRTVSPost2010PropOp47FfRTVSPost2010Prop48Z2fRTVSPost2010PropOp48FfRTVSPost2010Prop49fRTVSPost2010PropOp49FfRTVSPost2010Prop50Z2fRTVSPost2010PropOp50FfRTVSPost2010Prop51ColorIndexZfRTVSPost2010Prop51ColorRGBZfRTVSPost2010PropOp51FfRTVSPost2010Prop52?fRTVSPost2010PropOp52FfRTVSPost2010Prop53ZfRTVSPost2010PropOp53FfRTVSPost2010Prop54strokes_ogs.tiffRTVSPost2010PropOp54FfRTVSPost2010Prop55fRTVSPost2010PropOp55FfRTVSPost2010Prop56?fRTVSPost2010PropOp56FfRTVSPost2010Prop57?fRTVSPost2010PropOp57FfRTVSPropertyOp0FfRTVSPropertyOp1FfRTVSPropertyOp2FfRTVSPropertyOp3FfRTVSPropertyOp4FfRTVSPropertyOp5FfRTVSPropertyOp6FfRTVSPropertyOp7FfRTVSPropertyOp8FfRTVSPropertyOp9FfRTVSPropertyOp10FfRTVSPropertyOp11FfRTVSPropertyOp12FfRTVSPropertyOp13FfRTVSPropertyOp14FfRTVSPropertyOp15FfRTVSPropertyOp16FfRTVSPropertyOp17FfRTVSPropertyOp18FfRTVSPropertyOp19FfRTVSPropertyOp20FfRTVSPropertyOp21FfRTVSPropertyOp22FfRTVSPropertyOp23FfRTVSPropertyOp24FfRTVSPropertyOp25FfRTVSPropertyOp26FfRTVSPropertyOp27FfRTVSPropertyOp28FfRTVSPropertyOp29FfRTVSPropertyOp30FfRTVSPropertyOp31FfRTVSPropertyOp32FfRTVSPropertyOp33FfRTVSPropertyOp34FfRTVSPropertyOp35FfRTVSPropertyOp36FfRTVSPropertyOp37FfRTVSPropertyOp38FfRTVSPropertyOp39FfRTVSPropertyOp40FfRTVSPropertyOp41FfRTVSPropertyOp42FfRTVSPropertyOp43FfRTVSPropertyOp44FfRTVSPropertyOp45FfRTVSPropertyOp46FfRTVSPropertyOp47FfRTVSPropertyOp48FfRTVSPropertyOp49FfRTVSPropertyOp50FfRTVSPropertyOp51FfRTVSPropertyOp52FfRTVSPropertyOp53FfRTVSPropertyOp54FfRTVSPropertyOp55FfRTVSPropertyOp56FfRTVSPropertyOp57FfRTVSPropertyOp58FfRTVSPropertyOp59FfRTVSPropertyOp60FfRTVSPropertyOp61FfRTVSPropertyOp62F@`??S@$-f DISPLAYNAMEMetric50fFLAGSZ@`?9z5]DzD^]DzDY]DzD@/@eHF I5gFFCD@CGJ9!x!!""""""#!!!" AKDl9xA1j7|8r5Ij'gO(gR(gEBK F-^k*irXpB6DbADЛAAAADD֕DԆB0lBvECʾBAPCCۮDƧCCݠBBޭAТEDGơEDDD@XXu{!(S$@ <t@PL M@AD O`d)V[     _ >fFq+1l`@ۿUgdalautotest-3.0.4/ogr/data/bigoffset.shp0000644003401500001440000000050013614004466020013 0ustar rouaultusers' vH7BvH7BjvH7BvH7B ????vH7BvH7BvH7BvH7BvH7BvH7BvH7BvH7BvH7BvH7Bgdalautotest-3.0.4/ogr/data/several_schema_in_layer.kml0000644003401500001440000000213513614004466022705 0ustar rouaultusers An instance of A fieldAValue commonAValue An instance of B fieldBValue commonBValue gdalautotest-3.0.4/ogr/data/3dface.dxf0000644003401500001440000000036613614004466017171 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 3DFACE 8 0 10 10 20 20 30 30 11 11 21 21 31 31 12 12 22 22 32 32 13 12 23 22 33 32 0 3DFACE 8 0 10 10 20 20 30 30 11 11 21 21 31 31 12 12 22 22 32 32 13 13 23 23 33 33 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/fake_s57.0000000644003401500001440000000036713614004466017167 0ustar rouaultusers001653LE1 0900047 ! 340400010430000DSID07500430600;& ISO 8211 Record Identifier(b12)1600;& Data Set Identification fieldRCNM!RCID!EXPP!xxxx(b11,b14,b11,A)00082 D 00053 550400010000300000DSID0002600003 XXXXXXXXXXXXXXXXXXgdalautotest-3.0.4/ogr/data/utm31.ID0000644003401500001440000000000413614004466016515 0ustar rouaultusersgdalautotest-3.0.4/ogr/data/pointzm_with_all_nodata_m.shp0000644003401500001440000000027413614004466023300 0ustar rouaultusers' ^ ?@@@@@ ?@@ @@@gdalautotest-3.0.4/ogr/data/empty.shp0000644003401500001440000000014413614004466017205 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/ogr_gpx_8_ref.txt0000644003401500001440000000111113614004466020617 0ustar rouaultusers ROUTE_NAME ROUTE_NAME2 TRACK_NAME TRACK_NAME2 gdalautotest-3.0.4/ogr/data/CoHI_GCS12.shp0000644003401500001440000003065013614004466017475 0ustar rouaultusers' d 2@7nYcht;6@HFaEc 2@7nYcRKs+E4@ ԁcB3@cvo 3@֦cȳ3@ڨNc٬\3@hV3c AL3@NEsc_||3@b@cRDU3@~cYE3@@C`~caf3@8~?~c={3@6"~c703@`}cS3@nmy}cJ3@X4}c3@eM}ccn3@YM|cM#~3@\u|cJR3@#|c~K3@:]|c8+3@(̽{cD¾D3@<+i{cȕ3@vzc ù3@V횐zct]1#3@>;zcOXp?3@ iQzcxSt$3@ꐛzc]+3@dWZFjzcD4@YwzcM~ 4@IZ6{cͩd4@o{c×"4@hHK|c S4@e|c}"nN%4@=|cM+44@>]ݱ|c`m\<4@;O|chWA4@]>|czUC4@4I,){c.ފD4@-N{cRKs+E4@paxyc~TB4@QۆQyc"?4@TTJxc8d>4@4@&wc y;4@iwcn94@5ڋwcO`64@Orwc44@EJtc*4@?,tcUBwI%4@='oscp ]lZ%4@lsscES#4@ۂ:scg 4@#sc4@Yrc۠[4@`rc:]4@0rcek!4@tuqcz"O!4@pc'4@pc4@gpcC94@nc$4@zO4ncQf4@'lc+f*4@"ulc߁V4@T glc.4@ُjc W@ 4@yticǚA4@K icŸ4@rmhc`4@pgcaL{3@O9&fc-3@`:fckW3@oec 3@S"^dcdVA3@w*dcF74e3@"3dc>$3@Occ3@7A`ccRb3@UpccOY3@t(cc(3@Z ccƃ-3@i3Nbcm3@ s bc;jL3@ƒf׽bcp3@|bc E3@Ipcc.3@+v03@8kmc -3@2mc+3@φ3ncՏS&3@~ncrn%3@IIC+pcSMM#3@->xpc!3@&lscpc2 3@JB"mcpc3@);pcгY3@'*pcX3@?pcr:;3@D oqcO3@H٢qc3@Oqc85| 3@qce# 3@f\S rc/S3@src y3@8N rcH3@ksck*2@L5sc# 2@aR||BscM2@d[sc0l2@tcZkB2@tcQ<2@8jtc.2@[;Quc622@[uc 2@Duc83|/2@GvcL-a2@Ԯ<vc`Z2@.vcbZ2@;wcM-2@PeoxcmY2@\yc"9`W3@4ES{c+4D3@>yX5|c7Ma 3@D[J|c@)V 3@B%c\|clIF3@ |cD-ͭ3@E>}cvu3@|}c]3@=tZ}cb0'3@q0'|cTm773@Y|cE:3@t|cIgE(B3@3Mg|c4ӽNF3@ǁ|ca L3@h8e|crJ@LV3@]=p|cBY3@p|cHi6`3@oB@>}cH2f3@Ǟ=}cEB[j3@ѯ~}cJY8n3@}c[Tp3@+}c (w3@?O}cw @z3@\~l}crl={3@+}c$\#|3@d}cR|3@ l}chF ^{3@vy ~crYH{3@(r~cc|3@n!~~cS"}3@Dh~c}3@ۆQ~cޙ3@C~cwcA3@-~c3@JcQVS3@-c3@XvMcN3@IEcctXᖏ3@Ũkc1l3@c cmQf3@̱cdJ$˨3@hcCR3@c+H3@,c)(̭3@Q%'cZ3@h㈁c˙3@X"cBW"3@c}3@FaEcY{3@ ԁcB3@c-A5@ q۴cls5@'cH+5@?$cS*5@fF?c5@> ףpcu5@ACcI45@@jc0E5@ ic_5@/$c/'5@^c@vcD5@cĕ%:ˠ5@9#choɤ5@i"cv5@Fx c猨5@) 0c$H.5@c9@05@DcZ|?5@xE𿕿cf5@%cls5@3?OcL^H5@6^I cC5@O@aýcV/5@e?c 5@ݓcJsע5@oŏcr_5@p ?%c4}v5@Ѽc#G5@N@c$}ZE5@t'c2עh5@׿cKƼ5@cIN5@ec$z5@q@Hc<5@q@Ⱥcy5@R]˺cŧ5@ʋL/ceu5@THcs5@ c Ac<|w5@kHccnu5@ecIطt5@2w-!cN@s5@Fx cm4p5@ɹcan5@ O+cl#fj5@YcsSj5@Vȸcl?k5@B)cyen5@z8̸c^%t5@B)c p.u5@_wcpv5@+"cpv5@Uc ކu5@^jc=Ǹt5@k^ gcYq5@!֋c#c" g5@"ݨ-ck=j?g5@^HR)cq>g5@$1 (%c9g5@r c 2g5@(OcMq6^-g5@V[c_f5@cFIiOHf5@:cAfe5@M Ocb5@Ucg_a5@&䃞Ͷc~:p^5@46c-A5@ׁsFcqV}B5@G_cZӼC5@qhco"lxzE5@\잺cO;OG5@EGrc ףp=J5@GzcT9vN5@㟼c?iQ5@g}[ļc}cS5@ኍIcLUDT5@RgcQ5@כ_cfoSP5@IR#;cO5@tM&cFN5@xc(xN5@Qnlc+P5@puc,xQ5@?QcS5@BX%c0ܹ0S5@<\c@fgQ5@X9cH.O5@xllcVN5@Zcy $(~L5@5;Nczz,CL5@L=cQIM5@vq c8[ Q5@Rc;pΈR5@<co'S5@^~czT5@MhXcpU5@c w.T5@PCc~m[5@lV}c>W[_5@cZ(b5@l,cYre5@/ncm4g5@!c_?h5@ocWk5@U@cwCn5@?a'cLۿr5@^cyu5@'cPCx5@~jtcZ|5@ec ~5@#~jcTt5@c{=A5@a0c`65@c;Ou5@ s6d}p5@%̴+dXm_5@d:5@kdVL5@dxϝ`5@GidV5@*Td}5@"i7d*5@(XQd[5@%XdsW5@K̳d +TT5@d5@d5@bdȪ5@ `[d5@d55@ `dH5@d5@-c_ s64@"cymS<.:5@>4JDc!4@OicHZօ4@`cP04@~xc4 ж4@1v’c}4@VRc$N>=4@.R2cMMӃ4@Kc <4@*lc ͋4@!fc_ s64@7ڕc>n4@~B=}c=4@sxcoN4@KKcYO4@P@aÕc^/혎4@ ٔcw)uɐ4@lɪc/L4@đ"cXO4@X+uc+H4@&cfښ4@]c(@4@0`c՛c5B44@YK}c'C9Ѯ4@H 1cPR4@SH^cJ.4@cBj5@ cK)5@K…<cJF@#5@NncyC5@*cC7{cR M5@'dcy94@&l?c仔d4@''dcV 4@UcHM4@҆@cE`L4@0 {c 2p@4@tFޏc9U4@v|ȏcg4@ztdcL^4@a1cv4@ c3`4@9 {Zc{h4@=c?=x4@U݋c/De4@>Hc4@^c[ zo 4@rqcjQ4@QocLJ4@ fbc.5B?4@lԉcWW4@)cba4@g͈c4@' __kc25 4@fÇc-&4@*cĭ4@)w#cB臭4@c4@zR&54c4@cQu:4@/c4@: ci54@$c~M֨4@N$cLL4@H<cä4@"c+z4@`Hcd.24@؀c6׆4@BFcVC74@ۂcܨN4@Qc̃R4@gsc}>ʈ4@cP3cX@կ4@‚c,4@v5yJceO74@fc y74@uTcy4@њc[4@F*kc 腧4@ ܂cWW4@I߃cC.94@(c|X4@0c9ȓ4@lwcP4@c* 4@FcFI04@qncS⬈4@` zocoş4@cvC54@P,c{4@7ncv>4@z 5c^x4@c1殝4@:lcDS[4@܈'ctp4@6^7cG@0G4@,ccp{4@X"c=#4@ΧUc04@]AAcyC4@)c9q4@٬܋c;)4@~͑c4@P}>Jc7 4@|1Y\c j4@,.McbD4@)^c0:9C4@^cn!4@ȯcuO4@ہ:эcTO4@?c84@P:7cx4@,cHҿ$4@]kc=qh4@ro~DcF64@#2cA4@c[cE7mi4@h>ncBV4@~c54@'+c_̖4@ʎc4@^-Ɏc|֊64@pَc\T4@~k'c7n4@c _4@x ch4@p]1c\o4@]c __R4@ ΐc4@xC5c&E4@ 7c*<4@~^cd4@^ c4@}c94@jf-cJ4@{hc4@?Qc4@ecÿW4@r,&6cR4@UHɕcOs4@ KcNN{J5@Aϝc8GnM5@~cXİ5@zcg5@3cN>=5@b.䑔c5@!ӓc*q5@L0cSW5@V cW]5@;Mfc35@cBj5@ۂc nl85@ ?cN ^85@?0`ɦc85@wc#85@2ou(c5=((55@U c)U45@Pcawa35@ ףpc9d35@cȠc>35@Ec[35@Hc> +25@"c0725@I`sc_uHg05@~4c0.R05@$9c_gE05@{(ђGci05@F/7wcG9'}/5@%Wc .5@ฟcW}/5@!˛cp=y05@NZoc,?255@܂cS55@F0}cFR65@>+c75@cwc}75@Ϟcw7N65@qsc15@mc;.5@:=FcSNB -5@rIbc[+5@a1c* *5@f׽c(9 {*5@^cPYh+5@\nc,5@M~2ƛc*5@hXRc%2*5@]Mc 1,5@@Hc.5@z9[cW\-5@y N}c B ,5@>ӞcYp)5@i5cbt@)5@gΖc\$[)5@aږcj5&5@$ڎ;ckLOX!5@=@cX55@[wԘc5@EB[Nc_5@nic*]g5@52cg\85@JAc 5@#cW 5@yVҊcCD 5@K;cG5@\R݄cX5@0*cgXQ5@]wb֠c5@`<cܶQ5@pl4ctw 5@3ތcŧ5@|}K c=h:5@cˑ\C5@icN߼5@ƈD!c+15@%Ίc.mq5@-cscz5@lc˻!5@74Dc ,"5@HMfc>h%5@W\cǵb(5@7بcd8)5@ӜȨc;Ū)5@ܛ0QcR㥛,5@}&cGTn.5@$?c':05@oB!cb.55@Sƿ8cXI575@ ]cf75@kc"85@ Wc:7m95@XiR :cymS<.:5@ۂc nl85@gdalautotest-3.0.4/ogr/data/geometrycollection.geojson0000644003401500001440000000044613614004466022635 0ustar rouaultusers{ "type": "GeometryCollection", "geometries": [ { "type": "Point", "coordinates": [100.0, 0.0] }, { "type": "LineString", "coordinates": [ [101.0, 0.0], [102.0, 1.0] ] } ] }gdalautotest-3.0.4/ogr/data/gjpoly.dbf0000644003401500001440000000025113614004466017313 0ustar rouaultusers_aHFIDN NAMEC< 1 Polygon 1 gdalautotest-3.0.4/ogr/data/wfsjointlayer_not_understood.xsd0000644003401500001440000000263113614005360024076 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/invalid3.vrt0000644003401500001440000000027313614004466017604 0ustar rouaultusers poly.shp foo gdalautotest-3.0.4/ogr/data/vrt_test.vrt0000644003401500001440000000402513614004466017744 0ustar rouaultusers flat.dbf flat wkbPoint data/flat.dbf flat WGS84 fid wkbPoint data/flat.dbf SELECT * FROM flat fid wkbPoint data/flat.dbf flat WGS84 fid wkbPoint data/flat.dbf flat fid data/flat.dbf flat fid data/flat.dbf flat fid ]]> src_layer gdalautotest-3.0.4/ogr/data/poly_spatialite.sqlite.sql0000644003401500001440000000350013614004466022555 0ustar rouaultusers-- SQL SQLITE CREATE TABLE spatial_ref_sys (srid INTEGER NOT NULL PRIMARY KEY,auth_name TEXT NOT NULL,auth_srid INTEGER NOT NULL,ref_sys_name TEXT,proj4text TEXT NOT NULL,srs_wkt TEXT); INSERT INTO spatial_ref_sys VALUES(32631,'epsg',32631,'WGS 84 / UTM zone 31N','+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs',''); CREATE TABLE geometry_columns (f_table_name TEXT NOT NULL,f_geometry_column TEXT NOT NULL,type TEXT NOT NULL,coord_dimension TEXT NOT NULL,srid INTEGER NOT NULL,spatial_index_enabled INTEGER NOT NULL); INSERT INTO geometry_columns VALUES('poly','GEOMETRY','POLYGON','XY',32631,1); CREATE TABLE spatialite_history (event_id INTEGER PRIMARY KEY,table_name,geometry_column,event,timestamp,ver_sqlite,ver_splite); CREATE TABLE poly (OGC_FID INTEGER PRIMARY KEY, GEOMETRY POLYGON,area FLOAT,eas_id FLOAT,prfedea VARCHAR); INSERT INTO poly VALUES(1,X'0001CAF80400000000007C461D41000000202E2D5241000000C016521D41000000A0EA2D52417C030000000100000014000000000000602F491D41000000207F2D5241000000C028471D41000000E0922D5241000000007C461D4100000060AE2D524100000080C9471D4100000020B62D5241000000209C4C1D41000000E0D82D5241000000608D4C1D41000000A0DD2D5241000000207F4E1D41000000A0EA2D524100000020294F1D4100000080CA2D524100000000B4511D41000000E0552D5241000000C016521D4100000080452D5241000000E0174E1D41000000202E2D524100000020414D1D41000000E04C2D5241000000E04B4D1D41000000605E2D524100000040634D1D41000000E0742D5241000000A0EF4C1D41000000E08D2D5241000000E04E4C1D41000000E0A12D5241000000E0B04B1D4100000060B82D524100000080974A1D4100000080AE2D524100000080CF491D4100000080952D5241000000602F491D41000000207F2D5241FE',215229.266,168.0,'35043411'); CREATE VIRTUAL TABLE idx_poly_GEOMETRY USING rtree(pkid, xmin, xmax, ymin, ymax); INSERT INTO idx_poly_GEOMETRY SELECT OGC_FID, ST_MinX(GEOMETRY), ST_MaxX(GEOMETRY), ST_MinY(GEOMETRY), ST_MaxY(GEOMETRY) FROM poly; gdalautotest-3.0.4/ogr/data/test_point1.gml0000755003401500001440000000425713614004470020314 0ustar rouaultusers -1.3501138991774910.1666231936981584 -0.52409271914723420.8245083207261725 -0.924357034795764,0.824508320726173 1.000 1 1 -0.524092719147234,0.499452240596797 2.000 2 2 -0.717738710070079,0.166623193698158 3.000 3 3 -1.159493626862817,0.178726068130836 4.000 4 4 -1.350113899177491,0.53576086389483 5.000 5 5 gdalautotest-3.0.4/ogr/data/samplemap.gtm0000644003401500001440000006776613614004466020052 0ustar rouaultusersTrackMaker`(?O?_Z ArialArial Samplemap@TXAmtr@ riobranco.jpg:?_<<park.jpg'/?l ;`;L35GWAY6 Santa Cruz Stadium\p%RK5iGWAY6 Joe's Goalkeeper Pub6q%YF-5f3.G33543400 City Hall=ArialArialArialArialArialzJ -52[Gc-5qG!83-5QɑGK:q -5c,իG'8X-5i-Gc-5qG]16-5^I-^G--5xoJG15 GE{\25G15G(15G~15G15hG15 GSan Sebastian StreetBarao do Amazonas Street Curupira ParkJFIFC  !"$"$C" V !1AQa"2RqBr#3bu 6D$&45CSV78FTs0 !1AQaq"2BR ?h""" """ 9-?CZ\.5tt6E8Lڗ]!fb 惽C72;kEt7;lk+rC]rsO 9+6qilDEP" """ """ ""z-=pxdHFw\ppyl[{q67 FI t.q'.s\I$ĒIZ75!ېQ5C;,nx;p=or inVPC~""DDD@DDD@vmN)()YOS3b8czEljVܦn~odo7§+u5ۅ3sh~Khk\.ۦU;iе媯l2c|9H]1)Lws.n=/u QRtcy 4úN[5Dz^ͻl#%7}lޯr_vQ$*L:8{9 =h/KݦKimtSz{[y9+˯"s tm`:Y_nL -E)UR {%OMR`4"GDd cr(fQRZgz6\;ɉnbso[in¦^2Hiis>iHH^)38{ZR{z*[J:$"3u]k; {E QSF);Fd $g !\k4%k+SffCn@Galy pK͞RW }r{ 8{ZC}"辒}Ejh퓻Fi|\|~AYGp iFc 8aOm;YA=9f4 Z9g1@_dD@DDD@z$q0G8 -76h-WWP5ksdx; z~x]di! 5j͚h=Uԛt'0:"geßrS%5PF͵Ou] Cww {^lhz"yl9bE] 'p˦,_w}fmX.Q~[ϧx=!սϖRA }k-?=3{tl(LC ]݂rd͂=m5]#8$/lqNqϵeYk,f2{E)/GH5O [;[LF=mƮmwJ稪L@Ah9kxcx C:;D[D@DDYi[5shnywn$av38q' گ:Ag^]K=""М""" """ ,%m5k}CMPѹ,lQqp IB[lkK3= J7舦)D@bݢS RV>'&,i-‡tVSN*`?iTŲhNFMG#9k*vyG[!V];)+5Ύ5 is9JS#-oGDQLXow}3s,һwI<J*MTkVAnR@p3]8v˻+lzanTG$_s'lM#օ@E6ݭx렊C#[Xyr>]Kʊ7W4~5CuB]'vv8;[eQsY=Ͼ*IkX.T \C&h>qVD֙n"-M.~UmY'Jy~(< \V@ !i #6_n5_]Jm=?oM|\#%|I޶۵h}nIEeayvAՊD[껓9S-[e_#6gI?~8M_ u~pJ/fu$OI;ND$n"l整6 -l@gvcdeu &W^Mmm^6^-ꈠd2J= I ` Ͻi7SZiۆnFKcN{^?F~Ŭ֎H^**!XࠞR/Ȫ#A4ƣkԒ4-d&'Ӷ=[7C\ւN\;]ΎbWLg{9'EzrKZCQKJ[KOOލyZoA.-rmIm}E m B~B-MZ-BM!ڵmєxΝz7:CZ8h$m"K|ʏaE't+QZ8 m'NZIVˋ'gH‚nh'2X]5Ol|^tfj2ϖ߀ϵ,Z7)˼?@~#O*vçwKc\`6P*%ҾG:(r4 'y5~4מ!*x^ݽ]{{Pꚫ H#l46tubYK@>|m#[ݓڹ\ڬy+|eK{k߹lƃBFY/\cwV_HZ1O\Tj䥙,2Gۧ6w&k.U5.^ٗd;O/ Rl^7^;V9= yj&dVE+>V8@x-I@ήc-<~π8]8p<{=-YZo{Ő֝&7O)t94kN͜A*`X慓C#$crȂ9BnKLӏ6s-a^-]AS = isuڻ>2(뛮.}ێbQ/ԒJ ֹ 3/KWQ ^',`8tl~A+#`=Bup{Z;Ȅ%8=2-=s7"/(x " FAx,=֞(1ecZgkȳ}4>EAj2[Zp֟4]~ε}R[p|mTZ0Eևez3 ;T9}r<Tmr̊5j\uMH\$c|x}n;;1Sss;*ұ i*iaFAE!n־8VCTj$4`;@ st2|}ތXWTLoem4ʮ)LkpOb>RuW34\\>\gZ. UkGҵxW\+.Y= |ӷ?M۹AYKM !5-8o5մɗ+uIW5h;h9J'm2hvB.Qѽ?9v9{d\_z\^)F8?'4XV[ohі |2;|juMmDC!sf׶ښF#`QieprmݏU*KG?G&:ljaAG0EIN֖D8)pku@ԗ[}i1付`h<5LVt_yojtׇZRIt]-ps>ŒL   <%kҚNZ%$+a{Ժfm X耦akw< <CG0ɴzh'fW8D.^4!ޟчK7;m>?4O5֑pI]jpնwTPR|ی|WrQ*ya\=R:[me15tҿcCi[|pN318}9*u~;p;FWC]^O%tD^&UXu%O) kH9 Dڧn[74u5ơ t-axhwN nfm-S}YkVM}m '뭔s^mwYj]. Ptl/-kG} rܧgɿ;(^}6LpܩgWWmiM/i7[-QP0Uen^wrm?\\3C\xxr6imΚhCO/u/[d/c}ܺZ=Cf#3ekkVAm3[v<'ѧ{>W{)ѝ/GN6OtQޚoKM#s8i(WhQ-icp7w~ȡsN= V0g.1FBu0VRCWK3&69kA *T.M3H Ӌ9sIϰ)WxnFn?]o'tD]y((.1n {D@DDѶh_ X^AKO54L0a~[َUIw39-u}4 vF)kq}}딠IiJj5Fm&x*5:k㦿h5G˶UVRŤmwg̔ЇsK:DSNwrERXeK)A?t).7mu>Mʑi: r0SrO.cGGկaݳkåF>\w6tHQY4R2do>|vG4Nh$o9h!ø{U"k}2Ol*qޤόG Pf[DjVQJ%da@qǚȪهT2Z~p{_2\FH_6".ޔO z28,c[rьեu:M%""" 4VR}9Rt'V;ԶߏRRl_/-,Pw5=O]X5NTqW3DE`D@rg^@?AeGY?mk/o'\.ꥨ"swq.?j:&]mCn3A%Qyusp7z$XQNuLJ)G&aMi;4+\qÛ?]%X-ZFd]Ꟃn?XX-Lxw~ TTcȜ-SMz$䜦<_bn?w~ H-SMz1{uީ&SU yY7n]Ꟃn?Q1{uީ&SU/%9X 3;Wڒ(cs_ְ;#J7]ꟂxZWBS2rqTdd^2?yT&ԊdsqkEDE)TJFIFC  !"$"$C1u" W  !1AQa"q2BRr#3bc$5CS4%'6DTesu<!1AQaq"2#3BRb4Cr ?hyc ' ={h;wtPǟtsy#SodH"z+j-';. qfeƛ~zNj4y7*޲g1N- ëb켺7*]Ή5zWThˋ#<S {6kXZ|$ C#Jܶ܍HHc<8Ѻkv$~+qg]T: 5-TM'p쭬}vE`aek >÷Y(M-i|!`+x8Á|ysQNt{i%]HbX2 }3Ϙ}&{ 1 FQz#PoZqLedDpc'5BJFO)#˔n(]]87GEGDI\cIw:I*lWl*M3"k`5o/s*S DO+%FF89i#R&k+n+jR%Ef {G{ 8.:!6 ,i /Ut܋  _cZ1h`g!5dsFdIUL$Π2LOA> |Fhr؛F!' YjK&kw\&nFakyå ,EcƆXdDEC]OO#lǝLc :>MM K-dqws.*-o;q2"vKk;wyns@xxg7͑:87m dⵜ/zkZֆ/Ii NEjKK.wW8s]"`mQ\(gKOQVFH8Z;5g6¶~-Ah]& $w )T-U Zq+%[aTjJ~;[ȉY??Ikr0l{^nW*_SFM}̔Rs~DKp<H|Nb5Ŧ^=lZ.:с,Ne载zJlqD$E4]lRUGyծ|0 zjtzzKUAnu|uCN*卅xj*xmE)%#vt;Kz;.4llUʘG=$ZO֪,;E,g{xA-ڦխ=^;yVIMMGNzJxn8֏ }>*ͦC5KS*P|i[ O2D2N>$^k{GC6(3C-1|g<}FуO,p$hA˕Qڶ'l"{Շ7Ojσ0> 4 U=SzgysP~?/eЛJ<-D?FEux!`:zz,uu[MAs kA Z xjtRr=V4-2 KmMW?CQejWZ0\msRVS>v|9R)qiwJgs4/EA۵0{ W͂.G8-L3vga[:zDD]WtDDDDDDDDDDDD_/7{üFKN8$zDD]Zi;pu330/n(QvҔE٨.yyo}]aq(V7r%,64qh=ݿ [)-N 2z~ꎵԺ/'&9%" |Dc (2bз`U)lFs+iuuGBx3y&DTUٞI#7(d`۶XBhdMBep2Jb''YHڭHn$o0>T*_qoE#t/כ֮KYTFPB[ :5zt6Iy}4 sl@wowACN~Ӵva>5=O+yumھNg`x4rh%2V ԇUL26&珂3pd|.??yY̻DZn2?5@\ㆴ :Xt 7uiATp'U[#3H|8YbdyvsVPi_%3'g` <mPOtSۨ#t /\\cH׋tUy{178(LAFqZib>\Gq6LZv;xul!av>i'9TNS\Եԑ]K!vnè>AX;O4qGw inOHdneQǻ~Keh,22H20B^xpe|ah4!Zvdm[%e#C:w>YEBxVt = "ZK 9pTTw%ǡAIl{8 MMM+V/BT`xVp{ ?i<)nUp쵱O@zi~ Nvu+><"6y6#`EYI] O)!=pXڎjVyhn$AGG0F<>:}Gp[}yފXN.!Od.3-'so pNS<,-U, C`SnŶ_ū5}dU<_=#zy8 Phˈģ\||Wz)ݝz>z/i]mQ覅p!e*)ݤ\L}+IM!φAW gOk8fMN ⵔXuBGr[?;QOVh9bi7ݾmvTwmڠJ9:8\;4-ݦyT_I+y֐~ NLKAyRP?)Wy ߶J[ʹ-N~>VL?3Ԯc6Lz:} ,헻[XzYR9@ݬ4mBQgo;7- iR\8RaW!@O/7A.#@䊾VY`qjPfԀoGzO]+ciV3ELn~+[/6]5_K~ssZ>$8$ɩ!Oa9 n8xp.z[h[IjF̓9=Ծ2GG# $NQ y_z\r i ,Qhi3 T[|Gz79==jժjSS$$#$/Y햛]=E =%;#>$+IfZ^9c.ZӃr̖f6kVǾTdYMZjZgNlkG+JYWpT.R>H*AtEרpe| S4E|s5Ǻƴ8\IuhiCwrY:]-`i -Jj*fn'z$ei0U7Hg3g^rxk.Ѣ"""""""""u}˦+7JjZx5#$U*W\j>m𖣑]uNAlwwRAp-U/m83 {G>+Oa9v8~KbUv{;6ɮ]Li;*""(""""""""",- V-7#;%U 'xQT ө@trbZmnvR 2~pDDDDDDDDDDDD\5rOO+iZ]QI+*hO[J5TPRHiI'4Z%b[d4H_ ^s-3]1k#kXn+Юፖfhwǎ[е`*j@m'I8w0 %퍟KLß%+.s︓Ē $$ b8$]RSK',r9|p5w6s,Lg ~Ҧ&8tk0VOp|V^֍)VX;xF\q|?9=\ݭYmgAiVjjʒCx75 j79(x6zwǎHUYO_KH2[ K$qF%{ccF\ e`i]Az8F3ӝFGv85s*$gXRyw/DunEP^w2x\8gt#!7-0 """"(nݺ;Gр}pZēVk;,uwvY}'ț#$Oei6;Kam ?_Dhal?momlu1ެv?<,U 3&J*"8e[Oxh~vVxB4!Q6HNؾ-<|+`o\N-*|+WO:? zٖ']4ha|I er|OG/inx_~=-<_x7 Od UӴHA#~yrx HܠW a60z^1~c~eJD?-˂DEJH7ٿgw>tZ=EmZ kYPO it-)2V9ەs.*>8\ kZ0ր@u?p ƽg,!\5*i(#hhh:s9a¡Ńx]c4_Lђ!}|Tǥlp6K\xLsN9d+XmZjǻAW,3>kUEJܷٞ4 .%Q#rfy DPQ55MmS)h橨C{|GWUH#J;ʇ>!HYͣmԪj)Mm^kbӵ;ҕT]#q- 'l/h8Iga9{=E .~a4bqC#k)8QtSٴKC xFIьoSs8?hv] mpiwq,>*Ivַ"lp7gzW2eGGw{Q%]ܷIBQ1k?ϧ!ԝ1bDDPZ-eZɪ{^Պj:es$HIwx8- '=G[7:hR+!]lH{m>_,Ip] 5i;V[p˄MZz [ Fd{pV~8VT 8^K 0i y`*[I|NA-0{BC7pdz7GO3:؂ ^#%b$xw;챬V._S &b2H4g#q tw[iKƖf4RSTY0 pA MڽU۴zmYwYq*CȒ74--?\c+Nvmmv1VRv$Ѹ\8BG7}tT8k|mcZ76ϫT[hئF4x|O-xT5I$("&\!{><#<\:kxOb70f&x~;rxD =ɟ\KZs_=vrˮE \QA~ `{FwjUuώ]p{ _ ]`n:};~$ $</cZVLo [x= ksw=b*&p 6ﳝMq5gۤ|w>h##?>R_ꛃ-*,+RKm;|m\vQZ}mvU6+RCqf:R޼Kxd ݳmREӺm/ҳ-Ozs5ۖX,p I͋qN ێʮrQڟSpM!s#̓S~?L䏥{˯>v^ijuWkήZݽ,Ҝ8Ab*I7*0@ /%7c$r4rE4&8\uG;x|+_MRӖ>#:.NcGE7#ٙ^$(YG;do?Edah|m;u4a!N>.LdMR1"^xdx$8zk _@EtQMESM]>ivZv]s lF@ׇ.ik ={uTbY&jbncykwulM'u<7 ܐy'ªڗc/}A# (陗Th:`_PAGꢔ**IcO[[9+P񵒀繠<wg N}vl^K^+b1#d4UDц7[φGU;_+U0){=<\ǪzKmh TFx;tk6`Uu8e1y.aS6:vH^\htP\ia3jmadT_&/oR:1yY P*ꆶj)*_BwBNvTncUh% swj$}5@7;i^:N3*΄[עLLqbFhgf UɷWǁ(ܥuX;j3d%L(qNO͞=F}A{OVqhZQDqgSK[$vQ興b""""""""",CuX/-G2}Uxyqfߗ1';4SOO!62645h7G#8`OUm}5&/U@AԺ1՝K~NPFv6*Gҵ/F OW:;ŽzqI]^D;ǢQM! TJ.\اl!p-$kiQGr+L5ڎ*\mчnFy7uv2_i|%>Q#N /<KB~Aq*_ӧ/rWj+u =t1H3~A'uc*e=E.⦆0HϘZGdM7NEmdy.hj~Z,>_7YB2]u͠hk\d6Ug&1!{ 8\y cvcwWJ| *yspPvu])!}Ce~wFU{ca!˻cٺ/څF[- }RO6Hql=`e] K cx%7NL9oеi@%1҆wO":O Rkd{!X>\1Ȭ1 ZxZ؉f'kcrǝ\[ɽk,>x-i<<@Gf>;]Nlϵخ1\r˲06ON=FT6Ih'Xq o+HȄ0HNI$rI? 4i) gf2*r{{=$ ^`sFZB Pê}Dfc=ԣ\=8V#Ѩ-av>J _/tƙ#/yXma%湶UM{C k@pQvs,wsNߊ<ގsF9&NEѵy, 􈈈H%㧼]< egdz_ %'V 2KlO =aa24GyGKOjuM暶 w=n0=Aln5z`](b{!jmkDK3Sf7όGяpq9[d0U=dYYߥǎ: N}5tamч~pa8]~ǘ iC$_l-é`x#ϟ*AӰB͸{hGy{2, ~C,aZL-K+/ g7A$$H\=RT 2keoitÞ}CFA6}Elhެ5Uϕxn7WiIz8R`:rG&pA2cE<0z_QU:8kH]) D2{CX67)7CՐd4rBpw%ҹ=hid0}3[WeM `4VmwIܠZsD;_*G^"UhQڮi%p&Z 7=Ԙquܜ<8Tjڊ wSVSH觅gPA{PifjXU8'a?cfG=G-H~ǁCH>_/^Ȣ|1.qVcI,6 Ųw.UoJڅUZ,nuG+|cxrKm:{1:}Jt§48 "",r"""""""""""""""""""""-k^EYGmRYtD^#q!P/瑒ͮ T_E¥:\ەP-+qZCNǴpq2È]6ѳav0`8{lIPe2,O*$|O HrC)3PV@ YuzS] =Ea8`E-XwF^?e"2ܼ(eC>%va}Y- )XRߏRwi~]MS1Ua'3ZDe3G-/xo舊@Pk۱ٽ5îUǙj>um답Ȥ4??l}lV-^3G3woB0ge8GwVN%žQY(/T²[HFDFGHk-~?;opB嬇gp"݃z SW[%I7a*x|U·j-1$gАV[BR[u_tO4RX1}riGHZ+H,ѴZ.{pGa?l(~Mr:wp_5dr5!vuGAC=Vzoؚ? }P/ev 6*HZ|fqr)~vWLFSU:""""""""""""""""""""""""(m27NcaTđ >k*,Mzk4؍5X%cۺ89 :T#K =gA#a 6?|wO2TznYo7| ] {}ǎmw6yV{d@[ V>G=O<h[gȵk뎞}F=<=U QS_Hi8h{(k,h+ʻb3f8&e,cꈘָ\<^Rf60ʚ<챪jpW'ĺGWg5Z3H]^UUFsT={&DDDDDDDDD^lmAGnu H~K[齓lڦ,`UJg`7Lnfm4Teu4ww;Xi)p]uHW }!UbҞDE-GDDDQ?i;+4=-;x=ܟxdЫF>=M JK?4ͨ6VX^AfJ8yuE=vPK6>u\,"JmPe)#6-C#mŏp 4-F.x?4DEd C}VYp!t30kU"pW)wq}]û4u(qT;gJUeֶKl4q̰[R~"nXi'>sC,WNUls?6Ft#{d1puqSji,cF> R oW\cl9#+A͑9߀+M5gyu]4&'.a&2Ollu4_5WWy2r]Wk13H!+ٚQ6ĬMKݩ%S=?JHDEp Ya۶k~y#*.[h[j g+@Tj)j6i$i}Ӄ?ؽ#^ul^mwID,y6VU2b~"""""Z-ikwGp(xK?Z}{ k`yiqD9IY}~dVbz<*(`8*'4TPS9^R> x}^%(:"""""""""""""""""""""""""""/h_ k{K^ TQѺNM$.瞴Xߋs> Rja-?o KDQ2!#>V'T6: SSۧ NtI\6s֝n969URc*/[Gӗi45p;ܟ&1Z<&nf18:7ueT]\c܎f<0HVϲ5Id99Y yUi4_'mQPCZ?% v5{D^>L4^AiKJtDEr~8 աԿ/߹S-99K< w_rQPUq_T]nVV8>NypPpUv6姲f#~d+bKYm};V52Jb7")K"""(ev/ nQI+O@=(,愶Ϗ]qJn/YC(j0:l݃<3kLeKˏ**Om:Hωt24~e[e zPb.<[興+ڵEgJH' ' <$q$ĩNtDE|DDDEk_}GT$ ~Az7W4tTJc@W \*k}DϕOVRظwrmkfWG lapwr}HZu=V_e`tv\K쇨3S*_"=<1SC֎ h/Epj{b`~0=-;i?m_\B}jHH9yxH_ TޱfDq#CWgM!u曄5T<Sc-Yͷ?nٔnv_m״z,WD$6>_nza mG}Tn興~qzGԁYNOc<(HZTGZ.-l}ןG\%;9.H";(Y` ‚aigY s_|V7_5wnN7mВf~MԸ'.nsT2XJƒ{\;d -?]N_AT>>GuDE9FDDDDDDZҡޤkeTyy痚zHr{N \0A^vm7}/hwΞJFwo~j<,A]aI^o+%؜TScS9'Ue;G$6h#[=oaPRxS}G_dR")˒"""""".hhgf)tO-pW2"*M-j.{jOs&$kxo4 featureCollection feature geometry first_property STRING another_property STRING objectAttr OBJECT attr2 STRING attr3 STRING int INTEGER double DOUBLE date DATE datetime DATE R_G_B STRING not_ignored STRING ignored STRING 0,0 0,10 10,10 10,0 0,0 even rouault foo bar 123 1.23 2014/10/18 2014/10/18 21:36:45 0000FF 1234 -1,-1 2014-10-18T21:36:45.000+0200 FF00FF gdalautotest-3.0.4/ogr/data/gnis_pop_110.gml0000644003401500001440000003355513614004466020247 0ustar rouaultusers -13.32 -80.17 51.0 76.58 Aflu 34.12 2.09 34.12 2.09 34.12 2.09 84683 Algeria place Aflu Altenberga 50.83 11.53 50.83 11.53 50.83 11.53 731 Germany place Altenberga Alto de la Estancia 8.6 -80.17 8.6 -80.17 8.6 -80.17 1081 Panama place Alto de la Estancia Andarab 35.62 69.21 35.62 69.21 35.62 69.21 27034 Afghanistan place Andarab Arco 45.92 10.87 45.92 10.87 45.92 10.87 15373 Italy place Arco Buek 47.39 16.75 47.39 16.75 47.39 16.75 3174 Hungary place Buek Barisis 49.58 3.33 49.58 3.33 49.58 3.33 680 France place Barisis Beauquesne 50.08 2.4 50.08 2.4 50.08 2.4 1273 France place Beauquesne Belg 49.98 7.29 49.98 7.29 49.98 7.29 150 Germany place Belg Belz 50.38 24.02 50.38 24.02 50.38 24.02 2386 Ukraine place Belz Beri 28.7 76.58 28.7 76.58 28.7 76.58 16727 India place Beri Bey 46.22 4.85 46.22 4.85 46.22 4.85 246 France place Bey Biederbach 48.2 8.03 48.2 8.03 48.2 8.03 1755 Germany place Biederbach Bogo 10.74 14.6 10.74 14.6 10.74 14.6 16952 Cameroon place Bogo Burgwald 51.0 8.72 51.0 8.72 51.0 8.72 5233 Germany place Burgwald Calca -13.32 -71.97 -13.32 -71.97 -13.32 -71.97 9179 Peru place Calca Cars 45.13 -0.62 45.13 -0.62 45.13 -0.62 1301 France place Cars Cary 46.0 -67.86 46.0 -67.86 46.0 -67.86 226 United States of America place Cary Chanonat 45.68 3.1 45.68 3.1 45.68 3.1 1487 France place Chanonat Charencey 47.42 4.67 47.42 4.67 47.42 4.67 34 France place Charencey gdalautotest-3.0.4/ogr/data/nmea.txt0000644003401500001440000000111413614004466017012 0ustar rouaultusers$GPWPL,0000.000,N,00100.000,E,waypnt*4F $GPWPL,0300.000,N,00400.000,E,WPT002*2D $GPRMC,000000,V,1400.000,N,01500.000,E,0.00,0.00,010070,,*0D $GPGGA,000000,1400.000,N,01500.000,E,0,00,0.0,16.000,M,0.0,M,,*45 $GPRMC,000000,V,1700.000,N,01800.000,E,0.00,0.00,010070,,*03 $GPGGA,000000,1700.000,N,01800.000,E,0,00,0.0,19.000,M,0.0,M,,*44 $GPRMC,000000,V,2000.000,N,02100.000,E,0.00,0.00,010070,,*0D $GPGGA,000000,2000.000,N,02100.000,E,0,00,0.0,22.000,M,0.0,M,,*42 $GPRMC,000000,V,2300.000,N,02400.000,E,0.00,0.00,010070,,*0B $GPGGA,000000,2300.000,N,02400.000,E,0,00,0.0,25.000,M,0.0,M,,*43 gdalautotest-3.0.4/ogr/data/facility_surface_dd.dbf0000644003401500001440000004166613614004466022011 0ustar rouaultusersolWNPDIDN NAMEC!SURFACECLINKC> 271245OSEBERG A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271245.htm 271273STATFJORD A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271273.htm 271301STATFJORD B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271301.htm 271329STATFJORD C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271329.htm 271357ALBUSKJELL A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271357.htm 271385EKOFISK A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271385.htm 271413EKOFISK B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271413.htm 271441EKOFISK C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271441.htm 271469EKOFISK K Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271469.htm 271497VEST EKOFISK Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271497.htm 271525TOR Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271525.htm 271553ALBUSKJELL F Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271553.htm 271581ELDFISK A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271581.htm 271609ELDFISK B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271609.htm 271637EDDA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271637.htm 271665ULA QP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271665.htm 271693COD Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271693.htm 271749VALHALL DP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271749.htm 271777HEIMDAL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271777.htm 271805ODIN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271805.htm 271833GULLFAKS A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271833.htm 27186110/1-CDP1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271861.htm 271889ULA DP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271889.htm 271917GULLFAKS B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271917.htm 271945DRAUPNER S Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271945.htm 271973EKOFISK S Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/271973.htm 272001EKOFISK R Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272001.htm 272029ULA PP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272029.htm 272057ELDFISK FTP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272057.htm 272085SNORRE A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272085.htm 272113EKOFISK G Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272113.htm 272141EKOFISK T Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272141.htm 272169EKOFISK P Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272169.htm 272197EKOFISK H Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272197.htm 272225OSEBERG C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272225.htm 272253EKOFISK Q Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272253.htm 272281EKOFISK FTP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272281.htm 272309HOD Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272309.htm 272337GYDA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272337.htm 272365SLEIPNER A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272365.htm 272393DRAUGEN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272393.htm 272421HEIDRUN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272421.htm 272449VALHALL PCP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272449.htm 272477VALHALL Q Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272477.htm 272561FRIGG TCP2 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272561.htm 272589STATFJORD B-OLS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272589.htm 272617STATFJORD C-SPM Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272617.htm 272645GULLFAKS C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272645.htm 272813GULLFAKS A-SPM 1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272813.htm 272841GULLFAKS A-SPM 2 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272841.htm 272897OSEBERG B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/272897.htm 273877BRAE A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/273877.htm 27418536/22 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/274185.htm 27421337/4 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/274213.htm 277237H-7 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277237.htm 277265B-11 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277265.htm 277293EKOFISK W Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277293.htm 277321VESLEFRIKK A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277321.htm 277349VESLEFRIKK B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277349.htm 277377EMBLA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277377.htm 277405BRAGE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277405.htm 277433FRY Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277433.htm 277489OSEBERG ST Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277489.htm 277573HULDRA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277573.htm 277601SLEIPNER B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277601.htm 277629SLEIPNER T Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277629.htm 277685VISUND Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277685.htm 277713NJORD A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277713.htm 277741STATFJORD A-OLS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277741.htm 277797SLEIPNER R Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277797.htm 277937EKOFISK J Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277937.htm 277965FRIGG DP2 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/277965.htm 278273TROLL B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278273.htm 278329TROLL A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278329.htm 278357DRAUPNER E Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278357.htm 278385VALHALL WP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278385.htm 278413YME B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278413.htm 278525EKOFISK X Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/278525.htm 279365JOTUN B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279365.htm 279393JOTUN A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279393.htm 279421TROLL C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279421.htm 279505VARG A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279505.htm 279561NJORD BRAVO Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279561.htm 279589NORNE FPSO Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279589.htm 279785SGARD A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279785.htm 279841BALDER FPU Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279841.htm 279869PETROJARL VARG Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/279869.htm 280093ELDFISK E Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280093.htm 280121SGARD B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280121.htm 280149SGARD C Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280149.htm 280177DRAUGEN FLP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280177.htm 280205OSEBERG SR Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280205.htm 280485SNORRE B Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280485.htm 280513PETROJARL 1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280513.htm 280541OSEBERG D Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280541.htm 280569HEIMDAL HRP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280569.htm 280793TAMBAR Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280793.htm 280849RINGHORNE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280849.htm 280877KVITEBJRN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280877.htm 280933FRIGG DP1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280933.htm 280961VALHALL FLANKE SR Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/280961.htm 281073ALBUSKJELL A-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281073.htm 281101ALBUSKJELL A-FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281101.htm 281129EKOFISK BS1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281129.htm 281157EKOFISK BS3 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281157.htm 281185EKOFISK BS4 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281185.htm 281213TOR FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281213.htm 281241ALBUSKJELL F-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281241.htm 281269ALBUSKJELL F-FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281269.htm 281325EKOFISK S-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281325.htm 281353EKOFISK X-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281353.htm 281381EDDA FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281381.htm 281409ELDFISK FTP-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281409.htm 281437ELDFISK FTP-FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281437.htm 281465COD FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/281465.htm 282137NORDST FRIGG A Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/282137.htm 282305SLEIPNER FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/282305.htm 282529VALHALL IP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/282529.htm 282641EKOFISK NORD FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/282641.htm 282669EKOFISK T WALL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/282669.htm 283285GRANE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/283285.htm 286029ELDFISK B-FL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286029.htm 286113TEESSIDE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286113.htm 286141EMDEN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286141.htm 286169KRST Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286169.htm 286197KALST Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286197.htm 286225ST. FERGUS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286225.htm 286253STURE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286253.htm 286281ZEEBRUGGE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286281.htm 286309TJELDBERGODDEN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286309.htm 286337ZEEPIPE TERMINAL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286337.htm 286393EKOFISK SBM-1 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286393.htm 286421EKOFISK SBM-2 Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286421.htm 286561STATFJORD-A-ALP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286561.htm 286589STATFJORD-B-SPM Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286589.htm 286701MONGSTAD Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286701.htm 286729KOLLSNES Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286729.htm 286757DUNKERQUE Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/286757.htm 287681HEIDRUN STL-I Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/287681.htm 287709HEIDRUN STL-II Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/287709.htm 287737NJORD STL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/287737.htm 287765YME-STL Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/287765.htm 361248VALHALL FLANKE NORD Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/361248.htm 363404SLAGENTANGEN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/363404.htm 363441MELKYA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/363441.htm 364198EKOFISK M Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/364198.htm 364234EKOFISK M-BS Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/364234.htm 364693NYHAMNA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/364693.htm 365267BYGNES Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/365267.htm 365776FRIGG QP Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/365776.htm 368635KRISTIN Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/368635.htm 369424EASINGTON Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/369424.htm 375206ALVHEIM FPSO Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/375206.htm 376822NAVION SAGA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/376822.htm 377181NATURKRAFT GASSKRAFTVERK KRST Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/377181.htm 403167YME MOPUStor Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/403167.htm 403588BRAEFOOT BAY Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/403588.htm 406276VALHALL PH Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/406276.htm 406672GJA Y http://www.npd.no/engelsk/cwi/pbl/en/facility/all/406672.htm gdalautotest-3.0.4/ogr/data/single_point_mapinfo.map0000644003401500001440000000400013614004466022230 0ustar rouaultusers */#+#OWc9 7ܽ+/UW?/@/@H!guZ|@ sc|@#g v.@@G@F@H@\%AP-YA#y=B`<(> K@+=@LONG_INC>@GS_COUNTN>d@tU0d@㥛@d@㥛nQd@ ףad@1rd@1d@X9d@j+d@d@Cd@d@/;d@hd@o=u<}"O>3d@C =oe@t=C< /@ # gdalautotest-3.0.4/ogr/data/test.idf0000644003401500001440000000112013614004466016771 0ustar rouaultuserschs;ISO_LATIN_1 eoh; tbl;Node atr;NODE_ID;X;Y;foo frm;decimal(10);decimal(9,7);decimal(9,7);string(1) num;2 rec;1;2;49;"U" rec;2;3;50;"U" end;2 tbl;Link atr;LINK_ID;FROM_NODE;TO_NODE;foo frm;decimal(10);decimal(10);decimal(10);string(1) num;1 rec;1;1;2;"U" rec;2;-1;2;"U" rec;3;1;-2;"U" rec;4;1;2;"U" end;1 tbl;LinkCoordinate atr;LINK_ID;COUNT;X;Y;foo frm;decimal(10);decimal(4);decimal(9,7);decimal(9,7);string(1) num;1 rec;1;1;2.5;49.5;"U" rec;1;2;2.7;49.7;"U" rec;10;1;2.5;49.5;"U" end;1 tbl;Other atr;FOO frm;decimal(10) num;1 rec;1 end;1 eof;4 gdalautotest-3.0.4/ogr/data/testcsvt.csvt0000644003401500001440000000013213614004466020110 0ustar rouaultusers"Integer(5)","Real (10.7)","String(15)","Integer","Real","String","DateTime","Date","Time"gdalautotest-3.0.4/ogr/data/extentnan.shx0000644003401500001440000000014413614004466020063 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/gjmultipoint.shx0000644003401500001440000000015413614004466020605 0ustar rouaultusers' 6Y@@Y@?2$gdalautotest-3.0.4/ogr/data/multipatch.shp0000644003401500001440000000175013614004466020225 0ustar rouaultusers' $@ @$@$@ @!@@$@$@ @ @$@$@$@ @$@ @ @ @$@$@@@@@?@@??@"@"@@@$@$@@@@@@@@@@@@@@@@@@@@@@@@gdalautotest-3.0.4/ogr/data/filegdb_polygonzm_m_not_closing_with_curves.gdb.csv0000644003401500001440000002620613614004466027660 0ustar rouaultusersWKT,ET_ID,ShapeType "MULTIPOLYGON ZM (((601237.263148479 7134708.32302578 9412.59721870556 0,601352.979768234 7133348.65274364 9412.59721870556 1364.58550931162,603464.808078794 7133782.59006772 9412.59721870556 3520.53551209844,602683.720895436 7132480.77809546 9412.59721870556 5038.6961093779,600861.184134269 7132509.7072504 9412.59721870556 6861.46245255216,600427.246810182 7133637.94429303 9412.59721870556 8070.27196012244,601237.263148479 7134708.32302578 9412.59721870556 9412.59721870556)))",9,Linear Segments "MULTISURFACE ZM (CURVEPOLYGON ZM (COMPOUNDCURVE ZM (CIRCULARSTRING ZM (601237.263148479 7132185.77127137 5962.40883167607 0,602186.209986774 7131236.82443308 5962.40883167607 0,601237.263148478 7130287.87759478 5962.40883167607 0,600288.316310182 7131236.82443307 5962.40883167607 0,601237.263148479 7132185.77127137 5962.40883167607 5962.40883167607))))",10,Full Circle "MULTISURFACE ZM (CURVEPOLYGON ZM ((603586.990105119 7131376.32619817 6015.53340104846 0,603646.313690435 7131429.8445149 6015.53340104846 0,603707.853677225 7131480.44929811 6015.53340104846 0,603771.310248859 7131527.89400638 6015.53340104846 0,603836.374251297 7131571.94749386 6015.53340104846 0,603902.728699261 7131612.39513638 6015.53340104846 0,603970.05032055 7131649.0398771 6015.53340104846 0,604038.011130991 7131681.70318652 6015.53340104846 0,604106.280032349 7131710.22593229 6015.53340104846 0,604174.524425398 7131734.46915445 6015.53340104846 0,604242.411830314 7131754.31474246 6015.53340104846 0,604309.611506486 7131769.66601061 6015.53340104846 0,604375.796063846 7131780.44816907 6015.53340104846 0,604440.643057882 7131786.60868825 6015.53340104846 0,604503.83656056 7131788.1175547 6015.53340104846 0,604565.068699485 7131784.9674174 6015.53340104846 0,604624.041157832 7131777.17362349 6015.53340104846 0,604680.466627711 7131764.77414355 6015.53340104846 0,604734.070209906 7131747.8293866 6015.53340104846 0,604784.590753153 7131726.42190579 6015.53340104846 0,604831.782126442 7131700.65599622 6015.53340104846 0,604875.414418146 7131670.65718681 6015.53340104846 0,604915.275056128 7131636.57162875 6015.53340104846 0,604951.169843364 7131598.56538344 6015.53340104846 0,604982.92390406 7131556.82361349 6015.53340104846 0,605010.382535623 7131511.54968062 6015.53340104846 0,605033.411962362 7131462.96415486 6015.53340104846 0,605051.899987224 7131411.30374002 6015.53340104846 0,605065.75653841 7131356.82012045 6015.53340104846 0,605074.914108195 7131299.77873487 6015.53340104846 0,605079.328081821 7131240.45748316 6015.53340104846 0,605078.976954851 7131179.14537251 6015.53340104846 0,605073.862437941 7131116.14110936 6015.53340104846 0,605064.009448503 7131051.75164414 6015.53340104846 0,605049.46598931 7130986.29067586 6015.53340104846 0,605030.302914635 7130920.07712377 6015.53340104846 0,605006.613585051 7130853.43357364 6015.53340104846 0,604978.513412591 7130786.68470615 6015.53340104846 0,604946.139298469 7130720.15571508 6015.53340104846 0,604909.648966116 7130654.17072297 6015.53340104846 0,604869.220192764 7130589.05120208 6015.53340104846 0,604825.049943331 7130525.11440818 6015.53340104846 0,604777.353410833 7130462.67183488 6015.53340104846 0,604726.362967982 7130402.02769614 6015.53340104846 0,604672.32703509 7130343.47744409 6015.53340104846 0,604615.508869791 7130287.30632969 6015.53340104846 0,604556.185284474 7130233.78801295 6015.53340104846 0,604494.645297684 7130183.18322974 6015.53340104846 0,604431.188726051 7130135.73852147 6015.53340104846 0,604366.124723613 7130091.685034 6015.53340104846 0,604299.770275649 7130051.23739148 6015.53340104846 0,604232.44865436 7130014.59265076 6015.53340104846 0,604164.487843918 7129981.92934133 6015.53340104846 0,604096.218942561 7129953.40659557 6015.53340104846 0,604027.974549512 7129929.16337341 6015.53340104846 0,603960.087144595 7129909.3177854 6015.53340104846 0,603892.887468423 7129893.96651724 6015.53340104846 0,603826.702911064 7129883.18435878 6015.53340104846 0,603761.855917027 7129877.02383961 6015.53340104846 0,603698.66241435 7129875.51497315 6015.53340104846 0,603637.430275425 7129878.66511045 6015.53340104846 0,603578.457817078 7129886.45890437 6015.53340104846 0,603522.032347198 7129898.85838431 6015.53340104846 0,603468.428765003 7129915.80314126 6015.53340104846 0,603417.908221757 7129937.21062207 6015.53340104846 0,603370.716848468 7129962.97653164 6015.53340104846 0,603327.084556763 7129992.97534105 6015.53340104846 0,603287.223918782 7130027.06089911 6015.53340104846 0,603251.329131546 7130065.06714442 6015.53340104846 0,603219.57507085 7130106.80891436 6015.53340104846 0,603192.116439287 7130152.08284724 6015.53340104846 0,603169.087012548 7130200.668373 6015.53340104846 0,603150.598987686 7130252.32878783 6015.53340104846 0,603136.7424365 7130306.8124074 6015.53340104846 0,603127.584866715 7130363.85379299 6015.53340104846 0,603123.170893089 7130423.17504469 6015.53340104846 0,603123.522020059 7130484.48715534 6015.53340104846 0,603128.636536969 7130547.49141849 6015.53340104846 0,603138.489526407 7130611.88088371 6015.53340104846 0,603153.032985599 7130677.341852 6015.53340104846 0,603172.196060274 7130743.55540409 6015.53340104846 0,603195.885389858 7130810.19895422 6015.53340104846 0,603223.985562319 7130876.9478217 6015.53340104846 0,603256.35967644 7130943.47681278 6015.53340104846 0,603292.850008793 7131009.46180489 6015.53340104846 0,603333.278782146 7131074.58132577 6015.53340104846 0,603377.449031579 7131138.51811968 6015.53340104846 0,603425.145564077 7131200.96069298 6015.53340104846 0,603476.136006928 7131261.60483172 6015.53340104846 0,603530.171939819 7131320.15508376 6015.53340104846 0,603586.990105119 7131376.32619817 6015.53340104846 6015.53340104846)))",11,Ellipse "MULTISURFACE ZM (CURVEPOLYGON ZM ((598720.426668771 7129501.07513673 6222.05990263553 0,598737.08348921 7129539.33259355 0 0,598759.107863338 7129578.37201865 0 0,598785.750729354 7129617.60496801 0 0,598816.263025457 7129656.44299762 0 0,598849.895689849 7129694.29766348 0 0,598885.899660727 7129730.58052157 0 0,598923.525876292 7129764.70312787 0 0,598962.025274743 7129796.07703839 0 0,599000.64879428 7129824.1138091 0 0,599038.647373103 7129848.224996 6222.05990263553 478.403457590657,599090.35157157 7129874.30266495 0 0,599146.00367577 7129894.69011308 0 0,599205.009018258 7129909.7538702 0 0,599266.772931592 7129919.86046615 0 0,599330.700748327 7129925.37643072 0 0,599396.197801019 7129926.66829374 0 0,599462.669422226 7129924.10258503 0 0,599529.520944502 7129918.04583439 0 0,599596.157700404 7129908.86457165 0 0,599661.985022489 7129896.92532662 0 0,599726.408243312 7129882.59462913 0 0,599788.832695429 7129866.23900898 0 0,599848.663711398 7129848.224996 6222.05990263553 1309.73240605851,599902.376256128 7129830.13297331 0 0,599956.195256374 7129809.86555117 0 0,600009.194223701 7129787.0724784 0 0,600060.446669673 7129761.40350381 0 0,600109.026105852 7129732.50837624 6222.05990263553 1595.49340145847,600151.75180082 7129702.55911261 0 0,600193.095497486 7129669.52023835 0 0,600232.780181392 7129633.79644701 0 0,600270.528838084 7129595.79243213 0 0,600306.064453104 7129555.91288726 0 0,600339.110011996 7129514.56250597 0 0,600369.388500304 7129472.14598179 6222.05990263553 1966.067601534,600407.681790071 7129408.24692507 0 0,600440.631434992 7129340.02909043 0 0,600468.8990125 7129269.04579824 0 0,600493.146100025 7129196.85036882 0 0,600514.034275 7129124.99612252 6222.05990263553 2343.78781772482,600532.810643889 7129048.90030456 0 0,600548.165421972 7128970.40378468 0 0,600559.81205338 7128890.12000504 0 0,600567.463982244 7128808.66240778 0 0,600570.834652695 7128726.64443505 0 0,600569.637508864 7128644.67952901 0 0,600563.585994882 7128563.38113181 0 0,600552.393554879 7128483.36268559 0 0,600535.773632987 7128405.2376325 0 0,600513.439673337 7128329.6194147 0 0,600485.105120059 7128257.12147434 6222.05990263553 3228.17978644839,600465.862248906 7128214.68220142 0 0,600445.034640257 7128171.85941882 0 0,600422.256805209 7128130.00586423 0 0,600397.163254859 7128090.47427531 0 0,600369.388500304 7128054.61738977 6222.05990263553 3462.27064246176,600339.540023999 7128023.96001594 0 0,600305.906013452 7127995.78315236 0 0,600269.014792944 7127970.09439323 0 0,600229.394686755 7127946.90133275 0 0,600187.574019165 7127926.21156513 0 0,600144.081114455 7127908.03268458 0 0,600099.444296903 7127892.37228531 0 0,600054.191890791 7127879.23796151 0 0,600008.852220398 7127868.63730739 0 0,599963.953610004 7127860.57791716 0 0,599920.02438389 7127855.06738503 0 0,599877.592866336 7127852.11330519 6222.05990263553 4007.11781439272,599829.891076978 7127852.11194167 0 0,599780.612710565 7127855.76496616 0 0,599730.307504261 7127862.90630951 0 0,599679.52519523 7127873.36990253 0 0,599628.815520636 7127886.98967608 0 0,599578.728217643 7127903.59956097 0 0,599529.813023415 7127923.03348805 0 0,599482.619675116 7127945.12538814 0 0,599437.69790991 7127969.70919208 0 0,599395.597464961 7127996.6188307 0 0,599356.868077433 7128025.68823483 6222.05990263553 4566.61205846862,599321.07771703 7128057.23061787 0 0,599286.5912274 7128092.18018619 0 0,599253.736845365 7128130.009805 0 0,599222.842807748 7128170.19233953 0 0,599194.237351372 7128212.20065499 0 0,599168.24871306 7128255.5076166 0 0,599145.205129635 7128299.58608958 0 0,599125.434837919 7128343.90893916 6222.05990263553 4963.87361198967,599096.268680346 7128464.93771889 0 0,599085.231545178 7128593.43384482 0 0,599067.576528042 7128719.98795337 6222.05990263553 5345.61970690188,599035.654556808 7128811.71539051 0 0,598987.733708217 7128903.23064856 0 0,598929.958118777 7128994.09537865 0 0,598868.471924997 7129083.87123195 0 0,598809.419263384 7129172.1198596 0 0,598758.944270447 7129258.40291275 0 0,598723.191082693 7129342.28204255 0 0,598708.303836632 7129423.31890016 0 0,598720.426668771 7129501.07513673 6222.05990263553 6222.05990263553)))",12,Free Hand - Bezier segments "MULTISURFACE ZM (CURVEPOLYGON ZM (COMPOUNDCURVE ZM ((603667.312163369 7127302.45936135 7122.59129898725 0,604101.249487456 7125306.34767055 7122.59129898725 2042.73431541907,602057.457291204 7124966.28612571 7122.59129898725 4114.6243693885),CIRCULARSTRING ZM (602057.457291204 7124966.28612571 7122.59129898725 4114.6243693885,602123.767616766 7125739.9065906 7122.59129898725 0,602568.004275681 7126376.7264033 7122.59129898725 5685.42069618537),(602568.004275681 7126376.7264033 7122.59129898725 5685.42069618537,603667.312163369 7127302.45936135 7122.59129898725 7122.59129898725))))",13,Streight + Arc "MULTISURFACE ZM (CURVEPOLYGON ZM (COMPOUNDCURVE ZM ((606589.156812223 7126376.7264033 7944.21069612419 0,606328.794417772 7126550.30133293 7944.21069612419 312.916654464901,606587.626280171 7127108.47450544 7944.21069612419 928.181819659723),CIRCULARSTRING ZM (606587.626280171 7127108.47450544 7944.21069612419 928.181819659723,605297.671996129 7127308.73966999 7944.21069612419 0,605270.896472146 7128613.87233082 7944.21069612419 3763.78785003061),CIRCULARSTRING ZM (605270.896472146 7128613.87233082 7944.21069612419 3763.78785003061,606551.551714292 7128866.8749826 7944.21069612419 0,607023.094136311 7127649.60922062 7944.21069612419 6599.39388039466),(607023.094136311 7127649.60922062 7944.21069612419 6599.39388039466,606589.156812223 7126376.7264033 7944.21069612419 7944.21069612419))))",14,Streight + 2 Arcs gdalautotest-3.0.4/ogr/data/virsvd.fmt0000644003401500001440000004516013614004466017367 0ustar rouaultusers/* FIELDS OBTAINED FROM EXPERIMENT DATA RECORD (EDR) */ OBJECT = COLUMN NAME = SC_TIME COLUMN_NUMBER = 1 BYTES = 4 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 DESCRIPTION = "Spacecraft time in integer seconds that is transmitted to MESSENGER subsystems by the Integrated Electronics Module. This is assigned to the first spectral observation contained in a science packet. All spectra contained in the science packet will be associated with this start time. Unit is in Mission Elapsed Time which is the number of seconds since launch. PACKET column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = PACKET_SUBSECONDS COLUMN_NUMBER = 2 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 5 DESCRIPTION = "Subsecond time in milliseconds that the telemetry packet was initiated. All spectra contained in the science packet will be associated with this subsecond start time. Unit is 5 milliseconds (i.e. all values will be to the nearest 5 milliseconds). PACKET column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = INT_TIME COLUMN_NUMBER = 3 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 7 DESCRIPTION = "Amount of time the array detectors will integrate photon counts. Unit is 0.05 second. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = INT_COUNT COLUMN_NUMBER = 4 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 9 DESCRIPTION = "Total amount of integrations that will be taken. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = DARK_FREQ COLUMN_NUMBER = 5 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 11 DESCRIPTION = "Dark counts will be collected every X integrations during a VIRS observation. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = TEMP_2 COLUMN_NUMBER = 6 BYTES = 4 DATA_TYPE = IEEE_REAL START_BYTE = 13 DESCRIPTION = "One of a redundant pair of array temperature sensors. A more complete description of this field can be found in the MASCS User's Guide (Applicable Document 6 in VIRS_CDR_DDR_DAP_SIS.PDF). Conversion from raw counts (DN) to degrees Celsius is: For the VIS detector it is: -3.34338E-18 * DN^5 + 8.979E-15 * DN^4 + 3.8131E-11 * DN^3 - 2.703E-8 * DN^2 - 0.0061 * DN - 1.67826 For the NIR detector it is: TEMP_2 = -8.89100589E-18 * DN^5 - 9.72043502E-15 * DN^4 + 1.73862825E-10 * DN^3 + 3.39958815E-7 * DN^2 - 0.00702301101 * DN - 22.2879012 For other temperature data (TEMP_1 and GRATING_TEMP) see CDR. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = BINNING COLUMN_NUMBER = 7 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 17 DESCRIPTION = "Number of pixels that were binned together in the data. A flight-software update during the mission changed how the pixels are were binned. For data with SPECTRUM_UTC_TIME prior to March 16, 2009, the pixels were co-added. For data with SPECTRUM_UTC_TIME on or after March 16, 2009, the multiple pixels were averaged. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = START_PIXEL COLUMN_NUMBER = 8 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 19 DESCRIPTION = "Start pixel of data captured by the detector array. For VIS the value can be from 0-511. For NIR the value can be from 0-255. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = END_PIXEL COLUMN_NUMBER = 9 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 21 DESCRIPTION = "End pixel of data captured by the detector array. For VIS the value can be from 0-511. For NIR the value can be from 0-255. The END_PIXEL must be greater than START_PIXEL. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPECTRUM_NUMBER COLUMN_NUMBER = 10 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 23 DESCRIPTION = "Ordered number sequence for spectra in a given observation. First spectrum is 0, second is 1, third is 2, and so on. Note that for observations which span multiple science packets, the numbering sequence is continuous. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPECTRUM_MET COLUMN_NUMBER = 11 BYTES = 4 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 25 DESCRIPTION = "A calculated value intended to reflect mission elapsed time (in seconds) since launch (for partition 1) or since reset (for partition 2) at the start of an individual VIRS spectrum. This is derived using the following formula: SPECTRUM_MET = SC_TIME + floor(SPECTRUM_NUMBER*PERIOD*0.050) PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPECTRUM_SUBSECONDS COLUMN_NUMBER = 12 BYTES = 2 DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 29 DESCRIPTION = "The calculated subsecond time in milliseconds that a VIRS integration was started. For each VIRS integration, SPECTRUM_MET plus SPECTRUM_SUBSECONDS gives the spacecraft time of the start of that integration. This is derived using the following formula: SPECTRUM_SUBSECONDS = (PACKET_SUBSECONDS + SPECTRUM_NUMBER * PERIOD * 50) mod 1000 PER SPECTRUM column." END_OBJECT = COLUMN /* CALIBRATED ITEMS AND ADDITIONAL METADATA */ OBJECT = COLUMN NAME = SPECTRUM_UTC_TIME COLUMN_NUMBER = 13 BYTES = 17 DATA_TYPE = CHARACTER START_BYTE = 31 DESCRIPTION = "UTC time in YYDOYTHH:MM:SS.00 format translated from spacecraft time and packet subseconds (in integer seconds) that is transmitted to MESSENGER subsystems by the Integrated Electronics Module. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = IOF_SPECTRUM_DATA COLUMN_NUMBER = 14 BYTES = 2048 DATA_TYPE = IEEE_REAL START_BYTE = 48 ITEMS = 512 ITEM_BYTES = 4 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived column of reflectance-at-sensor spectra. One row per spectrum. NIR spectrum has up to 256 values (depending on binning and windowing), VIS has up to 512. Reflectance is a unitless parameter. Reflectance from saturated pixels, or binned pixels with one saturated element, are set to 1e32. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = PHOTOM_IOF_SPECTRUM_DATA COLUMN_NUMBER = 15 BYTES = 2048 DATA_TYPE = IEEE_REAL START_BYTE = 2096 ITEMS = 512 ITEM_BYTES = 4 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived column of photometrically normalized reflectance-at-sensor spectra. One row per spectrum. NIR spectrum has up to 256 values (depending on binning and windowing), VIS has up to 512. Reflectance is a unitless parameter. Reflectance from saturated pixels, or binned pixels with one saturated element, are set to 1e32. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = IOF_NOISE_SPECTRUM_DATA COLUMN_NUMBER = 16 BYTES = 2048 DATA_TYPE = IEEE_REAL START_BYTE = 4144 ITEMS = 512 ITEM_BYTES = 4 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived column of noise/error in reflectance propagated through post-calibration procedure. One row per spectrum. NIR spectrum has up to 256 values (depending on binning and windowing), VIS has up to 512. Unitless. Noise from saturated pixels, or binned pixels with one saturated element, are set to 1e32. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = PHOTOM_IOF_NOISE_SPECTRUM_DATA COLUMN_NUMBER = 17 BYTES = 2048 DATA_TYPE = IEEE_REAL START_BYTE = 6192 ITEMS = 512 ITEM_BYTES = 4 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived column of noise/error in photometrically normalized reflectance propagated through post-calibration procedure. One row per spectrum. NIR spectrum has up to 256 values (depending on binning and windowing), VIS has up to 512. Unitless. Noise from saturated pixels, or binned pixels with one saturated element, are set to 1e32. PER SPECTRUM column. " END_OBJECT = COLUMN OBJECT = COLUMN NAME = SOFTWARE_VERSION COLUMN_NUMBER = 18 BYTES = 4 DATA_TYPE = IEEE_REAL START_BYTE = 8240 DESCRIPTION = "Indicates version of calibration software used. Increments with reprocessing of DDRs. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = CHANNEL_WAVELENGTHS COLUMN_NUMBER = 19 BYTES = 2048 DATA_TYPE = IEEE_REAL START_BYTE = 8244 ITEMS = 512 ITEM_BYTES = 4 DESCRIPTION = "Column of wavelengths paired to spectrum data channels. Wavelengths derived from calibration report equation 6.5. See VIRS CDR- DDR SIS. Unit = nanometers. OBSERVATION column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = DATA_QUALITY_INDEX COLUMN_NUMBER = 20 BYTES = 19 DATA_TYPE = CHARACTER START_BYTE = 10292 DESCRIPTION = "19 character index of data quality. Each digit signifies quality factor of measurements. PER SPECTRUM column. Format: ABCD-EFGH-IJKL-MNOP A: Dark Scan Flag, denotes shutter commanded closed for dark observation. 0 = shutter not engaged 1 = shutter engaged B: Temperature 1 Flag 0 = Temperature does not exceed 15 deg C threshold. 1 = Temperature exceeds 15 deg C threshold but less than 25 deg C threshold. 2 = Temperature exceeds 25 deg C threshold but less than 40 deg C threshold. 3 = Temperature exceeds 40 deg C threshold. C: Temperature 2 Flag 0 = Temperature does not exceed 15 deg C threshold. 1 = Temperature exceeds 15 deg C threshold but less than 25 deg C threshold. 2 = Temperature exceeds 25 deg C threshold but less than 40 deg C threshold. 3 = Temperature exceeds 40 deg C threshold. D: Grating Temperature Flag 0 = Temperature does not exceed 15 deg C threshold. 1 = Temperature exceeds 15 deg C threshold but less than 25 deg C threshold. 2 = Temperature exceeds 25 deg C threshold but less than 40 deg C threshold. 3 = Temperature exceeds 40 deg C threshold. E: Anomalous Pixels Integer 0-9 = Indicates number of hot pixels found. Working Definition: The number of pixels with a noise spike (defined in DQI L, below). Procedure: The number of noise spike channels for spectra i. Repeat for all N spectra. F: Partial Data Flag 0 = No partial data. 1 = Partial data exists. Working Definition: If any spectrum has nulls in the beginning or end, signifying data drop outs. Procedure: Given spectra i, evaluate first 10 channels and last 10 channels. If any channel has 0 value, set Partial Data Flag = 1. G: Saturation Flag 0 = No pixels saturated. 1 = Saturated pixels exist. H: Low Signal Level Flag 0 = Signal level not below -32768 threshold. 1 = Signal level below -32768 threshold. I: Low VIS Wavelength Uncertainty Flag (not yet implemented, set to 0) 0 = Uncertainty not above TBD threshold at low wavelengths. 1 = Uncertainty above TBD threshold at low wavelengths. J: High VIS Wavelength Uncertainty Flag (not yet implemented, set to 0) 0 = Uncertainty not above TBD threshold at high wavelengths. 1 = Uncertainty above TBD threshold at high wavelengths. K: UVVS Operating Flag 0 = UVVS is not scanning during readout. 1 = UVVS is scanning during readout. L: UVVS Noise Spike Flag 0 = No noise spike detected. 1 = Noise spike detected. Using VIRS VIS (512 channel spectrum, N spectra per CDR) as an example, Working Definition: A noise spike is a data value in 1 or 2 channels that exceeds 3 standard deviations of the average for a given channel in a given observation. Procedure: Calculate the standard deviation for channel 1 through all 1-N spectra. If spectra i has stdev >=3, then spectra i has a noise spike. Repeat calculation for channels 2-512. Keep track of the number of 'noise spike channels' per spectra. M: SPICE Version Epoch. Indicates what SPICE is used to determine pointing fields in CDR. 'Predict' SPICE may change one or more times before settling on 'Final' pointing solutions about 2 weeks from data acquisition. 0 = No SPICE 1 = Predict 2 = Actual N: Dark Saturation Flag Denotes that there are minimal unsaturated dark frames available for the polynomial fit of one or more pixels. 0 = All pixels in data record contain at least four unsaturated dark frames. 1 = One or more pixels in data record contain three or fewer unsaturated dark frames. O-P: Spares" END_OBJECT = COLUMN /*** SPICE DERIVED GEOMETRY VALUES TAKEN DIRECTLY FROM VIRS VIS CDR ***/ OBJECT = COLUMN NAME = TARGET_LATITUDE_SET COLUMN_NUMBER = 21 BYTES = 40 DATA_TYPE = IEEE_REAL START_BYTE = 10311 ITEMS = 5 ITEM_BYTES = 8 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived latitude of footprint center, uprange edge (c1), downrange edge (c2), port, (c3) and starboard (c4) edges (5 total values, coordinates as in Figure 4 of VIRS_CDR_DDR_DAP_SIS.PDF; center point, c1, c2, c3, c4) on planet target corresponding to spectral observation. Unit = degrees. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = TARGET_LONGITUDE_SET COLUMN_NUMBER = 22 BYTES = 40 DATA_TYPE = IEEE_REAL START_BYTE = 10351 ITEMS = 5 ITEM_BYTES = 8 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived longitude of footprint center, uprange edge (c1), downrange edge (c2), port, (c3) and starboard (c4) edges (5 total values, coordinates as in Figure 4 of VIRS_CDR_DDR_DAP_SIS.PDF; center point, c1, c2, c3, c4) on planet target corresponding to spectral observation. Unit = degrees. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = ALONG_TRACK_FOOTPRINT_SIZE COLUMN_NUMBER = 23 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10391 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived length of VIRS footprint along track over the spectrum integration time, accounting for smear across surface. Unit = meters. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = ACROSS_TRACK_FOOTPRINT_SIZE COLUMN_NUMBER = 24 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10399 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived instantaneous width of VIRS footprint across track at the spectrum integration midpoint, accounting for jitter across surface. Unit = meters. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = INCIDENCE_ANGLE COLUMN_NUMBER = 25 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10407 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived solar incidence angle of footprint center. Unit = degrees. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = EMISSION_ANGLE COLUMN_NUMBER = 26 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10415 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived emission angle of footprint center. Unit = degrees. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = PHASE_ANGLE COLUMN_NUMBER = 27 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10423 MISSING_CONSTANT = -1.E32 INVALID_CONSTANT = 1.E32 DESCRIPTION = "Derived phase angle of footprint center. Unit = degrees. PER SPECTRUM column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SOLAR_DISTANCE COLUMN_NUMBER = 28 BYTES = 8 DATA_TYPE = IEEE_REAL START_BYTE = 10431 MISSING_CONSTANT = -1.E32 DESCRIPTION = "Derived subsolar distance to footprint center on planet surface. Unit = kilometers. PER SPECTRUM column." END_OBJECT = COLUMN /* SPARE COLUMNS */ OBJECT = COLUMN NAME = SPARE_1 COLUMN_NUMBER = 29 BYTES = 4 DATA_TYPE = IEEE_REAL START_BYTE = 10439 MISSING_CONSTANT = -1.E32 DESCRIPTION = "SPARE column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPARE_2 COLUMN_NUMBER = 30 BYTES = 4 DATA_TYPE = MSB_INTEGER START_BYTE = 10443 DESCRIPTION = "SPARE column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPARE_3 COLUMN_NUMBER = 31 BYTES = 4 DATA_TYPE = MSB_INTEGER START_BYTE = 10447 DESCRIPTION = "SPARE column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPARE_4 COLUMN_NUMBER = 32 BYTES = 4 DATA_TYPE = MSB_INTEGER START_BYTE = 10451 DESCRIPTION = "SPARE column." END_OBJECT = COLUMN OBJECT = COLUMN NAME = SPARE_5 COLUMN_NUMBER = 33 BYTES = 4 DATA_TYPE = MSB_INTEGER START_BYTE = 10455 DESCRIPTION = "SPARE column." END_OBJECT = COLUMN gdalautotest-3.0.4/ogr/data/mixed_shape_type_non_conformant.shx0000644003401500001440000000022413614004466024505 0ustar rouaultusers' J&@@2(^ l8:$Zgdalautotest-3.0.4/ogr/data/curves_polygon.csv0000644003401500001440000001554313614004466021137 0ustar rouaultusersWKT,SHAPE_Length,SHAPE_Area "MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (6.195122 48.85554,6.953097 48.09756,6.195122 47.33959,5.437147 48.09756,6.195122 48.85554))))",4.76249590911315,1.80492585969112 "MULTISURFACE (CURVEPOLYGON ((9.025738 48.60302,9.126932 48.53145,9.226041 48.45792,9.322583 48.38279,9.416089 48.30644,9.506101 48.22922,9.592183 48.15152,9.673913 48.07372,9.750896 47.99619,9.822754 47.91931,9.889138 47.84346,9.949725 47.76901,10.00422 47.69632,10.05236 47.62574,10.0939 47.55761,10.12865 47.49228,10.15643 47.43005,10.17712 47.37123,10.1906 47.31611,10.19682 47.26496,10.19575 47.21802,10.18738 47.17552,10.17176 47.13768,10.14897 47.10467,10.11911 47.07665,10.08234 47.05377,10.03882 47.03613,9.988785 47.02382,9.932463 47.0169,9.870133 47.01541,9.802098 47.01934,9.72869 47.02869,9.650266 47.0434,9.567208 47.0634,9.479922 47.08861,9.388832 47.11888,9.294382 47.15409,9.197033 47.19404,9.097258 47.23856,8.995543 47.28742,8.892385 47.34039,8.788286 47.3972,8.683752 47.45759,8.579294 47.52125,8.47542 47.58788,8.372635 47.65714,8.271442 47.72872,8.172333 47.80225,8.075791 47.87737,7.982285 47.95373,7.892273 48.03094,7.806191 48.10864,7.724461 48.18644,7.647478 48.26397,7.57562 48.34085,7.509236 48.4167,7.448649 48.49115,7.394154 48.56385,7.346018 48.63443,7.304474 48.70255,7.269725 48.76788,7.24194 48.83011,7.221254 48.88893,7.207769 48.94405,7.20155 48.9952,7.202628 49.04214,7.210996 49.08464,7.226615 49.12248,7.249408 49.15549,7.279264 49.18351,7.316038 49.20639,7.35955 49.22403,7.409589 49.23634,7.465911 49.24326,7.528241 49.24476,7.596276 49.24082,7.669684 49.23148,7.748108 49.21676,7.831166 49.19676,7.918452 49.17156,8.009542 49.14128,8.103992 49.10608,8.201341 49.06612,8.301116 49.0216,8.402831 48.97274,8.505989 48.91977,8.610088 48.86296,8.714622 48.80257,8.81908 48.73891,8.922954 48.67229,9.025738 48.60302)))",7.87834265735788,3.2079610841319 "MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE ((6.807021 45.86081,8.335476 46.38113),CIRCULARSTRING (8.335476 46.38113,9.670455 45.88638,9.457428 44.47869),(9.457428 44.47869,7.164745 44.07219),(7.164745 44.07219,7.16448 44.07193,7.163682 44.07117,7.162346 44.06994,7.160465 44.06826,7.158035 44.06616,7.155049 44.06367,7.151502 44.06081,7.147389 44.05761,7.142703 44.05411,7.13744 44.05031,7.131594 44.04626,7.125158 44.04198,7.118128 44.0375,7.110498 44.03284,7.102263 44.02803,7.093416 44.0231,7.083952 44.01807,7.073866 44.01298,7.063152 44.00784,7.051804 44.00269,7.039817 43.99755,7.027185 43.99245,7.013903 43.98741,6.999965 43.98247,6.985366 43.97765,6.970099 43.97298,6.95416 43.96848,6.937543 43.96418,6.920241 43.96011,6.90225 43.9563,6.883565 43.95277,6.864178 43.94955,6.844086 43.94666,6.823281 43.94414,6.801759 43.94201,6.779515 43.94029,6.756542 43.93902,6.732834 43.93822,6.708387 43.93792,6.683195 43.93815,6.657252 43.93893,6.630552 43.94028,6.60309 43.94224,6.574861 43.94484,6.545859 43.9481,6.516077 43.95204,6.485512 43.9567,6.454156 43.9621,6.422005 43.96826,6.389052 43.97523,6.355293 43.98301,6.320722 43.99165,6.285333 44.00116,6.24912 44.01157,6.212078 44.02291,6.174202 44.03521,6.135485 44.0485,6.095923 44.06279,6.055509 44.07813,6.014238 44.09453,5.972105 44.11202,5.929103 44.13063,5.885228 44.15039,5.840473 44.17132,5.794833 44.19345,5.748303 44.21681,5.700877 44.24142,5.65255 44.26731),(5.65255 44.26731,5.629142 44.28005,5.605971 44.29266,5.583036 44.30515,5.560338 44.31751,5.537878 44.32976,5.515656 44.34188,5.493673 44.35389,5.471929 44.36578,5.450425 44.37756,5.42916 44.38923,5.408137 44.40079,5.387355 44.41224,5.366815 44.42359,5.346517 44.43483,5.326462 44.44596,5.306651 44.457,5.287083 44.46794,5.26776 44.47878,5.248681 44.48952,5.229848 44.50017,5.211261 44.51073,5.192921 44.5212,5.174828 44.53158,5.156982 44.54187,5.139384 44.55207,5.122035 44.5622,5.104935 44.57224,5.088085 44.58221,5.071485 44.59209,5.055135 44.6019,5.039037 44.61163,5.02319 44.6213,5.007596 44.63089,4.992254 44.64041,4.977166 44.64987,4.962332 44.65925,4.947752 44.66858,4.933426 44.67785,4.919357 44.68705,4.905543 44.69619,4.891985 44.70528,4.878685 44.71432,4.865642 44.7233,4.852856 44.73223,4.84033 44.74111,4.828062 44.74994,4.816054 44.75873,4.804307 44.76747,4.792819 44.77617,4.781593 44.78483,4.770629 44.79345,4.759926 44.80204,4.749487 44.81058,4.73931 44.8191,4.729398 44.82758,4.719749 44.83603,4.710366 44.84446,4.701247 44.85286,4.692395 44.86123,4.683809 44.86958,4.67549 44.87791,4.667438 44.88622,4.659654 44.89452,4.652138 44.90279,4.644892 44.91106,4.637915 44.91931,4.631208 44.92755,4.624771 44.93578,4.618605 44.94401,4.612712 44.95223,4.60709 44.96044,4.60174 44.96866,4.596664 44.97687,4.591862 44.98509,4.587334 44.99331,4.58308 45.00154,4.579102 45.00977,4.575399 45.01801,4.571973 45.02627,4.568823 45.03453,4.565951 45.04282,4.563357 45.05111,4.561041 45.05943,4.559004 45.06776,4.557246 45.07612,4.555768 45.0845,4.554571 45.0929,4.553654 45.10133,4.553019 45.10979,4.552666 45.11828,4.552596 45.12681,4.552809 45.13536,4.553305 45.14396,4.554085 45.15259,4.55515 45.16125,4.5565 45.16996,4.558136 45.17872,4.560058 45.18751,4.562267 45.19636,4.564763 45.20525,4.567546 45.21419,4.570618 45.22319,4.573979 45.23223,4.577629 45.24133,4.581569 45.25049,4.585799 45.25971,4.59032 45.26899,4.595133 45.27833,4.600237 45.28774,4.605634 45.29721,4.611324 45.30675,4.617307 45.31635,4.623585 45.32603,4.630157 45.33578,4.637024 45.34561,4.644186 45.35551,4.651645 45.3655,4.6594 45.37556,4.667453 45.3857,4.675803 45.39593,4.684451 45.40624,4.693398 45.41664,4.702644 45.42713,4.71219 45.43771,4.722037 45.44838,4.732184 45.45915,4.742632 45.47001,4.753383 45.48097,4.764435 45.49203,4.775791 45.50319,4.78745 45.51446,4.799413 45.52583,4.81168 45.5373,4.824252 45.54889,4.83713 45.56058,4.850314 45.57239,4.863805 45.58431,4.877602 45.59634,4.891707 45.6085,4.90612 45.62077,4.920842 45.63316),(4.920842 45.63316,6.807021 45.86081))))",12.6102092611383,8.82628707229614 "MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE ((7.95122 43.17073,10.71545 43.60976),CIRCULARSTRING (10.71545 43.60976,11.90965 43.04457,11.88618 41.72358),CIRCULARSTRING (11.88618 41.72358,10.94174 41.61709,10.94309 40.66667),CIRCULARSTRING (10.94309 40.66667,9.47915 40.59732,8.308943 41.47967),(8.308943 41.47967,7.95122 43.17073))))",12.391712762543,9.10499709332143 "MULTISURFACE (CURVEPOLYGON ((6.321812 40.53994,7.334561 39.95761,6.169899 39.4006,6.321812 40.53994)),CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (6.674234 41.58754,7.133935 41.68407,7.576033 41.52535),(7.576033 41.52535,7.389454 40.79458),CIRCULARSTRING (7.389454 40.79458,6.92651 40.79251,6.674234 41.58754))),CURVEPOLYGON (COMPOUNDCURVE ((5.041666 42.70702,6.223334 42.8936),CIRCULARSTRING (6.223334 42.8936,7.094699 42.80426,7.047392 41.9296),(7.047392 41.9296,5.399276 41.52535,5.041666 42.70702)),COMPOUNDCURVE ((5.6325 42.53599,5.959014 41.83631),CIRCULARSTRING (5.959014 41.83631,6.394047 41.91244,6.720879 42.20947),(6.720879 42.20947,6.378817 42.58263,5.6325 42.53599))))",15.7153087691675,3.08387076086474 gdalautotest-3.0.4/ogr/data/gjmultipoly.shp0000644003401500001440000000062413614004466020431 0ustar rouaultusers' Y@Y@@Y@Y@@ Y@@Y@@Y@@Y@@Y@@Y@Y@?@Y@?@Y@Y@ Y@? Y@?333333Y@?333333Y@? Y@?gdalautotest-3.0.4/ogr/data/testcondition.gml0000644003401500001440000000114513614004466020724 0ustar rouaultusers English name Nom francais Deutsche name gdalautotest-3.0.4/ogr/data/srs_name.geojson0000644003401500001440000000104713614004466020533 0ustar rouaultusers{ "type": "GeometryCollection", "geometries": [ { "type": "Point", "coordinates": [100.0, 0.0], "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::26916" } } }, { "type": "LineString", "coordinates": [ [101.0, 0.0], [102.0, 1.0] ] } ], "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::26915" } } }gdalautotest-3.0.4/ogr/data/test.gpx0000644003401500001440000000315513614004466017037 0ustar rouaultusers 2 waypoint name waypoint comment waypoint description waypoint source texttype text2type2 text3type3 route name 7 route point name 10 13 empty route track name 16 track point name 19 22 25 empty track empty track 2 gdalautotest-3.0.4/ogr/data/description_with_xml.kml0000644003401500001440000000046313614004466022302 0ustar rouaultusers Simple placemark Description
Interesting
2,49,0
gdalautotest-3.0.4/ogr/data/testpoly.shx0000644003401500001440000000032413614004466017742 0ustar rouaultusers' jrhrr@Xr@2@v@@@B@@@@R@@@@bj`gdalautotest-3.0.4/ogr/data/chinese.dbf0000644003401500001440000000022213614004466017423 0ustar rouaultuserssAQMйCP й gdalautotest-3.0.4/ogr/data/testpointzm.shp0000644003401500001440000000022013614004466020442 0ustar rouaultusers' H ?@?@@@@@ ?@@@gdalautotest-3.0.4/ogr/data/seamless_part2.dat0000644003401500001440000000213413614004466020752 0ustar rouaultusersc aidCstrC 3baz 4bawgdalautotest-3.0.4/ogr/data/points.vct0000644003401500001440000000046513614004466017373 0ustar rouaultusers?jASA@O"ANAgdalautotest-3.0.4/ogr/data/spline_weight.dxf0000644003401500001440000000400113614004466020673 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 SPLINE 5 227 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 1064 71 3 72 9 73 5 74 3 42 0.0000000001 43 0.0000000001 44 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 10 2.0 20 2.0 30 0.0 10 2.666666666666666 20 2.999999999999999 30 0.0 10 3.999999999999999 20 4.999999999999999 30 0.0 10 5.333333333333333 20 2.999999999999999 30 0.0 10 6.0 20 2.0 30 0.0 11 2.0 21 2.0 31 0.0 11 4.0 21 4.0 31 0.0 11 6.0 21 2.0 31 0.0 0 SPLINE 5 261 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 12 71 3 72 9 73 5 74 0 42 0.0000000001 43 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 10 2.0 20 2.0 30 0.0 41 1.0 10 2.666666666666666 20 2.999999999999999 30 0.0 41 1.0 10 3.999999999999999 20 4.999999999999999 30 0.0 41 2.0 10 5.333333333333333 20 2.999999999999999 30 0.0 41 1.0 10 6.0 20 2.0 30 0.0 41 1.0 0 SPLINE 5 262 330 1F 100 AcDbEntity 8 0 100 AcDbSpline 210 0.0 220 0.0 230 1.0 70 12 71 3 72 9 73 5 74 0 42 0.0000000001 43 0.0000000001 40 0.0 40 0.0 40 0.0 40 0.0 40 2.82842712474619 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 40 5.65685424949238 10 2.0 20 2.0 30 0.0 41 1.0 10 2.666666666666666 20 2.999999999999999 30 0.0 41 1.0 10 3.999999999999999 20 4.999999999999999 30 0.0 41 0.5 10 5.333333333333333 20 2.999999999999999 30 0.0 41 1.0 10 6.0 20 2.0 30 0.0 41 1.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/test3005.gdb.zip0000644003401500001440000005375313614004466020117 0ustar rouaultusersPK ʡ)E test3005.gdb/UT {CT~CTux PK3)EM#test3005.gdb/a00000006.FDO_UUID.atxUT aBTBTux A 0 DxwTj Tg(0v#"k49sf-%͵ZܺǮ[zD5{%o7PK])EFƎ([ test3005.gdb/a00000007.gdbtablxUT BTBTux ˻@`DߛԠ E'*:;f&!HLk|,̱;]N*p\Pg*oPK3)E(U#test3005.gdb/a00000004.FDO_UUID.atxUT aBTBTux ;0 PK7*[(ܽE?Wh,[|Yv9-NRIj r}Îk(gRHL&][UN&THմqb'PK3)ETT* test3005.gdb/a00000003.gdbtablxUT aBTBTux ǁ VqMl)>YjU~vPK3)E0#test3005.gdb/a00000009.spxUT aBTBTux ȱ @1~, cd(urPK 3)EKptest3005.gdb/gdbUT aBTBTux ޭPK])EA]@5test3005.gdb/a00000007.CatRelTypesByBackwardLabel.atxUT BTBTux N0z>bU"%c|)*KbiK ` g#jڠfڡԄڣC:]? OQ Π`ػϡVrE2yUBZSTlבr ~u)ܮ(kaӗ;`s٘r8KkRʨV]|ΞR|Q_}=zf~׾]7(tAiTvY2!²8I~pؒsmږ%Q/BhQ]2| 0j4GDD>g nS$a$WW / a  JDPW[de/^!p'+jK,ݠ/?f_>ˏy~kz?yun?PK\)E%6f-test3005.gdb/a00000005.CatItemTypesByUUID.atxUT BTBTux Wc5 ,,o YJlq8@Ztj;qn={kw;[%#1%   mWgk ]W}w}9^HӒ|ͳZq6IڤqENNq;5o2h [9350kLGMC|)]Y Tz ÊAhsKb8GR-&f+5ͩvhBR% 5-nZV}yPK3)EӰ 6!test3005.gdb/a00000004.gdbindexesUT aBTBTux u @F`d!tcvAB7>}[.gYfNd8q On\8*&Ok([.SR|l7:Ysԛ#k ;zRF*16xb˨Ciɵv?OPK3)Eݦr(!test3005.gdb/a00000005.gdbindexesUT aBTBTux ca``b7x NbbHeHf(a10@1兀ؙ!/20T2Y N@V(BT21$ FK0!(Wea2&[!7rin{{ U`+/P0A=:˞co2n9+4# eȼ<'p/9k!5WcȪwU{4]ܻ**A!(/ "Bg$&d@ }CM!sU XeB7K*Y3;fjJ*\Rܔ`U{ahRp7h&,ShDu e5={pe *T=hZwPK3)Eco test3005.gdb/a00000002.gdbtablxUT aBTBTux ͱ `E_M:[!EL!(Lp[pY @f:Ӽ),vcXZȗ\5Ad&;HG&[HVR"w2)֒$I$It?PK])Eo'4test3005.gdb/a00000007.CatRelTypesByForwardLabel.atxUT BTBTux j@χZOOwQ/!test3005.gdb/a00000006.gdbindexesUT aBTBTux m] AFؔ+%$uׯ3&vg3>4}`( rVdυ#^,`,Uqͤ][gT\=)tMR2əZj>MKW|{"q X%6MPK\)E+Bn0-test3005.gdb/a00000005.CatItemTypesByName.atxUT BTBTux N@ E]} Tc2oSz ‡PIU-=]Ȧgu(઀;lJr^嫟OG)Kw,Dk` IWN``&`wY@&Kޙʪn>\H:P%{WB[yz>L$,*| S&dң C~^OPK3)E\M'test3005.gdb/a00000001.TablesByName.atxUT aBTBTux M0-8{(E{X9soݽ?eO@[Qe:9YA+LxlpPhl"YF !r~NQR4O"CxQ vH!**EZdo wo% H"-HL8I$M@07+`֋hM Yz0Բ@ X"3}$hߤ_29NiyG7nv3_VrC[߲?g?C~~>ȩʷ^zuɗ_?r>~U+t0_; O_;{=ع=~zY:{]^ݣ/sVWiK r:Coy~_ŦN 8FS[gZ~rO\8Э^m<ǖFmQ,>m6 U^"4۵@D0[$"Z\Җnي^Rplp}RcrFh"~jMݮ7q3h8!:A) KFCѲ`}CpO-Afm^i؆W6V! uܰag ҏMNZW59F0 iTJLʖa>N@*!T eB8Tw} 0&H^[p<an3WsqQq<'zrsiKW?WkD~Χx>Wܿ^@+m$ 弊&ݔ"R#J2BV(SJax:`-oka{y -p$NU.>*8SL0V{lPRrfZȦ>Ʉ&g(fs LfJ 8{ʖs5ZaXMkU`~\m+]n$zJƣ# []LsCE*+HC.SUlU ,XNX]#]vY;#a@فk & bejrt>S]ٺ87sU4tYOkbp\iO}0v=Ptڌeӵs8`R%Ŧ3bb&.Ĥٸ$IXR(؂6\L 뱕B -)$L%Ҝ ڴDEiys`.j'{P) o7CHt"կʘV/sIQ#U!Xj*f^Va.rd0Kl<`-6M\/mKڂ8!6mllYU^eԤ$NL&fdK.(^brDۊ-̻|9NаIL\s*_j{n9 <(H@&O3ş[he/cyKϾo t3?ةwnߵGοe'!9ZUkr K3BɄϻѡcBC^E9C!sh*ti>t/0v]gkէE z=F۵ ~Smm /pnI)2 5%xPy%1' 2 *'ТCh# ~Fk~!s;,a"OOug}?K }VM~Ϸ>;*a N2բJdZʗSvJ1H|gp $qo3M4$s,cR<Ǩ9}=9ͼ<@F۟T1$:v&~n8Qd٢Ӣ?eƗ\~_p}i$Ch.ѥWjJv!GOweܴ6 &Zg2tFȁ9p#o׍dڊ4b/YޕW5p;X)37{ԃ09EM|ȡ׿'o_|o/O!?PKh)EeBs- test3005.gdb/a00000004.gdbtablxUT BTBTux  ۰#;7zDg#uN͚|PK3)EpzBt!test3005.gdb/a00000009.gdbindexesUT aBTBTux eA 00Зw [oB v8yb'8(<`Mj+~ޙOCO-b4PK3)Es Mtest3005.gdb/a00000002.gdbtableUT aBTBTux Tn05!!P`Tl+*-I."Mĕ/8#R|  C4٨dɾsqnB=jⰻ8@#. Q1(4!{q* j9.=6D ?5!6ԉE|Bv',)WiMr&at>(ҤH:o8X%kbv%̝vƘM=?gl6c3zqi&V'YVA<[c7L V7E; yD+aŔWTW<ݕH+^ )8+1yYzz1Xx_~3 lOkⓥy,wh[w.<<,w N/X3]V\˧{%™ǰL tEΜIUD*'#NgqE,MӊjiBD@ЯW5XIPuW_WuqU"77V>CeY2]^mACPK3)EA0N,test3005.gdb/a00000006.CatRelsByOriginID.atxUT aBTBTux A 0 Dxw#-KĻ jP`lGDdWospݖjz5GFPK3)E?GT1test3005.gdb/a00000004.CatItemsByPhysicalName.atxUT aBTBTux A @P% e{Wb.wvgzJN!wğggIJi>̐6Nti׋$I$OPK\)E)61~ test3005.gdb/a00000005.gdbtablxUT BTBTux ͡ PFW "qMj쀬B@x= I\q˔Rkb)ⶅ.063p ДA gx G +d!S}PK3)E|6 test3005.gdb/a00000006.gdbtableUT aBTBTux cf```i@ʀ܌Zɳ0@3p3$1d12$30x20002B8jL@E @Rcasj)i 0T2A.GL X[C)R+ gB$YX訿 VתyZ·{w ~oWhz'gv̉<8K#c+<1Y]oAPKh)E \:test3005.gdb/a00000004.spxUT BTBTux ױ !C/6VC7"!m>I =SwwH$IGj{PK])E^,test3005.gdb/a00000007.CatRelTypesByUUID.atxUT BTBTux X0 zCt`Y- evZtlDg+|~_|߃/w7+| ??n 49xU)LGn3ඒ !L:$s%eM}Z T s(2F8Q"4jXk,p61<{S\so v>{{h8_D up@ ft؆|w;곧@I`K[9J$Q11U}#|~Nty]_NquW.Z MH~X7L!\ }E~┺%c/Ne>K}֟n֟[ԥPKh)EQJX!test3005.gdb/a00000004.freelistUT BTBTux  @ Yăڇ]4:%ɼdP&~x7]ꜳ^PK3)E˖Pn!test3005.gdb/a00000001.gdbindexesUT aBTBTux cb```b7xO 3I& qC"CCC*C1C% A10tpЬpW  M8PK3)El5M(test3005.gdb/a00000006.CatRelsByType.atxUT aBTBTux A 0 DxwKuRg(0v#"k49[H^5[7խh ^KkJ߬oPK3)Ev%G% test3005.gdb/a00000009.gdbtablxUT aBTBTux ؁ İuu]BImVkPK])E}EA,test3005.gdb/a00000007.CatRelTypesByName.atxUT BTBTux N@1;I|"?zm\%3*iV>Y{7cL Z/o\ZQ&CKPK\)E_test3005.gdb/a00000005.gdbtableUT BTBTux cf``P8 fe@~vY@ FϐĐŐʐP p0$2UU0T20I?d.Pe{kWemѫԿ=v64YdU|>*,zβsRR4A>s?U 5~FWZ_Z j[ s};mLLEXXZT{oU(⎮9$3O.Iqai1(1$$1)'rmѿ8ɛ\C((5'$3?8#@9'ͳdpNE~FK е&*@=aԓUXs})tOM-)LVK-)/²%Nn~8B s+S e;rg':1{!#bҢJdWu0-:)ͽ}B W'g  yUҷYg9X|ɱuu$Whc EF 7 z 19ۼ;v5 bp]0\kEIj^10n@`V,t~S0W (qhғKfFM2.6<^Orv=^J-LN%׊-7 Oiq6Q3=S:(opV2{Sy*z/t$ NԴ8Z9\4oF2gى/($ LϹZrl!\ZZV ˻_oRM+r!zDC3r3/5-K1^d_MzCR!eBqCɞy]-o@"DQpKL)PG/xr[4`敀KD`sG4 @bmx(zioY(78tAYvCv=]c$=߷=%prBf=z |Y<]s~JjBXbN)LȞiN޲D9x.z KV&eL7"s{q@5F1 PK3)E.~Ctest3005.gdb/a00000001.gdbtableUT aBTBTux mM 05 *.\ Ԣv/Ab-ظ6^+xLf&yeK*w=|\Y+HPd^l2CM`G$ 5 R1O: ylTasA1j3THj_252I~HpN}RC}iHrQjx'|h+I"Rɨ̌G PK])EYB  test3005.gdb/a00000007.gdbtableUT BTBTux  PTU*(*h4E vYXuwka{<\c{2b|J6i:2򕑙69: YE9SD6vca;s{7 =K1BeJ2 0 t#T4HsfƘAlxAqِ yg6DT&2.xx4/ `Uxn;=sK fjqSi,s!d w8t֝yiϑFuesn|/s>BⷌբmH{[`ܣuZ@D-l fvK탅aL7o.m6',L{nxav.92zkAB}@-I4ˉXB8Nf1SդO^sO_68Dxq)7#6?629F6itDH DKjPY 5?ϯ6%jZ'+$AlI̐~&QX U֥}ٸv-Å[UC+Bl)ia.Ǡ,Wԥ N{m$'(dd%dILpru&>V:zҋq,#Jw[cLmF;Ŝ9EV1}[iQ4p|omya)981mQFmH.972,.|}v2r}n-'k2xdzG8"eL󖑀l$ ,cBR./JtR'du1E2g (cSGm悙LתHRW.%r5C #U);#uVc%w5%F\t&:{R4>ΰ#RL`wh2i(S5 /`nH9hk>rYūǖU-r||ZH-'g]OgJTR{3 z*tjc_XBRy} }CaeO}{ƭzѼ,{;,se`G(G@"luౄzMyN  Ky8q{(QuL6dLav/ jz7 '*3v=obSF%ertJNn6_[ HVyRyKa|col[tО;lQ O]_+&qlPRd.rW]p\ʻq"6"䋅³"Id!H6[PKh)EP4Xtest3005.gdb/a00000009.freelistUT BTBTux ׫ Ca*߂O@@1o+ 2$I$GyclPK3)E+r_% test3005.gdb/a00000006.gdbtablxUT aBTBTux  L_Bf`KL2^uZ~?PK3)E[0N1test3005.gdb/a00000006.CatRelsByDestinationID.atxUT aBTBTux A 0 DxwXki5Ļ jP`lGDdWos{Cs dyQR-u?]Wf~^|}PK3)E‡)test3005.gdb/a00000004.CatItemsByType.atxUT aBTBTux ;0`K7$bͥܽN^]OB0 $F!G}-ʍFY)ڴuo\';X'_Q8I2SVtKTeS)C  p/PK ʡ)E Atest3005.gdb/UT{CTux PK3)EM#Gtest3005.gdb/a00000006.FDO_UUID.atxUTaBTux PK])EFƎ([ test3005.gdb/a00000007.gdbtablxUTBTux PK3)E(U#test3005.gdb/a00000004.FDO_UUID.atxUTaBTux PK3)ETT* test3005.gdb/a00000003.gdbtablxUTaBTux PK3)E0#test3005.gdb/a00000009.spxUTaBTux PK 3)EKp~test3005.gdb/gdbUTaBTux PK])EA]@5test3005.gdb/a00000007.CatRelTypesByBackwardLabel.atxUTBTux PK3)Eܞ{A test3005.gdb/a00000001.gdbtablxUTaBTux PK3)E#test3005.gdb/a00000003.gdbtableUTaBTux PK\)E%6f-test3005.gdb/a00000005.CatItemTypesByUUID.atxUTBTux PK\)EE}5N test3005.gdb/a00000005.CatItemTypesByParentTypeID.atxUTBTux PK3)EӰ 6! test3005.gdb/a00000004.gdbindexesUTaBTux PK3)Eݦr(!test3005.gdb/a00000005.gdbindexesUTaBTux PK])E/E|i8test3005.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxUTBTux PK3)Eco vtest3005.gdb/a00000002.gdbtablxUTaBTux PK])Eo'4>test3005.gdb/a00000007.CatRelTypesByForwardLabel.atxUTBTux PK3)E>!test3005.gdb/a00000006.gdbindexesUTaBTux PK\)E+Bn0-test3005.gdb/a00000005.CatItemTypesByName.atxUTBTux PK3)E\M'test3005.gdb/a00000001.TablesByName.atxUTaBTux PKh)Eͱ #test3005.gdb/a00000004.gdbtableUTBTux PKh)EeBs- W"test3005.gdb/a00000004.gdbtablxUTBTux PK3)EpzBt!"test3005.gdb/a00000009.gdbindexesUTaBTux PK3)Es Mz#test3005.gdb/a00000002.gdbtableUTaBTux PK3)EA0N,%test3005.gdb/a00000006.CatRelsByOriginID.atxUTaBTux PK3)E?GT1&test3005.gdb/a00000004.CatItemsByPhysicalName.atxUTaBTux PK\)E)61~ c'test3005.gdb/a00000005.gdbtablxUTBTux PK3)E|6 :(test3005.gdb/a00000006.gdbtableUTaBTux PKh)E \:`)test3005.gdb/a00000004.spxUTBTux PK])E^,)test3005.gdb/a00000007.CatRelTypesByUUID.atxUTBTux PK3)E)!*!=,test3005.gdb/a00000003.gdbindexesUTaBTux PKh)Ey,test3005.gdb/timestampsUTBTux PKh)E,( -test3005.gdb/a00000009.gdbtableUTBTux PKh)EQJX!/test3005.gdb/a00000004.freelistUTBTux PK3)E˖Pn!C0test3005.gdb/a00000001.gdbindexesUTaBTux PK3)El5M(0test3005.gdb/a00000006.CatRelsByType.atxUTaBTux PK3)Ev%G% 1test3005.gdb/a00000009.gdbtablxUTaBTux PK])E}EA,2test3005.gdb/a00000007.CatRelTypesByName.atxUTBTux PK])Ex̫463test3005.gdb/a00000007.CatRelTypesByDestItemTypeID.atxUTBTux PK3)EdZ!f5test3005.gdb/a00000007.gdbindexesUTaBTux PK\)E_n6test3005.gdb/a00000005.gdbtableUTBTux PK3)E.~C&;test3005.gdb/a00000001.gdbtableUTaBTux PK])EYB  M<test3005.gdb/a00000007.gdbtableUTBTux PKh)EP4XAtest3005.gdb/a00000009.freelistUTBTux PK3)E+r_% SBtest3005.gdb/a00000006.gdbtablxUTaBTux PK3)E[0N1Btest3005.gdb/a00000006.CatRelsByDestinationID.atxUTaBTux PK3)E‡)Ctest3005.gdb/a00000004.CatItemsByType.atxUTaBTux PK//atDgdalautotest-3.0.4/ogr/data/pointz_without_m.shx0000644003401500001440000000015413614004466021502 0ustar rouaultusers' 6 ?@?@@@2gdalautotest-3.0.4/ogr/data/single_point_mapinfo.tab0000644003401500001440000000042013614004466022223 0ustar rouaultusers!table !version 300 !charset WindowsLatin1 Definition Table Type NATIVE Charset "WindowsLatin1" Fields 1 toto Char (10) ; begin_metadata "\IsReadOnly" = "FALSE" "\MapInfo" = "" "\MapInfo\TableID" = "b449c1dc-7e80-4bfb-b688-08f2296631e5" end_metadata gdalautotest-3.0.4/ogr/data/weird_header_length.dbf0000644003401500001440000000010713614004466021772 0ustar rouaultusers_BNUMERON N 001gdalautotest-3.0.4/ogr/data/fake_mtkgml.xml0000644003401500001440000000344213614005360020334 0ustar rouaultusers 5 En francais ! 280000 7000000 0 280000 7000000 0 280000 7000000 0 281000 7000000 0 281000 7001000 0 280000 7001000 0 280000 7000000 0 280000 7000000 0 280000 7000000 0 281000 7000000 0 281000 7001000 0 280000 7001000 0 280000 7000000 0 gdalautotest-3.0.4/ogr/data/prime_meridian.csv0000644003401500001440000000131313614004466021033 0ustar rouaultusers"PRIME_MERIDIAN_CODE","PRIME_MERIDIAN_NAME","GREENWICH_LONGITUDE","UOM_CODE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED" 8901,Greenwich,0.0,9110,,,EPSG,1995-06-02 00:00:00,96.29,0 8902,Lisbon,-9.0754862,9110,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,96.29,0 8903,Paris,2.5969213,9105,Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.,"Institut Geographique National (IGN), Paris",EPSG,1995-06-02 00:00:00,,0 8904,Bogota,-74.04513,9110,,"Instituto Geografico ""Augustin Cadazzi"" (IGAC); Bogota",EPSG,1995-06-02 00:00:00,96.29,0 gdalautotest-3.0.4/ogr/data/prjwithutf8bom.dbf0000644003401500001440000000040213614004466021001 0ustar rouaultusers_aWidCPWKTCP 1 POINT(-100 50) gdalautotest-3.0.4/ogr/data/ap01578l.tab0000644003401500001440000000100413614004466017200 0ustar rouaultusers146.1325 -55.6480 3385269.8 -26493039.38 3.242 2.607 51 54 52 62 367261. 0.000 0.000 14.6463 86.895 86.895 103.58 3 96 88 104 80 1804 1582 12.88 146.1202 -55.5965 3385310.2 -26493038.38 2.611 2.452 51 54 52 62 367241. 0.000 0.000 14.6463 86.895 86.895 103.58 3 64 80 72 56 1804 1582 12.88 146.1079 -55.5449 3385368.0 -26493037.38 2.838 2.591 50 54 52 61 367205. 0.000 0.000 14.6455 86.809 86.809 103.58 3 104 88 120 88 1804 1582 12.88 gdalautotest-3.0.4/ogr/data/curve_circle_by_center.csv0000644003401500001440000000074213614004466022553 0ustar rouaultusersWKT,id "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (1 0,-0.7071068 -0.7071068,0 1)))",1 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (5 1,5.707107 0.7071068,6 0)))",2 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (10 1,9.292893 -0.7071068,11 0)))",3 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (16 0,15.70711 0.7071068,15 1)))",4 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (21 0,19.29289 -0.7071068,20 1)))",5 "MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (31 0,28.58579 -1.414214,30 2)))",6 gdalautotest-3.0.4/ogr/data/arcm_without_m.shx0000644003401500001440000000016413614004466021102 0ustar rouaultusers' :@@2(^:gdalautotest-3.0.4/ogr/data/seamless.id0000644003401500001440000000001013614004466017455 0ustar rouaultusers9gdalautotest-3.0.4/ogr/data/esrizmmultipoint.json0000644003401500001440000000164613614004466021674 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryMultiPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "hasZ" : true, "hasM" : true, "points" : [ [2,49,1,100], [3,50,2,100] ], }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/LWPOLYLINE-OCS.dxf0000644003401500001440000003201313614004466020156 0ustar rouaultusers 0 SECTION 2 HEADER 9 $ACADVER 1 AC1027 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 VPORT 5 EEEE1 330 0 100 AcDbSymbolTable 70 1 0 VPORT 5 EEEEB 330 EEEE1 100 AcDbSymbolTableRecord 100 AcDbViewportTableRecord 2 *ACTIVE 70 0 0 ENDTAB 0 TABLE 2 LTYPE 5 EEEE4 330 0 100 AcDbSymbolTable 70 3 0 LTYPE 5 51A 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByBlock 70 0 3 72 65 73 0 40 0.0 0 LTYPE 5 51B 330 EEEE4 100 AcDbSymbolTableRecord 100 AcDbLinetypeTableRecord 2 ByLayer 70 0 3 72 65 73 0 40 0.0 0 ENDTAB 0 TABLE 2 LAYER 5 EEEE8 330 0 100 AcDbSymbolTable 70 2 0 LAYER 5 EEEF1 330 EEEE8 100 AcDbSymbolTableRecord 100 AcDbLayerTableRecord 2 0 70 0 62 7 6 CONTINUOUS 370 -3 390 4CF 347 4E1 348 0 0 ENDTAB 0 TABLE 2 STYLE 5 EEEE9 330 0 100 AcDbSymbolTable 70 3 0 STYLE 5 EEEF2 330 EEEE9 100 AcDbSymbolTableRecord 100 AcDbTextStyleTableRecord 2 STANDARD 70 0 40 0.0 41 1.0 50 0.0 71 0 42 0.2 3 Arial 4 0 ENDTAB 0 TABLE 2 VIEW 5 EEEE3 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 UCS 5 EEEE2 100 AcDbSymbolTable 0 ENDTAB 0 TABLE 2 APPID 5 EEEE5 330 0 100 AcDbSymbolTable 70 1 0 APPID 5 EEEF3 330 EEEE5 100 AcDbSymbolTableRecord 100 AcDbRegAppTableRecord 2 ACAD 70 0 0 ENDTAB 0 TABLE 2 DIMSTYLE 5 EEEE6 330 0 100 AcDbSymbolTable 70 2 100 AcDbDimStyleTable 71 0 0 DIMSTYLE 105 EEEF4 330 EEEE6 100 AcDbSymbolTableRecord 100 AcDbDimStyleTableRecord 2 STANDARD 70 0 279 2 340 EEEF2 0 ENDTAB 0 TABLE 2 BLOCK_RECORD 5 EEEE7 330 0 100 AcDbSymbolTable 70 3 0 BLOCK_RECORD 5 EEEEE 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Model_Space 340 EEEEA 70 0 280 1 281 0 0 BLOCK_RECORD 5 EEEF6 330 EEEE7 100 AcDbSymbolTableRecord 100 AcDbBlockTableRecord 2 *Paper_Space 340 EEEF5 70 0 280 1 281 0 0 ENDTAB 0 ENDSEC 0 SECTION 2 BLOCKS 0 BLOCK 5 EEEED 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockBegin 2 *Model_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Model_Space 1 0 ENDBLK 5 EEEEC 330 EEEEE 100 AcDbEntity 8 0 100 AcDbBlockEnd 0 BLOCK 5 EEEF7 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockBegin 2 *Paper_Space 70 0 10 0.0 20 0.0 30 0.0 3 *Paper_Space 1 0 ENDBLK 5 EEEF8 330 EEEF6 100 AcDbEntity 67 1 8 0 100 AcDbBlockEnd 0 ENDSEC 0 SECTION 2 ENTITIES 0 LWPOLYLINE 5 4043 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 5 70 128 43 0.0 10 597867.678 20 3152999.502 10 597982.792 20 3139150.565 10 610231.4620000001 20 3139258.524000001 10 610101.9520000001 20 3153107.77 10 597867.678 20 3152999.502 0 LWPOLYLINE 5 406E 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 3 70 128 43 0.0 38 -67545.88205211474 10 2592057.934181943 20 1891720.736743474 10 2591291.243373795 20 1891003.402139545 10 2589738.857988769 20 1892830.923909455 210 0.0245753983625527 220 -0.0262800377778069 230 0.9993524950735446 0 POLYLINE 5 406F 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 291F8 330 406F 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603822.815 20 3153052.202 30 511.389 70 32 0 VERTEX 5 291F9 330 406F 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603786.5230000001 20 3152273.68 30 494.8 70 32 0 VERTEX 5 291FA 330 406F 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 600256.1970000001 20 3151972.969 30 536.728 70 32 0 VERTEX 5 291FB 330 406F 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 600326.546 20 3153021.262 30 562.5019999999999 70 32 0 SEQEND 5 291FC 330 406F 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 POLYLINE 5 40DC 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 298AB 330 40DC 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 607794.87 20 3153087.353 30 490.776 70 32 0 VERTEX 5 298AC 330 40DC 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 607760.02 20 3152299.163 30 474.4819999999999 70 32 0 VERTEX 5 298AD 330 40DC 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603787.372 20 3152272.839 30 494.7129999999999 70 32 0 VERTEX 5 298AE 330 40DC 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603823.483 20 3153052.208 30 511.3539999999999 70 32 0 SEQEND 5 298AF 330 40DC 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 LWPOLYLINE 5 412D 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 3 70 128 43 0.0 38 -86793.72490134147 10 -2711547.936978027 20 1716868.323123464 10 -2711868.371241326 20 1715980.939009952 10 -2712591.001216132 20 1716302.256680572 210 -0.0472746647304604 220 -0.0185692561419389 230 0.9987093114620279 0 LWPOLYLINE 5 412E 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 2 70 128 43 0.0 38 -32665.9334821103 10 -3134506.255083367 20 695284.4932289098 10 -3134506.255083367 20 693918.5358052743 210 -0.0477545015188232 220 -0.0013058637429511 230 0.9988582493550191 0 POLYLINE 5 417B 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 2A0CB 330 417B 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 597874.095 20 3152227.535 30 483.5499999999999 70 32 0 VERTEX 5 2A0CC 330 417B 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 600256.2010000001 20 3151973.379000001 30 536.586 70 32 0 VERTEX 5 2A0CD 330 417B 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 599825.7330000001 20 3144772.92 30 402.3089999999999 70 32 0 VERTEX 5 2A0CE 330 417B 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 597934.155 20 3145001.924 30 372.107 70 32 0 SEQEND 5 2A0CF 330 417B 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 POLYLINE 5 4226 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 2AAE7 330 4226 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 610177.503 20 3145028.646 30 507.5129999999999 70 32 0 VERTEX 5 2AAE8 330 4226 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 608162.779 20 3144671.872 30 407.737 70 32 0 VERTEX 5 2AAE9 330 4226 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 607761.9980000001 20 3152298.692 30 474.191 70 32 0 VERTEX 5 2AAEA 330 4226 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 610108.9300000001 20 3152361.621 30 586.4649999999999 70 32 0 SEQEND 5 2AAEB 330 4226 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 LWPOLYLINE 5 4348 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 3 70 128 43 0.0 38 -13787.81410375205 10 -3077757.105743263 20 880784.7875995761 10 -3077357.305795526 20 882647.694098731 10 -3071779.558458256 20 882079.8326686329 210 -0.0160080086036236 220 -0.0014588341842861 230 0.999870799385285 0 POLYLINE 5 4423 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 2CA74 330 4423 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 599764.934 20 3139166.273 30 393.333 70 32 0 VERTEX 5 2CA75 330 4423 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 599825.745 20 3144772.186 30 401.7809999999999 70 32 0 VERTEX 5 2CA76 330 4423 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603900.411 20 3144967.134 30 379.975 70 32 0 VERTEX 5 2CA77 330 4423 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 604309.27 20 3139206.326 30 430.736 70 32 0 SEQEND 5 2CA78 330 4423 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 POLYLINE 5 44FF 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDb3dPolyline 66 1 10 0.0 20 0.0 30 0.0 70 8 0 VERTEX 5 2D90E 330 44FF 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 604308.426 20 3139206.319 30 431.087 70 32 0 VERTEX 5 2D90F 330 44FF 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 603900.0579999999 20 3144966.647 30 379.518 70 32 0 VERTEX 5 2D910 330 44FF 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 608163.693 20 3144673.362 30 355.975 70 32 0 VERTEX 5 2D911 330 44FF 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbVertex 100 AcDb3dPolylineVertex 10 608627.326 20 3139244.385 30 289.338 70 32 0 SEQEND 5 2D912 330 44FF 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 0 LWPOLYLINE 5 4595 330 EEEEE 100 AcDbEntity 8 0 6 Continuous 62 7 370 -3 100 AcDbPolyline 90 3 70 128 43 0.0 38 -90468.4558433807 10 -2844162.699885624 20 1458710.626232207 10 -2849505.045931202 20 1459785.493015575 10 -2849284.321174725 20 1461821.40635931 210 -0.0596247448067857 220 -0.017350575044619 230 0.9980700613445666 0 LWPOLYLINE 5 2FAAD 330 EEEEE 100 AcDbEntity 8 0 100 AcDbPolyline 90 10 70 128 43 0.0 38 -1745346.724493969 10 -2680074.283666871 20 1807.373239133308 10 -2680528.081743926 20 1807.373239133308 42 0.4142135623730951 10 -2680568.081744213 20 1767.373239133307 10 -2680568.081744086 20 1661.184230680374 42 -0.4142135623730951 10 -2680608.081743998 20 1621.184230680374 10 -2681431.272631172 20 1621.184230680374 42 -0.4142135623730951 10 -2681471.272631022 20 1661.184230680374 10 -2681471.272630948 20 1752.316529788103 42 0.4142135623730951 10 -2681511.272631108 20 1792.316529788103 10 -2681979.871336681 20 1792.316529788103 210 -0.9268411628119032 220 -0.3754536708003788 230 0.0000000000842114 0 ENDSEC 0 SECTION 2 OBJECTS 0 DICTIONARY 5 4CC 330 0 100 AcDbDictionary 281 1 3 ACAD_GROUP 350 4CD 0 DICTIONARY 5 4CD 102 {ACAD_REACTORS 330 4CC 102 } 330 4CC 100 AcDbDictionary 281 1 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/ogr_gml_55.xsd0000644003401500001440000000301013614005361020000 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/esriinvalidhaszmultipoint.json0000644003401500001440000000160313614004466023553 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryMultiPoint", "spatialReference" : { "wkid" : 4326 }, "fields" : [ { "name" : "objectid", "alias" : "Object ID", "type" : "esriFieldTypeOID" }, { "name" : "fooInt", "alias" : "fooInt", "type" : "esriFieldTypeInteger", "length" : 36 }, { "name" : "fooDouble", "alias" : "fooDouble", "type" : "esriFieldTypeDouble" }, { "name" : "fooString", "alias" : "fooString", "type" : "esriFieldTypeString", "length" : 50 }, ], "features" : [ { "geometry" : { "hasZ" : true, "points" : [ [2,49], [3,50] ], }, "attributes" : { "objectid" : 1, "fooInt" : 2, "fooDouble" : 3.4, "fooString" : "56", } } ] } gdalautotest-3.0.4/ogr/data/testlyrdef.xsd0000644003401500001440000000445613614005361020245 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/solid-vertex-ordering.dxf0000644003401500001440000000045313614004466022275 0ustar rouaultusers 0 SECTION 2 ENTITIES 0 SOLID 5 5BB 8 0 10 0.0 20 5.0 30 0.0 11 1.5 21 2.5 31 0.0 12 0.0 22 2.5 32 0.0 13 1.5 23 0.0 33 0.0 0 SOLID 5 5CC 8 0 10 -10.0 20 13.0 30 123.0 11 10.0 21 10.0 31 123.0 12 8.0 22 13.0 32 123.0 13 5.0 23 12.0 33 123.0 0 ENDSEC 0 EOF gdalautotest-3.0.4/ogr/data/esripolygon.json0000644003401500001440000000242013614004466020577 0ustar rouaultusers{ "objectIdFieldName" : "objectid", "globalIdFieldName" : "", "geometryType" : "esriGeometryPolygon", "fields" : [ ], "features" : [ { "geometry" : { "rings" : [ [ [ 2, 49 ], [ 2, 50 ], [ 3, 50 ], [ 3, 49 ], [ 2, 49 ] ], [ [ 2.1, 49.1 ], [ 2.1, 49.9 ], [ 2.9, 49.9 ], [ 2.9, 49.1 ], [ 2.1, 49.1 ] ], [ [ -2, 49 ], [ -2, 50 ], [ -3, 50 ], [ -3, 49 ], [ -2, 49 ] ], ] }, "attributes" : { } } ] } gdalautotest-3.0.4/ogr/data/emptyshapefilewithsbn.shp0000644003401500001440000000014413614004466022465 0ustar rouaultusers' 2gdalautotest-3.0.4/ogr/data/curveProperty.xml0000644003401500001440000000757413614005361020757 0ustar rouaultusers 21 6 21 14 9 6 21 6 9 6 9 14 9 14 9 22 9 22 21 22 21 14 21 22 gdalautotest-3.0.4/ogr/data/bna_for_gpx.bna0000644003401500001440000000005713614004466020304 0ustar rouaultusers"PID1","SID1","TID1",1 0,1 "PID2","SID2",1 2,3 gdalautotest-3.0.4/ogr/data/all_geoms.mif.golden.csv0000644003401500001440000006550513614004466022047 0ustar rouaultusersWKT,ogr_style "POINT (0 1)","SYMBOL(a:0,c:#000000,s:12pt,id:""mapinfo-sym-35,ogr-sym-10"")" "POINT (2 3)","SYMBOL(a:0,c:#000000,s:1pt,id:""mapinfo-sym-35,ogr-sym-10"")" "POINT (4 5)","SYMBOL(a:30,c:#000001,s:2pt,id:""font-sym-99,ogr-sym-9"",f:""foo"")" "LINESTRING (0 1,2 3)","PEN(w:1px,c:#000000,id:""mapinfo-pen-2,ogr-pen-0"")" "LINESTRING (0 1,2 3)","PEN(w:1px,c:#000000,id:""mapinfo-pen-2,ogr-pen-0"")" "LINESTRING (0 1,2 3)","PEN(w:1px,c:#000000,id:""mapinfo-pen-2,ogr-pen-0"")" "MULTILINESTRING ((0 1,2 3),(3 4,5 6))","PEN(w:1px,c:#000003,id:""mapinfo-pen-2,ogr-pen-0"")" "POLYGON ((-1 -1,1 -1,1 1,-1 1,-1 -1))","BRUSH(fc:#000002,bc:#000003,id:""mapinfo-brush-1,ogr-brush-1"");PEN(w:1px,c:#000003,id:""mapinfo-pen-2,ogr-pen-0"")" "POLYGON ((-1.0 -0.5,-0.999681412828496 -0.51784616691949,-0.998726057305127 -0.535669591599616,-0.997135150885949 -0.553447560782556,-0.994910720940466 -0.571157419136642,-0.992055602168058 -0.588776598127152,-0.98857343298558 -0.606282644776488,-0.984468650890754 -0.623653250277108,-0.979746486807249 -0.640866278420715,-0.97441295841866 -0.657899793807512,-0.968474862499881 -0.674732089799549,-0.961939766255643 -0.691341716182545,-0.954815997677259 -0.707707506500943,-0.947112634929856 -0.723808605031356,-0.938839494783628 -0.739624493360028,-0.93000712010385 -0.75513501653045,-0.920626766415591 -0.770320408727799,-0.910710387560246 -0.785161318467482,-0.90027062046218 -0.799638833255673,-0.889320769024878 -0.813734503690426,-0.877874787177129 -0.827430366972642,-0.865947261090863 -0.840708969796945,-0.853553390593274 -0.853553390593274,-0.840708969796946 -0.865947261090863,-0.827430366972643 -0.877874787177129,-0.813734503690426 -0.889320769024877,-0.799638833255674 -0.90027062046218,-0.785161318467482 -0.910710387560246,-0.770320408727799 -0.920626766415591,-0.75513501653045 -0.93000712010385,-0.739624493360029 -0.938839494783628,-0.723808605031356 -0.947112634929856,-0.707707506500943 -0.954815997677259,-0.691341716182545 -0.961939766255643,-0.674732089799549 -0.968474862499881,-0.657899793807513 -0.97441295841866,-0.640866278420715 -0.979746486807249,-0.623653250277108 -0.984468650890754,-0.606282644776488 -0.98857343298558,-0.588776598127152 -0.992055602168058,-0.571157419136643 -0.994910720940466,-0.553447560782556 -0.997135150885949,-0.535669591599616 -0.998726057305127,-0.51784616691949 -0.999681412828496,-0.5 -1.0,-0.5 -1.0,0.5 -1.0,0.51784616691949 -0.999681412828496,0.535669591599616 -0.998726057305127,0.553447560782556 -0.997135150885949,0.571157419136642 -0.994910720940466,0.588776598127152 -0.992055602168058,0.606282644776488 -0.98857343298558,0.623653250277107 -0.984468650890754,0.640866278420715 -0.979746486807249,0.657899793807512 -0.97441295841866,0.674732089799549 -0.968474862499881,0.691341716182545 -0.961939766255643,0.707707506500943 -0.954815997677259,0.723808605031356 -0.947112634929856,0.739624493360028 -0.938839494783628,0.75513501653045 -0.93000712010385,0.770320408727799 -0.920626766415591,0.785161318467482 -0.910710387560246,0.799638833255673 -0.90027062046218,0.813734503690426 -0.889320769024878,0.827430366972643 -0.877874787177129,0.840708969796945 -0.865947261090863,0.853553390593274 -0.853553390593274,0.865947261090863 -0.840708969796946,0.877874787177129 -0.827430366972643,0.889320769024877 -0.813734503690426,0.90027062046218 -0.799638833255674,0.910710387560246 -0.785161318467482,0.920626766415591 -0.770320408727799,0.93000712010385 -0.75513501653045,0.938839494783628 -0.739624493360029,0.947112634929856 -0.723808605031356,0.954815997677259 -0.707707506500943,0.961939766255643 -0.691341716182545,0.968474862499881 -0.674732089799549,0.97441295841866 -0.657899793807513,0.979746486807249 -0.640866278420715,0.984468650890754 -0.623653250277108,0.98857343298558 -0.606282644776488,0.992055602168058 -0.588776598127152,0.994910720940466 -0.571157419136643,0.997135150885949 -0.553447560782556,0.998726057305127 -0.535669591599616,0.999681412828496 -0.51784616691949,1.0 -0.5,1.0 -0.5,1.0 0.5,0.999681412828496 0.51784616691949,0.998726057305127 0.535669591599616,0.997135150885949 0.553447560782556,0.994910720940466 0.571157419136643,0.992055602168058 0.588776598127152,0.98857343298558 0.606282644776488,0.984468650890754 0.623653250277108,0.979746486807249 0.640866278420715,0.97441295841866 0.657899793807512,0.968474862499881 0.674732089799549,0.961939766255643 0.691341716182545,0.954815997677259 0.707707506500943,0.947112634929856 0.723808605031356,0.938839494783628 0.739624493360028,0.93000712010385 0.75513501653045,0.920626766415591 0.770320408727799,0.910710387560246 0.785161318467482,0.90027062046218 0.799638833255673,0.889320769024878 0.813734503690426,0.877874787177129 0.827430366972643,0.865947261090863 0.840708969796946,0.853553390593274 0.853553390593274,0.840708969796946 0.865947261090863,0.827430366972643 0.877874787177129,0.813734503690426 0.889320769024878,0.799638833255673 0.90027062046218,0.785161318467482 0.910710387560246,0.770320408727799 0.92062676641559,0.75513501653045 0.93000712010385,0.739624493360028 0.938839494783628,0.723808605031356 0.947112634929856,0.707707506500943 0.954815997677259,0.691341716182545 0.961939766255643,0.674732089799549 0.968474862499881,0.657899793807513 0.97441295841866,0.640866278420715 0.979746486807249,0.623653250277108 0.984468650890754,0.606282644776488 0.98857343298558,0.588776598127152 0.992055602168058,0.571157419136643 0.994910720940466,0.553447560782556 0.997135150885949,0.535669591599616 0.998726057305127,0.51784616691949 0.999681412828496,0.5 1.0,0.5 1.0,-0.5 1.0,-0.51784616691949 0.999681412828496,-0.535669591599616 0.998726057305127,-0.553447560782556 0.997135150885949,-0.571157419136643 0.994910720940466,-0.588776598127152 0.992055602168058,-0.606282644776488 0.98857343298558,-0.623653250277108 0.984468650890754,-0.640866278420715 0.979746486807249,-0.657899793807512 0.97441295841866,-0.674732089799549 0.968474862499881,-0.691341716182545 0.961939766255643,-0.707707506500943 0.954815997677259,-0.723808605031356 0.947112634929856,-0.739624493360028 0.938839494783628,-0.75513501653045 0.93000712010385,-0.770320408727799 0.92062676641559,-0.785161318467482 0.910710387560246,-0.799638833255673 0.90027062046218,-0.813734503690426 0.889320769024877,-0.827430366972642 0.877874787177129,-0.840708969796945 0.865947261090863,-0.853553390593274 0.853553390593274,-0.865947261090863 0.840708969796946,-0.877874787177129 0.827430366972643,-0.889320769024878 0.813734503690426,-0.90027062046218 0.799638833255674,-0.910710387560246 0.785161318467482,-0.92062676641559 0.770320408727799,-0.93000712010385 0.75513501653045,-0.938839494783628 0.739624493360029,-0.947112634929856 0.723808605031356,-0.954815997677259 0.707707506500943,-0.961939766255643 0.691341716182545,-0.968474862499881 0.674732089799549,-0.97441295841866 0.657899793807513,-0.979746486807249 0.640866278420715,-0.984468650890754 0.623653250277108,-0.98857343298558 0.606282644776488,-0.992055602168058 0.588776598127152,-0.994910720940466 0.571157419136643,-0.997135150885949 0.553447560782556,-0.998726057305127 0.535669591599616,-0.999681412828496 0.51784616691949,-1.0 0.5,-1.0 0.5,-1.0 -0.5))","BRUSH(fc:#000002,bc:#000003,id:""mapinfo-brush-1,ogr-brush-1"");PEN(w:1px,c:#000003,id:""mapinfo-pen-2,ogr-pen-0"")" "POLYGON ((1 0,0.999384002305604 0.035094386098525,0.997536768128735 0.070145536075204,0.994460573253382 0.105110267074894,0.990159207537445 0.139945502710232,0.984637970243652 0.17460832613155,0.977903663510889 0.209056032900229,0.969964583973999 0.243246183600376,0.960830512542361 0.277136656123986,0.95051270234986 0.310685697565186,0.939023864891076 0.343851975659622,0.926378154360781 0.376594629705619,0.912591150216036 0.408873320904375,0.897679837982373 0.440648282057176,0.881662588327704 0.471880366558404,0.864559134429745 0.50253109662397,0.846390547664831 0.532562710695771,0.827179211648077 0.561938209963753,0.806948794656867 0.590621403948273,0.78572422047165 0.618576955086607,0.763531637669949 0.645770422268662,0.740398387411442 0.672168303268263,0.716352969753775 0.697738076017747,0.691425008540625 0.722448238674991,0.665645214905257 0.746268348433547,0.639045349434554 0.769169059028032,0.611658183040119 0.791122156888593,0.583517456584662 0.812100595899896,0.554657839313413 0.832078530721816,0.525114886141773 0.851031348630773,0.49492499385182 0.8689356998425,0.464125356251644 0.885769526278865,0.432753918352745 0.901512088743321,0.400849329621953 0.916143992471506,0.368450896365467 0.929647211025497,0.335598533303662 0.9420051085023,0.302332714396342 0.953202460029211,0.268694422979004 0.963225470520781,0.234725101271563 0.972061791674302,0.200466599321721 0.97970053718286,0.165961123445908 0.986132296147212,0.131251184231291 0.991349144669971,0.096379544162927 0.995344655617815,0.061389164940581 0.998113906539678,0.026323154550107 0.999653485731196,-0.008775285845392 0.999961496437904,-0.043862915129194 0.99903755919203,-0.078896505503818 0.996882812280002,-0.113832895747469 0.993499910340079,-0.148629044388467 0.988893021091853,-0.183242082732137 0.983067820201632,-0.217629367674849 0.976031484290054,-0.25174853424012 0.967792682090514,-0.285557547772072 0.958361563769333,-0.319014755721933 0.947749748420792,-0.352078938963789 0.935970309752469,-0.384709362576352 0.923037759978484,-0.416865826028194 0.908968031940525,-0.448508712704625 0.893778459478656,-0.479599038715171 0.877487756076108,-0.510098500921552 0.860115991804353,-0.539969524126966 0.841684568596869,-0.569175307368569 0.822216193882056,-0.597679869256079 0.801734852607791,-0.625448092300692 0.780265777692079,-0.652445766179662 0.757835418936218,-0.678639629883262 0.734471410438765,-0.703997412692194 0.710202536550452,-0.728487873934968 0.685058696412001,-0.752080841476264 0.659070867118518,-0.774747248888862 0.632271065555858,-0.79645917126335 0.604692308955966,-0.81718985961148 0.576368574219804,-0.836913773820802 0.547334756057957,-0.85560661411996 0.517626624000523,-0.873245351015902 0.487280778329203,-0.889808253666109 0.456334604985935,-0.905274916650891 0.424826229513578,-0.919626285112769 0.392794470085423,-0.932844678231977 0.360278789681379,-0.944913811009144 0.327319247469768,-0.955818814328342 0.293956449454612,-0.965546253275767 0.260231498449222,-0.974084143691492 0.226185943437725,-0.981421966933893 0.191861728386902,-0.987550682838572 0.157301140571421,-0.992462740855796 0.122546758476105,-0.996152089352738 0.087641399339435,-0.998614183069062 0.052628066402911,-0.999845988716663 0.017549895931258,-0.999845988716663 -0.017549895931257,-0.998614183069062 -0.05262806640291,-0.996152089352738 -0.087641399339434,-0.992462740855796 -0.122546758476104,-0.987550682838572 -0.157301140571421,-0.981421966933893 -0.191861728386901,-0.974084143691492 -0.226185943437724,-0.965546253275767 -0.260231498449222,-0.955818814328342 -0.293956449454612,-0.944913811009144 -0.327319247469768,-0.932844678231977 -0.360278789681378,-0.919626285112769 -0.392794470085422,-0.905274916650891 -0.424826229513577,-0.889808253666109 -0.456334604985934,-0.873245351015903 -0.487280778329202,-0.85560661411996 -0.517626624000522,-0.836913773820802 -0.547334756057957,-0.81718985961148 -0.576368574219803,-0.79645917126335 -0.604692308955966,-0.774747248888862 -0.632271065555857,-0.752080841476264 -0.659070867118517,-0.728487873934969 -0.685058696412,-0.703997412692195 -0.710202536550452,-0.678639629883263 -0.734471410438765,-0.652445766179663 -0.757835418936218,-0.625448092300692 -0.780265777692079,-0.59767986925608 -0.801734852607791,-0.56917530736857 -0.822216193882056,-0.539969524126967 -0.841684568596868,-0.510098500921552 -0.860115991804353,-0.479599038715172 -0.877487756076108,-0.448508712704626 -0.893778459478656,-0.416865826028195 -0.908968031940525,-0.384709362576352 -0.923037759978484,-0.35207893896379 -0.935970309752468,-0.319014755721934 -0.947749748420792,-0.285557547772073 -0.958361563769333,-0.25174853424012 -0.967792682090514,-0.21762936767485 -0.976031484290054,-0.183242082732138 -0.983067820201632,-0.148629044388467 -0.988893021091853,-0.113832895747469 -0.993499910340079,-0.078896505503818 -0.996882812280002,-0.043862915129195 -0.99903755919203,-0.008775285845392 -0.999961496437904,0.026323154550106 -0.999653485731196,0.061389164940581 -0.998113906539679,0.096379544162927 -0.995344655617815,0.131251184231291 -0.991349144669971,0.165961123445907 -0.986132296147212,0.20046659932172 -0.97970053718286,0.234725101271562 -0.972061791674303,0.268694422979004 -0.963225470520781,0.302332714396341 -0.953202460029211,0.335598533303661 -0.942005108502301,0.368450896365466 -0.929647211025497,0.400849329621952 -0.916143992471506,0.432753918352744 -0.901512088743322,0.464125356251643 -0.885769526278865,0.49492499385182 -0.8689356998425,0.525114886141773 -0.851031348630773,0.554657839313413 -0.832078530721816,0.583517456584661 -0.812100595899897,0.611658183040119 -0.791122156888593,0.639045349434554 -0.769169059028033,0.665645214905256 -0.746268348433548,0.691425008540624 -0.722448238674992,0.716352969753775 -0.697738076017747,0.740398387411442 -0.672168303268264,0.763531637669948 -0.645770422268663,0.785724220471649 -0.618576955086608,0.806948794656867 -0.590621403948273,0.827179211648076 -0.561938209963753,0.84639054766483 -0.532562710695772,0.864559134429745 -0.50253109662397,0.881662588327704 -0.471880366558404,0.897679837982373 -0.440648282057176,0.912591150216036 -0.408873320904375,0.926378154360781 -0.376594629705619,0.939023864891076 -0.343851975659623,0.95051270234986 -0.310685697565187,0.96083051254236 -0.277136656123987,0.969964583973998 -0.243246183600377,0.977903663510889 -0.20905603290023,0.984637970243652 -0.174608326131551,0.990159207537444 -0.139945502710234,0.994460573253382 -0.105110267074894,0.997536768128735 -0.070145536075204,0.999384002305604 -0.035094386098526,1.0 -0.0,1.0 -0.0,1 0))","BRUSH(fc:#000002,bc:#000003,id:""mapinfo-brush-1,ogr-brush-1"");PEN(w:1px,c:#000003,id:""mapinfo-pen-2,ogr-pen-0"")" "LINESTRING (1 0,0.999390827019096 0.034899496702501,0.997564050259824 0.069756473744125,0.994521895368273 0.104528463267653,0.99026806874157 0.139173100960065,0.984807753012208 0.17364817766693,0.978147600733806 0.207911690817759,0.970295726275996 0.241921895599668,0.961261695938319 0.275637355816999,0.951056516295154 0.309016994374947,0.939692620785908 0.342020143325669,0.927183854566787 0.374606593415912,0.913545457642601 0.4067366430758,0.898794046299167 0.438371146789077,0.882947592858927 0.469471562785891,0.866025403784439 0.5,0.848048096156426 0.529919264233205,0.829037572555042 0.559192903470747,0.809016994374947 0.587785252292473,0.788010753606722 0.615661475325658,0.766044443118978 0.642787609686539,0.743144825477394 0.669130606358858,0.719339800338651 0.694658370458997,0.694658370458997 0.719339800338651,0.669130606358858 0.743144825477394,0.642787609686539 0.766044443118978,0.615661475325658 0.788010753606722,0.587785252292473 0.809016994374947,0.559192903470747 0.829037572555042,0.529919264233205 0.848048096156426,0.5 0.866025403784439,0.469471562785891 0.882947592858927,0.438371146789077 0.898794046299167,0.4067366430758 0.913545457642601,0.374606593415912 0.927183854566787,0.342020143325669 0.939692620785908,0.309016994374947 0.951056516295154,0.275637355816999 0.961261695938319,0.241921895599668 0.970295726275996,0.207911690817759 0.978147600733806,0.17364817766693 0.984807753012208,0.139173100960065 0.99026806874157,0.104528463267653 0.994521895368273,0.069756473744125 0.997564050259824,0.034899496702501 0.999390827019096,0.0 1.0,-0.034899496702501 0.999390827019096,-0.069756473744125 0.997564050259824,-0.104528463267654 0.994521895368273,-0.139173100960065 0.99026806874157,-0.17364817766693 0.984807753012208,-0.207911690817759 0.978147600733806,-0.241921895599668 0.970295726275996,-0.275637355816999 0.961261695938319,-0.309016994374947 0.951056516295154,-0.342020143325669 0.939692620785908,-0.374606593415912 0.927183854566787,-0.4067366430758 0.913545457642601,-0.438371146789078 0.898794046299167,-0.469471562785891 0.882947592858927,-0.5 0.866025403784439,-0.529919264233205 0.848048096156426,-0.559192903470747 0.829037572555042,-0.587785252292473 0.809016994374947,-0.615661475325658 0.788010753606722,-0.642787609686539 0.766044443118978,-0.669130606358858 0.743144825477394,-0.694658370458997 0.719339800338651,-0.719339800338651 0.694658370458997,-0.743144825477394 0.669130606358858,-0.766044443118978 0.642787609686539,-0.788010753606722 0.615661475325658,-0.809016994374947 0.587785252292473,-0.829037572555042 0.559192903470747,-0.848048096156426 0.529919264233205,-0.866025403784439 0.5,-0.882947592858927 0.469471562785891,-0.898794046299167 0.438371146789077,-0.913545457642601 0.4067366430758,-0.927183854566787 0.374606593415912,-0.939692620785908 0.342020143325669,-0.951056516295154 0.309016994374948,-0.961261695938319 0.275637355816999,-0.970295726275996 0.241921895599668,-0.978147600733806 0.207911690817759,-0.984807753012208 0.17364817766693,-0.99026806874157 0.139173100960065,-0.994521895368273 0.104528463267654,-0.997564050259824 0.069756473744126,-0.999390827019096 0.034899496702501,-1.0 0.0,-0.999390827019096 -0.034899496702501,-0.997564050259824 -0.069756473744125,-0.994521895368273 -0.104528463267653,-0.99026806874157 -0.139173100960066,-0.984807753012208 -0.17364817766693,-0.978147600733806 -0.20791169081776,-0.970295726275996 -0.241921895599668,-0.961261695938319 -0.275637355816999,-0.951056516295154 -0.309016994374947,-0.939692620785908 -0.342020143325669,-0.927183854566787 -0.374606593415912,-0.913545457642601 -0.4067366430758,-0.898794046299167 -0.438371146789077,-0.882947592858927 -0.469471562785891,-0.866025403784439 -0.5,-0.848048096156426 -0.529919264233205,-0.829037572555042 -0.559192903470747,-0.809016994374948 -0.587785252292473,-0.788010753606722 -0.615661475325658,-0.766044443118978 -0.642787609686539,-0.743144825477394 -0.669130606358858,-0.719339800338651 -0.694658370458997,-0.694658370458997 -0.719339800338651,-0.669130606358858 -0.743144825477394,-0.642787609686539 -0.766044443118978,-0.615661475325658 -0.788010753606722,-0.587785252292473 -0.809016994374947,-0.559192903470747 -0.829037572555042,-0.529919264233205 -0.848048096156426,-0.5 -0.866025403784438,-0.469471562785891 -0.882947592858927,-0.438371146789078 -0.898794046299167,-0.4067366430758 -0.913545457642601,-0.374606593415912 -0.927183854566787,-0.342020143325669 -0.939692620785908,-0.309016994374948 -0.951056516295154,-0.275637355816999 -0.961261695938319,-0.241921895599668 -0.970295726275996,-0.20791169081776 -0.978147600733806,-0.17364817766693 -0.984807753012208,-0.139173100960066 -0.99026806874157,-0.104528463267653 -0.994521895368273,-0.069756473744126 -0.997564050259824,-0.034899496702501 -0.999390827019096,-0.0 -1.0,0.034899496702501 -0.999390827019096,0.069756473744125 -0.997564050259824,0.104528463267653 -0.994521895368273,0.139173100960065 -0.99026806874157,0.17364817766693 -0.984807753012208,0.207911690817759 -0.978147600733806,0.241921895599667 -0.970295726275997,0.275637355816999 -0.961261695938319,0.309016994374947 -0.951056516295154,0.342020143325669 -0.939692620785908,0.374606593415912 -0.927183854566787,0.4067366430758 -0.913545457642601,0.438371146789077 -0.898794046299167,0.46947156278589 -0.882947592858927,0.5 -0.866025403784439,0.529919264233205 -0.848048096156426,0.559192903470747 -0.829037572555042,0.587785252292473 -0.809016994374948,0.615661475325659 -0.788010753606722,0.642787609686539 -0.766044443118978,0.669130606358858 -0.743144825477395,0.694658370458997 -0.719339800338651,0.719339800338651 -0.694658370458998,0.743144825477394 -0.669130606358858,0.766044443118978 -0.64278760968654,0.788010753606722 -0.615661475325658,0.809016994374947 -0.587785252292473,0.829037572555042 -0.559192903470747,0.848048096156426 -0.529919264233205,0.866025403784438 -0.5,0.882947592858927 -0.469471562785891,0.898794046299167 -0.438371146789078,0.913545457642601 -0.4067366430758,0.927183854566787 -0.374606593415912,0.939692620785908 -0.342020143325669,0.951056516295154 -0.309016994374948,0.961261695938319 -0.275637355816999,0.970295726275996 -0.241921895599668,0.978147600733806 -0.20791169081776,0.984807753012208 -0.17364817766693,0.99026806874157 -0.139173100960066,0.994521895368273 -0.104528463267653,0.997564050259824 -0.069756473744126,0.999390827019096 -0.034899496702501,1.0 -0.0,1.0 -0.0)","PEN(w:1px,c:#000003,id:""mapinfo-pen-2,ogr-pen-0"")" "LINESTRING (1 0,0.999390827019096 0.034899496702501,0.997564050259824 0.069756473744125,0.994521895368273 0.104528463267653,0.99026806874157 0.139173100960065,0.984807753012208 0.17364817766693,0.978147600733806 0.207911690817759,0.970295726275996 0.241921895599668,0.961261695938319 0.275637355816999,0.951056516295154 0.309016994374947,0.939692620785908 0.342020143325669,0.927183854566787 0.374606593415912,0.913545457642601 0.4067366430758,0.898794046299167 0.438371146789077,0.882947592858927 0.469471562785891,0.866025403784439 0.5,0.848048096156426 0.529919264233205,0.829037572555042 0.559192903470747,0.809016994374947 0.587785252292473,0.788010753606722 0.615661475325658,0.766044443118978 0.642787609686539,0.743144825477394 0.669130606358858,0.719339800338651 0.694658370458997,0.694658370458997 0.719339800338651,0.669130606358858 0.743144825477394,0.642787609686539 0.766044443118978,0.615661475325658 0.788010753606722,0.587785252292473 0.809016994374947,0.559192903470747 0.829037572555042,0.529919264233205 0.848048096156426,0.5 0.866025403784439,0.469471562785891 0.882947592858927,0.438371146789077 0.898794046299167,0.4067366430758 0.913545457642601,0.374606593415912 0.927183854566787,0.342020143325669 0.939692620785908,0.309016994374947 0.951056516295154,0.275637355816999 0.961261695938319,0.241921895599668 0.970295726275996,0.207911690817759 0.978147600733806,0.17364817766693 0.984807753012208,0.139173100960065 0.99026806874157,0.104528463267653 0.994521895368273,0.069756473744125 0.997564050259824,0.034899496702501 0.999390827019096,0.0 1.0,-0.034899496702501 0.999390827019096,-0.069756473744125 0.997564050259824,-0.104528463267654 0.994521895368273,-0.139173100960065 0.99026806874157,-0.17364817766693 0.984807753012208,-0.207911690817759 0.978147600733806,-0.241921895599668 0.970295726275996,-0.275637355816999 0.961261695938319,-0.309016994374947 0.951056516295154,-0.342020143325669 0.939692620785908,-0.374606593415912 0.927183854566787,-0.4067366430758 0.913545457642601,-0.438371146789078 0.898794046299167,-0.469471562785891 0.882947592858927,-0.5 0.866025403784439,-0.529919264233205 0.848048096156426,-0.559192903470747 0.829037572555042,-0.587785252292473 0.809016994374947,-0.615661475325658 0.788010753606722,-0.642787609686539 0.766044443118978,-0.669130606358858 0.743144825477394,-0.694658370458997 0.719339800338651,-0.719339800338651 0.694658370458997,-0.743144825477394 0.669130606358858,-0.766044443118978 0.642787609686539,-0.788010753606722 0.615661475325658,-0.809016994374947 0.587785252292473,-0.829037572555042 0.559192903470747,-0.848048096156426 0.529919264233205,-0.866025403784439 0.5,-0.882947592858927 0.469471562785891,-0.898794046299167 0.438371146789077,-0.913545457642601 0.4067366430758,-0.927183854566787 0.374606593415912,-0.939692620785908 0.342020143325669,-0.951056516295154 0.309016994374948,-0.961261695938319 0.275637355816999,-0.970295726275996 0.241921895599668,-0.978147600733806 0.207911690817759,-0.984807753012208 0.17364817766693,-0.99026806874157 0.139173100960065,-0.994521895368273 0.104528463267654,-0.997564050259824 0.069756473744126,-0.999390827019096 0.034899496702501,-1.0 0.0,-0.999390827019096 -0.034899496702501,-0.997564050259824 -0.069756473744125,-0.994521895368273 -0.104528463267653,-0.99026806874157 -0.139173100960066,-0.984807753012208 -0.17364817766693,-0.978147600733806 -0.20791169081776,-0.970295726275996 -0.241921895599668,-0.961261695938319 -0.275637355816999,-0.951056516295154 -0.309016994374947,-0.939692620785908 -0.342020143325669,-0.927183854566787 -0.374606593415912,-0.913545457642601 -0.4067366430758,-0.898794046299167 -0.438371146789077,-0.882947592858927 -0.469471562785891,-0.866025403784439 -0.5,-0.848048096156426 -0.529919264233205,-0.829037572555042 -0.559192903470747,-0.809016994374948 -0.587785252292473,-0.788010753606722 -0.615661475325658,-0.766044443118978 -0.642787609686539,-0.743144825477394 -0.669130606358858,-0.719339800338651 -0.694658370458997,-0.694658370458997 -0.719339800338651,-0.669130606358858 -0.743144825477394,-0.642787609686539 -0.766044443118978,-0.615661475325658 -0.788010753606722,-0.587785252292473 -0.809016994374947,-0.559192903470747 -0.829037572555042,-0.529919264233205 -0.848048096156426,-0.5 -0.866025403784438,-0.469471562785891 -0.882947592858927,-0.438371146789078 -0.898794046299167,-0.4067366430758 -0.913545457642601,-0.374606593415912 -0.927183854566787,-0.342020143325669 -0.939692620785908,-0.309016994374948 -0.951056516295154,-0.275637355816999 -0.961261695938319,-0.241921895599668 -0.970295726275996,-0.20791169081776 -0.978147600733806,-0.17364817766693 -0.984807753012208,-0.139173100960066 -0.99026806874157,-0.104528463267653 -0.994521895368273,-0.069756473744126 -0.997564050259824,-0.034899496702501 -0.999390827019096,-0.0 -1.0,0.034899496702501 -0.999390827019096,0.069756473744125 -0.997564050259824,0.104528463267653 -0.994521895368273,0.139173100960065 -0.99026806874157,0.17364817766693 -0.984807753012208,0.207911690817759 -0.978147600733806,0.241921895599667 -0.970295726275997,0.275637355816999 -0.961261695938319,0.309016994374947 -0.951056516295154,0.342020143325669 -0.939692620785908,0.374606593415912 -0.927183854566787,0.4067366430758 -0.913545457642601,0.438371146789077 -0.898794046299167,0.46947156278589 -0.882947592858927,0.5 -0.866025403784439,0.529919264233205 -0.848048096156426,0.559192903470747 -0.829037572555042,0.587785252292473 -0.809016994374948,0.615661475325659 -0.788010753606722,0.642787609686539 -0.766044443118978,0.669130606358858 -0.743144825477395,0.694658370458997 -0.719339800338651,0.719339800338651 -0.694658370458998,0.743144825477394 -0.669130606358858,0.766044443118978 -0.64278760968654,0.788010753606722 -0.615661475325658,0.809016994374947 -0.587785252292473,0.829037572555042 -0.559192903470747,0.848048096156426 -0.529919264233205,0.866025403784438 -0.5,0.882947592858927 -0.469471562785891,0.898794046299167 -0.438371146789078,0.913545457642601 -0.4067366430758,0.927183854566787 -0.374606593415912,0.939692620785908 -0.342020143325669,0.951056516295154 -0.309016994374948,0.961261695938319 -0.275637355816999,0.970295726275996 -0.241921895599668,0.978147600733806 -0.20791169081776,0.984807753012208 -0.17364817766693,0.99026806874157 -0.139173100960066,0.994521895368273 -0.104528463267653,0.997564050259824 -0.069756473744126,0.999390827019096 -0.034899496702501,1.0 -0.0,1.0 -0.0)","PEN(w:1px,c:#000000,id:""mapinfo-pen-2,ogr-pen-0"")" "POINT (1.0 1.0)","LABEL(t:""text"",a:30.000000,s:1.380000g,c:#00ffff,b:#00ffff,bo:1,p:2,f:""bla"")" "MULTIPOINT (0 1,2 3)","SYMBOL(a:0,c:#000000,s:12pt,id:""mapinfo-sym-35,ogr-sym-10"")" "POLYGON ((0 1,1 1,1 0,0 1))","BRUSH(fc:#000000,bc:#ffffff,id:""mapinfo-brush-1,ogr-brush-1"");PEN(w:1px,c:#000000,id:""mapinfo-pen-2,ogr-pen-0"")" "GEOMETRYCOLLECTION (POLYGON ((0 1,1 1,1 0,0 1)),LINESTRING (0 1,2 3),MULTIPOINT (0 1,2 3))","SYMBOL(a:0,c:#000000,s:12pt,id:""mapinfo-sym-35,ogr-sym-10"")" gdalautotest-3.0.4/ogr/data/poly_inconsistent_case.gpkg.sql0000644003401500001440000000454113614004466023566 0ustar rouaultusers-- SQL GPKG CREATE TABLE gpkg_spatial_ref_sys (srs_name,srs_id,organization,organization_coordsys_id,definition,description); INSERT INTO gpkg_spatial_ref_sys VALUES('OSGB 1936 / British National Grid',4327,'NONE',4327,'PROJCS["OSGB 1936 / British National Grid",GEOGCS["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]]',NULL); CREATE TABLE gpkg_contents (table_name,data_type,identifier,description,last_change,min_x,min_y,max_x,max_y,srs_id); INSERT INTO gpkg_contents VALUES('poly','features','poly','','',478316.0,4762880.0,481645.0,4765610.0,4327); CREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count); INSERT INTO gpkg_ogr_contents VALUES('poly',1); CREATE TABLE gpkg_geometry_columns (table_name,column_name,geometry_type_name,srs_id,z,m); INSERT INTO gpkg_geometry_columns VALUES('poly','geom','POLYGON',4327,0,0); CREATE TABLE POLY (fid INTEGER PRIMARY KEY, GEOM POLYGON); INSERT INTO POLY VALUES(1,X'47500003E7100000000000007C461D41000000C016521D41000000202E2D5241000000A0EA2D524101030000000100000014000000000000602F491D41000000207F2D5241000000C028471D41000000E0922D5241000000007C461D4100000060AE2D524100000080C9471D4100000020B62D5241000000209C4C1D41000000E0D82D5241000000608D4C1D41000000A0DD2D5241000000207F4E1D41000000A0EA2D524100000020294F1D4100000080CA2D524100000000B4511D41000000E0552D5241000000C016521D4100000080452D5241000000E0174E1D41000000202E2D524100000020414D1D41000000E04C2D5241000000E04B4D1D41000000605E2D524100000040634D1D41000000E0742D5241000000A0EF4C1D41000000E08D2D5241000000E04E4C1D41000000E0A12D5241000000E0B04B1D4100000060B82D524100000080974A1D4100000080AE2D524100000080CF491D4100000080952D5241000000602F491D41000000207F2D5241'); CREATE TABLE gpkg_extensions (table_name,column_name,extension_name,definition,scope); INSERT INTO gpkg_extensions VALUES('poly','geom','gpkg_rtree_index','GeoPackage 1.0 Specification Annex L','write-only'); CREATE VIRTUAL TABLE rtree_poly_geom USING rtree(id, minx, maxx, miny, maxy); INSERT INTO rtree_poly_geom SELECT fid, ST_MinX(geom), ST_MaxX(geom), ST_MinY(geom), ST_MaxY(geom) FROM poly; gdalautotest-3.0.4/ogr/data/wfs10.xml0000644003401500001440000000305013614005362017010 0ustar rouaultusers 558750.703125 4402882.05,558750.703125 4402882.05 558750.703125 4402882.05,558750.703125 4402882.05 558750.703125 4402882.05 1 13555 2 CFF99 gdalautotest-3.0.4/ogr/data/csv_with_utf8_bom.csv0000644003401500001440000000021513614004466021500 0ustar rouaultusersid,name,WKT 426,Colac Bay/Ōraka,LOC,POINT (1205949.55535 4853065.413164) 427,Colac Bay/Ōraka,BAY,POINT (1208242.531016 4852284.8976) gdalautotest-3.0.4/ogr/data/test_xsi_nil_gfs.gml0000644003401500001440000000077413614004466021410 0ustar rouaultusers 1 gdalautotest-3.0.4/ogr/data/huge_attribute_end.gml0000644003401500001440000000011413614004466021672 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/wfs20.xsd0000644003401500001440000003352513614005362017021 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/bigoffset.dbf0000644003401500001440000000011513614004466017756 0ustar rouaultusers_A WFIDN 0gdalautotest-3.0.4/ogr/data/gmlattributes.gml0000644003401500001440000000104313614004466020721 0ustar rouaultusers foo gdalautotest-3.0.4/ogr/data/test.htf0000644003401500001440000000645513614004466017030 0ustar rouaultusersHTF HEADER HTF VERSION: 2.02 COPYRIGHT INFORMATION: public domain DATA USAGE RESTRICTIONS: None CLASSIFICATION OF DATA: UNCLASSIFIED DATA CUSTODIAN: foo HTF CREATION ROUTINE - NAME & VERSION: foo LOGGING SYSTEM - NAME & VERSION: foo PROCESSING SYSTEM - NAME & VERSION: foo DATE OF HTF FILE CREATION: 20101003 HTF SOUNDING DATA VOLUME NUMBER: 1 TOTAL HTF VOLUMES FOR THIS SURVEY: 1 SURVEY IDENTIFICATION: foo REPORT OF SURVEY DATE: 20101003 GENERAL LOCALITY: Somewhere SURVEY TITLE: Somewhere SURVEY PLATFORM: foo SURVEYOR: Me UTC START DATE: 20101003 UTC END DATE: 20101003 GEODETIC DATUM: WGS84 COORDINATE SYSTEM: GEOGRAPHIC SW LATITUDE: -22 SW LONGITUDE: 150 NE LATITUDE: -20 NE LONGITUDE: 152 GRID REFERENCE SYSTEM: UTM GRID ZONE: 56 CENTRAL MERIDIAN: 153 SW GRID COORDINATE - EASTING: 278500.000 SW GRID COORDINATE - NORTHING: 7596000.000 NE GRID COORDINATE - EASTING: 350700.000 NE GRID COORDINATE - NORTHING: 7678100.000 NUMBER OF POSITIONING SYSTEMS (PS): 1 PS 01: * PS 01 MODE: ps01mode SOUNDING DATUM: LAT TOTAL SOUNDINGS: 2 TOTAL VALID SOUNDINGS: 1 NUMBER OF DEPTH SOUNDERS (DS): 1 DS 01: LADS DS 01 MODE: * NUMBER OF TIDAL STATIONS (TS): 1 TS 01: * TS 01 LOCATION: * TS 01 METHOD: ts01method SCALE: 50000 DATA DENSITY: foo END OF HTF HEADER POLYGON HEADER=header POLYGON DESCRIPTION=description POLYGON IDENTIFIER=identifier SEAFLOOR COVERAGE=seafloor coverage POSITION ACCURACY=position accuracy DEPTH ACCURACY=depth accuracy LATITUDE=latitude LONGITUDE=longitude EASTING=easting NORTHING=northing END OF POLYGON HEADER POLYGON DATA POLYGON DESCRIPTION: description POLYGON IDENTIFIER: 001 SEAFLOOR COVERAGE: * POSITION ACCURACY: * DEPTH ACCURACY: * -20.98 151.27 320830 7678810 -21.17 151.56 350840 7658030 -21.73 151.14 308130 7595560 -21.53 150.85 278310 7616820 -20.98 151.27 320830 7678810 POLYGON DESCRIPTION: description POLYGON IDENTIFIER: 002 SEAFLOOR COVERAGE: * POSITION ACCURACY: * DEPTH ACCURACY: * -20.98 151.27 320830 7678810 -21.17 151.56 350840 7658030 -21.73 151.14 308130 7595560 -21.53 150.85 278310 7616820 -20.98 151.27 320830 7678810 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 -20.98 151.27 320830 7678810 END OF POLYGON DATA SOUNDING HEADER = sounding header FIELD POPULATION KEY = fpk [01] REJECTED SOUNDING = REJECTED SOUNDING. [02] LINE NAME = LINE NAME. [03] FIX NUMBER = FIX NUMBER. [04] UTC DATE = UTC DATE. [05] UTC TIME = UTC TIME. [06] LATITUDE = LATITUDE. [07] LONGITUDE = LONGITUDE. [08] EASTING = EASTING. [09] NORTHING = NORTHING. [10] DEPTH = DEPTH. [11] POSITIONING SENSOR = POSITIONING SENSOR. [12] DEPTH SENSOR = DEPTH SENSOR. [13] TPE POSITION = TPE POSITION. [14] TPE DEPTH = TPE DEPTH. [15] NBA FLAG = NBA FLAG. [16] TIDE = TIDE. [17] DEEP WATER CORRECTION =DEEP WATER CORRECTION. [18] VERTICAL BIAS CORRECTION =VERTICAL BIAS CORRECTION. [19] SOUND VELOCITY = SOUND VELOCITY. [20] PLOTTED SOUNDING = PLOTTED SOUNDING. [21] OTHER1 = other1. [22] OTHER2 = other2. [23] OTHER3 = other3. END OF SOUNDING HEADER SOUNDING DATA [11111111111111110101101] 0 linename1 1 20101003 123456.00 -21.54 150.86 278670 7616330 123 1 1 15.00 0.50 1 2.14 0.00 1 other1 other3 1 linename2 2 20101003 123456.00 -21.54 150.86 278670 7616330 123 1 1 15.00 0.50 1 2.14 0.00 1 other1 other3 END OF SOUNDING DATA gdalautotest-3.0.4/ogr/data/gjpoint.shx0000644003401500001440000000015413614004466017532 0ustar rouaultusers' 6Y@Y@2 gdalautotest-3.0.4/ogr/data/inspire_basicpropertyunit.xml0000644003401500001440000000435413614005362023377 0ustar rouaultusers 49 2 50 3 BasicPropertyUnit-01-localId namespace nationalCadastralReference 10 2000-01-01T00:00:00.0Z 2001-01-01T00:00:00.0Z 2002-01-01T00:00:00.0Z 2003-01-01T00:00:00.0Z BasicPropertyUnit-02-localId namespace nationalCadastralReference 2000-01-01T00:00:00.0Z 2002-01-01T00:00:00.0Z gdalautotest-3.0.4/ogr/data/ticket_2349_test_1.gml0000644003401500001440000000221713614004466021262 0ustar rouaultusers My Polyline Rectangle 101 -45,+60 +45,+60 +45,-60, -45,-60 My Point 201 -40,+55 gdalautotest-3.0.4/ogr/data/ogr_gml_55_included2.xsd0000644003401500001440000000075613614005363021751 0ustar rouaultusers gdalautotest-3.0.4/ogr/data/weird_winding_order_fgdb.zip0000644003401500001440000007157413614004466023104 0ustar rouaultusersPKLrNzQ+X)roads_clip Drawing.gdb/a00000001.freelistס 0/ x1B*: PKLrN˖Pn+roads_clip Drawing.gdb/a00000001.gdbindexescb```b7xO 3I& qC"CCC*C1C% A10tpЬpW  M PKLrNڀCN)roads_clip Drawing.gdb/a00000001.gdbtablemM 0A=G-KRl]6^+x\ԙh]xd7@ ߚΦ7 upa@jm$(>h8!&q?'<7Y.%Ϲ xrFm\rCFKkp%T"KgqECp>eGi;GM!EP%c։Smz|E,mPKLrNܞ{A )roads_clip Drawing.gdb/a00000001.gdbtablxA D`[v0Lao%`iƪzsomړ#9+'Y_woPKLrNBd1roads_clip Drawing.gdb/a00000001.TablesByName.atx]0 VlP|6)hHL,P ׌^+zN/5};l3 IpB^!ƅG '}kвc՘WszU0YV̶ Q%=Lb=4X!'%ck{bH$D"e }z7PKLrNZ< )roads_clip Drawing.gdb/a00000002.gdbtableUn05BRѡѩTIti2%4%x'^Gx NJQ{νk6y)>X-Kc6;٣epH(/hQ!BUV])e9:R[ѥ/| b{q!: ɓ7o0Qt俄yXz:f0[ة!3KmefYWc8 ~b5'Q޽ aNꚡl tsOekoPK[=~}ƊJsAe i\R̈hr'U,\"u\N.*cdHj,;E bݿ.TaPUG5y$BV`Fi|_UPLjޯ˞\ ǿA)XfЅ)OțB LXG܈D2z|(J\O PKLrN¢ )roads_clip Drawing.gdb/a00000002.gdbtablxͽ PFObim-:.a #.vb'Ik#w ؟|poRb `mk0+_(+|` P (XBgh,F?PKLrN)!*+roads_clip Drawing.gdb/a00000003.gdbindexescd```b7xO 3I& PKLrN$)roads_clip Drawing.gdb/a00000003.gdbtableo@_6T_ Ԋcő@YGzM"Gr HL0 2 "$$1P/޽}|w{@,<^[7 rWP۬!vqD`j00ܟ+vqևQ/S2C )3WC" C>n˛O#pliC| bhihaD"[V$,lj.Ѫ+zSQTbw;8cdt R]l:䦦ah*~ʫsY9 ,Llٝa"۬g`nȟ]ޑ./ PKLrNW%3roads_clip Drawing.gdb/a00000004.CatItemsByType.atxػC!`{yn$(pK߽6;_Dž+8ݽmsqFL%TڳTF^SyWyNj 1!CISBf=F"#ݕv/Tx9<ǀCj N)Jˍ_m1c1=^PKLrN,-roads_clip Drawing.gdb/a00000004.FDO_UUID.atx׽ 1Y Qcc~./uܻ7mۺ~ Bq[q]q9oV DŽTeeChEꖎ=QB )5P Hbf+F.pV3hAf㊸vMNZ5$B4 ё>s9s=OPKLrN GX!)roads_clip Drawing.gdb/a00000004.freelistױ @XK>}QI`$G\!vPKLrNӰ 6+roads_clip Drawing.gdb/a00000004.gdbindexesu @F`d!tcvAB7>}[.gYfNd8q On\8*&Ok([.SR|l7:Ysԛ#k ;zRF*16xb˨Ciɵv?OPKLrN^ *)roads_clip Drawing.gdb/a00000004.gdbtableY]Wi&qSZh(Bb5UE]G'uזO7+k־'gܙY ODxR$TB!H !/*xUUQ[E˹wf!xD?|z -\DGh]E5(н{Bh*=:F}@ PB ϱ @2 ! LP< `x&X`}:[c~L4Bh2 WQ-0&|5xCСsȸTڤW}E J" W^1A>bu#A{ h@z:T$0w ( _C@o/1a:_WZ%3oBF<@o}aA>W7oz&tc_8 4yj҃S,H?o|g>~753}ޣ5SF_jJ&G!Ԡ|놬'XTfZ9ɭ֗fS鰘qc8uM緶hSF{gfXcB4쫳jz BTZњjnkԬe \:<3#f%SRNE2+"-üJKj~Зnےb`:t&,,kMIAj#}u]s :8$(-mZ9 zP8JHFץrtU/X3 y_d f-< ,Gd Yƹo 7^)>iϽ|BWº&FSj95}W\1NX’cwtΘ.3ٝv\V=1W+ȴORߞn/L WBU9k}ɔ%&[UBX^WaVVt!kۆ{Kӕj\r\o gFrUfk "L}rr6_-sԢE BTSxr!DŽzR-Pcn.zduXFqT[K&x2J%j\>[/Wָ.YQzS̈́D)Dl%ÄEF0+nv)(&,XK Hnɒ XS7]J}erQlHށøIq[,]d,.mlbTw٧tZÂvR;݊2idV_1ɞ|pڑo̒Mə$}oOrGся\?x\ZέܵܨhvGSmQ)/_.Wj WuH*_Z=1Ɔ?dtC ES ~_RCY[ꜽNO'o&і;D.l|Z<+y9+*oIJ|n;9B i_v!)`HްTTMȻzhl*G .cm[d֋QdYJĒŠOJD7wYS R,aL*,Fs ]`ŤR1 X! *& Tt'ؘBDNۄY"\Әl=ݷ'RR&6)7T񓛲([nXp莅ɡlL&d".bX,'̞ggaQH.-d󋟃:}Ɉz]OOn/ bZ̎gv# ||J4TchojM!*{ԽHUaEDƭJъo|scNIWU3rAsci:p]sē"]3)ൈ \#w 0x_G ̷HO<r_Gi ܷF7;Y D$a ~Bh/dElAi Bi s4p)pca F=JHM&s a:)r*uB!5)@ 3\C_ a{S ޫ;@]1PLI3xd .@N5 CC-l.t3e_,堻W1?PKLrNn$2 )roads_clip Drawing.gdb/a00000004.gdbtablx 0o @L࣎k 2jHg=[{ϕ?i_ PKLrN0#$roads_clip Drawing.gdb/a00000004.spxȱ @1~, cd(urPKLrNaw(707roads_clip Drawing.gdb/a00000005.CatItemTypesByName.atxYN@{տ@(Dvhç2(`=^hruF횈(@4\"QB g=RG(`0 `0 >@c2m@Sj BI?*hh+Ba>HCwBp|->%vǸ&&+I-q'"ձ6"؄Wv)x`7<,3&igڒzfS8R55:K9{w.]eoG\f_V@"Yj_ǚ6W2Ҫp <@EӞ#?I}2 q;I 푫 A:CL~AQޜ&%`]8q{K_ qI5<8H~X%-UKpՐ M.${WQ[=1ɲ,CeJ}Y J/u!g4i&ά#U~ﻚhV4 -ȑWPKLrNA?roads_clip Drawing.gdb/a00000005.CatItemTypesByParentTypeID.atxj0awy ,TȻIwnJA?|ƈ2 :,[-؆؅=؇8#8838 ;x'xu؀a+͡hfV3'5&TPI ĭb}W]ph<%o8rcIR4N}6cu$*Eͅ\K*,%̙lĉLUd <[O\n:Mņ_TI ixs)X(4c+wo^z_dqPKLrN`37roads_clip Drawing.gdb/a00000005.CatItemTypesByUUID.atxW37 K}ԛ[e(Kyr{e`Iz x |||| ||| || '>/6`#YZ6IJ8bN2fSsk4O2h[9357f=يAaEx={ҽ |n,'3ʕ'^=(YӝJ( XzWHuX)M.IM:z`FIe>ۚ׆隂T>Kt:Cīg)PMzh(zz=3Izp34Q}fǍ:fS+efӵ1ErVl$I?dkK98@uMg)%p2^=i8LF?gHACн}dqG>|@Apѽ BUU7"]=+X U"W+l j UV3!ӄ˺읯DM[q+X\2aؘ@Gee܊jLUAJy\Ն Gq^,C^ip嚓vs(qP "EwZڳN=H|X|"70bZ*}K榩ao{ҮȃX7mbm"[61M !_ՠB~6*jA(i-xܪKmRn-b9t–5ΓD;lش3/v-!Aփr-ٵb);t.pd (}a==Z.߷뮻뮻/PKLrNݦr(+roads_clip Drawing.gdb/a00000005.gdbindexesca``b7x NbbHeHf(a10@1兀ؙ!/20T2Y N@V(BT21$ FK0!(Wea2&[!7rs8 HH9 nI5zO_nf~B!Լpɀ(L_UWy{&C촭%S/ -'"2.(ˮ{ȮkwS'bļt`NBN۬Goa42_krOIMQK)iPKLrN"B| )roads_clip Drawing.gdb/a00000005.gdbtablx͡ `E῔b@baa (; QH T"x'a9/O)e*V.Jn[8@=|`37a:p;8ްy GE 쿲 PKLrN)j;roads_clip Drawing.gdb/a00000006.CatRelsByDestinationID.atx10 DQaiƒ*e_*3@}^";}. qH%%l.g61[{XyT񲸇+nc4ծm ~'PKLrNm6roads_clip Drawing.gdb/a00000006.CatRelsByOriginID.atx;1 Pa,c''ZQ@Ԕ̓FSmN^,`up^wRk8:C،EaO΢%j-?YPKLrNm2roads_clip Drawing.gdb/a00000006.CatRelsByType.atx;1 P/R>&K))'t!"˭V?XH箩Qx*qshfsRm(!a>S-_kPKLrNS9Wj-roads_clip Drawing.gdb/a00000006.FDO_UUID.atx!0 DQ ӌ#٩mKT&wϴ%a݇>[DDXn q-l*g"tE¶rE"<3%PKLrN>+roads_clip Drawing.gdb/a00000006.gdbindexesm] AFؔ+%$uׯ3&vg3>4}`( rVdυ#^,`,Uqͤ][gT\=)tMR2əZj>MKW|{"q X%6MPKLrNd%T)roads_clip Drawing.gdb/a00000006.gdbtablecf```i@ʀ!Zɳ@qv$,TdO6&PP[ !! \j,l.@-0-@J )kKb(@jxX`uE@L# +ý޻mzwFKMG**'K߼Pdy,^&5 xcŝ'&kw8ȷ`7+U[L9L5Kroads_clip Drawing.gdb/a00000007.CatRelTypesByForwardLabel.atx[@E:>׸EC ȈDp7.uN'LUMT? 4@uTE}F=@U6roads_clip Drawing.gdb/a00000007.CatRelTypesByName.atxKN@D+ Q@ ‰8q &pJiRϸ,KXul­zn=!܅#O <NJDZJ3~/ԔjordRvPߕuC¹5ʫ+|m s=3Œ~"V_g{^?> g~v0TL)u~/}N%ڻ լgmS9%k%c\s:cA17,y~?w7Nϝ34-fh{[~[׷g^ 5%:]!Qv*"ԗb!"FM/PKLrNBPVBroads_clip Drawing.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxIn0 @ݴI:d:Ev$"@]߽t}"Bx!?ፏ8ގ܇k~G3| ?ޅߎgpAUX,bvǞK.zc>9 81ATe>MJj1rDÛW4[+A0jyƂ)*>;0G`CM )qwPgYp2Fir)ʞ4*ռNhdxEoi:zmUL1R BЛ'kTTwbQiDgV^Vl,(2d,0lz_fl6fyqr^PKLrNڔ6roads_clip Drawing.gdb/a00000007.CatRelTypesByUUID.atx+ ')1h=5&?$fӷWg5z}>Aoy}B_o{I.!>mw UG"q籋y&͕d':1ǽi-FMqnL;Ik؋}1[1;I|"?zm\%3*iV>Y{7cL Z/o\ZQ&CKPKLrN=I)roads_clip Drawing.gdb/a00000007.gdbtable Lg (E>:d Qg[ hl,^IwC l%F@#f č7E66bPkl4i{yz {7XyoVNZ`A r/:Q6d;Q"5@m(. GcO_=@m -B4 6"z?)B(SGMvgޫqcP}?鳞N> JY ΄|J:V5&L,0>@Ku. C/G:829yd\XVgBsҺ76U*Y"'L,N -B)M<XeH"ާ0ʼn76%Z۾|'t[n8%,,8[@-v0w[:]N#JWu\b;NR v1Iriޘuw3ds+D5GMȩ|TJi`vǪ,tЙaʎG/"?v(dF%tY4U`QӤWÒ&%)8aU0R2H=yDeM֌6û16"$  e vw8%#ǶX+]&D_G`ZF9HV #ѕfƾ#՝喏^q[*,L2B[EZ¨5k)&THـ.{gx5K֗ueB=~xZ{7Vr_3q S[^R Ov-@ uӢᙄ&ٰ_jژ{.*@BNڒ.qp/|UFj\yP?vTz+(|lO/ *h$.qxߊYC<#ME^IJV}prLHOZ.a6~(= /PKLrN-YW )roads_clip Drawing.gdb/a00000007.gdbtablx; @D]_I4c;PLNIAqO27yK!uZ>VvB91)3dN˙q6^PKLrN^T+roads_clip Drawing.gdb/a00000009.gdbindexese@@E"P&h$߯";!QtT r v"ynٰ2~u=޷- wnǟPKLrN#%)roads_clip Drawing.gdb/a00000009.gdbtablewX[ٺvR2uLL:-Si;m3!HKB  N$8 rs=޻Wv]{6B&G_ηA?BP_QPPO(`Q(3kKJ 2E]BGB]ECEF@*P-'ŘWP}z(#Eb9_ 5u<uiދsLv)PQ;pQ{P] vEjBvEOѶ{!RBQ$#|lMi,"3EzlAU(z{ h:iVA’G5(TI쌚V~P _Lp40fpsB)kQ_|TpxV!:)D{w"Q^Xfo?0|j B 9A4VKWO8$^40[/K9u4L )s*0P\d:sovJHKSOGݍ03*~*핷s^xRjIp%GqB h Rk2%.͌`.6n –ՙg(r=Fk%ychVN>Wm`CI͆ܗVg|5~,UHN*Wae'5ʝ=@gВyT$i{WV}VõkrC9 X"0$n^^`rBƧvxeBHy[0=-v06ǾX]sH 3٧,:9*j1q){cC9I.?3+zmr#_?d~.6L &Ng5nb)_MY"Y;N)V P悰g N/ g\-4;Wėޕ. 4i){\/ 9l XWM (J~;S~[L&Rc~uQ >٧J#Q*g3+n)ژQDL ab(]Y88DODIԓ/ UOFj<@Pl)GOu蓬X7/Doݜ[plv"V4Ky9U{a.ZgدzsFexՒѵQ,ScuoTMP=4x;L_B|缱D,t^,_Qx>A5bɡ/J1l/K~s_6z m쎈:]Pa91w!AlpBG2]'GioYjYSI&C@ҨIE!Z"7K:^H+гKķNOK=b#Q- ӘOBf$! c{g6̥|d\}P$DzBkòK%,hCƨ-/tNϸ3[jVHDS72@ |O0<7,*T[DEɛtkusc֡PQ%ζzN'Z9";%Cm 8Àp&lh8U2]6^7Fi@BDo]thD{%'`w-/^86Ðe{(az%s<A[KͩԵF`?x|U~ؤAzSEne4} H9 Y? K*(Sw$[0WgfEvFэ@w͘)I*2ᥔ0jWI3]9)äqlҌuSǪ#1XqCJeߨ )jĶܞ|8xok,SqJC%Q֣m*.cʮ[ )=X,AqPÈ9h7A7R?_eAfgtc"&3 ^9vW)y:(qvlb۶ô/)-&_vKyķNGCo㛰_v}XCS &@/Eѻ,y揮wS۱z-fRXWfB)f'c,2vD4;-ǐ qzZ"zgS⭚12G"ukn +|ERA)Hjo&<)ZY xn1p8=wf֘])T*-τGv|enm2AJvp1i&~Y7lWOm!3z<sg ? d2 !jiLr1nЯy |ׄ9/Rg7ܣɏ.3n4x;#m E%xo#cCYMo0}. Be0A{lKBɪlp(m銴M7d-LCAɨʔhG램yG3V}㻿f .!LF>-zT)~I5D@*  da^];,Zj]eg{+Y;ViZ<@ဃY?oK$) u¥h]Q-6Sd VQ?L:__,G8l[cWFF6*A" W- B]zB~N8+P'e^Q24$`%[TvXpo- ӟ{%smcq^ ,po8{كXxqNNqkGFql.ܶ抐~#x넨{%H"~th;:J;#8(se 磼<%_, ˰A $7[ cJCB*WvrSr N1ъ~ks2~eD =V!#@x 8WDqZjͳd̛A;/3t@jܵ,@ݸ$w)x;={r_Q(:B}$Z .%AL6o1/2YuܡBuO4xayFI^IgLe*iPGB7vû+aLg;/[ЄOL92bgcԍxSlhQACt"5Qv:'oC y30dm(=T,X '5KMGk #7I)h}apԠПW\)#$ٸfȩdׯ/bb7\kB:ӟn$:&+s8gueoM!UPV>6HVΎ8e'arAh%Z)y^6YE|ˎDv{nqVɁ큵#äv >&&q94U$bTk1dMŸ׀w^(VK<0t8k%%WnH͸EB ׃^#{ BE@F,snKY4l(ص.oy46-t|Y 'j7):-8 f5n ,[o:yJ%t_\h2Ms1w '*ibhwQJ0$ُW2qfJ=R;PdV%[C6I~8YBCYxg}HabNKw Ǡ8qݎ%C.G#7;Y%{ywܯ4#g4JػQq5spKk~)@ DؗbO.yض r G~mMj::8b˽ @>OI5Eڄ1kT-mLKaqND /c* X|}ʰ;^co:bB޲o`3cAY_e> Y#зhǏf>_+Z!Mp;։tҠI>[ygL5ttdk8#>YrPq#"~L9-2l֋Lhv9#^l UZlzȥrN 1`PT@Ut?ؾZ\M]8:ܠIs1L6\ntO4p7jÔrvi%a0-V4s% J l6;?E|PmҢ{OkͼTyvn -wŒ,Mn֊!?5~Vnһj`Ჟ1f3j:}#Co yO+L bJD:dL?'ٷiOE;G~>xhåٻSWYT^3-y8{\ :?=q)ȹ 6fΖĴusᛦpU jG=%zYrK"V4#}:ЩYJkim?ܙeþDJR@ޖ ho'¹ce`> a2Х1jӑ)ϫyP7M΁i #k wfp/ipML F\ԫ6Ɔ}8keh-eEwmV8D䏝|7aAF:m $nM( m\ƀ*X,py[ʂI2o^&޹0b 0"Hi/(+R}DozpSE_ojEfagnJEθCl/S `hI}!ݫɨָ0$qJ]>:MV=$0cO31Mlt4= 0qNshdOBȂB4 ?YqrNGIu$B\U#|ț^y+{!}5c#n}j#UkӠ&\h`)QU ݛy[(r7RP낓vKR%lK& 3tlGKkHcEA^Ipӳ7^%_ƐF@䑀ʂQ>ܿ2j/=qi_e3Š{ƉkUOʮ>2t:WW}S{Q줩i:s~l}mNP.[(+t;u{aO';}6f7ƕAc8=33օVn/=6xzFˉmq [OopPh.83)7d2 JA.֠ѕB労0za|u;|{K&B/ 亟c!lS0ugbm*%d~Wn"[nFC8uƣDĿnce T) JetW߉ŵ\mHJ+w5tZADbt({EV uSRRQi0p;cŸܰEvHH7 .tXI)4͌m{7 T!6V?/\M/}] a1uZ'7ϊҺ" Ho-68|&,V9Gѐ×,wuߩVCcwVYF7m䓦#w/1pu!mzq /mQCZ-G 0vT1}U\#?fYb$stпc06Y|L{g>81 UOռo5>Uz9ǃjX}Q8H[?)]D{?!)&1꾟Y- ̓++*׍ܨ?;xw۟+`MN5COkC"o%o8gn4$+V:Zu6W@c>Ql0qjCE~^9q(`H,z-yy@mF ަ]iLfqҳ֭Z ڔW~9I9~]bH_wVw, Y:b[_7}-onĩH2_ 0|%_l~M_zuE~P8vC``6,&|s[n~lμ|^ʁfyϚ Nվ?5qOv;gHps%0;>-h{rM]șb>ހպ uI Sʮ£7bDDx9Pa`W^:X,iRkfnm"חwO8TA}2L=~-Zʭ)/iϠ[?FfQiMJMHg¦`B c)g'6Z@碒Z(Z״27|j&sYjNjm^u4ywPpymb~ZA䥉AN>lme{`H0-zھ^mEt@Ǻz}־2S-arM߅,nmӱ$AgCd٦{zY]k+u*9QBߩMԕC[r0^Iw'y/Ηj;jV?p6|6d܇m'ZsГB{U"8/PKLrNZx& )roads_clip Drawing.gdb/a00000009.gdbtablx #ۓ۬ PKLrN$$.-roads_clip Drawing.gdb/a00000009.mfd_id_x.atxױ  U". .}IRkorzPKLrN0#$roads_clip Drawing.gdb/a00000009.spxȱ @1~, cd(urPKLrNKproads_clip Drawing.gdb/gdbޭPKLrN`v!roads_clip Drawing.gdb/timestamps6 H1p2@#? PKLrNzQ+X) roads_clip Drawing.gdb/a00000001.freelistPKLrN˖Pn+ rroads_clip Drawing.gdb/a00000001.gdbindexesPKLrNڀCN) roads_clip Drawing.gdb/a00000001.gdbtablePKLrNܞ{A ) %roads_clip Drawing.gdb/a00000001.gdbtablxPKLrNBd1 roads_clip Drawing.gdb/a00000001.TablesByName.atxPKLrNZ< ) roads_clip Drawing.gdb/a00000002.gdbtablePKLrN¢ ) roads_clip Drawing.gdb/a00000002.gdbtablxPKLrN)!*+ _roads_clip Drawing.gdb/a00000003.gdbindexesPKLrN$) roads_clip Drawing.gdb/a00000003.gdbtablePKLrNȾ) )  roads_clip Drawing.gdb/a00000003.gdbtablxPKLrN}f{l^; roads_clip Drawing.gdb/a00000004.CatItemsByPhysicalName.atxPKLrNW%3 = roads_clip Drawing.gdb/a00000004.CatItemsByType.atxPKLrN,- - roads_clip Drawing.gdb/a00000004.FDO_UUID.atxPKLrN GX!)  roads_clip Drawing.gdb/a00000004.freelistPKLrNӰ 6+ roads_clip Drawing.gdb/a00000004.gdbindexesPKLrN^ *) oroads_clip Drawing.gdb/a00000004.gdbtablePKLrNn$2 ) roads_clip Drawing.gdb/a00000004.gdbtablxPKLrN0#$ ,roads_clip Drawing.gdb/a00000004.spxPKLrNaw(707 roads_clip Drawing.gdb/a00000005.CatItemTypesByName.atxPKLrNA? roads_clip Drawing.gdb/a00000005.CatItemTypesByParentTypeID.atxPKLrN`37 kroads_clip Drawing.gdb/a00000005.CatItemTypesByUUID.atxPKLrNݦr(+ roads_clip Drawing.gdb/a00000005.gdbindexesPKLrN3 )) !roads_clip Drawing.gdb/a00000005.gdbtablePKLrN"B| ) &roads_clip Drawing.gdb/a00000005.gdbtablxPKLrN)j; &roads_clip Drawing.gdb/a00000006.CatRelsByDestinationID.atxPKLrNm6 'roads_clip Drawing.gdb/a00000006.CatRelsByOriginID.atxPKLrNm2 e(roads_clip Drawing.gdb/a00000006.CatRelsByType.atxPKLrNS9Wj- ")roads_clip Drawing.gdb/a00000006.FDO_UUID.atxPKLrN>+ )roads_clip Drawing.gdb/a00000006.gdbindexesPKLrNd%T) *roads_clip Drawing.gdb/a00000006.gdbtablePKLrN<<) ) +roads_clip Drawing.gdb/a00000006.gdbtablxPKLrNY;? ^,roads_clip Drawing.gdb/a00000007.CatRelTypesByBackwardLabel.atxPKLrNK@ -roads_clip Drawing.gdb/a00000007.CatRelTypesByDestItemTypeID.atxPKLrNO> j/roads_clip Drawing.gdb/a00000007.CatRelTypesByForwardLabel.atxPKLrNJ>6 0roads_clip Drawing.gdb/a00000007.CatRelTypesByName.atxPKLrNBPVB U2roads_clip Drawing.gdb/a00000007.CatRelTypesByOriginItemTypeID.atxPKLrNڔ6 4roads_clip Drawing.gdb/a00000007.CatRelTypesByUUID.atxPKLrNdZ+ 6roads_clip Drawing.gdb/a00000007.gdbindexesPKLrN=I) 7roads_clip Drawing.gdb/a00000007.gdbtablePKLrN-YW ) <roads_clip Drawing.gdb/a00000007.gdbtablxPKLrN^T+ <roads_clip Drawing.gdb/a00000009.gdbindexesPKLrN#%) @=roads_clip Drawing.gdb/a00000009.gdbtablePKLrNZx& ) `roads_clip Drawing.gdb/a00000009.gdbtablxPKLrN$$.- aroads_clip Drawing.gdb/a00000009.mfd_id_x.atxPKLrN0#$ aroads_clip Drawing.gdb/a00000009.spxPKLrNKp aroads_clip Drawing.gdb/gdbPKLrN`v! (broads_clip Drawing.gdb/timestampsPK//bgdalautotest-3.0.4/ogr/data/testpointm.shp0000644003401500001440000000021013614004466020247 0ustar rouaultusers' D?@?@@@?@@gdalautotest-3.0.4/ogr/data/geoconcept_multipolygon_singlepart_hole.txt0000644003401500001440000000063313614004466026306 0ustar rouaultusers//$DELIMITER "tab" //$QUOTED-TEXT "no" //$CHARSET ANSI //$UNIT Distance:m //$FORMAT 2 //$SYSCOORD {Type: 17};{TimeZone: 31} //$FIELDS Class=test;Subclass=test;Kind=4;Fields=Private#Identifier Private#Class Private#Subclass Private#Name Private#NbFields id Private#X Private#Y Private#Graphics -1 test test test 1 1 0.00 0.00 4 0.00 1.00 1.00 1.00 1.00 0.00 0.00 0.00 1 0.10 0.10 3 0.10 0.90 0.90 0.90 0.10 0.10 gdalautotest-3.0.4/ogr/data/CoHI_GCS12.dbf0000644003401500001440000000137213614004466017435 0ustar rouaultusersq !vWatlas_stcoCatlas_nameCatlas_capsCatlas_areaNatlas_acreNentityCcntyaCcntynN 15001Hawaii HAWAII 4028.43700 2578199.68000County 001 1 15003Honolulu HONOLULU 600.62600 384400.64000County 003 3 15007Kauai KAUAI 619.94100 396762.24000County 007 7 15009Maui MAUI 1173.51500 751049.60000County 009 9gdalautotest-3.0.4/ogr/data/polygons.vdc0000644003401500001440000000073213614004466017706 0ustar rouaultusersfile format : IDRISI Vector A.1 file title : id type : integer file type : binary object type : polygon ref. system : utm-31n ref. units : m unit dist. : 1 min. X : 400000 max. X : 600000 min. Y : 4000000 max. Y : 5000000 pos'n error : unknown resolution : unknown min. value : 1 max. value : 1 display min : 1 display max : 1 value units : value error : unknown flag value : none flag def'n : none legend cats : 0 gdalautotest-3.0.4/ogr/data/gjpoly.shp0000644003401500001440000000035413614004466017356 0ustar rouaultusers' vY@@Y@?@Y@@Y@?Y@Y@?@Y@?@Y@Y@gdalautotest-3.0.4/ogr/data/points.adc0000644003401500001440000000042413614004466017321 0ustar rouaultusersfile format : IDRISI Values A.1 file title : file type : ascii records : 2 fields : 4 field 0 : ID data type : integer field 1 : IntegerField data type : integer field 2 : RealField data type : real field 3 : StringField data type : string gdalautotest-3.0.4/ogr/data/empty.dbf0000644003401500001440000000020113614004466017140 0ustar rouaultusers_(AREAN EAS_IDN PRFEDEAC gdalautotest-3.0.4/ogr/data/wfsjointlayer.gml0000644003401500001440000000316213614004466020737 0ustar rouaultusers 1 2 foo 2 49 2 3 50 2 bar 2 50 gdalautotest-3.0.4/ogr/data/pointzm_with_one_valid_m.shx0000644003401500001440000000016413614004466023150 0ustar rouaultusers' : ?@@@@@2Hgdalautotest-3.0.4/ogr/ogr_rec.py0000755003401500001440000000406313614005363016420 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_rec.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR REC driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 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 gdaltest import pytest ############################################################################### def test_ogr_rec_1(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.rec') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 gdalautotest-3.0.4/ogr/ogr_ingres.py0000755003401500001440000002236013614005363017136 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_ingres.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR Ingres driver functionality. # 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 import ogrtest from osgeo import ogr import pytest ############################################################################### # Open INGRES test datasource. def test_ogr_ingres_1(): gdaltest.ingres_ds = None drv = ogr.GetDriverByName('Ingres') if drv is None: pytest.skip() gdaltest.ingres_ds = ogr.Open('@driver=ingres,dbname=test', update=1) if gdaltest.ingres_ds is None: pytest.skip() ############################################################################### # Create table from data/poly.shp def test_ogr_ingres_2(): if gdaltest.ingres_ds is None: pytest.skip() ####################################################### # Create Layer gdaltest.ingres_lyr = gdaltest.ingres_ds.CreateLayer( 'tpoly', geom_type=ogr.wkbPolygon, options=['OVERWRITE=YES']) ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.ingres_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.ingres_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.ingres_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_ingres_3(): if gdaltest.ingres_ds is None: pytest.skip() expect = [168, 169, 166, 158, 165] gdaltest.ingres_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.ingres_lyr, 'eas_id', expect) gdaltest.ingres_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.ingres_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None gdaltest.shp_ds.Destroy() # This is to force cleanup of the transaction. We need a way of # automating this in the driver. read_feat = gdaltest.ingres_lyr.GetNextFeature() assert tr ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_ingres_4(): if gdaltest.ingres_ds is None: pytest.skip() expect = [179, 173, 172, 171, 170, 169, 168, 166, 165, 158] sql_lyr = gdaltest.ingres_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.ingres_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. # # Unfortunately, for now an executesql result that includes new geometries # fails to ever get any result records as executed by ogringresstatement.cpp, # so we disable this test. def test_ogr_ingres_5(): if gdaltest.ingres_ds is None: pytest.skip() pytest.skip() # pylint: disable=unreachable sql_lyr = gdaltest.ingres_ds.ExecuteSQL( "select * from tpoly where prfedea = '35043413'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['35043413']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))') != 0: tr = 0 feat_read.Destroy() gdaltest.ingres_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_ingres_6(): if gdaltest.ingres_ds is None: pytest.skip() gdaltest.ingres_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.ingres_lyr.SetSpatialFilter(geom) geom.Destroy() tr = ogrtest.check_features_against_list(gdaltest.ingres_lyr, 'eas_id', [158]) gdaltest.ingres_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Test adding a new field. def test_ogr_ingres_7(): if gdaltest.ingres_ds is None: pytest.skip() #################################################################### # Add new string field. field_defn = ogr.FieldDefn('new_string', ogr.OFTString) result = gdaltest.ingres_lyr.CreateField(field_defn) field_defn.Destroy() assert result is 0, 'CreateField failed!' #################################################################### # Apply a value to this field in one feature. gdaltest.ingres_lyr.SetAttributeFilter("prfedea = '35043423'") feat_read = gdaltest.ingres_lyr.GetNextFeature() assert feat_read is not None, 'failed to read target feature!' gdaltest.ingres_fid = feat_read.GetFID() feat_read.SetField('new_string', 'test1') gdaltest.ingres_lyr.SetFeature(feat_read) feat_read.Destroy() #################################################################### # Now fetch two features and verify the new column works OK. gdaltest.ingres_lyr.SetAttributeFilter( "PRFEDEA IN ( '35043423', '35043414' )") tr = ogrtest.check_features_against_list(gdaltest.ingres_lyr, 'new_string', [None, 'test1']) gdaltest.ingres_lyr.SetAttributeFilter(None) assert tr ############################################################################### # Test deleting a feature. def test_ogr_ingres_8(): if gdaltest.ingres_ds is None: pytest.skip() assert gdaltest.ingres_lyr.TestCapability('DeleteFeature'), \ 'DeleteFeature capability test failed.' old_count = gdaltest.ingres_lyr.GetFeatureCount() #################################################################### # Delete target feature. target_fid = gdaltest.ingres_fid assert gdaltest.ingres_lyr.DeleteFeature(target_fid) == 0, \ 'DeleteFeature returned error code.' #################################################################### # Verify that count has dropped by one, and that the feature in question # can't be fetched. new_count = gdaltest.ingres_lyr.GetFeatureCount() if new_count != old_count - 1: gdaltest.post_reason('got feature count of %d, not expected %d.' % (new_count, old_count - 1)) assert gdaltest.ingres_lyr.GetFeature(target_fid) is None, 'Got deleted feature!' ############################################################################### # def test_ogr_ingres_cleanup(): if gdaltest.ingres_ds is None: pytest.skip() gdaltest.ingres_ds.Destroy() gdaltest.ingres_ds = None gdalautotest-3.0.4/ogr/ogr_basic_test.py0000755003401500001440000005310413614005363017767 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_basic_test.py a36c15da3f372f41f358d3e9baa10d8da997bc29 2019-11-09 19:06:09Z Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test basic OGR functionality against test shapefiles. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2014, Even Rouault # # 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. ############################################################################### import os import sys import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### def test_ogr_basic_1(): gdaltest.ds = ogr.Open('data/poly.shp') assert gdaltest.ds is not None ############################################################################### # Test Feature counting. def test_ogr_basic_2(): gdaltest.lyr = gdaltest.ds.GetLayerByName('poly') assert gdaltest.lyr.GetName() == 'poly' assert gdaltest.lyr.GetGeomType() == ogr.wkbPolygon assert gdaltest.lyr.GetLayerDefn().GetName() == 'poly' assert gdaltest.lyr.GetLayerDefn().GetGeomType() == ogr.wkbPolygon count = gdaltest.lyr.GetFeatureCount() assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting 10' % count) # Now actually iterate through counting the features and ensure they agree. gdaltest.lyr.ResetReading() count2 = 0 feat = gdaltest.lyr.GetNextFeature() while feat is not None: count2 = count2 + 1 feat = gdaltest.lyr.GetNextFeature() assert count2 == 10, \ ('Got wrong count with GetNextFeature() - %d, expecting 10' % count2) ############################################################################### # Test Spatial Query. def test_ogr_basic_3(): minx = 479405 miny = 4762826 maxx = 480732 maxy = 4763590 ########################################################################### # Create query geometry. ring = ogr.Geometry(type=ogr.wkbLinearRing) ring.AddPoint(minx, miny) ring.AddPoint(maxx, miny) ring.AddPoint(maxx, maxy) ring.AddPoint(minx, maxy) ring.AddPoint(minx, miny) poly = ogr.Geometry(type=ogr.wkbPolygon) poly.AddGeometryDirectly(ring) gdaltest.lyr.SetSpatialFilter(poly) gdaltest.lyr.SetSpatialFilter(gdaltest.lyr.GetSpatialFilter()) gdaltest.lyr.ResetReading() count = gdaltest.lyr.GetFeatureCount() assert count == 1, \ ('Got wrong feature count with spatial filter, expected 1, got %d' % count) feat1 = gdaltest.lyr.GetNextFeature() feat2 = gdaltest.lyr.GetNextFeature() assert feat1 is not None and feat2 is None, \ 'Got too few or too many features with spatial filter.' gdaltest.lyr.SetSpatialFilter(None) count = gdaltest.lyr.GetFeatureCount() assert count == 10, \ ('Clearing spatial query may not have worked properly, getting\n%d features instead of expected 10 features.' % count) ############################################################################### # Test GetDriver(). def test_ogr_basic_4(): driver = gdaltest.ds.GetDriver() assert driver is not None, 'GetDriver() returns None' assert driver.GetName() == 'ESRI Shapefile', \ ('Got wrong driver name: ' + driver.GetName()) ############################################################################### # Test attribute query on special field fid - per bug 1468. def test_ogr_basic_5(): gdaltest.lyr.SetAttributeFilter('FID = 3') gdaltest.lyr.ResetReading() feat1 = gdaltest.lyr.GetNextFeature() feat2 = gdaltest.lyr.GetNextFeature() gdaltest.lyr.SetAttributeFilter(None) assert feat1 is not None and feat2 is None, 'unexpected result count.' assert feat1.GetFID() == 3, 'got wrong feature.' ############################################################################### # Test opening a dataset with an empty string and a non existing dataset def test_ogr_basic_6(): # Put inside try/except for OG python bindings assert ogr.Open('') is None assert ogr.Open('non_existing') is None ############################################################################### # Test ogr.Feature.Equal() def test_ogr_basic_7(): feat_defn = ogr.FeatureDefn() feat = ogr.Feature(feat_defn) assert feat.Equal(feat) try: feat.SetFieldIntegerList except AttributeError: pytest.skip() feat_clone = feat.Clone() assert feat.Equal(feat_clone) # We MUST delete now as we are changing the feature defn afterwards! # Crash guaranteed otherwise feat = None feat_clone = None field_defn = ogr.FieldDefn('field1', ogr.OFTInteger) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field2', ogr.OFTReal) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field3', ogr.OFTString) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field4', ogr.OFTIntegerList) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field5', ogr.OFTRealList) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field6', ogr.OFTStringList) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field7', ogr.OFTDate) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field8', ogr.OFTTime) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field9', ogr.OFTDateTime) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field10', ogr.OFTBinary) feat_defn.AddFieldDefn(field_defn) field_defn = ogr.FieldDefn('field11', ogr.OFTInteger64) feat_defn.AddFieldDefn(field_defn) feat = ogr.Feature(feat_defn) feat.SetFID(100) feat.SetField(0, 1) feat.SetField(1, 1.2) feat.SetField(2, "A") feat.SetFieldIntegerList(3, [1, 2]) feat.SetFieldDoubleList(4, [1.2, 3.4]) feat.SetFieldStringList(5, ["A", "B"]) feat.SetField(6, 2010, 1, 8, 22, 48, 15, 4) feat.SetField(7, 2010, 1, 8, 22, 48, 15, 4) feat.SetField(8, 2010, 1, 8, 22, 48, 15, 4) feat.SetFieldBinaryFromHexString(9, '012345678ABCDEF') feat.SetField(10, 1234567890123) feat_clone = feat.Clone() if not feat.Equal(feat_clone): feat.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat_almost_clone.SetGeometry(geom) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat.SetGeometry(geom) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_clone = feat.Clone() if not feat.Equal(feat_clone): feat.DumpReadable() feat_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFID(99) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetField(0, 2) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetField(1, 2.2) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetField(2, "B") if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldIntegerList(3, [1, 2, 3]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldIntegerList(3, [1, 3]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldDoubleList(4, [1.2, 3.4, 5.6]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldDoubleList(4, [1.2, 3.5]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldStringList(5, ["A", "B", "C"]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldStringList(5, ["A", "D"]) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() for num_field in [6, 7, 8]: for i in range(7): feat_almost_clone = feat.Clone() feat_almost_clone.SetField(num_field, 2010 + (i == 0), 1 + (i == 1), 8 + (i == 2), 22 + (i == 3), 48 + (i == 4), 15 + (i == 5), 4 + (i == 6)) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetFieldBinaryFromHexString(9, '00') if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetField(10, 2) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() feat_almost_clone = feat.Clone() feat_almost_clone.SetField(10, 2) if feat.Equal(feat_almost_clone): feat.DumpReadable() feat_almost_clone.DumpReadable() pytest.fail() ############################################################################### # Issue several RegisterAll() to check that OGR drivers are good citizens def test_ogr_basic_8(): ogr.RegisterAll() ogr.RegisterAll() ogr.RegisterAll() ############################################################################### # Test ogr.GeometryTypeToName (#4871) def test_ogr_basic_9(): geom_type_tuples = [[ogr.wkbUnknown, "Unknown (any)"], [ogr.wkbPoint, "Point"], [ogr.wkbLineString, "Line String"], [ogr.wkbPolygon, "Polygon"], [ogr.wkbMultiPoint, "Multi Point"], [ogr.wkbMultiLineString, "Multi Line String"], [ogr.wkbMultiPolygon, "Multi Polygon"], [ogr.wkbGeometryCollection, "Geometry Collection"], [ogr.wkbNone, "None"], [ogr.wkbUnknown | ogr.wkb25DBit, "3D Unknown (any)"], [ogr.wkbPoint25D, "3D Point"], [ogr.wkbLineString25D, "3D Line String"], [ogr.wkbPolygon25D, "3D Polygon"], [ogr.wkbMultiPoint25D, "3D Multi Point"], [ogr.wkbMultiLineString25D, "3D Multi Line String"], [ogr.wkbMultiPolygon25D, "3D Multi Polygon"], [ogr.wkbGeometryCollection25D, "3D Geometry Collection"], [123456, "Unrecognized: 123456"] ] for geom_type_tuple in geom_type_tuples: assert ogr.GeometryTypeToName(geom_type_tuple[0]) == geom_type_tuple[1] ############################################################################### # Run test_ogrsf -all_drivers def test_ogr_basic_10(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -all_drivers') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test double call to UseExceptions() (#5704) def test_ogr_basic_11(): if not ogrtest.have_geos(): pytest.skip() used_exceptions_before = ogr.GetUseExceptions() for _ in range(2): ogr.UseExceptions() geom = ogr.CreateGeometryFromWkt('POLYGON ((-65 0, -30 -30, -30 0, -65 -30, -65 0))') with gdaltest.error_handler(): geom.IsValid() if used_exceptions_before == 0: ogr.DontUseExceptions() ############################################################################### # Test OFSTBoolean, OFSTInt16 and OFSTFloat32 def test_ogr_basic_12(): # boolean integer feat_def = ogr.FeatureDefn() assert ogr.GetFieldSubTypeName(ogr.OFSTBoolean) == 'Boolean' field_def = ogr.FieldDefn('fld', ogr.OFTInteger) field_def.SetSubType(ogr.OFSTBoolean) assert field_def.GetSubType() == ogr.OFSTBoolean feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetField('fld', 0) f.SetField('fld', 1) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetField('fld', 2) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f.GetField('fld') == 1 f.SetField('fld', '0') f.SetField('fld', '1') gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetField('fld', '2') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f.GetField('fld') == 1 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') field_def = ogr.FieldDefn('fld', ogr.OFTString) field_def.SetSubType(ogr.OFSTBoolean) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert field_def.GetSubType() == ogr.OFSTNone # boolean list feat_def = ogr.FeatureDefn() field_def = ogr.FieldDefn('fld', ogr.OFTIntegerList) field_def.SetSubType(ogr.OFSTBoolean) assert field_def.GetSubType() == ogr.OFSTBoolean feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetFieldIntegerList(0, [0, 1]) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetFieldIntegerList(0, [0, 1, 2, 1]) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f.GetField('fld') == [0, 1, 1, 1] # int16 integer feat_def = ogr.FeatureDefn() assert ogr.GetFieldSubTypeName(ogr.OFSTInt16) == 'Int16' field_def = ogr.FieldDefn('fld', ogr.OFTInteger) field_def.SetSubType(ogr.OFSTInt16) assert field_def.GetSubType() == ogr.OFSTInt16 feat_def.AddFieldDefn(field_def) f = ogr.Feature(feat_def) f.SetField('fld', -32768) f.SetField('fld', 32767) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetField('fld', -32769) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f.GetField('fld') == -32768 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetField('fld', 32768) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f.GetField('fld') == 32767 gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') field_def = ogr.FieldDefn('fld', ogr.OFTString) field_def.SetSubType(ogr.OFSTInt16) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert field_def.GetSubType() == ogr.OFSTNone # float32 feat_def = ogr.FeatureDefn() assert ogr.GetFieldSubTypeName(ogr.OFSTFloat32) == 'Float32' field_def = ogr.FieldDefn('fld', ogr.OFTReal) field_def.SetSubType(ogr.OFSTFloat32) assert field_def.GetSubType() == ogr.OFSTFloat32 feat_def.AddFieldDefn(field_def) if False: # pylint: disable=using-constant-test f = ogr.Feature(feat_def) gdal.ErrorReset() f.SetField('fld', '1.23') assert gdal.GetLastErrorMsg() == '' gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') f.SetField('fld', 1.230000000001) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' if abs(f.GetField('fld') - 1.23) < 1e-8: f.DumpReadable() pytest.fail() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') field_def = ogr.FieldDefn('fld', ogr.OFSTFloat32) field_def.SetSubType(ogr.OFSTInt16) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert field_def.GetSubType() == ogr.OFSTNone ############################################################################### # Test OGRParseDate (#6452) def test_ogr_basic_13(): feat_defn = ogr.FeatureDefn('test') field_defn = ogr.FieldDefn('date', ogr.OFTDateTime) feat_defn.AddFieldDefn(field_defn) tests = [('2016/1/1', '2016/01/01 00:00:00'), ('2016/1/1 12:34', '2016/01/01 12:34:00'), ('2016/1/1 12:34:56', '2016/01/01 12:34:56'), ('2016/1/1 12:34:56.789', '2016/01/01 12:34:56.789'), ('2016/12/31', '2016/12/31 00:00:00'), ('-2016/12/31', '-2016/12/31 00:00:00'), ('2016-12-31', '2016/12/31 00:00:00'), ('0080/1/1', '0080/01/01 00:00:00'), ('80/1/1', '1980/01/01 00:00:00'), ('0010/1/1', '0010/01/01 00:00:00'), ('9/1/1', '2009/01/01 00:00:00'), ('10/1/1', '2010/01/01 00:00:00'), ('2016-13-31', None), ('2016-0-31', None), ('2016-1-32', None), ('2016-1-0', None), ('0/1/1', '2000/01/01 00:00:00'), ('00/1/1', '2000/01/01 00:00:00'), ('00/00/00', None), ('000/00/00', None), ('0000/00/00', None), ('//foo', None)] for (val, expected_ret) in tests: f = ogr.Feature(feat_defn) f.SetField('date', val) assert f.GetField('date') == expected_ret, val ############################################################################### # Test ogr.Open(.) in an empty directory def test_ogr_basic_14(): os.mkdir('tmp/ogr_basic_14') os.chdir('tmp/ogr_basic_14') ds = ogr.Open('.') os.chdir('../..') assert ds is None os.rmdir('tmp/ogr_basic_14') ############################################################################### # Test exceptions with OGRErr return code def test_ogr_basic_15(): ds = ogr.Open('data/poly.shp') lyr = ds.GetLayer(0) used_exceptions_before = ogr.GetUseExceptions() ogr.UseExceptions() try: lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) except RuntimeError as e: ok = str(e).find('CreateFeature : unsupported operation on a read-only datasource') >= 0 assert ok, ('Got: %s' + str(e)) return finally: if used_exceptions_before == 0: ogr.DontUseExceptions() pytest.fail('Expected exception') ############################################################################### # Test issue with Python 3.5 and older SWIG (#6749) def ogr_basic_16_make_geom(): geom = ogr.Geometry(ogr.wkbPoint) geom.AddPoint_2D(0, 0) return geom def ogr_basic_16_gen_list(N): for i in range(N): ogr_basic_16_make_geom() yield i def test_ogr_basic_16(): assert list(ogr_basic_16_gen_list(2)) == [0, 1] def test_ogr_basic_invalid_unicode(): if sys.version_info >= (3, 0, 0): val = '\udcfc' else: exec("val = u'\\udcfc'") try: ogr.Open(val) except: pass data_source = ogr.GetDriverByName('Memory').CreateDataSource('') layer = data_source.CreateLayer("test") layer.CreateField(ogr.FieldDefn('attr', ogr.OFTString)) feature = ogr.Feature(layer.GetLayerDefn()) try: feature.SetField('attr', val) except: pass def test_ogr_basic_dataset_slice(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') ds.CreateLayer('lyr1') ds.CreateLayer('lyr2') ds.CreateLayer('lyr3') lyrs = [lyr.GetName() for lyr in ds[1:3]] assert lyrs == ['lyr2', 'lyr3'] lyrs = [lyr.GetName() for lyr in ds[0:4]] assert lyrs == ['lyr1', 'lyr2', 'lyr3'] lyrs = [lyr.GetName() for lyr in ds[0:3:2]] assert lyrs == ['lyr1', 'lyr3'] def test_ogr_basic_feature_iterator(): lyr = gdaltest.ds.GetLayer(0) count = 0 for f in lyr: count += 1 assert count == 10 count = 0 for f in lyr: count += 1 assert count == 10 ############################################################################### # cleanup def test_ogr_basic_cleanup(): gdaltest.lyr = None gdaltest.ds = None gdalautotest-3.0.4/ogr/ogr_ili.py0000755003401500001440000014323313614005363016427 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_ili.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Interlis driver testing. # Author: Pirmin Kalberer # ############################################################################### # Copyright (c) 2012, Pirmin Kalberer # # 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. ############################################################################### import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr import pytest def cpl_debug_on(): gdaltest.cpl_debug = gdal.GetConfigOption('CPL_DEBUG') gdal.SetConfigOption('CPL_DEBUG', 'ON') def cpl_debug_reset(): gdal.SetConfigOption('CPL_DEBUG', gdaltest.cpl_debug) ############################################################################### # Open Driver def test_ogr_interlis1_1(): gdaltest.have_ili_reader = 0 driver = ogr.GetDriverByName('Interlis 1') if driver is None: pytest.skip() gdaltest.have_ili_reader = 1 ############################################################################### # Check that Ili1 point layer is properly read. def test_ogr_interlis1_2(): if not gdaltest.have_ili_reader: pytest.skip() if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('data/ili/Beispiel.itf,data/ili/Beispiel.imd') layers = ['Bodenbedeckung__BoFlaechen', 'Bodenbedeckung__BoFlaechen_Form', 'Bodenbedeckung__Strasse', 'Bodenbedeckung__Gebaeude'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('Bodenbedeckung__BoFlaechen') assert lyr.GetFeatureCount() == 3, 'feature count wrong.' # Get 2nd feature feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() field_values = [20, 1, 168.27, 170.85] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom = feat.GetGeomFieldRef(0) assert geom.GetCoordinateDimension() == 2, 'dimension wrong.' geom = feat.GetGeomFieldRef(1) assert geom.GetCoordinateDimension() == 2, 'dimension wrong.' geom = feat.GetGeometryRef() assert geom.GetGeometryName() == 'POLYGON', 'Geometry of wrong type.' ############################################################################### # Ili1 FORMAT DEFAULT test. def test_ogr_interlis1_3(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/format-default.itf,data/ili/format-default.imd') layers = ['FormatTests__FormatTable'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('FormatTests__FormatTable') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = [0, 'aa bb', 'cc^dd', '', 1] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') ############################################################################### # Ili1 FORMAT test. def test_ogr_interlis1_4(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/format-test.itf,data/ili/format-test.imd') layers = ['FormatTests__FormatTable'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('FormatTests__FormatTable') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = [0, 'aa_bb', 'cc dd', '', 1] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') ############################################################################### # Write Ili1 transfer file without model. def test_ogr_interlis1_5(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/format-default.itf,data/ili/format-default.imd') lyr = ds.GetLayerByName('FormatTests__FormatTable') feat = lyr.GetNextFeature() driver = ogr.GetDriverByName('Interlis 1') outfile = "tmp/interlis1_5.itf" with gdaltest.error_handler(): dst_ds = driver.CreateDataSource(outfile) dst_lyr = dst_ds.CreateLayer('FormatTests__FormatTable') layer_defn = lyr.GetLayerDefn() for i in range(layer_defn.GetFieldCount()): dst_lyr.CreateField(layer_defn.GetFieldDefn(i)) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) dst_ds = None with open(outfile) as f: itf = f.read() expected = """MTID INTERLIS1 MODL OGR ETOP TOPI FormatTests TABL FormatTable OBJE 0 0 aa_bb cc^dd @ 1 ETAB ETOP EMOD ENDE""" assert expected in itf, "Interlis output doesn't match." ############################################################################### # Write Ili1 transfer file. def test_ogr_interlis1_6(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/format-default.itf,data/ili/format-default.imd') lyr = ds.GetLayerByName('FormatTests__FormatTable') feat = lyr.GetNextFeature() driver = ogr.GetDriverByName('Interlis 1') outfile = "tmp/interlis1_6.itf" dst_ds = driver.CreateDataSource(outfile + ",data/ili/format-default.imd") dst_lyr = dst_ds.CreateLayer('test') layer_defn = lyr.GetLayerDefn() for i in range(layer_defn.GetFieldCount()): dst_lyr.CreateField(layer_defn.GetFieldDefn(i)) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) dst_ds = None with open(outfile) as f: itf = f.read() expected = """MTID INTERLIS1 MODL FormatDefault TOPI FormatTests TABL test OBJE 1 0 aa_bb cc^dd @ 1 ETAB ETOP EMOD ENDE""" assert expected in itf, "Interlis output doesn't match." ############################################################################### # Ili1 character encoding test. def test_ogr_interlis1_7(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/encoding-test.itf,data/ili/format-default.imd') layers = ['FormatTests__FormatTable'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('FormatTests__FormatTable') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() # Interlis 1 Encoding is ISO 8859-1 (Latin1) # Python source code is UTF-8 encoded field_values = [0, 'äöü', 'ÄÖÜ', '', 1] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') # Write back driver = ogr.GetDriverByName('Interlis 1') outfile = "tmp/interlis1_7.itf" dst_ds = driver.CreateDataSource(outfile + ",data/ili/format-default.imd") dst_lyr = dst_ds.CreateLayer('FormatTests__FormatTable') layer_defn = lyr.GetLayerDefn() for i in range(layer_defn.GetFieldCount()): dst_lyr.CreateField(layer_defn.GetFieldDefn(i)) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) dst_ds = None try: # Python 3 f = open(outfile, encoding='iso-8859-1') except TypeError: f = open(outfile) itf = f.read() expected = """MTID INTERLIS1 MODL FormatDefault TABL FormatTable OBJE 2 0 äöü ÄÖÜ @ 1 ETAB ETOP EMOD ENDE""" try: # Python 2 expected = expected.decode('utf8').encode('iso-8859-1') except: pass assert expected in itf, "Interlis output doesn't match." ############################################################################### # Ili1 VRT rename def test_ogr_interlis1_9(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/Beispiel-rename.vrt') layers = ['BoGebaeude'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('BoGebaeude') assert lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef() == 'AssekuranzNr', \ ('Wrong field name: ' + lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef()) assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = ['958', 10, 'POINT (148.41 175.96)'] assert feat.GetFieldCount() == len(field_values) - 1, 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') ############################################################################### # Ili1 Area with polygonizing def test_ogr_interlis1_10(): if not gdaltest.have_ili_reader: pytest.skip() if not ogrtest.have_geos(): pytest.skip() ds = ogr.Open('data/ili/Beispiel.itf,data/ili/Beispiel.imd') lyr = ds.GetLayerByName('Bodenbedeckung__BoFlaechen') assert lyr.GetFeatureCount() == 3, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['POLYGON ((146.92 174.98,138.68 187.51,147.04 193.0,149.79 188.82,158.15 194.31,163.64 185.96,146.92 174.98))', 'POINT (148.2 183.48)'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Ili1 multi-geom test (RFC41) def test_ogr_interlis1_11(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/multigeom.itf,data/ili/multigeom.imd') layers = ['MultigeomTests__MultigeomTable'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('MultigeomTests__MultigeomTable') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() # feat.DumpReadable() # _TID (String) = 0 # Text1 (String) = aa bb # Number (Real) = 40 # MULTILINESTRING ((190.26 208.0 0, ... # GeomPoint_0 (Real) = 148.41 # GeomPoint_1 (Real) = 175.96 assert feat.GetFieldCount() == 5, 'field count wrong.' geom_columns = ['GeomLine', 'GeomPoint'] assert feat.GetGeomFieldCount() == len(geom_columns), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): defn = lyr.GetLayerDefn().GetGeomFieldDefn(i) assert defn.GetName() == str(geom_columns[i]), ("Geom field: " + defn.GetName()) ############################################################################### # Ili1 multi-geom test (RFC41) def test_ogr_interlis1_12(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/multicoord.itf,data/ili/multicoord.imd') layers = ['MulticoordTests__MulticoordTable'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('MulticoordTests__MulticoordTable') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() if feat.GetFieldCount() != 6: feat.DumpReadable() pytest.fail('field count wrong.') geom_columns = ['coordPoint1', 'coordPoint2'] assert feat.GetGeomFieldCount() == len(geom_columns), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): defn = lyr.GetLayerDefn().GetGeomFieldDefn(i) assert defn.GetName() == str(geom_columns[i]), ("Geom field: " + defn.GetName()) ############################################################################### # Ili1 Surface test. def test_ogr_interlis1_13(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/surface.itf,data/ili/surface.imd') layers = ['SURFC_TOP__SURFC_TBL', 'SURFC_TOP__SURFC_TBL_SHAPE', 'SURFC_TOP__SURFC_TBL_TEXT_ID', 'SURFC_TOP__SURFC_TBL_TEXT_ID_SHAPE', 'SURFC_TOP__LineAttrib1', 'SURFC_TOP__Flaechenelement', 'SURFC_TOP__Flaechenelement_Geometrie' ] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL_SHAPE') assert lyr.GetFeatureCount() == 5, 'feature count wrong.' lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL') assert lyr.GetFeatureCount() == 4, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = ['103', 1, 3, 1, 23, 25000, 20060111] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((598600.961 249487.174,598608.899 249538.768,598624.774 249594.331,598648.586 249630.05,598684.305 249661.8,598763.68 249685.612,598850.993 249685.612,598854.962 249618.143,598843.055 249550.675,598819.243 249514.956,598763.68 249479.237,598692.243 249447.487,598612.868 249427.643,598600.961 249487.174)))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # --- test curved polygon feat = lyr.GetNextFeature() geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((598131.445 249100.621,598170.131 249095.094,598200.448 249085.393),CIRCULARSTRING (598200.448 249085.393,598239.253 249062.352,598246.529 249044.162),(598246.529 249044.162,598245.316 249025.972,598229.552 249017.483,598165.28 249035.673,598134.963 249049.013,598130.273 249052.095,598131.445 249100.621)))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # --- test multi-ring polygon feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() field_values = ['106', 3, 3, 1, 23, 25000, 20060111] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') # FIXME: note this is an invalid curve polygon. The two rings are completely disjoint, so this should be a multisurface instead. geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((747951.24 265833.326,747955.101 265828.716,747954.975 265827.862,747951.166 265828.348,747951.24 265833.326)),COMPOUNDCURVE ((747925.762 265857.606,747927.618 265861.533,747928.237 265860.794,747930.956 265857.547,747925.762 265857.606)))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # --- same with text IDENT field # TODO: Surface with text IDENT field not supported yet # lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL_TEXT_ID_SHAPE') # if lyr.GetFeatureCount() != 5: # gdaltest.post_reason('feature count wrong.') # return 'fail' # lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL_TEXT_ID') # if lyr.GetFeatureCount() != 4: # gdaltest.post_reason('feature count wrong.') # return 'fail' # feat = lyr.GetNextFeature() # # Note: original value 'AAA_EZ20156' includes blank-symbol # field_values = ['AAA EZ20156', 1, 3, 1, 23, 25000, 20060111] # if feat.GetFieldCount() != len(field_values): # gdaltest.post_reason( 'field count wrong.' ) # return 'fail' # for i in range(feat.GetFieldCount()): # if feat.GetFieldAsString(i) != str(field_values[i]): # feat.DumpReadable() # print(feat.GetFieldAsString(i)) # gdaltest.post_reason( 'field value wrong.' ) # return 'fail' # geom_field_values = ['POLYGON ((598600.961 249487.174,598608.899 249538.768,598624.774 249594.331,598648.586 249630.05,598684.305 249661.8,598763.68 249685.612,598850.993 249685.612,598854.962 249618.143,598843.055 249550.675,598819.243 249514.956,598763.68 249479.237,598692.243 249447.487,598612.868 249427.643,598600.961 249487.174))'] # if feat.GetGeomFieldCount() != len(geom_field_values): # gdaltest.post_reason( 'geom field count wrong.' ) # print(feat.GetGeomFieldCount()) # return 'fail' # for i in range(feat.GetGeomFieldCount()): # geom = feat.GetGeomFieldRef(i) # if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: # feat.DumpReadable() # return 'fail' # # --- test multi-ring polygon # feat = lyr.GetNextFeature() # feat = lyr.GetNextFeature() # feat = lyr.GetNextFeature() # field_values = ['AAA EZ36360', 3, 3, 1, 23, 25000, 20060111] # if feat.GetFieldCount() != len(field_values): # gdaltest.post_reason( 'field count wrong.' ) # return 'fail' # for i in range(feat.GetFieldCount()): # if feat.GetFieldAsString(i) != str(field_values[i]): # feat.DumpReadable() # print(feat.GetFieldAsString(i)) # gdaltest.post_reason( 'field value wrong.' ) # return 'fail' # geom_field_values = ['POLYGON ((747925.762 265857.606,747927.618 265861.533,747928.237 265860.794,747930.956 265857.547,747925.762 265857.606),(747951.24 265833.326,747955.101 265828.716,747954.975 265827.862,747951.166 265828.348,747951.24 265833.326))'] # if feat.GetGeomFieldCount() != len(geom_field_values): # gdaltest.post_reason( 'geom field count wrong.' ) # print(feat.GetGeomFieldCount()) # return 'fail' # for i in range(feat.GetGeomFieldCount()): # geom = feat.GetGeomFieldRef(i) # if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: # feat.DumpReadable() # return 'fail' lyr = ds.GetLayerByName('SURFC_TOP__Flaechenelement_Geometrie') assert lyr.GetFeatureCount() == 3, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['MULTICURVE (COMPOUNDCURVE ((697064.616 245051.751,697064.773 245052.007,697067.63 245050.258,697067.473 245050.002,697064.616 245051.751)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() geom_field_values = ['MULTICURVE (COMPOUNDCURVE ((698298.028 246754.897,698295.899 246752.775,698293.113 246755.525,698295.243 246757.648)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('SURFC_TOP__Flaechenelement') assert lyr.GetFeatureCount() == 2, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((697064.616 245051.751,697064.773 245052.007,697067.63 245050.258,697067.473 245050.002,697064.616 245051.751))))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((698298.028 246754.897,698295.899 246752.775,698293.113 246755.525,698295.243 246757.648),(698295.243 246757.648,698298.028 246754.897)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # Test assembling curves not in "right" order ds = ogr.Open('data/ili/surface_complex.itf,data/ili/surface.imd') lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL') feat = lyr.GetNextFeature() geom_field_values = ['CURVEPOLYGON (COMPOUNDCURVE ((747955.101 265828.716,747954.975 265827.862),(747954.975 265827.862,747951.166 265828.348,747951.24 265833.326),(747951.24 265833.326,747955.101 265828.716)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Ili1 Surface test with linear conversion. def test_ogr_interlis1_13_linear(): if not gdaltest.have_ili_reader: pytest.skip() gdal.SetConfigOption('OGR_STROKE_CURVE', 'YES') ds = ogr.Open('data/ili/surface.itf,data/ili/surface.imd') layers = ['SURFC_TOP__SURFC_TBL', 'SURFC_TOP__SURFC_TBL_SHAPE', 'SURFC_TOP__SURFC_TBL_TEXT_ID', 'SURFC_TOP__SURFC_TBL_TEXT_ID_SHAPE', 'SURFC_TOP__LineAttrib1', 'SURFC_TOP__Flaechenelement', 'SURFC_TOP__Flaechenelement_Geometrie' ] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL_SHAPE') assert lyr.GetFeatureCount() == 5, 'feature count wrong.' lyr = ds.GetLayerByName('SURFC_TOP__SURFC_TBL') assert lyr.GetFeatureCount() == 4, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = ['103', 1, 3, 1, 23, 25000, 20060111] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom_field_values = ['POLYGON ((598600.961 249487.174,598608.899 249538.768,598624.774 249594.331,598648.586 249630.05,598684.305 249661.8,598763.68 249685.612,598850.993 249685.612,598854.962 249618.143,598843.055 249550.675,598819.243 249514.956,598763.68 249479.237,598692.243 249447.487,598612.868 249427.643,598600.961 249487.174))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # --- test curved polygon geom_field_values = ['POLYGON ((598600.961 249487.174,598608.899 249538.768,598624.774 249594.331,598648.586 249630.05,598684.305 249661.8,598763.68 249685.612,598850.993 249685.612,598854.962 249618.143,598843.055 249550.675,598819.243 249514.956,598763.68 249479.237,598692.243 249447.487,598612.868 249427.643,598600.961 249487.174))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() # --- test multi-ring polygon feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() # field_values = ['106', 3, 3, 1, 23, 25000, 20060111] field_values = ['105', 3, 3, 1, 23, 25000, 20060111] assert feat.GetFieldCount() == len(field_values), 'field count wrong.' for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom_field_values = ['POLYGON ((598330.204 249028.397,598344.756 249057.501,598390.838 249074.479,598422.367 249081.755,598459.96 249093.882,598493.915 249101.158,598523.019 249106.008,598563.038 249084.18,598589.716 249042.949,598603.056 249011.42,598607.907 248966.551,598577.59 248960.487,598493.915 248983.528,598424.793 248996.868,598359.308 249010.207,598330.204 249028.397))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('SURFC_TOP__Flaechenelement_Geometrie') assert lyr.GetFeatureCount() == 3, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['MULTICURVE (COMPOUNDCURVE ((697064.616 245051.751,697064.773 245052.007,697067.63 245050.258,697067.473 245050.002,697064.616 245051.751)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() geom_field_values = ['MULTICURVE (COMPOUNDCURVE ((698298.028 246754.897,698295.899 246752.775,698293.113 246755.525,698295.243 246757.648)))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('SURFC_TOP__Flaechenelement') assert lyr.GetFeatureCount() == 2, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['POLYGON ((697064.616 245051.751,697064.773 245052.007,697067.63 245050.258,697067.473 245050.002,697064.616 245051.751))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() geom_field_values = ['POLYGON ((698298.028 246754.897,698295.899 246752.775,698293.113 246755.525,698295.243 246757.648,698298.028 246754.897))'] for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() gdal.SetConfigOption('OGR_STROKE_CURVE', None) ############################################################################### # Write Ili1 Arcs. def test_ogr_interlis1_14(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/Beispiel.itf,data/ili/Beispiel.imd') lyr = ds.GetLayerByName('Bodenbedeckung__Strasse') feat = lyr.GetNextFeature() driver = ogr.GetDriverByName('Interlis 1') outfile = "tmp/interlis1_14.itf" dst_ds = driver.CreateDataSource(outfile + ",data/ili/Beispiel.imd") dst_lyr = dst_ds.CreateLayer('Bodenbedeckung__Strasse', None, ogr.wkbMultiCurve) layer_defn = lyr.GetLayerDefn() for i in range(layer_defn.GetFieldCount()): dst_lyr.CreateField(layer_defn.GetFieldDefn(i)) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) dst_ds = None with open(outfile) as f: itf = f.read() expected = """//// MTID INTERLIS1 MODL Beispiel TABL Strasse OBJE 3 100 STPT 190.26 208 ARCP 187 186 LIPT 173.1 171 LIPT 141.08 152.94 ELIN ETAB ETOP EMOD ENDE """ assert expected in itf, "Interlis output doesn't match." ############################################################################### # Reading Ili2 without model def test_ogr_interlis2_1(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/RoadsExdm2ien.xml') assert ds is not None layers = ['RoadsExdm2ben.Roads.LandCover', 'RoadsExdm2ben.Roads.Street', 'RoadsExdm2ien.RoadsExtended.StreetAxis', 'RoadsExdm2ben.Roads.StreetNamePosition', 'RoadsExdm2ien.RoadsExtended.RoadSign'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' ############################################################################### # Reading Ili2 def test_ogr_interlis2_2(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/RoadsExdm2ien.xml,data/ili/RoadsExdm2ien.imd') assert ds is not None layers = ['RoadsExdm2ben.Roads.LAttrs', 'RoadsExdm2ben.Roads.LandCover', 'RoadsExdm2ben.Roads.Street', 'RoadsExdm2ben.Roads.StreetNamePosition', 'RoadsExdm2ien.RoadsExtended.StreetAxis', 'RoadsExdm2ien.RoadsExtended.RoadSign'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('RoadsExdm2ien.RoadsExtended.RoadSign') assert lyr.GetFeatureCount() == 4, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = [501, 'prohibition.noparking'] if feat.GetFieldCount() != len(field_values): feat.DumpReadable() pytest.fail('field count wrong.') for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom = feat.GetGeometryRef() assert geom.GetCoordinateDimension() == 2, 'dimension wrong.' geom_field_values = ['POINT (69.389 92.056)'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('RoadsExdm2ien.RoadsExtended.StreetAxis') assert lyr.GetFeatureCount() == 7, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['LINESTRING (55.6 37.649,15.573 25.785)'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('RoadsExdm2ben.Roads.LandCover') assert lyr.GetFeatureCount() == 12, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['POLYGON ((39.038 60.315,41.2 59.302,43.362 60.315,44.713 66.268,45.794 67.662,48.766 67.408,53.36 64.115,56.197 62.595,57.818 63.862,58.899 68.928,55.927 72.348,47.955 75.515,42.281 75.388,39.308 73.235,36.741 69.688,35.525 66.268,35.661 63.735,37.957 61.455,39.038 60.315))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Write Ili2 transfer file. def test_ogr_interlis2_3(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/RoadsExdm2ien.xml,data/ili/RoadsExdm2ien.imd') lyr = ds.GetLayerByName('RoadsExdm2ien.RoadsExtended.RoadSign') feat = lyr.GetNextFeature() driver = ogr.GetDriverByName('Interlis 2') outfile = "tmp/interlis2_3.xtf" dst_ds = driver.CreateDataSource(outfile + ",data/ili/RoadsExdm2ien.imd") dst_lyr = dst_ds.CreateLayer('RoadsExdm2ien.RoadsExtended.RoadSign') dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) lyr = ds.GetLayerByName('RoadsExdm2ben.Roads.LandCover') feat = lyr.GetNextFeature() dst_lyr = dst_ds.CreateLayer('RoadsExdm2ben.Roads.LandCover') dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) dst_feat.SetFrom(feat) dst_lyr.CreateFeature(dst_feat) dst_ds = None with open(outfile) as f: xtf = f.read() expected = """ 69.38992.056 prohibition.noparking 39.03860.315 41.259.302 43.36260.315 44.71366.268 45.79467.66200000000001 48.76667.408 53.3664.11499999999999 56.19762.595 57.81863.862 58.89968.928 55.92772.348 47.95575.515 42.28175.38800000000001 39.30873.235 36.74169.688 35.52566.268 35.66163.735 37.95761.455 39.03860.315 water """ expected = expected.replace('.11499999999999', '.115') xtf = xtf.replace('.11499999999999', '.115') assert expected in xtf, "Interlis output doesn't match." ############################################################################### # Ili2 Oereb model def test_ogr_interlis2_4(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/ch.bazl.sicherheitszonenplan.oereb_20131118.xtf,data/ili/ch.bazl.sicherheitszonenplan.oereb_20131118.imd') assert ds is not None layers = ['chGeoId10.BFSNr_', 'chGeoId10.Kanton_', 'chGeoId10.KantonInklFl_', 'CodeISO.CountryCodeISO_', 'CodeISO.LanguageCodeISO_', 'MultilingualText09.LocalizedMText', 'MultilingualText09.LocalizedText', 'MultilingualText09.LocalizedURI', 'MultilingualText09.MultilingualText', 'MultilingualText09.MultilingualURI', 'OeREBKRM09.ArtikelNummer_', 'OeREBKRM09.Datum_', 'OeREBKRM09.Thema_', 'OeREBKRM09.WebReferenz_', 'OeREBKRM09.ArtikelInhaltMehrsprachig', 'OeREBKRM09vs.Vorschriften.Amt', 'OeREBKRM09vs.Vorschriften.Artikel', 'OeREBKRM09vs.Vorschriften.Rechtsvorschrift', 'OeREBKRM09vs.Vorschriften.HinweisWeitereDokumente', 'OeREBKRM09trsfr.Transferstruktur.DarstellungsDienst', 'OeREBKRM09trsfr.Transferstruktur.Eigentumsbeschraenkung', 'OeREBKRM09trsfr.Transferstruktur.Geometrie', 'OeREBKRM09trsfr.Transferstruktur.HinweisDefinition', 'OeREBKRM09trsfr.Transferstruktur.GrundlageVerfeinerung', 'OeREBKRM09trsfr.Transferstruktur.HinweisDefinitionDokument', 'OeREBKRM09trsfr.Transferstruktur.HinweisVorschrift', 'OeREBKRM09vs.Vorschriften.Dokument'] assert ds.GetLayerCount() == len(layers), 'layer count wrong.' for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() in layers, 'Did not get right layers' lyr = ds.GetLayerByName('OeREBKRM09trsfr.Transferstruktur.Geometrie') assert lyr.GetFeatureCount() == 36, 'feature count wrong.' feat = lyr.GetNextFeature() field_values = ['108-G-0002', 'inKraft', '1975-06-27', 'http://www.geocat.ch/geonetwork/srv/ger/metadata.show?fileIdentifier=ff218384-7251-4e68-85e7-c163dd366616', '108-Z-0002', 'ch.admin.bazl'] if feat.GetFieldCount() != len(field_values): feat.DumpReadable() pytest.fail('field count wrong.') for i in range(feat.GetFieldCount()): if feat.GetFieldAsString(i) != str(field_values[i]): feat.DumpReadable() print(feat.GetFieldAsString(i)) pytest.fail('field value wrong.') geom_field_values = [None, None, 'CURVEPOLYGON (COMPOUNDCURVE ((658593.928 254957.714,658511.628 254948.614,658418.028 254938.516,658106.426 254913.918,658192.222 254445.914,658771.228 254619.412,659667.232 254699.606,660369.238 254827.202,661016.442 255010.1,661279.644 255090.198,661866.648 255138.094,661784.45 255601.798,661211.146 255432.8,660320.54 255352.806,659523.436 255206.71,658703.528 254966.814,658624.228 254961.014,658593.928 254957.714)))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) val = geom_field_values[i] if val is None: ok = geom is None else: ok = ogrtest.check_feature_geometry(geom, val) == 0 if not ok: print(geom) pytest.fail('geom check failed.') ############################################################################### # Check arc segmentation def test_ogr_interlis_arc1(): if not gdaltest.have_ili_reader: pytest.skip() gdal.SetConfigOption('OGR_STROKE_CURVE', 'TRUE') # gdal.SetConfigOption('OGR_ARC_STEPSIZE', '0.96') ds = ogr.Open('data/ili/Beispiel.itf,data/ili/Beispiel.imd') gdal.SetConfigOption('OGR_STROKE_CURVE', None) length_0_1_deg = 72.7181992353 # Line length with 0.1 degree segments # Read Area lines lyr = ds.GetLayerByName('Bodenbedeckung__BoFlaechen_Form') assert lyr.GetFeatureCount() == 4, 'feature count wrong.' # Get 3rd feature feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() length = geom.Length() assert abs(length - length_0_1_deg) <= 0.001, \ ('Length() result wrong, got %g.' % length) if ogrtest.check_feature_geometry(geom, 'MULTILINESTRING ((186.38 206.82,186.456637039593772 206.352374385077951,186.525513501820711 205.883542875348297,186.586610467027612 205.413634254015022,186.639911152487883 204.942777600139351,186.685400917071064 204.471102253228281,186.72306726518579 203.998737777656032,186.752899850289367 203.525813927088137,186.774890477674461 203.05246060886563,186.789033106731921 202.578807848280093,186.795323852631526 202.104985752892361,186.793760987376999 201.631124476756639,186.784344940257114 201.157354184717377,186.76707829777294 200.683805016597006,186.741965802895692 200.210607051507367,186.709014353764331 199.737890272066551,186.668233001808375 199.265784528717603,186.619632949244959 198.79441950407633,186.563227546008392 198.323924677271833,186.499032286083064 197.854429288403452,186.427064803254297 197.386062303034095,186.347344866240718 196.918952376778151,186.259894373302785 196.453227819933062,186.164737346189185 195.989016562249134,186.06189992355209 195.52644611780849,185.951410353787622 195.065643549954956,185.83329898723602 194.606735436434946,185.70759826788705 194.149847834589281,185.574342724430579 193.695106246756012,185.433568960797828 193.242635585782381,185.285315646106 192.792560140718678,185.129623504006275 192.345003542672174,184.966535301544326 191.900088730850229,184.796095837373258 191.457937918770739,184.618351929457248 191.018672560741805,184.433352402229474 190.582413318443258,184.241148073160701 190.149280027813774,184.04179173881127 189.71939166611989,183.835338160315558 189.292866319286958,183.621844048349857 188.869821149441094,183.401368047569093 188.450372362771276,183.173970720454207 188.03463517752968,182.939714530730242 187.622723792475853,182.698663826158707 187.214751355422749,182.450884820893378 186.810829932226596,182.196445577297681 186.411070475951391,181.935415987201822 186.015582796419011,181.667867752774299 185.624475530035824,181.3938743667604 185.237856109953981,181.113511092327798 184.855830736560137,180.826854942395556 184.478504348306132,180.53398465846837 184.105980592874374,180.234980689005141 183.73836179872157,179.929925167336449 183.375748946964421,179.618901889065427 183.018241643621849,179.301996289112111 182.665938092286495,178.979295418190276 182.318935067130923,178.650887918905909 181.977327886313986,178.316864001440962 181.64121038583832,177.97731541873506 181.310674893720687,177.632335441296135 180.985812204678922,177.282018831589056 180.666711555153569,176.9264618179877 180.353460598817009,176.565762068363227 180.046145382490039,176.200018663221243 179.744850322516839,175.829332068533375 179.449658181561944,175.453804108095909 179.160650045865594,175.073537935597386 178.877905303001143,174.688638006242371 178.601501620054449,174.299210048091453 178.331514922276227,173.905361033015623 178.068019372236421,173.507199147294131 177.811087349466078,173.104833761914023 177.560789430557605,172.698375402513165 177.317194369767066,172.28793571903222 177.080369080176723,171.873627455046488 176.850378615250492,171.455564416777605 176.627286151007837,171.033861441848018 176.411152968667096,170.60863436775486 176.202038437793476,170.18 176.0,140.69 156.63))') != 0: print(geom.ExportToWkt()) pytest.fail('Ili curve not correctly read') line = geom.GetGeometryRef(0) points = line.GetPoints() assert len(points) == 81, 'line point count wrong.' # Get 4th feature feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() length = geom.Length() assert abs(length - 98.0243498288) <= 0.001, \ ('Length() result wrong, got %g.' % length) if ogrtest.check_feature_geometry(geom, 'MULTILINESTRING ((186.38 206.82,194.26 208.19,194.360118941290381 207.583863387608318,194.450034548441351 206.976129417129414,194.52972141151983 206.366969832830335,194.599157011165488 205.756556781867374,194.658321725044487 205.145062765608571,194.707198833340925 204.532660590913991,194.745774523486006 203.919523321273999,194.774037894087058 203.305824227936654,194.791980957968889 202.691736740889581,194.799598644465704 202.077434399900056,194.796888800832647 201.463090805460496,194.783852192864259 200.848879569690297,194.760492504683469 200.234974267339538,194.72681633767931 199.621548386683543,194.682833208673372 199.00877528050475,194.628555547191326 198.396828117140075,194.56399869197773 197.785879831499159,194.489180886659568 197.176103076206317,194.40412327458759 196.567670172822517,194.308849892848201 195.960753063147394,194.203387665489544 195.355523260601302,194.087766395903571 194.752151801789267,193.962018758407766 194.150809198152245,193.826180289004668 193.55166538777118,193.680289375348337 192.954889687360236,193.524387245874067 192.360650744412823,193.358517958193232 191.769116489536799,193.182728386585921 191.180454089007952,192.997068208809623 190.594829897498101,192.80158989201297 190.012409411123343,192.596348677929171 189.433357220623265,192.381402567276353 188.857836964845745,192.156812303357555 188.28601128455918,191.922641354867636 187.718041776424769,191.678955898001703 187.15408894736899,191.425824797734066 186.594312169210724,191.163319588355051 186.038869633623079,190.891514453251119 185.48791830744446,190.610486203950103 184.941613888295223,190.320314258417028 184.400110760594515,190.021080618593231 183.863561951926357,189.71286984725154 183.332119089784072,189.395769044065645 182.805932358758554,189.069867821024644 182.285150458053948,188.735258277090878 181.769920559469,188.392034972181108 181.260388265836781,188.040294900434645 180.756697569857323,187.680137462819374 180.258990813403187,187.311664439032 179.767408647305245,186.934979958736193 179.282089991582296,186.550190472116782 178.803171996223654,186.157404719844607 178.330790002393741,185.756733702299215 177.865077504182381,185.348290648216761 177.406166110929888,184.932190982704896 176.954185509959615,184.508552294610098 176.50926343000171,184.077494303273824 176.071525605046162,183.639138824742957 175.641095738836128,183.193609737303603 175.218095469892404,182.741032946476452 174.802644337149076,182.281536349473726 174.394859746185801,181.815249799001293 173.994856936020341,181.34230506662422 173.60274894655592,180.86283580545566 173.21864658665433,180.376977512460115 172.84265840277655,179.884867490109144 172.47489064835824,179.38664480760778 172.115447253752762,178.882450261575258 171.764429796865414,178.372426336281904 171.421937474442501,177.856717163354887 171.08806707407345,177.335468481061952 170.762912946782279,176.808827593129507 170.446566980404867,176.276943327102316 170.13911857360651,175.739965992295737 169.840654610641622,175.198047337304331 169.551259436742839,174.651340507162928 169.271014834364934,174.1 169.0,145.08 149.94,140.69 156.63))') != 0: print(geom.ExportToWkt()) pytest.fail('Ili curve not correctly read') line = geom.GetGeometryRef(0) points = line.GetPoints() assert len(points) == 81, 'line point count wrong.' ############################################################################### # Check polyline with arc def test_ogr_interlis_arc2(): if not gdaltest.have_ili_reader: pytest.skip() ds = ogr.Open('data/ili/Beispiel.itf,data/ili/Beispiel.imd') lyr = ds.GetLayerByName('Bodenbedeckung__Strasse') assert lyr.GetFeatureCount() == 1, 'feature count wrong.' feat = lyr.GetNextFeature() geom_field_values = ['MULTICURVE (COMPOUNDCURVE (CIRCULARSTRING (190.26 208.0,187 186,173.1 171.0),(173.1 171.0,141.08 152.94)))'] assert feat.GetGeomFieldCount() == len(geom_field_values), 'geom field count wrong.' for i in range(feat.GetGeomFieldCount()): geom = feat.GetGeomFieldRef(i) if ogrtest.check_feature_geometry(geom, geom_field_values[i]) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # def test_ogr_interlis_cleanup(): if not gdaltest.have_ili_reader: pytest.skip() gdal.SetConfigOption('OGR_STROKE_CURVE', None) gdaltest.clean_tmp() gdalautotest-3.0.4/ogr/ogr_edigeo.py0000755003401500001440000001146513614005363017107 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_edigeo.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR EDIGEO 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 ogr import gdaltest import ogrtest import pytest ############################################################################### def test_ogr_edigeo_1(): filelist = ['E000AB01.THF', 'EDAB01S1.VEC', 'EDAB01SE.DIC', 'EDAB01SE.GEN', 'EDAB01SE.GEO', 'EDAB01SE.QAL', 'EDAB01SE.SCD', 'EDAB01T1.VEC', 'EDAB01T2.VEC', 'EDAB01T3.VEC'] # base_url = 'http://svn.geotools.org/trunk/modules/unsupported/edigeo/src/test/resources/org/geotools/data/edigeo/test-data/' base_url = 'https://raw.githubusercontent.com/geotools/geotools/master/modules/unsupported/edigeo/src/test/resources/org/geotools/data/edigeo/test-data/' for filename in filelist: if not gdaltest.download_file(base_url + filename, filename): pytest.skip() try: for filename in filelist: os.stat('tmp/cache/' + filename) except OSError: pytest.skip() ds = ogr.Open('tmp/cache/E000AB01.THF') assert ds.GetLayerCount() == 24 layers = [('BATIMENT_id', ogr.wkbPolygon, 107), ('BORNE_id', ogr.wkbPoint, 5), ('COMMUNE_id', ogr.wkbPolygon, 1), ('LIEUDIT_id', ogr.wkbPolygon, 3), ('NUMVOIE_id', ogr.wkbPoint, 43), ('PARCELLE_id', ogr.wkbPolygon, 155), ('SECTION_id', ogr.wkbPolygon, 1), ('SUBDFISC_id', ogr.wkbPolygon, 1), ('SUBDSECT_id', ogr.wkbPolygon, 1), ('SYMBLIM_id', ogr.wkbPoint, 29), ('TLINE_id', ogr.wkbLineString, 134), ('TPOINT_id', ogr.wkbPoint, 1), ('TRONFLUV_id', ogr.wkbPolygon, 3), ('TRONROUTE_id', ogr.wkbPolygon, 1), ('TSURF_id', ogr.wkbPolygon, 3), ('ZONCOMMUNI_id', ogr.wkbLineString, 15), ('ID_S_OBJ_Z_1_2_2', ogr.wkbPoint, 248), ] for l in layers: lyr = ds.GetLayerByName(l[0]) assert lyr.GetLayerDefn().GetGeomType() == l[1] assert lyr.GetFeatureCount() == l[2] if l[1] != ogr.wkbNone: assert lyr.GetSpatialRef().ExportToWkt().find('Lambert_Conformal_Conic_1SP') != -1 lyr = ds.GetLayerByName('BORNE_id') feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT (877171.28 72489.22)'): feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('BATIMENT_id') feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POLYGON ((877206.16 71888.82,877193.14 71865.51,877202.95 71860.07,877215.83 71883.5,877206.16 71888.82))'): feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('ZONCOMMUNI_id') feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'LINESTRING (877929.8 71656.39,877922.38 71663.72,877911.48 71669.51,877884.23 71675.64,877783.07 71694.04,877716.31 71706.98,877707.45 71709.71,877702.0 71713.79,877696.89 71719.58,877671.69 71761.82,877607.99 71865.03,877545.32 71959.04,877499.22 72026.82)'): feat.DumpReadable() pytest.fail() ds.Destroy() gdalautotest-3.0.4/ogr/ogr_mongodbv3.py0000755003401500001440000007502513614005363017553 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_mongodbv3.py d9f7fa611bf09986ea4695f4c5b36be798bf9a17 2019-01-13 13:53:53 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: MongoDBv3 driver testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2015-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 os import uuid import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test if driver is available def test_ogr_mongodbv3_init(): ogrtest.mongodbv3_drv = ogr.GetDriverByName('MongoDBv3') if ogrtest.mongodbv3_drv is None: pytest.skip() ogrtest.mongodbv3_test_uri = None ogrtest.mongodbv3_test_host = None ogrtest.mongodbv3_test_port = None ogrtest.mongodbv3_test_dbname = None ogrtest.mongodbv3_test_user = None ogrtest.mongodbv3_test_password = None if 'MONGODBV3_TEST_URI' in os.environ: ogrtest.mongodbv3_test_uri = os.environ['MONGODBV3_TEST_URI'] pos = ogrtest.mongodbv3_test_uri.rfind('/') assert pos > 0 ogrtest.mongodbv3_test_dbname = ogrtest.mongodbv3_test_uri[pos+1:] elif 'MONGODBV3_TEST_HOST' in os.environ: ogrtest.mongodbv3_test_host = os.environ['MONGODBV3_TEST_HOST'] if 'MONGODBV3_TEST_PORT' in os.environ: ogrtest.mongodbv3_test_port = int(os.environ['MONGODBV3_TEST_PORT']) else: ogrtest.mongodbv3_test_port = 27017 if 'MONGODBV3_TEST_DBNAME' in os.environ: ogrtest.mongodbv3_test_dbname = os.environ['MONGODBV3_TEST_DBNAME'] else: ogrtest.mongodbv3_test_dbname = 'gdalautotest' if 'MONGODBV3_TEST_USER' in os.environ: ogrtest.mongodbv3_test_user = os.environ['MONGODBV3_TEST_USER'] else: ogrtest.mongodbv3_test_user = None if 'MONGODBV3_TEST_PASSWORD' in os.environ: ogrtest.mongodbv3_test_password = os.environ['MONGODBV3_TEST_PASSWORD'] else: ogrtest.mongodbv3_test_password = None else: ogrtest.mongodbv3_drv = None pytest.skip() if ogrtest.mongodbv3_test_uri is None: if ogrtest.mongodbv3_test_user is not None: ogrtest.mongodbv3_test_uri = "mongodbv3:mongodb://%s:%s@%s:%d/%s" % (ogrtest.mongodbv3_test_user, ogrtest.mongodbv3_test_password, ogrtest.mongodbv3_test_host, ogrtest.mongodbv3_test_port, ogrtest.mongodbv3_test_dbname) else: ogrtest.mongodbv3_test_uri = "mongodbv3:mongodb://%s:%d/%s" % (ogrtest.mongodbv3_test_host, ogrtest.mongodbv3_test_port, ogrtest.mongodbv3_test_dbname) ogrtest.mongodbv3_layer_name = None ogrtest.mongodbv3_layer_name_no_ogr_metadata = None ogrtest.mongodbv3_layer_name_guess_types = None ogrtest.mongodbv3_layer_name_with_2d_index = None ogrtest.mongodbv3_layer_name_no_spatial_index = None ds = ogr.Open(ogrtest.mongodbv3_test_uri) if ds is None: ogrtest.mongodbv3_drv = None pytest.skip('cannot open %s' % ogrtest.mongodbv3_test_uri) ############################################################################### # Test various open methods def test_ogr_mongodbv3_1(): if ogrtest.mongodbv3_drv is None: pytest.skip() # Might work or not depending on how the db is set up gdal.PushErrorHandler() ds = ogr.Open("mongodbv3:") gdal.PopErrorHandler() # Wrong URI gdal.PushErrorHandler() ds = ogr.Open("mongodbv3:mongodb://") gdal.PopErrorHandler() assert ds is None # URI to non existent host. gdal.PushErrorHandler() ds = ogr.Open("mongodbv3:mongodb://non_existing") gdal.PopErrorHandler() assert ds is None # Connect to non existent host. gdal.PushErrorHandler() ds = gdal.OpenEx('mongodbv3:', open_options=['HOST=non_existing']) gdal.PopErrorHandler() assert ds is None if ogrtest.mongodbv3_test_host is None: return # All arguments split up open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] open_options += ['DBNAME=' + ogrtest.mongodbv3_test_dbname] if ogrtest.mongodbv3_test_user is not None: open_options += ['USER=' + ogrtest.mongodbv3_test_user] open_options += ['PASSWORD=' + ogrtest.mongodbv3_test_password] ds = gdal.OpenEx('mongodbv3:', open_options=open_options) assert ds is not None # Without DBNAME open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] if ogrtest.mongodbv3_test_user is not None: open_options += ['AUTH_DBNAME=' + ogrtest.mongodbv3_test_dbname] open_options += ['USER=' + ogrtest.mongodbv3_test_user] open_options += ['PASSWORD=' + ogrtest.mongodbv3_test_password] gdal.PushErrorHandler() # Will succeed only against server in single mode ds = gdal.OpenEx('mongodbv3:', open_options=open_options) gdal.PopErrorHandler() # A few error cases with authentication if ogrtest.mongodbv3_test_user is not None: open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] open_options += ['DBNAME=' + ogrtest.mongodbv3_test_dbname] # Missing user and password gdal.PushErrorHandler() ds = gdal.OpenEx('mongodbv3:', open_options=open_options) gdal.PopErrorHandler() assert ds is None open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] open_options += ['DBNAME=' + ogrtest.mongodbv3_test_dbname] open_options += ['USER=' + ogrtest.mongodbv3_test_user] # Missing password gdal.PushErrorHandler() ds = gdal.OpenEx('mongodbv3:', open_options=open_options) gdal.PopErrorHandler() assert ds is None open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] open_options += ['USER=' + ogrtest.mongodbv3_test_user] open_options += ['PASSWORD=' + ogrtest.mongodbv3_test_password] # Missing DBNAME gdal.PushErrorHandler() ds = gdal.OpenEx('mongodbv3:', open_options=open_options) gdal.PopErrorHandler() assert ds is None open_options = [] open_options += ['HOST=' + ogrtest.mongodbv3_test_host] open_options += ['PORT=' + str(ogrtest.mongodbv3_test_port)] open_options += ['DBNAME=' + ogrtest.mongodbv3_test_dbname] open_options += ['USER=' + ogrtest.mongodbv3_test_user] open_options += ['PASSWORDv3=' + ogrtest.mongodbv3_test_password + '_wrong'] # Wrong password gdal.PushErrorHandler() ds = gdal.OpenEx('mongodb:', open_options=open_options) gdal.PopErrorHandler() assert ds is None ############################################################################### # Basic tests def test_ogr_mongodbv3_2(): if ogrtest.mongodbv3_drv is None: pytest.skip() ogrtest.mongodbv3_ds = ogr.Open(ogrtest.mongodbv3_test_uri, update=1) assert ogrtest.mongodbv3_ds.GetLayerByName('not_existing') is None assert ogrtest.mongodbv3_ds.TestCapability(ogr.ODsCCreateLayer) == 1 assert ogrtest.mongodbv3_ds.TestCapability(ogr.ODsCDeleteLayer) == 1 assert ogrtest.mongodbv3_ds.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) == 1 # Create layer a_uuid = str(uuid.uuid1()).replace('-', '_') ogrtest.mongodbv3_layer_name = 'test_' + a_uuid srs = osr.SpatialReference() srs.SetFromUserInput('+proj=longlat +ellps=WGS84 +towgs84=0,0,0') lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name, geom_type=ogr.wkbPolygon, srs=srs, options=['GEOMETRY_NAME=location.mygeom', 'FID=']) gdal.PushErrorHandler() ret = lyr.CreateGeomField(ogr.GeomFieldDefn('location.mygeom', ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) assert ret == 0 gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 lyr.CreateField(ogr.FieldDefn('location.name', ogr.OFTString)) bool_field = ogr.FieldDefn('bool', ogr.OFTInteger) bool_field.SetSubType(ogr.OFSTBoolean) lyr.CreateField(bool_field) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('dt', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('embed.str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('binary', ogr.OFTBinary)) lyr.CreateField(ogr.FieldDefn('strlist', ogr.OFTStringList)) lyr.CreateField(ogr.FieldDefn('intlist', ogr.OFTIntegerList)) lyr.CreateField(ogr.FieldDefn('int64list', ogr.OFTInteger64List)) lyr.CreateField(ogr.FieldDefn('realist', ogr.OFTRealList)) lyr.CreateField(ogr.FieldDefn('embed.embed2.int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('embed.embed2.real', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('str_is_null', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('str_is_unset', ogr.OFTString)) # Test CreateFeature() f = ogr.Feature(lyr.GetLayerDefn()) f['str'] = 'str' f['location.name'] = 'Paris' f['bool'] = 1 f['int'] = 1 f['int64'] = 1234567890123456 # put a number larger than 1 << 40 so that fromjson() doesn't pick double f['real'] = 1.23 f['dt'] = '1234/12/31 23:59:59.123+00' f.SetFieldBinaryFromHexString('binary', '00FF') f['strlist'] = ['a', 'b'] f['intlist'] = [1, 2] f['int64list'] = [1234567890123456, 1234567890123456] f['realist'] = [1.23, 4.56] f['embed.str'] = 'foo' f['embed.embed2.int'] = 3 f['embed.embed2.real'] = 3.45 f.SetFieldNull('str_is_null') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POLYGON((2 49,2 50,3 50,3 49,2 49))')) assert lyr.CreateFeature(f) == 0 assert f['_id'] is not None f_ref = f.Clone() # Test GetFeatureCount() assert lyr.GetFeatureCount() == 1 # Test GetNextFeature() lyr.ResetReading() f = lyr.GetNextFeature() if not f.Equal(f_ref): f.DumpReadable() f_ref.DumpReadable() print(ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef(), max_error=0)) print(gdaltest.reason) pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() # Test GetFeature() f = lyr.GetFeature(1) if not f.Equal(f_ref): f.DumpReadable() pytest.fail() # Test SetFeature() f['bool'] = 0 assert lyr.SetFeature(f) == 0 f_ref = f.Clone() f = lyr.GetFeature(1) if f['bool'] != 0: f.DumpReadable() pytest.fail() # Test (not working) DeleteFeature() gdal.PushErrorHandler() ret = lyr.DeleteFeature(1) gdal.PopErrorHandler() assert ret != 0 # Test Mongo filter lyr.SetAttributeFilter('{ "int": 1 }') lyr.ResetReading() f = lyr.GetNextFeature() if not f.Equal(f_ref): f.DumpReadable() pytest.fail() lyr.SetAttributeFilter('{ "int": 2 }') lyr.ResetReading() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() # Test OGR filter lyr.SetAttributeFilter('int = 1') lyr.ResetReading() f = lyr.GetNextFeature() if not f.Equal(f_ref): f.DumpReadable() pytest.fail() lyr.SetAttributeFilter('int = 2') lyr.ResetReading() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() # Test geometry filter lyr.SetAttributeFilter(None) lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9) lyr.ResetReading() f = lyr.GetNextFeature() if not f.Equal(f_ref): f.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(1.1, 49.1, 1.9, 49.9) lyr.ResetReading() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() f = f_ref.Clone() f.SetFID(-1) f.SetGeometryDirectly(None) assert lyr.CreateFeature(f) == 0 # Duplicate key gdal.PushErrorHandler() ret = lyr.SyncToDisk() gdal.PopErrorHandler() assert ret != 0 f['_id'] = None lyr.CreateFeature(f) ret = lyr.SyncToDisk() assert ret == 0 # Missing _id f.UnsetField('_id') with gdaltest.error_handler(): ret = lyr.SetFeature(f) assert ret != 0 # MongoDB dialect of ExecuteSQL() with invalid JSON with gdaltest.error_handler(): sql_lyr = ogrtest.mongodbv3_ds.ExecuteSQL('{', dialect='MongoDB') # MongoDB dialect of ExecuteSQL() with nonexistent command. with gdaltest.error_handler(): sql_lyr = ogrtest.mongodbv3_ds.ExecuteSQL('{ "foo": 1 }', dialect='MongoDB') assert sql_lyr is None # MongoDB dialect of ExecuteSQL() with existing commnand sql_lyr = ogrtest.mongodbv3_ds.ExecuteSQL('{ "listCommands" : 1 }', dialect='MongoDB') assert sql_lyr is not None f = sql_lyr.GetNextFeature() assert f is not None f = sql_lyr.GetNextFeature() assert f is None sql_lyr.GetLayerDefn() sql_lyr.ResetReading() sql_lyr.TestCapability('') ogrtest.mongodbv3_ds.ReleaseResultSet(sql_lyr) # Regular ExecuteSQL() sql_lyr = ogrtest.mongodbv3_ds.ExecuteSQL('SELECT * FROM ' + ogrtest.mongodbv3_layer_name) assert sql_lyr is not None ogrtest.mongodbv3_ds.ReleaseResultSet(sql_lyr) # Test CreateLayer again with same name with gdaltest.error_handler(): lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name) assert lyr is None ogrtest.mongodbv3_ds = gdal.OpenEx(ogrtest.mongodbv3_test_uri, gdal.OF_UPDATE, open_options=['FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=-1', 'BULK_INSERT=NO', 'JSON_FIELD=TRUE']) # Check after reopening lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) != 0 f = lyr.GetNextFeature() json_field = f['_json'] # We cannot use feature.Equal() has the C++ layer defn has changed for i in range(f_ref.GetDefnRef().GetFieldCount()): if f.GetField(i) != f_ref.GetField(i) or \ f.GetFieldDefnRef(i).GetType() != f_ref.GetFieldDefnRef(i).GetType() or \ f.GetFieldDefnRef(i).GetSubType() != f_ref.GetFieldDefnRef(i).GetSubType(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() for i in range(f_ref.GetDefnRef().GetGeomFieldCount()): if not f.GetGeomFieldRef(i).Equals(f_ref.GetGeomFieldRef(i)) or \ f.GetGeomFieldDefnRef(i).GetName() != f_ref.GetGeomFieldDefnRef(i).GetName() or \ f.GetGeomFieldDefnRef(i).GetType() != f_ref.GetGeomFieldDefnRef(i).GetType(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9) lyr.ResetReading() if f is None: f.DumpReadable() pytest.fail() # Create a feature only from its _json content and do not store any ogr metadata related to the layer ogrtest.mongodbv3_layer_name_no_ogr_metadata = ogrtest.mongodbv3_layer_name + "_no_ogr_metadata" lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name_no_ogr_metadata, options=['GEOMETRY_NAME=location.mygeom', 'FID=', 'WRITE_OGR_METADATA=NO']) f = ogr.Feature(lyr.GetLayerDefn()) f['_json'] = json_field assert lyr.CreateFeature(f) == 0 ogrtest.mongodbv3_layer_name_guess_types = ogrtest.mongodbv3_layer_name + "_guess_types" lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name_guess_types, geom_type=ogr.wkbNone, options=['FID=', 'WRITE_OGR_METADATA=NO']) f = ogr.Feature(lyr.GetLayerDefn()) f['_json'] = '{' f['_json'] += '"int": 2, ' f['_json'] += '"int64": { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"real": 2.34, ' f['_json'] += '"intlist" : [2], ' f['_json'] += '"reallist" : [2.34], ' f['_json'] += '"int64list" : [{ "$numberLong" : "1234567890123456" }], ' f['_json'] += '"int_str" : 2, ' f['_json'] += '"str_int" : "2", ' f['_json'] += '"int64_str" : { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"str_int64" : "2", ' f['_json'] += '"int_int64": 2, ' f['_json'] += '"int64_int": { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"int_real": 2, ' f['_json'] += '"real_int": 3.45, ' f['_json'] += '"int64_real": { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"real_int64": 3.45, ' f['_json'] += '"real_str": 3.45, ' f['_json'] += '"str_real": "3.45", ' f['_json'] += '"int_bool" : 2, ' f['_json'] += '"bool_int" : true, ' f['_json'] += '"intlist_strlist" : [2], ' f['_json'] += '"strlist_intlist" : ["2"], ' f['_json'] += '"intlist_int64list": [2], ' f['_json'] += '"int64list_intlist": [{ "$numberLong" : "1234567890123456" }], ' f['_json'] += '"intlist_reallist": [2], ' f['_json'] += '"reallist_intlist": [3.45], ' f['_json'] += '"int64list_reallist": [{ "$numberLong" : "1234567890123456" }], ' f['_json'] += '"reallist_int64list": [3.45], ' f['_json'] += '"intlist_boollist" : [2], ' f['_json'] += '"boollist_intlist" : [true], ' f['_json'] += '"mixedlist": [true,1,{ "$numberLong" : "1234567890123456" },3.45],' f['_json'] += '"mixedlist2": [true,1,{ "$numberLong" : "1234567890123456" },3.45,"str"]' f['_json'] += '}' assert lyr.CreateFeature(f) == 0 f = ogr.Feature(lyr.GetLayerDefn()) f['_json'] = '{' f['_json'] += '"int_str" : "3", ' f['_json'] += '"str_int" : 3, ' f['_json'] += '"int64_str" : "2", ' f['_json'] += '"str_int64" : { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"int_int64": { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"int64_int": 2, ' f['_json'] += '"int_real" : 3.45, ' f['_json'] += '"real_int": 2, ' f['_json'] += '"int64_real": 3.45, ' f['_json'] += '"real_int64": { "$numberLong" : "1234567890123456" }, ' f['_json'] += '"real_str": "3.45", ' f['_json'] += '"str_real": 3.45, ' f['_json'] += '"int_bool" : true, ' f['_json'] += '"bool_int" : 2, ' f['_json'] += '"intlist_strlist" : ["3"], ' f['_json'] += '"strlist_intlist" : [3], ' f['_json'] += '"intlist_int64list": [{ "$numberLong" : "1234567890123456" }], ' f['_json'] += '"int64list_intlist": [2], ' f['_json'] += '"intlist_reallist": [3.45], ' f['_json'] += '"reallist_intlist": [2], ' f['_json'] += '"int64list_reallist": [3.45], ' f['_json'] += '"reallist_int64list": [{ "$numberLong" : "1234567890123456" }], ' f['_json'] += '"intlist_boollist" : [true], ' f['_json'] += '"boollist_intlist" : [2]' f['_json'] += '}' assert lyr.CreateFeature(f) == 0 # This new features will not be taken into account by below the FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=2 f = ogr.Feature(lyr.GetLayerDefn()) f['_json'] = '{' f['_json'] += '"int": { "$minKey": 1 }, ' f['_json'] += '"int64": { "$minKey": 1 }, ' f['_json'] += '"real": { "$minKey": 1 }, ' f['_json'] += '"intlist" : [1, "1", { "$minKey": 1 },{ "$maxKey": 1 },{ "$numberLong" : "-1234567890123456" }, { "$numberLong" : "1234567890123456" }, -1234567890123456.1, 1234567890123456.1, { "$numberLong" : "1" }, 1.23 ], ' f['_json'] += '"int64list" : [1, { "$numberLong" : "1234567890123456" }, "1", { "$minKey": 1 },{ "$maxKey": 1 }, -1e300, 1e300, 1.23 ], ' f['_json'] += '"reallist" : [1, { "$numberLong" : "1234567890123456" }, 1.0, "1", { "$minKey": 1 },{ "$maxKey": 1 }, { "$numberLong" : "1234567890123456" } ] ' f['_json'] += '}' assert lyr.CreateFeature(f) == 0 f = ogr.Feature(lyr.GetLayerDefn()) f['_json'] = '{' f['_json'] += '"int": { "$maxKey": 1 }, ' f['_json'] += '"int64": { "$maxKey": 1 }, ' f['_json'] += '"real": { "$maxKey": 1 } ' f['_json'] += '}' assert lyr.CreateFeature(f) == 0 ogrtest.mongodbv3_layer_name_with_2d_index = ogrtest.mongodbv3_layer_name + "_with_2d_index" gdal.SetConfigOption('OGR_MONGODB_SPAT_INDEX_TYPE', '2d') lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name_with_2d_index, geom_type=ogr.wkbPoint, options=['FID=', 'WRITE_OGR_METADATA=NO']) gdal.SetConfigOption('OGR_MONGODB_SPAT_INDEX_TYPE', None) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2 49)')) assert lyr.CreateFeature(f) == 0 ogrtest.mongodbv3_layer_name_no_spatial_index = ogrtest.mongodbv3_layer_name + "_no_spatial_index" for i in range(2): lyr = ogrtest.mongodbv3_ds.CreateLayer(ogrtest.mongodbv3_layer_name_no_spatial_index, options=['SPATIAL_INDEX=NO', 'OVERWRITE=YES']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2 49)')) assert lyr.CreateFeature(f) == 0 ogrtest.mongodbv3_ds.ExecuteSQL('WRITE_OGR_METADATA ' + ogrtest.mongodbv3_layer_name_no_spatial_index) # Open "ghost" layer lyr = ogrtest.mongodbv3_ds.GetLayerByName('_ogr_metadata') assert lyr is not None lyr.SetAttributeFilter("layer LIKE '%s%%'" % ogrtest.mongodbv3_layer_name) assert lyr.GetFeatureCount() == 2 assert ogrtest.mongodbv3_ds.DeleteLayer(-1) != 0 lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_test_dbname + '.' + '_ogr_metadata') assert lyr is not None ogrtest.mongodbv3_ds = None # Reopen in read-only ogrtest.mongodbv3_ds = gdal.OpenEx(ogrtest.mongodbv3_test_uri, 0, open_options=['FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=2', 'JSON_FIELD=TRUE']) lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name_no_ogr_metadata) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0 f = lyr.GetNextFeature() for i in range(f_ref.GetDefnRef().GetFieldCount()): if f_ref.GetFieldDefnRef(i).GetNameRef() == "str_is_null": continue if f_ref.GetFieldDefnRef(i).GetNameRef() == "str_is_unset": continue # Order might be a bit different... j = f.GetDefnRef().GetFieldIndex(f_ref.GetFieldDefnRef(i).GetNameRef()) if f.GetField(j) != f_ref.GetField(i) or \ f.GetFieldDefnRef(j).GetType() != f_ref.GetFieldDefnRef(i).GetType() or \ f.GetFieldDefnRef(j).GetSubType() != f_ref.GetFieldDefnRef(i).GetSubType(): f.DumpReadable() f_ref.DumpReadable() pytest.fail() for i in range(f_ref.GetDefnRef().GetGeomFieldCount()): # Order might be a bit different... j = f.GetDefnRef().GetGeomFieldIndex(f_ref.GetGeomFieldDefnRef(i).GetNameRef()) if not f.GetGeomFieldRef(j).Equals(f_ref.GetGeomFieldRef(i)) or \ f.GetGeomFieldDefnRef(j).GetName() != f_ref.GetGeomFieldDefnRef(i).GetName() or \ f.GetGeomFieldDefnRef(j).GetType() != f_ref.GetGeomFieldDefnRef(i).GetType(): f.DumpReadable() f_ref.DumpReadable() print(f_ref.GetGeomFieldDefnRef(i).GetType()) pytest.fail(f.GetGeomFieldDefnRef(j).GetType()) lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9) lyr.ResetReading() if f is None: f.DumpReadable() pytest.fail() lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name_guess_types) expected_fields = [ ("int", ogr.OFTInteger), ("int64", ogr.OFTInteger64), ("real", ogr.OFTReal), ("intlist", ogr.OFTIntegerList), ("reallist", ogr.OFTRealList), ("int64list", ogr.OFTInteger64List), ("int_str", ogr.OFTString), ("str_int", ogr.OFTString), ("int64_str", ogr.OFTString), ("str_int64", ogr.OFTString), ("int_int64", ogr.OFTInteger64), ("int64_int", ogr.OFTInteger64), ("int_real", ogr.OFTReal), ("real_int", ogr.OFTReal), ("int64_real", ogr.OFTReal), ("real_int64", ogr.OFTReal), ("real_str", ogr.OFTString), ("str_real", ogr.OFTString), ("int_bool", ogr.OFTInteger), ("bool_int", ogr.OFTInteger), ("intlist_strlist", ogr.OFTStringList), ("strlist_intlist", ogr.OFTStringList), ("intlist_int64list", ogr.OFTInteger64List), ("int64list_intlist", ogr.OFTInteger64List), ("intlist_reallist", ogr.OFTRealList), ("reallist_intlist", ogr.OFTRealList), ("int64list_reallist", ogr.OFTRealList), ("reallist_int64list", ogr.OFTRealList), ("intlist_boollist", ogr.OFTIntegerList), ("boollist_intlist", ogr.OFTIntegerList), ("mixedlist", ogr.OFTRealList), ("mixedlist2", ogr.OFTStringList)] for (fieldname, fieldtype) in expected_fields: fld_defn = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex(fieldname)) assert fld_defn.GetType() == fieldtype, fieldname assert fld_defn.GetSubType() == ogr.OFSTNone f = lyr.GetNextFeature() f = lyr.GetNextFeature() f = lyr.GetNextFeature() if f['intlist'] != [1, 1, -2147483648, 2147483647, -2147483648, 2147483647, -2147483648, 2147483647, 1, 1] or \ f['int64list'] != [1, 1234567890123456, 1, -9223372036854775808, 9223372036854775807, -9223372036854775808, 9223372036854775807, 1] or \ f['int'] != -2147483648 or f['int64'] != -9223372036854775808 or f['real'] - 1 != f['real']: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['int'] != 2147483647 or f['int64'] != 9223372036854775807 or f['real'] + 1 != f['real']: f.DumpReadable() pytest.fail() lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name_with_2d_index) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) != 0 lyr.SetSpatialFilterRect(1.9, 48.9, 2.1, 49.1) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None lyr.SetSpatialFilterRect(1.9, 48.9, 1.95, 48.95) lyr.ResetReading() f = lyr.GetNextFeature() assert f is None lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name_no_spatial_index) assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0 lyr.SetSpatialFilterRect(1.9, 48.9, 2.1, 49.1) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None gdal.PushErrorHandler() lyr = ogrtest.mongodbv3_ds.CreateLayer('foo') gdal.PopErrorHandler() assert lyr is None gdal.ErrorReset() gdal.PushErrorHandler() ogrtest.mongodbv3_ds.ExecuteSQL('WRITE_OGR_METADATA ' + ogrtest.mongodbv3_layer_name) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' lyr_count_before = ogrtest.mongodbv3_ds.GetLayerCount() gdal.PushErrorHandler() ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name) gdal.PopErrorHandler() assert ogrtest.mongodbv3_ds.GetLayerCount() == lyr_count_before lyr = ogrtest.mongodbv3_ds.GetLayerByName(ogrtest.mongodbv3_layer_name) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foo', ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.DeleteFeature(1) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # test_ogrsf def test_ogr_mongodbv3_3(): if ogrtest.mongodbv3_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro ' + ogrtest.mongodbv3_test_uri) assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Cleanup def test_ogr_mongodbv3_cleanup(): if ogrtest.mongodbv3_drv is None: pytest.skip() ogrtest.mongodbv3_ds = None # Reopen in read-write ogrtest.mongodbv3_ds = ogr.Open(ogrtest.mongodbv3_test_uri, update=1) if ogrtest.mongodbv3_layer_name is not None: ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name) if ogrtest.mongodbv3_layer_name_no_ogr_metadata is not None: ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name_no_ogr_metadata) if ogrtest.mongodbv3_layer_name_guess_types is not None: ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name_guess_types) if ogrtest.mongodbv3_layer_name_with_2d_index is not None: ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name_with_2d_index) if ogrtest.mongodbv3_layer_name_no_spatial_index is not None: ogrtest.mongodbv3_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodbv3_layer_name_no_spatial_index) ogrtest.mongodbv3_ds = None gdalautotest-3.0.4/ogr/ogr_pcidsk.py0000755003401500001440000002403213614005363017122 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_pcidsk.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test PCIDSK driver functionality. # 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 import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest wkts = [('POINT (0 1 2)', 'points', 0), ('LINESTRING (0 1 2,3 4 5)', 'lines', 0), ('POINT (0 1 2)', 'points2', 4326), ('LINESTRING (0 1 2,3 4 5)', 'lines2', 32631), ] ############################################################################### # Test creation def test_ogr_pcidsk_1(): ogr_drv = ogr.GetDriverByName('PCIDSK') if ogr_drv is None: pytest.skip() ds = ogr_drv.CreateDataSource('tmp/ogr_pcidsk_1.pix') lyr = ds.CreateLayer('nothing', geom_type=ogr.wkbNone) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None lyr = ds.CreateLayer('fields', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo2') feat.SetField(1, 1) feat.SetField(2, 3.45) lyr.CreateFeature(feat) feat.SetField(0, 'foo') lyr.SetFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'bar') lyr.CreateFeature(feat) assert lyr.GetFeatureCount() == 2 lyr.DeleteFeature(1) assert lyr.GetFeatureCount() == 1 lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None assert feat.GetField(0) == 'foo' assert feat.GetField(1) == 1 assert feat.GetField(2) == 3.45 for (wkt, layername, epsgcode) in wkts: geom = ogr.CreateGeometryFromWkt(wkt) if epsgcode != 0: srs = osr.SpatialReference() srs.ImportFromEPSG(epsgcode) else: srs = None lyr = ds.CreateLayer(layername, geom_type=geom.GetGeometryType(), srs=srs) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) lyr.CreateFeature(feat) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None, layername if feat.GetGeometryRef().ExportToWkt() != wkt: feat.DumpReadable() pytest.fail(layername) ds = None ############################################################################### # Test reading def test_ogr_pcidsk_2(): ogr_drv = ogr.GetDriverByName('PCIDSK') if ogr_drv is None: pytest.skip() ds = ogr.Open('tmp/ogr_pcidsk_1.pix') assert ds.GetLayerCount() == 2 + len(wkts) lyr = ds.GetLayerByName('nothing') assert lyr.GetGeomType() == ogr.wkbNone feat = lyr.GetNextFeature() assert feat is not None lyr = ds.GetLayerByName('fields') feat = lyr.GetNextFeature() assert feat is not None assert feat.GetField(0) == 'foo' assert feat.GetField(1) == 1 assert feat.GetField(2) == 3.45 for (wkt, layername, epsgcode) in wkts: geom = ogr.CreateGeometryFromWkt(wkt) lyr = ds.GetLayerByName(layername) assert lyr.GetGeomType() == geom.GetGeometryType(), layername srs = lyr.GetSpatialRef() if epsgcode != 0: ref_srs = osr.SpatialReference() ref_srs.ImportFromEPSG(epsgcode) assert srs is not None and ref_srs.IsSame(srs) == 1, layername feat = lyr.GetNextFeature() assert feat is not None, layername if feat.GetGeometryRef().ExportToWkt() != wkt: feat.DumpReadable() pytest.fail(layername) ds = None ############################################################################### # Check with test_ogrsf def test_ogr_pcidsk_3(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/ogr_pcidsk_1.pix') ret_str = 'success' if ret.find("ERROR: The feature was not deleted") != -1: # Expected fail for now print("ERROR: The feature was not deleted") ret = ret.replace("ERROR: The feature was not deleted", "ARGHH: The feature was not deleted") ret_str = 'expected_fail' if ret.find('ERROR') == ret.find('ERROR ret code = 1'): ret = ret.replace("ERROR ret code = 1", "") if ret.find('INFO') == -1 or ret.find('ERROR') != -1: print(ret) ret_str = 'fail' return ret_str ############################################################################### # Test that we cannot open a raster only pcidsk in read-only mode def test_ogr_pcidsk_4(): if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() if gdal.GetDriverByName('PCIDSK') is None: pytest.skip() ds = ogr.Open('../gdrivers/data/utm.pix') assert ds is None ds = None ############################################################################### # Test that we can open a raster only pcidsk in update mode def test_ogr_pcidsk_5(): if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() if gdal.GetDriverByName('PCIDSK') is None: pytest.skip() ds = ogr.Open('../gdrivers/data/utm.pix', update=1) assert ds is not None ds = None ############################################################################### def test_ogr_pcidsk_add_field_to_non_empty_layer(): if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() tmpfile = '/vsimem/tmp.pix' ds = ogr.GetDriverByName('PCIDSK').CreateDataSource(tmpfile) lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar' lyr.CreateFeature(f) f = None with gdaltest.error_handler(): assert lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTString)) != 0 f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar2' lyr.CreateFeature(f) f = None ds = None ogr.GetDriverByName('PCIDSK').DeleteDataSource(tmpfile) ############################################################################### def test_ogr_pcidsk_too_many_layers(): if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() tmpfile = '/vsimem/tmp.pix' ds = ogr.GetDriverByName('PCIDSK').CreateDataSource(tmpfile) for i in range(1023): ds.CreateLayer('foo%d' % i) with gdaltest.error_handler(): assert ds.CreateLayer('foo') is None ds = None ogr.GetDriverByName('PCIDSK').DeleteDataSource(tmpfile) ############################################################################### # Check a polygon layer def test_ogr_pcidsk_online_1(): if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/pcidsk/sdk_testsuite/polygon.pix', 'polygon.pix'): pytest.skip() ds = ogr.Open('tmp/cache/polygon.pix') assert ds is not None lyr = ds.GetLayer(0) assert lyr is not None feat = lyr.GetNextFeature() assert feat is not None geom = 'POLYGON ((479819.84375 4765180.5 0,479690.1875 4765259.5 0,479647.0 4765369.5 0,479730.375 4765400.5 0,480039.03125 4765539.5 0,480035.34375 4765558.5 0,480159.78125 4765610.5 0,480202.28125 4765482.0 0,480365.0 4765015.5 0,480389.6875 4764950.0 0,480133.96875 4764856.5 0,480080.28125 4764979.5 0,480082.96875 4765049.5 0,480088.8125 4765139.5 0,480059.90625 4765239.5 0,480019.71875 4765319.5 0,479980.21875 4765409.5 0,479909.875 4765370.0 0,479859.875 4765270.0 0,479819.84375 4765180.5 0))' if ogrtest.check_feature_geometry(feat, geom) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Check a polygon layer def test_ogr_pcidsk_online_2(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() if ogr.GetDriverByName('PCIDSK') is None: pytest.skip() if not gdaltest.download_file('http://download.osgeo.org/gdal/data/pcidsk/sdk_testsuite/polygon.pix', 'polygon.pix'): pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/cache/polygon.pix') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Cleanup def test_ogr_pcidsk_cleanup(): gdal.Unlink('tmp/ogr_pcidsk_1.pix') gdalautotest-3.0.4/ogr/ogr_csw.py0000755003401500001440000011027413614005363016445 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_csw.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: CSW driver testing. # 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 pytest import gdaltest from osgeo import ogr from osgeo import gdal ############################################################################### # Test underlying OGR drivers # pytestmark = pytest.mark.require_driver('CSW') @pytest.fixture(autouse=True, scope='module') def ogr_csw_init(): gdaltest.csw_drv = ogr.GetDriverByName('CSW') gml_ds = ogr.Open('data/ionic_wfs.gml') if gml_ds is None: gdaltest.csw_drv = None if gdal.GetLastErrorMsg().find('Xerces') != -1: pytest.skip() pytest.skip('failed to open test file.') ############################################################################### # Test reading a pyCSW server @pytest.mark.skip() def test_ogr_csw_pycsw(): ds = ogr.Open('CSW:http://catalog.data.gov/csw') if ds is None: if gdaltest.gdalurlopen('http://catalog.data.gov/csw') is None: pytest.skip('cannot open URL') pytest.skip('did not managed to open CSW datastore') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None, 'did not get expected layer name' ############################################################################### def test_ogr_csw_vsimem_fail_because_not_enabled(): gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None ############################################################################### def test_ogr_csw_vsimem_fail_because_no_get_capabilities(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None ############################################################################### def test_ogr_csw_vsimem_fail_because_empty_response(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Empty content returned by server') >= 0 ############################################################################### def test_ogr_csw_vsimem_fail_because_no_CSW_Capabilities(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find Capabilities.version') >= 0 ############################################################################### def test_ogr_csw_vsimem_fail_because_exception(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Error returned by server : ') >= 0 ############################################################################### def test_ogr_csw_vsimem_fail_because_invalid_xml_capabilities(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', '= 0 ############################################################################### def test_ogr_csw_vsimem_fail_because_missing_version(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', """ """) gdal.PushErrorHandler() ds = ogr.Open('CSW:/vsimem/csw_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find Capabilities.version') >= 0 ############################################################################### def test_ogr_csw_vsimem_csw_minimal_instance(): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') # Invalid response, but enough for use gdal.FileFromMemBuffer('/vsimem/csw_endpoint?SERVICE=CSW&REQUEST=GetCapabilities', """ """) ds = ogr.Open('CSW:/vsimem/csw_endpoint') assert ds is not None ds.TestCapability('foo') assert ds.GetLayerCount() == 1 assert ds.GetLayer(-1) is None and ds.GetLayer(1) is None lyr = ds.GetLayer(0) lyr.TestCapability('foo') gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 0 gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Empty content returned by server') >= 0 gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """= 0 gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Error: cannot parse') >= 0 gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Error returned by server') >= 0 gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """ an_identifier another_identifier a_title dataset a_subject another_subject http://foo/ http://bar/ 2015-04-27 an_abstract 2015-04-27 eng a_format another_format -90 -180 90 180 """) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None if f['identifier'] != 'an_identifier' or f['other_identifiers'] != ['another_identifier'] or \ f['subject'] != 'a_subject' or f['other_subjects'] != ['another_subject'] or \ f['references'] != 'http://foo/' or f['other_references'] != ['http://bar/'] or \ f['format'] != 'a_format' or f['other_formats'] != ['another_format'] or \ f['boundingbox'].ExportToWkt() != 'POLYGON ((-180 -90,-180 90,180 90,180 -90,-180 -90))': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is not None gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2 lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """ """) f = lyr.GetNextFeature() assert f is not None f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """ """) f = lyr.GetNextFeature() assert f is None gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 3, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 3, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 3, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """""") gdal.PushErrorHandler() fc = lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 3, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """ """) fc = lyr.GetFeatureCount() assert fc == 200 lyr.SetAttributeFilter("identifier = 'an_identifier'") lyr.SetSpatialFilterRect(-180, -90, 180, 90) gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=fullows:BoundingBox-90 -18090 180dc:identifieran_identifier""", """ """) f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=fullows:BoundingBox-90 -18090 180dc:identifieran_identifier""", """ """) fc = lyr.GetFeatureCount() assert fc == 300 lyr.SetAttributeFilter("identifier = 'an_identifier' AND " + "references = 'http://foo/' AND " + "anytext LIKE '%%foo%%' AND " + "other_identifiers = '' AND " + "other_subjects = '' AND " + "other_formats = '' AND " + "other_references = '' AND " + "ST_Intersects(boundingbox, ST_MakeEnvelope(2,49,2,49,4326))") lyr.SetAttributeFilter(None) lyr.SetSpatialFilter(None) ############################################################################### def test_ogr_csw_vsimem_csw_output_schema_csw(): ds = gdal.OpenEx('CSW:/vsimem/csw_endpoint', open_options=['OUTPUT_SCHEMA=CSW']) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """full""", """""") lyr.ResetReading() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None gdal.FileFromMemBuffer("""/vsimem/csw_endpoint&POSTFIELDS=full""", """ -90 -180 90 180 """) lyr.ResetReading() f = lyr.GetNextFeature() if f['raw_xml'].find('full""", """ -180 180 -90 90 """) f = lyr.GetNextFeature() if f['raw_xml'].find('full""", """ -180 180 90 -90 """) f = lyr.GetNextFeature() if f['raw_xml'].find(' # ############################################################################### # Copyright (c) 2007, Matuesz Loskot # 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 gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Test basic open operation for KML datastore. # def test_ogr_kml_datastore(): ogrtest.kml_ds = None ogrtest.have_read_kml = 0 ogrtest.kml_drv = None ogrtest.libkml_drv = None ogrtest.kml_drv = ogr.GetDriverByName('KML') if ogrtest.kml_drv is None: pytest.skip() ogrtest.libkml_drv = ogr.GetDriverByName('LIBKML') # Unregister LIBKML driver if present as it's behaviour is not identical # to old KML driver if ogrtest.libkml_drv is not None: print('Unregister LIBKML driver') ogrtest.libkml_drv.Deregister() ogrtest.kml_ds = ogr.Open('data/samples.kml') if ogrtest.kml_ds is not None: ogrtest.have_read_kml = 1 if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds.GetLayerCount() == 6, 'wrong number of layers' ############################################################################### # Test reading attributes for first layer (point). # def test_ogr_kml_attributes_1(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Placemarks') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Simple placemark', 'Wrong name field value' if feat.GetField('description')[:23] != 'Attached to the ground.': print('got: ', feat.GetField('description')[:23]) pytest.fail('Wrong description field value') feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Floating placemark', 'Wrong name field value' if feat.GetField('description')[:25] != 'Floats a defined distance': print('got: ', feat.GetField('description')[:25]) pytest.fail('Wrong description field value') feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Extruded placemark', 'Wrong name field value' if feat.GetField('description') != 'Tethered to the ground by a customizable \"tail\"': print('got: ', feat.GetField('description')) pytest.fail('Wrong description field value') ############################################################################### # Test reading attributes for another layer (point). # def test_ogr_kml_attributes_2(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Highlighted Icon') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Roll over this icon', 'Wrong name field value' assert feat.GetField('description') == '', 'Wrong description field value' feat = lyr.GetNextFeature() assert feat is None, 'unexpected feature found.' ############################################################################### # Test reading attributes for another layer (linestring). # def test_ogr_kml_attributes_3(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Paths') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Tessellated', 'Wrong name field value' assert feat.GetField('description') == 'If the tag has a value of 1, the line will contour to the underlying terrain', \ 'Wrong description field value' feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Untessellated', 'Wrong name field value' assert feat.GetField('description') == 'If the tag has a value of 0, the line follow a simple straight-line path from point to point', \ 'Wrong description field value' feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' ############################################################################### # Test reading attributes for another layer (polygon). # def test_ogr_kml_attributes_4(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Google Campus') feat = lyr.GetNextFeature() i = 40 while feat is not None: name = 'Building %d' % i if feat.GetField('Name') != name: print('Got: "%s"' % feat.GetField('name')) pytest.fail('Wrong name field value') assert feat.GetField('description') == '', 'Wrong description field value' i = i + 1 feat = lyr.GetNextFeature() ############################################################################### # Test reading of KML point geometry # def test_ogr_kml_point_read(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Placemarks') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'POINT(-122.0822035425683 37.42228990140251)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POINT(-122.084075 37.4220033612141 50)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POINT(-122.0857667006183 37.42156927867553 50)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Test reading of KML linestring geometry # def test_ogr_kml_linestring_read(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Paths') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'LINESTRING (-112.081423783034495 36.106778704771372 0, -112.087026775269294 36.0905099328766 0)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'LINESTRING (-112.080622229594994 36.106734600079953 0,-112.085242575314993 36.090495986124218 0)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'LINESTRING (-112.265654928602004 36.094476726025462 2357,-112.266038452823807 36.093426088386707 2357,-112.266813901345301 36.092510587768807 2357,-112.267782683444494 36.091898273579957 2357,-112.268855751095202 36.091313794118697 2357,-112.269481071721899 36.090367720752099 2357,-112.269526855561097 36.089321714872852 2357,-112.269014456727604 36.088509160604723 2357,-112.268152881533894 36.087538135979557 2357,-112.2670588176031 36.086826852625677 2357,-112.265737458732104 36.086463123013033 2357)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Test reading of KML polygon geometry # def test_ogr_kml_polygon_read(): if not ogrtest.have_read_kml: pytest.skip() assert ogrtest.kml_ds is not None, 'kml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Google Campus') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'POLYGON ((-122.084893845961204 37.422571240447859 17,-122.084958097919795 37.422119226268563 17,-122.084746957304702 37.42207183952619 17,-122.084572538096197 37.422090067296757 17,-122.084595488672306 37.422159327008949 17,-122.0838521118269 37.422272785643713 17,-122.083792243334997 37.422035391120843 17,-122.0835076656616 37.422090069571063 17,-122.083470946415204 37.422009873951609 17,-122.083122108574798 37.422104649494599 17,-122.082924737457205 37.422265039903863 17,-122.082933916938501 37.422312428430942 17,-122.083383735973698 37.422250460876178 17,-122.083360785424802 37.422341592287452 17,-122.083420455164202 37.42237075460644 17,-122.083659133885007 37.422512920110009 17,-122.083975843895203 37.422658730937812 17,-122.084237474333094 37.422651439725207 17,-122.0845036949503 37.422651438643499 17,-122.0848020460801 37.422611339163147 17,-122.084788275051494 37.422563950551208 17,-122.084893845961204 37.422571240447859 17))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.085741277148301 37.422270331552568 17,-122.085816976848093 37.422314088323461 17,-122.085852582875006 37.422303374697442 17,-122.085879994563896 37.422256861387893 17,-122.085886010140896 37.422231107613797 17,-122.085806915728796 37.422202501738553 17,-122.085837954265301 37.42214027058678 17,-122.085673264051906 37.422086902144081 17,-122.085602292640701 37.42214885429042 17,-122.085590277843593 37.422128290487002 17,-122.085584167223701 37.422081719672462 17,-122.085485206574106 37.42210455874995 17,-122.085506726435199 37.422142679498243 17,-122.085443071291493 37.422127838461719 17,-122.085099071490404 37.42251282407603 17,-122.085676981863202 37.422818153236513 17,-122.086016227378295 37.422449188587223 17,-122.085726032700407 37.422292396042529 17,-122.085741277148301 37.422270331552568 17))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.085786228724203 37.421362088869692 25,-122.085731299060299 37.421369359894811 25,-122.085731299291794 37.421409349109027 25,-122.085607707367899 37.421383901665649 25,-122.085580242651602 37.42137299550869 25,-122.085218622197104 37.421372995043157 25,-122.085227776563897 37.421616565082651 25,-122.085259818934702 37.421605658944031 25,-122.085259818549901 37.421682001560001 25,-122.085236931147804 37.421700178603459 25,-122.085264395782801 37.421761979825753 25,-122.085323903274599 37.421761980139067 25,-122.085355945432397 37.421852864451999 25,-122.085410875246296 37.421889218237339 25,-122.085479537935697 37.42189285337048 25,-122.085543622981902 37.421889217975462 25,-122.085626017804202 37.421860134999257 25,-122.085937287963006 37.421860134536047 25,-122.085942871866607 37.42160898590042 25,-122.085965546986102 37.421579927591438 25,-122.085864046234093 37.421471150029568 25,-122.0858548911215 37.421405713261841 25,-122.085809116276806 37.4214057134039 25,-122.085786228724203 37.421362088869692 25))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.084437112828397 37.421772530030907 19,-122.084511885574599 37.421911115428962 19,-122.0850470999805 37.421787551215353 19,-122.085071991339106 37.421436630231611 19,-122.084916406231997 37.421372378221157 19,-122.084219386816699 37.421372378016258 19,-122.084219386589993 37.421476171614962 19,-122.083808641999099 37.4214613409357 19,-122.083789972856394 37.421313064107963 19,-122.083279653469802 37.421293288405927 19,-122.083260981920702 37.421392139442979 19,-122.082937362173695 37.421372363998763 19,-122.082906242566693 37.421515697788713 19,-122.082850226966499 37.421762825764652 19,-122.082943578863507 37.421767769696352 19,-122.083217411188002 37.421792485526858 19,-122.0835970430103 37.421748007445601 19,-122.083945555677104 37.421693642376027 19,-122.084007789463698 37.421762838158529 19,-122.084113587521003 37.421748011043917 19,-122.084076247378405 37.421713412923751 19,-122.084144704773905 37.421678815345693 19,-122.084144704222993 37.421817206601972 19,-122.084250333307395 37.421817070044597 19,-122.084437112828397 37.421772530030907 19))' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Write test def test_ogr_kml_write_1(): if ogrtest.kml_drv is None: pytest.skip() srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS72') ds = ogr.GetDriverByName('KML').CreateDataSource('tmp/kml.kml') lyr = ds.CreateLayer('test_wgs72', srs=srs) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' assert dst_feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49)', \ 'CreateFeature changed the geometry.' lyr = ds.CreateLayer('test_wgs84') dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', 'my_name') dst_feat.SetField('description', 'my_description') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49 1)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 1,2 3)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 1,2 3),(0 1,2 3))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1)),((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1)))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (2 49 1),LINESTRING (0 1 0,2 3 0))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None ############################################################################### # Check previous test def test_ogr_kml_check_write_1(): if not ogrtest.have_read_kml: pytest.skip() content = open('tmp/kml.kml').read() assert 'Schema' not in content, 'Did not expect Schema tags.' ds = ogr.Open('tmp/kml.kml') lyr = ds.GetLayerByName('test_wgs84') assert lyr.GetFeatureCount() == 8, 'Bad feature count.' feat = lyr.GetNextFeature() assert feat.GetField('name') == 'my_name', 'Unexpected name.' assert feat.GetField('description') == 'my_description', 'Unexpected description.' assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49)', 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49 1)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'LINESTRING (0 1,2 3)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POLYGON ((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTIPOINT (2 49,2 49)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTILINESTRING ((0 1,2 3),(0 1,2 3))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTIPOLYGON (((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1)),((0 1,2 3,4 5,0 1),(0 1,2 3,4 5,0 1)))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (2 49 1),LINESTRING (0 1 0,2 3 0))', \ 'Unexpected geometry.' ############################################################################### # Test reading attributes with XML content in them # def test_ogr_kml_xml_attributes(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/description_with_xml.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('description') != 'Description

Interesting

': print('got: ', feat.GetField('description')) pytest.fail('Wrong description field value') ############################################################################### # Test reading all geometry types (#3558) def test_ogr_kml_read_geometries(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/geometries.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() while feat is not None: feat = lyr.GetNextFeature() ############################################################################### # Run test_ogrsf def test_ogr_kml_test_ogrsf(): if not ogrtest.have_read_kml: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' --config OGR_SKIP LIBKML -ro data/samples.kml') assert not (ret.find("using driver `KML'") == -1 or ret.find('INFO') == -1 or ret.find('ERROR') != -1) ############################################################################### # Test fix for #2772 def test_ogr_kml_interleaved_writing(): ds = ogr.GetDriverByName('KML').CreateDataSource('/vsimem/ogr_kml_interleaved_writing.kml') lyr1 = ds.CreateLayer("lyr1") ds.CreateLayer("lyr2") feat = ogr.Feature(lyr1.GetLayerDefn()) with gdaltest.error_handler(): ret = lyr1.CreateFeature(feat) ds = None gdal.Unlink('/vsimem/ogr_kml_interleaved_writing.kml') # CreateFeature() should fail assert ret != 0 ############################################################################### # Test reading KML with only Placemark def test_ogr_kml_read_placemark(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/placemark.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ############################################################################### # Test reading KML without any layer def test_ogr_kml_read_empty(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/empty.kml') assert ds.GetLayerCount() == 0 ############################################################################### # Test reading KML with empty layers def test_ogr_kml_read_emptylayers(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/emptylayers.kml') assert ds.GetLayerCount() == 2 assert ds.GetLayer(0).GetFeatureCount() == 0 assert ds.GetLayer(1).GetFeatureCount() == 0 ############################################################################### def compare_output(content, expected_content): content_lines = content.strip().split('\n') expected_lines = expected_content.strip().split('\n') assert len(content_lines) == len(expected_lines), content for i, content_line in enumerate(content_lines): assert content_line.strip() == expected_lines[i].strip(), content ############################################################################### # Test that we can write a schema def test_ogr_kml_write_schema(): ds = ogr.GetDriverByName('KML').CreateDataSource('/vsimem/ogr_kml_write_schema.kml') lyr = ds.CreateLayer("lyr") lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('strfield', 'strfield_val') feat.SetField('intfield', '1') feat.SetField('realfield', '2.34') lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_kml_write_schema.kml', 'rb') content = gdal.VSIFReadL(1, 1000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_kml_write_schema.kml') expected_content = """ lyr strfield_val 1 2.34 """ return compare_output(content, expected_content) ############################################################################### # def test_ogr_kml_empty_layer(): ds = ogr.GetDriverByName('KML').CreateDataSource('/vsimem/ogr_kml_empty_layer.kml') ds.CreateLayer("empty") ds = None f = gdal.VSIFOpenL('/vsimem/ogr_kml_empty_layer.kml', 'rb') content = gdal.VSIFReadL(1, 1000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_kml_empty_layer.kml') expected_content = """ empty """ return compare_output(content, expected_content) ############################################################################### # Empty layer followed by regular layer def test_ogr_kml_two_layers(): ds = ogr.GetDriverByName('KML').CreateDataSource('/vsimem/ogr_kml_two_layers.kml') ds.CreateLayer("empty") lyr = ds.CreateLayer("lyr") lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("foo", "bar") lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_kml_two_layers.kml', 'rb') content = gdal.VSIFReadL(1, 1000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_kml_two_layers.kml') # FIXME: the schema for lyr should be written before the first Folter for XML compliance expected_content = """ empty lyr bar """ return compare_output(content, expected_content) ############################################################################### # Cleanup def test_ogr_kml_cleanup(): os.remove('tmp/kml.kml') if not ogrtest.have_read_kml: pytest.skip() if ogrtest.kml_ds is not None: ogrtest.kml_ds = None # Re-register LIBKML driver if necessary if ogrtest.libkml_drv is not None: print('Re-register LIBKML driver') ogrtest.libkml_drv.Register() ############################################################################### # Test reading KML with folder with empty subfolder and placemark def test_ogr_kml_read_folder_with_subfolder_placemark(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/folder_with_subfolder_placemark.kml') assert ds.GetLayerCount() == 1 assert ds.GetLayer(0).GetFeatureCount() == 0 ############################################################################### # Test reading invalid KML (#6878) def test_ogr_kml_read_truncated(): if not ogrtest.have_read_kml: pytest.skip() with gdaltest.error_handler(): ds = ogr.Open('data/truncated.kml') assert ds is None ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1591 def test_ogr_kml_read_weird_empty_folders(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/weird_empty_folders.kml') assert ds.GetLayerCount() == 1 assert ds.GetLayer(0).GetFeatureCount() == 0 ############################################################################### # Test fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1683 def test_ogr_kml_read_junk_content_after_valid_doc(): if not ogrtest.have_read_kml: pytest.skip() with gdaltest.error_handler(): ds = ogr.Open('data/junk_content_after_valid_doc.kml') assert ds is None ############################################################################### # Test reading KML with kml: prefix def test_ogr_kml_read_placemark_with_kml_prefix(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/placemark_with_kml_prefix.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ############################################################################### # Test reading KML with duplicated folder name def test_ogr_kml_read_duplicate_folder_name(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/duplicate_folder_name.kml') lyr = ds.GetLayer(0) assert lyr.GetName() == 'layer' lyr = ds.GetLayer(1) assert lyr.GetName() == 'layer (#2)' ############################################################################### # Test reading KML with a placemark in root document, and a subfolder (#7221) def test_ogr_kml_read_placemark_in_root_and_subfolder(): if not ogrtest.have_read_kml: pytest.skip() ds = ogr.Open('data/placemark_in_root_and_subfolder.kml') lyr = ds.GetLayerByName('TopLevel') assert lyr is not None assert lyr.GetFeatureCount() == 1 lyr = ds.GetLayerByName('SubFolder1') assert lyr is not None assert lyr.GetFeatureCount() == 1 ############################################################################### # Build tests runner gdalautotest-3.0.4/ogr/ogr_ntf.py0000755003401500001440000001704313614005363016440 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_ntf.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR NTF driver. # 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. ############################################################################### # The following tests will download sample data from # http://www.ordnancesurvey.co.uk/oswebsite/products/meridian2/sampledata/meridian2ntf.exe # and http://www.ordnancesurvey.co.uk/oswebsite/products/strategi/sampledata/stratntf.exe # # That data is subject to the terms of the 'Discover' Data License, that can be found here : # http://www.ordnancesurvey.co.uk/oswebsite/products/sampledata/discoverdatalicense.html # # Verbatim copy of it : ############################################################################### # 'Discover' Data License # # Thank you for your interest in this Sample Data. The terms and conditions below set out a legal agreement # between you and Ordnance Survey for your use of the Sample Data. Please read these terms carefully. If you do # not agree to these terms and conditions, you should not use, download or access the Sample Data. # # 1 The Sample Data belongs to the Crown (or its suppliers). # # 2 Ordnance Survey grants you a limited, personal, non-exclusive, non-transferable, free-of-charge and fully terminable # licence to use the Sample Data for the purpose of internal testing and evaluation only. By way of example, this means # that you are not permitted to (i) sub-license, transfer, share or otherwise #distribute the Sample Data to any other # person; (ii) incorporate the Sample Data into your products or services (unless solely for the purposes of internal # testing and evaluation); or (iii) commercially exploit the Sample Data. # # 3 The Sample Data is provided "as is" and without any warranty as to quality, fitness for purpose, accuracy, availability # or otherwise. You acknowledge that it is your responsibility to ensure that the Sample Data is suitable for your intended # purposes. # # 4 To the fullest extent permitted by law, Ordnance Survey excludes all liability for any loss or damage of whatever nature # arising from any use of the Sample Data. # # 5 You agree that Ordnance Survey (and its suppliers) shall retain all rights, title and interest in the Sample Data, including # but not limited to any and all copyrights, patents, trade marks, trade secrets and all other intellectual property rights. # # 6 You agree not to tamper with or remove any copyright, trade mark, trade mark symbol or other proprietary notice of # Ordnance Survey (or its suppliers) contained in the Sample Data. # # 7 Ordnance Survey may terminate this agreement immediately if you breach any of the terms and conditions. # Ordnance Survey also reserves the right to terminate the agreement at any time on giving you thirty (30) days written # notice (which may be given by email or by posting a notification on Ordnance Survey's website). # # 8 These terms and conditions are governed by English law, and you agree to the exclusive jurisdiction of the English courts. # (C) Crown copyright and/or database right 2009 Ordnance Survey # # v1.0 May 2009 ############################################################################### import os from osgeo import ogr import gdaltest import pytest ############################################################################### def test_ogr_ntf_1(): if not gdaltest.download_file('http://www.ordnancesurvey.co.uk/oswebsite/products/strategi/sampledata/stratntf.exe', 'stratntf.exe'): pytest.skip() try: os.stat('tmp/cache/SS.ntf') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/stratntf.exe') try: os.stat('tmp/cache/SS.ntf') except OSError: pytest.skip() except OSError: pytest.skip() ds = ogr.Open('tmp/cache/SS.ntf') assert ds.GetLayerCount() == 5 layers = [('STRATEGI_POINT', ogr.wkbPoint, 9193), ('STRATEGI_LINE', ogr.wkbLineString, 8369), ('STRATEGI_TEXT', ogr.wkbPoint, 1335), ('STRATEGI_NODE', ogr.wkbNone, 10991), ('FEATURE_CLASSES', ogr.wkbNone, 224)] for l in layers: lyr = ds.GetLayerByName(l[0]) assert lyr.GetLayerDefn().GetGeomType() == l[1] assert lyr.GetFeatureCount() == l[2] if l[1] != ogr.wkbNone: assert lyr.GetSpatialRef().ExportToWkt().find('OSGB 1936') != -1 lyr = ds.GetLayerByName('STRATEGI_POINT') feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (222904 127850)' ds.Destroy() ############################################################################### def test_ogr_ntf_2(): if not gdaltest.download_file('http://www.ordnancesurvey.co.uk/oswebsite/products/meridian2/sampledata/meridian2ntf.exe', 'meridian2ntf.exe'): pytest.skip() try: os.stat('tmp/cache/Port_Talbot_NTF/SS78.ntf') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/meridian2ntf.exe') try: os.stat('tmp/cache/Port_Talbot_NTF/SS78.ntf') except OSError: pytest.skip() except OSError: pytest.skip() ds = ogr.Open('tmp/cache/Port_Talbot_NTF/SS78.ntf') assert ds.GetLayerCount() == 5 layers = [('MERIDIAN2_POINT', ogr.wkbPoint, 408), ('MERIDIAN2_LINE', ogr.wkbLineString, 513), ('MERIDIAN2_TEXT', ogr.wkbPoint, 7), ('MERIDIAN2_NODE', ogr.wkbNone, 397), ('FEATURE_CLASSES', ogr.wkbNone, 50)] for l in layers: lyr = ds.GetLayerByName(l[0]) assert lyr.GetLayerDefn().GetGeomType() == l[1] assert lyr.GetFeatureCount() == l[2] if l[1] != ogr.wkbNone: assert lyr.GetSpatialRef().ExportToWkt().find('OSGB 1936') != -1 lyr = ds.GetLayerByName('MERIDIAN2_POINT') feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (275324 189274)' lyr = ds.GetLayerByName('MERIDIAN2_LINE') feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'LINESTRING (275324 189274,275233 189114,275153 189048)' ds.Destroy() gdalautotest-3.0.4/ogr/ogr_pdf.py0000755003401500001440000005525113614005363016425 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_pdf.py bc815091f359f08bb23d5fa81fbcc90a00b92bb6 2019-10-16 11:37:07 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR PDF driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 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 gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest def has_read_support(): if ogr.GetDriverByName('PDF') is None: return False # Check read support gdal_pdf_drv = gdal.GetDriverByName('PDF') md = gdal_pdf_drv.GetMetadata() if 'HAVE_POPPLER' not in md and 'HAVE_PODOFO' not in md and 'HAVE_PDFIUM' not in md: return False return True ############################################################################### # Test write support def test_ogr_pdf_1(name='tmp/ogr_pdf_1.pdf', write_attributes='YES'): if ogr.GetDriverByName('PDF') is None: pytest.skip() sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds = ogr.GetDriverByName('PDF').CreateDataSource(name, options=['STREAM_COMPRESS=NONE', 'MARGIN=10', 'OGR_WRITE_ATTRIBUTES=%s' % write_attributes, 'OGR_LINK_FIELD=linkfield']) lyr = ds.CreateLayer('first_layer', srs=sr) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('linkfield', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) feat.SetField('strfield', 'super tex !') feat.SetField('linkfield', 'http://gdal.org/') feat.SetStyleString('LABEL(t:{strfield},dx:5,dy:10,a:45,p:4)') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2 48,3 50)')) feat.SetField('strfield', 'str') feat.SetField('intfield', 1) feat.SetField('realfield', 2.34) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2 48,2 49,3 49,3 48,2 48))')) feat.SetField('linkfield', 'http://gdal.org/') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2 48,2 49,3 49,3 48,2 48),(2.25 48.25,2.25 48.75,2.75 48.75,2.75 48.25,2.25 48.25))')) lyr.CreateFeature(feat) for i in range(10): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetStyleString('SYMBOL(c:#FF0000,id:"ogr-sym-%d",s:10)' % i) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%f 49.1)' % (2 + i * 0.05))) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetStyleString('SYMBOL(c:#000000,id:"../gcore/data/byte.tif")') feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2.5 49.1)')) lyr.CreateFeature(feat) ds = None # Do a quick test to make sure the text came out OK. wantedstream = 'BT\n' + \ '362.038672 362.038672 -362.038672 362.038672 18.039040 528.960960 Tm\n' + \ '0.000000 0.000000 0.000000 rg\n' + \ '/F1 0.023438 Tf\n' + \ '(super tex !) Tj\n' + \ 'ET' with open(name, 'rb') as f: data = f.read(8192) assert wantedstream.encode('utf-8') in data, \ 'Wrong text data in written PDF stream' ############################################################################### # Test read support def test_ogr_pdf_2(name='tmp/ogr_pdf_1.pdf', has_attributes=True): if not has_read_support(): pytest.skip() ds = ogr.Open(name) assert ds is not None lyr = ds.GetLayerByName('first_layer') assert lyr is not None if has_attributes: assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('strfield')).GetType() == ogr.OFTString assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('intfield')).GetType() == ogr.OFTInteger assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('realfield')).GetType() == ogr.OFTReal else: assert lyr.GetLayerDefn().GetFieldCount() == 0 if has_attributes: feat = lyr.GetNextFeature() # This won't work properly until text support is added to the # PDF vector feature reader # if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT(2 49)')) != 0: # feat.DumpReadable() # gdaltest.post_reason('fail') # return 'fail' feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING(2 48,3 50)')) != 0: feat.DumpReadable() pytest.fail() if has_attributes: if feat.GetField('strfield') != 'str': feat.DumpReadable() pytest.fail() if feat.GetField('intfield') != 1: feat.DumpReadable() pytest.fail() if abs(feat.GetFieldAsDouble('realfield') - 2.34) > 1e-10: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON((2 48,2 49,3 49,3 48,2 48))')) != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON((2 48,2 49,3 49,3 48,2 48),(2.25 48.25,2.25 48.75,2.75 48.75,2.75 48.25,2.25 48.25))')) != 0: feat.DumpReadable() pytest.fail() for i in range(10): feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT(%f 49.1)' % (2 + i * 0.05))) != 0: feat.DumpReadable() pytest.fail('fail with ogr-sym-%d' % i) feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT(2.5 49.1)')) != 0: feat.DumpReadable() pytest.fail('fail with raster icon') ds = None ############################################################################### # Test write support without writing attributes def test_ogr_pdf_3(): return test_ogr_pdf_1('tmp/ogr_pdf_2.pdf', 'NO') ############################################################################### # Check read support without writing attributes def test_ogr_pdf_4(): return test_ogr_pdf_2('tmp/ogr_pdf_2.pdf', False) ############################################################################### # Switch from poppler to podofo if both are available def test_ogr_pdf_4_podofo(): gdal_pdf_drv = gdal.GetDriverByName('PDF') if gdal_pdf_drv is None: pytest.skip() md = gdal_pdf_drv.GetMetadata() if 'HAVE_POPPLER' in md and 'HAVE_PODOFO' in md: gdal.SetConfigOption("GDAL_PDF_LIB", "PODOFO") print('Using podofo now') ret = test_ogr_pdf_4() gdal.SetConfigOption("GDAL_PDF_LIB", None) return ret pytest.skip() ############################################################################### # Test read support with OGR_PDF_READ_NON_STRUCTURED=YES def test_ogr_pdf_5(): if not has_read_support(): pytest.skip() with gdaltest.config_option('OGR_PDF_READ_NON_STRUCTURED', 'YES'): ds = ogr.Open('data/drawing.pdf') assert ds is not None lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 8 ############################################################################### # Test read support of polygon with holes and Bezier curves def test_ogr_pdf_bezier_curve_and_polygon_holes(): if not has_read_support(): pytest.skip() with gdaltest.config_option('OGR_PDF_READ_NON_STRUCTURED', 'YES'): ds = ogr.Open('data/bezier_curve_and_polygon_holes.pdf') assert ds is not None lyr = ds.GetLayer(0) feat = lyr.GetFeature(2) expected_wkt = """POLYGON ((8444.60213541667 6332.05489588889,8444.71174575 6331.98745444444,8444.82702558333 6331.926391,8444.94655754167 6331.87099688889,8445.06892425 6331.82056344444,8445.19270833333 6331.774382,8445.31649241667 6331.73174388889,8445.438859125 6331.69194044444,8445.55839108333 6331.654263,8445.67367091667 6331.61800288889,8445.78328125 6331.58245144444,8445.89289158333 6331.58256955556,8446.00817141667 6331.58339633334,8446.127703375 6331.58564044444,8446.25007008333 6331.59001055556,8446.37385416667 6331.59721533333,8446.49763825 6331.60796344444,8446.62000495833 6331.62296355556,8446.73953691667 6331.64292433333,8446.85481675 6331.66855444444,8446.96442708333 6331.70056255555,8447.17360801042 6331.77851588889,8447.37641075 6331.87064255556,8447.57354398958 6331.97694255555,8447.76571641667 6332.09741588889,8447.95363671875 6332.23206255555,8448.13801358333 6332.38088255556,8448.31955569792 6332.54387588889,8448.49897175 6332.72104255556,8448.67697042709 6332.91238255556,8448.85426041667 6333.11789588889,8449.02056575 6333.43679588889,8449.16419308334 6333.75569588889,8449.28372504167 6334.07459588889,8449.37774425 6334.39349588889,8449.44483333333 6334.71239588889,8449.48357491667 6335.03129588889,8449.492551625 6335.35019588889,8449.47034608333 6335.66909588889,8449.41554091667 6335.98799588889,8449.32671875 6336.30689588889,8449.19572967709 6336.69654444444,8449.01584116667 6337.08548433334,8448.78776190625 6337.47300688889,8448.51220058333 6337.85840344444,8448.18986588542 6338.24096533333,8447.8214665 6338.61998388889,8447.40771111458 6338.99475044445,8446.94930841667 6339.36455633333,8446.44696709375 6339.72869288889,8445.90139583333 6340.08645144444,8445.41240145833 6340.39082377778,8444.93758083334 6340.66472344445,8444.47693395833 6340.90602444444,8444.03046083333 6341.11260077778,8443.59816145833 6341.28232644444,8443.18003583333 6341.41307544444,8442.77608395833 6341.50272177778,8442.38630583334 6341.54913944444,8442.01070145833 6341.55020244444,8441.64927083333 6341.50378477778,8441.33402301042 6341.45429622222,8441.02657075 6341.37716966667,8440.72762273958 6341.27311377778,8440.43788766667 6341.14283722222,8440.15807421875 6340.98704866667,8439.88889108333 6340.80645677778,8439.63104694792 6340.60177022222,8439.3852505 6340.37369766667,8439.15221042708 6340.12294777778,8438.93263541667 6339.85022922222,8438.82999384375 6339.67294444445,8438.73514783333 6339.494951,8438.64880607291 6339.31554022222,8438.57167725 6339.13400344444,8438.50447005208 6338.949632,8438.44789316667 6338.76171722222,8438.40265528125 6338.56955044444,8438.36946508333 6338.372423,8438.34903126042 6338.16962622222,8438.3420625 6337.96045144444,8438.34572405208 6337.77997766667,8438.35718116667 6337.59383455556,8438.37714253125 6337.40343944444,8438.40631683333 6337.21020966667,8438.44541276042 6337.01556255555,8438.495139 6336.82091544444,8438.55620423958 6336.62768566667,8438.62931716667 6336.43729055555,8438.71518646875 6336.25114744444,8438.81452083333 6336.07067366667,8438.92436739584 6335.89693222222,8439.04130083334 6335.72956877778,8439.16532114583 6335.56787466666,8439.29642833334 6335.41114122222,8439.43462239583 6335.25865977778,8439.57990333333 6335.10972166667,8439.73227114583 6334.96361822222,8439.89172583333 6334.81964077778,8440.05826739583 6334.67708066667,8440.23189583333 6334.53522922222,8440.51537083333 6334.36881066667,8440.79884583333 6334.22436077778,8441.08232083333 6334.10258822222,8441.36579583334 6334.00420166667,8441.64927083333 6333.92990977778,8441.93274583333 6333.88042122222,8442.21622083333 6333.85644466667,8442.49969583333 6333.85868877778,8442.78317083333 6333.88786222222,8443.06664583333 6333.94467366667,8443.34634116667 6333.990737,8443.61753225 6334.05806033333,8443.87880170833 6334.14664366667,8444.12873216667 6334.256487,8444.36590625 6334.38759033333,8444.58890658333 6334.53995366667,8444.79631579167 6334.713577,8444.9867165 6334.90846033333,8445.15869133333 6335.12460366667,8445.31082291667 6335.362007,8445.41027539583 6335.50385844445,8445.4969715 6335.64641855556,8445.57232860417 6335.790396,8445.63776408334 6335.93649944444,8445.6946953125 6336.08543755556,8445.74453966666 6336.237919,8445.78871452083 6336.39465244444,8445.82863725 6336.55634655556,8445.86572522917 6336.72371,8445.90139583333 6336.89745144444,8445.90104148959 6337.0745,8445.89856108334 6337.25083988889,8445.89182855208 6337.42576244444,8445.87871783334 6337.598559,8445.85710286459 6337.76852088889,8445.82485758333 6337.93493944444,8445.77985592708 6338.097106,8445.71997183333 6338.25431188889,8445.64307923958 6338.40584844444,8445.54705208333 6338.551007,8445.54705208333 6338.551007,8445.85214205208 6338.37384033333,8446.13101058334 6338.19667366667,8446.38578373958 6338.019507,8446.61858758333 6337.84234033333,8446.83154817708 6337.66517366667,8447.02679158333 6337.488007,8447.20644386458 6337.31084033333,8447.37263108333 6337.13367366667,8447.52747930209 6336.956507,8447.67311458333 6336.77934033333,8447.77575615625 6336.60229177778,8447.87060216667 6336.42595188889,8447.95694392708 6336.25102933333,8448.03407275 6336.07823277778,8448.10127994792 6335.90827088889,8448.15785683334 6335.74185233333,8448.20309471875 6335.57968577778,8448.23628491667 6335.42247988889,8448.25671873958 6335.27094333333,8448.2636875 6335.12578477778,8448.2601440625 6334.98735855556,8448.24951375 6334.85460166667,8448.2317965625 6334.72609677778,8448.2069925 6334.60042655555,8448.1751015625 6334.47617366667,8448.13612375 6334.35192077778,8448.0900590625 6334.22625055555,8448.0369075 6334.09774566667,8447.9766690625 6333.96498877778,8447.90934375 6333.82656255556,8447.79961530208 6333.69179777778,8447.68350866667 6333.57049766667,8447.56173253125 6333.46195355555,8447.43499558333 6333.36545677778,8447.30400651042 6333.28029866667,8447.169474 6333.20577055555,8447.03210673958 6333.14116377778,8446.89261341667 6333.08576966667,8446.75170271875 6333.03887955556,8446.61008333333 6332.99978477778,8446.50035488542 6333.000021,8446.38424825 6333.00167455556,8446.26247211458 6333.00616277777,8446.13573516667 6333.014903,8446.00474609375 6333.02931255556,8445.87021358333 6333.05080877778,8445.73284632292 6333.080809,8445.593353 6333.12073055556,8445.45244230208 6333.17199077778,8445.31082291667 6333.236007,8444.60213541667 6332.05489588889),(8443.65721875 6339.614007,8443.82730375 6339.50085655556,8443.983215 6339.37495011111,8444.1249525 6339.237705,8444.25251625 6339.09053855556,8444.36590625 6338.93486811111,8444.4651225 6338.772111,8444.550165 6338.60368455556,8444.62103375 6338.43100611111,8444.67772875 6338.255493,8444.72025 6338.07856255556,8444.78060655209 6337.90139588889,8444.82041116667 6337.72422922222,8444.84037253125 6337.54706255555,8444.84119933333 6337.36989588889,8444.82360026042 6337.19272922222,8444.788284 6337.01556255555,8444.73595923958 6336.83839588889,8444.66733466667 6336.66122922222,8444.58311896875 6336.48406255556,8444.48402083333 6336.30689588889,8444.3708670625 6336.168824,8444.24495691667 6336.03854744445,8444.10770777083 6335.91677488889,8443.960537 6335.804215,8443.80486197917 6335.70157644444,8443.64210008333 6335.60956788889,8443.4736686875 6335.528898,8443.30098516667 6335.46027544444,8443.12546689583 6335.40440888889,8442.94853125 6335.362007,8442.76805216667 6335.33696744445,8442.58190358334 6335.33177055556,8442.391502875 6335.344999,8442.19826741667 6335.37523544444,8442.00361458333 6335.42106255555,8441.80896175 6335.481063,8441.61572629167 6335.55381944444,8441.42532558333 6335.63791455556,8441.239177 6335.731931,8441.05869791667 6335.83445144444,8440.85329665625 6335.97961,8440.66277783333 6336.13114655556,8440.48785013541 6336.28835244444,8440.32922225 6336.450519,8440.18760286458 6336.61693755556,8440.06370066667 6336.78689944444,8439.95822434375 6336.959696,8439.87188258333 6337.13461855556,8439.80538407292 6337.31095844444,8439.7594375 6337.488007,8439.69908094792 6337.69387466667,8439.65927633334 6337.887695,8439.63931496875 6338.071594,8439.63848816667 6338.24769766667,8439.65608723958 6338.418132,8439.6914035 6338.585023,8439.74372826042 6338.75049666667,8439.81235283333 6338.916679,8439.89656853125 6339.085696,8439.99566666667 6339.25967366667,8440.06677164583 6339.36243033333,8440.139294 6339.45810033333,8440.21465110416 6339.54668366666,8440.29426033333 6339.62818033333,8440.3795390625 6339.70259033333,8440.47190466667 6339.76991366667,8440.57277452083 6339.83015033333,8440.683566 6339.88330033333,8440.80569647917 6339.92936366667,8440.94058333333 6339.96834033333,8441.05031178125 6340.03235655556,8441.16641841667 6340.08361677778,8441.28819455208 6340.12353833333,8441.4149315 6340.15353855556,8441.54592057292 6340.17503477778,8441.68045308333 6340.18944433333,8441.81782034375 6340.19818455555,8441.95731366667 6340.20267277778,8442.09822436458 6340.20432633333,8442.23984375 6340.20456255555,8442.38158125 6340.168893,8442.52331875 6340.13180611111,8442.66505625 6340.09188455556,8442.80679375 6340.047711,8442.94853125 6339.99786811111,8443.09026875 6339.94093855556,8443.23200625 6339.875505,8443.37374375 6339.80015011111,8443.51548125 6339.71345655556,8443.65721875 6339.614007))""" if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt(expected_wkt)) != 0: feat.DumpReadable() pytest.fail() ############################################################################### # Test read support with a non-OGR datasource def test_ogr_pdf_online_1(): if not has_read_support(): pytest.skip() if not gdaltest.download_file('http://www.terragotech.com/images/pdf/webmap_urbansample.pdf', 'webmap_urbansample.pdf'): pytest.skip() expected_layers = [ ["Cadastral Boundaries", ogr.wkbPolygon], ["Water Lines", ogr.wkbLineString], ["Sewerage Lines", ogr.wkbLineString], ["Sewerage Jump-Ups", ogr.wkbLineString], ["Roads", ogr.wkbUnknown], ["Water Points", ogr.wkbPoint], ["Sewerage Pump Stations", ogr.wkbPoint], ["Sewerage Man Holes", ogr.wkbPoint], ["BPS - Buildings", ogr.wkbPolygon], ["BPS - Facilities", ogr.wkbPolygon], ["BPS - Water Sources", ogr.wkbPoint], ] ds = ogr.Open('tmp/cache/webmap_urbansample.pdf') assert ds is not None assert ds.GetLayerCount() == len(expected_layers) for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() == expected_layers[i][0], \ ('%d : %s' % (i, ds.GetLayer(i).GetName())) assert ds.GetLayer(i).GetGeomType() == expected_layers[i][1], \ ('%d : %d' % (i, ds.GetLayer(i).GetGeomType())) lyr = ds.GetLayerByName('Water Points') feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT (724431.316665166523308 7672947.212302438914776)')) != 0: feat.DumpReadable() pytest.fail() assert feat.GetField('ID') == 'VL46' ############################################################################### # Test read support of non-structured content def test_ogr_pdf_online_2(): if not has_read_support(): pytest.skip() if not gdaltest.download_file('https://download.osgeo.org/gdal/data/pdf/340711752_Azusa_FSTopo.pdf', '340711752_Azusa_FSTopo.pdf'): pytest.skip() expected_layers = [ ['Other_5', 0], ['Quadrangle_Extent_Other_4', 0], ['Quadrangle_Extent_State_Outline', 0], ['Adjacent_Quadrangle_Diagram_Other_3', 0], ['Adjacent_Quadrangle_Diagram_Quadrangle_Extent', 0], ['Adjacent_Quadrangle_Diagram_Quad_Outlines', 0], ['Quadrangle_Other', 0], ['Quadrangle_Labels_Unplaced_Labels_Road_Shields_-_Vertical', 0], ['Quadrangle_Labels_Road_Shields_-_Horizontal', 0], ['Quadrangle_Labels_Road_Shields_-_Vertical', 0], ['Quadrangle_Neatline/Mask_Neatline', 0], ['Quadrangle_Neatline/Mask_Mask', 0], ['Quadrangle_Culture_Features', 0], ['Quadrangle_Large_Tanks', 0], ['Quadrangle_Linear_Transportation_Features', 0], ['Quadrangle_Railroads_', 0], ['Quadrangle_Linear_Culture_Features', 0], ['Quadrangle_Linear_Landform_Features', 0], ['Quadrangle_Boundaries', 0], ['Quadrangle_PLSS', 0], ['Quadrangle_Survey_Lines', 0], ['Quadrangle_Linear_Drainage_Features', 0], ['Quadrangle_Contour_Labels', 0], ['Quadrangle_Contours', 0], ['Quadrangle_2_5`_Tics_Interior_Grid_Intersections', 0], ['Quadrangle_2_5`_Tics_Grid_Tics_along_Neatline', 0], ['Quadrangle_UTM_Grid_Interior_Grid_Intersections', 0], ['Quadrangle_UTM_Grid_Grid_Tics_along_Neatline', 0], ['Quadrangle_UTM_Grid_UTM_Grid_Lines', 0], ['Quadrangle_Large_Buildings', 0], ['Quadrangle_Drainage_Polygons', 0], ['Quadrangle_Ownership', 0], ['Quadrangle_Builtup_Areas', 0], ['Quadrangle_WoodlandUSGS_P', 0], ] ds = ogr.Open('tmp/cache/340711752_Azusa_FSTopo.pdf') assert ds is not None if ds.GetLayerCount() != len(expected_layers): for lyr in ds: print(lyr.GetName(), lyr.GetGeomType()) pytest.fail(ds.GetLayerCount()) for i in range(ds.GetLayerCount()): assert ds.GetLayer(i).GetName() == expected_layers[i][0], \ ('%d : %s' % (i, ds.GetLayer(i).GetName())) assert ds.GetLayer(i).GetGeomType() == expected_layers[i][1], \ ('%d : %d' % (i, ds.GetLayer(i).GetGeomType())) ############################################################################### # Cleanup def test_ogr_pdf_cleanup(): if ogr.GetDriverByName('PDF') is None: pytest.skip() ogr.GetDriverByName('PDF').DeleteDataSource('tmp/ogr_pdf_1.pdf') ogr.GetDriverByName('PDF').DeleteDataSource('tmp/ogr_pdf_2.pdf') gdalautotest-3.0.4/ogr/ogr_sua.py0000755003401500001440000007645313614005363016453 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_sua.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR SUA 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 ogrtest from osgeo import ogr import pytest ############################################################################### # Basic test def test_ogr_sua_1(): ds = ogr.Open('data/za.sua') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayer(0) assert lyr is not None, 'cannot find layer' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POLYGON ((24.760277777777777 -28.466666666666683,24.766895312434809 -28.46671727367243,24.773510850527718 -28.466869079419723,24.780122395865373 -28.467122038103,24.786727953485673 -28.467476073394735,24.793325530310469 -28.467931078467672,24.799913135516679 -28.468486916026166,24.806488781187785 -28.469143418346533,24.813050482985464 -28.469900387326192,24.819596260561802 -28.47075759454188,24.826124138325216 -28.47171478131645,24.832632145879771 -28.472771658795054,24.839118318703743 -28.47392790802968,24.845580698630823 -28.475183180072875,24.852017334528803 -28.476537096080108,24.858426282776776 -28.47798924742105,24.86480560789666 -28.479539195799475,24.871153383126547 -28.481186473381939,24.877467690931773 -28.482930582935339,24.883746623625481 -28.48477099797276,24.889988283903538 -28.486707162908274,24.896190785431472 -28.48873849322014,24.902352253349676 -28.490864375622735,24.908470824878808 -28.493084168246597,24.914544649847166 -28.495397200827426,24.920571891246279 -28.497802774903008,24.926550725747585 -28.500300164018839,24.932479344288705 -28.502888613941764,24.938355952571698 -28.505567342882131,24.944178771610126 -28.508335541723795,24.949946038264724 -28.511192374262492,24.955656005751909 -28.514136977452182,24.961306944165695 -28.517168461659423,24.966897141013046 -28.520285910925423,24.972424901704478 -28.523488383236369,24.977888550056022 -28.526774910801166,24.983286428814758 -28.530144500336959,24.988616900132001 -28.533596133362522,24.99387834606733 -28.537128766498796,24.999069169069763 -28.540741331777156,25.004187792453038 -28.544432736955102,25.009232660883608 -28.548201865839104,25.014202240830937 -28.552047578614662,25.019095021044684 -28.555968712183585,25.02390951301135 -28.559964080508252,25.028644251401499 -28.564032474962829,25.033297794511821 -28.568172664691346,25.037868724701763 -28.572383396972441,25.042355648839958 -28.576663397590849,25.046757198702647 -28.581011371215411,25.051072031428639 -28.585426001783489,25.055298829890791 -28.589905952891769,25.059436303127992 -28.594449868193294,25.063483186732412 -28.599056371800572,25.067438243238151 -28.603724068694731,25.071300262513763 -28.608451545140568,25.075068062113562 -28.613237369107495,25.078740487674832 -28.618080090695855,25.082316413248837 -28.622978242569175,25.085794741684015 -28.627930340391472,25.089174404927817 -28.632934883270281,25.092454364404489 -28.637990354204419,25.095633611313403 -28.643095220537134,25.098711166955503 -28.64824793441413,25.10168608305365 -28.653446933246229,25.104557442038406 -28.658690640176914,25.107324357344936 -28.663977464554407,25.109985973715663 -28.669305802407834,25.112541467439499 -28.674674036928209,25.114990046654459 -28.680080538952993,25.117330951578985 -28.685523667455101,25.119563454781961 -28.691001770035456,25.121686861395737 -28.696513183419484,25.123700509365641 -28.702056233957038,25.125603769666306 -28.707629238125719,25.127396046506441 -28.713230503037792,25.129076777527761 -28.718858326949757,25.130645434008265 -28.724510999775319,25.13210152102771 -28.730186803601043,25.133444577652867 -28.735884013204668,25.134674177090211 -28.741600896576003,25.135789926836566 -28.7473357154403,25.136791468828061 -28.753086725783632,25.137678479562659 -28.758852178380579,25.138450670228519 -28.764630319323757,25.139107786806342 -28.770419390555091,25.139649610175514 -28.776217630398676,25.140075956205322 -28.782023274095195,25.140386675823155 -28.787834554337508,25.140581655100206 -28.793649701807396,25.140660815291394 -28.799466945713419,25.140624112899374 -28.805284514329315,25.140471539698027 -28.811100635533307,25.140203122769478 -28.816913537347659,25.139818924509857 -28.822721448478802,25.139319042644907 -28.828522598857376,25.138703610206345 -28.834315220178425,25.137972795537667 -28.840097546441314,25.137126802248048 -28.845867814489324,25.136165869182687 -28.85162426454886,25.135090270371048 -28.857365140767754,25.133900314962272 -28.863088691752992,25.132596347160835 -28.868793171107171,25.131178746139458 -28.874476837963954,25.129647925945786 -28.880137957522209,25.128004335404732 -28.885774801578492,25.126248457993494 -28.891385649057952,25.124380811721167 -28.896968786543397,25.122401948989488 -28.902522508802292,25.120312456446726 -28.908045119311723,25.118112954838665 -28.913534930780742,25.11580409880861 -28.918990265670601,25.113386576755399 -28.924409456711885,25.110861110617904 -28.92979084741917,25.108228455676212 -28.935132792602516,25.105489400347579 -28.940433658875676,25.102644765960211 -28.94569182516129,25.099695406505884 -28.950905683192275,25.096642208420011 -28.956073638009698,25.093486090307582 -28.961194108456937,25.090228002679709 -28.96626552766962,25.086868927687608 -28.97128634356163,25.083409878829617 -28.976255019306763,25.079851900655964 -28.981170033815886,25.076196068457499 -28.986029882209536,25.072443487959553 -28.990833076285767,25.068595294982366 -28.995578144983043,25.064652655115509 -29.000263634838049,25.060616763368554 -29.004888110438372,25.05648884380911 -29.009450154869668,25.052270149197888 -29.013948370157522,25.04796196062637 -29.018381377703292,25.043565587113235 -29.022747818714564,25.039082365218423 -29.027046354629377,25.034513658643014 -29.031275667534388,25.029860857809823 -29.035434460576823,25.025125379446433 -29.039521458370103,25.020308666156058 -29.043535407392909,25.015412185972465 -29.047475076381517,25.010437431908937 -29.051339256715593,25.005385921523313 -29.055126762796746,25.000259196426232 -29.05883643242025,24.995058821820685 -29.062467127139698,24.98978638601983 -29.066017732624076,24.984443499974287 -29.069487159007593,24.979031796736475 -29.072874341232009,24.973552930996892 -29.076178239381264,24.96800857854516 -29.079397839008323,24.962400435777845 -29.082532151454132,24.95673021914298 -29.085580214158654,24.950999664626245 -29.088541090963787,24.945210527202558 -29.09141387240804,24.939364580306272 -29.094197676012925,24.933463615254794 -29.096891646561062,24.927509440705947 -29.09949495636549,24.921503882088025 -29.102006805530834,24.915448781031092 -29.104426422205322,24.909345994796006 -29.10675306282441,24.90319739567629 -29.108986012345341,24.897004870446018 -29.11112458447279,24.890770319697953 -29.113168121875631,24.884495657344228 -29.115115996394422,24.878182809944395 -29.116967609239822,24.871833716110423 -29.11872239118189,24.865450325918069 -29.120379802729857,24.859034600277788 -29.121939334302667,24.852588510335149 -29.123400506390141,24.846114036796582 -29.124762869704583,24.83961316938128 -29.1260260053228,24.8330879061436 -29.127189524818803,24.826540252848378 -29.128253070386421,24.819972222345168 -29.129216314952828,24.813385833911177 -29.1300789622818,24.806783112687896 -29.130840747067623,24.800166088946376 -29.131501435018961,24.793536797471898 -29.132060822933184,24.786897276912615 -29.132518738760538,24.780249569276663 -29.132875041658693,24.773595719053805 -29.133129622037345,24.766937772515039 -29.133282401592936,24.760277777777777 -29.13333333333334,24.753617783040514 -29.133282401592936,24.746959836501748 -29.133129622037345,24.740305986278891 -29.132875041658693,24.733658278642938 -29.132518738760538,24.727018758083656 -29.132060822933184,24.720389466609177 -29.131501435018961,24.713772442867658 -29.130840747067623,24.707169721644377 -29.1300789622818,24.700583333210385 -29.129216314952828,24.694015302707175 -29.128253070386421,24.687467649411953 -29.127189524818803,24.680942386174273 -29.1260260053228,24.674441518758972 -29.124762869704583,24.667967045220404 -29.123400506390141,24.661520955277766 -29.121939334302667,24.655105229637485 -29.120379802729857,24.64872183944513 -29.11872239118189,24.642372745611159 -29.116967609239822,24.636059898211325 -29.115115996394422,24.6297852358576 -29.113168121875631,24.623550685109535 -29.11112458447279,24.617358159879263 -29.108986012345341,24.611209560759548 -29.10675306282441,24.605106774524462 -29.104426422205322,24.599051673467528 -29.102006805530834,24.593046114849606 -29.09949495636549,24.587091940300759 -29.096891646561062,24.581190975249282 -29.094197676012925,24.575345028352995 -29.09141387240804,24.569555890929308 -29.088541090963787,24.563825336412574 -29.085580214158654,24.558155119777709 -29.082532151454132,24.552546977010394 -29.079397839008323,24.547002624558662 -29.076178239381264,24.541523758819078 -29.072874341232009,24.536112055581267 -29.069487159007593,24.530769169535724 -29.066017732624076,24.525496733734869 -29.062467127139698,24.520296359129322 -29.05883643242025,24.51516963403224 -29.055126762796746,24.510118123646617 -29.051339256715593,24.505143369583088 -29.047475076381517,24.500246889399495 -29.043535407392909,24.495430176109121 -29.039521458370103,24.490694697745731 -29.035434460576823,24.486041896912539 -29.031275667534388,24.48147319033713 -29.027046354629377,24.476989968442318 -29.022747818714564,24.472593594929183 -29.018381377703292,24.468285406357666 -29.013948370157522,24.464066711746444 -29.009450154869668,24.459938792187 -29.004888110438372,24.455902900440044 -29.000263634838049,24.451960260573188 -28.995578144983043,24.448112067596 -28.990833076285767,24.444359487098055 -28.986029882209536,24.44070365489959 -28.981170033815886,24.437145676725937 -28.976255019306763,24.433686627867946 -28.97128634356163,24.430327552875845 -28.96626552766962,24.427069465247971 -28.961194108456937,24.423913347135542 -28.956073638009698,24.42086014904967 -28.950905683192275,24.417910789595343 -28.94569182516129,24.415066155207974 -28.940433658875676,24.412327099879342 -28.935132792602516,24.409694444937649 -28.92979084741917,24.407168978800154 -28.924409456711885,24.404751456746943 -28.918990265670601,24.402442600716888 -28.913534930780742,24.400243099108827 -28.908045119311723,24.398153606566066 -28.902522508802292,24.396174743834386 -28.896968786543397,24.394307097562059 -28.891385649057952,24.392551220150821 -28.885774801578492,24.390907629609767 -28.880137957522209,24.389376809416095 -28.874476837963954,24.387959208394719 -28.868793171107171,24.386655240593281 -28.863088691752992,24.385465285184505 -28.857365140767754,24.384389686372867 -28.85162426454886,24.383428753306539 -28.845867814489324,24.382582760017886 -28.840097546441314,24.381851945350171 -28.834315220178425,24.381236512910647 -28.828522598857376,24.380736631045696 -28.822721448478802,24.380352432786076 -28.816913537347659,24.380084015857527 -28.811100635533307,24.379931442656179 -28.805284514329315,24.379894740264159 -28.799466945713419,24.379973900455347 -28.793649701807396,24.380168879732398 -28.787834554337508,24.380479599350231 -28.782023274095195,24.380905945380039 -28.776217630398676,24.381447768749211 -28.770419390555091,24.382104885327035 -28.764630319323757,24.382877075992894 -28.758852178380579,24.383764086727492 -28.753086725783632,24.384765628718988 -28.7473357154403,24.385881378465342 -28.741600896576003,24.387110977902687 -28.735884013204668,24.388454034527843 -28.730186803601043,24.389910121547288 -28.724510999775319,24.391478778027793 -28.718858326949757,24.393159509049113 -28.713230503037792,24.394951785889248 -28.707629238125719,24.396855046189913 -28.702056233957038,24.398868694159816 -28.696513183419484,24.400992100773593 -28.691001770035456,24.403224603976568 -28.685523667455101,24.405565508901095 -28.680080538952993,24.408014088116055 -28.674674036928209,24.410569581839891 -28.669305802407834,24.413231198210617 -28.663977464554407,24.415998113517148 -28.658690640176914,24.418869472501903 -28.653446933246229,24.42184438860005 -28.64824793441413,24.424921944242151 -28.643095220537134,24.428101191151065 -28.637990354204419,24.431381150627736 -28.632934883270281,24.434760813871538 -28.627930340391472,24.438239142306717 -28.622978242569175,24.441815067880722 -28.618080090695855,24.445487493441991 -28.613237369107495,24.449255293041791 -28.608451545140568,24.453117312317403 -28.603724068694731,24.457072368823141 -28.599056371800572,24.461119252427562 -28.594449868193294,24.465256725664762 -28.589905952891769,24.469483524126915 -28.585426001783489,24.473798356852907 -28.581011371215411,24.478199906715595 -28.576663397590849,24.48268683085379 -28.572383396972441,24.487257761043733 -28.568172664691346,24.491911304154055 -28.564032474962829,24.496646042544203 -28.559964080508252,24.501460534510869 -28.555968712183585,24.506353314724617 -28.552047578614662,24.511322894671945 -28.548201865839104,24.516367763102515 -28.544432736955102,24.52148638648579 -28.540741331777156,24.526677209488223 -28.537128766498796,24.531938655423552 -28.533596133362522,24.537269126740796 -28.530144500336959,24.542667005499531 -28.526774910801166,24.548130653851075 -28.523488383236369,24.553658414542507 -28.520285910925423,24.559248611389858 -28.517168461659423,24.564899549803645 -28.514136977452182,24.57060951729083 -28.511192374262492,24.576376783945427 -28.508335541723795,24.582199602983856 -28.505567342882131,24.588076211266849 -28.502888613941764,24.594004829807968 -28.500300164018839,24.599983664309274 -28.497802774903008,24.606010905708388 -28.495397200827426,24.612084730676745 -28.493084168246597,24.618203302205877 -28.490864375622735,24.624364770124082 -28.48873849322014,24.630567271652016 -28.486707162908274,24.636808931930073 -28.48477099797276,24.64308786462378 -28.482930582935339,24.649402172429006 -28.481186473381939,24.655749947658894 -28.479539195799475,24.662129272778778 -28.47798924742105,24.668538221026751 -28.476537096080108,24.674974856924731 -28.475183180072875,24.68143723685181 -28.47392790802968,24.687923409675783 -28.472771658795054,24.694431417230337 -28.47171478131645,24.700959294993751 -28.47075759454188,24.70750507257009 -28.469900387326192,24.714066774367769 -28.469143418346533,24.720642420038875 -28.468486916026166,24.727230025245085 -28.467931078467672,24.73382760206988 -28.467476073394735,24.740433159690181 -28.467122038103,24.747044705027836 -28.466869079419723,24.753660243120745 -28.46671727367243,24.760277777777777 -28.466666666666683))', max_error=0.0000001) != 0: print('did not get expected first geom') pytest.fail(geom.ExportToWkt()) feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POLYGON ((25.324444444444445 -28.735,25.324444444444445 -28.735,25.324444444444747 -28.735,25.3256844012835 -28.743637219488093,25.326752458414518 -28.752292221672775,25.327648242989319 -28.760962374913134,25.328371434292126 -28.769645042225264,25.328921763884399 -28.778337582080368,25.329299015739096 -28.787037349205164,25.329503026367707 -28.795741695383924,25.329533684919237 -28.804447970262672,25.329390933266499 -28.813153522154423,25.329074766083266 -28.821855698846022,25.328585230899417 -28.830551848405761,25.32792242813515 -28.839239319991876,25.327086511130251 -28.847915464661341,25.326077686158602 -28.856577636179196,25.324896212403537 -28.865223191827752,25.323542401945843 -28.873849493215474,25.322016619719491 -28.882453907085591,25.320319283456154 -28.891033806123644,25.31845086360034 -28.899586569764509,25.316411883234647 -28.908109584997732,25.314202917960664 -28.916600247171544,25.311824595781452 -28.925055960795305,25.309277596961152 -28.933474140339584,25.306562653857945 -28.941852211034359,25.303680550768494 -28.950187609664397,25.300632123720742 -28.958477785362163,25.29741826027432 -28.966720200397404,25.294039899300181 -28.974912330963704,25.290498030727949 -28.983051667961448,25.286793695305345 -28.991135717776984,25.282927984310767 -28.999162003057677,25.278902039273312 -29.007128063482853,25.274717051653134 -29.015031456530025,25.270374262533323 -29.022869758236496,25.265874962270246 -29.030640563955714,25.26122049013696 -29.038341489108532,25.256412233959036 -29.045970169928736,25.251451629715206 -29.053524264202991,25.246340161140221 -29.06100145200449,25.241079359298173 -29.068399436420506,25.23567080214746 -29.075715944273327,25.230116114090873 -29.082948726834402,25.224416965497046 -29.090095560531509,25.218575072228933 -29.097154247648504,25.212592195130505 -29.10412261701785,25.206470139518853 -29.110998524705039,25.200210754651753 -29.11777985468531,25.193815933175109 -29.124464519512046,25.187287610571182 -29.131050460976667,25.180627764570215 -29.137535650759972,25.173838414570472 -29.143918091074411,25.166921621027861 -29.150195815297337,25.159879484826497 -29.156366888594846,25.152714146662561 -29.162429408536127,25.145427786377269 -29.168381505697866,25.138022622300941 -29.174221344258754,25.130500910584292 -29.179947122583698,25.122864944495355 -29.185557073797725,25.115117053723321 -29.191049466349057,25.107259603657024 -29.196422604561548,25.099294994669837 -29.201674829175872,25.091225661355146 -29.206804517879718,25.083054071794677 -29.211810085826329,25.074782726776942 -29.216689986141546,25.066414159022649 -29.221442710419112,25.057950932399795 -29.226066789203841,25.049395641117307 -29.230560792462668,25.040750908918767 -29.234923330043529,25.032019388244304 -29.239153052121523,25.023203759421683 -29.243248649632577,25.014306729794193 -29.247208854694165,25.005331032890854 -29.251032441013166,24.996279427553059 -29.254718224280467,24.987154697052485 -29.258265062552468,24.977959648227149 -29.261671856618946,24.96869711057434 -29.264937550357544,24.959369935370919 -29.268061131074475,24.949980994740844 -29.271041629831515,24.940533180755306 -29.273878121758855,24.931029404524764 -29.276569726354225,24.921472595226302 -29.27911560776748,24.911865699212655 -29.281514975071246,24.902211679051732 -29.283767082516917,24.892513512561873 -29.285871229776419,24.882774191884664 -29.287826762169175,24.872996722502361 -29.289633070874672,24.863184122310912 -29.291289593130031,24.853339420578315 -29.292795812413047,24.843465657046142 -29.294151258610142,24.833565880890973 -29.295355508169479,24.823643149820615 -29.296408184238985,24.813700528987738 -29.297308956789578,24.803741090085058 -29.298057542722887,24.793767910343536 -29.298653705964284,24.783784071443542 -29.299097257540382,24.773792658660838 -29.299388055641543,24.763796759952577 -29.299526005669037,24.753799464358973 -29.299511060267122,24.743803861918728 -29.299343219339562,24.733813042177051 -29.299022530051275,24.723830092997549 -29.298549086814461,24.713858099961822 -29.297923031259401,24.703900145183407 -29.297144552190304,24.693959306309406 -29.296213885525674,24.684038655567267 -29.295131314223482,24.674141258801942 -29.293897168191322,24.664270174416327 -29.292511824181247,24.65442845241142 -29.290975705669538,24.644619133445421 -29.289289282721541,24.634845247808041 -29.287453071841185,24.625109814448344 -29.285467635805958,24.615415840038214 -29.283333583486638,24.605766317960285 -29.281051569652291,24.596164227391593 -29.278622294760709,24.586612532310763 -29.276046504733856,24.577114180572615 -29.273324990718947,24.567672102945274 -29.270458588834956,24.558289212193195 -29.267448179904818,24.548968402128249 -29.264294689173013,24.539712546687348 -29.260999086009392,24.530524499021816 -29.257562383598525,24.521407090592227 -29.253985638615347,24.512363130253711 -29.250269950886775,24.503395403389867 -29.246416463039765,24.494506670979664 -29.242426360135497,24.485699668772813 -29.238300869290413,24.476977106411617 -29.234041259283813,24.468341666547062 -29.229648840152166,24.459796004019395 -29.225124962770508,24.451342745027716 -29.220471018421009,24.442984486277584 -29.215688438348721,24.434723794192617 -29.210778693304832,24.426563204089472 -29.205743293077461,24.418505219398092 -29.200583786010426,24.410552310879975 -29.195301758509814,24.402706915859742 -29.189898834538667,24.394971437455574 -29.184376675100097,24.387348243856902 -29.178736977708979,24.379839667567335 -29.172981475852069,24.372448004707099 -29.167111938437387,24.365175514288836 -29.161130169232337,24.358024417543742 -29.155038006291477,24.350996897226008 -29.14883732137352,24.34409509694385 -29.142530019348044,24.337321120532131 -29.136118037592439,24.33067703138671 -29.129603345378626,24.324164851854118 -29.122987943250237,24.317786562621645 -29.116273862390543,24.311544102121797 -29.109463163980905,24.30543936594934 -29.10255793855049,24.2994742062996 -29.095560305316994,24.293650431416442 -29.088472411518978,24.287969805061284 -29.081296431740057,24.282434045985305 -29.074034567224615,24.277044827435564 -29.06668904518618,24.271803776659787 -29.059262118107824,24.266712474439807 -29.051756063035484,24.261772454629462 -29.044173180864007,24.256985203708833 -29.036515795616396,24.252352160375441 -29.02878625371649,24.247874715121878 -29.02098692325518,24.24355420984503 -29.013120193250629,24.239391937478619 -29.00518847290239,24.235389141624353 -28.997194190840176,24.231547016208346 -28.989139794367077,24.227866705162754 -28.981027748697628,24.224349302108447 -28.972860536191234,24.220995850059293 -28.964640655580638,24.217807341153009 -28.956370621196328,24.214784716384329 -28.948052962186651,24.211928865360008 -28.939690221734097,24.209240626079428 -28.931284956268058,24.206720784716541 -28.92283973467417,24.204370075425757 -28.914357137500531,24.202189180171864 -28.905839756161143,24.200178728561479 -28.897290192136808,24.198339297705129 -28.888711056173534,24.196671412087511 -28.880104967479028,24.195175543457147 -28.871474552917306,24.19385211072877 -28.862822446201619,24.192701479915275 -28.854151287086367,24.19172396405807 -28.845463720557575,24.190919823186178 -28.836762396022849,24.190289264288399 -28.828049966500572,24.189832441300496 -28.819329087808967,24.189549455112285 -28.810602417754893,24.189440353583787 -28.801872615323049,24.189505131591886 -28.793142339865469,24.189743731066635 -28.784414250291647,24.190156041080773 -28.775691004259812,24.190741897919008 -28.766975257369026,24.191501085191938 -28.758269662353158,24.192433333936325 -28.74957686827598,24.193538322762858 -28.740899519728529,24.194815678001433 -28.732240256028561,24.196264973852333 -28.723601710422116,24.197885732583238 -28.714986509287982,24.19967742470579 -28.706397271344827,24.201639469198703 -28.697836606861372,24.203771233721888 -28.68930711687004,24.206072034858177 -28.680811392383887,24.208541138376447 -28.672352013617413,24.211177759476751 -28.663931549211355,24.213981063100391 -28.655552555461597,24.2169501642021 -28.647217575552503,24.220084128082078 -28.638929138794964,24.223381970696099 -28.630689759869227,24.226842659002589 -28.622501938072631,24.230465111308209 -28.614368156572979,24.234248197645979 -28.606290881666965,24.238190740140944 -28.598272562044642,24.242291513417509 -28.590315628059457,24.246549244988177 -28.582422491004635,24.250962615689375 -28.574595542395741,24.255530260106084 -28.566837153259698,24.260250767015116 -28.559149673430525,24.265122679844414 -28.551535430851899,24.270144497143669 -28.543996730886917,24.275314673058389 -28.536535855634881,24.280631617835351 -28.529155063255686,24.286093698316382 -28.521856587301826,24.291699238459888 -28.514642636057971,24.297446519871226 -28.507515391888845,24.303333782336477 -28.500477010594921,24.309359224380383 -28.493529620776712,24.31552100381996 -28.486675323207294,24.321817238338735 -28.479916190213615,24.328246006069861 -28.473254265066558,24.334805346194791 -28.466691561380145,24.341493259533799 -28.4602300625194,24.348307709170513 -28.453871721018132,24.355246621064914 -28.447618458005579,24.362307884696193 -28.441472162642967,24.369489353694416 -28.435434691569711,24.376788846495483 -28.429507868359337,24.384204147000045 -28.423693482985684,24.391733005249641 -28.417993291298984,24.399373138086929 -28.412409014512306,24.407122229850941 -28.406942338698542,24.414977933080777 -28.401594914297746,24.422937869201576 -28.396368355635119,24.430999629236783 -28.391264240449956,24.43916077453795 -28.38628410943538,24.447418837487788 -28.381429465788997,24.455771322249223 -28.37670177477483,24.464215705504113 -28.372102463296528,24.472749437186824 -28.367632919481679,24.481369941250147 -28.363294492277845,24.490074616410581 -28.359088491059879,24.498860836925523 -28.355016185249198,24.50772595334951 -28.351078803944461,24.516667293338532 -28.347277535564402,24.525682162385579 -28.343613527502299,24.534767844672221 -28.340087885792698,24.543921603800779 -28.336701674789964,24.553140683623202 -28.333455916859251,24.562422309051517 -28.330351592079595,24.57176368682665 -28.327389637959214,24.581162006386851 -28.324570949163544,24.590614440635008 -28.3218963772552,24.60011814677102 -28.31936673044703,24.609670267145127 -28.316982773367286,24.619267930032869 -28.314745226837644,24.628908250528362 -28.312654767663972,24.63858833131291 -28.310712028439568,24.648305263544835 -28.308917597361543,24.658056127663254 -28.30727201805972,24.667837994267057 -28.305775789438641,24.677647924917796 -28.304429365532272,24.687482973026292 -28.303233155371913,24.697340184664604 -28.302187522866816,24.707216599457116 -28.301292786698056,24.717109251382755 -28.300549220225193,24.727015169673113 -28.299957051406295,24.736931379690652 -28.299516462730722,24.746854903656409 -28.299227591165192,24.756782761632255 -28.29909052811297,24.766711972434599 -28.299105319386072,24.776639554240347 -28.299271965190698,24.786562525734769 -28.299590420125625,24.796477906700915 -28.300060593194004,24.806382719171182 -28.300682347828001,24.816273988013755 -28.301455501926711,24.826148741958701 -28.302379827907302,24.836004014361414 -28.303455052768882,24.845836844098478 -28.304680858169917,24.855644276402057 -28.306056880518398,24.865423363765725 -28.307582711075085,24.875171166708189 -28.309257896070051,24.884884754678925 -28.311081936831783,24.894561206900327 -28.313054289929653,24.904197613154185 -28.315174367329107,24.913791074742456 -28.317441536559656,24.92333870518836 -28.31985512089615,24.932837631161526 -28.322414399552244,24.93611111111111 -28.323333333333334,24.93611111111111 -28.323333333333334,24.74 -28.466111111111111,24.74 -28.466111111111111,24.740000000006798 -28.466111111112809,24.746632430249097 -28.465871637044913,24.753268187622954 -28.465733642679226,24.759905272118928 -28.465697157550323,24.766541673734942 -28.465762180560702,24.77317539772077 -28.4659286799847,24.779804440348542 -28.466196593481584,24.786426802076775 -28.466565828117496,24.793040485511163 -28.467036260396483,24.799643496136763 -28.467607736300309,24.806233842740653 -28.468280071337446,24.812809538018556 -28.46905305060092,24.819368599277652 -28.469926428834924,24.825909048903572 -28.470899930510456,24.832428914991102 -28.471973249910022,24.838926231930369 -28.473146051220724,24.845399040894488 -28.474417968636757,24.85184539057164 -28.475788606470175,24.85826333757198 -28.477257539270838,24.864650947139452 -28.478824311954796,24.871006293602161 -28.480488439941709,24.877327461036565 -28.482249409300493,24.883612543751585 -28.484106676904105,24.889859646912562 -28.486059670592425,24.896066887037229 -28.488107789344113,24.902232392611545 -28.490250403456642,24.908354304611503 -28.492486854734935,24.91443077703882 -28.494816456688355,24.920459977479492 -28.49723849473618,24.926440087661302 -28.499752226420981,24.932369303955355 -28.502356881630817,24.938245837939125 -28.505051662829032,24.944067916906295 -28.50783574529251,24.949833784410384 -28.510708277357907,24.955541700766702 -28.51366838067581,24.961189943568936 -28.516715150472848,24.966776808222054 -28.519847655821607,24.972300608432882 -28.523064939918342,24.9777596767074 -28.526366020368442,24.983152364848348 -28.529749889479419,24.988477044467242 -28.533215514561434,24.993732107439818 -28.536761838235364,24.998915966414472 -28.540387778748141,25.004027055264203 -28.544092230295462,25.009063829563729 -28.547874063351784,25.014024767071181 -28.551732125007007,25.018908368153632 -28.555665239310756,25.023713156252619 -28.559672207623251,25.028437678344208 -28.563751808972938,25.033080505346668 -28.567902800421166,25.03764023257828 -28.572123917433132,25.042115480170764 -28.576413874255621,25.046504893485697 -28.580771364301086,25.050807143534044 -28.585195060537998,25.055020927375441 -28.589683615887409,25.059144968510566 -28.594235663625824,25.063178017286948 -28.598849817793635,25.067118851257888 -28.603524673609968,25.070966275578758 -28.608258807892824,25.074719123363518 -28.61305077948515,25.078376256041661 -28.617899129686265,25.081936563715608 -28.622802382688874,25.085398965501863 -28.627759046021239,25.088762409872622 -28.632767610994421,25.092025874965881 -28.637826553154852,25.095188368924873 -28.642934332741433,25.098248930184742 -28.648089395147835,25.101206627805809 -28.653290171388974,25.104060561732403 -28.658535078572456,25.106809863101081 -28.663822520374055,25.109453694502864 -28.669150887517645,25.111991250254196 -28.674518558259152,25.114421756659766 -28.679923898874449,25.116744472249401 -28.685365264151244,25.118958688020527 -28.690840997884379,25.121063727672666 -28.696349433375019,25.123058947821914 -28.701888893932889,25.124943738219745 -28.707457693382054,25.126717521933593 -28.713054136569667,25.128379755560044 -28.718676519877718,25.129929929402699 -28.724323131737549,25.131367567623556 -28.729992253147103,25.132692228430109 -28.735682158190684,25.13390350421783 -28.741391114561011,25.135001021699754 -28.747117384083495,25.135984442057644 -28.752859223242652,25.136853461048599 -28.75861488371028,25.137607809118133 -28.764382612875551,25.138247251504847 -28.770160654376411,25.138771588331661 -28.775947248632733,25.139180654678363 -28.781740633380437,25.139474320653182 -28.787539044207037,25.139652491459525 -28.793340715087666,25.139715107429993 -28.79914387892245,25.139662144076386 -28.804946768074032,25.139493612107152 -28.810747614905807,25.139444444444443 -28.811944444444446,25.139444444444443 -28.811944444444446,25.324444444444445 -28.735))', max_error=0.0000001) != 0: print('did not get expected second geom') pytest.fail(geom.ExportToWkt()) gdalautotest-3.0.4/ogr/ogr_oapif.py0000755003401500001440000010237713614005363016754 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_oapif.py ddba6b654e3b5195adeb8f82ed0b220a57333c39 2019-10-07 15:34:14 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: OAPIF driver 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 gdaltest from osgeo import ogr import webserver import pytest ############################################################################### # Init # def test_ogr_opaif_init(): gdaltest.opaif_drv = ogr.GetDriverByName('WFS3') if gdaltest.opaif_drv is None: pytest.skip() (gdaltest.webserver_process, gdaltest.webserver_port) = \ webserver.launch(handler=webserver.DispatcherHttpHandler) if gdaltest.webserver_port == 0: pytest.skip() ############################################################################### def test_ogr_opaif_errors(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 404) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None # No Content-Type handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {}, 'foo') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None # Unexpected Content-Type handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'text/html'}, 'foo') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None # Invalid JSON handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, 'foo bar') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None # Valid JSON but not collections array handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{}') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None # Valid JSON but collections is not an array handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{ "collections" : null }') with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ null, {} ] }') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is None ############################################################################### def test_ogr_opaif_collections_paging(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "id": "foo" } ], "links": [ { "rel": "next", "href": "http://localhost:%d/oapif/collections?next=my_mark", "type": "application/json" } ]}""" % gdaltest.webserver_port) handler.add('GET', '/oapif/collections?next=my_mark', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ { "id": "bar" } ]}') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) assert ds is not None assert ds.GetLayerCount() == 2 assert ds.GetLayer(0).GetName() == 'foo' assert ds.GetLayer(1).GetName() == 'bar' ############################################################################### def test_ogr_opaif_empty_layer_and_user_query_parameters(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections?FOO=BAR', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ { "name": "foo" }] }') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif?FOO=BAR' % gdaltest.webserver_port) assert ds is not None assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr.GetName() == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&FOO=BAR', 200, {'Content-Type': 'application/geo+json'}, '{ "type": "FeatureCollection", "features": [] }') with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 0 ############################################################################### def test_ogr_opaif_open_by_collection_and_legacy_wfs3_prefix(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo', 200, {'Content-Type': 'application/json'}, '{ "id": "foo" }') with webserver.install_http_handler(handler): ds = ogr.Open('WFS3:http://localhost:%d/oapif/collections/foo' % gdaltest.webserver_port) assert ds is not None assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr.GetName() == 'foo' handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, '{ "type": "FeatureCollection", "features": [] }') with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 0 ############################################################################### def test_ogr_opaif_fc_links_next_geojson(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ { "name": "foo" }] }') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "links" : [ { "rel": "next", "type": "application/geo+json", "href": "http://localhost:%d/oapif/foo_next" } ], "features": [ { "type": "Feature", "properties": { "foo": "bar" } } ] }""" % gdaltest.webserver_port) with webserver.install_http_handler(handler): f = lyr.GetNextFeature() if f['foo'] != 'bar': f.DumpReadable() pytest.fail() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/foo_next', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "baz" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() if f['foo'] != 'baz': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_opaif_id_is_integer(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ { "name": "foo" }] }') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "id": 100, "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "id": 100, "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f.GetFID() == 100 handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items/100', 200, {'Content-Type': 'application/geo+json'}, """{ "id": 100, "type": "Feature", "properties": { "foo": "bar" } }""") with webserver.install_http_handler(handler): f = lyr.GetFeature(100) assert f ############################################################################### def NO_LONGER_USED_test_ogr_opaif_fc_links_next_headers(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, '{ "collections" : [ { "name": "foo" }] }') with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 1 handler = webserver.SequentialHandler() link_val = '; rel="self"; type="application/geo+json"\r\nLink: ; rel="next"; type="application/geo+json"' % gdaltest.webserver_port handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json', 'Link': link_val}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() if f['foo'] != 'bar': f.DumpReadable() pytest.fail() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/foo_next', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "baz" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() if f['foo'] != 'baz': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_opaif_spatial_filter(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() # Deprecated API handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "name": "foo", "extent": { "spatial": [ -10, 40, 15, 50 ] } }] }""") with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCFastGetExtent) assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) # Nominal API handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "id": "foo", "extent": { "spatial": { "bbox": [ [ -10, 40, -100, 15, 50, 100 ] ] } } }] }""") with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) assert lyr.GetExtent() == (-10.0, 15.0, 40.0, 50.0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar" } } ] }""") with webserver.install_http_handler(handler): assert lyr.GetLayerDefn().GetFieldCount() == 1 lyr.SetSpatialFilterRect(2, 49, 3, 50) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&bbox=2,49,3,50', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar", }, "geometry": { "type": "Point", "coordinates": [ 2.5, 49.5 ] } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # Test clamping of bounds lyr.SetSpatialFilterRect(-200, 49, 200, 50) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&bbox=-180,49,180,50', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar", }, "geometry": { "type": "Point", "coordinates": [ 2.5, 49.5 ] } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None lyr.SetSpatialFilterRect(2, -100, 3, 100) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&bbox=2,-90,3,90', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar", }, "geometry": { "type": "Point", "coordinates": [ 2.5, 49.5 ] } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None lyr.SetSpatialFilterRect(-200, -100, 200, 100) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar", }, "geometry": { "type": "Point", "coordinates": [ 2.5, 49.5 ] } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None lyr.SetSpatialFilter(None) lyr.ResetReading() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "foo": "bar", } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_opaif_get_feature_count(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "id": "foo" }] }""") with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/json'}, '{}') handler.add('GET', '/oapif', 200, {'Content-Type': 'application/json'}, """{ "links" : [ { "rel": "service-desc", "href" : "http://localhost:%d/oapif/my_api", "type": "application/vnd.oai.openapi+json;version=3.0" } ] }""" % gdaltest.webserver_port ) # Fake openapi response handler.add('GET', '/oapif/my_api', 200, {'Content-Type': 'application/vnd.oai.openapi+json; charset=utf-8; version=3.0'}, """{ "openapi": "3.0.0", "paths" : { "/collections/foo/items": { "get": { "parameters": [ { "$ref" : "#/components/parameters/resultType" } ] } } }, "components": { "parameters": { "resultType": { "name": "resultType", "in": "query", "schema" : { "type" : "string", "enum" : [ "hits", "results" ] } } } } }""") handler.add('GET', '/oapif/collections/foo/items?resultType=hits', 200, {'Content-Type': 'application/json'}, '{ "numberMatched": 1234 }') with webserver.install_http_handler(handler): assert lyr.GetFeatureCount() == 1234 handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?resultType=hits', 200, {'Content-Type': 'application/json'}, '{ "numberMatched": 1234 }') with webserver.install_http_handler(handler): assert lyr.GetFeatureCount() == 1234 ############################################################################### def test_ogr_opaif_get_feature_count_from_numberMatched(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "id": "foo" }] }""") with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, '{ "type": "FeatureCollection", "features": [], "numberMatched": 1234 }') with webserver.install_http_handler(handler): assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 0 # Cannot know yet assert lyr.GetFeatureCount() == 1234 assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 ############################################################################### def test_ogr_opaif_attribute_filter(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections', 200, {'Content-Type': 'application/json'}, """{ "collections" : [ { "name": "foo" }] }""") with webserver.install_http_handler(handler): ds = ogr.Open('OAPIF:http://localhost:%d/oapif' % gdaltest.webserver_port) lyr = ds.GetLayer(0) lyr.SetAttributeFilter(None) # should not cause network request handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "id": "my_id", "type": "Feature", "properties": { "attr1": "", "attr2": 0, "attr3": "", "mydatetime": "2019-10-01T12:34:56Z" } } ] }""") # Fake openapi response handler.add('GET', '/oapif', 200, {'Content-Type': 'application/json'}, """{ "links" : [ { "rel": "service-desc", "href" : "http://localhost:%d/oapif/my_api", "type": "application/vnd.oai.openapi+json;version=3.0" } ] }""" % gdaltest.webserver_port ) handler.add('GET', '/oapif/my_api', 200, {'Content-Type': 'application/json'}, """{ "openapi": "3.0.0", "paths" : { "/collections/foo/items": { "get": { "parameters": [ { "name": "attr1", "in": "query" }, { "name": "attr2", "in": "query" } ] } } } }""") with webserver.install_http_handler(handler): lyr.SetAttributeFilter("(attr1 = 'foo' AND attr2 = 2) AND attr3 = 'bar'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&attr1=foo&attr2=2', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "attr1": "foo", "attr2": 2, "attr3": "foo" } }, { "type": "Feature", "properties": { "attr1": "foo", "attr2": 2, "attr3": "bar" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None lyr.ResetReading() lyr.SetAttributeFilter("attr1 = 'foo' OR attr3 = 'bar'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "attr1": "foo", "attr3": "foo" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # Date = lyr.ResetReading() lyr.SetAttributeFilter("mydatetime = '2019-10-01T12:34:56Z'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&datetime=2019-10-01T12:34:56Z', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "mydatetime": "2019-10-01T12:34:56Z" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # Date >= lyr.ResetReading() lyr.SetAttributeFilter("mydatetime >= '2019-10-01T12:34:56Z'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&datetime=2019-10-01T12:34:56Z%2F..', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "mydatetime": "2019-10-01T12:34:56Z" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # Date <= lyr.ResetReading() lyr.SetAttributeFilter("mydatetime <= '2019-10-01T12:34:56Z'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&datetime=..%2F2019-10-01T12:34:56Z', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "mydatetime": "2019-10-01T12:34:56Z" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # Date >= and <= lyr.ResetReading() lyr.SetAttributeFilter("mydatetime BETWEEN '2019-10-01T' AND '2019-10-02T'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10&datetime=2019-10-01T%2F2019-10-02T', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "mydatetime": "2019-10-01T12:34:56Z" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None # id lyr.ResetReading() lyr.SetAttributeFilter("id = 'my_id'") handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items/my_id', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "Feature", "id": "my_id", "properties": { } }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None lyr.ResetReading() lyr.SetAttributeFilter(None) handler = webserver.SequentialHandler() handler.add('GET', '/oapif/collections/foo/items?limit=10', 200, {'Content-Type': 'application/geo+json'}, """{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "attr1": "foo", "attr3": "foo" } } ] }""") with webserver.install_http_handler(handler): f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_opaif_cleanup(): if gdaltest.opaif_drv is None: pytest.skip() if gdaltest.webserver_port != 0: webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) gdalautotest-3.0.4/ogr/ogr_ngw.py0000644003401500001440000006104213614005363016437 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ################################################################################ # Project: OGR NextGIS Web Driver # Purpose: Tests OGR NGW Driver capabilities # Author: Dmitry Baryshnikov, polimax@mail.ru # Language: Python ################################################################################ # The MIT License (MIT) # # 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 sys.path.append('../pymod') import gdaltest from osgeo import gdal from osgeo import ogr from osgeo import osr 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)) ############################################################################### # Check driver existence. def test_ogr_ngw_1(): gdaltest.ngw_ds = None gdaltest.ngw_drv = None gdaltest.ngw_drv = gdal.GetDriverByName('NGW') if gdaltest.ngw_drv is 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_ogr_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() gdaltest.ngw_ds = gdaltest.ngw_drv.Create(create_url, 0, 0, 0, gdal.GDT_Unknown, \ options=['DESCRIPTION=GDAL Test group',]) gdal.PopErrorHandler() assert gdaltest.ngw_ds is not None, 'Create datasource failed.' assert gdaltest.ngw_ds.GetMetadataItem('description', '') == 'GDAL Test group', \ 'Did not get expected datasource description.' assert int(gdaltest.ngw_ds.GetMetadataItem('id', '')) > 0, \ 'Did not get expected datasource identifier.' gdaltest.group_id = gdaltest.ngw_ds.GetMetadataItem('id', '') ############################################################################### # Check rename datasource. def test_ogr_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.' ############################################################################### # Check datasource metadata. def test_ogr_ngw_4(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') gdaltest.ngw_ds.SetMetadataItem('test_int.d', '777', 'NGW') gdaltest.ngw_ds.SetMetadataItem('test_float.f', '777.555', 'NGW') gdaltest.ngw_ds.SetMetadataItem('test_string', 'metadata test', 'NGW') gdaltest.ngw_ds = None url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_UPDATE) # gdaltest.ngw_drv.Open(url, update=1) assert gdaltest.ngw_ds is not None, \ 'Open datasource failed.' md_item = gdaltest.ngw_ds.GetMetadataItem('test_int.d', 'NGW') assert md_item == '777', \ 'Did not get expected datasource metadata item. test_int.d is equal {}, but should {}.'.format(md_item, '777') md_item = gdaltest.ngw_ds.GetMetadataItem('test_float.f', 'NGW') assert abs(float(md_item) - 777.555) < 0.00001, \ 'Did not get expected datasource metadata item. test_float.f is equal {}, but should {}.'.format(md_item, '777.555') md_item = gdaltest.ngw_ds.GetMetadataItem('test_string', 'NGW') assert md_item == 'metadata test', \ 'Did not get expected datasource metadata item. test_string is equal {}, but should {}.'.format(md_item, 'metadata test') resource_type = gdaltest.ngw_ds.GetMetadataItem('resource_type', '') assert resource_type is not None, 'Did not get expected datasource metadata item. Resourse type should be present.' def create_fields(lyr): fld_defn = ogr.FieldDefn('STRFIELD', ogr.OFTString) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_0_ALIAS', 'String field test') fld_defn = ogr.FieldDefn('DECFIELD', ogr.OFTInteger) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_1_ALIAS', 'Integer field test') fld_defn = ogr.FieldDefn('BIGDECFIELD', ogr.OFTInteger64) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_2_ALIAS', 'Integer64 field test') fld_defn = ogr.FieldDefn('REALFIELD', ogr.OFTReal) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_3_ALIAS', 'Real field test') fld_defn = ogr.FieldDefn('DATEFIELD', ogr.OFTDate) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_4_ALIAS', 'Date field test') fld_defn = ogr.FieldDefn('TIMEFIELD', ogr.OFTTime) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_5_ALIAS', 'Time field test') fld_defn = ogr.FieldDefn('DATETIMEFLD', ogr.OFTDateTime) lyr.CreateField(fld_defn) lyr.SetMetadataItem('FIELD_6_ALIAS', 'Date & time field test') def fill_fields(f): f.SetField('STRFIELD', "fo_o") f.SetField('DECFIELD', 123) f.SetField('BIGDECFIELD', 12345678901234) f.SetField('REALFIELD', 1.23) f.SetField('DATETIMEFLD', '2014/12/04 12:34:56') def fill_fields2(f): f.SetField('STRFIELD', "русский") f.SetField('DECFIELD', 321) f.SetField('BIGDECFIELD', 32145678901234) f.SetField('REALFIELD', 21.32) f.SetField('DATETIMEFLD', '2019/12/31 21:43:56') def add_metadata(lyr): lyr.SetMetadataItem('test_int.d', '777', 'NGW') lyr.SetMetadataItem('test_float.f', '777,555', 'NGW') lyr.SetMetadataItem('test_string', 'metadata test', 'NGW') ############################################################################### # Check create vector layers. def test_ogr_ngw_5(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() sr = osr.SpatialReference() sr.ImportFromEPSG(3857) lyr = gdaltest.ngw_ds.CreateLayer('test_pt_layer', srs=sr, geom_type=ogr.wkbMultiPoint, options=['OVERWRITE=YES', 'DESCRIPTION=Test point layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) # Test duplicated names. fld_defn = ogr.FieldDefn('STRFIELD', ogr.OFTString) assert lyr.CreateField(fld_defn) != 0, 'Expected not to create duplicated field' # Test forbidden field names. gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') fld_defn = ogr.FieldDefn('id', ogr.OFTInteger) lyr.CreateField(fld_defn) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'Expecting a warning' add_metadata(lyr) lyr = gdaltest.ngw_ds.CreateLayer('test_ln_layer', srs=sr, geom_type=ogr.wkbMultiLineString, options=['OVERWRITE=YES', 'DESCRIPTION=Test line layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) lyr = gdaltest.ngw_ds.CreateLayer('test_pl_layer', srs=sr, geom_type=ogr.wkbMultiPolygon, options=['OVERWRITE=YES', 'DESCRIPTION=Test polygon layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) # Test overwrite lyr = gdaltest.ngw_ds.CreateLayer('test_pt_layer', srs=sr, geom_type=ogr.wkbPoint, options=['OVERWRITE=YES', 'DESCRIPTION=Test point layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) lyr = gdaltest.ngw_ds.CreateLayer('test_ln_layer', srs=sr, geom_type=ogr.wkbLineString, options=['OVERWRITE=YES', 'DESCRIPTION=Test line layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) lyr = gdaltest.ngw_ds.CreateLayer('test_pl_layer', srs=sr, geom_type=ogr.wkbPolygon, options=['OVERWRITE=YES', 'DESCRIPTION=Test polygon layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) # Test without overwrite lyr = gdaltest.ngw_ds.CreateLayer('test_pl_layer', srs=sr, geom_type=ogr.wkbMultiPolygon, options=['OVERWRITE=NO', 'DESCRIPTION=Test polygon layer 1']) assert lyr is None, 'Create layer without overwrite should fail.' lyr = gdaltest.ngw_ds.CreateLayer('test_pl_layer', srs=sr, geom_type=ogr.wkbMultiPolygon, options=['DESCRIPTION=Test point layer 1']) assert lyr is None, 'Create layer without overwrite should fail.' # Test geometry with Z lyr = gdaltest.ngw_ds.CreateLayer('test_plz_layer', srs=sr, geom_type=ogr.wkbMultiPolygon25D, options=['OVERWRITE=YES', 'DESCRIPTION=Test polygonz layer']) assert lyr is not None, 'Create layer failed.' create_fields(lyr) add_metadata(lyr) ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') gdaltest.ngw_ds = None url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_UPDATE) # gdaltest.ngw_drv.Open(url, update=1) assert gdaltest.ngw_ds is not None, 'Open datasource failed.' for layer_name in ['test_pt_layer', 'test_ln_layer', 'test_pl_layer', 'test_plz_layer']: lyr = gdaltest.ngw_ds.GetLayerByName(layer_name) assert lyr is not None, 'Get layer {} failed.'.format(layer_name) md_item = lyr.GetMetadataItem('test_int.d', 'NGW') assert md_item == '777', \ 'Did not get expected layer metadata item. test_int.d is equal {}, but should {}.'.format(md_item, '777') md_item = lyr.GetMetadataItem('test_float.f', 'NGW') assert abs(float(md_item) - 777.555) < 0.00001, \ 'Did not get expected layer metadata item. test_float.f is equal {}, but should {}.'.format(md_item, '777.555') md_item = lyr.GetMetadataItem('test_string', 'NGW') assert md_item == 'metadata test', \ 'Did not get expected layer metadata item. test_string is equal {}, but should {}.'.format(md_item, 'metadata test') resource_type = lyr.GetMetadataItem('resource_type', '') assert resource_type is not None, 'Did not get expected layer metadata item. Resourse type should be present.' assert lyr.GetGeomType() != ogr.wkbUnknown and lyr.GetGeomType() != ogr.wkbNone ############################################################################### # Check open single vector layer. def test_ogr_ngw_6(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') lyr_resource_id = lyr.GetMetadataItem('id', '') url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + lyr_resource_id ds = gdal.OpenEx(url) assert ds is not None and ds.GetLayerCount() == 1, \ 'Failed to open single vector layer.' ############################################################################### # Check insert, update and delete features. def test_ogr_ngw_7(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') f = ogr.Feature(lyr.GetLayerDefn()) fill_fields(f) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() >= 0, \ 'Create feature failed. Expected FID greater or equal 0, got {}.'.format(f.GetFID()) fill_fields2(f) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) ret = lyr.SetFeature(f) assert ret == 0, 'Failed to update feature #{}.'.format(f.GetFID()) lyr.DeleteFeature(f.GetFID()) # Expected fail to get feature gdal.PushErrorHandler() f = lyr.GetFeature(f.GetFID()) gdal.PopErrorHandler() assert f is None, 'Failed to delete feature #{}.'.format(f.GetFID()) ############################################################################### # Check insert, update features in batch mode. def test_ogr_ngw_8(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') gdaltest.ngw_ds = None url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_UPDATE, open_options=['BATCH_SIZE=2']) lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') f1 = ogr.Feature(lyr.GetLayerDefn()) fill_fields(f1) f1.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) ret = lyr.CreateFeature(f1) assert ret == 0 and f1.GetFID() < 0 f2 = ogr.Feature(lyr.GetLayerDefn()) fill_fields2(f2) f2.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 3)')) ret = lyr.CreateFeature(f2) assert ret == 0 and f2.GetFID() < 0 f3 = ogr.Feature(lyr.GetLayerDefn()) fill_fields(f3) f3.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) ret = lyr.CreateFeature(f3) assert ret == 0 ret = lyr.SyncToDisk() assert ret == 0 lyr.ResetReading() feat = lyr.GetNextFeature() counter = 0 while feat is not None: counter += 1 assert feat.GetFID() >= 0, 'Expected FID greater or equal 0, got {}.'.format(feat.GetFID()) feat = lyr.GetNextFeature() assert counter >= 3, 'Expected 3 or greater feature count, got {}.'.format(counter) ############################################################################### # Check paging while GetNextFeature. def test_ogr_ngw_9(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') gdaltest.ngw_ds = None url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_UPDATE, open_options=['PAGE_SIZE=2']) lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') lyr.ResetReading() feat = lyr.GetNextFeature() counter = 0 while feat is not None: counter += 1 assert feat.GetFID() >= 0, 'Expected FID greater or equal 0, got {}.'.format(feat.GetFID()) feat = lyr.GetNextFeature() assert counter >= 3, 'Expected 3 or greater feature count, got {}.'.format(counter) ############################################################################### # Check native data. def test_ogr_ngw_10(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() ds_resource_id = gdaltest.ngw_ds.GetMetadataItem('id', '') gdaltest.ngw_ds = None url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + ds_resource_id gdaltest.ngw_ds = gdal.OpenEx(url, gdal.OF_UPDATE, open_options=['NATIVE_DATA=YES']) lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') lyr.ResetReading() feat = lyr.GetNextFeature() feature_id = feat.GetFID() native_data = feat.GetNativeData() assert native_data is not None, 'Feature #{} native data should not be empty'.format(feature_id) # {"description":null,"attachment":null} assert feat.GetNativeMediaType() == 'application/json', 'Unsupported native media type' # Set description feat.SetNativeData('{"description":"Test feature description"}') ret = lyr.SetFeature(feat) assert ret == 0, 'Failed to update feature #{}.'.format(feature_id) feat = lyr.GetFeature(feature_id) native_data = feat.GetNativeData() assert native_data is not None and native_data.find('Test feature description') != -1, 'Expected feature description text, got {}'.format(native_data) ############################################################################### # Check ignored fields works ok def test_ogr_ngw_11(): 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() lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') lyr.SetIgnoredFields(['STRFIELD']) feat = lyr.GetNextFeature() assert not feat.IsFieldSet('STRFIELD'), 'got STRFIELD despite request to ignore it.' assert feat.GetFieldAsInteger('DECFIELD') == 123, 'missing or wrong DECFIELD' fd = lyr.GetLayerDefn() fld = fd.GetFieldDefn(0) # STRFIELD assert fld.IsIgnored(), 'STRFIELD unexpectedly not marked as ignored.' fld = fd.GetFieldDefn(1) # DECFIELD assert not fld.IsIgnored(), 'DECFIELD unexpectedly marked as ignored.' assert not fd.IsGeometryIgnored(), 'geometry unexpectedly ignored.' assert not fd.IsStyleIgnored(), 'style unexpectedly ignored.' feat = None lyr = None ############################################################################### # Check attribute filter. def test_ogr_ngw_12(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') lyr.SetAttributeFilter("STRFIELD = 'русский'") fc = lyr.GetFeatureCount() assert fc == 1, 'Expected feature count is 1, got {}.'.format(fc) lyr.SetAttributeFilter("STRFIELD = 'fo_o' AND DECFIELD = 321") fc = lyr.GetFeatureCount() assert fc == 0, 'Expected feature count is 0, got {}.'.format(fc) lyr.SetAttributeFilter('NGW:fld_STRFIELD=fo_o&fld_DECFIELD=123') fc = lyr.GetFeatureCount() assert fc == 2, 'Expected feature count is 2, got {}.'.format(fc) ############################################################################### # Check spatial filter. def test_ogr_ngw_13(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() lyr = gdaltest.ngw_ds.GetLayerByName('test_pt_layer') # Reset any attribute filters lyr.SetAttributeFilter(None) # Check intersecting POINT(3 4) lyr.SetSpatialFilter(ogr.CreateGeometryFromWkt('POLYGON ((2.5 3.5,2.5 6,6 6,6 3.5,2.5 3.5))')) fc = lyr.GetFeatureCount() assert fc == 1, 'Expected feature count is 1, got {}.'.format(fc) ############################################################################### # Check ExecuteSQL. def test_ogr_ngw_14(): if gdaltest.ngw_drv is None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() gdaltest.ngw_ds.ExecuteSQL('DELLAYER:test_ln_layer') lyr = gdaltest.ngw_ds.GetLayerByName('test_ln_layer') assert lyr is None, 'Expected fail to get layer test_ln_layer.' lyr = gdaltest.ngw_ds.GetLayerByName('test_pl_layer') f = ogr.Feature(lyr.GetLayerDefn()) fill_fields(f) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 0,0 0))')) ret = lyr.CreateFeature(f) assert ret == 0, 'Failed to create feature in test_pl_layer.' assert lyr.GetFeatureCount() == 1, 'Expected feature count is 1, got {}.'.format(lyr.GetFeatureCount()) gdaltest.ngw_ds.ExecuteSQL('DELETE FROM test_pl_layer') assert lyr.GetFeatureCount() == 0, 'Expected feature count is 0, got {}.'.format(lyr.GetFeatureCount()) gdaltest.ngw_ds.ExecuteSQL('ALTER TABLE test_pl_layer RENAME TO test_pl_layer777') lyr = gdaltest.ngw_ds.GetLayerByName('test_pl_layer777') assert lyr is not None, 'Get layer test_pl_layer777 failed.' # Create 2 new features f = ogr.Feature(lyr.GetLayerDefn()) fill_fields(f) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 0,0 0))')) ret = lyr.CreateFeature(f) assert ret == 0, 'Failed to create feature in test_pl_layer777.' f = ogr.Feature(lyr.GetLayerDefn()) fill_fields2(f) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((1 1,1 2,2 1,1 1))')) ret = lyr.CreateFeature(f) assert ret == 0, 'Failed to create feature in test_pl_layer777.' lyr = gdaltest.ngw_ds.ExecuteSQL("SELECT STRFIELD,DECFIELD FROM test_pl_layer777 WHERE STRFIELD = 'fo_o'") assert lyr is not None, 'ExecuteSQL: SELECT STRFIELD,DECFIELD FROM test_pl_layer777 WHERE STRFIELD = "fo_o"; failed.' assert lyr.GetFeatureCount() == 2, 'Expected feature count is 2, got {}.'.format(lyr.GetFeatureCount()) gdaltest.ngw_ds.ReleaseResultSet(lyr) ############################################################################### # Run test_ogrsf def test_ogr_ngw_test_ogrsf(): if gdaltest.ngw_drv is None or gdal.GetConfigOption('SKIP_SLOW') is not None: pytest.skip() if check_availability(gdaltest.ngw_test_server) == False: gdaltest.ngw_drv = None pytest.skip() if gdaltest.skip_on_travis(): pytest.skip() if gdaltest.ngw_ds is None: pytest.skip() url = 'NGW:' + gdaltest.ngw_test_server + '/resource/' + gdaltest.group_id import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' ' + url) assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' ' + url + ' -oo PAGE_SIZE=100') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' ' + url + ' -oo BATCH_SIZE=5') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' ' + url + ' -oo BATCH_SIZE=5 -oo PAGE_SIZE=100') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Cleanup def test_ogr_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_layer = None gdaltest.ngw_ds = None assert gdaltest.ngw_drv.Delete(delete_url) == gdal.CE_None, \ 'Failed to delete datasource ' + delete_url + '.' gdaltest.ngw_ds = None gdalautotest-3.0.4/ogr/ogr_wktempty.py0000755003401500001440000001337013614005363017534 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_wktempty.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test support for the various "EMPTY" WKT geometry representations. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008, Even Rouault # # 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. ############################################################################### import pytest from osgeo import ogr wkt_list = [ ('GEOMETRYCOLLECTION(EMPTY)', 'GEOMETRYCOLLECTION EMPTY'), ('MULTIPOLYGON( EMPTY )', 'MULTIPOLYGON EMPTY'), ('MULTILINESTRING(EMPTY)', 'MULTILINESTRING EMPTY'), ('MULTIPOINT(EMPTY)', 'MULTIPOINT EMPTY'), ('POINT ( EMPTY )', 'POINT EMPTY'), ('LINESTRING(EMPTY)', 'LINESTRING EMPTY'), ('POLYGON ( EMPTY )', 'POLYGON EMPTY'), ('GEOMETRYCOLLECTION EMPTY', 'GEOMETRYCOLLECTION EMPTY'), ('MULTIPOLYGON EMPTY', 'MULTIPOLYGON EMPTY'), ('MULTILINESTRING EMPTY', 'MULTILINESTRING EMPTY'), ('MULTIPOINT EMPTY', 'MULTIPOINT EMPTY'), ('POINT EMPTY', 'POINT EMPTY'), ('LINESTRING EMPTY', 'LINESTRING EMPTY'), ('POLYGON EMPTY', 'POLYGON EMPTY') ] @pytest.mark.parametrize( "test_input,expected", wkt_list, ids=[r[0] for r in wkt_list] ) def test_empty_wkt(test_input, expected): geom = ogr.CreateGeometryFromWkt(test_input) wkt = geom.ExportToWkt() if expected != 'POINT EMPTY': assert ogr.CreateGeometryFromWkb(geom.ExportToWkb()).ExportToWkt() == wkt assert wkt == expected try: ogr.Geometry.IsEmpty except AttributeError: pytest.skip() try: assert geom.IsEmpty(), "IsEmpty returning false for an empty geometry" finally: geom.Destroy() def test_ogr_wktempty_test_partial_empty_geoms(): # Multipoint with a valid point and an empty point wkt = 'MULTIPOINT (1 1)' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbPoint)) assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Multipoint with an empty point and a valid point geom = ogr.CreateGeometryFromWkt('MULTIPOINT EMPTY') geom.AddGeometry(ogr.Geometry(type=ogr.wkbPoint)) geom.AddGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) wkt = 'MULTIPOINT (1 1)' assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Multilinestring with a valid string and an empty linestring wkt = 'MULTILINESTRING ((0 1,2 3,4 5,0 1))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbLineString)) assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Multilinestring with an empty linestring and a valid linestring geom = ogr.CreateGeometryFromWkt('MULTILINESTRING EMPTY') geom.AddGeometry(ogr.Geometry(type=ogr.wkbLineString)) geom.AddGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 1,2 3,4 5,0 1)')) wkt = 'MULTILINESTRING ((0 1,2 3,4 5,0 1))' assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Polygon with a valid external ring and an empty internal ring wkt = 'POLYGON ((100 0,100 10,110 10,100 0))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbLinearRing)) assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Polygon with an empty external ring and a valid internal ring wkt = 'POLYGON EMPTY' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbLinearRing)) ring = ogr.Geometry(type=ogr.wkbLinearRing) ring.AddPoint_2D(0, 0) ring.AddPoint_2D(10, 0) ring.AddPoint_2D(10, 10) ring.AddPoint_2D(0, 10) ring.AddPoint_2D(0, 0) geom.AddGeometry(ring) assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Multipolygon with a valid polygon and an empty polygon wkt = 'MULTIPOLYGON (((0 0,0 10,10 10,0 0)))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbPolygon)) assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) # Multipolygon with an empty polygon and a valid polygon geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY') geom.AddGeometry(ogr.Geometry(type=ogr.wkbPolygon)) geom.AddGeometry(ogr.CreateGeometryFromWkt('POLYGON ((100 0,100 10,110 10,100 0))')) wkt = 'MULTIPOLYGON (((100 0,100 10,110 10,100 0)))' assert geom.ExportToWkt() == wkt, \ ('WKT is wrong: ' + geom.ExportToWkt() + '. Expected value is: ' + wkt) gdalautotest-3.0.4/ogr/ogr_csv.py0000755003401500001440000022521513614005363016446 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_csv.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR CSV driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import os import sys import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Open CSV datasource. def test_ogr_csv_1(): gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/prime_meridian.csv') if gdaltest.csv_ds is not None: return pytest.fail() ############################################################################### # Check layer def ogr_csv_check_layer(lyr, expect_code_as_numeric): if expect_code_as_numeric is True: expect = [8901, 8902, 8903, 8904] else: expect = ['8901', '8902', '8903', '8904'] tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) assert tr lyr.ResetReading() expect = ['', 'Instituto Geografico e Cadastral; Lisbon', 'Institut Geographique National (IGN), Paris', 'Instituto Geografico "Augustin Cadazzi" (IGAC); Bogota'] tr = ogrtest.check_features_against_list(lyr, 'INFORMATION_SOURCE', expect) assert tr lyr.ResetReading() ############################################################################### # Verify the some attributes read properly. # def test_ogr_csv_2(): if gdaltest.csv_ds is None: pytest.skip() with gdaltest.error_handler(): assert gdaltest.csv_ds.CreateLayer('foo') is None assert gdaltest.csv_ds.DeleteLayer(0) != 0 lyr = gdaltest.csv_ds.GetLayerByName('prime_meridian') f = ogr.Feature(lyr.GetLayerDefn()) with gdaltest.error_handler(): assert lyr.CreateField(ogr.FieldDefn('foo')) != 0 assert lyr.CreateFeature(f) != 0 return ogr_csv_check_layer(lyr, False) ############################################################################### # Copy layer def ogr_csv_copy_layer(layer_name, options): ####################################################### # Create layer (.csv file) if options is None: new_lyr = gdaltest.csv_tmpds.CreateLayer(layer_name) else: new_lyr = gdaltest.csv_tmpds.CreateLayer(layer_name, options=options) ####################################################### # Setup Schema ogrtest.quick_create_layer_def(new_lyr, [('PRIME_MERIDIAN_CODE', ogr.OFTInteger), ('INFORMATION_SOURCE', ogr.OFTString)]) ####################################################### # Copy in matching prime meridian fields. dst_feat = ogr.Feature(feature_def=new_lyr.GetLayerDefn()) srclyr = gdaltest.csv_ds.GetLayerByName('prime_meridian') srclyr.ResetReading() feat = srclyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) new_lyr.CreateFeature(dst_feat) feat = srclyr.GetNextFeature() return new_lyr ############################################################################### # Copy prime_meridian.csv to a new subtree under the tmp directory. def test_ogr_csv_3(): if gdaltest.csv_ds is None: pytest.skip() ####################################################### # Ensure any old copy of our working datasource is cleaned up try: gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.GetDriverByName('CSV').DeleteDataSource('tmp/csvwrk') gdal.PopErrorHandler() except: pass ####################################################### # Create CSV datasource (directory) gdaltest.csv_tmpds = \ ogr.GetDriverByName('CSV').CreateDataSource('tmp/csvwrk') ####################################################### # Create layer (.csv file) gdaltest.csv_lyr1 = ogr_csv_copy_layer('pm1', None) # No longer valid since we have editing capabilities if False: # pylint: disable=using-constant-test # Check that we cannot add a new field now assert gdaltest.csv_lyr1.TestCapability(ogr.OLCCreateField) == 0 field_defn = ogr.FieldDefn('dummy', ogr.OFTString) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = gdaltest.csv_lyr1.CreateField(field_defn) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # Verify the some attributes read properly. # # NOTE: one weird thing is that in this pass the prime_meridian_code field # is typed as integer instead of string since it is created literally. def test_ogr_csv_4(): if gdaltest.csv_ds is None: pytest.skip() return ogr_csv_check_layer(gdaltest.csv_lyr1, True) ############################################################################### # Copy prime_meridian.csv again, in CRLF mode. def test_ogr_csv_5(): if gdaltest.csv_ds is None: pytest.skip() ####################################################### # Create layer (.csv file) gdaltest.csv_lyr2 = ogr_csv_copy_layer('pm2', ['LINEFORMAT=CRLF', ]) ############################################################################### # Verify the some attributes read properly. # def test_ogr_csv_6(): if gdaltest.csv_ds is None: pytest.skip() return ogr_csv_check_layer(gdaltest.csv_lyr2, True) ############################################################################### # Delete a layer and verify it seems to have worked properly. # def test_ogr_csv_7(): if gdaltest.csv_ds is None: pytest.skip() lyr = gdaltest.csv_tmpds.GetLayer(0) assert lyr.GetName() == 'pm1', 'unexpected name for first layer' gdaltest.csv_lyr1 = None err = gdaltest.csv_tmpds.DeleteLayer(0) assert err == 0, 'got error code from DeleteLayer' assert gdaltest.csv_tmpds.GetLayerCount() == 1 and gdaltest.csv_tmpds.GetLayer(0).GetName() == 'pm2', \ 'Layer not destroyed properly?' with gdaltest.error_handler(): assert gdaltest.csv_tmpds.DeleteLayer(-1) != 0 assert gdaltest.csv_tmpds.DeleteLayer(gdaltest.csv_tmpds.GetLayerCount()) != 0 gdaltest.csv_tmpds = None ############################################################################### # Reopen and append a record then close. # def test_ogr_csv_8(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk', update=1) lyr = gdaltest.csv_tmpds.GetLayer(0) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetField('PRIME_MERIDIAN_CODE', '7000') feat.SetField('INFORMATION_SOURCE', 'This is a newline test\n') lyr.CreateFeature(feat) gdaltest.csv_tmpds = None ############################################################################### # Verify the some attributes read properly. # def test_ogr_csv_9(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk', update=1) lyr = gdaltest.csv_tmpds.GetLayer(0) expect = ['8901', '8902', '8903', '8904', '7000'] tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) assert tr lyr.ResetReading() expect = ['', 'Instituto Geografico e Cadastral; Lisbon', 'Institut Geographique National (IGN), Paris', 'Instituto Geografico "Augustin Cadazzi" (IGAC); Bogota', 'This is a newline test\n'] tr = ogrtest.check_features_against_list(lyr, 'INFORMATION_SOURCE', expect) assert tr lyr.ResetReading() ############################################################################### # Verify some capabilities and related stuff. # def test_ogr_csv_10(): if gdaltest.csv_ds is None: pytest.skip() lyr = gdaltest.csv_ds.GetLayerByName('prime_meridian') assert not lyr.TestCapability('SequentialWrite'), \ 'should not have write access to readonly layer' assert not lyr.TestCapability('RandomRead'), \ ('CSV files do not efficiently support ' 'random reading.') assert not lyr.TestCapability('FastGetExtent'), 'CSV files do not support getextent' assert not lyr.TestCapability('FastFeatureCount'), \ 'CSV files do not support fast feature count' assert ogr.GetDriverByName('CSV').TestCapability('DeleteDataSource'), \ 'CSV files do support DeleteDataSource' assert ogr.GetDriverByName('CSV').TestCapability('CreateDataSource'), \ 'CSV files do support CreateDataSource' assert not gdaltest.csv_ds.TestCapability('CreateLayer'), \ 'readonly datasource should not CreateLayer' assert not gdaltest.csv_ds.TestCapability('DeleteLayer'), \ 'should not have deletelayer on readonly ds.' lyr = gdaltest.csv_tmpds.GetLayer(0) assert lyr.TestCapability('SequentialWrite'), \ 'should have write access to updatable layer' assert gdaltest.csv_tmpds.TestCapability('CreateLayer'), \ 'should have createlayer on updatable ds.' assert gdaltest.csv_tmpds.TestCapability('DeleteLayer'), \ 'should have deletelayer on updatable ds.' ############################################################################### def ogr_csv_check_testcsvt(lyr): lyr.ResetReading() expect = [12, None] tr = ogrtest.check_features_against_list(lyr, 'INTCOL', expect) assert tr lyr.ResetReading() expect = [5.7, None] tr = ogrtest.check_features_against_list(lyr, 'REALCOL', expect) assert tr lyr.ResetReading() expect = ['foo', ''] tr = ogrtest.check_features_against_list(lyr, 'STRINGCOL', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetFieldAsString('DATETIME') == '2008/12/25 11:22:33' feat = lyr.GetNextFeature() assert feat.GetFieldAsString('DATETIME') == '' lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetFieldAsString('DATE') == '2008/12/25' feat = lyr.GetNextFeature() assert feat.GetFieldAsString('DATE') == '' lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetFieldAsString('TIME') == '11:22:33' feat = lyr.GetNextFeature() assert feat.GetFieldAsString('TIME') == '' assert lyr.GetLayerDefn().GetFieldDefn(0).GetWidth() == 5, \ 'Field 0 : expecting width = 5' assert lyr.GetLayerDefn().GetFieldDefn(1).GetWidth() == 10, \ 'Field 1 : expecting width = 10' assert lyr.GetLayerDefn().GetFieldDefn(1).GetPrecision() == 7, \ 'Field 1 : expecting precision = 7' assert lyr.GetLayerDefn().GetFieldDefn(2).GetWidth() == 15, \ 'Field 2 : expecting width = 15' assert lyr.GetLayerDefn().GetFieldDefn(6).GetType() == ogr.OFTDateTime, \ 'Field DATETIME : wrong type' assert lyr.GetLayerDefn().GetFieldDefn(7).GetType() == ogr.OFTDate, \ 'Field DATETIME : wrong type' assert lyr.GetLayerDefn().GetFieldDefn(8).GetType() == ogr.OFTTime, \ 'Field DATETIME : wrong type' lyr.ResetReading() ############################################################################### # Verify handling of csvt with width and precision specified # Test NULL handling of non string columns too (#2756) def test_ogr_csv_11(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testcsvt.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testcsvt') return ogr_csv_check_testcsvt(lyr) ############################################################################### # Verify CREATE_CSVT=YES option def test_ogr_csv_12(): if gdaltest.csv_ds is None: pytest.skip() srclyr = gdaltest.csv_ds.GetLayerByName('testcsvt') ####################################################### # Create layer (.csv file) options = ['CREATE_CSVT=YES', ] gdaltest.csv_lyr2 = gdaltest.csv_tmpds.CreateLayer('testcsvt_copy', options=options) ####################################################### # Setup Schema for i in range(srclyr.GetLayerDefn().GetFieldCount()): field_defn = srclyr.GetLayerDefn().GetFieldDefn(i) gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.csv_lyr2.CreateField(field_defn) gdal.PopErrorHandler() ####################################################### # Recopy source layer into destination layer dst_feat = ogr.Feature(feature_def=gdaltest.csv_lyr2.GetLayerDefn()) srclyr.ResetReading() feat = srclyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) gdaltest.csv_lyr2.CreateFeature(dst_feat) feat = srclyr.GetNextFeature() with gdaltest.error_handler(): assert gdaltest.csv_tmpds.CreateLayer('testcsvt_copy') is None ####################################################### # Closes everything and reopen gdaltest.csv_tmpds = None gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('tmp/csvwrk/testcsvt_copy.csv') ####################################################### # Checks copy assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testcsvt_copy') return ogr_csv_check_testcsvt(lyr) ############################################################################### # Verify GEOMETRY=AS_WKT,AS_XY,AS_XYZ,AS_YX options def test_ogr_csv_13(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk', update=1) # AS_WKT options = ['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES'] lyr = gdaltest.csv_tmpds.CreateLayer('as_wkt', options=options) field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) lyr.CreateField(field_defn) # Some applications expect the WKT column not to be exposed. Check it assert lyr.GetLayerDefn().GetFieldCount() == 1 dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) dst_feat.SetField('ADATA', 'avalue') lyr.CreateFeature(dst_feat) # AS_WKT but no field options = ['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES'] lyr = gdaltest.csv_tmpds.CreateLayer('as_wkt_no_field', options=options) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(dst_feat) # AS_XY options = ['GEOMETRY=AS_XY', 'CREATE_CSVT=YES'] lyr = gdaltest.csv_tmpds.CreateLayer('as_xy', options=options) field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) dst_feat.SetField('ADATA', 'avalue') lyr.CreateFeature(dst_feat) # Nothing will be written in the x or y field dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)')) dst_feat.SetField('ADATA', 'avalue') lyr.CreateFeature(dst_feat) # AS_YX options = ['GEOMETRY=AS_YX', 'CREATE_CSVT=YES'] lyr = gdaltest.csv_tmpds.CreateLayer('as_yx', options=options) field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) dst_feat.SetField('ADATA', 'avalue') lyr.CreateFeature(dst_feat) # AS_XYZ options = ['GEOMETRY=AS_XYZ', 'CREATE_CSVT=YES'] lyr = gdaltest.csv_tmpds.CreateLayer('as_xyz', options=options) field_defn = ogr.FieldDefn('ADATA', ogr.OFTString) lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2 3)')) dst_feat.SetField('ADATA', 'avalue') lyr.CreateFeature(dst_feat) ####################################################### # Closes everything and reopen gdaltest.csv_tmpds = None gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk') # Test AS_WKT lyr = gdaltest.csv_tmpds.GetLayerByName('as_wkt') expect = ['POINT (1 2)'] tr = ogrtest.check_features_against_list(lyr, 'WKT', expect) assert tr lyr.ResetReading() expect = ['avalue'] tr = ogrtest.check_features_against_list(lyr, 'ADATA', expect) assert tr # Test as_wkt_no_field lyr = gdaltest.csv_tmpds.GetLayerByName('as_wkt_no_field') expect = ['POINT (1 2)'] tr = ogrtest.check_features_against_list(lyr, 'WKT', expect) assert tr # Test AS_XY lyr = gdaltest.csv_tmpds.GetLayerByName('as_xy') assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'X' expect = [1, None] tr = ogrtest.check_features_against_list(lyr, 'X', expect) assert tr lyr.ResetReading() expect = [2, None] tr = ogrtest.check_features_against_list(lyr, 'Y', expect) assert tr lyr.ResetReading() expect = ['avalue', 'avalue'] tr = ogrtest.check_features_against_list(lyr, 'ADATA', expect) assert tr # Test AS_YX lyr = gdaltest.csv_tmpds.GetLayerByName('as_yx') assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'Y' expect = [1] tr = ogrtest.check_features_against_list(lyr, 'X', expect) assert tr lyr.ResetReading() expect = [2] tr = ogrtest.check_features_against_list(lyr, 'Y', expect) assert tr # Test AS_XYZ lyr = gdaltest.csv_tmpds.GetLayerByName('as_xyz') assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'X' expect = [1] tr = ogrtest.check_features_against_list(lyr, 'X', expect) assert tr lyr.ResetReading() expect = [2] tr = ogrtest.check_features_against_list(lyr, 'Y', expect) assert tr lyr.ResetReading() expect = [3] tr = ogrtest.check_features_against_list(lyr, 'Z', expect) assert tr ############################################################################### # Copy prime_meridian.csv again, with SEMICOLON as separator def test_ogr_csv_14(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk', update=1) gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/prime_meridian.csv') ####################################################### # Create layer (.csv file) gdaltest.csv_lyr1 = ogr_csv_copy_layer('pm3', ['SEPARATOR=SEMICOLON', ]) ############################################################################### # Verify the some attributes read properly. # def test_ogr_csv_15(): if gdaltest.csv_ds is None: pytest.skip() return ogr_csv_check_layer(gdaltest.csv_lyr1, True) ############################################################################### # Close the file and check again # def test_ogr_csv_16(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_tmpds = None gdaltest.csv_tmpds = ogr.Open('tmp/csvwrk') gdaltest.csv_lyr1 = gdaltest.csv_tmpds.GetLayerByName('pm3') return ogr_csv_check_layer(gdaltest.csv_lyr1, False) ############################################################################### # Verify that WKT field treated as geometry. # def test_ogr_csv_17(): if gdaltest.csv_ds is None: pytest.skip() csv_ds = ogr.Open('data/wkt.csv') csv_lyr = csv_ds.GetLayer(0) assert csv_lyr.GetLayerDefn().GetGeomType() == ogr.wkbUnknown, \ 'did not get wktUnknown for geometry type.' feat = csv_lyr.GetNextFeature() assert feat.GetField('WKT') == 'POLYGON((6.25 1.25,7.25 1.25,7.25 2.25,6.25 2.25,6.25 1.25))', \ 'feature 1: expected wkt value' assert not ogrtest.check_feature_geometry(feat, 'POLYGON((6.25 1.25,7.25 1.25,7.25 2.25,6.25 2.25,6.25 1.25))') feat = csv_lyr.GetNextFeature() feat = csv_lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POLYGON((1.001 1.001,3.999 3.999,3.2 1.6,1.001 1.001))') ############################################################################### # Write to /vsistdout/ def test_ogr_csv_18(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsistdout/') lyr = ds.CreateLayer('foo', options=['GEOMETRY=AS_WKT']) lyr.CreateField(ogr.FieldDefn('foo')) lyr.CreateField(ogr.FieldDefn('bar')) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetField('foo', 'bar') feat.SetField('bar', 'baz') geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat.SetGeometry(geom) lyr.CreateFeature(feat) ############################################################################### # Verify handling of non-numeric values in numeric columns def test_ogr_csv_19(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testnull.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testnull') lyr.ResetReading() with gdaltest.error_handler(): assert ogrtest.check_features_against_list(lyr, 'INTCOL', [12]) lyr.ResetReading() assert ogrtest.check_features_against_list(lyr, 'REALCOL', [5.7]) lyr.ResetReading() assert ogrtest.check_features_against_list(lyr, 'INTCOL2', [None]) lyr.ResetReading() assert ogrtest.check_features_against_list(lyr, 'REALCOL2', [None]) lyr.ResetReading() assert ogrtest.check_features_against_list(lyr, 'STRINGCOL', ['foo']) ############################################################################### # Verify handling of column names with numbers def test_ogr_csv_20(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testnumheader1.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testnumheader1') assert lyr is not None lyr.ResetReading() expect = ['1 - 2', '2-3'] got = [lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef(), lyr.GetLayerDefn().GetFieldDefn(1).GetNameRef()] assert got[0] == expect[0], \ ('column 0 got name %s expected %s' % (str(got[0]), str(expect[0]))) assert got[1] == expect[1], \ ('column 1 got name %s expected %s' % (str(got[1]), str(expect[1]))) gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testnumheader2.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testnumheader2') assert lyr is not None lyr.ResetReading() expect = ['field_1', 'field_2'] got = [lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef(), lyr.GetLayerDefn().GetFieldDefn(1).GetNameRef()] assert got[0] == expect[0], \ ('column 0 got name %s expected %s' % (str(got[0]), str(expect[0]))) assert got[1] == expect[1], \ ('column 1 got name %s expected %s' % (str(got[1]), str(expect[1]))) ############################################################################### # Verify handling of numeric column names with quotes (bug #4361) def test_ogr_csv_21(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testquoteheader1.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testquoteheader1') assert lyr is not None lyr.ResetReading() expect = ['test', '2000', '2000.12'] for i in range(0, 3): got = lyr.GetLayerDefn().GetFieldDefn(i).GetNameRef() assert got == expect[i], \ ('column %d got name %s expected %s' % (i, str(got), str(expect[i]))) gdaltest.csv_ds = None gdaltest.csv_ds = ogr.Open('data/testquoteheader2.csv') assert gdaltest.csv_ds is not None lyr = gdaltest.csv_ds.GetLayerByName('testquoteheader2') assert lyr is not None lyr.ResetReading() expect = ['field_1', 'field_2', 'field_3'] for i in range(0, 3): got = lyr.GetLayerDefn().GetFieldDefn(i).GetNameRef() assert got == expect[i], \ ('column %d got name %s expected %s' % (i, str(got), str(expect[i]))) ############################################################################### # Test handling of UTF8 BOM (bug #4623) def test_ogr_csv_22(): ds = ogr.Open('data/csv_with_utf8_bom.csv') lyr = ds.GetLayer(0) fld0_name = lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef() assert fld0_name == 'id', 'bad field name' def test_ogr_csv_23(): # create a CSV file with UTF8 BOM ds = ogr.Open('tmp/csvwrk', update=1) lyr = ds.CreateLayer('utf8', options=['WRITE_BOM=YES', 'GEOMETRY=AS_WKT']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 123) feat.SetField('bar', 'baz') geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None lyr = None ds = None data = open('tmp/csvwrk/utf8.csv', 'rb').read() if sys.version_info >= (3, 0, 0): ogrtest.ret = False exec("ogrtest.ret = (data[:6] == b'\\xef\\xbb\\xbfWKT')") else: ogrtest.ret = (data[:6] == '\xef\xbb\xbfWKT') assert ogrtest.ret, "No UTF8 BOM header on output" # create a CSV file without UTF8 BOM ds = ogr.Open('tmp/csvwrk', update=1) lyr = ds.CreateLayer('utf8no', options=['WRITE_BOM=YES', 'GEOMETRY=AS_WKT']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 123) feat.SetField('bar', 'baz') geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None lyr = None ds = None data = open('tmp/csvwrk/utf8no.csv', 'rb').read() assert data[:3] != '\xef\xbb\xbfWKT', "Found UTF8 BOM header on output!" ############################################################################### # Test single column CSV files def test_ogr_csv_24(): # Create an invalid CSV file f = gdal.VSIFOpenL('/vsimem/invalid.csv', 'wb') gdal.VSIFCloseL(f) # and check that it doesn't prevent from creating a new CSV file (#4824) ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/single.csv') lyr = ds.CreateLayer('single') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'bar') lyr.CreateFeature(feat) feat = None lyr = None ds = None ds = ogr.Open('/vsimem/single.csv') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 1 feat = lyr.GetNextFeature() assert feat.GetField(0) == '' feat = lyr.GetNextFeature() assert feat.GetField(0) == 'bar' ds = None gdal.Unlink('/vsimem/single.csv') gdal.Unlink('/vsimem/invalid.csv') ############################################################################### # Test newline handling (#4452) def test_ogr_csv_25(): ds = ogr.Open('tmp/csvwrk', update=1) lyr = ds.CreateLayer('newlines', options=['LINEFORMAT=LF']) # just in case tests are run on windows... lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 'windows newline:\r\nlinux newline:\nend of string:') lyr.CreateFeature(feat) feat = None lyr = None ds = None EXPECTED = 'foo,\n"windows newline:\r\nlinux newline:\nend of string:"\n' data = open('tmp/csvwrk/newlines.csv', 'rb').read().decode('ascii') assert data == EXPECTED, \ ("Newlines changed:\n\texpected=%s\n\tgot= %s" % (repr(EXPECTED), repr(data))) ############################################################################### # Test number padding behaviour (#4469) def test_ogr_csv_26(): ds = ogr.Open('tmp/csvwrk', update=1) lyr = ds.CreateLayer('num_padding', options=['LINEFORMAT=LF']) # just in case tests are run on windows... field = ogr.FieldDefn('foo', ogr.OFTReal) field.SetWidth(50) field.SetPrecision(25) lyr.CreateField(field) feature = ogr.Feature(lyr.GetLayerDefn()) feature.SetField('foo', 10.5) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 10.5) lyr.CreateFeature(feat) feat = None lyr = None ds = None EXPECTED = 'foo,\n10.5000000000000000000000000\n' data = open('tmp/csvwrk/num_padding.csv', 'rb').read().decode('ascii') assert data == EXPECTED, ("expected=%s got= %s" % (repr(EXPECTED), repr(data))) ############################################################################### # Test Eurostat .TSV files def test_ogr_csv_27(): ds = ogr.Open('data/test_eurostat.tsv') lyr = ds.GetLayer(0) layer_defn = lyr.GetLayerDefn() assert layer_defn.GetFieldCount() == 8 expected_fields = [('unit', ogr.OFTString), ('geo', ogr.OFTString), ('time_2010', ogr.OFTReal), ('time_2010_flag', ogr.OFTString), ('time_2011', ogr.OFTReal), ('time_2011_flag', ogr.OFTString), ('time_2012', ogr.OFTReal), ('time_2012_flag', ogr.OFTString)] i = 0 for expected_field in expected_fields: fld = layer_defn.GetFieldDefn(i) assert fld.GetName() == expected_field[0] assert fld.GetType() == expected_field[1] i = i + 1 feat = lyr.GetNextFeature() if feat.GetField('unit') != 'NBR' or \ feat.GetField('geo') != 'FOO' or \ feat.IsFieldSet('time_2010') or \ feat.IsFieldSet('time_2010_flag') or \ feat.GetField('time_2011') != 1 or \ feat.GetField('time_2011_flag') != 'u' or \ feat.GetField('time_2012') != 2.34 or \ feat.IsFieldSet('time_2012_flag'): feat.DumpReadable() pytest.fail() ############################################################################### # Check that we don't rewrite erroneously a file that has no header (#5161). def test_ogr_csv_28(): f = open('tmp/ogr_csv_28.csv', 'wb') f.write('1,2\n'.encode('ascii')) f.close() ds = ogr.Open('tmp/ogr_csv_28.csv', update=1) del ds f = open('tmp/ogr_csv_28.csv', 'rb') data = f.read().decode('ascii') f.close() os.unlink('tmp/ogr_csv_28.csv') assert data == '1,2\n' ############################################################################### # Check multi geometry field support def test_ogr_csv_29(): ds = ogr.GetDriverByName('CSV').CreateDataSource('tmp/ogr_csv_29', options=['GEOMETRY=AS_WKT']) assert ds.TestCapability(ogr.ODsCCurveGeometries) == 1 lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) assert lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_lyr1_EPSG_4326", ogr.wkbPoint)) == 0 assert lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_lyr2_EPSG_32632", ogr.wkbPolygon)) == 0 with gdaltest.error_handler(): assert lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_lyr2_EPSG_32632", ogr.wkbPolygon)) != 0 ds = None ds = ogr.Open('tmp/ogr_csv_29', update=1) lyr = ds.GetLayerByName('test') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (1 2)')) feat.SetGeomField(1, ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))')) lyr.CreateFeature(feat) ds = None ds = ogr.Open('tmp/ogr_csv_29') lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetGeomFieldCount() == 2 srs = lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef() assert srs.GetAuthorityCode(None) == '4326' srs = lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef() assert srs.GetAuthorityCode(None) == '32632' feat = lyr.GetNextFeature() geom = feat.GetGeomFieldRef('geom__WKT_lyr1_EPSG_4326') if geom.ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() geom = feat.GetGeomFieldRef('geom__WKT_lyr2_EPSG_32632') if geom.ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Run test_ogrsf def test_ogr_csv_30(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/ogr_csv_29') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Read geonames.org allCountries.txt def test_ogr_csv_31(): ds = ogr.Open('data/allCountries.txt') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField('GEONAMEID') != '3038814' or f.GetField('LATITUDE') != 42.5 or \ f.GetGeometryRef().ExportToWkt() != 'POINT (1.48333 42.5)': f.DumpReadable() pytest.fail() lyr.ResetReading() f = lyr.GetNextFeature() if f.GetField('GEONAMEID') != '3038814': f.DumpReadable() pytest.fail() assert lyr.GetFeatureCount() == 10 ############################################################################### # Test AUTODETECT_TYPE=YES def test_ogr_csv_32(): # Without limit, everything will be detected as string ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_values = ['', '1.5', '1', '1.5', '2', '', '2014-09-27 19:01:00', '2014-09-27', '2014-09-27 20:00:00', '2014-09-27', '12:34:56', 'a', 'a', '1', '1', '1.5', '2014-09-27 19:01:00', '2014-09-27', '19:01:00', '2014-09-27T00:00:00Z'] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Without limit, everything will be detected as string ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=0']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # We limit to the first "1.5" line ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=300', 'QUOTED_FIELDS_AS_STRING=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_type = [ogr.OFTString, ogr.OFTReal, ogr.OFTInteger, ogr.OFTReal, ogr.OFTInteger, ogr.OFTString, ogr.OFTDateTime, ogr.OFTDate, ogr.OFTDateTime, ogr.OFTDate, ogr.OFTTime, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTInteger, ogr.OFTReal, ogr.OFTDateTime, ogr.OFTDate, ogr.OFTTime, ogr.OFTDateTime] col_values = ['', 1.5, 1, 1.5, 2, '', '2014/09/27 19:01:00', '2014/09/27', '2014/09/27 20:00:00', '2014/09/27', '12:34:56', 'a', 'a', '1', 1, 1.5, '2014/09/27 19:01:00', '2014/09/27', '19:01:00', '2014/09/27 00:00:00+00'] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == col_type[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Without QUOTED_FIELDS_AS_STRING=YES, str3 will be detected as integer ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=300']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('str3')).GetType() == ogr.OFTInteger # We limit to the first 2 lines ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'QUOTED_FIELDS_AS_STRING=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_type = [ogr.OFTString, ogr.OFTReal, ogr.OFTReal, ogr.OFTReal, ogr.OFTInteger, ogr.OFTInteger, ogr.OFTDateTime, ogr.OFTDateTime, ogr.OFTDateTime, ogr.OFTDate, ogr.OFTTime, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTString, ogr.OFTDateTime] col_values = ['', 1.5, 1, 1.5, 2, None, '2014/09/27 19:01:00', '2014/09/27 00:00:00', '2014/09/27 20:00:00', '2014/09/27', '12:34:56', 'a', 'a', '1', '1', '1.5', '2014-09-27 19:01:00', '2014-09-27', '19:01:00', '2014/09/27 00:00:00+00'] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == col_type[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == 0) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Test AUTODETECT_WIDTH=YES ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=YES', 'QUOTED_FIELDS_AS_STRING=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_width = [0, 3, 3, 3, 1, 1, 0, 0, 0, 0, 0, 1, 2, 1, 1, 3, 19, 10, 8, 0] col_precision = [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == col_type[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == col_width[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetPrecision() == col_precision[i]) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Test AUTODETECT_WIDTH=STRING_ONLY ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=STRING_ONLY', 'QUOTED_FIELDS_AS_STRING=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_width = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 3, 19, 10, 8, 0] col_precision = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == col_type[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetWidth() == col_width[i] and \ lyr.GetLayerDefn().GetFieldDefn(i).GetPrecision() == col_precision[i]) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Test KEEP_SOURCE_COLUMNS=YES ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'KEEP_SOURCE_COLUMNS=YES', 'QUOTED_FIELDS_AS_STRING=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_values = ['', 1.5, '1.5', 1, '1', 1.5, '1.5', 2, '2', None, None, '2014/09/27 19:01:00', '2014-09-27 19:01:00', '2014/09/27 00:00:00', '2014-09-27', '2014/09/27 20:00:00', '2014-09-27 20:00:00', '2014/09/27', '2014-09-27', '12:34:56', '12:34:56', 'a', 'a', '1', '1', '1.5', '2014-09-27 19:01:00', '2014-09-27', '19:01:00', '2014/09/27 00:00:00+00', '2014-09-27T00:00:00Z'] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTString or \ lyr.GetLayerDefn().GetFieldDefn(i + 1).GetNameRef() == lyr.GetLayerDefn().GetFieldDefn(i).GetNameRef() + '_original') if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) # Test warnings for fid in [3, # string in real field 4, # string in int field 5, # real in int field 6, # string in datetime field 7, # Value with a width greater than field width found in record 7 for field int1 8, # Value with a width greater than field width found in record 8 for field str1 9, # Value with a precision greater than field precision found in record 9 for field real1 ]: ds = gdal.OpenEx('data/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES', 'AUTODETECT_SIZE_LIMIT=350', 'AUTODETECT_WIDTH=YES']) lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetFeature(fid) gdal.PopErrorHandler() if gdal.GetLastErrorType() != gdal.CE_Warning: f.DumpReadable() pytest.fail(fid) # Test Real -> Integer64 (https://github.com/OSGeo/gdal/issues/343) gdal.FileFromMemBuffer('/vsimem/testtypeautodetect.csv', """foo,bar 1.2, 1234567890123,""") ds = gdal.OpenEx('/vsimem/testtypeautodetect.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES']) gdal.Unlink('/vsimem/testtypeautodetect.csv') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField(0) != 1.2: f.DumpReadable() pytest.fail() ############################################################################### # Test Boolean, Int16 and Float32 support def test_ogr_csv_33(): ds = gdal.OpenEx('data/testtypeautodetectboolean.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_values = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 'y'] for i in range(lyr.GetLayerDefn().GetFieldCount()): assert (not (i < 10 and lyr.GetLayerDefn().GetFieldDefn(i).GetSubType() != ogr.OFSTBoolean) or \ (i >= 10 and lyr.GetLayerDefn().GetFieldDefn(i).GetSubType() == ogr.OFSTBoolean)) if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) ds = None ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/subtypes.csv') lyr = ds.CreateLayer('test', options=['CREATE_CSVT=YES']) fld = ogr.FieldDefn('b', ogr.OFTInteger) fld.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld) fld = ogr.FieldDefn('int16', ogr.OFTInteger) fld.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld) fld = ogr.FieldDefn('float32', ogr.OFTReal) fld.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) f.SetField(1, -32768) f.SetField(2, 1.23) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/subtypes.csv') lyr = ds.GetLayer(0) assert (lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger and \ lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTBoolean) assert (lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTInteger and \ lyr.GetLayerDefn().GetFieldDefn(1).GetSubType() == ogr.OFSTInt16) assert (lyr.GetLayerDefn().GetFieldDefn(2).GetType() == ogr.OFTReal and \ lyr.GetLayerDefn().GetFieldDefn(2).GetSubType() == ogr.OFSTFloat32) f = lyr.GetNextFeature() if f.GetField(0) != 1 or f.GetField(1) != -32768 or f.GetField(2) != 1.23: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/subtypes.csv') gdal.Unlink('/vsimem/subtypes.csvt') ############################################################################### # Test Integer64 support def test_ogr_csv_34(): ds = gdal.OpenEx('data/testtypeautodetectinteger64.csv', gdal.OF_VECTOR, open_options=['AUTODETECT_TYPE=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() col_values = [1, 10000000000, 10000000000, 10000000000.0] for i in range(lyr.GetLayerDefn().GetFieldCount()): if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) f = lyr.GetNextFeature() col_values = [10000000000, 1, 10000000000, 1.0] for i in range(lyr.GetLayerDefn().GetFieldCount()): if f.GetField(i) != col_values[i]: f.DumpReadable() pytest.fail(i) ds = None ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/int64.csv') lyr = ds.CreateLayer('test', options=['CREATE_CSVT=YES']) fld = ogr.FieldDefn('int64', ogr.OFTInteger64) lyr.CreateField(fld) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 10000000000) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/int64.csv') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField(0) != 10000000000: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/int64.csv') gdal.Unlink('/vsimem/int64.csvt') ############################################################################### # Test comma separator def test_ogr_csv_35(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_35.csv', """FIELD_1 "FIELD 2" FIELD_3 VAL1 "VAL 2" "VAL 3" """) ds = gdal.OpenEx('/vsimem/ogr_csv_35.csv', gdal.OF_VECTOR, open_options=['MERGE_SEPARATOR=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['FIELD_1'] != 'VAL1' or f['FIELD 2'] != 'VAL 2' or f['FIELD_3'] != 'VAL 3': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_35.csv') ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_35.csv') lyr = ds.CreateLayer('ogr_csv_35', options=['SEPARATOR=SPACE']) lyr.CreateField(ogr.FieldDefn('FIELD_1', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('FIELD 2', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('FIELD_1', 'VAL1') f.SetField('FIELD 2', 'VAL 2') lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_csv_35.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'FIELD_1 "FIELD 2"' in data and 'VAL1 "VAL 2"' in data gdal.Unlink('/vsimem/ogr_csv_35.csv') ############################################################################### # Test GEOM_POSSIBLE_NAMES open option def test_ogr_csv_36(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_36.csv', """id,mygeometry,format 1,"POINT(1 2)",wkt 2,"{""type"": ""Point"", ""coordinates"" : [2, 49]}",geojson 3,010100000000000000000008400000000000004940,wkb 4,0101000020e610000000000000000008400000000000004940,ewkb 5,something else,something else """) ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=mygeometry,another_field']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)' or f['id'] != '1' or f['mygeometry'] != 'POINT(1 2)' or f['format'] != 'wkt': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None # Test prefix* pattern ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=mygeom*']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': f.DumpReadable() pytest.fail() ds = None # Test *suffix pattern ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=*geometry']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': f.DumpReadable() pytest.fail() ds = None # Test *middle* pattern ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=*geom*']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': f.DumpReadable() pytest.fail() ds = None # Test non matching pattern ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=bla']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldCount() == 0 ds = None # Check KEEP_GEOM_COLUMNS=NO ds = gdal.OpenEx('/vsimem/ogr_csv_36.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=mygeometry', 'KEEP_GEOM_COLUMNS=NO']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (1 2)' or f['id'] != '1' or f['format'] != 'wkt': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_36.csv') ############################################################################### # Test X_POSSIBLE_NAMES, Y_POSSIBLE_NAMES and Z_POSSIBLE_NAMES open options def test_ogr_csv_37(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_37.csv', """id,y,other,x,z 1,49,a,2,100 2,50,b,3, 3,49,c, """) ds = gdal.OpenEx('/vsimem/ogr_csv_37.csv', gdal.OF_VECTOR, open_options=['X_POSSIBLE_NAMES=long,x', 'Y_POSSIBLE_NAMES=lat,y']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)' or f['id'] != '1' or f['x'] != 2 or f['y'] != 49 or f['other'] != 'a' or f['z'] != '100': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None # Check Z_POSSIBLE_NAMES ds = gdal.OpenEx('/vsimem/ogr_csv_37.csv', gdal.OF_VECTOR, open_options=['X_POSSIBLE_NAMES=long,x', 'Y_POSSIBLE_NAMES=lat,y', 'Z_POSSIBLE_NAMES=z']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49 100)' or f['id'] != '1' or f['x'] != 2 or f['y'] != 49 or f['other'] != 'a' or f['z'] != 100: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None # Check KEEP_GEOM_COLUMNS=NO ds = gdal.OpenEx('/vsimem/ogr_csv_37.csv', gdal.OF_VECTOR, open_options=['X_POSSIBLE_NAMES=long,x', 'Y_POSSIBLE_NAMES=lat,y', 'KEEP_GEOM_COLUMNS=NO']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 3 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)' or f['id'] != '1' or f['other'] != 'a': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_37.csv') ############################################################################### # Test GeoCSV WKT type def test_ogr_csv_38(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_38.csv') srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') lyr = ds.CreateLayer('ogr_csv_38', srs=srs, options=['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES', 'GEOMETRY_NAME=mygeom']) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_csv_38.csv') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'mygeom' assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0 f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_38.csv') gdal.Unlink('/vsimem/ogr_csv_38.csvt') gdal.Unlink('/vsimem/ogr_csv_38.prj') ############################################################################### # Test GeoCSV CoordX and CoordY types def test_ogr_csv_39(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_39.csv') lyr = ds.CreateLayer('ogr_csv_38', options=['GEOMETRY=AS_XY', 'CREATE_CSVT=YES']) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_csv_39.csv') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_39.csv') gdal.Unlink('/vsimem/ogr_csv_39.csvt') ############################################################################### # Test X_POSSIBLE_NAMES, Y_POSSIBLE_NAMES, GEOM_POSSIBLE_NAMES and KEEP_GEOM_COLUMNS=NO together (#6137) def test_ogr_csv_40(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_40.csv', """latitude,longitude,the_geom,id 49,2,0101000020E61000004486E281C5C257C068B89DDA998F4640,1 """) ds = gdal.OpenEx('/vsimem/ogr_csv_40.csv', gdal.OF_VECTOR, open_options=['X_POSSIBLE_NAMES=longitude', 'Y_POSSIBLE_NAMES=latitude', 'GEOM_POSSIBLE_NAMES=the_geom', 'KEEP_GEOM_COLUMNS=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)' or f['id'] != '1' or f['the_geom'] != '0101000020E61000004486E281C5C257C068B89DDA998F4640': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() ds = None gdal.Unlink('/vsimem/ogr_csv_40.csv') gdal.FileFromMemBuffer('/vsimem/ogr_csv_40.csv', """the_geom,latitude,longitude,id 0101000020E61000004486E281C5C257C068B89DDA998F4640,49,2,1 """) ds = gdal.OpenEx('/vsimem/ogr_csv_40.csv', gdal.OF_VECTOR, open_options=['X_POSSIBLE_NAMES=longitude', 'Y_POSSIBLE_NAMES=latitude', 'GEOM_POSSIBLE_NAMES=the_geom', 'KEEP_GEOM_COLUMNS=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt().find('POINT (-95.04') < 0 or f['id'] != '1' or f['longitude'] != '2' or f['latitude'] != '49': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() ds = None gdal.Unlink('/vsimem/ogr_csv_40.csv') ############################################################################### # Test GEOM_POSSIBLE_NAMES and KEEP_GEOM_COLUMNS=NO together with empty content in geom column (#6152) def test_ogr_csv_41(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_41.csv', """id,the_geom,foo 1,,bar """) ds = gdal.OpenEx('/vsimem/ogr_csv_41.csv', gdal.OF_VECTOR, open_options=['GEOM_POSSIBLE_NAMES=the_geom', 'KEEP_GEOM_COLUMNS=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef() is not None or f['id'] != '1' or f['foo'] != 'bar': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_41.csv') ############################################################################### # Test writing field with empty content def test_ogr_csv_42(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_42.csv') lyr = ds.CreateLayer('ogr_csv_42') lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) assert lyr.CreateFeature(f) == 0 ds = None gdal.Unlink('/vsimem/ogr_csv_42.csv') ############################################################################### # Test editing capabilities def test_ogr_csv_43(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_43.csv') lyr = ds.CreateLayer('ogr_csv_43', options=['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES']) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) assert lyr.CreateFeature(f) == 0 f = None lyr.SetNextByIndex(0) f = lyr.GetNextFeature() if f['id'] != 1: f.DumpReadable() pytest.fail() f = None assert lyr.TestCapability(ogr.OLCCreateField) == 1 assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) == 0 with gdaltest.error_handler(): assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) != 0 f = lyr.GetFeature(1) f.SetField('foo', 'bar') assert lyr.TestCapability(ogr.OLCRandomWrite) == 1 assert lyr.SetFeature(f) == 0 f = lyr.GetFeature(1) if f['id'] != 1 or f['foo'] != 'bar' or f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() lyr.ResetReading() f = lyr.GetNextFeature() if f['id'] != 1 or f['foo'] != 'bar' or f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is None assert lyr.GetFeatureCount() == 1 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 2) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(3 50)')) f.SetField('foo', 'baz') assert lyr.CreateFeature(f) == 0 assert f.GetFID() == 2 f = lyr.GetFeature(2) if f['id'] != 2 or f['foo'] != 'baz' or f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() assert lyr.GetFeatureCount() == 2 lyr.SetNextByIndex(1) f = lyr.GetNextFeature() if f['id'] != 2: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(2) if f['id'] != 2 or f['foo'] != 'baz' or f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': f.DumpReadable() pytest.fail() f = None assert lyr.TestCapability(ogr.OLCDeleteField) == 1 with gdaltest.error_handler(): assert lyr.DeleteField(-1) != 0 assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('foo')) == 0 assert lyr.TestCapability(ogr.OLCDeleteFeature) == 1 assert lyr.DeleteFeature(2) == 0 assert lyr.DeleteFeature(2) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.DeleteFeature(3) == ogr.OGRERR_NON_EXISTING_FEATURE assert lyr.GetFeature(2) is None assert lyr.GetFeature(3) is None lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None f = lyr.GetNextFeature() assert f is None f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 3 assert lyr.CreateFeature(f) == 0 assert f.GetFID() == 3 f = None assert lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) == 0 f = lyr.GetFeature(1) assert f['foo'] != 'bar' f = lyr.GetFeature(3) assert f.GetFID() == 3 f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(2) if f['id'] != 3: f.DumpReadable() pytest.fail() f = None assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('foo')) == 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(4 51)')) assert lyr.CreateFeature(f) == 0 if f.GetFID() != 3: f.DumpReadable() pytest.fail() assert lyr.GetExtent() == (2.0, 4.0, 49.0, 51.0) assert lyr.DeleteFeature(f.GetFID()) == 0 assert lyr.GetFeatureCount() == 2 with gdaltest.error_handler(): lyr.SetSpatialFilter(-1, None) with gdaltest.error_handler(): lyr.SetSpatialFilter(1, None) lyr.SetSpatialFilterRect(0, 0, 100, 100) lyr.SetSpatialFilterRect(0, 0, 0, 100, 100) lyr.SetSpatialFilter(0, lyr.GetSpatialFilter()) lyr.SetSpatialFilter(lyr.GetSpatialFilter()) assert lyr.GetFeatureCount() == 1 assert lyr.GetExtent() == (2.0, 2.0, 49.0, 49.0) assert lyr.GetExtent(geom_field=0) == (2.0, 2.0, 49.0, 49.0) with gdaltest.error_handler(): lyr.GetExtent(geom_field=-1) lyr.SetAttributeFilter(None) assert lyr.TestCapability(ogr.OLCCurveGeometries) == 1 assert lyr.TestCapability(ogr.OLCTransactions) == 0 lyr.StartTransaction() lyr.RollbackTransaction() lyr.CommitTransaction() assert lyr.GetGeometryColumn() == '' assert lyr.GetFIDColumn() == '' assert lyr.TestCapability(ogr.OLCReorderFields) == 1 assert lyr.ReorderFields([0, 1]) == 0 with gdaltest.error_handler(): assert lyr.ReorderFields([0, -1]) != 0 assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 fld_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert lyr.AlterFieldDefn(0, fld_defn, 0) == 0 with gdaltest.error_handler(): assert lyr.AlterFieldDefn(-1, fld_defn, 0) != 0 f = lyr.GetFeature(2) f.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (1 2)')) assert lyr.SetFeature(f) == 0 f = None assert lyr.TestCapability(ogr.OLCCreateGeomField) == 1 assert lyr.CreateGeomField(ogr.GeomFieldDefn('geom__WKT_2')) == 0 f = lyr.GetFeature(2) f.SetGeomField(1, ogr.CreateGeometryFromWkt('POINT (3 4)')) assert lyr.SetFeature(f) == 0 f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1) lyr = ds.GetLayer(0) f = lyr.GetFeature(2) if f['WKT'] != 'POINT (1 2)' or f['_WKT_2'] != 'POINT (3 4)': f.DumpReadable() pytest.fail() assert lyr.SetFeature(f) == 0 f = None assert lyr.DeleteFeature(2) == 0 assert lyr.GetFeature(2) is None assert lyr.DeleteFeature(2) == ogr.OGRERR_NON_EXISTING_FEATURE ds = None gdal.Unlink('/vsimem/ogr_csv_43.csv') gdal.Unlink('/vsimem/ogr_csv_43.csvt') ############################################################################### # Test seeking back while creating def test_ogr_csv_44(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_44.csv') lyr = ds.CreateLayer('ogr_csv_44', options=['GEOMETRY=AS_WKT']) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) assert lyr.CreateFeature(f) == 0 f = None f = lyr.GetFeature(1) if f['id'] != 1 or f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 2) assert lyr.CreateFeature(f) == 0 f = lyr.GetFeature(2) if f['id'] != 2 or f.GetGeometryRef() is not None: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_44.csv') ############################################################################### # Test QGIS use case that consists in reopening a file just after calling # CreateField() on the main dataset and assuming that file is already serialized. def test_ogr_csv_45(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_45.csv') lyr = ds.CreateLayer('ogr_csv_45', options=['GEOMETRY=AS_WKT']) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) ds = None ds = ogr.Open('/vsimem/ogr_csv_45.csv', update=1) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTInteger)) ds2 = ogr.Open('/vsimem/ogr_csv_45.csv') lyr2 = ds2.GetLayer(0) assert lyr2.GetLayerDefn().GetFieldCount() == 3 ds2 = None ds = None gdal.Unlink('/vsimem/ogr_csv_45.csv') ############################################################################### # Test edition of CSV files with X_POSSIBLE_NAMES, Y_POSSIBLE_NAMES open options def test_ogr_csv_46(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_46.csv') lyr = ds.CreateLayer('ogr_csv_46') lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('X', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('Y', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('Z', ogr.OFTReal)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 f['X'] = 1 f['Y'] = 2 f['Z'] = 3 lyr.CreateFeature(f) f = None ds = None ds = gdal.OpenEx('/vsimem/ogr_csv_46.csv', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['X_POSSIBLE_NAMES=X', 'Y_POSSIBLE_NAMES=Y']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (10 20 30)')) lyr.SetFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_46.csv') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 4 f = lyr.GetNextFeature() if f['id'] != '1' or f['X'] != '10' or f['Y'] != '20' or f['Z'] != '3': f.DumpReadable() pytest.fail() ds = None ds = gdal.OpenEx('/vsimem/ogr_csv_46.csv', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['KEEP_GEOM_COLUMNS=NO', 'X_POSSIBLE_NAMES=X', 'Y_POSSIBLE_NAMES=Y']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (-10 -20 30)')) lyr.SetFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_46.csv') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 4 f = lyr.GetNextFeature() if f['id'] != '1' or f['X'] != '-10' or f['Y'] != '-20' or f['Z'] != '3': f.DumpReadable() pytest.fail() ds = None ds = gdal.OpenEx('/vsimem/ogr_csv_46.csv', gdal.OF_VECTOR | gdal.OF_UPDATE, open_options=['KEEP_GEOM_COLUMNS=NO', 'X_POSSIBLE_NAMES=X', 'Y_POSSIBLE_NAMES=Y', 'Z_POSSIBLE_NAMES=Z']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (-1 -2 -3)')) lyr.SetFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_46.csv') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 4 f = lyr.GetNextFeature() if f['id'] != '1' or f['X'] != '-1' or f['Y'] != '-2' or f['Z'] != '-3': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_46.csv') ############################################################################### # Test writing XYZM def test_ogr_csv_47(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_47.csv') assert ds.TestCapability(ogr.ODsCMeasuredGeometries) == 1 lyr = ds.CreateLayer('ogr_csv_47', options=['GEOMETRY=AS_WKT']) assert lyr.TestCapability(ogr.OLCMeasuredGeometries) == 1 lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 f.SetGeometry(ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 4)')) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_csv_47.csv') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_47.csv') ############################################################################### # Test reading/writing StringList, etc.. def test_ogr_csv_48(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_48.csvt', 'JsonStringList,JsonIntegerList,JsonInteger64List,JsonRealList\n') gdal.FileFromMemBuffer('/vsimem/ogr_csv_48.csv', """stringlist,intlist,int64list,reallist "[""a"",null]","[1]","[1234567890123]","[0.125]" """) gdal.VectorTranslate('/vsimem/ogr_csv_48_out.csv', '/vsimem/ogr_csv_48.csv', format='CSV', layerCreationOptions=['CREATE_CSVT=YES', 'LINEFORMAT=LF']) f = gdal.VSIFOpenL('/vsimem/ogr_csv_48_out.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('stringlist,intlist,int64list,reallist\n"[ ""a"", """" ]",[ 1 ],[ 1234567890123 ],[ 0.125') f = gdal.VSIFOpenL('/vsimem/ogr_csv_48_out.csvt', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('JSonStringList,JSonIntegerList,JSonInteger64List,JSonRealList') gdal.Unlink('/vsimem/ogr_csv_48.csv') gdal.Unlink('/vsimem/ogr_csv_48.csvt') gdal.Unlink('/vsimem/ogr_csv_48_out.csv') gdal.Unlink('/vsimem/ogr_csv_48_out.csvt') ############################################################################### # Test EMPTY_STRING_AS_NULL=ES def test_ogr_csv_49(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_49.csv', """id,str 1, """) ds = gdal.OpenEx('/vsimem/ogr_csv_49.csv', open_options=['EMPTY_STRING_AS_NULL=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if not f.IsFieldNull('str'): f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_csv_49.csv') ############################################################################### def test_ogr_csv_more_than_100_geom_fields(): with gdaltest.error_handler(): ds = ogr.Open('data/more_than_100_geom_fields.csv') lyr = ds.GetLayer(0) lyr.GetNextFeature() ############################################################################### def test_ogr_csv_string_quoting_always(): gdal.VectorTranslate('/vsimem/ogr_csv_string_quoting_always.csv', 'data/poly.shp', format='CSV', where='FID = 0', layerCreationOptions=['CREATE_CSVT=YES', 'STRING_QUOTING=ALWAYS', 'LINEFORMAT=LF']) f = gdal.VSIFOpenL('/vsimem/ogr_csv_string_quoting_always.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('"AREA","EAS_ID","PRFEDEA"\n215229.266,"168","35043411"') ds = gdal.OpenEx('/vsimem/ogr_csv_string_quoting_always.csv', gdal.OF_UPDATE | gdal.OF_VECTOR) gdal.VectorTranslate(ds, 'data/poly.shp', layerName='ogr_csv_string_quoting_always', where='FID = 1', accessMode='append') ds = None f = gdal.VSIFOpenL('/vsimem/ogr_csv_string_quoting_always.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('"AREA","EAS_ID","PRFEDEA"\n215229.266,"168","35043411"\n247328.172,"179","35043423"') gdal.Unlink('/vsimem/ogr_csv_string_quoting_always.csv') gdal.Unlink('/vsimem/ogr_csv_string_quoting_always.csvt') gdal.Unlink('/vsimem/ogr_csv_string_quoting_always.prj') ############################################################################### def test_ogr_csv_string_quoting_if_ambiguous(): src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('foo')) lyr.CreateField(ogr.FieldDefn('bar')) lyr.CreateField(ogr.FieldDefn('baz')) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = '00123' f['bar'] = 'x' f['baz'] = '1.25' lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/ogr_csv_string_quoting_if_ambiguous.csv', src_ds, format='CSV') f = gdal.VSIFOpenL('/vsimem/ogr_csv_string_quoting_if_ambiguous.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '"00123",x,"1.25"' in data gdal.Unlink('/vsimem/ogr_csv_string_quoting_if_ambiguous.csv') ############################################################################### def test_ogr_csv_string_quoting_if_needed(): src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('layer') lyr.CreateField(ogr.FieldDefn('foo')) lyr.CreateField(ogr.FieldDefn('bar')) lyr.CreateField(ogr.FieldDefn('baz')) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = '00123' f['bar'] = 'x' f['baz'] = '1.25' lyr.CreateFeature(f) gdal.VectorTranslate('/vsimem/ogr_csv_string_quoting_if_needed.csv', src_ds, format='CSV', layerCreationOptions=['STRING_QUOTING=IF_NEEDED']) f = gdal.VSIFOpenL('/vsimem/ogr_csv_string_quoting_if_needed.csv', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '00123,x,1.25' in data gdal.Unlink('/vsimem/ogr_csv_string_quoting_if_needed.csv') ############################################################################### def test_ogr_csv_iter_and_set_feature(): gdal.FileFromMemBuffer('/vsimem/ogr_csv_iter_and_set_feature.csv', """id,str 1, 2, """) ds = gdal.OpenEx('/vsimem/ogr_csv_iter_and_set_feature.csv', gdal.OF_UPDATE) lyr = ds.GetLayer(0) count = 0 for f in lyr: lyr.SetFeature(f) count += 1 ds = None gdal.Unlink('/vsimem/ogr_csv_iter_and_set_feature.csv') assert count == 2 ############################################################################### # def test_ogr_csv_cleanup(): if gdaltest.csv_ds is None: pytest.skip() gdaltest.csv_ds = None gdaltest.csv_lyr1 = None gdaltest.csv_lyr2 = None gdaltest.csv_tmpds = None try: gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.GetDriverByName('CSV').DeleteDataSource('tmp/csvwrk') gdal.PopErrorHandler() except: pass try: gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.GetDriverByName('CSV').DeleteDataSource('tmp/ogr_csv_29') gdal.PopErrorHandler() except: pass gdalautotest-3.0.4/ogr/ogr_shape_qix.py0000755003401500001440000002170013614005363017625 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_shape_qix.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test shapefile spatial index mechanism (.qix files). This can serve # as a test for the functionality of shapelib's shptree.c # Author: Even Rouault # ############################################################################### # Copyright (c) 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 random from osgeo import ogr ############################################################################### # def check_qix_non_overlapping_geoms(lyr): geoms = [] lyr.SetSpatialFilter(None) extents = lyr.GetExtent() fc_ref = lyr.GetFeatureCount() feat = lyr.GetNextFeature() while feat is not None: geom = feat.GetGeometryRef() geoms.append(geom.Clone()) feat = lyr.GetNextFeature() # Test getting each geom 1 by 1 for geom in geoms: bbox = geom.GetEnvelope() lyr.SetSpatialFilterRect(bbox[0], bbox[2], bbox[1], bbox[3]) lyr.ResetReading() feat = lyr.GetNextFeature() got_geom = feat.GetGeometryRef() assert got_geom.Equals(geom) != 0, \ ('expected %s. got %s' % (geom.ExportToWkt(), got_geom.ExportToWkt())) # Get all geoms in a single gulp. We do not use exactly the extent bounds, because # there is an optimization in the shapefile driver to skip the spatial index in that # case. That trick can only work with non point geometries of course lyr.SetSpatialFilterRect(extents[0] + 0.001, extents[2] + 0.001, extents[1] - 0.001, extents[3] - 0.001) lyr.ResetReading() fc = lyr.GetFeatureCount() assert fc == fc_ref, ('expected %d. got %d' % (fc_ref, fc)) ############################################################################### def build_rectangle_from_point(x, y, radius=0.1): return ogr.CreateGeometryFromWkt('POLYGON((%f %f,%f %f,%f %f,%f %f,%f %f))' % (x - radius, y - radius, x - radius, y + radius, x + radius, y + radius, x + radius, y - radius, x - radius, y - radius)) ############################################################################### # Test geoms on a 10x10 grid def test_ogr_shape_qix_1(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource('/vsimem/ogr_shape_qix.shp') lyr = ds.CreateLayer("ogr_shape_qix") for x in range(10): for y in range(10): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(build_rectangle_from_point(x, y)) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_shape_qix') ds = None ds = ogr.Open('/vsimem/ogr_shape_qix.shp') lyr = ds.GetLayer(0) ret = check_qix_non_overlapping_geoms(lyr) shape_drv.DeleteDataSource('/vsimem/ogr_shape_qix.shp') return ret ############################################################################### # Test geoms on a 100x100 grid def test_ogr_shape_qix_2(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource('/vsimem/ogr_shape_qix.shp') lyr = ds.CreateLayer("ogr_shape_qix") for x in range(100): for y in range(100): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(build_rectangle_from_point(x, y)) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_shape_qix') ds = None ds = ogr.Open('/vsimem/ogr_shape_qix.shp') lyr = ds.GetLayer(0) ret = check_qix_non_overlapping_geoms(lyr) shape_drv.DeleteDataSource('/vsimem/ogr_shape_qix.shp') return ret ############################################################################### # Test 2 separated regions of 10x10 geoms def test_ogr_shape_qix_3(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource('/vsimem/ogr_shape_qix.shp') lyr = ds.CreateLayer("ogr_shape_qix") for x in range(10): for y in range(10): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(build_rectangle_from_point(x, y)) lyr.CreateFeature(feat) feat = None for x in range(10): for y in range(10): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(build_rectangle_from_point(x + 1000, y)) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_shape_qix') ds = None ds = ogr.Open('/vsimem/ogr_shape_qix.shp') lyr = ds.GetLayer(0) ret = check_qix_non_overlapping_geoms(lyr) shape_drv.DeleteDataSource('/vsimem/ogr_shape_qix.shp') return ret ############################################################################### # def check_qix_random_geoms(lyr): geoms = [] lyr.SetSpatialFilter(None) extents = lyr.GetExtent() fc_ref = lyr.GetFeatureCount() feat = lyr.GetNextFeature() while feat is not None: geom = feat.GetGeometryRef() geoms.append(geom.Clone()) feat = lyr.GetNextFeature() # Test getting each geom 1 by 1 for geom in geoms: bbox = geom.GetEnvelope() lyr.SetSpatialFilterRect(bbox[0], bbox[2], bbox[1], bbox[3]) lyr.ResetReading() found_geom = False feat = lyr.GetNextFeature() while feat is not None and found_geom is False: got_geom = feat.GetGeometryRef() if got_geom.Equals(geom) == 1: found_geom = True else: feat = lyr.GetNextFeature() assert found_geom, ('did not find geometry for %s' % (geom.ExportToWkt())) # Get all geoms in a single gulp. We do not use exactly the extent bounds, because # there is an optimization in the shapefile driver to skip the spatial index in that # case. That trick can only work with non point geometries of course lyr.SetSpatialFilterRect(extents[0] + 0.001, extents[2] + 0.001, extents[1] - 0.001, extents[3] - 0.001) lyr.ResetReading() fc = lyr.GetFeatureCount() assert fc == fc_ref, ('expected %d. got %d' % (fc_ref, fc)) ############################################################################### def build_rectangle(x1, y1, x2, y2): return ogr.CreateGeometryFromWkt('POLYGON((%f %f,%f %f,%f %f,%f %f,%f %f))' % (x1, y1, x1, y2, x2, y2, x2, y1, x1, y1)) ############################################################################### # Test random geometries def test_ogr_shape_qix_4(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource('/vsimem/ogr_shape_qix.shp') lyr = ds.CreateLayer("ogr_shape_qix") # The 1000,200,10 figures are such that there are # a bit of overlapping between the geometries for _ in range(1000): feat = ogr.Feature(lyr.GetLayerDefn()) x1 = random.randint(0, 200) y1 = random.randint(0, 200) x2 = x1 + random.randint(1, 10) y2 = y1 + random.randint(1, 10) feat.SetGeometry(build_rectangle(x1, y1, x2, y2)) lyr.CreateFeature(feat) feat = None # And add statistically non overlapping features for _ in range(1000): feat = ogr.Feature(lyr.GetLayerDefn()) x1 = random.randint(0, 10000) y1 = random.randint(0, 10000) x2 = x1 + random.randint(1, 10) y2 = y1 + random.randint(1, 10) feat.SetGeometry(build_rectangle(x1, y1, x2, y2)) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_shape_qix') ret = check_qix_random_geoms(lyr) shape_drv.DeleteDataSource('/vsimem/ogr_shape_qix.shp') return ret gdalautotest-3.0.4/ogr/ogr_dods.py0000755003401500001440000001434713614005364016607 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_dods.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR DODS driver. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2009-2011, Even Rouault # # 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. ############################################################################### import gdaltest import ogrtest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Open DODS datasource. @pytest.mark.skip() def test_ogr_dods_1(): gdaltest.dods_ds = None ogrtest.dods_drv = ogr.GetDriverByName('DODS') if ogrtest.dods_drv is None: pytest.skip() gdal.SetConfigOption('DODS_AIS_FILE', 'data/ais.xml') srv = 'http://www.epic.noaa.gov:10100/dods/wod2001/natl_prof_bot.cdp?&_id=1' if gdaltest.gdalurlopen(srv) is None: gdaltest.dods_ds = None pytest.skip() gdaltest.dods_ds = ogr.Open('DODS:' + srv) assert gdaltest.dods_ds is not None try: gdaltest.dods_profiles = gdaltest.dods_ds.GetLayerByName('profiles') gdaltest.dods_normalized = gdaltest.dods_ds.GetLayerByName('normalized') gdaltest.dods_lines = gdaltest.dods_ds.GetLayerByName('lines') except: gdaltest.dods_profiles = None gdaltest.dods_normalized = None if gdaltest.dods_profiles is None: gdaltest.dods_ds = None pytest.fail('profiles layer missing, likely AIS stuff not working.') ############################################################################### # Read a single feature from the profiles layer and verify a few things. # @pytest.mark.skip() def test_ogr_dods_2(): if gdaltest.dods_ds is None: pytest.skip() gdaltest.dods_profiles.ResetReading() feat = gdaltest.dods_profiles.GetNextFeature() assert feat.GetField('time') == -1936483200000, 'time wrong' assert feat.GetField('profile.depth') == [0, 10, 20, 30, 39], 'depth wrong' assert ogrtest.check_feature_geometry(feat, 'POINT (4.30000019 5.36999989)') == 0 feat.Destroy() feat = gdaltest.dods_profiles.GetNextFeature() if feat is not None: feat.Destroy() pytest.fail('got more than expected number of features.') ############################################################################### # Read the normalized form of the same profile, and verify some values. # @pytest.mark.skip() def test_ogr_dods_3(): if gdaltest.dods_ds is None: pytest.skip() gdaltest.dods_normalized.ResetReading() expect = [0, 10, 20, 30, 39] tr = ogrtest.check_features_against_list(gdaltest.dods_normalized, 'depth', expect) assert tr != 0 expected = [14.8100004196167, 14.8100004196167, 14.8100004196167, 14.60999965667725, 14.60999965667725] gdaltest.dods_normalized.ResetReading() for i in range(5): feat = gdaltest.dods_normalized.GetNextFeature() assert feat.GetField('time') == -1936483200000, 'time wrong' assert abs(feat.GetField('T_20') - expected[i]) <= 0.001, 'T_20 wrong' assert ogrtest.check_feature_geometry(feat, 'POINT (4.30000019 5.36999989)') == 0 feat.Destroy() feat = None feat = gdaltest.dods_normalized.GetNextFeature() if feat is not None: feat.Destroy() pytest.fail('got more than expected number of features.') ############################################################################### # Read the "lines" from from the same server and verify some values. # @pytest.mark.skip() def test_ogr_dods_4(): if gdaltest.dods_ds is None: pytest.skip() gdaltest.dods_lines.ResetReading() feat = gdaltest.dods_lines.GetNextFeature() assert feat.GetField('time') == -1936483200000, 'time wrong' assert feat.GetField('profile.depth') == [0, 10, 20, 30, 39], 'depth wrong' wkt_geom = 'LINESTRING (0.00000000 14.81000042,10.00000000 14.81000042,20.00000000 14.81000042,30.00000000 14.60999966,39.00000000 14.60999966)' assert ogrtest.check_feature_geometry(feat, wkt_geom) == 0, \ feat.GetGeometryRef().ExportToWkt() feat.Destroy() feat = gdaltest.dods_lines.GetNextFeature() if feat is not None: feat.Destroy() pytest.fail('got more than expected number of features.') ############################################################################### # Simple 1D Grid. # @pytest.mark.skip() def test_ogr_dods_5(): if ogrtest.dods_drv is None: pytest.skip() srv = 'http://uhslc1.soest.hawaii.edu/cgi-bin/nph-nc/fast/m004.nc.dds' if gdaltest.gdalurlopen(srv) is None: pytest.skip() grid_ds = ogr.Open('DODS:' + srv) assert grid_ds is not None lat_lyr = grid_ds.GetLayerByName('latitude') expect = [-0.53166663646698] tr = ogrtest.check_features_against_list(lat_lyr, 'latitude', expect) assert tr != 0 ############################################################################### # @pytest.mark.skip() def test_ogr_dods_cleanup(): if gdaltest.dods_ds is None: pytest.skip() gdaltest.dods_profiles = None gdaltest.dods_lines = None gdaltest.dods_normalized = None gdaltest.dods_ds.Destroy() gdaltest.dods_ds = None gdalautotest-3.0.4/ogr/ogr_geos.py0000755003401500001440000004114413614005364016606 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_geos.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GEOS integration in OGR - geometric operations. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, Frank Warmerdam # Copyright (c) 2009-2012, Even Rouault # # 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. ############################################################################### import gdaltest import ogrtest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Establish whether we have GEOS support integrated, testing simple Union. def test_ogr_geos_union(): if not ogrtest.have_geos(): pytest.skip() pnt1 = ogr.CreateGeometryFromWkt('POINT(10 20)') pnt2 = ogr.CreateGeometryFromWkt('POINT(30 20)') result = pnt1.Union(pnt2) assert not ogrtest.check_feature_geometry(result, 'MULTIPOINT (10 20,30 20)') ############################################################################### # Test polygon intersection. def test_ogr_geos_intersection(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') result = g1.Intersection(g2) assert not ogrtest.check_feature_geometry(result, 'POLYGON ((0 0,5 5,10 0,0 0))'), \ ('Got: %s' % result.ExportToWkt()) ############################################################################### # Test polygon difference. def test_ogr_geos_difference(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') result = g1.Difference(g2) assert (not ogrtest.check_feature_geometry(result, 'POLYGON ((5 5,10 10,10 0,5 5))')), \ ('Got: %s' % result.ExportToWkt()) ############################################################################### # Test polygon symmetric difference. def test_ogr_geos_symmetric_difference(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') result = g1.SymmetricDifference(g2) assert (not ogrtest.check_feature_geometry(result, 'MULTIPOLYGON (((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5)))')), \ ('Got: %s' % result.ExportToWkt()) ############################################################################### # Test polygon symmetric difference. def test_ogr_geos_sym_difference(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 10, 10 0, 0 0))') result = g1.SymDifference(g2) assert (not ogrtest.check_feature_geometry(result, 'MULTIPOLYGON (((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5)))')), \ ('Got: %s' % result.ExportToWkt()) ############################################################################### # Test Intersect(). def test_ogr_geos_intersect(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') result = g1.Intersect(g2) assert result != 0, 'wrong result (got false)' g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('POLYGON((20 20, 20 30, 30 20, 20 20))') result = g1.Intersect(g2) assert result == 0, 'wrong result (got true)' ############################################################################### # Test disjoint(). def test_ogr_geos_disjoint(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') result = g1.Disjoint(g2) assert result == 0, 'wrong result (got true)' g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('POLYGON((20 20, 20 30, 30 20, 20 20))') result = g1.Disjoint(g2) assert result != 0, 'wrong result (got false)' ############################################################################### # Test touches. def test_ogr_geos_touches(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 0 10)') result = g1.Touches(g2) assert result != 0, 'wrong result (got false)' g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('POLYGON((20 20, 20 30, 30 20, 20 20))') result = g1.Touches(g2) assert result == 0, 'wrong result (got true)' ############################################################################### # Test crosses. def test_ogr_geos_crosses(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('LINESTRING(10 0, 0 10)') result = g1.Crosses(g2) assert result != 0, 'wrong result (got false)' g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 10 10)') g2 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 0 10)') result = g1.Crosses(g2) assert result == 0, 'wrong result (got true)' ############################################################################### def test_ogr_geos_within(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') result = g1.Within(g2) assert result != 0, 'wrong result (got false)' result = g2.Within(g1) assert result == 0, 'wrong result (got true)' ############################################################################### def test_ogr_geos_contains(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') result = g2.Contains(g1) assert result != 0, 'wrong result (got false)' result = g1.Contains(g2) assert result == 0, 'wrong result (got true)' ############################################################################### def test_ogr_geos_overlaps(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((-90 -90, -90 90, 190 -90, -90 -90))') result = g2.Overlaps(g1) # g1 and g2 intersect, but their intersection is equal to g1 assert result == 0, 'wrong result (got true)' g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') g2 = ogr.CreateGeometryFromWkt('POLYGON((0 -5,10 5,10 -5,0 -5))') result = g2.Overlaps(g1) assert result != 0, 'wrong result (got false)' ############################################################################### def test_ogr_geos_buffer(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') result = g1.Buffer(1.0, 3) assert (ogrtest.check_feature_geometry(result, 'POLYGON ((0 -1,-0.555570233019607 -0.831469612302542,-0.923879532511288 -0.382683432365087,-0.98078528040323 0.19509032201613,-0.707106781186547 0.707106781186547,9.292893218813452 10.707106781186548,9.690983005625053 10.951056516295154,10.156434465040231 10.987688340595138,10.587785252292473 10.809016994374947,10.891006524188368 10.453990499739547,11 10,11 0,10.866025403784439 -0.5,10.5 -0.866025403784439,10 -1,0 -1))') == 0), \ ('Got: %s' % result.ExportToWkt()) ############################################################################### def test_ogr_geos_centroid(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') centroid = g1.Centroid() assert (ogrtest.check_feature_geometry(centroid, 'POINT(6.666666667 3.333333333)') == 0), \ ('Got: %s' % centroid.ExportToWkt()) # Test with a self intersecting polygon too. # This particular polygon has two triangles. The right triangle is larger. g2 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 0 2, 2 -0.1, 2 2.1, 0 0))') centroid2 = g2.Centroid() assert ogrtest.check_feature_geometry(centroid2, 'POINT (8.0 1.0)') == 0, \ ('Got: %s' % centroid2.ExportToWkt()) ############################################################################### def test_ogr_geos_centroid_multipolygon(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,1 0,0 0)),((2 0,2 1,3 1,3 0,2 0)))') centroid = g1.Centroid() assert (ogrtest.check_feature_geometry(centroid, 'POINT (1.5 0.5)') == 0), \ ('Got: %s' % centroid.ExportToWkt()) ############################################################################### def test_ogr_geos_centroid_point_empty(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POINT EMPTY') centroid = g1.Centroid() assert centroid.ExportToWkt() == 'POINT EMPTY', ('Got: %s' % centroid.ExportToWkt()) ############################################################################### def test_ogr_geos_simplify_linestring(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0,10 0)') gdal.ErrorReset() simplify = g1.Simplify(5) assert simplify.ExportToWkt() == 'LINESTRING (0 0,10 0)', \ ('Got: %s' % simplify.ExportToWkt()) ############################################################################### def test_ogr_geos_simplifypreservetopology_linestring(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 0,10 0)') gdal.ErrorReset() simplify = g1.SimplifyPreserveTopology(5) assert simplify.ExportToWkt() == 'LINESTRING (0 0,10 0)', \ ('Got: %s' % simplify.ExportToWkt()) ############################################################################### def test_ogr_geos_unioncascaded(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 1,1 1,1 0,0 0)),((0.5 0.5,0.5 1.5,1.5 1.5,1.5 0.5,0.5 0.5)))') gdal.ErrorReset() cascadedunion = g1.UnionCascaded() assert cascadedunion.ExportToWkt() == 'POLYGON ((0 0,0 1,0.5 1.0,0.5 1.5,1.5 1.5,1.5 0.5,1.0 0.5,1 0,0 0))', \ ('Got: %s' % cascadedunion.ExportToWkt()) ############################################################################### def test_ogr_geos_convexhull(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 1), POINT(0 0), POINT(1 0), POINT(1 1))') convexhull = g1.ConvexHull() assert convexhull.ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))', \ ('Got: %s' % convexhull.ExportToWkt()) ############################################################################### def test_ogr_geos_distance(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POINT(0 0)') g2 = ogr.CreateGeometryFromWkt('POINT(1 0)') distance = g1.Distance(g2) assert abs(distance - 1) <= 0.00000000001, \ ('Distance() result wrong, got %g.' % distance) ############################################################################### def test_ogr_geos_isring(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0,0 1,1 1,0 0)') isring = g1.IsRing() assert isring == 1 ############################################################################### def test_ogr_geos_issimple_true(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))') isring = g1.IsSimple() assert isring == 1 ############################################################################### def test_ogr_geos_issimple_false(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)') isring = g1.IsSimple() assert isring == 0 ############################################################################### def test_ogr_geos_isvalid_true(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING(0 0, 1 1)') isring = g1.IsValid() assert isring == 1 ############################################################################### def test_ogr_geos_isvalid_true_linestringM(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('LINESTRING M(0 0 10, 1 1 20)') isring = g1.IsValid() assert isring == 1 ############################################################################### def test_ogr_geos_isvalid_true_circularStringM(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('CIRCULARSTRING M(0 0 10, 1 1 20,2 0 30)') isring = g1.IsValid() assert isring == 1 ############################################################################### def test_ogr_geos_isvalid_true_triangle(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('TRIANGLE ((0 0,0 1,1 1,0 0))') isring = g1.IsValid() assert isring == 1 ############################################################################### def test_ogr_geos_isvalid_false(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0,1 1,1 2,1 1,0 0))') with gdaltest.error_handler(): isring = g1.IsValid() assert isring == 0 ############################################################################### def test_ogr_geos_pointonsurface(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('POLYGON((0 0, 10 10, 10 0, 0 0))') pointonsurface = g1.PointOnSurface() assert pointonsurface.Within(g1) == 1 ############################################################################### def test_ogr_geos_DelaunayTriangulation(): if not ogrtest.have_geos(): pytest.skip() g1 = ogr.CreateGeometryFromWkt('MULTIPOINT(0 0,0 1,1 1,1 0)') gdal.ErrorReset() triangulation = g1.DelaunayTriangulation() if triangulation is None: assert gdal.GetLastErrorMsg() != '' pytest.skip() assert triangulation.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((0 1,0 0,1 0,0 1)),POLYGON ((0 1,1 0,1 1,0 1)))', \ ('Got: %s' % triangulation.ExportToWkt()) ############################################################################### def test_ogr_geos_polygonize(): if not ogrtest.have_geos(): pytest.skip() g = ogr.CreateGeometryFromWkt('MULTILINESTRING((0 0,0 1,1 1),(1 1,0 0))') got = g.Polygonize() assert got.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((0 0,0 1,1 1,0 0)))', \ ('Got: %s' % got.ExportToWkt()) g = ogr.CreateGeometryFromWkt('POINT EMPTY') got = g.Polygonize() assert got is None, ('Got: %s' % got.ExportToWkt()) g = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT EMPTY)') got = g.Polygonize() assert got is None, ('Got: %s' % got.ExportToWkt()) gdalautotest-3.0.4/ogr/ogr_bna.py0000755003401500001440000001630413614005364016411 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_bna.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test BNA driver functionality. # 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 gdaltest import ogrtest from osgeo import ogr ############################################################################### # Test points bna layer. def test_ogr_bna_1(): gdaltest.bna_ds = ogr.Open('data/test.bna') lyr = gdaltest.bna_ds.GetLayerByName('test_points') expect = ['PID5', 'PID4'] tr = ogrtest.check_features_against_list(lyr, 'Primary ID', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'POINT (573.736 476.563)', max_error=0.0001) == 0) feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, 'POINT (532.991 429.121)', max_error=0.0001) == 0) ############################################################################### # Test lines bna layer. def test_ogr_bna_2(): gdaltest.bna_ds = ogr.Open('data/test.bna') lyr = gdaltest.bna_ds.GetLayerByName('test_lines') expect = ['PID3'] tr = ogrtest.check_features_against_list(lyr, 'Primary ID', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'LINESTRING (224.598 307.425,333.043 341.461,396.629 304.952)', max_error=0.0001) == 0 ############################################################################### # Test polygons bna layer. def test_ogr_bna_3(): gdaltest.bna_ds = ogr.Open('data/test.bna') lyr = gdaltest.bna_ds.GetLayerByName('test_polygons') expect = ['PID2', 'PID1', 'PID7', 'PID8', 'PID9', 'PID10'] tr = ogrtest.check_features_against_list(lyr, 'Primary ID', expect) assert tr lyr.ResetReading() feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,1 0,1 1,0 1,0 0)))', max_error=0.0001) == 0 feat = lyr.GetFeature(2) assert ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,1 0,1 1,0 1,0 0)))', max_error=0.0001) == 0 feat = lyr.GetFeature(3) assert ogrtest.check_feature_geometry(feat, 'POLYGON ((0 0,0 10,10 10,10 0,0 0),(2 2,2 8,8 8,8 2,2 2))', max_error=0.0001) == 0 feat = lyr.GetFeature(4) assert ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,0 10,10 10,10 0,0 0)))', max_error=0.0001) == 0 feat = lyr.GetFeature(5) assert ogrtest.check_feature_geometry(feat, 'MULTIPOLYGON (((0 0,0 10,10 10,10 0,0 0)))', max_error=0.0001) == 0 ############################################################################### # Test ellipses bna layer. def test_ogr_bna_4(): gdaltest.bna_ds = ogr.Open('data/test.bna') lyr = gdaltest.bna_ds.GetLayerByName('test_ellipses') expect = ['PID6'] tr = ogrtest.check_features_against_list(lyr, 'Primary ID', expect) assert tr lyr.ResetReading() lyr.GetNextFeature() ############################################################################### # Test write support def ogr_bna_check_content(lyr1, lyr2): assert lyr1.GetFeatureCount() == lyr2.GetFeatureCount() feat1 = lyr1.GetNextFeature() feat2 = lyr2.GetNextFeature() while feat1 is not None: for i in range(lyr1.GetLayerDefn().GetFieldCount()): assert feat1.GetField(i) == feat2.GetField(i) assert (ogrtest.check_feature_geometry(feat1, feat2.GetGeometryRef(), max_error=0.000000001) == 0) feat1 = lyr1.GetNextFeature() feat2 = lyr2.GetNextFeature() def ogr_bna_write(creation_options): output_ds = ogr.GetDriverByName('BNA').CreateDataSource('tmp/out.bna', options=creation_options) # Duplicate data/test.bna into tmp/out.bna for layer_name in ['points', 'lines', 'polygons', 'ellipses']: src_lyr = gdaltest.bna_ds.GetLayerByName('test_' + layer_name) dst_lyr = output_ds.CreateLayer(layer_name, geom_type=src_lyr.GetLayerDefn().GetGeomType()) for i in range(src_lyr.GetLayerDefn().GetFieldCount()): field_defn = src_lyr.GetLayerDefn().GetFieldDefn(i) dst_lyr.CreateField(field_defn) dst_feat = ogr.Feature(feature_def=dst_lyr.GetLayerDefn()) src_lyr.ResetReading() feat = src_lyr.GetNextFeature() while feat is not None: dst_feat.SetFrom(feat) assert dst_lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' feat = src_lyr.GetNextFeature() output_ds = None # Check features output_ds = ogr.Open('tmp/out.bna') for layer_name in ['points', 'lines', 'polygons', 'ellipses']: src_lyr = gdaltest.bna_ds.GetLayerByName('test_' + layer_name) dst_lyr = output_ds.GetLayerByName('out_' + layer_name) ogr_bna_check_content(src_lyr, dst_lyr) def test_ogr_bna_5(): return ogr_bna_write(['ELLIPSES_AS_ELLIPSES=YES']) def test_ogr_bna_6(): try: os.remove('tmp/out.bna') except OSError: pass ogr_bna_write(['LINEFORMAT=LF', 'MULTILINE=NO', 'COORDINATE_PRECISION=3']) size = os.stat('tmp/out.bna').st_size assert size == 1601, ('Got size %d. Expected %d' % (size, 1601)) os.remove('tmp/out.bna') ogr_bna_write(['LINEFORMAT=CRLF', 'MULTILINE=NO', 'COORDINATE_PRECISION=3']) size = os.stat('tmp/out.bna').st_size assert size == 1611, ('Got size %d. Expected %d' % (size, 1611)) ############################################################################### # def test_ogr_bna_cleanup(): gdaltest.bna_ds = None try: os.remove('tmp/out.bna') except OSError: pass gdalautotest-3.0.4/ogr/ogr_fgdb.py0000755003401500001440000022312413614005364016553 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_fgdb.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: FGDB driver testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011-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 import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test if driver is available def test_ogr_fgdb_init(): ogrtest.fgdb_drv = None ogrtest.fgdb_drv = ogr.GetDriverByName('FileGDB') if ogrtest.fgdb_drv is None: pytest.skip() ogrtest.openfilegdb_drv = ogr.GetDriverByName('OpenFileGDB') if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Deregister() try: shutil.rmtree("tmp/test.gdb") except OSError: pass ############################################################################### def ogr_fgdb_is_sdk_1_4_or_later(): if ogrtest.fgdb_drv is None: return False if hasattr(ogrtest, 'fgdb_is_sdk_1_4'): return ogrtest.fgdb_is_sdk_1_4 ogrtest.fgdb_is_sdk_1_4 = False try: shutil.rmtree("tmp/ogr_fgdb_is_sdk_1_4_or_later.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource("tmp/ogr_fgdb_is_sdk_1_4_or_later.gdb") srs = osr.SpatialReference() srs.ImportFromProj4('+proj=tmerc +datum=WGS84 +no_defs') with gdaltest.error_handler(): lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) if lyr is not None: ogrtest.fgdb_is_sdk_1_4 = True ds = None shutil.rmtree("tmp/ogr_fgdb_is_sdk_1_4_or_later.gdb") return ogrtest.fgdb_is_sdk_1_4 ############################################################################### # Write and read back various geometry types def test_ogr_fgdb_1(): if ogrtest.fgdb_drv is None: pytest.skip() srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") ds = ogrtest.fgdb_drv.CreateDataSource("tmp/test.gdb") datalist = [["none", ogr.wkbNone, None], ["point", ogr.wkbPoint, "POINT (1 2)"], ["multipoint", ogr.wkbMultiPoint, "MULTIPOINT (1 2,3 4)"], ["linestring", ogr.wkbLineString, "LINESTRING (1 2,3 4)", "MULTILINESTRING ((1 2,3 4))"], ["multilinestring", ogr.wkbMultiLineString, "MULTILINESTRING ((1 2,3 4),(5 6,7 8))"], ["polygon", ogr.wkbPolygon, "POLYGON ((0 0,0 1,1 1,1 0,0 0))", "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))"], ["multipolygon", ogr.wkbMultiPolygon, "MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0),(0.25 0.25,0.75 0.25,0.75 0.75,0.25 0.75,0.25 0.25)),((2 0,2 1,3 1,3 0,2 0)))"], ["point25D", ogr.wkbPoint25D, "POINT (1 2 3)"], ["multipoint25D", ogr.wkbMultiPoint25D, "MULTIPOINT (1 2 -10,3 4 -20)"], ["linestring25D", ogr.wkbLineString25D, "LINESTRING (1 2 -10,3 4 -20)", "MULTILINESTRING ((1 2 -10,3 4 -20))"], ["multilinestring25D", ogr.wkbMultiLineString25D, "MULTILINESTRING ((1 2 -10,3 4 -20))"], ["polygon25D", ogr.wkbPolygon25D, "POLYGON ((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10))", "MULTIPOLYGON (((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10)))"], ["multipolygon25D", ogr.wkbMultiPolygon25D, "MULTIPOLYGON (((0 0 -10,0 1 -10,1 1 -10,1 0 -10,0 0 -10)))"], ["multipatch", ogr.wkbMultiPolygon25D, "GEOMETRYCOLLECTION Z (TIN Z (((0.0 0.0 0,0.0 1.0 0,1.0 0.0 0,0.0 0.0 0)),((0.0 1.0 0,1.0 0.0 0,1.0 1.0 0,0.0 1.0 0))),TIN Z (((10.0 0.0 0,10.0 1.0 0,11.0 0.0 0,10.0 0.0 0)),((10.0 0.0 0,11.0 0.0 0,10.0 -1.0 0,10.0 0.0 0))),TIN Z (((5.0 0.0 0,5.0 1.0 0,6.0 0.0 0,5.0 0.0 0))),MULTIPOLYGON Z (((100.0 0.0 0,100.0 1.0 0,101.0 1.0 0,101.0 0.0 0,100.0 0.0 0),(100.25 0.25 0,100.75 0.25 0,100.75 0.75 0,100.75 0.25 0,100.25 0.25 0))))"], ["tin", ogr.wkbTINZ, "TIN Z (((0.0 0.0 0,0.0 1.0 0,1.0 0.0 0,0.0 0.0 0)),((0.0 1.0 0,1.0 0.0 0,1.0 1.0 0,0.0 1.0 0)))"], ["null_polygon", ogr.wkbPolygon, None], ["empty_polygon", ogr.wkbPolygon, "POLYGON EMPTY", None], ] options = ['COLUMN_TYPES=smallint=esriFieldTypeSmallInteger,float=esriFieldTypeSingle,guid=esriFieldTypeGUID,xml=esriFieldTypeXML'] for data in datalist: if data[1] == ogr.wkbNone: lyr = ds.CreateLayer(data[0], geom_type=data[1], options=options) elif data[0] == 'multipatch': lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=['CREATE_MULTIPATCH=YES', options[0]]) else: lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=options) lyr.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("smallint", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("int", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("float", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("real", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("adate", ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn("guid", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("xml", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("binary", ogr.OFTBinary)) lyr.CreateField(ogr.FieldDefn("binary2", ogr.OFTBinary)) fld_defn = ogr.FieldDefn("smallint2", ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn("float2", ogr.OFTReal) fld_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld_defn) # We need at least 5 features so that test_ogrsf can test SetFeature() for i in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) if data[1] != ogr.wkbNone and data[2] is not None: feat.SetGeometry(ogr.CreateGeometryFromWkt(data[2])) feat.SetField("id", i + 1) feat.SetField("str", "foo_\xc3\xa9") feat.SetField("smallint", -13) feat.SetField("int", 123) feat.SetField("float", 1.5) feat.SetField("real", 4.56) feat.SetField("adate", "2013/12/26 12:34:56") feat.SetField("guid", "{12345678-9abc-DEF0-1234-567890ABCDEF}") feat.SetField("xml", "") feat.SetFieldBinaryFromHexString("binary", "00FF7F") feat.SetFieldBinaryFromHexString("binary2", "123456") feat.SetField("smallint2", -32768) feat.SetField("float2", 1.5) lyr.CreateFeature(feat) for data in datalist: lyr = ds.GetLayerByName(data[0]) if data[1] != ogr.wkbNone: assert lyr.GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']) == 1 feat = lyr.GetNextFeature() if data[1] != ogr.wkbNone: try: expected_wkt = data[3] except IndexError: expected_wkt = data[2] if expected_wkt is None: if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail(data) elif ogrtest.check_feature_geometry(feat, expected_wkt) != 0: feat.DumpReadable() pytest.fail(data) if feat.GetField('id') != 1 or \ feat.GetField('smallint') != -13 or \ feat.GetField('int') != 123 or \ feat.GetField('float') != 1.5 or \ feat.GetField('real') != 4.56 or \ feat.GetField('adate') != "2013/12/26 12:34:56" or \ feat.GetField('guid') != "{12345678-9ABC-DEF0-1234-567890ABCDEF}" or \ feat.GetField('xml') != "" or \ feat.GetField('binary') != "00FF7F" or \ feat.GetField('binary2') != "123456" or \ feat.GetField('smallint2') != -32768: feat.DumpReadable() pytest.fail() sql_lyr = ds.ExecuteSQL("GetLayerDefinition %s" % lyr.GetName()) assert sql_lyr is not None feat = sql_lyr.GetNextFeature() assert feat is not None feat = sql_lyr.GetNextFeature() assert feat is None lyr.ResetReading() lyr.TestCapability("foo") ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("GetLayerMetadata %s" % lyr.GetName()) assert sql_lyr is not None feat = sql_lyr.GetNextFeature() assert feat is not None ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL("GetLayerDefinition foo") assert sql_lyr is None sql_lyr = ds.ExecuteSQL("GetLayerMetadata foo") assert sql_lyr is None ds = None ############################################################################### # Test DeleteField() def test_ogr_fgdb_DeleteField(): if ogrtest.fgdb_drv is None: pytest.skip() ds = ogr.Open("tmp/test.gdb", update=1) lyr = ds.GetLayerByIndex(0) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('smallint')).GetSubType() == ogr.OFSTInt16 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('smallint2')).GetSubType() == ogr.OFSTInt16 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('float')).GetSubType() == ogr.OFSTFloat32 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('float2')).GetSubType() == ogr.OFSTFloat32 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('smallint')).GetWidth() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('str')).GetWidth() == 0 assert lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('str')) == 0 # Needed since FileGDB v1.4, otherwise crash/error ... if True: # pylint: disable=using-constant-test ds = ogr.Open("tmp/test.gdb", update=1) lyr = ds.GetLayerByIndex(0) fld_defn = ogr.FieldDefn("str2", ogr.OFTString) fld_defn.SetWidth(80) lyr.CreateField(fld_defn) feat = lyr.GetNextFeature() feat.SetField("str2", "foo2_\xc3\xa9") lyr.SetFeature(feat) # Test updating non-existing feature feat.SetFID(-10) assert lyr.SetFeature(feat) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of SetFeature().' # Test deleting non-existing feature assert lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of DeleteFeature().' feat = None ds = None ds = ogr.Open("tmp/test.gdb") lyr = ds.GetLayerByIndex(0) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('str2')).GetWidth() == 80 assert lyr.GetLayerDefn().GetFieldIndex('str') == -1 feat = lyr.GetNextFeature() assert feat.GetFieldAsString("str2") == "foo2_\xc3\xa9" ds = None ############################################################################### # Run test_ogrsf def test_ogr_fgdb_2(): if ogrtest.fgdb_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/test.gdb --config OGR_SKIP OpenFileGDB') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run ogr2ogr def test_ogr_fgdb_3(): if ogrtest.fgdb_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: shutil.rmtree("tmp/poly.gdb") except OSError: pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f filegdb tmp/poly.gdb data/poly.shp -nlt MULTIPOLYGON -a_srs None') ds = ogr.Open('tmp/poly.gdb') assert not (ds is None or ds.GetLayerCount() == 0), 'ogr2ogr failed' ds = None if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/poly.gdb') # print ret assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test SQL support def test_ogr_fgdb_sql(): if ogrtest.fgdb_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() ds = ogr.Open('tmp/poly.gdb') ds.ExecuteSQL("CREATE INDEX idx_poly_eas_id ON poly(EAS_ID)") sql_lyr = ds.ExecuteSQL("SELECT * FROM POLY WHERE EAS_ID = 170", dialect='FileGDB') feat = sql_lyr.GetNextFeature() assert feat is not None feat = sql_lyr.GetNextFeature() assert feat is None feat = None ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test delete layer def test_ogr_fgdb_4(): if ogrtest.fgdb_drv is None: pytest.skip() for j in range(2): # Create a layer ds = ogr.Open("tmp/test.gdb", update=1) srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") lyr = ds.CreateLayer("layer_to_remove", geom_type=ogr.wkbPoint, srs=srs) lyr.CreateField(ogr.FieldDefn("str", ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(2 49)')) feat.SetField("str", "foo") feat = None lyr = None if j == 1: ds = None ds = ogr.Open("tmp/test.gdb", update=1) # Delete it for i in range(ds.GetLayerCount()): if ds.GetLayer(i).GetName() == 'layer_to_remove': ds.DeleteLayer(i) break # Check it no longer exists lyr = ds.GetLayerByName('layer_to_remove') ds = None assert lyr is None, ('failed at iteration %d' % j) ############################################################################### # Test DeleteDataSource() def test_ogr_fgdb_5(): if ogrtest.fgdb_drv is None: pytest.skip() assert ogrtest.fgdb_drv.DeleteDataSource("tmp/test.gdb") == 0, \ 'DeleteDataSource() failed' assert not os.path.exists("tmp/test.gdb") ############################################################################### # Test adding a layer to an existing feature dataset def test_ogr_fgdb_6(): if ogrtest.fgdb_drv is None: pytest.skip() srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') ds.CreateLayer('layer1', srs=srs, geom_type=ogr.wkbPoint, options=['FEATURE_DATASET=featuredataset']) ds.CreateLayer('layer2', srs=srs, geom_type=ogr.wkbPoint, options=['FEATURE_DATASET=featuredataset']) ds = None ds = ogr.Open('tmp/test.gdb') assert ds.GetLayerCount() == 2 ds = None ############################################################################### # Test bulk loading (#4420) def test_ogr_fgdb_7(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) gdal.SetConfigOption('FGDB_BULK_LOAD', 'YES') for i in range(1000): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, i) geom = ogr.CreateGeometryFromWkt('POINT(0 1)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField(0) == 0 ds = None gdal.SetConfigOption('FGDB_BULK_LOAD', None) ############################################################################### # Test field name laundering (#4458) def test_ogr_fgdb_8(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') lyr = ds.CreateLayer('test', srs=srs, geom_type=ogr.wkbPoint) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateField(ogr.FieldDefn('FROM', ogr.OFTInteger)) # reserved keyword lyr.CreateField(ogr.FieldDefn('1NUMBER', ogr.OFTInteger)) # starting with a number lyr.CreateField(ogr.FieldDefn('WITH SPACE AND !$*!- special characters', ogr.OFTInteger)) # unallowed characters lyr.CreateField(ogr.FieldDefn('A123456789012345678901234567890123456789012345678901234567890123', ogr.OFTInteger)) # 64 characters : ok lyr.CreateField(ogr.FieldDefn('A1234567890123456789012345678901234567890123456789012345678901234', ogr.OFTInteger)) # 65 characters : nok lyr.CreateField(ogr.FieldDefn('A12345678901234567890123456789012345678901234567890123456789012345', ogr.OFTInteger)) # 66 characters : nok gdal.PopErrorHandler() lyr_defn = lyr.GetLayerDefn() expected_names = ['FROM_', '_1NUMBER', 'WITH_SPACE_AND_______special_characters', 'A123456789012345678901234567890123456789012345678901234567890123', 'A1234567890123456789012345678901234567890123456789012345678901_1', 'A1234567890123456789012345678901234567890123456789012345678901_2'] for i in range(5): assert lyr_defn.GetFieldIndex(expected_names[i]) == i, \ ('did not find %s' % expected_names[i]) ############################################################################### # Test layer name laundering (#4466) def test_ogr_fgdb_9(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") _160char = 'A123456789' * 16 in_names = ['FROM', # reserved keyword '1NUMBER', # starting with a number 'WITH SPACE AND !$*!- special characters', # banned characters 'sde_foo', # reserved prefixes _160char, # OK _160char + 'A', # too long _160char + 'B', # still too long ] ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') gdal.PushErrorHandler('CPLQuietErrorHandler') for in_name in in_names: lyr = ds.CreateLayer(in_name, srs=srs, geom_type=ogr.wkbPoint) gdal.PopErrorHandler() lyr.GetLayerDefn() expected_names = ['FROM_', '_1NUMBER', 'WITH_SPACE_AND_______special_characters', '_sde_foo', _160char, _160char[0:158] + '_1', _160char[0:158] + '_2'] for i, exp_name in enumerate(expected_names): assert ds.GetLayerByIndex(i).GetName() == exp_name, ('did not find %s' % exp_name) ############################################################################### # Test SRS support def test_ogr_fgdb_10(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass srs_exact_4326 = osr.SpatialReference() srs_exact_4326.ImportFromEPSG(4326) srs_approx_4326 = srs_exact_4326.Clone() srs_approx_4326.MorphToESRI() srs_approx_4326.MorphFromESRI() srs_exact_2193 = osr.SpatialReference() srs_exact_2193.ImportFromEPSG(2193) srs_approx_2193 = srs_exact_2193.Clone() srs_approx_2193.MorphToESRI() srs_approx_2193.MorphFromESRI() srs_not_in_db = osr.SpatialReference("""PROJCS["foo", GEOGCS["foo", DATUM["foo", SPHEROID["foo",6000000,300]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",0], PARAMETER["scale_factor",1], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1]]""") srs_exact_4230 = osr.SpatialReference() srs_exact_4230.ImportFromEPSG(4230) srs_approx_4230 = srs_exact_4230.Clone() srs_approx_4230.MorphToESRI() srs_approx_4230.MorphFromESRI() srs_approx_intl = osr.SpatialReference() srs_approx_intl.ImportFromProj4('+proj=longlat +ellps=intl +no_defs') srs_exact_4233 = osr.SpatialReference() srs_exact_4233.ImportFromEPSG(4233) ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') lyr = ds.CreateLayer("srs_exact_4326", srs=srs_exact_4326, geom_type=ogr.wkbPoint) lyr = ds.CreateLayer("srs_approx_4326", srs=srs_approx_4326, geom_type=ogr.wkbPoint) lyr = ds.CreateLayer("srs_exact_2193", srs=srs_exact_2193, geom_type=ogr.wkbPoint) lyr = ds.CreateLayer("srs_approx_2193", srs=srs_approx_2193, geom_type=ogr.wkbPoint) lyr = ds.CreateLayer("srs_approx_4230", srs=srs_approx_4230, geom_type=ogr.wkbPoint) # will fail gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer("srs_approx_intl", srs=srs_approx_intl, geom_type=ogr.wkbPoint) gdal.PopErrorHandler() # will fail: 4233 doesn't exist in DB gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer("srs_exact_4233", srs=srs_exact_4233, geom_type=ogr.wkbPoint) gdal.PopErrorHandler() # will fail gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer("srs_not_in_db", srs=srs_not_in_db, geom_type=ogr.wkbPoint) gdal.PopErrorHandler() ds = None ds = ogr.Open('tmp/test.gdb') lyr = ds.GetLayerByName("srs_exact_4326") assert lyr.GetSpatialRef().ExportToWkt().find('4326') != -1 lyr = ds.GetLayerByName("srs_approx_4326") assert lyr.GetSpatialRef().ExportToWkt().find('4326') != -1 lyr = ds.GetLayerByName("srs_exact_2193") assert lyr.GetSpatialRef().ExportToWkt().find('2193') != -1 lyr = ds.GetLayerByName("srs_approx_2193") assert lyr.GetSpatialRef().ExportToWkt().find('2193') != -1 lyr = ds.GetLayerByName("srs_approx_4230") assert lyr.GetSpatialRef().ExportToWkt().find('4230') != -1 ds = None ############################################################################### # Test all data types def test_ogr_fgdb_11(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass f = open('data/test_filegdb_field_types.xml', 'rt') xml_def = f.read() f.close() ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') lyr = ds.CreateLayer("test", geom_type=ogr.wkbNone, options=['XML_DEFINITION=%s' % xml_def]) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField("esriFieldTypeSmallInteger", 12) feat.SetField("esriFieldTypeInteger", 3456) feat.SetField("esriFieldTypeSingle", 78.9) feat.SetField("esriFieldTypeDouble", 1.23) feat.SetField("esriFieldTypeDate", "2012/12/31 12:34:56") feat.SetField("esriFieldTypeString", "astr") feat.SetField("esriFieldTypeGlobalID", "{12345678-9ABC-DEF0-1234-567890ABCDEF}") # This is ignored and value is generated by FileGDB SDK itself feat.SetField("esriFieldTypeGUID", "{12345678-9abc-DEF0-1234-567890ABCDEF}") lyr.CreateFeature(feat) feat = None feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None # Create a esriFieldTypeGlobalID field lyr = ds.CreateLayer('test2', geom_type=ogr.wkbNone, options=['COLUMN_TYPES=global_id=esriFieldTypeGlobalID']) lyr.CreateField(ogr.FieldDefn('global_id', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('tmp/test.gdb') lyr = ds.GetLayerByName('test') feat = lyr.GetNextFeature() if feat.GetField('esriFieldTypeSmallInteger') != 12 or \ feat.GetField('esriFieldTypeInteger') != 3456 or \ abs(feat.GetField('esriFieldTypeSingle') - 78.9) > 1e-2 or \ feat.GetField('esriFieldTypeDouble') != 1.23 or \ feat.GetField('esriFieldTypeDate') != '2012/12/31 12:34:56' or \ feat.GetField('esriFieldTypeString') != 'astr' or \ feat.GetField('esriFieldTypeGUID') != '{12345678-9ABC-DEF0-1234-567890ABCDEF}' or \ (not feat.IsFieldSet('esriFieldTypeGlobalID')): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if not feat.IsFieldSet('esriFieldTypeGlobalID'): feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('test2') feat = lyr.GetNextFeature() if not feat.IsFieldSet('global_id'): feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test failed Open() def test_ogr_fgdb_12(): if ogrtest.fgdb_drv is None: pytest.skip() ds = ogr.Open('tmp/non_existing.gdb') assert ds is None gdal.Unlink('tmp/dummy.gdb') try: shutil.rmtree('tmp/dummy.gdb') except OSError: pass f = open('tmp/dummy.gdb', 'wb') f.close() ds = ogr.Open('tmp/dummy.gdb') assert ds is None os.unlink('tmp/dummy.gdb') os.mkdir('tmp/dummy.gdb') gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('tmp/dummy.gdb') gdal.PopErrorHandler() assert ds is None shutil.rmtree('tmp/dummy.gdb') ############################################################################### # Test failed CreateDataSource() and DeleteDataSource() def test_ogr_fgdb_13(): if ogrtest.fgdb_drv is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogrtest.fgdb_drv.CreateDataSource('tmp/foo') gdal.PopErrorHandler() assert ds is None f = open('tmp/dummy.gdb', 'wb') f.close() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogrtest.fgdb_drv.CreateDataSource('tmp/dummy.gdb') gdal.PopErrorHandler() assert ds is None os.unlink('tmp/dummy.gdb') try: shutil.rmtree("/nonexistingdir") except OSError: pass name = '/nonexistingdrive:/nonexistingdir/dummy.gdb' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogrtest.fgdb_drv.CreateDataSource(name) gdal.PopErrorHandler() assert ds is None gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ogrtest.fgdb_drv.DeleteDataSource(name) gdal.PopErrorHandler() assert ret != 0 ############################################################################### # Test interleaved opening and closing of databases (#4270) def test_ogr_fgdb_14(): if ogrtest.fgdb_drv is None: pytest.skip() for _ in range(3): ds1 = ogr.Open("tmp/test.gdb") assert ds1 is not None ds2 = ogr.Open("tmp/test.gdb") assert ds2 is not None ds2 = None ds1 = None ############################################################################### # Test opening a FGDB with both SRID and LatestSRID set (#5638) def test_ogr_fgdb_15(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree('tmp/test3005.gdb') except OSError: pass gdaltest.unzip('tmp', 'data/test3005.gdb.zip') ds = ogr.Open('tmp/test3005.gdb') lyr = ds.GetLayer(0) got_wkt = lyr.GetSpatialRef().ExportToWkt() sr = osr.SpatialReference() sr.ImportFromEPSG(3005) expected_wkt = sr.ExportToWkt() assert got_wkt == expected_wkt ds = None ############################################################################### # Test fix for #5674 def test_ogr_fgdb_16(): if ogrtest.fgdb_drv is None or ogrtest.openfilegdb_drv is None: pytest.skip() try: gdaltest.unzip('tmp/cache', 'data/ESSENCE_NAIPF_ORI_PROV_sub93.gdb.zip') except OSError: pass try: os.stat('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') except OSError: pytest.skip() ogrtest.fgdb_drv.Deregister() # Force FileGDB first ogrtest.fgdb_drv.Register() ogrtest.openfilegdb_drv.Register() ds = ogr.Open('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') if ds is None: ret = 'fail' else: ret = 'success' # Deregister OpenFileGDB again ogrtest.openfilegdb_drv.Deregister() shutil.rmtree('tmp/cache/ESSENCE_NAIPF_ORI_PROV_sub93.gdb') return ret ############################################################################### # Test not nullable fields def test_ogr_fgdb_17(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint, srs=sr, options=['GEOMETRY_NULLABLE=NO']) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) assert ret == 0 f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None ds = None ds = ogr.Open('tmp/test.gdb', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 ds = None ############################################################################### # Test default values def test_ogr_fgdb_18(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Register() ret = ogr_fgdb_18_test_results() if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Deregister() return ret def ogr_fgdb_18_test_results(): ds = ogr.Open('tmp/test.gdb', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" if ogrtest.openfilegdb_drv is not None: assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() != 'CURRENT_TIMESTAMP': # gdaltest.post_reason('fail') # return 'fail' # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() != "'2015/06/30 12:34:56'": # gdaltest.post_reason('fail') # print(lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault()) # return 'fail' f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56': f.DumpReadable() pytest.fail() ds = None ############################################################################### # Test transaction support def ogr_fgdb_19_open_update(filename): # We need the OpenFileGDB driver for Linux improved StartTransaction() bPerLayerCopyingForTransaction = False if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Register() if os.name != 'nt': val = gdal.GetConfigOption('FGDB_PER_LAYER_COPYING_TRANSACTION', 'TRUE') if val == 'TRUE' or val == 'YES' or val == 'ON': bPerLayerCopyingForTransaction = True ds = ogr.Open(filename, update=1) if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Deregister() ogrtest.fgdb_drv.Deregister() # Force OpenFileGDB first ogrtest.openfilegdb_drv.Register() ogrtest.fgdb_drv.Register() return (bPerLayerCopyingForTransaction, ds) def test_ogr_fgdb_19(): if ogrtest.fgdb_drv is None: pytest.skip() # FIXME likely due to too old FileGDB SDK on those targets # fails with ERROR 1: Failed to open Geodatabase (The system cannot find the file specified.) # File "ogr_fgdb.py", line 1664, in ogr_fgdb_19 # if ds.StartTransaction(force=True) != 0: if gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1604') or gdaltest.is_travis_branch('trusty_clang') or gdaltest.is_travis_branch('python3') or gdaltest.is_travis_branch('trunk_with_coverage'): pytest.skip() try: shutil.rmtree("tmp/test.gdb.ogrtmp") except OSError: pass try: shutil.rmtree("tmp/test.gdb.ogredited") except OSError: pass # Error case: try in read-only ds = ogr.Open('tmp/test.gdb') gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() assert ret != 0 ds = None (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') assert ds.TestCapability(ogr.ODsCEmulatedTransactions) == 1 # Error case: try in non-forced mode gdal.PushErrorHandler() ret = ds.StartTransaction(force=False) gdal.PopErrorHandler() assert ret != 0 # Error case: try StartTransaction() with a ExecuteSQL layer still active sql_lyr = ds.ExecuteSQL('SELECT * FROM test') gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() assert ret != 0 ds.ReleaseResultSet(sql_lyr) # Error case: call CommitTransaction() while there is no transaction gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() assert ret != 0 # Error case: call RollbackTransaction() while there is no transaction gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() assert ret != 0 # Error case: try StartTransaction() with another active connection ds2 = ogr.Open('tmp/test.gdb', update=1) gdal.PushErrorHandler() ret = ds2.StartTransaction(force=True) gdal.PopErrorHandler() assert ret != 0 ds2 = None # Successful StartTransaction() finally! lyr = ds.GetLayer(0) lyr = ds.GetLayer(0) # again old_count = lyr.GetFeatureCount() lyr_defn = lyr.GetLayerDefn() layer_created_before_transaction = ds.CreateLayer('layer_created_before_transaction', geom_type=ogr.wkbNone) layer_created_before_transaction_defn = layer_created_before_transaction.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 assert os.path.exists('tmp/test.gdb.ogredited') assert not os.path.exists('tmp/test.gdb.ogrtmp') ret = lyr.CreateField(ogr.FieldDefn('foobar', ogr.OFTString)) assert ret == 0 ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldIndex('foobar')) assert ret == 0 gdal.PushErrorHandler() ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foobar', ogr.wkbPoint)) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.ReorderFields([i for i in range(lyr.GetLayerDefn().GetFieldCount())]) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.AlterFieldDefn(0, ogr.FieldDefn('foo', ogr.OFTString), 0) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr_defn) f.SetField('field_string', 'foo') lyr.CreateFeature(f) lyr.SetFeature(f) fid = f.GetFID() assert fid > 0 lyr.ResetReading() for i in range(fid): f = lyr.GetNextFeature() assert f.GetFID() == fid and f.GetField('field_string') == 'foo' f = lyr.GetFeature(fid) assert f.GetFID() == fid and f.GetField('field_string') == 'foo' f = ogr.Feature(layer_created_before_transaction_defn) layer_created_before_transaction.CreateFeature(f) # Error case: call StartTransaction() while there is an active transaction gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() assert ret != 0 # Error case: try CommitTransaction() with a ExecuteSQL layer still active sql_lyr = ds.ExecuteSQL('SELECT * FROM test') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() assert ret != 0 ds.ReleaseResultSet(sql_lyr) # Error case: try RollbackTransaction() with a ExecuteSQL layer still active sql_lyr = ds.ExecuteSQL('SELECT * FROM test') gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() assert ret != 0 ds.ReleaseResultSet(sql_lyr) # Test that CommitTransaction() works assert ds.CommitTransaction() == 0 assert not os.path.exists('tmp/test.gdb.ogredited') assert not os.path.exists('tmp/test.gdb.ogrtmp') lst = gdal.ReadDir('tmp/test.gdb') for filename in lst: assert '.tmp' not in filename, lst lyr_tmp = ds.GetLayer(0) lyr_tmp = ds.GetLayer(0) new_count = lyr_tmp.GetFeatureCount() assert new_count == old_count + 1 old_count = new_count assert layer_created_before_transaction.GetFeatureCount() == 1 for i in range(ds.GetLayerCount()): if ds.GetLayer(i).GetName() == layer_created_before_transaction.GetName(): ds.DeleteLayer(i) break layer_created_before_transaction = None # Test suppression of layer within transaction lyr_count = ds.GetLayerCount() ds.CreateLayer('layer_tmp', geom_type=ogr.wkbNone) ret = ds.StartTransaction(force=True) assert ret == 0 ds.DeleteLayer(ds.GetLayerCount() - 1) assert ds.CommitTransaction() == 0 new_lyr_count = ds.GetLayerCount() assert new_lyr_count == lyr_count # Test that RollbackTransaction() works ret = ds.StartTransaction(force=True) assert ret == 0 f = ogr.Feature(lyr_defn) lyr.CreateFeature(f) layer_created_during_transaction = ds.CreateLayer('layer_created_during_transaction', geom_type=ogr.wkbNone) layer_created_during_transaction.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) assert ds.RollbackTransaction() == 0 assert not os.path.exists('tmp/test.gdb.ogredited') assert not os.path.exists('tmp/test.gdb.ogrtmp') assert lyr.GetFeatureCount() == old_count # Cannot retrieve the layer any more from fresh assert ds.GetLayerByName('layer_created_during_transaction') is None # Pointer is in ghost state assert layer_created_during_transaction.GetLayerDefn().GetFieldCount() == 0 # Simulate an error case where StartTransaction() cannot copy backup files lyr_count = ds.GetLayerCount() gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 assert ds.GetLayerCount() == lyr_count # Simulate an error case where StartTransaction() cannot reopen database gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') gdal.PushErrorHandler() ret = ds.StartTransaction(force=True) gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 assert ds.GetLayerCount() == 0 shutil.rmtree('tmp/test.gdb.ogredited') # Test method on ghost datasource and layer ds.GetName() ds.GetLayerCount() ds.GetLayer(0) ds.GetLayerByName("test") ds.DeleteLayer(0) ds.TestCapability('foo') ds.CreateLayer('bar', geom_type=ogr.wkbNone) ds.CopyLayer(lyr, 'baz') ds.GetStyleTable() # ds.SetStyleTableDirectly(None) ds.SetStyleTable(None) sql_lyr = ds.ExecuteSQL('SELECT * FROM test') ds.ReleaseResultSet(sql_lyr) ds.FlushCache() ds.GetMetadata() ds.GetMetadataItem('foo') ds.SetMetadata(None) ds.SetMetadataItem('foo', None) lyr.GetSpatialFilter() lyr.SetSpatialFilter(None) lyr.SetSpatialFilterRect(0, 0, 0, 0) lyr.SetSpatialFilter(0, None) lyr.SetSpatialFilterRect(0, 0, 0, 0, 0) lyr.SetAttributeFilter(None) lyr.ResetReading() lyr.GetNextFeature() lyr.SetNextByIndex(0) lyr.GetFeature(0) lyr.SetFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.DeleteFeature(0) lyr.GetName() lyr.GetGeomType() lyr.GetLayerDefn() lyr.GetSpatialRef() lyr.GetFeatureCount() lyr.GetExtent() lyr.GetExtent(0) lyr.TestCapability('foo') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.DeleteField(0) lyr.ReorderFields([i for i in range(lyr.GetLayerDefn().GetFieldCount())]) lyr.AlterFieldDefn(0, ogr.FieldDefn('foo', ogr.OFTString), 0) lyr.SyncToDisk() lyr.GetStyleTable() # lyr.SetStyleTableDirectly(None) lyr.SetStyleTable(None) lyr.StartTransaction() lyr.CommitTransaction() lyr.RollbackTransaction() lyr.SetIgnoredFields([]) lyr.GetMetadata() lyr.GetMetadataItem('foo') lyr.SetMetadata(None) lyr.SetMetadataItem('foo', None) ds = None if bPerLayerCopyingForTransaction: # Test an error case where we simulate a failure of destroying a # layer destroyed during transaction (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') layer_tmp = ds.CreateLayer('layer_tmp', geom_type=ogr.wkbNone) layer_tmp.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) assert ds.StartTransaction(force=True) == 0 ds.DeleteLayer(ds.GetLayerCount() - 1) gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None shutil.rmtree('tmp/test.gdb.ogredited') lst = gdal.ReadDir('tmp/test.gdb') for filename in lst: assert '.tmp' not in filename, lst # Test an error case where we simulate a failure in renaming # a file in original directory (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') for i in range(ds.GetLayerCount()): if ds.GetLayer(i).GetName() == 'layer_tmp': ds.DeleteLayer(i) break assert ds.StartTransaction(force=True) == 0 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() lyr.SetFeature(f) f = None gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None shutil.rmtree('tmp/test.gdb.ogredited') lst = gdal.ReadDir('tmp/test.gdb') for filename in lst: assert '.tmp' not in filename, lst # Test an error case where we simulate a failure in moving # a file into original directory (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') assert ds.StartTransaction(force=True) == 0 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() lyr.SetFeature(f) f = None gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE3') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None shutil.rmtree('tmp/test.gdb.ogredited') # Remove left over .tmp files lst = gdal.ReadDir('tmp/test.gdb') for filename in lst: if '.tmp' in filename: os.remove('tmp/test.gdb/' + filename) # Test not critical error in removing a temporary file for case in ('CASE4', 'CASE5'): (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') assert ds.StartTransaction(force=True) == 0 lyr = ds.GetLayer(0) f = lyr.GetNextFeature() lyr.SetFeature(f) f = None gdal.SetConfigOption('FGDB_SIMUL_FAIL', case) gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret == 0, case ds = None if case == 'CASE4': assert not os.path.exists('tmp/test.gdb.ogredited'), case else: shutil.rmtree('tmp/test.gdb.ogredited') # Remove left over .tmp files lst = gdal.ReadDir('tmp/test.gdb') for filename in lst: if '.tmp' in filename: os.remove('tmp/test.gdb/' + filename) else: # Test an error case where we simulate a failure of rename from .gdb to .gdb.ogrtmp during commit (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None # Test an error case where we simulate a failure of rename from .gdb.ogredited to .gdb during commit (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None os.rename('tmp/test.gdb.ogrtmp', 'tmp/test.gdb') # Test an error case where we simulate a failure of removing from .gdb.ogrtmp during commit (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE3') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret == 0 ds = None shutil.rmtree('tmp/test.gdb.ogrtmp') # Test an error case where we simulate a failure of reopening the committed DB (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE_REOPEN') gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 assert ds.GetLayerCount() == 0 ds = None # Test an error case where we simulate a failure of removing from .gdb.ogredited during rollback (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE1') gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 ds = None shutil.rmtree('tmp/test.gdb.ogredited') # Test an error case where we simulate a failure of reopening the rollbacked DB (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert ds.StartTransaction(force=True) == 0 gdal.SetConfigOption('FGDB_SIMUL_FAIL', 'CASE2') gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL', None) assert ret != 0 assert ds.GetLayerCount() == 0 ds = None if ogrtest.openfilegdb_drv is not None: ogrtest.openfilegdb_drv.Deregister() # Same, but retry without per-layer copying optimization (in the case # this was what was tested in previous step) def test_ogr_fgdb_19bis(): if ogrtest.fgdb_drv is None: pytest.skip() if gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1604') or gdaltest.is_travis_branch('trusty_clang') or gdaltest.is_travis_branch('python3') or gdaltest.is_travis_branch('trunk_with_coverage'): pytest.skip() (bPerLayerCopyingForTransaction, ds) = ogr_fgdb_19_open_update('tmp/test.gdb') del ds if not bPerLayerCopyingForTransaction: pytest.skip() gdal.SetConfigOption('FGDB_PER_LAYER_COPYING_TRANSACTION', 'FALSE') ret = test_ogr_fgdb_19() gdal.SetConfigOption('FGDB_PER_LAYER_COPYING_TRANSACTION', None) return ret ############################################################################### # Test CreateFeature() with user defined FID def test_ogr_fgdb_20(): if ogrtest.fgdb_drv is None: pytest.skip() if ogrtest.openfilegdb_drv is None: pytest.skip() if gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1604') or gdaltest.is_travis_branch('trusty_clang') or gdaltest.is_travis_branch('python3') or gdaltest.is_travis_branch('trunk_with_coverage'): pytest.skip() if not os.path.exists('tmp/test.gdb'): ds = ogrtest.fgdb_drv.CreateDataSource("tmp/test.gdb") ds = None # We need the OpenFileGDB driver for CreateFeature() with user defined FID ogrtest.openfilegdb_drv.Register() ds = ogr.Open('tmp/test.gdb', update=1) ogrtest.openfilegdb_drv.Deregister() ogrtest.fgdb_drv.Deregister() # Force OpenFileGDB first ogrtest.openfilegdb_drv.Register() ogrtest.fgdb_drv.Register() lyr = ds.CreateLayer('ogr_fgdb_20', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) ds.ExecuteSQL('CREATE INDEX ogr_fgdb_20_id ON ogr_fgdb_20(id)') f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('id', 1) ret = lyr.CreateFeature(f) assert ret == 0 and f.GetFID() == 1 and lyr.GetMetadataItem('1', 'MAP_OGR_FID_TO_FGDB_FID') is None # Existing FID gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 for invalid_fid in [-2, 0, 9876543210]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(invalid_fid) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0, invalid_fid f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(2) f.SetField('id', 2) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != 2 or lyr.GetMetadataItem('2', 'MAP_OGR_FID_TO_FGDB_FID') is not None: f.DumpReadable() pytest.fail() # OGR FID = 4, FileGDB FID = 3 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(4) f.SetField('id', 4) # Cannot call CreateFeature() with a set FID when a dataset is opened more than once ds2 = ogr.Open('tmp/test.gdb', update=1) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 ds2 = None ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != 4 or lyr.GetMetadataItem('4', 'MAP_OGR_FID_TO_FGDB_FID') != '3': f.DumpReadable() pytest.fail(lyr.GetMetadataItem('4', 'MAP_OGR_FID_TO_FGDB_FID')) # Cannot open geodatabase at the moment since it is in 'FID hack mode' gdal.PushErrorHandler() ds2 = ogr.Open('tmp/test.gdb', update=1) gdal.PopErrorHandler() assert ds2 is None ds2 = None # Existing FID, but only in OGR space gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 # This FID exists as a FGDB ID, but should not be user visible. f.SetFID(3) ret = lyr.SetFeature(f) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE ret = lyr.DeleteFeature(3) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE ret = lyr.GetFeature(3) assert ret is None # Trying to set OGR FID = 3 --> FileGDB FID = 4 f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(3) f.SetField('id', 3) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != 3 or lyr.GetMetadataItem('3', 'MAP_OGR_FID_TO_FGDB_FID') != '4': f.DumpReadable() pytest.fail() lyr.ResetReading() expected = [(1, None), (2, None), (4, 3), (3, 4)] for i in range(2): for (fid, fgdb_fid) in expected: if i == 0: f = lyr.GetNextFeature() else: f = lyr.GetFeature(fid) assert f is not None if f.GetFID() != fid or f.GetField('id') != fid: f.DumpReadable() pytest.fail(fid) got_fgdb_fid = lyr.GetMetadataItem(str(f.GetFID()), 'MAP_OGR_FID_TO_FGDB_FID') if got_fgdb_fid is None: assert fgdb_fid is None elif int(got_fgdb_fid) != fgdb_fid: print(fgdb_fid) pytest.fail(got_fgdb_fid) for fid in [-9876543210, 0, 100]: f = lyr.GetFeature(fid) if f is not None: f.DumpReadable() pytest.fail() for invalid_fid in [-2, 0, 9876543210]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(invalid_fid) ret = lyr.SetFeature(f) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE ret = lyr.DeleteFeature(invalid_fid) assert ret == ogr.OGRERR_NON_EXISTING_FEATURE f = lyr.GetFeature(3) f.SetField('str', '3') ret = lyr.SetFeature(f) assert ret == 0 f = lyr.GetFeature(3) assert f.GetField('str') == '3' ret = lyr.DeleteFeature(1) assert ret == 0 ret = lyr.DeleteFeature(3) assert ret == 0 for (fid, fgdb_fid) in [(3, 5), (2049, 6), (10, 7), (7, 8), (9, None), (8, 10), (12, 11)]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) f.SetField('id', fid) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != fid or str(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) != str(fgdb_fid): f.DumpReadable() print(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) pytest.fail(fid) # Normally 12 should be attributed, but it has already been reserved f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != 13: f.DumpReadable() pytest.fail() f.SetField('id', f.GetFID()) lyr.SetFeature(f) lyr.ResetReading() expected = [(2, None), (4, 3), (3, 5), (2049, 6), (10, 7), (7, 8), (9, None), (8, 10)] for (fid, fgdb_fid) in expected: f = lyr.GetNextFeature() assert f is not None if f.GetFID() != fid or f.GetField('id') != fid or str(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) != str(fgdb_fid): f.DumpReadable() print(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) pytest.fail(fid) lyr.SetAttributeFilter('id = 3') lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 3: f.DumpReadable() pytest.fail() # This will cause a resync of indexes lyr.SetAttributeFilter('OBJECTID = 3') lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 3: f.DumpReadable() pytest.fail() # No sparse pages lyr = ds.CreateLayer('ogr_fgdb_20_simple', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(2) f.SetField('id', 2) lyr.CreateFeature(f) # This will cause a resync of indexes sql_lyr = ds.ExecuteSQL('SELECT * FROM ogr_fgdb_20_simple') f = sql_lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() # Do not allow user set FID while a select layer is in progress f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(3) f.SetField('id', 3) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 ds.ReleaseResultSet(sql_lyr) # Do it in transaction, but this is completely orthogonal ds.StartTransaction(force=True) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(3) f.SetField('id', 3) lyr.CreateFeature(f) f = None ds.CommitTransaction() # Multi-page indexes srs = osr.SpatialReference() srs.ImportFromEPSG(32630) gdal.SetConfigOption('FGDB_RESYNC_THRESHOLD', '600') lyr = ds.CreateLayer('ogr_fgdb_20_indexes', geom_type=ogr.wkbPoint, srs=srs) gdal.SetConfigOption('FGDB_RESYNC_THRESHOLD', None) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) ds.ExecuteSQL('CREATE INDEX ogr_fgdb_20_indexes_id ON ogr_fgdb_20_indexes(id)') gdal.SetConfigOption('FGDB_BULK_LOAD', 'YES') for i in range(1000): f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(i + 2) f.SetField('id', i + 2) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (%d 0)' % i)) lyr.CreateFeature(f) gdal.SetConfigOption('FGDB_BULK_LOAD', None) ds = None # Check consistency after re-opening gdal.ErrorReset() for update in [0, 1]: ds = ogr.Open('tmp/test.gdb', update=update) lyr = ds.GetLayerByName('ogr_fgdb_20') assert lyr.GetFeatureCount() == 10 lyr.ResetReading() expected = [2, 3, 4, 7, 8, 9, 10, 12, 13, 2049] for fid in expected: f = lyr.GetNextFeature() assert gdal.GetLastErrorType() == 0 assert f is not None, fid if f.GetFID() != fid or f.GetField('id') != fid: f.DumpReadable() pytest.fail(fid) for fid in expected: lyr.SetAttributeFilter('id = %d' % fid) lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != fid or f.GetField('id') != fid: f.DumpReadable() pytest.fail(fid) lyr = ds.GetLayerByName('ogr_fgdb_20_simple') f = lyr.GetNextFeature() assert f.GetFID() == 2 f = lyr.GetNextFeature() assert f.GetFID() == 3 # Check attribute index lyr = ds.GetLayerByName('ogr_fgdb_20_indexes') for i in range(1000): fid = i + 2 lyr.SetAttributeFilter('id = %d' % fid) lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == fid # Check spatial index lyr.SetAttributeFilter(None) if update == 1: for i in range(1000): fid = i + 2 lyr.SetSpatialFilterRect(i - 0.01, -0.01, i + 0.01, 0.01) lyr.ResetReading() f = lyr.GetNextFeature() assert f.GetFID() == fid # Insert new features ds = ogr.Open('tmp/test.gdb', update=1) lyr = ds.GetLayerByName('ogr_fgdb_20') for (fid, fgdb_fid) in [(10000000, 2050), (10000001, 2051), (8191, 2052), (16384, 2053)]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) f.SetField('id', fid) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != fid or str(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) != str(fgdb_fid): f.DumpReadable() pytest.fail(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) ds = None # Insert a new intermediate FIDs for (fid, fgdb_fid) in [(1000000, 10000002), (1000001, 10000002)]: ds = ogr.Open('tmp/test.gdb', update=1) lyr = ds.GetLayerByName('ogr_fgdb_20') f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) f.SetField('id', fid) ret = lyr.CreateFeature(f) if ret != 0 or f.GetFID() != fid or lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID') != str(fgdb_fid): f.DumpReadable() pytest.fail(lyr.GetMetadataItem(str(fid), 'MAP_OGR_FID_TO_FGDB_FID')) ds = None # Check consistency after re-opening gdal.ErrorReset() for update in [0, 1]: ds = ogr.Open('tmp/test.gdb', update=update) lyr = ds.GetLayerByName('ogr_fgdb_20') assert lyr.GetFeatureCount() == 16 lyr.ResetReading() expected = [2, 3, 4, 7, 8, 9, 10, 12, 13, 2049, 8191, 16384, 1000000, 1000001, 10000000, 10000001] for fid in expected: f = lyr.GetNextFeature() assert gdal.GetLastErrorType() == 0 assert f is not None, fid if f.GetFID() != fid or f.GetField('id') != fid: f.DumpReadable() pytest.fail(fid) # Simulate different errors when database reopening is done # to sync ids for case in ('CASE1', 'CASE2', 'CASE3'): try: shutil.rmtree("tmp/test2.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource("tmp/test2.gdb") lyr = ds.CreateLayer('foo', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(2) f.SetField('id', 2) lyr.CreateFeature(f) gdal.PushErrorHandler() gdal.SetConfigOption('FGDB_SIMUL_FAIL_REOPEN', case) sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') gdal.SetConfigOption('FGDB_SIMUL_FAIL_REOPEN', None) gdal.PopErrorHandler() if case == 'CASE3': assert sql_lyr is not None, case ds.ReleaseResultSet(sql_lyr) else: assert sql_lyr is None, case # Everything will fail, but hopefully without crashing lyr.ResetReading() assert lyr.GetNextFeature() is None assert lyr.GetFeature(1) is None assert lyr.DeleteFeature(1) != 0 assert lyr.CreateFeature(f) != 0 assert lyr.SetFeature(f) != 0 if case != 'CASE3': assert ds.CreateLayer('bar', geom_type=ogr.wkbNone) is None assert ds.DeleteLayer(0) != 0 sql_lyr = ds.ExecuteSQL('SELECT * FROM foo') assert case == 'CASE3' or sql_lyr is None ds.ReleaseResultSet(sql_lyr) ds = None # sys.exit(0) ############################################################################### # Test M support def test_ogr_fgdb_21(): if ogrtest.fgdb_drv is None: pytest.skip() if not ogr_fgdb_is_sdk_1_4_or_later(): pytest.skip('SDK 1.4 required') # Fails on MULTIPOINT ZM if gdaltest.is_travis_branch('ubuntu_1804') or gdaltest.is_travis_branch('ubuntu_1604'): pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass ds = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') datalist = [["pointm", ogr.wkbPointM, "POINT M (1 2 3)"], ["pointzm", ogr.wkbPointM, "POINT ZM (1 2 3 4)"], ["multipointm", ogr.wkbMultiPointM, "MULTIPOINT M ((1 2 3),(4 5 6))"], ["multipointzm", ogr.wkbMultiPointZM, "MULTIPOINT ZM ((1 2 3 4),(5 6 7 8))"], ["linestringm", ogr.wkbLineStringM, "LINESTRING M (1 2 3,4 5 6)", "MULTILINESTRING M ((1 2 3,4 5 6))"], ["linestringzm", ogr.wkbLineStringZM, "LINESTRING ZM (1 2 3 4,5 6 7 8)", "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8))"], ["multilinestringm", ogr.wkbMultiLineStringM, "MULTILINESTRING M ((1 2 3,4 5 6))"], ["multilinestringzm", ogr.wkbMultiLineStringZM, "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8))"], ["polygonm", ogr.wkbPolygonM, "POLYGON M ((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1))", "MULTIPOLYGON M (((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)))"], ["polygonzm", ogr.wkbPolygonZM, "POLYGON ZM ((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1))", "MULTIPOLYGON ZM (((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1)))"], ["multipolygonm", ogr.wkbMultiPolygonM, "MULTIPOLYGON M (((0 0 1,0 1 2,1 1 3,1 0 4,0 0 1)))"], ["multipolygonzm", ogr.wkbMultiPolygonZM, "MULTIPOLYGON ZM (((0 0 1 -1,0 1 2 -2,1 1 3 -3,1 0 4 -4,0 0 1 -1)))"], ["empty_polygonm", ogr.wkbPolygonM, 'POLYGON M EMPTY', None], ] srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") for data in datalist: lyr = ds.CreateLayer(data[0], geom_type=data[1], srs=srs, options=[]) feat = ogr.Feature(lyr.GetLayerDefn()) # print(data[2]) feat.SetGeometry(ogr.CreateGeometryFromWkt(data[2])) lyr.CreateFeature(feat) ds = None ds = ogr.Open('tmp/test.gdb') for data in datalist: lyr = ds.GetLayerByName(data[0]) expected_geom_type = data[1] if expected_geom_type == ogr.wkbLineStringM: expected_geom_type = ogr.wkbMultiLineStringM elif expected_geom_type == ogr.wkbLineStringZM: expected_geom_type = ogr.wkbMultiLineStringZM elif expected_geom_type == ogr.wkbPolygonM: expected_geom_type = ogr.wkbMultiPolygonM elif expected_geom_type == ogr.wkbPolygonZM: expected_geom_type = ogr.wkbMultiPolygonZM assert lyr.GetGeomType() == expected_geom_type, data feat = lyr.GetNextFeature() try: expected_wkt = data[3] except IndexError: expected_wkt = data[2] if expected_wkt is None: if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail(data) elif ogrtest.check_feature_geometry(feat, expected_wkt) != 0: feat.DumpReadable() pytest.fail(data) ############################################################################### # Read curves def test_ogr_fgdb_22(): if ogrtest.fgdb_drv is None: pytest.skip() ds = ogr.Open('data/curves.gdb') lyr = ds.GetLayerByName('line') ds_ref = ogr.Open('data/curves_line.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) lyr = ds.GetLayerByName('polygon') ds_ref = ogr.Open('data/curves_polygon.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) ds = ogr.Open('data/curve_circle_by_center.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/curve_circle_by_center.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToWkt()) ############################################################################### # Test opening '.' def test_ogr_fgdb_23(): if ogrtest.fgdb_drv is None: pytest.skip() os.chdir('data/curves.gdb') ds = ogr.Open('.') os.chdir('../..') assert ds is not None ############################################################################### # Read polygons with M component where the M of the closing point is not the # one of the starting point (#7017) def test_ogr_fgdb_24(): if ogrtest.fgdb_drv is None: pytest.skip() ds = ogr.Open('data/filegdb_polygonzm_m_not_closing_with_curves.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/filegdb_polygonzm_m_not_closing_with_curves.gdb.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToIsoWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToIsoWkt()) ds = ogr.Open('data/filegdb_polygonzm_nan_m_with_curves.gdb') lyr = ds.GetLayer(0) ds_ref = ogr.Open('data/filegdb_polygonzm_nan_m_with_curves.gdb.csv') lyr_ref = ds_ref.GetLayer(0) for f in lyr: f_ref = lyr_ref.GetNextFeature() if ogrtest.check_feature_geometry(f, f_ref.GetGeometryRef()) != 0: print(f.GetGeometryRef().ExportToIsoWkt()) pytest.fail(f_ref.GetGeometryRef().ExportToIsoWkt()) ############################################################################### # Test selecting FID column with OGRSQL def test_ogr_fgdb_25(): if ogrtest.fgdb_drv is None: pytest.skip() ds = ogr.Open('data/curves.gdb') sql_lyr = ds.ExecuteSQL('SELECT OBJECTID FROM polygon WHERE OBJECTID = 2') assert sql_lyr is not None f = sql_lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() assert f is None ds.ReleaseResultSet(sql_lyr) lyr = ds.GetLayerByName('polygon') lyr.SetAttributeFilter('OBJECTID = 2') f = lyr.GetNextFeature() if f.GetFID() != 2: f.DumpReadable() pytest.fail() ############################################################################### # Test bugfix for https://github.com/OSGeo/gdal/issues/1369 # where a polygon with inner rings has its exterior ring with wrong orientation def test_ogr_fgdb_weird_winding_order(): if ogrtest.fgdb_drv is None: pytest.skip() if not ogr_fgdb_is_sdk_1_4_or_later(): pytest.skip('SDK 1.4 required') if not ogrtest.have_geos(): pytest.skip() try: shutil.rmtree('tmp/roads_clip Drawing.gdb') except OSError: pass gdaltest.unzip('tmp', 'data/weird_winding_order_fgdb.zip') ds = ogr.Open('tmp/roads_clip Drawing.gdb') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetGeometryCount() == 1 assert g.GetGeometryRef(0).GetGeometryCount() == 17 ############################################################################### # Cleanup def test_ogr_fgdb_cleanup(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass try: shutil.rmtree("tmp/test2.gdb") except OSError: pass try: shutil.rmtree("tmp/poly.gdb") except OSError: pass try: shutil.rmtree('tmp/test3005.gdb') except OSError: pass try: shutil.rmtree('tmp/roads_clip Drawing.gdb') except OSError: pass if ogrtest.openfilegdb_drv is not None: ogrtest.fgdb_drv.Deregister() # Force OpenFileGDB first ogrtest.openfilegdb_drv.Register() ogrtest.fgdb_drv.Register() gdalautotest-3.0.4/ogr/ogr_grass.py0000755003401500001440000000472413614005364016773 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_grass.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: GRASS Testing. # 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 ogr import gdaltest import pytest ############################################################################### # Test if GRASS driver is present def test_ogr_grass_1(): gdaltest.ogr_grass_drv = ogr.GetDriverByName('GRASS') if gdaltest.ogr_grass_drv is None: pytest.skip() ############################################################################### # Read 'point' datasource def test_ogr_grass_2(): if gdaltest.ogr_grass_drv is None: pytest.skip() ds = ogr.Open('./data/PERMANENT/vector/point/head') assert ds is not None, 'Cannot open datasource' lyr = ds.GetLayerByName('1') assert lyr is not None, 'Cannot find layer' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (0 0)' assert feat.GetFieldAsString('name') == 'my point' ds = None gdalautotest-3.0.4/ogr/ogr_gml_read.py0000755003401500001440000036725713614005364017443 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_gml_read.py f4c5ca7b31bb24a35776c77e33f0e7fc30a5e7f5 2019-06-29 23:31:46 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: GML Reading Driver testing. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2006, 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 gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test reading geometry and attribute from ionic wfs gml file. # def test_ogr_gml_1(): gdaltest.have_gml_reader = 0 gml_ds = ogr.Open('data/ionic_wfs.gml') if gml_ds is None: if gdal.GetLastErrorMsg().find('Xerces') != -1: pytest.skip() pytest.fail('failed to open test file.') gdaltest.have_gml_reader = 1 assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' lyr = gml_ds.GetLayerByName('GEM') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Aartselaar', 'Wrong name field value' wkt = 'POLYGON ((44038 511549,44015 511548,43994 511522,43941 511539,43844 511514,43754 511479,43685 511521,43594 511505,43619 511452,43645 511417,4363 511387,437 511346,43749 511298,43808 511229,43819 511205,4379 511185,43728 511167,43617 511175,43604 511151,43655 511125,43746 511143,43886 511154,43885 511178,43928 511186,43977 511217,4404 511223,44008 511229,44099 51131,44095 511335,44106 51135,44127 511379,44124 511435,44137 511455,44105 511467,44098 511484,44086 511499,4407 511506,44067 511535,44038 511549))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is None, 'got unexpected feature.' ############################################################################### # Do the same test somewhere without a .gfs file. def test_ogr_gml_2(): if not gdaltest.have_gml_reader: pytest.skip() # copy gml file (but not .gfs file) open('tmp/ionic_wfs.gml', 'w').write(open('data/ionic_wfs.gml').read()) gml_ds = ogr.Open('tmp/ionic_wfs.gml') assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' lyr = gml_ds.GetLayerByName('GEM') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Aartselaar', 'Wrong name field value' wkt = 'POLYGON ((44038 511549,44015 511548,43994 511522,43941 511539,43844 511514,43754 511479,43685 511521,43594 511505,43619 511452,43645 511417,4363 511387,437 511346,43749 511298,43808 511229,43819 511205,4379 511185,43728 511167,43617 511175,43604 511151,43655 511125,43746 511143,43886 511154,43885 511178,43928 511186,43977 511217,4404 511223,44008 511229,44099 51131,44095 511335,44106 51135,44127 511379,44124 511435,44137 511455,44105 511467,44098 511484,44086 511499,4407 511506,44067 511535,44038 511549))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is None, 'got unexpected feature.' ############################################################################### # Similar test for RNF style line data. def test_ogr_gml_3(): if not gdaltest.have_gml_reader: pytest.skip() gml_ds = ogr.Open('data/rnf_eg.gml') assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' lyr = gml_ds.GetLayerByName('RoadSegment') feat = lyr.GetNextFeature() assert feat.GetField('ngd_id') == 817792, 'Wrong ngd_id field value' assert feat.GetField('type') == 'HWY', 'Wrong type field value' wkt = 'LINESTRING (-63.500411040289066 46.240122507771368,-63.501009714909742 46.240344881690326,-63.502170462373471 46.241041855639622,-63.505862621395394 46.24195250605576,-63.506719184531178 46.242002742901576,-63.507197272602212 46.241931577811606,-63.508403092799554 46.241752283460158,-63.509946573455622 46.241745397977233)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is None, 'got unexpected feature.' ############################################################################### # Test of read GML file with UTF-8 BOM indicator. # Test also support for nested GML elements (#3680) def test_ogr_gml_4(): if not gdaltest.have_gml_reader: pytest.skip() gml_ds = ogr.Open('data/bom.gml') assert gml_ds.GetLayerCount() == 1, 'wrong number of layers' lyr = gml_ds.GetLayerByName('CartographicText') assert lyr.GetFeatureCount() == 3, 'wrong number of features' # Test 1st feature feat = lyr.GetNextFeature() assert feat.GetField('featureCode') == 10198, 'Wrong featureCode field value' assert feat.GetField('anchorPosition') == 8, 'Wrong anchorPosition field value' wkt = 'POINT (347243.85 461299.5)' assert not ogrtest.check_feature_geometry(feat, wkt) # Test 2nd feature feat = lyr.GetNextFeature() assert feat.GetField('featureCode') == 10069, 'Wrong featureCode field value' wkt = 'POINT (347251.45 461250.85)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Test of read GML file that triggeered bug #2349 def test_ogr_gml_5(): if not gdaltest.have_gml_reader: pytest.skip() gml_ds = ogr.Open('data/ticket_2349_test_1.gml') lyr = gml_ds.GetLayerByName('MyPolyline') lyr.SetAttributeFilter('height > 300') lyr.GetNextFeature() ############################################################################### # Test of various FIDs (various prefixes and lengths) (Ticket#1017) def test_ogr_gml_6(): if not gdaltest.have_gml_reader: pytest.skip() files = ['test_point1', 'test_point2', 'test_point3', 'test_point4'] fids = [] for filename in files: fids[:] = [] gml_ds = ogr.Open('data' + os.sep + filename + '.gml') lyr = gml_ds.GetLayer() feat = lyr.GetNextFeature() while feat is not None: if (feat.GetFID() < 0) or (feat.GetFID() in fids): gml_ds = None os.remove('data' + os.sep + filename + '.gfs') pytest.fail('Wrong FID value') fids.append(feat.GetFID()) feat = lyr.GetNextFeature() gml_ds = None os.remove('data' + os.sep + filename + '.gfs') ############################################################################### # Test of colon terminated prefixes for attribute values (Ticket#2493) def test_ogr_gml_7(): if not gdaltest.have_gml_reader: pytest.skip() gdal.SetConfigOption('GML_EXPOSE_FID', 'FALSE') gml_ds = ogr.Open('data/test_point.gml') gdal.SetConfigOption('GML_EXPOSE_FID', None) lyr = gml_ds.GetLayer() ldefn = lyr.GetLayerDefn() # Test fix for #2969 assert lyr.GetFeatureCount() == 5, 'Bad feature count' try: ldefn.GetFieldDefn(0).GetFieldTypeName except: pytest.skip() assert ldefn.GetFieldDefn(0).GetFieldTypeName(ldefn.GetFieldDefn(0).GetType()) == 'Real' assert ldefn.GetFieldDefn(1).GetFieldTypeName(ldefn.GetFieldDefn(1).GetType()) == 'Integer' assert ldefn.GetFieldDefn(2).GetFieldTypeName(ldefn.GetFieldDefn(2).GetType()) == 'String' ############################################################################### # Test a GML file with some non-ASCII UTF-8 content that triggered a bug (Ticket#2948) def test_ogr_gml_8(): if not gdaltest.have_gml_reader: pytest.skip() gml_ds = ogr.Open('data/utf8.gml') lyr = gml_ds.GetLayer() feat = lyr.GetNextFeature() if sys.version_info >= (3, 0, 0): assert feat.GetFieldAsString('name') == '\xc4\x80liamanu'.encode('latin1').decode('utf-8') else: assert feat.GetFieldAsString('name') == '\xc4\x80liamanu' ############################################################################### # Test writing invalid UTF-8 content in a GML file (ticket #2971) def test_ogr_gml_9(): if not gdaltest.have_gml_reader: pytest.skip() drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('tmp/broken_utf8.gml') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('test', ogr.OFTString)) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetFieldBinaryFromHexString('test', '80626164') # \x80bad' # Avoid the warning gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(dst_feat) gdal.PopErrorHandler() assert ret == 0, 'CreateFeature failed.' ds = None ds = ogr.Open('tmp/broken_utf8.gml') lyr = ds.GetLayerByName('test') feat = lyr.GetNextFeature() assert feat.GetField('test') == '?bad', 'Unexpected content.' ds = None os.remove('tmp/broken_utf8.gml') os.remove('tmp/broken_utf8.xsd') ############################################################################### # Test writing different data types in a GML file (ticket #2857) # TODO: Add test for other data types as they are added to the driver. def test_ogr_gml_10(): if not gdaltest.have_gml_reader: pytest.skip() drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('tmp/fields.gml') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('string', ogr.OFTString) field_defn.SetWidth(100) lyr.CreateField(field_defn) lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) field_defn = ogr.FieldDefn('real', ogr.OFTReal) field_defn.SetWidth(4) field_defn.SetPrecision(2) lyr.CreateField(field_defn) lyr.CreateField(ogr.FieldDefn('float', ogr.OFTReal)) field_defn = ogr.FieldDefn('integer', ogr.OFTInteger) field_defn.SetWidth(5) lyr.CreateField(field_defn) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('string', 'test string of length 24') dst_feat.SetField('date', '2003/04/22') dst_feat.SetField('real', 12.34) dst_feat.SetField('float', 1234.5678) dst_feat.SetField('integer', '1234') ret = lyr.CreateFeature(dst_feat) assert ret == 0, 'CreateFeature failed.' ds = None ds = ogr.Open('tmp/fields.gml') lyr = ds.GetLayerByName('test') feat = lyr.GetNextFeature() assert feat.GetFieldDefnRef(feat.GetFieldIndex('string')).GetType() == ogr.OFTString, \ ('String type is reported wrong. Got ' + str(feat.GetFieldDefnRef(feat.GetFieldIndex('string')).GetType())) assert feat.GetFieldDefnRef(feat.GetFieldIndex('date')).GetType() == ogr.OFTString, \ ('Date type is not reported as OFTString. Got ' + str(feat.GetFieldDefnRef(feat.GetFieldIndex('date')).GetType())) assert feat.GetFieldDefnRef(feat.GetFieldIndex('real')).GetType() == ogr.OFTReal, \ ('Real type is reported wrong. Got ' + str(feat.GetFieldDefnRef(feat.GetFieldIndex('real')).GetType())) assert feat.GetFieldDefnRef(feat.GetFieldIndex('float')).GetType() == ogr.OFTReal, \ ('Float type is not reported as OFTReal. Got ' + str(feat.GetFieldDefnRef(feat.GetFieldIndex('float')).GetType())) assert feat.GetFieldDefnRef(feat.GetFieldIndex('integer')).GetType() == ogr.OFTInteger, \ ('Integer type is reported wrong. Got ' + str(feat.GetFieldDefnRef(feat.GetFieldIndex('integer')).GetType())) assert feat.GetField('string') == 'test string of length 24', \ ('Unexpected string content.' + feat.GetField('string')) assert feat.GetField('date') == '2003/04/22', \ ('Unexpected string content.' + feat.GetField('date')) assert feat.GetFieldAsDouble('real') == 12.34, 'Unexpected real content.' assert feat.GetField('float') == 1234.5678, 'Unexpected float content.' assert feat.GetField('integer') == 1234, 'Unexpected integer content.' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('string')).GetWidth() == 100, \ 'Unexpected width of string field.' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('real')).GetWidth() == 4, \ 'Unexpected width of real field.' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('real')).GetPrecision() == 2, \ 'Unexpected precision of real field.' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('integer')).GetWidth() == 5, \ 'Unexpected width of integer field.' ds = None os.remove('tmp/fields.gml') os.remove('tmp/fields.xsd') ############################################################################### # Test reading a geometry element specified with def test_ogr_gml_11(): if not gdaltest.have_gml_reader: pytest.skip() # Make sure the .gfs file is more recent that the .gml one try: gml_mtime = os.stat('data/testgeometryelementpath.gml').st_mtime gfs_mtime = os.stat('data/testgeometryelementpath.gfs').st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: print('Touching .gfs file') f = open('data/testgeometryelementpath.gfs', 'rb+') data = f.read(1) f.seek(0, 0) f.write(data) f.close() ds = ogr.Open('data/testgeometryelementpath.gml') lyr = ds.GetLayer(0) assert lyr.GetGeometryColumn() == 'location1container|location1', \ 'did not get expected geometry column name' feat = lyr.GetNextFeature() assert feat.GetField('attrib1') == 'attrib1_value', \ 'did not get expected value for attrib1' assert feat.GetField('attrib2') == 'attrib2_value', \ 'did not get expected value for attrib2' geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (3 50)', 'did not get expected geometry' ds = None ############################################################################### # Test reading a virtual GML file def test_ogr_gml_12(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('/vsizip/data/testgeometryelementpath.zip/testgeometryelementpath.gml') lyr = ds.GetLayer(0) assert lyr.GetGeometryColumn() == 'location1container|location1', \ 'did not get expected geometry column name' feat = lyr.GetNextFeature() assert feat.GetField('attrib1') == 'attrib1_value', \ 'did not get expected value for attrib1' assert feat.GetField('attrib2') == 'attrib2_value', \ 'did not get expected value for attrib2' geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (3 50)', 'did not get expected geometry' ds = None ############################################################################### # Test reading GML with StringList, IntegerList and RealList fields def test_ogr_gml_13(): if not gdaltest.have_gml_reader: pytest.skip() for _ in range(2): ds = ogr.Open('data/testlistfields.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetFieldAsStringList(feat.GetFieldIndex('attrib1')) == ['value1', 'value2'], \ 'did not get expected value for attrib1' assert feat.GetField(feat.GetFieldIndex('attrib2')) == 'value3', \ 'did not get expected value for attrib2' assert feat.GetFieldAsIntegerList(feat.GetFieldIndex('attrib3')) == [4, 5], \ 'did not get expected value for attrib3' assert feat.GetFieldAsDoubleList(feat.GetFieldIndex('attrib4')) == [6.1, 7.1], \ 'did not get expected value for attrib4' ds = None gdal.Unlink('data/testlistfields.gfs') ############################################################################### # Test xlink resolution def test_ogr_gml_14(): if not gdaltest.have_gml_reader: pytest.skip() # We need CURL for xlink resolution, and a sign that Curl is available # is the availability of the WMS driver gdaltest.wms_drv = gdal.GetDriverByName('WMS') if gdaltest.wms_drv is None: pytest.skip() if gdaltest.gdalurlopen('http://download.osgeo.org/gdal/data/gml/xlink3.gml') is None: pytest.skip('cannot open URL') files = ['xlink1.gml', 'xlink2.gml', 'expected1.gml', 'expected2.gml'] for f in files: if not gdaltest.download_file('http://download.osgeo.org/gdal/data/gml/' + f, f): pytest.skip() gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', 'NONE') gdal.SetConfigOption('GML_SAVE_RESOLVED_TO', 'tmp/cache/xlink1resolved.gml') with gdaltest.error_handler(): gml_ds = ogr.Open('tmp/cache/xlink1.gml') gml_ds = None gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', 'gml:directedNode') gdal.SetConfigOption('GML_SAVE_RESOLVED_TO', 'tmp/cache/xlink2resolved.gml') gml_ds = ogr.Open('tmp/cache/xlink1.gml') del gml_ds gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) gdal.SetConfigOption('GML_SAVE_RESOLVED_TO', None) try: fp = open('tmp/cache/xlink1resolved.gml', 'r') text = fp.read() fp.close() os.remove('tmp/cache/xlink1resolved.gml') fp = open('tmp/cache/expected1.gml', 'r') expectedtext = fp.read() fp.close() except (IOError, OSError): pytest.fail() assert text == expectedtext, 'Problem with file 1' try: fp = open('tmp/cache/xlink2resolved.gml', 'r') text = fp.read() fp.close() os.remove('tmp/cache/xlink2resolved.gml') fp = open('tmp/cache/expected2.gml', 'r') expectedtext = fp.read() fp.close() except (IOError, OSError): pytest.fail() assert text == expectedtext, 'Problem with file 2' ############################################################################### # Run test_ogrsf def test_ogr_gml_15(): if not gdaltest.have_gml_reader: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test_point.gml') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Read CityGML generic attributes def test_ogr_gml_16(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/citygml.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('Name_') != 'aname' or \ feat.GetField('a_int_attr') != 2 or \ feat.GetField('a_double_attr') != 3.45: feat.DumpReadable() pytest.fail('did not get expected values') ############################################################################### # Read layer SRS for WFS 1.0.0 return def test_ogr_gml_17(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/gnis_pop_100.gml') lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert got_wkt.find('GEOGCS["WGS 84"') != -1, 'did not get expected SRS' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POINT (2.09 34.12)', 'did not get expected geometry' ############################################################################### # Read layer SRS for WFS 1.1.0 return def test_ogr_gml_18(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/gnis_pop_110.gml') lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert got_wkt.find('GEOGCS["WGS 84"') != -1, 'did not get expected SRS' assert sr.GetDataAxisToSRSAxisMapping() == [2, 1] feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POINT (2.09 34.12)', 'did not get expected geometry' ############################################################################### # Read layer SRS for WFS 1.1.0 return, but without trying to restore # (long, lat) order. So we should get EPSGA:4326 and (lat, long) order def test_ogr_gml_19(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('data/gnis_pop_110.gfs') except OSError: pass gdal.SetConfigOption('GML_INVERT_AXIS_ORDER_IF_LAT_LONG', 'NO') ds = ogr.Open('data/gnis_pop_110.gml') gdal.SetConfigOption('GML_INVERT_AXIS_ORDER_IF_LAT_LONG', None) lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert 'GEOGCS["WGS 84"' in got_wkt, \ 'did not get expected SRS' assert sr.GetDataAxisToSRSAxisMapping() == [1, 2] feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POINT (34.12 2.09)', 'did not get expected geometry' ############################################################################### # Test parsing a .xsd where the type definition is before its reference def test_ogr_gml_20(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('data/archsites.gfs') except OSError: pass ds = ogr.Open('data/archsites.gml') lyr = ds.GetLayer(0) ldefn = lyr.GetLayerDefn() try: ldefn.GetFieldDefn(0).GetFieldTypeName except: pytest.skip() idx = ldefn.GetFieldIndex("gml_id") assert idx != -1, 'did not get expected column "gml_id"' idx = ldefn.GetFieldIndex("cat") fddefn = ldefn.GetFieldDefn(idx) assert fddefn.GetFieldTypeName(fddefn.GetType()) == 'Integer64', \ 'did not get expected column type for col "cat"' idx = ldefn.GetFieldIndex("str1") fddefn = ldefn.GetFieldDefn(idx) assert fddefn.GetFieldTypeName(fddefn.GetType()) == 'String', \ 'did not get expected column type for col "str1"' assert lyr.GetGeometryColumn() == 'the_geom', \ 'did not get expected geometry column name' assert ldefn.GetGeomType() == ogr.wkbPoint, 'did not get expected geometry type' ds = None try: os.stat('data/archsites.gfs') pytest.fail('did not expected .gfs -> XSD parsing failed') except OSError: return ############################################################################### # Test writing GML3 def test_ogr_gml_21(frmt='GML3'): if not gdaltest.have_gml_reader: pytest.skip() # Create GML3 file sr = osr.SpatialReference() sr.ImportFromEPSG(4326) for filename in ['tmp/gml_21.gml', 'tmp/gml_21.xsd', 'tmp/gml_21.gfs']: try: os.remove(filename) except OSError: pass ds = ogr.GetDriverByName('GML').CreateDataSource('tmp/gml_21.gml', options=['FORMAT=' + frmt]) lyr = ds.CreateLayer('firstlayer', srs=sr) lyr.CreateField(ogr.FieldDefn('string_field', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (2 49)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo') geom = ogr.CreateGeometryFromWkt('POINT (3 48)') feat.SetGeometry(geom) lyr.CreateFeature(feat) ds = None # Reopen the file ds = ogr.Open('tmp/gml_21.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49)', \ 'did not get expected geometry' ds = None # Test that .gml and .xsd are identical to what is expected f1 = open('tmp/gml_21.gml', 'rt') if frmt == 'GML3.2': f2 = open('data/expected_gml_gml32.gml', 'rt') else: f2 = open('data/expected_gml_21.gml', 'rt') line1 = f1.readline() line2 = f2.readline() while line1 != '': line1 = line1.strip() line2 = line2.strip() if line1 != line2: print(open('tmp/gml_21.gml', 'rt').read()) pytest.fail('.gml file not identical to expected') line1 = f1.readline() line2 = f2.readline() f1.close() f2.close() f1 = open('tmp/gml_21.xsd', 'rt') if frmt == 'GML3': f2 = open('data/expected_gml_21.xsd', 'rt') elif frmt == 'GML3.2': f2 = open('data/expected_gml_gml32.xsd', 'rt') else: f2 = open('data/expected_gml_21_deegree3.xsd', 'rt') line1 = f1.readline() line2 = f2.readline() while line1 != '': line1 = line1.strip() line2 = line2.strip() if line1 != line2: print(open('tmp/gml_21.xsd', 'rt').read()) pytest.fail('.xsd file not identical to expected') line1 = f1.readline() line2 = f2.readline() f1.close() f2.close() def test_ogr_gml_21_deegree3(): return test_ogr_gml_21('GML3Deegree') def test_ogr_gml_21_gml32(): return test_ogr_gml_21('GML3.2') ############################################################################### # Read a OpenLS DetermineRouteResponse document def test_ogr_gml_22(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/paris_typical_strike_demonstration.xml') lyr = ds.GetLayerByName('RouteGeometry') assert lyr is not None, 'cannot find RouteGeometry' lyr = ds.GetLayerByName('RouteInstruction') assert lyr is not None, 'cannot find RouteInstruction' count = lyr.GetFeatureCount() assert count == 9, 'did not get expected feature count' ds = None ############################################################################### # Test that use SRS defined in global gml:Envelope if no SRS is set for any # feature geometry def test_ogr_gml_23(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('tmp/global_geometry.gfs') except OSError: pass shutil.copy('data/global_geometry.xml', 'tmp/global_geometry.xml') # Here we use only the .xml file ds = ogr.Open('tmp/global_geometry.xml') lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert 'GEOGCS["WGS 84"' in got_wkt, \ 'did not get expected SRS' assert lyr.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POINT (2 49)', 'did not get expected geometry' extent = lyr.GetExtent() assert extent == (2.0, 3.0, 49.0, 50.0), 'did not get expected layer extent' ############################################################################### # Test that use SRS defined in global gml:Envelope if no SRS is set for any # feature geometry def test_ogr_gml_24(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('data/global_geometry.gfs') except OSError: pass # Here we use only the .xml file and the .xsd file ds = ogr.Open('data/global_geometry.xml') lyr = ds.GetLayer(0) # Because we read the .xsd, we (currently) don't find the SRS # sr = lyr.GetSpatialRef() # got_wkt = sr.ExportToWkt() # if got_wkt.find('GEOGCS["WGS 84"') == -1 or \ # got_wkt.find('AXIS["Latitude",NORTH],AXIS["Longitude",EAST]') != -1: # gdaltest.post_reason('did not get expected SRS') # print(got_wkt) # return 'fail' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POINT (2 49)', 'did not get expected geometry' extent = lyr.GetExtent() assert extent == (2.0, 3.0, 49.0, 50.0), 'did not get expected layer extent' ############################################################################### # Test fixes for #3934 and #3935 def test_ogr_gml_25(): if not gdaltest.have_gml_reader: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') try: os.remove('data/curveProperty.gfs') except OSError: pass gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', 'YES') ds = ogr.Open('data/curveProperty.xml') gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', None) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POLYGON ((14 21,6 21,6 9,14 9,22 9,22 21,14 21))', \ 'did not get expected geometry' ############################################################################### # Test writing and reading 3D geoms (GML2) def test_ogr_gml_26(): if not gdaltest.have_gml_reader: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/ogr_gml_26.gml data/poly.shp -zfield eas_id') f = open('tmp/ogr_gml_26.gml', 'rt') content = f.read() f.close() assert content.find("478315.531254762880.5158") != -1 ds = ogr.Open('tmp/ogr_gml_26.gml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPolygon25D ds = None ############################################################################### # Test writing and reading 3D geoms (GML3) def test_ogr_gml_27(): if not gdaltest.have_gml_reader: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/ogr_gml_27.gml data/poly.shp -zfield eas_id -dsco FORMAT=GML3') f = open('tmp/ogr_gml_27.gml', 'rt') content = f.read() f.close() assert content.find("478315.53125 4762880.5 158") != -1 ds = ogr.Open('tmp/ogr_gml_27.gml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPolygon25D ds = None ############################################################################### # Test writing and reading layers of type wkbNone (#4154) def test_ogr_gml_28(): if not gdaltest.have_gml_reader: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/ogr_gml_28.gml data/idlink.dbf') # Try with .xsd ds = ogr.Open('tmp/ogr_gml_28.gml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone ds = None os.unlink('tmp/ogr_gml_28.xsd') ds = ogr.Open('tmp/ogr_gml_28.gml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone ds = None # Try with .gfs ds = ogr.Open('tmp/ogr_gml_28.gml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbNone ds = None ############################################################################### # Test reading FME GMLs def test_ogr_gml_29(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/testfmegml.gml') expected_results = [[ogr.wkbMultiPoint, 'MULTIPOINT (2 49)'], [ogr.wkbMultiPolygon, 'MULTIPOLYGON (((2 49,3 49,3 50,2 50,2 49)))'], [ogr.wkbMultiLineString, 'MULTILINESTRING ((2 49,3 50))'], ] for j, expected_result in enumerate(expected_results): lyr = ds.GetLayer(j) assert lyr.GetGeomType() == expected_result[0], \ ('layer %d, did not get expected layer geometry type' % j) for _ in range(2): feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == expected_result[1], \ ('layer %d, did not get expected geometry' % j) ds = None ############################################################################### # Test reading a big field and a big geometry def test_ogr_gml_30(): if not gdaltest.have_gml_reader: pytest.skip() field1 = " " for _ in range(11): field1 = field1 + field1 geom = "0 1 " * 512 data = """ %s A%sZ """ % (geom, field1) f = gdal.VSIFOpenL("/vsimem/ogr_gml_30.gml", "wb") gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = ogr.Open("/vsimem/ogr_gml_30.gml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() field1 = feat.GetField(0) geom_wkt = feat.GetGeometryRef().ExportToWkt() ds = None gdal.Unlink("/vsimem/ogr_gml_30.gml") gdal.Unlink("/vsimem/ogr_gml_30.gfs") assert len(field1) == 2050, 'did not get expected len(field1)' assert len(geom_wkt) == 2060, 'did not get expected len(geom_wkt)' ############################################################################### # Test SEQUENTIAL_LAYERS def test_ogr_gml_31(): if not gdaltest.have_gml_reader: pytest.skip() gdal.SetConfigOption('GML_READ_MODE', 'SEQUENTIAL_LAYERS') test_ogr_gml_29() gdal.SetConfigOption('GML_READ_MODE', None) # Test reading second layer and then first layer gdal.SetConfigOption('GML_READ_MODE', 'SEQUENTIAL_LAYERS') ds = ogr.Open('data/testfmegml.gml') gdal.SetConfigOption('GML_READ_MODE', None) lyr = ds.GetLayer(1) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() assert feat.GetFID() == 1, 'did not get feature when reading directly second layer' lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() assert feat.GetFID() == 1, 'did not get feature when reading back first layer' ############################################################################### # Test SEQUENTIAL_LAYERS without a .gfs def test_ogr_gml_32(): if not gdaltest.have_gml_reader: pytest.skip() # Test without .xsd or .gfs f = gdal.VSIFOpenL("data/testfmegml.gml", "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) f = gdal.VSIFOpenL("/vsimem/ogr_gml_31.gml", "wb") gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_gml_31.gml') lyr = ds.GetLayer(1) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() assert feat.GetFID() == 1, 'did not get feature when reading directly second layer' ds = None f = gdal.VSIFOpenL("/vsimem/ogr_gml_31.gfs", "rb") data = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) data = str(data) assert data.find("true") != -1, \ 'did not find true in .gfs' gdal.Unlink("/vsimem/ogr_gml_31.gml") gdal.Unlink("/vsimem/ogr_gml_31.gfs") ############################################################################### # Test INTERLEAVED_LAYERS def test_ogr_gml_33(): if not gdaltest.have_gml_reader: pytest.skip() # Test reading second layer and then first layer gdal.SetConfigOption('GML_READ_MODE', 'INTERLEAVED_LAYERS') ds = ogr.Open('data/testfmegml_interleaved.gml') gdal.SetConfigOption('GML_READ_MODE', None) read_sequence = [[0, 1], [0, None], [1, 3], [2, 5], [2, None], [0, 2], [1, 4], [1, None], [2, 6], [2, None], [0, None], [1, None], [2, None]] for i, read_seq in enumerate(read_sequence): lyr = ds.GetLayer(read_seq[0]) feat = lyr.GetNextFeature() if feat is None: fid = None else: fid = feat.GetFID() expected_fid = read_seq[1] assert fid == expected_fid, ('failed at step %d' % i) ############################################################################### # Test writing non-ASCII UTF-8 content (#4117, #4299) def test_ogr_gml_34(): if not gdaltest.have_gml_reader: pytest.skip() drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('/vsimem/ogr_gml_34.gml') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn("name", ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '\xc4\x80liamanu<&') lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('/vsimem/ogr_gml_34.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetFieldAsString('name') == '\xc4\x80liamanu<&' ds = None gdal.Unlink('/vsimem/ogr_gml_34.gml') gdal.Unlink('/vsimem/ogr_gml_34.xsd') ############################################################################### # Test GML_SKIP_RESOLVE_ELEMS=HUGE (#4380) def test_ogr_gml_35(): if not gdaltest.have_gml_reader: pytest.skip() if ogr.GetDriverByName('SQLite') is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.remove('tmp/GmlTopo-sample.sqlite') except OSError: pass try: os.remove('tmp/GmlTopo-sample.gfs') except OSError: pass try: os.remove('tmp/GmlTopo-sample.resolved.gml') except OSError: pass shutil.copy('data/GmlTopo-sample.xml', 'tmp/GmlTopo-sample.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', 'HUGE') ds = ogr.Open('tmp/GmlTopo-sample.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) assert not os.path.exists('tmp/GmlTopo-sample.sqlite') assert gdal.GetLastErrorMsg() == '', 'did not expect error' assert ds.GetLayerCount() == 3, ('expected 3 layers, got %d' % ds.GetLayerCount()) lyr = ds.GetLayerByName('Suolo') feat = lyr.GetNextFeature() wkt = 'MULTIPOLYGON (((-0.1 0.6,-0.0 0.7,0.2 0.7,0.3 0.6,0.5 0.6,0.5 0.8,0.7 0.8,0.8 0.6,0.9 0.6,0.9 0.4,0.7 0.3,0.7 0.2,0.9 0.1,0.9 -0.1,0.6 -0.2,0.3 -0.2,0.2 -0.2,-0.1 0.0,-0.1 0.1,-0.1 0.2,0.1 0.3,0.1 0.4,-0.0 0.4,-0.1 0.5,-0.1 0.6)))' assert not ogrtest.check_feature_geometry(feat, wkt), feat.GetGeometryRef() ds = None ds = ogr.Open('tmp/GmlTopo-sample.xml') lyr = ds.GetLayerByName('Suolo') feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, wkt), feat.GetGeometryRef() ds = None ############################################################################### # Test GML_SKIP_RESOLVE_ELEMS=NONE (and new GMLTopoSurface interpretation) def test_ogr_gml_36(GML_FACE_HOLE_NEGATIVE='NO'): if not gdaltest.have_gml_reader: pytest.skip() if GML_FACE_HOLE_NEGATIVE == 'NO': if not ogrtest.have_geos(): pytest.skip() try: os.remove('tmp/GmlTopo-sample.gfs') except OSError: pass try: os.remove('tmp/GmlTopo-sample.resolved.gml') except OSError: pass shutil.copy('data/GmlTopo-sample.xml', 'tmp/GmlTopo-sample.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', 'NONE') gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', GML_FACE_HOLE_NEGATIVE) ds = ogr.Open('tmp/GmlTopo-sample.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', None) assert gdal.GetLastErrorMsg() == '', 'did not expect error' lyr = ds.GetLayerByName('Suolo') feat = lyr.GetNextFeature() if GML_FACE_HOLE_NEGATIVE == 'NO': wkt = 'MULTIPOLYGON (((-0.1 0.6,-0.0 0.7,0.2 0.7,0.3 0.6,0.5 0.6,0.5 0.8,0.7 0.8,0.8 0.6,0.9 0.6,0.9 0.4,0.7 0.3,0.7 0.2,0.9 0.1,0.9 -0.1,0.6 -0.2,0.3 -0.2,0.2 -0.2,-0.1 0.0,-0.1 0.1,-0.1 0.2,0.1 0.3,0.1 0.4,-0.0 0.4,-0.1 0.5,-0.1 0.6)))' else: wkt = 'POLYGON ((-0.1 0.6,-0.0 0.7,0.2 0.7,0.3 0.6,0.5 0.6,0.5 0.8,0.7 0.8,0.8 0.6,0.9 0.6,0.9 0.4,0.7 0.3,0.7 0.2,0.9 0.1,0.9 -0.1,0.6 -0.2,0.3 -0.2,0.2 -0.2,-0.1 0.0,-0.1 0.1,-0.1 0.2,0.1 0.3,0.1 0.4,-0.0 0.4,-0.1 0.5,-0.1 0.6),(0.2 0.2,0.2 0.4,0.4 0.4,0.5 0.2,0.5 0.1,0.5 0.0,0.2 0.0,0.2 0.2),(0.6 0.1,0.8 0.1,0.8 -0.1,0.6 -0.1,0.6 0.1))' assert not ogrtest.check_feature_geometry(feat, wkt), feat.GetGeometryRef() ds = None gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', GML_FACE_HOLE_NEGATIVE) ds = ogr.Open('tmp/GmlTopo-sample.xml') gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', None) lyr = ds.GetLayerByName('Suolo') feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, wkt), feat.GetGeometryRef() ds = None ############################################################################### # Test GML_SKIP_RESOLVE_ELEMS=NONE with old GMLTopoSurface interpretation def test_ogr_gml_37(): return test_ogr_gml_36('YES') ############################################################################### # Test new GMLTopoSurface interpretation (#3934) with HUGE xlink resolver def test_ogr_gml_38(resolver='HUGE'): if not gdaltest.have_gml_reader: pytest.skip() if resolver == 'HUGE': if ogr.GetDriverByName('SQLite') is None: pytest.skip() if not ogrtest.have_geos(): pytest.skip() try: os.remove('tmp/sample_gml_face_hole_negative_no.sqlite') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.gfs') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.resolved.gml') except OSError: pass shutil.copy('data/sample_gml_face_hole_negative_no.xml', 'tmp/sample_gml_face_hole_negative_no.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', resolver) ds = ogr.Open('tmp/sample_gml_face_hole_negative_no.xml') gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) gdal.SetConfigOption('GML_FACE_HOLE_NEGATIVE', None) if resolver == 'HUGE': assert not os.path.exists('tmp/sample_gml_face_hole_negative_no.sqlite') assert gdal.GetLastErrorMsg() == '', 'did not expect error' lyr = ds.GetLayerByName('Suolo') feat = lyr.GetNextFeature() wkt = 'MULTIPOLYGON (((0.9 0.6,0.9 0.4,0.7 0.3,0.7 0.2,0.9 0.1,0.9 -0.1,0.6 -0.2,0.3 -0.2,0.2 -0.2,-0.1 0.0,-0.1 0.1,-0.1 0.2,0.1 0.3,0.1 0.4,-0.0 0.4,-0.1 0.5,-0.1 0.6,-0.0 0.7,0.2 0.7,0.3 0.6,0.5 0.6,0.5 0.8,0.7 0.8,0.8 0.6,0.9 0.6),(0.6 0.1,0.6 -0.1,0.8 -0.1,0.8 0.1,0.6 0.1),(0.2 0.4,0.2 0.2,0.2 0.0,0.5 0.0,0.5 0.1,0.5 0.2,0.4 0.4,0.2 0.4)))' assert not ogrtest.check_feature_geometry(feat, wkt), feat.GetGeometryRef() ds = None ############################################################################### # Test new GMLTopoSurface interpretation (#3934) with standard xlink resolver def test_ogr_gml_39(): return test_ogr_gml_38('NONE') ############################################################################### # Test parsing XSD where simpleTypes not inlined, but defined elsewhere in the .xsd (#4328) def test_ogr_gml_40(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/testLookForSimpleType.xml') lyr = ds.GetLayer(0) fld_defn = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('CITYNAME')) assert fld_defn.GetWidth() == 26 ############################################################################### # Test validating against .xsd def test_ogr_gml_41(): gdaltest.have_gml_validation = False if not gdaltest.have_gml_reader: pytest.skip() if not gdaltest.download_file('http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip', 'SCHEMAS_OPENGIS_NET.zip'): pytest.skip() ds = ogr.Open('data/expected_gml_21.gml') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', '/vsizip/./tmp/cache/SCHEMAS_OPENGIS_NET.zip') lyr = ds.ExecuteSQL('SELECT ValidateSchema()') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) feat = lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) feat = None ds.ReleaseResultSet(lyr) if val == 0: assert gdal.GetLastErrorMsg().find('not implemented due to missing libxml2 support') != -1 pytest.skip() gdaltest.have_gml_validation = True ############################################################################### # Test validating against .xsd def test_ogr_gml_42(): if not gdaltest.have_gml_validation: pytest.skip() try: os.mkdir('tmp/cache/SCHEMAS_OPENGIS_NET') except OSError: pass try: os.stat('tmp/cache/SCHEMAS_OPENGIS_NET/gml') except OSError: gdaltest.unzip('tmp/cache/SCHEMAS_OPENGIS_NET', 'tmp/cache/SCHEMAS_OPENGIS_NET.zip') ds = ogr.Open('data/expected_gml_gml32.gml') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', './tmp/cache/SCHEMAS_OPENGIS_NET') lyr = ds.ExecuteSQL('SELECT ValidateSchema()') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) feat = lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) feat = None ds.ReleaseResultSet(lyr) assert val != 0 ############################################################################### # Test automated downloading of WFS schema def test_ogr_gml_43(): # The service times out pytest.skip() # pylint: disable=unreachable if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/wfs_typefeature.gml') assert ds is not None ds = None try: os.stat('data/wfs_typefeature.gfs') gfs_found = True except OSError: gfs_found = False if gfs_found: if gdaltest.gdalurlopen('http://testing.deegree.org:80/deegree-wfs/services?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=app:Springs&NAMESPACE=xmlns(app=http://www.deegree.org/app)') is None: can_download_schema = False else: can_download_schema = gdal.GetDriverByName('HTTP') is not None assert not can_download_schema, '.gfs found, but schema could be downloaded' ############################################################################### # Test providing a custom XSD filename def test_ogr_gml_44(): if not gdaltest.have_gml_reader: pytest.skip() xsd_content = """ """ gdal.FileFromMemBuffer('/vsimem/ogr_gml_44.xsd', xsd_content) ds = ogr.Open('data/test_point.gml,xsd=/vsimem/ogr_gml_44.xsd') lyr = ds.GetLayer(0) # fid and dbl assert lyr.GetLayerDefn().GetFieldCount() == 2 ds = None gdal.Unlink('/vsimem/ogr_gml_44.xsd') ############################################################################### # Test PREFIX and TARGET_NAMESPACE creation options def test_ogr_gml_45(): if not gdaltest.have_gml_reader: pytest.skip() drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('/vsimem/ogr_gml_45.gml', options=['PREFIX=foo', 'TARGET_NAMESPACE=http://bar/']) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('dbl', ogr.OFTReal)) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('str', 'str') dst_feat.SetField('int', 1) dst_feat.SetField('dbl', 2.34) lyr.CreateFeature(dst_feat) dst_feat = None ds = None if not gdaltest.have_gml_validation: gdal.Unlink('/vsimem/ogr_gml_45.gml') gdal.Unlink('/vsimem/ogr_gml_45.xsd') pytest.skip() # Validate document ds = ogr.Open('/vsimem/ogr_gml_45.gml') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', './tmp/cache/SCHEMAS_OPENGIS_NET') lyr = ds.ExecuteSQL('SELECT ValidateSchema()') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) feat = lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) feat = None ds.ReleaseResultSet(lyr) ds = None gdal.Unlink('/vsimem/ogr_gml_45.gml') gdal.Unlink('/vsimem/ogr_gml_45.xsd') assert val != 0 ############################################################################### # Validate different kinds of GML files def test_ogr_gml_46(): if not gdaltest.have_gml_validation: pytest.skip() wkt_list = ['', 'POINT (0 1)', # 'POINT (0 1 2)', 'LINESTRING (0 1,2 3)', # 'LINESTRING (0 1 2,3 4 5)', 'POLYGON ((0 0,0 1,1 1,1 0,0 0))', # 'POLYGON ((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10))', 'MULTIPOINT (0 1)', # 'MULTIPOINT (0 1 2)', 'MULTILINESTRING ((0 1,2 3))', # 'MULTILINESTRING ((0 1 2,3 4 5))', 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))', # 'MULTIPOLYGON (((0 0 10,0 1 10,1 1 10,1 0 10,0 0 10)))', 'GEOMETRYCOLLECTION (POINT (0 1))', # 'GEOMETRYCOLLECTION (POINT (0 1 2))' ] format_list = ['GML2', 'GML3', 'GML3Deegree', 'GML3.2'] for wkt in wkt_list: for frmt in format_list: drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('/vsimem/ogr_gml_46.gml', options=['FORMAT=%s' % frmt]) if wkt != '': geom = ogr.CreateGeometryFromWkt(wkt) geom_type = geom.GetGeometryType() srs = osr.SpatialReference() srs.ImportFromEPSG(4326) else: geom = None geom_type = ogr.wkbNone srs = None lyr = ds.CreateLayer('test', geom_type=geom_type, srs=srs) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('dbl', ogr.OFTReal)) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('str', 'str') dst_feat.SetField('int', 1) dst_feat.SetField('dbl', 2.34) dst_feat.SetGeometry(geom) lyr.CreateFeature(dst_feat) dst_feat = None ds = None # Validate document ds = ogr.Open('/vsimem/ogr_gml_46.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() got_geom = feat.GetGeometryRef() if got_geom is None: got_geom_wkt = '' else: got_geom_wkt = got_geom.ExportToWkt() if got_geom_wkt != wkt: gdaltest.post_reason('geometry do not match') print('got %s, expected %s' % (got_geom_wkt, wkt)) feat = None gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', './tmp/cache/SCHEMAS_OPENGIS_NET') lyr = ds.ExecuteSQL('SELECT ValidateSchema()') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) feat = lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) feat = None ds.ReleaseResultSet(lyr) ds = None if val == 0: gdaltest.post_reason('validation failed for format=%s, wkt=%s' % (frmt, wkt)) f = gdal.VSIFOpenL('/vsimem/ogr_gml_46.gml', 'rb') content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(content) f = gdal.VSIFOpenL('/vsimem/ogr_gml_46.xsd', 'rb') content = gdal.VSIFReadL(1, 10000, f) gdal.VSIFCloseL(f) print(content) gdal.Unlink('/vsimem/ogr_gml_46.gml') gdal.Unlink('/vsimem/ogr_gml_46.xsd') assert val != 0 # Only minor schema changes if frmt == 'GML3Deegree': break ############################################################################### # Test validation of WFS GML documents def test_ogr_gml_47(): if not gdaltest.have_gml_validation: pytest.skip() filenames = ['data/wfs10.xml', 'data/wfs11.xml', 'data/wfs20.xml'] for filename in filenames: # Validate document ds = ogr.Open(filename) gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', './tmp/cache/SCHEMAS_OPENGIS_NET') lyr = ds.ExecuteSQL('SELECT ValidateSchema()') gdal.SetConfigOption('GDAL_OPENGIS_SCHEMAS', None) feat = lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) feat = None ds.ReleaseResultSet(lyr) ds = None assert val != 0, ('validation failed for file=%s' % filename) ############################################################################### # Test that we can parse some particular .xsd files that have the geometry # field declared as : # # # # # # # def test_ogr_gml_48(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/schema_with_geom_in_complextype.gfs') ds = ogr.Open('data/schema_with_geom_in_complextype.xml') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbUnknown assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTString ds = None ############################################################################### # Test a pseudo Inspire GML file def test_ogr_gml_49(): if not gdaltest.have_gml_reader: pytest.skip() xsd_content = """ 2,49 2,50 3,50 3,49 2,49 -2 -49 """ gdal.FileFromMemBuffer('/vsimem/ogr_gml_49.gml', xsd_content) ds = ogr.Open('/vsimem/ogr_gml_49.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetGeometryRef().GetGeometryType() == ogr.wkbPolygon ds = None # Now with .gfs file present (#6247) ds = ogr.Open('/vsimem/ogr_gml_49.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetGeometryRef().GetGeometryType() == ogr.wkbPolygon ds = None gdal.Unlink('/vsimem/ogr_gml_49.gml') gdal.Unlink('/vsimem/ogr_gml_49.gfs') ############################################################################### # Test support for StringList, IntegerList, RealList def test_ogr_gml_50(): if not gdaltest.have_gml_reader: pytest.skip() drv = ogr.GetDriverByName('GML') ds = drv.CreateDataSource('/vsimem/ogr_gml_50.gml') lyr = ds.CreateLayer('listlayer') field_defn = ogr.FieldDefn('stringlist', ogr.OFTStringList) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('intlist', ogr.OFTIntegerList) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('reallist', ogr.OFTRealList) lyr.CreateField(field_defn) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) feat.SetFieldStringList(0, ['a', 'b']) feat.SetFieldIntegerList(1, [2, 3]) feat.SetFieldDoubleList(2, [4.56, 5.67]) lyr.CreateFeature(feat) ds = None ds = ogr.Open('/vsimem/ogr_gml_50.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetFieldAsStringList(lyr.GetLayerDefn().GetFieldIndex('stringlist')) != ['a', 'b']: feat.DumpReadable() pytest.fail() if feat.GetFieldAsIntegerList(lyr.GetLayerDefn().GetFieldIndex('intlist')) != [2, 3]: feat.DumpReadable() pytest.fail() if feat.GetFieldAsDoubleList(lyr.GetLayerDefn().GetFieldIndex('reallist')) != [4.56, 5.67]: feat.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_gml_50.gml') gdal.Unlink('/vsimem/ogr_gml_50.xsd') ############################################################################### # Test -dsco WRITE_FEATURE_BOUNDED_BY=no -dsco STRIP_PREFIX=YES def test_ogr_gml_51(): if not gdaltest.have_gml_reader: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() for frmt in ['GML2', 'GML3']: gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f GML tmp/ogr_gml_51.gml data/poly.shp -dsco FORMAT=%s -dsco WRITE_FEATURE_BOUNDED_BY=no -dsco STRIP_PREFIX=YES' % frmt) f = open('tmp/ogr_gml_51.gml', 'rt') content = f.read() f.close() assert content.find("") != -1 assert content.find("""215229.266""") != -1 assert content.find("""479647""") == -1 ds = ogr.Open('tmp/ogr_gml_51.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ds = None ############################################################################### # Test reading MTKGML files def test_ogr_gml_52(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('data/fake_mtkgml.gfs') except OSError: pass for _ in range(2): ds = ogr.Open('data/fake_mtkgml.xml') lyr = ds.GetLayerByName('A') assert lyr.GetGeomType() == ogr.wkbPoint25D srs = lyr.GetSpatialRef() assert srs is not None wkt = srs.ExportToWkt() assert '3067' in wkt feat = lyr.GetNextFeature() if feat.GetField('gid') != '1' or \ feat.GetField('regular_attribute') != 5 or \ feat.GetField('foo_href') != 'some_ref' or \ feat.GetField('teksti') != 'En francais !' or \ feat.GetField('teksti_kieli') != 'fr' or \ ogrtest.check_feature_geometry(feat, 'POINT (280000 7000000 0)') != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('B') assert lyr.GetGeomType() == ogr.wkbPolygon25D srs = lyr.GetSpatialRef() assert srs is not None feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POLYGON ((280000 7000000 0,281000 7000000 0,281000 7001000 0,280000 7001000 0,280000 7000000 0))') != 0: feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('C') assert lyr.GetGeomType() == ogr.wkbLineString25D feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'LINESTRING (280000 7000000 0,281000 7000000 0,281000 7001000 0,280000 7001000 0,280000 7000000 0)') != 0: feat.DumpReadable() pytest.fail() ds = None os.remove('data/fake_mtkgml.gfs') ############################################################################### # Test that we don't recognize .xsd files themselves def test_ogr_gml_53(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/archsites.xsd') assert ds is None ds = None ############################################################################### # Test that we can open an empty GML datasource (#249, #5205) def test_ogr_gml_54(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/empty.gfs') ds = ogr.Open('data/empty.gml') assert ds is not None ds = None # with .gfs now ds = ogr.Open('data/empty.gml') assert ds is not None ds = None gdal.Unlink('data/empty.gfs') ############################################################################### # Test support for in schemas # Necessary for Finnish NLS data def test_ogr_gml_55(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/ogr_gml_55.gml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTString ds = None with pytest.raises(OSError): os.unlink('data/ogr_gml_55.gfs') ############################################################################### # Test support for gml:FeaturePropertyType and multiple geometry field # Necessary for Finnish NLS data def test_ogr_gml_56(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/ogr_gml_56.gfs') gdal.SetConfigOption('GML_REGISTRY', 'data/ogr_gml_56_registry.xml') ds = ogr.Open('data/ogr_gml_56.gml') gdal.SetConfigOption('GML_REGISTRY', None) lyr = ds.GetLayerByName('mainFeature') assert lyr.GetSpatialRef() is not None feat = lyr.GetNextFeature() assert feat.GetFieldAsString(feat.GetFieldIndex('subFeatureProperty_href')) == '#subFeature.0' assert feat.GetFieldAsStringList(feat.GetFieldIndex('subFeatureRepeatedProperty_href')) == ['#subFeatureRepeated.0', '#subFeatureRepeated.1'] assert feat.GetGeomFieldRef(0).ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' assert feat.GetGeomFieldRef(1).ExportToWkt() == 'POINT (10 10)' lyr = ds.GetLayerByName('subFeature') assert lyr.GetLayerDefn().GetGeomFieldCount() == 0 feat = lyr.GetNextFeature() assert feat.GetFieldAsStringList(feat.GetFieldIndex('subFeatureRepeatedProperty_href')) == ['#subFeatureRepeated.2'] assert feat.GetField('foo') == 'bar' lyr = ds.GetLayerByName('subFeatureRepeated') feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'subFeatureRepeated.2' assert feat.GetField('bar') == 'baz' feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'subFeatureRepeated.0' feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'subFeatureRepeated.1' ds = None with pytest.raises(OSError): os.unlink('data/ogr_gml_56.gfs') ############################################################################### # Test write support for multiple geometry field def test_ogr_gml_57(): if not gdaltest.have_gml_reader: pytest.skip() for i in range(4): options = [] if i == 3: options = ['FORMAT=GML3.2'] ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_57.gml', options=options) assert ds.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) == 1 lyr = ds.CreateLayer('myLayer', geom_type=ogr.wkbNone) assert lyr.TestCapability(ogr.OLCCreateGeomField) == 1 geomfielddefn = ogr.GeomFieldDefn('first_geometry', ogr.wkbPoint) if i == 1 or i == 2: sr = osr.SpatialReference() sr.ImportFromEPSG(32630) geomfielddefn.SetSpatialRef(sr) lyr.CreateGeomField(geomfielddefn) geomfielddefn = ogr.GeomFieldDefn('second_geometry', ogr.wkbLineString) if i == 1: sr = osr.SpatialReference() sr.ImportFromEPSG(32630) geomfielddefn.SetSpatialRef(sr) elif i == 2: sr = osr.SpatialReference() sr.ImportFromEPSG(32631) geomfielddefn.SetSpatialRef(sr) lyr.CreateGeomField(geomfielddefn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomFieldDirectly(0, ogr.CreateGeometryFromWkt('POINT (0 1)')) feat.SetGeomFieldDirectly(1, ogr.CreateGeometryFromWkt('LINESTRING (2 3,4 5)')) lyr.CreateFeature(feat) feat = None ds = None if False: # pylint: disable=using-constant-test f = gdal.VSIFOpenL('/vsimem/ogr_gml_57.gml', 'rb') print(gdal.VSIFReadL(1, 1000, f)) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_gml_57.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert not (i == 1 and feat.GetGeomFieldRef(0).GetSpatialReference().ExportToWkt().find('32630') < 0) assert not (i == 1 and feat.GetGeomFieldRef(1).GetSpatialReference().ExportToWkt().find('32630') < 0) assert not (i == 2 and feat.GetGeomFieldRef(1).GetSpatialReference().ExportToWkt().find('32631') < 0) assert feat.GetGeomFieldRef(0).ExportToWkt() == 'POINT (0 1)' assert feat.GetGeomFieldRef(1).ExportToWkt() == 'LINESTRING (2 3,4 5)' ds = None gdal.Unlink('/vsimem/ogr_gml_57.gml') gdal.Unlink('/vsimem/ogr_gml_57.xsd') ############################################################################### # Test support for Inspire Cadastral schemas def test_ogr_gml_58(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/inspire_cadastralparcel.gfs') ds = ogr.Open('data/inspire_cadastralparcel.xml') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetGeomFieldCount() == 2 assert lyr_defn.GetGeomFieldDefn(0).GetName() == 'geometry' assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbMultiPolygon assert lyr_defn.GetGeomFieldDefn(1).GetName() == 'referencePoint' assert lyr_defn.GetGeomFieldDefn(1).GetType() == ogr.wkbPoint feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralParcel-01'), ('areaValue', 10.0), ('areaValue_uom', 'm2'), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', '2001-01-01T00:00:00.0Z'), ('inspireId_localId', 'CadastralParcel-01-localId'), ('inspireId_namespace', 'namespace'), ('label', 'label'), ('nationalCadastralReference', 'nationalCadastralReference'), ('validFrom', '2002-01-01T00:00:00.0Z'), ('validTo', '2003-01-01T00:00:00.0Z'), ('basicPropertyUnit_href', ['#BPU.1', '#BPU.2']), ('administrativeUnit_href', '#AU.1'), ('zoning_href', '#CZ.1')] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'MULTIPOLYGON (((2 49,2 50,3 50,3 49)))' assert feat.GetGeomFieldRef(1).ExportToWkt() == 'POINT (2.5 49.5)' feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralParcel-02'), ('areaValue', None), ('areaValue_uom', None), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', None), ('inspireId_localId', 'CadastralParcel-02-localId'), ('inspireId_namespace', 'namespace'), ('label', 'label'), ('nationalCadastralReference', 'nationalCadastralReference'), ('validFrom', None), ('validTo', None), ('basicPropertyUnit_href', None), ('administrativeUnit_href', None), ('zoning_href', None)] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'MULTIPOLYGON (((2 49,2 50,3 50,3 49)))' assert feat.GetGeomFieldRef(1) is None feat = None lyr = None ds = None ds = ogr.Open('data/inspire_basicpropertyunit.xml') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetGeomFieldCount() == 0 feat = lyr.GetNextFeature() expected = [('gml_id', 'BasicPropertyUnit-01'), ('inspireId_localId', 'BasicPropertyUnit-01-localId'), ('inspireId_namespace', 'namespace'), ('nationalCadastralReference', 'nationalCadastralReference'), ('areaValue', 10.0), ('areaValue_uom', 'm2'), ('validFrom', '2000-01-01T00:00:00.0Z'), ('validTo', '2001-01-01T00:00:00.0Z'), ('beginLifespanVersion', '2002-01-01T00:00:00.0Z'), ('endLifespanVersion', '2003-01-01T00:00:00.0Z'), ('administrativeUnit_href', '#AU.1')] for (key, val) in expected: assert feat.GetField(key) == val feat = lyr.GetNextFeature() expected = [('gml_id', 'BasicPropertyUnit-02'), ('inspireId_localId', 'BasicPropertyUnit-02-localId'), ('inspireId_namespace', 'namespace'), ('nationalCadastralReference', 'nationalCadastralReference'), ('areaValue', None), ('areaValue_uom', None), ('validFrom', '2000-01-01T00:00:00.0Z'), ('validTo', None), ('beginLifespanVersion', '2002-01-01T00:00:00.0Z'), ('endLifespanVersion', None), ('administrativeUnit_href', None)] for (key, val) in expected: assert feat.GetField(key) == val feat = None lyr = None ds = None ds = ogr.Open('data/inspire_cadastralboundary.xml') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetGeomFieldCount() == 1 assert lyr_defn.GetGeomFieldDefn(0).GetName() == 'geometry' assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbLineString feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralBoundary-01'), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', '2001-01-01T00:00:00.0Z'), ('estimatedAccuracy', 1.0), ('estimatedAccuracy_uom', 'm'), ('inspireId_localId', 'CadastralBoundary-01-localId'), ('inspireId_namespace', 'namespace'), ('validFrom', '2002-01-01T00:00:00.0Z'), ('validTo', '2003-01-01T00:00:00.0Z'), ('parcel_href', ['#Parcel.1', '#Parcel.2'])] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'LINESTRING (2 49,3 50)' feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralBoundary-02'), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', None), ('estimatedAccuracy', None), ('estimatedAccuracy_uom', None), ('inspireId_localId', 'CadastralBoundary-02-localId'), ('inspireId_namespace', 'namespace'), ('validFrom', None), ('validTo', None), ('parcel_href', None)] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'LINESTRING (2 49,3 50)' feat = None lyr = None ds = None ds = ogr.Open('data/inspire_cadastralzoning.xml') lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetGeomFieldCount() == 2 assert lyr_defn.GetGeomFieldDefn(0).GetName() == 'geometry' assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbMultiPolygon assert lyr_defn.GetGeomFieldDefn(1).GetName() == 'referencePoint' assert lyr_defn.GetGeomFieldDefn(1).GetType() == ogr.wkbPoint feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralZoning-01'), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', '2001-01-01T00:00:00.0Z'), ('estimatedAccuracy', 1.0), ('estimatedAccuracy_uom', 'm'), ('inspireId_localId', 'CadastralZoning-01-localId'), ('inspireId_namespace', 'namespace'), ('label', 'label'), ('level', '3'), ('levelName', ['English', 'Francais', 'Deutsch']), ('levelName_locale', ['en', 'fr', 'de']), ('name_language', ['language']), ('name_nativeness', ['nativeness']), ('name_nameStatus', ['nameStatus']), ('name_pronunciation', None), ('name_spelling_text', ['text']), ('name_spelling_script', ['script']), ('nationalCadastalZoningReference', 'nationalCadastalZoningReference'), ('validFrom', '2002-01-01T00:00:00.0Z'), ('validTo', '2003-01-01T00:00:00.0Z'), ('upperLevelUnit_href', '#ulu.1')] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'MULTIPOLYGON (((2 49,2 50,3 50,3 49)))' assert feat.GetGeomFieldRef(1).ExportToWkt() == 'POINT (2.5 49.5)' feat = lyr.GetNextFeature() expected = [('gml_id', 'CadastralZoning-02'), ('beginLifespanVersion', '2000-01-01T00:00:00.0Z'), ('endLifespanVersion', None), ('estimatedAccuracy', None), ('estimatedAccuracy_uom', None), ('inspireId_localId', None), ('inspireId_namespace', None), ('label', 'label'), ('level', '3'), ('levelName', ['English']), ('levelName_locale', ['en']), ('name_language', None), ('name_nativeness', None), ('name_nameStatus', None), ('name_pronunciation', None), ('name_spelling_text', None), ('name_spelling_script', None), ('nationalCadastalZoningReference', 'nationalCadastalZoningReference'), ('validFrom', None), ('validTo', None), ('upperLevelUnit_href', None)] for (key, val) in expected: assert feat.GetField(key) == val assert feat.GetGeomFieldRef(0).ExportToWkt() == 'MULTIPOLYGON (((2 49,2 50,3 50,3 49)))' assert feat.GetGeomFieldRef(1) is None feat = None lyr = None ds = None ############################################################################### # Test GFS conditions def test_ogr_gml_59(): if not gdaltest.have_gml_reader: pytest.skip() # Make sure the .gfs file is more recent that the .gml one try: gml_mtime = os.stat('data/testcondition.gml').st_mtime gfs_mtime = os.stat('data/testcondition.gfs').st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: print('Touching .gfs file') f = open('data/testcondition.gfs', 'rb+') data = f.read(1) f.seek(0, 0) f.write(data) f.close() ds = ogr.Open('data/testcondition.gml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() expected = [('name_en', 'English name'), ('name_fr', 'Nom francais'), ('name_others_lang', ['de']), ('name_others', ['Deutsche name'])] for (key, val) in expected: assert feat.GetField(key) == val feat = None lyr = None ds = None ######################################################## # Test reading WFS 2.0 GetFeature documents with wfs:FeatureCollection # as a wfs:member of the top wfs:FeatureCollection def test_ogr_gml_60(): if not gdaltest.have_gml_reader: pytest.skip() # Make sure the .gfs file is more recent that the .gml one gdal.Unlink('data/wfs_200_multiplelayers.gfs') for _ in range(2): ds = ogr.Open('data/wfs_200_multiplelayers.gml') lyr = ds.GetLayerByName('road') assert lyr.GetFeatureCount() == 1 feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'road.21' lyr = ds.GetLayerByName('popplace') assert lyr.GetFeatureCount() == 1 feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'popplace.BACMK' ds = None gdal.Unlink('data/wfs_200_multiplelayers.gfs') ############################################################################### # Test reading a element specified with a full path in def test_ogr_gml_61(): if not gdaltest.have_gml_reader: pytest.skip() # Make sure the .gfs file is more recent that the .gml one try: gml_mtime = os.stat('data/gmlsubfeature.gml').st_mtime gfs_mtime = os.stat('data/gmlsubfeature.gfs').st_mtime touch_gfs = gfs_mtime <= gml_mtime except: touch_gfs = True if touch_gfs: print('Touching .gfs file') f = open('data/gmlsubfeature.gfs', 'rb+') data = f.read(1) f.seek(0, 0) f.write(data) f.close() ds = ogr.Open('data/gmlsubfeature.gml') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2, 'did not get expected geometry column name' feat = lyr.GetNextFeature() if feat.GetField('gml_id') != 'Object.1' or feat.GetField('foo') != 'bar': feat.DumpReadable() pytest.fail() geom = feat.GetGeometryRef() if geom.ExportToWkt() != 'POLYGON ((2 48,2 49,3 49,3 48,2 48))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetField('gml_id') != 'Object.2' or feat.GetField('foo') != 'baz': feat.DumpReadable() pytest.fail() geom = feat.GetGeometryRef() if geom.ExportToWkt() != 'POLYGON ((2 -48,2 -49,3 -49,3 -48,2 -48))': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test GML_ATTRIBUTES_TO_OGR_FIELDS option def test_ogr_gml_62(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('tmp/gmlattributes.gfs') shutil.copy('data/gmlattributes.gml', 'tmp/gmlattributes.gml') # Default behaviour ds = ogr.Open('tmp/gmlattributes.gml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 1 ds = None # Test GML_ATTRIBUTES_TO_OGR_FIELDS=YES gdal.Unlink('tmp/gmlattributes.gfs') # Without and then with .gfs for i in range(2): if i == 0: gdal.SetConfigOption('GML_ATTRIBUTES_TO_OGR_FIELDS', 'YES') ds = ogr.Open('tmp/gmlattributes.gml') if i == 0: gdal.SetConfigOption('GML_ATTRIBUTES_TO_OGR_FIELDS', None) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 4, i feat = lyr.GetNextFeature() if feat.GetField('element_attr1') != '1' or \ feat.GetField('element2_attr1') != 'a' or \ feat.GetField('element2') != 'foo' or \ feat.IsFieldSet('element3_attr1'): feat.DumpReadable() pytest.fail(i) feat = lyr.GetNextFeature() if feat.IsFieldSet('element_attr1') or \ feat.IsFieldSet('element2_attr1') or \ feat.IsFieldSet('element2') or \ feat.GetField('element3_attr1') != 1: feat.DumpReadable() pytest.fail(i) feat = lyr.GetNextFeature() if feat.GetField('element_attr1') != 'a' or \ feat.IsFieldSet('element2_attr1') or \ feat.IsFieldSet('element2') or \ feat.IsFieldSet('element3_attr1'): feat.DumpReadable() pytest.fail(i) feat = None ds = None ############################################################################### # Test reading RUIAN VFR files def test_ogr_gml_63(): if not gdaltest.have_gml_reader: pytest.skip() # test ST file type ds = ogr.Open('data/ruian_st_v1.xml.gz') # check number of layers nlayers = ds.GetLayerCount() assert nlayers == 14 # check name of first layer lyr = ds.GetLayer(0) assert lyr.GetName() == 'Staty' # check geometry column name assert lyr.GetGeometryColumn() == 'DefinicniBod' ds = None # test OB file type ds = ogr.Open('data/ruian_ob_v1.xml.gz') # check number of layers nlayers = ds.GetLayerCount() assert nlayers == 11 # check number of features nfeatures = 0 for i in range(nlayers): lyr = ds.GetLayer(i) nfeatures += lyr.GetFeatureCount() assert nfeatures == 7 ############################################################################### # Test multiple instances of parsers (#5571) def test_ogr_gml_64(): if not gdaltest.have_gml_reader: pytest.skip() for parser in ['XERCES', 'EXPAT']: for _ in range(2): gdal.SetConfigOption('GML_PARSER', parser) ds = ogr.Open('data/rnf_eg.gml') gdal.SetConfigOption('GML_PARSER', None) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None, parser ############################################################################### # Test SRSDIMENSION_LOC=GEOMETRY option (#5606) def test_ogr_gml_65(): if not gdaltest.have_gml_reader: pytest.skip() option_expected_list = [['SRSDIMENSION_LOC=GEOMETRY', '0 1 2 3 4 5 6 7 8 0 1 2'], ['SRSDIMENSION_LOC=POSLIST', '0 1 2 3 4 5 6 7 8 0 1 2'], ['SRSDIMENSION_LOC=GEOMETRY,POSLIST', '0 1 2 3 4 5 6 7 8 0 1 2'], ] for (option, expected) in option_expected_list: filename = '/vsimem/ogr_gml_65.gml' # filename = 'ogr_gml_65.gml' ds = ogr.GetDriverByName('GML').CreateDataSource(filename, options=['FORMAT=GML3', option]) lyr = ds.CreateLayer('lyr') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt("MULTIPOLYGON (((0 1 2,3 4 5,6 7 8,0 1 2)))")) lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL(filename, 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert expected in data ds = ogr.Open(filename) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != "MULTIPOLYGON (((0 1 2,3 4 5,6 7 8,0 1 2)))": feat.DumpReadable() pytest.fail() ds = None gdal.Unlink(filename) gdal.Unlink(filename[0:-3] + "xsd") ############################################################################### # Test curve geometries def test_ogr_gml_66(): if not gdaltest.have_gml_reader: pytest.skip() filename = '/vsimem/ogr_gml_66.gml' # filename = 'ogr_gml_66.gml' ds = ogr.GetDriverByName('GML').CreateDataSource(filename, options=['FORMAT=GML3']) lyr = ds.CreateLayer('compoundcurve', geom_type=ogr.wkbCompoundCurve) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CIRCULARSTRING (0 0,1 1,2 0)')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 0)')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('curvepolygon', geom_type=ogr.wkbCurvePolygon) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CURVEPOLYGON ( CIRCULARSTRING(0 0,1 0,0 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multisurface', geom_type=ogr.wkbMultiSurface) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTISURFACE (CURVEPOLYGON ( CIRCULARSTRING(0 0,1 0,0 0)))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multicurve', geom_type=ogr.wkbMultiCurve) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTICURVE ( CIRCULARSTRING(0 0,1 0,0 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTICURVE ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('polygon', geom_type=ogr.wkbPolygon) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('linestring', geom_type=ogr.wkbLineString) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 0,0 1,1 1,0 0)')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multipolygon', geom_type=ogr.wkbMultiPolygon) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multilinestring', geom_type=ogr.wkbMultiLineString) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('compoundcurve_untyped') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 0)')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 0,1 1,2 0)')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('curvepolygon_untyped') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CURVEPOLYGON ( CIRCULARSTRING(0 0,1 0,0 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multisurface_untyped') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTISURFACE (CURVEPOLYGON ( CIRCULARSTRING(0 0,1 0,0 0)))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0,0 1,1 1,0 0)))')) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('multicurve_untyped') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0))')) lyr.CreateFeature(f) f = None f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) f = None ds = None # Test first with .xsd and then without for i in range(3): ds = ogr.Open(filename) lyr = ds.GetLayerByName('compoundcurve') assert lyr.GetGeomType() == ogr.wkbCompoundCurve feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE ((0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('curvepolygon') assert lyr.GetGeomType() == ogr.wkbCurvePolygon feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'CURVEPOLYGON (CIRCULARSTRING (0 0,0.5 0.5,1 0,0.5 -0.5,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multisurface') assert lyr.GetGeomType() == ogr.wkbMultiSurface feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,0.5 0.5,1 0,0.5 -0.5,0 0)))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTISURFACE (((0 0,0 1,1 1,0 0)))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multicurve') assert lyr.GetGeomType() == ogr.wkbMultiCurve feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTICURVE (CIRCULARSTRING (0 0,0.5 0.5,1 0,0.5 -0.5,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTICURVE ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('polygon') assert lyr.GetGeomType() == ogr.wkbPolygon feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('linestring') assert lyr.GetGeomType() == ogr.wkbLineString feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (0 0,0 1,1 1,0 0)': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multipolygon') assert lyr.GetGeomType() == ogr.wkbMultiPolygon feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multilinestring') assert lyr.GetGeomType() == ogr.wkbMultiLineString feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTILINESTRING ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('compoundcurve_untyped') if i != 0: assert lyr.GetGeomType() == ogr.wkbCompoundCurve feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE ((0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() else: feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (0 0,1 1,2 0)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'COMPOUNDCURVE (CIRCULARSTRING (0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('curvepolygon_untyped') if i != 0: assert lyr.GetGeomType() == ogr.wkbCurvePolygon feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'CURVEPOLYGON ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() else: feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'CURVEPOLYGON (CIRCULARSTRING (0 0,0.5 0.5,1 0,0.5 -0.5,0 0))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multisurface_untyped') if i != 0: assert lyr.GetGeomType() == ogr.wkbMultiSurface feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTISURFACE (((0 0,0 1,1 1,0 0)))': feat.DumpReadable() pytest.fail() else: feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTIPOLYGON (((0 0,0 1,1 1,0 0)))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTISURFACE (CURVEPOLYGON (CIRCULARSTRING (0 0,0.5 0.5,1 0,0.5 -0.5,0 0)))': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('multicurve_untyped') if i != 0: assert lyr.GetGeomType() == ogr.wkbMultiCurve feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTICURVE ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() else: feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTILINESTRING ((0 0,0 1,1 1,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'MULTICURVE (CIRCULARSTRING (0 0,1 1,2 0))': feat.DumpReadable() pytest.fail() ds = None gdal.Unlink(filename[0:-3] + "xsd") gdal.Unlink(filename) gdal.Unlink(filename[0:-3] + "gfs") ############################################################################### # Test boolean, int16, integer64 type def test_ogr_gml_67(): if not gdaltest.have_gml_reader: pytest.skip() filename = '/vsimem/ogr_gml_67.gml' ds = ogr.GetDriverByName('GML').CreateDataSource(filename) lyr = ds.CreateLayer('test') fld_defn = ogr.FieldDefn('b1', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('b2', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('bool_list', ogr.OFTIntegerList) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('short', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('float', ogr.OFTReal) fld_defn.SetSubType(ogr.OFSTFloat32) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('int64', ogr.OFTInteger64) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('int64list', ogr.OFTInteger64List) lyr.CreateField(fld_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 1) f.SetField(1, 0) f.SetFieldIntegerList(2, [1, 0]) f.SetField(3, -32768) f.SetField(4, 1.23) f.SetField(5, 1) f.SetFieldInteger64List(6, [1]) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1234567890123) f.SetField(5, 1234567890123) f.SetFieldInteger64List(6, [1, 1234567890123]) lyr.CreateFeature(f) f = None ds = None # Test first with .xsd and then without for i in range(3): ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert (lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('b1')).GetType() == ogr.OFTInteger and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('b1')).GetSubType() == ogr.OFSTBoolean), \ i assert (lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('bool_list')).GetType() == ogr.OFTIntegerList and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('bool_list')).GetSubType() == ogr.OFSTBoolean), \ i if i == 0: assert (lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('short')).GetType() == ogr.OFTInteger and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('short')).GetSubType() == ogr.OFSTInt16), \ i if i == 0: assert (lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('float')).GetType() == ogr.OFTReal and \ lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('float')).GetSubType() == ogr.OFSTFloat32), \ i assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('int64')).GetType() == ogr.OFTInteger64, \ i assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('int64list')).GetType() == ogr.OFTInteger64List, \ i f = lyr.GetNextFeature() if f.GetField('b1') != 1 or f.GetField('b2') != 0 or f.GetFieldAsString('bool_list') != '(2:1,0)' or f.GetField('short') != -32768 or f.GetField('float') != 1.23: f.DumpReadable() pytest.fail(i) f = lyr.GetNextFeature() if f.GetFID() != 1234567890123 or f.GetField('int64') != 1234567890123 or f.GetField('int64list') != [1, 1234567890123]: f.DumpReadable() pytest.fail(i) ds = None gdal.Unlink(filename[0:-3] + "xsd") gdal.Unlink(filename) gdal.Unlink(filename[0:-3] + "gfs") ############################################################################### # Test reading GML with xsd with a choice of geometry properites def test_ogr_gml_68(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('data/choicepolygonmultipolygon.gml') expected_results = ['MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)))', 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)),((10 0,10 1,11 1,11 0,10 0)))'] lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbMultiPolygon, \ ' did not get expected layer geometry type' for i in range(2): feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == expected_results[i], 'did not get expected geometry' ds = None ############################################################################### # Test not nullable fields def test_ogr_gml_69(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_69.gml') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_nullable', ogr.wkbPoint) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None ds = None ds = gdal.OpenEx('/vsimem/ogr_gml_69.gml', open_options=['EMPTY_AS_NULL=NO']) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 ds = None gdal.Unlink("/vsimem/ogr_gml_69.gml") gdal.Unlink("/vsimem/ogr_gml_69.xsd") ############################################################################### # Test default fields (not really supported, but we must do something as we # support not nullable fields) def test_ogr_gml_70(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_70.gml') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a'") field_defn.SetNullable(0) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_gml_70.gml') lyr = ds.GetLayerByName('test') f = lyr.GetNextFeature() if f.GetField('field_string') != 'a': f.DumpReadable() pytest.fail() ds = None gdal.Unlink("/vsimem/ogr_gml_70.gml") gdal.Unlink("/vsimem/ogr_gml_70.xsd") ############################################################################### # Test reading WFS 2.0 layer resulting from a join operation def ogr_gml_71_helper(ds): assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr.GetName() == 'join_table1_table2' fields = [('table1.gml_id', ogr.OFTString), ('table1.foo', ogr.OFTInteger), ('table1.bar', ogr.OFTInteger), ('table2.gml_id', ogr.OFTString), ('table2.bar', ogr.OFTInteger), ('table2.baz', ogr.OFTString)] layer_defn = lyr.GetLayerDefn() assert layer_defn.GetFieldCount() == len(fields) for i, field in enumerate(fields): fld_defn = layer_defn.GetFieldDefn(i) assert fld_defn.GetName() == field[0], i assert fld_defn.GetType() == field[1], i assert layer_defn.GetGeomFieldCount() == 2 assert layer_defn.GetGeomFieldDefn(0).GetName() == 'table1.geometry' assert layer_defn.GetGeomFieldDefn(1).GetName() == 'table2.geometry' f = lyr.GetNextFeature() if f.GetField('table1.gml_id') != 'table1-1' or \ f.GetField('table1.foo') != 1 or \ f.IsFieldSet('table1.bar') or \ f.GetField('table2.gml_id') != 'table2-1' or \ f.GetField('table2.bar') != 2 or \ f.GetField('table2.baz') != 'foo' or \ f.GetGeomFieldRef(0) is not None or \ f.GetGeomFieldRef(1).ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('table1.gml_id') != 'table1-2' or \ f.IsFieldSet('table1.foo') or \ f.GetField('table1.bar') != 2 or \ f.GetField('table2.gml_id') != 'table2-2' or \ f.GetField('table2.bar') != 2 or \ f.GetField('table2.baz') != 'bar' or \ f.GetGeomFieldRef(0).ExportToWkt() != 'POINT (3 50)' or \ f.GetGeomFieldRef(1).ExportToWkt() != 'POINT (2 50)': f.DumpReadable() pytest.fail() def test_ogr_gml_71(): if not gdaltest.have_gml_reader: pytest.skip() # With .xsd gdal.Unlink('data/wfsjointlayer.gfs') ds = ogr.Open('data/wfsjointlayer.gml') ogr_gml_71_helper(ds) ds = None with pytest.raises(OSError): os.unlink('data/wfsjointlayer.gfs') # With .xsd but that is only partially understood ds = gdal.OpenEx('data/wfsjointlayer.gml', open_options=['XSD=data/wfsjointlayer_not_understood.xsd']) ogr_gml_71_helper(ds) ds = None try: os.unlink('data/wfsjointlayer.gfs') except OSError: pytest.fail() # Without .xsd nor .gfs shutil.copy('data/wfsjointlayer.gml', 'tmp/wfsjointlayer.gml') gdal.Unlink('tmp/wfsjointlayer.gfs') ds = ogr.Open('tmp/wfsjointlayer.gml') ogr_gml_71_helper(ds) ds = None try: os.stat('tmp/wfsjointlayer.gfs') except OSError: pytest.fail() # With .gfs ds = ogr.Open('tmp/wfsjointlayer.gml') ogr_gml_71_helper(ds) ds = None ############################################################################### # Test name and description def test_ogr_gml_72(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_72.gml', options=['NAME=name', 'DESCRIPTION=description']) ds.SetMetadata({'NAME': 'ignored', 'DESCRIPTION': 'ignored'}) ds = None ds = ogr.Open('/vsimem/ogr_gml_72.gml') assert ds.GetMetadata() == {'NAME': 'name', 'DESCRIPTION': 'description'} ds = None gdal.Unlink("/vsimem/ogr_gml_72.gml") gdal.Unlink("/vsimem/ogr_gml_72.xsd") gdal.Unlink("/vsimem/ogr_gml_72.gfs") ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_72.gml') ds.SetMetadata({'NAME': 'name', 'DESCRIPTION': 'description'}) ds = None ds = ogr.Open('/vsimem/ogr_gml_72.gml') assert ds.GetMetadata() == {'NAME': 'name', 'DESCRIPTION': 'description'} ds = None gdal.Unlink("/vsimem/ogr_gml_72.gml") gdal.Unlink("/vsimem/ogr_gml_72.xsd") gdal.Unlink("/vsimem/ogr_gml_72.gfs") ############################################################################### # Read a CSW GetRecordsResponse document def test_ogr_gml_73(): if not gdaltest.have_gml_reader: pytest.skip() try: os.remove('data/cswresults.gfs') except OSError: pass ds = ogr.Open('data/cswresults.xml') for i in range(3): lyr = ds.GetLayer(i) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert '4326' in got_wkt, 'did not get expected SRS' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() got_wkt = geom.ExportToWkt() assert got_wkt == 'POLYGON ((-180 -90,-180 90,180 90,180 -90,-180 -90))', \ 'did not get expected geometry' ds = None try: os.remove('data/cswresults.gfs') except OSError: pass ############################################################################### # Test FORCE_SRS_DETECTION open option def test_ogr_gml_74(): if not gdaltest.have_gml_reader: pytest.skip() # With .xsd ds = gdal.OpenEx('data/expected_gml_gml32.gml', open_options=['FORCE_SRS_DETECTION=YES']) lyr = ds.GetLayer(0) assert lyr.GetSpatialRef() is not None, 'did not get expected SRS' assert lyr.GetFeatureCount() == 2, 'did not get expected feature count' shutil.copy('data/expected_gml_gml32.gml', 'tmp/ogr_gml_74.gml') if os.path.exists('tmp/ogr_gml_74.gfs'): os.unlink('tmp/ogr_gml_74.gfs') # Without .xsd or .gfs ds = gdal.OpenEx('tmp/ogr_gml_74.gml', open_options=['FORCE_SRS_DETECTION=YES']) lyr = ds.GetLayer(0) assert lyr.GetSpatialRef() is not None, 'did not get expected SRS' assert lyr.GetFeatureCount() == 2, 'did not get expected feature count' # With .gfs ds = gdal.OpenEx('tmp/ogr_gml_74.gml', open_options=['FORCE_SRS_DETECTION=YES']) lyr = ds.GetLayer(0) assert lyr.GetSpatialRef() is not None, 'did not get expected SRS' assert lyr.GetFeatureCount() == 2, 'did not get expected feature count' ds = None os.unlink('tmp/ogr_gml_74.gml') os.unlink('tmp/ogr_gml_74.gfs') ############################################################################### # Test we don't open a WMTS Capabilities doc def test_ogr_gml_75(): if not gdaltest.have_gml_reader: pytest.skip() gdal.FileFromMemBuffer("/vsimem/ogr_gml_75.xml", """ """) ds = ogr.Open('/vsimem/ogr_gml_75.xml') assert ds is None gdal.Unlink('/vsimem/ogr_gml_75.xml') ############################################################################### # Test we are robust to content of XML elements bigger than 2 GB def test_ogr_gml_76(): if not gdaltest.have_gml_reader: pytest.skip() if not gdaltest.run_slow_tests(): pytest.skip() with gdaltest.error_handler(): ds = ogr.Open('/vsisparse/data/huge_attribute_gml_sparse.xml') if ds is not None: lyr = ds.GetLayer(0) lyr.GetNextFeature() ds = ogr.Open('/vsisparse/data/huge_geom_gml_sparse.xml') if ds is not None: lyr = ds.GetLayer(0) lyr.GetNextFeature() ############################################################################### # Test interpretation of http://www.opengis.net/def/crs/EPSG/0/ URLs (#6678) def test_ogr_gml_77(): if not gdaltest.have_gml_reader: pytest.skip() gdal.FileFromMemBuffer("/vsimem/ogr_gml_77.xml", """ 49 2 1 """) ds = ogr.Open('/vsimem/ogr_gml_77.xml') lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' ds = None ds = gdal.OpenEx('/vsimem/ogr_gml_77.xml', open_options=['SWAP_COORDINATES=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' ds = None ds = gdal.OpenEx('/vsimem/ogr_gml_77.xml', open_options=['SWAP_COORDINATES=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (49 2)' ds = None gdal.Unlink('/vsimem/ogr_gml_77.xml') gdal.Unlink('/vsimem/ogr_gml_77.gfs') ############################################################################### # Test effect of SWAP_COORDINATES (#6678) def test_ogr_gml_78(): if not gdaltest.have_gml_reader: pytest.skip() gdal.FileFromMemBuffer("/vsimem/ogr_gml_78.xml", """ 2 49 1 """) ds = ogr.Open('/vsimem/ogr_gml_78.xml') lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' ds = None ds = gdal.OpenEx('/vsimem/ogr_gml_78.xml', open_options=['SWAP_COORDINATES=YES']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (49 2)' ds = None ds = gdal.OpenEx('/vsimem/ogr_gml_78.xml', open_options=['SWAP_COORDINATES=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 49)' ds = None gdal.Unlink('/vsimem/ogr_gml_78.xml') gdal.Unlink('/vsimem/ogr_gml_78.gfs') ############################################################################### # Test SRSNAME_FORMAT def test_ogr_gml_79(): sr = osr.SpatialReference() sr.ImportFromEPSG(4326) tests = [['SHORT', 'EPSG:4326', '2 49'], ['OGC_URN', 'urn:ogc:def:crs:EPSG::4326', '49 2'], ['OGC_URL', 'http://www.opengis.net/def/crs/EPSG/0/4326', '49 2'] ] for (srsname_format, expected_srsname, expected_coords) in tests: ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_79.xml', options=['FORMAT=GML3', 'SRSNAME_FORMAT=' + srsname_format]) lyr = ds.CreateLayer('firstlayer', srs=sr) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (2 49)') feat.SetGeometry(geom) lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL("/vsimem/ogr_gml_79.xml", "rb") if f is not None: data = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) assert expected_srsname in data and expected_coords in data, \ srsname_format gdal.Unlink('/vsimem/ogr_gml_79.xml') gdal.Unlink('/vsimem/ogr_gml_79.xsd') ############################################################################### # Test null / unset def test_ogr_gml_80(): if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_80.xml') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('int_field', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['int_field'] = 4 lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull('int_field') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_gml_80.xml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['int_field'] != 4: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f['int_field'] is not None: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.IsFieldSet('int_field'): f.DumpReadable() pytest.fail() f = None ds = None gdal.Unlink('/vsimem/ogr_gml_80.xml') gdal.Unlink('/vsimem/ogr_gml_80.xsd') ############################################################################### # Test building a .gfs with a field with xsi:nil="true" (#7027) def test_ogr_gml_81(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/test_xsi_nil_gfs.gfs') ds = ogr.Open('data/test_xsi_nil_gfs.gml') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField('intval') != 1: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('data/test_xsi_nil_gfs.gfs') ############################################################################### # Test GML_FEATURE_COLLECTION=YES def test_ogr_gml_82(): if not gdaltest.have_gml_reader: pytest.skip() gdal.VectorTranslate('/vsimem/ogr_gml_82.gml', 'data/poly.shp', format='GML', datasetCreationOptions=['FORMAT=GML3', 'GML_FEATURE_COLLECTION=YES']) ds = ogr.Open('/vsimem/ogr_gml_82.gml') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 10 ds = None f = gdal.VSIFOpenL("/vsimem/ogr_gml_82.gml", "rb") if f is not None: data = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) assert 'gml:FeatureCollection' in data f = gdal.VSIFOpenL("/vsimem/ogr_gml_82.xsd", "rb") if f is not None: data = gdal.VSIFReadL(1, 10000, f).decode('utf-8') gdal.VSIFCloseL(f) assert 'name = "FeatureCollection"' not in data assert 'gmlsf' not in data gdal.Unlink('/vsimem/ogr_gml_82.gml') gdal.Unlink('/vsimem/ogr_gml_82.xsd') ############################################################################### def test_ogr_gml_gml2_write_geometry_error(): ds = ogr.GetDriverByName('GML').CreateDataSource('/vsimem/ogr_gml_83.gml') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 0), TIN EMPTY)')) with gdaltest.error_handler(): lyr.CreateFeature(f) ds = None gdal.Unlink('/vsimem/ogr_gml_83.gml') gdal.Unlink('/vsimem/ogr_gml_83.xsd') ############################################################################### def test_ogr_gml_srsname_only_on_top_bounded_by(): if not gdaltest.have_gml_reader: pytest.skip() tmpname = '/vsimem/test_ogr_gml_srsname_only_on_top_bounded_by.xml' gdal.FileFromMemBuffer(tmpname, """ 0 0 1 1 0,0 0,1 1,1 1,0 0,0 """) # Open once to generate .gfs ds = ogr.Open(tmpname) lyr = ds.GetLayer(0) assert '27700' in lyr.GetSpatialRef().ExportToWkt() ds = None # Open another time to read .gfs ds = ogr.Open(tmpname) lyr = ds.GetLayer(0) assert '27700' in lyr.GetSpatialRef().ExportToWkt() ds = None gdal.Unlink(tmpname) gdal.Unlink(tmpname[0:-3] + "gfs") ############################################################################### # Test understanding of XSD that uses 'FeatureType' suffix instead of 'Type'. # If schema was understood, fields 2/3/4 will be 'Real' rather than 'Integer'. def test_ogr_gml_featuretype_suffix_in_xsd(): if not gdaltest.have_gml_reader: pytest.skip() gdal.Unlink('data/arcgis-world-wfs.gfs') ds = ogr.Open('data/arcgis-world-wfs.gml,xsd=data/arcgis-world-wfs.xsd') lyr = ds.GetLayer(0) for i in range(2, 4): assert lyr.GetLayerDefn().GetFieldDefn(i).GetType() == ogr.OFTReal gdal.Unlink('data/arcgis-world-wfs.gfs') ############################################################################### # Cleanup def test_ogr_gml_cleanup(): if not gdaltest.have_gml_reader: pytest.skip() gdal.SetConfigOption('GML_SKIP_RESOLVE_ELEMS', None) gdal.SetConfigOption('GML_SAVE_RESOLVED_TO', None) gdaltest.clean_tmp() fl = gdal.ReadDir('/vsimem/') if fl is not None: print(fl) return test_ogr_gml_clean_files() def test_ogr_gml_clean_files(): try: os.remove('data/bom.gfs') except OSError: pass try: os.remove('data/utf8.gfs') except OSError: pass try: os.remove('data/ticket_2349_test_1.gfs') except OSError: pass try: os.remove('data/citygml.gfs') except OSError: pass try: os.remove('data/gnis_pop_100.gfs') except OSError: pass try: os.remove('data/gnis_pop_110.gfs') except OSError: pass try: os.remove('data/paris_typical_strike_demonstration.gfs') except OSError: pass try: os.remove('data/global_geometry.gfs') except OSError: pass try: os.remove('tmp/global_geometry.gfs') except OSError: pass try: os.remove('tmp/global_geometry.xml') except OSError: pass try: os.remove('data/curveProperty.gfs') except OSError: pass try: os.remove('tmp/ogr_gml_26.gml') os.remove('tmp/ogr_gml_26.xsd') except OSError: pass try: os.remove('tmp/ogr_gml_27.gml') os.remove('tmp/ogr_gml_27.xsd') except OSError: pass try: os.remove('tmp/ogr_gml_28.gml') os.remove('tmp/ogr_gml_28.gfs') except OSError: pass try: os.remove('tmp/GmlTopo-sample.sqlite') except OSError: pass try: os.remove('tmp/GmlTopo-sample.gfs') except OSError: pass try: os.remove('tmp/GmlTopo-sample.resolved.gml') except OSError: pass try: os.remove('tmp/GmlTopo-sample.xml') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.sqlite') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.gfs') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.resolved.gml') except OSError: pass try: os.remove('tmp/sample_gml_face_hole_negative_no.xml') except OSError: pass try: os.remove('data/wfs_typefeature.gfs') except OSError: pass try: os.remove('tmp/ogr_gml_51.gml') os.remove('tmp/ogr_gml_51.xsd') except OSError: pass try: os.remove('tmp/gmlattributes.gml') os.remove('tmp/gmlattributes.gfs') except OSError: pass files = os.listdir('data') for filename in files: if len(filename) > 13 and filename[-13:] == '.resolved.gml': os.unlink('data/' + filename) gdal.Unlink('data/test_xsi_nil_gfs.gfs') gdalautotest-3.0.4/ogr/ogr_wfs.py0000755003401500001440000056237213614005364016463 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_wfs.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: WFS driver testing. # Author: Even Rouault # ############################################################################### # 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. ############################################################################### try: from BaseHTTPServer import BaseHTTPRequestHandler except ImportError: from http.server import BaseHTTPRequestHandler import os import pytest import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import webserver ############################################################################### # Test underlying OGR drivers # pytestmark = pytest.mark.require_driver('WFS') @pytest.fixture(autouse=True, scope='module') def ogr_wfs_init(): gdaltest.wfs_drv = ogr.GetDriverByName('WFS') gdaltest.geoserver_wfs = None gdaltest.deegree_wfs = None gdaltest.ionic_wfs = None gml_ds = ogr.Open('data/ionic_wfs.gml') if gml_ds is None: gdaltest.wfs_drv = None if gdal.GetLastErrorMsg().find('Xerces') != -1: pytest.skip() pytest.skip('failed to open test file.') @pytest.fixture( params=['NO', None], scope='module', ids=['without-streaming', 'with-streaming'] ) def with_and_without_streaming(request): with gdaltest.config_option('OGR_WFS_USE_STREAMING', request.param): yield ############################################################################### # Test reading a MapServer WFS server @pytest.mark.skip() def test_ogr_wfs_mapserver(): if gdaltest.wfs_drv is None: pytest.skip() if gdaltest.gdalurlopen('http://www2.dmsolutions.ca/cgi-bin/mswfs_gmap') is None: pytest.skip('cannot open URL') ds = ogr.Open('WFS:http://www2.dmsolutions.ca/cgi-bin/mswfs_gmap') if ds is None: pytest.skip('did not managed to open WFS datastore') assert ds.GetLayerCount() == 2, 'did not get expected layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'park', 'did not get expected layer name' sr = lyr.GetSpatialRef() sr2 = osr.SpatialReference() sr2.ImportFromEPSG(42304) assert sr.IsSame(sr2), 'did not get expected SRS' feat_count = lyr.GetFeatureCount() assert feat_count == 46, 'did not get expected feature count' feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() geom_wkt = geom.ExportToWkt() if geom_wkt.find("POLYGON ((389366.84375 3791519.75") == -1: feat.DumpReadable() pytest.fail('did not get expected feature') ############################################################################### # Test reading a GeoServer WFS server @pytest.mark.skip('FIXME: re-enable after adapting test') def test_ogr_wfs_geoserver(): if gdaltest.wfs_drv is None: pytest.skip() if gdaltest.gdalurlopen('http://demo.opengeo.org/geoserver/wfs?TYPENAME=za:za_points&SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType') is None: gdaltest.geoserver_wfs = False pytest.skip('cannot open URL') gdaltest.geoserver_wfs = True ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=za:za_points') assert ds is not None, 'did not managed to open WFS datastore' assert ds.GetLayerCount() == 1, 'did not get expected layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'za:za_points', 'did not get expected layer name' sr = lyr.GetSpatialRef() sr2 = osr.SpatialReference() sr2.ImportFromEPSG(4326) assert sr.IsSame(sr2), 'did not get expected SRS' feat_count = lyr.GetFeatureCount() if feat_count < 14000: if gdal.GetLastErrorMsg().find('The connection attempt failed') != -1: gdaltest.geoserver_wfs = False pytest.skip('server probably in a broken state') print(feat_count) pytest.fail('did not get expected feature count') assert lyr.TestCapability(ogr.OLCFastFeatureCount), 'did not get OLCFastFeatureCount' ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=tiger:poi&MAXFEATURES=10&VERSION=1.1.0') if ds is None: pytest.skip('server perhaps overloaded') lyr = ds.GetLayer(0) gdal.ErrorReset() feat = lyr.GetNextFeature() # This error message is generally the sign of a server in a broken state if feat is None and gdal.GetLastErrorMsg().find('org.geoserver.platform.ServiceException') != -1: gdaltest.geoserver_wfs = False pytest.skip('server probably in a broken state') if feat.GetField('NAME') != 'museam' or \ ogrtest.check_feature_geometry(feat, 'POINT (-74.0104611 40.70758763)', max_error=0.000001) != 0: feat.DumpReadable() pytest.fail('did not get expected feature (1)') # Same with VERSION=1.0.0 ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=tiger:poi&MAXFEATURES=10&VERSION=1.0.0') if ds is None: pytest.skip('server perhaps overloaded') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('NAME') != 'museam' or \ ogrtest.check_feature_geometry(feat, 'POINT (-74.0104611 40.70758763)', max_error=0.000001) != 0: feat.DumpReadable() pytest.fail('did not get expected feature (2)') # Test attribute filter ds = ogr.Open("WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=tiger:poi") if ds is None: pytest.skip('server perhaps overloaded') lyr = ds.GetLayer(0) lyr.SetAttributeFilter("MAINPAGE is not null and NAME >= 'a' and NAME LIKE 'mu%%eam'") feat_count = lyr.GetFeatureCount() assert feat_count == 1, \ 'did not get expected feature count after SetAttributeFilter (1)' feat = lyr.GetNextFeature() if feat.GetField('gml_id') != 'poi.1': feat.DumpReadable() pytest.fail('did not get expected feature (3)') if False: # pylint: disable=using-constant-test # This GeoServer version doesn't understand lyr.SetAttributeFilter("gml_id = 'poi.1'") feat_count = lyr.GetFeatureCount() assert feat_count == 1, \ 'did not get expected feature count after SetAttributeFilter (2)' feat = lyr.GetNextFeature() if feat.GetField('gml_id') != 'poi.1': feat.DumpReadable() pytest.fail('did not get expected feature (4)') ############################################################################### # Test reading a GeoServer WFS server with OUTPUTFORMAT=json @pytest.mark.skip('FIXME: re-enable after adapting test') def test_ogr_wfs_geoserver_json(): if gdaltest.wfs_drv is None: pytest.skip() if not gdaltest.geoserver_wfs: pytest.skip() ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=za:za_points&MAXFEATURES=10&VERSION=1.1.0&OUTPUTFORMAT=json') assert ds is not None, 'did not managed to open WFS datastore' assert ds.GetLayerCount() == 1, 'did not get expected layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'za:za_points', 'did not get expected layer name' feat_count = lyr.GetFeatureCount() assert feat_count == 10, 'did not get expected feature count' assert lyr.TestCapability(ogr.OLCFastFeatureCount), \ 'did not get OLCFastFeatureCount' feat = lyr.GetNextFeature() # if feat.GetField('name') != 'Alexander Bay' or \ if ogrtest.check_feature_geometry(feat, 'POINT (16.4827778 -28.5947222)', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail('did not get expected feature') ############################################################################### # Test reading a GeoServer WFS server with OUTPUTFORMAT=SHAPE-ZIP @pytest.mark.skip('FIXME: re-enable after adapting test') def test_ogr_wfs_geoserver_shapezip(): if gdaltest.wfs_drv is None: pytest.skip() if not gdaltest.geoserver_wfs: pytest.skip() ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=za:za_points&MAXFEATURES=10&VERSION=1.1.0&OUTPUTFORMAT=SHAPE-ZIP') assert ds is not None, 'did not managed to open WFS datastore' assert ds.GetLayerCount() == 1, 'did not get expected layer count' lyr = ds.GetLayer(0) assert lyr.GetName() == 'za:za_points', 'did not get expected layer name' feat_count = lyr.GetFeatureCount() assert feat_count == 10, 'did not get expected feature count' assert lyr.TestCapability(ogr.OLCFastFeatureCount), \ 'did not get OLCFastFeatureCount' feat = lyr.GetNextFeature() # if feat.GetField('name') != 'Alexander Bay' or \ if ogrtest.check_feature_geometry(feat, 'POINT (16.4827778 -28.5947222)', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail('did not get expected feature') ############################################################################### # Test WFS paging @pytest.mark.skip('FIXME: re-enable after adapting test') def test_ogr_wfs_geoserver_paging(): if gdaltest.wfs_drv is None: pytest.skip() if not gdaltest.geoserver_wfs: pytest.skip() ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=og:bugsites&VERSION=1.1.0') lyr = ds.GetLayer(0) feature_count_ref = lyr.GetFeatureCount() page_size = (int)(feature_count_ref / 3) + 1 ds = None # Test with WFS 1.0.0 gdal.SetConfigOption('OGR_WFS_PAGING_ALLOWED', 'ON') gdal.SetConfigOption('OGR_WFS_PAGE_SIZE', '%d' % page_size) ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=og:bugsites&VERSION=1.0.0') gdal.SetConfigOption('OGR_WFS_PAGING_ALLOWED', None) gdal.SetConfigOption('OGR_WFS_PAGE_SIZE', None) assert ds is not None, 'did not managed to open WFS datastore' lyr = ds.GetLayer(0) feature_count_wfs100 = lyr.GetFeatureCount() ds = None assert feature_count_wfs100 == feature_count_ref # Test with WFS 1.1.0 gdal.SetConfigOption('OGR_WFS_PAGING_ALLOWED', 'ON') gdal.SetConfigOption('OGR_WFS_PAGE_SIZE', '%d' % page_size) ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?TYPENAME=og:bugsites&VERSION=1.1.0') gdal.SetConfigOption('OGR_WFS_PAGING_ALLOWED', None) gdal.SetConfigOption('OGR_WFS_PAGE_SIZE', None) assert ds is not None, 'did not managed to open WFS datastore' lyr = ds.GetLayer(0) feature_count_wfs110 = lyr.GetFeatureCount() feature_count_wfs110_at_hand = 0 lyr.ResetReading() feat = lyr.GetNextFeature() while feat is not None: feature_count_wfs110_at_hand = feature_count_wfs110_at_hand + 1 feat = lyr.GetNextFeature() ds = None assert feature_count_wfs110 == feature_count_ref, feature_count_wfs100 assert feature_count_wfs110_at_hand == feature_count_ref ############################################################################### # Test reading a Deegree WFS server @pytest.mark.skip() def test_ogr_wfs_deegree(): if gdaltest.wfs_drv is None: pytest.skip() if gdaltest.gdalurlopen('http://demo.deegree.org:80/utah-workspace') is None: gdaltest.deegree_wfs = False pytest.skip('cannot open URL') gdaltest.deegree_wfs = True ds = ogr.Open("WFS:http://demo.deegree.org:80/utah-workspace/services/wfs?ACCEPTVERSIONS=1.1.0&MAXFEATURES=10") if ds is None: if gdal.GetLastErrorMsg().find('Error returned by server') < 0: gdaltest.deegree_wfs = False pytest.skip() pytest.fail('did not managed to open WFS datastore') lyr = ds.GetLayerByName('app:SGID024_Springs') assert lyr.GetName() == 'app:SGID024_Springs', 'did not get expected layer name' sr = lyr.GetSpatialRef() sr2 = osr.SpatialReference() sr2.ImportFromEPSG(26912) assert sr.IsSame(sr2), 'did not get expected SRS' feat = lyr.GetNextFeature() if feat.GetField('OBJECTID') != 1 or \ ogrtest.check_feature_geometry(feat, 'POINT (558750.703 4402882.05)', max_error=0.000000001) != 0: feat.DumpReadable() pytest.fail('did not get expected feature') # Test attribute filter ds = ogr.Open("WFS:http://demo.deegree.org:80/utah-workspace/services/wfs?ACCEPTVERSIONS=1.1.0") lyr = ds.GetLayerByName('app:SGID024_Springs') lyr.SetAttributeFilter('OBJECTID = 9 or OBJECTID = 100 or (OBJECTID >= 20 and OBJECTID <= 30 and OBJECTID != 27)') feat_count = lyr.GetFeatureCount() if feat_count != 12: if gdal.GetLastErrorMsg().find('XML parsing of GML file failed') < 0 and \ gdal.GetLastErrorMsg().find('No suitable driver found') < 0: print(feat_count) pytest.fail('did not get expected feature count after SetAttributeFilter') # Test attribute filter with gml_id # lyr.SetAttributeFilter("gml_id = 'SGID024_Springs30' or gml_id = 'SGID024_Springs100'") # feat_count = lyr.GetFeatureCount() # if feat_count != 2: # gdaltest.post_reason('did not get expected feature count after SetAttributeFilter (2)') # print(feat_count) # return 'fail' ############################################################################### # Run test_ogrsf @pytest.mark.skip() def test_ogr_wfs_test_ogrsf(): if gdaltest.wfs_drv is None: pytest.skip() if not gdaltest.deegree_wfs: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro "WFS:http://demo.deegree.org:80/utah-workspace/services/wfs?ACCEPTVERSIONS=1.1.0&MAXFEATURES=10" app:SGID024_Springs') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### do_log = False class WFSHTTPHandler(BaseHTTPRequestHandler): def log_request(self, code='-', size='-'): pass def do_GET(self): try: if do_log: f = open('/tmp/log.txt', 'a') f.write('GET %s\n' % self.path) f.close() if self.path.find('/fakewfs') != -1: if self.path == '/fakewfs?SERVICE=WFS&REQUEST=GetCapabilities' or \ self.path == '/fakewfs?SERVICE=WFS&REQUEST=GetCapabilities&ACCEPTVERSIONS=1.1.0,1.0.0': self.send_response(200) self.send_header('Content-type', 'application/xml') self.end_headers() f = open('data/get_capabilities.xml', 'rb') content = f.read() f.close() self.wfile.write(content) return if self.path == '/fakewfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=rijkswegen': self.send_response(200) self.send_header('Content-type', 'application/xml') self.end_headers() f = open('data/describe_feature_type.xml', 'rb') content = f.read() f.close() self.wfile.write(content) return if self.path == '/fakewfs?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=rijkswegen': self.send_response(200) self.send_header('Content-type', 'application/xml') self.end_headers() f = open('data/get_feature.xml', 'rb') content = f.read() f.close() self.wfile.write(content) return return except IOError: pass self.send_error(404, 'File Not Found: %s' % self.path) ############################################################################### # Test reading a local fake WFS server def test_ogr_wfs_fake_wfs_server(): if gdaltest.wfs_drv is None: pytest.skip() (process, port) = webserver.launch(handler=WFSHTTPHandler) if port == 0: pytest.skip() gdal.SetConfigOption('OGR_WFS_LOAD_MULTIPLE_LAYER_DEFN', 'NO') ds = ogr.Open("WFS:http://127.0.0.1:%d/fakewfs" % port) gdal.SetConfigOption('OGR_WFS_LOAD_MULTIPLE_LAYER_DEFN', None) if ds is None: webserver.server_stop(process, port) pytest.fail('did not managed to open WFS datastore') lyr = ds.GetLayerByName('rijkswegen') if lyr.GetName() != 'rijkswegen': print(lyr.GetName()) webserver.server_stop(process, port) pytest.fail('did not get expected layer name') sr = lyr.GetSpatialRef() sr2 = osr.SpatialReference() sr2.ImportFromEPSG(28992) if not sr.IsSame(sr2): print(sr) webserver.server_stop(process, port) pytest.fail('did not get expected SRS') feat = lyr.GetNextFeature() if feat.GetField('MPLength') != '33513.' or \ ogrtest.check_feature_geometry(feat, 'MULTICURVE ((154898.65286 568054.62753,160108.36082 566076.78094,164239.254332 563024.70188,170523.31535 561231.219583,172676.42256 559253.37299,175912.80562 557459.89069,180043.699132 553508.779495,183294.491306 552250.182732))', max_error=0.00001) != 0: feat.DumpReadable() webserver.server_stop(process, port) pytest.fail('did not get expected feature') webserver.server_stop(process, port) ############################################################################### # Test CreateFeature() / UpdateFeature() / DeleteFeature() (WFS-T) @pytest.mark.skip('FIXME: re-enable after adapting test') def test_ogr_wfs_geoserver_wfst(): if gdaltest.wfs_drv is None: pytest.skip() if not gdaltest.geoserver_wfs: pytest.skip() ds = ogr.Open('WFS:http://demo.opengeo.org/geoserver/wfs?VERSION=1.1.0', update=1) assert ds is not None lyr = ds.GetLayerByName('za:za_points') geom = ogr.CreateGeometryFromWkt('POINT(0 89.5)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) # feat.SetField('name', 'name_set_by_ogr_wfs_8_test') feat.SetField('type', 'type_set_by_ogr_wfs_8_test') if lyr.CreateFeature(feat) != 0: # Likely a bug in the current GeoServer version ?? if gdal.GetLastErrorMsg().find("No such property 'typeName'") >= 0: pytest.skip() pytest.fail('cannot create feature') print('Feature %d created !' % feat.GetFID()) feat.SetField('type', 'type_modified_by_ogr_wfs_8_test') assert lyr.SetFeature(feat) == 0, 'cannot update feature' print('Feature %d updated !' % feat.GetFID()) assert lyr.DeleteFeature(feat.GetFID()) == 0, 'could not delete feature' print('Feature %d deleted !' % feat.GetFID()) # Test transactions assert lyr.StartTransaction() == 0, 'CommitTransaction() failed' geom = ogr.CreateGeometryFromWkt('POINT(0 89.5)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) # feat.SetField('name', 'name_set_by_ogr_wfs_8_test') feat.SetField('type', 'type_set_by_ogr_wfs_8_test') assert lyr.CreateFeature(feat) == 0, 'cannot create feature' geom = ogr.CreateGeometryFromWkt('POINT(0 89.5)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) # feat.SetField('name', 'name_set_by_ogr_wfs_8_test_2') feat.SetField('type', 'type_set_by_ogr_wfs_8_test_2') assert lyr.CreateFeature(feat) == 0, 'cannot create feature' assert lyr.CommitTransaction() == 0, 'CommitTransaction() failed' # Retrieve inserted features print('Retrieving created features gml:id') sql_lyr = ds.ExecuteSQL("SELECT _LAST_INSERTED_FIDS_ FROM za:za_points") feat = sql_lyr.GetNextFeature() while feat is not None: gml_id = feat.GetFieldAsString(0) print('Feature %s has been created in transaction !' % gml_id) feat = sql_lyr.GetNextFeature() feat = None count = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) assert count == 2, 'did not get expected feature count' # Delete a bunch of features print('Deleting created features') sql_lyr = ds.ExecuteSQL("DELETE FROM za:za_points WHERE type = 'type_set_by_ogr_wfs_8_test' OR type = 'type_set_by_ogr_wfs_8_test_2'") ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test CreateFeature() / UpdateFeature() / DeleteFeature() with expected # failure due to server not allowing insert & delete @pytest.mark.skip() def test_ogr_wfs_deegree_wfst(): if gdaltest.gdalurlopen('http://testing.deegree.org/deegree-wfs/services') is None: pytest.skip('cannot open URL') ds = ogr.Open('WFS:http://testing.deegree.org/deegree-wfs/services', update=1) assert ds is not None lyr = ds.GetLayerByName('app:CountyBoundaries_edited') geom = ogr.CreateGeometryFromWkt('POINT(2 49)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) feat.SetField('name', 'nameSetByOGR') feat.SetField('fips', '10') feat.SetField('feature_id', '123456') feat.SetField('OBJECTID', '7890123') feat.SetField('shape_area', 12.34) feat.SetField('shape_len', 56.78) ret = lyr.CreateFeature(feat) if ret != 0: print('expected fail on CreateFeature') ret = lyr.DeleteFeature(1) if ret != 0: print('expected fail on DeleteFeature') feat = lyr.GetFeature(10) ret = lyr.SetFeature(feat) if ret != 0: print('expected fail on SetFeature') ############################################################################### # Test CreateFeature() / UpdateFeature() / DeleteFeature() on a WFS 1.0.0 server @pytest.mark.skip() def test_ogr_wfs_ionic_wfst(): if gdaltest.gdalurlopen('http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA') is None: gdaltest.ionic_wfs = False pytest.skip('cannot open URL') gdaltest.ionic_wfs = True ds = ogr.Open('WFS:http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA', update=1) if ds is None: if gdal.GetLastErrorMsg().find('HTTP error code : 403') != -1: gdaltest.ionic_wfs = False pytest.skip() pytest.fail() lyr = ds.GetLayerByName('wfs:BUSINESS') geom = ogr.CreateGeometryFromWkt('POINT(234000 890000)') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) feat.SetField('NAME', 'nameSetByOGR') feat.SetField('TOTAL_EMPLOYEES', '10') ret = lyr.CreateFeature(feat) assert ret == 0, 'fail on CreateFeature' gmlid = feat.GetField('gml_id') ret = lyr.SetFeature(feat) assert ret == 0, 'fail on SetFeature' ds.ExecuteSQL("DELETE FROM wfs:BUSINESS WHERE gml_id = '%s'" % gmlid) ############################################################################### # Test ExecuteSQL() where SQL should be turned into PROPERTYNAME and FILTER parameters @pytest.mark.skip() def test_ogr_wfs_ionic_sql(): if not gdaltest.ionic_wfs: pytest.skip() ds = ogr.Open('WFS:http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA') assert ds is not None lyr = ds.ExecuteSQL("SELECT name FROM \"wfs:BUSINESS\" WHERE total_employees = 105") count = lyr.GetFeatureCount() ds.ReleaseResultSet(lyr) assert count == 1 ############################################################################### # Test opening a datasource from a XML description file # The following test should issue 0 WFS http request def test_ogr_wfs_xmldescriptionfile(): ds = ogr.Open('data/testwfs.xml') lyr = ds.GetLayer(0) feature_defn = lyr.GetLayerDefn() index = feature_defn.GetFieldIndex('name') sr = lyr.GetSpatialRef() assert index == 1 wkt = sr.ExportToWkt() assert wkt.find('WGS 84') != -1 layermetadata = ds.GetLayerByName('WFSLayerMetadata') count_layers = layermetadata.GetFeatureCount() assert count_layers == ds.GetLayerCount(), 'count_layers != ds.GetLayerCount()' getcapabilitieslayer = ds.GetLayerByName('WFSGetCapabilities') getcapabilitieslayer_feat = getcapabilitieslayer.GetNextFeature() getcapabilitieslayer_content = getcapabilitieslayer_feat.GetFieldAsString(0) assert getcapabilitieslayer_content.startswith('\n') f.write('http://demo.opengeo.org/geoserver/wfs\n') f.write('\n') f.close() # Should only emit GetCapabilities and serialize it ds = ogr.Open('tmp/ogr_wfs_xmldescriptionfile_to_be_updated.xml') assert ds is not None ds = None f = open('tmp/ogr_wfs_xmldescriptionfile_to_be_updated.xml', 'rt') content = f.read() assert content.find('WFS_Capabilities') != -1, \ 'XML description file was not filled as expected' assert content.find('') != -1, \ 'XML description file was not filled as expected' f.close() os.unlink('tmp/ogr_wfs_xmldescriptionfile_to_be_updated.xml') ############################################################################### # Test opening a datasource directly from a GetCapabilities answer XML file # The following test should issue 0 WFS http request def test_ogr_wfs_getcapabilitiesfile(): ds = ogr.Open('data/getcapabilities_wfs.xml') if ds is None: gdal.Unlink('data/getcapabilities_wfs.gfs') pytest.fail() ds = None gdal.Unlink('data/getcapabilities_wfs.gfs') ############################################################################### # Test opening a datastore which only support GML 3.2.1 output @pytest.mark.skip() def test_ogr_wfs_deegree_gml321(): ds = ogr.Open('WFS:http://demo.deegree.org:80/inspire-workspace/services/wfs?ACCEPTVERSIONS=1.1.0&MAXFEATURES=10') if ds is None: if gdaltest.gdalurlopen('http://demo.deegree.org:80/inspire-workspace/services/wfs?ACCEPTVERSIONS=1.1.0') is None: pytest.skip('cannot open URL') if gdal.GetLastErrorMsg().find("Unable to determine the subcontroller for request type 'GetCapabilities' and service type 'WFS'") != -1: pytest.skip() pytest.fail() lyr = ds.GetLayerByName("ad:Address") gdal.ErrorReset() lyr.GetFeatureCount() assert gdal.GetLastErrorMsg() == '' ############################################################################### # Test WFS 2.0.0 support @pytest.mark.skip() def test_ogr_wfs_deegree_wfs200(): ds = ogr.Open('WFS:http://demo.deegree.org:80/utah-workspace/services/wfs?ACCEPTVERSIONS=2.0.0') if ds is None: if gdaltest.gdalurlopen('http://demo.deegree.org:80/utah-workspace/services/wfs?ACCEPTVERSIONS=2.0.0') is None: pytest.skip('cannot open URL') pytest.fail() lyr = ds.GetLayerByName("app:SGID024_Municipalities2004_edited") lyr.SetAttributeFilter('OBJECTID = 5') count = lyr.GetFeatureCount() if count != 1: if gdal.GetLastErrorMsg().find('HTTP error code : 500') < 0: print(count) pytest.fail("OBJECTID = 5 filter failed") else: feat = lyr.GetNextFeature() if feat.GetFieldAsInteger('OBJECTID') != 5: feat.DumpReadable() pytest.fail("OBJECTID = 5 filter failed") lyr.SetAttributeFilter("gml_id = 'SGID024_MUNICIPALITIES2004_EDITED_5'") count = lyr.GetFeatureCount() if count != 1: # FIXME ! Avoid failure on ogr_wfs_deegree_wfs200 (the server is likely buggy since it worked before, but no longer whereas the WFS client code hasn't changed) print("gml_id = 'SGID024_MUNICIPALITIES2004_EDITED_5' filter failed") # gdaltest.post_reason("gml_id = 'SGID024_MUNICIPALITIES2004_EDITED_5' filter failed") # print(count) # return 'fail' else: feat = lyr.GetNextFeature() if feat.GetFieldAsInteger('OBJECTID') != 6: feat.DumpReadable() pytest.fail("gml_id = 'SGID024_MUNICIPALITIES2004_EDITED_5' filter failed") lyr.SetAttributeFilter(None) lyr.SetSpatialFilterRect(-1e8, -1e8, 1e8, 1e8) spatialfiltercount = lyr.GetFeatureCount() lyr.SetSpatialFilter(None) allcount = lyr.GetFeatureCount() assert allcount == spatialfiltercount and allcount != 0, \ 'spatialfiltercount != allcount' ############################################################################### # Test WFS SORTBY support @pytest.mark.skip() def test_ogr_wfs_deegree_sortby(): ds = ogr.Open('WFS:http://demo.deegree.org:80/utah-workspace/services/wfs?MAXFEATURES=10&VERSION=1.1.0') if ds is None: if gdaltest.gdalurlopen('http://demo.deegree.org:80/utah-workspace/services/wfs') is None: pytest.skip('cannot open URL') pytest.fail() lyr = ds.ExecuteSQL("SELECT * FROM \"app:SGID024_Municipalities2004_edited\" ORDER BY OBJECTID DESC") feat = lyr.GetNextFeature() if feat.GetFieldAsInteger('OBJECTID') != 240: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsInteger('OBJECTID') != 239: feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(lyr) ############################################################################### def ogr_wfs_get_multiple_layer_defn(url): if not gdaltest.run_slow_tests(): pytest.skip() ds = ogr.Open('WFS:' + url) if ds is None: if gdaltest.gdalurlopen(url) is None: pytest.skip('cannot open URL') pytest.fail() # This should be slow only for the first layer for i in range(0, ds.GetLayerCount()): lyr = ds.GetLayer(i) print('Layer %s has %d fields' % (lyr.GetName(), lyr.GetLayerDefn().GetFieldCount())) ############################################################################### # Test a ESRI server @pytest.mark.skip() def test_ogr_wfs_esri(): return ogr_wfs_get_multiple_layer_defn('http://map.ngdc.noaa.gov/wfsconnector/com.esri.wfs.Esrimap/dart_atlantic_f') ############################################################################### # Test a ESRI server def test_ogr_wfs_esri_2(): return ogr_wfs_get_multiple_layer_defn('http://sentinel.ga.gov.au/wfsconnector/com.esri.wfs.Esrimap') ############################################################################### # Test a CubeWerx server def test_ogr_wfs_cubewerx(): return ogr_wfs_get_multiple_layer_defn('http://portal.cubewerx.com/cubewerx/cubeserv/cubeserv.cgi?CONFIG=haiti_vgi&DATASTORE=vgi') ############################################################################### # Test a TinyOWS server def test_ogr_wfs_tinyows(): return ogr_wfs_get_multiple_layer_defn('http://www.tinyows.org/cgi-bin/tinyows') ############################################################################### # Test a ERDAS Apollo server def test_ogr_wfs_erdas_apollo(): return ogr_wfs_get_multiple_layer_defn('http://apollo.erdas.com/erdas-apollo/vector/Cherokee') ############################################################################### # Test a Integraph server def test_ogr_wfs_intergraph(): return ogr_wfs_get_multiple_layer_defn('http://ideg.xunta.es/WFS_POL/request.aspx') ############################################################################### # Test a MapInfo server def test_ogr_wfs_mapinfo(): return ogr_wfs_get_multiple_layer_defn('http://www.mapinfo.com/miwfs') ############################################################################### def test_ogr_wfs_vsimem_fail_because_not_enabled(with_and_without_streaming): gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None ############################################################################### def test_ogr_wfs_vsimem_fail_because_no_get_capabilities(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None ############################################################################### def test_ogr_wfs_vsimem_fail_because_empty_response(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Empty content returned by server') >= 0 ############################################################################### def test_ogr_wfs_vsimem_fail_because_no_WFS_Capabilities(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find ') >= 0 ############################################################################### def test_ogr_wfs_vsimem_fail_because_exception(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', '') gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Error returned by server : ') >= 0 ############################################################################### def test_ogr_wfs_vsimem_fail_because_invalid_xml_capabilities(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', '= 0 ############################################################################### def test_ogr_wfs_vsimem_fail_because_missing_featuretypelist(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ """) gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find ') >= 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_open_getcapabilities_file(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/caps.xml', """= 0 gdal.FileFromMemBuffer('/vsimem/caps.xml', """ """) gdal.PushErrorHandler() ds = ogr.Open('/vsimem/caps.xml') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find ') >= 0 gdal.FileFromMemBuffer('/vsimem/caps.xml', """ my_layer """) gdal.PushErrorHandler() ds = ogr.Open('/vsimem/caps.xml') gdal.PopErrorHandler() assert ds is None assert gdal.GetLastErrorMsg().find('Cannot find base URL') >= 0 gdal.FileFromMemBuffer('/vsimem/caps.xml', """ my_layer """) ds = ogr.Open('/vsimem/caps.xml') assert ds is not None assert ds.GetLayerCount() == 1 ############################################################################### def test_ogr_wfs_vsimem_wfs110_minimal_instance(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') # Invalid response, but enough for use gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ LDS Testing """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') assert ds is not None assert ds.GetLayerCount() == 0 assert ds.GetMetadataDomainList() == ['', 'xml:capabilities'] assert ds.GetMetadata() == {'TITLE': 'LDS Testing'} assert len(ds.GetMetadata_List("xml:capabilities")) == 1 gdal.PushErrorHandler() ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) gdal.PopErrorHandler() assert ds is None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_missing_describefeaturetype(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') # Invalid response, but enough for use gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') assert ds is not None assert ds.GetLayerCount() == 1 lyr = ds.GetLayer(0) assert lyr.GetName() == 'my_layer' # Missing DescribeFeatureType gdal.ErrorReset() gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert lyr_defn.GetFieldCount() == 0 lyr_defn = lyr.GetLayerDefn() ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_invalid_describefeaturetype(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) gdal.ErrorReset() gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert lyr_defn.GetFieldCount() == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_describefeaturetype(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 8 assert lyr_defn.GetGeomFieldCount() == 1 ds = gdal.OpenEx('WFS:/vsimem/wfs_endpoint', open_options=['EXPOSE_GML_ID=NO']) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 7 gdal.SetConfigOption('GML_EXPOSE_GML_ID', 'YES') ds = gdal.OpenEx('WFS:/vsimem/wfs_endpoint', open_options=['EXPOSE_GML_ID=NO']) gdal.SetConfigOption('GML_EXPOSE_GML_ID', None) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 7 gdal.SetConfigOption('GML_EXPOSE_GML_ID', 'NO') ds = gdal.OpenEx('WFS:/vsimem/wfs_endpoint', open_options=['EXPOSE_GML_ID=YES']) gdal.SetConfigOption('GML_EXPOSE_GML_ID', None) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 8 gdal.SetConfigOption('GML_EXPOSE_GML_ID', 'NO') ds = gdal.OpenEx('WFS:/vsimem/wfs_endpoint') gdal.SetConfigOption('GML_EXPOSE_GML_ID', None) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 7 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_xmldescriptionfile_to_be_updated(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml', """ /vsimem/wfs_endpoint """) ds = ogr.Open('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml') lyr = ds.GetLayer(0) assert lyr.GetName() == 'my_layer' ds = None f = gdal.VSIFOpenL('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert data == """ /vsimem/wfs_endpoint my_layer """ ds = ogr.Open('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml') lyr = ds.GetLayer(0) lyr.GetLayerDefn() ds = None f = gdal.VSIFOpenL('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml', 'rb') data = gdal.VSIFReadL(1, 100000, f).decode('ascii') gdal.VSIFCloseL(f) assert data == """ /vsimem/wfs_endpoint my_layer """ gdal.FileFromMemBuffer('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml', """ /vsimem/wfs_endpoint my_layer """) ds = ogr.Open('/vsimem/ogr_wfs_xmldescriptionfile_to_be_updated.xml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 ds = None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_missing_getfeaturecount_no_hits(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler() count = lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert count == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_missing_getfeaturecount_with_hits(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ results hits my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler() count = lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert count == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_invalid_getfeaturecount_with_hits(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&RESULTTYPE=hits', """""") gdal.ErrorReset() gdal.PushErrorHandler() count = lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert count == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getfeaturecount_with_hits_invalid_xml(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&RESULTTYPE=hits', """""") gdal.ErrorReset() gdal.PushErrorHandler() count = lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert count == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getfeaturecount_with_hits_missing_numberOfFeatures(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&RESULTTYPE=hits', """""") gdal.ErrorReset() gdal.PushErrorHandler() count = lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert count == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getfeaturecount_with_hits(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&RESULTTYPE=hits', """ """) count = lyr.GetFeatureCount() assert count == 1 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_missing_getfeature(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f is None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_invalid_getfeature(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer', """ """) gdal.ErrorReset() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Error returned by server') >= 0 assert f is None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getfeature(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -170.0 -80.0 170.0 80.0 """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) f = lyr.GetNextFeature() if f.gml_id != 'my_layer.1' or f.boolean != 1 or f.str != 'str' or f.short != 1 or \ f.int != 123456789 or f.float != 1.2 or f.double != 1.23 or f.dt != '2015-04-17T12:34:56Z' or \ f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() sql_lyr = ds.ExecuteSQL('SELECT * FROM my_layer') f = sql_lyr.GetNextFeature() if f.gml_id != 'my_layer.1': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getextent(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) assert lyr.GetExtent() == (2, 2, 49, 49) ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getextent_without_getfeature(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.Unlink('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.PushErrorHandler() extent = lyr.GetExtent() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert extent == (0, 0, 0, 0) ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getextent_optimized(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 my_layer2 urn:ogc:def:crs:EPSG::4326 -170.0 -80.0 170.0 80.0 my_layer3 urn:ogc:def:crs:EPSG::3857 -180.0 -85.0511287798065 180.0 85.0511287798065 my_layer4 urn:ogc:def:crs:EPSG::3857 -180.0 -90 180.0 90 abs_4 """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) assert lyr.GetExtent() == (-180.0, 180.0, -90.0, 90.0) lyr = ds.GetLayer(1) gdal.PushErrorHandler() got_extent = lyr.GetExtent() gdal.PopErrorHandler() assert got_extent == (0.0, 0.0, 0.0, 0.0) ds = gdal.OpenEx('WFS:/vsimem/wfs_endpoint', open_options=['TRUST_CAPABILITIES_BOUNDS=YES']) lyr = ds.GetLayer(1) assert lyr.GetExtent() == (-170.0, 170.0, -80.0, 80.0) gdal.SetConfigOption('OGR_WFS_TRUST_CAPABILITIES_BOUNDS', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') gdal.SetConfigOption('OGR_WFS_TRUST_CAPABILITIES_BOUNDS', None) lyr = ds.GetLayer(2) expected_extent = (-20037508.342789248, 20037508.342789248, -20037508.342789154, 20037508.342789147) got_extent = lyr.GetExtent() for i in range(4): assert abs(expected_extent[i] - got_extent[i]) <= 1e-5 ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_getfeature_ogr_getfeature(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 gml:Envelope gml:Point gml:LineString gml:Polygon LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo EqualTo NotEqualTo Like Between NullCheck """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CGmlObjectId%20id%3D%22my_layer.100%22%2F%3E%3C%2FFilter%3E', """ """) f = lyr.GetFeature(100) if f.gml_id != 'my_layer.100': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_filter_gml_id_failed(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer', """ """) lyr.SetAttributeFilter("gml_id = 'my_layer.1'") gdal.ErrorReset() gdal.PushErrorHandler() f = lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' assert f is None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_filter_gml_id_success(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CGmlObjectId%20id%3D%22my_layer.1%22%2F%3E%3CGmlObjectId%20id%3D%22my_layer.1%22%2F%3E%3C%2FFilter%3E', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) lyr.SetAttributeFilter("gml_id = 'my_layer.1' OR gml_id = 'my_layer.1'") f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_filter(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3COr%3E%3COr%3E%3COr%3E%3COr%3E%3COr%3E%3COr%3E%3COr%3E%3CAnd%3E%3CAnd%3E%3CPropertyIsEqualTo%3E%3CPropertyName%3Estr%3C%2FPropertyName%3E%3CLiteral%3Estr%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E%3CPropertyIsEqualTo%3E%3CPropertyName%3Eshort%3C%2FPropertyName%3E%3CLiteral%3E1%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E%3C%2FAnd%3E%3CPropertyIsEqualTo%3E%3CPropertyName%3Efloat%3C%2FPropertyName%3E%3CLiteral%3E1.2%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E%3C%2FAnd%3E%3CPropertyIsLike%20wildCard%3D%27%2A%27%20singleChar%3D%27_%27%20escapeChar%3D%27%21%27%3E%3CPropertyName%3Estr%3C%2FPropertyName%3E%3CLiteral%3Est%2A%3C%2FLiteral%3E%3C%2FPropertyIsLike%3E%3C%2FOr%3E%3CNot%3E%3CPropertyIsNull%3E%3CPropertyName%3Eboolean%3C%2FPropertyName%3E%3C%2FPropertyIsNull%3E%3C%2FNot%3E%3C%2FOr%3E%3CPropertyIsGreaterThan%3E%3CPropertyName%3Eint%3C%2FPropertyName%3E%3CLiteral%3E1%3C%2FLiteral%3E%3C%2FPropertyIsGreaterThan%3E%3C%2FOr%3E%3CPropertyIsGreaterThanOrEqualTo%3E%3CPropertyName%3Eint%3C%2FPropertyName%3E%3CLiteral%3E1%3C%2FLiteral%3E%3C%2FPropertyIsGreaterThanOrEqualTo%3E%3C%2FOr%3E%3CPropertyIsNotEqualTo%3E%3CPropertyName%3Eint%3C%2FPropertyName%3E%3CLiteral%3E2%3C%2FLiteral%3E%3C%2FPropertyIsNotEqualTo%3E%3C%2FOr%3E%3CPropertyIsLessThan%3E%3CPropertyName%3Eint%3C%2FPropertyName%3E%3CLiteral%3E2000000000%3C%2FLiteral%3E%3C%2FPropertyIsLessThan%3E%3C%2FOr%3E%3CPropertyIsLessThanOrEqualTo%3E%3CPropertyName%3Eint%3C%2FPropertyName%3E%3CLiteral%3E2000000000%3C%2FLiteral%3E%3C%2FPropertyIsLessThanOrEqualTo%3E%3C%2FOr%3E%3C%2FFilter%3E', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) lyr.SetAttributeFilter("(str = 'str' AND short = 1 AND float = 1.2) OR str LIKE 'st%' OR boolean IS NOT NULL OR int > 1 OR int >= 1 or int != 2 or int < 2000000000 or int <= 2000000000") f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_filter_spatial_ops(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) content = """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """ # Invalid syntax gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape)") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong number of arguments for ST_Intersects') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, 5)") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 2 of ST_Intersects') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong number of arguments for ST_MakeEnvelope') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1,1,1,'a'))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 4 of ST_MakeEnvelope') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1,1,1,1,3.5))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 5 of ST_MakeEnvelope') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1,1,1,1,'not_a_srs'))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong value for argument 5 of ST_MakeEnvelope') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1,1,1,1,-5))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong value for argument 5 of ST_MakeEnvelope') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_GeomFromText(1,2,3))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong number of arguments for ST_GeomFromText') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_GeomFromText(1))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 1 of ST_GeomFromText') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_GeomFromText('INVALID_GEOM'))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong value for argument 1 of ST_GeomFromText') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_Intersects(shape, ST_GeomFromText('POINT(0 0)', 'invalid_srs'))") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong value for argument 2 of ST_GeomFromText') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_DWithin(shape)") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong number of arguments for ST_DWithin') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_DWithin(shape,'a',5)") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 2 of ST_DWithin') < 0) gdal.PushErrorHandler() ret = lyr.SetAttributeFilter("ST_DWithin(shape,shape,'a')") gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Wrong field type for argument 3 of ST_DWithin') < 0) # Now valid requests gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3COr%3E%3COr%3E%3COr%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Envelope%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%3E%3Cgml:lowerCorner%3E48.5%201.5%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E49.5%202.5%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3C%2FIntersects%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Envelope%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%3E%3Cgml:lowerCorner%3E48.5%201.5%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E49.5%202.5%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3C%2FIntersects%3E%3C%2FOr%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Envelope%20srsName%3D%22EPSG:4326%22%3E%3Cgml:lowerCorner%3E1.5%2048.5%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E2.5%2049.5%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3C%2FIntersects%3E%3C%2FOr%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Envelope%20srsName%3D%22urn:ogc:def:crs:EPSG::32630%22%3E%3Cgml:lowerCorner%3E380000%205370000%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E470000%205490000%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3C%2FIntersects%3E%3C%2FOr%3E%3C%2FFilter%3E', content) lyr.SetAttributeFilter("ST_Intersects(shape, ST_MakeEnvelope(1.5,48.5,2.5,49.5)) OR " + "ST_Intersects(shape, ST_MakeEnvelope(1.5,48.5,2.5,49.5, 4326)) OR " + "ST_Intersects(shape, ST_MakeEnvelope(1.5,48.5,2.5,49.5, 'EPSG:4326')) OR " + "ST_Intersects(shape, ST_MakeEnvelope(380000,5370000,470000,5490000,32630))") f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3COr%3E%3COr%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Polygon%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%20gml:id%3D%22id1%22%3E%3Cgml:exterior%3E%3Cgml:LinearRing%3E%3Cgml:posList%3E48.5%201.5%2049.5%202.5%2049.5%202.5%2048.5%202.5%2048.5%201.5%3C%2Fgml:posList%3E%3C%2Fgml:LinearRing%3E%3C%2Fgml:exterior%3E%3C%2Fgml:Polygon%3E%3C%2FIntersects%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Polygon%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%20gml:id%3D%22id2%22%3E%3Cgml:exterior%3E%3Cgml:LinearRing%3E%3Cgml:posList%3E48.5%201.5%2049.5%202.5%2049.5%202.5%2048.5%202.5%2048.5%201.5%3C%2Fgml:posList%3E%3C%2Fgml:LinearRing%3E%3C%2Fgml:exterior%3E%3C%2Fgml:Polygon%3E%3C%2FIntersects%3E%3C%2FOr%3E%3CIntersects%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Polygon%20srsName%3D%22EPSG:4326%22%20gml:id%3D%22id3%22%3E%3Cgml:exterior%3E%3Cgml:LinearRing%3E%3Cgml:posList%3E1.5%2048.5%202.5%2049.5%202.5%2049.5%202.5%2048.5%201.5%2048.5%3C%2Fgml:posList%3E%3C%2Fgml:LinearRing%3E%3C%2Fgml:exterior%3E%3C%2Fgml:Polygon%3E%3C%2FIntersects%3E%3C%2FOr%3E%3C%2FFilter%3E', content) lyr.SetAttributeFilter("ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))')) OR " + "ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))', 4326)) OR " + "ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))', 'EPSG:4326'))") f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CDWithin%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Envelope%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%3E%3Cgml:lowerCorner%3E48.5%201.5%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E49.5%202.5%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3CDistance%20unit%3D%22m%22%3E5%3C%2FDistance%3E%3C%2FDWithin%3E%3C%2FFilter%3E', content) lyr.SetAttributeFilter("ST_DWithin(shape,ST_MakeEnvelope(1.5,48.5,2.5,49.5),5)") f = lyr.GetNextFeature() assert f is not None sql_lyr = ds.ExecuteSQL("SELECT * FROM my_layer WHERE ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))')) OR " + "ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))', 4326)) OR " + "ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5)))', 'EPSG:4326'))") f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) # Error case sql_lyr = ds.ExecuteSQL("SELECT ST_Intersects(shape, ST_GeomFromText('POLYGON((1.5 48.5,2.5 49.5,2.5 49.5,2.5 48.5,1.5 48.5))')) FROM my_layer") gdal.PushErrorHandler() f = sql_lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None ds.ReleaseResultSet(sql_lyr) ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_spatial_filter(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CBBOX%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Box%3E%3Cgml:coordinates%3E48.0000000000000000,1.0000000000000000%2050.0000000000000000,3.0000000000000000%3C%2Fgml:coordinates%3E%3C%2Fgml:Box%3E%3C%2FBBOX%3E%3C%2FFilter%3E', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) lyr.SetSpatialFilterRect(1, 48, 3, 50) f = lyr.GetNextFeature() assert f is not None if gdal.GetConfigOption('OGR_WFS_USE_STREAMING') == 'NO': lyr.SetSpatialFilterRect(1.5, 48.5, 2.5, 49.5) f = lyr.GetNextFeature() assert f is not None lyr.SetSpatialFilter(None) lyr.ResetReading() lyr.ResetReading() lyr.SetSpatialFilterRect(1, 48, 3, 50) f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_wfs_vsimem_wfs110_one_layer_spatial_filter_and_attribute_filter(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CAnd%3E%3CPropertyIsEqualTo%3E%3CPropertyName%3Estr%3C%2FPropertyName%3E%3CLiteral%3Estr%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E%3CBBOX%3E%3CPropertyName%3Eshape%3C%2FPropertyName%3E%3Cgml:Box%3E%3Cgml:coordinates%3E48.0000000000000000,1.0000000000000000%2050.0000000000000000,3.0000000000000000%3C%2Fgml:coordinates%3E%3C%2Fgml:Box%3E%3C%2FBBOX%3E%3C%2FAnd%3E%3C%2FFilter%3E', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) lyr.SetSpatialFilterRect(1, 48, 3, 50) lyr.SetAttributeFilter("str = 'str'") f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_wfs_vsimem_wfs110_insertfeature(with_and_without_streaming): wfs_insert_url = None gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 gml:Envelope gml:Point gml:LineString gml:Polygon LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo EqualTo NotEqualTo Like Between NullCheck """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 wfs_insert_url = """/vsimem/wfs_endpoint&POSTFIELDS= """ gdal.FileFromMemBuffer(wfs_insert_url, "") f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer(wfs_insert_url, "") f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Error returned by server') < 0) gdal.FileFromMemBuffer(wfs_insert_url, "") f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find ') < 0) gdal.FileFromMemBuffer(wfs_insert_url, """ """) f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL('SELECT _LAST_INSERTED_FIDS_ FROM not_existing_layer') gdal.PopErrorHandler() assert sql_lyr is None f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 assert f.GetFID() == 100 sql_lyr = ds.ExecuteSQL('SELECT _LAST_INSERTED_FIDS_ FROM my_layer') got_f = sql_lyr.GetNextFeature() assert got_f is None ds.ReleaseResultSet(sql_lyr) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot insert a feature when gml_id field is already set') < 0) # Empty StartTransaction + CommitTransaction ret = lyr.StartTransaction() assert ret == 0 ret = lyr.CommitTransaction() assert ret == 0 # Empty StartTransaction + RollbackTransaction ret = lyr.StartTransaction() assert ret == 0 ret = lyr.RollbackTransaction() assert ret == 0 # Isolated CommitTransaction gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert ret != 0 # Isolated RollbackTransaction gdal.PushErrorHandler() ret = lyr.RollbackTransaction() gdal.PopErrorHandler() assert ret != 0 # 2 StartTransaction in a row ret = lyr.StartTransaction() assert ret == 0 gdal.PushErrorHandler() ret = lyr.StartTransaction() gdal.PopErrorHandler() assert ret != 0 ret = lyr.RollbackTransaction() assert ret == 0 # Missing TransactionSummary ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Only 0 features were inserted whereas 1 where expected') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, "") gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find ') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, "") gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Error returned by server') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find node InsertResults') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Inconsistent InsertResults: did not get expected FID count') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) gdal.PushErrorHandler() ret = lyr.CommitTransaction() gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find fid') < 0) ret = lyr.StartTransaction() assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) assert ret == 0 gdal.FileFromMemBuffer(wfs_insert_url, """ """) ret = lyr.CommitTransaction() assert ret == 0 sql_lyr = ds.ExecuteSQL('SELECT _LAST_INSERTED_FIDS_ FROM my_layer') f = sql_lyr.GetNextFeature() assert f.gml_id == 'my_layer.100' sql_lyr.ResetReading() sql_lyr.SetNextByIndex(0) sql_lyr.GetFeature(0) sql_lyr.GetLayerDefn() sql_lyr.GetFeatureCount() sql_lyr.TestCapability('foo') ds.ReleaseResultSet(sql_lyr) gdal.Unlink(wfs_insert_url) wfs_insert_url = None wfs_insert_url = """/vsimem/wfs_endpoint&POSTFIELDS= foo 123456789 2.34 49 2 """ gdal.FileFromMemBuffer(wfs_insert_url, """ """) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('str', 'foo') f.SetField('int', 123456789) f.SetField('double', 2.34) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) ret = lyr.CreateFeature(f) assert ret == 0 gdal.Unlink(wfs_insert_url) wfs_insert_url = None ############################################################################### def test_ogr_wfs_vsimem_wfs110_updatefeature(with_and_without_streaming): wfs_update_url = None gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot update a feature when gml_id field is not set') < 0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert ret != 0, gdal.GetLastErrorMsg() wfs_update_url = """/vsimem/wfs_endpoint&POSTFIELDS= shape str boolean short int float double dt """ gdal.FileFromMemBuffer(wfs_update_url, "") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Empty content returned by server') < 0) gdal.FileFromMemBuffer(wfs_update_url, "") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Error returned by server') < 0) gdal.FileFromMemBuffer(wfs_update_url, "") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') gdal.PushErrorHandler() ret = lyr.SetFeature(f) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find ') < 0) gdal.FileFromMemBuffer(wfs_update_url, "") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') ret = lyr.SetFeature(f) assert ret == 0, gdal.GetLastErrorMsg() gdal.Unlink(wfs_update_url) wfs_update_url = """/vsimem/wfs_endpoint&POSTFIELDS= shape 49 2 str foo boolean short int 123456789 float double 2.34 dt """ gdal.FileFromMemBuffer(wfs_update_url, "") f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('gml_id', 'my_layer.1') f.SetField('str', 'foo') f.SetField('int', 123456789) f.SetField('double', 2.34) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) ret = lyr.SetFeature(f) assert ret == 0 ############################################################################### def test_ogr_wfs_vsimem_wfs110_deletefeature(with_and_without_streaming): wfs_delete_url = None gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) gdal.PushErrorHandler() ret = lyr.DeleteFeature(200) gdal.PopErrorHandler() assert ret != 0, gdal.GetLastErrorMsg() gdal.FileFromMemBuffer('/vsimem/wfs_endpoint?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Fogc%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%22%3E%3CGmlObjectId%20id%3D%22my_layer.200%22%2F%3E%3C%2FFilter%3E', """ """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) gdal.PushErrorHandler() ret = lyr.DeleteFeature(200) gdal.PopErrorHandler() assert ret != 0, gdal.GetLastErrorMsg() ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) wfs_delete_url = """/vsimem/wfs_endpoint&POSTFIELDS= """ gdal.FileFromMemBuffer(wfs_delete_url, "") gdal.PushErrorHandler() ret = lyr.DeleteFeature(200) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Empty content returned by server') < 0) ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer(wfs_delete_url, "") gdal.PushErrorHandler() ret = lyr.DeleteFeature(200) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Invalid XML content') < 0) ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer(wfs_delete_url, "") gdal.PushErrorHandler() ret = lyr.DeleteFeature(200) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg().find('Cannot find ') < 0) ds = ogr.Open('WFS:/vsimem/wfs_endpoint', update=1) lyr = ds.GetLayer(0) gdal.FileFromMemBuffer(wfs_delete_url, "") ret = lyr.DeleteFeature(200) assert ret == 0, gdal.GetLastErrorMsg() gdal.Unlink(wfs_delete_url) wfs_delete_url = """/vsimem/wfs_endpoint&POSTFIELDS= """ gdal.FileFromMemBuffer(wfs_delete_url, "") gdal.ErrorReset() sql_lyr = ds.ExecuteSQL("DELETE FROM my_layer WHERE gml_id = 'my_layer.200'") assert gdal.GetLastErrorMsg() == '' gdal.ErrorReset() gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("DELETE FROM ") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("DELETE FROM non_existing_layer WHERE truc") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Unknown layer') >= 0 gdal.ErrorReset() gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("DELETE FROM my_layer BLA") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('WHERE clause missing') >= 0 gdal.ErrorReset() gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("DELETE FROM my_layer WHERE -") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('SQL Expression Parsing Error') >= 0 gdal.ErrorReset() gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("DELETE FROM my_layer WHERE ogr_geometry = 'POINT'") gdal.PopErrorHandler() assert sql_lyr is None and gdal.GetLastErrorMsg() != '' ############################################################################### def test_ogr_wfs_vsimem_wfs110_schema_not_understood(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') # Invalid response, but enough for use gdal.FileFromMemBuffer('/vsimem/wfs_endpoint_schema_not_understood?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer """) ds = ogr.Open('WFS:/vsimem/wfs_endpoint_schema_not_understood') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs_endpoint_schema_not_understood?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 ds = ogr.Open('WFS:/vsimem/wfs_endpoint_schema_not_understood') lyr = ds.GetLayer(0) content = \ """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """ gdal.FileFromMemBuffer('/vsimem/wfs_endpoint_schema_not_understood?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer&MAXFEATURES=1', content) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 8 gdal.FileFromMemBuffer('/vsimem/wfs_endpoint_schema_not_understood?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=my_layer', content) f = lyr.GetNextFeature() if f.gml_id != 'my_layer.1' or f.boolean != 1 or f.str != 'str' or f.short != 1 or \ f.int != 123456789 or f.float != 1.2 or f.double != 1.23 or f.dt != '2015-04-17T12:34:56Z' or \ f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_wfs_vsimem_wfs110_multiple_layers(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 my_layer2 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers') lyr = ds.GetLayer(0) gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer,my_layer2', "") lyr = ds.GetLayer(0) gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer,my_layer2', "") lyr = ds.GetLayer(0) gdal.PushErrorHandler() lyr_defn = lyr.GetLayerDefn() gdal.PopErrorHandler() assert lyr_defn.GetFieldCount() == 0 ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer,my_layer2', """ """) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 2 lyr = ds.GetLayer(1) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 2 ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer,my_layer2', """ """) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 2 gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer2', """ """) lyr = ds.GetLayer(1) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 2 ############################################################################### def test_ogr_wfs_vsimem_wfs110_multiple_layers_same_name_different_ns(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers_different_ns?SERVICE=WFS&REQUEST=GetCapabilities', """ ns1:my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 ns2:my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs110_multiple_layers_different_ns') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers_different_ns?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=ns1:my_layer', """ """) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 2 gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers_different_ns?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&TYPENAME=ns1:my_layer', """ """) f = lyr.GetNextFeature() assert f is not None gdal.FileFromMemBuffer('/vsimem/wfs110_multiple_layers_different_ns?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=ns2:my_layer', """ """) lyr = ds.GetLayer(1) lyr_defn = lyr.GetLayerDefn() assert lyr_defn.GetFieldCount() == 3 ############################################################################### def test_ogr_wfs_vsimem_wfs200_paging(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_paging?SERVICE=WFS&REQUEST=GetCapabilities', """ 2 TRUE my_layer title abstract keyword urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 gml:Envelope gml:Point gml:LineString gml:Polygon LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo EqualTo NotEqualTo Like Between NullCheck """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_paging') lyr = ds.GetLayer(0) assert lyr.GetMetadata() == {'ABSTRACT': 'abstract', 'KEYWORD_1': 'keyword', 'TITLE': 'title'} gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_paging?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_paging?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer&STARTINDEX=0&COUNT=2', """ str true 1 123456789 1.2 1.23 2015-04-17T12:34:56Z 49 2 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_paging?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer&STARTINDEX=2&COUNT=2', """ """) f = lyr.GetNextFeature() assert f is not None if f.gml_id != 'my_layer.1': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is not None if f.gml_id != 'my_layer.2': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() assert f is not None if f.gml_id != 'my_layer.3': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() # if lyr.GetFeatureCount() != 3: # gdaltest.post_reason('fail') # print(lyr.GetFeatureCount()) # return 'fail' ############################################################################### def test_ogr_wfs_vsimem_wfs200_json(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_json?SERVICE=WFS&REQUEST=GetCapabilities', """ results hits application/json 2 TRUE my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 gml:Envelope gml:Point gml:LineString gml:Polygon LessThan GreaterThan LessThanEqualTo GreaterThanEqualTo EqualTo NotEqualTo Like Between NullCheck """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_json?OUTPUTFORMAT=application/json') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_json?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_json?OUTPUTFORMAT=application/json&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer&STARTINDEX=0&COUNT=2', """{"type":"FeatureCollection", "totalFeatures":"unknown", "features":[{"type":"Feature","id":"my_layer.1", "geometry":{"type":"Point","coordinates":[2, 49]}, "properties":{"str":"str"}}]} """) f = lyr.GetNextFeature() assert f is not None # We currently invert... A bit weird. See comment in code. Probably inappropriate if f.str != 'str' or f.GetGeometryRef().ExportToWkt() != 'POINT (49 2)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_wfs_vsimem_wfs200_multipart(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_multipart?SERVICE=WFS&REQUEST=GetCapabilities', """ my_layer urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_multipart?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=my_layer', """ """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer', """Content-Type: multipart/mixed; boundary="my_boundary" \r \r --my_boundary Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=my.json \r { "type":"FeatureCollection", "totalFeatures":"unknown", "features":[ { "type":"Feature", "id":"my_layer.1", "geometry":{"type":"Point","coordinates":[2, 49]}, "properties":{"str":"str"} } ] } --my_boundary-- """) f = lyr.GetNextFeature() assert f is not None # We currently invert... A bit weird. See comment in code. Probably inappropriate if f.str != 'str' or f.GetGeometryRef().ExportToWkt() != 'POINT (49 2)': f.DumpReadable() pytest.fail() ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer', """Content-Type: multipart/mixed; boundary="my_boundary" \r \r --my_boundary \r { "type":"FeatureCollection", "totalFeatures":"unknown", "features":[ { "type":"Feature", "id":"my_layer.1", "geometry":{"type":"Point","coordinates":[2, 49]}, "properties":{"str":"str"} } ] } --my_boundary-- """) f = lyr.GetNextFeature() assert f is not None ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart') lyr = ds.GetLayer(0) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_multipart?OUTPUTFORMAT=multipart&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=my_layer', """Content-Type: multipart/mixed; boundary="my_boundary" \r \r --my_boundary Content-Disposition: attachment; filename=my.csvt \r String,String --my_boundary Content-Disposition: attachment; filename=my.csv \r str,WKT str,"POINT(2 49)" --my_boundary-- """) f = lyr.GetNextFeature() assert f is not None # We currently invert... A bit weird. See comment in code. Probably inappropriate if f.str != 'str' or f.GetGeometryRef().ExportToWkt() != 'POINT (49 2)': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_wfs_vsimem_wfs200_join(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&REQUEST=GetCapabilities', """ 1 TRUE TRUE lyr1 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 lyr2 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=lyr1,lyr2', """ """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.PushErrorHandler() f = sql_lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """""") gdal.PushErrorHandler() f = sql_lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Empty content returned by server') >= 0 ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """""") gdal.PushErrorHandler() f = sql_lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Error returned by server') >= 0 ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """= 0 ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """""") gdal.PushErrorHandler() f = sql_lyr.GetNextFeature() gdal.PopErrorHandler() assert f is None and gdal.GetLastErrorMsg().find('Error: cannot parse') >= 0 ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """ 123.4 48.5 2.5 123.4 49 2 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=1&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """ foo 48.5 2.5 foo 49 2 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=2&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """ """) f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100' or f['lyr1.str'] != '123.4' or \ f['lyr2.gml_id'] != 'lyr2-101' or f['lyr2.str2'] != '123.4' or \ f['lyr1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-101' or f['lyr1.str'] != 'foo' or \ f['lyr2.gml_id'] != 'lyr2-102' or f['lyr2.str2'] != 'foo' or \ f['lyr1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() sql_lyr.ResetReading() sql_lyr.ResetReading() f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100': f.DumpReadable() pytest.fail() gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2, gdal.GetLastErrorMsg() # Empty content returned by server gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&RESULTTYPE=hits', """""") gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2, gdal.GetLastErrorMsg() # Invalid XML gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&RESULTTYPE=hits', """""") gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2, gdal.GetLastErrorMsg() # Missing FeatureCollection gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&RESULTTYPE=hits', """""") gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2, gdal.GetLastErrorMsg() # Missing FeatureCollection.numberMatched gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&RESULTTYPE=hits', """""") gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 2, gdal.GetLastErrorMsg() # Valid gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&RESULTTYPE=hits', """ """) gdal.PushErrorHandler('CPLQuietErrorHandler') fc = sql_lyr.GetFeatureCount() gdal.PopErrorHandler() assert fc == 3, gdal.GetLastErrorMsg() sql_lyr.TestCapability('foo') sql_lyr.GetLayerDefn() # Test filters (nt supported) sql_lyr.SetAttributeFilter(None) gdal.PushErrorHandler() sql_lyr.SetAttributeFilter('"lyr1.gml_id" IS NOT NULL') gdal.PopErrorHandler() sql_lyr.SetSpatialFilter(None) gdal.PushErrorHandler() sql_lyr.SetSpatialFilterRect(0, 0, 0, 0) gdal.PopErrorHandler() ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT lyr1.*, lyr2.* FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100' or f['lyr1.str'] != '123.4' or \ f['lyr2.gml_id'] != 'lyr2-101' or f['lyr2.str2'] != '123.4' or \ f['lyr1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 my_alias1 JOIN lyr2 ON my_alias1.str = lyr2.str2') f = sql_lyr.GetNextFeature() if f['my_alias1.gml_id'] != 'lyr1-100' or f['my_alias1.str'] != '123.4' or \ f['lyr2.gml_id'] != 'lyr2-101' or f['lyr2.str2'] != '123.4' or \ f['my_alias1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT my_alias1.gml_id as gml_id1, ' + 'CAST(my_alias1.str AS integer) AS str_int, ' + 'CAST(my_alias1.str AS bigint) AS str_bigint, ' + 'CAST(my_alias1.str AS float) AS str_float, ' + 'my_alias1.shape AS myshape ' + 'FROM lyr1 my_alias1 JOIN lyr2 ON my_alias1.str = lyr2.str2') f = sql_lyr.GetNextFeature() if f['gml_id1'] != 'lyr1-100' or \ f['str_int'] != 123 or \ f['str_bigint'] != 123 or \ f['str_float'] != 123.4 or \ f['myshape'].ExportToWkt() != 'POINT (2.5 48.5)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL("SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2 WHERE lyr2.str2 = '123.4'") content = """ 123.4 48.5 2.5 123.4 49 2 """ gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CAnd%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3CLiteral%3E123.4%3C%2FLiteral%3E%3C%2FPropertyIsEqualTo%3E%3C%2FAnd%3E%3C%2FFilter%3E', content) f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100' or f['lyr1.str'] != '123.4' or \ f['lyr2.gml_id'] != 'lyr2-101' or f['lyr2.str2'] != '123.4' or \ f['lyr1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CAnd%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3CWithin%3E%3CValueReference%3Elyr2%2Fanother_shape%3C%2FValueReference%3E%3Cgml:Envelope%20srsName%3D%22urn:ogc:def:crs:EPSG::4326%22%3E%3Cgml:lowerCorner%3E%2D90%20%2D180%3C%2Fgml:lowerCorner%3E%3Cgml:upperCorner%3E90%20180%3C%2Fgml:upperCorner%3E%3C%2Fgml:Envelope%3E%3C%2FWithin%3E%3C%2FAnd%3E%3C%2FFilter%3E', content) sql_lyr = ds.ExecuteSQL("SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2 WHERE ST_Within(lyr2.another_shape, ST_MakeEnvelope(-180,-90,180,90))") f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28lyr1,lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Elyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Elyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E&SORTBY=str%20DESC', content) sql_lyr = ds.ExecuteSQL("SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2 ORDER BY lyr1.str DESC") f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2 WHERE lyr1.OGR_GEOMETRY IS NOT NULL") gdal.PopErrorHandler() assert sql_lyr is None and gdal.GetLastErrorMsg().find('Unsupported WHERE clause') >= 0 gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("SELECT * FROM lyr1 JOIN lyr2 ON lyr1.OGR_GEOMETRY IS NOT NULL") gdal.PopErrorHandler() assert sql_lyr is None and gdal.GetLastErrorMsg().find('Unsupported JOIN clause') >= 0 gdal.PushErrorHandler() sql_lyr = ds.ExecuteSQL("SELECT 1 FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2") gdal.PopErrorHandler() assert sql_lyr is None and gdal.GetLastErrorMsg().find('Only column names supported in column selection') >= 0 ds = None ############################################################################### def test_ogr_wfs_vsimem_wfs200_join_layer_with_namespace_prefix(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&REQUEST=GetCapabilities', """ 1 TRUE TRUE foo:lyr1 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 foo:lyr2 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=foo:lyr1,foo:lyr2', """ """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT * FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28foo:lyr1,foo:lyr2%29&STARTINDEX=0&COUNT=1&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:foo%3D%22http:%2F%2Ffoo%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Efoo:lyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Efoo:lyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """ 123.4 48.5 2.5 123.4 49 2 """) f = sql_lyr.GetNextFeature() if f['lyr1.gml_id'] != 'lyr1-100' or f['lyr1.str'] != '123.4' or \ f['lyr2.gml_id'] != 'lyr2-101' or f['lyr2.str2'] != '123.4' or \ f['lyr1.shape'].ExportToWkt() != 'POINT (2.5 48.5)' or \ f['lyr2.another_shape'].ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ############################################################################### def test_ogr_wfs_vsimem_wfs200_join_distinct(with_and_without_streaming): gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&REQUEST=GetCapabilities', """ 4 TRUE TRUE foo:lyr1 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 foo:lyr2 urn:ogc:def:crs:EPSG::4326 -180.0 -90.0 180.0 90.0 """) gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=DescribeFeatureType&TYPENAME=foo:lyr1,foo:lyr2', """ """) gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', 'YES') ds = ogr.Open('WFS:/vsimem/wfs200_endpoint_join') sql_lyr = ds.ExecuteSQL('SELECT DISTINCT lyr1.str, lyr1.int, lyr1.int64, lyr1.double, lyr1.dt, lyr2.another_shape FROM lyr1 JOIN lyr2 ON lyr1.str = lyr2.str2') gdal.FileFromMemBuffer('/vsimem/wfs200_endpoint_join?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAMES=%28foo:lyr1,foo:lyr2%29&STARTINDEX=0&COUNT=4&FILTER=%3CFilter%20xmlns%3D%22http:%2F%2Fwww.opengis.net%2Ffes%2F2.0%22%20xmlns:foo%3D%22http:%2F%2Ffoo%22%20xmlns:gml%3D%22http:%2F%2Fwww.opengis.net%2Fgml%2F3.2%22%3E%3CPropertyIsEqualTo%3E%3CValueReference%3Efoo:lyr1%2Fstr%3C%2FValueReference%3E%3CValueReference%3Efoo:lyr2%2Fstr2%3C%2FValueReference%3E%3C%2FPropertyIsEqualTo%3E%3C%2FFilter%3E', """ foo 1 9876543210 123.4 2015-04-17T12:34:56Z 48.5 2.5 foo foo 49 2 foo 1 9876543210 123.4 2015-04-17T12:34:56Z 48.5 2.5 foo bar 49 2 bar 1 9876543210 123.4 2015-04-17T12:34:56Z 48.5 2.5 bar bar 49 2 """) assert sql_lyr.GetFeatureCount() == 2 ds.ReleaseResultSet(sql_lyr) ############################################################################### def test_ogr_wfs_vsimem_cleanup(with_and_without_streaming): gdal.SetConfigOption('CPL_CURL_ENABLE_VSIMEM', None) for f in gdal.ReadDir('/vsimem/'): gdal.Unlink('/vsimem/' + f) gdalautotest-3.0.4/ogr/ogr_georss.py0000755003401500001440000005067313614005364017162 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_georss.py 15604 2008-10-26 11:21:34Z rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test GeoRSS driver functionality. # 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 gdaltest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest def test_ogr_georss_init(): ds = ogr.Open('data/atom_rfc_sample.xml') if ds is None: gdaltest.georss_read_support = 0 else: gdaltest.georss_read_support = 1 ds = None gdaltest.have_gml_reader = 0 try: ds = ogr.Open('data/ionic_wfs.gml') if ds is not None: gdaltest.have_gml_reader = 1 ds = None except: pass gdaltest.atom_field_values = [('title', 'Atom draft-07 snapshot', ogr.OFTString), ('link_rel', 'alternate', ogr.OFTString), ('link_type', 'text/html', ogr.OFTString), ('link_href', 'http://example.org/2005/04/02/atom', ogr.OFTString), ('link2_rel', 'enclosure', ogr.OFTString), ('link2_type', 'audio/mpeg', ogr.OFTString), ('link2_length', '1337', ogr.OFTInteger), ('link2_href', 'http://example.org/audio/ph34r_my_podcast.mp3', ogr.OFTString), ('id', 'tag:example.org,2003:3.2397', ogr.OFTString), ('updated', '2005/07/31 12:29:29+00', ogr.OFTDateTime), ('published', '2003/12/13 08:29:29-04', ogr.OFTDateTime), ('author_name', 'Mark Pilgrim', ogr.OFTString), ('author_uri', 'http://example.org/', ogr.OFTString), ('author_email', 'f8dy@example.com', ogr.OFTString), ('contributor_name', 'Sam Ruby', ogr.OFTString), ('contributor2_name', 'Joe Gregorio', ogr.OFTString), ('content_type', 'xhtml', ogr.OFTString), ('content_xml_lang', 'en', ogr.OFTString), ('content_xml_base', 'http://diveintomark.org/', ogr.OFTString)] ############################################################################### # Used by ogr_georss_1 and ogr_georss_1ter def ogr_georss_test_atom(filename): if not gdaltest.georss_read_support: pytest.skip() ds = ogr.Open(filename) lyr = ds.GetLayerByName('georss') assert lyr.GetSpatialRef() is None, 'No spatial ref expected' feat = lyr.GetNextFeature() for field_value in gdaltest.atom_field_values: assert feat.GetFieldAsString(field_value[0]) == field_value[1], \ ('For field "%s", got "%s" instead of "%s"' % (field_value[0], feat.GetFieldAsString(field_value[0]), field_value[1])) assert feat.GetFieldAsString('content').find('
') != -1, \ ('For field "%s", got "%s"' % ('content', feat.GetFieldAsString('content'))) ############################################################################### # Test reading an ATOM document without any geometry def test_ogr_georss_1(): return ogr_georss_test_atom('data/atom_rfc_sample.xml') ############################################################################### # Test reading an ATOM document with atom: prefiw def test_ogr_georss_1_atom_ns(): return ogr_georss_test_atom('data/atom_rfc_sample_atom_ns.xml') ############################################################################### # Test writing a Atom 1.0 document (doesn't need read support) def test_ogr_georss_1bis(): try: os.remove('tmp/test_atom.xml') except OSError: pass ds = ogr.GetDriverByName('GeoRSS').CreateDataSource('tmp/test_atom.xml', options=['FORMAT=ATOM']) lyr = ds.CreateLayer('georss') for field_value in gdaltest.atom_field_values: lyr.CreateField(ogr.FieldDefn(field_value[0], field_value[2])) lyr.CreateField(ogr.FieldDefn('content', ogr.OFTString)) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) for field_value in gdaltest.atom_field_values: dst_feat.SetField(field_value[0], field_value[1]) dst_feat.SetField('content', '

[Update: The Atom draft is finished.]

') assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None ############################################################################### # Test reading document created at previous step def test_ogr_georss_1ter(): return ogr_georss_test_atom('tmp/test_atom.xml') ############################################################################### # Common for ogr_georss_2 and ogr_georss_3 def ogr_georss_test_rss(filename, only_first_feature): if not gdaltest.georss_read_support: pytest.skip() ds = ogr.Open(filename) assert ds is not None lyr = ds.GetLayer(0) srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') assert lyr.GetSpatialRef() is not None and lyr.GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), \ 'SRS is not the one expected.' assert lyr.GetSpatialRef().GetDataAxisToSRSAxisMapping() == [2, 1] feat = lyr.GetNextFeature() expected_wkt = 'POINT (2 49)' assert feat.GetGeometryRef().ExportToWkt() == expected_wkt, \ ('%s' % feat.GetGeometryRef().ExportToWkt()) assert feat.GetFieldAsString('title') == 'A point' assert feat.GetFieldAsString('author') == 'Author' assert feat.GetFieldAsString('link') == 'http://gdal.org' assert feat.GetFieldAsString('pubDate') == '2008/12/07 20:13:00+02' assert feat.GetFieldAsString('category') == 'First category' assert feat.GetFieldAsString('category_domain') == 'first_domain' assert feat.GetFieldAsString('category2') == 'Second category' assert feat.GetFieldAsString('category2_domain') == 'second_domain' feat = lyr.GetNextFeature() expected_wkt = 'LINESTRING (2 48,2.1 48.1,2.2 48.0)' assert only_first_feature is not False or feat.GetGeometryRef().ExportToWkt() == expected_wkt, \ ('%s' % feat.GetGeometryRef().ExportToWkt()) assert feat.GetFieldAsString('title') == 'A line' feat = lyr.GetNextFeature() expected_wkt = 'POLYGON ((2 50,2.1 50.1,2.2 48.1,2.1 46.1,2 50))' assert only_first_feature is not False or feat.GetGeometryRef().ExportToWkt() == expected_wkt, \ ('%s' % feat.GetGeometryRef().ExportToWkt()) assert feat.GetFieldAsString('title') == 'A polygon' feat = lyr.GetNextFeature() expected_wkt = 'POLYGON ((2 49,2.0 49.5,2.2 49.5,2.2 49.0,2 49))' assert only_first_feature is not False or feat.GetGeometryRef().ExportToWkt() == expected_wkt, \ ('%s' % feat.GetGeometryRef().ExportToWkt()) assert feat.GetFieldAsString('title') == 'A box' ############################################################################### # Test reading a RSS 2.0 document with GeoRSS simple geometries def test_ogr_georss_2(): return ogr_georss_test_rss('data/test_georss_simple.xml', False) ############################################################################### # Test reading a RSS 2.0 document with GeoRSS GML geometries def test_ogr_georss_3(): if not gdaltest.have_gml_reader: pytest.skip() return ogr_georss_test_rss('data/test_georss_gml.xml', False) ############################################################################### # Test writing a RSS 2.0 document (doesn't need read support) def ogr_georss_create(filename, options): try: os.remove(filename) except OSError: pass ds = ogr.GetDriverByName('GeoRSS').CreateDataSource(filename, options=options) lyr = ds.CreateLayer('georss') lyr.CreateField(ogr.FieldDefn('title', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('author', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('link', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('pubDate', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('description', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('category', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('category_domain', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('category2', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('category2_domain', ogr.OFTString)) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetField('title', 'A point') dst_feat.SetField('author', 'Author') dst_feat.SetField('link', 'http://gdal.org') dst_feat.SetField('pubDate', '2008/12/07 20:13:00+02') dst_feat.SetField('category', 'First category') dst_feat.SetField('category_domain', 'first_domain') dst_feat.SetField('category2', 'Second category') dst_feat.SetField('category2_domain', 'second_domain') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetField('title', 'A line') dst_feat.SetField('author', 'Author') dst_feat.SetField('link', 'http://gdal.org') dst_feat.SetField('pubDate', '2008/12/07 20:13:00+02') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (2 48,2.1 48.1,2.2 48.0)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetField('title', 'A polygon') dst_feat.SetField('author', 'Author') dst_feat.SetField('link', 'http://gdal.org') dst_feat.SetField('pubDate', '2008/12/07 20:13:00+02') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((2 50,2.1 50.1,2.2 48.1,2.1 46.1,2 50))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetField('title', 'A box') dst_feat.SetField('author', 'Author') dst_feat.SetField('link', 'http://gdal.org') dst_feat.SetField('pubDate', '2008/12/07 20:13:00+02') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((2 49,2.0 49.5,2.2 49.5,2.2 49.0,2 49))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None ############################################################################### # Test writing a RSS 2.0 document in Simple dialect (doesn't need read support) def test_ogr_georss_4(): ogr_georss_create('tmp/test_rss2.xml', []) content = open('tmp/test_rss2.xml').read() assert content.find('49 2') != -1, ('%s' % content) ############################################################################### # Test reading document created at previous step def test_ogr_georss_5(): return ogr_georss_test_rss('tmp/test_rss2.xml', False) ############################################################################### # Test writing a RSS 2.0 document in GML dialect (doesn't need read support) def test_ogr_georss_6(): ogr_georss_create('tmp/test_rss2.xml', ['GEOM_DIALECT=GML']) content = open('tmp/test_rss2.xml').read() assert content.find('49 2') != -1, \ ('%s' % content) ############################################################################### # Test reading document created at previous step def test_ogr_georss_7(): if not gdaltest.have_gml_reader: pytest.skip() return ogr_georss_test_rss('tmp/test_rss2.xml', False) ############################################################################### # Test writing a RSS 2.0 document in W3C Geo dialect (doesn't need read support) def test_ogr_georss_8(): ogr_georss_create('tmp/test_rss2.xml', ['GEOM_DIALECT=W3C_GEO']) content = open('tmp/test_rss2.xml').read() assert not (content.find('49') == -1 or content.find('2') == -1), \ ('%s' % content) ############################################################################### # Test reading document created at previous step def test_ogr_georss_9(): return ogr_georss_test_rss('tmp/test_rss2.xml', True) ############################################################################### # Test writing a RSS 2.0 document in GML dialect with EPSG:32631 def test_ogr_georss_10(): try: os.remove('tmp/test32631.rss') except OSError: pass srs = osr.SpatialReference() srs.ImportFromEPSG(32631) ds = ogr.GetDriverByName('GeoRSS').CreateDataSource('tmp/test32631.rss') gdal.PushErrorHandler('CPLQuietErrorHandler') try: lyr = ds.CreateLayer('georss', srs=srs) except: lyr = None gdal.PopErrorHandler() assert lyr is None, 'should not have accepted EPSG:32631 with GEOM_DIALECT != GML' ds = None try: os.remove('tmp/test32631.rss') except OSError: pass ds = ogr.GetDriverByName('GeoRSS').CreateDataSource('tmp/test32631.rss', options=['GEOM_DIALECT=GML']) lyr = ds.CreateLayer('georss', srs=srs) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (500000 4000000)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None content = open('tmp/test32631.rss').read() assert content.find('500000 4000000') != -1, \ ('%s' % content) ############################################################################### # Test reading document created at previous step def test_ogr_georss_11(): if not gdaltest.georss_read_support: pytest.skip() if not gdaltest.have_gml_reader: pytest.skip() ds = ogr.Open('tmp/test32631.rss') lyr = ds.GetLayer(0) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) assert lyr.GetSpatialRef() is not None and lyr.GetSpatialRef().IsSame(srs), \ 'SRS is not the one expected.' if lyr.GetSpatialRef().ExportToWkt().find('AXIS["Easting",EAST],AXIS["Northing",NORTH]') == -1: print(('%s' % lyr.GetSpatialRef().ExportToWkt())) pytest.fail('AXIS definition expected is AXIS["Easting",EAST],AXIS["Northing",NORTH]!') feat = lyr.GetNextFeature() expected_wkt = 'POINT (500000 4000000)' assert feat.GetGeometryRef().ExportToWkt() == expected_wkt, \ ('%s' % feat.GetGeometryRef().ExportToWkt()) ############################################################################### # Test various broken documents def test_ogr_georss_12(): if not gdaltest.georss_read_support: pytest.skip() open('tmp/broken.rss', 'wt').write('') gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open('tmp/broken.rss') gdal.PopErrorHandler() assert ds is None open('tmp/broken.rss', 'wt').write('49 2 49.5') ds = ogr.Open('tmp/broken.rss') gdal.PushErrorHandler('CPLQuietErrorHandler') feat = ds.GetLayer(0).GetNextFeature() gdal.PopErrorHandler() assert feat.GetGeometryRef() is None open('tmp/broken.rss', 'wt').write('48 2 48.1 2.1 48') ds = ogr.Open('tmp/broken.rss') gdal.PushErrorHandler('CPLQuietErrorHandler') feat = ds.GetLayer(0).GetNextFeature() gdal.PopErrorHandler() assert feat.GetGeometryRef() is None ############################################################################### # Test writing non standard fields def test_ogr_georss_13(): try: os.remove('tmp/nonstandard.rss') except OSError: pass ds = ogr.GetDriverByName('GeoRSS').CreateDataSource('tmp/nonstandard.rss', options=['USE_EXTENSIONS=YES']) lyr = ds.CreateLayer('georss') lyr.CreateField(ogr.FieldDefn('myns_field', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('field2', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('ogr_field3', ogr.OFTString)) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetField('myns_field', 'val') dst_feat.SetField('field2', 'val2') dst_feat.SetField('ogr_field3', 'val3') assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None content = open('tmp/nonstandard.rss').read() assert content.find('val') != -1, ('%s' % content) assert content.find('val2') != -1, ('%s' % content) assert content.find('val3') != -1, ('%s' % content) ############################################################################### # Test reading document created at previous step def test_ogr_georss_14(): if not gdaltest.georss_read_support: pytest.skip() ds = ogr.Open('tmp/nonstandard.rss') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetFieldAsString('myns_field') == 'val', \ ('Expected %s. Got %s' % ('val', feat.GetFieldAsString('myns_field'))) assert feat.GetFieldAsString('ogr_field2') == 'val2', \ ('Expected %s. Got %s' % ('val2', feat.GetFieldAsString('ogr_field2'))) assert feat.GetFieldAsString('ogr_field3') == 'val3', \ ('Expected %s. Got %s' % ('val3', feat.GetFieldAsString('ogr_field3'))) ############################################################################### # Test reading an in memory file (#2931) def test_ogr_georss_15(): if not gdaltest.georss_read_support: pytest.skip() try: gdal.FileFromMemBuffer except AttributeError: pytest.skip() content = """ http://mylink.com channel title 0 Thu, 2 Apr 2009 23:03:00 +0000 item title 49 2 """ # Create in-memory file gdal.FileFromMemBuffer('/vsimem/georssinmem', content) ds = ogr.Open('/vsimem/georssinmem') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetFieldAsString('title') == 'item title', \ ('Expected %s. Got %s' % ('item title', feat.GetFieldAsString('title'))) # Release memory associated to the in-memory file gdal.Unlink('/vsimem/georssinmem') ############################################################################### # def test_ogr_georss_cleanup(): list_files = ['tmp/test_rss2.xml', 'tmp/test_atom.xml', 'tmp/test32631.rss', 'tmp/broken.rss', 'tmp/nonstandard.rss'] for filename in list_files: try: os.remove(filename) except OSError: pass files = os.listdir('data') for filename in files: if len(filename) > 13 and filename[-13:] == '.resolved.gml': os.unlink('data/' + filename) gdalautotest-3.0.4/ogr/ogr_pds.py0000755003401500001440000000611713614005364016440 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_pds.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR PDS 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 gdaltest import ogrtest from osgeo import ogr import pytest ############################################################################### # Basic test def test_ogr_pds_1(): ds = ogr.Open('data/ap01578l.lbl') assert ds is not None, 'cannot open dataset' lyr = ds.GetLayerByName('RAMAPPING') assert lyr is not None, 'cannot find layer' assert lyr.GetFeatureCount() == 74786, 'did not get expected feature count' with gdaltest.error_handler(): feat = lyr.GetNextFeature() if feat.GetField('NOISE_COUNTS_1') != 96: feat.DumpReadable() pytest.fail() geom = feat.GetGeometryRef() if ogrtest.check_feature_geometry(feat, 'POINT (146.1325 -55.648)', max_error=0.000000001) != 0: print('did not get expected geom') pytest.fail(geom.ExportToWkt()) with gdaltest.error_handler(): feat = lyr.GetFeature(1) if feat.GetField('MARS_RADIUS') != 3385310.2: feat.DumpReadable() pytest.fail() ############################################################################### # Read IEEE_FLOAT columns (see https://github.com/OSGeo/gdal/issues/570) def test_ogr_pds_2(): ds = ogr.Open('data/virsvd_orb_11187_050618.lbl') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if abs(f['INCIDENCE_ANGLE'] - 3.56775538) > 1e-7 or abs(f['TEMP_2'] - 28.1240005493164) > 1e-7: f.DumpReadable() pytest.fail() gdalautotest-3.0.4/ogr/ogr_tiger.py0000755003401500001440000001707513614005364016771 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_tiger.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR TIGER driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 2011-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 from osgeo import ogr import gdaltest import ogrtest import pytest ############################################################################### def test_ogr_tiger_1(): ogrtest.tiger_ds = None if not gdaltest.download_file('http://www2.census.gov/geo/tiger/tiger2006se/AL/TGR01001.ZIP', 'TGR01001.ZIP'): pytest.skip() try: os.stat('tmp/cache/TGR01001/TGR01001.MET') except OSError: try: try: os.stat('tmp/cache/TGR01001') except OSError: os.mkdir('tmp/cache/TGR01001') gdaltest.unzip('tmp/cache/TGR01001', 'tmp/cache/TGR01001.ZIP') try: os.stat('tmp/cache/TGR01001/TGR01001.MET') except OSError: pytest.skip() except: pytest.skip() ogrtest.tiger_ds = ogr.Open('tmp/cache/TGR01001') assert ogrtest.tiger_ds is not None ogrtest.tiger_ds = None # also test opening with a filename (#4443) ogrtest.tiger_ds = ogr.Open('tmp/cache/TGR01001/TGR01001.RT1') assert ogrtest.tiger_ds is not None # Check a few features. cc_layer = ogrtest.tiger_ds.GetLayerByName('CompleteChain') assert cc_layer.GetFeatureCount() == 19289, 'wrong cc feature count' feat = cc_layer.GetNextFeature() feat = cc_layer.GetNextFeature() feat = cc_layer.GetNextFeature() assert feat.TLID == 2833200 and feat.FRIADDL is None and feat.BLOCKL == 5000, \ 'wrong attribute on cc feature.' assert ogrtest.check_feature_geometry(feat, 'LINESTRING (-86.4402 32.504137,-86.440313 32.504009,-86.440434 32.503884,-86.440491 32.503805,-86.44053 32.503757,-86.440578 32.503641,-86.440593 32.503515,-86.440588 32.503252,-86.440596 32.50298)', max_error=0.000001) == 0 feat = ogrtest.tiger_ds.GetLayerByName('TLIDRange').GetNextFeature() assert feat.MODULE == 'TGR01001' and feat.TLMINID == 2822718, \ 'got wrong TLIDRange attributes' ############################################################################### # Run test_ogrsf def test_ogr_tiger_2(): if ogrtest.tiger_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/cache/TGR01001') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test TIGER writing def test_ogr_tiger_3(): if ogrtest.tiger_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() try: shutil.rmtree('tmp/outtiger') except OSError: pass gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f TIGER tmp/outtiger tmp/cache/TGR01001 -dsco VERSION=1006') ret = 'success' filelist = os.listdir('tmp/cache/TGR01001') exceptions = ['TGR01001.RTA', 'TGR01001.RTC', 'TGR01001.MET', 'TGR01001.RTZ', 'TGR01001.RTS'] for filename in filelist: if filename in exceptions: continue f = open('tmp/cache/TGR01001/' + filename, 'rb') data1 = f.read() f.close() try: f = open('tmp/outtiger/' + filename, 'rb') data2 = f.read() f.close() if data1 != data2: # gdaltest.post_reason('%s is different' % filename) print('%s is different' % filename) ret = 'fail' except: # gdaltest.post_reason('could not find %s' % filename) print('could not find %s' % filename) ret = 'fail' try: shutil.rmtree('tmp/outtiger') except OSError: pass return ret ############################################################################### # Load into a /vsimem instance to test virtualization. def test_ogr_tiger_4(): if ogrtest.tiger_ds is None: pytest.skip() # load all the files into memory. for filename in gdal.ReadDir('tmp/cache/TGR01001'): if filename.startswith('.'): continue data = open('tmp/cache/TGR01001/' + filename, 'r').read() f = gdal.VSIFOpenL('/vsimem/tigertest/' + filename, 'wb') gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFCloseL(f) # Try reading. ogrtest.tiger_ds = ogr.Open('/vsimem/tigertest/TGR01001.RT1') assert ogrtest.tiger_ds is not None, 'fail to open.' ogrtest.tiger_ds = None # also test opening with a filename (#4443) ogrtest.tiger_ds = ogr.Open('tmp/cache/TGR01001/TGR01001.RT1') assert ogrtest.tiger_ds is not None # Check a few features. cc_layer = ogrtest.tiger_ds.GetLayerByName('CompleteChain') assert cc_layer.GetFeatureCount() == 19289, 'wrong cc feature count' feat = cc_layer.GetNextFeature() feat = cc_layer.GetNextFeature() feat = cc_layer.GetNextFeature() assert feat.TLID == 2833200 and feat.FRIADDL is None and feat.BLOCKL == 5000, \ 'wrong attribute on cc feature.' assert ogrtest.check_feature_geometry(feat, 'LINESTRING (-86.4402 32.504137,-86.440313 32.504009,-86.440434 32.503884,-86.440491 32.503805,-86.44053 32.503757,-86.440578 32.503641,-86.440593 32.503515,-86.440588 32.503252,-86.440596 32.50298)', max_error=0.000001) == 0 feat = ogrtest.tiger_ds.GetLayerByName('TLIDRange').GetNextFeature() assert feat.MODULE == 'TGR01001' and feat.TLMINID == 2822718, \ 'got wrong TLIDRange attributes' # Try to recover memory from /vsimem. for filename in gdal.ReadDir('tmp/cache/TGR01001'): if filename.startswith('.'): continue gdal.Unlink('/vsimem/tigertest/' + filename) ############################################################################### def test_ogr_tiger_cleanup(): if ogrtest.tiger_ds is None: pytest.skip() ogrtest.tiger_ds = None gdalautotest-3.0.4/ogr/ogr_nas.py0000755003401500001440000002350413614005364016432 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_nas.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: NAS Reading Driver testing. # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-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 gdaltest import ogrtest from osgeo import ogr import pytest # Other test data : # http://www.lv-bw.de/alkis.info/nas-bsp.html # http://www.lv-bw.de/lvshop2/Produktinfo/AAA/AAA.html # http://www.gll.niedersachsen.de/live/live.php?navigation_id=10640&article_id=51644&_psmand=34 ############################################################################### # Test reading a NAS file # def test_ogr_nas_1(): drv = ogr.GetDriverByName('NAS') if drv is None: pytest.skip() if not gdaltest.download_file('http://www.geodatenzentrum.de/gdz1/abgabe/testdaten/vektor/nas_testdaten_peine.zip', 'nas_testdaten_peine.zip'): pytest.skip() try: os.stat('tmp/cache/BKG_NAS_Peine.xml') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/nas_testdaten_peine.zip') try: os.stat('tmp/cache/BKG_NAS_Peine.xml') except OSError: pytest.skip() except OSError: pytest.skip() try: os.remove('tmp/cache/BKG_NAS_Peine.gfs') except OSError: pass ds = ogr.Open('tmp/cache/BKG_NAS_Peine.xml') assert ds is not None, 'could not open dataset' assert ds.GetLayerCount() == 41, 'did not get expected layer count' lyr = ds.GetLayerByName('AX_Wohnplatz') feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() if feat.GetField('name') != 'Ziegelei' or geom.ExportToWkt() != 'POINT (3575300 5805100)': feat.DumpReadable() pytest.fail() relation_lyr = ds.GetLayerByName('ALKIS_beziehungen') feat = relation_lyr.GetNextFeature() if feat.GetField('beziehung_von') != 'DENIBKG1000001UG' or \ feat.GetField('beziehungsart') != 'istTeilVon' or \ feat.GetField('beziehung_zu') != 'DENIBKG1000000T6': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test reading a sample NAS file from PostNAS # def test_ogr_nas_2(): drv = ogr.GetDriverByName('NAS') if drv is None: pytest.skip() if not gdaltest.download_file('http://trac.wheregroup.com/PostNAS/browser/trunk/demodaten/lverm_geo_rlp/gid-6.0/gm2566-testdaten-gid60-2008-11-11.xml.zip?format=raw', 'gm2566-testdaten-gid60-2008-11-11.xml.zip'): pytest.skip() try: os.stat('tmp/cache/gm2566-testdaten-gid60-2008-11-11.xml') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/gm2566-testdaten-gid60-2008-11-11.xml.zip') try: os.stat('tmp/cache/gm2566-testdaten-gid60-2008-11-11.xml') except OSError: pytest.skip() except OSError: pytest.skip() try: os.remove('tmp/cache/gm2566-testdaten-gid60-2008-11-11.gfs') except OSError: pass ds = ogr.Open('tmp/cache/gm2566-testdaten-gid60-2008-11-11.xml') assert ds is not None, 'could not open dataset' assert ds.GetLayerCount() == 85, 'did not get expected layer count' lyr = ds.GetLayerByName('AX_Flurstueck') # Loop until a feature that has a complex geometry including feat = lyr.GetNextFeature() while feat is not None and feat.GetField('identifier') != 'urn:adv:oid:DERP1234000002Iz': feat = lyr.GetNextFeature() assert feat is not None # expected_geom = 'POLYGON ((350821.045 5532031.37,350924.309 5532029.513,350938.493 5532026.622,350951.435 5532021.471,350978.7 5532007.18,351026.406 5531971.088,351032.251 5531951.162,351080.623 5531942.67,351154.886 5531963.718,351207.689 5532019.797,351211.063 5532044.067,351203.83 5532074.034,351165.959 5532114.315,351152.85 5532135.774,351141.396 5532140.355,351110.659 5532137.542,351080.17 5532132.742,351002.887 5532120.75,350925.682 5532108.264,350848.556 5532095.285,350771.515 5532081.814,350769.548 5532071.196,350812.194 5532034.716,350821.045 5532031.37))' expected_geom = 'CURVEPOLYGON (COMPOUNDCURVE ((350821.045 5532031.37,350924.309 5532029.513,350938.493 5532026.622,350951.435 5532021.471,350978.7 5532007.18,351026.406 5531971.088,351032.251 5531951.16199999955),(351032.251 5531951.16199999955,351080.623 5531942.67,351154.886 5531963.718),(351154.886 5531963.718,351207.689 5532019.797),(351207.689 5532019.797,351211.063 5532044.06699999981,351203.83 5532074.034,351165.959 5532114.315,351152.85 5532135.774),(351152.85 5532135.774,351141.396 5532140.355),CIRCULARSTRING (351141.396 5532140.355,351110.659 5532137.542,351080.17 5532132.74199999962),CIRCULARSTRING (351080.17 5532132.74199999962,351002.887 5532120.75,350925.682 5532108.264),CIRCULARSTRING (350925.682 5532108.264,350848.556 5532095.285,350771.515 5532081.814),(350771.515 5532081.814,350769.548 5532071.196,350812.194 5532034.716,350821.045 5532031.37)))' if ogrtest.check_feature_geometry(feat, expected_geom) != 0: geom = feat.GetGeometryRef() pytest.fail(geom) ds = None ############################################################################### # Test that we can open and read empty files successfully. # def test_ogr_nas_3(): drv = ogr.GetDriverByName('NAS') if drv is None: pytest.skip() ds = ogr.Open('data/empty_nas.xml') assert ds is not None, 'could not open dataset' assert ds.GetLayerCount() == 1, 'did not get expected layer count' ds = None ############################################################################### # Test that we can read files with wfs:Delete transactions in them properly. # def test_ogr_nas_4(): drv = ogr.GetDriverByName('NAS') if drv is None: pytest.skip() try: os.remove('data/delete_nas.gfs') except OSError: pass ds = ogr.Open('data/delete_nas.xml') assert ds is not None, 'could not open dataset' assert ds.GetLayerCount() == 2, 'did not get expected layer count' del_lyr = ds.GetLayerByName('Delete') assert del_lyr.GetFeatureCount() == 3, 'did not get expected number of features' del_lyr.ResetReading() feat = del_lyr.GetNextFeature() assert feat.GetField('context') == 'Delete', 'did not get expected context' assert feat.GetField('typeName') == 'AX_Namensnummer', \ 'did not get expected typeName' assert feat.GetField('FeatureId') == 'DENW44AL00000HJU20100730T092847Z', \ 'did not get expected FeatureId' del_lyr = None ds = None try: os.remove('data/delete_nas.gfs') except OSError: pass ############################################################################### # Test that we can read files with wfsext:Replace transactions properly # def test_ogr_nas_5(): drv = ogr.GetDriverByName('NAS') if drv is None: pytest.skip() try: os.remove('data/replace_nas.gfs') except OSError: pass ds = ogr.Open('data/replace_nas.xml') assert ds is not None, 'could not open dataset' assert ds.GetLayerCount() == 3, 'did not get expected layer count' # Check the delete operation created for the replace del_lyr = ds.GetLayerByName('Delete') assert del_lyr.GetFeatureCount() == 1, 'did not get expected number of features' del_lyr.ResetReading() feat = del_lyr.GetNextFeature() assert feat.GetField('context') == 'Replace', 'did not get expected context' assert feat.GetField('replacedBy') == 'DENW44AL00003IkM20110429T070635Z', \ 'did not get expected replacedBy' assert feat.GetField('safeToIgnore') == 'false', 'did not get expected safeToIgnore' assert feat.GetField('typeName') == 'AX_Flurstueck', 'did not get expected typeName' assert feat.GetField('FeatureId') == 'DENW44AL00003IkM20100809T071726Z', \ 'did not get expected FeatureId' del_lyr = None # Check also the feature created by the Replace lyr = ds.GetLayerByName('AX_Flurstueck') assert lyr.GetFeatureCount() == 1, 'did not get expected number of features' lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField('gml_id') == 'DENW44AL00003IkM20110429T070635Z', \ 'did not get expected gml_id' assert feat.GetField('stelle') == 5212, 'did not get expected stelle' lyr = None ds = None try: os.remove('data/replace_nas.gfs') except OSError: pass gdalautotest-3.0.4/ogr/ograpispy.py0000755003401500001440000001122713614005364017016 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ograpispy.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGRAPISPY # 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 shutil from difflib import unified_diff import ogrtest import test_py_scripts from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Basic test without snapshoting def test_ograpispy_1(): gdal.SetConfigOption('OGR_API_SPY_FILE', 'tmp/ograpispy_1.py') test_py_scripts.run_py_script('data', 'testograpispy', '') gdal.SetConfigOption('OGR_API_SPY_FILE', None) try: os.stat('tmp/ograpispy_1.py') ogrtest.has_apispy = True except OSError: ogrtest.has_apispy = False pytest.skip() ref_data = open('data/testograpispy.py', 'rt').read() got_data = open('tmp/ograpispy_1.py', 'rt').read() if ref_data != got_data: print() for line in unified_diff(ref_data.splitlines(), got_data.splitlines(), fromfile='expected', tofile='got', lineterm=""): print(line) pytest.fail('did not get expected script') ############################################################################### # With snapshoting def test_ograpispy_2(): if not ogrtest.has_apispy: pytest.skip() try: shutil.rmtree('tmp/snapshot_1') except OSError: pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ograpispy_2.shp') lyr = ds.CreateLayer('ograpispy_2') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ds = None gdal.SetConfigOption('OGR_API_SPY_FILE', 'tmp/ograpispy_2.py') gdal.SetConfigOption('OGR_API_SPY_SNAPSHOT_PATH', 'tmp') ds = ogr.Open('tmp/ograpispy_2.shp', update=1) lyr = ds.GetLayer(0) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None gdal.SetConfigOption('OGR_API_SPY_FILE', None) gdal.SetConfigOption('OGR_API_SPY_SNAPSHOT_PATH', None) ds = ogr.Open('tmp/snapshot_1/source/ograpispy_2.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 0 ds = None ds = ogr.Open('tmp/snapshot_1/working/ograpispy_2.shp', update=1) lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 # Add a feature to check that running the script will work lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None # Check script test_py_scripts.run_py_script('tmp', 'ograpispy_2', '') ds = ogr.Open('tmp/snapshot_1/working/ograpispy_2.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 ds = None shutil.rmtree('tmp/snapshot_1/working') ############################################################################### # def test_ograpispy_cleanup(): gdal.Unlink('tmp/ograpispy_1.py') gdal.Unlink('tmp/ograpispy_2.py') gdal.Unlink('tmp/ograpispy_2.pyc') try: shutil.rmtree('tmp/snapshot_1') except OSError: pass try: os.stat('tmp/ograpispy_2.shp') ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ograpispy_2.shp') except (OSError, AttributeError): pass gdal.Unlink('/vsimem/test2.csv') gdalautotest-3.0.4/ogr/ogr_libkml.py0000755003401500001440000022212113614005364017117 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_libkml.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: LIBKML Driver testing. # 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 gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Test basic open operation for KML datastore. # def test_ogr_libkml_datastore(): ogrtest.kml_ds = None ogrtest.have_read_libkml = 0 ogrtest.kml_drv = None ogrtest.libkml_drv = None ogrtest.kml_drv = ogr.GetDriverByName('LIBKML') if ogrtest.kml_drv is None: pytest.skip() ogrtest.kml_drv = ogr.GetDriverByName('KML') # Unregister KML driver if present as its behaviour is not identical # to new LIBKML driver if ogrtest.kml_drv is not None: print('Unregister KML driver') ogrtest.kml_drv.Deregister() ogrtest.kml_ds = ogr.Open('data/samples.kml') if ogrtest.kml_ds is not None: ogrtest.have_read_libkml = 1 if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds.GetLayerCount() == 10, 'wrong number of layers' ############################################################################### # Test reading attributes for first layer (point). # def test_ogr_libkml_attributes_1(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Placemarks') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Simple placemark', 'Wrong name field value' if feat.GetField('description')[:23] != 'Attached to the ground.': print('got: ', feat.GetField('description')[:23]) pytest.fail('Wrong description field value') feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Floating placemark', 'Wrong name field value' if feat.GetField('description')[:25] != 'Floats a defined distance': print('got: ', feat.GetField('description')[:25]) pytest.fail('Wrong description field value') feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Extruded placemark', 'Wrong name field value' if feat.GetField('description') != 'Tethered to the ground by a customizable\n \"tail\"': print('got: ', feat.GetField('description')) pytest.fail('Wrong description field value') ############################################################################### # Test reading attributes for another layer (point). # def test_ogr_libkml_attributes_2(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Highlighted Icon') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Roll over this icon', 'Wrong name field value' if feat.GetField('description') is not None: print("'%s'" % feat.GetField('description')) pytest.fail('Wrong description field value') feat = lyr.GetNextFeature() assert feat is None, 'unexpected feature found.' ############################################################################### # Test reading attributes for another layer (linestring). # def test_ogr_libkml_attributes_3(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Paths') feat = lyr.GetNextFeature() assert feat.GetField('Name') == 'Tessellated', 'Wrong name field value' assert feat.GetField('description') == 'If the tag has a value of 1, the line will contour to the underlying terrain', \ 'Wrong description field value' feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' assert feat.GetField('Name') == 'Untessellated', 'Wrong name field value' assert feat.GetField('description') == 'If the tag has a value of 0, the line follow a simple straight-line path from point to point', \ 'Wrong description field value' feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' ############################################################################### # Test reading attributes for another layer (polygon). # def test_ogr_libkml_attributes_4(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Google Campus') feat = lyr.GetNextFeature() i = 40 while feat is not None: name = 'Building %d' % i if feat.GetField('Name') != name: print('Got: "%s"' % feat.GetField('name')) pytest.fail('Wrong name field value') assert feat.GetField('description') is None, 'Wrong description field value' i = i + 1 feat = lyr.GetNextFeature() ############################################################################### # Test reading of KML point geometry # def test_ogr_libkml_point_read(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Placemarks') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'POINT(-122.0822035425683 37.42228990140251)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POINT(-122.084075 37.4220033612141 50)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POINT(-122.0857667006183 37.42156927867553 50)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Test reading of KML linestring geometry # def test_ogr_libkml_linestring_read(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Paths') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'LINESTRING (-112.081423783034495 36.106778704771372 0, -112.087026775269294 36.0905099328766 0)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'LINESTRING (-112.080622229594994 36.106734600079953 0,-112.085242575314993 36.090495986124218 0)' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'LINESTRING (-112.265654928602004 36.094476726025462 2357,-112.266038452823807 36.093426088386707 2357,-112.266813901345301 36.092510587768807 2357,-112.267782683444494 36.091898273579957 2357,-112.268855751095202 36.091313794118697 2357,-112.269481071721899 36.090367720752099 2357,-112.269526855561097 36.089321714872852 2357,-112.269014456727604 36.088509160604723 2357,-112.268152881533894 36.087538135979557 2357,-112.2670588176031 36.086826852625677 2357,-112.265737458732104 36.086463123013033 2357)' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Test reading of KML polygon geometry # def test_ogr_libkml_polygon_read(): if not ogrtest.have_read_libkml: pytest.skip() assert ogrtest.kml_ds is not None, 'libkml_ds is none' lyr = ogrtest.kml_ds.GetLayerByName('Google Campus') lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'POLYGON ((-122.084893845961204 37.422571240447859 17,-122.084958097919795 37.422119226268563 17,-122.084746957304702 37.42207183952619 17,-122.084572538096197 37.422090067296757 17,-122.084595488672306 37.422159327008949 17,-122.0838521118269 37.422272785643713 17,-122.083792243334997 37.422035391120843 17,-122.0835076656616 37.422090069571063 17,-122.083470946415204 37.422009873951609 17,-122.083122108574798 37.422104649494599 17,-122.082924737457205 37.422265039903863 17,-122.082933916938501 37.422312428430942 17,-122.083383735973698 37.422250460876178 17,-122.083360785424802 37.422341592287452 17,-122.083420455164202 37.42237075460644 17,-122.083659133885007 37.422512920110009 17,-122.083975843895203 37.422658730937812 17,-122.084237474333094 37.422651439725207 17,-122.0845036949503 37.422651438643499 17,-122.0848020460801 37.422611339163147 17,-122.084788275051494 37.422563950551208 17,-122.084893845961204 37.422571240447859 17))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.085741277148301 37.422270331552568 17,-122.085816976848093 37.422314088323461 17,-122.085852582875006 37.422303374697442 17,-122.085879994563896 37.422256861387893 17,-122.085886010140896 37.422231107613797 17,-122.085806915728796 37.422202501738553 17,-122.085837954265301 37.42214027058678 17,-122.085673264051906 37.422086902144081 17,-122.085602292640701 37.42214885429042 17,-122.085590277843593 37.422128290487002 17,-122.085584167223701 37.422081719672462 17,-122.085485206574106 37.42210455874995 17,-122.085506726435199 37.422142679498243 17,-122.085443071291493 37.422127838461719 17,-122.085099071490404 37.42251282407603 17,-122.085676981863202 37.422818153236513 17,-122.086016227378295 37.422449188587223 17,-122.085726032700407 37.422292396042529 17,-122.085741277148301 37.422270331552568 17))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.085786228724203 37.421362088869692 25,-122.085731299060299 37.421369359894811 25,-122.085731299291794 37.421409349109027 25,-122.085607707367899 37.421383901665649 25,-122.085580242651602 37.42137299550869 25,-122.085218622197104 37.421372995043157 25,-122.085227776563897 37.421616565082651 25,-122.085259818934702 37.421605658944031 25,-122.085259818549901 37.421682001560001 25,-122.085236931147804 37.421700178603459 25,-122.085264395782801 37.421761979825753 25,-122.085323903274599 37.421761980139067 25,-122.085355945432397 37.421852864451999 25,-122.085410875246296 37.421889218237339 25,-122.085479537935697 37.42189285337048 25,-122.085543622981902 37.421889217975462 25,-122.085626017804202 37.421860134999257 25,-122.085937287963006 37.421860134536047 25,-122.085942871866607 37.42160898590042 25,-122.085965546986102 37.421579927591438 25,-122.085864046234093 37.421471150029568 25,-122.0858548911215 37.421405713261841 25,-122.085809116276806 37.4214057134039 25,-122.085786228724203 37.421362088869692 25))' assert not ogrtest.check_feature_geometry(feat, wkt) feat = lyr.GetNextFeature() assert feat is not None, 'expected feature not found.' wkt = 'POLYGON ((-122.084437112828397 37.421772530030907 19,-122.084511885574599 37.421911115428962 19,-122.0850470999805 37.421787551215353 19,-122.085071991339106 37.421436630231611 19,-122.084916406231997 37.421372378221157 19,-122.084219386816699 37.421372378016258 19,-122.084219386589993 37.421476171614962 19,-122.083808641999099 37.4214613409357 19,-122.083789972856394 37.421313064107963 19,-122.083279653469802 37.421293288405927 19,-122.083260981920702 37.421392139442979 19,-122.082937362173695 37.421372363998763 19,-122.082906242566693 37.421515697788713 19,-122.082850226966499 37.421762825764652 19,-122.082943578863507 37.421767769696352 19,-122.083217411188002 37.421792485526858 19,-122.0835970430103 37.421748007445601 19,-122.083945555677104 37.421693642376027 19,-122.084007789463698 37.421762838158529 19,-122.084113587521003 37.421748011043917 19,-122.084076247378405 37.421713412923751 19,-122.084144704773905 37.421678815345693 19,-122.084144704222993 37.421817206601972 19,-122.084250333307395 37.421817070044597 19,-122.084437112828397 37.421772530030907 19))' assert not ogrtest.check_feature_geometry(feat, wkt) ############################################################################### # Write test def ogr_libkml_write(filename): if ogrtest.kml_drv is None: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filename) if filename != '/vsimem/libkml_use_doc_off.kmz': srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS72') lyr = ds.CreateLayer('test_wgs72', srs=srs) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' assert dst_feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49)', \ 'CreateFeature changed the geometry.' lyr = ds.CreateLayer('test_wgs84') fielddefn = ogr.FieldDefn('name', ogr.OFTString) lyr.CreateField(fielddefn) fielddefn = ogr.FieldDefn('description', ogr.OFTString) lyr.CreateField(fielddefn) fielddefn = ogr.FieldDefn('foo', ogr.OFTString) lyr.CreateField(fielddefn) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetField('name', 'my_name') dst_feat.SetField('description', 'my_description') dst_feat.SetField('foo', 'bar') dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49 1)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (0 1,2 3)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0),(0.25 0.25 0,0.25 0.75 0,0.75 0.75 0,0.75 0.25 0,0.25 0.25 0))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT (2 49,2 49)')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING ((0 1,2 3),(0 1,2 3))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0),(0.25 0.25 0,0.25 0.75 0,0.75 0.75 0,0.75 0.25 0,0.25 0.25 0)),((-0.25 0.25 0,-0.25 0.75 0,-0.75 0.75 0,-0.75 0.25 0,-0.25 0.25 0)))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (2 49 1),LINESTRING (0 1,2 3))')) assert lyr.CreateFeature(dst_feat) == 0, 'CreateFeature failed.' ds = None ############################################################################### # Check previous test def ogr_libkml_check_write(filename): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open(filename) if filename != '/vsimem/libkml_use_doc_off.kmz': lyr = ds.GetLayerByName('test_wgs84') else: lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 8, 'Bad feature count.' feat = lyr.GetNextFeature() assert feat.GetField('name') == 'my_name', 'Unexpected name.' assert feat.GetField('description') == 'my_description', 'Unexpected description.' assert feat.GetField('foo') == 'bar', 'Unexpected foo.' assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49 0)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POINT (2 49 1)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'LINESTRING (0 1 0,2 3 0)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'POLYGON ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0),(0.25 0.25 0,0.25 0.75 0,0.75 0.75 0,0.75 0.25 0,0.25 0.25 0))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTIPOINT (2 49 0,2 49 0)', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTILINESTRING ((0 1 0,2 3 0),(0 1 0,2 3 0))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'MULTIPOLYGON (((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0),(0.25 0.25 0,0.25 0.75 0,0.75 0.75 0,0.75 0.25 0,0.25 0.25 0)),((-0.25 0.25 0,-0.25 0.75 0,-0.75 0.75 0,-0.75 0.25 0,-0.25 0.25 0)))', \ 'Unexpected geometry.' feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == 'GEOMETRYCOLLECTION (POINT (2 49 1),LINESTRING (0 1 0,2 3 0))', \ 'Unexpected geometry.' ds = None ############################################################################### def test_ogr_libkml_write_kml(): return ogr_libkml_write('/vsimem/libkml.kml') def test_ogr_libkml_check_write_kml(): return ogr_libkml_check_write('/vsimem/libkml.kml') def test_ogr_libkml_write_kmz(): return ogr_libkml_write('/vsimem/libkml.kmz') def test_ogr_libkml_check_write_kmz(): return ogr_libkml_check_write('/vsimem/libkml.kmz') def test_ogr_libkml_write_kmz_use_doc_off(): gdal.SetConfigOption("LIBKML_USE_DOC.KML", "NO") ret = ogr_libkml_write('/vsimem/libkml_use_doc_off.kmz') gdal.SetConfigOption("LIBKML_USE_DOC.KML", None) return ret def test_ogr_libkml_check_write_kmz_use_doc_off(): return ogr_libkml_check_write('/vsimem/libkml_use_doc_off.kmz') def test_ogr_libkml_write_dir(): return ogr_libkml_write('/vsimem/libkmldir') def test_ogr_libkml_check_write_dir(): if not ogrtest.have_read_libkml: pytest.skip() ret = ogr_libkml_check_write('/vsimem/libkmldir') files = gdal.ReadDir('/vsimem/libkmldir') for filename in files: gdal.Unlink('/vsimem/libkmldir/' + filename) gdal.Rmdir('/vsimem/libkmldir') return ret ############################################################################### # Test reading attributes with XML content in them # def test_ogr_libkml_xml_attributes(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/description_with_xml.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('description').find('Description

Interesting

') != 0: print('got: %s ' % feat.GetField('description')) pytest.fail('Wrong description field value') ds = None ############################################################################### # Test reading all geometry types (#3558) # def test_ogr_libkml_read_geometries(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/geometries.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() while feat is not None: feat = lyr.GetNextFeature() ds = None ############################################################################### # Run test_ogrsf def test_ogr_libkml_test_ogrsf(): if not ogrtest.have_read_libkml: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' --config OGR_SKIP KML -ro data/samples.kml') assert not (ret.find("using driver `LIBKML'") == -1 or ret.find('INFO') == -1 or ret.find('ERROR') != -1) ############################################################################### # Test reading KML with only Placemark def test_ogr_libkml_read_placemark(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/placemark.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat is not None ds = None ############################################################################### # Test reading KML without any layer def test_ogr_libkml_read_empty(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/empty.kml') assert ds.GetLayerCount() == 0 ds = None ############################################################################### # Test reading KML with empty layers def test_ogr_libkml_read_emptylayers(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/emptylayers.kml') assert ds.GetLayerCount() == 2 # --> One difference with the old KML driver assert ds.GetLayer(0).GetFeatureCount() == 1 assert ds.GetLayer(1).GetFeatureCount() == 0 ds = None ############################################################################### # Test reading KML with empty layers ############################################################################### # Test reading KML with empty layers without folder def test_ogr_libkml_read_emptylayers_without_folder(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/emptylayers_without_folder.kml') assert ds.GetLayerCount() == 1 # --> One difference with the old KML driver assert ds.GetLayer(0).GetName() == 'Test', \ ("Layer name must be '" + ds.GetLayer(0).GetName() + "'.") ds = None ############################################################################### # Test reading KML with empty layers without_folder def test_ogr_libkml_read_schema(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/test_schema.kml') assert ds.GetLayerCount() == 4 lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('foo') != 'bar': feat.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) feat = lyr.GetNextFeature() if feat.GetField('foo') != 'baz': feat.DumpReadable() pytest.fail() lyr = ds.GetLayer(2) assert lyr.GetLayerDefn().GetFieldIndex('foo') == -1 lyr = ds.GetLayer(3) assert lyr.GetLayerDefn().GetFieldIndex('foo') == -1 ds = None ############################################################################### # Test reading KML with elements of in case # doesn't use a (test changeset r22127) def test_ogr_libkml_extended_data_without_schema_data(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/extended_data_without_schema_data.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('field1') != '1_1': feat.DumpReadable() pytest.fail() if feat.GetField('field2') != '1_2': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetField('field1') != '2_1': feat.DumpReadable() pytest.fail() if feat.IsFieldSet('field2'): feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test reading KML with element (#5095) def test_ogr_libkml_gxtrack(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/gxtrack.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('begin') != '2013/05/28 12:00:00' or \ feat.GetField('end') != '2013/05/28 13:00:00' or \ feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (2 49,3 50)': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test reading KML with element def test_ogr_libkml_gxmultitrack(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.Open('data/gxmultitrack.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('begin') != '2013/05/28 12:00:00' or \ feat.GetField('end') != '2013/05/28 13:00:00' or \ feat.GetGeometryRef().ExportToWkt() != 'MULTILINESTRING ((2 49,3 50))': feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test generating and reading KML with element def test_ogr_libkml_camera(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_camera.kml") lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn("heading", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("tilt", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("roll", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("altitudeMode", ogr.OFTString)) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) dst_feat.SetField("heading", 70) dst_feat.SetField("tilt", 75) dst_feat.SetField("roll", 10) with gdaltest.error_handler(): lyr.CreateFeature(dst_feat) dst_feat = ogr.Feature(lyr.GetLayerDefn()) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 50 1)')) dst_feat.SetField("heading", -70) dst_feat.SetField("altitudeMode", "relativeToGround") lyr.CreateFeature(dst_feat) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_camera.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('') == -1 or \ data.find('2') == -1 or \ data.find('49') == -1 or \ data.find('70') == -1 or \ data.find('75') == -1 or \ data.find('10') == -1 or \ data.find('relativeToGround') == -1)) ds = ogr.Open('/vsimem/ogr_libkml_camera.kml') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if (feat.GetGeometryRef().ExportToWkt() != 'POINT (2 49 0)' or feat.GetField("heading") != 70.0 or feat.GetField("tilt") != 75.0 or feat.GetField("roll") != 10.0): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if (feat.GetGeometryRef().ExportToWkt() != 'POINT (3 50 1)' or feat.GetField("heading") != -70.0 or feat.IsFieldSet("tilt") or feat.IsFieldSet("roll") or feat.GetField("altitudeMode") != 'relativeToGround'): feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test generating a LookAt element at Document level def test_ogr_libkml_write_layer_lookat(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_layer_lookat.kml") options = ['LOOKAT_LONGITUDE=2', 'LOOKAT_LATITUDE=49', 'LOOKAT_RANGE=150'] ds.CreateLayer('test', options=options) options = ['LOOKAT_LONGITUDE=3', 'LOOKAT_LATITUDE=50', 'LOOKAT_RANGE=250', 'LOOKAT_ALTITUDE=100', 'LOOKAT_HEADING=70', 'LOOKAT_TILT=50', 'LOOKAT_ALTITUDEMODE=relativeToGround'] ds.CreateLayer('test2', options=options) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_layer_lookat.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('') == -1 or \ data.find('2') == -1 or \ data.find('49') == -1 or \ data.find('150') == -1)) assert (not (data.find('') == -1 or \ data.find('3') == -1 or \ data.find('50') == -1 or \ data.find('100') == -1 or \ data.find('70') == -1 or \ data.find('50') == -1 or \ data.find('150') == -1 or \ data.find('relativeToGround') == -1)) ############################################################################### # Test generating a Camera element at Document level def test_ogr_libkml_write_layer_camera(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_layer_camera.kml") options = ['CAMERA_LONGITUDE=3', 'CAMERA_LATITUDE=50', 'CAMERA_ALTITUDE=100', 'CAMERA_HEADING=70', 'CAMERA_TILT=50', 'CAMERA_ROLL=10', 'CAMERA_ALTITUDEMODE=relativeToGround'] ds.CreateLayer('test', options=options) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_layer_camera.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('') == -1 or \ data.find('3') == -1 or \ data.find('50') == -1 or \ data.find('100') == -1 or \ data.find('70') == -1 or \ data.find('50') == -1 or \ data.find('10') == -1 or \ data.find('relativeToGround') == -1)) ############################################################################### # Test writing MultiGeometry def test_ogr_libkml_write_multigeometry(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_multigeometry.kml") lyr = ds.CreateLayer('test') feat = ogr.Feature(lyr.GetLayerDefn()) # Transformed into POINT per ATC 66 feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(0 1)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) # Warning emitted per ATC 66 feat.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT EMPTY')) with gdaltest.error_handler(): lyr.CreateFeature(feat) ds = None ds = ogr.Open("/vsimem/ogr_libkml_write_multigeometry.kml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'POINT (0 1 0)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'GEOMETRYCOLLECTION EMPTY': feat.DumpReadable() pytest.fail() ############################################################################### # Test writing def test_ogr_libkml_write_snippet(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_snippet.kml") lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn("snippet", ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('snippet', 'test_snippet') feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_snippet.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert data.find('test_snippet') != -1 ds = ogr.Open("/vsimem/ogr_libkml_write_snippet.kml") lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() if feat.GetField('snippet') != 'test_snippet': feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POINT (0 1 0)': feat.DumpReadable() pytest.fail() ############################################################################### # Test writing def test_ogr_libkml_write_atom_author(): if not ogrtest.have_read_libkml: pytest.skip() filepath = '/vsimem/ogr_libkml_write_atom_author.kml' ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filepath, options=['author_name=name', 'author_uri=http://foo', 'author_email=foo@bar.com']) assert ds is not None, ('Unable to create %s.' % filepath) ds = None f = gdal.VSIFOpenL(filepath, 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('') == -1 or \ data.find('name') == -1 or \ data.find('http://foo') == -1 or \ data.find('foo@bar.com') == -1)), \ 'failure to find an atom string' ############################################################################### # Test writing def test_ogr_libkml_write_atom_link(): if not ogrtest.have_read_libkml: pytest.skip() filepath = '/vsimem/ogr_libkml_write_atom_link.kml' ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filepath, options=['link=http://foo']) assert ds is not None, ('Unable to create %s.' % filepath) ds = None f = gdal.VSIFOpenL(filepath, 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('') == -1 or \ data.find('') == -1)) ############################################################################### # Test writing def test_ogr_libkml_write_phonenumber(): if not ogrtest.have_read_libkml: pytest.skip() filepath = '/vsimem/ogr_libkml_write_phonenumber.kml' ds = ogr.GetDriverByName('LIBKML').CreateDataSource(filepath, options=['phonenumber=tel:911']) assert ds is not None, ('Unable to create %s.' % filepath) ds = None f = gdal.VSIFOpenL(filepath, 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert data.find('tel:911') != -1 ############################################################################### # Test writing Region def test_ogr_libkml_write_region(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_region.kml") lyr = ds.CreateLayer('auto', options=['ADD_REGION=YES']) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((2 48,2 49,3 49,3 48,2 48))')) lyr.CreateFeature(feat) lyr = ds.CreateLayer('manual', options=['ADD_REGION=YES', 'REGION_XMIN=-180', 'REGION_XMAX=180', 'REGION_YMIN=-90', 'REGION_YMAX=90', 'REGION_MIN_LOD_PIXELS=128', 'REGION_MAX_LOD_PIXELS=10000000', 'REGION_MIN_FADE_EXTENT=1', 'REGION_MAX_FADE_EXTENT=2']) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_region.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('49') == -1 or \ data.find('48') == -1 or \ data.find('3') == -1 or \ data.find('2') == -1 or \ data.find('256') == -1 or \ data.find('-1') == -1)) assert (not (data.find('90') == -1 or \ data.find('-90') == -1 or \ data.find('180') == -1 or \ data.find('-180') == -1 or \ data.find('128') == -1 or \ data.find('10000000') == -1 or \ data.find('1') == -1 or \ data.find('2') == -1)) ############################################################################### # Test writing ScreenOverlay def test_ogr_libkml_write_screenoverlay(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_screenoverlay.kml") ds.CreateLayer('auto', options=['SO_HREF=http://foo']) ds.CreateLayer('manual', options=['SO_HREF=http://bar', 'SO_NAME=name', 'SO_DESCRIPTION=description', 'SO_OVERLAY_X=10', 'SO_OVERLAY_Y=20', 'SO_OVERLAY_XUNITS=pixels', 'SO_OVERLAY_YUNITS=pixels', 'SO_SCREEN_X=0.4', 'SO_SCREEN_Y=0.5', 'SO_SCREEN_XUNITS=fraction', 'SO_SCREEN_YUNITS=fraction', 'SO_SIZE_X=1.1', 'SO_SIZE_Y=1.2', 'SO_SIZE_XUNITS=fraction', 'SO_SIZE_YUNITS=fraction']) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_screenoverlay.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('http://foo') == -1 or \ data.find('') == -1)) assert (not (data.find('') == -1 or \ data.find('') == -1 or \ data.find('') == -1 or \ data.find('name') == -1 or \ data.find('description') == -1)) ############################################################################### # Test writing Model def test_ogr_libkml_write_model(): if not ogrtest.have_read_libkml: pytest.skip() ds = ogr.GetDriverByName('LIBKML').CreateDataSource("/vsimem/ogr_libkml_write_model.kml") lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn("model", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("heading", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("tilt", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("roll", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("altitudeMode", ogr.OFTString)) lyr.CreateField(ogr.FieldDefn("scale_x", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("scale_y", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("scale_z", ogr.OFTReal)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49 10)')) feat.SetField("tilt", 75) feat.SetField("roll", 10) feat.SetField("heading", -70) feat.SetField("scale_x", 2) feat.SetField("scale_y", 3) feat.SetField("scale_z", 4) feat.SetField("altitudeMode", "relativeToGround") feat.SetField("model", "http://makc.googlecode.com/svn/trunk/flash/sandy_flar2/cube.dae") lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (2 49)')) feat.SetField("model", "http://foo") lyr.CreateFeature(feat) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_write_model.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) assert (not (data.find('2') == -1 or \ data.find('49') == -1 or \ data.find('10') == -1 or \ data.find('relativeToGround') == -1 or \ data.find('-70') == -1 or \ data.find('75') == -1 or \ data.find('10') == -1 or \ data.find('2') == -1 or \ data.find('3') == -1 or \ data.find('4') == -1 or \ data.find('1') == -1 or \ data.find('1') == -1 or \ data.find('1') == -1 or \ data.find('http://makc.googlecode.com/svn/trunk/flash/sandy_flar2/cube.dae') == -1 or \ data.find('http://foo') == -1)) # This can only appear if HTTP resource is available and GDAL is built with curl/http support if gdal.GetDriverByName('HTTP') is not None and \ (data.find('http://makc.googlecode.com/svn/trunk/flash/sandy_flar2/cube.gif') == -1 or data.find('cube.gif') == -1): assert gdaltest.gdalurlopen('http://makc.googlecode.com/svn/trunk/flash/sandy_flar2/cube.dae') is None, \ data ############################################################################### # Test read / write of style def test_ogr_libkml_read_write_style(): if not ogrtest.have_read_libkml: pytest.skip() f = gdal.VSIFOpenL('/vsimem/ogr_libkml_read_write_style_read.kml', 'wb') styles = """ """ content = """ %s normal highlight #style2 """ % styles resolved_stylemap = """""" resolved_stylemap_highlight = """""" gdal.VSIFWriteL(content, 1, len(content), f) gdal.VSIFCloseL(f) src_ds = ogr.Open('/vsimem/ogr_libkml_read_write_style_read.kml') style_table = src_ds.GetStyleTable() options = ['style1_balloonstyle_bgcolor=#FFFF00', 'style1_balloonstyle_text=This is $[name], whose description is:
$[description]'] ds = ogr.GetDriverByName('LIBKML').CreateDataSource('/vsimem/ogr_libkml_read_write_style_write.kml', options=options) ds.SetStyleTable(style_table) ds = None src_ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_read_write_style_write.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) lines = [l.strip() for l in data.split('\n')] lines_got = lines[lines.index('""" lines = [l.strip() for l in data.split('\n')] lines_got = lines[lines.index('') + 1] lines_ref = [l.strip() for l in expected_style.split('\n')] if lines_got != lines_ref: print(data) pytest.fail(resolved_stylemap_highlight) # Automatic StyleMap creation testing ds = ogr.GetDriverByName('LIBKML').CreateDataSource('/vsimem/ogr_libkml_read_write_style_write.kml') style_table = ogr.StyleTable() style_table.AddStyle('style1_normal', 'SYMBOL(id:"http://style1_normal",c:#67452301)') style_table.AddStyle('style1_highlight', 'SYMBOL(id:"http://style1_highlight",c:#10325476)') ds.SetStyleTable(style_table) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_libkml_read_write_style_write.kml', 'rb') data = gdal.VSIFReadL(1, 2048, f) data = data.decode('ascii') gdal.VSIFCloseL(f) lines = [l.strip() for l in data.split('\n')] expected_styles = """ normal #style1_normal highlight #style1_highlight """ lines_got = lines[lines.index(' """ vrt_ds = ogr.Open(vrt_xml, update=1) vrt_lyr = vrt_ds.GetLayerByName('test') # Only val1, val2, style attributes should be reported assert vrt_lyr.GetLayerDefn().GetFieldCount() == 3 assert vrt_lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef() == 'val1' assert vrt_lyr.GetLayerDefn().GetFieldDefn(1).GetNameRef() == 'val2' feat = vrt_lyr.GetNextFeature() if feat.GetStyleString() != 'PEN(c:#FF0000,w:5pt,p:"2px 1pt")': feat.DumpReadable() pytest.fail() feat = ogr.Feature(vrt_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (3 50)') feat.SetGeometryDirectly(geom) feat.SetField('val1', 'val21') vrt_lyr.CreateFeature(feat) vrt_lyr.ResetReading() feat = vrt_lyr.GetFeature(2) geom = feat.GetGeometryRef() if geom.ExportToWkt() != 'POINT (3 50)': feat.DumpReadable() pytest.fail() assert feat.GetFieldAsString('val1') == 'val21' # The x and y fields are considered as string by default, so spatial # filter cannot be turned into attribute filter gdal.PushErrorHandler('CPLQuietErrorHandler') vrt_lyr.SetSpatialFilterRect(0, 40, 10, 49.5) ret = vrt_lyr.GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('not declared as numeric fields') != -1 assert ret == 1 vrt_ds = None # Add a .csvt file to specify the x and y columns as reals f = open('tmp/test.csvt', 'wb') f.write('Real,String,Real,String\n'.encode('ascii')) f.close() vrt_ds = ogr.Open(vrt_xml, update=1) vrt_lyr = vrt_ds.GetLayerByName('test') vrt_lyr.SetSpatialFilterRect(0, 40, 10, 49.5) assert vrt_lyr.GetFeatureCount() == 1 assert gdal.GetLastErrorMsg() == '' vrt_lyr.SetAttributeFilter("1 = 1") assert vrt_lyr.GetFeatureCount() == 1 vrt_lyr.SetAttributeFilter("1 = 0") assert vrt_lyr.GetFeatureCount() == 0 vrt_ds = None os.remove('tmp/test.csv') os.remove('tmp/test.csvt') ############################################################################### # Test VRT write capabilities with WKT geometries def test_ogr_vrt_12(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csv', 'wb') f.write('wkt_geom,val1,val2\n'.encode('ascii')) f.write('POINT (2 49),"val11","val12"\n'.encode('ascii')) f.close() vrt_xml = """ tmp/test.csv test """ vrt_ds = ogr.Open(vrt_xml, update=1) vrt_lyr = vrt_ds.GetLayerByName('test') feat = ogr.Feature(vrt_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (3 50)') feat.SetGeometryDirectly(geom) feat.SetField('val1', 'val21') vrt_lyr.CreateFeature(feat) vrt_lyr.ResetReading() feat = vrt_lyr.GetFeature(2) geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (3 50)' assert feat.GetFieldAsString('val1') == 'val21' vrt_ds = None os.remove('tmp/test.csv') ############################################################################### # Test VRT write capabilities with WKB geometries def test_ogr_vrt_13(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csv', 'wb') f.write('wkb_geom,val1,val2\n'.encode('ascii')) f.close() vrt_xml = """ tmp/test.csv test """ vrt_ds = ogr.Open(vrt_xml, update=1) vrt_lyr = vrt_ds.GetLayerByName('test') feat = ogr.Feature(vrt_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (3 50)') feat.SetGeometryDirectly(geom) feat.SetField('val1', 'val21') vrt_lyr.CreateFeature(feat) vrt_lyr.ResetReading() feat = vrt_lyr.GetFeature(1) geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (3 50)' assert feat.GetFieldAsString('val1') == 'val21' vrt_ds = None os.remove('tmp/test.csv') ############################################################################### # Test SrcRegion element for VGS_Direct def test_ogr_vrt_14(): if gdaltest.vrt_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') try: ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') except AttributeError: pass gdal.PopErrorHandler() shp_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test.shp') shp_lyr = shp_ds.CreateLayer('test') feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (2 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) shp_ds.ExecuteSQL('CREATE SPATIAL INDEX on test') shp_ds = None vrt_xml = """ tmp/test.shp test POLYGON((0 40,0 50,10 50,10 40,0 40)) """ vrt_ds = ogr.Open(vrt_xml) vrt_lyr = vrt_ds.GetLayerByName('mytest') assert vrt_lyr.TestCapability(ogr.OLCFastSpatialFilter) == 1, 'Fast filter not set.' extent = vrt_lyr.GetExtent() assert extent == (2.0, 2.0, 49.0, 49.0), 'wrong extent' assert vrt_lyr.GetFeatureCount() == 1, 'Feature count not one as expected.' feat = vrt_lyr.GetNextFeature() assert feat.GetFID() == 2, 'did not get fid 2.' geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)', 'did not get expected point geometry.' vrt_lyr.SetSpatialFilterRect(1, 41, 3, 49.5) if vrt_lyr.GetFeatureCount() != 1: if gdal.GetLastErrorMsg().find('GEOS support not enabled') != -1: vrt_ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') pytest.skip() print(vrt_lyr.GetFeatureCount()) pytest.fail('did not get one feature on rect spatial filter.') vrt_lyr.SetSpatialFilterRect(1, 41, 3, 48.5) assert vrt_lyr.GetFeatureCount() == 0, 'Did not get expected zero feature count.' vrt_lyr.SetSpatialFilter(None) assert vrt_lyr.GetFeatureCount() == 1, \ 'Did not get expected one feature count with no filter.' vrt_ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') ############################################################################### # Test SrcRegion element for VGS_WKT def test_ogr_vrt_15(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csv', 'wb') f.write('wkt_geom,val1,val2\n'.encode('ascii')) f.write('POINT (-10 49),,\n'.encode('ascii')) f.write('POINT (-10 49),,\n'.encode('ascii')) f.write('POINT (2 49),,\n'.encode('ascii')) f.write('POINT (-10 49),,\n'.encode('ascii')) f.close() vrt_xml = """ tmp/test.csv test POLYGON((0 40,0 50,10 50,10 40,0 40)) """ vrt_ds = ogr.Open(vrt_xml) vrt_lyr = vrt_ds.GetLayerByName('test') assert vrt_lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0 assert vrt_lyr.GetFeatureCount() == 1 feat = vrt_lyr.GetNextFeature() assert feat.GetFID() == 3 geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)' vrt_lyr.SetSpatialFilterRect(1, 41, 3, 49.5) assert vrt_lyr.GetFeatureCount() == 1 vrt_lyr.SetSpatialFilterRect(1, 41, 3, 48.5) assert vrt_lyr.GetFeatureCount() == 0 vrt_lyr.SetSpatialFilter(None) assert vrt_lyr.GetFeatureCount() == 1 vrt_ds = None os.remove('tmp/test.csv') ############################################################################### # Test SrcRegion element for VGS_PointFromColumns def test_ogr_vrt_16(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csvt', 'wb') f.write('Real,Real,String,String\n'.encode('ascii')) f.close() f = open('tmp/test.csv', 'wb') f.write('x,y,val1,val2\n'.encode('ascii')) f.write('-10,49,,\n'.encode('ascii')) f.write('-10,49,,\n'.encode('ascii')) f.write('2,49,,\n'.encode('ascii')) f.write('-10,49,,\n'.encode('ascii')) f.close() vrt_xml = """ tmp/test.csv test POLYGON((0 40,0 50,10 50,10 40,0 40)) """ vrt_ds = ogr.Open(vrt_xml) vrt_lyr = vrt_ds.GetLayerByName('test') assert vrt_lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0 assert vrt_lyr.GetFeatureCount() == 1 feat = vrt_lyr.GetNextFeature() assert feat.GetFID() == 3 geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (2 49)' vrt_lyr.SetSpatialFilterRect(1, 41, 3, 49.5) if vrt_lyr.GetFeatureCount() != 1: if gdal.GetLastErrorMsg().find('GEOS support not enabled') != -1: vrt_ds = None os.remove('tmp/test.csv') os.remove('tmp/test.csvt') pytest.skip() pytest.fail() vrt_lyr.SetSpatialFilterRect(1, 41, 3, 48.5) assert vrt_lyr.GetFeatureCount() == 0 vrt_lyr.SetSpatialFilter(None) assert vrt_lyr.GetFeatureCount() == 1 vrt_ds = None os.remove('tmp/test.csv') os.remove('tmp/test.csvt') ############################################################################### # Test explicit field definitions. def test_ogr_vrt_17(): if gdaltest.vrt_ds is None: pytest.skip() vrt_xml = """ data/prime_meridian.csv prime_meridian """ vrt_ds = ogr.Open(vrt_xml) vrt_lyr = vrt_ds.GetLayerByName('test') assert vrt_lyr.GetLayerDefn().GetFieldCount() == 4, 'unexpected field count.' flddef = vrt_lyr.GetLayerDefn().GetFieldDefn(0) assert flddef.GetName() == 'pm_code' and flddef.GetType() == ogr.OFTInteger and flddef.GetWidth() == 4 and flddef.GetPrecision() == 0, \ 'pm_code field definition wrong.' flddef = vrt_lyr.GetLayerDefn().GetFieldDefn(1) assert flddef.GetName() == 'prime_meridian_name' and flddef.GetType() == ogr.OFTString and flddef.GetWidth() == 24 and flddef.GetPrecision() == 0, \ 'prime_meridian_name field definition wrong.' flddef = vrt_lyr.GetLayerDefn().GetFieldDefn(2) assert flddef.GetName() == 'new_col' and flddef.GetType() == ogr.OFTReal and flddef.GetWidth() == 12 and flddef.GetPrecision() == 3, \ 'new_col field definition wrong.' flddef = vrt_lyr.GetLayerDefn().GetFieldDefn(3) assert flddef.GetName() == 'DEPRECATED' and flddef.GetType() == ogr.OFTInteger and flddef.GetSubType() == ogr.OFSTBoolean, \ 'DEPRECATED field definition wrong.' feat = vrt_lyr.GetNextFeature() assert feat.GetField(0) == 8901 and feat.GetField(1) == "Greenwich" and feat.GetField(2) is None, \ 'did not get expected field value(s).' ############################################################################### # Test that attribute filters are *not* passed to sublayer by default # when explicit fields are defined. def test_ogr_vrt_18(): if gdaltest.vrt_ds is None: pytest.skip() vrt_xml = """ data/prime_meridian.csv prime_meridian """ vrt_ds = ogr.Open(vrt_xml) vrt_lyr = vrt_ds.GetLayerByName('test') vrt_lyr.SetAttributeFilter('pm_code=8904') feat = vrt_lyr.GetNextFeature() assert feat.GetField(0) == 8904, 'Attribute filter not working properly' ############################################################################### # Run test_ogrsf (optimized path) def test_ogr_vrt_19_optimized(): if gdaltest.vrt_ds 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/poly_vrt.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run test_ogrsf (non optimized path) def test_ogr_vrt_19_nonoptimized(): if gdaltest.vrt_ds 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/poly_nonoptimized_vrt.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test VGS_Direct def test_ogr_vrt_20(): if gdaltest.vrt_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') try: ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') except AttributeError: pass gdal.PopErrorHandler() shp_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/test.shp') shp_lyr = shp_ds.CreateLayer('test') feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 45)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (2 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) feat = ogr.Feature(shp_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (-10 49)') feat.SetGeometryDirectly(geom) shp_lyr.CreateFeature(feat) shp_ds.ExecuteSQL('CREATE SPATIAL INDEX on test') shp_ds = None vrt_xml = """ tmp/test.shp test """ vrt_ds = ogr.Open(vrt_xml, update=1) vrt_lyr = vrt_ds.GetLayerByName('mytest') assert vrt_lyr.TestCapability(ogr.OLCFastFeatureCount) == 1, \ 'Fast feature count not set.' assert vrt_lyr.TestCapability(ogr.OLCFastSpatialFilter) == 1, 'Fast filter not set.' assert vrt_lyr.TestCapability(ogr.OLCFastGetExtent) == 1, 'Fast extent not set.' extent = vrt_lyr.GetExtent() assert extent == (-10.0, 2.0, 45.0, 49.0), 'wrong extent' assert vrt_lyr.GetFeatureCount() == 4, 'Feature count not 4 as expected.' vrt_lyr.SetSpatialFilterRect(1, 48.5, 3, 49.5) if vrt_lyr.GetFeatureCount() != 1: if gdal.GetLastErrorMsg().find('GEOS support not enabled') != -1: vrt_ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') pytest.skip() print(vrt_lyr.GetFeatureCount()) pytest.fail('did not get one feature on rect spatial filter.') assert vrt_lyr.TestCapability(ogr.OLCFastFeatureCount) == 1, \ 'Fast feature count not set.' assert vrt_lyr.TestCapability(ogr.OLCFastGetExtent) == 1, 'Fast extent not set.' extent = vrt_lyr.GetExtent() # the shapefile driver currently doesn't change the extent even in the # presence of a spatial filter, so that could change in the future assert extent == (-10.0, 2.0, 45.0, 49.0), 'wrong extent' vrt_lyr.SetSpatialFilterRect(1, 48, 3, 48.5) assert vrt_lyr.GetFeatureCount() == 0, 'Did not get expected zero feature count.' vrt_lyr.SetSpatialFilter(None) assert vrt_lyr.GetFeatureCount() == 4, \ 'Feature count not 4 as expected with no filter.' vrt_lyr.ResetReading() feat = vrt_lyr.GetNextFeature() feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) vrt_lyr.SetFeature(feat) feat = None vrt_lyr.ResetReading() feat = vrt_lyr.GetNextFeature() if feat.GetGeometryRef() is None or \ feat.GetGeometryRef().ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() vrt_ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/test.shp') ############################################################################### # Test lazy initialization with valid layer def ogr_vrt_21_internal(): if gdaltest.vrt_ds is None: pytest.skip() ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetName() == 'test3' ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetGeomType() == ogr.wkbPoint ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetSpatialRef().ExportToWkt().find('84') != -1 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.ResetReading() ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetNextFeature() is not None ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetFeature(1) is not None ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetFeatureCount() != 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.SetNextByIndex(1) == 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetLayerDefn().GetFieldCount() != 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.SetAttributeFilter('') == 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.SetSpatialFilter(None) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetExtent() is not None ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') assert lyr.GetFIDColumn() == 'fid' ds = None feature_defn = ogr.FeatureDefn() feat = ogr.Feature(feature_defn) ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.CreateFeature(feat) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.SetFeature(feat) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.DeleteFeature(0) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test3') lyr.SyncToDisk() ds = None def test_ogr_vrt_21(): gdal.PushErrorHandler('CPLQuietErrorHandler') try: ret = ogr_vrt_21_internal() except: ret = 'fail' gdal.PopErrorHandler() return ret ############################################################################### # Test lazy initialization with invalid layer def ogr_vrt_22_internal(): if gdaltest.vrt_ds is None: pytest.skip() ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetName() == 'test5' ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetGeomType() == ogr.wkbPoint ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetSpatialRef().ExportToWkt().find('84') != -1 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.ResetReading() ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetNextFeature() is None ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetFeature(1) is None ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetFeatureCount() == 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.SetNextByIndex(1) != 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetLayerDefn().GetFieldCount() == 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.SetAttributeFilter('') != 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.SetSpatialFilter(None) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 0 ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') assert lyr.GetFIDColumn() == '' ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.GetExtent() ds = None feature_defn = ogr.FeatureDefn() feat = ogr.Feature(feature_defn) ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.CreateFeature(feat) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.SetFeature(feat) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.DeleteFeature(0) ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.SyncToDisk() ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.StartTransaction() ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.CommitTransaction() ds = None ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test5') lyr.RollbackTransaction() ds = None def test_ogr_vrt_22(): gdal.PushErrorHandler('CPLQuietErrorHandler') try: ret = ogr_vrt_22_internal() except: ret = 'fail' gdal.PopErrorHandler() return ret ############################################################################### # Test anti-recursion mechanism def test_ogr_vrt_23(shared_ds_flag=''): if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') rec1 = """ /vsimem/rec2.vrt rec2 """ % shared_ds_flag rec2 = """ /vsimem/rec1.vrt rec1 """ % shared_ds_flag gdal.FileFromMemBuffer('/vsimem/rec1.vrt', rec1) gdal.FileFromMemBuffer('/vsimem/rec2.vrt', rec2) ds = ogr.Open('/vsimem/rec1.vrt') assert ds is not None gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetLayer(0).GetLayerDefn() ds.GetLayer(0).GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'error expected !' gdal.Unlink('/vsimem/rec1.vrt') gdal.Unlink('/vsimem/rec2.vrt') ############################################################################### # Test anti-recursion mechanism on shared DS def test_ogr_vrt_24(): test_ogr_vrt_23(' shared="1"') rec1 = """ /vsimem/rec2.vrt """ rec2 = """ /vsimem/rec2.vrt """ gdal.FileFromMemBuffer('/vsimem/rec1.vrt', rec1) gdal.FileFromMemBuffer('/vsimem/rec2.vrt', rec2) ds = ogr.Open('/vsimem/rec1.vrt') assert ds is not None gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetLayer(0).GetLayerDefn() ds.GetLayer(0).GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'error expected !' gdal.Unlink('/vsimem/rec1.vrt') gdal.Unlink('/vsimem/rec2.vrt') ############################################################################### # Test GetFIDColumn() def test_ogr_vrt_25(): with gdaltest.error_handler(): ds = ogr.Open('data/vrt_test.vrt') # test3 layer just declares fid, and implicit fields (so all source # fields are taken as VRT fields), we can report the fid column lyr = ds.GetLayerByName('test3') assert lyr.GetFIDColumn() == 'fid' # test6 layer declares fid, and explicit fields without the fid lyr = ds.GetLayerByName('test6') assert lyr.GetFIDColumn() == 'fid' # test7 layer just declares fid with an external visible name lyr = ds.GetLayerByName('test7') assert lyr.GetFIDColumn() == 'bar' # test2 layer does not declare fid, and source layer has no fid column # so nothing to report lyr = ds.GetLayerByName('test2') assert lyr.GetFIDColumn() == '' ds = None ############################################################################### # Test transaction support def test_ogr_vrt_26(): if ogr.GetDriverByName('SQLite') is None: pytest.skip() sqlite_ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_vrt_26.db') if sqlite_ds is None: pytest.skip() lyr = sqlite_ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr = None sqlite_ds.SyncToDisk() vrt_ds = ogr.Open(""" /vsimem/ogr_vrt_26.db """, update=1) lyr = vrt_ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCTransactions) != 0 lyr.StartTransaction() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo') lyr.CreateFeature(feat) feat = None assert lyr.GetFeatureCount() == 1 lyr.RollbackTransaction() assert lyr.GetFeatureCount() == 0 lyr.StartTransaction() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'bar') lyr.CreateFeature(feat) feat = None lyr.CommitTransaction() assert lyr.GetFeatureCount() == 1 vrt_ds = None sqlite_ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_vrt_26.db') ############################################################################### # Test shapebin geometry def test_ogr_vrt_27(): csv = """dummy,shapebin "dummy","01000000000000000000F03F0000000000000040" "dummy","0300000000000000000008400000000000001040000000000000144000000000000018400100000002000000000000000000000000000840000000000000104000000000000014400000000000001840" "dummy","0500000000000000000000000000000000000000000000000000F03F000000000000F03F010000000500000000000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000" """ gdal.FileFromMemBuffer('/vsimem/ogr_vrt_27.csv', csv) ds = ogr.Open(""" /vsimem/ogr_vrt_27.csv """) assert ds is not None lyr = ds.GetLayer(0) wkt_list = ['POINT (1 2)', 'LINESTRING (3 4,5 6)', 'POLYGON ((0 0,0 1,1 1,1 0,0 0))'] feat = lyr.GetNextFeature() i = 0 while feat is not None: assert ogrtest.check_feature_geometry(feat, wkt_list[i]) == 0 feat = lyr.GetNextFeature() i = i + 1 ds = None gdal.Unlink('/vsimem/ogr_vrt_27.csv') ############################################################################### # Invalid VRT testing def test_ogr_vrt_28(): with gdaltest.error_handler(): ds = ogr.Open("") assert ds is None gdal.FileFromMemBuffer('/vsimem/ogr_vrt_28_invalid.vrt', "") with gdaltest.error_handler(): ds = ogr.Open("/vsimem/ogr_vrt_28_invalid.vrt") assert ds is None gdal.Unlink("/vsimem/ogr_vrt_28_invalid.vrt") with gdaltest.error_handler(): ds = ogr.Open("data/invalid.vrt") assert ds is not None for i in range(ds.GetLayerCount()): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.GetLayer(i) lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', \ ('expected failure for layer %d of datasource %s' % (i, ds.GetName())) ds = None gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open("") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'expected error message on datasource opening' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open("data/invalid2.vrt") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'expected error message on datasource opening' gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.Open("data/invalid3.vrt") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'expected error message on datasource opening' ############################################################################### # Test OGRVRTWarpedLayer def test_ogr_vrt_29(): gdal.Unlink('tmp/ogr_vrt_29.shp') gdal.Unlink('tmp/ogr_vrt_29.shx') gdal.Unlink('tmp/ogr_vrt_29.dbf') gdal.Unlink('tmp/ogr_vrt_29.prj') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_vrt_29.shp') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr = ds.CreateLayer('ogr_vrt_29', srs=sr) lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger)) for i in range(5): for j in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, i * 5 + j) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%f %f)' % (2 + i / 5.0, 49 + j / 5.0))) lyr.CreateFeature(feat) feat = None ds = None # Invalid source layer gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(""" tmp/non_existing.shp EPSG:32631 """) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Non-spatial layer gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(""" data/flat.dbf EPSG:32631 """) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Missing TargetSRS gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(""" tmp/ogr_vrt_29.shp """) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Invalid TargetSRS gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(""" tmp/ogr_vrt_29.shp foo """) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Invalid SrcSRS gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(""" tmp/ogr_vrt_29.shp foo EPSG:32631 """) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # TargetSRS == source SRS ds = ogr.Open(""" tmp/ogr_vrt_29.shp EPSG:4326 """) lyr = ds.GetLayer(0) ds = None # Forced extent ds = ogr.Open(""" tmp/ogr_vrt_29.shp EPSG:32631 426857 5427475 485608 5516874 """) lyr = ds.GetLayer(0) bb = lyr.GetExtent() assert bb == (426857, 485608, 5427475, 5516874) ds = None f = open('tmp/ogr_vrt_29.vrt', 'wt') f.write(""" ogr_vrt_29.shp EPSG:32631 \n""") f.close() # Check reprojection in both directions ds = ogr.Open('tmp/ogr_vrt_29.vrt', update=1) lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert got_wkt.find('32631') != -1, 'did not get expected WKT' bb = lyr.GetExtent() expected_bb = (426857.98771727527, 485607.2165091355, 5427475.0501426803, 5516873.8591036052) for i in range(4): assert abs(bb[i] - expected_bb[i]) <= 1, 'did not get expected extent' feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT(426857.987717275274917 5427937.523466162383556)') != 0: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() feat.SetGeometry(None) assert lyr.SetFeature(feat) == 0 feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 0)')) assert lyr.SetFeature(feat) == 0 feat = None lyr.SetSpatialFilterRect(499999, -1, 500001, 1) lyr.ResetReading() feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT(500000 0)') != 0: feat.DumpReadable() pytest.fail() feat = None feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('id', -99) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 0)')) assert lyr.CreateFeature(feat) == 0 feat = None feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('id', -100) assert lyr.CreateFeature(feat) == 0 feat = None ds = None # Check failed operations in read-only ds = ogr.Open('tmp/ogr_vrt_29.vrt') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(1) gdal.PopErrorHandler() assert ret != 0 feat = lyr.GetNextFeature() feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 0)')) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = None feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 0)')) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = None ds = None # Check in .shp file ds = ogr.Open('tmp/ogr_vrt_29.shp', update=1) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT(3.0 0.0)') != 0: feat.DumpReadable() pytest.fail() lyr.SetAttributeFilter('id = -99') lyr.ResetReading() feat = lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat, 'POINT(3.0 0.0)') != 0: feat.DumpReadable() pytest.fail() lyr.SetAttributeFilter('id = -100') lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1000) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-180 91)')) lyr.CreateFeature(feat) feat = None ds = None # Check failed reprojection when reading through VRT ds = ogr.Open('tmp/ogr_vrt_29.vrt', update=1) lyr = ds.GetLayer(0) lyr.SetAttributeFilter('id = 1000') # Reprojection will fail gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() fid = feat.GetFID() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetFeature(fid) gdal.PopErrorHandler() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() feat = None lyr.DeleteFeature(fid) ds = None f = open('tmp/ogr_vrt_29_2.vrt', 'wt') f.write(""" ogr_vrt_29.vrt EPSG:4326 \n""") f.close() # Check failed reprojection when writing through VRT ds = ogr.Open('tmp/ogr_vrt_29_2.vrt', update=1) lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-180 91)')) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = None feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(-180 91)')) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = None ds = None # Some sanity operations before running test_ogrsf ds = ogr.Open('tmp/ogr_vrt_29.shp', update=1) ds.ExecuteSQL('REPACK ogr_vrt_29') ds.ExecuteSQL('RECOMPUTE EXTENT ON ogr_vrt_29') ds = None # Check with test_ogrsf if test_cli_utilities.get_test_ogrsf_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_29.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 gdal.Unlink('tmp/ogr_vrt_29.shp') gdal.Unlink('tmp/ogr_vrt_29.shx') gdal.Unlink('tmp/ogr_vrt_29.dbf') gdal.Unlink('tmp/ogr_vrt_29.prj') os.unlink('tmp/ogr_vrt_29.vrt') os.unlink('tmp/ogr_vrt_29_2.vrt') ############################################################################### # Test OGRVRTUnionLayer def test_ogr_vrt_30(): for filename in ['tmp/ogr_vrt_30_1.shp', 'tmp/ogr_vrt_30_1.shx', 'tmp/ogr_vrt_30_1.dbf', 'tmp/ogr_vrt_30_1.prj', 'tmp/ogr_vrt_30_1.qix', 'tmp/ogr_vrt_30_2.shp', 'tmp/ogr_vrt_30_2.shx', 'tmp/ogr_vrt_30_2.dbf', 'tmp/ogr_vrt_30_2.prj', 'tmp/ogr_vrt_30_2.qix']: gdal.Unlink(filename) ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_vrt_30_1.shp') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr = ds.CreateLayer('ogr_vrt_30_1', srs=sr) lyr.CreateField(ogr.FieldDefn('id1', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('id2', ogr.OFTInteger)) for i in range(5): for j in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, i * 5 + j) feat.SetField(1, 100 + i * 5 + j) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%f %f)' % (2 + i / 5.0, 49 + j / 5.0))) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_vrt_30_1') ds = None ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_vrt_30_2.shp') sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr = ds.CreateLayer('ogr_vrt_30_2', srs=sr) lyr.CreateField(ogr.FieldDefn('id2', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('id3', ogr.OFTInteger)) for i in range(5): for j in range(5): feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 200 + i * 5 + j) feat.SetField(1, 300 + i * 5 + j) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(%f %f)' % (4 + i / 5.0, 49 + j / 5.0))) lyr.CreateFeature(feat) feat = None ds.ExecuteSQL('CREATE SPATIAL INDEX ON ogr_vrt_30_2') ds = None f = open('tmp/ogr_vrt_30.vrt', 'wt') f.write(""" ogr_vrt_30_1.shp ogr_vrt_30_2.shp \n""") f.close() # Check for check in range(10): ds = ogr.Open('tmp/ogr_vrt_30.vrt', update=1) lyr = ds.GetLayer(0) if check == 0: sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert got_wkt.find('GEOGCS["WGS 84"') != -1, 'did not get expected WKT' elif check == 1: bb = lyr.GetExtent() expected_bb = (2.0, 4.7999999999999998, 49.0, 49.799999999999997) for i in range(4): assert abs(bb[i] - expected_bb[i]) <= 1, 'did not get expected extent' elif check == 2: feat_count = lyr.GetFeatureCount() assert feat_count == 2 * 5 * 5, 'did not get expected feature count' elif check == 3: assert lyr.GetLayerDefn().GetFieldCount() == 3, 'did not get expected field count' assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTInteger64, \ 'did not get expected field type' elif check == 4: feat = lyr.GetNextFeature() i = 0 while feat is not None: if i < 5 * 5: assert feat.GetFID() == i, 'did not get expected value' assert feat.GetFieldAsInteger("id1") == i, \ 'did not get expected value' assert feat.GetFieldAsInteger("id2") == 100 + i, \ 'did not get expected value' assert not feat.IsFieldSet("id3"), 'did not get expected value' if ogrtest.check_feature_geometry(feat, 'POINT(%f %f)' % (2 + int(i / 5) / 5.0, 49 + int(i % 5) / 5.0)) != 0: feat.DumpReadable() pytest.fail('did not get expected value') else: assert feat.GetFID() == i, 'did not get expected value' assert not feat.IsFieldSet("id1"), 'did not get expected value' assert feat.GetFieldAsInteger("id2") == 200 + i - 5 * 5, \ 'did not get expected value' assert feat.GetFieldAsInteger("id3") == 300 + i - 5 * 5, \ 'did not get expected value' assert ogrtest.check_feature_geometry(feat, 'POINT(%f %f)' % (4 + int((i - 5 * 5) / 5) / 5.0, 49 + int((i - 5 * 5) % 5) / 5.0)) == 0, \ 'did not get expected value' i = i + 1 feat = lyr.GetNextFeature() elif check == 5: assert lyr.GetGeomType() == ogr.wkbPoint, 'did not get expected geom type' elif check == 6: assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCIgnoreFields) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCRandomWrite) == 0, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCSequentialWrite) == 0, \ 'did not get expected capability' elif check == 7: lyr.SetSpatialFilterRect(2.49, 49.29, 4.49, 49.69) assert lyr.GetFeatureCount() == 10, 'did not get expected feature count' elif check == 8: lyr.SetAttributeFilter('id1 = 0') assert lyr.GetFeatureCount() == 1, 'did not get expected feature count' elif check == 9: # CreateFeature() should fail feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('id2', 12345) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # SetFeature() should fail lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField('id2', 45321) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # Test feature existence : should fail lyr.SetAttributeFilter('id2 = 12345 or id2 = 45321') lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is None, 'should have failed' ds = None # Check with test_ogrsf if test_cli_utilities.get_test_ogrsf_path() is not None: ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_30.vrt --config OGR_VRT_MAX_OPENED 1') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/ogr_vrt_30.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Test various optional attributes f = open('tmp/ogr_vrt_30.vrt', 'wt') f.write(""" ogr_vrt_30_1.shp ogr_vrt_30_2.shp source_layer ON Intersection wkbPoint25D WGS72 100 -180 -90 180 90 \n""") f.close() for check in range(9): ds = ogr.Open('tmp/ogr_vrt_30.vrt', update=1) lyr = ds.GetLayer(0) if check == 0: sr = lyr.GetSpatialRef() got_wkt = sr.ExportToWkt() assert got_wkt.find('WGS 72') != -1, 'did not get expected WKT' elif check == 1: bb = lyr.GetExtent() expected_bb = (-180.0, 180.0, -90.0, 90.0) for i in range(4): assert abs(bb[i] - expected_bb[i]) <= 1, 'did not get expected extent' elif check == 2: assert lyr.GetFeatureCount() == 100, 'did not get expected feature count' elif check == 3: assert lyr.GetLayerDefn().GetFieldCount() == 2, 'did not get expected field count' elif check == 4: feat = lyr.GetNextFeature() i = 0 while feat is not None: if i < 5 * 5: assert feat.GetFID() == i, 'did not get expected value' assert feat.GetFieldAsString("source_layer") == 'ogr_vrt_30_1', \ 'did not get expected value' assert feat.GetFieldAsInteger("id2") == 100 + i, \ 'did not get expected value' else: assert feat.GetFID() == i - 5 * 5, 'did not get expected value' assert feat.GetFieldAsString("source_layer") == 'ogr_vrt_30_2', \ 'did not get expected value' assert feat.GetFieldAsInteger("id2") == 200 + i - 5 * 5, \ 'did not get expected value' i = i + 1 feat = lyr.GetNextFeature() elif check == 5: assert lyr.GetGeomType() == ogr.wkbPoint25D, 'did not get expected geom type' elif check == 6: assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCFastSpatialFilter) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCIgnoreFields) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCRandomWrite) == 1, \ 'did not get expected capability' assert lyr.TestCapability(ogr.OLCSequentialWrite) == 1, \ 'did not get expected capability' elif check == 7: lyr.SetSpatialFilterRect(2.49, 49.29, 4.49, 49.69) assert lyr.GetFeatureCount() == 10, 'did not get expected feature count' elif check == 8: # invalid source_layer name with CreateFeature() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('source_layer', 'random_name') feat.SetField('id2', 12345) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # unset source_layer name with CreateFeature() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('id2', 12345) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # FID set with CreateFeature() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(999999) feat.SetField('source_layer', 'ogr_vrt_30_2') feat.SetField('id2', 12345) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # CreateFeature() OK feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('source_layer', 'ogr_vrt_30_2') feat.SetField('id2', 12345) assert lyr.CreateFeature(feat) == 0, 'should have succeeded' # SetFeature() OK feat.SetField('id2', 45321) assert lyr.SetFeature(feat) == 0, 'should have succeeded' # invalid source_layer name with SetFeature() feat.SetField('source_layer', 'random_name') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' # unset source_layer name with SetFeature() feat.UnsetField('source_layer') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' # FID unset with SetFeature() feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('source_layer', 'ogr_vrt_30_2') feat.SetField('id2', 12345) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0, 'should have failed' feat = None # Test feature existence (with passthru) lyr.SetAttributeFilter('id2 = 45321 AND OGR_GEOMETRY IS NULL') assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1, \ 'should have returned 1' lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None, 'should have succeeded' # Test feature existence (without passthru) lyr.SetAttributeFilter("id2 = 45321 AND OGR_GEOMETRY IS NULL AND source_layer = 'ogr_vrt_30_2'") assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 0, \ 'should have returned 0' lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None, 'should have succeeded' # Test SyncToDisk() assert lyr.SyncToDisk() == 0, 'should have succeeded' ds = None for filename in ['tmp/ogr_vrt_30_1.shp', 'tmp/ogr_vrt_30_1.shx', 'tmp/ogr_vrt_30_1.dbf', 'tmp/ogr_vrt_30_1.prj', 'tmp/ogr_vrt_30_1.qix', 'tmp/ogr_vrt_30_2.shp', 'tmp/ogr_vrt_30_2.shx', 'tmp/ogr_vrt_30_2.dbf', 'tmp/ogr_vrt_30_2.prj', 'tmp/ogr_vrt_30_2.qix']: gdal.Unlink(filename) os.unlink('tmp/ogr_vrt_30.vrt') ############################################################################### # Test anti-recursion mechanism with union layer def test_ogr_vrt_31(shared_ds_flag=''): rec1 = """ /vsimem/rec2.vrt /vsimem/rec1.vrt """ % (shared_ds_flag, shared_ds_flag) rec2 = """ /vsimem/rec1.vrt /vsimem/rec2.vrt """ % (shared_ds_flag, shared_ds_flag) gdal.FileFromMemBuffer('/vsimem/rec1.vrt', rec1) gdal.FileFromMemBuffer('/vsimem/rec2.vrt', rec2) ds = ogr.Open('/vsimem/rec1.vrt') assert ds is not None gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ds.GetLayer(0).GetLayerDefn() ds.GetLayer(0).GetFeatureCount() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'error expected !' gdal.Unlink('/vsimem/rec1.vrt') gdal.Unlink('/vsimem/rec2.vrt') ############################################################################### # Test anti-recursion mechanism on shared DS def test_ogr_vrt_32(): return test_ogr_vrt_31(' shared="1"') ############################################################################### # Test multi-geometry support def test_ogr_vrt_33(): try: import shutil shutil.rmtree('tmp/ogr_vrt_33') except OSError: pass ds = ogr.GetDriverByName('CSV').CreateDataSource('tmp/ogr_vrt_33', options=['GEOMETRY=AS_WKT']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['CREATE_CSVT=YES']) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_4326_POINT", ogr.wkbPoint)) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_32632_POLYGON", ogr.wkbPolygon)) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_4326_LINESTRING", ogr.wkbLineString)) lyr.CreateField(ogr.FieldDefn("X", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("Y", ogr.OFTReal)) lyr = ds.CreateLayer('test2', geom_type=ogr.wkbNone, options=['CREATE_CSVT=YES']) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_32632_POLYGON", ogr.wkbPolygon)) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_4326_POINT", ogr.wkbPoint)) lyr.CreateGeomField(ogr.GeomFieldDefn("geom__WKT_EPSG_32631_POINT", ogr.wkbPoint)) lyr.CreateField(ogr.FieldDefn("Y", ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn("X", ogr.OFTReal)) ds = None ds = ogr.Open('tmp/ogr_vrt_33', update=1) lyr = ds.GetLayerByName('test') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomField(0, ogr.CreateGeometryFromWkt('POINT (1 2)')) feat.SetGeomField(1, ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))')) feat.SetField("X", -1) feat.SetField("Y", -2) lyr.CreateFeature(feat) lyr = ds.GetLayerByName('test2') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomField(0, ogr.CreateGeometryFromWkt('POLYGON ((1 1,1 2,2 2,2 1,1 1))')) feat.SetGeomField(1, ogr.CreateGeometryFromWkt('POINT (3 4)')) feat.SetGeomField(2, ogr.CreateGeometryFromWkt('POINT (5 6)')) feat.SetField("X", -3) feat.SetField("Y", -4) lyr.CreateFeature(feat) ds = None for i in range(2): if i == 0: # Minimalist definition. ds_str = """ tmp/ogr_vrt_33 """ else: # Implicit fields ds_str = """ tmp/ogr_vrt_33 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) for j in range(5): if j == 0: assert lyr.GetGeomType() == ogr.wkbPoint elif j == 1: assert lyr.GetSpatialRef().ExportToWkt().find('GEOGCS') == 0 elif j == 2: assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetType() == ogr.wkbPolygon elif j == 3: assert lyr.GetExtent(geom_field=1) == (0, 1, 0, 1) elif j == 4: assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef().ExportToWkt().find('PROJCS') == 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() if feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 if ogrtest.have_geos(): # Select only second field and change various attributes ds_str = """ tmp/ogr_vrt_33 wkbPolygon25D +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs 1 2 3 4 POLYGON((0.5 0.5,1.5 0.5,1.5 1.5,0.5 1.5,0.5 0.5)) """ for i in range(6): ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) if i == 0: assert lyr.GetGeomType() == ogr.wkbPolygon25D elif i == 1: assert lyr.GetSpatialRef().ExportToWkt().find('+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') >= 0 elif i == 2: assert lyr.GetGeometryColumn() == 'foo' elif i == 3: assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1 assert lyr.GetExtent(geom_field=0) == (1, 3, 2, 4) elif i == 4: assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 0 elif i == 5: assert lyr.GetLayerDefn().GetGeomFieldCount() == 1 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POLYGON ((0.5 1.0,1 1,1.0 0.5,0.5 0.5,0.5 1.0))': feat.DumpReadable() pytest.fail() if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # No geometry fields ds_str = """ tmp/ogr_vrt_33 wkbNone """ for i in range(4): ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) if i == 0: assert lyr.GetGeomType() == ogr.wkbNone elif i == 1: assert lyr.GetSpatialRef() is None elif i == 2: lyr.TestCapability(ogr.OLCFastFeatureCount) lyr.TestCapability(ogr.OLCFastGetExtent) lyr.TestCapability(ogr.OLCFastSpatialFilter) elif i == 3: assert lyr.GetLayerDefn().GetGeomFieldCount() == 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0) is not None: feat.DumpReadable() pytest.fail() if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ds_str = """ tmp/ogr_vrt_33 EPSG:4326 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetType() == ogr.wkbPoint assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef().ExportToWkt().find('4326') >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() if feat.GetGeomFieldRef(1).ExportToWkt() != 'POINT (-1 -2)': feat.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(1, 0, 0, 0, 0) assert lyr.GetFeatureCount() == 0 lyr.SetSpatialFilterRect(1, -1.1, -2.1, -0.9, -1.9) assert lyr.GetFeatureCount() == 1 lyr.SetSpatialFilter(1, None) assert lyr.GetFeatureCount() == 1 lyr.SetIgnoredFields(['geom__WKT_EPSG_4326_POINT']) lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0) is not None or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POINT (-1 -2)': feat.DumpReadable() pytest.fail() lyr.SetIgnoredFields(['foo']) lyr.ResetReading() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(1) is not None or \ feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Warped layer without explicit WarpedGeomFieldName ds_str = """ tmp/ogr_vrt_33 EPSG:32631 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().ExportToWkt().find('32631') >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt().find('POINT') < 0 or \ feat.GetGeomFieldRef(0).ExportToWkt() == 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() # Warped layer with explicit WarpedGeomFieldName (that is the first field) ds_str = """ tmp/ogr_vrt_33 geom__WKT_EPSG_4326_POINT EPSG:32631 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().ExportToWkt().find('32631') >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt().find('POINT') < 0 or \ feat.GetGeomFieldRef(0).ExportToWkt() == 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() # Warped layer with explicit WarpedGeomFieldName (that does NOT exist) ds_str = """ tmp/ogr_vrt_33 foo EPSG:32631 """ gdal.PushErrorHandler('CPLQuietErrorHandler') ogr.Open(ds_str) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Warped layer with explicit WarpedGeomFieldName (that is the second field) ds_str = """ tmp/ogr_vrt_33 geom__WKT_EPSG_32632_POLYGON EPSG:4326 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetSpatialRef().ExportToWkt().find('4326') >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(1).ExportToWkt().find('POLYGON') < 0 or \ feat.GetGeomFieldRef(1).ExportToWkt() == 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' or \ feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() # UnionLayer with default union strategy ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) geom_fields = [['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4326'], ['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon, '32632'], ['geom__WKT_EPSG_4326_LINESTRING', ogr.wkbLineString, '4326'], ['geom__WKT_EPSG_32631_POINT', ogr.wkbPoint, '32631']] assert lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) for i, geom_field in enumerate(geom_fields): assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' or \ feat.GetGeomFieldRef(2) is not None or \ feat.GetGeomFieldRef(3) is not None: feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (3 4)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((1 1,1 2,2 2,2 1,1 1))' or \ feat.GetGeomFieldRef(2) is not None or \ feat.GetGeomFieldRef(3).ExportToWkt() != 'POINT (5 6)': feat.DumpReadable() pytest.fail() ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # UnionLayer with intersection strategy ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 Intersection """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) geom_fields = [['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4326'], ['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon, '32632']] assert lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) for i, geom_field in enumerate(geom_fields): assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (3 4)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((1 1,1 2,2 2,2 1,1 1))': feat.DumpReadable() pytest.fail() ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # UnionLayer with FirstLayer strategy ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 FirstLayer """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) geom_fields = [['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4326'], ['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon, '32632'], ['geom__WKT_EPSG_4326_LINESTRING', ogr.wkbLineString, '4326']] assert lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) for i, geom_field in enumerate(geom_fields): assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (3 4)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((1 1,1 2,2 2,2 1,1 1))': feat.DumpReadable() pytest.fail() ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # UnionLayer with explicit fields but without further information ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) geom_fields = [['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon, '32632'], ['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4326']] assert lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) for i, geom_field in enumerate(geom_fields): assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POINT (1 2)': feat.DumpReadable() pytest.fail() ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # UnionLayer with explicit fields with extra information ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 wkbPolygon25D EPSG:4322 1 2 3 4 """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) geom_fields = [['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon25D, '32632'], ['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4322']] assert lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) bb = lyr.GetExtent(geom_field=1) assert bb == (1, 3, 2, 4) for i, geom_field in enumerate(geom_fields): assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' or \ feat.GetGeomFieldRef(1).ExportToWkt().find('POINT (') != 0 or \ feat.GetGeomFieldRef(1).ExportToWkt() == 'POINT (1 2)': feat.DumpReadable() pytest.fail() ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # UnionLayer with geometry fields disabled ds_str = """ tmp/ogr_vrt_33 tmp/ogr_vrt_33 wkbNone """ ds = ogr.Open(ds_str) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetGeomFieldCount() == 0 assert lyr.GetLayerDefn().GetFieldCount() == 6, \ lyr.GetLayerDefn().GetGeomFieldCount() feat = lyr.GetNextFeature() assert feat is not None ds = None if test_cli_utilities.get_test_ogrsf_path() is not None: f = open('tmp/ogr_vrt_33.vrt', 'wb') f.write(ds_str.encode('ascii')) f.close() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_vrt_33.vrt') os.unlink('tmp/ogr_vrt_33.vrt') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ds = ogr.Open('tmp/ogr_vrt_33') sql_lyr = ds.ExecuteSQL('SELECT * FROM test UNION ALL SELECT * FROM test2') geom_fields = [['geom__WKT_EPSG_4326_POINT', ogr.wkbPoint, '4326'], ['geom__WKT_EPSG_32632_POLYGON', ogr.wkbPolygon, '32632'], ['geom__WKT_EPSG_4326_LINESTRING', ogr.wkbLineString, '4326'], ['geom__WKT_EPSG_32631_POINT', ogr.wkbPoint, '32631']] assert sql_lyr.GetLayerDefn().GetGeomFieldCount() == len(geom_fields) for i, geom_field in enumerate(geom_fields): assert sql_lyr.GetLayerDefn().GetGeomFieldDefn(i).GetName() == geom_field[0] assert sql_lyr.GetLayerDefn().GetGeomFieldDefn(i).GetType() == geom_field[1] assert sql_lyr.GetLayerDefn().GetGeomFieldDefn(i).GetSpatialRef().ExportToWkt().find(geom_field[2]) >= 0 feat = sql_lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (1 2)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((0 0,0 1,1 1,1 0,0 0))' or \ feat.GetGeomFieldRef(2) is not None or \ feat.GetGeomFieldRef(3) is not None: feat.DumpReadable() pytest.fail() feat = sql_lyr.GetNextFeature() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (3 4)' or \ feat.GetGeomFieldRef(1).ExportToWkt() != 'POLYGON ((1 1,1 2,2 2,2 1,1 1))' or \ feat.GetGeomFieldRef(2) is not None or \ feat.GetGeomFieldRef(3).ExportToWkt() != 'POINT (5 6)': feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test SetIgnoredFields() with with PointFromColumns geometries def test_ogr_vrt_34(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csv', 'wb') f.write('x,y\n'.encode('ascii')) f.write('2,49\n'.encode('ascii')) f.close() try: os.remove('tmp/test.csvt') except OSError: pass vrt_xml = """ tmp/test.csv test """ ds = ogr.Open(vrt_xml) lyr = ds.GetLayerByName('test') lyr.SetIgnoredFields(['x', 'y']) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)': f.DumpReadable() pytest.fail() ds = None os.unlink('tmp/test.csv') ############################################################################### # Test nullable fields def test_ogr_vrt_35(): if gdaltest.vrt_ds is None: pytest.skip() f = open('tmp/test.csv', 'wb') f.write('c1,c2,WKT,WKT2\n'.encode('ascii')) f.write('1,,"POINT(2 49),"\n'.encode('ascii')) f.close() try: os.remove('tmp/test.csvt') except OSError: pass # Explicit nullable f = open('tmp/test.vrt', 'wb') f.write(""" test.csv test """.encode('ascii')) f.close() ds = ogr.Open('tmp/test.vrt') lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(0).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(1).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(1).IsNullable() == 1 ds = None # Implicit nullable f = open('tmp/test2.vrt', 'wb') f.write(""" test.vrt test """.encode('ascii')) f.close() ds = ogr.Open('tmp/test2.vrt') lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(0).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(1).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(1).IsNullable() == 1 ds = None os.unlink('tmp/test.csv') os.unlink('tmp/test.vrt') os.unlink('tmp/test2.vrt') ############################################################################### # Test editing direct geometries def test_ogr_vrt_36(): if gdaltest.vrt_ds is None: pytest.skip() ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_vrt_36.shp') lyr = ds.CreateLayer('ogr_vrt_36', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('id')) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = '1' f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (0 1)')) lyr.CreateFeature(f) f = None ds = None gdal.FileFromMemBuffer('/vsimem/ogr_vrt_36.vrt', """ /vsimem/ogr_vrt_36.shp wkbPoint WGS84 """) ds = ogr.Open('/vsimem/ogr_vrt_36.vrt', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_vrt_36.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['id'] != '1': f.DumpReadable() pytest.fail() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_vrt_36.shp') gdal.Unlink('/vsimem/ogr_vrt_36.vrt') ############################################################################### # Test implict non-spatial layers (#6336) def test_ogr_vrt_37(): with gdaltest.error_handler(): ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test6') assert lyr.GetGeomType() == ogr.wkbNone with gdaltest.error_handler(): ds = ogr.Open('data/vrt_test.vrt') lyr = ds.GetLayerByName('test6') assert lyr.GetLayerDefn().GetGeomFieldCount() == 0 ############################################################################### # Test reading geometry type def test_ogr_vrt_38(): if gdaltest.vrt_ds is None: pytest.skip() types = [['Point', ogr.wkbPoint], ['LineString', ogr.wkbLineString], ['Polygon', ogr.wkbPolygon], ['MultiPoint', ogr.wkbMultiPoint], ['MultiLineString', ogr.wkbMultiLineString], ['MultiPolygon', ogr.wkbMultiPolygon], ['GeometryCollection', ogr.wkbGeometryCollection], ['CircularString', ogr.wkbCircularString], ['CompoundCurve', ogr.wkbCompoundCurve], ['CurvePolygon', ogr.wkbCurvePolygon], ['MultiCurve', ogr.wkbMultiCurve], ['MultiSurface', ogr.wkbMultiSurface], ['Curve', ogr.wkbCurve], ['Surface', ogr.wkbSurface] ] for (type_str, ogr_type) in types: for qualifier in ['', 'Z', 'M', 'ZM', '25D']: if qualifier == 'Z' and ogr_type <= ogr.wkbGeometryCollection: continue if qualifier == '25D' and ogr_type > ogr.wkbGeometryCollection: continue gdal.FileFromMemBuffer('/vsimem/ogr_vrt_38.vrt', """ /vsimem/ogr_vrt_38.shp wkb%s%s """ % (type_str, qualifier)) expected_geom_type = ogr_type if qualifier == 'Z' or qualifier == 'ZM' or qualifier == '25D': expected_geom_type = ogr.GT_SetZ(expected_geom_type) if qualifier == 'M' or qualifier == 'ZM': expected_geom_type = ogr.GT_SetM(expected_geom_type) ds = ogr.Open('/vsimem/ogr_vrt_38.vrt', update=1) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == expected_geom_type, \ (type_str, qualifier, lyr.GetGeomType()) gdal.Unlink('/vsimem/ogr_vrt_38.vrt') ############################################################################### # Test that attribute filtering works with def test_ogr_vrt_39(): if gdaltest.vrt_ds is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_vrt_39.csv', """my_fid,val 30,1 25,2 """) gdal.FileFromMemBuffer('/vsimem/ogr_vrt_39.csvt', """Integer,Integer """) gdal.FileFromMemBuffer('/vsimem/ogr_vrt_39.vrt', """ /vsimem/ogr_vrt_39.csv wkbNone my_fid """) ds = ogr.Open('/vsimem/ogr_vrt_39.vrt') lyr = ds.GetLayer(0) lyr.SetAttributeFilter('fid = 25') f = lyr.GetNextFeature() if f['val'] != 2: f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_vrt_39.csv') gdal.Unlink('/vsimem/ogr_vrt_39.csvt') gdal.Unlink('/vsimem/ogr_vrt_39.vrt') ############################################################################### # Test PointZM support with encoding="PointFromColumns" def test_ogr_vrt_40(): if gdaltest.vrt_ds is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_vrt_40.csv', """id,x,y,z,m 1,1,2,3,4 """) gdal.FileFromMemBuffer('/vsimem/ogr_vrt_40.vrt', """ ogr_vrt_40.csv ogr_vrt_40 """) ds = ogr.Open('/vsimem/ogr_vrt_40.vrt') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != 'POINT ZM (1 2 3 4)': f.DumpReadable() pytest.fail() ds = None gdal.Unlink('/vsimem/ogr_vrt_40.csv') gdal.Unlink('/vsimem/ogr_vrt_40.vrt') ############################################################################### # Test GetExtent() on erroneous definition def test_ogr_vrt_41(): ds = ogr.Open(""" /i_dont/exist """) lyr = ds.GetLayer(0) with gdaltest.error_handler(): lyr.GetExtent() ############################################################################### # def test_ogr_vrt_cleanup(): if gdaltest.vrt_ds is None: pytest.skip() gdal.Unlink('/vsimem/rec1.vrt') gdal.Unlink('/vsimem/rec2.vrt') try: os.unlink('tmp/ogr_vrt_33.vrt') except OSError: pass try: import shutil shutil.rmtree('tmp/ogr_vrt_33') except OSError: pass gdaltest.vrt_ds = None gdalautotest-3.0.4/ogr/ogr_gpsbabel.py0000755003401500001440000001014613614005365017427 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_gpsbabel.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR GPSBabel 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 gdaltest import ogrtest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # Check that dependencies are met def test_ogr_gpsbabel_init(): # Test if the gpsbabel is accessible ogrtest.have_gpsbabel = False ogrtest.have_read_gpsbabel = False try: ret = gdaltest.runexternal('gpsbabel -V') except OSError: ret = '' if ret.find('GPSBabel') == -1: pytest.skip('Cannot access GPSBabel utility') ds = ogr.Open('data/test.gpx') if ds is None: print('GPX driver not configured for read support') else: ogrtest.have_read_gpsbabel = True ogrtest.have_gpsbabel = True ############################################################################### # Test reading with explicit subdriver def test_ogr_gpsbabel_1(): if not ogrtest.have_read_gpsbabel: pytest.skip() ds = ogr.Open('GPSBabel:nmea:data/nmea.txt') assert ds is not None assert ds.GetLayerCount() == 2 ############################################################################### # Test reading with implicit subdriver def test_ogr_gpsbabel_2(): if not ogrtest.have_read_gpsbabel: pytest.skip() ds = ogr.Open('data/nmea.txt') assert ds is not None assert ds.GetLayerCount() == 2 ############################################################################### # Test writing def test_ogr_gpsbabel_3(): if not ogrtest.have_gpsbabel: pytest.skip() ds = ogr.GetDriverByName('GPSBabel').CreateDataSource('GPSBabel:nmea:tmp/nmea.txt') lyr = ds.CreateLayer('track_points', geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('track_fid', 0) feat.SetField('track_seg_id', 0) feat.SetField('track_name', 'TRACK_NAME') feat.SetField('name', 'PT_NAME') feat.SetField('hdop', 123) feat.SetField('vdop', 456) feat.SetField('pdop', 789) feat.SetField('sat', 6) feat.SetField('time', '2010/06/03 12:34:56') feat.SetField('fix', '3d') geom = ogr.CreateGeometryFromWkt('POINT(2.50 49.25)') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None lyr = None ds = None f = open('tmp/nmea.txt', 'rt') res = f.read() f.close() gdal.Unlink('tmp/nmea.txt') assert (not (res.find('$GPRMC') == -1 or \ res.find('$GPGGA') == -1 or \ res.find('$GPGSA') == -1)), 'did not get expected result' gdalautotest-3.0.4/ogr/ogr_selafin.py0000755003401500001440000001504113614005365017270 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # # Project: GDAL/OGR Test Suite # Purpose: Selafin driver testing. # Author: François Hissel # ############################################################################### # Copyright (c) 2014, François Hissel # # 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 math import gdaltest from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Create wasp datasource def test_ogr_selafin_create_ds(): gdaltest.selafin_ds = None try: os.remove('tmp/tmp.slf') except OSError: pass selafin_drv = ogr.GetDriverByName('Selafin') gdaltest.selafin_ds = selafin_drv.CreateDataSource('tmp/tmp.slf') if gdaltest.selafin_ds is not None: return pytest.fail() ############################################################################### # Add a few points to the datasource def test_ogr_selafin_create_nodes(): test_ogr_selafin_create_ds() ref = osr.SpatialReference() ref.ImportFromEPSG(4326) layer = gdaltest.selafin_ds.CreateLayer('name', ref, geom_type=ogr.wkbPoint) assert layer is not None, 'unable to create layer' layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal)) dfn = layer.GetLayerDefn() for i in range(5): for j in range(5): pt = ogr.Geometry(type=ogr.wkbPoint) pt.AddPoint_2D(float(i), float(j)) feat = ogr.Feature(dfn) feat.SetGeometry(pt) feat.SetField(0, (float)(i * 5 + j)) assert layer.CreateFeature(feat) == 0, 'unable to create node feature' # do some checks assert layer.GetFeatureCount() == 25, \ 'wrong number of features after point layer creation' # return del gdaltest.selafin_ds del layer ############################################################################### # Add a set of elements to the datasource def test_ogr_selafin_create_elements(): gdaltest.selafin_ds = ogr.Open('tmp/tmp.slf', 1) if gdaltest.selafin_ds is None: pytest.skip() layerCount = gdaltest.selafin_ds.GetLayerCount() assert layerCount >= 2, 'elements layer not created with nodes layer' for i in range(layerCount): name = gdaltest.selafin_ds.GetLayer(i).GetName() if '_e' in name: j = i if '_p' in name: k = i layere = gdaltest.selafin_ds.GetLayer(j) dfn = layere.GetLayerDefn() for i in range(4): for j in range(4): pol = ogr.Geometry(type=ogr.wkbPolygon) poll = ogr.Geometry(type=ogr.wkbLinearRing) poll.AddPoint_2D(float(i), float(j)) poll.AddPoint_2D(float(i), float(j + 1)) poll.AddPoint_2D(float(i + 1), float(j + 1)) poll.AddPoint_2D(float(i + 1), float(j)) poll.AddPoint_2D(float(i), float(j)) pol.AddGeometry(poll) feat = ogr.Feature(dfn) feat.SetGeometry(pol) assert layere.CreateFeature(feat) == 0, 'unable to create element feature' pol = ogr.Geometry(type=ogr.wkbPolygon) poll = ogr.Geometry(type=ogr.wkbLinearRing) poll.AddPoint_2D(4.0, 4.0) poll.AddPoint_2D(4.0, 5.0) poll.AddPoint_2D(5.0, 5.0) poll.AddPoint_2D(5.0, 4.0) poll.AddPoint_2D(4.0, 4.0) pol.AddGeometry(poll) feat = ogr.Feature(dfn) feat.SetGeometry(pol) assert layere.CreateFeature(feat) == 0, 'unable to create element feature' # do some checks assert gdaltest.selafin_ds.GetLayer(k).GetFeatureCount() == 28, \ 'wrong number of point features after elements layer creation' assert math.fabs(layere.GetFeature(5).GetFieldAsDouble(0) - 9) <= 0.01, \ 'wrong value of attribute in element layer' assert math.fabs(layere.GetFeature(10).GetFieldAsDouble(0) - 15) <= 0.01, \ 'wrong value of attribute in element layer' # return del gdaltest.selafin_ds ############################################################################### # Add a field and set its values for point features def test_ogr_selafin_set_field(): gdaltest.selafin_ds = ogr.Open('tmp/tmp.slf', 1) if gdaltest.selafin_ds is None: pytest.skip() layerCount = gdaltest.selafin_ds.GetLayerCount() assert layerCount >= 2, 'elements layer not created with nodes layer' for i in range(layerCount): name = gdaltest.selafin_ds.GetLayer(i).GetName() if '_e' in name: j = i if '_p' in name: k = i layern = gdaltest.selafin_ds.GetLayer(k) gdaltest.selafin_ds.GetLayer(j) layern.CreateField(ogr.FieldDefn('reverse', ogr.OFTReal)) layern.AlterFieldDefn(0, ogr.FieldDefn('new', ogr.OFTReal), ogr.ALTER_NAME_FLAG) layern.ReorderFields([1, 0]) layern.GetLayerDefn() for i in range(28): feat = layern.GetFeature(i) val = feat.GetFieldAsDouble(1) feat.SetField(0, (float)(val * 10)) layern.SetFeature(feat) # do some checks assert math.fabs(layern.GetFeature(11).GetFieldAsDouble(0) - 110) <= 0.01, \ 'wrong value of attribute in point layer' # return del gdaltest.selafin_ds ############################################################################### # Cleanup def test_ogr_selafin_cleanup(): selafin_drv = ogr.GetDriverByName('Selafin') selafin_drv.DeleteDataSource('tmp/tmp.slf') gdalautotest-3.0.4/ogr/ogr_odbc.py0000755003401500001440000001250213614005365016555 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_odbc.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR ODBC driver. # Author: Even Rouault # ############################################################################### # Copyright (c) 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 sys import shutil from osgeo import ogr from osgeo import gdal import gdaltest import ogrtest import pytest ############################################################################### # Basic testing def test_ogr_odbc_1(): ogrtest.odbc_drv = None if sys.platform != 'win32': pytest.skip() ogrtest.odbc_drv = ogr.GetDriverByName('ODBC') if ogrtest.odbc_drv is None: pytest.skip() ds = ogrtest.odbc_drv.Open('data/empty.mdb') if ds is None: ogrtest.odbc_drv = None pytest.skip() ds = None shutil.copy('data/empty.mdb', 'tmp/odbc.mdb') # Create and fill tables ds = ogrtest.odbc_drv.Open('tmp/odbc.mdb') ds.ExecuteSQL("CREATE TABLE test (intfield INT, doublefield DOUBLE, stringfield VARCHAR)") ds.ExecuteSQL("INSERT INTO test (intfield, doublefield, stringfield) VALUES (1, 2.34, 'foo')") ds.ExecuteSQL("CREATE TABLE test_with_pk (OGR_FID INT PRIMARY KEY, intfield INT, doublefield DOUBLE, stringfield VARCHAR)") ds.ExecuteSQL("INSERT INTO test_with_pk (OGR_FID, intfield) VALUES (1, 2)") ds.ExecuteSQL("INSERT INTO test_with_pk (OGR_FID, intfield) VALUES (2, 3)") ds.ExecuteSQL("INSERT INTO test_with_pk (OGR_FID, intfield) VALUES (3, 4)") ds.ExecuteSQL("INSERT INTO test_with_pk (OGR_FID, intfield) VALUES (4, 5)") ds.ExecuteSQL("INSERT INTO test_with_pk (OGR_FID, intfield) VALUES (5, 6)") ds = None # Test with ODBC:user/pwd@dsn syntax ds = ogrtest.odbc_drv.Open('ODBC:user/pwd@DRIVER=Microsoft Access Driver (*.mdb);DBQ=tmp/odbc.mdb') assert ds is not None ds = None # Test with ODBC:dsn syntax ds = ogrtest.odbc_drv.Open('ODBC:DRIVER=Microsoft Access Driver (*.mdb);DBQ=tmp/odbc.mdb') assert ds is not None ds = None # Test with ODBC:dsn,table_list syntax ds = ogrtest.odbc_drv.Open('ODBC:DRIVER=Microsoft Access Driver (*.mdb);DBQ=tmp/odbc.mdb,test') assert ds is not None assert ds.GetLayerCount() == 1 ds = None # Reopen and check ds = ogrtest.odbc_drv.Open('tmp/odbc.mdb') assert ds.GetLayerCount() == 2 lyr = ds.GetLayerByName('test') feat = lyr.GetNextFeature() if feat.GetField('intfield') != 1 or feat.GetField('doublefield') != 2.34 or feat.GetField('stringfield') != 'foo': feat.DumpReadable() pytest.fail() lyr = ds.GetLayerByName('test_with_pk') # Test GetFeatureCount() assert lyr.GetFeatureCount() == 5 # Test GetFeature() feat = lyr.GetFeature(4) if feat.GetField('intfield') != 5: feat.DumpReadable() pytest.fail() # Test SetAttributeFilter() lyr.SetAttributeFilter('intfield = 6') feat = lyr.GetNextFeature() if feat.GetFID() != 5: feat.DumpReadable() pytest.fail() # Test ExecuteSQL() sql_lyr = ds.ExecuteSQL("SELECT * FROM test") feat = sql_lyr.GetNextFeature() if feat.GetField('intfield') != 1 or feat.GetField('doublefield') != 2.34 or feat.GetField('stringfield') != 'foo': feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Run test_ogrsf def test_ogr_odbc_2(): if ogrtest.odbc_drv is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/odbc.mdb') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Cleanup def test_ogr_odbc_cleanup(): if ogrtest.odbc_drv is None: pytest.skip() gdal.Unlink('tmp/odbc.mdb') gdalautotest-3.0.4/ogr/ogr_mvt.py0000644003401500001440000016463613614005365016471 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_mvt.py a1c606d424c3fa3c52a96b57633981c4ca615c98 2019-07-31 18:24:07 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR MVT driver functionality. # 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 json import sys import gdaltest import ogrtest import webserver from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### def test_ogr_mvt_datatypes(): # With metadata.json ds = ogr.Open('data/mvt/datatypes/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f['bool_false'] != 0 or \ f['bool_true'] != 1 or \ f['pos_int_value'] != 1 or \ f['pos_int64_value'] != 123456789012345 or \ f['neg_int_value'] != -1 or \ f['neg_int64_value'] != -123456789012345 or \ f['pos_sint_value'] != 1 or \ f['pos_sint64_value'] != 123456789012345 or \ f['neg_sint_value'] != -1 or \ f['neg_sint64_value'] != -123456789012345 or \ f['uint_value'] != 2000000000 or \ f['uint64_value'] != 4000000000 or \ f['float_value'] != 1.25 or \ f['real_value'] != 1.23456789 or \ f['string_value'] != 'str': f.DumpReadable() pytest.fail() # Without metadata.json ds = gdal.OpenEx('data/mvt/datatypes/0/0/0.pbf', open_options=['METADATA_FILE=']) lyr = ds.GetLayer(0) count = lyr.GetLayerDefn().GetFieldCount() assert count == 16 tab = [] for i in range(lyr.GetLayerDefn().GetFieldCount()): fld_defn = lyr.GetLayerDefn().GetFieldDefn(i) tab += [(fld_defn.GetName(), fld_defn.GetType(), fld_defn.GetSubType())] expected_tab = [ ('mvt_id', ogr.OFTInteger64, ogr.OFSTNone), ('bool_true', ogr.OFTInteger, ogr.OFSTBoolean), ('bool_false', ogr.OFTInteger, ogr.OFSTBoolean), ('pos_int_value', ogr.OFTInteger, ogr.OFSTNone), ('pos_int64_value', ogr.OFTInteger64, ogr.OFSTNone), ('neg_int_value', ogr.OFTInteger, ogr.OFSTNone), ('neg_int64_value', ogr.OFTInteger64, ogr.OFSTNone), ('pos_sint_value', ogr.OFTInteger, ogr.OFSTNone), ('pos_sint64_value', ogr.OFTInteger64, ogr.OFSTNone), ('neg_sint_value', ogr.OFTInteger, ogr.OFSTNone), ('neg_sint64_value', ogr.OFTInteger64, ogr.OFSTNone), ('uint_value', ogr.OFTInteger, ogr.OFSTNone), ('uint64_value', ogr.OFTInteger64, ogr.OFSTNone), ('float_value', ogr.OFTReal, ogr.OFSTFloat32), ('real_value', ogr.OFTReal, ogr.OFSTNone), ('string_value', ogr.OFTString, ogr.OFSTNone), ] assert tab == expected_tab f = lyr.GetNextFeature() if f['bool_false'] != 0 or \ f['bool_true'] != 1 or \ f['pos_int_value'] != 1 or \ f['pos_int64_value'] != 123456789012345 or \ f['neg_int_value'] != -1 or \ f['neg_int64_value'] != -123456789012345 or \ f['pos_sint_value'] != 1 or \ f['pos_sint64_value'] != 123456789012345 or \ f['neg_sint_value'] != -1 or \ f['neg_sint64_value'] != -123456789012345 or \ f['uint_value'] != 2000000000 or \ f['uint64_value'] != 4000000000 or \ f['float_value'] != 1.25 or \ f['real_value'] != 1.23456789 or \ f['string_value'] != 'str': f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_datatype_promotion(): ds = ogr.Open('data/mvt/datatype_promotion.pbf') tab = [('int_to_int64', ogr.OFTInteger64), ('int_to_real', ogr.OFTReal), ('int64_to_real', ogr.OFTReal), ('bool_to_int', ogr.OFTInteger), ('bool_to_str', ogr.OFTString), ('float_to_double', ogr.OFTReal)] for layer_name, dt in tab: lyr = ds.GetLayerByName(layer_name) fld_defn = lyr.GetLayerDefn().GetFieldDefn(1) assert fld_defn.GetType() == dt, layer_name assert fld_defn.GetSubType() == ogr.OFSTNone, layer_name ############################################################################### def test_ogr_mvt_limit_cases(): with gdaltest.error_handler(): ds = ogr.Open('data/mvt/limit_cases.pbf') lyr = ds.GetLayerByName('empty') assert lyr.GetFeatureCount() == 0 lyr = ds.GetLayerByName('layer1') assert lyr.GetFeatureCount() == 7 f = lyr.GetFeature(1) assert f['mvt_id'] == 1 with gdaltest.error_handler(): f = lyr.GetFeature(6) assert f['b'] == 1 lyr = ds.GetLayerByName('layer2') assert lyr.GetFeatureCount() == 0 lyr = ds.GetLayerByName('layer3') assert lyr.GetFeatureCount() == 0 lyr = ds.GetLayerByName('layer4') assert lyr.GetFeatureCount() == 0 lyr = ds.GetLayerByName('layer5') assert lyr.GetFeatureCount() == 1 f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToWkt() == 'POINT (2070 2690)' ############################################################################### def test_ogr_mvt_with_extension_fields(): ds = ogr.Open('data/mvt/with_extension_fields.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'LINESTRING (2070 2690,2082 2707)') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_mixed(): ds = ogr.Open('data/mvt/mixed/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOINT ((215246.671651058 6281289.23636264),(332653.947097085 6447616.20991119))') != 0: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'LINESTRING (215246.671651058 6281289.23636264,332653.947097085 6447616.20991119)') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_linestring(): ds = ogr.Open('data/mvt/linestring/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((215246.671651058 6281289.23636264,332653.947097085 6447616.20991119))') != 0: f.DumpReadable() pytest.fail() ds = gdal.OpenEx('data/mvt/linestring/0/0/0.pbf', open_options=['METADATA_FILE=']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'LINESTRING (215246.671651058 6281289.23636264,332653.947097085 6447616.20991119)') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_multilinestring(): ds = ogr.Open('data/mvt/multilinestring/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((215246.671651058 6281289.23636264,332653.947097085 6447616.20991119),(440277.282922614 6623727.12308023,547900.618748143 6809621.97586978),(665307.894194175 6985732.88903883,772931.230019704 7171627.74182838))') != 0: f.DumpReadable() pytest.fail() ds = gdal.OpenEx('data/mvt/multilinestring/0/0/0.pbf', open_options=['METADATA_FILE=']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTILINESTRING ((215246.671651058 6281289.23636264,332653.947097085 6447616.20991119),(440277.282922614 6623727.12308023,547900.618748143 6809621.97586978),(665307.894194175 6985732.88903883,772931.230019704 7171627.74182838))') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_polygon(): ds = ogr.Open('data/mvt/polygon/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOLYGON (((332653.947097085 6447616.20991119,332653.947097085 6281289.23636264,215246.671651058 6281289.23636264,215246.671651058 6447616.20991119,332653.947097085 6447616.20991119)))') != 0: f.DumpReadable() pytest.fail() ds = gdal.OpenEx('data/mvt/polygon/0/0/0.pbf', open_options=['METADATA_FILE=']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'POLYGON ((332653.947097085 6447616.20991119,332653.947097085 6281289.23636264,215246.671651058 6281289.23636264,215246.671651058 6447616.20991119,332653.947097085 6447616.20991119))') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_point_polygon(): ds = ogr.Open('data/mvt/point_polygon/0') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOINT ((215246.671651058 6281289.23636264))') != 0: f.DumpReadable() pytest.fail() lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOLYGON (((440277.282922614 450061.222543117,440277.282922614 -440277.282922614,0.0 -440277.282922614,0.0 -215246.671651058,215246.671651058 -215246.671651058,215246.671651058 225030.61127156,0.0 225030.61127156,0.0 450061.222543117,440277.282922614 450061.222543117)),((0.0 117407.275446031,0.0 -107623.335825529,-117407.275446031 -107623.335825529,-117407.275446031 117407.275446031,0.0 117407.275446031)),((107623.335825529 58703.6377230138,107623.335825529 -48919.6981025115,48919.6981025115 -48919.6981025115,48919.6981025115 58703.6377230138,107623.335825529 58703.6377230138)))') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_point_polygon_clip(): if not ogrtest.have_geos() or gdal.GetConfigOption('OGR_MVT_CLIP') is not None: pytest.skip() if gdal.GetConfigOption('APPVEYOR') is not None: pytest.skip() if sys.platform == 'darwin' and gdal.GetConfigOption('TRAVIS', None) is not None: pytest.skip() if gdaltest.is_travis_branch('sanitize'): pytest.skip() ds = ogr.Open('data/mvt/point_polygon/1') lyr = ds.GetLayer(1) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOLYGON (((445169.252732867 450061.222543117,445169.252732867 0.0,220138.641461308 0.0,220138.641461308 225030.61127156,0.0 225030.61127156,0.0 450061.222543117,445169.252732867 450061.222543117)),((107623.335825528 58703.6377230138,107623.335825528 0.0,53811.6679127641 0.0,53811.6679127641 58703.6377230138,107623.335825528 58703.6377230138)))') != 0 and \ ogrtest.check_feature_geometry(f, 'MULTIPOLYGON (((445169.252732867 0.0,445169.252732867 -445169.252732867,0.0 -445169.252732867,0.0 -220138.641461308,220138.641461308 -220138.641461308,220138.641461308 0.0,445169.252732867 0.0)),((107623.335825528 0.0,107623.335825528 -53811.6679127641,53811.6679127641 -53811.6679127641,53811.6679127641 0.0,107623.335825528 0.0)))') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_tileset_without_readdir(): with gdaltest.config_option('MVT_USE_READDIR', 'NO'): ds = gdal.OpenEx('data/mvt/linestring/0') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_mvt_tileset_tilegl(): ds = ogr.Open('data/mvt/linestring_tilejson_gl/0') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_mvt_tileset_without_metadata_file(): ds = gdal.OpenEx('data/mvt/point_polygon/1', open_options=['METADATA_FILE=', 'CLIP=NO']) lyr = ds.GetLayerByName('point') assert lyr.GetGeomType() == ogr.wkbMultiPoint lyr = ds.GetLayerByName('polygon2') assert lyr.GetGeomType() == ogr.wkbMultiPolygon assert lyr.GetLayerDefn().GetFieldCount() == 2 ############################################################################### def test_ogr_mvt_tileset_json_field(): ds = gdal.OpenEx('data/mvt/datatypes/0', open_options=['METADATA_FILE=', 'JSON_FIELD=YES', 'CLIP=NO']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() d = json.loads(f.GetFieldAsString("json")) assert (d == { "bool_true": True, "bool_false": False, "pos_int_value": 1, "pos_int64_value": 123456789012345, "neg_int_value": -1, "neg_int64_value": -123456789012345, "pos_sint_value": 1, "pos_sint64_value": 123456789012345, "neg_sint_value": -1, "neg_sint64_value": -123456789012345, "uint_value": 2000000000, "uint64_value": 4000000000, "float_value": 1.25, "real_value": 1.23456789, "string_value": "str" }), f.GetFieldAsString("json") ############################################################################### def test_ogr_mvt_open_variants(): expected_geom = 'MULTILINESTRING ((215246.671651058 6281289.23636264,332653.947097085 6447616.20991119))' ds = ogr.Open('MVT:data/mvt/linestring/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, expected_geom) != 0: f.DumpReadable() pytest.fail() ds = ogr.Open('MVT:data/mvt/linestring/0') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, expected_geom) != 0: f.DumpReadable() pytest.fail() ds = ogr.Open('/vsigzip/data/mvt/linestring/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, expected_geom) != 0: f.DumpReadable() pytest.fail() ds = ogr.Open('MVT:/vsigzip/data/mvt/linestring/0/0/0.pbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, expected_geom) != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_xyz_options(): ds = gdal.OpenEx('data/mvt/datatypes/0/0/0.pbf', open_options=['X=1', 'Y=2', 'Z=3']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'POINT (-12496536.8802869 8299226.7830913)') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_test_ogrsf_pbf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/mvt/datatypes/0/0/0.pbf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### def test_ogr_mvt_test_ogrsf_directory(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/mvt/datatypes/0') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### def test_ogr_mvt_mbtiles(): if ogr.GetDriverByName('MBTILES') is None: pytest.skip() ds = ogr.Open('data/mvt/point_polygon.mbtiles') lyr = ds.GetLayerByName('point') f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOINT ((220138.641461308 6276397.26655239))') != 0: f.DumpReadable() pytest.fail() lyr.SetSpatialFilterRect(0, 0, 10000000, 10000000) lyr.ResetReading() f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'MULTIPOINT ((220138.641461308 6276397.26655239))') != 0: f.DumpReadable() pytest.fail() ############################################################################### def test_ogr_mvt_mbtiles_json_field(): if ogr.GetDriverByName('MBTILES') is None: pytest.skip() ds = gdal.OpenEx('data/mvt/datatypes.mbtiles', open_options=['JSON_FIELD=YES', 'CLIP=NO']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() d = json.loads(f.GetFieldAsString("json")) assert (d == {'int64_value': 123456789012345, 'string_value': 'str', 'real_value': 1.23456789, 'bool_false': False, 'pos_int_value': 1, 'neg_int_value': -1, 'bool_true': True, 'float_value': 1.25 }), f.GetFieldAsString("json") ############################################################################### def test_ogr_mvt_mbtiles_json_field_auto(): if ogr.GetDriverByName('MBTILES') is None: pytest.skip() ds = gdal.OpenEx('data/mvt/datatypes_json_field_auto.mbtiles', open_options=['CLIP=NO']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() d = json.loads(f.GetFieldAsString("json")) assert (d == {'int64_value': 123456789012345, 'string_value': 'str', 'real_value': 1.23456789, 'bool_false': False, 'pos_int_value': 1, 'neg_int_value': -1, 'bool_true': True, 'float_value': 1.25 }), f.GetFieldAsString("json") ############################################################################### def test_ogr_mvt_mbtiles_test_ogrsf(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() if ogr.GetDriverByName('MBTILES') is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/mvt/point_polygon.mbtiles polygon2') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### def test_ogr_mvt_mbtiles_open_vector_in_raster_mode(): if ogr.GetDriverByName('MBTILES') is None: pytest.skip() ds = gdal.OpenEx('data/mvt/datatypes.mbtiles', gdal.OF_RASTER) assert ds is None ############################################################################### def test_ogr_mvt_x_y_z_filename_scheme(): tmpfilename = '/vsimem/0-0-0.pbf' gdal.FileFromMemBuffer(tmpfilename, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) ds = ogr.Open(tmpfilename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if ogrtest.check_feature_geometry(f, 'LINESTRING (215246.671651058 6281289.23636264,332653.947097085 6447616.20991119)') != 0: f.DumpReadable() pytest.fail() ds = None gdal.Unlink(tmpfilename) ############################################################################### def test_ogr_mvt_polygon_larger_than_header(): ds = gdal.OpenEx('data/mvt/polygon_larger_than_header.pbf', open_options=['CLIP=NO']) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_mvt_errors(): assert ogr.Open('MVT:/i_do_not/exist') is None # Cannot detect Z in directory name assert ogr.Open('MVT:data') is None # Invalid Z gdal.Mkdir('/vsimem/33', 0) assert ogr.Open('MVT:/vsimem/33') is None gdal.Rmdir('/vsimem/33') # Inexisting metadata with gdaltest.error_handler(): assert (gdal.OpenEx('data/mvt/linestring/0/0/0.pbf', open_options=['METADATA_FILE=/i_do_not/exist']) is not None) # Invalid metadata with gdaltest.error_handler(): assert (gdal.OpenEx('data/mvt/linestring/0/0/0.pbf', open_options=['METADATA_FILE=ogr_mvt.py']) is not None) # Invalid metadata gdal.FileFromMemBuffer('/vsimem/my.json', '{}') with gdaltest.error_handler(): assert (gdal.OpenEx('data/mvt/linestring/0/0/0.pbf', open_options=['METADATA_FILE=/vsimem/my.json']) is not None) gdal.Unlink('/vsimem/my.json') # Invalid metadata gdal.FileFromMemBuffer('/vsimem/my.json', '{ "json": "x y" }') with gdaltest.error_handler(): assert (gdal.OpenEx('data/mvt/linestring/0/0/0.pbf', open_options=['METADATA_FILE=/vsimem/my.json']) is not None) gdal.Unlink('/vsimem/my.json') # Too big file tmpfilename = '/vsimem/foo.pbf' gdal.FileFromMemBuffer(tmpfilename, open('data/mvt/polygon_larger_than_header.pbf', 'rb').read()) f = gdal.VSIFOpenL(tmpfilename, 'rb+') gdal.VSIFSeekL(f, 20 * 1024 * 1024, 0) gdal.VSIFWriteL(' ', 1, 1, f) gdal.VSIFCloseL(f) ds = ogr.Open(tmpfilename) gdal.Unlink(tmpfilename) assert ds is None ############################################################################### def test_ogr_mvt_http_start(): 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() ############################################################################### def test_ogr_mvt_http(): if gdaltest.webserver_port == 0: pytest.skip() handler = webserver.SequentialHandler() handler.add('GET', '/linestring/metadata.json', 200, {}, open('data/mvt/linestring/metadata.json', 'rb').read()) handler.add('GET', '/linestring/0/0/0.pbf', 200, {}, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) handler.add('GET', '/linestring/0/0/0.pbf', 200, {}, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) with webserver.install_http_handler(handler): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0' % gdaltest.webserver_port) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None # No metadata file nor tile handler = webserver.SequentialHandler() handler.add('GET', '/linestring/metadata.json', 404, {}) handler.add('GET', '/linestring.json', 404, {}) handler.add('GET', '/linestring/0/0/0.pbf', 404, {}) with webserver.install_http_handler(handler): with gdaltest.error_handler(): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0' % gdaltest.webserver_port) assert ds is None # No metadata file, but tiles handler = webserver.SequentialHandler() handler.add('GET', '/linestring/metadata.json', 404, {}) handler.add('GET', '/linestring.json', 404, {}) handler.add('GET', '/linestring/0/0/0.pbf', 200, {}, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) handler.add('GET', '/linestring/0/0/0.pbf', 200, {}, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) with webserver.install_http_handler(handler): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0' % gdaltest.webserver_port) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None # metadata.json file, but no tiles handler = webserver.SequentialHandler() handler.add('GET', '/linestring/metadata.json', 200, {}, open('data/mvt/linestring/metadata.json', 'rb').read()) handler.add('GET', '/linestring/0/0/0.pbf', 404, {}) handler.add('GET', '/linestring/0/0/0.pbf', 404, {}) with webserver.install_http_handler(handler): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0' % gdaltest.webserver_port) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is None # No metadata.json file, but a linestring.json and no tiles handler = webserver.SequentialHandler() handler.add('GET', '/linestring/metadata.json', 404, {}) handler.add('GET', '/linestring.json', 200, {}, open('data/mvt/linestring/metadata.json', 'rb').read()) handler.add('GET', '/linestring/0/0/0.pbf', 404, {}) handler.add('GET', '/linestring/0/0/0.pbf', 404, {}) with webserver.install_http_handler(handler): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0' % gdaltest.webserver_port) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is None # Open pbf file handler = webserver.SequentialHandler() handler.add('GET', '/linestring/0/0/0.pbf', 200, {}, open('data/mvt/linestring/0/0/0.pbf', 'rb').read()) with webserver.install_http_handler(handler): ds = ogr.Open('MVT:http://127.0.0.1:%d/linestring/0/0/0.pbf' % gdaltest.webserver_port) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_mvt_http_stop(): if gdaltest.webserver_port == 0: pytest.skip() webserver.server_stop(gdaltest.webserver_process, gdaltest.webserver_port) ############################################################################### def test_ogr_mvt_write_one_layer(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('intfield', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64field', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('realfield', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('datefield', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('datetimefield', ogr.OFTDateTime)) boolfield = ogr.FieldDefn('boolfield', ogr.OFTInteger) boolfield.SetSubType(ogr.OFSTBoolean) lyr.CreateField(boolfield) # Test empty layer: OK with gdaltest.error_handler(): out_ds = gdal.VectorTranslate('/vsimem/outmvt', src_ds, format='MVT') assert out_ds is not None # Cannot create directory with gdaltest.error_handler(): out_ds = gdal.VectorTranslate('/i_dont/exist/outmvt', src_ds, format='MVT') assert out_ds is None # Directory already exists with gdaltest.error_handler(): out_ds = gdal.VectorTranslate('/vsimem/outmvt', src_ds, format='MVT') assert out_ds is None gdal.RmdirRecursive('/vsimem/outmvt') f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(123) f['strfield'] = 'foo' f['intfield'] = -1 f['int64field'] = 123456789012345 f['realfield'] = 1.25 f['datefield'] = '2018/02/01' f['datetimefield'] = '2018/02/01 12:34:56' f['boolfield'] = True f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 1000000)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(124) f['strfield'] = 'foo' f['intfield'] = -1 f['int64field'] = 123456789012345 f['realfield'] = 1.25 f['datefield'] = '2018/02/01' f['datetimefield'] = '2018/02/01 12:34:56' f['boolfield'] = True f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(500000 1000000,510000 1010000,520000 1020000)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(125) f['strfield'] = 'foobarbazbaw' f['intfield'] = 1 f['int64field'] = -123456789012345 f['realfield'] = -1.25678 f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((500000 1000000,510000 1000000,510000 1010000,500000 1000000))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(126) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOINT(500000 1000000,510000 1010000)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(127) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTILINESTRING((500000 1000000,510000 1010000),(510000 1010000,510000 1000000))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(128) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((500000 1000000,510000 1000000,510000 1010000,500000 1000000)),((-500000 1000000,-510000 1000000,-510000 1010000,-500000 1000000),(-502000 1001000,-509000 1001000,-509000 1008500,-502000 1001000)))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(129) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(500000 1000000),LINESTRING(500000 1000000,510000 1010000,520000 1020000))')) lyr.CreateFeature(f) with gdaltest.error_handler(): out_ds = gdal.VectorTranslate('/vsimem/outmvt', src_ds, options='-f MVT -preserve_fid') assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/outmvt/0') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if out_f['mvt_id'] != 123 or \ out_f['strfield'] != 'foo' or \ out_f['intfield'] != -1 or \ out_f['int64field'] != 123456789012345 or \ out_f['realfield'] != 1.25 or \ out_f['datefield'] != '2018-02-01' or \ out_f['datetimefield'] != '2018-02-01T12:34:56' or \ out_f['boolfield'] is False or \ ogrtest.check_feature_geometry(out_f, 'POINT (498980.920645632 997961.84129126)') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if out_f['strfield'] != 'foo' or \ out_f['intfield'] != -1 or \ out_f['int64field'] != 123456789012345 or \ out_f['realfield'] != 1.25 or \ out_f['datefield'] != '2018-02-01' or \ out_f['datetimefield'] != '2018-02-01T12:34:56' or \ out_f['boolfield'] is False or \ ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((498980.920645632 997961.84129126,508764.860266134 1007745.78091176,518548.799886636 1017529.72053226))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if out_f['strfield'] != 'foobarbazbaw' or \ out_f['intfield'] != 1 or \ out_f['int64field'] != -123456789012345 or \ out_f['realfield'] != -1.25678 or \ out_f.IsFieldSet('datefield') or \ out_f.IsFieldSet('datetimefield') or \ out_f.IsFieldSet('boolfield') or \ ogrtest.check_feature_geometry(out_f, 'POLYGON ((498980.920645632 997961.84129126,508764.860266134 1007745.78091176,508764.860266134 997961.84129126,498980.920645632 997961.84129126))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOINT ((498980.920645632 997961.84129126),(508764.860266134 1007745.78091176))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((498980.920645632 997961.84129126,508764.860266134 1007745.78091176),(508764.860266134 1007745.78091176,508764.860266134 997961.84129126))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOLYGON (((498980.920645632 997961.84129126,508764.860266134 1007745.78091176,508764.860266134 997961.84129126,498980.920645632 997961.84129126)),((-498980.920645632 997961.84129126,-508764.860266134 997961.84129126,-508764.860266134 1007745.78091176,-498980.920645632 997961.84129126)))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if (out_f.GetGeometryRef().GetGeometryType() == ogr.wkbPoint and ogrtest.check_feature_geometry(out_f, 'POINT (498980.920645632 997961.84129126)') != 0) or \ (out_f.GetGeometryRef().GetGeometryType() == ogr.wkbMultiLineString and ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((498980.920645632 997961.84129126,508764.860266134 1007745.78091176,518548.799886636 1017529.72053226))') != 0) or \ out_f.GetGeometryRef().GetGeometryType() not in (ogr.wkbPoint, ogr.wkbMultiLineString): out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if (out_f.GetGeometryRef().GetGeometryType() == ogr.wkbPoint and ogrtest.check_feature_geometry(out_f, 'POINT (498980.920645632 997961.84129126)') != 0) or \ (out_f.GetGeometryRef().GetGeometryType() == ogr.wkbMultiLineString and ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((498980.920645632 997961.84129126,508764.860266134 1007745.78091176,518548.799886636 1017529.72053226))') != 0) or \ out_f.GetGeometryRef().GetGeometryType() not in (ogr.wkbPoint, ogr.wkbMultiLineString): out_f.DumpReadable() pytest.fail() out_ds = ogr.Open('/vsimem/outmvt/5') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') assert out_lyr.GetFeatureCount() == 9 f = gdal.VSIFOpenL('/vsimem/outmvt/metadata.json', 'rb') assert f is not None data = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) data_json = json.loads(data) expected_json = { "name": "outmvt", "description": "", "version": 2, "minzoom": 0, "maxzoom": 5, "center": "0.0449158,9.0352907,0", "bounds": "-4.5814079,8.9465739,4.6712395,9.1240075", "type": "overlay", "format": "pbf", } for k in expected_json: assert k in data_json and data_json[k] == expected_json[k], data json_json = json.loads(data_json['json']) expected_json_json = { "vector_layers": [ { "id": "mylayer", "description": "", "minzoom": 0, "maxzoom": 5, "fields": { "strfield": "String", "intfield": "Number", "int64field": "Number", "realfield": "Number", "datefield": "String", "datetimefield": "String", "boolfield": "Boolean" } } ], "tilestats": { "layerCount": 1, "layers": [ { "layer": "mylayer", "count": 7, "geometry": "LineString", "attributeCount": 7, "attributes": [ { "attribute": "strfield", "count": 2, "type": "string", "values": [ "foo", "foobarbazbaw" ] }, { "attribute": "intfield", "count": 2, "type": "numeric", "values": [ -1, 1 ], "min":-1, "max":1 }, { "attribute": "int64field", "count": 2, "type": "numeric", "values": [ -123456789012345, 123456789012345 ], "min":-123456789012345, "max":123456789012345 }, { "attribute": "realfield", "count": 2, "type": "numeric", "values": [ -1.256780, 1.250000 ], "min":-1.25678, "max":1.25 }, { "attribute": "datefield", "count": 1, "type": "string", "values": [ "2018-02-01" ] }, { "attribute": "datetimefield", "count": 1, "type": "string", "values": [ "2018-02-01T12:34:56" ] }, { "attribute": "boolfield", "count": 1, "type": "boolean", "values": [ True ] } ] } ] } } assert json_json == expected_json_json, data_json['json'] gdal.RmdirRecursive('/vsimem/outmvt') ############################################################################### def test_ogr_mvt_write_conf(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 1000000)')) lyr.CreateFeature(f) conf = {'mylayer': {'target_name': 'TheLayer', 'description': 'the layer', 'minzoom': 1, 'maxzoom': 2}} with gdaltest.tempfile('/vsimem/conf.json', json.dumps(conf)): out_ds = gdal.VectorTranslate('/vsimem/outmvt', src_ds, format='MVT', datasetCreationOptions=["CONF=/vsimem/conf.json"]) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/outmvt/1') assert out_ds is not None out_lyr = out_ds.GetLayerByName('TheLayer') assert out_lyr out_ds = None gdal.RmdirRecursive('/vsimem/outmvt') out_ds = gdal.VectorTranslate('/vsimem/outmvt', src_ds, format='MVT', datasetCreationOptions=["CONF=%s" % json.dumps(conf)]) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/outmvt/1') assert out_ds is not None out_lyr = out_ds.GetLayerByName('TheLayer') assert out_lyr out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOINT (498980.920645632 997961.84129126)') != 0: out_f.DumpReadable() pytest.fail() f = gdal.VSIFOpenL('/vsimem/outmvt/metadata.json', 'rb') assert f is not None data = gdal.VSIFReadL(1, 100000, f).decode('ASCII') gdal.VSIFCloseL(f) data_json = json.loads(data) json_json = json.loads(data_json['json']) expected_json_json = { "vector_layers": [ { "id": "TheLayer", "description": "the layer", "minzoom": 1, "maxzoom": 2, "fields": { } } ], "tilestats": { "layerCount": 1, "layers": [ { "layer": "TheLayer", "count": 1, "geometry": "Point", "attributeCount": 0, "attributes": [ ] } ] } } assert json_json == expected_json_json, data_json['json'] gdal.RmdirRecursive('/vsimem/outmvt') ############################################################################### def test_ogr_mvt_write_mbtiles(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 1000000)')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOINT ((499898.164985053 1000102.07808325))') != 0: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_limitations_max_size(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') lyr.CreateField(ogr.FieldDefn('field')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 1000000)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(500000 1000000,510000 1000000)')) lyr.CreateFeature(f) # Also test single threaded execution with gdaltest.config_option('GDAL_NUM_THREADS', '1'): out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds, datasetCreationOptions=['MAX_SIZE=100', 'SIMPLIFICATION=1']) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((498980.920645631 1007745.78091176,508764.860266133 1007745.78091176))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'POINT (498980.920645631 1007745.78091176)') != 0: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_polygon_repaired(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') lyr.CreateField(ogr.FieldDefn('field')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 500000,100000 500000,100000 200000,100500 200000,100500 500000,500000 500000,500000 0,0 0))')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0,0 500000,100000 500000,100000 200000,100500 200000,100500 500000,500000 500000,500000 0,0 0)),((1000000 0,1000000 1000000,2000000 1000000,1000000 0)))')) lyr.CreateFeature(f) # Cannot be repaired f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,0 0))')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds, datasetCreationOptions=['MAXZOOM=0']) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOLYGON (((0 0,0.0 498980.920645632,498980.920645632 498980.920645632,498980.920645632 0.0,0 0)))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOLYGON (((0 0,0.0 498980.920645632,498980.920645632 498980.920645632,498980.920645632 0.0,0 0)),((997961.84129126 0.0,997961.84129126 997961.84129126,1995923.68258252 997961.84129126,997961.84129126 0.0)))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if out_f is not None: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_conflicting_innner_ring(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') lyr.CreateField(ogr.FieldDefn('field')) f = ogr.Feature(lyr.GetLayerDefn()) # the second inner ring conflicts with the first one once transformed to integer coordinates f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((-500000 1000000,-510000 1000000,-510000 1010000,-500000 1000000),(-502000 1001000,-509000 1001000,-509000 1008500,-502000 1001000),(-502000 1000900,-509000 1000900,-509000 1000800,-502000 1000900))')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOLYGON (((-499898.164985052 1000102.07808325,-509987.852718695 1000102.07808325,-509987.852718695 1009886.01770375,-499898.164985052 1000102.07808325),(-502038.401777037 1001019.32242267,-509070.608379273 1008357.27713804,-509070.608379273 1001019.32242267,-502038.401777037 1001019.32242267)))') != 0: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_limitations_max_size_polygon(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') lyr.CreateField(ogr.FieldDefn('field')) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((500000 1000000,510000 1000000,510000 1010000,500000 1000000),(503000 1003000,507000 1003000,507000 1005000,503000 1003000))')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds, datasetCreationOptions=['MAX_SIZE=100']) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTIPOLYGON (((498980.920645631 1007745.78091176,508764.860266133 1017529.72053227,508764.860266133 1007745.78091176,498980.920645631 1007745.78091176)))') != 0: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_limitations_max_features(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(500000 1000000)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((500000 1000000,510000 1000000,510000 1100000,500000 1000000))')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out.mbtiles', src_ds, format='MVT', datasetCreationOptions=['MAX_FEATURES=1']) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out.mbtiles') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'POLYGON ((499898.164985053 1000102.07808325,509987.852718696 1100081.71108026,509987.852718696 1000102.07808325,499898.164985053 1000102.07808325))') != 0: out_f.DumpReadable() pytest.fail() out_f = out_lyr.GetNextFeature() if out_f is not None: out_f.DumpReadable() pytest.fail() out_ds = None gdal.Unlink('/vsimem/out.mbtiles') ############################################################################### def test_ogr_mvt_write_custom_tiling_scheme(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) srs = osr.SpatialReference() srs.SetFromUserInput("WGS84") lyr = src_ds.CreateLayer('mylayer', srs=srs) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(12 71,13 72)')) lyr.CreateFeature(f) out_ds = gdal.VectorTranslate('/vsimem/out', src_ds, format='MVT', datasetCreationOptions=['TILING_SCHEME=EPSG:3067,-548576,8388608,2097152']) assert out_ds is not None out_ds = None out_ds = ogr.Open('/vsimem/out/1') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') assert out_lyr.GetSpatialRef().ExportToWkt().find('3067') >= 0 out_f = out_lyr.GetNextFeature() if ogrtest.check_feature_geometry(out_f, 'MULTILINESTRING ((-40160 7944704,21024 8044800))') != 0: out_f.DumpReadable() pytest.fail() out_ds = None gdal.RmdirRecursive('/vsimem/out') ############################################################################### def test_ogr_mvt_write_errors(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() # Raster creation attempt gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = gdal.GetDriverByName('MVT').Create('/vsimem/foo', 1, 1) assert ds is None # should have mbtiles extension gdal.RmdirRecursive('/vsimem/foo.bar') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo.bar', options=['FORMAT=MBTILES']) assert ds is None # Cannot create temporary database gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['TEMPORARY_DB=/i/do_not/exist.db']) assert ds is None # cannot create mbtiles file with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/i/do_not/exist.mbtiles', options=['TEMPORARY_DB=/vsimem/temp.db']) assert ds is None gdal.Unlink('/vsimem/temp.db') # invalid MINZOOM gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['MINZOOM=-1']) assert ds is None with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['MINZOOM=30']) assert ds is None # invalid MAXZOOM gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['MAXZOOM=-1']) assert ds is None with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['MAXZOOM=30']) assert ds is None # invalid MINZOOM vs MAXZOOM gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['MINZOOM=1', 'MAXZOOM=0']) assert ds is None # invalid MINZOOM for layer gdal.RmdirRecursive('/vsimem/foo') ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo') with gdaltest.error_handler(): lyr = ds.CreateLayer('foo', options=['MINZOOM=-1']) assert lyr is None # invalid CONF gdal.RmdirRecursive('/vsimem/foo') gdal.FileFromMemBuffer('/vsimem/invalid.json', 'foo bar') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['CONF=/vsimem/invalid.json']) gdal.Unlink('/vsimem/invalid.json') assert ds is None # TILING_SCHEME not allowed with MBTILES with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo.mbtiles', options=['TILING_SCHEME=EPSG:4326,-180,180,360']) assert ds is None # Invalid TILING_SCHEME gdal.RmdirRecursive('/vsimem/foo') with gdaltest.error_handler(): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo', options=['TILING_SCHEME=EPSG:4326']) assert ds is None # Test failure in creating tile gdal.RmdirRecursive('tmp/tmpmvt') ds = ogr.GetDriverByName('MVT').CreateDataSource('tmp/tmpmvt') gdal.RmdirRecursive('tmp/tmpmvt') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) with gdaltest.error_handler(): ds = None assert gdal.GetLastErrorMsg() != '' gdal.RmdirRecursive('tmp/tmpmvt') # Test failure in writing in temp db (multi-threaded) gdal.RmdirRecursive('/vsimem/foo') with gdaltest.config_option('OGR_MVT_REMOVE_TEMP_FILE', 'NO'): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo') temp_ds = ogr.Open('/vsimem/foo.temp.db', update=1) temp_ds.ExecuteSQL('DROP TABLE temp') temp_ds = None gdal.Unlink('/vsimem/foo.temp.db') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 0))')) with gdaltest.error_handler(): lyr.CreateFeature(f) ds = None assert gdal.GetLastErrorMsg() != '' gdal.RmdirRecursive('tmp/tmpmvt') # Test failure in writing in temp db (single-threaded) gdal.RmdirRecursive('/vsimem/foo') with gdaltest.config_option('OGR_MVT_REMOVE_TEMP_FILE', 'NO'): with gdaltest.config_option('GDAL_NUM_THREADS', '1'): ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo') temp_ds = ogr.Open('/vsimem/foo.temp.db', update=1) temp_ds.ExecuteSQL('DROP TABLE temp') temp_ds = None gdal.Unlink('/vsimem/foo.temp.db') lyr = ds.CreateLayer('test') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 0))')) with gdaltest.error_handler(): lyr.CreateFeature(f) ds = None assert gdal.GetLastErrorMsg() != '' gdal.RmdirRecursive('tmp/tmpmvt') # Test reprojection failure gdal.RmdirRecursive('/vsimem/foo') ds = ogr.GetDriverByName('MVT').CreateDataSource('/vsimem/foo') with gdaltest.error_handler(): lyr = ds.CreateLayer('test', srs=osr.SpatialReference()) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) ds = None gdal.RmdirRecursive('/vsimem/foo') ############################################################################### # def test_ogr_mvt_write_reuse_temp_db(): if not ogrtest.have_geos() or ogr.GetDriverByName('SQLITE') is None: pytest.skip() src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) lyr = src_ds.CreateLayer('mylayer') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,100000 100000,200000 0)')) lyr.CreateFeature(f) with gdaltest.config_option('OGR_MVT_REMOVE_TEMP_FILE', 'NO'): gdal.VectorTranslate('/vsimem/out', src_ds, format='MVT') assert gdal.VSIStatL('/vsimem/out.temp.db') is not None gdal.RmdirRecursive('/vsimem/out') with gdaltest.config_option('OGR_MVT_REUSE_TEMP_FILE', 'YES'): gdal.VectorTranslate('/vsimem/out', src_ds, format='MVT') out_ds = ogr.Open('/vsimem/out/5') assert out_ds is not None out_lyr = out_ds.GetLayerByName('mylayer') out_f = out_lyr.GetNextFeature() assert out_f is not None out_ds = None gdal.RmdirRecursive('/vsimem/out') gdal.Unlink('/vsimem/out.temp.db') ############################################################################### # gdalautotest-3.0.4/ogr/ogr_as_sqlite_extension.py0000755003401500001440000001060713614005365021732 0ustar rouaultusers#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_as_sqlite_extension.py 3e128bede9d23a5d2c9640f8f35d3e1586a8c0d2 2018-10-22 10:12:48 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test GDAL as a SQLite3 dynamically loaded extension # Author: Even Rouault # ############################################################################### # Copyright (c) 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. ############################################################################### # This file is meant at being run by ogr_virtualogr_3() # This is a bit messy with heavy use of ctypes. The sqlite3 python module # is rarely compiled with support of extension loading, so we just simulate # what a tiny C program would do import sys def do(sqlite3name, gdalname): try: import ctypes except ImportError: print('skip') sys.exit(0) sqlite_handle = ctypes.cdll.LoadLibrary(sqlite3name) if sqlite_handle is None: print('skip') sys.exit(0) db = ctypes.c_void_p(0) pdb = ctypes.pointer(db) if hasattr(sqlite_handle, 'sqlite3_open'): ret = sqlite_handle.sqlite3_open(':memory:'.encode('ascii'), pdb) elif hasattr(sqlite_handle, 'SPLite3_open'): ret = sqlite_handle.SPLite3_open(':memory:'.encode('ascii'), pdb) else: print('skip') sys.exit(0) if ret != 0: print('Error sqlite3_open ret = %d' % ret) sys.exit(1) if hasattr(sqlite_handle, 'sqlite3_enable_load_extension'): ret = sqlite_handle.sqlite3_enable_load_extension(db, 1) elif hasattr(sqlite_handle, 'SPLite3_enable_load_extension'): ret = sqlite_handle.SPLite3_enable_load_extension(db, 1) else: print('skip') sys.exit(0) if ret != 0: print('skip') sys.exit(0) gdalname = gdalname.encode('ascii') if hasattr(sqlite_handle, 'sqlite3_load_extension'): ret = sqlite_handle.sqlite3_load_extension(db, gdalname, None, None) else: ret = sqlite_handle.SPLite3_load_extension(db, gdalname, None, None) if ret != 0: print('Error sqlite3_load_extension ret = %d' % ret) sys.exit(1) tab = ctypes.c_void_p() ptab = ctypes.pointer(tab) nrow = ctypes.c_int(0) pnrow = ctypes.pointer(nrow) ncol = ctypes.c_int(0) pncol = ctypes.pointer(ncol) if hasattr(sqlite_handle, 'sqlite3_get_table'): ret = sqlite_handle.sqlite3_get_table(db, 'SELECT ogr_version()'.encode('ascii'), ptab, pnrow, pncol, None) else: ret = sqlite_handle.SPLite3_get_table(db, 'SELECT ogr_version()'.encode('ascii'), ptab, pnrow, pncol, None) if ret != 0: print('Error sqlite3_get_table ret = %d' % ret) sys.exit(1) cast_tab = ctypes.cast(tab, ctypes.POINTER(ctypes.c_char_p)) sys.stdout.write(cast_tab[1].decode('ascii')) sys.stdout.flush() if hasattr(sqlite_handle, 'sqlite3_close'): ret = sqlite_handle.sqlite3_close(db) else: ret = sqlite_handle.SPLite3_close(db) if ret != 0: sys.exit(1) if __name__ == '__main__': if len(sys.argv) != 3: print('python ogr_as_sqlite_extension name_of_libsqlite3 name_of_libgdal') sys.exit(1) do(sys.argv[1], sys.argv[2]) gdalautotest-3.0.4/ogr/ogr_jml.py0000755003401500001440000005267213614005365016444 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_jml.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test JML driver 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 gdaltest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest def test_ogr_jml_init(): ds = ogr.Open('data/test.jml') if ds is None: gdaltest.jml_read_support = 0 else: gdaltest.jml_read_support = 1 ds = None ############################################################################### # Test reading def test_ogr_jml_1(): if not gdaltest.jml_read_support: pytest.skip() ds = ogr.Open('data/test.jml') assert ds.GetLayerCount() == 1 assert ds.GetLayer(1) is None assert ds.TestCapability(ogr.ODsCCreateLayer) == 0 assert ds.TestCapability(ogr.ODsCDeleteLayer) == 0 lyr = ds.GetLayer(0) fields = [('first_property', ogr.OFTString), ('another_property', ogr.OFTString), ('objectAttr', ogr.OFTString), ('attr2', ogr.OFTString), ('attr3', ogr.OFTString), ('int', ogr.OFTInteger), ('double', ogr.OFTReal), ('date', ogr.OFTDateTime), ('datetime', ogr.OFTDateTime), ('R_G_B', ogr.OFTString), ('not_ignored', ogr.OFTString)] assert lyr.GetLayerDefn().GetFieldCount() == len(fields) for i, field in enumerate(fields): field_defn = lyr.GetLayerDefn().GetFieldDefn(i) assert field_defn.GetName() == field[0] and field_defn.GetType() == field[1], i feat = lyr.GetNextFeature() if feat.GetField('first_property') != 'even' or \ feat.GetField('another_property') != 'rouault' or \ feat.GetField('objectAttr') != 'foo' or \ feat.GetField('attr2') != 'bar' or \ feat.GetField('attr3') != 'baz' or \ feat.GetField('int') != 123 or \ feat.GetField('double') != 1.23 or \ feat.GetFieldAsString('date') != '2014/10/18 00:00:00' or \ feat.GetFieldAsString('datetime') != '2014/10/18 21:36:45' or \ feat.GetField('R_G_B') != '0000FF' or \ not feat.IsFieldNull('not_ignored') or \ feat.GetStyleString() != 'BRUSH(fc:#0000FF)' or \ feat.GetGeometryRef().ExportToWkt() != 'POLYGON ((0 0,0 10,10 10,10 0,0 0))': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetFieldAsString('datetime') != '2014/10/18 21:36:45+02' or \ feat.GetField('R_G_B') != 'FF00FF' or \ feat.GetStyleString() != 'PEN(c:#FF00FF)' or \ feat.GetGeometryRef().ExportToWkt() != 'POINT (-1 -1)': feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() if feat.GetGeometryRef() is not None: feat.DumpReadable() pytest.fail() ############################################################################### # Test creating a file def test_ogr_jml_2(): # Invalid filename gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.GetDriverByName('JML').CreateDataSource('/foo/ogr_jml.jml') gdal.PopErrorHandler() ds = None # Empty layer ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') lyr = ds.CreateLayer('foo') lyr.ResetReading() lyr.GetNextFeature() ds = None f = gdal.VSIFOpenL('/vsimem/ogr_jml.jml', 'rb') data = gdal.VSIFReadL(1, 1000, f).decode('ascii') gdal.VSIFCloseL(f) assert data == """ featureCollection feature geometry boundedBy 0.00,0.00 -1.00,-1.00 """ gdal.Unlink('/vsimem/ogr_jml.jml') # Test all data types ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') srs = osr.SpatialReference() srs.ImportFromEPSG(32632) lyr = ds.CreateLayer('foo', srs=srs) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('double', ogr.OFTReal)) lyr.CreateField(ogr.FieldDefn('date', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('datetime', ogr.OFTDateTime)) lyr.CreateField(ogr.FieldDefn('datetime2', ogr.OFTDateTime)) with gdaltest.error_handler(): lyr.CreateField(ogr.FieldDefn('time_as_str', ogr.OFTTime)) assert lyr.TestCapability(ogr.OLCCreateField) == 1 assert lyr.TestCapability(ogr.OLCSequentialWrite) == 1 assert lyr.TestCapability(ogr.OLCRandomWrite) == 0 assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 # empty feature f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) assert lyr.TestCapability(ogr.OLCCreateField) == 0 assert lyr.CreateField(ogr.FieldDefn('that_wont_work')) != 0 f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('str', 'fo featureCollection feature geometry boundedBy str STRING int INTEGER double DOUBLE date DATE datetime DATE datetime2 DATE time_as_str STRING R_G_B STRING 0.0000000000,0.0000000000 10.0000000000,10.0000000000 1,2 fo<o 1 1.23 2014/10/19 2014-10-19T12:34:56 2014-10-19T12:34:56.000+0200 12:34:56 112233 0,0 0,10 10,10 10,0 0,0 112233 """ gdal.Unlink('/vsimem/ogr_jml.jml') # Test with an explicit R_G_B field ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') lyr = ds.CreateLayer('foo') lyr.CreateField(ogr.FieldDefn('R_G_B', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('R_G_B', '112233') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) lyr.CreateFeature(f) # Test that R_G_B is not overridden by feature style f.SetField('R_G_B', '445566') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) f.SetStyleString('PEN(c:#778899)') lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_jml.jml', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert '112233' in data and '445566' in data gdal.Unlink('/vsimem/ogr_jml.jml') # Test CREATE_R_G_B_FIELD=NO ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') lyr = ds.CreateLayer('foo', options=['CREATE_R_G_B_FIELD=NO']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_jml.jml', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'R_G_B' not in data gdal.Unlink('/vsimem/ogr_jml.jml') # Test CREATE_OGR_STYLE_FIELD=YES ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') lyr = ds.CreateLayer('foo', options=['CREATE_OGR_STYLE_FIELD=YES']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetStyleString('PEN(c:#445566)') lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_jml.jml', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'OGR_STYLE' in data and 'PEN(c:#445566)' in data gdal.Unlink('/vsimem/ogr_jml.jml') # Test CREATE_OGR_STYLE_FIELD=YES with a R_G_B field ds = ogr.GetDriverByName('JML').CreateDataSource('/vsimem/ogr_jml.jml') lyr = ds.CreateLayer('foo', options=['CREATE_OGR_STYLE_FIELD=YES']) lyr.CreateField(ogr.FieldDefn('R_G_B', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('R_G_B', '112233') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (1 2)')) f.SetStyleString('PEN(c:#445566)') lyr.CreateFeature(f) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_jml.jml', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert 'OGR_STYLE' in data and 'PEN(c:#445566)' in data and '112233' in data gdal.Unlink('/vsimem/ogr_jml.jml') ############################################################################### # Run test_ogrsf def test_ogr_jml_3(): if not gdaltest.jml_read_support: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/test.jml') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test a few error cases def test_ogr_jml_4(): if not gdaltest.jml_read_support: pytest.skip() # Missing CollectionElement, FeatureElement or GeometryElement gdal.FileFromMemBuffer('/vsimem/ogr_jml.jml', """ featureCollection feature geometry """) ds = ogr.Open('/vsimem/ogr_jml.jml') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 ds = None # XML malformed in JCSGMLInputTemplate gdal.FileFromMemBuffer('/vsimem/ogr_jml.jml', """ featureCollection feature geometry """) ds = ogr.Open('/vsimem/ogr_jml.jml') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 ds = None # XML malformed in featureCollection gdal.FileFromMemBuffer('/vsimem/ogr_jml.jml', """ featureCollection feature geometry str1 STRING """) ds = ogr.Open('/vsimem/ogr_jml.jml') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn().GetFieldCount() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 ds = None # XML malformed in featureCollection gdal.FileFromMemBuffer('/vsimem/ogr_jml.jml', """ featureCollection feature geometry str1 STRING """) ds = ogr.Open('/vsimem/ogr_jml.jml') lyr = ds.GetLayer(0) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.GetLayerDefn().GetFieldCount() gdal.PopErrorHandler() assert gdal.GetLastErrorType() != 0 del ds # Invalid column definitions gdal.FileFromMemBuffer('/vsimem/ogr_jml.jml', """ featureCollection feature geometry str1 STRING str2 STRING str3 STRING str4 STRING str5 STRING str6 STRING str7 STRING str8 STRING """) ds = ogr.Open('/vsimem/ogr_jml.jml') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 0 lyr.GetNextFeature() ds = None ############################################################################### # Test reading SRS def test_ogr_jml_read_srs(): if not gdaltest.jml_read_support: pytest.skip() ds = ogr.Open('data/one_point_srid_4326.jml') lyr = ds.GetLayer(0) assert lyr.GetSpatialRef().ExportToWkt().find('4326') >= 0 f = lyr.GetNextFeature() assert f.GetGeometryRef() is not None ############################################################################### # def test_ogr_jml_cleanup(): gdal.Unlink('/vsimem/ogr_jml.jml') gdalautotest-3.0.4/ogr/ogr_fgdb_stress_test.py0000755003401500001440000001714413614005365021221 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_fgdb_stress_test.py 508bb9112f816ef21b6feadafd39ca4aef80248f 2018-12-31 15:22:26 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: FGDB driver stress testing of CreateFeature() with user set FID # 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 random import shutil import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test if driver is available @pytest.mark.require_run_on_demand def test_ogr_fgdb_stress_init(): ogrtest.fgdb_drv = None ogrtest.openfilegdb_drv = None ogrtest.fgdb_drv = ogr.GetDriverByName('FileGDB') ogrtest.reference_drv = ogr.GetDriverByName('GPKG') ogrtest.reference_ext = 'gpkg' ogrtest.openfilegdb_drv = ogr.GetDriverByName('OpenFileGDB') if ogrtest.fgdb_drv is None: pytest.skip() if ogrtest.reference_drv is None: pytest.skip() if ogrtest.openfilegdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass gdal.Unlink("tmp/test." + ogrtest.reference_ext) ############################################################################### # Generate databases from random operations @pytest.mark.require_run_on_demand def test_ogr_fgdb_stress_1(): if ogrtest.fgdb_drv is None: pytest.skip() verbose = False ds_test = ogrtest.fgdb_drv.CreateDataSource('tmp/test.gdb') ds_ref = ogrtest.reference_drv.CreateDataSource('tmp/test.' + ogrtest.reference_ext) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) lyr_test = ds_test.CreateLayer("test", geom_type=ogr.wkbPoint, srs=sr) lyr_ref = ds_ref.CreateLayer("test", geom_type=ogr.wkbPoint, srs=sr) for lyr in [lyr_test, lyr_ref]: lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) ds_test.ExecuteSQL("CREATE INDEX idx_test_str ON test(str)") ds_ref.ExecuteSQL("CREATE INDEX idx_test_str ON test(str)") random.seed(0) in_transaction = False nfeatures_created = 0 for _ in range(100000): function = random.randrange(0, 500) if function == 0: if not in_transaction: if verbose: print('StartTransaction') ds_test.StartTransaction(force=1) else: if verbose: print('CommitTransaction') ds_test.CommitTransaction() in_transaction = not in_transaction elif function < 500 / 3: ret = [] fid = -1 if random.randrange(0, 2) == 0: fid = 1 + random.randrange(0, 1000) wkt = 'POINT (%d %d)' % (random.randrange(0, 100), random.randrange(0, 100)) if verbose: print('Create(%d)' % fid) for lyr in [lyr_test, lyr_ref]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) f.SetField(0, '%d' % random.randrange(0, 1000)) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) gdal.PushErrorHandler() ret.append(lyr.CreateFeature(f)) gdal.PopErrorHandler() # So to ensure lyr_ref will use the same FID as the tested layer fid = f.GetFID() # print("created %d" % fid) assert ret[0] == ret[1] if ret[0] == 0: nfeatures_created += 1 # For some odd reason, the .spx file is no longer updated when doing # a SetFeature() before having creating at least 2 features ! elif function < 500 * 2 / 3 and nfeatures_created >= 2: ret = [] fid = 1 + random.randrange(0, 1000) if verbose: print('Update(%d)' % fid) wkt = 'POINT (%d %d)' % (random.randrange(0, 100), random.randrange(0, 100)) for lyr in [lyr_test, lyr_ref]: f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(fid) f.SetField(0, '%d' % random.randrange(0, 1000)) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) # gdal.PushErrorHandler() ret.append(lyr.SetFeature(f)) # gdal.PopErrorHandler() assert ret[0] == ret[1] # Same for DeleteFeature() elif nfeatures_created >= 2: ret = [] fid = 1 + random.randrange(0, 1000) if verbose: print('Delete(%d)' % fid) for lyr in [lyr_test, lyr_ref]: # gdal.PushErrorHandler() ret.append(lyr.DeleteFeature(fid)) # gdal.PopErrorHandler() assert ret[0] == ret[1] if in_transaction: ds_test.CommitTransaction() ############################################################################### # Compare databases @pytest.mark.require_run_on_demand def test_ogr_fgdb_stress_2(): if ogrtest.fgdb_drv is None: pytest.skip() ds_test = ogr.Open('tmp/test.gdb') ds_ref = ogr.Open('tmp/test.' + ogrtest.reference_ext) lyr_test = ds_test.GetLayer(0) lyr_ref = ds_ref.GetLayer(0) while True: f_test = lyr_test.GetNextFeature() f_ref = lyr_ref.GetNextFeature() assert not (f_test is None and f_ref is not None) or (f_test is not None and f_ref is None) if f_test is None: break if f_test.GetFID() != f_ref.GetFID() or \ f_test['str'] != f_ref['str'] or \ ogrtest.check_feature_geometry(f_test, f_ref.GetGeometryRef()) != 0: f_test.DumpReadable() f_ref.DumpReadable() pytest.fail() for val in range(1000): lyr_test.SetAttributeFilter("str = '%d'" % val) lyr_ref.SetAttributeFilter("str = '%d'" % val) assert lyr_test.GetFeatureCount() == lyr_ref.GetFeatureCount(), val # sys.exit(0) ############################################################################### # Cleanup @pytest.mark.require_run_on_demand def test_ogr_fgdb_stress_cleanup(): if ogrtest.fgdb_drv is None: pytest.skip() try: shutil.rmtree("tmp/test.gdb") except OSError: pass gdal.Unlink("tmp/test." + ogrtest.reference_ext) gdalautotest-3.0.4/ogr/ogr_xplane.py0000755003401500001440000001662513614005365017147 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_xplane.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR XPlane driver functionality. # 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. ############################################################################### from osgeo import ogr ############################################################################### # Test apt.dat reading def test_ogr_xplane_apt_dat(): xplane_apt_ds = ogr.Open('data/apt.dat') assert xplane_apt_ds is not None layers = [('APT', 8, [('apt_icao', 'E46')]), ('RunwayPolygon', 19, [('apt_icao', 'E46')]), ('RunwayThreshold', 44, [('apt_icao', 'E46')]), ('WaterRunwayPolygon', 1, [('apt_icao', 'I38')]), ('WaterRunwayThreshold', 2, [('apt_icao', 'I38')]), ('Helipad', 2, [('apt_icao', 'CYXX')]), ('HelipadPolygon', 2, [('apt_icao', 'CYXX')]), ('TaxiwayRectangle', 437, [('apt_icao', 'LFPG')]), ('Pavement', 11, [('apt_icao', 'CYXX')]), ('APTBoundary', 1, [('apt_icao', 'VTX2')]), ('APTLinearFeature', 45, [('apt_icao', 'CYXX')]), ('ATCFreq', 42, [('apt_icao', 'CYXX')]), ('StartupLocation', 110, [('apt_icao', 'CYXX')]), ('APTLightBeacon', 3, [('apt_icao', 'CYXX')]), ('APTWindsock', 25, [('apt_icao', 'E46')]), ('TaxiwaySign', 17, [('apt_icao', 'CYXX')]), ('VASI_PAPI_WIGWAG', 30, [('apt_icao', 'CYXX')]), ('Stopway', 6, [('apt_icao', 'LFPM')]), ] for layer in layers: lyr = xplane_apt_ds.GetLayerByName(layer[0]) assert lyr.GetFeatureCount() == layer[1], \ ('wrong number of features for layer %s : %d. %d were expected ' % (layer[0], lyr.GetFeatureCount(), layer[1])) feat_read = lyr.GetNextFeature() for item in layer[2]: assert feat_read.GetField(item[0]) == item[1], layer[0] ############################################################################### # Test apt.dat v810 reading def test_ogr_xplane_apt_v810_dat(): xplane_apt_ds = ogr.Open('data/apt810/apt.dat') assert xplane_apt_ds is not None layers = [('APT', 6, [('apt_icao', 'UHP1')]), ('RunwayPolygon', 6, [('apt_icao', 'UHP1')]), ('RunwayThreshold', 13, [('apt_icao', 'UHP1')]), ('WaterRunwayPolygon', 2, [('apt_icao', '6MA8')]), ('WaterRunwayThreshold', 4, [('apt_icao', '6MA8')]), ('Helipad', 1, [('apt_icao', '9FD6')]), ('HelipadPolygon', 1, [('apt_icao', '9FD6')]), ('TaxiwayRectangle', 54, [('apt_icao', 'UHP1')]), ('Pavement', 0, []), ('APTBoundary', 0, []), ('APTLinearFeature', 0, []), ('ATCFreq', 10, [('apt_icao', 'EHVB')]), ('StartupLocation', 0, []), ('APTLightBeacon', 2, [('apt_icao', '7I6')]), ('APTWindsock', 9, [('apt_icao', 'UHP1')]), ('TaxiwaySign', 0, []), ('VASI_PAPI_WIGWAG', 12, [('apt_icao', 'UHP1')]), ('Stopway', 4, [('apt_icao', 'EKYT')]), ] for layer in layers: lyr = xplane_apt_ds.GetLayerByName(layer[0]) assert lyr.GetFeatureCount() == layer[1], \ ('wrong number of features for layer %s : %d. %d were expected ' % (layer[0], lyr.GetFeatureCount(), layer[1])) feat_read = lyr.GetNextFeature() for item in layer[2]: assert feat_read.GetField(item[0]) == item[1], layer[0] ############################################################################### # Test nav.dat reading def test_ogr_xplane_nav_dat(): xplane_nav_ds = ogr.Open('data/nav.dat') assert xplane_nav_ds is not None layers = [('ILS', 6, [('navaid_id', 'IMQS')]), ('VOR', 3, [('navaid_id', 'AAL')]), ('NDB', 4, [('navaid_id', 'APH')]), ('GS', 1, [('navaid_id', 'IMQS')]), ('Marker', 3, [('apt_icao', '40N')]), ('DME', 6, [('navaid_id', 'AAL')]), ('DMEILS', 1, [('navaid_id', 'IWG')]) ] for layer in layers: lyr = xplane_nav_ds.GetLayerByName(layer[0]) assert lyr.GetFeatureCount() == layer[1], \ ('wrong number of features for layer %s : %d. %d were expected ' % (layer[0], lyr.GetFeatureCount(), layer[1])) feat_read = lyr.GetNextFeature() for item in layer[2]: assert feat_read.GetField(item[0]) == item[1], layer[0] xplane_nav_ds = None ############################################################################### # Test awy.dat reading def test_ogr_xplane_awy_dat(): xplane_awy_ds = ogr.Open('data/awy.dat') assert xplane_awy_ds is not None layers = [('AirwaySegment', 11, [('segment_name', 'R464')]), ('AirwayIntersection', 14, [('name', '00MKK')]) ] for layer in layers: lyr = xplane_awy_ds.GetLayerByName(layer[0]) assert lyr.GetFeatureCount() == layer[1], \ ('wrong number of features for layer %s : %d. %d were expected ' % (layer[0], lyr.GetFeatureCount(), layer[1])) feat_read = lyr.GetNextFeature() for item in layer[2]: assert feat_read.GetField(item[0]) == item[1], layer[0] ############################################################################### # Test fix.dat reading def test_ogr_xplane_fix_dat(): xplane_fix_ds = ogr.Open('data/fix.dat') assert xplane_fix_ds is not None layers = [('FIX', 1, [('fix_name', '00MKK')]) ] for layer in layers: lyr = xplane_fix_ds.GetLayerByName(layer[0]) assert lyr.GetFeatureCount() == layer[1], \ ('wrong number of features for layer %s : %d. %d were expected ' % (layer[0], lyr.GetFeatureCount(), layer[1])) feat_read = lyr.GetNextFeature() for item in layer[2]: assert feat_read.GetField(item[0]) == item[1], layer[0] ############################################################################### # gdalautotest-3.0.4/ogr/ogr_shape_sbn.py0000755003401500001440000001174513614005365017620 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_shape_sbn.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test ESRI shapefile spatial index mechanism (.sbn files). This can serve # as a test for the functionality of shapelib's sbnsearch.c # Author: Even Rouault # ############################################################################### # Copyright (c) 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 gdaltest from osgeo import ogr import pytest ############################################################################### # def search_all_features(lyr): geoms = [] lyr.SetSpatialFilter(None) extents = lyr.GetExtent() fc_ref = lyr.GetFeatureCount() feat = lyr.GetNextFeature() while feat is not None: geom = feat.GetGeometryRef() geoms.append(geom.Clone()) feat = lyr.GetNextFeature() # Test getting each geom 1 by 1 for geom in geoms: bbox = geom.GetEnvelope() lyr.SetSpatialFilterRect(bbox[0], bbox[2], bbox[1], bbox[3]) lyr.ResetReading() found_geom = False feat = lyr.GetNextFeature() while feat is not None and found_geom is False: got_geom = feat.GetGeometryRef() if got_geom.Equals(geom) == 1: found_geom = True else: feat = lyr.GetNextFeature() assert found_geom, ('did not find geometry for %s' % (geom.ExportToWkt())) # Get all geoms in a single gulp. We do not use exactly the extent bounds, because # there is an optimization in the shapefile driver to skip the spatial index in that # case. eps = 0.0001 lyr.SetSpatialFilterRect(extents[0] + eps, extents[2] + eps, extents[1] - eps, extents[3] - eps) lyr.ResetReading() fc = lyr.GetFeatureCount() # For point layers, we need a special case since there may be points on the border # of the extent if lyr.GetGeomType() == ogr.wkbPoint: lyr.SetSpatialFilterRect(extents[0], extents[2] + eps, extents[0] + eps, extents[3] - eps) lyr.ResetReading() fc = fc + lyr.GetFeatureCount() lyr.SetSpatialFilterRect(extents[1] - eps, extents[2] + eps, extents[1], extents[3] - eps) lyr.ResetReading() fc = fc + lyr.GetFeatureCount() lyr.SetSpatialFilterRect(extents[0], extents[2], extents[1], extents[2] + eps) lyr.ResetReading() fc = fc + lyr.GetFeatureCount() lyr.SetSpatialFilterRect(extents[0], extents[3] - eps, extents[1], extents[3]) lyr.ResetReading() fc = fc + lyr.GetFeatureCount() assert fc == fc_ref, ('layer %s: expected %d. got %d' % (lyr.GetName(), fc_ref, fc)) ############################################################################### # Test def test_ogr_shape_sbn_1(): if not gdaltest.download_file('http://pubs.usgs.gov/sim/3194/contents/Cochiti_shapefiles.zip', 'Cochiti_shapefiles.zip'): pytest.skip() try: os.stat('tmp/cache/CochitiDamShapeFiles/CochitiBoundary.shp') except OSError: try: gdaltest.unzip('tmp/cache', 'tmp/cache/Cochiti_shapefiles.zip') try: os.stat('tmp/cache/CochitiDamShapeFiles/CochitiBoundary.shp') except OSError: pytest.skip() except OSError: pytest.skip() ds = ogr.Open('tmp/cache/CochitiDamShapeFiles') for i in range(ds.GetLayerCount()): lyr = ds.GetLayer(i) search_all_features(lyr) ############################################################################### # Test def test_ogr_shape_sbn_2(): ds = ogr.Open('data/CoHI_GCS12.shp') lyr = ds.GetLayer(0) return search_all_features(lyr) gdalautotest-3.0.4/ogr/ogr_rfc35_mitab.py0000755003401500001440000003422013614005365017745 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_rfc35_mitab.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test RFC35 for MITAB 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. ############################################################################### import gdaltest from osgeo import ogr from osgeo import gdal import pytest ############################################################################### # def CheckFileSize(src_filename): import test_py_scripts script_path = test_py_scripts.get_py_script('ogr2ogr') if script_path is None: pytest.skip() test_py_scripts.run_py_script(script_path, 'ogr2ogr', '-f "MapInfo File" tmp/CheckFileSize.tab ' + src_filename) statBufSrc = gdal.VSIStatL(src_filename[0:-3] + "dat", gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) statBufDst = gdal.VSIStatL('tmp/CheckFileSize.dat', gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/CheckFileSize.tab') assert statBufSrc.size == statBufDst.size ############################################################################### # Initiate the test file def test_ogr_rfc35_mitab_1(): ds = ogr.GetDriverByName('MapInfo File').CreateDataSource('tmp/rfc35_test.tab') lyr = ds.CreateLayer('rfc35_test') lyr.ReorderFields([]) fd = ogr.FieldDefn('foo5', ogr.OFTString) fd.SetWidth(5) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo0') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('bar10', ogr.OFTString) fd.SetWidth(10) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo1') feat.SetField(1, 'bar1') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baz15', ogr.OFTString) fd.SetWidth(15) lyr.CreateField(fd) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo2') feat.SetField(1, 'bar2_01234') feat.SetField(2, 'baz2_0123456789') lyr.CreateFeature(feat) feat = None fd = ogr.FieldDefn('baw20', ogr.OFTString) fd.SetWidth(20) lyr.CreateField(fd) ############################################################################### # Test ReorderField() def Truncate(val, lyr_defn, fieldname): if val is None: return val return val[0:lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex(fieldname)).GetWidth()] def CheckFeatures(lyr, field1='foo5', field2='bar10', field3='baz15', field4='baw20'): expected_values = [ ['foo0', '', '', ''], ['foo1', 'bar1', '', ''], ['foo2', 'bar2_01234', 'baz2_0123456789', ''], ['foo3', 'bar3_01234', 'baz3_0123456789', 'baw3_012345678901234'] ] lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() i = 0 while feat is not None: if (field1 is not None and feat.GetField(field1) != Truncate(expected_values[i][0], lyr_defn, field1)) or \ (field2 is not None and feat.GetField(field2) != Truncate(expected_values[i][1], lyr_defn, field2)) or \ (field3 is not None and feat.GetField(field3) != Truncate(expected_values[i][2], lyr_defn, field3)) or \ (field4 is not None and feat.GetField(field4) != Truncate(expected_values[i][3], lyr_defn, field4)): feat.DumpReadable() pytest.fail() feat = lyr.GetNextFeature() i = i + 1 def CheckColumnOrder(lyr, expected_order): lyr_defn = lyr.GetLayerDefn() for i, exp_order in enumerate(expected_order): assert lyr_defn.GetFieldDefn(i).GetName() == exp_order def Check(lyr, expected_order): CheckColumnOrder(lyr, expected_order) CheckFeatures(lyr) ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr_reopen = ds.GetLayer(0) CheckColumnOrder(lyr_reopen, expected_order) CheckFeatures(lyr_reopen) def test_ogr_rfc35_mitab_2(): ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCReorderFields) == 1 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'foo3') feat.SetField(1, 'bar3_01234') feat.SetField(2, 'baz3_0123456789') feat.SetField(3, 'baw3_012345678901234') lyr.CreateFeature(feat) feat = None assert lyr.ReorderField(1, 3) == 0 # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['foo5', 'baz15', 'baw20', 'bar10']) lyr.ReorderField(3, 1) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 2) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['bar10', 'baz15', 'foo5', 'baw20']) lyr.ReorderField(2, 0) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderField(0, 1) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['bar10', 'foo5', 'baz15', 'baw20']) lyr.ReorderField(1, 0) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) lyr.ReorderFields([3, 2, 1, 0]) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['baw20', 'baz15', 'bar10', 'foo5']) lyr.ReorderFields([3, 2, 1, 0]) # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) # lyr = ds.GetLayer(0) Check(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([0, 0, 0, 0]) gdal.PopErrorHandler() assert ret != 0 # ds = None # ds = ogr.Open('tmp/rfc35_test.tab', update = 1) lyr = ds.GetLayer(0) CheckColumnOrder(lyr, ['foo5', 'bar10', 'baz15', 'baw20']) CheckFeatures(lyr) ############################################################################### # Test AlterFieldDefn() for change of name and width def test_ogr_rfc35_mitab_3(): ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) fd = ogr.FieldDefn("baz25", ogr.OFTString) fd.SetWidth(25) lyr_defn = lyr.GetLayerDefn() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(-1, fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(lyr_defn.GetFieldCount(), fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz15"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz25') fd = ogr.FieldDefn("baz5", ogr.OFTString) fd.SetWidth(5) lyr_defn = lyr.GetLayerDefn() lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("baz25"), fd, ogr.ALTER_ALL_FLAG) CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fld_defn = lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex('baz5')) assert fld_defn.GetWidth() == 5 CheckFeatures(lyr, field3='baz5') ############################################################################### # Test AlterFieldDefn() for change of type def test_ogr_rfc35_mitab_4(): ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 1 fd = ogr.FieldDefn("intfield", ogr.OFTInteger) lyr.CreateField(fd) lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 12345) lyr.SetFeature(feat) feat = None fd.SetWidth(10) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) gdal.PopErrorHandler() assert ret != 0 lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') if False: # pylint: disable=using-constant-test fd.SetWidth(5) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 12345 feat = None CheckFeatures(lyr, field3='baz5') ds = None if False: # pylint: disable=using-constant-test ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fd.SetWidth(4) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("intfield") == 1234 feat = None CheckFeatures(lyr, field3='baz5') ds = None # Check that the file size has decreased after column shrinking CheckFileSize('tmp/rfc35_test.tab') ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(15) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '12345' feat = None CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '12345' feat = None CheckFeatures(lyr, field3='baz5') lyr.DeleteField(lyr_defn.GetFieldIndex("oldintfld")) fd = ogr.FieldDefn("intfield", ogr.OFTInteger) fd.SetWidth(10) assert lyr.CreateField(fd) == 0 assert lyr.ReorderField(lyr_defn.GetFieldIndex("intfield"), 0) == 0 lyr.ResetReading() feat = lyr.GetNextFeature() feat.SetField("intfield", 98765) assert lyr.SetFeature(feat) == 0 feat = None fd = ogr.FieldDefn("oldintfld", ogr.OFTString) fd.SetWidth(6) lyr.AlterFieldDefn(lyr_defn.GetFieldIndex("intfield"), fd, ogr.ALTER_ALL_FLAG) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ds = None ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() lyr.ResetReading() feat = lyr.GetNextFeature() assert feat.GetField("oldintfld") == '98765' feat = None CheckFeatures(lyr, field3='baz5') ############################################################################### # Test DeleteField() def test_ogr_rfc35_mitab_5(): ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() assert lyr.TestCapability(ogr.OLCDeleteField) == 1 assert lyr.DeleteField(0) == 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(-1) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(lyr.GetLayerDefn().GetFieldCount()) gdal.PopErrorHandler() assert ret != 0 CheckFeatures(lyr, field3='baz5') assert lyr.DeleteField(lyr_defn.GetFieldIndex('baw20')) == 0 ds = None # Check that the file size has decreased after column removing CheckFileSize('tmp/rfc35_test.tab') if ret == 'fail': gdaltest.post_reason(ret) return ret ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() CheckFeatures(lyr, field3='baz5', field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('baz5')) == 0 CheckFeatures(lyr, field3=None, field4=None) assert lyr.DeleteField(lyr_defn.GetFieldIndex('foo5')) == 0 # We cannot delete the only one remaining field (well MapInfo prohibits that) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(lyr_defn.GetFieldIndex('bar10')) gdal.PopErrorHandler() assert ret != 0 CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ds = None ds = ogr.Open('tmp/rfc35_test.tab', update=1) lyr = ds.GetLayer(0) lyr_defn = lyr.GetLayerDefn() CheckFeatures(lyr, field1=None, field2=None, field3=None, field4=None) ############################################################################### # Initiate the test file def test_ogr_rfc35_mitab_cleanup(): ogr.GetDriverByName('MapInfo File').DeleteDataSource('tmp/rfc35_test.tab') gdalautotest-3.0.4/ogr/ogr_mssqlspatial.py0000755003401500001440000003056713614005365020376 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_mssqlspatial.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test MSSQLSpatial driver functionality. # 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 gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Open Database. def test_ogr_mssqlspatial_1(): gdaltest.mssqlspatial_ds = None if ogr.GetDriverByName('MSSQLSpatial') is None: pytest.skip() gdaltest.mssqlspatial_dsname = gdal.GetConfigOption( 'OGR_MSSQL_CONNECTION_STRING', # localhost doesn't work under chroot 'MSSQL:server=127.0.0.1;database=TestDB;driver=ODBC Driver 17 for SQL Server;UID=SA;PWD=DummyPassw0rd') gdaltest.mssqlspatial_ds = ogr.Open(gdaltest.mssqlspatial_dsname, update=1) if gdaltest.mssqlspatial_ds is None: pytest.skip() # Fetch and store the major-version number of the SQL Server engine in use sql_lyr = gdaltest.mssqlspatial_ds.ExecuteSQL( 'SELECT SERVERPROPERTY(\'ProductVersion\')') feat = sql_lyr.GetNextFeature() gdaltest.mssqlspatial_version = feat.GetFieldAsString(0) gdaltest.mssqlspatial_ds.ReleaseResultSet(sql_lyr) gdaltest.mssqlspatial_version_major = -1 if '.' in gdaltest.mssqlspatial_version: version_major_str = gdaltest.mssqlspatial_version[ 0:gdaltest.mssqlspatial_version.find('.')] if version_major_str.isdigit(): gdaltest.mssqlspatial_version_major = int(version_major_str) # Check whether the database server provides support for Z and M values, # available since SQL Server 2012 gdaltest.mssqlspatial_has_z_m = (gdaltest.mssqlspatial_version_major >= 11) ############################################################################### # Create table from data/poly.shp def test_ogr_mssqlspatial_2(): if gdaltest.mssqlspatial_ds is None: pytest.skip() shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) ###################################################### # Create Layer gdaltest.mssqlspatial_lyr = gdaltest.mssqlspatial_ds.CreateLayer( 'tpoly', srs=shp_lyr.GetSpatialRef()) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.mssqlspatial_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8), ('INT64', ogr.OFTInteger64)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature( feature_def=gdaltest.mssqlspatial_lyr.GetLayerDefn()) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) dst_feat.SetField('INT64', 1234567890123) gdaltest.mssqlspatial_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat = None assert gdaltest.mssqlspatial_lyr.GetFeatureCount() == shp_lyr.GetFeatureCount(), \ 'not matching feature count' got_srs = gdaltest.mssqlspatial_lyr.GetSpatialRef() expected_srs = shp_lyr.GetSpatialRef() assert got_srs.GetAuthorityCode(None) == expected_srs.GetAuthorityCode(None), \ 'not matching spatial ref' ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_mssqlspatial_3(): if gdaltest.mssqlspatial_ds is None: pytest.skip() assert gdaltest.mssqlspatial_lyr.GetGeometryColumn() == 'ogr_geometry' assert gdaltest.mssqlspatial_lyr.GetFeatureCount() == 10 expect = [168, 169, 166, 158, 165] gdaltest.mssqlspatial_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.mssqlspatial_lyr, 'eas_id', expect) assert gdaltest.mssqlspatial_lyr.GetFeatureCount() == 5 gdaltest.mssqlspatial_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.mssqlspatial_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) assert read_feat.GetField('INT64') == 1234567890123 read_feat = None orig_feat = None gdaltest.poly_feat = None gdaltest.shp_ds = None assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_mssqlspatial_4(): if gdaltest.mssqlspatial_ds is None: pytest.skip() dst_feat = ogr.Feature( feature_def=gdaltest.mssqlspatial_lyr.GetLayerDefn()) wkt_list = ['10', '2', '1', '4', '5', '6'] # If the database engine supports 3D features, include one in the tests if gdaltest.mssqlspatial_has_z_m: wkt_list.append('3d_1') for item in wkt_list: wkt_filename = 'data/wkb_wkt/' + item + '.wkt' wkt = open(wkt_filename).read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new feature. dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) dst_feat.SetFID(-1) assert gdaltest.mssqlspatial_lyr.CreateFeature(dst_feat) == ogr.OGRERR_NONE, \ ('CreateFeature failed creating feature ' + 'from file "' + wkt_filename + '"') ###################################################################### # Before reading back the record, verify that the newly added feature # is returned from the CreateFeature method with a newly assigned FID. assert dst_feat.GetFID() != -1, \ 'Assigned FID was not returned in the new feature' ###################################################################### # Read back the feature and get the geometry. gdaltest.mssqlspatial_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.mssqlspatial_lyr.GetNextFeature() geom_read = feat_read.GetGeometryRef() if ogrtest.check_feature_geometry(feat_read, geom) != 0: print(item) print(wkt) pytest.fail(geom_read) feat_read.Destroy() dst_feat.Destroy() gdaltest.mssqlspatial_lyr.ResetReading() # to close implicit transaction ############################################################################### # Run test_ogrsf def test_ogr_mssqlspatial_test_ogrsf(): if gdaltest.mssqlspatial_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + " -ro '" + gdaltest.mssqlspatial_dsname + "' tpoly") assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Verify features can be created in an existing table that includes a geometry # column but is not registered in the "geometry_columns" table. def test_ogr_mssqlspatial_create_feature_in_unregistered_table(): if gdaltest.mssqlspatial_ds is None: pytest.skip() # Create a feature that specifies a spatial-reference system spatial_reference = osr.SpatialReference() spatial_reference.ImportFromEPSG(4326) feature = ogr.Feature(ogr.FeatureDefn('Unregistered')) feature.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT (10 20)', spatial_reference)) # Create a table that includes a geometry column but is not registered in # the "geometry_columns" table gdaltest.mssqlspatial_ds.ExecuteSQL( 'CREATE TABLE Unregistered' + '(' + 'ObjectID int IDENTITY(1,1) NOT NULL PRIMARY KEY,' + 'Shape geometry NOT NULL' + ');') # Create a new MSSQLSpatial data source, one that will find the table just # created and make it available via GetLayerByName() use_geometry_columns = gdal.GetConfigOption( 'MSSQLSPATIAL_USE_GEOMETRY_COLUMNS') gdal.SetConfigOption('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS', 'NO') test_ds = ogr.Open(gdaltest.mssqlspatial_dsname, update=1) gdal.SetConfigOption('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS', use_geometry_columns) assert test_ds is not None, 'cannot open data source' # Get a layer backed by the newly created table and verify that (as it is # unregistered) it has no associated spatial-reference system unregistered_layer = test_ds.GetLayerByName('Unregistered'); assert unregistered_layer is not None, 'did not get Unregistered layer' unregistered_spatial_reference = unregistered_layer.GetSpatialRef() assert unregistered_spatial_reference is None, \ 'layer Unregistered unexpectedly has an SRS' # Verify creating the feature in the layer succeeds despite the lack of an # associated spatial-reference system assert unregistered_layer.CreateFeature(feature) == ogr.OGRERR_NONE, \ 'CreateFeature failed' # Verify the created feature received the spatial-reference system of the # original, as none was associated with the table unregistered_layer.ResetReading() created_feature = unregistered_layer.GetNextFeature() assert created_feature is not None, 'did not get feature' created_feature_geometry = created_feature.GetGeometryRef() created_spatial_reference = created_feature_geometry.GetSpatialReference() assert ((created_spatial_reference == spatial_reference) or ((created_spatial_reference is not None) and created_spatial_reference.IsSame(spatial_reference, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES'] ))), \ 'created-feature SRS does not match original' # Clean up test_ds.Destroy() feature.Destroy() ############################################################################### # def test_ogr_mssqlspatial_cleanup(): if gdaltest.mssqlspatial_ds is None: pytest.skip() gdaltest.mssqlspatial_ds = None gdaltest.mssqlspatial_ds = ogr.Open(gdaltest.mssqlspatial_dsname, update=1) gdaltest.mssqlspatial_ds.ExecuteSQL('DROP TABLE Unregistered') gdaltest.mssqlspatial_ds.ExecuteSQL('DROP TABLE tpoly') gdaltest.mssqlspatial_ds = None gdalautotest-3.0.4/ogr/ogr_sqlite.py0000755003401500001440000032030313614005365017150 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_sqlite.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test SQLite driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2004, 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 shutil import pytest from osgeo import gdal from osgeo import ogr from osgeo import osr import gdaltest import ogrtest pytestmark = [ pytest.mark.require_driver('SQLite'), ] ############################################################################### # Test if SpatiaLite is available @pytest.fixture(autouse=True, scope='module') def setup(): gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/foo.db', options=['SPATIALITE=YES']) gdaltest.spatialite_version = None if ds is not None: sql_lyr = ds.ExecuteSQL("SELECT spatialite_version()") feat = sql_lyr.GetNextFeature() gdaltest.spatialite_version = feat.GetFieldAsString(0) print('Spatialite : %s' % gdaltest.spatialite_version) ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/foo.db') gdal.PopErrorHandler() @pytest.fixture() def require_spatialite(setup): if gdaltest.spatialite_version is None: pytest.skip('Spatialite not available') return gdaltest.spatialite_version @pytest.fixture(params=['no-spatialite', 'spatialite']) def with_and_without_spatialite(request): if request.param == 'spatialite': return gdaltest.spatialite_version else: return None ############################################################################### # Create a fresh database. def test_ogr_sqlite_1(): gdaltest.sl_ds = None sqlite_dr = ogr.GetDriverByName('SQLite') if sqlite_dr is None: pytest.skip() try: os.remove('tmp/sqlite_test.db') except OSError: pass # 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') gdaltest.sl_ds = sqlite_dr.CreateDataSource('tmp/sqlite_test.db') assert gdaltest.sl_ds is not None ############################################################################### # Create table from data/poly.shp def test_ogr_sqlite_2(): if gdaltest.sl_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.sl_ds.ExecuteSQL('DELLAYER:tpoly') gdal.PopErrorHandler() # Test invalid FORMAT gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.sl_ds.CreateLayer('will_fail', options=['FORMAT=FOO']) gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' # Test creating a layer with an existing name lyr = gdaltest.sl_ds.CreateLayer('a_layer') gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.sl_ds.CreateLayer('a_layer') gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' # Test OVERWRITE=YES lyr = gdaltest.sl_ds.CreateLayer('a_layer', options=['FID=my_fid', 'GEOMETRY_NAME=mygeom', 'OVERWRITE=YES']) assert lyr is not None, 'layer creation should have succeeded' ###################################################### # Create Layer gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('tpoly') ###################################################### # Setup Schema fields = [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('BINCONTENT', ogr.OFTBinary), ('INT64', ogr.OFTInteger64)] ogrtest.quick_create_layer_def(gdaltest.sl_lyr, fields) fld_defn = ogr.FieldDefn('fld_boolean', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) gdaltest.sl_lyr.CreateField(fld_defn) ###################################################### # Reopen database to be sure that the data types are properly read # even if no record are written gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('tpoly') assert gdaltest.sl_lyr.GetGeometryColumn() == 'GEOMETRY' for field_desc in fields: feature_def = gdaltest.sl_lyr.GetLayerDefn() field_defn = feature_def.GetFieldDefn(feature_def.GetFieldIndex(field_desc[0])) if field_defn.GetType() != field_desc[1]: print('Expected type for %s is %s, not %s' % (field_desc[0], field_defn.GetFieldTypeName(field_defn.GetType()), field_defn.GetFieldTypeName(field_desc[1]))) field_defn = feature_def.GetFieldDefn(feature_def.GetFieldIndex('fld_boolean')) assert field_defn.GetType() == ogr.OFTInteger and field_defn.GetSubType() == ogr.OFSTBoolean field_defn = feature_def.GetFieldDefn(feature_def.GetFieldIndex('INT64')) assert field_defn.GetType() == ogr.OFTInteger64 assert gdaltest.sl_ds.GetLayerByName('a_layer').GetGeometryColumn() == 'mygeom' assert gdaltest.sl_ds.GetLayerByName('a_layer').GetFIDColumn() == 'my_fid' ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] gdaltest.sl_lyr.StartTransaction() while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) dst_feat.SetField('int64', 1234567890123) gdaltest.sl_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() gdaltest.sl_lyr.CommitTransaction() ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_sqlite_3(): if gdaltest.sl_ds is None: pytest.skip() assert gdaltest.sl_lyr.GetFeatureCount() == 10 expect = [168, 169, 166, 158, 165] gdaltest.sl_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.sl_lyr, 'eas_id', expect) assert gdaltest.sl_lyr.GetFeatureCount() == 5 gdaltest.sl_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.sl_lyr.GetNextFeature() assert read_feat is not None, 'Did not get as many features as expected.' assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) if read_feat.GetField('int64') != 1234567890123: read_feat.DumpReadable() pytest.fail() gdaltest.poly_feat = None gdaltest.shp_ds = None assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_sqlite_4(): if gdaltest.sl_ds is None: pytest.skip() dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) wkt_list = ['10', '2', '1', '3d_1', '4', '5', '6'] for item in wkt_list: wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new feature. dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) dst_feat.SetFID(-1) gdaltest.sl_lyr.CreateFeature(dst_feat) ###################################################################### # Read back the feature and get the geometry. gdaltest.sl_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.sl_lyr.GetNextFeature() assert feat_read is not None, 'Did not get as many features as expected.' assert ogrtest.check_feature_geometry(feat_read, geom) == 0 ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_sqlite_5(): if gdaltest.sl_ds is None: pytest.skip() expect = [179, 173, 172, 171, 170, 169, 168, 166, 165, 158, None] sql_lyr = gdaltest.sl_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') assert sql_lyr.GetFeatureCount() == 11 tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_sqlite_6(): if gdaltest.sl_ds is None: pytest.skip() sql_lyr = gdaltest.sl_ds.ExecuteSQL("select * from tpoly where prfedea = '2'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['2']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'MULTILINESTRING ((5.00121349 2.99853132,5.00121349 1.99853133),(5.00121349 1.99853133,5.00121349 0.99853133),(3.00121351 1.99853127,5.00121349 1.99853133),(5.00121349 1.99853133,6.00121348 1.99853135))') != 0: tr = 0 gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_sqlite_7(): if gdaltest.sl_ds is None: pytest.skip() gdaltest.sl_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.sl_lyr.SetSpatialFilter(geom) geom.Destroy() assert gdaltest.sl_lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(gdaltest.sl_lyr, 'eas_id', [158]) gdaltest.sl_lyr.SetAttributeFilter('eas_id = 158') assert gdaltest.sl_lyr.GetFeatureCount() == 1 gdaltest.sl_lyr.SetAttributeFilter(None) gdaltest.sl_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Test transactions with rollback. def test_ogr_sqlite_8(): if gdaltest.sl_ds is None: pytest.skip() ###################################################################### # Prepare working feature. dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(10 20)')) dst_feat.SetField('PRFEDEA', 'rollbacktest') ###################################################################### # Create it, but rollback the transaction. gdaltest.sl_lyr.StartTransaction() gdaltest.sl_lyr.CreateFeature(dst_feat) gdaltest.sl_lyr.RollbackTransaction() ###################################################################### # Verify that it is not in the layer. gdaltest.sl_lyr.SetAttributeFilter("PRFEDEA = 'rollbacktest'") feat_read = gdaltest.sl_lyr.GetNextFeature() gdaltest.sl_lyr.SetAttributeFilter(None) assert feat_read is None, 'Unexpectedly got rollbacktest feature.' ###################################################################### # Create it, and commit the transaction. gdaltest.sl_lyr.StartTransaction() gdaltest.sl_lyr.CreateFeature(dst_feat) gdaltest.sl_lyr.CommitTransaction() ###################################################################### # Verify that it is not in the layer. gdaltest.sl_lyr.SetAttributeFilter("PRFEDEA = 'rollbacktest'") feat_read = gdaltest.sl_lyr.GetNextFeature() gdaltest.sl_lyr.SetAttributeFilter(None) assert feat_read is not None, 'Failed to get committed feature.' feat_read.Destroy() dst_feat.Destroy() ############################################################################### # Test SetFeature() def test_ogr_sqlite_9(): if gdaltest.sl_ds is None: pytest.skip() ###################################################################### # Read feature with EAS_ID 158. gdaltest.sl_lyr.SetAttributeFilter("eas_id = 158") feat_read = gdaltest.sl_lyr.GetNextFeature() gdaltest.sl_lyr.SetAttributeFilter(None) assert feat_read is not None, 'did not find eas_id 158!' ###################################################################### # Modify the PRFEDEA value, and reset it. feat_read.SetField('PRFEDEA', 'SetWorked') err = gdaltest.sl_lyr.SetFeature(feat_read) assert err == 0, ('SetFeature() reported error %d' % err) ###################################################################### # Read feature with EAS_ID 158 and check that PRFEDEA was altered. gdaltest.sl_lyr.SetAttributeFilter("eas_id = 158") feat_read_2 = gdaltest.sl_lyr.GetNextFeature() gdaltest.sl_lyr.SetAttributeFilter(None) assert feat_read_2 is not None, 'did not find eas_id 158!' if feat_read_2.GetField('PRFEDEA') != 'SetWorked': feat_read_2.DumpReadable() pytest.fail('PRFEDEA apparently not reset as expected.') # Test updating non-existing feature feat_read.SetFID(-10) assert gdaltest.sl_lyr.SetFeature(feat_read) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of SetFeature().' # Test deleting non-existing feature assert gdaltest.sl_lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of DeleteFeature().' feat_read.Destroy() feat_read_2.Destroy() ############################################################################### # Test GetFeature() def test_ogr_sqlite_10(): if gdaltest.sl_ds is None: pytest.skip() ###################################################################### # Read feature with EAS_ID 158. gdaltest.sl_lyr.SetAttributeFilter("eas_id = 158") feat_read = gdaltest.sl_lyr.GetNextFeature() gdaltest.sl_lyr.SetAttributeFilter(None) assert feat_read is not None, 'did not find eas_id 158!' ###################################################################### # Now read the feature by FID. feat_read_2 = gdaltest.sl_lyr.GetFeature(feat_read.GetFID()) assert feat_read_2 is not None, ('did not find FID %d' % feat_read.GetFID()) if feat_read_2.GetField('PRFEDEA') != feat_read.GetField('PRFEDEA'): feat_read.DumpReadable() feat_read_2.DumpReadable() pytest.fail('GetFeature() result seems to not match expected.') ############################################################################### # Test FORMAT=WKB creation option def test_ogr_sqlite_11(): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Create Layer with WKB geometry gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('geomwkb', options=['FORMAT=WKB']) geom = ogr.CreateGeometryFromWkt('POINT(0 1)') dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdaltest.sl_lyr.CreateFeature(dst_feat) dst_feat = None # Test adding a column to see if geometry is preserved (#3471) gdaltest.sl_lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('geomwkb') feat_read = gdaltest.sl_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 gdaltest.sl_lyr.ResetReading() ############################################################################### # Test FORMAT=WKT creation option def test_ogr_sqlite_12(): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Create Layer with WKT geometry gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('geomwkt', options=['FORMAT=WKT']) geom = ogr.CreateGeometryFromWkt('POINT(0 1)') dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdaltest.sl_lyr.CreateFeature(dst_feat) dst_feat = None # Test adding a column to see if geometry is preserved (#3471) gdaltest.sl_lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('geomwkt') feat_read = gdaltest.sl_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 feat_read = None gdaltest.sl_lyr.ResetReading() sql_lyr = gdaltest.sl_ds.ExecuteSQL("select * from geomwkt") feat_read = sql_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 feat_read = None feat_read = sql_lyr.GetFeature(0) assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 feat_read = None gdaltest.sl_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test SRID support def test_ogr_sqlite_13(): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Create Layer with EPSG:4326 srs = osr.SpatialReference() srs.ImportFromEPSG(4326) gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('wgs84layer', srs=srs) ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('wgs84layer') assert gdaltest.sl_lyr.GetSpatialRef().IsSame(srs, options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), 'SRS is not the one expected.' ###################################################### # Create second layer with very approximative EPSG:4326 srs = osr.SpatialReference() srs.SetFromUserInput('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]') gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('wgs84layer_approx', srs=srs) # Must still be 1 sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT COUNT(*) AS count FROM spatial_ref_sys") feat = sql_lyr.GetNextFeature() assert feat.GetFieldAsInteger('count') == 1 gdaltest.sl_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test all column types def test_ogr_sqlite_14(): if gdaltest.sl_ds is None: pytest.skip() gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('testtypes') ogrtest.quick_create_layer_def(gdaltest.sl_lyr, [('INTEGER', ogr.OFTInteger), ('FLOAT', ogr.OFTReal), ('STRING', ogr.OFTString), ('BLOB', ogr.OFTBinary), ('BLOB2', ogr.OFTBinary)]) dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) dst_feat.SetField('INTEGER', 1) dst_feat.SetField('FLOAT', 1.2) dst_feat.SetField('STRING', 'myString\'a') dst_feat.SetFieldBinaryFromHexString('BLOB', '0001FF') gdaltest.sl_lyr.CreateFeature(dst_feat) ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('testtypes') # Duplicate the first record dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) feat_read = gdaltest.sl_lyr.GetNextFeature() dst_feat.SetFrom(feat_read) gdaltest.sl_lyr.CreateFeature(dst_feat) # Check the 2 records gdaltest.sl_lyr.ResetReading() for _ in range(2): feat_read = gdaltest.sl_lyr.GetNextFeature() assert (feat_read.GetField('INTEGER') == 1 and \ feat_read.GetField('FLOAT') == 1.2 and \ feat_read.GetField('STRING') == 'myString\'a' and \ feat_read.GetFieldAsString('BLOB') == '0001FF') gdaltest.sl_lyr.ResetReading() ############################################################################### # Test FORMAT=SPATIALITE layer creation option def test_ogr_sqlite_15(): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Create Layer with SPATIALITE geometry with gdaltest.error_handler(): gdaltest.sl_lyr = gdaltest.sl_ds.CreateLayer('geomspatialite', options=['FORMAT=SPATIALITE']) geoms = [ogr.CreateGeometryFromWkt('POINT(0 1)'), ogr.CreateGeometryFromWkt('MULTIPOINT EMPTY'), ogr.CreateGeometryFromWkt('MULTIPOINT (0 1,2 3)'), ogr.CreateGeometryFromWkt('LINESTRING EMPTY'), ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)'), ogr.CreateGeometryFromWkt('MULTILINESTRING EMPTY'), ogr.CreateGeometryFromWkt('MULTILINESTRING ((1 2,3 4),(5 6,7 8))'), ogr.CreateGeometryFromWkt('POLYGON EMPTY'), ogr.CreateGeometryFromWkt('POLYGON ((1 2,3 4))'), ogr.CreateGeometryFromWkt('POLYGON ((1 2,3 4),(5 6,7 8))'), ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY'), ogr.CreateGeometryFromWkt('MULTIPOLYGON (((1 2,3 4)),((5 6,7 8)))'), ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION EMPTY'), ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POLYGON ((1 2,3 4)),POLYGON ((5 6,7 8)))'), ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POLYGON ((1 2,3 4)),POINT(0 1))')] gdaltest.sl_lyr.StartTransaction() for geom in geoms: dst_feat = ogr.Feature(feature_def=gdaltest.sl_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdaltest.sl_lyr.CreateFeature(dst_feat) gdaltest.sl_lyr.CommitTransaction() ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db') # Test creating a layer on a read-only DB gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.sl_ds.CreateLayer('will_fail') gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('geomspatialite') for geom in geoms: feat_read = gdaltest.sl_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 gdaltest.sl_lyr.ResetReading() sql_lyr = gdaltest.sl_ds.ExecuteSQL("select * from geomspatialite") feat_read = sql_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geoms[0], max_error=0.001) == 0 feat_read = sql_lyr.GetFeature(0) assert ogrtest.check_feature_geometry(feat_read, geoms[0], max_error=0.001) == 0 gdaltest.sl_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test reading geometries in FGF (FDO Geometry Format) binary representation. def test_ogr_sqlite_16(): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Reopen DB in update gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) # Hand create a table with FGF geometry gdaltest.sl_ds.ExecuteSQL("INSERT INTO geometry_columns (f_table_name, f_geometry_column, geometry_type, coord_dimension, geometry_format) VALUES ('fgf_table', 'GEOMETRY', 0, 2, 'FGF')") gdaltest.sl_ds.ExecuteSQL("CREATE TABLE fgf_table (OGC_FID INTEGER PRIMARY KEY, GEOMETRY BLOB)") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (1, X'0100000000000000000000000000F03F0000000000000040')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (2, X'020000000000000000000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (3, X'020000000000000002000000000000000000F03F000000000000004000000000000008400000000000001040')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (4, X'030000000000000000000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (5, X'03000000000000000200000002000000000000000000F03F00000000000000400000000000000840000000000000104000000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (6, X'0700000000000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (7, X'070000000200000003000000000000000200000002000000000000000000F03F0000000000000040000000000000084000000000000010400000000003000000000000000200000002000000000000000000F03F00000000000000400000000000000840000000000000104000000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (8, X'0100000001000000000000000000F03F00000000000000400000000000000840')") # invalid geometries gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (9, X'0700000001000000')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (10,X'060000000100000001')") gdaltest.sl_ds.ExecuteSQL("INSERT INTO fgf_table (OGC_FID, GEOMETRY) VALUES (11,X'06000000010000000100000000000000000000000000F03F0000000000000040')") ###################################################### # Reopen DB gdaltest.sl_ds = None gdaltest.sl_ds = ogr.Open('tmp/sqlite_test.db', update=1) gdaltest.sl_lyr = gdaltest.sl_ds.GetLayerByName('fgf_table') feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (1 2)' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'LINESTRING EMPTY' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'LINESTRING (1 2,3 4)' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POLYGON EMPTY' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POLYGON ((1 2,3 4))' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'GEOMETRYCOLLECTION EMPTY' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'GEOMETRYCOLLECTION (POLYGON ((1 2,3 4)),POLYGON ((1 2,3 4)))' feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'POINT (1 2 3)' # Test invalid geometries for _ in range(3): feat = gdaltest.sl_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom is None gdaltest.sl_lyr.ResetReading() ############################################################################### # Test SPATIALITE dataset creation option def test_ogr_sqlite_17(require_spatialite): if gdaltest.sl_ds is None: pytest.skip() ###################################################### # Create dataset with SPATIALITE geometry with gdaltest.error_handler(): ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/spatialite_test.db', options=['SPATIALITE=YES']) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('will_fail', options=['FORMAT=WKB']) gdal.PopErrorHandler() assert lyr is None, 'layer creation should have failed' srs = osr.SpatialReference() srs.SetFromUserInput("""GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]""") lyr = ds.CreateLayer('geomspatialite', srs=srs) geom = ogr.CreateGeometryFromWkt('POINT(0 1)') dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) lyr.CreateFeature(dst_feat) ###################################################### # Reopen DB ds = None ds = ogr.Open('tmp/spatialite_test.db') lyr = ds.GetLayerByName('geomspatialite') feat_read = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom, max_error=0.001) == 0 srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('4326') != -1, 'did not identify correctly SRS' ############################################################################### # Create a layer with a non EPSG SRS into a SPATIALITE DB (#3506) def test_ogr_sqlite_18(require_spatialite): if gdaltest.sl_ds is None: pytest.skip() ds = ogr.Open('tmp/spatialite_test.db', update=1) srs = osr.SpatialReference() srs.SetFromUserInput('+proj=vandg') lyr = ds.CreateLayer('nonepsgsrs', srs=srs) ###################################################### # Reopen DB ds = None ds = ogr.Open('tmp/spatialite_test.db') lyr = ds.GetLayerByName('nonepsgsrs') srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('VanDerGrinten') != -1, 'did not identify correctly SRS' sql_lyr = ds.ExecuteSQL("SELECT * FROM spatial_ref_sys ORDER BY srid DESC LIMIT 1") feat = sql_lyr.GetNextFeature() if feat.GetField('auth_name') != 'OGR' or \ feat.GetField('proj4text').find('+proj=vandg') != 0: feat.DumpReadable() pytest.fail() gdaltest.sl_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Create a SpatiaLite DB with INIT_WITH_EPSG=YES def test_ogr_sqlite_19(require_spatialite): if gdaltest.sl_ds is None: pytest.skip() if int(gdal.VersionInfo('VERSION_NUM')) < 1800: pytest.skip() if require_spatialite != '2.3.1': pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/spatialite_test_with_epsg.db', options=['SPATIALITE=YES', 'INIT_WITH_EPSG=YES']) # EPSG:26632 has a ' character in it's WKT representation srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:26632') ds.CreateLayer('test', srs=srs) ds = None ds = ogr.Open('tmp/spatialite_test_with_epsg.db') sql_lyr = ds.ExecuteSQL("select count(*) from spatial_ref_sys") feat = sql_lyr.GetNextFeature() nb_srs = feat.GetFieldAsInteger(0) ds.ReleaseResultSet(sql_lyr) # Currently the injection of the EPSG DB as proj.4 strings adds 3915 entries assert nb_srs >= 3915, 'did not get expected SRS count' ############################################################################### # Create a SpatiaLite DB with INIT_WITH_EPSG=NO def test_ogr_sqlite_19_bis(require_spatialite): if gdaltest.sl_ds is None: pytest.skip() spatialite_major_ver = int(require_spatialite.split('.')[0]) if spatialite_major_ver < 4: pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/spatialite_test_without_epsg.db', options=['SPATIALITE=YES', 'INIT_WITH_EPSG=NO']) # EPSG:26632 has a ' character in it's WKT representation srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:26632') ds.CreateLayer('test', srs=srs) ds = None ds = ogr.Open('/vsimem/spatialite_test_without_epsg.db') sql_lyr = ds.ExecuteSQL("select count(*) from spatial_ref_sys") feat = sql_lyr.GetNextFeature() nb_srs = feat.GetFieldAsInteger(0) ds.ReleaseResultSet(sql_lyr) assert nb_srs == 1, 'did not get expected SRS count' gdal.Unlink('/vsimem/spatialite_test_without_epsg.db') ############################################################################### # Create a regular DB with INIT_WITH_EPSG=YES def test_ogr_sqlite_20(): if gdaltest.sl_ds is None: pytest.skip() gdal.Unlink('tmp/non_spatialite_test_with_epsg.db') ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/non_spatialite_test_with_epsg.db', options=['INIT_WITH_EPSG=YES']) # EPSG:26632 has a ' character in it's WKT representation srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:26632') ds.CreateLayer('test', srs=srs) ds = None ds = ogr.Open('tmp/non_spatialite_test_with_epsg.db') sql_lyr = ds.ExecuteSQL("select count(*) from spatial_ref_sys") feat = sql_lyr.GetNextFeature() nb_srs = feat.GetFieldAsInteger(0) ds.ReleaseResultSet(sql_lyr) # Currently the injection of the EPSG DB as proj.4 strings adds 3945 entries assert nb_srs >= 3945, 'did not get expected SRS count' ############################################################################### # Test CopyLayer() from a table layer (#3617) def test_ogr_sqlite_21(): if gdaltest.sl_ds is None: pytest.skip() src_lyr = gdaltest.sl_ds.GetLayerByName('tpoly') copy_lyr = gdaltest.sl_ds.CopyLayer(src_lyr, 'tpoly_2') src_lyr_count = src_lyr.GetFeatureCount() copy_lyr_count = copy_lyr.GetFeatureCount() assert src_lyr_count == copy_lyr_count, 'did not get same number of features' ############################################################################### # Test CopyLayer() from a result layer (#3617) def test_ogr_sqlite_22(): if gdaltest.sl_ds is None: pytest.skip() src_lyr = gdaltest.sl_ds.ExecuteSQL('select * from tpoly') copy_lyr = gdaltest.sl_ds.CopyLayer(src_lyr, 'tpoly_3') src_lyr_count = src_lyr.GetFeatureCount() copy_lyr_count = copy_lyr.GetFeatureCount() assert src_lyr_count == copy_lyr_count, 'did not get same number of features' gdaltest.sl_ds.ReleaseResultSet(src_lyr) ############################################################################### # Test ignored fields works ok def test_ogr_sqlite_23(): if gdaltest.sl_ds is None: pytest.skip() shp_layer = gdaltest.sl_ds.GetLayerByName('tpoly') shp_layer.SetIgnoredFields(['AREA']) feat = shp_layer.GetNextFeature() assert not feat.IsFieldSet('AREA'), 'got area despite request to ignore it.' assert feat.GetFieldAsInteger('EAS_ID') == 168, 'missing or wrong eas_id' wkt = 'POLYGON ((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))' assert (ogrtest.check_feature_geometry(feat, wkt, max_error=0.00000001) == 0) fd = shp_layer.GetLayerDefn() fld = fd.GetFieldDefn(0) # area assert fld.IsIgnored(), 'AREA unexpectedly not marked as ignored.' fld = fd.GetFieldDefn(1) # eas_id assert not fld.IsIgnored(), 'EASI unexpectedly marked as ignored.' assert not fd.IsGeometryIgnored(), 'geometry unexpectedly ignored.' assert not fd.IsStyleIgnored(), 'style unexpectedly ignored.' fd.SetGeometryIgnored(1) assert fd.IsGeometryIgnored(), 'geometry unexpectedly not ignored.' feat = shp_layer.GetNextFeature() assert feat.GetGeometryRef() is None, 'Unexpectedly got a geometry on feature 2.' assert not feat.IsFieldSet('AREA'), 'got area despite request to ignore it.' assert feat.GetFieldAsInteger('EAS_ID') == 179, 'missing or wrong eas_id' ############################################################################### # Test that ExecuteSQL() with OGRSQL dialect doesn't forward the where clause to sqlite (#4022) def test_ogr_sqlite_24(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/test24.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/test24.sqlite') lyr = ds.CreateLayer('test') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2 3)')) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((4 5,6 7))')) lyr.CreateFeature(feat) ds = None ds = ogr.Open('tmp/test24.sqlite') gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.ExecuteSQL('select OGR_GEOMETRY from test') gdal.PopErrorHandler() if lyr is not None: ds.ReleaseResultSet(lyr) pytest.fail('this should not work (1)') lyr = ds.ExecuteSQL('select * from test') lyr.SetAttributeFilter("OGR_GEOMETRY = 'POLYGON'") feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) assert feat is not None, 'a feature was expected (2)' lyr = ds.GetLayerByName('test') lyr.SetAttributeFilter("OGR_GEOMETRY = 'POLYGON'") gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert feat is None, 'a feature was not expected (3)' lyr = ds.ExecuteSQL('select OGR_GEOMETRY from test', dialect='OGRSQL') lyr.SetAttributeFilter("OGR_GEOMETRY = 'POLYGON'") feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) assert feat is not None, 'a feature was expected (4)' lyr = ds.ExecuteSQL("select OGR_GEOMETRY from test WHERE OGR_GEOMETRY = 'POLYGON'", dialect='OGRSQL') feat = lyr.GetNextFeature() ds.ReleaseResultSet(lyr) assert feat is not None, 'a feature was expected (5)' ds = None ############################################################################### # Test opening a /vsicurl/ DB def test_ogr_sqlite_25(): if gdaltest.sl_ds is None: pytest.skip() sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT sqlite_version()") feat = sql_lyr.GetNextFeature() ogrtest.sqlite_version = feat.GetFieldAsString(0) print('SQLite version : %s' % ogrtest.sqlite_version) feat = None gdaltest.sl_ds.ReleaseResultSet(sql_lyr) drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() # Check that we have SQLite VFS support gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_sqlite_25.db') gdal.PopErrorHandler() if ds is None: pytest.skip() ds = None gdal.Unlink('/vsimem/ogr_sqlite_25.db') gdal.SetConfigOption('GDAL_HTTP_TIMEOUT', '5') ds = ogr.Open('/vsicurl/http://download.osgeo.org/gdal/data/sqlite3/polygon.db') gdal.SetConfigOption('GDAL_HTTP_TIMEOUT', None) if ds is None: if gdaltest.gdalurlopen('http://download.osgeo.org/gdal/data/sqlite3/polygon.db', timeout=4) is None: pytest.skip('cannot open URL') pytest.fail() lyr = ds.GetLayerByName('polygon') assert lyr is not None assert lyr.GetLayerDefn().GetFieldCount() != 0 ############################################################################### # Test creating a :memory: DB def test_ogr_sqlite_26(): if gdaltest.sl_ds is None: pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource(':memory:') sql_lyr = ds.ExecuteSQL('select count(*) from geometry_columns') assert sql_lyr is not None, 'expected existing geometry_columns' count = sql_lyr.GetFeatureCount() ds.ReleaseResultSet(sql_lyr) ds = None assert count == 1, 'expected existing geometry_columns' ############################################################################### # Run test_ogrsf def test_ogr_sqlite_27(): if gdaltest.sl_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_ogr2ogr_path() is None: pytest.skip() if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() gdaltest.runexternal(test_cli_utilities.get_ogr2ogr_path() + ' -f SQLite tmp/ogr_sqlite_27.sqlite data/poly.shp --config OGR_SQLITE_SYNCHRONOUS OFF') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/ogr_sqlite_27.sqlite') pos = ret.find('ERROR: poLayerFeatSRS != NULL && poSQLFeatSRS == NULL.') if pos != -1: # Detect if libsqlite3 has been built with SQLITE_HAS_COLUMN_METADATA # If not, that explains the error. ds = ogr.Open(':memory:') sql_lyr = ds.ExecuteSQL('SQLITE_HAS_COLUMN_METADATA()') feat = sql_lyr.GetNextFeature() val = feat.GetField(0) ds.ReleaseResultSet(sql_lyr) if val == 0: ret = ret[0:pos] + ret[pos + len('ERROR: poLayerFeatSRS != NULL && poSQLFeatSRS == NULL.'):] # And remove ERROR ret code consequently pos = ret.find('ERROR ret code = 1') if pos != -1: ret = ret[0:pos] assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Test on a result SQL layer ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro tmp/ogr_sqlite_27.sqlite -sql "SELECT * FROM poly"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run test_ogrsf on a spatialite enabled DB def test_ogr_sqlite_28(): if gdaltest.sl_ds is None: pytest.skip() import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() # Test with a Spatialite 3.0 DB shutil.copy('data/poly_spatialite.sqlite', 'tmp/poly_spatialite.sqlite') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/poly_spatialite.sqlite') os.unlink('tmp/poly_spatialite.sqlite') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Test on a result SQL layer ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -ro data/poly_spatialite.sqlite -sql "SELECT * FROM poly"') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Test with a Spatialite 4.0 DB shutil.copy('data/poly_spatialite4.sqlite', 'tmp/poly_spatialite4.sqlite') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/poly_spatialite4.sqlite') os.unlink('tmp/poly_spatialite4.sqlite') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 # Generic test ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -driver SQLite -dsco SPATIALITE=YES') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test CreateFeature() with empty feature def test_ogr_sqlite_29(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_29.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_29.sqlite') lyr = ds.CreateLayer('test') feat = ogr.Feature(lyr.GetLayerDefn()) assert lyr.CreateFeature(feat) == 0 ds = None ############################################################################### # Test ExecuteSQL() with empty result set (#4684) def test_ogr_sqlite_30(): if gdaltest.sl_ds is None: pytest.skip() sql_lyr = gdaltest.sl_ds.ExecuteSQL('SELECT * FROM tpoly WHERE eas_id = 12345') if sql_lyr is None: pytest.skip() # Test fix added in r24768 feat = sql_lyr.GetNextFeature() assert feat is None gdaltest.sl_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test spatial filter when SpatiaLite is available def test_ogr_spatialite_2(require_spatialite): ds = ogr.Open('tmp/spatialite_test.db', update=1) srs = osr.SpatialReference() srs.SetFromUserInput('EPSG:4326') lyr = ds.CreateLayer('test_spatialfilter', srs=srs) lyr.CreateField(ogr.FieldDefn('intcol', ogr.OFTInteger)) lyr.StartTransaction() for i in range(10): for j in range(10): geom = ogr.CreateGeometryFromWkt('POINT(%d %d)' % (i, j)) dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) lyr.CreateFeature(dst_feat) dst_feat.Destroy() geom = ogr.CreateGeometryFromWkt('POLYGON((0 0,0 3,3 3,3 0,0 0))') dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) lyr.CreateFeature(dst_feat) dst_feat.Destroy() lyr.CommitTransaction() ds = None # Test OLCFastFeatureCount with spatial index (created by default) ds = ogr.Open('tmp/spatialite_test.db', update=0) lyr = ds.GetLayerByName('test_spatialfilter') extent = lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' # Test caching extent = lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' geom = ogr.CreateGeometryFromWkt( 'POLYGON((2 2,2 8,8 8,8 2,2 2))') lyr.SetSpatialFilter(geom) assert lyr.TestCapability(ogr.OLCFastFeatureCount) is not False, \ 'OLCFastFeatureCount failed' assert lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' assert lyr.GetFeatureCount() == 50, 'did not get expected feature count' # Test spatial filter with a SQL result layer without WHERE clause sql_lyr = ds.ExecuteSQL("SELECT * FROM 'test_spatialfilter'") extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' # Test caching extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' sql_lyr.SetSpatialFilter(geom) assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' assert sql_lyr.GetFeatureCount() == 50, 'did not get expected feature count' ds.ReleaseResultSet(sql_lyr) # Test spatial filter with a SQL result layer with WHERE clause sql_lyr = ds.ExecuteSQL('SELECT * FROM test_spatialfilter WHERE 1=1') assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' sql_lyr.SetSpatialFilter(geom) assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' assert sql_lyr.GetFeatureCount() == 50, 'did not get expected feature count' ds.ReleaseResultSet(sql_lyr) # Test spatial filter with a SQL result layer with ORDER BY clause sql_lyr = ds.ExecuteSQL('SELECT * FROM test_spatialfilter ORDER BY intcol') extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' # Test caching extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' sql_lyr.SetSpatialFilter(geom) assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' assert sql_lyr.GetFeatureCount() == 50, 'did not get expected feature count' ds.ReleaseResultSet(sql_lyr) # Test spatial filter with a SQL result layer with WHERE and ORDER BY clause sql_lyr = ds.ExecuteSQL('SELECT * FROM test_spatialfilter WHERE 1 = 1 ORDER BY intcol') extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' # Test caching extent = sql_lyr.GetExtent() assert extent == (0.0, 9.0, 0.0, 9.0), 'got bad extent' assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' sql_lyr.SetSpatialFilter(geom) assert sql_lyr.TestCapability(ogr.OLCFastSpatialFilter) is not False, \ 'OLCFastSpatialFilter failed' assert sql_lyr.GetFeatureCount() == 50, 'did not get expected feature count' ds.ReleaseResultSet(sql_lyr) # Remove spatial index ds = None ds = ogr.Open('tmp/spatialite_test.db', update=1) sql_lyr = ds.ExecuteSQL("SELECT DisableSpatialIndex('test_spatialfilter', 'Geometry')") sql_lyr.GetFeatureCount() feat = sql_lyr.GetNextFeature() ret = feat.GetFieldAsInteger(0) ds.ReleaseResultSet(sql_lyr) assert ret == 1, 'DisableSpatialIndex failed' ds.ExecuteSQL("VACUUM") ds.Destroy() # Test OLCFastFeatureCount without spatial index ds = ogr.Open('tmp/spatialite_test.db') lyr = ds.GetLayerByName('test_spatialfilter') geom = ogr.CreateGeometryFromWkt( 'POLYGON((2 2,2 8,8 8,8 2,2 2))') lyr.SetSpatialFilter(geom) geom.Destroy() assert lyr.TestCapability(ogr.OLCFastFeatureCount) is not True assert lyr.TestCapability(ogr.OLCFastSpatialFilter) is not True assert lyr.GetFeatureCount() == 50 ds.Destroy() ############################################################################### # Test VirtualShape feature of SpatiaLite def test_ogr_spatialite_3(require_spatialite): ds = ogr.Open('tmp/spatialite_test.db', update=1) ds.ExecuteSQL('CREATE VIRTUAL TABLE testpoly USING VirtualShape(data/testpoly, CP1252, -1)') ds.Destroy() ds = ogr.Open('tmp/spatialite_test.db') lyr = ds.GetLayerByName('testpoly') assert lyr is not None lyr.SetSpatialFilterRect(-400, 22, -120, 400) tr = ogrtest.check_features_against_list(lyr, 'FID', [0, 4, 8]) ds.Destroy() assert tr ############################################################################### # Test updating a spatialite DB (#3471 and #3474) def test_ogr_spatialite_4(require_spatialite): ds = ogr.Open('tmp/spatialite_test.db', update=1) lyr = ds.ExecuteSQL('SELECT * FROM sqlite_master') nb_sqlite_master_objects_before = lyr.GetFeatureCount() ds.ReleaseResultSet(lyr) lyr = ds.ExecuteSQL('SELECT * FROM idx_geomspatialite_GEOMETRY') nb_idx_before = lyr.GetFeatureCount() ds.ReleaseResultSet(lyr) lyr = ds.GetLayerByName('geomspatialite') lyr.CreateField(ogr.FieldDefn("foo", ogr.OFTString)) lyr = ds.ExecuteSQL('SELECT * FROM geomspatialite') feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom is not None and geom.ExportToWkt() == 'POINT (0 1)' feat.Destroy() ds.ReleaseResultSet(lyr) # Check that triggers and index are restored (#3474) lyr = ds.ExecuteSQL('SELECT * FROM sqlite_master') nb_sqlite_master_objects_after = lyr.GetFeatureCount() ds.ReleaseResultSet(lyr) assert nb_sqlite_master_objects_before == nb_sqlite_master_objects_after, \ ('nb_sqlite_master_objects_before=%d, nb_sqlite_master_objects_after=%d' % (nb_sqlite_master_objects_before, nb_sqlite_master_objects_after)) # Add new feature lyr = ds.GetLayerByName('geomspatialite') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(100 -100)')) lyr.CreateFeature(feat) feat.Destroy() # Check that the trigger is functional (#3474). lyr = ds.ExecuteSQL('SELECT * FROM idx_geomspatialite_GEOMETRY') nb_idx_after = lyr.GetFeatureCount() ds.ReleaseResultSet(lyr) assert nb_idx_before + 1 == nb_idx_after, \ ('nb_idx_before=%d, nb_idx_after=%d' % (nb_idx_before, nb_idx_after)) ############################################################################### # Test writing and reading back spatialite geometries (#4092) # Test writing and reading back spatialite geometries in compressed form @pytest.mark.parametrize( 'bUseComprGeom', [False, True], ids=['dont-compress-geometries', 'compress-geometries'] ) def test_ogr_spatialite_5(require_spatialite, bUseComprGeom): if bUseComprGeom and require_spatialite == '2.3.1': pytest.skip() try: os.remove('tmp/ogr_spatialite_5.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_spatialite_5.sqlite', options=['SPATIALITE=YES']) geometries = [ # 'POINT EMPTY', 'POINT (1 2)', 'POINT Z (1 2 3)', 'POINT M (1 2 3)', 'POINT ZM (1 2 3 4)', 'LINESTRING EMPTY', 'LINESTRING (1 2)', 'LINESTRING (1 2,3 4)', 'LINESTRING (1 2,3 4,5 6)', 'LINESTRING Z (1 2 3,4 5 6)', 'LINESTRING Z (1 2 3,4 5 6,7 8 9)', 'LINESTRING M (1 2 3,4 5 6)', 'LINESTRING M (1 2 3,4 5 6,7 8 9)', 'LINESTRING ZM (1 2 3 4,5 6 7 8)', 'LINESTRING ZM (1 2 3 4,5 6 7 8,9 10 11 12)', 'POLYGON EMPTY', 'POLYGON ((1 2,1 3,2 3,2 2,1 2))', 'POLYGON Z ((1 2 10,1 3 -10,2 3 20,2 2 -20,1 2 10))', 'POLYGON M ((1 2 10,1 3 -10,2 3 20,2 2 -20,1 2 10))', 'POLYGON ZM ((1 2 10 20,1 3 -10 -20,2 3 20 30,2 2 -20 -30,1 2 10 20))', 'POLYGON ((1 2,1 3,2 3,2 2,1 2),(1.25 2.25,1.25 2.75,1.75 2.75,1.75 2.25,1.25 2.25))', 'MULTIPOINT EMPTY', 'MULTIPOINT ((1 2),(3 4))', 'MULTIPOINT Z ((1 2 3),(4 5 6))', 'MULTIPOINT M ((1 2 3),(4 5 6))', 'MULTIPOINT ZM ((1 2 3 4),(5 6 7 8))', 'MULTILINESTRING EMPTY', 'MULTILINESTRING ((1 2,3 4),(5 6,7 8))', 'MULTILINESTRING Z ((1 2 3,4 5 6),(7 8 9,10 11 12))', 'MULTILINESTRING M ((1 2 3,4 5 6),(7 8 9,10 11 12))', 'MULTILINESTRING ZM ((1 2 3 4,5 6 7 8),(9 10 11 12,13 14 15 16))', 'MULTIPOLYGON EMPTY', 'MULTIPOLYGON (((1 2,1 3,2 3,2 2,1 2)),((-1 -2,-1 -3,-2 -3,-2 -2,-1 -2)))', 'MULTIPOLYGON (((1 2,1 3,2 3,2 2,1 2),(1.25 2.25,1.25 2.75,1.75 2.75,1.75 2.25,1.25 2.25)),((-1 -2,-1 -3,-2 -3,-2 -2,-1 -2)))', 'MULTIPOLYGON Z (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2 0,-1 -3 0,-2 -3 0,-2 -2 0,-1 -2 0)))', 'MULTIPOLYGON M (((1 2 -4,1 3 -3,2 3 -3,2 2 -3,1 2 -6)),((-1 -2 0,-1 -3 0,-2 -3 0,-2 -2 0,-1 -2 0)))', 'MULTIPOLYGON ZM (((1 2 -4 -40,1 3 -3 -30,2 3 -3 -30,2 2 -3 30,1 2 -6 -60)),((-1 -2 0 0,-1 -3 0 0,-2 -3 0 0,-2 -2 0 0,-1 -2 0 0)))', 'GEOMETRYCOLLECTION EMPTY', # 'GEOMETRYCOLLECTION (GEOMETRYCOLLECTION EMPTY)', 'GEOMETRYCOLLECTION (POINT (1 2))', 'GEOMETRYCOLLECTION Z (POINT Z (1 2 3))', 'GEOMETRYCOLLECTION M (POINT M (1 2 3))', 'GEOMETRYCOLLECTION ZM (POINT ZM (1 2 3 4))', 'GEOMETRYCOLLECTION (LINESTRING (1 2,3 4))', 'GEOMETRYCOLLECTION Z (LINESTRING Z (1 2 3,4 5 6))', 'GEOMETRYCOLLECTION (POLYGON ((1 2,1 3,2 3,2 2,1 2)))', 'GEOMETRYCOLLECTION Z (POLYGON Z ((1 2 10,1 3 -10,2 3 20,2 2 -20,1 2 10)))', 'GEOMETRYCOLLECTION (POINT (1 2),LINESTRING (1 2,3 4),POLYGON ((1 2,1 3,2 3,2 2,1 2)))', 'GEOMETRYCOLLECTION Z (POINT Z (1 2 3),LINESTRING Z (1 2 3,4 5 6),POLYGON Z ((1 2 10,1 3 -10,2 3 20,2 2 -20,1 2 10)))', ] srs = osr.SpatialReference() srs.ImportFromEPSG(4326) num_layer = 0 for wkt in geometries: # print(wkt) geom = ogr.CreateGeometryFromWkt(wkt) if bUseComprGeom: options = ['COMPRESS_GEOM=YES'] else: options = [] lyr = ds.CreateLayer('test%d' % num_layer, geom_type=geom.GetGeometryType(), srs=srs, options=options) feat = ogr.Feature(lyr.GetLayerDefn()) # print(geom) feat.SetGeometry(geom) lyr.CreateFeature(feat) num_layer = num_layer + 1 ds = None ds = ogr.Open('tmp/ogr_spatialite_5.sqlite') num_layer = 0 for wkt in geometries: geom = ogr.CreateGeometryFromWkt(wkt) lyr = ds.GetLayer(num_layer) assert lyr.GetGeomType() == geom.GetGeometryType() feat = lyr.GetNextFeature() got_wkt = feat.GetGeometryRef().ExportToIsoWkt() # Spatialite < 2.4 only supports 2D geometries if gdaltest.spatialite_version == '2.3.1' and (geom.GetGeometryType() & ogr.wkb25DBit) != 0: geom.SetCoordinateDimension(2) expected_wkt = geom.ExportToIsoWkt() assert got_wkt == expected_wkt elif got_wkt != wkt: pytest.fail('got %s, expected %s' % (got_wkt, wkt)) num_layer = num_layer + 1 if bUseComprGeom: num_layer = 0 for wkt in geometries: if wkt.find('EMPTY') == -1 and wkt.find('POINT') == -1: sql_lyr = ds.ExecuteSQL("SELECT GEOMETRY == CompressGeometry(GEOMETRY) FROM test%d" % num_layer) feat = sql_lyr.GetNextFeature() val = feat.GetFieldAsInteger(0) if wkt != 'LINESTRING (1 2)': if val != 1: print(wkt) print(val) ds.ReleaseResultSet(sql_lyr) pytest.fail('did not get expected compressed geometry') else: if val != 0: print(val) ds.ReleaseResultSet(sql_lyr) pytest.fail(wkt) feat = None ds.ReleaseResultSet(sql_lyr) num_layer = num_layer + 1 ds = None ############################################################################### # Test spatialite spatial views def test_ogr_spatialite_6(require_spatialite): if gdaltest.spatialite_version.startswith('2.3'): pytest.skip() try: os.remove('tmp/ogr_spatialite_6.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_spatialite_6.sqlite', options=['SPATIALITE=YES']) if int(gdaltest.spatialite_version[0:gdaltest.spatialite_version.find('.')]) >= 4: layername = 'regular_layer' layername_single = 'regular_layer' viewname = 'view_of_regular_layer' viewname_single = 'view_of_regular_layer' thegeom_single = 'the_geom' pkid_single = 'pk_id' else: layername = 'regular_\'layer' layername_single = 'regular_\'\'layer' viewname = 'view_of_\'regular_layer' viewname_single = 'view_of_\'\'regular_layer' thegeom_single = 'the_"''geom' pkid_single = 'pk_"''id' # Create regular layer srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer(layername, geom_type=ogr.wkbPoint, srs=srs, options=['LAUNDER=NO']) geometryname = lyr.GetGeometryColumn() lyr.CreateField(ogr.FieldDefn("int'col", ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn("realcol", ogr.OFTReal)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 12) feat.SetField(1, 34.56) geom = ogr.CreateGeometryFromWkt('POINT(2 49)') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 12) feat.SetField(1, 34.56) geom = ogr.CreateGeometryFromWkt('POINT(3 50)') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 34) feat.SetField(1, 56.78) geom = ogr.CreateGeometryFromWkt('POINT(-30000 -50000)') feat.SetGeometryDirectly(geom) lyr.CreateFeature(feat) geom = ogr.CreateGeometryFromWkt('POINT(3 50)') feat.SetGeometryDirectly(geom) lyr.SetFeature(feat) # Create spatial view ds.ExecuteSQL("CREATE VIEW \"%s\" AS SELECT OGC_FID AS '%s', %s AS '%s', \"int'col\", realcol FROM \"%s\"" % (viewname, pkid_single, geometryname, thegeom_single, layername)) if int(gdaltest.spatialite_version[0:gdaltest.spatialite_version.find('.')]) >= 4: ds.ExecuteSQL("INSERT INTO views_geometry_columns(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only) VALUES " + "('%s', '%s', '%s', '%s', Lower('%s'), 1)" % (viewname_single, thegeom_single, pkid_single, layername_single, geometryname)) else: ds.ExecuteSQL("INSERT INTO views_geometry_columns(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column) VALUES " + "('%s', '%s', '%s', '%s', '%s')" % (viewname_single, thegeom_single, pkid_single, layername_single, geometryname)) ds = None # Test spatial view ds = ogr.Open('tmp/ogr_spatialite_6.sqlite') lyr = ds.GetLayerByName(layername) view_lyr = ds.GetLayerByName(viewname) assert view_lyr.GetFIDColumn() == pkid_single, view_lyr.GetGeometryColumn() assert view_lyr.GetGeometryColumn() == thegeom_single assert view_lyr.GetLayerDefn().GetFieldDefn(0).GetName() == "int'col" assert view_lyr.GetGeomType() == lyr.GetGeomType() assert view_lyr.GetFeatureCount() == lyr.GetFeatureCount() assert view_lyr.GetSpatialRef().IsSame(lyr.GetSpatialRef()) == 1 feat = view_lyr.GetFeature(3) if feat.GetFieldAsInteger(0) != 34: feat.DumpReadable() pytest.fail() if feat.GetFieldAsDouble(1) != 56.78: feat.DumpReadable() pytest.fail() view_lyr.SetAttributeFilter('"int\'col" = 34') view_lyr.SetSpatialFilterRect(2.5, 49.5, 3.5, 50.5) feat = view_lyr.GetNextFeature() if feat.GetFID() != 3: feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POINT (3 50)': feat.DumpReadable() pytest.fail() ds = None # Remove spatial index ds = ogr.Open('tmp/ogr_spatialite_6.sqlite', update=1) sql_lyr = ds.ExecuteSQL("SELECT DisableSpatialIndex('%s', '%s')" % (layername_single, geometryname)) ds.ReleaseResultSet(sql_lyr) ds.ExecuteSQL("DROP TABLE \"idx_%s_%s\"" % (layername, geometryname)) ds = None # Test spatial view again ds = ogr.Open('tmp/ogr_spatialite_6.sqlite') view_lyr = ds.GetLayerByName(viewname) view_lyr.SetAttributeFilter('"int\'col" = 34') view_lyr.SetSpatialFilterRect(2.5, 49.5, 3.5, 50.5) feat = view_lyr.GetNextFeature() if feat.GetFID() != 3: feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test VirtualShape:xxx.shp def test_ogr_spatialite_7(require_spatialite): ds = ogr.Open('VirtualShape:data/poly.shp') assert ds is not None lyr = ds.GetLayerByName('poly') assert lyr is not None assert lyr.GetGeomType() == ogr.wkbPolygon f = lyr.GetNextFeature() assert f.GetGeometryRef() is not None ############################################################################### # Test tables with multiple geometry columns (#4768) def test_ogr_spatialite_8(require_spatialite): if require_spatialite.startswith('2.3'): pytest.skip() try: os.remove('tmp/ogr_spatialite_8.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_spatialite_8.sqlite', options=['SPATIALITE=YES']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) fld = ogr.GeomFieldDefn('geom1', ogr.wkbPoint) fld.SetSpatialRef(srs) lyr.CreateGeomField(fld) fld = ogr.GeomFieldDefn('geom2', ogr.wkbLineString) fld.SetSpatialRef(srs) lyr.CreateGeomField(fld) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('foo', 'bar') f.SetGeomFieldDirectly(0, ogr.CreateGeometryFromWkt('POINT(0 -1)')) f.SetGeomFieldDirectly(1, ogr.CreateGeometryFromWkt('LINESTRING(0 -1,2 3)')) lyr.CreateFeature(f) lyr.ResetReading() f = lyr.GetNextFeature() if f.GetGeomFieldRef('geom1').ExportToWkt() != 'POINT (0 -1)' or \ f.GetGeomFieldRef('geom2').ExportToWkt() != 'LINESTRING (0 -1,2 3)': f.DumpReadable() pytest.fail() f.SetGeomFieldDirectly(0, ogr.CreateGeometryFromWkt('POINT(0 1)')) f.SetGeomFieldDirectly(1, ogr.CreateGeometryFromWkt('LINESTRING(0 1,2 3)')) lyr.SetFeature(f) f = None ds.ExecuteSQL('CREATE VIEW view_test_geom1 AS SELECT OGC_FID AS pk_id, foo, geom1 AS renamed_geom1 FROM test') if int(gdaltest.spatialite_version[0:gdaltest.spatialite_version.find('.')]) >= 4: readonly_col = ', read_only' readonly_val = ', 1' else: readonly_col = '' readonly_val = '' ds.ExecuteSQL(("INSERT INTO views_geometry_columns(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column%s) VALUES " % readonly_col) + ("('view_test_geom1', 'renamed_geom1', 'pk_id', 'test', 'geom1'%s)" % readonly_val)) ds.ExecuteSQL('CREATE VIEW view_test_geom2 AS SELECT OGC_FID AS pk_id, foo, geom2 AS renamed_geom2 FROM test') ds.ExecuteSQL(("INSERT INTO views_geometry_columns(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column%s) VALUES " % readonly_col) + ("('view_test_geom2', 'renamed_geom2', 'pk_id', 'test', 'geom2'%s)" % readonly_val)) ds = None ds = ogr.Open('tmp/ogr_spatialite_8.sqlite') lyr = ds.GetLayerByName('test(geom1)') view_lyr = ds.GetLayerByName('view_test_geom1') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert view_lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetGeometryColumn() == 'geom1' assert view_lyr.GetGeometryColumn() == 'renamed_geom1' assert lyr.GetGeomType() == ogr.wkbPoint assert view_lyr.GetGeomType() == lyr.GetGeomType() assert view_lyr.GetFeatureCount() == lyr.GetFeatureCount() feat = view_lyr.GetFeature(1) if feat.GetFieldAsString(0) != 'bar': feat.DumpReadable() pytest.fail() feat = None view_lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = view_lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POINT (0 1)': feat.DumpReadable() pytest.fail() feat = None lyr = ds.GetLayerByName('test(geom2)') view_lyr = ds.GetLayerByName('view_test_geom2') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert view_lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetGeometryColumn() == 'geom2' assert view_lyr.GetGeometryColumn() == 'renamed_geom2' assert lyr.GetGeomType() == ogr.wkbLineString assert view_lyr.GetGeomType() == lyr.GetGeomType() assert view_lyr.GetFeatureCount() == lyr.GetFeatureCount() feat = view_lyr.GetFeature(1) if feat.GetFieldAsString(0) != 'bar': feat.DumpReadable() pytest.fail() feat = None view_lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = view_lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (0 1,2 3)': feat.DumpReadable() pytest.fail() feat = None sql_lyr = ds.ExecuteSQL('SELECT foo, geom2 FROM test') sql_lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = sql_lyr.GetNextFeature() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (0 1,2 3)': feat.DumpReadable() pytest.fail() feat = None ds.ReleaseResultSet(sql_lyr) with gdaltest.error_handler(): lyr = ds.GetLayerByName('invalid_layer_name(geom1)') assert lyr is None lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetLayerDefn().GetGeomFieldCount() == 2 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'geom1' assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetName() == 'geom2' assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetType() == ogr.wkbPoint assert lyr.GetLayerDefn().GetGeomFieldDefn(1).GetType() == ogr.wkbLineString lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() if feat.GetGeomFieldRef(0).ExportToWkt() != 'POINT (0 1)': feat.DumpReadable() pytest.fail() if feat.GetGeomFieldRef(1).ExportToWkt() != 'LINESTRING (0 1,2 3)': feat.DumpReadable() pytest.fail() feat = None lyr.SetSpatialFilterRect(1, -1, -1, 10, 10) feat = lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() feat = None ds = None ############################################################################### # Test tables with multiple geometry columns (#4768) def test_ogr_sqlite_31(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_31.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_31.sqlite') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) fld = ogr.GeomFieldDefn('geom1', ogr.wkbPoint) fld.SetSpatialRef(srs) lyr.CreateGeomField(fld) fld = ogr.GeomFieldDefn('geom2', ogr.wkbLineString) fld.SetSpatialRef(srs) lyr.CreateGeomField(fld) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('foo', 'bar') f.SetGeomFieldDirectly(0, ogr.CreateGeometryFromWkt('POINT(0 1)')) f.SetGeomFieldDirectly(1, ogr.CreateGeometryFromWkt('LINESTRING(0 1,2 3)')) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('tmp/ogr_sqlite_31.sqlite') lyr = ds.GetLayerByName('test(geom1)') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetGeometryColumn() == 'geom1' assert lyr.GetGeomType() == ogr.wkbPoint lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'POINT (0 1)': feat.DumpReadable() pytest.fail() feat = None lyr = ds.GetLayerByName('test(geom2)') assert lyr.GetLayerDefn().GetFieldCount() == 1 assert lyr.GetGeometryColumn() == 'geom2' assert lyr.GetGeomType() == ogr.wkbLineString lyr.SetSpatialFilterRect(-1, -1, 10, 10) feat = lyr.GetNextFeature() if feat.GetFID() != 1: feat.DumpReadable() pytest.fail() if feat.GetGeometryRef().ExportToWkt() != 'LINESTRING (0 1,2 3)': feat.DumpReadable() pytest.fail() feat = None ds = None ############################################################################### # Test datetime support def test_ogr_sqlite_32(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_32.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_32.sqlite') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('datetimefield', ogr.OFTDateTime) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('datefield', ogr.OFTDate) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('timefield', ogr.OFTTime) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('datetimefield', '2012/08/23 21:24:00 ') feat.SetField('datefield', '2012/08/23 ') feat.SetField('timefield', '21:24:00 ') lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('tmp/ogr_sqlite_32.sqlite') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTDateTime assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTDate assert lyr.GetLayerDefn().GetFieldDefn(2).GetType() == ogr.OFTTime feat = lyr.GetNextFeature() if feat.GetField('datetimefield') != '2012/08/23 21:24:00' or \ feat.GetField('datefield') != '2012/08/23' or \ feat.GetField('timefield') != '21:24:00': feat.DumpReadable() pytest.fail() feat = None ds = None ############################################################################### # Test SRID layer creation option def test_ogr_sqlite_33(with_and_without_spatialite): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_33.sqlite') except OSError: pass if not with_and_without_spatialite: options = [] else: if gdaltest.spatialite_version.find('2.3') == 0: return options = ['SPATIALITE=YES'] ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_33.sqlite', options=options) if not with_and_without_spatialite: # To make sure that the entry is added in spatial_ref_sys srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('test1', srs=srs) # Test with existing entry lyr = ds.CreateLayer('test2', options=['SRID=4326']) # Test with non-existing entry gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('test3', options=['SRID=123456']) gdal.PopErrorHandler() ds = None ds = ogr.Open('tmp/ogr_sqlite_33.sqlite') lyr = ds.GetLayerByName('test2') srs = lyr.GetSpatialRef() if srs.ExportToWkt().find('4326') == -1: pytest.fail('failure') # 123456 should be referenced in geometry_columns... sql_lyr = ds.ExecuteSQL('SELECT * from geometry_columns WHERE srid=123456') feat = sql_lyr.GetNextFeature() is_none = feat is None feat = None ds.ReleaseResultSet(sql_lyr) assert not is_none # ... but not in spatial_ref_sys sql_lyr = ds.ExecuteSQL('SELECT * from spatial_ref_sys WHERE srid=123456') feat = sql_lyr.GetNextFeature() is_none = feat is None feat = None ds.ReleaseResultSet(sql_lyr) assert is_none ############################################################################### # Test REGEXP support (#4823) def test_ogr_sqlite_34(): if gdaltest.sl_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT 'a' REGEXP 'a'") gdal.PopErrorHandler() if sql_lyr is None: pytest.skip() feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert val == 1 # Evaluates to FALSE sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT 'b' REGEXP 'a'") feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert val == 0 # NULL left-member sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT NULL REGEXP 'a'") feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert val == 0 # NULL regexp gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT 'a' REGEXP NULL") gdal.PopErrorHandler() assert sql_lyr is None # Invalid regexp gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT 'a' REGEXP '['") gdal.PopErrorHandler() assert sql_lyr is None # Adds another pattern sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT 'b' REGEXP 'b'") feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert val == 1 # Test cache for _ in range(2): for i in range(17): regexp = chr(ord('a') + i) sql_lyr = gdaltest.sl_ds.ExecuteSQL("SELECT '%s' REGEXP '%s'" % (regexp, regexp)) feat = sql_lyr.GetNextFeature() val = feat.GetField(0) gdaltest.sl_ds.ReleaseResultSet(sql_lyr) assert val == 1 ############################################################################### # Test SetAttributeFilter() on SQL result layer def test_ogr_sqlite_35(with_and_without_spatialite): if gdaltest.sl_ds is None: pytest.skip() if with_and_without_spatialite: if gdaltest.spatialite_version.find('2.3') >= 0: pytest.skip() options = ['SPATIALITE=YES'] else: options = [] try: os.remove('tmp/ogr_sqlite_35.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_35.sqlite', options=options) lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('foo', ogr.OFTString) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 'bar') feat.SetGeometry(ogr.CreateGeometryFromWkt("POINT (1 1)")) lyr.CreateFeature(feat) feat = None for sql in ["SELECT * FROM test", "SELECT * FROM test GROUP BY foo", "SELECT * FROM test ORDER BY foo", "SELECT * FROM test LIMIT 1", "SELECT * FROM test WHERE 1=1", "SELECT * FROM test WHERE 1=1 GROUP BY foo", "SELECT * FROM test WHERE 1=1 ORDER BY foo", "SELECT * FROM test WHERE 1=1 LIMIT 1"]: sql_lyr = ds.ExecuteSQL(sql) sql_lyr.SetAttributeFilter("foo = 'bar'") sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None sql_lyr.SetAttributeFilter("foo = 'baz'") sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is None feat = None sql_lyr.SetAttributeFilter(None) sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None sql_lyr.SetSpatialFilterRect(0, 0, 2, 2) sql_lyr.SetAttributeFilter("foo = 'bar'") sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None sql_lyr.SetSpatialFilterRect(1.5, 1.5, 2, 2) sql_lyr.SetAttributeFilter("foo = 'bar'") sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is None feat = None sql_lyr.SetSpatialFilterRect(0, 0, 2, 2) sql_lyr.SetAttributeFilter(None) sql_lyr.ResetReading() feat = sql_lyr.GetNextFeature() assert feat is not None feat = None ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test FID64 support def test_ogr_sqlite_36(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_36.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_36.sqlite') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn('foo', ogr.OFTString) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 'bar') feat.SetFID(1234567890123) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('tmp/ogr_sqlite_36.sqlite') lyr = ds.GetLayer(0) assert lyr.GetMetadataItem(ogr.OLMD_FID64) is not None f = lyr.GetNextFeature() assert f.GetFID() == 1234567890123 ############################################################################### # Test not nullable fields def test_ogr_sqlite_37(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_37.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_37.sqlite') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_nullable', ogr.wkbPoint) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None ds = None ds = ogr.Open('tmp/ogr_sqlite_37.sqlite', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 # Turn not null into nullable src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')) fd = ogr.FieldDefn('now_nullable', src_fd.GetType()) fd.SetNullable(1) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable'), fd, ogr.ALTER_ALL_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_nullable')).IsNullable() == 1 # Turn nullable into not null, but remove NULL values first ds.ExecuteSQL("UPDATE test SET field_nullable = '' WHERE field_nullable IS NULL") src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')) fd = ogr.FieldDefn('now_nullable', src_fd.GetType()) fd.SetName('now_not_nullable') fd.SetNullable(0) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable'), fd, ogr.ALTER_ALL_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_not_nullable')).IsNullable() == 0 ds = None ds = ogr.Open('tmp/ogr_sqlite_37.sqlite') lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('now_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 ds = None ############################################################################### # Test default values def test_ogr_sqlite_38(): if gdaltest.sl_ds is None: pytest.skip() try: os.remove('tmp/ogr_sqlite_38.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_38.sqlite') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime3', ogr.OFTDateTime) field_defn.SetDefault("(strftime('%Y-%m-%dT%H:%M:%fZ','now'))") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime4', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56.123'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_date', ogr.OFTDate) field_defn.SetDefault("CURRENT_DATE") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_time', ogr.OFTTime) field_defn.SetDefault("CURRENT_TIME") lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = ogr.Open('tmp/ogr_sqlite_38.sqlite', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() == 'CURRENT_TIMESTAMP' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() == "'2015/06/30 12:34:56'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime3')).GetDefault() == "(strftime('%Y-%m-%dT%H:%M:%fZ','now'))" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime4')).GetDefault() == "'2015/06/30 12:34:56.123'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault() == "CURRENT_DATE" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_time')).GetDefault() == "CURRENT_TIME" f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56' or \ f.GetField('field_datetime4') != '2015/06/30 12:34:56.123' or \ not f.IsFieldSet('field_datetime3') or \ not f.IsFieldSet('field_date') or not f.IsFieldSet('field_time'): f.DumpReadable() pytest.fail() # Change DEFAULT value src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')) fd = ogr.FieldDefn('field_string', src_fd.GetType()) fd.SetDefault("'c'") lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string'), fd, ogr.ALTER_DEFAULT_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'c'" # Drop DEFAULT value src_fd = lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')) fd = ogr.FieldDefn('field_int', src_fd.GetType()) fd.SetDefault(None) lyr.AlterFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int'), fd, ogr.ALTER_DEFAULT_FLAG) assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() is None ds = None ds = ogr.Open('tmp/ogr_sqlite_38.sqlite', update=1) lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'c'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() is None ds = None ############################################################################### # Test spatial filters with point extent def test_ogr_spatialite_9(require_spatialite): ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_spatialite_9.sqlite', options=['SPATIALITE=YES']) lyr = ds.CreateLayer('point', geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(feat) lyr.SetSpatialFilterRect(1, 2, 1, 2) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_spatialite_9.sqlite') ############################################################################### # Test not nullable fields def test_ogr_spatialite_10(require_spatialite): try: os.remove('tmp/ogr_spatialite_10.sqlite') except OSError: pass ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_spatialite_10.sqlite', options=['SPATIALITE=YES']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_nullable', ogr.wkbPoint) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('tmp/ogr_spatialite_10.sqlite') lyr = ds.GetLayerByName('test') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetGeomFieldDefn(lyr.GetLayerDefn().GetGeomFieldIndex('geomfield_nullable')).IsNullable() == 1 ds = None ############################################################################### # Test creating a field with the fid name def test_ogr_sqlite_39(): if gdaltest.sl_ds is None: pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_sqlite_39.sqlite') lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['FID=myfid']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) assert ret == 0 lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 10) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 10 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 if feat.GetFID() < 0: feat.DumpReadable() pytest.fail() if feat.GetField('myfid') != feat.GetFID(): feat.DumpReadable() pytest.fail() feat.SetField('str', 'foo') ret = lyr.SetFeature(feat) assert ret == 0 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) feat.SetField('myfid', 10) gdal.PushErrorHandler() ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat.UnsetField('myfid') gdal.PushErrorHandler() ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert ret != 0 lyr.ResetReading() f = lyr.GetNextFeature() if f.GetFID() != 10 or f.GetField('str') != 'first string' or f.GetField('str2') != 'second string' or f.GetField('myfid') != 10: f.DumpReadable() pytest.fail() f = None ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_sqlite_39.sqlite') ############################################################################### # Test dataset transactions def test_ogr_sqlite_40(with_and_without_spatialite): if gdaltest.sl_ds is None: pytest.skip() if with_and_without_spatialite: options = ['SPATIALITE=YES'] else: options = [] ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_sqlite_40.sqlite', options=options) assert ds.TestCapability(ogr.ODsCTransactions) == 1 ret = ds.StartTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.StartTransaction() gdal.PopErrorHandler() assert ret != 0 lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ret = ds.RollbackTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.RollbackTransaction() gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('/vsimem/ogr_sqlite_40.sqlite', update=1) assert ds.GetLayerCount() == 0 ret = ds.StartTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.StartTransaction() gdal.PopErrorHandler() assert ret != 0 lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ret = ds.CommitTransaction() assert ret == 0 gdal.PushErrorHandler() ret = ds.CommitTransaction() gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('/vsimem/ogr_sqlite_40.sqlite', update=1) assert ds.GetLayerCount() == 1 lyr = ds.GetLayerByName('test') ds.StartTransaction() lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None assert lyr.GetFeatureCount() == 1 ds.RollbackTransaction() assert lyr.GetFeatureCount() == 0 ds.StartTransaction() lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.ResetReading() f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 1 ds.CommitTransaction() # the cursor is still valid after CommitTransaction(), which isn't the case for other backends such as PG ! f = lyr.GetNextFeature() assert f is not None and f.GetFID() == 2 assert lyr.GetFeatureCount() == 2 ds.StartTransaction() lyr = ds.CreateLayer('test2', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() assert ret == 0 ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() assert ret == 0 ds.StartTransaction() lyr = ds.CreateLayer('test3', geom_type=ogr.wkbPoint) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) # ds.CommitTransaction() ds.ReleaseResultSet(ds.ExecuteSQL('SELECT 1')) # ds = None # ds = ogr.Open('/vsimem/ogr_gpkg_26.gpkg', update = 1) # lyr = ds.GetLayerByName('test3') # ds.StartTransaction() f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) ret = lyr.CreateFeature(f) ds.CommitTransaction() assert ret == 0 ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_sqlite_40.sqlite') ############################################################################### # Test reading dates from Julian day floating point representation def test_ogr_sqlite_41(): if gdaltest.sl_ds is None: pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_sqlite_41.sqlite', options=['METADATA=NO']) ds.ExecuteSQL('CREATE TABLE test(a_date DATETIME);') ds.ExecuteSQL("INSERT INTO test(a_date) VALUES (strftime('%J', '2015-04-30 12:34:56'))") ds = None ds = ogr.Open('/vsimem/ogr_sqlite_41.sqlite') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['a_date'] == '2015/04/30 12:34:56' ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_sqlite_41.sqlite') ############################################################################### # Test ExecuteSQL() heuristics (#6107) def test_ogr_sqlite_42(): if gdaltest.sl_ds is None: pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_sqlite_42.sqlite') lyr = ds.CreateLayer("aab") lyr.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 lyr.CreateFeature(f) lyr = None sql_lyr = ds.ExecuteSQL('SELECT id FROM aab') sql_lyr.SetAttributeFilter('id = 1') f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT id FROM "aab"') sql_lyr.SetAttributeFilter('id = 1') f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) lyr = ds.CreateLayer('with"quotes') lyr.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f['id'] = 1 lyr.CreateFeature(f) lyr = None sql_lyr = ds.ExecuteSQL('SELECT id FROM "with""quotes"') sql_lyr.SetAttributeFilter('id = 1') f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) # Too complex to analyze sql_lyr = ds.ExecuteSQL('SELECT id FROM "with""quotes" UNION ALL SELECT id FROM aab') sql_lyr.SetAttributeFilter('id = 1') f = sql_lyr.GetNextFeature() assert f is not None ds.ReleaseResultSet(sql_lyr) ds = None ogr.GetDriverByName('SQLite').DeleteDataSource('/vsimem/ogr_sqlite_42.sqlite') ############################################################################### # Test file:foo?mode=memory&cache=shared (#6150) def test_ogr_sqlite_43(): if gdaltest.sl_ds is None: pytest.skip() # Only available since sqlite 3.8.0 version = ogrtest.sqlite_version.split('.') if not (len(version) >= 3 and int(version[0]) * 10000 + int(version[1]) * 100 + int(version[2]) >= 30800): pytest.skip() ds = ogr.Open('file:foo?mode=memory&cache=shared') assert ds is not None ############################################################################### # Test reading/writing StringList, etc.. def test_ogr_sqlite_44(): if gdaltest.sl_ds is None: pytest.skip() gdal.FileFromMemBuffer('/vsimem/ogr_sqlite_44.csvt', 'JsonStringList,JsonIntegerList,JsonInteger64List,JsonRealList,WKT') gdal.FileFromMemBuffer('/vsimem/ogr_sqlite_44.csv', """stringlist,intlist,int64list,reallist,WKT "[""a"",null]","[1]","[1234567890123]","[0.125]", """) gdal.VectorTranslate('/vsimem/ogr_sqlite_44.sqlite', '/vsimem/ogr_sqlite_44.csv', format='SQLite') gdal.VectorTranslate('/vsimem/ogr_sqlite_44_out.csv', '/vsimem/ogr_sqlite_44.sqlite', format='CSV', layerCreationOptions=['CREATE_CSVT=YES', 'LINEFORMAT=LF']) f = gdal.VSIFOpenL('/vsimem/ogr_sqlite_44_out.csv', 'rb') assert f is not None data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('stringlist,intlist,int64list,reallist,wkt\n"[ ""a"", """" ]",[ 1 ],[ 1234567890123 ],[ 0.125') f = gdal.VSIFOpenL('/vsimem/ogr_sqlite_44_out.csvt', 'rb') data = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) assert data.startswith('JSonStringList,JSonIntegerList,JSonInteger64List,JSonRealList') gdal.Unlink('/vsimem/ogr_sqlite_44.csv') gdal.Unlink('/vsimem/ogr_sqlite_44.csvt') gdal.Unlink('/vsimem/ogr_sqlite_44.sqlite') gdal.Unlink('/vsimem/ogr_sqlite_44_out.csv') gdal.Unlink('/vsimem/ogr_sqlite_44_out.csvt') ############################################################################### # Test WAL and opening in read-only (#6776) def test_ogr_sqlite_45(): if gdaltest.sl_ds is None: pytest.skip() # Only available since sqlite 3.7.0 version = ogrtest.sqlite_version.split('.') if not (len(version) >= 3 and int(version[0]) * 10000 + int(version[1]) * 100 + int(version[2]) >= 30700): pytest.skip() ds = ogr.GetDriverByName('SQLite').CreateDataSource('tmp/ogr_sqlite_45.db') sql_lyr = ds.ExecuteSQL('PRAGMA journal_mode = WAL') ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('SELECT * FROM sqlite_master') ds.ReleaseResultSet(sql_lyr) assert os.path.exists('tmp/ogr_sqlite_45.db-wal') shutil.copy('tmp/ogr_sqlite_45.db', 'tmp/ogr_sqlite_45_bis.db') shutil.copy('tmp/ogr_sqlite_45.db-shm', 'tmp/ogr_sqlite_45_bis.db-shm') shutil.copy('tmp/ogr_sqlite_45.db-wal', 'tmp/ogr_sqlite_45_bis.db-wal') ds = None assert not os.path.exists('tmp/ogr_sqlite_45.db-wal') ds = ogr.Open('tmp/ogr_sqlite_45_bis.db') ds = None assert not os.path.exists('tmp/ogr_sqlite_45_bis.db-wal') gdal.Unlink('tmp/ogr_sqlite_45.db') gdal.Unlink('tmp/ogr_sqlite_45_bis.db') ############################################################################### # Test creating unsupported geometry types def test_ogr_spatialite_11(require_spatialite): ds = ogr.GetDriverByName('SQLite').CreateDataSource('/vsimem/ogr_spatialite_11.sqlite', options=['SPATIALITE=YES']) # Will be converted to LineString lyr = ds.CreateLayer('test', geom_type=ogr.wkbCurve) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None lyr = ds.CreateLayer('test2', geom_type=ogr.wkbNone) with gdaltest.error_handler(): res = lyr.CreateGeomField(ogr.GeomFieldDefn('foo', ogr.wkbCurvePolygon)) assert res != 0 ds = None gdal.Unlink('/vsimem/ogr_spatialite_11.sqlite') ############################################################################### # Test opening a .sql file def test_ogr_spatialite_12(require_spatialite): if gdal.GetDriverByName('SQLite').GetMetadataItem("ENABLE_SQL_SQLITE_FORMAT") != 'YES': pytest.skip() ds = ogr.Open('data/poly_spatialite.sqlite.sql') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f is not None ############################################################################### def test_ogr_sqlite_iterate_and_update(): if gdaltest.sl_ds is None: pytest.skip() filename = "/vsimem/ogr_sqlite_iterate_and_update.db" ds = ogr.GetDriverByName('SQLite').CreateDataSource(filename) lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('strfield')) f = ogr.Feature(lyr.GetLayerDefn()) f['strfield'] = 'foo' lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f['strfield'] = 'bar' lyr.CreateFeature(f) lyr.ResetReading() for f in lyr: f['strfield'] += "_updated" lyr.SetFeature(f) lyr.ResetReading() for f in lyr: assert f['strfield'].endswith('_updated') ds = None gdal.Unlink(filename) ############################################################################### # def test_ogr_sqlite_cleanup(): if gdaltest.sl_ds is None: pytest.skip() gdaltest.sl_ds.ExecuteSQL('DELLAYER:tpoly') gdaltest.sl_ds.ExecuteSQL('DELLAYER:tpoly_2') gdaltest.sl_ds.ExecuteSQL('DELLAYER:tpoly_3') gdaltest.sl_ds.ExecuteSQL('DELLAYER:geomwkb') gdaltest.sl_ds.ExecuteSQL('DELLAYER:geomwkt') gdaltest.sl_ds.ExecuteSQL('DELLAYER:geomspatialite') gdaltest.sl_ds.ExecuteSQL('DELLAYER:wgs84layer') gdaltest.sl_ds.ExecuteSQL('DELLAYER:wgs84layer_approx') gdaltest.sl_ds.ExecuteSQL('DELLAYER:testtypes') gdaltest.sl_ds.ExecuteSQL('DELLAYER:fgf_table') gdaltest.sl_ds = None gdaltest.shp_ds = None gdalautotest-3.0.4/ogr/ogr_pgdump.py0000755003401500001440000011032413614005365017143 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_pgdump.py 56f9eca9a81a56ab2cf198d5b3288f6eb8df702a 2019-02-27 09:45:00 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for OGR PGDump driver. # Author: Even Rouault # ############################################################################### # 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 import sys import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest ############################################################################### # Create table from data/poly.shp def test_ogr_pgdump_1(): try: os.remove('tmp/tpoly.sql') except OSError: pass ds = ogr.GetDriverByName('PGDump').CreateDataSource('tmp/tpoly.sql') ###################################################### # Create Layer lyr = ds.CreateLayer('tpoly', options=['DIM=3']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() ds.Destroy() f = open('tmp/tpoly.sql') sql = f.read() f.close() assert (not (sql.find("""DROP TABLE IF EXISTS "public"."tpoly" CASCADE;""") == -1 or \ sql.find("""DELETE FROM geometry_columns WHERE f_table_name = 'tpoly' AND f_table_schema = 'public';""") == -1 or \ sql.find("""BEGIN;""") == -1 or \ sql.find("""CREATE TABLE "public"."tpoly" ( "ogc_fid" SERIAL, CONSTRAINT "tpoly_pk" PRIMARY KEY ("ogc_fid") );""") == -1 or \ sql.find("""SELECT AddGeometryColumn('public','tpoly','wkb_geometry',-1,'GEOMETRY',3);""") == -1 or \ sql.find("""CREATE INDEX "tpoly_wkb_geometry_geom_idx" ON "public"."tpoly" USING GIST ("wkb_geometry");""") == -1 or \ sql.find("""ALTER TABLE "public"."tpoly" ADD COLUMN "area" FLOAT8;""") == -1 or \ sql.find("""ALTER TABLE "public"."tpoly" ADD COLUMN "eas_id" INTEGER;""") == -1 or \ sql.find("""ALTER TABLE "public"."tpoly" ADD COLUMN "prfedea" VARCHAR;""") == -1 or \ sql.find("""ALTER TABLE "public"."tpoly" ADD COLUMN "shortname" VARCHAR(8);""") == -1 or \ sql.find("""INSERT INTO "public"."tpoly" ("wkb_geometry" , "area", "eas_id", "prfedea") VALUES ('01030000800100000005000000000000C01A481D4100000080072D5241000000000000000000000060AA461D4100000080FF2C524100000000000000000000006060461D41000000400C2D52410000000000000000000000A0DF471D4100000000142D52410000000000000000000000C01A481D4100000080072D52410000000000000000', 5268.813, 170, '35043413');""") == -1 or \ sql.find("""COMMIT;""") == -1)) ############################################################################### # Create table from data/poly.shp with PG_USE_COPY=YES def test_ogr_pgdump_2(): try: os.remove('tmp/tpoly.sql') except OSError: pass gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.GetDriverByName('PGDump').CreateDataSource('tmp/tpoly.sql', options=['LINEFORMAT=CRLF']) ###################################################### # Create Layer lyr = ds.CreateLayer('tpoly', geom_type=ogr.wkbPolygon, options=['SCHEMA=another_schema', 'SRID=4326', 'GEOMETRY_NAME=the_geom']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() ds.Destroy() gdal.SetConfigOption('PG_USE_COPY', 'NO') f = open('tmp/tpoly.sql') sql = f.read() f.close() assert (not (sql.find("""DROP TABLE IF EXISTS "another_schema"."tpoly" CASCADE;""") == -1 or \ sql.find("""DELETE FROM geometry_columns WHERE f_table_name = 'tpoly' AND f_table_schema = 'another_schema';""") == -1 or \ sql.find("""BEGIN;""") == -1 or \ sql.find("""CREATE TABLE "another_schema"."tpoly" ( "ogc_fid" SERIAL, CONSTRAINT "tpoly_pk" PRIMARY KEY ("ogc_fid") );""") == -1 or \ sql.find("""SELECT AddGeometryColumn('another_schema','tpoly','the_geom',4326,'POLYGON',2);""") == -1 or \ sql.find("""CREATE INDEX "tpoly_the_geom_geom_idx" ON "another_schema"."tpoly" USING GIST ("the_geom");""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "area" FLOAT8;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "eas_id" INTEGER;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "prfedea" VARCHAR;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "shortname" VARCHAR(8);""") == -1 or \ sql.find("""COPY "another_schema"."tpoly" ("the_geom", "area", "eas_id", "prfedea", "shortname") FROM STDIN;""") == -1 or \ sql.find("0103000020E61000000100000005000000000000C01A481D4100000080072D524100000060AA461D4100000080FF2C52410000006060461D41000000400C2D5241000000A0DF471D4100000000142D5241000000C01A481D4100000080072D5241 5268.813 170 35043413 \\N") == -1 or \ sql.find("""\.""") == -1 or \ sql.find("""COMMIT;""") == -1)) ############################################################################### # Create table from data/poly.shp without any geometry def test_ogr_pgdump_3(): try: os.remove('tmp/tpoly.sql') except OSError: pass gdal.SetConfigOption('PG_USE_COPY', 'YES') ds = ogr.GetDriverByName('PGDump').CreateDataSource('tmp/tpoly.sql', options=['LINEFORMAT=LF']) ###################################################### # Create Layer lyr = ds.CreateLayer('tpoly', geom_type=ogr.wkbNone, options=['SCHEMA=another_schema']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(lyr, [('EMPTYCHAR', ogr.OFTString), ('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString), ('SHORTNAME', ogr.OFTString, 8)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] i = 0 while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) if i == 0: # Be perverse and test the case where a feature has a geometry # even if it's a wkbNone layer ! (#4040) dst_feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(0 1)')) elif i == 1: # Field with 0 character (not empty!) (#4040) dst_feat.SetField(0, '') i = i + 1 lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() ds.Destroy() gdal.SetConfigOption('PG_USE_COPY', 'NO') f = open('tmp/tpoly.sql') sql = f.read() f.close() assert (not (sql.find("""DROP TABLE IF EXISTS "another_schema"."tpoly" CASCADE;""") == -1 or \ sql.find("""DELETE FROM geometry_columns""") != -1 or \ sql.find("""BEGIN;""") == -1 or \ sql.find("""CREATE TABLE "another_schema"."tpoly" ( "ogc_fid" SERIAL, CONSTRAINT "tpoly_pk" PRIMARY KEY ("ogc_fid") );""") == -1 or \ sql.find("""SELECT AddGeometryColumn""") != -1 or \ sql.find("""CREATE INDEX "tpoly_wkb_geometry_geom_idx""") != -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "area" FLOAT8;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "eas_id" INTEGER;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "prfedea" VARCHAR;""") == -1 or \ sql.find("""ALTER TABLE "another_schema"."tpoly" ADD COLUMN "shortname" VARCHAR(8);""") == -1 or \ sql.find("""COPY "another_schema"."tpoly" ("emptychar", "area", "eas_id", "prfedea", "shortname") FROM STDIN;""") == -1 or \ sql.find("""\\N 215229.266 168 35043411 \\N""") == -1 or \ sql.find(""" 5268.813 170 35043413 \\N""") == -1 or \ sql.find("""\\.""") == -1 or \ sql.find("""COMMIT;""") == -1)) ############################################################################### # Test multi-geometry support def test_ogr_pgdump_4(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('tmp/ogr_pgdump_4.sql', options=['LINEFORMAT=LF']) assert ds.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) != 0 ###################################################### # Create Layer lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['WRITE_EWKT_GEOM=YES']) assert lyr.TestCapability(ogr.OLCCreateGeomField) != 0 gfld_defn = ogr.GeomFieldDefn("point_nosrs", ogr.wkbPoint) lyr.CreateGeomField(gfld_defn) gfld_defn = ogr.GeomFieldDefn("poly", ogr.wkbPolygon25D) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) gfld_defn.SetSpatialRef(srs) lyr.CreateGeomField(gfld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeomFieldDirectly("point_nosrs", ogr.CreateGeometryFromWkt('POINT (1 2)')) feat.SetGeomFieldDirectly("poly", ogr.CreateGeometryFromWkt('POLYGON Z ((0 0 0,0 1 0,1 1 0,1 0 0, 0 0 0))')) lyr.CreateFeature(feat) ds = None f = open('tmp/ogr_pgdump_4.sql') sql = f.read() f.close() assert (not (sql.find("""CREATE TABLE "public"."test" ( "ogc_fid" SERIAL, CONSTRAINT "test_pk" PRIMARY KEY ("ogc_fid") )""") == -1 or \ sql.find("""SELECT AddGeometryColumn('public','test','point_nosrs',-1,'POINT',2)""") == -1 or \ sql.find("""CREATE INDEX "test_point_nosrs_geom_idx" ON "public"."test" USING GIST ("point_nosrs")""") == -1 or \ sql.find("""SELECT AddGeometryColumn('public','test','poly',4326,'POLYGON',3)""") == -1 or \ sql.find("""CREATE INDEX "test_poly_geom_idx" ON "public"."test" USING GIST ("poly")""") == -1 or \ sql.find("""INSERT INTO "public"."test" DEFAULT VALUES""") == -1 or \ sql.find("""INSERT INTO "public"."test" ("point_nosrs" , "poly" ) VALUES (GeomFromEWKT('SRID=-1;POINT (1 2)'::TEXT) , GeomFromEWKT('SRID=4326;POLYGON Z ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0))'::TEXT) )""") == -1)) ############################################################################### # Test non nullable field support def test_ogr_pgdump_5(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_5.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_not_nullable', ogr.wkbPoint) field_defn.SetNullable(0) lyr.CreateGeomField(field_defn) field_defn = ogr.GeomFieldDefn('geomfield_nullable', ogr.wkbPoint) lyr.CreateGeomField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeomFieldDirectly('geomfield_not_nullable', ogr.CreateGeometryFromWkt('POINT(0 0)')) lyr.CreateFeature(f) f = None # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_5.sql', 'rb') sql = gdal.VSIFReadL(1, 1000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_5.sql') assert (not (sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_not_nullable" VARCHAR NOT NULL;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_nullable" VARCHAR;""") == -1 or \ sql.find("""ALTER TABLE "test" ALTER COLUMN "geomfield_not_nullable" SET NOT NULL;""") == -1)) ############################################################################### # Test default values def test_ogr_pgdump_6(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_6.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_date', ogr.OFTDate) field_defn.SetDefault("CURRENT_DATE") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_time', ogr.OFTTime) field_defn.SetDefault("CURRENT_TIME") lyr.CreateField(field_defn) gdal.SetConfigOption('PG_USE_COPY', 'YES') f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_string', 'a') f.SetField('field_int', 456) f.SetField('field_real', 4.56) f.SetField('field_datetime', '2015/06/30 12:34:56') f.SetField('field_datetime2', '2015/06/30 12:34:56') f.SetField('field_date', '2015/06/30') f.SetField('field_time', '12:34:56') lyr.CreateFeature(f) f = None # Transition from COPY to INSERT f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None # Transition from INSERT to COPY f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_string', 'b') f.SetField('field_int', 456) f.SetField('field_real', 4.56) f.SetField('field_datetime', '2015/06/30 12:34:56') f.SetField('field_datetime2', '2015/06/30 12:34:56') f.SetField('field_date', '2015/06/30') f.SetField('field_time', '12:34:56') lyr.CreateFeature(f) f = None gdal.SetConfigOption('PG_USE_COPY', None) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_6.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_6.sql') assert (not ("""a\t456\t4.56\t\\N\t2015/06/30 12:34:56\t2015/06/30 12:34:56\t2015/06/30\t12:34:56""" not in sql or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_string" VARCHAR DEFAULT 'a''b';""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_int" INTEGER DEFAULT 123;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_real" FLOAT8 DEFAULT 1.23;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_datetime" timestamp with time zone DEFAULT CURRENT_TIMESTAMP;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_datetime2" timestamp with time zone DEFAULT '2015/06/30 12:34:56+00'::timestamp with time zone;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_date" date DEFAULT CURRENT_DATE;""") == -1 or \ sql.find("""ALTER TABLE "public"."test" ADD COLUMN "field_time" time DEFAULT CURRENT_TIME;""") == -1 or \ """b\t456\t4.56\t\\N\t2015/06/30 12:34:56\t2015/06/30 12:34:56\t2015/06/30\t12:34:56""" not in sql)) ############################################################################### # Test creating a field with the fid name (PG_USE_COPY=NO) def test_ogr_pgdump_7(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_7.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['FID=myfid']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) assert ret == 0 lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 10) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 10 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 if feat.GetFID() < 0: feat.DumpReadable() pytest.fail() if feat.GetField('myfid') != feat.GetFID(): feat.DumpReadable() pytest.fail() # feat.SetField('str', 'foo') # ret = lyr.SetFeature(feat) # if ret != 0: # gdaltest.post_reason('fail') # return 'fail' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) feat.SetField('myfid', 10) gdal.PushErrorHandler() ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 # gdal.PushErrorHandler() # ret = lyr.SetFeature(feat) # gdal.PopErrorHandler() # if ret == 0: # gdaltest.post_reason('fail') # return 'fail' # feat.UnsetField('myfid') # gdal.PushErrorHandler() # ret = lyr.SetFeature(feat) # gdal.PopErrorHandler() # if ret == 0: # gdaltest.post_reason('fail') # return 'fail' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 12) feat.SetField('str2', 'second string') ret = lyr.CreateFeature(feat) assert ret == 0 assert feat.GetFID() == 12 ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_7.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_7.sql') assert (not ("""CREATE TABLE "public"."test" ( "myfid" SERIAL, CONSTRAINT "test_pk" PRIMARY KEY ("myfid") )""" not in sql or \ """ALTER TABLE "public"."test" ADD COLUMN "myfid" """ in sql or \ sql.find("""INSERT INTO "public"."test" ("myfid" , "str", "str2") VALUES (10, 'first string', 'second string');""") == -1 or \ sql.find("""INSERT INTO "public"."test" ("str2") VALUES ('second string');""") == -1 or \ sql.find("""INSERT INTO "public"."test" ("myfid" , "str", "str2") VALUES (12, 'first string', 'second string');""") == -1)) ############################################################################### # Test creating a field with the fid name (PG_USE_COPY=NO) def test_ogr_pgdump_8(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_8.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['FID=myfid']) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) gdal.PushErrorHandler() ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ret = lyr.CreateField(ogr.FieldDefn('myfid', ogr.OFTInteger)) assert ret == 0 lyr.CreateField(ogr.FieldDefn('str2', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 10) feat.SetField('str2', 'second string') gdal.SetConfigOption('PG_USE_COPY', 'YES') ret = lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', None) assert ret == 0 assert feat.GetFID() == 10 feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str2', 'second string') gdal.SetConfigOption('PG_USE_COPY', 'YES') ret = lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', None) assert ret == 0 if feat.GetFID() < 0: feat.DumpReadable() pytest.fail() if feat.GetField('myfid') != feat.GetFID(): feat.DumpReadable() pytest.fail() # feat.SetField('str', 'foo') # ret = lyr.SetFeature(feat) # if ret != 0: # gdaltest.post_reason('fail') # return 'fail' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1) feat.SetField('myfid', 10) gdal.PushErrorHandler() gdal.SetConfigOption('PG_USE_COPY', 'YES') ret = lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', None) gdal.PopErrorHandler() assert ret != 0 # gdal.PushErrorHandler() # ret = lyr.SetFeature(feat) # gdal.PopErrorHandler() # if ret == 0: # gdaltest.post_reason('fail') # return 'fail' # feat.UnsetField('myfid') # gdal.PushErrorHandler() # ret = lyr.SetFeature(feat) # gdal.PopErrorHandler() # if ret == 0: # gdaltest.post_reason('fail') # return 'fail' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'first string') feat.SetField('myfid', 12) feat.SetField('str2', 'second string') gdal.SetConfigOption('PG_USE_COPY', 'YES') ret = lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', None) assert ret == 0 assert feat.GetFID() == 12 ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_8.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('ascii') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_8.sql') assert (not ("""CREATE TABLE "public"."test" ( "myfid" SERIAL, CONSTRAINT "test_pk" PRIMARY KEY ("myfid") )""" not in sql or \ """ALTER TABLE "public"."test" ADD COLUMN "myfid" """ in sql or \ sql.find("""10\tfirst string\tsecond string""") == -1 or \ sql.find("""INSERT INTO "public"."test" ("str2") VALUES ('second string');""") == -1 or \ sql.find("""12\tfirst string\tsecond string""") == -1)) ############################################################################### # Test creating a field with the fid name (PG_USE_COPY=NO) def test_ogr_pgdump_9(pg_use_copy='YES'): gdal.SetConfigOption('PG_USE_COPY', pg_use_copy) ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_9.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) fld = ogr.FieldDefn('str', ogr.OFTString) fld.SetWidth(5) lyr.CreateField(fld) fld = ogr.FieldDefn('str2', ogr.OFTString) lyr.CreateField(fld) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', '01234') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'ABCDEF') lyr.CreateFeature(feat) if sys.version_info >= (3, 0, 0): val4 = '\u00e9\u00e9\u00e9\u00e9' val5 = val4 + '\u00e9' val6 = val5 + '\u00e9' else: exec("val4 = u'\\u00e9\\u00e9\\u00e9\\u00e9'") exec("val5 = val4 + u'\\u00e9'") exec("val6 = val5 + u'\\u00e9'") feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', val6) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('str', 'a' + val5) lyr.CreateFeature(feat) gdal.SetConfigOption('PG_USE_COPY', None) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_9.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_9.sql') if pg_use_copy == 'YES': eofield = '\t' else: eofield = "'" assert ("""01234%s""" % eofield in sql and \ """ABCDE%s""" % eofield in sql and \ """%s%s""" % (val5, eofield) in sql and \ """%s%s""" % ('a' + val4, eofield) in sql) def test_ogr_pgdump_10(): return test_ogr_pgdump_9('NO') ############################################################################### # Export POINT EMPTY for PostGIS 2.2 def test_ogr_pgdump_11(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_11.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint, options=['POSTGIS_VERSION=2.2']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT EMPTY')) lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_11.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_11.sql') # clang -m32 generates F8FF..., instead of F87F... for all other systems assert ('0101000000000000000000F87F000000000000F87F' in sql or \ '0101000000000000000000F8FF000000000000F8FF' in sql) ############################################################################### # Test that GEOMETRY_NAME works even when the geometry column creation is # done through CreateGeomField (#6366) # This is important for the ogr2ogr use case when the source geometry column # is not-nullable, and hence the CreateGeomField() interface is used. def test_ogr_pgdump_12(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_12.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=['GEOMETRY_NAME=another_name']) lyr.CreateGeomField(ogr.GeomFieldDefn('my_geom', ogr.wkbPoint)) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_12.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_12.sql') assert 'another_name' in sql ############################################################################### # Test ZM support def test_ogr_pgdump_13(): tests = [[ogr.wkbUnknown, [], 'POINT ZM (1 2 3 4)', ["'GEOMETRY',2)", "0101000000000000000000F03F0000000000000040"]], [ogr.wkbUnknown, ['GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(GEOMETRY", "0101000000000000000000F03F0000000000000040"]], [ogr.wkbUnknown, ['DIM=XYZ'], 'POINT ZM (1 2 3 4)', ["'GEOMETRY',3)", "0101000080000000000000F03F00000000000000400000000000000840"]], [ogr.wkbUnknown, ['DIM=XYZ', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(GEOMETRYZ,", "0101000080000000000000F03F00000000000000400000000000000840"]], [ogr.wkbPoint, ['DIM=XYZ'], 'POINT ZM (1 2 3 4)', ["'POINT',3)", "0101000080000000000000F03F00000000000000400000000000000840"]], [ogr.wkbPoint25D, [], 'POINT ZM (1 2 3 4)', ["'POINT',3)", "0101000080000000000000F03F00000000000000400000000000000840"]], [ogr.wkbPoint, ['DIM=XYZ', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(POINTZ,", "0101000080000000000000F03F00000000000000400000000000000840"]], [ogr.wkbUnknown, ['DIM=XYM'], 'POINT ZM (1 2 3 4)', ["'GEOMETRY',3)", "0101000040000000000000F03F00000000000000400000000000001040"]], [ogr.wkbUnknown, ['DIM=XYM', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(GEOMETRYM,", "0101000040000000000000F03F00000000000000400000000000001040"]], [ogr.wkbPoint, ['DIM=XYM'], 'POINT ZM (1 2 3 4)', ["'POINTM',3)", "0101000040000000000000F03F00000000000000400000000000001040"]], [ogr.wkbPointM, [], 'POINT ZM (1 2 3 4)', ["'POINTM',3)", "0101000040000000000000F03F00000000000000400000000000001040"]], [ogr.wkbPoint, ['DIM=XYM', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(POINTM,", "0101000040000000000000F03F00000000000000400000000000001040"]], [ogr.wkbUnknown, ['DIM=XYZM'], 'POINT ZM (1 2 3 4)', ["'GEOMETRY',4)", "01010000C0000000000000F03F000000000000004000000000000008400000000000001040"]], [ogr.wkbUnknown, ['DIM=XYZM', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(GEOMETRYZM,", "01010000C0000000000000F03F000000000000004000000000000008400000000000001040"]], [ogr.wkbPoint, ['DIM=XYZM'], 'POINT ZM (1 2 3 4)', ["'POINT',4)", "01010000C0000000000000F03F000000000000004000000000000008400000000000001040"]], [ogr.wkbPointZM, [], 'POINT ZM (1 2 3 4)', ["'POINT',4)", "01010000C0000000000000F03F000000000000004000000000000008400000000000001040"]], [ogr.wkbPoint, ['DIM=XYZM', 'GEOM_TYPE=geography'], 'POINT ZM (1 2 3 4)', ["geography(POINTZM,", "01010000C0000000000000F03F000000000000004000000000000008400000000000001040"]], ] for (geom_type, options, wkt, expected_strings) in tests: ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_13.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=geom_type, options=options) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_13.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_13.sql') for expected_string in expected_strings: assert expected_string in sql, (geom_type, options, wkt, expected_string) if 'GEOM_TYPE=geography' in options: continue ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_13.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone, options=options) lyr.CreateGeomField(ogr.GeomFieldDefn("my_geom", geom_type)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_13.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_13.sql') for expected_string in expected_strings: assert expected_string in sql, (geom_type, options, wkt, expected_string) ############################################################################### # Test description def test_ogr_pgdump_14(): # Set with DESCRIPTION layer creation option ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_14.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('ogr_pgdump_14', geom_type=ogr.wkbPoint, options=['DESCRIPTION=foo']) # Test that SetMetadata() and SetMetadataItem() are without effect lyr.SetMetadata({'DESCRIPTION': 'bar'}) lyr.SetMetadataItem('DESCRIPTION', 'baz') ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_14.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_14.sql') assert """COMMENT ON TABLE "public"."ogr_pgdump_14" IS 'foo';""" in sql and 'bar' not in sql and 'baz' not in sql # Set with SetMetadataItem() ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_14.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('ogr_pgdump_14', geom_type=ogr.wkbPoint) lyr.SetMetadataItem('DESCRIPTION', 'bar') ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_14.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_14.sql') assert """COMMENT ON TABLE "public"."ogr_pgdump_14" IS 'bar';""" in sql # Set with SetMetadata() ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_14.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('ogr_pgdump_14', geom_type=ogr.wkbPoint) lyr.SetMetadata({'DESCRIPTION': 'baz'}) ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_14.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_14.sql') assert """COMMENT ON TABLE "public"."ogr_pgdump_14" IS 'baz';""" in sql ############################################################################### # NULL vs unset def test_ogr_pgdump_15(): ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_15.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFieldNull(0) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_15.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_15.sql') assert ('INSERT INTO "public"."test" ("str") VALUES (NULL)' in sql or \ 'INSERT INTO "public"."test" DEFAULT VALUES' in sql) ############################################################################### # Test sequence updating def test_ogr_pgdump_16(): for pg_use_copy in ('YES', 'NO'): gdal.SetConfigOption('PG_USE_COPY', pg_use_copy) ds = ogr.GetDriverByName('PGDump').CreateDataSource('/vsimem/ogr_pgdump_16.sql', options=['LINEFORMAT=LF']) lyr = ds.CreateLayer('test', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetFID(1) lyr.CreateFeature(f) f = None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_pgdump_16.sql', 'rb') sql = gdal.VSIFReadL(1, 10000, f).decode('utf8') gdal.VSIFCloseL(f) gdal.Unlink('/vsimem/ogr_pgdump_16.sql') assert """SELECT setval(pg_get_serial_sequence('"public"."test"', 'ogc_fid'), MAX("ogc_fid")) FROM "public"."test";""" in sql gdal.SetConfigOption('PG_USE_COPY', None) ############################################################################### # Cleanup def test_ogr_pgdump_cleanup(): try: os.remove('tmp/tpoly.sql') except OSError: pass try: os.remove('tmp/ogr_pgdump_4.sql') except OSError: pass gdalautotest-3.0.4/ogr/ogr_oci.py0000755003401500001440000012104613614005365016424 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ogr_oci.py 05c258ce182fe537c6a493ff4f93fa57ed1f0466 2018-12-14 16:11:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test Oracle OCI driver functionality. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2009, Even Rouault # # 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. ############################################################################### import os import gdaltest import ogrtest from osgeo import ogr from osgeo import osr from osgeo import gdal import pytest pytestmark = [ pytest.mark.skipif('OCI_DSNAME' not in os.environ, reason='no OCI_DSNAME in environment'), pytest.mark.require_driver('OCI'), ] ############################################################################### # Open ORACLE. def test_ogr_oci_1(): gdaltest.oci_ds = None gdaltest.oci_ds = ogr.Open(os.environ['OCI_DSNAME']) if gdaltest.oci_ds is not None: return pytest.fail() ############################################################################### # Create Oracle table from data/poly.shp def test_ogr_oci_2(): if gdaltest.oci_ds is None: pytest.skip() gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.oci_ds.ExecuteSQL('DELLAYER:tpoly') gdal.PopErrorHandler() ###################################################### # Create Oracle Layer gdaltest.oci_lyr = gdaltest.oci_ds.CreateLayer('tpoly', options=['DIM=3']) ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.oci_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.oci_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.oci_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() # Test updating non-existing feature shp_lyr.ResetReading() feat = shp_lyr.GetNextFeature() feat.SetFID(-10) assert gdaltest.oci_lyr.SetFeature(feat) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of SetFeature().' # Test deleting non-existing feature assert gdaltest.oci_lyr.DeleteFeature(-10) == ogr.OGRERR_NON_EXISTING_FEATURE, \ 'Expected failure of DeleteFeature().' ############################################################################### # Helper method to reverse ring winding. This is needed because the # winding direction in shapefiles, and in Oracle is opposite for polygons. def reverse_rings(poly): for i_ring in range(poly.GetGeometryCount()): ring = poly.GetGeometryRef(i_ring) v_count = ring.GetPointCount() for i_vert in range(v_count / 2): i_other = v_count - i_vert - 1 p1 = (ring.GetX(i_vert), ring.GetY(i_vert), ring.GetZ(i_vert)) ring.SetPoint(i_vert, ring.GetX(i_other), ring.GetY(i_other), ring.GetZ(i_other)) ring.SetPoint(i_other, p1[0], p1[1], p1[2]) ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_oci_3(): if gdaltest.oci_ds is None: pytest.skip() expect = [168, 169, 166, 158, 165] gdaltest.oci_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.oci_lyr, 'eas_id', expect) gdaltest.oci_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.oci_lyr.GetNextFeature() reverse_rings(orig_feat.GetGeometryRef()) if ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) != 0: print('expected:', orig_feat.GetGeometryRef().ExportToWkt()) pytest.fail('got:', read_feat.GetGeometryRef().ExportToWkt()) for fld in range(3): if orig_feat.GetField(fld) != read_feat.GetField(fld): print('expected:') print(orig_feat.DumpReadable()) print('got:') print(read_feat.DumpReadable()) pytest.fail('Attribute %d does not match' % fld) read_feat.Destroy() orig_feat.Destroy() gdaltest.poly_feat = None gdaltest.shp_ds.Destroy() assert tr ############################################################################### # Write more features with a bunch of different geometries, and verify the # geometries are still OK. def test_ogr_oci_4(): if gdaltest.oci_ds is None: pytest.skip() wkt_list = ['10', '2', '1', '3d_1', '4', '5', '6'] for item in wkt_list: wkt = open('data/wkb_wkt/' + item + '.wkt').read() geom = ogr.CreateGeometryFromWkt(wkt) ###################################################################### # Write geometry as a new Oracle feature. dst_feat = ogr.Feature(feature_def=gdaltest.oci_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly(geom) dst_feat.SetField('PRFEDEA', item) gdaltest.oci_lyr.CreateFeature(dst_feat) ###################################################################### # Read back the feature and get the geometry. gdaltest.oci_lyr.SetAttributeFilter("PRFEDEA = '%s'" % item) feat_read = gdaltest.oci_lyr.GetNextFeature() assert ogrtest.check_feature_geometry(feat_read, geom) == 0 feat_read.Destroy() dst_feat.Destroy() ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_oci_5(): if gdaltest.oci_ds is None: pytest.skip() expect = [None, 179, 173, 172, 171, 170, 169, 168, 166, 165, 158] sql_lyr = gdaltest.oci_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') assert sql_lyr.GetLayerDefn().GetGeomFieldCount() == 0 tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_oci_6(): if gdaltest.oci_ds is None: pytest.skip() sql_lyr = gdaltest.oci_ds.ExecuteSQL("select * from tpoly where prfedea = '2'") assert sql_lyr.GetLayerDefn().GetGeomFieldCount() == 1 tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['2']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'MULTILINESTRING ((5.00121349 2.99853132,5.00121349 1.99853133),(5.00121349 1.99853133,5.00121349 0.99853133),(3.00121351 1.99853127,5.00121349 1.99853133),(5.00121349 1.99853133,6.00121348 1.99853135))') != 0: tr = 0 feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_oci_7(): if gdaltest.oci_ds is None: pytest.skip() gdaltest.oci_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.oci_lyr.SetSpatialFilter(geom) geom.Destroy() tr = ogrtest.check_features_against_list(gdaltest.oci_lyr, 'eas_id', [158]) gdaltest.oci_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Test that we can create a layer with a coordinate system that is mapped # to an oracle coordinate system using the ORACLE authority code. def test_ogr_oci_8(): if gdaltest.oci_ds is None: pytest.skip() ####################################################### # Preclean. gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.oci_ds.ExecuteSQL('DELLAYER:testsrs') gdal.PopErrorHandler() ####################################################### # Prepare an SRS with an ORACLE authority code. srs = osr.SpatialReference() srs.SetGeogCS("gcs_dummy", "datum_dummy", "ellipse_dummy", osr.SRS_WGS84_SEMIMAJOR, osr.SRS_WGS84_INVFLATTENING) srs.SetAuthority('GEOGCS', 'Oracle', 8241) ####################################################### # Create Oracle Layer oci_lyr2 = gdaltest.oci_ds.CreateLayer('testsrs', srs=srs, options=['INDEX=FALSE']) ####################################################### # Now check that the srs for the layer is really the built-in # oracle SRS. srs2 = oci_lyr2.GetSpatialRef() assert srs2.GetAuthorityCode('GEOGCS') == '8241', \ 'Did not get expected authority code' assert srs2.GetAuthorityName('GEOGCS') == 'Oracle', \ 'Did not get expected authority name' assert srs2.GetAttrValue('GEOGCS|DATUM') == 'Kertau 1948', \ 'Did not get expected datum name' ############################################################################### # This time we create a layer with a EPSG marked GEOGCS, and verify that # the coordinate system gets properly remapped to the Oracle WGS84. def test_ogr_oci_9(): if gdaltest.oci_ds is None: pytest.skip() ####################################################### # Preclean. gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.oci_ds.ExecuteSQL('DELLAYER:testsrs2') gdal.PopErrorHandler() ####################################################### # Prepare an SRS with an EPSG authority code. srs = osr.SpatialReference() srs.SetWellKnownGeogCS('WGS84') ####################################################### # Create Oracle Layer oci_lyr2 = gdaltest.oci_ds.CreateLayer('testsrs2', srs=srs, options=['INDEX=FALSE']) ####################################################### # Now check that the srs for the layer is really the built-in # oracle SRS we expect. srs2 = oci_lyr2.GetSpatialRef() assert srs2.GetAuthorityCode('GEOGCS') == '4326', \ 'Did not get expected authority code' assert srs2.GetAuthorityName('GEOGCS') == 'EPSG', \ 'Did not get expected authority name' assert srs2.GetAttrValue('GEOGCS|DATUM') == 'WGS 84', \ 'Did not get expected datum name' ############################################################################### # Test handling of specialized Oracle Rectangle Geometries. def test_ogr_oci_10(): if gdaltest.oci_ds is None: pytest.skip() # Create a test table. gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.oci_ds.ExecuteSQL('drop table geom_test') gdal.PopErrorHandler() gdaltest.oci_ds.ExecuteSQL('CREATE TABLE geom_test(ora_fid number primary key, shape sdo_geometry)') # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 1, SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior) SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to -- define rectangle (lower left and upper right) with -- Cartesian-coordinate data ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 1') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'POLYGON ((1 1 0,5 1 0,5 7 0,1 7 0,1 1 0))' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test handling of specialized Oracle circle Geometries. def test_ogr_oci_11(): if gdaltest.oci_ds is None: pytest.skip() # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 4, SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 4') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'POLYGON ((10 9,9.989043790736547 9.209056926535308,9.956295201467611 9.415823381635519,9.902113032590307 9.618033988749895,9.827090915285202 9.8134732861516,9.732050807568877 10.0,9.618033988749895 10.175570504584947,9.486289650954788 10.338261212717716,9.338261212717717 10.486289650954788,9.175570504584947 10.618033988749895,9.0 10.732050807568877,8.8134732861516 10.827090915285202,8.618033988749895 10.902113032590307,8.415823381635519 10.956295201467611,8.209056926535308 10.989043790736547,8 11,7.790943073464693 10.989043790736547,7.584176618364482 10.956295201467611,7.381966011250105 10.902113032590307,7.1865267138484 10.827090915285202,7.0 10.732050807568877,6.824429495415054 10.618033988749895,6.661738787282284 10.486289650954788,6.513710349045212 10.338261212717716,6.381966011250105 10.175570504584947,6.267949192431122 10.0,6.172909084714799 9.8134732861516,6.097886967409693 9.618033988749895,6.043704798532389 9.415823381635519,6.010956209263453 9.209056926535308,6 9,6.010956209263453 8.790943073464694,6.043704798532389 8.584176618364483,6.097886967409693 8.381966011250105,6.172909084714798 8.1865267138484,6.267949192431123 8.0,6.381966011250105 7.824429495415054,6.513710349045212 7.661738787282284,6.661738787282284 7.513710349045212,6.824429495415053 7.381966011250105,7 7.267949192431123,7.1865267138484 7.172909084714798,7.381966011250105 7.097886967409693,7.584176618364481 7.043704798532389,7.790943073464693 7.010956209263453,8 7,8.209056926535306 7.010956209263453,8.415823381635518 7.043704798532389,8.618033988749895 7.097886967409693,8.8134732861516 7.172909084714799,9.0 7.267949192431123,9.175570504584947 7.381966011250105,9.338261212717715 7.513710349045211,9.486289650954788 7.661738787282284,9.618033988749895 7.824429495415053,9.732050807568877 8,9.827090915285202 8.1865267138484,9.902113032590307 8.381966011250105,9.956295201467611 8.584176618364481,9.989043790736547 8.790943073464693,10 9))' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test handling of specialized Oracle circular arc linestring Geometries. def test_ogr_oci_12(): if gdaltest.oci_ds is None: pytest.skip() # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 12, SDO_GEOMETRY( 2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,2), -- compound line string SDO_ORDINATE_ARRAY(0,0, 1,1, 0,2, -1,3, 0,4, 2,2, 0,0 ) ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 12') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'LINESTRING (0.0 0.0,0.104528463267653 0.005478104631727,0.207911690817759 0.021852399266194,0.309016994374947 0.048943483704846,0.4067366430758 0.086454542357399,0.5 0.133974596215561,0.587785252292473 0.190983005625053,0.669130606358858 0.256855174522606,0.743144825477394 0.330869393641142,0.809016994374947 0.412214747707527,0.866025403784439 0.5,0.913545457642601 0.5932633569242,0.951056516295154 0.690983005625053,0.978147600733806 0.792088309182241,0.994521895368273 0.895471536732347,1 1,0.994521895368273 1.104528463267654,0.978147600733806 1.207911690817759,0.951056516295154 1.309016994374948,0.913545457642601 1.4067366430758,0.866025403784439 1.5,0.809016994374947 1.587785252292473,0.743144825477394 1.669130606358858,0.669130606358858 1.743144825477394,0.587785252292473 1.809016994374948,0.5 1.866025403784439,0.4067366430758 1.913545457642601,0.309016994374947 1.951056516295154,0.207911690817759 1.978147600733806,0.104528463267653 1.994521895368273,0 2,-0.104528463267653 2.005478104631727,-0.207911690817759 2.021852399266194,-0.309016994374947 2.048943483704846,-0.4067366430758 2.086454542357399,-0.5 2.133974596215561,-0.587785252292473 2.190983005625053,-0.669130606358858 2.256855174522606,-0.743144825477394 2.330869393641142,-0.809016994374947 2.412214747707527,-0.866025403784439 2.5,-0.913545457642601 2.593263356924199,-0.951056516295154 2.690983005625053,-0.978147600733806 2.792088309182241,-0.994521895368273 2.895471536732346,-1 3,-0.994521895368273 3.104528463267653,-0.978147600733806 3.207911690817759,-0.951056516295154 3.309016994374948,-0.913545457642601 3.4067366430758,-0.866025403784439 3.5,-0.809016994374948 3.587785252292473,-0.743144825477394 3.669130606358858,-0.669130606358858 3.743144825477394,-0.587785252292473 3.809016994374948,-0.5 3.866025403784438,-0.4067366430758 3.913545457642601,-0.309016994374948 3.951056516295154,-0.20791169081776 3.978147600733806,-0.104528463267653 3.994521895368274,0 4,0.209056926535307 3.989043790736547,0.415823381635519 3.956295201467611,0.618033988749895 3.902113032590307,0.8134732861516 3.827090915285202,1.0 3.732050807568877,1.175570504584946 3.618033988749895,1.338261212717717 3.486289650954788,1.486289650954789 3.338261212717717,1.618033988749895 3.175570504584946,1.732050807568877 3.0,1.827090915285202 2.8134732861516,1.902113032590307 2.618033988749895,1.956295201467611 2.415823381635519,1.989043790736547 2.209056926535307,2 2,1.989043790736547 1.790943073464693,1.956295201467611 1.584176618364481,1.902113032590307 1.381966011250105,1.827090915285202 1.1865267138484,1.732050807568877 1.0,1.618033988749895 0.824429495415054,1.486289650954789 0.661738787282284,1.338261212717717 0.513710349045212,1.175570504584946 0.381966011250105,1.0 0.267949192431123,0.8134732861516 0.172909084714798,0.618033988749895 0.097886967409693,0.415823381635519 0.043704798532389,0.209056926535307 0.010956209263453,0.0 0.0)' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test handling of specialized Oracle circular arc polygon Geometries. def test_ogr_oci_13(): if gdaltest.oci_ds is None: pytest.skip() # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 13, SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,2), -- compound line string SDO_ORDINATE_ARRAY(0,0, 1,1, 0,2, -1,3, 0,4, 2,2, 0,0 ) ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 13') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'POLYGON ((0.0 0.0,0.104528463267653 0.005478104631727,0.207911690817759 0.021852399266194,0.309016994374947 0.048943483704846,0.4067366430758 0.086454542357399,0.5 0.133974596215561,0.587785252292473 0.190983005625053,0.669130606358858 0.256855174522606,0.743144825477394 0.330869393641142,0.809016994374947 0.412214747707527,0.866025403784439 0.5,0.913545457642601 0.5932633569242,0.951056516295154 0.690983005625053,0.978147600733806 0.792088309182241,0.994521895368273 0.895471536732347,1 1,0.994521895368273 1.104528463267654,0.978147600733806 1.207911690817759,0.951056516295154 1.309016994374948,0.913545457642601 1.4067366430758,0.866025403784439 1.5,0.809016994374947 1.587785252292473,0.743144825477394 1.669130606358858,0.669130606358858 1.743144825477394,0.587785252292473 1.809016994374948,0.5 1.866025403784439,0.4067366430758 1.913545457642601,0.309016994374947 1.951056516295154,0.207911690817759 1.978147600733806,0.104528463267653 1.994521895368273,0 2,-0.104528463267653 2.005478104631727,-0.207911690817759 2.021852399266194,-0.309016994374947 2.048943483704846,-0.4067366430758 2.086454542357399,-0.5 2.133974596215561,-0.587785252292473 2.190983005625053,-0.669130606358858 2.256855174522606,-0.743144825477394 2.330869393641142,-0.809016994374947 2.412214747707527,-0.866025403784439 2.5,-0.913545457642601 2.593263356924199,-0.951056516295154 2.690983005625053,-0.978147600733806 2.792088309182241,-0.994521895368273 2.895471536732346,-1 3,-0.994521895368273 3.104528463267653,-0.978147600733806 3.207911690817759,-0.951056516295154 3.309016994374948,-0.913545457642601 3.4067366430758,-0.866025403784439 3.5,-0.809016994374948 3.587785252292473,-0.743144825477394 3.669130606358858,-0.669130606358858 3.743144825477394,-0.587785252292473 3.809016994374948,-0.5 3.866025403784438,-0.4067366430758 3.913545457642601,-0.309016994374948 3.951056516295154,-0.20791169081776 3.978147600733806,-0.104528463267653 3.994521895368274,0 4,0.209056926535307 3.989043790736547,0.415823381635519 3.956295201467611,0.618033988749895 3.902113032590307,0.8134732861516 3.827090915285202,1.0 3.732050807568877,1.175570504584946 3.618033988749895,1.338261212717717 3.486289650954788,1.486289650954789 3.338261212717717,1.618033988749895 3.175570504584946,1.732050807568877 3.0,1.827090915285202 2.8134732861516,1.902113032590307 2.618033988749895,1.956295201467611 2.415823381635519,1.989043790736547 2.209056926535307,2 2,1.989043790736547 1.790943073464693,1.956295201467611 1.584176618364481,1.902113032590307 1.381966011250105,1.827090915285202 1.1865267138484,1.732050807568877 1.0,1.618033988749895 0.824429495415054,1.486289650954789 0.661738787282284,1.338261212717717 0.513710349045212,1.175570504584946 0.381966011250105,1.0 0.267949192431123,0.8134732861516 0.172909084714798,0.618033988749895 0.097886967409693,0.415823381635519 0.043704798532389,0.209056926535307 0.010956209263453,0.0 0.0))' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test handling of compount linestring. def test_ogr_oci_14(): if gdaltest.oci_ds is None: pytest.skip() # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 11, SDO_GEOMETRY( 2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), -- compound line string SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10) ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 11') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'LINESTRING (10 10 0,10 14 0,9.581886146929387 13.978087581473094 0,9.168353236728963 13.912590402935223 0,8.76393202250021 13.804226065180615 0,8.373053427696799 13.654181830570405 0,8.0 13.464101615137755 0,7.648858990830108 13.23606797749979 0,7.323477574564567 12.972579301909576 0,7.027420698090424 12.676522425435433 0,6.76393202250021 12.351141009169893 0,6.535898384862245 12.0 0,6.345818169429597 11.626946572303202 0,6.195773934819385 11.23606797749979 0,6.087409597064777 10.831646763271037 0,6.021912418526907 10.418113853070615 0,6 10 0,6.021912418526906 9.581886146929389 0,6.087409597064777 9.168353236728963 0,6.195773934819385 8.763932022500208 0,6.345818169429595 8.373053427696801 0,6.535898384862246 8.0 0,6.76393202250021 7.648858990830108 0,7.027420698090423 7.323477574564567 0,7.323477574564566 7.027420698090424 0,7.648858990830107 6.76393202250021 0,8 6.535898384862247 0,8.373053427696799 6.345818169429596 0,8.76393202250021 6.195773934819385 0,9.168353236728962 6.087409597064777 0,9.581886146929387 6.021912418526906 0,10 6 0,10.418113853070611 6.021912418526906 0,10.831646763271035 6.087409597064777 0,11.23606797749979 6.195773934819385 0,11.626946572303202 6.345818169429597 0,12.0 6.535898384862246 0,12.351141009169892 6.76393202250021 0,12.676522425435431 7.027420698090422 0,12.972579301909576 7.323477574564567 0,13.23606797749979 7.648858990830107 0,13.464101615137753 8 0,13.654181830570405 8.373053427696799 0,13.804226065180615 8.76393202250021 0,13.912590402935223 9.16835323672896 0,13.978087581473094 9.581886146929387 0,14.0 10 0)' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test handling of compount polygon. def test_ogr_oci_15(): if gdaltest.oci_ds is None: pytest.skip() # insert a rectangle geometry. gdaltest.oci_ds.ExecuteSQL(""" INSERT INTO geom_test VALUES( 21, SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1005,2, 1,1003,1, 3,1003,2), SDO_ORDINATE_ARRAY(-10,10, 10,10, 0,0, -10,10) ) ) """) sql_lyr = gdaltest.oci_ds.ExecuteSQL('select * from geom_test where ora_fid = 21') feat_read = sql_lyr.GetNextFeature() expected_wkt = 'POLYGON ((-10 10 0,10 10 0,9.945218953682733 8.954715367323466 0,9.781476007338057 7.920883091822407 0,9.510565162951535 6.909830056250526 0,9.135454576426008 5.932633569241999 0,8.660254037844387 5.0 0,8.090169943749475 4.122147477075268 0,7.431448254773942 3.308693936411418 0,6.691306063588582 2.568551745226059 0,5.877852522924732 1.909830056250526 0,5.0 1.339745962155615 0,4.067366430758002 0.864545423573992 0,3.090169943749475 0.489434837048465 0,2.079116908177594 0.218523992661945 0,1.045284632676535 0.054781046317267 0,0.0 0.0 0,-1.045284632676533 0.054781046317267 0,-2.079116908177591 0.218523992661943 0,-3.090169943749474 0.489434837048464 0,-4.067366430758001 0.86454542357399 0,-5 1.339745962155613 0,-5.87785252292473 1.909830056250526 0,-6.691306063588582 2.568551745226058 0,-7.43144825477394 3.308693936411417 0,-8.090169943749473 4.122147477075267 0,-8.660254037844387 5.0 0,-9.135454576426007 5.932633569241996 0,-9.510565162951535 6.909830056250526 0,-9.781476007338057 7.920883091822407 0,-9.945218953682733 8.954715367323463 0,-10 10 0))' tr = 1 if ogrtest.check_feature_geometry(feat_read, expected_wkt) != 0: tr = 0 print(feat_read.GetGeometryRef().ExportToWkt()) feat_read.Destroy() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test deleting an existing layer. def test_ogr_oci_16(): if gdaltest.oci_ds is None: pytest.skip() target_index = -1 lc = gdaltest.oci_ds.GetLayerCount() for i in range(lc): lyr = gdaltest.oci_ds.GetLayer(i) if lyr.GetName() == 'TESTSRS2': target_index = i break lyr = None assert target_index != -1, 'did not find testsrs2 layer' result = gdaltest.oci_ds.DeleteLayer(target_index) assert result == 0, 'DeleteLayer() failed.' lyr = gdaltest.oci_ds.GetLayerByName('testsrs2') assert lyr is None, 'apparently failed to remove testsrs2 layer' ############################################################################### # Test that synctodisk actually sets the layer bounds metadata. def test_ogr_oci_17(): if gdaltest.oci_ds is None: pytest.skip() gdaltest.oci_ds.ExecuteSQL('DELLAYER:xpoly') ###################################################### # Create Oracle Layer gdaltest.oci_lyr = gdaltest.oci_ds.CreateLayer('xpoly') ###################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.oci_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ###################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.oci_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.oci_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() dst_feat.Destroy() ###################################################### # Create a distinct connection to the same database to monitor the # metadata table. oci_ds2 = ogr.Open(os.environ['OCI_DSNAME']) sql_lyr = oci_ds2.ExecuteSQL("select column_name from user_sdo_geom_metadata where table_name = 'XPOLY'") assert sql_lyr.GetFeatureCount() <= 0, 'user_sdo_geom_metadata already populated!' oci_ds2.ReleaseResultSet(sql_lyr) result = gdaltest.oci_ds.SyncToDisk() assert result == 0, 'SyncToDisk() failed.' sql_lyr = oci_ds2.ExecuteSQL("select column_name from user_sdo_geom_metadata where table_name = 'XPOLY'") assert sql_lyr.GetFeatureCount() != 0, 'user_sdo_geom_metadata still not populated!' oci_ds2.ReleaseResultSet(sql_lyr) oci_ds2 = None ############################################################################### # Test layer geometry types def test_ogr_oci_18(): if gdaltest.oci_ds is None: pytest.skip() wkts = ['POINT (0 1)', 'LINESTRING (0 1,2 3)', 'POLYGON ((0 0,1 0,1 1,0 1,0 0))', 'MULTIPOINT (0 1)', 'MULTILINESTRING ((0 1,2 3))', 'MULTIPOLYGON (((0 0,1 0,1 1,0 1,0 0)))', 'GEOMETRYCOLLECTION (POINT (0 1))', 'POINT (0 1 2)', 'LINESTRING (0 1 2,3 4 5)', 'POLYGON ((0 0 10,1 0 10,1 1 10,0 1 10,0 0 10))'] for wkt in wkts: g = ogr.CreateGeometryFromWkt(wkt) geomtype = g.GetGeometryType() strgeomtype = wkt[0:wkt.find(' ')] if geomtype & ogr.wkb25DBit: dim = 3 strgeomtype = strgeomtype + '3' else: dim = 2 lyr = gdaltest.oci_ds.CreateLayer('test_%s' % strgeomtype, geom_type=geomtype, options=['DIM=%d' % dim]) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(g) lyr.CreateFeature(feat) lyr.SyncToDisk() lyr = gdaltest.oci_ds.CreateLayer('test_NONE', geom_type=ogr.wkbNone) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) lyr.SyncToDisk() oci_ds2 = ogr.Open(os.environ['OCI_DSNAME']) for wkt in wkts: g = ogr.CreateGeometryFromWkt(wkt) strgeomtype = wkt[0:wkt.find(' ')] if strgeomtype == 'GEOMETRYCOLLECTION': geomtype = ogr.wkbUnknown else: geomtype = g.GetGeometryType() if geomtype & ogr.wkb25DBit: strgeomtype = strgeomtype + '3' lyr = oci_ds2.GetLayerByName('test_%s' % strgeomtype) assert lyr.GetGeomType() == geomtype, wkt feat = lyr.GetNextFeature() assert feat.GetGeometryRef().ExportToWkt() == wkt dsname = os.environ['OCI_DSNAME'] if '@' not in dsname: dsname = dsname + '@:test_NONE' else: dsname = dsname + ':test_NONE' oci_ds2 = ogr.Open(dsname) lyr = oci_ds2.GetLayerByName('test_NONE') assert lyr.GetGeomType() == ogr.wkbNone ############################################################################### # Test date / datetime def test_ogr_oci_19(): if gdaltest.oci_ds is None: pytest.skip() lyr = gdaltest.oci_ds.CreateLayer('testdate', geom_type=ogr.wkbNone) lyr.CreateField(ogr.FieldDefn('MYDATE', ogr.OFTDate)) lyr.CreateField(ogr.FieldDefn('MYDATETIME', ogr.OFTDateTime)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('MYDATE', '2015/02/03') feat.SetField('MYDATETIME', '2015/02/03 11:33:44') lyr.CreateFeature(feat) lyr.SyncToDisk() sql_lyr = gdaltest.oci_ds.ExecuteSQL('SELECT MYDATE, MYDATETIME FROM testdate') assert sql_lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTDate assert sql_lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTDateTime f = sql_lyr.GetNextFeature() if f.GetField(0) != '2015/02/03' or f.GetField(1) != '2015/02/03 11:33:44': f.DumpReadable() pytest.fail() gdaltest.oci_ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test not nullable fields def test_ogr_oci_20(): if gdaltest.oci_ds is None: pytest.skip() lyr = gdaltest.oci_ds.CreateLayer('ogr_oci_20', geom_type=ogr.wkbPoint, options=['GEOMETRY_NULLABLE=NO', 'DIM=2']) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 field_defn = ogr.FieldDefn('field_not_nullable', ogr.OFTString) field_defn.SetNullable(0) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nullable', ogr.OFTString) lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 1)')) ret = lyr.CreateFeature(f) f = None assert ret == 0 # Error case: missing geometry f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_not_nullable', 'not_null') gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None # Error case: missing non-nullable field f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 0)')) gdal.PushErrorHandler() ret = lyr.CreateFeature(f) gdal.PopErrorHandler() assert ret != 0 f = None lyr.SyncToDisk() # Test with nullable geometry lyr = gdaltest.oci_ds.CreateLayer('ogr_oci_20bis', geom_type=ogr.wkbPoint, options=['DIM=2']) assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 1 f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 1)')) ret = lyr.CreateFeature(f) f = None assert ret == 0 f = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.CreateFeature(f) f = None assert ret == 0 lyr.SyncToDisk() oci_ds2 = ogr.Open(os.environ['OCI_DSNAME']) lyr = oci_ds2.GetLayerByName('ogr_oci_20') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_not_nullable')).IsNullable() == 0 assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nullable')).IsNullable() == 1 assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 0 lyr = oci_ds2.GetLayerByName('ogr_oci_20bis') assert lyr.GetLayerDefn().GetGeomFieldDefn(0).IsNullable() == 1 feat = lyr.GetNextFeature() assert feat.GetGeometryRef() is not None feat = lyr.GetNextFeature() assert feat.GetGeometryRef() is None ############################################################################### # Test default values def test_ogr_oci_21(): if gdaltest.oci_ds is None: pytest.skip() lyr = gdaltest.oci_ds.CreateLayer('ogr_oci_21', geom_type=ogr.wkbPoint, options=['DIM=2']) field_defn = ogr.FieldDefn('field_string', ogr.OFTString) field_defn.SetDefault("'a''b'") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_int', ogr.OFTInteger) field_defn.SetDefault('123') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_real', ogr.OFTReal) field_defn.SetDefault('1.23') lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_nodefault', ogr.OFTInteger) lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime', ogr.OFTDateTime) field_defn.SetDefault("CURRENT_TIMESTAMP") lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('field_datetime2', ogr.OFTDateTime) field_defn.SetDefault("'2015/06/30 12:34:56'") lyr.CreateField(field_defn) # field_defn = ogr.FieldDefn( 'field_date', ogr.OFTDate ) # field_defn.SetDefault("CURRENT_DATE") # lyr.CreateField(field_defn) # field_defn = ogr.FieldDefn( 'field_time', ogr.OFTTime ) # field_defn.SetDefault("CURRENT_TIME") # lyr.CreateField(field_defn) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('field_string', 'c') f.SetField('field_int', 456) f.SetField('field_real', 4.56) f.SetField('field_datetime', '2015/06/30 12:34:56') f.SetField('field_datetime2', '2015/06/30 12:34:56') f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 1)')) lyr.CreateFeature(f) f = None # Transition from BoundCopy to UnboundCopy f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(0 1)')) lyr.CreateFeature(f) f = None lyr.SyncToDisk() oci_ds2 = ogr.Open(os.environ['OCI_DSNAME']) lyr = oci_ds2.GetLayerByName('ogr_oci_21') assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_string')).GetDefault() == "'a''b'" assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_int')).GetDefault() == '123' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_real')).GetDefault() == '1.23' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_nodefault')).GetDefault() is None assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime')).GetDefault() == 'CURRENT_TIMESTAMP' assert lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_datetime2')).GetDefault() == "'2015/06/30 12:34:56'" # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault() != "CURRENT_DATE": # gdaltest.post_reason('fail') # print(lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_date')).GetDefault()) # return 'fail' # if lyr.GetLayerDefn().GetFieldDefn(lyr.GetLayerDefn().GetFieldIndex('field_time')).GetDefault() != "CURRENT_TIME": # gdaltest.post_reason('fail') # return 'fail' f = lyr.GetNextFeature() if f.GetField('field_string') != 'c': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('field_string') != 'a\'b' or f.GetField('field_int') != 123 or \ f.GetField('field_real') != 1.23 or \ not f.IsFieldNull('field_nodefault') or not f.IsFieldSet('field_datetime') or \ f.GetField('field_datetime2') != '2015/06/30 12:34:56': f.DumpReadable() pytest.fail() gdal.Unlink('/vsimem/ogr_gpkg_24.gpkg') ############################################################################### # def test_ogr_oci_cleanup(): if gdaltest.oci_ds is None: pytest.skip() gdaltest.oci_ds.ExecuteSQL('DELLAYER:tpoly') gdaltest.oci_ds.ExecuteSQL('DELLAYER:xpoly') gdaltest.oci_ds.ExecuteSQL('DELLAYER:testsrs') gdaltest.oci_ds.ExecuteSQL('DELLAYER:testsrs2') gdaltest.oci_ds.ExecuteSQL('drop table geom_test') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_POINT') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_POINT3') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_LINESTRING') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_LINESTRING3') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_POLYGON') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_POLYGON3') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_MULTIPOINT') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_MULTILINESTRING') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_MULTIPOLYGON') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_GEOMETRYCOLLECTION') gdaltest.oci_ds.ExecuteSQL('DELLAYER:test_NONE') gdaltest.oci_ds.ExecuteSQL('DELLAYER:testdate') gdaltest.oci_ds.ExecuteSQL('DELLAYER:ogr_oci_20') gdaltest.oci_ds.ExecuteSQL('DELLAYER:ogr_oci_20bis') gdaltest.oci_ds.ExecuteSQL('DELLAYER:ogr_oci_21') gdaltest.oci_ds.Destroy() gdaltest.oci_ds = None gdaltest.shp_ds = None gdalautotest-3.0.4/ogr/ogr_cad.py0000755003401500001440000003152013614005365016376 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ################################################################################ # Project: OGR CAD Driver # Purpose: Tests OGR CAD Driver capabilities # Author: Alexandr Borzykh, mush3d at gmail.com # Author: Dmitry Baryshnikov, polimax@mail.ru # Language: Python ################################################################################ # The MIT License (MIT) # # Copyright (c) 2016 Alexandr Borzykh # Copyright (c) 2016-2019, 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 gdaltest import ogrtest from osgeo import gdal from osgeo import ogr import pytest ############################################################################### # Check driver existence. def test_ogr_cad_1(): gdaltest.cad_ds = None gdaltest.cad_dr = None gdaltest.cad_dr = ogr.GetDriverByName('CAD') if gdaltest.cad_dr is None: pytest.skip() ############################################################################### # Check driver properly opens simple file, reads correct feature (ellipse). def test_ogr_cad_2(): if gdaltest.cad_dr is None: pytest.skip() gdaltest.cad_ds = gdal.OpenEx('data/cad/ellipse_r2000.dwg', allowed_drivers=['CAD']) assert gdaltest.cad_ds is not None assert gdaltest.cad_ds.GetLayerCount() == 1, 'expected exactly one layer.' gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(0) assert gdaltest.cad_layer.GetName() == '0', \ 'layer name is expected to be default = 0.' defn = gdaltest.cad_layer.GetLayerDefn() assert defn.GetFieldCount() == 5, \ ('did not get expected number of fields in defn. got %d' % defn.GetFieldCount()) fc = gdaltest.cad_layer.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) gdaltest.cad_layer.ResetReading() feat = gdaltest.cad_layer.GetNextFeature() assert feat is not None, 'cad feature 0 get failed.' assert feat.cadgeom_type == 'CADEllipse', \ ('cad geometry type is wrong. Expected CADEllipse, got: %s' % feat.cadgeom_type) assert feat.GetFID() == 0, 'did not get expected FID for feature 0.' assert feat.thickness == 0, ('did not get expected thickness. expected 0, got: %f' % feat.thickness) assert feat.extentity_data is None, \ 'expected feature ExtendedEntityData to be null.' expected_style = 'PEN(c:#FFFFFFFF,w:5px)' assert feat.GetStyleString() == expected_style, \ ('got unexpected style string on feature 0:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) geom = feat.GetGeometryRef() assert geom is not None, 'cad geometry is None.' assert geom.GetGeometryType() == ogr.wkbLineString25D, \ 'did not get expected geometry type.' assert geom.GetPointCount() > 2, 'cad geometry is invalid' gdaltest.cad_ds = None ############################################################################### # Check proper read of 3 layers (one circle on each) with different parameters. def test_ogr_cad_3(): if gdaltest.cad_dr is None: pytest.skip() gdaltest.cad_ds = gdal.OpenEx('data/cad/triple_circles_r2000.dwg', allowed_drivers=['CAD']) assert gdaltest.cad_ds is not None assert gdaltest.cad_ds.GetLayerCount() == 3, 'expected 3 layers.' # test first layer and circle gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(0) assert gdaltest.cad_layer.GetName() == '0', \ 'layer name is expected to be default = 0.' defn = gdaltest.cad_layer.GetLayerDefn() assert defn.GetFieldCount() == 5, \ ('did not get expected number of fields in defn. got %d' % defn.GetFieldCount()) fc = gdaltest.cad_layer.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) gdaltest.cad_layer.ResetReading() feat = gdaltest.cad_layer.GetNextFeature() assert feat.cadgeom_type == 'CADCircle', \ ('cad geometry type is wrong. Expected CADCircle, got: %s' % feat.cadgeom_type) assert feat.thickness == 1.2, \ ('did not get expected thickness. expected 1.2, got: %f' % feat.thickness) assert feat.extentity_data is None, \ 'expected feature ExtendedEntityData to be null.' expected_style = 'PEN(c:#FFFFFFFF,w:5px)' assert feat.GetStyleString() == expected_style, \ ('Got unexpected style string on feature 0:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) geom = feat.GetGeometryRef() assert geom.GetGeometryType() == ogr.wkbCircularStringZ, \ 'did not get expected geometry type.' # test second layer and circle gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(1) assert gdaltest.cad_layer.GetName() == '1', 'layer name is expected to be 1.' defn = gdaltest.cad_layer.GetLayerDefn() assert defn.GetFieldCount() == 5, \ ('did not get expected number of fields in defn. got %d' % defn.GetFieldCount()) fc = gdaltest.cad_layer.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) gdaltest.cad_layer.ResetReading() feat = gdaltest.cad_layer.GetNextFeature() assert feat.cadgeom_type == 'CADCircle', \ ('cad geometry type is wrong. Expected CADCircle, got: %s' % feat.cadgeom_type) assert feat.thickness == 0.8, \ ('did not get expected thickness. expected 0.8, got: %f' % feat.thickness) assert feat.extentity_data is None, \ 'expected feature ExtendedEntityData to be null.' expected_style = 'PEN(c:#FFFFFFFF,w:5px)' assert feat.GetStyleString() == expected_style, \ ('Got unexpected style string on feature 0:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) geom = feat.GetGeometryRef() assert geom.GetGeometryType() == ogr.wkbCircularStringZ, \ 'did not get expected geometry type.' # test third layer and circle gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(2) assert gdaltest.cad_layer.GetName() == '2', 'layer name is expected to be 2.' defn = gdaltest.cad_layer.GetLayerDefn() assert defn.GetFieldCount() == 5, \ ('did not get expected number of fields in defn. got %d' % defn.GetFieldCount()) fc = gdaltest.cad_layer.GetFeatureCount() assert fc == 1, ('did not get expected feature count, got %d' % fc) gdaltest.cad_layer.ResetReading() feat = gdaltest.cad_layer.GetNextFeature() assert feat.cadgeom_type == 'CADCircle', \ ('cad geometry type is wrong. Expected CADCircle, got: %s' % feat.cadgeom_type) assert feat.thickness == 1.8, \ ('did not get expected thickness. expected 1.8, got: %f' % feat.thickness) assert feat.extentity_data is None, \ 'expected feature ExtendedEntityData to be null.' expected_style = 'PEN(c:#FFFFFFFF,w:5px)' assert feat.GetStyleString() == expected_style, \ ('Got unexpected style string on feature 0:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) geom = feat.GetGeometryRef() assert geom.GetGeometryType() == ogr.wkbCircularStringZ, \ 'did not get expected geometry type.' gdaltest.cad_ds = None ############################################################################### # Check reading of a single point. def test_ogr_cad_4(): if gdaltest.cad_dr is None: pytest.skip() gdaltest.cad_ds = gdal.OpenEx('data/cad/point2d_r2000.dwg', allowed_drivers=['CAD']) assert gdaltest.cad_ds.GetLayerCount() == 1, 'expected exactly one layer.' gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(0) assert gdaltest.cad_layer.GetFeatureCount() == 1, 'expected exactly one feature.' feat = gdaltest.cad_layer.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POINT (50 50 0)'), \ 'got feature which does not fit expectations.' gdaltest.cad_ds = None ############################################################################### # Check reading of a simple line. def test_ogr_cad_5(): if gdaltest.cad_dr is None: pytest.skip() gdaltest.cad_ds = gdal.OpenEx('data/cad/line_r2000.dwg', allowed_drivers=['CAD']) assert gdaltest.cad_ds.GetLayerCount() == 1, 'expected exactly one layer.' gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(0) assert gdaltest.cad_layer.GetFeatureCount() == 1, 'expected exactly one feature.' feat = gdaltest.cad_layer.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'LINESTRING (50 50 0,100 100 0)'), \ 'got feature which does not fit expectations.' gdaltest.cad_ds = None ############################################################################### # Check reading of a text (point with attached 'text' attribute, and set up # OGR feature style string to LABEL. def test_ogr_cad_6(): if gdaltest.cad_dr is None: pytest.skip() gdaltest.cad_ds = gdal.OpenEx('data/cad/text_mtext_attdef_r2000.dwg', allowed_drivers=['CAD']) assert gdaltest.cad_ds.GetLayerCount() == 1, 'expected exactly one layer.' gdaltest.cad_layer = gdaltest.cad_ds.GetLayer(0) assert gdaltest.cad_layer.GetFeatureCount() == 3, ('expected 3 features, got: %d' % gdaltest.cad_layer.GetFeatureCount()) feat = gdaltest.cad_layer.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POINT(0.7413 1.7794 0)') expected_style = 'LABEL(f:"Arial",t:"Русские буквы",c:#FFFFFFFF)' if feat.GetStyleString() != expected_style: gdaltest.post_reason('Got unexpected style string:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) return 'expected_fail' # cannot sure iconv is buildin ############################################################################### # Check MTEXT as TEXT geometry. def test_ogr_cad_7(): if gdaltest.cad_dr is None: pytest.skip() feat = gdaltest.cad_layer.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POINT(2.8139 5.7963 0)') expected_style = 'LABEL(f:"Arial",t:"English letters",c:#FFFFFFFF)' assert feat.GetStyleString() == expected_style, \ ('Got unexpected style string:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) ############################################################################### # Check ATTDEF as TEXT geometry. def test_ogr_cad_8(): if gdaltest.cad_dr is None: pytest.skip() feat = gdaltest.cad_layer.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POINT(4.98953601938918 2.62670161690571 0)') expected_style = 'LABEL(f:"Arial",t:"TESTTAG",c:#FFFFFFFF)' assert feat.GetStyleString() == expected_style, \ ('Got unexpected style string:\n%s\ninstead of:\n%s.' % (feat.GetStyleString(), expected_style)) ############################################################################### # Open a not handled DWG version def test_ogr_cad_9(): if gdaltest.cad_dr is None: pytest.skip() with gdaltest.error_handler(): ds = gdal.OpenEx('data/AC1018_signature.dwg', allowed_drivers=['CAD']) assert ds is None msg = gdal.GetLastErrorMsg() assert 'does not support this version' in msg ############################################################################### # Cleanup def test_ogr_cad_cleanup(): gdaltest.cad_layer = None gdaltest.cad_ds = None gdalautotest-3.0.4/ogr/ogr_shape.py0000755003401500001440000050573513614005365016765 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_shape.py 8b99fd4d3ad3db542705722876fcf484486f46d6 2019-12-17 14:27:30 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Shapefile driver testing. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2014, Even Rouault # # 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. ############################################################################### import os import shutil import struct import sys import gdaltest import ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Open Shapefile def test_ogr_shape_1(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_drv.DeleteDataSource('tmp') gdaltest.shape_ds = shape_drv.CreateDataSource('tmp') if gdaltest.shape_ds is not None: return pytest.fail() ############################################################################### # Create table from data/poly.shp def test_ogr_shape_2(): if gdaltest.shape_ds is None: pytest.skip() ####################################################### # Create memory Layer gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer('tpoly') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.shape_lyr, [('AREA', ogr.OFTReal), ('EAS_ID', ogr.OFTInteger), ('PRFEDEA', ogr.OFTString)]) ####################################################### # Copy in poly.shp dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) shp_ds = ogr.Open('data/poly.shp') gdaltest.shp_ds = shp_ds shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() gdaltest.poly_feat = [] while feat is not None: gdaltest.poly_feat.append(feat) dst_feat.SetFrom(feat) gdaltest.shape_lyr.CreateFeature(dst_feat) feat = shp_lyr.GetNextFeature() # Destroy required. shp_ds.Destroy() ############################################################################### # Verify that stuff we just wrote is still OK. def test_ogr_shape_3(): if gdaltest.shape_ds is None: pytest.skip() expect = [168, 169, 166, 158, 165] gdaltest.shape_lyr.SetAttributeFilter('eas_id < 170') tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'eas_id', expect) gdaltest.shape_lyr.SetAttributeFilter(None) for i in range(len(gdaltest.poly_feat)): orig_feat = gdaltest.poly_feat[i] read_feat = gdaltest.shape_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(read_feat, orig_feat.GetGeometryRef(), max_error=0.000000001) == 0) for fld in range(3): assert orig_feat.GetField(fld) == read_feat.GetField(fld), \ ('Attribute %d does not match' % fld) gdaltest.poly_feat = None assert tr ############################################################################### # Write a feature without a geometry, and verify that it works OK. def test_ogr_shape_4(): if gdaltest.shape_ds is None: pytest.skip() ###################################################################### # Create feature without geometry. dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetField('PRFEDEA', 'nulled') gdaltest.shape_lyr.CreateFeature(dst_feat) ###################################################################### # Read back the feature and get the geometry. gdaltest.shape_lyr.SetAttributeFilter("PRFEDEA = 'nulled'") feat_read = gdaltest.shape_lyr.GetNextFeature() assert feat_read is not None, 'Didnt get feature with null geometry back.' if feat_read.GetGeometryRef() is not None: print(feat_read.GetGeometryRef().ExportToWkt()) pytest.fail('Didnt get null geometry as expected.') ############################################################################### # Test ExecuteSQL() results layers without geometry. def test_ogr_shape_5(): if gdaltest.shape_ds is None: pytest.skip() expect = [179, 173, 172, 171, 170, 169, 168, 166, 165, 158, None] sql_lyr = gdaltest.shape_ds.ExecuteSQL('select distinct eas_id from tpoly order by eas_id desc') tr = ogrtest.check_features_against_list(sql_lyr, 'eas_id', expect) gdaltest.shape_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test ExecuteSQL() results layers with geometry. def test_ogr_shape_6(): if gdaltest.shape_ds is None: pytest.skip() sql_lyr = gdaltest.shape_ds.ExecuteSQL( "select * from tpoly where prfedea = '35043413'") tr = ogrtest.check_features_against_list(sql_lyr, 'prfedea', ['35043413']) if tr: sql_lyr.ResetReading() feat_read = sql_lyr.GetNextFeature() if ogrtest.check_feature_geometry(feat_read, 'POLYGON ((479750.688 4764702.000,479658.594 4764670.000,479640.094 4764721.000,479735.906 4764752.000,479750.688 4764702.000))', max_error=0.001) != 0: tr = 0 gdaltest.shape_ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test spatial filtering. def test_ogr_shape_7(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_lyr.SetAttributeFilter(None) geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.shape_lyr.SetSpatialFilter(geom) geom.Destroy() tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'eas_id', [158]) gdaltest.shape_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Create spatial index, and verify we get the same results. def test_ogr_shape_8(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_lyr.SetAttributeFilter(None) gdaltest.shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON tpoly') assert os.access('tmp/tpoly.qix', os.F_OK), 'tpoly.qix not created' geom = ogr.CreateGeometryFromWkt( 'LINESTRING(479505 4763195,480526 4762819)') gdaltest.shape_lyr.SetSpatialFilter(geom) geom.Destroy() tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'eas_id', [158]) gdaltest.shape_lyr.SetSpatialFilter(None) assert tr # Test recreating while already existing gdaltest.shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON tpoly') gdaltest.shape_ds.ExecuteSQL('DROP SPATIAL INDEX ON tpoly') assert not os.access('tmp/tpoly.qix', os.F_OK), 'tpoly.qix not deleted' ############################################################################### # Test that we don't return a polygon if we are "inside" but non-overlapping. def test_ogr_shape_9(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_ds = None gdaltest.shape_ds = ogr.Open('data/testpoly.shp') gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) gdaltest.shape_lyr.SetSpatialFilterRect(-10, -130, 10, -110) if ogrtest.have_geos() and gdaltest.shape_lyr.GetFeatureCount() == 0: return if not ogrtest.have_geos() and gdaltest.shape_lyr.GetFeatureCount() == 1: return pytest.fail() ############################################################################### # Do a fair size query that should pull in a few shapes. def test_ogr_shape_10(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_lyr.SetSpatialFilterRect(-400, 22, -120, 400) tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'FID', [0, 4, 8]) assert tr ############################################################################### # Do a mixed indexed attribute and spatial query. def test_ogr_shape_11(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_lyr.SetAttributeFilter('FID = 5') gdaltest.shape_lyr.SetSpatialFilterRect(-400, 22, -120, 400) tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'FID', []) assert tr gdaltest.shape_lyr.SetAttributeFilter('FID = 4') gdaltest.shape_lyr.SetSpatialFilterRect(-400, 22, -120, 400) tr = ogrtest.check_features_against_list(gdaltest.shape_lyr, 'FID', [4]) gdaltest.shape_lyr.SetAttributeFilter(None) gdaltest.shape_lyr.SetSpatialFilter(None) assert tr ############################################################################### # Check that multipolygon of asm.shp is properly returned. def test_ogr_shape_12(): if gdaltest.shape_ds is None: pytest.skip() asm_ds = ogr.Open('data/asm.shp') asm_lyr = asm_ds.GetLayer(0) feat = asm_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.GetCoordinateDimension() == 2, 'dimension wrong.' assert geom.GetGeometryName() == 'MULTIPOLYGON', 'Geometry of wrong type.' assert geom.GetGeometryCount() == 5, 'Did not get the expected number of polygons.' counts = [15, 11, 17, 20, 9] for i in range(5): poly = geom.GetGeometryRef(i) assert poly.GetGeometryName() == 'POLYGON', \ 'Did not get right type for polygons' assert poly.GetGeometryCount() == 1, 'polygon with more than one ring.' pnt_count = poly.GetGeometryRef(0).GetPointCount() assert pnt_count == counts[i], ('Polygon %d has %d points instead of %d.' % (i, pnt_count, counts[i])) ############################################################################### # Perform a SetFeature() on a couple features, resetting the size. def test_ogr_shape_13(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_ds = None gdaltest.shape_ds = ogr.Open('tmp/tpoly.shp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) ###################################################################### # Update FID 9 (EAS_ID=170), making the polygon larger. feat = gdaltest.shape_lyr.GetFeature(9) feat.SetField('AREA', '6000.00') geom = ogr.CreateGeometryFromWkt( 'POLYGON ((0 0, 0 60, 100 60, 100 0, 200 30, 0 0))') feat.SetGeometry(geom) assert gdaltest.shape_lyr.SetFeature(feat) == 0, 'SetFeature() failed.' ###################################################################### # Update FID 8 (EAS_ID=165), making the polygon smaller. feat = gdaltest.shape_lyr.GetFeature(8) feat.SetField('AREA', '7000.00') geom = ogr.CreateGeometryFromWkt( 'POLYGON ((0 0, 0 60, 100 60, 100 0, 0 0))') feat.SetGeometry(geom) assert gdaltest.shape_lyr.SetFeature(feat) == 0, 'SetFeature() failed.' ############################################################################### # Verify last changes. def test_ogr_shape_14(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_ds = None gdaltest.shape_ds = ogr.Open('tmp/tpoly.shp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) ###################################################################### # Check FID 9. feat = gdaltest.shape_lyr.GetFeature(9) assert feat.GetField('AREA') == 6000.0, 'AREA update failed, FID 9.' assert ogrtest.check_feature_geometry(feat, 'POLYGON ((0 0, 0 60, 100 60, 100 0, 200 30, 0 0))') == 0, \ 'Geometry update failed, FID 9.' ###################################################################### # Update FID 8 (EAS_ID=165), making the polygon smaller. feat = gdaltest.shape_lyr.GetFeature(8) assert feat.GetField('AREA') == 7000.0, 'AREA update failed, FID 8.' assert ogrtest.check_feature_geometry(feat, 'POLYGON ((0 0, 0 60, 100 60, 100 0, 0 0))') == 0, \ 'Geometry update failed, FID 8.' ############################################################################### # Delete a feature, and verify reduced count. def test_ogr_shape_15(): if gdaltest.shape_ds is None: pytest.skip() ###################################################################### # Delete FID 9. assert gdaltest.shape_lyr.DeleteFeature(9) == 0, 'DeleteFeature failed.' ###################################################################### # Count features, verifying that none are FID 9. count = 0 feat = gdaltest.shape_lyr.GetNextFeature() while feat is not None: assert feat.GetFID() != 9, 'Still an FID 9 in dataset.' count = count + 1 feat = gdaltest.shape_lyr.GetNextFeature() assert count == 10, 'Did not get expected FID count.' ############################################################################### # Repack and verify a few things. def test_ogr_shape_16(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_ds.ExecuteSQL('REPACK tpoly') ###################################################################### # Count features. got_9 = 0 count = 0 gdaltest.shape_lyr.ResetReading() feat = gdaltest.shape_lyr.GetNextFeature() while feat is not None: if feat.GetFID() == 9: got_9 = 1 count = count + 1 feat = gdaltest.shape_lyr.GetNextFeature() assert count == 10, 'Did not get expected FID count.' assert got_9 != 0, 'Did not get FID 9 as expected.' feat = gdaltest.shape_lyr.GetFeature(9) ############################################################################### # Test adding a field to the schema of a populated layer. def test_ogr_shape_16_1(): if gdaltest.shape_ds is None: pytest.skip() ###################################################################### # Add a new field. field_defn = ogr.FieldDefn('NEWFLD', ogr.OFTString) field_defn.SetWidth(12) result = gdaltest.shape_lyr.CreateField(field_defn) assert result == 0, 'failed to create new field.' ###################################################################### # Check at least one feature. feat = gdaltest.shape_lyr.GetFeature(8) assert feat.EAS_ID == 165, 'Got wrong EAS_ID' assert feat.IsFieldNull('NEWFLD'), 'Expected NULL NEWFLD value!' ############################################################################### # Simple test with point shapefile with no associated .dbf def test_ogr_shape_17(): if gdaltest.shape_ds is None: pytest.skip() shutil.copy('data/can_caps.shp', 'tmp/can_caps.shp') shutil.copy('data/can_caps.shx', 'tmp/can_caps.shx') shp_ds = ogr.Open('tmp/can_caps.shp', update=1) shp_lyr = shp_ds.GetLayer(0) assert shp_lyr.GetLayerDefn().GetFieldCount() == 0, \ 'Unexpectedly got attribute fields.' count = 0 while 1: feat = shp_lyr.GetNextFeature() if feat is None: break # Re-write feature to test that we can use SetFeature() without # a DBF shp_lyr.SetFeature(feat) count += 1 assert count == 13, 'Got wrong number of features.' # Create new feature without a DBF feat = ogr.Feature(shp_lyr.GetLayerDefn()) shp_lyr.CreateFeature(feat) assert feat.GetFID() == 13, 'Got wrong FID.' shp_lyr = None shp_ds = None os.remove('tmp/can_caps.shp') os.remove('tmp/can_caps.shx') ############################################################################### # Test reading data/poly.PRJ file with mixed-case file name def test_ogr_shape_18(): shp_ds = ogr.Open('data/poly.shp') shp_lyr = shp_ds.GetLayer(0) srs_lyr = shp_lyr.GetSpatialRef() assert srs_lyr is not None, 'Missing projection definition.' assert srs_lyr.GetAuthorityCode(None) == '27700' ############################################################################### # Test polygon formation logic - recognising what rings are inner/outer # and deciding on polygon vs. multipolygon (#1217) def test_ogr_shape_19(): ds = ogr.Open('data/Stacks.shp') lyr = ds.GetLayer(0) lyr.ResetReading() feat = lyr.GetNextFeature() wkt = 'MULTIPOLYGON (((3115478.809630727861077 13939288.008583962917328,3134266.47213465673849 13971973.394036004319787,3176989.101938112173229 13957303.575368551537395,3198607.7820796193555 13921787.172278933227062,3169010.779504936654121 13891675.439224690198898,3120368.749186545144767 13897852.204979406669736,3115478.809630727861077 13939288.008583962917328),(3130405.993537959177047 13935427.529987264424562,3135038.567853996530175 13902742.144535223022103,3167209.22282647760585 13902227.414055664092302,3184452.693891727831215 13922559.267998272553086,3172871.258101634215564 13947781.061496697366238,3144561.081725850701332 13957818.305848112329841,3130405.993537959177047 13935427.529987264424562)),((3143016.890287171583623 13932596.512349685654044,3152282.038919246289879 13947266.331017138436437,3166179.761867358349264 13940060.104303302243352,3172099.162382294889539 13928221.303273428231478,3169268.144744716584682 13916897.23272311501205,3158201.439434182830155 13911235.197447959333658,3144818.446965630631894 13911749.927927518263459,3139928.507409813348204 13916382.502243556082249,3143016.890287171583623 13932596.512349685654044),(3149193.65604188805446 13926677.11183474957943,3150737.84748056717217 13918698.789401574060321,3158458.804673962760717 13919728.250360693782568,3164892.935668459162116 13923331.36371761187911,3163863.474709339439869 13928736.033752989023924,3157171.978475063573569 13935427.529987264424562,3149193.65604188805446 13926677.11183474957943)))' assert (ogrtest.check_feature_geometry(feat, wkt, max_error=0.00000001) == 0) ############################################################################### # Test empty multipoint, multiline, multipolygon. # From GDAL 1.6.0, the expected behaviour is to return a feature with a NULL geometry def test_ogr_shape_20(): if gdaltest.shape_ds is None: pytest.skip() ds = ogr.Open('data/emptymultipoint.shp') lyr = ds.GetLayer(0) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None assert feat.GetGeometryRef() is None ds = ogr.Open('data/emptymultiline.shp') lyr = ds.GetLayer(0) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None assert feat.GetGeometryRef() is None ds = ogr.Open('data/emptymultipoly.shp') lyr = ds.GetLayer(0) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None assert feat.GetGeometryRef() is None ############################################################################### # Test robutness towards broken/unfriendly shapefiles def test_ogr_shape_21(): if gdaltest.shape_ds is None: pytest.skip() files = ['data/buggypoint.shp', 'data/buggymultipoint.shp', 'data/buggymultiline.shp', 'data/buggymultipoly.shp', 'data/buggymultipoly2.shp'] for f in files: ds = ogr.Open(f) lyr = ds.GetLayer(0) lyr.ResetReading() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert feat.GetGeometryRef() is None # Test fix for #3665 lyr.ResetReading() (minx, maxx, miny, maxy) = lyr.GetExtent() lyr.SetSpatialFilterRect(minx + 1e-9, miny + 1e-9, maxx - 1e-9, maxy - 1e-9) gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetNextFeature() gdal.PopErrorHandler() assert feat is None or feat.GetGeometryRef() is None ############################################################################### # Test writing and reading all handled data types def test_ogr_shape_22(): if gdaltest.shape_ds is None: pytest.skip() ####################################################### # Create memory Layer gdaltest.shape_ds = None gdaltest.shape_ds = ogr.GetDriverByName('ESRI Shapefile').Open('tmp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer('datatypes') ####################################################### # Setup Schema ogrtest.quick_create_layer_def(gdaltest.shape_lyr, [('REAL', ogr.OFTReal), ('INTEGER', ogr.OFTInteger), ('STRING', ogr.OFTString), ('DATE', ogr.OFTDate)]) ####################################################### # Create a feature dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetField('REAL', 1.2) dst_feat.SetField('INTEGER', 3) dst_feat.SetField('STRING', 'aString') dst_feat.SetField('DATE', '2005/10/12') gdaltest.shape_lyr.CreateFeature(dst_feat) gdaltest.shape_ds = None ####################################################### # Read back the feature gdaltest.shape_ds = ogr.GetDriverByName('ESRI Shapefile').Open('tmp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayerByName('datatypes') feat_read = gdaltest.shape_lyr.GetNextFeature() assert (feat_read.GetField('REAL') == 1.2 and \ feat_read.GetField('INTEGER') == 3 and \ feat_read.GetField('STRING') == 'aString' and \ feat_read.GetFieldAsString('DATE') == '2005/10/12') ############################################################################### # Function used internally by ogr_shape_23. def ogr_shape_23_write_valid_and_invalid(layer_name, wkt, invalid_wkt, wkbType, isEmpty): ####################################################### # Create a layer if wkbType == ogr.wkbUnknown: gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer(layer_name) else: gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer(layer_name, geom_type=wkbType) ####################################################### # Write a geometry dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt(wkt)) gdaltest.shape_lyr.CreateFeature(dst_feat) ####################################################### # Write an invalid geometry for this layer type dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometryDirectly(ogr.CreateGeometryFromWkt(invalid_wkt)) gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.shape_lyr.CreateFeature(dst_feat) gdal.PopErrorHandler() ####################################################### # Check feature gdaltest.shape_ds = None gdaltest.shape_ds = ogr.GetDriverByName('ESRI Shapefile').Open('tmp', update=1) read_lyr = gdaltest.shape_ds.GetLayerByName(layer_name) assert read_lyr.GetFeatureCount() == 1, layer_name feat_read = read_lyr.GetNextFeature() if isEmpty and feat_read.GetGeometryRef() is None: return assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt(wkt), max_error=0.000000001) == 0), \ feat_read.GetGeometryRef().ExportToWkt() def ogr_shape_23_write_geom(layer_name, geom, expected_geom, wkbType): ####################################################### # Create a layer if wkbType == ogr.wkbUnknown: gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer(layer_name) else: gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer(layer_name, geom_type=wkbType) ####################################################### # Write a geometry dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdaltest.shape_lyr.CreateFeature(dst_feat) ####################################################### # Check feature gdaltest.shape_lyr = None gdaltest.shape_ds = None gdaltest.shape_ds = ogr.GetDriverByName('ESRI Shapefile').Open('tmp', update=1) read_lyr = gdaltest.shape_ds.GetLayerByName(layer_name) assert read_lyr.GetFeatureCount() == 1 feat_read = read_lyr.GetNextFeature() if expected_geom is None: assert feat_read.GetGeometryRef() is None, feat_read.GetGeometryRef().ExportToWkt() return assert (ogrtest.check_feature_geometry(feat_read, expected_geom, max_error=0.000000001) == 0), \ feat_read.GetGeometryRef().ExportToWkt() ############################################################################### # Test writing and reading all handled geometry types def test_ogr_shape_23(): if gdaltest.shape_ds is None: pytest.skip() test_geom_array = [ ('points', 'POINT(0 1)', 'LINESTRING(0 1)', ogr.wkbPoint), ('points25D', 'POINT(0 1 2)', 'LINESTRING(0 1)', ogr.wkbPoint25D), ('multipoints', 'MULTIPOINT(0 1,2 3)', 'POINT (0 1)', ogr.wkbMultiPoint), ('multipoints25D', 'MULTIPOINT(0 1 2,3 4 5)', 'POINT (0 1)', ogr.wkbMultiPoint25D), ('linestrings', 'LINESTRING(0 1,2 3,4 5,0 1)', 'POINT (0 1)', ogr.wkbLineString), ('linestrings25D', 'LINESTRING(0 1 2,3 4 5,6 7 8,0 1 2)', 'POINT (0 1)', ogr.wkbLineString25D), ('multilinestrings', 'MULTILINESTRING((0 1,2 3,4 5,0 1), (0 1,2 3,4 5,0 1))', 'POINT (0 1)', ogr.wkbMultiLineString), ('multilinestrings25D', 'MULTILINESTRING((0 1 2,3 4 5,6 7 8,0 1 2),(0 1 2,3 4 5,6 7 8,0 1 2))', 'POINT (0 1)', ogr.wkbMultiLineString25D), ('polygons', 'POLYGON((0 0,0 10,10 10,0 0),(0.25 0.5,1 1,0.5 1,0.25 0.5))', 'POINT (0 1)', ogr.wkbPolygon), ('polygons25D', 'POLYGON((0 0 2,0 10 5,10 10 8,0 1 2))', 'POINT (0 1)', ogr.wkbPolygon25D), ('multipolygons', 'MULTIPOLYGON(((0 0,0 10,10 10,0 0),(0.25 0.5,1 1,0.5 1,0.25 0.5)),((100 0,100 10,110 10,100 0),(100.25 0.5,100.5 1,100 1,100.25 0.5)))', 'POINT (0 1)', ogr.wkbMultiPolygon), ('multipolygons25D', 'MULTIPOLYGON(((0 0 0,0 10,10 10,0 0),(0.25 0.5,1 1,0.5 1,0.25 0.5)),((100 0,100 10,110 10,100 0),(100.25 0.5,100.5 1,100 1,100.25 0.5)))', 'POINT (0 1)', ogr.wkbMultiPolygon25D), ] test_empty_geom_array = [ ('emptypoints', 'POINT EMPTY', 'LINESTRING(0 1)', ogr.wkbPoint), ('emptymultipoints', 'MULTIPOINT EMPTY', 'POINT(0 1)', ogr.wkbMultiPoint), ('emptylinestrings', 'LINESTRING EMPTY', 'POINT(0 1)', ogr.wkbLineString), ('emptymultilinestrings', 'MULTILINESTRING EMPTY', 'POINT(0 1)', ogr.wkbMultiLineString), ('emptypolygons', 'POLYGON EMPTY', 'POINT(0 1)', ogr.wkbPolygon), ('emptymultipolygons', 'MULTIPOLYGON EMPTY', 'POINT(0 1)', ogr.wkbMultiPolygon), ] ####################################################### # Write a feature in a new layer (geometry type unset at layer creation) for item in test_geom_array: ogr_shape_23_write_valid_and_invalid(item[0], item[1], item[2], ogr.wkbUnknown, 0) for item in test_empty_geom_array: ogr_shape_23_write_valid_and_invalid(item[0], item[1], item[2], ogr.wkbUnknown, 1) ####################################################### # Same test but use the wkb type when creating the layer gdaltest.shape_ds = None shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_drv.DeleteDataSource('tmp') gdaltest.shape_ds = shape_drv.CreateDataSource('tmp') for item in test_geom_array: ogr_shape_23_write_valid_and_invalid(item[0], item[1], item[2], item[3], 0) for item in test_empty_geom_array: ogr_shape_23_write_valid_and_invalid(item[0], item[1], item[2], item[3], 1) ####################################################### # Test writing of a geometrycollection layer_name = 'geometrycollections' gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer(layer_name, geom_type=ogr.wkbMultiPolygon) # This geometry collection is not compatible with a multipolygon layer geom = ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT (0 0))') dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdal.PushErrorHandler('CPLQuietErrorHandler') gdaltest.shape_lyr.CreateFeature(dst_feat) gdal.PopErrorHandler() # This geometry will be dealt as a multipolygon wkt = 'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,0 0),(0.25 0.5,1 1,0.5 1,0.25 0.5)),POLYGON((100 0,100 10,110 10,100 0),(100.25 0.5,100.5 1,100 1,100.25 0.5)))' geom = ogr.CreateGeometryFromWkt(wkt) dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) gdaltest.shape_lyr.CreateFeature(dst_feat) gdaltest.shape_ds = None gdaltest.shape_ds = ogr.GetDriverByName('ESRI Shapefile').Open('tmp', update=1) read_lyr = gdaltest.shape_ds.GetLayerByName(layer_name) feat_read = read_lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('MULTIPOLYGON(((0 0 0,0 10,10 10,0 0),(0.25 0.5,1 1,0.5 1,0.25 0.5)),((100 0,100 10,110 10,100 0),(100.25 0.5,100.5 1,100 1,100.25 0.5)))'), max_error=0.000000001) == 0), \ feat_read.GetGeometryRef().ExportToWkt() ####################################################### # Test writing of a multipoint with an empty point inside layer_name = 'strangemultipoints' wkt = 'MULTIPOINT(0 1)' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbPoint)) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ####################################################### # Test writing of a multilinestring with an empty linestring inside layer_name = 'strangemultilinestrings' wkt = 'MULTILINESTRING((0 1,2 3,4 5,0 1), (0 1,2 3,4 5,0 1))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbLineString)) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ####################################################### # Test writing of a polygon with an empty external ring layer_name = 'polygonwithemptyexternalring' geom = ogr.CreateGeometryFromWkt('POLYGON EMPTY') geom.AddGeometry(ogr.Geometry(type=ogr.wkbLinearRing)) ring = ogr.Geometry(type=ogr.wkbLinearRing) ring.AddPoint_2D(0, 0) ring.AddPoint_2D(10, 0) ring.AddPoint_2D(10, 10) ring.AddPoint_2D(0, 10) ring.AddPoint_2D(0, 0) geom.AddGeometry(ring) ogr_shape_23_write_geom(layer_name, geom, None, ogr.wkbUnknown) ####################################################### # Test writing of a polygon with an empty external ring layer_name = 'polygonwithemptyinternalring' wkt = 'POLYGON((100 0,100 10,110 10,100 0))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbLinearRing)) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ####################################################### # Test writing of a multipolygon with an empty polygon and a polygon with an empty external ring layer_name = 'strangemultipolygons' wkt = 'MULTIPOLYGON(((0 0,0 10,10 10,0 0)), ((100 0,100 10,110 10,100 0)))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbPolygon)) poly = ogr.CreateGeometryFromWkt('POLYGON((100 0,100 10,110 10,100 0))') poly.AddGeometry(ogr.Geometry(type=ogr.wkbLinearRing)) geom.AddGeometry(poly) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ############################################################################### # Test reading a polygon whose outer and the inner ring touches at one point (#2589) def test_ogr_shape_24(): if gdaltest.shape_ds is None: pytest.skip() layer_name = 'touchingrings' wkt = 'MULTIPOLYGON(((0 0,0 10,10 10,0 0), (0 0,1 1,0 1,0 0)), ((100 100,100 200,200 200,200 100,100 100)))' geom = ogr.CreateGeometryFromWkt(wkt) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ############################################################################### # Test reading a multipolygon with one part inside the bounding box of the other # part, but not inside it, and sharing the same first point... (#2589) def test_ogr_shape_25(): layer_name = 'touchingrings2' wkt = 'MULTIPOLYGON(((10 5, 5 5,5 0,0 0,0 10,10 10,10 5)),((10 5,10 0,5 0,5 4.9,10 5)), ((100 100,100 200,200 200,200 100,100 100)))' geom = ogr.CreateGeometryFromWkt(wkt) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) # Same test, but use OGR_ORGANIZE_POLYGONS=DEFAULT to avoid relying only on the winding order layer_name = 'touchingrings3' wkt = 'MULTIPOLYGON(((10 5, 5 5,5 0,0 0,0 10,10 10,10 5)),((10 5,10 0,5 0,5 4.9,10 5)), ((100 100,100 200,200 200,200 100,100 100)))' geom = ogr.CreateGeometryFromWkt(wkt) gdal.SetConfigOption('OGR_ORGANIZE_POLYGONS', 'DEFAULT') ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) gdal.SetConfigOption('OGR_ORGANIZE_POLYGONS', '') ############################################################################### # Test a polygon made of one outer ring and two inner rings (special case # in organizePolygons() def test_ogr_shape_26(): layer_name = 'oneouterring' wkt = 'POLYGON ((100 100,100 200,200 200,200 100,100 100),(110 110,120 110,120 120,110 120,110 110),(130 110,140 110,140 120,130 120,130 110))' geom = ogr.CreateGeometryFromWkt(wkt) ogr_shape_23_write_geom(layer_name, geom, ogr.CreateGeometryFromWkt(geom.ExportToWkt()), ogr.wkbUnknown) ############################################################################### # Test alternate date formatting (#2746) def test_ogr_shape_27(): ds = ogr.Open('data/water_main_dist.dbf') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.installe_1 == '1989/04/25', 'got wrong date result!' feat = None lyr = None ds = None ############################################################################### # Test reading a 3 GB .DBF (#3011) def test_ogr_shape_28(): # Determine if the filesystem supports sparse files (we don't want to create a real 3 GB # file ! if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() for filename in ('tmp/hugedbf.dbf', 'tmp/hugedbf.shp', 'tmp/hugedbf.shx'): try: os.remove(filename) except OSError: pass ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/hugedbf.shp') lyr = ds.CreateLayer('test') field_defn = ogr.FieldDefn() field_defn.SetName('test') field_defn.SetWidth(99) lyr.CreateField(field_defn) ds = None os.remove('tmp/hugedbf.shp') os.remove('tmp/hugedbf.shx') f = open("tmp/hugedbf.dbf", "rb+") # Set record count to 24,000,000 f.seek(4, 0) f.write("\x00".encode('latin1')) f.write("\x36".encode('latin1')) f.write("\x6e".encode('latin1')) f.write("\x01".encode('latin1')) # Set value for record 23,900,000 at # offset 2,390,000,066 = (23,900,000 * (99 + 1) + 65) + 1 f.seek(2390000066, 0) f.write("value_over_2GB".encode('latin1')) # Extend to 3 GB file f.seek(3000000000, 0) f.write("0".encode('latin1')) f.close() ds = ogr.Open('tmp/hugedbf.dbf', update=1) assert ds is not None, 'Cannot open tmp/hugedbf.dbf' # Check that the hand-written value can be read back lyr = ds.GetLayer(0) feat = lyr.GetFeature(23900000) assert feat.GetFieldAsString(0) == 'value_over_2GB' # Update with a new value feat.SetField(0, 'updated_value') lyr.SetFeature(feat) feat = None # Test creating a feature over 2 GB file limit -> should work gdal.ErrorReset() feat = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret == 0 feat = None assert gdal.GetLastErrorMsg().find('2GB file size limit reached') >= 0, \ 'did not find expected warning' ds = None # Re-open and check the new value gdal.SetConfigOption('SHAPE_2GB_LIMIT', 'TRUE') ds = ogr.Open('tmp/hugedbf.dbf', 1) gdal.SetConfigOption('SHAPE_2GB_LIMIT', None) lyr = ds.GetLayer(0) feat = lyr.GetFeature(23900000) assert feat.GetFieldAsString(0) == 'updated_value' feat = None # Test creating a feature over 2 GB file limit -> should fail gdal.ErrorReset() feat = ogr.Feature(lyr.GetLayerDefn()) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 feat = None assert gdal.GetLastErrorMsg().find('2GB file size limit reached') >= 0, \ 'did not find expected warning' ds = None ############################################################################### # Test that REPACK doesn't change extension case (#3293) def test_ogr_shape_29(): os.mkdir('tmp/UPPERCASE') shutil.copy('data/poly.shp', 'tmp/UPPERCASE/UPPERCASE.SHP') shutil.copy('data/poly.shx', 'tmp/UPPERCASE/UPPERCASE.SHX') shutil.copy('data/poly.dbf', 'tmp/UPPERCASE/UPPERCASE.DBF') f = open('tmp/UPPERCASE/UPPERCASE.CPG', 'wb') f.write('UTF-8'.encode('ascii')) f.close() ds = ogr.Open('tmp/UPPERCASE', update=1) lyr = ds.GetLayer(0) lyr.DeleteFeature(0) ds.ExecuteSQL('REPACK UPPERCASE') ds = None lst = gdal.ReadDir('tmp/UPPERCASE') assert len(lst) == 6 for filename in lst: assert filename in ['.', '..', 'UPPERCASE.SHP', 'UPPERCASE.SHX', 'UPPERCASE.DBF', 'UPPERCASE.CPG'], \ lst assert 'packed' not in filename, lst ############################################################################### # Test that REPACK doesn't change extension case (#3293) def test_ogr_shape_30(): os.mkdir('tmp/lowercase') shutil.copy('data/poly.shp', 'tmp/lowercase/lowercase.shp') shutil.copy('data/poly.shx', 'tmp/lowercase/lowercase.shx') shutil.copy('data/poly.dbf', 'tmp/lowercase/lowercase.dbf') ds = ogr.Open('tmp/lowercase', update=1) lyr = ds.GetLayer(0) lyr.DeleteFeature(0) ds.ExecuteSQL('REPACK lowercase') ds = None lst = gdal.ReadDir('tmp/lowercase') assert len(lst) == 5 for filename in lst: assert filename in ['.', '..', 'lowercase.shp', 'lowercase.shx', 'lowercase.dbf'], lst ############################################################################### # Test truncation of long and duplicate field names. # FIXME: Empty field names are allowed now! def test_ogr_shape_31(): if gdaltest.shape_ds is None: pytest.skip() fields = [('a', ogr.OFTReal), ('A', ogr.OFTInteger), ('A_1', ogr.OFTInteger), ('A_1', ogr.OFTInteger), ('a_1_2', ogr.OFTInteger), ('aaaaaAAAAAb', ogr.OFTInteger), ('aAaaaAAAAAc', ogr.OFTInteger), ('aaaaaAAAABa', ogr.OFTInteger), ('aaaaaAAAABb', ogr.OFTInteger), ('aaaaaAAA_1', ogr.OFTInteger), ('aaaaaAAAABc', ogr.OFTInteger), ('aaaaaAAAABd', ogr.OFTInteger), ('aaaaaAAAABe', ogr.OFTInteger), ('aaaaaAAAABf', ogr.OFTInteger), ('aaaaaAAAABg', ogr.OFTInteger), ('aaaaaAAAABh', ogr.OFTInteger), ('aaaaaAAAABi', ogr.OFTInteger), ('aaaaaAAA10', ogr.OFTString), ('', ogr.OFTInteger), ('', ogr.OFTInteger)] expected_fields = ['a', 'A_1', 'A_1_1', 'A_1_2', 'a_1_2_1', 'aaaaaAAAAA', 'aAaaaAAA_1', 'aaaaaAAAAB', 'aaaaaAAA_2', 'aaaaaAAA_3', 'aaaaaAAA_4', 'aaaaaAAA_5', 'aaaaaAAA_6', 'aaaaaAAA_7', 'aaaaaAAA_8', 'aaaaaAAA_9', 'aaaaaAAA10', 'aaaaaAAA11', '', '_1'] ####################################################### # Create Layer gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer('Fields') ####################################################### # Setup Schema with weird field names gdal.PushErrorHandler('CPLQuietErrorHandler') ogrtest.quick_create_layer_def(gdaltest.shape_lyr, fields) gdal.PopErrorHandler() layer_defn = gdaltest.shape_lyr.GetLayerDefn() error_occurred = False for i in range(layer_defn.GetFieldCount()): if layer_defn.GetFieldDefn(i).GetNameRef() != expected_fields[i]: print('Expected ', expected_fields[i], ',but got', layer_defn.GetFieldDefn(i).GetNameRef()) error_occurred = True assert not error_occurred ############################################################################### # Test creating a nearly 4GB (2^32 Bytes) .shp (#3236) # Check for proper error report. # Assuming 2^32 is the max value for unsigned int. def test_ogr_shape_32(): # This test takes a few minutes and disk space. Hence, skipped by default. # To run this test, make sure that the directory BigFilePath points to has # 4.5 GB space available or give a new directory that does and delete the # directory afterwards. pytest.skip() # pylint: disable=unreachable # pylint: disable=unreachable from decimal import Decimal BigFilePath = '/tmp' ####################################################### # Create a layer shape_drv = ogr.GetDriverByName('ESRI Shapefile') gdaltest.shape_ds_big = shape_drv.CreateDataSource(BigFilePath) gdaltest.shape_lyr = gdaltest.shape_ds_big.CreateLayer("bigLayer", geom_type=ogr.wkbPolygon) ####################################################### # Write a geometry repeatedly. # File size is pre-calculated according to the geometry's size. wkt = 'POLYGON((0 0,0 10,10 10,0 0),(0.25 0.5,1 1.1,0.5 1,0.25 0.5))' geom = ogr.CreateGeometryFromWkt(wkt) geom.AddGeometry(ogr.Geometry(type=ogr.wkbPolygon)) ret = 0 n = 0 print('') for n in range(0, 22845571): dst_feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) dst_feat.SetGeometry(geom) ret = gdaltest.shape_lyr.CreateFeature(dst_feat) assert ret == 0 or n >= 22845570, 'File limit reached before 4GB!' if (n % 22846) == 0: sys.stdout.write('\r%.1f%% ' % (n / Decimal('228460.0'))) sys.stdout.flush() ####################################################### # Check some features gdaltest.shape_ds_big = None gdaltest.shape_ds_big = ogr.GetDriverByName('ESRI Shapefile').Open(BigFilePath, update=0) read_lyr = gdaltest.shape_ds_big.GetLayerByName('bigLayer') for i in [0, 1, read_lyr.GetFeatureCount() - 1]: feat_read = read_lyr.GetFeature(i) assert feat_read is not None, ('Could not retrieve geometry at FID', i) assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON((0 0,0 10,10 10,0 0),(0.25 0.5,1 1.1,0.5 1,0.25 0.5))'), max_error=0.000000001) == 0), \ ('Wrong geometry encountered at FID', i, ':', (feat_read.GetGeometryRef().ExportToWkt())) ############################################################################### # Check that we can detect correct winding order even with polygons with big # coordinate offset (#3356) def test_ogr_shape_33(): ds = ogr.Open('data/bigoffset.shp') lyr = ds.GetLayer(0) feat_read = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('MULTIPOLYGON( ((0 0,0 1,1 1,1 0,0 0)),((100000000000 100000000000,100000000000 100000000001,100000000001 100000000001,100000000001 100000000000,100000000000 100000000000)) )'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Check that we can write correct winding order even with polygons with big # coordinate offset (#33XX) def test_ogr_shape_34(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/bigoffset.shp') lyr = ds.CreateLayer('bigoffset') feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) geom_wkt = 'MULTIPOLYGON( ((0 0,0 1,1 1,1 0,0 0)),((100000000000 100000000000,100000000000 100000000001,100000000001 100000000001,100000000001 100000000000,100000000000 100000000000)) )' geom = ogr.CreateGeometryFromWkt(geom_wkt) feat.SetGeometry(geom) lyr.CreateFeature(feat) ds = None ds = ogr.Open('tmp/bigoffset.shp') lyr = ds.GetLayer(0) feat_read = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('MULTIPOLYGON( ((0 0,0 1,1 1,1 0,0 0)),((100000000000 100000000000,100000000000 100000000001,100000000001 100000000001,100000000001 100000000000,100000000000 100000000000)) )'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Check that we can read & write a VSI*L dataset def test_ogr_shape_35(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/test35.shp') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) lyr = ds.CreateLayer('test35', srs=srs) feat = ogr.Feature(feature_def=lyr.GetLayerDefn()) geom_wkt = 'POINT(0 1)' geom = ogr.CreateGeometryFromWkt(geom_wkt) feat.SetGeometry(geom) lyr.CreateFeature(feat) ds = None ds = ogr.Open('/vsimem/test35.shp') lyr = ds.GetLayer(0) srs_read = lyr.GetSpatialRef() assert srs_read.ExportToWkt() == srs.ExportToWkt(), 'did not get expected SRS' feat_read = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POINT(0 1)'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Check that we can read from the root of a .ZIP file def test_ogr_shape_36(): ds = ogr.Open('/vsizip/data/poly.zip') assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('OSGB') != -1, 'did not get expected SRS' feat_read = lyr.GetFeature(9) assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Check that we can read from the root of a .tar.gz file def test_ogr_shape_37(): ds = ogr.Open('/vsitar/data/poly.tar.gz') assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('OSGB') != -1, 'did not get expected SRS' for i in range(10): feat_read = lyr.GetNextFeature() if i == 9: assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) lyr.ResetReading() feat_read = lyr.GetFeature(9) assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ds = None gdal.Unlink('data/poly.tar.gz.properties') ############################################################################### # Check that we can read from a .tar file def test_ogr_shape_37_bis(): ds = ogr.Open('/vsitar/data/poly.tar') assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('OSGB') != -1, 'did not get expected SRS' for i in range(10): feat_read = lyr.GetNextFeature() if i == 9: assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) lyr.ResetReading() feat_read = lyr.GetFeature(9) assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('POLYGON ((479750.6875 4764702.0,479658.59375 4764670.0,479640.09375 4764721.0,479735.90625 4764752.0,479750.6875 4764702.0))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Check that we cannot create duplicated layers def test_ogr_shape_38(): ds = ogr.Open('/vsimem/', update=1) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('test35') gdal.PopErrorHandler() ds = None assert lyr is None, 'should not have created a new layer' ############################################################################### # Check that we can detect correct winding order even with polygons with big # coordinate offset (#3356) def test_ogr_shape_39(): ds = ogr.Open('data/multipatch.shp') lyr = ds.GetLayer(0) feat_read = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat_read, ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (TIN (((5 4 10,0 0 5,10 0 5,5 4 10)),((5 4 10,10 0 5,10 8 5,5 4 10)),((5 4 10,10 8 5,0 8 5,5 4 10)),((5 4 10,0 8 5,0 0 5,5 4 10))),TIN (((10 0 5,10 0 0,10 8 5,10 0 5)),((10 0 0,10 8 5,10 8 0,10 0 0)),((10 8 5,10 8 0,0 8 5,10 8 5)),((10 8 0,0 8 5,0 8 0,10 8 0)),((0 8 5,0 8 0,0 0 5,0 8 5)),((0 8 0,0 0 5,0 0 0,0 8 0))),MULTIPOLYGON (((0 0 0,0 0 5,10 0 5,10 0 0,6 0 0,6 0 3,4 0 3,4 0 0,0 0 0),(1 0 2,3 0 2,3 0 4,1 0 4,1 0 2),(7 0 2,9 0 2,9 0 4,7 0 4,7 0 2))))'), max_error=0.000000001) == 0), \ ('Wrong geometry : %s' % feat_read.GetGeometryRef().ExportToWkt()) ############################################################################### # Make some changes to a shapefile and check the index files. qix, sbn & sbx def test_ogr_shape_40(): if gdaltest.shape_ds is None: pytest.skip() datafiles = ('gjpoint.dbf', 'gjpoint.shp', 'gjpoint.shx') indexfiles = ('gjpoint.sbn', 'gjpoint.sbx', 'gjpoint.qix') for f in datafiles: shutil.copy(os.path.join('data', f), os.path.join('tmp', f)) for i in range(2): shutil.copy(os.path.join('data', indexfiles[i]), os.path.join('tmp', indexfiles[i])) gdaltest.shape_ds = ogr.Open('tmp/gjpoint.shp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) gdaltest.shape_lyr.SetAttributeFilter(None) gdaltest.shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON gjpoint') # Check if updating a feature removes the indices feat = gdaltest.shape_lyr.GetFeature(0) geom = ogr.CreateGeometryFromWkt('POINT (99 1)') feat.SetGeometry(geom) for f in indexfiles: assert os.path.exists(os.path.join('tmp', f)), ('SetFeature(): ' + f) gdaltest.shape_lyr.SetFeature(feat) for f in indexfiles: assert not os.path.exists(os.path.join('tmp', f)), ('SetFeature(): ' + f) # Check if adding a feature removes the indices for i in range(2): shutil.copy(os.path.join('data', indexfiles[i]), os.path.join('tmp', indexfiles[i])) gdaltest.shape_ds = ogr.Open('tmp/gjpoint.shp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) gdaltest.shape_lyr.SetAttributeFilter(None) gdaltest.shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON gjpoint') feat = ogr.Feature(gdaltest.shape_lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('POINT (98 2)') feat.SetGeometry(geom) feat.SetField('NAME', 'Point 2') feat.SetField('FID', '2') feat.SetFID(1) for f in indexfiles: assert os.path.exists(os.path.join('tmp', f)), ('CreateFeature(): ' + f) gdaltest.shape_lyr.CreateFeature(feat) for f in indexfiles: assert not os.path.exists(os.path.join('tmp', f)), ('CreateFeature(): ' + f) # Check if deleting a feature removes the indices for i in range(2): shutil.copy(os.path.join('data', indexfiles[i]), os.path.join('tmp', indexfiles[i])) gdaltest.shape_ds = ogr.Open('tmp/gjpoint.shp', update=1) gdaltest.shape_lyr = gdaltest.shape_ds.GetLayer(0) gdaltest.shape_lyr.SetAttributeFilter(None) gdaltest.shape_ds.ExecuteSQL('CREATE SPATIAL INDEX ON gjpoint') for f in indexfiles: assert os.path.exists(os.path.join('tmp', f)), ('DeleteFeature(): ' + f) assert gdaltest.shape_lyr.DeleteFeature(0) == 0, 'DeleteFeature failed.' for f in indexfiles: assert not os.path.exists(os.path.join('tmp', f)), ('DeleteFeature(): ' + f) ############################################################################### # Run test_ogrsf def test_ogr_shape_41(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() shutil.copy('data/poly.shp', 'tmp/poly.shp') shutil.copy('data/poly.shx', 'tmp/poly.shx') shutil.copy('data/poly.dbf', 'tmp/poly.dbf') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' -fsf tmp/poly.shp') os.remove('tmp/poly.shp') os.remove('tmp/poly.shx') os.remove('tmp/poly.dbf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Run test_ogrsf with -sql def test_ogr_shape_42(): import test_cli_utilities if test_cli_utilities.get_test_ogrsf_path() is None: pytest.skip() shutil.copy('data/poly.shp', 'tmp/poly.shp') shutil.copy('data/poly.shx', 'tmp/poly.shx') shutil.copy('data/poly.dbf', 'tmp/poly.dbf') ret = gdaltest.runexternal(test_cli_utilities.get_test_ogrsf_path() + ' tmp/poly.shp -sql "SELECT * FROM poly"') os.remove('tmp/poly.shp') os.remove('tmp/poly.shx') os.remove('tmp/poly.dbf') assert ret.find('INFO') != -1 and ret.find('ERROR') == -1 ############################################################################### # Test /vsizip//vsicurl/ def test_ogr_shape_43(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() conn = gdaltest.gdalurlopen('https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip') if conn is None: pytest.skip('cannot open URL') conn.close() ds = ogr.Open('/vsizip//vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip') assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('OSGB') != -1, 'did not get expected SRS' f = lyr.GetNextFeature() assert f is not None, 'did not get expected feature' ############################################################################### # Test /vsicurl/ on a directory def ogr_shape_44_DISABLED(): drv = gdal.GetDriverByName('HTTP') if drv is None: pytest.skip() conn = gdaltest.gdalurlopen('https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/poly.zip') if conn is None: pytest.skip('cannot open URL') conn.close() ds = ogr.Open('/vsicurl/https://raw.githubusercontent.com/OSGeo/gdal/master/autotest/ogr/data/testshp') assert ds is not None lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() wkt = srs.ExportToWkt() assert wkt.find('OSGB') != -1, 'did not get expected SRS' f = lyr.GetNextFeature() assert f is not None, 'did not get expected feature' ############################################################################### # Test ignored fields works ok on a shapefile. def test_ogr_shape_45(): shp_ds = ogr.Open('data/poly.shp') shp_layer = shp_ds.GetLayer(0) shp_layer.SetIgnoredFields(['AREA']) feat = shp_layer.GetNextFeature() assert not feat.IsFieldSet('AREA'), 'got area despite request to ignore it.' assert feat.GetFieldAsInteger('EAS_ID') == 168, 'missing or wrong eas_id' wkt = 'POLYGON ((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))' assert (ogrtest.check_feature_geometry(feat, wkt, max_error=0.00000001) == 0) fd = shp_layer.GetLayerDefn() fld = fd.GetFieldDefn(0) # area assert fld.IsIgnored(), 'AREA unexpectedly not marked as ignored.' fld = fd.GetFieldDefn(1) # eas_id assert not fld.IsIgnored(), 'EASI unexpectedly marked as ignored.' assert not fd.IsGeometryIgnored(), 'geometry unexpectedly ignored.' assert not fd.IsStyleIgnored(), 'style unexpectedly ignored.' fd.SetGeometryIgnored(1) assert fd.IsGeometryIgnored(), 'geometry unexpectedly not ignored.' feat = shp_layer.GetNextFeature() assert feat.GetGeometryRef() is None, 'Unexpectedly got a geometry on feature 2.' assert not feat.IsFieldSet('AREA'), 'got area despite request to ignore it.' assert feat.GetFieldAsInteger('EAS_ID') == 179, 'missing or wrong eas_id' feat = None shp_layer = None shp_ds = None ############################################################################### # This is a very weird use case : the user creates/open a datasource # made of a single shapefile 'foo.shp' and wants to add a new layer # to it, 'bar'. So we create a new shapefile 'bar.shp' in the same # directory as 'foo.shp' def test_ogr_shape_46(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_46.shp') ds.CreateLayer('you_can_put_here_what_you_want_i_dont_care') ds.CreateLayer('this_one_i_care_46') ds = None ds = ogr.Open('/vsimem/ogr_shape_46.shp') assert ds.GetLayerCount() == 1 ds = None ds = ogr.Open('/vsimem/this_one_i_care_46.shp') assert ds.GetLayerCount() == 1 ds = None ############################################################################### # Test that we can open a symlink whose pointed filename isn't a real # file, but a filename that OGR recognizes def test_ogr_shape_47(): if not gdaltest.support_symlink(): pytest.skip() gdal.Unlink('tmp/poly.zip') os.symlink('/vsizip/data/poly.zip', 'tmp/poly.zip') ds = ogr.Open('tmp/poly.zip') assert ds is not None, 'tmp/polyzip symlink does not open.' ds = None os.remove('tmp/poly.zip') ############################################################################### # Test RECOMPUTE EXTENT ON (#4027) def test_ogr_shape_48(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_48.shp') lyr = ds.CreateLayer('ogr_shape_48') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(1 2)')) lyr.CreateFeature(feat) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT(3 4)')) lyr.SetFeature(feat) extent = lyr.GetExtent() if extent != (1, 3, 2, 4): print(lyr.GetExtent()) pytest.fail('did not get expected extent (1)') ds.ExecuteSQL('RECOMPUTE EXTENT ON ogr_shape_48') extent = lyr.GetExtent() if extent != (3, 3, 4, 4): print(lyr.GetExtent()) pytest.fail('did not get expected extent (2)') ds = None ds = ogr.Open('/vsimem/ogr_shape_48.shp') lyr = ds.GetLayer(0) extent = lyr.GetExtent() if extent != (3, 3, 4, 4): print(lyr.GetExtent()) pytest.fail('did not get expected extent (3)') ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_48.shp') # Test with Polygon ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_48.shp') lyr = ds.CreateLayer('ogr_shape_48') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 -1,-1 -1,-1 0,0 0))')) lyr.CreateFeature(feat) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))')) lyr.SetFeature(feat) ds.ExecuteSQL('RECOMPUTE EXTENT ON ogr_shape_48') extent = lyr.GetExtent() if extent != (0, 1, 0, 1): print(lyr.GetExtent()) pytest.fail('did not get expected extent (4)') ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_48.shp') # Test with PolygonZ ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_48.shp') lyr = ds.CreateLayer('ogr_shape_48') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0 -2,0 -1 -2,-1 -1 -2,-1 0 -2,0 0 -2))')) lyr.CreateFeature(feat) feat.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0 2,0 1 2,1 1 2,1 0 2,0 0 2))')) lyr.SetFeature(feat) ds.ExecuteSQL('RECOMPUTE EXTENT ON ogr_shape_48') # FIXME: when we have a GetExtent3D extent = lyr.GetExtent() if extent != (0, 1, 0, 1): print(lyr.GetExtent()) pytest.fail('did not get expected extent (4)') ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_48.shp') ############################################################################### # Test that we can read at an LDID/87 file and recode to UTF-8. def test_ogr_shape_49(): ds = ogr.Open('data/facility_surface_dd.dbf') lyr = ds.GetLayer(0) feat = lyr.GetFeature(91) name = feat.GetField('NAME') # Setup the utf-8 string. if sys.version_info >= (3, 0, 0): gdaltest.exp_name = 'OSEBERG S\u00D8R' else: exec("gdaltest.exp_name = u'OSEBERG S\u00D8R'") gdaltest.exp_name = gdaltest.exp_name.encode('utf-8') assert name == gdaltest.exp_name, 'Did not get expected name, encoding problems?' ############################################################################### # Test that we can read encoded field names def test_ogr_shape_50(): ds = ogr.Open('data/chinese.dbf') if ds is None: pytest.skip() lyr = ds.GetLayer(0) reconv_possible = lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 if gdal.GetLastErrorMsg().find('Recode from CP936 to UTF-8 not supported, treated as ISO-8859-1 to UTF-8.') != -1: assert not reconv_possible, \ 'Recode failed, but TestCapability(OLCStringsAsUTF8) returns TRUE' pytest.skip('skipping test: iconv support needed') # Setup the utf-8 string. if sys.version_info >= (3, 0, 0): gdaltest.fieldname = '\u4e2d\u56fd' else: exec("gdaltest.fieldname = u'\u4e2d\u56fd'") gdaltest.fieldname = gdaltest.fieldname.encode('utf-8') assert lyr.GetLayerDefn().GetFieldIndex(gdaltest.fieldname) == 0, \ lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef() assert reconv_possible, 'TestCapability(OLCStringsAsUTF8) should return TRUE' ############################################################################### # Test that we can add a field when there's no dbf file initially def test_ogr_shape_51(): if int(gdal.VersionInfo('VERSION_NUM')) < 1900: pytest.skip('would crash') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_51.shp') lyr = ds.CreateLayer('ogr_shape_51') feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) ds = None gdal.Unlink('/vsimem/ogr_shape_51.dbf') ds = ogr.Open('/vsimem/ogr_shape_51.shp', update=1) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) feat = lyr.GetNextFeature() feat.SetField(0, 'bar') lyr.SetFeature(feat) ds = None ds = ogr.Open('/vsimem/ogr_shape_51.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() value = feat.GetFieldAsString(0) field_count = lyr.GetLayerDefn().GetFieldCount() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_51.shp') assert field_count == 1, 'did not get expected field count' assert value == 'bar', 'did not get expected value' ############################################################################### # Test fix for #3356 def test_ogr_shape_52(): expected_geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((175.524709766699999 -40.17203475,175.524757883299998 -40.172050566700001,175.52480505 -40.1720663,175.524858766699992 -40.172091433299997,175.524913916700001 -40.172112966699999,175.524966049999989 -40.172136933300003,175.525030633299991 -40.17216185,175.5250873 -40.17218215,175.52515168330001 -40.1722011,175.525217666700001 -40.172221216700002,175.525269416700013 -40.172234466699997,175.5253165 -40.1722478,175.52535415 -40.1722577667,175.52538385 -40.17226365,175.525436816699994 -40.1722814333,175.525507016700004 -40.17229905,175.525594783299994 -40.172322033299999,175.525669933300009 -40.172339533299997,175.52574 -40.17235335,175.525807566699996 -40.1723672,175.52585005 -40.17237395,175.52588115 -40.172378683300003,175.525969816700012 -40.172388633300002,175.526057266700008 -40.1724020833,175.52723455 -40.17253515,175.527275583299996 -40.1725388,175.527324533300003 -40.17254675,175.527394866700007 -40.172552766700001,175.527473066699997 -40.172561616700001,175.527576666700014 -40.172572916699998,175.527678333300003 -40.172584266699999,175.527787883299993 -40.17259845,175.52789345 -40.172609716700002,175.527953933300012 -40.17261295,175.528028083300001 -40.1726174,175.52809835 -40.1726219333,175.528151650000012 -40.172625833300003,175.528190349999988 -40.17262725,175.528230900000011 -40.172631183299998,175.5282776 -40.1726338,175.528322800000012 -40.172637633299999,175.5283648 -40.17263915,175.5284115 -40.172641766700004,175.528452133299993 -40.17264435,175.528492133300006 -40.172646033299998,175.52856465 -40.17264805,175.528621733300014 -40.1726492,175.52868035 -40.172650333299998,175.528751333299994 -40.172652383299997,175.528814566699992 -40.1726534,175.528883933299994 -40.172653116699998,175.528939383300013 -40.17265195,175.529002566700001 -40.1726518,175.529070350000012 -40.172650366699997,175.529136633299998 -40.17265015,175.529193616700013 -40.17264895,175.529250616700011 -40.172647733300003,175.529313800000011 -40.172647583299998,175.529376783299995 -40.172647016699997,175.52895773329999 -40.172694633299997,175.528450866700013 -40.172752216699998,175.52835635 -40.172753466700001,175.52741181670001 -40.1727757333,175.52685245 -40.172532333299998,175.52627245 -40.172501266700003,175.5262405167 -40.172502816700003,175.5258356 -40.172522816700003,175.5256125 -40.172533833300001,175.525424433300003 -40.172543116699998,175.524834133300004 -40.1725533,175.524739033299994 -40.172414983300001,175.5247128 -40.17207405,175.524709766699999 -40.17203475)),((175.531267916699989 -40.17286525,175.5312654 -40.172863283300003,175.531252849999987 -40.172853516700002,175.531054566699993 -40.172822366699997,175.530193283300008 -40.172687333299997,175.529890266699994 -40.1726398,175.529916116700008 -40.172639383300002,175.529972483300014 -40.172639216699999,175.53002885 -40.1726398,175.530085183300002 -40.17264115,175.530141500000013 -40.17264325,175.530197733300014 -40.172646133299999,175.530253916699991 -40.172649766699998,175.530309983299986 -40.172654166699999,175.53036595 -40.172659333299997,175.5304218 -40.17266525,175.53047748329999 -40.172671916699997,175.530533016699991 -40.17267935,175.5305883833 -40.1726875333,175.530643533300008 -40.172696466700003,175.530722333299991 -40.172710633299999,175.530800633300004 -40.1727263167,175.5308541 -40.17273795,175.5309073 -40.1727503,175.530960216700009 -40.172763366700003,175.531012816700013 -40.172777133300002,175.5310651 -40.1727916,175.53111705 -40.172806766699999,175.531168650000012 -40.172822633300001,175.531219883299997 -40.172839183299999,175.531270733300005 -40.1728564,175.531267916699989 -40.17286525)))') ds = ogr.Open('data/test3356.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, expected_geom, max_error=0.000000001) == 0), \ 'failed reading geom' ds = None ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_52.shp') lyr = ds.CreateLayer('ogr_shape_52') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(expected_geom) lyr.CreateFeature(feat) ds = None ds = ogr.Open('/vsimem/ogr_shape_52.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert (ogrtest.check_feature_geometry(feat, expected_geom, max_error=0.000000001) == 0), \ 'failed writing and reading back geom' ds = None ############################################################################### # Test various expected error cases def test_ogr_shape_53(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_53.shp') lyr = ds.CreateLayer('ogr_shape_53') # Test ReorderFields() when there are no fields ret = lyr.ReorderFields([]) assert ret == 0 # Test REPACK when there are no features gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ExecuteSQL("REPACK ogr_shape_53") gdal.PopErrorHandler() # Should work without any error assert gdal.GetLastErrorMsg() == '' # Create a field fd = ogr.FieldDefn("foo", ogr.OFTString) lyr.CreateField(fd) # GetFeature() on a invalid FID gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = lyr.GetFeature(-1) gdal.PopErrorHandler() assert feat is None and gdal.GetLastErrorMsg() != '' # SetFeature() on a invalid FID gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = ogr.Feature(lyr.GetLayerDefn()) ret = lyr.SetFeature(feat) feat = None gdal.PopErrorHandler() assert ret != 0 # SetFeature() on a invalid FID gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(1000) ret = lyr.SetFeature(feat) feat = None gdal.PopErrorHandler() assert ret != 0 # DeleteFeature() on a invalid FID gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(-1) gdal.PopErrorHandler() assert ret != 0 feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None ret = lyr.DeleteFeature(0) assert ret == 0 # Try deleting an already deleted feature gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(0) gdal.PopErrorHandler() assert ret != 0 # Test DeleteField() on a invalid index gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(-1) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test ReorderFields() with invalid permutation gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([1]) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test AlterFieldDefn() on a invalid index gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') fd = ogr.FieldDefn("foo2", ogr.OFTString) ret = lyr.AlterFieldDefn(-1, fd, 0) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test AlterFieldDefn() when attempting to convert from OFTString to something else gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') fd = ogr.FieldDefn("foo", ogr.OFTInteger) ret = lyr.AlterFieldDefn(0, fd, ogr.ALTER_TYPE_FLAG) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test DROP SPATIAL INDEX ON layer without index gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ExecuteSQL("DROP SPATIAL INDEX ON ogr_shape_53") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Re-create a feature feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) feat = None lyr = None ds = None # Test that some operations are not possible in read-only mode ds = ogr.Open('/vsimem/ogr_shape_53.shp') lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCSequentialWrite) == 0 assert lyr.TestCapability(ogr.OLCDeleteFeature) == 0 assert lyr.TestCapability(ogr.OLCCreateField) == 0 assert lyr.TestCapability(ogr.OLCDeleteField) == 0 assert lyr.TestCapability(ogr.OLCReorderFields) == 0 assert lyr.TestCapability(ogr.OLCAlterFieldDefn) == 0 # Test CreateField() fd = ogr.FieldDefn("bar", ogr.OFTString) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(fd) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test ReorderFields() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.ReorderFields([0]) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test DeleteField() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteField(0) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test AlterFieldDefn() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') fd = ogr.FieldDefn("foo2", ogr.OFTString) ret = lyr.AlterFieldDefn(0, fd, 0) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test CreateFeature() feat = ogr.Feature(lyr.GetLayerDefn()) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test DeleteFeature() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(0) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test SetFeature() feat = lyr.GetNextFeature() gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.SetFeature(feat) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test REPACK gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ExecuteSQL("REPACK ogr_shape_53") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' # Test RECOMPUTE EXTENT ON gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ExecuteSQL("RECOMPUTE EXTENT ON ogr_shape_53") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' feat = None lyr = None ds = None # Attempt to delete shape in shapefile with no .dbf file gdal.Unlink('/vsimem/ogr_shape_53.dbf') ds = ogr.Open('/vsimem/ogr_shape_53.shp', update=1) lyr = ds.GetLayer(0) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(0) gdal.PopErrorHandler() assert not (ret == 0 or gdal.GetLastErrorMsg() == '') # Test REPACK ds.ExecuteSQL("REPACK ogr_shape_53") lyr = None ds = None # Tests on a DBF only ds = ogr.Open('data/idlink.dbf') lyr = ds.GetLayer(0) # Test GetExtent() # FIXME : GetExtent() should fail. Currently we'll get garbage here lyr.GetExtent() # Test RECOMPUTE EXTENT ON gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = ds.ExecuteSQL("RECOMPUTE EXTENT ON ogr_shape_53") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' lyr = None ds = None ############################################################################### # Test accessing a shape datasource with hundreds of layers (#4306) def ogr_shape_54_create_layer(ds, layer_index): lyr = ds.CreateLayer('layer%03d' % layer_index) lyr.CreateField(ogr.FieldDefn('strfield', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'val%d' % layer_index) if (layer_index % 2) == 0: feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (%d %d)' % (layer_index, layer_index + 1))) lyr.CreateFeature(feat) feat = None def ogr_shape_54_test_layer(ds, layer_index): lyr = ds.GetLayerByName('layer%03d' % layer_index) assert lyr is not None, ('failed for layer %d' % layer_index) lyr.ResetReading() feat = lyr.GetNextFeature() assert feat is not None, ('failed for layer %d' % layer_index) assert feat.GetField(0) == 'val%d' % layer_index, \ ('failed for layer %d' % layer_index) if (layer_index % 2) == 0: assert (feat.GetGeometryRef() is not None and \ feat.GetGeometryRef().ExportToWkt() == 'POINT (%d %d)' % (layer_index, layer_index + 1)), \ ('failed for layer %d' % layer_index) def test_ogr_shape_54(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_54' # ds_name = 'tmp/ogr_shape_54' N = 500 LRUListSize = 100 # Test creating N layers ds = shape_drv.CreateDataSource(ds_name) for i in range(N): ogr_shape_54_create_layer(ds, i) ds = None # Test access to the N layers in sequence ds = ogr.Open(ds_name) for i in range(N): ogr_shape_54_test_layer(ds, i) # Now some 'random' access ogr_shape_54_test_layer(ds, N - 1 - LRUListSize) ogr_shape_54_test_layer(ds, N - LRUListSize / 2) ogr_shape_54_test_layer(ds, N - LRUListSize / 4) ogr_shape_54_test_layer(ds, 0) ogr_shape_54_test_layer(ds, 0) ogr_shape_54_test_layer(ds, 2) ogr_shape_54_test_layer(ds, 1) ds = None # Test adding a new layer ds = ogr.Open(ds_name, update=1) ogr_shape_54_create_layer(ds, N) ds = None # Test accessing the new layer ds = ogr.Open(ds_name) ogr_shape_54_test_layer(ds, N) ds = None # Test deleting layers ds = ogr.Open(ds_name, update=1) for i in range(N): ogr_shape_54_test_layer(ds, i) for i in range(N - LRUListSize + 1, N): ds.ExecuteSQL('DROP TABLE layer%03d' % i) ogr_shape_54_test_layer(ds, N - LRUListSize) ogr_shape_54_create_layer(ds, N + 2) for i in range(0, N - LRUListSize + 1): ds.ExecuteSQL('DROP TABLE layer%03d' % i) ogr_shape_54_test_layer(ds, N) ogr_shape_54_test_layer(ds, N + 2) ds = None # Destroy and recreate datasource shape_drv.DeleteDataSource(ds_name) ds = shape_drv.CreateDataSource(ds_name) for i in range(N): ogr_shape_54_create_layer(ds, i) ds = None # Reopen in read-only so as to be able to delete files */ # if testing on a real filesystem. ds = ogr.Open(ds_name) # Test corner case where we cannot reopen a closed layer ideletedlayer = 0 gdal.Unlink(ds_name + '/' + 'layer%03d.shp' % ideletedlayer) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.GetLayerByName('layer%03d' % ideletedlayer) gdal.PopErrorHandler() if lyr is not None: gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.ResetReading() lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '' gdal.ErrorReset() ideletedlayer = 1 gdal.Unlink(ds_name + '/' + 'layer%03d.dbf' % ideletedlayer) lyr = ds.GetLayerByName('layer%03d' % ideletedlayer) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.ResetReading() lyr.GetNextFeature() gdal.PopErrorHandler() # if gdal.GetLastErrorMsg() == '': # gdaltest.post_reason('failed') # return 'fail' gdal.ErrorReset() ds = None ############################################################################### # Test that we cannot add more fields that the maximum allowed def test_ogr_shape_55(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_55' ds = shape_drv.CreateDataSource(ds_name) lyr = ds.CreateLayer('ogr_shape_55') max_field_count = int((65535 - 33) / 32) # 2046 for i in range(max_field_count): if i == 255: gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(ogr.FieldDefn('foo%d' % i, ogr.OFTInteger)) if i == 255: gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', \ 'expecting a warning for 256th field added' assert ret == 0, ('failed creating field foo%d' % i) i = max_field_count gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(ogr.FieldDefn('foo%d' % i, ogr.OFTInteger)) gdal.PopErrorHandler() assert ret != 0, ('should have failed creating field foo%d' % i) feat = ogr.Feature(lyr.GetLayerDefn()) for i in range(max_field_count): feat.SetField(i, i) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) for i in range(max_field_count): feat.SetField(i, i) lyr.CreateFeature(feat) ds = None ############################################################################### # Test that we cannot add more fields that the maximum allowed record length def test_ogr_shape_56(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_56' ds = shape_drv.CreateDataSource(ds_name) lyr = ds.CreateLayer('ogr_shape_56') max_field_count = int(65535 / 80) # 819 for i in range(max_field_count): if i == 255: gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(ogr.FieldDefn('foo%d' % i, ogr.OFTString)) if i == 255: gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', \ 'expecting a warning for 256th field added' assert ret == 0, ('failed creating field foo%d' % i) i = max_field_count gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(ogr.FieldDefn('foo%d' % i, ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0, ('should have failed creating field foo%d' % i) feat = ogr.Feature(lyr.GetLayerDefn()) for i in range(max_field_count): feat.SetField(i, 'foo%d' % i) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) for i in range(max_field_count): feat.SetField(i, 'foo%d' % i) lyr.CreateFeature(feat) ds = None ############################################################################### # Test that we emit a warning if the truncation of a field value occurs def test_ogr_shape_57(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_57' ds = shape_drv.CreateDataSource(ds_name) lyr = ds.CreateLayer('ogr_shape_57') field_defn = ogr.FieldDefn('foo', ogr.OFTString) field_defn.SetWidth(1024) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateField(field_defn) gdal.PopErrorHandler() # print(gdal.GetLastErrorMsg()) assert gdal.GetLastErrorMsg() != '', 'expecting a warning' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '0123456789' * 27) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateFeature(feat) gdal.PopErrorHandler() # print(gdal.GetLastErrorMsg()) assert gdal.GetLastErrorMsg() != '', 'expecting a warning' ds = None ############################################################################### # Test creating and reading back all geometry types def test_ogr_shape_58(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_58' ds = shape_drv.CreateDataSource(ds_name) wkt_list = ['POINT (0 1)', 'POINT (0 1 2)', 'MULTIPOINT (0 1,2 3)', 'MULTIPOINT (0 1 2,3 4 5)', 'LINESTRING (0 1,2 3)', 'LINESTRING (0 1 2,3 4 5)', 'MULTILINESTRING ((0 1,2 3),(0 1,2 3))', 'MULTILINESTRING ((0 1 2,3 4 5),(0 1 2,3 4 5))', 'POLYGON ((0 0,0 1,1 1,1 0,0 0))', 'POLYGON ((0 0 2,0 1 2,1 1 2,1 0 2,0 0 2))', 'MULTIPOLYGON (((0 0,0 1,1 1,1 0,0 0)),((0 0,0 1,1 1,1 0,0 0)))', 'MULTIPOLYGON (((0 0 2,0 1 2,1 1 2,1 0 2,0 0 2)),((0 0 2,0 1 2,1 1 2,1 0 2,0 0 2)))'] for wkt in wkt_list: geom = ogr.CreateGeometryFromWkt(wkt) layer_name = geom.GetGeometryName() if geom.GetGeometryType() & ogr.wkb25Bit: layer_name = layer_name + "3D" lyr = ds.CreateLayer(layer_name) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(geom) lyr.CreateFeature(feat) ds = None ds = ogr.Open('/vsimem/ogr_shape_58') for wkt in wkt_list: geom = ogr.CreateGeometryFromWkt(wkt) layer_name = geom.GetGeometryName() if geom.GetGeometryType() & ogr.wkb25Bit: layer_name = layer_name + "3D" lyr = ds.GetLayerByName(layer_name) lyr.ResetReading() feat = lyr.GetNextFeature() geom_read = feat.GetGeometryRef() assert geom_read.ExportToWkt() == wkt, \ ('did not get expected geom for field %s' % layer_name) ds = None ############################################################################### # Test reading a shape with XYM geometries def test_ogr_shape_59(): if gdaltest.shape_ds is None: pytest.skip() shp_ds = ogr.Open('data/testpointm.shp') if shp_ds is None: pytest.skip() shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.GetGeometryName() == 'POINT', 'Geometry of wrong type.' assert geom.GetCoordinateDimension() == 2, 'dimension wrong.' if geom.GetPointZM(0) != (1.0, 2.0, 0.0, 3.0): print(geom.GetPoint(0)) pytest.fail('Did not get right point result.') shp_ds = ogr.Open('data/arcm_with_m.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToIsoWkt() == 'LINESTRING M (0 0 10,1 1 20)' feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToIsoWkt() == 'MULTILINESTRING M ((0 0 10,1 1 20),(2 2 30,3 3 40))' geom = None feat = None shp_ds = ogr.Open('data/polygonm_with_m.shp') shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToIsoWkt() == 'POLYGON M ((0 0 10,0 1 20,1 1 30,0 0 40))' feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToIsoWkt() == 'POLYGON M ((0 0 10,0 1 20,1 1 30,0 0 40),(0.25 0.25 50,0.75 0.75 60,0.25 0.75 70,0.25 0.25 80))' geom = None feat = None ############################################################################### # Test reading a shape with XYZM geometries def test_ogr_shape_60(): if gdaltest.shape_ds is None: pytest.skip() shp_ds = ogr.Open('data/testpointzm.shp') if shp_ds is None: pytest.skip() shp_lyr = shp_ds.GetLayer(0) feat = shp_lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.GetGeometryName() == 'POINT', 'Geometry of wrong type.' assert geom.GetCoordinateDimension() == 3, 'dimension wrong.' assert geom.GetPoint(0) == (1.0, 2.0, 3.0), 'Did not get right point result.' geom = None feat = None ############################################################################### # Test field auto-growing def test_ogr_shape_61(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_61' ds = shape_drv.CreateDataSource(ds_name) lyr = ds.CreateLayer('ogr_shape_61') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) field_defn = ogr.FieldDefn('intfield', ogr.OFTInteger) field_defn.SetWidth(1) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '0123456789' * 8) feat.SetField(1, 2) lyr.CreateFeature(feat) feat = None field_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert field_defn.GetWidth() == 80, 'did not get initial field size' feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '0123456789' * 9) feat.SetField(1, 34) lyr.CreateFeature(feat) feat = None field_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert field_defn.GetWidth() == 90, 'did not extend field' field_defn = lyr.GetLayerDefn().GetFieldDefn(1) assert field_defn.GetWidth() == 2, 'did not extend field' ds = None ds = ogr.Open(ds_name) lyr = ds.GetLayer(0) field_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert field_defn.GetWidth() == 90, 'did not get expected field size' feat = lyr.GetFeature(1) val = feat.GetFieldAsString(0) assert val == '0123456789' * 9, 'did not get expected field value' val = feat.GetFieldAsInteger(1) assert val == 34, 'did not get expected field value' ############################################################################### # Test field resizing def test_ogr_shape_62(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds_name = '/vsimem/ogr_shape_62' ds = shape_drv.CreateDataSource(ds_name) lyr = ds.CreateLayer('ogr_shape_62', options=['RESIZE=YES']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('bar', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('baz', ogr.OFTInteger)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 'hugehugehugehuge') lyr.CreateFeature(feat) feat = None lyr.DeleteFeature(0) values = ['ab', 'deef', 'ghi'] for value in values: feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, value) feat.SetField(2, 12) lyr.CreateFeature(feat) feat = None ds = None # Reopen file ds = ogr.Open(ds_name) lyr = ds.GetLayer(0) # Check field_defn = lyr.GetLayerDefn().GetFieldDefn(0) assert field_defn.GetWidth() == 4, 'did not get expected field size' # Reopen file ds = ogr.Open(ds_name, update=1) lyr = ds.GetLayer(0) # Should do nothing ds.ExecuteSQL('RESIZE ogr_shape_62') # Check lyr.ResetReading() for expected_value in values: feat = lyr.GetNextFeature() got_val = feat.GetFieldAsString(0) assert got_val == expected_value, 'did not get expected value' got_val = feat.GetFieldAsInteger(2) assert got_val == 12, 'did not get expected value' ds = None ############################################################################### # More testing of recoding def test_ogr_shape_63(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_63.dbf') lyr = ds.CreateLayer('ogr_shape_63', geom_type=ogr.wkbNone) gdaltest.fieldname = '\xc3\xa9' assert lyr.CreateField(ogr.FieldDefn(gdaltest.fieldname, ogr.OFTString)) == 0 gdaltest.fieldname = '\xc3\xa9\xc3\xa9' assert lyr.AlterFieldDefn(0, ogr.FieldDefn(gdaltest.fieldname, ogr.OFTString), ogr.ALTER_NAME_FLAG) == 0 chinese_str = struct.pack('B' * 6, 229, 144, 141, 231, 167, 176) if sys.version_info >= (3, 0, 0): chinese_str = chinese_str.decode('UTF-8') gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.AlterFieldDefn(0, ogr.FieldDefn(chinese_str, ogr.OFTString), ogr.ALTER_NAME_FLAG) gdal.PopErrorHandler() assert ret != 0 gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateField(ogr.FieldDefn(chinese_str, ogr.OFTString)) gdal.PopErrorHandler() assert ret != 0 ds = None ds = ogr.Open('/vsimem/ogr_shape_63.dbf') lyr = ds.GetLayer(0) assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1 assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == gdaltest.fieldname ds = None # Set an invalid encoding gdal.FileFromMemBuffer('/vsimem/ogr_shape_63.cpg', 'FOO') ds = ogr.Open('/vsimem/ogr_shape_63.dbf') lyr = ds.GetLayer(0) # TestCapability(OLCStringsAsUTF8) should return FALSE assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 0 ds = None gdal.Unlink('/vsimem/ogr_shape_63.dbf') gdal.Unlink('/vsimem/ogr_shape_63.cpg') ############################################################################### # Test creating layers whose name include dot character def test_ogr_shape_64(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_64') lyr = ds.CreateLayer('a.b') assert lyr.GetName() == 'a.b' lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('foo', 'bar') lyr.CreateFeature(feat) feat = None lyr = ds.CreateLayer('a.c') assert lyr.GetName() == 'a.c' # Test that we cannot create a duplicate layer gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('a.b') gdal.PopErrorHandler() assert lyr is None ds = None ds = ogr.Open('/vsimem/ogr_shape_64/a.b.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() assert feat.GetFieldAsString('foo') == 'bar' ds = None gdal.Unlink('/vsimem/ogr_shape_64/a.b.shp') gdal.Unlink('/vsimem/ogr_shape_64/a.b.shx') gdal.Unlink('/vsimem/ogr_shape_64/a.b.dbf') gdal.Unlink('/vsimem/ogr_shape_64/a.c.shp') gdal.Unlink('/vsimem/ogr_shape_64/a.c.shx') gdal.Unlink('/vsimem/ogr_shape_64/a.c.dbf') gdal.Unlink('/vsimem/ogr_shape_64') ############################################################################### # Test reading a DBF with a 'nan' as a numeric value (#4799) def test_ogr_shape_65(): ds = ogr.Open('data/nan.dbf') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() val = feat.GetFieldAsDouble(0) feat = None ds = None assert gdaltest.isnan(val) ############################################################################### # Test failures when creating files and datasources def test_ogr_shape_66(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/i_dont_exist/bar.dbf') gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('bar', geom_type=ogr.wkbNone) gdal.PopErrorHandler() assert lyr is None ds = None ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/i_dont_exist/bar.shp') gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = ds.CreateLayer('bar', geom_type=ogr.wkbPoint) gdal.PopErrorHandler() assert lyr is None ds = None gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/i_dont_exist/bar') gdal.PopErrorHandler() assert ds is None f = open('tmp/foo', 'wb') f.close() gdal.PushErrorHandler('CPLQuietErrorHandler') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/foo') gdal.PopErrorHandler() assert ds is None os.unlink('tmp/foo') ############################################################################### # Test opening an empty .sbn spatial index def test_ogr_shape_67(): shutil.copy('data/emptyshapefilewithsbn.shp', 'tmp/emptyshapefilewithsbn.shp') shutil.copy('data/emptyshapefilewithsbn.shx', 'tmp/emptyshapefilewithsbn.shx') shutil.copy('data/emptyshapefilewithsbn.sbn', 'tmp/emptyshapefilewithsbn.sbn') shutil.copy('data/emptyshapefilewithsbn.sbx', 'tmp/emptyshapefilewithsbn.sbx') ds = ogr.Open('tmp/emptyshapefilewithsbn.shp', update=1) ds.ExecuteSQL('DROP SPATIAL INDEX ON emptyshapefilewithsbn') ds = None with pytest.raises(OSError): os.stat('tmp/emptyshapefilewithsbn.sbn') os.unlink('tmp/emptyshapefilewithsbn.shp') os.unlink('tmp/emptyshapefilewithsbn.shx') ############################################################################### # Test opening a shape datasource with files with mixed case and then REPACK def test_ogr_shape_68(): if sys.platform == 'darwin': pytest.skip("Fails on MacOSX. Not sure why.") for i in range(2): if i == 1 and sys.platform != 'win32': break try: shutil.rmtree('tmp/mixedcase') except OSError: pass os.mkdir('tmp/mixedcase') shutil.copy('data/poly.shp', 'tmp/mixedcase/mixedcase.shp') shutil.copy('data/poly.shx', 'tmp/mixedcase/mixedcase.shx') shutil.copy('data/poly.dbf', 'tmp/mixedcase/MIXEDCASE.DBF') # funny ! ds = ogr.Open('tmp/mixedcase', update=1) if sys.platform == 'win32': expected_layer_count = 1 else: expected_layer_count = 2 assert ds.GetLayerCount() == expected_layer_count, \ ('expected %d layers, got %d' % (expected_layer_count, ds.GetLayerCount())) if i == 1: lyr = ds.GetLayerByName('mixedcase') else: lyr = ds.GetLayerByName('MIXEDCASE') lyr.DeleteFeature(0) if i == 1: ds.ExecuteSQL('REPACK mixedcase') else: ds.ExecuteSQL('REPACK MIXEDCASE') if sys.platform == 'win32': assert lyr.GetGeomType() == ogr.wkbPolygon else: assert lyr.GetGeomType() == ogr.wkbNone lyr = ds.GetLayerByName('mixedcase') assert lyr.GetGeomType() == ogr.wkbPolygon gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.DeleteFeature(0) gdal.PopErrorHandler() assert ret != 0, 'expected failure on DeleteFeature()' # gdal.ErrorReset() # gdal.PushErrorHandler('CPLQuietErrorHandler') ds.ExecuteSQL('REPACK mixedcase') # gdal.PopErrorHandler() # if gdal.GetLastErrorMsg() == '': # gdaltest.post_reason('expected failure on REPACK mixedcase') # return 'fail' ds = None ori_shp_size = os.stat('data/poly.shp').st_size ori_shx_size = os.stat('data/poly.shx').st_size ori_dbf_size = os.stat('data/poly.dbf').st_size new_shp_size = os.stat('tmp/mixedcase/mixedcase.shp').st_size new_shx_size = os.stat('tmp/mixedcase/mixedcase.shx').st_size new_dbf_size = os.stat('tmp/mixedcase/MIXEDCASE.DBF').st_size assert new_dbf_size != ori_dbf_size if sys.platform == 'win32': assert new_shp_size != ori_shp_size assert new_shx_size != ori_shx_size else: assert new_shp_size == ori_shp_size assert new_shx_size == ori_shx_size ############################################################################### # Test fix for #5135 (creating a field of type Integer with a big width) def test_ogr_shape_69(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_69.shp') lyr = ds.CreateLayer('ogr_shape_69') field_defn = ogr.FieldDefn('intfield', ogr.OFTInteger) field_defn.SetWidth(64) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 123456) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('/vsimem/ogr_shape_69.shp') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTReal feat = lyr.GetNextFeature() assert feat.GetField(0) == 123456 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_69.shp') ############################################################################### # Test fix for https://github.com/OSGeo/gdal/pull/17 # (shapefile opened twice on Windows) def test_ogr_shape_70(): if sys.platform != 'win32': pytest.skip() ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_shape_70.shp') lyr = ds.CreateLayer('ogr_shape_70') field_defn = ogr.FieldDefn('intfield', ogr.OFTInteger) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(feat) fid = feat.GetFID() feat = None lyr.DeleteFeature(fid) # Locks the file. No way to do this on Unix easily f = open('tmp/ogr_shape_70.dbf', 'r+') gdal.ErrorReset() gdal.PushErrorHandler() old_val = gdal.GetConfigOption('OGR_SHAPE_PACK_IN_PLACE') gdal.SetConfigOption('OGR_SHAPE_PACK_IN_PLACE', 'NO') ds.ExecuteSQL('REPACK ogr_shape_70') gdal.SetConfigOption('OGR_SHAPE_PACK_IN_PLACE', old_val) gdal.PopErrorHandler() errmsg = gdal.GetLastErrorMsg() ds = None f.close() ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ogr_shape_70.shp') assert errmsg != '' ############################################################################### # Test heterogeneous file permissions on .shp and .dbf. def test_ogr_shape_71(): if sys.platform.find('linux') != 0: pytest.skip() if os.getuid() == 0: pytest.skip('running as root... skipping') import stat shutil.copy('data/poly.shp', 'tmp/ogr_shape_71.shp') shutil.copy('data/poly.shx', 'tmp/ogr_shape_71.shx') shutil.copy('data/poly.dbf', 'tmp/ogr_shape_71.dbf') old_mode = os.stat('tmp/ogr_shape_71.dbf').st_mode os.chmod('tmp/ogr_shape_71.dbf', stat.S_IREAD) with gdaltest.error_handler(): ds = ogr.Open('tmp/ogr_shape_71.shp', update=1) ok = ds is None ds = None os.chmod('tmp/ogr_shape_71.dbf', old_mode) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ogr_shape_71.shp') assert ok ############################################################################### # Test shapefile size limit def test_ogr_shape_72(): # Determine if the filesystem supports sparse files (we don't want to create a real 3 GB # file ! if gdaltest.filesystem_supports_sparse_files('tmp') is False: pytest.skip() ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_shape_72.shp') lyr = ds.CreateLayer('2gb', geom_type=ogr.wkbPoint) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 2)')) lyr.CreateFeature(feat) ds = None f = open('tmp/ogr_shape_72.shp', 'rb+') f.seek(24) f.write(struct.pack('B' * 4, 0x7f, 0xff, 0xff, 0xfe)) f.close() # Test creating a feature over 4 GB file limit -> should fail ds = ogr.Open('tmp/ogr_shape_72.shp', update=1) lyr = ds.GetLayer(0) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (3 4)')) gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 ds = None f = open('tmp/ogr_shape_72.shp', 'rb+') f.seek(24) f.write(struct.pack('B' * 4, 0x3f, 0xff, 0xff, 0xfe)) f.close() # Test creating a feature over 2 GB file limit -> should fail gdal.SetConfigOption('SHAPE_2GB_LIMIT', 'TRUE') ds = ogr.Open('tmp/ogr_shape_72.shp', update=1) gdal.SetConfigOption('SHAPE_2GB_LIMIT', None) lyr = ds.GetLayer(0) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (5 6)')) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret != 0 ds = None # Test creating a feature over 2 GB file limit -> should succeed with warning ds = ogr.Open('tmp/ogr_shape_72.shp', update=1) lyr = ds.GetLayer(0) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(ogr.CreateGeometryFromWkt('POINT (7 8)')) gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') ret = lyr.CreateFeature(feat) gdal.PopErrorHandler() assert ret == 0 assert gdal.GetLastErrorMsg().find('2GB file size limit reached') >= 0, \ 'did not find expected warning' ds = None ds = ogr.Open('tmp/ogr_shape_72.shp') lyr = ds.GetLayer(0) feat = lyr.GetFeature(1) assert feat.GetGeometryRef().ExportToWkt() == 'POINT (7 8)' ds = None ############################################################################### # Test that isClockwise() works correctly on a degenerated ring that passes # twice by the same point (#5342) def test_ogr_shape_73(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_73.shp') lyr = ds.CreateLayer('ogr_shape_73', geom_type=ogr.wkbPolygon) feat = ogr.Feature(lyr.GetLayerDefn()) # (5 1) is the first(and last) point, and the pivot point selected by the # algorithm (lowest rightmost vertex), but it is also reused later in the # coordinate list # But the second ring is counter-clock-wise geom = ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 10,10 10,10 0,0 0),(5 1,4 3,4 2,5 1,6 2,6 3,5 1))') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('/vsimem/ogr_shape_73.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() got_geom = feat.GetGeometryRef() if geom.ExportToWkt() != got_geom.ExportToWkt(): feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test organizePolygons() in OGR_ORGANIZE_POLYGONS=DEFAULT mode when # two outer rings are touching, by the first vertex of one. def test_ogr_shape_74(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_74.shp') lyr = ds.CreateLayer('ogr_shape_74', geom_type=ogr.wkbPolygon) feat = ogr.Feature(lyr.GetLayerDefn()) geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON (((0 10,10 10,10 0,0 0,0 1,9 1,9 9,0 9,0 10)),((9 5,5 4,0 5,5 6, 9 5)))') feat.SetGeometry(geom) lyr.CreateFeature(feat) feat = None ds = None ds = ogr.Open('/vsimem/ogr_shape_74.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() got_geom = feat.GetGeometryRef() if geom.ExportToWkt() != got_geom.ExportToWkt(): feat.DumpReadable() pytest.fail() lyr.ResetReading() gdal.SetConfigOption('OGR_ORGANIZE_POLYGONS', 'DEFAULT') feat = lyr.GetNextFeature() gdal.SetConfigOption('OGR_ORGANIZE_POLYGONS', None) got_geom = feat.GetGeometryRef() if geom.ExportToWkt() != got_geom.ExportToWkt(): feat.DumpReadable() pytest.fail() ds = None ############################################################################### # Test GetFileList() def test_ogr_shape_75(): ds = gdal.OpenEx('data/poly.shp') assert (ds.GetFileList() == ['data/poly.shp', 'data/poly.shx', 'data/poly.dbf', 'data/poly.PRJ'] or \ ds.GetFileList() == ['data/poly.shp', 'data/poly.shx', 'data/poly.dbf', 'data/poly.prj']) ds = None ds = gdal.OpenEx('data/idlink.dbf') assert ds.GetFileList() == ['data/idlink.dbf'] ds = None ds = gdal.OpenEx('data/testpoly.shp') assert ds.GetFileList() == ['data/testpoly.shp', 'data/testpoly.shx', 'data/testpoly.dbf', 'data/testpoly.qix'] ds = None ds = gdal.OpenEx('data/emptyshapefilewithsbn.shx') assert ds.GetFileList() == ['data/emptyshapefilewithsbn.shp', 'data/emptyshapefilewithsbn.shx', 'data/emptyshapefilewithsbn.sbn', 'data/emptyshapefilewithsbn.sbx'] ds = None ############################################################################### # Test opening shapefile whose .prj has a UTF-8 BOM marker def test_ogr_shape_76(): ds = ogr.Open('data/prjwithutf8bom.shp') lyr = ds.GetLayer(0) sr = lyr.GetSpatialRef() assert sr.ExportToWkt().find('GEOGCS["NAD83"') == 0 ############################################################################### # Test opening shapefile whose .shx doesn't follow the official shapefile spec (#5608) def test_ogr_shape_77(): ds = ogr.Open('data/nonconformant_shx_ticket5608.shp') lyr = ds.GetLayer(0) feat = lyr.GetNextFeature() geom = feat.GetGeometryRef() assert geom.ExportToWkt() == 'LINESTRING (0 1,2 3)' ############################################################################### # Test writing integer values through double fields, and cases of truncation or # loss of precision (#5625) def test_ogr_shape_78(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_78.dbf') lyr = ds.CreateLayer('ogr_shape_78') fd = ogr.FieldDefn('dblfield', ogr.OFTReal) fd.SetWidth(20) lyr.CreateField(fd) fd = ogr.FieldDefn('dblfield2', ogr.OFTReal) fd.SetWidth(20) fd.SetPrecision(1) lyr.CreateField(fd) # Integer values up to 2^53 can be exactly converted into a double. gdal.ErrorReset() f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('dblfield', (2**53) * 1.0) lyr.CreateFeature(f) assert gdal.GetLastErrorMsg() == '', 'got unexpected error/warning' # Field width too small gdal.ErrorReset() f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('dblfield2', 1e21) gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'did not get expected error/warning' # Likely precision loss gdal.ErrorReset() f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('dblfield', (2**53) * 1.0 + 2) # 2^53+1 == 2^53 ! gdal.PushErrorHandler('CPLQuietErrorHandler') lyr.CreateFeature(f) gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() != '', 'did not get expected error/warning' gdal.ErrorReset() ds = None ds = ogr.Open('/vsimem/ogr_shape_78.dbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetField('dblfield') != 9007199254740992.: f.DumpReadable() pytest.fail('did not get expected value') ds = None ############################################################################### # Test adding a field after creating features with 0 field def test_ogr_shape_79(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_79.dbf') lyr = ds.CreateLayer('ogr_shape_79') # This will create a (for now) invisible 'FID' field lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) # This will delete the implicit field fd = ogr.FieldDefn('field1', ogr.OFTReal) lyr.CreateField(fd) fd = ogr.FieldDefn('field2', ogr.OFTReal) lyr.CreateField(fd) # If the implicit field isn't deleted, this will cause crash lyr.ReorderField(0, 1) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None ds = ogr.Open('/vsimem/ogr_shape_79.dbf') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 ds = None ############################################################################### # Test reading a shape with invalid extent (nan values) (#5702) def test_ogr_shape_80(): ds = ogr.Open('data/extentnan.shp') lyr = ds.GetLayer(0) extent = lyr.GetExtent() assert extent is None or extent[0] == extent[0] ds = None ############################################################################### # Test REPACK after SetFeature() and geometry change (#XXXX) def test_ogr_shape_81(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_81.shp') lyr = ds.CreateLayer('ogr_shape_81') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,-1 -1)')) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_shape_81.shp', update=1) lyr = ds.GetLayer(0) # Add junk behind our back f = gdal.VSIFOpenL('/vsimem/ogr_shape_81.shp', 'ab') gdal.VSIFWriteL('foo', 1, 3, f) gdal.VSIFCloseL(f) size_before = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size # Should be a no-op ds.ExecuteSQL('REPACK ogr_shape_81') size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after == size_before f = lyr.GetNextFeature() f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2 2,3 3)')) lyr.SetFeature(f) # Should be a no-op ds.ExecuteSQL('REPACK ogr_shape_81') size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after == size_before # Writes a longer geometry. So .shp will be extended f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2 2,3 3,4 4)')) lyr.SetFeature(f) size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after != size_before # Should do something size_before = size_after ds.ExecuteSQL('REPACK ogr_shape_81') size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after != size_before # Writes a shorter geometry, so .shp should not change size. size_before = size_after f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(3 3,4 4)')) lyr.SetFeature(f) size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after == size_before size_before = size_after # Should do something ds.ExecuteSQL('REPACK ogr_shape_81') size_after = gdal.VSIStatL('/vsimem/ogr_shape_81.shp').size assert size_after != size_before ds = None ############################################################################### # Test string length more than 254 bytes in UTF-8 encoding cut to 254 bytes def test_ogr_shape_82(): if gdaltest.shape_ds is None: pytest.skip() # create ogrlayer to test cut long strings with UTF-8 encoding gdaltest.shape_lyr = gdaltest.shape_ds.CreateLayer('test_utf_cut', geom_type=ogr.wkbPoint, options=['ENCODING=UTF-8']) # create field to put strings to automatic cut (254 is longest field length) field_defn = ogr.FieldDefn('cut_field', ogr.OFTString) field_defn.SetWidth(254) result = gdaltest.shape_lyr.CreateField(field_defn) assert result == 0, 'failed to create new field.' # Insert feature with long string in Russian. Shoe repair ad. feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) init_rus = ( 'работает два мастера, установка набоек, замена подошвы, замена ' 'каблуков, растяжка обуви, растяжка голенищ сапог, швейные работы, ' 'ушив голенища сапога, чистка обуви, чистка замшевой обуви, замена ' 'стелек' ) result_rus = ( 'работает два мастера, установка набоек, замена подошвы, замена ' 'каблуков, растяжка обуви, растяжка голенищ сапог, швейные работы, ' 'ушив голен' ) feat.SetField('cut_field', init_rus) with gdaltest.error_handler(): gdaltest.shape_lyr.CreateFeature(feat) # Insert feature with long a string in Russian. Shoe repair ad. init_en = ( 'Remont kablukov i ih zamena; zamena naboek; profilaktika i remont ' 'podoshvy; remont i zamena supinatorov; zamena stelek; zamena obuvnoj ' 'furnitury; remont golenishha; rastjazhka obuvi; chistka i pokraska ' 'obuvi. Smolenskaja oblast, p. Monastyrshhina, ulica Sovetskaja, ' 'd. 38. Rabotaet ponedelnik – chetverg s 9.00 do 18.00, pjatnica s ' '10.00 do 17.00, vyhodnoj: subbota' ) result_en = ( 'Remont kablukov i ih zamena; zamena naboek; profilaktika i remont ' 'podoshvy; remont i zamena supinatorov; zamena stelek; zamena ' 'obuvnoj furnitury; remont golenishha; rastjazhka obuvi; chistka ' 'i pokraska obuvi. Smolenskaja oblast, p. Monastyrshhina, ulica' ) feat = ogr.Feature(feature_def=gdaltest.shape_lyr.GetLayerDefn()) feat.SetField('cut_field', init_en) gdaltest.shape_lyr.CreateFeature(feat) # TODO: check your language # save layer? # Read strings and compare with correct values. feat = gdaltest.shape_lyr.GetFeature(0) # rus assert feat.cut_field == result_rus, 'Wrong rus string cut' feat = gdaltest.shape_lyr.GetFeature(1) # en assert feat.cut_field == result_en, 'Wrong en string cut' ############################################################################### # Test behaviour with curve geometries def test_ogr_shape_83(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_83.shp') lyr = ds.CreateLayer('ogr_shape_83', geom_type=ogr.wkbCurvePolygon) assert lyr.GetGeomType() == ogr.wkbPolygon f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('CURVEPOLYGON((0 0,0 1,1 1,1 0,0 0))')) lyr.CreateFeature(f) f = None f = lyr.GetFeature(0) assert f.GetGeometryRef().GetGeometryType() == ogr.wkbPolygon ds = None ############################################################################### # Test SPATIAL_INDEX creation option def test_ogr_shape_84(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_84.shp') lyr = ds.CreateLayer('ogr_shape_84', options=['SPATIAL_INDEX=YES']) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON((0 0,0 1,1 1,1 0,0 0))')) lyr.CreateFeature(f) f = None ds = None assert gdal.VSIStatL('/vsimem/ogr_shape_84.qix') is not None ############################################################################### # Test Integer64 def test_ogr_shape_85(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_85.shp') lyr = ds.CreateLayer('ogr_shape_85') lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 123456789) f.SetField(1, 123456789012345678) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_shape_85.shp', update=1) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTInteger64 f = lyr.GetNextFeature() assert f.GetField(0) == 123456789 and f.GetField(1) == 123456789012345678 # Passing from 9 to 10 figures causes "promotion" to Integer64 f.SetField(0, 2000000000) # Passing from 18 to 19 figures causes "promotion" to Real f.SetField(1, 9000000000000000000) lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_85.shp') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger64 assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTReal f = lyr.GetNextFeature() assert f.GetField(0) == 2000000000 and f.GetField(1) == 9000000000000000000 ds = None # Test open option ADJUST_TYPE ds = gdal.OpenEx('/vsimem/ogr_shape_85.shp', gdal.OF_VECTOR, open_options=['ADJUST_TYPE=YES']) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger assert lyr.GetLayerDefn().GetFieldDefn(1).GetType() == ogr.OFTInteger64 f = lyr.GetNextFeature() assert f.GetField(0) == 2000000000 and f.GetField(1) == 9000000000000000000 ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_85.shp') ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_85.shp') lyr = ds.CreateLayer('ogr_shape_85') lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField(0, 123456789) lyr.CreateFeature(f) fd = ogr.FieldDefn("foo", ogr.OFTInteger64) ret = lyr.AlterFieldDefn(0, fd, ogr.ALTER_TYPE_FLAG) assert ret == 0 f.SetField(0, 123456789012345678) lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_85.shp', update=1) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetType() == ogr.OFTInteger64 f = lyr.GetNextFeature() assert f.GetField(0) == 123456789012345678 ds = None ############################################################################### # Robustness: test reading a non-conformant shapefile that mixes different shape type # OGR can not produce such a file (unless patched) def test_ogr_shape_86(): ds = ogr.Open('data/mixed_shape_type_non_conformant.shp') sql_lyr = ds.ExecuteSQL("select count(distinct ogr_geometry) from mixed_shape_type_non_conformant") f = sql_lyr.GetNextFeature() val = f.GetField(0) ds.ReleaseResultSet(sql_lyr) assert val == 6 ############################################################################### # Check we accept opening standalone .dbf files with weird header lengths (#6035) def test_ogr_shape_87(): ds = ogr.Open('data/weird_header_length.dbf') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetField(0) == 1 ############################################################################### # Test REPACK after SetFeature() and geometry change, without DBF def test_ogr_shape_88(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_88.shp') lyr = ds.CreateLayer('ogr_shape_88') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) lyr.CreateFeature(f) f = None ds = None gdal.Unlink('/vsimem/ogr_shape_88.dbf') ds = ogr.Open('/vsimem/ogr_shape_88.shp', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1,2 2)')) lyr.SetFeature(f) ds.ExecuteSQL('REPACK ogr_shape_88') ds = None ############################################################################### # Test reading geometry bigger than 10 MB def test_ogr_shape_89(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_89.shp') lyr = ds.CreateLayer('ogr_shape_89') f = ogr.Feature(lyr.GetLayerDefn()) g = ogr.Geometry(ogr.wkbLineString) g.AddPoint_2D(0, 0) g.AddPoint_2D(1, 1) f.SetGeometryDirectly(g) lyr.CreateFeature(f) f = None ds = None gdal.Unlink('/vsimem/ogr_shape_89.dbf') # The declare file size doesn't match the real one f = gdal.VSIFOpenL('/vsimem/ogr_shape_89.shx', 'rb+') gdal.VSIFSeekL(f, 100 + 4, 0) gdal.VSIFWriteL(struct.pack('>i', int((10 * 1024 * 1024) / 2)), 1, 4, f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_shape_89.shp') lyr = ds.GetLayer(0) with gdaltest.error_handler(): f = lyr.GetNextFeature() assert f is None or f.GetGeometryRef() is None ds = None f = gdal.VSIFOpenL('/vsimem/ogr_shape_89.shp', 'rb+') gdal.VSIFSeekL(f, 100 + 8 + 10 * 1024 * 1024 - 1, 0) gdal.VSIFWriteL(struct.pack('B', 0), 1, 1, f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_shape_89.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetPointCount() == 2 ds = None ############################################################################### # Test reading a lot of geometries def test_ogr_shape_90(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_90.shp') lyr = ds.CreateLayer('ogr_shape_90') g = ogr.CreateGeometryFromWkt('POINT(0 0)') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(g) lyr.CreateFeature(f) ds = None gdal.Unlink('/vsimem/ogr_shape_90.dbf') # The declare file size doesn't match the real one f = gdal.VSIFOpenL('/vsimem/ogr_shape_90.shx', 'rb+') filesize = int((100 + 8 * 1024 * 1024) / 2) gdal.VSIFSeekL(f, 24, 0) gdal.VSIFWriteL(struct.pack('>i', filesize), 1, 4, f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_shape_90.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1 # Now it is consistent f = gdal.VSIFOpenL('/vsimem/ogr_shape_90.shx', 'rb+') gdal.VSIFSeekL(f, 100 + 8 * 1024 * 1024 - 1, 0) gdal.VSIFWriteL(struct.pack('B', 0), 1, 1, f) gdal.VSIFCloseL(f) ds = ogr.Open('/vsimem/ogr_shape_90.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1024 * 1024 ds = None ############################################################################### # Test reading XYM geometries but with missing M array (#6317) def test_ogr_shape_91(): ds = ogr.Open('data/arcm_without_m.shp') lyr = ds.GetLayer(0) for _ in lyr: pass ds = ogr.Open('data/polygonm_without_m.shp') lyr = ds.GetLayer(0) for _ in lyr: pass ############################################################################### # Test reading multipoint Z geometries without M def test_ogr_shape_92(): ds = ogr.Open('data/multipointz_without_m.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() wkt = f.GetGeometryRef().ExportToIsoWkt() assert wkt == 'MULTIPOINT Z ((0 1 2),(3 4 5))' ############################################################################### # Test reading point Z geometries without M def test_ogr_shape_93(): ds = ogr.Open('data/pointz_without_m.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() wkt = f.GetGeometryRef().ExportToIsoWkt() assert wkt == 'POINT Z (1 2 3)' ############################################################################### # Test SHPT creation option / CreateLayer(geom_type = xxx) def test_ogr_shape_94(): tests = [["POINT", ogr.wkbPoint, "POINT (1 2)"], ["POINTM", ogr.wkbPointM, "POINT M (1 2 3)"], ["POINTZ", ogr.wkbPoint25D, "POINT Z (1 2 3)"], ["POINTZM", ogr.wkbPointZM, "POINT ZM (1 2 3 4)"], ["MULTIPOINT", ogr.wkbMultiPoint, "MULTIPOINT ((1 2))"], ["MULTIPOINTM", ogr.wkbMultiPointM, "MULTIPOINT M ((1 2 3))"], ["MULTIPOINTZ", ogr.wkbMultiPoint25D, "MULTIPOINT Z ((1 2 3))"], ["MULTIPOINTZM", ogr.wkbMultiPointZM, "MULTIPOINT ZM ((1 2 3 4))"], ["ARC", ogr.wkbLineString, "LINESTRING (1 2,3 4)"], ["ARCM", ogr.wkbLineStringM, "LINESTRING M (1 2 3,5 6 7)"], ["ARCZ", ogr.wkbLineString25D, "LINESTRING Z (1 2 3,5 6 7)"], ["ARCZM", ogr.wkbLineStringZM, "LINESTRING ZM (1 2 3 4,5 6 7 8)"], ["ARC", ogr.wkbMultiLineString, "MULTILINESTRING ((1 2,3 4),(1 2,3 4))"], ["ARCM", ogr.wkbMultiLineStringM, "MULTILINESTRING M ((1 2 3,5 6 7),(1 2 3,5 6 7))"], ["ARCZ", ogr.wkbMultiLineString25D, "MULTILINESTRING Z ((1 2 3,5 6 7),(1 2 3,5 6 7))"], ["ARCZM", ogr.wkbMultiLineStringZM, "MULTILINESTRING ZM ((1 2 3 4,5 6 7 8),(1 2 3 4,5 6 7 8))"], ["POLYGON", ogr.wkbPolygon, "POLYGON ((0 0,0 1,1 1,1 0))"], ["POLYGONM", ogr.wkbPolygonM, "POLYGON M ((0 0 2,0 1 2,1 1 2,1 0 2))"], ["POLYGONZ", ogr.wkbPolygon25D, "POLYGON Z ((0 0 2,0 1 2,1 1 2,1 0 2))"], ["POLYGONZM", ogr.wkbPolygonZM, "POLYGON ZM ((0 0 2 3,0 1 2 3,1 1 2 3,1 0 2 3))"], ["POLYGON", ogr.wkbMultiPolygon, "MULTIPOLYGON (((0 0,0 1,1 1,1 0)),((0 0,0 1,1 1,1 0)))"], ["POLYGONM", ogr.wkbMultiPolygonM, "MULTIPOLYGON M (((0 0 2,0 1 2,1 1 2,1 0 2)),((0 0 2,0 1 2,1 1 2,1 0 2)))"], ["POLYGONZ", ogr.wkbMultiPolygon25D, "MULTIPOLYGON Z (((0 0 2,0 1 2,1 1 2,1 0 2)),((0 0 2,0 1 2,1 1 2,1 0 2)))"], ["POLYGONZM", ogr.wkbMultiPolygonZM, "MULTIPOLYGON ZM (((0 0 2 3,0 1 2 3,1 1 2 3,1 0 2 3)),((0 0 2 3,0 1 2 3,1 1 2 3,1 0 2 3)))"], ] for test in tests: try: (shpt, geom_type, wkt, expected_fail) = test except ValueError: (shpt, geom_type, wkt) = test expected_fail = False for i in range(2): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_94.shp') if i == 0: lyr = ds.CreateLayer('ogr_shape_94', options=['SHPT=' + shpt]) else: lyr = ds.CreateLayer('ogr_shape_94', geom_type=geom_type) test_lyr_geom_type = ogr.GT_Flatten(geom_type) != ogr.wkbMultiLineString and ogr.GT_Flatten(geom_type) != ogr.wkbMultiPolygon assert not test_lyr_geom_type or lyr.GetGeomType() == geom_type, \ (i, shpt, geom_type, wkt, lyr.GetGeomType()) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('/vsimem/ogr_shape_94.shp') lyr = ds.GetLayer(0) assert not test_lyr_geom_type or lyr.GetGeomType() == geom_type, \ (shpt, geom_type, wkt, lyr.GetGeomType()) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != wkt: if expected_fail: print('FIXME!:', i, shpt, geom_type, wkt, f.GetGeometryRef().ExportToIsoWkt()) else: pytest.fail(i, shpt, geom_type, wkt, f.GetGeometryRef().ExportToIsoWkt()) ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_94.shp') ############################################################################### # Test demoting of ZM to Z when the M values are nodata def test_ogr_shape_95(): ds = gdal.OpenEx('data/pointzm_with_all_nodata_m.shp') lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint25D f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT Z (1 2 3)', lyr.GetGeomType() ds = gdal.OpenEx('data/pointzm_with_all_nodata_m.shp', open_options=['ADJUST_GEOM_TYPE=NO']) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPointZM f = lyr.GetNextFeature() assert ogrtest.check_feature_geometry(f, ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 -1.79769313486232e+308)')) == 0, \ f.GetGeometryRef().ExportToIsoWkt() # The shape with a non nodata M is the second one ds = gdal.OpenEx('data/pointzm_with_one_valid_m.shp', open_options=['ADJUST_GEOM_TYPE=FIRST_SHAPE']) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPoint25D ds = gdal.OpenEx('data/pointzm_with_one_valid_m.shp', open_options=['ADJUST_GEOM_TYPE=ALL_SHAPES']) lyr = ds.GetLayer(0) assert lyr.GetGeomType() == ogr.wkbPointZM ############################################################################### # Test updating a XYM shapefile (#6331) def test_ogr_shape_96(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_96.shp') lyr = ds.CreateLayer('ogr_shape_96') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT M (1 2 3)')) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_96.shp', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT M (1 2 3)' f.SetGeometry(ogr.CreateGeometryFromWkt('POINT M (1 2 4)')) lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_96.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT M (1 2 4)' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_96.shp') ############################################################################### # Test updating a XYZM shapefile def test_ogr_shape_97(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_97.shp') lyr = ds.CreateLayer('ogr_shape_97') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT ZM (1 2 3 4)')) lyr.CreateFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_97.shp', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT ZM (1 2 3 4)' f.SetGeometry(ogr.CreateGeometryFromWkt('POINT ZM (1 2 5 6)')) lyr.SetFeature(f) ds = None ds = ogr.Open('/vsimem/ogr_shape_97.shp') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f.GetGeometryRef().ExportToIsoWkt() == 'POINT ZM (1 2 5 6)' ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_97.shp') ############################################################################### # Test restore function when .shx file is missing def test_ogr_shape_98(): if gdaltest.shape_ds is None: pytest.skip() gdal.SetConfigOption('SHAPE_RESTORE_SHX', 'TRUE') shutil.copy('data/can_caps.shp', 'tmp/can_caps.shp') shp_ds = ogr.Open('tmp/can_caps.shp', update=1) shp_lyr = shp_ds.GetLayer(0) assert shp_lyr.GetFeatureCount() == 13, 'Got wrong number of features.' shp_lyr = None shp_ds = None gdal.SetConfigOption('SHAPE_RESTORE_SHX', None) ref_shx = open('data/can_caps.shx', 'rb').read() got_shx = open('tmp/can_caps.shx', 'rb').read() os.remove('tmp/can_caps.shp') os.remove('tmp/can_caps.shx') assert ref_shx == got_shx, 'Rebuilt shx is different from original shx.' ############################################################################### # Import TOWGS84 from EPSG when possible (#6485) def test_ogr_shape_99(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_99.shp') lyr = ds.CreateLayer('ogr_shape_99') ds = None gdal.FileFromMemBuffer('/vsimem/ogr_shape_99.prj', """PROJCS["CH1903_LV03",GEOGCS["GCS_CH1903",DATUM["D_CH1903",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["False_Easting",600000.0],PARAMETER["False_Northing",200000.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Azimuth",90.0],PARAMETER["Longitude_Of_Center",7.439583333333333],PARAMETER["Latitude_Of_Center",46.95240555555556],UNIT["Meter",1.0],AUTHORITY["EPSG",21781]]""") ds = ogr.Open('/vsimem/ogr_shape_99.shp') lyr = ds.GetLayer(0) got_wkt = lyr.GetSpatialRef().ExportToPrettyWkt() expected_wkt = """PROJCS["CH1903 / LV03", GEOGCS["CH1903", DATUM["CH1903", SPHEROID["Bessel 1841",6377397.155,299.1528128, AUTHORITY["EPSG","7004"]], AUTHORITY["EPSG","6149"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4149"]], PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"], PARAMETER["latitude_of_center",46.9524055555556], PARAMETER["longitude_of_center",7.43958333333333], PARAMETER["azimuth",90], PARAMETER["rectified_grid_angle",90], PARAMETER["scale_factor",1], PARAMETER["false_easting",600000], PARAMETER["false_northing",200000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH], AUTHORITY["EPSG","21781"]]""" ds = None assert got_wkt == expected_wkt, ('Projections differ: got %s' % got_wkt) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_99.shp') ############################################################################### # Test REPACK with both implementations def test_ogr_shape_100(): old_val = gdal.GetConfigOption('OGR_SHAPE_PACK_IN_PLACE') for variant in ['YES', 'NO']: ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('tmp/ogr_shape_100.shp') lyr = ds.CreateLayer('ogr_shape_100') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) f.SetField('foo', '1') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 1,2 2,3 3)')) f.SetField('foo', '2') lyr.CreateFeature(f) f = None lyr.DeleteFeature(0) gdal.SetConfigOption('OGR_SHAPE_PACK_IN_PLACE', variant) f_dbf = None f_shp = None f_shx = None if sys.platform == 'win32' and variant == 'YES': # Locks the files. No way to do this on Unix easily f_dbf = open('tmp/ogr_shape_100.dbf', 'rb') f_shp = open('tmp/ogr_shape_100.shp', 'rb') f_shx = open('tmp/ogr_shape_100.shx', 'rb') ds.ExecuteSQL('REPACK ogr_shape_100') del f_dbf del f_shp del f_shx gdal.SetConfigOption('OGR_SHAPE_PACK_IN_PLACE', old_val) assert gdal.GetLastErrorMsg() == '', variant for ext in ['dbf', 'shp', 'shx', 'cpg']: assert gdal.VSIStatL('tmp/ogr_shape_100_packed.' + ext) is None, variant f = lyr.GetFeature(0) if f['foo'] != '2' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 1,2 2,3 3)': f.DumpReadable() pytest.fail(variant) with gdaltest.error_handler(): f = lyr.GetFeature(1) assert f is None, variant lyr.ResetReading() assert lyr.GetFeatureCount() == 1, variant f = lyr.GetNextFeature() if f['foo'] != '2' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 1,2 2,3 3)': f.DumpReadable() pytest.fail(variant) f = lyr.GetNextFeature() assert f is None, variant f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (3 3,4 4,5 5,6 6)')) f.SetField('foo', '3') lyr.CreateFeature(f) f = None ds = None ds = ogr.Open('tmp/ogr_shape_100.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2, variant f = lyr.GetNextFeature() if f['foo'] != '2' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 1,2 2,3 3)': f.DumpReadable() pytest.fail(variant) f = lyr.GetNextFeature() if f['foo'] != '3' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (3 3,4 4,5 5,6 6)': f.DumpReadable() pytest.fail(variant) f = lyr.GetNextFeature() assert f is None, variant ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('tmp/ogr_shape_100.shp') ############################################################################### # Test auto repack def test_ogr_shape_101(): for i in range(2): # Auto-repack on create ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_101.shp') lyr = ds.CreateLayer('ogr_shape_101') lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) f.SetField('foo', '1') lyr.CreateFeature(f) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 1,2 2,3 3)')) f.SetField('foo', '2') lyr.CreateFeature(f) f = None lyr.DeleteFeature(0) if i == 0: ds = None else: ds.SyncToDisk() assert lyr.GetFeatureCount() == 1, i # No-op ds.ExecuteSQL('REPACK ogr_shape_101') ds_read = ogr.Open('/vsimem/ogr_shape_101.shp') lyr = ds_read.GetLayer(0) assert lyr.GetFeatureCount() == 1, i f = lyr.GetNextFeature() if f.GetFID() != 0 or f['foo'] != '2' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 1,2 2,3 3)': f.DumpReadable() pytest.fail(i) f = lyr.GetNextFeature() assert f is None, i ds = None ds_read = None if i == 0: # Auto-repack on update ds = ogr.Open('/vsimem/ogr_shape_101.shp', update=1) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (3 3,4 4,5 5,6 6)')) f.SetField('foo', '3') lyr.CreateFeature(f) lyr.DeleteFeature(0) ds = None ds = ogr.Open('/vsimem/ogr_shape_101.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 1, i f = lyr.GetNextFeature() if f.GetFID() != 0 or f['foo'] != '3' or f.GetGeometryRef().ExportToWkt() != 'LINESTRING (3 3,4 4,5 5,6 6)': f.DumpReadable() pytest.fail(i) f = lyr.GetNextFeature() assert f is None, i ds = None # Test disabling auto-repack on update ds = gdal.OpenEx('/vsimem/ogr_shape_101.shp', gdal.OF_UPDATE, open_options=['AUTO_REPACK=NO']) lyr = ds.GetLayer(0) f = ogr.Feature(lyr.GetLayerDefn()) f.SetField('foo', '4') lyr.CreateFeature(f) lyr.DeleteFeature(0) ds = None ds = ogr.Open('/vsimem/ogr_shape_101.shp') lyr = ds.GetLayer(0) assert lyr.GetFeatureCount() == 2, i f = lyr.GetNextFeature() if f.GetFID() != 1 or f['foo'] != '4': f.DumpReadable() pytest.fail(i) ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_101.shp') ############################################################################### # Test reading invalid .prj def test_ogr_shape_102(): ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource('/vsimem/ogr_shape_102.shp') lyr = ds.CreateLayer('ogr_shape_102', geom_type=ogr.wkbPoint) ds = None gdal.FileFromMemBuffer('/vsimem/ogr_shape_102.prj', 'invalid') ds = ogr.Open('/vsimem/ogr_shape_102.shp') lyr = ds.GetLayer(0) lyr.GetSpatialRef() ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource('/vsimem/ogr_shape_102.shp') ############################################################################### # Test handling of EOF character def check_EOF(filename, expected=True): f = gdal.VSIFOpenL(filename, 'rb') if f is None: print('%s does not exist' % filename) return False size = gdal.VSIStatL(filename).size content = gdal.VSIFReadL(1, size, f) gdal.VSIFCloseL(f) pos = content.find('\x1A'.encode('LATIN1')) if expected: if pos < 0: print('Did not find EOF char') return False if pos != size - 1: print('Found EOF char but not at end of file!') return False elif pos >= 0: print('Found EOF char but we did not expect that !') return False return True def test_ogr_shape_103(): filename = '/vsimem/ogr_shape_103.dbf' for (options, expected) in [(['DBF_EOF_CHAR=YES'], True), ([], True), (['DBF_EOF_CHAR=NO'], False)]: options += ['DBF_DATE_LAST_UPDATE=1970-01-01'] # Create empty file ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_103', geom_type=ogr.wkbNone, options=options) ds = None assert check_EOF(filename, expected=expected), options # Add field ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ds = None assert check_EOF(filename, expected=expected) # Add record ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None assert check_EOF(filename, expected=expected) # Add another field ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.CreateField(ogr.FieldDefn('foo2', ogr.OFTString)) ds = None assert check_EOF(filename, expected=expected) # Grow a field ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) fd = lyr.GetLayerDefn().GetFieldDefn(0) new_fd = ogr.FieldDefn(fd.GetName(), fd.GetType()) new_fd.SetWidth(fd.GetWidth() + 1) lyr.AlterFieldDefn(0, fd, ogr.ALTER_ALL_FLAG) ds = None assert check_EOF(filename, expected=expected) # Reorder fields ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.ReorderFields([1, 0]) ds = None assert check_EOF(filename, expected=expected) # Shrink a field ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) fd = lyr.GetLayerDefn().GetFieldDefn(0) new_fd = ogr.FieldDefn(fd.GetName(), fd.GetType()) new_fd.SetWidth(fd.GetWidth() + 1) lyr.AlterFieldDefn(0, fd, ogr.ALTER_ALL_FLAG) ds = None assert check_EOF(filename, expected=expected) # Remove a field ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.DeleteField(0) ds = None assert check_EOF(filename, expected=expected) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) # Create file with one field but no record ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_103', geom_type=ogr.wkbNone, options=options) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) ds = None assert check_EOF(filename, expected=expected) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) # Create file with two records ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_103', geom_type=ogr.wkbNone, options=options) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None assert check_EOF(filename, expected=expected) # Test editing a record that is not the last one ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.SetFeature(lyr.GetNextFeature()) ds = None assert check_EOF(filename, expected=expected) # Test editing the last record ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=options) lyr = ds.GetLayer(0) lyr.GetNextFeature() lyr.SetFeature(lyr.GetNextFeature()) ds = None assert check_EOF(filename, expected=expected) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) # Test appending to a file without a EOF marker ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_103', geom_type=ogr.wkbNone, options=['DBF_EOF_CHAR=NO'] + ['DBF_DATE_LAST_UPDATE=1970-01-01']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=['DBF_DATE_LAST_UPDATE=1970-01-01']) lyr = ds.GetLayer(0) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds.FlushCache() assert check_EOF(filename) ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) # Test editing a record (that is not the last one ) in a file without a EOF marker ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_103', geom_type=ogr.wkbNone, options=['DBF_EOF_CHAR=NO'] + ['DBF_DATE_LAST_UPDATE=1970-01-01']) lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString)) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) lyr.CreateFeature(ogr.Feature(lyr.GetLayerDefn())) ds = None ds = gdal.OpenEx(filename, gdal.OF_UPDATE, open_options=['DBF_DATE_LAST_UPDATE=1970-01-01']) lyr = ds.GetLayer(0) lyr.SetFeature(lyr.GetNextFeature()) ds = None # To document our current behaviour. Could make sense to be changed. assert check_EOF(filename, expected=False) ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) ############################################################################### # Test writing MULTIPATCH def test_ogr_shape_104(): for (wkt, lyr_type, options, expected_wkt) in \ [['TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))', ogr.wkbUnknown, [], None], ['TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)),((0 0 0,1 1 3,2 2 4,0 0 0)))', ogr.wkbUnknown, [], None], # triangle fan ['TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)),((0 1 2,1 1 3,4 4 5,0 1 2)))', ogr.wkbUnknown, [], None], # triangle strip ['TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)),((1 1 3,0 1 2,4 4 5,1 1 3)))', ogr.wkbUnknown, [], None], # no fan no strip ['TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)),((0 0 0,0 1 2,1 1 3,0 0 0)),((1 1 3,0 1 2,4 4 5,1 1 3)))', ogr.wkbUnknown, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)),((1 1 3,0 1 2,4 4 5,1 1 3)))'], # no fan no strip with duplicated triangle (as found in #5888) ['POLYHEDRALSURFACE Z (((0 0 0,0 1 2,1 1 3,0 0 0)))', ogr.wkbUnknown, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ['GEOMETRYCOLLECTION Z (TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0))))', ogr.wkbUnknown, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ['TRIANGLE Z ((0 0 0,0 1 2,1 1 3,0 0 0))', ogr.wkbUnknown, ['SHPT=MULTIPATCH'], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ['TRIANGLE Z ((0 0 0,0 1 2,1 1 3,0 0 0))', ogr.wkbTINZ, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ['POLYGON Z ((0 0 0,0 1 2,1 1 3,0 0 0))', ogr.wkbTINZ, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ['MULTIPOLYGON Z (((0 0 0,0 1 2,1 1 3,0 0 0)))', ogr.wkbTINZ, [], 'TIN Z (((0 0 0,0 1 2,1 1 3,0 0 0)))'], ]: if expected_wkt is None: expected_wkt = wkt filename = '/vsimem/ogr_shape_104.shp' ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(filename) lyr = ds.CreateLayer('ogr_shape_104', geom_type=lyr_type, options=options) f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt(wkt)) lyr.CreateFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToIsoWkt() != expected_wkt: f.DumpReadable() pytest.fail(wkt, lyr_type, options) ds = None ogr.GetDriverByName('ESRI Shapefile').DeleteDataSource(filename) ############################################################################### # Test reading .dbf with substantial padding after last field definition. def test_ogr_shape_105(): ds = ogr.Open('data/padding_after_field_defns.dbf') lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldCount() == 2 f = lyr.GetNextFeature() assert f['id'] == '1' and f['foo'] == '2' ############################################################################### # Test that rewriting the last shape reuses the space it took. (#6787) def test_ogr_shape_106(): shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource('/vsimem/ogr_shape_106.shp') lyr = ds.CreateLayer('ogr_shape_81') f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(0 0,1 1)')) lyr.CreateFeature(f) f = None ds = None size = gdal.VSIStatL('/vsimem/ogr_shape_106.shp').size assert size == 188 ds = ogr.Open('/vsimem/ogr_shape_106.shp', update=1) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() # Write larger shape f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2 2,3 3,4 4)')) lyr.SetFeature(f) ds = None size = gdal.VSIStatL('/vsimem/ogr_shape_106.shp').size assert size == 188 + 2 * 8 shape_drv.DeleteDataSource('/vsimem/ogr_shape_106.shp') ############################################################################### # Compare to VSI*L file def is_same(filename1, filename2, verbose=True): f1 = gdal.VSIFOpenL(filename1, "rb") if f1 is None: if verbose: print('%s does not exist' % filename1) return False f2 = gdal.VSIFOpenL(filename2, "rb") if f2 is None: if verbose: print('%s does not exist' % filename2) gdal.VSIFCloseL(f1) return False ret = True size1 = gdal.VSIStatL(filename1).size size2 = gdal.VSIStatL(filename2).size if size1 != size2: if verbose: print('%s size is %d, whereas %s size is %d' % (filename1, size1, filename2, size2)) ret = False if ret: data1 = gdal.VSIFReadL(1, size1, f1) data2 = gdal.VSIFReadL(1, size2, f2) if data1 != data2: if verbose: print('File content of %s and %s are different' % (filename1, filename2)) print(struct.unpack('B' * len(data1), data1)) print(struct.unpack('B' * len(data2), data2)) ret = False gdal.VSIFCloseL(f1) gdal.VSIFCloseL(f2) return ret ############################################################################### # Test that multiple edition of the last shape works properly (#7031) def test_ogr_shape_107(): layer_name = 'ogr_shape_107' filename = '/vsimem/' + layer_name + '.shp' copy_filename = '/vsimem/' + layer_name + '_copy.shp' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(filename) lyr = ds.CreateLayer(layer_name) # Create a shape f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(2.5 3.5)')) lyr.CreateFeature(f) # Modify it to be larger f = lyr.GetFeature(0) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (1 2,3 4)')) lyr.SetFeature(f) # Insert new feature f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (5 6)')) lyr.CreateFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 2,3 4)': f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (5 6)': f.DumpReadable() pytest.fail() ds = None gdal.VectorTranslate(copy_filename, filename) assert is_same(copy_filename, filename) shape_drv.DeleteDataSource(copy_filename) shape_drv.DeleteDataSource(filename) ds = shape_drv.CreateDataSource(filename) lyr = ds.CreateLayer(layer_name) # Create a shape f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING (1 2,1.5 2.5,3 4)')) lyr.CreateFeature(f) # Modify it to be smaller f = lyr.GetFeature(0) f.SetGeometry(ogr.CreateGeometryFromWkt('LINESTRING(1 2,3 4)')) lyr.SetFeature(f) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) f = lyr.GetNextFeature() if f.GetGeometryRef().ExportToWkt() != 'LINESTRING (1 2,3 4)': f.DumpReadable() pytest.fail() ds = None gdal.VectorTranslate(copy_filename, filename) assert is_same(copy_filename, filename) shape_drv.DeleteDataSource(copy_filename) shape_drv.DeleteDataSource(filename) ############################################################################### # Test spatial + attribute filter def test_ogr_shape_108(): ds = ogr.Open('data/poly.shp') lyr = ds.GetLayer(0) lyr.SetSpatialFilterRect(479750.6875, 4764702.0, 479750.6875, 4764702.0) expected_fc = lyr.GetFeatureCount() lyr.SetAttributeFilter("1=1") assert lyr.GetFeatureCount() == expected_fc ############################################################################### # Test writing invalid polygon def test_ogr_shape_109(): layer_name = 'ogr_shape_109' filename = '/vsimem/' + layer_name + '.shp' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(filename) lyr = ds.CreateLayer(layer_name) # Create a shape f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((1 2))')) lyr.CreateFeature(f) ds = None shape_drv.DeleteDataSource(filename) ############################################################################### def test_ogr_shape_110_write_invalid_multipatch(): layer_name = 'ogr_shape_110' filename = '/vsimem/' + layer_name + '.shp' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(filename) lyr = ds.CreateLayer(layer_name, options=['SHPT=MULTIPATCH']) # Create a shape f = ogr.Feature(lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION(POINT(0 0))')) lyr.CreateFeature(f) ds = None shape_drv.DeleteDataSource(filename) ############################################################################### def test_ogr_shape_111_delete_field_no_record(): layer_name = 'ogr_shape_111_delete_field_no_record' filename = '/vsimem/' + layer_name + '.shp' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(filename) lyr = ds.CreateLayer(layer_name) lyr.CreateField(ogr.FieldDefn('field_1')) lyr.CreateField(ogr.FieldDefn('field_2')) ds = None ds = ogr.Open(filename, update = 1) lyr = ds.GetLayer(0) lyr.DeleteField(1) ds = None ds = ogr.Open(filename) lyr = ds.GetLayer(0) assert lyr.GetLayerDefn().GetFieldDefn(0).GetName() == 'field_1' ds = None shape_drv.DeleteDataSource(filename) ############################################################################### def test_ogr_shape_112_delete_layer(): dirname = '/vsimem/test_ogr_shape_112_delete_layer' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(dirname) ds.CreateLayer("test") ds = None ds = ogr.Open(dirname) with gdaltest.error_handler(): assert ds.DeleteLayer(0) != 0 ds = None ds = ogr.Open(dirname, update = 1) with gdaltest.error_handler(): assert ds.DeleteLayer(-1) != 0 assert ds.DeleteLayer(1) != 0 gdal.FileFromMemBuffer(dirname + "/test.cpg", "foo") assert ds.DeleteLayer(0) == 0 assert not gdal.VSIStatL(dirname + "/test.shp") assert not gdal.VSIStatL(dirname + "/test.cpg") ds = None shape_drv.DeleteDataSource(dirname) ############################################################################### def test_ogr_shape_113_restore_shx_empty_shp_shx(): dirname = '/vsimem/test_ogr_shape_113_restore_shx_empty_shp_shx' dbfname = dirname + "/foo.dbf" shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(dbfname) lyr = ds.CreateLayer("test") lyr.CreateField(ogr.FieldDefn("foo")) f = ogr.Feature(lyr.GetLayerDefn()) f['foo'] = 'bar' lyr.CreateFeature(f) ds = None gdal.FileFromMemBuffer(dirname + '/foo.shp', '') gdal.FileFromMemBuffer(dirname + '/foo.shx', '') with gdaltest.config_option('SHAPE_RESTORE_SHX', 'YES'): with gdaltest.error_handler(): ds = ogr.Open(dbfname) assert ds lyr = ds.GetLayer(0) f = lyr.GetNextFeature() assert f['foo'] == 'bar' ds = None shape_drv.DeleteDataSource(dbfname) ############################################################################### def test_ogr_shape_layer_no_geom_but_srs(): filename = '/vsimem/test_ogr_shape_layer_no_geom_but_srs' shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(filename) sr = osr.SpatialReference() ds.CreateLayer("test", sr, ogr.wkbNone) sr = osr.SpatialReference() sr.ImportFromEPSG(4326) ds.CreateLayer("test2", sr, ogr.wkbNone) ds = None shape_drv.DeleteDataSource(filename) ############################################################################### def test_ogr_shape_116_invalid_layer_name(): dirname = 'tmp/test_ogr_shape_116_invalid_layer_name' gdal.RmdirRecursive(dirname) shape_drv = ogr.GetDriverByName('ESRI Shapefile') ds = shape_drv.CreateDataSource(dirname) with gdaltest.error_handler(): assert ds.CreateLayer('test<>:"/\\?*', None, ogr.wkbNone) ds = None ds = ogr.Open(dirname) assert ds.GetLayerCount() == 1 ds = None gdal.RmdirRecursive(dirname) ############################################################################### def test_ogr_shape_cleanup(): if gdaltest.shape_ds is None: pytest.skip() gdaltest.shape_ds = None shape_drv = ogr.GetDriverByName('ESRI Shapefile') shape_drv.DeleteDataSource('tmp') shape_drv.DeleteDataSource('tmp/UPPERCASE') shape_drv.DeleteDataSource('tmp/lowercase') shape_drv.DeleteDataSource('tmp/mixedcase') shape_drv.DeleteDataSource('/vsimem/test35.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_46.shp') shape_drv.DeleteDataSource('/vsimem/this_one_i_care_46.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_52.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_53.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_54') shape_drv.DeleteDataSource('/vsimem/ogr_shape_55') shape_drv.DeleteDataSource('/vsimem/ogr_shape_56') shape_drv.DeleteDataSource('/vsimem/ogr_shape_57') shape_drv.DeleteDataSource('/vsimem/ogr_shape_58') shape_drv.DeleteDataSource('/vsimem/ogr_shape_61') shape_drv.DeleteDataSource('/vsimem/ogr_shape_62') shape_drv.DeleteDataSource('/vsimem/ogr_shape_73.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_74.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_78.dbf') shape_drv.DeleteDataSource('/vsimem/ogr_shape_79.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_81.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_83.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_84.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_85.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_88.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_89.shp') shape_drv.DeleteDataSource('/vsimem/ogr_shape_90.shp') if os.path.exists('tmp/ogr_shape_100.shp'): shape_drv.DeleteDataSource('tmp/ogr_shape_100.shp') gdalautotest-3.0.4/ogr/ogr_join_test.py0000755003401500001440000003553313614005365017655 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_join_test.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR JOIN support. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # Copyright (c) 2008-2013, Even Rouault # # 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. ############################################################################### import gdaltest from osgeo import gdal from osgeo import ogr import ogrtest import pytest ############################################################################### # Test a join. def test_ogr_join_1(): gdaltest.ds = ogr.Open('data') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly LEFT JOIN idlink ON poly.eas_id = idlink.eas_id') count = sql_lyr.GetFeatureCount() assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting 10' % count) gdaltest.ds.ReleaseResultSet(sql_lyr) ############################################################################### # Check the values we are actually getting back (restricting the search a bit) def test_ogr_join_2(): expect = ['_166_', '_158_', '_165_'] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly ' 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' 'WHERE eas_id < 168') tr = ogrtest.check_features_against_list(sql_lyr, 'NAME', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Try various naming conversions for the selected fields. def test_ogr_join_3(): expect = ['_166_', '_158_', '_165_'] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT poly.area, idlink.* FROM poly ' 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' 'WHERE eas_id < 168') tr = ogrtest.check_features_against_list(sql_lyr, 'idlink.NAME', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that records for which a join can't be found work ok. def test_ogr_join_4(): expect = ['_179_', '_171_', None, None] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT poly.*, name FROM poly ' + 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' + 'WHERE eas_id > 170') tr = ogrtest.check_features_against_list(sql_lyr, 'NAME', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify that table aliases work def test_ogr_join_5(): expect = [179, 171, 173, 172] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT p.*, il.name FROM poly p ' + 'LEFT JOIN idlink il ON p.eas_id = il.eas_id ' + 'WHERE eas_id > 170') tr = ogrtest.check_features_against_list(sql_lyr, 'p.eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Again, ordering by a primary field. def test_ogr_join_6(): expect = [171, 172, 173, 179] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT p.*, il.name FROM poly p ' + 'LEFT JOIN idlink il ON p.eas_id = il.eas_id ' + 'WHERE eas_id > 170 ORDER BY p.eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'p.eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test joining to an external datasource. def test_ogr_join_7(): expect = [171, 172, 173, 179] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT p.*, il.name FROM poly p ' + 'LEFT JOIN "data/idlink.dbf".idlink il ON p.eas_id = il.eas_id ' + 'WHERE eas_id > 170 ORDER BY p.eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'p.eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test doing two joins at once. def test_ogr_join_8(): expect = [171, None, None, 179] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT p.*, il.name, il2.eas_id FROM poly p ' + 'LEFT JOIN "data/idlink.dbf".idlink il ON p.eas_id = il.eas_id ' + 'LEFT JOIN idlink il2 ON p.eas_id = il2.eas_id ' + 'WHERE eas_id > 170 ORDER BY p.eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'il2.eas_id', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Verify fix for #2788 (memory corruption on wildcard expansion in SQL request # with join clauses) def test_ogr_join_9(): expect = [179, 171, 173, 172] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT poly.* FROM poly ' + 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' + 'WHERE eas_id > 170') tr = ogrtest.check_features_against_list(sql_lyr, 'poly.EAS_ID', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### def test_ogr_join_10(): expect = [None, None, None, None, None, None, None, None, None, None] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly ' + 'LEFT JOIN idlink2 ON poly.eas_id = idlink2.name ') tr = ogrtest.check_features_against_list(sql_lyr, 'F3', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test join on string field def test_ogr_join_11(): expect = ['_168_', '_179_', '_171_', '_170_', '_165_', '_158_', '_166_'] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT il.*, il2.* FROM idlink il LEFT JOIN idlink2 il2 ON il.NAME = il2.NAME') tr = ogrtest.check_features_against_list(sql_lyr, 'il2.NAME', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test fix for #4112 (join between 2 datasources) def test_ogr_join_12(): ds = ogr.Open('data/poly.shp') sql_lyr = ds.ExecuteSQL( "SELECT * FROM poly LEFT JOIN 'data/idlink.dbf'.idlink ON poly.eas_id = idlink.eas_id") count = sql_lyr.GetFeatureCount() assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting 10' % count) ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test joining a float column with a string column (#4321) def test_ogr_join_13(): expect = ['_168_', '_179_', '_171_', None, None, None, '_166_', '_158_', '_165_', '_170_'] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly ' + 'LEFT JOIN idlink2 ON poly.eas_id = idlink2.eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'name', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test joining a string column with a float column (#4321, actually addressed by #4259) def test_ogr_join_14(): expect = [168, 179, 171, 170, 165, 158, 166] sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM idlink2 ' + 'LEFT JOIN poly ON idlink2.eas_id = poly.eas_id') tr = ogrtest.check_features_against_list(sql_lyr, 'poly.EAS_ID', expect) gdaltest.ds.ReleaseResultSet(sql_lyr) assert tr ############################################################################### # Test multiple joins with expressions (#4521) def test_ogr_join_15(): ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_join_14') lyr = ds.CreateLayer('first') ogrtest.quick_create_layer_def(lyr, [['id']]) ogrtest.quick_create_feature(lyr, ['key'], None) lyr = ds.CreateLayer('second') ogrtest.quick_create_layer_def(lyr, [['col1_2'], ['id'], ['col3_2']]) ogrtest.quick_create_feature(lyr, ['a2', 'key', 'c2'], None) lyr = ds.CreateLayer('third') ogrtest.quick_create_layer_def(lyr, [['col1_3'], ['id'], ['col3_3']]) ogrtest.quick_create_feature(lyr, ['a3', 'key', 'c3'], None) sql_lyr = ds.ExecuteSQL("SELECT concat(col3_2, ''), col3_2 FROM first JOIN second ON first.id = second.id JOIN third ON first.id = third.id") feat = sql_lyr.GetNextFeature() val1 = feat.GetFieldAsString(0) val2 = feat.GetFieldAsString(1) ds.ReleaseResultSet(sql_lyr) ds = None gdal.Unlink('/vsimem/ogr_join_14/first.csv') gdal.Unlink('/vsimem/ogr_join_14/second.csv') gdal.Unlink('/vsimem/ogr_join_14/third.csv') gdal.Unlink('/vsimem/ogr_join_14') assert val1 == 'c2' assert val2 == 'c2' ############################################################################### # Test non-support of a secondarytable.fieldname in a where clause def test_ogr_join_16(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly ' + 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' + 'WHERE idlink.name = \'_165\'') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Cannot use field') == 0 if sql_lyr is None: return pytest.fail() ############################################################################### # Test non-support of a secondarytable.fieldname in a order by clause def test_ogr_join_17(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly ' + 'LEFT JOIN idlink ON poly.eas_id = idlink.eas_id ' + 'ORDER BY name') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Cannot use field') == 0 if sql_lyr is None: return pytest.fail() ############################################################################### # Test inverted order of fields in ON def test_ogr_join_18(): sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly LEFT JOIN idlink ON idlink.eas_id = poly.eas_id') count = sql_lyr.GetFeatureCount() assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting 10' % count) gdaltest.ds.ReleaseResultSet(sql_lyr) ############################################################################### # Test unrecognized primary field def test_ogr_join_19(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly LEFT JOIN idlink ON poly.foo = idlink.eas_id') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('"poly"."foo" not recognised as an available field') == 0 if sql_lyr is None: return pytest.fail() ############################################################################### # Test unrecognized secondary field def test_ogr_join_20(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT * FROM poly LEFT JOIN idlink ON poly.eas_id = idlink.foo') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('"idlink"."foo" not recognised as an available field') == 0 if sql_lyr is None: return pytest.fail() ############################################################################### # Test unexpected secondary table def test_ogr_join_21(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') sql_lyr = gdaltest.ds.ExecuteSQL( 'SELECT p.*, il.name, il2.eas_id FROM poly p ' + 'LEFT JOIN "data/idlink.dbf".idlink il ON p.eas_id = il2.eas_id ' + 'LEFT JOIN idlink il2 ON p.eas_id = il2.eas_id') gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('Field il2.eas_id in JOIN clause does not correspond to the primary table nor the joint (secondary) table') == 0 if sql_lyr is None: return pytest.fail() ############################################################################### # Test join with a complex expression as ON def test_ogr_join_22(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('first') ogrtest.quick_create_layer_def(lyr, [['id.1'], ['id2']]) ogrtest.quick_create_feature(lyr, ['key1', 'key2'], None) lyr = ds.CreateLayer('second') ogrtest.quick_create_layer_def(lyr, [['id.1'], ['id2'], ['val']]) ogrtest.quick_create_feature(lyr, ['key1', 'keyX', '1'], None) ogrtest.quick_create_feature(lyr, ['key1', 'key2', '2'], None) ogrtest.quick_create_feature(lyr, ['key1', 'keyY', '3'], None) sql_lyr = ds.ExecuteSQL("SELECT val FROM first JOIN second ON first.\"id.1\" = second.\"id.1\" AND first.id2 = second.id2") feat = sql_lyr.GetNextFeature() val = feat.GetFieldAsString(0) ds.ReleaseResultSet(sql_lyr) ds = None assert val == '2' ############################################################################### # Test join with NULL keys def test_ogr_join_23(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('first') ogrtest.quick_create_layer_def(lyr, [['f']]) ogrtest.quick_create_feature(lyr, [None], None) ogrtest.quick_create_feature(lyr, ['key1'], None) lyr = ds.CreateLayer('second') ogrtest.quick_create_layer_def(lyr, [['f']]) ogrtest.quick_create_feature(lyr, ['key1'], None) ogrtest.quick_create_feature(lyr, [None], None) sql_lyr = ds.ExecuteSQL("SELECT * FROM first JOIN second ON first.f = second.f") feat = sql_lyr.GetNextFeature() if feat.IsFieldSetAndNotNull('second.f'): feat.DumpReadable() pytest.fail() feat = sql_lyr.GetNextFeature() if feat['f'] != 'key1' or feat['second.f'] != 'key1': feat.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### def test_ogr_join_cleanup(): gdaltest.lyr = None gdaltest.ds = None gdalautotest-3.0.4/ogr/ogr_gml_fgd_read.py0000755003401500001440000001012413614005365020236 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_gml_fgd_read.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: GML Reading Driver for Japanese FGD GML v4 testing. # Author: Hiroshi Miura # ############################################################################### # Copyright (c) 2017, Hiroshi Miura # # 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 ogrtest from osgeo import gdal from osgeo import ogr from osgeo import osr import pytest ############################################################################### # Test reading Japanese FGD GML (v4) files ############################################################################### _fgd_dir = 'data/gml_jpfgd/' ############################################################################### # Test reading Japanese FGD GML (v4) ElevPt file def test_ogr_gml_fgd_1(): gdaltest.have_gml_fgd_reader = 0 # open FGD GML file ds = ogr.Open(_fgd_dir + 'ElevPt.xml') if ds is None: if gdal.GetLastErrorMsg().find('Xerces') != -1: pytest.skip() pytest.fail('failed to open test file.') # we have gml reader for fgd gdaltest.have_gml_fgd_reader = 1 # check number of layers assert ds.GetLayerCount() == 1, 'Wrong layer count' lyr = ds.GetLayer(0) # check the SRS sr = osr.SpatialReference() sr.ImportFromEPSG(6668) # JGD2011 assert sr.IsSame(lyr.GetSpatialRef(), options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), 'Wrong SRS' # check the first feature feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, 'POINT (133.123456789 34.123456789)'), \ 'Wrong geometry' assert feat.GetField('devDate') == '2015-01-07', 'Wrong attribute value' ############################################################################### # Test reading Japanese FGD GML (v4) BldA file def test_ogr_gml_fgd_2(): if not gdaltest.have_gml_fgd_reader: pytest.skip() # open FGD GML file ds = ogr.Open(_fgd_dir + 'BldA.xml') # check number of layers assert ds.GetLayerCount() == 1, 'Wrong layer count' lyr = ds.GetLayer(0) # check the SRS sr = osr.SpatialReference() sr.ImportFromEPSG(6668) # JGD2011 assert sr.IsSame(lyr.GetSpatialRef(), options = ['IGNORE_DATA_AXIS_TO_SRS_AXIS_MAPPING=YES']), 'Wrong SRS' wkt = 'POLYGON ((139.718509733734 35.6952171397133,139.718444177734 35.6953121947133,139.718496754142 35.6953498949667,139.718550483734 35.6952359447133,139.718509733734 35.6952171397133))' # check the first feature feat = lyr.GetNextFeature() assert not ogrtest.check_feature_geometry(feat, wkt), 'Wrong geometry' assert feat.GetField('devDate') == '2017-03-07', 'Wrong attribute value' ############################################################################### # List test cases gdalautotest-3.0.4/ogr/ogr_sql_rfc28.py0000755003401500001440000013373013614005365017460 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: ogr_sql_rfc28.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Test OGR SQL capabilities added as part of RFC 28 implementation. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2010, Frank Warmerdam # 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. ############################################################################### from osgeo import gdal from osgeo import ogr import gdaltest import ogrtest import pytest ############################################################################### # Test an expression with a left side value and right side column and an \ # expression for the value. def test_ogr_rfc28_1(): gdaltest.ds = ogr.Open('data') gdaltest.lyr = gdaltest.ds.GetLayerByName('poly') gdaltest.lyr.SetAttributeFilter('160+7 > eas_id') count = gdaltest.lyr.GetFeatureCount() assert count == 3, \ ('Got wrong count with GetFeatureCount() - %d, expecting 3' % count) ############################################################################### # Test CONCAT operator in the context of a WHERE clause. def test_ogr_rfc28_2(): gdaltest.lyr.SetAttributeFilter("CONCAT('x',PRFEDEA) = 'x35043423'") count = gdaltest.lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # Test '+' operator on strings. def test_ogr_rfc28_3(): gdaltest.lyr.SetAttributeFilter("'x'+PRFEDEA = 'x35043423'") count = gdaltest.lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # Test '%' operator. def test_ogr_rfc28_4(): gdaltest.lyr.SetAttributeFilter("EAS_ID % 5 = 1") count = gdaltest.lyr.GetFeatureCount() assert count == 2, \ ('Got wrong count with GetFeatureCount() - %d, expecting 2' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # Test '%' operator. def test_ogr_rfc28_5(): gdaltest.lyr.SetAttributeFilter("EAS_ID % 5 = 1") count = gdaltest.lyr.GetFeatureCount() assert count == 2, \ ('Got wrong count with GetFeatureCount() - %d, expecting 2' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # Test support for a quoted field name. def test_ogr_rfc28_6(): gdaltest.lyr.SetAttributeFilter("\"EAS_ID\" = 166") count = gdaltest.lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # test with distinguished name for field in where clause. def test_ogr_rfc28_7_wrong_quoting(): with gdaltest.error_handler(): ql = gdaltest.ds.ExecuteSQL("select eas_id from idlink where \"idlink.eas_id\" = 166") count = ql.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.ds.ReleaseResultSet(ql) def test_ogr_rfc28_7_good_quoting(): ql = gdaltest.ds.ExecuteSQL("select eas_id from idlink where idlink.eas_id = 166") count = ql.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.ds.ReleaseResultSet(ql) ############################################################################### # test with distinguished name for field in target columns. def test_ogr_rfc28_8_wrong_quoting(): with gdaltest.error_handler(): ql = gdaltest.ds.ExecuteSQL("select \"idlink.eas_id\" from idlink where \"idlink.eas_id\" = 166") count = ql.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = [166] tr = ogrtest.check_features_against_list(ql, 'idlink.eas_id', expect) gdaltest.ds.ReleaseResultSet(ql) assert tr def test_ogr_rfc28_8_good_quoting(): ql = gdaltest.ds.ExecuteSQL("select idlink.eas_id from idlink where idlink.eas_id = 166") count = ql.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = [166] tr = ogrtest.check_features_against_list(ql, 'idlink.eas_id', expect) gdaltest.ds.ReleaseResultSet(ql) assert tr ############################################################################### # Test with quoted funky (non-identifier) name. def test_ogr_rfc28_9(): ds = ogr.Open('data/oddname.csv') lyr = ds.GetLayer(0) lyr.SetAttributeFilter("\"Funky @Name\" = '32'") count = lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = ['8902'] tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) assert tr # TODO: unparse quoting? ############################################################################### # test quoted names for funky columns in SELECT WHERE (confirm unparse quoting) def test_ogr_rfc28_10(): ds = ogr.Open('data/oddname.csv') lyr = ds.ExecuteSQL("SELECT * from oddname where \"Funky @Name\" = '32'") count = lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = ['8902'] tr = ogrtest.check_features_against_list(lyr, 'PRIME_MERIDIAN_CODE', expect) ds.ReleaseResultSet(lyr) assert tr ############################################################################### # test quoted funky names in output columns list. def test_ogr_rfc28_11(): ds = ogr.Open('data/oddname.csv') lyr = ds.ExecuteSQL("SELECT \"Funky @Name\" from oddname where prime_meridian_code = '8902'") count = lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = ['32'] tr = ogrtest.check_features_against_list(lyr, 'Funky @Name', expect) ds.ReleaseResultSet(lyr) assert tr ############################################################################### # test selecting fixed string fields. def test_ogr_rfc28_12(): lyr = gdaltest.ds.ExecuteSQL("SELECT 'constant string', 'other' as abc, eas_id from idlink where eas_id = 165") count = lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) expect = ['other'] tr = ogrtest.check_features_against_list(lyr, 'abc', expect) expect = [165] if tr: lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'eas_id', expect) expect = ['constant string'] if tr: lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_1', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test SUBSTR operator in the context of a WHERE clause. def test_ogr_rfc28_13(): gdaltest.lyr.SetAttributeFilter("SUBSTR(PRFEDEA,5,4) = '3423'") count = gdaltest.lyr.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.lyr.SetAttributeFilter('') ############################################################################### # test selecting fixed string fields. def test_ogr_rfc28_14(): lyr = gdaltest.ds.ExecuteSQL("SELECT SUBSTR(PRFEDEA,4,5) from poly where eas_id in (168,179)") expect = ['43411', '43423'] tr = ogrtest.check_features_against_list(lyr, 'substr_prfedea', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test CONCAT with more than two arguments. def test_ogr_rfc28_15(): lyr = gdaltest.ds.ExecuteSQL("SELECT CONCAT(PRFEDEA,' ',CAST(EAS_ID AS CHARACTER(3))) from poly where eas_id in (168,179)") expect = ['35043411 168', '35043423 179'] tr = ogrtest.check_features_against_list(lyr, 'concat_prfedea', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test parse support for negative numbers (#3724) def test_ogr_rfc28_16(): lyr = gdaltest.ds.ExecuteSQL("SELECT -1, 3--1,3*-1,2e-1,3-1 from poly where eas_id = 168") expect = [-1] tr = ogrtest.check_features_against_list(lyr, 'field_1', expect) expect = [4] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_2', expect) expect = [-3] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_3', expect) expect = [0.2] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_4', expect) expect = [2] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_5', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test evaluation of division - had a problem with type conversion. def test_ogr_rfc28_17(): lyr = gdaltest.ds.ExecuteSQL("SELECT 5/2, 5.0/2.0, 5/2.0, 5.0/2 from poly where eas_id = 168") expect = [2] tr = ogrtest.check_features_against_list(lyr, 'field_1', expect) expect = [2.5] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_2', expect) expect = [2.5] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_3', expect) expect = [2.5] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'field_4', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test some special distinct cases. def test_ogr_rfc28_18(): lyr = gdaltest.ds.ExecuteSQL("SELECT COUNT(distinct id), COUNT(distinct id) as \"xx\" from departs") expect = [1] tr = ogrtest.check_features_against_list(lyr, 'COUNT_id', expect) expect = [1] lyr.ResetReading() tr = ogrtest.check_features_against_list(lyr, 'xx', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Verify that NOT IN ( list ) works def test_ogr_rfc28_19(): sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where eas_id not in (158,165)') count = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count == 8, \ ('Got wrong count with GetFeatureCount() - %d, expecting 8' % count) ############################################################################### # Verify arithmetic operator precedence and unary minus def test_ogr_rfc28_20(): ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") lyr = ds.CreateLayer("my_layer") field_defn = ogr.FieldDefn('intfield', ogr.OFTInteger) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 2) lyr.CreateFeature(feat) sql_lyr = ds.ExecuteSQL('select -intfield + 1 + 2 * 3 + 5 - 3 * 2 from my_layer') feat = sql_lyr.GetNextFeature() assert feat.GetField('FIELD_1') == 4 ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Verify that BETWEEN works def test_ogr_rfc28_21(): sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where eas_id between 165 and 169') count_between = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where eas_id >= 165 and eas_id <= 169') count_ge_and_le = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count_between == count_ge_and_le, \ ('Got wrong count with GetFeatureCount() - %d, expecting %d' % (count_between, count_ge_and_le)) ############################################################################### # Verify that NOT BETWEEN works def test_ogr_rfc28_22(): sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where eas_id not between 165 and 169') count_not_between = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.ds.ExecuteSQL('select * from poly where not(eas_id >= 165 and eas_id <= 169)') count_not_ge_and_le = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count_not_between == count_not_ge_and_le, \ ('Got wrong count with GetFeatureCount() - %d, expecting %d' % (count_not_between, count_not_ge_and_le)) ############################################################################### # Verify that NOT LIKE works def test_ogr_rfc28_23(): sql_lyr = gdaltest.ds.ExecuteSQL("select * from poly where PRFEDEA NOT LIKE '35043413'") count_not_like1 = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) sql_lyr = gdaltest.ds.ExecuteSQL("select * from poly where NOT (PRFEDEA LIKE '35043413')") count_not_like2 = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count_not_like1 == count_not_like2, \ ('Got wrong count with GetFeatureCount() - %d, expecting %d' % (count_not_like1, count_not_like2)) ############################################################################### # Verify that NULL works def test_ogr_rfc28_24(): sql_lyr = gdaltest.ds.ExecuteSQL("select *, NULL, NULL as nullstrfield, CAST(null as integer) as nullintfield from poly where NULL IS NULL") feat = sql_lyr.GetNextFeature() if feat.IsFieldSet('FIELD_4'): feat.DumpReadable() gdaltest.ds.ReleaseResultSet(sql_lyr) pytest.fail() if feat.IsFieldSet('nullstrfield'): feat.DumpReadable() gdaltest.ds.ReleaseResultSet(sql_lyr) pytest.fail() if feat.IsFieldSet('nullintfield'): feat.DumpReadable() gdaltest.ds.ReleaseResultSet(sql_lyr) pytest.fail() count = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count == 10, \ ('Got wrong count with GetFeatureCount() - %d, expecting %d' % (count, 10)) ############################################################################### # Verify that LIKE pattern ESCAPE escape_char works def test_ogr_rfc28_25(): sql_lyr = gdaltest.ds.ExecuteSQL("select * from poly where prfedea LIKE 'x35043408' ESCAPE 'x'") count = sql_lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(sql_lyr) assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) ############################################################################### # Test SUBSTR with negative offsets def test_ogr_rfc28_26(): lyr = gdaltest.ds.ExecuteSQL("SELECT SUBSTR(PRFEDEA,-2) from poly where eas_id in (168,179)") expect = ['11', '23'] tr = ogrtest.check_features_against_list(lyr, 'substr_prfedea', expect) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test that we correctly let floating point values as floating point, and not as integer (#4634)" def test_ogr_rfc28_27(): lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM poly WHERE 4000000000. > 2000000000.") count = lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(lyr) assert count == 10 ############################################################################### # Extensive test of the evaluation of arithmetic and logical operators def ogr_rfc28_28_test(formula, expected_val): sql_lyr = gdaltest.ds.ExecuteSQL("SELECT " + formula + " from poly where fid = 0") f = sql_lyr.GetNextFeature() got = f.GetField(0) gdaltest.ds.ReleaseResultSet(sql_lyr) assert got == expected_val, \ ('bad result for %s : %s' % (formula, str(expected_val))) def test_ogr_rfc28_28(): operators = ['+', '-', '*', '/', '%'] formulas = [] for operator in operators: formulas.append('6' + operator + '3') formulas.append('5.1' + operator + '3.2') formulas.append('5' + operator + '3.2') formulas.append('5.1' + operator + '3') formulas.append('3000000000000' + operator + '3') if operator != '/': formulas.append('3' + operator + '3000000000000') formulas.append('3000000000000' + operator + '3.') if operator != '/': formulas.append('3.' + operator + '3000000000000') for formula in formulas: expected_val = eval(formula) ret = ogr_rfc28_28_test(formula, expected_val) if ret == 'fail': return ret operators = ['<', '<=', '>', '>=', ' = ', '<>'] formulas = [] for operator in operators: formulas.append('3' + operator + '3') formulas.append('3.' + operator + '3.') formulas.append('3' + operator + '6') formulas.append('3.' + operator + '6.') formulas.append('3' + operator + '6.') formulas.append('3.' + operator + '6') formulas.append('6' + operator + '3') formulas.append('6.' + operator + '3.') formulas.append('6' + operator + '3.') formulas.append('6.' + operator + '3') formulas.append("'a'" + operator + "'a'") formulas.append("'a'" + operator + "'b'") formulas.append("'b'" + operator + "'a'") formulas.append('3' + operator + '1000000000000') formulas.append('1000000000000' + operator + '3') formulas.append('1000000000000' + operator + '1000000000000') for formula in formulas: expected_bool = eval(formula.replace(' = ', '==').replace('<>', '!=')) ret = ogr_rfc28_28_test(formula, expected_bool) if ret == 'fail': return ret formulas_and_expected_val = [['3 in (3,5)', True], ['1000000000000 in (1000000000000, 1000000000001)', True], ['4 in (3,5)', False], ['3. in (3.,4.)', True], ['4. in (3.,5.)', False], ["'c' in ('c','e')", True], ["'d' in ('c','e')", False], ['2 between 2 and 4', True], ['3 between 2 and 4', True], ['4 between 2 and 4', True], ['1 between 2 and 4', False], ['5 between 2 and 4', False], ['2. between 2. and 4.', True], ['3. between 2. and 4.', True], ['4. between 2. and 4.', True], ['1. between 2. and 4.', False], ['5. between 2. and 4.', False], ["'b' between 'b' and 'd'", True], ["'c' between 'b' and 'd'", True], ["'d' between 'b' and 'd'", True], ["'a' between 'b' and 'd'", False], ["'e' between 'b' and 'd'", False], ["null is null", True], ["1 is null", False], ["1.0 is null", False]] for [formula, expected_val] in formulas_and_expected_val: ret = ogr_rfc28_28_test(formula, expected_val) if ret == 'fail': return ret ############################################################################### # Test behaviour of binary operations when one operand is a NULL value def test_ogr_rfc28_29(): lyr = gdaltest.ds.ExecuteSQL("select * from idlink where (eas_id + cast(null as integer)) is not null or eas_id = 170 + cast(null as integer) or (eas_id + cast(null as float)) is not null or eas_id = 170.0 + cast(null as float)") count = lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(lyr) assert count == 0 ############################################################################### # Test behaviour of binary operations on strings when one operand is a NULL value def test_ogr_rfc28_30(): lyr = gdaltest.ds.ExecuteSQL("select * from idlink2 where F1 <> 'foo' or concat(F1,cast(null as character(32))) is not null") count = lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(lyr) assert count == 0 ############################################################################### # Test UNION ALL def test_ogr_rfc28_31(): lyr = gdaltest.ds.ExecuteSQL("select * from idlink union all select * from idlink2") count = lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(lyr) assert count != 6 + 7 ############################################################################### # Test UNION ALL with parenthesis def test_ogr_rfc28_32(): lyr = gdaltest.ds.ExecuteSQL("(select * from idlink) union all (select * from idlink2 order by eas_id)") count = lyr.GetFeatureCount() gdaltest.ds.ReleaseResultSet(lyr) assert count != 6 + 7 ############################################################################### # Test lack of end-of-string character def test_ogr_rfc28_33(): gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select * from idlink where name='foo") gdal.PopErrorHandler() assert lyr is None ############################################################################### # Test wildcard expansion of an unknown table. def test_ogr_rfc28_34(): gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select foo.* from idlink") gdal.PopErrorHandler() assert (gdal.GetLastErrorMsg().find( 'Table foo not recognised from foo.* definition') == 0) assert lyr is None ############################################################################### # Test selecting more than one distinct def test_ogr_rfc28_35(): gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select distinct eas_id, distinct name from idlink") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('SQL Expression Parsing Error') == 0 assert lyr is None ############################################################################### # Test selecting more than one distinct def test_ogr_rfc28_35_bis(): gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select distinct eas_id, name from idlink") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('SELECT DISTINCT not supported on multiple columns') == 0 assert lyr is None ############################################################################### # Test selecting more than one distinct def test_ogr_rfc28_35_ter(): gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select distinct * from idlink") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find('SELECT DISTINCT not supported on multiple columns') == 0 assert lyr is None ############################################################################### # Test ORDER BY a DISTINCT list by more than one key def test_ogr_rfc28_36(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select distinct eas_id from idlink order by eas_id, name") if lyr is not None: lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find("Can't ORDER BY a DISTINCT list by more than one key") == 0 gdaltest.ds.ReleaseResultSet(lyr) ############################################################################### # Test different fields for ORDER BY and DISTINCT def test_ogr_rfc28_37(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("select distinct eas_id from idlink order by name") if lyr is not None: lyr.GetNextFeature() gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find("Only selected DISTINCT field can be used for ORDER BY") == 0 gdaltest.ds.ReleaseResultSet(lyr) ############################################################################### # Test invalid SUBSTR def test_ogr_rfc28_38(): gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("SELECT SUBSTR(PRFEDEA) from poly") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find("Expected 2 or 3 arguments to SUBSTR(), but got 1") == 0 assert lyr is None gdal.ErrorReset() gdal.PushErrorHandler('CPLQuietErrorHandler') lyr = gdaltest.ds.ExecuteSQL("SELECT SUBSTR(1,2) from poly") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg().find("Wrong argument type for SUBSTR()") == 0 assert lyr is None ############################################################################### # Test COUNT() on a 0-row result def test_ogr_rfc28_39(): lyr = gdaltest.ds.ExecuteSQL("SELECT COUNT(*) from poly where 0 = 1") tr = ogrtest.check_features_against_list(lyr, 'count_*', [0]) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test MIN(), MAX() and AVG() on a date (#5333) def test_ogr_rfc28_40(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('test') lyr.CreateField(ogr.FieldDefn('DATE', ogr.OFTDateTime)) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '2013/12/31 23:59:59') lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, '2013/01/01 00:00:00') lyr.CreateFeature(feat) lyr = ds.ExecuteSQL("SELECT MIN(DATE), MAX(DATE), AVG(DATE) from test") tr = ogrtest.check_features_against_list(lyr, 'MIN_DATE', ['2013/01/01 00:00:00']) lyr.ResetReading() tr2 = ogrtest.check_features_against_list(lyr, 'MAX_DATE', ['2013/12/31 23:59:59']) lyr.ResetReading() tr3 = ogrtest.check_features_against_list(lyr, 'AVG_DATE', ['2013/07/02 11:59:59.500']) gdaltest.ds.ReleaseResultSet(lyr) assert tr assert tr2 assert tr3 ############################################################################### # Verify that SELECT * works on a layer with a field that has a dot character (#5379) def test_ogr_rfc28_41(): ds = ogr.GetDriverByName("Memory").CreateDataSource("my_ds") lyr = ds.CreateLayer("my_layer") field_defn = ogr.FieldDefn('a.b', ogr.OFTInteger) lyr.CreateField(field_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 2) lyr.CreateFeature(feat) sql_lyr = ds.ExecuteSQL('select * from my_layer') feat = sql_lyr.GetNextFeature() assert feat.GetField('a.b') == 2 ds.ReleaseResultSet(sql_lyr) sql_lyr = ds.ExecuteSQL('select l.* from my_layer l') feat = sql_lyr.GetNextFeature() assert feat.GetField('l.a.b') == 2 ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test boolean and int16 support def test_ogr_rfc28_42(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('test') fld_defn = ogr.FieldDefn('b', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTBoolean) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('short', ogr.OFTInteger) fld_defn.SetSubType(ogr.OFSTInt16) lyr.CreateField(fld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 0) feat.SetField(1, 32000) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) lyr.CreateFeature(feat) # To b OR NOT to b... that's the question lyr = ds.ExecuteSQL("SELECT b, NOT b, 1 + b, CAST(1 AS BOOLEAN), b IS NOT NULL, short, 1 + short, CAST(1 + short as SMALLINT) FROM test WHERE b OR NOT b") assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(1).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(2).GetSubType() == ogr.OFSTNone assert lyr.GetLayerDefn().GetFieldDefn(3).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(4).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(5).GetSubType() == ogr.OFSTInt16 assert lyr.GetLayerDefn().GetFieldDefn(6).GetSubType() == ogr.OFSTNone assert lyr.GetLayerDefn().GetFieldDefn(7).GetSubType() == ogr.OFSTInt16 f = lyr.GetNextFeature() if f.GetField('b') != 0 or f.GetField(1) != 1 or f.GetField(2) != 1 or \ f.GetField(3) != 1 or f.GetField(4) != 1 or \ f.GetField(5) != 32000 or f.GetField(6) != 32001 or f.GetField(7) != 32001: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('b') != 1 or f.GetField(1) != 0 or f.GetField(2) != 2 or f.GetField(3) != 1 or f.GetField(4) != 1: f.DumpReadable() pytest.fail() gdaltest.ds.ReleaseResultSet(lyr) lyr = ds.ExecuteSQL("SELECT MIN(b), MAX(b), SUM(b) FROM test") assert lyr.GetLayerDefn().GetFieldDefn(0).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(1).GetSubType() == ogr.OFSTBoolean assert lyr.GetLayerDefn().GetFieldDefn(2).GetSubType() == ogr.OFSTNone f = lyr.GetNextFeature() assert f.GetField('MIN_b') == 0 assert f.GetField('MAX_b') == 1 assert f.GetField('SUM_b') == 1 gdaltest.ds.ReleaseResultSet(lyr) ############################################################################### # Test integer64 support def test_ogr_rfc28_43(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('test') fld_defn = ogr.FieldDefn('myint64', ogr.OFTInteger64) lyr.CreateField(fld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, -1000000000000) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 100000000000) lyr.CreateFeature(feat) lyr = ds.ExecuteSQL("SELECT 1000000000000, myint64, CAST(1 AS bigint), CAST(100000000000 AS bigint), CAST(1 AS numeric(15,0)) FROM test WHERE myint64 < -9999999999 or myint64 > 9999999999") f = lyr.GetNextFeature() assert lyr.GetLayerDefn().GetFieldDefn(2).GetType() == ogr.OFTInteger64 assert lyr.GetLayerDefn().GetFieldDefn(3).GetType() == ogr.OFTInteger64 if f.GetField(0) != 1000000000000 or f.GetField(1) != -1000000000000 or f.GetField(2) != 1 or f.GetField(3) != 100000000000 or f.GetField(4) != 1.0: f.DumpReadable() pytest.fail() gdaltest.ds.ReleaseResultSet(lyr) lyr = ds.ExecuteSQL("SELECT MIN(myint64), MAX(myint64), SUM(myint64) FROM test") f = lyr.GetNextFeature() if f.GetField('MIN_myint64') != -1000000000000: f.DumpReadable() pytest.fail() if f.GetField('MAX_myint64') != 100000000000: f.DumpReadable() pytest.fail() if f.GetField('SUM_myint64') != -1000000000000 + 100000000000: f.DumpReadable() pytest.fail() gdaltest.ds.ReleaseResultSet(lyr) lyr = ds.ExecuteSQL("SELECT DISTINCT myint64 FROM test ORDER BY myint64") f = lyr.GetNextFeature() if f.GetField('myint64') != -1000000000000: f.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f.GetField('myint64') != 100000000000: f.DumpReadable() pytest.fail() gdaltest.ds.ReleaseResultSet(lyr) ############################################################################### # Test crazy quoting of table and fields def test_ogr_rfc28_44(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('lyr.withpoint') fld_defn = ogr.FieldDefn('field.withpoint', ogr.OFTInteger) lyr.CreateField(fld_defn) fld_defn = ogr.FieldDefn('foo', ogr.OFTInteger) lyr.CreateField(fld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, -1) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField(0, 1) feat.SetField(1, 2) lyr.CreateFeature(feat) gdal.ErrorReset() lyr = ds.ExecuteSQL("SELECT * FROM \"lyr.withpoint\" WHERE \"field.withpoint\" = 1") assert gdal.GetLastErrorMsg() == '' f = lyr.GetNextFeature() assert f is not None gdaltest.ds.ReleaseResultSet(lyr) gdal.ErrorReset() lyr = ds.ExecuteSQL("SELECT \"lyr.withpoint\".\"field.withpoint\", \"field.withpoint\" FROM \"lyr.withpoint\" WHERE \"lyr.withpoint\".\"field.withpoint\" = 1") assert gdal.GetLastErrorMsg() == '' f = lyr.GetNextFeature() assert f is not None gdaltest.ds.ReleaseResultSet(lyr) # Test our tolerance against lack of necessary quoting gdal.ErrorReset() gdal.PushErrorHandler() lyr = ds.ExecuteSQL("SELECT * FROM \"lyr.withpoint\" WHERE field.withpoint = 1") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == 'Passed field name field.withpoint should have been surrounded by double quotes. Accepted since there is no ambiguity...' f = lyr.GetNextFeature() assert f is not None gdaltest.ds.ReleaseResultSet(lyr) # Againg, but in a situation where there IS ambiguity lyr = ds.CreateLayer('field') fld_defn = ogr.FieldDefn('id', ogr.OFTInteger) lyr.CreateField(fld_defn) gdal.ErrorReset() gdal.PushErrorHandler() lyr = ds.ExecuteSQL("SELECT * FROM \"lyr.withpoint\" JOIN field ON \"lyr.withpoint\".foo = field.id WHERE field.withpoint = 1") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == '"field"."withpoint" not recognised as an available field.' assert lyr is None # Test our tolerance against unnecessary quoting gdal.ErrorReset() gdal.PushErrorHandler() lyr = ds.ExecuteSQL("SELECT * FROM \"lyr.withpoint\" f WHERE \"f.foo\" = 2") gdal.PopErrorHandler() assert gdal.GetLastErrorMsg() == 'Passed field name f.foo should NOT have been surrounded by double quotes. Accepted since there is no ambiguity...' f = lyr.GetNextFeature() assert f is not None gdaltest.ds.ReleaseResultSet(lyr) ############################################################################### # Test 'FROM table_name AS alias' def test_ogr_rfc28_45(): ql = gdaltest.ds.ExecuteSQL("select eas_id from idlink as il where il.eas_id = 166") count = ql.GetFeatureCount() assert count == 1, \ ('Got wrong count with GetFeatureCount() - %d, expecting 1' % count) gdaltest.ds.ReleaseResultSet(ql) ############################################################################### # Test fid special column and 64 bit def test_ogr_rfc28_46(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('lyr') fld_defn = ogr.FieldDefn('val', ogr.OFTInteger) lyr.CreateField(fld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(3000000000) feat.SetField('val', 1) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(2500000000) feat.SetField('val', 2) lyr.CreateFeature(feat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetFID(2200000000) feat.SetField('val', 3) lyr.CreateFeature(feat) lyr.SetAttributeFilter('fid >= 2500000000') assert lyr.GetFeatureCount() == 2 lyr.SetAttributeFilter(None) # Explicit cast of fid to bigint needed in SELECT columns sql_lyr = ds.ExecuteSQL('SELECT CAST(fid AS bigint) AS outfid, val FROM lyr WHERE fid >= 2500000000 ORDER BY fid') f = sql_lyr.GetNextFeature() if f.GetFID() != 2500000000 or f['outfid'] != 2500000000 or f['val'] != 2: f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() if f.GetFID() != 3000000000 or f['outfid'] != 3000000000 or f['val'] != 1: f.DumpReadable() pytest.fail() f = sql_lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) # Explicit cast of fid to bigint no longer needed if the layer is declared OLMD_FID64=YES lyr.SetMetadataItem('OLMD_FID64', 'YES') sql_lyr = ds.ExecuteSQL('SELECT fid AS outfid, val FROM lyr WHERE fid >= 2500000000 ORDER BY fid') f = sql_lyr.GetNextFeature() if f.GetFID() != 2500000000 or f['outfid'] != 2500000000 or f['val'] != 2: f.DumpReadable() pytest.fail() ds.ReleaseResultSet(sql_lyr) ds = None ############################################################################### # Test LIMIT and OFFSET def test_ogr_rfc28_47(): lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY LIMIT 0") tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', []) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY LIMIT 1") assert lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [168]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY ORDER BY EAS_ID LIMIT 1") assert lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [158]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY ORDER BY PRFEDEA LIMIT 1") assert lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(lyr, 'PRFEDEA', ['35043369']) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY WHERE 0 ORDER BY EAS_ID LIMIT 1") assert lyr.GetNextFeature() is None gdaltest.ds.ReleaseResultSet(lyr) lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY WHERE EAS_ID = 168 LIMIT 11") assert lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [168]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY WHERE EAS_ID = 168 OFFSET 0") tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [168]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY WHERE EAS_ID = 168 OFFSET 1") assert lyr.GetFeatureCount() == 0 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', []) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY OFFSET 10") assert lyr.GetFeatureCount() == 0 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', []) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY OFFSET 8") assert lyr.GetFeatureCount() == 2 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [165, 170]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY LIMIT 1 OFFSET 8") assert lyr.GetFeatureCount() == 1 tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [165]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY LIMIT 2 OFFSET 8") lyr.SetNextByIndex(1) f = lyr.GetNextFeature() assert f['EAS_ID'] == 170 f = lyr.GetNextFeature() assert f is None gdaltest.ds.ReleaseResultSet(lyr) lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY ORDER BY EAS_ID DESC LIMIT 2") tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [179, 173]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT * FROM POLY ORDER BY EAS_ID DESC LIMIT 1 OFFSET 1") tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [173]) gdaltest.ds.ReleaseResultSet(lyr) assert tr lyr = gdaltest.ds.ExecuteSQL("SELECT DISTINCT EAS_ID FROM POLY ORDER BY EAS_ID DESC LIMIT 2 OFFSET 3") tr = ogrtest.check_features_against_list(lyr, 'EAS_ID', [171, 170]) gdaltest.ds.ReleaseResultSet(lyr) assert tr ############################################################################### # Test date/datetime comparisons (#6810) def test_ogr_rfc28_48(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('lyr') fld_defn = ogr.FieldDefn('dt', ogr.OFTDateTime) lyr.CreateField(fld_defn) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetField('dt', '2017/02/17 11:06:34') lyr.CreateFeature(feat) with gdaltest.error_handler(): assert lyr.SetAttributeFilter('dt >= 2500000000') != 0 lyr.SetAttributeFilter("dt >= 'a'") with gdaltest.error_handler(): assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("'a' <= dt") with gdaltest.error_handler(): assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt BETWEEN dt AND 'a'") with gdaltest.error_handler(): assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt >= '2017/02/17 11:06:34'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt >= '2017/02/17'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt >= '2017/02/17 11:06:35'") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt > '2017/02/17 11:06:33'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt > '2017/02/17 11:06:34'") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt <= '2017/02/17 11:06:34'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt <= '2017/02/17 11:06:33'") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt < '2017/02/17 11:06:35'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt < '2017/02/17 11:06:34'") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt = '2017/02/17 11:06:34'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt = '2017/02/17 11:06:34.001'") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt BETWEEN dt AND dt") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt BETWEEN '2017/02/17 11:06:33.999' AND '2017/02/17 11:06:34.001'") assert lyr.GetFeatureCount() == 1 lyr.SetAttributeFilter("dt BETWEEN '2017/02/17 11:06:34.001' AND dt") assert lyr.GetFeatureCount() == 0 lyr.SetAttributeFilter("dt BETWEEN dt AND '2017/02/17 11:06:33.999'") assert lyr.GetFeatureCount() == 0 ############################################################################### def test_ogr_rfc28_int_overflows(): ds = ogr.GetDriverByName('Memory').CreateDataSource('') lyr = ds.CreateLayer('lyr') f = ogr.Feature(lyr.GetLayerDefn()) lyr.CreateFeature(f) tests = [('SELECT -9223372036854775808 FROM lyr', -9223372036854775808), ('SELECT -(-9223372036854775808) FROM lyr', -9223372036854775808), # we could argue about the expected result... ('SELECT -9223372036854775808/1 FROM lyr', -9223372036854775808), ('SELECT 9223372036854775807 FROM lyr', 9223372036854775807), ('SELECT 9223372036854775807*1 FROM lyr', 9223372036854775807), ('SELECT 9223372036854775807/1 FROM lyr', 9223372036854775807), ('SELECT 9223372036854775807/-1 FROM lyr', -9223372036854775807), ('SELECT 9223372036854775807*-1 FROM lyr', -9223372036854775807), ('SELECT -1*9223372036854775807 FROM lyr', -9223372036854775807), ('SELECT 1*(-9223372036854775808) FROM lyr', -9223372036854775808), ('SELECT 0*(-9223372036854775808) FROM lyr', 0), ('SELECT 9223372036854775806+1 FROM lyr', 9223372036854775807), ('SELECT -9223372036854775807-1 FROM lyr', -9223372036854775808), ('SELECT 9223372036854775808 FROM lyr', 9223372036854775808.0), ('SELECT -9223372036854775809 FROM lyr', -9223372036854775809.0), ('SELECT 9223372036854775807+1 FROM lyr', None), ('SELECT 9223372036854775807 - (-1) FROM lyr', None), ('SELECT -9223372036854775808-1 FROM lyr', None), ('SELECT -9223372036854775808 + (-1) FROM lyr', None), ('SELECT 9223372036854775807*2 FROM lyr', None), ('SELECT -9223372036854775807*2 FROM lyr', None), ('SELECT -1*(-9223372036854775808) FROM lyr', None), ('SELECT 2 * (-9223372036854775807) FROM lyr', None), ('SELECT 9223372036854775807*-2 FROM lyr', None), ('SELECT -9223372036854775807*-2 FROM lyr', None), ('SELECT -9223372036854775808*-1 FROM lyr', None), ('SELECT -9223372036854775808/-1 FROM lyr', None), ('SELECT 1/0 FROM lyr', 2147483647), ] for sql, res in tests: sql_lyr = ds.ExecuteSQL(sql) if res is None: with gdaltest.error_handler(): f = sql_lyr.GetNextFeature() else: f = sql_lyr.GetNextFeature() assert f.GetField(0) == res, (sql, res, f.GetField(0)) ds.ReleaseResultSet(sql_lyr) ############################################################################### def test_ogr_rfc28_cleanup(): gdaltest.lyr = None gdaltest.ds = None gdalautotest-3.0.4/conftest.py0000644003401500001440000000516113614005365016035 0ustar rouaultusers# coding: utf-8 from __future__ import absolute_import, division, print_function import os import sys import pytest from osgeo import gdal # Put the pymod dir on the path, so modules can `import gdaltest` sys.path.insert(0, os.path.join(os.path.dirname(__file__), "pymod")) # put the autotest dir on the path too. This lets us import all test modules sys.path.insert(1, os.path.dirname(__file__)) # These files may be non-importable, and don't contain tests anyway. # So we skip searching them during test collection. collect_ignore = ["kml_generate_test_files.py", "gdrivers/netcdf_cfchecks.py"] # 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 'APPLY_LOCALE' in os.environ: import locale locale.setlocale(locale.LC_ALL, '') @pytest.fixture(scope="module", autouse=True) def chdir_to_test_file(request): """ Changes to the same directory as the test file. Also puts that directory at the start of sys.path, so that imports of other files in the same directory are easy. Tests have grown to expect this. NOTE: This happens when the test is *run*, not during collection. So test modules must not rely on it at module level. """ old = os.getcwd() os.chdir(os.path.dirname(request.module.__file__)) sys.path.insert(0, ".") yield if sys.path and sys.path[0] == ".": sys.path.pop(0) os.chdir(old) def pytest_collection_modifyitems(config, items): # skip tests with @pytest.mark.require_driver(name) when the driver isn't available skip_driver_not_present = pytest.mark.skip("Driver not present") # skip test with @ptest.mark.require_run_on_demand when RUN_ON_DEMAND is not set skip_run_on_demand_not_set = pytest.mark.skip("RUN_ON_DEMAND not set") import gdaltest drivers_checked = {} for item in items: for mark in item.iter_markers('require_driver'): driver_name = mark.args[0] if driver_name not in drivers_checked: driver = gdal.GetDriverByName(driver_name) drivers_checked[driver_name] = bool(driver) if driver: # Store the driver on gdaltest module so test functions can assume it's there. setattr(gdaltest, '%s_drv' % driver_name.lower(), driver) if not drivers_checked[driver_name]: item.add_marker(skip_driver_not_present) if not gdal.GetConfigOption('RUN_ON_DEMAND'): for mark in item.iter_markers('require_run_on_demand'): item.add_marker(skip_run_on_demand_not_set) gdalautotest-3.0.4/test_random_tiff.py0000644003401500001440000001336213614005365017541 0ustar rouaultusers#!/usr/bin/env python ############################################################################### # $Id: test_random_tiff.py 12e021243b6412f39c13e7bf287087359f91c6af 2018-05-06 20:19:59 +1000 Ben Elliston $ # # Project: GDAL/OGR Test Suite # Purpose: Test "random" TIFF files # Author: Even Rouault, # ############################################################################### # Copyright (c) 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 random from osgeo import gdal COMPRESSION_NONE = 1 PHOTOMETRIC_MINISBLACK = 1 PLANARCONFIG_CONTIG = 1 PLANARCONFIG_SEPARATE = 2 SAMPLEFORMAT_UINT = 1 TIFFTAG_IMAGEWIDTH = 256 TIFFTAG_IMAGELENGTH = 257 TIFFTAG_BITSPERSAMPLE = 258 TIFFTAG_COMPRESSION = 259 TIFFTAG_PHOTOMETRIC = 262 TIFFTAG_STRIPOFFSETS = 273 TIFFTAG_SAMPLESPERPIXEL = 277 TIFFTAG_ROWSPERSTRIP = 278 TIFFTAG_STRIPBYTECOUNTS = 279 TIFFTAG_PLANARCONFIG = 284 TIFFTAG_TILEWIDTH = 322 TIFFTAG_TILELENGTH = 323 TIFFTAG_TILEOFFSETS = 324 TIFFTAG_TILEBYTECOUNTS = 325 TIFFTAG_SAMPLEFORMAT = 339 tags = [['TIFFTAG_IMAGEWIDTH', TIFFTAG_IMAGEWIDTH, [0, 1, 0x7FFFFFFF, 0xFFFFFFFF]], ['TIFFTAG_IMAGELENGTH', TIFFTAG_IMAGELENGTH, [0, 1, 0x7FFFFFFF, 0xFFFFFFFF]], ['TIFFTAG_BITSPERSAMPLE', TIFFTAG_BITSPERSAMPLE, [None, 1, 8, 255]], # ['TIFFTAG_COMPRESSION', TIFFTAG_COMPRESSION, [None, COMPRESSION_NONE]], # ['TIFFTAG_PHOTOMETRIC', TIFFTAG_PHOTOMETRIC, [None, PHOTOMETRIC_MINISBLACK]], ['TIFFTAG_STRIPOFFSETS', TIFFTAG_STRIPOFFSETS, [None, 0, 8]], ['TIFFTAG_SAMPLESPERPIXEL', TIFFTAG_SAMPLESPERPIXEL, [None, 1, 255, 65535]], ['TIFFTAG_ROWSPERSTRIP', TIFFTAG_ROWSPERSTRIP, [None, 0, 1, 0x7FFFFFFF, 0xFFFFFFFF]], ['TIFFTAG_STRIPBYTECOUNTS', TIFFTAG_STRIPBYTECOUNTS, [None, 0, 1, 0x7FFFFFFF, 0xFFFFFFFF]], ['TIFFTAG_PLANARCONFIG', TIFFTAG_PLANARCONFIG, [None, PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE]], ['TIFFTAG_TILEWIDTH', TIFFTAG_TILEWIDTH, [None, 0, 8, 256, 65536, 0x7FFFFFFF]], ['TIFFTAG_TILELENGTH', TIFFTAG_TILELENGTH, [None, 0, 8, 256, 65536, 0x7FFFFFFF]], ['TIFFTAG_TILEOFFSETS', TIFFTAG_TILEOFFSETS, [None, 0, 8]], ['TIFFTAG_TILEBYTECOUNTS', TIFFTAG_TILEBYTECOUNTS, [None, 0, 1, 0x7FFFFFFF, 0xFFFFFFFF]], # ['TIFFTAG_SAMPLEFORMAT', TIFFTAG_SAMPLEFORMAT, [None, SAMPLEFORMAT_UINT]], ] def generate_tif(comb_val): idx_tab = [] count_non_none = 0 has_strip = False for tag in tags: tag = tag[1] possible_vals = tag[2] len_possible_vals = tag[3] idx_val = comb_val % len_possible_vals comb_val = int(comb_val / len_possible_vals) val = possible_vals[idx_val] if tag == TIFFTAG_TILEWIDTH or \ tag == TIFFTAG_TILELENGTH or \ tag == TIFFTAG_TILEOFFSETS or \ tag == TIFFTAG_TILEBYTECOUNTS: if has_strip: idx_val = 0 val = None idx_tab.append(idx_val) if val is not None: if tag == TIFFTAG_STRIPOFFSETS or \ tag == TIFFTAG_ROWSPERSTRIP or \ tag == TIFFTAG_STRIPBYTECOUNTS: has_strip = True count_non_none = count_non_none + 1 content = '\x49\x49\x2A\x00\x08\x00\x00\x00' + ('%c' % count_non_none) + '\x00' for level, tag in enumerate(tags): tag = tag[1] possible_vals = tag[2] idx = idx_tab[level] val = possible_vals[idx] if val is not None: content = content + ('%c' % (tag & 255)) + ('%c' % (tag >> 8)) content = content + '\x04\x00\x01\x00\x00\x00' content = content + ('%c' % (val & 255)) + ('%c' % ((val >> 8) & 255)) + ('%c' % ((val >> 16) & 255)) + ('%c' % ((val >> 24) & 255)) return content nVals = 1 for level, tag in enumerate(tags): len_possible_vals = len(tag[2]) tags[level].append(len_possible_vals) nVals = nVals * len_possible_vals itern = 0 while True: itern += 1 comb_val = random.randrange(0, nVals) content = generate_tif(comb_val) # f = open('test.tif', 'wb') # f.write(content) # f.close() # print(struct.unpack('B' * len(content), content)) # Create in-memory file gdal.FileFromMemBuffer('/vsimem/test.tif', content) print('iter = %d, comb_val_init = %d' % (itern, comb_val)) ds = gdal.Open('/vsimem/test.tif') # if ds is not None and ds.RasterCount == 1: # (blockxsize, blockysize) = ds.GetRasterBand(1).GetBlockSize() # if blockxsize == ds.RasterXSize: # ds.GetRasterBand(1).Checksum() ds = None # Release memory associated to the in-memory file # gdal.Unlink('/vsimem/test.tif') gdalautotest-3.0.4/pymod/0000755003401500001440000000000013614005366014764 5ustar rouaultusersgdalautotest-3.0.4/pymod/gdaltest_python3.py0000644003401500001440000001463113614005365020635 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # $Id: gdaltest_python3.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Python Library supporting GDAL/OGR Test Suite # Author: Even Rouault, # ############################################################################### # 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 urllib.request import urllib.error import urllib.parse import socket import subprocess import shlex import os import sys from queue import Queue from threading import Thread def run_func(func): try: result = func() print(result) return result except SystemExit as x: import traceback traceback.print_exc() raise x except Exception: # We really do want to catch most exceptions percolating up to here # pylint: disable=broad-except result = 'fail (blowup)' print(result) import traceback traceback.print_exc() return result def urlescape(url): # Escape any non-ASCII characters try: import urllib url = urllib.parse.quote(url) except AttributeError: pass return url def gdalurlopen(url, timeout=10): old_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(timeout) proxy = None if 'GDAL_HTTP_PROXY' in os.environ: proxy = os.environ['GDAL_HTTP_PROXY'] protocol = 'http' if 'GDAL_HTTPS_PROXY' in os.environ and url.startswith('https'): proxy = os.environ['GDAL_HTTPS_PROXY'] protocol = 'https' if proxy is not None: if 'GDAL_HTTP_PROXYUSERPWD' in os.environ: proxyuserpwd = os.environ['GDAL_HTTP_PROXYUSERPWD'] proxyHandler = urllib.request.ProxyHandler({"%s" % protocol: "%s://%s@%s" % (protocol, proxyuserpwd, proxy)}) else: proxyuserpwd = None proxyHandler = urllib.request.ProxyHandler({"%s" % protocol: "%s://%s" % (protocol, proxy)}) opener = urllib.request.build_opener(proxyHandler, urllib.request.HTTPHandler) urllib.request.install_opener(opener) try: handle = urllib.request.urlopen(url) socket.setdefaulttimeout(old_timeout) return handle except urllib.error.HTTPError as e: print('HTTP service for %s is down (HTTP Error: %d)' % (url, e.code)) socket.setdefaulttimeout(old_timeout) return None except urllib.error.URLError as e: print('HTTP service for %s is down (URL Error: %s)' % (url, e.reason)) socket.setdefaulttimeout(old_timeout) return None except urllib.error.ContentTooShort: print('HTTP content too short for %s.' % url) socket.setdefaulttimeout(old_timeout) return None def spawn_async(cmd): command = shlex.split(cmd) try: process = subprocess.Popen(command, stdout=subprocess.PIPE) return (process, process.stdout) except OSError: return (None, None) def wait_process(process): process.wait() def runexternal(cmd, strin=None, check_memleak=True, display_live_on_parent_stdout=False, encoding='latin1'): # pylint: disable=unused-argument command = shlex.split(cmd) if strin is None: p = subprocess.Popen(command, stdout=subprocess.PIPE) else: p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) p.stdin.write(bytes(strin, 'ascii')) p.stdin.close() if p.stdout is not None: if display_live_on_parent_stdout: ret = '' ret_stdout = p.stdout while True: c = ret_stdout.read(1).decode(encoding) if c == '': break ret = ret + c sys.stdout.write(c) else: ret = p.stdout.read().decode(encoding) else: ret = '' waitcode = p.wait() if waitcode != 0: ret = ret + '\nERROR ret code = %d' % waitcode return ret def read_in_thread(f, q): q.put(f.read()) f.close() def runexternal_out_and_err(cmd, check_memleak=True, encoding='ascii'): # pylint: disable=unused-argument command = shlex.split(cmd) p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if p.stdout is not None: q_stdout = Queue() t_stdout = Thread(target=read_in_thread, args=(p.stdout, q_stdout)) t_stdout.start() else: q_stdout = None ret_stdout = '' if p.stderr is not None: q_stderr = Queue() t_stderr = Thread(target=read_in_thread, args=(p.stderr, q_stderr)) t_stderr.start() else: q_stderr = None ret_stderr = '' if q_stdout is not None: ret_stdout = q_stdout.get().decode(encoding) if q_stderr is not None: ret_stderr = q_stderr.get().decode(encoding) waitcode = p.wait() if waitcode != 0: ret_stderr = ret_stderr + '\nERROR ret code = %d' % waitcode return (ret_stdout, ret_stderr) gdalautotest-3.0.4/pymod/xmlvalidate.py0000644003401500001440000004445213614005365017660 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # # Project: MapServer # Purpose: XML validator # Author: Even Rouault, # ############################################################################### # Copyright (C) 2013, Even Rouault # Portions coming from EOxServer # ( https://github.com/EOxServer/eoxserver/blob/master/eoxserver/services/testbase.py ) # Copyright (C) 2011 EOX IT Services GmbH # # 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 of this Software or works derived from this 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 lxml import etree import gdaltest ############################################################################### # Remove mime header if found def ingest_file_and_strip_mime(filename): data = '' f = open(filename, 'rt') for line in f.readlines(): if line == '\r\n': continue if line == '\n': continue if 'Content-Type' in line: continue data = data + line f.close() return data ############################################################################### # Replace http://schemas.opengis.net/foo by $(ogc_schemas_location)/foo def substitute_ogc_schemas_location(location, ogc_schemas_location): if ogc_schemas_location is not None and \ location.startswith('http://schemas.opengis.net/'): location = ogc_schemas_location + '/' + location[len('http://schemas.opengis.net/'):] return location ############################################################################### # Replace http://inspire.ec.europa.eu/schemas/foo by $(inspire_schemas_location)/foo def substitute_inspire_schemas_location(location, inspire_schemas_location): if inspire_schemas_location is not None and \ location.startswith('http://inspire.ec.europa.eu/schemas/'): location = inspire_schemas_location + '/' + location[len('http://inspire.ec.europa.eu/schemas/'):] return location ############################################################################### # Validation function def validate(xml_filename_or_content, xsd_filename=None, application_schema_ns=None, ogc_schemas_location=None, inspire_schemas_location=None): try: if xml_filename_or_content.startswith('<'): doc = etree.XML(xml_filename_or_content) else: doc = etree.XML(ingest_file_and_strip_mime(xml_filename_or_content)) except etree.Error as e: print(str(e)) return False # Special case if this is a schema if doc.tag == '{http://www.w3.org/2001/XMLSchema}schema': for child in doc: if child.tag == '{http://www.w3.org/2001/XMLSchema}import': location = child.get('schemaLocation') location = substitute_ogc_schemas_location(location, ogc_schemas_location) location = substitute_inspire_schemas_location(location, inspire_schemas_location) child.set('schemaLocation', location) try: etree.XMLSchema(etree.XML(etree.tostring(doc))) return True except etree.Error as e: print(str(e)) return False schema_locations = doc.get("{http://www.w3.org/2001/XMLSchema-instance}schemaLocation") if schema_locations is None: print('No schemaLocation found') return False # Our stripped GetFeature document have an empty timeStamp, put a # fake value one instead if doc.get('timeStamp') == '': doc.set('timeStamp', '1970-01-01T00:00:00Z') locations = schema_locations.split() # get schema locations schema_def = etree.Element("schema", attrib={ "elementFormDefault": "qualified", "version": "1.0.0", }, nsmap={ None: "http://www.w3.org/2001/XMLSchema" } ) tempfiles = [] import_dict = {} # Special case for the main application schema for ns, location in zip(locations[::2], locations[1::2]): if ns == application_schema_ns: if xsd_filename is not None: location = xsd_filename else: location = os.path.splitext(xml_filename_or_content)[0] + '.xsd' # Remove mime-type header line if found to generate a valid .xsd sanitized_content = ingest_file_and_strip_mime(location) location = '/tmp/tmpschema%d.xsd' % len(tempfiles) f = open(location, 'wb') f.write(sanitized_content) tempfiles.append(location) f.close() xsd = etree.XML(sanitized_content) for child in xsd: if child.tag == '{http://www.w3.org/2001/XMLSchema}import': sub_ns = child.get('namespace') sub_location = child.get('schemaLocation') sub_location = substitute_ogc_schemas_location(sub_location, ogc_schemas_location) sub_location = substitute_inspire_schemas_location(sub_location, inspire_schemas_location) etree.SubElement(schema_def, "import", attrib={ "namespace": sub_ns, "schemaLocation": sub_location } ) import_dict[sub_ns] = sub_location etree.SubElement(schema_def, "import", attrib={ "namespace": ns, "schemaLocation": location } ) import_dict[ns] = location # Add each schemaLocation as an import for ns, location in zip(locations[::2], locations[1::2]): if ns == application_schema_ns: continue location = substitute_ogc_schemas_location(location, ogc_schemas_location) location = substitute_inspire_schemas_location(location, inspire_schemas_location) if ns not in import_dict: etree.SubElement(schema_def, "import", attrib={ "namespace": ns, "schemaLocation": location } ) import_dict[ns] = location # TODO: ugly workaround. But otherwise, the doc is not recognized as schema # print(etree.tostring(schema_def)) schema = etree.XMLSchema(etree.XML(etree.tostring(schema_def))) try: schema.assertValid(doc) ret = True except etree.Error as e: print(str(e)) ret = False for filename in tempfiles: os.remove(filename) return ret ############################################################################### # Transform absolute schemaLocations into relative ones def transform_abs_links_to_ref_links(path, level=0): for filename in os.listdir(path): filename = os.path.join(path, filename) if os.path.isdir(filename) and 'examples' not in filename: transform_abs_links_to_ref_links(filename, level + 1) elif filename.endswith('.xsd'): f = open(filename, 'rt') lines = f.readlines() f.close() rewrite = False for i, ln in enumerate(lines): if ln[-1] == '\n': ln = ln[0:-1] pos = ln.find('http://schemas.opengis.net/') if pos >= 0: rewrite = True s = ln[0:pos] s += "../" * level s = s + ln[pos + len('http://schemas.opengis.net/'):] ln = s lines[i] = ln pos = ln.find('http://www.w3.org/1999/xlink.xsd') if pos >= 0: rewrite = True s = ln[0:pos] s += "../" * level s = s + ln[pos + len('http://www.w3.org/1999/'):] ln = s lines[i] = ln pos = ln.find('http://www.w3.org/2001/xml.xsd') if pos >= 0: rewrite = True s = ln[0:pos] s += "../" * level s += ln[pos + len('http://www.w3.org/2001/'):] ln = s lines[i] = ln if rewrite: f = open(filename, 'wt') f.writelines(lines) f.close() ############################################################################### # Transform absolute schemaLocations into relative ones def transform_inspire_abs_links_to_ref_links(path, level=0): for filename in os.listdir(path): filename = os.path.join(path, filename) if os.path.isdir(filename) and 'examples' not in filename: transform_inspire_abs_links_to_ref_links(filename, level + 1) elif filename.endswith('.xsd'): f = open(filename, 'rt') lines = f.readlines() f.close() rewrite = False for i, ln in enumerate(lines): ln = lines[i] if ln[-1] == '\n': ln = ln[0:-1] pos = ln.find('schemaLocation="http://inspire.ec.europa.eu/schemas/') if pos >= 0: pos += len('schemaLocation="') rewrite = True s = ln[0:pos] + "../" * level s += ln[pos + len('http://inspire.ec.europa.eu/schemas/'):] ln = s lines[i] = ln pos = ln.find('http://portele.de/') if pos >= 0: rewrite = True s = ln[0:pos] s = s + ln[pos + len('http://portele.de/'):] ln = s lines[i] = ln pos = ln.find('http://schemas.opengis.net/') if pos >= 0: rewrite = True s = ln[0:pos] s += "../" * level + "../SCHEMAS_OPENGIS_NET/" s = s + ln[pos + len('http://schemas.opengis.net/'):] ln = s lines[i] = ln if rewrite: f = open(filename, 'wb') f.writelines(lines) f.close() ############################################################################### # Download OGC schemas def download_ogc_schemas(ogc_schemas_url='http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip', xlink_xsd_url='http://www.w3.org/1999/xlink.xsd', xml_xsd_url='http://www.w3.org/2001/xml.xsd', target_dir='.', target_subdir='SCHEMAS_OPENGIS_NET', force_download=False, max_download_duration=None): try: os.mkdir(target_dir) except OSError: pass try: os.stat(target_dir + '/' + 'SCHEMAS_OPENGIS_NET.zip') except OSError: if not gdaltest.download_file(ogc_schemas_url, target_dir + '/' + 'SCHEMAS_OPENGIS_NET.zip', base_dir='.', force_download=force_download, max_download_duration=max_download_duration): return False try: os.stat(target_dir + '/' + target_subdir + '/wfs') except OSError: try: os.mkdir(target_dir + '/' + target_subdir) except OSError: pass gdaltest.unzip(target_dir + '/' + target_subdir, target_dir + '/' + 'SCHEMAS_OPENGIS_NET.zip') try: os.stat(target_dir + '/' + target_subdir + '/wfs') except OSError: print('Cannot unzip SCHEMAS_OPENGIS_NET.zip') return False try: os.stat(target_dir + '/' + target_subdir + '/xlink.xsd') except OSError: if not gdaltest.download_file(xlink_xsd_url, target_dir + '/' + target_subdir + '/xlink.xsd', base_dir='.', force_download=force_download, max_download_duration=max_download_duration): if not gdaltest.download_file('http://even.rouault.free.fr/xlink.xsd', target_dir + '/' + target_subdir + '/xlink.xsd', base_dir='.', force_download=force_download, max_download_duration=max_download_duration): return False try: os.stat(target_dir + '/' + target_subdir + '/xml.xsd') except OSError: if not gdaltest.download_file(xml_xsd_url, target_dir + '/' + target_subdir + '/xml.xsd', base_dir='.', force_download=force_download, max_download_duration=max_download_duration): if not gdaltest.download_file('http://even.rouault.free.fr/xml.xsd', target_dir + '/' + target_subdir + '/xml.xsd', base_dir='.', force_download=force_download, max_download_duration=max_download_duration): return False transform_abs_links_to_ref_links(target_dir + '/' + target_subdir) return True ############################################################################### # Download INSPIRE schemas def download_inspire_schemas(target_dir='.', target_subdir='inspire_schemas', force_download=False): if not download_ogc_schemas(target_dir=target_dir, force_download=force_download): return False try: os.stat(target_dir + '/' + 'inspire_common_1.0.1.zip') except OSError: gdaltest.download_file('http://inspire.ec.europa.eu/schemas/common/1.0.1.zip', target_dir + '/' + 'inspire_common_1.0.1.zip', base_dir='.', force_download=force_download) try: os.stat(target_dir + '/' + 'inspire_vs_1.0.1.zip') except OSError: gdaltest.download_file('http://inspire.ec.europa.eu/schemas/inspire_vs/1.0.1.zip', target_dir + '/' + 'inspire_vs_1.0.1.zip', base_dir='.', force_download=force_download) for subdir in ['', '/common', '/inspire_vs', '/inspire_dls', '/inspire_dls/1.0']: try: os.mkdir(target_dir + '/' + target_subdir + subdir) except OSError: pass try: os.stat(target_dir + '/' + target_subdir + '/common/1.0') except OSError: gdaltest.unzip(target_dir + '/' + target_subdir + '/common', target_dir + '/' + 'inspire_common_1.0.1.zip') try: os.stat(target_dir + '/' + target_subdir + '/common/1.0') except OSError: print('Cannot unzip inspire_common_1.0.1.zip') return False try: os.stat(target_dir + '/' + target_subdir + '/inspire_vs/1.0') except OSError: gdaltest.unzip(target_dir + '/' + target_subdir + '/inspire_vs', target_dir + '/' + 'inspire_vs_1.0.1.zip') try: os.stat(target_dir + '/' + target_subdir + '/inspire_vs/1.0') except OSError: print('Cannot unzip inspire_vs_1.0.1.zip') return False try: os.stat(target_dir + '/' + target_subdir + '/inspire_dls/1.0/inspire_dls.xsd') except OSError: gdaltest.download_file('http://inspire.ec.europa.eu/schemas/inspire_dls/1.0/inspire_dls.xsd', target_dir + '/' + target_subdir + '/inspire_dls/1.0/inspire_dls.xsd', base_dir='.', force_download=force_download) try: os.stat(target_dir + '/' + target_subdir + '/oi/3.0/Orthoimagery.xsd') except OSError: try: os.makedirs(target_dir + '/' + target_subdir + '/oi/3.0') except OSError: pass gdaltest.download_file('http://inspire.ec.europa.eu/schemas/oi/3.0/Orthoimagery.xsd', target_dir + '/' + target_subdir + '/oi/3.0/Orthoimagery.xsd', base_dir='.', force_download=force_download) gdaltest.download_file('http://portele.de/ShapeChangeAppinfo.xsd', target_dir + '/' + target_subdir + '/oi/3.0/ShapeChangeAppinfo.xsd', base_dir='.', force_download=force_download) try: os.stat(target_dir + '/' + target_subdir + '/base/3.3/BaseTypes.xsd') except OSError: try: os.makedirs(target_dir + '/' + target_subdir + '/base/3.3') except OSError: pass gdaltest.download_file('http://inspire.ec.europa.eu/schemas/base/3.3/BaseTypes.xsd', target_dir + '/' + target_subdir + '/base/3.3/BaseTypes.xsd', base_dir='.', force_download=force_download) transform_inspire_abs_links_to_ref_links(target_dir + '/' + target_subdir) return True ############################################################################### # has_local_ogc_schemas() def has_local_ogc_schemas(path): # Autodetect OGC schemas try: os.stat(path + '/wfs') os.stat(path + '/xlink.xsd') os.stat(path + '/xml.xsd') return True except OSError: return False ############################################################################### # has_local_inspire_schemas() def has_local_inspire_schemas(path): # Autodetect INSPIRE schemas try: os.stat(path + '/common/1.0/common.xsd') os.stat(path + '/inspire_vs/1.0/inspire_vs.xsd') os.stat(path + '/inspire_dls/1.0/inspire_dls.xsd') os.stat(path + '/oi/3.0/Orthoimagery.xsd') os.stat(path + '/base/3.3/BaseTypes.xsd') return True except OSError: return False ############################################################################### # Usage function def Usage(): print('Usage: validate.py [-target_dir dir] [-download_ogc_schemas] [-ogc_schemas_location path]') print(' [-download_inspire_schemas] [-inspire_schemas_location path]') print(' [-app_schema_ns ns] [-schema some.xsd]') print(' some.xml') sys.exit(255) ############################################################################### # Main gdalautotest-3.0.4/pymod/gdaltest.py0000644003401500001440000016263713614005365017163 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # $Id: gdaltest.py ff478f51ee88ba17bf559364d2d50f53f5b9a9bf 2020-01-11 21:37:01 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Python Library supporting GDAL/OGR Test Suite # 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 contextlib import math import os import os.path import stat import sys from sys import version_info import time from osgeo import gdal from osgeo import osr import pytest cur_name = 'default' success_counter = 0 failure_counter = 0 expected_failure_counter = 0 blow_counter = 0 skip_counter = 0 failure_summary = [] reason = None count_skipped_tests_download = 0 count_skipped_tests_slow = 0 start_time = None end_time = None jp2kak_drv = None jpeg2000_drv = None jp2ecw_drv = None jp2mrsid_drv = None jp2openjpeg_drv = None jp2lura_drv = None jp2kak_drv_unregistered = False jpeg2000_drv_unregistered = False jp2ecw_drv_unregistered = False jp2mrsid_drv_unregistered = False jp2openjpeg_drv_unregistered = False jp2lura_drv_unregistered = False if version_info >= (3, 0, 0): import gdaltest_python3 as gdaltestaux else: import gdaltest_python2 as gdaltestaux # Process commandline arguments for stuff like --debug, --locale, --config argv = gdal.GeneralCmdLineProcessor(sys.argv) ############################################################################### def git_status(): out, _ = runexternal_out_and_err('git status --porcelain .') return out ############################################################################### def get_lineno_2framesback(frames): try: import inspect frame = inspect.currentframe() while frames > 0: frame = frame.f_back frames = frames - 1 return frame.f_lineno except ImportError: return -1 ############################################################################### def post_reason(msg, frames=2): lineno = get_lineno_2framesback(frames) global reason if lineno >= 0: reason = 'line %d: %s' % (lineno, msg) else: reason = msg ############################################################################### def clean_tmp(): all_files = os.listdir('tmp') for filename in all_files: if filename in ['CVS', 'do-not-remove']: continue try: os.remove('tmp/' + filename) except OSError: pass ############################################################################### def testCreateCopyInterruptCallback(pct, message, user_data): # pylint: disable=unused-argument return pct <= 0.5 ############################################################################### class GDALTest(object): def __init__(self, drivername, filename, band, chksum, xoff=0, yoff=0, xsize=0, ysize=0, options=None, filename_absolute=0, chksum_after_reopening=None, open_options=None): self.driver = None self.drivername = drivername self.filename = filename self.filename_absolute = filename_absolute self.band = band self.chksum = chksum if chksum_after_reopening is not None: if isinstance(chksum_after_reopening, list): self.chksum_after_reopening = chksum_after_reopening else: self.chksum_after_reopening = [chksum_after_reopening] elif chksum is None: self.chksum_after_reopening = None else: self.chksum_after_reopening = [chksum] self.xoff = xoff self.yoff = yoff self.xsize = xsize self.ysize = ysize self.options = [] if options is None else options self.open_options = open_options def testDriver(self): if self.driver is None: self.driver = gdal.GetDriverByName(self.drivername) if self.driver is None: pytest.skip(self.drivername + ' driver not found!') def testOpen(self, check_prj=None, check_gt=None, gt_epsilon=None, check_stat=None, check_approx_stat=None, stat_epsilon=None, skip_checksum=None, check_min=None, check_max=None, check_filelist=True): """check_prj - projection reference, check_gt - geotransformation matrix (tuple), gt_epsilon - geotransformation tolerance, check_stat - band statistics (tuple), stat_epsilon - statistics tolerance.""" self.testDriver() if self.filename_absolute: wrk_filename = self.filename else: wrk_filename = 'data/' + self.filename if self.open_options: ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) assert ds is not None, ('Failed to open dataset: ' + wrk_filename) assert ds.GetDriver().ShortName == gdal.GetDriverByName(self.drivername).ShortName, \ ('The driver of the returned dataset is %s instead of %s.' % (ds.GetDriver().ShortName, self.drivername)) if self.xsize == 0 and self.ysize == 0: self.xsize = ds.RasterXSize self.ysize = ds.RasterYSize if check_filelist and ds.GetDriver().GetMetadataItem('DCAP_VIRTUALIO') is not None: fl = ds.GetFileList() if fl is not None and fl and wrk_filename == fl[0]: # Copy all files in /vsimem/ mainfile_dirname = os.path.dirname(fl[0]) for filename in fl: target_filename = '/vsimem/tmp_testOpen/' + filename[len(mainfile_dirname) + 1:] if stat.S_ISDIR(gdal.VSIStatL(filename).mode): gdal.Mkdir(target_filename, 0) else: f = gdal.VSIFOpenL(filename, 'rb') assert f is not None, ('File %s does not exist' % filename) gdal.VSIFSeekL(f, 0, 2) size = gdal.VSIFTellL(f) gdal.VSIFSeekL(f, 0, 0) data = gdal.VSIFReadL(1, size, f) gdal.VSIFCloseL(f) if data is None: data = '' gdal.FileFromMemBuffer(target_filename, data) # Try to open the in-memory file main_virtual_filename = '/vsimem/tmp_testOpen/' + os.path.basename(fl[0]) virtual_ds = gdal.Open(main_virtual_filename) virtual_ds_is_None = virtual_ds is None virtual_ds = None # Make sure the driver is specific enough by trying to open # with all other drivers but it drivers = [] for i in range(gdal.GetDriverCount()): drv_name = gdal.GetDriver(i).ShortName if drv_name.lower() != self.drivername.lower() and not \ ((drv_name.lower() == 'gif' and self.drivername.lower() == 'biggif') or (drv_name.lower() == 'biggif' and self.drivername.lower() == 'gif')): drivers += [drv_name] other_ds = gdal.OpenEx(main_virtual_filename, gdal.OF_RASTER, allowed_drivers=drivers) other_ds_is_None = other_ds is None other_ds_driver_name = None if not other_ds_is_None: other_ds_driver_name = other_ds.GetDriver().ShortName other_ds = None for filename in gdal.ReadDirRecursive('/vsimem/tmp_testOpen'): gdal.Unlink('/vsimem/tmp_testOpen/' + filename) assert not virtual_ds_is_None, \ 'File list is not complete or driver does not support /vsimem/' assert other_ds_is_None, \ ('When excluding %s, dataset is still opened by driver %s' % (self.drivername, other_ds_driver_name)) # Do we need to check projection? if check_prj is not None: new_prj = ds.GetProjection() src_osr = osr.SpatialReference() src_osr.SetFromUserInput(check_prj) new_osr = osr.SpatialReference(wkt=new_prj) if not src_osr.IsSame(new_osr): print('') print('old = %s' % src_osr.ExportToPrettyWkt()) print('new = %s' % new_osr.ExportToPrettyWkt()) pytest.fail('Projections differ') # Do we need to check geotransform? if check_gt: # Default to 100th of pixel as our test value. if gt_epsilon is None: gt_epsilon = (abs(check_gt[1]) + abs(check_gt[2])) / 100.0 new_gt = ds.GetGeoTransform() for i in range(6): if abs(new_gt[i] - check_gt[i]) > gt_epsilon: print('') print('old = ', check_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') oBand = ds.GetRasterBand(self.band) if skip_checksum is None: chksum = oBand.Checksum(self.xoff, self.yoff, self.xsize, self.ysize) # Do we need to check approximate statistics? if check_approx_stat: # Default to 1000th of pixel value range as our test value. if stat_epsilon is None: stat_epsilon = \ abs(check_approx_stat[1] - check_approx_stat[0]) / 1000.0 new_stat = oBand.GetStatistics(1, 1) for i in range(4): # NOTE - mloskot: Poor man Nan/Inf value check. It's poor # because we need to support old and buggy Python 2.3. # Tested on Linux, Mac OS X and Windows, with Python 2.3/2.4/2.5. sv = str(new_stat[i]).lower() assert not ('n' in sv or 'i' in sv or '#' in sv), \ ('NaN or infinity value encountered \'%s\'.' % sv) if abs(new_stat[i] - check_approx_stat[i]) > stat_epsilon: print('') print('old = ', check_approx_stat) print('new = ', new_stat) pytest.fail('Approximate statistics differs.') # Do we need to check statistics? if check_stat: # Default to 1000th of pixel value range as our test value. if stat_epsilon is None: stat_epsilon = abs(check_stat[1] - check_stat[0]) / 1000.0 # FIXME: how to test approximate statistic results? new_stat = oBand.GetStatistics(1, 1) new_stat = oBand.GetStatistics(0, 1) for i in range(4): sv = str(new_stat[i]).lower() assert not ('n' in sv or 'i' in sv or '#' in sv), \ ('NaN or infinity value encountered \'%s\'.' % sv) if abs(new_stat[i] - check_stat[i]) > stat_epsilon: print('') print('old = ', check_stat) print('new = ', new_stat) pytest.fail('Statistics differs.') if check_min: assert oBand.GetMinimum() == check_min, \ ('Unexpected minimum value %s' % str(oBand.GetMinimum())) if check_max: assert oBand.GetMaximum() == check_max, \ ('Unexpected maximum value %s' % str(oBand.GetMaximum())) ds = None assert not is_file_open(wrk_filename), 'file still open after dataset closing' if skip_checksum is not None: return if self.chksum is None or chksum == self.chksum: return pytest.fail('Checksum for band %d in "%s" is %d, but expected %d.' % (self.band, self.filename, chksum, self.chksum)) def testCreateCopy(self, check_minmax=1, check_gt=0, check_srs=None, vsimem=0, new_filename=None, strict_in=0, skip_preclose_test=0, delete_copy=1, gt_epsilon=None, check_checksum_not_null=None, interrupt_during_copy=False, dest_open_options=None, quiet_error_handler=True): self.testDriver() if self.filename_absolute: wrk_filename = self.filename else: wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) if self.band > 0: minmax = src_ds.GetRasterBand(self.band).ComputeRasterMinMax() src_prj = src_ds.GetProjection() src_gt = src_ds.GetGeoTransform() if new_filename is None: if vsimem: new_filename = '/vsimem/' + os.path.basename(self.filename) + '.tst' else: new_filename = 'tmp/' + os.path.basename(self.filename) + '.tst' if quiet_error_handler: gdal.PushErrorHandler('CPLQuietErrorHandler') if interrupt_during_copy: new_ds = self.driver.CreateCopy(new_filename, src_ds, strict=strict_in, options=self.options, callback=testCreateCopyInterruptCallback) else: new_ds = self.driver.CreateCopy(new_filename, src_ds, strict=strict_in, options=self.options) if quiet_error_handler: gdal.PopErrorHandler() if interrupt_during_copy: if new_ds is None: gdal.PushErrorHandler('CPLQuietErrorHandler') self.driver.Delete(new_filename) gdal.PopErrorHandler() return new_ds = None self.driver.Delete(new_filename) pytest.fail('CreateCopy() should have failed due to interruption') assert new_ds is not None, ('Failed to create test file using CreateCopy method.' + '\n' + gdal.GetLastErrorMsg()) assert new_ds.GetDriver().ShortName == gdal.GetDriverByName(self.drivername).ShortName, \ ('The driver of the returned dataset is %s instead of %s.' % (new_ds.GetDriver().ShortName, self.drivername)) if self.band > 0 and skip_preclose_test == 0: bnd = new_ds.GetRasterBand(self.band) if check_checksum_not_null is True: assert bnd.Checksum() != 0, 'Got null checksum on still-open file.' elif self.chksum is not None and bnd.Checksum() != self.chksum: pytest.fail( 'Did not get expected checksum on still-open file.\n' ' Got %d instead of %d.' % (bnd.Checksum(), self.chksum)) if check_minmax: got_minmax = bnd.ComputeRasterMinMax() assert got_minmax == minmax, \ ('Did not get expected min/max values on still-open file.\n' ' Got %g,%g instead of %g,%g.' % (got_minmax[0], got_minmax[1], minmax[0], minmax[1])) bnd = None new_ds = None # hopefully it's closed now! if dest_open_options is not None: new_ds = gdal.OpenEx(new_filename, gdal.OF_RASTER, open_options=dest_open_options) else: new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) if self.band > 0: bnd = new_ds.GetRasterBand(self.band) if check_checksum_not_null is True: assert bnd.Checksum() != 0, 'Got null checksum on reopened file.' elif self.chksum_after_reopening is not None and bnd.Checksum() not in self.chksum_after_reopening: pytest.fail('Did not get expected checksum on reopened file.\n' ' Got %d instead of %s.' % (bnd.Checksum(), str(self.chksum_after_reopening))) if check_minmax: got_minmax = bnd.ComputeRasterMinMax() assert got_minmax == minmax, \ ('Did not get expected min/max values on reopened file.\n' ' Got %g,%g instead of %g,%g.' % (got_minmax[0], got_minmax[1], minmax[0], minmax[1])) # Do we need to check the geotransform? if check_gt: if gt_epsilon is None: eps = 0.00000001 else: eps = gt_epsilon new_gt = new_ds.GetGeoTransform() if abs(new_gt[0] - src_gt[0]) > eps \ or abs(new_gt[1] - src_gt[1]) > eps \ or abs(new_gt[2] - src_gt[2]) > eps \ or abs(new_gt[3] - src_gt[3]) > eps \ or abs(new_gt[4] - src_gt[4]) > eps \ or abs(new_gt[5] - src_gt[5]) > eps: print('') print('old = ', src_gt) print('new = ', new_gt) pytest.fail('Geotransform differs.') # Do we need to check the geotransform? if check_srs is not None: new_prj = new_ds.GetProjection() src_osr = osr.SpatialReference(wkt=src_prj) new_osr = osr.SpatialReference(wkt=new_prj) if not src_osr.IsSame(new_osr): print('') print('old = %s' % src_osr.ExportToPrettyWkt()) print('new = %s' % new_osr.ExportToPrettyWkt()) pytest.fail('Projections differ') bnd = None new_ds = None src_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON' and delete_copy == 1: self.driver.Delete(new_filename) def testCreate(self, vsimem=0, new_filename=None, out_bands=1, check_minmax=1, dest_open_options=None): self.testDriver() if self.filename_absolute: wrk_filename = self.filename else: wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize src_img = src_ds.GetRasterBand(self.band).ReadRaster(0, 0, xsize, ysize) minmax = src_ds.GetRasterBand(self.band).ComputeRasterMinMax() if new_filename is None: if vsimem: new_filename = '/vsimem/' + self.filename + '.tst' else: new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, out_bands, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' src_ds = None try: for band in range(1, out_bands + 1): new_ds.GetRasterBand(band).WriteRaster(0, 0, xsize, ysize, src_img) except: pytest.fail('Failed to write raster bands to test file.') for band in range(1, out_bands + 1): assert self.chksum is None or new_ds.GetRasterBand(band).Checksum() == self.chksum, \ ('Did not get expected checksum on still-open file.\n' ' Got %d instead of %d.' % (new_ds.GetRasterBand(band).Checksum(), self.chksum)) computed_minmax = new_ds.GetRasterBand(band).ComputeRasterMinMax() if computed_minmax != minmax and check_minmax: print('expect: ', minmax) print('got: ', computed_minmax) pytest.fail('Did not get expected min/max values on still-open file.') new_ds = None if dest_open_options is not None: new_ds = gdal.OpenEx(new_filename, gdal.OF_RASTER, open_options=dest_open_options) else: new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) for band in range(1, out_bands + 1): assert self.chksum is None or new_ds.GetRasterBand(band).Checksum() == self.chksum, \ ('Did not get expected checksum on reopened file.' ' Got %d instead of %d.' % (new_ds.GetRasterBand(band).Checksum(), self.chksum)) assert new_ds.GetRasterBand(band).ComputeRasterMinMax() == minmax or not check_minmax, \ 'Did not get expected min/max values on reopened file.' new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetGeoTransform(self): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' gt = (123.0, 1.18, 0.0, 456.0, 0.0, -1.18) assert new_ds.SetGeoTransform(gt) is gdal.CE_None, \ 'Failed to set geographic transformation.' src_ds = None new_ds = None new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) eps = 0.00000001 new_gt = new_ds.GetGeoTransform() if abs(new_gt[0] - gt[0]) > eps \ or abs(new_gt[1] - gt[1]) > eps \ or abs(new_gt[2] - gt[2]) > eps \ or abs(new_gt[3] - gt[3]) > eps \ or abs(new_gt[4] - gt[4]) > eps \ or abs(new_gt[5] - gt[5]) > eps: print('') print('old = ', gt) print('new = ', new_gt) pytest.fail('Did not get expected geotransform.') new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetProjection(self, prj=None, expected_prj=None): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' gt = (123.0, 1.18, 0.0, 456.0, 0.0, -1.18) if prj is None: # This is a challenging SRS since it has non-meter linear units. prj = 'PROJCS["NAD83 / Ohio South",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",40.03333333333333],PARAMETER["standard_parallel_2",38.73333333333333],PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",-82.5],PARAMETER["false_easting",1968500],PARAMETER["false_northing",0],UNIT["US survey foot",0.3048006096012192]]' src_osr = osr.SpatialReference() src_osr.ImportFromWkt(prj) new_ds.SetGeoTransform(gt) assert new_ds.SetProjection(prj) is gdal.CE_None, \ 'Failed to set geographic projection string.' src_ds = None new_ds = None new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) expected_osr = osr.SpatialReference() if expected_prj is None: expected_osr = src_osr else: expected_osr.ImportFromWkt(expected_prj) new_osr = osr.SpatialReference() new_osr.ImportFromWkt(new_ds.GetProjection()) if not new_osr.IsSame(expected_osr): print('Got: ') print(new_osr.ExportToPrettyWkt()) print('Expected:') print(expected_osr.ExportToPrettyWkt()) pytest.fail('Did not get expected projection reference.') new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetMetadata(self): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' new_ds.SetMetadata({'TEST_KEY': 'TestValue'}) # FIXME # if new_ds.SetMetadata( dict ) is not gdal.CE_None: # print new_ds.SetMetadata( dict ) # post_reason( 'Failed to set metadata item.' ) # return 'fail' src_ds = None new_ds = None new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) md_dict = new_ds.GetMetadata() assert 'TEST_KEY' in md_dict, 'Metadata item TEST_KEY does not exist.' assert md_dict['TEST_KEY'] == 'TestValue', 'Did not get expected metadata item.' new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetNoDataValue(self, delete=False): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' if self.options is None or 'PIXELTYPE=SIGNEDBYTE' not in self.options: nodata = 130 else: nodata = 11 assert new_ds.GetRasterBand(1).SetNoDataValue(nodata) is gdal.CE_None, \ 'Failed to set NoData value.' src_ds = None new_ds = None if delete: mode = gdal.GA_Update else: mode = gdal.GA_ReadOnly new_ds = gdal.Open(new_filename, mode) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) assert nodata == new_ds.GetRasterBand(1).GetNoDataValue(), \ 'Did not get expected NoData value.' if delete: assert new_ds.GetRasterBand(1).DeleteNoDataValue() == 0, \ 'Did not manage to delete nodata value' new_ds = None if delete: new_ds = gdal.Open(new_filename) assert new_ds.GetRasterBand(1).GetNoDataValue() is None, \ 'Got nodata value whereas none was expected' new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetNoDataValueAndDelete(self): return self.testSetNoDataValue(delete=True) def testSetDescription(self): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' description = "Description test string" new_ds.GetRasterBand(1).SetDescription(description) src_ds = None new_ds = None new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) assert description == new_ds.GetRasterBand(1).GetDescription(), \ 'Did not get expected description string.' new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def testSetUnitType(self): self.testDriver() wrk_filename = 'data/' + self.filename if self.open_options: src_ds = gdal.OpenEx(wrk_filename, gdal.OF_RASTER, open_options=self.open_options) else: src_ds = gdal.Open(wrk_filename, gdal.GA_ReadOnly) xsize = src_ds.RasterXSize ysize = src_ds.RasterYSize new_filename = 'tmp/' + self.filename + '.tst' new_ds = self.driver.Create(new_filename, xsize, ysize, 1, src_ds.GetRasterBand(self.band).DataType, options=self.options) assert new_ds is not None, 'Failed to create test file using Create method.' unit = 'mg/m3' assert new_ds.GetRasterBand(1).SetUnitType(unit) is gdal.CE_None, \ 'Failed to set unit type.' src_ds = None new_ds = None new_ds = gdal.Open(new_filename) assert new_ds is not None, ('Failed to open dataset: ' + new_filename) new_unit = new_ds.GetRasterBand(1).GetUnitType() if new_unit != unit: print('') print('old = ', unit) print('new = ', new_unit) pytest.fail('Did not get expected unit type.') new_ds = None if gdal.GetConfigOption('CPL_DEBUG', 'OFF') != 'ON': self.driver.Delete(new_filename) def approx_equal(a, b): a = float(a) b = float(b) if a == 0 and b != 0: return 0 if abs(b / a - 1.0) > .00000000001: return 0 return 1 def user_srs_to_wkt(user_text): srs = osr.SpatialReference() srs.SetFromUserInput(user_text) return srs.ExportToWkt() def equal_srs_from_wkt(expected_wkt, got_wkt, verbose=True): expected_srs = osr.SpatialReference() expected_srs.ImportFromWkt(expected_wkt) got_srs = osr.SpatialReference() got_srs.ImportFromWkt(got_wkt) if got_srs.IsSame(expected_srs): return 1 if verbose: print('Expected:\n%s' % expected_wkt) print('Got: \n%s' % got_wkt) post_reason('SRS differs from expected.') return 0 ############################################################################### # Compare two sets of RPC metadata, and establish if they are essentially # equivalent or not. def rpcs_equal(md1, md2): simple_fields = ['LINE_OFF', 'SAMP_OFF', 'LAT_OFF', 'LONG_OFF', 'HEIGHT_OFF', 'LINE_SCALE', 'SAMP_SCALE', 'LAT_SCALE', 'LONG_SCALE', 'HEIGHT_SCALE'] coef_fields = ['LINE_NUM_COEFF', 'LINE_DEN_COEFF', 'SAMP_NUM_COEFF', 'SAMP_DEN_COEFF'] for sf in simple_fields: try: if not approx_equal(float(md1[sf]), float(md2[sf])): post_reason('%s values differ.' % sf) print(md1[sf]) print(md2[sf]) return 0 except: post_reason('%s value missing or corrupt.' % sf) print(md1) print(md2) return 0 for cf in coef_fields: try: list1 = md1[cf].split() list2 = md2[cf].split() except: post_reason('%s value missing or corrupt.' % cf) print(md1[cf]) print(md2[cf]) return 0 if len(list1) != 20: post_reason('%s value list length wrong(1)' % cf) print(list1) return 0 if len(list2) != 20: post_reason('%s value list length wrong(2)' % cf) print(list2) return 0 for i in range(20): if not approx_equal(float(list1[i]), float(list2[i])): post_reason('%s[%d] values differ.' % (cf, i)) print(list1[i], list2[i]) return 0 return 1 ############################################################################### # Test if geotransforms are equal with an epsilon tolerance # def geotransform_equals(gt1, gt2, gt_epsilon): for i in range(6): if abs(gt1[i] - gt2[i]) > gt_epsilon: print('') print('gt1 = ', gt1) print('gt2 = ', gt2) post_reason('Geotransform differs.') return False return True ############################################################################### # Download file at url 'url' and put it as 'filename' in 'tmp/cache/' # # If 'filename' already exits in 'tmp/cache/', it is not downloaded # If GDAL_DOWNLOAD_TEST_DATA is not defined, the function fails # If GDAL_DOWNLOAD_TEST_DATA is defined, 'url' is downloaded as 'filename' in 'tmp/cache/' def download_file(url, filename=None, download_size=-1, force_download=False, max_download_duration=None, base_dir='tmp/cache'): if filename is None: filename = os.path.basename(url) elif filename.startswith(base_dir + '/'): filename = filename[len(base_dir + '/'):] try: os.stat(base_dir + '/' + filename) return True except OSError: if force_download or download_test_data(): val = None start_time = time.time() try: handle = gdalurlopen(url) if handle is None: return False if download_size == -1: try: handle_info = handle.info() download_size = int(handle_info['content-length']) print('Downloading %s (length = %d bytes)...' % (url, download_size)) except: print('Downloading %s...' % (url)) else: print('Downloading %d bytes from %s...' % (download_size, url)) except: return False if download_size >= 0: sys.stdout.write('Progress: ') nLastTick = -1 val = ''.encode('ascii') while len(val) < download_size or download_size < 0: chunk_size = 1024 if download_size >= 0 and len(val) + chunk_size > download_size: chunk_size = download_size - len(val) try: chunk = handle.read(chunk_size) except: print('Did not get expected data length.') return False if len(chunk) < chunk_size: if download_size < 0: break print('Did not get expected data length.') return False val = val + chunk if download_size >= 0: nThisTick = int(40 * len(val) / download_size) while nThisTick > nLastTick: nLastTick = nLastTick + 1 if nLastTick % 4 == 0: sys.stdout.write("%d" % int((nLastTick / 4) * 10)) else: sys.stdout.write(".") nLastTick = nThisTick if nThisTick == 40: sys.stdout.write(" - done.\n") current_time = time.time() if max_download_duration is not None and current_time - start_time > max_download_duration: print('Download aborted due to timeout.') return False try: os.stat(base_dir) except OSError: os.mkdir(base_dir) try: open(base_dir + '/' + filename, 'wb').write(val) return True except IOError: print('Cannot write %s' % (filename)) return False else: return False ############################################################################### # GDAL data type to python struct format def gdal_data_type_to_python_struct_format(datatype): type_char = 'B' if datatype == gdal.GDT_Int16: type_char = 'h' elif datatype == gdal.GDT_UInt16: type_char = 'H' elif datatype == gdal.GDT_Int32: type_char = 'i' elif datatype == gdal.GDT_UInt32: type_char = 'I' elif datatype == gdal.GDT_Float32: type_char = 'f' elif datatype == gdal.GDT_Float64: type_char = 'd' return type_char ############################################################################### # Compare the values of the pixels def compare_ds(ds1, ds2, xoff=0, yoff=0, width=0, height=0, verbose=1): import struct if width == 0: width = ds1.RasterXSize if height == 0: height = ds1.RasterYSize data1 = ds1.GetRasterBand(1).ReadRaster(xoff, yoff, width, height) type_char = gdal_data_type_to_python_struct_format(ds1.GetRasterBand(1).DataType) val_array1 = struct.unpack(type_char * width * height, data1) data2 = ds2.GetRasterBand(1).ReadRaster(xoff, yoff, width, height) type_char = gdal_data_type_to_python_struct_format(ds2.GetRasterBand(1).DataType) val_array2 = struct.unpack(type_char * width * height, data2) maxdiff = 0.0 ndiffs = 0 for i in range(width * height): diff = val_array1[i] - val_array2[i] if diff != 0: # print(val_array1[i]) # print(val_array2[i]) ndiffs = ndiffs + 1 if abs(diff) > maxdiff: maxdiff = abs(diff) if verbose: print("Diff at pixel (%d, %d) : %f" % (i % width, i / width, float(diff))) elif ndiffs < 10: if verbose: print("Diff at pixel (%d, %d) : %f" % (i % width, i / width, float(diff))) if maxdiff != 0 and verbose: print("Max diff : %d" % (maxdiff)) print("Number of diffs : %d" % (ndiffs)) return maxdiff ############################################################################### # Deregister all JPEG2000 drivers, except the one passed as an argument def deregister_all_jpeg2000_drivers_but(name_of_driver_to_keep): global jp2kak_drv, jpeg2000_drv, jp2ecw_drv, jp2mrsid_drv, jp2openjpeg_drv, jp2lura_drv global jp2kak_drv_unregistered, jpeg2000_drv_unregistered, jp2ecw_drv_unregistered, jp2mrsid_drv_unregistered, jp2openjpeg_drv_unregistered, jp2lura_drv_unregistered # Deregister other potential conflicting JPEG2000 drivers that will # be re-registered in the cleanup jp2kak_drv = gdal.GetDriverByName('JP2KAK') if name_of_driver_to_keep != 'JP2KAK' and jp2kak_drv: gdal.Debug('gdaltest', 'Deregistering JP2KAK') jp2kak_drv.Deregister() jp2kak_drv_unregistered = True jpeg2000_drv = gdal.GetDriverByName('JPEG2000') if name_of_driver_to_keep != 'JPEG2000' and jpeg2000_drv: gdal.Debug('gdaltest', 'Deregistering JPEG2000') jpeg2000_drv.Deregister() jpeg2000_drv_unregistered = True jp2ecw_drv = gdal.GetDriverByName('JP2ECW') if name_of_driver_to_keep != 'JP2ECW' and jp2ecw_drv: gdal.Debug('gdaltest.', 'Deregistering JP2ECW') jp2ecw_drv.Deregister() jp2ecw_drv_unregistered = True jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') if name_of_driver_to_keep != 'JP2MrSID' and jp2mrsid_drv: gdal.Debug('gdaltest.', 'Deregistering JP2MrSID') jp2mrsid_drv.Deregister() jp2mrsid_drv_unregistered = True jp2openjpeg_drv = gdal.GetDriverByName('JP2OpenJPEG') if name_of_driver_to_keep != 'JP2OpenJPEG' and jp2openjpeg_drv: gdal.Debug('gdaltest.', 'Deregistering JP2OpenJPEG') jp2openjpeg_drv.Deregister() jp2openjpeg_drv_unregistered = True jp2lura_drv = gdal.GetDriverByName('JP2Lura') if name_of_driver_to_keep != 'JP2Lura' and jp2lura_drv: gdal.Debug('gdaltest.', 'Deregistering JP2Lura') jp2lura_drv.Deregister() jp2lura_drv_unregistered = True return True ############################################################################### # Re-register all JPEG2000 drivers previously disabled by # deregister_all_jpeg2000_drivers_but def reregister_all_jpeg2000_drivers(): global jp2kak_drv, jpeg2000_drv, jp2ecw_drv, jp2mrsid_drv, jp2openjpeg_drv, jp2lura_drv global jp2kak_drv_unregistered, jpeg2000_drv_unregistered, jp2ecw_drv_unregistered, jp2mrsid_drv_unregistered, jp2openjpeg_drv_unregistered, jp2lura_drv_unregistered if jp2kak_drv_unregistered: jp2kak_drv.Register() jp2kak_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JP2KAK') if jpeg2000_drv_unregistered: jpeg2000_drv.Register() jpeg2000_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JPEG2000') if jp2ecw_drv_unregistered: jp2ecw_drv.Register() jp2ecw_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JP2ECW') if jp2mrsid_drv_unregistered: jp2mrsid_drv.Register() jp2mrsid_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JP2MrSID') if jp2openjpeg_drv_unregistered: jp2openjpeg_drv.Register() jp2openjpeg_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JP2OpenJPEG') if jp2lura_drv_unregistered: jp2lura_drv.Register() jp2lura_drv_unregistered = False gdal.Debug('gdaltest', 'Registering JP2Lura') return True ############################################################################### # Determine if the filesystem supports sparse files. # Currently, this will only work on Linux (or any *NIX that has the stat # command line utility) def filesystem_supports_sparse_files(path): if skip_on_travis(): return False try: (ret, err) = runexternal_out_and_err('stat -f -c "%T" ' + path) except OSError: return False if err != '': post_reason('Cannot determine if filesystem supports sparse files') return False if ret.find('fat32') != -1: post_reason('File system does not support sparse files') return False if ret.find('wslfs') != -1 or \ ret.find('0x53464846') != -1: # wslfs for older stat versions post_reason('Windows Subsystem for Linux FS is at the time of ' + 'writing not known to support sparse files') return False # Add here any missing filesystem supporting sparse files # See http://en.wikipedia.org/wiki/Comparison_of_file_systems if ret.find('ext3') == -1 and \ ret.find('ext4') == -1 and \ ret.find('reiser') == -1 and \ ret.find('xfs') == -1 and \ ret.find('jfs') == -1 and \ ret.find('zfs') == -1 and \ ret.find('ntfs') == -1: post_reason('Filesystem %s is not believed to support sparse files' % ret) return False return True ############################################################################### # Unzip a file def unzip(target_dir, zipfilename, verbose=False): try: import zipfile zf = zipfile.ZipFile(zipfilename) except ImportError: os.system('unzip -d ' + target_dir + ' ' + zipfilename) return for filename in zf.namelist(): if verbose: print(filename) outfilename = os.path.join(target_dir, filename) if filename.endswith('/'): if not os.path.exists(outfilename): os.makedirs(outfilename) else: outdirname = os.path.dirname(outfilename) if not os.path.exists(outdirname): os.makedirs(outdirname) outfile = open(outfilename, 'wb') outfile.write(zf.read(filename)) outfile.close() return isnan = math.isnan ############################################################################### # Return NaN def NaN(): return float('nan') ############################################################################### # Return positive infinity def posinf(): return float('inf') ############################################################################### # Return negative infinity def neginf(): return float('-inf') ############################################################################### # Has the user requested to dowload test data def download_test_data(): global count_skipped_tests_download val = gdal.GetConfigOption('GDAL_DOWNLOAD_TEST_DATA', None) if val != 'yes' and val != 'YES': if count_skipped_tests_download == 0: print('As GDAL_DOWNLOAD_TEST_DATA environment variable is not defined or set to NO, some tests relying on data to downloaded from the Web will be skipped') count_skipped_tests_download = count_skipped_tests_download + 1 return False return True ############################################################################### # Has the user requested to run the slow tests def run_slow_tests(): global count_skipped_tests_slow val = gdal.GetConfigOption('GDAL_RUN_SLOW_TESTS', None) if val != 'yes' and val != 'YES': if count_skipped_tests_slow == 0: print('As GDAL_RUN_SLOW_TESTS environment variable is not defined or set to NO, some "slow" tests will be skipped') count_skipped_tests_slow = count_skipped_tests_slow + 1 return False return True ############################################################################### # Return true if the platform support symlinks def support_symlink(): if sys.platform.startswith('linux'): return True if sys.platform.find('freebsd') != -1: return True if sys.platform == 'darwin': return True if sys.platform.find('sunos') != -1: return True return False ############################################################################### # Return True if the test must be skipped def skip_on_travis(): val = gdal.GetConfigOption('TRAVIS', None) if val is not None: post_reason('Test skipped on Travis') return True return False ############################################################################### # Return True if the provided name is in TRAVIS_BRANCH or BUILD_NAME def is_travis_branch(name): if 'TRAVIS_BRANCH' in os.environ: val = os.environ['TRAVIS_BRANCH'] if name in val: return True if 'BUILD_NAME' in os.environ: val = os.environ['BUILD_NAME'] if name in val: return True return False ############################################################################### # find_lib_linux() # Parse /proc/self/maps to find an occurrence of libXXXXX.so.* def find_lib_linux(libname): f = open('/proc/self/maps') lines = f.readlines() f.close() for line in lines: if line.rfind('/lib' + libname) == -1 or line.find('.so') == -1: continue i = line.find(' ') if i < 0: continue line = line[i + 1:] i = line.find(' ') if i < 0: continue line = line[i + 1:] i = line.find(' ') if i < 0: continue line = line[i + 1:] i = line.find(' ') if i < 0: continue line = line[i + 1:] i = line.find(' ') if i < 0: continue line = line[i + 1:] soname = line.lstrip().rstrip('\n') if soname.rfind('/lib' + libname) == -1: continue return soname return None ############################################################################### # find_lib_sunos() # Parse output of pmap to find an occurrence of libXXX.so.* def find_lib_sunos(libname): pid = os.getpid() lines, _ = runexternal_out_and_err('pmap %d' % pid) for line in lines.split('\n'): if line.rfind('/lib' + libname) == -1 or line.find('.so') == -1: continue i = line.find('/') if i < 0: continue line = line[i:] soname = line.lstrip().rstrip('\n') if soname.rfind('/lib' + libname) == -1: continue return soname return None ############################################################################### # find_lib_windows() # use Module32First() / Module32Next() API on the current process def find_lib_windows(libname): try: import ctypes except ImportError: return None kernel32 = ctypes.windll.kernel32 MAX_MODULE_NAME32 = 255 MAX_PATH = 260 TH32CS_SNAPMODULE = 0x00000008 class MODULEENTRY32(ctypes.Structure): _fields_ = [ ("dwSize", ctypes.c_int), ("th32ModuleID", ctypes.c_int), ("th32ProcessID", ctypes.c_int), ("GlblcntUsage", ctypes.c_int), ("ProccntUsage", ctypes.c_int), ("modBaseAddr", ctypes.c_char_p), ("modBaseSize", ctypes.c_int), ("hModule", ctypes.c_void_p), ("szModule", ctypes.c_char * (MAX_MODULE_NAME32 + 1)), ("szExePath", ctypes.c_char * MAX_PATH) ] Module32First = kernel32.Module32First Module32First.argtypes = [ctypes.c_void_p, ctypes.POINTER(MODULEENTRY32)] Module32First.rettypes = ctypes.c_int Module32Next = kernel32.Module32Next Module32Next.argtypes = [ctypes.c_void_p, ctypes.POINTER(MODULEENTRY32)] Module32Next.rettypes = ctypes.c_int CreateToolhelp32Snapshot = kernel32.CreateToolhelp32Snapshot CreateToolhelp32Snapshot.argtypes = [ctypes.c_int, ctypes.c_int] CreateToolhelp32Snapshot.rettypes = ctypes.c_void_p CloseHandle = kernel32.CloseHandle CloseHandle.argtypes = [ctypes.c_void_p] CloseHandle.rettypes = ctypes.c_int GetLastError = kernel32.GetLastError GetLastError.argtypes = [] GetLastError.rettypes = ctypes.c_int snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0) if snapshot is None: return None soname = None i = 0 while True: entry = MODULEENTRY32() entry.dwSize = ctypes.sizeof(MODULEENTRY32) pentry = ctypes.pointer(entry) if i == 0: ret = Module32First(snapshot, pentry) else: ret = Module32Next(snapshot, pentry) i = i + 1 if ret == 0: break try: path = entry.szExePath.decode('latin1') except: continue i = path.rfind('\\' + libname) if i < 0: continue if path[i + 1:].find('\\') >= 0: continue # Avoid matching gdal_PLUGIN.dll if path[i + 1:].find('_') >= 0: continue soname = path break CloseHandle(snapshot) return soname ############################################################################### # find_lib() def find_lib(mylib): if sys.platform.startswith('linux'): return find_lib_linux(mylib) if sys.platform.startswith('sunos'): return find_lib_sunos(mylib) if sys.platform.startswith('win32'): return find_lib_windows(mylib) # sorry mac users or other BSDs # should be doable return None ############################################################################### # get_opened_files() get_opened_files_has_warned = False def get_opened_files(): if not sys.platform.startswith('linux'): return [] fdpath = '/proc/%d/fd' % os.getpid() if not os.path.exists(fdpath): global get_opened_files_has_warned if not get_opened_files_has_warned: get_opened_files_has_warned = True print('get_opened_files() not supported due to /proc not being readable') return [] file_numbers = os.listdir(fdpath) filenames = [] for fd in file_numbers: try: filename = os.readlink('%s/%s' % (fdpath, fd)) if not filename.startswith('/dev/') and not filename.startswith('pipe:') and filename.find('proj.db') < 0: filenames.append(filename) except OSError: pass return filenames ############################################################################### # is_file_open() def is_file_open(filename): for got_filename in get_opened_files(): if filename in got_filename: return True return False ############################################################################### # built_against_curl() def built_against_curl(): return gdal.GetDriverByName('HTTP') is not None ############################################################################### # error_handler() # Allow use of "with" for an ErrorHandler that always pops at the scope close. # Defaults to suppressing errors and warnings. @contextlib.contextmanager def error_handler(error_name='CPLQuietErrorHandler'): handler = gdal.PushErrorHandler(error_name) try: yield handler finally: gdal.PopErrorHandler() ############################################################################### # Temporarily define a new value of block cache @contextlib.contextmanager def SetCacheMax(val): oldval = gdal.GetCacheMax() gdal.SetCacheMax(val) try: yield finally: gdal.SetCacheMax(oldval) ############################################################################### # Temporarily define a configuration option @contextlib.contextmanager def config_option(key, val): oldval = gdal.GetConfigOption(key) gdal.SetConfigOption(key, val) try: yield finally: gdal.SetConfigOption(key, oldval) ############################################################################### # Temporarily define a set of configuration options @contextlib.contextmanager def config_options(options): oldvals = {key: gdal.GetConfigOption(key) for key in options} for key in options: gdal.SetConfigOption(key, options[key]) try: yield finally: for key in options: gdal.SetConfigOption(key, oldvals[key]) ############################################################################### # Temporarily create a file @contextlib.contextmanager def tempfile(filename, content): gdal.FileFromMemBuffer(filename, content) try: yield finally: gdal.Unlink(filename) ############################################################################### # Temporarily enable exceptions @contextlib.contextmanager def enable_exceptions(): if gdal.GetUseExceptions(): try: yield finally: pass return gdal.UseExceptions() try: yield finally: gdal.DontUseExceptions() ############################################################################### run_func = gdaltestaux.run_func urlescape = gdaltestaux.urlescape gdalurlopen = gdaltestaux.gdalurlopen spawn_async = gdaltestaux.spawn_async wait_process = gdaltestaux.wait_process runexternal = gdaltestaux.runexternal read_in_thread = gdaltestaux.read_in_thread runexternal_out_and_err = gdaltestaux.runexternal_out_and_err gdalautotest-3.0.4/pymod/gdaltest_python2.py0000644003401500001440000001570713614005366020642 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # $Id: gdaltest_python2.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Python Library supporting GDAL/OGR Test Suite # Author: Even Rouault, # ############################################################################### # 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 urllib2 import socket import os import subprocess import shlex import sys from Queue import Queue from threading import Thread def run_func(func): try: result = func() print(result) return result except SystemExit as x: import traceback traceback.print_exc() raise x except Exception: # pylint: disable=broad-except result = 'fail (blowup)' print(result) import traceback traceback.print_exc() return result def urlescape(url): # Escape any non-ASCII characters try: import urllib url = urllib.quote(url) except ImportError: pass return url def gdalurlopen(url, timeout=10): old_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(timeout) proxy = None if 'GDAL_HTTP_PROXY' in os.environ: proxy = os.environ['GDAL_HTTP_PROXY'] protocol = 'http' if 'GDAL_HTTPS_PROXY' in os.environ and url.startswith('https'): proxy = os.environ['GDAL_HTTPS_PROXY'] protocol = 'https' if proxy is not None: if 'GDAL_HTTP_PROXYUSERPWD' in os.environ: proxyuserpwd = os.environ['GDAL_HTTP_PROXYUSERPWD'] proxyHandler = urllib2.ProxyHandler({"%s" % protocol: "%s://%s@%s" % (protocol, proxyuserpwd, proxy)}) else: proxyuserpwd = None proxyHandler = urllib2.ProxyHandler({"%s" % protocol: "%s://%s" % (protocol, proxy)}) opener = urllib2.build_opener(proxyHandler, urllib2.HTTPHandler) urllib2.install_opener(opener) try: handle = urllib2.urlopen(url) socket.setdefaulttimeout(old_timeout) return handle except urllib2.HTTPError as e: print('HTTP service for %s is down (HTTP Error: %d)' % (url, e.code)) socket.setdefaulttimeout(old_timeout) return None except urllib2.URLError as e: print('HTTP service for %s is down (HTTP Error: %s)' % (url, e.reason)) socket.setdefaulttimeout(old_timeout) return None except socket.timeout: print('HTTP service for %s is down (timeout)' % url) socket.setdefaulttimeout(old_timeout) return None def warn_if_memleak(cmd, out_str): # If DEBUG_VSIMALLOC_STATS is defined, this is an easy way # to catch some memory leaks if cmd.find('--utility_version') == -1 and \ out_str.find('VSIMalloc + VSICalloc - VSIFree') != -1 and \ out_str.find('VSIMalloc + VSICalloc - VSIFree : 0') == -1: print('memory leak detected') print(out_str) def spawn_async(cmd): command = shlex.split(cmd) try: process = subprocess.Popen(command, stdout=subprocess.PIPE) return (process, process.stdout) except OSError: return (None, None) def wait_process(process): process.wait() def runexternal(cmd, strin=None, check_memleak=True, display_live_on_parent_stdout=False, encoding=None): # pylint: disable=unused-argument command = shlex.split(cmd) command = [elt.replace('\x00', '') for elt in command] if strin is None: p = subprocess.Popen(command, stdout=subprocess.PIPE) else: p = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) p.stdin.write(strin) p.stdin.close() if p.stdout is not None: if display_live_on_parent_stdout: ret = '' ret_stdout = p.stdout while True: c = ret_stdout.read(1) if c == '': break ret = ret + c sys.stdout.write(c) else: ret = p.stdout.read() else: ret = '' waitcode = p.wait() if waitcode != 0: ret = ret + '\nERROR ret code = %d' % waitcode if encoding is not None: ret = ret.decode(encoding) return ret def read_in_thread(f, q): q.put(f.read()) f.close() # Compatible with Python 2.6 or above def _runexternal_out_and_err_subprocess(cmd, check_memleak=True, encoding=None): # pylint: disable=unused-argument command = shlex.split(cmd) command = [elt.replace('\x00', '') for elt in command] p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if p.stdout is not None: q_stdout = Queue() t_stdout = Thread(target=read_in_thread, args=(p.stdout, q_stdout)) t_stdout.start() else: q_stdout = None ret_stdout = '' if p.stderr is not None: q_stderr = Queue() t_stderr = Thread(target=read_in_thread, args=(p.stderr, q_stderr)) t_stderr.start() else: q_stderr = None ret_stderr = '' if q_stdout is not None: ret_stdout = q_stdout.get() if q_stderr is not None: ret_stderr = q_stderr.get() waitcode = p.wait() if waitcode != 0: ret_stderr = ret_stderr + '\nERROR ret code = %d' % waitcode if encoding is not None: ret_stdout = ret_stdout.decode(encoding) return (ret_stdout, ret_stderr) def runexternal_out_and_err(cmd, check_memleak=True, encoding=None): return _runexternal_out_and_err_subprocess(cmd, check_memleak=check_memleak, encoding=encoding) gdalautotest-3.0.4/pymod/test_py_scripts.py0000644003401500001440000000722213614005366020577 0ustar rouaultusers#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################### # $Id: test_py_scripts.py 9771c21fbccfd684b268783d7514749e83ed3c2c 2018-11-05 15:50:34 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Helper functions for testing python utilities # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-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 sys import gdaltest ############################################################################### # Return the path in which the Python script is found # def get_py_script(script_name): for subdir in ['scripts', 'samples']: try: # Test subversion layout : {root_dir}/gdal, {root_dir}/autotest test_path = os.path.join(os.getcwd(), '..', '..', 'gdal', 'swig', 'python', subdir) test_file_path = os.path.join(test_path, script_name + '.py') os.stat(test_file_path) return test_path except OSError: try: # Test FrankW's directory layout : {root_dir}/gdal, {root_dir}/gdal/autotest test_path = os.path.join(os.getcwd(), '..', '..', 'swig', 'python', subdir) test_file_path = os.path.join(test_path, script_name + '.py') os.stat(test_file_path) return test_path except OSError: pass return None ############################################################################### # Runs a Python script # Alias of run_py_script_as_external_script() # def run_py_script(script_path, script_name, concatenated_argv): return run_py_script_as_external_script(script_path, script_name, concatenated_argv) ############################################################################### # Runs a Python script in a new process # def run_py_script_as_external_script(script_path, script_name, concatenated_argv, display_live_on_parent_stdout=False): script_file_path = os.path.join(script_path, script_name + '.py') # print(script_file_path + ' ' + concatenated_argv) python_exe = sys.executable if sys.platform == 'win32': python_exe = python_exe.replace('\\', '/') script_file_path = script_file_path.replace('\\', '/') return gdaltest.runexternal(python_exe + ' ' + script_file_path + ' ' + concatenated_argv, display_live_on_parent_stdout=display_live_on_parent_stdout) gdalautotest-3.0.4/pymod/uffd.py0000644003401500001440000000627113614005366016270 0ustar rouaultusers# -*- coding: utf-8 -*- ############################################################################### # $Id: uffd.py a626593bea9262fa7115d2238f250ddc8b11a03f 2018-08-08 03:18:15 -0400 James McClain $ # # Project: GDAL/OGR Test Suite # Purpose: Python Library supporting GDAL/OGR Test Suite # Author: James McClain # ############################################################################### # Copyright (c) 2018, Dr. James McClain # # 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 def uffd_compare(filename): """Compare the same file opened with and without the userfaultfd. This function reads a file using the standard filesystem-based mechanism and also using VSIL (and the userfaultfd mechanism for drivers which cannot use VSIL except with it, which are the ones of interest). The two datasets are compared to each other in various ways. Args: filename: The name of the file within the 'autotest/gdrivers/data' directory to use for testing. Returns: `None` if the dataset could not be opened through the VSIL mechanism. `True` is returned if the datasets were found to be identical after various comparisons. `False` otherwise. """ ext = os.path.splitext(filename)[1] vsimem = '/vsimem/file{}'.format(ext) filename2 = './data/{}'.format(filename) gdal.FileFromMemBuffer(vsimem, open(filename2, 'rb').read()) dataset1 = gdal.Open(filename2) dataset2 = gdal.Open(vsimem) if dataset2 is None: gdal.Unlink(vsimem) return None if (dataset1.GetMetadata() != dataset2.GetMetadata()): gdal.Unlink(vsimem) return False if (dataset1.RasterCount != dataset2.RasterCount): gdal.Unlink(vsimem) return False for i in range(dataset1.RasterCount): checksum1 = dataset1.GetRasterBand(i+1).Checksum() checksum2 = dataset2.GetRasterBand(i+1).Checksum() if not checksum1 == checksum2: gdal.Unlink(vsimem) return False gdal.Unlink(vsimem) return True gdalautotest-3.0.4/pymod/ogrtest.py0000644003401500001440000002067613614005366017040 0ustar rouaultusers############################################################################### # $Id: ogrtest.py 1e0db0c3cd7cbc07d60a72812d941889637707d8 2018-12-10 09:26:50 +1300 Craig de Stigter $ # # Project: GDAL/OGR Test Suite # Purpose: Support functions for OGR tests. # Author: Frank Warmerdam # ############################################################################### # Copyright (c) 2003, Frank Warmerdam # # 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. ############################################################################### import sys import pytest sys.path.append('../pymod') from osgeo import ogr import gdaltest geos_flag = None sfcgal_flag = None ############################################################################### def check_features_against_list(layer, field_name, value_list): field_index = layer.GetLayerDefn().GetFieldIndex(field_name) if field_index < 0: gdaltest.post_reason('did not find required field ' + field_name) return 0 for i, value in enumerate(value_list): feat = layer.GetNextFeature() if feat is None: gdaltest.post_reason('Got only %d features, not the expected %d features.' % (i, len(value_list))) return 0 if isinstance(value, type('str')): isok = (feat.GetFieldAsString(field_index) != value) else: isok = (feat.GetField(field_index) != value) if isok: gdaltest.post_reason('field %s feature %d did not match expected value %s, got %s.' % (field_name, i, str(value), str(feat.GetField(field_index)))) return 0 feat = layer.GetNextFeature() if feat is not None: gdaltest.post_reason('got more features than expected') return 0 return 1 ############################################################################### def check_feature_geometry(feat, geom, max_error=0.0001): """ Returns 0 in case of success """ try: f_geom = feat.GetGeometryRef() except: f_geom = feat if geom is not None and isinstance(geom, type('a')): geom = ogr.CreateGeometryFromWkt(geom) if (f_geom is not None and geom is None): gdaltest.post_reason('expected NULL geometry but got one.') return 1 if (f_geom is None and geom is not None): gdaltest.post_reason('expected geometry but got NULL.') return 1 if f_geom is None and geom is None: return 0 if f_geom.GetGeometryName() != geom.GetGeometryName(): gdaltest.post_reason('geometry names do not match. "%s" ! = "%s"' % (f_geom.GetGeometryName(), geom.GetGeometryName())) return 1 if f_geom.GetGeometryCount() != geom.GetGeometryCount(): gdaltest.post_reason('sub-geometry counts do not match') return 1 if f_geom.GetPointCount() != geom.GetPointCount(): gdaltest.post_reason('point counts do not match') return 1 if f_geom.GetGeometryCount() > 0: count = f_geom.GetGeometryCount() for i in range(count): result = check_feature_geometry(f_geom.GetGeometryRef(i), geom.GetGeometryRef(i), max_error) if result != 0: return result else: count = f_geom.GetPointCount() for i in range(count): x_dist = abs(f_geom.GetX(i) - geom.GetX(i)) y_dist = abs(f_geom.GetY(i) - geom.GetY(i)) z_dist = abs(f_geom.GetZ(i) - geom.GetZ(i)) m_dist = abs(f_geom.GetM(i) - geom.GetM(i)) # Hack to deal with shapefile not-a-number M values that equal to -1.79769313486232e+308 if m_dist > max_error and f_geom.GetM(i) < -1.7e308 and geom.GetM(i) < -1.7e308: m_dist = 0 if max(x_dist, y_dist, z_dist, m_dist) > max_error: gdaltest.post_reason('Error in vertex %d, off by %g.' % (i, max(x_dist, y_dist, z_dist, m_dist))) # print(f_geom.GetX(i)) # print(geom.GetX(i)) # print(f_geom.GetY(i)) # print(geom.GetY(i)) # print(f_geom.GetZ(i)) # print(geom.GetZ(i)) return 1 return 0 ############################################################################### def check_feature(feat, feat_ref, max_error=0.0001, excluded_fields=None): """ Returns 0 in case of success """ for i in range(feat.GetGeomFieldCount()): ret = check_feature_geometry(feat.GetGeomFieldRef(i), feat_ref.GetGeomFieldRef(i), max_error=max_error) if ret != 0: return ret for i in range(feat.GetFieldCount()): if excluded_fields is not None: if feat.GetDefnRef().GetFieldDefn(i).GetName() in excluded_fields: continue if feat.GetField(i) != feat_ref.GetField(i): gdaltest.post_reason('Field %d, expected val %s, got val %s' % (i, str(feat_ref.GetField(i)), str(feat.GetField(i)))) return 1 return 0 ############################################################################### def compare_layers(lyr, lyr_ref, excluded_fields=None): for f_ref in lyr_ref: f = lyr.GetNextFeature() if f is None: f_ref.DumpReadable() pytest.fail() if check_feature(f, f_ref, excluded_fields=excluded_fields) != 0: f.DumpReadable() f_ref.DumpReadable() pytest.fail() f = lyr.GetNextFeature() if f is not None: f.DumpReadable() pytest.fail() ############################################################################### def quick_create_layer_def(lyr, field_list): # Each field is a tuple of (name, type, width, precision) # Any of type, width and precision can be skipped. Default type is string. for field in field_list: name = field[0] if len(field) > 1: field_type = field[1] else: field_type = ogr.OFTString field_defn = ogr.FieldDefn(name, field_type) if len(field) > 2: field_defn.SetWidth(int(field[2])) if len(field) > 3: field_defn.SetPrecision(int(field[3])) lyr.CreateField(field_defn) ############################################################################### def quick_create_feature(layer, field_values, wkt_geometry): feature = ogr.Feature(feature_def=layer.GetLayerDefn()) for i, field_value in enumerate(field_values): feature.SetField(i, field_value) if wkt_geometry is not None: geom = ogr.CreateGeometryFromWkt(wkt_geometry) if geom is None: raise ValueError('Failed to create geometry from: ' + wkt_geometry) feature.SetGeometryDirectly(geom) result = layer.CreateFeature(feature) if result != 0: raise ValueError('CreateFeature() failed in ogrtest.quick_create_feature()') ############################################################################### def have_geos(): global geos_flag if geos_flag is None: pnt1 = ogr.CreateGeometryFromWkt('POINT(10 20)') pnt2 = ogr.CreateGeometryFromWkt('POINT(30 20)') geos_flag = pnt1.Union(pnt2) is not None return geos_flag ############################################################################### def have_sfcgal(): global sfcgal_flag if sfcgal_flag is None: pnt1 = ogr.CreateGeometryFromWkt('POINT(10 20 30)') pnt2 = ogr.CreateGeometryFromWkt('POINT(40 50 60)') sfcgal_flag = pnt1.Distance3D(pnt2) >= 0 return sfcgal_flag gdalautotest-3.0.4/pymod/test_cli_utilities.py0000644003401500001440000001557313614005366021252 0ustar rouaultusers#!/usr/bin/env python ############################################################################### # $Id: test_cli_utilities.py a1e40a6f8cce2c5eabc2751cb9bdaa2fab93de28 2018-05-02 11:32:47 +1000 Ben Elliston $ # # Project: GDAL/OGR Test Suite # Purpose: Helper functions for testing CLI utilities # 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 sys import gdaltest cli_exe_path = {} ############################################################################### # def get_cli_utility_path_internal(cli_utility_name): if sys.platform == 'win32': cli_utility_name = cli_utility_name + '.exe' # First try : in the apps directory of the GDAL source tree # This is the case for the buildbot directory tree try: cli_utility_path = os.path.join(os.getcwd(), '..', '..', 'gdal', 'apps', cli_utility_name) if sys.platform == 'win32': cli_utility_path = cli_utility_path.replace('\\', '/') if os.path.isfile(cli_utility_path): ret = gdaltest.runexternal(cli_utility_path + ' --utility_version') if ret.find('GDAL') != -1: return cli_utility_path except OSError: pass # Second try : the autotest directory is a subdirectory of gdal/ (FrankW's layout) try: cli_utility_path = os.path.join(os.getcwd(), '..', '..', 'apps', cli_utility_name) if sys.platform == 'win32': cli_utility_path = cli_utility_path.replace('\\', '/') if os.path.isfile(cli_utility_path): ret = gdaltest.runexternal(cli_utility_path + ' --utility_version') if ret.find('GDAL') != -1: return cli_utility_path except OSError: pass # Otherwise look up in the system path try: cli_utility_path = cli_utility_name ret = gdaltest.runexternal(cli_utility_path + ' --utility_version') if ret.find('GDAL') != -1: return cli_utility_path except OSError: pass return None ############################################################################### # def get_cli_utility_path(cli_utility_name): global cli_exe_path if cli_utility_name in cli_exe_path: return cli_exe_path[cli_utility_name] cli_exe_path[cli_utility_name] = get_cli_utility_path_internal(cli_utility_name) return cli_exe_path[cli_utility_name] ############################################################################### # def get_gdalinfo_path(): return get_cli_utility_path('gdalinfo') ############################################################################### # def get_gdal_translate_path(): return get_cli_utility_path('gdal_translate') ############################################################################### # def get_gdalwarp_path(): return get_cli_utility_path('gdalwarp') ############################################################################### # def get_gdaladdo_path(): return get_cli_utility_path('gdaladdo') ############################################################################### # def get_gdaltransform_path(): return get_cli_utility_path('gdaltransform') ############################################################################### # def get_gdaltindex_path(): return get_cli_utility_path('gdaltindex') ############################################################################### # def get_gdal_grid_path(): return get_cli_utility_path('gdal_grid') ############################################################################### # def get_ogrinfo_path(): return get_cli_utility_path('ogrinfo') ############################################################################### # def get_ogr2ogr_path(): return get_cli_utility_path('ogr2ogr') ############################################################################### # def get_ogrtindex_path(): return get_cli_utility_path('ogrtindex') ############################################################################### # def get_ogrlineref_path(): return get_cli_utility_path('ogrlineref') ############################################################################### # def get_gdalbuildvrt_path(): return get_cli_utility_path('gdalbuildvrt') ############################################################################### # def get_gdal_contour_path(): return get_cli_utility_path('gdal_contour') ############################################################################### # def get_gdaldem_path(): return get_cli_utility_path('gdaldem') ############################################################################### # def get_gdal_rasterize_path(): return get_cli_utility_path('gdal_rasterize') ############################################################################### # def get_nearblack_path(): return get_cli_utility_path('nearblack') ############################################################################### # def get_test_ogrsf_path(): return get_cli_utility_path('test_ogrsf') ############################################################################### # def get_gdallocationinfo_path(): return get_cli_utility_path('gdallocationinfo') ############################################################################### # def get_gdalsrsinfo_path(): return get_cli_utility_path('gdalsrsinfo') ############################################################################### # def get_gnmmanage_path(): return get_cli_utility_path('gnmmanage') ############################################################################### # def get_gnmanalyse_path(): return get_cli_utility_path('gnmanalyse') gdalautotest-3.0.4/pymod/webserver.py0000644003401500001440000003555413614005366017356 0ustar rouaultusers#!/usr/bin/env python ############################################################################### # $Id: webserver.py e3b9cb3fe73b177191085a02993c0a9aacb6b4ce 2019-06-25 11:41:15 +0200 Even Rouault $ # # Project: GDAL/OGR Test Suite # Purpose: Fake HTTP server # Author: Even Rouault # ############################################################################### # Copyright (c) 2010-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. ############################################################################### try: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer except ImportError: from http.server import BaseHTTPRequestHandler, HTTPServer from threading import Thread import contextlib import time import sys from sys import version_info import gdaltest do_log = False custom_handler = None @contextlib.contextmanager def install_http_handler(handler_instance): global custom_handler custom_handler = handler_instance try: yield finally: handler_instance.final_check() custom_handler = None class RequestResponse(object): def __init__(self, method, path, code, headers=None, body=None, custom_method=None, expected_headers=None, expected_body=None, add_content_length_header=True): self.method = method self.path = path self.code = code self.headers = {} if headers is None else headers self.body = body self.custom_method = custom_method self.expected_headers = {} if expected_headers is None else expected_headers self.expected_body = expected_body self.add_content_length_header = add_content_length_header class FileHandler(object): def __init__(self, _dict): self.dict = _dict def final_check(self): pass def do_HEAD(self, request): if request.path not in self.dict: request.send_response(404) request.end_headers() else: request.send_response(200) request.send_header('Content-Length', len(self.dict[request.path])) request.end_headers() def do_GET(self, request): if request.path not in self.dict: request.send_response(404) request.end_headers() else: filedata = self.dict[request.path] start = 0 end = len(filedata) if 'Range' in request.headers: import re res = re.search('bytes=(\d+)\-(\d+)', request.headers['Range']) if res: res = res.groups() start = int(res[0]) end = int(res[1]) + 1 if end > len(filedata): end = len(filedata) request.send_response(200) if 'Range' in request.headers: request.send_header('Content-Range', '%d-%d' % (start, end - 1)) request.send_header('Content-Length', len(filedata)) request.end_headers() request.wfile.write(filedata[start:end]) class SequentialHandler(object): def __init__(self): self.req_count = 0 self.req_resp = [] self.req_resp_map = {} def final_check(self): assert self.req_count == len(self.req_resp), (self.req_count, len(self.req_resp)) assert not self.req_resp_map def add(self, method, path, code=None, headers=None, body=None, custom_method=None, expected_headers=None, expected_body=None, add_content_length_header=True): hdrs = {} if headers is None else headers expected_hdrs = {} if expected_headers is None else expected_headers assert not self.req_resp_map self.req_resp.append(RequestResponse(method, path, code, hdrs, body, custom_method, expected_hdrs, expected_body, add_content_length_header)) def add_unordered(self, method, path, code=None, headers=None, body=None, custom_method=None, expected_headers=None, expected_body=None, add_content_length_header=True): hdrs = {} if headers is None else headers expected_hdrs = {} if expected_headers is None else expected_headers self.req_resp_map[(method, path)] = RequestResponse(method, path, code, hdrs, body, custom_method, expected_hdrs, expected_body, add_content_length_header) @staticmethod def _process_req_resp(req_resp, request): if req_resp.custom_method: req_resp.custom_method(request) else: if req_resp.expected_headers: for k in req_resp.expected_headers: if k not in request.headers or request.headers[k] != req_resp.expected_headers[k]: sys.stderr.write('Did not get expected headers: %s\n' % str(request.headers)) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return if req_resp.expected_body: content = request.rfile.read(int(request.headers['Content-Length'])) if content != req_resp.expected_body: sys.stderr.write('Did not get expected content: %s\n' % content) request.send_response(400) request.send_header('Content-Length', 0) request.end_headers() return request.send_response(req_resp.code) for k in req_resp.headers: request.send_header(k, req_resp.headers[k]) if req_resp.add_content_length_header: if req_resp.body: request.send_header('Content-Length', len(req_resp.body)) elif 'Content-Length' not in req_resp.headers: request.send_header('Content-Length', '0') request.end_headers() if req_resp.body: try: request.wfile.write(req_resp.body) except: request.wfile.write(req_resp.body.encode('ascii')) def process(self, method, request): if self.req_count < len(self.req_resp): req_resp = self.req_resp[self.req_count] if method == req_resp.method and request.path == req_resp.path: self.req_count += 1 SequentialHandler._process_req_resp(req_resp, request) return else: if (method, request.path) in self.req_resp_map: req_resp = self.req_resp_map[(method, request.path)] del self.req_resp_map[(method, request.path)] SequentialHandler._process_req_resp(req_resp, request) return request.send_error(500, 'Unexpected %s request for %s, req_count = %d' % (method, request.path, self.req_count)) def do_HEAD(self, request): self.process('HEAD', request) def do_GET(self, request): self.process('GET', request) def do_POST(self, request): self.process('POST', request) def do_PUT(self, request): self.process('PUT', request) def do_DELETE(self, request): self.process('DELETE', request) class DispatcherHttpHandler(BaseHTTPRequestHandler): # protocol_version = 'HTTP/1.1' def log_request(self, code='-', size='-'): # pylint: disable=unused-argument pass def do_HEAD(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('HEAD %s\n' % self.path) f.close() custom_handler.do_HEAD(self) def do_DELETE(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('DELETE %s\n' % self.path) f.close() custom_handler.do_DELETE(self) def do_POST(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('POST %s\n' % self.path) f.close() custom_handler.do_POST(self) def do_PUT(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('PUT %s\n' % self.path) f.close() custom_handler.do_PUT(self) def do_GET(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('GET %s\n' % self.path) f.close() custom_handler.do_GET(self) class GDAL_Handler(BaseHTTPRequestHandler): # pylint: disable=unused-argument def log_request(self, code='-', size='-'): pass def do_HEAD(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('HEAD %s\n' % self.path) f.close() self.send_error(404, 'File Not Found: %s' % self.path) def do_DELETE(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('DELETE %s\n' % self.path) f.close() self.send_error(404, 'File Not Found: %s' % self.path) def do_POST(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('POST %s\n' % self.path) f.close() self.send_error(404, 'File Not Found: %s' % self.path) def do_PUT(self): if do_log: f = open('/tmp/log.txt', 'a') f.write('PUT %s\n' % self.path) f.close() self.send_error(404, 'File Not Found: %s' % self.path) def do_GET(self): try: if do_log: f = open('/tmp/log.txt', 'a') f.write('GET %s\n' % self.path) f.close() if self.path == '/shutdown': self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() # sys.stderr.write('stop requested\n') self.server.stop_requested = True return return except IOError: pass self.send_error(404, 'File Not Found: %s' % self.path) class GDAL_HttpServer(HTTPServer): def __init__(self, server_address, handlerClass): HTTPServer.__init__(self, server_address, handlerClass) self.running = False self.stop_requested = False def is_running(self): return self.running def stop_server(self): if self.running: if version_info >= (2, 6, 0): self.shutdown() else: gdaltest.gdalurlopen("http://127.0.0.1:%d/shutdown" % self.port) self.running = False def serve_until_stop_server(self): self.running = True if version_info >= (2, 6, 0): self.serve_forever(0.25) else: while self.running and not self.stop_requested: self.handle_request() self.running = False self.stop_requested = False class GDAL_ThreadedHttpServer(Thread): def __init__(self, handlerClass=None): Thread.__init__(self) ok = False self.server = 0 if handlerClass is None: handlerClass = GDAL_Handler for port in range(8080, 8100): try: self.server = GDAL_HttpServer(('', port), handlerClass) self.server.port = port ok = True break except: pass if not ok: raise Exception('could not start server') def getPort(self): return self.server.port def run(self): try: self.server.serve_until_stop_server() except KeyboardInterrupt: print('^C received, shutting down server') self.server.socket.close() def start_and_wait_ready(self): if self.server.running: raise Exception('server already started') self.start() while not self.server.running: time.sleep(1) def stop(self): self.server.stop_server() # Explicitly destroy the object so that the socket is really closed del self.server def run_server(self, timeout): if not self.server.running: raise Exception('server not started') count = 0 while (timeout <= 0 or count < timeout) and self.server.running and not self.server.stop_requested: # print(count) # print(self.server.is_running()) time.sleep(0.5) count = count + 0.5 self.stop() def launch(fork_process=None, handler=None): if handler is not None: if fork_process: raise Exception('fork_process = True incompatible with custom handler') fork_process = False else: fork_process = True if not fork_process or handler is not None: try: if handler is None: handler = GDAL_Handler server = GDAL_ThreadedHttpServer(handler) server.start_and_wait_ready() return (server, server.getPort()) except: return (None, 0) python_exe = sys.executable if sys.platform == 'win32': python_exe = python_exe.replace('\\', '/') (process, process_stdout) = gdaltest.spawn_async(python_exe + ' ../pymod/webserver.py') if process is None: return (None, 0) line = process_stdout.readline() line = line.decode('ascii') process_stdout.close() if line.find('port=') == -1: return (None, 0) port = int(line[5:]) if port != 0: print('HTTP Server started on port %d' % port) return (process, port) def server_stop(process, port): if isinstance(process, GDAL_ThreadedHttpServer): process.stop() return gdaltest.gdalurlopen('http://127.0.0.1:%d/shutdown' % port) gdaltest.wait_process(process) def main(): try: server = GDAL_ThreadedHttpServer(GDAL_Handler) server.start_and_wait_ready() print('port=%d' % server.getPort()) sys.stdout.flush() except: print('port=0') sys.stdout.flush() sys.exit(0) server.run_server(10) if __name__ == '__main__': main() gdalautotest-3.0.4/pymod/__init__.py0000644003401500001440000000000013614005366017063 0ustar rouaultusersgdalautotest-3.0.4/cpp/0000755003401500001440000000000013614005370014411 5ustar rouaultusersgdalautotest-3.0.4/cpp/test_marching_squares_contour.cpp0000644003401500001440000003742713614005366023302 0ustar rouaultusers/****************************************************************************** * $Id: test_marching_squares_contour.cpp 98906f740473968e60649eaf73b0138d814062bb 2018-10-29 13:53:48 +0100 Hugo Mercier $ * * Project: GDAL algorithms * Purpose: Tests for the marching squares algorithm * Author: Hugo Mercier, * ****************************************************************************** * Copyright (c) 2018, Hugo Mercier, * * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "gdal_alg.h" #include "marching_squares/level_generator.h" #include "marching_squares/segment_merger.h" #include "marching_squares/contour_generator.h" namespace marching_squares { class TestRingAppender { public: struct Point { Point( double xx, double yy ): x(xx), y(yy) {} double x; double y; bool operator<( const Point& b ) const { return x == b.x ? y < b.y : x < b.x; } bool operator==( const Point& b ) const { return std::fabs(x - b.x) < 0.001 && std::fabs(y - b.y) < 0.001; } bool operator!=( const Point& b ) const { return ! (*this == b); } }; void addLine( double level, LineString& ls, bool /* closed */ ) { auto& v = points_[level]; std::vector ring; for ( const auto& pt : ls ) { ring.push_back( Point( pt.x, pt.y ) ); } v.push_back( ring ); } bool hasRing( double level, const std::vector& other ) const { auto it = points_.find( level ); if ( it == points_.end() ) { return false; } const auto& rings = it->second; for ( const auto& ring: rings ) { if ( ringEquals_( ring, other ) ) { return true; } else { // test also the reverse ring auto rev = other; std::reverse( rev.begin(), rev.end() ); if ( ringEquals_( ring, rev ) ) { return true; } } } return false; } void out( std::ostream& o, double level ) { for ( const auto& p : points_[level] ) { out_( o, p ); } } private: // level -> vector of rings std::map>> points_; bool ringEquals_( const std::vector& aRing, const std::vector& bRing ) const { if ( aRing.size() - 1 != bRing.size() ) { return false; } // rings do not really have a "first" point, but since // we represent them with a vector, we need to find a common "first" point Point pfirst = aRing[0]; size_t offset = 0; while ( offset < bRing.size() && pfirst != bRing[offset] ) offset++; if ( offset >= bRing.size() ) { // can't find a common point return false; } // now compare each point of the two rings for ( size_t i = 0; i < aRing.size(); i++ ) { const Point& p2 = bRing[( i + offset ) % bRing.size()]; if ( aRing[i] != p2 ) { return false; } } return true; } void out_( std::ostream& o, const std::vector& points ) const { o << "{ "; for ( const auto& pt: points ) { o << "{" << pt.x << "," << pt.y << "}, "; } o << "}, "; } }; } namespace tut { using namespace marching_squares; // Common fixture with test data struct test_ms_contour_data { }; // Register test group typedef test_group group; typedef group::object object; group test_ms_contour_group("MarchingSquares:Contour"); // Dummy test template<> template<> void object::test<1>() { // one pixel std::vector data = { 2.0 }; TestRingAppender w; { IntervalLevelRangeIterator levels( 0.0, 10.0 ); SegmentMerger writer( w, levels, /* polygonize */ true ); ContourGenerator cg( 1, 1, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); ensure( "Polygon ring", w.hasRing( 10.0, {{0.0, 0.0}, {0.5, 0.0}, {1.0, 0.0}, {1.0, 0.5}, {1.0, 1.0}, {0.5, 1.0}, {0.0, 1.0}, {0.0, 0.5}} ) ); } } template<> template<> void object::test<2>() { // two pixels // 10 7 // levels = 8 std::vector data = { 10.0, 7.0 }; TestRingAppender w; { IntervalLevelRangeIterator levels( 8.0, 10.0 ); SegmentMerger writer( w, levels, /* polygonize */ true ); ContourGenerator cg( 2, 1, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); ensure( "Polygon #0", w.hasRing( 8.0, {{1.166, 0.0}, {1.5, 0.0}, {2.0, 0.0}, {2.0, 0.5}, {2.0, 1.0}, {1.5, 1.0}, {1.166, 1.0}, {1.166, 0.5}} ) ); ensure( "Polygon #1", w.hasRing( 18.0, {{1.166, 0.0}, {1.0, 0.0}, {0.5, 0.0}, {0.0, 0.0}, {0.0, 0.5}, {0.0, 1.0}, {0.5, 1.0}, {1.0, 1.0}, {1.166, 1.0}, {1.166, 0.5}} ) ); } } template<> template<> void object::test<3>() { // four pixels // 10 7 // 4 5 // levels = 8 // pixels // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 10 | 7 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 4 | 5 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // // squares // +-----+-----+-----+-----+ // |NaN | NaN | NaN | NaN | // | +.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : |10: | 7: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | 4: | 5: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | : | : | : | // | +.....+.....+.....+ | // | NaN | NaN | NaN | NaN | // +-----+-----+-----+-----+ // // subsquares // legend: // : contour // = border (level 8) // # border (level 18) // // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 10 10| 8.5 7| 7 | // | +#########+########+###o=====+========++ | // | # | | : | || | // | # | | : | || | // | # | | : | || | // +--------+---------+--------+---o-----+--------++--------+ // |NaN 10# 10| ........: 7| 7 || NaN| // | o.........o..: | || | // | || | | || | // | 7++---------+ 7 6 +--------++ | // | || | | || | // | || | | || | // | || | 4.5 | || | // +-------++---------+--------+---------+--------++--------+ // |NaN 4|| 4 | | 5| 5 || NaN| // | || | | | || | // | || | | | || | // | ++=========+========+=========+========++ | // | 4 4 | 4.5 5| 5 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 10.0, 7.0, 4.0, 5.0 }; TestRingAppender w; { IntervalLevelRangeIterator levels( 8.0, 10.0 ); SegmentMerger writer( w, levels, /* polygonize */ true ); ContourGenerator cg( 2, 2, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); ensure( "Polygon #0", w.hasRing( 8.0, {{2.0, 0.0}, {2.0, 0.5}, {2.0, 1.0}, {2.0, 1.5}, {2.0, 2.0}, {1.5, 2.0}, {1.0, 2.0}, {0.5, 2.0}, {0.0, 2.0}, {0.0, 1.5}, {0.0, 1.0}, {0.0, 0.833}, {0.5, 0.833}, {1.167, 0.5}, {1.167, 0.0}, {1.5, 0.0}} ) ); ensure( "Polygon #1", w.hasRing( 18.0, {{0.0, 0.0}, {0.5, 0.0}, {1.0, 0.0}, {1.167, 0.0}, {1.167, 0.5}, {0.5, 0.833}, {0, 0.833}, {0.0, 0.5}} ) ); } } template<> template<> void object::test<4>() { // four pixels // two rings // with a saddle point // 5 10 // 10 5 // levels = 8 // pixels // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 5 | 10 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 10 | 5 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // // squares // +-----+-----+-----+-----+ // |NaN | NaN | NaN | NaN | // | +.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | 5: |10: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : |10: | 5: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | : | : | : | // | +.....+.....+.....+ | // | NaN | NaN | NaN | NaN | // +-----+-----+-----+-----+ // // subsquares // legend: // : contour // # border (level 8) // = border (level 18) // // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 5 5| 7.5 10| 10 | // | +#########+########+###o=====+========++ | // | # | | : | || | // | # | | : | || | // | # | | : | || | // +--------+---------+--------+---o-----+--------++--------+ // |NaN 5 # 5| \ 10| 10|| NaN| // | # | \___o........o | // | # | | # | // | 7.5++---------+7.5 7.5+--------+ | // | # | | # | // | o.........o\_ | # | // | || | \_ 7.5 | # | // +-------++---------+----\o--+---------+--------+---------+ // |NaN 10|| 10| : | 5| 5 # NaN| // | || | : | | # | // | || | : | | # | // | ++=========+=====o##+#########+########+ | // | 10 10| 7.5 5| 5 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 5.0, 10.0, 10.0, 5.0 }; TestRingAppender w; { IntervalLevelRangeIterator levels( 8.0, 10.0 ); SegmentMerger writer( w, levels, /* polygonize */ true ); ContourGenerator cg( 2, 2, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); ensure( "Polygon #0", w.hasRing( 8.0, { {1.5,2}, {2,2}, {2,1.5}, {2,1}, {2,0.9}, {1.5,0.9}, {1.1,0.5}, {1.1,0}, {1,0}, {0.5,0}, {0,0}, {0,0.5}, {0,1}, {0,1.1}, {0.5,1.1}, {0.9,1.5}, {0.9,2}, {1,2} } ) ); ensure( "Polygon #1, Ring #0", w.hasRing( 18.0, { {2,0.9}, {2,0.5}, {2,0}, {1.5,0}, {1.1,0}, {1.1,0.5}, {1.5,0.9} } ) ); ensure( "Polygon #1, Ring #1", w.hasRing( 18.0, { {0.9,1.5}, {0.5,1.1}, {0,1.1}, {0,1.5}, {0,2}, {0.5,2}, {0.9,2} } ) ); } } } gdalautotest-3.0.4/cpp/test_osr_proj4.cpp0000644003401500001440000000756013614005366020112 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test some PROJ.4 specific translation issues. // Ported from osr/osr_proj4.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_error.h" #include "ogr_api.h" #include "ogr_srs_api.h" #include #include #include namespace tut { // Common fixture with test data struct test_osr_proj4_data { OGRErr err_; OGRSpatialReferenceH srs_; test_osr_proj4_data() : err_(OGRERR_NONE), srs_(nullptr) { srs_ = OSRNewSpatialReference(nullptr); OSRSetAxisMappingStrategy(srs_, OAMS_TRADITIONAL_GIS_ORDER); } ~test_osr_proj4_data() { OSRDestroySpatialReference(srs_); } }; // Register test group typedef test_group group; typedef group::object object; group test_osr_proj4_group("OSR::PROJ.4"); // Test the +k_0 flag works as well as +k when // consuming PROJ.4 format template<> template<> void object::test<1>() { ensure("SRS handle is NULL", nullptr != srs_); std::string wkt("+proj=tmerc +lat_0=53.5000000000 +lon_0=-8.0000000000 " "+k_0=1.0000350000 +x_0=200000.0000000000 +y_0=250000.0000000000 " "+a=6377340.189000 +rf=299.324965 +towgs84=482.530," "-130.596,564.557,-1.042,-0.214,-0.631,8.15"); err_ = OSRImportFromProj4(srs_, wkt.c_str()); ensure_equals("OSRImportFromProj4)( failed", err_, OGRERR_NONE); // TODO: Check max error value const double maxError = 0.00005; // 0.0000005 double val = 0; val = OSRGetProjParm(srs_, SRS_PP_SCALE_FACTOR, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("+k_0 not supported on import from PROJ.4", std::fabs(val - 1.000035) <= maxError); } // Verify that we can import strings with parameter values // that are exponents and contain a plus sign template<> template<> void object::test<2>() { ensure("SRS handle is NULL", nullptr != srs_); std::string wkt("+proj=lcc +x_0=0.6096012192024384e+06 +y_0=0 " "+lon_0=90dw +lat_0=42dn +lat_1=44d4'n +lat_2=42d44'n " "+a=6378206.400000 +rf=294.978698 +nadgrids=conus,ntv1_can.dat"); err_ = OSRImportFromProj4(srs_, wkt.c_str()); ensure_equals("OSRImportFromProj4)( failed", err_, OGRERR_NONE); const double maxError = 0.0005; double val = 0; val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("Parsing exponents not supported", std::fabs(val - 609601.219) <= maxError); } } // namespace tut gdalautotest-3.0.4/cpp/test_marching_squares_square.cpp0000644003401500001440000006661013614005366023105 0ustar rouaultusers/****************************************************************************** * $Id: test_marching_squares_square.cpp 5c2c68af6b930de5249baf9ff9c1159ee805fbd7 2018-08-06 09:41:49 +0200 Hugo Mercier $ * * Project: GDAL algorithms * Purpose: Tests for the marching squares algorithm * Author: Hugo Mercier, * ****************************************************************************** * Copyright (c) 2018, Hugo Mercier, * * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "gdal_alg.h" #include "marching_squares/square.h" #include "marching_squares/level_generator.h" #include #include #include namespace marching_squares { struct Writer { typedef std::pair< Point, Point > Segment; void addSegment(int levelIdx, const Point &first, const Point &second) { contours[levelIdx].push_back(Segment(first, second)); } void addBorderSegment(int levelIdx, const Point &first, const Point &second) { borders[levelIdx].push_back(Segment(first, second)); } std::map< int, std::vector< Segment > > contours; std::map< int, std::vector< Segment > > borders; const bool polygonize = true; }; } namespace tut { using namespace marching_squares; // Common fixture with test data struct test_ms_data { }; // Register test group typedef test_group group; typedef group::object object; group test_ms_group("MarchingSquares:Square"); // Dummy test template<> template<> void object::test<1>() { { const double levels[] = { 0, 4 }; FixedLevelRangeIterator levelGenerator( levels, 2 ); auto r = levelGenerator.range( 0, 5.0 ); auto b = r.begin(); ensure_equals( (*b).first, 1 ); ensure_equals( (*b).second, 4.0 ); auto e = r.end(); ensure_equals( (*e).first, 2 ); ensure_equals( (*e).second, Inf ); } { IntervalLevelRangeIterator levelGenerator( 0, 4 ); auto r = levelGenerator.range( 0, 5.0 ); auto b = r.begin(); ensure_equals( (*b).first, 1 ); ensure_equals( (*b).second, 4.0 ); auto e = r.end(); ensure_equals( (*e).first, 2 ); ensure_equals( (*e).second, 8.0 ); } { IntervalLevelRangeIterator levelGenerator( 0, 10 ); auto r = levelGenerator.range( -18, 5.0 ); auto b = r.begin(); ensure_equals( (*b).first, -1 ); ensure_equals( (*b).second, -10.0 ); auto e = r.end(); ensure_equals( (*e).first, 1 ); ensure_equals( (*e).second, 10.0 ); } { ExponentialLevelRangeIterator levelGenerator( 2 ); auto r = levelGenerator.range( 0, 5.0 ); auto b = r.begin(); ensure_equals( (*b).first, 1 ); ensure_equals( (*b).second, 1.0 ); ++b; ensure_equals( (*b).first, 2 ); ensure_equals( (*b).second, 2.0 ); ++b; ensure_equals( (*b).first, 3 ); ensure_equals( (*b).second, 4.0 ); auto e = r.end(); ensure_equals( (*e).first, 4 ); ensure_equals( (*e).second, 8.0 ); } } template <> template <> void object::test<2>() { // Square with only 0, level = 0.1 Square square( ValuedPoint(0,1,0), ValuedPoint(1,1,0), ValuedPoint(0,0,0), ValuedPoint(1,0,0)); Square::Segments segments(square.segments(.1)); // // 0 0 // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 0 0 ensure_equals( segments.size(), size_t(0) ); } template <> template <> void object::test<3>() { // Square with only 1, level = 0.1 Square square( ValuedPoint(0,1,1), ValuedPoint(1,1,1), ValuedPoint(0,0,1), ValuedPoint(1,0,1)); // // 1 1 // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 1 1 Square::Segments segments(square.segments(.1)); ensure_equals( segments.size(), size_t(0) ); } template <> template <> void object::test<4>() { // Square with only 1, level = 1.0 Square square( ValuedPoint(0,1,1), ValuedPoint(1,1,1), ValuedPoint(0,0,1), ValuedPoint(1,0,1)); // // 1 1 // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 1 1 Square::Segments segments(square.segments(1.0)); ensure_equals( segments.size(), size_t(0) ); } template <> template <> void object::test<5>() { // Square with one segment, level = 0.1 Square square( ValuedPoint(0,1,1), ValuedPoint(1,1,0), ValuedPoint(0,0,0), ValuedPoint(1,0,0)); // // 0 0 // +------------------+ // | | // | | // | | // | | // | | // o | // | \ | // +---o--------------+ // 1 0 Square::Segments segments(square.segments(.1)); ensure_equals( segments.size(), size_t(1) ); ensure( segments[0].first == Point(.9, 1) ); ensure(segments[0].second == Point(0, .1) ); } template <> template <> void object::test<6>() { // Fudge test 1 Square square( ValuedPoint(0,1,0), ValuedPoint(1,1,1), ValuedPoint(0,0,1), ValuedPoint(1,0,1)); // // 0 1 // +------------------o // | __/| // | __/ | // | __/ | // | _/ | // | __/ | // | __/ | // |/ | // o------------------+ // 1 1 // (0,0) { Square::Segments segments(square.segments(0.0)); ensure_equals( segments.size(), size_t(0) ); } { Square::Segments segments(square.segments(1.0)); ensure_equals( segments.size(), size_t(1) ); ensure( (std::fabs(segments[0].first.x - 0.0) < 0.001) && (std::fabs(segments[0].first.y - 0.0) < 0.001) ); ensure( (std::fabs(segments[0].second.x - 1.0) < 0.001) && (std::fabs(segments[0].second.y - 1.0) < 0.001) ); } } template <> template <> void object::test<7>() { // Fudge test 2 Square square( ValuedPoint(0,1,1), ValuedPoint(1,1,0), ValuedPoint(0,0,0), ValuedPoint(1,0,0)); // // 1 0 // +o-----------------+ // o+ | // | | // | | // | | // | | // | | // | | // +------------------+ // 0 0 // (0,0) { Square::Segments segments(square.segments(1.0)); ensure( segments.size() == 1 ); ensure( (std::fabs(segments[0].first.x - 0.0) < 0.001) && (std::fabs(segments[0].first.y - 1.0) < 0.001) ); ensure( (std::fabs(segments[0].second.x - 0.0) < 0.001) && (std::fabs(segments[0].second.y - 1.0) < 0.001) ); } { Square::Segments segments(square.segments(0.0)); ensure( segments.size() == 0 ); } } template <> template <> void object::test<8>() { // A square with NaN const Square square( ValuedPoint(2.500000, 1.500000, 224.990005), ValuedPoint(3.500000, 1.500000, NaN), ValuedPoint(2.500000, 2.500000, 225.029999), ValuedPoint(3.500000, 2.500000, 224.770004)); // // 224.990005 NaN // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 225.029999 224.770004 const Square ul(square.upperLeftSquare()); const Square ll(square.lowerLeftSquare()); // upper left and lower left squares // // 224.990005 224.990005 NaN // +--------+---------+ // | | | // | | | // | | | // +--------+ 224.930002 // 225.010002 | | // | | | // | 224.900001 | // +--------+---------+ // 225.029999 224.770004 ensure( (std::fabs(ul.lowerLeft.value - 225.010002) < 0.000001) ); ensure( (std::fabs(ul.lowerRight.value - 224.930002) < 0.000001) ); ensure( (std::fabs(ul.upperRight.value - 224.990005) < 0.000001) ); ensure( (std::fabs(ll.lowerRight.value - 224.900001) < 0.000001) ); ensure( (ul.lowerLeft.x == ll.upperLeft.x) ); ensure( (ul.lowerLeft.y == ll.upperLeft.y) ); ensure( (ul.lowerLeft.value == ll.upperLeft.value) ); ensure( (ul.lowerRight.x == ll.upperRight.x) ); ensure( (ul.lowerRight.y == ll.upperRight.y) ); ensure( (ul.lowerRight.value == ll.upperRight.value) ); const Square::Segments segments_up(ul.segments(225)); const Square::Segments segments_down(ll.segments(225)); // segments on 225 // // 224.990005 224.990005 NaN // <--------<---------+ // | | | // o_ | | // | \ | | // >--o-----< 224.930002 // 225.01|002 | | // | \ | | // | |224.900001 | // >---o----<---------+ // 225.029999 224.770004 ensure( (segments_up.size() == 1) ); ensure( (segments_down.size() == 1) ); // the two segments have a point in common ensure( (segments_up[0].second == segments_down[0].first) ); } template <> template <> void object::test<9>() { // Border test 1 const Square square( ValuedPoint(0.5, 0.5, NaN), ValuedPoint(1.5, 0.5, NaN), ValuedPoint(0.5, 1.5, 272.87), ValuedPoint(1.5, 1.5, 272.93)); // // NaN NaN // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 272.87 272.93 const Square ll(square.lowerLeftSquare()); const Square lr(square.lowerRightSquare()); // // NaN NaN // +------------------+ // | | // | | // 272.87 272.90000 272.93 // +--------+---------+ // | | | // | | | // | | | // +--------+---------+ // 272.87 272.90000 272.93 Square::Segments segments_l(ll.segments(272.9)); Square::Segments segments_r(lr.segments(272.9)); // the level falls exactly on corners // thanks to the fudge, each corner should be shifted away a bit // // NaN NaN // +------------------+ // | | // | | // 272.87 272.90000 272.93 // <-------o>---------> // | :| | // | :| | // | :| | // <-------o>---------> // 272.87 272.90000 272.93 ensure_equals( segments_l.size(), size_t(1) ); ensure_equals( segments_r.size(), size_t(0) ); } template <> template <> void object::test<10>() { // Multiple levels const Square square( ValuedPoint(0.5, 1.5, 272.99), ValuedPoint(1.5, 1.5, NaN), ValuedPoint(0.5, 0.5, 273.03), ValuedPoint(1.5, 0.5, 272.9)); // // 272.99 NaN // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 273.03 272.90 const Square ul(square.upperLeftSquare()); // // 272.99 272.99 NaN // +---------+--------+ // | | | // | | | // | | | // +---------+ | // 273.01 272.97 | // | | // | | // +------------------+ // 273.03 272.90 ensure( (std::fabs(ul.lowerLeft.value - 273.01) < 0.01) ); ensure( (std::fabs(ul.lowerRight.value - 272.97) < 0.01) ); ensure( (std::fabs(ul.upperRight.value - 272.99) < 0.01) ); // We have a NaN value on the right, we should then have a right border ensure( (ul.borders == Square::RIGHT_BORDER) ); Writer writer; // levels starting at min and increasing by 0.1 IntervalLevelRangeIterator levelGenerator(0, .1); ul.process(levelGenerator, writer); // we only have a contour when level = 273.0 // (0.5, 1.5) (1.5, 1.5) // 272.99 272.99 NaN // +---------+--------+ // | || | // o || | // |\ || | // +-o-------+ | // 273.01 272.97 | // | | // | | // +------------------+ // 273.03 272.90 // (0.5, 0.5) (1.5, 0.5) ensure( (writer.contours.size() == 2) ); ensure( (writer.borders.size() == 1) ); ensure( (writer.contours.find(2730) != writer.contours.end()) ); ensure( (writer.contours.find(2731) != writer.contours.end()) ); ensure( (writer.borders.find(2730) != writer.borders.end()) ); // we have one segment border on the right ensure( (writer.borders[2730].size() == 1) ); ensure( (writer.contours[2730].size() == 1) ); ensure( (writer.contours[2731].size() == 1) ); } template <> template <> void object::test<11>() { // Border test 3 Square square( ValuedPoint(0,0,10), ValuedPoint(1,0,5), ValuedPoint(0,1,NaN), ValuedPoint(1,1,4)); // level value = 7 // 10 7.5 5 // +---------+--------+ // | | | // | _o | // | _/ | | // 10 +====o====+ 6.33 | // | | // | | // | | // +------------------+ // NaN 4 const Square ul(square.upperLeftSquare()); ensure( "Lower left value", (std::fabs(ul.lowerLeft.value - 10.00) < 0.01) ); ensure( "Lower right value", (std::fabs(ul.lowerRight.value - 6.33) < 0.01) ); ensure( "Upper right value", (std::fabs(ul.upperRight.value - 7.50) < 0.01) ); // We have a NaN value on the right, we should then have a right border ensure( "We have the lower border", ul.borders == Square::LOWER_BORDER ); { // ... with a level interval Writer writer; IntervalLevelRangeIterator levelGenerator(7, 5); ul.process(levelGenerator, writer); // we have one contour at 7 and 12 // and two borders: one, at 7 and the second at >7 (12) ensure_equals( "We have 2 borders", writer.borders.size(), size_t(2) ); ensure_equals( "We have 2 contours", writer.contours.size(), size_t(2) ); ensure( "Border at 0", writer.borders.find(0) != writer.borders.end() ); ensure( "Border at 1", writer.borders.find(1) != writer.borders.end() ); ensure( "No contour at 0", writer.contours.find(0) != writer.contours.end() ); // and we have one contour and 2 borders ensure_equals( "1 contour at 0", writer.contours[0].size(), size_t(1) ); ensure_equals( "1 border at 0", writer.borders[0].size(), size_t(1) ); ensure_equals( "1 border at 1", writer.borders[1].size(), size_t(1) ); // the border at 7.0 is around 0.5, 0.5 ensure( "Border at 1 is around 0.5, 0.5", (writer.borders[0][0].first.x == 0.5 && writer.borders[0][0].first.y == 0.5) || (writer.borders[0][0].second.x == 0.5 && writer.borders[0][0].second.y == 0.5) ); // the border at 12.0 is around 0, 0.5 ensure( "Border at 1 is around 0, 0.5", (writer.borders[1][0].first.x == 0.0 && writer.borders[1][0].first.y == 0.5) || (writer.borders[1][0].second.x == 0.0 && writer.borders[1][0].second.y == 0.5) ); } // test with a fixed set of levels { Writer writer; std::vector levels = {7.0}; FixedLevelRangeIterator levelGenerator(&levels[0], 1); ul.process(levelGenerator, writer); // we have one contour at 7 and 12 // and two borders: one, at 7 and the second at >7 (12) ensure_equals( "We have 2 borders", writer.borders.size(), size_t(2) ); ensure_equals( "We have 2 contours", writer.contours.size(), size_t(2) ); ensure( "Border at 0", writer.borders.find(0) != writer.borders.end() ); ensure( "Border at 1", writer.borders.find(1) != writer.borders.end() ); ensure( "No contour at 0", writer.contours.find(0) != writer.contours.end() ); // and we have one contour and 2 borders ensure_equals( "1 contour at 0", writer.contours[0].size(), size_t(1) ); ensure_equals( "1 border at 0", writer.borders[0].size(), size_t(1) ); ensure_equals( "1 border at 1", writer.borders[1].size(), size_t(1) ); // the border at 7.0 is around 0.5, 0.5 ensure( "Border at 1 is around 0.5, 0.5", (writer.borders[0][0].first.x == 0.5 && writer.borders[0][0].first.y == 0.5) || (writer.borders[0][0].second.x == 0.5 && writer.borders[0][0].second.y == 0.5) ); // the border at 12.0 is around 0, 0.5 ensure( "Border at 1 is around 0, 0.5", (writer.borders[1][0].first.x == 0.0 && writer.borders[1][0].first.y == 0.5) || (writer.borders[1][0].second.x == 0.0 && writer.borders[1][0].second.y == 0.5) ); } } template <> template <> void object::test<12>() { // Test level value below square values Square square( ValuedPoint(0,0,10), ValuedPoint(1,0,5), ValuedPoint(0,1,8), ValuedPoint(1,1,4)); // level value = 2 // 10 5 // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // 8 4 { Writer writer; std::vector levels = {2.0}; FixedLevelRangeIterator levelGenerator(&levels[0], 1); square.process(levelGenerator, writer); ensure( (writer.borders.size() == 0) ); ensure( (writer.contours.size() == 0) ); } } template <> template <> void object::test<13>() { // Full border test 1 Square square( ValuedPoint(-0.5,-0.5,NaN), ValuedPoint(0.5,-0.5,NaN), ValuedPoint(-0.5,0.5,NaN), ValuedPoint(0.5,0.5,5)); // level value = 0, 10 // NaN NaN // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // NaN 5 { Writer writer; IntervalLevelRangeIterator levelGenerator( 0, 10.0 ); square.process(levelGenerator, writer); ensure( (writer.borders.size() == 1) ); ensure( (writer.borders[1].size() == 2) ); ensure( ((writer.borders[1][0].first.x == 0.0 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.0 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][0].first.x == 0.5 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.5 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.5)) ); } } template <> template <> void object::test<14>() { // Full border test 2 Square square( ValuedPoint(-0.5,-0.5,NaN), ValuedPoint(0.5,-0.5,NaN), ValuedPoint(-0.5,0.5,NaN), ValuedPoint(0.5,0.5,5)); // level value = 5.0, 10.0 // NaN NaN // +------------------+ // | | // | | // | | // | | // | | // | | // | | // +------------------+ // NaN 5 { Writer writer; IntervalLevelRangeIterator levelGenerator( 5.0, 5.0 ); square.process(levelGenerator, writer); ensure( (writer.borders.size() == 1) ); ensure( (writer.borders[1].size() == 2) ); ensure( ((writer.borders[1][0].first.x == 0.0 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.0 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][0].first.x == 0.5 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.5 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.5)) ); } { Writer writer; std::vector levels = { 5.0 }; FixedLevelRangeIterator levelGenerator( &levels[0], 1 ); square.process(levelGenerator, writer); ensure( (writer.borders.size() == 1) ); ensure( (writer.borders[1].size() == 2) ); ensure( ((writer.borders[1][0].first.x == 0.0 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.0 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][0].first.x == 0.5 && writer.borders[1][0].first.y == 0.0) || (writer.borders[1][0].second.x == 0.5 && writer.borders[1][0].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.0)) ); ensure( ((writer.borders[1][1].first.x == 0.0 && writer.borders[1][1].first.y == 0.0) || (writer.borders[1][1].second.x == 0.0 && writer.borders[1][1].second.y == 0.5)) ); } } } gdalautotest-3.0.4/cpp/testdestroy.cpp0000644003401500001440000000367513614005366017526 0ustar rouaultusers/****************************************************************************** * $Id: testdestroy.cpp 6a7463b907aae6a854d4ee8f311c3a19b4ab43e6 2017-04-21 13:24:57Z Mateusz Loskot $ * * Project: GDAL Core * Purpose: Test GDALCopyWords(). * 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. ****************************************************************************/ #include "gdal.h" int main() { GDALAllRegister(); /* See corresponding bug reports: */ /* https://trac.osgeo.org/gdal/ticket/6139 */ /* https://trac.osgeo.org/gdal/ticket/6868 */ CPLError(CE_None, CPLE_AppDefined, "Expected, CPLError called to trigger hErrorMutex allocation"); GDALDestroy(); return 0; } gdalautotest-3.0.4/cpp/test_data.h0000644003401500001440000000343613614005366016545 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Locate test data for test suite // Author: Hiroshi Miura // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2017, Hiroshi Miura // // 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. /////////////////////////////////////////////////////////////////////////////// #ifndef GDAL_TEST_DATA_H #define GDAL_TEST_DATA_H // Use GDAL_TEST_ROOT_DIR for the root directory of test project's source #ifdef GDAL_TEST_ROOT_DIR #ifndef SEP #if defined(WIN32) #define SEP "\\" #else #define SEP "/" #endif #endif #define GCORE_DATA_DIR GDAL_TEST_ROOT_DIR SEP "gcore" SEP "data" SEP #define GDRIVERS_DIR GDAL_TEST_ROOT_DIR SEP "gdrivers" SEP #define TUT_ROOT_DATA_DIR GDAL_TEST_ROOT_DIR SEP "cpp" SEP "data" #define TUT_ROOT_TMP_DIR GDAL_TEST_ROOT_DIR SEP "cpp" SEP "tmp" #else #define GCORE_DATA_DIR "../gcore/data/" #define GDRIVERS_DIR "../gdrivers/" #define TUT_ROOT_DATA_DIR "data" #define TUT_ROOT_TMP_DIR "tmp" #endif #endif //GDAL_TEST_DATA_H gdalautotest-3.0.4/cpp/testblockcachelimits.cpp0000644003401500001440000001345613614005366021333 0ustar rouaultusers/****************************************************************************** * $Id: testblockcachelimits.cpp fea98cfa8bed15686abed8256ef1566f68e1568d 2017-12-28 17:57:32Z Even Rouault $ * * Project: GDAL Core * Purpose: Test block cache under multi-threading * 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. ****************************************************************************/ #include "cpl_conv.h" #include "cpl_multiproc.h" #include "cpl_string.h" #include "gdal_priv.h" #include "gdal.h" #include #include "test_data.h" static void thread_func(void* /* unused */) { printf("begin thread %p\n", (void*)CPLGetPID()); CPLSetThreadLocalConfigOption("GDAL_RB_INTERNALIZE_SLEEP_AFTER_DROP_LOCK", "0.6"); GDALDatasetH hDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); char buf[20*20]; CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); CPLSetThreadLocalConfigOption("GDAL_RB_INTERNALIZE_SLEEP_AFTER_DROP_LOCK", "0"); GDALClose(hDS); printf("end of thread\n\n"); } static void thread_func2(void* /* unused */) { printf("begin thread %p\n", (void*)CPLGetPID()); CPLSetThreadLocalConfigOption("GDAL_RB_FLUSHBLOCK_SLEEP_AFTER_DROP_LOCK", "0.6"); GDALFlushCacheBlock(); CPLSetThreadLocalConfigOption("GDAL_RB_FLUSHBLOCK_SLEEP_AFTER_DROP_LOCK", "0"); printf("end of thread\n\n"); } static void thread_func3(void* /* unused */) { printf("begin thread %p\n", (void*)CPLGetPID()); CPLSleep(0.3); printf("begin GDALFlushCacheBlock\n"); GDALFlushCacheBlock(); printf("end of thread\n\n"); } static void thread_func4(void* /* unused */) { printf("begin thread %p\n", (void*)CPLGetPID()); CPLSetThreadLocalConfigOption("GDAL_RB_FLUSHBLOCK_SLEEP_AFTER_RB_LOCK", "0.6"); GDALFlushCacheBlock(); CPLSetThreadLocalConfigOption("GDAL_RB_FLUSHBLOCK_SLEEP_AFTER_RB_LOCK", "0"); printf("end of thread\n\n"); } int main(int argc, char* argv[]) { CPLJoinableThread* hThread; printf("main thread %p\n", (void*)CPLGetPID()); argc = GDALGeneralCmdLineProcessor( argc, &argv, 0 ); CPLSetConfigOption("GDAL_CACHEMAX", "0"); CPLSetConfigOption("GDAL_DEBUG_BLOCK_CACHE", "ON"); GDALAllRegister(); GDALDatasetH hDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); char buf[20*20]; printf("cache fill\n"); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); printf("end of cache fill\n"); printf("buf[0]=%d\n\n", (int)buf[0]); hThread = CPLCreateJoinableThread(thread_func, nullptr); CPLSleep(0.3); printf("re read block\n"); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); printf("end of re read block\n"); printf("buf[0]=%d\n", (int)buf[0]); CPLJoinThread(hThread); hThread = CPLCreateJoinableThread(thread_func2, nullptr); CPLSleep(0.3); printf("re read block\n"); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); printf("end of re read block\n"); printf("buf[0]=%d\n", (int)buf[0]); CPLJoinThread(hThread); hThread = CPLCreateJoinableThread(thread_func3, nullptr); printf("re read block\n"); CPLSetThreadLocalConfigOption("GDAL_RB_TRYGET_SLEEP_AFTER_TAKE_LOCK", "0.6"); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); CPLSetThreadLocalConfigOption("GDAL_RB_TRYGET_SLEEP_AFTER_TAKE_LOCK", "0"); printf("end of re read block\n"); printf("buf[0]=%d\n", (int)buf[0]); CPLJoinThread(hThread); hThread = CPLCreateJoinableThread(thread_func2, nullptr); CPLSleep(0.3); printf("before GDALFlushRasterCache\n"); GDALFlushRasterCache(GDALGetRasterBand(hDS, 1)); printf("after GDALFlushRasterCache\n"); CPLJoinThread(hThread); assert( GDALGetCacheUsed64() == 0 ); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); hThread = CPLCreateJoinableThread(thread_func2, nullptr); CPLSleep(0.3); GDALClose(hDS); CPLJoinThread(hThread); hDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(hDS, 1), GF_Read, 0, 0, 20, 20, buf, 20, 20, GDT_Byte, 0, 0)); hThread = CPLCreateJoinableThread(thread_func4, nullptr); CPLSleep(0.3); GDALClose(hDS); CPLJoinThread(hThread); GDALDestroyDriverManager(); CSLDestroy( argv ); return 0; } gdalautotest-3.0.4/cpp/testperfcopywords.cpp0000644003401500001440000001043613614005366020734 0ustar rouaultusers/****************************************************************************** * $Id: testperfcopywords.cpp 7e07230bbff24eb333608de4dbd460b7312839d0 2017-12-11 19:08:47Z Even Rouault $ * * Project: GDAL Core * Purpose: Test performance of GDALCopyWords(). * 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. ****************************************************************************/ #include "gdal.h" #include "cpl_conv.h" #include #include #include int main(int /* argc */, char* /* argv */ []) { void* in = calloc(1, 256 * 256 * 16); void* out = malloc(256 * 256 * 16); int i; int intype, outtype; clock_t start, end; for(intype=GDT_Byte; intype<=GDT_CFloat64;intype++) { for(outtype=GDT_Byte;outtype<=GDT_CFloat64;outtype++) { start = clock(); for(i=0;i<1000;i++) GDALCopyWords(in, (GDALDataType)intype, 16, out, (GDALDataType)outtype, 16, 256 * 256); end = clock(); printf("%s -> %s : %.2f s\n", GDALGetDataTypeName((GDALDataType)intype), GDALGetDataTypeName((GDALDataType)outtype), (end - start) * 1.0 / CLOCKS_PER_SEC); start = clock(); for(i=0;i<1000;i++) GDALCopyWords(in, (GDALDataType)intype, GDALGetDataTypeSize((GDALDataType)intype) / 8, out, (GDALDataType)outtype, GDALGetDataTypeSize((GDALDataType)outtype) / 8, 256 * 256); end = clock(); printf("%s -> %s (packed) : %.2f s\n", GDALGetDataTypeName((GDALDataType)intype), GDALGetDataTypeName((GDALDataType)outtype), (end - start) * 1.0 / CLOCKS_PER_SEC); } } for(int k=0;k<2;k++) { if( k == 1 ) { printf("Disabling SSSE3\n"); CPLSetConfigOption("GDAL_USE_SSSE3", "NO"); } // 2 byte stride --> packed byte start = clock(); for(i=0;i<100000;i++) GDALCopyWords(in, GDT_Byte, 2, out, GDT_Byte, 1, 256 * 256); end = clock(); printf("2-byte stride Byte ->packed Byte : %.2f\n", (end - start) * 1.0 / CLOCKS_PER_SEC); // 3 byte stride --> packed byte start = clock(); for(i=0;i<100000;i++) GDALCopyWords(in, GDT_Byte, 3, out, GDT_Byte, 1, 256 * 256); end = clock(); printf("3-byte stride Byte ->packed Byte : %.2f\n", (end - start) * 1.0 / CLOCKS_PER_SEC); // 4 byte stride --> packed byte start = clock(); for(i=0;i<100000;i++) GDALCopyWords(in, GDT_Byte, 4, out, GDT_Byte, 1, 256 * 256); end = clock(); printf("4-byte stride Byte ->packed Byte : %.2f\n", (end - start) * 1.0 / CLOCKS_PER_SEC); } CPLSetConfigOption("GDAL_USE_SSSE3", nullptr); return 0; } gdalautotest-3.0.4/cpp/testmultithreadedwriting.cpp0000644003401500001440000000733613614005366022272 0ustar rouaultusers/****************************************************************************** * Project: GDAL Core * Purpose: Test block cache & writing behaviour under multi-threading * 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. ****************************************************************************/ #include "cpl_multiproc.h" #include "gdal_alg.h" #include "gdal_priv.h" static void thread_func(void* ptr) { int num = *(int*)ptr; GDALDriver* poDriver = (GDALDriver*)GDALGetDriverByName("ENVI"); GDALDataset* poDSRef = (GDALDataset*)GDALOpen("/vsimem/test_ref", GA_ReadOnly); GDALDataset* poDS = poDriver->Create(CPLSPrintf("/vsimem/test%d", num), 100, 2000, 1, GDT_Byte, nullptr); GDALRasterBand* poBand = poDS->GetRasterBand(1); GDALRasterBand* poBandRef = poDSRef->GetRasterBand(1); for(int i=0; i<2000; i++) { GDALRasterBlock* poBlockRef = poBandRef->GetLockedBlockRef(0, i); GDALRasterBlock* poBlockRW = poBand->GetLockedBlockRef(0, i); poBlockRW->MarkDirty(); memset(poBlockRW->GetDataRef(), 0xFF, 100); poBlockRef->DropLock(); poBlockRW->DropLock(); } GDALClose(poDS); GDALClose(poDSRef); } int main(int argc, char** argv) { bool bEndlessLoop = false; if( argc == 2 && EQUAL(argv[1], "-endlessloops") ) bEndlessLoop = true; CPLJoinableThread* hThread1; CPLJoinableThread* hThread2; GDALAllRegister(); GDALSetCacheMax(10000); int one = 1; int two = 2; GDALDriver* poDriver = (GDALDriver*)GDALGetDriverByName("ENVI"); GDALDataset* poDS = poDriver->Create("/vsimem/test_ref", 100, 2000, 1, GDT_Byte, nullptr); GDALClose(poDS); int counter = 0; int cs = 0; do { ++counter; if( (counter % 20) == 0 ) printf("%d\n", counter); hThread1 = CPLCreateJoinableThread(thread_func, &one); hThread2 = CPLCreateJoinableThread(thread_func, &two); CPLJoinThread(hThread1); CPLJoinThread(hThread2); GDALDataset* poDSRef = (GDALDataset*)GDALOpen("/vsimem/test1", GA_ReadOnly); cs = GDALChecksumImage(poDSRef->GetRasterBand(1), 0, 0, 100, 2000); if( cs != 29689 ) { printf("Got cs=%d, expected=%d\n", cs, 29689); break; } GDALClose(poDSRef); poDriver->Delete("/vsimem/test1"); poDriver->Delete("/vsimem/test2"); } while( bEndlessLoop ); poDriver->Delete("/vsimem/test_ref"); GDALDestroyDriverManager(); return (cs == 29689) ? 0 : 1; } gdalautotest-3.0.4/cpp/test_gdal_gtiff.cpp0000644003401500001440000002161213614005366020251 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test read/write functionality for GeoTIFF format. // Ported from gcore/tiff_read.py, gcore/tiff_write.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_string.h" #include "gdal_alg.h" #include "gdal_priv.h" #include "gdal.h" #include #include #include namespace tut { // Common fixture with test data struct test_gtiff_data { struct raster_t { std::string file_; int band_; int checksum_; raster_t(std::string const& f, int b, int c) : file_(f), band_(b), checksum_(c) {} }; typedef std::vector rasters_t; GDALDriverH drv_; std::string drv_name_; std::string data_; std::string data_tmp_; rasters_t rasters_; test_gtiff_data() : drv_(nullptr), drv_name_("GTiff") { drv_ = GDALGetDriverByName(drv_name_.c_str()); // Compose data path for test group data_ = tut::common::data_basedir; data_tmp_ = tut::common::tmp_basedir; // Collection of test GeoTIFF rasters rasters_.push_back(raster_t("byte.tif", 1, 4672)); rasters_.push_back(raster_t("int16.tif", 1, 4672)); rasters_.push_back(raster_t("uint16.tif", 1, 4672)); rasters_.push_back(raster_t("int32.tif", 1, 4672)); rasters_.push_back(raster_t("uint32.tif", 1, 4672)); rasters_.push_back(raster_t("float32.tif", 1, 4672)); rasters_.push_back(raster_t("float64.tif", 1, 4672)); rasters_.push_back(raster_t("cint16.tif", 1, 5028)); rasters_.push_back(raster_t("cint32.tif", 1, 5028)); rasters_.push_back(raster_t("cfloat32.tif", 1, 5028)); rasters_.push_back(raster_t("cfloat64.tif", 1, 5028)); rasters_.push_back(raster_t("utmsmall.tif", 1, 50054)); } }; // Register test group typedef test_group group; typedef group::object object; group test_gtiff_group("GDAL::GTiff"); // Test driver availability template<> template<> void object::test<1>() { ensure("GDAL::GTiff driver not available", nullptr != drv_); } // Test open dataset template<> template<> void object::test<2>() { rasters_t::const_iterator it; for (it = rasters_.begin(); it != rasters_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALClose(ds); } } // Test dataset checksums template<> template<> void object::test<3>() { rasters_t::const_iterator it; for (it = rasters_.begin(); it != rasters_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, it->band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(ds); const int ysize = GDALGetRasterYSize(ds); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << file << "' not equal"; ensure_equals(os.str().c_str(), it->checksum_, checksum); GDALClose(ds); } } // Test GeoTIFF driver metadata template<> template<> void object::test<4>() { const char* mdItem = GDALGetMetadataItem(drv_, "DMD_MIMETYPE", nullptr); ensure("Can't fetch metadata", nullptr != mdItem); ensure_equals("Invalid MIME type", std::string(mdItem), std::string("image/tiff")); } // Create a simple file by copying from an existing one template<> template<> void object::test<5>() { // Index of test file being copied const std::size_t fileIdx = 10; std::string src(data_ + SEP); src += rasters_.at(fileIdx).file_; GDALDatasetH dsSrc = GDALOpen(src.c_str(), GA_ReadOnly); ensure("Can't open source dataset: " + src, nullptr != dsSrc); std::string dst(data_tmp_ + "\\test_2.tif"); GDALDatasetH dsDst = nullptr; dsDst = GDALCreateCopy(drv_, dst.c_str(), dsSrc, FALSE, nullptr, nullptr, nullptr); ensure("Can't copy dataset", nullptr != dsDst); GDALClose(dsDst); GDALClose(dsSrc); // Re-open copied dataset and test it dsDst = GDALOpen(dst.c_str(), GA_ReadOnly); GDALRasterBandH band = GDALGetRasterBand(dsDst, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(dsDst); const int ysize = GDALGetRasterYSize(dsDst); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << dst << "' not equal"; ensure_equals(os.str().c_str(), rasters_.at(fileIdx).checksum_, checksum); GDALClose(dsDst); GDALDeleteDataset(drv_, dst.c_str()); } // Create a simple file by copying from an existing one using creation options template<> template<> void object::test<6>() { // Index of test file being copied const std::size_t fileIdx = 11; std::string src(data_ + SEP); src += rasters_.at(fileIdx).file_; GDALDatasetH dsSrc = GDALOpen(src.c_str(), GA_ReadOnly); ensure("Can't open source dataset: " + src, nullptr != dsSrc); std::string dst(data_tmp_ + "\\test_3.tif"); char** options = nullptr; options = CSLSetNameValue(options, "TILED", "YES"); options = CSLSetNameValue(options, "BLOCKXSIZE", "32"); options = CSLSetNameValue(options, "BLOCKYSIZE", "32"); GDALDatasetH dsDst = nullptr; dsDst = GDALCreateCopy(drv_, dst.c_str(), dsSrc, FALSE, options, nullptr, nullptr); ensure("Can't copy dataset", nullptr != dsDst); GDALClose(dsDst); CSLDestroy(options); GDALClose(dsSrc); // Re-open copied dataset and test it dsDst = GDALOpen(dst.c_str(), GA_ReadOnly); GDALRasterBandH band = GDALGetRasterBand(dsDst, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(dsDst); const int ysize = GDALGetRasterYSize(dsDst); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << dst << "' not equal"; ensure_equals(os.str().c_str(), rasters_.at(fileIdx).checksum_, checksum); GDALClose(dsDst); GDALDeleteDataset(drv_, dst.c_str()); } // Test raster min/max calculation template<> template<> void object::test<7>() { // Index of test file being copied const std::size_t fileIdx = 10; std::string src(data_ + SEP); src += rasters_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(src.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + src, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); double expect[2] = { 74.0, 255.0 }; double minmax[2] = { 0 }; GDALComputeRasterMinMax(band, TRUE, minmax); ensure_equals("Computed wrong min", expect[0], minmax[0]); ensure_equals("Computed wrong max", expect[1], minmax[1]); GDALClose(ds); } } // namespace tut gdalautotest-3.0.4/cpp/test_triangulation.cpp0000644003401500001440000001663313614005366021052 0ustar rouaultusers/****************************************************************************** * $Id: test_triangulation.cpp 1440b062c833f145f89b3dc8c2474f674a8ca3af 2018-10-06 19:20:28 +0200 Even Rouault $ * * Project: GDAL algorithms * Purpose: Test Delaunay triangulation * Author: Even Rouault, even.rouault at spatialys.com * ****************************************************************************** * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "gdal_alg.h" namespace tut { // Common fixture with test data struct test_triangulation_data { GDALTriangulation* psDT; test_triangulation_data() : psDT(nullptr) {} ~test_triangulation_data() { GDALTriangulationFree(psDT); } }; // Register test group typedef test_group group; typedef group::object object; group test_triangulation_group("Triangulation"); template<> template<> void object::test<1>() { if( GDALHasTriangulation() ) { double adfX[] = { 0, -5, -5, 5, 5 }; double adfY[] = { 0, -5, 5, -5, 5 }; CPLPushErrorHandler(CPLQuietErrorHandler); psDT = GDALTriangulationCreateDelaunay(2, adfX, adfY); CPLPopErrorHandler(); ensure(psDT == nullptr); } } template<> template<> void object::test<2>() { if( GDALHasTriangulation() ) { double adfX[] = { 0, 1, 2, 3 }; double adfY[] = { 0, 1, 2, 3 }; CPLPushErrorHandler(CPLQuietErrorHandler); psDT = GDALTriangulationCreateDelaunay(4, adfX, adfY); CPLPopErrorHandler(); ensure(psDT == nullptr); } } template<> template<> void object::test<3>() { if( GDALHasTriangulation() ) { { double adfX[] = { 0, -5, -5, 5, 5 }; double adfY[] = { 0, -5, 5, -5, 5 }; int i, j; psDT = GDALTriangulationCreateDelaunay(5, adfX, adfY); ensure(psDT != nullptr); ensure_equals(psDT->nFacets, 4); for(i=0;inFacets;i++) { for(j=0;j<3;j++) { ensure(psDT->pasFacets[i].anVertexIdx[j] >= 0); ensure(psDT->pasFacets[i].anVertexIdx[j] <= 4); ensure(psDT->pasFacets[i].anNeighborIdx[j] >= -1); ensure(psDT->pasFacets[i].anNeighborIdx[j] <= 4); } } int face; CPLPushErrorHandler(CPLQuietErrorHandler); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 0, 0, 0, &face), FALSE); ensure_equals(GDALTriangulationFindFacetBruteForce(psDT, 0, 0, &face), FALSE); double l1, l2, l3; ensure_equals(GDALTriangulationComputeBarycentricCoordinates(psDT, 0, 0, 0, &l1, &l2, &l3), FALSE); CPLPopErrorHandler(); ensure_equals(GDALTriangulationComputeBarycentricCoefficients(psDT, adfX, adfY) , TRUE); ensure_equals(GDALTriangulationComputeBarycentricCoefficients(psDT, adfX, adfY) , TRUE); } // Points inside { double adfX[] = { 0.1, 0.9, 0.499, -0.9 }; double adfY[] = { 0.9, 0.1, -0.5, 0.1 }; for(int i=0;i<4;i++) { double x = adfX[i]; double y = adfY[i]; int new_face; int face; ensure_equals(GDALTriangulationFindFacetDirected(psDT, 0, x, y, &face), TRUE); ensure(face >= 0 && face < 4); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 1, x, y, &new_face), TRUE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 2, x, y, &new_face), TRUE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 3, x, y, &new_face), TRUE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetBruteForce(psDT, x, y, &new_face), TRUE); ensure_equals(face, new_face); double l1, l2, l3; GDALTriangulationComputeBarycentricCoordinates(psDT, face, x, y, &l1, &l2, &l3); ensure(l1 >= 0 && l1 <= 1); ensure(l2 >= 0 && l2 <= 1); ensure(l3 >= 0 && l3 <= 1); ensure_equals("",l3, 1.0 -l1 - l2,1e-10); } } // Points outside { double adfX[] = { 0, 10, 0, -10 }; double adfY[] = { 10, 0, -10, 0 }; for(int i=0;i<4;i++) { double x = adfX[i]; double y = adfY[i]; int new_face; int face; ensure_equals(GDALTriangulationFindFacetDirected(psDT, 0, x, y, &face), FALSE); ensure(face < 0 || (face >= 0 && face < 4)); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 1, x, y, &new_face), FALSE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 2, x, y, &new_face), FALSE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetDirected(psDT, 3, x, y, &new_face), FALSE); ensure_equals(face, new_face); ensure_equals(GDALTriangulationFindFacetBruteForce(psDT, x, y, &new_face), FALSE); ensure_equals(face, new_face); double l1, l2, l3; if( face < 0 ) face = 0; GDALTriangulationComputeBarycentricCoordinates(psDT, face, x, y, &l1, &l2, &l3); ensure("outside", !((l1 >= 0 && l1 <= 1) && (l2 >= 0 && l2 <= 1) && (l3 >= 0 && l3 <= 1))); ensure_equals("",l3, 1.0 -l1 - l2,1e-10); } } } } } // namespace tut gdalautotest-3.0.4/cpp/test_alg.cpp0000644003401500001440000002564213614005366016735 0ustar rouaultusers/****************************************************************************** * $Id: test_alg.cpp 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ * * Project: GDAL algorithms * Purpose: Test alg * Author: Even Rouault, even.rouault at spatialys.com * ****************************************************************************** * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "cpl_conv.h" #include "gdal_alg.h" #include "gdalwarper.h" #include "gdal_priv.h" namespace tut { // Common fixture with test data struct test_alg_data { }; // Register test group typedef test_group group; typedef group::object object; group test_alg_group("ALG"); typedef struct { double dfLevel; int nPoints; double x; double y; } writeCbkData; static CPLErr writeCbk( double dfLevel, int nPoints, double *padfX, double *padfY, void * userData ) { writeCbkData* data = (writeCbkData*)userData; data->dfLevel = dfLevel; data->nPoints = nPoints; if( nPoints == 1 ) { data->x = padfX[0]; data->y = padfY[0]; } return CE_None; } // Dummy test template<> template<> void object::test<1>() { writeCbkData data; memset(&data, 0, sizeof(data)); GDALContourGeneratorH hCG = GDAL_CG_Create(1,1,FALSE,0,1,0, writeCbk, &data); double scanline[] = { 0 }; ensure_equals(GDAL_CG_FeedLine(hCG, scanline), CE_None); ensure_equals(data.dfLevel, 0); ensure_equals(data.nPoints, 0); ensure_approx_equals(data.x, 0.0); ensure_approx_equals(data.y, 0.0); GDAL_CG_Destroy(hCG); } // GDALWarpResolveWorkingDataType: default type template<> template<> void object::test<2>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); GDALDestroyWarpOptions(psOptions); } // GDALWarpResolveWorkingDataType: do not change user specified type template<> template<> void object::test<3>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->eWorkingDataType = GDT_CFloat64; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_CFloat64 ); GDALDestroyWarpOptions(psOptions); } // GDALWarpResolveWorkingDataType: effect of padfSrcNoDataReal template<> template<> void object::test<4>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->nBandCount = 1; psOptions->padfSrcNoDataReal = static_cast(CPLMalloc(sizeof(double))); psOptions->padfSrcNoDataReal[0] = 0.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = -1.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Int16 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 2.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 256.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_UInt16 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 2.5; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Float32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 2.12345678; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Float64 ); GDALDestroyWarpOptions(psOptions); } // GDALWarpResolveWorkingDataType: effect of padfSrcNoDataImag template<> template<> void object::test<5>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->nBandCount = 1; psOptions->padfSrcNoDataReal = static_cast(CPLMalloc(sizeof(double))); psOptions->padfSrcNoDataImag = static_cast(CPLMalloc(sizeof(double))); psOptions->padfSrcNoDataReal[0] = 0.0; psOptions->padfSrcNoDataImag[0] = 0.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 0.0; psOptions->padfSrcNoDataImag[0] = 1.0; GDALWarpResolveWorkingDataType(psOptions); // Could probably be CInt16 ensure_equals( psOptions->eWorkingDataType, GDT_CInt32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 0.0; psOptions->padfSrcNoDataImag[0] = 1.5; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_CFloat32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfSrcNoDataReal[0] = 0.0; psOptions->padfSrcNoDataImag[0] = 2.12345678; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_CFloat64 ); GDALDestroyWarpOptions(psOptions); } // GDALWarpResolveWorkingDataType: effect of padfDstNoDataReal template<> template<> void object::test<6>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->nBandCount = 1; psOptions->padfDstNoDataReal = static_cast(CPLMalloc(sizeof(double))); psOptions->padfDstNoDataReal[0] = 0.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = -1.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Int16 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = 2.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = 256.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_UInt16 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = 2.5; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Float32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = 2.12345678; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Float64 ); GDALDestroyWarpOptions(psOptions); } // GDALWarpResolveWorkingDataType: effect of padfDstNoDataImag template<> template<> void object::test<7>() { GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->nBandCount = 1; psOptions->padfDstNoDataReal = static_cast(CPLMalloc(sizeof(double))); psOptions->padfDstNoDataImag = static_cast(CPLMalloc(sizeof(double))); psOptions->padfDstNoDataReal[0] = 0.0; psOptions->padfDstNoDataImag[0] = 0.0; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_Byte ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataReal[0] = 0.0; psOptions->padfDstNoDataImag[0] = 1.0; GDALWarpResolveWorkingDataType(psOptions); // Could probably be CInt16 ensure_equals( psOptions->eWorkingDataType, GDT_CInt32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataImag[0] = 0.0; psOptions->padfDstNoDataImag[0] = 1.5; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_CFloat32 ); psOptions->eWorkingDataType = GDT_Unknown; psOptions->padfDstNoDataImag[0] = 0.0; psOptions->padfDstNoDataImag[0] = 2.12345678; GDALWarpResolveWorkingDataType(psOptions); ensure_equals( psOptions->eWorkingDataType, GDT_CFloat64 ); GDALDestroyWarpOptions(psOptions); } // Test GDALAutoCreateWarpedVRT() with creatino of an alpha band template<> template<> void object::test<8>() { GDALDatasetUniquePtr poDS( GDALDriver::FromHandle( GDALGetDriverByName("MEM"))->Create("", 1, 1, 1, GDT_Byte, nullptr)); poDS->SetProjection( SRS_WKT_WGS84_LAT_LONG ); double adfGeoTransform[6] = { 10, 1, 0, 20, 0, -1 }; poDS->SetGeoTransform(adfGeoTransform); GDALWarpOptions* psOptions = GDALCreateWarpOptions(); psOptions->nDstAlphaBand = 2; GDALDatasetH hWarpedVRT = GDALAutoCreateWarpedVRT(GDALDataset::ToHandle(poDS.get()), nullptr, nullptr, GRA_NearestNeighbour, 0.0, psOptions); ensure( hWarpedVRT != nullptr ); ensure_equals( GDALGetRasterCount(hWarpedVRT), 2 ); ensure_equals( GDALGetRasterColorInterpretation( GDALGetRasterBand(hWarpedVRT, 2)), GCI_AlphaBand ); GDALDestroyWarpOptions(psOptions); GDALClose(hWarpedVRT); } } // namespace tut gdalautotest-3.0.4/cpp/test_gdal.cpp0000644003401500001440000007704213614005366017102 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test general GDAL features. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "gdal_priv.h" #include "gdal_utils.h" #include "gdal_priv_templates.hpp" #include "gdal.h" #include #include #include "test_data.h" namespace tut { // Common fixture with test data struct test_gdal_data { // Expected number of drivers int drv_count_; test_gdal_data() : drv_count_(0) { // Windows CE port builds with fixed number of drivers #ifdef FRMT_aaigrid drv_count_++; #endif #ifdef FRMT_dted drv_count_++; #endif #ifdef FRMT_gtiff drv_count_++; #endif } }; // Register test group typedef test_group group; typedef group::object object; group test_gdal_group("GDAL"); // Test GDAL driver manager access template<> template<> void object::test<1>() { GDALDriverManager* drv_mgr = nullptr; drv_mgr = GetGDALDriverManager(); ensure("GetGDALDriverManager() is NULL", nullptr != drv_mgr); } // Test number of registered GDAL drivers template<> template<> void object::test<2>() { #ifdef WIN32CE ensure_equals("GDAL registered drivers count doesn't match", GDALGetDriverCount(), drv_count_); #endif } // Test if AAIGrid driver is registered template<> template<> void object::test<3>() { GDALDriverH drv = GDALGetDriverByName("AAIGrid"); #ifdef FRMT_aaigrid ensure("AAIGrid driver is not registered", NULL != drv); #else (void)drv; ensure(true); // Skip #endif } // Test if DTED driver is registered template<> template<> void object::test<4>() { GDALDriverH drv = GDALGetDriverByName("DTED"); #ifdef FRMT_dted ensure("DTED driver is not registered", NULL != drv); #else (void)drv; ensure(true); // Skip #endif } // Test if GeoTIFF driver is registered template<> template<> void object::test<5>() { GDALDriverH drv = GDALGetDriverByName("GTiff"); #ifdef FRMT_gtiff ensure("GTiff driver is not registered", NULL != drv); #else (void)drv; ensure(true); // Skip #endif } #define ENSURE(cond) ensure(#cond, (cond)) #define ENSURE_EQUALS(a, b) ensure_equals(#a " == " #b, (a), (b)) // Test GDALDataTypeUnion() template<> template<> void object::test<6>() { for(int i=GDT_Byte;i(i); GDALDataType eDT2 = static_cast(j); GDALDataType eDT = GDALDataTypeUnion(eDT1,eDT2 ); ENSURE( eDT == GDALDataTypeUnion(eDT2,eDT1) ); ENSURE( GDALGetDataTypeSize(eDT) >= GDALGetDataTypeSize(eDT1) ); ENSURE( GDALGetDataTypeSize(eDT) >= GDALGetDataTypeSize(eDT2) ); ENSURE( (GDALDataTypeIsComplex(eDT) && (GDALDataTypeIsComplex(eDT1) || GDALDataTypeIsComplex(eDT2))) || (!GDALDataTypeIsComplex(eDT) && !GDALDataTypeIsComplex(eDT1) && !GDALDataTypeIsComplex(eDT2)) ); ENSURE( !(GDALDataTypeIsFloating(eDT1) || GDALDataTypeIsFloating(eDT2)) || GDALDataTypeIsFloating(eDT)); ENSURE( !(GDALDataTypeIsSigned(eDT1) || GDALDataTypeIsSigned(eDT2)) || GDALDataTypeIsSigned(eDT)); } } ENSURE_EQUALS(GDALDataTypeUnion(GDT_Int16, GDT_UInt16), GDT_Int32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_Int16, GDT_UInt32), GDT_Float64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_UInt32, GDT_Int16), GDT_Float64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_UInt32, GDT_CInt16), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_Float32, GDT_CInt32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt16, GDT_UInt32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt16, GDT_CFloat32), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_Byte), GDT_CInt32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_UInt16), GDT_CInt32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_Int16), GDT_CInt32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_UInt32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_Int32), GDT_CInt32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_Float32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_CInt16), GDT_CInt32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CInt32, GDT_CFloat32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_Byte), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_UInt16), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_Int16), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_UInt32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_Int32), GDT_CFloat64); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_Float32), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_CInt16), GDT_CFloat32); ENSURE_EQUALS(GDALDataTypeUnion(GDT_CFloat32, GDT_CInt32), GDT_CFloat64); } #undef ENSURE #undef ENSURE_EQUALS // Test GDALAdjustValueToDataType() template<> template<> void object::test<7>() { int bClamped, bRounded; ensure( GDALAdjustValueToDataType(GDT_Byte,255.0,nullptr,nullptr) == 255.0); ensure( GDALAdjustValueToDataType(GDT_Byte,255.0,&bClamped,&bRounded) == 255.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Byte,254.4,&bClamped,&bRounded) == 254.0 && !bClamped && bRounded); ensure( GDALAdjustValueToDataType(GDT_Byte,-1,&bClamped,&bRounded) == 0.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Byte,256.0,&bClamped,&bRounded) == 255.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt16,65535.0,&bClamped,&bRounded) == 65535.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt16,65534.4,&bClamped,&bRounded) == 65534.0 && !bClamped && bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt16,-1,&bClamped,&bRounded) == 0.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt16,65536.0,&bClamped,&bRounded) == 65535.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,-32768.0,&bClamped,&bRounded) == -32768.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,32767.0,&bClamped,&bRounded) == 32767.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,-32767.4,&bClamped,&bRounded) == -32767.0 && !bClamped && bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,32766.4,&bClamped,&bRounded) == 32766.0 && !bClamped && bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,-32769.0,&bClamped,&bRounded) == -32768.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int16,32768.0,&bClamped,&bRounded) == 32767.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt32,10000000.0,&bClamped,&bRounded) == 10000000.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt32,10000000.4,&bClamped,&bRounded) == 10000000.0 && !bClamped && bRounded); ensure( GDALAdjustValueToDataType(GDT_UInt32,-1,&bClamped,&bRounded) == 0.0 && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int32,-10000000.0,&bClamped,&bRounded) == -10000000.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Int32,10000000.0,&bClamped,&bRounded) == 10000000.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, 0.0,&bClamped,&bRounded) == 0.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, 1e-50,&bClamped,&bRounded) == 0.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, 1.23,&bClamped,&bRounded) == static_cast(1.23f) && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, -1e300,&bClamped,&bRounded) == -std::numeric_limits::max() && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, 1e300,&bClamped,&bRounded) == std::numeric_limits::max() && bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, std::numeric_limits::infinity(),&bClamped,&bRounded) == std::numeric_limits::infinity() && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float32, -std::numeric_limits::infinity(),&bClamped,&bRounded) == -std::numeric_limits::infinity() && !bClamped && !bRounded); { double dfNan = std::numeric_limits::quiet_NaN(); double dfGot = GDALAdjustValueToDataType(GDT_Float32, dfNan,&bClamped,&bRounded); ensure( memcmp(&dfNan, &dfGot, sizeof(double)) == 0 && !bClamped && !bRounded); } ensure( GDALAdjustValueToDataType(GDT_Float64, 0.0,&bClamped,&bRounded) == 0.0 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float64, 1e-50,&bClamped,&bRounded) == 1e-50 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float64, -1e40,&bClamped,&bRounded) == -1e40 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float64, 1e40,&bClamped,&bRounded) == 1e40 && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float64, std::numeric_limits::infinity(),&bClamped,&bRounded) == std::numeric_limits::infinity() && !bClamped && !bRounded); ensure( GDALAdjustValueToDataType(GDT_Float64, -std::numeric_limits::infinity(),&bClamped,&bRounded) == -std::numeric_limits::infinity() && !bClamped && !bRounded); { double dfNan = std::numeric_limits::quiet_NaN(); double dfGot = GDALAdjustValueToDataType(GDT_Float64, dfNan,&bClamped,&bRounded); ensure( memcmp(&dfNan, &dfGot, sizeof(double)) == 0 && !bClamped && !bRounded); } } class FakeBand: public GDALRasterBand { protected: virtual CPLErr IReadBlock(int, int, void*) override { return CE_None; } virtual CPLErr IWriteBlock( int, int, void * ) override { return CE_None; } public: FakeBand(int nXSize, int nYSize) { nBlockXSize = nXSize; nBlockYSize = nYSize; } }; class DatasetWithErrorInFlushCache: public GDALDataset { bool bHasFlushCache; public: DatasetWithErrorInFlushCache() : bHasFlushCache(false) { } ~DatasetWithErrorInFlushCache() { FlushCache(); } virtual void FlushCache(void) override { if( !bHasFlushCache) CPLError(CE_Failure, CPLE_AppDefined, "some error"); GDALDataset::FlushCache(); bHasFlushCache = true; } virtual CPLErr _SetProjection(const char*) override { return CE_None; } CPLErr SetSpatialRef(const OGRSpatialReference* poSRS) override { return OldSetProjectionFromSetSpatialRef(poSRS); } virtual CPLErr SetGeoTransform(double*) override { return CE_None; } static GDALDataset* CreateCopy(const char*, GDALDataset*, int, char **, GDALProgressFunc, void *) { return new DatasetWithErrorInFlushCache(); } static GDALDataset* Create(const char*, int nXSize, int nYSize, int, GDALDataType, char ** ) { DatasetWithErrorInFlushCache* poDS = new DatasetWithErrorInFlushCache(); poDS->eAccess = GA_Update; poDS->nRasterXSize = nXSize; poDS->nRasterYSize = nYSize; poDS->SetBand(1, new FakeBand(nXSize, nYSize)); return poDS; } }; // Test that GDALTranslate() detects error in flush cache template<> template<> void object::test<8>() { GDALDriver* poDriver = new GDALDriver(); poDriver->SetDescription("DatasetWithErrorInFlushCache"); poDriver->pfnCreateCopy = DatasetWithErrorInFlushCache::CreateCopy; GetGDALDriverManager()->RegisterDriver( poDriver ); const char* args[] = { "-of", "DatasetWithErrorInFlushCache", nullptr }; GDALTranslateOptions* psOptions = GDALTranslateOptionsNew((char**)args, nullptr); GDALDatasetH hSrcDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); CPLErrorReset(); CPLPushErrorHandler(CPLQuietErrorHandler); GDALDatasetH hOutDS = GDALTranslate("", hSrcDS, psOptions, nullptr); CPLPopErrorHandler(); GDALClose(hSrcDS); GDALTranslateOptionsFree(psOptions); ensure(hOutDS == nullptr); ensure(CPLGetLastErrorType() != CE_None); GetGDALDriverManager()->DeregisterDriver( poDriver ); delete poDriver; } // Test that GDALWarp() detects error in flush cache template<> template<> void object::test<9>() { GDALDriver* poDriver = new GDALDriver(); poDriver->SetDescription("DatasetWithErrorInFlushCache"); poDriver->pfnCreate = DatasetWithErrorInFlushCache::Create; GetGDALDriverManager()->RegisterDriver( poDriver ); const char* args[] = { "-of", "DatasetWithErrorInFlushCache", nullptr }; GDALWarpAppOptions* psOptions = GDALWarpAppOptionsNew((char**)args, nullptr); GDALDatasetH hSrcDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); CPLErrorReset(); CPLPushErrorHandler(CPLQuietErrorHandler); GDALDatasetH hOutDS = GDALWarp("/", nullptr, 1, &hSrcDS, psOptions, nullptr); CPLPopErrorHandler(); GDALClose(hSrcDS); GDALWarpAppOptionsFree(psOptions); ensure(hOutDS == nullptr); ensure(CPLGetLastErrorType() != CE_None); GetGDALDriverManager()->DeregisterDriver( poDriver ); delete poDriver; } // Test that GDALSwapWords() with unaligned buffers template<> template<> void object::test<10>() { GByte abyBuffer[ 8 * 2 + 1 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 255, 7, 6, 5, 4, 3, 2, 1, 0 }; GDALSwapWords(abyBuffer, 4, 2, 9 ); ensure( abyBuffer[0] == 3 ); ensure( abyBuffer[1] == 2 ); ensure( abyBuffer[2] == 1 ); ensure( abyBuffer[3] == 0 ); ensure( abyBuffer[9] == 4 ); ensure( abyBuffer[10] == 5 ); ensure( abyBuffer[11] == 6 ); ensure( abyBuffer[12] == 7 ); GDALSwapWords(abyBuffer, 4, 2, 9 ); GDALSwapWords(abyBuffer, 8, 2, 9 ); ensure( abyBuffer[0] == 7 ); ensure( abyBuffer[1] == 6 ); ensure( abyBuffer[2] == 5 ); ensure( abyBuffer[3] == 4 ); ensure( abyBuffer[4] == 3 ); ensure( abyBuffer[5] == 2 ); ensure( abyBuffer[6] == 1 ); ensure( abyBuffer[7] == 0 ); ensure( abyBuffer[9] == 0 ); ensure( abyBuffer[10] == 1 ); ensure( abyBuffer[11] == 2 ); ensure( abyBuffer[12] == 3 ); ensure( abyBuffer[13] == 4 ); ensure( abyBuffer[14] == 5 ); ensure( abyBuffer[15] == 6 ); ensure( abyBuffer[16] == 7 ); GDALSwapWords(abyBuffer, 4, 2, 9 ); } // Test ARE_REAL_EQUAL() template<> template<> void object::test<11>() { ensure( ARE_REAL_EQUAL(0.0, 0.0) ); ensure( !ARE_REAL_EQUAL(0.0, 0.1) ); ensure( !ARE_REAL_EQUAL(0.1, 0.0) ); ensure( ARE_REAL_EQUAL(1.0, 1.0) ); ensure( !ARE_REAL_EQUAL(1.0, 0.99) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::min(), -std::numeric_limits::min()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::min(), std::numeric_limits::min()) ); ensure( !ARE_REAL_EQUAL(std::numeric_limits::min(), 0.0) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::max(), -std::numeric_limits::max()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::max(), std::numeric_limits::max()) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::infinity(), -std::numeric_limits::infinity()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::infinity(), std::numeric_limits::infinity()) ); ensure( !ARE_REAL_EQUAL(std::numeric_limits::infinity(), std::numeric_limits::max()) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::min(), -std::numeric_limits::min()) ); ensure( ARE_REAL_EQUAL(0.0f, 0.0f) ); ensure( !ARE_REAL_EQUAL(0.0f, 0.1f) ); ensure( !ARE_REAL_EQUAL(0.1f, 0.0f) ); ensure( ARE_REAL_EQUAL(1.0f, 1.0f) ); ensure( !ARE_REAL_EQUAL(1.0f, 0.99f) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::min(), -std::numeric_limits::min()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::min(), std::numeric_limits::min()) ); ensure( !ARE_REAL_EQUAL(std::numeric_limits::min(), 0.0f) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::max(), -std::numeric_limits::max()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::max(), std::numeric_limits::max()) ); ensure( ARE_REAL_EQUAL(-std::numeric_limits::infinity(), -std::numeric_limits::infinity()) ); ensure( ARE_REAL_EQUAL(std::numeric_limits::infinity(), std::numeric_limits::infinity()) ); ensure( !ARE_REAL_EQUAL(std::numeric_limits::infinity(), std::numeric_limits::max()) ); } // Test GDALIsValueInRange() template<> template<> void object::test<12>() { ensure( GDALIsValueInRange(0) ); ensure( GDALIsValueInRange(255) ); ensure( !GDALIsValueInRange(-1) ); ensure( !GDALIsValueInRange(256) ); ensure( GDALIsValueInRange(std::numeric_limits::max()) ); ensure( GDALIsValueInRange(std::numeric_limits::infinity()) ); ensure( !GDALIsValueInRange(std::numeric_limits::max()) ); ensure( GDALIsValueInRange(std::numeric_limits::infinity()) ); ensure( !GDALIsValueInRange(CPLAtof("nan")) ); ensure( !GDALIsValueInRange(CPLAtof("nan")) ); ensure( !GDALIsValueInRange(CPLAtof("nan")) ); } // Test GDALDataTypeIsInteger() template<> template<> void object::test<13>() { ensure( !GDALDataTypeIsInteger(GDT_Unknown) ); ensure_equals( GDALDataTypeIsInteger(GDT_Byte), TRUE ); ensure_equals( GDALDataTypeIsInteger(GDT_UInt16), TRUE ); ensure_equals( GDALDataTypeIsInteger(GDT_Int16), TRUE ); ensure_equals( GDALDataTypeIsInteger(GDT_UInt32), TRUE ); ensure_equals( GDALDataTypeIsInteger(GDT_Int32), TRUE ); ensure( !GDALDataTypeIsInteger(GDT_Float32) ); ensure( !GDALDataTypeIsInteger(GDT_Float64) ); ensure_equals( GDALDataTypeIsInteger(GDT_CInt16), TRUE ); ensure_equals( GDALDataTypeIsInteger(GDT_CInt32), TRUE ); ensure( !GDALDataTypeIsInteger(GDT_CFloat32) ); ensure( !GDALDataTypeIsInteger(GDT_CFloat64) ); } // Test GDALDataTypeIsFloating() template<> template<> void object::test<14>() { ensure( !GDALDataTypeIsFloating(GDT_Unknown) ); ensure( !GDALDataTypeIsFloating(GDT_Byte) ); ensure( !GDALDataTypeIsFloating(GDT_UInt16) ); ensure( !GDALDataTypeIsFloating(GDT_Int16) ); ensure( !GDALDataTypeIsFloating(GDT_UInt32) ); ensure( !GDALDataTypeIsFloating(GDT_Int32) ); ensure_equals( GDALDataTypeIsFloating(GDT_Float32), TRUE ); ensure_equals( GDALDataTypeIsFloating(GDT_Float64), TRUE ); ensure( !GDALDataTypeIsFloating(GDT_CInt16) ); ensure( !GDALDataTypeIsFloating(GDT_CInt32) ); ensure_equals( GDALDataTypeIsFloating(GDT_CFloat32), TRUE ); ensure_equals( GDALDataTypeIsFloating(GDT_CFloat64), TRUE ); } // Test GDALDataTypeIsComplex() template<> template<> void object::test<15>() { ensure( !GDALDataTypeIsComplex(GDT_Unknown) ); ensure( !GDALDataTypeIsComplex(GDT_Byte) ); ensure( !GDALDataTypeIsComplex(GDT_UInt16) ); ensure( !GDALDataTypeIsComplex(GDT_Int16) ); ensure( !GDALDataTypeIsComplex(GDT_UInt32) ); ensure( !GDALDataTypeIsComplex(GDT_Int32) ); ensure( !GDALDataTypeIsComplex(GDT_Float32) ); ensure( !GDALDataTypeIsComplex(GDT_Float64) ); ensure_equals( GDALDataTypeIsComplex(GDT_CInt16), TRUE ); ensure_equals( GDALDataTypeIsComplex(GDT_CInt32), TRUE ); ensure_equals( GDALDataTypeIsComplex(GDT_CFloat32), TRUE ); ensure_equals( GDALDataTypeIsComplex(GDT_CFloat64), TRUE ); } // Test GDALDataTypeIsConversionLossy() template<> template<> void object::test<16>() { ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_Byte) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_UInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_Int16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_UInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_Int32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_Float64) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Byte, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_Byte) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_Int16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_UInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_Int32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt16, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int16, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int16, GDT_UInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int16, GDT_UInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_Int32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_Float64) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int16, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_Int16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_CInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_CInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_UInt32, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_UInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int32, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int32, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int32, GDT_CInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Int32, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Int32, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_Int32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float32, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float32, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_CInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float32, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float32, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float32, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_Float32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float64, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_CInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_CInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_Float64, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_Float64, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_Float32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_Float64) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt16, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_Float32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_CInt16) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_CInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CInt32, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_Float32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_CInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_CInt32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CFloat32, GDT_CFloat64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_Byte) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_UInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_Int16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_UInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_Int32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_Float32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_Float64) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_CInt16) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_CInt32) ); ensure( GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_CFloat32) ); ensure( !GDALDataTypeIsConversionLossy(GDT_CFloat64, GDT_CFloat64) ); } // Test GDALDataset::GetBands() template<> template<> void object::test<17>() { GDALDatasetUniquePtr poDS( GDALDriver::FromHandle( GDALGetDriverByName("MEM"))->Create("", 1, 1, 3, GDT_Byte, nullptr)); int nExpectedNumber = 1; for( auto&& poBand: poDS->GetBands() ) { ensure_equals( poBand->GetBand(), nExpectedNumber ); nExpectedNumber ++; } ensure_equals( nExpectedNumber, 3 + 1 ); ensure_equals( poDS->GetBands().size(), 3U ); ensure_equals( poDS->GetBands()[0], poDS->GetRasterBand(1) ); ensure_equals( poDS->GetBands()[static_cast(0)], poDS->GetRasterBand(1) ); } } // namespace tut gdalautotest-3.0.4/cpp/Makefile0000644003401500001440000001511713614004466016063 0ustar rouaultusers# This Makefile requires GNU Make. include ../../gdal/GDALmake.opt CXXFLAGS += -I. -Itut $(GDAL_INCLUDE) CPPFLAGS:=$(filter-out -DGDAL_COMPILATION,$(CPPFLAGS)) CFLAGS += -I. -Itut $(GDAL_INCLUDE) PROGS = gdal_unit_test testperfcopywords testcopywords testclosedondestroydm testthreadcond testvirtualmem testblockcache testblockcachewrite testblockcachelimits testdestroy testmultithreadedwriting test_include_from_c_file test_include_from_cpp_file test_include_from_cpp_file_with_extern_c test_osr_set_proj_search_paths bug1488 all: $(PROGS) test check: all make quick_test ./testperfcopywords quick_test: gdal_unit_test testcopywords testclosedondestroydm testthreadcond testvirtualmem testblockcache testblockcachewrite testblockcachelimits testmultithreadedwriting testdestroy bug1488 ./gdal_unit_test ./testcopywords ./testclosedondestroydm ./testthreadcond ./testvirtualmem ./testblockcache -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES --config GDAL_CACHEMAX 100 ./testblockcache -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES --config GDAL_RB_LOCK_TYPE SPIN --config GDAL_CACHEMAX 100 ./testblockcache -check -co TILED=YES -migrate --config GDAL_CACHEMAX 100 ./testblockcache -check -memdriver --config GDAL_CACHEMAX 100 ./testblockcachewrite --debug ON ./testblockcache --config GDAL_BAND_BLOCK_CACHE HASHSET -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES --config GDAL_CACHEMAX 100 ./testblockcache --config GDAL_BAND_BLOCK_CACHE HASHSET -check -co TILED=YES --debug TEST,LOCK,GDAL -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES -threads 2 --config GDAL_CACHEMAX 100 ./testblockcache --config GDAL_BAND_BLOCK_CACHE HASHSET -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES --config GDAL_RB_LOCK_TYPE SPIN --config GDAL_CACHEMAX 100 ./testblockcachelimits --debug ON ./testmultithreadedwriting ./testdestroy ./test_osr_set_proj_search_paths ./bug1488 test_sse: $(CXX) -g -O2 testsse.cpp -o testsse -I../../gdal/port -I../../gdal/gcore ./testsse $(CXX) -g -O2 -mssse3 testsse.cpp -o testsse -I../../gdal/port -I../../gdal/gcore ./testsse $(CXX) -g -O2 -mssse3 -msse4.1 testsse.cpp -o testsse -I../../gdal/port -I../../gdal/gcore ./testsse $(CXX) -g -O2 -mavx2 testsse.cpp -o testsse -I../../gdal/port -I../../gdal/gcore ./testsse $(CXX) -g -O2 -DUSE_SSE2_EMULATION testsse.cpp -o testsse -I../../gdal/port -I../../gdal/gcore ./testsse OBJ = \ gdal_unit_test.o \ test_alg.o \ test_cpl.o \ test_gdal.o \ test_gdal_aaigrid.o \ test_gdal_dted.o \ test_gdal_gtiff.o \ test_triangulation.o \ test_ogr.o \ test_ogr_geos.o \ test_ogr_shape.o \ test_osr.o \ test_osr_ct.o \ test_osr_pci.o \ test_osr_proj4.o \ test_marching_squares_square.o \ test_marching_squares_tile.o \ test_marching_squares_contour.o \ test_marching_squares_polygon.o \ tut/tut_gdal.o gdal_unit_test: $(OBJ) $(LD) $(LDFLAGS) $^ $(CONFIG_LIBS) -o $@ testperfcopywords.o: testperfcopywords.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testperfcopywords: testperfcopywords.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testcopywords.o: testcopywords.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testcopywords: testcopywords.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testclosedondestroydm: testclosedondestroydm.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testthreadcond: testthreadcond.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testvirtualmem: testvirtualmem.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testblockcache.o: testblockcache.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testblockcache: testblockcache.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testblockcachewrite.o: testblockcachewrite.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testblockcachewrite: testblockcachewrite.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testmultithreadedwriting.o: testmultithreadedwriting.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testmultithreadedwriting: testmultithreadedwriting.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testblockcachelimits.o: testblockcachelimits.cpp $(CXX) $(CXXFLAGS) -O2 -c $< testblockcachelimits: testblockcachelimits.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ testdestroy: testdestroy.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ test_osr_set_proj_search_paths.o: test_osr_set_proj_search_paths.cpp $(CXX) $(CXXFLAGS) $(PROJ_INCLUDE) $(PROJ_CFLAGS) -c $< test_osr_set_proj_search_paths: test_osr_set_proj_search_paths.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ bug1488: bug1488.o $(LD) $(LDFLAGS) $< $(CONFIG_LIBS) -o $@ vsipreload.so: ../../gdal/port/vsipreload.o $(CXX) -fPIC -g $(CXXFLAGS) $< $(CONFIG_LIBS) $(LDFLAGS) -shared -o $@ test_include_from_c_file: for HEADER_FILE in cpl_atomic_ops.h cpl_conv.h cpl_csv.h cpl_error.h cpl_hash_set.h cpl_list.h cpl_minixml.h cpl_port.h cpl_progress.h cpl_quad_tree.h cpl_vsi.h gdal_alg.h gdal_version.h gdal.h gdal_utils.h ogr_api.h ogr_core.h ogr_srs_api.h; do \ echo "#include \"$$HEADER_FILE\"" > tmp_include_from_c_file.c; \ $(CC) $(CFLAGS) -c tmp_include_from_c_file.c; \ rm -f tmp_include_from_c_file.*; \ rm -f .libs/tmp_include_from_c_file.*; \ done; \ $(CC) $(CFLAGS) -c test_include_from_c_file.c test_include_from_cpp_file: for HEADER_FILE in cpl_atomic_ops.h cpl_conv.h cpl_csv.h cpl_error.h cpl_hash_set.h cpl_list.h cpl_minixml.h cpl_port.h cpl_progress.h cpl_quad_tree.h cpl_vsi.h gdal_alg.h gdal_version.h gdal.h gdal_utils.h ogr_api.h ogr_core.h ogr_srs_api.h ogr_feature.h ogr_geometry.h ogrsf_frmts.h ogr_spatialref.h; do \ echo "#include \"$$HEADER_FILE\"" > tmp_include_from_cpp_file.cpp; \ $(CXX) $(CXXFLAGS) -c tmp_include_from_cpp_file.cpp; \ rm -f tmp_include_from_cpp_file.*; \ rm -f .libs/tmp_include_from_cpp_file.*; \ done; \ $(CXX) $(CXXFLAGS) -c test_c_include_from_cpp_file.cpp test_include_from_cpp_file_with_extern_c: for HEADER_FILE in cpl_atomic_ops.h cpl_conv.h cpl_csv.h cpl_error.h cpl_hash_set.h cpl_list.h cpl_minixml.h cpl_port.h cpl_progress.h cpl_quad_tree.h cpl_vsi.h gdal_alg.h gdal_version.h gdal.h gdal_utils.h ogr_api.h ogr_core.h ogr_srs_api.h; do \ echo "extern \"C\" {" > test_include_from_cpp_file_with_extern_c.cpp; \ echo "#include \"$$HEADER_FILE\"" >> test_include_from_cpp_file_with_extern_c.cpp; \ echo "}" >> test_include_from_cpp_file_with_extern_c.cpp; \ $(CXX) $(CXXFLAGS) -c test_include_from_cpp_file_with_extern_c.cpp; \ rm -f test_include_from_cpp_file_with_extern_c.*; \ rm -f .libs/test_include_from_cpp_file_with_extern_c.*; \ done clean: $(RM) $(PROGS) testsse $(RM) $(OBJ) $(RM) *.a $(RM) *.out $(RM) *~ gdalautotest-3.0.4/cpp/test_marching_squares_polygon.cpp0000644003401500001440000005120513614005367023267 0ustar rouaultusers/****************************************************************************** * $Id: test_marching_squares_polygon.cpp 5c2c68af6b930de5249baf9ff9c1159ee805fbd7 2018-08-06 09:41:49 +0200 Hugo Mercier $ * * Project: GDAL algorithms * Purpose: Tests for the marching squares algorithm * Author: Hugo Mercier, * ****************************************************************************** * Copyright (c) 2018, Hugo Mercier, * * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "gdal_alg.h" #include "marching_squares/level_generator.h" #include "marching_squares/polygon_ring_appender.h" #include "marching_squares/segment_merger.h" #include "marching_squares/contour_generator.h" #ifdef DEBUG #include #endif namespace marching_squares { class TestPolygonWriter { public: void startPolygon( double level ) { currentPolygon_ = &polygons_[level]; } void endPolygon() { } void addPart( const std::list& ring ) { PolygonPart part; part.push_back( ring ); currentPolygon_->emplace_back( part ); currentPart_ = ¤tPolygon_->back(); } void addInteriorRing( const std::list& ring ) { currentPart_->push_back( ring ); } void out( std::ostream& ostr, double level ) const { auto pIt = polygons_.find( level ); if ( pIt == polygons_.end() ) return; for ( const auto& part: pIt->second ) { ostr << "{ "; for ( const auto& ring: part ) { ostr << "{ "; for ( const auto& pt: ring ) { ostr << "(" << pt.x << "," << pt.y << ") "; } ostr << "} "; } ostr << "} "; } } #ifdef DEBUG void toSvg( const std::string& filename ) { std::ofstream ofs( filename ); ofs << "\n"; ofs << "\n"; ofs << "\n"; ofs << "\n"; const std::string colors[] = {"white", "#bbb", "#888", "#666", "#333", "black"}; int level = 0; for ( auto& p : polygons_ ) { for ( const auto& part : p.second ) { ofs << ""; } level++; } ofs << ""; } #endif private: typedef std::vector PolygonPart; typedef std::vector Polygon; Polygon* currentPolygon_ = nullptr; PolygonPart* currentPart_ = nullptr; public: std::map polygons_; }; static bool equal_linestrings( const LineString& ls1, const LineString& ls2 ) { if ( ls1.size() != ls2.size() ) return false; auto it1 = ls1.begin(); auto it2 = ls2.begin(); for ( ; it1 != ls1.end(); it1++, it2++ ) { if ( !(*it1 == *it2) ) return false; } return true; } } namespace tut { using namespace marching_squares; // Common fixture with test data struct test_ms_polygon_data { }; // Register test group typedef test_group group; typedef group::object object; group test_ms_polygon_group("MarchingSquares:Polygon"); // Dummy test template<> template<> void object::test<1>() { // one pixel std::vector data = { 2.0 }; TestPolygonWriter w; { PolygonRingAppender appender( w ); IntervalLevelRangeIterator levels( 0.0, 10.0 ); SegmentMerger, IntervalLevelRangeIterator> writer( appender, levels, /* polygonize */ true ); ContourGenerator cg( 1, 1, false, NaN, writer, levels); cg.feedLine( &data[0] ); } { std::ostringstream ostr; w.out( ostr, 10.0 ); ensure_equals( "Polygon #0", ostr.str(), "{ { (0.5,1) (1,1) (1,0.5) (1,0) (0.5,0) (0,0) (0,0.5) (0,1) (0.5,1) } } " ); } } template<> template<> void object::test<2>() { // four pixels // two rings // 5 10 // 10 5 // levels = 0, 10 // // legend: // : contour // # border (level 0) // = border (level 10) // // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 5 5| 7.5 10| 10 | // | +#########+########+########o+========++ | // | # | | : || | // | # | | : || | // | # | | : || | // +--------+---------+--------+---------o........o+--------+ // |NaN 5 # 5| 10| 10# NaN| // | # | | # | // | # | | # | // | 7.5++---------+ 7.5 7.5+--------+ | // | # | | # | // | # | | # | // | # | 7.5 | # | // +-------++.........o--------+---------+--------+---------+ // |NaN 10|| 10: | 5| 5 # NaN| // | || : | | # | // | || : | | # | // | ++=========o########+#########+########+ | // | 10 10| 7.5 5| 5 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 5.0, 10.0, 10.0, 5.0 }; TestPolygonWriter w; { PolygonRingAppender appender( w ); IntervalLevelRangeIterator levels( 0.0, 10.0 ); SegmentMerger, IntervalLevelRangeIterator> writer( appender, levels, /* polygonize */ true ); ContourGenerator cg( 2, 2, false, NaN, writer, levels); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); } { std::ostringstream ostr; w.out( ostr, 10.0 ); ensure_equals( "Polygon #1", ostr.str(), "{ { (1.5,2) (2,2) (2,1.5) (2,1) (2,0.5) (1.5,0.5) (1.5,0.5) (1.5,0) (1,0) (0.5,0) (0,0) (0,0.5) (0,1) (0,1.5) (0.5,1.5) (0.5,1.5) (0.5,2) (1,2) (1.5,2) } } "); } { std::ostringstream ostr; w.out( ostr, 20.0 ); ensure_equals( "Polygon #2", ostr.str(), "{ { (2,0.5) (2,0.5) (2,0) (1.5,0) (1.5,0) (1.5,0.5) (1.5,0.5) (2,0.5) } } { { (0.5,1.5) (0.5,1.5) (0,1.5) (0,1.5) (0,2) (0.5,2) (0.5,2) (0.5,1.5) } } "); } } template<> template<> void object::test<3>() { // four pixels // 155 155.01 // 154.99 155 // levels = 155 // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 155 | 155.005 | 155.01 | // | +---------+--------+---------+---------+ | // | | 155 | 155.01 | | // | | | | | | | // | | | 155.005 | | | // +--------+---------+--------+---------+---------+--------+ // |NaN 155 155 155.01 155.01 NaN| // | | | | | | // | 154.995 | | 155.005 | // | +-------154.995 155.005------+ | // | | | | | | // | | | | | | // | | | | | | // +--------+---------+--------+---------+---------+--------+ // |NaN 154.99 154.99 154.995 155 155 NaN| // | | | | | | | // | | | | | | | // | +---------+--------+---------+---------+ | // | 154.99 154.99 154.995 155 155 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 155.0, 155.01, 154.99, 155.0 }; TestPolygonWriter w; { PolygonRingAppender appender( w ); const double levels[] = { 155.0 }; FixedLevelRangeIterator levelGenerator( levels, 1 ); SegmentMerger, FixedLevelRangeIterator> writer( appender, levelGenerator, /* polygonize */ true ); ContourGenerator cg( 2, 2, false, NaN, writer, levelGenerator); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); } { std::ostringstream ostr; w.out( ostr, 155.0 ); ensure_equals( "Polygon #0", ostr.str(), "{ { (1.4999,2) (1.4999,1.5) (0.5,0.5001) (0,0.5001) (0,1) (0,1.5) (0,2) (0.5,2) (1,2) (1.4999,2) } } " ); } { std::ostringstream ostr; w.out( ostr, Inf ); ensure_equals( "Polygon #1", ostr.str(), "{ { (1.5,2) (2,2) (2,1.5) (2,1) (2,0.5) (2,0) (1.5,0) (1,0) (0.5,0) (0,0) (0,0.5) (0,0.5001) (0.5,0.5001) (1.4999,1.5) (1.4999,2) (1.5,2) } } " ); } } template<> template<> void object::test<4>() { // nine pixels // two nested rings // levels = 1, 11, 21 // pixels // +-----+-----+-----+-----+-----+ // | | | | | | // | NaN | NaN | NaN | NaN | NaN | // | | | | | | // +-----+-----+-----+-----+-----+ // | | | | | | // | NaN | 0 | 4 | 0 | NaN | // | | | | | | // +-----+-----+-----+-----+-----+ // | | | | | | // | NaN | 4 | 12 | 4 | NaN | // | | | | | | // +-----+-----+-----+-----+-----+ // | | | | | | // | NaN | 0 | 4 | 0 | NaN | // | | | | | | // +-----+-----+-----+-----+-----+ // | | | | | | // | NaN | NaN | NaN | NaN | NaN | // | | | | | | // +-----+-----+-----+-----+-----+ // // NaN NaN NaN NaN NaN // +------------------+------------------+------------------+------------------+ // | | | | | // | (0,0) | (1,0) | (2,0) | | // | 0 0| 2 4| 2 0| 0 | // | +---------+---o----+---------+---------+----o---+---------+ | // | | | : | | | : | | | // | | | : | | | : | | | // | | | : | | | : | | | // +--------+---------+---o----+---------+---------+----o---+---------+--------+ NaN // |NaN 0| 0| _/ 2 4| 2 \_0| |0 | // | o.........o/ | \o.........o | // | | | | | | | // | 2+---------+ 2 | 2+---------+2 | // | | | | | | | // | | | _o_ | | | // | | | / | \ | | | // +--------+---------+---------------o--+--o---------------+---------+--------+ NaN // |NaN 4| 4| \12 / 4| |4 | // | | | -o- | | | // | | | | | | | // | 2+---------+ 2 | 2+---------+2 | // | | | | | | | // | o.........o_ | _o.........o | // | | | \_ 2 | 2 _/ | | | // +--------+---------+---o----+---------+--------+----o/---+---------+--------+ NaN // |NaN 0| 0| : | 4| | : 0| |0 | // | | | : | | | : | | | // | | | : | | | : | | | // | +---------+---o----+---------+--------+----o----+---------+ | // | 0 0| 2 4| 2 0| 0 | // | (0,3) | (1,3) | (2,3) | | // | | | | | // +------------------+------------------+------------------+------------------+ // NaN NaN NaN NaN NaN std::vector data = { 0.0, 4.0, 0.0, 4.0, 12.0, 4.0, 0.0, 4.0, 0.0 }; TestPolygonWriter w; { PolygonRingAppender appender( w ); IntervalLevelRangeIterator levels( 1.0, 10.0 ); SegmentMerger, IntervalLevelRangeIterator> writer( appender, levels, /* polygonize */ true ); ContourGenerator cg( 3, 3, false, NaN, writer, levels); cg.feedLine( &data[0] ); cg.feedLine( &data[3] ); cg.feedLine( &data[6] ); } { std::ostringstream ostr; w.out( ostr, 1.0 ); ensure_equals( "Polygon #0", ostr.str(), "{ { (0.5,0.75) (0.75,0.5) (0.75,0) (0.5,0) (0,0) (0,0.5) (0,0.75) (0.5,0.75) } } { { (2.5,0.75) (3,0.75) (3,0.5) (3,0) (2.5,0) (2.25,0) (2.25,0.5) (2.5,0.75) } } { { (0.75,3) (0.75,2.5) (0.5,2.25) (0,2.25) (0,2.5) (0,3) (0.5,3) (0.75,3) } } { { (2.5,3) (3,3) (3,2.5) (3,2.25) (2.5,2.25) (2.25,2.5) (2.25,3) (2.5,3) } } " ); } { std::ostringstream ostr; w.out( ostr, 11.0 ); ensure_equals( "Polygon #1", ostr.str(), "{ { (2.25,2.5) (2.5,2.25) (3,2.25) (3,2) (3,1.5) (3,1) (3,0.75) (2.5,0.75) (2.25,0.5) (2.25,0) (2,0) (1.5,0) (1,0) (0.75,0) (0.75,0.5) (0.5,0.75) (0,0.75) (0,1) (0,1.5) (0,2) (0,2.25) (0.5,2.25) (0.75,2.5) (0.75,3) (1,3) (1.5,3) (2,3) (2.25,3) (2.25,2.5) } { (1.625,1.5) (1.5,1.625) (1.375,1.5) (1.5,1.375) (1.625,1.5) } } " ); } { std::ostringstream ostr; w.out( ostr, 21.0 ); ensure_equals( "Polygon #2", ostr.str(), "{ { (1.625,1.5) (1.5,1.625) (1.375,1.5) (1.5,1.375) (1.625,1.5) } } " ); } } template<> template<> void object::test<5>() { // Three nested rings std::vector data = { 2, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 4, 6, 4, 2, 2, 4, 4, 4, 2, 2, 2, 2, 2, 2 }; TestPolygonWriter w; { PolygonRingAppender appender( w ); IntervalLevelRangeIterator levels( 1.0, 2.0 ); SegmentMerger, IntervalLevelRangeIterator> writer( appender, levels, /* polygonize */ true ); ContourGenerator cg( 5, 5, false, NaN, writer, levels); for ( int i = 0; i < 5; i++ ) { cg.feedLine( &data[5*i] ); } } { std::ostringstream ostr; w.out( ostr, 1.0 ); ensure_equals( "Polygon #0", ostr.str(), "" ); } { std::ostringstream ostr; w.out( ostr, 3.0 ); ensure_equals( "Polygon #1", ostr.str(), "{ { (4.5,5) (5,5) (5,4.5) (5,4) (5,3.5) (5,3) (5,2.5) (5,2) (5,1.5) (5,1) (5,0.5) (5,0) (4.5,0) (4,0) (3.5,0) (3,0) (2.5,0) (2,0) (1.5,0) (1,0) (0.5,0) (0,0) (0,0.5) (0,1) (0,1.5) (0,2) (0,2.5) (0,3) (0,3.5) (0,4) (0,4.5) (0,5) (0.5,5) (1,5) (1.5,5) (2,5) (2.5,5) (3,5) (3.5,5) (4,5) (4.5,5) } { (4,3.5) (3.5,4) (2.5,4) (1.5,4) (1,3.5) (1,2.5) (1,1.5) (1.5,1) (2.5,1) (3.5,1) (4,1.5) (4,2.5) (4,3.5) } } " ); } { std::ostringstream ostr; w.out( ostr, 5.0 ); ensure_equals( "Polygon #2", ostr.str(), "{ { (4,3.5) (3.5,4) (2.5,4) (1.5,4) (1,3.5) (1,2.5) (1,1.5) (1.5,1) (2.5,1) (3.5,1) (4,1.5) (4,2.5) (4,3.5) } { (3,2.5) (2.5,3) (2,2.5) (2.5,2) (3,2.5) } } " ); } { std::ostringstream ostr; w.out( ostr, 7.0 ); ensure_equals( "Polygon #3", ostr.str(), "{ { (3,2.5) (2.5,3) (2,2.5) (2.5,2) (3,2.5) } } " ); } ensure( "Inner ring of polygon #1 = exterioring ring of polygon #2", equal_linestrings( w.polygons_[3.0][0][1], w.polygons_[5.0][0][0] ) ); ensure( "Inner ring of polygon #2 = exterioring ring of polygon #3", equal_linestrings( w.polygons_[5.0][0][1], w.polygons_[7.0][0][0] ) ); } } gdalautotest-3.0.4/cpp/test_gdal_aaigrid.cpp0000644003401500001440000002605413614005367020560 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test Arc/Info ASCII Grid support. Ported from gdrivers/aaigrid.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // Copyright (c) 2010, Even Rouault // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_string.h" #include "gdal_alg.h" #include "gdal_priv.h" #include "gdal.h" #include #include #include #include namespace tut { // Common fixture with test data struct test_aaigrid_data { struct raster_t { std::string file_; int band_; int checksum_; raster_t(std::string const& f, int b, int c) : file_(f), band_(b), checksum_(c) {} }; typedef std::vector rasters_t; GDALDriverH drv_; std::string drv_name_; std::string data_; std::string data_tmp_; rasters_t grids_; rasters_t rasters_; test_aaigrid_data() : drv_(nullptr), drv_name_("AAIGrid") { drv_ = GDALGetDriverByName(drv_name_.c_str()); // Compose data path for test group data_ = tut::common::data_basedir; data_tmp_ = tut::common::tmp_basedir; // Collection of test AAIGrid grids grids_.push_back(raster_t("byte.tif.grd", 1, 4672)); grids_.push_back(raster_t("pixel_per_line.asc", 1, 1123)); // Collection of non-AAIGrid rasters rasters_.push_back(raster_t("byte.tif", 1, 4672)); } }; // Register test group typedef test_group group; typedef group::object object; group test_aaigrid_group("GDAL::AAIGrid"); // Test driver availability template<> template<> void object::test<1>() { ensure("GDAL::AAIGrid driver not available", nullptr != drv_); } // Test open dataset template<> template<> void object::test<2>() { rasters_t::const_iterator it; for (it = grids_.begin(); it != grids_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALClose(ds); } } // Test dataset checksums template<> template<> void object::test<3>() { rasters_t::const_iterator it; for (it = grids_.begin(); it != grids_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, it->band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(ds); const int ysize = GDALGetRasterYSize(ds); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << file << "' not equal"; ensure_equals(os.str().c_str(), checksum, it->checksum_); GDALClose(ds); } } // Test affine transformation coefficients template<> template<> void object::test<4>() { // Index of test file being tested const std::size_t fileIdx = 1; std::string file(data_ + SEP); file += grids_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); double geoTransform[6] = { 0 }; CPLErr err = GDALGetGeoTransform(ds, geoTransform); ensure_equals("Can't fetch affine transformation coefficients", err, CE_None); // Test affine transformation coefficients const double maxError = 0.000001; const double expect[6] = { 100000.0, 50, 0, 650600.0, 0, -50 }; const std::string msg("Geotransform is incorrect"); ensure_distance(msg.c_str(), expect[0], geoTransform[0], maxError); ensure_distance(msg.c_str(), expect[1], geoTransform[1], maxError); ensure_distance(msg.c_str(), expect[2], geoTransform[2], maxError); ensure_distance(msg.c_str(), expect[3], geoTransform[3], maxError); ensure_distance(msg.c_str(), expect[4], geoTransform[4], maxError); ensure_distance(msg.c_str(), expect[5], geoTransform[5], maxError); GDALClose(ds); } // Test projection definition template<> template<> void object::test<5>() { // Index of test file being tested const std::size_t fileIdx = 1; std::string file(data_ + SEP); file += grids_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); std::string proj(GDALGetProjectionRef(ds)); ensure_equals("Projection definition is not available", proj.empty(), false); std::string expect( "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]]"); ensure_equals("Projection does not match expected", proj, expect); GDALClose(ds); } // Test band data type and NODATA value template<> template<> void object::test<6>() { // Index of test file being tested const std::size_t fileIdx = 1; std::string file(data_ + SEP); file += grids_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, grids_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const double noData = GDALGetRasterNoDataValue(band, nullptr); ensure_equals("Grid NODATA value wrong or missing", noData, -99999); ensure_equals("Data type is not GDT_Float32", GDALGetRasterDataType(band), GDT_Float32); GDALClose(ds); } // Create simple copy and check template<> template<> void object::test<7>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string src(data_ + SEP); src += rasters_.at(fileIdx).file_; GDALDatasetH dsSrc = GDALOpen(src.c_str(), GA_ReadOnly); ensure("Can't open source dataset: " + src, nullptr != dsSrc); std::string dst(data_tmp_ + SEP); dst += rasters_.at(fileIdx).file_; dst += ".grd"; GDALDatasetH dsDst = nullptr; dsDst = GDALCreateCopy(drv_, dst.c_str(), dsSrc, FALSE, nullptr, nullptr, nullptr); GDALClose(dsSrc); ensure("Can't copy dataset", nullptr != dsDst); std::string proj(GDALGetProjectionRef(dsDst)); ensure_equals("Projection definition is not available", proj.empty(), false); std::string expect( "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]," "UNIT[\"Degree\",0.0174532925199433]]," "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]]"); ensure_equals("Projection does not match expected", proj, expect); GDALRasterBandH band = GDALGetRasterBand(dsDst, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(dsDst); const int ysize = GDALGetRasterYSize(dsDst); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << dst << "' not equal"; ensure_equals(os.str().c_str(), checksum, rasters_.at(fileIdx).checksum_); GDALClose(dsDst); } // Test subwindow read and the tail recursion problem. template<> template<> void object::test<8>() { // Index of test file being tested const std::size_t fileIdx = 1; std::string file(data_ + SEP); file += grids_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, grids_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); // Sub-windows size const int win[4] = { 5, 5, 5, 5 }; // subwindow checksum const int winChecksum = 187; const int checksum = GDALChecksumImage(band, win[0], win[1], win[2], win[3]); std::stringstream os; os << "Checksums for '" << file << "' not equal"; ensure_equals(os.str().c_str(), checksum, winChecksum); GDALClose(ds); } } // namespace tut gdalautotest-3.0.4/cpp/tmp/0000755003401500001440000000000013614004466015216 5ustar rouaultusersgdalautotest-3.0.4/cpp/tmp/do-not-remove0000644003401500001440000000000013614004466017622 0ustar rouaultusersgdalautotest-3.0.4/cpp/gdal_unit_test.cpp0000644003401500001440000001061013614005367020126 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Main program of C++ Unit Tests runner for GDAL // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER #define WIN32_LEAN_AND_MEAN #endif // _MSC_VER #include "gdal_unit_test.h" #include "cpl_conv.h" #include "cpl_multiproc.h" #include "gdal.h" #include "ogr_api.h" #include "ogrsf_frmts.h" #include "test_data.h" #include #include #include namespace tut { test_runner_singleton runner; // Common test data path std::string const common::data_basedir(TUT_ROOT_DATA_DIR); std::string const common::tmp_basedir(TUT_ROOT_TMP_DIR); static void check_test_group(char const* name) { std::string grpname(name); if (grpname.empty()) throw std::runtime_error("missing test group name"); tut::groupnames gl = runner.get().list_groups(); tut::groupnames::const_iterator found = std::find(gl.begin(), gl.end(), grpname); if (found == gl.end()) throw std::runtime_error("test group " + grpname + " not found"); } } // namespace tut int main(int argc, char* argv[]) { // Register GDAL/OGR drivers ::GDALAllRegister(); ::OGRRegisterAll(); std::cout << "GDAL C/C++ API tests" << " (" << ::GDALVersionInfo("--version") << ")" << "\n---------------------------------------------------------\n"; argc = GDALGeneralCmdLineProcessor( argc, &argv, 0 ); if (argc < 1) { std::cout << "\n---------------------------------------------------------\n" << "No tests to run\n"; return EXIT_SUCCESS; } // Initialize TUT framework int nRetCode = EXIT_FAILURE; { tut::reporter visi; tut::runner.get().set_callback(&visi); try { if (argc == 1) { tut::runner.get().run_tests(); } else if (argc == 2 && std::string(argv[1]) == "--list") { tut::groupnames gl = tut::runner.get().list_groups(); tut::groupnames::const_iterator b = gl.begin(); tut::groupnames::const_iterator e = gl.end(); tut::groupnames::difference_type d = std::distance(b, e); std::cout << "Registered " << d << " test groups:\n" << std::endl; while (b != e) { std::cout << " " << *b << std::endl; ++b; } } else if (argc == 2 && std::string(argv[1]) != "--list") { tut::check_test_group(argv[1]); tut::runner.get().run_tests(argv[1]); } else if (argc == 3) { tut::check_test_group(argv[1]); tut::test_result result; tut::runner.get().run_test(argv[1], std::atoi(argv[2]), result); } nRetCode = EXIT_SUCCESS; } catch (const std::exception& ex) { std::cerr << "GDAL C/C++ API tests error: " << ex.what() << std::endl; nRetCode = EXIT_FAILURE; } if( !visi.all_ok() ) nRetCode = EXIT_FAILURE; } CSLDestroy(argv); GDALDestroyDriverManager(); OGRCleanupAll(); CPLDumpSharedList( nullptr ); CPLCleanupTLS(); return nRetCode; } gdalautotest-3.0.4/cpp/test_include_from_c_file.c0000644003401500001440000000412313614005367021571 0ustar rouaultusers/****************************************************************************** * Project: GDAL Core * Purpose: Test including all public C headers from a .c file * 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. ****************************************************************************/ // PLEASE DO NOT RENAME THIS FILE AS .cpp !!!!! // since the purpose is to check that the public headers can be included from // C #include "cpl_atomic_ops.h" #include "cpl_conv.h" #include "cpl_csv.h" #include "cpl_error.h" #include "cpl_hash_set.h" #include "cpl_list.h" #include "cpl_minixml.h" #include "cpl_port.h" #include "cpl_progress.h" #include "cpl_quad_tree.h" #include "cpl_vsi.h" #include "gdal_alg.h" #include "gdal_version.h" #include "gdal.h" #include "gdal_utils.h" #include "ogr_api.h" #include "ogr_core.h" #include "ogr_srs_api.h" int main() { return 0; } gdalautotest-3.0.4/cpp/data/0000755003401500001440000000000013614004466015327 5ustar rouaultusersgdalautotest-3.0.4/cpp/data/cint32.tif0000644003401500001440000000672013614004466017142 0ustar rouaultusersII* k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/uint16.tif0000644003401500001440000000216013614004466017160 0ustar rouaultusersII*(k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck S  *ZN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/cfloat64.tif0000644003401500001440000001512013614004466017454 0ustar rouaultusersII*Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@S   :N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/cint16.tif0000644003401500001440000000362013614004466017140 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/uint32.tif0000644003401500001440000000362013614004466017160 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/byte.tif.grd0000644003401500001440000000560413614004466017556 0ustar rouaultusersncols 20 nrows 20 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 107 123 132 115 132 132 140 132 132 132 107 132 107 132 132 107 123 115 156 148 115 132 107 123 148 115 165 115 140 107 123 123 99 132 123 132 132 132 99 156 115 132 140 132 123 115 140 107 140 115 132 123 107 132 132 115 115 107 115 107 148 132 123 123 115 132 132 123 115 123 115 123 107 115 148 107 115 140 115 132 132 156 132 140 132 132 115 115 115 123 148 123 165 123 132 107 107 132 156 123 189 173 173 148 148 115 148 123 107 132 115 132 156 99 123 115 132 132 206 107 197 173 148 140 140 132 99 132 123 115 140 132 132 99 132 123 132 173 123 115 148 123 148 115 148 123 140 123 107 115 132 115 107 115 99 123 99 181 99 107 123 115 132 115 123 132 115 132 132 123 123 132 99 115 99 123 132 115 115 107 140 140 99 140 99 115 123 107 132 107 115 107 115 123 132 123 107 123 132 132 132 132 132 123 99 132 123 107 148 99 115 123 140 173 123 107 123 123 123 107 123 123 123 107 140 123 123 115 115 90 107 173 107 107 107 107 99 132 123 115 173 148 99 123 123 107 123 99 107 189 173 107 115 115 107 99 140 107 173 140 148 132 132 107 123 99 99 115 99 132 99 140 115 148 123 99 132 123 148 140 140 107 140 90 107 115 107 90 99 123 115 115 115 123 123 148 115 148 99 132 165 148 156 123 107 107 107 115 140 99 115 99 99 107 115 132 115 90 123 115 189 173 140 140 165 115 132 90 99 115 90 99 99 107 99 132 99 107 132 132 156 181 140 173 123 132 99 115 123 74 115 99 123 140 156 132 165 140 140 99 173 247 255 206 132 107 140 123 148 132 165 165 148 140 132 123 107 123 107 123 181 181 156 148 156 156 156 181 132 148 115 132 107 107 107 107 107 115 99 107 gdalautotest-3.0.4/cpp/data/do-not-remove0000644003401500001440000000000013614004466017733 0ustar rouaultusersgdalautotest-3.0.4/cpp/data/cfloat32.tif0000644003401500001440000000672013614004466017455 0ustar rouaultusersII* BBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBB@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/float32.tif0000644003401500001440000000362013614004466017306 0ustar rouaultusersII*HBBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBB @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/poly.dbf0000644003401500001440000000102113614004466016761 0ustar rouaultusers_ (AREAN EAS_IDN PRFEDEAC 215229.266 16835043411 247328.172 17935043423 261752.781 17135043414 547597.188 17335043416 15775.758 17235043415 101429.977 16935043412 268597.625 16635043409 1634833.375 15835043369 596610.313 16535043408 5268.813 17035043413 gdalautotest-3.0.4/cpp/data/bug1488.tif0000644003401500001440000014217213614004466017144 0ustar rouaultusersII*  N NQBCDa(bEaSRIFFWEBPVP8 p*>HM%#" ( inv9}rd={퓐'!NCl9}rd={퓐'!NCl9}rd={퓐'!NCl9}rd=€cgdalautotest-3.0.4/cpp/data/float64.tif0000644003401500001440000000672013614004466017317 0ustar rouaultusersII* Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@@ S B Z   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/pixel_per_line.asc0000644003401500001440000000562313614004466021023 0ustar rouaultusersncols 15 nrows 12 xllcorner 0.100000E+06 yllcorner 0.650000E+06 cellsize .500E+02 nodata_value -99999 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .270E+01 .186E+01 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .614E+01 .931E+01 .868E+01 .200E+02 .266E+02 .122E+02 .313E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .162E+02 .542E+02 .944E+02 .953E+02 .977E+02 .833E+02 .505E+02 .144E+02 .209E+01 .000E+00 .000E+00 .000E+00 .000E+00 .199E+01 .170E+02 .784E+02 .173E+03 .266E+03 .332E+03 .264E+03 .230E+03 .120E+03 .415E+02 .941E+01 .801E+00 .240E+02 .000E+00 .410E+01 .177E+02 .116E+03 .303E+03 .562E+03 .756E+03 .759E+03 .618E+03 .309E+03 .171E+03 .603E+02 .792E+02 .254E+03 .242E+03 .483E+00 .678E+01 .529E+02 .212E+03 .585E+03 .108E+04 .140E+04 .128E+04 .817E+03 .436E+03 .219E+03 .275E+03 .890E+03 .145E+04 .158E+04 .000E+00 .307E+01 .162E+02 .141E+03 .435E+03 .862E+03 .109E+04 .889E+03 .559E+03 .289E+03 .296E+03 .116E+04 .245E+04 .332E+04 .309E+04 .000E+00 .000E+00 .516E+01 .296E+02 .128E+03 .245E+03 .305E+03 .223E+03 .119E+03 .472E+02 .517E+03 .173E+04 .289E+04 .345E+04 .309E+04 .000E+00 .000E+00 .000E+00 .266E+01 .107E+02 .192E+02 .146E+02 .182E+02 .805E+01 .378E+02 .442E+03 .165E+04 .274E+04 .280E+04 .214E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .528E+00 .000E+00 .495E+00 .000E+00 .706E+01 .225E+03 .123E+04 .210E+04 .189E+04 .105E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .844E+02 .405E+03 .752E+03 .430E+03 .244E+03 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .577E+02 .350E+02 .196E+02 .503E+01 gdalautotest-3.0.4/cpp/data/poly.shp0000644003401500001440000001074413614004466017034 0ustar rouaultusers'  1A @+RA@eA-RA|FA .-RARA-RA`/IA -RA(GA-RA|FA`-RAGA -RA LA-RA`LA-RA NA-RA )OA-RAQAU-RARAE-RANA .-RA AMAL-RAKMA`^-RA@cMAt-RALA-RANLA-RAKA`-RAJA-RAIA-RA`/IA -RA<A3-RA LA-RA`LA-RA LA-RAGA -RA|FA`-RA(GA-RA`/IA -RA`HA`m-RA GAC-RACAC-RABA C-RAAAB-RA?A4-RA@s?A3-RA M>AU-RA =A@o-RA<Am-RA<Av-RA>A -RA^FA-RA`LA-RA@7>A@,RA@cMA`-RA`/IA -RAIA-RAJA-RAKA`-RANLA-RALA-RA@cMAt-RAKMA`^-RA LA\-RAJAW-RA\JAR-RAGA@0-RA GA--RA sFA&-RAWFA -RAFA-RA EA -RA DA`-RACDA`,RA@@A@,RA@7>A+-RA@s?A3-RA?A4-RAAAB-RABA C-RACAC-RA GAC-RA`HA`m-RA`/IA -RA 1A,RA'AAv-RA<Av-RA<Am-RA@7>A+-RA@@A@,RA'AA@,RA `@A,RA?A ,RA*>A,RA <A,RA:A,RA@s8A ,RA 4A,RA3A`,RA3A ,RA@3A,RA3A,RA4A`,RAl7A-RA t6A -RA`6A-RA5A-RA3A,RA@ 3A,RA 1A3-RA:Ak-RA<Av-RAH<A+-RA@s?A@o-RA<Am-RA =A@o-RA M>AU-RA@s?A3-RA@7>A+-RA<Am-RACDA`,RANA`^-RAKMA`^-RA AMAL-RANA .-RAKA-RAHA-RAGA-RA``FA@ -RA`FA,RACDA`,RA DA`-RA EA -RAFA-RAWFA -RA sFA&-RA GA--RAGA@0-RA\JAR-RAJAW-RA LA\-RAKMA`^-RAKA,RAnWAU-RARAE-RAdTAU-RATA=-RAtUA(-RA@VA-RAWA-RA`2UA -RArTA@-RA TA-RAnWA`,RAVA`,RA`VA,RA`=VA`,RA!UA@,RASA,RA QA@,RA@OA,RAtNA,RA@OA,RAPA ,RAPA,RA@^QA@,RA^QA ,RA PA-RANA-RAwMA-RA,LA-RA@KA-RAKA-RANA .-RARAE-RADA @+RA@eAQ-RA=@VA-RAWA-RAXA%-RA hZA,-RAZA--RAa[A2-RA]AB-RA`]AP-RA@`A 3-RA`,`A"-RAbA 2-RAbA@B-RAcAI-RA dAM-RAdAQ-RAeA<-RA`weA`'-RA@eA`-RAeA-RA@M_A,RA@^A`,RA^A,RA^A,RA^A,RA]A,RA]A ,RA`^A,RA]AZ,RA@]AR,RA?\A`<,RAYA,RA@XA,RAWA +RA9VA+RA@_UA,RAgPA +RAvOA`+RAOA@+RA` OA+RAFPA`+RAPAm+RA`'OAT+RA@IA @+RA IA@D+RAGA`+RADA2,RA@DAC,RAMA ,RA@OA,RA QA@,RASA,RA!UA@,RA`=VA`,RA`VA,RAVA`,RAnWA`,RA TA-RArTA@-RA`2UA -RAWA-RA@VA-RA @@A2,RA^QA-RAHA-RAKA-RA@KA-RA,LA-RAwMA-RANA-RA PA-RA^QA ,RA@^QA@,RAPA,RAPA ,RA@OA,RAtNA,RA@OA,RAMA ,RA@DAC,RADA2,RACA 6,RAKCAU,RA0CA],RABAq,RAAA,RA'AA@,RA@@A@,RACDA`,RA`FA,RAHA-RA @``FA,RAHA-RAHA-RA`FA,RA``FA@ -RAGA-RAHA-RAgdalautotest-3.0.4/cpp/data/utmsmall.tif0000644003401500001440000002417013614004466017675 0ustar rouaultusersII*'k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭Δŵ{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť攽s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ{s{{kssksc{cck{kcccsZ{sksskss{sc{{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌ccs{kksks{{k{kskscskkssks{Zֽ楄{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥc{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭk{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽ŽŭޥεkkZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌksZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭ֜{cs{Jsc{ckkskksŽ{εŵν֭Μks΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό޵skkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭΜ{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޜZckcRss޽έބε業{Z{k{ŽŭŌŵŜŭc{{kޔŽť{{sR{֜{s{{{sֵޥֽs{{{{Zc楜{έ{ŽΔΜc{εk΄省ΜΥsks{{Ō攜֔ŔskޜŔs{εޭńŽ֭ﭥ{֔{{ťs{{Ό޽֭歵Z{ŵŵŌťŽŌ{{sֵŔ޽ssŌsνť挥ť޵޽֔楥{ν{ŵε潔޽朔Υ{ֽŭ֌攔ք{Rkŵޔsks{ZŽ楔ޭs歔掠ť{k{kscsc{ť֜c{kޜs{J{c{Rcs{kΥέŔťŵνΜsk{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{k{{Rk{kZ{RťŭνŵΜŌks{sskck{ֵŜsZŭ֔εŵεJkkss{{s{c{ŌޥŜsk歜֜{޽s֭{{{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔s{s{c{ks{s{s{εέֵ{{ssss{{kskkュ{ssތŌkckckcsksks{{ss{{Ό{sŽ歵{΄֜ބksckkk{{{{sks{{ťck{޵޽{έބkksssssc{kc{ccsބŌcsޥŭs{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŌksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭JkJ{kRZksRkkss֭kcŜksέΥ޽֜Zk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{scscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭Zskss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭kksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽ:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތ:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜s1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{Bkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkc)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:cJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkR!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsZ1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcsBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1Bs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{ZkccBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{dd'Q'S ( '*(b(l@A̞LAN@N@ Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/poly.shx0000644003401500001440000000026413614004466017040 0ustar rouaultusers' Z 1A @+RA@eA-RA2H@gdalautotest-3.0.4/cpp/data/recode-rus.dat0000644003401500001440000002603013614004466020072 0ustar rouaultusersUTF-8Улучшаем интернационализацию GDAL.CP1251 GDAL.KOI8-R GDAL.UCS-2#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UCS-2BE#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UCS-2LE#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UCS-4#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UCS-4BE#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UCS-4LE#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UTF-16#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.UTF-32#;CGH05< 8=B5@=0F8>=0;870F8N GDAL.gdalautotest-3.0.4/cpp/data/pixel_per_line.prj0000644003401500001440000000215413614004466021044 0ustar rouaultusersProjection ALBERS Datum NAD83 Zunits NO Units METERS Spheroid GRS1980 Xshift 0.0000000000 Yshift 0.0000000000 Parameters 61 40 0.000 /* 1st standard parallel 68 0 0.000 /* 2nd standard parallel -132 30 0.000 /* central meridian 59 0 0.000 /* latitude of projection's origin 500000.00000 /* false easting (meters) 500000.00000 /* false northing (meters) gdalautotest-3.0.4/cpp/data/test.json0000644003401500001440000000567513614004466017216 0ustar rouaultusers{ "resource": { "id": 0, "cls": "resource_group", "parent": null, "owner_user": { "id": 4 }, "permissions": [ { "action": "allow", "principal": { "id": 5 }, "identity": "", "scope": "", "permission": "", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "resource", "permission": "read", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "metadata", "permission": "read", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "datastruct", "permission": "read", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "data", "permission": "read", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "connection", "permission": "connect", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "service", "permission": "connect", "propagate": true }, { "action": "allow", "principal": { "id": 2 }, "identity": "", "scope": "webmap", "permission": "display", "propagate": true }, { "action": "allow", "principal": { "id": 7 }, "identity": "", "scope": "data", "permission": "write", "propagate": true } ], "keyname": null, "display_name": "Main resources group", "description": null, "children": true, "interfaces": [], "scopes": [ "resource", "metadata" ] }, "resmeta": { "items": {} } } gdalautotest-3.0.4/cpp/data/byte.tif0000644003401500001440000000134013614004466016774 0ustar rouaultusersII*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.0.4/cpp/data/int32.tif0000644003401500001440000000362013614004466016773 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/data/n43.dt00000644003401500001440000010256213614004466016352 0ustar rouaultusersUHL10800000W0430000N030003000200U 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.0.4/cpp/data/int16.tif0000644003401500001440000000216013614004466016773 0ustar rouaultusersII*(k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck S  *ZN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/cpp/testvirtualmem.cpp0000644003401500001440000002303313614005367020211 0ustar rouaultusers/****************************************************************************** * $Id: testvirtualmem.cpp fea98cfa8bed15686abed8256ef1566f68e1568d 2017-12-28 17:57:32Z Even Rouault $ * * Project: GDAL algorithms * Purpose: Test Delaunay triangulation * Author: Even Rouault, even.rouault at spatialys.com * ****************************************************************************** * 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. ****************************************************************************/ #include "cpl_multiproc.h" #include "cpl_string.h" #include "cpl_virtualmem.h" #include "gdal_alg.h" #include "gdal.h" #include #ifdef notdef static void test_huge_mapping_cbk(CPLVirtualMem* ctxt, size_t nOffset, void* pPageToFill, size_t nPageSize, void* pUserData) { /*fprintfstderr("requesting page %lu (nPageSize=%d), nLRUSize=%d\n", (unsigned long)(nOffset / nPageSize), (int)nPageSize, ctxt->nLRUSize);*/ memset(pPageToFill, 0x7F, nPageSize); } static void test_huge_mapping() { CPLVirtualMem* ctxt; char* addr; int i; ctxt = CPLVirtualMemNew((size_t)10000*1024*1024, (size_t)2000*1024*1024, 0, TRUE, VIRTUALMEM_READONLY, test_huge_mapping_cbk, NULL, NULL, NULL); assert(ctxt); addr = (char*) CPLVirtualMemGetAddr(ctxt); for(i=0;i<50*1000;i++) { unsigned int seedp; size_t idx = (size_t)rand_r(&seedp)*3000*1024 / RAND_MAX * 1024; char val = addr[idx]; /*printf("i=%d, val[%ld] = %d\n", i, (long int)idx, val);*/ assert(val == 0x7F); } CPLVirtualMemFree(ctxt); } #endif #include "test_data.h" static void test_two_pages_cbk(CPLVirtualMem* /* ctxt */, size_t nOffset, void* pPageToFill, size_t nPageSize, void* /* pUserData */) { /*fprintfstderr("requesting page %lu (nPageSize=%d), nLRUSize=%d\n", (unsigned long)(nOffset / nPageSize), (int)nPageSize, ctxt->nLRUSize);*/ memset(pPageToFill, (nOffset == 0) ? 0x3F : (nOffset == 4096) ? 0x5F : 0x7F, nPageSize); } #define MINIMUM_PAGE_SIZE 4096 static void test_two_pages_thread(void* p) { CPLVirtualMem* ctxt = (CPLVirtualMem*)p; char* addr = (char*) CPLVirtualMemGetAddr(ctxt); int i; CPLVirtualMemDeclareThread(ctxt); /*fprintfstderr("aux thread is %X\n", pthread_self());*/ for(i=0;i<50*1000;i++) { char val = addr[MINIMUM_PAGE_SIZE * (i % 3) + MINIMUM_PAGE_SIZE/2 - 1]; /*fprintfstderr("T2: val[%d] = %d\n", MINIMUM_PAGE_SIZE * (i % 2) + MINIMUM_PAGE_SIZE/2 - 1, val);*/ assert(val == (((i % 3) == 0) ? 0x3F : ((i % 3) == 1) ? 0x5F : 0x7F)); } CPLVirtualMemUnDeclareThread(ctxt); } static int test_two_pages() { CPLVirtualMem* ctxt; volatile char* addr; CPLJoinableThread* hThread; printf("test_two_pages()\n"); ctxt = CPLVirtualMemNew(3*MINIMUM_PAGE_SIZE, MINIMUM_PAGE_SIZE, MINIMUM_PAGE_SIZE, FALSE, VIRTUALMEM_READONLY, test_two_pages_cbk, nullptr, nullptr, nullptr); if( ctxt == nullptr ) return FALSE; addr = (char*) CPLVirtualMemGetAddr(ctxt); assert(CPLVirtualMemGetPageSize(ctxt) == MINIMUM_PAGE_SIZE); assert(CPLVirtualMemIsAccessThreadSafe(ctxt)); /*fprintfstderr("main thread is %X, addr=%p\n", pthread_self(), addr);*/ hThread = CPLCreateJoinableThread(test_two_pages_thread, ctxt); CPLVirtualMemDeclareThread(ctxt); { int i=0; for(i=0;i<50*1000;i++) { char val = addr[MINIMUM_PAGE_SIZE * (i % 3)]; /*fprintfstderr("T1: val[%d] = %d\n", MINIMUM_PAGE_SIZE * (i % 2), val);*/ assert(val == (((i % 3) == 0) ? 0x3F : ((i % 3) == 1) ? 0x5F : 0x7F)); } } CPLVirtualMemUnDeclareThread(ctxt); CPLJoinThread(hThread); CPLVirtualMemFree(ctxt); return TRUE; } static void test_raw_auto(const char* pszFormat, int bFileMapping) { printf("test_raw_auto(format=%s, bFileMapping=%d)\n", pszFormat, bFileMapping); GDALAllRegister(); CPLString osTmpFile; if( bFileMapping ) osTmpFile = CPLResetExtension(CPLGenerateTempFilename(pszFormat), "img"); else osTmpFile = "/vsimem/tmp.img"; GDALDatasetH hDS = GDALCreate(GDALGetDriverByName(pszFormat), osTmpFile.c_str(), 400, 300, 2, GDT_Byte, nullptr ); assert(hDS); int nPixelSpace1; GIntBig nLineSpace1; int nPixelSpace2; GIntBig nLineSpace2; if( !bFileMapping ) { char** papszOptions = CSLSetNameValue(nullptr, "USE_DEFAULT_IMPLEMENTATION", "NO" ); assert( GDALGetVirtualMemAuto(GDALGetRasterBand(hDS, 1), GF_Write, &nPixelSpace1, &nLineSpace1, papszOptions) == nullptr ); CSLDestroy(papszOptions); } CPLVirtualMem* pVMem1 = GDALGetVirtualMemAuto(GDALGetRasterBand(hDS, 1), GF_Write, &nPixelSpace1, &nLineSpace1, nullptr); char** papszOptions = CSLSetNameValue(nullptr, "USE_DEFAULT_IMPLEMENTATION", (bFileMapping) ? "NO" : "YES"); CPLVirtualMem* pVMem2 = GDALGetVirtualMemAuto(GDALGetRasterBand(hDS, 2), GF_Write, &nPixelSpace2, &nLineSpace2, papszOptions); CSLDestroy(papszOptions); assert(pVMem1 != nullptr); assert(pVMem2 != nullptr); assert(CPLVirtualMemIsFileMapping(pVMem1) == bFileMapping); assert(nPixelSpace1 == ((EQUAL(pszFormat, "GTIFF") && bFileMapping) ? 2 : 1)); if( bFileMapping ) assert(nLineSpace1 == 400 * 2); else assert(nLineSpace1 == 400 * nPixelSpace1); GByte* pBase1 = (GByte*) CPLVirtualMemGetAddr(pVMem1); GByte* pBase2 = (GByte*) CPLVirtualMemGetAddr(pVMem2); for(int j=0;j<300;j++) { for(int i=0;i<400;i++) { pBase1[j * nLineSpace1 + i * nPixelSpace1] = 127; pBase2[j * nLineSpace2 + i * nPixelSpace2] = 255; } } CPLVirtualMemFree(pVMem1); CPLVirtualMemFree(pVMem2); GDALClose(hDS); hDS = GDALOpen(osTmpFile.c_str(), GA_ReadOnly); assert(GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0, 400, 300) == 52906); assert(GDALChecksumImage(GDALGetRasterBand(hDS, 2), 0, 0, 400, 300) == 30926); GDALClose(hDS); GDALDeleteDataset(nullptr, osTmpFile.c_str()); } int main(int /* argc */, char* /* argv */[]) { /*printf("test_huge_mapping\n"); test_huge_mapping();*/ printf("Physical memory : " CPL_FRMT_GIB " bytes\n", CPLGetPhysicalRAM()); if( CPLIsVirtualMemFileMapAvailable() ) { printf("Testing CPLVirtualMemFileMapNew()\n"); VSILFILE* fp = VSIFOpenL(GCORE_DATA_DIR "byte.tif", "rb"); assert(fp); VSIFSeekL(fp, 0, SEEK_END); size_t nSize = (size_t)VSIFTellL(fp); VSIFSeekL(fp, 0, SEEK_SET); void* pRefBuf = CPLMalloc(nSize); VSIFReadL(pRefBuf, 1, nSize, fp); CPLVirtualMem * psMem = CPLVirtualMemFileMapNew( fp, 0, nSize, VIRTUALMEM_READONLY, nullptr, nullptr ); assert(psMem); void* pMemBuf = CPLVirtualMemGetAddr(psMem); assert(memcmp(pRefBuf, pMemBuf, nSize) == 0); CPLFree(pRefBuf); CPLVirtualMemFree(psMem); VSIFCloseL(fp); } if( !test_two_pages() ) return 0; test_raw_auto("EHDR", TRUE); test_raw_auto("EHDR", FALSE); test_raw_auto("GTIFF", TRUE); test_raw_auto("GTIFF", FALSE); CPLVirtualMemManagerTerminate(); GDALDestroyDriverManager(); return 0; } gdalautotest-3.0.4/cpp/test_ogr.cpp0000644003401500001440000015226213614005367016761 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test general OGR features. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "ogr_p.h" #include "ogrsf_frmts.h" #include "../../gdal/ogr/ogrsf_frmts/osm/gpb.h" #include namespace tut { // Common fixture with test data struct test_ogr_data { // Expected number of drivers GDALDriverManager* drv_reg_; int drv_count_; std::string drv_shape_; bool has_geos_support_; std::string data_; std::string data_tmp_; test_ogr_data() : drv_reg_(nullptr), drv_count_(0), drv_shape_("ESRI Shapefile"), data_(tut::common::data_basedir), data_tmp_(tut::common::tmp_basedir) { drv_reg_ = GetGDALDriverManager(); // Windows CE port builds with fixed number of drivers #ifdef OGR_ENABLED #ifdef CSV_ENABLED drv_count_++; #endif #ifdef GML_ENABLED drv_count_++; #endif #ifdef SHAPE_ENABLED drv_count_++; #endif #ifdef SQLITE_ENABLED drv_count_++; #endif #ifdef TAB_ENABLED drv_count_++; #endif #endif /* OGR_ENABLED */ } }; // Register test group typedef test_group group; typedef group::object object; group test_ogr_group("OGR"); // Test OGR driver registrar access template<> template<> void object::test<1>() { ensure("GetGDALDriverManager() is NULL", nullptr != drv_reg_); } // Test if Shapefile driver is registered template<> template<> void object::test<3>() { GDALDriverManager* manager = GetGDALDriverManager(); ensure(nullptr != manager); GDALDriver* drv = manager->GetDriverByName(drv_shape_.c_str()); ensure("Shapefile driver is not registered", nullptr != drv); } template void testSpatialReferenceLeakOnCopy(OGRSpatialReference* poSRS) { ensure("GetReferenceCount expected to be 1 before copies", 1 == poSRS->GetReferenceCount()); { int nCurCount; int nLastCount = 1; T value; value.assignSpatialReference(poSRS); nCurCount = poSRS->GetReferenceCount(); ensure("SRS reference count not incremented by assignSpatialReference", nCurCount > nLastCount ); nLastCount = nCurCount; T value2(value); nCurCount = poSRS->GetReferenceCount(); ensure("SRS reference count not incremented by copy constructor", nCurCount > nLastCount ); nLastCount = nCurCount; T value3; value3 = value; nCurCount = poSRS->GetReferenceCount(); ensure("SRS reference count not incremented by assignment operator", nCurCount > nLastCount ); nLastCount = nCurCount; value3 = value; ensure( "SRS reference count incremented by assignment operator", nLastCount == poSRS->GetReferenceCount() ); } ensure( "GetReferenceCount expected to be decremented by destructors", 1 == poSRS->GetReferenceCount() ); } // Test if copy does not leak or double delete the spatial reference template<> template<> void object::test<4>() { OGRSpatialReference* poSRS = new OGRSpatialReference(); ensure(nullptr != poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); testSpatialReferenceLeakOnCopy(poSRS); delete poSRS; } template T* make(); template<> OGRPoint* make() { return new OGRPoint(1.0, 2.0, 3.0); } template<> OGRLineString* make() { OGRLineString* poLineString = new OGRLineString(); poLineString->addPoint(1.0, 2.0, 3.0); poLineString->addPoint(1.1, 2.1, 3.1); poLineString->addPoint(1.2, 2.2, 3.2); return poLineString; } template<> OGRLinearRing* make() { OGRLinearRing* poLinearRing = new OGRLinearRing(); poLinearRing->addPoint(1.0, 2.0, 3.0); poLinearRing->addPoint(1.1, 2.1, 3.1); poLinearRing->addPoint(1.2, 2.2, 3.2); poLinearRing->addPoint(1.0, 2.0, 3.0); return poLinearRing; } template<> OGRCircularString* make() { OGRCircularString* poCircularString = new OGRCircularString(); poCircularString->addPoint(1.0, 2.0, 3.0); poCircularString->addPoint(1.1, 2.1, 3.1); poCircularString->addPoint(1.2, 2.2, 3.2); return poCircularString; } template<> OGRCompoundCurve* make() { OGRCompoundCurve* poCompoundCurve = new OGRCompoundCurve(); poCompoundCurve->addCurveDirectly(make()); OGRCircularString* poCircularString = make(); poCircularString->reversePoints(); poCompoundCurve->addCurveDirectly(poCircularString); return poCompoundCurve; } template<> OGRCurvePolygon* make() { OGRCurvePolygon* poCurvePolygon = new OGRCurvePolygon(); poCurvePolygon->addRingDirectly(make()); poCurvePolygon->addRingDirectly(make()); return poCurvePolygon; } template<> OGRPolygon* make() { OGRPolygon* poPolygon = new OGRPolygon(); poPolygon->addRingDirectly(make()); poPolygon->addRingDirectly(make()); return poPolygon; } template<> OGRGeometryCollection* make() { OGRGeometryCollection* poCollection = new OGRGeometryCollection(); poCollection->addGeometryDirectly(make()); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRMultiSurface* make() { OGRMultiSurface* poCollection = new OGRMultiSurface(); poCollection->addGeometryDirectly(make()); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRMultiPolygon* make() { OGRMultiPolygon* poCollection = new OGRMultiPolygon(); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRMultiPoint* make() { OGRMultiPoint* poCollection = new OGRMultiPoint(); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRMultiCurve* make() { OGRMultiCurve* poCollection = new OGRMultiCurve(); poCollection->addGeometryDirectly(make()); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRMultiLineString* make() { OGRMultiLineString* poCollection = new OGRMultiLineString(); poCollection->addGeometryDirectly(make()); poCollection->addGeometryDirectly(make()); return poCollection; } template<> OGRTriangle* make() { OGRPoint p1(0, 0), p2(0, 1), p3(1, 1); return new OGRTriangle(p1, p2, p3); } template<> OGRTriangulatedSurface* make() { OGRTriangulatedSurface* poTS = new OGRTriangulatedSurface(); poTS->addGeometryDirectly(make()); return poTS; } template<> OGRPolyhedralSurface* make() { OGRPolyhedralSurface* poPS = new OGRPolyhedralSurface(); poPS->addGeometryDirectly(make()); return poPS; } template void testCopyEquals() { T* poOrigin = make(); ensure( nullptr != poOrigin); T value2( *poOrigin ); std::ostringstream strErrorCopy; strErrorCopy << poOrigin->getGeometryName() << ": copy constructor changed a value"; ensure(strErrorCopy.str().c_str(), CPL_TO_BOOL(poOrigin->Equals(&value2))); T value3; value3 = *poOrigin; value3 = *poOrigin; auto& value3Ref(value3); value3 = value3Ref; std::ostringstream strErrorAssign; strErrorAssign << poOrigin->getGeometryName() << ": assignment operator changed a value"; #ifdef DEBUG_VERBOSE char* wkt1 = NULL, *wkt2 = NULL; poOrigin->exportToWkt(&wkt1); value3.exportToWkt(&wkt2); printf("%s %s\n", wkt1, wkt2); CPLFree(wkt1); CPLFree(wkt2); #endif ensure(strErrorAssign.str().c_str(), CPL_TO_BOOL(poOrigin->Equals(&value3))); OGRGeometryFactory::destroyGeometry(poOrigin); } // Test if copy constructor and assignment operators succeeds on copying the geometry data template<> template<> void object::test<5>() { testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); testCopyEquals(); } template<> template<> void object::test<6>() { { OGRPoint p; double x = 1, y = 2; OGR_G_SetPoints( (OGRGeometryH)&p, 1, &x, 0, &y, 0, nullptr, 0 ); ensure_equals(p.getCoordinateDimension(), 2); ensure_equals(p.getX(), 1); ensure_equals(p.getY(), 2); ensure_equals(p.getZ(), 0); } { OGRPoint p; double x = 1, y = 2, z = 3; OGR_G_SetPoints( (OGRGeometryH)&p, 1, &x, 0, &y, 0, &z, 0 ); ensure_equals(p.getCoordinateDimension(), 3); ensure_equals(p.getX(), 1); ensure_equals(p.getY(), 2); ensure_equals(p.getZ(), 3); } { OGRPoint p; CPLPushErrorHandler(CPLQuietErrorHandler); OGR_G_SetPoints( (OGRGeometryH)&p, 1, nullptr, 0, nullptr, 0, nullptr, 0 ); CPLPopErrorHandler(); } { OGRLineString ls; double x = 1, y = 2; OGR_G_SetPoints( (OGRGeometryH)&ls, 1, &x, 0, &y, 0, nullptr, 0 ); ensure_equals(ls.getCoordinateDimension(), 2); ensure_equals(ls.getX(0), 1); ensure_equals(ls.getY(0), 2); ensure_equals(ls.getZ(0), 0); } { OGRLineString ls; double x = 1, y = 2; OGR_G_SetPoints( (OGRGeometryH)&ls, 1, &x, 0, &y, 0, nullptr, 0 ); ensure_equals(ls.getCoordinateDimension(), 2); ensure_equals(ls.getX(0), 1); ensure_equals(ls.getY(0), 2); ensure_equals(ls.getZ(0), 0); } { OGRLineString ls; double x = 1, y = 2; OGR_G_SetPoints( (OGRGeometryH)&ls, 1, &x, 8, &y, 8, nullptr, 0 ); ensure_equals(ls.getCoordinateDimension(), 2); ensure_equals(ls.getX(0), 1); ensure_equals(ls.getY(0), 2); ensure_equals(ls.getZ(0), 0); } { OGRLineString ls; double x = 1, y = 2, z = 3; OGR_G_SetPoints( (OGRGeometryH)&ls, 1, &x, 0, &y, 0, &z, 0 ); ensure_equals(ls.getCoordinateDimension(), 3); ensure_equals(ls.getX(0), 1); ensure_equals(ls.getY(0), 2); ensure_equals(ls.getZ(0), 3); } { OGRLineString ls; double x = 1, y = 2, z = 3; OGR_G_SetPoints( (OGRGeometryH)&ls, 1, &x, 8, &y, 8, &z, 8 ); ensure_equals(ls.getCoordinateDimension(), 3); ensure_equals(ls.getX(0), 1); ensure_equals(ls.getY(0), 2); ensure_equals(ls.getZ(0), 3); } { OGRLineString ls; CPLPushErrorHandler(CPLQuietErrorHandler); OGR_G_SetPoints( (OGRGeometryH)&ls, 1, nullptr, 0, nullptr, 0, nullptr, 0 ); CPLPopErrorHandler(); } } template<> template<> void object::test<7>() { OGRStyleMgrH hSM = OGR_SM_Create(nullptr); OGR_SM_InitStyleString(hSM, "PEN(w:2px,c:#000000,id:\"mapinfo-pen-2,ogr-pen-0\")"); OGRStyleToolH hTool = OGR_SM_GetPart(hSM, 0, nullptr); int bValueIsNull; ensure_distance(OGR_ST_GetParamDbl(hTool, OGRSTPenWidth, &bValueIsNull), 2.0 * (1.0 / (72.0 * 39.37)) * 1000, 1e-6); ensure_equals(OGR_ST_GetUnit(hTool), OGRSTUMM); OGR_ST_SetUnit(hTool, OGRSTUPixel, 1.0); ensure_equals(OGR_ST_GetParamDbl(hTool, OGRSTPenWidth, &bValueIsNull), 2.0); ensure_equals(OGR_ST_GetUnit(hTool), OGRSTUPixel); OGR_ST_Destroy(hTool); OGR_SM_Destroy(hSM); } template<> template<> void object::test<8>() { OGRField sField; ensure_equals(OGRParseDate("2017/11/31 12:34:56", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 2017); ensure_equals(sField.Date.Month, 11); ensure_equals(sField.Date.Day, 31); ensure_equals(sField.Date.Hour, 12); ensure_equals(sField.Date.Minute, 34); ensure_equals(sField.Date.Second, 56.0f); ensure_equals(sField.Date.TZFlag, 0); ensure_equals(OGRParseDate("2017/11/31 12:34:56+00", &sField, 0), TRUE); ensure_equals(sField.Date.TZFlag, 100); ensure_equals(OGRParseDate("2017/11/31 12:34:56+12:00", &sField, 0), TRUE); ensure_equals(sField.Date.TZFlag, 100 + 12 * 4); ensure_equals(OGRParseDate("2017/11/31 12:34:56+1200", &sField, 0), TRUE); ensure_equals(sField.Date.TZFlag, 100 + 12 * 4); ensure_equals(OGRParseDate("2017/11/31 12:34:56+815", &sField, 0), TRUE); ensure_equals(sField.Date.TZFlag, 100 + 8 * 4 + 1); ensure_equals(OGRParseDate("2017/11/31 12:34:56-12:00", &sField, 0), TRUE); ensure_equals(sField.Date.TZFlag, 100 - 12 * 4); ensure_equals(OGRParseDate(" 2017/11/31 12:34:56", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 2017); ensure_equals(OGRParseDate("2017/11/31 12:34:56.789", &sField, 0), TRUE); ensure_equals(sField.Date.Second, 56.789f); // Leap second ensure_equals(OGRParseDate("2017/11/31 12:34:60", &sField, 0), TRUE); ensure_equals(sField.Date.Second, 60.0f); ensure_equals(OGRParseDate("2017-11-31T12:34:56", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 2017); ensure_equals(sField.Date.Month, 11); ensure_equals(sField.Date.Day, 31); ensure_equals(sField.Date.Hour, 12); ensure_equals(sField.Date.Minute, 34); ensure_equals(sField.Date.Second, 56.0f); ensure_equals(sField.Date.TZFlag, 0); ensure_equals(OGRParseDate("2017-11-31T12:34:56Z", &sField, 0), TRUE); ensure_equals(sField.Date.Second, 56.0f); ensure_equals(sField.Date.TZFlag, 100); ensure_equals(OGRParseDate("2017-11-31T12:34:56.789Z", &sField, 0), TRUE); ensure_equals(sField.Date.Second, 56.789f); ensure_equals(sField.Date.TZFlag, 100); ensure_equals(OGRParseDate("2017-11-31", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 2017); ensure_equals(sField.Date.Month, 11); ensure_equals(sField.Date.Day, 31); ensure_equals(sField.Date.Hour, 0); ensure_equals(sField.Date.Minute, 0); ensure_equals(sField.Date.Second, 0.0f); ensure_equals(sField.Date.TZFlag, 0); ensure_equals(OGRParseDate("2017-11-31Z", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 2017); ensure_equals(sField.Date.Month, 11); ensure_equals(sField.Date.Day, 31); ensure_equals(sField.Date.Hour, 0); ensure_equals(sField.Date.Minute, 0); ensure_equals(sField.Date.Second, 0.0f); ensure_equals(sField.Date.TZFlag, 0); ensure_equals(OGRParseDate("12:34", &sField, 0), TRUE); ensure_equals(sField.Date.Year, 0); ensure_equals(sField.Date.Month, 0); ensure_equals(sField.Date.Day, 0); ensure_equals(sField.Date.Hour, 12); ensure_equals(sField.Date.Minute, 34); ensure_equals(sField.Date.Second, 0.0f); ensure_equals(sField.Date.TZFlag, 0); ensure_equals(OGRParseDate("12:34:56", &sField, 0), TRUE); ensure_equals(OGRParseDate("12:34:56.789", &sField, 0), TRUE); ensure(!OGRParseDate("2017", &sField, 0)); ensure(!OGRParseDate("12:", &sField, 0)); ensure(!OGRParseDate("2017-a-31T12:34:56", &sField, 0)); ensure(!OGRParseDate("2017-00-31T12:34:56", &sField, 0)); ensure(!OGRParseDate("2017-13-31T12:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-00T12:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-aT12:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-32T12:34:56", &sField, 0)); ensure(!OGRParseDate("a:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-01Ta:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-01T25:34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-01T00:a:00", &sField, 0)); ensure(!OGRParseDate("2017-01-01T00: 34:56", &sField, 0)); ensure(!OGRParseDate("2017-01-01T00:61:00", &sField, 0)); ensure(!OGRParseDate("2017-01-01T00:00:61", &sField, 0)); ensure(!OGRParseDate("2017-01-01T00:00:a", &sField, 0)); } // Test OGRPolygon::IsPointOnSurface() template<> template<> void object::test<9>() { OGRPolygon oPoly; OGRPoint oEmptyPoint; ensure( !oPoly.IsPointOnSurface(&oEmptyPoint) ); OGRPoint oPoint; oPoint.setX(1); oPoint.setY(1); ensure( !oPoly.IsPointOnSurface(&oPoint) ); const char* pszPoly = "POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))"; oPoly.importFromWkt(&pszPoly); ensure( !oPoly.IsPointOnSurface(&oEmptyPoint) ); ensure_equals( oPoly.IsPointOnSurface(&oPoint), TRUE ); oPoint.setX(5); oPoint.setY(5); ensure( !oPoly.IsPointOnSurface(&oPoint) ); } // Test gpb.h template<> template<> void object::test<10>() { ensure_equals( GetVarUIntSize(0), 1 ); ensure_equals( GetVarUIntSize(127), 1 ); ensure_equals( GetVarUIntSize(128), 2 ); ensure_equals( GetVarUIntSize((1 << 14) - 1), 2 ); ensure_equals( GetVarUIntSize(1 << 14), 3 ); ensure_equals( GetVarUIntSize(GUINT64_MAX), 10 ); ensure_equals( GetVarIntSize(0), 1 ); ensure_equals( GetVarIntSize(127), 1 ); ensure_equals( GetVarIntSize(128), 2 ); ensure_equals( GetVarIntSize((1 << 14) - 1), 2 ); ensure_equals( GetVarIntSize(1 << 14), 3 ); ensure_equals( GetVarIntSize(GINT64_MAX), 9 ); ensure_equals( GetVarIntSize(-1), 10 ); ensure_equals( GetVarIntSize(GINT64_MIN), 10 ); ensure_equals( GetVarSIntSize(0), 1 ); ensure_equals( GetVarSIntSize(63), 1 ); ensure_equals( GetVarSIntSize(64), 2 ); ensure_equals( GetVarSIntSize(-1), 1 ); ensure_equals( GetVarSIntSize(-64), 1 ); ensure_equals( GetVarSIntSize(-65), 2 ); ensure_equals( GetVarSIntSize(GINT64_MIN), 10 ); ensure_equals( GetVarSIntSize(GINT64_MAX), 10 ); ensure_equals( GetTextSize(""), 1 ); ensure_equals( GetTextSize(" "), 2 ); ensure_equals( GetTextSize(std::string(" ")), 2 ); GByte abyBuffer[11] = { 0 }; GByte* pabyBuffer; const GByte* pabyBufferRO; pabyBuffer = abyBuffer; WriteVarUInt(&pabyBuffer, 0); ensure_equals(pabyBuffer - abyBuffer, 1); pabyBufferRO = abyBuffer; ensure_equals(ReadVarUInt64(&pabyBufferRO), 0U); pabyBuffer = abyBuffer; WriteVarUInt(&pabyBuffer, 127); ensure_equals(pabyBuffer - abyBuffer, 1); pabyBufferRO = abyBuffer; ensure_equals(ReadVarUInt64(&pabyBufferRO), 127U); pabyBuffer = abyBuffer; WriteVarUInt(&pabyBuffer, 0xDEADBEEFU); ensure_equals(pabyBuffer - abyBuffer, 5); pabyBufferRO = abyBuffer; ensure_equals(ReadVarUInt64(&pabyBufferRO), 0xDEADBEEFU); pabyBuffer = abyBuffer; WriteVarUInt(&pabyBuffer, GUINT64_MAX); ensure_equals(pabyBuffer - abyBuffer, 10); pabyBufferRO = abyBuffer; ensure_equals(ReadVarUInt64(&pabyBufferRO), GUINT64_MAX); pabyBuffer = abyBuffer; WriteVarInt(&pabyBuffer, GINT64_MAX); ensure_equals(pabyBuffer - abyBuffer, 9); pabyBufferRO = abyBuffer; ensure_equals(ReadVarInt64(&pabyBufferRO), GINT64_MAX); pabyBuffer = abyBuffer; WriteVarInt(&pabyBuffer, -1); ensure_equals(pabyBuffer - abyBuffer, 10); pabyBufferRO = abyBuffer; ensure_equals(ReadVarInt64(&pabyBufferRO), -1); pabyBuffer = abyBuffer; WriteVarInt(&pabyBuffer, GINT64_MIN); ensure_equals(pabyBuffer - abyBuffer, 10); pabyBufferRO = abyBuffer; ensure_equals(ReadVarInt64(&pabyBufferRO), GINT64_MIN); pabyBuffer = abyBuffer; WriteVarSInt(&pabyBuffer, 0); ensure_equals(pabyBuffer - abyBuffer, 1); { GIntBig nVal; pabyBufferRO = abyBuffer; READ_VARSINT64(pabyBufferRO, abyBuffer + 10, nVal); ensure_equals(nVal, 0); } pabyBuffer = abyBuffer; WriteVarSInt(&pabyBuffer, 1); ensure_equals(pabyBuffer - abyBuffer, 1); { GIntBig nVal; pabyBufferRO = abyBuffer; READ_VARSINT64(pabyBufferRO, abyBuffer + 10, nVal); ensure_equals(nVal, 1); } pabyBuffer = abyBuffer; WriteVarSInt(&pabyBuffer, -1); ensure_equals(pabyBuffer - abyBuffer, 1); { GIntBig nVal; pabyBufferRO = abyBuffer; READ_VARSINT64(pabyBufferRO, abyBuffer + 10, nVal); ensure_equals(nVal, -1); } pabyBuffer = abyBuffer; WriteVarSInt(&pabyBuffer, GINT64_MAX); ensure_equals(pabyBuffer - abyBuffer, 10); { GIntBig nVal; pabyBufferRO = abyBuffer; READ_VARSINT64(pabyBufferRO, abyBuffer + 10, nVal); ensure_equals(nVal, GINT64_MAX); } pabyBuffer = abyBuffer; WriteVarSInt(&pabyBuffer, GINT64_MIN); ensure_equals(pabyBuffer - abyBuffer, 10); { GIntBig nVal; pabyBufferRO = abyBuffer; READ_VARSINT64(pabyBufferRO, abyBuffer + 10, nVal); ensure_equals(nVal, GINT64_MIN); } pabyBuffer = abyBuffer; WriteText(&pabyBuffer, "x"); ensure_equals(pabyBuffer - abyBuffer, 2); ensure_equals(abyBuffer[0], 1); ensure_equals(abyBuffer[1], 'x'); pabyBuffer = abyBuffer; WriteText(&pabyBuffer, std::string("x")); ensure_equals(pabyBuffer - abyBuffer, 2); ensure_equals(abyBuffer[0], 1); ensure_equals(abyBuffer[1], 'x'); pabyBuffer = abyBuffer; WriteFloat32(&pabyBuffer, 1.25f); ensure_equals(pabyBuffer - abyBuffer, 4); pabyBufferRO = abyBuffer; ensure_equals(ReadFloat32(&pabyBufferRO, abyBuffer + 4), 1.25f); pabyBuffer = abyBuffer; WriteFloat64(&pabyBuffer, 1.25); ensure_equals(pabyBuffer - abyBuffer, 8); pabyBufferRO = abyBuffer; ensure_equals(ReadFloat64(&pabyBufferRO, abyBuffer + 8), 1.25); } // Test OGRGeometry::toXXXXX() template<> template<> void object::test<11>() { #define CONCAT(X,Y) X##Y #define TEST_OGRGEOMETRY_TO(X) { \ CONCAT(OGR,X) o; \ OGRGeometry* poGeom = &o; \ ensure_equals( poGeom->CONCAT(to,X)(), &o ); } TEST_OGRGEOMETRY_TO(Point); TEST_OGRGEOMETRY_TO(LineString); TEST_OGRGEOMETRY_TO(LinearRing); TEST_OGRGEOMETRY_TO(CircularString); TEST_OGRGEOMETRY_TO(CompoundCurve); TEST_OGRGEOMETRY_TO(CurvePolygon); TEST_OGRGEOMETRY_TO(Polygon); TEST_OGRGEOMETRY_TO(GeometryCollection); TEST_OGRGEOMETRY_TO(MultiSurface); TEST_OGRGEOMETRY_TO(MultiPolygon); TEST_OGRGEOMETRY_TO(MultiPoint); TEST_OGRGEOMETRY_TO(MultiCurve); TEST_OGRGEOMETRY_TO(MultiLineString); TEST_OGRGEOMETRY_TO(Triangle); TEST_OGRGEOMETRY_TO(PolyhedralSurface); TEST_OGRGEOMETRY_TO(TriangulatedSurface); { OGRLineString o; OGRGeometry* poGeom = &o; ensure_equals( poGeom->toCurve(), &o ); } { OGRPolygon o; OGRGeometry* poGeom = &o; ensure_equals( poGeom->toSurface(), &o ); } } template void TestIterator(T* obj, int nExpectedPointCount) { int nCount = 0; for( auto& elt: obj ) { nCount ++; CPL_IGNORE_RET_VAL(elt); } ensure_equals(nCount, nExpectedPointCount); nCount = 0; const T* const_obj(obj); for( const auto& elt: const_obj) { nCount ++; CPL_IGNORE_RET_VAL(elt); } ensure_equals(nCount, nExpectedPointCount); } template void TestIterator( const char* pszWKT = nullptr, int nExpectedPointCount = 0) { Concrete obj; if( pszWKT ) { obj.importFromWkt(&pszWKT); } TestIterator(&obj, nExpectedPointCount); } // Test geometry visitor template<> template<> void object::test<12>() { static const struct { const char* pszWKT; int nExpectedPointCount; } asTests[] = { { "POINT(0 0)", 1}, { "LINESTRING(0 0)", 1}, { "POLYGON((0 0),(0 0))", 2}, { "MULTIPOINT(0 0)", 1}, { "MULTILINESTRING((0 0))", 1}, { "MULTIPOLYGON(((0 0)))", 1}, { "GEOMETRYCOLLECTION(POINT(0 0))", 1}, { "CIRCULARSTRING(0 0,1 1,0 0)", 3}, { "COMPOUNDCURVE((0 0,1 1))", 2}, { "CURVEPOLYGON((0 0,1 1,1 0,0 0))", 4}, { "MULTICURVE((0 0))", 1}, { "MULTISURFACE(((0 0)))", 1}, { "TRIANGLE((0 0,0 1,1 1,0 0))", 4}, { "POLYHEDRALSURFACE(((0 0,0 1,1 1,0 0)))", 4}, { "TIN(((0 0,0 1,1 1,0 0)))", 4}, }; class PointCounterVisitor: public OGRDefaultGeometryVisitor { int m_nPoints = 0; public: PointCounterVisitor() {} using OGRDefaultGeometryVisitor::visit; void visit(OGRPoint*) override { m_nPoints++; } int getNumPoints() const { return m_nPoints; } }; class PointCounterConstVisitor: public OGRDefaultConstGeometryVisitor { int m_nPoints = 0; public: PointCounterConstVisitor() {} using OGRDefaultConstGeometryVisitor::visit; void visit(const OGRPoint*) override { m_nPoints++; } int getNumPoints() const { return m_nPoints; } }; for( size_t i = 0; i < CPL_ARRAYSIZE(asTests); i++ ) { OGRGeometry* poGeom = nullptr; OGRGeometryFactory::createFromWkt(asTests[i].pszWKT, nullptr, &poGeom); PointCounterVisitor oVisitor; poGeom->accept(&oVisitor); ensure_equals(oVisitor.getNumPoints(), asTests[i].nExpectedPointCount); PointCounterConstVisitor oConstVisitor; poGeom->accept(&oConstVisitor); ensure_equals(oConstVisitor.getNumPoints(), asTests[i].nExpectedPointCount); delete poGeom; } TestIterator(); TestIterator("LINESTRING(0 0)", 1); TestIterator("LINESTRING(0 0)", 1); TestIterator(); TestIterator(); TestIterator(); TestIterator("CIRCULARSTRING(0 0,1 1,0 0)", 3); TestIterator("CIRCULARSTRING(0 0,1 1,0 0)", 3); TestIterator(); TestIterator("COMPOUNDCURVE((0 0,1 1))", 1); TestIterator("COMPOUNDCURVE((0 0,1 1),CIRCULARSTRING(1 1,2 2,3 3))", 4); TestIterator("COMPOUNDCURVE(CIRCULARSTRING EMPTY)", 1); TestIterator(); TestIterator("CURVEPOLYGON((0 0,1 1,1 0,0 0))", 1); TestIterator(); TestIterator("POLYGON((0 0,1 1,1 0,0 0))", 1); TestIterator(); TestIterator("GEOMETRYCOLLECTION(POINT(0 0))", 1); TestIterator(); TestIterator("MULTISURFACE(((0 0)))", 1); TestIterator(); TestIterator("MULTIPOLYGON(((0 0)))", 1); TestIterator(); TestIterator("MULTIPOINT(0 0)", 1); TestIterator(); TestIterator("MULTICURVE((0 0))", 1); TestIterator(); TestIterator("MULTILINESTRING((0 0))", 1); TestIterator(); TestIterator("TRIANGLE((0 0,0 1,1 1,0 0))", 1); TestIterator(); TestIterator("POLYHEDRALSURFACE(((0 0,0 1,1 1,0 0)))", 1); TestIterator(); TestIterator("TIN(((0 0,0 1,1 1,0 0)))", 1); } // Test layer, dataset-feature and layer-feature iterators template<> template<> void object::test<13>() { std::string file(data_ + SEP + "poly.shp"); GDALDatasetUniquePtr poDS( GDALDataset::Open(file.c_str(), GDAL_OF_VECTOR)); ensure( poDS != nullptr ); { GIntBig nExpectedFID = 0; for( const auto& oFeatureLayerPair: poDS->GetFeatures() ) { ensure_equals( oFeatureLayerPair.feature->GetFID(), nExpectedFID ); nExpectedFID ++; ensure_equals( oFeatureLayerPair.layer, poDS->GetLayer(0) ); } ensure_equals(nExpectedFID, 10); } ensure_equals( poDS->GetLayers().size(), 1U ); ensure_equals( poDS->GetLayers()[0], poDS->GetLayer(0) ); ensure_equals( poDS->GetLayers()[static_cast(0)], poDS->GetLayer(0) ); ensure_equals( poDS->GetLayers()["poly"], poDS->GetLayer(0) ); for( auto poLayer: poDS->GetLayers() ) { GIntBig nExpectedFID = 0; for( const auto& poFeature: poLayer ) { ensure_equals( poFeature->GetFID(), nExpectedFID ); nExpectedFID ++; } ensure_equals(nExpectedFID, 10); nExpectedFID = 0; for(const auto& oFeatureLayerPair: poDS->GetFeatures() ) { ensure_equals( oFeatureLayerPair.feature->GetFID(), nExpectedFID ); nExpectedFID ++; ensure_equals( oFeatureLayerPair.layer, poLayer ); } ensure_equals(nExpectedFID, 10); nExpectedFID = 0; OGR_FOR_EACH_FEATURE_BEGIN(hFeat, reinterpret_cast(poLayer)) { if( nExpectedFID == 0 ) { nExpectedFID = 1; continue; } ensure_equals( OGR_F_GetFID(hFeat), nExpectedFID ); nExpectedFID ++; if( nExpectedFID == 5 ) break; } OGR_FOR_EACH_FEATURE_END(hFeat) ensure_equals(nExpectedFID, 5); auto oIter = poLayer->begin(); CPLPushErrorHandler(CPLQuietErrorHandler); // Only one feature iterator can be active at a time auto oIter2 = poLayer->begin(); CPLPopErrorHandler(); ensure( !(oIter2 != poLayer->end()) ); ensure( oIter != poLayer->end() ); } poDS.reset(GetGDALDriverManager()->GetDriverByName("Memory")-> Create("", 0, 0, 0, GDT_Unknown, nullptr)); int nCountLayers = 0; for( auto poLayer: poDS->GetLayers() ) { CPL_IGNORE_RET_VAL(poLayer); nCountLayers++; } ensure_equals(nCountLayers, 0); poDS->CreateLayer("foo"); poDS->CreateLayer("bar"); for( auto poLayer: poDS->GetLayers() ) { if( nCountLayers == 0 ) ensure_equals( poLayer->GetName(), "foo" ); else if( nCountLayers == 1 ) ensure_equals( poLayer->GetName(), "bar" ); nCountLayers++; } ensure_equals(nCountLayers, 2); // std::copy requires a InputIterator std::vector oTarget; oTarget.resize(2); auto layers = poDS->GetLayers(); std::copy(layers.begin(), layers.end(), oTarget.begin()); ensure_equals(oTarget[0], layers[0]); ensure_equals(oTarget[1], layers[1]); // but in practice not necessarily uses the postincrement iterator. oTarget.clear(); oTarget.resize(2); auto input_iterator = layers.begin(); auto output_iterator = oTarget.begin(); while (input_iterator != layers.end()) { *output_iterator++ = *input_iterator++; } ensure_equals(oTarget[0], layers[0]); ensure_equals(oTarget[1], layers[1]); // Test copy constructor { GDALDataset::Layers::Iterator srcIter(poDS->GetLayers().begin()); ++srcIter; GDALDataset::Layers::Iterator newIter(srcIter); ensure_equals(*newIter, layers[1]); } // Test assignment operator { GDALDataset::Layers::Iterator srcIter(poDS->GetLayers().begin()); ++srcIter; GDALDataset::Layers::Iterator newIter; newIter = srcIter; ensure_equals(*newIter, layers[1]); } // Test move constructor { GDALDataset::Layers::Iterator srcIter(poDS->GetLayers().begin()); ++srcIter; GDALDataset::Layers::Iterator newIter(std::move(srcIter)); ensure_equals(*newIter, layers[1]); } // Test move assignment operator { GDALDataset::Layers::Iterator srcIter(poDS->GetLayers().begin()); ++srcIter; GDALDataset::Layers::Iterator newIter; newIter = std::move(srcIter); ensure_equals(*newIter, layers[1]); } } // Test field iterator template<> template<> void object::test<14>() { OGRFeatureDefn* poFeatureDefn = new OGRFeatureDefn(); poFeatureDefn->Reference(); { OGRFieldDefn oFieldDefn("str_field", OFTString); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("int_field", OFTInteger); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("int64_field", OFTInteger64); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("double_field", OFTReal); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("null_field", OFTReal); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("unset_field", OFTReal); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("dt_field", OFTDateTime); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("strlist_field", OFTStringList); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("intlist_field", OFTIntegerList); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("int64list_field", OFTInteger64List); poFeatureDefn->AddFieldDefn(&oFieldDefn); } { OGRFieldDefn oFieldDefn("doublelist_field", OFTRealList); poFeatureDefn->AddFieldDefn(&oFieldDefn); } OGRFeature oFeature(poFeatureDefn); { OGRFeature oFeatureTmp(poFeatureDefn); oFeatureTmp[0] = "bar"; ensure_equals( oFeatureTmp[0].GetString(), "bar" ); { // Proxy reference auto&& x= oFeatureTmp[0]; auto& xRef(x); x = xRef; ensure_equals( oFeatureTmp[0].GetString(), "bar" ); } { oFeatureTmp[0] = oFeatureTmp[0]; ensure_equals( oFeatureTmp[0].GetString(), "bar" ); } { // Proxy reference auto&& x= oFeatureTmp[0]; x = "baz"; ensure_equals( x.GetString(), "baz" ); } oFeatureTmp["str_field"] = std::string("foo"); oFeatureTmp["int_field"] = 123; oFeatureTmp["int64_field"] = oFeatureTmp["int_field"]; ensure_equals( oFeatureTmp["int64_field"].GetInteger(), 123 ); oFeatureTmp["int64_field"] = static_cast(1234567890123); oFeatureTmp["double_field"] = 123.45; oFeatureTmp["null_field"].SetNull(); oFeatureTmp["unset_field"].clear(); oFeatureTmp["unset_field"].Unset(); oFeatureTmp["dt_field"].SetDateTime(2018, 4, 5, 12, 34, 56.75f, 0); oFeatureTmp["strlist_field"] = CPLStringList().List(); oFeatureTmp["strlist_field"] = std::vector(); oFeatureTmp["strlist_field"] = std::vector{ "foo", "bar" }; oFeatureTmp["strlist_field"] = static_cast(oFeatureTmp["strlist_field"]); ensure_equals( CSLCount(static_cast(oFeatureTmp["strlist_field"])), 2 ); oFeatureTmp["intlist_field"] = std::vector(); oFeatureTmp["intlist_field"] = std::vector{ 12, 34 }; oFeatureTmp["int64list_field"] = std::vector(); oFeatureTmp["int64list_field"] = std::vector{ 1234567890123,34 }; oFeatureTmp["doublelist_field"] = std::vector(); oFeatureTmp["doublelist_field"] = std::vector{ 12.25,56.75 }; for( const auto& oField: oFeatureTmp ) { oFeature[oField.GetIndex()] = oField; } } { int x = oFeature[1]; ensure_equals( x, 123 ); } { int x = oFeature["int_field"]; ensure_equals( x, 123 ); } { GIntBig x = oFeature["int64_field"]; ensure_equals( x, static_cast(1234567890123) ); } { double x = oFeature["double_field"]; ensure_equals( x, 123.45 ); } { const char* x = oFeature["str_field"]; ensure_equals( x, "foo" ); } bool bExceptionHit = false; try { oFeature["inexisting_field"]; } catch( const OGRFeature::FieldNotFoundException& ) { bExceptionHit = true; } ensure(bExceptionHit); int iIter = 0; const OGRFeature* poConstFeature = &oFeature; for( const auto& oField: *poConstFeature ) { ensure_equals( oField.GetIndex(), iIter ); ensure_equals( oField.GetDefn(), poFeatureDefn->GetFieldDefn(iIter) ); ensure_equals( CPLString(oField.GetName()), CPLString(oField.GetDefn()->GetNameRef()) ); ensure_equals( oField.GetType(), oField.GetDefn()->GetType() ); ensure_equals( oField.GetSubType(), oField.GetDefn()->GetSubType() ); if( iIter == 0 ) { ensure_equals( oField.IsUnset(), false ); ensure_equals( oField.IsNull(), false ); ensure_equals( CPLString(oField.GetRawValue()->String), CPLString("foo") ); ensure_equals( CPLString(oField.GetString()), CPLString("foo") ); ensure_equals( CPLString(oField.GetAsString()), CPLString("foo") ); } else if( iIter == 1 ) { ensure_equals( oField.GetRawValue()->Integer, 123 ); ensure_equals( oField.GetInteger(), 123 ); ensure_equals( oField.GetAsInteger(), 123 ); ensure_equals( oField.GetAsInteger64(), 123 ); ensure_equals( oField.GetAsDouble(), 123.0 ); ensure_equals( CPLString(oField.GetAsString()), CPLString("123") ); } else if( iIter == 2 ) { ensure_equals( oField.GetRawValue()->Integer64, 1234567890123 ); ensure_equals( oField.GetInteger64(), 1234567890123 ); ensure_equals( oField.GetAsInteger(), 2147483647 ); ensure_equals( oField.GetAsInteger64(), 1234567890123 ); ensure_equals( oField.GetAsDouble(), 1234567890123.0 ); ensure_equals( CPLString(oField.GetAsString()), CPLString("1234567890123") ); } else if( iIter == 3 ) { ensure_equals( oField.GetRawValue()->Real, 123.45 ); ensure_equals( oField.GetDouble(), 123.45 ); ensure_equals( oField.GetAsInteger(), 123 ); ensure_equals( oField.GetAsInteger64(), 123 ); ensure_equals( oField.GetAsDouble(), 123.45 ); ensure_equals( CPLString(oField.GetAsString()), CPLString("123.45") ); } else if( iIter == 4 ) { ensure_equals( oField.IsUnset(), false ); ensure_equals( oField.IsNull(), true ); } else if( iIter == 5 ) { ensure_equals( oField.IsUnset(), true ); ensure_equals( oField.empty(), true ); ensure_equals( oField.IsNull(), false ); } else if( iIter == 6 ) { int nYear, nMonth, nDay, nHour, nMin, nTZFlag; float fSec; ensure_equals( oField.GetDateTime(&nYear, &nMonth, &nDay, &nHour, &nMin, &fSec, &nTZFlag), true ); ensure_equals( nYear, 2018 ); ensure_equals( nMonth, 4 ); ensure_equals( nDay, 5 ); ensure_equals( nHour, 12 ); ensure_equals( nMin, 34 ); ensure_equals( fSec, 56.75f ); ensure_equals( nTZFlag, 0 ); } else if( iIter == 7 ) { std::vector oExpected{ std::string("foo"), std::string("bar") }; decltype(oExpected) oGot = oField; ensure_equals( oGot.size(), oExpected.size() ); for( size_t i = 0; i < oExpected.size(); i++ ) ensure_equals( oGot[i], oExpected[i] ); } else if( iIter == 8 ) { std::vector oExpected{ 12, 34 }; decltype(oExpected) oGot = oField; ensure_equals( oGot.size(), oExpected.size() ); for( size_t i = 0; i < oExpected.size(); i++ ) ensure_equals( oGot[i], oExpected[i] ); } else if( iIter == 9 ) { std::vector oExpected{ 1234567890123, 34 }; decltype(oExpected) oGot = oField; ensure_equals( oGot.size(), oExpected.size() ); for( size_t i = 0; i < oExpected.size(); i++ ) ensure_equals( oGot[i], oExpected[i] ); } else if( iIter == 10 ) { std::vector oExpected{ 12.25, 56.75 }; decltype(oExpected) oGot = oField; ensure_equals( oGot.size(), oExpected.size() ); for( size_t i = 0; i < oExpected.size(); i++ ) ensure_equals( oGot[i], oExpected[i] ); } iIter ++; } poFeatureDefn->Release(); } // Test OGRGetXMLDateTime() template<> template<> void object::test<15>() { OGRField sField; char *pszDateTime; sField.Date.Year = 2001; sField.Date.Month = 2; sField.Date.Day = 3; sField.Date.Hour = 4; sField.Date.Minute = 5; // Unknown time zone (TZFlag = 0), no millisecond count sField.Date.TZFlag = 0; sField.Date.Second = 6.0f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "unknown time zone, no millisecond count", strcmp("2001-02-03T04:05:06", pszDateTime) == 0); CPLFree(pszDateTime); // Unknown time zone (TZFlag = 0), millisecond count sField.Date.TZFlag = 0; sField.Date.Second = 6.789f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "unknown time zone, millisecond count", strcmp("2001-02-03T04:05:06.789", pszDateTime) == 0); CPLFree(pszDateTime); // Local time zone (TZFlag = 1), no millisecond count sField.Date.TZFlag = 1; sField.Date.Second = 6.0f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "local time zone, no millisecond count", strcmp("2001-02-03T04:05:06", pszDateTime) == 0); CPLFree(pszDateTime); // Local time zone (TZFlag = 1), millisecond count sField.Date.TZFlag = 1; sField.Date.Second = 6.789f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "local time zone, millisecond count", strcmp("2001-02-03T04:05:06.789", pszDateTime) == 0); CPLFree(pszDateTime); // GMT time zone (TZFlag = 100), no millisecond count sField.Date.TZFlag = 100; sField.Date.Second = 6.0f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "GMT time zone, no millisecond count", strcmp("2001-02-03T04:05:06Z", pszDateTime) == 0); CPLFree(pszDateTime); // GMT time zone (TZFlag = 100), millisecond count sField.Date.TZFlag = 100; sField.Date.Second = 6.789f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "GMT time zone, millisecond count", strcmp("2001-02-03T04:05:06.789Z", pszDateTime) == 0); CPLFree(pszDateTime); // Positive time-zone offset, no millisecond count sField.Date.TZFlag = 111; sField.Date.Second = 6.0f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "positive time-zone offset, no millisecond count", strcmp("2001-02-03T04:05:06+02:45", pszDateTime) == 0); CPLFree(pszDateTime); // Positive time-zone offset, millisecond count sField.Date.TZFlag = 111; sField.Date.Second = 6.789f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "positive time-zone offset, millisecond count", strcmp("2001-02-03T04:05:06.789+02:45", pszDateTime) == 0); CPLFree(pszDateTime); // Negative time-zone offset, no millisecond count sField.Date.TZFlag = 88; sField.Date.Second = 6.0f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "negative time-zone offset, no millisecond count", strcmp("2001-02-03T04:05:06-03:00", pszDateTime) == 0); CPLFree(pszDateTime); // Negative time-zone offset, millisecond count sField.Date.TZFlag = 88; sField.Date.Second = 6.789f; pszDateTime = OGRGetXMLDateTime(&sField); ensure(nullptr != pszDateTime); ensure("OGRGetXMLDateTime formats date/time field with " "negative time-zone offset, millisecond count", strcmp("2001-02-03T04:05:06.789-03:00", pszDateTime) == 0); CPLFree(pszDateTime); } // Test OGRLinearRing::isPointOnRingBoundary() template<> template<> void object::test<16>() { OGRPolygon oPoly; const char* pszPoly = "POLYGON((10 9,11 10,10 11,9 10,10 9))"; oPoly.importFromWkt(&pszPoly); auto poRing = oPoly.getExteriorRing(); // On first vertex { OGRPoint p(10, 9); ensure(poRing->isPointOnRingBoundary(&p, false)); } // On second vertex { OGRPoint p(11, 10); ensure(poRing->isPointOnRingBoundary(&p, false)); } // Middle of first segment { OGRPoint p(10.5, 9.5); ensure(poRing->isPointOnRingBoundary(&p, false)); } // "Before" first segment { OGRPoint p(10-1, 9-1); ensure(!poRing->isPointOnRingBoundary(&p, false)); } // "After" first segment { OGRPoint p(11+1, 10+1); ensure(!poRing->isPointOnRingBoundary(&p, false)); } // On third vertex { OGRPoint p(10, 11); ensure(poRing->isPointOnRingBoundary(&p, false)); } // Middle of second segment { OGRPoint p(10.5, 10.5); ensure(poRing->isPointOnRingBoundary(&p, false)); } // On fourth vertex { OGRPoint p(9, 10); ensure(poRing->isPointOnRingBoundary(&p, false)); } // Middle of third segment { OGRPoint p(9.5, 10.5); ensure(poRing->isPointOnRingBoundary(&p, false)); } // Middle of fourth segment { OGRPoint p(9.5, 9.5); ensure(poRing->isPointOnRingBoundary(&p, false)); } } } // namespace tut gdalautotest-3.0.4/cpp/testcopywords.cpp0000644003401500001440000007314113614005367020062 0ustar rouaultusers/****************************************************************************** * $Id: testcopywords.cpp d6c22cb12d8c5824353111a84932538b379d71de 2019-12-30 02:46:39 +0100 Even Rouault $ * * Project: GDAL Core * Purpose: Test GDALCopyWords(). * Author: Even Rouault, * ****************************************************************************** * Copyright (c) 2009-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. ****************************************************************************/ #include "cpl_conv.h" #include "gdal.h" #include GByte* pIn; GByte* pOut; int bErr = FALSE; template void AssertRes(GDALDataType intype, ConstantType inval, GDALDataType outtype, ConstantType expected_outval, OutType outval, int numLine) { if (fabs((double)outval - (double)expected_outval) > .1) { std::cout << "Test failed at line " << numLine << " (intype=" << GDALGetDataTypeName(intype) << ",inval=" << (double)inval << ",outtype=" << GDALGetDataTypeName(outtype) << ",got " << (double)outval << " expected " << expected_outval << std::endl; bErr = TRUE; } } #define ASSERT(intype, inval, outtype, expected_outval, outval ) \ AssertRes(intype, inval, outtype, expected_outval, outval, numLine) template void Test(GDALDataType intype, ConstantType inval, ConstantType invali, GDALDataType outtype, ConstantType outval, ConstantType outvali, int numLine) { memset(pIn, 0xff, 128); memset(pOut, 0xff, 128); *(InType*)(pIn) = (InType)inval; *(InType*)(pIn + 32) = (InType)inval; if (GDALDataTypeIsComplex(intype)) { ((InType*)(pIn))[1] = (InType)invali; ((InType*)(pIn + 32))[1] = (InType)invali; } /* Test positive offsets */ GDALCopyWords(pIn, intype, 32, pOut, outtype, 32, 2); /* Test negative offsets */ GDALCopyWords(pIn + 32, intype, -32, pOut + 128 - 16, outtype, -32, 2); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + 32)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + 128 - 16)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + 128 - 16 - 32)); if (GDALDataTypeIsComplex(outtype)) { ASSERT(intype, invali, outtype, outvali, ((OutType*)(pOut))[1]); ASSERT(intype, invali, outtype, outvali, ((OutType*)(pOut + 32))[1]); ASSERT(intype, invali, outtype, outvali, ((OutType*)(pOut + 128 - 16))[1]); ASSERT(intype, invali, outtype, outvali, ((OutType*)(pOut + 128 - 16 - 32))[1]); } else { *(InType*)(pIn + GDALGetDataTypeSize(intype)/8) = (InType)inval; /* Test packed offsets */ GDALCopyWords(pIn, intype, GDALGetDataTypeSize(intype)/8, pOut, outtype, GDALGetDataTypeSize(outtype)/8, 2); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + GDALGetDataTypeSize(outtype)/8)); *(InType*)(pIn + 2 * GDALGetDataTypeSize(intype)/8) = (InType)inval; *(InType*)(pIn + 3 * GDALGetDataTypeSize(intype)/8) = (InType)inval; /* Test packed offsets */ GDALCopyWords(pIn, intype, GDALGetDataTypeSize(intype)/8, pOut, outtype, GDALGetDataTypeSize(outtype)/8, 4); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + GDALGetDataTypeSize(outtype)/8)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + 2 * GDALGetDataTypeSize(outtype)/8)); ASSERT(intype, inval, outtype, outval, *(OutType*)(pOut + 3 * GDALGetDataTypeSize(outtype)/8)); } } template void FromR_2(GDALDataType intype, ConstantType inval, ConstantType invali, GDALDataType outtype, ConstantType outval, ConstantType outvali, int numLine) { if (outtype == GDT_Byte) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_Int16) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_UInt16) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_Int32) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_UInt32) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_Float32) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_Float64) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_CInt16) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_CInt32) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_CFloat32) Test(intype, inval, invali, outtype, outval, outvali, numLine); else if (outtype == GDT_CFloat64) Test(intype, inval, invali, outtype, outval, outvali, numLine); } template void FromR(GDALDataType intype, ConstantType inval, ConstantType invali, GDALDataType outtype, ConstantType outval, ConstantType outvali, int numLine) { if (intype == GDT_Byte) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_Int16) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_UInt16) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_Int32) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_UInt32) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_Float32) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_Float64) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_CInt16) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_CInt32) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_CFloat32) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); else if (intype == GDT_CFloat64) FromR_2(intype, inval, invali, outtype, outval, outvali, numLine); } #define FROM_R(intype, inval, outtype, outval) FromR(intype, inval, 0, outtype, outval, 0, __LINE__) #define FROM_R_F(intype, inval, outtype, outval) FromR(intype, inval, 0, outtype, outval, 0, __LINE__) #define FROM_C(intype, inval, invali, outtype, outval, outvali) FromR(intype, inval, invali, outtype, outval, outvali, __LINE__) #define FROM_C_F(intype, inval, invali, outtype, outval, outvali) FromR(intype, inval, invali, outtype, outval, outvali, __LINE__) #define IS_UNSIGNED(x) (x == GDT_Byte || x == GDT_UInt16 || x == GDT_UInt32) #define IS_FLOAT(x) (x == GDT_Float32 || x == GDT_Float64 || x == GDT_CFloat32 || x == GDT_CFloat64) #define CST_3000000000 (((GIntBig)3000) * 1000 * 1000) #define CST_5000000000 (((GIntBig)5000) * 1000 * 1000) static void check_GDT_Byte() { /* GDT_Byte */ for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_R(GDT_Byte, 0, outtype, 0); FROM_R(GDT_Byte, 127, outtype, 127); FROM_R(GDT_Byte, 255, outtype, 255); } for(int i=0;i<17;i++) { pIn[i] = (GByte)i; } memset(pOut, 0xff, 128); GDALCopyWords(pIn, GDT_Byte, 1, pOut, GDT_Int32, 4, 17); for(int i=0;i<17;i++) { AssertRes(GDT_Byte, i, GDT_Int32, i, ((int*)pOut)[i], __LINE__); } memset(pOut, 0xff, 128); GDALCopyWords(pIn, GDT_Byte, 1, pOut, GDT_Float32, 4, 17); for(int i=0;i<17;i++) { AssertRes(GDT_Byte, i, GDT_Float32, i, ((float*)pOut)[i], __LINE__); } } static void check_GDT_Int16() { /* GDT_Int16 */ FROM_R(GDT_Int16, -32000, GDT_Byte, 0); /* clamp */ FROM_R(GDT_Int16, -32000, GDT_Int16, -32000); FROM_R(GDT_Int16, -32000, GDT_UInt16, 0); /* clamp */ FROM_R(GDT_Int16, -32000, GDT_Int32, -32000); FROM_R(GDT_Int16, -32000, GDT_UInt32, 0); /* clamp */ FROM_R(GDT_Int16, -32000, GDT_Float32, -32000); FROM_R(GDT_Int16, -32000, GDT_Float64, -32000); FROM_R(GDT_Int16, -32000, GDT_CInt16, -32000); FROM_R(GDT_Int16, -32000, GDT_CInt32, -32000); FROM_R(GDT_Int16, -32000, GDT_CFloat32, -32000); FROM_R(GDT_Int16, -32000, GDT_CFloat64, -32000); for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_R(GDT_Int16, 127, outtype, 127); } FROM_R(GDT_Int16, 32000, GDT_Byte, 255); /* clamp */ FROM_R(GDT_Int16, 32000, GDT_Int16, 32000); FROM_R(GDT_Int16, 32000, GDT_UInt16, 32000); FROM_R(GDT_Int16, 32000, GDT_Int32, 32000); FROM_R(GDT_Int16, 32000, GDT_UInt32, 32000); FROM_R(GDT_Int16, 32000, GDT_Float32, 32000); FROM_R(GDT_Int16, 32000, GDT_Float64, 32000); FROM_R(GDT_Int16, 32000, GDT_CInt16, 32000); FROM_R(GDT_Int16, 32000, GDT_CInt32, 32000); FROM_R(GDT_Int16, 32000, GDT_CFloat32, 32000); FROM_R(GDT_Int16, 32000, GDT_CFloat64, 32000); } static void check_GDT_UInt16() { /* GDT_UInt16 */ for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_R(GDT_UInt16, 0, outtype, 0); FROM_R(GDT_UInt16, 127, outtype, 127); } FROM_R(GDT_UInt16, 65000, GDT_Byte, 255); /* clamp */ FROM_R(GDT_UInt16, 65000, GDT_Int16, 32767); /* clamp */ FROM_R(GDT_UInt16, 65000, GDT_UInt16, 65000); FROM_R(GDT_UInt16, 65000, GDT_Int32, 65000); FROM_R(GDT_UInt16, 65000, GDT_UInt32, 65000); FROM_R(GDT_UInt16, 65000, GDT_Float32, 65000); FROM_R(GDT_UInt16, 65000, GDT_Float64, 65000); FROM_R(GDT_UInt16, 65000, GDT_CInt16, 32767); /* clamp */ FROM_R(GDT_UInt16, 65000, GDT_CInt32, 65000); FROM_R(GDT_UInt16, 65000, GDT_CFloat32, 65000); FROM_R(GDT_UInt16, 65000, GDT_CFloat64, 65000); } static void check_GDT_Int32() { /* GDT_Int32 */ FROM_R(GDT_Int32, -33000, GDT_Byte, 0); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_Int16, -32768); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_UInt16, 0); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_Int32, -33000); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_UInt32, 0); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_Float32, -33000); FROM_R(GDT_Int32, -33000, GDT_Float64, -33000); FROM_R(GDT_Int32, -33000, GDT_CInt16, -32768); /* clamp */ FROM_R(GDT_Int32, -33000, GDT_CInt32, -33000); FROM_R(GDT_Int32, -33000, GDT_CFloat32, -33000); FROM_R(GDT_Int32, -33000, GDT_CFloat64, -33000); for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_R(GDT_Int32, 127, outtype, 127); } FROM_R(GDT_Int32, 67000, GDT_Byte, 255); /* clamp */ FROM_R(GDT_Int32, 67000, GDT_Int16, 32767); /* clamp */ FROM_R(GDT_Int32, 67000, GDT_UInt16, 65535); /* clamp */ FROM_R(GDT_Int32, 67000, GDT_Int32, 67000); FROM_R(GDT_Int32, 67000, GDT_UInt32, 67000); FROM_R(GDT_Int32, 67000, GDT_Float32, 67000); FROM_R(GDT_Int32, 67000, GDT_Float64, 67000); FROM_R(GDT_Int32, 67000, GDT_CInt16, 32767); /* clamp */ FROM_R(GDT_Int32, 67000, GDT_CInt32, 67000); FROM_R(GDT_Int32, 67000, GDT_CFloat32, 67000); FROM_R(GDT_Int32, 67000, GDT_CFloat64, 67000); } static void check_GDT_UInt32() { /* GDT_UInt32 */ for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_R(GDT_UInt32, 0, outtype, 0); FROM_R(GDT_UInt32, 127, outtype, 127); } FROM_R(GDT_UInt32, 3000000000U, GDT_Byte, 255); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_Int16, 32767); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_UInt16, 65535); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_Int32, 2147483647); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_UInt32, 3000000000U); FROM_R(GDT_UInt32, 3000000000U, GDT_Float32, 3000000000U); FROM_R(GDT_UInt32, 3000000000U, GDT_Float64, 3000000000U); FROM_R(GDT_UInt32, 3000000000U, GDT_CInt16, 32767); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_CInt32, 2147483647); /* clamp */ FROM_R(GDT_UInt32, 3000000000U, GDT_CFloat32, 3000000000U); FROM_R(GDT_UInt32, 3000000000U, GDT_CFloat64, 3000000000U); } static void check_GDT_Float32and64() { /* GDT_Float32 and GDT_Float64 */ for(int i=0;i<2;i++) { GDALDataType intype = (i == 0) ? GDT_Float32 : GDT_Float64; for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { if (IS_FLOAT(outtype)) { FROM_R_F(intype, 127.1, outtype, 127.1); FROM_R_F(intype, -127.1, outtype, -127.1); } else { FROM_R_F(intype, 127.1, outtype, 127); FROM_R_F(intype, 127.9, outtype, 128); FROM_R_F(intype, 0.4, outtype, 0); FROM_R_F(intype, 0.5, outtype, 1); /* We could argue how to do this rounding */ FROM_R_F(intype, 0.6, outtype, 1); FROM_R_F(intype, 127.5, outtype, 128); /* We could argue how to do this rounding */ if (!IS_UNSIGNED(outtype)) { FROM_R_F(intype, -125.9, outtype, -126); FROM_R_F(intype, -127.1, outtype, -127); FROM_R_F(intype, -0.4, outtype, 0); FROM_R_F(intype, -0.5, outtype, -1); /* We could argue how to do this rounding */ FROM_R_F(intype, -0.6, outtype, -1); FROM_R_F(intype, -127.5, outtype, -128); /* We could argue how to do this rounding */ } } } FROM_R(intype, -CST_3000000000, GDT_Byte, 0); FROM_R(intype, -32768, GDT_Byte, 0); FROM_R(intype, -1, GDT_Byte, 0); FROM_R(intype, 256, GDT_Byte, 255); FROM_R(intype, 65536, GDT_Byte, 255); FROM_R(intype, CST_3000000000, GDT_Byte, 255); FROM_R(intype, -CST_3000000000, GDT_Int16, -32768); FROM_R(intype, -33000, GDT_Int16, -32768); FROM_R(intype, 33000, GDT_Int16, 32767); FROM_R(intype, CST_3000000000, GDT_Int16, 32767); FROM_R(intype, -CST_3000000000, GDT_UInt16, 0); FROM_R(intype, -1, GDT_UInt16, 0); FROM_R(intype, 66000, GDT_UInt16, 65535); FROM_R(intype, CST_3000000000, GDT_UInt16, 65535); FROM_R(intype, -CST_3000000000, GDT_Int32, INT_MIN); FROM_R(intype, CST_3000000000, GDT_Int32, 2147483647); FROM_R(intype, -1, GDT_UInt32, 0); FROM_R(intype, CST_5000000000, GDT_UInt32, 4294967295UL); FROM_R(intype, CST_5000000000, GDT_Float32, CST_5000000000); FROM_R(intype, -CST_5000000000, GDT_Float32, -CST_5000000000); FROM_R(intype, CST_5000000000, GDT_Float64, CST_5000000000); FROM_R(intype, -CST_5000000000, GDT_Float64, -CST_5000000000); FROM_R(intype, -33000, GDT_CInt16, -32768); FROM_R(intype, 33000, GDT_CInt16, 32767); FROM_R(intype, -CST_3000000000, GDT_CInt32, INT_MIN); FROM_R(intype, CST_3000000000, GDT_CInt32, 2147483647); FROM_R(intype, CST_5000000000, GDT_CFloat32, CST_5000000000); FROM_R(intype, -CST_5000000000, GDT_CFloat32, -CST_5000000000); FROM_R(intype, CST_5000000000, GDT_CFloat64, CST_5000000000); FROM_R(intype, -CST_5000000000, GDT_CFloat64, -CST_5000000000); } } static void check_GDT_CInt16() { /* GDT_CInt16 */ FROM_C(GDT_CInt16, -32000, -32500, GDT_Byte, 0, 0); /* clamp */ FROM_C(GDT_CInt16, -32000, -32500, GDT_Int16, -32000, 0); FROM_C(GDT_CInt16, -32000, -32500, GDT_UInt16, 0, 0); /* clamp */ FROM_C(GDT_CInt16, -32000, -32500, GDT_Int32, -32000, 0); FROM_C(GDT_CInt16, -32000, -32500, GDT_UInt32, 0,0); /* clamp */ FROM_C(GDT_CInt16, -32000, -32500, GDT_Float32, -32000, 0); FROM_C(GDT_CInt16, -32000, -32500, GDT_Float64, -32000, 0); FROM_C(GDT_CInt16, -32000, -32500, GDT_CInt16, -32000, -32500); FROM_C(GDT_CInt16, -32000, -32500, GDT_CInt32, -32000, -32500); FROM_C(GDT_CInt16, -32000, -32500, GDT_CFloat32, -32000, -32500); FROM_C(GDT_CInt16, -32000, -32500, GDT_CFloat64, -32000, -32500); for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_C(GDT_CInt16, 127, 128, outtype, 127, 128); } FROM_C(GDT_CInt16, 32000, 32500, GDT_Byte, 255, 0); /* clamp */ FROM_C(GDT_CInt16, 32000, 32500, GDT_Int16, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_UInt16, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_Int32, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_UInt32, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_Float32, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_Float64, 32000, 0); FROM_C(GDT_CInt16, 32000, 32500, GDT_CInt16, 32000, 32500); FROM_C(GDT_CInt16, 32000, 32500, GDT_CInt32, 32000, 32500); FROM_C(GDT_CInt16, 32000, 32500, GDT_CFloat32, 32000, 32500); FROM_C(GDT_CInt16, 32000, 32500, GDT_CFloat64, 32000, 32500); } static void check_GDT_CInt32() { /* GDT_CInt32 */ FROM_C(GDT_CInt32, -33000, -33500, GDT_Byte, 0, 0); /* clamp */ FROM_C(GDT_CInt32, -33000, -33500, GDT_Int16, -32768, 0); /* clamp */ FROM_C(GDT_CInt32, -33000, -33500, GDT_UInt16, 0, 0); /* clamp */ FROM_C(GDT_CInt32, -33000, -33500, GDT_Int32, -33000, 0); FROM_C(GDT_CInt32, -33000, -33500, GDT_UInt32, 0,0); /* clamp */ FROM_C(GDT_CInt32, -33000, -33500, GDT_Float32, -33000, 0); FROM_C(GDT_CInt32, -33000, -33500, GDT_Float64, -33000, 0); FROM_C(GDT_CInt32, -33000, -33500, GDT_CInt16, -32768, -32768); /* clamp */ FROM_C(GDT_CInt32, -33000, -33500, GDT_CInt32, -33000, -33500); FROM_C(GDT_CInt32, -33000, -33500, GDT_CFloat32, -33000, -33500); FROM_C(GDT_CInt32, -33000, -33500, GDT_CFloat64, -33000, -33500); for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { FROM_C(GDT_CInt32, 127, 128, outtype, 127, 128); } FROM_C(GDT_CInt32, 67000, 67500, GDT_Byte, 255, 0); /* clamp */ FROM_C(GDT_CInt32, 67000, 67500, GDT_Int16, 32767, 0); /* clamp */ FROM_C(GDT_CInt32, 67000, 67500, GDT_UInt16, 65535, 0); /* clamp */ FROM_C(GDT_CInt32, 67000, 67500, GDT_Int32, 67000, 0); FROM_C(GDT_CInt32, 67000, 67500, GDT_UInt32, 67000, 0); FROM_C(GDT_CInt32, 67000, 67500, GDT_Float32, 67000, 0); FROM_C(GDT_CInt32, 67000, 67500, GDT_Float64, 67000, 0); FROM_C(GDT_CInt32, 67000, 67500, GDT_CInt16, 32767, 32767); /* clamp */ FROM_C(GDT_CInt32, 67000, 67500, GDT_CInt32, 67000, 67500); FROM_C(GDT_CInt32, 67000, 67500, GDT_CFloat32, 67000, 67500); FROM_C(GDT_CInt32, 67000, 67500, GDT_CFloat64, 67000, 67500); } static void check_GDT_CFloat32and64() { /* GDT_CFloat32 and GDT_CFloat64 */ for(int i=0;i<2;i++) { GDALDataType intype = (i == 0) ? GDT_CFloat32 : GDT_CFloat64; for(GDALDataType outtype=GDT_Byte; outtype<=GDT_CFloat64;outtype = (GDALDataType)(outtype + 1)) { if (IS_FLOAT(outtype)) { FROM_C_F(intype, 127.1, 127.9, outtype, 127.1, 127.9); FROM_C_F(intype, -127.1, -127.9, outtype, -127.1, -127.9); } else { FROM_C_F(intype, 127.1, 150.9, outtype, 127, 151); FROM_C_F(intype, 127.9, 150.1, outtype, 128, 150); if (!IS_UNSIGNED(outtype)) { FROM_C_F(intype, -125.9, -127.1, outtype, -126, -127); } } } FROM_C(intype, -1, 256, GDT_Byte, 0, 0); FROM_C(intype, 256, -1, GDT_Byte, 255, 0); FROM_C(intype, -33000, 33000, GDT_Int16, -32768, 0); FROM_C(intype, 33000, -33000, GDT_Int16, 32767, 0); FROM_C(intype, -1, 66000, GDT_UInt16, 0, 0); FROM_C(intype, 66000, -1, GDT_UInt16, 65535, 0); FROM_C(intype, -CST_3000000000, -CST_3000000000, GDT_Int32, INT_MIN, 0); FROM_C(intype, CST_3000000000, CST_3000000000, GDT_Int32, 2147483647, 0); FROM_C(intype, -1, CST_5000000000, GDT_UInt32, 0, 0); FROM_C(intype, CST_5000000000, -1, GDT_UInt32, 4294967295UL, 0); FROM_C(intype, CST_5000000000, -1, GDT_Float32, CST_5000000000, 0); FROM_C(intype, CST_5000000000, -1, GDT_Float64, CST_5000000000, 0); FROM_C(intype, -CST_5000000000, -1, GDT_Float32, -CST_5000000000, 0); FROM_C(intype, -CST_5000000000, -1, GDT_Float64, -CST_5000000000, 0); FROM_C(intype, -33000, 33000, GDT_CInt16, -32768, 32767); FROM_C(intype, 33000, -33000, GDT_CInt16, 32767, -32768); FROM_C(intype, -CST_3000000000, -CST_3000000000, GDT_CInt32, INT_MIN, INT_MIN); FROM_C(intype, CST_3000000000, CST_3000000000, GDT_CInt32, 2147483647, 2147483647); FROM_C(intype, CST_5000000000, -CST_5000000000, GDT_CFloat32, CST_5000000000, -CST_5000000000); FROM_C(intype, CST_5000000000, -CST_5000000000, GDT_CFloat64, CST_5000000000, -CST_5000000000); } } template void CheckPackedGeneric(GDALDataType eIn, GDALDataType eOut) { const int N = 64+7; Tin arrayIn[N]; Tout arrayOut[N]; for(int i=0;i(i + 1); arrayOut[i] = 0; } GDALCopyWords(arrayIn, eIn, GDALGetDataTypeSizeBytes(eIn), arrayOut, eOut, GDALGetDataTypeSizeBytes(eOut), N); int numLine = 0; for(int i=0;i void CheckPacked(GDALDataType eIn, GDALDataType eOut) { CheckPackedGeneric(eIn, eOut); } template<> void CheckPacked(GDALDataType eIn, GDALDataType eOut) { CheckPackedGeneric(eIn, eOut); const int N = 64+7; GUInt16 arrayIn[N] = { 0 }; GByte arrayOut[N] = { 0 }; for(int i=0;i void CheckPacked(GDALDataType eIn, GDALDataType eOut) { CheckPackedGeneric(eIn, eOut); const int N = 64+7; GUInt16 arrayIn[N] = { 0 }; GInt16 arrayOut[N] = { 0 }; for(int i=0;i void CheckPacked(GDALDataType eIn, GDALDataType eOut) { switch(eOut) { case GDT_Byte: CheckPacked(eIn, eOut); break; case GDT_UInt16: CheckPacked(eIn, eOut); break; case GDT_Int16: CheckPacked(eIn, eOut); break; case GDT_UInt32: CheckPacked(eIn, eOut); break; case GDT_Int32: CheckPacked(eIn, eOut); break; case GDT_Float32: CheckPacked(eIn, eOut); break; case GDT_Float64: CheckPacked(eIn, eOut); break; default: CPLAssert(false); } } static void CheckPacked(GDALDataType eIn, GDALDataType eOut) { switch(eIn) { case GDT_Byte: CheckPacked(eIn, eOut); break; case GDT_UInt16: CheckPacked(eIn, eOut); break; case GDT_Int16: CheckPacked(eIn, eOut); break; case GDT_UInt32: CheckPacked(eIn, eOut); break; case GDT_Int32: CheckPacked(eIn, eOut); break; case GDT_Float32: CheckPacked(eIn, eOut); break; case GDT_Float64: CheckPacked(eIn, eOut); break; default: CPLAssert(false); } } int main(int /* argc */, char* /* argv */ []) { pIn = (GByte*)malloc(256); pOut = (GByte*)malloc(256); check_GDT_Byte(); check_GDT_Int16(); check_GDT_UInt16(); check_GDT_Int32(); check_GDT_UInt32(); check_GDT_Float32and64(); check_GDT_CInt16(); check_GDT_CInt32(); check_GDT_CFloat32and64(); for(int k=0;k<2;k++) { if( k == 1 ) CPLSetConfigOption("GDAL_USE_SSSE3", "NO"); for(int spacing=2; spacing<=4; spacing++) { memset(pIn, 0xff, 256); for(int i=0;i<17;i++) { pIn[spacing*i] = (GByte)(17-i); } memset(pOut, 0xff, 256); GDALCopyWords(pIn, GDT_Byte, spacing, pOut, GDT_Byte, 1, 17); for(int i=0;i<17;i++) { AssertRes(GDT_Byte, 17-i, GDT_Byte, 17-i, pOut[i], __LINE__); } memset(pIn, 0xff, 256); memset(pOut, 0xff, 256); for(int i=0;i<17;i++) { pIn[i] = (GByte)(17-i); } GDALCopyWords(pIn, GDT_Byte, 1, pOut, GDT_Byte, spacing, 17); for(int i=0;i<17;i++) { AssertRes(GDT_Byte, 17-i, GDT_Byte, 17-i, pOut[i*spacing], __LINE__); for(int j=1;j(eIn + 1) ) { for( GDALDataType eOut = GDT_Byte; eOut <= GDT_Float64; eOut = static_cast(eOut + 1) ) { CheckPacked(eIn, eOut); } } if (bErr == FALSE) printf("success !\n"); else printf("fail !\n"); return (bErr == FALSE) ? 0 : -1; } gdalautotest-3.0.4/cpp/testblockcachewrite.cpp0000644003401500001440000001211613614005367021155 0ustar rouaultusers/****************************************************************************** * $Id: testblockcachewrite.cpp c590dcec36eb6dcd7c5451623b859e7227475b44 2019-11-13 16:36:03 +0100 Even Rouault $ * * Project: GDAL Core * Purpose: Test block cache & writing behaviour under multi-threading * 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. ****************************************************************************/ #include "cpl_conv.h" #include "cpl_multiproc.h" #include "cpl_string.h" #include "gdal_priv.h" #include class MyRasterBand: public GDALRasterBand { int bBusy; public: MyRasterBand() { nBlockXSize = 1; nBlockYSize = 1; bBusy = FALSE; } CPLErr IReadBlock(int, int, void*) CPL_OVERRIDE { CPLAssert(FALSE); return CE_Failure; } CPLErr IWriteBlock(int nXBlock, int nYBlock, void*) CPL_OVERRIDE { printf("Entering IWriteBlock(%d, %d)\n", nXBlock, nYBlock); assert(!bBusy); bBusy = TRUE; CPLSleep(0.5); bBusy = FALSE; printf("Leaving IWriteBlock(%d, %d)\n", nXBlock, nYBlock); return CE_None; } }; class MyDataset: public GDALDataset { public: MyDataset() { eAccess = GA_Update; nRasterXSize = 2; nRasterYSize = 1; SetBand(1, new MyRasterBand()); } ~MyDataset() { FlushCache(); } }; static void thread_func1(void* /* unused */ ) { printf("begin thread\n"); GDALFlushCacheBlock(); printf("end of thread\n\n"); } static void test1() { CPLJoinableThread* hThread; printf("Start test1\n"); printf("main thread %p\n", (void*)CPLGetPID()); GDALSetCacheMax(0); MyDataset* poDS = new MyDataset(); char buf1[] = { 1 } ; CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(poDS, 1), GF_Write, 0, 0, 1, 1, buf1, 1, 1, GDT_Byte, 0, 0)); hThread = CPLCreateJoinableThread(thread_func1, nullptr); CPLSleep(0.3); CPL_IGNORE_RET_VAL(GDALRasterIO(GDALGetRasterBand(poDS, 1), GF_Write, 1, 0, 1, 1, buf1, 1, 1, GDT_Byte, 0, 0)); GDALFlushCacheBlock(); CPLJoinThread(hThread); delete poDS; printf("End test1\n"); } static void thread_func2(void* /* unused */) { printf("begin thread %p\n", (void*)CPLGetPID()); GDALDatasetH hDS = GDALOpen("data/byte.tif", GA_ReadOnly); GByte c = 0; CPL_IGNORE_RET_VAL(GDALDataset::FromHandle(hDS)->GetRasterBand(1)->RasterIO(GF_Read, 0,0,1,1,&c,1,1,GDT_Byte,0,0,nullptr)); GDALClose(hDS); printf("end of thread\n\n"); } static void test2() { printf("Start test2\n"); printf("main thread %p\n", (void*)CPLGetPID()); CPLJoinableThread* hThread; CPLSetConfigOption("GDAL_RB_INTERNALIZE_SLEEP_AFTER_DETACH_BEFORE_WRITE", "0.5"); GDALSetCacheMax(1000*1000); auto poDS = GetGDALDriverManager()->GetDriverByName("GTiff")->Create("/vsimem/foo.tif", 1, 1, 2, GDT_Byte, nullptr); poDS->GetRasterBand(1)->Fill(0); poDS->GetRasterBand(2)->Fill(0); poDS->FlushCache(); GDALSetCacheMax(0); poDS->GetRasterBand(1)->Fill(1); hThread = CPLCreateJoinableThread(thread_func2, nullptr); CPLSleep(0.2); GByte c = 0; CPL_IGNORE_RET_VAL(poDS->GetRasterBand(1)->RasterIO(GF_Read,0,0,1,1,&c,1,1,GDT_Byte,0,0,nullptr)); printf("%d\n", c); assert(c == 1); CPLJoinThread(hThread); CPLSetConfigOption("GDAL_RB_INTERNALIZE_SLEEP_AFTER_DETACH_BEFORE_WRITE", nullptr); delete poDS; VSIUnlink("/vsimem/foo.tif"); printf("End test2\n"); } int main(int argc, char* argv[]) { argc = GDALGeneralCmdLineProcessor( argc, &argv, 0 ); CPLSetConfigOption("GDAL_DEBUG_BLOCK_CACHE", "ON"); GDALGetCacheMax(); GDALAllRegister(); test1(); test2(); GDALDestroyDriverManager(); CSLDestroy( argv ); return 0; } gdalautotest-3.0.4/cpp/test_ogr_geos.cpp0000644003401500001440000003540713614005367017777 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test GEOS integration in OGR - geometric operations. // Ported from ogr/ogr_geos.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "ogr_api.h" #include "ogrsf_frmts.h" #ifdef HAVE_GEOS #include #endif #include namespace tut { // Common fixture with test data struct test_geos_data { OGRErr err_; OGRGeometryH g1_; OGRGeometryH g2_; OGRGeometryH g3_; test_geos_data() : err_(OGRERR_NONE), g1_(nullptr), g2_(nullptr), g3_(nullptr) {} ~test_geos_data() { OGR_G_DestroyGeometry(g1_); OGR_G_DestroyGeometry(g2_); OGR_G_DestroyGeometry(g3_); } }; // Register test group typedef test_group group; typedef group::object object; group test_geos_group("OGR::GEOS"); #ifdef OGR_ENABLED #ifdef HAVE_GEOS // Test GEOS support enabled template<> template<> void object::test<1>() { // HAVE_GEOS definition promises GEOS support is enabled ensure(true); } // Test export OGR geometry to GEOS using GDAL C++ API template<> template<> void object::test<2>() { char* wkt = "POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))"; OGRPolygon geom; err_ = geom.importFromWkt(&wkt); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); GEOSGeom geosGeom = geom.exportToGEOS(); ensure("Can't export geometry to GEOS", NULL != geosGeom); GEOSGeom_destroy(geosGeom); } // Test OGR_G_Contains function template<> template<> void object::test<3>() { char* wktOuter = "POLYGON((-90 -90, -90 90, 190 -90, -90 -90))"; err_ = OGR_G_CreateFromWkt(&wktOuter, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wktInner = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wktInner, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Contains() failed with FALSE", OGR_G_Contains(g1_, g2_), TRUE); ensure_equals("OGR_G_Contains() failed with TRUE", OGR_G_Contains(g2_, g1_), FALSE); } // Test OGR_G_Crosses function template<> template<> void object::test<4>() { char* wkt1 = "LINESTRING(0 0, 10 10)"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "LINESTRING(10 0, 0 10)"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Crosses() failed with FALSE", OGR_G_Crosses(g1_, g2_), TRUE); char* wkt3 = "LINESTRING(0 0, 0 10)"; err_ = OGR_G_CreateFromWkt(&wkt3, NULL, &g3_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g3_); ensure_equals("OGR_G_Crosses() failed with TRUE", OGR_G_Crosses(g1_, g3_), FALSE); } // Test OGR_G_Disjoint function template<> template<> void object::test<5>() { char* wkt1 = "LINESTRING(0 0, 10 10)"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "LINESTRING(10 0, 0 10)"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Disjoint() failed with TRUE", OGR_G_Disjoint(g1_, g2_), FALSE); char* wkt3 = "POLYGON((20 20, 20 30, 30 20, 20 20))"; err_ = OGR_G_CreateFromWkt(&wkt3, NULL, &g3_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g3_); ensure_equals("OGR_G_Disjoint() failed with FALSE", OGR_G_Disjoint(g1_, g3_), TRUE); } // Test OGR_G_Equals function template<> template<> void object::test<6>() { char* wkt1 = "LINESTRING(0 0, 10 10)"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "LINESTRING(0 0, 10 10)"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Equals() failed with FALSE", OGR_G_Equals(g1_, g2_), TRUE); char* wkt3 = "POLYGON((20 20, 20 30, 30 20, 20 20))"; err_ = OGR_G_CreateFromWkt(&wkt3, NULL, &g3_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g3_); ensure_equals("OGR_G_Equals() failed with TRUE", OGR_G_Equals(g1_, g3_), FALSE); } // Test OGR_G_Intersects function template<> template<> void object::test<7>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((0 0, 0 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Intersects() failed with FALSE", OGR_G_Intersects(g1_, g2_), TRUE); char* wkt3 = "POLYGON((20 20, 40 20, 40 40, 20 20))"; err_ = OGR_G_CreateFromWkt(&wkt3, NULL, &g3_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g3_); ensure_equals("OGR_G_Intersects() failed with TRUE", OGR_G_Intersects(g1_, g3_), FALSE); } // Test OGR_G_Overlaps function template<> template<> void object::test<8>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((-90 -90, -90 90, 190 -90, -90 -90))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Overlaps() failed with TRUE", OGR_G_Overlaps(g1_, g2_), FALSE); } // Test OGR_G_Touches function template<> template<> void object::test<9>() { char* wkt1 = "LINESTRING(0 0, 10 10)"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "LINESTRING(0 0, 0 10)"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Touches() failed with FALSE", OGR_G_Touches(g1_, g2_), TRUE); char* wkt3 = "POLYGON((20 20, 20 30, 30 20, 20 20))"; err_ = OGR_G_CreateFromWkt(&wkt3, NULL, &g3_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g3_); ensure_equals("OGR_G_Touches() failed with TRUE", OGR_G_Touches(g1_, g3_), FALSE); } // Test OGR_G_Within function template<> template<> void object::test<10>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((-90 -90, -90 90, 190 -90, -90 -90))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Within() failed with FALSE", OGR_G_Within(g1_, g2_), TRUE); ensure_equals("OGR_G_Within() failed with TRUE", OGR_G_Within(g2_, g1_), FALSE); } // Test OGR_G_Union function template<> template<> void object::test<11>() { char* wkt1 = "POINT(10 20)"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POINT(30 20)"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); g3_ = OGR_G_Union(g1_, g2_); ensure("OGR_G_Union failed with NULL", NULL != g3_); OGRGeometryH expect = NULL; char* wktExpect = "MULTIPOINT (10 20,30 20)"; err_ = OGR_G_CreateFromWkt(&wktExpect, NULL, &expect); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != expect); // Compare operation result against expected geometry ensure_equal_geometries(g3_, expect, 0.0001); OGR_G_DestroyGeometry(expect); } // Test OGR_G_Intersection function template<> template<> void object::test<12>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((0 0, 0 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); g3_ = OGR_G_Intersection(g1_, g2_); ensure("OGR_G_Intersection failed with NULL", NULL != g3_); OGRGeometryH expect = NULL; char* wktExpect = "POLYGON ((0 0,5 5,10 0,0 0))"; err_ = OGR_G_CreateFromWkt(&wktExpect, NULL, &expect); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != expect); // Compare operation result against expected geometry ensure_equal_geometries(g3_, expect, 0.0001); OGR_G_DestroyGeometry(expect); } // Test OGR_G_Difference function template<> template<> void object::test<13>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((0 0, 0 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); g3_ = OGR_G_Difference(g1_, g2_); ensure("OGR_G_Difference failed with NULL", NULL != g3_); OGRGeometryH expect = NULL; char* wktExpect = "POLYGON ((5 5,10 10,10 0,5 5))"; err_ = OGR_G_CreateFromWkt(&wktExpect, NULL, &expect); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != expect); // Compare operation result against expected geometry ensure_equal_geometries(g3_, expect, 0.0001); OGR_G_DestroyGeometry(expect); } // Test OGR_G_SymmetricDifference function template<> template<> void object::test<14>() { char* wkt1 = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt1, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wkt2 = "POLYGON((0 0, 0 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wkt2, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); g3_ = OGR_G_SymmetricDifference(g1_, g2_); ensure("OGR_G_SymmetricDifference failed with NULL", NULL != g3_); OGRGeometryH expect = NULL; char* wktExpect = "MULTIPOLYGON (((5 5,0 0,0 10,5 5)),((5 5,10 10,10 0,5 5)))"; err_ = OGR_G_CreateFromWkt(&wktExpect, NULL, &expect); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != expect); // Compare operation result against expected geometry ensure_equal_geometries(g3_, expect, 0.0001); OGR_G_DestroyGeometry(expect); } #else // HAVE_GEOS // Test GEOS support is disabled and shout about it template<> template<> void object::test<1>() { CPLDebug( "TEST", "GEOS support is not available" ); } #endif // ndef HAVE_GEOS #endif // OGR_ENABLED } // namespace tut gdalautotest-3.0.4/cpp/test_osr_pci.cpp0000644003401500001440000001417113614005367017624 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test some PCI specific translation issues. // Ported from osr/osr_pci.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_error.h" #include "cpl_string.h" #include "ogr_api.h" #include "ogr_srs_api.h" #include #include #include namespace tut { // Common fixture with test data struct test_osr_pci_data { OGRErr err_; OGRSpatialReferenceH srs_; test_osr_pci_data() : err_(OGRERR_NONE), srs_(nullptr) { srs_ = OSRNewSpatialReference(nullptr); } ~test_osr_pci_data() { OSRDestroySpatialReference(srs_); } }; // Register test group typedef test_group group; typedef group::object object; group test_osr_pci_group("OSR::PCI"); // Test the OGRSpatialReference::importFromPCI() and OSRImportFromPCI() template<> template<> void object::test<1>() { ensure("SRS handle is NULL", nullptr != srs_); const int size = 17; double params[size] = { 0.0, 0.0, 45.0, 54.5, 47.0, 62.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; err_ = OSRImportFromPCI(srs_, "EC E015", "METRE", params); ensure_equals("Can't import Equidistant Conic projection", err_, OGRERR_NONE); const double maxError = 0.0000005; double val = 0; val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("Standard parallel 1 is invalid", std::fabs(val - 47.0) <= maxError); val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("Standard parallel 2 is invalid", std::fabs(val - 62.0) <= maxError); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_CENTER, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("Latitude of center is invalid", std::fabs(val - 54.5) <= maxError); val = OSRGetProjParm(srs_, SRS_PP_LONGITUDE_OF_CENTER, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("Longitude of center is invalid", std::fabs(val - 45.0) <= maxError); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("False easting is invalid", std::fabs(val - 0.0) <= maxError); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); ensure_equals("OSRGetProjParm() failed", err_, OGRERR_NONE); ensure("False northing is invalid", std::fabs(val - 0.0) <= maxError); } // Test the OGRSpatialReference::exportToPCI() and OSRExportToPCI() template<> template<> void object::test<2>() { ensure("SRS handle is NULL", nullptr != srs_); const char* wkt = "PROJCS[\"unnamed\",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[\"Lambert_Conformal_Conic_2SP\"]," "PARAMETER[\"standard_parallel_1\",33.90363402777778]," "PARAMETER[\"standard_parallel_2\",33.62529002777778]," "PARAMETER[\"latitude_of_origin\",33.76446202777777]," "PARAMETER[\"central_meridian\",-117.4745428888889]," "PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0]," "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]]]"; err_ = OSRImportFromWkt(srs_, (char**) &wkt); ensure_equals("Can't import Lambert Conformal Conic projection", err_, OGRERR_NONE); char* proj = nullptr; char* units = nullptr; double* params = nullptr; err_ = OSRExportToPCI(srs_, &proj, &units, ¶ms); ensure_equals("OSRExportToPCI() failed", err_, OGRERR_NONE); ensure_equals("Invalid projection definition", std::string(proj), std::string("LCC D-01")); ensure_equals("Invalid projection units", std::string(units), std::string("METRE")); const double maxError = 0.0000005; ensure("Invalid 2nd projection parameter", std::fabs(params[2] - (-117.4745429)) <= maxError); ensure("Invalid 3rd projection parameter", std::fabs(params[3] - 33.76446203) <= maxError); ensure("Invalid 4th projection parameter", std::fabs(params[4] - 33.90363403) <= maxError); ensure("Invalid 5th projection parameter", std::fabs(params[5] - 33.62529003) <= maxError); CPLFree(proj); CPLFree(units); CPLFree(params); } } // namespace tut gdalautotest-3.0.4/cpp/makefile.vc0000644003401500001440000001437113614004466016533 0ustar rouaultusers# $Id: makefile.vc,v 1.5 2006/12/06 15:38:16 mloskot Exp $ # # Makefile to build GDAL C++ Unit Tests (subset of Python tests) # # These tests are dedicated to Windows CE platform and cover features # supported by Windows CE port of GDAL. # Also, compatible and runnable on Windows 2000/XP. # ############################################################################# # CONFIGURATION # GDAL library !IFNDEF GDAL_ROOT !IF EXIST("..\..\gdal\nmake.opt") GDAL_ROOT = ..\..\gdal !ENDIF !ENDIF !INCLUDE $(GDAL_ROOT)\nmake.opt # Specification of enabled GDAL drivers #GDAL_SUPPORT = \ # -DHAVE_GEOS \ # -DOGR_ENABLED \ # -DSHAPE_ENABLED \ # -DFRMT_aaigrid \ # -DFRMT_dted \ # -DFRMT_gtiff GDAL_SUPPORT = \ -DOGR_ENABLED \ -DSHAPE_ENABLED \ -DFRMT_aaigrid \ -DFRMT_dted \ -DFRMT_gtiff # END OF CONFIGURATION ############################################################################# GDAL_LIB = $(GDAL_ROOT)\gdal_i.lib INCLUDE_DIR = \ -I. \ -Itut \ -I$(PROJ4_ROOT)\src OBJ = \ test_cpl.obj \ test_alg.obj \ test_gdal.obj \ test_gdal_aaigrid.obj \ test_gdal_dted.obj \ test_gdal_gtiff.obj \ test_triangulation.obj \ test_ogr.obj \ test_ogr_geos.obj \ test_ogr_shape.obj \ test_osr.obj \ test_osr_ct.obj \ test_osr_pci.obj \ test_osr_proj4.obj \ test_marching_squares_square.obj \ test_marching_squares_tile.obj \ test_marching_squares_contour.obj \ test_marching_squares_polygon.obj \ tut/tut_gdal.obj # Commands RM = -del # Complete set of compilation flags CFLAGS = $(CFLAGS) $(INCLUDE_DIR) CPPFLAGS = $(CFLAGS) GDAL_TEST_EXE = gdal_unit_test.exe default: $(GDAL_TEST_EXE) testcopywords.exe testperfcopywords.exe testclosedondestroydm.exe testthreadcond.exe testblockcache.exe testblockcachewrite.exe testblockcachelimits.exe testdestroy.exe testmultithreadedwriting.exe test_include_from_c_file.exe test_c_include_from_cpp_file.exe bug1488.exe check: $(GDAL_TEST_EXE) testblockcache.exe testblockcachewrite.exe testblockcachelimits.exe testmultithreadedwriting.exe bug1488.exe $(GDAL_TEST_EXE) testblockcache.exe -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES testblockcache.exe -check -co TILED=YES --debug TEST,LOCK -loops 3 --config GDAL_RB_LOCK_DEBUG_CONTENTION YES --config GDAL_RB_LOCK_TYPE SPIN testblockcache.exe -check -co TILED=YES -migrate testblockcache.exe -check -memdriver testblockcachewrite.exe --debug ON testblockcachelimits.exe --debug ON testdestroy.exe testmultithreadedwriting.exe bug1488.exe check-all: check testcopywords.exe testperfcopywords.exe testclosedondestroydm.exe testthreadcond.exe testcopywords.exe testperfcopywords.exe testclosedondestroydm.exe testthreadcond.exe $(GDAL_TEST_EXE): gdal_unit_test.cpp $(GDAL_DLL) $(OBJ) $(CC) gdal_unit_test.cpp $(CFLAGS) $(OBJ) $(GDAL_LIB) $(GEOS_LIB) $(PROJ4_LIB) if exist $(GDAL_TEST_EXE).manifest mt -manifest $(GDAL_TEST_EXE).manifest -outputresource:$(GDAL_TEST_EXE);1 testcopywords.exe: testcopywords.cpp $(CC) testcopywords.cpp $(CFLAGS) $(GDAL_LIB) if exist testcopywords.exe.manifest mt -manifest testcopywords.exe.manifest -outputresource:testcopywords.exe;1 testperfcopywords.exe: testperfcopywords.cpp $(CC) testperfcopywords.cpp $(CFLAGS) $(GDAL_LIB) if exist testperfcopywords.exe.manifest mt -manifest testperfcopywords.exe.manifest -outputresource:testperfcopywords.exe;1 testclosedondestroydm.exe: testclosedondestroydm.cpp $(CC) testclosedondestroydm.cpp $(CFLAGS) $(GDAL_LIB) if exist testclosedondestroydm.exe.manifest mt -manifest testclosedondestroydm.exe.manifest -outputresource:testclosedondestroydm.exe;1 testthreadcond.exe: testthreadcond.cpp $(CC) testthreadcond.cpp $(CFLAGS) $(GDAL_LIB) if exist testthreadcond.exe.manifest mt -manifest testthreadcond.exe.manifest -outputresource:testthreadcond.exe;1 testblockcache.exe: testblockcache.cpp $(CC) testblockcache.cpp $(CFLAGS) $(GDAL_LIB) if exist testblockcache.exe.manifest mt -manifest testblockcache.exe.manifest -outputresource:testblockcache.exe;1 testblockcachewrite.exe: testblockcachewrite.cpp $(CC) testblockcachewrite.cpp $(CFLAGS) $(GDAL_LIB) if exist testblockcachewrite.exe.manifest mt -manifest testblockcachewrite.exe.manifest -outputresource:testblockcachewrite.exe;1 testmultithreadedwriting.exe: testmultithreadedwriting.cpp $(CC) testmultithreadedwriting.cpp $(CFLAGS) $(GDAL_LIB) if exist testmultithreadedwriting.exe.manifest mt -manifest testmultithreadedwriting.exe.manifest -outputresource:testmultithreadedwriting.exe;1 testblockcachelimits.exe: testblockcachelimits.cpp $(CC) testblockcachelimits.cpp $(CFLAGS) $(GDAL_LIB) if exist testblockcachelimits.exe.manifest mt -manifest testblockcachelimits.exe.manifest -outputresource:testblockcachelimits.exe;1 testdestroy.exe: testdestroy.cpp $(CC) testdestroy.cpp $(CFLAGS) $(GDAL_LIB) if exist testdestroy.exe.manifest mt -manifest testdestroy.exe.manifest -outputresource:testdestroy.exe;1 test_include_from_c_file.exe: test_include_from_c_file.c $(CC) test_include_from_c_file.c $(CFLAGS) $(GDAL_LIB) if exist test_include_from_c_file.exe.manifest mt -manifest test_include_from_c_file.exe.manifest -outputresource:test_include_from_c_file.exe;1 test_c_include_from_cpp_file.exe: test_c_include_from_cpp_file.cpp $(CC) test_c_include_from_cpp_file.cpp $(CFLAGS) $(GDAL_LIB) if exist test_c_include_from_cpp_file.exe.manifest mt -manifest test_c_include_from_cpp_file.exe.manifest -outputresource:test_c_include_from_cpp_file.exe;1 bug1488.exe: bug1488.cpp $(CC) bug1488.cpp $(CFLAGS) $(GDAL_LIB) if exist bug1488.exe.manifest mt -manifest bug1488.exe.manifest -outputresource:bug1488.exe;1 copy-gdal-dll: $(GDAL_DLL) $(GDAL_DLL): $(GDAL_ROOT)\$(GDAL_DLL) copy /y $(GDAL_ROOT)\$(GDAL_DLL) . .cpp.obj: $(CC) $(CFLAGS) /c $*.cpp /Fo$@ .c.obj: $(CC) $(CFLAGS) /c $*.c /Fo$@ clean: $(RM) *~ $(RM) *.dll $(RM) *.exe $(RM) *.exp $(RM) *.ilk $(RM) *.lib $(RM) *.manifest $(RM) *.obj $(RM) *.pdb $(RM) tmp\*.dbf $(RM) tmp\*.dt0 $(RM) tmp\*.grd $(RM) tmp\*.shp $(RM) tmp\*.shx $(RM) tut\*.obj gdalautotest-3.0.4/cpp/testsse.cpp0000644003401500001440000001753013614005367016623 0ustar rouaultusers#include #include "gdalsse_priv.h" #define MY_ASSERT(x) do { if (!(x)) { printf("test at line %d failed !\n", __LINE__); exit(1); } } while(0) int main() { { double x = 1.23; XMMReg4Double reg = XMMReg4Double::Load1ValHighAndLow(&x); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == x); MY_ASSERT(res[1] == x); MY_ASSERT(res[2] == x); MY_ASSERT(res[3] == x); } { unsigned char input[] = { 1, 2, 3, 4 }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); unsigned char output[4]; reg.Store4Val(output); MY_ASSERT(output[0] == input[0]); MY_ASSERT(output[1] == input[1]); MY_ASSERT(output[2] == input[2]); MY_ASSERT(output[3] == input[3]); } { unsigned short input[] = { 1, 65535, 3, 65534 }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); unsigned short output[4]; reg.Store4Val(output); MY_ASSERT(output[0] == input[0]); MY_ASSERT(output[1] == input[1]); MY_ASSERT(output[2] == input[2]); MY_ASSERT(output[3] == input[3]); } { short input[] = { 1, 32767, 3, -32768 }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); } { float input[] = { 1.0f, 2.0f, 3.0f, 4.0f }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); float output[4]; reg.Store4Val(output); MY_ASSERT(output[0] == input[0]); MY_ASSERT(output[1] == input[1]); MY_ASSERT(output[2] == input[2]); MY_ASSERT(output[3] == input[3]); } { double input[] = { 1.0, 2.0, 3.0, 4.0 }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); double res[4]; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); MY_ASSERT(reg.GetHorizSum() == input[0] + input[1] + input[2] + input[3]); double input2[] = { 100.0, 200.0 }; reg.AddToLow( XMMReg2Double::Load2Val(input2) ); reg.Store4Val(res); MY_ASSERT(res[0] == input[0] + input2[0]); MY_ASSERT(res[1] == input[1] + input2[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); } { double input[] = { 1.0, 2.0, 3.0, 4.0 }; double input2[] = { 10.0, 9.0, 8.0, 7.0 }; XMMReg4Double reg = XMMReg4Double::Load4Val(input); XMMReg4Double reg2 = XMMReg4Double::Load4Val(input2); double res[4]; (reg + reg2).Store4Val(res); MY_ASSERT(res[0] == input[0] + input2[0]); MY_ASSERT(res[1] == input[1] + input2[1]); MY_ASSERT(res[2] == input[2] + input2[2]); MY_ASSERT(res[3] == input[3] + input2[3]); reg += reg2; reg.Store4Val(res); MY_ASSERT(res[0] == input[0] + input2[0]); MY_ASSERT(res[1] == input[1] + input2[1]); MY_ASSERT(res[2] == input[2] + input2[2]); MY_ASSERT(res[3] == input[3] + input2[3]); reg = reg - reg2; reg.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); (reg * reg2).Store4Val(res); MY_ASSERT(res[0] == input[0] * input2[0]); MY_ASSERT(res[1] == input[1] * input2[1]); MY_ASSERT(res[2] == input[2] * input2[2]); MY_ASSERT(res[3] == input[3] * input2[3]); (reg / reg2).Store4Val(res); MY_ASSERT(res[0] == input[0] / input2[0]); MY_ASSERT(res[1] == input[1] / input2[1]); MY_ASSERT(res[2] == input[2] / input2[2]); MY_ASSERT(res[3] == input[3] / input2[3]); reg *= reg2; reg.Store4Val(res); MY_ASSERT(res[0] == input[0] * input2[0]); MY_ASSERT(res[1] == input[1] * input2[1]); MY_ASSERT(res[2] == input[2] * input2[2]); MY_ASSERT(res[3] == input[3] * input2[3]); reg = XMMReg4Double::Load4Val(input); reg2 = reg; reg2.Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == input[3]); unsigned char mask[32]; XMMReg4Double::Equals(reg, reg).StoreMask(mask); MY_ASSERT(mask[0] == 0xFF); MY_ASSERT(mask[8] == 0xFF); MY_ASSERT(mask[16] == 0xFF); MY_ASSERT(mask[24] == 0xFF); XMMReg4Double::NotEquals(reg, reg).StoreMask(mask); MY_ASSERT(mask[0] == 0); MY_ASSERT(mask[8] == 0); MY_ASSERT(mask[16] == 0); MY_ASSERT(mask[24] == 0); XMMReg4Double::Greater(reg, reg).StoreMask(mask); MY_ASSERT(mask[0] == 0); MY_ASSERT(mask[8] == 0); MY_ASSERT(mask[16] == 0); MY_ASSERT(mask[24] == 0); double diff[] = { 1.5, -1.5, -0.5, 0.5 }; XMMReg4Double::Greater(reg, reg + XMMReg4Double::Load4Val(diff)).StoreMask(mask); MY_ASSERT(mask[0] == 0); MY_ASSERT(mask[8] == 0xFF); MY_ASSERT(mask[16] == 0xFF); MY_ASSERT(mask[24] == 0); XMMReg4Double::Min(reg, reg + XMMReg4Double::Load4Val(diff)).Store4Val(res); MY_ASSERT(res[0] == input[0]); MY_ASSERT(res[1] == input[1] + diff[1]); MY_ASSERT(res[2] == input[2] + diff[2]); MY_ASSERT(res[3] == input[3]); reg = XMMReg4Double::Load4Val(input); XMMReg4Double reg_diff = XMMReg4Double::Load4Val(diff); XMMReg4Double::Ternary(XMMReg4Double::Greater(reg, reg + reg_diff), reg, reg_diff).Store4Val(res); MY_ASSERT(res[0] == diff[0]); MY_ASSERT(res[1] == input[1]); MY_ASSERT(res[2] == input[2]); MY_ASSERT(res[3] == diff[3]); } #ifndef USE_SSE2_EMULATION { float input[] = { -1.3f, 1.5f, 40000.3f, 65537.0f }; GUInt16 output[4]; GDALCopy4Words(input, output); MY_ASSERT(output[0] == 0); MY_ASSERT(output[1] == 2); MY_ASSERT(output[2] == 40000); MY_ASSERT(output[3] == 65535); } #endif #ifndef USE_SSE2_EMULATION { float input[] = { -1.3f, 1.5f, 40000.3f, 65537.0f, 40000.3f, 1.3f, 65537.0f, -1.3f }; GUInt16 output[8]; GDALCopy8Words(input, output); MY_ASSERT(output[0] == 0); MY_ASSERT(output[1] == 2); MY_ASSERT(output[2] == 40000); MY_ASSERT(output[3] == 65535); MY_ASSERT(output[4] == 40000); MY_ASSERT(output[5] == 1); MY_ASSERT(output[6] == 65535); MY_ASSERT(output[7] == 0); } { float input[] = { -1.3f, 1.5f, 40000.3f, 65537.0f, 40000.3f, 1.3f, 65537.0f, -1.3f }; unsigned char output[8]; GDALCopy8Words(input, output); MY_ASSERT(output[0] == 0); MY_ASSERT(output[1] == 2); MY_ASSERT(output[2] == 255); MY_ASSERT(output[3] == 255); MY_ASSERT(output[4] == 255); MY_ASSERT(output[5] == 1); MY_ASSERT(output[6] == 255); MY_ASSERT(output[7] == 0); } #endif return 0; } gdalautotest-3.0.4/cpp/gdal_unit_test.h0000644003401500001440000000305613614005367017601 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Common definitions used in C++ Test Suite for GDAL // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #ifndef GDAL_COMMON_H_INCLUDED #define GDAL_COMMON_H_INCLUDED #include "cpl_port.h" #include #include namespace tut { namespace common { // Data directory path used by GDAL C++ Unit Tests subset extern std::string const data_basedir; // Temp directory path extern std::string const tmp_basedir; } // common } // tut #endif // GDAL_COMMON_H_INCLUDED gdalautotest-3.0.4/cpp/testclosedondestroydm.cpp0000644003401500001440000002214213614005367021565 0ustar rouaultusers/****************************************************************************** * $Id: testclosedondestroydm.cpp d0324f3133c5df3fe1fab416bad22360ef5a4de5 2018-03-21 01:38:08Z Even Rouault $ * * Project: GDAL Core * Purpose: Test block cache & writing behaviour under multi-threading * 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. ****************************************************************************/ #include "cpl_conv.h" #include "cpl_string.h" #include "gdal_alg.h" #include "gdal_priv.h" #include "gdal.h" #include #include "test_data.h" static void OpenJPEG2000(const char* pszFilename) { const int N_DRIVERS = 6; const char* const apszDrivers[] = {"JP2ECW", "JP2OpenJPEG", "JPEG2000" , "JP2MrSID", "JP2KAK", "JP2Lura" }; GDALDriverH aphDrivers[ N_DRIVERS ]; GDALDatasetH hDS; int i, j; for(i=0;i" "" "" "" GCORE_DATA_DIR "byte.tif" "1" "" "" "" "" "" ""); fclose(f); hDS = GDALOpen("byte.vrt", GA_ReadOnly); nOvrLevel = 2; nBandNum = 1; CPL_IGNORE_RET_VAL(GDALBuildOverviews( hDS, "NEAR", 1, &nOvrLevel, 1, &nBandNum, nullptr, nullptr)); GDALClose(hDS); hDS = GDALOpen("byte.vrt", GA_ReadOnly); GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0, GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS)); GDALGetOverviewCount(GDALGetRasterBand(hDS, 1)); hDS = GDALOpen("" "" "" "byte.vrt" "1" "" "" "" "" "" "", GA_ReadOnly); GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0, GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS)); hDS = GDALOpenShared(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); hDS = GDALOpenShared(GCORE_DATA_DIR "byte.tif", GA_ReadOnly); hDS = GDALOpenShared(GDRIVERS_DIR "data/mercator.sid", GA_ReadOnly); hDS = GDALOpen("RASTERLITE:" GDRIVERS_DIR "data/rasterlite_pyramids.sqlite,table=test", GA_ReadOnly); hDS = GDALOpen("RASTERLITE:" GDRIVERS_DIR "data/rasterlite_pyramids.sqlite,table=test,level=1", GA_ReadOnly); OpenJPEG2000(GDRIVERS_DIR "data/rgbwcmyk01_YeGeo_kakadu.jp2"); hDS = GDALOpen(GDRIVERS_DIR "tmp/cache/Europe 2001_OZF.map", GA_ReadOnly); CPLDebug("TEST","Call GDALDestroyDriverManager()"); GDALDestroyDriverManager(); unlink("byte.tif"); unlink("byte.tif.ovr"); unlink("byte2.tif"); unlink("byte3.tif"); unlink("byte3.tif.msk"); unlink("byte.vrt"); return 0; } gdalautotest-3.0.4/cpp/test_marching_squares_tile.cpp0000644003401500001440000005572413614005367022547 0ustar rouaultusers/****************************************************************************** * $Id: test_marching_squares_tile.cpp 25d6f6f3485f45a339ed5097cbcaab4f8d2921ce 2018-12-14 22:28:23 +0100 Even Rouault $ * * Project: GDAL algorithms * Purpose: Tests for the marching squares algorithm * Author: Hugo Mercier, * ****************************************************************************** * Copyright (c) 2018, Hugo Mercier, * * 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. ****************************************************************************/ #include "gdal_unit_test.h" #include "gdal_alg.h" #include "marching_squares/point.h" #include "marching_squares/level_generator.h" #include "marching_squares/contour_generator.h" #include #include namespace marching_squares { struct Writer { typedef std::pair< Point, Point > Segment; static bool coordEquals( double a, double b ) { return (a-b)*(a-b) < 0.001; } void addSegment(int levelIdx, const Point &first, const Point &second) { contours[levelIdx].push_back(Segment(first, second)); } void addBorderSegment(int levelIdx, const Point &first, const Point &second) { borders[levelIdx].push_back(Segment(first, second)); } // check if a segment is in a set of borders bool segmentInBorders( int levelIdx, const Segment& segmentToTest ) const { std::vector segments = borders.find( levelIdx )->second; for ( Segment& s : segments ) { // (A,B) == (A,B) || (A,B) == (B,A) if ( ( ( coordEquals( s.first.x, segmentToTest.first.x ) ) && ( coordEquals( s.first.y, segmentToTest.first.y ) ) && ( coordEquals( s.second.x, segmentToTest.second.x ) ) && ( coordEquals( s.second.y, segmentToTest.second.y ) ) ) || ( ( coordEquals( s.second.x, segmentToTest.first.x ) ) && ( coordEquals( s.second.y, segmentToTest.first.y ) ) && ( coordEquals( s.first.x, segmentToTest.second.x ) ) && ( coordEquals( s.first.y, segmentToTest.second.y ) ) ) ) return true; } return false; } // check if a segment is in a set of contours bool segmentInContours( int levelIdx, const Segment& segmentToTest ) const { std::vector segments = contours.find( levelIdx )->second; for ( Segment& s : segments ) { // (A,B) == (A,B) || (A,B) == (B,A) if ( ( ( coordEquals( s.first.x, segmentToTest.first.x ) ) && ( coordEquals( s.first.y, segmentToTest.first.y ) ) && ( coordEquals( s.second.x, segmentToTest.second.x ) ) && ( coordEquals( s.second.y, segmentToTest.second.y ) ) ) || ( ( coordEquals( s.second.x, segmentToTest.first.x ) ) && ( coordEquals( s.second.y, segmentToTest.first.y ) ) && ( coordEquals( s.first.x, segmentToTest.second.x ) ) && ( coordEquals( s.first.y, segmentToTest.second.y ) ) ) ) return true; } return false; } void beginningOfLine() {} void endOfLine() {} std::map< int, std::vector< Segment > > contours; std::map< int, std::vector< Segment > > borders; const bool polygonize = true; }; } namespace tut { using namespace marching_squares; // Common fixture with test data struct test_ms_tile_data { }; // Register test group typedef test_group group; typedef group::object object; group test_ms_tile_group("MarchingSquares:Tile"); // Dummy test template<> template<> void object::test<1>() { // only one pixel of value 2.0 // levels = 0, 10 std::vector data = { 2.0 }; IntervalLevelRangeIterator levels( 0.0, 10.0 ); Writer writer; ContourGenerator cg( 1, 1, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); ensure_equals( "There is 1 border", writer.borders.size(), size_t(1) ); ensure_equals( "It has 8 segments", writer.borders[1].size(), size_t(8) ); ensure( "Check border segment #1", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.0 ), Point( 0.5, 0.0 )) ) ); ensure( "Check border segment #2", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 0.0 ), Point( 1.0, 0.0 )) ) ); ensure( "Check border segment #3", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.0 ), Point( 1.0, 0.5 )) ) ); ensure( "Check border segment #4", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.5 ), Point( 1.0, 1.0 )) ) ); ensure( "Check border segment #5", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 1.0 ), Point( 0.5, 1.0 )) ) ); ensure( "Check border segment #6", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 1.0 ), Point( 0.0, 1.0 )) ) ); ensure( "Check border segment #7", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 1.0 ), Point( 0.0, 0.5 )) ) ); ensure( "Check border segment #8", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.5 ), Point( 0.0, 0.0 )) ) ); } template<> template<> void object::test<2>() { // Tile with one pixel, value below // only one pixel of value 2.0 // levels = 0, 10 std::vector data = { 2.0 }; const double levels[] = { 0.0 }; FixedLevelRangeIterator levelGenerator( levels, 1 ); Writer writer; ContourGenerator cg( 1, 1, /* hasNoData */ false, NaN, writer, levelGenerator ); cg.feedLine( &data[0] ); ensure_equals( "There is 1 border", writer.borders.size(), size_t(1) ); ensure( "Level = inf", levelGenerator.level(1) == Inf ); ensure_equals( "It has 8 segments", writer.borders[1].size(), size_t(8) ); ensure( "Check border segment #1", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.0 ), Point( 0.5, 0.0 )) ) ); ensure( "Check border segment #2", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 0.0 ), Point( 1.0, 0.0 )) ) ); ensure( "Check border segment #3", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.0 ), Point( 1.0, 0.5 )) ) ); ensure( "Check border segment #4", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.5 ), Point( 1.0, 1.0 )) ) ); ensure( "Check border segment #5", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 1.0 ), Point( 0.5, 1.0 )) ) ); ensure( "Check border segment #6", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 1.0 ), Point( 0.0, 1.0 )) ) ); ensure( "Check border segment #7", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 1.0 ), Point( 0.0, 0.5 )) ) ); ensure( "Check border segment #8", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.5 ), Point( 0.0, 0.0 )) ) ); } template<> template<> void object::test<3>() { // Tile with one pixel (2) // only one pixel of value 2.0 // levels = 2, 10 std::vector data = { 2.0 }; IntervalLevelRangeIterator levels( 2.0, 10.0 ); Writer writer; ContourGenerator cg( 1, 1, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); ensure_equals( "1 border", writer.borders.size(), size_t(1)); ensure_equals( "It has 8 segments", writer.borders[1].size(), size_t(8) ); ensure( "Check border segment #1", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.0 ), Point( 0.5, 0.0 )) ) ); ensure( "Check border segment #2", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 0.0 ), Point( 1.0, 0.0 )) ) ); ensure( "Check border segment #3", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.0 ), Point( 1.0, 0.5 )) ) ); ensure( "Check border segment #4", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.5 ), Point( 1.0, 1.0 )) ) ); ensure( "Check border segment #5", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 1.0 ), Point( 0.5, 1.0 )) ) ); ensure( "Check border segment #6", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 1.0 ), Point( 0.0, 1.0 )) ) ); ensure( "Check border segment #7", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 1.0 ), Point( 0.0, 0.5 )) ) ); ensure( "Check border segment #8", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.5 ), Point( 0.0, 0.0 )) ) ); } template<> template<> void object::test<4>() { // Tile with two pixels // two pixels // 10 7 // levels = 8 // // pixels // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 10 | 7 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // // squares // +-----+-----+-----+-----+ // |NaN | NaN | NaN | NaN | // | +.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : |10: | 7: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | : | : | : | // | +.....+.....+.....+ | // | NaN | NaN | NaN | NaN | // +-----+-----+-----+-----+ // // subsquares // legend: // : contour // = border (level 8) // # border (level 18) // // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 10 10| 8.5 7| 7 | // | +#########+########+###o=====+========+ | // | # | | : | || | // | # | | : | || | // | # | | : | || | // +--------+---------+--------+---o-----+--------+|--------+ // |NaN 10# 10| 8.5 : 7| 7 || NaN| // | # | | : | || | // | # | | : | || | // | +#########+########+###o=====+========+ | // | 10 10| 8.5 7| 7 | // | (0,1) | (1,1) | (2,1) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 10.0, 7.0 }; { IntervalLevelRangeIterator levels( 8.0, 10.0 ); Writer writer; ContourGenerator cg( 2, 1, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); // check borders ensure_equals( "There are 2 borders", writer.borders.size(), size_t(2) ); ensure_equals( "First border has 6 segments", writer.borders[0].size(), size_t(6) ); ensure_equals( "Second border has 8 segments", writer.borders[1].size(), size_t(8) ); ensure( "Check border segment #1.1", writer.segmentInBorders( 0, std::make_pair( Point( 1.166, 0.0 ), Point( 1.5, 0.0 )) ) ); ensure( "Check border segment #1.2", writer.segmentInBorders( 0, std::make_pair( Point( 1.5, 0.0 ), Point( 2.0, 0.0 )) ) ); ensure( "Check border segment #1.3", writer.segmentInBorders( 0, std::make_pair( Point( 2.0, 0.0 ), Point( 2.0, 0.5 )) ) ); ensure( "Check border segment #1.4", writer.segmentInBorders( 0, std::make_pair( Point( 2.0, 0.5 ), Point( 2.0, 1.0 )) ) ); ensure( "Check border segment #1.5", writer.segmentInBorders( 0, std::make_pair( Point( 2.0, 1.0 ), Point( 1.5, 1.0 )) ) ); ensure( "Check border segment #1.6", writer.segmentInBorders( 0, std::make_pair( Point( 1.5, 1.0 ), Point( 1.166, 1.0 )) ) ); ensure( "Check border segment #2.1", writer.segmentInBorders( 1, std::make_pair( Point( 1.166, 0.0 ), Point( 1.0, 0.0 )) ) ); ensure( "Check border segment #2.2", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.0 ), Point( 0.5, 0.0 )) ) ); ensure( "Check border segment #2.3", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 0.0 ), Point( 0.0, 0.0 )) ) ); ensure( "Check border segment #2.4", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.0 ), Point( 0.0, 0.5 )) ) ); ensure( "Check border segment #2.5", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.5 ), Point( 0.0, 1.0 )) ) ); ensure( "Check border segment #2.6", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 1.0 ), Point( 0.5, 1.0 )) ) ); ensure( "Check border segment #2.7", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 1.0 ), Point( 1.0, 1.0 )) ) ); ensure( "Check border segment #2.8", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 1.0 ), Point( 1.166, 1.0 )) ) ); } } template<> template<> void object::test<5>() { // four pixels // 10 7 // 4 5 // levels = 8 // pixels // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 10 | 7 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | 4 | 5 | NaN | // | | | | | // +-----+-----+-----+-----+ // | | | | | // | NaN | NaN | NaN | NaN | // | | | | | // +-----+-----+-----+-----+ // // squares // +-----+-----+-----+-----+ // |NaN | NaN | NaN | NaN | // | +.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : |10: | 7: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | 4: | 5: |NaN | // NaN+.....+.....+.....+ | // | : | : | : | : | // +--:--+--:--+--:--+--:--+ // | : | : | : | : | // | +.....+.....+.....+ | // | NaN | NaN | NaN | NaN | // +-----+-----+-----+-----+ // // subsquares // legend: // : contour // = border (level 8) // # border (level 18) // // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 10 10| 8.5 7| 7 | // | +#########+########+###o=====+========++ | // | # | | : | || | // | # | | : | || | // | # | | : | || | // +--------+---------+--------+---o-----+--------++--------+ // |NaN 10# 10| ........: 7| 7 || NaN| // | o.........o..: | || | // | || | | || | // | 7++---------+ 7 6 +--------++ | // | || | | || | // | || | | || | // | || | 4.5 | || | // +-------++---------+--------+---------+--------++--------+ // |NaN 4|| 4 | | 5| 5 || NaN| // | || | | | || | // | || | | | || | // | ++=========+========+=========+========++ | // | 4 4 | 4.5 5| 5 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 10.0, 7.0, 4.0, 5.0 }; { IntervalLevelRangeIterator levels( 8.0, 10.0 ); Writer writer; ContourGenerator cg( 2, 2, /* hasNoData */ false, NaN, writer, levels ); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); // check borders ensure_equals( "2 borders", writer.borders.size(), size_t(2) ); ensure_equals( "13 segments on the first", writer.borders[0].size(), size_t(13) ); ensure_equals( "5 segments on the second", writer.borders[1].size(), size_t(5) ); ensure( "Check border segment #1", writer.segmentInBorders( 1, std::make_pair( Point( 1.166, 0.0 ), Point( 1.0, 0.0 )) ) ); ensure( "Check border segment #2", writer.segmentInBorders( 1, std::make_pair( Point( 1.0, 0.0 ), Point( 0.5, 0.0 )) ) ); ensure( "Check border segment #3", writer.segmentInBorders( 1, std::make_pair( Point( 0.5, 0.0 ), Point( 0.0, 0.0 )) ) ); ensure( "Check border segment #4", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.0 ), Point( 0.0, 0.5 )) ) ); ensure( "Check border segment #5", writer.segmentInBorders( 1, std::make_pair( Point( 0.0, 0.5 ), Point( 0.0, 0.833 )) ) ); // check contour ensure_equals( "2 contours", writer.contours.size(), size_t(2) ); ensure_equals( "3 segments in the first", writer.contours[0].size(), size_t(3) ); ensure( "Check contour segment #1", writer.segmentInContours( 0, std::make_pair( Point( 1.166, 0.0 ), Point( 1.166, 0.5 )) ) ); ensure( "Check contour segment #2", writer.segmentInContours( 0, std::make_pair( Point( 1.166, 0.5 ), Point( 0.5, 0.833 )) ) ); ensure( "Check contour segment #3", writer.segmentInContours( 0, std::make_pair( Point( 0.5, 0.833 ), Point( 0.0, 0.833 )) ) ); } } template<> template<> void object::test<6>() { // four pixels // 155 155.01 // 154.99 155 // levels = 155 // NaN NaN NaN // +------------------+------------------+------------------+ // | | | | // | (0,0) | (1,0) | (2,0) | // | 155 | 155.005 | 155.01 | // | +---------+--------+---------+---------+ | // | | 155 | 155.01 | | // | | | | | | | // | | | 155.005 | | | // +--------+---------+--------+---------+---------+--------+ // |NaN 155 155 155.01 155.01 NaN| // | | | | | | // | 154.995 | | 155.005 | // | +-------154.995 155.005------+ | // | | | | | | // | | | | | | // | | | | | | // +--------+---------+--------+---------+---------+--------+ // |NaN 154.99 154.99 154.995 155 155 NaN| // | | | | | | | // | | | | | | | // | +---------+--------+---------+---------+ | // | 154.99 154.99 154.995 155 155 | // | (0,2) | (1,2) | (2,2) | // | | | | // +------------------+------------------+------------------+ // NaN NaN NaN NaN std::vector data = { 155.0, 155.01, 154.99, 155.0 }; { const double levels[] = { 155.0 }; FixedLevelRangeIterator levelGenerator( levels, 1 ); Writer writer; ContourGenerator cg( 2, 2, /* hasNoData */ false, NaN, writer, levelGenerator ); cg.feedLine( &data[0] ); cg.feedLine( &data[2] ); // check borders ensure_equals( "2 borders", writer.borders.size(), size_t(2) ); ensure_equals( "1 border @ 155.0", levelGenerator.level(0), 155.0 ); ensure( "1 border @ Inf", levelGenerator.level(1) == Inf ); ensure_equals( "First border has 6 segments", writer.borders[0].size(), size_t(6) ); ensure_equals( "Second border has 12 segments", writer.borders[1].size(), size_t(12) ); } } } gdalautotest-3.0.4/cpp/tut/0000755003401500001440000000000013614005367015233 5ustar rouaultusersgdalautotest-3.0.4/cpp/tut/tut_gdal.h0000644003401500001440000000764013614005367017216 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: TUT: C++ Unit Test Framework extensions for GDAL Test Suite // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #ifndef TUT_GDAL_H_INCLUDED #define TUT_GDAL_H_INCLUDED #include "ogr_api.h" // GDAL #include #include #include #include namespace tut { #if defined(WIN32) #define SEP "\\" #else #define SEP "/" #endif // // Template of attribute reading function and its specializations // template inline void read_feature_attribute(OGRFeatureH , int , T& ) { assert(!"Can't find read_feature_attribute specialization for given type"); } template <> inline void read_feature_attribute(OGRFeatureH feature, int index, int& val) { val = OGR_F_GetFieldAsInteger(feature, index); } template <> inline void read_feature_attribute(OGRFeatureH feature, int index, double& val) { val = OGR_F_GetFieldAsDouble(feature, index); } template <> inline void read_feature_attribute(OGRFeatureH feature, int index, std::string& val) { val = OGR_F_GetFieldAsString(feature, index); } // // Test equality of two OGR geometries according to passed tolerance. // void ensure_equal_geometries(OGRGeometryH lhs, OGRGeometryH rhs, double tolerance); // // Test layer attributes from given field against expected list of values // template void ensure_equal_attributes(OGRLayerH layer, std::string const& field, T const& list) { ensure("Layer is NULL", nullptr != layer); OGRFeatureDefnH featDefn = OGR_L_GetLayerDefn(layer); ensure("Layer schema is NULL",nullptr != featDefn); int fldIndex = OGR_FD_GetFieldIndex(featDefn, field.c_str()); std::ostringstream os; os << "Can't find field '" << field << "'"; ensure(os.str(), fldIndex >= 0); // Test value in tested field from subsequent features OGRFeatureH feat = nullptr; OGRFieldDefnH fldDefn = nullptr; typename T::value_type attrVal; for (typename T::const_iterator it = list.begin(); it != list.end(); ++it) { feat = OGR_L_GetNextFeature(layer); fldDefn = OGR_F_GetFieldDefnRef(feat, fldIndex); ensure("Field schema is NULL",nullptr != fldDefn); read_feature_attribute(feat, fldIndex, attrVal); OGR_F_Destroy(feat); // Test attribute against expected value ensure_equals("Attributes not equal", (*it), attrVal); } // Check if not too many features filtered feat = OGR_L_GetNextFeature(layer); bool notTooMany = (nullptr == feat); OGR_F_Destroy(feat); ensure("Got more features than expected", notTooMany); } template void ensure_approx_equals(T const& a, T const& b) { std::ostringstream os; os << "Approx. equality failed: " << a << " != " << b; ensure(os.str(), (a == 0.0 || b == 0.0) ? fabs(a-b) <= .00000000001 : fabs(1.0 * b / a - 1.0) <= .00000000001); } } // namespace tut #endif // TUT_GDAL_H_INCLUDED gdalautotest-3.0.4/cpp/tut/tut_result.hpp0000644003401500001440000000466413614004466020167 0ustar rouaultusers#ifndef TUT_RESULT_H_GUARD #define TUT_RESULT_H_GUARD #if defined(TUT_USE_POSIX) #include #include #endif #include namespace tut { #if defined(TUT_USE_POSIX) struct test_result_posix { test_result_posix() : pid(getpid()) { } pid_t pid; }; #else struct test_result_posix { }; #endif /** * Return type of ran test/test group. * * For test: contains result of test and, possible, message * for failure or exception. */ struct test_result : public test_result_posix { /** * Test group name. */ std::string group; /** * Test number in group. */ int test; /** * Test name (optional) */ std::string name; /** * ok - test finished successfully * fail - test failed with ensure() or fail() methods * ex - test throwed an exceptions * warn - test finished successfully, but test destructor throwed * term - test forced test application to terminate abnormally */ enum result_type { ok, fail, ex, warn, term, ex_ctor, rethrown, dummy }; result_type result; /** * Exception message for failed test. */ std::string message; std::string exception_typeid; /** * Default constructor. */ test_result() : test(0), result(ok) { } /** * Constructor. */ test_result(const std::string& grp, int pos, const std::string& test_name, result_type res) : group(grp), test(pos), name(test_name), result(res) { } /** * Constructor with exception. */ test_result(const std::string& grp,int pos, const std::string& test_name, result_type res, const std::exception& exIn) : group(grp), test(pos), name(test_name), result(res), message(exIn.what()), exception_typeid(typeid(exIn).name()) { } /** Constructor with typeid. */ test_result(const std::string& grp,int pos, const std::string& test_name, result_type res, const std::string& ex_typeid, const std::string& msg) : group(grp), test(pos), name(test_name), result(res), message(msg), exception_typeid(ex_typeid) { } }; } #endif gdalautotest-3.0.4/cpp/tut/tut_console_reporter.hpp0000644003401500001440000001355413614004466022233 0ustar rouaultusers#ifndef TUT_CONSOLE_REPORTER #define TUT_CONSOLE_REPORTER #include #include /** * Template Unit Tests Framework for C++. * http://tut.dozen.ru * * @author Vladimir Dyuzhev, Vladimir.Dyuzhev@gmail.com */ namespace { std::ostream& operator<<(std::ostream& os, const tut::test_result& tr) { switch(tr.result) { case tut::test_result::ok: os << '.'; break; case tut::test_result::fail: os << '[' << tr.test << "=F]"; break; case tut::test_result::ex_ctor: os << '[' << tr.test << "=C]"; break; case tut::test_result::ex: os << '[' << tr.test << "=X]"; break; case tut::test_result::warn: os << '[' << tr.test << "=W]"; break; case tut::test_result::term: os << '[' << tr.test << "=T]"; break; case tut::test_result::rethrown: os << '[' << tr.test << "=P]"; break; case tut::test_result::dummy: assert(!"Should never be called"); } return os; } } // end of namespace namespace tut { /** * Default TUT callback handler. */ class console_reporter : public tut::callback { std::string current_group; typedef std::vector not_passed_list; not_passed_list not_passed; std::ostream& os; public: int ok_count; int exceptions_count; int failures_count; int terminations_count; int warnings_count; console_reporter() : os(std::cout) { init(); } console_reporter(std::ostream& out) : os(out) { init(); } void run_started() CPL_OVERRIDE { init(); } void test_completed(const tut::test_result& tr) CPL_OVERRIDE { if (tr.group != current_group) { os << std::endl << tr.group << ": " << std::flush; current_group = tr.group; } os << tr << std::flush; // update global statistics switch (tr.result) { case test_result::ok: ok_count++; break; case test_result::fail: case test_result::rethrown: failures_count++; break; case test_result::ex: case test_result::ex_ctor: exceptions_count++; break; case test_result::warn: warnings_count++; break; case test_result::term: terminations_count++; break; case tut::test_result::dummy: assert(!"Should never be called"); } // switch if (tr.result != tut::test_result::ok) { not_passed.push_back(tr); } } void run_completed() CPL_OVERRIDE { os << std::endl; if (not_passed.size() > 0) { not_passed_list::const_iterator i = not_passed.begin(); while (i != not_passed.end()) { tut::test_result tr = *i; os << std::endl; os << "---> " << "group: " << tr.group << ", test: test<" << tr.test << ">" << (!tr.name.empty() ? (std::string(" : ") + tr.name) : std::string()) << std::endl; #if defined(TUT_USE_POSIX) if(tr.pid != getpid()) { os << " child pid: " << tr.pid << std::endl; } #endif os << " problem: "; switch(tr.result) { case test_result::rethrown: os << "assertion failed in child" << std::endl; break; case test_result::fail: os << "assertion failed" << std::endl; break; case test_result::ex: case test_result::ex_ctor: os << "unexpected exception" << std::endl; if( tr.exception_typeid != "" ) { os << " exception typeid: " << tr.exception_typeid << std::endl; } break; case test_result::term: os << "would be terminated" << std::endl; break; case test_result::warn: os << "test passed, but cleanup code (destructor) raised" " an exception" << std::endl; break; default: break; } if (!tr.message.empty()) { if (tr.result == test_result::fail) { os << " failed assertion: \"" << tr.message << "\"" << std::endl; } else { os << " message: \"" << tr.message << "\"" << std::endl; } } ++i; } } os << std::endl; os << "tests summary:"; if (terminations_count > 0) { os << " terminations:" << terminations_count; } if (exceptions_count > 0) { os << " exceptions:" << exceptions_count; } if (failures_count > 0) { os << " failures:" << failures_count; } if (warnings_count > 0) { os << " warnings:" << warnings_count; } os << " ok:" << ok_count; os << std::endl; } bool all_ok() const { return not_passed.empty(); } private: void init() { ok_count = 0; exceptions_count = 0; failures_count = 0; terminations_count = 0; warnings_count = 0; not_passed.clear(); } }; } #endif gdalautotest-3.0.4/cpp/tut/tut_exception.hpp0000644003401500001440000000472313614004466020643 0ustar rouaultusers#ifndef TUT_EXCEPTION_H_GUARD #define TUT_EXCEPTION_H_GUARD #include #include "tut_result.hpp" namespace tut { /** * The base for all TUT exceptions. */ struct tut_error : public std::exception { tut_error(const std::string& msg) : err_msg(msg) { } virtual test_result::result_type result() const { return test_result::ex; } const char* what() const throw() CPL_OVERRIDE { return err_msg.c_str(); } ~tut_error() throw() { } private: tut_error& operator=(const tut_error&); std::string err_msg; }; /** * Group not found exception. */ struct no_such_group : public tut_error { no_such_group(const std::string& grp) : tut_error(grp) { } ~no_such_group() throw() { } }; /** * Internal exception to be throwed when * test constructor has failed. */ struct bad_ctor : public tut_error { bad_ctor(const std::string& msg) : tut_error(msg) { } test_result::result_type result() const CPL_OVERRIDE { return test_result::ex_ctor; } ~bad_ctor() throw() { } }; /** * Exception to be throwed when ensure() fails or fail() called. */ struct failure : public tut_error { failure(const std::string& msg) : tut_error(msg) { } test_result::result_type result() const CPL_OVERRIDE { return test_result::fail; } ~failure() throw() { } }; /** * Exception to be thrown when test destructor threw an exception. */ struct warning : public tut_error { warning(const std::string& msg) : tut_error(msg) { } test_result::result_type result() const CPL_OVERRIDE { return test_result::warn; } ~warning() throw() { } }; /** * Exception to be throwed when test issued SEH (Win32) */ struct seh : public tut_error { seh(const std::string& msg) : tut_error(msg) { } virtual test_result::result_type result() const CPL_OVERRIDE { return test_result::term; } ~seh() throw() { } }; /** * Exception to be throwed when child processes fail. */ struct rethrown : public failure { explicit rethrown(const test_result &resultIn) : failure(resultIn.message), tr(resultIn) { } virtual test_result::result_type result() const CPL_OVERRIDE { return test_result::rethrown; } ~rethrown() throw() { } const test_result tr; }; } #endif gdalautotest-3.0.4/cpp/tut/tut_gdal.cpp0000644003401500001440000000643213614005367017547 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: TUT: C++ Unit Test Framework extensions for GDAL Test Suite // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "cpl_port.h" #include // TUT #include #include "ogr_api.h" // GDAL #include // C++ #include #include #include namespace tut { void ensure_equal_geometries(OGRGeometryH lhs, OGRGeometryH rhs, double tolerance) { // Test raw pointers ensure("First geometry is NULL", nullptr != lhs); ensure("Second geometry is NULL", nullptr != rhs); ensure("Passed the same pointers to geometry", lhs != rhs); // Test basic properties ensure_equals("Geometry names do not match", std::string(OGR_G_GetGeometryName(lhs)), std::string(OGR_G_GetGeometryName(rhs))); ensure_equals("Sub-geometry counts do not match", OGR_G_GetGeometryCount(lhs), OGR_G_GetGeometryCount(rhs)); ensure_equals("Point counts do not match", OGR_G_GetPointCount(lhs), OGR_G_GetPointCount(rhs)); if (OGR_G_GetGeometryCount(lhs) > 0) { // Test sub-geometries recursively const int count = OGR_G_GetGeometryCount(lhs); for (int i = 0; i < count; ++i) { ensure_equal_geometries(OGR_G_GetGeometryRef(lhs, i), OGR_G_GetGeometryRef(rhs, i), tolerance); } } else { // Test geometry points const std::size_t csize = 3; double a[csize] = { 0 }; double b[csize] = { 0 }; double d[csize] = { 0 }; double dmax = 0; const int count = OGR_G_GetPointCount(lhs); for (int i = 0; i < count; ++i) { OGR_G_GetPoint(lhs, i, &a[0], &a[1], &a[2]); OGR_G_GetPoint(rhs, i, &b[0], &b[1], &b[2]); // Test vertices for (std::size_t c = 0; c < csize; ++c) { d[c] = std::fabs(a[c] - b[c]); } const double* pos = std::max_element(d, d + csize); dmax = *pos; std::ostringstream os; os << "Error in vertex " << i << " off by " << dmax; ensure(os.str(), dmax < tolerance); } } } } // } // namespace tut gdalautotest-3.0.4/cpp/tut/tut_assert.hpp0000644003401500001440000001041313614004466020137 0ustar rouaultusers#ifndef TUT_ASSERT_H_GUARD #define TUT_ASSERT_H_GUARD #include "tut_exception.hpp" #include #include #if defined(TUT_USE_POSIX) #include #include #endif namespace tut { namespace detail { template std::ostream &msg_prefix(std::ostream &str, const M &msg) { std::stringstream ss; ss << msg; if(!ss.str().empty()) { str << ss.rdbuf() << ": "; } return str; } } namespace { /** * Tests provided condition. * Throws if false. */ static inline void ensure(bool cond) { if (!cond) { // TODO: default ctor? throw failure(""); } } /** * Tests provided condition. * Throws if true. */ static inline void ensure_not(bool cond) { ensure(!cond); } /** * Tests provided condition. * Throws if false. */ template void ensure(const M& msg, bool cond) { if (!cond) { throw failure(msg); } } /** * Tests provided condition. * Throws if true. */ template void ensure_not(const M& msg, bool cond) { ensure(msg, !cond); } /** * Tests two objects for being equal. * Throws if false. * * NB: both T and Q must have operator << defined somewhere, or * client code will not compile at all! */ template void ensure_equals(const M& msg, const LHS& actual, const RHS& expected) { if (expected != actual) { std::stringstream ss; detail::msg_prefix(ss,msg) << "expected '" << expected << "' actual '" << actual << '\''; throw failure(ss.str()); } } template void ensure_equals(const LHS& actual, const RHS& expected) { ensure_equals("Values are not equal", actual, expected); } template void ensure_equals(const M& msg, const char* actual,const char* expected) { ensure_equals(msg, std::string(actual), std::string(expected)); } inline void ensure_equals(const char* actual,const char* expected) { ensure_equals(0,actual,expected); } template void ensure_equals(const M& msg, const double& actual, const double& expected, const double& epsilon = std::numeric_limits::epsilon()) { const double diff = actual - expected; if ( !((diff <= epsilon) && (diff >= -epsilon )) ) { std::stringstream ss; detail::msg_prefix(ss,msg) << std::scientific << std::showpoint << std::setprecision(16) << "expected " << expected << " actual " << actual << " with precision " << epsilon; throw failure(ss.str()); } } /** * Tests two objects for being at most in given distance one from another. * Borders are excluded. * Throws if false. * * NB: T must have operator << defined somewhere, or * client code will not compile at all! Also, T shall have * operators + and -, and be comparable. * * TODO: domains are wrong, T - T might not yield T, but Q */ template void ensure_distance(const M& msg, const T& actual, const T& expected, const T& distance) { if (expected-distance >= actual || expected+distance <= actual) { std::stringstream ss; detail::msg_prefix(ss,msg) << " expected (" << expected-distance << " - " << expected+distance << ") actual '" << actual << '\''; throw failure(ss.str()); } } template void ensure_distance(const T& actual, const T& expected, const T& distance) { ensure_distance<>("Distance is wrong", actual, expected, distance); } template void ensure_errno(const M& msg, bool cond) { if(!cond) { #if defined(TUT_USE_POSIX) char e[512]; std::stringstream ss; detail::msg_prefix(ss,msg) << strerror_r(errno, e, sizeof(e)); throw failure(ss.str()); #else throw failure(msg); #endif } } /** * Unconditionally fails with message. */ static inline void fail(const char* msg = "") { throw failure(msg); } template void fail(const M& msg) { throw failure(msg); } } // end of namespace } #endif gdalautotest-3.0.4/cpp/tut/tut_posix.hpp0000644003401500001440000002612713614004466020011 0ustar rouaultusers#ifndef TUT_FORK_H_GUARD #define TUT_FORK_H_GUARD #if defined(TUT_USE_POSIX) #include #include #include #include #include #include #include #include #include #include #include #include "tut_result.hpp" #include "tut_assert.hpp" #include "tut_runner.hpp" namespace tut { template class test_group; template class test_object; class test_group_posix { private: template friend class test_group; template void send_result_(const T *obj, const test_result &tr) { if(obj->get_pipe_() == -1) { return; } if(tr.result != test_result::ok) { std::stringstream ss; ss << int(tr.result) << "\n" << tr.group << "\n" << tr.test << "\n" << tr.name << "\n" << tr.exception_typeid << "\n"; std::copy( tr.message.begin(), tr.message.end(), std::ostreambuf_iterator(ss.rdbuf()) ); int size = static_cast(ss.str().length()); int w = static_cast(write(obj->get_pipe_(), ss.str().c_str(), size)); ensure_errno("write() failed", w == size); } } }; template struct tut_posix { pid_t fork() { test_object *self = dynamic_cast< tut::test_object* >(this); ensure("trying to call 'tut_fork' in ctor of test object", self != nullptr); return self->fork_(); } pid_t waitpid(pid_t pid, int *status, int flags = 0) { test_object *self = dynamic_cast< tut::test_object* >(this); ensure("trying to call 'tut_waitpid' in ctor of test object", self != nullptr); return self->waitpid_(pid, status, flags); } void ensure_child_exit(pid_t pid, int exit_status = 0) { test_object *self = dynamic_cast< tut::test_object* >(this); ensure("trying to call 'ensure_child_exit' in ctor of test object", self != nullptr); int status; self->waitpid_(pid, &status); self->ensure_child_exit_(status, exit_status); } void ensure_child_signal(pid_t pid, int signal = SIGTERM) { test_object *self = dynamic_cast< tut::test_object* >(this); ensure("trying to call 'ensure_child_signal' in ctor of test object", self != nullptr); int status; self->waitpid_(pid, &status); self->ensure_child_signal_(status, signal); } std::set get_pids() const { using namespace std; const test_object *self = dynamic_cast< const tut::test_object* >(this); ensure("trying to call 'get_pids' in ctor of test object", self != nullptr); return self->get_pids_(); } virtual ~tut_posix() { } }; class test_object_posix { public: typedef std::map pid_map; /** * Default constructor */ test_object_posix() : pipe_(-1) { } virtual ~test_object_posix() { // we have forked if(pipe_ != -1) { // in child, force exit std::exit(0); } if(!pids_.empty()) { std::stringstream ss; // in parent, reap children for(std::map::iterator i = pids_.begin(); i != pids_.end(); ++i) { try { kill_child_(i->first); } catch(const rethrown &ex) { ss << std::endl << "child " << ex.tr.pid << " has thrown an exception: " << ex.what(); } catch(const failure &ex) { ss << std::endl << ex.what(); } } if(!ss.str().empty()) { fail(ss.str().c_str()); } } } private: template friend struct tut_posix; friend class test_group_posix; int get_pipe_() const { return pipe_; } pid_t fork_() { // create pipe int fds[2]; ensure_errno("pipe() failed", ::pipe(fds) == 0); pid_t pid = ::fork(); ensure_errno("fork() failed", pid >= 0); if(pid != 0) { // in parent, register pid ensure("duplicated child", pids_.insert( std::make_pair(pid, fds[0]) ).second); // close writing side close(fds[1]); } else { // in child, shutdown reporter tut::runner.get().clear_callbacks(); // close reading side close(fds[0]); pipe_ = fds[1]; } return pid; } void kill_child_(pid_t pid) { int status; if(waitpid_(pid, &status, WNOHANG) == pid) { ensure_child_exit_(status, 0); return; } if(::kill(pid, SIGTERM) != 0) { if(errno == ESRCH) { // no such process return; } else { // cannot kill, we are in trouble std::stringstream ss; char e[1024]; ss << "child " << pid << " could not be killed with SIGTERM, " << strerror_r(errno, e, sizeof(e)) << std::endl; fail(ss.str()); } } if(waitpid_(pid, &status, WNOHANG) == pid) { // child killed, check signal ensure_child_signal_(status, SIGTERM); ensure_equals("child process exists after SIGTERM", ::kill(pid, 0), -1); return; } // child seems to be still exiting, give it some time sleep(2); if(waitpid_(pid, &status, WNOHANG) != pid) { // child is still running, kill it if(::kill(pid, SIGKILL) != 0) { if(errno == ESRCH) { // no such process return; } else { std::stringstream ss; char e[1024]; ss << "child " << pid << " could not be killed with SIGKILL, " << strerror_r(errno, e, sizeof(e)) << std::endl; fail(ss.str()); } } ensure_equals("wait after SIGKILL", waitpid_(pid, &status), pid); ensure_child_signal_(status, SIGKILL); ensure_equals("child process exists after SIGKILL", ::kill(pid, 0), -1); std::stringstream ss; ss << "child " << pid << " had to be killed with SIGKILL"; fail(ss.str()); } } test_result receive_result_(std::istream &ss, pid_t pid) { test_result tr; int type; ss >> type; tr.result = test_result::result_type(type); ss.ignore(1024, '\n'); std::getline(ss, tr.group); ss >> tr.test; ss.ignore(1024, '\n'); std::getline(ss, tr.name); std::getline(ss, tr.exception_typeid); std::copy( std::istreambuf_iterator(ss.rdbuf()), std::istreambuf_iterator(), std::back_inserter(tr.message) ); tr.pid = pid; return tr; } struct fdclose { fdclose(int fd): fd_(fd) { } ~fdclose() { close(fd_); } private: int fd_; }; pid_t waitpid_(pid_t pid, int *status, int flags = 0) { ensure("trying to wait for unknown pid", pids_.count(pid) > 0); pid_t p = ::waitpid(pid, status, flags); if( (flags & WNOHANG) && (p != pid) ) { return p; } // read child result from pipe fd_set fdset; timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fdset); int pipe = pids_[pid]; fdclose guard(pipe); FD_SET(pipe, &fdset); int result = select(pipe+1, &fdset, nullptr, nullptr, &tv); ensure_errno("sanity check on select() failed", result >= 0); if(result > 0) { ensure("sanity check on FD_ISSET() failed", FD_ISSET(pipe, &fdset) ); std::stringstream ss; //TODO: max failure length char buffer[1024]; int r = static_cast(read(pipe, buffer, sizeof(buffer))); ensure_errno("sanity check on read() failed", r >= 0); if(r > 0) { ss.write(buffer, r); throw rethrown( receive_result_(ss, pid) ); } } return pid; } void ensure_child_exit_(int status, int exit_status) { if(WIFSIGNALED(status)) { std::stringstream ss; ss << "child killed by signal " << WTERMSIG(status) << ": expected exit with code " << exit_status; throw failure(ss.str().c_str()); } if(WIFEXITED(status)) { if(WEXITSTATUS(status) != exit_status) { std::stringstream ss; ss << "child exited, expected '" << exit_status << "' actual '" << WEXITSTATUS(status) << '\''; throw failure(ss.str().c_str()); } } if(WIFSTOPPED(status)) { std::stringstream ss; ss << "child stopped by signal " << WTERMSIG(status) << ": expected exit with code " << exit_status; throw failure(ss.str().c_str()); } } void ensure_child_signal_(int status, int signal) { if(WIFSIGNALED(status)) { if(WTERMSIG(status) != signal) { std::stringstream ss; ss << "child killed by signal, expected '" << signal << "' actual '" << WTERMSIG(status) << '\''; throw failure(ss.str().c_str()); } } if(WIFEXITED(status)) { std::stringstream ss; ss << "child exited with code " << WEXITSTATUS(status) << ": expected signal " << signal; throw failure(ss.str().c_str()); } if(WIFSTOPPED(status)) { std::stringstream ss; ss << "child stopped by signal " << WTERMSIG(status) << ": expected kill by signal " << signal; throw failure(ss.str().c_str()); } } std::set get_pids_() const { using namespace std; set pids; for(pid_map::const_iterator i = pids_.begin(); i != pids_.end(); ++i) { pids.insert( i->first ); } return pids; } pid_map pids_; int pipe_; }; } // namespace tut #else namespace tut { struct test_object_posix { }; struct test_group_posix { template void send_result_(const T*, const test_result &) { } }; } // namespace tut #endif #endif gdalautotest-3.0.4/cpp/tut/README0000644003401500001440000000016213614004466016111 0ustar rouaultusersC++ Template Unit Test Framework This is a local copy of the upstream: http://mrzechonek.github.io/tut-framework gdalautotest-3.0.4/cpp/tut/tut_runner.hpp0000644003401500001440000001606413614004466020157 0ustar rouaultusers#ifndef TUT_RUNNER_H_GUARD #define TUT_RUNNER_H_GUARD #include #include #include #include "tut_exception.hpp" namespace tut { /** * Interface. * Test group operations. */ struct group_base { virtual ~group_base() { } // execute tests iteratively virtual void rewind() = 0; virtual bool run_next(test_result &) = 0; // execute one test virtual bool run_test(int n, test_result &tr) = 0; }; /** * Test runner callback interface. * Can be implemented by caller to update * tests results in real-time. User can implement * any of callback methods, and leave unused * in default implementation. */ struct callback { /** * Default constructor. */ callback() { } /** * Virtual destructor is a must for subclassed types. */ virtual ~callback() { } /** * Called when new test run started. */ virtual void run_started() { } /** * Called when a group started * @param name Name of the group */ virtual void group_started(const std::string& name) { (void)name; } /** * Called when a test finished. * @param tr Test results. */ virtual void test_completed(const test_result& tr) { (void)tr; } /** * Called when a group is completed * @param name Name of the group */ virtual void group_completed(const std::string& name) { (void)name; } /** * Called when all tests in run completed. */ virtual void run_completed() { } private: callback(const callback &); void operator=(const callback&); }; /** * Typedef for runner::list_groups() */ typedef std::vector groupnames; typedef std::set callbacks; /** * Test runner. */ class test_runner { public: /** * Constructor */ test_runner() { } /** * Stores another group for getting by name. */ void register_group(const std::string& name, group_base* gr) { if (gr == nullptr) { throw tut_error("group shall be non-null"); } if (groups_.find(name) != groups_.end()) { std::string msg("attempt to add already existent group " + name); // this exception terminates application so we use cerr also // TODO: should this message appear in stream? std::cerr << msg << std::endl; throw tut_error(msg); } groups_.insert( std::make_pair(name, gr) ); } void set_callback(callback *cb) { clear_callbacks(); insert_callback(cb); } /** * Stores callback object. */ void insert_callback(callback* cb) { if(cb != nullptr) { callbacks_.insert(cb); } } void erase_callback(callback* cb) { callbacks_.erase(cb); } void clear_callbacks() { callbacks_.clear(); } /** * Returns callback list. */ const callbacks &get_callbacks() const { return callbacks_; } void set_callbacks(const callbacks &cb) { callbacks_ = cb; } /** * Returns list of known test groups. */ const groupnames list_groups() const { groupnames ret; const_iterator i = groups_.begin(); const_iterator e = groups_.end(); while (i != e) { ret.push_back(i->first); ++i; } return ret; } /** * Runs all tests in all groups. */ void run_tests() const { cb_run_started_(); const_iterator i = groups_.begin(); const_iterator e = groups_.end(); while (i != e) { cb_group_started_(i->first); run_all_tests_in_group_(i); cb_group_completed_(i->first); ++i; } cb_run_completed_(); } /** * Runs all tests in specified group. */ void run_tests(const std::string& group_name) const { cb_run_started_(); const_iterator i = groups_.find(group_name); if (i == groups_.end()) { cb_run_completed_(); throw no_such_group(group_name); } cb_group_started_(group_name); run_all_tests_in_group_(i); cb_group_completed_(group_name); cb_run_completed_(); } /** * Runs one test in specified group. */ bool run_test(const std::string& group_name, int n, test_result &tr) const { cb_run_started_(); const_iterator i = groups_.find(group_name); if (i == groups_.end()) { cb_run_completed_(); throw no_such_group(group_name); } cb_group_started_(group_name); bool t = i->second->run_test(n, tr); if(t && tr.result != test_result::dummy) { cb_test_completed_(tr); } cb_group_completed_(group_name); cb_run_completed_(); return t; } protected: typedef std::map groups; typedef groups::iterator iterator; typedef groups::const_iterator const_iterator; groups groups_; callbacks callbacks_; private: friend class restartable_wrapper; void cb_run_started_() const { for(callbacks::const_iterator i = callbacks_.begin(); i != callbacks_.end(); ++i) { (*i)->run_started(); } } void cb_run_completed_() const { for(callbacks::const_iterator i = callbacks_.begin(); i != callbacks_.end(); ++i) { (*i)->run_completed(); } } void cb_group_started_(const std::string &group_name) const { for(callbacks::const_iterator i = callbacks_.begin(); i != callbacks_.end(); ++i) { (*i)->group_started(group_name); } } void cb_group_completed_(const std::string &group_name) const { for(callbacks::const_iterator i = callbacks_.begin(); i != callbacks_.end(); ++i) { (*i)->group_completed(group_name); } } void cb_test_completed_(const test_result &tr) const { for(callbacks::const_iterator i = callbacks_.begin(); i != callbacks_.end(); ++i) { (*i)->test_completed(tr); } } void run_all_tests_in_group_(const_iterator i) const { i->second->rewind(); test_result tr; while(i->second->run_next(tr)) { if(tr.result != test_result::dummy) { cb_test_completed_(tr); } if (tr.result == test_result::ex_ctor) { // test object ctor failed, skip whole group break; } } } }; /** * Singleton for test_runner implementation. * Instance with name runner_singleton shall be implemented * by user. */ class test_runner_singleton { public: static test_runner& get() { static test_runner tr; return tr; } }; extern test_runner_singleton runner; } #endif gdalautotest-3.0.4/cpp/tut/tut_restartable.hpp0000644003401500001440000002146413614004466021156 0ustar rouaultusers#ifndef TUT_RESTARTABLE_H_GUARD #define TUT_RESTARTABLE_H_GUARD #include #include #include #include #include /** * Optional restartable wrapper for test_runner. * * Allows to restart test runs finished due to abnormal * test application termination (such as segmentation * fault or math error). * * @author Vladimir Dyuzhev, Vladimir.Dyuzhev@gmail.com */ namespace tut { namespace util { /** * Escapes non-alphabetical characters in string. */ std::string escape(const std::string& orig) { std::string rc; std::string::const_iterator i,e; i = orig.begin(); e = orig.end(); while (i != e) { if ((*i >= 'a' && *i <= 'z') || (*i >= 'A' && *i <= 'Z') || (*i >= '0' && *i <= '9') ) { rc += *i; } else { rc += '\\'; rc += ('a'+(((unsigned int)*i) >> 4)); rc += ('a'+(((unsigned int)*i) & 0xF)); } ++i; } return rc; } /** * Un-escapes string. */ std::string unescape(const std::string& orig) { std::string rc; std::string::const_iterator i,e; i = orig.begin(); e = orig.end(); while (i != e) { if (*i != '\\') { rc += *i; } else { ++i; if (i == e) { throw std::invalid_argument("unexpected end of string"); } unsigned int c1 = *i; ++i; if (i == e) { throw std::invalid_argument("unexpected end of string"); } unsigned int c2 = *i; rc += (((c1 - 'a') << 4) + (c2 - 'a')); } ++i; } return rc; } /** * Serialize test_result avoiding interfering with operator <<. */ void serialize(std::ostream& os, const tut::test_result& tr) { os << escape(tr.group) << std::endl; os << tr.test << ' '; switch(tr.result) { case test_result::ok: os << 0; break; case test_result::fail: os << 1; break; case test_result::ex: os << 2; break; case test_result::warn: os << 3; break; case test_result::term: os << 4; break; case test_result::rethrown: os << 5; break; case test_result::ex_ctor: os << 6; break; case test_result::dummy: assert(!"Should never be called"); default: throw std::logic_error("operator << : bad result_type"); } os << ' ' << escape(tr.message) << std::endl; } /** * deserialization for test_result */ bool deserialize(std::istream& is, tut::test_result& tr) { std::getline(is,tr.group); if (is.eof()) { return false; } tr.group = unescape(tr.group); tr.test = -1; is >> tr.test; if (tr.test < 0) { throw std::logic_error("operator >> : bad test number"); } int n = -1; is >> n; switch(n) { case 0: tr.result = test_result::ok; break; case 1: tr.result = test_result::fail; break; case 2: tr.result = test_result::ex; break; case 3: tr.result = test_result::warn; break; case 4: tr.result = test_result::term; break; case 5: tr.result = test_result::rethrown; break; case 6: tr.result = test_result::ex_ctor; break; default: throw std::logic_error("operator >> : bad result_type"); } is.ignore(1); // space std::getline(is,tr.message); tr.message = unescape(tr.message); if (!is.good()) { throw std::logic_error("malformed test result"); } return true; } }; /** * Restartable test runner wrapper. */ class restartable_wrapper { test_runner& runner_; callbacks callbacks_; std::string dir_; std::string log_; // log file: last test being executed std::string jrn_; // journal file: results of all executed tests public: /** * Default constructor. * @param dir Directory where to search/put log and journal files */ restartable_wrapper(const std::string& dir = ".") : runner_(runner.get()), dir_(dir) { // dozen: it works, but it would be better to use system path separator jrn_ = dir_ + '/' + "journal.tut"; log_ = dir_ + '/' + "log.tut"; } /** * Stores another group for getting by name. */ void register_group(const std::string& name, group_base* gr) { runner_.register_group(name,gr); } /** * Stores callback object. */ void set_callback(callback* cb) { callbacks_.clear(); callbacks_.insert(cb); } void insert_callback(callback* cb) { callbacks_.insert(cb); } void erase_callback(callback* cb) { callbacks_.erase(cb); } void set_callbacks(const callbacks& cb) { callbacks_ = cb; } const callbacks& get_callbacks() const { return runner_.get_callbacks(); } /** * Returns list of known test groups. */ groupnames list_groups() const { return runner_.list_groups(); } /** * Runs all tests in all groups. */ void run_tests() const { // where last run was failed std::string fail_group; int fail_test; read_log_(fail_group,fail_test); bool fail_group_reached = (fail_group == ""); // iterate over groups tut::groupnames gn = list_groups(); tut::groupnames::const_iterator gni,gne; gni = gn.begin(); gne = gn.end(); while (gni != gne) { // skip all groups before one that failed if (!fail_group_reached) { if (*gni != fail_group) { ++gni; continue; } fail_group_reached = true; } // first or restarted run int test = (*gni == fail_group && fail_test >= 0) ? fail_test + 1 : 1; while(true) { // last executed test pos register_execution_(*gni,test); tut::test_result tr; if( !runner_.run_test(*gni,test, tr) || tr.result == test_result::dummy ) { break; } register_test_(tr); ++test; } ++gni; } // show final results to user invoke_callback_(); // truncate files as mark of successful finish truncate_(); } private: /** * Shows results from journal file. */ void invoke_callback_() const { runner_.set_callbacks(callbacks_); runner_.cb_run_started_(); std::string current_group; std::ifstream ijournal(jrn_.c_str()); while (ijournal.good()) { tut::test_result tr; if( !util::deserialize(ijournal,tr) ) { break; } runner_.cb_test_completed_(tr); } runner_.cb_run_completed_(); } /** * Register test into journal. */ void register_test_(const test_result& tr) const { std::ofstream ojournal(jrn_.c_str(), std::ios::app); util::serialize(ojournal, tr); ojournal << std::flush; if (!ojournal.good()) { throw std::runtime_error("unable to register test result in file " + jrn_); } } /** * Mark the fact test going to be executed */ void register_execution_(const std::string& grp, int test) const { // last executed test pos std::ofstream olog(log_.c_str()); olog << util::escape(grp) << std::endl << test << std::endl << std::flush; if (!olog.good()) { throw std::runtime_error("unable to register execution in file " + log_); } } /** * Truncate tests. */ void truncate_() const { std::ofstream olog(log_.c_str()); std::ofstream ojournal(jrn_.c_str()); } /** * Read log file */ void read_log_(std::string& fail_group, int& fail_test) const { // read failure point, if any std::ifstream ilog(log_.c_str()); std::getline(ilog,fail_group); fail_group = util::unescape(fail_group); ilog >> fail_test; if (!ilog.good()) { fail_group = ""; fail_test = -1; truncate_(); } else { // test was terminated... tut::test_result tr(fail_group, fail_test, "", tut::test_result::term); register_test_(tr); } } }; } #endif gdalautotest-3.0.4/cpp/tut/tut.hpp0000644003401500001440000003007013614004466016557 0ustar rouaultusers#ifndef TUT_H_GUARD #define TUT_H_GUARD #include #include #include #include #include #include #include #include #include #if defined(linux) #define TUT_USE_POSIX #endif #include "tut_exception.hpp" #include "tut_result.hpp" #include "tut_posix.hpp" #include "tut_assert.hpp" #include "tut_runner.hpp" #if defined(TUT_USE_SEH) #include #include #endif /** * Template Unit Tests Framework for C++. * http://tut.dozen.ru * * @author Vladimir Dyuzhev, Vladimir.Dyuzhev@gmail.com */ namespace tut { /** * Test object. Contains data test run upon and default test method * implementation. Inherited from Data to allow tests to * access test data as members. */ template class test_object : public Data, public test_object_posix { public: /** * Default constructor */ test_object() { } void set_test_name(const std::string& current_test_name) { current_test_name_ = current_test_name; } const std::string& get_test_name() const { return current_test_name_; } void set_test_id(int current_test_id) { current_test_id_ = current_test_id; } int get_test_id() const { return current_test_id_; } /** * Default do-nothing test. */ template void test() { called_method_was_a_dummy_test_ = true; } /** * The flag is set to true by default (dummy) test. * Used to detect usused test numbers and avoid unnecessary * test object creation which may be time-consuming depending * on operations described in Data::Data() and Data::~Data(). * TODO: replace with throwing special exception from default test. */ bool called_method_was_a_dummy_test_; private: int current_test_id_; std::string current_test_name_; test_object(test_object const&); // = delete test_object& operator=(test_object const&); // = delete }; /** * Walks through test tree and stores address of each * test method in group. Instantiation stops at 0. */ template struct tests_registerer { static void reg(Group& group) { group.reg(n, &Test::template test); tests_registerer::reg(group); } }; template struct tests_registerer { static void reg(Group&) { } }; /** * Test group; used to recreate test object instance for * each new test since we have to have reinitialized * Data base class. */ template class test_group : public group_base, public test_group_posix { const char* name_; typedef void (test_object::*testmethod)(); typedef std::map tests; typedef typename tests::iterator tests_iterator; typedef typename tests::const_iterator tests_const_iterator; typedef typename tests::const_reverse_iterator tests_const_reverse_iterator; typedef typename tests::size_type size_type; tests tests_; tests_iterator current_test_; enum seh_result { SEH_OK, SEH_CTOR, SEH_TEST, SEH_DUMMY }; /** * Exception-in-destructor-safe smart-pointer class. */ template class safe_holder { T* p_; bool permit_throw_in_dtor; safe_holder(const safe_holder&); safe_holder& operator=(const safe_holder&); public: safe_holder() : p_(nullptr), permit_throw_in_dtor(false) { } ~safe_holder() { release(); } T* operator->() const { return p_; } T* get() const { return p_; } /** * Tell ptr it can throw from destructor. Right way is to * use std::uncaught_exception(), but some compilers lack * correct implementation of the function. */ void permit_throw() { permit_throw_in_dtor = true; } /** * Specially treats exceptions in test object destructor; * if test itself failed, exceptions in destructor * are ignored; if test was successful and destructor failed, * warning exception throwed. */ void release() { try { if (delete_obj() == false) { throw warning("destructor of test object raised" " an SEH exception"); } } catch (const std::exception& ex) { if (permit_throw_in_dtor) { std::string msg = "destructor of test object raised" " exception: "; msg += ex.what(); throw warning(msg); } } catch( ... ) { if (permit_throw_in_dtor) { throw warning("destructor of test object raised an" " exception"); } } } /** * Re-init holder to get brand new object. */ void reset() { release(); permit_throw_in_dtor = false; p_ = new T(); } bool delete_obj() { #if defined(TUT_USE_SEH) __try { #endif T* p = p_; p_ = nullptr; delete p; #if defined(TUT_USE_SEH) } __except(handle_seh_(::GetExceptionCode())) { if (permit_throw_in_dtor) { return false; } } #endif return true; } }; public: typedef test_object object; /** * Creates and registers test group with specified name. */ test_group(const char* name) : name_(name) { // register itself runner.get().register_group(name_,this); // register all tests tests_registerer::reg(*this); } /** * This constructor is used in self-test run only. */ test_group(const char* name, test_runner& another_runner) : name_(name) { // register itself another_runner.register_group(name_, this); // register all tests tests_registerer, test_group, MaxTestsInGroup>::reg(*this); } /** * Registers test method under given number. */ void reg(int n, testmethod tm) { tests_[n] = tm; } /** * Reset test position before first test. */ void rewind() CPL_OVERRIDE { current_test_ = tests_.begin(); } /** * Runs next test. */ bool run_next(test_result &tr) CPL_OVERRIDE { if (current_test_ == tests_.end()) { return false; } // find next user-specialized test safe_holder obj; while (current_test_ != tests_.end()) { tests_iterator current_test = current_test_++; if(run_test_(current_test, obj, tr) && tr.result != test_result::dummy) { return true; } } return false; } /** * Runs one test by position. */ bool run_test(int n, test_result &tr) CPL_OVERRIDE { if (tests_.rbegin() == tests_.rend() || tests_.rbegin()->first < n) { return false; } // within scope; check if given test exists tests_iterator ti = tests_.find(n); if (ti == tests_.end()) { return false; } safe_holder obj; return run_test_(ti, obj, tr); } /** * VC allows only one exception handling type per function, * so I have to split the method. */ bool run_test_(const tests_iterator& ti, safe_holder& obj, test_result &tr) { std::string current_test_name; tr = test_result(name_, ti->first, current_test_name, test_result::ok); try { switch (run_test_seh_(ti->second, obj, current_test_name, ti->first)) { case SEH_CTOR: throw bad_ctor("seh"); break; case SEH_TEST: throw seh("seh"); break; case SEH_DUMMY: tr.result = test_result::dummy; break; case SEH_OK: // ok break; } } catch (const rethrown& ex) { tr = ex.tr; tr.result = test_result::rethrown; } catch (const tut_error& ex) { tr.result = ex.result(); tr.exception_typeid = typeid(ex).name(); tr.message = ex.what(); } catch (const std::exception& ex) { tr.result = test_result::ex; tr.exception_typeid = typeid(ex).name(); tr.message = ex.what(); } catch (...) { // test failed with unknown exception tr.result = test_result::ex; } if (obj.get()) { tr.name = obj->get_test_name(); // try to report to parent, if exists send_result_(obj.get(), tr); } else { tr.name = current_test_name; } return true; } /** * Runs one under SEH if platform supports it. */ seh_result run_test_seh_(testmethod tm, safe_holder& obj, std::string& current_test_name, int current_test_id) { #if defined(TUT_USE_SEH) __try { #endif if (obj.get() == nullptr) { reset_holder_(obj); } obj->called_method_was_a_dummy_test_ = false; #if defined(TUT_USE_SEH) __try { #endif obj.get()->set_test_id(current_test_id); (obj.get()->*tm)(); #if defined(TUT_USE_SEH) } __except(handle_seh_(::GetExceptionCode())) { current_test_name = obj->get_test_name(); return SEH_TEST; } #endif if (obj->called_method_was_a_dummy_test_) { // do not call obj.release(); reuse object return SEH_DUMMY; } current_test_name = obj->get_test_name(); obj.permit_throw(); obj.release(); #if defined(TUT_USE_SEH) } __except(handle_seh_(::GetExceptionCode())) { return SEH_CTOR; } #endif return SEH_OK; } void reset_holder_(safe_holder& obj) { try { obj.reset(); } catch (const std::exception& ex) { throw bad_ctor(ex.what()); } catch (...) { throw bad_ctor("test constructor has generated an exception;" " group execution is terminated"); } } }; #if defined(TUT_USE_SEH) /** * Decides should we execute handler or ignore SE. */ inline int handle_seh_(DWORD excode) { switch(excode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_BREAKPOINT: case EXCEPTION_SINGLE_STEP: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_FLT_DENORMAL_OPERAND: case EXCEPTION_FLT_DIVIDE_BY_ZERO: case EXCEPTION_FLT_INEXACT_RESULT: case EXCEPTION_FLT_INVALID_OPERATION: case EXCEPTION_FLT_OVERFLOW: case EXCEPTION_FLT_STACK_CHECK: case EXCEPTION_FLT_UNDERFLOW: case EXCEPTION_INT_DIVIDE_BY_ZERO: case EXCEPTION_INT_OVERFLOW: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_NONCONTINUABLE_EXCEPTION: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_INVALID_DISPOSITION: case EXCEPTION_GUARD_PAGE: case EXCEPTION_INVALID_HANDLE: return EXCEPTION_EXECUTE_HANDLER; }; return EXCEPTION_CONTINUE_SEARCH; } #endif } #endif gdalautotest-3.0.4/cpp/tut/tut_reporter.hpp0000644003401500001440000000022113614004466020474 0ustar rouaultusers#ifndef TUT_REPORTER #define TUT_REPORTER #include namespace tut { typedef console_reporter reporter; } #endif gdalautotest-3.0.4/cpp/test_gdal_dted.cpp0000644003401500001440000002367713614005367020110 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test DTED support. Ported from gdrivers/dted.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // Copyright (c) 2010, Even Rouault // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_string.h" #include "gdal_alg.h" #include "gdal_priv.h" #include "gdal.h" #include #include #include namespace tut { // Common fixture with test data struct test_dted_data { struct raster_t { std::string file_; int band_; int checksum_; raster_t(std::string const& f, int b, int c) : file_(f), band_(b), checksum_(c) {} }; typedef std::vector rasters_t; GDALDriverH drv_; std::string drv_name_; std::string data_; std::string data_tmp_; rasters_t rasters_; test_dted_data() : drv_(nullptr), drv_name_("DTED") { drv_ = GDALGetDriverByName(drv_name_.c_str()); // Compose data path for test group data_ = tut::common::data_basedir; data_tmp_ = tut::common::tmp_basedir; // Collection of test DEM datasets // TODO: Verify value of this checksum rasters_.push_back(raster_t("n43.dt0", 1, 49187)); } }; // Register test group typedef test_group group; typedef group::object object; group test_dted_group("GDAL::DTED"); // Test driver availability template<> template<> void object::test<1>() { ensure("GDAL::DTED driver not available", nullptr != drv_); } // Test open dataset template<> template<> void object::test<2>() { rasters_t::const_iterator it; for (it = rasters_.begin(); it != rasters_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALClose(ds); } } // Test dataset checksums template<> template<> void object::test<3>() { rasters_t::const_iterator it; for (it = rasters_.begin(); it != rasters_.end(); ++it) { std::string file(data_ + SEP); file += it->file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, it->band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(ds); const int ysize = GDALGetRasterYSize(ds); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << file << "' not equal"; ensure_equals(os.str().c_str(), checksum, it->checksum_); GDALClose(ds); } } // Test affine transformation coefficients template<> template<> void object::test<4>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string file(data_ + SEP); file += rasters_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); double geoTransform[6] = { 0 }; CPLErr err = GDALGetGeoTransform(ds, geoTransform); ensure_equals("Can't fetch affine transformation coefficients", err, CE_None); // Test affine transformation coefficients const double maxError = 0.000001; const double expect[6] = { -80.004166666666663, 0.0083333333333333332, 0, 44.00416666666667, 0, -0.0083333333333333332 }; const std::string msg("Geotransform is incorrect"); ensure_distance(msg.c_str(), expect[0], geoTransform[0], maxError); ensure_distance(msg.c_str(), expect[1], geoTransform[1], maxError); ensure_distance(msg.c_str(), expect[2], geoTransform[2], maxError); ensure_distance(msg.c_str(), expect[3], geoTransform[3], maxError); ensure_distance(msg.c_str(), expect[4], geoTransform[4], maxError); ensure_distance(msg.c_str(), expect[5], geoTransform[5], maxError); GDALClose(ds); } // Test projection definition template<> template<> void object::test<5>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string file(data_ + SEP); file += rasters_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); std::string proj(GDALGetProjectionRef(ds)); ensure_equals("Projection definition is not available", proj.empty(), false); std::string expect("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\"]]"); ensure_equals("Projection does not match expected", proj, expect); GDALClose(ds); } // Test band data type and NODATA value template<> template<> void object::test<6>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string file(data_ + SEP); file += rasters_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const double noData = GDALGetRasterNoDataValue(band, nullptr); ensure_equals("Grid NODATA value wrong or missing", noData, -32767); ensure_equals("Data type is not GDT_Int16", GDALGetRasterDataType(band), GDT_Int16); GDALClose(ds); } // Create simple copy and check template<> template<> void object::test<7>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string src(data_ + SEP); src += rasters_.at(fileIdx).file_; GDALDatasetH dsSrc = GDALOpen(src.c_str(), GA_ReadOnly); ensure("Can't open source dataset: " + src, nullptr != dsSrc); std::string dst(data_tmp_ + SEP); dst += rasters_.at(fileIdx).file_; GDALDatasetH dsDst = nullptr; dsDst = GDALCreateCopy(drv_, dst.c_str(), dsSrc, FALSE, nullptr, nullptr, nullptr); GDALClose(dsSrc); ensure("Can't copy dataset", nullptr != dsDst); std::string proj(GDALGetProjectionRef(dsDst)); ensure_equals("Projection definition is not available", proj.empty(), false); std::string expect("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\"]]"); ensure_equals("Projection does not match expected", proj, expect); GDALRasterBandH band = GDALGetRasterBand(dsDst, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); const int xsize = GDALGetRasterXSize(dsDst); const int ysize = GDALGetRasterYSize(dsDst); const int checksum = GDALChecksumImage(band, 0, 0, xsize, ysize); std::stringstream os; os << "Checksums for '" << dst << "' not equal"; ensure_equals(os.str().c_str(), checksum, rasters_.at(fileIdx).checksum_); GDALClose(dsDst); } // Test subwindow read and the tail recursion problem. template<> template<> void object::test<8>() { // Index of test file being tested const std::size_t fileIdx = 0; std::string file(data_ + SEP); file += rasters_.at(fileIdx).file_; GDALDatasetH ds = GDALOpen(file.c_str(), GA_ReadOnly); ensure("Can't open dataset: " + file, nullptr != ds); GDALRasterBandH band = GDALGetRasterBand(ds, rasters_.at(fileIdx).band_); ensure("Can't get raster band", nullptr != band); // Sub-windows size const int win[4] = { 5, 5, 5, 5 }; // subwindow checksum const int winChecksum = 305; const int checksum = GDALChecksumImage(band, win[0], win[1], win[2], win[3]); std::stringstream os; os << "Checksums for '" << file << "' not equal"; ensure_equals(os.str().c_str(), checksum, winChecksum); GDALClose(ds); } } // namespace tut gdalautotest-3.0.4/cpp/test_ogr_shape.cpp0000644003401500001440000003235613614005367020142 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Shapefile driver testing. Ported from ogr/ogr_shape.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // Copyright (c) 2010, Even Rouault // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "ogr_api.h" #include "ogrsf_frmts.h" #include #include #include #include namespace tut { // Test data struct test_shape_data { OGRSFDriverH drv_; std::string drv_name_; std::string data_; std::string data_tmp_; test_shape_data() : drv_(nullptr), drv_name_("ESRI Shapefile") { drv_ = OGRGetDriverByName(drv_name_.c_str()); // Compose data path for test group data_ = tut::common::data_basedir; data_tmp_ = tut::common::tmp_basedir; } }; // Register test group typedef test_group group; typedef group::object object; group test_shape_group("OGR::Shape"); // Test driver availability template<> template<> void object::test<1>() { ensure("OGR::Shape driver not available", nullptr != drv_); } // Test Create/Destroy empty directory datasource template<> template<> void object::test<2>() { // Try to remove tmp and ignore error code OGR_Dr_DeleteDataSource(drv_, data_tmp_.c_str()); OGRDataSourceH ds = nullptr; ds = OGR_Dr_CreateDataSource(drv_, data_tmp_.c_str(), nullptr); ensure("OGR_Dr_CreateDataSource return NULL", nullptr != ds); OGR_DS_Destroy(ds); } // Create table from ogr/poly.shp template<> template<> void object::test<3>() { OGRErr err = OGRERR_NONE; OGRDataSourceH ds = nullptr; ds = OGR_Dr_CreateDataSource(drv_, data_tmp_.c_str(), nullptr); ensure("Can't open or create data source", nullptr != ds); // Create memory Layer OGRLayerH lyr = nullptr; lyr = OGR_DS_CreateLayer(ds, "tpoly", nullptr, wkbPolygon, nullptr); ensure("Can't create layer", nullptr != lyr); // Create schema OGRFieldDefnH fld = nullptr; fld = OGR_Fld_Create("AREA", OFTReal); err = OGR_L_CreateField(lyr, fld, true); OGR_Fld_Destroy(fld); ensure_equals("Can't create field", OGRERR_NONE, err); fld = OGR_Fld_Create("EAS_ID", OFTInteger); err = OGR_L_CreateField(lyr, fld, true); OGR_Fld_Destroy(fld); ensure_equals("Can't create field", OGRERR_NONE, err); fld = OGR_Fld_Create("PRFEDEA", OFTString); err = OGR_L_CreateField(lyr, fld, true); OGR_Fld_Destroy(fld); ensure_equals("Can't create field", OGRERR_NONE, err); // Check schema OGRFeatureDefnH featDefn = OGR_L_GetLayerDefn(lyr); ensure("Layer schema is NULL", nullptr != featDefn); ensure_equals("Fields creation failed", 3, OGR_FD_GetFieldCount(featDefn)); // Copy ogr/poly.shp to temporary layer OGRFeatureH featDst = OGR_F_Create(featDefn); ensure("Can't create empty feature", nullptr != featDst); std::string source(data_); source += SEP; source += "poly.shp"; OGRDataSourceH dsSrc = OGR_Dr_Open(drv_, source.c_str(), false); ensure("Can't open source layer", nullptr != dsSrc); OGRLayerH lyrSrc = OGR_DS_GetLayer(dsSrc, 0); ensure("Can't get source layer", nullptr != lyrSrc); OGRFeatureH featSrc = nullptr; while (nullptr != (featSrc = OGR_L_GetNextFeature(lyrSrc))) { err = OGR_F_SetFrom(featDst, featSrc, true); ensure_equals("Cannot set feature from source", OGRERR_NONE, err); err = OGR_L_CreateFeature(lyr, featDst); ensure_equals("Can't write feature to layer", OGRERR_NONE, err); OGR_F_Destroy(featSrc); } // Release and close resources OGR_F_Destroy(featDst); OGR_DS_Destroy(dsSrc); OGR_DS_Destroy(ds); } // Test attributes written to new table template<> template<> void object::test<4>() { OGRErr err = OGRERR_NONE; const int size = 5; const int expect[size] = { 168, 169, 166, 158, 165 }; std::string source(data_tmp_); source += SEP; source += "tpoly.shp"; OGRDataSourceH ds = OGR_Dr_Open(drv_, source.c_str(), false); ensure("Can't open layer", nullptr != ds); OGRLayerH lyr = OGR_DS_GetLayer(ds, 0); ensure("Can't get source layer", nullptr != lyr); err = OGR_L_SetAttributeFilter(lyr, "eas_id < 170"); ensure_equals("Can't set attribute filter", OGRERR_NONE, err); // Prepare tester collection std::vector list; std::copy(expect, expect + size, std::back_inserter(list)); ensure_equal_attributes(lyr, "eas_id", list); OGR_DS_Destroy(ds); } // Test geometries written to new shapefile template<> template<> void object::test<5>() { // Original shapefile std::string orig(data_); orig += SEP; orig += "poly.shp"; OGRDataSourceH dsOrig = OGR_Dr_Open(drv_, orig.c_str(), false); ensure("Can't open layer", nullptr != dsOrig); OGRLayerH lyrOrig = OGR_DS_GetLayer(dsOrig, 0); ensure("Can't get layer", nullptr != lyrOrig); // Copied shapefile std::string tmp(data_tmp_); tmp += SEP; tmp += "tpoly.shp"; OGRDataSourceH dsTmp = OGR_Dr_Open(drv_, tmp.c_str(), false); ensure("Can't open layer", nullptr != dsTmp); OGRLayerH lyrTmp = OGR_DS_GetLayer(dsTmp, 0); ensure("Can't get layer", nullptr != lyrTmp); // Iterate through features and compare geometries OGRFeatureH featOrig = OGR_L_GetNextFeature(lyrOrig); OGRFeatureH featTmp = OGR_L_GetNextFeature(lyrTmp); while (nullptr != featOrig && nullptr != featTmp) { OGRGeometryH lhs = OGR_F_GetGeometryRef(featOrig); OGRGeometryH rhs = OGR_F_GetGeometryRef(featTmp); ensure_equal_geometries(lhs, rhs, 0.000000001); // TODO: add ensure_equal_attributes() OGR_F_Destroy(featOrig); OGR_F_Destroy(featTmp); // Move to next feature featOrig = OGR_L_GetNextFeature(lyrOrig); featTmp = OGR_L_GetNextFeature(lyrTmp); } OGR_DS_Destroy(dsOrig); OGR_DS_Destroy(dsTmp); } // Write a feature without a geometry template<> template<> void object::test<6>() { // Create feature without geometry std::string tmp(data_tmp_); tmp += SEP; tmp += "tpoly.shp"; OGRDataSourceH ds = OGR_Dr_Open(drv_, tmp.c_str(), true); ensure("Can't open layer", nullptr != ds); OGRLayerH lyr = OGR_DS_GetLayer(ds, 0); ensure("Can't get layer", nullptr != lyr); OGRFeatureDefnH featDefn = OGR_L_GetLayerDefn(lyr); ensure("Layer schema is NULL", nullptr != featDefn); OGRFeatureH featNonSpatial = OGR_F_Create(featDefn); ensure("Can't create non-spatial feature", nullptr != featNonSpatial); int fldIndex = OGR_FD_GetFieldIndex(featDefn, "PRFEDEA"); ensure("Can't find field 'PRFEDEA'", fldIndex >= 0); OGR_F_SetFieldString(featNonSpatial, fldIndex, "nulled"); OGRErr err = OGR_L_CreateFeature(lyr, featNonSpatial); ensure_equals("Can't write non-spatial feature to layer", OGRERR_NONE, err); OGR_F_Destroy(featNonSpatial); OGR_DS_Destroy(ds); } // Read back the non-spatial feature and get the geometry template<> template<> void object::test<7>() { OGRErr err = OGRERR_NONE; // Read feature without geometry std::string tmp(data_tmp_); tmp += SEP; tmp += "tpoly.shp"; OGRDataSourceH ds = OGR_Dr_Open(drv_, tmp.c_str(), false); ensure("Can't open layer", nullptr != ds); OGRLayerH lyr = OGR_DS_GetLayer(ds, 0); ensure("Can't get layer", nullptr != lyr); err = OGR_L_SetAttributeFilter(lyr, "PRFEDEA = 'nulled'"); ensure_equals("Can't set attribute filter", OGRERR_NONE, err); // Fetch feature without geometry OGRFeatureH featNonSpatial = OGR_L_GetNextFeature(lyr); ensure("Didn't get feature with null geometry back", nullptr != featNonSpatial); // Null geometry is expected OGRGeometryH nonGeom = OGR_F_GetGeometryRef(featNonSpatial); ensure("Didn't get null geometry as expected", nullptr == nonGeom); OGR_F_Destroy(featNonSpatial); OGR_DS_Destroy(ds); } // Test ExecuteSQL() results layers without geometry template<> template<> void object::test<8>() { const int size = 11; const int expect[size] = { 179, 173, 172, 171, 170, 169, 168, 166, 165, 158, 0 }; // Open directory as a datasource OGRDataSourceH ds = OGR_Dr_Open(drv_, data_tmp_ .c_str(), false); ensure("Can't open datasource", nullptr != ds); std::string sql("select distinct eas_id from tpoly order by eas_id desc"); OGRLayerH lyr = OGR_DS_ExecuteSQL(ds, sql.c_str(), nullptr, nullptr); ensure("Can't create layer from query", nullptr != lyr); // Prepare tester collection std::vector list; std::copy(expect, expect + size, std::back_inserter(list)); ensure_equal_attributes(lyr, "eas_id", list); OGR_DS_ReleaseResultSet(ds, lyr); OGR_DS_Destroy(ds); } // Test ExecuteSQL() results layers with geometry template<> template<> void object::test<9>() { // Open directory as a datasource OGRDataSourceH ds = OGR_Dr_Open(drv_, data_tmp_ .c_str(), false); ensure("Can't open datasource", nullptr != ds); std::string sql("select * from tpoly where prfedea = '35043413'"); OGRLayerH lyr = OGR_DS_ExecuteSQL(ds, sql.c_str(), nullptr, nullptr); ensure("Can't create layer from query", nullptr != lyr); // Prepare tester collection std::vector list; list.push_back("35043413"); // Test attributes ensure_equal_attributes(lyr, "prfedea", list); // Test geometry const char* wkt = "POLYGON ((479750.688 4764702.000,479658.594 4764670.000," "479640.094 4764721.000,479735.906 4764752.000," "479750.688 4764702.000))"; OGRGeometryH testGeom = nullptr; OGRErr err = OGR_G_CreateFromWkt((char**) &wkt, nullptr, &testGeom); ensure_equals("Can't create geometry from WKT", OGRERR_NONE, err); OGR_L_ResetReading(lyr); OGRFeatureH feat = OGR_L_GetNextFeature(lyr); ensure("Cannot fetch feature", nullptr != feat); ensure_equal_geometries(OGR_F_GetGeometryRef(feat), testGeom, 0.001); OGR_F_Destroy(feat); OGR_G_DestroyGeometry(testGeom); OGR_DS_ReleaseResultSet(ds, lyr); OGR_DS_Destroy(ds); } // Test spatial filtering template<> template<> void object::test<10>() { OGRErr err = OGRERR_NONE; // Read feature without geometry std::string tmp(data_tmp_); tmp += SEP; tmp += "tpoly.shp"; OGRDataSourceH ds = OGR_Dr_Open(drv_, tmp.c_str(), false); ensure("Can't open layer", nullptr != ds); OGRLayerH lyr = OGR_DS_GetLayer(ds, 0); ensure("Can't get layer", nullptr != lyr); // Set empty filter for attributes err = OGR_L_SetAttributeFilter(lyr, nullptr); ensure_equals("Can't set attribute filter", OGRERR_NONE, err); // Set spatial filter const char* wkt = "LINESTRING(479505 4763195,480526 4762819)"; OGRGeometryH filterGeom = nullptr; err = OGR_G_CreateFromWkt((char**) &wkt, nullptr, &filterGeom); ensure_equals("Can't create geometry from WKT", OGRERR_NONE, err); OGR_L_SetSpatialFilter(lyr, filterGeom); // Prepare tester collection std::vector list; list.push_back(158); // Test attributes ensure_equal_attributes(lyr, "eas_id", list); OGR_G_DestroyGeometry(filterGeom); OGR_DS_Destroy(ds); } } // namespace tut gdalautotest-3.0.4/cpp/test_osr_set_proj_search_paths.cpp0000644003401500001440000000544613614005367023427 0ustar rouaultusers/****************************************************************************** * $Id: test_osr_set_proj_search_paths.cpp 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 Even Rouault $ * * Project: GDAL Core * Purpose: Test OSRSetPROJSearchPaths() * 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. ****************************************************************************/ #include #include "cpl_error.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include "proj.h" int main() { auto info = proj_info(); auto tokens = CSLTokenizeString2(info.searchpath, ";", 0); // Overriding PROJ_LIB setenv("PROJ_LIB", "/i_do/not_exist", true); // Test we can no longer find the database { OGRSpatialReferenceH hSRS = OSRNewSpatialReference(nullptr); CPLPushErrorHandler(CPLQuietErrorHandler); auto ret = OSRImportFromEPSG(hSRS, 32631); CPLPopErrorHandler(); if( ret == OGRERR_NONE ) { fprintf(stderr, "failure expected (1)\n"); return 1; } OSRDestroySpatialReference(hSRS); } // Use OSRSetPROJSearchPaths to restore search paths OSRSetPROJSearchPaths(tokens); // This time this should work { OGRSpatialReferenceH hSRS = OSRNewSpatialReference(nullptr); if( OSRImportFromEPSG(hSRS, 32631) != OGRERR_NONE ) { fprintf(stderr, "failure not expected (2)\n"); return 1; } OSRDestroySpatialReference(hSRS); } CSLDestroy(tokens); OSRCleanup(); return 0; } gdalautotest-3.0.4/cpp/test_osr.cpp0000644003401500001440000003137413614005367016775 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: OGR Spatial Reference general features test. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include #include #include namespace tut { // Common fixture with test data struct test_osr_data { OGRErr err_; OGRSpatialReferenceH srs_; test_osr_data() : err_(OGRERR_NONE), srs_(nullptr) { srs_ = OSRNewSpatialReference(nullptr); } ~test_osr_data() { OSRDestroySpatialReference(srs_); } }; // Register test group typedef test_group group; typedef group::object object; group test_osr_group("OSR"); // Test UTM WGS84 coordinate system and its various items template<> template<> void object::test<1>() { ensure("SRS handle is NULL", nullptr != srs_); err_ = OSRSetUTM(srs_, 11, TRUE); ensure_equals("Can't set UTM zone", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); ensure("Invalid UTM central meridian", std::fabs(val - (-117.0)) <= .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); ensure("Invalid UTM latitude of origin", std::fabs(val - 0.0) <= .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_SCALE_FACTOR, -1111, &err_); ensure("Invalid UTM scale factor", std::fabs(val - 0.9996) <= .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); ensure("Invalid UTM false easting", std::fabs(val - 500000.0) <= .00000000000010); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); ensure("Invalid UTM false northing", std::fabs(val - 0.0) <= .00000000000010); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "GEOGCS")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "GEOGCS")), std::string("4326")); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "DATUM")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "DATUM")), std::string("6326")); } // Simple default NAD83 State Plane zone template<> template<> void object::test<2>() { ensure("SRS handle is NULL", nullptr != srs_); // California III NAD83 OSRSetStatePlane(srs_, 403, 1); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_); ensure_approx_equals(val, 38.43333333333333); val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_); ensure_approx_equals(val, 37.06666666666667); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); ensure_approx_equals(val, 36.5); val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); ensure_approx_equals(val, -120.5); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); ensure_approx_equals(val, 2000000.0); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); ensure_approx_equals(val, 500000.0); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "GEOGCS")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "GEOGCS")), std::string("4269")); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "DATUM")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "DATUM")), std::string("6269")); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "PROJCS")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "PROJCS")), std::string("26943")); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "PROJCS|UNIT")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "PROJCS|UNIT")), std::string("9001")); } // NAD83 State Plane zone, but overridden to be in Feet template<> template<> void object::test<3>() { ensure("SRS handle is NULL", nullptr != srs_); // California III NAD83 (feet) OSRSetStatePlaneWithUnits(srs_, 403, 1, "Foot", 0.3048006096012192); double val = 0; val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_1, -1111, &err_); ensure_approx_equals(val, 38.43333333333333); val = OSRGetProjParm(srs_, SRS_PP_STANDARD_PARALLEL_2, -1111, &err_); ensure_approx_equals(val, 37.06666666666667); val = OSRGetProjParm(srs_, SRS_PP_LATITUDE_OF_ORIGIN, -1111, &err_); ensure_approx_equals(val, 36.5); val = OSRGetProjParm(srs_, SRS_PP_CENTRAL_MERIDIAN, -1111, &err_); ensure_approx_equals(val, -120.5); val = OSRGetProjParm(srs_, SRS_PP_FALSE_EASTING, -1111, &err_); ensure_approx_equals(val, 6561666.666666667); val = OSRGetProjParm(srs_, SRS_PP_FALSE_NORTHING, -1111, &err_); ensure_approx_equals(val, 1640416.666666667); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "GEOGCS")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "GEOGCS")), std::string("4269")); ensure_equals("Invalid authority name", std::string(OSRGetAuthorityName(srs_, "DATUM")), std::string("EPSG")); ensure_equals("Invalid authority code", std::string(OSRGetAuthorityCode(srs_, "DATUM")), std::string("6269")); ensure("Got a PROJCS Authority but we should not", nullptr == OSRGetAuthorityName(srs_, "PROJCS")); ensure("Got METER authority code on linear units", nullptr == OSRGetAuthorityCode(srs_, "PROJCS|UNIT")); char* unitsName = nullptr; val = OSRGetLinearUnits(srs_, &unitsName); ensure("Units name is NULL", nullptr != unitsName); ensure( "Did not get Foot linear units", std::string("Foot") == unitsName); } // Translate a coordinate system with NAD shift into to PROJ.4 and back. // Also, verify that the TOWGS84 parameters are preserved. template<> template<> void object::test<4>() { ensure("SRS handle is NULL", nullptr != srs_); err_ = OSRSetGS(srs_, -117.0, 100000.0, 100000); ensure_equals("OSRSetGS failed", err_, OGRERR_NONE); err_ = OSRSetGeogCS(srs_, "Test GCS", "Test Datum", "WGS84", SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING, nullptr, 0, nullptr, 0); ensure_equals("OSRSetGeogCS failed", err_, OGRERR_NONE); err_ = OSRSetTOWGS84(srs_, 1, 2, 3, 0, 0, 0, 0); ensure_equals("OSRSetTOWGS84 failed", err_, OGRERR_NONE); const int coeffSize = 7; double coeff[coeffSize] = { 0 }; const double expect[coeffSize] = { 1, 2, 3, 0, 0, 0, 0 }; err_ = OSRGetTOWGS84(srs_, coeff, 7); ensure_equals("OSRSetTOWGS84 failed", err_, OGRERR_NONE); ensure("GetTOWGS84 result is wrong", std::equal(coeff, coeff + coeffSize, expect)); OSRSetLinearUnits(srs_, "Metre", 1); char* proj4 = nullptr; err_ = OSRExportToProj4(srs_, &proj4); ensure_equals("OSRExportToProj4 failed", err_, OGRERR_NONE); OGRSpatialReferenceH srs2 = nullptr; srs2 = OSRNewSpatialReference(nullptr); err_ = OSRImportFromProj4(srs2, proj4); ensure_equals("OSRImportFromProj4 failed", err_, OGRERR_NONE); err_ = OSRGetTOWGS84(srs2, coeff, 7); ensure_equals("OSRSetTOWGS84 failed", err_, OGRERR_NONE); ensure("GetTOWGS84 result is wrong", std::equal(coeff, coeff + coeffSize, expect)); OSRDestroySpatialReference(srs2); CPLFree(proj4); } // Test URN support for OGC:CRS84 template<> template<> void object::test<5>() { ensure("SRS handle is NULL", nullptr != srs_); err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC:1.3:CRS84"); ensure_equals("OSRSetFromUserInput failed", err_, OGRERR_NONE); char* wkt1 = nullptr; err_ = OSRExportToWkt(srs_, &wkt1); ensure_equals("OSRExportToWkt failed", err_, OGRERR_NONE); ensure("OSRExportToWkt returned NULL", nullptr != wkt1); CPLFree(wkt1); } // Test URN support for EPSG template<> template<> void object::test<6>() { ensure("SRS handle is NULL", nullptr != srs_); err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:EPSG::4326"); ensure_equals("OSRSetFromUserInput failed", err_, OGRERR_NONE); char* wkt1 = nullptr; err_ = OSRExportToWkt(srs_, &wkt1); ensure_equals("OSRExportToWkt failed", err_, OGRERR_NONE); ensure("OSRExportToWkt returned NULL", nullptr != wkt1); err_ = OSRSetFromUserInput(srs_, "EPSGA:4326"); ensure_equals("OSRSetFromUserInput failed", err_, OGRERR_NONE); char* wkt2 = nullptr; err_ = OSRExportToWkt(srs_, &wkt2); ensure_equals("OSRExportToWkt failed", err_, OGRERR_NONE); ensure("OSRExportToWkt returned NULL", nullptr != wkt2); ensure_equals("EPSG:4326 urn lookup not as expected", std::string(wkt1), std::string(wkt2)); CPLFree(wkt1); CPLFree(wkt2); } // Test URN support for auto projection template<> template<> void object::test<7 >() { ensure("SRS handle is NULL", nullptr != srs_); err_ = OSRSetFromUserInput(srs_, "urn:ogc:def:crs:OGC::AUTO42001:-117:33"); ensure_equals("OSRSetFromUserInput failed", err_, OGRERR_NONE); char* wkt1 = nullptr; err_ = OSRExportToWkt(srs_, &wkt1); ensure_equals("OSRExportToWkt failed", err_, OGRERR_NONE); ensure("OSRExportToWkt returned NULL", nullptr != wkt1); std::string expect("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\",-117]," "PARAMETER[\"scale_factor\",0.9996]," "PARAMETER[\"false_easting\",500000]," "PARAMETER[\"false_northing\",0]," "UNIT[\"Meter\",1,AUTHORITY[\"EPSG\",\"9001\"]]," "AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]"); ensure_equals("AUTO42001 urn lookup not as expected", std::string(wkt1), expect); CPLFree(wkt1); } } // namespace tut gdalautotest-3.0.4/cpp/testthreadcond.cpp0000644003401500001440000001071313614005370020132 0ustar rouaultusers/****************************************************************************** * $Id: testthreadcond.cpp 7e07230bbff24eb333608de4dbd460b7312839d0 2017-12-11 19:08:47Z Even Rouault $ * * Project: GDAL Core * Purpose: Test thread API * Author: Even Rouault, * ****************************************************************************** * Copyright (c) 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. ****************************************************************************/ #ifndef DEBUG #define DEBUG #endif #include "cpl_multiproc.h" CPLCond* hCond = nullptr; CPLCond* hCondJobFinished = nullptr; CPLMutex* hClientMutex = nullptr; struct _JobItem { int nJobNumber; struct _JobItem* psNext; }; typedef struct _JobItem JobItem; JobItem* psJobList = nullptr; int nJobListSize = 0; int nThreadTotal = 0; int bProducedFinished = 0; int bVerbose = FALSE; static void ProducerThread(void * /* unused */) { int i; int jobNumber = 0; JobItem* psItem; while(jobNumber < 1000) { CPLAcquireMutex(hClientMutex, 1000.0); for(i=0;inJobNumber = jobNumber; psItem->psNext = psJobList; psJobList = psItem; } CPLCondBroadcast(hCond); while (nJobListSize > nThreadTotal) { CPLCondWait(hCondJobFinished, hClientMutex); } CPLReleaseMutex(hClientMutex); } CPLAcquireMutex(hClientMutex, 1000.0); bProducedFinished = 1; CPLCondBroadcast(hCond); CPLReleaseMutex(hClientMutex); } static void ConsumerThread(void* pIndex) { int nJobNumber; int nThreadIndex; JobItem* psNext; nThreadIndex = *(int*)pIndex; free(pIndex); if (bVerbose) printf("Thread %d created\n", nThreadIndex); nThreadTotal ++; while(TRUE) { CPLAcquireMutex(hClientMutex, 1000.0); while(psJobList == nullptr && !bProducedFinished) CPLCondWait(hCond, hClientMutex); if (bProducedFinished) { CPLReleaseMutex(hClientMutex); break; } nJobNumber = psJobList->nJobNumber; psNext = psJobList->psNext; free(psJobList); psJobList = psNext; CPLReleaseMutex(hClientMutex); if (bVerbose) printf("Thread %d consumed job %d\n", nThreadIndex, nJobNumber); CPLAcquireMutex(hClientMutex, 1000.0); nJobListSize --; CPLCondSignal(hCondJobFinished); CPLReleaseMutex(hClientMutex); } } int main(int argc, char* argv[]) { int i; CPLJoinableThread* apThreads[10]; for(i = 0; i < argc; i++) { if( EQUAL(argv[i], "-verbose") ) bVerbose = TRUE; } hCond = CPLCreateCond(); hCondJobFinished = CPLCreateCond(); hClientMutex = CPLCreateMutex(); CPLReleaseMutex(hClientMutex); CPLCreateThread(ProducerThread, nullptr); for(i = 0; i < 10;i++) { int* pi = (int*)malloc(sizeof(int)); *pi = i; apThreads[i] = CPLCreateJoinableThread(ConsumerThread, pi); } for(i = 0; i < 10;i++) { CPLJoinThread(apThreads[i]); } CPLDestroyCond(hCond); CPLDestroyCond(hCondJobFinished); CPLDestroyMutex(hClientMutex); return 0; } gdalautotest-3.0.4/cpp/test_cpl.cpp0000644003401500001440000031110413614005370016732 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test general CPL features. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // Copyright (c) 2008-2012, Even Rouault // Copyright (c) 2017, Dmitry Baryshnikov // Copyright (c) 2017, NextGIS // // 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. /////////////////////////////////////////////////////////////////////////////// #define GDAL_COMPILATION #include "gdal_unit_test.h" #include "cpl_error.h" #include "cpl_hash_set.h" #include "cpl_list.h" #include "cpl_sha256.h" #include "cpl_string.h" #include "cpl_safemaths.hpp" #include "cpl_time.h" #include "cpl_json.h" #include "cpl_json_streaming_parser.h" #include "cpl_mem_cache.h" #include "cpl_http.h" #include "cpl_auto_close.h" #include "cpl_minixml.h" #include #include static bool gbGotError = false; static void CPL_STDCALL myErrorHandler(CPLErr, CPLErrorNum, const char*) { gbGotError = true; } namespace tut { // Common fixture with test data struct test_cpl_data { std::string data_; test_cpl_data() { // Compose data path for test group data_ = tut::common::data_basedir; } }; // Register test group typedef test_group group; typedef group::object object; group test_cpl_group("CPL"); // Test cpl_list API template<> template<> void object::test<1>() { CPLList* list; list = CPLListInsert(nullptr, (void*)nullptr, 0); ensure(CPLListCount(list) == 1); list = CPLListRemove(list, 2); ensure(CPLListCount(list) == 1); list = CPLListRemove(list, 1); ensure(CPLListCount(list) == 1); list = CPLListRemove(list, 0); ensure(CPLListCount(list) == 0); list = nullptr; list = CPLListInsert(nullptr, (void*)nullptr, 2); ensure(CPLListCount(list) == 3); list = CPLListRemove(list, 2); ensure(CPLListCount(list) == 2); list = CPLListRemove(list, 1); ensure(CPLListCount(list) == 1); list = CPLListRemove(list, 0); ensure(CPLListCount(list) == 0); list = nullptr; list = CPLListAppend(list, (void*)1); ensure(CPLListGet(list,0) == list); ensure(CPLListGet(list,1) == nullptr); list = CPLListAppend(list, (void*)2); list = CPLListInsert(list, (void*)3, 2); ensure(CPLListCount(list) == 3); CPLListDestroy(list); list = nullptr; list = CPLListAppend(list, (void*)1); list = CPLListAppend(list, (void*)2); list = CPLListInsert(list, (void*)4, 3); CPLListGet(list,2)->pData = (void*)3; ensure(CPLListCount(list) == 4); ensure(CPLListGet(list,0)->pData == (void*)1); ensure(CPLListGet(list,1)->pData == (void*)2); ensure(CPLListGet(list,2)->pData == (void*)3); ensure(CPLListGet(list,3)->pData == (void*)4); CPLListDestroy(list); list = nullptr; list = CPLListInsert(list, (void*)4, 1); CPLListGet(list,0)->pData = (void*)2; list = CPLListInsert(list, (void*)1, 0); list = CPLListInsert(list, (void*)3, 2); ensure(CPLListCount(list) == 4); ensure(CPLListGet(list,0)->pData == (void*)1); ensure(CPLListGet(list,1)->pData == (void*)2); ensure(CPLListGet(list,2)->pData == (void*)3); ensure(CPLListGet(list,3)->pData == (void*)4); list = CPLListRemove(list, 1); list = CPLListRemove(list, 1); list = CPLListRemove(list, 0); list = CPLListRemove(list, 0); ensure(list == nullptr); } typedef struct { const char* testString; CPLValueType expectedResult; } TestStringStruct; // Test CPLGetValueType template<> template<> void object::test<2>() { TestStringStruct apszTestStrings[] = { { "+25.e+3", CPL_VALUE_REAL }, { "-25.e-3", CPL_VALUE_REAL }, { "25.e3", CPL_VALUE_REAL }, { "25e3", CPL_VALUE_REAL }, { " 25e3 ", CPL_VALUE_REAL }, { ".1e3", CPL_VALUE_REAL }, { "25", CPL_VALUE_INTEGER }, { "-25", CPL_VALUE_INTEGER }, { "+25", CPL_VALUE_INTEGER }, { "25e 3", CPL_VALUE_STRING }, { "25e.3", CPL_VALUE_STRING }, { "-2-5e3", CPL_VALUE_STRING }, { "2-5e3", CPL_VALUE_STRING }, { "25.25.3", CPL_VALUE_STRING }, { "25e25e3", CPL_VALUE_STRING }, { "25e2500", CPL_VALUE_STRING }, /* #6128 */ { "d1", CPL_VALUE_STRING } /* #6305 */ }; size_t i; for(i=0;i < sizeof(apszTestStrings) / sizeof(apszTestStrings[0]); i++) { ensure(CPLGetValueType(apszTestStrings[i].testString) == apszTestStrings[i].expectedResult); if (CPLGetValueType(apszTestStrings[i].testString) != apszTestStrings[i].expectedResult) fprintf(stderr, "mismatch on item %d : value=\"%s\", expect_result=%d, result=%d\n", (int)i, apszTestStrings[i].testString, apszTestStrings[i].expectedResult, CPLGetValueType(apszTestStrings[i].testString)); } } // Test cpl_hash_set API template<> template<> void object::test<3>() { CPLHashSet* set = CPLHashSetNew(CPLHashSetHashStr, CPLHashSetEqualStr, CPLFree); ensure(CPLHashSetInsert(set, CPLStrdup("hello")) == TRUE); ensure(CPLHashSetInsert(set, CPLStrdup("good morning")) == TRUE); ensure(CPLHashSetInsert(set, CPLStrdup("bye bye")) == TRUE); ensure(CPLHashSetSize(set) == 3); ensure(CPLHashSetInsert(set, CPLStrdup("bye bye")) == FALSE); ensure(CPLHashSetSize(set) == 3); ensure(CPLHashSetRemove(set, "bye bye") == TRUE); ensure(CPLHashSetSize(set) == 2); ensure(CPLHashSetRemove(set, "good afternoon") == FALSE); ensure(CPLHashSetSize(set) == 2); CPLHashSetDestroy(set); } static int sumValues(void* elt, void* user_data) { int* pnSum = (int*)user_data; *pnSum += *(int*)elt; return TRUE; } // Test cpl_hash_set API template<> template<> void object::test<4>() { const int HASH_SET_SIZE = 1000; int data[HASH_SET_SIZE]; for(int i=0; i template<> void object::test<5>() { // CSLTokenizeString2(); char **papszStringList; papszStringList = CSLTokenizeString2("one two three", " ", 0); ensure(CSLCount(papszStringList) == 3); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "three")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one two, three;four,five; six", " ;,", 0); ensure(CSLCount(papszStringList) == 6); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "three")); ensure(EQUAL(papszStringList[3], "four")); ensure(EQUAL(papszStringList[4], "five")); ensure(EQUAL(papszStringList[5], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one two,,,five,six", " ,", CSLT_ALLOWEMPTYTOKENS); ensure(CSLCount(papszStringList) == 6); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "")); ensure(EQUAL(papszStringList[3], "")); ensure(EQUAL(papszStringList[4], "five")); ensure(EQUAL(papszStringList[5], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one two,\"three,four ,\",five,six", " ,", CSLT_HONOURSTRINGS); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "three,four ,")); ensure(EQUAL(papszStringList[3], "five")); ensure(EQUAL(papszStringList[4], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one two,\"three,four ,\",five,six", " ,", CSLT_PRESERVEQUOTES); ensure(CSLCount(papszStringList) == 7); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "\"three")); ensure(EQUAL(papszStringList[3], "four")); ensure(EQUAL(papszStringList[4], "\"")); ensure(EQUAL(papszStringList[5], "five")); ensure(EQUAL(papszStringList[6], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one two,\"three,four ,\",five,six", " ,", CSLT_HONOURSTRINGS | CSLT_PRESERVEQUOTES); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "\"three,four ,\"")); ensure(EQUAL(papszStringList[3], "five")); ensure(EQUAL(papszStringList[4], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one \\two,\"three,\\four ,\",five,six", " ,", CSLT_PRESERVEESCAPES); ensure(CSLCount(papszStringList) == 7); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "\\two")); ensure(EQUAL(papszStringList[2], "\"three")); ensure(EQUAL(papszStringList[3], "\\four")); ensure(EQUAL(papszStringList[4], "\"")); ensure(EQUAL(papszStringList[5], "five")); ensure(EQUAL(papszStringList[6], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one \\two,\"three,\\four ,\",five,six", " ,", CSLT_PRESERVEQUOTES | CSLT_PRESERVEESCAPES); ensure(CSLCount(papszStringList) == 7); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "\\two")); ensure(EQUAL(papszStringList[2], "\"three")); ensure(EQUAL(papszStringList[3], "\\four")); ensure(EQUAL(papszStringList[4], "\"")); ensure(EQUAL(papszStringList[5], "five")); ensure(EQUAL(papszStringList[6], "six")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one ,two, three, four ,five ", ",", 0); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one ")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], " three")); ensure(EQUAL(papszStringList[3], " four ")); ensure(EQUAL(papszStringList[4], "five ")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one ,two, three, four ,five ", ",", CSLT_STRIPLEADSPACES); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one ")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "three")); ensure(EQUAL(papszStringList[3], "four ")); ensure(EQUAL(papszStringList[4], "five ")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one ,two, three, four ,five ", ",", CSLT_STRIPENDSPACES); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], " three")); ensure(EQUAL(papszStringList[3], " four")); ensure(EQUAL(papszStringList[4], "five")); CSLDestroy(papszStringList); papszStringList = CSLTokenizeString2("one ,two, three, four ,five ", ",", CSLT_STRIPLEADSPACES | CSLT_STRIPENDSPACES); ensure(CSLCount(papszStringList) == 5); ensure(EQUAL(papszStringList[0], "one")); ensure(EQUAL(papszStringList[1], "two")); ensure(EQUAL(papszStringList[2], "three")); ensure(EQUAL(papszStringList[3], "four")); ensure(EQUAL(papszStringList[4], "five")); CSLDestroy(papszStringList); } typedef struct { char szEncoding[24]; char szString[1024 - 24]; } TestRecodeStruct; // Test cpl_recode API template<> template<> void object::test<6>() { /* * NOTE: This test will generally fail if iconv() is not * linked in. * * CPLRecode() will be tested using the test file containing * a list of strings of the same text in different encoding. The * string is non-ASCII to avoid trivial transformations. Test file * has a simple binary format: a table of records, each record * is 1024 bytes long. The first 24 bytes of each record contain * encoding name (ASCII, zero padded), the last 1000 bytes contain * encoded string, zero padded. * * NOTE 1: We can't use a test file in human readable text format * here because of multiple different encodings including * multibyte ones. * * The test file could be generated with the following simple shell * script: * * #!/bin/sh * * # List of encodings to convert the test string into * ENCODINGS="UTF-8 CP1251 KOI8-R UCS-2 UCS-2BE UCS-2LE UCS-4 UCS-4BE UCS-4LE UTF-16 UTF-32" * # The test string itself in UTF-8 encoding. * # This means "Improving GDAL internationalization." in Russian. * TESTSTRING="\u0423\u043b\u0443\u0447\u0448\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e GDAL." * * RECORDSIZE=1024 * ENCSIZE=24 * * i=0 * for enc in ${ENCODINGS}; do * env printf "${enc}" | dd ibs=${RECORDSIZE} conv=sync obs=1 seek=$((${RECORDSIZE}*${i})) of="recode-rus.dat" status=noxfer * env printf "${TESTSTRING}" | iconv -t ${enc} | dd ibs=${RECORDSIZE} conv=sync obs=1 seek=$((${RECORDSIZE}*${i}+${ENCSIZE})) of="recode-rus.dat" status=noxfer * i=$((i+1)) * done * * NOTE 2: The test string is encoded with the special format * "\uXXXX" sequences, so we able to paste it here. * * NOTE 3: We need a printf utility from the coreutils because of * that. "env printf" should work avoiding the shell * built-in. * * NOTE 4: "iconv" utility without the "-f" option will work with * encoding read from the current locale. * * TODO: 1. Add more encodings maybe more test files. * 2. Add test for CPLRecodeFromWChar()/CPLRecodeToWChar(). * 3. Test translation between each possible pair of * encodings in file, not only into the UTF-8. */ std::ifstream fin((data_ + SEP + "recode-rus.dat").c_str(), std::ifstream::binary); TestRecodeStruct oReferenceString; // Read reference string (which is the first one in the file) fin.read(oReferenceString.szEncoding, sizeof(oReferenceString.szEncoding)); oReferenceString.szEncoding[sizeof(oReferenceString.szEncoding) - 1] = '\0'; fin.read(oReferenceString.szString, sizeof(oReferenceString.szString)); oReferenceString.szString[sizeof(oReferenceString.szString) - 1] = '\0'; while ( !fin.eof() ) { TestRecodeStruct oTestString; fin.read(oTestString.szEncoding, sizeof(oTestString.szEncoding)); oTestString.szEncoding[sizeof(oTestString.szEncoding) - 1] = '\0'; fin.read(oTestString.szString, sizeof(oTestString.szString)); oTestString.szString[sizeof(oTestString.szString) - 1] = '\0'; // Compare each string with the reference one CPLErrorReset(); char *pszDecodedString = CPLRecode( oTestString.szString, oTestString.szEncoding, oReferenceString.szEncoding); if( strstr(CPLGetLastErrorMsg(), "Recode from KOI8-R to UTF-8 not supported") != nullptr ) { CPLFree( pszDecodedString ); break; } size_t nLength = MIN( strlen(pszDecodedString), sizeof(oReferenceString.szEncoding) ); bool bOK = (memcmp(pszDecodedString, oReferenceString.szString, nLength) == 0); // FIXME Some tests fail on Mac. Not sure why, but do not error out just for that if( !bOK && (strstr(CPLGetConfigOption("TRAVIS_OS_NAME", ""), "osx") != nullptr || strstr(CPLGetConfigOption("BUILD_NAME", ""), "osx") != nullptr || getenv("DO_NOT_FAIL_ON_RECODE_ERRORS") != nullptr)) { fprintf(stderr, "Recode from %s failed\n", oTestString.szEncoding); } else { ensure( std::string("Recode from ") + oTestString.szEncoding, bOK ); } CPLFree( pszDecodedString ); } fin.close(); } /************************************************************************/ /* CPLStringList tests */ /************************************************************************/ template<> template<> void object::test<7>() { CPLStringList oCSL; ensure( "7nil", oCSL.List() == nullptr ); oCSL.AddString( "def" ); oCSL.AddString( "abc" ); ensure_equals( "7", oCSL.Count(), 2 ); ensure( "70", EQUAL(oCSL[0], "def") ); ensure( "71", EQUAL(oCSL[1], "abc") ); ensure( "72", oCSL[17] == nullptr ); ensure( "73", oCSL[-1] == nullptr ); ensure_equals( "74", oCSL.FindString("abc"), 1 ); CSLDestroy( oCSL.StealList() ); ensure_equals( "75", oCSL.Count(), 0 ); ensure( "76", oCSL.List() == nullptr ); // Test that the list will make an internal copy when needed to // modify a read-only list. oCSL.AddString( "def" ); oCSL.AddString( "abc" ); CPLStringList oCopy( oCSL.List(), FALSE ); ensure_equals( "77", oCSL.List(), oCopy.List() ); ensure_equals( "78", oCSL.Count(), oCopy.Count() ); oCopy.AddString( "xyz" ); ensure( "79", oCSL.List() != oCopy.List() ); ensure_equals( "7a", oCopy.Count(), 3 ); ensure_equals( "7b", oCSL.Count(), 2 ); ensure( "7c", EQUAL(oCopy[2], "xyz") ); } template<> template<> void object::test<8>() { // Test some name=value handling stuff. CPLStringList oNVL; oNVL.AddNameValue( "KEY1", "VALUE1" ); oNVL.AddNameValue( "2KEY", "VALUE2" ); ensure_equals( oNVL.Count(), 2 ); ensure( EQUAL(oNVL.FetchNameValue("2KEY"),"VALUE2") ); ensure( oNVL.FetchNameValue("MISSING") == nullptr ); oNVL.AddNameValue( "KEY1", "VALUE3" ); ensure( EQUAL(oNVL.FetchNameValue("KEY1"),"VALUE1") ); ensure( EQUAL(oNVL[2],"KEY1=VALUE3") ); ensure( EQUAL(oNVL.FetchNameValueDef("MISSING","X"),"X") ); oNVL.SetNameValue( "2KEY", "VALUE4" ); ensure( EQUAL(oNVL.FetchNameValue("2KEY"),"VALUE4") ); ensure_equals( oNVL.Count(), 3 ); // make sure deletion works. oNVL.SetNameValue( "2KEY", nullptr ); ensure( oNVL.FetchNameValue("2KEY") == nullptr ); ensure_equals( oNVL.Count(), 2 ); // Test boolean support. ensure_equals( "b1", oNVL.FetchBoolean( "BOOL", TRUE ), TRUE ); ensure_equals( "b2", oNVL.FetchBoolean( "BOOL", FALSE ), FALSE ); oNVL.SetNameValue( "BOOL", "YES" ); ensure_equals( "b3", oNVL.FetchBoolean( "BOOL", TRUE ), TRUE ); ensure_equals( "b4", oNVL.FetchBoolean( "BOOL", FALSE ), TRUE ); oNVL.SetNameValue( "BOOL", "1" ); ensure_equals( "b5", oNVL.FetchBoolean( "BOOL", FALSE ), TRUE ); oNVL.SetNameValue( "BOOL", "0" ); ensure_equals( "b6", oNVL.FetchBoolean( "BOOL", TRUE ), FALSE ); oNVL.SetNameValue( "BOOL", "FALSE" ); ensure_equals( "b7", oNVL.FetchBoolean( "BOOL", TRUE ), FALSE ); oNVL.SetNameValue( "BOOL", "ON" ); ensure_equals( "b8", oNVL.FetchBoolean( "BOOL", FALSE ), TRUE ); // Test assignment operator. CPLStringList oCopy; { CPLStringList oTemp; oTemp.AddString("test"); oCopy = oTemp; } ensure( "c1", EQUAL(oCopy[0],"test") ); auto& oCopyRef(oCopy); oCopy = oCopyRef; ensure( "c2", EQUAL(oCopy[0],"test") ); // Test copy constructor. CPLStringList oCopy2(oCopy); oCopy.Clear(); ensure( "c3", EQUAL(oCopy2[0],"test") ); // Test sorting CPLStringList oTestSort; oTestSort.AddNameValue("Z", "1"); oTestSort.AddNameValue("L", "2"); oTestSort.AddNameValue("T", "3"); oTestSort.AddNameValue("A", "4"); oTestSort.Sort(); ensure( "c4", EQUAL(oTestSort[0],"A=4") ); ensure( "c5", EQUAL(oTestSort[1],"L=2") ); ensure( "c6", EQUAL(oTestSort[2],"T=3") ); ensure( "c7", EQUAL(oTestSort[3],"Z=1") ); ensure_equals( "c8", oTestSort[4], (const char*)nullptr ); // Test FetchNameValue() in a sorted list ensure( "c9", EQUAL(oTestSort.FetchNameValue("A"),"4") ); ensure( "c10", EQUAL(oTestSort.FetchNameValue("L"),"2") ); ensure( "c11", EQUAL(oTestSort.FetchNameValue("T"),"3") ); ensure( "c12", EQUAL(oTestSort.FetchNameValue("Z"),"1") ); // Test AddNameValue() in a sorted list oTestSort.AddNameValue("B", "5"); ensure( "c13", EQUAL(oTestSort[0],"A=4") ); ensure( "c14", EQUAL(oTestSort[1],"B=5") ); ensure( "c15", EQUAL(oTestSort[2],"L=2") ); ensure( "c16", EQUAL(oTestSort[3],"T=3") ); ensure( "c17", EQUAL(oTestSort[4],"Z=1") ); ensure_equals( "c18", oTestSort[5], (const char*)nullptr ); // Test SetNameValue() of an existing item in a sorted list oTestSort.SetNameValue("Z", "6"); ensure( "c19", EQUAL(oTestSort[4],"Z=6") ); // Test SetNameValue() of a non-existing item in a sorted list oTestSort.SetNameValue("W", "7"); ensure( "c20", EQUAL(oTestSort[0],"A=4") ); ensure( "c21", EQUAL(oTestSort[1],"B=5") ); ensure( "c22", EQUAL(oTestSort[2],"L=2") ); ensure( "c23", EQUAL(oTestSort[3],"T=3") ); ensure( "c24", EQUAL(oTestSort[4],"W=7") ); ensure( "c25", EQUAL(oTestSort[5],"Z=6") ); ensure_equals( "c26", oTestSort[6], (const char*)nullptr ); } template<> template<> void object::test<9>() { // Test some name=value handling stuff *with* sorting active. CPLStringList oNVL; oNVL.Sort(); oNVL.AddNameValue( "KEY1", "VALUE1" ); oNVL.AddNameValue( "2KEY", "VALUE2" ); ensure_equals( "91", oNVL.Count(), 2 ); ensure( "92", EQUAL(oNVL.FetchNameValue("KEY1"),"VALUE1") ); ensure( "93", EQUAL(oNVL.FetchNameValue("2KEY"),"VALUE2") ); ensure( "94", oNVL.FetchNameValue("MISSING") == nullptr ); oNVL.AddNameValue( "KEY1", "VALUE3" ); ensure_equals( "95", oNVL.Count(), 3 ); ensure( "96", EQUAL(oNVL.FetchNameValue("KEY1"),"VALUE1") ); ensure( "97", EQUAL(oNVL.FetchNameValueDef("MISSING","X"),"X") ); oNVL.SetNameValue( "2KEY", "VALUE4" ); ensure( "98", EQUAL(oNVL.FetchNameValue("2KEY"),"VALUE4") ); ensure_equals( "99", oNVL.Count(), 3 ); // make sure deletion works. oNVL.SetNameValue( "2KEY", nullptr ); ensure( "9a", oNVL.FetchNameValue("2KEY") == nullptr ); ensure_equals( "9b", oNVL.Count(), 2 ); // Test insertion logic pretty carefully. oNVL.Clear(); ensure( "9c", oNVL.IsSorted() == TRUE ); oNVL.SetNameValue( "B", "BB" ); oNVL.SetNameValue( "A", "AA" ); oNVL.SetNameValue( "D", "DD" ); oNVL.SetNameValue( "C", "CC" ); // items should be in sorted order. ensure( "9c1", EQUAL(oNVL[0],"A=AA") ); ensure( "9c2", EQUAL(oNVL[1],"B=BB") ); ensure( "9c3", EQUAL(oNVL[2],"C=CC") ); ensure( "9c4", EQUAL(oNVL[3],"D=DD") ); ensure( "9d", EQUAL(oNVL.FetchNameValue("A"),"AA") ); ensure( "9e", EQUAL(oNVL.FetchNameValue("B"),"BB") ); ensure( "9f", EQUAL(oNVL.FetchNameValue("C"),"CC") ); ensure( "9g", EQUAL(oNVL.FetchNameValue("D"),"DD") ); } template<> template<> void object::test<10>() { GByte abyDigest[CPL_SHA256_HASH_SIZE]; char szDigest[2*CPL_SHA256_HASH_SIZE+1]; CPL_HMAC_SHA256("key", 3, "The quick brown fox jumps over the lazy dog", strlen("The quick brown fox jumps over the lazy dog"), abyDigest); for(int i=0;i template<> void object::test<11>() { CPLPushErrorHandler(CPLQuietErrorHandler); // The following tests will fail because of overflows CPLErrorReset(); ensure( "11.1", VSIMalloc2( ~(size_t)0, ~(size_t)0 ) == nullptr ); ensure( "11.1bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.2", VSIMalloc3( 1, ~(size_t)0, ~(size_t)0 ) == nullptr ); ensure( "11.2bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.3", VSIMalloc3( ~(size_t)0, 1, ~(size_t)0 ) == nullptr ); ensure( "11.3bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.4", VSIMalloc3( ~(size_t)0, ~(size_t)0, 1 ) == nullptr ); ensure( "11.4bis", CPLGetLastErrorType() != CE_None ); if( !CSLTestBoolean(CPLGetConfigOption("SKIP_MEM_INTENSIVE_TEST", "NO")) ) { // The following tests will fail because such allocations cannot succeed #if SIZEOF_VOIDP == 8 CPLErrorReset(); ensure( "11.6", VSIMalloc( ~(size_t)0 ) == nullptr ); ensure( "11.6bis", CPLGetLastErrorType() == CE_None ); /* no error reported */ CPLErrorReset(); ensure( "11.7", VSIMalloc2( ~(size_t)0, 1 ) == nullptr ); ensure( "11.7bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.8", VSIMalloc3( ~(size_t)0, 1, 1 ) == nullptr ); ensure( "11.8bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.9", VSICalloc( ~(size_t)0, 1 ) == nullptr ); ensure( "11.9bis", CPLGetLastErrorType() == CE_None ); /* no error reported */ CPLErrorReset(); ensure( "11.10", VSIRealloc( nullptr, ~(size_t)0 ) == nullptr ); ensure( "11.10bis", CPLGetLastErrorType() == CE_None ); /* no error reported */ CPLErrorReset(); ensure( "11.11", VSI_MALLOC_VERBOSE( ~(size_t)0 ) == nullptr ); ensure( "11.11bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.12", VSI_MALLOC2_VERBOSE( ~(size_t)0, 1 ) == nullptr ); ensure( "11.12bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.13", VSI_MALLOC3_VERBOSE( ~(size_t)0, 1, 1 ) == nullptr ); ensure( "11.13bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.14", VSI_CALLOC_VERBOSE( ~(size_t)0, 1 ) == nullptr ); ensure( "11.14bis", CPLGetLastErrorType() != CE_None ); CPLErrorReset(); ensure( "11.15", VSI_REALLOC_VERBOSE( nullptr, ~(size_t)0 ) == nullptr ); ensure( "11.15bis", CPLGetLastErrorType() != CE_None ); #endif } CPLPopErrorHandler(); // The following allocs will return NULL because of 0 byte alloc CPLErrorReset(); ensure( "11.16", VSIMalloc2( 0, 1 ) == nullptr ); ensure( "11.16bis", CPLGetLastErrorType() == CE_None ); ensure( "11.17", VSIMalloc2( 1, 0 ) == nullptr ); CPLErrorReset(); ensure( "11.18", VSIMalloc3( 0, 1, 1 ) == nullptr ); ensure( "11.18bis", CPLGetLastErrorType() == CE_None ); ensure( "11.19", VSIMalloc3( 1, 0, 1 ) == nullptr ); ensure( "11.20", VSIMalloc3( 1, 1, 0 ) == nullptr ); } template<> template<> void object::test<12>() { ensure( strcmp(CPLFormFilename("a", "b", nullptr), "a/b") == 0 || strcmp(CPLFormFilename("a", "b", nullptr), "a\\b") == 0 ); ensure( strcmp(CPLFormFilename("a/", "b", nullptr), "a/b") == 0 || strcmp(CPLFormFilename("a/", "b", nullptr), "a\\b") == 0 ); ensure( strcmp(CPLFormFilename("a\\", "b", nullptr), "a/b") == 0 || strcmp(CPLFormFilename("a\\", "b", nullptr), "a\\b") == 0 ); ensure_equals( CPLFormFilename(nullptr, "a", "b"), "a.b"); ensure_equals( CPLFormFilename(nullptr, "a", ".b"), "a.b"); ensure_equals( CPLFormFilename("/a", "..", nullptr), "/"); ensure_equals( CPLFormFilename("/a/", "..", nullptr), "/"); ensure_equals( CPLFormFilename("/a/b", "..", nullptr), "/a"); ensure_equals( CPLFormFilename("/a/b/", "..", nullptr), "/a"); ensure( EQUAL(CPLFormFilename("c:", "..", nullptr), "c:/..") || EQUAL(CPLFormFilename("c:", "..", nullptr), "c:\\..") ); ensure( EQUAL(CPLFormFilename("c:\\", "..", nullptr), "c:/..") || EQUAL(CPLFormFilename("c:\\", "..", nullptr), "c:\\..") ); ensure_equals( CPLFormFilename("c:\\a", "..", nullptr), "c:"); ensure_equals( CPLFormFilename("c:\\a\\", "..", nullptr), "c:"); ensure_equals( CPLFormFilename("c:\\a\\b", "..", nullptr), "c:\\a"); ensure_equals( CPLFormFilename("\\\\$\\c:\\a", "..", nullptr), "\\\\$\\c:"); ensure( EQUAL(CPLFormFilename("\\\\$\\c:", "..", nullptr), "\\\\$\\c:/..") || EQUAL(CPLFormFilename("\\\\$\\c:", "..", nullptr), "\\\\$\\c:\\..") ); } template<> template<> void object::test<13>() { ensure( VSIGetDiskFreeSpace("/vsimem/") > 0 ); ensure( VSIGetDiskFreeSpace(".") == -1 || VSIGetDiskFreeSpace(".") >= 0 ); } template<> template<> void object::test<14>() { double a, b, c; a = b = 0; ensure_equals( CPLsscanf("1 2", "%lf %lf", &a, &b), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); a = b = 0; ensure_equals( CPLsscanf("1\t2", "%lf %lf", &a, &b), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); a = b = 0; ensure_equals( CPLsscanf("1 2", "%lf\t%lf", &a, &b), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); a = b = 0; ensure_equals( CPLsscanf("1 2", "%lf %lf", &a, &b), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); a = b = 0; ensure_equals( CPLsscanf("1 2", "%lf %lf", &a, &b), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); a = b = c = 0; ensure_equals( CPLsscanf("1 2", "%lf %lf %lf", &a, &b, &c), 2 ); ensure_equals( a, 1.0 ); ensure_equals( b, 2.0 ); } template<> template<> void object::test<15>() { CPLString oldVal = CPLGetConfigOption("CPL_DEBUG", ""); CPLSetConfigOption("CPL_DEBUG", "TEST"); CPLErrorHandler oldHandler = CPLSetErrorHandler(myErrorHandler); gbGotError = false; CPLDebug("TEST", "Test"); ensure_equals( gbGotError, true ); gbGotError = false; CPLSetErrorHandler(oldHandler); CPLPushErrorHandler(myErrorHandler); gbGotError = false; CPLDebug("TEST", "Test"); ensure_equals( gbGotError, true ); gbGotError = false; CPLPopErrorHandler(); oldHandler = CPLSetErrorHandler(myErrorHandler); CPLSetCurrentErrorHandlerCatchDebug( FALSE ); gbGotError = false; CPLDebug("TEST", "Test"); ensure_equals( gbGotError, false ); gbGotError = false; CPLSetErrorHandler(oldHandler); CPLPushErrorHandler(myErrorHandler); CPLSetCurrentErrorHandlerCatchDebug( FALSE ); gbGotError = false; CPLDebug("TEST", "Test"); ensure_equals( gbGotError, false ); gbGotError = false; CPLPopErrorHandler(); CPLSetConfigOption("CPL_DEBUG", oldVal.size() ? oldVal.c_str() : nullptr); oldHandler = CPLSetErrorHandler(nullptr); CPLDebug("TEST", "Test"); CPLError(CE_Failure, CPLE_AppDefined, "test"); CPLErrorHandler newOldHandler = CPLSetErrorHandler(nullptr); ensure_equals(newOldHandler, static_cast(nullptr)); CPLDebug("TEST", "Test"); CPLError(CE_Failure, CPLE_AppDefined, "test"); CPLSetErrorHandler(oldHandler); } /************************************************************************/ /* CPLString::replaceAll() */ /************************************************************************/ template<> template<> void object::test<16>() { CPLString osTest; osTest = "foobarbarfoo"; osTest.replaceAll("bar", "was_bar"); ensure_equals( osTest, "foowas_barwas_barfoo" ); osTest = "foobarbarfoo"; osTest.replaceAll("X", "was_bar"); ensure_equals( osTest, "foobarbarfoo" ); osTest = "foobarbarfoo"; osTest.replaceAll("", "was_bar"); ensure_equals( osTest, "foobarbarfoo" ); osTest = "foobarbarfoo"; osTest.replaceAll("bar", ""); ensure_equals( osTest, "foofoo" ); osTest = "foobarbarfoo"; osTest.replaceAll('b', 'B'); ensure_equals( osTest, "fooBarBarfoo" ); osTest = "foobarbarfoo"; osTest.replaceAll('b', "B"); ensure_equals( osTest, "fooBarBarfoo" ); osTest = "foobarbarfoo"; osTest.replaceAll("b", 'B'); ensure_equals( osTest, "fooBarBarfoo" ); } /************************************************************************/ /* VSIMallocAligned() */ /************************************************************************/ template<> template<> void object::test<17>() { GByte* ptr = static_cast(VSIMallocAligned(sizeof(void*), 1)); ensure( ptr != nullptr ); ensure( ((size_t)ptr % sizeof(void*)) == 0 ); *ptr = 1; VSIFreeAligned(ptr); ptr = static_cast(VSIMallocAligned(16, 1)); ensure( ptr != nullptr ); ensure( ((size_t)ptr % 16) == 0 ); *ptr = 1; VSIFreeAligned(ptr); VSIFreeAligned(nullptr); #ifndef WIN32 // Illegal use of API. Returns non NULL on Windows ptr = static_cast(VSIMallocAligned(2, 1)); ensure( ptr == nullptr ); // Illegal use of API. Crashes on Windows ptr = static_cast(VSIMallocAligned(5, 1)); ensure( ptr == nullptr ); #endif if( !CSLTestBoolean(CPLGetConfigOption("SKIP_MEM_INTENSIVE_TEST", "NO")) ) { // The following tests will fail because such allocations cannot succeed #if SIZEOF_VOIDP == 8 ptr = static_cast(VSIMallocAligned(sizeof(void*), ~((size_t)0))); ensure( ptr == nullptr ); ptr = static_cast(VSIMallocAligned(sizeof(void*), (~((size_t)0)) - sizeof(void*))); ensure( ptr == nullptr ); #endif } } /************************************************************************/ /* CPLGetConfigOptions() / CPLSetConfigOptions() */ /************************************************************************/ template<> template<> void object::test<18>() { CPLSetConfigOption("FOOFOO", "BAR"); char** options = CPLGetConfigOptions(); ensure_equals (CSLFetchNameValue(options, "FOOFOO"), "BAR"); CPLSetConfigOptions(nullptr); ensure_equals (CPLGetConfigOption("FOOFOO", "i_dont_exist"), "i_dont_exist"); CPLSetConfigOptions(options); ensure_equals (CPLGetConfigOption("FOOFOO", "i_dont_exist"), "BAR"); CSLDestroy(options); } /************************************************************************/ /* CPLGetThreadLocalConfigOptions() / CPLSetThreadLocalConfigOptions() */ /************************************************************************/ template<> template<> void object::test<19>() { CPLSetThreadLocalConfigOption("FOOFOO", "BAR"); char** options = CPLGetThreadLocalConfigOptions(); ensure_equals (CSLFetchNameValue(options, "FOOFOO"), "BAR"); CPLSetThreadLocalConfigOptions(nullptr); ensure_equals (CPLGetThreadLocalConfigOption("FOOFOO", "i_dont_exist"), "i_dont_exist"); CPLSetThreadLocalConfigOptions(options); ensure_equals (CPLGetThreadLocalConfigOption("FOOFOO", "i_dont_exist"), "BAR"); CSLDestroy(options); } template<> template<> void object::test<20>() { ensure_equals ( CPLExpandTilde("/foo/bar"), "/foo/bar" ); CPLSetConfigOption("HOME", "/foo"); ensure ( EQUAL(CPLExpandTilde("~/bar"), "/foo/bar") || EQUAL(CPLExpandTilde("~/bar"), "/foo\\bar") ); CPLSetConfigOption("HOME", nullptr); } template<> template<> void object::test<21>() { // CPLString(std::string) constructor ensure_equals ( CPLString(std::string("abc")).c_str(), "abc" ); // CPLString(const char*) constructor ensure_equals ( CPLString("abc").c_str(), "abc" ); // CPLString(const char*, n) constructor ensure_equals ( CPLString("abc",1).c_str(), "a" ); } template<> template<> void object::test<22>() { // NOTE: Assumes cpl_error.cpp defines DEFAULT_LAST_ERR_MSG_SIZE=500 char pszMsg[] = "0abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "1abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "2abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "3abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "4abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "5abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "6abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "7abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "8abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" "9abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" // 500 "0abcdefghijklmnopqrstuvwxyz0123456789!@#$%&*()_+=|" // 550 ; CPLErrorReset(); CPLErrorSetState(CE_Warning, 1, pszMsg); ensure_equals(strlen(pszMsg) - 50 - 1, // length - 50 - 1 (null-terminator) strlen(CPLGetLastErrorMsg())); // DEFAULT_LAST_ERR_MSG_SIZE - 1 } template<> template<> void object::test<23>() { char* pszText = CPLUnescapeString("<>&'"???", nullptr, CPLES_XML); ensure_equals( CPLString(pszText), "<>&'\"???"); CPLFree(pszText); // Integer overflow pszText = CPLUnescapeString("&10000000000000000;", nullptr, CPLES_XML); // We do not really care about the return value CPLFree(pszText); // Integer overflow pszText = CPLUnescapeString("�", nullptr, CPLES_XML); // We do not really care about the return value CPLFree(pszText); // Error case pszText = CPLUnescapeString("&foo", nullptr, CPLES_XML); ensure_equals( CPLString(pszText), ""); CPLFree(pszText); // Error case pszText = CPLUnescapeString("&#x", nullptr, CPLES_XML); ensure_equals( CPLString(pszText), ""); CPLFree(pszText); // Error case pszText = CPLUnescapeString("&#", nullptr, CPLES_XML); ensure_equals( CPLString(pszText), ""); CPLFree(pszText); } template<> template<> void object::test<24>() { // No longer used } // Test signed int safe maths template<> template<> void object::test<25>() { ensure_equals( (CPLSM(-2) + CPLSM(3)).v(), 1 ); ensure_equals( (CPLSM(-2) + CPLSM(1)).v(), -1 ); ensure_equals( (CPLSM(-2) + CPLSM(-1)).v(), -3 ); ensure_equals( (CPLSM(2) + CPLSM(-3)).v(), -1 ); ensure_equals( (CPLSM(2) + CPLSM(-1)).v(), 1 ); ensure_equals( (CPLSM(2) + CPLSM(1)).v(), 3 ); ensure_equals( (CPLSM(INT_MAX-1) + CPLSM(1)).v(), INT_MAX ); ensure_equals( (CPLSM(1) + CPLSM(INT_MAX-1)).v(), INT_MAX ); ensure_equals( (CPLSM(INT_MAX) + CPLSM(-1)).v(), INT_MAX - 1 ); ensure_equals( (CPLSM(-1) + CPLSM(INT_MAX)).v(), INT_MAX - 1 ); ensure_equals( (CPLSM(INT_MIN+1) + CPLSM(-1)).v(), INT_MIN ); ensure_equals( (CPLSM(-1) + CPLSM(INT_MIN+1)).v(), INT_MIN ); try { (CPLSM(INT_MAX) + CPLSM(1)).v(); ensure(false); } catch (...) {} try { (CPLSM(1) + CPLSM(INT_MAX)).v(); ensure(false); } catch (...) {} try { (CPLSM(INT_MIN) + CPLSM(-1)).v(); ensure(false); } catch (...) {} try { (CPLSM(-1) + CPLSM(INT_MIN)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(-2) - CPLSM(1)).v(), -3 ); ensure_equals( (CPLSM(-2) - CPLSM(-1)).v(), -1 ); ensure_equals( (CPLSM(-2) - CPLSM(-3)).v(), 1 ); ensure_equals( (CPLSM(2) - CPLSM(-1)).v(), 3 ); ensure_equals( (CPLSM(2) - CPLSM(1)).v(), 1 ); ensure_equals( (CPLSM(2) - CPLSM(3)).v(), -1 ); ensure_equals( (CPLSM(INT_MAX) - CPLSM(1)).v(), INT_MAX - 1 ); ensure_equals( (CPLSM(INT_MIN+1) - CPLSM(1)).v(), INT_MIN ); ensure_equals( (CPLSM(0) - CPLSM(INT_MIN+1)).v(), INT_MAX ); ensure_equals( (CPLSM(0) - CPLSM(INT_MAX)).v(), -INT_MAX ); try { (CPLSM(INT_MIN) - CPLSM(1)).v(); ensure(false); } catch (...) {} try { (CPLSM(0) - CPLSM(INT_MIN)).v(); ensure(false); } catch (...) {} try { (CPLSM(INT_MIN) - CPLSM(1)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(INT_MIN+1) * CPLSM(-1)).v(), INT_MAX ); ensure_equals( (CPLSM(-1) * CPLSM(INT_MIN+1)).v(), INT_MAX ); ensure_equals( (CPLSM(INT_MIN) * CPLSM(1)).v(), INT_MIN ); ensure_equals( (CPLSM(1) * CPLSM(INT_MIN)).v(), INT_MIN ); ensure_equals( (CPLSM(1) * CPLSM(INT_MAX)).v(), INT_MAX ); ensure_equals( (CPLSM(INT_MIN/2) * CPLSM(2)).v(), INT_MIN ); ensure_equals( (CPLSM(INT_MAX/2) * CPLSM(2)).v(), INT_MAX-1 ); ensure_equals( (CPLSM(INT_MAX/2+1) * CPLSM(-2)).v(), INT_MIN ); ensure_equals( (CPLSM(0) * CPLSM(INT_MIN)).v(), 0 ); ensure_equals( (CPLSM(INT_MIN) * CPLSM(0)).v(), 0 ); ensure_equals( (CPLSM(0) * CPLSM(INT_MAX)).v(), 0 ); ensure_equals( (CPLSM(INT_MAX) * CPLSM(0)).v(), 0 ); try { (CPLSM(INT_MAX/2+1) * CPLSM(2)).v(); ensure(false); } catch (...) {} try { (CPLSM(2) * CPLSM(INT_MAX/2+1)).v(); ensure(false); } catch (...) {} try { (CPLSM(INT_MIN) * CPLSM(-1)).v(); ensure(false); } catch (...) {} try { (CPLSM(INT_MIN) * CPLSM(2)).v(); ensure(false); } catch (...) {} try { (CPLSM(2) * CPLSM(INT_MIN)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(4) / CPLSM(2)).v(), 2 ); ensure_equals( (CPLSM(4) / CPLSM(-2)).v(), -2 ); ensure_equals( (CPLSM(-4) / CPLSM(2)).v(), -2 ); ensure_equals( (CPLSM(-4) / CPLSM(-2)).v(), 2 ); ensure_equals( (CPLSM(0) / CPLSM(2)).v(), 0 ); ensure_equals( (CPLSM(0) / CPLSM(-2)).v(), 0 ); ensure_equals( (CPLSM(INT_MAX) / CPLSM(1)).v(), INT_MAX ); ensure_equals( (CPLSM(INT_MAX) / CPLSM(-1)).v(), -INT_MAX ); ensure_equals( (CPLSM(INT_MIN) / CPLSM(1)).v(), INT_MIN ); try { (CPLSM(-1) * CPLSM(INT_MIN)).v(); ensure(false); } catch (...) {} try { (CPLSM(INT_MIN) / CPLSM(-1)).v(); ensure(false); } catch (...) {} try { (CPLSM(1) / CPLSM(0)).v(); ensure(false); } catch (...) {} ensure_equals( CPLSM_TO_UNSIGNED(1).v(), 1U ); try { CPLSM_TO_UNSIGNED(-1); ensure(false); } catch (...) {} } // Test unsigned int safe maths template<> template<> void object::test<26>() { ensure_equals( (CPLSM(2U) + CPLSM(3U)).v(), 5U ); ensure_equals( (CPLSM(UINT_MAX-1) + CPLSM(1U)).v(), UINT_MAX ); try { (CPLSM(UINT_MAX) + CPLSM(1U)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(4U) - CPLSM(3U)).v(), 1U ); ensure_equals( (CPLSM(4U) - CPLSM(4U)).v(), 0U ); ensure_equals( (CPLSM(UINT_MAX) - CPLSM(1U)).v(), UINT_MAX-1 ); try { (CPLSM(4U) - CPLSM(5U)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(0U) * CPLSM(UINT_MAX)).v(), 0U ); ensure_equals( (CPLSM(UINT_MAX) * CPLSM(0U)).v(), 0U ); ensure_equals( (CPLSM(UINT_MAX) * CPLSM(1U)).v(), UINT_MAX ); ensure_equals( (CPLSM(1U) * CPLSM(UINT_MAX)).v(), UINT_MAX ); try { (CPLSM(UINT_MAX) * CPLSM(2U)).v(); ensure(false); } catch (...) {} try { (CPLSM(2U) * CPLSM(UINT_MAX)).v(); ensure(false); } catch (...) {} ensure_equals( (CPLSM(4U) / CPLSM(2U)).v(), 2U ); ensure_equals( (CPLSM(UINT_MAX) / CPLSM(1U)).v(), UINT_MAX ); try { (CPLSM(1U) / CPLSM(0U)).v(); ensure(false); } catch (...) {} } // Test CPLParseRFC822DateTime() template<> template<> void object::test<27>() { int year, month, day, hour, min, sec, tz, weekday; ensure( !CPLParseRFC822DateTime("", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure_equals( CPLParseRFC822DateTime("Thu, 15 Jan 2017 12:34:56 +0015", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), TRUE ); ensure_equals( CPLParseRFC822DateTime("Thu, 15 Jan 2017 12:34:56 +0015", &year, &month, &day, &hour, &min, &sec, &tz, &weekday), TRUE ); ensure_equals( year, 2017 ); ensure_equals( month, 1 ); ensure_equals( day, 15 ); ensure_equals( hour, 12 ); ensure_equals( min, 34 ); ensure_equals( sec, 56 ); ensure_equals( tz, 101 ); ensure_equals( weekday, 4 ); ensure_equals( CPLParseRFC822DateTime("Thu, 15 Jan 2017 12:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday), TRUE ); ensure_equals( year, 2017 ); ensure_equals( month, 1 ); ensure_equals( day, 15 ); ensure_equals( hour, 12 ); ensure_equals( min, 34 ); ensure_equals( sec, 56 ); ensure_equals( tz, 100 ); ensure_equals( weekday, 4 ); // Without day of week, second and timezone ensure_equals( CPLParseRFC822DateTime("15 Jan 2017 12:34", &year, &month, &day, &hour, &min, &sec, &tz, &weekday), TRUE ); ensure_equals( year, 2017 ); ensure_equals( month, 1 ); ensure_equals( day, 15 ); ensure_equals( hour, 12 ); ensure_equals( min, 34 ); ensure_equals( sec, -1 ); ensure_equals( tz, 0 ); ensure_equals( weekday, 0 ); ensure_equals( CPLParseRFC822DateTime("XXX, 15 Jan 2017 12:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday), TRUE ); ensure_equals( weekday, 0 ); ensure( !CPLParseRFC822DateTime("Sun, 01 Jan 2017 12", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("00 Jan 2017 12:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("32 Jan 2017 12:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 XXX 2017 12:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 -1:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 24:34:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 12:-1:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 12:60:56 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 12:34:-1 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("01 Jan 2017 12:34:61 GMT", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("15 Jan 2017 12:34:56 XXX", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("15 Jan 2017 12:34:56 +-100", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); ensure( !CPLParseRFC822DateTime("15 Jan 2017 12:34:56 +9900", &year, &month, &day, &hour, &min, &sec, &tz, &weekday) ); } // Test CPLCopyTree() template<> template<> void object::test<28>() { CPLString osTmpPath(CPLGetDirname(CPLGenerateTempFilename(nullptr))); CPLString osSrcDir(CPLFormFilename(osTmpPath, "src_dir", nullptr)); CPLString osNewDir(CPLFormFilename(osTmpPath, "new_dir", nullptr)); ensure( VSIMkdir(osSrcDir, 0755) == 0 ); CPLString osSrcFile(CPLFormFilename(osSrcDir, "my.bin", nullptr)); VSILFILE* fp = VSIFOpenL(osSrcFile, "wb"); ensure( fp != nullptr ); VSIFCloseL(fp); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( CPLCopyTree(osNewDir, "/i/do_not/exist") < 0 ); CPLPopErrorHandler(); ensure( CPLCopyTree(osNewDir, osSrcDir) == 0 ); VSIStatBufL sStat; CPLString osNewFile(CPLFormFilename(osNewDir, "my.bin", nullptr)); ensure( VSIStatL(osNewFile, &sStat) == 0 ); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( CPLCopyTree(osNewDir, osSrcDir) < 0 ); CPLPopErrorHandler(); VSIUnlink( osNewFile ); VSIRmdir( osNewDir ); VSIUnlink( osSrcFile ); VSIRmdir( osSrcDir ); } class CPLJSonStreamingParserDump: public CPLJSonStreamingParser { std::vector m_abFirstMember; CPLString m_osSerialized; CPLString m_osException; public: CPLJSonStreamingParserDump() {} virtual void Reset() CPL_OVERRIDE { m_osSerialized.clear(); m_osException.clear(); CPLJSonStreamingParser::Reset(); } virtual void String(const char* pszValue, size_t) CPL_OVERRIDE; virtual void Number(const char* pszValue, size_t) CPL_OVERRIDE; virtual void Boolean(bool bVal) CPL_OVERRIDE; virtual void Null() CPL_OVERRIDE; virtual void StartObject() CPL_OVERRIDE; virtual void EndObject() CPL_OVERRIDE; virtual void StartObjectMember(const char* pszKey, size_t) CPL_OVERRIDE; virtual void StartArray() CPL_OVERRIDE; virtual void EndArray() CPL_OVERRIDE; virtual void StartArrayMember() CPL_OVERRIDE; virtual void Exception(const char* pszMessage) CPL_OVERRIDE; const CPLString& GetSerialized() const { return m_osSerialized; } const CPLString& GetException() const { return m_osException; } }; void CPLJSonStreamingParserDump::StartObject() { m_osSerialized += "{"; m_abFirstMember.push_back(true); } void CPLJSonStreamingParserDump::EndObject() { m_osSerialized += "}"; m_abFirstMember.pop_back(); } void CPLJSonStreamingParserDump::StartObjectMember(const char* pszKey, size_t) { if( !m_abFirstMember.back() ) m_osSerialized += ", "; m_osSerialized += CPLSPrintf("\"%s\": ", pszKey); m_abFirstMember.back() = false; } void CPLJSonStreamingParserDump::String(const char* pszValue, size_t) { m_osSerialized += GetSerializedString(pszValue); } void CPLJSonStreamingParserDump::Number(const char* pszValue, size_t) { m_osSerialized += pszValue; } void CPLJSonStreamingParserDump::Boolean(bool bVal) { m_osSerialized += bVal ? "true" : "false"; } void CPLJSonStreamingParserDump::Null() { m_osSerialized += "null"; } void CPLJSonStreamingParserDump::StartArray() { m_osSerialized += "["; m_abFirstMember.push_back(true); } void CPLJSonStreamingParserDump::EndArray() { m_osSerialized += "]"; m_abFirstMember.pop_back(); } void CPLJSonStreamingParserDump::StartArrayMember() { if( !m_abFirstMember.back() ) m_osSerialized += ", "; m_abFirstMember.back() = false; } void CPLJSonStreamingParserDump::Exception(const char* pszMessage) { m_osException = pszMessage; } // Test CPLJSonStreamingParser() template<> template<> void object::test<29>() { // nominal cases { CPLJSonStreamingParserDump oParser; const char sText[] = "true"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "false"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "null"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "10"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "123eE-34"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\\\a\\b\\f\\n\\r\\t\\u0020\\u0001\\\"\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "\"\\\\a\\b\\f\\n\\r\\t \\u0001\\\"\"" ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), "\"\\\\a\\b\\f\\n\\r\\t \\u0001\\\"\"" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\u0001\\u0020\\ud834\\uDD1E\\uDD1E\\uD834\\uD834\\uD834\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "\"\\u0001 \xf0\x9d\x84\x9e\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\"" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\ud834\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "\"\xef\xbf\xbd\"" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\ud834\\t\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "\"\xef\xbf\xbd\\t\"" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\u00e9\""; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "\"\xc3\xa9\"" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{}"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[]"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[[]]"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[1]"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[1,2]"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "[1, 2]" ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), "[1, 2]" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{\"a\":null}"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), "{\"a\": null}" ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), "{\"a\": null}" ); } { CPLJSonStreamingParserDump oParser; const char sText[] = " { \"a\" : null ,\r\n\t\"b\": {\"c\": 1}, \"d\": [1] }"; ensure( oParser.Parse( sText, strlen(sText), true ) ); const char sExpected[] = "{\"a\": null, \"b\": {\"c\": 1}, \"d\": [1]}"; ensure_equals( oParser.GetSerialized(), sExpected ); oParser.Reset(); ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sExpected ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sExpected ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "infinity"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "-infinity"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "nan"; ensure( oParser.Parse( sText, strlen(sText), true ) ); ensure_equals( oParser.GetSerialized(), sText ); oParser.Reset(); for( size_t i = 0; sText[i]; i++ ) ensure( oParser.Parse( sText + i, 1, sText[i+1] == 0 ) ); ensure_equals( oParser.GetSerialized(), sText ); } // errors { CPLJSonStreamingParserDump oParser; const char sText[] = "tru"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "tru1"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "truxe"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "truex"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "fals"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "falsxe"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "falsex"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "nul"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "nulxl"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "nullx"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "na"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "nanx"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "infinit"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "infinityx"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "-infinit"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "-infinityx"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "true false"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "x"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "}"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "["; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[1"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[,"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[|"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "]"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ :"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ ,"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ |"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ 1"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\""; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\": "; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\": 1 2"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\", "; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\" }"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{\"a\" x}"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "1x"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\""; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\x\""; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\u"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\ux"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\u000"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\uD834\\ux\""; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"\\\""; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "\"too long\""; oParser.SetMaxStringSize(2); ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[[]]"; oParser.SetMaxDepth(1); ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "{ \"x\": {} }"; oParser.SetMaxDepth(1); ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[,]"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[true,]"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[true,,true]"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } { CPLJSonStreamingParserDump oParser; const char sText[] = "[true true]"; ensure( !oParser.Parse( sText, strlen(sText), true ) ); ensure( !oParser.GetException().empty() ); } } // Test cpl_mem_cache template<> template<> void object::test<30>() { lru11::Cache cache(2,1); ensure_equals( cache.size(), 0U ); ensure( cache.empty() ); cache.clear(); int val; ensure( !cache.tryGet(0, val) ); try { cache.get(0); ensure( false ); } catch( const lru11::KeyNotFound& ) { ensure( true ); } ensure( !cache.remove(0) ); ensure( !cache.contains(0) ); ensure_equals( cache.getMaxSize(), 2U ); ensure_equals( cache.getElasticity(), 1U ); ensure_equals( cache.getMaxAllowedSize(), 3U ); cache.insert(0, 1); val = 0; ensure( cache.tryGet(0, val) ); ensure_equals( val, 1 ); ensure_equals( cache.get(0), 1 ); ensure_equals( cache.getCopy(0), 1); ensure_equals( cache.size(), 1U ); ensure( !cache.empty() ); ensure( cache.contains(0) ); bool visited = false; auto lambda = [&visited] (const lru11::KeyValuePair& kv) { if(kv.key == 0 && kv.value == 1) visited = true; }; cache.cwalk( lambda ); ensure( visited) ; cache.insert(0, 2); ensure_equals( cache.get(0), 2 ); ensure_equals( cache.size(), 1U ); cache.insert(1, 3); cache.insert(2, 4); ensure_equals( cache.size(), 3U ); cache.insert(3, 5); ensure_equals( cache.size(), 2U ); ensure( cache.contains(2) ); ensure( cache.contains(3) ); ensure( !cache.contains(0) ); ensure( !cache.contains(1) ); ensure( cache.remove(2) ); ensure( !cache.contains(2) ); ensure_equals( cache.size(), 1U ); } // Test CPLJSONDocument template<> template<> void object::test<31>() { { // Test Json document LoadUrl CPLJSONDocument oDocument; const char *options[5] = { "CONNECTTIMEOUT=15", "TIMEOUT=20", "MAX_RETRY=5", "RETRY_DELAY=1", nullptr }; oDocument.GetRoot().Add("foo", "bar"); if( CPLHTTPEnabled() ) { CPLSetConfigOption("CPL_CURL_ENABLE_VSIMEM", "YES"); VSILFILE* fpTmp = VSIFOpenL("/vsimem/test.json", "wb"); const char* pszContent = "{ \"foo\": \"bar\" }"; VSIFWriteL(pszContent, 1, strlen(pszContent), fpTmp); VSIFCloseL(fpTmp); ensure( oDocument.LoadUrl( "/vsimem/test.json", const_cast(options) ) ); CPLSetConfigOption("CPL_CURL_ENABLE_VSIMEM", nullptr); VSIUnlink("/vsimem/test.json"); CPLJSONObject oJsonRoot = oDocument.GetRoot(); ensure( oJsonRoot.IsValid() ); CPLString value = oJsonRoot.GetString("foo", ""); ensure_not( EQUAL(value, "bar") ); } } { // Test Json document LoadChunks CPLJSONDocument oDocument; CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !oDocument.LoadChunks("/i_do/not/exist", 512) ); CPLPopErrorHandler(); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !oDocument.LoadChunks("test_cpl.cpp", 512) ); CPLPopErrorHandler(); oDocument.GetRoot().Add("foo", "bar"); ensure( oDocument.LoadChunks((data_ + SEP + "test.json").c_str(), 512) ); CPLJSONObject oJsonRoot = oDocument.GetRoot(); ensure( oJsonRoot.IsValid() ); ensure_equals( oJsonRoot.GetInteger("resource/id", 10), 0 ); CPLJSONObject oJsonResource = oJsonRoot.GetObj("resource"); ensure( oJsonResource.IsValid() ); std::vector children = oJsonResource.GetChildren(); ensure(children.size() == 11); CPLJSONArray oaScopes = oJsonRoot.GetArray("resource/scopes"); ensure( oaScopes.IsValid() ); ensure_equals( oaScopes.Size(), 2); CPLJSONObject oHasChildren = oJsonRoot.GetObj("resource/children"); ensure( oHasChildren.IsValid() ); ensure_equals( oHasChildren.ToBool(), true ); ensure_equals( oJsonResource.GetBool( "children", false ), true ); CPLJSONObject oJsonId = oJsonRoot["resource/owner_user/id"]; ensure( oJsonId.IsValid() ); } { CPLJSONDocument oDocument; ensure( !oDocument.LoadMemory(nullptr, 0) ); ensure( !oDocument.LoadMemory(CPLString()) ); } { // Copy constructor CPLJSONDocument oDocument; CPLJSONDocument oDocument2(oDocument); CPLJSONObject oObj; CPLJSONObject oObj2(oObj); // Assignment operator oDocument2 = oDocument; auto& oDocument2Ref(oDocument2); oDocument2 = oDocument2Ref; oObj2 = oObj; auto& oObj2Ref(oObj2); oObj2 = oObj2Ref; } { // Save CPLJSONDocument oDocument; CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !oDocument.Save("/i_do/not/exist") ); CPLPopErrorHandler(); } { CPLJSONObject oObj; oObj.Add("string", std::string("my_string")); ensure_equals( oObj.GetString("string"), std::string("my_string")); ensure_equals( oObj.GetString("inexisting_string", "default"), std::string("default")); oObj.Add("const_char_star", nullptr); oObj.Add("const_char_star", "my_const_char_star"); ensure_equals( oObj.GetObj("const_char_star").GetType(), CPLJSONObject::String ); oObj.Add("int", 1); ensure_equals( oObj.GetInteger("int"), 1 ); ensure_equals( oObj.GetInteger("inexisting_int", -987), -987 ); ensure_equals( oObj.GetObj("int").GetType(), CPLJSONObject::Integer ); oObj.Add("int64", GINT64_MAX); ensure_equals( oObj.GetLong("int64"), GINT64_MAX ); ensure_equals( oObj.GetLong("inexisting_int64", GINT64_MIN), GINT64_MIN ); ensure_equals( oObj.GetObj("int64").GetType(), CPLJSONObject::Integer ); oObj.Add("double", 1.25); ensure_equals( oObj.GetDouble("double"), 1.25 ); ensure_equals( oObj.GetDouble("inexisting_double", -987.0), -987.0 ); ensure_equals( oObj.GetObj("double").GetType(), CPLJSONObject::Double ); oObj.Add("array", CPLJSONArray()); ensure_equals( oObj.GetObj("array").GetType(), CPLJSONObject::Array ); oObj.Add("obj", CPLJSONObject()); ensure_equals( oObj.GetObj("obj").GetType(), CPLJSONObject::Object ); oObj.Add("bool", true); ensure_equals( oObj.GetBool("bool"), true ); ensure_equals( oObj.GetBool("inexisting_bool", false), false ); ensure_equals( oObj.GetObj("bool").GetType(), CPLJSONObject::Boolean ); oObj.AddNull("null_field"); //ensure_equals( oObj.GetObj("null_field").GetType(), CPLJSONObject::Null ); ensure_equals( oObj.GetObj("inexisting").GetType(), CPLJSONObject::Unknown ); oObj.Set("string", std::string("my_string")); oObj.Set("const_char_star", nullptr); oObj.Set("const_char_star", "my_const_char_star"); oObj.Set("int", 1); oObj.Set("int64", GINT64_MAX); oObj.Set("double", 1.25); //oObj.Set("array", CPLJSONArray()); //oObj.Set("obj", CPLJSONObject()); oObj.Set("bool", true); oObj.SetNull("null_field"); ensure( CPLJSONArray().GetChildren().empty() ); oObj.ToArray(); ensure_equals( CPLJSONObject().Format(CPLJSONObject::PrettyFormat::Spaced), std::string("{ }") ); ensure_equals( CPLJSONObject().Format(CPLJSONObject::PrettyFormat::Pretty), std::string("{\n}") ); ensure_equals( CPLJSONObject().Format(CPLJSONObject::PrettyFormat::Plain), std::string("{}") ); } { CPLJSONArray oArrayConstructorString(std::string("foo")); CPLJSONArray oArray; oArray.Add(CPLJSONObject()); oArray.Add(std::string("str")); oArray.Add("const_char_star"); oArray.Add(1.25); oArray.Add(1); oArray.Add(GINT64_MAX); oArray.Add(true); ensure_equals(oArray.Size(), 7); } { CPLJSONDocument oDocument; ensure( oDocument.LoadMemory(CPLString("{ \"/foo\" : \"bar\" }")) ); ensure_equals( oDocument.GetRoot().GetString("/foo"), std::string("bar") ); } } // Test CPLRecodeIconv() with re-allocation template<> template<> void object::test<32>() { #ifdef CPL_RECODE_ICONV int N = 32800; char* pszIn = static_cast(CPLMalloc(N + 1)); for(int i=0;i(CPLMalloc(N * 2 + 1)); for(int i=0;i template<> void object::test<33>() { CPLHTTPResult* psResult; psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Missing boundary value psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary="); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // No content psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // No part psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Missing end boundary psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "\r\n" "Bla"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Truncated header psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "Content-Type: foo"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Invalid end boundary psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "\r\n" "Bla" "\r\n" "--myboundary"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Invalid end boundary psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "\r\n" "Bla" "\r\n" "--myboundary"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } CPLPushErrorHandler(CPLQuietErrorHandler); ensure( !CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLPopErrorHandler(); CPLHTTPDestroyResult(psResult); // Valid single part, no header psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "\r\n" "Bla" "\r\n" "--myboundary--\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); ensure_equals( psResult->nMimePartCount, 1 ); ensure_equals( psResult->pasMimePart[0].papszHeaders, static_cast(nullptr) ); ensure_equals( psResult->pasMimePart[0].nDataLen, 3 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[0].pabyData), "Bla", 3) == 0 ); ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLHTTPDestroyResult(psResult); // Valid single part, with header psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "Content-Type: bla\r\n" "\r\n" "Bla" "\r\n" "--myboundary--\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); ensure_equals( psResult->nMimePartCount, 1 ); ensure_equals( CSLCount(psResult->pasMimePart[0].papszHeaders), 1 ); ensure_equals( CPLString(psResult->pasMimePart[0].papszHeaders[0]), CPLString("Content-Type=bla") ); ensure_equals( psResult->pasMimePart[0].nDataLen, 3 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[0].pabyData), "Bla", 3) == 0 ); ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLHTTPDestroyResult(psResult); // Valid single part, 2 headers psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "Content-Type: bla\r\n" "Content-Disposition: bar\r\n" "\r\n" "Bla" "\r\n" "--myboundary--\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); ensure_equals( psResult->nMimePartCount, 1 ); ensure_equals( CSLCount(psResult->pasMimePart[0].papszHeaders), 2 ); ensure_equals( CPLString(psResult->pasMimePart[0].papszHeaders[0]), CPLString("Content-Type=bla") ); ensure_equals( CPLString(psResult->pasMimePart[0].papszHeaders[1]), CPLString("Content-Disposition=bar") ); ensure_equals( psResult->pasMimePart[0].nDataLen, 3 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[0].pabyData), "Bla", 3) == 0 ); ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLHTTPDestroyResult(psResult); // Single part, but with header without extra terminating \r\n // (invalid normally, but apparently necessary for some ArcGIS WCS implementations) psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "Content-Type: bla\r\n" "Bla" "\r\n" "--myboundary--\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); ensure_equals( psResult->nMimePartCount, 1 ); ensure_equals( CPLString(psResult->pasMimePart[0].papszHeaders[0]), CPLString("Content-Type=bla") ); ensure_equals( psResult->pasMimePart[0].nDataLen, 3 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[0].pabyData), "Bla", 3) == 0 ); ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLHTTPDestroyResult(psResult); // Valid 2 parts, no header psResult = static_cast(CPLCalloc(1, sizeof(CPLHTTPResult))); psResult->pszContentType = CPLStrdup("multipart/form-data; boundary=myboundary"); { const char* pszText = "--myboundary some junk\r\n" "\r\n" "Bla" "\r\n" "--myboundary\r\n" "\r\n" "second part" "\r\n" "--myboundary--\r\n"; psResult->pabyData = reinterpret_cast(CPLStrdup(pszText)); psResult->nDataLen = static_cast(strlen(pszText)); } ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); ensure_equals( psResult->nMimePartCount, 2 ); ensure_equals( psResult->pasMimePart[0].papszHeaders, static_cast(nullptr) ); ensure_equals( psResult->pasMimePart[0].nDataLen, 3 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[0].pabyData), "Bla", 3) == 0 ); ensure_equals( psResult->pasMimePart[1].nDataLen, 11 ); ensure( strncmp(reinterpret_cast(psResult->pasMimePart[1].pabyData), "second part", 11) == 0 ); ensure( CPL_TO_BOOL(CPLHTTPParseMultipartMime(psResult)) ); CPLHTTPDestroyResult(psResult); } // Test cpl::down_cast template<> template<> void object::test<34>() { struct Base{ virtual ~Base() {} }; struct Derived: public Base {}; Base b; Derived d; Base* p_b_d = &d; #ifdef wont_compile struct OtherBase {}; OtherBase ob; ensure_equals(cpl::down_cast(p_b_d), &ob); #endif #ifdef compile_with_warning ensure_equals(cpl::down_cast(p_b_d), p_b_d); #endif ensure_equals(cpl::down_cast(p_b_d), &d); ensure_equals(cpl::down_cast(static_cast(nullptr)), static_cast(nullptr)); } // Test CPLPrintTime() in particular case of RFC822 formatting in C locale template<> template<> void object::test<35>() { char szDate[64]; struct tm tm; tm.tm_sec = 56; tm.tm_min = 34; tm.tm_hour = 12; tm.tm_mday = 20; tm.tm_mon = 6-1; tm.tm_year = 2018 - 1900; tm.tm_wday = 3; // Wednesday tm.tm_yday = 0; // unused tm.tm_isdst = 0; // unused int nRet = CPLPrintTime(szDate, sizeof(szDate)-1, "%a, %d %b %Y %H:%M:%S GMT", &tm, "C"); szDate[nRet] = 0; ensure_equals( std::string(szDate), std::string("Wed, 20 Jun 2018 12:34:56 GMT") ); } // Test CPLAutoClose template<> template<> void object::test<36>() { static int counter = 0; class AutoCloseTest{ public: AutoCloseTest() { counter += 222; } virtual ~AutoCloseTest() { counter -= 22; } static AutoCloseTest* Create() { return new AutoCloseTest; } static void Destroy(AutoCloseTest* p) { delete p; } }; { AutoCloseTest* p1 = AutoCloseTest::Create(); CPL_AUTO_CLOSE_WARP(p1,AutoCloseTest::Destroy); AutoCloseTest* p2 = AutoCloseTest::Create(); CPL_AUTO_CLOSE_WARP(p2,AutoCloseTest::Destroy); } ensure_equals(counter,400); } // Test cpl_minixml template<> template<> void object::test<37>() { CPLXMLNode* psRoot = CPLCreateXMLNode(nullptr, CXT_Element, "Root"); CPLXMLNode* psElt = CPLCreateXMLElementAndValue(psRoot, "Elt", "value"); CPLAddXMLAttributeAndValue(psElt, "attr1", "val1"); CPLAddXMLAttributeAndValue(psElt, "attr2", "val2"); char* str = CPLSerializeXMLTree(psRoot); CPLDestroyXMLNode(psRoot); ensure_equals( std::string(str), std::string("\n value\n\n") ); CPLFree(str); } // Test CPLCharUniquePtr template<> template<> void object::test<38>() { CPLCharUniquePtr x; ensure( x.get() == nullptr ); x.reset(CPLStrdup("foo")); ensure_equals( std::string(x.get()), "foo"); } } // namespace tut gdalautotest-3.0.4/cpp/test_osr_ct.cpp0000644003401500001440000001375513614005370017460 0ustar rouaultusers/////////////////////////////////////////////////////////////////////////////// // // Project: C++ Test Suite for GDAL/OGR // Purpose: Test coordinate transformations. Ported from osr/osr_ct.py. // Author: Mateusz Loskot // /////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2006, Mateusz Loskot // // 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. /////////////////////////////////////////////////////////////////////////////// #include "gdal_unit_test.h" #include "cpl_conv.h" #include "cpl_error.h" #include "ogr_api.h" #include "ogr_srs_api.h" #include #include #include namespace tut { // Common fixture with test data struct test_osr_ct_data { OGRErr err_; OGRSpatialReferenceH srs_utm_; OGRSpatialReferenceH srs_ll_; OGRCoordinateTransformationH ct_; test_osr_ct_data() : err_(OGRERR_NONE), srs_utm_(nullptr), srs_ll_(nullptr), ct_(nullptr) { srs_utm_ = OSRNewSpatialReference(nullptr); srs_ll_ = OSRNewSpatialReference(nullptr); OSRSetAxisMappingStrategy(srs_utm_, OAMS_TRADITIONAL_GIS_ORDER); OSRSetAxisMappingStrategy(srs_ll_, OAMS_TRADITIONAL_GIS_ORDER); } ~test_osr_ct_data() { OSRDestroySpatialReference(srs_utm_); OSRDestroySpatialReference(srs_ll_); OCTDestroyCoordinateTransformation(ct_); } }; // Register test group typedef test_group group; typedef group::object object; group test_osr_ct_group("OSR::CT"); // Verify that we have PROJ.4 available template<> template<> void object::test<1>() { ensure("SRS UTM handle is NULL", nullptr != srs_utm_); ensure("SRS LL handle is NULL", nullptr != srs_ll_); err_ = OSRSetUTM(srs_utm_, 11, TRUE); ensure_equals("Can't set UTM zone", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_utm_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_ll_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); ct_ = OCTNewCoordinateTransformation(srs_ll_, srs_utm_); ensure("PROJ.4 missing, transforms not available", nullptr != ct_); } // Actually perform a simple LL to UTM conversion template<> template<> void object::test<2>() { ensure("SRS UTM handle is NULL", nullptr != srs_utm_); ensure("SRS LL handle is NULL", nullptr != srs_ll_); err_ = OSRSetUTM(srs_utm_, 11, TRUE); ensure_equals("Can't set UTM zone", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_utm_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_ll_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); ct_ = OCTNewCoordinateTransformation(srs_ll_, srs_utm_); ensure("PROJ.4 missing, transforms not available", nullptr != ct_); const int size = 1; double x[size] = { -117.5 }; double y[size] = { 32.0 }; double z[size] = { 0.0 }; ensure_equals("OCTTransform() failed", OCTTransform(ct_, size, x, y, z), TRUE); ensure("Wrong X from LL to UTM result", std::fabs(x[0] - 452772.06) <= 0.01); ensure("Wrong Y from LL to UTM result", std::fabs(y[0] - 3540544.89) <= 0.01); ensure("Wrong Z from LL to UTM result", std::fabs(z[0] - 0.0) <= 0.01); } // Transform an OGR geometry. // This is mostly aimed at ensuring that the OGRCoordinateTransformation // target SRS isn't deleted till the output geometry which also // uses it is deleted. template<> template<> void object::test<3>() { ensure("SRS UTM handle is NULL", nullptr != srs_utm_); ensure("SRS LL handle is NULL", nullptr != srs_ll_); err_ = OSRSetUTM(srs_utm_, 11, TRUE); ensure_equals("Can't set UTM zone", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_utm_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); err_ = OSRSetWellKnownGeogCS(srs_ll_, "WGS84"); ensure_equals("Can't set GeogCS", err_, OGRERR_NONE); ct_ = OCTNewCoordinateTransformation(srs_ll_, srs_utm_); ensure("PROJ.4 missing, transforms not available", nullptr != ct_); const char* wkt = "POINT(-117.5 32.0)"; OGRGeometryH geom = nullptr; err_ = OGR_G_CreateFromWkt((char**) &wkt, nullptr, &geom); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", nullptr != geom); err_ = OGR_G_Transform(geom, ct_); ensure_equals("OGR_G_Transform() failed", err_, OGRERR_NONE); OGRSpatialReferenceH srs = nullptr; srs = OGR_G_GetSpatialReference(geom); char* wktSrs = nullptr; err_ = OSRExportToPrettyWkt(srs, &wktSrs, FALSE); ensure("Exported SRS to WKT is NULL", nullptr != wktSrs); std::string pretty(wktSrs); ensure_equals("SRS output is incorrect", pretty.substr(0, 6), std::string("PROJCS")); CPLFree(wktSrs); OGR_G_DestroyGeometry(geom); } } // namespace tut gdalautotest-3.0.4/cpp/test_c_include_from_cpp_file.cpp0000644003401500001440000000372213614005370022771 0ustar rouaultusers/****************************************************************************** * Project: GDAL Core * Purpose: Test including all public C headers as extern C from .cpp file * 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. ****************************************************************************/ extern "C" { #include "cpl_atomic_ops.h" #include "cpl_conv.h" #include "cpl_csv.h" #include "cpl_error.h" #include "cpl_hash_set.h" #include "cpl_list.h" #include "cpl_minixml.h" #include "cpl_port.h" #include "cpl_progress.h" #include "cpl_quad_tree.h" #include "cpl_vsi.h" #include "gdal_alg.h" #include "gdal_version.h" #include "gdal.h" #include "ogr_api.h" #include "ogr_core.h" #include "ogr_srs_api.h" } int main() { return 0; } gdalautotest-3.0.4/cpp/testblockcache.cpp0000644003401500001440000004575013614005370020106 0ustar rouaultusers/****************************************************************************** * $Id: testblockcache.cpp 7e07230bbff24eb333608de4dbd460b7312839d0 2017-12-11 19:08:47Z Even Rouault $ * * Project: GDAL Core * Purpose: Test block cache under multi-threading * 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. ****************************************************************************/ #ifndef DEBUG #define DEBUG #endif #include "cpl_multiproc.h" #include "gdal_priv.h" #include #include #include CPLLock* psLock = nullptr; static void Usage() { printf("Usage: testblockcache [-threads X] [-loops X] [-max_requests X] [-strategy random|line|block]\n"); printf(" [-migrate] [ filename |\n"); printf(" [[-xsize val] [-ysize val] [-bands val] [-co key=value]*\n"); printf(" [[-memdriver] | [-ondisk]] [-check]] ]\n"); exit(1); } int nLoops = 1; const char* pszDataset = nullptr; int bCheck = FALSE; typedef enum { STRATEGY_RANDOM, STRATEGY_LINE, STRATEGY_BLOCK, } Strategy; typedef struct _Request Request; struct _Request { int nXOff, nYOff, nXWin, nYWin; int nBands; Request* psNext; }; typedef struct _Resource Resource; struct _Resource { GDALDataset* poDS; void* pBuffer; Resource* psNext; Resource* psPrev; }; typedef struct { GDALDataset* poDS; Request* psRequestList; int nBufferSize; } ThreadDescription; static Request* psGlobalRequestList = nullptr; static Resource* psGlobalResourceList = nullptr; static Resource* psGlobalResourceLast = nullptr; /* according to rand() man page, POSIX.1-2001 proposes the following implementation */ /* RAND_MAX assumed to be 32767 */ #define MYRAND_MAX 32767 static int myrand_r(unsigned long* pseed) { *pseed = *pseed * 1103515245 + 12345; return((unsigned)((*pseed/65536UL) % (MYRAND_MAX+1))); } static void Check(GByte* pBuffer, int nXSize, int nYSize, int nBands, int nXOff, int nYOff, int nXWin, int nYWin) { for(int iBand=0;iBandRasterIO(GF_Read, nXOff, nYOff, nXWin, nYWin, pBuffer, nXWin, nYWin, GDT_Byte, nBands, nullptr, 0, 0, 0 #ifdef GDAL_COMPILATION , nullptr #endif )); if( bCheck ) { Check(pBuffer, nXSize, nYSize, nBands, nXOff, nYOff, nXWin, nYWin); } } static void AddRequest(Request*& psRequestList, Request*& psRequestLast, int nXOff, int nYOff, int nXWin, int nYWin, int nBands) { Request* psRequest = (Request*)CPLMalloc(sizeof(Request)); psRequest->nXOff = nXOff; psRequest->nYOff = nYOff; psRequest->nXWin = nXWin; psRequest->nYWin = nYWin; psRequest->nBands = nBands; if( psRequestLast ) psRequestLast->psNext = psRequest; else psRequestList = psRequest; psRequestLast = psRequest; psRequest->psNext = nullptr; } static Request* GetNextRequest(Request*& psRequestList) { if( psLock ) CPLAcquireLock(psLock); Request* psRet = psRequestList; if( psRequestList ) { psRequestList = psRequestList->psNext; psRet->psNext = nullptr; } if( psLock ) CPLReleaseLock(psLock); return psRet; } static Resource* AcquireFirstResource() { if( psLock ) CPLAcquireLock(psLock); Resource* psRet = psGlobalResourceList; psGlobalResourceList = psGlobalResourceList->psNext; if( psGlobalResourceList ) psGlobalResourceList->psPrev = nullptr; else psGlobalResourceLast = nullptr; psRet->psNext = nullptr; assert(psRet->psPrev == nullptr); if( psLock ) CPLReleaseLock(psLock); return psRet; } static void PutResourceAtEnd(Resource* psResource) { if( psLock ) CPLAcquireLock(psLock); psResource->psPrev = psGlobalResourceLast; psResource->psNext = nullptr; if( psGlobalResourceList == nullptr ) psGlobalResourceList = psResource; else psGlobalResourceLast->psNext = psResource; psGlobalResourceLast = psResource; if( psLock ) CPLReleaseLock(psLock); } static void ThreadFuncDedicatedDataset(void* _psThreadDescription) { ThreadDescription* psThreadDescription = (ThreadDescription*)_psThreadDescription; int nXSize = psThreadDescription->poDS->GetRasterXSize(); int nYSize = psThreadDescription->poDS->GetRasterYSize(); void* pBuffer = CPLMalloc(psThreadDescription->nBufferSize); while( psThreadDescription->psRequestList != nullptr ) { Request* psRequest = GetNextRequest(psThreadDescription->psRequestList); ReadRaster(psThreadDescription->poDS, nXSize, nYSize, psRequest->nBands, (GByte*)pBuffer, psRequest->nXOff, psRequest->nYOff, psRequest->nXWin, psRequest->nYWin); CPLFree(psRequest); } CPLFree(pBuffer); } static void ThreadFuncWithMigration(void* /* _unused */) { Request* psRequest; while( (psRequest = GetNextRequest(psGlobalRequestList)) != nullptr ) { Resource* psResource = AcquireFirstResource(); assert(psResource); int nXSize = psResource->poDS->GetRasterXSize(); int nYSize = psResource->poDS->GetRasterYSize(); ReadRaster(psResource->poDS, nXSize, nYSize, psRequest->nBands, (GByte*)psResource->pBuffer, psRequest->nXOff, psRequest->nYOff, psRequest->nXWin, psRequest->nYWin); CPLFree(psRequest); PutResourceAtEnd(psResource); } } static int CreateRandomStrategyRequests(GDALDataset* poDS, int nMaxRequests, Request*& psRequestList, Request*& psRequestLast) { unsigned long seed = 1; int nXSize = poDS->GetRasterXSize(); int nYSize = poDS->GetRasterYSize(); int nMaxXWin = MIN(1000, nXSize/10+1); int nMaxYWin = MIN(1000, nYSize/10+1); int nQueriedBands = MIN(4, poDS->GetRasterCount()); int nAverageIterationsToReadWholeFile = ((nXSize + nMaxXWin/2-1) / (nMaxXWin/2)) * ((nYSize + nMaxYWin/2-1) / (nMaxYWin/2)); int nLocalLoops = nLoops * nAverageIterationsToReadWholeFile; for(int iLoop=0;iLoop 0 && iLoop == nMaxRequests ) break; int nXOff = (int)((GIntBig)myrand_r(&seed) * (nXSize-1) / MYRAND_MAX); int nYOff = (int)((GIntBig)myrand_r(&seed) * (nYSize-1) / MYRAND_MAX); int nXWin = 1+(int)((GIntBig)myrand_r(&seed) * nMaxXWin / MYRAND_MAX); int nYWin = 1+(int)((GIntBig)myrand_r(&seed) * nMaxYWin / MYRAND_MAX); if( nXOff + nXWin > nXSize ) nXWin = nXSize - nXOff; if( nYOff + nYWin > nYSize ) nYWin = nYSize - nYOff; AddRequest(psRequestList, psRequestLast, nXOff, nYOff, nXWin, nYWin, nQueriedBands); } return nQueriedBands * nMaxXWin * nMaxYWin; } static int CreateLineStrategyRequests(GDALDataset* poDS, int nMaxRequests, Request*& psRequestList, Request*& psRequestLast) { int nXSize = poDS->GetRasterXSize(); int nYSize = poDS->GetRasterYSize(); int nQueriedBands = MIN(4, poDS->GetRasterCount()); int bStop = FALSE; int nRequests = 0; for(int iLoop=0;!bStop && iLoop 0 && nRequests == nMaxRequests ) { bStop = TRUE; break; } AddRequest(psRequestList, psRequestLast, 0, nYOff, nXSize, 1, nQueriedBands); nRequests ++; } } return nQueriedBands * nXSize; } static int CreateBlockStrategyRequests(GDALDataset* poDS, int nMaxRequests, Request*& psRequestList, Request*& psRequestLast) { int nXSize = poDS->GetRasterXSize(); int nYSize = poDS->GetRasterYSize(); int nMaxXWin = MIN(1000, nXSize/10+1); int nMaxYWin = MIN(1000, nYSize/10+1); int nQueriedBands = MIN(4, poDS->GetRasterCount()); int bStop = FALSE; int nRequests = 0; for(int iLoop=0;!bStop && iLoop nYSize) ? nYSize - nYOff : nMaxYWin; for(int nXOff=0;nXOff 0 && nRequests == nMaxRequests ) { bStop = TRUE; break; } int nReqXSize = (nXOff + nMaxXWin > nXSize) ? nXSize - nXOff : nMaxXWin; AddRequest(psRequestList, psRequestLast, nXOff, nYOff, nReqXSize, nReqYSize, nQueriedBands); nRequests ++; } } } return nQueriedBands * nMaxXWin * nMaxYWin; } int main(int argc, char* argv[]) { int i; int nThreads = CPLGetNumCPUs(); std::vector apsThreads; Strategy eStrategy = STRATEGY_RANDOM; int bNewDatasetOption = FALSE; int nXSize = 5000; int nYSize = 5000; int nBands = 4; char** papszOptions = nullptr; int bOnDisk = FALSE; std::vector asThreadDescription; int bMemDriver = FALSE; GDALDataset* poMEMDS = nullptr; int bMigrate = FALSE; int nMaxRequests = -1; argc = GDALGeneralCmdLineProcessor( argc, &argv, 0 ); GDALAllRegister(); for(i = 1; i < argc; i++) { if( EQUAL(argv[i], "-threads") && i + 1 < argc) { i ++; nThreads = atoi(argv[i]); } else if( EQUAL(argv[i], "-loops") && i + 1 < argc) { i ++; nLoops = atoi(argv[i]); if( nLoops <= 0 ) nLoops = INT_MAX; } else if( EQUAL(argv[i], "-max_requests") && i + 1 < argc) { i ++; nMaxRequests = atoi(argv[i]); } else if( EQUAL(argv[i], "-strategy") && i + 1 < argc) { i ++; if( EQUAL(argv[i], "random") ) eStrategy = STRATEGY_RANDOM; else if( EQUAL(argv[i], "line") ) eStrategy = STRATEGY_LINE; else if( EQUAL(argv[i], "block") ) eStrategy = STRATEGY_BLOCK; else Usage(); } else if( EQUAL(argv[i], "-xsize") && i + 1 < argc) { i ++; nXSize = atoi(argv[i]); bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-ysize") && i + 1 < argc) { i ++; nYSize = atoi(argv[i]); bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-bands") && i + 1 < argc) { i ++; nBands = atoi(argv[i]); bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-co") && i + 1 < argc) { i ++; papszOptions = CSLAddString(papszOptions, argv[i]); bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-ondisk")) { bOnDisk = TRUE; bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-check")) { bCheck = TRUE; bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-memdriver")) { bMemDriver = TRUE; bNewDatasetOption = TRUE; } else if( EQUAL(argv[i], "-migrate")) bMigrate = TRUE; else if( argv[i][0] == '-' ) Usage(); else if( pszDataset == nullptr ) pszDataset = argv[i]; else { Usage(); } } if( pszDataset != nullptr && bNewDatasetOption ) Usage(); CPLDebug("TEST", "Using %d threads", nThreads); int bCreatedDataset = FALSE; if( pszDataset == nullptr ) { bCreatedDataset = TRUE; if( bOnDisk ) pszDataset = "/tmp/tmp.tif"; else pszDataset = "/vsimem/tmp.tif"; GDALDataset* poDS = ((GDALDriver*)GDALGetDriverByName((bMemDriver) ? "MEM" : "GTiff"))->Create(pszDataset, nXSize, nYSize, nBands, GDT_Byte, papszOptions); if( bCheck ) { GByte* pabyLine = (GByte*) VSIMalloc(nBands * nXSize); for(int iY=0;iYRasterIO(GF_Write, 0, iY, nXSize, 1, pabyLine, nXSize, 1, GDT_Byte, nBands, nullptr, 0, 0, 0 #ifdef GDAL_COMPILATION , nullptr #endif )); } VSIFree(pabyLine); } if( bMemDriver ) poMEMDS = poDS; else GDALClose(poDS); } else { bCheck = FALSE; } CSLDestroy(papszOptions); papszOptions = nullptr; Request* psGlobalRequestLast = nullptr; for(i = 0; i < nThreads; i++ ) { GDALDataset* poDS; // Since GDAL 2.0, the MEM driver is thread-safe, i.e. does not use the block // cache, but only for operations not involving resampling, which is // the case here if( poMEMDS ) poDS = poMEMDS; else { poDS = (GDALDataset*)GDALOpen(pszDataset, GA_ReadOnly); if( poDS == nullptr ) exit(1); } if( bMigrate ) { Resource* psResource = (Resource*)CPLMalloc(sizeof(Resource)); psResource->poDS = poDS; int nBufferSize; if( eStrategy == STRATEGY_RANDOM ) nBufferSize = CreateRandomStrategyRequests( poDS, nMaxRequests, psGlobalRequestList, psGlobalRequestLast); else if( eStrategy == STRATEGY_LINE ) nBufferSize = CreateLineStrategyRequests( poDS, nMaxRequests, psGlobalRequestList, psGlobalRequestLast); else nBufferSize = CreateBlockStrategyRequests( poDS, nMaxRequests, psGlobalRequestList, psGlobalRequestLast); psResource->pBuffer = CPLMalloc(nBufferSize); PutResourceAtEnd(psResource); } else { ThreadDescription sThreadDescription; sThreadDescription.poDS = poDS; sThreadDescription.psRequestList = nullptr; Request* psRequestLast = nullptr; if( eStrategy == STRATEGY_RANDOM ) sThreadDescription.nBufferSize = CreateRandomStrategyRequests( poDS, nMaxRequests, sThreadDescription.psRequestList, psRequestLast); else if( eStrategy == STRATEGY_LINE ) sThreadDescription.nBufferSize = CreateLineStrategyRequests( poDS, nMaxRequests, sThreadDescription.psRequestList, psRequestLast); else sThreadDescription.nBufferSize = CreateBlockStrategyRequests( poDS, nMaxRequests, sThreadDescription.psRequestList, psRequestLast); asThreadDescription.push_back(sThreadDescription); } } if( bCreatedDataset && poMEMDS == nullptr && bOnDisk ) { CPLPushErrorHandler(CPLQuietErrorHandler); VSIUnlink(pszDataset); CPLPopErrorHandler(); } if( bMigrate ) { psLock = CPLCreateLock(LOCK_SPIN); } for(i = 0; i < nThreads; i++ ) { CPLJoinableThread* pThread; if( bMigrate ) pThread = CPLCreateJoinableThread(ThreadFuncWithMigration, nullptr); else pThread = CPLCreateJoinableThread(ThreadFuncDedicatedDataset, &(asThreadDescription[i])); apsThreads.push_back(pThread); } for(i = 0; i < nThreads; i++ ) { CPLJoinThread(apsThreads[i]); if( !bMigrate && poMEMDS == nullptr ) GDALClose(asThreadDescription[i].poDS); } while( psGlobalResourceList != nullptr ) { CPLFree( psGlobalResourceList->pBuffer); if( poMEMDS == nullptr ) GDALClose(psGlobalResourceList->poDS); Resource* psNext = psGlobalResourceList->psNext; CPLFree( psGlobalResourceList ); psGlobalResourceList = psNext; } if( psLock ) { CPLDestroyLock( psLock ); } if( bCreatedDataset && poMEMDS == nullptr ) { CPLPushErrorHandler(CPLQuietErrorHandler); VSIUnlink(pszDataset); CPLPopErrorHandler(); } if( poMEMDS ) GDALClose(poMEMDS); assert( GDALGetCacheUsed64() == 0 ); GDALDestroyDriverManager(); CSLDestroy( argv ); return 0; } gdalautotest-3.0.4/cpp/bug1488.cpp0000644003401500001440000001122513614005370016220 0ustar rouaultusers/****************************************************************************** * $Id: bug1488.cpp df36f287cc9df9e2be176c41971f110cc2f18cd7 2019-06-28 11:38:47 +0200 Even Rouault $ * * Project: GDAL Core * Purpose: Test fix for https://github.com/OSGeo/gdal/issues/1488 (concurrency issue with overviews) * Author: Even Rouault, * ****************************************************************************** * Copyright (c) 2019, Even Rouault * Copyright (c) 2019, Thomas Bonfort * * 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. ****************************************************************************/ #include #include "cpl_multiproc.h" #include #include "test_data.h" static GDALDriverH hTIFFDrv = nullptr; static volatile int bThread1Finished = FALSE; static volatile int bThread2Finished = FALSE; static volatile int bContinue = TRUE; const char* szSrcDataset = TUT_ROOT_DATA_DIR "/bug1488.tif"; static int CPL_STDCALL myProgress(double, const char *, void *); static int CPL_STDCALL myProgress(double, const char *, void *) { return bContinue; } static void CPL_STDCALL myErrorHandler(CPLErr, CPLErrorNum, const char* msg); static void CPL_STDCALL myErrorHandler(CPLErr eErrClass, CPLErrorNum, const char* msg) { if( eErrClass != CPLE_UserInterrupt && strstr(msg, "User terminated") == nullptr ) { fprintf(stderr, "An error occurred: %s\n", msg); fprintf(stderr, "Likely a threading issue !\n"); exit(1); } } static void worker_thread1(void *) { GDALDatasetH hDataset = GDALOpen("/vsimem/thread1.tif", GA_Update); assert(hDataset); int levels[1]={2}; int bands[3]={1,2,3}; CPLErr eErr = GDALBuildOverviews(hDataset,"AVERAGE",1,levels,3,bands, myProgress,nullptr); (void)eErr; GDALClose(hDataset); VSIUnlink("/vsimem/thread1.tif"); bThread1Finished = TRUE; } static void worker_thread2(void *) { GDALDatasetH hSrc = GDALOpen(szSrcDataset, GA_ReadOnly); assert(hSrc); const char * const tops[] = {"TILED=YES","COMPRESS=WEBP",nullptr}; GDALDatasetH hDataset = GDALCreateCopy(GDALGetDriverByName("GTiff"), "/vsimem/thread2.tif",hSrc,TRUE,tops, myProgress,nullptr); GDALClose(hDataset); GDALClose(hSrc); VSIUnlink("/vsimem/thread2.tif"); bThread2Finished = TRUE; } int main() { GDALAllRegister(); hTIFFDrv = GDALGetDriverByName("GTiff"); if( !hTIFFDrv ) { printf("GTIFF driver missing. Skipping\n"); exit(0); } const char* pszCO = GDALGetMetadataItem(hTIFFDrv, GDAL_DMD_CREATIONOPTIONLIST, nullptr); if( pszCO == nullptr || strstr(pszCO, "WEBP") == nullptr ) { printf("WEBP missing. Skipping\n"); exit(0); } GDALSetCacheMax(30* 1000 * 1000); CPLSetErrorHandler(myErrorHandler); VSISync(szSrcDataset, "/vsimem/thread1.tif", nullptr, nullptr, nullptr, nullptr); CPLJoinableThread* t1 = CPLCreateJoinableThread(worker_thread1, nullptr); CPLJoinableThread* t2 = CPLCreateJoinableThread(worker_thread2, nullptr); int nCountSeconds = 0; while( !bThread1Finished && !bThread2Finished ) { CPLSleep(1); nCountSeconds ++; if( nCountSeconds == 2 ) { /* After 2 seconds without errors, assume no threading issue, and */ /* early exit */ bContinue = FALSE; } } CPLJoinThread(t1); CPLJoinThread(t2); return 0; } gdalautotest-3.0.4/cpp/README0000644003401500001440000000446513614004466015307 0ustar rouaultusers$Id: README,v 1.4 2006/12/06 15:38:16 mloskot Exp $ -------------------------------------------------------------------------- GDAL C++ Unit Tests package Author: Mateusz Loskot (mateusz@loskot.net) -------------------------------------------------------------------------- The C++ Unit Tests package is dedicated to Windows CE platform, though it's runnable on desktop Windows. It should also compile on Unix, but internally Windows paths (with \)are used, so you may need to replace them with Unix paths (with /) This package includes subset of tests from gdalautotest but implemented in C++ language and TUT - C++ Unit Test Framework. The C++ Unit Tests are based on GDAL C API, so they can be used to tests both sets of GDAL APIs: C and C++. ------------------------------------- Tests coverage ------------------------------------- 1. GDAL - Common features - AAIGrid - DTED - GTIff 2. OGR - Common features - GEOS support - Shape 3. OSR - Common features - PROJ.4 - PCI ------------------------------------- Compilation for desktop Windows ------------------------------------- Configuration: Open makefile.vc in your favourite editor and check if section "CONFIGURATION" looks correctly for your environment. Makefile expects to find gdal_i.lib and gdalXY.dll in GDAL_ROOT location, where XY is GDAL_VERSION. Update the configuration block to fit your environment. Customize GEOS_ROOT and PROJ4_ROOT variables. Makefile tries to copy gdalXY.dll into 'gdalautotest\cpp' directory, so test runner executable can find it without any problems. Clean target will delete all binaries, executable and copied DLL. Build: nmake /f makefile.vc Clean: nmake /f makefile.vc clean No project file is available for desktop Windows target. ------------------------------------- Compilation for Windows CE system ------------------------------------- IMPORTANT: Currently, the project file is not integrated with GDAL project files, so Unit Test executable does not link automatically, unless you hack project settings yourself and configure linker settings properly. Please, wait for GDAL 1.4.0. Use project file from 'msvc80ce' subdirectory No makefile is available for Windows CE target. -------------------------------------------------------------------------- Contact: Mateusz Loskot (mateusz@loskot.net)gdalautotest-3.0.4/asan_suppressions.txt0000644003401500001440000000041013614004466020147 0ustar rouaultusersleak:SwigPyClientData_New leak:spatialite_alloc_connection leak:/usr/bin/zip leak:/usr/lib/x86_64-linux-gnu/libfontconfig.so.1 leak:/usr/bin/python2.7 leak:/usr/lib/python2.7/lib-dynload/_ctypes.x86_64-linux-gnu.so leak:PyDataMem_NEW leak:PyArray_NewFromDescr_int gdalautotest-3.0.4/.gitignore0000644003401500001440000000170513614004466015627 0ustar rouaultusers*.pyc cpp/*.dll cpp/*.exe cpp/*.exe.manifest cpp/*.exp cpp/*.ilk cpp/*.lib cpp/*.pdb cpp/*.vcxproj cpp/*.vcxproj.filters cpp/*.vcxproj.user cpp/[Dd]ebug cpp/[Rr]elease cpp/x64 cpp/data/*.aux.xml cpp/gdal_unit_test cpp/test_c_include_from_cpp_file cpp/test_include_from_c_file cpp/testblockcache cpp/testblockcachelimits cpp/testblockcachewrite cpp/testclosedondestroydm cpp/testcopywords cpp/testdestroy cpp/testmultithreadedwriting cpp/testperfcopywords cpp/testthreadcond cpp/testvirtualmem cpp/test_osr_set_proj_search_paths cpp/bug1488 ogr/tmp ogr/data/delete_nas.gfs ogr/data/replace_nas.gfs ogr/data/test_point2.gfs ogr/data/schema_with_geom_in_complextype.gfs ogr/data/bylany.vfk.db gcore/tmp gcore/data/byte.tif.gz.properties gdrivers/data/arg-float32.tif.aux.xml gdrivers/data/arg-float64.tif.aux.xml gdrivers/data/arg-int16-2.json gdrivers/data/arg-int16.arg.aux.xml gdrivers/data/byte.jp2.gz.properties gdrivers/data/utm.json gdrivers/tmp osr/tmp *~ *tmpgdalautotest-3.0.4/gdrivers/0000755003401500001440000000000013614005414015453 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/netcdf_cfchecks.py0000755003401500001440000034062313614005370021135 0ustar rouaultusers#!/usr/bin/env python ############################################################################### # $Id: netcdf_cfchecks.py d248a5287e212c95d7174f784e2e5099f46d5b60 2018-12-14 10:08:53 +1300 Craig de Stigter $ # # 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): co-ordinate 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): co-ordinate 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): co-ordinate 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.0.4/gdrivers/arg.py0000755003401500001440000002214213614005370016603 0ustar rouaultusers#!/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.0.4/gdrivers/vrtwarp.py0000755003401500001440000004060413614005370017542 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: vrtwarp.py 776e6027755b1ec5045a2592c565ec164fca0d73 2019-11-12 14:20:18 +0100 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', '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/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_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/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/geos_vrtwarp.vrt') assert ds.GetRasterBand(1).ReadRaster(0, 0, 512, 512) gdalautotest-3.0.4/gdrivers/jpipkak.py0000755003401500001440000001225413614005370017466 0ustar rouaultusers#!/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 abs(stats[2] - 6791.121) <= 1.0 and abs(stats[3] - 3046.536) <= 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 abs(stats[2] - 43.429) <= 1.0 and abs(stats[3] - 18.526) <= 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 abs(stats[2] - 483.501) <= 1.0 and abs(stats[3] - 117.972) <= 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 abs(stats[2] - 5333.148) <= 1.0 and abs(stats[3] - 2522.023) <= 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 abs(stats[2] - 42.462) <= 1.0 and abs(stats[3] - 20.611) <= 1.0, \ 'did not get expected mean/stddev' gdalautotest-3.0.4/gdrivers/saga.py0000755003401500001440000001517113614005370016751 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: saga.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # 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', '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', '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', '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', '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', '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.0.4/gdrivers/kro.py0000755003401500001440000000617113614005370016631 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: kro.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # 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', '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.0.4/gdrivers/ozi.py0000755003401500001440000000737513614005370016646 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: ozi.py b384815f8a4a2344821c49ad9e030887a0b92058 2019-02-12 01:06:40 +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 abs(gt[i] - expected_gt[i]) <= 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 abs(gcp0.GCPX - (9112088.39654255)) <= 0.001 and abs(gcp0.GCPY - -999503.568004833) <= 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.0.4/gdrivers/kea.py0000755003401500001440000005461513614005370016604 0ustar rouaultusers#!/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.0.4/gdrivers/rmf.py0000755003401500001440000006145513614005370016630 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: rmf.py a84c4ea25b201702c1065405b13656176b5b501e 2019-11-28 20:16:03 +0100 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', 'byte.rsw', 1, 4672) return tst.testOpen(check_gt=(440720, 60, 0, 3751320, 0, -60)) def test_rmf_2(): tst = gdaltest.GDALTest('rmf', 'byte-lzw.rsw', 1, 40503) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_3(): tst = gdaltest.GDALTest('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', 'rgbsmall.rsw', 1, 21212) tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) tst = gdaltest.GDALTest('rmf', 'rgbsmall.rsw', 2, 21053) tst.testOpen(check_gt=(-44.840320, 0.003432, 0, -22.932584, 0, -0.003432)) tst = gdaltest.GDALTest('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', 'rgbsmall-lzw.rsw', 1, 40503) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rgbsmall-lzw.rsw', 2, 41429) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'rgbsmall-lzw.rsw', 3, 40238) with gdaltest.error_handler(): return tst.testOpen() def test_rmf_6(): tst = gdaltest.GDALTest('rmf', 'big-endian.rsw', 1, 7782) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('rmf', 'big-endian.rsw', 2, 8480) with gdaltest.error_handler(): tst.testOpen() tst = gdaltest.GDALTest('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', 'byte.rsw', 1, 4672) return tst.testCreateCopy(check_srs=1, check_gt=1, vsimem=1) def test_rmf_8(): tst = gdaltest.GDALTest('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', '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', 't100.mtw', 1, 6388) with gdaltest.error_handler(): return tst.testOpen() ############################################################################### # Overviews def test_rmf_11(): test_fn = '/vsigzip/data/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', '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', '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', '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', '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('data/' + 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='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='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='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='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='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='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='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='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='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='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='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='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/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/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/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/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/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/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/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', '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', '1bit.rsw', 1, 34325) return tst.testOpen() def test_rmf_33b(): tst = gdaltest.GDALTest('rmf', '4bit.rsw', 1, 55221) return tst.testOpen() def test_rmf_33c(): tst = gdaltest.GDALTest('rmf', '4bit-lzw.rsw', 1, 55221) return tst.testOpen() ############################################################################### gdalautotest-3.0.4/gdrivers/aigrid.py0000755003401500001440000001672213614005370017300 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: aigrid.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 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', 'abc3x1', 1, 3) return tst.testOpen() ############################################################################### # Verify some auxiliary data. def test_aigrid_2(): ds = gdal.Open('data/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/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', '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/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_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.0.4/gdrivers/bt.py0000755003401500001440000000755713614005370016454 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: bt.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # 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.0.4/gdrivers/sigdem.py0000755003401500001440000000652213614005370017306 0ustar rouaultusers#!/usr/bin/env pytest # -*- coding: utf-8 -*- ############################################################################### # $Id: sigdem.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 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', '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.0.4/gdrivers/mrsid.py0000755003401500001440000004113113614005370017147 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: mrsid.py 8e5eeb35bf76390e3134a4ea7076dab7d478ea0e 2018-11-14 22:55:13 +0100 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 ############################################################################### # Read a simple byte file, checking projections and geotransform. def test_mrsid_1(): gdaltest.mrsid_drv = gdal.GetDriverByName('MrSID') if gdaltest.mrsid_drv is None: pytest.skip() tst = gdaltest.GDALTest('MrSID', '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/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(): if gdaltest.mrsid_drv is None: pytest.skip() ds = gdal.Open('data/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(): if gdaltest.mrsid_drv is None: pytest.skip() ds = gdal.Open('data/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 abs(new_stat[i] - check_stat[i]) > 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(): if gdaltest.mrsid_drv is None: pytest.skip() try: os.remove('data/mercator_new.sid.aux.xml') except OSError: pass tst = gdaltest.GDALTest('MrSID', '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/mercator_new.sid.aux.xml') except OSError: pass return ret ############################################################################### # Test JP2MrSID driver def test_mrsid_5(): gdaltest.jp2mrsid_drv = gdal.GetDriverByName('JP2MrSID') if gdaltest.jp2mrsid_drv is None: pytest.skip() gdaltest.deregister_all_jpeg2000_drivers_but('JP2MrSID') ############################################################################### # 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', '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/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(): if gdaltest.mrsid_drv is None: pytest.skip() 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/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(): if gdaltest.mrsid_drv is None: pytest.skip() f = open('data/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/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/byte_without_geotransform.jp2') geotransform = ds.GetGeoTransform() assert abs(geotransform[0] - 440720) <= 0.1 and abs(geotransform[1] - 60) <= 0.001 and abs(geotransform[2] - 0) <= 0.001 and abs(geotransform[3] - 3751320) <= 0.1 and abs(geotransform[4] - 0) <= 0.001 and abs(geotransform[5] - -60) <= 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') ############################################################################### # Cleanup. def test_mrsid_cleanup(): try: os.remove('data/mercator.sid.aux.xml') os.remove('data/mercator_new.sid.aux.xml') except OSError: pass gdaltest.reregister_all_jpeg2000_drivers() gdalautotest-3.0.4/gdrivers/dods.py0000755003401500001440000001116113614005370016762 0ustar rouaultusers#!/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.0.4/gdrivers/sgi.py0000755003401500001440000000435013614005370016615 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: sgi.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # 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', '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.0.4/gdrivers/mrf.py0000755003401500001440000005006513614005370016623 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: mrf.py 09abe392b2b229ee2ee7625cfc5d6509c57f4f17 2019-02-02 13:13:07 -0800 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_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']), ('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 src_filename == '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/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(): 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(): 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_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 = [ '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.0.4/gdrivers/fits.py0000755003401500001440000000754513614005370017011 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: fits.py 322e1b12375e40ec84da7f7a34c084f0ff7245f5 2019-03-20 23:01:59 +0100 Chiara Marmo $ # # Project: GDAL/OGR Test Suite # Purpose: Test read functionality for FITS 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 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/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 gdalautotest-3.0.4/gdrivers/elas.py0000755003401500001440000000406013614005370016755 0ustar rouaultusers#!/usr/bin/env pytest ############################################################################### # $Id: elas.py 30250f784292af8d1f0ae95625b06ac482885d86 2018-12-14 10:16:24 +1300 Craig de Stigter $ # # 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', 'byte_elas.bin', 1, 4672) return tst.testOpen() ############################################################################### # Test Create() def test_elas_2(): tst = gdaltest.GDALTest('ELAS', 'byte_elas.bin', 1, 4672) return tst.testCreate() gdalautotest-3.0.4/gdrivers/data/0000755003401500001440000000000013614005407016366 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/uint.nc0000644003401500001440000002434113614004466017677 0ustar rouaultusersHDF  (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.0.4/gdrivers/data/r_test.asc0000644003401500001440000000036413614004466020365 0ustar rouaultusersRDA2 A 2 133377 131840 1026 1 4105 2 gg 526 40 107 123 132 115 115 132 107 123 115 132 140 132 148 132 123 123 132 156 132 140 107 123 132 115 115 132 107 123 115 132 140 132 148 132 123 123 132 156 132 140 1026 1 4105 3 dim 13 3 4 5 2 254 254 gdalautotest-3.0.4/gdrivers/data/byte_elas.bin0000644003401500001440000001400013614004466021026 0ustar rouaultusersNOR 9=zEAS BpBp?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{skkkkksckgdalautotest-3.0.4/gdrivers/data/byte_rraster.grd0000644003401500001440000000071313614004466021576 0ustar rouaultusers[general] creator=R package 'raster' created=2016-06-25 17:32:47 [georeference] nrows=20 ncols=20 xmin=440720 ymin=3750120 xmax=441920 ymax=3751320 projection=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat [data] datatype=INT1U byteorder=little nbands=1 bandorder=BIL categorical=FALSE minvalue=74 maxvalue=255 nodatavalue=NA [legend] legendtype= values= color= [description] layername=byte gdalautotest-3.0.4/gdrivers/data/test_vr.bag0000644003401500001440000004211013614004466020531 0ustar rouaultusersHDF  HD`TREEHEAPXBAG_root@(hTREEpHEAP-SNOD HhHh H Bag Version 1.6.2Filename not foundMemory  (  h$tI `>gk[ HMinimum Elevation Value   SNODP(#8%HH'X@,pA A@ @ A@ @ A@ @ A@ @xڵn@} =ŠVrUT74UYgcz̷3ݝvP\H ӆxcM->6#h0`sQx̤:1E5N\G/źezRwު04"H aVNq'U#:k詏'N\m_!T#%ĂH z)- "m|^),P^BM~N〯ku*]%_ _'Xls!CTGl$oO޲J0WeOl3L0`dĽ g# ;&>>Χ[ndՠdJHtt\y,3 Nl~j0#\Vܮ@yT hbK) ˽va$wk|{}zHEZ\ݮL3nOX-auQmYzQqlDa=[.6AK9 Zp&ц3"E݅yo*Egp3K-/'tvʔKv] YZck~r-jNcTIhiS# K%#nn`!~tQΈO=#O(Ze.t[R3B("s{/  lj!^ٺFSݵA#_]TxQN0e+Kf RJ9K|g{\*nlx{ݽӖZwC[6χ-v`jg=I,wCZvv->xm5F8rY8b$= ^!s ӛ`Su1˿ BVkq:\YA1}T$e֎/d@Y jQ`~ γ*VT?EŤƊ:IuMDDˡɞOs$tI HMaximum Elevation Value   A deflate `>gk[`TREEH  ]`  bZLxQj@}W>R*Djd a]'1ٰ }7E1Ӟ9gfH{6SpwDHP8!T24o^Y"(K3.w,Y~y8Bfֹ2%<!wΐl0Ѻ)m)eɎpex(7VvHƣ+,-a|i+\fIqHCN!< ;ޟ0OXhkB,8z:x_RVYӂoH:|wfH͞^Cܧuk1p%RHPpj@ }إ3[3!Nb㱟 &e}?^axڝRMO0 +i!Xqa6EFJ*qߓ.*[vd4z`Vc LA+GLuo_MIq/CC= ߹.aI(igK$.a&%n?2bXUUFK3Gܤܦ)Owvo>w{sqq ^V51Zɮ9) k#,Xp YAn瘐`{[\ (-/2%V>̱42ruV\ʦ8]P9+A`Q#lXR~[$,qz"J!>AwxuRmo0 +< 4U ЄI7Ve)iR%./REj+~j*JƐY<t18_,whHp&?wc>-tNt=> a%1~b;[u_,`Qo]'] p]H?%V齊`{p)2b,.VA jqgbR NOD˫'qқ>p_?a5pxo4gk[ @ Tracking List Length X(  $tI$tI`>gk[ PMinimum Uncertainty Value   PMaximum Uncertainty Value  @(index dimensions_x dimensions_y resolution_x   resolution_y  sw_corner_x  sw_corner_y  ( S >gk[ @ min_dimensions_x  @ max_dimensions_x  Hmin_resolution_x  ww@ Hmax_resolution_x  33A @ min_dimensions_y  @ max_dimensions_y  Hmin_resolution_y  ""@ Hmax_resolution_y  33A H(,,depth  depth_uncrt  @8$tI$tI deflate H.,>gk[elevationmetadatatracking_listuncertaintyvarres_metadatavarres_refinementsvarres_tracking_list(TREE8,x픋OWwq%@a)} 1ݹHl|@4jKi}T7b YfPE `QlAޢBKu ѕu5 ( fFMnΜNܹߗJ&S{[cP^4^K RK6~I1]j5 '`jClzWI}ƀk,3FӦ<εz<|bO fӟd}|(נsGWQ\_ Y^q4bWf,Ωh~67IHv*wOp6[k/,[8LSgk[ @ VR Tracking List Length gdalautotest-3.0.4/gdrivers/data/test_offset_ne_corner.bag0000644003401500001440000007074013614004466023434 0ustar rouaultusersHDF  q`TREEHEAPXBAG_root@(hTREEpHEAP-SNOD HhHh H Bag Version 1.6.2Filename not foundMemory  (  h$tI `>gk[ HMinimum Elevation Value   SNODP(#8%HH'X@,pA A@ @ A@ @ A@ @ A@ @xڵn@} =ŠVrUT74UYgcz̷3ݝvP\H ӆxcM->6#h0`sQx̤:1E5N\G/źezRwު04"H aVNq'U#:k詏'N\m_!T#%ĂH z)- "m|^),P^BM~N〯ku*]%_ _'Xls!CTGl$oO޲J0WeOl3L0`dĽ g# ;&>>Χ[ndՠdJHtt\y,3 Nl~j0#\Vܮ@yT hbK) ˽va$wk|{}zHEZ\ݮL3nOX-auQmYzQqlDa=[.6AK9 Zp&ц3"E݅yo*Egp3K-/'tvʔKv] YZck~r-jNcTIhiS# K%#nn`!~tQΈO=#O(Ze.t[R3B("s{/  lj!^ٺFSݵA#_]TxQN0e+Kf RJ9K|g{\*nlx{ݽӖZwC[6χ-v`jg=I,wCZvv->xm5F8rY8b$= ^!s ӛ`Su1˿ BVkq:\YA1}T$e֎/d@Y jQ`~ γ*VT?EŤƊ:IuMDDˡɞOs$tI HMaximum Elevation Value   A deflate `>gk[`TREEH  ]`  bZLxQj@}W>R*Djd a]'1ٰ }7E1Ӟ9gfH{6SpwDHP8!T24o^Y"(K3.w,Y~y8Bfֹ2%<!wΐl0Ѻ)m)eɎpex(7VvHƣ+,-a|i+\fIqHCN!< ;ޟ0OXhkB,8z:x_RVYӂoH:|wfH͞^Cܧuk1p%RHPpj@ }إ3[3!Nb㱟 &e}?^axڝRMO0 +i!Xqa6EFJ*qߓ.*[vd4z`Vc LA+GLuo_MIq/CC= ߹.aI(igK$.a&%n?2bXUUFK3Gܤܦ)Owvo>w{sqq ^V51Zɮ9) k#,Xp YAn瘐`{[\ (-/2%V>̱42ruV\ʦ8]P9+A`Q#lXR~[$,qz"J!>AwxuRmo0 +< 4U ЄI7Ve)iR%./REj+~j*JƐY<t18_,whHp&?wc>-tNt=> a%1~b;[u_,`Qo]'] p]H?%V齊`{p)2b,.VA jqgbR NOD˫'qқ>p_?a5pxo4gk[ @ Tracking List Length X(  $tI$tI`>gk[ PMinimum Uncertainty Value   PMaximum Uncertainty Value  @(index dimensions_x dimensions_y resolution_x   resolution_y  sw_corner_x  sw_corner_y  ( S >gk[ @ min_dimensions_x  @ max_dimensions_x  Hmin_resolution_x  ww@ Hmax_resolution_x  33A @ min_dimensions_y  @ max_dimensions_y  Hmin_resolution_y  ""@ Hmax_resolution_y  33A H(,,depth  depth_uncrt  @8$tI$tI deflate H.,>gk[elevationmetadatatracking_listuncertaintyvarres_metadatavarres_refinementsvarres_tracking_list(TREE8,x픋OWwq%@a)} 1ݹHl|@4jKi}T7b YfPE `QlAޢBKu ѕu5 ( fFMnΜNܹߗJ&S{[cP^4^K RK6~I1]j5 '`jClzWI}ƀk,3FӦ<εz<|bO fӟd}|(נsGWQ\_ Y^q4bWf,Ωh~67IHv*wOp6[k/,[8LSgk[ @ VR Tracking List Length e%XLGCOL%e% unknown unknown author 2018-08-08 2 row 4 32 column 6 30 point 1 0 100.000000000000,500000.000000000000 295.000000000000,500112.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 gdalautotest-3.0.4/gdrivers/data/byte_tile_2048.jp20000644003401500001440000000546113614004466021452 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdrcolrtuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|N@N@@A̞LAasoclbl gml.dataasoclbl gml.root-instanceuxml 440720 3750120 441920 3751320 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved jp2cOQ)R\@@HHPHHPHHPHHP KDN ? }vf? EE'>&*=@=j˒.> endobj 4 0 obj << /GCS 5 0 R /GPTS [ 49 2 50 2 49 3 50 3 ] /LPTS [ -0.0526315789473684 0 -0.0526315789473684 1 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 5 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 9 0 obj << /A << /O /UserProperties /P [ << /N (OGR_STYLE) /V >> ] >> /K 0 /P 8 0 R /Pg 6 0 R /S /feature /T (feature0) >> endobj 8 0 obj << /A << /O /UserProperties >> /K [ 9 0 R ] /P 7 0 R /S /Layer /T (test) >> endobj 10 0 obj << /BBox [ 0 0 110 110 ] /Length 11 0 R /Resources << /Font << /F1 << /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> >> >> /Subtype /Form /Type /XObject >> stream q BT 100.000000 0.000000 -0.000000 100.000000 55.000000 55.000000 Tm 0.000000 0.000000 0.000000 rg /F1 0.042333 Tf (foo) Tj ET Qendstream endobj 11 0 obj 128 endobj 12 0 obj [ 9 0 R ] endobj 6 0 obj << /Contents 13 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 110 110 ] /Parent 1 0 R /Resources 14 0 R /StructParents 0 /Type /Page /UserUnit 1 /VP [ 3 0 R ] >> endobj 13 0 obj << /Length 15 0 R >> stream /feature <> BDC q 1.000000 w 0 J 0 j 10 M []0 d 0.000000 1.000000 0.000000 RG 0.000000 1.000000 0.000000 rg 54.647222 54.647222 m 55.352778 55.352778 l 54.647222 55.352778 m 55.352778 54.647222 l S Q EMC /Label10 Do endstream endobj 15 0 obj 225 endobj 14 0 obj << /XObject << /Label10 10 0 R >> >> endobj 1 0 obj << /Count 1 /Kids [ 6 0 R ] /Type /Pages >> endobj 16 0 obj << /Nums [ 0 12 0 R ] >> endobj 7 0 obj << /Type /StructTreeRoot /ParentTree 16 0 R /K [ 8 0 R ] >> endobj 2 0 obj << /MarkInfo << /UserProperties true >> /Pages 1 0 R /StructTreeRoot 7 0 R /Type /Catalog >> endobj xref 0 17 0000000000 65535 f 0000001887 00000 n 0000002064 00000 n 0000000015 00000 n 0000000104 00000 n 0000000257 00000 n 0000001323 00000 n 0000001989 00000 n 0000000833 00000 n 0000000456 00000 n 0000000924 00000 n 0000001273 00000 n 0000001296 00000 n 0000001532 00000 n 0000001834 00000 n 0000001811 00000 n 0000001946 00000 n trailer << /Root 2 0 R /Size 17 >> startxref 2172 %%EOF gdalautotest-3.0.4/gdrivers/data/4bit-lzw.rsw0000644003401500001440000000673013614004466020611 0ustar rouaultusersRSW @@j@$@"?Bɣ1@ H@P"?Bɣ1@"?Bɣ1@B1D{.Aj鼓1JNUF#ϱtADSiɃ8ə!Eb?ܿ[m8v$EϲDJKL1-D;.!g y&>)LY{'^ޠ9#b6ޯvr w ̺җ)Hޭ 88 QQq/!K\s$Db精wDٮ>ϼ@_^Eꤢ#_E#AiUN~r B4dhwoŰڵD[ Dd[Ɏ <ɼю!ɋʣr@'Ȧ,DYz/{ώ~ON{7Ke6#4QJjO$*>F&z^ĸ%Dlw9NO: ZO6|;Q6qTꍰ{u,^vn *y -ڔ6{Z .cj@"~3Ӝ$6xX: RpF$JGNIiM`S65 1/lNڿ`NAJ1Mb| oR .@]#ȬNVO>t^4xJ9]]uCEECa'*>cHG$^fP@j{-N/dO .pAAqEߞkq6}uBǹZXr^jAfԬy_(m!E*ŽQon2#zм2`N`v:I17rrߌ˺} MAt]Tc/Gɫ)E8`/N) A*1#{ߖ ʴizkLǥ0S"gqD{IK)UI/z`F I5|436|gdalautotest-3.0.4/gdrivers/data/single_block_32769_16385.jp20000644003401500001440000002314513614004466022767 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdr@colrtuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|jJڿ?P+?@A̞LAasoclbl gml.dataasoclbl gml.root-instancexml 440720 3750120 441920 3751320 0 0 32768 16384 x y 440720.018309988 3751319.96338114 0.0366199761970155 0 0 -0.0732377174244736 gmljp2://codestream/0 Record Interleaved jp2cOQ)@@R\5B~~~vvvoongPgPghPPPGWWWbd%Created by OpenJPEG version 2.3.0 ;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +;PTa0u $%* $% +1x3B,81gdalautotest-3.0.4/gdrivers/data/byte.jp20000644003401500001440000002400713614004466017755 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrddcolrDuuidK=KCզII*   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|jp2cOQ)ddddR IYiy\ HPPXPPXPPXPPXPPXdKakadu-v3.4dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -39.8, 4.0e+02 -41.5, 4.2e+02 -44.2, 4.3e+02 -45.5, 4.5e+02 -46.7, 5.0e+02 -47.5, 5.7e+02 -48.6, 7.2e+02 -49.0, 1.0e+03 -49.9, 1.6e+03 -51.8, 2.7e+03 -54.5, 5.0e+03 -256.0, 9.8e+03 $XS   +E>Zb[j'wΊ £Y\Ľ6 0I G@( TzǬ?0.x  @UUlFƄ?~Q!#DL`|KN[FyAAKT`[Yy+jx056t2SA{݅0nsSr1Y>5RX XtoDzQt 4Қ?_@5p<@G:\|)3LTo֬iRB_Gn#/6P+:^҂G0N)ARԪܲ j}*k< zF]j(~vD!bNzH.Bv8L] xTLg\`>e.)a i۶fvPuL?3쒞`pP_HlA\:6RB@y}d Bob<{#NwV8}W0'z ~ %ŜP֍}i$!,% _n/ @qi'u0k19ΔV.B'HQgr[d[ep^WFAP7pMD7 )/r*9>'h! ڽ;Qvޜ[,\Fܐ߭|Ӥ-I/ǎ@(ũPjELXQ@LP59+xdJ’AAH,(98\-#{ؚ < Ki",-V~x 'i|X)i0k̞48ۨd0`Ng`^Ԛe)iݑ.O#vƧQzh˱5ՔNsvQ^ҷB,)ʅ mH˜x!-<@T㚪,!LE'D)aPImĹT4Sd+cT;H^"d5qZL:҇ cb(t(y>]ɘmF/Bl-}A>L#Y>FRAGHC/5wa4 gaG:2AuV)DŽ{ħeulF(kYsE%)5N,j]ܥbz@<̘\SU%G 9%=^:r(De8 Ʃ4jc ס=$Ly#q 6iQGeR`f m%T2ӄgtwx &!)J+IFy :x䶦 VgZgJ+|rv pC5$JvD?5:۪ӐՂUƶu~0Yac9OI>]u_:WעRQ#t~U[u$wc0jg˰QS/ Vș9wA|e:' &?ۛo=S):T@*iO_2 HƎ<Q qpSnlg7?U HVXnBKy4SFs<)r+@5($2x{Ӯem_&XDl#XDRcoc VF;fAVl){6aK;V,R/ϜGFGGtn_22t&isʌn܍T%%F+BlD:eJŐ{:vG9,^|rrk>1j' +_0n"yrbY4#eb}$Hi([}b㭃 =)(qOS &L08kF0NoMjn-?Y)GItgmzI:E1ʀǯN orp ~ }#福 `mfwyZ1 q0>H\wo_b M RzuJÑҪAȪIOᴼ %33[R|_6 Y=} ?48~o .U ] kt!͂ڲWfbu&G%͇ZM111h$*rJ9_2vZmG{HC[630$$^mO:54{VŷWq4?QSNWmPo 0 y,*2r](S$Ucpˊ꽉-vEԙflˌpC∼]Jotuq?U%_f^QZ>#WG[@ݎD|p$2_,k{8U귻zK& &XLfV(`=Pl9辂e DHNՌEcr1R__:b;1n03PNe/OzQ082^/F{v]M Ο$ R9q@)B#CsAiBTuNFUb渣DoռIl-XU?JUAv*b9`&ȴJMPtjxv;*8 Vق}7{,^0 v$LÏ؄jy$]8K7ĉ 铄47q+Fa2Pq@#jjR34)xp8 |⦛yq뇦2SY`3*gއM G B,mW&VnqfkͪvMͽv?=Ʌo?! XJp< EUUUJۡ qhSi\ZAX'P$ຍxe8>5½1K;䖟.=%={&HpY(<]7yX`'#7}QG|[vklsNM<~uNr * [yBۃ|RC_4d_EGᄪ\IlH$qŨ,۰z- 85@[O,~,^TFyPƼ/ȥ+Fnq3%V6&Z블9XK *`|Szy`:GG?don:-XWZ_jfm B?`o;IO,Tqt+|t9COg/BߪwDpcWػR#(4`TPP]VoW 8qJᆋ$R*ChzȪcFYo>$y}Z&J+*Դ*Ǩ G8,;QRE)-eRf갍`Ux\kz_rڈ1?gOjٻQX3燛^{r $} Щ|(V/̨-`s3?W4h^:elE(3ۉB-j) y @8#cf72Bm-]WyZ0ntƫ1T{oRo3ĊooӢlx.`n-G}p!\S*p_=*wltQQU9.SlYo8gE07sKX6 pHb+ǜuQȌn(HXIl+%d 5{(@?oڶT1FY5,L6NHJþ4_0=acHfqZ*ވ)Qu\T޳A?/c3y}-kHtueTqϪ;8,ͽC_9*=n}vk-\bj+Qx`o g97kOZfGaό "ؑB? Mw >z ҄=t^Wo %X2h/RUos-[9JČl,/P`<sl_\/s˧/Kŕig4sKcz/R ՏH#!g|ZI/Aڦnm]y <i+o Zn/75.!kFb )P̧Gխӛ[;ݙr!!iZx)`}3]xQgq?"4퓣J7[^|ZwHʆAB-8^ {/ >P} T'ߥ.J~t 䑘=bXۊJX_Sr̘>ZVCA#JU"X,&bӜjE008g٤iZQh+eXT6O̰@bq%Oo};֠&gn gHjn(TDU edu4Qk w?nڟŀy%8dI-ln놤D2T,w-*? 90& u=Α0b-'P+q:'"kz/lqL?ʣ3 v-"U;0VB:&%%ڎ>#.$gѴr`|-x|]j!LT+VI3FCnkE6 `9ZG=-*D@f"_xɿ{#*M^e$@^t'˙iNT?=O!*?PW_y 4Xš9"XVPtXGxZnN4v3/T&<AAA9Fc^,QM!nθ̞/;.tY^";br)|֎{=@ sF_.à]=Ѭx!\tp׊WYxx|&X>\DR/s DpM9$*J!"mU~R|R_ʙ;ZodG*?ÿo_-e#+.W3uDHcyilnQ/i꾅2(pf9_Y*Jf "gޓ Yd iE] =: !:]ojV#-WZ@w<'@x hJjEWx"{jȖ$ˆ*p1g6/P8(3o!Gl21C^_lM p6ޙ}vN;4/9r1eP!j`-BE2n&$"r=j2P-Ƌ{+Qt̃4ND՜'6=l\iZ; dPN 藼69B\䔿{&z8h %0+7I] 2njh tm? =Nݬw ϡZ]3I~P `K틐$<\i`рK@M̂|f2d;NS |PtkjѶpÛ?M7_q/uma=ׄ]1bUj0T*h~̅EصF w^ذ"%)`VaHR;_8+j,7aʣƗ7V'~H6pc)F Uxm饦Lzy #Tb}H?u\>@6_P fyE5KPZkծHk39sfe"9]8"l'hG~wFjl\?Z(&*aƴ窦^}D6daޘQr&ZpxmGD0BMI}p.JP˄*{ u37cƕiazRXWkt"RQsqS}LtGZWAnx@{am7@uKa 8rx>U.~5:Es;쮻 :{ͫ_LŎ?I`[z"c(P spprjhjf>;*_bN2#FY4j|g!~,lHXpeF5G?!洚xkrƈos֛gm6y/@Bо 5}䷤G11"Zy/]h%X1/W%ǧ#ЗxZhpz)HZ* lXRcOt4G\2[Xfب?Wtp!S 4[]Riޭ'HX$)T'/Lԧm QA&ئZ5菶XVvl/#uzũp(vد!wP2_TT@RqĖ]mЗ>5k( GGbiQ3dD&t݌֞ GxD Ճog[⿈`IKuppr}Ħmp' qG^6 ;4L^ąq Zڤz~6 ('VZ>.(-R3ʑ0>3[[mqyTIxfV_.;RȔ8ZpdZxh[k\zV>?pwVzk <3S5չm(^O)|׭V?|_[A{h_C@C)zʍCtfQVSSwNC0N;gls^_P,֏wu_=ֶJѓg~rׄ20Ob\Gv=!K6cf_[x WY-U|Vʀ u6xclo`weid em\J ƚ|6_؊s(z9аL V(T6ஆb(E^u ώ;o]'ILԃx9^m#!""N6NW]iE.8tx[r<1}'i8+x[6C&}4G~^ {r(R7]ҏ:h𕋳 x\_|"@-$6 !aWI๠:ã4zU/j:}Kb<(6Z\M>eii>!.)<(G6M9.8#mr xF/ ws^lL }Sb-BSRp7*po/bI7M}0=ӽԟ"  kU*sB$R]K5x\׭AXU!V4jVi^30!!"}4n֤?P-Gime&G1vhRl48aaUN o.ߴ71&7~/)QjtXSxw nZ1xDcTXM$ H.`hC N\NчDm+1)DHTgdalautotest-3.0.4/gdrivers/data/test_ogr_nc4.nc0000644003401500001440000026343013614004466021316 0ustar rouaultusersHDF  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.0.4/gdrivers/data/fakedoq1.doq0000644003401500001440000000470413614004466020577 0ustar rouaultuserstest file generated at hand50050010313150000050000001.0001.000gdalautotest-3.0.4/gdrivers/data/pixel_per_line.asc0000644003401500001440000000562313614004466022066 0ustar rouaultusersncols 15 nrows 12 xllcorner 0.100000E+06 yllcorner 0.650000E+06 cellsize .500E+02 nodata_value -99999 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .270E+01 .186E+01 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .614E+01 .931E+01 .868E+01 .200E+02 .266E+02 .122E+02 .313E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .162E+02 .542E+02 .944E+02 .953E+02 .977E+02 .833E+02 .505E+02 .144E+02 .209E+01 .000E+00 .000E+00 .000E+00 .000E+00 .199E+01 .170E+02 .784E+02 .173E+03 .266E+03 .332E+03 .264E+03 .230E+03 .120E+03 .415E+02 .941E+01 .801E+00 .240E+02 .000E+00 .410E+01 .177E+02 .116E+03 .303E+03 .562E+03 .756E+03 .759E+03 .618E+03 .309E+03 .171E+03 .603E+02 .792E+02 .254E+03 .242E+03 .483E+00 .678E+01 .529E+02 .212E+03 .585E+03 .108E+04 .140E+04 .128E+04 .817E+03 .436E+03 .219E+03 .275E+03 .890E+03 .145E+04 .158E+04 .000E+00 .307E+01 .162E+02 .141E+03 .435E+03 .862E+03 .109E+04 .889E+03 .559E+03 .289E+03 .296E+03 .116E+04 .245E+04 .332E+04 .309E+04 .000E+00 .000E+00 .516E+01 .296E+02 .128E+03 .245E+03 .305E+03 .223E+03 .119E+03 .472E+02 .517E+03 .173E+04 .289E+04 .345E+04 .309E+04 .000E+00 .000E+00 .000E+00 .266E+01 .107E+02 .192E+02 .146E+02 .182E+02 .805E+01 .378E+02 .442E+03 .165E+04 .274E+04 .280E+04 .214E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .528E+00 .000E+00 .495E+00 .000E+00 .706E+01 .225E+03 .123E+04 .210E+04 .189E+04 .105E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .844E+02 .405E+03 .752E+03 .430E+03 .244E+03 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .577E+02 .350E+02 .196E+02 .503E+01 gdalautotest-3.0.4/gdrivers/data/3_13bit_and_1bit.jp20000644003401500001440000006462513614004466021731 0ustar rouaultusers jP ftypjp2 jp2 J2P1[jp2hihdr4 bpcc colr"cdefUxml 1208.7849934895819,1517.0096028645819 0.0000000000000,1.0000000000000,0.0000000000000 1.0000000000000,0.0000000000000,0.0000000000000 uuidK=KCզII*(   x'?OUU#@OUU @xThis file was created with the ECW JPEG 2000 SDK build 3.3.0.160 copyright 1998-2005 by ER Mapper. This GeoJP2 header was translated from the following ER Mapper style registration information: fOriginX: 1208.784993 fOriginY: 1825.009603 fCellIncrementX: 1.000000 fCellIncrementY: 1.000000 fCWRotationDegrees: 0.000000 szProjection: RAW szDatum: RAW jp2cOQ244   Rfww\ xd ECW JPEG 2000 SDK v3.3.0.160 X>Np K FI($[F. JAO} >4 : htt-ltuDRo9S͚p2٩(Z yorZHK~Ya DNX}{$>4)8g*)%Ư)V|*E<3Hy"BtV*ѪM0\]j{ȤZ4'Q*ٜVRsātwV30cuZRtۨ|C<sQb/2"TriTCN@WXQa1~BsWё&(idOmES@]6 tWF{oSl<0E]TL@WΆ!9LL(Fv83sT-:PG=!O<`W~7u;`gQ q!ofߝ  D`@#q4`†K ~]IrXh~`V`-ݗ٤gWC1_ܴ<,g x}AC0D@fqUPQ\c~#/b)Hm ZZpG'U?GD)ۃF2k[ Ybyl4p^5t)S.ڠB$^ppJFYQO<}]ݟRsX;ành Q^R *&Bdv3N7CUP޳>DT>B2WQǷƒ *C.;!/hGeKˏY0p3ov;boa~&}_"ʈuv:~׹I<1[H<}6k]ɒ#Es+]"~"4#Jk*BEɳQXh!>?)+5fPF{0RݙXƧ.~T|#58+ĺi@X#`TFR2z PSb.osm`MHB4&èld6hW^eD\ہbWTjZs:(]()aSX +h {jp :>󐫂>'Y0mѬTUrK:]3݆R䇦c/tyzQa캢&nQ&D#1=m.Y0w)k ;|Uɦ'ʸtڂC\}j>)pu88߉r񥈵jTĸ63薯2\0qQw*5nk Ru1$OE[^*zHBR}.R$HْDP'jBC3?H7İ̎kΘhAxa=&7@o> _/Ƚ';+XKNIxڮ ؠ8Z\Wgݷ:_Sե —+ 5ayW4RF~Md޾>ނp&t(`y^qjKo lb䤥&3Lx<[iA]ēSHUG2#:h/GV(a9/Z4u xEXatM)Pm@~f5],=ǽPocZ j@lBIF!R=AU*1g-?+u^qJlޞ΅wEFp*pQL~bY (!M OdB 0֨A\I!_v0'C*EO'a3Lhj\Lh3lX<4=p-! W "&6zt=i/ WGiH ]ˣ ]y7ryͥƼN_ů n&dYid&pJRh@!30N + t.] [T\i$hPb59Uu$>Wa@dz4ҌNԍښZ"Tئԭ<}nوȇO#r}Uz*jר=.2J*@-՝Fx[lma1;G9fsͮKDW̉Irg27>He= *Y0: ($ʦ IDO=eof5&vG#h3f lq׶FC,|b>HƎ"3u} -XrCBShk[I cCԎU$^վ@l !j5,ݒ9f'k_ĦgU rqbu3zs@UPM4i˓cğ~/amA2N' \ޘ]s, ->8nk 0(~` 6&y)g9)A_\{7 CoA#h0pe _kz& kC9n$B/%PR)e}Vr$\'v`M V}/^ĜL}/@,&VVdžlܔ{z^ó^{A-monr fsq5%%_Y=lZhU@^UU0@3DCCHB z .k8?d L/ƏC6d d[F,B=HgtsV۹Aӂ1Vd;r:4vf~VU0V9bάq?JQa:6Ӛ+ ֓|Fcܚz}U$VϺS=b,MBpHEK\hsYj\:6}c1:`{sN &tkYz5'.':ے]͚҄JFԭ `SN"1Rk",&a^pRo\ }rQƖsc^HJW# FML" 1hys9>Qj b@LأlPjsKӢ$j'XӈAJoP=bpR&+gxFIhQ@<g?d.0KZ^vSz hҾ7"\0z"a9GyrE"` zb>N ܶޔy<_Oh3)q2FSs/yѢc{5!4%obxLMB DpiΜe&vh:`G[9pePltmY#DCZ2]I5J1Ƣ4I TGSXa \ywcs'Gu }}|N턨>Bğve[`>[l2"nq?P.jzIɢanU(~%P2O3F#tyO0,:2GsxqҐGpUIf +M[Ӧ; iєm4wIfwJڳSPNpz7|]Lf.~U*R72c Xn7ijD')Hψ ])Vr"}z=oF AѭR1u҅m' $%ÿ>mbrυX?VG@9"Cq10!6QFP]ھu'i%$ `b xfKxI G\p :xuŖMre2bvC[usPO_ ziY}o$weSஜMl5# g*?H! TX4EHg ,Ԍ|j[gqa H*"qUI>Rw'cNN^̀V+qP5>N"[o/)_hZE #.yƍX6sm88. @귵9Q^\+oÀpCaY R2$scoiJP_JͮMurٍpELA=_t[Fǃ Ű鯖\ٹZ713Bm鎋W{- 0Woo(JL<ȆM,4W&g>m@a5]fc1<;~O:7~&f=ko%ckm#U>]Zf6%1ׂfcGUYirtC8鉌TqbVYj)ؙ /<ھk N]83G=_3^sZhi}J$,^ >l:\u$\ FȪ$D_7ŝv[0RgXxm|gvV7#Hnd'#^yE䚫,' >О~ ?xJ1 ={&v ҈q]58E_s4C1xIE@h@(s7!Uhaɱ "$lۜ݃7X-yU%QG `bAzlv6%3 jE`uӻȘNK~Bf>JDi~Z7wX(V 8& ZFW5Dx G[5a [Ѥ7g) qik4T@opbќwBe.㓇 )vMEab1^﷭ܭ5hxge:-ȯX|cvk/\bGcԙnLJB+U#08f?:>͛ȹ u;"nQk/RhQ`G'T:\-&{<40Ӥ%=]R_7e&Wbq tY9,$yFq b$(ON-$lc(WKM Qlh~ҧij)3*}$?5HS.7 lqnvEmw8S_hhIx|go9T8<^ٜr;`E:0h?i]hd< k4w@@Cں 4\3xHR& yiHRÝ4%H<zc N`)"vX]]`M-ޡڐZy_i~ gĒdۼ:ȳ9WfQ(EnKע40MgsOi-KF&5-SpޅMnHvF Kj=>At&o`SC wf"sBㅙbsٰ͂TJkL[mQOăzcix'4[?(a}FZ32qrׅU{;5¨Ih>A·6^Ǐ6keM)0iBqX|@98zr<" y#{B<`-"GUk3RKge`\bE(c-~^r"d YnOn4 OXex@|nϿie]4:&W4CRo}'&.S1:o I2"e/UKW*kCpu3G g?m@6(M8y'ۥkBmfyhO:Ǯ7d9ߘB,j1[K-Q\rg (CPhgalWJ{M)\bIO0c,!;( U:eWa_t*4Ηݴlz|,Bbgr+c/pH.9=:ʺXc#"D>1fO4~c.V`\S k)Wi~WJ]N^v$L1$b0UeؕFce= :xdvOJp7؜@p09mW> cDk_(8OxGXQε;Lw<;CBή""@n̽tWݮM<&L;VI,#b%EKӵ>qU1Myu 2/5(*`w@7V8Ē@^VEyen -Dtjbb6J~9h2Wof%`_{'*M ~>z4KU쓓"P^=5^T**|X1A%JbY8݉`G̑W_ڃ1F*YGfdPacD*8d9-|A%־ޯsqtg﹬.Ƥ^~/~jyGlBr{?2O_IID#4kU8R3$wJ:vW,۰3ʾ\?;'{JvS ' 9b^pYwъ4{ kש |d_ J.& =I+؋_l|,D`[_YGLK n)|O[H"ҞIEF *fkKtb|>Ƅ7v=xq<唙$t#_rneCdg=0 RY $\F,/M*|Ny?/*Vr+9Z1D@~^9RRZ VwrYZ=tWD*7 c`\eݙcAvWh$k"4j.mlW"s:ֻ_c{죲l͵ʇ I1Lg.<1~IMM'Jњճ/]=*q/gq0r˄$N;D|K;g P%¹6C=(z$uTx`7eHA]:0:ơkQռ' rzpAVXf VmaϛaK c)ɲ knEAt9T~3=`Q I*,)Hu $ BX5]/'~IxH뀶mhbaVG6QIU jUU|3 '1EO"AEŏj:yFMćpz {]0Lɦ#d!SX$Tc>a.`I«} xD?;!/.KBN"j~r{/2td'lGWJ Aau/h؃g&kmc@%w;fs[F qop FLҾ.(|ki 1j.V^T-8u gfxН%{ m4/lم BV7`L'G]+q#k$}D`Mb*/v|QQ%y:[\xE>8UAt ?WG|јP_OdСSc2v5(v>7DgZ#vvSн3.0 & '"O "ܰ>\[x聃CZ,X cC?Y'Ie~R]CR=GJ01xkPotՖ+Yڤ3~o =Gڳ bH LHs}j+ߏJOZ %<+NJtz(|S~;[S.?@kzÈ+>gae)I\Cc껽E& d%@Y<$`;~IX%JpE/ꧠԨ.CG=HdIP޶k* Px?K(6 LP#'6 RV enH}v/$ 4CkaYHIC~BrBlH:c}4J+#ȵ91Q}ƈP57oVAqrȿD+[O%Ñ[ X.љhviuCs˨xy`;Pys8%) ~L:l#ڷZ_JlWрa0>^ߢCxoV塃GW%^FwhltZ52,jdؑ(FI8>}Z^0T#ϩ`W{2&Zoh=U0R+qr*"K !c9 0*2(A_FXu;+<ΏCP]X*KYk[ȖkamQT!O3YY\2PchSC lɳy"k_W{ovʾf!& X{V.QԴ- /HNqGP%[ f߅ F _zrY?\2<_gnP'6Dw5 ŢssJGOZTAOgEc[*TVa=[B⺂_l/`?< LݥN!T&%̑*W`}bp9S'ddꎵu̬# + /yڎ# bb"YufoOH$uVɼ3  #\KJ_B+^!-sMmPa1 @5xOޢC!rmŨ;At*"u#<K3$WeL@,,@s] /3b?x#`? GsW K)h K`0b!/1C @dVy\_>b-%W}KWÚ(/wT;whSG@Pt*h}WdB_B^ 4>>˯-c 2|( [#`[%bX֎-/o^pcM<>AE%Sr}F!_4&foSZ=) TcfI5@Va!/~ $% ߀>ݿcOֹlܧFP+'_>@ȣ(1XXmOyQQ(`t(ڊ.uie-$=v[aPQ,稯kO/Up={ d3l{B66n&6{nVw>LsH}{}X$kb"Vo3x(Nٱ>{E[6b K&9*?JhVBAhk+`]ZfbrWsDq  o: A޴ #8n@nq◧amIQ?5SdsV-wW4ٶRϕ;U 4_hk|8#pȴm*V&- /k=`yk:u2ES,bT򯔨(MZ> @8JkbcmzO|Hpk$u"2>=aE'DjVoA} . ^ډ赠ܶ I_mҟGۛB8JAsůSi(XF`*AVR~e™_;/UE;tq/\bѩbB*/ ʶ-#?:@Nb1Dd qK6C: JPU,x_.kz-9nV=MzAgdi E%Tvߺ ɿhCXD6hH]g%4&2iU!vAhB@c}S"QmnΜ*++sZ,zʮ];c~͸ͼh5W 8{ bJBբ hh~'2 ,]Ir(1?'0a!/ɭa!/-8ZʐVk% ;U* m,*fkbo}K_F@}OPqNq@& Nxr|;)A< Fu5a#d8 4{E"iE<]vyu?xiOeuYA CY1(ݹL_\0Q $%n{l" t^&K- ).W&ʦoHs0Sp>B?+Da`H᪽ Hɿz?OHDFgЯrI@6u+Y“7R#gk{n+oߔ?|HK~HKfHK>zNWC –Jߥٵ+H_-5NX*rߖ(" DpǍ`&s-kHZO6D +9Z¸!-YM̗B2,.Kl5Zz.*\+SM^(Ւө8;oTX;n̔vmV};Vɣ^S5]$_DO=1(^4Kid} }c6Dc4'u ԌF1W 9?6랳tWda{>:-ī\PMm&r-xc5n_0b5 -çpQ.5%D*&Q&,#S 5< On.N(=P` :sbyWUӔ:M*:6p?R7mX)ݽah Atv{Q pӽo38NHN:H/Z&_CCf#pQ4UG>7K!ۿZA~r'mH2#t *9qiшE}oωQC?eK5Cڏ͑xRI56M#mRmHT DX7A!8Db(ju]lO.郙&nU*jS t%m_1ןP˭1׹lTsNGV][W :w:ri5F;m41}A~GF12Ȋ{m׼ .wЖCO_zU'ΡB0.Qb{[/8#З;lAt Lh/vIơLCD \M%$VhO>sq +&mQrEc7jGfqi8v 0]=\}?+@c۷3pB55~V7;Ђ: C d`x6 A_Cmg׭eӤpl9~'[c.$ V.K}a6ÅASwE\4 tsK ڳk42AvRkN l=#]l? vd.-R$p`_|XM۳ +j\x;U3{=<MS̜yq7Ԕruu6yGp{Z&*Z <6bftÁ'( Z*'2r[7l|Sֹ$f=#ilҔ+63DYE;$x޳0UTܔT%*& mO/F%XPӆ#2_?Ia.%qu4UA"S_&4e<[t!RJeDc V(@C .L}K)aKioUvvܒKaKd=*`<4mEm;Wa!/_DS<·ߠ_ 8nhص"C!ΟMNCP!jx0S2GdCml|XN`0.c9Kl 6 UC{v0ћ}1^&P%Sf(Oйn̰L[7N::7(J+]?&ص8j@? BMH.E<[XK oBʰ&GIw/׈d0&p)_25ܾTzz .VE+׍}@^/1pZqJBD-͔^9} I}xѝEt5,߿e)VoQexv6c·Ŭe*0+RwR(솈3v;$ $ͦ6($i᏾}9?C)IZ'L-*{ h$ɾ)ɢpB64KR"k+r0/=Ma<N0"Jz $ZAM4Smv(VLAj!Xۡzgk^R+j - Di/ 1qe6Wǚ 7cr RۅLIjgsH+uDsM7XiΌ;Juw|*:.?͗ؤ+xxmg v妲W´IE'<[E 2Ap$<6쓖+,a!6"BPo?6Zx+w.a1z9/WzcgdcWѼ'sNa?y^SCuU2V|YI"K ޚ\HeϘW(фēH$[XRKʘ ~DMFWcaE+BR_zn tT e^}P2VT D繷P\lϒ7Ǡ1Ð(e6qQV/%YZ-$B'I"gn|٩*Tߐq~OMed㸱K?A y=I43YpeLwkLoG16I0b8[/pk؅E1>s W"QvCWFwEVX)`#ةS)vi %߭}ݭOҷ|1~RJ/- /D-|^JbyͰ2~[H1K fȜ,J> `ݬSvO}pe6wQ{LbPnhEB?ā.D|08c( =8]ӽ~Hvu'M_,w|Ґ|cCwU|@e+ա(A ©D _h@%U#}ֹ# PbAPK\ȸ+Fm*Ɖu;#g.zN1e>W  6LHddJoL=;j+<}=<ŢΆjžhP릀XD-x#C KWʥ7 .$1T)KYѴ>ת?|l4eRR]Û |Q3ɋͿ ]Z=PA([ѽ{P8={ٓtdS-8FAڸE<a3S3ފ[2zHWE`˟4IiN ] o:S!/yPx'Z.k7$آwNcB{R`m]ec>gGL׊ۅS>RNFDxlLRqhd7C$Un5:XXYeD 3pIX 6!b*[ e.dt;`;hSYz6JFaxatpj)~0`r5U z? f0x!\HCKͼɲtj ̟#n7~]5l;⇣E)T]Gi蓵 Z*2Po d7xnw[\1;,[%'^xTH층`&F!|O VA D2|Fv'!В w ~&Vn$M XMdmٯ~! QE`{5hpgMP#wo6dƼ=e sg9:!*tHdP„~l~M+ Ė;p[59;pt EmMf2 8y0uwx) KPk1C HݠА>nSt$d C35FАn|$I:W i58%g\װz^鲓Z9?ZܞTAĿeÏH%zusmQcȫ7;sG\'"|/@8|Jʮ;V"We~g\f :"ߠ[g3KjUIko2FUƧZ&mrc!8(}#ݬE@-rDȤP6-0#0\$-ֱY~yfZfi.CAх/(x (qc4{%!3#_`E7A&A`é+\39QK~B.s j5T6y^ /xr.Kar]ֽ0-ڤb ŗwH҈. xhW kiR6뮿>ڜ)$Z..4ӒhtgX TP9 b>فY|D' Ⱦ^5-+`M s$|y{ٟeSOxGɻWS5dI=#o4Wʙl;Y"A#AفnKDպaB \ ɾ騗|Tc РIr2T<=+ŠIB-n l@)e0(Y*Xu!((Z 8IY~|"Dh-8,3-e`ѪPg0$H-h)=Āx!p6e޹ERjUe`q:['=,<Ԁ_c#9 TD wSQ.yS"ZG/b=6,受?"N>` #r4)M3HID0d1SПҲ"ȯY4LƁF̌]ܾH2AsRmalArPD Z^Dȃf^}z=VHȖk)Y <y;<ܤL^Fp֨yO+cm`~Z=tj}Wyg50n۰Y > hP"Z&1QwgW U$\iw(RMg%Ǽ\Og-eץTݕB /¹3(diq+,/y$d"A&صcp۰pՐWԆO. ET>Ϧ0-%;VQpJ0,n--It3=}ɂd4BPvܧѠ)~^\bS6+_~ֱ )r.rԃqﺠMr .OԂ)W3IL>^^Ujg v`tو}9slSs7@xmz66kMksllG߼YvtX'(M;Sz-L;1^ձ嗇XqwmŃ:##Փհ#yZ~!Hl)'(/w&˄8-'EɡS*br#~+60^؞r 5԰iO1;:,(nklhqm"#*N#1?ZtNA04-7N4gyEMpr,TnTA(4Ds.ߙ7lFQ?Fi njjo,J&}D,+1oJEZz?Z$w9wz+vNaPxdÕ$ +î\tS'_3`KugIubKD 7O^Dw70 ~ZC3 лVO{(=WqB)z#{FB*,s- m*PEli$JCuNrp$c-ggӊ'oLuM tx}ǩU@b+֊iն)eX<3^܋I!Rrǫb!@i FQ%( Ff0޾ECX;G4feۭ.I+X۠yX5eݣ, , Lj*0zVT5X&!ojBUzeRo [GEqn5rBL=01|z/D6EpcBvߛ(,k)=EE&ޯ|M#)6qAEio9[Yj݉,1KO=r!!'i0ɚYX>!)mi܌F1ҙr 6{ՕiG ]Yl=X^x*q5}ǐ9_* (i4\B2rNE\/n !D-|؝}b1Unn3 " JM$K7PpG ˸DϣA, !3-t)k"6w<}W|°ט:D>5,m2$P}5F U-'\oDz R11/]j\S^]Zo>q>1A|ru){gdi}W8T+A!S/O߃q5EW m/kF6ho;DAw]m)[s /ΤtO qs$I2ER7~Coyd4&/韝h~TOHVX 1&Z(xti/avR6G_g?/opT+M!c8~v9MSq@LÉ=yݠ35?I+`c@47 .٪uImK?,;ߧ~F,ZsP2H&=Ggp˕a=p &?F7OKɱO&Az)"[i ȳ%t Ě:{NPϮ_G`>,r`\Czs5-`D|R5:0"TA53  "w]ӭmfKӿmla1A*#_xB!8t_GA_`R6&V:Ym8F2|3t~R( w"+<Յa@XКgC}OG)T.nu!Ȃ$02wT": 㤣~>~ ׳L؟8m\%.zf,x,Jp}`ځT,Aq8YY#C>|VTpjIa,>P^c~4d@dkYU%xMc?`JxᷜFKt&o j"͏DmT~8 G MťɮFptm%ml\+E1HB@n G?,Ql/?*A@薻l%`7 dI€ PK^$صS`Z@67@3$,Ǚ+,ShLOW YxBŕRj*6El UzsK50To {*f.N "y v ͎RC?e^LcXG%x'ְ^~s[a 0,YWhBS#2J1P:,xP1\8tu0l痀iWba[szc/ؘrJOYs{Vt[wc $Ȩ΋r|7R-R@kP R_6V`ٱN|Oh@uaɟǦf[;-wGhi]6EEvˣP 1<$Ål5JH):ƿ tvnUg€Md>SBbxR$~|y~ad{fnPD~ujM00\ߨVkί)R%(K"+aڕ -^w;c:|aF8j q},~-&`!Sjn="Ӟ5ox)Q+He6# _DyFt\OͶPOh?ii` ɿޜbO2BoEl0%`gdalautotest-3.0.4/gdrivers/data/byte_rraster_rat.grd0000644003401500001440000000102313614004466022437 0ustar rouaultusers[georeference] nrows=20 ncols=20 xmin=440720 ymin=3750120 xmax=441920 ymax=3751320 projection=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat [data] datatype=INT1U byteorder=little nbands=1 bandorder=BIL categorical=TRUE ratnames=ID:int_field:numeric_field:string_field:red:green:blue:alpha:pixelcount:name rattypes=integer:integer:numeric:character:integer:integer:integer:integer:integer:character ratvalues=0:1:10:11:1.2:2.3:foo:bar:0:1:2:3:4:5:6:7:8:9:baz:baw gdalautotest-3.0.4/gdrivers/data/test_coord_scale_offset.nc0000644003401500001440000000165013614004466023600 0ustar rouaultusersCDF 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.0.4/gdrivers/data/byte_and_rgbsmall_2pages.pdf0000644003401500001440000002144013614004466023777 0ustar rouaultusers%PDF-1.6 % 1 0 obj<> endobj 2 0 obj<>>> endobj 3 0 obj<> endobj 4 0 obj<> stream x+22PA(˥jhtlE endstream endobj 5 0 obj<>>> endobj 6 0 obj[] endobj 7 0 obj<> endobj 8 0 obj<> endobj 9 0 obj<> endobj 10 0 obj<> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 11 0 obj 228 endobj 12 0 obj 33 endobj 13 0 obj<> endobj 14 0 obj<> endobj 15 0 obj<> endobj 16 0 obj<> endobj 17 0 obj<> stream x+25PA(˥jhuK endstream endobj 18 0 obj<>>> endobj 19 0 obj[] endobj 20 0 obj<> endobj 21 0 obj<> endobj 22 0 obj<> endobj 23 0 obj<> stream xS[Ys"P9&'d@YBBYB(@Dc0mwNLNSv6ƪݿe=S:> /A% X4$Fs=aZ ԐYpͷ`#.ďɒHuh.B*HKNwK,f Ma)A2f\pu*OS$s"/ts B 4f0A@Jܵ$Q"M/#I4#Y2M)/(ѭ2IOƘADrAA#ecsdS. 1,T(u(|8R'Ms??AW ?;(a%ItYu"X٠D÷y.&נs7!mh~OJU](bEL xY>$dM !KG(M,LU`m~z5X7j$fAB@W!Ng=V0b"A8<8@q*01azGvØm]'Ư{;da=kW/&廒kWժ#,#bYr$o)5J0MMc:՜b|܎g/K+mk\V'( H,pz1^4UZg٪V 4MSU i fac1K4 "t5yrIeW#aAa{e4NA<\\K2Ger?ZK<(PvY30U+ Βe fiUwopzrDm5`k@}fFŽe o+1Vt ]- q>C %^8΀T"2G"i*P5) .APpr/_J. md3x l$ {B4YZ?A  WGpZ4,4N(Dmx>ER9!ȦdZC*p,`[g+K&gss'2*2] 7Yi*f0T?DUvZũJÌ͢M8m5E7U^1N-pI5KQGp,96 Ṟr~~SpmTE9Fu]AA}6F%ufY)Jujqo2MQGii_Sa79K+Oy6hXؠnďTH`M̳Ah^wֺoBÐJ54B5"C\=K79T2OƍMr=WKGzQm1և~G>mqc<.?DqDFk7Gy!0IIvHCOH8kdYʐu7; ZNB3\|c*Pt5͎2gM]4]Cu2MH?; ]#2ƽ6mwb f_#|'9qSUc3#jg 3~h\MWCUc~}"T-3fS{䩇$Y7nj`m!pO~5?nv$?(4\Ȇ(|Ec>p,H?[iO>mn1ù7|_ C0ӗg]13B8I5yL%lSŻgNGvJ1 xU9.1(fΫ@rc$G2/cvŻ)6hboT:-suܺiIc'Wi|H~bZ 17Æ]D:UJ]A[qT45sLwݐCp=l4n0-%#IT΃PeOp̧-FRcvIZqPq}8xҵә[ 8 ѿI~,4i"wsHe_ѦMr;pC_ D:eQH$O-'Ԑ3DŎ;=O:/ v$9*QAZQD[\U֑Gˆc}ޕuJ}2glDj|ZMQeRki7#X'v`ensEWǭmd~Boӕ"J:]5L&ascjAIټw.S/涺>儞s'5Za!%6)2=IJzR)4Z?1cGT ޺In2m]3{>%w7Yz䁱HKu9#F%ZB5NA3xAaz^ѝOI#fH:w:ԡ=4_ TԿVihYw(DR3 2K;AŽ0^`qC 8ogpzcő D04]d!O>g;Ψ&?b_QT-qޕ1-NPPsޙ&JRHjK&5.`I4hـab']H%b'G<:M7?wT_k/',11rʘdTYֽ˒'j-B8u*EuQMe4V)UJfQv@up.4Y@CNUlVl{.>'>j>oNP."N|xMgߴDOw^8T~$p3;ByھE[F&Uɩdߡ0+hJ;yJȳn}DȔ8>y7tv״IȾi p,;mdx1|EPsJ>}* q-p ~CA99OP1jշtuEl. SA`g_*U J>Y,%`  endstream endobj 24 0 obj 5332 endobj 25 0 obj 33 endobj 26 0 obj<> endobj 27 0 obj<> endobj xref 0 28 0000000000 65535 f 0000000015 00000 n 0000000073 00000 n 0000000218 00000 n 0000000347 00000 n 0000000446 00000 n 0000000492 00000 n 0000000509 00000 n 0000000585 00000 n 0000000779 00000 n 0000001243 00000 n 0000001626 00000 n 0000001646 00000 n 0000001665 00000 n 0000001763 00000 n 0000001816 00000 n 0000001862 00000 n 0000001996 00000 n 0000002096 00000 n 0000002143 00000 n 0000002161 00000 n 0000002239 00000 n 0000002434 00000 n 0000002625 00000 n 0000008112 00000 n 0000008133 00000 n 0000008152 00000 n 0000008250 00000 n trailer <<76B8986AEA663CDA71C91956DCB5686C>]/Info 13 0 R/Root 2 0 R/Size 28>> startxref 8284 %%EOF gdalautotest-3.0.4/gdrivers/data/8s.vrt0000644003401500001440000000137413614004466017466 0ustar rouaultusers 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 SIGNEDBYTE byte.tif 1 gdalautotest-3.0.4/gdrivers/data/251_tail.dat0000644003401500001440000004167413614004466020420 0ustar rouaultusersJ488Descriptor_TableEdsc_TableoPA8d#Bin_Function#eEdsc_BinFunction!PA@@@@@@V@V@@V@@@V@@V@V@@V@V@@V@V@@@V@@@V@@@@@Ps@@p@@@@@@0:@@0:@@V@@0:@@@@@@p@@@Ps@Ps@AV@@V@e AAPs@e AXAAAe AV A+AV AxHA0:AxHA AXA0:A\]A4ApA AA(AA\]AkAyATAyA+A+AATAAA AxHA0:AAA0:AtAtAeA Ak!A(!A6!A A#Ak!AV%A+&A A}'A}'A%A,*A%A&AR)A+&A,AV)A*,At+A0A.ANL-A>,A(A;0A.A>,APs+A\]0A0A+AL%/A%0A+A0AI1A &A0A,*A/A*,Ae*A}'A#A.AV%A4#AR$Ay"Azo&A A#AR)Azo&A|$A+&AR$AL%A#A2a%AZ6"ApAL%AA#AL%AtAL%AD#A\] AAA AVAA AL%AAPsA A+A AL%AAZ6"ApAPsAAL%ATATAtA+AAVA(AAPs Ae AAV@@V@@@@@@@@@metersV?kdJd]:>_Q +'f]@??BQC@G0ƿ؊6@AO ƿ.onVCӚ@?? rhc@MbZd;O?w&A+(RADX|@|-3|/Dol^IY?'N@?ob! 0@w#Eprj_MapProjection830{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:*oEprj_Spheroid,proSpheroid,1:*oEprj_Datum,datum,}Eprj_EarthModel830,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,}Eprj_ProjectionObject830,{1:*oEprj_ProjectionObject830,projectionObject,1:*oEprj_EarthModel830,earthModel,}Eprj_MapProjection830,.UTM? Clarke 1866TXA333?XA^s{?fOMXANAD27 (Canada)$c@`g@metersEprj_ElevationInfo6{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{1:*oEprj_Datum,verticalDatum,0:pcelevationUnit,1:e3:EPRJ_ELEVATION_TYPE_HEIGHT,EPRJ_ELEVATION_TYPE_DEPTH,EPRJ_ELEVATION_TYPE_UNKNOWN,elevationType,}Eprj_ElevationInfo,.= UndefinedmetersC!`g@metersEprj_ElevationInfo6{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{1:*oEprj_Datum,verticalDatum,0:pcelevationUnit,1:e3:EPRJ_ELEVATION_TYPE_HEIGHT,EPRJ_ELEVATION_TYPE_DEPTH,EPRJ_ELEVATION_TYPE_UNKNOWN,elevationType,}Eprj_ElevationInfo,.= Undefinedmeters`pe,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:bcovariance,}Esta_Covariance,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:bcovariance,}Esta_Covariance,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:*oEprj_Spheroid,proSpheroid,1:*oEprj_Datum,datum,}Eprj_EarthModel830,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,}Eprj_ProjectionObject830,{1:*oEprj_ProjectionObject830,projectionObject,1:*oEprj_EarthModel830,earthModel,}Eprj_MapProjection830,{1:e2:EMOD_FORWARD,EMOD_INVERSE,direction,1:e2:EMOD_CARTESIAN,EMOD_TANGENT_PLANE,refType,1:e2:EMOD_DEM_FILE,EMOD_DEM_CONSTANT,demsource,1:e2:Z_DIRECTION,Y_DIRECTION,PhotoDirection,1:e3:OMEGA_PHI_KAPPA,PHIPLUS_OMEGA_KAPPA,PHIMINUS_OMEGA_KAPPA,RotationSystem,0:pcdemfilename,0:pcdemzunits,6:dforSrcAffine,6:dforDstAffine,6:dinvSrcAffine,6:dinvDstAffine,1:dz_mean,1:dlat0,1:dlon0,9:dcoeffs,0:pdLensDistortion,0:pdAdditionalParameters,1:*oEprj_MapProjection830,refParms,}Camera_Model,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:bcovariance,}Esta_Covariance,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:*oEprj_Spheroid,proSpheroid,1:*oEprj_Datum,datum,}Eprj_EarthModel830,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,}Eprj_ProjectionObject830,{1:*oEprj_ProjectionObject830,projectionObject,1:*oEprj_EarthModel830,earthModel,}Eprj_MapProjection830,{1:e2:EMOD_FORWARD,EMOD_INVERSE,direction,1:e2:EMOD_CARTESIAN,EMOD_TANGENT_PLANE,refType,1:e2:EMOD_DEM_FILE,EMOD_DEM_CONSTANT,demsource,1:e2:Z_DIRECTION,Y_DIRECTION,PhotoDirection,1:e3:OMEGA_PHI_KAPPA,PHIPLUS_OMEGA_KAPPA,PHIMINUS_OMEGA_KAPPA,RotationSystem,0:pcdemfilename,0:pcdemzunits,6:dforSrcAffine,6:dforDstAffine,6:dinvSrcAffine,6:dinvDstAffine,1:dz_mean,1:dlat0,1:dlon0,9:dcoeffs,0:pdLensDistortion,0:pdAdditionalParameters,1:*oEprj_MapProjection830,refParms,}Camera_Model,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:e2:EMOD_FORWARD,EMOD_INVERSE,direction,1:e2:EMOD_CARTESIAN,EMOD_TANGENT_PLANE,refType,1:e2:EMOD_DEM_FILE,EMOD_DEM_CONSTANT,demsource,1:e2:Z_DIRECTION,Y_DIRECTION,PhotoDirection,1:e3:OMEGA_PHI_KAPPA,PHIPLUS_OMEGA_KAPPA,PHIMINUS_OMEGA_KAPPA,RotationSystem,0:pcdemfilename,0:pcdemzunits,6:dforSrcAffine,6:dforDstAffine,6:dinvSrcAffine,6:dinvDstAffine,1:dz_mean,1:dlat0,1:dlon0,9:dcoeffs,0:pdLensDistortion,0:pdAdditionalParameters,1:*x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,obsoletePlaceHolder0,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,outputProjection,1:x{0:pcstring,}Emif_String,outputHorizontalUnits,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,outputElevationInfo,}Camera_ModelX,.gdalautotest-3.0.4/gdrivers/data/huge_line.tif0000644003401500001440000000056213614004466021040 0ustar rouaultusersII*u+}S   V0X,>@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/gdrivers/data/n43_bad_crc.dt00000644003401500001440000010256213614004466021052 0ustar rouaultusersUHL10800000W0430000N030003000200U 012101210 DSIU DTED0F18 062 01A960900000000US090078 SPEXDLMS2009609MSLWGS84AS11+C 9609 430000.0N0800000.0W430000N0800000W440000N0800000W440000N0790000W430000N0790000W0000000.0030003000121012100 ACC0200020002000200 10 ~(%%(0<:::<BHNYb[]][J3TX_cdgcjofn|vt?}a&}~   ! (!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.0.4/gdrivers/data/ter6test.ter0000644003401500001440000006746613614004466020711 0ustar rouaultuserstrrnflightPrefs_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.0.4/gdrivers/data/cf_dimsindiff_4326.nc0000644003401500001440000002567313614004466022173 0ustar rouaultusersHDF  +`OHDR " 6 __NCProperties7version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.4dimsKOHDR " latBlonr QCOCHKF . ConventionsCF-1.7 .titleSimple CF file3OHDR ! < 0CLASSDIMENSION_SCALEn)J橫OCHK@kO7vOCHK `NAME@This is a netCDF dimension but not a netCDF variable. 15hOHDR  ! , 0CLASSDIMENSION_SCALEnSOCHK A@% kOCHK `NAME@This is a netCDF dimension but not a netCDF variable. 11OHDR    || < -units degrees_north 0 long_namelatitude 1standard_name longitude PDIMENSION_LISTAOCHKloncrsh(idimension BhĻOHDR     ||< , ,units degrees_east 1 long_name longitude 1standard_name longitude PDIMENSION_LIST݈OCHK tREFERENCE_LISTdatasetdimension Ƭ`OHDR " temp" 9COCHKlatdata [8OOHDR (   ?@4 4 h ( P _FillValue ?@4 4 !unitsK 7standard_nameair_temperature + grid_mappingcrs `DIMENSION_LISTG"OCHK tREFERENCE_LISTdatasetdimension B" ,aOCHK tREFERENCE_LISTdatasetdimension " "CGCOLx۶m$۶M$ $$@$ A۶MA$AmA۶AAH8(` q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@OHDR G   % Bgrid_mapping_namelatitude_longitude `longitude_of_prime_meridian ?@4 4 Psemi_major_axis ?@4 4@TXA Xinverse_flattening ?@4 4mtr@ ecrs_wktEGEOGCS["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"]]]gdalautotest-3.0.4/gdrivers/data/truncated.jp20000644003401500001440000000002013614004466020770 0ustar rouaultusers jP gdalautotest-3.0.4/gdrivers/data/byte_no_cf.nc0000644003401500001440000000261413614004466021026 0ustar rouaultusersCDF 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.0.4/gdrivers/data/gsg_7binary.grd0000644003401500001440000000634413614004466021312 0ustar rouaultusersDSRBGRIDHALAN@N@R@o@,GDATA f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@gdalautotest-3.0.4/gdrivers/data/byte_rraster_ct_rgb.gri0000644003401500001440000000062013614004466023120 0ustar rouaultusersk{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.0.4/gdrivers/data/fg118-91.aux0000644003401500001440000001777313614004466020205 0ustar rouaultusersEHFA_HEADER_TAG@ R rootroot?AgRRDependentFileEimg_DependentFile?A ZFG118-91.sidRu 0 Band_134165247Eimg_LayerentFile?A gwoDescriptor_TableeEdsc_TableentLayerName?A]kLXJ|5x`hdw~B'&o*Z2F  R^AN' RGvW;i8%Q ^Gd!l *  $ 1 J9G 9;Owt^3U`3&6bH V+!#!#\"#%D#$z%l${$$w$nF%b%g&O%%$B%N$##V##!$# "!D"!tW": c!~ bX!2 @SWhh}CR<(r(emTͶ`nBg Ew-^&s Q$Q$T?kO<"8LyIE MT |^()w\V='g:4 Ur  օ _ j ' ' h 2 [/BCB"!o4x?*uyJ 6+mEI1o-NH@@ө Histogram_TableeEdsc_ColumnntLayerName?AwgMapToPixelXFormeExfr_GenericXFormHeaderAAffineXForm0xelXFormeEfga_PolynomialmHeaderAll i0?G)?\?? a)l  9iM\Au g$ QMapInformationeEimg_MapInformationderA2, NAD_1983_StatePlane_Virginia_North_FIPS_4501_Feetf us_survey_feetgProjectionioneEprj_ProParametersderA NAD83  nadcon.datm nfo831,.t@t@ gEhfa_Layer65247Ehfa_LayerentFile?A{65536:Cdata,}RasterDMS,.D g] DependentLayerNameEimg_DependentLayerName?Ae Layer_1Tion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,. State Plane@o wGRS 1980@TXA?XA@k{?˯MXAu +DatumtionioneEprj_DatumametersderA{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,.gdalautotest-3.0.4/gdrivers/data/byte.pgm0000644003401500001440000000063513614004466020046 0ustar rouaultusersP5 20 20 255 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{skkkkksckgdalautotest-3.0.4/gdrivers/data/float32.ter0000644003401500001440000000152013614004466020356 0ustar rouaultusersTERRAGENTERRAIN SIZESCALpBpBpBALTW`+`+`+rr%OZ`'=8" 8"""`+8%"r"Jr"8 881%88 rr "r8rrr"r88r"rrr""r"r8r""8%"""1%rr8%8"""8""rr%"r""r"8%""""888r"rr""""rr"r""r"rr"r"8"rrr"`+6%88"r8"%"r1%%r"r"r'=8rrr"" """"r"r"r"rr8rr8"r88r"rrrr"r r8""""r8"rgdalautotest-3.0.4/gdrivers/data/python_ones.vrt0000644003401500001440000000073413614004466021500 0ustar rouaultusers Gray ones Python gdalautotest-3.0.4/gdrivers/data/frmt31.cot0000644003401500001440000007144113614004466020224 0ustar rouaultusers A$ T@)@))?EEGFF]oǗ]gMape8M(ݕ){*]+þ<=yEM4:kbF2ƱR>R˯2];#ZSwĖfzM&ڙ8ry<_~kwuY8|:!qo' )7|ïC^fW*4&! BS>0``cN*/{&O)evz=0y5O 8E>zW:1 >kKޗt\k>onh[K>ʼnbMPm}?e}ٮߩ溵쿵![[4.,W?RҠit'AmZž`O<:Sm/I#Wwpגm<:V8Nha*F0ivuTxuSwKaMKMdƇ-q4܁)*v%m 1>K |!k$9.kbhɳՔw:i4Rw魟ӍnI1M+-|Ⱥ oQ7o7G]c;{j碚=U NF|({$LaZs̩Ӻk;+_v{v|-a?^ XĠ!-1)W<ћ|Haduiq*"1Ui66bGˎ'zOja^ q}%?[ 8UncO>:6{gq+u-2vrR4>J;\jW:ΙG tv!*wt]sT]BKĈΏ4[e6xy9c(|FJ\ܩT7k[:Cxi9PO8Cv+)H;WKZ+.$]KX]WFpr;d{ :tʭ]k;*4,S/ :k? ~5HV#9K 8j{_W.4tZّdqIps pIzM<1F'>Vs[_ JfU=`#U T#'9Qĺq:D!t{o ,2!Cd'Ni]OJnv'?V/D^Hh n#׿Ӽwm}j+A'ђo)*kGTUk"]}5mK=ĞDm3N #8,=JԷ2mq͎{וS b;Eߑ]ju,K^]XDI$'?dK{ywJ-J[Xnw.r9Ӧ.}軭k`.g8{s!Wq0O:g?P~qUNjQxi.&_uu8n9 hMS<@\EgǯA Z=G0ێ0VeMvky*J?2ꚺ[G44Fg%ka.Z8O͝>d}S-Dѽ1fƒB=k c-Jn?˥=OLJg;}?"EcI[HH\|$~f+䣅`7Q[_О9:.NOϩᗰ]C=Ū]Oa ͵@0 נ_}#ڦc a$aNںRz}–Vm+ڧogn酥0Z*rǴ`>{xdL9 7^3:/eV:I+;-\k;}:J%PcW{V^i!€ŏu<+QrgN4TiX ^k+ŷ7A*@?1:n6σURQnY/+%)3:ayo,+L+* #=>>+#T_o.4,{HrJ:!>kѥ꤭g^1t=h>]FHH 1KAA'hP[O-H2  n9.XҴAxʈUI<3OrSb1ңc}Q{=]zHSfYBzjż1Es$Ogp@HFzteZ.nvUq緥z IJ;Fq*iN:KzBLj'-5 n ȿ8`qy.cjeޡxqPX*ʕ>pI\ /~Zc;Oe_R妉;}PC6Ial4jy%c'n :N}$EyrhV_128aҸ0{59|Ƨ'=z}ہo!̀HVh(?6xZSXN0X鋻1(.=x`U8Ս齎n/YZjϻῑgM׉,n 7K\O`uYXo,fn {+ƹOWlrԂHzׯ>r R:/XY}(ImÎ7)6WGx/L㍃BYDyrO8NzPx 0vjyRVSWOmK#t?M.Y[6 Q*~-hzy`=?ZkKd;~=;>v3$Y\Ӯnk#vnW-صo5?c}Xy |șwC:ta-Pӳuc E{|=yiZtڦYl{w4+jȒ\Mckde2w.x|7ʧ%gյk}tc{iSMUe^ly8vriWIgk6h%s בJ8,e歭nuUz_cxk/Mkyi )%m󤋸3!_57$`cfqZw ǭvFNvvGUF$ OaN3=ky4־~?zQi5(ֻm" Ai& 2!>aҵM*U6z < *^H=qjsdpۥt:jNѷDK{}E),L@'\.ю?'GYWLV{KY m01`rO'qbjhԓr{Ytg%5n|'/c|FExC$NvBAu9>\]Vv^--^m%P>~wq5xN+k]7.Fbѿ+ؚ][g7*cwGSסM(C/PS-R+)%u^ 9[` q[G_¸kbIţbyo)c ^;K 'xmkbɬk.ZiE5BLcvyR =8>ķ̓hw+g,M34lN2w ֱ֌gmۯއVhKmtɵ i29D"ie\::i]*oFFg#i#ն[K׺se[1G+FkSF}KEKnug<“Ӗmdus_g}> ~}}7suA`=Om5sQRe$OP>?K2ե%(쬿?#tM+[5n&=;DIR01ǻ(z\cji)ǕJ_#uE4'8%o% {xT-kH IV?9l (9Tq''7Obe)(jwM4^kf:B%'fdVL-j1̄Er ׵sAFsvj59]&ӜkM\ňCs1Ӛdz|U$z^ِѤ*~͗#W0ZZiisB0nOt;+NГ@Q{ 3N]#7-]q^k"k?&0~v Z7nV~= J ^Ii˛ᤶr\叹<wRl9&Ha8z3pos_*ӊKkթJ3NyxۄD($|vR=^Vr-v#[oY:pjަ0 j׵KXқ']vw"j h{1MnK;z>Gu]_i767Iͪ8_/ } c%X]}<ʚ7>!cl4&x lA׃Vw4sMecz nB? ܞK ]GLN;.]KK2^iCncd`6ॲz |@nKf#9Lqa R vJ\ʕM;ZKH[f խ963OWg _lM &G<0LBpn+Zu*\'zEG]:Y˗0wq*a7qY+Coww<߲LTd\ T 5Iu߫uÌ%ѯG=?ļQ<=<6钢6Wʿ=1W2/N +άB29⽚X*H꭪5]{SI/ukmz&i=WYǜ`NU[S4먄zWNz5Nu%$Gjt9&^]gN4ۇ/#" XTǷ~*ūRC[[K#I9,>^ {{jB~UVxWWoǯUOqiA" n1hq!8@#ٿ>-7%!SF:cQ9Jj=htS=+=>F>5槛 9!ǛF2=Jg5_jOdL̙\dRpnp籡8P[ey֌hٯ>W&^0ɠckHmOE%W ^wX}.jzTFFkn'[uS~e pF֚.mx:e=ݴ҄x7;nt7!M0=kc11 V8ʧ$Lҟ-U9-;M}VE+]~Ե[Gՠt;)!e%YWG*ևcxm%Brw&M-Mz ƱYc3yPC84c}:l`\?8Vx;8Υf_:{;="h¯&J2:Zy´1A'?Ҽ4*{9=)'=: niN⑈%?Ej+P,8ʦF0#z*TAB Yk['kфiQ%豬V30ܸ2 } snkp{Jnl{+zjRju+Zzc}qkӦR RH *pH<D5-bKo Cq'?6y(mB#-{gЉ4#h<`dpǩ4OQӚ9K)\SaW7:gwS[ҩR5#@஭%z_lZ_uJb>}2 9.myilHXa둁^^6|k~:뺾1KݺuT9<wLpJ烃9V,I 4Le|` ׅҰOl/uep}6g=5O@I<n@T//4V]U *[$7+ݼuo[ŠVSnO~wVڜ1B Hۜt9R_ VmF+Ha{7iI$lMCt;[WJTVwΣyn5׿wOROZȗ0#%*Ȍ2ȭ>nβ.#!<$. c/G j\߷p|^I~om_oȡsKkɍ$-NC;p{[ⷠm,Xwdb$͑@qJer;+yoV2{ソ: ~!hT&4U";l"sϼ@f[ R[[k.AeR +S;}?/(+];^۳ZI H9̖̽ ${o&)OEj-FH|?J!)ʟ4Z]^W]ʹwUHfz(hym49nz^mZuI%1էy֜)WؑOcX$Km@dqֳTے[{~ɒuquiMS 8g#k`՘CYމk"A~ypGJ>_-/?9\mߧk/XSCRYo/;FOF(Nwń'["&C9EQ2㊯4e;6ݺ[E}581*EwnP0xX`DnVǹZf]ޛ`<oFwۅ殅*2+r?Qii'lugu6so3̾^̹JJ=5a"m#H8y@;OC{sR[y73ai+86[^O{ tmh#NF)% \Lyz⶧*fmۧ8e}wקOQ-0=hveُ""$as3ß$quTye]C5mUr͝}՞gXKgZjVTݸk6989|3X'sМ ʍWV~eIwT[+%OcGTfϥCmJff_8rM^Ѵƹ%7$˴8^7wnJ5 v_-Cw;}&m7)2 ~X;=Nyݤ-Xm&KADo䟘cd -T筿tN[5^rkwWP#|Т#yn׊`@T:y#+<*2w觇t鶬ҷSɒ`c F޸]"ݙ@qή7Z; :s?~wYkɨqKXu0Q8'2*宿jCy 呂t5^'tVfu djߠ:|k.鼵U c;aִ>uq\GĎ=pIuwVkEi#('m ]uե1V9v0rz՝?a7>g6}r:"xyS2[O2p&.Iq\N kuH4ȣd]8)G͖$waU'-te)򴝺Я?V fWb̖k9d9,YI\ǡ:7KڲZ8(AE;$R2 (?A~k/g%.>BEmB/gm-YΡdQG5Z-̭?x)USu{u+bPE}2^xz94G ۀOϸqkiwlG\H`Gn 16rk\: ^J+mjs_ o;]rrxndsUGNhAWc/̒m_xCtXܦ̒A䑀:=k\2\] q.j}Q]' Q@%{M:LHv.8'EZW^a=ެ1m鴀I$w 埳\nz *ذZM*mnwܷ][2D#jh(:\U)ayR;lC)A%rp7Beh، ${91&?1qNqkt]kn6>vPU3t0B*?)ZN B7}kСQ'FtZo^2\X+MXnjH p=3+ʻ v1KJJ6NB (>XUL*pO\?MMm ~z8AU$ׯIQ~Uk{%Tkg{}׼B",rKYr?m:[*viD R^6&*ыVkul<*Jmކ%Hna$ZH0OڹkG!ּ9tkmb$"dh+R<:__rSMNQקct64RO6? PH>[niv!⫸W*9jQrmMϭrrMahmH^C_sF5ByEPڟψϥ\vbmŀ-A8`uKgw4̤*A@U8 9KįgmUtֺ7;Wj~q tĭ6$F >'4*Dċq]J`v@~Čd}+Э:<}뻿S^2oj N7qP##sXSkש+4%ˑI]ɸ2]kiEme7$ >];?Ruj`ۖ_0n'9x`"Z$ &.;[]o u)Qv[-2׉TKo?Җ;yR @vFa>)4׎Hl$gKyCqxUN6׻>p5dVvg5ցqvLM'nH8>֙kckjC4\דZ5NzM]cUj.hލt_?wWղ:+.̒c5T)Q^Q@mk:Yͦ^ByW ʭ9</tiM R!f2ۄ6@o#Qo{Fc۫F".z5oii^,w,nF|`kq'j;e'aFnx(%wkwc0sSJM%1{$ZGxIE(/4g]֯PZi` (>Q|s絥 }}YWH4BQC˂vsbk(j9;5#ء?cE?$6ЍRr@.ʡ Džo>fp`;g;V+Fk=~ٮ.Ucg&ww-bk9qA.[Wt`5ލnóHqvo,Uۋ} }z''`8Ҳ{4㨧(Z%;g;ۥZۦ,['/?ˇ!dei R/ ~p{ʼJ%^%d.JqΗpu->9eC8{}+ңE8{Yy+r6W] P+Gcw& [m>+X5 wO2b$pW@r@=갵 Τg{mnncj񎢴7Mw}e|?խ5 2aq -KmKiV5o14GB0, H>tbVf^O{QQ={Gm޾fq[Ѭ&$'Njv`rPUOWݗOשs}|/^e e'yYڲ< ()m#WhlU1HSzӧ QuP[ 1^+ϥiUQ}WS0-z}.{YZ_]} xY Hֳyn$eۼA>s~A~\2Jj=4RQg6tRԋYw9qO}ZSᡂv FG80Ob)E5su [~Ǩ[o&DF$m`p==i blo &o)JQommxEPcBʲn M#=OUiMrHXbs^l%<4*[a:u)JOTz5 X=FA׾9OEp(ƫMw;f}|`0#_\7Us ޽;rJIM6&;]_cK 4A2$lu$u=1]qr;-kbyqτ]F؞]ԒRRCI*Nz~x>oO4DQ׶G}0:=kv.m QoLyee)12X?A_V].'2rV߰Q]gPE}i,"5*v{EӬn>Τo1-μW F>Ҏ5fZnShoS ֒O[Y",1o)_uB:?L<..}?1VE%fݔLٻ{w }˫8ԍoav:Eg:+39=C`͢!+:On<8,yZj<(<-c~K0V*[ BFh,aI`m1#:y1Pv]: ,XdM^J[(-hIrhQ.QYBXfek0˕8:1yQWIQ@tJ6󸓎Z$+c40w'`H to.JVic'''jJ䕔wsx6΅5x]-t.][GNnĠsc+nmϫ$QqX~uWo i Eso $R{228ιӴRfk[XWϸP0~aߜV4*I眼T; Uu SU2amL͂sHq裂0,|P:bƶpܩ#pW<{/a=S'j)C_ 6heo o=0]pw2Tg;4-x~ho-Q1ae0s]nl\i$+"?1e@; R3SNc*M0% *Imy;žZ&}b9bXQ8/zfkL}(>c#}x凔MC^ҧ+}b!dD6qy@ G+cHOM.uFUk1ZSJ2FH';FyZJ3qsT/_6]Ϡ4u$3p4#$ Oʬ3&~TVo Fui~E-/-nVV`3#|U.Z) ]- bJ |[ϙk$Q϶Ok$O-Y8jW>hVV51h].>FsX:פAN%ߧ;kcBV<_]e.<5j G8ye@?&-u]CVP繙;?j&ǚO_>jiU{'o| V(bV3lU2[KYm,ˤ,nJ %}XURҊww~Wo*Ŀv=Gn||Gsf_QK"Vo*Rjcgf2sΜ:n1oOę*iY=^s]+9k{d[xDw#Cvڢ8U">Ahd!}QzRҋN?ӾST=l~2x>PmVG1c=*z(׸ԉchf gj rWnp:3FAƿ}p a\\a=ᘫ=ɑѹ|JTt:Kظv:c={ʷ3H&㐹U/ MneHUCy ~H034⪭#&+z_~?m;q-vY+w?'_1'֣y;F: 7ZU$e#]}m~~@; ]Ym^3Q^1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@n>=x?÷RkȄ09X>N;/1;Ovb4ب'#,S ,L# #Wc:㏄%\iN+MP vuz߁-ONn$$ҴRkf'1s50 #>ZOuVw[lY?5^$vH-UGVgq럟ΥlAx9iYpS rIMfWtrN1'y;$Omz? -eU%mC cϷO 4 foJx?eVzGS)r;-+t/#y_ih62>b34{J*+@P (&+fAS[]ʗ<3FrFHe>sBuAkyFy31b{Lp)_P ^~7ˈQ\%Q@@1x;\E/֧TaHyO4r֏+ P*gnVTU((((((((((((((((((((((((((((((((((((((((((((((((((((((gdalautotest-3.0.4/gdrivers/data/test.wld0000644003401500001440000000022013614004466020053 0ustar rouaultusers 0.38 -0,01 0.01 -0,38 700000.50 4287500,50 gdalautotest-3.0.4/gdrivers/data/nwt_grc.grc0000644003401500001440000013761013614004466020542 0ustar rouaultusersHGPC8@ 33333c^ ףp=])\F@(\G@CoordSys Earth Projection 1, 0onetwothregdalautotest-3.0.4/gdrivers/data/bug6581_src.vrt0000644003401500001440000000321413614004466021077 0ustar rouaultusers Red byte.tif 1 127 0 Green byte.tif 1 127 0 Blue byte.tif 1 127 0 gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/0000755003401500001440000000000013614005373021163 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/area-type-table.xml0000644003401500001440000001360513614005371024664 0ustar rouaultusers Area Type Table 3 8 July 2015 Program for Climate Model Diagnosis and Intercomparison webmaster@pcmdi.llnl.gov A plant that utilizes the C3 carbon fixation pathway as the sole mechanism to bind CO2 before photosynthesis reactions take place. All trees are C3 type. Grasses and crops can be C3 or C4. A plant that utilizes the C4 carbon fixation pathway in which the CO2 is first bound to a compound containing four carbon atoms before photosynthesis reactions take place. All trees are C3 type. Grasses and crops can be C3 or C4. The definition of "crops" is model dependent, for example, some models may include fruit trees as crops. An area_type of "dust_aerosol" indicates that dust aerosol is present at some level in the atmospheric column above an area on the surface of the Earth. An area_type of "fire" indicates that biomass fire, either flaming, smouldering, or both, is present. All ice floating on water including lake-ice, sea-ice, ice-shelves and icebergs. Floating ice excluding ice-shelves and icebergs. Pastures are assumed to be anthropogenic in origin. A primary forest is a naturally regenerated forest of native species, where there are no clearly visible indications of human activities and the ecological processes are not significantly disturbed. Reference: 'Global Forest Resources Assessment: Terms and Definitions', Forestry Department of Food and Agriculture Organization (FAO) of the United Nations, Rome 2010, www.fao.org/forestry/14241-0d7b74f45b0d2cfef31599cc17e4c28cd.pdf. Deciduous trees lose their leaves seasonally, for example, during winter in high latitudes or following seasonal variations in rainfall. A primary forest is a naturally regenerated forest of native species, where there are no clearly visible indications of human activities and the ecological processes are not significantly disturbed. Reference: 'Global Forest Resources Assessment: Terms and Definitions', Forestry Department of Food and Agriculture Organization (FAO) of the United Nations, Rome 2010, www.fao.org/forestry/14241-0d7b74f45b0d2cfef31599cc17e4c28cd.pdf. Evergreen trees have leaves in all seasons. An area_type of "rain" indicates that falling rain is present at some level in the atmospheric column above an area on the surface of the Earth. A secondary forest is a forest that has been logged and has recovered naturally or artificially. Reference: 'Report of the ad hoc technical expert group on forest biological diversity', United Nations Convention on Biological Diversity, www.cbd.int/forest/definitions.shtml. Deciduous trees lose their leaves seasonally, for example, during winter in high latitudes or following seasonal variations in rainfall. A secondary forest is a forest that has been logged and has recovered naturally or artificially. Reference: 'Report of the ad hoc technical expert group on forest biological diversity', United Nations Convention on Biological Diversity, www.cbd.int/forest/definitions.shtml. Evergreen trees have leaves in all seasons. The distinction between trees and shrubs is model dependent. An area_type of "smoke" indicates that smoke aerosol is present at some level in the atmospheric column above an area on the surface of the Earth. The distinction between trees and shrubs is model dependent. All trees are C3 plant functional type. An area_type of "volcanic_ash_cloud" indicates that volcanic ash aerosol is present at some level in the atmospheric column above an area on the surface of the Earth. gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-base.xml0000644003401500001440000000567213614005371024402 0ustar rouaultusers meter m metre kilogram kg second s ampere A kelvin K mole mol candela cd gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-prefixes.xml0000644003401500001440000000440413614005371025305 0ustar rouaultusers 1e24 yotta Y 1e21 zetta Z 1e18 exa E 1e15 peta P 1e12 tera T 1e9 giga G 1e6 mega M 1e3 kilo k 100 hecto h 10 deka da .1 deci d .01 centi c 1e-3 milli m 1e-6 micro µ μ u 1e-9 nano n 1e-12 pico p 1e-15 femto f 1e-18 atto a 1e-21 zepto z 1e-24 yocto y gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-accepted.xml0000644003401500001440000001552213614005372025234 0ustar rouaultusers 60 s minute min 60 min hour h hr 24 h day d 3.141592653589793238462643383279 pi π (pi/180) rad arc_degree ° angular_degree degree arcdeg °/60 arc_minute ' angular_minute arcminute arcmin '/60 arc_second " angular_second arcsecond arcsec dm^3 liter L litre l 1000 kg metric_ton t tonne 1.60217733e-19 J electronvolt eV electron_volt 1.6605402e-27 kg unified_atomic_mass_unit u atomic_mass_unit atomicmassunit amu 1.495979e11 m astronomical_unit ua 1852 m nautical_mile nautical_mile/hour international_knot knot_international knot 1e-10 m angstrom ångström Å dam^2 are a 100 are hectare 100 fm^2 barn b 1000 hPa bar cm/s^2 gal 3.7e10 Bq curie Ci 2.58e-4 C/kg roentgen R cSv rem gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-common.xml0000644003401500001440000014620313614005372024755 0ustar rouaultusers s sec A amp K °K degree_kelvin degrees_kelvin degree_K degrees_K degreeK degreesK deg_K degs_K degK degsK cd candle mole einstein Hz baud Bd bps degree_Celsius celsius degree_C degrees_C degreeC degreesC deg_C degs_C degC degsC knot kt kts 6.02214179e23/mol avogadro_constant 0.01 percent % 0.9 arc_degree grade 2 pi rad circle cycle turn revolution rotation arc_degree degree_north degrees_north degree_N degrees_N degreeN degreesN degree_east degrees_east degree_E degrees_E degreeE degreesE degree_true degrees_true degree_T degrees_T degreeT degreesT -1 degree_east degree_west degrees_west degree_W degrees_W degreeW degreesW 2.916667e-2 kg assay_ton 2.834952e-2 kg avoirdupois_ounce 4.5359237e-1 kg avoirdupois_pound pound lb 2e-4 kg carat 6.479891e-5 kg grain gr 5.080235e1 kg long_hundredweight 1.555174e-3 kg pennyweight 4.535924e1 kg short_hundredweight 14.59390 kg slug 3.110348e-2 kg troy_ounce apothecary_ounce 3.732417e-1 kg troy_pound apothecary_pound 20 grain scruple 60 grain apdram 480 grain apounce 5760 grain appound 94 pound bag 2000 pound short_ton ton 2240 pound long_ton 1e-15 m fermi 9.46073e15 m light_year 1e-6 m micron 2.54e-5 m mil 3.085678e16 m parsec 3.514598e-4 m printers_point 2.011684e1 m chain 12 printers_point printers_pica pica nautical_mile nmile (1200/3937) m US_survey_foot US_survey_feet 3 US_survey_feet US_survey_yard 5280 US_survey_feet US_survey_mile US_statute_mile 16.5 US_survey_feet rod pole perch 660 US_survey_feet furlong 6 US_survey_feet fathom 2.54 cm international_inch inch in 12 international_inches international_foot international_feet foot feet ft 3 international_feet international_yard yard yd 5280 international_feet international_mile mile mi inch/72 big_point inch/3 barleycorn 191.835 foot arpentlin (2.69e20/avogadro_constant)/m2 dobson DU rotation/second rotation_per_second rotations_per_second rps cps rotation/minute rpm 1.111111e-7 kg/m denier 1e-6 kg/m tex 5.72135e-11 kg/(Pa.s.m^2) perm_0C perms_0C 5.74525e-11 kg/(Pa.s.m^2) perm_23C perms_23C 5.067075e-10 m^2 circular_mil 9.869233e-13 m^2 darcy 160 rod^2 acre 1.233489e3 m^3 acre_foot acre_feet 2.359737e-3 m^3 board_foot board_feet 3.523907e-2 m^3 bushel bu bushel/4 peck pk 4.546090e-3 m^3 Canadian_liquid_gallon 4.404884e-3 m^3 US_dry_gallon cm^3 cc 1 m^3 stere 2.831685 m^3 register_ton US_dry_gallon/4 US_dry_quart dry_quart US_dry_gallon/8 US_dry_pint dry_pint 3.785412e-3 m^3 US_liquid_gallon liquid_gallon gallon 42 US_liquid_gallon barrel bbl barrel/4 firkin US_liquid_gallon/4 US_liquid_quart liquid_quart quart US_liquid_gallon/8 US_liquid_pint liquid_pint pint pt US_liquid_gallon/16 US_liquid_cup liquid_cup cup US_liquid_gallon/32 US_liquid_gill liquid_gill gill US_liquid_gallon/128 US_fluid_ounce US_liquid_ounce fluid_ounce liquid_ounce oz floz US_fluid_ounce/2 tablespoon Tbl Tbsp tbsp Tblsp tblsp US_fluid_ounce/8 fldr US_fluid_ounce/16 dram dr tablespoon/3 teaspoon tsp 4.546090e-3 m^3 UK_liquid_gallon UK_liquid_gallon/4 UK_liquid_quart UK_liquid_gallon/8 UK_liquid_pint UK_liquid_gallon/16 UK_liquid_cup UK_liquid_gallon/32 UK_liquid_gill UK_liquid_gallon/160 UK_fluid_ounce UK_liquid_ounce lg(re (1e-6 m)^3) BZ 1e-8 s shake 8.616409e4 s sidereal_day 3.590170e3 s sidereal_hour 5.983617e1 s sidereal_minute 0.9972696 s sidereal_second 3.155815e7 s sidereal_year 3.15569259747e7 s tropical_year year yr 29.530589 day lunar_month 365 day common_year 366 day leap_year 365.25 day Julian_year 365.2425 day Gregorian_year 27.321661 day sidereal_month 27.321582 day tropical_month 14 day fortnight 7 day week 0.01 s jiffy 1e9 year eon year/12 month 1e6 m^3/s sverdrup 9.806650 m/s^2 standard_free_fall standard_free_fall gravity gravity 1000 kg/m^3 conventional_water water H2O h2o gravity 999.972 kg/m^3 water_4C waters_4C water_39F waters_39F gravity 999.001 kg/m^3 water_60F waters_60F gravity 13595.10 kg/m^3 mercury_0C mercuries_0C mercury_32F mercuries_32F conventional_mercury conventional_mercuries Hg gravity 13556.8 kg/m^3 mercury_60F mercuries_60F standard_free_fall force 1e-5 N dyne 9.806650e-3 N pond 9.806650 N force_kilogram kilogram_force kilograms_force kgf 2.780139e-1 N force_ounce ounce_force ounces_force ozf 4.4482216152605 N force_pound pound_force pounds_force lbf 1.382550e-1 N poundal gram force gram_force grams_force force_gram gf 2000 force_pound force_ton ton_force tons_force 1000 lbf kip 1.01325e5 Pa standard_atmosphere atmosphere atm 1 kg gravity/cm2 technical_atmosphere at cm H2O cm_H2O cmH2O inch water_39F inch_H2O_39F inches_H2O_39F inch water_60F inch_H2O_60F inches_H2O_60F foot water foot_water feet_water foot_H2O feet_H2O footH2O feetH2O ftH2O fth2o cm Hg cm_Hg cmHg mm mercury_0C millimeter_Hg_0C millimeters_Hg_0C inch mercury_32F inch_Hg_32F inches_Hg_32F inch mercury_60F inch_Hg_60F inches_Hg_60F mm Hg millimeter_Hg millimeters_Hg torr mm_Hg mm_hg mmHg mmhg inch Hg inch_Hg inches_Hg in_Hg inHg 1 pound gravity/in^2 psi kip/in^2 ksi 0.1 N/m^2 barie barye lg(re 20e-6 Pa) B_SPL 1e-1 Pa.s poise 1e-4 m^2/s stokes St 10/(Pa.s) rhe 1e-7 J erg 1.05505585262e3 J IT_Btu IT_Btus Btu Btus 1.05506e8 J EC_therm 4.184000 J thermochemical_calorie 4.1868 J IT_calorie calorie cal 4.184 MJ/kg TNT 4.184e9 J ton_TNT tons_TNT 1.054804e8 J US_therm therm thm watt.hour watthour 1e9 eV bev V.A voltampere VA 9.80950e3 W boiler_horsepower 7.456999e2 W shaft_horsepower horsepower hp 7.35499e2 W metric_horsepower 7.460000e2 W electric_horsepower 7.46043e2 W water_horsepower 7.4570e2 W UK_horsepower 12000 Btu/hr refrigeration_ton ton_of_refrigeration tons_of_refrigeration lg(re 1 W) BW lg(re 1 mW) Bm 1.55e-1 K.m^2/W clo 10 A abampere 7.957747e-1 A gilbert 3.335640e-10 A statampere 10 A biot 1e9 F abfarad 1e-9 H abhenry 1e9 S abmho 1e-9 ohm abohm 1e-8 V abvolt 1.602176487e-19 C e 9.64957e4 C chemical_faraday 9.65219e4 C physical_faraday 9.648531e4 C C12_faraday faraday 1e-9 T gamma 1e-4 T gauss 1e-8 Wb maxwell 7.957747e1 A/m oersted Oe 3.335640e-10 C statcoulomb 1.112650e-12 F statfarad 8.987554e11 H stathenry 1.112650e-12 S statmho 8.987554e11 ohm statohm 2.997925e2 V statvolt 1.256637e-7 Wb unit_pole lg(re 1 V) BV lg(re 0.775 V) Bv lg(re 1e-6 V) BµV K/1.8 °R degree_rankine degrees_rankine degreeR degreesR degree_R degrees_R degR degsR deg_R degs_R °R @ 459.67 °F fahrenheit degree_fahrenheit degrees_fahrenheit degreeF degreesF degree_F degrees_F degF degsF deg_F degs_F 1.076391e-1 lx footcandle 3.426259 cd/m^2 footlambert (1e4/pi) cd/m^2 lambert 1e4 cd/m^2 stilb sb 1e4 lm/m^2 phot ph 1 cd/m^2 nit nt 4.184000e4 J/m^2 langley cd/(pi m^2) blondel apostilb 100/m kayser gravity geopotential dynamic gp 2056 hours work_year work_year/12 work_month 1e-6 m^2 s^-1 K kg^-1 potential_vorticity_unit PVU 1 count gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-derived.xml0000644003401500001440000000751313614005373025110 0ustar rouaultusers radian rad rad^2 steradian sr 1/s hertz Hz 1e-3 kg gram g m.kg/s^2 newton N N/m^2 pascal Pa N.m joule J J/s watt W s.A coulomb C W/A volt V C/V farad F V/A ohm Ω A/V siemens S V.s weber Wb Wb/m^2 tesla T Wb/A henry H K @ 273.15 degree_Celsius degrees_Celsius °C cd.sr lumen lm lm/m^2 lux lx mol/s katal kat 1/s becquerel Bq J/kg gray Gy J/kg sievert Sv gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2.xml0000644003401500001440000000100513614005373023456 0ustar rouaultusers udunits2-prefixes.xml udunits2-base.xml udunits2-derived.xml udunits2-accepted.xml udunits2-common.xml gdalautotest-3.0.4/gdrivers/data/netcdf_cf_xml/udunits2-LICENCE0000644003401500001440000000335113614004466023727 0ustar rouaultusersCopyright 2011 University Corporation for Atmospheric Research. All rights reserved. Access and use of this software shall impose the following obligations and understandings on the user. The user is granted the right, without any fee or cost, to use, copy, modify, alter, enhance and distribute this software, and any derivative works thereof, and its supporting documentation for any purpose whatsoever, provided that this entire notice appears in all copies of the software, derivative works and supporting documentation. Further, UCAR requests that the user credit UCAR/Unidata in any publications that result from the use of this software or in any product that includes this software, although this is not an obligation. The names UCAR and/or Unidata, however, may not be used in any advertising or publicity to endorse or promote any products or commercial entity unless specific written permission is obtained from UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated to provide the user with any support, consulting, training or assistance of any kind with regard to the use, operation and performance of this software nor to provide the user with any updates, revisions, new versions or "bug fixes." THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. gdalautotest-3.0.4/gdrivers/data/trmm-nc2.nc0000644003401500001440000002151013614004466020352 0ustar rouaultusersCDF  longitude(latitude(time CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.4historyWed Sep 07 22:35:46 2011: cdo -f nc2 copy trmm.nc trmm-nc2.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.2 (http://code.zmaw.de/projects/cdo)  longitude  standard_name longitude long_name Longitudeunits degrees_eastaxisX@latitude  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 HSSSSSSSSSxShSXSHS8S(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.0.4/gdrivers/data/byte_signed.tif0000644003401500001440000000136613614004466021400 0ustar rouaultusersII*fS   JN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|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{skkkkksckgdalautotest-3.0.4/gdrivers/data/envirpc.hdr0000644003401500001440000000153513614004466020543 0ustar rouaultusersENVI description = { out.img} samples = 1 lines = 1 bands = 1 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq byte order = 0 rpc info = { 842.94998, 843.05058, 40.0193171, -62.3660099, 3355, 842.95002, 843.05058, 0.0332739565, 0.0440030997, 3455, 0.0127561752, 7.86107907, -1.08337968, 0.309949865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.240935431, -0.06974847770000001, -5.58459427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.00185332456, 1.1054297, 7.73882024, -0.0481747188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0.240935431, -0.06974847770000001, -5.58459427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.00000000e+000, 0.00000000e+000, 1.00000000e+000} band names = { Band 1} gdalautotest-3.0.4/gdrivers/data/int.img0000644003401500001440000016346613614004466017702 0ustar rouaultusersEHFA_HEADER_TAG@RtH rootroot"AH RRLayer_132110984Eimg_Layer"A@@ Ehfa_Layer10984Ehfa_Layer"A0 I n0Statistics10984Esta_Statisticsrs"A@@Py@ @@ "QF@Z<StatisticsParametersEimg_StatisticsParameters830"A ,<Descriptor_TableersEdsc_TableticsParameters830@"AVZb#Bin_Function#eersEdsc_BinFunctionrameters830@"A@@n!ZHistogramion#eersEdsc_Columntionrameters830@"A|ZZHistogramParametersEimg_StatisticsParameters830@"Aة  @@*h_ss_4_132110985Eimg_Layer_SubSample@"A3333Ehfa_Layer10985Ehfa_Layer@"A{2601:ldata,}RasterDMS,.|4RasterDMS10985Edms_State@"A) _@"AfPHRRDNamesList984Eimg_RRDNamesList@"AXIMAGINE 2X2 Resamplingwint.img(:Layer_1:_ss_4_)D}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{4096:ldata,}RasterDMS,.R IMGFormatInfo84ImgFormatInfo831@"A(fV P RasterDMS10984Edms_State"Af  B)q[9';4J U bH'o Z jp{t~yx~N "A I sMap_Info10984Eprj_MapInfo"A Transverse Mercator A+[A A1[A* Y@Y@B metersV  Projection10984Eprj_ProParameters"A  Transverse Mercator x#?jk@AcA GRS 1980@TXA?XA@k{?˯MXAI 0XDatumtion10984Eprj_Datumameters"A8GDA94H&1<0Gz @T㥛#@~b>&>9*>2iĵ>Eu?85444443333322221111100000/////.....-----66543217654321076543210987654321987654321:98765432:98765432;:9876543<;:9876543=<;:987654=<;:987654>=<;:98765>=<;:98765?>=<;:9876@?>=<;:9876@?>=<;:987A@?>=<;:987BA@?>=<;:98CBA@?>=<;:9CBA@?>=<;:9DCBA@?>=<;:DCBA@?>=<;:FEDCBA@?>=<;FEDCBA@?>=<;GFEDCBA@?>=<GFEDCBA@?>=<HGFEDCBA@?>=IHGFEDCBA@?>=IHGFEDCBA@?>JIHGFEDCBA@?>JIHGFEDCBA@?KJIHGFEDCBA@?LKJIHGFEDCBA@MLKJIHGFEDCBA@MLKJIHGFEDCBANMLKJIHGFEDCBANMLKJIHGFEDCBPONMLKJIHGFEDCPONMLKJIHGFEDCQPONMLKJIHGFEDQPONMLKJIHGFEDRQPONMLKJIHGFEE<5.& /.-/.-,+*)(0/.-,+*)('&%$0/.-,+*)('&%$#"! 10/.-,+*)('&%$#"! 210/.-,+*)('&%$#"! 210/.-,+*)('&%$#"! 3210/.-,+*)('&%$#"!  3210/.-,+*)('&%$#"!  43210/.-,+*)('&%$#"!  43210/.-,+*)('&%$#"!  543210/.-,+*)('&%$#"!  543210/.-,+*)('&%$#"!  6543210/.-,+*)('&%$#"!  6543210/.-,+*)('&%$#"!  76543210/.-,+*)('&%$#"!  76543210/.-,+*)('&%$#"!  876543210/.-,+*)('&%$#"!  876543210/.-,+*)('&%$#"!  9876543210/.-,+*)('&%$#"!  9876543210/.-,+*)('&%$#"!  :9876543210/.-,+*)('&%$#"!  :9876543210/.-,+*)('&%$#"!  ;:9876543210/.-,+*)('&%$#"!  ;:9876543210/.-,+*)('&%$#"! <;:9876543210/.-,+*)('&%$#"! =<;:9876543210/.-,+*)('&%$#"! =<;:9876543210/.-,+*)('&%$#"! >=<;:9876543210/.-,+*)('&%$#"! >=<;:9876543210/.-,+*)('&%$#"! ?>=<;:9876543210/.-,+*)('&%$#"! ?>=<;:9876543210/.-,+*)('&%$#"! @?>=<;:9876543210/.-,+*)('&%$#"! @?>=<;:9876543210/.-,+*)('&%$#"! A@?>=<;:9876543210/.-,+*)('&%$#"! A@?>=<;:9876543210/.-,+*)('&%$#"! BA@?>=<;:9876543210/.-,+*)('&%$#"! BA@?>=<;:9876543210/.-,+*)('&%$#"! CBA@?>=<;:9876543210/.-,+*)('&%$#"! CBA@?>=<;:9876543210/.-,+*)('&%$#"! DCBA@?>=<;:9876543210/.-,+*)('&%$#"! !/H:3,%  ߟޟݟ ߟޟݟܠ ߟޟݠ ߟޟݠ ߟޠ ߟޠ ߠ ߠ                J@97777777777777777777777۟ڟٟ؟ܟ۟ڟٟ؟ןܟ۟ڟٟ؟ݟܟ۟ڟٟ؟ݟܟ۟ڟٟޟݟܟ۟ڟٟߟޟݟܟ۟ڟߟޟݟܟ۟ڟߟޟݟܟ۟ߟޟݟܟ۟ߟޟݟܟߟޟݟܟߟޟݟߟޟݟߟޟߟޟߟߟ ,,,,+++++******))))((((((''''&&&&&%%%%%$$$$$$####"""""!!!!!     SRQPONMLKJIHGFESRQPONMLKJIHGFTSRQPONMLKJIHGFUTSRQPONMLKJIHGVUTSRQPONMLKJIHGVUTSRQPONMLKJIHWVUTSRQPONMLKJIHWVUTSRQPONMLKJIXWVUTSRQPONMLKJIYXWVUTSRQPONMLKJZYXWVUTSRQPONMLKJZYXWVUTSRQPONMLK[ZYXWVUTSRQPONMLK[ZYXWVUTSRQPONML\[ZYXWVUTSRQPONML]\[ZYXWVUTSRQPONM^]\[ZYXWVUTSRQPON^]\[ZYXWVUTSRQPON_^]\[ZYXWVUTSRQPO`_^]\[ZYXWVUTSRQPO`_^]\[ZYXWVUTSRQPa`_^]\[ZYXWVUTSRQPa`_^]\[ZYXWVUTSRQba`_^]\[ZYXWVUTSRQba`_^]\[ZYXWVUTSRdcba`_^]\[ZYXWVUTSRdcba`_^]\[ZYXWVUTSedcba`_^]\[ZYXWVUTSedcba`_^]\[ZYXWVUTfedcba`_^]\[ZYXWVUTgfedcba`_^]\[ZYXWVUhgfedcba`_^]\[ZYXWVUhgfedcba`_^]\[ZYXWVihgfedcba`_^]\[ZYXWVjihgfedcba`_^]\[ZYXWjihgfedcba`_^]\[ZYXWkjihgfedcba`_^]\[ZYXkjihgfedcba`_^]\[ZYlkjihgfedcba`_^]\[ZYmlkjihgfedcba`_^]\[Znmlkjihgfedcba`_^]\[Znmlkjihgfedcba`_^]\[onmlkjihgfedcba`_^]\[onmlkjihgfedcba`_^]\ponmlkjihgfedcba`_^]\qponmlkjihgfedcba`_^]rqponmlkjihgfedcba`_^]rqponmlkjihgfedcba`_^srqponmlkjihgfedcba`_^tsrqponmlkjihgfedcba`_tsrqponmlkjihgfedcba`_utsrqponmlkjihgfedcba`utsrqponmlkjihgfedcba`vutsrqponmlkjihgfedcbawvutsrqponmlkjihgfedcbaxwvutsrqponmlkjihgfedcbxwvutsrqponmlkjihgfedcyxwvutsrqponmlkjihgfedcyxwvutsrqponmlkjihgfed{zyxwvutsrqponmlkjihgfed{zyxwvutsrqponmlkjihgfe|{zyxwvutsrqponmlkjihgfe|{zyxwvutsrqponmlkjihgf}|{zyxwvutsrqponmlkjihgf --,++*)(('&%%$##"!  .-,,+**)(''&%$$#""!  ..-,,+*))('&&%$$#"!!  /..-,++*)(('&&%$##"!  0/.--,+**)(('&%%$#""!  0//.-,,+*))(''&%$$#""!  10/..-,++*))('&&%$##"!!  100/.--,++*)(('&%%$##"!  210//.--,+**)(''&%%$#""!  2110/..-,,+*))(''&%$$#"!!  32100/..-,++*)(('&&%$##"!!  322100/.--,+**)(('&%%$#""!  432210//.-,,+**)(''&%$$#""!  4432110/..-,,+*))('&&%$$#"!!  54332100/.--,++*)(('&&%$##"!  55432210//.--,+**)(''&%%$#""!  654432110//.-,,+*))(''&%$$#"!!  6654332110/..-,++*))('&&%$##"!!  76554322100/.--,++*)(('&%%$##"!  77654432210//.-,,+**)(''&%$$#""!  876654432110/..-,,+*))('&&%$$#"!!  8876654332100/..-,++*)(('&&%$##"!  98776554322100/.--,+**)(('&%%$#""!  99877654432110//.-,,+**)(''&%$$#""!  :99876654332110/..-,++*))('&&%$##"!!  ;:98876554332100/.--,++*)(('&%%$##"!  ;::9877655432210//.--,+**)(''&%%$#""!  <;:99876654432110//.-,,+*))(''&%$$#"!! <;;:98876654332100/..-,++*)(('&&%$##"!! =<;::98876554322100/.--,+**)(('&%%$#""! =<<;::9877654432210//.-,,+**)(''&%$$#""! >=<;;:99876654432110/..-,,+*))('&&%$$#"!! >==<;;:98876554332100/.--,++*)(('&&%$##"! ?>==<;::9877655432210//.--,+**)(''&%%$#""! ??>=<<;:99877654432110//.-,,+*))(''&%$$#"!! @?>>=<;;:99876654332110/..-,++*))('&&%$##"!! @@?>==<;::98876554332100/.--,++*)(('&%%$##"! A@??>=<<;::9877654432210//.-,,+**)(''&%%$#""! AA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! BA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"! BBA@??>==<;::98876554322100/.--,+**)(('&%%$#""! CBAA@??>=<<;:99877654432110//.-,,+**)(''&%$$#""! CCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$$#"!! DCCBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! DDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! EDDCBAA@?>>=<<;:99876654432110//.-,,+*))(''&%$$#"!! FEDCCBA@@?>>=<;;:98876654332100/..-,++*))('&&%$##"!! FEEDCBBA@@?>==<;::98876554322100/.--,+**)(('&%%$#""! GFEDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! GFFEDCCBAA@?>>=<;;:99876654432110/..-,,+*))('&&%$$#"!! HGFEEDCCBA@@?>==<;;:98876554332100/..-,++*)(('&&%$##"! HGGFEEDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! IHGGFEDDCBAA@??>=<<;:99877654432110//.-,,+*))(''&%$$#"!! IHHGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$##"!! JIHHGFEEDCBBA@@?>==<;::98876554332100/.--,++*)(('&%%$##"! JJIHGGFEDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%%$#""! KJIIHGFFEDDCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! KKJIHHGFFEDCCBA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"! LKJJIHGGFEEDCBBA@??>==<;::98876554322100/.--,+**)(('&%%$#""! LLKJIIHGGFEDDCBAA@??>=<<;:99877654432210//.-,,+**)(''&%$$#""! MLKKJIIHGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$$#"!! MMLKKJIHHGFEEDCCBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! NMLLKJJIHGGFEDDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! NNMLLKJIIHGFFEDDCBAA@?>>=<<;:99877654432110//.-,,+*))(''&%$$#"!! .-,++*)(('&&%$##"!  .--,+**)(('&%%$#""!  /.-,,+**)(''&%$$#""!  /..-,++*))('&&%$##"!!  0/.--,++*)(('&%%$##"!  0//.--,+**)(''&%%$#""!  10//.-,,+*))(''&%$$#"!!  100/..-,++*))('&&%$##"!!  2100/.--,+**)(('&%%$#""!  2210//.-,,+**)(''&%$$#""!  32110/..-,,+*))('&&%$$#"!!  332100/..-,++*)(('&&%$##"!  432210//.--,+**)(''&%%$#""!  4432110//.-,,+*))(''&%$$#"!!  54332110/..-,++*))('&&%$##"!!  554332100/.--,++*)(('&%%$##"!  654432210//.--,+**)(''&%%$#""!  6654432110/..-,,+*))('&&%$$#"!!  76654332100/..-,++*)(('&&%$##"!  876554322100/.--,+**)(('&%%$#""!  877654432210//.-,,+**)(''&%$$#""!  9876654332110/..-,++*))('&&%$$#"!!  98876554332100/.--,++*)(('&%%$##"!  :9877655432210//.--,+**)(''&%%$#""!  :99877654432110//.-,,+*))(''&%$$#"!!  ;:98876654332110/..-,++*))('&&%$##"!!  ;::98876554322100/.--,++*)(('&%%$##"!  <;::9877654432210//.-,,+**)(''&%$$#""! <<;:99876654432110/..-,,+*))('&&%$$#"!! =<;;:98876654332100/..-,++*)(('&&%$##"! ==<;::98776554322100/.--,+**)(('&%%$#""! >=<<;:99877654432110//.-,,+*))(''&%$$#""! >>=<;;:99876654332110/..-,++*))('&&%$##"!! ?>==<;;:98876554332100/.--,++*)(('&%%$##"! ??>=<<;::9877655432210//.--,+**)(''&%%$#""! @?>>=<<;:99876654432110//.-,,+*))(''&%$$#"!! @@?>>=<;;:98876654332100/..-,++*)(('&&%$##"!! A@@?>==<;::98876554322100/.--,+**)(('&%%$#""! AA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! BAA@?>>=<;;:99876654432110/..-,,+*))('&&%$$#"!! CBA@@?>==<;;:98876554332100/.--,++*)(('&&%$##"! CBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! DCBAA@??>=<<;:99877654432110//.-,,+*))(''&%$$#"!! DCCBA@@?>>=<;;:99876654332110/..-,++*))('&&%$##"!! EDCBBA@@?>==<;::98876554332100/.--,++*)(('&%%$##"! EDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%%$#""! FEDDCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! FEEDCCBA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"! GFEEDCBBA@??>==<;::98876554322100/.--,+**)(('&%%$#""! GGFEDDCBAA@??>=<<;:99877654432210//.-,,+**)(''&%$$#""! HGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$$#"!! HHGFEEDCCBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! IHGGFEDDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! IIHGFFEDDCBAA@?>>=<<;:99877654432110//.-,,+*))(''&%$$#"!! JIHHGFFEDCCBA@@?>>=<;;:98876654332110/..-,++*))('&&%$##"!! JJIHHGFEEDCBBA@@?>==<;::98876554322100/.--,++*)(('&%%$##"! KJIIHGGFEDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! KKJIIHGFFEDCCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! LKKJIHHGFEEDCCBA@@?>==<;;:98876654332100/..-,++*)(('&&%$##"! MLKJJIHGGFEEDCBBA@??>==<;::98776554322100/.--,+**)(('&%%$#""! MLLKJIIHGGFEDDCBAA@??>=<<;:99877654432110//.-,,+**)(''&%$$#""! NMLKKJIHHGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$$#"!! NMMLKJJIHHGFEEDCBBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! ONMLLKJJIHGGFEDDCBBA@??>=<<;::9877655432210//.--,+**)(''&%%$#""!7777777777777777777777777777777777777777777777777777777777777777                      ! ! "! "! #"! #"! $#"! $#"! %$#"! %$#"! &%$#"! '&%$#"!'&%$#"!('&%$#"('&%$#")('&%$#)('&%$#*)('&%$*)('&%$;IMM~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[Z~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[Z~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[~}|{zyxwvutsrqponmlkjihgfedcba`_^]\~}|{zyxwvutsrqponmlkjihgfedcba`_^]\~}|{zyxwvutsrqponmlkjihgfedcba`_^]~}|{zyxwvutsrqponmlkjihgfedcba`_^~}|{zyxwvutsrqponmlkjihgfedcba`_^MYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210ES77777777M+*)('&%+*)('&%,+*)('&,+*)('-,+*)('-,+*)(.-,+*)(.-,+*)/.-,+*) .-,,+**)(''&%$$#""!  ..-,,+*))('&&%$$#"!!  /..-,++*)(('&&%$##"!  0/.--,+**)(('&%%$#""!  0//.-,,+*))(''&%$$#""!  10/..-,++*))('&&%$##"!!  100/.--,++*)(('&%%$##"!  210//.--,+**)(''&%%$#""!  2110//.-,,+*))(''&%$$#"!!  32100/..-,++*)(('&&%$##"!!  322100/.--,+**)(('&%%$#""!  432210//.-,,+**)(''&%$$#""!  4432110/..-,,+*))('&&%$$#"!!  54332100/.--,++*)(('&&%$##"!  55432210//.--,+**)(''&%%$#""!  654432110//.-,,+*))(''&%$$#"!!  6654332110/..-,++*))('&&%$##"!!  76554322100/.--,++*)(('&%%$##"!  77654432210//.-,,+**)(''&%%$#""!  876654432110/..-,,+*))('&&%$$#"!!  8876654332100/..-,++*)(('&&%$##"!  98876554322100/.--,+**)(('&%%$#""!  99877654432110//.-,,+**)(''&%$$#""!  :99876654332110/..-,++*))('&&%$$#"!!  ;:98876554332100/.--,++*)(('&%%$##"!  ;::9877655432210//.--,+**)(''&%%$#""!  <;:99877654432110//.-,,+*))(''&%$$#"!! <;;:98876654332100/..-,++*))('&&%$##"!! =<;::98876554322100/.--,+**)(('&%%$#""! =<<;::9877654432210//.-,,+**)(''&%$$#""! >=<<;:99876654432110/..-,,+*))('&&%$$#"!! >==<;;:98876554332100/..-,++*)(('&&%$##"! ?>==<;::9877655432210//.--,+**)(('&%%$#""! ??>=<<;:99877654432110//.-,,+*))(''&%$$#"!! @?>>=<;;:99876654332110/..-,++*))('&&%$##"!! @@?>==<;::98876554332100/.--,++*)(('&%%$##"! A@??>=<<;::9877654432210//.--,+**)(''&%%$#""! AA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! BA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"! BBA@@?>==<;::98876554322100/.--,+**)(('&%%$#""! CBAA@??>=<<;:99877654432210//.-,,+**)(''&%$$#""! CCBAA@?>>=<;;:99876654332110/..-,,+*))('&&%$$#"!! DCCBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! EDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! EDDCBAA@??>=<<;:99877654432110//.-,,+*))(''&%$$#"!! FEDCCBA@@?>>=<;;:98876654332110/..-,++*))('&&%$##"!! FEEDCBBA@@?>==<;::98876554322100/.--,++*)(('&%%$##"! GFEDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! GFFEDDCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! HGFEEDCCBA@@?>==<;;:98876654332100/..-,++*)(('&&%$##"! HGGFEEDCBBA@??>==<;::98776554322100/.--,+**)(('&%%$#""! IHGGFEDDCBAA@??>=<<;:99877654432110//.-,,+**)(''&%$$#""! IIHGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$##"!! JIHHGFEEDCCBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! JJIHGGFEDDCBBA@??>=<<;::9877655432210//.--,+**)(''&%%$#""! KJIIHGFFEDDCBAA@?>>=<<;:99876654432110//.-,,+*))(''&%$$#"!! KKJIHHGFFEDCCBA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"!! LKJJIHHGFEEDCBBA@@?>==<;::98876554322100/.--,+**)(('&%%$#""! LLKJIIHGGFEDDCBAA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! MLKKJIIHGFFEDCCBAA@?>>=<;;:99876654432110/..-,,+*))('&&%$$#"!! MMLKKJIHHGFEEDCCBA@@?>==<;;:98876554332100/..-,++*)(('&&%$##"! NMMLKJJIHGGFEEDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! NNMLLKJIIHGFFEDDCBAA@??>=<<;:99877654432110//.-,,+*))(''&%$$#"!!ONNMLKKJIHHGFFEDCCBA@@?>>=<;;:99876654332110/..-,++*))('&&%$##"!7777777777777777777777777777777777777777777777777777777777777777 ^k~}|{zyxwvutsrqponmlkjihg~}|{zyxwvutsrqponmlkjihg~}|{zyxwvutsrqponmlkjih~}|{zyxwvutsrqponmlkjih~}|{zyxwvutsrqponmlkji~}|{zyxwvutsrqponmlkji~}|{zyxwvutsrqponmlkj~}|{zyxwvutsrqponmlkj~}|{zyxwvutsrqponmlk~}|{zyxwvutsrqponmlk~}|{zyxwvutsrqponml~}|{zyxwvutsrqponml~}|{zyxwvutsrqponm~}|{zyxwvutsrqpon~}|{zyxwvutsrqpon~}|{zyxwvutsrqpo~}|{zyxwvutsrqpo~}|{zyxwvutsrqp~}|{zyxwvutsrqp~}|{zyxwvutsrq~}|{zyxwvutsrq~}|{zyxwvutsr~}|{zyxwvutsr~}|{zyxwvuts~}|{zyxwvuts~}|{zyxwvut~}|{zyxwvut~}|{zyxwvu~}|{zyxwvu~}|{zyxwv~}|{zyxwv~}|{zyxw~}|{zyxw~}|{zyx~}|{zy~}|{zy~}|{z~}|{z~}|{~}|{~}|~}|~}~}~~8 .--,+**)(''&%%$#""!  /.-,,+*))(''&%$$#"!!  /..-,++*)(('&&%$##"!!  0/.--,+**)(('&%%$#""!  0//.-,,+**)(''&%$$#""!  10/..-,,+*))('&&%$$#"!!  100/.--,++*)(('&&%$##"!  210//.--,+**)(''&%%$#""!  2110//.-,,+*))(''&%$$#"!!  32110/..-,++*))('&&%$##"!!  322100/.--,++*)(('&%%$##"!  432210//.-,,+**)(''&%%$#""!  4432110/..-,,+*))('&&%$$#"!!  54332100/..-,++*)(('&&%$##"!  554322100/.--,+**)(('&%%$#""!  654432110//.-,,+**)(''&%$$#""!  6654332110/..-,++*))('&&%$$#"!!  76554332100/.--,++*)(('&%%$##"!  77655432210//.--,+**)(''&%%$#""!  876654432110//.-,,+*))(''&%$$#"!!  8876654332100/..-,++*))('&&%$##"!!  98876554322100/.--,+**)(('&%%$##"!  :9877654432210//.-,,+**)(''&%$$#""!  :99876654432110/..-,,+*))('&&%$$#"!!  ;:98876554332100/..-,++*)(('&&%$##"!  ;::9877655432210//.--,+**)(('&%%$#""!  <;:99877654432110//.-,,+*))(''&%$$#"!! <;;:99876654332110/..-,++*))('&&%$##"!! =<;::98876554332100/.--,++*)(('&%%$##"! =<<;::9877654432210//.--,+**)(''&%%$#""! >=<<;:99876654432110/..-,,+*))(''&%$$#"!! >>=<;;:98876654332100/..-,++*)(('&&%$##"! ?>==<;::98876554322100/.--,+**)(('&%%$#""! ??>=<<;:99877654432210//.-,,+**)(''&%$$#""! @?>>=<;;:99876654332110/..-,,+*))('&&%$$#"!! @@?>==<;;:98876554332100/.--,++*)(('&%%$##"! A@??>==<;::9877655432210//.--,+**)(''&%%$#""! AA@?>>=<<;:99877654432110//.-,,+*))(''&%$$#"!! BA@@?>>=<;;:98876654332100/..-,++*))('&&%$##"!! BBA@@?>==<;::98876554322100/.--,+**)(('&%%$##"! CBBA@??>=<<;::9877654432210//.-,,+**)(''&%$$#""! CCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! DCCBA@@?>==<;;:98876554332100/..-,++*)(('&&%$##"! EDCBBA@??>==<;::9877655432210//.--,+**)(('&%%$#""! EDDCBAA@??>=<<;:99877654432110//.-,,+*))(''&%$$#""! FEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$##"!! FEEDCBBA@@?>==<;;:98876554332100/.--,++*)(('&%%$##"! GFEDDCBBA@??>=<<;::9877654432210//.--,+**)(''&%%$#""! GFFEDDCBAA@?>>=<<;:99876654432110/..-,,+*))(''&%$$#"!! HGFFEDCCBA@@?>>=<;;:98876654332100/..-,++*)(('&&%$##"!! HGGFEEDCBBA@??>==<;::98876554322100/.--,+**)(('&%%$#""! IHGGFEDDCBAA@??>=<<;:99877654432210//.-,,+**)(''&%$$#""! IIHGFFEDCCBAA@?>>=<;;:99876654332110/..-,,+*))('&&%$$#"!! JIHHGFEEDCCBA@@?>==<;;:98876554332100/.--,++*)(('&&%$##"! JJIHGGFEDDCBBA@??>==<;::9877655432210//.--,+**)(''&%%$#""! KJIIHGFFEDDCBAA@?>>=<<;:99877654432110//.-,,+*))(''&%$$#"!! KKJIHHGFFEDCCBA@@?>>=<;;:98876654332110/..-,++*))('&&%$##"!! LKJJIHHGFEEDCBBA@@?>==<;::98876554322100/.--,++*)(('&%%$##"! LLKJIIHGGFEDDCBBA@??>=<<;::9877654432210//.-,,+**)(''&%%$#""! MLKKJIIHGFFEDCCBAA@?>>=<<;:99876654432110/..-,,+*))('&&%$$#"!! MMLKKJIHHGFEEDCCBA@@?>==<;;:98876654332100/..-,++*)(('&&%$##"! NMMLKJJIHGGFEEDCBBA@??>==<;::98776554322100/.--,+**)(('&%%$#""! NNMLLKJIIHGGFEDDCBAA@??>=<<;:99877654432110//.-,,+**)(''&%$$#""!ONNMLKKJIHHGFFEDCCBAA@?>>=<;;:99876654332110/..-,++*))('&&%$$#"!?@"@$@,@0@3@6@:@;@?@@@C@D@E@F@H@I@K@L@N@O@P@@Q@Q@R@S@T@T@@U@V@W@W@X@Y@Z@Z@@[@[@]@]@^@^@`@@`@`@`@`a@a@@b@`b@b@c@c@d@`d@d@d@e@e@e@f@f@@g@g@h@h@h@@i@@i@i@j@j@j@@k@`k@l@ l@l@l@@m@m@`n@`n@@n@n@n@n@n@@n@n@n@n@n@n@@o@n@n@ n@`n@m@m@@m@ m@m@l@`l@l@k@k@@k@ k@j@j@@j@ j@i@i@@i@@i@h@@h@h@ h@g@g@g@g@g@f@`f@e@e@e@ e@d@d@`d@d@c@c@@c@@c@c@b@`b@@b@a@a@@a@a@a@`@``@`@@_@@_@^@@^@]@\@\@\@[@Z@[@Z@@Y@@Y@X@W@W@W@V@U@U@T@@T@T@@S@R@R@R@Q@@P@P@P@N@M@L@K@J@I@H@F@F@E@D@C@A@A@@@?@<@9@7@7@3@1@1@(@(@$@@@@?0leName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,. !5>1A{52/-ay];9n:742/,)&# `]j<8}1Y u<9741.+(%" [XY=5T el+Ϡ><9630-*'$! \,T6l2*e GA>;852/,)&$! tOP?qFC@=:741.+(&#  ޟܟAHEB?<9630-+(%" ޟYJGDA>;8520-*'$! -sLIFC@=:752/,)&#  L@NKHEB?<:741.+(%" SPMJGDB?<9630-*'$"  UROLIGDA>;852/,)'$! -WTQNLIFC@=:741.,)&#  /YVSQNKHEB?<9631.+(%" Q|[XVSPMJGDA>;8630-*'$! `][XUROLIFC@=;852/,)&#  Ơb`]ZWTQNKHEB@=:741.+(%#  $da_\YVSPMJGEB?<9630-*(%" 3fca^[XUROLJGDA>;852/-*'$! U5heb`]ZWTQOLIFC@=:742/,)&#  jgeb_\YVTQNKHEB?<9741.+(%" oljgda^[YVSPMJGDA><9630-*'$! zqolifc`^[XUROLIFCA>;852/,)&$! 5|tqnkhec`]ZWTQNKHFC@=:741.+)&#  Y0vspmjgeb_\YVSPMKHEB?<9630.+(%" !xurolifda^[XURPMJGDA>;8530-*'$! }zwtqnkhfc`]ZWUROLIFC@=:852/,)&#  |yvspmkheb_\ZWTQNKHEB?=:741.+(%"  8~{xurpmjgda_\YVSPMJGDB?<9630-*'%" \O}zwurolifda^[XUROLIGDA>;852/,*'$! |ywtqnkifc`]ZWTQNLIFC@=:741/,)&#  Ơ~|yvspmjheb_\YVSQNKHEB?<9641.+(%" 頋}{xuroljgda^[XVSPMJGDA>;9630-*'$!;Ѡ|zwtqnlifc`]ZXUROLIFC@>;852/,)&#!^~{yvsqnkheb`]ZWTQNKHEC@=:741.+(&# ݠ}{xuspmjgeb_\YVSPMJHEB?<9630-+(%" }zxuroligda^[XUROMJGDA>;8520-*'$!R|ywtqnlifc`]ZWTQOLIFC@=:752/,)&$!>~{xvspnkheb_\YVTQNKHEB?<:741.+(%# _͠}zwuromjgda^[YVSPMJGDA?<9630-*'%"Z|yvtqolifc`^[XUROLIFDA>;852/,)'$!~{yvtqnkhec`]ZWTQNKHFC@=:741.,)&#۠}zxuspmjheb_\YVSPMKHEB?<9631.+(%B(}zwtromjgda^[XURPMJGDA>;8630-*'`|yvsrolifc`]ZWUROLIFC@=;852/,)gdalautotest-3.0.4/gdrivers/data/idat_broken.png0000644003401500001440000000052213614004466021360 0ustar rouaultusersPNG  IHDRNIDATH_he?;6AwJ(-6ۥ'ٟ7:,`~;mm g-uK]F;{g61eod(_aY5hBZ].rR&d4!#J:f ZZ}b?ZzRp%lePu8nUԁ#Mt|5 `-y Py DR hw6S uX6ZWdPzu*A6 h+u4V2T &6IENDB`gdalautotest-3.0.4/gdrivers/data/fakecpgSIRC.img0000644003401500001440000000001213614004466021142 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/uint32.cot0000644003401500001440000000660013614004466020227 0ustar rouaultusers N@AN@LA? C:\freeware\gdalautotet-1.3.2\gcore\data\uint32.tif.auJ?|8|2|||006<<l@22.92847676Dzx-</<-xDEx rxxExEx<-</<<<6 x-@&|L%|A@`@|%|%|2%|@B@BM@@|$|dN:M$|p&|,%|A&|l%|A@`|%|%|2%|@B5N@BM@@|$|dNk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gdrivers/data/fake_snodas.hdr0000644003401500001440000000644013614004466021352 0ustar rouaultusersFormat version: NOHRSC GIS/RS raster file v1.1 Data source: FSL Created by module: sm_products Created by module comment: number BARD codes: 0000000000 BARD codes: Created year: 2010 Created month: 6 Created day: 16 Created hour: 6 Created minute: 37 Created second: 42 Last modified by module: sm_products Last modified by module comment: Not applicable Last modified year: 2010 Last modified month: 6 Last modified day: 16 Last modified hour: 6 Last modified minute: 37 Last modified second: 42 Satellite data: no Satellite name: Not applicable Satellite channel: 0 Satellite data calibrated: no Description: Non-snow accumulation, 24-hour total Thematic: no Theme file: Not applicable Data units: Kilograms per square meter / 10.000000 Product code: 419956286 Attribute table: Not applicable Data file pathname: fake_snodas.dat Data type: integer Data bytes per pixel: 2 Data intercept: 0.00000000000000 Data slope: 1.00000000000000 Minimum data value: 0.00000000000000 Maximum data value: 429.000000000000 No data value: -9999.00000000000 Number of columns: 6935 Number of rows: 3351 Geographically corrected: yes Projected: no Projection file: Not applicable Horizontal datum: WGS84 Horizontal precision: 2031.80000000000 Elevation above datum: yes Vertical datum: Unknown Vertical precision: 40.0000000000000 Benchmark column: 0 Benchmark row: 0 Benchmark x-axis coordinate: -124.729583333328 Benchmark y-axis coordinate: 52.8704166666646 X-axis resolution: 0.00833333333333300 Y-axis resolution: 0.00833333333333300 X-axis offset: 0.00375000000000000 Y-axis offset: 0.00375000000000000 Minimum x-axis coordinate: -124.733749999995 Maximum x-axis coordinate: -66.9420833333302 Minimum y-axis coordinate: 24.9495833333324 Maximum y-axis coordinate: 52.8745833333313 Start year: 2010 Start month: 6 Start day: 15 Start hour: 6 Start minute: 0 Start second: 0 Stop year: 2010 Stop month: 6 Stop day: 16 Stop hour: 6 Stop minute: 0 Stop second: 0 Compressed: no Compression file: Not applicable Number of color tables: 0 Color table 01 descriptor: Not applicable Color table 02 descriptor: Not applicable Color table 03 descriptor: Not applicable Color table 04 descriptor: Not applicable Color table 05 descriptor: Not applicable Color table 06 descriptor: Not applicable Color table 07 descriptor: Not applicable Color table 08 descriptor: Not applicable Color table 09 descriptor: Not applicable Color table 10 descriptor: Not applicable Color table 11 descriptor: Not applicable Color table 12 descriptor: Not applicable Color table 13 descriptor: Not applicable Color table 14 descriptor: Not applicable Color table 15 descriptor: Not applicable Color table 16 descriptor: Not applicable Color table 01 file: Not applicable Color table 02 file: Not applicable Color table 03 file: Not applicable Color table 04 file: Not applicable Color table 05 file: Not applicable Color table 06 file: Not applicable Color table 07 file: Not applicable Color table 08 file: Not applicable Color table 09 file: Not applicable Color table 10 file: Not applicable Color table 11 file: Not applicable Color table 12 file: Not applicable Color table 13 file: Not applicable Color table 14 file: Not applicable Color table 15 file: Not applicable Color table 16 file: Not applicable Histogram: no Histogram file: Not applicable gdalautotest-3.0.4/gdrivers/data/n43_coord_inverted.dt00000644003401500001440000000654413614004466022506 0ustar rouaultusersUHL10430000N0800000W030003000200U 012101210 DSIU DTED0F18 062 01A960900000000US090078 SPEXDLMS2009609MSLWGS84AS11+C 9609 430000.0N0800000.0W430000N0800000W440000N0800000W440000N0790000W430000N0790000W0000000.0030003000121012100 ACC0200020002000200 10 gdalautotest-3.0.4/gdrivers/data/stefan_full_rgba_alpha_1bit.jp20000644003401500001440000001454613614004466024402 0ustar rouaultusers jP ftypjp2 jp2 J2P1[jp2hihdr bpcccolr"cdefjp2cOQ2Rfww\ P`XX`XX X&C}S8 ecFP(!óPT63[йj9J=,b}+e$ǜ^$@J~)mդr`ux eU9?QW~bfBdF^ ?>PIx3湅_8ևЗZp0\[;hE(篢6I}nF %r@ w$@,o>8ٔ}RI D}mhi'Lx,zEWF~6&ͫYgVv"oi_Եݎ<ۅokԼg:o {gETǯS~&P{QyVP: $w̄$iLRҍc䶕rK0*Hb[dd V'A`*:Z*FO8J @ &FM4[dR(ۋȈcD&qVM/qgQXEO ?9H/<Dž*8l܌d$5}kO[apHPǐHn~WGj_.c?}tLmQvyyImY|;87ܷ,d>qA ""}eWdPv(^ἇi[n*A>T1%=mrC`.a?fn'1 (_;dpӳd)X9/L1)/σ8"2ǻ@ǒ-clwR\ ywB,4R]dʺ'OQ }Kpy.EzCAB-]LO4QŘ; _̈́I[hj1*ſbN)ٻϙ_r37j6RfP΀_fPT9 T] Hc`e5ti)=N7{j@tg Ue(4? 7'36?'sA"%<yA'uKpJLڝj pD˦Sw_!: GKE(,꬙n$sE)\*9Qʠ|M #}UߴYCA?Af`?\"'eIxNZ^,B)H}a*~>BWm>r h$z?O)Bp DC4x-΄U IULG`|K~)lYqUbub &7ەٚPE:۰|ba#ogeX XKƬ 3,tNJ0l-z Vf8Ӿ P%`7!2i۝q}wU $0RCsec+ x' yB!G{ {pŨ$M,=8W*H4%ۑ[-S !/6[ߩڤcȰl\z_н@[(O 8 w"Y :h%F.#2B"bU|:3cU8 RNeMI+i@dM_DHKˮ9[9fsܛ1<1V`; B-!w&OBԹ̦/y Xw}M5A[MA(kE!nZHIHrrP1I)kn@>WI 2=C%@8D{Zqf:a*U?nV:O[En1$Am1qPPhpN˯{.iQ dv'PeY`@PǗqB=fy$po>%I[8/WIXn8eО/f,A}A6g)kU2cZH5 9{,P1CATG6^͞~ŌD<0,NCu$!%K^fHoCf|wyv*-G 3 !U'&iY ΦB'GOޱxi)%3/jwbscο#y<[!~" իϥއ~֟KGGq۱0T]@n7!}6`Cߙ_~B_@FkMI08abjL(ýjA Ϥ I4=E}W@p?97{TF#+i/}UjzхZ(ttΡݤ[jܳR0% ]o2L~l@:p`@wv~$u"+*;VbcL/V{HzA Y4X~7(= >W8qQ$arrVa6L=4&YOfn|"8ѿ .ړ!?P,A%h"(Mw^bH$zoMKzscaBn>%0S4Y/ȷLJ> _}t%PiUMf=u`OZ~ϓw7  WDl"ͲSs>TWY|l(MAݲ#{{u/pZKqOJvR>k\wOJumq̄lRuRS9bo>)̴SE%ZLy !OsfaB[w ,\/GM~3 cQÈZ7G¯%0V9򔨏 ;k.O;[+{fX\rQO& E0SYJ ޓe)5ΰCһE MisorUB aϛ+@ ޼H^һUOL'G!t:VE B2xBJlw׿2X|щ> ͞n#zܛ!KxؐcR8O)KBu ,;Ijv6pW{$塘{o|ƪ=s, q;pJ,'+9>w-e 9ՙ,hQ EO1!„mv1 -}-|G烖HJ[n%Mfsz~{GZ͟bu7lz2sxBH@2,E0*:뭦<OUpAOBB_Պڜ#k28<.QW"YғjF;b'9Z-IOۣ]޿"C?y}NR5"yx{p2ӪۊEt0G6ȶsW㪫kQl#t )So/ᗛFTN=//{-?W"x{uqnf7'e,׃RMcb>,Oflm69tjmQqӭCktn %=n 3ܣP)ʹMQpDApte\Evxv17JƦzy`wS{: 49-ow`;ոO.Ll|嵢#u[L`nqJY ǜHKؑY0jܡpz0kRw[Jz"}bN(!<"@/jްK߬9O!*\I#z3V@WUدy3^\rK5%bHxAWh'xsf]2;P[`UC<UrQAxWݰD8ODw?iڑXc 8j%mPs~OJYB>f)[H") KUv,VgC涭uULܪ۔obVRL0l{d=E,I7RԳE')t2Ⱥ{ d-M"sDLwL_d˴d;0tlω S·H|ƿ4B_:`ZtZT^8Ŋq*KDt:vycZBן=8:ͳM?Ty0: >EҳB ̏d 8v@*dBLL|,A.s8 ]$"_ΩBza!/ʗRxޡ[$P h0ΠF6 ;&tqEfIw-zKA@ $%tw:J1kܰbA6_%} \'‰X.vwC\woۓI wu/dFTc{4/=LR$Dڤ7Xp ώ iՐnş)ꗁiBj(hl R.NvCԧTp|e@T Fd! j⒟54"h/KBhӣDKG\(A$15,+_gdalautotest-3.0.4/gdrivers/data/usgsdem_with_spaces_after_byte_864.dem0000644003401500001440000000400013614004466025720 0ustar rouaultusersFILE 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.0.4/gdrivers/data/SMALL_ADRG_ZNA9/0000755003401500001440000000000013614004466020640 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/SMALL_ADRG_ZNA9/ABCDEF01.IMG0000644003401500001440000014400113614004466022243 0ustar rouaultusers001852L 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.0.4/gdrivers/data/SMALL_ADRG_ZNA9/README.TXT0000644003401500001440000000104713614004466022200 0ustar rouaultusersCopied 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.0.4/gdrivers/data/SMALL_ADRG_ZNA9/ABCDEF01.GEN0000644003401500001440000000324613614004466022245 0ustar rouaultusers009083LE1 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.0.4/gdrivers/data/g2009u01_be_truncated.bin0000644003401500001440000000006013614004466022666 0ustar rouaultusers@D@l??jgdalautotest-3.0.4/gdrivers/data/inconsitant_geojp2_gmljp2.jp20000644003401500001440000000476413614004466024074 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdrcolrtuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|N@N@@A̞LAasoclbl gml.dataasoclbl gml.root-instanceuxml 440720 3750120 441920 3751320 0 0 19 19 x y 440000 3751000 60 0 0 -60 gmljp2://codestream/0 Record Interleaved jjp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/rgbsmall.webp0000644003401500001440000000177613614004466021067 0ustar rouaultusersRIFFWEBPVP8 *22>e(EE,`Y@-ʄ( 7h3Ko/Ni#}QZ P=GlZjX0RS'TK;zE{Ю,b+4MZ/ϹR%ce& uF̥Hc&_6=sn'̏nui yj+HVi;`YuvԋXdb"qCm 8GMp ֣-RƦƍ:yLCT]C<J])@%O1?en X1AdFT{՟mPA }"GF5gyԜTHcìCجL{}QX;b'06ߐ2wQf?,C.)A LQzѴӛ&cD5⡋@ֈҡfC)4Ft 9Y;ҡ#Ttcd3 FF;o<| vWl4s^cA}Bz/+PY 9W=7Q`I/ ѭ5PN}rN*gdalautotest-3.0.4/gdrivers/data/test_deflate_2GB.vrt0000644003401500001440000000224613614004466022230 0ustar rouaultusers Gray 50000 42992 6.71089e+07 NearestNeighbour Byte /vsizip/data/test_deflate_2GB.tif.zip/test_deflate_2GB.tif 0.125 0,1,0,0,0,1 0,1,0,0,0,1 0,1,0,0,0,1 0,1,0,0,0,1 gdalautotest-3.0.4/gdrivers/data/float32.hdr0000644003401500001440000000036513614004466020347 0ustar rouaultusersBYTEORDER I LAYOUT BIL NROWS 20 NCOLS 20 NBANDS 1 NBITS 32 BANDROWBYTES 80 TOTALROWBYTES 80 PIXELTYPE FLOAT ULXMAP 440750 ULYMAP 3751290 XDIM 60 YDIM 60 gdalautotest-3.0.4/gdrivers/data/isis3_geotiff.tif0000644003401500001440000002271013614004466021635 0ustar rouaultusersII* =S1sgddilnnlnt{aZjjmq~yohbbgottsux}hhmmorzrlgemtx{|}{{momry{uokkuz|uopyx|}vqpr{~}s|zv|st|~~zy}z}yu}~}xqtx~y~y~wqnptx}x~~~~ywwtwywuwywqs|~y~~{{wxzsonkm~~}||~vzzplijry~}~{t{yqppq{{{|{ux|{zy~}~~zz~~~~~}wu}|mm{~|~~{rsxnlr{vtu~pv}|||y~urppy~~mnoot{wjnrpt}qjow|xrloy~|rmu}z{ry|}}~~gdalautotest-3.0.4/gdrivers/data/U_4017A.NTF0000644003401500001440000001670313614004466017732 0ustar rouaultusersNITF02.0004 U241GJJ0 01224425ZJUN94checks a 64x64 mono image with 12 bit JPEG. lincoln. U 00000000000JITC FT HUACHUCA (602) 538-5458 00000000761900040400100120300000060120000000000000000000000000IM000000000101120000ZJUN94 This is an unclassified image in an unclassified NITF file U241GJJ0.NTF U 999998This image will not need downgrading. 0 0000006400000064INTMONO VIS 12RN9This is image comment #1 for the unclassified image #1 from test message J0. This is image comment #2 for the unclassified image #1 from test message J0. This is image comment #3 for the unclassified image #1 from test message J0. This is image comment #4 for the unclassified image #1 from test message J0. This is image comment #5 for the unclassified image #1 from test message J0. This is image comment #6 for the unclassified image #1 from test message J0. This is image comment #7 for the unclassified image #1 from test message J0. This is image comment #8 for the unclassified image #1 from test message J0. This is image comment #9 for the unclassified image #1 from test message J0. C300.01 N 00B00010001006400641200100000000000001.0 0000000000NITFB   &*L   !"1A Q2a #BRq$3 b%C 4r&Sт'5Dc 6ETdest()*+,-.789:;<=>FGHIJKLMNUVWXYZ[\]^fghijklmnuvwxyz{|}~ @@?ꎨ=硗T\M##7>Q>~[/P?F[b\nUKzZV uFmZMCO?rW?cmz_Jnů7IVKy}Iw?/:":ۧxIj1Imv6!/4]ZGw`A,+=_P; ־CL*-}gu]f]_TW;ɈV H8B \`X+z^`5MRb?g@{c<;UwYw#ѯ䲦tյpm;Xi2-Z;Y7RQԗnz_p}xnݯV4JZ7Y͈m>׷֭ͥWP}֩P),Ð#Ok=ߩ]ˠnҺ+]1;e&·o)7J!&(/*5oQ=^]ntaӺ~+ch{uܾmUFeܻStGʌ5*{i4 %p1o[Y<g3}7#nwb٪oցGjѵ eULuQ˘O=_Cy }Wz)SU9ylIVTv7W[Z1E)P򚏢֓U{GU},tU_MPtzܺ}.Zźn;hd$k` Vg=筇 oFq?;245\vwukvbŽjܷ,'\fnJ*=|g=o,ѝO^}:#-4GEPnGfE;d3}lnGrm鸮*\u%s{iW M0^[Ko}x:^RsuuZgދnFC s iN'IoszUdYv=A.%)\Յ:D}ZLځ:ui=Qkɴ^\[{z#i+۩֭h] \GܕL] Pi5Nr[) N}N_nc}lߤQQgV tPi];Ԯ$+յ6.bt96㓡2ԺzRa ;B')֥'M\V_ΰKl[v./Gs;jɗK/5,FpOuQKұfo݉w[.؛m,n8#]tZLeHRPRʟDqj_FztGg?NX_v]^ز{LnWJXcTIM?`Md1Q=0?zNyZ[;+W}WAq-;RU]: U-) Ivd)O(ƿBER_] óR/3,?a'ԙz}RK +fii^Z#7UT5eMhk#}zmVv ĦM*Zt{L}W%ƺk Vx7"Q-?'?SuMwUzu-9ѓ_^PwtioQ=w=k[Zf§]ݩMOԄ&i.I{s܏*L?{9=`ýLWnc}$7}ckt N٣n7/q,v˥>R3صn.ċN)stѪDzʠz޹ߕQ4Yw2҉!:Rc^G!s oٯ}_~zy$I_ӫUJMҽ !ݖd %4ΚV`t{~]>^Ѯ=R-Oec}Ym]Wq6M;l6knnGϋm*CʓP襤jTIOoYR F}6EQxn]ꓣN6 dߦ7;g-:i#%nw|SgC˽OKA7ᵤmRvֺ..L}DukvuMhBn땸!*x uNB6?6OO5}P;޽B紭)gh=dٖ P6ڵTۗ^{ ::==_Gζzܮ}1ϥuk_NΓ76FH؞ʅY::r[k^╸.LVL{buZLou}zX~ꟺrҷ6-b֓[9nr\g:󪫆Mx+- =O}VU'FR荵?K'V-)4-w5d™n ţBRөrp-$Wic$+/'x^G;1=bGO]ӛt3{t6>: ۉenD:%bŽiŦTʫN?\ȟTwob"tPGzZ@uRݭר-'rmk) V\i2`KwvCibostNKFَSw:W~wzm7\:ΦWڸRSUBشkdP#Kg?egD\Czcdt]ߪ$TVHQɌͩz}DwKíZ{,'W}>-Ϫ?<Q?B#[ RMϪ6`]kʟjX6(UKZb.n[qjieQlJt'oI)KSZ}nÏu,/~[G-u_l%G~6:R%>\JBB*)*BsԺK;$m>{esHgt}(>V]HZ/G^&?Կbnٷ"lIF~t_\RUG:#M=Ga:ù1W[}< OVι)Ul*bLطyu)cs{*wP+aGoo^kӷE@mthsnoe98QʍJAբ8ңIHY;QzL;7dn:ϽjWe'zsF݋fux*Gn6nOqSJ_Q?芵){<{$;5O=u?V/\qдW/Z=F\{&=CjǷ]Ƣýhr*7*L&Gmhw:?LSf_]S6a߇b٪ZM) b2+TCw~LH#=o$+gӉ_Svd}$7Vq.UwYAؗuk{mKwJ q0o?\4͔+8_% C']hAk:iޟ}?ku#vc5vg𲛅}n ^P)6Sp-;Cզ5zwyY^MGWUԛ|>W|OU-ηp[QvrWjɉmQaHwyN.ꓫwI}{áY洛og:=_ݱM.Ճy\('Ev!Mq\-0/=a_]Kn~;5_L趫qlӺzz/^>wR\1{Ɂm79N1?5n빔]-jv׏?osVUUޒ&셆x,?dS%=:?q2_A-]K>/xdoGK= vٳsnSXZRq{DsvS]'=iwUr>.}V:uzT;Gfj n+*E^cSW! j@R? HQꄴz~Ar۽|s-ޞ^Z^[)4}Mfb&u&|DPy} ~HO#ϣ]PsV?˨~{nokmmK*Mŝ!רtڽ'To4̄m[},?]З\!}Cԯ+YԮnϧm3o{uޡo2˄I'._/ǫ9'|};U鳪ۺn]џVWUpSeW6vDCbܓ%1#u 0:0,50:25,75:50,100:100,100:150,150:200,200:255 byte.tif 1 gdalautotest-3.0.4/gdrivers/data/albania.jpg0000644003401500001440000003043613614004466020471 0ustar rouaultusersJFIFbExifII*agbj(air%``02100100i. : : : : : : : : Ng*EIFB)d7dC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((i" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?׋CgfYTDPX_xo/z~I+­Z$~ag)Rn+txowQ5QYz7 >:?N:?N:?NúW%8E*JU^߉M,pDO"Gg`Mb4DRADlG+fI3%~%[<^K$Qc"n9zQjqMiF4{u7PҤ7FCjZ#Yn{ F|;3k|`#{rx}5lQ8&Щ(x-[H7 Ibw2 خwNJ*ofzҝw/^M{AƼ`W!v rWZۛ͗攱j_ EVQEQEQEQEQE^п7M Cz|G .l~q_~?{O9]_B5W_gQYEPEPEPEPEPxN}?^;O;]Qo4fk ctR5 \vӮH"*6+z?OZ.O _hO2r?C^/It>,,Vz;tOgD9I>tzf;@8؍rJv,p-ƨű0[y4806XӥRQkO=OCJUiI+qo4/O5#3~8OMR8G-A?L~˩_M6tq֞SOf"1Kgzq ]5:\R{Ǻw'T8*UPkf4 )6ȮU~/,rPO>c*9SEcº_FVw%ks}FtE={?ȮoYvH Z~- թVMRu<ఘ:1Wo2Ԟcv#0ȗFDlY/.UR%`O]|S5jur% o+)U[tEq9zvNN𝅭nZ[۬.w>i.L=1F3=O?\V%Bag#94?bb5"^y kY#fZ4.Wwݲ魪ʤmDE{MpzFxZCf%.'r9Zd]20ЃYg);i=<=)EI9v_uQ\GЅQ@Q@Q@Q@Q@/ +Bޟ_B˯[/Wz~O_B5WGGw$ЍsW$Yo/AEVG`QEQEQEQEQE6R71_h= @=*fXHەgOjAtwhʾG::do皞}CWyM> Q?{-IByZU5}ii'ׅ&EPj.mn { @?$>̚jslpX u>{aoyJ cdU8r;5C,MwRӔ[_O0<#E*_.[[8`}Zva*wa?1$~Iwu52J~sj ½S4 [aKVFcdFJr;FJ;j%&0JG:d~uSw1]+-c3<ּpq %k3ѯ^5ϙI/+_@ qs%ޔo 6H;Jȭ \iH4Yi ~c5_f Y5>׶|/tYC8Z6En @ T4Vѐ?ym9}W`X^J+nWyEMYƕxB/{.W_yZ\+%K>ׯFjytJ;+u1?zNӽݨKL;69\ov]kzxvկ+Y?O%(O ( ( ( ( (/h_?Wu!?#Ѕ}^_?Sḯ?S䟈='k/z~I+ίIzrJ_䂊(((((F9OYwַ֫0bȧ_kjn[?ujt<}xnl5e%lca4Fj׿$_]'ˢS濕ۻ;gޙ]=(((>YOݿ{?CR?bW[cI[1۸@Ïӌ5ʿ|i6ݻ?yyݿԶ'Sy֦0oYLdO5[T }qG+S23 ܭLgW<\儹|zcJ0D[I-}Et y_eFrkۭNal|Oj Xۗ/F=1Si]AaIB ku7OEW!EPEPEPEPEP Cz|G .4п7|7|Gw$ЍsE]?#\y/V}n[K1QEQEQEQEQEX!Y5, }# {hy&G,w֙{a+gg~>|˨2Y[?fS9h7n7*r`w?_ nj|w.p%Rz_cnp6ML6H~iObGa,M5ܛ}9>neS$0 ^P ̠s{3U:~6XvD0ֺk.=qNQn]jK|5{CZ8cUK3s簺{{ ##ֽ^xS d=2'G^]B*95qs8t)+9="1LN>ijҲ_$SI`Š(AR%p@呂 ռ)wǨZ\3"drrg:I^N R]C&/^&Z9WʟQ+f}?.[kuϛwyDFV4vW2z7zq> BZKI:G5VUVN a RP}.O[[F Z UӼyyo}l,8oǂ?ALm0̛~<>r?նn۷7ZRtSiN8VQϒii~~ǟEsy+ r#F{]7 #7,k4$% (UQW.'_2ZtZ^!QErQEQEQEQEQE{Bޟ_B˯4/ + ǧ$E]?#\t{O9^uK՟[R $QEdvQ@Q@Q@Q@Ewk4QcwFUqI &RI3®H.S՝#Kծq?&*7An岖U{?ﮘioAY=lW=z6υYs]{5XYdou[T1]cUj׶ZUV7֦PiZͰW=ڽUgyv'Inmoٞcv>?Zūƣ6Kwp~g?*^U*)%n|V*TQ? w~QVs:%դD}?@8_u~ѵx9u@;kȮml6?v]еK-r.Dр-{ןVg TsѦ_ODχ?. mF C|aʟx5FHvӟJ|Q cFuC^gz={P6SxRɍOR?״Kp's[7ӛN",\0] '\~5&um?Ԟb3G[IC]-O²!v ,cxv>8"K+ )#u\GerRzhEW aEPEPEPEPEP Cz|G .4п7|7|Gw$ЍsE]?#\y/V}n[K1QEQEQEQEQE n䄚61SQM;j)EI4gZ;$3EeV^tUR!Mkze(NGϩz*TRW>7apNRmr壕J 0O`cw>_~\xV[uApÅ 1}RI3^J YϠ^u=C-QU4o|YhF1 s9jwzɞS#=QW w\\$b%B2sZv.R9OA=zNyXf+17KE["/ۡp=?iZLV1yH\ێǧtz޽c%Q cckngI+ǩ5JzGtcaPxhZu_y/?ĊO[iSjqUKn+31ߡ+#nU08 MHŤyZʅXԔT><5>'d &9_fa{qܭŜwwEl,5,Nf\a&zW/>r$sH~F?5JoVZgB1X::Y_Zo8젲0Gᚕ$7w |Hם%FdA*z0eеMf̶|H}{>"ԮV)G}cJev Xwg?:ỏvtRTCZ}sĶ4 IH%G[/ZxlcNW x(=?1gh'>gVkGp5W]eRe`N __ѬLˈrNOM]be[KYWS˯$zQ\ǰQEQEQEQEQE^п7M Cz|G .l~q_~?{O9]_B5W_gQYEPEPEPEPEPg-ﮬMȒI.pQ0I#߀?;OMQy"$+zWךC7wA8V'W~ w#Jk >knWa%ȌXv#kF#jw]F{?ȧE]8t"}8gTT6Nn&A<}q3] %| -|44vewi88<JX/Yi6B6c"y=WdH+A+kqgqigk0BrGS^vRiF͟WҥJ1kE~Mj#<9wGs{, 6lO8Jt#Te]2B8}xz/n- !+NHf*ԠM读+E>8Ir'z#[B.5gkIY"cv ү G\6hG!:&K~]H|F(}9_j㫷 Xʅʷ'9>W*R} 4R)QthGi5 K|":W;z<~Mdw${ݹyQ'"|E{=Vr<1*f эe(m]զa ڌiU!NU9#(Rwg4(48QE&EPEPEPEPEP Cz|G .4п7|7|Gw$ЍsE]?#\y/V}n[K1QEQEQEQEQEQESRl(w$9E4wDj(DU!FI'=j+X"\.(z6F}FqOEin*K46sswgo$r=}ФuWFW=5)Ƣ~bn6;{/olU#Zt뛛Y̜y?]ot'KbP~PU]?ExQ.G]npQVXi'ʖ(Nttbm}txq_^c^U[5$a[ +ϝ=JVj5_d8T̫TSWee._Z[`$T^Aq5˔b-BEU:JoZi>Sn𾿑%AmkЮ+?OEsSiT.Oi^Jw;,}$(Md)SZ(PQEQEQEQEQEQE{Bޟ_B˯4/ + ǧ$E]?#\t{O9^uK՟[R $QEdvQ@Q@Q@Q@Q@Q@Q@Q@q~;hY"&rp?QZR*Rˍtjlx%w~E]H u>v-A_+iy# $s]v1]ϝyѮ^~;Q^qEPEPEPEPEPEPEPEPEP Cz|G .4п7|7|Gw$ЍsE]?#\y/V}n[K1QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^п7M Cz|G .l~q_~?{O9]_B5W_gQYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP Cz|G .4п7|7|Gw$ЍsE]?#\y/V}n[K1QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^п7M Cz|G .l~q_~/ީ\]tn.$29Y2NN*) Š+҃}QI$Ÿ(?_wQEƟ_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O?G) Š(4}W?OWxŸ(cOW_O-x^)IRf}+1Uj֩Yޤ]gdalautotest-3.0.4/gdrivers/data/4byteFloat.sg-grd-z0000644003401500001440000000320113614004466021757 0ustar rouaultusersPKRJ,<4byteFloat.sgrdUT qYuYux M@ gy _@Azq%w%Fb\\t<4V5:c.׈WRd'tYrXirJR<#4Hk³BGTC2L͏Qsr)4ϖuQiuTYInAU!hU19fI 'e:YK,PKRJ"H44byteFloat.sdatUT qYuYux k?|n@QsF38`S@øՁqug/!"PKRJoLE4byteFloat.mgrdUT qYuYux mS[o0^+_!nbl#D@4mQdIY ϰdT?wFMyWl UGeU{yvjꢻ`:i\˰ $IQf.HEˣX@/q0xiIvg~ǰm}26#Te LQGp tLQlc>xϔa)i}k,YQN]F=s\Sչbzss\sAI5GeIJ@3fgZXK{Tr:1S+ҷ"CyQCu= (*zN,9Spn$]EO!-4%]G󎂉 k))85_2;Q<Ǣ +I&kO0e[Lu 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"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","27700"],AXIS["Easting",EAST],AXIS["Northing",NORTH]] gdalautotest-3.0.4/gdrivers/data/float64.mtw0000644003401500001440000000671013614004466020406 0ustar rouaultusersMTW @@@@UUUUUd@N@tLA@A R@o@@H Z@^@`@\@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@c@b@\@`@Z@^@b@\@d@\@a@Z@^@^@X@`@^@`@`@`@X@c@\@`@a@`@^@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@\@Z@b@`@^@^@\@`@`@^@\@^@\@^@Z@\@b@Z@\@a@\@`@`@c@`@a@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@c@^@g@e@e@b@b@\@b@^@Z@`@\@`@c@X@^@\@`@`@i@Z@h@e@b@a@a@`@X@`@^@\@a@`@`@X@`@^@`@e@^@\@b@^@b@\@b@^@a@^@Z@\@`@\@Z@\@X@^@X@f@X@Z@^@\@`@\@^@`@\@`@`@^@^@`@X@\@X@^@`@\@\@Z@a@a@X@a@X@\@^@Z@`@Z@\@Z@\@^@`@^@Z@^@`@`@`@`@`@^@X@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@Z@^@^@^@Z@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@`@^@\@e@b@X@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@Z@e@a@b@`@`@Z@^@X@X@\@X@`@X@a@\@b@^@X@`@^@b@a@a@Z@a@V@Z@\@Z@V@X@^@\@\@\@^@^@b@\@b@X@`@d@b@c@^@Z@Z@Z@\@a@X@\@X@X@Z@\@`@\@V@^@\@g@e@a@a@d@\@`@V@X@\@V@X@X@Z@X@`@X@Z@`@`@c@f@a@e@^@`@X@\@^@R@\@X@^@a@c@`@d@a@a@X@e@n@o@i@`@Z@a@^@b@`@d@d@b@a@`@^@Z@^@Z@^@f@f@c@b@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@\@X@Z@gdalautotest-3.0.4/gdrivers/data/true_n_nominal.bag0000644003401500001440000003762013614004466022066 0ustar rouaultusersHDF  ?`TREEHEAPXBAG_root@(hTREE8HEAP`3 @ max_value  33ASNOD Hh H Bag Version 1.1.0$tImax_valuemin_valuS6YJSNOD( H2 8X hrow col depth  uncertainty   track_codelist_series 5YJ @ Tracking List Length 8$tI$tI   .6YJ HMinimum Elevation Value   A HMaximum Elevation Value  ffAH$tI$tI   p06YJ PMinimum Uncertainty Value  ? PMaximum Uncertainty Value  p?TREE "&*;BAG Title2003-04-17publicationName of individual responsible for the BAGPosition (title) of responsible individualprincipalInvestigatorSample MetadataNot for navigationonGoinggridenelevation-75.0-74.046.547.5Raw Std DevTrue DepthotherRestrictionsNot for NavigationUnclassifiedDoD Distribution StatementdatasetInput data for Processing StepName of dataset input2003-04-17publicationPerson responsible for input dataownerSecond set of input dataName of dataset input2003-04-17publicationPerson responsible for data setownerList to be determined by WG. I.e. Product Creation2003-04-18T12:00:00ZBarry G.user00012row102column102pointfalse012345.12345678,22123.12345678 12349.00,22127.00DescriptionDimMappingYour Projection (See NAVO API)Your EllipsoidYour Horizontal Datum191.02.03.04.05.06.06.07.08.09.010.011.0100000.1A@AAA33CADAffFAHAIA33KALAffNAPAQA33SATAffVAXAYA33[A\Aff^A`AaA33cAdAfffAhAiA33kAlAffnApAqA33sAtAffvAxAyA33{A|Aff~AÀAAffA33AĀAAffA33AÄAAffA33AǍAAffA33AA̐AAffA33AA̔AAffA33AA̘AAffA33AA̜AAffA33A?G?\? ׃??ff???q=??̌?{?)\?ף??33?z?•?= ?Q??H?(?p?R??G?\? ף??ff???q=??̬?{?)\?ף??33?z?µ?= ?Q??H?(?p?R??G?\? ??ff???q=???{?)\?ף??33?z??= ?Q??H?(?p?R??G?\? ??ff???q=???{?)\?ף??33?z??= ?Q??H?(?p?R?    :6YJ @ min_value  AHmetadatatracking_listelevationuncertaintynominal_elevationPAffA̠A33AAAffA̢A33AAAffA̤A33AAAffA̦A33AAAffĄA33AAAffA̪A33AAAffA̬A33AAAffA̮A33AAAffA̰A33AAAffA̲A33AAAffA̴A33AAAffA̶A33AAAffA̸A33AAAffA̺A33AAAffA̼A33AAAffA̾A33AAAffAA33AAAffAA33AAAffAA33AAAffAA33AA_CRS>Your Vertical Datum (List to be defined. Use GSF/NAVO API)enPerson responsible for the BAGOrgainization responsible for the BAGpointOfContact2005-03-03ISO 191152003gdalautotest-3.0.4/gdrivers/data/n0o0y867.0fl0000644003401500001440000001100013614004466020177 0ustar rouaultusersPRODUCT ID =98243u00-01 LOCATION =024/0340004 ACQUISITION DATE =19981108 SATELLITE =IRS 1D SENSOR =LISS3 SENSOR MODE = LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = PRODUCT TYPE =ORBIT ORIENTED PRODUCT SIZE =QUADRANT TYPE OF PROCESSING =SYSTEMATIC RESAMPLING =CC VOLUME #/# IN SET =01/01 PIXELS PER LINE = 2741 LINES PER BAND = 2933/ 2933 START LINE # = 1 BLOCKING FACTOR = 1 RECORD LENGTH = 2741 PIXEL SIZE = 25.00 OUTPUT BITS PER PIXEL = 8 ACQUIRED BITS PER PIXEL = 7 BANDS PRESENT =2345 PRODUCT CODE =QUSCB02AZ VERSION NO =IRS1DDPSV3R1 ACQUISITION TIME =10:32:21:823 GENERATING COUNTRY =GERMANY GENERATING AGENCY =EUROMAP GENERATING FACILITY =CHALD REV CBIASES AND GAINS IN THE BAND ORDER AS ON THIS TAPE 0.000000000000000 14.800518000000000 0.000000000000000 15.664403000000000 0.000000000000000 16.452330000000000 0.000000000000000 2.438135000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 SENSOR GAIN STATE = 3 3 3 2 SENSOR STATE =GOOD GEOMETRIC DATA MAP PROJECTION =SOM ELLIPSOID =INTERNATL_1909 DATUM = USGS PROJECTION PARAMETERS = 6378388.000000000000000 6356911.946000000500000 0.000000000000000 15.559494018554688 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 -169.025643269999990 0.000000000000000 -1.694393269999978 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 UL = 0112759.8914E 484121.4325N 14640949.897 664286.388 UR = 0122220.1753E 483303.1920N 14643714.058 732754.313 LR = 0120849.4264E 475432.1714N 14716977.944 729849.305 LL = 0111507.6857E 480244.1867N 14714213.782 661381.413 CENTER = 0115243.2450E 481723.0902N 14679096.935 702319.923 1370 1466 OFFSET = 680 ORIENTATION ANGLE =-15.56 SUN ELEVATION ANGLE =55.3 SUN AZIMUTH ANGLE =160.2 gdalautotest-3.0.4/gdrivers/data/aea_compressed.dat0000644003401500001440000000146313614004466022042 0ustar rouaultuserspoE!˕|me$E"k+kWD"H$262;9m6<3MTr)\JIxDY*r9E"|RĂ DkRYe`Pj>^SV9֍yjo쯋gŇ{csO(LO]^w8j٢~箟_Wt!x|TrčM2fR)v H5kM!Bs B̅sfG|rkMGDcǠkm8Pg>z/maȊȒko9LC|r芨H3:)z]^S \! } ]ח )Wa<ݞgdalautotest-3.0.4/gdrivers/data/partial_block_ticket5950.nc0000644003401500001440000002515013614004466023413 0ustar rouaultusersHDF  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.0.4/gdrivers/data/small.gxf0000644003401500001440000000012513614004466020206 0ustar rouaultusers#POIN 4 #ROWS 3 #GRID -9999999.000 10 20 25 -10 15 20 22 5 6 4 3 gdalautotest-3.0.4/gdrivers/data/byte_tlm_plt.jp20000644003401500001440000000236313614004466021511 0ustar rouaultusers jP ftypjp2 jp2 Gjp2hihdrcolrres resc''uuidK=KCզII* (  'WN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|jp2cOQ)R33\ HHHPdmy_commentU`l9[ lX' Xϙ [޸ƺ5UWʻp:l 1Ar>zϔPR(![Z.vȁA@N*/ 9X X C,o-tA> [X #X <8|B@ \쵨6-tOyVjv 8:" jf,D(`ҋHy ;!64|4EE tB lJ5TD|B# c8_ ;lXb}ęÄ0xx@  a+c 3NG -N%Y Ҭob>@`DBЏ-o>L:"AQ@f :(:aaA`M ,9ZLƿ6 0ߚ*3 "xRPQҸRѴ0A> (@z)"3k XX ,|gK3Bɜ*r,>! A@IjÂ0gQB"@ 09@:FnxY}R8]gdalautotest-3.0.4/gdrivers/data/fakegsc.gsc0000644003401500001440000000007013614004466020470 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/small1bit.img0000644003401500001440000004031513614004466020763 0ustar rouaultusersEHFA_HEADER_TAG}&{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.ZRasterDMSEdms_Statep$4DTi0$TPI[[y  K"K$K&C'Y(l*4<+r,p-.^Ehfa_LayerEhfa_Layerd{4096:1data,}RasterDMS,.rootroot}}IMGFormatInfoImgFormatInfo83122}Layer_1Eimg_Layer,,@@=<=<=<=<=<===<=========<=<=<<<=<=<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-PPP,,,,,,,,,,,,,,,,,,,,,,,,**'%$$$!!            dr<---<<<<<<<<<;<<<<<<<<<<<<<<;;<<<;;;<;;;<;<;1110C',=J @C@A JA6 C%/ wD???>>>>>>>>==<<<=====<; ">>>>  ;;;;;;;;;;;;;>> !"""#$$%%%%%%''(((((())****++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,| ||8???8?88<|??00ppp@C         A                          A D~?????????????????l{|???? ????????????????'????(???????????????????????=.O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2210 0 0 / . - - - , , ++-<<<<<<<<%$#"""!!    !==<<<=====((?2|0|xx?x @??'??????????????????????Ǐ???????>?~uE 4-'#    $ & ( * -. 0 1 4 7 9:;;<<<;;;;;;;;<;;;<<;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)(&%$""     ((()*+*,+,+,++<+++++++++++++++++++++++++++++E544220. . , , - =<==<<""! ;:;::::;;()* + , - //E#(((((((((((((((((((((((((((((((((((((((((((EZh<<<<;<<<<<<;<;<;<<<;;;;;;;;;;;;;;;;;;;;;;;;:E      !!"#$$%%&''''')*****+,,,,,,,,,,,E/ /gMap_InfoEprj_MapInfo/Unknown"/0@ȩ:/@R/??j/metersAVERAGE_BIT2GRAYSCALETHEMATIC@0.00StatisticsEsta_Statistics?fU:0?~ͺ?1/0FStatisticsParametersEimg_StatisticsParameters830f4@011GDAL_MetaDataEdsc_Table(21 2#Bin_Function#Edsc_BinFunction112RepresentationTypeEdsc_Column/ }:363GDAL_MetaDataEdsc_Table323#Bin_Function#Edsc_BinFunction:32X4PyramidResamplingTypeEdsc_Columnq/14 RRDNamesListEimg_RRDNamesList4IMAGINE 2X2 Resampling 5 5small1bit.rrd(:Layer_1:_ss_16_)gdalautotest-3.0.4/gdrivers/data/w0y13a4t.0110000644003401500001440000001121413614004466020110 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/12bit_rose_extract.jpg0000644003401500001440000000343113614004466022600 0ustar rouaultusersJFIFC    $.' ",#(7),01444'9=82<.342 22  9 !1 "AQ#BaRq%235DSbr?G;Nut޵F8hR7=?!MKO]hTګZdR4ҭ -)ZnQ#pўSu::J QcfĒJ6XWoo# ;j\UHWEh2KR ;HJ ($p9r5jm^Tʄ:$xDwu 8 YU9覑P.u:pѠU].)a .Aq)AN<>~Pd:ac,uN#;9ښπADWŽh J+)(RTȍ9N)% F{r؜$߉^]Ԋ]F,'?Emٔn}op^SxBtW*ޕ{bɈ™ TV \Wn#.W}wsK{Fmr6n;&4fܐ͠.-T@3 uԭuiFUj̘CUalYY!*$êr2xW_ڳ5fkQkui+t(% ȌeĄ%œBHJFAP #CqfT .lH?8; -z`mCZ5H2:TqL!AiQH!]S--MKe_}T2-ncZPPyXKZGFJiǞ Kt˟oHڎ9Fdւ}a28,?.o4նe9yBu oR;׉}`K!jKhRv '窟Z5)T \zTCrU/yx.^7 bhQTWx>ޱm^5/5b%NNڌ$B| >~.mx#Kr=:lc#9ݐ>OAm8M۔ vIH׈8_^Γk34*C*m)~8鸼 ɿ*j:QW!~D \a \9N=iO1vŇJJRtGBߖBa wWz e*tV(32Iyը)Y??GCwM JTN7 +/LR'vzgoUuV]Mf Rxf?ۋ%#+gdalautotest-3.0.4/gdrivers/data/513x513.jp20000644003401500001440000000552513614004466017747 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdrcolrtuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|j+@j+@@A̞LAasoclbl gml.dataasoclbl gml.root-instancexml 440720 3750120 441920 3751320 0 0 512 512 x y 440721.169590643 3751318.83040936 2.33918128654971 0 0 -2.33918128654971 gmljp2://codestream/0 Record Interleaved jp2cOQ)R\ BH$WWWbd%Created by OpenJPEG version 2.3.0 , ٳfPTPTPTPT , ٳfPTPTPTPT  Xww , ٳfPTPTPTPT , ٳfPTPTPTPT  Xww  X g g  X g g gdalautotest-3.0.4/gdrivers/data/jrc.ecw0000644003401500001440000021440113614004466017652 0ustar rouaultuserseP\(0@\(0Az^SARAW3RAW3@ddPa&bF8e5MԄ>ZVecCmYgX IxO?d[/04:9685'9*#3-J^z |]PbaFt_w\GL`}; QrknE7Hyou qMpSUvR<=1sKjBD W{Nlh@A~fiTL&2d"##########3L&2d2L&5ɤ֥fR3u2Ljjd&IZZDf"S3uuuΩ9眳rX6 v!59Q9Dfa-lplm-.ֲs0m󚗅 v{nMT8f^ K^edmDe9xYrZ}J6r[QV\ L%,{B ]/F̒)IhwAv[nV(6e\x "X~x6bϷF!wdE%SEYrW ~z>k 媉A)1Biŀuҡ-C1ވGLDCV = hH/"U=hgWgR!=I?avx86T) Lkٍ̙hTIMdeKu\*SgLKW$Xb;xgLq#:WɶCQ|n-tQMz:8v(mDV}lU iZ_jXa1cБJ4ml'v x;eD$B5&\$ha<3A],WH3y=^^Fiw2/f<ӟ=B MVGAdhTIcZIW.:[Q쭗.uf`׸Ơ;ظ&Cdž&F"Ѽ$溃G Ġ㘡rG>pX8|gb'O7Y5򨺑5\a$ i~rcLچ4o 9v1\GyÝSJiboaS_imITHzߨuI~J ma֚-xHҮ(sb8aaw },4,:We`$m1A;3ȕ܈'S 1:iw]&ڹaf99;C%dMv6:ˉ)AU9v[QB\&=rmAV ɭ-unY'y.5(S_[Mqll0̿}uD2MRV~=wꬄ6\En&sǷUwUg 8ٯtsSPXO0#ۜ4Iդo،(9)x"crJ,ݻ6*f<%Yʟ[hmD夿*9\SPc'`v~bXiL1}DeHp;]t$gհ\\v]W+ЮTj@7vì0Z G21ŧա%'p R@_~ ?N,3{qRU6[Qvc1"ڦ֔`9Zk(pWFX8mD̍OژA_z~t&5St~ɮ*Bnxy%!.} O;{-п[BJb4%gvlTvtn7Ե@*0z Wt&:XS l{:J^ 0YY )*cF0X * ;m.Q)XYlY@@g([sVg-Bo,uDgU) @-QTX )띊;w7!hl, loDžDCE5͢m k>f8ڸQXsF:>͂ 2܄戾s$Q@ZoɎ1JN'FGL[.[V_!Tze}lK@fe#0kR ؠ9ށ >H h/= idzB?祊>!URr|ـųOZ= ލ}ؘB4[Iڴ1x"r/;RS3xr7O!+WEFjౕmBIZ5I6u&;gWݛC)!ۈ!cJx@V1+6qd\zXc~[^{zʱ5oq(yV:zYuL `8df cPJ]K_ V9X^ڍ왎cZՋ~.} z˦9@sΔ<4Zbv&v*8+sx$`8Ev.LT6e.ҠҕиSoUhg1ճ󚞞ԥaF4G) c #0_t`~R&#)7tcCПsݾɝ<͝Jݩ:֙DUq٭kH#fĘؼbTMMKtw!X8T)ND]k\.H,,q ܶy/V{1'NMp<G߉G!,*§ؔLy 3e2Ƅi!z=S S$/I5H쥱-sNmyk&heDSRLBLƿcx = pgfɓLzM^yme=8swhno4VYsnRVxt?|W̱RjGs%xg +;UڧYgn1~˪Qc.5mX 85gvDgkcᄏޣ}6Ne7&1<|8V Ad&1=( ^Φ {/: T 3Yf%'}cx<2sFTLFde+CW.;q\ bc)HB1=^7yi,s]BLkZJTԎ91,﬇nTjN]0#j$l1]ezIي<Ѫ:-s*X2iCS2}Sbv SIgF;cdrtSN$q`u%b5˃mUKVI׭@[vv G.̝OGhL‡5|FP;X-p]>ṭE\L@{Cf^:RRsϟR#a[tx5)T?v<2TA^;u)I H)^YVNVb"X*Ӡ"֥j}Dz:CZ :"CGC1.dvG>x 1U#.J[NXԨt `Bkx8R(PR#bHRmZ 3^5X8 i,!%E[]Jw`F-W;q" d%&2hɫUǼ*CSf4W,I=ŕK:5B;7Ί!<x*֦ԶZVQ@!qģV]4-TZopn/Z-h{-:qnPV쩙 $R %Y6Ղo2p:;QhV7*IXjP)%ToPKˈ~^ *^,c{ܫJ-$Q>C1S.M!5}}5VsHdǐ[W/9N{"o8^5ۜҙ١3Q3 7ZJ L /"{PZigGw%TgaMӳ+1B [pү", qnWyK`Fm112&MzT0ҺP0v޵Wm5sW픋ܾk%QOuҽfl ' /ݛSтd!pэM^7K匓47NX> 4v*a٠KT 5At`D%'Td<@/f7^,:OO3l1ľ8^7ۢ[ hu/Ӳ [TS4sI#Ҋ9.,쬦` Osa~sl + *Tvh^l'vHz|E"[Lqf/9ĸBKex5KG2h7Q8u'wdqDI^Gps-궳?hO{iCNjQKNՖ˾ f =|ӎK5GjC(}ő9wgkP(INrYt1gN% L^[G LgUiTTtctX }#=R|b{ J0>a2]i8FNլɯjذE2hMs'-,gO֔u^טlM$Ddʎm"=p7F%ܲ{8Y[okmfe5ս7ҷxEi=e2HN3bRe-;;{Dd੠ze nvȝ_j Z(o$'~Y4榭K'L6 Azs+pgA@-Pj}\ɝ,) ,^2f K zo \:`3a!&^3)Iռd.qs($"ڥXvҮwe${#v7P  c6uαFaGh6 {B5`#ӕH3X}LSf|z1G5&vW1򯛁3X&V5Zhڨ}к靫o/m[7'_?ʃ됸.<H<eK=wұvή *UoQܥFr7ݎѿ8Ngά\Nq5pDWܶ`VJ`*Պu7+/jemnhd wk|Vm'lƣ9؈M˾12o[ i5]>a& .!m\qޝ\%']=.g I$_[T3 5ו$Po#^rֽ!޽$D3[Xy僟wn7I|:hōoq3mT!"S7\g[q<]'ֲy%N!Jm(+vEsR+NIz0»7^钜"\'!Vfd[֟Ѭﮫ9,my *nڤFpXYDzq#Kh>Wk9WL7Bᚏ z GG9k\ܬe~2}[H]ʞ6ԲiN4^yټ$BZ'Fi&BKVv6ɍ㓽Nw@WF05þame"vB+#\W}%t381xXVrZ!RˣE"DOB{u(zAz\RFZ85'tݐ5!q~xhnʦSe21';yezjBZ9NYUߨ`Mn![0nn>I//6~ IK`f[\VO:x6rU%u:;4Kŗm+pd ҥSvl\b٤1D~0Z_'4 lf`8# ^7;(dB7Zƛjw+P]Wj;T)ss&nR̠<ƠLK,SQYlBH^Wl|ɉV|dsJ%M)߈`L,2gp-R0X\%veO%l2\7tvV, Z3Oj1t:Ӧ2ۿn{I&N#C!ZYi4e{Mք6 eDE\T&]C-T5pY/em ^Ѯۉ*zF]3/Yu W]+ǫBEO6BxsK/-;G9 z֞''5Xlhr`egvyrx;@Hc@ċ%qCGƃ,[̲& bE!oL홐;Ɓ&^kzNԝԳDl%z/7OF@\ҵdO쵁㦰SkA 6zd (aeNU [7txa3Ki :\m^$pk.TCS${I X?ʽ&s]N;yη'X6+IF"R:Y6,9^BЏ]]l4w>?34\&^$z4G\OU*rVZ&N@(zbے-q.gn+qD |Z0[b2&ۺ\ msYA9Ѵнhg9}\n5Af9(PLkjFtINr:Hr$n:7;*~PZ;q~̞f:@)s9۫t;Fb d+AgjU# w\{XoBn> ̓,)!C맨1$Ӏji::*vhSUaLh93ei^\v*^kD:vL:ہio(#Rʭ1,݊cS!'Z衫 PCX_=O.VehVcmG-@'/moG^=5ٺez K u5EOL^U64^n=\uavˡKrԭ w[!Z*m ɑ mqqecy0.nl/dyr/Gu/+{`{ٯEHᜨ rXuaԨ ]ȁsΩlKMd2L]&5ˤfRR3uu"#3uyIԥPWW R PRR?5.SY..d2L&d2L&d2_;17@7)%@M@@N@W\^>@2N=(+641@@]DUR'!@@,-@.@CSB@T@c=@Z;@Z@D@R[X@TQO#KE@@P@5Q@jgkV\^@\@UIH@G@M@J@V@]`@hS[@DU@b^k@fW]@YaQ.0"@%&L@ @K8@?:A@:@(@*@@$@I@-<#@J @[@K@AB@I@&@6@3EN@F@C@8'@E95@<@9@@H)@2@?@B",@+@!GO@*>b0@3@d@Y@PMLFL@HGCXO@@@/FYZVXA@@/@4@$@TY}={{{{{{{{m{g{{=o{M4Msyq4Ms64yyyq_q`!MX\>n\G▄&vTnv`_J`Q`JQng|`sgnuCN ]LVr5urz%{NE#[Q >|řkauYoᦷA0l@钮2+ vg9WirA{rT ~BH&zs#^Q]~feѫv- ʖ6g[ uEeo͹|< }~=>vuۏ5rn6ƶ릔ߴ'RІƁ{Q6 z۠*,_!f{so WMAQ1\{GD}䒉+%Q$,aTMZqqoz+#7]xs4;P,:7K :to]؎!SQʁ}֔~ܟYv,2heҽ||l>^V-#wq聯T5n|%^JHJNU7+dXb~@?e9M[k-cyxc&z>9> (1"ʳcZ&jY95I/ ])׺3_:|9'%&Xȧ^610LӸcQ-wҏ*wvcY8{rB^_[_^Hꪬ)z*`X'2wfsA(TMNաk% v)" Ke1 l|ƿϏ}o!'+چrkɏUۆ IZ?ɈXz:YM1w{2B@Ɔ f\vkiO0*Q3aHBVQV֫=PL[uӺ6Qd{nM%dr_X4㩽%78~fk1RmfIŹbl3 &R T%]{Nsח8;C~#[2fyew214}씊0d:u7|Nr˅:-Tm Q?@םuK'*’֗waG]#_8L7cUڶ; 則FγDR5]NQTB>o ~YҾFcW(.}s`^jSGrZi^Z0*9'm-5ؼYJI&.F/iIr /GoMWzJ߹ln71wΟr#-`;'F@`1Mn෿p]XXu/pq DJE[tk KCz0 #楶e^X%³P@Է fT U},qjwxpX\ a,b&RJwU,=&x|9}2?_;͓Տ;'+EќqgIvPLe(6뷎L~ Cf9QI !wbGcPGz]yZ\o7@~}L~`2H|}1,: ҳxZ6^7{KzQ㞰I! Pd)2QPnZ5gx6òm^G( Ӧԙ#޹z\1!~ Fz|hc 5*4sj'*ƬMj(Fx ؿK{ r0^,i2aMsф KHkʟ ow!<&_U^.k^/r_{KRw!ԗ\@&2%ɴo6r1ڠ_j]|k;5ّ pI_`_rc 9bKlg];i:=KPK?hWX>虉Z㺏?m"[X)5 33L%լ n:hloto=tJs۵rD:X!K)K|cɭ/\~/i^Lנ;& nfcB'A,fUP,,ë6< Gu{O$Kmpٹ7IDhJu~03;t^kf lҥk1؈l4>Xś0%IG9[7MeN> pɋ X?{e[oBB $Z_存w^UXNPfR1#ٺe}oZi][HKyJ^f76öVMQ$Ct[ߒI[cH|zo^c +B53a)lUIes 9JLةİxrEޒkOr{Vc%/yq{Y:vҜ^3=W8M9-:- ZT2J3_+6< -3Ж]y-EΆ*S BA 9nᒡ̙,I3N5Ě3~f*ز!d~b]aQ#hτ/ٶNmLq5ZԀ,9:[ LeIγ`.z/xd+~E0xdo2jm],{i2YŦ/l>R6#=E!ί#Q)xU4ŻQ^<_[/-Bk(7ɼvC/"mUj)tgtǹv ~x϶E+->1qmm:TD+m=0 s-c`DZG'OQjǦ$r}5X𻖫>p`eط'mH;P`q6jʸuuIDl9VOk]qDf4?l/P‹(g&Nl J,:_WTUsr^>sqCm4e3c3lelm;W"H3E1,$o`RHXs]` A׻g>?U![`/QWy.Kئ>0oδv 7ak^g% nb@䕗YV;tٍl w*l__r7E#.:A9ۈ}y7aBM?VP[aU4RAU=?kIi;it1컑b$ޤ!A;eƹ"U "\P>):D{3Pt؃=!:[˳~c\m6d|2*I$kӃfsClZ:bUA4ZOݝsDv%?=[?q--]هv%_1I7 5D@^mZyX/0Tx<ޢ8dQݱڈgSlήҽ2X`o;FӸdRiZpƶ:O~'a OL{}fs1+ڏ7gK!8.^-u2ҷ۬eCi=|e^^&CmFfl$U`LU_|ϧLY7%8A]NCSe/NoJq'#xQ+ 3Z/z/}=Ρ[40r吩^#'ЄN] !,SAn/{9G?w~s` L{R3}{yཤm/,ځI!f V|@1k׿Oǜx+g ]#pnmyIMbE`q|^ ıŻ%_f\WlBsȱ/ew͠*8}+d?(-!ßoɈ8[}TV8w  bvLoγR ߦ=|EJrԆX:w7Cdk_ҖBߑC0L 5C$6X<|UiR{Q$1!?U2]FvElm@6D_.mN(pQg2TnK՞d5 rˠq()Gt": :(;:)r]TuP*ւ͹\,sݐpv>R7^dp:Rܝc`e+ A&k601;;y+^ ̖w6 L;4CuNr]cG6b̦&9yUi/SIV<~I!mWJrweg.j>G>gΫ8S)]Uq+ޭ]ROQEWZ4տLQɴ;3Q rbGwb}$֒Vr6+2Ek߾|:Db,ڑy{6s)D++ݛWw:|u\A1i}_SU<E(FԨSJb&u ctj Jd,^+TrDv7T%t ,Wɨ!yO)p6߻nIf)KKFVdE04@SV^`4 !d(zP-g`!tLt$l? gX"m!e]?}u/AWEne BN0!a=`*nb?]7?F`ҝjnik)ꁄcs_דkl@RބS1 ĊpJZ #/Ɉ۵s5d\-?-5ΰ.}OBE޾LAxm.[82>% @jcRT&Os& *߹\]ZsQZ_b'yѝе\L}q+~Hvk>ְC9[Y&FڔJOqJz-{5xBv,Uc2R.Wf2qa{cΆI3ur)Maxqpm!Hb97unX[`Gftj.@)>DqҀt)ѷ_RSMfPwȓ|jĿ4Nu%=pP+_2l+=9ד8:\3WiOYT.Nv"5~*ǝF!vTl4>h6E5au3#pfoR|}W|}b9ct v~kKY*tIծ'5xᶧGu;xv u$$)k~N%]@]Ƚ 5A'䑴5s:If^s`nU =҄ŮYƿG>Eъ/O̧۷Եo}7 D^_b=2*rw>w~?Con>f #ӱ\ln2z*է=SGd^&e22{ J|F/vIv Oj #^>K DZV YN~񦐣Tbdo~3HMT0xǃmHL[9T~6l**^`K뵣t-T/尟{L]9F f%z2B/Zmls]n}59?9E/;)). fSvDYfY (%+YBFm6nss~8qi:.!n#}+!An![ 68888<< {{{}='=Ͽ{m{{޳YMLV(@:;@@&@9@4@N@7@6<B8U]KWT"!@@'@#@?@:@=@F=)DC@KH@O8@G@9Tb@dLR@S@HT@&@a@|@v@c@\@X@n[V@@s@Z@R^@efqcU@eP_JO@\UP@V`@[@DM@SD@EN@p@]YZ@y@a_@i]@Q@@aSR[JC2@0@'/$@% -.@Q\#@5@5IK@3>3@A7B2/@@O!*0Y@b<@cAZI@@+.>@6@;GI@B@ @,@)@@(1@"@+@X@@@F$4?E@@@-@J@dML@1@F@CgfA@@@*@H%@,_@^GEWM7<{~%&]I]&J'RJb\jzr]1$εu{Cn9H q&>$d']~I0Wܑᷝe ߟ08XKm\a`)CWR:f/17e#VS(ðG! -zvaE PbDF{n_:bYF7Ջ *v&vec>!leVJ&]! Э$ts>#gǘCv^ sܿV}5梘Dmu'&0§_'ew 5 R)4c?tRHK ?YCLa;OĵdzS&ʋ}}WdY4ĀsuàEƳY;XYG &&@~$n }1{7Ö[m<֓ yvaDUX 'xf'/yc|-NK:,%;xvMGj?ihSYUQKZ"2~Ǿz@AސR~MI_> Ó0|47hp4HF3zQ Rar%Pm2cJ~p|avhAp(fuR2N{s9We.gg'y9gbkm)~KK+`VK>wkస` ͝x Gua4% MpІ&[FC=焊SFFߏٔB# 9i8c+g>yLa_#T&tX~edō$$rWmEbr:rzw^tb)Tڝ[;obż|㡪 Ǿh=s[o> 9< x?2gjӑBIwt,0+CNa 9*z] 05N-棌^*cכs`{rNg980C9\Ŏ_aެ-%=dvLK-p&]=_YCtG>J"G|q <٣|W׾u&qICHy,w [SbT(W@崊faَyTߣ*DWw؏ι96Ur^n~FN<"WWq}yҀ{.s5?F;2Esլn~X qB9.o^ ЏƑsκޚVPG 5R,˞MȈ'6 [Tal:ݿ&d(!6w=_C{(a5ͣsNwBt&,TBųVVW~pKs[񧶭GDmJќ+~;uКÄ<{hB㒌,n?}Mx^[1Ҷ>]Ϲ߃.QY-^e@9h%nCLKo%G;wR\%Y6W70{EZI)3}o*ݠjZ>ѸX%90D咳z&}kݦXmq =W<UwGfL/}4w5&VM>VRw5 ,vvӒ7R`_ +굻3|e񵲪<] )cM}5'$.K啃Q+zs_AFrF%g3/7+ٌ1EFbPF-ǣSjseV݇l Z5,wdtJq03ۺ }g](ާ0>>ZjG~hW4vn&'RK~ˠ+&Nz'p%M a ޙ #.ҝpĩ95WQ"˙$j>N~xFњY w̟p=q?YI:/CCD/C&9>a5V]jWM{}":raoO1D$&y!hM,]bkR171򆄐DZK&,&nEy}ShbC0#ZݼOY4i>}g?~l +; va{-M_?#\j8,/Bjr,qˎ3ϥ3yYf'9:7ֆɓrGֲr6" >>Mx,p9jR1ekBM>xr;?Jd:oᐡ;e0f`?@r PEjdmlik㩸?HɯNdoE*{ ݷ_fe#YGtӡc9s-撑\|qxl^a`sRdK,܂bsU,g׆<)ت$/hQDv3D=y"KB`׌ nlګ_-%ǟ0_gb&}MP +;yERfU/ l1RWjM>h R>1ߓ'.>4i+ G'YVj j2~xW>PUkT/{9}9MͿ?Љ1z9}9~MyX7 #M>4~Ó+pX*?bC/6UptZXښPW(k:S୉ܩ ~-&s-W9 ,S7gI_`H vy{TLd=?MhB/9^wo&'[;~ #Xuh0e>_D!=]2whZ *]z5 ;B# Y}ln&{@G '}MU%^ﱵp>Qklp^>ZC{\U;_!5>OvmO^{?Ϭn!wM &u"TeL:NiFZKmܽT?_Nʩ)sn,U=m3z"ȳ?daB|b9@4hX0U0nv߉[ jg+dUń\0:xbk}$+| l-Aښx|><# ҽ\0(Ly "faR8m?@[3N랂 *~3ϏREvnVGWD᫞ƎEwiZ 3kѐO(ju+;PɛU?z]LaٽR\<4wFrC^y O~[칾CR͐Kܹm@?V,=}S7EET Mf 䰫GiWȳl%0RJOyճkkhPaSx۝\iu! hL·AE%8Ԥq5 |:{ [[cFТ/78a],dM 2A>m({)~?ӳL)l ">9]̆ ~/W c;kê$J?g;Eya)lͩA q-:vG˟ 1Xb/.qY')e7U_;5G_%Uwzt4wsR6*ua$cfuom,=Lyfa{ h5Vڜd=u sGޕ 5&6ߨ&n!gV?qp-];lKx39Roϔ?4v)XuVH a05^Qm/GxWlBjַ]C\Ź>3[ZWf&C:./=kGUNij +_ѩ[~G0cȇ.ypv%v?n|ݢ6038.X+KꞪx.$f~լq%Woͭ^Pܗ.[VJӬ׽a#Moqns0Ҏa b])\\93:Zfpڻ`K) dYi%SG@.7])j s6}ݹoau͖,>pcB//ͳ xMzض|{ u5,z-Fo6<>ZWtB>s2oʙ€Hd0 WUO6cKk+yVyaDzK8:乽e/v=m_{U.gsXJ&A9o,%$j* M/5WH˭]׫ִIOҰi/kߒ(lӇLX\Z(G}ʾAL:Rzfږ,9;"XG)+ݻv)4fI6Ꞁ]n!rn4]^+*l]wӆư2t?KGbqA|Uu|"ޭ>ԻlTb)a13oK;]7xNE >56 oB( =hZ[d=D!J8-%uS 7cJ:a~ޗ71dgjh<6uWw-\up uA b(q_~ w&h[.^>%Hಁ}ک/l=ڪW yt|bߝǻ/z7.ګiV 6$3."/]ݼږ&-Uhƙݪ= j<"K.WFZ=kȿ&T»bGMȘ+{Lf7=b|m/"g>vdG{\w8;T |AC_Y}[ȇm N(uvnje}Ueq޿ ~:Zz JmӒZxtszkB?*[S/ncW͇MHuv;8#/cwɍτ?[pc~&Y݇@ !vqel`rصqs?|G15Q-  ]h[.hmuq-f폱r1?T.b,.~G+(O&u؎ej l^d{U=؜.xQƱg4VO9,JSG9x,q"Yswt댴vgAg t٩Fb{"L֬k-݆Q&<3X*A3EA~OҝZOd!?/Wv>`~q4IyJ!*4վ>eئ,{ŞN~)y/DhҙuTΚ$m͕e} ݭ£M"fcgeQJʉ mj". _uک:AfSˁ%mLeoի&Lf-xaϭU'g}9%ז7CW)w>bMn-%OL2/ge^_RQqũ>2^TLī)Ws&i赛?tU92S\ `{?;A*>[mkQY!'^f"3P=^ָh GA|!;Yb [B?3{&LE6##,c!p|ܾ LKKF[N!vg7)uSSO=vSJƵMOR7]*~jI'Loדfw EUM@DCN@%@%a@O].#6-@1@2R\"'@&@+bSL^@[f@Lb@W`T@aV@$j_Z@pX@O@[@^@сMJXf\@uRg\Z@GC[N@Y@P@h@eN_@W@I@A@R@1F@VgDEH@K@D@@=@@L@B+@AB2@3@)-@YJI @(Q<@F94;@c76@54@0.@(@!@K5@<9@@Z@$@ "@@37@B@K>::@E@G@X*@/=@G@,/@V>@8@,@@_*;AW@YOS]@IdJ@Q@@H?0@@H@!)@$&'FT@#@M@8C@?@8_3_i0ŠzW_ԇ}%}(0J)y&Y`J 5XI]J)^eoѣg_)^B E'캱K2|gɣ4A 3ߦА+)|W-_Rer\ax]l~2RƟX9Ɠ@a߆ o[r(bŢ1yGiPH ²#BȮ` oѠSf"ڹAf?AƗ5ONSBeT{Vj_pG3gj$nIgTfNtU>E: n 'K683Od^/( h k2wiHqtN3r~ݴ!r;-OOS*5NV!($gE?`D|t1&x>2$ "(y @0n%kslϫr]'?K>^k1t\xd+֕溆oF4K$)#ag85+p(ݥ]͖A2@|=9bSv#)աJM,WNԛ-V'LςVkxuT Y'̙["s.40ATs |i| coY1=7a., (ov+|A.ibcى4>"_qM? ͶO*Э/>)-'%éCѾ@[>_AVc$NRa;Kvri\MUwh!'MxLZ1~gWIU$tNx}^/6 +eBB'_w[ɝ{6)1N[Qc|.WLʡGE _Ga\R^%3zp]K()2%XMA Rb&Q_dZܫNgԻ0wҾ 8 L̰BM )^wڭ1gvS.\Vs/ѪZ)Ueć^V6'N/]LVd>b- 1 !yTU]~{B_*NTR{ď{ JAﰞKm#wɱ,Sjx]{(PB֛B_ZLkua{% "S9U\13 9cٲ9siez7(Zq2ֻQQGќ:hO%6ӵ(k봛Ș0~rt k"sq1Ӟ i9vWOM,;Ϋܒ$+ΉԀ" %ɻ!| lڱO_ܳOɭˉ?H ݣ=vND6m{'T><:BP~cfY`$8 R9ƀv/Ng7txnߑ+FTUSL5OrGIļ~vwud'h>e!bhĨ>_~EO铹OSͳ9!_Kl,L5^ڇN [~=횫Tؤf;y p~uOH֐4 n[??)i^+)A!)a:Bϫұ^XH4(G/¢ឧ['8q}te.~+uʼ+{=^fyh,;AFPtqwbvIjrr7L`7ro!/E|KExoaW4IOd_Ԣ2={%˷ZNSyؽ$~'.Lk? l='dWgl,_d҂WE!i]Xgުm1.%OlK^,r%w4dؗb3x긳9M[]N8׶a ^%LTnب*œ C $/Y#k/# mxΕ!$=wxfu_z??9*pz ɞb[Yy:7]VKK`?OV79US4B \d5xSy[ǟ(:3eC"7+ |@$5Lq 9֖S_Z%zHx lg$dy{,jк(\$y%~AMu=ܤe%fǺ_mwvBVUɓ-7MF1Vq@vTؑg󼣷3A̞q_WREgFӵ}{oNslm#hVg8:m`:}HIYR,!1a9Q?}f6kfI=w*s.VxLpG#qu}uCC>c 2GRzE23e-e4ӛWgSᙽܬq@;!wkĎaO* ʭI0:mVO7A.3ßp;;CMvPYNEY-v Lpi…Y >aI:3rxxI >R⿡6{(˗A*m40FSfCa:悽wǜ5P9V0V]WXzϴ^衡M aH%Px+C_pE~܎8_RUaoYܷ2T~~r5sp[vmW\x3ʨ줭my~aNR ąuتKfcT;V]ŧuhF%E諣vlމdM7814BO8>WB8з?b1>;h$<72 ԳށpNny8rUFmR)ۥֺfo<~udsN0r _dAwQgYΨ_6{~4+;.pvvh3chL^n7?㦟NWmDC+3"zҀ\ܖ-%.W?{8"nbEHU]%+dDCv;7l=ٶ}=YHÛ&-s0 by_`yiqi?'<ω-,nڋEgT.jͷiESkaW˵29:^;0ί [ZԬ͍+5b;] 3ϑݨMlDW=M[UliQ 9,L:.ӢaJ ЎmדȶcWm+r)KOԎ}߾m4|*vxpۧmEPiV4'‚,o ѓc.^@X ՇA;y޳gX29\%n:϶[ާd<iv2Q4VshC$g>ȯ݀i%Ck[q*{.;Y侓s(]NfQ,\j1g ?O;)Ώ峠}pZ=rru\13EaӤBtjˬ2{wra"(!?BX^":D-ka03Z?#MZ~;K_6 LK2douOL;Wޓy62xh:s=Pf ]5N6pS7?ۓݢϜ|E%bE:-";B g?/pOaVuԈ9TpMZoE%}E#'3N۠Bq_|B㝏.߷) }0ZTφM'fϪZkdfE̚F0j0ZKy˨GG*NЬvF׌PP FИ=pY[_L0? &8csbob_P͌bHw /L2r%L/FMC弯V*6&&U>&meSZP]pUn<߻Z!'%E7dgDXO/d3GO/44^ͥ@Y3!ZN :Sh*׮Yzbh=-$M<t˯vG5"2L#NI )ԫU>_NY\eqYtr,O,NJڀje3|-~D,rːB]o9ư?,mw8|Jh'QNWvzs n<щM//t/R}׶[T | %Tf󼾖J2MVu\f+TvU*ӃDx: Ez0c[hDӽO#<_{]H=61n渟~Szm`5oG_* j G$k3B1ZOZ~ըHOjj.mosoeM!d/2省bxKZ ?>*]fBx;oYHe(_Zai hz=] ߺv*+2h>&<ϑވ»7_ˁǟ:xj#٬lE,_Ltn)LٽHl䛶iq_=d"$}\/J%?J͚ǡ&>kH* vm ]0CǮ+B($*1 aߍIh }?%ꞩR&Ukln!QgPnmu~rti3c6=/oPc sj {^^=$-٢tݫNrϦߕ\34 :ɪm3@{8wt1 iK?# l-:SO ޔ͖[^}3fy5&>:lr; yKвs>w-!<-<eXS}64+\f䗊[s*/z8gǙXɶ#}ïk}%k[NbJ?˫ebOxTvЧڼT_<'Wwx#M5^ѶTXM7J]u7|[c%ߟ8|3 TcdtR~xZA|*N 9uHuYmQE5Miv:}Z=Nn; 2+<,'Q;|SNv]UWߘ2mGOly6mTՙK9tS߽XrZ3lKB]1pIf0I O|^T7ES2̓o ga6sSP'C*^yYЋrG(J%y u8<)qIg)C"rS$.Rg(n@B9W rnў5lh޳Q5Nf 9 b _3}964$ə;oy@1z&:~v9؜V '-Rfm`W"Hx\ MIJJT5uT"U%IJkSuNZ˵p?<抜Z{HӶ{*M2U&9UIuTUiN:9g|֞ExCZ;karN%""5UMsRIo$:2c٩{g۫m==o{at6EYdDΩJDJ:Uu4Uh-"U%UUUE.׻A.m]n޻C04uNHUu9UhMs|Ov^~cvEZK7xݷ9u9UuN%U"5ΩTUIU 'q.wk{EbgwAۢ1UU'.U%]j4G9T%]K.0m$nmlmwwפgӜSHt$U4G91GTR%"hs֞kvWr_=~AJ"zJDDTs9iꜪH8zu{uokϛdKY\1UUu.%"R%UR::*IJTݝͥmKs-AbXqm;S=%]$"U"ZDJD4"շh18^^[8سHol4hGDDDT.""]h-zkzkw۞uݡ6uv#EOIt)R%Z*D{Aګmw6vwgDZ-zKuhIk!E i7pec8QZﭷZkZDDD-ZkHUuN%vs=>۞ؙ_#"R"""Z=ZkњHZf_vۺm\ %~#s.z_o[ZoѢޢhѢ^9yݭ=sM38 z?ZkzoEzTIU1vM.bƭ۳dIQN]k[k"Z-ZJJFz)z=o {0"@S{ZDJn}{c{^~v kDeozk"RUZɶx0Ce_ B;oIJ{キ_뭵ڱЋI6It{k֢￵Zk{k}6r6;E3wE[[￷h[k-"iQz1/Ok{?{w$=|۰.vI Z?,"A͎aݎm.2xz{?~_IϏl )#E.ww;cgl~=w=A<.Z[hz03Yd"im[n`έCmEqFPZkDs|faymC#F\ z;;ƞCI,詷h=ZZ)_,Dl`#W/::Ƒ]={W;xG轵z[o,fAl"prѴ_;Ľ &z[E> QlT$^/g{r{$8ۍ i{baf3g #Ĉ{mk3ຑcu13Dal$v؎s!'g{o+|f/?3ه wcm^S{޶ZEE.^}v4muOz]&k3g~Oo7fa&;94i]{ ڡϼYXYQ佝*v:&Mr|fod͛/e'Hpmshk :&膷EQ"kR 9; ӠAFovz.7ч0Ζeln 9Zr..7 A||aE$HrA@P";I/Aiޱ3o3"/E R~5ni Om580?ϏEl۴=!iKi$-&ۛ\z7 {{>\~mkR`;4I_F9 sޓƷ6IZxv'Mڝ0 ^KG 03,[%I8.6i.I& @YE_;d{4Hw/P@QAItp ?3ϟ7 4b0JН.vںl/"0fArJQ b̆ƾ ;w o",A??Xplp)sP{tl+דtr 2I9!%6GM^  ցVv6A{=xξw}hw(շ{-z>꥓}HoMoly`KCpx~G]xolzۤ/¾b/PŶvc}6H^w=k-O6.oo4%wh~DQgg4=Gݕ8*';rc.齾w|ϖb!MYI.?I|Rg&d9;@wj!^V9y@}M򌑟#qۦ`6Z8` z47.{&tgg>**MZMG$Q1#j=˧nc{;*û+ዮOUz_>k}0Iѱ}.b:v;y3~<ꑜ~f󰉗=v6t'~u1K'LݽÎn]Vf:18m#^M(Fi'}ljؑ@8;&wiF"Yt{ԋ|L&)Vm4Gy}1~^pk]QyԻ# LGwu4q{% aܺ䈀4'~KsS|E"w'[:|%[aϾh\Găy^Iq:x7"={xoaY[D~8x9@$oҍXJPNkFvoꔝ^x莇NhOm[#{{ڻ۳WS hNOrz#|f޶;Pս~~w)WL"#:}jL+v9^L!^-P{Ni2_NE5w{ fp].1`.&.drÐZvk^xV{kE:3,lYp FuUNtpȡRHRFϻ>H+qX57*v1>G'ӣ;J^&y{KLj;1ӥ- R^;vQ Lm^!/k9l_/cجo 3Rp6:mùYL;+@,vn`bc<ӕ_w#߄\a;KQgN~f73 Q5w8.=Nl#uZ{ND{}wX_kNqr ѷԱ4*O^#~aSSm& Yml,7N%[{{u,;{I<ڛU񦧑|K`nj[yoԞ|]?g^/>,'n@,!uvةbn+klGج鹯q.˻7`q~98TYTX֓=Z*_8kȾ4=+KggGe٦}G|Cu$.õi\ջW ޗXiS=I~w6Ҹ}[6wNÒXd&Kн Uw3g#ylw^o{U6K>05jRvŶΚ8v@$ /\T; QA.riH6=ܝ˔ܱ3]u{nӻ]i*үTH4.;Rd8qA)DQ:]}]Z l/\7)w=ԋ۷#֮8]c4w~{moR<%ޯ8Ջ`_}̞ܙfduϻL]_eޱf%~gׯnTX޽{PzwѾc) .X޾i{w@-[)ݭ1ʻg{pp A<7mE(udD^\ z2F`%,zBWiZFA\q(S ^NMvww]5\[3BSTedcDhEgfFkiUV'jCQAbRaܱ}5|ܺ_Kb72g+n-}yXuzNvcݦĽ'G-qpbi̴snAaXs:[X{ާg/s$c΂_ʼnWP.bl;*z;RwHpmۉf:j/xlkV:ޫ/ޱk/Gjl7큵V:w{/; ؾF=ͷB+Ng626~a_=cUcR6ŎY7r|j}qAXo,خ-or|kq^Kn{-gu]bd>l|9Et#Y7/d՝ھ{J׍[W 3پ,\fN({s[twɝp2z]X4z4ގ+pL^̎Q{`kv^/[<z{lLxMO79:s Вu웇'I1ߣgNHZOPoL9SeM6r| l5ÞטFf.v7uƒ};.e؞UNަH4.}v2-}|}7ҽŴ %)Sxo9Rk{v-YA/zMG2-7ǻ|V\y/۱Pw[^ HƓ=<Ft#.!MY{j{{{O*{z$uJp;m#Y vꃉFxS" Ze}MM>.2=e[2_N}/^Hλ9ٱ| 4w,qyjloĞ lgcxb}˦iY:{ {eߖM4|,a/ɉ̓Z}+R{-X~9leѽ"Slz҅w\Hn GK1r rTSg{;n Mtt5kY g4\8-gG{NLFt m:E7='zAk,t3wz^7G;mm:;ݑfuͱ^=+Z)nlޑGw4-#wW6dPZrGT;VSqu9=G0_]/['(uvkP!bNX~_u ^$=pqFp{% lǻ y;<ӁH#޸ j7 r˚B;rVcoQǴb޷MH]z0WVMpW7{k'ѱ}Gw޽ܯc^Mw nM̩.w^xl=L01teXŸvԾbilS 67~7,lzo^k8Hpm[Io[T>޾ AlsZn7Nט_^G.^K^9>4:Ҷ/+ilo/qm쉃C"L/ ϼK%Eri졮pbnƭwi#浱]Nb[gJȳpw۳z\9թA}b4^[4UD’ Rʄ[`R>[oGqapŒj849ⵎ^k凧c_b1ЌX%ᑈψTA(2ݾwPC|^^|^Rۗ9}qVeagG҈틗f(mغ:t,|;G4uM|쎍k\\ӢEޔr ˗|>wG3ޞwzhnMUS{X{h0Up\U=}>)xq>wfw֠Ӊ"z>eú轼ݩ}[U2L|<<oіS cc!-٫w/}K2oI">^=|8gݡx%.@>+y6v~[\gDw7w/x5:pGAek%y#xZcWRcxCMtǽWFulOq˛Ӂ14~#{4Iϼuoǡ% 2]xUY.oSzݖW/yf)D>$q@[%a-BIu;xz5]ſnb;\ͷڍXNoHMS g1w=g}6E'50ωKay{nNh~ UІ2;u7zYE#&iImvT=kMPm_kN w5;m2meTvG4*lM7ص9\og8E㾁tGHʱԚ&>0Q _~V:]v/*{c߈ljc_ =v[ );ölV6j=زcfݳctO-F'}Y;6tUNa4ǫޣe^T}jWe.R~AHu'{2/^vx jt'.xws7/֋$5EvP؛ClmM{:wuIMy=۶xiC=v(ы5zز.})O>mi7F)>'36ѩ9IQ ZWzØS v͈t.V݋<;mڔ=ULXw0$/K>=ioю4e[F_6{'n0m{56udmosxݞ v,͆}Nrwo=x5 uCh;z_xŻ.gfṸ} {C`a~_Nj;n>&-o0ƓTFVQz{ͮ U*IQ/ lضl]{=gA{虋5"h:V`}!rqSյe vXu%$nm{oކN0iag>Goy7of@VOXޣ oSx憭:xͶ7:۴i;ɺ/fMkk7=`u=PO_Hɑ.m1Lϛ9qBg47d5jo%elρv(m|먁{7Qq6jS7h}+xO UZ\JXLXghfidY[]eK@@@_@MIEUSACFWcHGbRQaVDBT "I$I$/I$I$]}x}U ނCI4Mcwm{ iCzzzr]@]B\\uuAfxSgͩPpsd-OBu]w "#pg8vʱsӹNOmM'xmPO@\w.EG\k\D ՅO@2znӁ7gm.ĵr.wq!"".Dw]#AGwrrg%⪍¾mAU1mPܵuݵ"">B\k-\ ({ym34w&t qZk….ĵpB'oz{.lzc.AtkDžkµprs ~{pnܙnNrLW1[ qpkqEsG۶7Sud41@ul:@BZ'p9x)՛}f;ՅK=I5qBhq!Zk!?>".\KO+c:XӖJo{϶c]|ąpB…]u#N3ə:׳xlp;>qq.\nb7fw(9t/z{oZ{k'q!>\ ">Ϡ-s9#nd&_'>#.~s|D\k=!݆)_?#I|hLg #LvO}>D>I>||2x'͝ 'iҶfy?u |3yIcV N=Oդpm`)AC[d'I$$ddԓcLю<(O 575 ?$''ɐ$Il,YF1݈}Q:LcYϐ䓏I$I ڞƪ ʩIr6h8W}Ȑ|??I&I0$Divx=YJ>zrl@۝b0 I?dI&{6k7W<14=j=daH>'$I!5I&=nqpF2]H!$I$$I0$ Z9w'S{X2rjM!$I!$ 0LID o{̝lt9va2aȄ$0L$I<ܷIǛf=.:ͮlNY]L$IB$$I$i$C;mOm}5gWs282L수0I&d$I:e$II@A<C/8ۭLڷ) d I&!4I$Iږi}7{N۶P@(ﶕ4g$I$MӤM$mN҅wۻrͫ:&8.~:]e,2I4 Im$i۶ |m݉07UoEԱxzoia$&d6G 6kL̬Yܗ29^[$d҄ 4Iz4 oNd›=sF2a$aMҶSM.@+3s{3#&q{$!0IӦ% ;bF|So;SARtNvd &m!mN6n9e͢뤹Nَ9|F%7lmڂXvROS ΙY%{l`r#mfk,$IIJvv۞I([۴ R$ OnAI&m0d;_͙t9#d])7v*ըQrf[æL4 &<c>ʙo{(3mOnwVvBi&I6e)I9*Qzfr`m\:'i9~N6IڶMg٣{<(i+VLu ]3GLӶm6[skeNd9v|E/,]t[u z?m۶M;IӴ!'l՞ jL 63{N۴iږa]F/Qf;:ׁMo$ud͍ XӜnmL[&iFhɉ3\.([P;IwUo 29{&Iv:i&͞nN7w*#IYnw4<1IڶIΠ]iXͮ7U˔\N:k{6ml&QmynN]jt#;Msw5i*:dm3L@"y6wcVw{Nt2)5v3mvt3y;\B;R8ǡfTt:i[vloҖuzg#Se"izO}$T2-mmiG]]Cf/;~nt\AFg2)NAlm@G4^tLihj{:6ewn:ݝWm#aZΆ6&g*mfO{$*Iw'~=ڴ_Jֳ+Cd=R*9ӔI\wlo۴Tݞ*V Mt(?Iƴs4wL&li&f XPX?i Y6zNsvꍼ“ ;t:;uJWiNO{knTu$N&a;m뗴,VL%iRүO띍5u.f2mlӖ mIop-;7zt=M^Tl3I۶ad/?;0iɤ_svzhz7P۝$m4I3mf_%>N'۴t7јG'Ҧ)'M6[?NߤS_wXmt;-1UFDž GRd0$479N>C~K74M^v.TKD]jAGD$]!r\9WݨGcG)aQn^; O3@K~:h@(aK̭0f.4yk uߝΝgsMKTv7?wҨmX.DžOhb cz$Zg|Β(dv@/mZ.µG{5 샒%3ϞThvs`)%GV_ɹwI&i5itFwS_`mȗvw$I$I$p_AQCEhI- kGlnHegVi[WFfXjLmYo] aUdTcDSbRBTG<<<<ωtᐡ-N2ݪzukݺu;yz7Z^Vq'jll6dCdu~'b?7Į>BjNL-_W\2`dŊ)"&cٔhsCܸWYKyz'28dXR;1Q?X:~"?|Ga|6ZIۉ 'WȁcoieלM ֌K!ro/蝇o.Bc)YMnuMQbHj]'ky;Nj5F?x7RdeRkQ(3~YD Ck?X/\q{8Jܿ{SX,eb5ߟkủ>^$r:I ɬqk<ӯ]!^vSM1]:k%ػ g8Xieq/f4_&?>\n]Ok1ænHaPAbsL$wu=]2ɳN"Ť:%wG1!,1#Vq>s\xu1].qBC21'cr(K^65d3MRoݍ+q*bń}ZydSS,X$3ɍR_0<6 %R2lJW!YIx4~汬?7mʐ+=ޝDVUc( [6 :ޗ}pڧXz7EcEnoq_,xksMJ)gNP1)eX(ڈᗺ:Oq7}Xĺ?Lm7FA'_򜲿f1Wou)9RYqwJy+{xNg:ɾ"W 6dR[R:?3ĸs n!͈۷eی92lLs߫!KLfʄi\ļXOgkNf,L~i4%9!fg󊑢?,INַc`YwbXo,*l&e{?CuuM1F t衯;s7;oлȞKqbQg2Y\ ~us1Fΰ~TMaKu3tdUx*Ozq3mO#U&$V6(?.;Yq {mz'J<6C6zt&o~ǷHʭꄵba&p~AUqյo>fbl&87+u&7kcۃ~Mvd9ɖ!%b`{o<a폣:lX&3n,W}E$,/Kj CS,)+ˮbޭwJ׬Lvi &pRZIvklsUO_P>u¡Z&G/w߯ ?}aڵt{ܛKI54nj.]{d7hfb r{V{w}W]W_WmѫVߜ@!U_3\EnK6l,,)^MSzGUW_)f[=ea2 |h-RAn*?3='=p0\p!E~2֟2i'қo XiSC̐sߗ#.V>7:/ HIcdN(<=P-q_E58$}\ZLd,u\|J:ƺ2٧EޟƟ&`aR}7rKEYQ=YɍC(eS VÀd́I{qk >ZJݾ0T}Petyejɉe1q[A9,@bȾ~\z<W,oXrVZarh߁/Ecxo?Mbes,/O?΅,jy;XL ߦVލL )9~zqÓl\߫+{u$RlDqweE᭕z H>Zm[3NOZ7e [NS&KqhMfo9W-_eé+U %<ʍ!2t-Y"kbf *}* T`;/n#}*~N? w_/h?\,kR3Lp%qq)_øh vd_zϚP\boRpʖ=g1oQNkXn7Cx5_K$8|^/5bzs7:IJ)=+hT1~ "^8܌L+*[nQu-l9*^?ƕAX]W^|أV_tuW [~&|]x4 7q/Dwzm3H$?Iiα8Nbu_6!Y]oZz]俖zkC!aQADcdXlnkWeEFfUaRTHLI[JoYVGgimZjhbBCS+ҴnҮMM-e#P(s73)t+DsY׫5E]uG'ۿgt &MLLV=|n9W2pK)0Uz?6F,:p[{t4s a:8UJFl,o5S!—WyRi7{Rt1O&-. lqOeI&Йo&T0?_2}-iuS$mDtuiQkA.zSx`JJ4\H¾l-;f/њ@$W)R Kn.W¢l}wJϱZR nW8/?ƍյƵTnxc~M} ]GԜ[|Rߙ2Fo'?{~?Æ[nZIJuH(L}V"z߽Z'˧ISZֻwfXJC&O>>ӛ,5.Zz#r>]˿sBYDb1 @{矆9ĿuوJzZnC' i։`øoY˿ 5shH}\#[6sbZך{^Ί>`un,`qM\ۄ a5K}?cBTik_Y,rӻޒEʦe= E꼅[ A?BL}׻]MoPo' L߄i$eKĒk4úջQJ箏go ˬ/@."ѕ%¼nKݫu^ߛ쪵&DRmq*MѼFS ʟ2,u<(g_6Mur2a~rz+-&2{ny],MX'Rf2ǿ[gF¦Í)I\ou]ԍH!&9o( 2:{YLv#o}È}R۲lҦ117>_UƒĀ[!mdpu-Ӏ>$lRtȦo{slʼx3^[i"+"C5L {˭ORHXu"P͛ګg$cz9Ѵn&Ⱥԛ5puMIyXкԚk +MV+.şiY h$#N-7dH_)}u"8j%M-HY&2L,.:;o2G4GKʺޚ6C(e'-* #KV׳t^g0M"ErI79DRm>73.ۍpS!Z#k,RJo:zfg5%eGw]x5G]=Yq"ôR5k99Nr2w^Be6Az$Mxy=9@߿ ߂Wr}D i’L~.'@WG(e%mĭӛuvL}fyWK~+,R|R65ޯcyEa=c*XsY\6Pzd7LF,Gkemys7q8hrEmdSn9of7z:V#lD(D^=FS$TKSFBc;X Aܹ(Jǚ nZO&D,:q^RDJ0-7l+9eYHH.ZL?\Ya597eOT>7ENu)J7v֞}z#sz!_x!XJ4%W'Xm1lqQ)r&qeŕS^y.R 9g4p IR-F03*7ժ>uuꋬ'$lw sޜ}lhGo)f[a=">֡\1h/)*"w6VʆnoUP 墰}f QhԺ)1Gu %*j¶sK+P,nL~#VQxFoP/HP1 Z8-7qU7r4Gz-}M+}'oH_R Z#-&[#Rf%9P7l^=)G,G-JE:S7ʦvʖf2tt =F7ZWsVGnT,%Z|p<|-x3ŚLo,r+ UMMRy]Q:='{g7o n l$i5^ex'r L<"}3e*5A [_weKtKS% GD:Ӹ/妔^*0X~+3|Q=zt;7}poǽ>_YZ.Rrq tt6WN+i.Mĉ^?:bNm_c`&$TX>)T:wj5LXE"kIS-u_u<Լf8tշU',X#6ԓUrS{W:g @Ne ,LXv8f1_-\ O:9xd:lsFjD"G-&D7 +WAQbUHWfedgkJYXjo5ilI^mZniGhaSDEFVcTCRBy<$C2RCzi´֐jb=Q>O>gﭸ zdHqJ]Ź1*/߃MZJ-<; v1>KF24հ,=˗;o={sz`0?kFY.G߼֫7S9k䯗lH33=tu\{0׷֒uڬ{3Ԛ6 ('%|Kfk5tZOA$+\;_| u!wj-9Hfd_˸9&vﲽ> ,预~xMp1*;]L8) y`ww2BԸlͦR֠%3C cFѓofc|c!#1̐Rr7=So'^9rcẆ )>NΎӹ}Ndn}tSj"BBхgMSA΍$+͜N=TZ!M Z7^yguxTS i1d)9GӿO[w}O'ɾPs(Œ&m01Ǟ:^5\(A@|Tr=w;UV뾱ߝ?y4Or`E|ʟ_zq[1%! |C:Ư?ߙO~rPG+5mXj7D[/_r}_oQ2 OaK;;2nZ>\\RT~߷Ty3g0̋T,A&_5=|lIn|߷Nǧ1(900n+Ic{ZieLiK~BZ3<׻Az)'Bv4>ezGKF`1}{c쳉߿14ܱdԴ<Qmq?:snd o\MN_麾KɕY% Tj_(k~x_ׯqMk!.γ_RU]g~wcVnxn{01"'.ڡpR0<:esF7ٝ̌=^u7`^R-:Ú.B \&wZ_O}Eן9 %O{o?*!tjp\?~Y K|]K,rutsV%3~,49|•=8>ɸ舫hJEޤ{dƐ;Bwt=x_pz7:ᱰ`THN܍ztSvs5U^vC R,W`s \6Tpux t6unq봧{βS//G_M]qZEzjEz1w?X;;/{ۓ!Ua k),HfL^MM&q{TY'>d5$X1g߿j?i`%M*o8o^o;~_pERbƸ`WJR_ =)WT%{ٕz4 ﮾ۻ`~_| Zq>?&/_ەJ!}bNq߳j/W?]y{k?͖bfįƴnJzHwtcnzJݜb]0EALAuZ%Zjěͼ]K1KbR|J|={&9Ù=49, M`Ӆ^Ö1]u ![{2hS-?rAX?R^WK(Us>'B)A +Y)璔pGJXƷP!`c`"<}{/d*?Vò({Andk=Pws@سiɌ?ݦ4uܔrt~Gd>Woc,Z_E,FZi (([#;y+3+4+5+6+7+8afmBickqnmui_dp-F342,?>[X6%"^Z(eb onv|AEc\sgTMD<JS)L.e!'&*GHC=f+wor`lblghRj#ja(kdQAb\UUUUUU89UUNU989S8N8889889889898888888889888N88TN8rvsca˱xwk#gN^ 2e209^VFH[k$g/dkĻ#!9Mx GkS\q9^F.'?HeϟB!4F#qto7ba-ͷcDɷښGN6d!+40F%r-.7mAqPǮ8C뎩_{>U>lL4̅5z7'CϏ4MæZ |}| 7ռϼ!Kw-3n||zΧX&:鍛y=6*m1]C\x9dgprB#=d9ݭ#>^^V_Z/v|Dz =9!\1ʔ!5ޚd'}E6YHr=r~Z%:a->Ɠڜ a2Y_[>k:ǙH kbLJ:ռO!i id, =19nY0¼_ekg>0#z?%ߺf^ɤ#谏 J!̵ً9,GtF|ݺ(TL1ύ"ˑGVݞ+đP$kۧc8-[#k]ahMwL}[&|l882HN 1ar~a+Em̳ܮ1a2k(qNʜ.cr-6ntn)m_aa;c!ѓ9}v$F>l0o8ou.q c#c6|Nr$]n%oe?kH3u xwp.7ʽkb;.?2f[7:thҜ1'a{yx,4aדv}:2E/ 8lN7-78؎‘M~LB2:- ȍZ7E\ak^C>Yk}dY>!6ƼYir8Υ }O&BHHVH6/1:[\!>.>8'͑\7gNI[#Se$Iud 99 #/4!{k<1$XHu dk#N7' , Y|1ICǺ#9r_M3/dHdqX27gl}OӰt>:'brcRGkr!h{|62 t$9-Bgms>ݍ|e<] a^Fk|t>O3?羝౼d$;Oz/vzD?7irzاr#[3:+xDYv&LymG$*ÑˑOn6my:+΄Ml#/62Tq>ka-YcY38];̑FpW&lg]9m#,ǤrmO oXC2;[5/ijXsrߊ2_[,WtM+/c{F&1 ;kd̍9_Xǥq5c5=i&/'ˆ-*9} pa 4U{~Lm%lNOEh!ױNm̋7mNًFٓ4HQˑhbko>H~;Wőrƥ!j;;?G2iZULk®H9$j #>Tgb/nMYݴQcmd^[ĜpG6ɟ[n%Qmegex-Ndk7qDudQ6nLx}jG&z~,2;ʺ5vsQaݏk|k!:'ULt3׆!Y!}92 1=;9Z'ʄ9Ja kH$$NKD^GOϝv]Nx%sN''Sm ͻذh㌿0kۻg Fdtrol5n1BDM|Tr77 Chڽn;CvukNȟkgڴe2oL_qbiͻ=F%J3an,>^רv-ǜvdu&VśOtdvùOktTk~dMCZ;ķ%Ó|ڽPHt<@M_2eΕѻGOɟy:;"/_5X0VE+޾}+ >dd暓S5Yi'vA<5mnk7iu;M:yK:J&7߼`cϨy [x$VcoV:4dNNx2Zw⏨syk9&Bw4%6\klHw}Qxu{}H^߇?BZn`$2$8~!nn5|Tۑuts&=ey=|#+;:~ +k{-EBqu?'茖!kNC<=ZߵxyCؤ&Y!D:FN&7:Μ{ڮh:')s2{k8(|7P}q>߼JLjtarϏI(}$uQ ':Fû!izD]c!4tx= 'ob fcb"ahcanD4#Gig/*iRl`-YKjBoe !oZz[T\XefHIndlE'+;m=m,@W^]V76>0BL:?)$VA(kdgkhFC_jbAQt5-aX=k&csU n3L:g/`;~țqړ|Vs5&3y7A<1M>OKߘsv4pܸgf\~7ufA1?M6pu쵋80ygƙ ̞Ľ̃:\7d9ykƼ]fq+oO*y3.y cpb86<6/a&k)PsOe[[nû؂¶A*k[ͥ=N3bԞ:uwV@sS(!0p*U lkX"sB>`|\5fqT\"g!K|k83;8K-6|\xl>1ލ$2:ufx 6]Ȕn>fq6\7ȴI8?C1dp&?:jif biVj}W:_ƸLj֚> uc㱬WCu33Y}m|13gո8pǹ3l֚6uc>x8f~ۏ|f1omi&ϛ8=:'4ۤ^I7[eʳ]jwq c`Ƥ1g<Ta*.޸tll۠{5^1^߾%C3+O$ή3{-5}, Yy&p~~fζ”oC\]5Y3Ƹ{6߳{qL/ya%㙬5t\Lؚ2q7Z5ҶlLb+33 u/]aF"LfZ5dɝro {.>Λxl8K퇇 'quP]U3*y >^mM>:ǹP*ӠMVl5 W[y>XA7J(}74f_%U9ᩱ|b߷o0͆K`ݴ-}ơ<̬}&n2 f;>7|`A3KY*+1T LBKlgeAspfxpǙd.:k8k5\v{sfl1(LB7\s̾狭[$:xgfҳ |p>ߛY3jIMjkq%řY JZ3Sw=fPn>A~$sLy7giU*s3A=F"|5;9>T1pIL:%kllߤA 1,QXj΃7Kgpw<}adi4o c>h9ܸql\&ij%gȳ3̋f92gq}7aȜ-^TfUJnk>?n17UVd NZ=Y[YyKpָqol$aW㞷ab`1';xLܗ![ n6< 2L>n5>_Cq3>ظtaٗ!*7Yk{y8J{x\S8Ŭbj<ۓl?̷ɉ<7Uc\1l*8f|թY-'㋭n?}jno[ٷЭkMg<_tg@d _>_ wI xy50SgI4<ǥCy$nxϮc`ę5ff7gjf c3[fmmPuy>;}]saU.]8yjTeAX{]v ͳn`$0-||'tbaV mVV'48*Sq}~ iyƴ1 Wc[30-n߬mqkip 1Ϛ1޲mZs1`|>g U >IS/ȼe/gpVbajgӍ=15t8{ឭ[=W{*k>kiO\MLg9g UAsc}yL 2k2 Ù;b ,V2Y̙ 6[L\7AӧZQ،3vf1Mg6L~}*ʬfr} _3 c8h1Ϗub6K~~JNf! Ο|}ٚkaB1p5k31\;8R61o}O<339 17u ̷6s6cfm<3ܬsZV,tM\價 'q0ۄmo1I33kS?c {qqf3c:qpI[q1m6yn?sdkgf[3 ebcicnmUF#/inNs,l!*)%ebh"jm_Rd]`^&}~|qo{fKAG0rxOMphJXg\HZYljB$7+(v-I;?iCED'2B1.oaQA7aȺn5Liږ;49LW wi~+9-##"ɠI%sڛ/M˽|c_\M͑us9+< 9߲|̓I#y0[|(u4i<ɸ-*:2{>6/HY<M}d x5>:c]$C!y4yy4 m?]ӧ46ٸilgO},tF" q g<4,Y6\qQa<|59_Hy3҂Hi&t<瓸=ŲkIF&%8rGo߾-ܼ}^IGd$N7x' ̷lۇly$7#rG?[f֌|NtB'L܌#kunQ {,yzޓYtN0'xM8=K-g,kqBϓ HNk>{.Ϻk%qx7YO}6i)OM<s2Cr>2'ˌ* 0y\ߺm=-|5#M4z]3{u^Оǡ&7x?O4;<}>ӽ coKI8'#ik/MokȚb;}ܐik!͈E-}r8罿pA'8 k"yh{l -6/|2xuM(7YLw}o ϕgrTaa-[/qdI˭xh4Az4{隑]½aC C\.|<7ar!:iN\s$ܖngkO&[#麆O#Fldq[8M8q2N>24|:uO725^Oųm{ޜㅷp#; ]$o(|Xސ_p!^TZ&5OlKt6Snz0'4q~x$?}/cmLoGa_ێ2K`͗8n}[4<[Oo]֌y8?qr]Z72Ҵpi8 dbh$Ӛt߈GF0xs[{g7AfO'0lLgD'$t͗} Қx4|?OÐ'NyGI3M]C\yi:^O|_֦3A2s[Ew ~SFq2:}_4{9tcDu{x76Hٚl\g2t䐓}2'lAxQAԇ}WYZ ޿!4}2i8ޚI`>xE}zԃtvo+AdHSEN cݗG& &yY 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"]] 2.0000000000000000e+00, 5.0000000000000003e-02, 0.0000000000000000e+00, 4.9000000000000000e+01, 0.0000000000000000e+00, -5.0000000000000003e-02 Gray byte.tif 1 gdalautotest-3.0.4/gdrivers/data/small2.gxf0000644003401500001440000000107513614004466020275 0ustar rouaultusers#POINTS 10 #ROWS 8 #TRANSFORM 5.0E-03 -118.835 #PTSEPARATION 12.5 #RWSEPARATION 12.5 #XORIGIN 1750000.0 #YORIGIN 4250.0 #ROTATION 0.0 #UNIT_LENGTH "ftUS",0.3048006096012 #MAP_PROJECTION "NAD27 / Ohio North" "NAD27",6378206.4,0.082271854,0 "Lambert Conic Conformal (2SP)",40.4333333333,41.7,39.6666666667,\ 82.5,609601.22 #MAP_DATUM_TRANSFORM "NAD27 to WGS 84 (6)",-8,159,175,0,0,0,1 #GTYPE 3 #GRID """%%/!!! """%%/!!! """%%*!!!(5@(V^?y,?br!!! """%%)!!!(5@(@J)),(5@?y,!!! !!!!!!!!!(@J)/h)Nr(7T?UT!!!!!! !!!!!!)+@*5@*j^"""%%*!!! !!!!!!(c|(B^?y,"""%%*!!! !!!!!!!!!(*6"""%%+!!!gdalautotest-3.0.4/gdrivers/data/cf_lcc1sp.nc0000644003401500001440000000676013614004466020562 0ustar rouaultusersCDF 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-2historyMon Oct 24 23:43:48 2011: ncatted -a missing_value,Total_cloud_cover,d,, cf_lcc1sp.nc.ok 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 y 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@9longitude_of_central_meridian@platitude_of_projection_origin@9 earth_shape6Earth spherical with radius specified by producer in mspherical_earth_radius_metersAXM_CoordinateTransformType Projection_CoordinateAxisTypes GeoX GeoY BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@V@\8p@fa@@@pIY@zgξ@۪C}@[&@- ",@U@~mId@܋#@o@t@!/a@I*^ g7DohqTw]IṖ 4-C D^{ ] xi4#dgdalautotest-3.0.4/gdrivers/data/mandelbrot.vrt0000644003401500001440000000224613614004466021262 0ustar rouaultusers Gray mandelbrot Python gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/0000755003401500001440000000000013614004466022022 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/0000755003401500001440000000000013614005374025465 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/S2A_OPER_MTD_SAFL1C.xml0000644003401500001440000002307713614005374031127 0ustar rouaultusers 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.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/0000755003401500001440000000000013614004466026563 5ustar rouaultusers././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614005374030761 5ustar rouaultusers././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/S2A_OPER_MTD_L1C_T32TQR.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000775513614005374031001 0ustar rouaultusers 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.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614004466030762 5ustar rouaultusers././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B8A.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B09.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B07.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B11.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B06.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B01.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B08.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B10.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B02.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B05.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B12.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B04.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TQR_B03.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614004466030762 5ustar rouaultusers././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TQR_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TQR.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* WWBCDES././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614005374030761 5ustar rouaultusers././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/QI_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614004466030762 5ustar rouaultusers././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/QI_DATA/S2A_OPER_PVI_L1C_T32TRQ.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* WWBCDES././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/S2A_OPER_MTD_L1C_T32TRQ.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000775513614005374031001 0ustar rouaultusers 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 ././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000755003401500001440000000000013614004466030762 5ustar rouaultusers././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B05.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B02.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B12.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B03.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B04.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B8A.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B07.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B09.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B11.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B08.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B01.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDES././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B06.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L1C_T32TRQ_N01.03/IMG_DATA/S2A_OPER_MSI_L1C_T32TRQ_B10.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c/S2A_OPER_PRD_MSIL1C.SAFE/GRANULE/S2A_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCDESgdalautotest-3.0.4/gdrivers/data/bug_1109.img0000644003401500001440000006430113614004466020323 0ustar rouaultusersEHFA_HEADER_TAGO&{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,.OP^RasterDMSEdms_State@/?k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{ksss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{s{ksc{skscZk{cs{Zcccc{kskk{kssk{Zsŭc{sc{{ssckk{ckkcsccZcsZss{{{sν{s{{kssksc{cck{kcccsZ{sksskss{s{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{ccs{kksks{{k{kskscskkssks{{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{k{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{c{{k{ckksskckZ{ksss{ss{ksssk{ccsccs{c{ssc{kkcs{s{{skk{֜ŽkZkskZc{sss{{sc{kckk{{ssŵ{{νΜ凜{kkkscscckssZ{s{{k{{{Zk{kkńŵsc{潭sZcsZcckccksZs{skskssֵŭΜΜ{cs{Jsc{ckkskksŽ{εŵν΄k{{k{k{RccZŭŜΥε浌ŭ{{skkkkksckZsccέޭ޵ֵ֥s{sZcsZkccZckcc{ε朔ŭŽŵk{{{kcRkkkcckŭŭ֥ޜZckcRss޽業{Z{k{ŽŭŌŭc{{{{sR{֜{s{{{{{{Zc楜{έ{c{εkΥsks{{֔ŔskޜŔs{ﭥ{֔{{ťs{Z{ŵŵŌťŽŌ{{ssŌsνť挥ť{ν{潔޽朔Υ{攔ք{Rkŵޔsks{ZŽ楔ޭs歔ť{k{kscsc{ť֜{J{c{Rcs{kΥέŔťŵskk{skscRcJk{sέ{Ŝ֌޽έk{{Rk{kZ{Rťŭνks{sskck{ֵŜsZŭkss{{s{c{ŌޥŜsk歜֜{{Ŝ{s{k{{ckkŜ浌c潥ޔޔs{s{c{ks{s{s{εέ{{ssss{{kskkュ{ssތkckckcsksks{{ss{{Ό{sŽ歄ksckkk{{{{sks{{ťck{޵޽kksssssc{kc{ccsބŌcsޥŭssR{c{sZks{ss{kcs{kZ{ޔޔkޥ{{kkskskZ{sZksssZRk{kc{{ńs{k潌֭csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνksRssssk{{sksc{{kRBνŽ{{ťŭ޵JkJ{kRZksRkkss֭kcŜksέZk:ccRs{kskkscΥŌc{s{ŽBBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭ{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭cscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥJs{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵ZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νs凜sŜŌֵέ֭s{ŔεŽέ֭ΔŵέńBΥννΜk{ccťΔŽޜZkŭ{ﵔťsޥc{RcֵZֽsέέ{֔極ť{kέ޽{ޥΥε{Δ楥ޥŜŭֵ޽ŽŭޥεkֽεΔŽŵ֥ťޭŜŽŭŌkΌŔ޽ŭ֭ΜksޭΔ{Ό{Ŝ{ޭŭŵŵޭ֔Ŝ{έބεŵŜkޔŽťsֵޥֽs{ŽΔΜ΄省ΜŌ攜εޭńŽ֭{Ό޽֭sֵŔ޵޽֔ŵεֽŭ֌掠c{kޜsνΜsk{sޭޥ{ŵΜŌ֔εŵεJk޽s֭{{{ޥs{{sֵŌ{΄֜{έ{ŔֽŔŵ{s֭kޜ歭Μ֭潽޽ŔνޥΥ֭Υ޽֜޽֜ޔք{νޜ{ť歵sŔޥΔ޵քkŵ{ֽνŵŽޜ{֜ޔń1skń{{s޵sZBcťk樂c֜ťŽŵޭŜέkε֥ŭεc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{kss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skńkksRskssk)sckcskRc{JJsc{{ssΌ޵sccc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތk:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌c:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔεcZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZք{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭B:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭk)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{cB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭cscZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZBkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZk)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zk!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:JsބkkRcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜk:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{J!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZ!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkc!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{Z1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cBcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsR!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBBs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1Bs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cR)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBk!BZcck:sB!1J)!J1c:!B)J)1Z:Z!:::k:Jsc1RsJZJcksZ)ss{kJRJRks1)1k11{R1!:::RZcJ!):)kZ1sRZZ1R{քkB:RcJ::kJJR{)JZJ!!BR!cZ)JZkckJ!)1:!RR{JcB{s1BJJcscZJZBcZJsJ))R!Z1)!)1RR)cJ:)1)ZkBks{kc{RR!scRZscR)JJ!JkŔ:J)sR!BR):BZZJJBcZ{Rck{cRcskk{c!s))J!!!!1:{ckJRZRJ{k1R{{{Z攽R!!!kB:k{cB):!1ZBB{{ZJZRR1)cZJkksB{sssk{c!!Js!{c!))sR)!:)cZsssZsR{sJkZkR)1Jcc:))B1RZJBk{B1Δ{k!!1cc::J{c:BcckB):Rsk:B)1RkJJs){c{ss)R{B1!!B1c)Bk{:!kc1::RJ!:Z:B:R!BckBsRZBΔŜ֭ZssZ{ΥŽ浵Υֽ֭潜ŵΌュ֭νέε{֔ŭֵΔ֭֌c֔޵ΜŽťŭޭތsֵkŜ步֜ŭsŵŵťŵŭť΄ﭵέŭŜ{{Zεŭ{ss֜ޥ{s֭c歵֥֭{skΥŭskֵΜŭ{{s{sťﵵΔ֜s{{{֜ޜ޵ֽkss΄ޔkΥck{{攽ŭksR:ZcRZZR歌νŭֵscZZsckZZBZ攜潽ŌRcskc{ccքŌZR{ccBJc{{k{Rk{ZkZZkJJBZRkcccccs{{k1JBRcRZZss{{JRZ:ZJ{{kťŭ{kRBcZBcc{ZZRZcRZBBZk֥kJkss{{cs{ZBR:J:BBZs{{{skZRc1J:ZZBJJ)BJB:ckZJRsΔssBk{sBJ1J:BJ:JRBRkscR1{{Z{{sBRRBB1BRRJ:Z{ŭ:{kRRsksRJJBB1J)JZkRRRZJsRRZcs{kcRR1BJBB{kksZZ{{RsJ{cZJRZ)BBBsJBRBZRkZkRJBZBBBBcsckJJRJJcJ{sskkkc)JBZskRRJ1ZsZ:ssJRJZ{kZ{Zk{{{ZRR1ccBkZZB1ssskZkR{:RRZks{ZkccsZ:k1{J:1ksJZ{k{JZ{:skccRZZkkBJBZ:R1:ZcccsJRRskk:{sscRZ{c:JքZRBsc:cZZ1cZ:ssֵZ{{JJ1c:)Jc{ssB{csscRk1RRR{k)Bs{c֥޽{{kkscc:Zss{JJ{ssk{kޜ{{{sBJ:kRc{ss{Z{ŭ{s{kZ{Z:BRJk{{{ssΜ֥Rk{kk:JsckZZBJ1{Jޭs{:cksZ{R:csJB1JcZsksBB:Rc{ccBZ)1BZZk1JB{ksks{kRJB:{cZBBB:RJ::J:J::JBR:8Q#POEhfa_LayerEhfa_LayerO{4096:cdata,}RasterDMS,. ProotrootPOPIMGFormatInfoImgFormatInfo831@]T PO#$QLayer_1Eimg_Layerdn@@ROPQcMap_InfoEprj_MapInfoQUTMQALAQCALAQN@N@Rmeters-h8QPuSRProjectionEprj_ProParametersRUTM R?AS ISClarke 1866TXA333?XA^s{?TXARScDatumEprj_DatumSNAD27 T MTnadcon.datAreaPOTTGDAL_MetaDataEdsc_TableU]TaU#Bin_Function#Edsc_BinFunctionT]TUAREA_OR_POINTEdsc_ColumnXTf-hV4RasterDMSEdms_StateVVkkk{kkccssk{{skck{{c{s{֥sεs{kss{ccZss{{kk{{s{ŜֽΔssksk{scssckks{{s{kcŔc{{skkcksccZ{sŽ֥֥{{s{ccssJssss{{{sRc{s{{{sk{{cc{s{k歭֔c{{kskZkss{ssέޥŔkkcss{sc{ck{s{έ֜έ޵cZcccsZ{ks΄ތŔޥťkkRcŵΥ挌{ޜ΄{εޜ{ZskZkcŵ攭ťŜޔބccsťΥΜ歜c{{k{c札΄{΄Υεss{Ŝޭ{{Žs֌νŜ֜޵Δ{֭Rkޥs{{kcc֥֜ks{kc{{Ōք潭νk{skc{ŔZŽ֌εŵΔk֔{{{k挽޽ޭ{s{sss{kksޭsckk{ss{Ŝc{ޥŌs{sk{s{kskZޔތޥŔΔcZc{kc{ckR{ss֔νJJRkRssֵkkΜֽBkZJZ{s{{{ss{ޭsZcZ:RsRcZ{kk{Ōތ{֜έks1ZRBBcsscs籠Zֽ1kޥŽ{J{JRRJBkBcBJk{ńsֵ楔c|Žc:kk{JBBsssZ{{{{֥έŜŭZkRks)ckkRJ{{sΌsc朜ֽ1kcckkBJ{s{ZkZcBsssR֥΄c֜ޥﭽ:Z)R{1BZRsB{1cB{cRc{愵֜kŌcBkJsRsk1{RJ:JkcRR֭ŽZֽťńޭ΄Z:1BJ11RB:kB1{J{֥ޔŽs)))cR1c:J!Z!{J:sJބkk֭kť֔1)JsRcRRZkRZkJZssŔ{{޽ޔB:Z)JJcZZRcBJsZJBZ֭ﭵkcc:ssJ)kJs{cZk{{cZskZZΌBkcBRksBc{{cskkskcޔZcJ{{kZZkBRc!B)BBJsR{BRRkJ:Zks޽k{ŵkBZc{ZRcZB:kk1ckJs{cBB:Z{c޵s{sZ1:ZJ)J:!!Z!!)Z1JJ1BBcccRsRkΜcZcsRZ{sBRBBR:{!JZ)BZZ{c:BZck1)BsJZc޽{s{RRJRs{cRBB1s!Jc):ZZRRBZ{Z{{JJJBBZkRBBB!c):ZR):sksZ1BJ!ތJcscZZsJJk{{{ZRBs)kRk:)!:RkB1ckRZcs:1J1sJ{{ZscRZkBc:B1)J:BJ1:Z::kJcRJcsc:ZBccZZsֽ:kJ)ZJ!B!Z)ZcJ):R{c{1JcsZZcR1R{)sc)J!JkŌ:RB)BZJcZ{k{Rsk{ΔsB:Rs{ZR!!B{BZBZZR)Zksss{֥{kJcZZJJkB{c:{:ck)s:)kJ)cscsBRc{cB)BZ1B V-hAgEhfa_LayerEhfa_LayerGg{4096:cdata,}RasterDMS,.-hPgMRRDNamesListEimg_RRDNamesListgIMAGINE 2X2 Resamplinghhbug_1109.img(:Layer_1:_ss_2_)`gRP Vh_ss_2_Eimg_Layer_SubSample27@@gdalautotest-3.0.4/gdrivers/data/fakeeir.hdr0000644003401500001440000000017113614004466020476 0ustar rouaultusersIMAGINE_RAW_FILE WIDTH 1 HEIGHT 1 NUM_LAYERS 1 PIXEL_FILES fakeeir.img FORMAT BIL DATATYPE U8 DATA_OFFSET 0 END_RAW_FILE gdalautotest-3.0.4/gdrivers/data/cucled-1.rsw0000644003401500001440000001264513614004466020534 0ustar rouaultusersRSW@UUUUUd@N@tLA@A@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~RSW    @Y@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~dRSW@Y@P@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~kkk{s{ksssskŔc{{{{s{ccsc{s{{{c{{kskkkcss{sccZccckkkk{sk{{c{ksccck{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.0.4/gdrivers/data/50000_25000_uint16.gpkg.zip0000644003401500001440000007502113614004466022452 0ustar rouaultusersPKmSNMy'50000_25000_uint16.gpkgUT Xl\Xl\ux }l}ǏDRe:f&=fJ(:q-Z%&)\Ӹ yn&y2yi,;/)V4Ʋ )u{%8= $+>f0Ä0 ab5|0Lϥ7cS1eMMC߇oC[L.<Xiouke a. .EX12C\d>G?E(r?G"BJ"/Γw&˧$G8#Fy!;\vgr 8q GszTKi3OQZlwD8˥iFRO'\C. ^?"1OE55 YѤTh?5? h-#Nh+!kAIqNHyP`V.C_50mͭAKIݏp 4:zQ1C_i7v䐦dhn6P챋${_gCh2.3lV.~ڡif f)XkIVha~20{g~cxGݡ?yN@NȝSo_^N귯\-=}᯴қcE]H"v2.}[[^ǏL^Ho}5+/9p9č|Tqu|3{LZs%`V׽i]ٺ+t݁@wlد\5C_q45 f9Zos|t<쌆i>aOpa6 6kP׮NW%g4/I.71>nl0}"Ѩ3}=.:Ņ#Q!T2 ȳ!3n@Qx3/&iv/yVehi֯ݴZWF۞U6br&/B*p}rH:^<-^\\졥.Ӵ>r.p{?-\*#mۦXt0ƿ77K7 w6ڎjrq7&/sTsi~ޢA55uQ ɖ~f_I<>s$y@Hqyc'{F,j),1buf&'!-·I.GTxɰ%N{~)0Ol,!}:p 9}C!{&4xC,R,6ˠ>dSY3LZ4ǥȼfWI>;3>o%irM]S u ySPMeT“\:ŠBBSIO8eIЉLF i>Χh=RDsԨQ$KgrfD>*)RRIIrbC)J+쥑qCB> 4lR6rjqwCnuD:Ąw*B;?W3|cϊ"i<;F;`?Z**6J;se]6 "H3 R5֬!!Y*Y^HP].a=qKүzR_ )IEȫwny>j<.a"ڜy# 5QZ\=rKrܪXY M41ydX &}RS&>sт]J^'t"J8!ʉ|3"'%%!İv\APSk=P\"/d>&l4`Qv0ϥin$7S*)0h"餭l]Cr*s- 봪k#b(ЖlH40/{ <*$Ÿ4p$#X!=i]>M":_ܧ*8ua.ƴ8n"8.weYti**/4tc[1&iϷ[nIza- #M45ki;= y<"ݟ̒{=={}4I/D|~ĄM!ER8ÉHb2Nxlҏ;ʵȝOɷZTMhI5i41(iJ*Ne yMjpK$\*"DT\]Rgw{qfDd )g:lglJp7*5R}PMNh\?nTko+ݙ7 *]\t9dd3r/,"%VZ b2gHʊ9,!bޕ=zsWB{+>\-tq%,g!MJV5$*-X:.gzi%l6R^:eI;>+ok w&+JUqO~W씳ufVW9Wo՛M&ͅ.hv-]bYph{@wKTǙ 5Vk$C |"rhV녑nͣb\ wUGVڪ*Vi B|TVFT^Wk~K?QC+W(&z,md2\Z%wivDcpJ̔&ۥ3W\J{G w4ˣ#a0&e-2 ѺƈnKRUHKKjiպPIduZt3U:Ê):֢3_sKӾCmM3:ypPX[ r2 }]d+B&׌uH~LV/*U*Lm%5-,:R%3YUMK^<7j,Ulة٫_Vņ[^ʩb` tU4Ud <1N143fSI"[nҙgzWrsWHwFoj1HZ>fO~տM8 鿮6^>av}D~:;ť$*'үaa>U_CckɣHC* W]R'IG H z:zס)fHSW9 F0,=>Bʾe&ϑxIRGVrr]sl/.񍞟mSR.q`[Qh˙)i V)cm]l[kӥKo^=V[m4P2Qck嵈 pduWn &\ێPּ`erDUk~Eyg4|aQZG Uq\U*vUuvYo^Sn.@KsxmӴjyfU)Jn],Zs˛$݅[lZCcn0"r^qͷ,_X *ga/\jo8{^B:%G-빸H'-dŜw#y\ۅ><T#޺U⺐]gͭP;+ZjRUK(wVeʕOVT;Y[5^++lh#FZ#әKWʫ:>o1m Ѵ0fA=̧<7rvFS9p53~2[6y;X2Y}@w;tǎ__%﷽֗Kw}us}7E} zquߍqꭺk9 CE@r܀r&xN:CeUI\i֯NA 3B9 r@J9z+̇ "c& (;^}qCir@9 rܰrl#` |ir@qMOWQ0@9[HX06!E9 r@9v[Hn1-bZr\wr|3WvOD(E ckG:c=0|Lr@9 r@"GG:|1-B9/uVQ D,9 kþ%lc`>ʲy(b 5 ,I亠h *^e`ZC.V3(׬, mҀL8(̹^}̜+,g/pppۏChm'_,˿7>84>H@ց|"ppp8 j[b*.o"E8a"t _,Rpp4 TtSG|qtzf&PpG>`y )pQ8 #QSO=ppGp Hy8x{>qnwۣٵÒC?~+_zwyE%+F_,9TߕYDQx}]!E9C9C9ʱ\y{eTM׿me̶͂LuƳ<$s81Ȕ37Lj:K4Nfs4$V7?ҕnœ[|i+˼(˾ 7U_VӋn̜eRԠY38Jp @8Ġqngɚ3(88@pd(Ġz8#@p)9O@bQ,ppሪC_OX8RU5 ÑsKaOX888b㴂Dց|ɇ88>6n- PpT8+H4m'_,pp@I[pe#~@Ee @*Hm'_,pp[3dEK"pGp,/&PpQF822;ps+vچCw,X\}LL\W{˔ȿr(r(r(GY-Lj?|;M?sܐr秮8mк񕧞˚G3m|a0Ck\Xh~~=ّ|Z4 X17ʡVJBrV5Õ }YW#bY )pـHG4z88b@Dzd#{`PO=pǀ]Gn}@E H=0z88p@[(A=ñ&PpQ:@p Z:PO=ppGf@Պ#SO}8~7٥5"69 "=8o@=pG;|@DzGqҁzꋤu&@<"ဣq\ H8#*atz8h@Dz1rKR͚3(8B@Dzp#SO=pG@p#ܖ1P?d\`0G-pG8Bm@=Eq1 "=8(Otx݋>f3@'E@qp}uù NKH}' b88NKL? b88qݧM(HJJKKRD,ppGyc"8#$yO&P%BK2b'|pppG-bS'|pxw/bM(H8 eO>pppGYZ6@f>>p޸;_{o%b<yη{vq]h@䟱bnL̎|FSrpǥ:tszn_N7ҰoyL='kF4敧7Ӛ.5G4-`}1K\4ZGW%WYo4K(rT^9]rѮ PRC9crLSKvt}"0\z" ppՊr@*H}"pQrߜ~k@)G8#|H=pppǕR1@fz[lм E"po}=[ (H8rq +Xz888Jc: RnBKH=pG|q壇eqP@"p iҁzꩇ88(O ңT8 n@=MŚP@"pT5 "=G-z88p@(SEw&Pqq- "=/[:PO=pp_@pSO=/|5"E`_@pT>Z:PO=ppTWp6 j@=ԗ[cG8pT BZ:PO=pՍ:@Dzp< h@=ckfM(G8J8(;tz8Z@pGȿդwE> E888G-<%|@"ppQ8.zdk@.{ۿ~O ڽ}{^O톳ο:趯L=y3G |kd.kfTdL5$^XyN[桖Նbd4K2o91Δ/7nzN!X^ָ槭NnŗͰ.L<<71rIk*r(r(r(r(r(r(r9,ZDz,ڑY_dn s\zd=\88<:~! )R8Rs>sXqTuHמټV'_,ppq[!1k~Lzn'5١3/8x O(H^ؤ25cv6I>E888q; ٌgh@>b88()n! )R8HyɧE888cq l1h@X88*ǭWL()_wHyɽbz888]R@rn 8oP@%n)2 @)jzA,RO=pp!8G-z882搫/jO(Ra8@G$8rl@=ppDZ:PO=pyy_.)R^8~ H8 9tz8 "= 9tzqKeM(H@pȥSpeǀ2đCKꩧ8 ڳ ] (R$:?@pVϾSpG@pGpdҁzꩇqq顬 )7@pQ8n@=pǿ 8#zٶtzG~Bk@E6f 8#8m@=ԋD89pGh#˖SO}+c+۸&P@ 7@pq]Kꩧ^$Q8 88rYtPF5+voOPrǟ 88*GV-zv8@ppȦ%P{3@<[b]%'b(`Y@D""88pfҁVǣX88rw?/J6--0 HE$pppQF8h{|pppl7Z]P@)+( }bmD$;~888 OX88(2?qˏ\ (ń$fAD/"?ppGeH')-:OXppGYxC.lM(]$Ii"zppGp< ENK"b88bcgfM(% qvKI=b88*p<  :l 1#pU/]N}@%r($ìZ:8~z'WppG5H_ #VKꩧ^$pSl (_I@qUa8h@=ԋD88 "=hkҁzpqٮ \Ư% 8̂Lqҁzpp3 8mtzE"pQru|y -Ƴ@fGiqҁzppc "=pҁzpQa8%[P H@$pGqpҁzpE "=8hS/5:&5 H@$ pGŖSOH8J@DzpT2Z:PO="M8>UG& I$8#BKꩧ^$GO@DzpQ8Zh@=ԋ<}g5"I$pp87pODfYMo_;ݡOW{ڡeYD)'~2򯱸.n[D5V̍~J" BzyM9̦Kuxe=z~ʦ}ڳ3;HC-8ajޟ(S6>!mKϟoHw^t6|GuhxjuܚU=w|țUKY]W~.>KIppT5܁~)ouf<ҵ'S/ oppTY?dcrs>>1bM¡,ED"I8844Ocf&P@ppZ:P_ROu{,"ǏppplGS_ꗑ b88hC} :l`( , "pppT/[:PS/O> b888BƱ7Κۭz Y ppՀn c?vq =TW'_,E888( !ew+s?;u+{,`"888S/{,hּ=c~O>E888(}P.k@Je櫇ߛjypzM`0 H ppp 1R/88#$~oy XBR"| pppd1HeiEpp+&Κ'X$I@ADH88 R̖bz88*ǬN M@|IHIR̖"z88h UzSppd5l=V$$Mx-z88+ "=Jh-z88rmO@AoX`$pSpp#Jj@=pG{; ^PV$$pGZ:PO=ppQ8@p8-z88"0T.հ"I$ pT6tz8po 8GQZ:PO=pe[9 ([(k`EH82pSp[ H8pԽe܁L?=nݯp}WF9g-g޽`vr(rZ;2?vZ{vf]ɜ+7>me̗NuXx/kH=15?c9qn|7ףuĜm)gtoHO۠3;5 XP2rk4 *r(r(rTI9RtGNв/g=\_8 @p(]8z8(wxD "I$ pqQ;rRO=pQQ8 H88(GqI=Qq8 %5yCyX$$8 Q;rRO=p;88QSO}q|gڴ&P$$ppG(FKꩧ>8 88cQSO)' d( ,"Rpp"tU@ppU#SWi`"88∼o?'@"ppqyKꋣ>_ , "E88HpDҁ\D,ppGpDҡ_rY f)"88pD!/OX888*G-8& Hf pppG!, u |888z?PvXl`0 H888#8Hm'_,ppvl:n?BXKXn`0 H pp 2k@X888#)K }PX`ieD, "88JqDA,RO=ppe#ع ~6 I{DADRO=pp۞@􈨥SppQ8]B~? - IRIMKꩧ88#  HሤSppT4K Y2kF;IGpDҁzꩇ88Bt@#SO=ppG[4{ Y ,8;>}qo:KÞo5qS:[DUEWL~w$`f˦:\u=a]3Ė^92XzqkK3S2մIwϼo 8⭇xmvMR/4a\ӗ4  |+`vR}WF5f)r(r(rDTJBr(r(GEsMʲ.$g=\H8#,A2藵&X$ pQa8"'SpG;8 8)hI=pT$Ce3C˚X`$pe#pRO=p@p#{oRO=pGpT@҈$8#4tz(p{ 8EKꩧ8GgLG eM,H88nDҁzꩇ> H88(+tz#+@v9q EH88-[:PO=p `o@Dzp%zKꩧ6W'W_5"I$ ppT)[:PO=#@ppQS`_@Z ,Dp#S_b@3ppp[:PO}#!ű4m;)"88( t>ꃏ/pppP[:P_,~g=\Q "RDppGT8lPmꃏO> b888haҡ_,I~AG}mMY@DH888^K_,؟|pppGq:T= X`0 H888#*[ u |88ji֡/v+֚Y@Dpp@Bj@>b888h@@J=, "pppQ8Hҁ|H=ppp# e7EjJ{ipppT. @$Xz888B= H~Xb$;_9} &~zm8o?so¿AkΜ>6}x6EgyC)07km~+5>%WfN&&/^i42oזl>\3ux紉K"?eJ_cq]&Wa9ޛ;]sTuHמExp>b%x88#2T$wxᴍk`$$V=Ȯ}RÛ:Hwp1 H8cwTbC׌}ں$S/8#J 8>HP$_L4NWX#ozE"pՀ#8@pT(-z88(xk G~$$pG(-z88b#4 "=qҁzꩇ8#BA?@H>uNk`$8*G-z8*|@pYUtz8J# 1LJ mM$EQxKꩧ8j8cQpKꩧ8(3@ie<˽ $H8pҁzꩇ8Z> H88G-z8{_>>5IpQ8 l@=G8 88bSO=1  Pn $H88‣SO= 88 Z:PO=Hc+{-ܼ&@,88⏣SO}pG 88pҁzT}p4  ]P+}D$(8~8K/D,ppQ8o@=۞K> %o~({HP$ ppGqҁ2U &|@"pppG-zǑO~٬ 8~88#yt8OX888#ϖ!|`WwkD$("8886ȷpppQ!8$䓿8 ]К("88|ց|"pppQ8D$&y{ޚipppGp q2kիtw;Wo8}୫<_C>,W,1rI;w-S"ʡʡʡQx}6$i WnQ=ߟ9iHş4aRs:=;#\Ʒ{"spD3Rw57/1 CzdnߕoYD+FiaO4SʡQ#}RVH [)X|цy{F,_Eodk\z88#:)Hļeu^8&|ꩧ88pH wM@P06[b]%'""fǏpp> T[z.c^ǎ/wF=;f88# dF>"{iW{3#ppG8Wytz8H S?c(t08~88G@DzQ8i@=pG@rJBɣGꩇ8@pT[:PO=pp,@><>JH-z88 G0@pGyȹSpG8Hңa|${,8G-z8 H8ȱSpQ@h1e&PfGt8rk@=1@pȭSpD#8@)iz|sM(8̂89tz#8Q8PF.-z8(2<@^ƚP@qpT Z:PO=pT)|@DzpZ:PO=p @"c3050 8pdҁzꩇcр88hidҁzꩯHŦǰ6 PpGpdҁzGP H88ƑmKꩯhEHbû>8qdҁzCX88*pdҁƐ/},^OwP@qppD#G>K>E888Z:T/2?׵&P?pp6iP/||pppG%{z~G=kܻ?yO{Kt2%-.|%ʡ/DZ}Nk&Ҽp[oԠ'5}piM]kG{ϛߴ'&p9M_]~͇^?ˤk+MfLʡʡʡq(G0|KRcvH&8_ `#ppGqq  ;E"pp.ɦX Ki0`08~88G0 @ ==i 1#ppGqJO,Z:拍\`088@Dz=o@=ԋD88,p ң8^P `0G88c^Kꩧ^$pG ң8Fןvhd}*J{f(8#+SOH8bqW ң q|޼&jvK3x^<pQ@pT[:PO="8#8Q!8Fx{ ʁfK3x^<pD# H8#8j@=ԋD8pW ңqŽ@EG-#;v8J#@pSOH8S>,#zKꩧ^$GYf 8JjKꩧ^$G{ ң p4Dk@EǖSOHBp_@ppZ:PO="q_@Gs{ Z (R8∣SOHxWppG-zkcӸ[ (R8(c-tzc>@ppעSO}Q_@mwfM(H8qҁzR}  b88pF -Lד bǪk@)pQj>=:a?W;MCnr^mꊇ<<=#1rIjoX\7ƮsVvl8pMalaĸKN1$VoO>b888(6ew+رNݢb OX#2wu;Ppp1ƭ޸u^|цy{FG'_,pp#@fց|1}fM(H88#DH m'_,E888+;H m'_,-OfP@"ppG8$@o@>ԋE888G0@J~]npAk@E<pG]@ gWw1x|U_;&"b887 GjgKSߺxkOH}R& x8* TXzZ!Nzn'5١Xznjpp  Hp~lK%%!D9C9C9C9ʣ/ݑ{MאzdJw΍/sV2E}dS7\tw?jX7旮y4yR^[9X&]f_ϼ'6>㭍h~Ć7k;xO [wl5krY*` "=8_?5"E#8fz Wlм SO}.@3pp 7M?vq =PO}f b8ǓݞITk@EvJ?vcnS7e b88jqjqZ:P_'e/ (R8t~D,ppGqCY~J>bQ,GHg'P@"p冣(-bOX888bՖ\'_,GۡfyP@"ppT+b)B['888UE8(w|oY )pG5~H@o@>b888a@*Hm'_,E8Z&tz$5"E8@H-ppG8R@"n q! ^ (R8<  tSppGp Ih[:EǏ~px88qKꩧ888(:([:PO}4>D&@<"8G8 "=G-z88qO pDҁrP'_3pQ8'G qDҁzꩇ8 8 YKS_aճm 0ģx8( )@DzG∬SpGp?@p%Z:of3 pG$8p?Z:PO=pU# "=8՚2M{3@<pGK@Dzp hZ:PO=pW8/ %t(w0#pQ)8gpGq||c{|m_|g֮i?F};N{~VY{˔ȷNy#D{+r(r娐rx|@pppD#SbD,U> OjM(H8(Wt"IXD,ppGX8Bo@}H"|@"pQ8>x|ŢX888rvKȿX/8>B}@)pG~-ߒO>b888;`I@m@>p3'>/{8(?Ҋn[pppGqj[pG|pͧNrM(H8R@k@>b8889 l!t _,RՊc,gM(H8Hq/H9 bz888@B tSX s ] (R8 H1#bz885@$VKꩧq||k@Ep#= "="VKꩧ88#A "=*GH-RS3[ ( H8 NKꩧ88G@DzQ98Bi@=瞴 (8,0Z:PO=ppQ2e#Yn9tT}"  H8cSpG H8d8}~>U\箟XwΜ|=3׷h@tsv_+#JU[P'N%cG`_'l~M!O7W7>5iݼR{̿?mo|57i*Y5ge>C׬ߗ~$"PPPp׫ߛ>M[6h^k0:iuҬp+pQa806[b]%'ucν=5f38;ீ8#Q{;1׿ܩS/ဣBp  H8*q62reoܺc6,>`3:fV 883h@=G9V 8qԨ]sw(Aɶ #78jFKꩧJ>_  H88s]9 F-z8r[88⎣SO} 8p.`M(TiA_ 8K=?5"E*G->jppG(է>}wD,p*+"Y (RrQXKK>"88E8888 i ֒O>b83?JP@EG8wem'|888_)pGLp &{8r:@ i@>b888{Hm'_,pT%;Y (R8h}@ H-ppGeHT@m@X8yM(H8f@!<[:Eꩇ88#8H_KH=pG8&}k [ (R8b#} ytz88G2  H,G^-z8()^_{v Ƒ HǑOKꩧ88ccGKꩧ =њP@"pQ8; Q ښ`Ŀ.ם>3v>ཽz9/WYD=W̍~[0;r+#E)kwe~g>˚3%Juxeif3% 6fR+_o|ƤI7m76 k|U4#^h~|揹'>SVr(r(rTa9;* !ʡʡᕣƼnzY9ᘿ#cM(T48lNxSO=pU#} "=G^7ĠRsS'n& (Jő  H8psC ꩧ8q$w@pG#bPgosj}GH~@pe#SO=pG 8|Z:Pri@=>OX821P@(9tԷ{"88#WX8 q:jM(H"Ⱦx_}#X88*‘uKxOE>bQ,pGLp; (Rpd!/ܛ|pppG ql!}߽OX8 qOMmO("EGr"ɲ/88p$7:OXppT+{)GLp${:OXpppQ @dt |(8hu|zvM(H8*GRȦbzppGiq$EK"b8#$ݺ| q$? d7f>>p7;zS7j} O꾷ikf-W]17\0;"we_C9C9C9C9C9ˑ$'tnib)}Se:X31dj6?>~]7niœM/IxS6dJԐԴ׿߼>vD[meJbq]K&Rb.xltR1]3fij(gWw1x|U_;&ꩧ^$pđ<@Ñ;ҏ;ߌGzE"pDW+5"E G "=oZ!6ή[I ovL=ԋD88(do@DzQ8zgҁzpǺC'5"E "=#UKꩧ^$pQ68 8GV-zX8r֦5).p:i@=ԋD8  "=rEKꩧ>n8{- PH8 8#SOH8*G/ "=8S_9`Y;P#'pQ=8m@=ԋD8)8#"t?,@pz "=8vZ:PO="Ñ "=8 ҁ_s9 0cH  H88XmtzE"8a88mt(/>BfH~@ppGhS/9 H88#8ʼnM@[f3@c388(mtz R H88ps/' &PZo`0bH."#ppjK꩏H}r"88c3PJ-1E#pppD4Zk@}' |@"ppG+8?!JAiCϊHEG888rK2b#'|pp;hO(Riv_,9HDOG888#8}Hm'|pp_c (R8GHKm'|pppl{(K@qp%"tz8Z> H8(rKꩧqt;P*J4I 8Gq[:PO=pG#y: "=8<Em@=գoݖP@((/8~'Wppbtz#43pe-qg`k"@?p(bKꩧ"H H888ҁ0Կ:KX`0JrǏppG5(ZKꩧ8g 88X8ҡs3 sD$ 8~88j@=e>9B,X88#l?/u5Qw0>i ppGp>y.bppGp|OO@   9, "pppQy8!6O> b88Ck@)o(3G<싉S<nkXkFۧO} GL^`gK"ρ[D^uD9C9(呗lZw6<9lJuxov&K~ƀ] 4?+3_LS&j}{9+ཉk. ʡʡʡQUϧ/8d[I ov'Xp .b5pp16|6>TRaؤ魗Jy1O[W4 HE$ppp U_L4^<[yEppQa8~=[ $I@Rs>sXqTuHמ"|888#y 2kEh@X88Lp_wZ ([_,I HQZ:/"88|p$He)FKH=ppGE+{RUPca$$h "88 uzSpU=~&5JKH@$I8o@=pp G@Dz[:PO=pprQ9 R$"I$U#SO=ppQz􀣘8n@=pQG5)X$ *qKꩧ88Gr" "=# Ѷtz8_?5Ja$H8h[:PO=ppT&䥀8 iKꩧ8([w $X$ 8LQtz8#9@pYS1 &l&r$Dp5[:PO=pGH^ H886Z:PO=pT%ڳ;zP%9I$8,pDҁzꩇ8pG5∪SG[Cc%<(a$H88(&Z:PO=p8㈨S2+OrM(䕰H@$ pphZ:PO=py "=8ԗTߟϚtXD$ 88tzƑ@pp#W[D)dM ppp>Ƅҁz#POڰG,k|Gw]%:'Jz|Nu;~n_Ou]2ƵwwɗKF?).;KF0eQ.tTݸ/5 .?6ל>mkN9fqO8 )Oř7=a'՜6>k9sak.0ޙ5qu}m^|l>kJ^>tk0ec/tQS&^x?m ZxV8EN9f3դP3c ;}ࡃ9fQ'6QG2Ojz˚ k2lM^Us 1&u&M'1?~ j9Wmgo SM{NM{NV畭X%]%Ϯ]1wld3ZVhg->q7i4YbI]kſR>f>{Ml3밲6v w5q촺KF]>j+wm{~Y5}zajz[MSY]ŗOos-MEG'̶MlO˧]R7.ljiXHN PKmSNMy'50000_25000_uint16.gpkgUTXl\ux PK]ygdalautotest-3.0.4/gdrivers/data/nc_lonwrap.nc0000644003401500001440000000141013614004466021052 0ustar rouaultusersCDF  longitudelatitude  valid_minA!test_btesttestval valid_range_i ConventionsCF-1.5  longitude  long_name longitudeunits degrees_east latitude  long_namelatitudeunits degrees_north Band1  _FillValue _Unsignedtrue valid_range_b valid_range_s valid_range_i valid_range_d?qE@oq, valid_range_f=7C< valid_minA! C?@A AHApN4#QRDJNOgdalautotest-3.0.4/gdrivers/data/EN0001426030M_truncated.IMG0000644003401500001440000001540013614004466022400 0ustar rouaultusersPDS_VERSION_ID = PDS3 /*** FILE FORMAT ***/ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 256 FILE_RECORDS = 28 /*** POINTERS TO START BYTE OFFSET OF OBJECTS IN IMAGE FILE ***/ ^IMAGE = 27 /*** GENERAL DATA DESCRIPTION PARAMETERS ***/ MISSION_NAME = "MESSENGER" SPACECRAFT_NAME = "MESSENGER" INSTRUMENT_HOST_NAME = "MERCURY SURFACE, SPACE ENVIRONMENT, GEOCHEMISTRY AND RANGING" DATA_SET_ID = "MESS-E/V/H-MDIS-2-EDR-RAWDATA-V1.0" DATA_QUALITY_ID = "1000000000000000" PRODUCT_ID = "EN0001426030M" SOURCE_PRODUCT_ID = (msgr_20040803_20120401_od104sc.bsp,msgr_v090.tf,0096448075_mdis_atthist.bc,msgr20070926.bc,0001425715_0100421016_mdis_pivot.bc,de405.bsp,pck00008.tpc,pck00008_MSGR.tpc,mdisAddendum003.ti,naif0008.tls,messenger_403.tsc) PRODUCER_INSTITUTION_NAME = "APPLIED COHERENT TECHNOLOGY CORPORATION" SOFTWARE_NAME = "mdis2edr" SOFTWARE_VERSION_ID = 0.2 MISSION_PHASE_NAME = "Launch" TARGET_NAME = "DARK SKY" SEQUENCE_TITLE = "04231_TEST_PATTERN" /*** TIME PARAMETERS ***/ START_TIME = 2004-08-19T18:06:37.422871 STOP_TIME = 2004-08-19T18:06:38.411879 SPACECRAFT_CLOCK_START_COUNT = 1/0001426030:001000 SPACECRAFT_CLOCK_STOP_COUNT = 1/0001426030:990000 PRODUCT_CREATION_TIME = 2007-11-13T22:54:01 /*** INSTRUMENT ENGINEERING PARAMETERS ***/ INSTRUMENT_NAME = "MERCURY DUAL IMAGING SYSTEM NARROW ANGLE CAMERA" INSTRUMENT_ID = "MDIS-NAC" FILTER_NAME = N/A FILTER_NUMBER = N/A CENTER_FILTER_WAVELENGTH = N/A BANDWIDTH = N/A EXPOSURE_DURATION = 989 EXPOSURE_TYPE = AUTOMATIC DETECTOR_TEMPERATURE = -24.21 FOCAL_PLANE_TEMPERATURE = -19.53 FILTER_TEMPERATURE = "N/A" OPTICS_TEMPERATURE = -20.35 /*** INSTRUMENT RAW PARAMETERS ***/ MESS:MET_EXP = 1426030 MESS:ATT_CLOCK_COUNT = 1426028 MESS:ATT_Q1 = -0.146643 MESS:ATT_Q2 = 0.439917 MESS:ATT_Q3 = 0.468674 MESS:ATT_Q4 = 0.751873 MESS:ATT_FLAG = 7 MESS:PIV_GOAL = 0 MESS:PIV_POS = 1 MESS:PIV_READ = 20652 MESS:PIV_CAL = -26758 MESS:FW_GOAL = 11976 MESS:FW_POS = 11980 MESS:FW_READ = 11980 MESS:CCD_TEMP = 1093 MESS:CAM_T1 = 486 MESS:CAM_T2 = 513 MESS:EXPOSURE = 989 MESS:DPU_ID = 0 MESS:IMAGER = 1 MESS:SOURCE = 1 MESS:FPU_BIN = 1 MESS:COMP12_8 = 0 MESS:COMP_ALG = 0 MESS:COMP_FST = 1 MESS:TIME_PLS = 1 MESS:LATCH_UP = 0 MESS:EXP_MODE = 1 MESS:PIV_STAT = 1 MESS:PIV_MPEN = 0 MESS:PIV_PV = 1 MESS:PIV_RV = 1 MESS:FW_PV = 1 MESS:FW_RV = 1 MESS:AEX_STAT = 1024 MESS:AEX_STHR = 0 MESS:AEX_TGTB = 3000 MESS:AEX_BACB = 240 MESS:AEX_MAXE = 989 MESS:AEX_MINE = 1 MESS:DLNKPRIO = 1 MESS:WVLRATIO = 0 MESS:PIXELBIN = 4 MESS:SUBFRAME = 0 MESS:SUBF_X1 = 0 MESS:SUBF_Y1 = 0 MESS:SUBF_DX1 = 0 MESS:SUBF_DY1 = 0 MESS:SUBF_X2 = 0 MESS:SUBF_Y2 = 0 MESS:SUBF_DX2 = 0 MESS:SUBF_DY2 = 0 MESS:SUBF_X3 = 0 MESS:SUBF_Y3 = 0 MESS:SUBF_DX3 = 0 MESS:SUBF_DY3 = 0 MESS:SUBF_X4 = 0 MESS:SUBF_Y4 = 0 MESS:SUBF_DX4 = 0 MESS:SUBF_DY4 = 0 MESS:SUBF_X5 = 0 MESS:SUBF_Y5 = 0 MESS:SUBF_DX5 = 0 MESS:SUBF_DY5 = 0 MESS:CRITOPNV = 0 MESS:JAILBARS = 0 MESS:JB_X0 = 0 MESS:JB_X1 = 0 MESS:JB_SPACE = 0 /*** GEOMETRY INFORMATION ***/ RIGHT_ASCENSION = 50.38993 DECLINATION = 34.78511 TWIST_ANGLE = 13.95706 RA_DEC_REF_PIXEL = (64.00000,64.00000) RETICLE_POINT_RA = (49.58533 ,51.75069 ,49.01976 ,51.22965 ) RETICLE_POINT_DECLINATION = (33.66986 ,34.11144 ,35.46118 ,35.91225 ) /*** TARGET PARAMETERS ***/ SC_TARGET_POSITION_VECTOR = "N/A" TARGET_CENTER_DISTANCE = "N/A" /*** TARGET WITHIN SENSOR FOV ***/ SLANT_DISTANCE = "N/A" CENTER_LATITUDE = "N/A" CENTER_LONGITUDE = "N/A" HORIZONTAL_PIXEL_SCALE = "N/A" VERTICAL_PIXEL_SCALE = "N/A" SMEAR_MAGNITUDE = "N/A" SMEAR_AZIMUTH = "N/A" NORTH_AZIMUTH = "N/A" RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") /*** SPACECRAFT POSITION WITH RESPECT TO CENTRAL BODY ***/ SUB_SPACECRAFT_LATITUDE = "N/A" SUB_SPACECRAFT_LONGITUDE = "N/A" SPACECRAFT_ALTITUDE = "N/A" SUB_SPACECRAFT_AZIMUTH = "N/A" /*** SPACECRAFT LOCATION ***/ SPACECRAFT_SOLAR_DISTANCE = 154803913.08037 SC_SUN_POSITION_VECTOR = (129067998.77303 ,-80148450.30684 ,-29697291.30966 ) SC_SUN_VELOCITY_VECTOR = (-17.30739 ,-19.66653 ,-11.92862 ) /*** VIEWING AND LIGHTING GEOMETRY (SUN ON TARGET) ***/ SOLAR_DISTANCE = "N/A" SUB_SOLAR_AZIMUTH = "N/A" SUB_SOLAR_LATITUDE = "N/A" SUB_SOLAR_LONGITUDE = "N/A" INCIDENCE_ANGLE = "N/A" PHASE_ANGLE = "N/A" EMISSION_ANGLE = "N/A" LOCAL_HOUR_ANGLE = "N/A" /*** GEOMETRY FOR EACH SUBFRAME ***/ OBJECT = SUBFRAME1_PARAMETERS RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") END_OBJECT = SUBFRAME1_PARAMETERS OBJECT = SUBFRAME2_PARAMETERS RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") END_OBJECT = SUBFRAME2_PARAMETERS OBJECT = SUBFRAME3_PARAMETERS RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") END_OBJECT = SUBFRAME3_PARAMETERS OBJECT = SUBFRAME4_PARAMETERS RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") END_OBJECT = SUBFRAME4_PARAMETERS OBJECT = SUBFRAME5_PARAMETERS RETICLE_POINT_LATITUDE = ("N/A","N/A","N/A","N/A") RETICLE_POINT_LONGITUDE = ("N/A","N/A","N/A","N/A") END_OBJECT = SUBFRAME5_PARAMETERS OBJECT = IMAGE LINES = 1 LINE_SAMPLES = 128 SAMPLE_TYPE = MSB_UNSIGNED_INTEGER SAMPLE_BITS = 16 END_OBJECT = IMAGE END yqiaYQIA91)! yqiaYQIA91)! yqiaYQIA91)! yqiaYQIA91)! gdalautotest-3.0.4/gdrivers/data/tm4628_96.bil0000644003401500001440000004074013614004466020351 0ustar rouaultusersPPFFEETT]]]iiwwzzyyzz}}}}{{ooccee__bbhhqqqggccbbbbbbWW__ZZPPPVVhhxx}}yyy~~yymmbb^^aagg``cccoottqqxx}}~~||||yyy{{~~xxwwwwzz||yyyvviikkrrdd[[ZZaaZZZbbbbffrrrrqquu||{{{||~~zzpppddnnuu{{xxxx~~vvmmllhhoo~~xxccYYJJ>>>99==@@22**%% ((+++++%%##''**''"""""""''0000''))((//..111;;44>>KKUUZZUUOOOOOJJCCDDAA99AANN]]llrrr}}uuttzz~~qq]]]HH5511//++22@@ffpppllqqzz~~iiWWBB,,,%% && ))6699555++++77KKYYcc``cc```__ee``\\WW^^aa__dddbbbbVVPPLLCCHHTTXXOOOLLII@@>>885599??LLLVV\\YYRRTTVVVVVVYYY]]ZZ__YYDD;;8888===DDGGIIMMMMKKGGMMccfffnnyy}}~~{{wwwvv||~~rrhh```VVQQQQXXcciibbccbbbiiuuyyttttssdd__hhppp{{{{zz~~~rrmmttxxttuudd]]ZZ^^ccchhhh``ccbbggmm~~vvqqssyyvvwwhhggrrvv{{~~ggKK88*** !!&&**,,##!!!!!!! &&&''!!##$$!! ## """!!))@@RRgg||wwhhLLL<<00!!##**++(('''**((--3366::77;;55544++&&!!((++**++%%(($$ !!!!!   ))++**---,,%%&&!!!!!!$$$$!!!!!''%%''&&''++++(()))--//,,,,338899CCAAA::AACCOOddtt~~rraaaRRNNHHBB77--))""""!! ((((&&&""##$$&&((((//**!!!$$(("" $$##))''""!!((,,**!!## ""$$!!$$  ##''''((**0002211//++..333300)))**""%%**--66EEJJ@@666))""&&"""'',,000::55....,,##!!%%**))//11--"""##&&##''--((''**,,,((''((((**..--0088800$$((((&&**..%%$$$//5555885522,,****999KKbbww~~oooaaYYZZZZVVZZbbbbjjjkkuuuullUULLJJQQ___{{zzzzyyuujj``]][[ZZZZZWWGG;;7755==IIZZ]]]ffooxx}}ttVV>>>--++%%##!!##"" &&&##))((&&%% ++&&&!!!!""&&  )),,,,,,,##!!((//5599>>HHYYmm}}}dd^^bblllmmffffnn__WWMMKKKKKDD==77,,22DDTTvvǮп»÷óooqqkkdd\\\JJBB>>??WWll~~xxYY??44222554433==CCGGMMSScccuu||rreebbffjjcccPPCC>>DDQQQQGGBBAA@@@@@779999<>FFCC>>99999==<<<>99::>>HH]]lll``JJGGGFFCC@@BB??@@BBEE>>>7755::BBAADD<<,,))'''))**22..337777;;777==JJPPMMFF>><>@@NNLL55110066GGGSSkkeeeRRHH@@CCEEEEEESSVVVddssòzzssffTTIIHHBBGGGOOJJ@@<<44--&&%%'''**,,8855--(($$"" &&.....%%!!&&%%##""!! $$'',,//227777332222233..))&&%%))00///3311,,//447711##,,@@@IIXXmmooollhhdd]]WWZZQQII666%%%%####%%  !!""!!""''''''**1133@@GGXXXnnzzxxxxvvccOOGGMMUU[[YYYPPRRKKRRXX[[UUZZYYYPPGGJJWW\\kk~~ÙܹuummwwooUU99+++**1166==AADDJJTTVVVYY\\WWJJCCFFHHHHMMMIIGGTTYYSSLLHHDD===::<<55;;EEMMHH>><<<<<@@BBIIUU``^^ffss~~xxqqqqssaaa\\[[@@$$  $$''..****''+++22661155<>AAEEJJPPQQCCC//----)),,7777<<:::<<@@JJUU^^WWggvvzzqqpppuu^^OOHHGGKKKZZkkxxPP::++&&&##..555**!! ''**)))%%''44IIccaa888))!!'',,//::UUݠZZ66++))&&%%## !!++66::BBTTTTXXXuu˺ŷwwoonnooxxvvlll``__QQHHIITTZZ__]]]zzddLLHHDDCCC8888>>GGCC44++,,&&&(($$--//11//--1199@@@;;44<<>>??==BB>>===//''$$''!!))## ##''**++,,,''$$((!!"""""''%%###%% !!&&&%%&&******(($$(((++,,&&!!""&&11;;999FFRRTTWWZZ\\TTPPJJNNNWW]]QQAA7711--55999..%% !!$$""!!!!!!&&!!##)))((!! !!,,,,))&&&&&((,,77IIbbnnggQQQ55''%%''&&%%%&&"",,,)) ""%%**6655666::<>CCEEEBB<>333,,%% $$++--228884422))1144BBOOQQIII>>33))))&&&&44::DDD>>11....$$ $$""##""""####!!!!,,77;;::55//---))&&%%""!!!!!!!!""$$""###%%!!''%%$$%%"""++,,$$!!!!""&&(('''''$$%%$$((,,//))))(('''##'',,,,3311++33///,,--//++))5544+++++..33222233774422+++++**,,..0011::<<::>>><<778800..--((%%!!! &&**))..66::DD;;;11))%%##33<>--++''''((55RRsssqqqppooyyzzggOO::+++$$ ##!!//77444,,''22IIaacc\\]]^^^ccllrrffeeffiicc___SSQQPPUUWWLLGGKK[[]]]WWWWIIDD11002288===MMPP__]]ddffdd``XXXXXNNLLEE==<<4433777??IITT]]ffXXTT\\ooyyy{{xx~~{{||{{xxppgg___ZZWWOOUUbbeeccee```ssuuyy||{{ppggggiiuuuxx~~~~vvvuuvvoojjmmoonnuuyyy{{tt}}uurrttvvvttnnee]]WWWWddvv|||yyvvzz{{~~uukkddbb]]bbttt~~}}{{{xxiiff__bbllqqww~~~ccFF222%%!!##""$$$$$,,,,((##!!"" ((###$$$$%% $$%%88LL__uunnTTAAA..(( ##(())--11---//''((33??EE==<<66655//**$$""!!$$##""&&!! &&&  !!##''..33322**&&""!!!!$$ !!!!!!""**''$$%%'''))%%&&))55CC>>>>GGGBB<<::HH]]vvttfffYYWWYYUUII<<22%%&&!!%%$$))*** !!""$$////11**!!!((((%%###%%**&&&&&..++--((""##&&(( !!$$$  ##!!%%,,,++..**++..001100333..$$##++3344??CCDD;;;++&&$$33>>>??BB22,,,,//&& ##&&..//(((((..--//..(()))),,,))&&(())++++))--0004400,,--44225577???KKHHIIJJFF99//3377CCCVViixxttooii\\RRREEBBNNIIPPQQSSYYVVVZZbbff\\KKEEJJRRggg||{{||xxxggcc[[NNGGHHFF@@FFF@@::773355::FFLLTTTMMRRXXffiiZZSS@@333$$##**%%%%!!##!!$$&&&''))((##&&((##$$###$$$$ $$***%%''%%  ##22AAEEFFHHNN]]ssʰbb````fffggffrrwwssqq__UUPPPJJGG<<22..88KKkkýĽť{{{yysshhZZWW[[VVNNEEE====??@@NN\\ggttttqqqssoonniiaaRR??77>>>AA;;2255>>IIQQJJZZZooxxqqccZZWWiiii\\\LL==::>>CCII>>9977222**((++++//6644(("""!!++00''((!!(((++''!!!!! ""%%**66::555--%%((--**!!""'',,,--++..004411//2233333..226611++))##!!###&&,,--++((&&&&&""##""##$$##++++11166;;//$$**//5588999++**//5533558855(((,,))**((**''::GGOOOEE66))**++## !!!!!!!$$!!$$!!00IITTWW__kkjjjpp~~zzssYYIIEESSXX^^[[[XXPPGG??44..**&&'' !! %%++555HHSSGG44**((//>>SSSggxxUU<<66331133377772211AAXXjjwwxxxgg[[LLGGGGHHLLLLMMMRR\\^^[[XXZZPPFFEEEMM__mmʷttppzz}}``ZZWW```aallggYYYYQQ[[SSMMMRR__dd````FF33,,!!!$$AAJJRRQQWWYYZZbbbhhnnmmffggjjgghhoozzzyyhh\\\__oo||ccOOKKBB9966677..$$""##**///66==44331133//**'''!!%%%%""##))***))((##$$88BBMMUUVVZZZQQQQPPOOBBHHHHPPDDD;;33&&   !!((""%% !!!""((--++0022))))++'''!!--))**(( ###((,,,,&&$$''&& !!!$$%%''...<>>EEQQqqyyhh]]XXXYYOO>>)) %%&&%%***++++3388@@>>??::999<>88>>EEHHKKSSbbjjjww{{__SSPPPLL>>;;>>==>>FFJJHHH::00//4499AA::11//,,,,,--33//11221100333AAGGPPLL@@>>@@==<<<;;DDPPKK88001144<<>GGSSMMMKKFFEEDDOOVVZZiiqqqcc__cc^^ddwwǨ˵xxOO333--22==HHVVbbwwppYYIIDD@@JJCCHHHEEIITTVVNNEEBBFF@@@>>CC@@;;>>DDCCCC??DDDAA>>==CCSSVVYYpp~~uuiillzzvvooww{{ZZ11$$$$##**))),,--..337799885533300..00@@kk```zzКffDDD44//55662288BBFFAA5554433++//,,''%%%%(((1133;;BBDDIIMMLLDDD33,,228888995566888::<>OO\\ddccYYEE99**$$$%%"" ))*****''$$$$$$""))+++,,66PPrrŏYYY::00..555577JJ^^gghhh~~II..''%%))))""""" ''))--55;;::FFFWWjj{{ggbb__VV]]kkk~~wwzzggccXXXPPLLGGFFCCNNSSXX\\\sseePPLLDDAAA>>GGLLXX]]PP33,,+++22::??==8855,,22::BBBAA@@AAJJTTIIDD>>333--((##""!!'' %%!!##,,**22..---%%!!!!##)))&&  #### &&&$$ ))++,,..00//...))--++((((**11>>KKKTTXX\\]]bb__YYQQLLXXXggZZSSGG6600--77333//++## ''!!!!"""''  &&))((&&"""####''11@@QQggeeRRR??00%%!!!""##+++((!!##))((..//000==EESS[[WWKK@@99444552233--''((""!!!""$$$$%%((&&&##))//0044;;//))++,,,0044BBHHHH;;00++777<<22,,))%%,,--+++((''((--++(())++,,,335500002266<<;;;;;77553377--33//++++***--44))''&&00//..!!!'',,..,,002222110003377BBFFIIHH>>DDBBBAA<>KKVVWWKK==//+++**&&!!''$$""##!!''((&&&))11;;AANNVVTTDD55///11++**0022::::<>;;AAADDBB4400--00**&&%%%!!''##!!((,,//88:::77330011@@CCLLJJBB777//''$$**((****### (('' !!))+++--((''**221177>>:::77**!!))''%%""%%%%!! !!%%--+++++%%((55??99;;22***$$##//++11////445522244**..44((!!####### ''444,,++((//@@XXffmmiiggg]]FF.. ##'''$$   %% $$,,1100***''##""##""&&333BBRR__^^QQJJNNGG:::00..11**&&//77==77BBBEEBB99++     )))--++3333##    --99EEIIRRPPPPJJJ@@::44-- ''555==AAGGMMVVUUZZZZ[[[UULLFFHHJJEECCHHNNTTTTTPPMMMMOOSSGGAA999220000EERRcc^^GG22**!!"" $$!!&&&%%$$$$ !!%%!!"" %%((****(($$$  ---''"" !!#### +++DDmmffEEE..''##--//!!!!!##   gdalautotest-3.0.4/gdrivers/data/bug636.nc0000644003401500001440000010341413614004466017733 0ustar rouaultusersCDF  longitudelatitude@  file_nameecham3_0fix_tas_va_map model_nameecham3.6T42L19 experiment,Present-Day Simulation with Prescribed SST's  longitude unitsdegreestitle Longitude long_name LONGITUDE latitude unitsdegreestitleLatitude long_nameLATITUDE tas unitsC stat_name$Interannual Variance of Annual Means missing_valueDx@ valid_minqƧ valid_maxp/wmean_valq $/ mean_absval@q $/ warning_flag missing_counttitleSurface Air TemperaturesourceXPMIP Present-Day 10-Year Simulation with Prescribed SST's from the echam3.6T42L19 modelnotes2-meter screen temperature @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È 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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/0000755003401500001440000000000013614004466026572 5ustar rouaultusers././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000755003401500001440000000000013614005375031003 5ustar rouaultusers././@LongLink0000644000000000000000000000017500000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000755003401500001440000000000013614004466031003 5ustar rouaultusers././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_SNW_L2A_T32TQR_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000023000000000000011576 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_PVI_L2A_T32TQR.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* WWBCD$E$*S././@LongLink0000644000000000000000000000023400000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/QI_DATA/S2A_USER_CLD_L2A_T32TQR_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000755003401500001440000000000013614004466031003 5ustar rouaultusers././@LongLink0000644000000000000000000000020300000000000011576 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/R60m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000755003401500001440000000000013614004466031003 5ustar rouaultusers././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000024200000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000024600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000023500000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/IMG_DATA/S2A_USER_SCL_L2A_T32TQR_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000000067613614004466031016 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000022000000000000011575 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L2A_T32TQR_N01.03/S2A_USER_MTD_L2A_T32TQR.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a/S2A_USER_PRD_MSIL2A.SAFE/GRANULE/S2A_USER_MSI_L20000644003401500001440000001242613614005375031012 0ustar rouaultusers 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 gdalautotest-3.0.4/gdrivers/data/cf_aea2sp_invf.nc0000644003401500001440000000731413614004466021566 0ustar rouaultusersCDF 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.0.4/gdrivers/data/avfilt_1d.vrt0000644003401500001440000000207613614004466021005 0ustar rouaultusers 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"]] -4.4840319999999998e+01, 3.4320000000000002e-03, 0.0000000000000000e+00, -2.2932583999999999e+01, 0.0000000000000000e+00, -3.4320000000000002e-03 ./data/rgbsmall.tif 1 13 0.01111 0.04394 0.13534 0.32465 0.60653 0.8825 1.0 0.8825 0.60653 0.32465 0.13534 0.04394 0.01111 gdalautotest-3.0.4/gdrivers/data/byte_with_xmp.jpg0000644003401500001440000001001113614004466021747 0ustar rouaultusersJFIFhttp://ns.adobe.com/xap/1.0/ Description XMP Test Title 8 1 20 20 1 1 1 C    $.' ",#(7),01444'9=82<.342  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?R9Q6=:J߯L*W{@'$!v5&eW>ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q gdalautotest-3.0.4/gdrivers/data/USRP_PCB0/0000755003401500001440000000000013614004466017727 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/USRP_PCB0/FKUSRP01.GEN0000644003401500001440000002000013614004466021425 0ustar rouaultusers005812L 0600097 3303000031000001033031DSI035064GEN143099SPR117242BDF040359TIM034399DRF051433 GENERAL_INFORMATION_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&DATA_SET_IDPRT!NAM(A,A(6))1600;&GENERAL_INFORMATIONSTR!LOD!LAD!UNIloa!ZNA!SWO!SWA!NEO!NEA!SCA!PSP!IMR!LSO!PSO!TXT(I(1),2R(6),A(3),I(3),4R(10),I(9),R(5),A(1),2R(10),A)1600;&DATA_SET_PARAMETERSNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(4I(6),4I(3),5I(1),A(12),A(1))2600;&BAND_ID*BID!WS1!WS2(A(5),2I(5))2100;&TILE_INDEX_MAP*TSI(I(11))1100;&DATA_SET_DESCRIPTIONNSH!NSV!NOZ!NOS(4I(2))00248 D 00065 230300105000DSI12005GEN95017SPR55112BDF16167GIN1USRPFKUSRP4000005000005 M+17+000000.00+000000.00+000000.00+000000.00000050000100.0Y+000500000+00500000000000000012800012800000000100112812801008FKUSRP01.IMGN BID000000000000053 D 00039 22030010500DRF0905DSS101010101^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^gdalautotest-3.0.4/gdrivers/data/USRP_PCB0/FKUSRP01.QAL0000644003401500001440000002000013614004466021431 0ustar rouaultusers006322L 0600106 3303000019000001033019QSR059052QUV104111COL080215QOI040295ASH070335ASV068405RCI053473 QUALITY_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1600;&UP_TO_DATENESSEDN!DAT1!DAT2!REC!REV!SRC!DAT3!SPA!DAT4!DAT5(A(20),2A(12),2I(3),A,A(12),A,2A(12))2600;&COLOR_CODE_ID*CBD!CCD!CR1!CR2!CR3!FRM!NSR!NSG!NSB(A,I(3),3I(6),A,3I(3))1000;&OTHER_QUALITY_INFORMATIONOQI(A)1600;&HORIZONTAL_ACCURACYAAH!UNIaah!APH!UNIaph(I(5),A(3),I(5),A(3))1600;&VERTICAL_ACCURACYAAV!UNIaav!APV!UNIapv(I(5),A(3),I(5),A(3))2200;&BOUNDING_POLYGON_COORDINATES*LON!LAT(2R(10))00369 D 00061 3303001005000QSR038005QUV111043COL154154QAL1UN  007,20120505024,20120505000000 022,19930501 020,19920101021,19920101 000 000000000 001 255000000 002 000255000 003 00000025500061 D 00039 22030010500ASH1705HOR100080 M00060 M00061 D 00039 22030010500ASV1705VER100020 M00010 M^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^gdalautotest-3.0.4/gdrivers/data/USRP_PCB0/TRANSH01.THF0000644003401500001440000000124513614004466021434 0ustar rouaultusers004062L 0600073 23030003000000133030VDR90063FDR76153QSR59229QUV45288 TRANSMITTAL_HEADER_FILE1600;&RECORD_IDRTY!RID(A(3),I)1600;&TRANSMITTAL_HEADERMSD!VOO!ADR!NOV!NOF!URF!EDN!DAT(A(3),2A,I(1),I(3),A,I(3),A(12))1600;&DATA_SET_DESCRIPTIONNAM!STR!PRT!SWO!SWA!NEO!NEA(A(6),I(1),A,4R(10))1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1000;&UP_TO_DATENESSSRC!DAT!SPA(A,A(12),A)00163 D 00046 22030010500VDR5905FDR5364THF1003  1001FAKE_USRPDS001007,20120505FKUSRP4USRP+000000.00+000000.00+000000.00+000000.0000108 D 00046 22030010500QSR2705QUV3032LCF1UN UNRESTRICTEDUSRP 1.2012,19930501USRP 1.2gdalautotest-3.0.4/gdrivers/data/USRP_PCB0/FKUSRP01.IMG0000644003401500001440000005000113614004466021434 0ustar rouaultusers001592L 0600053 220300027000013327PAD2260SCN2482 RASTER_GEO_DATA_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&PADDINGPAD(A)2500;&PIXEL*PIX(B(8))20322 D 00070 8403001000000050000PAD000038620005SCN000163853867IMG1 gdalautotest-3.0.4/gdrivers/data/byte_one_poc.j2k0000644003401500001440000000054613614004466021454 0ustar rouaultusersOQ)R \@@d _ Ϸ@zR.$13E 2yiH*T? m mioIaE,atBG(q=@XprXP,v`9ڽR9D+Mn?&F֢ľKsZG4{Ϊk:k3Ys!9t")!bT|D0k}lMA^Q` `N, O퀚?He=%@tNRe|68,'sZgdalautotest-3.0.4/gdrivers/data/trmm-nc4z.nc0000644003401500001440000005345413614004466020562 0ustar rouaultusersHDF  ,W0!3OHDR-(N(N(N(N"  alat lon pcpi\FRHP" ? (XpBTHDd( !BTHD  d( )J4FSHDNPx( %%zBTLF# t?& ", .R(e`?k)07Eď`0o'0-% (z: poz}#N? + dֺBTLF )?&e``% E'#+ ", N? : [<FSSE?9 LOHDR-(N(N(N(N(( ?@4 4*G +CLASSDIMENSION_SCALE NAMElonݩ!40XhOHDR-(N(N(N(Nc(( ?@4 4*GQ +CLASSDIMENSION_SCALE NAMElat +standard_namelatitude ' long_namelatitude (units degrees_northˠ#FHDBa"historyWed Oct 26 13:34:43 2011: GDAL NCDFCreateCopy( trmm-nc4z.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.ncmodelgeos/dastime-calendarstandardtime-standard_nametime time-unitshours since 2011-01-01 00:00:00GDAL GDAL 1.9dev, released 2011/01/18FHIBaX ~M-FHDBaD֚ _nc3_strict  calendarstandardCDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi)CDOGClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo)centergsfc commentsafile created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/ ConventionsCF-1.5@$$@%%@&&@''@((@))@**@++@,,@--@..@// 0`000 1`111 2`222 3`333SSSSSSSSxShSXSHS8S(SSSRRRRRRRRxRhRXRHR8R(RRRQQQQQQQQOHDR-(N(N(N(NW$(((( +? .( #    \.R8OCHK@ l0REFERENCE_LIST6datasetdimension OCHK@ l0REFERENCE_LIST6datasetdimension `xc```Sى/*6.9bu6Qa{RS/̪}&3$+WL69զS@*F5?:{puO|}Y]1iԅ{:gnRgemmmccc v8QC xc```ܺ0s]1LQ4:RcmWޜsJ~1RqDִv ٓ =Φgva?ٟ8a Rw+j{|uC,9{kXiI:++kkk[uIDFRHP (<gBTHDd(8 BTHD  d(: FFSHDPx(SLFSSEaOCHK + _Netcdf4Dimid /OCHK + _Netcdf4Dimid  ,standard_name longitude ( long_name longitude 'units degrees_east_GCOL   TREE(7@sABB4CCaD D E $F F \GGHII9JJKKKuL MM=NNnOPPCQQ hR! S"S#;T$T%rU&V'V'(BTLF:L @$Cq3s4 NZ01 E7ď+e >N%- V\cFͬ:OKBTLF @V\+:7N%s4CF01 s_iFHDB#^ _FillValue  ?DIMENSION_LIST _Netcdf4Dimid  long_nameprecipitation:Precipitation commentsUnknown1 variable comment grid_namegrid-1level_description Earth surface NETCDF_DIMENSION_time NETCDF_time_unitshours since 2011-01-01 00:00:00time_statistic instantaneousxb``?pdKؓgmGci!j˗~nv5? 2p-uݥ/V=|wқ^/=绘}H, Ɍm ̘Tgaeee 6 `kkC%xg`8yt ;06^~歝:a/[jkYU},s)'6pƽ6NRߙR ;a;=گbh]ȥwJgcKlRMcJS[ k+++k [>xc`d~[[魈oe~n2YX[q*MlS-<]˜+00$o?Qڬ7 sȚ8fϚ7UX@`lIqDejn)ll, 0wG>^xe>#o+/vxWoܪWl^.[VP }6lߜB^ǂqMosw8#,\椉 O]h+!޳v5HX[BB( |A:xcbd`첸a$AV#F|hOѥfߴrXx83?ՊϚfV6oU?]% ;4uW7&0d]mN )q}&3?w!C+,O0X0X10XZ[-=:xc:r[mc"3W3=_ĠAaÐE#oӬ[iٕ_0 l +'e00h2Lq쁅.3-xQ\]]EX^Na+Ag;#Kk++KKK++kk[(C{6'6xbbv^gdy&=7r w_}NϕZQ?m03y3ļ630(t^!ߜ;?  W\/9}nfi+'7%Ɉڸ`C/%\ ڡ[y1xc`/=:1;{ qU!̷2,2=W-l.>7}{|}Oo<#yfCp'\;^?YFerC@olc; D5xxe`bg=n'%1|08T&sTLROWz<|ͱ):U&e] +6_D{Q&ZB?=?}$K+ :kkk ;2A|[?4xfbMm&gs~N/v캉AAA.î0_>K֨Ŭp{W3Vjj]f[ضu8>;=ʊΒllE:hxc`fbUmSM^{jN=i3nG)xomfLS̙p?=) +cdbJfnEՏY8m{3fdkW/n`aa``iiae 6R7&xb`ŋ#o%>ⷢ*RdNLRRn=de--+昿 !l+Vd\AD*|+Tٰs;,,,,,,-! q3xcbabb`)9RYIQu_f^{E֪[ʠ /IJYm=yky>egoZ|`?&C0JM UM=srO/(6wg'Ȩ 3X0X5؀-.o49xbaaֈ ,-=*GK\56'uf$خaCC/˩(|NQn>\QN.Jbݩ60iˢ+3mKfM}znĪ V V6@`imamm b- 1c;xc```be>>u,)!S .z&d,a`pM+/ :~rLV2,~`!j,fV=4TV-=.YYZY2XY[10X V` R8xgbn>u f?U^9Sgn`u.ks1gu{E+3X']?|ݏu.[q"{BkdkizrsgFVVV VV uVV6X-Z:1xg`; V~io~mPַy=+3d(m4gw 󿼺iU_mce`Lx!ę1)|}ԋsޘ7߰K+KKkkkK + llllmmˎ9"x``gdeh0-ц\60((lذEAAw'ɸWjafmm<b\8#Vhn>kaee`e`aaiiee dZik8[[ 2exf`b~.>>K)/TfE7HnCBOaCm^Oc/nM &CvrɔI#YX10X,,-,ALK++k$`ccc =+Wx```b~...~ $_۹2/e j2x |Hx̓[E] TskWjje\2|w&Kjf/, ``gw_ݾr1x00Ԭe\|٘SSx<;Ε+5W20N5+Ժ[’HYYZAP%`b7(xc`b``c򀘧ۇ+aW3\àpU @_?O38+QO0&C'[}'ec`yʮW/YeeD V V@PieieJ(xb.N}@3sqsEi}BH5{ Aφ 6olyY΃a%M w߿667vpX`aiRg``a 6 @  D)L)'x``?u xyxyboPd`pQPؠP{t 60bP M= ܒ+j[45k5 _ +55__fNiK++ +Kkk+k a $,,,,,-,,-lK+<-xȡ0F "A& ^c<%8,5wr^a ON>2c2U*NN_#򾼤\u!"|6BnmCy۵1wMLc}Z8;)?j.=xʱ 0h8+@?GJ h(B ؀&㊯u7UP΢LK`Ur=Ę|\1]F$$إ$u2s)x/=BթW6[?'x 0D AQ DHTـ]ABL%U$f`8ӽΟ<\`:(ʉEh8mjiRh\V_sX#n㵬kq B@FTgdalautotest-3.0.4/gdrivers/data/CSK_DGM.h50000644003401500001440000002706013614004466017744 0ustar rouaultusersHDF  0.` TREE HEAPXS01H P$Ground Projection Reference Surface ELLIPSOID PEllipsoid Semimajor Axis ?@4 4@TXA p"Scene Centre Geodetic Coordinates ?@4 4 vF@Ej(@ 8Ellipsoid DesignatorWGS84 0 Mission IDCSK 0 Product TypeDGM_B @ Datum Scale ?@4 4? PEllipsoid Semiminor Axis ?@4 4u?XA XDatum Rotation ?@4 4 X Datum Shift ?@4 4 @Projection IDGROUND RANGE/AZIMUTH HScene Orientation ?@4 4e@ TREEXHEAPX p B001QLKSBI8SNOD0P hCentre Geodetic Coordinates ?@4 4 vF@Ej(@ TREEXHEAPXPSNOD ( oNpTREE0,0- 0&( oN p"Bottom Right Geodetic Coordinates ?@4 4f3lF@ ;2O)@TREE0(0* @Column Spacing ?@4 4@ @ Line Spacing ?@4 4@ p!Bottom Left Geodetic Coordinates ?@4 4WF@"c&M(@ hTop Right Geodetic Coordinates ?@4 4/fF@r:{)@ hTop Left Geodetic Coordinates ?@4 4RjB/]F@PȒz(@gdalautotest-3.0.4/gdrivers/data/dem10.img0000644003401500001440000003410213614004466017776 0ustar rouaultusersEHFA_HEADER_TAG@ RH rootrootAH RRBand_1259624407Eimg_LayerAW@@ Ehfa_Layer24407Ehfa_LayerA0 ncMap_Info24407Eprj_MapInfoAvUTMC0iA0]SAC8mA0M]SA@@meters+ +QProjection24407Eprj_ProParametersA_gUTMw? Clarke 1866TXA333?XA^s{?fOMXA Datumtion24407Eprj_DatumametersANAD27                !!!!!!""""""#### # #  #  #  #  #  "  !  "#&  C>)5B\/ (1 ;C7  * $B(;9(  $" !""!              ###"""!!    EEEEECCCCCC#############1#!1#!!#!#!#!#!#!#!#!#!#!!!!!!!!!!!!ER    *(                                              ( ( ' & % $      C#C#C#C#C#C#C#########!##!##!##!##!##!##!##!22!#!C!#!C!#!C!#!C!#!C!#!C!#!C!#!C!!C!!C!!C!!C!!C!!C!!C!!C!!!!!!!!!!!!!!!!!!!!!!!!!/=   %%&&&&&&''''''K'5)))))))))))))))))KP; Descriptor_TableEdsc_Tableameters@A@@@.@<@@@ ¢@l@ ata,}ImgFormatInfo831,.{4096:Cdata,}RasterDMS,.R IMGFormatInfo07ImgFormatInfo831AfP RasterDMS24407Edms_StateAf  kQnkcl\ A/< ) ) ) ) ) ) ) ) )))))))))))))) ) ) ) ) ) ) ) ) ) ) ) ) )))))))) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ))))))) ) ) ) ))))))))))) ) ))))))))))))))))) ) ) ) )))))))))))))))))))) ) ) ) ) ) ) )))))))))))))))))))))))))))))))) ) )))))))) ) )))))))))) ) ) ) ))))+ #Bin_Function840#Edsc_BinFunction840@A BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.P ?@@@@@@ Unique ValueUnique Value;+  Histogramion840#Edsc_Columntion840@A+ _*HistogramParametersEimg_StatisticsParameters840@AEdsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.h   ?@@@@@@ @"@ Unique ValueP0StatisticsrametersEsta_Statisticsarameters840@A?@I @@? h?_U.StatisticsParametersEimg_StatisticsParameters840@A1Edsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.h   ?@@@@@@ @"@ Unique Value{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,.  @"@Edsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.P ?@@@@@@ Unique Value  @"@Edsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,. BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.P ?@@@@@@ Unique ValueROffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,.gdalautotest-3.0.4/gdrivers/data/wc_10m_CCCMA_A2a_2020_tmin_9.hdr0000644003401500001440000000130313614004466023447 0ustar rouaultusersBYTEORDER I LAYOUT BIL NROWS 900 NCOLS 2160 NBANDS 1 NBITS 16 BANDROWBYTES 4320 TOTALROWBYTES 4320 BANDGAPBYTES 0 NODATA -9999 ULXMAP -179.9166666666667 ULYMAP 89.91666666666667 XDIM 0.166666666666667 YDIM 0.166666666666667 DatabaseName worldclim Version 1.4 Release 3 Created 20060616 Projection GEOGRAPHIC Datum WGS84 MinX -180 MaxX 180 MinY -60 MaxY 90 MinValue -191 MaxValue 315 Model CCCMA Scenario A2a Year 2020 Variable Minimum_temperature, September Units 'deg C * 10 gdalautotest-3.0.4/gdrivers/data/int16-nogeo.nc0000644003401500001440000000175413614004466020771 0ustar rouaultusersCDF 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.0.4/gdrivers/data/byte_without_geotransform.jp20000644003401500001440000000026613614004466024327 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrijp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/byte_rraster_ct_rgb.grd0000644003401500001440000000060513614004466023116 0ustar rouaultusers[georeference] nrows=20 ncols=20 xmin=440720 ymin=3750120 xmax=441920 ymax=3751320 projection=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat [data] datatype=INT1U byteorder=little nbands=1 bandorder=BIL categorical=TRUE ratnames=idx:red:green:blue rattypes=integer:integer:integer:integer ratvalues=0:1:10:11:20:21:30:31 gdalautotest-3.0.4/gdrivers/data/1bit.rsw0000644003401500001440000002120113614004466017762 0ustar rouaultusersRSW"@@j@$@"?Bɣ1@"?H@"?Bɣ1@"?Bɣ1@?????????????????????????????????????????????????????????????????gdalautotest-3.0.4/gdrivers/data/byte_nogeoref.jp2.aux.xml0000644003401500001440000000015013614005375023225 0ustar rouaultusers LOCAL_CS["PAM"] 100,1,0,300,0,-1 gdalautotest-3.0.4/gdrivers/data/nwt_grd.grd0000644003401500001440000001544613614004466020546 0ustar rouaultusersHGPC1@?/WA@XALALAT=CDT=CDFrom: Sqr(Grid1)CoordSys Earth Projection 8, 104, "m", -111, 0, 0.9996, 500000, 10000000AT=C}MDTjDFD|Dhhhhhhhh7)7)7)7)7)7)7)7)7)hhhhhhhhh7)7)7)7)7)7)7)7)hhhhhhhhhhh7)7)7)7)7)7)7)111hhhhhhhhhhh7)7)7)7)7)7)7)11111111hhhhhhhhhhhhh7)7)7)7)7)7)111111111hhhhhhhhhhhhh7)7)7)7)7)1111111111hhhhhhhhhhhhh7)7)7)11111111111hhhhhhhhhhhhhꋾ1111111111 n nNgks^EANNRZ{{Zw{{Z{kEsJ-=*sie`n`nnR[sƸeinexxn`s`nn}ʸx}}}isxiesx}}x[Vnظi}}xi`isxxxsxixiViRIRexiZ`BWZZ??i䴑fWHuQQzڭB㾴ߛ<`-HKHƼƭT?]uKNz9izcul6[nsxxxs}ssnsĽθ2n`[`[`R[RIi}seR7[i@Vssn[n}`i`[u|`NKc՘-Bȭê˾fu`K6<]fKiNE|ƯlB-cNݴZoEcê΁?3z]BoȭÑgbE1JEggg1{wokbkR^gNA1-=1A5-=gow{wgwsosgbsNo{ZV9skZgļgw^ow{¸sEb|xMMR`[ssM[R`iVD[RR[RMRRV[[nn}xxۨ`}xĸƹ}Ĕӿʻ}Me[I}R7[@@Rx[sxxeRMAuKzZcηв˷ӧru]rxsM ;`۹֨M;enȽÞ#Ʈ޶[`xnxsίu]Z?o]fzƭx˾ȯfί`wlu☾Ӽ|ݖz]ݧ00Γz`HwuZcZc]QZWW``|ڴz|rr|ӘufwHi]ZwlWwcf'sksZbos{{{{sgkos{ww6{EAggo΃osVoNV'J-AJboZV{bbgg^RN{k^bAE1J=EgkbbVRV^gs{wZNRb^NRgb^=J=1VVbVZ*E=9S[DR[`VMV[[VVinnssxsIIR`snxeVxĶsisxexx;iVIn@}sx}xe?isi`x[DMneVRe`nsn}MM[[sn[ni[sȖuQQ|˾ȷ|rowZBB6-`z?9`ӄu߼zz`THKc]WWZQi`˯|ؼoWKu$3l]3c`?zskoRNs{{w{{so\^Z{^NJ9*5R^$EA{A5wZN^bJ=Ekg=Rob99=99AJoks^{wRNA-g='bbZJgobbZ-N^$1{15XiDVVei``[`VV``VeiRMV`ۮssxxniseRxx}}x`}Vi}sƹ};iiseenixeVI`nnssi[ie[``[nsua`EHHQHiƷηߖzZ|wr$ *-iocuzZurȷWNcKcZW`0oiȾuâifoozuB=0#  #""#""!"002:EC4& +::64) $'              $,67)"#+20,).+,32/42212/*,-05+*../1255*./*+144>:<=<<:6//5775584650545-302121174(&-,%#'.-,145>C<86?>:4./0,+(&%++11531( &++)!,)+5<:2384,23-2664584/.2000/.3634/.42..,04598431445327745654571//(-10/261.+0+#,.,3:99:60/449=975524=7/*/1/.+""$,4=5782487469;968;/051-384/244429723200+.0.../2.1419;;;=60..003/0.-.//2/,,/0..164::9204548;;;99984+/;==<;933<@=:116<6772152023/,.'/884/.152,&641244../.5:79;<;7:8.+1/.)%+0,040-445341/254/0493-+1542586/01573242011+250./121256422287652/12231014/1+0812:824751..0-%.4.4850-))./.09/(+,*2-/43/*++)021-*/,&,367223.,/-'(/0+)&*),2.+&%$%-9821.1477>?;843742.41101564245676633768996.074178933974335663+()012302-'&05999734664.&"$-2/),33//-%    '*1,&$*530598423<;:;@9974<=954122-,-,-48,/*,/2762/12/,,0-# #$ ""$ #''(&'"&)+,'$ &*.123333432464201110.1554634::.'0<86010..-)& **//.("$   #'*023<=;30/*)&%(*3677/+*...-(%.258853756214./253/-+08<436>AD?=>79@;;:41-+&"  $%)10,/318;<=;78=;8<8C9-,1(*335356423422/./..003028776887788510.''+68956869;8:;<;?'/,06?CA<<=BHLQIB>98=;>BB<778.#!*00/41.-+((-0+)/340:AFECBGIKMNMIILMKDBABEKIFC70.%"!%()+*"! "&+*-*.00.-3322224/)&'(**)/47;352032/0.031./221./124204751/,0336650123232+125#%$$$$&$#&#"$$%#"""(*+12.,--)&"$)'%&)%$'&-2-)%&&('&(%%'$*0:1*#! #!)*%!gdalautotest-3.0.4/gdrivers/data/bug5118.nc0000644003401500001440000000761013614004466020014 0ustar rouaultusersCDF height_above_ground1timeyx Originating_or_generating_CenterQUS National Weather Service, National Centres for Environmental Prediction (NCEP)#Originating_or_generating_Subcenter0GRIB_table_version2,1Type_of_generating_processAnalysis ConventionsCF-1.0historyWed Jun 26 17:53:27 2013: ncks -d time,0,0 -v v-component_of_wind_height_above_ground 20130614T2100.nc bug5118.nc Read using CDM IOSP Grib2Collection featureTypeGRIDHistoryTranslated to CF-1.0 Conventions by Netcdf-Java CDM (NetcdfCFWriter) Original Dataset = /data/ldm/pub/native/grid/NCEP/RR/CONUS_13km/RAP-CONUS_13km.ncx; Translation Date = Fri Jun 14 14:43:20 MDT 2013NCO4.0.9 height_above_ground1 unitsm long_name#Specified height level above groundpositiveupGrib2_level_typegdatumground_CoordinateAxisTypeHeight_CoordinateZisPositiveuptime unitsHour since 2013-06-13T00:00:00Z standard_nametime_CoordinateAxisTypeTime'v-component_of_wind_height_above_ground long_name9v-component of wind @ Specified height level above groundunitsm/s missing_value abbreviationVGRD grid_mappingLambertConformal_ProjectionGrib_Variable_IdVAR_0-2-3_L103Grib2_ParameterGrib2_Parameter_DisciplineMeteorological productsGrib2_Parameter_CategoryMomentumGrib2_Parameter_Namev-component of windGrib2_Level_Typeg coordinatestime height_above_ground1 y x 0x  standard_nameprojection_x_coordinateunitskm_CoordinateAxisTypeGeoXHy  standard_nameprojection_y_coordinateunitskm_CoordinateAxisTypeGeoYX0A -))e)”JD┈>?kx?kx?:>k[">??Z>@%)%)┈┈E)%)JD9JDҔ@=ַ=ַ?Z?:??kx>ྊR JDaJDiJD!JDJD9JD)JD JDҔE)=ַ=ַ%)R >>@)JDQJDYJDIJDQJDIJD!JDJDJD JDR R %))R "R JD!JDJDJD JDJDҔ”┈%)">=ַ)R >k[򔈿Ҕ”)@@R >=ַ)>k[>>>࿒E)R ">k[>>?Z?kx?kx?z>>?z?kx?kx?kx?kxR =ַ>?:?z?kx?kx?kx?kx?kx@?kx?kx?kx?kx?z?kx?kx>?:?Z?kx?kx?kx?kx?kx@@@6@>@6@.@@?kx?kx?Z?z?kx?kx?kx?kx@@@@&@F@f@n@^@6@@?kx?kx?kx?kx?kx?kx@@@@&@6@V@v@Z@Z@~@>@@?kx@?kx?kx?kx@@@.@6@>@V@v@Z@Z@Z@~@^@?kx@@@@@&@6@6@>@F@V@n@Z@Z@Z@Z@~@F@@&@@@@N@N@N@N@^@V@^@f@Z@Z@Z@Z@~@@F@.@&@&@N@^@^@f@f@^@^@V@n@Z@Z@Z@Z@@F@V@N@N@>@N@N@f@V@n@f@V@V@n@Z@Z@Z?kx@V@v@n@>?kx?kx@.@>@V@Z@~@^@N@>@^@Z@Z?kx?kx@@?kx>?kx?kx?kx@>@v@Z@Z@f@N@^@Z@Z?@R >?Z@?kx?kx?kx@@&@v@Z@Z@Z@Z@Z@Z=ַ򔈿?:?Z>?kx@^@?kx@6@Z@Z@Z@Z@Z@Z޿R R "E)”?kx@.@@?kx@F@Z@Z@^@f@Z>?:?:R E)Ҕ@?R @>>>k[>?kx@@@Βi/~̧6i¸UĿUsĽĻĺA!ĸĶ@ĵ,ij{_ıDEFEEEGEEEZpE3(E EEQE E nE GzE 2E E ѣE[EE[E4gdalautotest-3.0.4/gdrivers/data/byte.tif0000644003401500001440000000134013614004466020037 0ustar rouaultusersII*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.0.4/gdrivers/data/lut.xml0000644003401500001440000000115613614005375017723 0ustar rouaultusers 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 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 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 1 1 1 1 1 1 1 1 1 1 1 1 1 gdalautotest-3.0.4/gdrivers/data/byte.gpkg0000644003401500001440000003100013614004466020201 0ustar rouaultusersSQLite format 3@ GP10-   f 11[;kUndefined cartesian SRSNONEundefinedundefined cartesian coordinate reference system \=mUndefined geographic SRSNONEundefinedundefined geographic coordinate reference system ff + WGS 84 geodeticEPSGGEOGCS["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"]]longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid >  =bytetilesbyte2017-06-04T20:58:07.578Z98@9=hW  byte  byte ||9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents9M'indexsqlite_autoindex_g55)tablegpkg_spatial_ref_sysgpkg_spatial_ref_sysCREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER NOT NULL,definition TEXT NOT NULL,description TEXT) aa''wtablegpkg_contentsgpkg_contentsCREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id)) ?]]//[tablegpkg_ogr_contentsgpkg_ogr_contents CREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count INTEGER DEFAULT NULL)AU/indexsqlite_autoindex_gpkg_ogr_contents_1gpkg_ogr_contents 9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents9M'indexsqlite_autoindex_gpkg_contents_1gpkg_contents   bytehW99=  byte _G[5indexsqlite_autoindex_gpkg_tile_matrix_set_1gpkg_tile_matrix_set55_tablegpkg_tile_matrix_setgpkg_tile_matrix_set CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id))   byte<<  byte ::nnC --9tablegpkg_tile_matrixgpkg_tile_matrixCREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name)) TTP ++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)e -tablebytebyteCREATE TABLE "byte" (id INTEGER PRIMARY KEY AUTOINCREMENT,zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,UNIQUE (zoom_level, tile_column, tile_row))' ;indexsqlite_autoindex_byte_1byte? S-indexsqlite_autoindex_gpkg_tile_matrix_1gpkg_tile_matrix &&OPNG  IHDR{`IDATx١n#gw1 4 l.\(lo0pmX 'f3U J-K\'t?c[{jOqvCM}7:'WPulmjhP;WkcչCkcsC΍ձn+]zlߡ   byte786982138982,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"]] ``W5oNAD27 / UTM zone 11NEPSGhWPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9Cu:ХZ[{jeFhCO[86Ծ˭sr%k {oS [~TsCKO-?77vN oOg7vZ:ɏ42!W;4uj}ԥc` [cP~cS-]e[N-=wK޾{n꽱s>o}Z{jpvs[ol{u]Wu;^l|~ԫ5n=L VSSo]a;J"hԥC_{iCmCN ձ;tj걷c:8&pk[sOxo]zuNa襹^nb 4QIENDB`gdalautotest-3.0.4/gdrivers/data/vrt_of_warped_vrt.vrt0000644003401500001440000000676113614004466022675 0ustar rouaultusers 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area Gray 20 20 6.71089e+07 NearestNeighbour Byte byte.tif 0.125 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 440720,60,0,3751320,0,-60 -7345.33333333333303,0.0166666666666666664,0,62522,0,-0.0166666666666666664 ]]> 1 gdalautotest-3.0.4/gdrivers/data/ehdr11.hdr0000644003401500001440000000016713614004466020161 0ustar rouaultusersncols 321 nrows 2 nbits 32 cellsize 2500.000000 xllcorner -17973801.662435 yllcorner 2041811.701239 byteorder msbfirst gdalautotest-3.0.4/gdrivers/data/byte_rraster_rat.gri0000644003401500001440000000062013614004466022446 0ustar rouaultusersk{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.0.4/gdrivers/data/adobe_style_geospatial_with_xmp.pdf0000644003401500001440000017064113614004466025517 0ustar rouaultusers%PDF-1.6 1 0 obj << /Length 2 0 R /Filter /FlateDecode >> stream xKo$IZ\X&. iA=^D](Wjzؑtt*{珿q=|o;ooklJpei滟}{cM .5>Z-cޤL-%׃oŸߟ7!FӜ~W ͤT=I>F?Ĕ/>xUILŐ-4$)2ujM@Br(4g{6lII%6QAWbIG4mW(}W}3-d +(2e> YmOg|-+3!ئ#q)R&o*}ޠRBQԳJJ5-<lvL 17 h!J?Vs -wʡ,(r3ߘ*1#5W&)@A77%cb Pssw'֌~YwIFJJ2+5oo?#\kG?|'[j/>G3}a.~hBOAhh]SDդL~hn|2|O(̱\anNRbU M$R&].7O{{ר&]soeuIkTr65z9ڼF5%fm7͉Xר7`VD- pln<\nN=J7.m}ZJZj߫xPCcme95ٸHHus9fWjεF744>\n'`\dib; Ov"1ga|5(ЄiIX^( 5Y}kw%яZCyY$1 %}"W&| etF u5dm\cn֋&LUIw!IRK3ll$R60qn 'Ɉqh+99P}ļE/# (r٢1טŵI4b\%Y"1zY?GVMj.+̍|ԾdU*|XGyElOEd?iLx506ɧ{HY@S#^q(}, G-Bf_m;6ɭZB6GlOg5>oy1('? jO?8뀛UmK1%wyﯩ]}^`;7iƾt BL4Zlssdʚ{pfj Qmu i`X~7{5w nnYE7X{/4%(+nDj}+}_e..X7[{%W;`\tqvCX>m;bbvn7u {xfJP+!dSbi-Wћ~ׅMǕ-xK{{xGM-?к-KZY+ڛGoM°[e1n7_@{CҷuQ_ІRk_EgI91iXE7X7{%W;XC6F_)Dt^7U7suon1|[kU$mijxE9lۨoX_li7'iOg7>Dstg e mt'T*}ӏY 4gb֫[9r޼Z2Kؕ ?@H?xB`J87(&Ty2pn?lv8;2@(>f)y<6ٶ J3Gz\E{C ;F|<H_gTD.өq D,-'&Coð?Ho2`#H8p~0C`_!k,p8a9 av, J$VΔq m3KNrQޠs=;@Hw;B`J,=^ `J0"+%AE++PJ$Cl@KD O2X5 ҉ O fН g" 03H9!w>LQ3.Is }okH[j(q] iΘ`RDC* sbZ39)kH91w.PLU1ͱ 0HFŎLuƴB%R eȝ b1(H]CK2 VŴĂTbq#4>ҀoBwi?J)i] ij!+QB0C\LU3- `ܹF+2-茘J$#b@RDA s2 VʹTs`4Tbqs45=ꪂ `1 `ݧdi0EgT"rf;0 @(H!1i!Ew34Z @3H9!w>܌LQ1[lQ֌`jN۷OK"-VĂBQeȝ bDs,Pքr,c\+͡ @FŎ%1@,5̠TxcAFY1ʑ 9 h J4ʘThF1 QfН i*%gr,#r^Fb|2+H^J RLU3 #xRrdi Fw34ZiE=gT"q;0 V4n|Jʐ; `LK0KqWJ0cRLX=_!XFܧ>†/woڲw)1zI"R)e1VaE3>|Чk8(ňV(Iyq=.{ó_fљћsڬʮg$B8Wޑ1Ur77iLѪ?vҤl8sg̝07XƵ9֙;[uNʛGg ڲg{)u>!f[MΤg>JHjeJi:EO_=w+Z;otAl1, Ub4 ayx᪱N g((3ޡI@1u8 bG G.x H ։0 }1*1igw#$(1u$ bE^үC&F.e_I@1u8 bGC}8꾒 ub4 a'yX_m@)G@r}l ƥPHh 뇔UiHG u$ -"r3q\.:VpiX^Lc14:wG/A)Ap-yX^,96gsE9aU@Wp^ ?_gor=ê<$qj2;./i7|X J$㖮?`w endstream endobj 2 0 obj 4041 endobj 3 0 obj <> stream xy`TŲ0^$d' K d% " BXd L!˄̄ `DE/{@P ⾃⽸_u3NW a)07vb\ˡ\B\V3`g$ ~n|a֡ ʚ;r,߾L< P"׷ rcbq+ֻV{g.~IkF{<R:Y ~_a&t)=s` 1Pa]N'Xed \Gn'-it?}~c,X3[ngrgYz~#798ٴZ6I;&_zgzOЇ}~~@HI鐒Rrq4UKLNKMJ#53ux3ՕFi)NmN]{OI_"}uoO }{'Z_fpd\1;,"kuc9' DO 81ĐN|urΩzRQJ:J}A@\Gbo7-!Ͽ-uq̔Nfkǒ&omz((\ؔ\(NĔRILM63;\IGκ2J}Nt\s&J:?ANt>DJqb':qŧtJqϱX2}Z#Ѳ#M4܌u֞=Z#|*N~GNy50> !?rO.:l=҄!4Ə~Ȟzo8W[8ó}q8pCCPCy8zC;/~*G|:T>,9xAL=r09ioI؟½`ղrfM7V+$i?eNM3G;|Z.&ioCX/@aIڦ>1?7۞SOL<]wZw ] KX WUp+ wQtz8?ZVó>'x^Aeep~x ^Wp x^!Zxބ澁J nZ: ^hf| J%p)cp;,0,o{M6 %p"$Mfr V l"oNBH( #6NrC{}~ypރȏ c??q F~'Lr$H+q(((jB44h8Nh4$ɦ4&$ڑvi2BuTCriɣ]i:͠hwڃt5RE]KuZz@ n7ћ-tFFdrv[Ůdk5znňwdml'͞dϰK=`Ge?O8B"Q,=IOVǸAL8O^ bPd1u9BuAg"qX*.+JZ45jN\'nF6Lŝbxc#Oc/^7XoxOXJ|'~¯1͢iZųD3-#WUкk=^Z \-_+ˆ?fJ0m6BPFkc8m6Abn0YMզiEٰPll!˵*w=|+1>[6|'?qv7߃Igs|Ke ;?_MaC#~̏O39ɿ_o;=??c'O~L>#_7;m6| s xv>Ul &ql<&)l*Jg/'&8. k 2\zbr{46]Qa&_y+BWf~_Z~53kUNr ߄ymm7Kf~;f*wh>Qk0Ogs~y>ZDQ*&.Lg),mL X1NG+%f 'ZH1JF['/]z14{DǺ|X,.EKyUhKX&V}-ͲXrX.chQک-5ZD;M梭Vk5;-h2Oz{ wCCl-m:7ZyZ|V50g!@/f GEuOHLةsr=%5kzF=zf';'7/oaQq?`c 6|ą#G3v K'M2uf̼xl')+wUTVVy5x},\tK/[tW\r+Zk]{7pƛneӭm[z}|mٱvO>g}n/_W_{xy?ࡏ|pppppppppppIAD$q$ H,[{Yo12`+e7yU_YZcx4)"E w*ܧ7a||MRZ1cO 3{r[k}W%G{XܯfkS?)-DGFI\Fb Hu)FUhQFDڄn} ?,~*`kxUl~vOxB?9c0^/'Vz: [7noPI(.wg.{Z7 dEydJrFw)lyϲy&{>d Pߎ{8'̧S&x#NZzºx B)%1?0:}s5}#I7r^uYYݸ+z:~q%4cD, 3ڏ̆_p=ܿFb11TsyePLoJ ۓ!Aﶘ,W>Q{ b%-g$7g# =>ثC+RD:xyuL 7+Fʿg _5\z fɸsQb(}M :n8](ť`x{0A&[uOgt=Į{%izˁ!i.2}TIUhSx8))8@/IzIU%tB vB C%>~@BKm` GZ҆$ gy˸SKtLIֻW \6.hT]`"Ӣ n(2[ҷۼfδ;gLmaiFT&*N=xo;.ͫ㧶"Ӧ8<IA!#5zŴ- $˕UsȖs ҪF$5)ۓG Do.2c4NbyGzozf2-"DlWTw,@htdjH>\E\VgQ-wK~]o4gyvs4ݞּ>Km/0]=WulfʪMAmidmzҩ)g_0m[W|7uPTFYeF\vjU;v,UojP]T5Fl56mhs6#}ҩGmi: ] %*%*I=_L|ڄ'x|#5G~!B !je?42di Aa;#CS'y$d?T̙O9$*XBN6̌ayqx~uzs =Bkx߻LǦn GF2#$E/3Ę٘vu,[YT ݑ@C(? K0E=x7L9y8ǞHIMţ^Cg2iw&%szGd$$Gbx8bQ`-fçMA8K igtgL_Wİ0MNi-`Sls';FS { GhHVG!B,a $fT܅;̈8c:,&:qvDžI(rѲR‡]ݰIAv!!vu] "[uƻ.yUJG1/&9E LcۡCtji2brF3R-ڤ6`[.^|w-p&}pri܃#1<}RZǨPxء3i| dp,D%/*C嚀8vU#J)RhR(Jّ(ЉOM8p_$JEbҟ\r|@d?X/&Qrō)iQf)۷01? Xa/ϒk동זLeO&KSRX,M4^vHNo;Ed Q@ܗ+ ڢ":Ga1tRrlsoǩV ޡgԤ=Kz"{8O{\<=no}em4V(zQ̕ODEcIv)1[ Am%%ڭrN֤N,<پ($+%HBmPt`'E[΁t%ЮЅ\0h fWX-' i|7K.Dv[ -3|pPM1}S{/yL2T\XbC?i6iᑶqɝxrNGxZ-!@nƯ[2e>#?]`SF`9cΈ]d#<.Kv?XEUYLdd$3?=]ێbڻΝ)2#+-WlsdR;aٻXyi(ES+׿Ž2. j7Shx2N6vn p )"49.Sta'w `Ix2]&}%ҎЈNÝ!7Fh{#sd͝7]֐I,$[dA?pwcBcb^ -∑8"6GЈHG1z,A%{Q5vnM6I{Mluz"z4;lt9}m@BgF![|5+SA9>ȼJLJ\ q2&=wS;\3eM{zlkoOmy؁OΟ~DfmQsq:CO2z]"I20ұ{#c(RcC eS=9.5|^t49}LՉd7$q>=TfrrgmtuewowR݌=MJSOb)E覧)Er\8E>;fIE LЕ9ag׮i'`]8HzJ%bG=Ky|.$v}$Hp' *xM#4bR3"[ Pie/ĶS);HBՓMC=QT+>i+~ScpK'F=Ce[}ed$YL}f'?yߴ]m|a]qC#b_8Zy2 )!p/VHƪhREϢl ӊ2s^Ǐ"1; @Fb#Ti4KZB'۹Ⱦѭ'v||Ko'hh aYGbF'eeE$k{rtxrM<&;aD_ھ!R,>뼰[c+VV{ 1ѩSwғd}d[ϐ'n!H;I{!!hÞtw" D#i.r F<9hܺ8;jmZy-20M#f:[bb[̭V׮Zr휕UW\YQ߈um}%=6Ǜ+nk'@k!U+*[w/̀)`B.<1q[e?_;R$fkbƬ!3]d27D!}b̰#ILL=afՇ- aU8G+fʷ=921]au -}thՑkŖbZ?h4:Ҋ-1~D;hgD$۶bSb?HT^Tڴ=O='% KO,JGM%#:#FGMâFDK SFOIon)0N3EmbW*Jmŕr[uOlE8mk$RBig*Hf\YVLmH[lLt[ -?" A-:Jqhx#K0Vkr\Bl\\B-$$9.([dnۣClք8eEKbR)!::* IIA!d<lCp uBHb.rնOJ}*)ԩS cJ\C4}2#ObP HF+#YpvZa߷2%rȖӧnꗢiؘ=Q~hl Öly)$/C|B,#i$f!K5(شN|WYc[_{Nqw]SI!4ktװw`m y!݉{>dy.v;#m 1Gܓ$ܺ.rhd܏ x, 9w4mlhIYY2w-eeCԷ ˯|;+֎2–Ϻwvç*`a5hímh͚$SjB }.^Ca Mb2L%`:K`{aG>F0!lD(wsyT.*nC| jP;qP1`#oevS~;3p\XB,4l\e{r\4BHcCFb,/@XEj߿c ˑ*َ0,kQGq(;3߽$"h@؂P1H.S6#mSچ؏2DޔkM3sI:)PmBSi˶rOI ʾݓ:MK{;&yP{m+P}<ӋXތv\ڬ/PJH[S2=aۭ5[,ѹߴ.Xj^5s~Ab(Y+ {ϗ., vZ}}δ3K[п)qe`?J'}sYLC;~L7u "{0{߯ ߣoeZ.#=:jXjCX <5ٝnPqt/D{wDy"|6fXHdp?b; ) dLdQ2 rlDx1 /6mb lѾ\> }^(H[!~b8~ p 9Oo( KXf`9jMyܩdc."K`'I0향p;V.7IT^Zi5P?ݏY~-EݏRaZnUr Cڈ'C3τbZ~^m+pf޽w16 +](s#bq@Txy gBXv<ȺpxAr PLXcj%IavT>v+cn |2HQЛ{wE,2wY1Нw`n)_q0񫡎/ۆ6 5WtyM t6J? );S$[k3ruJ4~ ?N9/}-CF:6a0 V /6 W6 b,^!,CO!p)a 8nO|'k"8,{! D d>r9Ĝ "rgr_g5wg)}->(QOœ&hYfo*ER2_]}g ?9_eƍͲN_>g5bkh}ne~C$3/ #i¨gI7Pj#|' <Y _`@ sp98sp98sp98sp"e>|;}~`>l/N %LB8 .{M# A`Dh&n}Z/Be@s&ʟU%s"LL<\ۡ3 Ԓ &N@Dd,уLA\E0q ;MsL 11v]M<:#006quM<:p)u[ R#a d{|G+MwSU 1ud Б:2pޮ#7td Б:2pCGn #7t$v Skp[) ˵W*<FǶ'1U hsvnקK;^=~{+|ĭekn B=P"BG|f/cqtb[бg!6D;3 rD|SF`iˁbdCoUpD pL%S&|^-.(W<;9i@:rn#x9cRTTfcdQ U3OR}&ZaS,+|S m{٩teXdXf߭Vԫ}fXciufj76 y͝\Vڬw񞱾25Ctiyl?+P+XdUvSڨ j]nwzw״6dUq"5Z[޶YA\I^풅UhMSI!!E80{ZCeW5*K<ʠy8C6~t3I4`vV{HykAw}JL槌Y'aF uTށ<樷 cfYЇkTc|CkOM5}GRLjҋ7}`3hd.sg{A)7*L3yv,mlz}I[<S3unjUKg[ٔ>TzKhHƔUvv|YpLcD ^IV-osݴźv>4@Wr%iwh.nr/)]?`WkRVlM~~QI\_\W{5=!cW՛O6~9m.34VceJug y,QU~`>cO\l=jˌԜgƜgȺ?MgS8=8#-0BfQf  1Zo*r3$iV 1Q}&U*'Gz}Ӥ>Y*˔WqBbCl څݦ]Y\^W|W`OU+'iX{8z뮬jp;k2tZOKjuֹ>,]}U:-=7]e.՝uo,T:Xқܾ*VO-'Nd&kr.]Hc,]3\N_-q^I@6 55*^|>Toa$r]z4xqZ'_ֈgngGor \5(^Rz CueY_B1֕!nZu,qm^Tr]3k+s\zUnH5Q2X&Wxp8#.sUʥ7P>o/&/LVkE:+e 5΅]j;5R,^9^ٲXWecd'6/+;[>]:z.UVu_l+wkD#t)®&>=C/Rj*5fl鈡#*1v>v>j1KA&.SZZHZENUT68*:,z2i]c]> 4(ehnflpfpXM3Gn=;)&i.TKjUCۨ@ٷ%t.,Phs}85]nAݼw4:U:hUGgꔝ/ d*SֻW딅ʱr1ZNr\dsg0Uu!կP5 [ٰj44Ωq{$w-7򏪪_oJtBJ#*'=޼FWA_Yj3W`:{<5hݮ&ŝ|5BQkD3.X.ir]*L_aNt~äzzaNQ쐐I#1;''?yza߂*_>MMMYŗyj >$e[™&x>˃ܤ 2ST{Ë(_ݧW[ӧWurJ?%\5!ǔɐGم*MZH17*Eɤ̶'@*1?QsN:m65O9|$g1v#bTr;/aTz&0Gw '?ZF0`HWF`ń5hD b CD#tΐ ]0KTHxipOԱ7&=}Tin>&}1-T|_1Q-0 BLGaZ+1E)$ S`*¦E0fŘV2VSrUҩ#S:05ˁ&%.`rX./4 VÕ WX W5zamDp;l;@^x7[^!yPT]"*/} vnOӰg9 ^eWo[6K{߃k{Gp>ˀ嵾%|_U~ p~%qY^\ OIy1 krcyEy=X^KO%ā .6&M䅿Z_GIK I)&y?9  "d)!C02 dMƐdO&L"2L#EdI.&l$sH)'.RA*IqԐZRG<# K|'MdYHKbr),!K2r9YNV+J&Wאjr Yg^zY6>:-䎿gys ϓκݥ.yO> &#򩼴|A$_7[^^/k^l\s8K guQeW񌋛{44m B^BKգt)]F/ z]IW i3i4t+7zEЭ^z>@чi FG>Jn>NOҧt/}>KH_/W &}Mߡ!=Hя_5~Kӣ#=vUk&,B+YdvŢY eqg ,%̒4֕e3/U"VXv>2.`V†al8.d#(6Z],X /W^0]f2x3`\VjX-cVe>&-d%l1]Ɩl-g+l%[V+Y3ak]ˮc׳z606[mol3maw;]nveA{`a;N({Ry ¼`/{=˞c^b/W*{`o.{>`f#)}ξ`_dv~dO"d3~c? vbρN9 q ø; ~̇>|sQ|4q|<'R>OST>O|&⳹exUj^kyzuնx#ϛ/R~_—erW]vuz~_7n]xWޜx+ DPBh""D0a"BD "FĊ8Aċ(DGItɢEHiH.z"SE#Ey"_PbO.#  $.Q"ab|j\-O ZVhhkCm6L.Fjm6NM&j$m6EMӦki3,mheZ*JJsksZVyzm֠y5֨ךBmvXTL[-Ֆik˵JmZRk֮hkEV]cMS'lPjsX;% KyS"y\Z3Ks2SsU[F )s((xX\e)1;N%[Qr5\ZQ2kTG!E^#Ɏ1^W*BƖ1Fx6(̚ѿ(&^UXK\g"Zͧ 1$3dRRctX >]rb)J\>'WΚ*(wW]s{ݕNs6*w6NZPV㬕X4h./Nlh4ո*|5ևR}=c,4*V^g bsPOʣ鵹Z^W'5=Y+s*OʮT/y/z@l9EֹLC=sjPB5k6 UJ7YpW<\\5bs^#5Crw%>{jHЂIDd WhjR=͗v-!D U)*TbIXw AqÔM\U. 2V_c 4_0>udb j2*ᦞL6HR9e`R&&dي+Zp-ȓ,+ %\"]循:O\l2P󨃰#Ra>lu LOSPonfzt) kFNA,8sAn^qn bA bAm3BJVܥ(njѶvKC! ʖrU%lkjF(HqC4$ u% iuк*)iTq=3sw4 sϙs=D!2-%r3ٵLW":>F%`"IŧAT+d[d`\, <V诧zٮXI3I@ )RHK] v9j=Ǎ$m?;mٟKY. X*g2aTDҟ/$tj6jn`VJ z_(J¼ʼuЭrEMVJ *sYG_!9\H@Hp\,$xռZ *;"I1o伎$b[,I-#$[%N>Մ\᩽4n+/]7${=*ll>*`@regl)9H RC"ZIDV.%)JNJHTt7%[*RRHY)Rv#RHY)RV )+BJ!8t*H ]BJ!eRHY)RV )+B x̳RH)Raݥ䧐SH)Rv );B q|BN!eSH)Rv );B .)$ ɁB D 1L0D 1L0D 1b!C S)vIFloۚq9Q)`0w7d=й g//&UfdΗnمC2 l?i j<?b ?{f,,q>@A/8`n3>'s~`3dwTpP J:WH=w|'8EpQp_EHnqtRVd)U0} +++ )Eؕ] [(Ӿi+JYZn{]Rrb},$zd29pXޑe {CH g;L:MA^ܬ7p+B=܌f-P_Iշ{ !@jjTlzsbf3XlEs+,f6c܌X4"yJqR6wZ$1iObYHgV9\VJmY*e,7f9\VYnryC H ˆrZdud3O%^bn2-6sc3WWdA!%@0=U5I pJ<]-17}>9ǫrďp>dPR,R,R,R,R,R,R,B B 1,İJu͜^yrRW۲klыsKҠ7o5Uc3+K̥*[m2C9 -QRUO_\r,ssdN5uoH'_zA\ϑgs1n,C~YOI}\pgc i,h8WI%:H.4mA)D-(33+)I@F\|R`5ԠA,C~oРIf媫 .P)V"wT +w\s\;.s[܊Wړd2_[jN2_9jһSk;v$uQg 8J>$crUDt q֭-N=#8*>#ϬgcɌh'cɌ]hAbkұeFXxWsd|S̈Q;qdr=;; Pjt\F3kQk=5SϮP>{[1{[㱭OPFőz325Q5h,z' ;uu(췎31NKg.] rե'}]atJ4n!shJCZqC˞- 9~Cr).n Ɇ9Lՠ 8)OoVxTV'].֖sާL5KS;֗u~s\xSũGnHsn+'*3DD-O!DWukiFtqM9{KVCs1[{?.$?f#TO&f3#j?H‡E+}ve83}/Vꗨԍt]kd>L7kʙEqVK93jNQ3֍ڐ7yRc|mNqi7ne'O׌ R9ItѻD1~dH0~"$:MtT?~Mz\F$aAԭS9`Oڿz Xȏ{/ Câc;ƿ&TJ{ZȠ`q3D/ut{ZD=js%.=DT&:N5Ja:ƻj2lwnwowk|{u$USFm?Dی^;0_4nQREXQӑ>shLwgb;@v4c>#Z! ّnړ݁]o6ۍv]zdt 8.hKB8ٌ6-nlswٴ&bZ.6韈MQ&MG&ߗ6fX׎4͇cᙱpLs/_n-V5B;Sժ|׌}4_mT_:O#{^{.$_ӶO4G+V*ZSQRp՞WIsM\Z^Zɟ%!եX~.lK4m}t{Ss+===u}Xo;c<)3F#]o/~tעU2nȴGO> stream xxU0<ݛJ6 !B "BM6&YH!Il"* [PT?V{Qs݀>uw8f̙9nX8L눈p݈-{fV5& _q,j ?6ᖟy{5΋Ⱥ fr]+>? !$pbo]C`ɣw,*7ܱ@=8nIJ=+|tfOq/x.}v@^&FmTpe!}>=xD18mɃ@ R{]5b|z`ņ rJ^se#Hɖ5l- ~:ϯ!+߉Z] fh^+{awgۇNP0phϾ~} '#;cH32θا[> g\wO&͌Ȃ,5+5GV߬AYaYYd]:km֕Yfݛ`֎dzz5덬]=*{AvUvMo7 =@ ;<ão9ʣ#Hң6(l ! ,\ڹ §3:~ nhov2Rmv96cI3㰗YڹveNj'O/C; T+B;-ڐ+ݨv< !J;?L<r{)kVYDlW^GN= A+C y#} 0~>^߷OOw?>k_EXfٟ|v|>hߥ5_m_ F9<ky~1{[pso{^{͞/|&gyaS{܃\<=)3j=}ٓWC?{vmF uioJ3~+:tKu6xV @q?Ž[uq V o#gwLܫm4pdg5\p w@=1A+N H9L ¼`cSA5j4F4Xڅx@iJn4gkQ,~EPcM-IKakiZO[v\}Z_ ҆hy@sh.3pj,B+hcqxmv6QUh)Tm63Ylm6{N3uâX4uZӼ~'7|3ìo[xG1n;,8?ɟ;,?_/*o.c#1 %Ϳ |N~- ]C\0<ϒ/! y4bX&)lflNa?F; 2.##I+s镤 ~O7sasi x o+y+/j~_/k~_/Lr#_綛voxR] h-Zl>}S~A_ѯ;OFo&7 }JT i, =w8ULD_{N1;-"2*:&K\|BbRn)i{۞'oVv <$7/t =iGU6|qOpIL6}Y=yg_ʪjOMmwF_fmegu{p\K/[wW^u5^w 7[6zwܹq]wo{oy?;{'3> /+?xzww>ܳ?9pMě‰7o 'N)xS8pMěB7z(=x6! O;=u0~>K;J n0| $?ݷK"`DI0$#{ p%\O#׮}W0 #O@X׉ݑc^|hzAXCs?l^) sJtXx 9E` WH",v3_Ie·Lwplpw'?ou|)'O [C ʓ|*d4_tEpiymvX{)Ҷ-Ў=9ļٝB*qw sO5}ȶw7;PG܇D <2,$>7}@|~:'THs2޽z螞ܭkRbB|\ؘ&8gY`o^γ3Ǎ,nlp5,hcӘc 0{瑥8昑Rk$a3δo#sFљs>QxFN֍1ukFr[2uȐx[)Tb)*?9sٳ6CcXd'oUwkȶON*NMG0-s”k0SM/ =l6N vgtk̎iYSb`s"&m TfH>4sNNŬa(/Ϧ]&S @k֌ɴY`{[L{|tݴ|imwov. Eg0jK&Y=eK)Y=mg?H -[0jΖ7{;DJU+Ze.k0?H#TW^TjaFxՆ?J M l0j+%mQw0iq xMԜ_6)ఉG#?/#!#! OGlRi_ ~ͻlpe%Q6Ͷ͑<Rd̄9sgMKKQBKtV9&vSeb?{w#ߍMOmYɮԍrh\)6蹻_t39(]P"ex0N]KxD|H2$G٢ѲK#uݓ<#!o~c3xY<%!0}ΒU lBl$DTt bbbcKncx,< l;cc?)S'62{,DIC$n=ect.;ȩd_,uDrc{t0ĒUbH?;8uǜ31bN8\@ n $Gg#: ~e9㷎h/KG4ziqb#ƅ]1EӮ˵vLLHJHL\F ]bvU~RJd^'zTyWؘmtnil(%1jcW|]]y]K=]z,^xt7SHi IIe(Mm# n0`NaR: 2^E lȱ|u]]PW嫝_Vtz(抾Ԙ։-u/]::1½u|eVZAwGnǁg/@&J)ᶈܚ{vX<Z&3 ǣ*WC̵$%dt(MHL,Şn\m V"^k8#G>9-OA{B_#E^Lz_o-]/g00N4<uk뷪ߵץ{w{mqyҖta҅]WעEMrb9bCG B젗b*YjqNCK/(/Oo&ƎSчȖtMٖ"ĥ;vigu7輜xrQj|x^N.pS}٧lJ s!q U_ ,[qVԺ}~'MY6gVs`N uwG-?Y^$S1zGOwvkٗHNWc7Y: eE-ecð=e[֤ᕄI sb'LMZS>K"=7g1E|7Trڜy"ܠoΰ]ߟ+IbzOcA$T0^nMA3dnJH|Yra'W{?.=쩓jqȴ^&o8r&~бck\{sԫ$Nm~ܰ_"Կ~>JپCn86Aΐ4cáC2~5DK ث0a.NǾEe' ߂u?WҒQ?6'Dlf0 a$ya3Ҙ/sXh{NF^p *1ƾkk-DzlI #~ϑcU)τSWa ~ۓRf,c*,g`9ݐ7U9jrI/Gp1i9?%G\X t}p0z2c9n\&_ u:2P&o^Gx3LcN̩'p}F^:ė$u= x5G@p39Bl@;6 ˴kVl+d ]˂"l? 4UP-eeo%# ˦n>:zupBJ#3;Ʊ ȳ\nWhQ|t;%/DޏRhmF72 !u˥!,@ (}FEӤ^3 844ڽpqOY_Lҷ_Ewrҧʫ0fO2([f)]*KMtJ3Kkr?=a:#p~/fi*߀Lra&`X؆0@E-+pǔI" e.Iuw! ~+,~\y,z,%{Į`sI,AsF"mDR*J}6VuHE=\ 2ٷ}0?sYzl)}F],iv <"|ب/U~p 뱼ct1i;/-en]ܧ(%e|1NHd3[Ϳc*s}=!!i^ >]h[|I\`ԝz,̥RO2/yTdCnPcʣ3Um)Pt_yUCzCz;dL䭈c;t֩gh !AA|]}61Eb ̖WqϧG7}355?ɹNp}r #nk.v*]|u!ij88;" nHa,QRwO?GE !C@FK~bMo:O|>~'4kZm'.nZA1{ql9}:}jp>F#%ƏG 5޻2\&[pD?$cs\KY7+n㯫 w|:Δ!$D- y0\E_f8_RCIQZ,_,ԿW" B+\f˿]V8m*1p RTsZG@5wxFqx4Tvqx tcAw9濟Z7 _ O,7p CTxkW * < <ʓxu2hOx 87x,w!+ozX琞B.=*sHNpi5-d琘pKJ-R1)U!5e# n_}u\qݾ:Wun_}u\qݾR:| Ĕ CtKlRx)o8)+<^y%}|~:T]7pZTTGuo5"Vx_8@ (~RQ`EUtxD#uń f.a)4j UXnP(;aqtcWcK=hRʵ$4W{e}cˇ̓P#qF=SqN-P"=?B3ZЈ}h$iFv68㽨!;ΐ%FTeВJ}f(WP7(^ uzW+RsQQɧdkiRDUJ*&{jU(nv!\*FUoS cOyvHt;.4=J+^,uUFKҴUK|.JjTzG1P\Je͐jp53VU[T-dUz%ݟsZd_ь|Һ W)~oZU66cȫjжN!Vwؕ{՘&tolT3{,;/1,ӠozKU yox?f}UJEEioz`1]eF][򻀲Feu)^d&ex6(aK-Vސܫ.Yj-緩~DC!]5ߔؤޤ|APS!ա6JEjlip2# f4 `DPכߠgenmSkDCBJ:s&vV&y(5&ӯ4^gPpt cpEV9 >OU2 rQUtUW(Jͣf.n&þp~C4+SJջǷX<8E ?Cd l=Vx7G$Fܮ23o4czY =XYŪ;j 3};^jF%1WmJu+ 4BԪ:kJ{8*#[jȵж߈W{ư8[xM3[IԤ4+sWư8j򕻿ZiN]a~:'{MI}ӯ|)/R &f,X=δ(Kuzt½޺]dG(wWk?r9O7qW-UA1QOW[9 Oro}'=ysV6oG][qy>6->F5!-ϡ٢D\iRYf$%E`̞.C{ `|qx"5 D^%M/;**OHlڝm_YkD[)T:8kSܟz&mV=^ei U߮3sxyYN.>*BH[3_y~bЦX /hO_qWywۧyN6|Mfwk7W v3(WOշ}|#/)zTom]o{[=eƀAi^jq{kq}d]oQn/v6=wWչUx@ю}K45{=U췻nRUg@K tl׻w0f[zpt"-KؕJ|f7./qKNj%%3T"Դ#dE >dmnRpMH%OsQh-Bn5*ɪZo }fS!*3lc짎/+4>r哦FFMCcqy%=_mn#_jr}Eά>ҵ4V+C@R^EfGVFU͇3*kNAs{}=U~H.ix_G QaCW4}~~S(tKdVw}G =>QyRs&8)v[:~vbQ9]]6FiVklnVU1 ^ dƵuV^}m3-^䃴tu7{hv uf1&8x F*OsfCn5_kF_mz w8Fu(0ZkDT8 l,6sJdk- B*̘6>޿U4^_<8ϕ9c6\,rً J JbmmmCLW>&u[BJS}C'aa$7iOsǜU ڹu܆@qbl/NhcZG5%Gݩ'-$ZkԱ1eqSX[͞`ϱOyv*bkOt{櫢|!,X._q7SoV= Zѧ^MJN|8?B^K|/4sr,I>wn?[ԙIX&:kg|xjßhkO6#|DC ͻ@C$Btn ) iݡ^e@Ȅ_@`<檃.<ѿC$'p(((ã{9Zl,a<=0PW3j`6΅tgvؠJkԫQ'i:KߑwR.A-3,8 uypG.U.5p1KR pjppL4mp;wFwݰ~ywN_%{vuOSgYxEx ^W7n| ށwA>6n RA)ok=;~OQ):2wuka8"o؄ aݩ)o4nT7b0SHҼҼҼҸ͒Ad0"I'qRHH1)!CId9 '#H)IF221d,GƓSr*H& 2L!S42 3,2!sit2AM*I&RCjId' HYLH i%md YJ3Yl"g>K# Jr!YEV k%RrYgxZNjHwh؍Qyh. vW(E#!C|J>w%/Wk |G'?[ CC ?Լ=/Ci7&魡ͤ}c D!4|NbZBғ0z2NGR:et4-cX: T:Nt2Bit:AgYt6Ct=Χ V*ZM=: "ZOh#&6S? J.gҳt9]Aϡ^HW{Nz1]~)huzM6z;I7M.z7LNCt+}>Bv>FO'St'}>C E}B_?-roѷ;]GߧC͒-~O?7ݩL0X4ne]Xg ,%Kf),t֝`=Y/J,mA)f}S}d_od?ُK޿~avfGQ83ιɣx4ᱼ <'$ޕw<4λ'.F}x&˳x6| `><]O?Ex)C,4 OA< d41|,S|t*' >OS4>3,>sit>+y^ky| x6/,~6_Ws<~>v5tJ~_cպuoGQT0)D>D$n"YT&EwCDoa}ED1@ 9b,\'C8KBQnh>Y #D)F21Z1b'[wޚww劙b-戹4qgݑkޝ[#jEb ݸ]M,K;rq8O/.+}\ygZqT\&W+UjqV\'7zqY"6[mvqSl]nY#]lVxD<*Iu?vKeuMx[#{}[| >{^ؼW|._μW(Ŀ[~?!qXGEjjL4ͦEhZhZ6`-IuӒ-UKҵZu;yuW,hF`\ZViZy36\a'n>M;]hnRҪ5V[bAk|ZXk>VM[-Ֆigjgigk˵9ڹyJBmZH[]..C[}9|oZYCK>k泊^U7}/٣5x}mdeգUa5zzr,Z/F:[1c *{=zq%T^T%Izw^LG5"R31m^45}|^L^׻#MׇT!f4D|Fΰ8X2URec n1pu^osjO}m4Hmp5ycPxgIUAb&O׬5yH.kl kiRJ5X/Pi nJ'ϾcC>J~Ymu{<Ģ}cF_ Jmv,21mL~HYD&2b)1B)2qtEIiq-säS`2;M1brw8-r,-&e)lRvu]kbkiU- e)Z}^6z_U/Red :8zoImږ&l6ՍzY_Uy=JL@bF[>Fj*ҨxЅ|2U-F^w:o8K^OǟB M>MS@jzpj-wMD/rj \zQ 3i巍ԃͭer5- 5%U!\[1ãZ=rc(ՆQ+G#bnj $z\؜9*ͼڣyUao5d#x#z20 CxSEH~XnVEjvכ$i4VX< C !P.OSy悧[t\ }-g[ 3t-g n1<+z[>' _ZHUXjz2B%4Htz׭`,=7fU{=fb}RU.nZdTG6,QW\ʏT4qDb=2p:x)5U>G*k4a "kcMT-jLX )D>h_13GU4xjA ^މP(Libʋ>W&M% 1sBCeNlZlI'{:Rtwl3>oi֣ܡEz15ٵT+2eRhY ȜDH^Bxq(YsOS?fPfU(1'c5qq6iN+ȷ0z]V`aVdaVbbyf(4y,z|JEaQqXTK>Ea(;,Ӣ(;-NKNx8-Nx,.xx,.+gkF5КQh(fYRYYYY,E"rEآ\lQl(x[<-bGţQb(xXoY1 0uX:kueF1#j,r0=FS!ƖFa Eu\&mD)4(ԓ-(:2;Skd5Ԫ! _1VɺH,0E/6?z,˿JcMY5]sQJvkІI%!XH3>E5DJ*CEILgMőn}xR+xDGG"q=F20FJtZaaj}F+@:Iv20he(c&KǢ% 4!rʮjJOLė]Y((y[k5.y=qVQ/zp),ͲVAӈ4E.cwKJL̈Sb SbVhaaaN sYXZXXY[d6rr30$9eJPaR(6z%j+t9 IQbiid0ZRY MYEyfU"knQHWzB+79 ](1$f"k\%sYXVbXmy8[\cEWbЌ Xs z JL-[bڲ8$q6#ae"{MzŎf-vZm!o*kšސ !u9F(mFYz9$X8(3;1yy#rQٯ83<XXz,1GKi;Y]!+K ,qFTXhEӯ%fPqX.1s+/OH_lfT+tbm~fE+KEk!Y8eXXYY!"k 6"kG-z!PoGH>K"k兡VwXE,E,Vt9BmErX+ I`IZdaq+Z[qHKb˖Gq7D/$+zKX g͒Z]NK%%VFv9aPnvZ-ϊoy^^+߄\VP.;X<]Qk(C>iQηݖ[~_oelyXV*vfX8,{,GQe+;B:$uNuܐe,Ӓi촤rZ|7U[_.u 5mJ ;Vh凍-ËBxI80 w*M9lRg00 wa∧0a3$ i)gK0M94 Ӕ3LS0M94 ӔY ari)gari)ga$)tV Ӕ+LS0MYnbari)W\ari)Oebcqq\ari)W\ari)W,I0XO~L,0XXYXY<-|G#oȷx[<-apX<Ê) FĝaKTO=gg|TؑoŎ|gqB6",I5Tz?+}+?(Foơ;5U}9artYZre omc6WG| X-VQP`1;eƚ5Kxk7ˍҠ00p jT_! Vg/P 9 Y,CF; a0dwcirtXH˦Qn M-%}lCkpW4RnNK5$0%Or; ە\FvK8w1O`J8>KHQxO:A{w! Җc䰈Q $@^Tۉ$`ɰ4h4@(aMܫҒ*jEjEQ@Q~p?ՁBw/A)}~޼;ٴһc}ێ5u:o:{Mۋ<l;U}v۫>UM[󭱽j\WYdmٓ-\+Cn^ܩs;br{-brZP jz*J**[Y9'nc sڥ:Zg:γ|η:l-|+F+Ofx2,,?e,Y{nuZkwLǻ_,S 'K0 %% KX$, } aΚ\9Zkqr0O } a0_'O|? [d G ɿBaUhezyQU)03pT>霼eKK+Fyt :oΦt T gZh V{{8:oW; FǥTie'J#ҳ{J+g=ϭҜ{[UN@G*UF+ONYgƕwGF(NKV.-6V=k574͋Z@q[P?./%]}ލWؒg0^eKkɸL~N|΃w˧t\[.wCϩQz6BOqp_\>\{o]=ss]1}SSoݬq >70xfj[ٗGb b1Ŝ]qb}"ͭKٝK\XbWC{Ns_=F-J3՗[/ ku4QEkK5{R718f9`͒|B58N#:1;է\z.Q&Dw-z͎d~oG5+!*=Nq "Grѕ[w[0s(m_K]=:B:"z{Qq8n=7ZSn({A3Q2/՝;3h Mm9P :!E h70M7057057 .u-sz][6ty Bו̉ܺ9HE X5;ef}}ʭ;7vZ/6ZCj(oc7Jw0 {ܷXOJU}laonl__+_c7&xk?Iξj4E3d/u1|ׁyѱkZuSR&eooϘkTA |SsC>7Es#N{rM?1u(!v.ǑNCpQ4p=wџapZ$GERt/mKW2ވbe3ّ슕ΤGJO7.|עHX=d^ڊ)⺬\&pMq믕6f^}\\\)p}[o+"<`̃1`̃1Ƽb̫ d̀1 31 3`(wŘc )0c )0R)0R    O1<0<0<0<# F,YȂ# FV1`d*F4i0Ҋ# FbHV)0R`#F )Hi@$c -0R-0cK1c˼jm?eMP6eMP6ATMP6A٤/bX6!W W!n(Z^ ```*FFF`, Ʋb, 2ˊn"|Ө'qW O^~[*XQxK뢨P. ;iDv#`U6$ yl:dVvAbVil~A[f?lv(-;zO!8DpSژY@̂WOC!;Ca~hSO(Hܨ{؏ Ł3x2ݼA;p5^ 'a'U -H@2[ن_S c !z{{$uXiKt8' fk$'E0Ad|{x;?FbȾ x/ D^a]yaI9³#Kp{!O=@4c`Xđ#4xdwR ʉ7ňJoDDB6{= ez Qfi38vwJuܱo?kYK.BD[5}o}ڋ#  W2G=6w)tnmu`@y2iIՑmeV.TGZ.rqQ,c>Oh'3 l0BfwtzrC6Ck`+_xa6lڪx>fkѨ7_M7ǞOĺαs51˗|kSW废&EerMNǦ+3rA>wmxO<5<]4 L6uCM}O;5`_B:M ᱳ_˥zvDj ~Q |S,OXى}$5SYm,e[oqI2ԆaT딿\n_Nb}W g^N<ĈϧCr,*1gRfidYY.zgF{EѩK,/B@]FQxY* oE.P E=!}AqpCDQ Ek endstream endobj 7 0 obj 23376 endobj 8 0 obj 54920 endobj 9 0 obj << /Type /FontDescriptor /FontName /MPPRDJ+ArialMT /Flags 32 /FontBBox [-1361 -665 4096 2060] /ItalicAngle 0 /Ascent 1491 /Descent -431 /CapHeight 2060 /StemV 0 /FontFile2 3 0 R >> endobj 10 0 obj << /Type /FontDescriptor /FontName /MVGEWD+Arial-BoldMT /Flags 262176 /FontBBox [-1286 -771 4096 2069] /ItalicAngle 0 /Ascent 1491 /Descent -431 /CapHeight 2069 /StemV 0 /FontFile2 6 0 R >> endobj 11 0 obj << /Type /Font /BaseFont /MPPRDJ+ArialMT /Subtype /TrueType /Encoding /WinAnsiEncoding /FirstChar 0 /LastChar 255 /Widths [750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 556 556 556 556 260 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 ] /FontDescriptor 9 0 R >> endobj 12 0 obj << /Type /Font /BaseFont /MVGEWD+Arial-BoldMT /Subtype /TrueType /Encoding /WinAnsiEncoding /FirstChar 0 /LastChar 255 /Widths [750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 ] /FontDescriptor 10 0 R >> endobj 13 0 obj << /ArialMT 11 0 R /Arial-BoldMT 12 0 R >> endobj 14 0 obj <>>>>> endobj 15 0 obj <>>>>> endobj 16 0 obj <>>>>> endobj 17 0 obj <>>>>> endobj 18 0 obj <>>>>> endobj 19 0 obj << /Font 13 0 R /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Properties<> >> endobj 20 0 obj << /PrintScaling /None >> endobj 21 0 obj <>endobj 22 0 obj <> endobj 23 0 obj <>endobj 24 0 obj <> endobj 25 0 obj << /Type /Page /MediaBox [0 0 612 792] /Parent 26 0 R /Contents 1 0 R /Resources 19 0 R /VP[<><>] >> endobj 26 0 obj << /Type /Pages /Kids [25 0 R] /Count 1 >> endobj 27 0 obj << /Type /Catalog /Pages 26 0 R /OCProperties<>/OCGs[ 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R]>> /PageMode /UseNone /ViewerPreferences 20 0 R >> endobj 28 0 obj << /Creator (ESRI ArcMap 10.0.0.2414) /CreationDate (D:20101021125101-07) >> endobj xref 0 29 0000000000 65535 f 0000000010 00000 n 0000004135 00000 n 0000004158 00000 n 0000027731 00000 n 0000027755 00000 n 0000027779 00000 n 0000051248 00000 n 0000051272 00000 n 0000051296 00000 n 0000051506 00000 n 0000051726 00000 n 0000052954 00000 n 0000054187 00000 n 0000054252 00000 n 0000054401 00000 n 0000054540 00000 n 0000054673 00000 n 0000054820 00000 n 0000054959 00000 n 0000055123 00000 n 0000055170 00000 n 0000055612 00000 n 0000055802 00000 n 0000056009 00000 n 0000056196 00000 n 0000056493 00000 n 0000056559 00000 n 0000056782 00000 n trailer << /Size 29 /Info 28 0 R /Root 27 0 R >> startxref 56881 %%EOF %BeginExifToolUpdate 27 0 obj << /Type /Catalog /Pages 26 0 R /OCProperties << /D << /Order [ 14 0 R [ 15 0 R ] 16 0 R [ 17 0 R 18 0 R ] ] >> /OCGs [ 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R ] >> /PageMode /UseNone /ViewerPreferences 20 0 R /Metadata 29 0 R >> endobj 28 0 obj << /Creator (ESRI ArcMap 10.0.0.2414) /CreationDate (D:20101021125101-07) /Subject (XMP, Test) /Title (Title) >> endobj 29 0 obj << /Type /Metadata /Subtype /XML /Length 3578 >> stream Description XMP Test Title 8 1 20 20 1 1 1 endstream endobj xref 0 1 0000000000 65535 f 27 3 0000057575 00000 n 0000057833 00000 n 0000057970 00000 n trailer << /Size 30 /Info 28 0 R /Root 27 0 R /Prev 56881 >> %EndExifToolUpdate 57553 startxref 61641 %%EOF gdalautotest-3.0.4/gdrivers/data/frmt29.cot0000644003401500001440000011342613614004466020233 0ustar rouaultusers ;eieis[RRxxne`}xssxin``}ϨnβiVi}xsDRxsxxis@`esxxss}sneVMixIIxexsnƿi[is}Me}}ni}}x`eVsVenns nxsesi[[sn}s[``[snMnxiD@772772727M}b`n`ssMVVMe[[VVs}iexneesδxȿ``s}}̸}sni8i`sei}}̲se}x``M[snnxs iR``VI`sV[M`ies``[iiDM[@7@77@@VMVexsV`}niR[MVn}s۶nse[ses}δxȣin[ixsζs`Vins`[Veeii`}sȹ[essixȸisVRR[$xx}}isx`eVVM;;ex}M[RVVeVM[nensxiRM727@@[ie`n`nnR[sƸeinexxn`s`nn}ʸx}}}isxiesx}}x[Vnظi}}xi`is@xxxsxixiViRIRexisxx}}isxssse`[}RMV`VRMV`R`xniI[[VxD;DRx:e[;)%s}xsnxxs[}عs}xxs#}i}ƣxeeieֹI}[e[@n`sû}nnxsD}n`[R`[inisxsxxxxssse`[si[eRVR[}snVsϔVIDII[`xn;RnsxI@iDȨnxxx}ְ}}xxisn[}nx`iMRseVxѻx}}}}`xR2M@[ns}IIVe@i}i[sRnnIRsxsxnsxisxi`[si[eR[iinnii`@Dx}`R[ne`[D2;RR}xnssns}}}[en}}ssex`ýߴn}}Mx`IeѴise@IMRi[2RRM}xsxM2;7;nxVRReMni}[[sns xss[;M[VMDni`R[iinni iMMs}sRMesn&RD;sI}sxxnixsxxsnsVMs x}Fn`sx}n`ĴVVes``}}xnnxI2DI`}s[eie}}3n`snMD[DRes[i[eM[[x``sn`n`n[ixsR727D7siiV`[[`eR`i iMMs}sViI{`I7岁essxix}nR`xʿxsx`nxixxixnVʹinVnsRRxess`i[Vx`7Re[/[[eeDxR`InVn@`s[[s`[s[nxnn`nsMD[7;Me`e[`[`is`nxessRRxssViIeRD`Rs`sVVRI[[Vxxs`}}ssx}sxxxss}ss&VVsRnResiesiVin;`MDV}[x[snIiVsVises`[e[n``iV}[IRM2@[`n`[`[V``issxs`nn[s}`se[ȹieM[RM`esnsDV[RM[V[V>[nsxxxs}ssnsĽθ2n`[`[`R[RIi}seR7[i@Vssn[n}`i`[V[nn`xI[`7$D;[nxsVMMnxi}n}sneMi}}s}sƹn|xMMR`[ssM[R`iVD[RR[RMRRV[[nn}xxۨ`}xĸƹ}Ĕӿʻ}Me[I}IR7[@@Rx[sxxeRMR[VV[`IVnID;D7Dinni[enxnsxxx`VsssMR[i[}sex[seRV``[V[[IV[VRMIIR`}sxx}}}sxVMθRʞ[[}ֿ̽@M`[οi2I22R}nnMV}}iex}ieenx;DD[[MDD7iesn`VsxIex`@@`}i7.nV[}nxRRMRV[VVM`[[V`[MVDVII[ii[In[[nsilڮn}}sxxVIeI7[I̿I`nVøs@esIMs`VVIMnnxx[nnM;@@7"@i[n}nnxs}x}i7V}@isVess}ne}MIVV`eVeiRIV[ini[VRnnxxx}sxs}sxVMi`22VIýôϿ[eisȻذMVxsi[[V[Vi}}n*ViRI@7;in[xnn`In[``x` e`sRIIR[R[M[RVe`[MID[`[V`nn}n}>xsM ;`۹֨M;enȽÞUƮ޶[`xnxsxMMVisID`MDD@ix}eVx`Vnees}ies`x`R;[is[RRVMResVMI[V``eninsi[MW`n}}exxnîýֿ[}sx̲xM.ninxs[[V[sVM`[I)2Rinxxn}}x[Mee[n }xns`x`R;[i}iM@IR`V`VV``n[e[xsxnn[D7``ninnxnnȴƔܽMʶ}}ΔG;[in}}}s`isns[DIxsxxnx}}`RVni[VRiD;x}exni`s}iM@D[ie[i`ei`@@MM`xVV[eV;;DD[x}s+xýƲDn}ʴ`x=xxVxxsiϹVRVxn}[`}R[sn`nexiD`e``I[M`ee}`Rex }V)x nsnD[ie[i[ii[niM@@`Vsn[endID[V[n}ȻѴ`[sxȻMxV7@@sxennnsxxsn``esx xii``en`nneennsxsxsneVini x`ii}xMx.2Ixxn[i}sxeiie[RR[ii[nisII@@nei`i8eRR[essxx;x}`̿ƨi}`ٽ&xxiȰ}[Røxnxxnsxx`snse[MR}xin"Vi`ssi`sen`nxsn`Vns`i}sInexV`9iD;eV[`nn`esMseM[MVeii[xVII@ninnxxnxxiiexsnihƿseI̹ĴֶӶn}exssxxnx`VxsiV`ss[[`xxxnnxinis}nex`R[`R[RIR@R}K}neRn``[[s``iissxi`IVM[MVi7IiRVV@innxxnxxDex}s`iYi2``[ȽiDx}[}sIMs}}ni[[}}seMRIxsxϽȮssiVV}nnxi}}n[e`VeiisxxeisxeV[`[[nx`is[`iin[VIMV`ixeD7Resxe`[Dexxi7VsVsDVֿƁ}e7ns}s`M`Es}}ein[snRRnD@Vʰnnss[es`ii[xne[nxsx`DMx}nxxs`}}n2sse`i[I;DDRseR`x`[Rxsxnnxss2`}nn}[x}}snenRn [n۴eFȸ`nƿxiM[nV}x}sxnR[`VIVisȶ}s#nsxsnVRisiVssxseRRM`siV`s}[xn[`VV`[MMV[n[ise`IMnxni`n}xs}`Vnssis7[xi}}snenR;`}xssiƿiM`xV;I:i}i}xxnVV}}ƹx[isV[[iiResssVMV` ʴR }}ȽnxV;Mi` i[[ix}e[VIR[`[n[xnnxsRVxiDDn}V[̆`RVR;`}xn;en}x[sniD``sx}enn[xʐxsis}nIMR[`sssVMsx[nV }VneeVeR`ni`Vxxi[[``e`[n`MIVixsxV`sVMMieM`ѣ}iRi`snnsn;esãe;R@ָRssiiIn}xsãnxnĆeR`#ine@DRe[R[nns`9}Rxxe[i[[nixnie[[Vs}`n`[nseV[RIDIDDR[x[ess`DRnsD}s}}}x}}i`s7sȴx}xen}7nee%%7exsx}}xsxû}x}ensiVeisiIRissn}n`Rx`R [s[xIMVns}MV`[eseesnss[IVeVD@Msxxsenei[ii[M[`in}ns`Vnsx[Is}}e`ieninnRixs}nnn[n2xVD2Mx`DV}}xƽxn}e7%2Dx}i`[IIxxxn`}x[Vnxʰs[V}!xVnseMMViinxxsn`snsseR;7MRiineisisd`RxM@D[xVesxeVnen}ssx}eiix}xn}nsnR;;xDex@is}xx:inn27I.isn`n`xx}e[s}sxxse[V[sӽxe[MeexxV[[MVs[Dss}x@MVRRinx}is}n[MI`xsxxinni[Viie`sesxe[ieeinexnថ[i@)x}}s[s(snʁsiVi}sn}}snn[esnsi}i}VieMVVR}VRnsi}Vssnx s}nxxiVx`[`ixnxs}i}iM`s[ni`n}}inni[nsƋn[@֐}nVċen}șxƲ}se}nsn[`s}xnsnssee[[``n}nx$x`RReV`inex׽xs}x xxnn`Mnx`VResx[D[xs'snnx}[i}sx`[}D;V`niQn}nVċi`}ĸsi}sxs[Vi}V@ixnx[n}xnexM`ne`nsظĐiVRei`Vxxxsې/}nnxsnienx[Ve}seniis}nin}sienx}}Gxni``nssinxs[@ )I}ƣ}s}}si`}ns}en s@Mn`}xsxse`}snsn DVineenx`RIR[ Rn}nii`n\ڋsx[ixx}ixxDMeex[Vnsixxs`R[`[M}}ne`[Vei[ViiR7@n`[x}Rsnxnxϻnsxsxxi`s}sxnxxi[Vsxx[`}nnx}x ϲx`RRVV`eVsnnx}@sxesx si}x[@@[ix$inxsnse`[V[R[x`xnVis[`x;s;;eù}ni[exsn}[ssȞxxixsi}xsxi[`[e`eV[e}`xsxn} [sV[V[VR[nx}}e`ex&snixxsRini`si׿iVRRVMs}[x}In}siie`exnenRVMDsx}seeʁsn`xix%`̲`n}xxssxnisnn``M`sxsnx$@M[`V[MV[[V`}}ns}e[essn`ksnenn[n쁆xVM[RxR;x}s}x`xnesM@@i[`}is̻eD`ssn*x`RMsxxiϰisVisVRee[n``ee`snS[DR[`VMV[[VVinnssxsIIR`snxeVxĶsisxexx;iVIn@}sx}xeqisi`x[DMneVRe`nsn}MM[[sn[ni[ssnnMRMsxאseixn[Vii`iisxxnXiDVVei``[`VV``VeiRMV`ۮssxxniseRxx}}x`}Vi}sƹ}iiiseenixeVI`nnssi[ie[``[nsx[sM;`ssn}x׮`nĽeie[[in}xs}qVeiexiiMMRRM[[Vixss}sn[[i[`ssxn`sM[eR[n}i`MD.Ms}R@ix}s[eR[xs[[`ne[LRRn`V`øֿixM[VI[ȔsnV`n}sinȆ`nĽeiVMVei`nxxnrn`ixxeVMVe[nVnisxssxsnx}xe`n`eix}iĿxxssn`i``xssn`i@`@Dsns}}s}RRVV[ssVne[`niQ[nsxnVRsineΙęsnËnnsف`nnnĐV[ieiVMVei`n}}si`xn`VRRe`VIRexx}isi]Ves}nni[[VsĴ[MsV@M``[exnn[sV`xsxxsixxsiRIxe`sxi[ei[nni`Pe}[VxeV}@;ssiR`̻nn`[ns}}n`s`n`iĨss`M`i[MResxn}}s1e`xxieVRRii[i`Res}}nsnssi`seVe}[sRiMnDMsn`[}R@@DRiV}}@n[ssxii`Mi`e[`xsnneiiesR[nnsnn}M@[RIÿi[nss}sVn`n[xsVs`M`ns}ss}ssesxnxeV[V@}xxnxniVsnnssx}[[nnxneMnsnRI[xsn}s`I[VοD@RsVV``s[`eineRn`i}I[iVsV[iIM}R@`IDeƹRDesnsMV`[IDMMVeM`@IiRx[s}sxn ``Ô`R[VM`esninnses}e`}*}VM``esxiR[`n`[xVis}}iexsRsϴ}}I4DÞs[}`x[isx}i[xxse`ie`snDeVVsenBxnMiVI`IIMDsenIReVID;M`MDD2e`RVI}sssi}x}i[ڰ`I`MIisn}snnxsnAs}xnn[iin}s}eiMIVs}n}VVVxΔxexVnx`Vsnnxnx[sn`}n}is MiM`xn[ViIsMeD)s}Rsx}7V[V[[Ĵinn`xnnsnM`nn`snxni[V`n`DVD@DVeV[``nxsxs}}si``nx}2MsMʁsns``n[M2`ƐxxneViִiIiVsInRIinVeMV[`[[ne}eseRMsiI`nȶxn}s̹isne[[Vnn[s``exnxse`inxsV[`IDIVVin}\xsƿxisV`M@eô}x}se[ineƹљs}ineViρ}sis@sse[`n`I$M[R[nsRViMie`VR!}M`xnnx}xssii[e)e`[xsn`InxseMIMMIID;IMIM}nnx}snnxnĴ,V}s`s[MDٶ`V}ee[iR[}2ùm}exxeρ}s[VsiV[I[[R@IM@DR`ns}seRi`V[[i[RxiI`sxsxxsn}}ssnnessVM7Rns`;I@DIDIDIIMIn`ei`ss}nnVxies[[`eDRi״7M[nRsReÔn}}nIs}[`ʆs[VM[[DVx}RDMI@:DR`Mei2 `e}⻰Ȳ[Vxs} xn}xs}[xxnVR@RRV`sVM@I@@IR`eRIV[Iinsi[i`[e`nD[iMexn22MMxxnMMI̙s}i}xxe2̞siVnM[[DVx}R@7;7;;V`i`M[niι*)2Vnix}xni߮ȣRxsx}ss}sn[@RMI@De[nixV@D@D`}s}nVei@VsnsR[n`nsex}``}M@@[I@II7DMxn}`[Vssxeixiðn}}ss``MexeI@7;G7;;Vi`ie[n}`VseiV[xs}xxssxxe[VMIRi`Vi`@MiR@@Dixix}nixD@nnixDV[`n}xxein`ni``}VDVnDeM[R@@`[Re}}neIRs`V}e.sxe[}eesnnsi`[R`MDD@``i`ie[n2n`ssx`}xe}nxVI`e}}VinsiMVe`MVV`[M@[[7ix[D@ReiVe`[nnDiseD[[s[֞MM`[22M;n@DIRResx}VRnnMn[.@[`M[ӿen[}ins`R`MDR[se is[RViIR8ni`;`nnxxn7@nMR}x`Dnxs}xi`esns`i[MIRMIMMDeM`xs[[Me[VVi[es[i``MsVx}iI`eis`ix2@VRD[[iRMM[[IxnVƹ;snDxȞnRVnen[}VM[e`Ix2M`[I}%ni`;`ss`[[;exnssenxDiVMx ssnini[MRIIRIRVV}s xsiVxsDȶeq`}`}xƶV[sn`eeieeRnnVRMID);[i@RssR`eesVe}ٿ}}sVIxsiιiIeesxxI[@;`nRDesM;DI`ix}1ss`[[;%@;`[7Mn[sxeMMxRR}ssnnexsxsVIIVMVVRMMsiM[s?}sn`[IV[n}}eDeiiss}[}}neei[RMIeRI`V7@@RV;@D;s}n#`MenV}sn}``יeiôsRVVein;}e}einneR[s[IIRnni}nii}%@;`[7Meis}e}}I`} }ssxnnsn i[DIVDV[MI2R[`sIRseR[MVRM;}s}[isVI}eeD`x[e`D[MRx/M2[[`M;eiI)IVR;ixRnV[sVesxi; ўxsI`isiVN`xs}nessiVDI7.;;@nxnsRV@7Rnøxssxi2`eis}i}}xnnis`MI[`V[n[V[@ix[VII7VVn`enxΨi;xRRiMenn[nxxxIVe@IsRRns}i7DMI`xiinRx[2sII[Áis[Æ}V@MRis`ii[`eVxVV[I%;2IRi}6`nVe}2;7.)nMinn}xs}x}}nnie`e[@@V`R[`n;IM`RMD[n`I`I7V[VR}x}In}RiRV;V[}nMnisM2Mii[;;RVRiR7 IxiRDinei77n7@Ѩ`xx}V}exR`iiRR}ne[esVsiRDI%.;-D}}I[@7;[Dnѐʨx`xΣxsn}sn[ei nx`D@@[V[RneM[IR`iV2M[xnxnxMVnRsx[sss}RVeRDD`sMD;D[V7%Ii`in`Mie[IRxVie;2IniiniiȰne`sRexsx}e`xxRiVRMie`esi}n..[R;-i;;@)M[7nȆe}Ƚ}n}nsnninininsi[V`[VViVIDRineeV;ee[}iDx`RRni`R7Rsx`MMIiiI[[IMMRVi})2e}eexMMDxe;ei%%Vss`ȰʸeVR`Is[`[[e}e[@R}C}DIe`}`VneVM;@MxI7%%77[sVûssnî}s``inxsnsxsn[ns`ssVR@DDIV[ni[Rsne`n}eIn}s`Rx}[eVx`nċeMnn`;I}V[siMVeDDVD2M}VseD@e}@;IDIV}VD[}IMx[M`ܽIieV[VVsx``?nD`R;[snesxsR[iRMRM@e}V[ns٨i[``n[neeVsi[e``@;;IenxMIM}`M`nR72nsD[[nx`n`ni[exexI)VsR@[x[@I@.MsV7`7`iMn`MDMnn@D@Rn}}Mx}sM[I`[}`nnsnVRni`;72BD[``eei`[V[D[[Vsx`}ƞףsxn[``[`sn`issns[Vsx[ienenx[D@nsxRR;``[@VVieI[iVR`i}ssxRennI;77`[;RI@7@n`[Iix7Vin7DM`[DRD;iie``Ĩ}seissnesxn[@;Ve;RMx`sn׸ѽnnii}si`VR`MIDie`n`IRe`DRsnenI`n[VsxDRn[n;%iiVVsnxininssR.@;`ixII2IRee[D.2Rxss``}n`nsiD`s}.2R[M[`ns}sexnsiMMVseMs}sx}}iiM$[VRDRx[)2RnniӿÐnii}iRViV`VIMD}xVIRR[`e[``[`}`@MVee[R[`xIxMMiix`nn`}R@7}x;[RMD.D2[e@2RsiVxxnn`;2DnxiD.D[VnxV`x``ssnn7Mxx[nxxn[5xVDs[Ms`I[Rn`ٴư}V}`MV[iRViVIR[iieeV`V`V[snMMs}e@Mn}ne}ii}RnnnVʰMexiieIenM[;;i;MIVV7DIDI``M``}enxii}[2I`M}e[n`}`@RVesVeDsnsI`}}sxxxnn`eI}RD`D;esV.snieڣIDIDD@2Ѹie}s`VMRR[RVVRR[IR[iixs`I[VDxiVMI`}Ӑ}x}en}s}xVeiexe;2M}7RRxse;77@inDI[@R[``nx`e}s;%V`7@esnRRii`nRI`es[R[}si[e}x}xxn`snn`RMVMV?Mneen2neRx`VIMRVVM[`RMe[Vn`e`xs`I[VI@`̞}}n}ex}ns[Rx2Mn`DM@[IMxRRIVD}};[@DD@[[;%@Mne[sx[xR}R[D@;Isssine}i2M`VxnsnVR}inni[`nn[}xx}RIR[`[`[}ήא["n}[VV`[RRMRR[[eiesinxx``ieVI72Vδ}xxVDD}e`[}[[@VDn`eDRV;I7VRR2Msi@e`nMMR[[si`iD}i`siM@s;)VsDVMex@[nR`e}es`niM7e}x}i`nnssnns}IsVe[[e[[iIRnxn}޶ً`[MMxx`V[nIRIRV`VneessiVMMRiinD@.R}x``xi}}R}I)I@@[M DRI@[iRi;..M2D7I[IV@M}nnxV2)eVxI[s`s`eeV@MMs[n}nI@RVsexnV[`essiss`G}``iVi`VVee[i[eİڽsV`IRVx}ResRRVVM[Ve}x`V[iniIIV``ixI;[I);;M[i}}`Rn}R[sMsMni[``%)M[VRVRMs@IR}V;%Ih`sR`IRRiM}nVMMI%7;exVsn`Vi[RIM[}xsnR}enVRR[esxx[nnsV[nsini`is`enxûȸ[[V[R}eMRVRIVRii`xsseinn}eMDVRIMn[{D2 .@7D`s}ss}}Vxx`}R}nnsn[VVM}e2@MnR;D@ .IVV`i2;[n[MIIsVIVn`[x;@V@[@RxMIIMMRnѲxssseRI[}Rxee`R`VnnsJV@sDMDD`nsx`i`i[i[`Ve`Mxx`xRMIIVVen}ssnnxssni}`R`M@IMVik)D`nR@e`R`ii}@`}nDIMi[2Vxe;2[2@I;I;I@RR7;[`neiInI`I7sV`IDen2DReRIVMMI`MM@ssnxs[s}`I [n`[nxi[isx}sxRR;I;;[exse`[exưxV``Vn[MMRRDVx[sxnx ns`xeMRM4eeIsx`M`nix}V}R``Vi}`RxI7;[M`x[%i IR7M[@ M@VD;es}MV=27e[[[D.%7IMnDMI;I[Iis}sVVns`VM[[n`eeie[[`niixieRMRM`sxn,[`[enenĹniʶ}e[RVeVIRVRiieVn[xsi i`RM``MDIVMeeIsxxe`RisiVes[`iiMeVM;D@iVniV.InD;2[xVM.DD[sV@[[VnVDMMIesMD;VV}[n`[DRnsxsx}si`[V[[RRR;IDD;IVMe}VF`iinnii[e}siiV`ei[[s}`VeIiVID@[VeRi[I[``x[[sDRVIIRʹ[[nxxxeI`sRVȨ[}`xxsR2.IMD`[I);D`iMR;IRV;D%I`M`;I@ðnR[RRsnsxn`VVni[M[ensxeIxIeVi}}`xs}`[[V[V[}IDMR`@27Iexssn ennsi[e}n["ien}ieøeMνxs`VVix`MRes`V MeeVn`IVM4nMsxssxx`n[`e`sRVxxV``)2I7Ds}DVV@@}iD7VsD}IVMiIsxRVn@ennes`;x[[RIMM[VMV`nV[Vns[iIRnn`[[``e`R`I@R[Ii[Dx}iisinsn[R}snieVV`[Vxien`[IV`eneVIMinV7IeseIIMI[i}V[seMIDM}[xxn@@DIRMRnxxV`i2.Re;[eRR[IR[s2@@MIIn@@)@MMîDIse@[sMM[`M7Ien[@D[MVnR@IVVR}R`seMisnsen[VRi;D}niIx}ens ni}`[V[iVVn[i}`D@RRMRIM`RiRDese`VMV[iV}}[DMRVxeIô[Ri[Mi`ne`sxRse`i2.Re;I@DVRe7[n`I)`xIDs[Mn[V}nIx[.xIxDMnn[innVIMn@V[x[VexMiiR;MR`Ves[VVRnnRMVI;@iIRiins`isnini[Ri[`Rei`VMIMIIRMDMnsRVe`MVV@I[VVi}`RV[DMVrxne[[7}en[M`n@}eDVn}xV7.@I@DVRe7@IeM;;D)IiIIV}xDRnn7D2InVxMI;nnnD@n``i[sseVix}ss`[VRsiVMMIR[VI}}xsnssnixe[[VR[MVen`VVMIMIRRMRxMiDMei[DRDDMIMnVM`xs[V`[VsMs[`ieVDMeeMVeie`@Mi%D`}V7DV;@IeM;;7@RIRxRRIe@M[xM@`n[sMIDVMVnIVDV[xsnnxi[iesMx`@RVM%Riis}ssxsixxse`e`ei[ex`RMRMI D@MsVII`neR@VMIDMnssRR[ixnn[[``[M[sVe}R.sse[nsnV޹[eiIID;ixesVID;7I2RDR}D7@RIRxR@[D;@@MIMx`.27MnRReV[xsxsnsiãn[nV``RMsx[MRMissx xnissn}x}`:V[xxR`i`[`RDIMDIRseVeVVRIDM[MM[n`R[iVR[VVe`s``i`IV[[e\`[xnnMRM;xssMV[RiMI[iRi7@Dni2)VV;DDI7e`RMeI@[D;@@Mne@[xni@7`sRReM`RIxe`nshèxsnixeVViRIVRiI@nssxsxninsee}sixse`[[`}ixnVVRVVIIei}}VRV`@@;[x`DD[eeie[neinne`e`[[enxx`n}e;@e[}`[ΨnVM[``}x[Mi`enRVVDM}Ii[2VnD7eRI@@[@V[@xs@IRM[n2 2ne@[xni@D@;[VRMRVeMesssx}xeens`[exeViRis}Dnxs}x}xeie`ni nsn`[`ii`[!RIRssV`RDIV[iMD@ReeMMRVMMRRVM [RR`ieieeRIeVxsneIsne[n[n@Rniii[DMI[RMD2DDV2@nI@@7`ieI`nDM[V`}nD2%[i`RM@D@;[VRR[IRnxix}xen`s}[`[`[}`[VeeVxsn}xssIx}sii`[`ei[nxi`[`neR[VV[[xinxsnRDIDRen@IRV[}iIR`MDV[RMIMMRixi`siVVR`3[DIxnxV@I`[ȮM[7;ns[I`eenV@DDID7V}iRRIR-iIDe[nRIR;;RD;ex}s7.D;MenR[IRnxixxieieVsV`[[}}I`nnis%}xse``i`eiixeV``}`MMV`Ve}}VVeeVMIIM`RI@;Ii`[MIMRRDV[`[V exRRxxi[Vei@@n`sDDIxiVMeiVxxe`@I@I;;e[n`iVID`}V2e}[[IMM7.`s[iVsn[eI[}iR2Dns}xii[[eie`ViV@@xMRVVssxnnxsxsxse[`[in`iseVnx`[-iiMi`IMVVIRM@V[`eVVix}eMMRDMMDRsiIIVix}xsn[m@RDeIe`R`eVxnRR2VVVnixV;.MniD7)7R`sxIM@nssR`[2;7eVMReiniMMRsxeMss[Inexxixii[[ein[`i[ @;MR`eI`e`sxsxi[`VVeninseieR[Vnsi[VIDIRRMV!ni}seie[[[RDR`[RDisesin[[V{.DR@D`sVVMxIR2;Me@;MM[D7RM.;e@IIsnsR`n[D2;%Ds``xM[}iI[isx[`xި}i[s[nxx[[``[sn[`i[[@MI;;@Denexsxs`[[V[is``nnxx`[es}`[`RIIDMRVMIR``eiVDDRRMIMneIIVn}sni[;Ini[}RMVe}R7eM[`MM``MIDD}iDs}RI;e}}D[x[RIe27nIVnV`V[VMV}IIsxVVxؐxss`;M`[[}R[sM[RsI;;@Dene}nssnsxsx}n`eV[e`[Vsnin`V[`VMMIMR[`Vei[n}eIRi[V[`VVDIRii`sxx[.IMMxx``}RDM2MnR`M[eniMRVDIRVV@DRieMesNeMR[R[I[iVe@@[[s`R@Mixx[[iesMn}V`eI[`[[MVVsDsxD@Mesie}nssnsxni[`eieiei[sV[e}}[[RMMRVMRV#nsinxs[IIMniVM[MMIei[[`s[``e sIsID}}`@is[D;D`2;[ie2DD[]I@VnMMn`s[MVe@7n`;s@MV@I[inseDIV`seMs}sÁDisM;eVIVM[@DR`nn[eDDI;;Rx[`xsxsxssxni[VV`i`VD[VnniinsIIMIR(V[[VVisnnDDMnixi[si`Vie`esn[nnse V`DR}D[i}@;[M`Vxs;.is;`2IM`iI2@ixsMIRe;;MVIe`[RDe`MR}VVI@;[xe`[RnxiV[.ID.)IxR[e}s[VR[n`ei}insxxsnssxxsnVV`i`VD[x`MV`RMIIRMR`e`eii}ssn`Rn[[`esse`ieR@R[esVDV[|}iIsVDs[M%[x7[Msis}R%;iR%Mxx[nR`R7V}ֹ[`[@Me[@D@@;inR7IsV`xsV[MxMxxnVVI[MiVV[77DI;D;7V}sen[[`[D@}}`sxsxsxxsxsn`1eRI[ix`MVi}n[RRMMVV[sxxe`sn[VsxxiViRixssiV M`iI7OeDIesniD`sV)[niDnVnsR[MI[M7esR7Rx}iiR%MsRs@VV7;R`[n7;7VRIM`[VDVi`MDVsn*sR;DisVDRV7II;nssni`i`;IDD@i}s}s}nAs`VRi[n}eVRVVni}n[RRMMVV``RixxnisxseR`ixsxsxi`[DVI2[}[2[Me`sM`VID7RMD7Re`MRnII`;[2I;ex`@Ve7De[eD[n@2DnòR}I27;7@DMniiMIinDnns}sninne״i;@IM ne`[``M*@`ni}}sxnss}ssnsns`nnRnxs`iR@`eM;`i`V`$Rixii[[es}i}nnxnsn}siRϻI7xxsQI`niVsDVnIxn@DIex7MDeDVV);IMxI77[DMRMenR[ssnV@[;MRn72DRR`x[s[iis`xnxsnѲI27IIRs`ni[i[ie`en s}}ssnnxn-inseessnn}}MRxI@RexiIRsV27Vxii[[es}sns}i}}߿e@iz`xnni@2[nDi[)DIxiIV[@DiR7MIIRIDVMiDRx`D@V[eۋI@ni@iIVRxMRٲsD;[`De}xnnsx[ie[MDIRn[e[e[sn``ee`[[nn`snenxsCe``ns}xnsxsi[MDee[is`[MMie[sn``V;[sns}iesٮѴ@;ien}}n2.[VMV7%D;;V[nVDI/nen`DMDMs[VsMI}MMVMI@D;ID}`[RM``nsRiM1Rxnxs`}nxxD`[RnxiIM`Vnii`[iinine`enn`xninsn`snsnx``ssxx[DDV`MeV`iiMMR7ID`xRVxieiesفs`}bsRDn`I;InID;De[`%;[M;DIV`D7[xxVVDxD`[@I[[VDixMVI@`[VMixexixi@DVinissxxM@ssxeMsR7IsxnI`ni[nsi`[nVennx}nenssnsnFiѲęeenn`e[`V`[@siIDI;;IDe@nI}nȸ}sxinssϹssxBxnxxnn7RI;sn77}nDinI%;;[n7;nn`n[iIseDVi;D`MRsIDVnn@ReeRe2e`n`sx`I#[R;[in}x`}e[eeM@s[sn[eMM`n`[` sinn`i`}sininxJnsxsແ`VsM`iR}MD`DIR`I7D@IsRixxnxnsn[`snxiRxx}`}se7[@Rs@7I;M;en.27VM`MII[II}}sIV`;DM`RxR[MIInRR[nnIIMx}x}V[`VVnii`en7[eVVissin[R`e``e``[[esinxnixx[`iixxiI}iĮx[VxxƋ[iRMiIMM22DDMxiMVD7iMViM}isn`[D`x[ݹMsu@s``x}sI7MV@D2D@eeDRȴe;@;2VDDxs``nRIMII;7RRsVD[snMR}`V@ex`nxIIRVneR[M`sinRRe;Rxx}neii``sseRR[xn``ensnNxix`nn֮ܽiisxV7iιV[IDD}n MMV}[VDRV7MDsnsiReV2Ixeb@.enssn}2Ii7D7n`IID2xI@MIxD[isD22DIie@)D[`DVsM@R}`I2exsVVi`nen[[M[`ViieIRRieIiisxnenxai`VVsxnsnxssi`issx}ۿeVxi}xVDx`MDVs%e[[x}@I@V[MVRnxiR[`[xs`ಣ}e2;nesiD}VM[2[[Dn[)RDDViRDD}nDMRs`R;;7`s}RVM2@@.Meen}xsR@VR@xxnsxR;;Rn[n`D@MRRIVMĮiVniissxxnnxnii[nn}xiin}isnsn}ins=sIi[n}`D@VIM[MMnn.;[VxI27;V`M@MD`ee`[ߐ}ӹv[esiMsiD@IVV7`sDVIiV;2RM[VnnDVVi[@IMnD@VVeMMVD2@;;}se`ini[VnRRnn}[IR%.2V}sDD@R`[Vi[ieexsnssnnxse`isxsx[enxni7nxn`DVesΣ[VM@D@`ix2snDM`@%7IMD..[sesx}ֽ`;@isixi`I%I7xxs7`MD2[׆xIR[I[ssV@seD[RV7@2xIRMM;n@IiiResxRVxi[7@sxnnIIDDIRiRisniinnxxeess}nieenssii}xsi`iinsѿ}inxneRD[MၮDIRxہi; %@I.2DIM.%;}VVRRi``R;Dei;tRIinsxnV@[iRMe`xsV)R7Vès`eMIseR}snMR`e;sDVIDMRDneVnsx;;nein}iee[R@;@Meei}e`issxee}}i``[``isi}s`sieQn}׿n}eRxVM@;;`exVesnVRxD)I}VMiRIVD.`iRi[II[`āVV;..)..2RIinnss`R@e} V}i[nMMRsxsM};inVxxssV}M)7@[V[sDVRI@;`xM}[ixnssneI;e}ne[VVx[;@IVxxi[inssxssxxs`[Viie[;`nn[[`nn}sinRD;;s`D22;;2;%.@Ie@V}V[M[i2@RIDD@ ƽ;I@;2D@7)77.4e}i[nss`R@e}V)ReVnnIRRxs@@MiDMViVM``DiI@VI@nReI[R@x`RissnxRe}n7e``nxiMVenxsi`esiisxninneRR`eMDV[xneR[[MM;2272)%2.;@2)77ID;@`niD}ܸI.7@I;27`iID27272.2)x`sxx[D[I;eV)ReVnMRID}iDeMMV[Vis[eMR;7e@VRMRV``[MeMR}ss[snssx`VVe[i}x[M}xne`nsnnssiinnV[i`V[[en}`MM[[}}I I.22)2)2%%)%).)"7)).27;;I;ѲsD77..2@7Vn7)22.)2%.27..72..27.2g@nniee;;[IDsR@Ies`MRID}iDeM7M;iIVIMiM2IMexeReRR[i}M7RsxnI[xe[`nn`e``sxV;Din`inssni}s[[`sni``e`ssneRV}i`I.272.2.277.).2)2))..2)%)..)7sӞ;MIV@2;D77..2..2.))%22.2%%2)%.)GeiDM}I.M`Rei.)@MR`MM}e@`sM7M;ixRnseIiMVMin@neIsni``7isn[isi[ixs`[`[V`}@DVIR[`iisseesiin`ieseesi`ix}ne`M27)).%22.)..)%%)..))7)%.7%2)2)77..))%22))..))22.).)22). 722..7..2.f[IVDsiIRsi@@DD@RnRRV}iD[iI`ȹ`@DixRnseIiM@DRMRei}sRn`.M[sx`[x[;@isiexsi`[MR[VnnDRIMMV`inisen}}i[nesi`s`[V[iRIR@27272.%272.2;;.%.2%.)%.27)%)2)72)%)2%)%2)).).%.2.2.22.7).).2))%%)T27D[MM@[sn)%@Vii;I}nM`VIVMs@;MVi`VDMVV@DRMReii`[}xI7VVns}[Mii2MxneienseRMM[`n[D>VDs`es``xinsxnĮ}VID;;)22.)72%%.22.).22 %..2))22)).7.2)22)%2) %).)7).)7).22.2..27..).272)2esI.i7@7DeiI@`ReDRVI}ýV[};2Vxe7V`RVVIIM`[n[}xI7V}Ѵs`nssii[in[ieM[iVii`VR@I@VIiseixniiĞ}}V;2.7I272)72.7)).7 .2.722).2%..7..72.%%)22)2.%. %..2%))2)2)%))%)..%))%%).)..) )..))%)BRI2Vxi7MeV`xV7;Vn`In@[M``s@esRDIDVI`ieinin[`xѴs`ise0xsMMei}VIDVD`RRDsxxi`ex}nnΐV}[;22..@7.72.)2.))7.)%))2%).7.)22.2. 27))2)%%22%. %))77)2)2)%)7..7..)7.22..2B;))VVII`IDi`D[[s}sDR;RMnse.eV}xsi`s}n[nxxnxnis+xssxss`sMD7M;Isne[esiRVe`R;;2.)).D22.7.2.2.2.272))27)7)).7))2)%))2)2.2%%..)2)2.% .2))2)%%2))2)%.))%)oI}%)}sDsVRV}`I`ieM̋x;eVMieRiIiinnessx@Dis}ݮess`ii[[sxssxss`@MDn`Mn[M;2Rne`exxsiiR@77)2.2@2.).7))%..22.2.)%..272)22)%7)27)2))%)..2.2..))22)%27.%2%%.2)227)%))%)A7@DVe;esVxxse;M[V@.RsenV%xeV`}[2Rnn`xxe`xnnR`xiӐs}`-sn[ennxsn@MDn`Mni@IVi`RV`ii[M@.2;72)2)D7..7%) .722..272..2.2.)2)2)2%)2)72%.%.%7%) %.2..%.%.)%)iIn7@}xsV`[MRDi2VVx@`IieIes`nRexnInii[ήRã}n[MRs``senenRDIneMRi@IVi`R`eƞn7;..72).)..7.2I..;2%)%).7).77.%.72)2) 2)22)2)%))2)2.%2..27)%272).%.%Ks.[s`eR[xMDR[@7s[;7DVI``Mx[[Mx[seD[`s``[`[e``xxn[IR`sxs!MVVDDVxe;}ns`nVe`eƞsD;;2.7;.).);M2..).772)2.77)2)2)27)72)%.2.%.2.)2)7)2)7)%)2.2%2.%%)1VR@Inʨ}M[MM7iV[enR[IDn[M``xxs@[Vx;VxnsZn``VDsVVVII``nsnnsniRII@D[IDRn}einsRöI7ssD;;2.72.))..2;).D@7..).7)..77)).2%.722)%)2)2..%.2.22.%2)2277)722%2)2%%.2.%7;Mϣ[iRRn2IDVMinMRsI7n}Vn[nsM7e[Rsxe}}`xiR[.neDnMniIVenns[s}[DIR``RMIIneinx}}ãD72772.))..2;;.2DD.72.2 72.77..)7.)27)2%2)2%2)%))2.2.22.2.7)27)2)2)2)2eI@iV[[DVRVD[RRDVMVxe@Dii}e}nVneIeIxxRIsnneenVVnVIMRnnVMD[ix}M`x[RDInx[IV[MR[V}}ۿe7272;;.2DD.7.%2;2.272.2.7..7.)..))7%)27)22)2%))7))272)).272..2.2..%%..)272)%)gdalautotest-3.0.4/gdrivers/data/LanduseSmall.rpr0000644003401500001440000000173113614004466021505 0ustar rouaultusers[Ilwis] Description=Representation of land use units Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=Representation [Table] Domain=LanduseSmall.dom Columns=2 Records=12 Type=TableStore Description=Representation of land use units Time=991346400 DomainInfo=LanduseSmall.dom;Byte;class;12;; [TableStore] Data=LanduseSmall.rp# Col0=Color Type=TableBinary StoreTime=991346400 Col1=Pattern [Col:Color] Description= Domain=Color Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=ColumnStore Stored=Yes NrDepObjects=0 StoreType=Long DomainInfo=color.dom;Long;color;0;; ReadOnly=No OwnedByTable=Yes [Representation] Domain=LanduseSmall.dom BoundaryColor=0 BoundaryWidth=1 Type=RepresentationClass DomainInfo=LanduseSmall.dom;Byte;class;12;; [Col:Pattern] Description=Pattern Time=991346400 Domain=value.dom DomainInfo=value.dom;Long;value;0;-9999999.9:9999999.9:0.1:offset=0; Range=0:10000:offset=0 ReadOnly=No OwnedByTable=Yes StoreType=Int Stored=Yes Type=ColumnStore gdalautotest-3.0.4/gdrivers/data/g2009u01_le_truncated.bin0000644003401500001440000000006013614004466022700 0ustar rouaultusersD@l@??hgdalautotest-3.0.4/gdrivers/data/LanduseSmall.mpr0000644003401500001440000000153213614004466021477 0ustar rouaultusers[BaseMap] AttributeTable=LanduseSmall.tbt CoordBounds=795479.99999999988 8089020 796979.99999999988 8090520 CoordSystem=LanduseSmall.csy Domain=LanduseSmall.dom DomainInfo=LanduseSmall.dom;Byte;class;12;; Proximity=63.700000 Type=Map [Ilwis] Class=Raster Map Description=MapSubMap(Landuse.mpr,1,1,75,75) Time=1201538962 Type=BaseMap Version=3.1 GeoRefChangeable=Yes [IlwisObjectVirtual] DefOnlyPossible=Yes Expression=MapSubMap(Landuse.mpr,1,1,75,75) [Map] GeoRef=LanduseSmall.grf Size=75 75 Type=MapStore [MapFromMap] Map=Landuse.mpr Type=MapSubMap [MapStore] Data=LanduseSmall.mp# PixelInterLeaved=No RowLength=75 StartOffset=0 StoreTime=1201538962 Structure=Line SwapBytes=No Type=Byte UseAs=No [MapSubMap] Corners=No Offset=0 0 [MapVirtual] Expression=MapSubMap(Landuse.mpr,1,1,75,75) Type=MapFromMapgdalautotest-3.0.4/gdrivers/data/r_test.rdb0000644003401500001440000000063413614004466020366 0ustar rouaultusersRDX2 X   gg(@Z@^@`@\@\@`@Z@^@\@`@a@`@b@`@^@^@`@c@`@a@Z@^@`@\@\@`@Z@^@\@`@a@`@b@`@^@^@`@c@`@a dim gdalautotest-3.0.4/gdrivers/data/missing_resources.pdf0000644003401500001440000000313113614004466022626 0ustar rouaultusers%PDF-1.6 % 7 0 obj << /BBox [ 0 0 20 20 ] /Measure 8 0 R /Name (Layer) /Type /Viewport >> endobj 8 0 obj << /Bounds [ 0 1 0 0 1 0 1 1 ] /GCS 9 0 R /GPTS [ 49 2 48 2 48 3 49 3 ] /LPTS [ 0 1 0 0 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 9 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 3 0 obj << /Annots 6 0 R /Contents 4 0 R /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /xesources 5 0 R /Type /Page /UserUnit 1 /VP [ 7 0 R ] >> endobj 10 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 11 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 11 0 obj 228 endobj 4 0 obj << /Length 12 0 R >> stream q 20 0 0 20 0 0 cm /Image10 Do Q endstream endobj 12 0 obj 33 endobj 5 0 obj << /XObject << /Image10 10 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000001191 00000 n 0000001250 00000 n 0000000445 00000 n 0000001012 00000 n 0000001120 00000 n 0000001172 00000 n 0000000015 00000 n 0000000101 00000 n 0000000246 00000 n 0000000589 00000 n 0000000989 00000 n 0000001098 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 1299 %%EOF gdalautotest-3.0.4/gdrivers/data/87test.img0000644003401500001440000004133513614004466020234 0ustar rouaultusersEHFA_HEADER_TAG@ R5G rootroot@IAG RRBand_1176315505Eimg_Layer@IA   Ehfa_Layer15505Ehfa_Layer@IA0 njMap_Info15505Eprj_MapInfo@IA vWorld_Cube 0PrW4xkA 0PrAW4xk|E3A|E3Ameters"XProjectionX5505Eprj_MapProjection842@IA `PE_COORDSYSNt{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,coordSys,}PE_COORDSYS,.MEPROJCS["World_Cube",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Cube"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",0.0],PARAMETER["Option",1.0],UNIT["Meter",1.0]]PEEimg_NonInitializedValueEimg_NonInitializedValueIAs/;%UVQz0&,-4!D 1$02)$ 12|.'Fhe@lSa z(\sǟ fRn"5Bn=C5Z1+U)8,32;NXj 0()'I )&_,5B?F %o%A _C G2  (  P  0"2 * Descriptor_TableedValueEdsc_TabletializedValueIAsx ]#Bin_Function840#dValueEdsc_BinFunction840alueIAs@n@UUUUUF@4@2@s>LTJ@@$@ackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{768:Cdata,}RasterDMS,.R IMGFormatInfo05ImgFormatInfo831@IAfO 4RasterDMS15505Edms_StateIAe { IAss BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.ss @@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@B@B@C@C@D@D@E@F@F@G@G@H@H@I@I@J@J@L@M@N@O@P@@P@P@P@Q@Q@Q@@R@S@T@@T@T@T@@U@U@V@V@W@W@@X@@Y@Y@Z@Z@[@[@[@\@^@_@`@@`@`@`@ a@@a@a@ b@b@b@ c@@c@c@c@`d@d@d@ e@ f@@f@f@f@ g@g@g@ h@`h@h@h@k@@l@l@@n@`n@n@ Unique Value@?????@"@(@1@9@F@H@7@7@&@@@@@@@@@?@???@@@@@@?@???@@@??@?@????@@?@???????@????@??????@??@???@???????????????????@???@?@???@?@2  Histogramion840#dValueEdsc_Columntion840alueIA\xHistogramParametersalueEimg_StatisticsParameters840IAEdsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.]ss BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.ss @@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@B@B@C@C@D@D@E@F@F@G@G@H@H@I@I@J@J@L@M@N@O@P@@P@P@P@Q@Q@Q@@R@S@T@@T@T@T@@U@U@V@V@W@W@@X@@Y@Y@Z@Z@[@[@[@\@^@_@`@@`@`@`@ a@@a@a@ b@b@b@ c@@c@c@c@`d@d@d@ e@ f@@f@f@f@ g@g@g@ h@`h@h@h@k@@l@l@@n@`n@n@ Unique Value 0StatisticsrametersalueEsta_Statisticsarameters840IA\\StatisticsParameterslueEimg_StatisticsParameters840IAEdsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.]ss BFUniquek{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.ss @@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@B@B@C@C@D@D@E@F@F@G@G@H@H@I@I@J@J@L@M@N@O@P@@P@P@P@Q@Q@Q@@R@S@T@@T@T@T@@U@U@V@V@W@W@@X@@Y@Y@Z@Z@[@[@[@\@^@_@`@@`@`@`@ a@@a@a@ b@b@b@ c@@c@c@c@`d@d@d@ e@ f@@f@f@f@ g@g@g@ h@`h@h@h@k@@l@l@@n@`n@n@ Unique ValueASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,.gdalautotest-3.0.4/gdrivers/data/invalid-subheader.rsw0000644003401500001440000001264513614004466022525 0ustar rouaultusersRSW@UUUUUd@N@tLA@A@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~MTW     @Y@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~dRSW@Y@P@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~kkk{s{ksssskŔc{{{{s{ccsc{s{{{c{{kskkkcss{sccZccckkkk{sk{{c{ksccck{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.0.4/gdrivers/data/bug5291.nc0000644003401500001440000001477113614004466020024 0ustar rouaultusersHDF  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@O9mWIâG bcѿ`\宭bVywW  bbak4* l{ImUhpb{H*O 5 ^* :2^6 \m?w.)Z#9UeRJ4j0DfH7Xة=EX(Ctf7oA3]|3YlT%7mh6,¦ ;h86;|'-E`17ܾ[71G`˯P&Чo3Lůǧ)Hs kZO{GNh!g&L#pl]QmzD=![]#\%^p6)mPm!Eކe% zȽ]KI~ mQ9pk$`Igs≰l$#XzpHʥѣE >6h*NNm3BYU5eXx*Ed,iL*xU;^o5WS,@7C]Yho!ظp "{H[1l}SVnJ^Ό RCŮp%dOHw\@+F;&7Ei?3%`/6ҠFs\ͿR)6D Z,D/B"xﴊmD;~'\;Whl+0~R2-gF*o+^w5 PP|˷ 4G~735·hGRG`GJPrʜf){0'҅=\DoxW +QJ웵6)BDDw~-aZ 0Rg:%{Ii-xgfW`B)FR^9qOrrk ] {쯿܂#jC$ w&d8F_{+w/NȊB=pTq!/];H*]؉H9-_+2]ݚRrs(F ǚ]\wp\~A`\K|nW! 8;uߐ*h,3W;&8k ڡ+ #4( (+ m: &sc i$z)zLh |cA{ÇPw3LrZ{ʉ]fu5 7 #ılO=U`}1Rѳs sz;3,C>LFe_3x}++AFcpc˳ Ǟg. qˆ^"1KUk6,0u@dhI…# h+ j*_Ȁ= ^k,Si ,F2D, lb]Y'R:P^<ւ4mlMlB*œ/D2ݯӣ1IEA/µd&Fuc!W%,eZ(~3>tsG9!Hr]o3LN/m 'wvNBmm$߇si*ERB©M-G6A !/g Uw?֡6>v{"C,6Em]Kb\mU_E <%fv}d0)4~]ԯu-YjKF)?U1-tv ^C4٧a5*k)e_ZS6-Cg@qh>hץ֦gZˊA|;R&$~8/5Z ף;^:|zIE5A*}wuG0)T*(oi8/'[$;NCV̘_A$ܨu"MaHbI.vzjanDExp]0uYÝ83cnjEF?(7K9BnUYmAo5N*|(\3"UhJfZYMUQS_G;3'a! 8I")o66[Ϙ#R.t1ԝ嵈'G+gFd+ci=nڳ}z$ZW ,\by=Qʐ1`V ;k`3]TskI:$蚆y$@a60o `+2 z4;-|g>k=Km=ymOޝ4&BeD$S=SkqżQ;&LD'}T0DL7eiMs{c.^E[lYWUX9F+jhX| 5jVGv &RW +- FNP~ڢDU5CT3"{FŪ~ Au5dVa#ܻCїq06K(I"F &0~oYxF뻶dth ΎeS,,8j R*\rO!5ŭօIU^!Љ^ڐP_E^)=8p­QJ^MyZWh P=|rp*|&Ri6 s/T!+;rGϪ)c#~פ!t r}Њ{N >R[=>ц%;;uTK<]E[DG~0O'4fy[ ~6 ?6 'jT=O* 0ݻdqmX bDͯ£ornC@/3wwOvE慂Rbvud?rhjm{E3r|%dAQҥٺ%Q` njpek|[ G~$iAHqM~d/a[/W#H81D8o0@؀KS~QN[٪lwU' EM|ir^(O<f~m2p?|!r˂:OTߤ0dzb\V6cǯL =y #@Ko DY:.]΢ Ƕ^_VdWur1~2D9BU,y/1 >*+IJFj <ӂSKd=%LW4^~A,p(clot][d=3@i[c[t9a { >!WzFb1Λ`G_4[X)bݾYړ< *ʌct 'c*iwB?mJvZH8IYPώɃuPrbO ,V |5ǡ-_t3CK_Q^,MH ,\޷%i4>sj`<둃ҏ-anޞp|2GVyKcӶ n6 )zGjqlˊ v. шi +WRYq[ma@ VWj" ƳO}'+ +e@g~sCg}o`|H4tFXEsa>:F N(!0ַoZ蠯)|u9oUhYi\wɹx}A䭓yIq%LzH3_*E#.Q5aAvEn{Tm;zQ<:8[S(1@X/#Onn.7wv\p-BO)%/v>f9`*dUFK kA)B ϻD>?Rx@|]+o1%t=3RIʪTܫTi"X|;HwB E?vQ{~*{s/ݧF(D "UZ' bPy kd>SO¡<׬ۖx$PEA1( c¥z;/' ¾D޴.%llMGs8ݾvVS8͉ 7m9<#,w!i:3g)Ё[!n,.qFr'-bY SҿHn.,;P.M0zbqoD-lBsG!_|)t0NR%o3tKZ?^jې\uh)6jjo?l|A"mi]I 8+oےQ҉<_wDՙB}dCjbi8cPCo LTI R Ȭ0tGv(b,8E#$T{e2xAoRDA[d:I2Wxϴ/8b`۪gtqzcھ~*rJˡQ3&vo9v۽2c0JWDN$^(glEڦ6d%΁7/=n@~e皥#=M(1">fDƙb}>{ZoC2 CQ]e0Х\h6K#nGǛl &_h [8_+WF(^."j2`(Si *?#qSm42f(qa7\<8} <3y,*u \0z7| ;Y I3,j6 1&Lѿ󂫞%rR7p r>yt E pTf&ev7+- `P+no!*<; q޴Sa [cau1=<%`ڏ eH7\YgC9{SmWEqv'&tHVPIWZgQڋDxI㔾Eq DT r~0B6? R~MdZF$(/eC1y!_j+TlF鬒mh0e0ePQ jbYTuyy1ljdwpbsK*J0SKn̡J#ʙÐGh{'Pլ!A}M C@<3WIyؤ]MJ 4s^ S/[Fpv %P{G_J["o̮^U|x,{QSЪIO-~'wP8z u^B2֎۱r{,"4 w<.ݕS}*)Sz; mI]m+VoK3 hPʹ2=ʸ+%#t :>BHR}L~WLf+_ciU,[QeRI/V!'*-,h<]e ~t#9LXz.,жf>u&aOgJchGt޽Xr(q&: /(WrU(;8Bt&5lcR,iY>+/s3s (%[T82)%Lz ɹɵfJU) yTx7^^m/%0Ꚁp~[ߖ0!n!_h@۸ 7C_]IgF D[$PZ@y0ݒ 80:zaaC $C|g,ܰ>(3x`?N?; e2ky6.MͲo{UL?c1jHe iC7֎p`LLP55mjvge <D=,!H>v k?8l@Ah`j@2@ A,Ż>EYt@3GXNxL05jjO1 L+@f̅LnAD[Yաn dJÎ|MTcaujIF\BE@ht,ЀO& EA<%vqu!Wb6!rp&/o1  X~rf88}.84b/cxrKWpAxW`gZ2l& r"mTTH **?h shܓ K@6(XXB#Rl?  `8N#g8O }zahI3y` : !13 gPe -1Ȁ%}&4 [pmG s~`23``K#aC2V?D 9E{"}vC UèDCm!́gF5 4Hցw#9o5 MHsKUZ3c$M&zCK)׈OzA.!/6⋼Sѯʌ==I?k:L%8oq|F@Չl+v]4Ya{<*an4 PᗿL?\`OṞH, |NɁ%֬x^W`ur LVٵW)nF3I:Q qm1q(+ nlEnp!|軹 IZo&|9+@ 4Md,rǤ8uox b#D_:2r;̚IG)ibwIJByB=eę XX/m|1!]]@tnםxс6OR0ñ oo=U%PFir/y _ʢ@?S,. '6GE?/x$'L|Kʱ6R`8؄;F6q\ *Xޡ1!媦_xb?-w1CVXCƮw+83~pX߯rG|/"I%݅M>;ו@Ŋ]?@]dU]Q2X-KDl DG[JtHT`qQڪ=q5 -kx oSMZzo6x_B)w%}/́ͬSI(,힯ijPdauOA·*WZCY[vM+Ae{fkzr%!b]:qMBQ@3Q1 g !>&+M/[,ey I\MMJDOcgId=҉ JSr_HB~Mk)%X_u@^NC݀fCFN& rOol^]N|m\u0wE[|.kHUd=ԕ/s;?r6Y׀DDEE%bjw}Fj*($EIsq;JZCq s^w콗250:hQ{B%%8zDS;$BD&tpJ^K@xF]!mgFbcEezA2' 6#R&ʄ6F%Rb yd&$EtP.E1RlDȈ+ c*wx]iq"`C/*~4&(R38oV BBzHSe B ,$F]]|z G "P|XCGCB!3l#ut<ttjF1z N0eV{ 2C1)MHiao 1EaA}Nxl %E<6.Vz A8C'E*=H?5Ve})H>8,/BҌwBI D܌>pnFA<-99dFEI[PF [h^-7r.N~׹-?F1<@$x"@ B5g/ { bbb @ DE'n:*@:p 0yvY'pDDS6vv9qp=59b{zd+3K‚BD h Ҭ}b6žHE*F|->' ,`dLF\?8|yH8`OF4b.!sR+^MOgw•>@U>wW)yY!&F0) n-ܝĽ | ^`XVꦎNE9,D0BwXF Y 4%H>"sƟ@H » A /Zxأ]@w`\kCh!%Cܘ/I!y)zW ʀdbPґB+nyAgUj tهjsUxID VT& EDu4--z="af՜ m7:y͢9B>ogiF.).Y7t/0 L1$'(P:F-ȕ% Dbf0* `_^7g);{]pB* ^if*c94g&+g)^ 3˕Efà`4)W9|\>ۖ._F3 02CD7uD3n]a >%ɺBJ"yc52&-@)OOΤhZ+m,B?k*XG~a!Y4^| pR,2.. TҳbsEQC=@8q6EZDb`'+`YD :͸}FjΉ:н[_@<䧢t(#hHP@kr C'CuUF \C[aFZBXB7 _C>wD[ .TC*|,CDIsD\ hlM _Cj"rBA8 >! <?, > 9:<<>?'gdalautotest-3.0.4/gdrivers/data/fema06-140cm_2995441b_truncated.dem0000644003401500001440000000200013614004466024105 0ustar rouaultusersu299544_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.0.4/gdrivers/data/PRF/0000755003401500001440000000000013614004466017021 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/PRF/dem.x-dem0000644003401500001440000000300113614004466020514 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/PRF/ph/0000755003401500001440000000000013614004466017430 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/PRF/ph/ph_1_1.tif0000644003401500001440000003257713614004466021221 0ustar rouaultusersII* IBCDE4S % h`` cP@@@l4  . @k3ͦL, 8#P:@/6p* H: X=pﰷ <7`pX<& bqXf7drX.ШQ|^B!QTW.0uUK+1epۀ7zc ( C Xt"LO(NXl`u k_ Ç"(6 @,`bNCR+qn@S mI N X` * 0TU o3,ʼ@s 1̓,3@ (BAC@Ѡ! ! 9oY&7弗 E2Kp8 0 +B;IP`+`+TʍZ~4KtURU){ySjdO $ ``Ղ Ʒ(R5)ά<9+<46ALGOr.؉|PWg`ȭY2(`Pk:D4jc]u-?Ic_[/ :,xݷ+(Ap{?Ψ+e՛UA"/ qɣmokPAOi{) RɻPKNW`lT $< %̠2F3#$dVpj2FVgəoH8դZiHJ@1868z9X\ߓC!$Ԅ{7Q"G3Q0GD@;CK; ػ+>+ZKU[kiHƐ z_;DP֎4\LQ)o6ј >,wkMY$$Lr~$:#ؖĬK9z/GKi?T&P.ī$wU9;`핂(B)#lUyDO VmyI)%R_Ӫ~&>!2,iY(d!8)!!h IU,XP%(6xKIT먄Kʨ=.\7~RU0 p/c(>Dj;&-2kP.OQ%|(.Jq"x&HDd+JtN&\VĨa#ba*9'zgH&Bl6BPe=c% FtT@dF qgPȰJ2DWlB.QADpgªZ(4OƚB*"29$$dTf>,fa<^HNl"\&Ȕr@I(x7".$tcJBJ5F5%~U"lgOr+hU"\?\#f(#fb8$Sb&.rJ(B%(_o_) j6gOg|)@Π=c8$J[#3&^$|6B`qu Ę'ȰPc.ð%.c%RT;H,#c,Q)_Vt;z6gN<% rU< $,b'$elWb%6ekdL+lD"JPrPF7\k&{Jx.%S$-3gvu,?Wֆ 7]΀BFkXUcVt&]B}9DVlf#t&nPĊ& !pE"lӆq$VbFb_RkGX~wh(7;b;bIU{PcfVƞ (\P]Qb5"b%.C#;I,wxxH_xeNg@+2)ÞC"$c~&¸f\b">aFcJ"=VbC,el.BBb"|]RJC6J'\%C'`VP*F7 `W&D J7IJBʼ6):)J9t'U$84fUdB€B>P+>%B:pU"C#:(P]BytO-8&=MDP+~\F%YΌC9":kcPƸ$#-C(X:<=,8bBPc_Y tzt#~&FUb.-ðnDFfX9f7iFx+>E"`$;7)΄##7U%%:/,<,C-€X8%V;V ru6t"|*rgB`t:}AZU"hhE2j8#[BMD9:BiA"F_Gc |ZnU#~5eĮf"a>>kdt' V$CۈJgBCZ&BhQgR+MF@H G Rf]-LDh<"h&vr;>ite.q%$e|^G+&S0-n>tܲ; dP\ö7 DgaPn[B2MB :fV4[0rˋV07xCW-<^$8BßfC 0P,G@QU"XVɀ 9'7!8:f#t(VDK_B6׶J9u"<ѾB.€,bJ*%x+%r#ue]C2ii+. o.8,.H9ɍN6ea,f"t#B.<-eģU\=n#F%«˘í]2pӹ7fJJ$ C$: NF,r,F#`;\*.ſu-LUet%Db#=?=܀HW*]FbV`cDc'V#[]#E7J%1rn^|7ɲib#a} ~7*Iw6yfD-#, 85F\C+R]C#HI|fpP\`obzfo ye51Cӥ鼢/ 7/ˀB&öQ1$@f^-Bl?Υr,bY"nb#aOޜ0&~%Er i$z9d.#$29e'\Ŧ&(Ye 6C>$f"D.2gBh+7 d8&"W-͈U;>c:.}*^؞#8ii*DniN;1&[E&5Bխb8b{q"`>qQYpдn6\CbcJDdJ6R_&ZOcR9$ߠ/"`VCyBaIV6RfaaӐ`n8"$3 D<05=  Y0@ uA%ITY-Ki5My=, *,"P(x`hc`8y `o@% d5(sPtY K, Ī^&Tp39D ԊI>myoE$:Mˮ@ @PoqZNgp߰`$@ E]^X; 42 wQwz*VHKB#p:h6;CCDmtXh'3:HIT(? ) B 0 + 0.*;3GP:m0@$p<C$?OA&첺Os&g,tQNO+Gȋ܆9c̸¿Ԁ b>2P9^YNcĹ5kCsm[vo7k3ʚ @6]İxԫ>V80b2-/T2к.r®zҳ$(ʻ|",z  {^ɽ p|' 7YP%5 dwgĐHr0T hUX#/D0oCł." "Ors%ొK`)f;B~% $OhdG|G/-63+h < U?cfl!HJ2TL dY!LRm#uE`SK/PTKJV#렯ʩWl%ص[Oo. &.P;Gx🍑02g@Ca@|^)UՑ\`3EFa,)Ď6k V)0$fN"lȩ1 +%f N'ЧXJy_ _TO2Ʉ#>y6SZ%3XkcGGYބA!eHM6T;) jC (D] t2@>='а@:D%u4#f0ljxZZjmTR AMH6)4rJR|Su(E!ZX cE )%*#QR4'P Cb3yvO7FUEm]^Bc(x&}(j)0EHDkf ”j Q!EO@:yJ+Z̺oGj'hJuk:2\/;ǎM5*:3慢W8q7aH2D tqR\u-I+.ZKYYD1I4g QJƱ=&LGSÍ􍑜xǺC("hdj*69vФ):H̐S,c1=RWE&db@8ϠC S"='ɍaoeƫ\wCLS KV|Сí]$5vSI ~G}LsVL@PTPZXTJ`íN??;lp0 p4FY+Kq䢛Gqt. ްqM2@ЩYh1oZ>rI0z]!M:i&Yer LV)x_иa 2S ;?.H5,zrrR30[>h>^!Jl§72A{LOrQd٢x&dtG  `u uVcRCQy iVI0 ^j_ ª)jET44GX P D)Wk7a^r{Вk/Hx+`/I;/H qE/LUE`4 TRKrB `@Au^V9}7;Io4a PZqz$K&]Nx̎?rY /I 7݀j``%⸹a^z7 cis&RЎn7b"9X Xj " Ɉ̀CΎ1IN` # )׍PfYئHEYece.o qs퍙qn:tݦXmЭݬWXRm}G1PZbZc@>amb?no?8 "q u`ÖY(PY.!G,؎1= O 1%-fbK&vvk >j8Q a:` Qɣ5+>MIQ%/Jak.H/I18<멩;Mm t'A nPi`R7㴶-7iI)! i0ζ9jDEk@`_faVLNnށw q j/F/IbA>A @‘q^VR j~bU^+ҫe p܂a;6s TRbAd !p()#AXbh1j$ + wfq<0ٗ8eOYO rȟ'6guq Qq(٘\O,!I3Qa'pC:`66OtV%s:ЌIbfgdYVQ-t >stLu@RqQ.-c:"j_fa=!h q p1 WQ:Jvx/M璙ٓq2wwN뎰cPY]ap $cW.3p\jӪr r$`v j#~Zgvx'2K#~WQX=-- @HJ@V0.,DDZCW BHy ;@'er|g5gsR( PEF4 ٴlTI5;9@0k7{~jPR@P"pT.wq@Uy01@9@P <DJNʊ;jҩ)L7g ?z@|NcT$/Z:  H %NBΧF`N!H(*N>/Þij2<4SZGXFS`/ꃔD3Szˆڇi-ꤽ Z* B9 xBҬ+Kɀ ذ+Uŀp<1EnSe`V` @KZ^P U@Ks;+Sߙ 7% =abU2S.BT+m$ 꾬H-qi#ߖ`\4M%X9 AeQs |Z ~a g3z?ݪ7% b;jSb;l U\xJZ:}`?l(PN=[4? 88')R ] ľ5YZBLZ).RNPK* ZV\ESOx`I^_沶Mo@DـeMB+1k%;*R?$z殫e;N Bziw.nؑT}1pcp. <5z0=f@țdY&Pc8D0 BA0%zk~WL ;gdدdx {=)5(bVK,E)-bRڴC1B.i6Ƙ%od6D;|9$\Z(w0Q+gPR쥕@Lωd7,zgmVbd*콕I,(>YK)%̪WN[3#AdiF@&IPS(oZ;YkvTe2٘ NK%,w 4LuTjM/edB_E-gv+` .xRה'-uh^4댜i*Z ]E[nBO":L:E$]; 0 fUƖF,[9T0Lfe8%@S#!Xk x, W.Ha[>ƋZGm{ Vo䂱TW?1W{nj0sl6f#ꀏR%m< S] ZEZrdg~@@,츤\|=u.Km& v4oL[a'Jߠ37x RHGmP\ʲMت}0dЌeޙu߼x*\+E&侀I "dTT5y%GKT5!ʲ/Ԭ&fve+1,ƹC8D:G[}{)L"` A$NT$-2~-VY?+R^?0%02a`k!R*j,touGi~P P#P'+/3P7;?CPGKOSPW[_cPgkosPw{PЏ  P П  P Я  P п  P  P PPQ Q#Q'+/3Q7;?CQGKOSQW[_cQgkosQw{QяQџQѯQѿQQQQ  P< gdalautotest-3.0.4/gdrivers/data/PRF/ph/ph_0_1.tif0000644003401500001440000003336313614004466021212 0ustar rouaultusersII* IBCDEU6S* D"@zx@@4R`yv?<!0l AMHv!I X\l =`@Hzց^C ] & bqXf7drYKC޹?g$5CYNe%źQvCp#3Ei:f)@ LHKPbܶ20<0 sA;PMC}c#Cߪ޶.-,6ap~E]c q{n)bα >#. :fI:JSy!Ml#䅘.Nʚ7*Tĸ~2:`H`5VBXM jw&`{f x-`,UzIu9=etbG@Eb72GA!h\Z─S-He<2TGֺBy"^GXOdveڞ[U&`q؉)T^ -q #MB .D^~:]&M@G֓>RzMD!Dl^"KuF*ޯ4" hޭ)I) /Z;&ĎFw$g|$#(D /@-.oPd"I!Y- o}`9g0@m*#za^BNIZ#l#e 5P :bpϰer"B jB<")pǮ$T0&!o gJ5=lKM̑=OBn@"N,oX3&qP!Pw #v"HR'p~n !)lh'r(x9c&ðZn6Eo6E4"J{0bo% Dyb>k:Cǟ%5&M'$Rw!R rdl,O/ppC*l*TDTf \:yeZ0#g~`3n Bke"! K&δ Pk<5`<Ї6SY6P O73lf &c@)`*&Er GM#xv^agID$#l FoAL k̞O"=sD==%=zH"?4dcl$cvx*c0B^ao3:kgl3]$Ǹad :%4*O2C1y!J 5A=4QD=D=H8aFtؘB{ü(0 % o"B $DbZt;ޤcǨ^fF|Eo%Z4P6HQ|5A==U[K=!U\@z' hc(tpZIpw% u|TĀmļC+bw#{$g/:G6Jg?Z.$3MT2S=N d6pBTD|G%0:Ee@ad7]'G>``ETCv]Pk(\7$7FQtB\o(%j4Kc=T3 "#kw8o>Dl' bLv%,`@ `b'& )x b7PȘM`0#[ƶPB8M,.1reZ*;|&P-'ª` w zw%(@> b(Bl/afxp[p$l6\>˝>&[4>/ WŅeGx:Ĥ @   =#:$F,G@A !4!!t!X >i`%$EG {LqK`ahpo'pzf@Ҁ5".xCLI[֠ɂ!υYXwd C"^GZ ` Ĥ=`` }B/btD;p4k%7*EIpIxaDo$\JM\"<1Lw=7+[*"$@!HNhF` "m F"}l%   6/bu' ;4B"{7$o$ۂ4r1Ch/%SKO%{R"2dyyHSMR axKCl p#s>3&ٚGc+]WIOgrE^[B :!ozr:"]&x $ (Fh. 7cQ?,)nI:r 'jDx)0%d(ZLtKLJz󢉘B E DѦArw##PgFOdsBNa ~&=:@s6l0dT&dgfH%"^h"st&-~V@\I&d44hż&Dyq1=#%Dh ۲3% :lE ;FI($bkff )^RGZHmz} avϦ@3>"W CEN<5# f#2(^EQõ;9]qD`\$%[C@!W|xVk*TjB GF:Db*+ħIzjKaf`k@" {K[4yPMF߶\20U|a k&G I*fohf#>flUOv0$;CZ'C  7sIÁ]K B4F$%Z$"˽<2"/EpaZw_ ҧ<0cp[EZf2@f/ W 9'=vp&7Ș{rpĖC%"cEi!<5C&fA?cb4%^Q׫XݕKceO \wa$B<}& }.$ E\afnE&ְ5\gǃEܞH1 +7@Y@9cFmROdd.A\iYYBЀ ݜy9]w#B+̱ E#>keZ@YYK @"y0O t%bХT]IzIbJh[q$(r*   ݁+&i瞀|HEC>AP@<A\ X%Z/CzTb fc_R BtFdnJ+Ђ(&7t ()ĒfJR] ۠FT  aV/cO)eAg%p&AI^k@''+` `7 p@3@ /'@[8 8D; @`f%c#o&2KJ /n)s7 Cp;CCDlx `@ րDx)Gd%Q7-8* q#-$icUX r8`;%[&Hv P @w7` ,L :nrWZĔ3MSt;OD!Zhdn0$ B(%@# xK%F""L:N^iKO,CX ` sQPpRPѐ.'I`x& ˚U42Z0ُ8&j&sbDX3 @ ܟَN[)}*@1<3PLwk&`(\'{M"νP3ŃlFӵmp'/(:%En h   t &WrjK,ƎskIjkD> T",'՚_+:ϰE'x.Dy}jR Z@ @pr@ H`$X+!8!+6q%\*IH?*7HJP'(nMЊB+ܳSaz*!ݼQ aT+DKԹK[khE5[ EP@#Z!`%į isIvrOVZ"HcY]j@/14$ `FB"dT1)BR􂄸A0rr<n,@5?*`hD @# &!y%`1<6тy #fs  ^u ޡ@Ai:gTy pMW /r<&"w2aA `]WC&`<[BLEdZh3HGY9SeJ oJy:`Bmۿ/!ˈS3LL|O6[,q `EC\0Pǐ: "8҄Is1.!p1l"Fca iIA,'@V!bԪ0$p4_J5@!!q" v \ gJe8 4c&L9Wzn8J5R' QKi~!9s_s|L#\wIgj,כI$)wM$@N!8xK OmAmu'@WsvAǴz'm &ExI,U|Cȑ̛vB;ܺ [^IT.u $q]-C5&xr>b$!w1t0THPzEJBf] @ȚWKYlrq#%IΝ7IΓH=a|c\{GC@!X,! Zo<`k| i2AJnq5"]I.DV1'BIRenv䄔#[/EւNb.70&dA< 1sp`PǬ| OX:7']K9u.?nqaQO> nIWGj%^{h,,?3HM2R4ՂLl`07Cevksa1zF;|lR]0GU!3wǚ`y׃sÏ1ygifɪPz5L 2׮`x+ubA0dfQMs9RF@<)+va: eS)_|e$MD3tj9,%|_Yz/ACF/ 4 nK]i$E 5;5ڻ30Ɠ(I { >k@ q0pBqJHyT'J~k?k yՅ:J #B L DI 1 1e>%e#(Ƞra ;&  F +_W1s(:hQay&[f(bfvix{=$( IkT1LU R06؄۳ i P ' W'-fFX~ X< DX b.Ys-!$EIE\yGƉEh#p ŻĦdQ ` ٢ى|d> #( `Rb=|7"Dy{/TǤI8!;øQ( i l6933{j g{9(ԋ,c+pS!69+'Ȏ 1<&IG 6*0ie6Q3@KD{-%#rH %쳚͑x: 莠 dK&LCd˖h09x8d@&pj.y&s xԈԱY&.բ>L@A x&I2,P\$*Ќ0񜛴NLX(؎qR (2% +gK-ڋY+ր P8`c>`1R`"45HU RU,* n½lKh x09iF:j.ɘ(I3$x܈Z;2\KYKҵN<l @ c?49X:8 6y.b\׈l} ja;0+5UDȗ`[kCfxRp]X q7ax 2$^0a؆:KHH`;<@.gzL>ɼ8 0  x;e w+; -O!KJtJ}q;KP xȑЎ"iW@), כ˶ibpxH| J9q3;#| xQ8p>4ZXYE2<) (?i&8Oa؃LӵsϿX8YV6\x ɠЛ bla!P }N$Ȗ[m/{ɐ@헂d:6 y[9# *3XI@li'Q@.k3n;E!2CG2e)fSpԦX{Jݍ,/ Ȑ#=MM䌖,cI'.%i%=^ Z_JhIa I< ĂhҺB/e賛_)蝉Rфm) :!đԮb.5q83ba& =0ЀA$Z>Q>3!+&MOX0a>$`HP9fMɘMJ8٢.I^h1^# `b33@CJAbѤ 1 E&)R6[!lP ݳEF>R׍ M6?icи5M=xf^-dԊH蚔\qB-1ATX F24 ;Jp~!UM m yfXd>ϓh& ck ,)-d~N.&MLԒck(`$ ~ ',`Xeؐ9g8H8!`OO&8"Mzi5s" I3A&ZPʍ0T ` !/< @sJq iaдbg.pn&Q5 6fh.3|юP-PQ,ۘyKB0Jq| ޿ڲ؏2<Ѧp%5y %يUZ.1)I;\=ؓ 1D J/ /p JaI2YKS5 {=.`&8nϴ?LSe&I72X4ѻ20RDH֬x grO˸SF::8I4 "ūb&1[nzQa/%ș!4dKR2g6S4xI Gɬ?"tNbe$BNmi+_'- ?r8*0`񎀐Q)015`KB{;ICt'b܎4p%C#@g ʿkW%L`i.d^s=92 pc9 VsU[Q !Е@X1Ob);D1i(Dlb~6DR\K{KXإ'E dݓ,ػiG0a7-SF3FQ!5LN8!JYU, ~J6}܊xHZC ݑ[=mJ縑뙝H|疀 8aR86%%-9&xX7FȾK8+PYJMᅗQk L>_?|~8 %1rx1qMI6։>)T RB6'Є.ҔT9#`/]`+@ CaF%Ebxf5GcE#Icll畀 C2 X % tf@& a% TF@ @ `,@ |$ W.{a],lorR 8@ l\Y6Eit}FUeN@Pژ`48@0V-,_$ &@ Kpk ]owk+ͯ@ B_/n2 6Η@xI3m\!P) :dĜ5ګG!*)ʂ.E  D*F`*м8S:Ikjp@\.*4#V `& +{ƶ SQ, r'⼼/r3:dpeo+ϰsbToC&SdV]&Ҵ0јܵLj!P""E 0ī0@De,c!T++ҒW7,IMC<֫Gw:eYIL %IP`|H SJPpbN*G^&%^+ ̴̾/ ·=a'Me[;Zœ֖.K[)pMaiyyR TN@ Y4+. jfիβϳtOjy 7F,VB> +\CԵc6À 'UG  G0!fDE\8P@y$I{'IX^We;SN0@ɾO<9"Lȱ`sR֞-&#F[FPpb` uC0P('R`c-Ƒs"ḏ1d3\7FH sY[ ĭT%$4 6ğ8&  20"` >g a  0PgN4HlѷA/4ؕaVMm(&VX 96%D(<2Vcnߌ).<=4Q'iCNP]Iz}2,&AU8a0h.tM ;F}t`0 7@k1*Q3O+d3)2IfL}d!մp(XA(EkD\bP΍Z&:ǝBxL3$]C@v M 64V@p7:o W@ICL̄I7BȐ3ҔQx`=D@D2%6Lz:rn8y=&t1i\BtWbY;,̍cDyTIy6LbLIGH>S>>??O gdalautotest-3.0.4/gdrivers/data/PRF/ph/ph_2_0.tif0000644003401500001440000000576313614004466021216 0ustar rouaultusersII*  BCDEU S! P$ Ab H$x,t|Gf#=bR  n,HE t* 7ys3 9 2 PtZoW3<՝rUj͋4 +43 &\`6 ۈj_wvʹ*@ Ptz]>Wv{]wx|^>lq&@ \H#&q `I`lPdV@h*N\UUX@, rK 7 p $J<ԔLlr:굹42!BԴ/#$+,'/R/,j-Rr9 n~L!<&.һa), p~@A?N2DE+D` [ `9>pd:@QW,fJ7׵ډaŌYvLNS:Y6Rܬ. I07["ŪuH m Z7r0rx \,G 0Ҥff|YVBmMuݺ F0=?UcrӺJ ` LـI+ObCdPDl:؉Oı-NNs`20A&eXY1eR\!qi Ŗ#V+Qbc8 } Ӂsn,$Np_@ -I|C4nS tw"DXx@`JBAg'rj >3*Ϲ!$$wU]JR!ҊR  HVZ*1dX.5訴.Kv1k藻 EiTݳ3g %0&U{6ih,5bŜr1NԲVn9[+f-y1DGp!v'X|L)iSy"d1d*jd Ps9ԯC((\ VZZ)&@snŤcl2&#f`*J}бn[,J'`>*GX'V9_%2A+Ö' 2jEIL=DF)Dp,VAi##Ε(Jl' G7!X1e@3а'f- (`I-E%MjZe$nXY0j? $&bhD/%ۚ.3I۝s U(T"hB"Sr8GiDHMm-ɳG3<(5>UXO> [dcl\Vj32Ta[, TbYSJB[,Q&s͐Y!YMlKi$(=Y) Ul .{Q !@@bAU{zg$2"8~H@Nˢ} ^^WBO)͘K&U-LŷU FR[ f)&kpO'wE! r%2j )F&!H˶![/fTjPY !X, `ƚZh%Xh&`N o77o L@) d" @$5 zoI-@ H/@ X/6=Fm u5Lm'S:]>Wv{]wx|^?'әXYװ PQF"3Bɲv2A0K |Sm"nHM'@@'Xf&(i, d@ f01  ,X'2R&Pf҅-L3<4""hzǷMb͂י  mG%IҎ$hM"]3L=S 2G%A2TPJ?U+i>е\MD5M a%R0` 4 ~ "!#?#X"2 v*F $OSTi8L->M"6_ sD"NdR ewuJe晫(Ir\@,@.(U*:;:Z2aMk*7ZuD%S#PMN# %dZ 'o#*# :#`8 9ʭA $!PcdϾSާ**b3kNΪhY5iO6@g|Q~@rFfOkp-5he/PJB:oyz(έ?j6L)\LzK߳4cXn@@\<@h!A۳`ZB3E\(IHAaH(Gz>ELBTM9@l='TiXn> W"2!OC8w 2y:.EؽD'q+:?dRR1#'荫F89FH4lh)&xxCP!PD@4CPH$ l <_Epk:\hE`XP.DB&l50EDM1S^2H)p jvP(+L)zOXՉ,|UOa5#WOR*ghTr} Naɱ@2Ra1oPBܤaO|d`Vr49@ $ju3ylMd2LTȜ],+ծVbA C 22 i F ~#dGO} >S1#82)d .嵡 R ޗTd(#!B.M(335N&IS?)Sy@D d"A2Y yALnPCdl(Qtl5$4<ߺ! M"[ha*$̐EԱLl.KG2\M84 Dxt̠/RpFd9N!g\T&kP815m  / ,Xzsa(ϚvL+IsX*i}I5Fq~P"2$@&@1\ԕie0]p7!2ؗF:s!{I n u.5HL8Ba٭c;&LgMaę8heE&oS#1mݽ[vP.ʫ q> g~|$9;G띨rTXr'h +GWVDp]%Z$]Lt_+e2JɄt2/30J]˹78d;JA LȨ䇙9lw*-zrQmU/@izcN"両"aI }؍U5ΤmR(hbx>_%@ Qr+a4X JJnjt\TsFQʷſ&GWVe YOJ(YR ?I&Bb@V@ϛ, A5Jf )r;={>y0f dAJ|"1PJWHCkxv|Q9J%$n*`〹 =ܭOɝ !¡n~įwZg*K .J| `""9DcNj4/J3LTzh"cTc E3xg2tg0bPi(eg)8>PSbiϜ>_s"W fV?XL-^ڗ0b`(&_>>BT)038ph2g H`.(F^C(G`Odb&-cD)D£#4H6GbDZ*57v_':l M.1˨H#z)D"8hfzU (Fp=fSp=BV&f`B0"J+bDңr*$l*cꨨQ0b# B$G;$roL@&# w:Cܚ1X4DdcCZNJ"gKJjDBдlNQ1##Tp\_!LbPTPXz"\"U.L%rhD=B TF:dI$_ J Ie.ж"ʣT> *$=L$4H#$,NKT9XJ\@lbMU-ҪgZ@cPwfc#:>C88K]$pZ  ʄ+(o51s:: C/4 %UbhbgSB.=`2jW.%ƜL D[: K:oQK9J!C8i%%B7l<ĢꜢ:̶+*XmsHb3Dښ6dښx6 55<82 ./Ӛ*|춥J2?5/\9̪7<6D@D,S(>XTED(4zh|g'!l'Ǣhb,\(oi< J `H>3."bLU|%"Nɘ7Mh̰KtʄrvC4E>L#>bH3M6hvhʫUtԼ Z10&إNN]2 49CD@B*D8>%!^|B1td pSH)B$A$VDj$*쪮 ɘN^5)>h$@F*"Ĭ ^.pr6DL24!Jcn[- >E*elJ1D1s:dx)X\Gt]piD*`/#Xh0! z+%gcQ4SRd& B\hL#zLm<|(&ĥ!>>*b8E"cU-pJ5>`#(֍E.~Qm$p,f2B9C>)>5<T,ch3Pw/DɊ^I0؞Uk*/%/"0a$ƍC3%*", $`"@BHB@&_ f_48*QH8TMB`8*ꤌ.Hĭ.s~Y`0,J.c"O7dp8P7OCCOdžEK0bK\4kV{mO&X 7&@Q$)!E8iSؠa$0LfUXSB|Al%5s%@,Epb"MB76P$L$lJCHĶ/rY\JҩY/:PX.\4*/Ă8 Prj! 0l%OQ8POD&@D3=!D,>ƜzSLMB)b |&UYpRxg6A&@(O^B|īT]$czH5/_D~#:" $KFoP6_N'cD)˚4X7 .Gj*2 _qWz C]TO,0H+*|G2O^)n")]"MEY֔"-Dh0_C"!Bi%P5> \Uz>6D.Z@\LW%Q0cYd@O3>SL(>H̺[@!T@o.O.3LUT>P9Lee,>d$%ekLʹ2qN 2DPU)w%Dz+V@9HMD!U! }I@3EҙME\hx|*=C̪!t4P:*b7n"5T)!P/*g$Ie^̶m\.cr4B*B!,psD~Q"7,xsx$rY0)j8B"X%,CېbXV"(8zCȒS{TD*q$cLv(uX`{E(\h&# #r*^! w9尀JoKb.GQe5T%J 4v>EsC>HLJ|xb! iBudCCXg>8T[ǨUz3xd5nC*TB*Lb3ʺ 5%SL"OD.O`jTYb+%*H42qD"8wD.03 ;m,>Q#=at%F5.esT$.ʮOÑ*pxb rnb˲JP]#DzeX{ty9".(LC[tS0!Kɉ" 8F:5D_8%4%DLE'*\q4/'Yh2]#Gehp7ZH:/D<>m)MO@H2 T.z][jOUC$>")3E=Z4̖ h'U/wm%e4gL3Cr/v題MCJ!S4>΍0Lʤ% R%³.$]džʧ%/q*..KbJ֤'6/ 4h75YOmC(c`G$p=6,7ew@J0b>XlH&!GbV(nafg4G"z=pS&ʩʜb]5_CYMP%@z%MΫ$B ls *v1NJ(À: \$kF5YD$.1d)؍*aGh%>2@dKLJV2 0(jD@0.JA`& @T)%y=OEQU.MS 0"M@H8$ʇD X)uH`Hs 9p t c؀0iTLz qX@(0 v&` 8n@'ƀ_PPRI, T0@ ~/Ҁ>oÁtx{X ")"`! 4%ÖfCDq$KDBH+j´BjNir<+1 2ZBE`;c~Aq%PV&+,> B%g' p%K&-@?` WQV1 z  @|ph>@>"k ,71A:B* NU:]Mm[vo(jqEq*E OVzJ<` =$PG# r'PP4MR#<@+CxG%E LF:ĺ@e V00DG`ϴhzӍB |d#`-$@5C*^[p|"\D`CZ$ïni` ݯc/rQ¬+zHkv2% &`T#@WGԖl3`K&N @` &`c* 9񒨫*+;HB=;; Xއrtؓ 7^v-Fi`yk[i pvA@S/-w^z.؃h66!xLBV&h"Rn m0meX( Gi<EKg6`W Ch Ax C`Qp_ʱZ+ lKW*<ؐ*j Q$nL RS hd c]SІ[Kyq\j0#$ěCCq4^iK.g@MT꒣0؀ Z״P..5g@RUGd(#ơ@;!4k!MYV\Ϥ8uĊy00hh$WzEg(c%[cЌjpM1!0MM~"AyG0ȄKRjR/4$i|OF`K!bҗI8S Mi\IT(QpD^oH C 8p%4pO.QM  b >ˢ;?UEŔcP"lsP9d)!dUerKV)dV`It]-% GFzWJ|+E驃 ]KOc euN$ddׇLReo# 32TZ,.c04\Ҍ Wn*eUSxSXa F<`J_8WI/E@ǁ}vm cho]@OLWIy$ipF_/eNT+"V W9ML p˜]$ЮIœ G! P莄IfFĚLY$05 PK$ nYjog{:Zbϊ%+q 90:.Pٯy'8{#HhyqO* _ )d[ xű ޕڟ"ˉ[H<< ŊЮ#Lޕ]膅7WF$epR8ՉISy)77(a䇰x8G8s[РNف{菸Br@ `!IFLKڈ1<PZr8ӕ^P),]LYL7pLk}N (KL=`H)yӁ,¸"85329`=˳ҋ0 s ٦ (JPPY cI8Y Y4DZ ؄UɨXӍIP  -T\1~鎱,Q"ˆ!yL\YBU @x_^I^K/h`KQtBU)&X#$ `YȇՀ:Dh 81Kө)t4 $  ؊q;S#eHQs #Kl@Ġ QOL A[S&8PA ͓*Y3b %2IȺ aYXOr6 [ݩHX U4 ܂[P+ؒۖTF913\W;΀[eKЩ0iy ` 2x*k$x0sa RFy90(R(5a>ҨV 0YLeJ}ZJxxx e ,KQ!ryc : b(:,X \V;ΑX1ɏxѰJxIB=.1a0AWsQQI:Q!˖1RX ؆J0ځO񽋰 dبȁZ0X`CJ4@CEs'ȁ58!D$>B7]G[@ՕaYT  )e È!3X\'W9 =' x#*Bz")VpXZxH>JɫJn%d0НX7)jpD9\Wi3ZiNd.2< Ɍ@ϏX&!{WUH[{@h9-8 a@Iٗ0\}nfTfG(f|X 2HD̨j.G-?)Ӎ)P6b ) k 7Z*f |h.`HYF س葙CT 4͐[yT};89ŰCR< feal dN[&>..fN⾹aE'!a -蔍  q!Lj7oY ּz\ k[&) H![`)j T*Ѥ[(k')i S [j),g /$X 0F6hɤr Q: a;DS~tI`8 pa ;w ML/oc|so2%Ъ !a*J56#eC` Q$P"&7*N最 ' Jx^&QjILL , h2T`gHIꩡDs*Rbiț!6rof~/p @@'s*Ŋy(MfM Hޛ2l-xleٖHm@%]xxxЉhuPu~"Ҥ Ɉc`[3HSf@`SK8iiw1oWozNpzs&*r>糀fm_|T ' k S )?= &!P]钘Z%OiP&wx0ާ qWyZH"x$; cjIҋP Hr܂!zmr=zw3 HpBU)ӝ?l]2MP8c@E1`p4@  1rPR`@o.0X6`]<>  $ d\% b@%P  '@ p0( "Vi6sEit}FUkuy @m~-C8V( 6ByQPQ# E 5Ep6D>@p6/9(ꤐ,BlRM ¥hC&tfi`@IJ"rZη @1揰%XTʩ r`u' Ű, ʲ.863|8S:9@f6t7>O  ( 'o r !1 z`  (@h  $EB#s 0I" l `a(1E#3)$ !0!X"P)"c ",rMT!| (.lfX M`$HY^Y)$vޏp@:_Bd ͇&u,<2⴮o@!J`BH@Q J8' T'ID%Iox QUґB$2EuN*+4cD kv\P$ Rq(J3L@d,.b1B^_ 6(D t/UY$hfC|'o 0 *@Ǡɮ&@# fX$¾Gpr  ET . (D`4P!Bkxd*KPFr%X-I\ 0"QlD I Z2C&^dfJӠy8Gke&̄c{fQFr <#5q@"|sbk 5}@8x @, T.Av @ 0%cg%҄,*[G,"J[dTH dORCHe&PX|z@ @( `1XR ^Ƀ|c.K9%D׫;5Xdl kN)(pD-zS| ~`  " !T_A /$'w32@.| $F/1#[f\HF L##r(þSkv5ǥLqz/H:/ LEȂD(֝$vz*!^8U5P,CI6E2!H&c_ /-->DX8 R@ԀQ ?/"={dc1\pe=ϤLQZDm8K\Y*cOQ>L&\MV>GUB*'-{v 9Q!6&c/c2p85j15ư2S+E*\ qǏf`ؤn$s^֊([ 00mp N!N%%ljxr O] +!E8B$! E@ Cs0[`43sb (5XOa=wV21ˡF* *abHH<[12.ާzWf|^[)o=f:qTPJ12AV$UߒAtE֔&LY*T9Ge /ItF6fPDo#; A40@wxb!O%DʗaԷ}Ol>zr-Yz|LF&MhgOT:F`!V!d}I M} X%b gKjOoe b%DNZ:$/ .QjmHČ&<3D(z#16Mbb#[b#XwDŽ򃐐H6c/ 2&b^Ob ] ,9(1Hڥԑ!(}O Vln@˪^HJbz8{FkHOo. $cŪ8[DZT2KR"r#Q9",#.D1D89#%3$J/B2/C4cÒJZB_2k&ZJ*dc/b2 X玫J#L$F%4@bA:a&VaxMicK*~ADH>Kd-Ëcg1fQ6DJpC]+o iE2"ίb<.Œ$C$΄2K3dV<2Ģ$c$2*%Bo5^4z2c$3BbMc /J %8#E!X! p `"B,M9V@l`C"&g.P.SlO3g 3R(D0%C+!y?="Q/"^(B$ !(#%33 2 9*dfJc[9saDTG#,t2n.82&#n`+s`hAnn-]Ђ(laCqH86fkLﳴ@ZB̞4*"D$EC EHcW6 PSXs.ήNhzeD/EJ/LhJXzx"/J']5LJ3c0clK&E<_v 3BC,[b^cI(2*;. u ۀ GFbХ#(żՑlEW'Ocf8cp7j6x7 fX1fe1L0g(U4R3v/Gzkc\4{6pdBPc*2U Cbd9cDRDKTMl&"T[żC#`'~`8+KvU: f*l-HKL"A[bO-{CffP,g7.gKيZ 2 RI{ T,/iw@bOjJjf2rt0%]%DY"<,FJ$Lw|/ZF8CG&%]$kk~hmm|Kix L %9ml|H>/̄ EwT8#8uP =Τ $FdO_84Pre6fLxˋC'xFJHqŐGI$"(M2j?bUzX~rH$CAtI b|Dˆ((<$L$BZ# 1O#6cfP7u6pPp6v?xY($6$xxQ7H j#'gxئ<žY5 PBi$ZP5鏋I]&ЅZQiV:zd*"/0c0fCPÇec}rz\g d7YÌX.O3Y$GBG]13Otj'gSD|Yd0)r|")8z(qICxpe*(H$&n-_(JҕK\DP&7ڂ‹7EzCPD,'Ř#*[};Z[LZ~pM#'D) 6jjnS"sr'8J# .¨0EDȮKtED*0HOcP]yP1K20Ē*Ǒq~ADn>~? $fAY6'A ب^fMACܕ14Řx@# " @[ շzk٫b./`-ֺ3PenDk=l$b|H9{1$&y#$JUy1?! 'T ?UMA YW/"Fr Q2 /& Qt@6%B^ %S"0(%xe1X;j!i#3ԝb#c4X tek;ܖCVCyW>& rr"gdP .^@9?+R+RBhZ_hS4Dq<"DHjWJٷCuQjפ6Z35HJd2rSn8.r&ABQH#8vI1Z"QlY_ő.Mqp D4CHSUs>Z&J O2DJSIl*ǓLlyW(|Ki8C,x 1p*nι Iq6'1D. ^k=i$C`.-@"tcL.p:ȩ0l@!;vnSyϗG569u)l,#;;!hsBA1GXDP?YƲAYS>JHTxrN$ȍFc\ʴ,ʔn9ј-S'-.?A8Kԍc-ظ\zJK öUم"GhP!v`ėny8U،Ii$RjGH#QuӺU`dZ1Ѳq9TYDD᱙271P恳q1 I` ;y |* H3T @ʹL YRxЋ!GBKy1 1%HYlS@͵i A"$2@X-1;cѐ F2ّ>>yZU2 -g؍ .Ӎ3( 3ٓ 0HH33'#A лHŒȬpGlg MEL ȥ 0܋lq?-V 20:ܵx91GAh9(&`{]`KQ XH 0 ؿ +( YQ;HD%K،{X1`E \#9徛ٍ29;q;!NXhPhE\9 fvx> l̤ :Ԏ1չ/x ص$jc!X 7Б語5AL׍2(J@ ;9+P ^mMպ2x粬caYj`^P޺U[ڀ! ghi9'q% s'c>X 1ѐ"YN)ߏx4z ٴܔґH#Ȭ ?,y[T&= pM`=^fXjjꝬĚՐeob.Y=!xЭYmӛ9H|Y;5` PHבl1#&Hՙ8;֋`Ց TsAБQ @X'uqØ>K%юh4ܞa~Zހta-ѵBeIpB^9rfeERס@F I!Gyqs^1 '%NJT!a6.\[%IS0X2Px2)> H i>c AN T དྷ yOЗz /n ЀY>&9;#QYrUݟ_dv@fzQjI:AG!DPg2\5籭czr9Fyp 10Iy<Dψ3@  Yv`(& PDhc $`fNgS}?PhT:%GRiTdfG@J9#@.kuU@&;H:Q~A X jR PrO y" Zj­V$P`( L `x5`9 0bPs q \ԕ<-``@tU1y7a<(PbBL]( @ Eđ,Mz1`|Ƭ@'T#`)Fa("O%p T`|G l"x4 4;L"(H&V$ "8/$4 Gh%hF. б p:gK8T2,2̢4&*qWK {PE&IFLJ@IrY@Cd=[͵mۖ*w  1X!t"@:'PG8F`.0 6WB`Ry&,DҠ;΀ *bk%XB$XNDŽZ&Hn'Pw&`w&! Oubs6M4R)[.PrnUc[yZ  ;doM 2N/7rdE%ɧܭ6 v+Wby԰AZ 6lMHh[&E܀GL5Dh5P&D\&y%E# R$3!`[oZ3:W<]+tvEfL l-blK25R G%I^@"iΖؠ EM#TZ8e"-m  J"VJ;rD $_7'FTs.HԼmXa2#Uv[y9XNF9e优^H/dTʚ6+Ƽ( ؕ) ƒ4bcm Avi-ArgP bEظbcJPWS*anH(ܛ…i8peʌt!RH\QdD5hKistɪ. cyhZ&3d,C#P!( ;`O9ÂP}O+=x/Qq 0UiՍ"I"@}Uwrˋ/#b(+**"j-.(x,@,mØłAh@n4&B8A'$>㦉:4`"(W#܂נUR=plP,kr!3#;;(kH"&fl̒R F3c!"!&?k 0p0p1q  1q!1%q)-115q9=A1EqIMQ1UqY]a1eqimq1uqy}1q1q1q1q1q1q1q1q 2 r !2!r!!!"2%"r)"-"1#25#r9#=#A$2E$rI$M$Q%2U%rY%]%a&2e&ri&m&q'2u'ry'}'(2(r(()2)r))*2*r**+2+r++,2,r,,-2-r--.2.r../2/r//030s 0 0131s11!23%)gdalautotest-3.0.4/gdrivers/data/PRF/ph/ph_2_1.tif0000644003401500001440000000413313614004466021205 0ustar rouaultusersII* I BCDES3@  eXT E  F," X>A B`O!) @"(< | u8odP&@ @4"@ bqXf7drYN"Ǵ %(bEDFTd  DC`H ﯽ@uRl._o\ LlF@iG fp];D$iBT Ο.Br9*2T@ B*~@$!7*CëZN/`!5͓l7@hib?PD5HgP2BRf'Bv jHJk* vzD&.'9'z@kʹ1 -++2ӕcMeMABvq mk-_»cO 1Jk.zb)bBP7 `dj{LXC(5LPKm̏bSYE,q.n tOus=Y{+*;t9/*$I zr(~8e:.dX=*1[b3dZuC?1 n qok0BHEbH%c~;n;W'1U.˲fRJ҆>UBiBS.XkD5?,"%h-oOvPKDi;ZcLsI\t} n*B<ꈕR 2PߩIR_W&)먬\ ` U~DeMEԿ;x_ dW"2x3̓PnAއ)5/] 2H7i8H+ya5Ię,JN^qr3Ng$NNR0 "h/.;^ doaD)DiMe+MUq,_  H($u;'/Pr(IJUE :B0,0Pڝ.6 pP\RcP"xvTWALtiY+RԊI'XRfy҉;e0/d:'Yn?Qas d͋6'V5CyAE AE)-OqsIxAnP' 5E$bf*;e(XQ)1*UO9@ a*Dw" XU PUYUnUڽWaUVZYEiUV[qUκWZ]yUW_VX[ aEV.Xc셑VNY[-eřVnY=gVZ[MiEVZ]k텱V[[mmŹV[}oW\[qEɹW.\۝sѺWN][uٻWn]۽wW^[yEW^{W_[}W_X`\ F X/`XO a\-Xoa=!Xb\MF)Xb]1Xc\m9Xc}AY"d\FIY/&dܝQYO*e\YYo.eܽaY2f\͙FiY6fݛqY:g\yY>gZBh] FZ/FhZOJi]-ƙZoNi=ZRj]MFZVj]ZZk]mƹZ^k}[bl]F[/flݝ[Ojm][onmݽ[rn]͹F[vnݻ[zo]Vgdalautotest-3.0.4/gdrivers/data/PRF/ph/ph_0_0.tif0000644003401500001440000006051613614004466021211 0ustar rouaultusersII* BCDE`S8 L+  @%P *@ * x' u& DH& d8 =,@#/Fh,L^d@ ES \[*O-l8>dܘ@0QB`X 0t8@ Xc@ $p 9#1d}.xKz}^g|~_?~|TbSX] i` 4 LHN$hB#(0j""!H'tFl 1`s!͘kӾ(!n~0& 0`ʲ/8C1Ec5R@*Lu%ͻvޡƵ.ǹt9N:Ǒ`(ifј@ѿUeY֕m[߱EHRW*C! %6p@ @"x `*8YE 4ty[`H'̰ ͸ Ul-y@KL "s9NpUo$'./h}C'*@Lḵː1컯OTnS=O WC4u9!E͝#"uΩ9F<IaJ`&{FbA"fα?,>gLSM @1kiH15aGU t x!&kR 7"  /!pFmaHR6U8H  ;4兆3|u MUIÖ r9GH9@Q'[ 6"m \65e$T8Fә3m0x ӖcNYAE *'bA)Kp5 ddAT6"L8 Ѝb ^ma 8u^([$LYF a12>Y6&IfDS˴`{,Uxk !CeNXq 1e|͘LGE0[~!ŜAUV-4/EHok)'%C @9]@Ϙ#,*ШD\Q5tybN7c|#s6 #en h&m8(e]ȉnx4>R~}I2A J.yFm1<9'&O53:lxșsL<#T\Xl3`}HG>Db`>HZ:L E%PPaM*Z[^6Y,1 Q}I:](BiuVPUe̡NL7wm ,ADn !(:4\K;崴uQ'ړ;}J`GN✝Tv \EiYlϙʰl:1x;g`F_&Xp 7e&5͈J)E">'^:mԤ1m|ƅ S^UgZwVp+y,d1V;σdNs8#:*mHT _"i QFP%C: OAAXi@ɵ)ϋVzt[U<Iv5rbZ? Pir;&TMrž Ol嵟_TuCbX)m&3;@R+oŬ q aJ<$N*mVIX%ʓ?6dZRlK_L&k8]|Z;;8,4#)5&("CpO"9`$e΄W`Ґm PS&M8tf3*3WUez|T_.)d)AF&D,bdF ->eQI@3-"T;TUb8'XQqG_Ĝ1Z!Ǩ;;濣hB-,$PFRuZ Ɍ7rtN ɀtI" 7Eư@NT{gx,eVJrdE &&0i4odQKj]7%|g`L Z9I38#P\+eK$tX a39D8|u#~ 4O7P^'] _0!P&~6atKrG"[: L&+Zպf\bC#Xm6seD I$,B$)ai++Uj%g:U)h6"Q&bLشtPFj q63:| )ruE4IgTzN*Tχ-nD11TPE.b]d*KhFD).)5q~J,#[EAw H&(s[X7d.#Xul_D+:L7OJ99P;,97|U@,&rZI^65)*ϊNVF)|1ge^PFv5Ԗ%W8:?Zl\hWd~Vri"ZeuĢ$f#f(@8%|M}^EjژX Ęfĸ..(.t]EuaQل'|gJM懤pQ,(l;ő"96`L63cŪWrbA +A,!Mf.)vJT7HE~Lk,vxB!$!")\eqD}\7D`BT隙3iQ Cb7 ܆lH(I8j!BҺjNc93t%|~ aD04"Ҟ~:iI9 Tn|!!cs[,Dž`IlL&_~O涓:X"@Eq_ha.#hq:?JI zu|Px)V(]bHqtbt,8c@kDM7&FmzD? 8>T:^Bi.:qp9J& td" #0 / ! TITY-Ki5MԝDQpBO+I@d2 p =aVL hK 4?>`$'`n@C>F``p[l bb:|x@ XƺJ5h"@-AwSy<^C\,+;` ' @ ^@ hbw2i+ B3 Cpb`*`,"0 ,nzr*5 $%,j9꿸` 1 'k$E45m;TӐ  hUGZڴkԺ,#{&sYINMO[MC<NMZz D  >8Qm1ʙ;aXv%cXP:ٱ@`  h WT}DQ*ҵl Nu70 GA x`mEcC9NSNӽn@CR|q190s8HzJF\+RL#3U5 +L֣4"7ޙ1k50lVe6foR(G f@ kS<$gӑ;8SFhӂjHڑf 1`2$oYA*=G!@вZLr5՚Tj",|ޕ`@/^XLF+`R{.O;GxDFp e:Ѧ9 Eyŭ::Bu=^o ޣ@8倿I#R2a $#:3(hT4Y:ZS).҆3 R\cdEsSbcK"Ř^IαmЍ x2PZ/w=eB_ @6"7ʃri$7>'[G<DH |>dc9jRn_զdxpJI89ylrŌtNQ[c&Co.,h5(ғ'έGP ::M|${7CLWYbVFI^2 mNd3x@n| /Ā_Ix)hfzL^6&n 2wrrB67IQt|*@QnC&́"7ON}KYnhnd=t<\MLfM)FfX7:s9ZfNWg+vldH4ɥcI&?U8 8& l@9 zA@I(0i7 &踶+C9` 1%!zi+( yꍉs؍3xɖy30趡ku)K.Y楸ЋXIY %B/>#4p B z!&A& U $ԕ!&hI+ ʋ70բв/ ٍHًߙp!8ؒ3r!B)C3SPrΌZa"A!a$I xs?=GKh *8C ǁ9 (͎2(i` ِIːh.Z sp 4 "H=ڒiG꾣0ʴ[3/p к(-!I4>Ў#Be- E+Ȑ? "G NA\ IGʚH8ؘ`”P ᎽIpdƮP*96nj(׫A:I#a!q;yp!99J311.?Y2͞$1! hC!9$*ɋ( 8ʠ8${pԵ(@1  L @ P؋zPao ڐI8ʋp "2ⓣa#rzG9 X֎0ϊ+3!0ª=9;8b2؎G9ԋy2yՈВ4=AZCR`7Kv>5Ź!.q!ְ #JDY #EmUhs qj\]N ,94 Aju; "CZ|V x SqA8 \A= eMB/Y9zh3?Mn)?֓Θġ |FX`;a piX8+@;h9UHBF( W8A*I͋>"c2'!0Hɽ  @,r3Y 8EP9y養 liBu 8TϋIth yR؋V0Qz )@4pH ˩X@kF4p nIHYƎ;C&6(  9e}qK:C  PP&10 跓9ϾZIZ:'1Hl :=+ӈ QIŋP e]@qh J}k<n{ʸٶ?pс!H= S$Ta@8s\K(@(F`<"d29:xn@2IHZH*=I' tC`x:! ZUX@\ cqG%er|g5gs89#@ P \I* ʜ{,&"04 ܾXc,%ξ&Hfw| j@U͚FI[\P%PD6r``@bPrQIl$'RE-@pm$3": p L%^&JC!P{J 0S2;08#C(1rO$9"Ah\$0(!#P,J@ !(!. M;D(G gPkhcOI) @B(6O9JV%jj>'8 8 {$XA#5%4@ ~@ A=sOMAYH (!~J6:U<`ohs?nQ5Ε%Z5 -dzX5"R"6aD@XҠ jl]8N6:Ox*>h6`ڐWc(3```>N2@{ F` $ b偯@ %=*ld_{"6jNV`Dy򣢶VKpY,E{u)[_K,0:|:ԁּ*0fNglm6PG'p#YG( H* Zi ŌLd% ؊.QQKXُ&0 Pؓ!eLZלm`QrK@FQY*ޥR_AF!JY28n68!mΥW BQn``Rkh!N`Tqւ0s[*+5D  My*?򐋒圳acʀLS_D"Ǣ"PE9E6KX]#L C]Q,C7ih](R! Ak,B#,ӾvҨ&-/֑)g\ۋ)e9GhڛRlg!7*9CH|*h8g @;as"إBrPlH(n$Vl#AY"ItS3 PBp)̦j| :Ո2NqP \$1W&%t^[<+}̀TBΚ"7dL !cdD#YNZhڎieTUO@w % "N"&کAU,P^JiM(%nljg$EͲӯ%=q.DT^7Lt\  ciIVĔ/N*J0~` g M䇹*_f q1"KWp7«s geb?CԊvc*z&kt$=t764P -bK#f$ #j]c %xHl)*ǓtWp  !riS! z@Y1')2$ G@FD тCP_L] sR"'S1|PtZV#@OB c]թ0)dp2Rxh,{ӺQ&0$W#ZkE.RPSvq ا-եp&NX @B Z GaMV% 079" {M%dR.q.\Wűe'=xDI ga)ktReQ8* @l=#˂IBKD'2dݙ'Z,x$5D잹#I5EAT`״ITs:C&ęDZAf 'zo'޾06/թW9qPIExFu>J@ ґJ}sD8ba[eYN@ԾI| @RJ7kCa[7e4Zb)iJO@LN(!I0nW,8V;"`/F`HA'VgFBkX&7"f.Cf9e,l&ʳ&m,] *T#DPÐ,8MH~ S =6Ep/@"Y"6#2BnAIpZf<)&CܧXCX dAqf$rCEgLF$4$c9C95)Ꮍ `jfA`B*eewa.kDg"mKQlR0)4TBT%:K0]R(0(e DPb =hB0Z"2$#"\$Ab)dLDADLOB|D"p$FcZd]`!^a D4P&<(CR.J΢8!'^pH4`Za- bʏ{)R3q&)jT)X~C'QW21iB:CkTGB;e4io9rzx'-Č @,zz=hlED:VlP(@b@Y$$Bp)p7Qj@d(h&F7&枇irCX\CTW"9R,i*b%>*M^9,$*"e Heߍ6Td5CCOʂ7EDF"%BTg`n܊Ap?N"nOEz/C,HVMä X!)TSFBA8AAAߢHv7rVW:ԯK(@9XECcQ9Ri, ~J:xM}-Đ9cV `V;:RFC KMWLp"Db*$0d$$bG2 <#Vd@"X.)>"v6Gl$XCjUGM>`4\q`/r@Й=n'zԳZҘ:HGt΅ /Υ< c}LHR}:O`MJDdP,\R>edNj*N/"K"n)g"ʘB1R"uN܋D>]2BDO%n‚.=Z.Sz=TlkjuT2DŽH@Ob ( Aj@Gr, CT"61Zdxkb8F=VSQctąhV8܈$*^9h%]XuGHFPu!a5D&B]qd6,$LP 0l=$2BhD6D(h=#A&G^,hfBzED65BnC M :4;K@@w  / AARAB>,,1d>s"zfwh|Pbvd9fOFmleo:&9c0jim|:QEd!c5ithg>܅Z"T%BN$D!Cb%F<=%x TTE6lcŦci'gA=wiC\2.jGTxeNSF&R)+@ `V@w BeSz jd\l%hĸ\BVG_FW*9>JP5[VT\E|=j/s3epD:1jDŢ"J".%X676X"%3 8O.'W~")$#tXC<W4mH'iP]v] HJ@®@@Q6e\$gN&{٦ؑKb',b,G|ΐ iEe^GT`G|CJH9aX @c ֥N%DcgB$B\Nnp"bNdB5 Ĭt$f! trO&Tb; mAvvF&``aAA5 1ECU@rB~5Tu>#B``W1iUćٜkC^LH:m~*f\78(Ȉ!]"7FNBZABy6D%"A(clfrFbOhC8xjlfD.BT8C)0*JS RAJ@  @`PU@_%'%K6&X\ ': C!VF]~ɍ:IcVǃ8kl-$٫H+nx!zP 5XB2@6W$Y%$|YEY+6bN" @9xbI|γ{'%|0Ѐj6kaHJ AE@MhX!tB{Sh:~9!H♣FP9ҏNmB:SzFM$|[P6El,i}F҄A.͐(aLI@nK:C?>E6\jEvd= azAt@(MSE MLJܐuC0#Nf~lg;Je/'$2ECA b#}4DdLKXY@l-5iH |RVl&.8C~*$QdՌ;t+P=l1eKzZzd6 F!eYߕ%0PR5 ][:;gb 8 jTb7eZ]J\h6w!|즃BCXc\X%# m/'jw@H!l\RΘv0T=AXA@8`J~;ڄ.0yj F{P]GEr=#GI<):FV9 &T-&eN:PɢU0jΎG/8]\.{"(cd$e_%lA‹L4Fz\Rw@2h%rCc=b @"(8RB 'xf% x0 6 01`^ APZ5IRu>QP@@ ( + $pC`( \!P#J7*"L(JɁ`9@+p t#` 旀InNxBM ܡ ~A=GTP.O~i 0A` & " [hK+&  (  iD aZqt_F1gFQ``,+r 0! "0$S&>H0B~|_"C`KSXCt8-7D%EP@4N:eHL @2LA#h,,ab "T!FCZ X` gCO6R&!D\[^7z^M2 7/V4ιج[$!"3Y& R'L4SPU !qIۖI5ّ7RK}Jm XDwvƏ@NAs%pF#1/VP@@ V2gkoGPGA=GFdĺt=G(g ja7bR'3&J` xM4/T >\uinqPϾ筣ms..jXQNqcNgXN @v%@}3`*0>ʲȸLl@@+#,Z[!L@%CzP1 hd͝ta?EP{` u@Lw,żRڱYc%5^_"sȯS/Bb㲈}o>c|lCBgLDߋR~(1`I(ZZ<$qJXhse9۫ 0X0pƘ`\!``-h@.@eb&/$E'e)3ftB#@ `$`mJdYa;Wts r򆠑.A*61Q.H!4LOI:rm2Nx*T8! b "8@/gOI 2RvthM)V5bLZ? 8\S; nTb'dY\@q30ɹP(Z 0h~9z$un t`ҁB`WHP19c" W0Z`$9Ca!v340c:萛uY/8`!(}A ti e%"; |^09XxtK.4N2"M#ftblYŝg ٛlh_"PF_sxrۋ h&07"(@)X$G0ԨE ! 8<2[~lxΩǘל=%쓒o~t6j,DJ!0ޠ!.u([[QsIvD:y1wŖv&g6&AO(D.cF! DP(& is.(Fc`r N  WB1bB 수*W.~ (22skP$pOEgj0ɏ&{  ȲY8r}U\5#̈́`KYunRnxlN:?OV9;5>VyF0P_됦 ؓB**tHn^b,7gys yA֘h]]spa`.ɓ0ZPzۘSvKd ]>G8L f&%@4bs (!hQlMy:ԓ֨E=@s:G, j[^)q>K~t (1CȻFMhRD-`휣@H7 йt. H 95  =HA̶#51? = YO +A 7 Eb_OJ ȸab:m u>v`掊A k0֨O I̮$ DdFH`'b"8H X`Y ȕ!@(=!>ЭJHܙ (/ٕ  %d*L @TƐȼ’q: ` [z4XU SIhֵD  =a?! DDĊ1"a3HD ͉1b`:즥B5S6 LG=< B,IE C@iv!ˬx U3 /_ƒp . ֱpȬPq72 1<bZt=(e KQD1ױPi @o u!~+44ݵd4M } ${iW³X +YQ` s8ɣRI_:`q۴`` "RpHI"%n ržZc)R`xؙ1I-YW@5 8mbbH3Hj0N - y<ʔY:؈30H0Z`;幙O͆2On|H ,rj9YẒnʑX2@`㗭ʚ9p陎O eQj()$q?ț sP l 'NQ  1P;7H[36ަ6!QO$L ̽e&SB ɛrAM 9ƄŢq7ƕV` 9ZxIY""/`GZtKX($k)i+UF35@Hq`M@/׉\&:gQ( EVHŌ1  ˑ8Si 7, cvjBHlQ}-OЀ5` ( 8( m& 8*!t+'` pV#G@W% %%Y&F=HL[`e^+ 6-`-/ `pX<& bqXf7drY< @) "p@ @"05 `_^SD QӀdE@pz]W0+-6 8(HX @"%! ؃h  @d4 `NҮΔxX`sHjq3k-)1̓,3Lő$Ϥ :` $d KM.d "> ,*;T EUZԦp 0"`@n !A3ժ *H 0 @|iAAc`^VM۶n,rsZ杲ru. )f\>\5.MK6ӊဠ1:ڀ + 9ή˪R+pVζ Տ%NS*8r7S5XmR5&hXse x`"e`vx*G+RmRw:7T%)ruyW}ͳ}@ڡ(\uyh%j)"-P.6<;!;.+NlG%EtP `EnRAt6( !"h!`A(5q16gByQ*e`뾓[ze*VviI1撖XщuX2ɼL  4\fdOL8 rJl]*)~ YJn.dڨU`O!$+q`_I C  Rh+ bCAfdAIL4VF/ P  c11>xhҙa@vJ>ì=wΓnI1,+ƒ.M2gDQe"R*N6A%/MΖnAH WK*L-iX`RB5N*Y֐+s6G@ sHa^F@.ߐ4RQdQFq9?CB "bPIEDQ,ĦiQ3Ř]3Sxg]yU5TZyg%*JciϣòO*aH(S;'e;:=* WL^)q-:%n0 .4 ]A6f4"ZRHl ŤAlfA AcFՖB -QrLIsIÞ^|Ꭵ1YXeq$.h  g-Hx_<'6yNϴc$7JUa"sVLR*ؾ(ey`@QpP!P 0EFPHJ*HC9Ḇ,_1g> ASL1I([ x8'}NZBvJ{7i(i kVt3xC-vC$aCVHE EQY#ӟc`AdA &!Hl\92o:F I! bH`%ph-=P R Bdاp h)A^ԏI&$ĪeI_ :GE豱5t/U .f@fh,6y55UDqS͐;iHvtoCJqA,_^2@#tP j6lt#pc+vԼIPbObDkO.Ld&]Kaޕ{ VX[1z3h_.wRsϱnPwثQ<{J1"'| D~t) Y;ifH/-=v rFKi7m yup$Ax Y )PA Z{kzZcE)YL_ce%&pK P&pb9>^L|d,Ķv*=#;j#-*.:k%`34-Eht%h,"II&!`$bs ^"B4bgZbBO$AN!h-n"^(I؟+뤢,o/KĢ.ƒ$s+>(J"/Ĕy$opLteV GJP*gQ,*;ko0f (:x>C|-C-KV7oP @nr!%Ś|dJh%#.l)%xbEK7 o/G>k,3 b /b7D@1q1q 2 r !2!r!!!"2%"r)"-"1#25#r9#=#A$2E$rI$M$Q%2U%rY%]%a&2e&ri&m&q'2u'ry'}'(2(r(()2)r))*2*r**+2+r++,2,r,,-2-r--.2.r../2/r//030s 0 0131s11!23%2s)2-213353s93=3A43E4sI4M4Q53U5sY5]5a63e6si6m6q73u7sy7}7838s88939s99:3:s::;3;s;;<33>s>>?3?s??@4@t @ @A4AtAA!B2~ gdalautotest-3.0.4/gdrivers/data/PRF/ph.prf0000644003401500001440000000302613614004466020142 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/PRF/dem/0000755003401500001440000000000013614004466017566 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/PRF/dem/dem_1_1.demtif0000644003401500001440000000015713614004466022170 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/PRF/dem/Pyramid.demtif0000644003401500001440000000051513614004466022366 0ustar rouaultusers 0 0 0 0 gdalautotest-3.0.4/gdrivers/data/PRF/dem/dem_0_1.demtif0000644003401500001440000000016013614004466022161 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/PRF/dem/dem_0_0.demtif0000644003401500001440000000016113614004466022161 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/PRF/dem/dem_1_0.demtif0000644003401500001440000000016113614004466022162 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/testenviclasses.hdr0000644003401500001440000000042413614004466022310 0ustar rouaultusersENVI description = { testenviclasses} samples = 1 lines = 1 bands = 1 header offset = 0 file type = ENVI Classification data type = 1 interleave = bsq byte order = 0 classes = 2 class lookup = { 0, 0, 0, 255, 255, 255} class names = { Black, White} band names = { Band 1} gdalautotest-3.0.4/gdrivers/data/small_world.rl20000644003401500001440000030200013614004466021325 0ustar rouaultusersSQLite format 3@ a-a1-(   efSiepsgWGS 84+proj=longlat +datum=WGS84 +no_defsGEOGCS["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"]] $/ small_world_tilesgeometry'5 small_world_sectionsgeometry /small_world_tilesgeometry 5 small_world_sectionsgeometry  ]--mtablegeome]--mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid), CONSTRAINT ck_gc_rtree CHECK (spatial_index_enabled IN (0,1,2)))?S-indexsqlite_autoindex_geometry_columns_1geometry_columns++[tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT NOT NULL DEFAULT 'Unknown', proj4text TEXT NOT NULL, srtext TEXT NOT NULL DEFAULT 'Undefined') I--Etableraster_coveragesraster_coveragesCREATE TABLE raster_coverages ( coverage_name TEXT NOT NULL PRIMARY KEY, title TEXT NOT NULL DEFAULT '*** missing Title ***', abstract TEXT NOT NULL DEFAULT '** ?S-indexsqlite_autoindex_raster_coverages_1raster_coverages &33stablespatial_ref_sys_auxspatial_ref_sys_auxCREATE TABLE spatial_ref_sys_aux ( srid INTEGER NOT NULL PRIMARY KEY, is_geographic INTEGER, has_flipped_axes INTEGER, spheroid TEXT, prime_meridian TEXT, datum TEXT, projection TEXT, unit TEXT, axis_1_name TEXT, axis_1_orientation TEXT, axis_2_name TEXT, axis_2_orientation TEXT, CONSTRAINT fk_sprefsys FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))A (%#7=6$ small_world*** missing Title ****** missing Abstract ***UINT8RGBJPEGP??&&&#'A@7o@K5H@!AG@m@p@pt@z@~@؂@@<@@@-@@@ # small_world* missing Abstract ***', sample_type TEXT NOT NULL DEFAULT '*** undefined ***', pixel_type TEXT NOT NULL DEFAULT '*** undefined ***', num_bands INTEGER NOT NULL DEFAULT 1, compression TEXT NOT NULL DEFAULT 'NONE', quality INTEGER NOT NULL DEFAULT 100, tile_width INTEGER NOT NULL DEFAULT 512, tile_height INTEGER NOT NULL DEFAULT 512, horz_resolution DOUBLE NOT NULL, vert_resolution DOUBLE NOT NULL, srid INTEGER NOT NULL, nodata_pixel BLOB NOT NULL, palette BLOB, statistics BLOB, geo_minx DOUBLE, geo_miny DOUBLE, geo_maxx DOUBLE, geo_maxy DOUBLE, extent_minx DOUBLE, extent_miny DOUBLE, extent_maxx DOUBLE, extent_maxy DOUBLE, strict_resolution INTEGER NOT NULL, mixed_resolutions INTEGER NOT NULL, section_paths INTEGER NOT NULL, section_md5 INTEGER NOT NULL, section_summary INTEGER NOT NULL, is_queryable INTEGER, red_band_index INTEGER, green_band_index INTEGER, blue_band_index INTEGER, nir_band_index INTEGER, enable_auto_ndvi INTEGER, CONSTRAINT fk_rc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid)) p@@@@~@z@s@s@p@m@i@ g@a@_@ `@ c@a@_@a@d@ a@d@d@h@`g@`n@j@`m@n@i@@p@m@k@k@o@l@ i@n@@p@l@`l@m@@n@@o@j@m@@m@@o@k@l@ m@j@@m@l@k@j@`l@m@h@ h@`f@h@@f@ e@f@d@a@`b@b@b@`@@Z@@]@_@Z@^@W@^@@Z@_@Z@@W@@W@@Y@[@T@T@@W@@U@U@U@S@W@S@T@T@W@T@U@U@@T@@V@M@R@T@Q@R@R@@S@W@Q@R@W@U@T@T@W@T@V@Y@[@[@W@X@@X@@Y@Y@\@ Y@X@@Z@W@[@@S@Y@^@@X@Z@Z@]@@^@@^@a@`@`@`@]@^@c@@[@a@@b@`a@`@a@Z@\@@Y@ c@`@b@``@`@_@_@^@a@``@@`@`@X@]@ `@[@^@\@X@[@^@[@[@Y@Y@X@Y@Y@@[@@[@W@W@Q@S@R@Q@S@S@L@U@R@K@L@P@P@J@H@I@K@J@C@J@F@E@J@J@E@?@K@P@B@F@J@H@F@F@C@K@P@C@I@J@M@O@P@Q@N@N@P@R@X@Y@S@`f@؂@J:7o@4;bH@&}AG@@g@n@p@0x@`}@@x@h@ԟ@y@@6@@@@@{@z@`y@pu@`p@o@h@f@d@\@`@@Z@S@@S@S@P@L@N@I@I@P@L@K@P@@S@M@O@R@S@X@@Z@Z@`a@a@ b@g@g@i@j@m@o@p@l@q@r@m@q@r@q@q@@s@s@q@@r@s@q@ q@q@p@s@p@pq@p@o@ q@n@`l@`l@n@`k@n@j@k@`h@g@g@d@`d@b@b@@b@_@a@_@b@]@]@[@^@[@X@@X@X@W@@[@V@X@V@X@@^@R@X@W@@X@W@@V@U@V@R@U@@U@@X@W@U@T@V@V@@S@U@U@W@@X@V@@[@@Y@@X@@W@W@@U@^@[@b@`a@`a@`a@@`@`a@b@`b@`@@]@@\@`@a@`@a@_@`@`@@c@\@_@^@@a@`@e@@_@a@a@`b@b@@a@`@Z@@^@@^@@a@`@]@[@_@ a@@[@\@@\@]@]@Z@X@W@\@\@X@@X@S@T@S@@T@@V@S@@Q@H@Q@H@@R@O@R@M@M@O@K@K@I@L@H@N@E@D@J@A@N@B@B@@@@@F@A@>@I@C@H@A@B@=@<@@@@@F@D@;@A@I@>@K@G@K@N@Y@0s@J:7o@Nv@P@X%AG u@S@R@W@`@b@ f@i@l@o@o@s@`t@s@t@s@u@s@ u@w@`t@w@u@0w@x@w@u@v@`z@y@y@z@Py@0}@{@p}@@p|@X@@@@І@0@@d@P@@0@@@@@*@@x@@@8@p@0@0v@t@0q@pp@g@ i@i@c@a@@b@a@]@@_@\@\@@Y@U@@X@W@X@X@S@V@V@@Z@T@@S@S@Q@O@P@J@N@L@@V@N@N@N@@P@N@H@L@G@L@F@L@M@O@O@L@P@K@D@D@B@J@N@L@H@N@J@@P@@R@H@N@L@O@N@R@@P@@T@R@U@@S@T@Z@@Z@Y@[@@]@Y@_@b@]@`@^@`@`@`@_@`@ `@`b@`b@_@ a@a@ e@@a@ b@c@a@c@a@@d@c@b@d@`d@ c@c@a@@b@c@`a@@]@`a@^@a@]@\@\@\@@Z@@_@W@\@]@Y@@Y@^@@S@R@V@J@V@P@J@M@L@L@M@K@A@L@K@E@D@E@@@A@F@@@A@<@?@>@B@6@7@4@7@3@4@4@1@1@0@(@.@$@$@,@&@*@@@&@$@,@0@*@(@2@1@1@4@=@=@A@>@I@@@@a@@@`s@J:Q*LZ   SSdg ==atableraster_coverages_keywordraster_coverages_keywordCREATE TABLE raster_coverages_keyword ( coverage_name TEXT NOT NULL, keyword TEXT NOT NULL, CONSTRAINT pk_raster_coverages_keyword PRIMARY KEY (coverage_name, keyword), CONSTRAINT fk_raster_coverages_keyword FOREIGN KEY (coverage_name) REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE)I]7indexsqlite_autoindex_raster_coverages_srid_1raster_coverages_sridu77 tableraster_coverages_sridraster_coverages_sridCREATE TABLE raster_coverages_srid ( coverage_name TEXT NOT NULL, srid INTEGER NOT NULL, extent_minx DOUBLE, extent_miny DOUBLE, extent_maxx DOUBLE, extent_maxy DOUBLE, CONSTRAINT pk_raster_coverages_srid PRIMARY KEY (coverage_name, srid), CONSTRAINT fk_raster_coverages_srid FOREIGN KEY (coverage_name) REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE, CONSTRAINT fk_raster_srid FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))   EP ++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)g 11ytablesmall_world_levelssmall_world_levelsCREATE TABLE "small_world_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)O c=indexsqlite_autoindex_raster_coverages_keyword_1raster_coverages_keyword52 55tablesmall_world_sectionssmall_world_sectionsCREATE TABLE "small_world_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON) hJ @L@L@\@\@l@l@|@|J @@@,@,@<@<@L@LJ ????@ @ @@ /small_world_tiles1small_world_levels5small_world_sections'&@O@S@S@@P@@U@Q@Y@U@X@U@U@[@T@X@@X@V@@T@V@Z@S@U@@X@Y@X@U@Z@X@V@V@@V@Z@@T@U@@U@@R@T@U@@S@U@S@S@@T@S@@P@Q@R@P@R@P@K@J@Q@@S@H@I@L@K@I@I@E@N@I@N@H@B@G@C@J@C@D@H@E@D@B@D@E@C@C@A@E@D@B@B@E@D@9@@@@@B@C@E@B@K@@@D@D@E@E@B@F@E@C@A@H@D@D@C@F@D@D@K@D@D@D@=@K@A@A@G@B@@@E@C@>@C@B@A@E@D@B@?@K@@@G@C@C@D@G@D@G@B@M@D@E@B@D@E@F@@@F@E@H@F@B@A@B@@@E@@@?@=@B@A@8@9@6@8@;@<@=@>@6@6@4@5@1@7@3@9@.@7@2@,@3@3@(@$@$@&@*@(@*@8@0@$@(@1@0@@1@2@@ @(@1@"@&@0@3@5@,@*@9@2@<@8@A@:@8@>@C@J@@P@K@c@k@J:7o@c!EC@ۨޟAGu@W@`@a@@h@n@q@Pw@|@x@@@p@@Px@t@ q@k@ h@f@`c@@`@^@T@T@R@I@N@G@@@D@>@=@:@?@A@;@:@@@9@A@C@:@@@B@B@H@I@J@R@Q@Q@W@W@Z@Z@_@@\@^@@X@@_@a@@Y@]@^@\@W@^@]@X@@U@@[@U@V@\@Y@[@X@\@U@V@Y@Y@X@@X@U@U@S@U@S@S@@Q@@Q@J@M@J@K@H@H@J@G@M@F@J@E@C@H@C@F@D@D@G@A@E@C@E@L@<@H@B@A@C@A@=@?@B@C@D@I@G@A@B@B@A@?@C@A@I@F@E@G@G@I@A@G@?@G@B@P@H@D@J@D@C@G@F@G@B@B@F@F@G@J@G@@@F@N@D@C@G@K@A@K@D@G@F@E@H@E@C@A@F@@@F@D@C@@@?@D@<@?@>@E@<@5@;@7@=@9@8@5@9@2@:@,@@@:@0@(@:@0@2@$@6@2@,@2@2@(@(@2@&@1@*@ @4@.@0@*@*@"@0@(@&@&@3@"@,@5@&@*@1@,@2@9@2@0@6@C@2@;@A@D@H@U@p@J:7o@k<O@ܿAGc@D@=@C@L@U@@S@V@Z@W@@X@Z@`@_@ `@^@``@^@_@b@`@a@@`@ d@c@b@a@`b@f@@g@e@f@@c@h@g@@i@s@`i@l@l@o@ o@u@@r@@}@x@h@0y@8@l@@X@u@@q@Py@ m@p@n@ e@`@@[@@^@Q@P@R@Q@J@D@H@D@M@E@H@>@<@B@=@B@A@:@A@;@@@?@3@;@8@7@4@.@6@9@9@9@7@:@7@9@5@>@3@4@2@9@8@?@;@9@>@5@7@5@1@:@:@8@5@;@<@A@?@7@>@<@=@;@@@;@C@9@A@?@:@B@D@A@?@B@=@G@I@D@D@G@K@G@M@E@J@E@D@M@G@H@K@O@G@N@N@J@L@I@O@I@I@G@I@H@G@H@H@F@G@>@A@B@A@E@B@<@@@8@C@5@7@E@A@A@F@@@5@;@3@@@6@2@7@4@7@4@1@ @8@5@5@4@2@&@ @.@2@0@$@$@&@1@ @(@@"@@ @*@ @&@"@@$@"@@ @"@@@@ @ @$@&@ @$@.@1@.@3@;@9@@@<@H@@@a@@@@q@J:B0*fVV@|fVVV@fV@fV!@N@@P@U@R@T@W@X@@Y@b@_@b@`@^@ d@a@`@a@d@@_@^@d@`d@`@ `@ b@`@@c@@]@@b@ b@b@a@b@b@`@c@a@ b@_@b@c@@]@@]@\@@_@Z@@Z@Z@X@U@W@@T@Q@U@K@N@Q@L@Q@I@N@K@O@L@L@G@O@K@E@D@F@E@E@H@C@H@C@E@F@J@C@H@I@C@H@A@E@H@@@A@@@D@D@A@@@K@E@D@F@H@C@H@P@N@P@I@N@J@N@N@L@N@M@@P@@P@L@E@@Q@R@N@R@P@S@V@T@@Z@X@"W@@W@T@@V@@Y@S@W@Z@@Y@V@V@P@Q@P@W@@W@[@W@W@@T@T@V@W@V@@T@V@O@U@W@@S@S@T@Q@@T@U@S@U@R@@T@R@R@R@T@S@Q@@R@I@L@L@G@L@I@E@N@L@D@C@F@J@E@C@C@D@D@:@=@<@@@D@B@:@8@B@H@=@B@D@@@A@A@7@A@E@9@B@<@D@A@D@A@A@B@B@B@F@C@8@6@w@J:7o@\m#M@ߥuAGt@W@@]@``@ h@l@p@w@@@@@4@@|@`w@t@k@m@k@g@`@`@]@#X@W@O@R@M@F@B@H@C@?@=@0@7@D@9@>@=@C@@@=@C@E@I@K@K@@P@@Q@@S@W@V@X@Z@@\@a@a@`@c@@b@ a@@e@ e@e@g@ g@`i@ g@i@ j@h@g@e@d@@i@`e@d@e@@d@e@`b@``@@`@ d@`@ d@`@ b@]@\@@^@\@Z@X@X@X@S@V@S@V@R@P@Q@U@O@N@J@L@K@O@K@J@J@L@P@G@I@M@O@J@K@K@L@C@F@F@G@G@I@G@K@L@G@G@I@F@J@G@O@K@G@M@G@K@R@R@U@V@X@$U@@V@Y@Y@Y@V@@T@@S@U@X@T@V@S@X@T@W@R@@U@@S@T@@W@]@U@W@W@Z@X@X@W@Q@S@V@@W@V@S@@S@W@@X@@T@U@T@S@V@U@R@Q@@U@@V@R@S@I@O@I@P@L@J@J@B@E@@@K@J@J@D@F@F@B@E@C@C@C@E@=@@@@@4@F@8@7@7@0@@@8@3@@@=@A@,@:@0@&@2@.@3@6@&@(@*@(@;@&@.@&@*@E@J:7o@d`P@.nZ|AGf@B@E@K@R@P@Y@]@^@@c@`c@i@h@ f@g@h@j@g@%j@@m@ h@m@@k@@j@n@ m@j@i@m@`l@`n@m@`o@0q@ p@p@0w@o@Pr@p@`s@@t@w@H@u@(@z@p@0}@@@@@x@p@t@}@q@0v@q@@g@`h@d@a@^@`@`@V@@V@Z@W@S@P@@R@P@Q@M@N@P@M@@P@J@L@N@@R@I@M@I@G@C@G@B@C@@@P@A@C@A@E@B@;@;@<@B@;@@@A@?@A@@@A@@@2@4@3@;@A@@@<@@@8@?@E@9@>@=@A@A@E@C@E@I@J@G@L@Q@P@P@S@T@@R@S@W@R@W@R@S@@U@R@@U@T@U@Z@V@@T@V@V@Z@W@@U@X@V@Y@V@X@@Z@X@]@@\@Z@[@@W@X@\@@W@U@Z@U@Z@R@R@U@T@@T@U@Q@@V@@R@@Q@P@S@F@J@P@A@L@F@A@B@B@@@C@C@:@@@@@5@4@8@6@;@=@.@3@2@5@3@4@,@&@*@,@*@(@@"@@@@@?@@@ @?@@@@@@@@@?@@@@@@A@J:J*Vf@V@|Vf@Vf@V@V@V  !M&$world_west1a2b40cdc2683a07c556bf70db58afe2x}N@_15I^h_/7H7 YEA@)mfw3;3I콣 eo8zҚ7ô?̓M3VAN&ک|:1f$z&ں\#[]:kR5< `bI'ij.j-+IEز%zNR:T8\+N䔕)bBۤ.^Sf"g$IiikD d~^列J8|^(7 A+ZdRS$:;=9-Hh:A<[z3cqW]޲5_Lny?OhYs@@?6oz…;C/?ꇖJ/HxQDR+%ϲ]pHmGMqBGw/f e'  A@7o@VCC@5AG z@]@@`@`c@j@m@q@w@@x@x@@(@@@~@@u@s@k@@i@d@a@``@_@@V@W@Q@P@J@Q@Q  !M"$world_east0cacd314aaa05594bb5788f68defb7a2x}N@_B՘kR z妝ҍ0CEѧwP \I콡 UozҚ7dػV0KR7Z:fh&=Z<۩ h Msm&{@t֤jp&rȸN}Z)0V`c Jtji'>p2 7)+=SĄI]!DHmHc"֤ D d~^列J8sNW/+;߆ qV*YTa"pvN/r !\''Kox.3Eu,Q3)[hп !֙?:e#ΩG\(7"yVoT +urGZ5vJu/Lvٻ!5Ñ Mw~OeܼAy c' A@7o@-K=kM@J_\˧AGy@^@a@e@j@ p@s@{@@P@@g@(@Ё@@v@pr@p@j@`c@e@`@\@[@V@Q@M@@S@T@R `91<[[Otableidx_small_world_sections_geometry_rowididx_small_world_sections_geometry_rowid*CREATE TABLE "idx_small_world_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)5YYEtableidx_small_world_sections_geometry_nodeidx_small_world_sections_geometry_node)CREATE TABLE "idx_small_world_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)0OOQtableidx_small_world_sections_geometryidx_small_world_sections_geometryCREATE VIRTUAL TABLE "idx_small_world_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)nD]][tableidx_small_world_sections_geometry_parentidx_small_world_sections_geometry_parent+CREATE TABLE "idx_small_world_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) 99D 4´BC4´B    sX fVf@V@|fVf@Vf@V@fV@fV  fVf@V@|fVf@Vf@V@fV@fV Vf@V@|Vf@Vf@V@V@V  fVV@|fVVV@fV@fV )3UUItableidx_small_world_tiles_geometry_rowididx_small_world_tiles_geometry_rowid/CREATE TABLE "idx_small_world_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER),SS?tableidx_small_world_tiles_geometry_nodeidx_small_world_tiles_geometry_node.CREATE TABLE "idx_small_world_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)'IIKtableidx_small_world_tiles_geometryidx_small_world_tiles_geometryCREATE VIRTUAL TABLE "idx_small_world_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)T//Wtablesmall_world_tilessmall_world_tiles,CREATE TABLE "small_world_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_small_world_tiles_section" FOREIGN KEY (section_id) REFERENCES "small_world_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_small_world_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "small_world_levels" (pyramid_level) ON DELETE CASCADE) 99D 4´BC4´B4C4´B4C4´B      HHa%%tableSpatialIndexSpatialIndexCREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex()/77}tablesmall_world_tile_datasmall_world_tile_data2CREATE TABLE "small_world_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_small_world_tile_data" FOREIGN KEY (tile_id) REFERENCES "small_world_tiles" (tile_id) ON DELETE CASCADE);WWUtableidx_small_world_tiles_geometry_parentidx_small_world_tiles_geometry_parent0CREATE TABLE "idx_small_world_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)w55tableElementaryGeometriesElementaryGeometriesCREATE VIRTUAL TABLE ElementaryGeometries USING VirtualElementary()^]4%# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(\((|1I<(JYM2>ՖKj!\2G+m;bfG@}*$i]B{#ʳM:@?11*HY-^a,tr|1Jc|sma4>>jc!.m aQY`r 5i^n_iQFVy,b#y:{u),'kBϵ3Pnj,Ng*c,G.=hԾ,K]^icT=20=f5嶛$ȭiGp](hwWɐzaW!>}.}-ۤcpF`2ykWVRq ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5OS񤮍|Glt."3Y%a0C*pG= l՟ۍvCt[H`>Q8V_WʬI21]K $ۛ3=OCNw*Y'$xysj{=`{SnQT֫MC!GwdW\6֑H.wdnHt\[]o{սpcu)"Ѓϥ 3/;.}bg0m?jV2ji-- "<S܍v&_97ϸIdc#r3~TK1iY.>{A#Ӯt"[g*@^z`@ 8V&E]&38_QQ\7bP] 9jXe,zFߺ_̵$[ ٴvQ01xۦu٘'\}x4V1[fNr eAx$f D*8p Qh۔ߧ ̹y{^]Η>2K[˸Ww K+hᲃM*%.\)+B *kxkO4S >ѻd}Jy~ H-OW ˀ6y6\P)J X܂ Q|'%Vm &\ O zUxuT>ȕN2.gH9񸑎*9"1SvuB+We+\V柪4%"æ/]=8$qX._z @4#Ot/* H pG>ݭ0T8]rpr; Wq;+1eC#O;*^PU q*IeY#9d H$G]anR8Q O|fEn΄8zj9J.3>G6\0z*-7gn3əm4pz]RF*pyשOV :7EXY 򌓒;Gki}z7C{nrK)P A1'~kT;_V)NT,">Lgi>V-ih֡`x'۽{z#juDv;Gu-+*{[r1ꌒ<<Q ((((((((((((((((((( J(r((eF1*>^RH y~.b~E$c'Izsxv[bDKL;F:9Vu=.).k/ .q9$duSD Uf0:,PPdWPvq>Ve 8Yфd+0h.E)ߞI~cP+m@]MKħ78'==+˫2qi1q S-I<ĥRuu$7>D (3 ( ( ( ( ( ( ( ( ( ( ( ( ( (8 ( ( ( (5( )F;~S8{@ ((ޕqVR4W6, 5I{Kquw`F Üdt$W.' ]ˌtGVqiM=y{d@$N@# I={+#^2=.| g8M-7*rvN\}s}k/Or`<; ?^XJJq]̉5ə$Qc#8Oӽ[]6))c@誤nM5" 䑌8Um(43ఛo=랕{ _b+$zn=ftWUC9<& }cqe&u#8:e\EWhž<1L;:Oa&.$Fk󑷐G#k79ܿf%ˈN'?+H 9WcxUf{^iI{hTj zJEcI&'sĕ1eQu3^3\R{*(B(((((((((((((((((( J(r((((( m q2X+O!I=:m]￳u`eC)RxENnW˸ETX!CINq%f*6X`˹Nap@ uP*ǭ|WNňXZXpHԚ¹hyUh""@X[hd7D!;F}xj60I˨HJ?z39%Q]~&zUEXŷg~3z!ESV]jV]q!EW!AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP뙅-% \slъJZJ( ( ( (: jZuΖVT.0pO'q's0y*g_QlXLc!$#Ǧ35[D Dsy:^&e?{ڔ]COdlUk Mn!x~HV4\9WRN̝" V޹ʺp'+mbt+JXG *~xv*|E&sɍp7z],]kZQf*Ѐueg+oMPgGyEzO~G/ Ass$r[[O%̌ OZu;.[[,b= e^Owf>{R zSKy 9`He`r#GEX=b`09eQEV]jV]q!EW!AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPM>{ u>t8t<l~{4^ϴW?o B_+V}M^> cLW zO>vV'{YILgɷiW{ |4)AcTGZoB p WғX{Fn.v0X`e=:zVgVgQ^oKʼd?vNI+TqKgXJn+ohZ.]ދu )"w88N:Wx3úyM2\싀[}Emd?l on3pH<GZb,@O]C ՍD2nid jA'wr+>Ѥ7s1Q4DCt=z;;4y$I)@ミ|qqn`ocA#,cEgŹM($zg;G'A}kGvr;Sv q< cE}])}@>Aڟqitɑ'?G֡O>^ⶻ !l4 .Lru'V(’3铫 ϭ{oZ!/0r?>IGwWVR f=q?GBt~ eˑυ> Z{ [ ݈lz#ºM^vA|H6|R9>Ú3HwG%y# ǧ9?g`xO]{dk[L%XA|:NJ۰PwKo XW$OjX=M&`RUprN8ϧ4jA@9mc>GCu/9W|#|quQ`v#PWO3ױ[C^f˼$ M67,p;6_~rb[5ks!G'8g?1 * !#989?WbMgO굤j$+hv6˸o_>`=Q֢o\ i6PC H䃐ֽJLvFC3H0җQӜt??J ylrm+gߊoMt#gh>uYoevkbҘ O:~>4 _i .}'1b2o~9ʬ!ȧiRƂ ^G=zeKhn^AI8#ߵH|r\P_8'5,b6v sB@w6`azq_˧^ t-HjA`σ|DonEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE>QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE?QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEɶGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGȀ X~B w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+[\Iq}k"%#gАJffd^h_t3Oif[A:`X |;qڹo (h4Km@L?^g׾6Ԟ9l稥ln;I##c +JPXD5BŌ83n"Sj[^qc6XqK ,`ų4}i?lѼo{>vwkos4ĶBx$mQ9tMWC(.NPZ4xKBb3c *-36f!7 @'i+.ơB/<hwSۼZuԲ1PdIwnISWA1)Q]"cݒ[6Bv?$c5iwEձLndzg#GJ5a?e:(RAdqgQEQEZ\xQEPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEEI RO gsTd͞,SmW[ *dVw] 4+ JAsw8+N8"cO0?z) F3μc5̒H Y,.RBejIAtL'uҕ0cQ.!4Q!]FHɮw~k5jW\,/u! 3N0@Ӷc#Mn t5kC2?1}k*6?3o$=ST[Tw#'#!2Bq08hZQaJ:~=kJ+*1!z(kp[Y0bc>B2-0 XHǦzshe1Gu-u?qTDR}I?Zx9ar+ NfS:;[4XB>PiMqs瘁rA\3ԎU q3~+jm 1O*U@U69S3֪ <>lۃ+~\ӭg) v1D:. !O-?]٥:&$LybN[OXU&Ip)#u ۀB=ke!Ig3姄uni0jUխƧz]2DNy\;NH=i0bX)'gU@'+tzUVe$7: ͹FXb&9'9zro'?T2CedU#ң7mPǷ>tOJ.xX$ą*iWѯZMRq~" Q׸Ԛ_rdXv+.5IUdp9Juy+(`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEnX]Iew$oCV2\]DMUe<+^E~0FQc'fgاqNpw9lN6Y.X6rA?+6a9<->"DBX3َ,E#g 0M $̀ ȮjҌ3lm,.@%S6Z Bo*u#sVL$+"Q?Ɯ@F[sºM$L[` wO*xjԣ8+pO~{J.U5tp3B9N:{DqzM&&qXO<Ui>w `AL}hRp&rx#k#e !y@&H|2,\@'ebAv)RNI>_[ ꦦF6]{Wix@ns}$SpF GCzf<6zcH7G8猑Uus6dKoC C<>aI{>UQgb*m3Bw9`0DG\{xPc("CcdV%; ewO1ҳlR]*N\+P_&;/a=!db*G0d3Ee!mPW]>N}c$#Y.=6Ty\y3\F OƲ*͍ԖRcqRA+ݝ-ҊRLJiV&)ܻr=nNqsחeHks!=j r33ICZŲ rrF1Y5D((((((((((((((((((((][^i[N>Ir;yoz If N&@ g9 J!#}jYDJ2Aq~1:}*A5CjpCv~PqXQڥN:ČK)H'Ef(M yH8 'ZrD#[ +@ {sjpq4{b(w ^8=WZU[vgsܟsjewo kۧH@{Uk6%m[O„HөjI䶞{[FbkY Ҫ6`RIa`sOJڦxWδH$pG|.w F/$fEx.Wʆ0hb<:u ^}!V:%юW_-&PG̪S4 )GsXguKqnIHH[ ʬrI I c'CXՐLmKb-W=;8jt1ꭅ8d`zsW+X3`\I*. 'h|c`}r$叺bhɪZk ]388֜>C;d7]h_d{:b9#2q ꫃:g5Qy`HYbw:$ZlaFZͣjזj onșἡY%qVuIK$篧Q秱˛ $@[Pz'W"f]$l"kyc9zLM--㑿ѭ-Nv6nߍQt[y0)Vn30#x~#!yL 74Ǜյɵ}-{t#SՑB3{Z/mz3>[X.2F$l%41ͧ4~f6; 27z0{v=8vszo26mutE[>q#:0 mbIpsOxghMgH"ydL ,\{֖S+EB6qp}}x< (n>:p{m,DFZwJˡ6>KYcx%U4Ay [)ayn&yd pAZUj )6H[ݴx33w[G]k;,s-T38|읺3|gm\xkSVWM6ˑ.3's^KGnt:,FW\<'7~,y0!o[Ǡ:{]Ntgױ°;!;ش*zVTgNܓW}Ъs).ʆk9&H.cNx:coԥ#ȊYp01x9㧩W&qIk} EtwH>P< ޺ i.4ϘƄ0OQ}Jd>x;ַ>>)MOз1}0zgRT4;ns$*Cø$=.u!wwPpԌl~y#-dH,S@<'R@y*2*M;b "[[20G o XƯ+GCsLkQ񵾡uKgHOvyBI#mm^fd~]s?5Uoi\U%'s 2D,;:rqInK;9$(OƬ "csmcIW?;,ѥq'c<`E<=JwԟV6D%Oa\p+B]VWf IFE  s8WOvTSCv7'~`*eW~ (Q@e֥e+QErQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}lӚ8$i+קoz҇YG/,H޾jq~bVdP=2xwHtYrҫnFA {Ԣciܕ=W@4aHyNG~ 7[]ʡcBI\e_>í|==)yOsU܈c:h{~!C %G%' 5[}_N^YXu<2r3Мqo>09? CC; n^J2tZS%uЧk{+]3HӦ*B\e-`t . vx`GtG lLANtRDX1\Y90~Vk^kG9gbrI='5e;0v^-Jh3׾kPϤ}F,d()x}kq$ ?T4}VG76eVbAaq=9⹹7ȡ.AQhJQJ((Rq ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (5++_,KxQ\jxv5U&}OcOu㨺Z]5 ޙ%<;k7 t]1a~\1z~LZ5M;" yҺ]wik^ JD|8;wzO=OH3 r^S#Xկ5yK7lh8T5Bf1H,UwՅQTJ(?fWACުQS8)[ &fno#[ X>ʒF[o݉בYw]!NFi'Y (vWtk#GuxVY!@SY+J4r0BOR۩EfKmlAҡ2vh1Qz~88tQ'}rRnp*})'beqMIv+pw ~}1SAsH}Ž:gҕj+s/MVrD`g= 0kNf@AC9=}k5Hs1=z}+zu9b6s)=A)܏²RШQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@I}WYau b 2ێO8W9Z֮4Q.홊~Y$et#FzjR% Lm}v= GR$_/n6=j݀8שSVk숳d@z5oiyYOG^5w;%Ks/. 9=A;(tkgh3fsֽ3~EJ7c:wyGI*GPW*[S^@`Xe{HRJF+3tƲkVШQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@QEzű:oV8 QTvhIծ<&E|Qc98^%Z[nd{zԷ|]^ a?x2:Pi&u,O0CZC A\WFRIԔQZ(((*ΝvW\(庱_Aj>&KyFѶU.tmgUݼ1&m!YQ#mA׷j˹S$͹x'cc%mޟqx}9`qbp+4`2:* @ 3$W6X kc+c"e'suagKߋ5==$RǗ8?OJȲ OA>tKH*F v<kf.ŘrMved8z EWf[[2ij >Y_*MI&+((((((((((((((((((R(\(((x`#+Kq@#QEQEQEQEQE3JbX¶c(TvVқRHQ"L4bF 9;E9,PGӵ)Y; Q):sXuYuˉJ)$8Q\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@QEzQ@Q(? ;MSHX[gVLqHշ/5CY섄rzJNd$C+6᧋ytgԪFX(1'װ<i{HwCQW5-2K8++9$JqF̄:d} J[*ص4< 6pRG"5, ^09ϧ5-8Z<f*<IXDٸJA=;V5jWtm*V9c$(K \9<Jϖ8HǾ-ZڎO 0EX@W-; e[;ʅ4A;~_nT2sW67QGKZm9PzgzϽ[o3ĩCo#f|V'Abc%,}0@|;$Q '$ u2p9u9>&.̵_Sj wGk\؀w4lx ~Y^k (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}|5f!|njԫ4.${8,u c(jΙHmq)VѰtH95bJCB)XjI'Μmu\}?֥4KEk{3Q[lۏV$ՙHucU_J:$llð*eh!E<&x_ 211~FWmA(KLRDA]Ÿb?V^0rm`w*&VU%S&(uA$۞jAђ[c@!9;Xv<)9;rLy<0b*P)c=sV蒌#EJ\8E;Vv1389ib{*qMWCY|]׸[]?6޼ ޾La /1Rgx/lo1$W*`(^dhW9#֬f'qTƙrA q\ /WU]g\cHD{MR}Z?`aQ/sTpf|JxHБBXZZG#`kxdfU!O(z\aYmt=VɆ 16zrpk fഒnrPN>K >aX5 *ֹz|mG6OgByv"˜gy"Nk6B? J).[QP0((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((M(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((N(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ɶGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGOGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGȀ"YiQ%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?‰vy!+ M"ng%p5es5WR,j<3]xS&܋kj>+[2K(467_ẼhWlAPp q&Tp~ӝ5Ǯ6⩠ÚŅb)*)n]iIy5pG Dfu<(cpxO5͉5ʆϯqIe~V@[|*8 d!Xi6ɛp_}ǍuLVrd9ŒY}ў ]qN ѩQߘ܆dN0ǮWn׷*SLh( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (: w-4Awj~$7ӝcXdAҹ+]wV9/? g#W9#u,KzXIvVau=rRGO>51}2dyFSwL3\<: humB9Y~y_xYKRxd$v|+\`_,-u|< PKiK@/`os^}R oH5|U9_YO 0C^AK'CVk]Bh.x&BFTcU)K$&vC՘ƙYIݶER(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((S(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((T(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((U((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ɶ11111111V11111111111111111҆=PXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@YQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ZQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@[Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ɶ\$o@ 0b& JFIFCREATOR: RasterLite2 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br P^<& h4JFIFCREATOR: RasterLite2 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzAB& L/JFIFCREATOR: RasterLite2 C   3 S(& JFIFCREATOR: RasterLite2 C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?X:E@;1~}|{{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.0.4/gdrivers/data/SMALL_ADRG/ABCDEF01.GEN0000644003401500001440000000324613614004466021444 0ustar rouaultusers008182L 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.0.4/gdrivers/data/SMALL_ADRG/TRANSH01.THF0000644003401500001440000000456613614004466021555 0ustar rouaultusers009902L 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.0.4/gdrivers/data/U_1050A.NTF0000644003401500001440000000774713614004466017734 0ustar rouaultusersNITF02.0001 U211F0BE 01224425ZMAR93checks all run lengths on a bi-lev comp at 2DH,1024x1024 FAX imagery. semaphore.U 00000000000JITC FT HUACHUCA (602) 538-5458 00000000407100040400100044300000032240000000000000000000000000IMMissing ID25152559ZMAR93 - GROUP 3 - U 99999901234567890123456789012345678901234567890120000102400001024INTMONO VIS 01RN0C12DH 1 N 00B00010001102410240100100000000000001.0 0000000000TJ% P(ڋ" @PC @Pp(J6hh @jp(J6f @PJ% `5P(ڊJ% P(ڕ J%P$ @jL P(ږP(mCP<7 @iJ% % @UÀ @P\J% Z(J6HP(bxf @Pj @iPJ% (J6<P(u% @ @(J6( @iP(m3P P(IaP(K!(J%IT2 @P  @i@h @i@ @i @f @P P(F 5P(J P(B P(U@2 @P $ @iL2J% aP(m#P P(٩aP(٫!(J%5T2C @PB$ @fHh @fH @fHf @PF$P(٦$5P(٪$P(٢$P(ٵH2 @PH $ @f2@J% aP(lP[ P(ى`P(ً (J%1TÀ @Pl @fh @f @f f @PlP(نl5P(يlP(قlP(ٕ2 @P$ @fLJ% `P(lP3 P(̀ @PP(lfJ% , p(J6r3 P(l fP(@3P(P(j @P0l @g`% @P J%9fP(l0( @g3(J6sP4 P(р @P,P(m hJ% , p(J64 P(m hP(@3P(P( j @P(@l @h% @P J%AhP(m@( @h4(J6P5 P(RՀ @PP(ljJ% , Ap(J6R5 P(l jP(E@3P(FP(Lj @PPl @e% @P J%)jP(lP( @e5(J6SP6P(l`l`P(l lJ% T P( @P4 @P @P 3P( @P(lP(l P(l P(lP(` @PL P% @`l(J6CP6P(f`m`P(f mJ% T P( @P4 @P @P3P( @P(fP(f P(f P(fP(h @P P% @o`m(J3sP%P(f`J`P(f JJ% T AP(͂ @P(4 @P( @P (3P(͆ @P(fP(f P(f P(f(P(͈P @PL @P% @m`J(J3cP%P(mP(۬,P(J6K% @, `J%r%(J6 KP(m@P(m @P(m,5P(ۨX6 @PT @oPJ% K@(J6X @P%`J%sP&P(k1 @P@P(U`p(J5 @PZ% @HJ%L (J5 @P(k`j @P % @&J%0P( H% @P(kJ% sP&P(rKk @E @C @P, J%@P(R.% @!P&`J% @P(r0 @&`J%4P(PAJ%D4 P(0&@J% X% @#P9P({K @ @ڨ @P,@J%@P(R .% @P9`J% @P({0  @ڀ9`J%P(PJ%d P(09@J%@X% @P9P(i`s`P(k sJ% TaP( @P4 @P @P3P( @P(fP(j P(b P(uP( @P`P% @`s(J0 `gdalautotest-3.0.4/gdrivers/data/test_ogr_xyz_float.nc0000644003401500001440000000072013614004466022640 0ustar rouaultusersCDF record lon  standard_name longitude _FillValuelat  standard_namelatitudez  long_name z coordinate standard_nameheightaxisZunitsmint32?@@@?@|||gdalautotest-3.0.4/gdrivers/data/byte_nogeoref.j2w0000644003401500001440000000002513614004466021642 0ustar rouaultusers1, 0, 0, -1, 100, 200gdalautotest-3.0.4/gdrivers/data/dimensions_above_31bit.jp20000644003401500001440000000026713614004466023342 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrjjp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/pds/0000755003401500001440000000000013614004466017160 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/pds/hsp00017ba0_01_ra218s_trr3_truncated.lbl0000644003401500001440000001617313614004466026053 0ustar rouaultusersPDS_VERSION_ID = PDS3 LABEL_REVISION_NOTE = "2004-11-22, S. Slavney (GEO); 2005-12-20, H. Taylor (JHU/APL); 2006-04-05, S. Murchie (JHU/APL); 2006-09-18, P. Cavender (JHU/APL); 2007-02-19, P. Cavender (JHU/APL); Version 2, new stray light subtraction 2010-06-01, D. Humm (JHU/APL); Version 3, shutter mirror correction 2010-10-12, C. Hash (ACT); Version 3, Added data filter control parameters" DATA_SET_ID = "MRO-M-CRISM-3-RDR-TARGETED-V1.0" PRODUCT_ID = "HSP00017BA0_01_RA218S_TRR3" /* cccnnnnnnnn_xx_ooaaas_TRRv */ /* ccc = Class Type */ /* nnnnnnnn = Observation ID, hexadecimal */ /* ooaaa = Image type, Macro number */ /* s = Sensor ID (S or L) */ /* v = Version number */ INSTRUMENT_HOST_NAME = "MARS RECONNAISSANCE ORBITER" SPACECRAFT_ID = MRO INSTRUMENT_NAME = "COMPACT RECONNAISSANCE IMAGING SPECTROMETER FOR MARS" INSTRUMENT_ID = CRISM TARGET_NAME = MARS PRODUCT_TYPE = TARGETED_RDR PRODUCT_CREATION_TIME = 2010-11-02T16:50:55 START_TIME = 2010-04-05T18:15:55.134 STOP_TIME = 2010-04-05T18:18:55.063 SPACECRAFT_CLOCK_START_COUNT = "9/0954958586.04004" SPACECRAFT_CLOCK_STOP_COUNT = "9/0954958765.64911" ORBIT_NUMBER = "NULL" OBSERVATION_TYPE = "HSP" OBSERVATION_ID = "16#00017BA0#" MRO:OBSERVATION_NUMBER = 16#01# MRO:ACTIVITY_ID = "RA218" MRO:SENSOR_ID = "S" MRO:DETECTOR_TEMPERATURE = -64.507 MRO:OPTICAL_BENCH_TEMPERATURE = -55.486 MRO:SPECTROMETER_HOUSING_TEMP = -78.125 MRO:SPHERE_TEMPERATURE = -55.476 MRO:FPE_TEMPERATURE = 2.346 PRODUCT_VERSION_ID = "3" SOURCE_PRODUCT_ID = { "CDR410000000000_SH0300001S_4", "CDR410000000000_SS0300001S_2", "CDR450924300802_DM0300020S_3", "CDR450924300802_NU3300021S_3", "CDR450924300802_SF0300020S_2", "CDR450924300802_TD0300000S_2", "CDR490954950652_BP0342500S_3", "CDR490954950652_BP3342520S_3", "CDR490954950766_SP0342501S_3", "CDR490954958582_BI3342520S_3", "CDR490954958582_UB3342520S_3", "CDR490954958769_BI3342520S_3", "CDR490954958769_UB3342520S_3", "CDR6_1_0000000000_AS_S_0", "CDR6_1_0000000000_DB_S_0", "CDR6_1_0000000000_EB_S_0", "CDR6_1_0000000000_GH_S_1", "CDR6_1_0000000000_HD_J_1", "CDR6_1_0000000000_HK_J_1", "CDR6_1_0000000000_HV_J_1", "CDR6_1_0000000000_LC_S_1", "CDR6_1_0000000000_LI_J_0", "CDR6_1_0000000000_VL_S_0", "CDR6_2_0835294537_PP_S_0", "CDR6_9_0954892830_ST_J_0", "HSP00017BA0_01_SC218S_EDR0" } MRO:INVALID_PIXEL_LOCATION = { } PRODUCER_INSTITUTION_NAME = "JOHNS HOPKINS UNIVERSITY APPLIED PHYSICS LABORATORY" SOFTWARE_NAME = "crism_imagecal" SOFTWARE_VERSION_ID = "2.5.3" /* Targeted RDR Instrument and Observation Parameters */ TARGET_CENTER_DISTANCE = "NULL" SOLAR_DISTANCE = 249195696.719143 SOLAR_LONGITUDE = 73.592714 SHUTTER_MODE_ID = "OPEN" LIGHT_SOURCE_NAME = "NONE" MRO:CALIBRATION_LAMP_STATUS = "OFF" MRO:CALIBRATION_LAMP_LEVEL = "N/A" PIXEL_AVERAGING_WIDTH = 10 MRO:INSTRUMENT_POINTING_MODE = "FIXED POINTING" SCAN_MODE_ID = "N/A" MRO:FRAME_RATE = 15.00 MRO:EXPOSURE_PARAMETER = 425 SAMPLING_MODE_ID = "MULTISPEC" COMPRESSION_TYPE = "NONE" MRO:WAVELENGTH_FILTER = "2" MRO:WAVELENGTH_FILE_NAME = "CDR450924300802_WA0300020S_2.IMG" MRO:PIXEL_PROC_FILE_NAME = "CDR6_2_0835294537_PP_S_0.TAB" MRO:INV_LOOKUP_TABLE_FILE_NAME = "CDR6_1_0000000000_LI_J_0.TAB" MRO:ATMO_CORRECTION_FLAG = "OFF" MRO:THERMAL_CORRECTION_MODE = "OFF" MRO:PHOTOCLIN_CORRECTION_FLAG = "OFF" MRO:SPATIAL_RESAMPLING_FLAG = "OFF" MRO:SPATIAL_RESAMPLING_FILE = "N/A" MRO:SPATIAL_RESCALING_FLAG = "OFF" MRO:SPATIAL_RESCALING_FILE = "N/A" MRO:SPECTRAL_RESAMPLING_FLAG = "OFF" MRO:SPECTRAL_RESAMPLING_FILE = "N/A" /* Hyperspectral Data Filter Control Parameters */ MRO:HDF_SOFTWARE_NAME = "N/A" MRO:HDF_SOFTWARE_VERSION_ID = "N/A" MRO:IF_MIN_VALUE = "N/A" MRO:IF_MAX_VALUE = "N/A" MRO:TRACE_MIN_VALUE = "N/A" MRO:TRACE_MAX_VALUE = "N/A" MRO:REFZ_MEDIAN_BOX_WIDTH = "N/A" MRO:REFZ_SMOOTH_BOX_WIDTH = "N/A" MRO:FRAM_STAT_MEDIAN_BOX_WIDTH = "N/A" MRO:FRAM_STAT_MIN_DEVIATION = "N/A" MRO:FRAM_STAT_MEDIAN_CONF_LVL = "N/A" MRO:FRAM_STAT_IQR_CONF_LVL = "N/A" MRO:RSC_REF_XY_MEDIAN_WIDTH = "N/A" MRO:RSC_REF_XY_SMOOTH_WIDTH = "N/A" MRO:RSC_REF_YZ_MEDIAN_WIDTH = "N/A" MRO:RSC_REF_YZ_SMOOTH_WIDTH = "N/A" MRO:RSC_RATIO_XY_MEDIAN_WIDTH = "N/A" MRO:RSC_RATIO_XY_SMOOTH_WIDTH = "N/A" MRO:RSC_RES_XY_PLY_ORDER = "N/A" MRO:RSC_RES_XY_PLY_EXTND_WIDTH = "N/A" MRO:LOG_XFORM_NEG_CLIP_VALUE = "N/A" MRO:IKF_NUM_REGIONS = "N/A" MRO:IKF_START_CHANNEL = ("N/A", "N/A") MRO:IKF_STOP_CHANNEL = ("N/A", "N/A") MRO:IKF_CONFIDENCE_LEVEL = ("N/A", "N/A") MRO:IKF_WEIGHTING_STDDEV = ("N/A", "N/A") MRO:IKF_KERNEL_SIZE_X = ("N/A", "N/A") MRO:IKF_KERNEL_SIZE_Y = ("N/A", "N/A") MRO:IKF_KERNEL_SIZE_Z = ("N/A", "N/A") MRO:IKF_MODEL_ORDER_X = ("N/A", "N/A") MRO:IKF_MODEL_ORDER_Y = ("N/A", "N/A") MRO:IKF_MODEL_ORDER_Z = ("N/A", "N/A") /* This Targeted RDR label describes two data files. The first file */ /* contains the first two objects and the second file contains the */ /* third: */ /* 1. A multiple-band image file containing calibrated RDR data, */ /* in units of radiance, */ /* 2. A binary table of selected image row numbers from detector, */ /* 3. A table of ancillary and housekeeping data converted to */ /* engineering units. */ OBJECT = FILE ^IMAGE = "HSP00017BA0_01_RA218S_TRR3_TRUNCATED.IMG" RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 256 FILE_RECORDS = 288901 OBJECT = IMAGE LINES = 2 LINE_SAMPLES = 64 SAMPLE_TYPE = PC_REAL SAMPLE_BITS = 32 UNIT = "W / (m**2 micrometer sr)" BANDS = 107 BAND_STORAGE_TYPE = LINE_INTERLEAVED END_OBJECT = IMAGE END_OBJECT = FILE END gdalautotest-3.0.4/gdrivers/data/pds/map_000_038_truncated.lbl0000644003401500001440000001433013614004466023453 0ustar rouaultusersPDS_VERSION_ID = PDS3 /*** FILE CHARACTERISTICS DATA ELEMENTS ***/ FILE_NAME = "MAP_000_038_TRUNCATED.LBL" RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 2880 FILE_RECORDS = 6251 DATA_FORMAT = FITS /*** DATA OBJECT POINTERS IDENTIFICATION DATA ELEMENTS ***/ ^HEADER = ("MAP_000_038_TRUNCATED.FIT",1) ^IMAGE = ("MAP_000_038_TRUNCATED.FIT",2) ^RPC_SCIENCE_USAGE_DESC = "RPC_USER_GUIDE.PDF" ^RPC_ILLUMINATION_MAP_DESC = "ILLUMINATION_UG.PDF" /*** IDENTIFICATION DATA ELEMENTS ***/ DATA_SET_ID = "RO-C-NAVCAM-5-ILLUM-V1.0" DATA_SET_NAME = "ROSETTA-ORBITER 67P NAVCAM 5 ILLUM V1.0" PRODUCT_TYPE = "RDR" PRODUCT_ID = "MAP_000_038" PRODUCT_CREATION_TIME = 2018-08-29T14:32:01.000 SOURCE_PRODUCT_ID = "ASCII_000_038" PROCESSING_LEVEL_ID = "5" MISSION_NAME = "INTERNATIONAL ROSETTA MISSION" MISSION_ID = "ROSETTA" MISSION_PHASE_NAME = "N/A" TARGET_NAME = "67P/CHURYUMOV-GERASIMENKO 1 (1969 R1)" TARGET_TYPE = "COMET" OBSERVATION_TYPE = "NAVIGATION IMAGE" PRODUCER_ID = "IMPERIAL COLLEGE LON" PRODUCER_FULL_NAME = "ARNAUD BETH" PRODUCER_INSTITUTION_NAME = "IMPERIAL COLLEGE LONDON" /*** INSTRUMENT RELATED PARAMETERS ***/ INSTRUMENT_HOST_NAME = "ROSETTA-ORBITER" INSTRUMENT_HOST_ID = "RO" INSTRUMENT_NAME = "NAVIGATION CAMERA" INSTRUMENT_ID = "NAVCAM" INSTRUMENT_TYPE = "CCD CAMERA" INSTRUMENT_MODE_ID = "N/A" /*** OBSERVATION AND EXPOSURE DATA ELEMENTS ***/ NOTE = "NO NOTE TO ADD" SUB_SOLAR_LONGITUDE = 000.0 SUB_SOLAR_LATITUDE = +52.0 START_TIME = "N/A" STOP_TIME = "N/A" /*** HEADER AND IMAGE DESCRIPTION ***/ OBJECT = HEADER BYTES = 2880 HEADER_TYPE = FITS INTERCHANGE_FORMAT = ASCII RECORDS = 1 DESCRIPTION = " FITS header for Rosetta-NavCam uncalibrated images (CODMAC Data Level 2)." END_OBJECT = HEADER OBJECT = IMAGE /*** LINES = 3000 ***/ LINES = 2 LINE_SAMPLES = 6000 SAMPLE_TYPE = UNSIGNED_INTEGER SAMPLE_BITS = 8 SAMPLE_DISPLAY_DIRECTION = "RIGHT" LINE_DISPLAY_DIRECTION = "UP" END_OBJECT = IMAGE END gdalautotest-3.0.4/gdrivers/data/pds/map_000_038_truncated.fit0000644003401500001440000003504013614004466023465 0ustar rouaultusersSIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 6000 / length of data axis 1 NAXIS2 = 3000 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions AUTHOR = 'ARNAUD BETH' ORIGIN = 'IMPERIAL COLLEGE LONDON' INSTRUME= 'NAVCAM ' OBJECT = '67P/CHURYUMOV-GERASIMENKO' COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END gdalautotest-3.0.4/gdrivers/data/pds/hsp00017ba0_01_ra218s_trr3_truncated.img0000644003401500001440000015300013614004466026045 0ustar rouaultusersGGGqgl_azQrlH8 ¢/6%@.d&O[ •,©  i*ir16%L>>rn#;8o1$?[."? v Ôs5ңE=|9 ©ſ V]“Qq?܊ UjK qt?GGGGG3hZ:_DοM3˟i+'l Z׺O Fe@0l\! tM>C 1<0@5=?09¾g e9P>KjqpNf"޿KA_֔*GF?ܿөs.?u1n̿}^?-Y?/_GGGGGU[?0yM@@tY@^?J ɿ*C5?VٮL>}A@S/\Y?o^>=s?êAcB@>@p@`@p?$? @?I"@m?[?@&@]z@& @F@ A?R@l@'@'ӣ@q@,6/;iA@i==8?ң@j E@:f?@:@-?GGGGG??P3?s`?T ?T>0@(@!?w?p?5?no?x[?Œ??X$?64M?Ρ?s_?wf?h`?WM@|@<1?dd@F?%S@=@њ@??9?g5?G?̅?O?O?3?z?q??->h1?A?j??@???L3?<7?9;?!CO?=;?!??@\?;A?ZT??C@?ޱ?(U??Y ?T??\t?N2??]?|? #2?B۾?7?;x?Vx{?> !?GGGGGc?w?ۼ??{?"?Q?Ӽ?/?o,?y?I????/?r+?/?Ti??y??+?V@@P?!?D?%@ds@s?"??r@&I@?i? ?q?QL@?J @w+??I8?^U @׶???5?P?K?=?n?e??۪?R?ʼ?'@GGGGGt@T @@N@n@uƋ@@ݲ@Tw@}@/Ƃ@SO@@@@ߵ@@Pӌ@"@8@R@Z@x@̅@@p@v@@@X@@G@@ @1@m@W@b@5 @| ~@@b@Ev@a@En@@!@4x@@@ @~@@|@WԈ@|@qn@h,z@"@{p@jQ@GGGGGH@碕@0@S@3@#@̏@:@@D@ZZ@n@P]@it@}@0@\n@@0@{@GR@`ח@ڜ@ @Aߜ@@@@@@@@^@%$@x@`@@e@n@ @Τ@X6@=@(@Ě@ՠ@,@@޲@׍@a@ @g@aY@P@m{@Ą@Q@@GGGGGTפ@[@P @ @@@0L@ @,@t@'@@à@@H9@U@H@@ǝ@@@ @υ@@c/@/S@ @Ğ@c@@ۣ@1@ܥ@:@@4@E@.@f@@fբ@@m@3@@C@?@y#@I@@@u@Z@B@H@G@U8@V@@GGGGGBG@.L@Ӽ@T@b @ʹ@β@F@<@L߱@uҳ@g@7p@b@e@@ޯ@UH@@@^@3@+@-@@8@֯@@޴@۶@~@%@ @W @Sմ@%@L@0@@&@8@z@ró@&@$n@_k@k@/i@Q(@w@l@O@7@@@c׸@h@C@ p@GGGGG O@䪽@iU@Y@,Y@M@G4@6@R@d@@T@C@""@3@>&@@C@)ø@DQ@,@@@3@-]@۶@=@Y@$G@@"@ĵ@z@@!@>@M@&@yv@" @7@)@@dK@u@ʷ@(@@)@)3@@̟@2@{@@@ @@m@GGGGG@ @R@@s@@¶@@֖@Z@@"@6@@@W,@@'@@Y@@X@Zh@^@H{@@o@q@@@@t<@y@@@_@/@@:7@|@@$@@X9@D:@B@0@@@}@@#@@A@re@G@Ⱦ@@ @GGGGGi@@ @"@@S@0@.@El@@i@@S@@Yn@@&@9 @k@h@ݕ@i.@G@@ı@m@@@@H@;V@ǃ@w@[@/@$@nf@@@`@OS@&@=@:@w@ܟ@&@ @@@@~p@v@N@<@W0@*@'@r@GGGGGVA9A AA2kA AeAhA~AlAA=ASiA8AAR)AAAA|AOAeA:AATA,AAAGtAHAA|CAADAA*AAr@@@UAAYp@sEAA@@(@@.@w@)@@%@T@d@@U@@GGGGGlAAˠAA;AzAAذA AD A[AAsAv\AA A QAWA!AAyeAAjAAkAAն AmAAAAJAAFAA A8b A8 A AS A7 A AH A+ Ay A} AyA A AO A AS Aq A Aha A jAcA * A}S AGGGGGAaRAA]AۍAqDAAAQAA A(A)AE~AA&AلAdrAAAn1AA.A4A`hAVAAA=Ay'AAxAAcnAwAnAA*AAzAd^AAAWA_A"AQA=AAAfAAyAFGALA-AAA>AnAGGGGG? AfN!AG"AP"A!AL A5AAABAAAęAGACA/|AJAAgAU!Aa!A[ AV Aӵ AX!AAA!A At A,zA: AAA&A;AAJuAA_AAAt&A<AA2NAATA|AT<AA A?AA/AthAAAĻAGGGGGo'AT(ARF)A)A'A&A&A,%A$Ap#A%AF&A &A){%AU%Av$A$A#Ac&A'Z&AJ%A'A'Ak&Ab&A!&A"AU&A&A'A=%AX&A#A"A@"A|!A A, AA`A A' AAe7!A "A[AAAA7AA!Ae!AAgAAA*\ A£ AGGGGG1AV1A3A3A1A 1A0A:-A6k-Ai-A.A-AH.A_.Ao/A<-AW-A+A.A$.A.AT/A`=/AY6.AN.A'-Ax*A-AEm,A.A+A.ALt+A*A}*A+(AKl(A&AH>'Ax&Av )AJU)A%(A+*A)AQ(AA'A"&AyB*A(A)Ax+A<,A;+AT,AԐ(A0'A#*A2}+AGGGGG-A2-A/Aqs/A,A,A+A#*Ai(A(AF+Ad*A)A| *A)A'A)A~ (Ak(Aފ*A ~(AZ*A)*Ao*A*)A(A%A)AF)A}(AM(A)A'AX%A>%Ag$A"Aև"Ae~!A#A#A}#A6#A4$AB%A3R"A%"At#Ad%Au$A*%A'A'AYs(Av|)AN'A )As)Aa,AGGGGG}7A6A9An9A 8A7A6A35Ag4A3AR7A5AM6A5AW4A4A%5A3A6A/7A6A 7A)18AL6Ap7A6A.2A6As46A87A~3A|5A.2A0A2AѬ0A&/Az/A .AD-Aq/A40A-A/A0A-A;+A.,Ax-Ax-Ac?.A70Aws.Al.A..AO,A*At.AV.AGGGGG>=AP>A ?A?An=A2A.:4AV5AK2A/Aq11A4A72A%44A5AI7A06A6A4A8E3AF5A7AGGGGG8EAEAFA#HAFA=EACAbAAXBA^BA'EA!,CACABACA{AAscBA@A^XCAH/DAASDAOFA$FADAFAnBA>AGDABADABAHCAl'AAi>A@?A A)?A=A"@An AA;BA]BAA=A4A;AD9A=x;Ay>AvkAD;AX@A*CAGGGGG+*HAgUGAJAnIIABFAFA FADADA1DAEA?EAUEASEA^DALjAABABADAYFAْGA_GA#HA,SGA~HAO3FA@ARFAjEAdGA!\CAoFA1BA@AoAAz?AkApzeA dAdAUdAbA`AaAU+`AcAw?eAeA@eAfAeA\eA dAٲ]ATeA(eA+eAXbA=dA_A\AP3_A"[AZA]YALXAyTWA=5YAYALWXAYAYAXVA[mRATTAFXAjUAH!VAVYAYA+XA3WA XUAbPA/UAVAGGGGGpApAޓsA{sAo\qAUpAinAjAclAoAlAoAmA@mAaNmAǗlAhAjAliAlAIoA_OoAoAoA:woA6oASlAfA!lAlARpA lAnA"iA fAqhAeAeA `A_AVbbAcAWbAb\`AdAdA<`A\Au]A?bA8^A^A dAeAbAcA_A\AU_AocAGGGGGzA_yA|A}AzAMMyAxAsAtAPtAwAuA?uA!uAmWwA@pAqAKWqAvAuwAxA9xAH~A쯄AʃABA>/A^A>*A ~AeA:}A{AoyAwAzAk|ARyA)xA|A.|AwArA9wA7zAxAuA|K|A{AzAP|A zvAߌrAwAL^}AGGGGGcAqrAQAQAɎA_AMAKAANAԌAԤAA8A&ADA߭A6AlAAA{Ax;A躌A<AAeAwA+AA@AMAbKAcAA!wAAAA A1AcAσAA^1AA*ALAhA^A[eAZA&AZAkAeAAAUAoAGGGGG4AIA3AH AVADA\AA AFA]2AAKAdܙA瀚AtA-YAWAHAwA&A=A?ΜA AyA8A̕A6vA+A UAZAHTAwA +AtLA^DAAgxAܐAAsAAVA8AAAAx#AA8#AAAǒAAA1LATAA1AGGGGG쏥A{A%pAAߤAOAd&AĵAAAACʣAAsA'AAAAeA/A?ߤA(AAiʤAẠAcAĝAF0AUAAA1AAMAzA!AyA2AșALɚAAØA.AϚA֖A^ASĖA A A?[AqAAAHAAԡA\ǕAŘAGGGGG^ANAXAAAATAAaުAAA;\A|Am+AvA.A8A̦A_AAAAFAhAЬAAA~oAﲪA/AFAAnASAS[A:yA"AA{AA-A6AZArAAA}WAAMiAРAAAA{AΠAhAoAAջA[AGGGGG&oAZAA7A 3AA`AMRA;vAiA AAkͷAVA5A%ƲA!AdA-[AAA A$AѷA3ArAǯAAAe޸AxAzAGAAAAXAAmAAu1AG'AΜAڬA'A A⃧AAAUAoAAKAѿA/AYAΔAGGGGGyAAFAA8 AAԿA@ATAA}A}A}AoAA5ATA7A$AAwApA7AAZmA @AAAAA_A@Af,A#A%sA,AqAAAiA'AvA'A)APA|AӶAAAACAAAAAA|A0AAGGGGG6BbB(B yABWB5AAs3AAAA6AtAAAAA4\Ai^AzABWAäBUB5AQAAABIALAWOAvAYAA:YA&AA|A{~A|AAAAWAA A҃A AcAAQHA4AAqA)A_A!AGGGGGDAAFAA[A9AjA*A3AMAdAaA'JAAEA,AhAcAPAY,AnA=AAA'A3 A0A>AA \AARAqA{AǼA AgA̶AKAGABAA㨲AAoAA*%A&A6A$AAA AﭴA˲A׳A~٭AYAAGGGGG:AAAAKA;A A~AAAĻAA©AA)fAɳA*ѸAA~ٶA`*AouAAyAJ7AAAjADZAX5AAA3A~A3AA%AA.RA@AXAA@װAHܰA-AA6(AAAA]OAAAwA5ADAzDAALAݩANUAGGGGG:hAAl>AAwAA|AbAADA}A@AA AsA*NA_AǿAAJ1AAAmAAADAfA&*AAAbAA?BA~2AlAșAQAݶAШAAdvA:ѵA=ATABAgյAAAdAAѲAACߴA=4AVQACA AAAԲAGGGGGAA}A@ArAAAARAdA.AFAA?rAA}A#fANA̜AyA1AA`AAA ATAA3AAAASAA\AxA.7A/AVAs³A:5A9AS A*UAAA1A2AAZӱAAwAoAUA'ABAR1A~AoAGGGGGmAA\Aw=A_A0AAXA[A[AXpAAA-AAA8A7A*ADAOAA?A^AAAPAMA AVAAAAOAlAttAMAANܴAuAAAԑAHA6A=gAկAٲA.AhմAA2jAAA9A1A!A0AݷAGGGGG>AA~AJA[AA$AA5AAAvAA XAAaA-WAFA{AAGeA4AtAtAOAz&AſAGcAoAAAA!AaA AٲA?AyA AAAXAkAhAjҵAA-AqAlAA퐲AޱAзAƶAAފAaAs AAAGGGGGAAGAicAaAsA1`A VA;AAPAu\A]AADAodA*Az~AA1AAA7jAAAIAAFAUA 0AoAhAzһAIA7AӷA@(A|AhAӫA A=AuAAn;AKAA֯AAAAAAAյAAAAtAGGGGGAwAAdA#A~VAA+$AvAAA&AAjrAA)A_ApоAEALA\AIA{AAxAtAA/A~OAAAAǩASAPèA DA.A EA#AGGGGGsA1AAAAAhZAAE~AACAAPA&JAAэAlEAACA2֮A]AUAo׳AųAٴA%6AiAA)AA>A HA1kAïAyA$$AAA}8AAaA߳AAaAkƤAAPAڦAcƠAŞAAܠANA鋢AAA{Ac2AuʤAA~CAAFܣAGGGGG,AIJAyȶA˵AAAAvAAeA8\AA7AYAfAA+fA AAIA,A˰AA෰Ad|AAQAAA&AAAaAAIA*kAУAڳAAsARAMA:ABáA A嗝AF}AvAΠAA A!RAzAA}A|AAA')AGGGGG AAAΥAGA.*AاA;BAWAAtsAAYA|AUA"AIA%A8JA/ATAA{AŮAxA!AAmA{ʬA;A^>AA AA3AoA¡AնA`A̟AaA.rA"HAfSAoAAA}AdA'ӝAAAAAAAdAA^1A}XAGGGGG7AA2AAA@A AAq"AƦAcA A,AAVAA>AAuA注AA`A\oABAzA,lAA!AAAAgAR+A]A,AwApAA=AIAuA:RA:AAAA2A9ȔAAwXAZA.AHvAA1AJٛAJAAA&AGGGGGq!AnPA2AجAnA+SA{ʩAAIA-eAԨABA5AAzBAҥA,ܢAVAkA>AmAA٨AfA{A38AvA'A A;ARA-}AUvA:ARܟA:A AdAAA4#AglAzA-AAfAjUA)ApAbAcA@A႙AA}EAڔAA&A_kAGGGGGA%AA-AAp:AvA A9.AgAAA3ALA۪AAAAO AIɤA7AFޥAABAAklA:IA/A$AAàA/A:A8A՝AiA]]AߖA)AJAǘA1AAa՗AAAGAsAkAߕAAA췘AoA)A.BA~A樒AAGGGGGGA0A0AĨAA@AA[sAAҳAcAnA-`AĢAlA%A:&AAOAXAS٢AvգAAAuAlvAęANACAAԞAc6AeAAࣛAAٖAAGA%GAA,AHAԕA` AAA;AH^AA AFA法AAj|A8AAAsAGGGGG6A_ANA:8A\iAKAAAßAAaA;AN4AAA APA%AfAAwAđA~>A[A˛A~jA]AђA7AvAA3ALښAДA6A|AqA~AjލA ˌAAqA)AMA⑎AALA?A5RAA A歊ACːA13A֎A1̎AשA AA8AGGGGG}AA/AJA&AA>!AAAA=A9A˙A5AA9AAb A=AA`AA!AAFAAA AKŗA2 A ֕AҘAqAzAAaϏALA/AA%IAeAA6A A4AGˈAXA ADۋALAAAGAAfKABAW8A%A_AGGGGGAA6A0AAAAA7ӔASAZA$AnAAAϏAAAȒA4AҔAϝATAmA`AYAƌA}AAAېAєA'AۊAjAAΉAcA8A5ArA?%AG"A1AHAAσAFeAﻈAlAļAZAI'A AΉAALA_AHAGGGGGFyA{A*A#9A;AA8AA?A(ČANAAG6A"AAC-Av@A-AMAAWAA7AAnAeAIJAiAQAĪAAA'A?AxAA_AA1AՀAWAAkA݁AnBA=<~ALZyA~AKAALbAgAA)܃A;AA wAAAGGGGGKŒApAIAoAhčALQAKAՊAÅAA YAnAV}A׌A#AXNA#AlA*AōA'A]AWAA!AhAlAKAW AA$AAm|AۇACAƎAխANAA~Ap΀A1A蕀Aa}A9ApfAzA0uvAyAI~A{AwAxȀAZmA}A=AkAvAlAzRvA8~AGGGGGA\ A늓ATCAGAqAF^A-BA \A態AA^8A{A(AkASQA]AAxA7A\AAxAAoA׊AhA,IA|4AAE-AA$A؂AbA AmARA|AHAAoAU}A*AHсA {AXvAݹzA$A~A>|AAAA%AyAFoAxA~AGGGGG]A~A͍AhAAA1sAnoA[sAxAuuA~qA{A zA6wA>xAnA2eAMmA?tAGGGGGuA{AAJAw}A‰A֜AA AAAA[A=A ۆA ?AaA8A{Aq~A~AlA2mAxӇAkAzʅA;XAA|7AAEYAAAC|AA|AݹxAvAsAUAbZA WASA5!]AiZAXAYAWQAm7IA.QAp5WAGGGGGptrA0tAxAixAsA"sAsA#mAmA~hlAqA1oAsnAmA>mAeA8hAcAijAusmAxmAnAv~oA+oAmA kAƦ_AjAujABwmA eAzlA)dA]A*bA]A ZA;XA&VAeXA:aZAOWAMUAYAZA3TA)PA SA֔XA{UARRAM\A:YAAXA,YAPAL/IAVPA1VAGGGGGnoADpAouAH[tAJrnA>oA-nABhAhAfAXlAiAjAGiAhAhaA=cA_A4fAwiAjAϜjAS~lAjAjAghA8]AfAfAjAPaAiA_AqYAi^AzuYAmVATAQAFSAVASA.QA;TAUAYOALATNAMTAQAnOA$WA_VA}UAKUAJNA*BEA"NAUAGGGGGFkA]lA&oqA,dpAkApmAllA"gAAGAMAGGGGG%cAdAiAhAGdAmdAeA3_A^A+]AsaAS`AN`A`A}"_AʿXAZANVA@]A%`A NaAMaA tbAraAbAq>_A]TA]Ae]A aAQYA?<^A%PXA+PA8(WA~QANAKA'IA%'LAeNA9KAfyIA)LApdNA0GA CAEFAKAhSHA=EAoMACKA,JApKA*DA":AJCA}IAGGGGGe`AbAfA^fANaAaAaWbA ]A'y\Aq[A_A^A]A`v\Ah[A!UA2XATAR[A/]AB^A]As_ACM_A^Aŋ\A2gQAPL[A ZA]AWA\ASANASAtrNALAfIArkGAnIAZKA`HAuVFAJAKA=wDA hAADA"HAeFACA+KA2ASCAF@A~=AEADAeBAx DA;A4AA9AsA5=AAAMOAAAi;A:A>A>t?A:AG5A8A[;A:A8A AAg?A}A4;A8Ae6AEW9A:Am9Ak5A=R9A`9A]4Ap1A4A"9A6A*5A;A9Aڅ8A9A2AV+AH2AC7AGGGGGPA RAWAXA3RAX3SARA?wOA]NAIA7PAFNALENANADVNA?IA]HA]FALAjOA!PAPA;SARAOA)MA-EAVMA^KA5OA GAN@LAGnEAnBACDA AAA^7AJ5AÙ7A*=A6Av6A@Aq AFABFA JAN?A71EA&?A:A==AX9Ay5A4A`^3A6A7A65A6A 2AC6A2Ak.A0A{4A0A`/Av8Ak3A{4A@e3AP/Ae'A+A4AGGGGG KADLA\RA(OAvLAMAhKALhGAEAxDA3IAkOHAJAHApGA?AcAA}iAA/FAIA+JAhJA;IAKAJAFAS>AFAHA IACAaIACA;AA`>A=ACA[HA FAHAHA GAbIA>FAy;AKmAABA HA٬@AwFAs@A:AdA9A2:AW>AA6AsQ8A](8A?AAA, @ACA@@AtBA5HA@Ac6ALAAA#@A>":A:A!;AR:A5A5A:A$k!ENxw]«JfH s9(?ohiu`x?uc'>c9` $՞%Eao6z ~෿z}iVx6<&bmP׿7@Y{xV%?Y5dڱkGGGGG 9> N*8T'ڄ 匷_`*DؚU{soF6$#iBa5Ψ]tuϿj#EJssGQSVeS\qLCf햿kM/?p*gj t0W4/=3<|&an#sm߿GGGGG$W>W@G@}P^?<{ QxU@`>*An@GF?i? V @.@V@@?G@L@]Lm@JJb@^? A/@@3@@oo@uT@M?/ }@&E AڄO@¿ $A)\!?r=A@c[@Ub?"8@3p@A?^:@-W@k֒>GGGGGQ? ?Հ?X? fZ?[d?õ?%SN???*?NǴ?Q>???,?U?a~?5?O???c?~9@H?Б?=@"@8@S??~|?v?pj@ @͓??@ҩJ?K???GGGGG??je?פ??>P?$-W?W$?U >o?Z?U??j?i?5?0?Xb?۽?S ? 1??K?)t?7?3b@?G?~߸?_c?uV?#σ?!=????b??-@[?GH?ךz?6?A+??^?2?B>* ?7W_???GGGGG3*?q???#???@?-??,?;?j?? ?J@@.???R @m@aK @c\@A @?m?ˢ@tg#@Y? @@ @U @w?@c??E?=?c?@:0@S-???D?+?=??9?|?]?7@%?@K?8???GGGGG@v@@@z}@[M@T@@@v@7@xi@҅@Y׏@Ǹ@Ŋ@h@w\@@y@Sv@@@@2@[Ҝ@2Y@<@6O@@y@@!@#@@3@@@s@@D@@@*@@[@P;}@N9@b`@̂l@x@i@ @x@&~@e@$xo@Z@G^@GGGGG=@*ݙ@1@ Ù@#x@cU@g@@e@|@҈@N@p@B@ę@@@E@@l@Rݜ@$T@P@c@ @@s@@6@@@#@a@8@p@B@r@30@@=@T@@u@@ @E@@i@Jd@*@:@\َ@o @@@|@*@{@3@@GGGGGڧ@@?~@s @yn@@?*@@@@@@䮟@u@=Ӭ@~&@@`@3@3@a@B@W}@b@A@@4Ӫ@{@pZ@0@@@@Rש@@eҥ@F@3@Gע@^@(J@n@@(@ף@r@@M@ӥ@㶤@(@U@@@m٦@@@z@،@X@GGGGGN@@%@2ɻ@i@+T@#@۾@@=@@EM@Qp@в@)V@^P@{@Zе@ê@Dx@@Sͱ@L@@j@@N@Ҵ@ı@e@@@@@:@w@س@K@@L@P@8@hn@@N@@Q @ϴ@5@˯@@@eж@~@>@ @ Q@͸@+@GGGGGi@@X{@@V@@4@@@T@@@G@\@G@_@a@ڴ@<@@Ff@"@@[@@@@c@譹@Q@aw@ȟ@U@$@A@.@@@i5@Ȳ@A@%@VD@C@@@O@j@]@m@o@cg@rѸ@F@@固@ ˻@㘸@j@!8@GGGGG~G@(@@t@գ@AA@s@@@^6@Q`@H9@@2@{@ @)J@@)|@%@X@f@+@Yv@@|@U@@@ @@@`!@K@@3 @@K@F@@)@@F@8Y@7m@@@p@@@)@d@@@E@!@s/@ @A@@GGGGG^@1f@f@_ @$@@V~@MZ@@@<@3@@f@5@v@@~@1@@7@8J@k)@M@=@@ A@@@@F@_@I@5.@t@@7@@@`@@b@A@@{:@@@@@ @@@H@a@O@W@ :@V@7@GGGGGP AAAjAAmASAAAAZAqAA9AN AA͸ACAAdADADAA6 AVAk:AAAzA@!AA AxAAA@K@@W@+!A&@ƭ@@ y@A @|@F@:@I@@@@h@@W`@@@JP@GGGGGNA>AAH;A[AA AMAAy A>AAA~AAJA~ AAPA+ACA",A~2AgAAAAKA:)A7Q AA4AAU A. A> Ac A A A1 A9 AD A AUJ A A A AA AZA_ A$ AOh Ay AD AAeA A AGGGGG AOLABA?AAyAjAYA@A5AA.AqAAOAAN~AA}AAAA A AEAAEAFAFAQAA%AVAAe$A@AgHAAuAAAuAAxA9AA AAA0]AAAfA:>A AѴAA3=AA{CACA϶@A1BADA CAm@AllBA?=AA9?AABAiAABABACA#CAnDADA?@A>A?A۹?A@AA=A@AAAtAAo/?A_@ACABAo;?AT?A`>A8Ar4:Aہ5AQ 9A>:A%9A;A]:AX9AR:A:APAy=AT=A:Aj;A_=AGGGGG·HAIAGAHAtFABAAAFBADA- @A,EA[1DAmCA&CA>FAïEAe>A&DA$CA^AAAGGGGG.UA_TAhTAXUATA@PA|NAHOAcQABMA6RA]RAOAPA -UA[iRA%OA1RAOAoPAlwPARASAʈRAvDSA+TAVA?TA3OALA^QAB>OA lOAKAgKA;FA&WHArIA}IAYIA&-HAlFA4FA$.GAjHADABABAZAYAH#YAVAzWA4WAwfWA!XA~TARAdnRA#RAvPA"SASUAkUA;>UA "TAmRA/OAK~PA]nSAGGGGGrAmrAqAqA pA7ElAکiAjAOmAyagAJoA*mAvjAkA_pAMlA\gAzkA iA kA/iAlA%nAUmA3lAmA:oAoA>jA7fAn jA+iAiAb3cAcA#]AlaAijaAu`A)cA`Az`A_Aa_AcA_AZA2\AXJ\A[Ak]Ac_A}G_A2_Am)^AV]A-ZA6\A*]AGGGGGԚ|AB{AxAdzAOxAtA;qAO sA6>vAp&pAuA wArAzrA>wAtAnA2tAvqAfqAqAuBtAuAPuA>sAͱuAF0wA;xArAMnAsAcqAd pAlAjAeAiARjA- hAkAiAgAgAj?iAޱiAudAbAGdcA+cA`A_dAKbgAQfAZUfAdA֯dAb`AXaAeAGGGGGɆAl2ATzAa/A[AmA>A0uA^AD$AA'AA AHMAA;A>ATAAAA0̃A׃AwAAmAuAA(AmA DAA ׋AvA&AAAW^AA-AA_AEAAXJA@A푅AAA.A2ւAsA҂A2|AA A~A=A.0AzA=ăADRA A4A^iAAqMAgAGGGGGAxAeAALLAAtڗAAqAfA]AAA1AA̠A?#A ASA>AęAAAdaAAj͜AbA7A܄A2AGGGGG{bAA(A7aAG)ADA AA6;AiATAOAEAA՗AsA`AdA:AAAAͶAA͵A1AOA AAhA>A4AFAEAAAՖAALAl5AAD-AANAzAtAWuAA"AԤAA7AAA%AA5ARAM8AGGGGGMWAпAAmoA7A^TAAKMAAAuA+AABAp˼AιAAbA<̶AAAOaAzAkAAGA;AAu2AуAA=AkaAAdQAA*AYA:AٯAAA9AFAAAAAHA.AA2A&iAhAoAA_AAGUAGGGGG7AAAYAA:*AuAȽAlAѹAA2A;A/AAAAHAA>_AAսA AAA)AAyAbVAAAAAAA}AA>͵AШA3A ۲AA@A7A5LAѮAAAAAANAA!tA!AOѭAAAAGGGGGpAA/AuARA8A4A-$AAƼA=A"ASVAAAoA.AVAXAJAA8KAFqAlAtAߡA{`AACA6AuAQAGDAA}YA~A.yAjsAeAEAAAA A_AoQArAAlAAA8A2.AAbAA[*AӸAPAaA ACAVAM%A#AeA=AބArABUAڟAA8Ag0A؟ASAj$A AA AAABA7AAAdAA[A+A&A|*AAsA0A/A02A=AWAAAA\0A:A&A)AAAwAiAJoAjjA#rA~A^A+:A߷A;eA A+AAAGGGGGB{BfAVA\[B1AgA HAAYAxAA>AAAYAA>AhAtA Ah8B:=B|BAKAobBV7B9B)AAA %AAAAAA3AA}A3A(AAAQGAAAA`AA"A1AEAAA~AcAmAGGGGG A,ArRARwAAؠAϏAAA%A|AAC#A'ApFAtA6qAKAAA`AAAA;A[AA1A A:!AAAA#~ATAkEAA5A=AA xAAAhA%A^A9A)AvAAAo=AA?AEA_AWAOAyAAGGGGGAA/AqA9 AA{AAA=AAAֻAA_}A>TAA-ZAwKApAMnAA%AFA`A?0ABAuAAA A,AAA٬AOAAxVA=AAPA_AwAyA1AAAAAAAANBA۾AaAVArXAATAGGGGGAjAAGAAk~AAAAAAAvA.AA AA?A־A}OAAAA A_AFӺAAA.'AVAHAAA'^AтArAĜAAgWAA"3A(AuAJnAAAŰAA~A>"AhfAqA=A}AA۰A.A"APAAǬAGGGGG`A8BARAHվA9EAAA-AaAA^޸A A|AIA9AAA!A{AAIA~AB_A6AиAɊAzMAr~A[!A4A=AV&AanAGA8MA*AoʭApAVAAA@AaAɭArpA+7A0A )A鯨A>wAAU*AA@AضAGA2A bAAGGGGG0A ?AC[A7AAp,A;AAA/AΎAhAA{A0A1AD%AALAzAHsAAGAڼAWIA6AdA lA A-qAAy\AּAxAշA汱AkAqA۵A9%AŴAK AJDAncAfAAuADAFAثAӭAGѯAeA]A̯AJAWAUAcխAGGGGGA ApA7AHAA}AsAZAAJ`AA޿ApA,A) A7A.־AAxJAANAuvAA(AAVA AŽAAAwAA\AöAưASAK>AA_AARAGGGGGmAA AlAAcA;AA܋AAFA1AiAAfANAoݫA6AAALAnɰAA@AfAA?AGGGGGƛA޼AA5A]AA6AH!AoAAIXA AAS$AAAAAźA1A AYA"AaAm9AлA`AAAAAA_AAA|AOAׯAAA_cA AAíA̭A_ٯAAZAǧA;AA(A̲AAA'!A6AMAA-A㍷AA-'AauAAAgAyA$AgA7/AA]AHɨAqAJAaAAzA멣A]QAAAnAAbPAaAA0Am͢AUAcAAAGGGGGDA)A"AnݸA饷AgAAGAcUAiAAgA߰A4ApA$A/A1AԮA$AeA0AKAƲA:A*ADA-AAtAxTAAwAAANAA-A\AۥA A7AIAAA>ťAJAaA"A?ȞAAAAUARƢAIAlAAA}A`AGGGGGgAAcA:AٵA?AwAAjAVAcAwAoAmnAPAA/AATAʯAGRAcAA1Ai̥AڥAAꛣAhAzmAߜAYAAA^AmAA'EA+vA0AƥA9ΥA+QAMAA-AܿA[eA AxA|A+&AAA3AأAXRAU|AYA-A"3AfAz AA AAA)AqޒA{ԒATAAJAGGGGGo[A[AڦA¦A&A:AAAFAA8A2OAMA)AoArZAeA7AAZmAAܟAcAA[AtA(AAԟAA:AA:ArtAJA"A0AAf7A9AؔAВAZAA!QAtOAcAC5AَAOAʰAA&AAA>AAAHuAA eAAOnAZA1ۃA'AGGGGGYlA^AAAvAcA;A2AՖAEAGAAACԓAȖAدAAAXA8QAAёAASAxAْAjApAӡAOAVAArA{AAAAঊAA:AAjASAA;\A9eAKArAbAsxAAgA7_ACAŅAAAӴAV̓AGGGGG(AAAWؓAOAAoAAAA/AXAyAϿAA&A?AFA;ЉAAoA[AA{iAA垊A0AAoA'AڄAAfALAAwA={ApA0TA$(AaAA~AFAoAIAc|ATwAxA^BzAwA}AfAIDAŁAhZA As^wAzAhAGGGGGiA^AۍA@A8AApARA$AArA)SA,A\AtA ߋAޅAJA-AAAX'AwAA BAAA\AoAZAtAgAGAA݃Aɉ|AAfAArA&Aj}A ~A }A3ЀAzyAsACtAtAqA ZuAvjyAwA[yAvAzvA#mA-oA1tAGGGGG8{A AeeAIwAzA-AA9AAAA}׊A9AAՆAA+AtATAAA_ASAʁALAAUGAATA`WAQ%AǑAӆA[AAfA$AJ̀AOADAڃAvAAwosA@zA~AyAS{AxA@uAgwAcuA;yArAmAGmAoAYkAKoAtAσrA tAREpAWoAUyeAgAjAGGGGG2AڇA{AYNJAAΆAZA[A(A^AчANՇAَAA(tAӅA*A+WA5A\AtAɄAA`A/ACA͇Ap~AF̃A6ԂAȁA#{A|A>oAsuAXVzAvAwAvuA(rAtAdsAdwAnAYjA"jAkAhA&mArA> qA#rA=goAJoA8eAgA lAGGGGGAOJA׳AoŊA딉A!ARAυAsAA!ArAAڅA\ȈA5 A藀AȄAAvAXkArA6AۆAŅAܸAA AA0FAZAAAV|AT}AqAxAa{AwAxcxA8wA)rAJtAsAܮwA pAkAIjAXkAiAmAqA%pAxqAvnAmAtdA1zfAg8kAGGGGGA*ABAsAņA#AA>AcAH}A,AqA2A-AAُA@zAǸA/-A AA AAقAALځAރAAĀA`!xAKUA~A |AtApvA1jAoAuA1G|A~AJAs~AtA|A@BzAp{A{AC|AK7A A}A}A)ASA |AqA"{APxAwAFoAoAHdA)kAGCnAjA kA3jAfAhAfA8kAa;cAo_AP?_Am`A{]A 8aAJfA}eAfAbAbAZA\A'aAGGGGGENAuAA;́A׀Aj|AgwAfyA=AErA_~AA0xAFbzA^AzA2pAVwA uA wA2wAXxA?$|A|A[yAzAQ@~Az~A5wAYmA)wAbtApsA kAlA#aAgA9WjA;fA hAfAbAj eAcA;gAL`AUD\AS]ALZAp^A bAMaAaA}t^Au^AQUA˲WA)N\AGGGGG_DAA>PAsAkAL{A}tA4uAͷnA(eAmAHkAjA^cA=[cAWA.^AaAH^A/H_A]AZAv[AT[Ad^A4XASAO(SAxVUARAƫVA[A5ZAZA,gXAXAOARAWAGGGGG[tAr vAuAtArsAAnAkA&lA]qA8gA[qAoprAlAnAtAOoAkeAA'lA|jAxkAjA>lAepA+mpAnAenAA/sAbrA-mAJcAttkAAviA$XhAP_A:aAȅUAh\A^A\AI]A~[AXA6YAWA1[A9-UAFPAPALQANA4RAUABTAUARAoRAhIA0VKAsOAGGGGGuAm/vAqtA9tAsAQVoAzkAulA]7pAdAAoAshpA8iAkAxqAxUlAebAhAfAphA%gAqhAEXlA0lAiAEjA~nA.}nABgA^AfAmeAkcA\A8]AʼRA9XA\AXAmYAgXABTA#9VATAXAc3RAENANAOALAfQAEPUA.TAe@UARAQAHAJA*OAGGGGGrATrAՉqApAoA^iAefA7fAjA`AJjAhBjAeAH gAJlAgA^ASeAbAcA65dA(fAyNiAgA=eAޅfADkAեjA͑dAD[AcAEaA`AXAL7YANAETAXA`TAUATAPACRAkQAYUASNA-JAIA:JAHAMAZQA)PAhdQA_JNAfNA@FAHA(MAGGGGG omAnA4mAϏmA+mAgAwcAddAǂjAK _AhA0iA\dAeAolA4gAǞ]A dAaAg1cAOcA:eAgAhAceAdAιiAiAJdA YAsbA`A>%_AwXAXANA :SAWA}SATAPSA QA#tQA PATABfLAU1IAjHAIAzMGA4KAOA,NAMA3+LAKA,$CAEAHAGGGGGmlAIlA2kAAjAKjAdA"aA>bA]fAS[AreAeAF`A)bAHgAPcAYA_A5]A._A_A2`AMYdAacA}aAObASeAIfAxz_AUAx]A\AZAzEA|EAZEACA{GAAPLAKAB+LALfIA9HA4@ACA˔FAGGGGGjAkAIiAs8iAhAbA4^A݋`AdA^[AdAGeAc`A}bAogAaA.YAn^AF]Aۈ^AM^A{_A#dA2cAdaA}aAxeAieAn^AٵVAo^AƔ\A[AAm@ADAGGGGG~fA#fAeA fA[dA_A\A\A+aAVA_AaARc[A]AcA0^A#&VAɶ[A ZAҐZAW1ZA[AQ_A3c_A_+^AV]AbAdaA<[ARA[A-XAНWAePAzPA GAT#LANALAHMA͗LAGAIA kIA LAiEAEAAA^~BAGGGGGMdcAcALcAObAObAT]A{YA{[A^ATTAX^A7_AZwYA[A`Aژ[A1SAS:YA-VASWANWA\XAժ\A`\AswYAZAH^Aq^ADYAzPA:WA5UA#AYAALEA}DA}CEAfBAvAA9A AGGGGG]A1\AX[AǑ\A[A=VARASAWAMAFYXA¬XA"RARTAZATAtLAYRAPAPAFRARAOWA?UA+TAp}TAdXAWARARIA(PA^QA^NA!HAUHA@ADAGA<[DAFADA1@AOAA6@ADAwy=A|9A&:A:A18AHEA`=AA˰?A>A:BAx8A);A~j:AA=;A>AZIAJAQMAzLAUGA?AEA}DACA >A>FAoGAgADGAPHAz4CAP2EA~sJA4GAc>A}DA$?AcAACA!AAGA61FA DAS\DAGAKJAmBA==AKAA'bAA@A:A7A3A,7A;AL8A$8A8Af3AgK5A5AD6AJu1AO-Ar,A/AE+AD1A0A00AW0Ap)Az-Aor#A'&A+AGGGGG[IAHA\UJA}JA\DJAFABAAA>4IAȍAl?AAACABASAALAAEAtJFA,M?A0=A@A AA1@A0:A@ADGTiI5vE  i ` E :  d M6}niF#l'fL}?h8g%P%LoL{)V?xR(a'V  < a !!E!n!!!" ")"H"g""""##/#R#o####$$#$B$_$~$$$%%%8%U%x%%&&"&C&f&&&&'%'H'q'''((8(]((((() )$)A)\)w))))***>*Q*d*y******+++.+G+`+++++,,',<,Q,b,q,,,,,,--+-B-Y-p------..*.G.b.}....//=/\/}///00$0C0b0000011121I1Z1o111111111111111111111112222 2 k w)<s)3q)+p)"n)l)  R)    O)      L)     I)  F)     C(    @(    =(  6(  -(      +(     ((     &(    #(    !(    (   (     (     (      (   (   '  '     '     ' " ' ' ' '    '   !'     "'     #'     $'    %'           &'          ''         )&    +&    -&      /&        2&        9&          ?&          B&          D&         G&     J&     M&       O&      R&      S&         S&      T%      U%      V%       V%       W%         X$     Y$     Y$     Z$     [$     \#     ]#        ]#        ^#          ^#         ^#         ^"        _"        _"        _"     _"     _!     `!      `!       `!       `!        `         a         a          a         a         a        b        b        b         b           b           b           c        c        c             c              c              d             d               d               d              d                 e                 e                  e                e                e              f               f               f            f          f          g         g          g          g         g          g          g               g             f             f                f              f              f            f              f              f       $  f       $   f       $   f      $   f            f            f        f       f       f          f        f        f         f         f         f     $  f     &  f     &  f     f       f       f        f      f!     f! !  f!   f"    d"     c"      b#      a#     `#  ^#  ]$   \$      [$      Z$    Z$      Z$      Z$      [$       [$       \$        \$       ]$       ]$         ]$        ^$        ^$      _$  _$  _$   _$   _$   _$   ^$   ^$   ^$   ^$   ^$   ^$  ^$    ^$    _$ +  _$-  _$-  _$ -  _$P  _$P  _$N  _$-  _$-  _%)  _%(   _%(   _%&   ^%%   ]%%   ]%    \%     \%     [% %    Z&&   Z&&   Z&7    Z&7   Z'6   Z'6*  ['6*  ['6*  [(5)  [(4*  [(4*  [(2    \)   \)   \)'   \) (   \* (   \*   )   ]*  '   ]*  '   ]+  $   ]+  #  ]+  #  ]+  ^+  ^+  ^+   ^* ^* ^*  _*  _)  _)     _)     _)     `)   `(  `(  `(  `(  `(  a)  a+  a,  a-   $a.  & a/  & b0  #b1    %b3    %b4   "b;    bB   cI  cN  dQ  fT   hW! jZ! l]$ n`% pe rj to vt wy ygdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/WIND0000644003401500001440000000047513614004466025236 0ustar rouaultusersproj: 1 zone: 18 north: 4391490 south: 4385100 east: 551890 west: 547000 cols: 245 rows: 320 e-w resol: 19.95918367 n-s resol: 19.96875 top: 1 bottom: 0 cols3: 245 rows3: 320 depths: 1 e-w resol3: 19.95918367 n-s resol3: 19.96875 t-b resol: 1 gdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/cellhd/0000755003401500001440000000000013614004466025777 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/cellhd/elevation0000644003401500001440000000032413614004466027707 0ustar rouaultusersproj: 1 zone: 18 north: 4391490 south: 4385100 east: 551890 west: 547000 cols: 245 rows: 320 e-w resol: 19.95918367 n-s resol: 19.96875 format: 0 compressed: 1 gdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/cell_misc/0000755003401500001440000000000013614004466026476 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/cell_misc/elevation/0000755003401500001440000000000013614004466030464 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/small_grass_dataset/demomapset/cell_misc/elevation/range0000644003401500001440000000001113614004466031473 0ustar rouaultusers0 0 3 27 gdalautotest-3.0.4/gdrivers/data/small_grass_dataset/PERMANENT/0000755003401500001440000000000013614004466023737 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/small_grass_dataset/PERMANENT/PROJ_INFO0000644003401500001440000000024413614004466025247 0ustar rouaultusersname: Universe Transverse Mercator datum: nad83 towgs84: 0.000,0.000,0.000 proj: utm ellps: grs80 a: 6378137.0000000000 es: 0.0066943800 f: 298.2572221010 zone: 18 gdalautotest-3.0.4/gdrivers/data/small_grass_dataset/PERMANENT/PROJ_UNITS0000644003401500001440000000004613614004466025416 0ustar rouaultusersunit: meter units: meters meters: 1.0 gdalautotest-3.0.4/gdrivers/data/product.xml0000644003401500001440000001170313614005375020576 0ustar rouaultusers SATELLITE SENSOR BEAM_MODE_MNEMONIC 2009-03-13T00:00:00Z PRODUCT_TYPE 10 20 30 Mag 8 20 20 1 1 0 0 49 2 0 20 49 3 20 0 48 2 20 20 48 3 biasError randomError lineFitQuality pixelFitQuality lineOffset pixelOffset latitudeOffset longitudeOffset heightOffset lineScale pixelScale latitudeScale longitudeScale heightScale lineNumeratorCoefficients lineDenominatorCoefficients pixelNumeratorCoefficients pixelDenominatorCoefficients WGS84 6378137 6356752.314245179 lut.xml lut.xml lut.xml byte_scanline.tif byte_scanline.tif gdalautotest-3.0.4/gdrivers/data/rgbsmall.tif0000644003401500001440000001265013614004466020705 0ustar rouaultusersII*RxoeHh^Kn$s霛R-Qo?^ERIQ(ɲd8q.vP`X>e{=i؟3%gM |Crl1~]N%Qih?vmDZyEA|=մ@ `5ɴ7oHxbhuM?Mx_Fҡ Dg%5(VjoWSU 9 Kd&)0vt "#qjPE«q+r %ž IZX짎J*`# aq]!))l)Y DFWx|L#]xSlQUΟIW q Y$.;.EEI4$[*@әɈ; !2,Ȋ$ RuPyD: UY,.( ԲJGVWwbP.b'+ht\)UXD*^ NP2Z^q6_ IsEq +1(+B)!氅~!ϟf+؆UU[I)0S10E촻 " B~:mtj]#oZlD'qa?Y߽ ̓Ԍ^G&7StIVmҊ;9 ׆aLd\i:Bk1}sa' h=q"~km3V<˘Yȅ娞%#m|;whPt7eMq(YZle5΄XB9_P1]k$J*٩ć[q;bIvo7n'OD;侟47:}[^%YXz?Le}f,x}ogF@hBjRIm)$I$uxxwvf>μs۝^zCJR>Hn6$< < ~oJiɃ"_f6ہFPDsrT:}"08,!PUe$'taE?-'o8Ki'f]*h! <8n$Mļ"͡>!1O8hQ!L:.xE$]{9p;tAITq'I" D#AU:8i?^seq@ @H"Ȃ#yzY3rhJßd?]*O2xN=v!Q6bXקʊ P E|BE(~_z厥s`)?^HGێz׫etASofFF> @5$gr1!ۖ왾vq$+!% sRLjf*<1&OhJq{=7 fu}1GY{p1ƀ 0m7b[} O6kW+{w,ݠ*&E& *@@;b%,K)o"ߏBJ GbM'1+k7nn-oʵdrfnK\(ꥢ9륏 Rk6Z糵6\Pg q'4|;lwΪ/ÃdN-Au,%hF%;u[ˋl~ư|0V-IS?IakD6T8uMjRc{RQ͓o||ԎNӪ>5U [:﮶埍>syq-0$ZyF1Oۛld~|MQr떜dW# Vi3WϾ|bc&xϦe%̹ )8;=cN/Ro.B~Cz=@!jWFWݥzm,oYIYdϝ>1x lYV\hsͥ7V[j]2+V;;vc!uC|Z^nWV|q̙ "e2-otV;+|>vv˧^ɱ]bo /f"WԾW[Z2pTү~? y'xKoǒe(C{}߹~⛒lɑQRdYvMPf@]߯+9TcgA o=EX4ZX$?-ұq + 63q \W(vMN.$ȃ+c?x4 {EuEcaX^=&^ }zr97&YL=ΈI]߿ c&gT댘wOsvp.{~v80  ~l$|$ @*ByB7fȠ΁1H󋻺DT`K*0@`pWeWJס:OkΡpbӂ!6`~"~ëͤG0Vda#o$9~c}647:$vʎFqunj)[gQL^,P5T[[8`p {Cj$ >:$Bk {@{d&/ҳ\b \%k5UOB 4դ6/U w]/珿,˲=CqUrb#^ɰϿ^!D#<`?m'ibkZ{aaoedyl.4Ϣon;rچD8?{k1Խ&TeE\:tsP$8eǼ@x!>$ fe $ɎǨmMٝ|Q]y07 5]s-whBCrhF1E)Z2WO pq׷nw%X>׏;VS|:7Fu%ouXp^)N[4?<7xUMgwGb/IK85`Z=o_@Q5٬ʭ1'5D3F1Mҍ{ ';]/5LN-_?*|?C0H2K=X]ɝ+٨*+dSkWգ86C+TوRN)傞@Zx:Y]KQ;g0dBer_uwh4(o>-ѹN I$EEgq\@ R$I۬f> yd :t5CO8̛"&oLoJ (7)0dARGRf5sHSɨ ,/uPEZ6MG{9(JRfa;? iVl5$z1]yu-"TƧdĭNuEۏe/q|yJ9pE0[z>ϋdڈ'mŤ^իEYjjqZf?}^G: <_y/WqMQYo?\,,/M+×4iA(ۦ:7$ L H22 2S* 0 Hx/:Pll?Pll?]kF4ӽ6WGS 84|gdalautotest-3.0.4/gdrivers/data/4byteFloat.sgrd0000644003401500001440000000046613614004466021276 0ustar rouaultusersNAME = signed4byteInt DESCRIPTION = UNIT = DATAFILE_OFFSET = 0 DATAFORMAT = FLOAT BYTEORDER_BIG = FALSE POSITION_XMIN = 333.3000000000 POSITION_YMIN = 555.5000000000 CELLCOUNT_X = 10 CELLCOUNT_Y = 10 CELLSIZE = 10.0000000000 Z_FACTOR = 1.000000 NODATA_VALUE = -99999.000000 TOPTOBOTTOM = FALSE gdalautotest-3.0.4/gdrivers/data/test_pdf_composition_layer_tree_displayOnlyOnVisiblePages.pdf0000644003401500001440000000242613614004466032721 0ustar rouaultusers%PDF-1.6 % 3 0 obj << /Name (Layer of page 1) /Type /OCG >> endobj 4 0 obj << /Name (Layer of page 2) /Type /OCG >> endobj 5 0 obj << /Contents 6 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 7 0 R /Type /Page /UserUnit 1 >> endobj 6 0 obj << /Length 8 0 R >> stream /OC /Lyr3 BDC EMC endstream endobj 8 0 obj 18 endobj 7 0 obj << /Properties << /Lyr3 3 0 R >> >> endobj 9 0 obj << /Contents 10 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 11 0 R /Type /Page /UserUnit 1 >> endobj 10 0 obj << /Length 12 0 R >> stream /OC /Lyr4 BDC EMC endstream endobj 12 0 obj 18 endobj 11 0 obj << /Properties << /Lyr4 4 0 R >> >> endobj 1 0 obj << /Count 2 /Kids [ 5 0 R 9 0 R ] /Type /Pages >> endobj 2 0 obj << /OCProperties << /D << /ListMode /VisiblePages /Order [ 3 0 R 4 0 R ] >> /OCGs [ 3 0 R 4 0 R ] >> /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000000765 00000 n 0000000830 00000 n 0000000015 00000 n 0000000071 00000 n 0000000127 00000 n 0000000301 00000 n 0000000392 00000 n 0000000371 00000 n 0000000443 00000 n 0000000619 00000 n 0000000713 00000 n 0000000691 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 977 %%EOF gdalautotest-3.0.4/gdrivers/data/byte_jpeg.mbtiles0000644003401500001440000001000013614004466021712 0ustar rouaultusersSQLite format 3@  - IgtablemetadatametadataCREATE TABLE metadata (name TEXT, value TEXT)BctabletilestilesCREATE TABLE tiles (zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,UNIQUE (zoom_level, tile_column, tile_row) ))=indexsqlite_autoindex_tiles_1tiles __2 bJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222", !A1Q#3Bqr ?˧^ڱEk33G7VAj+&я%o__g-qR6A[-"iyrπ .S4gY<~Vh56MZ[&-2ҷbb'O sL[><bw~3h?V YOyf8#y48+W[Ecݿwty:{u2uH˗Ș"   b /K=/ maxzoom11 minzoom11[/bounds-117.642054029474565,33.8916056659438709,-117.629007764826127,33.9024346042703613 formatjpg version1.1#descriptionbyte_jpegtypeoverlaynamebyte_jpeggdalautotest-3.0.4/gdrivers/data/dimension_labels_with_null.h50000644003401500001440000001414013614004466024224 0ustar rouaultusersHDF  ``TREE0HEAPXdataH8  `/]x@SNOD  DIMENSION_LABELS`????????????????????????GCOLxgdalautotest-3.0.4/gdrivers/data/gmt_1.grd0000644003401500001440000002454413614004466020110 0ustar rouaultusersCDF sidexysize titlesource x_range unitsmeters y_range unitsmetersz_range unitsmeters,spacing< dimensionLz  scale_factor? add_offset node_offset'T@M@P@4@9 ?UUUUUU?UUUUUU22t@tG@G@tt@Yriëŀm˜0J?;>nÆVZÿúùÒo:;@Êæãh)JHĉ ĉ@zz@ĉ`ĈĈĀwXWt@r@QíX :¾² yj5qxvuuv@ojgdaĞĞĞ@Ěěě ě ěĝĝ@ģ `vπ_g8Y_elt}uwą@ċĘ{@ zzuwwvww@w@vEtt@6tuĴĴı@ij`ij`ijIJ@Ĺ`ĀҠ}@yt@ik4@r@tvxz@ Ġ `@ Ģ`ĕ} ĥďī`ğ|}@~@ġ@ `@ɀɠ ڀƠĵġĔ y@wvw@ąĘ@Ħ  à`@`ـ`ـƠ ŠĨķƠ```ķǠހ @@@ į ĀĮ``@@ `݀`ɀ @@`0@@ ɠ@@ ` @ @ @ @0 ` 0P   @`@@``  ` ``!"" "-`-"p"@#!" 0``  `` ` @!P!@-P))"P"`""##. "*p99#-/8 :@/0#`*.:/ # " 0P!! p0!P!0 !"@"".6@=:@6= /P:; ;@>BP>;p,@8F> : ;090@BFPB:/p/0#*#0#""""""""9@"-*@2AP=>@BPFpFFFFFGDGpGpHPF@HF@AG@G@G0;;;<GH HHGFF@@@:::::::3@3PB`B`@B`F@GEJK LLLM0MLPJH K`K JGPIPGIpHGBP;;;=HGGGPIK@IHHG0G GGGGGGG0AGKpKLPIJI KPKPNNN`N0KKpKL`LL KJI@HHPFB;;<@<;`MM`KJJJ0IIPJpKpLL0L0L LLL0KPJJ@JK KJK@NNPO Q QQ NNN@N NMLKJIHGC@< :::3 P`ONNNpN`N@NMMLKPK@K0K KK`KLpMpNNNNNNOPQQ`POOPNN M@LKJPJ H G?>;:.9#0# PPPPQQ0Q@Q0QP NNNpNPN@N0NPNNOOP`PPP OOOP0ONNpNMM0KJPIJGHG`;8:.#""@"0Q`QR RRRSRRpQQ`QPPPPPPPQQQQQP`OO0NPNLK@K@KPJ I GFGGPG;p// #  @ P`QRPRS SpSSSSS`S@S SRRRRRRRR0Q@P OPN@NLKK0IGGGPACpCP;;p; /."@p0`@ O@OPRRSSpSSTT0T@TPT@T SSSSS@RQP NpN0ML0IGGGp??p;;`$;@///@+"Pp0` NO O@P`QpRRS SST0TpTTTT@T SSS R`PNN0LL KH@0A;3/////p/@*p'#@ ` !`NN0N NOP`Q@RRSSST0T`TPTSSS RQON`LKJEG853'$(`-,,*P&# p` 8`9`LMPMMN`NOPPQ QRpRS`SSS`S@RR`QPNpMLPJIG3%0$/P( 'P(.0--@*@#p#`#P$" @(90:pKJKL`M MNPNOpPPQQR@RRRRpRQPPNN@LKPJ0GD0$(/0*++0-P,++/@//3@;..+(-:PHGHK@L LLMNN`O`OPQ@QQQpQ0POPN@MKJ`IG@ ;0/p-P-/P///0/`/3;0<=Ngppħ@0A G@GGJPKKpK`LMN NPNOPP`P`OO0NPN LKIGG;;5`0/`/@/08:/0;<=p_gusc ĊĊ #;;C@GIIIpJPK`L`MN0N@NpO O NPNPN@M KJPHGA;;`6314::86<@=M`Ph@w0ve* ` "p#p5 ;DGIPGHIJLLMPN0N@N@N@N@MLK0IGCA;986608@;09;<=0W``w`v^:܀`"`+;;GGHHIIJKLpMM@MpMMpMLJHGA?P;:988P;p;<0<Mp_iwpw`vS;`"@@@ą@#1p;@;GpGGpGHIJK`LLpLLLL@KPJ@GEA>< :::8P;<= P@`gw0w v<;0(@B@j!-3;p@`C AE`GHIPJ`K KKKKJJJGD @=p;;P;9<`<GpTPckwvZ<5 ΀H@*@ă */7;=AAE GH I@J0JKKJ0HHGGpA><;P;pBDEGHHIIpHGFPAP@:> ::;P<<=` kvjP4`@ ĆķĿ`@ @(*1p6@8;> @BDFGHH0IpGDA0@=P999: ;<= _vvf<#`@@ (--@ p"p*P05P8@;> ?BPD0FGH0HPGGpA08< 88 @8@,6;@=___@<:"@`p'$`,-`5808p@"*P158;p>0?B@DPG HII0HAp904 4P7 `4;P<LVpS?@#` ``  089P9:`9p:7 "*p15`80;>P@BDpGI@IIGA :006p`p@4@Ġ7 6:<DGAp:#` )p1014::pEEPEB;;;p@"#`, 269P;? AB0EPH0IIH0G@<6`k-DĔ`69;<0GP;$`+@&094:>@BCBC D C?;;!@"`)/590;p>AAD`FIIHPH@G@75@Ě(+Ć18;<G@FA6`:>`FFGCC0EFGpGpFP@<:P!+0@6p:;p>`@@ADEGGH0HpHPJ@P/P0f@#B`659;<@BH FEFPGJGGGGHGHHF@<9!P) 1:; >@A`AADGHpI0IJJJPG`?7``'@HĽ`"`7P5;<0<GKLNOOMpHpHPHH0H HH0GFB<@<'P/:;PAPACDEGI0JKpKKLGH97@ĨP9;3KpOTPT@SSR@PK@HH`H@H0H H H@GE`GG-4;PApAEPF0GHH`KMN`NPM NF@8 @`9APSYZU0UVPTTpSRNI0HpHH0H0HHHGGI 0p9>AEpGH IJKN NPN`MNF?8@ĉ ĆĜ à9@RYPa`]ZUUTTT`SNJ@HPH@GHH@GH H J2:@B`GIPJKLN NONMG@E8`ĆĂĜ@ĉ9QPW@_`0c ``^`ZWUpUpUT Q`LHHPHI@I`HHPK@N2;ApEH@JL MN0NPO@N`LK`F9 `̀Ć@ĪĮ@ 9QY0Y0XZ^p^^^p][YPVPU SR O`L`JpJJK@KpL@N N 1@;CGJ@L0MpN0NPNNN J@G?80 @8Q^_YXZ[[\]0\0ZYPVU0SSPQPON@N0N@NPNPN@N0;GHLN NpNNNN0JH @>1  9PQ^_``\[[[[ [[YX0UTT TSPRRTTQOPO NN@/p;GKN0OPONN0N H`B(#)(0&p8pGY``e`p]P\\P[ZPZYXW@U0TTTTT`T`T@SR0P ONN`$?HpMPR0RR@PN0HB P; 1+P+9 ;`JpTP_pa` \] ^p\ZYYYXVUPTTTUUTpTS QpP`ONNpgdalautotest-3.0.4/gdrivers/data/C3607614_truncated.NWS0000644003401500001440000001207413614004466021775 0ustar rouaultusersBEGIN_USGS_DOQ_HEADER * QUADRANGLE_NAME "NORFOLK SOUTH" 3.45 or 7.5-min. name* QUADRANT NW quadrant indicator if cell size = 3.75-minutes* WEST_LONGITUDE -76 22 30.000 signed deg min sec SDDD MM SS.SSS* EAST_LONGITUDE -76 18 45.000 signed deg min sec SDDD MM SS.SSS* NORTH_LATITUDE 36 52 30.000 signed deg min sec SDDD MM SS.SSS* SOUTH_LATITUDE 36 48 45.000 signed deg min sec SDDD MM SS.SSS* PRODUCTION_DATE 1997 6 26 yyyy mm dd* RASTER_ORDER LEFT_RIGHT/TOP_BOTTOM video display order* BAND_ORGANIZATION BIP single file or BSQ, or BIL or BIP* BAND_CONTENT RED black&white or red green blue* BAND_CONTENT GREEN black&white or red green blue* BAND_CONTENT BLUE black&white or red green blue* BITS_PER_PIXEL 8 radiometric resolution* SAMPLES_AND_LINES 500 7631 number of columns and rows* HORIZONTAL_DATUM NAD83 primary horizontal datum* HORIZONTAL_COORDINATE_SYSTEM UTM * COORDINATE_ZONE 18 coordinate system zone number* HORIZONTAL_UNITS METERS coordinate system units* HORIZONTAL_RESOLUTION 1.00 pixel horiz. ground sample distance* SECONDARY_HORIZONTAL_DATUM NAD27 secondary horizontal datum* XY_ORIGIN 377054.000 4082205.000 coord. of upper left pixel pri. datum* SECONDARY_XY_ORIGIN 377021.063 4081986.163 coord upper left pixel sec datum* NATION US nation code* STATE VA state fip code* NW_QUAD_CORNER_XY 377454.607 4081888.326 XY coords. of pri. NW quad corner* NE_QUAD_CORNER_XY 383025.134 4081809.915 XY coords. of pri. NE quad corner* SE_QUAD_CORNER_XY 382929.876 4074876.254 XY coords. of pri. SE quad corner* SW_QUAD_CORNER_XY 377354.810 4074954.614 XY coords. of pri. SW quad corner* SECONDARY_NW_QUAD_XY 377451.631 4081685.495 XY coords. - sec. NW quad cor.* SECONDARY_NE_QUAD_XY 383022.293 4081607.082 XY coords. - sec. NE quad cor.* SECONDARY_SE_QUAD_XY 382927.037 4074673.586 XY coords. - sec. SE quad cor.* SECONDARY_SW_QUAD_XY 377351.836 4074751.948 XY coords. - sec. SW quad cor.* RMSE_XY 1.20 doq horiz. accuracy* IMAGE_SOURCE "COLOR INFRA-RED FILM" b&w, cir, natural color, other* SOURCE_IMAGE_ID "NAPP 7688 123" source image id* SOURCE_IMAGE_DATE 1994 3 22 source image date as yyyy mm dd* SOURCE_DEM_DATE 1997 6 26 source dem date yyyy mm dd* AGENCY "WESTERN MAPPING CENTER (WMC)" oversight agency* PRODUCER "WMC" producer/contractor* PRODUCTION_SYSTEM "DV2.6.3 10/9OV2.4 5/95" production system* STANDARD_VERSION 1996 12 version of DOQ standard* METADATA_DATE 1997 10 18 date created or changed, yyyy mm dd* DATA_FILE_SIZE 144244800 data set size in bytes* BYTE_COUNT 3680 header byte count* END_USGS_HEADER * F\}>Xq9R[4HF)?:8+0)&'&%$$#$-%D(b /k;O9). #'7,Q*P0W3]&Q% ':/C;:O?H]IVkYexepxxtRn(=Z 5)!(/2, 9:0'$&&!!"!#"#%,7*:2*;/"4&'< :R Sp^|Wx 0R' !!)Q$>grH ;c- 1ihƾݡd.nYyZ{_y(Zr^{d fVkax!qwnc~Yt*YoVgxʦoJgB\C[cWmT9y)l!gg{b}9izim^q@5L+0H3SgMKNZjifkpngkllrwwukSp@Se]nv}yklh]X;1T/O)EW@htH7d&AW<;JgKS_cU`FX?TEVX[fj_kUfMaE\N^Yj]lZf[p_hac`_ZZtTZX?KD6@2+8.'+4"&9 44' ##!!"#" #/&>(X.X1?,#/ -!# & $! . *! '"# %+ 1+.% ! %+F/a,;d1CK%?0"  # /.3- ."&  "H)q:7a9=D$:&2 ' '3 5,''" ##(.'-9$4 * # $ & ()')<)?)8+9/?37 44) )1 2&** # ##&"!$%#- 0>-=G6AJ:I\1>S,D6+" &3(B%@3 ,'$$$$# /6(%$ # , ) **(2+$  %:"1LAFTFN_FRmER|CT A'triggerggi_test_metadata_geometrytest_metadataCREATE TRIGGER "ggi_test_metadata_geometry" BEFORE INSERT ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT type FROM geometry_columns WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; ENDB A'%triggerggu_test_metadata_geometrytest_metadataCREATE TRIGGER "ggu_test_metadata_geometry" BEFORE UPDATE ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT "type" FROM "geometry_columns" WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; END ee$aX A'Qtriggergii_test_metadata_geometrytest_metadataCREATE TRIGGER "gii_test_metadata_geometry" AFTER INSERT ON "test_metadata" FOR EACH ROW BEGIN INSERT INTO "idx_test_metadata_geometry" (pkid, xmin, xmax, ymin, ymax) VALUES (NEW.ROWID, MbrMinX(NEW."geometry"), MbrMaxX(NEW."geometry"), MbrMinY(NEW."geometry"), MbrMaxY(NEW."geometry")); ENDaA'ctriggergiu_test_metadata_geometrytest_metadataCREATE TRIGGER "giu_test_metadata_geometry" AFTER UPDATE ON "test_metadata" FOR EACH ROW BEGIN UPDATE "idx_test_metadata_geometry" SET "xmin" = MbrMinX(NEW."geometry"), "xmax" = MbrMaxX(NEW."geometry"), "ymin" = MbrMinY(NEW."geometry"), "ymax" = MbrMaxY(NEW."geometry") WHERE "pkid" = NEW.ROWID; ENDYA'Striggergid_test_metadata_geometrytest_metadataCREATE TRIGGER "gid_test_metadata_geometry" AFTER DELETE ON "test_metadata" FOR EACH ROW BEGIN DELETE FROM "idx_test_metadata_geometry" WHERE pkid = OLD.ROWID; END aaNxP++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)AAEtableidx_test_metadata_geometryidx_test_metadata_geometryCREATE VIRTUAL TABLE "idx_test_metadata_geometry" USING rtree( pkid,AAEtableidx_test_metadata_geometryidx_test_metadata_geometryCREATE VIRTUAL TABLE "idx_test_metadata_geometry" USING rtree( pkid, xmin, xmax, ymin, ymax) KK7tableidx_test_metadata_geometry_nodeidx_test_metadata_geometry_node CREATE TABLE "idx_test_metadata_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)'MMAtableidx_test_metadata_geometry_rowididx_test_metadata_geometry_rowid CREATE TABLE "idx_test_metadata_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)/OOMtableidx_test_metadata_geometry_parentidx_test_metadata_geometry_parentCREATE TABLE "idx_test_metadata_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) 99D 4C4´B4C4´B   ]>JFIF;CREATOR: jpeg-wrapper (using IJG JPEG v70), quality = 75 C V0JFIF;CREATOR: jpeg-wrapper (using IJG JPEG v70), quality = 75 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222R" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz %test_rasters ?(I ( ( +CMҥ$:\7ZE/r9 qgԹ3z ׭ۿ2&zyv[vv)6i$"Fvޝ:@<91$HN2J2!xtYP^5BEr[C4niMu{&1 BXF13^S3ErBA+&Χylaݏړ?Zt/>|uId-#{d曓]x8#"b=vLyv6~g pXd6ȃw5**){O!Dנd n)t#5*9b2ebh>7dZNq,ʦ/C^$4hZK{a&|^ݏ֫\&}iSKEJ2XMhZh dحܜbƕ2zLőA?*tDY?&}G4" "+me91\ I>I[hRZv Rd,H 1讇SҠqE VJ穦QE0ފ;\rTa.-Qwr+*Ѧ UTjv^F} Odsp 3 d銷(I7ӐdR|v[+Ih-62*M#PbaAoCo#bp\m˂O_r(oKϧv}iJr9 zV7qhP}Y ki}BI+):WýS ;V{3];'?JWs[Wpg= 8孼ߧֳ|FI_`*yj-fD9On.g[X 9WRIXs5&ݦ_DL$XW+x-$jI|W2ޗ9/?)7^^r|Iϩ?Z0jڶmI6̓ӐzZ|GXӯm2` *A56W q,30-PI/qux$x #jO|7}wcsf'j= `F?E,$ɒق EH-fU%HL *=@txuV9ɕ:"_~wi}α(\抈>db{il㣩ǵAEtX!˱cM6)TrZ PQI}˕8_nJӬh&a=b[d 1^RDgg#.2כjq491o!c;r5iwFʁ꿸Yȧ3lvsSeTy!>1Zvk*0@MVby 0[WRs`#E%шo^-.̃&:Y^I kNZAΞbywڪQEuYXaEIp;@pH%( sH =ܰ*F{ѡB*[_]7wHB΃ֲMim]mTsW74DZW$\A;ՔOY_-3,r8cm%I;(sTNHEwlm>bEd9mnkuS)#|h>'f{e; 5<_\cvLJ VEʅWճ=ES?$5p57(s^[o*[k?(S+5i'e ƫ1Ӝ?xoxï_§h",җ+{5wC^c*#cpk:fgw=/uh&2G}oSH‹uyqBjLbTthE'e IjaznZUWPNx>ZSӚז Czl=|ǔeH=>걽R/ZurF|qN>y3M(wmAWfv02r;W$Ҵ."T[rU*ssM9QE+r=jJ(ފ;\rRqQ]W)cmPEPEPm2ïJmz;SlXrhJ3w{ 0VsBXPn 9X2W^U$$RqΥELV$hę黷P1]Eaz32E6m`C}5vVJ{] IPQE@8ҧ8}MZSGxԶ6p}zu5V!p\U9NBQT}X<#xs_>x{Xn#VWWՖ=.jȥw{[R'ULOz>qY I.|噏?r)Zml5{3yoH'=y\ϫZ$ր}躑?ZƚT8 э7G˷h4ev7Z3|_3ԭmYhq^_CdCpz`u53oaM-ȁY.][-kzHWc@'yg Wn9ZUw(܌s]W5giA"@XV땩!"ȼ2ASz_u10iz^o-ɸfiI{kUåʲ yֱPTרvJU U]v #dX}ƹRO@qV&ZF =qY7-KT@S\Dc4biKmRBUiI_uge*)rBRzRR㞴H?ހE=G$zL{Gz+P7 sIJ:(yC?%(8撀 )F;PEPEPڴkt"W!#S \,: ͭ &Z\2>EZm1MJڌ p8玔0qF19ES((,E6!G#*ѯ 7.?Ͻa3'(!%xɚRV08WJ5,ZN;cHeQU 5O<8mOWyj8#XFJ ƟH$+1M6Zp䂉H($`0{>Zjֳ[&0OuIn2UR-WqV=*Ig?{k6s^F2uN5!yj,*+Ե[hׯWmK"դwBXkg;@p+\->gi)XܷAsy/n+sh]jsyaD#VuvӌܺgQZ((%G O#]|-?m*2vzII?.dQ:ɸCqpk BX$ڼV"wpm NLN-L)#k̈́@4tZŬV:j`ΪrlZUjF=gRZ)ce%IERE5^@8@Iq^tz׳B|H.}>`Fhҕܻ=MlHÍ3E'z+C$(((()TIEtR`v\λ-FmHKn+M)Bw8}i/@61 Jjխʍc5}\Y'\FA+wiBKI4J(Ḧ̨2 Pq@ EP]EmYO-v2W/ED*2q5UƽVuSTUQJ'P(e+㑞Q@Q@z.teu_!cl|NwV.fRkc|gb_Ǒ#ێ+vu9Ā1c/~܏¼1 gW ˍifu^ chPH͂@-kqNijm¤ɖPqӚuc Vc)H,rENQފP( ( ( ( ( (;ot:[#YH@\Ưquw-nv:T :QQ¶1IE`aBTTTQ@Q@?s oseQEQEQET`1WES(((vޒPxx4hz(EsEWA!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP{Gz+P)UAXu(AaShQMhE6=Xu(AaShQMiE6=Xu(AaShQMiE6=Xu(aShyQMiE6=Xu(AaShQMhE6=X;E test@ E3@ E3test? E3? E3 e?t)'%indexidx_resolutiontest_metadataCREATE INDEX idx_resolution ON "test_metadata" (pixel_x_size, pixel_y_size)%%Mtabletest_rasterstest_rastersCREATE TABLE test_rasters ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, raster BLOB NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)>++3tableraster_pyramidsraster_pyramidsCREATE TABLE raster_pyramids ( table_prefix TEXT NOT NULL, pixel_x_size DOUBLE NOT NULL, pixel_y_size DOUBLE NOT NULL, tile_count INTEGER NOT NULL)   $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222T" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?*`2B}Vw.^XayڵW2KYVXm+5[{2q>uw5N=]Vx crdrW>JM;6 ?I{!םzWB [˞Ic1r}?A=6%{t>¼+89w\@q42[xðZ# ]7?SQRMw0IEQZ-kX1Rn԰1x.ga$[m/$p\8Xw'V®̈ڧ. @#}] zlƑ4Oj5v4+iX$J7^<~T{WX*N4xwNͧEz6y _M0qˏNEy- %E )MiwS["d:?:ƫ&5܋=Okc}7_5PJa\01@Z`MԖ-qs a>~e##sޭEt.4g7}*cVV8QJØon{Y~r>׏a4[ۨck>ƷV/mwN=+̴wRtԫ?­6vb/ pvkiL"|S#{TZ{dKb+=+1q U`toJ$1h2."bGY3@)S0ÜwWNA7{ )*1h.8QEb{eeBA qH1T͋F4V@wvw8cIzRҖ`cmbzQEQGC@ޏd7 qȊ=B=iu@^&.xj}:t%%Wx_6}좼GmryҠp ]$ש+c,!52P¼Zػ50OQXץaʙpKIŭ zL qĠ9?Vi'+uf9&N%/}(5^;mB)e*r+*zP,1@SgcZybiNJ.\%𮓪Z[|:_xψ4uH%A)_M)G݉ /i@AXPRwE՜'0=JIkLZ(QEQE~Uvh<EK`0{`( g# S1A GRD VH IW IW 2015-07-05T06:42:41.504840 2015-07-05T06:43:06.503530 6672 36512 002 0.000000000000000e+00 2015-07-05T06:42:41.504840 1.647904068231583e-01 2.020377069711685e-01 false 3.185296058654785e+00 3.078083992004395e+00 false 0 false 0 false 0 false 0 false 0 false 0 false Nominal Extracted Extended Tapered false 7.140222787857056e-01 4.536430973920501e-02 -1.195062041282654e+00 1.353480175741255e-01 false true 1.647904068231583e-01 true 2.020377069711685e-01 true 1.034831047058105e+00 true 5.124999955296516e-02 true Data Analysis false 4.992516e+01 0.000000e+00 4.220596e+01 0.000000e+00 true true Descending Fast-24h -1.666233808192185e+02 Ground Range 6.434523812571428e+07 5.405000454334350e+09 1.590368784000000e+00 IW1 2015-07-05T06:42:38.408299 2015-07-05T06:38:03.712181 2015-07-05T06:38:34.261984 1.717128973878037e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7045 0 0 0 0 0 0 0 0 0 0 0 7045 5.823674372819869e-04 9 16608 8 1 4 256 FDBAQ BAQ 5 Bit Decimation 1.166961908029398e-03 5.659000000000000e+07 6.434523812571429e+07 36 -4.000000000000000e+00 5.240481033595628e-05 -2.825153419637256e+07 1.078230321255894e+12 10 2015-07-05T06:42:39.536682 3.724284919605149e-04 2015-07-05T06:42:39.536682 1.029180388041683e-04 2015-07-05T06:42:56.086349 1.016125808954434e-04 2015-07-05T06:38:02.959763 Normal Pointing Mode false false false IW2 2015-07-05T06:42:39.351800 2015-07-05T06:38:04.544380 2015-07-05T06:38:35.094076 1.451627112193990e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6.888821458346830e-04 8 16608 8 1 4 256 FDBAQ BAQ 5 Bit Decimation 1.166961908029398e-03 4.835000000000000e+07 5.459595962181818e+07 44 -4.000000000000000e+00 6.199592966536363e-05 -2.415503791125222e+07 7.792817275120481e+11 11 2015-07-05T06:42:40.369367 4.437491209739135e-04 2015-07-05T06:42:40.369367 1.423215540491502e-04 2015-07-05T06:42:56.919020 1.411226641329743e-04 2015-07-05T06:38:02.960234 Normal Pointing Mode false false false IW3 2015-07-05T06:42:40.307633 2015-07-05T06:38:05.622413 2015-07-05T06:38:36.172205 1.685817302492702e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5.931840885257075e-04 10 16608 8 1 4 256 FDBAQ BAQ 5 Bit Decimation 1.166961908029398e-03 4.286000000000000e+07 4.691840280000000e+07 68 -4.000000000000000e+00 5.339056426703426e-05 -2.139431040091632e+07 8.014509490705804e+11 12 2015-07-05T06:42:41.448260 4.233946343970601e-04 2015-07-05T06:42:41.448260 9.154190559956572e-05 2015-07-05T06:42:57.997912 9.047622567407600e-05 2015-07-05T06:38:02.961093 Normal Pointing Mode false false false 2015-07-05T06:42:41.504840 2015-07-05T06:43:06.503530 2015-07-05T06:04:08.728528 2015-07-05T06:38:02.804289 Slice 12 1 2015-07-05T06:38:03.712181 2015-07-05T06:38:34.040986 2 2015-07-05T06:38:28.536673 2015-07-05T06:38:58.865478 3 2015-07-05T06:38:53.361165 2015-07-05T06:39:23.689970 4 2015-07-05T06:39:18.185657 2015-07-05T06:39:48.514462 5 2015-07-05T06:39:43.010149 2015-07-05T06:40:13.338954 6 2015-07-05T06:40:10.592918 2015-07-05T06:40:38.163446 7 2015-07-05T06:40:35.417410 2015-07-05T06:41:02.987938 8 2015-07-05T06:41:00.241902 2015-07-05T06:41:27.812430 9 2015-07-05T06:41:25.066394 2015-07-05T06:41:52.636922 10 2015-07-05T06:41:49.890886 2015-07-05T06:42:20.219691 11 2015-07-05T06:42:14.715378 2015-07-05T06:42:45.044183 12 2015-07-05T06:42:39.539870 2015-07-05T06:43:09.868675 13 2015-07-05T06:43:04.364362 2015-07-05T06:43:34.693167 14 2015-07-05T06:43:29.188854 2015-07-05T06:43:59.517659 15 2015-07-05T06:43:54.013346 2015-07-05T06:44:24.342151 16 2015-07-05T06:44:18.837838 2015-07-05T06:44:49.166643 17 2015-07-05T06:44:43.662330 2015-07-05T06:45:13.991135 18 2015-07-05T06:45:08.486822 2015-07-05T06:45:30.540796 5.336495919679645e-03 Detected 16 bit Unsigned Integer 1.000000e+01 1.000655e+01 1.496479475961005e-03 4.864863102995529e+02 256 167 2.746961180000000e+02 3.901775013707726e+01 4.992516e+01 0.000000e+00 4.220596e+01 0.000000e+00 true true false true true true true Data Analysis Range Compressed true true true false Nominal Extracted Extended Tapered IW_Default 2015-07-05T06:42:39.539870 IW1 23802 16522 2015-07-05T06:42:40.372073 IW2 24072 16654 2015-07-05T06:42:41.450110 IW3 19722 16709 8.000000000000000e+05 WGS84 6.378137000000000e+06 6.356752314245000e+06 true Only Echo Lines Auxiliary Downlink 0 0 2015-07-05T06:42:41.504574 5.336495919679645e-03 0 0 3.963321617250224e+01 -8.035000702098266e+00 1.418532666303217e+02 3.051238123584880e+01 2.721939289535370e+01 ././@LongLink0000644000000000000000000000020400000000000011577 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/annotation/s1a-iw-grd-vv-20150705t064241-20150705t064306-006672-008ea0-001.xmlgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/annotation/s1a-iw-grd-vv-20150705t064241-2015070000644003401500001440000006324313614005376030306 0ustar rouaultusers S1A GRD VV IW IW 2015-07-05T06:42:41.504840 2015-07-05T06:43:06.503530 6672 36512 001 0.000000000000000e+00 2015-07-05T06:42:41.504840 2.288428992033005e-01 1.594403982162476e-01 false 6.914044857025146e+00 7.035089969635010e+00 false 0 false 0 false 0 false 0 false 0 false 0 false Nominal Extracted Extended Tapered false 6.794388095537821e-01 1.014419215858088e-01 -1.273414492607117e+00 1.229467236682559e-01 false true 2.288428992033005e-01 true 1.594403982162476e-01 true 9.827942252159119e-01 true 1.245751976966858e-01 true Data Analysis false 1.111872e+02 0.000000e+00 8.847974e+01 0.000000e+00 true true Descending Fast-24h -1.666233808192185e+02 Ground Range 6.434523812571428e+07 5.405000454334350e+09 1.590368784000000e+00 IW1 2015-07-05T06:42:38.408299 2015-07-05T06:38:03.712181 2015-07-05T06:38:34.261984 1.717128973878037e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7045 0 0 0 0 0 0 0 0 0 0 0 7045 5.823674372819869e-04 9 16608 8 0 4 256 FDBAQ BAQ 5 Bit Decimation 2.252213143258578e-01 5.659000000000000e+07 6.434523812571429e+07 36 -4.000000000000000e+00 5.240481033595628e-05 -2.825153419637256e+07 1.078230321255894e+12 10 2015-07-05T06:42:39.536682 3.724284919605149e-04 2015-07-05T06:42:39.536682 1.029180388041683e-04 2015-07-05T06:42:56.086349 1.016125808954434e-04 2015-07-05T06:38:02.959763 Normal Pointing Mode false false false IW2 2015-07-05T06:42:39.351800 2015-07-05T06:38:04.544380 2015-07-05T06:38:35.094076 1.451627112193990e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6.888821458346830e-04 8 16608 8 0 4 256 FDBAQ BAQ 5 Bit Decimation 2.252213143258578e-01 4.835000000000000e+07 5.459595962181818e+07 44 -4.000000000000000e+00 6.199592966536363e-05 -2.415503791125222e+07 7.792817275120481e+11 11 2015-07-05T06:42:40.369367 4.437491209739135e-04 2015-07-05T06:42:40.369367 1.423215540491502e-04 2015-07-05T06:42:56.919020 1.411226641329743e-04 2015-07-05T06:38:02.960234 Normal Pointing Mode false false false IW3 2015-07-05T06:42:40.307633 2015-07-05T06:38:05.622413 2015-07-05T06:38:36.172205 1.685817302492702e+03 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5.931840885257075e-04 10 16608 8 0 4 256 FDBAQ BAQ 5 Bit Decimation 2.252213143258578e-01 4.286000000000000e+07 4.691840280000000e+07 68 -4.000000000000000e+00 5.339056426703426e-05 -2.139431040091632e+07 8.014509490705804e+11 12 2015-07-05T06:42:41.448260 4.233946343970601e-04 2015-07-05T06:42:41.448260 9.154190559956572e-05 2015-07-05T06:42:57.997912 9.047622567407600e-05 2015-07-05T06:38:02.961093 Normal Pointing Mode false false false 2015-07-05T06:42:41.504840 2015-07-05T06:43:06.503530 2015-07-05T06:04:08.728528 2015-07-05T06:38:02.804289 Slice 12 1 2015-07-05T06:38:03.712181 2015-07-05T06:38:34.040986 2 2015-07-05T06:38:28.536673 2015-07-05T06:38:58.865478 3 2015-07-05T06:38:53.361165 2015-07-05T06:39:23.689970 4 2015-07-05T06:39:18.185657 2015-07-05T06:39:48.514462 5 2015-07-05T06:39:43.010149 2015-07-05T06:40:13.338954 6 2015-07-05T06:40:10.592918 2015-07-05T06:40:38.163446 7 2015-07-05T06:40:35.417410 2015-07-05T06:41:02.987938 8 2015-07-05T06:41:00.241902 2015-07-05T06:41:27.812430 9 2015-07-05T06:41:25.066394 2015-07-05T06:41:52.636922 10 2015-07-05T06:41:49.890886 2015-07-05T06:42:20.219691 11 2015-07-05T06:42:14.715378 2015-07-05T06:42:45.044183 12 2015-07-05T06:42:39.539870 2015-07-05T06:43:09.868675 13 2015-07-05T06:43:04.364362 2015-07-05T06:43:34.693167 14 2015-07-05T06:43:29.188854 2015-07-05T06:43:59.517659 15 2015-07-05T06:43:54.013346 2015-07-05T06:44:24.342151 16 2015-07-05T06:44:18.837838 2015-07-05T06:44:49.166643 17 2015-07-05T06:44:43.662330 2015-07-05T06:45:13.991135 18 2015-07-05T06:45:08.486822 2015-07-05T06:45:30.540796 5.336495919679645e-03 Detected 16 bit Unsigned Integer 1.000000e+01 1.000655e+01 1.496479475961005e-03 4.864863102995529e+02 256 167 2.746961180000000e+02 3.901775013707726e+01 1.111872e+02 0.000000e+00 8.847974e+01 0.000000e+00 true true false true true true true Data Analysis Range Compressed true true true false Nominal Extracted Extended Tapered IW_Default 2015-07-05T06:42:39.539870 IW1 23802 16522 2015-07-05T06:42:40.372073 IW2 24072 16654 2015-07-05T06:42:41.450110 IW3 19722 16709 8.000000000000000e+05 WGS84 6.378137000000000e+06 6.356752314245000e+06 true Only Echo Lines Auxiliary Downlink 0 0 2015-07-05T06:42:41.504574 5.336495919679645e-03 0 0 3.963321617250224e+01 -8.035000702098266e+00 1.418532666303217e+02 3.051238123584880e+01 2.721939289535370e+01 gdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/measurement/0000755003401500001440000000000013614004466023717 5ustar rouaultusers././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/measurement/s1a-iw-grd-vv-20150705t064241-20150705t064306-006672-008ea0-001.tiffgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/measurement/s1a-iw-grd-vv-20150705t064241-201500000644003401500001440000000115613614004466030364 0ustar rouaultusersII*   =S!!!!!!!!!!)Jk1R65535x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\;Ѧ.Z .x 6\Cm ^././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/measurement/s1a-iw-grd-vh-20150705t064241-20150705t064306-006672-008ea0-002.tiffgdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/measurement/s1a-iw-grd-vh-20150705t064241-201500000644003401500001440000000115613614004466030346 0ustar rouaultusersII*   =S!!!!!!!!!!)Jk1R65535x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x C;Ѧ<@[x CCm Igdalautotest-3.0.4/gdrivers/data/SAFE_FAKE/test.SAFE/manifest.safe0000644003401500001440000005225413614004466024050 0ustar rouaultusers 0000-000A SENTINEL-1 A Synthetic Aperture Radar IW IW 6672 6672 125 125 52 1 DESCENDING 2015-07-05T06:04:08.728528 4 36512 VV VH S SAR Standard L1 Product Slice GRD Fast-24h true 2015-07-05T06:38:02.921242 12 18 2015-07-05T06:42:41.504840 2015-07-05T06:43:06.503530 2.312776e+06 2.337775e+06 38.130520,-8.407759 38.535374,-11.335915 40.036644,-11.026125 39.633217,-8.035001 ec4c83239908f0bbd7d835c064d6ac80 a27f2c8a06b4f69b3208dd180d03b21f d3125b9405fd5631d53c4bc9f942bde7 fef2f50db843267377cc2d4bbedbf84b 63bc3b1257ebe0dbc5e043c292ab12ba 9986aad444f915d22d26218bb27b7fad 3b8e86ccf1e9c7030248420f4ef1293b efe23a89c7bca820fce1e7ecb1c9d16b 08c406d09fbbbce5df9a2731ddf6f360 31fdf67f84d20f99b83233a91dfc09bb ba4d7489f789b56905a66063588ca3df gdalautotest-3.0.4/gdrivers/data/frmt02.cot0000644003401500001440000011346013614004466020220 0ustar rouaultusers eieis[RRxxne`}xssxin``}ϨnβiiiVi}xsDRxsxxis`esxxss}sneVMixIIxexsnƿi[is}Me}}ni}}x`eVsVennssssnxsesi[[sn}s[``[snMnxiD@772772727M}`n`ssMVVMe[[VVs}iexneesδxȿ``s}}̸}snii`sei}}̲se}x``M[snnxssssiR``VI`sV[[[[[[M`ies``[iiDM[@7@77@@VMVexsV`}niR[MVn}sss۶nse[ses}δxȣin[ixsζs`Vins`[Veeii`}sȹ[essixȸisVRR[xx}}isx`eVVM;;ex}M[RVVeVM[nensxiRMMMMM77727@@[ie`n`nnR[sƸeinexxn`s`nn}ʸx}}}isxiesx}}x[Vnظi}}xi`isxxxsxixiViRIRexisxx}}isxssse`[}RMV`VRMV`R`xniI[[VxD;;;DDRxe[;)%s}xsnxxs[}عs}xxsss}i}ƣxeeieֹ}[e[@n`sû}nnxsD}n`[R`[inisxsxxxxssse`[si[eRRRVVVVR[}snVsϔVIDII[`xn;RnsxI@iDȨnnnxxx}ְ}}xxisnnn}nx`iMRseVxѻx}}}}`xR2M@[ns}IIVe@i}i[sRnnIRsxssssxnsxisxi`[si[eRRR[iinnii`@Dx}`R[ne`[D2;RR}xnssns}}}[en}}ssex`ýߴn}}Mx`IeѴise@IMRi[2RRM}xsxM2;7;nxVRReMni}[[snnnnssxss[;M[VMDniii`RRR[iinniiiiMMs}sRMesssnRD;sI}sxxnixsxxsnsVMsxxx}}n`sx}n`ĴVVes``}}xnnxI2DI`}s[eie}}n`snMD[DRes[i[eM[[x``sn`n`n[ixsR727D7siiV`[[`eR`iiiiiMMs}sViiiI`I7岁essxix}nR`xʿxsx`nxixxixnVʹinVnsRRxess`i[Vx`7Re[[[eeDxR`InVn@`s[[s`[s[nxnn`nsMD[7;Me`e[`[[[`is`nxessRRxssViiiIeRD`Rs`sVVRI[[Vxxsss`}}ssx}sxxxss}ssVVsRnResiesiVin;`MD}[x[snIiVsVises`[e[n``iV}[IRM2@[`n`[`[V``issxs`nn[s}`se[ȹieM[RM`esnsDV[RM[[[V[[[VV[nsxxxs}ssnsĽθӨn`[`[`R[RIi}seR7[i@Vssn[n}}}`i`[V[nn`xI[`777D;[nxsVMMnxi}n}sneMi}}s}sƹnxMMR`[ssM[R`iVD[RR[RMRRV[[nn}xxۨ`}xĸƹ}Ĕӿʻ}Me[I}R7[@@Rx[sxxeRMR[VV[`IVnID;D7Dinni[enxnsxxx`VsssMR[i[[}sex[seRV``[V[[IV[[[VVRMIIR```}sxx}}}sxxxVMθRʞ[[}ֿ̽@M`[οi2I22R}nnMV}}iex}ieenx;DD[[MDD7iesn`VsxIex`@@`}i7nV[}nxRRMRV[VVM`[[V`[MVDVII[ii[In[[nsiڮn}}sxxVIeI7[I̿I`nVøs@esIMs`VVIMnnxx[nnM;@@7777@i[n}nnxs}x}i7V}@isVess}ne}MIVV`eeeVeiRIVVVV[[ini[VRnnxxx}sxs}sxVMi`22VIýôϿ[eisȻذMVxsi[[V[Vi}}nViRI@7;in[xnn`In[``x`e`sRIIR[RRR[M[RVe`[MID[`[V`nn}}}n}xsM ;`۹֨M;enȽÞƮ޶[`xnxsxMMVisID`MDD@ix}eVx`Vnees}ies`x`R;[is[RRVMResVMI[[[V``eninsi[MMM`n}}exxnîýֿ[}sx̲xMninxs[[V[sVM`[I)2Rinxxn}}x[Mee[[[nn}xns`x`R;[i}iM@IR`V`VV```n[e[xsxnn[D7``ninnxnnȴƔܽMʶ}}Δ;[in}}}s`isns[DIxsxxnx}}`RVni[VRiD;x}exni`s}iM@D[iiie[i```ei`@@MM`xVV[eV;;DD[x}sssxýƲDn}ʴ`xxxxxVxxsiϹVRVxn}[`}R[sn`nnnexiD`e``I[M`ee}`Rex}V)xxxnsnD[iiie[i[ii[niM@@`Vsn[ennnID[V[n}ȻѴ`[sxȻMxV7@@sxennnsxxsn``esxxxxii``en`nneennsxsxsneViniiix`ii}xMx2Ixxn[i}sxeiie[RR[ii[nisII@@nei`iiieRR[essxx;x}`̿ƨi}`ٽxxiȰ}[Røxnxxnsxx`snssse[MR}xinnnVi`ssi`sen`nxsn`Vns`i}sInexV`iD;eV[`nn`esMseM[MVeii[xVII@ninnxxnxxiiexsniƿseI̹ĴֶӶn}exssxxnx`VxsiV`ss[[`xxxnnxxxinnniiiss}nex`R[`R[RIR@R}}neRn``[[s``iissxi`IVM[MVi7IiRVV@innxxnxxDex}s`ii2``[ȽiDx}[}sIMs}}ni[[}}seMRIxsxϽȮssiVV}}}nnxi}}n[e`VeiisxxeisxeV[`[[nx`is[`iin[VIMV`ixeD7Resxe`[Dexxi7VsVsDVֿƁ}e7ns}s`M`s}}ein[snRRnD@Vʰnnss[es`ii[xne[nxsx`DMx}nxxs`}}nsse`i[I;DDRseR`x`[Rxsxnnxss2`}nnnn}[x}}snenRn[n۴eȸ`nƿxiM[nV}x}sxnR[`VIVisȶ}sssnsxsnVRisiVssxseRRM`siV`s}[xn[`VV`[MMV[n[ise`IMnxni`n}xs}`Vnssis7[xi}}snenR;`}xssiƿiM`xV;Ii}i}xxnVV}}ƹx[isV[[iiResssVMV`ʴR}}ȽnxV;Miii``i[[ix}e[VIR[`[[[n[xnnxsRVxiDDn}V[̆`RVR;`}xn;en}x[sniD``sx}enn[xʐxsis}nIMR[`sssssVMsx[nV}VneeVeR`nnnnni`Vxxi[[``e`[n`MIVixsxV`sVMMieM`ѣ}iRi`snnsn;esãe;R@ָRssiiIn}xsãnxnĆeRRR``ine@DRe[R[nns`}Rxxe[i[[nixnie[[Vs}`n`[nseV[RIDIDDR[x[ess`DRnsD}s}}}x}}i`s7sȴx}xen}7nee%%7exsx}}xsxû}x}ensiVeisiIRissn}n`Rx`R[s[xIIMVns}MV`[eseesnss[IVeVD@Msxxsenei[ii[M[`in}ns`Vnsx[Is}}e`ieninnRixs}nnn[n2xVD2Mx`DV}}xƽxn}e7772Dx}i`[IIxxxn`}x[Vnxʰs[V}xVnseMMViinxxsn`snsseR;7MRiineisissss`RxM@D[xVesxeVnen}ssx}eiix}xn}nsnR;;xDex@is}xxxxinn27I.isn`n`xx}e[s}sxxse[V[sӽxe[MeexxV[[MVs[Dss}x@MVRRinnnx}is}n[MI`xsxxinni[Viie`sesxe[ieeinexnថ[i@)x}}s[ssnʁsiVi}sn}}snn[esnsi}i}VieMVVR}VRnsi}Vssnnnnnxxs}nxxiVx`[```ixnxs}i}iM`s[ni`n}}inni[nsƋn[@֐}nVċen}șxƲ}se}nsn[`s}xnsnssee[[``n}nxx`RReV`inex׽xs}xxxxxxnn`Mnx`VResx[D[xssssnnx}[i}sx`[}D;V`nin}nVċi`}ĸsi}sxs[Vi}V@ixnx[n}xnexM`ne`nsظĐiVRei`Vxxxsې}nnxsnienx[Ve}seniis}nin}sienx}}}}xni``nssinxs[@ )I}ƣ}s}}si`}ns}ennnns@Mn`}xsxxxse`}snsnnnDVineenxϙ`RIR[[[Rn}nii`nڋsx[ixx}ixxDMeex[Vnsixxs`R[`[M}}ne`[Vei[ViiR7@n`[x}}}snxnxϻnsxsxxi`s}sxnxxi[Vsxx[`}nnx}xϲx`RRVV`eVsnnx}@sxesxxxsi}x[@@[ixxxinxsnse`[V[R[x`xnVis[```xxs;;eù}ni[exsn}[ssȞxxiiiixxxsi}xssssxi[`[e`eV[e}`xsxnnn}}[sV[V[VR[nx}}e`exxxxsnixxsRini`si׿iVRRVMs}[x}n}siie`exnenRVMDsx}seeʁsn`xiiiixxx`̲`n}xxssxnisnn``M`sxsnnnnnx@M[`V[MV[[V`}}ns}e[essn```snenn[n쁆xVM[RxR;x}s}x`xnesM@@i[`}is̻eD`ssnnnx`RMsxxiϰisVisVRee[n``ee`snn[DR[`VMV[[VVinnssxsIIR`snxeVxĶsisxexx;iVIn@}sx}xeisi`x[DMneVRe`nsn}MM[[sn[ni[ssnnMRMsxאseixn[Vii`iisxxniDVVei``[`VV``VeiRMV`ۮssxxniseRxx}}x`}Vi}sƹ}}}iiseenixeVI`nnssi[ie[``[nsx[sM;`ssn}x׮`nĽeie[[in}xsss}VeiexiiMMRRM[[Vixss}sn[[i[`ssxn`sM[eR[n}i`MD.Ms}R@ix}s[eR[xs[[`nnne[RRn`V`øֿixM[VI[ȔsnV`n}sinȆ`nĽeiVMVei`nxxnn`ixxeVMVe[nVnisxssxsnx}xe`n`eix}iĿxxssn`i``xssn`i@`@Dsns}}s}RRVV[ssVne[`nnnii[nsxnVRsineΙęsnËnnsف`nnnĐV[ieiVMVei`n}}si`xn`VRRe`VIRexx}isiiiVes}nni[[VsĴ[MsV@M``[exnn[sV`xsxxsixxsiRIxe`sxi[ei[nni````e}[VxeV}@;ssiR`̻nn`[ns}}n`s`n`iĨss`M`i[MResxn}}se`xxieVRRii[i`Res}}nsnssi`seVe}[sRiMnnnnDMsn`[}R@@DRiV}}@n[ssxii`Mi`e[`xsnneiiesR[nnsnn}M@[RIÿi[nss}sVn`n[xs̋Vs`M`ns}ss}ssesxnxxxeV[[[VVV}xxnxniVsnnssx}[[nnxneMnsnRI[xsn}s`I[VοD@RsssVV``s[`eineeen`i}I[iVsV[iIM}R@`IDeƹRDesnsMV`[IDMMVeM`@IiRx[s}sxn``Ô`R[[[VM`esninnses}e`}}}}VM``esxiR[`n`[xVis}}iexsRsϴ}}IIIDÞs[}`x[isx}i[xxse`ie`snDeVVsennnnxnMiVI`IIMDsenIReVID;M`MDD2e`RVI}sssi}x}i[ڰ`I`MIisn}snnxsnnnns}xnn[iin}s}eiMIVs}n}VVVxΔxexVnx`Vsnnxxxnx[sn`}n}isssMiM`xn[[[MDV[`;nV;[Msxne`;Is@In@V@;;77IVe}}nnns}n}xsVI[x}x}ns}}e`sxxs`nnnn}ne[`DRi`Vx}s`e2xss[`s`}s``nxens}}nssxxs`[xxRes`[`RR[M[ne`7xx7};seVi[Rs`ٞ}@RinM7}xe`MD`}xnnsni}}xniRen`VIisss}iisnsnsxxnennse`MRI`i`}}}x%% 7e}[`eD)D}x}D2@issn`}s}ns}sVnxnxnnnee``eR@se@I[neDM``xe״eis`Me}x}nxn.i}eMIIe`V[nsxns}s`eiMVeinein[[[[ennsssn[``V`[exVV[[s}R 2;sIi[sViģ[%s`[RnsexVVexxx}xsnnxxeiin[eeeV[[[sVRVRR`@}V`xxxxn`[[x}nxn7V[ReVR[sxseen```ei[nxexnVeRR[nxss}}e``[[nene`xýMD}[`xssD%}xsI}[[sxsRxnxĨ}nx}sx}iiiie[[V[VV[[V[V`sixsV}i}}iVxRIIRsxxxRIn[[V`nxeeii[esxsei[isi}s}RVVMDI`ss}neR@xsx}ȶIJnVnnIixss[nssû}ss}}}nx}Ľniiie`[MsiR```[iieeiix}V}}`sVI[[e;Rne}}`;MM[RnÐins`V[[}ssnisi}s}RRM@DVee}[IIIxnxVnsƴi`}[}innsieMsi}}V}sinnxix}x`si[[[[```VinseRi}xxM`V`RVMR`Risxs`nn`Rӹ}ixxeV``is}}sxnxn[[DRM@DVees}`RI@VRxsię}V[xVeVnnnVV@2Vxexen}[2}xnniee`[`e[[enssxiVii}eeVsei[`xs}V@RniVn`}x`}nn`ensssxiss[sxs}VIMMIDDI[nns}`RIeMVi}ùeMii[es`xDިM@R}}sn}ii7n@2ãװxsiȨss}exne``[eensxx[Re}nsssVexse[``VRn}enx``}inensx}snninen`[s[MMIIinIIRMesxsRIVeMVڮeeƽ`xVV``MMsRR[[`xD@ΰ`exniI 2}יȆsis}`eRM}ei[[esn}sMVniRV`i}V᮰RRiRs`;Iine[i}xxssssٽI`[i`nn`ReVIM``MMMVe}x}VDDD}neIRڮx[θxVs}x@;;Ve`;[R;;}inR`nn}@D7`en`}ęxxxnxi}}i}nRDi;[nxsiVRns[[xne`ixsx`nӴ`RVixniiiisnsi}}VVMVVnnnn`DMDI[MDIxnIDRsn[ensi⸞x[ss@[̽[eViI}i;Iissx`ϻeDDVôȣûi}eiVsMe`xsi}[}IDnnenensxin򞐋sV[}V}DRVxen[in`V[ixnse`i`}[[n`sx[[VDIs`DIIMxV}MV`iixƋi[`nsisss@[Ͽe}iD2D;7n[Vssesnx٣}ιδ}`i`}Rnexx`iR};7xRsMni}xx`ex}xI2xie[Ӹ}}RV2@esi`eeiiessxxx}ne[nsRM`sxVRIMD[sV`IDIIe[`i[`[`[[[i[x[ViׁVDenD;DʶϿe}xi[V)7nIƶ}xxie2[ݔxxss`sxssx`R`sesisn`n`eVRV7`2ns;2VMV``ƽxRRI7@i}n`i`iiViss}sssVxeVR[ix[@MIIVnRieRIRVi}[snsni}nnʶxM7}sxRRei[xsxi[V)7nƐxxn}M.%@[̶n}I`2[xsxx}e[sx}eissVViIsMeD)s}Rsx}7V[V[[Ĵinn`xnnsnM`nn```ssssnnxni[V`nnnn`DVD@DVeV[``nxsxs}}si``nx}2MsMʁsns``n[M2`ƐxxneViִiIiVsInRIinVeMV[`[[ne}eseRMsiI`nȶxn}sss̹isne[[Vnn[s``exnxse`inxsV[`IDDDDDIVVin}}}}xsƿxisV`M@eô}x}se[ineƹљs}ineViρ}sis@sse[`n`IIIM[R[nsRViMie`VRȲ}M`xnnx}xssii[ee`[xsn`InxseMIMMIID;IMIM}nnx}snnxnĴV}s`s[MDٶ`V}ee[iR[}2ù}exxeρ}s[VsiV[I[[R@IM@DR`ns}seRi`V[[i[RxiI`sxsxxsn}}ssnnessVM7Rns`;I@DIDIDIIMIn`ei`ss}nnVxies[[`eDRi״7M[nRsReÔn}}nIs}[`ʆs[VM[[DVx}RDMI@@DR`Mei2 `e}⻰Ȳ[Vxs}}}xn}xs}[xxnVR@RRV`sVM@I@@IR`eRIVVV[Iinsi[i`[e`nD[iMexn22MMxxnMMI̙s}i}xxe2̞siVnM[[DVx}R@7;7;;V`i`M[niι)2Vnix}xni߮ȣRxsx}ss}}}sn[@RMI@De[nixV@D@D`}s}nVei@VsnsR[n`nsex}``}M@@[I@II7DMxn}`[Vssxeixiðn}}ss``MexeI@7;7;;Vi`ie[n}`VseiV[xs}xxssxxxe[VMIRi`Vi`@MiR@@Dixix}nixD@nnixDV[`n}xxein`ni``}VDVnDeM[R@@`[Re}}neIRs`V}e.sxe[}eesnnsi`[R`MDD@``i`ie[nn`ssx`}xe}nxVI`e}}VinnnnsiMMMVe`MVV`[M@[[7ix[D@ReiVe`[nnDiseD[[s[֞MM`[22M;n@DIRResx}VRnnMn[.@[`M[ӿen[}ins`R`MDR[seis[RViIRni`;`nnxxn7@nMR}x`Dnxs}xi`esns``i[[[MMIRMIMMDeM`xs[[Me[VVi[es[i``MsVx}iI`eis`ix2@VRD[[iRMM[[IxnVƹ;snDxȞnRVnen[}VM[e`Ix2M`[I}ni`;`ss`[[;exnssenxDiVMxssninnni[MRIIRRRIRVV}sxsiVxsDȶeee`}`}xƶV[sn`eeieeRnnVRMID);[i@RssR`eesVe}ٿ}}sVIxsiιiIeesxxI[@;`nRDesM;DI`ix}ss`[[;%@;`[7Mn[sxeMMxRR}ssnnexsxsVIIVMVVRMMsiM[sss}sn`[IV[n}}eDeiiss}[}}neei[RMIeRI`V7@@RV;@D;s}nnn`MenV}sn}``יeiôsRVVeinnn}e}einneR[s[IIRnni}nii}%@;`[7Meis}e}}I`}}ssxnnsnnni[DIVDV[MIIIIR[`sIRseR[MVRM;}s}[isVI}eeD`x[e`D[MRxM2[[`M;eiI)IVR;ixRnV[sVesxi; ўxsI`isiVVVV`xs}nessiVDI7.;;@nxnsRV@7Rnøxssxi2`eis}i}}xnniiiss``MI[`V[n[VVVVVV[@ix[VII7VVn`enxΨi;xRRiMenn[nxxxIVe@IsRRns}i7DMI`xiinRx[2sII[Áis[Æ}V@MRis`ii[`eVxVV[I%;2IRi}`nVe}2;7.)nMinn}xs}x}}nnieee`e[@@V`R[`n;IM`RMD[n`I`I7V[VR}x}In}RiRV;V[}nMnisM2Mii[;;RVRiR7 IxiRDinei77n7@Ѩ`xx}V}exR`iiRR}ne[essssVsiRDI%.;;;D}}I[@7;[Dnѐʨx`xΣxsnnnn}}sn[eiinx`D@@[V[RneM[[[IR`iV2M[xnxnxMVnRsx[sss}RVeRDD`sMD;D[V7%Ii`in`Mie[IRxVie;2IniiniiȰne`sRexsx}e`xxRiVRMie`esi}n..[R;i;;@)M[7nȆe}Ƚ}n}nnnnsnninininsi[V`[VViVIDRineeV;ee[}iDx`RRni`R7Rsx`MMIiiI[[IMMRVi})2e}eexMMDxe;ei%%Vss`ȰʸeVR`Is[`[[e}e[@R}}DIe`}`VneVM;@MxI7%%77[sVûssnî}s``inxsnnnssxsn[ns`ssVR@DDIV[ni[Rsne`n}eIn}s`Rx}[eVx`nċeMnn`;I}V[siMVeDDVD2M}VseD@e}@;IDIV}VD[}IMx[M`ܽIieV[VVsx``nD`R;[snesxsR[iRMRM@e}V[ns٨i[``nnn[[nnnneeVsi[e``@;;IenxMIM}`M`nR72nsD[[nx`n`ni[exexI)VsR@[x[@I@.MsV7`7`iMn`MDMnn@D@Rn}}Mx}sM[I`[}`nnsnVRni`;72D[``eei`[V[D[[Vsx`}ƞףsxn[``[`snnnn`issns[Vsx[ienenx[D@nsxRR;``[@VVieI[iVR`i}ssxRennI;77`[;RI@7@n`[Iix7Vin7DM`[DRD;iie``Ĩ}seissnesxn[@;Ve;RRRsnxienV[R;`iVVMsxƿnΞ̋[[}sx[Ve`esnnnnninsse``}ƣ}en[s`eMVRDD}eeiisVʁRnMx`}[nVxRs}[i..e[77;InsIIMnie`[[MVs[R`i@;I[sssnRIӰDxsenx`M`s}xe2;MVVRMInR`IMeVDD;``s@I`ʻƣni`i}}nn`i[iinnnneVinnxsn}siiDIi`e.I@[2ƽ`n[iR}e[̔Iexsx@.DIDeRDeMV}sxʲe};iD@R`` DVxiRRnxsx}sVR[[ix[IMD[e[MMni`I;RD[M`sưs}xiVsee`nei`n`iMxRxx}Rs}2nesin[MMixMIie޴M2ֲ[sesnxeDxieneRi}s`RĶV[IV[ns[[[xƙIDeseiM@Mss.;esnDRMs}sVInii[`nxiiieResDVVViM`[ns`ixȿôns[nn}see[e`eeRIi`[eseI[V`neRD޴nV}RiiniIsM}[sVI[nnMiRIƔVDeeIM[nenRiRRRn[s}[xsRDDixx[iRM[;@xi;M}[[Resx`i[ns``e@@[II;RVeix׽Ƹs}s}}ni``[`x`[VV`RMVniRVi`R[RƲnD;2MRin}iee[nnxx@}s[ex`M;)MsM%nRMMD@DIsxViisnR.)eis`siVVM`}sniMI`[M}}}``sniisnsxnn[Di72)x[2@`Mieٿ׹̿nxsxxenn}n[exs[innnn`VVVsDRes}nDMinVIV[e)2exRVMDse[e`xDesnD`[sn7;`[xeM@IVMIRRVVV@exsiRVis}seIVVMe}}ins`nM}iisesnsn}snnsi`R)7;e2Vs`niȽβiis}}x}xxeM`[MRnxIine[VV[Mix`[esVsni[RxxR}sI@RRV}ee`ns`ssee@IRVDenVe`Mxxex[27Rnn[ieinein` .in@DM`eeM`ss[e}xsRix[nnisnsnsMsnRV.%..777Mx`sn׸ѽnnii}si`VR`MIDie`n`IRe`DRsnenI`n[VsxDRn[n;%iiVVsnxininssR.@;`ixII2IRee[D.2Rxss``}n`nsiD`s}.2R[M[`ns}sexnsiMMVseMs}sx}}iiM[VRDRx[)2RnniӿÐnii}iRViVVV`VIMD}xVIRR[`e[``[`}`@MVee[R[`xIxMMiix`nn`}R@7}x;[RMD.D2[e@2RsiVxxnn`;2DnxiD.D[VnxV`x``ssnn7Mxx[nxxn[xVDs[Ms`I[Rn`ٴư}V}`MV[iRViVVVIR[iieeV`V`V[snMMs}e@Mn}ne}ii}RnnnVʰMexiieIenM[;;i;MIVV7DIDI``M``}enxii}[2I`M}e[n`}`@RVesVeDsnsI`}}sxxxnn`e}RD`D;esV.snieڣIDIDD@2Ѹie}s`VMRR[RVVRR[IR[iixs`I[VDxVMI`}Ӑ}x}en}s}xVeiexe;2M}7RRxse;77@inDI[@R[``nx`e}s;%V`7@esnRRii`nRI`es[R[}ssssi[e}x}xxn`snn`RMVMVVVMneen2neRx`VIMRVVM[`RMe[Vn`e`xs`I[VII@`̞}}n}ex}ns[Rx2Mn`DM@[IMxRRIVD}};[@DD@[[;%@Mne[sx[xR}R[D@;Isssine}i2M`VxnsnVR}inni[`nn[}xx}RIR[[[``[`[}ήא[[[n}[VV`[RRMRR[[eiesinxx``ieVII72Vδ}xxVDD}e`[}[[@VDn`eDRV;I7VRR2Msi@e`nMMR[[si`iD}i`siM@s;)VsDVMex@[nR`e}es`niM7e}x}i`nnssnns}sVe[[e[[iIRnxn}޶ً`[MMxx`V[nIRIRV`VneessiVMMRiinD@.R}x``xi}}R}I)I@@[M DRI@[iRi;..M2D7I[IV@M}nnxV2)eVxI[s`s`eeV@MMs[n}nI@RVsexnV[`essiss`}``iVi`VVee[i[eİڽsV`IRVx}ResRRVVM[Ve}x`V[iniIIV``ixII[I);;M[i}}`Rn}R[sMsMni[``%)M[VRVRMs@IR}V;%III`sR`IRRiM}nVMMI%7;exVsn`Vi[RIM[}xsnR}enVRR[esxx[nnsV[nsini`is`enxûȸ[[V[R}}}eMRVRIVRii`xsseinn}eMDVRIMn[D2 .@7D`s}ss}}Vxx`}R}nnsn[VVM}e2@MnR;D@ .IVV`i2;[n[MIIsVIVn`[x;@V@[@RxMIIMMRnѲxssseRI[}Rxee`R`VnnsssV@sDMDD`nsx`i`i[i[`Ve`Mxx`xRMIIVVen}ssnnxssni}`R`M@IMVi)D`nR@e`R`ii}@`}nDIMi[2Vxe;2[2@I;I;I@RR7;[`neiInI`I7sV`IDen2DReRIVMMI`MM@ssnxs[s}`III[n`[nxi[isssx}sxRR;I;;[exse`[[[[[[exưxV``VVVn[MMRRDVx[sxnxxxns`xeMRRRRMeeIsx`M`nix}V}R``Vi}`RxI7;[M`x[%i IR7M[@@@M@VD;es}MVVV27e[[[D.%7IMnDMI;I[Iis}sVVns`VM[[n`eeie[[`niixieRMRRRM`sxnnn[`[enenĹniʶ}e[RVeVIRVRiieVn[xsii`RM``MDIVMMeeIsxxe`RisiVes[`iiMeVM;D@iVniV.InD;2[xVM.DD[sV@[[VnVDMMIesMD;VV}[n`[DRnsxsx}si`[V[[RRR;IDD;IVMe}V`iinnii[e}siiV`ei[[s}`VeIiVID@[VeRi[I[``x[[sDRVIIRRRʹ[[nxxxeI`sRVȨ[}`xxsR2.IMD`[I);D`iMR;IRV;D%I`M`;I@ðnR[RRsnsxn`VVni[M[ensxeIxIeVi}}`xs}`[[V[V[}IDMR`@27Iexssnnennsi[e}n[[[[[ien}ieøeMνxs`VVix`MRes`VVVVMeeVn`IIIVMnMsxssxx`n[`e`sRVxxV``)2I7Ds}DVV@@}iD7VsD}IIIVMiIsxRVn@ennes`;x[[RIMM[VMV`nV[Vns[iIRnn`[[``e`R`I@R[Ii[Dx}iisinsn[R}snieVV`[Vxien`[IV`eneVIMinV7IeseIIMI[i}V[seMIDMMM}[xxn@@DIRMRnxxV`i2.Re;[eRR[IR[s2@@MIIn@@)@MMîDIse@[sMM[`M7Ien[@D[MVnR@IVVR}R`seMisnsen[VRi;D}niIx}enssssni}`[V[[[iVVn[i}`D@RRMRIM`RiRDese`VVVMV[iV}}[DMMMRVxeIô[[[Ri[Mi`ne`sxRse`i2.Re;I@DVRe7[n`I)`xIDs[Mn[V}nIx[.xIxDMnn[innVIMn@V[x[VexMiiR;MR`Ves[VVRnnRMVI;@iIRiins`isnini[[[[Ri[`Rei`VMIMIIRMDMnsRRRVVe`MVV@I[VVi}`RV[DMVxne[[7}en[M`n@}eDVn}xV7.@I@DVRe7@IeM;;D)IiIIV}xDRnn7D2InVxMI;nnnD@n``i[sseVix}ss`[VRsiVMMMIR[VI}}xsnssnixe[[VR[MVen`VVMIMIRRMRxMiDMei[DRDDMIMnVM`xs[VVV`[VMs[`ieVDMeeMVeie`@Mi%D`}V7DV;@IeM;;7@RIRxRRIe@M[xM@`n[sMIDVMVnIVDV[xsnnxi[iesMx`@RVMMMMRiis}ssxsixxse`e`ei[ex`RMRMIIID@MsVII`neR@@@VMIDMnssRR[ixnn[[``[M[sVe}R.sse[nsnV޹[eiIID;ixesVID;7I2RDR}D7@RIRxR@[D;@@MIMx`.27MnRReV[xsxsnsiãn[nV``RMsx[MRMissxxnissn}x}```V[xxR`i`[`RDIMDIRseVeVVRIDM[MM[n`R[iVR[VVe`s``i`IV[[e`[xnnMRM;xssMV[RiMI[iRi7@Dni2)VV;DDI7e`RMeI@[D;@@Mne@[xni@7`sRReM`RIxe`nssssèxsnixeVViRIVRiI@nssxsxninsee}sixse`[[`}ixnVVRVVIIei}}VRV`@@;[x`DD[eeie[neinne`e`[[enxx`n}e;@e[}`[ΨnVM[``}x[Mi`enRVVDM}Ii[2VnD7eRI@@[@V[@xs@IRM[n2 2ne@[xni@D@;[VRMRVeMesssx}xeens`[exeViRis}Dnxs}x}xeie`niiiinsn`[`ii`[[[RIRssV`RDIV[iMD@ReeMMRVMMRRVMMM[RR`ieieeRRIeVxsneIsne[n[n@Rniii[DMI[RMD2DDV2@nI@@7`ieI`nDM[V`}nD2%[i`RM@D@;[VRR[IRnxix}xen`s}[`[`[}`[VeeVxsn}xssx}sii`[`ei[nxi`[`neR[VV[[xinxsnRDIDRen@IRV[}iIR`MDV[RMIMMRixi`siVVR`[DIxnxV@I`[ȮM[7;ns[I`eenV@DDID7V}iRRIRRRiIDe[nRIR;;RD;ex}s7.D;MenR[IRnxixxiiieieVVVsV`[[}}I`nnissss}xse``i`eiixeV``}`MMV`Ve}}VVeeVMIIMMM`RI@;Ii`[MIMRRDV[`[VVVexRRxxi[VVei@@n`sDDIxiVMeiVxxe`@I@I;;e[n`iVID`}V2e}[[IMM7.`s[iVsn[eI[}iR2Dns}xii[[eie`ViV@@xMRVVssxnnxsxsxse[`[in`iseVnx`[[[[iiMi`IMVVIRM@V[`eVVix}eMMRDMMDRsiIIVix}xsn[[[@RDeIe`R`eVxnRR2VVVnixV;.MniD7)7R`sxIM@nssR`[2;7eVMReiniMMRsxeMss[Inexxixii[[ein[`i[[[@;MR`eI`e`ssssxxssxxi[`VVeninseieR[Vnsi[VIDIRRMMMVVVni}seie[[[RDR`[RDisesin[[V.DR@D`sVVMxIR2;Me@;MM[D7RM.;e@IIsnsR`n[D2;%Ds``xM[}iI[isx[`xި}i[s[nxx[[``[sn[`i[[@MI;;@Denexssssxxxxs`[[V[is``nnxx`[es}`[`RIIDMRVVVMIR``eiVDDRRMIMneIIVnnn}sni[[;Ini[}RMVe}R7eM[`MM``MIDD}iDs}RI;e}}D[x[RIe27nIVnV`V[VMV}IIsxVVxؐxss`;M`[[}R[sM[RsI;;@Dene}nssnsxxsx}n`eV[e`[Vsnin`V[`VMMIIIIMR[`VVVei[n}eIRi[V[`VVDIRii`sxx[[[[IMMxx``}RDM2MnR`M[eniMRVDIRVV@DRieMessseMR[R[I[iVe@@[[s`R@Mixx[[iesMn}V`eI[`[[MVVsDsxD@Mesie}nssnsxxxxxni[`eieiei[sV[e}}[[RMMRRRVMRVVVVVnsinxs[IIMniVM[MMIei[[`s[``esIsID}}`@is[D;D`2;[ie2DD[[[I@VnMMn`s[MVe@7n`;s@MV@I[inseDIV`seMs}sÁDisM;eVIVM[@DR`nn[eDDI;;Rx[`xsxsxssxxxxni[VV`i`VD[VnniinsIIMMMIIRRRV[[VVisnnDDMnixi[si`Vie`esn[nnseV`DR}D[i}@;[M`Vxs;.is;`2IMMMiI2@ixsMIRe;;MVIe`[RDe`MR}VVI@;[xe`[RnxiV[.ID.)IxR[e}s[VR[n`ei}insxxsnssxxsssnVV`i`VD[x`MV`RMIIRRRMR`e`eii}ssn`RRRn[[`esse`ieR@R[esVDV[[[}iIsVDs[M%[x7[Msis}R%;iR%Mxx[nR`R7V}ֹ[`[@Me[@D@@;inR7IsV`xsV[MxMxxnVVI[MiVV[77DI;D;7V}sen[[`[D@}}`sxsxsxxsxsssnn```eRI[ix`MVi}n[RRMMVV[sxxe`sn[VsxxiViRixssiVVVM`iI7eDIesniD`sV)[niDnVnsR[MI[M7esR7Rx}iiR%MsRs@VV7;R`[n7;7VRIM`[VDVi`MDVsnnnsR;DisVDRV7II;nssni`i`;IDD@i}s}ssssss}nnns`VRi[n}eVRVVni}n[RRMMVV``RixxnisxseR`ixsxsxi`[DVI2[}[2[MesM`VID7RMD7Re`MRnII`;[2I;ex`@Ve7De[eD[n@2DnòR}I27;7@DMniiMIinDnns}sninne״i;@IMMMne`[``MMM@`ni}}sxnss}ssnsns`nnRnxs`iR@`eM;`i`VVV``Rixii[[es}i}nnxnsn}siRϻI7xxssI`niVsDVnIxn@DIex7MDeDVV);IMxI77[DMRMenR[ssnV@[;MRn72DRR`x[s[iis`xnxssssnѲI27IIRs`ni[i[ie`ennnnnns}}ssnnxnnnninseessnn}}MRxI@RexiIRsV27Vxii[[es}sns}iii}}߿e@i`xnni@2[nDi[)DIxiIV[@DiR7MIIRIDVMiDRx`D@V[eۋI@ni@iIVRxMRٲsD;[`De}xnnsx[ie[MDIRn[e[e[sn``ee`[[nn`snenxxxxssssssse``ns}xnsxsi[MDee[is`[MMie[sn``V;[sns}iesٮѴ@;ien}}n2.[VMV7%D;;V[nVDIIInen`DMDMs[VsMI}MMVMI@D;ID}`[RM``nsRiMMMRxnxs`}nxxD`[RnxiIM`Vnii`[iinine`enn`xninsnnn`snsnx``ssxx[DDV`MeVVV`iiMMR7ID`xRVxieiiiesفs`}sRDn`I;InID;De[`%;[M;DIV`D7[xxVVDxD`[@I[[VDixMVI@`[VMixexixi@DVinissxxM@ssxeMsR7IsxnI`nnnni[[[nsi`[nVennx}nenssnsnnnniѲęeenn`e[`V`[@siIDI;;IDe@nI}nȸ}sxinssϹssxxnxxnn7RI;sn77}nDinI%;;[n7;nn`n[iIseDVi;D`MRsIDVnn@ReeRe2e`n`sx`III[R;[in}x`}e[eeM@s[sn[eMM`n`[```sinn`i`}sininnnnxxnsxsແ`VsM`iR}MD`DIR`I7D@IsRixxnxnsn[`snxiRxx}`}se7[@Rs@7I;M;en.27VM`MII[II}}sIV`;DM`RxR[MIInRR[nnIIMx}x}V[`VVnii`en7[eVVissin[R`e``e``[[esinxnixx[`iixxi}iĮx[VxxƋ[iRMiIMM22DDMxiMVD7iMViM}isn`[D`x[ݹMs@s``x}sI7MV@D2D@eeDRȴe;@;2VDDxs``nRIMII;7RRsVD[snMR}`V@ex`nxIIRVneR[M`sinRRe;Rxx}neii``sseRR[xn``ensssnnxix`nn֮ܽiisxV7iιV[IDD}n MMV}[VDRV7MDsnsiReV2Ixe@.enssn}2Ii7D7n`IID2xI@MIxD[isD22DIie@)D[`DVsM@R}`I2exsVVi`nen[[M[`ViieIRRieIiisxnennnxxi`VVsxnsnxssi`issx}ۿeVxi}xVDx`MDVs%e[[x}@I@V[MVRnxiR[`[xs`ಣ}e2;nesiD}VM[2[[Dn[)RDDViRDD}nDMRs`R;;7`s}RVM2@@.Meen}xsR@VR@xxnsxR;;Rn[n`D@MRRIVMĮiVniissxxnnxnii[nn}xiin}isnsn}inssIi[n}`D@VIM[MMnn.;[VxI27;V`M@MD`ee`[ߐ}ӹ[esiMsiD@IVV7`sDVIiV;2RM[VnnDVVi[@IMnD@VVeMMVD2@;;}se`ini[VnRRnn}[IR%.2V}sDD@R`[Vi[ieexsnssnnxse`isxsx[enxniiiinxn`DVesΣ[VM@D@`ix2snDM`@%7IMD..[sssesx}ֽ`@isixi`I%I7xxs7`MD2[׆xIR[I[ssV@seD[RV7@2xIRMM;n@IIIiResxRVxi[7@sxnnIIDDIRiRisniinnxxeess}nieenssii}xsi`iinsѿ}inxneRD[MၮDIRxہi; %@I.2DIIIM.%;}VVRRi``R;Dei;RIinsxnV@[iRMe`xsV)R7Vès`eMIseR}snMR`e;sDVIDMRDneVnsx;;nein}iee[R@;@Meei}e`issxee}}i``[``isi}s`sieeen}׿n}eRxVM@;;`exVesnVRxD)I}VMiRIVD.`iRi[II[`āVV;..)..2RIinnss`R@e} V}i[nMMRsxsM};inVxxssV}M)7@[V[sDVRI@;`xM}[ixnssneI;e}ne[VVx[;@IVxxi[inssxssxxs`[Viie[;`nn[[`nn}sinRD;;s`D22;;2;;;;.@Ie@V}V[M[i2@RIDD@ ƽ;I@;2222D@@@7777)77..e}i[nss`R@e}V)ReVnnIRRxs@@MiDMViVM``DiI@VI@nReI[[[R@x`RissnxRe}nnne``nxiMVenxsi`esiisxninneRR`eMDV[xneR[[MM;2277772)))2.;@2)77ID;@`niD}ܸI.7@I;27`iID2227222722222....2))))x`sxx[D[I;eV)ReVnMRID}iDeMMV[Vis[eMR;7e@VRMRV``[MeMR}ss[snssx`VVe[i}x[M}xne`nsnnssiinnV[i`V[[en}`MM[[}}II.22)2)2%%)%)))).)))7)).27;;I;ѲsD77..2@7Vn7)22.)))22%.27..72..27.2@nniee;;[IDsR@Ies`MRID}iDeM7M;iIVIMiM2IMexeReRR[i}M7RsxnI[xe[`nn`e``sxV;Din`inssni}s[[`snnni``e`ssneRV}i`I.222772.2.277.).2)2))..2)))%%)..)7sӞ;MIV@2222222;D77..2..2.))%22...2%%2)%.)eiDM}I.M`Rei.)@MR`MM}e@`sM7M;ixRnseIiMVMin@neIsni``7isn[isi[ixxxs`[[[`[V`}@DVIR[`iisseesiin`ieseesi```ix}ne`M2227)).%22.)..)%%)..))7)))))%.7%2)2)77..))%22))..))22.).)22))))))..722..7..2...[IVDsiIRsi@@DD@RnRRV}iD[iI`ȹ`@DixRnseIiM@DRMRei}sRn`.M[sx`[x[;@isiexsi`[MR[VnnDRIMMV`inisen}}i[nnnesi`s`[V[iRIR@27272.%27222.2;;.%.2%.)%.27)%)))2)72)%)2%)%2)).)...%.2.2222.22.7)))...).2))%%)))27D[MM@[sn)%@Vii;I}nM`VIVMs@;MVi`VDMVV@DRMReii`[}xI7VVns}[Mii2MxneienseRMM[`n[DDDVDs`es``xinsxnĮ}VID;;)22.)72%%.22.).22 %..2))22)).7.......2)22)))%2)))))%).)7).)7))).22.2..27..).272)2esI.i7@7DeiI@`ReDRVI}ýV[};2Vxe7V`RVVIIM`[n[}xI7V}Ѵs`nssii[in[ieM[iVii`VR@I@VIiseixniiĞ}}V;2.7I272)72.7)).7 .2.722).2%..7..72.%%)22)2.%...%..2%))2)2)))%))%)..%))%%).)..) )..))%)RI2Vxi7MeV`xV7;Vn`In@[M``s@esRDIDVI`ieinin[`xѴs`iiissseexsMMei}VIDVD`RRDsxxi`ex}nnΐV}[;22..@7.72....))))2.))7.)%))2%).7.)22...2...27))2)%%22%...%))77)2)2)))%%))7..7..)7.22..2;))VVII`IDi`D[[s}sDR;RMnse.eV}xsi`s}n[nxxnxniiisssxssxss`sMD7M;Isne[esiRVe`R;;2.))...D22.7.2....2.2.272))27)7)).7))2)%))2)2...2%%..)2)))22.....%%.2))2)%%2))2)))%.))%))I}%)}sDsVRV}`I`ieM̋x;eVMieRiIiinnessx@Dis}ݮess`ii[[sxssxss`@MDn`Mn[M;2Rne`exxsiiR@77)222...2@2.).7))%..22...22.)%..22272)22))))%7)27)2))%)..2.2..))22)%27.%2%%...2)227)))%))%)7@DVe;esVxxse;M[V@.RsenV%xeV`}[2Rnn`xxe`xnnR`xiӐs}```sn[ennxsn@MDn`Mni@IVi`RV`ii[M@.2;72)2222)D7..7%))).722..272..2......22.)))222)))2)2%))))))2)72%....%.%7%))))%.2..%.%.))))%)iIn7@}xsV`[MRRRDD2VVx@`IieIes`nRexnInii[ήRã}n[MRs``senenRDIneMRi@IVi`R`eƞn7;..72).)..7.2I..;2%)%))))).7))))).77......%.......72)2)))2)22)2)%))2))))2...%2..27)%272).%...%s.[s`eR[xMDR[@7s[;7DVI``Mx[[Mx[seD[`s``[`[e``xxn[IR`sxsssMVVDDVxe;}ns`nVe`eƞsD;;2.7;...)...);M2..).772)2.77)2)2)2227)72)%%%..2......%%.2.))))222))))7)2)7))))%)2.....2%2.%%))VR@Inʨ}M[MM7iV[enR[IDn[M``xxs@[Vx;Vxnsssn``VDsVVVII``nsnnsniRII@D[IDRn}einsRöI7ssD;;2.72.))..2;).D@7..).7)..77)).2%.722)))))%%))2))))2..%.....2.22.%222)2277))))))722%222)2%%.2.%;Mϣ[iRRn2IDVMinMRsI7n}Vn[nsM7e[Rsxe}}`xiR[[[neDnMniIVenns[s}[DIR``RMIIneinx}}ãD7772772.))..2;;.2DD.72222..2272.77..)7.)27)))2%2)2%2)))%))2...22.22...22..7)27)2))))22))))2))))2I@iV[[DVRVD[RRDVMVxe@Dii}e}nVneIeIxxRIsnneenVVnVIMRnnVMD[ix}M`x[RDInx[IV[MR[V}}ۿe7777777772777772;;.2DD.7.%2;2.272....227..7.)..))7%)27)22)2%))7))272)).272..2.2..%%..))))272)%)))))gdalautotest-3.0.4/gdrivers/data/transverse_mercator.kap0000644003401500001440000001222213614004466023156 0ustar rouaultusers!Copyright unknown VER/2.0 BSB/NA=UNKNOWN,NU=999502,RA=50,50,DU=254 KNP/SC=10000,GD=WGS84,PR=TRANSVERSE MERCATOR PP=18.0582833333333,PI=UNKNOWN,TA=90.0,UN=METERS SD=AMSL,SK=0.0,DX=1.25,DY=1.25 KNQ/EC=WE,GD=WGE,VC=MSL,SC=AMSL,GC=UB,RM=INVERSE PC=TC,P1=18.0582833333333,P2=1.00,P3=0.00,P4=NOT_APPLICABLE DTM/0,0 CED/SE=2011,RE=01,ED=1/18/2011 REF/1,25,577,58.965400000000,18.554083333333 REF/2,1062,255,58.969116666667,18.577000000000 REF/3,514,1039,58.960166666667,18.564883333333 RGB/1,112,120,56 RGB/2,56,72,32 RGB/3,44,64,8 RGB/4,0,16,0 RGB/5,104,168,40 RGB/6,88,112,16 RGB/7,124,176,48 RGB/8,104,136,56 RGB/9,80,136,16 RGB/10,40,80,0 RGB/11,132,152,72 RGB/12,80,84,32 RGB/13,80,100,40 RGB/14,88,136,56 RGB/15,72,120,8 RGB/16,116,128,76 RGB/17,128,168,56 RGB/18,120,144,56 RGB/19,72,96,32 RGB/20,136,160,64 RGB/21,88,104,48 RGB/22,16,24,0 RGB/23,120,144,40 RGB/24,192,208,144 RGB/25,104,120,32 RGB/26,80,120,16 RGB/27,80,120,32 RGB/28,104,136,24 RGB/29,72,128,16 RGB/30,24,60,44 RGB/31,104,152,48 RGB/32,8,32,40 RGB/33,0,0,0 RGB/34,104,120,48 RGB/35,88,112,40 RGB/36,116,152,64 RGB/37,44,72,52 RGB/38,88,88,40 RGB/39,148,156,72 RGB/40,60,104,52 RGB/41,104,160,32 RGB/42,64,112,0 RGB/43,96,128,48 RGB/44,56,104,0 RGB/45,32,40,4 RGB/46,56,88,0 RGB/47,152,176,84 RGB/48,128,140,76 RGB/49,128,144,48 RGB/50,56,88,16 RGB/51,80,96,24 RGB/52,80,112,24 RGB/53,152,160,112 RGB/54,32,68,0 RGB/55,112,136,40 RGB/56,120,160,40 RGB/57,148,164,64 RGB/58,72,96,8 RGB/59,64,96,16 RGB/60,128,160,80 RGB/61,64,104,24 RGB/62,16,48,48 RGB/63,88,128,40 RGB/64,96,136,40 RGB/65,16,16,8 RGB/66,68,76,32 RGB/67,100,144,68 RGB/68,124,136,64 RGB/69,112,152,56 RGB/70,56,96,8 RGB/71,88,136,32 RGB/72,168,200,116 RGB/73,24,60,24 RGB/74,56,100,16 RGB/75,48,72,0 RGB/76,108,172,32 RGB/77,112,176,44 RGB/78,80,92,48 RGB/79,104,144,40 RGB/80,60,76,16 RGB/81,64,80,48 RGB/82,112,136,64 RGB/83,96,124,56 RGB/84,120,164,64 RGB/85,72,112,16 RGB/86,8,8,0 RGB/87,44,48,12 RGB/88,112,160,48 RGB/89,88,152,24 RGB/90,96,152,32 RGB/91,124,188,44 RGB/92,48,96,0 RGB/93,120,152,76 RGB/94,56,80,8 RGB/95,184,204,132 RGB/96,96,112,32 RGB/97,68,84,24 RGB/98,120,152,48 RGB/99,28,64,32 RGB/100,120,160,56 RGB/101,112,152,40 RGB/102,100,124,68 RGB/103,96,160,40 RGB/104,96,144,24 RGB/105,96,120,24 RGB/106,104,128,40 RGB/107,84,104,12 RGB/108,80,128,24 RGB/109,96,108,64 RGB/110,68,80,8 RGB/111,144,196,84 RGB/112,128,160,48 RGB/113,128,176,64 RGB/114,128,132,56 RGB/115,116,140,72 RGB/116,64,104,8 RGB/117,112,144,48 RGB/118,16,40,40 RGB/119,96,128,32 RGB/120,84,124,56 RGB/121,28,48,48 RGB/122,96,120,40 RGB/123,112,164,56 RGB/124,132,176,80 RGB/125,148,156,84 RGB/126,96,160,28 RGB/127,16,48,32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D##+=44GG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-D##?i??44@G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#r##4??i4?#@@!!!!!!!!!!!!!!!!!!!!!!!!!!!BRD"``?@ii.!!!!!!!!!!!!!!!!!!!!!!!!!! }"j7w7????i?4??!!!!!!!!!!!!!!!!!!!!!!!!!!BS7uwi7U:??iU?l=4!!!!!!!!!!!!!!!!!!!!!!!!!0u77?E@?w?4?4!!!!!!!!!!!!!!!!!!!!!!!!!77wi4?4U???4 !!!!!!!!!!!!!!!!!!!!!!!!!Qju???@?:U?w?l?Ui?U !!!!!!!!!!!!!!!!!!!!!!!!!#7U444?7U@it?7U?? !!!!!!!!!!!!!!!!!!!!!!!!#u?@l?G@7??4#@??44 !!!!!V!!!!!!!!!!!!!!!!!!-f#@??:li444444 !!!!!!!!!!!!!!!!!!!! +4Ui4ii??i?#w?##4!!!!!!!!!!!!!- =?U44??4# $@44F?4!!!!!!!!!!!!!N"###="?t#=:4wi?jzD}_}$:4#?4?!!!!!!!!!!!!B:+#?4?Uw44?4i4# N]R#4U?4!!!!!!!!!!!!#U4444?+7w?:#a ^#?www;;;!!!!!!!!!!!P"#4:=:4::U?@?##D0 ??UUU==!!!!!!!!!!?@@ iU.=447:Uw }" ?????4U4U;+=!!!!!!!!!!0#l?lGw?:7zj"D_ =?l4?# =!!!!!!!!!!??4j7j7U?# 5  ??44U4U=?,4#"!!!!!!!!!!!U7'jki??$"05  @44?F?=2!!!!!!!!!!!!#?li79 ju#"& 5R4t4??t??==!!!!!!!!!!!+747e7jUF20#w 4il@U==!!!!!!!!!!!"?p)w77 Uz4:= ?lGG@ ;?GlF4U.2!!!!!!!!!!}p98ui/}Hr=?4##4@GUl@Z$lG|##$#!!!!!!!!!!!"'''/:a}}7"4?@@G@=Z?.2?|Z@4=$$!!!!!!!!!!!-}'?jU.zk:=?@G@Gt4ttGGE ,)Z. $?!!!!!!!!!!Dn#:7?.k"?=?U?G4=ZG*UG?@#?$H!!!!!!!!!!!7kj/@?l?lli4?*lZGGl4?F=Z!!!!!!!!!!V5/'r7@@44G GlGGGGZ,4J;+ !!!!!!!!!!//91j7@4??{{)ZYZ)Zl?.;#!!!!!!!!!!!D18eiG@?<#+$; {)q8?\"!!!!!!!!!Pee))eGG4_5&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >2!!!!!!!Q _7<s{q/ " 2UioLo)* *i81uC>>> gdalautotest-3.0.4/gdrivers/data/nc_mixed_raster_vector.nc0000644003401500001440000015030013614004466023443 0ustar rouaultusersHDF  `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.0.4/gdrivers/data/small_world.tif0000644003401500001440000072567613614004466021444 0ustar rouaultusersII*            )9߿VP       7m       b4ݴ߿:7o nbD        1 Ql    yza_t)v2"9D  aB{ٺ +<].JZ    q   3 ^ss|jɺqs  Pv ys6!XSHpT1      jvJ>   ѿp@ R C곱daP7YyϿu/ )[jlٕ }  * (.       G̨  ^^   : R/   +oNsr ݵb}V  ucbPˇ  !g6  /þG   3: *~  5jխյ Ĕϖ 4$      & |  ^^~paVE=    q '6Ze t %u }?@Ө- *   {qZ:!Yٻϗs    ݉  !ǐ~Z`bkeqvzMbeI 8   e|bw}F/ $5   X)YS g  : HnN`nhoagz|oygq^Ya[u{cQR FU]V=P[ JMF  blveH(?C       HKF $      _b``_atwbi\dftSalderbZYd&)PU   2 jqof`kqqxDT    tM%ܿ8ܝ}6 PtQQ3]  Kf I 3  Dngufhcbhggcdea`ecocer{ktkhedFDIMfjl`ZghddM TZH641  59]Z(  pmoloiT_bgf8m _Wtp` Ŀhu+gϋ  =Hźn*QkG  [q Y\[QP< R_afgg`[WYW\VY[^^aZXUZ\SSM     &76BA=IDC     [s~voncbW^V?# g]] |ucskef=Lfcryg# 0DB|e Zy  !M-IT@ MY9M =SLX^]L/LTVHCPYSW<)TRMPROMNJ=7268:<;?KKX`\WXaYUULUIDAE<=B:;;=@MVSJNAXPYHSQUYF88@;MPOMMNKIKPUNB?>@RR_TV;#  MNXTVWTSLGFJGVc\^ffjS]R   !/!AI j  tvyOmg_dFVGX[YJSv? g`UW.  (?0K$EYRaQ W47P (%)88FaJEDD9&     'N  QB>UEICT?HPRNVWUE3B@@C:b_TT^ZIKDFRaflsXNDO^\^_XRPB?=?=:D:8FODKG_FAURDTTY^\_`TULGD:`e^[VWWRTQMIFE  "k9"&5?>?@KJ]Ce_lssxW++ YTLDaM1\TWUsGcV]\RNX_Ph e\c2 F81IBTSLb]  DЉ (3(FY:3U>10%0*8/31BF4 SA - NVQ=I9 ADF@2 &KMI@HTL8@.@]OOG2CW8[RUPLUPYVPD?;?@SILF@ABBBDEJ?:;=8) 86FV]^RMMMKE?@;768;>6;9;CPB5=DWXaeZe\`TSUZSa`|ZX`WZ.  %YKUELRMRRZVPBNKOTI?DGDz^  ,KR<15401.+()901,02(-E@??:97;=??16YULEIA;FLJOH[DJ=:C=;:74><3.3>BDF=ECAKEOMUSdQXZf]bbj\WZZ^ci]-&   *B588F=68@604,0?E71(//,*(:8:11J69/8:5<98938C?GEG@>ASKJOAFMONQK3LEHLHTWQO[dXRdY\\aVVU\V\NWNT6  VyYW^V}۬\ OS9>`     ;KYU/*+,0/+++-*//1*&//56566B8 <7:4;BHIEGBAAA@BDCCFGJFFKHFEEFB@=<1AB1@:>66PEI=BH:I;@IVwR>AHFH?<=DOGC:2GC?DB=EEG;AE?PTKRXb[p^XZY`ib`@*bpkhR^jhY *D@ *NLJJAK;3-1:<),+4 08+&)/712/9A9@;=919<5@@&- 9A9><ONOKWBLLPNNL\TGALJUQZU\XWVLOJ=   W_oB8?4=p Aܒnx9 %  '3# !-BS>%-++,-'*,.(+"%'! +,+1",./,,&-0*/*.,,0(+300@Y:=)16;IBD;@=KKOB@8;,,+/(.,)(C6134;:4;BK?J:<>>HHDELNKMOLJA9>><9;FA@94A6/BSTQE?IQ@E=KQhRIDHCBEP?HGIIMNTPZbQYUUR`|R[Sjk32df\K )RIRXKF@@>#36;H;-6,4$,+1<39.)6HIDCIA@\RYLG>0-78:431$4;=@4<>@1AHKKJMVKIHMJMIMIQ[VTSY_&IV+ R4K`v=X_UN1 GB l< G0\Zk^MTOm PO;2"-)*-/ )1+*,(#/'/ #.1'453.1/)*).)+**/**'GFE/2/+4/:8A@D:8=:=4,;=4/(1103.*+DA879066==>?;;>BC=>A>=BE@CDCA<;:63817MD79:;6IXRGCPJBCNHGJPE9CN^KKRK@;:AC>CA:DDF@ISSTYFRIGMT>JNYOSL]YW $e $  KR1/7.*0*53+400-'&7F0602?H>=:?GEOk_OghABA83@DCKMOOGNKB&NA9<6/4343L>3>;,5@C;576FJOGIMUUSI=>HAE\bVHEORPRBEH?>BFFGJE2(F/ O+ O  ;fjG:w`}F k  [<  ')8('&%%#" 0((!+-)!$+0*%()&'-+ %#) '"'/()')*(? (",*'((),..1$.(-34''%/,2).-0'),))(*.10.+*/1/275666366233;7<=5..,02/76<>FV,3/3-688<65.19YTJBHFTIJQPMLAFH:6@FUOQLGNQQFMMHHVRGIOSIH@IFD R@PDA/6==7)07-LLT6B2-..C40/5034/82523*15Nte^=0568:B12,KC@<0#%EV;LMQF@263A%A5@=?1  ~  ? Sy5 m   7:9159253166027.4>7;,HjRPEJP=7@;=56<6ITAIMHCFHBE5EL7L[WKLIBGGFAS^;   7D<349==<3*.6GB.'#69M8*/۹?6*5@E6&1;D)47LMC3.Q%$'878(63 9'40-:7F>B=8CB;81M>@> x HYR]cuZ $ B   6PB+F=5/3$$ '  ! !! '% $(!01!*("+*!$!&(''#&)*.)*0%',01 )'.()-/02%&+.)%&%$" !&)-'*+3/044244845171:8..48-1*664442348549@5869-207;AN>JbRgTR6?89=C>MFW@D'GHFI6GBGKMHDZM??  /IC=ECC?*2;73=3614-25&&5&((>!**0&//,.46376%37361344A3HG@7CJ> MRXTKV]WZ@   *9'Fg JNl?)&&()' " !8#(..## #! &, ""!$(&$$ &"%!'%$&&+3&/,$!').).*1.+-++1+''2)&'(+&&$% %(&122540723180.-813,*)-.2/,,/142-/,-0+26.,42+59CE:J>76?=@N?GCFXSK\  AWLF@:=DAN  X_57FPLX(?J>=3u*;^,zˎp?`m11!-*'$,#&&,0-%(+-72'0+4/3891(%79$@;3EIEC8 QFDLN[YP. L : # yP:' )!#$ &/* #$  %2&!&(&&%$# """%%!$!)"*)-$++#"))4,*6,-'%$)'&('$4+..,"*(&+01)"%,+)#&')*+)+'./,-+)..'&$'3*23),2+-.003331-9:553.8;88<;<739<253<9?;8<4% 8@./  R =:9@E?F& ?h_Ă3B50.+&F &)'*)0**;#.260s8?3*.6:5;=947:E; HLII?HGOP: LmW 1 A+',/(+* 11.0'")'*(%,(5/+&.!#&#!#)')/,(&#$40!#)&%"!#%,.*($('"$&&#,'%)%'0'''/..'+&$& ',$%&(!%)"+/2( ( )-H61-0//802413/.,/*:,*+34.33AA7, :  0Z@< =4n! #C^F/.,D+;K"##*')&/8,,$&0;1@1D:F11 /651/.4::63 E?7CSPOH9BCEKS`[* ALC  #52&&$   */1('%,,&%()&+.#'.+-.-(."''+58=<284*)##%$''&#),3()*(&+''((',#--*$)%'''&'$#&.(!!+1+"!).)%&*.(")4+649;E;C<57255:<36:23212,2/67E3   <7I2  =U .I ][N]D?D0&&% )#"0)%'"&# 0B1:42/-0 )*:0+46:=C3++ ;;CJRJGJ5@>@D6>C:7;21:=90.48,-/38! 0073?<6  N6   *^H/)$%8"127+8&)-%!+* 1,%!-#"(,<<61>668?7;A* " 9B7<>9@F/36/DRIC% (A?C ><=4 ' &04F>'9+)'4(%&/-/)5/1@00-;-)&)3B@1>F'A>-D1&"5561,369?39734;5:;.0223,20509/&;6$9);-&!$$*+&&#$)+1D@L/9O84465<=@/;D1LL6>   ?7D >@9P1@7 &7<::5283-1+"1/2//3:+(+D+AA=,?D5C1:FFB<9&:5%4:7945??A:4:>?CACCDJ8E@35.7:;$2::;#+:(#')&-"$%(+2 G99C8M9,<::1355311/1*).42=./0 29D)/;9    1  ,&# .)"&+))1:5$'$#)"',!,%!'*!!.'.+201236< ;655=E?227;&6>>7/,)1/=?A;=C=>A9'#$@58>AC@FGDDCDGGMGBMSHD??68>0&N+"$BQ'*%+'##340-#''/*,60><5452883501.3-(,-::.$,)*   =1-(9.5 '  r #*`E%!#%-,')'/=C;EIP?%1..#9015%*'30 '"(&%-2451-+ 1:+2121+0&(:2#,$--*9- @B?9 (ERV ,>>9C:E+/63:#21.39D870F34<7;1./):BBA?B6<=3056552,.-/.,.0+,+1 )9,7"*0 $ =4.3+     '  )l&'(+%$"l 9H&1FJCPUSYSefaY;A%&-%+,"(+&" '"),1001N 5B11231,0"=64."%-*"'0% )/9@-=CKV@C A?6A@<@@QIMLFGNQN?0IXVRWVY[ORKD9CDd_hpfY]`aZLM>H/J<%&,4$0%!)1B; )3#D14"&387;962/61+(&*2.,,436.20&++6../+-<0 *<7  , 7*  F,+7/( !(,f:;IQjouujt^`MI&2& +&0&$*',1*27 0203)1*$1*,)/&'1&."0(7 D= DH@8(D=@B/9?NF>MEHH<=>9746A;@9;@BCDD?C?C?BAG2TYSTNZ\WUWMC]`e]bce`\hZT_T^US[ijvaiZU>KGE=1(#!64?2;3[D,35>HR>6/ JB4A-8:7=F1B4.+)+++)-,211.--",6,&6:#/ 7%    N)&-&I7J.Tw{rhlb[QN;*@*@85'!(&"!"( &-.1%0/1-(1. #$' ! $& ,  GDMHD:[KE.,+++/555?80%&*%/(*.-//$/    #6m7$8,B;2luqwoeYNBFF=G?A5,#-"# '(!(#&-*,.-(,%#)/(/.   +#  3Wd0%69;@!D@/11B?6/2>D@G;4>GKDBAF0K@9;?CDDFHHKRSZS]ob\Q^YXmfiefgfiq{{{||vjl^dalf~pu[U//5>4Rxl_BTRYF7=?1:R@@*#'(5F[nmZ_\I40.3:;49B=1(&')#+20((# $)  8/%3"($5@wgdi\NHJ@ECFC0&!$%).2$,-$'+(,%&'+(60%$..-% ! (1)- >]IJLVW??A-GBAA485?OC3205-7=>BBECBG>?K?DA9JKHMOR]gbeq|{{xtnpiqwppxtusthp{wsniYH9IKFyidO]]NOFAZkO(/=6?HFHACFG>BAFICIJOOSUXYhtn}~՛yxsul|=a]3,"(&31B94*" '   *gy[(!D-2~ytwzgjRNKGFCD?95%5*2 "#$&"+"# %( %.(+'$4  ( KURDH/E4@94;=3)0)*$&&OWCINIF=<+GPGKHGJKGHRP?HFFGKSX_eG§yj[r{oP~Dt܄~fgPtuxtlxkP25@\ZJB89&$-7<=>/""" ( #.=jrlM)"9TKMvz{mYMWPEBED8D+3.%(+&(5 -%")+%%!#(,'#43++11$"+" 2 TNQ;@?,2"*->;;ATOH='B=)AD:0..,/2) .!%<179D8.+%$%,)23%# SF=0=>R,908O2=P!-':9.BMKP?:.:-[]X  aI >CFGLWjvz} :<6ۤԷBĤpQJ~}͛ɖŻԹɊ``pJQz]onNJ62"75894&#'#   .#]T_>?9%GEF-JGQVXbz B )(7ACHesz% yԭMҫĮWOZouwֱظ§ļЩMEbgpeN?90$/2)?D/%* -    $Q~Yw{XOXhLB_{WqdUSVIE;75@B8<=@> +@FSLCW 4''-,,.   ' 6A]WP3kWK: 4F,D=??GJR%=>9/352*0 9G9MJXC9:E53&4  POME  D5-F6E9119M "%P7-HY ǹxejggDnC7UMDfeDomr~ʬعњҭPowe??=3'024/ & -7:  ",hoWlt~wmq”mtyli[G?:@9:9=<88Z7;G$ &/*013.%.4, @UNk}8b~aN?< ! YGEp/ 9BEPO(3R`3  '* 5-KC,PP D(ڻf~LR`Xj|jz¨AüϪͳ^Ծ׿lENbcVMI:/.0+)+ " .q`ݮZ_^uJyxu[V]R::666;@?A>:=/7;0=7B9255+,6@9D SHWSPslX  I[ B]sWGT& UHhLaRy}orrPghxo`by;8u 鍙`I[ܿƘ]I<>B:8978>696/1+,,9/:  (Zkck[ayy ' n\   , =a7 ZWjxY^mjon; mѿЄiZbQXgsٙzqpuEHLCEP?1-  &/( n~7gȋm٣H=UFpttgbTGG?:>A::309%.1+'*7'+'  cteVlit   ( G7Y`HW{t|̮gpu`Kx ݭǽꗐW_YgsԷ̠\Q͹ƦiK9@IN_ =>:- ': qkhQfRF4=p{wissnvPNMH<8,.:5<6>550/*0,.1+  YrR   br D<]SYu`A|zmzyg]^{4  ۵īβșӸpeȫ•ҰONE\ȭvRuW9DDG^\!J 50, */4 )jrqɛ`ϒfnxrztojMK9@?ECJFJN) 2@7,  '6EI Csfˮҽs=muspqhPCB8.0MLK?/>A20+,=<0<@.. e  Ě "   ٘lТצѾűÞtDJ>TYҿźmWfj|uzOI5v>VB7A@QHN !300 #!%,$6 afֽlplwmyri_PD>3-J?C?89B76,+>4<=31# wwǓ)  z ߙϢ̵uZy>*%Ni긬̻vz|gs@H>AUm6@faqzZDOCD?GBB  :.&(-L*9: UȺlj>b\jFOE9.,;A6?987:A5.=5:' u   Tι̳ۧjM=;AukŗìwrPJeUMH@C=8K/'(7)$7G8ALG?@6>3  @0++  YѴvyd:x]e{KB.$1E;57+9,561@60+ ͣ2  $ |µrꫣƻЇ|S9=ÿzi_hMHJVDGDC@2+3:109UH@TCHLR\CY906 U谛إºɋݲ͒|hhXRE3puɥ}]p`nYWV>HE1;RDE?:60-G=9H=D0-.Mx   CJ@1429;7%;'+,'1&  ' +t,=azy I  Ͼ ěvn  9µѸ}rq{hv|iyb`?HBFBd7?2CCI;F?E?@B=6.$><5(A=5328  Y1G~~hzmM     j鼗 ؞ צڴ}sq}ysrxpL7H3\JKO_=60495*,3+6+/Q>   =7_8V  Z  L}  ۳|izupYKA*KCGJ8AHGK6>bM5:76BB,25/2D*O9   & 3:Xr,H 5'H , ے ut}|~tcZ[TD2_l_A@6SA>ZODD?OA>BCD7\X=58 M& 2   /ESL1p  ; %-=P[   Ԛ b]bPflljq=aa:3;LGJbFCE7NE>:FEK@CGJ   0 48DTdoFC9 D3A8 EU4  ʬ׫8 y{wvqtqzrzznD$NG<^ILJGGGDQ7OA6 b  7DJ@6QgbG !.1) AG9"   ҩ  Lyqotok| P:CFT@f?GHA0>:C  @ <01-08@Kg4 8.+3    ZHP   G I !wYU^kkVq LT\TIJMMJJF<.J A>  19754Dp39% 0+'4;&   ?5N;Hd   njyx~h ZRKMBBHC>8JKZ F  7.FEW68CF;;D2+:      纸 = tz~xoKM Im{L\>RMZ[iK@#  7<  A70\7@5=2)=83     9 ɲl꽾` Va˗wi5 kZ8FQNImXaLO  +E A,0F'56  -$   ! ȷڗM  f_] m 5E@68F+C(   إ~ún3f9 Hx CBB_mha{RDHAC %+M   IHPB  QHKsebB:dSi|yƨ˹_iy͓ͯmXX>;K~!n  [p  .CTAlL;H?P 3 0  HXR %   7TWgVHABBORXer]_|snw~hdl{\ox_A<53FFr@.E?B* ULKB=THHTzooqdpwlrjWut{nRrgsyjPiODE:DMOGMLyePRSOUI>:9LIQKr3  Lp  7 D@L"  ! ,H 9/  AIHGOK;IHTCRW/< WE>@;7JW[Z^^Pio}Xf[poWdrkurZZ\Z>RJD@@9@?CGX>DAMNNSF?G5AJ^^xL B~, ; )P) ( N*  %>0@((D iV>3/>2>:?cWPxJk7Q! 6WIV:AAES@HTHLou]QgjYOd]pxg]ELIKURIC?171:87:FJCC;AA;4:FJMXYgn  < B B> G 2  9      AS C5:60IB618/'*4544-58A@M58<57@@S^BsҼï  *LS  HH  4;9-    J:153cB9EOmQ<+4L.5$(-I  9IM7?PRZ[CHMERUoabPJ`UsP5C4>,<85<52./15/0/3+09@6B;@`[q7C9::9;>DD431/9.*00.5r\:1.,&.))0( ;]CG:A54'%88(-+.(&(#.5P58Fwʟimoz  $<>70&   &'   #:9SA74=1-,.+)+%8.1:];3+%/-*1*> G:@@42'#/..2.82*' ! 4L;G0Xh}{~evx  -!*E* /$"%"    sV_,=9/34/)..+!,1',+- +--70*-.$39N  =8;>>'#)('+*13/-'"!/F17%[Dhz{eo[<  -9:,K &1!" "$"$!     CaG*26+*..$! ".# &$,&*+)(%(++"&=j  *.0B=%"*"))/(--/#!)<16@GEFY̲V  +*7"f +,,&/"=8'#7%     m:C40/2/(#  &(('!""$'--)2;,9 I@/;76,/#,$%&**&&*(&*1I#=9J3mD /45<!  '*'5!6,2-6      I|c30.//(2&("!%*(#&"#!)*(%$2"'80?83 J6+,,QO20&*$")&$'$&-KG% 'G|rsVO +=65 , "/6-# E *   &    pU(&,***0%,#%"& $'&$!#+8;B32-))-37=04  %1D1:KI56('#$$ !!/I@ VZdww`l:  !016-*  ,>=4%7 :  $, !   D'*,&!&#!'#,)%%"!"4(.('#)&90,#0-5'6=7?98G 3I2AIU;@A (###* 1$%  H-0& !!$$ ""&"'&(&)((:>G*657;=@GBKR ]JLF@@BGF/)-$'K7>.:THS]]Y[c=2 #A3  A '  VEL*0;& $  GY--%"+!!##" (# "#"$%""%3>>D=272;FNKO\mR >HDF:>HK_M..E-LNGCC1E@NURTnh73 )    ! ,  1@EPD $5+1/   rR7('&"! $ $#!$"!&$%&2+D;HJ_c[emmV DF7639BIC/;LRIRJB;9RFQXQxrDG/ +76<@    ) 468<.><?/ "  BV%,&$&(!!"& " "!$)!&#)-=DRMPJCMELfUU_UdF A;2CPF9H=HHHFA@NDBB:QQV6JB9G]pvm8=GC8   >91;/) $A 9?53U !   d_-*# '$$##()$%)'(%%",%&*!!"0;JFUTLI6WbhnrloN7 &;ADCV;DC!/HMLZ5T.2OE7 # .+ G <  1%    _Z"#$$&$*+0-"*#2<#%!(,(;E-.5.59OB[jL?EXab^VZI= >I<>7A@H@?>>6:C>;EJP9CNFD?AB>:  1   $     UQ<"!)&&%6&%+*!#4;* '*52235F>5KLUhD9Xnwu_^QF PSC>9D"#1:>:WJM^LZOUCOJ> HGKWS>@6I@=4>>ED9E3BFC7BAFXHA    ARL6 =    ttg($**#$63:9@$+,5(2E-W9&+6G@IVLLfLRX\SGYF N?^PCHC?UY;@8A8?O?MSZNUG0LKQM  ^  Z^\bZTD ,J   yjfN_X1$&7E<=,##*5WF\EA8SWN@MRGL_V]bfsf:* hMVOEF@EBEee5AVLEMVe>>GDJP 0f/  >akb^e[ NX'    wwg}j+%+>2$# -8X>IRPOWSFPOXS\ajVctbkG' P~lQLSKMELfXZSLNQ^GMcFBOWRJGEGT" h@* j\z+\ujmellT `]^U     No L"%5+)(798POCQQJ\N\`TDa\bfWVVFIK* ךS^^R]difai\^YYT D=BMUO>IVEC9Z> ;Q_J   Wgc}v{yk_nel\  qaPV"       ̎nh.)#B455-6@70 ufquollmmd\{rhamW'[RSfHOG8,@/H N_]t)  2neyy|y_]XqqAj_uu:      ǁ@+HZ=6+**1LC_T\[g^WZb`QbIK9NW' vnrkd]bZmHbi5abaQl[EK>5B lowme1  se{~}ydljbY_qe y_kkv[   *   mJI8D646()5C\VZ\_^FK^^`jULgML vqlqTzvigccdMih7BA48 KCkq@* {s}x}}zeO     wc?NE?>,-GSASZ^XUXbdXbbdVAVOI  ahymN|xfU^cvejC:>& >cmg# ~yz[m]4   ـRJXL@5/KF?JW`WXVd\NQ^ZRP^]UMUE^ t~|juz_\TZBFK h~O/ #  ]{oi0 ) &FKMDH:7DGPFQ[gYZWILOQO@IE %sqwvqessOPYF= Z`su8. TxxȦsolcV  1  -BNEAB92@5JSCh_B>MQeHO82 w}dohjD_K^I;% Howe2 Wwt~|{{cmbcN+   &ͰD8RLA7Z;4:+HZ_P;>AHN4% 򬜖|oe^9gGUFU ewb q}vprǽsi^af]  BĿi./B@A8252:=26J>G8A+/ ݴ͝{lQLXkfXZLa7 nY" ļz{il?WofC b{BA:? ujDL>?B=?F=BCA*FD>32+ ґƗvpsur=R9   ;~p~y}||fnowgK[2  zn=IJCPUAFC:9(CUE@CKD<0 ǠtcixzYdM Zrzүroca\4( \k[_JxLN\>RFUFTYYR>.9.  ֯ts}wsTR_= [bts|qps켯є|n~xr\SVD1) eKjowMG^L@?WQUSUMLBD unmRW:! `ouW_Wmtqkpy~óɽ}zmWVKP ?|ihgXMJffXeHOIS^PQAI=K twgW_YC VSnywWJb`bmotkIJըcQzbWX\b oC{ORV`n`@TSGWKDFDG5 y|}yt{htk{! Ghs_SQbC`glmbY (Xbzr\X`U1OD 7 GgshWlpikcON[@PIJKAB gieomUOK SbbcPJ5H>  _\eBz{m^eZRPD= 'PceQgtmg_YYM7LW]QA3 !Tlxua>]Acaltpf~laaQLD= @fTcggf^BJQICz[CIH -I ?W  7 Hkr^jrYZOZZ*  Gku]uhU]KFAFF6@X g]_Pom[fQP89L  1$~pu]cQ\dZK@1-/3 CQQZcPWL:!b!   ,0z`^SbTWVO`MRE:; =9@4CF9 1 2 9t\ulXZSDKYUKWO> -=D,2:" &! C@tokXUPHLZC"    $) 0y\ilojYLKGQ  +  :& 0)HYa\tgf[ek _mxвҾɿԻΟ’ŲVgwrܺ|BɲҰpo@ ͻķ»yzzv½μúºľį$      h뽡屽n˼lϸìdɳñïȿг̹Ƚ˨Ĵ¿9    ,L\ŻƶžǾÿпɿƪ̻¸v    Zźaŭööѯ̇{{ztlnGCf%  Ahurs|¯ؼʾļ÷Ⱦλ~zǿi      A?y~ɧ©wzxuluW&:gdf^]XRRIa*$ "xr}zcZ=:C}ry{~|s|vvޓ˱о˽ľwĸ&(;{O(ϼ( ôϘɷjx||oic}~RfkR\WaW^dd`SRSSYZKRGpl}Y{zMeqqDuvf`v¾ȹȸʿŻdծȷþŶ÷~PnKd}`?p^-ZcT^a_W_^`\g_`eltlj99CAFvu)eiowSn}kccнºǼȿúcʽ{z}|~|~~r}xrwrqiff\cf_vXUZRMUjkga`\?YNW`yypephLSc{b{qzzjhᾤպ¿t<Hh{~u}~bftpssorx{wtusv|xx}{op{ryphbksxl[feiiegoffieifeinsx}y~sa8Cv]Y28q?pv~^zons{X yի뿝}p{ksbad~}{zkvrigjnqqwy}zxz{woqy~{}|usppwwpxvowvo{bZk'C_fculhrwyǨq¸˨Эy|}ä}ǽ¡o{v|yr|}tvr}|qjansu}~xy|||v}|zz{}qxigIiho?Vynb]~uYEMCZQTevV|qzx\}oT3pKe^5-I}{|z~}v}wpkjrnpry}v{{|ywut}wp`bszuvpvi\ptxsuimcgbddb_hr|~kPgZeqMEc|xh_@wmyr|~}xuxx~|~wq-odni ^hRE_{|wbd)?tjU%W{vlfgb_``^gft||z}PdUs}}ϰyuu®ñpcpyk_1I]   q   4Wmxxymtp  Ut C.]f^l0       p{HB   Ӿs@ S F毵4ak_Fcrɬ6 ._|cw %} . .4        $EͲ0  \_  7 M' hIot !޴rb   ybr VΆ   _6  -õI 29   .| 7lТͭ ɜ @7       ( } ZTzn\XOD   v}m"2Z~{as  (z AA۪ 1 / {wP7kا       Ɠ}V[R^XbroI\`C 9  ioOzjn@1 'A (a4[U ,   =   >h{?UaTZSVnj\f_fUOSTklYHS ONVRBLV KOJ [hiWG%=B     UVK /Ş      +\XTTRSegT[S[]k^Z]UXnWVQ\(6QR    3  \caZW]cep:O   w|M'<ٯȽ{8֒r6 $ſ`]>V Oh  J 8  De`m^[`]_[[WW]WV[VbUWdn\d]ZYZBDGK^[_YSfb^bR- OUJ857  5=^]) cac^a[Kf^\Yr0gs SXid)`  Ÿs\p="eԎ  @Gz?UcP  Tt QTSH T9 WYX_^YXVYURWUTVVVYUZ\VWTQKBSOSbYZU\_YXWMOK[TWRXVVFR[G0%  7;MXWP8        de}tK]mDjX\aeqzmy|hc  c7Oxk콴r@nZLK   XM+k}9^yRtI    F\eVR  V``\:;ZLdkUZ]TLS1f[OSVN\[XYKJFSILPGGEEGErndZT]NFJ_UFXKPHT\LKY[S[]b\+ X05*9A@BD?DLGTXWUPYQMMHSKHEMGHJEGGIGPURJNBTMXJSORWL==D?PTSLMNJOQQVQB@A?SP]RS?$ PKPRSTSVMGFGISZPYZ]`ZfR  *4>13NQq  fdhJd_Y\CRGSWTQR~ > m^QQ- !3A4S8.HUQ\yT  T,BX 605;ANfOCJM@ ,    -X _MJSRII]FOONLTR[P>NKKHLTSQGQQEFDFP]bdgPLBKTSVYRNJ@A?FEDIHDHGGCD:LQ7 TJ / "VYXEWC BBKH< "HKGHMVPKG>IOQMG::M3NHKHKTMQSNB=CHKQGHHGCDDDFGLACHEA4*CB>OIOOXODFI>CNUXQLNKIGD>@E=:=@=B79AQ<8>GIHQVFQQ[$JQMRQTYlP[YV\3 &ZRSGMMNQQWSNBILLPD99AWLR>:@A>;?>994>=NW]__VJJCX&&%EHTEB&&WXS3*SXRUicg\8seSVQNJY|3 ;>:?<53CBCBDOII$WLU6AMJKRKNLECLMMROLDMM:M VTJ1ADCJHMKO?E!9M?NLIDHIME>JGGDBGHFGGIUOPHFHJFEJIHHGFBFHFG56UVOHNF@IOMMEYGL@;DC@?E<@<9CB848CHJIBJECGAHHPNSJQQ\SYZaXSQVY[a`/,  /M:?CNE>@F>8?48AI;87::;73?=<85K;A0<<==9896;@;C@KAffOCQRuۨ]# VR:@a    HQ^Z;689=<=;796::<:3!=<>99=BIB B<(!JKEFC=FIKHC@GKOCQJM^LHK@FNB MHOE0HMKIKTALCEEGHHFHFHHGHKIHMKIGKLIGJILGB?ICG73NGLDGH:F?GLQsSECFCJDAFLXPLA>MIGEC>KFHBBFELPHPUXQeWQQPU`YWC.]fa]][b]^ ?KH 4ZWTTJTDGAACE4<;?6@HB7<><8?;;GAA;8:29<5AC30 =G?BBKJJJPCHHJEJETLC=SGVYSNUSRPHJHC"  -<4:9f[m<6>5At H׀i~E  +  .?' /;KRN-9789:9@;:4703+)3* "27//$35708B>?E?BA<HDLIJB>4;>C@B?=?TD?DCHF=DHNHPFHJJQMILMONKMOMKEJEIMMIC@=AJ?6?RVTLDJRFN?MNcMJFLDL@DE@IDMBJJNKCLHEIHLJNJVRW]NWSQP^yOWN`a9 6\cYN  9KOOTRSLIN2?CBPC5>9A5869D7=65?29==3AHHHGGMBCBGDGDHEKRRMLRY.CT* VU][xh8MWKH. AA  "i:  G8]WYVFEPz +V[I@0956:B 9:8675.;32 ,;<4:><77;<:40BIB<5CHDC><=ROFHJCHGNIJKIILNOKJMJFKLILLKMHKKGDIJIMI>FGF;GYUIFNHCDOFEHMB789AJ@DA?GFPeYF^bDBD9<4569A/9=A=??>52@B@IHGG@FB=E;JjU  B[J1=NJXzOaJWm DEL ,LmGQ .6MA.4787725 ;7=+73+5+=59$:.28>46A:9/9A6<;?=>==;7@3:>A>@74@;;?A@DCA=1=9>1  u  # BHp9   &*DJQGK9:-327 06=85.'*'17-62' $8789;8>;@/25/899=@>865?>/14:9@B02A@=0(%(&*14>;7@=???>9:=?>?9?BADCFAHFHGJIJGJF?IK%BGDIGIBFELECBCGEDFHFBIGGLCHLEC4FfQPGLQCCIAFJFJJLZILKMLNPOP9LO:SXVQRSPONKHVeB   *JICB=D?IF<53?M?E6>PRE72S218-EBC8941,J);7$.;4C;@94A>750I:=< HQJSYkU " J   &D\G7RD<6:/3/ -8'12- &/249 <408:>5?2;?=4;96998+368;>E@?A46;2;(&-0;?:2;.*+.99A@<479<3>?=@BC?AGGCEEIECHNFHF?EDJ?HCDBGGECDGKFIBJJMIGFEICGGPEJ\ObSQ?HABDKGSLR?R."TPMSIOJORTHISSMJ  6#BLA?;97387949;<>=6>.973..36=6;:D;8378>;==39<;:76>=:;7;>=BCGHGAHCDBLGEAE>DC>;?>CFCCFFIGDFA?IGGKGEFEDAEINFPIE?HKIWHMJNZXP\ R 3UVTNHLPJ[  /]X+@?COYc8GQEJ=%GJa# *=8ґuHao==)06+633;1.89==:1479>=4=8;87>;6,*8:$B;5@GA?8 J?>HIRSJ, I ? ) #}UE6.:0/+//5@;23 4*F836<>);;?;::<<;?<>:;>?A5D95=44/863537993B2:>946338=<99/8@@=5:=?AB@B>EA@ABBG@98:=D;B<747C: @G?D?CBJK@ IdN A .D41(9,B8<< !HDEG=8;>@>9@:G?;<;A@@FACA>?KE)<9?A?<;>@>B;55;:47223789=9:C2338776>95902;<6<@:;>>7;?8?CG>6=7088JD?BGFCOGDIFFB@CGCQCA?GFGDFHNDD D$  %H]Z R   M@{$" 0,>UaL1<96L5AF466=:?;8@G7E6F>K6?$27653/5<;13 I?5CNKJCBEFKKNXS+ LMI "' 4IG974  ;FH;>DG3?GBDED?F:@>BJMRQIIH?D@@@?BBA>AGG:A>8538899=@7AA>::6:::671BEA88?D>:<>B<8?4.A;AAGINGOECE@CCBDACE?CBCF@DHGJL>  OPUQ  Qi GX 1e^]hOJJ<404-1:54F@;=5941=F=;99::;01@=18LPMG0 +DMC\ "Y 1/91. G 2A BEDALA9:91;GDFGFKFMJDG>;FKUXQ>=AEHCI>9E@GG@AH@=;<668:B?9C4F<;:?C88A7==;;A4>752H>;@54B@@JCDP?>9/;3,/<,1.4PC@=L>;8MONHCLPOUPSQMMTOSTLDF>>SO<7P0;RDA8;>MHJ@BBA@>GDSQ! KQVN;RGN$ =!- 9*Y./37*-,.(7CJODQ1169978:49/*.;19?;=7-8)9727566919B  D;>85C87>CE3AG/JJ=F XQ\ QRMgCNE  >RUSRMJPJDIC9HGJFFHO@<=W>TUVEUUEPDMYYUOM>QM=LRPOIJQQNMLOSPRTYWX\R_XKJFORS;6IMJN08BO@/:?A>F):4:;9?= OI@LANI=JFFBDFFFDDBC?=>A@J>?>'  QVN5HFW   2  D7+5*+/,.@*?8<:9?CLI69859.46<.&.6766)8-"/0;39144598;M @@I<8@8.09922G*,8K@8335L )Q^_WQg GA=>=LNJGHEGEDGEFBHB?GD+KMC8??>/* SKAJGBH (   8* .:hO/,(2:,)8618=FNVNZ^^M2EBB3I@CG#97>934+.<:'80896B<) R`_] 5W\c =VYPWM]ACIHJ8JIEJRVMJC[JKQMQIEFARXXWUWKQQTOLHN=\U@O?<;g[EI205CB763@OP?CHB< @KLLKLMIHCBCFFHHEGHGDBH3,2A4A>I7!@D - RMGKK     (  0%7y-207663w*=O*8G[_]e^bh]kmkhMR99C8:<717:5'-.5040:888L/ ?I89=;976'D<:9%+-86-)0*6?/ :PYf EVW^aMO XYPPTREQPKKG?P`\UWUVV=FEH]ICUENLQT[WUVTJVLQUSMQN][YZTSVYVTDV\]Y^\\^VYXWLTNb]hocZ[agg]^S]D_Y@>4BK+'6B77968ID7FG7[I? 27CKOPNKGCKJDDAFLJHCLKOGII>BBG?JG?AH3!C 9[R 0 =3  0N.0?5041/25a?L^^jjn}wqcneh[Y]Z\\[bd`XZ^Ta_h]a`b]]j[Z\W`^Z^`bf_f[VAY[aZKA41=   d_b]UQd`OUZaFBIMTWQOJ@[OKLSPVUTSMUFQQEZ\\ZUYYWWTRRXWZ\bjag_aYfbg_ba`bnj^avolsefia`_^\_`dgjpcTecU:GT?47498QV-CIFLESW>D@DBEEK\_R[SZHHGDDHOOOWPI;<@;E>?EF@D @;    9*@xB0@<+&EA9dtoz{zp|qnd`UZ^R\XUG83=01,2692:938?;9>=8>419@9?=,.+   =3   8dgM@KNNQ5WTCEFUUKDHTZW]PJS[_ZXWZDaYQSTXYWYVVY\\cU[ld^Wb]Wlehdeiabls}|tmoosykjch[a`i_wrkrc`DDLM>Vq^vXHZU\NEKMFKYGR=689BRai_UZbZNIJOVZSV\WM@>BA3BDG>;< 8336;BG7>C8;@>@93;?:H?7815:*I ?A ( '8C;B-  ]m\SVacSYW@UPOVI*SHN^VJHCMEPUXWXZYX]VW*]SXVJYZVZ\\`ieffomrjhblfjpihpusyxptkqpohljh\dnrnmhcWI\[Nliq^TW[TXTO`]T8GIFPL^inu{esh[KITYUSSPLQB7;GIRM9?EZ 8  0;JI/;2995X^ponh^`c^bVYZ[ZW@=D9-5S B:05:;:?9E5A49;;;;; !G97?@2 V^\[X[hc`gZYGRNNS\TNYL\fdXMUWUU>5R]Z]VXWXOUSSWTXY^\`\adkr\yxpntssov{x~{{xpwyvvsnpguE]eC`~]{XFY_VOZgdWXDES_cipvvooPEKVUUSWQH=CBQNSNNB97> *  /11cpxZ82F;6|xqsp{vehZZ]YX[XVQJ9J?C  89694A7816=4?71;KDGB>L   "B" bd`SWB]PYRLOUI9?89379ZdQQ[WZSQ?.[aX]][WZQR[XP]bY_\gccbm?@@<:AE?;MKCGMM?Kd4E;PNCX[\cTN3DOAegj $i]WX[\a`mrrxu0 =^Ǵ`ŝ帱VwwpR{xzЫzx_fmX]uZtuX[KN=PORXRB:88    7B1mRN<]`KKF^ZK@A ,I   8(.GoVjnoVJKfT@VspWm~lc`cZXRNNSWKOMRK >TYj _Uh E>?GEDG1  . JQh_eDkZRC>_GpgXL>MUQUfeca`j    86KWY^^de nrӮs{kif]gQx{Sw}ɷγMztpn[IMRJR@BCSA?> LKDC. *,@Nv|TqRczjUGpVxxkhgpl_c\USPNPPQWYS7]PRL]\d1WWPKLNLEF HTBOGXMGKWGE/2  `XYC VE>XGXLHDL]  =4X?=Xc ݂ȽwbmotLrFU`c_mfLgamp£θIJVuskRRPL?IKNI5! FM2U -1`aOq]szfnhvknz|mtzrkjaXTORLQPUTPPh JOZG8KCIMOE;FJD) MXKd};^v`UKE ' [PLm< HNN_[3AeiE  37 L5G\UC^c  i@ۓڿcvQTYPht\u}HӶŮҟʿʸi|SVfga[ZOKGIC?B- 6 *2&bSrszzÛgfWnLut}vs^`e_M\WSURURRNNOSTW`OQVRHHDRIB:)  WY_jKlsl& \ Ifvs1JABec\r|fK[P*APCcgK;&8>[\LdiEt ezĴƻM~}cu}foljl}wijпʙvtv`n{jcLUPRZVNOEHGH7E; $ >@_1{qwlzIBGJrirnvk^fVVUSUTVSORKQSHULWQJMMBCKUNT [GQSSfbJ O` VawaM\'^SrWgTuqjmuSidqk\e}CBtu ʷӈ^QQrwúȻŧ˻Ǿvsf]RRXSJMVV@C@R 1@< +3e86x[dfY\?CWWcpwkojde_ZSQSXUMMNOQVOOLHLEHERCO4  $]hYeXiwx  ' gX   : Gh; ZTmt}yy~Uactuf>}w ½˛t[I^XZ|aqߚ|i֦̺ƷihxR^bSU2/dWJB 7O= mql>Zw^{>BRC|}otpgbbZXTORTOTSRSKJW@GKDBCP@B<  [jYu{Ze\g     ) N:`\ LVwnv|{cpvaIkw}n  NǘѴɹʁV\MWqdԷ곱{x]K{jSJT_dmY<' UWSC AR  iiTNmdP~zN:=xluplrqlob_\]QJDFRMTNVSRMICICGJE.  Rse}|xzI   `mx I7_NpTx^Z>nocuqbZW_l~tO Zş{cl[Ҵصp{SYQ]|z\w_OaZVg}>]! RCC0 $BHJ 2absp{wxRu`rlnnx|tsojX]HTGOUYRPGSQIHNUHLLHIPG |- VP_Vcovmi~  &  ]K uf m՞fhnoK>_8{ӻÿzja[`][mtpᰖϕ`LnkMa;WQV[YZUYc0 =XPB  BJY] Bvk\~pv[{v8bn{zomkml[UQLGC_^]QGWZLLGDONEV[HF a Ț˾ '   װdpdAI8NS{}wvd]dmmsq[RBjGdUTWVe\b ;KGH 1#:9@8A cY~Ygaq}wvtqbokbe_SOG@YSWNQQ[PPKCSEMOJI7 {ojvɧ7  s eʹȸ̺ȼùycRrL7+L\xޞgthqqlfoJXMR_{dGFlaxwcYha_Z]Wa dK 8BI,YICM#  Qki~c\D\Jl|w{tvqsjU^VMAAU[PSRQPNLJCNFR>" ~{gƸž*   RЅңѹ{_DLCNdt_wz~lmZNhYXSUZNAW?=6L`U^`[\`P]L)  WF4AF  G^bUq3{ujZhUQ?:CWUMOCOBIGIRHDB  s0  h붜ҚbȏºyѸbLFu}p|nb[hVUR^NVXTK?;JOFELe_YiacgmUf]A  BR.E Uܿz{r|tkudhVNI:BMF?CDOEITPNC% $s (   $ݰŶȷj̜¸ūثӋymVEmbd]fOPHNDNTE42>NFDCCG?bhJihkjZ^`S\ G u }ZjtÛ|ndhgV<+F^WWRKB fj DZ>1CԺנuɟղߗofN3ka~k||{b^R@CZF\AEC\DCC^QQNLKE]APin^j [V n_ 𰪷߿Ҽߎ ɡ pů~sqjxnuZUZY_cn^iFMFFSIVKIWUaYJOKTSQ=UCFFDHP .  |0xJA\k|i ;HHI ѿٽĢѯ e  6 ׽丫űߩŲuy}xyjn[cXaZwIWQUQWEPLSQVXVQH=VTO@[[RMJL aBDvmg`lh V8 k   fⱶ᧻޾՛ՠ̊0&  ͦϭ|}y}{w]I_Sn_bgvK[[CIN\TTSSOSTOCEMGPKKc&\*   Z?\h>X Y  Qܪ۪Ԣ͖ j]"  ͦ{ytsqxeY[I\P[^OV]XWHOoZRWTUa[FKNIO`I] FJ    KARzzg8O  ;5I 7~Tkg ˺ܥ9ݜ zٺܻz  y|wxpts~pgld_Moqo`ZPgPRnaWWWg\W\_bSwh]TN i: 9  CHWyMDl  \8cW5Y`~  ѱ᷷ḵٔň㿶 st~lklcmhqmUu~[OT^]^u[[]PfaXV\[e\Xjm"   0 NFSdWbR\\ `_bV  4S^ 5 = ݶڿ۫2ьմ {~szohfnlyuyr{^VA _dSp`fbdbb^jMhYP 9q   MX^TT[b^]' BKNI 3^_N,  RΛʿ綋ã "\}srkmrkes~0 dR]ZlY{[cd_LV@ 4d  8 NGF׺ݻԳݼȗ8  W "yxpbZfjd_x ]dqf]cgdggcZHa YV  HHUMMTlLT<!RYRSZC   MXEDZVO   8 ɨΡ̽ΩɮƬՠd SaqmmxC iePfbmX~jq`p'  >d #Q9DZBRT$";4   # Ĺĸ{ w㺶ɯ _zzu}\e xBTc_dnqsfYGC  fX IHFVRKJWCTU   ȡ~|ĨÿȾčĽu}0aΨ+ ^to VWU`iqi{bVWF nj  @NMQAR]PI#  b{kfvy|ͮԽqԥ¾xzm]\\k|oP oo  PqT[XPX[`b^[ ;@o  \Wp]  mjjwsaSwlv~ƛnsyrcghYW~{|~Z   luyky ' RPiYvZUcc_! O D  $Yyt  (   b`bkjg_\]dahqvhk}sys~mtx]la\~`Nr~v|   A^lTpu , ]R 2FAO]Y_J *) 2b   ]7e /V6k   aOZ[bX\[filmdxuz{jxydnrenjifgy|climndQKaSR]| . ^Opl  X_  9DwgdOV  d2'   ^Y iYCJRSbc?RVQ6 :c^]WSdX[^yrtwl|yprvlyyzcvt{gebeZdie^afpgijkio\TPXQZZj*Ҟ  %Wt|~  ] HWYU*   4 ?]  QC! YXa_ [\V`df_eiMP `\WYUQacckml_ovirfljww~{kknfRi_^^\T[[fggR[X`mmnhVWNPTgevx: Wv[5 c1 Ed9 9 f(>     AXB\4B]s]GKW:^][hg[{JfMV- QnboT]X_f^^i^`nj{}lisju~siah^``a^]UKPKURRZ_aZSY`caOX[_R\``jo OyV ZY U B "W     `q \V]^IP\GUZg]dSbfm^JADC 5_TPaZ_bfrmfgdjcprv``wm}|l`ZXTN`XOFWMBFLSQNMUS\TcSVdUPYU]iJ`quoy}  3\_  eb RTRJ,   gGERHZbLQSkYJBPXELA@TT^YabjPF=A?A6DLCGF<=79@P V[o>k# pw|VJP[[WRRNMMJZOPQCBGQDEFNQ[__d`tuWmZ^f  =RA G:JP 6:86%  L^UicdW\JOB>0=>=A?OSKG4@LRbSUUh}yXk_bk_[h  7PTKC=  &>422=   (VH[OKGQFA@C@@A87HCKJ\NF=6AA=EAO# VLROCD83CBCGCNF=;56515L`Z[EX^djhbh^lp  ">5F*^<< 'M<747:< (  p^BQMBGIC=CCA7@BBA9?8=??=C>@B:D9W LJMMM>4;;:?>CDB?;1166>_GN+:88:8>:     g^S>CH=<@?:;:8C5775<=A?=<9>=6887;AA=EI@T3 XN=JEE:D:?699>>99>><2+<98G@?CTSNX YD<>:`S@E:?75<97:7<112CJQ) ,Wu`dQzpZ% ARJSF+ I:6CIK>7` !*B) C:2'   yR>:@>AAD5;C;<39>77;=;969?BDKAFD@@BMPUIQ"  2?R?HUSFH.;867:667*036RJ[]Vg_SpgN 6HKPFC% GUTNC8O= 43P   AC=8>;9?9EB46==9384F:A>=9@=OHD>HDJ>OQJMOUc! 4C;*0HMHZ`|aNt7_|[ &4LLQZN9, 73<@F>2 >D+@ 29> ;>069  ^RFI<9:6=48>=66:?<58C>78998C9BB?CHGS@EEPEEDJKZWI `GQSOPCFIC:5LEDizI`lb_ ABYQ;   F  S=   +,.)%/7IIGR@ ! Q=D9A<;7623669<7;63:9696><@>?<@AA4NRZ;GHJLLIQOUb jSTNMLLPO@;?79M@H:FRQTXRRNTCH >KQ'  U -? lac:>K<59=  XY=>>;C985123;:09958@;7::52=<=:=?GWLQN:96669574/<:4<:86<95;A<=?G@ZUSJPGEHNNZVY^dfY NP?@=AEFD=ETVJMLLB?KNMLMa`VTC M@JZN  - M OJJSFON.R> 1  @Q;;=:646847797BGS[VQTNJOKM]LS]X^VD PD?ERH?G>FFBHIIOL@A7Q^UHUuQ5PG ,4IL?JK(    O=4APPSOe2.     93@BD<;:9958:9:9:3E41<989B=C>:7=:::9?@;;@>>783=:G=?><<8FIRNTRJOAQTc_`g|bO %MKLKYFKKBCD?DGCD)?ED8@9JR9;8>CASWBII@GEVGTbJEEPTU]T_fV SKDF?KCIA@AA==@DDKLN7DQMFFILGD ! 9 G4- ,8 "  HLL87<::9K9;B@78JS?7=ANJCG9IME@QRN\NEMda_d[YQ cPFAAFEDIA@8>:CBKH.FJQU7BKWQUE   ;I3  (:       i[2784;5;8:6E8F>U:?6H:LO89BHECYRSrZMQMLMRUN XEEMQDF?>B9>DAFEC>>@JB?@LEKTWKPFBSMSQ  U  #PTTYSLD DG@  ' b]aEQO99>KGDI<95>FUDTNH?ZTLESSNMWQUTY\THB ^SQKEICHGN\\@BDA??MIFJOPDFMFLT >R> : IQ[UQVSM OJK  bi~ZjY6.7=LD<;7?JLGSYQPRVMQPYTWYbPXaTWQ> MogRLTIKFN^PXQHJMPENQGHAOSOJGJR" ^;E pUbSxgW]U\_d* XSHL'   k?CT\MKJQFBCYH IIS>  *]XSgm_efYO_U[S?']SFL5       yr]X5)@9YECC>?IEEJY[[WV`V[_ZX[]@MWLJ fchngdcde\Tmd^\YJ#VIGZFQOD>FDR UQQrRA  7b^edheriigTSMchWXXFLcPaaC  57    nm@=YcNG<;7CQI]RZW][VY[WH[EKIWaT zgwbib\YWR`HZ[3XVWGbQHRLCS S[cSQM  YSihlpfralkRY\ULR]^FX]YcT A  yq]=@?KHID:B/2E_TWX[VDPY[Y^OQYJY Urdw_dNln\UVYsTGZY7POBP I:WW>G  -skhztuvakljmik{ydujwycguUF-    }nucZFOLILE;OUJVX[YVVYaS_[XPFUHT r|pYUylgJnnbVUVhZWlCHL5 MUUS0 wuyprvfblrzugksz~byzhmN\NA*   |lIKRMHCDSPKQZXXZXc[MPZ\P:WLM Ryg\g{z{mu{aiXUrFT9TR I`ZMB    qzqw~~{jqqcqdp]jvy|jpxxpVL`Pj'  /    q`,=GLHKCNOXTWLWRRb]NSZ_SKVLe y|d}vr~rpxsV^oTVQXHPS \tdIE &  ,vkejpoirxrtsktsh^_fbXuelwpLj_\K$  ; t'HKKJPMEPSXNVaibaZQRRTPGOHP &ފpeakw{pwbd_YfKLVIF RQ_Z<;  Ceh[d{|invkottc`upmc`hflhxo}r^[NIk I  Mhsnd\Y_anlsshjndfdW\a]gtkoxq}zxN^STF8  9DPNJG\GDG;Och]KFONTA62  ~w{xxrm`TPt6YLWJV VihP3  {eZeZXeiomZ_r`lhch]][gqnsjie}k^ZOR[X  8lT47HGHE?GDHK@CXLNEN9F p~kdOEN\NTVHbC `rH/ si_aZ[jj^\[_Wcggcc`gffohoq\qiZf:La[F Pnv_CGFFDKBCIQOG@SHWAIG oqoyjjUUXT[PMG 6 >`vyyXfidYbe]bb]\_eeY]fkqqrrtf]^TR?fVYE ezWKRJFJEFPEKQN7SKH=>: o{w}hua[^`a:PG   I]mnxtIWZ[eZ_Xb`W][c[`^rywz^U`ai^DU9  ymkbNLSJRWMOKDO=CHKAC>0 vulZnqpkdWLK& Yeto^XaYsZj_c`^\Yd^Z^Wσ{tyf_ZQamL^P1 eLrHKGIUI:$ dm]DK=MTR}LVgcZ`cfcecgtp\c_{keZTEQ% :pQafPIHiadhOTOYaSWGR?S zk{dqihtg\HNNC ^anj]HxN\[^\PGLNV.  :  -N6 G9MJRIaXWT?T]  1 4 "$0T 0(nNUVYQ]` #'R2 0V  &8WV`hgXXY$ "E  *>>  2]]WohbT   "OM #WWYtaMD TX %EPaYebp  EaV 5|-VTXy  +[O +Hsi`ij^O*   #hԏsjs}cQ  Agjujrb^#  _ 5Vco]TV ! vqYY, R %ViXWh QN  a[[QHS    dm@\     0P}vXQC    nQ'/      j      $    A4   s  =*MxF   Fl          VÉ ;  |{yyXS Q ȾJ$    ʹşǢIJ亟³ģ_wò6*Y~p #    RⷻàR     e׭γОǤG*  ߲ÿӭʷŵǸٷ³    D . ^u |r! 6ğҾýɽ{H sҽù˻Ѽ˴ɶѻP .ÐȻȖӯ3     CH  k(kl[Nҹӽlz1̈ºľżȺÿǨƩЭm  Bƹӝ߽{  VŽĿǽܪ8w~|ؖB=_QJßѵ¾ƶïͶؤփnT    ܹʸ² .ɥ㳽fȧǢxXд!3zrDǰ̬øοŻЙr5nyҞ     c͚͡  RѽLѴϹ¼ѸծɬvZweD~ޓX®h'BF4`®˸̴¿ž´ƼĽ͸ֿJ?       Zk̺ؿϸϼ  gҵ՜l~   ĿѾǮаıȼĹ¢ȚñÿץdN4p9yĬýҷŻ̿ᅜmV  ϴʿzё    ˡͿ{ҩc [RȿpĻþĻŭüŽýwm^ʿľ8dl    `rs̰ϻӶҢ—ɷ al|ض~DѼ«ɨpp=  ǿʻ¿žпz{{wɿ»ųž¿ýį      o콠⮹kĵiڼͶ«odz俳ξѴ̹Ŷũ6    7Zeƽſ¾ʹͷͿòĺ¯z      X¼iǻʨЏ}xxOOk)  %Luy|ºѶùú¿Ž˸~ļh        AA×{ɩ©}owvƅunwe8Lnuqkje``Vl5% )~ngGALvyx}}ԓĪȾ˻ſÿÿtŽ$#9sY/̼ɵ!ƷðКŴyhquxqq`nv_kfpimsogccdcgh[aWxqbZm|~P~na|ǺôñžƻǾ\ġĸÿ¹NmSok^yq?gjeiljdlimirjknu}qoPLQTVw~@rlm|XptljǴúkº~}‚v{{ztqqekng~c`ea[cstrnmgOj`dhãtv}y]doj~vmغϴuCRxijvrwwssxzxstux~}yxwv}umgtyhqptsoqysssrvpvvz|tJVgiDC~K}o}||e-zƿϥѼ˾഑~yxghnt~tkhlpssy}~|tu~~~~|ldw8)Uowq~ws|åtàǤy~ĥãwzsjv{}zvtWwv{N^tojgX`Uk]]mzcuziqU89pMhe70K~}uuzn}w}qrhlgikifoy~igr~XRqolD{r}x}z}}{x2zfkjniTJc} be%A~wc-b||yzzxg{kδ}}ſ°uhu~HY}k{dž߼{v~vszšw84[g1[GnzU`Z~lzžɝpPV~AEO<_V2SSr~1v\zmOctRĥʱ~{±hլåizvζɫļ®|vYwǨƹſð`HnF?:Qi5hwf{ϺȬű|eϠ͸ľýͻ˸¾˻ͽýƺ»Ľ̻ļýǾ¿ļſƽõ»˸źüɻý˾ÿĺþŷÿʾ´ļ¿¾¿222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222242122/1<99/41.222432222222222222222312130=?5490541/2,1.660042662222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222324*/1-622+*1-332312222222222222222212.5.+(.9ISlh*1=5(#Paˆ+22222* ºnw-22222222222222222222222222222222222NF22211038/422222222222222222222222222222222222206,42/01&7,/22222222222223022222?253064.3-<03i0]H>KGN;'463@@2222222222222222222222222133..-422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224fIWb4&M6Nz`"96_}%(&/;߀9/X_޿&6.,N690@E6122222090-{^EӜzE"222222222222222222222222222222222222302322213014/4222222222222222222222222222222222222,)02222222222222-42222274130(0Ĝ*0$04.ApYQ_&<:G#22222222222222222222222221.>-&)111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222235930:44hdjj_eL1Y?@-BF<%,8Y?222222222223332122210,5\,NJ/222222222222222222222222222222222222222222222222222222222222222222222222222222224;}'<>8132222222222223.22N105E0(4FW9A/?.+HF;Eq;F4668PmY@U22222222222222222222222)!N":/<&8.+*1&3%222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222:>;F8)52!..!+=(*+6*09122222222222222222222&NFQ:2222222222222222222222222222222222222222222222222222222222222222222222222222220075ǚs&.22222222220.63221..2.40*10.#!34,,/6D`tE7>4<>L@=<48U93,7$11:.+,-,21221*(.<6521222227'211..62232222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222)?HD4.:<3BCV.02..382p225da[UE1Nܸ~0;r@rD>A222222222222222222224$Ā]S:L':62222222222222222222222222222222222222222222222222222222222222222222222222222221$>]+/4022222222220<$3228".24/8D4I:877433/463273?24AK;@8536% $/23+90.*1'116)/##*2222289222O>>0E,222222222222222222222222222222222222222332222222222222222222222222222222222222222222222222222222221'99;7:4Bp1/6cQSF-[eEKQJ=1/U;ZM4s6 8(10ѩ{8x`BqljG(Pן;=8322222222222222222 /2xDGL_A2222222222222222222222222222222222222222222222222222222222222222222222222222222-::W'2222222222225; 0/!"0!%!07/0.9-5741,*((-),.125/3301,*$+''330(223+.$&&6$1+722".7#22322332+-4'$).''3)-546022222222222222222222222222222220/5222222222222222221,2665B0:/50./6742222222222222222332/0(224H=FC)'<>F78691@H?HI5%5//3+lAmHUXN4<60}G?XKrqavpSGlY]"/,36342222222222?5'(q{2ZW*bV;2222222222226342222222222222222222222222222222'341C54.3680022222222222222222222/54IA2764+0222222D?$98951+&E>&/4-%%/.2)/,!//,6+*#.$#""!HB80/8$#7-0## .)+#/6>3"055)&, #>#%#$-)+*.6+5664,.5692222222222222222221'998222222222222222231+0:3%CPG1017?51122222222222222..--(-2217A/),)(D?=P\^N960./$+ GL,6617*4I:B=/24#HGKF6JG<9)@BOobhʎ}0A512222222222,6A=0Ql>:?2222222222222,-122222222222222222222222222222229).'5(0' ,52322222222222222222222532,A5?7'3222222E2--/. ),1# ,0-1")*)*'%&"$!.1/.+4-((#,## $!#)&$(1$*4&)'#"!!#%*$&!&#+,!*$$8C322222222222222222 134222222222222224*)3,)+()')##"$"*3(/*"/&#:=724.:<2.'## 44>?33#++3$L56<"90).7#+*,%$C--2F6I!+7;85(506-/(>&.7"-J=?is9&+22222222223.3A4e&922222222222222222222222222222222222222240(2(!">& ,*%.-52/22222222222+;6222284221)#...'=53."*'#&0)%-*/% "/-.'.*  )056A)&&1,15.(& #',!+ *'%+.3/./%& /.(*%((#%"%!/;8)(=14(<8538))-?91,2:/222222222222222("6.6+&$$$#&%&'%0'*$)(;"/)##9" #,)1C4??761:'>A */$)=.>" (:lI)-J-+269,67%%12&/560C</jٝW/3-222222,56*+}322222222203=62/28,492222222222222222222222222222442 +>:      2,/  #"4&""$"' ""$+! # %   %"#3N+""#-!!&* ,4-8-'*)5A20&5B=0!(;0(82296!D+(,""%   !&1!%;6*="%.-,+3$--*&/)0( )&.2729?>@-79+&?%:*03<:<6<=+-5)0A-8.3'&<1!".( '   " $2-3&!0-  &*%,)'&#.#!"%"%'+*)59:28A13!A+/07223);:C3D+27B22%;'3/,2222222200"F%,*=?2222222222226)2%1*51)0$O:22222222222222222222222223*2-"031   0.-.,     '    !  ' !1 %%"* &:#)%! **(-$0##("-"&+/'22222/,F&:54121(+*  +  !##&E5%=@  $+!#"##"!'&$0%(+9/A5%;'6@/6<21F;;1970:L*A/(6?; ,O)<222222222222200\*?2222222222222222222222222222222222229/.2222222222283!! "21                        A%%.!%%!( $+&!"%'7/;222222295222.35.  !+̲#  +) , ! * $!$-22222222222213Y7,*#/6H7#-/+6.<#,12222222222222212:12222222222222222222222222222222222222.22223+.22222 Ft) "  224B   '*                        (&:0<#%#4 /&()!$.' (!" 6'*,222222222222+322222= ,S%.M6Q+    ! &!(422222222222214-,/#)1+6:(?H6'24;,42222222222222256",!.Ԇ312222222222222222222222222222222222222132222#022222/1N"   221 15                             #*(!2/':.453%%$%$#! 0"-03222222222222202222:4"+##)%$`)()j .62+-5^BJ            222222222222225.11$ $#+11( A&2283222222222222222222/0(v72222222222222222222222222222222222222222222::%722222!X,  )! '>3@"                           "3222244 #(/)/ /2222222222222222222222222222/) .$7222222222222229Oeaw  &    M <9*22222222222223! !$!7:+&E/96422222222222222222222222222222222222222222222222222222222221.-47.2222222;%  3 3< $223+ 0  !                    "    222222222%)222925)' .5/222222222222222222222222222222222224?:$,)*F)722222222222222178=P( '(     !#%622222222222223>.(&# )(4/,6222222222222222222222222222222222222222222222222222222222266!0/22222224A ,51  +&42/0'/  +                  !   ).222222222+./222C1$#.60522222222222222222222222226422222222222,*4<;1222222222222222229#&VK2>%"$    ! " +()-822222222013&"$ $,)"92222222222222222222222222222222222222222222222222222222222,-*#22222222222!'; 5.462B                     %    522222222222222228@  45222222222222222222222222222142222222222( A0=,+=/22222222222222222)2( R4 "       222222222;-?!) ,2222222222222222222222222222222222222222222222222222222222<)J22222222229 B2(;253=%            !     $)"#     &"*022222222222222225  -222222222222222222222222222222222276%)./022022222222222222222222224-  <           $))$22,7# $#212222222222222222222222222222222222222222222222222222222,@+13222222224*"3<0222>    $ !!  "       ((&    9-+222222222222222229 <=-/0322222222222222222222222222*.6<,"&02232222222222222222222222222222202("         )22!" #  !),22222222222222222222222222222222222222222222222226:=,4)$162222683$(A3G#(%)    $ !   "!'(" $  ,    '      &:"5110%22222222222228 (<2228'G22222222222712222222222225aA/10422322222222222222222222222222222 8 Q4 !#+      22A *12222222222222222222222222222222222222222222222220+ 425#'522221!$    " ? "  '#)''(""+&(+% "*/& ""! $  51 # 4    )12222222222222/*)22221532222222222212222089<43.  ?MTKL\N89:,!"%!" 4     8(!' 04-< 92222222222222222222222222222222222222222222222222222=8=1,$")% # #-#"##%'(3B6-9EJIG6:F9KLHA<1$%,'oJ[ciMp[QI:,34$+!4@+/@JMS0iJ9    --/22222222173222222222222222222222222222222222222222222222222222222222222222222222222222222222222222'.-$(! 1RUc3EFD<-.0'$"&'(  94     /.130?* 02222222222222222222222222222222222222222222222222222-!0.+,&'1/!  ""!""#%$%'+;2*>L6QWITYGQIHDmTRU^]WQXQTMPOPPOGLNKMMHF=I \-4:Tds"g{P./8$&1>*22222222222222222222222222222222222222222222222222222A'#% !  .#" *"!$(,#89.#$'!%%*+17HjaNrMd}bdk^^_ay|zdjLTioKRXJU\WcP]RE8*AH="VjDpEQyQh~IGE4;*Ic_GTHWSYcQF<\ZSXH@'  81"   +2002/22222231322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226 F9<:+ .%*GXMT[NL;.$,! *       ;-8 62.2638522222222222222222222222222222222222222222222222222222294#"!&1)' #.%((2$!"(- 9FK[_$" A=_l}y`nbcm_aV\txilIIZQ&BB+NLerx_HP[vpihPjDB_iWjeku_ZblXXSeM:C$ ;M?55    439%*0<2222225/.22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225ERF!1.FNO@E?4304 &#   '=& *-)    !02222222222222222222222222222222222222222222222222222222222222220' ',% &&# 328%+4'0*39;#$&3@LMUD.AmDWzVug||zhdr`!|{dKA-!PRSb~{^zQdRkxw}}s|smvzykqtP38YjVB#/M/88,3' " 4171&  !. /222222222222222222222222222222222222222222222222222222222222(222223.+2!.!;0,  "%'/9N5-22!))2,% >EKp22^y׈3`filin?koyiTY)#2J=eCJ:zpxhfPCNb[cx{h~}vnsugmU)!6;^>6& *52220 80D7/+:222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 #P3JHE/*)W6%5_R\CC3=K3(+.$!73+&;(#1-=3  '5*33 :73226222222222222222222222222222222222222222222222222222222222&441111%$,$$7%!5,6D=2 .% "3*%*2>4522/001-:93!).5$226ư=5uz{xgFw_jmdV[Q^=bbkZ9%J1FR2JW`ZY]ztoiVe{{yvq^OJPB=7#  '2*222/&(3122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222*!-SY/M,[;O@) IH+46<M3 &"A<8;EUnw|~wu|{nhvw|}`z}pX(ESC^W;  .5222222 +,2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 <<*Q6NT?J?G:[fjyWDL;BSF=@5$7("4,    "*2222222222222222222222222222222222222222222222222222222222222222223)"6W=.M8(!0222222226"B2)201(+ %* <.886',04<;7)&! +,:522o2aXpxlQdC:Q("/"7Oa?uuKfv_L{z}twubU42222222222222222222#(3&1#0kV>Z7)4M32225O2-2186> 5223$2'8*&'8DaiFTXGJQO(*2-78pvNST622,si~@879,)szc'h6oq\bOtxzmbe`BAM!"1"<( B22222222220+$222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222232==F:jj[Rdb?sa/ aJRJAB@50'#"   22222222222222222222222222222222222222222222222332/4/2222222222222222222"47'FJ(70_^2)..42222312208>6"E.22(>,,A='&JV>DbobQEFeK3<=(J[?^OKC#3226gkbnZZH17GSl;~dl^G3)Rswxxhz|fW@ #2!%9276-52222222221B'2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222270861+v_eYH=*Xl^T'JGUA9;$(%$    "12222222222222222222222222222222222222222222222222222222-2222222222222222;$L8KGBZND.235+*23.3()01-KF)/2222+#M$74:.Oi6Mgv>:AB0=Q@:7+ACUI&4*2]n|ci}kpsqKWtXMAcqeD8rtdmAT 3~xMzibVUH(F,0N%,2-" &332222222?/2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222J;GQPTzQ`5qEv_>OFJ>JLD:1,       ?2222222222222222222222222222222222222222222222222222222222222222222222222228G582,'=*%1(5>9;DKT2122.22222213=99)84/H"),U@:=/Tegev_Z?4jhoCK1'XdQS|ywqRJCA@HJW^bCwvtn}nsjnb{w)WfnguhJ<#X/$"@6222.,B220/!,1 $":82222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222..M=9jX^LZp?PkODMNH;9301# %$#     1222222222222222222222222222222222222222222222222222222222222222222222222222,V+862g~Yh}}03222222222149+&,<(2;42;4!27SxU=m\\lpdc|wxwq{yvxm^jOJ"+4;mriwfw{ocm`W^n`cxeSaA9-;BDe`JJ)% 8/&%(;1222, 522"* -122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222217VstalY8FArrOYgcXVFA5>5,)$   #322222222222222222222222222222222222222222222222222222222222222222222222222/@=@>pNZa~B=2222222222222/7G222233`:9H{eWT_x|ruP?[-F &9398"%2=.'2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222;'NkgvcZ0^J5CV`f_?HSGK-(&322.772(222223%(222222222222222222222222222222222222222222222222222222222222222222222(69=s+3r~ȶ;ùƷaMi25"qnyjUŦipQin`T-:%5OalKeCKNDNZ* m2(,    32222225092222222222222222222222222222222222222222222222222222222222531222222222222222222222222222222222222222222222222222222222222222222+7,EX'=WfjhWZKcD=9122222222222224&5/2222222222222222222222222222222222222222222222222222222222222222222/8/51jvxyoʬʰȶ\8?!# Y%$  623222223;4233222222222222222222222222222222222222222222222222222222222222222220;2222222222222222222222222222222222222222222222222222222222222|s,0& #OLg>v;T>522222222222222222990)j823/2222222222222222222222222222222222222222222222222222222222222208Zÿ{ɣpƾ̤ɮ{o65ou|(,%&o732/7402/A^s}wXISKGGG=5A:;WZLK;61:&,+@$%&   0+"2215422222222222222233222222222222222222222222222222222222222222222222222222+541222222222222222222222222222222222222222222222222222222222221,`;743F_[Y[)*222222222222222223;6ZY41<1222222222222222222222222222222222222222222222222222222222222227WʟƻȺ{Р}=>sqUâ6?021A0.430(,oiooSZEKI@4LKPV_hPoU,D+$2 $!19"$<*J#2-3*52222222222222223322222222222222222222222222222222222222222222222222222222322223222222222222222222222222222222222222222222222222222222222+144 .WiZI72222222223222271;%11F`4722222222222222222222222222222222222222222222222222222222222222<}xv12@jڹׯXui722222202&seolXbcMKPHI?CKS_JYiF5+"(% .1.%,!=1 )2 :50C 52222222222222222222222222222222222222222222222222222222222222222222222222222222222222216048222222222222222222222222222222222222222222222222222222.%WZ! -#222222127;5043%8`< V(B-;:+12222222222222222222222222222222222222222222222222222222222:欭{vq{mn30pɡ$222222221#MWI\PPW?ER0.:!9]h9G68.> ME$>#)+6'(32222217/22222222222222222222222222222222222222222222222222222222222222222222222222222222222222#5A@AUCCM,.D<5165$)vQ6).$0  #HA.;8.'1222221222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222266#22222222222222222222222222222222222222222222222222222/& !&:8 )32222. =022222211P&-.29.7222222222222222222222222222222222222222222222222222222222:5iùge%-,zz2222222222225CBOLGB>749 0@&*4@+7922222220222252222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222!2222222222222222222222222222222222222222222222222122222(4:/--3C 222222<22353:2+,4!$1501)24222222222222222222222222222222222222222222222222222*{ƪѲĶy;3.1@kͮ.6222222222222227?JGN<)"P3:W6&N022222228%", " %%  -.2- 2222222222450222222222222222222222222222222222222222222222222142222222222222222222222222222222222222222222222222222222222222222222222222222222222222232222222222+0  = /  $2222224221##426458)6>52222222222222222222222222222222222222222222222222223ܹ̐yʽw805mԻ9;<22222222222222?G>P13>AOFGH2`6312222224*&#!!"*-225522222222227!+22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223@>"/222222222;4+<3@<5,:3.2;1:32/:1222222222222222222222222222222222222233<22222222>Ǵq׽}uL624/Uc|822222222222222225>BJL?ASLD=.722222222222 6G0)$.)D%+;36211222222225522222222222222222222222232222222222222222222222222222222222222222222222222522222222222222222222222222222222222222222222222222222222222222222222222222231& +# J143-/26-353222222222222222256D2222222222222222222222222222222222222221.b222222t{zvmսעbwrm83_~m8022222222222222222220-DNUW}XIA222222222221/IV\ )!0.3-+48528242222222@2222222222222222222222222322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222121-)$%!% *(<'*A2/@89322222222222222221%:22222222222222222222222222222222222222234<222222m{~uqWv}~q}ysm~zo͗xUJ,4KOAA532222222222222222222)5TRIQ3\@;=222222222221;M(-@%)278/(,-271232222224$/2222222222222222222222222322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220 6D112222222222222222222257222222222222222222222222222222222222222<,9222226bMHhoGChT`egvisqq|~qm}tfdbV?,UASc217`qy86222222222222222222222222NTbbDd14222222222222222220',. 5#6222222222222+&2222222222222222222222224222222222222222222222222224222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222/-  Q223222222222222222222229-322222222222222222222222222222222222222222222222;HC/+F'+N?o^isqgre}~xnpShcJSOjxzrHQC,ETt1O@s]RY:22221322222222222222222222373Gkw{h>.22222222222+?3222,E##222223222223!".22222222222222222222.72222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222488:/ $82422222222222222222222217422222222222222222222222222222222222222222222222:D9/7*1BAFVJ7.9'+/35321:2222222222222222222222222222222222222222222222235(8## '1;.+NPMAA1>RX^HF2JTkC[1=DJIF5.2?D)vm_tZd:BDB*<@UOP1522309=0*'2222222222222222222222(*?%7=.02222222222279-2229/5.'#22222322221-4=! -:222222222222222222222222222222222222222022200123222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223+($=322222222/H3&2($3LYTghP7"((3 tS\5522/*Lz.3-72222222222222222222322C"SGC1*22222222222E:02229>*7.5# 7$ ;2222232222735C6.222222222222222222222222222222222222222292211:42322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222332222222222222222222222229022222222%*%//$=.& )32222222222222222222222222222222222222222222222224:.& !&!C9<90>:3<6)?H 5/=:$$$&%.! ./F`P~y:022222222222222222222222223=HMC:422222222222222222/1C@2222/222233333336)9342.%A222222222223>.2222222220002322222222232222203322322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222?"*#,8  &6/ -22222222222222222222222222222222222222222222222223/*+$(7=*&4;*"0%5C81'$&   *-2;A[rfkz56222222222222222222222222233!L*%+222222222222222227&6222219622223333233%>4323B3$82222222222234/42221422212@3642222222223222231420/32222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222,3G5):#' %&2& =222222222222222222222222222222222222222222222222((!(*)#"";-.G 2)?A%       "  !'8CkuWSUWmp2222222222222222222222222222.:54<73222222222220622219522222222222332342212227?222222237223223222222234@22213332222222222222342332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222,"13 2   -66;;)1222222222222222222222222222222222222222222228%( .;!(5-?('/)7           &bmMUSVo:222222222222222222222222+612222<6 :222222222227&42227*6212222222222220'*032;&2*#;2222222152222222232222222322422213/92222222222312212222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223-, *!&  %+0222222222222222222222222222222222222222222222'!*""%$Y.88<7807    #"#C2u{nP`l14222222222222222222222222.:3222260/>222222222222/4522289.432222222222224 !23$+26(&22222222322222222322222223222222245/22222222223;2232222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223322222222@. # $&0   +72222222222222222222222222222222222222222222225" $13$-;722222/,52      ,2JA;%,5^wZll[.2222222222222222222222222-7222222222222222222222227#22:$22222222222(A'2222223122222222222222222222222222221222222222122222222222222222222222222222222222222222+222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226,&: #    .222222222222222222222222222222222222222222222222222222222222223322 )*     (rQVD#>>?d\]O[SJ1322222222222222222222222224=422222222222222222222222;46) :3178+428/,( 552222222:022222222222222222222222222222222222222222222222221332222222222222222222222222222122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222:,5*/    1(   *222222222222222222222222222222222222222222222222222222222222222226'8    & AxnXO*EBEF.&T82122222222222222222222222221<32222222222222222222222364 -0 435/5632C4  3322222261222233222222222222222222222222222222222222222222224332222222222222222222222222222223542222222222222222222222222222222222222222222222222222222222222222222222322222222222224.&(   &   94222222222222222222222222222222222222222222222222222222222222216?      $:b+222206049>222222222222222222222222222222222222222222222223342222222222222222222222222222223..2222222222222222222222222222222222222222222222222222222222222222222222322222222222226S/.        D5222222222222222222222222222222222222222222222222222222222222254+     # ?G:efK>#-&>52222222222222222222222222222221222222222222222222222222+3!4 32223  4822220$04%'<222222222222222222222222222222222222222222222223:122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222-522222222221)3#        !2;222222222222222222222222222222222222222222222222222222222225025&  *U@zcU8>82222222222222222222222222222221822222222222222222222222222*4 ..92226 (+3"*33/03,6222222222222222222222222232222222222222222222,222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226' /22222222'3[!    $9415222222222222222222222222222222222222222222222222222222222.      $0" '     *6/?.-'S?%:222222222222222222222222222222222232222222222222222222222222+<=6K;3<-   91=92222'430 -@,32222221=222222222222222222222223322222257A8222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222232220\d)       6<;4122222222222222222222222222222222222222222222222222222.!  !   $ '/%('33)H%222222222222222222222222222222222222222222222222222222222222222G>3 BK22+44,3/0*5412':1895 +?:22315'40/823222222222222222222222222233222222222222222222222222222222322222222222222222222222222222222222222222222222222222222222222222222222222222222258        )B012222222222222222222222222222222222222222222222222222 &   *6R4::R2222222222222222222222222222222222222222222222222222222222222222222/84K5./724=22.!5 0, &   -)2222220*41332222222222222222222222222222222222222222222222222222223222222222222222222222222222222222222222222222222222222222222222222222222222222222<          "J22222222222222222222222222222222222222222222222222222.&!  % @NO4C;'/222222222222222222222222222222222222222222222222222222222222222222=66 [=33;.439'&B294 122626->=00&4   22222222'4232222222222222222222222222222222222232222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222&7"       ;:>222222222222222222222222222222222222222222222222222/$!   -(2$Z$")!02222222222222222222222222222222222222222222222222222222222222222222322F1222222223324+B0422222303:.;12.&+  331+51#.1133322322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222I$%          !*9S!:222222222222222222222222222222222222222222222222229B-! $!+$.%0) +=22222222222222222222222222222222222222222222222222222222222222222222222%0K8-039/-**.6231)2194222222214-3242-$/"  +762223.222222222222222222223322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220">)     2,)09: 8222222222222222222222222222222222222222222222222225,  ## %$'$5< =22222222222222222222222222222222222222222222222222222222222222222222222*,$.$Q*57=,5212/K2312222222114<'3222 #,26942220$2222222222222222222233222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 )        #"%2!#-+.G2222222222222222222222222222222222222222222222222222%#!# '/*+J* <2222222222222422222222222222222222252222222222222222222222222222222222224' ()7/-)+'437*&0:0/+1+1423*22+<  &! #752302223>@4*4322222222222222222322222222223332222222222223322222222222222222221432222222222222222222222222222222222222222222222222222222222222222/~0         $"%(8-*0))2222222222222222222222222222222222222222222222222222>%$&"$! (AF.:222222-322221222222222222222222222222222222222222222222222222222222222222222221141'1 $("0;' (2222222222@P;- *82 B2@1.2228.,76*32222222222222222222222222222332222222222223322222222222222222225*622222222222222222222222222222222222222222222222222222222222222222,12        $)!/1=8806-52222222222222222222222222222222222222222222222222222!#* %-%  1222222J122232222222222222222222222222222222222222222222222222222222222222222222241+293&'-.,./A.22222222224665Ae>282/ 710#222118+%1.322222222222222222332222222222222222322233222222222223222222222223022222222222222222222222222222222222222222222222222222222222222222:]0+      "*=##+23-!%.22222222222222222222222222222222222222222222222222222:!%"!+2222222222233222233222222222222222222222222222222222222222222222222222224222222222222222!5/<.6222221247222142220fTD04304)$0122222222:$>2222+222222222222222222222222222222322233222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222+7&"        $%" 2/@<:.(5=22222222222222222222222222222222222222222222222222222&,% !'#2&#.#2222222222222222233222222222222222222222222222222222222222222222222222221222222222222222)76*;22222ATJB224 I122/28<991222222223B222+322222222222222332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221B7     $ *!%H4%0'%.22222222222222222222222222222222222222222222222222222227!**%+!12657222/69222222222222222222222222222222222222222222222222223;2222222222222222222222222222122222229Gu'4-=322210C4222222223/92222222/2222/12332234433222222222222.222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@>77    ,!!&-'%0#*2+&#(222222222222222222222222222222222222222222222222222222?<[%1' +.#"(, &+$,22222.235,1222222222222222222222222222222222222222222222222222222222222222222222222222222222220/5228-1/8)%"8222* <023322222222222222742222215222222222222222222222*7122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226C3;$,( ,-!.'##)"%0)177<,-222222222222222222222222222222222222222222222222222222=(C#)&!5=& %30/222223<3'9222222222222222222222222222222222222222222222222222222222222222222222222222222332225;'22-72'5%S:2228%%:233222222222222223322225072222222222222223222222333222222222222222222222250045222332222222222222222222222222222222222222222222222222222222222222222222222:&pC8M.@+  $!-'&*)!'&/*14=,:@/4:2222222222222222222222222222222222222222222222222222220 F?&&,#%':+1*"$(+"-!)&!F3222223:22222222222222222222222222222222222222222222222222222222222222222222222222222233236T+40R8/91;=GK<22104/92222222222222222222222(,-222222222222221222233222222222222222222222133522228522333322222222222222222222222222222222222222222222222222222222222222222222222%Uh(C2$%  &%)) 5(15,"1,37/.- 82222222222222222222222222222222222232222222222222222221[.56.04995=46/,)!)$ ')222>4/("+222222222212222222222222222222222222222222222222222222222222222222222222222222424;/79@E=<>3+83=2E9.6E<0"(2233422222222222222222.$A2222222222149/52222332222222222222222222242370222.2746333322222222222222222222222222222222222222222222222222222222222222222222222,3"N@@AA40/>F<?Q6402/12222222:4PC%122222251H7#22222022222222222222222222222222222222222222222222222222222222(PIDJKHCNSX^QSMGOLE;D9?8RI=DJRXWG.L=<W19222222132222.,.4232222222222222222122222222222222222332222222222222222222232322222222222222222222222222222222222222222222222222222222222222222222222220plnbP^!%%!'37-.-"$#)(#262222222222222222222222222222222222222222222222222222222222/8\OB@H]XU]bFUIB=>F&'3462222222+4><'-22222272222222222222222222222222222222222222222222222222222222222222223%9CG9D^\FNSINVgSFBTBFA@IABBKRYXGURQM@=1)^A462222222322222>+*22222222222222222222222222222222222222222222221222222222222222234222222222222222222222222222222222222222222222222222222222222222222224+orstYa&%:0!%)8$%3/)22222222222222222222222222222222222222222222222222222222222222vRD\QWQTUQSM4B8>4"6)77222222;&;>++022222222222222222222222222222222222222222222222222222222222222222222228AJPRG?LNT_\iIMRO1?67"$/22222222222222216/22222222222222222222222222222222222222222222221223222222222222211222222222222222222222222222222222222222222222222222222222222222222223(kxj*'4 ,1( &%>+/462222222222222222222222222222222222222222222222222222222222222rh\X`UbWSQOL?83Z6#0),412222221CBJ(=822222222222222222222222222222222222222222222222222222222222222222222222i]]IAL;=JHMC@DNAFECK>=;KRNSK`cdGAURBA;25=.+4222222222222221332222222222222222222222222222222222222222222222222222222222222222222223322222222222222222222222222222222222222222222222222222222222222-PzvT9%"# ::222222222222222222222222222222222222222222222222222222222222222222qlP][f~Z^WJ@)(3=2/1%)5422222222;Q,2222222222222222222222222222222222222222222222222222222222222222222222225XH\_BD=>IN;>>B9EGGDCEJFHMEMPta]Z\6PE=F.D=-632222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222,PKZG|o#""',%-222222222222222222222222222222222222222222222222222222222222222222222__LTe\kqdWULI97;7>/'&222222222223$462222222222222222222222222222222222222222222222222222222222222222222222222N=VU\:KLGC>A=GC>A>E;D=W>IAEBA@?FB>A9fXX\qfUVQYGE?7GR3>$/12222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222EwrH4uZ( /  -!"*72222222222222222222222222222222222222222222222222222222222222222222222(daXVT^U7@>JIGLF)1'%22222222222222222222222222222222222222222222222222222222222222222222222222222222222222221058DJA9KBJ=:9HF;I>EKD;AcmvovO^RXLPKLB79:502222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222/\~4:27%B-,11$/#',1. 1/22222222222222222222222222222222222222222222222222222222222222222222228[|n|aU@BEICB'%5 4222222222222222222222222222222222222222222222222222222222222222222222222222222222222222206#+'@;8<;34D3CDJ@A?I?D:R{poUYmK@;JFB.-/!12222222222222232222222222222222222222222222222222222222222222222222222222222222222222222222222222222333333333333432222222222222222222222222222222222&1~.d>DD&'5, 1&*((%&#"22222222222222222222222222222222222222222222222222222222222222222222222222AVYVjgWSIA?<#,36222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222271<9$2"4;6P/=NE;)00E22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225,VXT<1+ 422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220,(0B04-"#()02222222,1,.M"?J5*5*4.+0222222222222203*"5NB-:AO32)37"92222222222222222222222-4422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222(#>D9O:08!$"'! 22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225&2?(2(>;3:.+""5122222222222222222222222(;2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 T9H22,364) 22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222<.7"'04+2+#511222222222222222222222222 ,222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222227#]G23*5/3-(5+/%22222222222222222222222222222222222222222222222224222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222322222222222222222222222222222222222222222222222222222222222222222222)!$222222222222222222222222221#4022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222,!e0@^>24/%,/2,-+,%222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"!##'222222222222222222222222222224 222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223#".CD=2/1.25;<*022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224016543$822222222222222222222222222222 #(222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221v1<=@?1)---642222222222222222222222222222222222222222222222222222223222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222:-622##22222222222222222222222227+3.32222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221.S+5(@;:78@222222222222222222222222222222222222222222222222222222222222222222233222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222:* ?-2222222222222222222222205)+!$22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221f459<4@>1632222222222222222222222222222222222222222222222222222222222222222222332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221. 2(222222222222222222222229'M01422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222210Q8?EH::F/6222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222' 1222222222222222222222486.'3222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222';9<8EE?96C2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223#5+222222222222222222222;',+=3222222222/42222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221,59O9,A222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222%vA$41222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222/8BB8<;I)/.22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222122222222323222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220-0'322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222*"o2,-X67622222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222522222223063222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222)?22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222203KhF;?C:,:22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222*222222222222223232222222222222222323222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 432222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222hpM;KS13022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221433447222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222227egN;?7:.122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224 .7222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221^KD/#8-622222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225G .,22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222)vH%-0222222+0(4/22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220k.222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222280A55U12222226!P,222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224/22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221^>,7!W1122223#:)/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222372222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222,222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225gr50/5/+22222222222222222222222222326/42222222222222222222222222222222222222222221.2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222256222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226-;S}}=3=2*62222222222222222222222222214"622222222222222222222222222222222222222222264222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220?122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221.r>%@--+22222222222222222222222222222240222222221222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226.22/=*021222222222222222222222222222225322222222922222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220.662222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.B:22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225#;2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.54222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220224(072222222+HE0222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222213220072222222/5/32222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.gR/0034222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222./)-=97鞑222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226/42222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224UN3b|~U6;22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.5+22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.3[ɨ^1212222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222659,0.8222222222222222222222222222222222.7+22222222+0*96/1.2222240.664222222222=512:112335309.22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226\ȇ0212222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222@222222222222222222222222222222222:2222122/uwup+y022222/\3222222222,))-FrL422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222-1F$2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211@4$/13432122222222222222222.7áƼ𾣰ͼpiŶ¡Q>JsiȘ).K4222222222222222222032222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224.222222222222222222223827^㹼ě['12222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233/,-0.222112-"xȣҹơɽJ=0.,22222.6*ګѬξռ.3?49437<+22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222/l22222222222222222222T464sâz%82222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200aG3222YĹşɿøôؼ}vU22222-գԱɹ޿ԽӾ¾ӭc322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222142222222222222222E!ʔñЫN/2222222222222222222222222222222222222222222222222222222222333127"-/1474/8:H,45*520QS<"/&@5272*2-j.aqG.e¯ĸvgtHŷɻбѾǿΫj,732222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222335343222222222222222222222/3#NΘڸ}z02222222222222222222222222222222222222222222222222222-01-h.ץcrĈ|v|ǿȾǽ>6]H>¸ŵºƽŨΣև-|l+"3709122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200.11/22222222222222222222235,Ӱ϶,2222222222222222222222222222222222222222222222222222Mҟվɼřv^¿*q8ľûǿƹĺƽŷ͘v VH>]}HH8WwHH2QqHH ,KkH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??fV@#WGS 84|gdalautotest-3.0.4/gdrivers/data/byte_chunked_multiple.nc0000644003401500001440000004007713614004466023303 0ustar rouaultusersHDF  ?@`OHDR }" V 4GDAL_AREA_OR_POINTArea . ConventionsCF-1.5 PGDAL0GDAL 3.1.0dev-245fbcc-dirty, released 2020/01/07 ahistoryATue Jan 07 18:26:25 2020: GDAL CreateCopy( byte_chunked.nc, ... )k;OHDR   mbщOCHK|D&transverse_mercatorFC6FSSE_ROHDR  ?@4 4  G 0CLASSDIMENSION_SCALE "NAMExSOCHK <xOCHKt! 4 _Netcdf4Dimid  ?standard_nameprojection_x_coordinate B long_namex coordinate of projection !unitsm>ͽ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.0.4/gdrivers/data/ignfheightasciigrid_ar1.mnt0000644003401500001440000000024713614004466023653 0ustar rouaultusers-152 -151.5 -16.75 -16.5 0.25 0.25 1 1 1 1 0. éix -152 -16.75 4 2 -152 -16.5 1 2 -151.75 -16.75 5 2 -151.75 -16.5 2 2 -151.5 -16.75 6 2 -151.5 -16.5 3 2 gdalautotest-3.0.4/gdrivers/data/hdifftst2.hdf0000644003401500001440000000763013614004466020760 0ustar rouaultusers j\     < N! o s< !  < ! 1 5< q!  < !  < 3! T \=j    6j    #2j U Y o 2  ?JLQJ I04cNCSA HDF Version 4.2 Release 1-post3, January 27, 2006xPd2ValuesfakeDim0 DimVal0.1fakeDim0Dim0.0ValuesfakeDim1 DimVal0.1 fakeDim1Dim0.0ValuesfakeDim2 DimVal0.1 fakeDim2Dim0.0ValuesfakeDim3 DimVal0.1fakeDim3Dim0.0ValuesfakeDim4 DimVal0.1fakeDim4Dim0.0ValuesfakeDim5 DimVal0.1fakeDim5Dim0.0?@VALUES Valid_rangeAttr0.0 jjjjj dset1Var0.0 jjjjj dset2Var0.0 jjjjjdset3Var0.0Storm_track_data2VALUES File_contentsAttr0.0   hdifftst2.hdfCDF0.0XDATASingle-component Fieldvdata1 5x1 ArrayMulti-component Fieldvdata2 6x4 Array??????@AAA A0A@  PositionMass Temperaturevdata3 Particle Datagdalautotest-3.0.4/gdrivers/data/isis3_geotiff.lbl0000644003401500001440000000215413614004466021624 0ustar rouaultusersObject = IsisCube Object = Core ^Core = isis3_geotiff.tif Format = GeoTIFF Group = Dimensions Samples = 317 Lines = 30 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = Mapping ProjectionName = Equirectangular CenterLongitude = 184.4129944 TargetName = Mars EquatorialRadius = 3396190.0 PolarRadius = 3376200.0 LatitudeType = Planetographic LongitudeDirection = PositiveWest LongitudeDomain = 360 MinimumLatitude = -14.8228149 MaximumLatitude = -14.7275028 MinimumLongitude = 184.4411316 MaximumLongitude = 184.496521 UpperLeftCornerX = -4766.9649842452 UpperLeftCornerY = -872623.62882223 PixelResolution = 10.1025 Scale = 5864.9453125 CenterLatitude = -15.1470003 CenterLatitudeRadius = 3394813.8579782 End_Group End_Object End gdalautotest-3.0.4/gdrivers/data/i_3034f.ntf0000644003401500001440000000166413614004466020161 0ustar rouaultusersNITF02.1003BF01I_3034F 19971218121539Check an RGB/LUT 1 bit image maps black to TP and white to green. U 00001000010 JITC (520) 538-5458 00000000094800040400100045000000000940000000000000000000000000IMMissing ID19961218121539 - BASE IMAGE - U 0Unknown 0000001800000035B RGB/LUT VIS 01R 0NM1LU N 3000020B00010001003500180100100000100001001.0 0000000000@>>|>gdalautotest-3.0.4/gdrivers/data/text_md.vrt0000644003401500001440000000121613614004466020573 0ustar rouaultusers This is text data with a newline. Also, a second text segment is created. byte.tif 1 gdalautotest-3.0.4/gdrivers/data/oddly_indexed_extra_dims.nc0000644003401500001440000000134013614004466023744 0ustar rouaultusersCDF xyextra_dim_without_variable$extra_dim_with_var_of_different_name extra_dim_with_several_variables  ConventionsCF-1.5 +var_of_extra_dim_with_var_of_different_name(var1_of_extra_dim_with_several_variables(var2_of_extra_dim_with_several_variablesx  standard_nameprojection_x_coordinatey  standard_nameprojection_y_coordinatedata@Y@iGGAAALALgdalautotest-3.0.4/gdrivers/data/fakefujibas.pcb0000644003401500001440000000020713614004466021331 0ustar rouaultusers[Raw data] Fuji BAS width=1 height=1 OrgFile=fakefujibas PADPADPADPAD PADPADPADPAD PADPADPADPAD PADPADPADPAD PADPADPADPAD PADPADPADPAD gdalautotest-3.0.4/gdrivers/data/FC21B0037339_15142232818F1C_3bands_truncated.cub0000644003401500001440000000433113614004466025415 0ustar rouaultusersObject = IsisCube Object = Core StartByte = 1 Format = Tile TileSamples = 1 TileLines = 1 Group = Dimensions Samples = 1 Lines = 1 Bands = 3 End_Group Group = Pixels Type = Real ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = Instrument SpacecraftName = DAWN InstrumentId = FC2 SpacecraftClockStartCount = 485609365:149 SpacecraftClockStopCount = 485609365:214 StartTime = 2015-142T23:28:18.858 StopTime = 2015-142T23:28:19.112 ExposureDuration = 60.000 PixelAveragingWidth = 1 PixelAveragingHeight = 1 TargetName = CERES OriginalTargetName = "1 CERES" OrbitNumber = N/A FirstLine = 17 FirstLineSample = 35 End_Group Group = Archive FileName = FC21B0037339_15142232818F1C.IMG SoftwareName = CALLIOPE SoftwareVersionId = 3.01 DataSetName = "DAWN FC2 CALIBRATED CERES IMAGES V1.0" DataSetId = DAWN-A-FC2-3-RDR-CERES-IMAGES-V1.0 ProductId = 0037339 ProductType = DATA StandardDataProductId = FC_IMAGE ObservationId = NAV_CTS_OpNav9_001 ProducerFullName = "PABLO GUTIERREZ-MARQUES" ProducerInstitutionName = "MAX PLANCK INSTITUT FUER SONNENSYSTEMFORSCHUNG" ProductCreationTime = 2016-04-17T14:22:52.000 ProductVersionId = C ReleaseId = N/A End_Group Group = BandBin FilterNumber = (1, 1, 1) Center = (700, 700, 700) Width = (700, 700, 700) FilterName = (Clear_F1, Clear_F1, Clear_F1) Name = ("band 1","band 2","band 3") End_Group Group = Kernels NaifFrameCode = -203121 End_Group Group = AlphaCube AlphaSamples = 1024 AlphaLines = 1024 AlphaStartingSample = 299.5 AlphaStartingLine = 0.5 AlphaEndingSample = 599.5 AlphaEndingLine = 300.5 BetaSamples = 300 BetaLines = 300 End_Group End_Object End gdalautotest-3.0.4/gdrivers/data/aea.dat0000644003401500001440000000242613614004466017616 0ustar rouaultusersk{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭֭޵Ŝέ極ޭsνŜcksks{s{ksZsssscs{{s{Žc֥kkccJֽŭ挽Υֽs攜νεcRZBRRBJBRcJR{kZR{ZJBBJkkcBkcBkJ{{R:JZZscRRkJBZ:RR)JB:J{BRBBcJZZRJkksZ{Μk{csk{c{kc{csk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεޭޥ޽ΥŽ֥޵ťŜccsks{{kkέ{ssk{{޵Δs֥ޥŽs{{{{k{ss{ŵ֜Δ攭ν樂֭޽ޭ{cΔ{ZBJJRJRBZ1scBksZZRRJcJkZk:kRkBZJ{Z1ZZ:cRZJZJR:JJRJBRBJJ:BcBcJcc:J1RsZk{ckRJksssskkksZcs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭ΔŵޥֽνŭŔssΔތ{{Ž{sscZ{ssRΌc{c{{ޭֵ֭֌{Υޥkkssk{{kŭֽŜŔ{έŽ{kֽťޜ{BB{BRRZJRJJsZRBBZsscckZRBRccRRcRJZcR:BRkZ{RJRRcBkckBcZ1JRZB:BB:J!RBBZJc:BB:Bcsk֌ss{{{kcR{s{kcRsZgdalautotest-3.0.4/gdrivers/data/byte.rl20000644003401500001440000014400013614004466017755 0ustar rouaultusersSQLite format 3@ 2-,'"     rW5oKepsghWNAD27 / UTM zone 11N+proj=utm +zone=11 +datum=NAD27 +units=m +no_defsPROJCS["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"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],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"]] ! byte_tilesgeometryhW ' byte_sectionsgeometryhW !byte_tilesgeometry' byte_sectionsgeometry  ]--mtablegeome]--mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid), CONSTRAINT ck_gc_rtree CHECK (spatial_index_enabled IN (0,1,2)))?S-indexsqlite_autoindex_geometry_columns_1geometry_columns++[tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT NOT NULL DEFAULT 'Unknown', proj4text TEXT NOT NULL, srtext TEXT NOT NULL DEFAULT 'Undefined') I--Etableraster_coveragesraster_coveragesCREATE TABLE raster_coverages ( coverage_name TEXT NOT NULL PRIMARY KEY, title TEXT NOT NULL DEFAULT '*** missing Title ***', abstract TEXT NOT NULL DEFAULT '** ?S-indexsqlite_autoindex_raster_coverages_1raster_coverages &33stablespatial_ref_sys_auxspatial_ref_sys_auxCREATE TABLE spatial_ref_sys_aux ( srid INTEGER NOT NULL PRIMARY KEY, is_geographic INTEGER, has_flipped_axes INTEGER, spheroid TEXT, prime_meridian TEXT, datum TEXT, projection TEXT, unit TEXT, axis_1_name TEXT, axis_1_orientation TEXT, axis_2_name TEXT, axis_2_orientation TEXT, CONSTRAINT fk_sprefsys FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))A ""O%7= *  byte*** missing Title ****** missing Abstract ***UINT8GRAYSCALEDEFLATEd< nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy:mM5OC {\ۄy^ bt ==viewraster_coverages_ref_sysraster_coverages_ref_sysCREATE VIEW raster_coverages_ref_sys AS SELECT c.coverage_name AS coverage_name, c.title AS title, c.abstract AS abstract, c.sample_type AS sample_type, c.pixel_type AS pixel_type, c.num_bands AS num_bands, c.compression AS compression, c.quality AS quality, c.tile_width AS tile_width, c.tile_height AS tile_height, c.horz_resolution AS horz_resolution, c.vert_resolution AS vert_resolution, c.nodata_pixel AS nodata_pixel, c.palette AS palette, c.-;;=tableidx_byte_tiles_geometryidx_byte_tiles_geometryCREATE VIRTUAL TABLE "idx_byte_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)AACtableidx_byte_sections_geometryidx_byte_sections_geometryCREATE VIRTUAL TABLE "idx_byte_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax).statistics AS statistics, c.geo_minx AS geo_minx, c.geo_miny AS geo_miny, c.geo_maxx AS geo_maxx, c.geo_maxy AS geo_maxy, c.extent_minx AS extent_minx, c.extent_miny AS extent_miny, c.extent_maxx AS extent_maxx, c.extent_maxy AS extent_maxy, c.srid AS srid, 1 AS native_srid, s.auth_name AS auth_name, s.auth_srid AS auth_srid, s.ref_sys_name AS ref_sys_name, s.proj4text AS proj4text, c.strict_resolution AS strict_resolution, c.mixed_resolutions AS mixed_resolutions, c.section_paths AS section_paths, c.section_md5 AS section_md5, c.section_summary AS section_summary, c.is_queryable AS is_queryable, c.red_band_index, c.green_band_index, c.blue_band_index, c.nir_band_index, c.enable_auto_ndvi FROM raster_coverages AS c LEFT JOIN spatial_ref_sys AS s ON (c.srid = s.srid) UNION SELECT c.coverage_name AS coverage_name, c.title AS title, c.abstract AS abstract, c.sample_type AS sample_type, c.pixel_type AS pixel_type, c.num_bands AS num_bands, c.compression AS compression, c.quality AS quality, c.tile_width AS tile_width, c.tile_height AS tile_height, c.horz_resolution AS horz_resolution, c.vert_resolution AS vert_resolution, c.nodata_pixel AS nodata_pixel, c.palette AS palette, c.statistics AS statistics, c.geo_minx AS geo_minx, c.geo_miny AS geo_miny, c.geo_maxx AS geo_maxx, c.geo_maxy AS geo_maxy, x.extent_minx AS extent_minx, x.extent_miny AS extent_miny, x.extent_maxx AS extent_maxx, x.extent_maxy AS extent_maxy, s.srid AS srid, 0 AS native_srid, s.auth_name AS auth_name, s.auth_srid AS auth_srid, s.ref_sys_name AS ref_sys_name, s.proj4text AS proj4text, c.strict_resolution AS strict_resolution, c.mixed_resolutions AS mixed_resolutions, c.section_paths AS section_paths, c.section_md5 AS section_md5, c.section_summary AS section_summary, c.is_queryable AS is_queryable, c.red_band_index, c.green_band_index, c.blue_band_index, c.nir_band_index, c.enable_auto_ndvi FROM raster_coverages AS c JOIN raster_coverages_srid AS x ON (c.coverage_name = x.coverage_name) LEFT JOIN spatial_ref_sys AS s ON (x.srid = s.srid)0}ᓲ"}ᓲx  gl< l9: Ih6"rxס0+SFVDÁ3Łθg+3q|=kݕyXH=Z~G4uZ5z?a~׈TסFg0G_}؏ra>qM[ KnӰx.rD3RoS|O_˧Cqo|+:L{LPW[\!!RT˻tY絴9޷[naɶ* __0"x1 0.ts aǃ U}4xɶ/gdalautotest-3.0.4/gdrivers/data/bogus.jpg0000644003401500001440000000002413614004466020207 0ustar rouaultusersJFIFgdalautotest-3.0.4/gdrivers/data/srtm.dem0000644003401500001440000000036013614004466020045 0ustar rouaultusersMUZZ\``ZVUOE=6,~n^PA1#{pg]QHC<50-+)'%MUZZ\``ZVUOE=6,~n^PA1#{pg]QHC<50-+)'%gdalautotest-3.0.4/gdrivers/data/reduce-cgcms.nc0000644003401500001440000006047013614004466021264 0ustar rouaultusersCDF 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.0.4/gdrivers/data/50000_50000_uint16.gpkg.zip0000644003401500001440000011354613614004466022455 0ustar rouaultusersPKcSN6iD(50000_50000_uint16.gpkgUT Xl\Xl\ux  `e7M@S/$mҖK3i*.Nɛd!3iZ" ."]w=,"UZepݕUĢDT,"ɜIfҤdygμ3UNi{v1W MK C/DDȟۚYnrE%$7?O'ѿxLy5ly5\^=K^̐WcdteVʫ3/WSJ@ǍWc +-zWp,TMٰ(pm3]62n=ݦ/np8vixLl3^2px=gVu;g6债wrӻb0 _p^Ϝں95uuΛpY/HS:t"]Vl8[ndss%և>W._ts$3KPTU/-=B^^OQ?dYM5IӫD\PB^(@*9!/EP NVXJfu/o\ece!/EhU^`׏|@h/wi‸\;j*]@NOw7mיkf伂ٳB=cז[`M974.mm4Z.[h$\cwFkG[5kφUu-Ml4V6n,5[ /\aUhʥֲ m[BAS cy\}7,oj6imr!vaMS6vv {.ost=qWM#M8n;̊5 W/,ov;=mk7Vmnmo%oulζ>ꆵkַ,7-µ-MVGaFKㅍ-kׇVw]n뛮^T_wNͼzK| ׵ݫuht#[aaD*5fK#WӇ?huE%\x-X]7=3Ot`AbO?=FuhdcCM+֦5N-{.,nWQ2z``C2{b{z$O$I(Wǰ: +CF EQ9YSRKpAo#Co y(J f,i]' c jjOG6)NoOܐ;6^2č̶^gsӟ8: 4csmW=ۓ,oFv֠ = ֲMLjbLx#n(*(7O֖!0Ma%YH_=qh+CFB}#l#k5C+*-,*L/]'/o?Owh<5U3,5rDkg*mwyd&7|No7[##X^8O8#E^wxpV0m~GWc^ޮ6b\4Z\5>@7#&o ³{L#i1-nན*w^6T]\㕗I1ΐCf3nh]۴FΰqM{`dw1@e. [&&7"++YKZXפ6!oy] E~W^Hz~ݚclmZqAl$˟`<߿lh`i[=OsCuy_,C]Z}|7>>1!u Wn꛺yϸv\}=M/9Λ*/c\&:?02OGw\W| _3O/266[;Bvrٻ[-759aҾLeЯ,X8ʳN_tՙvNkm^otMu jjϬNmjz'uk =zX@b\FNhy{Lv][[7 }-pӽd]/ 29?yi'/;B-~0o~ pQp}$3oYB[y ԩ;ڃ+VaRm[ZPܬ]ylX=Rd%6nMlI%?7;j2 yW%NU78v-rn l7:OUX6rLt}.0AVǬqjxݡ۝-1Ϸ"x|cE=vn1aʸu#f&[߉G%gDmZi4hlXiqz_'<==+'VvbIfKI1$ry=ѣ䟷M @e;GDžPuV"J_TX$'X½b]5(?|' Kr|ʂG\:,;Mn~ رrsΘlή24F߷Uv^PԤ}j}ݟ_͉;uݞiiKl[wiθ$jړMɽI$}ئa%g6VRe~i4wڅp4iֲT?@4g_BQTNҢBE%|pWnxr-|ԫ_{ eiCr |) i T5iRxH*4V)eďA,M<$ei.@,M#<$ܢIbLQf9<$hZ^>7xA4 4ৣ%~A+!9(K 4g5<$ei}I3&Y ɁFYu)r[*RMn4CrQ4OE '~eiZ!9(K4@14~vd|/ƘA,GG{C)&h6CrQxH4lu[ޜ'kS/<ﶚC?hFFCrQRxH4| 46xN*ϐ%~'f)|F qH4Cc@,ehqCrF&{}ۈO\(KcCrQ4hFffYd|ϕ_P EM4NxH4|4[!9(KNG1&chhCrQ ɁFY7qۮԎ&M#-o_#O!D1h.@,M7<$ei|hCrNGo=4[!9(K ɁFYmnm+@rmn$~(Ks<$ei@(@"jbLqOCrQjxH4'ȤigE E(ivǓhU]hԤW!9(Ks <$ei'Gt3| Q:xH4ixF繗/6 ":̠;4߰?4!9(KxH4|Mќg}oA&4'#x͝gsD74ɁFYgPŘAN큇@,Mh<$ei“<9-gL!9(Ks3YwcLAs[' 0eQei@&!9(Ks2E:VbL9i4CrQf?<$ei@,ͷ}%sL6o~墳>?OW)~kO!zJĠQF^4CrQ<$gThnOt?QhxH4dM׾~@F3z<_mVs(íE4{hy4߇@,͓h1&~d,OxH4<ɁFYd)͂GS^a!)Jg$~H8<$ei~ɁFY@,͏!95hͩ xxFY'!9(K<$Gg_~M)+OH)F*GQh_xH4<$ehbNE+,|:Z4< ɁFYhbj{c]gH)FMy*<?h~ɁFY!9(K<<$ei^'ǒs"W4G!9 fKRDQF 4C߁}_$~ei~ ɁFY!9ШI#~Ɂ&;hs!|bLQexH4'6s$&[H44dŘAs4!9(K*<$ei^@,4NAKGuxH4GsKXcTeiހ@,!9צM]_s)<nlwu8,7wMQZFQOHeXe^F=;eXF2jm8a˨'ɺ&/}\{s_[n˂g*\5{S+.]q%/ƓPnع{}يoﭽ_3k:?m,˨'Wt-1<5ZʁF* @#F) G~HQC9HQShdx @436jipw~^T= cF* @#Fm"gkv|QQѨMhҨ'm$ﭑk̚:4~iԳhҨC9HQC9HQ[-^j 'MWɏ18%<J'˂P4RiK8ZQ/rJrJ^@#F yz8uֶ[< "_Jx8A#FMrJrJᡜhGoA#F ʉh񍔯:4P4Ri[hҨhNوbL~HQ$0gk@#F@#F @#<7fޔ;lYT$)GWt@1BEEHQ@#FQrJ>D&oQ[`缔۲] U ?\HQrI<Tix(iLbddZ=ĥ^.[_y]JZMȤʁF*:ʁF*<TuA<36jtbm1]>k*MѨC9HQC9HQ_rK5(I]UT+6׾WiK-nPI1iP4Ri%P4RihҨKᡜ/sW6qZC:mU|rg \HQ_rJ@4?jsW"hM_u4RihҨC9HQ߀rBs(Z7KcF"Z@#F]@#F}/Ax42xGK~'F'<Tx(4P4RiBxJWΨ.hҨC9HQWWZXʉorG[!4RiԏhҨ+hҨh&1&?hҨrJ~e냻:qTTMtiOhҨyh1&?h*O~ @#F]@#3x(4Zxb'&u<Tu} u=8WhhҨ_C9UHhYn7Bu'寚o} ǁ 4hҨ_C9HQh"LS٪U˜J_<`=W @#FʁF*mdyBG1A EʁF*ʁF*=<TxSZ#Q+g斳&y]*"i4&x(4j1<TGx('4`fx8pA#F ʁF*ʁF*?x(riMfޔ;lYT=a|՟1.#W0%FʁF*+<T7x(428Z8QrJnrJ@#FPGЖ2b ")ʁF*<Tu<Tu'<)o-vFu<JC9ЈTx(4O:W(Z"A#F3hh&<PEh(rnD1&?hh<TͅrI_ /P#/ .P p-1f_hdx@#F;ʁF*Vx+hegv5/&}'ny-,x;/+~8vBN+{^t1Joks'nS זvb}G,2,2Z -y;RU33bቝy<Mihh'C9HC9Hђr z!?vhpF*V |L iT><'4ifg&yo]g֜񭜯ր4^ hhC9HC9M\_ 'MW#䫝1A#F; 3vݱeL1Tv+LZo;%F@#FʁF*v<T/<\q3.42irJ] @-(ŤCEE F(Z|A#F@#F ʁF*6ʁ&>i*1vύh4RiP4Rih7:^޹b2"hh⏧q4>ςrJ rJ rJ 'fyBAK~hhhC9̓u!s*`ҮJeC9C-ՆA#F@#F @#Fˁr6Mg#]1A#F@47r+p A#F @#Feu3FFƮ3kN\j4UCrJrJ]@#<) #nOU \hwC9HrJMrGo]pF*v7<TP4Ri{94ML_4yǝ{ EvIh"F̀rJ@#F @43^o}OvӔx:e֎eWzr\eXttVЈi}}W ˰L.cw\d95~p5طh Ϗ>RgJ>0&(ץJQ+u`koǕ|O%zUɧٱG.yk€,uAL/=2,#u8|{܃@evA sdlhC9HfC9HrJ́rʸd{S3oʎKo\x8pA#F@#F{ʁF*ArJr*G8Z|cW \HC9HC9HC9DhYn7lzqIffĽ9W ~r) Ҿ 4x(4hh_V8Zъhh_C9HʁF&c#hɯ>WcaԾ4Riohdx@#FrGQ\H~rJʁF* ʩk\p1=6bR TGx(4fx(4OP4GomѶ`L~H@#gx(4/PNS+SX_@ђ"phh[hhC9HѶTj-<J @#F$M]/0e"*F4Nx(4.x(4:<Mф26_EW1&?h<T]r3;`A3Q4Rit3xG1A݂rJP4RitʁF*Srw߽޷ziu9T[؋(hgl ~b2,#uVejĦ~9ockqQfݷrKc7':}GKEyjO=DJѮ?,yR``#sԜݰ)!ڂA?D~˰eXe.W5 D)H'C9TZ^\03鵡"h'C9HOrGhYn7ͻ_u'寚oUuȏ4Ridx(4z]x(4z=x(-jSX{윗Rw[kŨ~ M\мҲzV+P^**F*ʁF*ʁF*~jXyk̚:MhC9HOrI<-^.<6=_%?ԼԹPQ4Rix(4^gC9HςrYWJ}S7opF*ʁF*ʁF* ʁ@qӻxojM1ÖuIW?{_tZk ")Bh49P4RiP4RiP4Ri{Գq4HrIʁF*ʁF*~nr_W**MheɏJ@#FʁF*~!<MTjcF*~<T+<T[ ʁF* _}҅G~ G'*<ĹT } <T},<T}<8Z|hgԯ4RiP4Rihi4M,_s<r$d$hIP4RihhQzT} <T=ʁF*~<T}j?6~6ޢ Evh Tx(44x(4$B9ђ;cE4T6x(4P4Ri;SNUV=W NE.Y~')rF*>ʁF*~<Lhb&oQ[`缔۲]+\1&?hC9HrJπr\] ~_40$h󒣭Կu{{\[z/=?%Gg} $2L8a}˜7qarcؙc[*y_[޿_r,yes4]yy'%ɻ=o/y%Eə3?G߯h,XeX&ƖgqDZ H]F;.)[g6D)k-|GȏJρrJυrJσrCQ4?h(cPNi{c)LTTx7c&EʁF*<Tix(43(Omɏ1Dghᡜ>W03Q4RiPNTn-AϓA#F_@#FʁF*ʁ&4vӼ{J^\g}RU/ƘJ/rIhV T"Q4RiP4Ri3#q4_rJ@#FʁF* 3/ha4mmT`3I4P4Ri7ᡜp9ߘ T}9<T-x(4P4_Jk_4e<v@\2PA#FʁF*^@#F/PbL~><T}<Lhs0O%FВz &#vJ*F&Jx(4*x(4jxėS8Z|xg.hC9H?rJʑBو{_W HHC9H?rJrITh߈cF&zx(4P4Ri/hbf9\01*qHbiC9HѿrJC9Hѿ'9v,{ZnIcNrcg 4RihC9$ λk_&[(h*EowG~H7C9HѿrJ@4 W/T}<TʁF$^?t"hs9c&4OP4Ri-P4RiC9HxGK~rJ @#F-. \ѷC9ѤY(otj:_wT}<Tx(4^C9Є&1oǘJ@#F!Ms"hbF @#FfbL~DƀrKcP4Ri ʁF* Oy#hɏ0hf ӟeTTMh ʁF*aC9=ߘ5x8pA#F1\x(4F5x(4aP4\MX_:42i3{4 dQ4??ʁF*QʁF*QsG1A4ƑP4Ri$x(4QP4RiXpC}7/Ok|焅tlkXN'qsોXe"qLq+{sx7֘R{|omE&Lj^lHqLc4rJc @#h@#8 aqUkm1'e9bwFtx8pA#8ʁF*ʁF*ODy}|wP+@E`j,GJ:W`,LvJF*q<T#ʁF*ʁ&ahflhkk!]?M1&?hhgC9H1΁'fxxEhyI~(^x,*fFL|C>5%cQл36׼2,eXebr_=.a]Ҙ˰eX&6i/ K}5fwqhC9H1rJc<@S54=nexoZk-i`IYm_a4lx(Iz_W\&4x(41Jxʞ1A5c<TQx(4?h1Em {oRnv-#X1rE% x?QPQ4J$<T)x('4ifg&~22vYsRC7f}ɏ4RighC9QP4AЪgX[k ws4Ri|>TTMC9H1C9H1^gھɊ}ҩE˜Oc<LP4Ri%P4Ri)'+G~qBc, 39KF]gTTM/C9H1^rJc칔?WTc<T5x(4P4&F8|? "$4ѡ1ބrJcC9H1C9$:MYh0&?hoC9H1 @#xʁF*nsʡ |-)8ʁF*<T}x(4 x+[-u]*3VpF*!<T#x(4i|f+@E PQhXNI~H1VC9H1@#ʁ&iBE TP4RiOhkX6s,vyG1Ac-<Tc<Tc=<Tsx'q> x(4x(4 x+@ET4ƗPNUЪwg)C}_8pA# ʁF&C9H1rM@gcF*-<T;x"+@ElpCclrJc|!bL~DʁF*_x(4&x(4F1<)o-_?C9QT9VW8&6?C9H1C9A;ߘ5.h?C9H1~rJc @glzF~Tc+#&]3i3#5 fW7&/AL(3K~,Ov9CvWCڟZuDQ e{ה~wm(}X෉{?-·sJ(UYP8A`~|eXebdh8a˘pDZ H]<;e"̗Wt{@g;?Gܥ>3+xg7Il<Txx(4 P4F럚'bL~H1kC9H1OrJc 7m7Tu` Y'*. _3ʁF*YʁF*YʁF*y 3yZ{I~UƳ^W]]24SP4Ri̧hҘC9$8Mϱg[vKsRY4|x(4sP4RiP4RiѲnu'寚K t)KHc.rJc@#\@#\ OB3h3KTEx(4Rx(4K$\9}@w FѲKkLĠJc@#|ʁF* ʁ&iBETux(4P4Ri7]Nv0%g,q4a1C9H1߂rJc @#T5Ohɏ14;P4RiwhҘPN4ks`J |6-jSXSPs^Jmٮo.hҘ+hҘC9H1?rMţhcF*ʁF* ʉV'Ld"68hҘ Ohh1&?hIc~ @#F1?rJcʁF*)<=/h5P42i?rs6-Lb2R4RiuPNP47}Á 4P4Ri/hҘhДzҙ k4PNѼЪ_)&ࠑJc~@#R h-MӘ_C9H1rJc~ @#N,O#hɏ$(ͻ]=cXe*Yu3<P+ ʁF*u<Thx(ؤ)Ȅ4ֱP4Rihf㸧38WA#:>&yflhлkk!]S1&?hNc@#:ʁF*UʁF*uo@#@#rWΨXT3<T|x(4PN<~2^W%X]hXC9HC95Mޢ6NAy)ueV7`uØJc] @#@#@#_< u'< R$x.rJcrJcrJc' i-3VLc] @#ƺ ʁF*ʁF*u9L:׾sf5_M2quw˰e;Xe.cMcuWYKw?[{96>F)jw;ה{|Zwւ>kʛ9gwwS祥듎]/M%o˟x^gWveTDZ5A?eX2[1UN%϶Ywqhl&s` 'w*bF*u<T^x(4=gy!T4}P4RiP4RihdxϒhYn7ͻu'寚A~q{9\d=NA 4փP42irJc= O3cCטX[k w隊/;φ4RiGhXshXsᡜ8I[7;3{kddZ=»sK 벭yHHrJcʁF*<M-^j 'MWCǘJc=@#Ix(4SP`K d=g\Ɋ}ҩE"EvIhBʁF*,<Tk><T9xb'+q"ʁF*<<Tk!<M@4?qd@ET+4y윗Rw[kQ_k4RiP4Ri%P4RihJ((*R4KP4RihNv@L0Y@EEH^&Oh1&?h"Bc-rJc@#zʁF*<9t#hɏbzʁF*U@S44>al ZA#z  Mh _mx8pA#'<Tx(4ֻP4^Jo_cF*<M<:pC >TTLP4Ri l-MXC9H>rJcrJc J%?7k5<MBfN_WcTTTcx(4'H/q&h\H>rJXkhXC9Bh?Z#?hX!Ik=<Tsx(?IʁF*x(4֗P4Ri |-4%"m0s"hb?x(4P4Riorz8ުֶ[XÁ 4wP4RiP4Riᡜاp,!z^_sb&6hC9H6C9Hhb&QZ?bL~H6C9H~rJcmrJc/&x]{8d-ޤMxihXC9H~rJcOU5#@cmrJc@#@##y|WjtE+6׾Wۧ-ZA-RB_OvJbHC9HrIʁ&4_k'Tk<TʁF, Ṫss"*Mck y-MilʁF*mC9HMx(4O<匣%?ۆrJc;P42i]xJ+@ET4v5x(' E# 8s \*b9; ʁF*}Ty{1(GC9Ȥ?ʁF*},<T8x*ͳnviT##c5'.5> ? <Txx/ P\ih'C9-jSX{윗Rw[kvmx8pA#> ʁF*}2<T<M4iNNƘI_,?\*b]ʁF*} <TЪX[k w隊1Ah4vx(4vCx(4P4RiFyVl}?ӖN-Zܠ4x⾜O= <txࠑJc@#n rG̝N4Ri3hgC9HSᡜĤ x`_ sk `L2vI))̌?cF*ʁF*ʁF*ʁF**ny*Aq%;p).i4Ri6P4RishO4_v2hP4RivP4Ri4x(4^ᡜ0ЬvA150XH4RiP42i;C9H;C9M0hk1A#ƾʁF*}!<T <edvp+Sbq}Pͼ);:wز.:D @#@#ƾʁF*(2JcrJ=hؗC91LҴitLd{Q\hGot}74vx(4P4Rih*GS(X1A#ƾʁF*}< 4g82_W&LTDEH+8ZC9HC9HrJcKG~@cgC9HC9iR f"*F* 8xApF*@# @#ȦٸA#@S.Mt@1PA#Zx(Y4{GzgG1A4px(4x(4Hx(4~_x#?hf̽_}]h1yA#ƞ@#ƞ@G4sW6qZC:m}I4RihؓhyP4Ri)SZOο3PQ4RihSh7c<}ǂJQ浕I|d|#-[>#o.U͙oZu^(~wcW{X&wrDZ 2um{T@9^D&hhwC9ЈrJcgxm?oR&H^x(4 x(4}P4Ri.Omɏ1xhسhC9H pTT2M%4Rihسh؏C9DٶQ`L~HC9HC9H OSPQ4UCc#/hWhد&8襡 "*Jc/rJc(7QwFux8pA# x(4P4Rix(GMg^N~T-x]~h+@ETH4P4RiC9$2Q{n~cF*.<TʁF*<T x-t=ĹT4P4RihЪw)C;c {%<JcrJcrJc ʉ 1E/6w:\vIv?rJcʁF*)<M҄46p_{ T3x(4Zx(4:x(4)k(6ud9+@ᤱ?rJc@#@#?T)O0hɏ14P4Ri"x(4WP4Ri'nysb)oQޟRnv-&CkR Tx(4P4Rih"A(ڪ7bL~HrJc@#(V0M u-MTibx(4^?C9H7C9H'DrђʁF*?x(4P!4?7ꄊ)68x v-k .hؿC9HC9Hr9RzmȏI<TOx(4 waF*l-M";h;hػh8By*3/QhʁF*C9QfKߕ~]ѩ 4rGȝ1TǂrJP4RiI,4Z5Q <'u28lc=ok謠 ^e7Ѿ#a tw2<2riP3CY9,.>(|{&o[#ߜ\ ^x~^׽ǝEkjJ㚒OHP;ה/ mJQ+OVoLЏ T2Nu8a8OrN:&i#h85h85h8GSrUCMS5ˇtM%?Kx' ʉsM]T0gr"*F*s4<Txnv?##c5'.5t|αpF*s<T<Txx('il{ -u]*{?Ocn u94Nmx(4^'C9$Mϱgfֶ['cL~HqC9Hqh8uh8'k.ޛySvtLe]Ru/ 4, arNa"h8h8 h8 r)=ts vK-۵ȏ1hTx8pA#i@#4x(4PN4?~6}Ons{+HȤo @#IrJ @K4AsT'ʁF*ʁF*ʁ&4#ƍw@29bj*;F>mԢ j")BAlx(49P4RiP4RiD'qi @#i@#i @4O; wM PA @#@#O4qFC9Hqrh8C9HqFC9UHSY|&h~ zvm "ɤqFC9HqC9HqC9D&QuaL~HqrJ㌇rJ@#ƙqFriާ+ՋO_53#֌?]'+@(ƙ@#ƙ@#ƹʁF&dx8Zcgz'ʁF*3ʁF*@#ƹ .-v}sђb:S Tfx(4-P4RiiP4̘ݦө2R-Woܷu~~9V_j'E ;4y8Fm)aeqDZ Ds^#M%YI -=)t෵kJU_]y@u^:/JQl}/|^:%WݱMK>gtn+E W7&ǟ,2,S8sEln;w 2UmYʔ['x08wC9HqC9Ȥ ʁF*s7k* 3:OÁ 4ΓP4Rih8OC9riV?~6|gȏJ< t{İ 4sP4rhE`8ZY4P4RiP4Rih8'G~iPN4ߜD) rTEx(4RxFriשT/>) |%x8pA#yʁF* <TUx('i*?ož2#θ0U A#yʁF*<MЄ6_M4N<Tg9<Lh8o*O#h1N6M+SؘR1hdx@#yʁF*SO 5+K@#yʁF*ʁF*<}qӻx7eG[%UF~5+u)kCR T#x(4Jx(4*x(46j4^rJ| @#@sËHx& y-)KBYSx(4x(4gP4RiqG~I㬃rJ㬇rJ|@s%,H;\Dfr"* &qƘ_@#<TKx(4N<Mh cF*P4RihB)hԢ &*"hdx[Oh1&?hʁF*ʁF*=<TxKeђ-_x(4&x(MtxATb4Ώ,qpF*<Tg <LC9LY9G~Hq~r9>s*ˤ8BEEHq~rI$Fg+Twx(46x(4P4Ri?'G~vx(+=W H&/4x(4Nx⯜+_ԅvuڦ ʁF(C9ЈqUx(4(Mg񭜯A#3O| TTTׄrJhb&k5%?[.=c?3='y|Wye~u_mނA߹,2,21pDZL%xw-xp¶k' }-%xc*l̖]_(_lW-ߍ<<[ɩࠠi}gtV"-n}G,2,2n58a˸%FxΉ_Gز@EE5{8<Tx(4n xqӻxojM1ÖuIɏ5THx(4n<T(x('~hz8OZk-i`IYo^G6Vֹ. MѸC9HqrJ@4v<zqIff׭1A#=ʁF*{<TDx(4n*9}@ƳMЄ= ʁF*{2<T<T7I[7;0]g֜ɏ1*4n]x(4n=x(4)P4RiqsvޗT?-ur*<*uSrF*ʁF*{*<LFP4YQ(uOØJ@#=ʁF*8xOߵ"sDӸ) z-Mi3hҸgC9HqShҸMqG~B6rJ6rJg \ Pqρr x-164Bi<T%<T<_Z54Zc|HԄu[A# <T\xj="6qσrJ- bL~$ʁF*@#m@# 'G~ DvrJv'<7 "6*q;C9HqχGP9eW^.hҸC9HqC9Hq/r&}ݮG~HqS<';W&6ӸC9HqC9$Mޢ6?;;ݖZ?1A# @#ƽʁF* ʁF*;.yA1ASOܔ'pLlpq/rJ^@# O8Z|ˢq/rJ^@#ƽʁF&:<K4匟7n?K7 l68hdx_@#@S4 1A#@#ƽʁF* @#m#h1|g1hҸhҸChҸCO`hɏ140x(4^C9HqrJfC9Alzr8Zj?9A#@# @#́r Q^1A#@#ͅrJ㎆r"DsAjV0U!;&䊂G1$41E㎅rJ㎃rJ^@#OhɏƽʁF*;ʁF*;ʉ?g|0ɝDElp^Go|4RiP4RiA#}ʁF&P4A"QOaL~HqrJ>@#}ʁF*;?6yA1%0Vp@8砢"hҸ hҸC9Hq3<%?vJӸ/C9HqC9QP4Ri%PNi-yT/>) |Cq?kER Tw)<T%x(4P4 lm}W0&?hdx @#]@#} ʁ&i*? G*qx"4q߀rJ @#-rJ.'<卣%?U-x(4P4RiC9Hq)3tPQQikpF*[@#}ʁF*><M9h]1A#ʁF*!<T0 ~d@s"hbe<ŘOw<Tw5<T_P4Ri܏Q*5/~iOhҸrJ~eatPQ4Qq#+dgt?4RiܵP4RiuP42iC9KYIG~HqrJnaO]W|Q4!ҸrI 2FK4n<T+x(4C9Hqo FВAshC9HqMÎQ{Q4=ʁF*+'k._jM1ÖuIɏ1${x(4^?C9Hq @#$Mg񭬯[L~TGե|\qR#͛5mH^].ve8[JmݻI7(kwug6iq9͚jzNVnkhդiӒ.7ma >{^}.#ygY{n*9sQ8:+7y؈AYÆNU&7gh֨yz#GeJ`Pr񹣳'ܭ[ֹ}.}g =/~Aݱ'{?#Yrr~`v{﻽?MF޽|Z#F=q^:Jo?uսww#Gx750w[mݒ>+y1Nu.1(kY|] 50g~ջ{W<*kp֨Yɹ%bkiֹ2~f w]~@)7(8?Qܞ3eujx{߆+wv޾Sg%_FJnҤڷgרxnT}Ut( h?{{ߌ6;5jثs>r{%mܡ=zuNҽw^}{t/y&{Hܾɽz>.ݓ{w{һsqoqSK֩c.y9rDw6bt4ֈ#G'_=fv&{|9Q}<&79M{WE'^ݍu˺o9r쬱Y 򾌠R.g'ߧzN%+r%;S;ɩ{sk3"KBǗM@{i ?CUUa[w 6ܯgxQёcFqwA_w5wzH~q8rs2 5(yQ{>؈R?~j ;qqs+#ejTڀg|ޞ|駝vZ0?>Ba[w(}"zڨ}b[kH792{R xuOx5s,pxޭ=޻~JJL]b@=*StrK>x9m)wӓMw7SnJ{N5QV_K^h{oM)co-Wρ;Cd V"x㒰C͎r9t{5r\_ tyW އ[[,y,;/,5E]'.~n>1 {~:`p4:f#5>'¡ch*s>!3}ZԒo=_? ~rH Um yBiFg0M=Lt9L~PKcSN6iD(50000_50000_uint16.gpkgUTXl\ux PK]gdalautotest-3.0.4/gdrivers/data/U_0002A.NTF0000644003401500001440000000060413614004466017711 0ustar rouaultusersNITF01.10 JR2 04150923ZAUG92This NITF message contains 0 images, 0 symbols, 0 labels and 0 text. U 99999900001000010JITC (602) 538-5458 0000000003880003880000000000000000000000000000gdalautotest-3.0.4/gdrivers/data/frmt09t.cot0000644003401500001440000004515413614004466020417 0ustar rouaultusers A????  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~T TTnnB ** 0    0    0     E EEFD? 5 ,* ' % !                   $  ' ) ,  .   /  2 45 8 9   ;   = ?A C D C + ,/135  8  78788 7 6 5 4    3    2   1   1    0    /    .     .     -     ,    +    *    )    )    (     '    &    %      $      "     !                                                                                                                                                                                                              !#$$ &&' ((%#"""####$$  $ $%%$!                     '            ! " # $  % '()) )'%     !#%')+- / 13578:<================                          =======gdalautotest-3.0.4/gdrivers/data/ESP_013951_1955_RED.LBL0000644003401500001440000002002413614004466021351 0ustar rouaultusersPDS_VERSION_ID = PDS3 /* Identification Information */ NOT_APPLICABLE_CONSTANT = -9998 DATA_SET_ID = "MRO-M-HIRISE-3-RDR-V1.1" DATA_SET_NAME = "MRO MARS HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT RDR V1.1" PRODUCER_INSTITUTION_NAME = "UNIVERSITY OF ARIZONA" PRODUCER_ID = "UA" PRODUCER_FULL_NAME = "ALFRED MCEWEN" OBSERVATION_ID = "ESP_013951_1955" PRODUCT_ID = "ESP_013951_1955_RED" PRODUCT_VERSION_ID = "1.0" INSTRUMENT_HOST_NAME = "MARS RECONNAISSANCE ORBITER" INSTRUMENT_HOST_ID = "MRO" INSTRUMENT_NAME = "HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT" INSTRUMENT_ID = "HIRISE" TARGET_NAME = "MARS" MISSION_PHASE_NAME = "EXTENDED SCIENCE PHASE" ORBIT_NUMBER = 13951 SOURCE_PRODUCT_ID = (ESP_013951_1955_RED0_0, ESP_013951_1955_RED0_1, ESP_013951_1955_RED1_0, ESP_013951_1955_RED1_1, ESP_013951_1955_RED2_0, ESP_013951_1955_RED2_1, ESP_013951_1955_RED3_0, ESP_013951_1955_RED3_1, ESP_013951_1955_RED4_0, ESP_013951_1955_RED4_1, ESP_013951_1955_RED5_0, ESP_013951_1955_RED5_1, ESP_013951_1955_RED6_0, ESP_013951_1955_RED6_1, ESP_013951_1955_RED7_0, ESP_013951_1955_RED7_1, ESP_013951_1955_RED8_0, ESP_013951_1955_RED8_1, ESP_013951_1955_RED9_0, ESP_013951_1955_RED9_1) RATIONALE_DESC = "Ancient Noachian bedrock in northeast Syrtis Major" SOFTWARE_NAME = "PDS_to_JP2 v3.15.3 (1.49 2008/07/12 04:09:51)" OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = "EQUIRECTANGULAR" PROJECTION_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: The EQUIRECTANGULAR projection is based on the formula */ /* for a sphere. To eliminate confusion in the */ /* IMAGE_MAP_PROJECTION object we have set all three radii, */ /* A_AXIS_RADIUS, B_AXIS_RADIUS, and C_AXIS_RADIUS to the same */ /* number. The value recorded in the three radii is the local */ /* radius at the CENTER_LATITUDE on the Mars ellipsoid. That is, */ /* equatorial radius of 3396.190000 km and polar radius of */ /* 3376.200000 kilometers. Using the local radius of the */ /* ellipsoid implies that the MAP_SCALE and MAP_RESOLUTION are */ /* true at the CENTER_LATITUDE. */ A_AXIS_RADIUS = 3394.8398133163 B_AXIS_RADIUS = 3394.8398133163 C_AXIS_RADIUS = 3394.8398133163 COORDINATE_SYSTEM_NAME = PLANETOCENTRIC POSITIVE_LONGITUDE_DIRECTION = EAST KEYWORD_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: CENTER_LATITUDE and CENTER_LONGITUDE describe the location */ /* of the center of projection, which is not necessarily equal to the */ /* location of the center point of the image. */ CENTER_LATITUDE = 15.000 CENTER_LONGITUDE = 180.000 LINE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 67395 SAMPLE_FIRST_PIXEL = 1 SAMPLE_LAST_PIXEL = 19243 MAP_PROJECTION_ROTATION = 0.0 MAP_RESOLUTION = 118502.26464032 MAP_SCALE = 0.5 MAXIMUM_LATITUDE = 15.797211542227 MINIMUM_LATITUDE = 15.228493633562 LINE_PROJECTION_OFFSET = 1872006.5 SAMPLE_PROJECTION_OFFSET = 12278395.5 EASTERNMOST_LONGITUDE = 72.899868557294 WESTERNMOST_LONGITUDE = 72.731756232301 END_OBJECT = IMAGE_MAP_PROJECTION /* All xxx_COUNT values are for the MRO spacecraft clock (SCLK) */ /* in seconds:subseconds form. A subsecond tick = 15.2588 microseconds. */ /* All xxx_TIME values are referenced to UTC. */ GROUP = TIME_PARAMETERS /* Time when the observation first started */ MRO:OBSERVATION_START_TIME = 2009-07-18T13:54:41.340 /* Time of the first image line */ START_TIME = 2009-07-18T13:54:41.485 SPACECRAFT_CLOCK_START_COUNT = "932392503:59742" /* Time of the last image line */ STOP_TIME = 2009-07-18T13:54:52.028 SPACECRAFT_CLOCK_STOP_COUNT = "932392514:29736" /* Time when this RDR product was created */ PRODUCT_CREATION_TIME = 2009-08-09T01:26:11 END_GROUP = TIME_PARAMETERS GROUP = INSTRUMENT_SETTING_PARAMETERS MRO:CCD_FLAG = (ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON) MRO:BINNING = (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -9998, -9998, -9998, -9998) MRO:TDI = (64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -9998, -9998, -9998, -9998) MRO:SPECIAL_PROCESSING_FLAG = (NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, NOMINAL, "NULL", "NULL", "NULL", "NULL") END_GROUP = INSTRUMENT_SETTING_PARAMETERS GROUP = VIEWING_PARAMETERS INCIDENCE_ANGLE = 49.990076 EMISSION_ANGLE = 8.476113 PHASE_ANGLE = 43.677223 LOCAL_TIME = 14.37002 SOLAR_LONGITUDE = 305.594678 SUB_SOLAR_AZIMUTH = 135.482409 NORTH_AZIMUTH = 270.000000 END_GROUP = VIEWING_PARAMETERS /* The JPEG2000 image data file associated with this label. */ OBJECT = COMPRESSED_FILE FILE_NAME = "byte.tif" RECORD_TYPE = UNDEFINED ENCODING_TYPE = "JP2" ENCODING_TYPE_VERSION_NAME = "ISO/IEC15444-1:2004" INTERCHANGE_FORMAT = BINARY /* The name of the original source file. */ UNCOMPRESSED_FILE_NAME = "ESP_013951_1955_RED_cnode26:398.IMG" /* The amount of original image data. */ REQUIRED_STORAGE_BYTES = 2593763970 ^DESCRIPTION = "JP2INFO.TXT" END_OBJECT = COMPRESSED_FILE /* The source image data definition. */ OBJECT = UNCOMPRESSED_FILE FILE_NAME = "ESP_013951_1955_RED_cnode26:398.IMG" RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 38486 FILE_RECORDS = 67395 ^IMAGE = "ESP_013951_1955_RED_cnode26:398.IMG" OBJECT = IMAGE DESCRIPTION = "HiRISE projected and mosaicked product" LINES = 67395 LINE_SAMPLES = 19243 BANDS = 1 SAMPLE_TYPE = MSB_UNSIGNED_INTEGER SAMPLE_BITS = 16 SAMPLE_BIT_MASK = 2#0000001111111111# /* NOTE: The conversion from DN to I/F (intensity/flux) is: */ /* I/F = (DN * SCALING_FACTOR) + OFFSET */ /* I/F is defined as the ratio of the observed radiance and */ /* the radiance of a 100% lambertian reflector with the sun */ /* and camera orthogonal to the observing surface. */ SCALING_FACTOR = 1.07543902665525e-04 OFFSET = 0.081203337858079 BAND_STORAGE_TYPE = BAND_SEQUENTIAL CORE_NULL = 0 CORE_LOW_REPR_SATURATION = 1 CORE_LOW_INSTR_SATURATION = 2 CORE_HIGH_REPR_SATURATION = 1023 CORE_HIGH_INSTR_SATURATION = 1022 CENTER_FILTER_WAVELENGTH = 700 MRO:MINIMUM_STRETCH = 3 MRO:MAXIMUM_STRETCH = 1021 FILTER_NAME = "RED" END_OBJECT = IMAGE END_OBJECT = UNCOMPRESSED_FILE END gdalautotest-3.0.4/gdrivers/data/ehdr11.flt0000644003401500001440000000501013614004466020161 0ustar rouaultusersBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBgdalautotest-3.0.4/gdrivers/data/fl73n003_truncated.img0000644003401500001440000003070013614004466022315 0ustar rouaultusersCCSD3ZF0000100000001NJPL3IF0PDSX00000001 PDS_VERSION_ID = PDS3 /* FILE FORMAT AND LENGTH */ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 3184 FILE_RECORDS = 4 LABEL_RECORDS = 2 /* POINTERS TO START RECORDS OF OBJECTS IN FILE */ ^IMAGE_HISTOGRAM = 3 ^IMAGE = 4 /* POINTER TO THE TABLE CONTAINING ORBIT LOCATIONS */ ^TABLE = "73N003OR.TAB" /* IMAGE DESCRIPTION */ DATA_SET_ID = "MGN-V-RDRS-5-DIM-V1.0" PRODUCT_ID = "78N018" SPACECRAFT_NAME = MAGELLAN SPACECRAFT_ID = MGN INSTRUMENT_NAME = "RADAR SYSTEM" INSTRUMENT_ID = RDRS TARGET_NAME = VENUS START_TIME = "N/A" STOP_TIME = "N/A" SPACECRAFT_CLOCK_START_COUNT = "N/A" SPACECRAFT_CLOCK_STOP_COUNT = "N/A" PRODUCT_CREATION_TIME = 1993-09-28T15:55:50 IMAGE_ID = FL73N003 MISSION_PHASE_NAME = {"MAPPING CYCLE 1", "MAPPING CYCLE 2", "MAPPING CYCLE 3"} /* DESCRIPTION OF OBJECTS CONTAINED IN FILE */ OBJECT = IMAGE_HISTOGRAM ITEMS = 256 DATA_TYPE = LSB_UNSIGNED_INTEGER ITEM_BYTES = 4 END_OBJECT = IMAGE_HISTOGRAM OBJECT = IMAGE LINES = 1 LINE_SAMPLES = 3184 SAMPLE_TYPE = LSB_UNSIGNED_INTEGER SAMPLE_BITS = 8 SAMPLE_BIT_MASK = 2#11111111# CHECKSUM = 938107697 SCALING_FACTOR = 0.2 OFFSET = -20.2 MISSING = 7 NOTE = " DN = 5 * (MIN(MAX(RV ,-20),30) + 20) + 1, where RV = specific radar cross-section divided by the Muhleman Law value, SIGMA0(THETA) = 0.0118 COS(THETA) / ((SIN(THETA) + 0.111 COS(THETA))**3) where THETA is the scattering angle." END_OBJECT = IMAGE OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = SINUSOIDAL MAP_RESOLUTION = 1408.1316 MAP_SCALE = 0.075 MAXIMUM_LATITUDE = 74.00000 MINIMUM_LATITUDE = 71.99000 EASTERNMOST_LONGITUDE = 6.01243 WESTERNMOST_LONGITUDE = 0.00000 LINE_PROJECTION_OFFSET = -104202.7422 SAMPLE_PROJECTION_OFFSET = -7837.6538 A_AXIS_RADIUS = 6051.00 B_AXIS_RADIUS = 6051.00 C_AXIS_RADIUS = 6051.00 FIRST_STANDARD_PARALLEL = "N/A" SECOND_STANDARD_PARALLEL = "N/A" POSITIVE_LONGITUDE_DIRECTION = EAST CENTER_LATITUDE = 0.00000 CENTER_LONGITUDE = 18.00000 REFERENCE_LATITUDE = "N/A" REFERENCE_LONGITUDE = "N/A" LINE_FIRST_PIXEL = 1 SAMPLE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 1 SAMPLE_LAST_PIXEL = 3184 MAP_PROJECTION_ROTATION = 0.00000 VERTICAL_FRAMELET_OFFSET = 1 HORIZONTAL_FRAMELET_OFFSET = 6 END_OBJECT = IMAGE_MAP_PROJECTION END ,    '$'<>HK:*9N\y1aZ x )5zFXpLu6"o7,ao)b}PEgqb ^ĉ&ibA~KY6h|QZ:$b`/4oԌzkrhNcg[ UPKFJC>:\5U4o0-+'$[#7!1; F(~ a , 0 S H~`c6"zT:D*/G@H5/(#  c_YXYY[[VU[[WWWRNNUYZ_ca[W`baVMY[WV___]\b^_XX^a`\[Z[ZVYZY[\]\YXOJSYVY]\WW_`XQVZVZSNMLQUQQRXWSZfij_UNTY[ZWWVYYXY`ceoe\[UTVblusjaaZ^\[\[Z\ZVSXWRPY[XSPRMLSUVOZ_`a^ZYZ\]ddb^\`fdZ^q{vk\RWZ\_`ZVYadga[WW[\YNOV][OAHJW]\[RQZ\V]bccchcZX]q{{sebad_bfe__ksyvmedgjdc^V[\[NSYYY\\[[ZTLNQRLQXWWSPW\`baZXWTX]a]]`cfhjjjh`VY_^^_\[OJS]fjijkmhcbhd^ZY_]VX[ab]YUTTVUQIRSOSUcnrqdOHW]`b\_][X_kw|viWV`a\[\\X[bdcYVZ\^dd^[gqplu}m]]_]\RWX[SRX^cb`^]WUX_ggaYV]\b\URQXZXbjk`ZZ[Z__[VOLSWSSUSTXUZ_^Ya\WYaiid``^[VZYXNKHJSYZVONS]c^XXUOUamrsmbZTXbhke]RNNR\aa^afjf_SWZZUZ_ecbccckpnd^`dedaXXXZ_bd`SMT[bef\YZ_djkojlghjb^Zagg`U]abaa_^a_YQTUTRUXTVXZ[^\YXYVNRVZ\XVTU\egg\ST_eedffejmponhedgmpmZXfhf^]][entnd\jtv|~m^]__hmjdceihcc`ab___ac_XRPU]`ZRTWYZY[`dd^XQSUX\]]WZaaa\\]XQR_hjaURVUabbaeq{xosmghe_\YZ]_hptqi`\TPX^[XX]bcd\UTS]ad_\fzr^Y\_adhkh_UU]\Z]flhaY]dgfhjjfbXPORX^`aelol`_dmnfcbcaa\RT\\[Tbyuhjkkpohbeheba`XTWS^haXUY\ZSKOWVPV\\_^`^WNU]^\[]__]VRSWY[ZU^bb_^[Za_^\`beffa]bk|qaTT^ec_inkkfd^\Y[^_V[blkgikhhh`XZ_[RUbgaUYZXUWY`fkihd\]ae_[ao}|l\]`dhfbbce]epwvodb^jytf`ZZ[eqtn`\\[Y`gfeca``_UUT]``[YVW[^USX]db^[_^ZSSUWVUW]`ZSOXYVX[Z\^]]bjmid]ZYYXY^`^dklleYU\adekpomied][\d_]Y\]`_[Z_db^bjif^]bc___ZTKRVV[b^[WYZ]\\Z[]_ddgee_cegf]Y`f`\WZahjidbaZX]aad`ckldadeb`dcdcc^^ZWVRV\]ZXad__^[XTTX]elf`XXZVZXXZ]aZZ[`acb_ZZ[[Z[Z[X\\^`]XURV\^\YWW[TQQRX]^cgffhgf`beedb`^[XVZ\\YTSRUY\cb[beb\cdabjkgfc_[STWXUVYbdiggfllk^XaiecbYYSVY\^^^ZXbdbba]VUYNSZglhe^YRQSX\dbYS\a_dpyzrhqxyk[_cca_ZTU\agpvxqf[fgdcfgc]WTO_kqpqspc_[Z\\XTV_cc__a_ZZ^]Ybgc`_cbfieZLMRW]a][^cjiaflkhnolkiggfc]ZSRajja_[QT\aec[QNP_joljgfb[^cc`Zajqpj`^\YYXXYWY]jnqmhb`gjheinmheacb`aed`bjoqwxusy~~|vmlqsqi`kquptz~ytuuqhhffdfllfhhc`[X[^a`[_`bb\\aifd]`cdegib`_\[WV_edZVVRMW^\badf`WGBEQZ_\\]gkmlmkpqnlhebbehqpha`^^X^b`fqwwpclqrldTq}|mosrosqrx}qaWVZjnqmga\ajpqf^ZXTV]bdcb_ahhcbjprjf_[[WX[XVQQUbfc[`^UXaeca_][bfefiedgfa_bdbgikppcZYaed_efigihdY_ilj`^YdklkjcYTVU^aakxho{te`YQUehlliosrqrmbhijjmrqlkjhfbemkkinkmjbb\hmqsspgkrrnkchfbaempnjfYX^]X_dn|q_Ydoutlnkgptsngdigfinsvukbhlmggiicdfqpjdbbkzwokkjjbc`krrt|zpdZetsp{skcY_dfd_ULRXW]aaZSZZTWZZUQUY]\[[][Y[Zahmuunc\ab_]ZTZ\`[[bglfXRVX\[VWggeab^Z]cabq~wuvz~snszqdb]XNFINKOMO\l{|th[[^^\^`ca^[^fpvvpker|uebaefd]]be^_ahjgeabgjkjkkie^[_a`fjhda\dihb\UVVUY[RWbdacc_WZekg_ac`[QTW\dba]\dfb_hlchifdcYW^cdc`afnqjbggkkjjcijqz}xrfbnzvtz{xupkikf`_jstwxukjgghllieb_VOX`bb[VS[^d`mzzrh]\ab_^`egd\Yacbfirv}|zxsgerroir|pdfr|}yxvppw~zz{{{dlpspjdejnocefjpjghknedksurgcdebfjkkrsqqqy~vsslmjdeeq{}xrnruvvocbjnrqliou}xnghkmlqrtpmtw|ywuxplfiddbjqmhgijhdmrsmhda^bmnkifmmlhkqtsjfe_[``b`eefeda_]hnom[Z[]eiklifhiijlif^`dc]\ekljopme__cgklprmhlknqqkebhejmpnqxy|~zuw}{vsmjlqrsqsqnrwvrg_`eb`fhlicbehhlonmoostminpsogkwwige]^ef`Z_egekomggje_bhic\gr{~ywxwohhgb`ix}wsqusngbabjztwxo`hjlgddggd`b\WRVPSVae_W]ac\\^\]adfeaa]]cdcc[Z[][Y]`^[ZWhlvzvjo|rb[X][[]egcfbaahgaZVY^_cc`a\`db\[X]d_Zcilnj]Zhv}wkgmnmgfcnsorvle^caZ[cmrlda^^_^aa\_eig\`hkgeeghcbdacfdefc^\XTMKQURMT[XTV]`dekhcab_Z\\^[_`[WVZab_WQNLVgqpmg`ZX^_a]X\]^\]SRYZUY[ejlg_bdcc]egjcaa_YSXZ^\__Z`dda`YWRV]_ZRTTZYYXX[\_cihc\\^_cdYU_eZPZaa[YW]][YYYXZaa]af`Y[_^`gnmkd[\XUY_aWJSXUYbkkcZ[^_elmkkelmnkectyxnjjoqsuwxyusnywrjhntqhagdalautotest-3.0.4/gdrivers/data/poly.nc.txt0000644003401500001440000000643313614004466020523 0ustar rouaultusersnetcdf poly { dimensions: record = 2 ; ogc_wkt_max_width = 1000 ; PRFEDEA_max_width = 16 ; variables: char ogc_wkt(record, ogc_wkt_max_width) ; ogc_wkt:long_name = "Geometry as ISO WKT" ; ogc_wkt:grid_mapping = "transverse_mercator" ; char transverse_mercator ; transverse_mercator:grid_mapping_name = "transverse_mercator" ; transverse_mercator:longitude_of_central_meridian = -2. ; transverse_mercator:false_easting = 400000. ; transverse_mercator:false_northing = -100000. ; transverse_mercator:latitude_of_projection_origin = 49. ; transverse_mercator:scale_factor_at_central_meridian = 0.9996012717 ; transverse_mercator:long_name = "CRS definition" ; transverse_mercator:longitude_of_prime_meridian = 0. ; transverse_mercator:semi_major_axis = 6377563.396 ; transverse_mercator:inverse_flattening = 299.3249646 ; transverse_mercator:spatial_ref = "PROJCS[\"OSGB 1936 / British National Grid\",GEOGCS[\"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]]" ; double AREA(record) ; AREA:long_name = "Field AREA" ; AREA:ogr_field_name = "AREA" ; AREA:ogr_field_type = "Real" ; AREA:ogr_field_width = 12 ; AREA:ogr_field_precision = 3 ; AREA:grid_mapping = "transverse_mercator" ; double EAS_ID(record) ; EAS_ID:long_name = "Field EAS_ID" ; EAS_ID:ogr_field_name = "EAS_ID" ; EAS_ID:ogr_field_type = "Integer64" ; EAS_ID:ogr_field_width = 11 ; EAS_ID:grid_mapping = "transverse_mercator" ; char PRFEDEA(record, PRFEDEA_max_width) ; PRFEDEA:long_name = "Field PRFEDEA" ; PRFEDEA:ogr_field_name = "PRFEDEA" ; PRFEDEA:ogr_field_type = "String" ; PRFEDEA:ogr_field_width = 16 ; PRFEDEA:grid_mapping = "transverse_mercator" ; // global attributes: :Conventions = "CF-1.6" ; :GDAL = "GDAL 2.3.0dev, released 2017/99/99" ; :history = "Wed Jun 07 11:30:26 2017: GDAL Create( poly.nc, ... )" ; :ogr_layer_name = "poly" ; :ogr_geometry_field = "ogc_wkt" ; :ogr_layer_type = "POLYGON" ; data: ogc_wkt = "POLYGON ((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))" ; transverse_mercator = "" ; AREA = 215229.266, 247328.172 ; EAS_ID = 168, 179 ; PRFEDEA = "3504\"3411", "35043423" ; } gdalautotest-3.0.4/gdrivers/data/ignfheightasciigrid_ar1_nocoords.mnt0000644003401500001440000000012213614004466025551 0ustar rouaultusers-152 -151.5 -16.75 -16.5 0.25 0.25 1 0 1 1 0. éix 4 2 1 2 5 2 2 2 6 2 3 2 gdalautotest-3.0.4/gdrivers/data/small_world_in_document_folder_pct.kml0000644003401500001440000000073713614004466026212 0ustar rouaultusers small_world ffffffff small_world_pct.tif 1 90 -90 180 -180 gdalautotest-3.0.4/gdrivers/data/trmm.tif0000644003401500001440000002142213614004466020056 0ustar rouaultusersII*((  (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.0.4/gdrivers/data/byte_with_xmp.gif0000644003401500001440000001146113614004466021746 0ustar rouaultusersGIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! XMP DataXMP Description XMP Test Title 8 1 20 20 1 1 1 ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  ,!4!F QhPN Xj#{hp X\èQIiH"cAN ٹҞR,䴧WV"\XӘ)B"JHJ0:YP圧cjqHp`A[ϺUiu 1sN*4;$DŽ7WW~+r5 :SkTi2 3hwO|Rӝy{XQG-EQ vfVR_ gi$1@ܣe&3l1?IxHo&]KQĘ;NطpC`һ;X-l6e݅[<w2]e%K0 l1=?Z|*چ%by"үn%H|]X㌠_7*1rE"UPpQ{fC!b/*=Ml;(v r{q5h>%#Yg.%JNAp:]*$WvyqO2zP"ЯEmRSymIlDzB<,11xMu-?Z_ڣHY呈 3 ;g8@ݲ$Rl6QJj5M{]2%6ax\ 7kZX`Is;`ȸ;m>di~<][i1C*4 d :;|1ͦk6GVlL{?CK}8u{2a <Œ~NѢrF$HFp~WϤƱliuB7̪9=SAҾmZ#=Jq}%Ņɉ#(jdSֳ!Hn;+ cXxk STh]7lD೐Ubqg]ϩ 9.ald8 pbsZ>狮o+K'Nso *g~Yzc=Na,0]1gfE}Ot_њ$\L[u񆫯jT8t{TrnU 93߰ 1hmq׌ћAw `<6v!K[xAx\<ːs:aO=:v i7ts_] rcHc_Ap^vp0}ǐ һ7QՕW7 B(+>>0}+YSs2>VCxSsj|q ZZ[(d%)0nPX<E'TI"iQԀ21\ivqOn|%BaAgi_I"5Fl=:zZkuspKeI, 9^?_ƙق=Cgl I(i:孅Ԟdݥ9;VO' rrOZ^x;Atk(°p_\ Xⰸu}FUevI dk-;s|@r{פhz@${x`yB7`ҹ{laUnpv`8XH<=go>j2.Ji.)  `/Cei *!5W6XltsԏGZ<3;ݦi$iZxBj3@ ?NwxcKv DU Z?[Y噮 ǴFL䌂v'qSXi'c}E70r@:5KDIe.YGBO$z nm7NkVKg&3z>k)[KookX~`CاUE[G}ݩ]JH RNljI 02y)+~;{fgHn U4i, 8WAW1`g,01Vύ5"&d{{ `qnz-{k&x_R̪rqck]_R<"E9\rԯ=m|F._Hy[Q]z?:G>9*>\HN l/𮍦gE%P./^}I|Ar)mi4Q\<- ;F:76;]QN^B\DQkgG\]̓ ƀ(RN{lme 1ɷ> dr< sfb˕NjmRS^m? |o6C06MXg8#~*ipF91w{m]^+Ec?k>çXq$BX6p'Ң.⾳2I+3=>e88]+_Kt,s`v^*=_Wյ٭,t%wG<9]eXm<2d4K ʛNSyIm+BKмI {U--7܁=EsjOyn ecѳFǩxo/onu GI*~K/ҷO 隋hlU}JFh X9أ8#9#~ eX$EG0ߌ*k:\VZmA'j6h8\e^M N7yii6^IܢDJ+#1txk^KuK/.H͵I*W2lmmI-1nۑ1…ϥt?$|Auo[= OPG ɬ/58nLLbd艝@Ŝ<b',4[MvvME#AFr2}y*@:r6巆a:_+i3۹Hc4?\^{R6WOw.nVeydV͟pfgE 3ג{qֈ͊p"(8Et6WEoH\8$TVb=N[CIm}|4aNdfPFw*a5ޘ|wfE]K/˿<&9+d``[>wk6z\HvTXZ&3{sdʕދ 2}c+ԼI-֐}"{pa30йK[=kkf-XJ@%pF2A8#ZeKu=PKl1;gI5oñ_h-[UH^{l0* 35zN\[F}LXxz{:.C2b-Sp+thVpD˓+_CjKgu{{zeӸ@"/3O͒G~5vw~m ?I$hg'vn9OilA]6ϻ_9 H!oϟE c]oVѱhŚ`apwΠsoεxf)5&"I~lO4$jNNuGUY.v U#\3y##ӴoxJE d9<qrI$̒o*y@m͵pZCL5ψ,oY -A`5B8SP?°/4 F]> ]^f$aH-KO[xYťô]0 F뻟OI]}O}V;HӮdQى$|#o, 3X7e:g3 (#nX ݜ`sKp/O3cq!ŒV>ڴN6gi>aؠR ܉9K_saId໊H#'ʰw'QG]BVXAWAZ=pbrpI8ՎMtmn$ROR6 6gYWʼ6CF@) QZѹ4"yxJC (?w爔6䁑[H/`in$z灐rR!Y|bBK?t˺OgwvL 0گ4q)LI#8M>_Gm {nPfU\-5MuH;;rNqaю<su:WBe# b'8I<,\^HH2Kt̎FA:cSn )V(#q,>ӯ]?M6 Vݽi,سXzskwe9\:i.E? cש:9J!kHd*"=a ƅь#c#n58aD RVYC#)N9TQm/3MZ'pc ʜ #!)sLMn-g.QldrcFx7C}O8IICjpO# S}qnl-d/.@2s`<FFx=šu7#it#椒`qЎ0]Ihl2"W8j?=Kqmuh傳uY=#w:kYYGg;Gi4((rq,z:\_=s4 w)7 p$2 v5x^mF%|ݢ5.Uzs5'oʹIk+wGbڨqz:}VM;a򒍖F| CV鯷e2c'l_DԷ%V`j;\]-&49N}k\V}2F΂KO͌?6y:W1{+%B`u"\(8Gat/c9GŪ6 Wف8@WvXBe٭ȅ]`6W (8ʿَ?x7ByEdfH+p qFǭc- {L a+y :VlQi}h *DPLH8rzqsE&Ni R?5hC@@^OʹhxCU =ʮ@$!g9v|EQE| hxp@ʧiPc N۠V?x{J\KvJK|!8'0O,M#c*q@nKys_OR;]*tGeX?(!,t q_QEQE~Z rȷ[F rHO%H< c-گ62( 9<{խhE<}%H=|nc2(+sI{ xvKaйI\*\R_YcݼXPx 㸦ˋg'hpXr9TNTQډ$br61yO6ZkgjO-Զ$͵&c۸-Aa_Z^iAdxem {dqX"n %.q&I)#({ /D8I确I Mw*k#Ӧ>(VY4K8nØҐ*Y-W9s[64B.Kf?u1wyAe c6;I #3t\_Ǩyog,ww&w/Pw!k[ZPE#$[6p%f1 @d{k?^"mt<11?Hn0#9K!<2C8s>=-G<##>QEWgV݃%H,!p.?Qè@{+[gP RH{pzUoS/"Ѯ/JI_ٶS)KYU H[W=O;B[]N?;s! = [MĒrz,NJZ[EיVuW`3q@*z^(dEsef*0 q;qOreڮrabstMө˛ ۩.mpculsG늬e T=GWtQEQ_YcGcW?dX%KR2z"|uxzY#?E@vLN?( "c917ĶEn߹kSnzϸkg~&{i&{Wyݝ|Zm/= ;2kƮ"?kۻf3Φ;u ;CFWш;H1匞 M;A[G479ٵINحiawkg17T<`}߇Jƕ노HHh8nqyar7DXuny'=+h\\jrlƝpA$4M:H<,T댸9OZ5 뺺1%Ж䡕|^Of(iwP< 2{GhC-1*$"@Fр{s]ugX%oBL6R7#71̪doP>9((}Jf VH8O8?wGz5Ր툢3}jOuc[ U ~m6YE G(HqU2CejQ#\31Tq wA$l.19+ t 6_M2Cw ܼ8;Y2,>eղ\2(% ؀I1t9!Q(ЯbG?|N^7jH)y-Jw\9 Pr~)+s̬H~]?i&}*iRteA faWKwġC'^kP\TuçcWD%PuդEc%ew@I͸p~]ЬlQS{흣 |Ìuyu{H !M>LrБV^ WESQm'i \fd8VHc ӴcRȲ3^E-ϘO vܓn Y?2=|A5Fa)iV7;x$.}<խ$滊h7o]2^<3G"Se!B7we+uXv15ښ4%_wg>-Ks92d!@zc2J􁠅m%SjRI)V?ݷxN{ȑHyCTxua[ޖm{bQAQ׃?gD$U#!W_\'HtX)=}j{B'brO9ŒY?TV SKvߏʣ.F vpTQEQ]&.ڑ 0}h\ώ%[I$uӐ S7 IVϯ)\҉oq}k(((((((((((((((((((((((((((((((((((((((((((((((((((((gdalautotest-3.0.4/gdrivers/data/int16_lossless.jp20000644003401500001440000000625613614004466021710 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrasoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved tuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|N@N@@A̞LAjp2cOQ)R IYiy\ dKakadu-v6.4dKdu-Layer-Info: log_2{Delta-D(squared-error)/Delta-L(bytes)}, L(bytes) -32.7, 4.1e+02 -32.7, 4.2e+02 -33.1, 4.3e+02 -34.2, 4.4e+02 -35.6, 4.6e+02 -36.5, 4.8e+02 -37.1, 5.0e+02 -37.4, 5.3e+02 -37.8, 5.8e+02 -38.7, 6.3e+02 -40.4, 7.1e+02 -192.0, 9.3e+02 jXL   *"68  p h p @!A?@` E> }E]v!tf4񀀀 YZ Q&*pq|<0=@='$A1@{u2P{c>A(j˒./ĂvQTZ7׹bm}{H*в@tx?Ff_ 1 ]twK2Uwrv_T HcX+dH>E'(|;&^d9t8Xm"!qHI*lHm?lul÷,`I ׀oQf}t~*'\B A  P` (k0_ (ae ~ yș ȁ=ǑgAX$IoFY5☫w+Q "18&YqYHX4"ݪZβٌ{ )%7 "Ho4PAY_7$JlĹ ΃N6xg`̦.. ˆd JI%H\Psᇰs6Psf (uPPq)dY:_LH@ X `px)_ y%L;/%ұq߻i)xI?Ǚ@Ҷ^m4dDd_7_7ddV='r@x@&^7 ".Vx<Vz=5XEHK (Nj_p <Wye0 H{vJi$ }._ @ H\ŌՉ0Ȭ8 ~ȓ4 ~ )rVdorNg9&RxAYλVAgUgExH8gK3KQ 7,.7`AYҞQh|v}nYj"Q7$NrDz-XX{ v.Թ% j %嘲 4 ȓMYJ3$JȀAٜik"A֢&rҰM>*VVgQbNPsZ!m dd/-Q no!&SeiM.7*˜d .OrՌvpEZe!8!̢#re+1 }wzxH ˑh &嘹$ȟM sp)%,Ă ЯQL&H@(=6ong"չ*%NW%!ah yrfyͰg#ZұHh 5M"QF'뿼ՑjovHXPKRe"j7^z]԰= ӱr@Y-~hH 7%xO' Ǭ/] eu~@IK n7Ɲ]>VgHdk(%^&Xc[o_>Úd>*=jÖ~nG^gz!aH=ِ .Y ޑXʌˋ%ȐJؓW\# RIWeeҧWyn^dVr3G NWN6xGzoM Y6kY"2L?N6M" /zeHkPZ?%Z8besG)xBh(԰x|ʉx~=嗃:qcu2߹λgAeD 0ʓ"g5QDh[<3rY&XʩcQAY)!-o(=xA%2 H7"e.N,ciTʎʉF xpkz|w02l!n68fy&[/v %FB?ԼBK3#a?d;ړ6aNYT HhFlCʓ|hxAlP޾oЏ="){4*J H~ʨYdz΁ԟ^6ԵqHÌPHF@.˶n$e%xSBKge4VL 50j,@shݮ$h?h/Ke맊a %,3(u xS)Ou>0%Y@Ӱ5cJ@xV,ĺ { M-;{oiho-_O4a ?!z Jdi }jSQ)HmPrCtfVu|M h݈qJ¨LJk sI%kؓxPaX xpH x  %2H{nU2 B$XH݌wrvY]H 0Aȫ) )ky80x,W^1Cy<̅) kR-W]u4 %Y%{؍҈xvHp   ȇ ~ %N7&tK(\#*B r@ْPx =PK+Xf ZdσZ+ DSNjH DSlZ+FL2l阍I WzddWU`L_zȹPhX,_:1?Ve[( Ek>^U2 B8=ҎrH_err7)B(|!uHyyG<6C_ڔ[Cgzh 0 'WZs=\ %4 4Dv蹢,QV7xoc0yk{Ѫ ^Uh:@M SԆ.]<Px݌ur 1FA'[JE9!yiq*K=~p-{@Q{,_ %$> BS# AZ]߬Srjvx\#)@ PjU2 @0%&ZPx Zo.h @MUVڹa?) L ~ZlاH DS~1e<#PRWș_pXܯ;ح ]%Ik <M( 9&ʓy ^F2i@I']呂aeL=߬4x1C-R0␠␠␒qihl< & $h |PT;xsX䛰-^\o,J{υə̕ mXWQ~\#+Fk ݑߝ/̚IfK4$FL5"i'@P@PE9!pE3Z+NNC< ՊP,M k0 kUWZspfrT)ϼNefNSϊ=|.1C`z\#)@ Y "Qߝeǽ4>f'?&M Y DS5"e0԰ 2 <uF0,~WUuW_;і3O_xL6!H jEg pI%`Z~)*\#)@i4]NrԖď@٪!e΃J Zɐ-R0q¨%ZH<uHi%@xX]9M,h h n# M~Zd`x{)ɛ~Y e0{@zg\##eOxoҚPxՒUǪxڏɜX"])0 i=-^{/bI# XfhgP[@ / ȍ[~n9{@ **=X&1QX݌p)y4 :;?;@ .U@Ej&[ӊ@:<΋ !wGoH'ǣu>Տӿ?Î4"u{XWQr@Fr@FFzgjؙ)*Bai*mX:5Iںx1e ֳnׇBk\IC (BxOs!E䷒-.0ҋ%"JݻhV(ح)Y8}is;g &HLʏI r@FJҒ]$ FBD׬(l/cn5\IC yw!YI5\؜d10T AHȋ1䟢g|Zh ygPZP|]=/ f b-nH8Cq&ʓZ+-R0c!Ap}/n\IC ĉrG$DMA)( N 8Hۄg$,zӎ:2`ܯ;X]]tw͢<#!&Nhv|η 6OLaTln@@+dl\`IC (BEhYJY8AxLkl48 9ӂg) ]EPW7  d| n]| .zT'&H /5=.ߐAp芎UĔ2(dPqY P(H@XH }8SS 8-H:skU0W kN8׬Vu eUg؍Gx@E=XI]NApx|4lr \IBxic[AoH { xMKކ Zvp0 ؍3Ϋ- y ҒsW\[gTiҼ- ί54X^UĔ)z_ez&n\B HUnMtd&R8J쀤~xH4G IF8,H=Ls=WșՇ`i n.hDWddЖPжE3n di7+/@𪜕 BܨP;HAp\T U)fA(Qd&R$ԚF^ xLk@MG杏H a[&Bѷ Jzs=_~hМٻ Ȍpng5tK; =wgFY~YhP˜~w$ۦLnʎU×i(]ܦMqYLzEpx$iӞY_!eͱ; NkQ+0 |~5_?mXf guY% lj8MZZ|i$PoXh\ gZx`YBU) F'rgPqE3\MA/G GX;.Bp-k^Xu{@F_~PxHyPxՒTTPs3Հi'aX @?eH .XezȨ c`]FpĘ)rG,2pMA& yX2)YTI)]Fѳ,SS Ds @VHnuXN%z rH+ PV0M>8@H분ΑצB ʎUNj"w)"2X f8pܠgFyX0g$ "Qz˰x^H:vDK?|P840GxI`B5X_65  xՉPhiaZhUΐq8-`Y!xh3\7(eyN]AZ7VXJ`(πyCynz)exKo2X㌶YJՃ@猏((T7<@Y&!gHgs>YԸ -K-j( '^aP߽oDg1̹=U8>ozB٥Nx՘jr;EXҜx(Ͱxoz)Uo厃M+їN6_2|_6ȼN܍P~1e H-R0-R0.UwzoiՉ; %Pxpz*f M `ˇd0m[P`B84J~ӣML$~~>B, LDԽo.Y_7V/YH/Ȑn6X56c8݋ @opOB#Z+'# LE?S PxGO9"f03~Š݇n^Xv؍\A0 H rMcx3NO8S=r2egeԴ骝"PrQr%Y?X|Ά0i؟} PxNw)1@홓'堼dρȟzGkA~$h uuئp;,]R *\Py,ec&~\U0:nX&W.Ҳ#ߢ,%87+, RxJE ؟~rHL= Тk@J8ْY>Zdυ1CyY%|p x 4{pyA~1eTHPTH\}y[.~&T~&58 ԰tWd7-.ߎԺbL$7% oJp8%%̈7( Z+8-R01KBLo:"i[HuY%0SrDNТ_pyH7 %|~gz$f%0Ӎ8PU0Ӎ8N M8\70/rYBSrA"eG{,QNE . p[pL^D 7oCÆ$A?lL#&~1e)C~C2 2)QS0Ӌp{@Q{Wșg\70"e+t00zůgH284O$ܞY+ՊӁ}NK:_a7#? ~ZSSL_L_H݌h `ކi+p_sH9 ?W^Uy~f7$'{z ?I.84<&NDY"V@7ά M󊉫Mw߼L4] K i%Ҝ?h mQ Щ`o%HdЖE(p_ү_Uy Bd߬7$Oׄ 33EEH6pNҙͱb. n\[/As| ]=>/j*iZjNjoeBHЧ@Q\> K aZ))á=? ί0 h h ͊DJs\7,=!<)qT 3uZ~7iD @ lL=hWI%1)Ж 9 `@!p@XGx@E?Oh `)K p+΋ 8 0BG ' %|9 .Uy HBP~~H?+ՃghݍYMO &B[h |]:"`H H-QYS1AHq~1eaZ)zGPxՒ^ Щ@ 2 $ A)H2FM juFH,Uy BP~~P}=S8G&pd݇K.D @UU ٪ ]Ua١)Re@5~>&>&ݭ޴!ңا<Gk h i  `@sH> ЩzhTDRѳ_\ HBN~Px݌qGޣ;﮲NXNc8Ό{/( [/ JؙP{׎Ү1bQb2ՒM+<Ҝ4G {􉘇 )<$;FSZFI'lD@\DLJ! gF6VB5iiUPUPFB nUŠ,ŏ i@t.6En>kUKdgus0.7d YuЯHk԰[` ),e󪔀leMQۗrD-ΨHi -ʀ lc@kYHYF61sJJ5\()H Ջ6ph a+=mx( ̀ CoeH S7Ғ: !ZH&\QXez@Fn;ʌcʎ>DىiiJU & dUhȞUŠ B `gxLɌgrDYjП8sX~uk `@Vb7 Y}=/i, ,]Xl\ΡY#Ӡ:^d 5U nE,FD n{@& ?)YԳ>Y ȍHx!eH̀ { jR٥aX΋ `DGXF #a1=P/ghѱj[iiRΨꅎY lO\nHXy ~Vq~4x@HxOGKlZ"+\vPn - $XQ{ {PPxՒVtЩ oh ЩBRt;ʌc-H`=zd-Ά>XO dViҚ]fdyҵ\(@@xDvoҒY] "߂ߗ"gҐN0gv~jؙWș{@ؤ &.X[H D`YBׇςF<Ρ΍: chȑ 6y4xNY.UV  #8K1vRe2ezjŋ-ŋ)u |@|)*,s`'7:mXJАaZ)=B\^ʌD]yYF{XJhhz@҇iIm_1[MnUŠ  g$XEhC<.ƀ-/u ?h,PVp,,D~pNQ@$ ) =S@x~xyTV `5R,6=i6aM~UŠ i΋Ǧ=0EF *:Fzz /!-pH=8ئM mحPU0ՒZ80i >2 "ʀ; $@M5Viiϰ{i<8 ".M`ؒS?5޵Ә(oݔ) LL 䀠9sMMrh9{ż5/: Moȅ\-BޑFά[CYY@҇ M!d<4llVD{XW17ŎY]Y A8_y%YȘYE,`BpȒ~Њk]3rK߄ +"k K )Ù΃\7 P5vX{h üDoBt U@^ߕF d@T- )%Ӡ.H nM`gd 8 sSz~4Dx8Űh9\ #4%%VoY|ޝ,u@rJ)HReG3I5@l& Z~k텰x|[iȓ@; zS圦+]M5ή,lY /JǧgEgNТWșF@X Ή~H%͗S(VPزH.YHԱed[) R>1.7$Y8 r2M igr{_Vpﹻ Պ]E)^r;ht{0Q{pyȇͅ؍ǧqM5@Cu?{@P] `:߫aV.KH NXo_ok!> ĩ68.fL8,5~A{@FPU mWR!r(#pW_9ͯ0Q{0ǧP})}+^-zg @~1e̕G|Sd!-h ?6M o90raH2ywA(-WUu=Zpzy@ bL2?o(# 07!Y?ϩe'{ey-Z_jlJyHw\PZsث?{@?@ |S yK=ѳ0 ~؍; >zy@z7;]:0S 6Mg"y8reׄ7-K5n8gF^15<Յ 3{,?WUŠp-0 sD?_,M eguuǧ߉S Կr0t $_9n6&\=o/Pq8Է$d5@-eqҪj $돜z &u_[pS E8;ء~kU,?D99]eezvA@"K늳 ;7śj gĘxL=a_ Z"18'F]Xs_N/T/l"+pg|kVث?_,sW_9MNgpؤh]eM nzz8,U)Yj89B)V9>뻶 FX{Ҭ$l$`@R`:jx{@_إ~uFpPQEuk[z!eFm ȍh zy@ MBH %L04]:,X4@M#I>f#T+ZA&0C$O$H,h 0 ,eh h h ~ح_p$$ yՇ`i0_zy@ 7.ܳHɫ=2 4^ae0$~eG84 DSOiĭ:޸g t<&0 |_kVC~aPVp;L8DҳPU|]u.zy@KpS vCdŃE0S0I>C7o͢&h0@[+bY)H Px~F_0PZg,M a~P]QPRȯ0,eu^zy@Zr-ITH KAL0SK pXA@$l|Y*PжH PU|}Wș n 7 +?g~s6gp-{@0Q{ȇ_ǧ 5 DH$HxS KH dH;7" Բ-ѡu e `d|0 =WUu=ugpzs{@_~Xzy@KXX8{ U{ H]@s 8S7PxPx 2Wșs_sOء~{I&0 &PWzFWQ~PTHDzq FX?ͧ1DH6ئN-`Pu z ,ܲ!ZakP< $h _u{@ئ0 h |||Moq{{@^^j|9PUǧF5D ?z?h\Zh5̀?hX $KH=$hz;?,g{@WW ) |u0FWUF0e| (]RpyWșJs_0 z}()w˶O]ԋ/ BaVnlt7r'9 p-HH?h`M˧Qe9WUuW]Q{WșF1',M kdpHUi{F7 $h 0 ǧ Hd͢,.z /3r&dgFsrč=SSA)uS +z $go) nu{@ 0 M j ||]`a dx8sQ{`{0ǧ h]4E4Lŋ-ŋ*S>zgc޻hoω?<$MEL +0꒪{6kQ~Q{M js,cxhpyMpy]M g .zq =)85Pf ef dg&\&[r,? Z%QJ`ӏ?hVmN '  %ا *ȳ{N 'e|u؍py9hz00 )nzq Ӵӏȍx~Pzc61qYߢ+FLIܝ6ygߨ 8|&&ef l ƝQM o90 vph dڸ ȍWșWș؍HՇ`i naE) ||]9ރǧ (ӏȍXU l&ueOHDx[/035"f͢, 8H7|w.r`raFWU|,M dh u{@H8·dpՎH1eh 0 MC^gHǧN~dЖ /9skVpgp- #??#=)`u;?d1{@Wș{@F{@M hpypHpy{Aeh ͊PܳHɰxgǧH "~WUu؍ y9~\Zg 8|XNhɃy%5_|V`HUX{I&_~,ȅ؍FWșQ{@{M{ȇ%W^ҷ0)]M8ǧ 2'ک݊ӨvZ f v2FLIj00ҧ;0gY4xƊYw$fM egHEuFWș| (]dٻgH;dWș_udЖP]JCǧirރr<[ ap|L89Ȃ?CҜ6ՊVՊ]{@X T\ )w$fBj"aPVE_~:sFH8·dE(p4R]R *W[0raAKwA;zzHNLyiկZ׬?'8 FBMN1Z<4@pﴢjjX ,LYƊPS js_g|_k"f^XvX8݇n{@PVpS 3o;zx-+HZ+-R0l?اNjOnT)!y'P}aPM, z~1e )gvՊUuWș|wS=ŋ(&@gȇe{^XvՇ`i,sǰxpS;oQf}t~*'\B d (3ga ^PEi9f+y0DX9nݫ @D?UOfn ;*e.fYv$f,5JopVXoDDBH)MvU`R0D$ @J_~BqqN/ĂvQTZ7׹bm}{H*в@tx?Ff_ 1 ]twK2Uwrv_T HcX+dH>E'(|UoQf}t~*'\B @?AQj1Y.Z+e?rM@oy7H/AAAvaWyԾ?ҒP جrH Ɲ)5x?) l=XѴiز -pX(zȥ h0py~݇n y!x ȍg8sH  dh  `M@Na^i. &` 6a_hd*P@d-$' @-+g !.Ā7V=*eh BeJq%orҾNҽ*=nfyNYvNxKҒ\~A}님( 1a{p@aeF|ED8fxkvoh IHU4xsT0Խr I@ˋgYz´;Hak=X M :jP@8Vg,j)7%oMrIoߐH쪘 /0P7*h t Я嘥8i|x*Շ`ikP u5҅u~Y hzԱWH&^_=rLք{Q8@ae;0QC;aemKeҹaSXMH UPt CY%T)izo=J?cԿ&PBerU۶ brr\R(~Lh$ 40d dpٍ39kTﰳe htU v HhUaYl&fޣ(d!0$A FA߲k.=%u=rFǜXa/ @Mj&P@y&萈( Pv{P}18wW牎 )7Nz ~LeNHz 0:${6-K[ Ξw[sߋIa Rfa46m @˔܉ 2Ցj"z?տ &[K ?"uq'iNoZ$OW{/GqSR#Ζ˃_@G$Rz ,PՐԸW܊T]53Aex{s{2ssiyRʇɟ༟ H (zrՃe5/HN)rH?9{H*۶wCwFyz.$2M+|FMɜ./u8,9U׏@~k< Ͽa{ `Ek`EcK2,))xw V [h~ dmK|na8/5}ҎKl$Z H1_?AqS/ZYoneHw0"T؁Y)m3)^ez4(MH?'=DDekA4-1(~6 /-TQ-UnԶ$ˎΈ.oXKtI9,>㒄|zoujxH m ^^ZxAf} (7i ue}i 2p>ru2eͦpRi0(D/xA8 랙HDdՎS L9"NZ1M/ zL4Z({n(r7$۶M6X ?9O$vi`/@xH_L(C(p03(l9@g",ϬΩZv#2,v_M :԰E4ӵ +21((M1u>$ \u1^.e.\ӿӶk $١2D-M׀f8;BZ9q croi\`V[Bv .HowTسi\%ض|>1wSV}51xDQ98ӻ2䰼%"7/H1ftMu9Vs!xN +d䉡 /3/S /rs22z~hUY uԸ,< aUrC|oI8݀7CҢ_#/ 21 S,>{N(N}Mb?=#ՎĩPEܤH ts/)R+V!>9#l>ui/Exf_z)1)e|ؐÎ ?1<+x{jbÄGe 4 | )6@@ N4"~ f S}1I ȓ{ 4ș '$.* 7l8}0a \s/"CPEΙb2'g'/["bzȲp{x /Т) ׄ$!eǻ` +/ٲxӾTӾ$Pw,x>"dZ*II`̟Զ˶ZbۏHq(~@0b /UP 9Q0:5Px@lhoqؕ31J$͸|eg72`p|PD (N]sfI8kv!| &3,洛I~xn/gs3=3UmPyYY*C7eQH,o @U^;id],#DfPlD? WHDB:-Έ_Bav7Nlu/%`Z d ihaP_ XI(r~ ќwv,qN(⫒ ]m(w%ՅXGa dH]/HwOD0-K c=B*s:._p~~{ꯪCSx7ha* V>ZY`ygTZK+ͬvr,q *Fyy9(Ufoq͐.lҬ Lr`֩Y6΅^2:#>ju!!]*7ucȇ(r?חݾnW)$2c2,64O_ӓӴHNT0Af]$~0;8A Px& #T ;^;^;}-,M*] P P ȑVhV4?(s,*(:s >xw~Ӳi ;ӱ Af])@~ Ҭ@HrH? 25.hfBy4(hc}V1墠 P!Jk1r{G& ""s?觻ü;kxzToq,*/@-i0 '=? Y /S:b:awm,N1[Vss.BX"&Q9>dlxw͊N}0;sAf]%HIZ!0*A njOr !" !;B8ky6hU_MO>UxY p#a"(s,`)r};1x~oAf]%Hl pC%o.N.ZB7}¶+eW):yy 1S| `Wa anZBz?;i9"1KAf]$~͟Y؟ 쉘.[#fS#*{O(=1[ȑPO!>7F>%fcAf Ouv٘wo~/ILE/WH]"wc,֓)wa1xWAf]#QIf@ HP_C _>N5"J(31N;/*!ISx5ݲ#b |-}t>?)B$UU9#}u7Ɛy9ϴoq>rjZ~`~L q)yGY޼ J}͝ ){s9!MuF99̖kv vvvD F8V+1(,GP'=oq>rjZ~`~L |xݓ8Jp_X_g@Za_{tLy8 VQoxΖPup"3ݵfMbs @&,b̆2DO#uwl uH9ƐC/Af]#QIf@ H _B*:P_PZ s6~L1 N Pf(wb1srW+ˉ- ݤrHh5 )&+bЄhhPbGyOAp" Px[D[>f63($pˣΦ!g!~!>y? aoF3AD r˸;W@],@1Du(?c( y BF АrQxY f^ ͊Pt+5 %xB^=ҰwgOAHY K rXH$7H ($pپ  7RjI(x*-DDS%DiM)`?D@],@1DB@09@f289BTSн hJ %R& p& hEҕ/HN3&Mኡ)wE ̞pNTH .Yt +r0u/M 1z.]~TAh{MH )aXH )Ҿ);_ H~..öc(]a UpX{i) )bmXe df=/Խ?3SS/.77)% ж@ 3&T#rFCrHS˺ C#|q>7>q8{iR-԰ .rɡ .;Y !y H~..öc(]a UpXL ˌˉ ؐmAi9ړrԼ Qt…(RVP}$)Kwy64)g+ fH(ղEl d,>bRև~!)|J6%hr Le? H~.?c( y D%JP f ({L87#Z&U׬d團68[)_K_j؟l{/μμih /*!R'~~Q}9\6pz#-hYW Gq4O H~^2@f2' إ)iعཉK BjcrViۜ8H tѰ,l)z{M+ MMz *<\ֵ kV*2JS6[>1kۑV؍x[%aR:aQ(:[\P_ H~^KU3Kd rCǨ = ^ y'8zl^v5nYgNY5RH M>i-F(H tң)>ٴǓ(ݰ*I_NT>(ϖYye娀7PzPж`zߴ H~89adab=FEp<0Ӊ iaY OǙˡrC`xP`Я#'Y*?{Z--W^}*ܧҠAHȂ٘4Rn!+/N/M)]ҏ_;+ hXղH/h;4)hֽu7]~a* 1GV]N ~{!/`NO OH~(0!9? @MҳMK V /g-xC5+oeoҾ6^1oaUg.-*Vg&rqHh~o~o 51>o_?ԻtQQߎk ]4W (U 8iwq 7)1;g9 >b؇(F?H~((+ܿԅ+4H  fewoaG# io-@ GF]*n1g!g.-Ukү>%k 5kKH-on !mOhHٱBڱyw =)L"LM()Ҫg.58wte,$>"g&r8)81N6v>lh[ ҏ[PW 9 5~o y2/0A5P͝a"Xs ΋@],@1D01204f,)@EX4 ҇6 us?WE-Q8YZwze5C_FrN%>/ҮN3 +ٰM1h~h%EpoTAQșxG;)yDY[ P+3(*qF:$(@],@1D012@NKx E QFK= =88j+V$ I%rg*D8V@r5p%Ny%e-Ծ7*KrNTpHCHc|si ӱ1p(-[RNY1Ii㲰^6@fÛ鍊*9@BAZ&^@xÊ$16nAi;.HYX6l=8 8=!CZHV-VQgy!VQ V-ozN6.6xFyDr_c7.7PH@ü&,> sT搜ej# 'nsV9٬b? .2eQwχoT DG$?e)7]"jB1D =Ps5XnFD`ϩeFCG}QJ 26fw "0BFFrNyxMFEkWy W17kڇ|-M] Ҷ|\~7$ 64?N[QjsepX%; j?Y&Fib@ A(Ho pb i2QkrHKFI6GYPDn>#Zln뼡6K<.\DkŹ (/xU0 <ǻĹC 4*+8: t؁zȬK (0EZKSpw$fd@ Ae(4ccl#D+LV4PҶ(ɇ$J"ka:G)q K5%!]PMrLb?{2 A=| - )Q)xՙP0 (Ap|Elm2]" Ҹ f9D}D2lT?2KP L) bPŽ#/p-"l<'86a8MCPesD7cȡ~Hj[4%y ;Qe8 XwgGg^ ^ ,)YGdP(IY&F߸)9ϼyxCMa1Ͷ{ ƿ&9PHdi`e/ӳ/2ޝRd(U,9 #ߖ08wpD%K?^\> $P 4P@ҊϴY&Fj/j9 91"(@wj/kFE^nٿL)@M[bI7G )5ҠFo}<(xUxUu/〶"yO(/2vy 7 ?w^2X0٘%XǭΊ[ϴQE4j/j9 aa@B}*5!^N5BQ=_^0% 2 nOwp:gڕJI \Msr[#}srYKr~,8BK5n1;YpD`4Iڼ8-RQZ $%0٘FX%?QE4FЀrp B8^̩0^8%$Z5sJ V=qE֐MtHot7Ɨ7Uq0}+H xyN{ ۔8i PrhIIM%(EZKֺrokogz58g/~#_ I5$Z>*ả "FK/Ջ/DnI_ &k*Ҩ>1okN1%!FY-\$bVgzT.VC-\3BmKmYHy|mݗxGvQ+bO+y>ɃIH =ҸPv=n6^ )˜Mz׬8I[đElm2Z#N- IH%r؂=*^5ZFY-]*5{%ߵqYui̪胇j#ڮww4u.l!-x7N*~ ;kg4N =6 qV.b@M z)OhOh-ߴQE4). ؂w8˜^@5k^uZҡH}%!!_;%; ͛%rHHLJT<$Hs5n%> _F%`Zhaa&P %kьyg԰ ١ )pJ"%YH2\nҍ^WVe*zxNQE4>M*g)%8%Z̹ %JkZҡ̹-\xe|n&H%rHy=¨{sUZ5|xdž`ZUgy0PyuUcX4E$D Ôç%R}rHHl] &ewz1oi5*wz'銙m-exң_w>olMrGaXo r *CϳH eXQIaH{Hkh〩Եp0Lqp aY%ҩ#$=#ry 8 aߎ|F歶,P./Ȑdd=ҼBթ7=}#0 DgNy#0d_?85ҡH-]ZZN$ppQFUuJ"ReÁYa-_7-H t1Gw"^~Hk{k8s5X.%aXW$Ȭa)/.N91H: a $ȊP / يϴMjbjV, FAҼV$N%-Td#0no@FEêd_>-TdênoZ 4g*ê%\ҳo_?==FCrH铠M>Qș薚dRf2@pnsyjp rH$(_ ȥ[ٓ#.0lŒ| ؟> DSj04rǠ+il!5zQDM*KҡH-Vr%k 4g!^z8 L$p%jg*|g*$̑M*G*e^8`_MN1V VN@ǹʩfy6M>8@ _#y`yP ȁhh ȇ^;˕7mȹ `԰ 3N׃NץH)P|GNoM9@t(Q+c40QF\$M*^~1e^QFUUkobohp%kFXkFXUV_N>%k,~1ecҫnҾ6l^/ +-AW1)*F6F;V$ (jpƝ%U^3D?%[ 0v k8̋ j͉ kDÐ+f2zJN]*^%r81jwid_7޴-TdN2oh1^zuwwz N6?}*tdz_6'd7$gj2ِND{tfXhp]MNgxfѸ<88 ;+d.RT ƳѸ$ # " kDbjxzg!te}g+5zboh1% D\B#0}g*HUko`Nr%rg,!V$::6HYҵ{r(~[ꉐ~؟S^ h{~爆ۅs蟋p g ʹ ν hՑ!av%ZX6սvF0M&t(+>1 $>)V18 De*>'e*BFGQ=k8 @QFU $ڛ@@5H +'ĩ_wVwzVuu11[Croҵ{#F+I+[ۋfpr@v#kAJ3@s?h `Px+B>w`iN0ysفpnvΆS~ϴM# , d=8: 4rGzBFJ Qzjp%>'jokg@FEêl!_|3N𶶝W$gj&dbpP 8h / ~඙{\0H8Skx= Ƞ;}/Jbs]Mit@·`_S'XWc _Dl/=Ҹ=ZmVZg/8B\) !Mwip%-TdҡH-SҡH-_:Nyêg*ПA _ zz +-AYiPGa MAZ М ԰ ŎDF9*tqny;ns3Ұ:!eephHkDdc diaDN=AV-KooBFBQ O=}no:585 D\BxFybeÁY&DŽ_ zrqeE@un/CP XV8 -KWDN[н4؍Hpi>>qp݇a@yDh{GDk؍暆Mq@CFOQ_5nͭ%Րeo$4w]6VQ=-W_?+o-_ǙͰ|ierIQ )UnHx-HTp/b$ZY_?e Kȓ8 {/ XDDQ/ zȓlpٷP UPH f p`_a8\(kxځHf@>rs.XS(HNiAa,p҆UPnxZnZAf]/HF֌r1Ҫ󎴠ǀl=Te.E8rGc+/-A<{aPx$Fy_sD7|!_Cs#n77){L謺 j %t;WdN^Y , yZqpnJ \`@L haHNI8\i1)LZΆNpϴoq͐.RÆ8N̐`Q^kon7#}6OW y4OKD K )\)IF$bG4#4.F$bY֩YH::[.0Չr!"ڷY zȓ78Hl݈iPnX _pDN0` U(>Z\RSWS9<9<9<j@j@@C@ @@oQf}t~*'\OKhd6g 4"H 8ĀXrH4 4 d (3F pMK=*5dgn8( I5?OH؁ga @EPf!ҵk<ۜҳ߿'$B !)xH rI Я(Nj pE'Ue߼FCVoo萹rLX杪YPp 6嗬-E Er?n?KҼ_5a_h_?h #rcXH@ YXaP⢭;M6/g-ǏH) h$ dՎ`X% r%?)ċYd`Hɇ$ua[ԶV #ŎH / X.?j{N!w$GҼaREiHeFy}Be dXJH_=KXxxG$MM+4^{=P|H һ`D]kX`x#I5/-Y)jhPxIMnԶaeK@҈pH h lgI?p FK/IqYw6tKǎL  ج) Է$Ȑ&PՓLE^-Re9\*/P@]k/ZPx lxF]gaPMx2J']* ՉҼ=!Z+aR@&|\hWH5/H 4OPWew@(HǙx~CIʳ0ԸU8@-Y Do(>&8px8쀯"Y h@~ GH !ዘR@.$Bڠx4LxQe ~vFfyf0(֋&̼\$)h 2AaY v H:oEPnλ%ʩoAh/)L!iTB6?X萐@`ˊ8 Q@vu*ޣ߀ f]*Y啰q7(emhҒ\붝1FB>@xJo笐J"ݲ]3z QԀԹ = YHQ q -Kq)qYFEg]rHY *f tgԵN.eF|Nj*xAY-ъuWe>glRkK嘬 ΎY7߫P a %.GRu/Ztr(Dt`rD!x4#4 ȓ ҴFoPu?%a)h3/7$MۏH 쪞Uoz7.Yz뱚.?3)`rBA3Riړ&[NxK,%ߐh 7/SrHG.Z@@x9I.ϊS<~o T NzT0Pж̸DG~nAH%Dai|iز ' / (ȓ@{X>tJ $ uy th xs̱DA8l/VyPvPCm{eX63/!&ST=aZԀ; 8py{1̸;LWjޠH\DX4" lΆ!.-|j1^Q palyItaPu1 ȍ $!+}ЙW;@ Fh=3.牎t@~1 4!/K]W@nh:H R3|J@ap )ʑceʁ^ImKnzLen(1 +$$p)/{LxC!X:@se0މ 7 lČp>YǞQ h8nrPxfꅖЬ #r[ #sᬉMP@}+h4ְˆd (pH{\ЊR.[P˹p!qlEso U yTHp y|H hı)MqL"SVґ3 lˁH"  DlTZ`HP-^64L="e /n ˳UsseΆ)5kOCHKX+ 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,B0B0B4B4B8B8Bޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շagdalautotest-3.0.4/gdrivers/data/fakejdem.mem0000644003401500001440000000203513614004466020640 0ustar rouaultusers 19 19 19 2 2 049000000100000500000020000 0010002000030 0020004000056 gdalautotest-3.0.4/gdrivers/data/test_FARSITE_UTM12.LCP0000644003401500001440000016020413614004466021761 0ustar rouaultusers1v?@Fcݫ@k#@Zl@(ihgjnsutplfvmce_brdxoZ`q]Yz\W[kaTUXSPVRQL"$  !"enojhz53Smw=BA>:768I ,4@C9GDXQNVd#2E?;<b&LE^eHu+0c c_ #-7AKU_wKwd! !"#$%&')*-01d 97FwAFqA_˷'TA_˷TA>@>@slope.ascaspect.ascfbfm13.asccancov.asccanht.asccbh.asccbd.ascThis is a test LCP file created with FARSITE 4.1.054, using data downloaded from the USGS National Map for LANDFIRE (2008-05-06). Data were reprojected to UTM zone 12 on NAD83 using gdalwarp (GDAL 1.4.2). cccccccccccccccccccccccccccccccccccccccccccccccin7dh-dg7dcccccccccccccccccccccccccccccccccccccccccccccccj7 nA s7 u K tK poK ljAdjhAdgzfcccccccccccccccccccccccccccccccccccccccccv5 Um3 _ g 5UdcS-dc-de_ #db#i- nK r UpKmmK jwK fn7wdA cccccccccccccccccccccccccccccccccc=A BA BA AK >K :K 7K6Kx3 Uo3Kh8K b IKd_Ad_ #dZ #`g- l U m Ul U h U gK dK cccccccccccccccccccccccccccc K%  K)   U%   U  K  , U4K @A CK CK AK=K9K8K5K4 Ux4Kq8 Ug=K ` GK ]DK YXKdY7d]7deK h Uc Ud Ud U c U cccccccccccccccccccccQK NK  V U  d U  U  K!  K1 K0  U$   U  #K 2A 9K EAK EA CK?K;K8A6 U3K4 U 6U z9Uo< Uf?K d@ U \ CK WbK W Ad\7 `K [ U \ U]K ZK cccccccccccccc7K7K 9K 9AK  4AK  &A AdLA  EK  NK  ^ U!  e U%   U-  K% K* K"  U , U 8K ?K  GK DA @AK=K9K 7K 4K 4K 6K 8K ;Ux>Kn? U kAK aBK Z HK TuKdU 7dXA [ U SK S7 P- cccccccc&K + U 0K2K5K7K:K:K ;A ;AK  8K  /K  KdKAd @K  HK  V U!  a U   U% K U "K ) U 5 U  > U  EK  C U  ?K <A 9K 7K 5K 4K 3K 6K :K>K@Ku@K s@A h>K _AK VFAdRj7dQ7dR A L-dK- I-dcccccc+K 'K ( U . U 1 U4 U7K8K<K<K =K >K ;K 5KK OAd =K  CK!  PK%  ] U  UK U)K +K 9K B U  EK  > U  <K 9K 7 U 5K 4K 4K 3U 6A :K=K?U }@K {<A q:K g:K ]8K U;A N HAdL-dN AdJ +AdI:Adcccccc'A &A ,K 1AK 4A7K9K:K<K>K ?KK ?K =K 9K K TAd ;K  > U  JK  Z _  U K% U+K-AK 8K =K  ?K  8 U  6K  5 U 5 U 4K 3K 3K 2K 6K 8K ; K =K =K 9A {7A q5A! h0A _0K U+K OKd[ U T& U P3 U cccccc&7 (K /K 3K 8K 9K;K<K>K@K AK AK @K <K #A ]Ad :Kd : _  BKS U U U'K+K/K 4AK 67  7K  2K  2K  4 U  4 U 3 U 2 U 2U 3K 6K 7K :K! <A <K 9A 7K& {2A% t-K k,K d$K ^U i$ U a/K X@K ccccccc 'AK ,K 0 U 4 U 9 U 9K :K<K?K BK BK AK AK <A  5A -K  <Ad 4K 8 UI Ud UK  %K  ,AK 0K /AK  0A  1AK  0A  2K  5 U  4 U  2K 1 U 1K 3K 6K7K :K ;A ;A 8A 7K$ 1A -K w*K r#K x' U t1K lB U `R U cccccc)A .A 1K 5K 8K 8K :KK =KK@K CK CA DAK DAK >7K  5A  #K ?Ad 1K 1 U@ UZ _K &K .K 1AK -AK  .K  /K  3A  6K  7 U  4K  2K  1K  0K 3K 6K9A <K<A ;K 9K7K 1K .K .K |*K ~7K yGKpVKb` U cccccc+A .A 3AK 5 U 6K 8 U ;K >K AK DK GA JA I7 EAK  =A 7 ?#K  ,7K  , U 4 UI U  U" U-K /A -K .K  /K  5K  9 U  8 U  5 U  0 U  .K  / U 4 U 8K =K! =K! =K < U 9K6 U 4K 4 U 6 U 6K ~7K {R Ur] Ubb Ucccccc%.A 0K 4KK 5K 7K 9K <K ?K DK HA LK NA MAK LA  CA &A K .Ad ( U ) _ 4 U Q _ _& U ,K -K 0K 2K 5K 7K  6K  0K  )K  +K / U 6 U< U@ U > U ?K >K; U: U<K< U? U@ UF U~VKt^Kc`K cccccc.0K '2K (7K 7K 9 U ;AK >A AA KK ORK RK QAK  N7  CK  !A bA  AA  . U ' U- UQ _d _ U (K ,K 1A 3K 0K 1K  0K  )A  %A * U / U :K @ UC UB UCK @K B U D UFKE UGK G UM UXKu\Ke\ U cccccc73KK /5K0:AK '<K >K AK E GKK WK XA XKSK  IA  9K  A  A  YA @K / U- U@ UKK U $ U * U 0 U 1 U ,K , U  ,K  'K  ' U - U 3 U AK GK H U G UGK DK J _ LK MK MA NK NK Q UYK wZK i[K cccccc?5K 78K 6>K .BK %EK JKKNK QK UK `AK _A YK MK ;AK  +Ad A  K  K XK ; U+ U/ U$ UV U U ( U - U . U ) U * U , U +K 0K 6K <K NK RK OK N U L U K U J _ UK U U UK  UK  TK VK ]K ]K z\ U l^ U ccccccG8 U F>K =BK 4HAK *MK !S UXK\KgKfAaA  QK  <AK  *7dK A   U  K  U P U *K  U U U; _$ U, U , U * U - U 1 _ 6 U ;K AK \K  a U a U ]K Z U W _ U _ ^ U ^ U ^ U ]K  ]A  \A dK dK{dKlbK ccccccP<KNAK CGK 8LK .RA $XAK]KcKdA `A  SA  ;A  )7d AdK   U  K  !K   U  U BK  U KK U U/ U- U1 U7 U =K D U K U TK  oK  u U  vK  s U m U f U ` U i U f U dK dK  dA  dK h7 h7K{gAleA ccccccX=ANAK JKK =OK 2TAK %YAK ^A bAKVA NA  =A  )Ad A  K  K  !AK  %K 'K  (K &K! K K  U K  UKKnK UQ UQ U V U \ _ f U vK  ~K  K  U U x U o _ t U m U kK jK  jK  iA h7 jK zhK lgK ccccccbAKUFKPNKASK5V7K 'W7 XA YA IK AA  /A  "K  K  K  K  &K  (K  +K  ,K  -A +K *K ,K 7K K K  U U _ _m U f U g _ m U vK  x U  U  U  U  _ } _ _ z _ u U p U  n U  mK k7 lK yiK leA ccccccjFK\IKUPKEQK9SAK *R7 QA OK BK 7KK (Kd K  K  K  A -7 /A  / U  .K  .K  +K *K  1 U 0 U +K  U  UK  U _ _ s U m U l U p Un U zK K U  U  U U U } U v U s U p U nA mK xh-w lb7w ccccccqH UcKKZOK KNK =NK 0LA %KA HK BK .K %K !K #K  'K  )A  5A 7A 3K .K  , U  - U  0 U  5 U 4 U 2 U 4 _ K K U U _ U q U j _h _k UpK }K K  U  U  U U U } _ w _ r U qK n U whK maK ccccccxIKjLK`M7 SL- CL7K 7JK *IK EK <K (K &K &K *K!  -K)  1A'  =A% ?K 8K .K - U3 U 6 U< U< U< _: U= UH U{ U _ U _ _ _ v _{ _t _p UuK A  K  K  U U _ _  _ v _  s U n U wi U md U ccccccIK yNK gM7 ZL7 ILA >JK /H U &@KK &,Ad"'K)K*K.K% 1K1 =K)  BK%  CA% <A 5K 3 U9 UL _N _L _G UJ UU U{ U U U _ _ _ _ _ U{ U{ U U K  K  K  U  U  U  U  { U  y U ~sK vn U mi U ccccccKK ~PK nO- `N- PMK DJK 6DKK .97K 0)Kd+) U%, U / U2 U6K% =K) EK%  EK% BK AK A UH Up _m _i Ue Uc UiKx _ U U U U  U _ U U _ U U  K  K  A  K  U  U  U  U  U { U tvK lo U ccccccM7 ~PK uP- eP7 WNA IH7 >=7K 62Ad:+U4. U.1K(5 U!7K<KAK! JK  JK"  H U J U WK k UK U _ U U} U _ U U U U  _ _ U _ _ U U K  A  K  U  U  U  U  U  U w U q U jv UccccccRA R- {S7 jRA ]M7w OD7 H8AK ?0K B4K;7K59 U.< U'?K DKHKRK QK  PK UK gK } U K U U U U U U _ U  U  U  U _ U U U U  U  U  U |K K  U  U  U  U }K q U l U f UccccccUA" TA" W7 nSA bKK VA7 P8H5 U H@ UAC U:FK3I U,K U$MKPK]K [K ]A  d U rK  K K U U U U U _ U K  U K  U Uw U K U  U  zA  wK  v U TK a U q U  K ~ K z U v U j Uw f U a UccccccXA X7 X# tR7 hKA ]BAK W=K O> UH@ UETK=X U6\ U.^K'_K_Kq UmK oA  uA  |7w  A  K U _ U _ _  U  U  U  U  U  U _ U UvK  lK  c7w  Z7  TA  P U Z _ c _ m U z { U t K o U d U `KZKcccccccZ- Z-K X- xSA mNK cJAK \IKTL UMdKFhK>lAK6r U-x U&|K7w Uw Kw Aw A K K  U  U  _ _ U _  U  U  U  U  K  K UkK\KUK TKw QK  LK  KK  c U gK k Un _ ys U q}K g z U `  U Z US Ucccccc[# X-K UA {RKK pSAK gTK ^Y UW_KLtAwDxK;{K2~Aw(Kw 77 7 7w K  U  U K  U  U  _w Uw U U  U  U  K  U  U U| Uz _e _^ _\ UW _ W U  \K  { _ { U| U z _ vx U ny U e z U ^xKWzAMKccccccZ- TKw R UwRKsV7 i[7w _cKw VmAw IsAw @wK 7yA -{K !7 A 7 7 7w Kw Kw Kw Kw K  U  U  U U K  U  K  U  U K U _ _ _ _ _ _ | _  y _ _  U  U { U r _ l _ b U ]|KTvKJyKccccccWTKw RKwUKvYK k^Aw _fAw Sm7 GeAw >h7 4j# *kAw oKvAK AK Aw Aw Aw Aw Kw Aw  Aw  K  U K A U  U  qK K  K U U _ _ _ _ _  U  U  _  _  U { U t U m U h U b U Z _Q{KGy UccccccUAw SKwUKXKy[ U l_ U _bKw Rc7 H[Aw ?\7 5`# *fAj UoKwK yKw {Aw AK A  7w  Aw  Kw K K A u7 dK  g U  g _ r U  A  K K U _ U  U  U  U  U  U  U z U s Uw l UK f Uw b U ^ U U U L U BK ccccccSAw TAY U] U{_K naK ``K T]7w K_A A`7w 6gK)nKqKtKwK tAw u7K w-w |Aw  Kw  Uw  Kw K AK A K c U b _q _r U  { U  U K  U  U K  U  U  _  U K v U pK kK d _ _ U Z K X U NKdE~K <zK ccccccTA VK_Kc Uw{fKwngAw `fKw VcAK K_A BtK4sA%r7sAK tAw t7w nAw nAw p7w t7K  yK  K  U A - - K  _ u U _ z U z U } U  U  U K Kd Kd KdK }K zK n Kdi A d uAK _ i7d[c7dWj7dS }AdMcKwdCkKd8nUdcccccccV_cAgKwzk7wmoAK_rKwUtAwEA<A /A #z- u- r7 uAw oAw l7w l7 n-w  p7w  t7 qK ~ U A A U _ _ U  U  U z _ s _  rK  8Kd >Ud PK bKdz wKdv Kdr KdnGUdk 7Udg .7dd-Ad_4K Z @K XYK NdK Dk U 7nAcccccc[A e7 fAiAwo7itKw[|KwPKw<A 2 '- 7 Az7 }7 w Uw sAw o- m7  l7  mA  i U r U UA _ _ _ _ K  ~ U  p U  [ U  EKd+ U3 U= UF U| M Uv T U qUUdr6 _p" _ p # U k . U g< U _JK Xl U Lq U BsK 3tccccccem- lA mAtpAew UwTAwH7K 0#&## #K}7 rKwdtAK rA  oK  k U  hK  bK d UuK7  AK  U U  K  rK ZUd >Kd 0K ( U/ _; _E _K _N _y O U tG _ rj _r _ru _pd _ k c _ af U Vu U IvK =vA 0u#cccccco7m- s7  q7 r r7_!wA L~A >-'|zu snlnW7 `AdgAK  k U  kK  fK WK PUd PKd[AduAK K  KdFK  4Kd "Kd  U U$ U@ _L _U UY U\ _z ] U u_ _ q _ o _ n U l Uh U`y _QzK ExK 8xK -u7 ccccccw- v7 yA  wA m"u7 X"u7 Ey#6{'QA;8 =#D-M#K EK M U VAK _A  cAw _KCA  =K =K  ?K  EK  LAK  OA  $K   U _ _" U1 _V _] Ub Ue Uf _z f U u m U o z U k U g _ f _ b _\ U QzK @|73|7+ x-ccccccy-zA  |7y }7 f"z-S!u?o2d/,#d)'K #) U ,U 3 U 8K ?K FK MK PAK TA  SAK LA  1K  3 _  7 U  9K  9 U  6K  /K   U  _  U ! _ 8 _ J _V _d Uf Uf Ue U { e U t j U n r U h | U c Ua U] _W _ L~ Uw :{.{* xccccccu#y7!wp {^ yMr?\6>;K 8! U 0'K)/K5K :A ?A LA OK NK K7w A7  7A  1K  2 U  8 U  ; U  9 U  3 U ) U U  U # _ 9 _ O _ Z Ua _e _e _e U d U { d U t i _ m v U f z U b U] UY U R~ U G{-5u, t)occccccco-!m7|!o-joXiKVD3@"I U F# U =+U74K(;U@K NA QA PK L7w EA# 9A&  1K$  6K  :K  @ U  C U  ?K  : UD _- _* _> _ S _ \ _a Uh Ug Uf UgU jU {m _ pw _ j z U c ~ U_ UZ _V U Nx U @v2r, p(lcccccc k7  kAz gi^#[K-R/-N-MAW U R(K J1KA: U4CK&JA SK UK RK MK EK ;K#  6A  E _"  KA  PA  Q U Q UO _v U U| _u U q _ n _k _w U p Ul Uk U o U ys _ pw _ g w U a } U] _W UR U K| U ;}A 1x+v(rcccccc mA f{[mFd/7]-\7Zc&U \2 UU< UIFK=NA +RK !YK XA UK QK JA CA  BK  [A  bA  fK j _o Ur Uv U U _ _ U U  U  U  U u U q U p U vq U nt U eo U _ w UZ US _N U F U ccccccccccl-XEv,-qm7l U gU m3Uc?KK[KAKNTK AZK /[K !YK ]A XA UA PAK PA  TA  lA  sK  y U  U U  U  U U U U U U  U  U  U  U xU ~r U tm U ml U ccccccccccccccccfX-A} Uz U r) U t@AK kJK_VA Q^K CaK 1aK#`AK ZA XAK VA WK \K dA r7w  xAK  K  A  K  _  _ U U U U U  U cccccccccccccccccccccccSK>-K #KA U ! U + U }6AK zHA pSAK `[K RaK BcA2aAK#]7 UK VA ZA `K f U lK gmv AK  K  K ccccccccccccccccccccccccccccc2-d(-K K  U #K +K 5K ?A PAtWAKb]KKT`A A_7 4ZA &VA X U[ U aK e7f-fgcccccccccccccccccccccccccccccccccccc -d U " U ) U .K 6K ?K HA YAv_KdbKUaA D^AK 7YKccccccccccccccccccccccccccccccccccccccccccc U$K *K 2A 7A @A KA TKccccccccccccccccccccccccccccccccccccccccccccccccc  U cccccccccccccccccccccccccccccccccccccccccccccccccgdalautotest-3.0.4/gdrivers/data/USRP_PCB4/0000755003401500001440000000000013614004466017733 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/USRP_PCB4/FKUSRP01.QAL0000644003401500001440000000214313614004466021445 0ustar rouaultusers006322L 0600106 3303000019000001033019QSR059052QUV104111COL080215QOI040295ASH070335ASV068405RCI053473 QUALITY_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1600;&UP_TO_DATENESSEDN!DAT1!DAT2!REC!REV!SRC!DAT3!SPA!DAT4!DAT5(A(20),2A(12),2I(3),A,A(12),A,2A(12))2600;&COLOR_CODE_ID*CBD!CCD!CR1!CR2!CR3!FRM!NSR!NSG!NSB(A,I(3),3I(6),A,3I(3))1000;&OTHER_QUALITY_INFORMATIONOQI(A)1600;&HORIZONTAL_ACCURACYAAH!UNIaah!APH!UNIaph(I(5),A(3),I(5),A(3))1600;&VERTICAL_ACCURACYAAV!UNIaav!APV!UNIapv(I(5),A(3),I(5),A(3))2200;&BOUNDING_POLYGON_COORDINATES*LON!LAT(2R(10))00369 D 00061 3303001005000QSR038005QUV111043COL154154QAL1UN  007,20120505024,20120505000000 022,19930501 020,19920101021,19920101 000 000000000 001 255000000 002 000255000 003 00000025500061 D 00039 22030010500ASH1705HOR100080 M00060 M00061 D 00039 22030010500ASV1705VER100020 M00010 Mgdalautotest-3.0.4/gdrivers/data/USRP_PCB4/FKUSRP01.GEN0000644003401500001440000000160613614004466021444 0ustar rouaultusers005812L 0600097 3303000031000001033031DSI035064GEN143099SPR117242BDF040359TIM034399DRF051433 GENERAL_INFORMATION_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&DATA_SET_IDPRT!NAM(A,A(6))1600;&GENERAL_INFORMATIONSTR!LOD!LAD!UNIloa!ZNA!SWO!SWA!NEO!NEA!SCA!PSP!IMR!LSO!PSO!TXT(I(1),2R(6),A(3),I(3),4R(10),I(9),R(5),A(1),2R(10),A)1600;&DATA_SET_PARAMETERSNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(4I(6),4I(3),5I(1),A(12),A(1))2600;&BAND_ID*BID!WS1!WS2(A(5),2I(5))2100;&TILE_INDEX_MAP*TSI(I(11))1100;&DATA_SET_DESCRIPTIONNSH!NSV!NOZ!NOS(4I(2))00268 D 00073 230300105000DSI12005GEN95017SPR55112BDF16167TIM12183GIN1USRPFKUSRP4000005000005 M+17+000000.00+000000.00+000000.00+000000.00000050000100.0Y+000500000+00500000000000000012800012800000000100112812801048FKUSRP01.IMGY BID00000000000000000000100053 D 00039 22030010500DRF0905DSS101010101gdalautotest-3.0.4/gdrivers/data/USRP_PCB4/FKUSRP01.IMG0000644003401500001440000001340113614004466021443 0ustar rouaultusers001592L 0600053 220300027000013327PAD2260SCN2482 RASTER_GEO_DATA_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&PADDINGPAD(A)2500;&PIXEL*PIX(B(8))05730 D 00070 8403001000000050000PAD000038620005SCN000017933867IMG1 //// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0gdalautotest-3.0.4/gdrivers/data/USRP_PCB4/TRANSH01.THF0000644003401500001440000000124513614004466021440 0ustar rouaultusers004062L 0600073 23030003000000133030VDR90063FDR76153QSR59229QUV45288 TRANSMITTAL_HEADER_FILE1600;&RECORD_IDRTY!RID(A(3),I)1600;&TRANSMITTAL_HEADERMSD!VOO!ADR!NOV!NOF!URF!EDN!DAT(A(3),2A,I(1),I(3),A,I(3),A(12))1600;&DATA_SET_DESCRIPTIONNAM!STR!PRT!SWO!SWA!NEO!NEA(A(6),I(1),A,4R(10))1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1000;&UP_TO_DATENESSSRC!DAT!SPA(A,A(12),A)00163 D 00046 22030010500VDR5905FDR5364THF1003  1001FAKE_USRPDS001007,20120505FKUSRP4USRP+000000.00+000000.00+000000.00+000000.0000108 D 00046 22030010500QSR2705QUV3032LCF1UN UNRESTRICTEDUSRP 1.2012,19930501USRP 1.2gdalautotest-3.0.4/gdrivers/data/rgb16_ecwsdk.jp20000644003401500001440000001734713614004466021304 0ustar rouaultusers jP ftypjp2 jp2 J2P1Ijp2hihdr@@colrcdefpxml 629733.1083436137997,4276250.8581256130710 0.0000000000000,-4.0000000000000,0.0000000000000 4.0000000000000,0.0000000000000,0.0000000000000 uuidK=KCզII*(  ?@lx77#AOPA b )#This file was created with the ECW JPEG 2000 SDK build 3.1.0.188 copyright 1998-2005 by ER Mapper. This GeoJP2 header was translated from the following ER Mapper style registration information: fOriginX: 629733.108344 fOriginY: 4275994.858126 fCellIncrementX: 4.000000 fCellIncrementY: -4.000000 fCWRotationDegrees: 0.000000 szProjection: NUTM10 szDatum: WGS84 jp2cOQ/@@@@Rfw\ d ECW JPEG 2000 SDK v3.1.0.188 X1"yZfPPTeP +\2{RXDfAu6.”@F лi~1}P71)/KDuB3H*kK$4$VBmܩt_:?--E _$"`_FWw2^6 M`/KH#Սj?.f:ǵNbNZ@v慰if'/*YC`X#yћ%W}vNwn!tIwk{Cd:|tGpQ>4>Q2F;{&lqpg\SIɆv4,PO@v& ma 5D:bA@2ѥw(v(D?g|V)m'8\'QfQq86YsM uEWqlt>Km4{c 85(bqJǒmUDa"22gJ1i#5[d1)# Ӝ4AS2q17x l컎hY*c .)=ž7HݺrdƝR?G @ 2i7ADEKf|OڱR:zNg#W]u0`mT"Ze/DZfQ5ZL ʮP}@#Z/yUͤF&DO5nLi􏴨De$"]שьoE.GINfnWsJ4`@ӷBX^Ͱ"O^$ #+Gӑa-e~iM n/ =1$:>Gw~VR\=߀z@je* A^"X s)W 2 r89 Kè/S ~dۉkgJܮؚU/7BU4.] ~oHu{U-:X?X7LM[A_P$+agClN5Nw!yY}V#}D`^WؙUT=4ɜߪ2]T|6{G뎪aUݱftmZOW(\NSz_`>bfij[ImG0qscݛ{r BS|_THuN ^g)^|޽9Szf\#of$(OoRkÌ轼%bz+[ꯘ^m5܉t!LkcxY)8SUR]z3ٿT!uP 8ťٳyqY$"OM F:;Cv &@IPl'DuX`O5)/[ ؿY嫮^;˳Ny";q_Ȅ!/nO,6\,)=Fr p 5Vc;ʪ[ Ȏ& K}r8zP[`'t(@:9 B(a(Q^:].3ax,|ͣ9(AhbDEs 3-'­jo XmpyW,W#y ԽnTEy(?fg.Z6?D@p [3C*Ij"Ѓ ԗ͞ldNzi;gN}bFQMZup#U=p|{̟U3rEP{Ȓzd%담S Ŗ?]DUA@I[ \.T/=UO-<3Ρ0b?k02YhpCۿ6x,am:G?~+(=(sʔFݏyu]P^V{P[S5M ᬉ|>-IR1#Ohtr @~ll S]:,s6rMxXm]5nC*PlMI(giĥ\_HHV.z2}Fr7=MYs\઴WjsH6%In@#!"lhJ{}0'ܚ^.$/^pݐgOlC=>‰[k*^u so$wy` uP8B$|eL\]LXMzoȺ5s,x$Z`419v={S;rE S*8 i3^&=j5l#>{_÷Qk`%j- w!5<(HjJv䫶SN(s((@*oT> ۢ ͺuJלf S "Fśd^_/k5t:$S7tJ[\dTƜۂ(,JQ#XP $ifمʰfaUCvQ · 5-NqBt?lKlm*U:ߵcEt`K5_S85n!VE}q+Ze.uAL9LmJ83)M,+ X>4 O~Ќ199'1#F(Kq9m=͑U4i!/œH,NbK\W4b:qC#&HK,d[>(~-ZmtКXN&>1] R *f_z>wňMUQvW}VP&S>&DPsᲗ4n︻G)tYA<ɸkl:"W}C8T" aqF#)2$?TYMG*1c[ 4K5խ[@4X j _A ΅:O'u3  's.qF,WlzkZ;Qzon/cK|`*atxʴE!ŽVq;rYs=;QVOMbMqSt%$jчOXy7ۂUD[_)GnB;:O9U70~US俎N5( :'wLB4n0HO pMgPPl{,ddp'TWhb||r#CckP5TvN*h) -am& ̮@vFA!2=L&& ](Зdff!*T))zX"#o]}uC=# `Z3Hɔ9=Mʩ3apV- `ӵzrʭ>'Eqda9o`ٓӬ H$0ac+8@Q5"T炒0g,+95቟0᠇v5s?TE@ḅ7dyb}@S֦69eWFj2r' EJn\),L&fjoьRrmݭz% >?,u.S91(޸XR xDk >[AK\0D|y]'Jc%No)~̢"0M|n5~*TuFb ['-#2m_+7\t.L`[Rl*Vtt*D;˿5["\pptEY@+HsZ"b})sЌ?TL"J-%'qY~ =?H4LߐEcd5㵌 Z/r5"pg:5` / EY.6cPDG"!rp/OJ@8KH2wOꑗBs '!#.L_I]~{0C-dm9CamH=8WM$-V48SwKѓ21|_&cA6@L(q:sB}(j` <8';VekY篡N="QHׅ 'sR<H㴚OPnL$ԿM_ΑLǃ 8KyKd+ nIqd$5U% hIzǶ0o- 8x>:zϡI,e|~ixˇJIt-gdalautotest-3.0.4/gdrivers/data/test_ogr_nc3.nc0000644003401500001440000001422413614004466021310 0ustar rouaultusersCDF recordstring3chars_max_widthtwodimstringchar_max_width  ConventionsCF-1.6GDAL"GDAL 2.1.0dev, released 2015/99/99history5Tue Feb 09 20:48:39 2016: GDAL Create( test.nc, ... )ogr_layer_nametest featureTypepoint x  standard_nameprojection_x_coordinate long_namex coordinate of projectionunitsmy  standard_nameprojection_y_coordinate long_namey coordinate of projectionunitsmz  long_name z coordinate standard_nameheightaxisZunitsm transverse_mercator grid_mapping_nametransverse_mercatorlongitude_of_central_meridian@ false_eastingAfalse_northinglatitude_of_projection_origin scale_factor_at_central_meridian?#x long_nameCRS definitionlongitude_of_prime_meridiansemi_major_axisAXT@inverse_flattening@rtm 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"]]int32  long_name Field int32ogr_field_nameint32ogr_field_typeInteger grid_mappingtransverse_mercator coordinatesx y zint32_explicit_fillValue  _FillValue{float64  long_name Field float64ogr_field_namefloat64ogr_field_typeReal grid_mappingtransverse_mercator coordinatesx y zfloat64_explicit_fillValue  _FillValue@^$ string1char  long_nameField string1charogr_field_name string1charogr_field_typeStringogr_field_width grid_mappingtransverse_mercator coordinatesx y z, string3chars  long_nameField string3charsogr_field_name string3charsogr_field_typeStringogr_field_width grid_mappingtransverse_mercator coordinatesx y z0twodimstringchar  long_nameField twodimstringcharogr_field_nametwodimstringcharogr_field_typeStringogr_field_width grid_mappingtransverse_mercator coordinatesx y z4date unitsseconds since 1970-1-1 0:0:0 long_name Field dateogr_field_namedateogr_field_typeDate grid_mappingtransverse_mercator coordinatesx y z8datetime_explicit_fillValue unitsseconds since 1970-1-1 0:0:0 _FillValue@^@datetime unitsseconds since 1970-1-1 0:0:0 long_nameField datetimeogr_field_namedatetimeogr_field_typeDateTime grid_mappingtransverse_mercator coordinatesx y zHint64var  long_nameField int64varogr_field_nameint64varogr_field_type Integer64 grid_mappingtransverse_mercator coordinatesx y zPint64var_explicit_fillValue  _FillValue@^ogr_field_type Integer64Xboolean  long_name Field booleanogr_field_namebooleanogr_field_typeInteger(Boolean)ogr_field_width grid_mappingtransverse_mercator coordinatesx y z`boolean_explicit_fillValue ogr_field_typeInteger(Boolean) _FillValue{dfloat32  long_name Field float32ogr_field_namefloat32ogr_field_type Real(Float32) grid_mappingtransverse_mercator coordinatesx y zhfloat32_explicit_fillValue  _FillValueBlint16  long_name Field int16ogr_field_nameint16ogr_field_typeInteger(Int16) grid_mappingtransverse_mercator coordinatesx y zpint16_explicit_fillValue  _FillValue{tx1  long_nameField xogr_field_namexogr_field_typeReal grid_mappingtransverse_mercator coordinatesx y zx byte_field  long_nameField byte_fieldogr_field_name byte_field grid_mappingtransverse_mercator coordinatesx y z?@@?B+?B+xSTRSTR@Aխz2~Aխz2~BqLBqL{{{??{ {@?@G{G@^G@^GG@^{{{{|B{{GGGG{G@^G@^GG@^{{{{|B{{Ggdalautotest-3.0.4/gdrivers/data/small_world_400pct_1band.vrt0000644003401500001440000000213113614004466023602 0ustar rouaultusers 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, 2.2500000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -2.2500000000000001e-01 Area BAND Red small_world.tif 1 gdalautotest-3.0.4/gdrivers/data/cf_geog.nc0000644003401500001440000000423413614004466020310 0ustar rouaultusersCDF 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.0.4/gdrivers/data/test_wms.txt0000644003401500001440000000117413614004466021003 0ustar rouaultusers 1.1.1 http://onearth.jpl.nasa.gov/wms.cgi? EPSG:4326 image/jpeg modis,global_mosaic -180.0 90.0 180.0 -90.0 2666666 1333333 EPSG:4326 3 gdalautotest-3.0.4/gdrivers/data/pixel_per_line_comma.asc0000644003401500001440000000562313614004466023242 0ustar rouaultusersncols 15 nrows 12 xllcorner 0,100000E+06 yllcorner 0,650000E+06 cellsize ,500E+02 nodata_value -99999 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,270E+01 ,186E+01 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,614E+01 ,931E+01 ,868E+01 ,200E+02 ,266E+02 ,122E+02 ,313E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,162E+02 ,542E+02 ,944E+02 ,953E+02 ,977E+02 ,833E+02 ,505E+02 ,144E+02 ,209E+01 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,199E+01 ,170E+02 ,784E+02 ,173E+03 ,266E+03 ,332E+03 ,264E+03 ,230E+03 ,120E+03 ,415E+02 ,941E+01 ,801E+00 ,240E+02 ,000E+00 ,410E+01 ,177E+02 ,116E+03 ,303E+03 ,562E+03 ,756E+03 ,759E+03 ,618E+03 ,309E+03 ,171E+03 ,603E+02 ,792E+02 ,254E+03 ,242E+03 ,483E+00 ,678E+01 ,529E+02 ,212E+03 ,585E+03 ,108E+04 ,140E+04 ,128E+04 ,817E+03 ,436E+03 ,219E+03 ,275E+03 ,890E+03 ,145E+04 ,158E+04 ,000E+00 ,307E+01 ,162E+02 ,141E+03 ,435E+03 ,862E+03 ,109E+04 ,889E+03 ,559E+03 ,289E+03 ,296E+03 ,116E+04 ,245E+04 ,332E+04 ,309E+04 ,000E+00 ,000E+00 ,516E+01 ,296E+02 ,128E+03 ,245E+03 ,305E+03 ,223E+03 ,119E+03 ,472E+02 ,517E+03 ,173E+04 ,289E+04 ,345E+04 ,309E+04 ,000E+00 ,000E+00 ,000E+00 ,266E+01 ,107E+02 ,192E+02 ,146E+02 ,182E+02 ,805E+01 ,378E+02 ,442E+03 ,165E+04 ,274E+04 ,280E+04 ,214E+04 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,528E+00 ,000E+00 ,495E+00 ,000E+00 ,706E+01 ,225E+03 ,123E+04 ,210E+04 ,189E+04 ,105E+04 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,844E+02 ,405E+03 ,752E+03 ,430E+03 ,244E+03 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,000E+00 ,577E+02 ,350E+02 ,196E+02 ,503E+01 gdalautotest-3.0.4/gdrivers/data/s4103.xlb0000644003401500001440000022516413614004466017665 0ustar rouaultusersf@4OKI ?KN1?KN14,~'G#3 b0h'0@f.wS-e-.$w-81O09.*/6G0 Q241 *Ġ-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 @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!@ DIMAP VOLUME SINGLE_VOLUME en PHR Volume Description DATASET_ID DIMAP gdalautotest-3.0.4/gdrivers/data/dimap2/IMG_foo_R1C1.TIF0000644003401500001440000000370213614004466022121 0ustar rouaultusersII*@RS   &fN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kkkk{{{{sssskkkkkkkkkkkk{{{{sssssssskkkk{{{{sssssssskkkk{{{{{{{{cccc{{{{ccccssss{{{{sssskkkkssss{{{{kkkksssssssskkkksssskkkk{{{{{{{{ssss{{{{ssss{{{{ssss{{{{kkkksssskkkkssssssssssssssssssss{{{{{{{{{{{{kkkkkkkk{{{{ssss{{{{kkkksssscccc{{{{sssskkkkŭcccc{{{{sssscccc{{{{{{{{ssss{{{{ssss{{{{{{{{kkkksssssssskkkksssscccc{{{{cccccccckkkk{{{{ssssssss{{{{ssss{{{{{{{{ccccsssscccc{{{{sssssssskkkkccccccccssss{{{{kkkkkkkksssskkkkssss{{{{{{{{kkkk{{{{{{{{cccc{{{{kkkkccccssss{{{{{{{{kkkk{{{{{{{{{{{{kkkk{{{{{{{{{{{{kkkk{{{{{{{{ssssssssZZZZkkkkkkkkkkkkkkkkkkkkcccc{{{{sssscccc{{{{{{{{kkkk{{{{cccckkkkkkkksssssssskkkkcccckkkkkkkk{{{{ccccccccssssccccccccssss{{{{cccc{{{{kkkkZZZZkkkksssskkkkZZZZcccc{{{{ssssssssssss{{{{{{{{sssscccc{{{{kkkkkkkkkkkkssssccccsssscccccccckkkkssssssssZZZZ{{{{ssssssssZZZZccccssssZZZZcccccccckkkkcccccccckkkk{{{{ccccssss{{{{JJJJsssscccc{{{{cccc΄kkkk{{{{{{{{kkkk{{{{kkkk{{{{sssskkkkkkkkkkkkkkkkkkkksssscccckkkkgdalautotest-3.0.4/gdrivers/data/dimap2/STRIP_foo_DIM.XML0000644003401500001440000000213613614004466022367 0ustar rouaultusers DIMAP PHR_SENSOR STRIP en IERS TAI NADIR_LAT NADIR_LON ACQUISITION_ORBIT_NUMBER DESCENDING true gdalautotest-3.0.4/gdrivers/data/dimap2/IMG_foo_R2C1.TIF0000644003401500001440000000224213614004466022120 0ustar rouaultusersII*   RS   &fN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|kkkk{{{{sssskkkkkkkkkkkk{{{{sssssssskkkk{{{{sssssssskkkk{{{{{{{{cccc{{{{ccccssss{{{{sssskkkkssss{{{{kkkksssssssskkkksssskkkk{{{{{{{{ssss{{{{ssss{{{{ssss{{{{kkkksssskkkkssssssssssssssssssss{{{{{{{{{{{{kkkkkkkk{{{{ssss{{{{kkkksssscccc{{{{sssskkkkŭcccc{{{{sssscccc{{{{{{{{ssss{{{{ssss{{{{{{{{kkkksssssssskkkksssscccc{{{{cccccccckkkk{{{{ssssssss{{{{ssss{{{{{{{{ccccsssscccc{{{{sssssssskkkkccccccccssss{{{{kkkkkkkksssskkkkssss{{{{{{{{kkkk{{{{gdalautotest-3.0.4/gdrivers/data/dimap2/RPC_foo.XML0000644003401500001440000001456213614004466021427 0ustar rouaultusers DIMAP PHR_SENSOR RPC en NITF RPC00B 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 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_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 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 ERR_BIAS_X ERR_BIAS_Y FIRST_LON FIRST_LAT LAST_LON LAST_LAT LONG_SCALE LONG_OFF LAT_SCALE LAT_OFF HEIGHT_SCALE HEIGHT_OFF SAMP_SCALE 5 LINE_SCALE 10 gdalautotest-3.0.4/gdrivers/data/dimap2/DIM_foo.XML0000644003401500001440000003501513614004466021410 0ustar rouaultusers DIMAP PHR_SENSOR PRODUCT en 1 Strip Source Lineage Information DIMAP RPC Model Geoposition Model DIMAP PRODUCER_NAME PRODUCER_CONTACT PRODUCER_ADDRESS PRODUCTION_DATE JOB_ID PRODUCT_CODE DELIVERY_TYPE CUSTOMER_REFERENCE INTERNAL_REFERENCE COMMERCIAL_REFERENCE COMMERCIAL_ITEM EPSG GEOGRAPHIC2D WGS84 urn:ogc:def:crs:EPSG::4326 ITU UTC SENSOR CENTER POINT 1 RPC Model Geoposition Model DIMAP SOFTWARE PROCESSING_CENTER SENSOR PMS SENSOR CORRECTED ACCURATE true R3D_ORTHO true REFERENCE3D BASIC false true false false true false 0.5 0.5 SPLINE true false BAND_COMPOSITE image/tiff true 30 20 4 2 0 0 INTEGER 12 UNSIGNED LOSSLESS B2 B1 B0 B3 NODATA 0 SATURATED 4095 12 12 B0 CALIBRATION_DATE Spectral range value of raw radiometric Band micrometers Specification accuracy value MIN MAX B1 CALIBRATION_DATE Spectral range value of raw radiometric Band micrometers Specification accuracy value MIN MAX B2 CALIBRATION_DATE Spectral range value of raw radiometric Band micrometers Specification accuracy value MIN MAX B3 CALIBRATION_DATE Spectral range value of raw radiometric Band micrometers Specification accuracy value MIN MAX B0 CALIBRATION_DATE Raw radiometric count (DN) to TOA Radiance (L). Formulae L=DN/GAIN+BIAS watt/m2/steradians/micrometers Specification accuracy value GAIN BIAS B1 CALIBRATION_DATE Raw radiometric count (DN) to TOA Radiance (L). Formulae L=DN/GAIN+BIAS watt/m2/steradians/micrometers Specification accuracy value GAIN BIAS B2 CALIBRATION_DATE Raw radiometric count (DN) to TOA Radiance (L). Formulae L=DN/GAIN+BIAS watt/m2/steradians/micrometers Specification accuracy value GAIN BIAS B3 CALIBRATION_DATE Raw radiometric count (DN) to TOA Radiance (L). Formulae L=DN/GAIN+BIAS watt/m2/steradians/micrometers Specification accuracy value GAIN BIAS B0 CALIBRATION_DATE Solar irradiance value of raw radiometric Band watt/m2/micron Specification VALUE B1 CALIBRATION_DATE Solar irradiance value of raw radiometric Band watt/m2/micron Specification VALUE B2 CALIBRATION_DATE Solar irradiance value of raw radiometric Band watt/m2/micron Specification VALUE B3 CALIBRATION_DATE Solar irradiance value of raw radiometric Band watt/m2/micron Specification VALUE PHR Cloud_Cotation (CLD) AUTOMATIC Cloud_Cotation Mask GML MASK ENCAPSULATED SOURCE_ID Strip_Source PHR1A Data Strip PHR 1A PHR 1A 2016-06-17 12:34:56 PX Strip Source Lineage Information DIMAP gdalautotest-3.0.4/gdrivers/data/U_0006A.NTF0000644003401500001440000002500713614004466017721 0ustar rouaultusersNITF02.0001 JR6_4 07171219ZAUG91This NITF message contains 1 text. U 999998This message will not need a downgrade. 00001000010JITC (602) 538-5458 0000000107590004370000000000010322100000000000000000000TE000000000127235536ZNOV89This is the title of unclassified text file #1 in NITF message JR6_4. U 999998This text will never need downgrading. 0STA00000ASCII Characters: Space (20 HEX) thru ~ (7E Hex) - 9999 characters !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ############################################################################### $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ******************************************************************************* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ------------------------------------------------------------------------------- ............................................................................... /////////////////////////////////////////////////////////////////////////////// 0000000000000000000000000000000000000000000000000000000000000000000000000000000 1111111111111111111111111111111111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222222222222222222222222222222222 3333333333333333333333333333333333333333333333333333333333333333333333333333333 4444444444444444444444444444444444444444444444444444444444444444444444444444444 5555555555555555555555555555555555555555555555555555555555555555555555555555555 6666666666666666666666666666666666666666666666666666666666666666666666666666666 7777777777777777777777777777777777777777777777777777777777777777777777777777777 8888888888888888888888888888888888888888888888888888888888888888888888888888888 9999999999999999999999999999999999999999999999999999999999999999999999999999999 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< =============================================================================== >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ??????????????????????????????????????????????????????????????????????????????? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _______________________________________________________________________________ ``````````````````````````````````````````````````````````````````````````````` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV. gdalautotest-3.0.4/gdrivers/data/srid.nc0000644003401500001440000000343013614004466017655 0ustar rouaultusersCDF 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.0.4/gdrivers/data/byte_rraster_ct_rgba.gri0000644003401500001440000000062013614004466023261 0ustar rouaultusersk{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.0.4/gdrivers/data/gtsmall_11_int16.jp20000644003401500001440000005344613614004466022010 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrdcolr%asoclbl gml.data asoclbl gml.root-instancexml withheld 0 0 499 99 x y 39.9958333333333 -99.9958333333333 0 0.00833333333333 -0.00833333333333 0 gmljp2://codestream/0 Record Interleaved |uuidK=KCզII*   4 #  mtr@@TXAWGS 84| ? ?YD@jp2cOQ)ddR IYiy\#"궼LLdEҗҗadKakadu-v6.0dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -57.2, 8.5e+02 -58.0, 1.0e+03 -58.9, 1.3e+03 -59.7, 1.7e+03 -60.2, 2.2e+03 -60.9, 2.9e+03 -61.8, 3.9e+03 -62.2, 5.3e+03 -62.7, 7.4e+03 -63.8, 1.0e+04 -64.3, 1.4e+04 -69.2, 2.0e+04 LXa>   U 5(:3SNNUGo8n{f08w{sA#mԂ|6 _C"=Tم?Fĺc *oFkK D [2c"HlJpZ? rf: pnoxl4wI x 9.в'BLVϦˉH]0T˾1 {l1J-- wlՌYT3K/JAv- *X=V *ڿGLI-R)gR#=FC[uzԿʩ%}XqF?=CWm&w}j*1Q3 Pq vVuj1+8oS봙 K:84Lp6(hDDZq8NpfNtP11 ^)G$Wa!oa =Dpb lnrO\V<2 E?H-nƀ ~ z&{{VJw8^VE_+4{+JeP/^)@%VQ(ByO(w^2)|wh4AFTZ(簃 p\sV]ѮKr>:$FT:r)>oj)—/zGoC:-5nr{&^媭dWSN*EA&H@#1({ok13!'w岲7mY\,vMa!+z݇bZjF z0#a oЎh&)L[|ʁP#3RN@EOϸ;-M[$.z.|M>eOAvpl|/kd&;2ld3:#xDf@+H%xKEq T۝|!@J4q|h+KQ19:-VIy[R`\3{|hLJcI(]>s+(4x A8ڂE&PNⅵ&6q|f~JZ*?vѝ)[pg+VLVJU(7{zλך^kҧxDVЎԺ׸n&м<x6a3Hl+|[=bWFkz[l,3@n-% Ew'2*Bȁ^x hwLdvT?U/AzQQHSnA)c|P*/]y~;MGiyѻl)?A4 tkgwlyJ-#tZKz[X䙽w I)(1 7S;Ov724{/>R͸NPۆ+3 )UzlkgiBfu.V"ѱ}}ǰ`DmU(XkMZ܁_km#dױ Gӽ=buC@;-#gB  {HwRpmv::&t&M8@L4{fJb҆_f{~.])_ht4)4y%ʜ i aSW== 7%wnagc΀XF`/MȎoC|}#"){5șO!矴d2Ы%t0c}- R|Ԇ~@,D E*b*]||t! ͖T*#=.s# Z(^?D YgJ.a4Ȅ]^}d?Ck4w+ks$۰$: ]S$ \EXib?!(FL8TtACtaB 8Vj_yrDfƴݝš֩SxYh(˟gTbNs9l LѹVѰEƽID}xUsۤecwX\|%f(/MA:Q[E}hnϧPuХte:}뀻#iKᵗ0&,d)IE_>"'-Lg^ZrlǨCe no4%&2:{$rϴla*Fu4 Eta<%*>oK>Ҧ;'ԸC%FߠBAmյYmSg8ůB1t/B1WCGٜ-qC,3²'7!.[ Cz5~76,Jr\ zDD0GfpM,oy@ qCO*jT®l#j0n|9}c0!5*#J0p:O9dmW M1ضZ]e}յ>*S_Χ29ptJJ LBPvz#6ŠlPIj(LЇ fVt tΰ9RE˱cb%RiJ:rZՋVCK:gI㴬+r[:Cp0ᆏ$W\ɵwE^~UE-勞5Liו6FA8qޔ\]<->{!ZVݾ WPqelWco>=Kl{Ԭs؏Nyо`MQxդRaj<5͍v(Jt,|޽rmEI^ ]A{Cg h0X-`3t8 ) S4xD5tQ7%T&2y姈kV`c.da+MC$EQ,~ZX2|f/X!v@gH_QƷh-BtXnMVw:٧wl9<Ҿ5 ^|h"C7l:ٰby tB#;ji%hϦ{eLc%o|?r.k+9+mP] y~xD1?,>Z ¯\ZҐٛK7Р%#M11f{Gӧ_՝`M#2ܢ$Ф:5j( 0Hڅ`Q_2)Y"lPWzS]:?d)T6x9$deUicnar 2~8æc$*\G66 @9/*;/[+,3iy82u7A8Z"_lƥĔi 'Nuz-!6cdN!9B Ͷ,&x#CoSR:忲;s^Nd31J| pfc̐1ՒrMO^(#ڞ4>d)jtiD{ F.s%-ԬjmDZeAYd=;O/I;r{oR K1zi>@~|< ޝj/*c6[j [5#~mѣcdLKQm>͘Y*o2Kecp'd7 BlJ0~J]-D zpoff_ Cj?#^URbQr,W[礥ochjHexiz1>=~?.=v=_>[u3y ϫdF59Z!Jυ'S /{{5]I{9}t>uu T(̮mK!|S(_MJ@ ꘔ}iظ.8\=u! ]VVY{d϶=+>QsQekrY')f[3/XY}z A3xX\t̵֔0\$sm5U^0Dy2)ĊZ*XX>hP JLybVf.LH=9T m[ucmUnՏB;n_ YW3U1w 2L{T[?,А76$:y`?P`Z$ y^ti앾xjF,1/duҒl%uWr}#m"%=+DLIL2Ė ͊c25N ɻYSJ`7P.'X'%P{T)bAEl5othJy!&\)f׺1U9Q퓹 YǪ) emUl/pT 0"+L?S2+ξ( `Xh}Ts֓҃C$֜;Z'i?Ir`J6^"YL!}7mX);|NΏIA+ 4~m+R%g {5OW+pэ&P-h܇_L NpӖ_Wts2@],!dY:!#3È:w۠;nfϧY aoqQ >җE#1qY]ozHTT^n9i =g.M"SuHsH9;*fwJ V ޛh6] 0DūAZDt|%ܸ4ʰL*ZAqU  n=ڧNe}#E:gF-yqkl.w&q^#007\Rh2,Xɷ/eH!S¬Yѥ&B"nEpu(sb=W"vGZ#컏!~V2BjclaSpx;,pZ.t5_q`Tqf 7 DEs>1 qDtj3ƪc9\pt OyUIfÆs'"-Vo.FU_ ϖհ{cCFDz3vj bRcpPC.8LuL}"2ah`@$9웑6y7q>-2GM<ߴO$~EEKd, h]u%g!9?⮸(<y NF@.M?%RXΕ;nj*@͔PX`yWҋt Ғ3G\3NdyYaC$ZLIQT~BܛE45xz~z[l*֢o.zEc^ Aed% ڞ(|T3E~z6M!> Iڃ՜5:E |,]do1J'vK$ 'cCg<,'=E_Jq]' z5Eΰ?9/h:L^0!j31-_p*tV򽭟oKK񍿉H_dM :4Sbiy8 w,mF(%|Ť 2ҀxR>0y<6K0TO |*˘PvNG=u O @:nJ M2KaWMvjzCζLJ&sP#0 TVuմ <@[Lj3 .dzyA KSt6=+XM[ʛBO>[PX9Br"5bv 7\> /6^z%Ovo% 8$_8"@bPU&r JgP1OeT}qU%Z`[|v&8^3C&}6^H@r2U]K'qax]?Qd^R!}J)҅&:p<06x/q#w>g0Sy0t`((g\ѳO(e>"2ڡ'oiHG`4I\y?![♹x.]ѣm%롹}BVFxvPtTvX^:漛Ą@i8)BBꌺ'+icpiÆ5ܨk4G;4!R9ykGdOC˰@)Zɮm52Ȫ֣lt|UjdNZ] bٺHMRϐAK-@ֺrоN)"PTpj)C!?n/%hޠe.h7Y_ Y;KhD:{>/B"E?Zنp "xRL=a vpCl T?DQFHQ\L}G%-^a&{OUe /M\^73E^K' (rcj܉VeuS,{B\ ؂QRseP\|H9 Y6O27.òZ ȯSp[ Lٳ턈ݜfg"C%ACC͵i32 cInZ-zxGuc` 6TNk@YڴyKE'jWI:51kqUF~9Upq/PpFN-&&{d}$imDa-Z8"L$A/od{b)1q$ Z$.ΚWȪQ7"ٝkX".Ѩ5Q=Sȩ*KQai7Yg̗C^s sw׍Eݴ7:7sS5?wyݸHⒾ >s s!ߊçXuSآΈðxU=h;Ôy5X LS@VEx'/t_7k~)2QWSUcoZ 7s:(l]%E2+,Jjn ԖWni=tn`ثD"Xs)eʔ&hu72i؋AR @A|# _H,#m;Z^y<Krme ?g5<FP#],+<5w,T\fh$o4Wh;xؾpWI,jdicS 2+yJ쁘uN8Kw)*î\^<jdaWr>l@uF( odX R)ɽ(?=Ip>*i?.H%\e1//~k< V8h+̓ұǢ-o0\yc4ƶjy-8)BmTj_h|>G)?%)%o?|Xxkd΂R4c?斖\!ol3ci2 T+:jC#bıX r68\`yr<,x/&8""-nYĊ[n`tDY$k :+mɴBVr_*SLjߣ[K*ȼEa穗&Q=8AX`N [r zW ;9})x̪eTȌ q|q# XiE0f",| $Vh0YGl!2pB}j|Ÿ́?=]/u$\h3JTH5Ω{w [ `]Y+^c^ _nHF*C28} #*wWZn: !uk=4LCȌt: D;(,`Gs層V;G̃C+o7LhlzEֱ".U`ڵ>*AhVS^Y`jggH1SQ-B_ ̭4vdF#A kݏ&=mmS/k H]Z +|-.bZٟ[PX/;,gPz]5{ `@[qy*S%Ƣv©P݄hH@=Aۄ6DaxE"UVصvHf遫xN8B{C&ؗ[or:4n%|Nlk#@cꝋX@^ϽT'IEsaPWM9T@`mn`'4 "ک_ 6ad %5:mv{Sk1ǐ>R=y_F#WF>=>a%> "Cqanz  F=gqڣ Fx94-ai?{K`nF~2GEnQIt!|ԠeP:ռ'!8T]oVqs;C6CxGdUirs5glZ腽9:H >opeη50?S$/` d@K,-M l Dlͮm&QoV3* 3f_vi?B^0z$HcX++G 8ւfjRM/s,Tv%`iTF/ɚcךg?UxIJZ1eP6T 9zWdsoPa/ 1y`TV-34LZ+Gy5⅛ʢ\gn$bx uHg^H䃫R+DGJOx6,9sI@J"Tnؕ#jj3s#+7]uah5˿=rL0(ZA'h үt诗/w 08.t;YC\LHB=gFŏ8|ޣ/\]yv:T('kTJ>&ۨx"_Бf}u}[E'5#MϽ_i<&f^kΦv]\)Dt- ۆnIUNet=.ֹ);Pȗzsu.v+ c ߨ}E֍s'۠T 'J\orQej'boa}fl%gWs"@#f-%'gxe/~==֋cSBY.8by=mJKN`ߥ&|V ղ]aejYlUY)ڮ9ejfPu  ȃALO\CIIAkO uo).=%iPx|8dhy2/r*No__3;?Ζ^bT<1Ra>^lErVZҝc$k~]ꕛBE까D ٽ?e%a 8~R }jYGԷ) :jM ^ KزlJb0u31ZR2oTqފ6G]‚/5FPeދ ]z:C&YPmpB^vƝ; [)T)7XO,sL9_ru<.% ëެ]TcZow A2W)=& |sbQȩ^”ݝÌo6I$hML>~4kYݵTsٻe_7*+M1YNa B Dls>7Ō'Tʛcq:~a'kLXׂKMGX64;1cG}+Zǭ$Lo2|'XE+J쾵Ϻ'}2;g X]ؔ1I "6|trkӣ bX6N="MK,+у`[}G 8Oւzڋ$Mޤ<^Op''[,c wЙa{g~ j2T!fq Wi[5myXzGQ3l #G=ܖ#y7/w XM /lIsNY t#Z!^F3C.x)~ ͷI5Z_͇Z0.I\ ֯LL0~ 3M #)YJ! 2uG*ކ,!y!H jqWfSiRb΅$Lv[ȂwEKAgXv8=I' փcgR'xgWkEquD,j k_~2) vs j4Fܰd 28:u G]$mR4 eΟN\x>//%ip+njʫR`L@$왱t\TxU?̞+C9/@v,^JjgtI1ݚcd,m0s_o&c~7}w9 4QSpRg@yL<Є(|A,z_6엀P8D7L_ c/KfakhpO<1Wғrc!֍{uL̔htK+:sv'v0a=s5n ~ ɹt[)i,Ww'Ya$w"x\w>MK w/ˠΰmÌ0/o8 ne]PQJSoh6l1d~:;!+:mo&&-S+vNFH2a7j' T6A!ƙe"4[V2Yq=&iGIy'4Ǭפ;NKɄZdJluMe۷`0ǡl#L <Dc&ޤѓz)uב"VbPd @¹NPw\ﰼ\ٷ`\Ju܀}zn>2R)H9a&bG a6a@N<fq77{t(`,Yȁ^3Y xT[hїS6\H%cwcxvW=J?`<2ww[҈} $ށ br &(8z|V!L| k "%SUz̏ Xbd)PP1TȆ Ag$ƕEZN^MQzݴ8^lu/pBv/ !ppHN{@͈ĭ12u1 FXnj$SBh{>WDd+Wc#W0m/_T^ۘ̔UG}/&3[deCZ8F2̈́QՀE-LE (TluN⛝R?k]YM[D8QeE *젮n w Kr&lށ`V넖}WUQʮ`X slpg@C [A?۬xNTyF3S6o [" E@fɪoz;i@H0ruMvK#ASaRPLmPo,b:c ZUi"\ǪoHg9r]I\S[n[*BG{d'/1|`nc.QE_ wbW1GanC1vzŶ,2 -o{]ܴf `-S-btn'ߥjt;EY,zŊn21]Y/63M lo| |hs00f>3`"/h;tun=<%5Y se.i$hg7 CP~* Y>"J(B6lJKj]H!<~HYgdalautotest-3.0.4/gdrivers/data/nodata_int.asc0000644003401500001440000000050613614004466021203 0ustar rouaultusersncols 5 nrows 5 xllcorner 440720.000000000000 yllcorner 3750120.000000000000 cellsize 60.000000000000 nodata_value -99999 107 123 132 115 132 115 132 107 123 148 115 132 140 132 123 148 132 123 123 115 132 156 132 140 132 gdalautotest-3.0.4/gdrivers/data/profile.nc0000644003401500001440000000327013614004466020356 0ustar rouaultusersCDF profilerecordstation_max_width foo_max_width  ConventionsCF-1.6GDAL"GDAL 2.1.0dev, released 2015/99/99history8Tue Feb 16 20:52:20 2016: GDAL Create( profile.nc, ... )ogr_layer_nameprofile featureTypeprofile profile cf_role profile_id parentIndex  long_nameindex of profileinstance_dimensionprofileHlon  standard_name longitude long_name longitudeunits degrees_eastlat  standard_namelatitude long_namelatitudeunits degrees_north$z  long_name z coordinate standard_nameheightaxisZunitsmLid  long_nameField idogr_field_nameidogr_field_typeInteger coordinates lon lat zTstation  long_name Field stationogr_field_namestationogr_field_typeStringogr_field_width4foo  long_name Field fooogr_field_namefooogr_field_typeStringogr_field_width coordinates lon lat z X@@@H@IPalo AltoSanta Fe@Ybar@Ibaz@ibaw@Ybaz2gdalautotest-3.0.4/gdrivers/data/test.png0000644003401500001440000002103413614004466020057 0ustar rouaultusersPNG  IHDRa0PLTE̙fffd333rtRNSPC IDATx]& TЍa{fQ%<6Hn7tرcǎ;vرcǎ;vرcǎ;vرcǎ;vر|);̎/#2;Β2#cvx)zU2Mqvّev&28AģKQ==\U=iż("oIyi Q3 |:=|_w)=.˳$0A~E )z?C:(&±RYh(.nz(xfIAM./w՚w$ss7_dP~ nA~D o@"b.S#a5z̀rr,>W 2uFYMpJ QA/&tmn 2@onߟ{l"AF[M~{2 M.SZ5 `DAk^bCA@PoZ|L$#!CHՉ\&n3QY|k Ac8 bZAla>i' .0} h=rNWF s5 n wC`mh7ٶ y"#>Sq;]!SB ? lA~ ’o,uA d 09m$˸7{q?$kߘ ȑVXcBqyd9m^ZX6bCMRa)PvqKil$s̢ "ejlL?Ci`ǒL3`˛g??&pɝ' k/0~ WH󪼔#Yx<ӓVBk#>P@MY }YWw[+kΟ5Kz8` WxA#)xnFVNUͰrn+8P Ү[z=7dA轂0x`LvEeLP,tA -A6 .aڮxyA¯| AuTP}\q9dx- e@x",&3"(v+QɻsҔ~aP$-H&na6ad݈P&zL|R#(ҍ2C(^?GJ޴/]? "[Ҽux .-Cȁ*Jh)8r\KH&H"CD>Z.03^^x!dwMTE{UB1Jvq&:h r6pO21Kf/;λ~%%; k&6ڔUzaAǁmॗ;i$ qƺ34Vy0"u'xI?w"y Ċ8ۀ &$&-{IḼqI $LH)CFzzލ+ņ6\r1sRPԻ(YZWN|B[[ pt]HY1"%HA^Vu,7ZgfSo[L۵XՖ::̎1rn7hB{$I8*Iv S`Dj@~,-A[rci3lзD 5|[У̳č#!~ZOOJFeB޻mqPb3yK7m@pS}h،c]C .R? o#TY6F E D8+DP J!5+k=o6tbw~4mVOz9m`ښތDT0ICW ̮]d:~T^=DN]]0a QUA[`y?݌ܡ[Po(:'cN(xW?m) h7p!%V-)>BbFPfBUL#~Im'n Egp3WA 431KF3GSGNuA$EiA^[c̟ V&9s/Yr ޘxlz4 " ͐ QfZ, !6ĩ:Q?T$|$Fzçepuht5E$W<,`qz+q$سUf99FgGy'('9\jAb{&C D;(~NM㢄^I} h8a% 8-=) $$QgJ?(wb3W aI ѩ7фDhӤ?;(Ii Hd䠉gFx%>Nڪ軬:aAPVijh HOs=W~~F+')!Him,$2ͧW U'Ri2^\L]kSRPՄĸ L Pv~Ў1p0Rl$M eZ9g6uKv@~rxFdmbz!B||.bb0E͚fP%ҕ $c9p2crg^"SưGj]dQ$98!D,HնTʰ~H1n7 AHҍtT%VE_ɰ+C3z򐞐Tb+o3 :4f W,.w &RwZ ڲIu)2Sbʍ,rYxa+m[T;|X-!- Q5|&]{Y^l `5 :-w@Lt3;Hu:$ i{Tr;#>DIe@ @ڀ4"^u}6 ҃L6pi)f1;zN+1Ղ ȴHd>h)J'Sw$)3M5p3L9ιNdbPgc6X|q hY`#q?C2S2(\ fJ^-"(7m3AC&"Ƣi`dQ~qZ df'S"_e0 1^G3CRf5k~G8Ft s'$)81s* q!U3D%.<#Td6t8X7g߻ƈ ~xђ\Թc wqM *b~օYFc i\d MXG3lZD{xzeS[j>r=z׿cFe!xe1agHsfudgzXr\+VhoԌ!%TA:H͔’SxU/J6\&udBYutˍ!({=*?',=PY2nx.}H;L@0**KLj_":\pS)87 #:LKz }w bݲba8<5-m?c~yc6 "ujòhi:!'Ik զLU h{۸jz.ngg%HZCGO!R=\-6HrS:EZEx"-;x0kUf|pp0NR~ =æʋRxd4W 's)@~ 2NƁ: 30FȊ=}W;yAa vYߗ|0Z-=O涨D&~>qBиƼ;DҎcgy5P8#ފr 5]ma4bF5~Rv Vm!L&ܘ YZnd@^p e{do R~֣)L]O|,veo'g.vn$J=lA|/~z3*vb ,ϟpɾ.K⹟T&|YKg;Lt+, +&;A +`SbHK6D_NP9i$!VmXO4t楅"-` ]5x}Qp!k~#S_VO橜chodz UmFI/O6A~Olb-PԦW]|%9y:'a9>&$ |} 4Qж.R5:A ]eCjE VQS`g7H׿DԬVm,j~-4Q6*7X/soNizqO=()Y N\+ ;ќn4) f| tZdmѽ, w( wCJ37Nu!HJaV'*'^[X5![u #̹%7_jHr:M[ js 2ZŽt.X[_">ɒf"JN-6X,Mw "w家am%e52BЍE]()O8m41J'n`)~ Z.I\\ܦGW?4AЪd4cn Ŭl@CC?g  &&n9{ ˃ &Y{}|eҒ% 3 gC%T`b9"ȭQg%Bs|Q@n 3-Q/ot\_GPV/ݻ4$dFz[KDz|e 1#1餹܂Ҹh-1ŔL5K#F?/!pR]5N w6ˀwk_ESG Gf­e YiX.ѳ=5+$U7/_zLBEk/~ɞرcǎ;vرcǎ;vرcǎ;vرcǎ;vرo4>VIENDB`gdalautotest-3.0.4/gdrivers/data/IMG_md_ple_R1C1.jp20000644003401500001440000006462513614004466021506 0ustar rouaultusers jP ftypjp2 jp2 J2P1[jp2hihdr4 bpcc colr"cdefUxml 1208.7849934895819,1517.0096028645819 0.0000000000000,1.0000000000000,0.0000000000000 1.0000000000000,0.0000000000000,0.0000000000000 uuidK=KCզII*(   x'?OUU#@OUU @xThis file was created with the ECW JPEG 2000 SDK build 3.3.0.160 copyright 1998-2005 by ER Mapper. This GeoJP2 header was translated from the following ER Mapper style registration information: fOriginX: 1208.784993 fOriginY: 1825.009603 fCellIncrementX: 1.000000 fCellIncrementY: 1.000000 fCWRotationDegrees: 0.000000 szProjection: RAW szDatum: RAW jp2cOQ244   Rfww\ xd ECW JPEG 2000 SDK v3.3.0.160 X>Np K FI($[F. JAO} >4 : htt-ltuDRo9S͚p2٩(Z yorZHK~Ya DNX}{$>4)8g*)%Ư)V|*E<3Hy"BtV*ѪM0\]j{ȤZ4'Q*ٜVRsātwV30cuZRtۨ|C<sQb/2"TriTCN@WXQa1~BsWё&(idOmES@]6 tWF{oSl<0E]TL@WΆ!9LL(Fv83sT-:PG=!O<`W~7u;`gQ q!ofߝ  D`@#q4`†K ~]IrXh~`V`-ݗ٤gWC1_ܴ<,g x}AC0D@fqUPQ\c~#/b)Hm ZZpG'U?GD)ۃF2k[ Ybyl4p^5t)S.ڠB$^ppJFYQO<}]ݟRsX;ành Q^R *&Bdv3N7CUP޳>DT>B2WQǷƒ *C.;!/hGeKˏY0p3ov;boa~&}_"ʈuv:~׹I<1[H<}6k]ɒ#Es+]"~"4#Jk*BEɳQXh!>?)+5fPF{0RݙXƧ.~T|#58+ĺi@X#`TFR2z PSb.osm`MHB4&èld6hW^eD\ہbWTjZs:(]()aSX +h {jp :>󐫂>'Y0mѬTUrK:]3݆R䇦c/tyzQa캢&nQ&D#1=m.Y0w)k ;|Uɦ'ʸtڂC\}j>)pu88߉r񥈵jTĸ63薯2\0qQw*5nk Ru1$OE[^*zHBR}.R$HْDP'jBC3?H7İ̎kΘhAxa=&7@o> _/Ƚ';+XKNIxڮ ؠ8Z\Wgݷ:_Sե —+ 5ayW4RF~Md޾>ނp&t(`y^qjKo lb䤥&3Lx<[iA]ēSHUG2#:h/GV(a9/Z4u xEXatM)Pm@~f5],=ǽPocZ j@lBIF!R=AU*1g-?+u^qJlޞ΅wEFp*pQL~bY (!M OdB 0֨A\I!_v0'C*EO'a3Lhj\Lh3lX<4=p-! W "&6zt=i/ WGiH ]ˣ ]y7ryͥƼN_ů n&dYid&pJRh@!30N + t.] [T\i$hPb59Uu$>Wa@dz4ҌNԍښZ"Tئԭ<}nوȇO#r}Uz*jר=.2J*@-՝Fx[lma1;G9fsͮKDW̉Irg27>He= *Y0: ($ʦ IDO=eof5&vG#h3f lq׶FC,|b>HƎ"3u} -XrCBShk[I cCԎU$^վ@l !j5,ݒ9f'k_ĦgU rqbu3zs@UPM4i˓cğ~/amA2N' \ޘ]s, ->8nk 0(~` 6&y)g9)A_\{7 CoA#h0pe _kz& kC9n$B/%PR)e}Vr$\'v`M V}/^ĜL}/@,&VVdžlܔ{z^ó^{A-monr fsq5%%_Y=lZhU@^UU0@3DCCHB z .k8?d L/ƏC6d d[F,B=HgtsV۹Aӂ1Vd;r:4vf~VU0V9bάq?JQa:6Ӛ+ ֓|Fcܚz}U$VϺS=b,MBpHEK\hsYj\:6}c1:`{sN &tkYz5'.':ے]͚҄JFԭ `SN"1Rk",&a^pRo\ }rQƖsc^HJW# FML" 1hys9>Qj b@LأlPjsKӢ$j'XӈAJoP=bpR&+gxFIhQ@<g?d.0KZ^vSz hҾ7"\0z"a9GyrE"` zb>N ܶޔy<_Oh3)q2FSs/yѢc{5!4%obxLMB DpiΜe&vh:`G[9pePltmY#DCZ2]I5J1Ƣ4I TGSXa \ywcs'Gu }}|N턨>Bğve[`>[l2"nq?P.jzIɢanU(~%P2O3F#tyO0,:2GsxqҐGpUIf +M[Ӧ; iєm4wIfwJڳSPNpz7|]Lf.~U*R72c Xn7ijD')Hψ ])Vr"}z=oF AѭR1u҅m' $%ÿ>mbrυX?VG@9"Cq10!6QFP]ھu'i%$ `b xfKxI G\p :xuŖMre2bvC[usPO_ ziY}o$weSஜMl5# g*?H! TX4EHg ,Ԍ|j[gqa H*"qUI>Rw'cNN^̀V+qP5>N"[o/)_hZE #.yƍX6sm88. @귵9Q^\+oÀpCaY R2$scoiJP_JͮMurٍpELA=_t[Fǃ Ű鯖\ٹZ713Bm鎋W{- 0Woo(JL<ȆM,4W&g>m@a5]fc1<;~O:7~&f=ko%ckm#U>]Zf6%1ׂfcGUYirtC8鉌TqbVYj)ؙ /<ھk N]83G=_3^sZhi}J$,^ >l:\u$\ FȪ$D_7ŝv[0RgXxm|gvV7#Hnd'#^yE䚫,' >О~ ?xJ1 ={&v ҈q]58E_s4C1xIE@h@(s7!Uhaɱ "$lۜ݃7X-yU%QG `bAzlv6%3 jE`uӻȘNK~Bf>JDi~Z7wX(V 8& ZFW5Dx G[5a [Ѥ7g) qik4T@opbќwBe.㓇 )vMEab1^﷭ܭ5hxge:-ȯX|cvk/\bGcԙnLJB+U#08f?:>͛ȹ u;"nQk/RhQ`G'T:\-&{<40Ӥ%=]R_7e&Wbq tY9,$yFq b$(ON-$lc(WKM Qlh~ҧij)3*}$?5HS.7 lqnvEmw8S_hhIx|go9T8<^ٜr;`E:0h?i]hd< k4w@@Cں 4\3xHR& yiHRÝ4%H<zc N`)"vX]]`M-ޡڐZy_i~ gĒdۼ:ȳ9WfQ(EnKע40MgsOi-KF&5-SpޅMnHvF Kj=>At&o`SC wf"sBㅙbsٰ͂TJkL[mQOăzcix'4[?(a}FZ32qrׅU{;5¨Ih>A·6^Ǐ6keM)0iBqX|@98zr<" y#{B<`-"GUk3RKge`\bE(c-~^r"d YnOn4 OXex@|nϿie]4:&W4CRo}'&.S1:o I2"e/UKW*kCpu3G g?m@6(M8y'ۥkBmfyhO:Ǯ7d9ߘB,j1[K-Q\rg (CPhgalWJ{M)\bIO0c,!;( U:eWa_t*4Ηݴlz|,Bbgr+c/pH.9=:ʺXc#"D>1fO4~c.V`\S k)Wi~WJ]N^v$L1$b0UeؕFce= :xdvOJp7؜@p09mW> cDk_(8OxGXQε;Lw<;CBή""@n̽tWݮM<&L;VI,#b%EKӵ>qU1Myu 2/5(*`w@7V8Ē@^VEyen -Dtjbb6J~9h2Wof%`_{'*M ~>z4KU쓓"P^=5^T**|X1A%JbY8݉`G̑W_ڃ1F*YGfdPacD*8d9-|A%־ޯsqtg﹬.Ƥ^~/~jyGlBr{?2O_IID#4kU8R3$wJ:vW,۰3ʾ\?;'{JvS ' 9b^pYwъ4{ kש |d_ J.& =I+؋_l|,D`[_YGLK n)|O[H"ҞIEF *fkKtb|>Ƅ7v=xq<唙$t#_rneCdg=0 RY $\F,/M*|Ny?/*Vr+9Z1D@~^9RRZ VwrYZ=tWD*7 c`\eݙcAvWh$k"4j.mlW"s:ֻ_c{죲l͵ʇ I1Lg.<1~IMM'Jњճ/]=*q/gq0r˄$N;D|K;g P%¹6C=(z$uTx`7eHA]:0:ơkQռ' rzpAVXf VmaϛaK c)ɲ knEAt9T~3=`Q I*,)Hu $ BX5]/'~IxH뀶mhbaVG6QIU jUU|3 '1EO"AEŏj:yFMćpz {]0Lɦ#d!SX$Tc>a.`I«} xD?;!/.KBN"j~r{/2td'lGWJ Aau/h؃g&kmc@%w;fs[F qop FLҾ.(|ki 1j.V^T-8u gfxН%{ m4/lم BV7`L'G]+q#k$}D`Mb*/v|QQ%y:[\xE>8UAt ?WG|јP_OdСSc2v5(v>7DgZ#vvSн3.0 & '"O "ܰ>\[x聃CZ,X cC?Y'Ie~R]CR=GJ01xkPotՖ+Yڤ3~o =Gڳ bH LHs}j+ߏJOZ %<+NJtz(|S~;[S.?@kzÈ+>gae)I\Cc껽E& d%@Y<$`;~IX%JpE/ꧠԨ.CG=HdIP޶k* Px?K(6 LP#'6 RV enH}v/$ 4CkaYHIC~BrBlH:c}4J+#ȵ91Q}ƈP57oVAqrȿD+[O%Ñ[ X.љhviuCs˨xy`;Pys8%) ~L:l#ڷZ_JlWрa0>^ߢCxoV塃GW%^FwhltZ52,jdؑ(FI8>}Z^0T#ϩ`W{2&Zoh=U0R+qr*"K !c9 0*2(A_FXu;+<ΏCP]X*KYk[ȖkamQT!O3YY\2PchSC lɳy"k_W{ovʾf!& X{V.QԴ- /HNqGP%[ f߅ F _zrY?\2<_gnP'6Dw5 ŢssJGOZTAOgEc[*TVa=[B⺂_l/`?< LݥN!T&%̑*W`}bp9S'ddꎵu̬# + /yڎ# bb"YufoOH$uVɼ3  #\KJ_B+^!-sMmPa1 @5xOޢC!rmŨ;At*"u#<K3$WeL@,,@s] /3b?x#`? GsW K)h K`0b!/1C @dVy\_>b-%W}KWÚ(/wT;whSG@Pt*h}WdB_B^ 4>>˯-c 2|( [#`[%bX֎-/o^pcM<>AE%Sr}F!_4&foSZ=) TcfI5@Va!/~ $% ߀>ݿcOֹlܧFP+'_>@ȣ(1XXmOyQQ(`t(ڊ.uie-$=v[aPQ,稯kO/Up={ d3l{B66n&6{nVw>LsH}{}X$kb"Vo3x(Nٱ>{E[6b K&9*?JhVBAhk+`]ZfbrWsDq  o: A޴ #8n@nq◧amIQ?5SdsV-wW4ٶRϕ;U 4_hk|8#pȴm*V&- /k=`yk:u2ES,bT򯔨(MZ> @8JkbcmzO|Hpk$u"2>=aE'DjVoA} . ^ډ赠ܶ I_mҟGۛB8JAsůSi(XF`*AVR~e™_;/UE;tq/\bѩbB*/ ʶ-#?:@Nb1Dd qK6C: JPU,x_.kz-9nV=MzAgdi E%Tvߺ ɿhCXD6hH]g%4&2iU!vAhB@c}S"QmnΜ*++sZ,zʮ];c~͸ͼh5W 8{ bJBբ hh~'2 ,]Ir(1?'0a!/ɭa!/-8ZʐVk% ;U* m,*fkbo}K_F@}OPqNq@& Nxr|;)A< Fu5a#d8 4{E"iE<]vyu?xiOeuYA CY1(ݹL_\0Q $%n{l" t^&K- ).W&ʦoHs0Sp>B?+Da`H᪽ Hɿz?OHDFgЯrI@6u+Y“7R#gk{n+oߔ?|HK~HKfHK>zNWC –Jߥٵ+H_-5NX*rߖ(" DpǍ`&s-kHZO6D +9Z¸!-YM̗B2,.Kl5Zz.*\+SM^(Ւө8;oTX;n̔vmV};Vɣ^S5]$_DO=1(^4Kid} }c6Dc4'u ԌF1W 9?6랳tWda{>:-ī\PMm&r-xc5n_0b5 -çpQ.5%D*&Q&,#S 5< On.N(=P` :sbyWUӔ:M*:6p?R7mX)ݽah Atv{Q pӽo38NHN:H/Z&_CCf#pQ4UG>7K!ۿZA~r'mH2#t *9qiшE}oωQC?eK5Cڏ͑xRI56M#mRmHT DX7A!8Db(ju]lO.郙&nU*jS t%m_1ןP˭1׹lTsNGV][W :w:ri5F;m41}A~GF12Ȋ{m׼ .wЖCO_zU'ΡB0.Qb{[/8#З;lAt Lh/vIơLCD \M%$VhO>sq +&mQrEc7jGfqi8v 0]=\}?+@c۷3pB55~V7;Ђ: C d`x6 A_Cmg׭eӤpl9~'[c.$ V.K}a6ÅASwE\4 tsK ڳk42AvRkN l=#]l? vd.-R$p`_|XM۳ +j\x;U3{=<MS̜yq7Ԕruu6yGp{Z&*Z <6bftÁ'( Z*'2r[7l|Sֹ$f=#ilҔ+63DYE;$x޳0UTܔT%*& mO/F%XPӆ#2_?Ia.%qu4UA"S_&4e<[t!RJeDc V(@C .L}K)aKioUvvܒKaKd=*`<4mEm;Wa!/_DS<·ߠ_ 8nhص"C!ΟMNCP!jx0S2GdCml|XN`0.c9Kl 6 UC{v0ћ}1^&P%Sf(Oйn̰L[7N::7(J+]?&ص8j@? BMH.E<[XK oBʰ&GIw/׈d0&p)_25ܾTzz .VE+׍}@^/1pZqJBD-͔^9} I}xѝEt5,߿e)VoQexv6c·Ŭe*0+RwR(솈3v;$ $ͦ6($i᏾}9?C)IZ'L-*{ h$ɾ)ɢpB64KR"k+r0/=Ma<N0"Jz $ZAM4Smv(VLAj!Xۡzgk^R+j - Di/ 1qe6Wǚ 7cr RۅLIjgsH+uDsM7XiΌ;Juw|*:.?͗ؤ+xxmg v妲W´IE'<[E 2Ap$<6쓖+,a!6"BPo?6Zx+w.a1z9/WzcgdcWѼ'sNa?y^SCuU2V|YI"K ޚ\HeϘW(фēH$[XRKʘ ~DMFWcaE+BR_zn tT e^}P2VT D繷P\lϒ7Ǡ1Ð(e6qQV/%YZ-$B'I"gn|٩*Tߐq~OMed㸱K?A y=I43YpeLwkLoG16I0b8[/pk؅E1>s W"QvCWFwEVX)`#ةS)vi %߭}ݭOҷ|1~RJ/- /D-|^JbyͰ2~[H1K fȜ,J> `ݬSvO}pe6wQ{LbPnhEB?ā.D|08c( =8]ӽ~Hvu'M_,w|Ґ|cCwU|@e+ա(A ©D _h@%U#}ֹ# PbAPK\ȸ+Fm*Ɖu;#g.zN1e>W  6LHddJoL=;j+<}=<ŢΆjžhP릀XD-x#C KWʥ7 .$1T)KYѴ>ת?|l4eRR]Û |Q3ɋͿ ]Z=PA([ѽ{P8={ٓtdS-8FAڸE<a3S3ފ[2zHWE`˟4IiN ] o:S!/yPx'Z.k7$آwNcB{R`m]ec>gGL׊ۅS>RNFDxlLRqhd7C$Un5:XXYeD 3pIX 6!b*[ e.dt;`;hSYz6JFaxatpj)~0`r5U z? f0x!\HCKͼɲtj ̟#n7~]5l;⇣E)T]Gi蓵 Z*2Po d7xnw[\1;,[%'^xTH층`&F!|O VA D2|Fv'!В w ~&Vn$M XMdmٯ~! QE`{5hpgMP#wo6dƼ=e sg9:!*tHdP„~l~M+ Ė;p[59;pt EmMf2 8y0uwx) KPk1C HݠА>nSt$d C35FАn|$I:W i58%g\װz^鲓Z9?ZܞTAĿeÏH%zusmQcȫ7;sG\'"|/@8|Jʮ;V"We~g\f :"ߠ[g3KjUIko2FUƧZ&mrc!8(}#ݬE@-rDȤP6-0#0\$-ֱY~yfZfi.CAх/(x (qc4{%!3#_`E7A&A`é+\39QK~B.s j5T6y^ /xr.Kar]ֽ0-ڤb ŗwH҈. xhW kiR6뮿>ڜ)$Z..4ӒhtgX TP9 b>فY|D' Ⱦ^5-+`M s$|y{ٟeSOxGɻWS5dI=#o4Wʙl;Y"A#AفnKDպaB \ ɾ騗|Tc РIr2T<=+ŠIB-n l@)e0(Y*Xu!((Z 8IY~|"Dh-8,3-e`ѪPg0$H-h)=Āx!p6e޹ERjUe`q:['=,<Ԁ_c#9 TD wSQ.yS"ZG/b=6,受?"N>` #r4)M3HID0d1SПҲ"ȯY4LƁF̌]ܾH2AsRmalArPD Z^Dȃf^}z=VHȖk)Y <y;<ܤL^Fp֨yO+cm`~Z=tj}Wyg50n۰Y > hP"Z&1QwgW U$\iw(RMg%Ǽ\Og-eץTݕB /¹3(diq+,/y$d"A&صcp۰pՐWԆO. ET>Ϧ0-%;VQpJ0,n--It3=}ɂd4BPvܧѠ)~^\bS6+_~ֱ )r.rԃqﺠMr .OԂ)W3IL>^^Ujg v`tو}9slSs7@xmz66kMksllG߼YvtX'(M;Sz-L;1^ձ嗇XqwmŃ:##Փհ#yZ~!Hl)'(/w&˄8-'EɡS*br#~+60^؞r 5԰iO1;:,(nklhqm"#*N#1?ZtNA04-7N4gyEMpr,TnTA(4Ds.ߙ7lFQ?Fi njjo,J&}D,+1oJEZz?Z$w9wz+vNaPxdÕ$ +î\tS'_3`KugIubKD 7O^Dw70 ~ZC3 лVO{(=WqB)z#{FB*,s- m*PEli$JCuNrp$c-ggӊ'oLuM tx}ǩU@b+֊iն)eX<3^܋I!Rrǫb!@i FQ%( Ff0޾ECX;G4feۭ.I+X۠yX5eݣ, , Lj*0zVT5X&!ojBUzeRo [GEqn5rBL=01|z/D6EpcBvߛ(,k)=EE&ޯ|M#)6qAEio9[Yj݉,1KO=r!!'i0ɚYX>!)mi܌F1ҙr 6{ՕiG ]Yl=X^x*q5}ǐ9_* (i4\B2rNE\/n !D-|؝}b1Unn3 " JM$K7PpG ˸DϣA, !3-t)k"6w<}W|°ט:D>5,m2$P}5F U-'\oDz R11/]j\S^]Zo>q>1A|ru){gdi}W8T+A!S/O߃q5EW m/kF6ho;DAw]m)[s /ΤtO qs$I2ER7~Coyd4&/韝h~TOHVX 1&Z(xti/avR6G_g?/opT+M!c8~v9MSq@LÉ=yݠ35?I+`c@47 .٪uImK?,;ߧ~F,ZsP2H&=Ggp˕a=p &?F7OKɱO&Az)"[i ȳ%t Ě:{NPϮ_G`>,r`\Czs5-`D|R5:0"TA53  "w]ӭmfKӿmla1A*#_xB!8t_GA_`R6&V:Ym8F2|3t~R( w"+<Յa@XКgC}OG)T.nu!Ȃ$02wT": 㤣~>~ ׳L؟8m\%.zf,x,Jp}`ځT,Aq8YY#C>|VTpjIa,>P^c~4d@dkYU%xMc?`JxᷜFKt&o j"͏DmT~8 G MťɮFptm%ml\+E1HB@n G?,Ql/?*A@薻l%`7 dI€ PK^$صS`Z@67@3$,Ǚ+,ShLOW YxBŕRj*6El UzsK50To {*f.N "y v ͎RC?e^LcXG%x'ְ^~s[a 0,YWhBS#2J1P:,xP1\8tu0l痀iWba[szc/ؘrJOYs{Vt[wc $Ȩ΋r|7R-R@kP R_6V`ٱN|Oh@uaɟǦf[;-wGhi]6EEvˣP 1<$Ål5JH):ƿ tvnUg€Md>SBbxR$~|y~ad{fnPD~ujM00\ߨVkί)R%(K"+aڕ -^w;c:|aF8j q},~-&`!Sjn="Ӟ5ox)Q+He6# _DyFt\OͶPOh?ii` ɿޜbO2BoEl0%`gdalautotest-3.0.4/gdrivers/data/trmm-nc4.nc0000644003401500001440000005020413614004466020356 0ustar rouaultusersHDF  P0TshOHDR-hNhNhNhN"  L `CDIGClimate Data Interface version 1.5.2 (http://code.zmaw.de/projects/cdi) historyWed Sep 07 22:35:51 2011: cdo -f nc4 copy trmm.nc trmm-nc4.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*K$OHDR-hNhNhNhN(( ?@4 4*G* +CLASSDIMENSION_SCALE $NAME longitudeX GOCHK longitudelatitudemOCHK ,standard_name longitude ( long_name Longitude 'units degrees_east axisXMcPSSSSSSSSxShSXSHS8S(SSSRRRRRRRRxRhRXRHR8R(RRRQQQQQQQQ33`3 322`2 211`1 100`0 0/@/.@.-@-,@,+@+*@*)@)(@('@'&@&%@%$@$OHDR-hNhNhNhN ?@4 4+G) +CLASSDIMENSION_SCALE NAMEtime 5|dOCHK ' ConventionsCF-1.4/OGAOCHK 'standard_nametime :unitshours since 2011-01-01 00:00:00 & calendarstandard{V"OCHKtime ' calendar standard  commentsbfile created by grads using lats4d available from http://dao.gsfc.nasa.gov/software/grads/lats4d/ $model geos/das !centergsfc aCDOHClimate Data Operators version 1.5.2 (http://code.zmaw.de/projects/cdo)35OHDR-hNhNhNhN4((((Z3 +@D+(( : long_nameprecipitation:Precipitationa \OCHKpcp! 9OCHK @ _FillValue  ? 8 commentsUnknown1 variable comment[=OHDR-hNhNhNhN(( ?@4 4*G * +CLASSDIMENSION_SCALE #NAME latitudeu }YOCHK  5= $HvlOCHK +standard_namelatitude ' long_nameLatitude (units degrees_north axisYpTREE OCHK   & grid_namegrid-1 5level_descriptionEarth surface 2time_statisticinstantaneous lDIMENSION_LIST,_4GCOL`OCHK* l0REFERENCE_LIST6datasetdimension ! ?CTOCHKN@ l0REFERENCE_LIST6datasetdimension ! ڊ OCHK@ l0REFERENCE_LIST6datasetdimension ! TREE7(( 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.0.4/gdrivers/data/rasterlite_pct.sqlite0000644003401500001440000012200013614004466022634 0ustar rouaultusersSQLite format 3@  }#-7indexidx_geocolsgeometry_columnsCREATE UNIQUE INDEX idx_geocols ON geometry_columns (f_table_name, f_geometry_column) --Ktablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, type VARCHAR(30) NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER, spatial_index_enabled INTEGER NOT NULL)f++tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256) NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name VARCHAR(256), proj4tex   BfmepsgWGS 84+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ''test_metadatageometryPOLYGON 'test_metadatageometry CC,;f++tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256) NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name VARCHAR(256), proj4text VARCHAR(2048) NOT NULL) --Ktablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, type VARCHAR(30) NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER, spatial_index_enabled INTEGER NOT NULL)}#-7indexidx_geocolsgeometry_columnsCREATE UNIQUE INDEX idx_geocols ON geometry_columns (f_table_name, f_geometry_column)C1+3triggerfkd_refsys_geocolsspatial_ref_sysCREATE TRIGGER fkd_refsys_geocols BEFORE DELETE ON spatial_ref_sys FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'delete on table ''spatial_ref_sys'' violates constraint: ''geometry_columns.srid''') WHERE (SELECT srid FROM geometry_columns WHERE srid = OLD.srid) IS NOT NULL; END DD\1-ctriggerfki_geocols_refsysgeometry_columnsCREATE TRIGGER fki_geocols_refsys BEFORE INSERT ON geometry_columns FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'insert on table ''geometry_columns'' violates constraint: ''spatial_ref_sys.srid''') WHERE NEW."srid" IS NOT NULL AND (SELECT srid FROM spatial_ref_sys WHERE srid = NEW.srid) IS NULL; ENDZ1-_triggerfku_geocols_refsysgeometry_columnsCREATE TRIGGER fku_geocols_refsys BEFORE UPDATE ON geometry_columns FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'update on table ''geometry_columns'' violates constraint: ''spatial_ref_sys.srid''') WHERE NEW.srid IS NOT NULL AND (SELECT srid FROM spatial_ref_sys WHERE srid = NEW.srid) IS NULL; END 4//viewgeom_cols_ref_sysgeom_cols_ref_sysCREATE VIEW geom_cols_ref_sys AS SELECT f_table_name, f_geometry_column, type, coord_dimension, spatial_ref_sys.srid AS srid, auth_name, auth_srid, ref_sys_name, proj4text FROM geometry_columns, spatial_ref_sys WHERE geometry_columns.srid = spatial_ref_sys.srid''stabletest_metadatatest_metadataCREATE TABLE test_metadata ( id INTEGER NOT NULL PRIMARY KEY, source_name TEXT NOT NULL, tile_id INTEGER NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, pixel_x_size DOUBLE NOT NULL, pixel_y_size DOUBLE NOT NULL, "geometry" POLYGON) ##; =truemarble338169_pct.tifR? E3? E3fVf@V@|fV@f@V@f@VfVfV@ +raster metadata zz;> A'triggerggi_test_metadata_geometrytest_metadataCREATE TRIGGER "ggi_test_metadata_geometry" BEFORE INSERT ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT type FROM geometry_columns WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; ENDB A'%triggerggu_test_metadata_geometrytest_metadataCREATE TRIGGER "ggu_test_metadata_geometry" BEFORE UPDATE ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT "type" FROM "geometry_columns" WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; END ee$aX A'Qtriggergii_test_metadata_geometrytest_metadataCREATE TRIGGER "gii_test_metadata_geometry" AFTER INSERT ON "test_metadata" FOR EACH ROW BEGIN INSERT INTO "idx_test_metadata_geometry" (pkid, xmin, xmax, ymin, ymax) VALUES (NEW.ROWID, MbrMinX(NEW."geometry"), MbrMaxX(NEW."geometry"), MbrMinY(NEW."geometry"), MbrMaxY(NEW."geometry")); ENDaA'ctriggergiu_test_metadata_geometrytest_metadataCREATE TRIGGER "giu_test_metadata_geometry" AFTER UPDATE ON "test_metadata" FOR EACH ROW BEGIN UPDATE "idx_test_metadata_geometry" SET "xmin" = MbrMinX(NEW."geometry"), "xmax" = MbrMaxX(NEW."geometry"), "ymin" = MbrMinY(NEW."geometry"), "ymax" = MbrMaxY(NEW."geometry") WHERE "pkid" = NEW.ROWID; ENDYA'Striggergid_test_metadata_geometrytest_metadataCREATE TRIGGER "gid_test_metadata_geometry" AFTER DELETE ON "test_metadata" FOR EACH ROW BEGIN DELETE FROM "idx_test_metadata_geometry" WHERE pkid = OLD.ROWID; END yx/P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)AAEtableidx_test_metadata_geometryidx_test_metadata_geometryCREATE VIRTUAL TABLE "idx_test_metadata_geometry" USING rtree( pkid, xmin, xmax, ymin, ymax) KK7tableidx_test_metadata_geometry_nodeidx_test_metadata_geometry_node CREATE TABLE "idx_test_metadata_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)'MMAtableidx_test_metadata_geometry_rowididx_test_metadata_geometry_rowid CREATE TABLE "idx_test_metadata_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)/OOMtableidx_test_metadata_geometry_parentidx_test_metadata_geometry_parentCREATE TABLE "idx_test_metadata_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)%%Mtabletest_rasterstest_rastersCREATE TABLE test_rasters ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, raster BLOB NOT NULL) 99D 4C4´B   ++iTGIF87aR (048DDTX\\4@4<(08(0@<(LXX hphh\\lpx@@WIjfo}&acMhdp`x]gRdqxpjFHv|Iapqp)sMkaUw=阈E{DZgPɕh\!T͑xlݛ!l(! @@`M @( 0 0`@ p & }RJj:` @tYu*:9GeuY]{DUR$_>֧čPPAL lAf [lfPZvA,[mRx ՔZ_ul1b1+xK~ $pl|{fAˁJ\ AK\wD[ $<@ %hj󩷜_!6,JI7FbAP?cБOsK<]j `p׬N0N  +py%WJ a1 A^`@  oաjway(A̻@S;,bH׷z _bW襇EUS2cd6 U<` ` or~@VB8GzHv%YdLlå<`T@җ kg\ Z@:O^: Z: 8.6}΀`,&+g r;!q6md\`@J* /Ę@dD%@'ܬ~A8v2V0qp@ +c,->[%=f4A jqg<[_.`>ANr 4p. `^ ,vęXJP` h@  0 6"{,`Z?` : Zj +Hz &L !sUd0y]  v8OEbצ@S^0T  / BYP!t)rka8prk@ .P^C=Y1(6pA*aAX TA\%, M`(RP*X Tp`1^d!HXA,Rs@Q˙8uYr,\G`(7ARe:g@ܸ Ѓpt %̪!qA?D`_20@( béMSY "pLlamYv^@B\/ KhB1A UC02C` g5 ^`B5HTh2t~|oeMcŁ@3W*tE |07P!% 9*bg3D= l0 QvIT`b@@]xk` 7@ld[bJ o@JUgHC6 hP֠&0a &d=1 6qhp9PX S0r9:e@6^б:wB-x{д@4t;O~J؂ P3G`]`,HA@qr; jd7sx& A h88 Y)8@Kme*G4Xxc$$McD>Fۅ"A wp2wX5q:`0tuP)La S`8!`HC*\>D/hԠ6a ]x0 mq l*Rh's>CGk hv:\A>!d*9{ja C K4)EP2!BN'f6A J_W_Qz0<H1).@[J`xMe&0[iwevfP6MS auPx{ K``ffv=xwv}`fua=(6Xl*Eh4#0(P6p@Z0Zd0tHraapNPbfpW ~l`FxjCUcT60W RS Gs' / 9b:b6pL05zAP* _@q/G&26,F{>Pm0yZ ^AGTGm,z9_umrlzPE`ipJTpgaLfMփPh'uF05vPsvVrPi7{__0p0)r`jd)`rXIkK`E)a|N>pp-ɒ(x pI `DWYٕuiPJА5x{`!I^`jYdW+9xw`P@6ˆj5{PsP!Np8M@YM)YFhFvre-XN ?0 Շ5wV@ @ _ pxp_mТ]0ziiw YP>0Y6p XA|6>pi0ʹ*ZH> .W'\AU^3hg xo0BCC\C ` W 9)(`^Z#[z hW0ɜܦ9p *I y}xC`(`pHvwu h5u5x p6y P@r@fb Rab T RX6YYW!s<@{\Pbذ%A:Q*pDPO2PjfKY=@B!4e4]qmPWЯ>yo7BZJ^@ plcz~ y h)uuxhGV x@ X ;((Rȝ) iPSuvMe I"84VA 0p7|L8Y:3#p7S!hzpWh1`, ilT˒͜ `\x FТpp V@ +I  L I Д fk[pÅ S`bWGfPT|[dYQPY } |_AWjpA`IA 6@ƄД!i爩_ @\tfyg- ZmeFt xphhN4  @ 4o{+0CX!I`*+0 "~6$%xVQ2H7[؜Fpl@ep`-y~x* xي0 Ά,22@63,)F@ДJ 67`$ZJPR<ŎXwYp=2*"m@')*>0@pp'D `Fphw 6k1զX@]~:G, `)@k~ɗ5W0*u,/4&%}2.riEwZ `0~:Pμxڒ}̧ڱ˒` ̱{ <89ܶ D,f3,еNQ|BpP݇=iOwйT<}[8@xF6 !`6@T5AP RX^nF{| OݢF)=t6dW#!BY'M$3$z(m@/y`L^ 89,lKp-nVn} <ؒ`.7풃ЮjͮH>P |HW(&[m!PN2 (=!<_ 6LZWH@ [!C,hu yע\˘|DO0YZ8E2HX4@8!t%&1+`V_- $K-Y$^ W^.<J| $ ό`.7Z@FPN,`K :*lDɺآHZx>!0N`1"NN0iEs(p'͕_!`eh>G_,wWhJA01 ciR8E $=`0HشaSZ aAh4 8FᡤE: i D$(.hK8Pi頖) GQEASO|єȟ/_f"#GN\p  v" )d H0 B(xPG]B08y g*(ć|%/NUR 5lri&y]5!x A ~ C'`}Qbƍ,VP6yujFs id2z1 +E؈! (  ?xI(<41;(2BRR^4+I#P;! 'Ǽ9`k:B@bsĉSNAXSr2B(@$AʜӽxP$G>p<$A%RT?J8 4Ha c<534Ґdu)-LJ¤7!6`sBH))(H aB" d F؃PeK V tFuVB qDrKJ|*lnCB`I52W]0|LXCFr:h(Y3,=)z`TXU;-px6rjڀED EP8⿿ 8 :PC;%ЀYNZӃ*Tf=IlyٯТC-Vf a P%NSلcV9c C61eM$P䀄A؃7D\z )~2+0G2&/B %r\%لA2:3j d3Y̞Jpx +GP"KB%,ƃ8 A9Bp-X*9LN|mjb^uSLiVhnp b;z갅5[ !BfyBt'|9 Pr`*a S8>T N8%Z$A$ JPNEiA0'/1B`G2`{[AF,@[ɴM2`| 4 3Qh!68.q8d> L`C. h;⴫('zs^xb~-jx Vؐʌm:|@m䀅`Y("9"/f&O=J"BaQ)M܁(e'H C0!YaQ$)d'R7*n œx!`O0(B<ᡄREzRem+h"E)^ ]bEuA{䕨-TI" B.r `80 '`b oa]܂C((px2qEMX+90;0[91Т"1A$ 5@ˢ@X:-`{WK˜|5-P>0>q-h*cP2>*=3  ȅ a۫]a]]`*b0 HQ@1<:JpE 蛄0(k5Z S ,o1>;ayQ(>(sG`!  _]5D-L_eG^]=]P[U}47\\PeXcȅ^Hf`>^P;Z8(BE8 /l !{f 09ehgheHcP̅cXbc0bN9ԅ*TH lBQF(AXM:DDWE3";ߚ'.'p5d˳сS:1a#Fā BHcB>lHጆhNg8\0ipHؔ> %oщYQqx*ɨ/:5B$i9jpXʅ\*Zذ9 QhơN1-%6PUd5<:MpƄ؂,Ȃ詆>H%POK%MܺSЄ"pC"*P9 eQkkHlkm|^8[@fP&̓\>\T>ݵ ] (;kJ (;$(EO ,A x,0G3 *h nlo5aG49X  h`PËÅ `XH]'!"lY"GHPR36ȁӛ_dƄCHXpŀ< PEZX0h;p6,_9p&pLR@(( ȃlaVdf(|MsJp#>qPЅ2[@TX(O8D1"H0b:@Ib= s2OO0)`NU<: 5,(3(,+(WX:|(p<[ȏsJx `p[T[]b8!X\ǍllņpqHpf-pdrP^(b p' @J<%ZDXuS"ݠ I[e (@'XV(:iwG0cs~Ƣɂ^:(0sH3](UŬ,UNΒ;8>^C^_h@=]XY VTN~\8˃ oMceneoahna|a9ąr>(HC؁,X APF@/ϝ|XtKeC朄45$UpCU(`P_(}VV8j(Oyw56FI 2&Ki8Wì6P Ÿ,3bJ(g.r[b\Ƚ cHmod@ą&ͅ\Z~lp aoث{Ն\e`[()pC5 Q5to)a?s'`[>tnU%YSVHJM GPcHX02"NUUMb;mF!Wp+)q@3,xHp3t`^`,_HN\(x m0mm`Baepodjcǝa +܆:30kA\ ,S EMW (xZxl>7ą[X3vG(O0RLYDJf lɁH)p.>0؂5ꏅpIn.gԿ&^ecm䐊AHXS%iQo :(SLp]:Yg$@5q (0 ),CiM8X& 2XCC!L1@M8Dc.t- xL7 .#>p [X!@(bG>`BXyŐ2 @2XՃTNaV[da25ܢ*Ĝ /Š4Qb:RbDp!_ qJ6dV,Р0QCΜu^;iאɎ0 Y00!Lc5dˎ81 -ӛ6(5g2ôxb05b T@ .B˶0SZІ< Z栰e]i%L[T1n\8?3Z^ c9Zw Zi|MyCg6vM 8X0bh sQG2B4礓#7, B$1!hR!>(ȡEF, ަQHP@ `ܢh*LD XcH(#@($ pwam d !|jA lm8`Fa`@4g%[4Q\ 4 , P1 _ц6¨(=I(Vq8xd/8S L`@X}QBPָRCr%$xMX0}5C"K&+X1`U-j b;Y 8.˦, ^ $a;wcwc@Ѭ44q q w ` 3cd2Oov CdAaTh#a"l"}d#@4M#D]jT:4҄TBFKV4ͰB<$!\RelrZ` 4A2чWEYQ  H Vl%* 6 4Mo43 pcD3ϔx"  1.#K`0+2Obe@ s8m:QF#[FRˌA5VLCbeEm'D 1_҅aU .*!w" @U@`*Tv+C=4:i4L43:S"ApLy.j0NHF, P@@T ]̲XJks(1#FҴ;`_#E 4pA  ,bF%)Nb2,H f)B!=ZJ@E$aS*[%N+Xc< 3(&8ȃ{FꬹV n0 `ZP =) 0 G3XbiץU(MaL0،H)i?08!T  .@ <+A y.[ n2)r ,Ą$`Q'{ T<`"j6o[yAS>Tw`g-t:i@,ql{M5;ƱVofpI N4Z(c5ip^b %;ю㴇3)Z{ξ)NQgb$!|\[0i!K05Wd@lPPǦ^QZ0& Ljl ,$@h|X9otӼfMo\]ʒm~Nk'h C)pDeB(#8B"7XO&j,T&#$/o]58C>T1p*QphS ~RҒ\UMnS m$CnHْ"=W'[ ۀP[2sEb[W w0Bl]"C!0S 20h[wwm@ޫBN, J:VDރO%>B%Rk#R*1&,<~ǟ  4#E? M N` \dWl/s稍pmD`}+2Vw[p>c;Ƈń@(8X!h 4|}% LCKc;Ԃ+XeR,o@ H|@@&L4X+ Bz%Ea܂+,-4e:@F*Q4t(MhfFWl]capxe+Yɻ[ 4Y!qS X B%.t:Ji lApq{ hP@  lA(Lý&4 B%e-u/' z5(hJDj$! _$woFѥo=+3 @C2ײu$1QB M)F Å tbC2\P)Ӣ:QٳҚ)PQǦS(M, J4 :+РA"g@ҧm:]h3oN$ ,"h˖#G FQUZR2"RCF$9jU$4زƃ+d."q'2xB-zUT~p@I_)y^џVT$QD%ou(ied̻2'}P#PA-$#+1M )MĐTAn 'J(AmaBB$V!PN \xлK(0HI NCp+ИˋޔH"AdĽ?T't'XAFM#5SOKDBBQ0I%Z\)% kH0CJH5PA#ZS-@`9?Un90 (dhX CcX,DD8Ϫ=)8@HC-M@HİA@zu ܤήk CR:4Q$CT^I((%u*j!A A(AcB b8U\ @4aOvM G^:h#$霉dGQ8`Gal- L/QE@-"UH>3 JizP{#.^S:8E>0W^be򾒫(-p~12Bv$7V8\Pd"q dCL8jn/k< [?O2[k$|0C@\vP4 EYc$,![ F AD!Ӗe (Dd\(NVr*9xu`a oiDj `e=x`xSL+!/T-$p%lp_2} C=Ae|A&F# F`mHC 㞰PBp[!F(# ъ(HHD&-?Z`6@"P\`j 8 Hba($HB76)b%$-9 O2)S I8(잷U%}g&C!2D- S64 dD#!Od-A T8F" Y<_'F NN$LS*8C"ݒ~HL(ro \iBWx#@@8G|)=Ѫi:XB"Xzd@y m,12K !jг IMK jJ<BV C}` $tKK/r !ڠ-A<8 >2o1umΧh"Uh!P!ؚ,>霸H;ԙPE[bsRpW' @R8(6z>OOxۅh=)𫙠X> , (" a.ԑWчM0R? ,`5#Ko JhbP[E8gb"xhr0-0!P@؝mTTWj8GWP!kpeձes+{<0`I]TB Ȃ)C]ICJeo!HZwD!M+bc+pCj&ꪴHDF֖ Z p ׸{^׆D xLHY?V^4sZEݨE.v3y"A%F-4B J8&SD)Pce4(C%4R|/|Bjs! m4,uFw‘;Lsln6&\&g9B74M@@ $:>NėOe-(y"!"-|W|R#2 2R{걉.tJ+f$pIB m$@QB)s6kY!m:.͂P´;#ul1"Q°En9h)!E4b`f)AL"D)@r1&ېh 5: m$HdO գA <44iv  ZB0o<8 R qeX[(-5u^Rv?`EdAB 9'Qp*P9'!A Bh@iZM,jBlNHR¤JJ !F6Ax !`8Ί ~COfI|x#dOdn|-KFI "jꁏFa`a<ϲ/i%\Cx| \(Zb 0@%TV:L,\jB .O-Xv\&DgNвߠn!b N( ᡪ!5Q& aو>C&N.lrs6H.K!(A&`T Iʀ8_:P-b@ `ffAbbA^ ؓNpJ#$/[ji@)F`l!n Jp6' "$셡(FpF4ܯLzk",t(S R(x Sڠ|`p,L( I !)OnE6hר3B~`77XrP 8yԚ;iYrӕ:oSn!SFByyNuTViO"@Ёeos$Qro}aXVͶ\ ^8soءA}㲃 Ǖdx:9K{|x)- *B9sJ0 f4 |%K*bpw䗘Y (ӫ' B?[k9cq%Wk.A{ ` StE2d Җi[JZ8@FoAس Zn@`ysLbIFox`: @ SZ;֔ dltAnA~ Gpv)OE5mvCƾ)!na'0PlYK/cŕ_nnq@U}+0SX$/R @ ` ĀF6~W׋cazU `T8Y# @ zj`G\7a{ &h3t\qpG A;ъt! `RVs, /XK,[  ` ̠ = 8CtjưO|^gŵF ܠ  v k83ڝ}kXp 4$+SW%~@{1aa >p"\i_ge|:%L&U/8) hAy?oa*b8I p@  $xРB@ "$ł-^䘱`F?N΋4KUBijń @ԩ:uAi񂄢lSk[3~JI&>6oMr*i(]Iw$D)eT-Y}gqTaDyƦ~D1C]UI!A t1 jnVj`JOs-@LYn gH`Za,U%XjN6 6tN1$~4b9P F !`HdUgp]8cvDV tUbeP iRyW^zۜy)إI6Y*5C89PZ B1GfZQ XlEO=ݨ *ⓞ*EBߧF)V_]F^ V2(Tтrlb^Yq>+E-JjYۖԱ8y9:qY#pӹ r!UB~56i3K|-Z*OD$X@Kgd;-H7tXQX1wu`ǰdQB, Eݵi;>1E2|$^hG+cB@ꢍWq-sU0X 2;wFz٩ 8HDi:YyWH9ǤNŕ ~Ytm"Kv=ө_O\LwDBTRnLwď KJqۍo$ft5Q&v#X dYugFZX& @ >fnִؤtf X ˷0m:B"sB";KIS&W(D< 6S  W3hj P;`QJR!X\ A(Z\ _ 5?<X@ T < NhS9N dz)8I$3*{P&bQ6D`.HD9j\cԅD鯊IB8N bpS-iqd6vOT#4">$I {Cr s\A `˜N7|B[yĖUpAk<4Q\6fшQnQ6-1d E.eQUfy@  !hVυ@ X8 ]r*{] yX ~DdPKF=;R#(}\Ȉ#` By:ag"Nj[27Nwt, ikkd$JiY98Yi5GC׎O{jbI؂1ypMQF\I=y3Vՠgk˭{e7Y5`NΣZ`_W]-zR+m],N,8'+5 *'<1}Z@Mrˠ [\JaD Z)ܓfՙ(Q*]2$Kbx$|)RJHZri,+x Qiju|$LWęYւGVN3*H`jU~rq|1)VL8#~mfHDq1y8}Tc%!ߧcߤ_83v!{Ra%{~F%v$n uGTtgOF+LrkF?u??xn g~)ғ_Xf79mGFgG=e?(2-7!qyHQneoE6~EbX]hp[H6<5`UfF!@~5%uqo>H`)xixx`%y)#7}ffӥU?CsSfjen?k.&ppwXkpgŁW5,Ɓ&U̥u3g_Vgu(VgY)]\'Jp6U ׇZFPWTws؄vYHyI^%IJ )n&o]I]_{'dpFY]c|`Q8PcT-9L٦iQ6E'cGr2YcH0 u}%Hj7O?P{xg1Zv6m+ζb6sWyPΈIpmdvtwZ$Va zxIA8kWiv_Kce5^9EX^5XNwdGOvrU_dE&h7zٔgnhw~o~[oN&*ȈI8Dn9x|555iІd'RWPz q_yBe;h[4I^rnUZuyl@jʡ !*#J%j')*0';gdalautotest-3.0.4/gdrivers/data/gmljp2_epsg3035_easting_northing.jp20000644003401500001440000000457713614004466025172 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdrcolrasoclbl gml.dataasoclbl gml.root-instancetxml withheld 1 1 8528 7086 Easting Northing 4895767.000000000000000 2296945.000000000000000 2.000000000000000 0 0 -2.000000000000000 0 255 gmljp2://codestream/0 Record Interleaved jjp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/pds_3177.lbl0000644003401500001440000000701613614004466020340 0ustar rouaultusersPDS_VERSION_ID = PDS3 RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 15 FILE_RECORDS = 20 LABEL_RECORDS = 1 ^IMAGE = ("small.raw", 3 ) /* This file was manually modified substantially from the original to produce a small file demonstrating bug 3177's detached file with an offset */ OBJECT = IMAGE LINES = 20 LINE_SAMPLES = 15 BANDS = 1 CENTER_FILTER_WAVELENGTH = 1.000 BAND_STORAGE_TYPE = BAND_SEQUENTIAL OFFSET = 0.0 SCALING_FACTOR = 1.0 SAMPLE_BITS = 8 SAMPLE_TYPE = UNSIGNED_INTEGER END_OBJECT /* Identification Information */ DATA_SET_ID = "MRO-M-HIRISE-5-DTM-V1.0" DATA_SET_NAME = "MRO MARS HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT DTM V1.0" PRODUCER_INSTITUTION_NAME = "UNIVERSITY OF ARIZONA" PRODUCER_ID = "UA" PRODUCER_FULL_NAME = "ALFRED MCEWEN, PRINCIPLE INVESTIGATOR, SARAH S. MATTSON, TECHNICAL CONTACT" PRODUCT_ID = "DTEEC_008669_1705_009025_1705_A01" PRODUCT_VERSION_ID = "1.0" INSTRUMENT_HOST_NAME = "MARS RECONNAISSANCE ORBITER" INSTRUMENT_HOST_ID = "MRO" INSTRUMENT_NAME = "HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT" INSTRUMENT_ID = "HIRISE" TARGET_NAME = "MARS" SOURCE_PRODUCT_ID = (PSP_008669_1705, PSP_009025_1705) RATIONALE_DESC = "Sulfates and valley system in Melas Chasma " SOFTWARE_NAME = "SOCET Set v.5.4.1.20090303" OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = "EQUIRECTANGULAR" PROJECTION_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: The EQUIRECTANGULAR projection is based on the formula */ /* for a sphere. To eliminate confusion in the */ /* IMAGE_MAP_PROJECTION object we have set all three radii, */ /* A_AXIS_RADIUS, B_AXIS_RADIUS, and C_AXIS_RADIUS to the same */ /* number. The value recorded in the three radii is the local */ /* radius at the center latitude on the Mars ellipsoid. That is, */ /* equatorial radius of 3396.190000 km and polar radius of */ /* 3376.200000 kilometers. Using the local radius of the */ /* ellipsoid implies that the MAP_SCALE and MAP_RESOLUTION are */ /* true at the center latitude. */ A_AXIS_RADIUS = 3396.036 B_AXIS_RADIUS = 3396.036 C_AXIS_RADIUS = 3396.036 COORDINATE_SYSTEM_NAME = PLANETOCENTRIC POSITIVE_LONGITUDE_DIRECTION = EAST KEYWORD_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: CENTER_LATITUDE and CENTER_LONGITUDE describe the location */ /* of the center of projection, which is not necessarily equal to the */ /* location of the center point of the image. */ CENTER_LATITUDE = -5.0 CENTER_LONGITUDE = 180.0 LINE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 26376 SAMPLE_FIRST_PIXEL = 1 SAMPLE_LAST_PIXEL = 8211 MAP_PROJECTION_ROTATION = 0.0 MAP_RESOLUTION = 58607.71638002 MAP_SCALE = 1.0113804322107 MAXIMUM_LATITUDE = -9.2737184447053 MINIMUM_LATITUDE = -9.7237459567128 EASTERNMOST_LONGITUDE = 283.3744507 WESTERNMOST_LONGITUDE = 283.2343445 LINE_PROJECTION_OFFSET = -543510.49999999 SAMPLE_PROJECTION_OFFSET = -6050328.5 END_OBJECT END gdalautotest-3.0.4/gdrivers/data/sombrero.grd0000644003401500001440000012264413614004466020731 0ustar rouaultusersCDF 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=>e/2*z{a<[w >;?8-I/B:72A=93QU^h]VJYaVI XWN*W'ZXCEYRT.H<4@CELTFOKJD0GGH+S)M5FU,P16|(^Q=UsOVZɓUOVSMϞ=陳gΜ9{*WVۤ}b{N"}[Bv$7B<<ۨ@ a_V%|*ٛHn^gp}z@}oPtbe!QZ{LwN۱Н h+\IιQg_NQQBň/-g}>+*˞8R֒\攱IX}UcNL0U3<ƿS{_^<}R#$#!]5#a{4Yy3E.kCƖCgu4y"P}┙ 0t\ \י91WF˞>v $+xITDn-TnoO݀W4YUq0ߟ} \6hA3$mOiLs=[J}*1R Y(.?Z*aǗ~dz [?zRGG ,ˤ#M|5VN1#|z2]g#]8wNj@Ёԭcfb>(^/$DMН95S7GI,07}0 !aYBYSt~s4_Mjzht\>Egd#kV.-ήi^m &`٪t %hYTEPW o3_`j\ap1Q2Cbh73 ًpw`DL\j=DL/\<:W\τg7p<2hh\pFL:yVZ.uh*r+ vy}W^,VlӬg&"sbsr;x炥;f4!6)5yÜx0ދ>(m䑝H*"XԗCtcuӷyOijcxR^җke!\~ٿ~#%dUQ9[َ6WNhQI]?Ʋ&xnBb}EqZa{,͛~ܗ~l{'Izy_iI}}uިr;!G3tPC|yU^2[.$ۇVޒu(h9(喣NIF=RLGӬݶ;cEÆos=-!O~SOasy|S|jW,ioaU[[1{k w5\jW<T[svm?}X{ن'OM<fu^UX?_Gp#* EqWS?N0ߣ*4*= (9!S{q8;qVCM 8ģLܾq m7?8B3*%M``r>LsG+@蛞3YyXqS݊!O!hW,ڰ;tF'/\vc87??a yO_h؍;R0&><0(n/9rAy7 ~u?;Д~)Qb23-ΒjߤA?1sd5NN M>4;Jyox}vOPM Ni!gN12MZh}xzM|ߚK6O7kqnu5HL3]7ցoW[m |m1ֈU?bMt]&aދYMϽ!~(8SQ٭x8:>^a$Ս([koqQ;jo^7O<-iOCœ9=ww3NʸjS<`m mPbH۷Ǹ]{O:̘4+nr7`;j ww;pWňiuzE`|Vaj}߷&ް_e ݆kffЄiRaTVW\@]NIAEGbCQSU@d @@@Z^@MFDXHL[YeOcKJB}޽{7nmEƝF6nT׶;nFoDvlkCvF6[}kt$.nD"G,Q3<ժ 7 T)C%p t)9wn|-LJO쀔V+Yb4X5ίgP{ sݞCC p>G>3ʗi{`nVD?d9/9_[@O3x;Gd_8AݳE><8fM/"Tƾ[\Lf`3=сfۓ_UDÐO|p>+ 5Q- ػr臿4 p򁜽q{bWsH?G&q\:5b/f2'W5iډ\TΈpq֠/)fT˧鉈ؖD./RE})sgp)?ެ~E[C}`f[w.製-jG/b|R̲gzq/^{2jxFO1%Qnp㿂i1 *5>ޝ^d>>FZ;n;]G ϩ>/Yvgts) F7kJŸq3bil6Kнl|(γl_n|fwkT_&ܶǫLjcU\- ib#}?c6FQŎPñt%LN"}~ƿ/AP/\;Fal8lECx"=%V Mt}˽Kcl1M>3"#3Om6t6{7])> /f?SzPX@,L\[x)dٞ:_J'BA>s3bOK_dzȟ{|sѷim|Cx |rVr9v-1J-( Ν JͬUjLc_n(3ONa' !8%(Xs4?'ud >e&kAc~\@}AM; jf;f?RgczK;\sp1HoI;73ZѺ虗 ɂq6hWbCoѽ7X.$5KjOXWn]d|jV7|m*u`oDa3߸Z1'Sx;ɋh[꼹G w91Zqyqo֑w'%GQ^.KouCA-(c7ӻo͌{sX__Ͼ9%Zi~HQn-[ҳkYsָs}h|ztu\KoS yH4z/`6+wxʣI9m ?ڲ߈4 :'\UJF_|@0kf0zI~o#W W Ď~: >y_[ ͂<9vS.\77j5G*]u'[R`[6 x ̣7O)GonkUz6ru 9Kb L[wY#ᅯ5_ȋ*J 2qَ-t1xR~ʵW#7_™U#caDՁ{^=svj|^im]۞G;9oSg!0 [yR?1b?NMN!ӟy릥ΰa2NǗ'q\c4ZL[^sJ*bp7-H C[Ax8'muw5!t*+`܀a >Rul7`r<ۨ^-tK .LkVK-trڍUt幪CZw Zxí P}%<`x_\DB]uGGۭgvj Qn\7ü 9{MoJ4(~Yi4aaR$q?$XNH.ˆLc5@Hb^,^w,{}T)ۢiԇaհ|H:>^3fY]- ظ,n *TmW}f}`ϭ8۩>~VKtW^\=D=B+ܗ+Oڵ'7lqS͎+йs~ڙwF" ۣmtkdi$#_E]~-Mȓ9[S#K%WԤLS ^~M:NLFEۭ,:몊pFMqڭ⹍~k xLnUcQzɇa݋#Vz1:-\g$':up~1:qOgWhn=w>nA&эXӜ}`o.ˤnq}WѾ,zw9sBhtnNE!}O\^x쇒]Rxٻb6r 60dnEw)ֹa6q!:,z>{8z?]DP>eC؟Ņ=Gl@ (>P8|$|, aP[iLz bIM/}ع>4/䶓,f/%Ŀ Q+e\nV-G1{=BK,-!.VġԱ,?5vq̊'\Otsǟ%#iF`_wYj杕.OM)xߒ%Z{skM*2WHԻU}b\L&E67σC->U^l˾# oD`Mw1a/|w+qѹ'$d%3^:< Fa?ۍm~:,KwH yU k"隭}bY/[VJYiD`` 4$sbp?^W(=u#(ȝqU wYci(e]f$e?~ҾnAM_OjΪ|Ώ*0 }@W/VsB;L*}X(=]z>:rs#4YJߑ4ﳬЧE3>YY7uBBPRPS#Y 'Q!ͭ&GWUYiGE\cƐGqb{3|."dhCzyeGw8}:\ z#:#E׍Nr2:{ ߇#Po>W_U~7 fD5Fx֋}" ΂ Ћ6"Z=hBx\-3E̯ k25+^xDr؃Q:9 u.o=+zƓ''ZW#VM4qm_t۫kct~[A>bE3G=yCcǙ#z/'7/׽CnwG CE^ebnD/u2*-w|l$?y=->w-fX}uOs6v yLϙYLğ=Z8_ C4Ϥ?^˥BŽǣ]/MǦ'{t]<9_D|kmo 3 ;]LK|__o0NR|j;}P63X({bo@#,QzKξЋe=_ܼd–1zwУ9OOOP?㖚G R|ՙuge}95- Jc-̪2B'm(s^5lfSpӞNGnOOI'W7f^[~XG~˖$*t| N=+RqLyzgJ>9}m,S!M26^Xl-vw )BĹi9nMz?6~0__|߽y"aכ͠ܯ6cnyti6鷋vhsIi[9LYJoY"fprdmv;N0c ME?l&7 Mp2 c!>A8;@S24=E<1?76:9qB 1:צWoϣV"XQaRASBXcVCFDT׽s[LJNʃZ;CRTD@X$@@YaWUGESQV,@@'@.@@@@@AFB@@ g2.pav"ޥ';Rb$W4Z}yZ DSabTCVREFYGBAQ1'.sqA@UPGmjgk)'"ClbfinQBeRohcdaA}DDDDDDDDDDDDDDDDDDDDDDDNDDe,E&Y {}hQ[qmIg;ZUKdG:߭ث?3gLQm%i6Ng=kn_C-bO&nM_m۳E42uy[DeDN 2ܬ ֙C 4I-MB#ͻ-X&|zgҭp2ymgn ,}/0͙[7A6gaFfz~/@4X;okd\;\Ra]^ 9i4ȾHhn8[rlNٍ`HPl%I">^vV\q.\!7$aA|h$y#$4'hZ~1 H:>+7h?yƺ^DQX%AbasY[lE!-s?=ݣWK*_obv &2˙m%D"_8H{7ݫ7jH.WR7 u2ZpT|fvnhpm kK3k$^lG.QKYY aibhkBjmoCnAcea(lfR$#!dg*0>?'+5P" 3Q m Z1Oەl;;d~:6S o^]:oW_`Y4ĉh-QjQܢAo:F)Vypsc_\#ř[6MřNrf4d/iX<x,ofq9Z O yw.S s8rO/-4-3ʜmm$asiaKz'n+ًdQ+{}aWGQpN͛`:V l;!3r yڦYQBشhҹn6aBw)khG{v{Z_iYyM-|yw4'.E;}= V4_lkecfDSjC/idRA+4,7(>h- "=e =yƆEsvV(z};z-wlk7f^iA`Qgf<51c1U~?\##nY8\CI[V\&0>EX$f,w[>66 R692mw;<>ъ/I؎쫦ɽ%_Lb#[}pd[tKd>8X-fasΖ҉cJd㎏zۧX01kؿ?10)I6I,'cilm~&*êmr,\Mݝou͏;ogNa8k_~#,fSqĊ0 赕6?ih5C2 1!"%+#9:&/4'jngcbAi-8BefRkmdaolQt[D5erR 1'#ssh3I٥gwv7uZ2$e'|6۶ąj57mgc1߱7qt}ri)?7s^_Ζs-vwåV6yIYz(03/?㵫Mb ;88ȷ}">Ymw!omVMأ/8pICޛ`~iDۥ8&оΰ;#߹g]pz6e2ݷo,] $MbL{MHVW6 nʗ7#(7m-曳/ 7i8Yǭm 'W۾Nbw7G}X&#Cgqi6_$Ç˵v2:,+1KuwÓce0~ͶHRpu6:\{+E$ gGHduoJqfy. ܲ-"/ m=:i-{"r)1S޳3{"M[LW| A@@16@Ac)eQTmRiSa.{wwwawGD@@  _jRnoUgm$+D" %CSWfdbQBieal#'khcTAQlgY"8^r=9"E%ZSg -6ϛ&4kyzOyP6DoG1t:6+HeD [HܯEbD*S-&$96̴99->,:=O9:\zOY Pz͆SbnS҉{ytRěvqJ-& s4nSS6M)O˭6β7hl>^7^K5(RγH%XvJkgyΏ$"hs%Gf:xMgS08 AYeAxF 5E;شtdj[2Cmn: EegpS̱mKe{u^/dN`iP[!Mʼn&7+6ۘi%pB6oC7-%l3JW<:b|>~u;:0 ý0{; w{{{?U_bdgaehQAc!nf?-kjiB7'&)*$,2m .#l%C3 IWoV\3RTx={܊ m}b/˭iuS$vҷ9WQ޺{XspRxNO}Eq9@+hӴon h%ɤPdQc5 22_(<"gckcq}?Gj%q'w Dɿ[+;'>[УGFI2f鿓_w$pۛ?0r$4dWDm6\ٯEAQ}DneۗghnfeS&+4R0o!B9?$-5*)(c# jidal/"kmgbQAydjߖKoL>4enrٛ 6ى6KO#if;x÷%7ɆF68ܲx*7[>\ RNrǩĢ[W,Vl)tTdz$ <NK߾Ӳu"tsr3ՔHm["uqd_ jy\>ENqYbO?ʶK7c;doL'o'Xܚ'L%S 'LL_>khx 7ڲɎ4ۧ[-F=X#xxG8tdž#om UclkCea2&.$"!:Ri#bdojmBnhgfAQ7dr7* 7dݵdN$mPt8眭C^?L_w]33?!3{+pl{s!f̎;zl=8f!sqZʏ7g>L jIgkz02b7ދK)ێf5܍4otyC7Kk^ qC9ϴ<[3Ycqxslqg:Z;ӳVۆ6sْ㵆:3 ^\K<$1.5*46YuKl=F~&K͎ZHR8)[^ٔu]A&yx ߺ7{ 3⦼[s?A̔i;~٨u΅6睿ƳґLu˺eлzpsK\$}X b:$$&[a&X.\[6,lȺ=n '$QA;.x;L#- nre1 5v->f-w>-]d(zIK ~JʦdJ3WmQrW|ь^Cʚ͚^4z4os ?9WxExs-˚kiMrY85NIݶ{s[-mU$ipkii#^mL'u@@ @@WDQCSAaTRBVUa0 ÔT;~vuϽYw0666664ogacdmkAQZYvO^a!0an*~.kfbe,QM$?|e}̀g-cd4jr< hB2(~HCEA,@J`bә"y"L,^,↑-#SyBGu2-wIӝ|߯g3j)?Qifef]Sɀ%vx:>rƤN>&wуM:w>9 7=wprELgXk5$n"g[kY:@"@@?m@@@B~@@=@@À@~ cQA5HC),!71BSl#'cdTmsf+3=@<a2ge>bn?nidkFUU:|tDZթMwկVYuZ4iҮN컻jҽtѥy6en״Fykeil&BzcY/6-4pg=kRnaj&QU*<^eo8ˀH>slbkE9,0fF?Amm[c/ŌwHG,;hQ=b@@-@8@e@@@@=@@?@q@?fTKAQIe B2laR?/=6g 耀";-)d4h~ej5UGUUՌ Ls7r{wmE'mWlamǢ{?1ٓ~}; LlC9E-bd5WQA\a2,u@B?$_hxX`_/ȓ=8O2£Ipf'O>'?@"3;@}@@@ @A5QOxa@B;8(c>fhg=n? 7AH GT~MQ:4;9?9@@@@!@&@@ۀh@>@VWہG@+@n@@@@G#X4A@3  ?%a>QAqm۶m۶m۶m۶m۶mNUUUUUUc@ @Ҁ@@@%@9@;Z@;@=@! @(@@@@}@EL{@@@>@D@߀@.WEL>@@@ w@ "@@ @ @*"@?@Ă@w[@ "A>@m>@ e @H@?+AJMme?bj̄n =a8@~I遀UQ#;/PbKSs3@>#\.?@?@Ar@]@ ~=@?@v@ @>@ &6@HbAM=1@Ѐy ?(:dAQ۶m۶m۶m۶yGm۶m۶mVMO@{@<Ás@g@@@$@>@ @@!Z@@ .P3@@V@e=@܁@@@@)k'YW!3dGn7icaj"gmQ<+Ah>lb=;@?z%#)eb ԀnZ}uAP'tC]\tuc[;$Eg-LKOnrNt&w[7s8s\Ow-LG@-fUkofg7{VN@5@*@Q@$@@@iJ@@%@I=@@@<6@@@@B0@?CB@@@@@@I@@@@@:F@LS$À=.CIagbQi6Ln3%7l>?A0,w`d!;<cApW,Z|iAtcfq6?lAaQb333333333333333333s{{{{{{{{{{{{-l27Q?BR,a~;Lˀ#-@{ƀ>退NA:{ M zAMQMcz;A?7hgQaf0b%njmeB/i4d5"k(.61$|z$Oߒ$I$ɗT璇3:v^^tvkG۽$I$@΂@}?@;@;@Ё@dR ' H7Q?RA?  @ 7B()dAQCq@R&O@=+<G\)nAs{g6<3ke*lmdf?! c>aTbdQA:DFc9>cgDq}DyQ;e{{ 79e$aA=k7?-"O@| gb> QAhH\~ 3ؙmMNlE-w'nO(@<@@@?@?@\ @@%?@@!a =@a@SP ,@HY QbacA~~~gdalautotest-3.0.4/gdrivers/data/4619old_truncated.dem0000644003401500001440000004164313614004466022244 0ustar rouaultusersRealWorld 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.0.4/gdrivers/data/int16.jp20000644003401500001440000000240213614004466017746 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrDuuidK=KCզII*   N@N@@A̞LA Wh )#NAD27 / UTM zone 11N|jp2cOQ)R IYiy\#"LLdEҗҗadKakadu-v3.4dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -0.0, 4.2e+02 -0.0, 4.2e+02 -0.0, 4.3e+02 -0.0, 4.4e+02 -32.0, 4.4e+02 -53.9, 4.5e+02 -63.2, 4.6e+02 -65.1, 4.8e+02 -67.0, 5.0e+02 -67.4, 5.5e+02 -68.8, 6.4e+02 -73.7, 8.0e+02 XK   ! >j0@ Š8`kB > @'YZ +4`"- H|~gl^:Ah~V~MPd jI|2T@ YOT\BREFRZ\U\d`tv=NY^MVV\?HJfXYKWSP]J\NM`P[Z[ZVn[URtTUOFYSVNTTYHUORNTKTURSYT[cd]\EVFJU|pVzvLYTLZTOU\ZHRZ`JLsSXmUXsVNkaLGrmfUMW]_[bbg@dX1:X|bn^F?orS%qbcL>_SrHJWbh]^X@MB?X\n.6RedE2*Vo\lxHWGgqd_`HTO@AnY][UYq^ynLjrbifh^SSRSXRTdQIX@lhJKaZoUOFV6Fezq_ddOLNQKMMQOPVPSZOKVV^EUaoKBbv niPr`ONkfPMY[XRtuoai_Zcg_hsiTX:?SRxvysiSZ^gW~jYR`s=1Fhrgu~|{ynv{uj\0gi0Aprmmj][PlL~WhHS3nos~xnz||jrsMrq_lq|khZ_Q/Icpd_LkbP2Ed]cV[HOTz^qtg_cd^JLQ\SMWazvrm6"nnhcVISSOOofV3VRHTB<_hhionpukjv`]SLV#/yi`ffgsbZW48^b}ijtqX7akhoipojsz}zY&KpVHWWIe\]n_1+CYjpwioM<`kikarnpptn8SRq]]VMPUOfKeyjPOvBPbUdbTGAgclerk_\B2[HiLXFF>Acs;3K^VGdSOc*GMTnUVovmRpjeojxT]VHkrqp{x|Wmojqi|xxptOvnvUhhd7ofKn__`hjucte_e`msptqWox~uhmnfAg]TYmsHUlv|xjoixrp~~mlg&+"Cy{u|gdA}q>Nbmruwg}tqqkaGohos{}]N8HRtlgqyiBPK@S^z}ysh Wswinclrp|&ntv{wz{pvfvsn|{wz|xr~}KxytwwxzvyyxxWtxw|Tv|py{x}syyL|{|yjhw}zyi}gr}y t{s|t}ttr|5{voxxv{xp{xq|R|}xhjw}p|uzpypwptstpxd}rx~wzuq{}||}snxxz}}wqt&yzuxwf{}tprpvmwsty}zsq l|oz|n|tyz{~u||uy}{{s~zm7hmd5bhxoyqrt|{|zyssޏvno_~uyE^qotpbXwpxetecpx~w~yɚZp{qzzOagyzlwutnqonyx|{toc]quqj~wzpvgtfrlontmtusv|w~blVUcQg{~}|gb_GzpchcyoZdriw}}~{upz|lqxpnktohc!}ycVewmnxek{~~fz|}unnkciiz}~x^pz|wvƓтg{uxv|{xOtriF~qsxj}l|pecȚ|pqpnlitanv{ghr~hxquuspr}zd}~{yi[ s|~|vtvuJ^՟wphlv|yyhuf^Azxu}zi\Y@@yzuw{wOspyptkqe tgi|peUGOr~|H_~bohW_%vg{xp{vs~q|ml{{ytq{c\yt~iW]~la|(z}eVvfcj{hqfhT^sZLysYma]iuh~tuxj~|nq}ebwz{|{xpn~~s~\itpuxotvzvx~|{uhsab vvurp}|v|]`ux~~uq\PgY1K}pѮsgqVݴ˭KvsNg~}xhsUh~jxsy\~ndll^vtRXcSQBoe|lutU!x~{sxjQ||G9~oqij}uwwB721wyxeg`zbinz|v}W2.(|mwwqqrMuvq~qm|wuI0-6WYmuD<710TwrWOjpT;652/gktruketpaoumƠf7521,Dwjvom``WUx}jt[rsx\X?4.,+'e{adgra\^\knzMkt}{A9)(&' wuyb@/,')'l?62/,,,uL6331.C6Yڟ͔bbv˻?5340+*'Ȯ~{mXoȝt{nzC763,%# $C-,6?=";="$%(!1'1' -:4#$""(#*+"CE,6 &*"P4$$&$'."& %  "" 7&!)1+ # " R$/$*/%9.+#%$"#9),&!.$A""$!/<)4& !'' %#! %)/(7)/" &1"$#&)$* %>*$ #"#".4% ""#&$%#+&&! 764( 5H@) &!%-0%8')!- &   *(@UR@$( &". !$'%*!! 6(%!N? ! /'!  ")(!#!( $&! # %1(5$!( #!#AM=:( C7'$>#"/#2GS9!1J)" -L(!'$ $1$'!".7CW9(#! ' !>'"$, '!3%+#(|I)"#%1 &(-'7G%&+@3W|[.% -  "+(+G7=(2!,3]?  "%''''! -,++)5!' KN*&!*#/#5)"&+/AH%$&"#*(!. R?3A4,;RPf8%!*" &"( ?4Z$)D%1BGH8P$9TT53!!$%#(*3 )! 'F&2+B@ U)F:C & (5!*0!" ";'()>'JA #:/%%.( #$4! %  1')%*@r19*+.CM"-.1'$,$ 0,+ 2&.fJ?.987?2:;$M,(+,5#$';G;4:1#3/1P&24.;565,J<@ ("*;$#$$(# /#7, ;775'%#)'(-+/1*)7 )C$%/ J,0("*,+;*  *I)A++21'-%+%,*%,54?;")/2%Q<*!-"$6- !04O6*4&.(),'()/<+)/441*3"#!"52A4E#Z)**b-$(+('9@*0441-3  2D #$4%%#9&"25,6+./0-&"(#-2$ '%("(-)5<8'7--./K9.4/="/743=:?33&* 3;78194+5#.@,-00,/.>)1 #++F8#=/!%&("%('05-9B)+66'/43001:!4GL6 L069:4&+!,53>+&93?3?=')>'/2552G=??;Mk/0K@ ")-2K?=B7,*: 1264033:~3P>E>CdQ1! 0B)N#,5( 1542B)5520,..gdalautotest-3.0.4/gdrivers/data/pds_3355.lbl0000644003401500001440000000703613614004466020340 0ustar rouaultusersPDS_VERSION_ID = PDS3 RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 15 FILE_RECORDS = 20 LABEL_RECORDS = 1 ^IMAGE = ("small.raw", 1) /* This file was manually modified substantially from the original to produce a small file demonstrating bug 3177's detached file with an offset */ OBJECT = IMAGE LINES = 20 LINE_SAMPLES = 12 BANDS = 1 CENTER_FILTER_WAVELENGTH = 1.000 BAND_STORAGE_TYPE = BAND_SEQUENTIAL OFFSET = 0.0 SCALING_FACTOR = 1.0 SAMPLE_BITS = 8 SAMPLE_TYPE = UNSIGNED_INTEGER LINE_PREFIX_BYTES = 3 END_OBJECT /* Identification Information */ DATA_SET_ID = "MRO-M-HIRISE-5-DTM-V1.0" DATA_SET_NAME = "MRO MARS HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT DTM V1.0" PRODUCER_INSTITUTION_NAME = "UNIVERSITY OF ARIZONA" PRODUCER_ID = "UA" PRODUCER_FULL_NAME = "ALFRED MCEWEN, PRINCIPLE INVESTIGATOR, SARAH S. MATTSON, TECHNICAL CONTACT" PRODUCT_ID = "DTEEC_008669_1705_009025_1705_A01" PRODUCT_VERSION_ID = "1.0" INSTRUMENT_HOST_NAME = "MARS RECONNAISSANCE ORBITER" INSTRUMENT_HOST_ID = "MRO" INSTRUMENT_NAME = "HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT" INSTRUMENT_ID = "HIRISE" TARGET_NAME = "MARS" SOURCE_PRODUCT_ID = (PSP_008669_1705, PSP_009025_1705) RATIONALE_DESC = "Sulfates and valley system in Melas Chasma " SOFTWARE_NAME = "SOCET Set v.5.4.1.20090303" OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = "EQUIRECTANGULAR" PROJECTION_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: The EQUIRECTANGULAR projection is based on the formula */ /* for a sphere. To eliminate confusion in the */ /* IMAGE_MAP_PROJECTION object we have set all three radii, */ /* A_AXIS_RADIUS, B_AXIS_RADIUS, and C_AXIS_RADIUS to the same */ /* number. The value recorded in the three radii is the local */ /* radius at the center latitude on the Mars ellipsoid. That is, */ /* equatorial radius of 3396.190000 km and polar radius of */ /* 3376.200000 kilometers. Using the local radius of the */ /* ellipsoid implies that the MAP_SCALE and MAP_RESOLUTION are */ /* true at the center latitude. */ A_AXIS_RADIUS = 3396.036 B_AXIS_RADIUS = 3396.036 C_AXIS_RADIUS = 3396.036 COORDINATE_SYSTEM_NAME = PLANETOCENTRIC POSITIVE_LONGITUDE_DIRECTION = EAST KEYWORD_LATITUDE_TYPE = PLANETOCENTRIC /* NOTE: CENTER_LATITUDE and CENTER_LONGITUDE describe the location */ /* of the center of projection, which is not necessarily equal to the */ /* location of the center point of the image. */ CENTER_LATITUDE = -5.0 CENTER_LONGITUDE = 180.0 LINE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 26376 SAMPLE_FIRST_PIXEL = 1 SAMPLE_LAST_PIXEL = 8211 MAP_PROJECTION_ROTATION = 0.0 MAP_RESOLUTION = 58607.71638002 MAP_SCALE = 1.0113804322107 MAXIMUM_LATITUDE = -9.2737184447053 MINIMUM_LATITUDE = -9.7237459567128 EASTERNMOST_LONGITUDE = 283.3744507 WESTERNMOST_LONGITUDE = 283.2343445 LINE_PROJECTION_OFFSET = -543510.49999999 SAMPLE_PROJECTION_OFFSET = -6050328.5 END_OBJECT END gdalautotest-3.0.4/gdrivers/data/ll.jp20000644003401500001440000007007513614004466017427 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrcasoclbl gml.datacasoclbl gml.root-instancecxml This file conforms to OGC document 05-047r3, the GMLJP2 Encoding Specification version 1.0.0. Created by LizardTech Geo Express. 42.0000000000 8.0000000000 50.0000000000 16.0000000000 English UTF8 BartholomewRaster1MSeries.xml Dataset tile Kenneth Gibson Collins Bartholomew Ltd Database Coordinator +44(0)141 306 3359 HarperCollins Publishers Ltd. (World Maps & Atlases), Westerhill Road, Bishopbriggs Glasgow Scotland G64 2QT kenneth.gibson@harpercollins.co.uk Originator 2006-06-23 NATO Geospatial Metadata Profile 1 2 Column 10507 0.000761 Row 10507 0.000761 Area true urn:x-ogc:def:crs:EPSG:6.12:4326 GCS_WGS_1984 EuropeRasterTile23.tif European Raster Tile 23 2006-06-20 Creation 2006-06-23 Revision Version 2 2006-06 EuropeRasterTile23.tif Kathryn Kelly Collins Bartholomew Ltd Custom Mapping Manager +44(0)141 306 3752 +44(0)208 237 4230 HarperCollins Publishers Ltd, World Maps & Atlases, Westerhill Road, Bishopbriggs Glasgow Scotland G64 2QT kathryn.kelly@harpercollins.co.uk Point Of Contact Jim Irvine Collins Bartholomew Ltd Head of Digital Resources and the Collins Newsroom +44(0)141 306 3305 HarperCollins Publishers Ltd, World Maps & Atlases, Westerhill Road, Bishopbriggs Glasgow Scotland G64 2QT jim.irvine@harpercollins.co.uk Point Of Contact Kenneth Gibson Collins Bartholomew Ltd Database Coordinator +44(0)141 306 3359 HarperCollins Publishers Ltd, World Maps & Atlases, Westerhill Road, Bishopbriggs Glasgow Scotland G64 2QT kenneth.gibson@harpercollins.co.uk Originator Digital Map This GeoTIFF represents one tile of the Collins European Raster dataset, published as Europe Scene. GMLJP2 3.1.1 This dataset is not intended to be used in conjunction with satellite navigation devices. Whilst every effort is made to ensure that the data is spatially accurate, features will have been deliberately offset and generalized to be represented at a nominal scale of 1:1,000,000. Hence, the data should not be used for determining the precise location of places or features. Collins Bartholomew data has gained a reputation for its accuracy in depicting place names and international boundaries. The status of nations, their names and their boundaries are shown in this data as they are at the time of publication, as far as can be ascertained. Where international boundaries are the subject of dispute it may be that no portrayal of them will meet with the approval of any of the countries involved. However, every reasonable attempt has been made to show where an active territorial dispute exists, and the data aims to be neutral and to represent the situation as it exists on the ground (de facto) at the time of publication. With regards to the spelling of place names, this data uses local name forms where these are in the Roman alphabet. These local name forms are those which are officially recognised by the government of the country concerned, usually as represented by its official mapping agency. This is a basic principle laid down by the United Kingdom government's Permanent Committee on Geographical Names (PCGN) and the equivalent United States Board on Geographic Names (BGN). License Intellectual Property Rights Other Restrictions License Intellectual Property Rights Other Restrictions NATO shall not use 'the Maps', which includes this data, for any use other than contemplated by the Agreement. No classification NATO Geospatial Metadata NATO Grid 1000000 English UTF8 boundaries imageryBaseMapsEarthCover transportation 8.00000000 16.00000000 42.00000000 50.00000000 PixelValue Thematic classification 0 0 10507 10507 x y 8.0003806986 49.9996193014 0.000761397164 0.000000000000 0.000000000000 -0.000761397164 gmljp2://codestream/0 Record Interleaved jp2cOQ)R IYiy\#"wvvvoongLgLgdPPPEWWWadKakadu-v6.0dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -47.8, 4.8e+02 -47.9, 5.1e+02 -48.6, 5.5e+02 -49.0, 6.1e+02 -49.7, 6.9e+02 -50.1, 8.0e+02 -50.5, 9.5e+02 -50.9, 1.2e+03 -51.5, 1.5e+03 -51.9, 1.9e+03 -52.2, 2.5e+03 -52.6, 3.3e+03 XS       +.( X.D/B!`\KPψ@jO ɋ*`1>NEޒN5D=;ؤ0i~CAyyRhX(fMڍ,k>_ڸyB"ۑ㹰L ^Rm]EݠWLvc`. /*5)W6jV 9WlD8`UF|[oc/$qzs <\oKπ"N\{ޔ&Ҷ _Ib:~*y">\nu&S0ϼ{Xt tR)}2 s{8Հ pnp%l@fԨ1/_tF[ +.dOHoHKQA넗ur؊T%ROTH]c&P(`I6 t ]ZZ4ݑjD1"qwvrR*AD z~KHJ)xSFn5k`Pyﮚ$E֌b/޽+BE-2h;^{V"-<)o(yC4pP(GG `@g_XACZm@|bFŰ9e TYE_yZ grp5VEQ n@ootbU7VW0友APB >9``c]Xf )iNl / cn5p` \*tsx\]]ƈ0L9C Ge\lo_xu2nf `t5̒pyX]V$5Vg2U,uR9(^VИճUq+sw3NOԁ" 6cΨ*U`z!?{tedoGjct +Z'q/㧄2<@k~]fJ%#TnxkQ3-Ī{q£6urCV8Z46(A㌟bMkhQu3Eˣ-IS4Zze nw3|UY/#T R@gB+aeg.WQom! M]{wsjh~J_)(zoj 2p#h&juDtO+!|#eu^#uSȲ{tV1BXz/hpf}T 2˃g8b)/D0g2yYh͌b_S6O$$oRQn zvg#,pUPDn59hE(^48D3Xul !W+2h}ƌR;&du۔p}"&yP$8tP,|.vBNY*&n4r~0w޽G :-!.b3NpN.g_ V6Qq +H[?Wq3|wϒ.Ǽv ]N#ЛBȫdۍzrbFEUVM_,ti+U5E0`3([(ߑk8 255 Red 0 Green 255 Blue 512 128 6.71089e+07 NearestNeighbour Byte bug6581_src.vrt 0.125 573452.527314628824,63.9710696713882214,0,4387441.90074732807,0,-63.9710696713883777 -8964.24790550457146,0.0156320662627165846,0,68584.7825163012749,0,-0.0156320662627165465 557056,128,0,4325376,0,-128 -4352,0.0078125,0,33792,0,-0.0078125 255 0 0 0 255 0 gdalautotest-3.0.4/gdrivers/data/byte.rasterlite.sql0000644003401500001440000000511613614004466022236 0ustar rouaultusers-- SQL RASTERLITE CREATE TABLE spatial_ref_sys (srid INTEGER PRIMARY KEY,auth_name,auth_srid,ref_sys_name,proj4text,srtext); INSERT INTO spatial_ref_sys VALUES(26711,'epsg',26711,'NAD27 / UTM zone 11N','+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs','PROJCS["NAD27 / UTM zone 11N",GEOGCS[NAD27,DATUM[North_American_Datum_1927,SPHEROID["Clarke 1866",6378206.4,294.9786982138982]],UNIT[degree,0.0174532925199433]],PROJECTION[Transverse_Mercator],PARAMETER[central_meridian,-117],PARAMETER[scale_factor,0.9996],PARAMETER[false_easting,500000],AUTHORITY[EPSG,26711]]'); CREATE TABLE geometry_columns (f_table_name,f_geometry_column,geometry_type,coord_dimension,srid,spatial_index_enabled); INSERT INTO geometry_columns VALUES('byte_metadata','geometry',3,2,26711,1); CREATE TABLE byte_rasters (id INTEGER PRIMARY KEY,raster); INSERT INTO byte_rasters VALUES(1,X'49492A00080000000B000001030001000000140000000101030001000000140000000201030001000000080000000301030001000000010000000601030001000000010000001101040001000000920000001501030001000000010000001601030001000000140000001701040001000000900100001C0103000100000001000000530103000100000001000000000000006B7B847384848C8484846B846B84846B7B739C9473846B7B9473A5738C6B7B7B63847B848484639C73848C847B738C6B8C73847B6B848473736B736B94847B7B7384847B737B737B6B73946B738C7384849C848C84847373737B947BA57B846B6B849C7BBDADAD949473947B6B8473849C637B738484CE6BC5AD948C8C8463847B738C848463847B84AD7B73947B9473947B8C7B6B7384736B73637B63B5636B7B7384737B847384847B7B846373637B8473736B8C8C638C63737B6B846B736B737B847B6B7B84848484847B63847B6B9463737B8CAD7B6B7B7B7B6B7B7B7B6B8C7B7B73735A6BAD6B6B6B6B63847B73AD94637B7B6B7B636BBDAD6B73736B638C6BAD8C9484846B7B6363736384638C73947B63847B948C8C6B8C5A6B736B5A637B7373737B7B9473946384A5949C7B6B6B6B738C637363636B7384735A7B73BDAD8C8CA573845A63735A63636B6384636B84849CB58CAD7B8463737B4A73637B8C9C84A58C8C63ADF7FFCE846B8C7B9484A5A5948C847B6B7B6B7BB5B59C949C9C9CB5849473846B6B6B6B6B73636B'); CREATE TABLE byte_metadata (id INTEGER PRIMARY KEY,tile_id,width,height,pixel_x_size,pixel_y_size,geometry POLYGON); INSERT INTO byte_metadata VALUES(1,0,20,20,60.0,60.0,X'0001576800000000000040E61A4100000000749C4C410000000000F91A4100000000CC9E4C417C0300000001000000050000000000000040E61A4100000000749C4C410000000040E61A4100000000CC9E4C410000000000F91A4100000000CC9E4C410000000000F91A4100000000749C4C410000000040E61A4100000000749C4C41FE'); CREATE VIRTUAL TABLE idx_byte_metadata_geometry USING rtree(pkid, xmin, xmax, ymin, ymax); INSERT INTO idx_byte_metadata_geometry SELECT rowid, ST_MinX(geometry), ST_MaxX(geometry), ST_MinY(geometry), ST_MaxY(geometry) FROM byte_metadata; gdalautotest-3.0.4/gdrivers/data/byte_rraster_ct_rgba.grd0000644003401500001440000000063113614004466023256 0ustar rouaultusers[georeference] nrows=20 ncols=20 xmin=440720 ymin=3750120 xmax=441920 ymax=3751320 projection=+proj=utm +zone=11 +datum=NAD27 +units=m +no_defs +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat [data] datatype=INT1U byteorder=little nbands=1 bandorder=BIL categorical=TRUE ratnames=idx:red:green:blue:alpha rattypes=integer:integer:integer:integer:integer ratvalues=0:1:10:11:20:21:30:31:0:255 gdalautotest-3.0.4/gdrivers/data/testtest.on90000644003401500001440000000211313614004466020675 0ustar rouaultusersNITF02.0003 TESTTEST.ON9 U 00000000000 0000000010990004790010006100000999999000000000001020900000086500000062000RPFHDR000480TESTTEST.ON9MIL-C-89038 19941006U l00000IMCADRG TESTTEST.ON9 U 0 0000153600001536INTRGB/LUT MAP 08RG 0M40.751 N 3000000B00060006025602560800100000000000000.6700102001RPFIMG00088 4 `@T @[3x@T(xT@XųW@S t@ZPSe@S,0@Wq00000gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/0000755003401500001440000000000013614004466022054 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/0000755003401500001440000000000013614004466023543 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/w001001x.adf0000644003401500001440000000045413614004466025322 0ustar rouaultusers' 2)*+,-./0       gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/vat.adf0000644003401500001440000000003013614004466025002 0ustar rouaultusersG?Qgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/hdr.adf0000644003401500001440000000046413614004466025000 0ustar rouaultusersGRID1.2?K?0bM?0bM@aC4Exgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/sta.adf0000644003401500001440000000003013614004466024777 0ustar rouaultusers@?}COSgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/prj.adf0000644003401500001440000000016213614004466025011 0ustar rouaultusersProjection GEOGRAPHIC Datum GDA94 Spheroid GRS80 Units DD Zunits NO Parameters gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/w001001.adf0000644003401500001440000001775613614004466025147 0ustar rouaultusers'   gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/teststa/dblbnd.adf0000644003401500001440000000004013614004466025436 0ustar rouaultusers@bj~3V@bvȴ9X3lgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/0000755003401500001440000000000013614004466023007 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc.dir0000644003401500001440000000216413614004466024257 0ustar rouaultusersTESTSTA.BND ARC0000  XXStj637jĴMDj8djMM WWW4M+xCj=ejMM8 tMM8 tM !tM M!t)!tD $MosjM$MsjM , WļhMM8 tM !tMM!tTESTSTA.STA ARC0001  XXStj637jĴMDj8djMM WWW4M+xCj=ejMM8 tMM8 tM !tM M!t)!tD $MosjM$MsjM , WļhMM8 tM !tMM!tTESTSTA.VAT ARC0002  XXStj637jĴMDj8djMM WWW4M+xCj=ejMM8 tMM8 tM !tM M!t)!tD $MosjM$MsjM , WļhMM8 tM !tMM!tgdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0002.nit0000644003401500001440000000044013614004466024570 0ustar rouaultusersVALUE   T2\INFO\arc.dir  COUNT   T2\INFO\arc.dir  gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0002.dat0000644003401500001440000000012013614004466024541 0ustar rouaultusers../teststa/vat.adf gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0001.dat0000644003401500001440000000012013614004466024540 0ustar rouaultusers../teststa/sta.adf gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0001.nit0000644003401500001440000000110013614004466024561 0ustar rouaultusersMIN  T2\INFO\arc.dir  MAX   T2\INFO\arc.dir  MEAN  T2\INFO\arc.dir  STDV  T2\INFO\arc.dir  gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0000.nit0000644003401500001440000000110013614004466024560 0ustar rouaultusersXMIN   YMIN    XMAX   YMAX   gdalautotest-3.0.4/gdrivers/data/aigrid_sta_24bytes/info/arc0000.dat0000644003401500001440000000012013614004466024537 0ustar rouaultusers../teststa/dblbnd.adf gdalautotest-3.0.4/gdrivers/data/multi_type.rl20000644003401500001440000063000013614004466021205 0ustar rouaultusersSQLite format 3@ t-$I~ytoje`[UOIˁʁ Ɂ~xtpmiea]ZVROK}GxCq?l<e8`4[1T-N)I%B!=60+#    rW5oKepsghWNAD27 / UTM zone 11N+proj=utm +zone=11 +datum=NAD27 +units=m +no_defsPROJCS["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"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],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"]] !|X7lI)b@!! 4bit_tilesgeometryhW ' 4bit_sectionsgeometryhW! 2bit_tilesgeometryhW ' 2bit_sectionsgeometryhW! 1bit_tilesgeometryhW ' 1bit_sectionsgeometryhW% double_tilesgeometryhW"+ double_sectionsgeometryhW# float_tilesgeometryhW! ) float_sectionsgeometryhW # int32_tilesgeometryhW! ) int32_sectionsgeometryhW % uint32_tilesgeometryhW" + uint32_sectionsgeometryhW# int16_tilesgeometryhW!) int16_sectionsgeometryhW% uint16_tilesgeometryhW"+ uint16_sectionsgeometryhW! int8_tilesgeometryhW ' int8_sectionsgeometryhW# uint8_tilesgeometryhW!) uint8_sectionsgeometryhW :"oUF-|b!4bit_tilesgeometry'4bit_sectionsgeometry!2bit_tilesgeometry'2bit_sectionsgeometry!1bit_tilesgeometry'1bit_sectionsgeometry%double_tilesgeometry+double_sectionsgeometry#float_tilesgeometry)float_sectionsgeometry #int32_tilesgeometry )int32_sectionsgeometry %uint32_tilesgeometry +uint32_sectionsgeometry #int16_tilesgeometry)int16_sectionsgeometry%uint16_tilesgeometry+uint16_sectionsgeometry!int8_tilesgeometry'int8_sectionsgeometry#uint8_tilesgeometry) uint8_sectionsgeometry  ]--mtablegeome]--mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid), CONSTRAINT ck_gc_rtree CHECK (spatial_index_enabled IN (0,1,2)))?S-indexsqlite_autoindex_geometry_columns_1geometry_columns++[tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT NOT NULL DEFAULT 'Unknown', proj4text TEXT NOT NULL, srtext TEXT NOT NULL DEFAULT 'Undefined') I--Etableraster_coveragesraster_coveragesCREATE TABLE raster_coverages ( coverage_name TEXT NOT NULL PRIMARY KEY, title TEXT NOT NULL DEFAULT '*** missing Title ***', abstract TEXT NOT NULL DEFAULT '** ?S-indexsqlite_autoindex_raster_coverages_1raster_coverages &33stablespatial_ref_sys_auxspatial_ref_sys_auxCREATE TABLE spatial_ref_sys_aux ( srid INTEGER NOT NULL PRIMARY KEY, is_geographic INTEGER, has_flipped_axes INTEGER, spheroid TEXT, prime_meridian TEXT, datum TEXT, projection TEXT, unit TEXT, axis_1_name TEXT, axis_1_orientation TEXT, axis_2_name TEXT, axis_2_orientation TEXT, CONSTRAINT fk_sprefsys FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))A 4bit 2bit 1bit double float int32 uint32 int16 uint16int8 uint8* missing Abstract ***', sample_type TEXT NOT NULL DEFAULT '*** undefined ***', pixel_type TEXT NOT NULL DEFAULT '*** undefined ***', num_bands INTEGER NOT NULL DEFAULT 1, compression TEXT NOT NULL DEFAULT 'NONE', quality INTEGER NOT NULL DEFAULT 100, tile_width INTEGER NOT NULL DEFAULT 512, tile_height INTEGER NOT NULL DEFAULT 512, horz_resolution DOUBLE NOT NULL, vert_resolution DOUBLE NOT NULL, srid INTEGER NOT NULL, nodata_pixel BLOB NOT NULL, palette BLOB, statistics BLOB, geo_minx DOUBLE, geo_miny DOUBLE, geo_maxx DOUBLE, geo_maxy DOUBLE, extent_minx DOUBLE, extent_miny DOUBLE, extent_maxx DOUBLE, extent_maxy DOUBLE, strict_resolution INTEGER NOT NULL, mixed_resolutions INTEGER NOT NULL, section_paths INTEGER NOT NULL, section_md5 INTEGER NOT NULL, section_summary INTEGER NOT NULL, is_queryable INTEGER, red_band_index INTEGER, green_band_index INTEGER, blue_band_index INTEGER, nir_band_index INTEGER, enable_auto_ndvi INTEGER, CONSTRAINT fk_rc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid)) ?@B@L@O@P@R@?@8@(@@(@@@?@?J::*98@9=?@B@J@N@P@c@J:73*98@9=@B@J@N@P@O@>@7@&@@(@@@?@??J:C*98@9=@B@J@N@P@O@>@7@&@@(@@@?@??J:#P*98@9=@B@J@N@P@O@>@7@&@@(@@@?@??J:M*98@9= !EdP%7= ,  int16*** missing Title ****** missing Abstract ***INT16DATAGRIDDEFLATEd<@7@&@@(@@@?@??J:*98@9=@B@J@N@P@O@>@7@&@@(@@@?@??J:2*98@9=@B@J@N@P@O@>@7@&@@(@@@?@??J:**98@9=  $7= * 4bit*** missing Title ****** missing Abstract ***4-BITGRAYSCALEDEFLATEd<.{iXF6' ! 1bit_tiles#1bit_levels' 1bit_sections% double_tiles'double_levels+ double_sections# float_tiles%float_levels) float_sections# int32_tiles%int32_levels) int32_sections% uint32_tiles'uint32_levels + uint32_sections # int16_tiles %int16_levels ) int16_sections %uint16_tiles'uint16_levels+uint16_sections ! int8_tiles#int8_levels' int8_sections# uint8_tiles%uint8_levels) uint8_sections ] MX byte5b76bd92a47de21ab2263a317e0b139c+x}SR0MAv,bB 2rh$,_Ulm|޾[J?re > nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cyCREATE TABLE "idx_int8_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)#!!tableint8_tilesint8_tiles"xաn0 PT*褀i`pp_wTZAA@rnAߋP[k{"y%%C pph#!++}tableuint16_sectionsuint16_sectionsECREATE TABLE "uint16_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON)X ''otableuint16_levelsuint16_levelsDCREATE TABLE "uint16_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE) ))Stableint8_tile_dataint8_tile_dataACREATE TABLE "int8_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_int8_tile_data" FOREIGN KEY (tile_id) REFERENCES "int8_tiles" (tile_id) ON DELETE CASCADE):mkDjzȱ}ӑn<9#nM/CS'b=:S/}r!r)Jg'uۜ/C;0$LwS?ÜW/Fɶ|ր"|րx֡r0 P. dp78 kAA@=$H-ů6 ץ 8Gcv2n%KWi[1S"GuG疧 -~p.k*u*u޲JaQqy|?v|<:;ߦkLuYl/[(:(9.Ͻ!'K= OcCS^~4Pɠ+  <@7@&@@(@@@?@??J:C*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd` ;W;31%%%%tableuint16_tilesuint16_tilesLCREATE TABLE "uint16_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_uint16_tiles_section" FOREIGN KEY (section_id) REFERENCES "uint16_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_uint16_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "uint16_levels" (pyramid_level) ON DELETE CASCADE)5$SSQtableidx_uint16_sections_geometry_parentidx_uint16_sections_geometry_parentKCREATE TABLE "idx_uint16_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)-#QQEtableidx_uint16_sections_geometry_rowididx_uint16_sections_geometry_rowidJCREATE TABLE "idx_uint16_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)&"OO;tableidx_uint16_sections_geometry_nodeidx_uint16_sections_geometry_nodeHCREATE TABLE "idx_uint16_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   rr Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd` ` )--_tableuint16_tile_datauint16_tile_dataQCREATE TABLE "uint16_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_uint16_tile_data" FOREIGN KEY (tile_id) REFERENCES "uint16_tiles" (tile_id) ON DELETE CASCADE),(MMKtableidx_uint16_tiles_geometry_parentidx_uint16_tiles_geometry_parentPCREATE TABLE "idx_uint16_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)$'KK?tableidx_uint16_tiles_geometry_rowididx_uint16_tiles_geometry_rowidOCREATE TABLE "idx_uint16_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)&II5tableidx_uint16_tiles_geometry_nodeidx_uint16_tiles_geometry_nodeMCREATE TABLE "idx_uint16_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   U`V"nx-RAЖ .+H$WHŁ .qYɷUὪ용IMլ:jS]mPvi}2DC-EJY-Β|&UqѼ+'(۳T,ޥWyEe{[~Y:%>^OkVuZuzyU'6uv;DSn˶Wˀ`v?4{}SC]MPOk]%zKԻ*pۿv\R DYɶ:":xءA+nȑXZ$o'˺]!@FF.nm${ TMS3L~:2)C:}H/s^r昻[R9'Sv},5:/ES U>}+ΊyߓW9op[|goӗ1[_w]/л>R9 Ho| rQ?TO]L8V=x;z *~Q.[]%O?YNzso[70NlяfcO}71\sK  < nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy@7@&@@(@@@?@??J:#P*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   KKc*/##tableint16_tilesint16_tiles\CREATE TABLE "int16_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_int16_tiles_section" FOREIGN KEY (section_id) REFERENCES "int16_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_int16_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "int16_levels" (pyramid_level) ON DELETE CASCADE)2.QQOtableidx_int16_sections_geometry_parentidx_int16_sections_geometry_parentZCREATE TABLE "idx_int16_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)!1II=tableidx_int16_tiles_geometry_rowididx_int16_tiles_geometry_rowid^CREATE TABLE "idx_int16_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)0GG3tableidx_int16_tiles_geometry_nodeidx_int16_tiles_geometry_node]CREATE TABLE "idx_int16_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB) ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   T@X4''otableuint32_levelsuint32_levelscCREATE TABLE "uint32_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)3++Ytableint16_tile_dataint16_tile_dataaCREATE TABLE "int16_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_int16_tile_data" FOREIGN KEY (tile_id) REFERENCES "int16_tiles" (tile_id) ON DELETE CASCADE))2KKItableidx_int16_tiles_geometry_parentidx_int16_tiles_geometry_parent_CREATE TABLE "idx_int16_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) U`V"nx-RAЖ .+H$WHŁ .qYɷUὪ용IMլ:jS]mPvi}2DC-EJY-Β|&UqѼ+'(۳T,ޥWyEe{[~Y:%>^OkVuZuzyU'6uv;DSn˶Wˀ`v?4{}SC]MPOk]%zKԻ*pۿv\b DYɶ7"7xءA+nȑXZ$o'˺]!@FF.nm${ TMS3L~:2)C:}H/s^r昻[R9'Sv},5:/ES U>}+ΊyߓW9op[|goӗ1[_w]/л>R9 Ho| rQ?TO]L8V=x;z *~Q.[]%O?YNzso[70NlяfcO}71\Bc8  < nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy@7@&@@(@@@?@??J:M*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA IMMQI$;KK?tableidx_uint32_tiles_geometry_rowididx_uint32_tiles_geometry_rowidnCREATE TABLE "idx_uint32_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER):II5tableidx_uint32_tiles_geometry_nodeidx_uint32_tiles_geometry_nodemCREATE TABLE "idx_uint32_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)19%%%tableuint32_tilesuint32_tileskCREATE TABLE "uint32_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_uint32_tiles_section" FOREIGN KEY (section_id) REFERENCES "uint32_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_uint32_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "uint32_levels" (pyramid_level) ON DELETE CASCADE),<MMKtableidx_uint32_tiles_geometry_parentidx_uint32_tiles_geometry_parentoCREATE TABLE "idx_uint32_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) 99D H2HJdJd`   LRR"x١rAݹCFc 818pa#dڞꚛݫ1=ӻ[ޏ؎x1b?ۗ#nG\k2s~uS-8Ո݈:pF\tz._2L~גiٿz.=T M}3?gE5Of<9`Jj;yZ`7|m_fuZjf^wzWcߑ!5n?jѾy>g[@:%%mtableint32_levelsint32_levelssCREATE TABLE "int32_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)=--_tableuint32_tile_datauint32_tile_datapCREATE TABLE "uint32_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_uint32_tile_data" FOREIGN KEY (tile_id) REFERENCES "uint32_tiles" (tile_id) ON DELETE CASCADE)!"!x!oAde-DԕX,H$z'v^vR{K~evv.k̛}Z;/zL\={婁ǐ?y^u~}:9_}: c@oz|?M-1ڬ+ǫ=t\Mwmz|}[s=)j/o:&dmp15. uBXk[tkM{5&|ik'?kz<ݖZ'T-\ف|mrJƅ~r=A}']nb\,\|j  < nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy@7@&@@(@@@?@??J:*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd` KZKC*C##tableint32_tilesint32_tiles{CREATE TABLE "int32_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_int32_tiles_section" FOREIGN KEY (section_id) REFERENCES "int32_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_int32_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "int32_levels" (pyramid_level) ON DELETE CASCADE)2BQQOtableidx_int32_sections_geometry_parentidx_int32_sections_geometry_parentzCREATE TABLE "idx_int32_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)*AOOCtableidx_int32_sections_geometry_rowididx_int32_sections_geometry_rowidyCREATE TABLE "idx_int32_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)#@MM9tableidx_int32_sections_geometry_nodeidx_int32_sections_geometry_nodewCREATE TABLE "idx_int32_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd` cG++Ytableint32_tile_dataint32_tile_dataCREATE TABLE "int32_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_int32_tile_data" FOREIGN KEY (tile_id) REFERENCES "int32_tiles" (tile_id) ON DELETE CASCADE))FKKItableidx_int32_tiles_geometry_parentidx_int32_tiles_geometry_parentCREATE TABLE "idx_int32_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)!EII=tableidx_int32_tiles_geometry_rowididx_int32_tiles_geometry_rowid~CREATE TABLE "idx_int32_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)DGG3tableidx_int32_tiles_geometry_nodeidx_int32_tiles_geometry_node|CREATE TABLE "idx_int32_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   LRR"x١rAݹCFc 818pa#dڞꚛݫ1=ӻ[ޏ؎x1b?ۗ#nG\k2s~uS-8Ո݈:pF\tz._2L~גiٿz.=T M}3?gE5Of<9`Jj;yZ`7|m_fuZjf^wzWcߑ!5n?jѾy>g[@:婁ǐ?y^u~}:9_}: c@oz|?M-1ڬ+ǫ=t\Mwmz|}[s=)j/o:&dmp15. uBXk[tkM{5&|ik'?kz<ݖZ'T-\ف|mrJƅ~r=A}']nb\a  < nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy@7@&@@(@@@?@??J:2*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   GGb+M##tablefloat_tilesfloat_tilesCREATE TABLE "float_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_float_tiles_section" FOREIGN KEY (section_id) REFERENCES "float_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_float_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "float_levels" (pyramid_level) ON DELETE CASCADE)3LQQOtableidx_float_sections_geometry_parentidx_float_sections_geometry_parentCREATE TABLE "idx_float_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)"OII=tableidx_float_tiles_geometry_rowididx_float_tiles_geometry_rowidCREATE TABLE "idx_float_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)NGG3tableidx_float_tiles_geometry_nodeidx_float_tiles_geometry_nodeCREATE TABLE "idx_float_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB) ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   S>YR''otabledouble_levelsdouble_levelsCREATE TABLE "double_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)Q++Ytablefloat_tile_datafloat_tile_dataCREATE TABLE "float_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_float_tile_data" FOREIGN KEY (tile_id) REFERENCES "float_tiles" (tile_id) ON DELETE CASCADE)*PKKItableidx_float_tiles_geometry_parentidx_float_tiles_geometry_parentCREATE TABLE "idx_float_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) ==8R*"'x=SAE,D-BBPp-6h_N,¯ *6EB0sIl.<01 IL&8>GL'WU2ռ*oej}"Lk?ZzoN#.f1 .]]֭{=j8#0w-_b/2{{5\k/{svkӾ?|]Ϣ[a\j?ܾǏ{kl?x:kh2}}PpvJ?f;m\Xnf}pj[a4n[loGYю0>: ?G={I98PYG{0W`INɶ;R3";R3/xڽjAs,HF A,,-1| [_^AP0."*6XsYwbi!,~ g~B3x8XElTy _z};E;~4؍C>oj).[^ 9_#Ww??ƵCW~] >+Ofq/ѹVٿW}ޟi5P{9?DZ!>VL9 Peob 3՗YuWYecVGߌU?m~kW}C~awF|#߬03?g\!x? ]'PFXa^d&,/ڻ^w0n?ow'rkX cO//uq  < nI.bp%`3˝V#% z|+qpm5`0 6RwQQ\%LQ]Q2Fkk^TR@NCHUְ"ġ@XةYa^}3 АVKY2m0|KE4Tq,B\Hbc:3]f@cy@7@&@@(@@@?@??J:**Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`   ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA HIIPH%YKK?tableidx_double_tiles_geometry_rowididx_double_tiles_geometry_rowidCREATE TABLE "idx_double_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)XII5tableidx_double_tiles_geometry_nodeidx_double_tiles_geometry_nodeCREATE TABLE "idx_double_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)2W%%%tabledouble_tilesdouble_tilesCREATE TABLE "double_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_double_tiles_section" FOREIGN KEY (section_id) REFERENCES "double_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_double_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "double_levels" (pyramid_level) ON DELETE CASCADE)-ZMMKtableidx_double_tiles_geometry_parentidx_double_tiles_geometry_parentCREATE TABLE "idx_double_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) 99D H2HJdJd`    "xݍ@`s@!zp)[BtBu7܅!gV#O}/]?= 4l oog]''ytable1bit_sections1bit_sectionsCREATE TABLE "1bit_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON)S\##ktable1bit_levels1bit_levelsCREATE TABLE "1bit_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)[--_tabledouble_tile_datadouble_tile_dataCREATE TABLE "double_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_double_tile_data" FOREIGN KEY (tile_id) REFERENCES "double_tiles" (tile_id) ON DELETE CASCADE)K(D{4gUDN?}ۡ?/۽m7m{/\8?~0mmɶ {" {x[00ǀ/!lA!t F 5riS4|qΏ8I{c_w~O˰kWf(S;~>}8yƿͯu]W~ɰW>ۺD௭_C)=Y_~<<֛z cmޔC۫y?{~xg[+NۇO^?x_#G~W"u'S;~/[?/~:t)"A|`5?ܺ`jKZgb z c<}#O1|n`i_@g}gyUv6\ uy xgڱm[[|۾nR=@/{p5?||7|6ˬp 't/,b  << k MT,1bitb7b5c2be72f0a150b2c057885b71b9ec+x}SR0~MAv,bҔdBrT`IY.O*6I}ve*u˕5$04U&ܯgËά]ܣP3|6AkͣE [kU-`e_%;TVm&ORg)xj REznRg|'upm5:aAmnGar2EAtMEM4][U rBj HA) aafy1o@CZ3:.E2ʴhWгt4fݯo?0S@cqJwYz4ݠxsx Ὗ\q!=$'@7GJ:vĆ*Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd` W\WO$a!!table1bit_tiles1bit_tilesCREATE TABLE "1bit_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_1bit_tiles_section" FOREIGN KEY (section_id) REFERENCES "1bit_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_1bit_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "1bit_levels" (pyramid_level) ON DELETE CASCADE)0`OOMtableidx_1bit_sections_geometry_parentidx_1bit_sections_geometry_parentCREATE TABLE "idx_1bit_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)(_MMAtableidx_1bit_sections_geometry_rowididx_1bit_sections_geometry_rowidCREATE TABLE "idx_1bit_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)!^KK7tableidx_1bit_sections_geometry_nodeidx_1bit_sections_geometry_nodeCREATE TABLE "idx_1bit_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   ss  Wh@AtLAA̞LA|@AtLAAtLAA̞LA@A̞LA@AtLA 99D H2HJdJd`  e  e))Stable1bit_tile_data1bit_tile_dataCREATE TABLE "1bit_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_1bit_tile_data" FOREIGN KEY (tile_id) REFERENCES "1bit_tiles" (tile_id) ON DELETE CASCADE)'dIIGtableidx_1bit_tiles_geometry_parentidx_1bit_tiles_geometry_parentCREATE TABLE "idx_1bit_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)cGG;tableidx_1bit_tiles_geometry_rowididx_1bit_tiles_geometry_rowidCREATE TABLE "idx_1bit_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)bEE1tableidx_1bit_tiles_geometry_nodeidx_1bit_tiles_geometry_nodeCREATE TABLE "idx_1bit_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)   `B"  x  Om7w ɶ d  ::2(iMMAtableidx_2bit_sections_geometry_rowididx_2bit_sections_geometry_rowidCREATE TABLE "idx_2bit_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)!hKK7tableidx_2bit_sections_geometry_nodeidx_2bit_sections_geometry_nodeCREATE TABLE "idx_2bit_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)g''ytable2bit_sections2bit_sectionsCREATE TABLE "2bit_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON)Sf##ktable2bit_levels2bit_levelsCREATE TABLE "2bit_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)  99D   WWe$k!!table2bit_tiles2bit_tilesCREATE TABLE "2bit_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_2bit_tiles_section" FOREIGN KEY (section_id) REFERENCES "2bit_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_2bit_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "2bit_levels" (pyramid_level) ON DELETE CASCADE)0jOOMtableidx_2bit_sections_geometry_parentidx_2bit_sections_geometry_parentCREATE TABLE "idx_2bit_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)mGG;tableidx_2bit_tiles_geometry_rowididx_2bit_tiles_geometry_rowidCREATE TABLE "idx_2bit_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)lEE1tableidx_2bit_tiles_geometry_nodeidx_2bit_tiles_geometry_nodeCREATE TABLE "idx_2bit_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)  99D   VFSp##ktable4bit_levels4bit_levelsCREATE TABLE "4bit_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE) o))Stable2bit_tile_data2bit_tile_dataCREATE TABLE "2bit_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_2bit_tile_data" FOREIGN KEY (tile_id) REFERENCES "2bit_tiles" (tile_id) ON DELETE CASCADE)'nIIGtableidx_2bit_tiles_geometry_parentidx_2bit_tiles_geometry_parentCREATE TABLE "idx_2bit_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)    ;0tOOMtableidx_4bit_sections_geometry_parentidx_4bit_sections_geometry_parentCREATE TABLE "idx_4bit_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)(sMMAtableidx_4bit_sections_geometry_rowididx_4bit_sections_geometry_rowidCREATE TABLE "idx_4bit_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)!rKK7tableidx_4bit_sections_geometry_nodeidx_4bit_sections_geometry_nodeCREATE TABLE "idx_4bit_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)q''ytable4bit_sections4bit_sectionsCREATE TABLE "4bit_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON) 99D    Ni iVNwGG;tableidx_4bit_tiles_geometry_rowididx_4bit_tiles_geometry_rowidCREATE TABLE "idx_4bit_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)vEE1tableidx_4bit_tiles_geometry_nodeidx_4bit_tiles_geometry_nodeCREATE TABLE "idx_4bit_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)$u!!table4bit_tiles4bit_tilesCREATE TABLE "4bit_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_4bit_tiles_section" FOREIGN KEY (section_id) REFERENCES "4bit_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_4bit_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "4bit_levels" (pyramid_level) ON DELETE CASCADE)'xIIGtableidx_4bit_tiles_geometry_parentidx_4bit_tiles_geometry_parentCREATE TABLE "idx_4bit_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) 99D    V+Fjh+~AACtableidx_int8_sections_geometryidx_int8_sections_geometryCREATE VIRTUAL TABLE "idx_int8_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)|CCEtableidx_uint8_sections_geometryidx_uint8_sections_geometryCREATE VIRTUAL TABLE "idx_uint8_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)w{55tableElementaryGeometriesElementaryGeometriesCREATE VIRTUAL TABLE ElementaryGeometries USING VirtualElementary()az%%tableSpatialIndexSpatialIndexCREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex() y))Stable4bit_tile_data4bit_tile_dataCREATE TABLE "4bit_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_4bit_tile_data" FOREIGN KEY (tile_id) REFERENCES "4bit_tiles" (tile_id) ON DELETE CASCADE)}==?tableidx_uint8_tiles_geometryidx_uint8_tiles_geometryCREATE VIRTUAL TABLE "idx_uint8_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) Jk*J!EEGtableidx_uint32_sections_geometryidx_uint32_sections_geometryCREATE VIRTUAL TABLE "idx_uint32_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)==?tableidx_int16_tiles_geometryidx_int16_tiles_geometryCREATE VIRTUAL TABLE "idx_int16_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)CCEtableidx_int16_sections_geometryidx_int16_sections_geometryCREATE VIRTUAL TABLE "idx_int16_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)??Atableidx_uint16_tiles_geometryidx_uint16_tiles_geometryCREATE VIRTUAL TABLE "idx_uint16_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)!EEGtableidx_uint16_sections_geometryidx_uint16_sections_geometryCREATE VIRTUAL TABLE "idx_uint16_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax);;=tableidx_int8_tiles_geometryidx_int8_tiles_geometryCREATE VIRTUAL TABLE "idx_int8_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) I&IgCCEtableidx_float_sections_geometryidx_float_sections_geometryCREATE VIRTUAL TABLE "idx_float_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)==?tableidx_int32_tiles_geometryidx_int32_tiles_geometryCREATE VIRTUAL TABLE "idx_int32_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)CCEtableidx_int32_sections_geometryidx_int32_sections_geometryCREATE VIRTUAL TABLE "idx_int32_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)??Atableidx_uint32_tiles_geometryidx_uint32_tiles_geometryCREATE VIRTUAL TABLE "idx_uint32_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)! EEGtableidx_double_sections_geometryidx_double_sections_geometryCREATE VIRTUAL TABLE "idx_double_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) ==?tableidx_float_tiles_geometryidx_float_tiles_geometryCREATE VIRTUAL TABLE "idx_float_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) R&RjAACtableidx_2bit_sections_geometryidx_2bit_sections_geometryCREATE VIRTUAL TABLE "idx_2bit_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) ;;=tableidx_1bit_tiles_geometryidx_1bit_tiles_geometryCREATE VIRTUAL TABLE "idx_1bit_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) AACtableidx_1bit_sections_geometryidx_1bit_sections_geometryCREATE VIRTUAL TABLE "idx_1bit_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax) ??Atableidx_double_tiles_geometryidx_double_tiles_geometryCREATE VIRTUAL TABLE "idx_double_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)> 5j5;;=tableidx_4bit_tiles_geometryidx_4bit_tiles_geometryCREATE VIRTUAL TABLE "idx_4bit_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)AACtableidx_4bit_sections_geometryidx_4bit_sections_geometryCREATE VIRTUAL TABLE "idx_4bit_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax);;=tableidx_2bit_tiles_geometryidx_2bit_tiles_geometryCREATE VIRTUAL TABLE "idx_2bit_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)gdalautotest-3.0.4/gdrivers/data/BAND6.DAT0000644003401500001440000000000013614004466017504 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/gmljp2_dtedsm_epsg_4326_axes.jp20000644003401500001440000001647513614004466024273 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdryycolr+asoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 120 120 x y 33.9962809917355 43.0037190082645 0 0.00827134986225895 -0.00827134986225895 0 gmljp2://codestream/0 Record Interleaved jp2cOQ)yyyyR IYiy\#"궼LLdEҗҗadKakadu-v6.0dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -68.7, 5.4e+02 -69.7, 5.9e+02 -71.2, 6.7e+02 -72.0, 7.7e+02 -72.8, 9.2e+02 -73.9, 1.1e+03 -74.6, 1.4e+03 -75.2, 1.8e+03 -76.1, 2.4e+03 -76.9, 3.2e+03 -77.9, 4.3e+03 -256.0, 5.9e+03 ,XU$  1   ).3(7#9;PM@z2#"!9H.&!Vx'-jq@@9g@^@`@@A.r ]`z mr'0źHa] n@>;V@ɥ1KA\ eɀR_@ vɝ򁺜#M v}Nk&C{T.&W {F(Je7Fnb6 ` _߰=,ȔlK\K ;arh$̉)Ǫ@頪|ue;GwiX 2lj@_37x̣Emd (>y L"ʨUWXvT-ٔ4ęG P4Cn ~.] J!Qݥ3wLnK|fzlV _hp/n ʪbmVHQ%k?ó% _eWLk ,uN\DqA92Lfu>IkrX8!I%a: Q/MUtY=L9N[ oV.OOfwwWsve[9<ϯb܆b#w\:~PjW5g}|Ş}bwp\̙!Xb0ޔ.C Vr2aI`]'^ U?SL!yAkB>r=7Ĵtṡ[(z\p\)_"KCK83})3ZdžDApC8D.TX_Qw\)ٳ90=Z eeujzN! @EP⃤{m ʋj{A@O_"y^ C7泗,mTic2tkoVf]SlVm(ÃN7Jp<g P3Bs<+c]I-MUT(UZ5*?vB{MF C@~K` #~Ʃ诠}*Z!:6vv!+[T{5\x f?[yb<"F?isSVOlTm xC,U#Li-/IZ2k-dp _>ҰEGZµ4}[#$c̀I|7հ?݉uD/GkjXP)e~s{{5PV']*f'jZҰxp(`KDg_GYGp,1 gPL$f^<1b"3s#3Qo2R9kX@rXoV|tf%3ܛ3xz$ldžkUH4Q۪1.Z[cUN(H08d,[ˊSg(`e0.x:[$ ƱMa1' h3[cr_ʷKeZ)֧HJ`duc [+ПJmhҌ/PKwt4 74=n  (T|6!=0[(Y *f@xm4R!4@x8@X^W3MD9p֙;4=}ToQ6(;zKB_{3U8 rEJ~|HwhipP~N:V[n?yɻ2k Co%=#a;Ad!U#cDö=EgLMe3|-BW/'''M\FGJҦcaſY$ 6T#~ݶuGն`X]%?Nz(Vd?vXYt-.Fm(yywU pGF`$ RWi+o]$i)(h?JK7f(#(:meNݭ>$D{ M9%ѢzlsV?_2Bo&c:ɵ;\e<|fK­z`!mLr_b*trc"Y?OJ js'v}i ?gA䖡lqm/)./{HuILqॽ]|MSR97_hT>A.bY]l&GrO|sOZsHʀP7)~ǺOUaJm]&3͂&* ]S"ynfzZzGMN0UIH|Rƒo<6o>v'&jLFZFBGp?Dr2Vu"y9 ټ{f {{LW:\zWt uq]/ %<0]zxN8+WI(,/~!a$xʎ *G)'M㸃 O |$/ZCX#Lu{(;=u M yA4ܽS$7gT\1 S5eTJ 1P)lzM.RHԤ>2sl1q{*V) XVNBpؔԲ&a=AYэ$@=90 qY MC&;P \ɬNӏ IP<Ɩ哛O."tg_&Bc$2HӆF{h!U3-ɀ`Gk]Z| /=FE^By85 O.Pm@<<0B>YjN>]GmRQ=Z.tִ Ո=>s`H+۞2溬2jJLds!ߎg=#F${K|VN\Ds'-B,]#[emL' rls:sn ?)ܘQJ>z^4m՘_z }ᳬrLuֱAM= }dNNAtsiȧJl>ǬI5K PV"փeRRKZ+ iW4K| {'&[uC{ @@ u9$[ٙ!|C0A;hp bAA|).ɰ`f4V .8VB=`oQHf0Bж]SD8*e 5/2=yB9hr56^20B/g)50Bkmp:_9(O,cG/g;Ӂ͆#NaK /E2[5}OYg&?Mn_Ee;Zg&V̚8)Ԣe\n.pP(шOZއQ;aRT^,58\ t.I#W? ХsPo9r &G+xr<(#3U'WѺgEHv)۲fՙQ]+m:&-i a8ؿ(i3踣-9CS?V|1@AWʴrV$ImIȇ 3ğ*(ߛU&EG!z"KoÃ˕r۟\ugdalautotest-3.0.4/gdrivers/data/byte_2gcps.jp20000644003401500001440000000074013614004466021051 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolr uuidK=KCզII*  @A̞LA4@4@AtLAjp2cOQ)R \Bg8gPgPghPPPGWWWb ) <&DBYZ I|gdalautotest-3.0.4/gdrivers/data/w0y13a4t.0120000644003401500001440000000000013614004466020100 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/ehdr10.hdr0000644003401500001440000000015613614004466020156 0ustar rouaultusersncols 321 nrows 2 cellsize 2500.000000 xllcorner -17973801.662435 yllcorner 2041811.701239 byteorder msbfirst gdalautotest-3.0.4/gdrivers/data/frmt28.cot0000644003401500001440000015271013614004466020231 0ustar rouaultusers dΐeieȢiso[RRTsKRQ1xN5xE5n?1eER`ZZk}xwsT=sT9ZxT*J^Ӯkik{soӈs^HJo՘nö`ⶁȠ`9JswowJ}-'W{f5n-$]ьowskiZiViZVRiZ}bxRsZD]=RzRkwgȌӌxs{k^wgoVx]^xis{wko`esxsxgsVs5}Aso=nw5euEVNMubiroxuAI&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >2!!!!!!!Q _7<s{q/ " 2UioLo)* *i81uC>>> gdalautotest-3.0.4/gdrivers/data/netcdf-4d.nc0000644003401500001440000001051413614004466020465 0ustar rouaultusersCDF levelist longitude latitude time  ConventionsCF-1.5 levelist  long_namepressure_levelunits millibarsT longitude  standard_name longitude long_name longitudeunits degrees_eastaxisX(\latitude  standard_namelatitude long_namelatitudeunits degrees_northaxisY(time  standard_nametimeunitshours since 1900-01-01 00:00:00calendarstandardt  _FillValue latitudeunits degrees_northaxisY(time  standard_nametimeunitshours since 1900-01-01 00:00:00calendarstandardt  _FillValue @ @@A AHApAAABBBBBBBBBBA*@A*LA*XA*dgdalautotest-3.0.4/gdrivers/data/float32.prj0000644003401500001440000000064713614004466020370 0ustar rouaultusersPROJCS["NAD_1927_UTM_Zone_11N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_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]] gdalautotest-3.0.4/gdrivers/data/cf_nasa_4326.nc0000644003401500001440000004457713614004466021005 0ustar rouaultusersHDF  I`OHDR "   __NCProperties7version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.4scienceKڪ (OHDR " grids6@OHDR " data!"imagingGeometry3*e1OHDR " latitude  longitude'tempi2crs6.rOCHKK . ConventionsCF-1.7 .titleSimple CF fileRZOHDR ! < 0CLASSDIMENSION_SCALEnp4zt\OCHKoKDoOCHK `NAME@This is a netCDF dimension but not a netCDF variable. 15hOHDR  ! , 0CLASSDIMENSION_SCALEnF5nOCHK4 N longitudec%OCHK `NAME@This is a netCDF dimension but not a netCDF variable. 11OHDR !  0CLASSDIMENSION_SCALE n<-OCHK O latitudeCube(wOCHK `NAME@This is a netCDF dimension but not a netCDF variable. 7,ŠOHDR !  0CLASSDIMENSION_SCALEK nV=+,4OCHK M  longitudeCube ǮOCHK `NAME@This is a netCDF dimension but not a netCDF variable. 5)?OHDR !  0CLASSDIMENSION_SCALE n;4dOCHKlatitude heightsCube _OCHK `NAME@This is a netCDF dimension but not a netCDF variable. 4_%OHDR    ||< -units degrees_north 0 long_namelatitude 0standard_namelatitude PDIMENSION_LISTWW"GCOLc(  c   (  ( OCHK tREFERENCE_LISTdatasetdimension  H PI۶m$۶M$ $$@$ A۶MA$AmA۶AAH8(` AAAH ;E Fq@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@OHDR     || , ,units degrees_east 1 long_name longitude 1standard_name longitude PDIMENSION_LISTOCHK tREFERENCE_LISTdatasetdimension ']OHDR "  latitudeCube+  longitudeCubew- heightsCube/ lookAngleo9crs,F]OHDR    ||A  -units degrees_north 0 long_namelatitude 0standard_namelatitude PDIMENSION_LIST#OCHK tREFERENCE_LISTdatasetdimension +9>OHDR    ||]  ,units degrees_east 1 long_name longitude 1standard_name longitude PDIMENSION_LIST6OCHK tREFERENCE_LISTdatasetdimension w-OHDR    ||q  &unitsmeters * positiveup . long_nameheight Hstandard_name height_above_reference_ellipsoid PDIMENSION_LIST.)OCHK tREFERENCE_LISTdatasetdimension /Ø,?OHDR (   ?@4 4  ( P _FillValue ?@4 4 !unitsK 7standard_nameair_temperature + grid_mappingcrs `DIMENSION_LISTL3OCHK tREFERENCE_LISTdatasetdimension  i2oOCHK tREFERENCE_LISTdatasetdimension 'i2YOHDR G   % Bgrid_mapping_namelatitude_longitude `longitude_of_prime_meridian ?@4 4 Psemi_major_axis ?@4 4@TXA Xinverse_flattening ?@4 4mtr@ ecrs_wktEGEOGCS["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"]]Z#OHDR /8 ?@4 4 ,>` P _FillValue ?@4 4 'unitsdegrees Estandard_namelook_angle_or_elevation_angle + grid_mappingcrs pDIMENSION_LIST  @ܐOCHK tREFERENCE_LISTdatasetdimension /o9ɧOCHK tREFERENCE_LISTdatasetdimension +o9OOCHK tREFERENCE_LISTdatasetdimension w-o9$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OHDR G   % Bgrid_mapping_namelatitude_longitude `longitude_of_prime_meridian ?@4 4 Psemi_major_axis ?@4 4@TXA Xinverse_flattening ?@4 4mtr@ ecrs_wktEGEOGCS["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"]]gdalautotest-3.0.4/gdrivers/data/stateplane.vrt0000644003401500001440000000214413614004466021270 0ustar rouaultusers PROJCS["NAD_1983_StatePlane_Ohio_South_FIPS_3402_Feet",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-82.5],PARAMETER["Standard_Parallel_1",38.73333333333333],PARAMETER["Standard_Parallel_2",40.03333333333333],PARAMETER["Latitude_Of_Origin",38.0],UNIT["Foot_US",0.3048006096012192]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Gray small.raw 0 1 31 LSB gdalautotest-3.0.4/gdrivers/data/fl73n003_alt_truncated.img0000644003401500001440000003070013614004466023155 0ustar rouaultusersCCSD3ZF0000100000001NJPL3IF0PDSX00000001 PDS_VERSION_ID = PDS3 /* FILE FORMAT AND LENGTH */ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 3184 FILE_RECORDS = 4 LABEL_RECORDS = 2 /* POINTERS TO START RECORDS OF OBJECTS IN FILE */ ^IMAGE_HISTOGRAM = 3 ^IMAGE = 4 /* POINTER TO THE TABLE CONTAINING ORBIT LOCATIONS */ ^TABLE = "73N003OR.TAB" /* IMAGE DESCRIPTION */ DATA_SET_ID = "MGN-V-RDRS-5-DIM-V1.0" PRODUCT_ID = "78N018" SPACECRAFT_NAME = MAGELLAN SPACECRAFT_ID = MGN INSTRUMENT_NAME = "RADAR SYSTEM" INSTRUMENT_ID = RDRS TARGET_NAME = VENUS START_TIME = "N/A" STOP_TIME = "N/A" SPACECRAFT_CLOCK_START_COUNT = "N/A" SPACECRAFT_CLOCK_STOP_COUNT = "N/A" PRODUCT_CREATION_TIME = 1993-09-28T15:55:50 IMAGE_ID = FL73N003 MISSION_PHASE_NAME = {"MAPPING CYCLE 1", "MAPPING CYCLE 2", "MAPPING CYCLE 3"} /* DESCRIPTION OF OBJECTS CONTAINED IN FILE */ OBJECT = IMAGE_HISTOGRAM ITEMS = 256 DATA_TYPE = LSB_UNSIGNED_INTEGER ITEM_BYTES = 4 END_OBJECT = IMAGE_HISTOGRAM OBJECT = IMAGE LINES = 1 LINE_SAMPLES = 3184 SAMPLE_TYPE = LSB_UNSIGNED_INTEGER SAMPLE_BITS = 8 SAMPLE_BIT_MASK = 2#11111111# CHECKSUM = 938107697 SCALING_FACTOR = 0.2 OFFSET = -20.2 MISSING_CONSTANT = 7 NOTE = " DN = 5 * (MIN(MAX(RV ,-20),30) + 20) + 1, where RV = specific radar cross-section divided by the Muhleman Law value, SIGMA0(THETA) = 0.0118 COS(THETA) / ((SIN(THETA) + 0.111 COS(THETA))**3) where THETA is the scattering angle." END_OBJECT = IMAGE OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = SINUSOIDAL MAP_RESOLUTION = 1408.1316 MAP_SCALE = 0.075 MAXIMUM_LATITUDE = 74.00000 MINIMUM_LATITUDE = 71.99000 EASTERNMOST_LONGITUDE = 6.01243 WESTERNMOST_LONGITUDE = 0.00000 LINE_PROJECTION_OFFSET = -104202.7422 SAMPLE_PROJECTION_OFFSET = -7837.6538 A_AXIS_RADIUS = 6051.00 B_AXIS_RADIUS = 6051.00 C_AXIS_RADIUS = 6051.00 FIRST_STANDARD_PARALLEL = "N/A" SECOND_STANDARD_PARALLEL = "N/A" POSITIVE_LONGITUDE_DIRECTION = EAST CENTER_LATITUDE = 0.00000 CENTER_LONGITUDE = 18.00000 REFERENCE_LATITUDE = "N/A" REFERENCE_LONGITUDE = "N/A" LINE_FIRST_PIXEL = 1 SAMPLE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 1 SAMPLE_LAST_PIXEL = 3184 MAP_PROJECTION_ROTATION = 0.00000 VERTICAL_FRAMELET_OFFSET = 1 HORIZONTAL_FRAMELET_OFFSET = 6 END_OBJECT = IMAGE_MAP_PROJECTION END ,    '$'<>HK:*9N\y1aZ x )5zFXpLu6"o7,ao)b}PEgqb ^ĉ&ibA~KY6h|QZ:$b`/4oԌzkrhNcg[ UPKFJC>:\5U4o0-+'$[#7!1; F(~ a , 0 S H~`c6"zT:D*/G@H5/(#  c_YXYY[[VU[[WWWRNNUYZ_ca[W`baVMY[WV___]\b^_XX^a`\[Z[ZVYZY[\]\YXOJSYVY]\WW_`XQVZVZSNMLQUQQRXWSZfij_UNTY[ZWWVYYXY`ceoe\[UTVblusjaaZ^\[\[Z\ZVSXWRPY[XSPRMLSUVOZ_`a^ZYZ\]ddb^\`fdZ^q{vk\RWZ\_`ZVYadga[WW[\YNOV][OAHJW]\[RQZ\V]bccchcZX]q{{sebad_bfe__ksyvmedgjdc^V[\[NSYYY\\[[ZTLNQRLQXWWSPW\`baZXWTX]a]]`cfhjjjh`VY_^^_\[OJS]fjijkmhcbhd^ZY_]VX[ab]YUTTVUQIRSOSUcnrqdOHW]`b\_][X_kw|viWV`a\[\\X[bdcYVZ\^dd^[gqplu}m]]_]\RWX[SRX^cb`^]WUX_ggaYV]\b\URQXZXbjk`ZZ[Z__[VOLSWSSUSTXUZ_^Ya\WYaiid``^[VZYXNKHJSYZVONS]c^XXUOUamrsmbZTXbhke]RNNR\aa^afjf_SWZZUZ_ecbccckpnd^`dedaXXXZ_bd`SMT[bef\YZ_djkojlghjb^Zagg`U]abaa_^a_YQTUTRUXTVXZ[^\YXYVNRVZ\XVTU\egg\ST_eedffejmponhedgmpmZXfhf^]][entnd\jtv|~m^]__hmjdceihcc`ab___ac_XRPU]`ZRTWYZY[`dd^XQSUX\]]WZaaa\\]XQR_hjaURVUabbaeq{xosmghe_\YZ]_hptqi`\TPX^[XX]bcd\UTS]ad_\fzr^Y\_adhkh_UU]\Z]flhaY]dgfhjjfbXPORX^`aelol`_dmnfcbcaa\RT\\[Tbyuhjkkpohbeheba`XTWS^haXUY\ZSKOWVPV\\_^`^WNU]^\[]__]VRSWY[ZU^bb_^[Za_^\`beffa]bk|qaTT^ec_inkkfd^\Y[^_V[blkgikhhh`XZ_[RUbgaUYZXUWY`fkihd\]ae_[ao}|l\]`dhfbbce]epwvodb^jytf`ZZ[eqtn`\\[Y`gfeca``_UUT]``[YVW[^USX]db^[_^ZSSUWVUW]`ZSOXYVX[Z\^]]bjmid]ZYYXY^`^dklleYU\adekpomied][\d_]Y\]`_[Z_db^bjif^]bc___ZTKRVV[b^[WYZ]\\Z[]_ddgee_cegf]Y`f`\WZahjidbaZX]aad`ckldadeb`dcdcc^^ZWVRV\]ZXad__^[XTTX]elf`XXZVZXXZ]aZZ[`acb_ZZ[[Z[Z[X\\^`]XURV\^\YWW[TQQRX]^cgffhgf`beedb`^[XVZ\\YTSRUY\cb[beb\cdabjkgfc_[STWXUVYbdiggfllk^XaiecbYYSVY\^^^ZXbdbba]VUYNSZglhe^YRQSX\dbYS\a_dpyzrhqxyk[_cca_ZTU\agpvxqf[fgdcfgc]WTO_kqpqspc_[Z\\XTV_cc__a_ZZ^]Ybgc`_cbfieZLMRW]a][^cjiaflkhnolkiggfc]ZSRajja_[QT\aec[QNP_joljgfb[^cc`Zajqpj`^\YYXXYWY]jnqmhb`gjheinmheacb`aed`bjoqwxusy~~|vmlqsqi`kquptz~ytuuqhhffdfllfhhc`[X[^a`[_`bb\\aifd]`cdegib`_\[WV_edZVVRMW^\badf`WGBEQZ_\\]gkmlmkpqnlhebbehqpha`^^X^b`fqwwpclqrldTq}|mosrosqrx}qaWVZjnqmga\ajpqf^ZXTV]bdcb_ahhcbjprjf_[[WX[XVQQUbfc[`^UXaeca_][bfefiedgfa_bdbgikppcZYaed_efigihdY_ilj`^YdklkjcYTVU^aakxho{te`YQUehlliosrqrmbhijjmrqlkjhfbemkkinkmjbb\hmqsspgkrrnkchfbaempnjfYX^]X_dn|q_Ydoutlnkgptsngdigfinsvukbhlmggiicdfqpjdbbkzwokkjjbc`krrt|zpdZetsp{skcY_dfd_ULRXW]aaZSZZTWZZUQUY]\[[][Y[Zahmuunc\ab_]ZTZ\`[[bglfXRVX\[VWggeab^Z]cabq~wuvz~snszqdb]XNFINKOMO\l{|th[[^^\^`ca^[^fpvvpker|uebaefd]]be^_ahjgeabgjkjkkie^[_a`fjhda\dihb\UVVUY[RWbdacc_WZekg_ac`[QTW\dba]\dfb_hlchifdcYW^cdc`afnqjbggkkjjcijqz}xrfbnzvtz{xupkikf`_jstwxukjgghllieb_VOX`bb[VS[^d`mzzrh]\ab_^`egd\Yacbfirv}|zxsgerroir|pdfr|}yxvppw~zz{{{dlpspjdejnocefjpjghknedksurgcdebfjkkrsqqqy~vsslmjdeeq{}xrnruvvocbjnrqliou}xnghkmlqrtpmtw|ywuxplfiddbjqmhgijhdmrsmhda^bmnkifmmlhkqtsjfe_[``b`eefeda_]hnom[Z[]eiklifhiijlif^`dc]\ekljopme__cgklprmhlknqqkebhejmpnqxy|~zuw}{vsmjlqrsqsqnrwvrg_`eb`fhlicbehhlonmoostminpsogkwwige]^ef`Z_egekomggje_bhic\gr{~ywxwohhgb`ix}wsqusngbabjztwxo`hjlgddggd`b\WRVPSVae_W]ac\\^\]adfeaa]]cdcc[Z[][Y]`^[ZWhlvzvjo|rb[X][[]egcfbaahgaZVY^_cc`a\`db\[X]d_Zcilnj]Zhv}wkgmnmgfcnsorvle^caZ[cmrlda^^_^aa\_eig\`hkgeeghcbdacfdefc^\XTMKQURMT[XTV]`dekhcab_Z\\^[_`[WVZab_WQNLVgqpmg`ZX^_a]X\]^\]SRYZUY[ejlg_bdcc]egjcaa_YSXZ^\__Z`dda`YWRV]_ZRTTZYYXX[\_cihc\\^_cdYU_eZPZaa[YW]][YYYXZaa]af`Y[_^`gnmkd[\XUY_aWJSXUYbkkcZ[^_elmkkelmnkectyxnjjoqsuwxyusnywrjhntqhagdalautotest-3.0.4/gdrivers/data/114p01_0100_deme_truncated.dem0000644003401500001440000002046213614004466023416 0ustar rouaultusers 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.0.4/gdrivers/data/nonsquare_nad27_utm11.vrt0000644003401500001440000000204313614004466023163 0ustar rouaultusers 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.0.4/gdrivers/data/load_postgisraster_test_data.sh0000755003401500001440000001130313614005376024670 0ustar rouaultusers#!/bin/bash # If you are working in a Linux/Mac environment, execute this script with "sh load_postgisraster_test_data" # # TODO: a Python version of this script, to have a system-independent script # # Load test data in PostGIS # # NOTE 1: raster2pgsql doesn't allow WKT Raster tables (raster_columns, # raster_overviews) and data tables in different schemas. If you want to store # your data in a different schema from the schema where WKT Raster tables are, # you'll have to change the sql files generated by raster2pgsql by hand. # # NOTE 2: The execution of psql calls will ask you for the password of the user # USER_NAME. If you want to avoid this, you'll have to modify the PostgreSQL # configuration file (pg_hba.conf) to allow the user "trust" authentication # method. See http://www.postgresql.org/docs/8.4/interactive/auth-pg-hba-conf.html # CHANGE THIS TO MATCH YOUR ENVIRONMENT SQL_OUTPUT_FILES_PATH=/tmp/gdal-autotest-pgraster if test "$DATABASE_NAME" = ""; then DATABASE_NAME=autotest fi if test "$DATABASE_SCHEMA" = ""; then DATABASE_SCHEMA=gis_schema fi SCRIPT_DIR=$(dirname "$0") case $SCRIPT_DIR in "/"*) ;; ".") SCRIPT_DIR=$(pwd) ;; *) SCRIPT_DIR=$(pwd)/$(dirname "$0") ;; esac echo psql -d $DATABASE_NAME -c "DROP SCHEMA $DATABASE_SCHEMA CASCADE" psql -d $DATABASE_NAME -c "DROP SCHEMA $DATABASE_SCHEMA CASCADE" psql -d $DATABASE_NAME -c "CREATE SCHEMA $DATABASE_SCHEMA" mkdir -p "$SQL_OUTPUT_FILES_PATH" raster2pgsql -l 2,4,8 -t 100x100 -s 26711 -I -M $SCRIPT_DIR/utm.tif $DATABASE_SCHEMA.utm > "$SQL_OUTPUT_FILES_PATH/utm_level2-8.sql" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/utm_level2-8.sql" # Out-db support is not working in WKT Raster right now (August 17th 2009). To allow out-db rasters in AddRasterColumns function, you must change # the $WKTRASTER_SRC/rt_pg/rtpostgis.sql code, comment lines 532 - 535 (verify out_db), and execute rtpostgis.sql again in the same database #psql -d $DATABASE_NAME -f $SQL_OUTPUT_FILES_PATH/utm_outdb_level1.sql raster2pgsql -l 2,4,8 -t 40x20 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world > "$SQL_OUTPUT_FILES_PATH/small_world_level2-8.sql" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2-8.sql" raster2pgsql -l 2 -t 40x40 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_noid > "$SQL_OUTPUT_FILES_PATH/small_world_level2_noid.sql" raster2pgsql -l 2 -t 40x40 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_serial > "$SQL_OUTPUT_FILES_PATH/small_world_level2_serial.sql" raster2pgsql -l 2 -t 40x40 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_unique > "$SQL_OUTPUT_FILES_PATH/small_world_level2_unique.sql" raster2pgsql -C -l 2 -t 40x40 -s 4326 -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_constraint > "$SQL_OUTPUT_FILES_PATH/small_world_level2_constraint.sql" raster2pgsql -C -l 2 -t 40x40 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_constraint_with_spi > "$SQL_OUTPUT_FILES_PATH/small_world_level2_constraint_with_spi.sql" raster2pgsql -C -l 2 -R -t 40x40 -s 4326 -I -M $SCRIPT_DIR/small_world.tif $DATABASE_SCHEMA.small_world_outdb_constraint > "$SQL_OUTPUT_FILES_PATH/small_world_outdb_constraint.sql" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2_noid.sql" psql -d $DATABASE_NAME -c "ALTER TABLE $DATABASE_SCHEMA.small_world_noid DROP COLUMN rid" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2_serial.sql" psql -d $DATABASE_NAME -c "DROP SEQUENCE small_world_serial_serialid_sequence" psql -d $DATABASE_NAME -c "\ ALTER TABLE $DATABASE_SCHEMA.small_world_serial ADD COLUMN serialid integer; \ UPDATE $DATABASE_SCHEMA.small_world_serial SET serialid = rid; \ ALTER TABLE $DATABASE_SCHEMA.small_world_serial DROP COLUMN rid; \ CREATE SEQUENCE small_world_serial_serialid_sequence INCREMENT 1 START 51; \ ALTER TABLE $DATABASE_SCHEMA.small_world_serial ALTER COLUMN serialid SET DEFAULT nextval('small_world_serial_serialid_sequence'::regclass);" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2_unique.sql" psql -d $DATABASE_NAME -c "\ ALTER TABLE $DATABASE_SCHEMA.small_world_unique ADD COLUMN uniq integer; \ UPDATE $DATABASE_SCHEMA.small_world_unique SET uniq = rid; \ ALTER TABLE $DATABASE_SCHEMA.small_world_unique DROP COLUMN rid; \ ALTER TABLE $DATABASE_SCHEMA.small_world_unique ADD UNIQUE (uniq);" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2_constraint.sql" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_level2_constraint_with_spi.sql" psql -d $DATABASE_NAME -f "$SQL_OUTPUT_FILES_PATH/small_world_outdb_constraint.sql" rm -rf "$SQL_OUTPUT_FILES_PATH" gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/0000755003401500001440000000000013614004466017503 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/ABC3X1UC/VAT.ADF0000644003401500001440000000003013614004466020442 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/ABC3X1UC/W001001X.ADF0000644003401500001440000000015413614004466021017 0ustar rouaultusers' 62gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/PRJ.ADF0000644003401500001440000000024113614004466020447 0ustar rouaultusersProjection UTM Zone 55 Datum GDA94 Spheroid GRS80 Units METERS Zunits NO Yshift 10000000.0 Parameters gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/STA.ADF0000644003401500001440000000004013614004466020440 0ustar rouaultusers@?? gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/DBLBND.ADF0000644003401500001440000000004013614004466020736 0ustar rouaultusers@?gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/W001001.ADF0000644003401500001440000000016613614004466020672 0ustar rouaultusers' ;gdalautotest-3.0.4/gdrivers/data/ABC3X1UC/HDR.ADF0000644003401500001440000000046413614004466020440 0ustar rouaultusersGRID1.2 ?   $VAL lD x|N@Nc өccO cc??gdalautotest-3.0.4/gdrivers/data/test_pdf_composition_outline.pdf0000644003401500001440000000550113614004466025060 0ustar rouaultusers%PDF-1.6 % 3 0 obj << /Name (foo) /Type /OCG >> endobj 4 0 obj << /Name (bar) /Type /OCG >> endobj 5 0 obj << /Contents 6 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 7 0 R /Type /Page /UserUnit 1 >> endobj 6 0 obj << /Length 8 0 R >> stream endstream endobj 8 0 obj 0 endobj 7 0 obj << >> endobj 9 0 obj << /Contents 10 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 11 0 R /Type /Page /UserUnit 1 >> endobj 10 0 obj << /Length 12 0 R >> stream endstream endobj 12 0 obj 0 endobj 11 0 obj << >> endobj 22 0 obj << /Count 9 /First 13 0 R /Last 21 0 R /Type /Outlines >> endobj 13 0 obj << /A << /S /SetOCGState /State [ /ON 3 0 R 4 0 R ] /Type /Action >> /F 1 /Next 14 0 R /Parent 22 0 R /Title (turn all on) >> endobj 14 0 obj << /A << /S /SetOCGState /State [ /OFF 3 0 R 4 0 R ] /Type /Action >> /F 2 /Next 15 0 R /Parent 22 0 R /Prev 13 0 R /Title (turn all off) >> endobj 15 0 obj << /A << /JS (app.fs.isFullScreen = true;) /Next << /S /SetOCGState /State [ /OFF 4 0 R /ON 3 0 R ] /Type /Action >> /S /JavaScript /Type /Action >> /Next 16 0 R /Parent 22 0 R /Prev 14 0 R /Title (foo on, bar off + fullscreen) >> endobj 16 0 obj << /Count 4 /Dest [ 5 0 R /XYZ null null null ] /First 17 0 R /Last 20 0 R /Next 21 0 R /Parent 22 0 R /Prev 15 0 R /Title (1: page 1) >> endobj 17 0 obj << /Count -2 /First 18 0 R /Last 19 0 R /Next 20 0 R /Parent 16 0 R /Title (1.1) >> endobj 18 0 obj << /Dest [ 5 0 R /XYZ null null null ] /Next 19 0 R /Parent 17 0 R /Title (1.1.1: Page 1) >> endobj 19 0 obj << /Dest [ 9 0 R /XYZ null null null ] /Parent 17 0 R /Prev 18 0 R /Title (1.1.2: Page 2) >> endobj 20 0 obj << /A << /D [ 9 0 R /FitR 1 3 2 4 ] /Next << /S /SetOCGState /State [ /ON 3 0 R ] /Type /Action >> /S /GoTo /Type /Action >> /Parent 16 0 R /Prev 17 0 R /Title >> endobj 21 0 obj << /Dest [ 9 0 R /XYZ null null null ] /Parent 22 0 R /Prev 16 0 R /Title (2: page 2) >> endobj 1 0 obj << /Count 2 /Kids [ 5 0 R 9 0 R ] /Type /Pages >> endobj 2 0 obj << /OCProperties << /D << /Order [ 3 0 R 4 0 R ] >> /OCGs [ 3 0 R 4 0 R ] >> /Outlines 22 0 R /Pages 1 0 R /Type /Catalog >> endobj xref 0 23 0000000000 65535 f 0000002150 00000 n 0000002215 00000 n 0000000015 00000 n 0000000059 00000 n 0000000103 00000 n 0000000277 00000 n 0000000349 00000 n 0000000329 00000 n 0000000370 00000 n 0000000546 00000 n 0000000621 00000 n 0000000600 00000 n 0000000717 00000 n 0000000859 00000 n 0000001016 00000 n 0000001263 00000 n 0000001417 00000 n 0000001517 00000 n 0000001626 00000 n 0000001735 00000 n 0000002045 00000 n 0000000643 00000 n trailer << /Root 2 0 R /Size 23 >> startxref 2355 %%EOF gdalautotest-3.0.4/gdrivers/data/int16_rat.bil0000644003401500001440000000144013614004466020670 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gdrivers/data/h0o0y867.1a70000644003401500001440000001326713614004466020121 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/srtm.ers0000644003401500001440000000201613614004466020071 0ustar rouaultusersDatasetHeader Begin Version = "5.2" DataSetType = ERStorage DataType = Raster ByteOrder = MSBFirst Foo = { "x\\\" y" } CoordinateSpace Begin Datum = "WGS84" Projection = "GEODETIC" CoordinateType = LL Rotation = 0:0:0.0 CoordinateSpace End RasterInfo Begin CellType = Signed16BitInteger NullCellValue = +9999 CellInfo Begin Xdimension = 0.00833333 Ydimension = 0.00833333 CellInfo End NrOfCellsPerLine = 12 NrOfLines = 10 RegistrationCellX = 1 RegistrationCellY = 1 NrOfBands = 1 BandId Begin Value = "Topography" Units = "meters" BandId End RegistrationCoord Begin Latitude = -60:00:00 Longitude = -180:00:00 RegistrationCoord End NrOfBands = 1 RegionInfo Begin RegionName = "All" Stats Begin MinimumValue = { -4315 } MaximumValue = { -3744 } MeanValue = { -4020.25 } MedianValue = { -4000 } Stats End RegionInfo End RasterInfo End DatasetHeader End gdalautotest-3.0.4/gdrivers/data/utm.pix0000644003401500001440000054300013614004466017723 0ustar rouaultusersPCIDSK PACEV8.2 355 utm.pix PCI Inc., Richmond Hill, Canada 21:20 11Nov2003 21:20 11Nov2003 68 7 2 2BAND MIXED 1 500 7METRE 6.000000000E+01 6.000000000E+01 4 64 1 0 0 0 Contents Not Specified 21:20 11Nov2003 21:20 11Nov2003 8U FIMPORT:Imported from 1 on openev/utm.tif 21:20 11Nov2003 A150GEOref 75 8 A182SysBMDir 344 12A182SysBData 86 258A182METADATA 83 3k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭֭޵Ŝέ極ޭsνŜcksks{s{ksZsssscs{{s{Žc֥kkccJֽŭ挽Υֽs攜νεcRZBRRBJBRcJR{kZR{ZJBBJkkcBkcBkJ{{R:JZZscRRkJBZ:RR)JB:J{BRBBcJZZRJkksZ{Μk{csk{c{kc{cZsskckccskޥZkZZs1!:)!J1)scΜZ{kcZc{scsk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεޭޥ޽ΥŽ֥޵ťŜccsks{{kkέ{ssk{{޵Δs֥ޥŽs{{{{k{ss{ŵ֜Δ攭ν樂֭޽ޭ{cΔ{ZBJJRJRBZ1scBksZZRRJcJkZk:kRkBZJ{Z1ZZ:cRZJZJR:JJRJBRBJJ:BcBcJcc:J1RsZk{ckRJksssskkksZcsksskk{scc{ckΌsZsJss1!):)11:ZJkZcsckZkkJs{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭ΔŵޥֽνŭŔssΔތ{{Ž{sscZ{ssRΌc{c{{ޭֵ֭֌{Υޥkkssk{{kŭֽŜŔ{έŽ{kֽťޜ{BB{BRRZJRJJsZRBBZsscckZRBRccRRcRJZcR:BRkZ{RJRRcBkckBcZ1JRZB:BB:J!RBBZJc:BB:Bcsk֌ss{{{kcR{s{kcRsZ{s{ZZ{{{kkskk֌{sZBk1:)!:!)1sc{ZckkZkkkRsŜ{kk{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜνť΄ΌsΜ{k{{{{{{k{{s{ޜRޜޥΌRŵc{{{ޜޜ{ֵŌ֌ֵŽťcckZskŭZZBccťkBksc{JZR:JJsΔ֥Bkk{scsJBRRZckZRcB{ZkRcJZZscksJRcksZsZZckkcZkccZssZss{RJZ{R{kksJkc{{{{֜Δ֜k{kŭcJJBRRc)c1RB:1J)J1Zsss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť{ŵֽŜ楌s{ks{{Zs΄{{{{{ss{Žń֔Ž|޵ΥsŔssΜ{ΜŜޥֵc޵ֽν{Jk{R{ssJskkssJBkΔ֥cZJJJJ:R{cńZZZsc{BRJRRRZcZRcJZkJsZckcZks:c{sk{JJZJkJB::J:BcBJB:ZJ:cBZ:1Bkss{{R{Υs{ccc{cksckcs޽ZkkJZ{s{kńJ!:BR:!1)J:!11)!s{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{挌ﭜŜޜޭΔֵkkkޭsksΌksֽŭsΌΔε{ŭ֭Ŝcks{s֥cν޽ޜ޵ޥνcc{JRsZRZkJks{kc{ŽscBB:JZkcskJZJc{cBRJB1sZkZkRBJcZRskccRJJB:J{ksB1BR:s:B:!J:B::J:RRRR:cBBkkRބ{ޥ޵skc{ks{RZBZcck{k{֥s{sRέkc{{!B:!R1::1111!1:!:)ŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ֥΄Ō{{{{{cs{ŭŜ֥ΔŭεcΌΜŔνŌ{k{Ŕc΄ֵ|ޥ{RR:JkcZ{sk:kޜRRJZJRcsckc{scs1ZscZJRJJBRJJRkJZRRcJZR:1ZJkccR)J:1ck1BBBJ):JZRZBRRB:c:J{sŭ{ksZŌ΄cZsk{kBsZkcZkΔενΔֵ޽ΔΌ{:B!B11{!:BB:)1!!!Master Georeferencing Segment for File 21:20 11Nov2003 21:20 11Nov2003 POLYNOMIAL PIXEL UTM 11 E000 3 3 4.407200000000000000D+05 6.000000000000000000D+01 0.000000000000000000D+00 3.751320000000000000D+06 0.000000000000000000D+00 -6.000000000000000000D+01 Please do not modify this metadata segment. 21:20 11Nov2003 21:20 11Nov2003 METADATA_FIL_0_GTCitationGeoKey: UTM 11 S E000 METADATA_IMG_1__Overview_2: 0 1 cscέޔޜΥcJsRkk{kcsBJcZcBJ1ZZRJZscRJBJkBB:::JB:JRR:BkkRΥs{{RBc{Ό{֜{Rkc{!!1:11!::System Block Data for Tiles and Overviews - Do not modify 21:21 11Nov2003 21:21 11Nov2003 250 3 250 38U NONE 148 750{ssk{scscskc{ssskskkcksŽޭ֭ŽŭŜck{{歌sk{sńs{{s޵քΔΜޜc{ZJRR1csRJJZ:RBJZZ:RZZRJRBBJ:ccc:1Z{kRkssskkcssk{sccsJs1)1ZkZskkJ{{{{skkkskcZcs{kk{{sνńνŽŭk{{{k{sRΜŌ{{ŜޜŽ޵ccsťZZcޥkcJRJsk{csBRcZc{kcZskRksZckccZss{J{kJ{{{ε{kcJRccR:JJZs{cskckc{cc{sks{΄k޵歔ŵksscscέޔޜΥcJsRkk{kcsBJcZcBJ1ZZRJZscRJBJkBB:::JB:JRR:BkkRΥs{{RBc{Ό{֜{Rkc{!!1:11!::System Block Map Directory - Do not modify. 21:21 11Nov2003 21:21 11Nov2003 VERSION 1 1 16 1 1023 0 0 -11023 1 -1 21023 2 -1 31023 3 -1 41023 4 -1 51023 5 -1 61023 6 -1 71023 7 -1 81023 8 -1 91023 9 -1 101023 10 -1 111023 11 -1 121023 12 -1 131023 13 -1 141023 14 -1 151023 15 -1 -1 2 0 898 A182SysBData 86 258A182METADATA 83 3gdalautotest-3.0.4/gdrivers/data/srtm.dem.rsc0000644003401500001440000000121213614004466020630 0ustar rouaultusersWIDTH 12 FILE_LENGTH 10 XMIN 0 XMAX 11 YMIN 0 YMAX 9 PROJECTION LL DATUM WGS84 X_FIRST -180.0083333 Y_FIRST -59.9916667 X_STEP 8.33333330000e-03 Y_STEP -8.3333333000e-03 X_UNIT degrees Y_UNIT degrees Z_OFFSET 1. Z_SCALE 2 gdalautotest-3.0.4/gdrivers/data/rgbsmall.ppm0000644003401500001440000001653113614004466020721 0ustar rouaultusersP6 50 50 255 PW$xCfs-bw,f6JiMno?l=GcPlRrNpT|Y\"%&jn;y=bt"cv$c{%b(RwRzZ!l1X{^'NpRvh1^'Z ^f-t:s4`v#YsRn^|$Z{"TwZ"UzW|SxPr\(W~#_*`+Q} DK"oxC}Eky,at|6]wYwWxWz _&c*SvVyTySxTx3WMtOxNwS|HT"Ps4dv$e|$i&f$f'Rpe.Z"`&Z ]%TyX{SxV} LsRy PyW"W"EL m|7i&h!b{k)q1]|Zyg+GjCh [#OwU}UzTyDi Z"T}@g KrT}Py Rgt$s/i$l*^{o/d%Tsu9j.f+]#T|]%\$Z"MtZ#S}MtMtKrU|.5p{9o)n,g&`!l.c$TvMoVxTx|A\"QvS{NxHpS{Y"Nx\$WJqU|!HR/n[z*Ru^$Z Nx\#RwCfU{W}QtOpQrSpYv"LmRwNsPtUyZ}#Vz"LsMq Tl.e4Z|%JoWz X|"InW|QtVyVzW{[~"Tu[|#^|&Zu$\y%Z}#X{`+[{&QsZ~&Sz!Im -7Xh7Zm6Rd4%5Jb(GhTxKoVyOqPrQtY| X{Y|WzXyUsWsk5~Hޒt@Uva)NnOo=_ Z~&NuUy!:E%N^-[q0Uo%k8Xt'Vp)Ib!>XYw-OpTx \&Be RtEeFcRpZx\~ Uw\~ d*`y(t@UɈRv@=ZNpY{$^(MqVz Vz \&?O"HaJgf.Xy Yz!KlWw$SuPt]'Jn\%NqMo`*Pn[y!Zx[|!Z{ Vtn6[o(Uc%R]!Nt?TqUu OqFjY~!SwVz NpTvTg/Yt'HfUrOlRoNnTtKmTt!Uu RsSvY| Tw[~"c)d(]!\#EbVl!FVJUUc([yFc6VHe[w#TmTn`x"l/GeJkX{]~#j2~GSj~9Rf!dz1Ja)Y|"V} WVNuGnJnGk@c_-HiJiuL]z(X}Z[c!\~_'[x$E^ Xpbz$q1d|$f'Yw!Yv"e.k7vCƈWђl9Jga(V{PuQxNvY#U|!T{ Tx[',OQt Qr!Ji7Ff>Z~'Z"a$m,Hq Osd'dx!Xjv3e}%j+Kl[|#SpNeTc(|ٯɕȇI`)Z"U|LpMqLpJnHlEiMtY#:aHnUv%_{1GgCh c&f(l-f'Wr}7Gk~%QhYx`&c+r@_q3}W|ʤ[d.NuNuLsLpPrY}%Vz a-=d T}U~ T{ Uy"Hi?[ Us+`(S|X~X|Xvo+YtG~7=j(l2Vv![u,9JU^3׵լ]t?Uw IpAh HlSv"X|%['RyOy]'_%R?3A|4p,Vvz;RPfv8LgY{%Tx!LpZ{*Tv"OsU~ \&Z"HqR|Z`(JmLl s?SXm4ZU{$X{)sDVy%Ntkq1BGH8Pa{$LcG\r9TTm5f3Uy!MtW~!]$_%[#b(b*g3@i d)X!1W:] X~'|Fb&n2^+Fl?aoBr@S| %( Uqz)F:Cb c}&Le>V _v(Sfr5HcJjW{!b*h0]!^"X@hMqBf?h X\"n;.T6^Re'd(Es2Z*LVy)o>\'lsJxAHY WmGag#:q/d%_%<]Mig.](QuAh X#V~JtUZ$Quf4Tx!>j `%H~ T O|@n Aq n1Y]'[)U}%Y*q@r^e1y9n*Lbj+r.CMb"i-f.h1^'SwSzR{S|X$R{Td,QxIpX$@n l0h,J~K~a+Z o2UOFsV~&6\Fie.fJ?z.aBbb0v< ]PC1n&i&Pvr1`$OvNuk7f2PrMpY}%['X|%Rvt98|7|?j2r:s;MK$Mrv,q(_l+q,|5k#h$Z_'Qs/NIgc~;pGd};_x4Lhk:b1Ps#2UEhd3]~/c1PV` [z*HbOi Tn$VzF^(q:tf5Vr'3MVu%RvHqT~Bq` A`c2sD;W 3UKx^#V}$Gjd4St%<[Or]%`#BsPq9Qx9\W&Va"\w2{5l,g6(X?4+..,/+0'-Qe&Z{"7a`(ST^#d-i2;d;g\$QCr 4a/\/^\'.\=k_%^j(d">nOzc(*MGkMtT}n-U{Vo)v5mf)Kn1_ _ `#h+j+Fu8c#=t/e!_e%`m&s(p"t%q(Wo'x0~5u-h9Bm)n+f6Al6?'6/24/3,0,0,1g:]!TYm4GLs6Hu ULl0v6|9:x4j&o+i!x,53>r+p&9~3?~3?=m'l)g>&L'6/323515.2+CG"6=CYy?{?u;ڌ|Mkg/d0Ab}Kq@>b Nvb"m)r-u2K?=B7q,k*a:? 51324604+0*3'3GO:Ҙ~o3Ph~>oEs>{Cd}Q]{1Nm!8X HoRt0Bl)Ng#q,y5i(BtPK{ @nSz^z1}5y4s2hBC)756532,0 %,#. .gdalautotest-3.0.4/gdrivers/data/8bit_pal.cot0000644003401500001440000002562013614004466020610 0ustar rouaultusers ????  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~skkkkksck΄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.0.4/gdrivers/data/byte_point.jp20000644003401500001440000000220213614004466021157 0ustar rouaultusers jP ftypjp2 jp2 Gjp2hihdrcolrres resc''uuidK=KCզII* (   'gN@N@@A̞LA# c )#WGS 84 / UTM zone 11N|WGS 84|jp2cOQ)R \#"wvvvoongLgLgdPPPEWWWadKakadu-v7.3d\Kdu-Layer-Info: log_2{Delta-D(squared-error)/Delta-L(bytes)}, L(bytes) -192.0, 6.3e+02 } H`>P cCAB 'BH e/`}"- ~gAh9`J}YZ l^~V~ .+H:MPd jqGح ;=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.0.4/gdrivers/data/test_validate_jp2/0000755003401500001440000000000013614005400021762 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/test_validate_jp2/byte.jp20000644003401500001440000000453113614004466023360 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@-jp2hihdrcolrjjp2cOQ)R \B@ 4zR.$asoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved tuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|N@N@@A̞LAgdalautotest-3.0.4/gdrivers/data/test_validate_jp2/utmsmall_pct_oi.xml0000644003401500001440000000746413614005376025726 0ustar rouaultusers 0 0 99 99 x y 440750 3751290 60 0 0 -60 test.jp2 Record Interleaved Band 1 0 255 Band 2 0 255 Band 3 0 255 some_id some_namespace gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/utmsmall_pct.jp20000644003401500001440000003010513614004466025115 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@Ojp2hihdrddcolrpclr  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~cmap$4jp2cOQ)ddddR\@@HHP #DRH3z;i5SHO/t9L(5oGx^T\K u1GϱDI* r œT\>'BY>JazylPp.Pߝ=PCq9Mp.aܮj.-0ys ;; Wdz`.r}cf`ȶ[3+x()ώH/7IP@ <~F SxE͡M1_$3$c`[ #gC|Lb]lju$O$e]ӓxc$2=?9j2l<7iXf9$ͯ(*Ro`߭\^qPs{/:OVɊUWG)f/_*RNcZJs˂*DDK^}%P]]Vʆvw2lҼ)`1#2~[gE?&/jcDZT~w׆JISƎ_Jih5|[قgksgWR4=BT-Iyߌ69+Tj2-he=k{ue' xVU9-'%xVP8^ ~ÛzFk_$Nnذ,Q[f>Ǡr6]zڛ@tuɜb B7(\$gm{Kz[ kKM{^WhiNgr qeAXTwh@K̂־&9J2$߽ʴ Ǹ z$ ^֕+[w`%w5{^%s7A|F*1PϞSb'isԨyi,E7[:F1NBǮ̴:Cf '^V1X14ސ!~z-}$8pV7ϛĒclK` *Wx0+1]>?7V@QʫڂS]cXԙ?Zf?aF+Ru2w) Y/"\q>TyGDdX4ADN⚸ɾ].=f--gAxa[oc:xv]Z95ß'C"n f`v%Sw:zrs;Cb]ke7g.:ydQU| R 2Ojs3̿VQTr2p ʈP1qnH# [ +No;zFRXRϗ)x~.eX}ĩ6z&[c~HS$n#];afƩM;jJˢ 엯O&9Q5Ds%4/R"N£ᯃ{H.FBS;}r챶uZvuB 8\Rqݧ]oq^\&z F]]92* ?玗#L;ܷ XO;qŚG|iXu#Dw5½1K;䖟.=%={&HpY(<]7yX`'#7}QG|[vklsNM<~uNr * [yBۃ|RC_4d_EGᄪ\IlH$qŨ,۰z- 85@Bm-]WyZ0ntƫ1T{oRo3ĊooӢlx.`n-G}p!\S*p_=*wltQQU9.SlYo8gE07sKX6 pHb+ǜuQȌn(HXIl+%d 5{(@?oڶT1FY5,L6NHJþ4_0=bq%Oo};֠&gn gHjn(TDU edu4Qk w?nڟŀy%8dI-ln놤D2T,w-*? 90& u=Α0b-'P+q:'"kz/lqL?ʣ3 v-"U;0VB:&%%ڎ>#.$gѴr`|-x|]j!LT+VI3FCnkE6 `9ZG=-*D@f"_xɿ{#*M^e$@^t'˙iNT?=O!*?PW_y 4Xš9"XVPtXGxZnN4v3/T&<AAA9Fc^,QM!nθ̞/;.tY^";br)|֎{=@ sF_.à]=Ѭx!\tp׊WYxx|&X>\DR/s DpM9$*J!"mU~R|R_ʙ;ZodG*?ÿo_-e#+.W3uDHcyilnQ/i꾅2(pf9_Y*Jf "gޓ Yd iE] =: !:]ojV#-WZ@w<'@x hJjEWx"{jȖ$ˆ*p1g6/P8(3o!Gl21C^_lM p6ޙ}vN;4/9r1eP!j`-BE2n&$"r=j2P-Ƌ{+Qt̃4ND՜'6=l\iZ; dPN 藼69B\䔿{&z8h %0+7I] 2njh tm? =Nݬw ϡZ]3I~P `K틐$<\i`рK@M̂|f2d;NS |PtkjѶpÛ?M7_q/uma=ׄ]1bUj0T*h~̅EصF w^2_,k{8UQ082^/F{v]M Ο$ R9q@)B#CsAiBTuNFUb渣DoռIl-XU?JUAv*b9`&ȴ[O,~,^TFyPƼ/ȥ+Fnq3%V6&Z블9XK *`|Szy`:GG?don:-XWZ_jfm B?`o;IO,Tqt+|t9COg/BߪwDpcz ҄=t^Wo %X2h/RUos-[9JČl,/P`<sl_\/s˧/Kŕig4sKcz/R ՏH#!g|ZI/Aڦnm]y <i+o Zn/75.!kFb )P̧Gխӛ[;ݙr!!iZx)`}3]xQgq?"4퓣J7[^|ZwHʆAB-8^ {/ >P} T'@6_P fyE5KPZkծHk39sfe"9]8"l'hG~wFjl\?Z(&*aƴ窦^}D6daޘQr&ZpxmGD0BMI}p.JP˄*{ u37cƕiazRXWkt"RQsqS}LtGZWAnx@{am7@uKa 8rx>U.~5:Es;쮻 :{ͫ_LŎ?I`[z"c(P spprjhjf>;*_bN2#FY4j|g!~,lHXpeF5G?!洚xkrƈos֛gm6y/@Bо 5}䷤G11"Zy/]h%X1/W%ǧ#ЗxZhpz)HZ* lXRcOt4G\2[Xfب?Wtp!S 4[]Riޭ'HX$)T'/Lԧm QA&ئZ5菶XVvl/#uzũp(vد!wP2_TT@RqĖ]mЗ>5k( GGbiQ3dD&t݌֞ GxD Ճog[⿈`IKuppr}Ħmp' qG^6 WػR#(4`TPP]VoW 8qJᆋ$R*ChzȪcFYo>$y}Z&J+*Դ*Ǩ G8,;QRE)-eRf갍`Ux\kz_rڈ1?gOjٻQX3燛^{r $} Щ|(V/̨-`s3?W4h^:elE(3ۉB-j) y @8#cfD^2?hbm`nYmF-.tb70)6cc]5h"ٱ cCSؾp*""I_Py.z&u]ɋd;( k.^Ѳ߆czGpP%3{̼6&Z| k膫oxnˡG9q;&%rEǠIQ_K8 E Sn{}OԖ 9n,u\\ @ƤY[A<^◺] 9J9YVO pᲤ?>ߥ.J~t 䑘=bXۊJX_Sr̘>ZVCA#JU"X,&bӜjE008g٤iZQh+eXT6*EyzkNԦFA"/GvJ^ۓfGS6A^%ݕݝLOTb7Ͻz-%4Ji\s ;C8Mq [RM":/l@X,s4 J__%]Oyy,L]1Ç$G eXY  M[ߊ[Æ= ZvfyؠSHN}HQelu,E`t7Ōl^G$' ny0]Zf3|›/ =xRqB;4L^ąq Zڤz~6 ('VZ>.(-R3ʑ0>3[[mqyTIxfV_.;RȔ8ZpdZxh[k\zV>?pwVzk <3S5չm(^O)|׭V?|_[A{h_C@C)zʍCtfQVSSwNC0N;gls^_P,֏wu_=ֶJѓg~rׄ20Ob\Gv=!K6cf_[x WY-U|Vʀ u6xclo`weid em\J ƚ|6_؊s(z9аL V(T6ஆb(E^u ώ;o]'ILԃx9^m#!""N6NW]iE.8tx[r<1}'i8+x[6C&}4G~^ {r(R7]ҏ:h𕋳 x\_|"@-$6 !aWI๠:ã4zU/j:}Kb<(6Z\M>eii>!.)<(G6M9.8#mr xF/ ws^lL }Sb-BSRp7*po/bI7M}0=ӽԟ"  kU*sB$R]K5x\׭AXU!V4jVi^30!!"}4n֤?P-Gime&G1vhRl48aaUN o.ߴ71&7~/)QjtXSxw nZ1xDcTXM$ H.`hC N\NчDm+1)DHTasoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 99 99 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved tuuidK=KCզII*   , # Wh )#NAD27 / UTM zone 11N|NAD27|N@N@@A̞LAgdalautotest-3.0.4/gdrivers/data/test_validate_jp2/byte.xml0000644003401500001440000003231313614005376023465 0ustar rouaultusers 0D0A870A 6A703220000000006A7032206A707820 jp2 0 jp2 jpx 01C08000020004800043400000 1 0xC0 0x80 2 4 0x80 67 0x40 0 0000001400000014000107070000 20 20 1 7 7 0 0 01000000000011 1 0 0 17 2 20 20 0 0 20 20 0 0 1 7 1 1 1 0 1 0 0 4 4 0 0 153 0 29 0 1 676D6C2E6461746100 gml.data 676D6C2E726F6F742D696E7374616E636500 gml.root-instance 3C676D6C3A46656174757265436F6C6C656374696F6E0A202020786D6C6E733A676D6C3D22687474703A2F2F7777772E6F70656E6769732E6E65742F676D6C220A202020786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E6365220A2020207873693A736368656D614C6F636174696F6E3D22687474703A2F2F7777772E6F70656E6769732E6E65742F676D6C20687474703A2F2F736368656D61732E6F70656E6769732E6E65742F676D6C2F332E312E312F70726F66696C65732F676D6C4A503250726F66696C652F312E302E302F676D6C4A503250726F66696C652E787364223E0A20203C676D6C3A626F756E64656442793E0A202020203C676D6C3A4E756C6C3E7769746868656C643C2F676D6C3A4E756C6C3E0A20203C2F676D6C3A626F756E64656442793E0A20203C676D6C3A666561747572654D656D6265723E0A202020203C676D6C3A46656174757265436F6C6C656374696F6E3E0A2020202020203C676D6C3A666561747572654D656D6265723E0A20202020202020203C676D6C3A52656374696669656447726964436F7665726167652064696D656E73696F6E3D22322220676D6C3A69643D2252474330303031223E0A202020202020202020203C676D6C3A72656374696669656447726964446F6D61696E3E0A2020202020202020202020203C676D6C3A526563746966696564477269642064696D656E73696F6E3D2232223E0A20202020202020202020202020203C676D6C3A6C696D6974733E0A202020202020202020202020202020203C676D6C3A47726964456E76656C6F70653E0A2020202020202020202020202020202020203C676D6C3A6C6F773E3020303C2F676D6C3A6C6F773E0A2020202020202020202020202020202020203C676D6C3A686967683E31392031393C2F676D6C3A686967683E0A202020202020202020202020202020203C2F676D6C3A47726964456E76656C6F70653E0A20202020202020202020202020203C2F676D6C3A6C696D6974733E0A20202020202020202020202020203C676D6C3A617869734E616D653E783C2F676D6C3A617869734E616D653E0A20202020202020202020202020203C676D6C3A617869734E616D653E793C2F676D6C3A617869734E616D653E0A20202020202020202020202020203C676D6C3A6F726967696E3E0A202020202020202020202020202020203C676D6C3A506F696E7420676D6C3A69643D22503030303122207372734E616D653D2275726E3A6F67633A6465663A6372733A455053473A3A3236373131223E0A2020202020202020202020202020202020203C676D6C3A706F733E34343037353020333735313239303C2F676D6C3A706F733E0A202020202020202020202020202020203C2F676D6C3A506F696E743E0A20202020202020202020202020203C2F676D6C3A6F726967696E3E0A20202020202020202020202020203C676D6C3A6F6666736574566563746F72207372734E616D653D2275726E3A6F67633A6465663A6372733A455053473A3A3236373131223E363020303C2F676D6C3A6F6666736574566563746F723E0A20202020202020202020202020203C676D6C3A6F6666736574566563746F72207372734E616D653D2275726E3A6F67633A6465663A6372733A455053473A3A3236373131223E30202D36303C2F676D6C3A6F6666736574566563746F723E0A2020202020202020202020203C2F676D6C3A526563746966696564477269643E0A202020202020202020203C2F676D6C3A72656374696669656447726964446F6D61696E3E0A202020202020202020203C676D6C3A72616E67655365743E0A2020202020202020202020203C676D6C3A46696C653E0A20202020202020202020202020203C676D6C3A72616E6765506172616D65746572732F3E0A20202020202020202020202020203C676D6C3A66696C654E616D653E676D6C6A70323A2F2F636F646573747265616D2F303C2F676D6C3A66696C654E616D653E0A20202020202020202020202020203C676D6C3A66696C655374727563747572653E5265636F726420496E7465726C65617665643C2F676D6C3A66696C655374727563747572653E0A2020202020202020202020203C2F676D6C3A46696C653E0A202020202020202020203C2F676D6C3A72616E67655365743E0A20202020202020203C2F676D6C3A52656374696669656447726964436F7665726167653E0A2020202020203C2F676D6C3A666561747572654D656D6265723E0A202020203C2F676D6C3A46656174757265436F6C6C656374696F6E3E0A20203C2F676D6C3A666561747572654D656D6265723E0A3C2F676D6C3A46656174757265436F6C6C656374696F6E3E0A00 withheld 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved B14BF8BD083D4B43A5AE8CD7D5A6CE03 49492A000A00000000000E000001030001000000010000000101030001000000010000000201030001000000080000000301030001000000010000000601030001000000010000001101040001000000080000001501030001000000010000001601030001000000010000001701040001000000010000001C01030001000000010000000E830C00030000001401000082840C00060000002C010000AF87030020000000B8000000B18702001C000000F8000000000000000100010000000700000400000100010001040000010001000204B187150000000108B187060015000608000001008E23000C000001005768040C0000010029234E41443237202F2055544D207A6F6E652031314E7C4E414432377C000000000000004E400000000000004E4000000000000000000000000000000000000000000000000000000000000000000000000040E61A4100000000CC9E4C410000000000000000 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/stefan_full_rgba.xml0000644003401500001440000001477713614005377026036 0ustar rouaultusers 0D0A870A 6A703220000000006A703220 jp2 0 jp2 00000096000000A20004FF070000 150 162 4 255 7 0 0 07070700 7 7 7 0 01000000000010 1 0 0 16 0004000000000001000100000002000200000003000300010000 4 0 0 1 1 0 2 2 0 3 3 1 0 2 162 150 0 0 162 150 0 0 4 7 1 1 7 1 1 7 1 1 0 1 1 1 0 1 0 1 4 4 0 0 152 153 0 18174 0 1 gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/utmsmall_pct_corrupted.xml0000644003401500001440000002371713614005377027326 0ustar rouaultusers 0D0A870A jp2 0 jp2 100 100 2 7 7 0 0 1 0 0 16 2 4 7 7 7 7 0 0 0 255 255 255 255 255 0 1 0 0 0 1 2 1 0 2 100 100 0 0 100 100 0 0 1 7 1 1 1 0 1 0 1 4 4 0 1 152 153 0 0 0 0 9188 0 1 gml.data gml.root-instance withheld 0 0 99 99 x y 40750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved B14BF8BD083D4B43A5AE8CD7D5A6CE03 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"]] 40720, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/byte_corrupted.xml0000644003401500001440000003277213614005377025566 0ustar rouaultusers 0D0A870A XXXX 1 jp2 1 0xC0 0x80 1 4 0x80 0 19 21 1 7 6 2 1 1 1 1 1 B14BF8BD083D4B43A5AE8CD7D5A6CE03 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area B14BF8BD083D4B43A5AE8CD7D5A6CE03 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"]] 4.4072000000000000e+05, 6.0000000000000000e+01, 0.0000000000000000e+00, 3.7513200000000000e+06, 0.0000000000000000e+00, -6.0000000000000000e+01 Area gml.data gml.root-instance withheld 1 1 119 119 x y -440750 -3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved 0 20 20 0 0 20 20 0 0 2 6 1 1 6 1 1 0 0 1 0 0 5 3 0 0 0 29 0 1 gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/byte_oi.xml0000644003401500001440000000571213614005377024160 0ustar rouaultusers 0 0 19 19 x y 440750 3751290 60 0 0 -60 test.jp2 Record Interleaved Band 1 0 255 some_id some_namespace gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/almost_nojp2box.xml0000644003401500001440000000037313614005377025644 0ustar rouaultusers 0D0A870A gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/stefan_full_rgba_corrupted.xml0000644003401500001440000002024113614005400030067 0ustar rouaultusers 0D0A870A jp2 0 jp2 150 162 4 255 7 0 0 7 7 7 7 1 0 0 16 5 0 0 1 1 0 2 4 0 3 3 1 0 3 1 0 2 2200000162 2200000150 2200000000 2200000000 2200000062 2200000050 0 0 5 7 1 1 7 1 1 7 1 1 2 1 1 2 2 2 1 0 1 0 0 4 4 0 0 152 0 18174 0 1 gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/stefan_full_rgba_oi.xml0000644003401500001440000000672213614005400026477 0ustar rouaultusers test.jp2 Record Interleaved Band 1 0 255 Band 2 0 255 Band 3 0 255 Band 4 0 1 some_id some_namespace gdalautotest-3.0.4/gdrivers/data/test_validate_jp2/stefan_full_rgba.jp20000644003401500001440000004372613614004466025723 0ustar rouaultusers jP ftypjp2 jp2 [jp2hihdr bpcccolr"cdefG[jp2cOQ2R\ BH$WWWb F_z_x =AKEiYb)dQζ[\)'k# ę0k6l|\A2O`Wn2&&njw:;Y靄LYyS$ٵ'yOz2KD;'&Ehк9 Gٕ67q&fқ*X^WTS*G-*J*7]"30s'Uj,~[A۹&w]xв(dP^:={  ./3o'2(6߲'lUIui#5Xy1)Gwp͊~2 "d* a!/qpI}\$0 V&k Xs &$?  2[|N4qpAL~!s 葨 NK8CJ^M!.pLwx0dIm+Ͻ: S0(PQp0浣А辉 qMo>-OLioM D(=@bJ'aAЈ[5SHK^68mu<+jv"@!cH)9Qm ) _w4-Uo ! i;g ,ѻa3 "2TD+E/`]0Ipo%,$O@"` #@64WZ`%H;($ו*VgWԋ x pS;'vH{z͑~q?y|&nϜ"?sNYirYxe_$/(+6,NJZ1񎜨T-+u>A_ANB2=OWEsK!* CvDe-ض[g -vp D|gd M#Ӟf]w8ms#eOn1' >+jӫ'# KAFw@c=Q_vM{wqѥ'uwu$OArgSJ]% d(8.fKB7c%DБNkaFܲ]SH|^ŀݎɞׁJܮˍScP{-8]lk}K =T^qc%yQhmSL- bj7d/J%uib"Kfj;}*ӚKx,Q}'EJvdˈ@WnH=VcM1:oi1ˀ /Mr٩5mK,3QEP0(AVeZЏ˰iQI~0tX?$LG ؞o9#?.oKfvM=j/t^)u =l#\/D^|n 0>7'd$eb}j}g7(E` WG`X.$X+]<Čb *@at)ZKf10GmL,f-ƀ $%RQ D_F0$d 3 C]K*5b 뽋F^E"q`ʁ8䨖 涄ImiK׾~B TW=9kvNP>WA|煁a 8ǀ IcUavVI;wt9k:JSW$L`$XɵV΍s)4&EI*I]|_)ǾX2X7[­FԽJBxrg}&ؗ*O+Q!oOQW. -B'*TA0-}br3MovwH_{<%.Mq”6\ ^h,ӟ 2!]wհ- SWqsKWcHvNtKmp~+5Pe4b)Er ϝ+CHhpC2[*s!SaڠWۚ=14xRt)u6ضnE -V- ?PTl\68|. *7DrHp?Xz /PT(=a!/ PTKs $% y_xԨn>?C -?Nh/fb "J8ȈjpM|l#&۳ľdA~ağ?^{qr* GH7Nc([&ư:X4y~غxL<њa"j̔֞EOxH•8@F'[Obg'H PW5| Ћ./*51: } gM_Ɗׯ[ ohdjvm"'m<MoDH"]Ib~Rρe XT:mܟ*=@`%mMz`m"@V;Cof,n=,G  Wн/@ $%@}ެ1!o@})JaU(t@_ eK/eegD`0B^M/"dANcrJb$B_Y[QZ9^;M|'hN@KPi^!9?j.U_]J+R&N SN8'VTXഋ-i`H˜SVֳ a!/zcjpg4(N `Ο!0d:4S?i ·؏Hr!ٜ)i?.˵pcҙXj2Z|8WxtdŶKU~UdܲԺKd'bBn ƱnTe{tB$ҏ $yJX-*D_ 5X;Lyb,Ӽ5O#}^G$B쭞YWc@f9ނGz|R֞$E']2 c.kfp ./N)dH[S|/P  ;$]iIeLJ*Ϫ59;_35SQq (NToIX?jmYOda;dɸr?v{lt`Ɔ@xo7glHQX3 ajNml8&YP.海6y^/b|sR&~@tU:FFgHz?4Jۓo߈dY\ה(3 b[5F WL%zǰ1Zp=@k'>v{]ծaw``z4?" $ q ͻtVMW$i0fƕ.Y+x qY S1|4^ #^O@2@{hb$X 80THA-0$hBfhVHKq1|pG E{J\ɻSdrf"]C CSZk/)&\\@[}Sb_~RVajH%I4ZR]U,:BxI%oB44NmBo1}#%u-!q 0o(_}MC&4Nfk7EgWݵwygv.ÉJ߉T*jP~1DJ@C7%^4oFT{e<dm#ZJ}%ڴpn_+$^Ľm&,`ӶsI$B_fuijQ*I(by$XBY$#NMlkd_wL5՗i{{_ dz8ʄy՝ @zzNb25͕dzz"f;m}b?LJɩse[AƁKz!Msqʘ`m9Qʉ k@ ]Ft 3ӎj8hH3BU,؁/p^Uө`럲1*l=i â eZ# $K-.jo`M#r_Ih?McpNBy5tقM3`y4T]A[᳴)wbY>qR\.kkM\/ [՜C{<:PlqM'fz ŚKE!yQPR 'Ɖ$9ZlW£V sJX.c:#YRhST:5BP/oX:PTl\68~t $%C&ϗ ǘ4/+e9m͒X-PT(=a!/ PTKs $% }W=}NY3+CqE qsIx(^X C/qX}{\?4P$HA+HorR# >>wYcmn"@ S[p/8WFM!E&.Ki@iZ6v OF(? ;S)L溮VF6ݾ>qhu~;im"&a+p!ܭ!)bp]Ui'45a',ȖaM "NyopJ\Ot IDǝ "d3u}ſhܑ8kSbaތ\J—aA]V9Vil@2;O' UC,K' ]}IԏO2hA`tm44#qo5܀ZF@}΢ +`^,rUƒ .`LvZ zAL!0Js8F\ Z|rZvkOۇC<$*Eh]wd%/u~_[qS"*l*2~%sq1lxvn>>eJ@@~ \PMi]1Opv Bk&R`'Joϣ uBTXZ3w Q!rILl+S-UěXUx! %̅5PZ.l=w:Z|%{H }>lsBY2K` /MT] Ȑd),%MmP4Vej)0nagڥia|9HKf17UEѝk$"1ƾU4>:9@.bW豈|_`ڗا+ayd^LB\Cl4@9ud  x\nܞRձ,+Z5mٜWp}؍/ Q)YZ?n:ˊNĄgk vS!E1c{> tBY9! Us Z)n_->E8$(=?b8m,ɽ:=!ǕLt"EqϜtI(蹠_wގ3MYYoKRiЌYŊ?Pv˚Řwl "ZBawq_m4hv.# 'RLV;u\6q Hd(לVFUɼ#Q6[@_6 leIP0 .*v4nhx|]>EVY#ϋ,'$ 5A[8)}Rvy}m;c<PPI QPR65w*<{Wq`55 6-M׳BBÛ[`sQaMK7Cg*c2B.瑚[\ *CB-1Ļt}e(PNQ8+pDRLMN&%R$3 ҷAq̒V!D?PTl\9!L0PT(=a!/ PTKs $% z7jç¢*j7WT" <ߨW`Z9h 4N?2"* 3z_!K1 ?Ž [Fnjp,orY K$q }~HKɢroYic{)oNՒ>fԽ r{?l+ł9FMze@#i!+WBVo=PT}g czA a}1`DۡRWRui -0t) 󱻙/RW5%CD@a#PcE~JÛpCiܬQ\aęЧF L z(e3ѩ ?b:*8 _[/+.W=a ϋ6D0*MSL⋩@յU;Kۋ v}KLpwq=c0[y#3y-el|mjˋ=lgUE;o:s*TCy4ߔNl8,S! ֐juY)"T,*g&El<U(`>ِJlTy{?'x4H9:|(iZ᪓\WsGpl٫$fb>tecWQnRlN`U3lsQFpgQ4fZ73dX/8Ȯ,}_j/G=uh(NOKYmBZU2Xio[=Wš`t2qIGi-dVx ӍW% 'IFLc6*Wx w=$)^$7j$7Ԏ$PX"sRk3`ZWgq=UZZvQ^uۛZέ#P]eKsA*A/4_\&JL!'r~$|T/ɬmS_+Gk뮞Ο?`0M#SK kq 28Rȗ({ןnS-H(WK-xP;4 62:o%ӰaURIDmFw lWr χtgxάˈX @RLݷՋ(AM )F22OՑ e#&rm5aq)I^zI;=8a~t&Lk?7D*N]*LFNE|z+[_Q 9&WHJ7ZY[]dW;E1"Dn&vxy>I p='Gygj$!l2w{!4GQA5h 71}I?\|Ͷk_{G 'T&^L+ &Ip֫ĩl&F6DVꉉ&. q~&3!M! 4%6Zu=7@"9iF 2u5 1"o+tCyt뫹K0PRVscpg|'}`+.BnƘ~EuJja4\ufZ`9n폀skk8vA(Ώ3d Ns;HWYs0UynЃ=qŹGxr~$[iMŒ6WxIYf C-@k~ jKZCu tS0wns?McpM:vRӲ#yv&c`ʣPD JRcf=V ҫ(vV xls51 )gTe}JL؞*i  }nIo2 #>J= S+Pr ɝOJ ֍պ]#eh[@x[ea l:3u,SHz{4K9l{Y qZKZG@DW9iN1y.,+QK}ISJT]Ԓ:=iʒ!1cyr֮mH",b+~VB |7AXF*je1 L! %1- {MLH-J% #i8۞Ӥ`0} f cDŽRdHGM<?*-2>/ZgwC-`Cb)1d] Tp|LI;o Ckp'+€ڲDVuwwo/C"Xm%cс8bz^BO[VĆg8 $\n/A"< Ly`WktIUկ1P$Ea53vZQb9p54ٗ}]떕#t_#3o9ȯΆaor"⊰ȹ'М+ l8uBt>#Gz͖$\fӼ*Hz4Cw5XiiV=~7h {zAcza}7D$ =%[Pd Fj~03s~ `pyq5KM:[h!j_}y$ ';o$ɣ+`ړhֺi&C pSO5[DOKj2?Wax/A>ݘaTօ }Z7`p"?9j/sW3Yc&{ǚj!0ݦ n.h8NSGa'˱| 3$sb#A6V8#lL}bNU Eӹ37 b7FMt9Ťnj$t:[>3.#4z5ouNCԮ7sH<f\]{'W8 PnKlVd+)7Ϯ*`gd $k:`Ul6#T6s$ewd1` ڪi<)n{Lwy̑PfmBn8.>U+K $8A8\Qd5tV߭ܳW{Y{9&nwNU)tĊzL ;ot~ObV?QD&\ѱ']lzgg8T#b}Mn@=Eeucyj8E5]xBjVG16z1Pxe^&}x`!p@xcY Ԋh_G工d\}`3H0ݣP6$ zX3XRU=N+J"͵P?u" ܜҷśt֫a~V撧QBxBTP6O ܫ0;?6(|E1=̤.vY3TH@U+M͎r@!`$>8)yP YlE|׉|cWiwYp AyUH? /2d :\w:?="9"b`.|Kk5cuNAixF#o-U/ vNPkx.s.>HM->ƢXEP`\E0%$.2#RP$}uey/΀uv'*妶c7% yݯmn0)EB{xglbVok9LN͍j x`}碷 ~RyĴC2@\a ȑ2%Vs]eAQ^fO^־ κu6Afr[DҶeAڳ#^Mwu0]-xʾCHVi~H.8_4M(V-߶͍Ky^Ԏ!7BdEblV2IsPK$.%Lp,B-5ptQem%J/ؼZOH=3}YV̈́0ָ?,:AU9 ˬk^[Ǣ /x9y$wgd)=:c6%ߩMDl[YH A yN wn7L>ZE@ "0WN/Y'&̭H-wzZPNpv" U( lq)"ԗ@ KL]EI`櫪K 9aou$P® .$~*ڞ#c+W^ws2YVMF!BEY=% KXV 9 <#pXW '#<ʲ:(?%n$#hO>{;~F`y_nŠ T:qm@;K(|_SՂ H;6r rW:u A%>F[uAv$KgӃ7"ߠ?^˱vɝ &r"hV 2 K~"b(FJQϓ^QLV>ɒ h9fxnĝF6ZE 7~P ߟWQdה|e?YqM"0KEE~T8Z:XB^#Oq9}t.&ښ ľ]-D̠%D6yhOmHsפ]eAM+K t1^i8UR ْ%&`HTOdXDԮ8i`J 籏1d7g̀^"d`[@J{]oG=RRܹŤ 3{߄\a*Հr g6yC_\oQ5Χ/\SlnR@沐 -_{|9vxZV-Z.X۔iܐJGoK^[M\@Rx;!)}:nS(T-p.E++g^ *MLxұfq]!)Y)_NgX  }7@M_!>o|_>ț:)RtylHxcԓHҵo'@b0K9ZP =d"oS](.wo0<.oG o;+^h]LǗ"!uܥ͓:ÐJX% š8ۨ  j\` TpMS\,KYIh_{q?WL߿dZߚB1V2,@,A_#F ֍v1ij1DPu LJVُumaB*=#ucWYlcc'e2RZB9~JĞKpN(jL?٩;[ُmJԫ?6>*˺ n㴍b{hqv` <+'`q 3zĺ=9_-1O"_Il{40wu WGK#UHQZtu=-K-vݯ]E?((qqX*Y{7Gv:Bad6O=zv< t*;ԋ, 4f4Ø>%nCz#nJc&6Fc.Ji"[Jn7^P0:K^H䵾W4,e# 8o)a꺹Eq;JQ8^kC3+s"92#N~ J݌|Ss@ݡe1 $n\֭EσTĵh#*op(hZmQ9R+\]N( *8[ۈ䜑_@c^fΚMɻ6W@s"AIƥPIOr@9dsp۸!K3-lIbs`#˰:\ض> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 4 0 obj << /XObject << /Image10 5 0 R >> >> endobj 7 0 obj << /BBox [ 0 0 20 20 ] /Group << /S /Transparency /Type /Group >> /Length 8 0 R /Resources 4 0 R /Subtype /Form /Type /XObject >> stream q 20 0 0 20 0 0 cm /Image10 Do Q endstream endobj 8 0 obj 33 endobj 9 0 obj << /BM /Normal /Type /ExtGState /ca 1 >> endobj 3 0 obj << /Contents 10 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 11 0 R /Type /Page /UserUnit 1 >> endobj 10 0 obj << /Length 12 0 R >> stream q /GS9 gs /Form7 Do Q endstream endobj 12 0 obj 22 endobj 11 0 obj << /ExtGState << /GS9 9 0 R >> /XObject << /Form7 7 0 R >> >> endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000001108 00000 n 0000001167 00000 n 0000000756 00000 n 0000000433 00000 n 0000000034 00000 n 0000000015 00000 n 0000000484 00000 n 0000000679 00000 n 0000000700 00000 n 0000000932 00000 n 0000001030 00000 n 0000001008 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 1216 %%EOF gdalautotest-3.0.4/gdrivers/data/int32.tif0000644003401500001440000000362013614004466020036 0ustar rouaultusersII*Hk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksck @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gdrivers/data/test_ntv2_le.gsb0000644003401500001440000000066013614004466021501 0ustar rouaultusersNUM_OREC NUM_SREC NUM_FILEGS_TYPE SECONDS VERSION FOO SYSTEM_FNTF SYSTEM_TRGF93 MAJOR_F LTXAMINOR_F ?XAMAJOR_T @TXAMINOR_T +?XASUB_NAMETEST PARENT NONE CREATED 24/01/16UPDATED S_LAT 7AN_LAT pAE_LONG W_LONG 3@LAT_INC @LONG_INCl@GS_COUNTE=?.V:W;_#>@.VT;W;`擾υ@:3";"P5H@:3";END gdalautotest-3.0.4/gdrivers/data/metadata.h50000644003401500001440000006331013614004466020413 0ustar rouaultusersHDF  f` `TREEHEAP`C` 0 attributevalue H attribute with spaces  P attribute_with_underscores  `&attribute with spaces_and_underscores  = (p êK`SNOD(P`pxph 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  (t êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  (x êK`xD P attribute_with_underscoresV` P attribute_with_underscores  `&attribute with spaces_and_underscores  = 0 attributevalue H attribute with spaces  (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces TREE PHEAPp'x0`Pp@` P attribute_with_underscores H attribute with spaces `&attribute with spaces_and_underscores ?@4 4? 0 attributevalue  (êK"`SNOD8 x$(X'P+ P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  (êK(`D1Dataset with spacesDataset with spaces_and_underscoresDataset_with_underscores@ 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces TREEp3PHEAPp:-0 P attribute_with_underscores H attribute with spaces `&attribute with spaces_and_underscores ?@4 4? 0 attributevalue  (êK4`SNOD27(9P= 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  ( êK@;`D1Dataset with spacesDataset with spaces_and_underscoresDataset_with_underscores@ 6K P attribute_with_underscores  `&attribute with spaces_and_underscores  = 0 attributevalue H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces TREEGPHEAPp8ND1Dataset with spacesDataset with spaces_and_underscoresDataset_with_underscoresG1Group with spacesGroup with spaces_and_underscoresGroup_with_underscores@B H attribute with spaces `&attribute with spaces_and_underscores ?@4 4? 0 attributevalue  (êK`H`SNODFJ(MPHQ 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  (êKN`D1Dataset with spacesDataset with spaces_and_underscoresDataset_with_underscores@ 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces TREEYPHEAPp`(THV P attribute_with_underscores H attribute with spaces `&attribute with spaces_and_underscores ?@4 4? 0 attributevalue  (êK[`SNOD Y`](@`Pc 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces  (êKa`D1Dataset with spacesDataset with spaces_and_underscoresDataset_with_underscores@ 6K P attribute_with_underscores  0 attributevalue `&attribute with spaces_and_underscores  = H attribute with spaces   (êK 0 attributevalue P attribute_with_underscores  `&attribute with spaces_and_underscores  = H attribute with spaces gdalautotest-3.0.4/gdrivers/data/fakefujibas.img0000644003401500001440000000000213614004466021332 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/cf-bug636.nc0000644003401500001440000010416413614004466020324 0ustar rouaultusersCDF  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È Z`Nu~Uq7]mӸQ.zGҳ~UjMκn٦Ok-0'5ֽ]iզUo:Zt׫S~h}رǁo _DRIENDB`   b A]OA maxzoom11 minzoom11Sbounds-117.6420540294745,33.89160566594387,-117.6290077648261,33.90243460427036 formatpng version1.1#descriptionbytetypeoverlay namebytegdalautotest-3.0.4/gdrivers/data/SENSRB_TRE.ntf0000644003401500001440000000570713614004466020622 0ustar rouaultusersNITF02.1003BF01GDAL 20021216151629 U 00000000000 00000000301500040400100101100000016000000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000004000000040INTMONO VIS 08R 0NC1M N 00B00010001004000400800100000000000001.0 0000000572000SENSRB00558Y UMS 4 mdeg 00000000000000201905070000084.05986900 Y 000000000000000000000000000000000000000000000000000000000000000000003 470 471 472 43643267 000000000000000000000000 000206b000311111111111111110000111122222222222222220000111133333333333333330000111106e0002444444444444444400005555555555555555000000000000hltvr|lnqn|}kivwmzkpxztxynr~mk||rr{}x{ovskqyxwnqzwgh|{}|nzowuowqzxpqiyrdj~~{u_imt|oxpnupsjo}zyxupllors{|~xss}rqzv{ujkxumproqtsmj~xrs{|vwy{xsu|wjdlugmzury~yx|{uy}|xrrx|{zzzytp}udiz|x|vpsutru||seeq~}zuqpsy{t|~qjmpvlwypip}wzuft{sr|zuʽ]ķyxxor~wu~h`vxx±^Ȼykn~~vvzed|~ywn{ik|~snw~wijyvr~dmw{}{xpklxzpoqqnjp}s_{yYfstyus}xpnrz{qgjtp`bwvfvw^dk~wnuto}{||{{{{gdrqa`r~}rigg~}{yyz{xsw~tr{|wv|{idmqlmw}qnwytq}hkpfpyyuputnrusollou{yroryjni]l|vhnphqrijv|slox|~yb`vsfrrequorwnpv{z||up~}}zokstkxgVbxmhlrz~~zrjfvvw}}nn}|xsxsYJTzmw|rllhbl{pmm}vnjv|v{{smmoqrux`_egjkigmy}xjdp~|qr|{l_a{ronjiifcm~ozmht}shisum`_}ôtgnz~}vf[kmuwqu|wh_clsmcp}ttyl[fty|}jesxmb`fnk`fyu_exwvopyoqdXhtrokf`ZYexzmlx|vw}v|qltvkY_kqsof_`jrtwzvoknqttuxvifw~jbeknjgjxkftwjbeilot~}oghotts~|wlkqqnvnejlf`_bghhq~uaS\w{tvo~g\frvpb]bdabgd]h~iWYh{x~xcY\ejf]X]adjqqmtxpr||meiqthSP`f]]kxpcưqzzkel}xVVxxs~ka༎ogq|}szvy|z~wsuwгs{{yyqegtthiu~Ż{ppqonokgjsqedlrrky{kbdhiiijkpspfcfigdalautotest-3.0.4/gdrivers/data/fakemff.hdr0000644003401500001440000000013713614004466020471 0ustar rouaultusersIMAGE_FILE_FORMAT=MFF IMAGE_LINES=1 LINE_SAMPLES=1 NUM_GCPS=1 GCP1=0,1,2,3 PROJECTION_NAME=utm gdalautotest-3.0.4/gdrivers/data/empty_double_attr.nc0000644003401500001440000000256013614004466022441 0ustar rouaultusersCDF xy GDAL_AREA_OR_POINTAreaDEBUG_EMPTY_DOUBLE_ATTR ConventionsCF-1.5GDAL0GDAL 2.5.0dev-62c58be-dirty, released 2019/02/20historyFWed Feb 20 21:29:25 2019: GDAL CreateCopy( empty_double_attr.nc, ... ) transverse_mercator grid_mapping_nametransverse_mercatorlongitude_of_central_meridian]@ false_eastingAfalse_northinglatitude_of_projection_origin scale_factor_at_central_meridian?#x long_nameCRS definitionlongitude_of_prime_meridiansemi_major_axisAXTinverse_flattening@rouUHx  standard_nameprojection_x_coordinate long_namex coordinate of projectionunitsmLy  standard_nameprojection_y_coordinate long_namey coordinate of projectionunitsm\Band1  long_nameGDAL Band Number 1 _Unsignedtrue valid_range _FillValue grid_mappingtransverse_mercatorlAAALALsk{gdalautotest-3.0.4/gdrivers/data/L71118038_03820020111_HPN.FST0000644003401500001440000001100013614004466021676 0ustar rouaultusersREQ ID =20020628487 LOC =118/0380000 ACQUISITION DATE =20020111 SATELLITE =LANDSAT7 SENSOR =ETM+ SENSOR MODE =NORMAL LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = 0.00 PRODUCT TYPE =MAP_ORIENTED PRODUCT SIZE =FULL SCENE TYPE OF PROCESSING =PRECISION RESAMPLING =CC VOLUME #/# IN SET = 1/ 1 PIXELS PER LINE =15971 LINES PER BAND =14351/14351 START LINE # = 0 BLOCKING FACTOR = 1 REC SIZE = 15971 PIXEL SIZE = 15.00 OUTPUT BITS PER PIXEL = 8 ACQUIRED BITS PER PIXEL = 8 BANDS PRESENT =8 FILENAME =L71118038_03820020111_B80.FSTFILENAME = FILENAME = FILENAME = FILENAME = FILENAME = REV L7A GAINS AND BIASES IN ASCENDING BAND NUMBER ORDER -6.199999809265137 0.775686297697179 GEOMETRIC DATA MAP PROJECTION =TM ELLIPSOID =WGS84 DATUM =WGS84 USGS PROJECTION PARAMETERS = 6378245.0000000000000 6356863.0187999997000 1.0000000000000 0.0000000000000 123000000.0000000000000 0.0000000000000 500000.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 USGS MAP ZONE = 0 UL = 1203928.6430E 324143.1998N 280350.000 3621450.000 UR = 1231244.1432E 324301.2974N 519900.000 3621450.000 LR = 1231228.3653E 304632.9836N 519900.000 3406200.000 LL = 1204222.5466E 304520.5522N 280350.000 3406200.000 CENTER = 1215645.6957E 314432.3386N 400125.000 3513825.000 7985 7175 OFFSET = 0 ORIENTATION ANGLE = 0.00 SUN ELEVATION ANGLE =30.7 SUN AZIMUTH ANGLE =151.1 gdalautotest-3.0.4/gdrivers/data/LanduseSmall.grf0000644003401500001440000000070713614004466021462 0ustar rouaultusers[GeoRef] Columns=75 CoordSystem=LanduseSmall.csy Lines=75 Type=GeoRefCorners [Ilwis] Class=GeoReference Corners Description=Created from MapSubMap(Landuse.mpr,1,1,75,75) Time=1201538956 Type=GeoRef Version=3.1 [GeoRefSmpl] a11=0.050000 a12=0.000000 a21=0.000000 a22=-0.050000 b1=-39774.000000 b2=404526.000000 [GeoRefCorners] CornersOfCorners=Yes MinX=795480.000000 MinY=8089020.000000 MaxX=796980.000000 MaxY=8090520.000000 gdalautotest-3.0.4/gdrivers/data/DNEC_250K.vrt0000644003401500001440000000606713614004466020352 0ustar rouaultusers PROJCS["NAD83 / NRCan LCC Canada",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Decimal_Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["central_meridian",-95.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["standard_parallel_1",49.0],PARAMETER["standard_parallel_2",77.0],PARAMETER["false_easting",0.0],PARAMETER["false_northing",0.0],UNIT["Meter",1],AUTHORITY["EPSG","42304"]] -3.0000000000000000e+06, 8.7890625000000000e+03, 0.0000000000000000e+00, 4.5000000000000000e+06, 0.0000000000000000e+00, -8.7976539589442818e+03 PIXEL Red WMS:http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=DNEC_250K:ELEVATION/ELEVATION&SRS=EPSG:42304&BBOX=-3000000,-1500000,6000000,4500000 1 Green WMS:http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=DNEC_250K:ELEVATION/ELEVATION&SRS=EPSG:42304&BBOX=-3000000,-1500000,6000000,4500000 2 Blue WMS:http://wms.geobase.ca/wms-bin/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=DNEC_250K:ELEVATION/ELEVATION&SRS=EPSG:42304&BBOX=-3000000,-1500000,6000000,4500000 3 gdalautotest-3.0.4/gdrivers/data/byte_pds4.img0000644003401500001440000000062013614004470020756 0ustar rouaultusersk{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.0.4/gdrivers/data/fakebig.gif0000644003401500001440000000011013614004466020441 0ustar rouaultusersGIF87a̙fffd333,@gdalautotest-3.0.4/gdrivers/data/BAND2.DAT0000644003401500001440000000000013614004466017500 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/ignfheightasciigrid_ar1_noprec.mnt0000644003401500001440000000023113614004466025212 0ustar rouaultusers-152 -151.5 -16.75 -16.5 0.25 0.25 1 1 1 0 0. éix -152 -16.75 4 -152 -16.5 1 -151.75 -16.75 5 -151.75 -16.5 2 -151.5 -16.75 6 -151.5 -16.5 3gdalautotest-3.0.4/gdrivers/data/fake_e00grid_compressed.e000000644003401500001440000000155313614004466023350 0ustar rouaultusersEXP 1 C:\FAKEE00GRID.E00 GRD 2~}~ )5~ )4 2-~^$36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?j`88r&#FA' tu <ҩlPNA+E p*)(^i`TñL搰9'C%\ UTp31ڒ@szj948i8''}+[s؊yw/ҟ oE^MD22iS94M=IJB;zrSi_1M9hlUiS3*@jGߌ)C lWwL/u$\rK- U/M' >f^@0ǥ h@TE{0 P(=HJFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?'o*9YN)r8W HPrE5Iҽ~nmhph jY2[5/94І# T82W+8Sj *h# @S @D枉8Iޣ&.cA;ۚqsQy;zT9^hWcרsZNj<)@P>q5; $@ Z?Z׊T"^SE5^iBV!n3VW5࣎`oI@@G>1B*@.3bB1Ӓhǥ"t`$Jѱ!=AҚ ɠI> rrL884JiE9_ƀ$U,8jha#Ґ qHOZz & 4JM9QGWNS̃+Ԁj&<qF E$9i ȍrR:gXcTO=(#;Г%$ƀ{Z /L"=)sFB$-S uϥ(\+ ޘr*B4L3OޤQ6GZ&04 Ln=)X:}*5bSb cR .4+ЊZwfT%L(l>n2u36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO$" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?g~4\GAQʓmywĎWtyҟH3yb E/@Z+? 9='֞g #*J䱸O#zȯ#ڠ-f AS#_w_h_1]gh([faш"F㞴R5nCr毄ZdhIQ1p8-E+OhIψn0{JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(Ւ{f2;s\؀́N(ARX= L)+y9"Tҥ`sOXRl,D#PySAy=)d: 8qAxrN=Elq+Zi 僁,{]U95rlS~˵'!rrq)Bu$2y6>9RB3joXJDO,% ];Le⁕D{iqSy{zP; #8|<J6mY=nŋNI+Q3- O$[ c `g'js\87xS^i$Yt=ri;Ұ-,Bd )}ʼӽ'IA jIE"ԷAYHX.~YԀe#=s֋ 'FGw}*8b}W,T+:Qh8@bܚs2[ٮ3!O[fW*l`cۭQ"")ry()ʸD:4})447'F}@ ͌yȦ'=谅IKU$Oz$ ֘~j#T]9 zԦSEs}~1*ӏZMɢb%}JPE`ZhQp85#,銊@4aW^0+@'QM1XUxEL&G>4P7<^3R(v8)>֐ySMF aanE!a@X`$8 P"X$BxG2rH#8ڥ>nMRd;*Z9Rg4]p{iTq;0$x֡Kvp}hw5@0#m=ED89M4j2 I8)iy=(&20(g:T@|0L ~8c6,sSzf!$ t[йzBAe(<iʨX1R}*񬯆42ڨ5R.N(a##"$Rړ4"9NMVR3S;R}(sQfq36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?֝947!z:y~˜P}FրTye cB8F铀Mϵ(uQ5q U1N"5 8W|:Qbp GqOqsMF\rsP(0"Wu#`3@ n,r)s{z85#_ÙU4R-;nm/F/$Ԥ'>cUe djJ-J0=1ڭG#`r>X.hF848T106sSaYSA$Jpe >F6sq~)1T`r1Qzⴣ/NނCDePu'=iZIxAQi [508X@BEV]M0BcPD_R+*Ko"ȜU"cmVm<\Rj5| B HqQ:9ZP fڐw(=EC 'vO5^x{4+'9YA>zՍ&q@# R晴$PGJ5&)HR㚃wjRMW$ÑK2>B40zPnp;L\Ef3j[ztz{n3cASpp)I'V;D2[90]4{RN==eS$9Xe)g>\v+S~ :Ӹ/~RiNPsM8:*h6*IҠt ϡa\pr+) '%{\i(cYϭ.Qsr^7Ms`zTÏJHik)8 Ѿ=J,4JpqңO^ƭ+/b*FQxd֚aRE; )U׃n{Rd؀GIx. ܀G A"8z%9TQJ.xpi8!c`z=ة1O?ZrR:q$SI N4r/=*sXl)ʅ Dsm5J &1V,ʢuӹ6#4zwcR{tBvH 5hZn;b36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO$" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?"A֜܌sA\GHp3dV'H㎆nMǨ@gnKGŽw {R2)Rq\AeGIH'15Nfen>,7LE'm c;?0{7`f5biԪq\gAWCqÎj0j:0ۯ܏?E;_1]?0{ySIڸЄq@@JGR*7P^'_QOZ EuFsn*9TnR=<2`=36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Syn5!+C{\H/qPHH~ZhDrZ0cG, *2͂r*Srf+JnNj1q$rYP9>تj{@_`BqR,#49zI ǓO*1֨eb)Xhz )) E9#4MjfyDc@y XK$$95+W'8V38u1mCAj`n"5da!9hJCC%sAՙm0(\c;RUxL wUnNĚQEIcJmP}RE}6lg36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?< cۚoGAQJNjQ:Ҳ3֢|p4XW4oN=hi) <Ԍ zJ/s@ #RlR(/7㚱HGLbGM1;U ;G8;je%ʧzP&6i 3P;ֺYb>F֐cҩ4D|v3OZ}r͞EY&}2*mQJBi3HzS#Wz%]P!C<.8LfP2lLLR3sj,Sj0Q@b$N>EQu?mz~QLh(֞|(P1å!߅Sz(bb`aa_]~]~_bdca_]~\}\|\|]z\y]y`|dfc`|_{fga}_{cc\zggadfc_^affda^\}\}]~_}]{]z^za~fhda}ikgb~ejeXvgifgebaacefeedcbaa\{]|_}acdeeidadjkf_efggecbcdeeedccbabba``acfhlhehmoicegggfdddeeddccbbaaifb__cfjnkikoplgiihhhggggggggfffffljgfefgiollmpqnkkkiiijjjjjjjjjjkkkjkllkifdlllnoomkjjjjklmmllmmmnnoophknpokgdkmnnonmljkjkmoponmmmnoppqqjkmnnkihlnppoonmmmiloqrrpnmmnopqqqlllkkklmmorrpoooopsqqsuurprppqtvuskllkiknrllmnnmlnrrssstvvsqusrsuwusmmnlkmptnnnoonnntuutsuwwurvtrstuspmnonlmpronnnnnopuuvuuvyyvtvtrrssqnmopommnqonnmmnnqtuvvuwyyvttropqqolloqpmlmnmlkjjklottwuuvyyvttrpqssroortsqnnonljhhjlotuvutvxxvsvtstvxvutvyxusrrpnljjlorvuusttxvuqwuuvzz{yxz}}yvuurpnlkmptvwtvxxwtqmstuuuvy|zyxxxupmflpokiovuvwxyywtpmqtuvwwyz{{{zyvsplpusomqxuuyz{zxvrortvxzzyx}}}|zxvtqtwupnqwvvxyzzzywustwz}}zw|}~|yxwwruvtomnqyywxyz{|||vvx||xz}~{xvxzwwwurppq{{vwxz{|}~zxw|łyz}|wuy}|{zywvuu{|{{zzzz{|{x|ƅǂ}|}xw|~|zyyywvz{~}zyxxx|xzņʃ~Àzy~{ywwwwvuyz~ąDŽ|yy~{z}ąDŽƀ{~}wvzyzzwtsvxppu{ąńƁǂ~~|~zy{‚|ywxz{xugfkr{Ń}|}~}xty{sbachosvy}~|z{~~ǐωzrwxvuz{tcceghhinu{z{{{}ƒŊɅ|wy|rux{{zxvcehhgedhntz|}{xvwy~rlq~Āxrvzzxuvvcdcegfeegjosurkeb`^W|Ty[htyxzyxxyyxugdalautotest-3.0.4/gdrivers/data/L71118038_03820020111_B80.FST0000644003401500001440000004074013614004466021617 0ustar rouaultusersPPFFEETT]]]iiwwzzyyzz}}}}{{ooccee__bbhhqqqggccbbbbbbWW__ZZPPPVVhhxx}}yyy~~yymmbb^^aagg``cccoottqqxx}}~~||||yyy{{~~xxwwwwzz||yyyvviikkrrdd[[ZZaaZZZbbbbffrrrrqquu||{{{||~~zzpppddnnuu{{xxxx~~vvmmllhhoo~~xxccYYJJ>>>99==@@22**%% ((+++++%%##''**''"""""""''0000''))((//..111;;44>>KKUUZZUUOOOOOJJCCDDAA99AANN]]llrrr}}uuttzz~~qq]]]HH5511//++22@@ffpppllqqzz~~iiWWBB,,,%% && ))6699555++++77KKYYcc``cc```__ee``\\WW^^aa__dddbbbbVVPPLLCCHHTTXXOOOLLII@@>>885599??LLLVV\\YYRRTTVVVVVVYYY]]ZZ__YYDD;;8888===DDGGIIMMMMKKGGMMccfffnnyy}}~~{{wwwvv||~~rrhh```VVQQQQXXcciibbccbbbiiuuyyttttssdd__hhppp{{{{zz~~~rrmmttxxttuudd]]ZZ^^ccchhhh``ccbbggmm~~vvqqssyyvvwwhhggrrvv{{~~ggKK88*** !!&&**,,##!!!!!!! &&&''!!##$$!! ## """!!))@@RRgg||wwhhLLL<<00!!##**++(('''**((--3366::77;;55544++&&!!((++**++%%(($$ !!!!!   ))++**---,,%%&&!!!!!!$$$$!!!!!''%%''&&''++++(()))--//,,,,338899CCAAA::AACCOOddtt~~rraaaRRNNHHBB77--))""""!! ((((&&&""##$$&&((((//**!!!$$(("" $$##))''""!!((,,**!!## ""$$!!$$  ##''''((**0002211//++..333300)))**""%%**--66EEJJ@@666))""&&"""'',,000::55....,,##!!%%**))//11--"""##&&##''--((''**,,,((''((((**..--0088800$$((((&&**..%%$$$//5555885522,,****999KKbbww~~oooaaYYZZZZVVZZbbbbjjjkkuuuullUULLJJQQ___{{zzzzyyuujj``]][[ZZZZZWWGG;;7755==IIZZ]]]ffooxx}}ttVV>>>--++%%##!!##"" &&&##))((&&%% ++&&&!!!!""&&  )),,,,,,,##!!((//5599>>HHYYmm}}}dd^^bblllmmffffnn__WWMMKKKKKDD==77,,22DDTTvvǮп»÷óooqqkkdd\\\JJBB>>??WWll~~xxYY??44222554433==CCGGMMSScccuu||rreebbffjjcccPPCC>>DDQQQQGGBBAA@@@@@779999<>FFCC>>99999==<<<>99::>>HH]]lll``JJGGGFFCC@@BB??@@BBEE>>>7755::BBAADD<<,,))'''))**22..337777;;777==JJPPMMFF>><>@@NNLL55110066GGGSSkkeeeRRHH@@CCEEEEEESSVVVddssòzzssffTTIIHHBBGGGOOJJ@@<<44--&&%%'''**,,8855--(($$"" &&.....%%!!&&%%##""!! $$'',,//227777332222233..))&&%%))00///3311,,//447711##,,@@@IIXXmmooollhhdd]]WWZZQQII666%%%%####%%  !!""!!""''''''**1133@@GGXXXnnzzxxxxvvccOOGGMMUU[[YYYPPRRKKRRXX[[UUZZYYYPPGGJJWW\\kk~~ÙܹuummwwooUU99+++**1166==AADDJJTTVVVYY\\WWJJCCFFHHHHMMMIIGGTTYYSSLLHHDD===::<<55;;EEMMHH>><<<<<@@BBIIUU``^^ffss~~xxqqqqssaaa\\[[@@$$  $$''..****''+++22661155<>AAEEJJPPQQCCC//----)),,7777<<:::<<@@JJUU^^WWggvvzzqqpppuu^^OOHHGGKKKZZkkxxPP::++&&&##..555**!! ''**)))%%''44IIccaa888))!!'',,//::UUݠZZ66++))&&%%## !!++66::BBTTTTXXXuu˺ŷwwoonnooxxvvlll``__QQHHIITTZZ__]]]zzddLLHHDDCCC8888>>GGCC44++,,&&&(($$--//11//--1199@@@;;44<<>>??==BB>>===//''$$''!!))## ##''**++,,,''$$((!!"""""''%%###%% !!&&&%%&&******(($$(((++,,&&!!""&&11;;999FFRRTTWWZZ\\TTPPJJNNNWW]]QQAA7711--55999..%% !!$$""!!!!!!&&!!##)))((!! !!,,,,))&&&&&((,,77IIbbnnggQQQ55''%%''&&%%%&&"",,,)) ""%%**6655666::<>CCEEEBB<>333,,%% $$++--228884422))1144BBOOQQIII>>33))))&&&&44::DDD>>11....$$ $$""##""""####!!!!,,77;;::55//---))&&%%""!!!!!!!!""$$""###%%!!''%%$$%%"""++,,$$!!!!""&&(('''''$$%%$$((,,//))))(('''##'',,,,3311++33///,,--//++))5544+++++..33222233774422+++++**,,..0011::<<::>>><<778800..--((%%!!! &&**))..66::DD;;;11))%%##33<>--++''''((55RRsssqqqppooyyzzggOO::+++$$ ##!!//77444,,''22IIaacc\\]]^^^ccllrrffeeffiicc___SSQQPPUUWWLLGGKK[[]]]WWWWIIDD11002288===MMPP__]]ddffdd``XXXXXNNLLEE==<<4433777??IITT]]ffXXTT\\ooyyy{{xx~~{{||{{xxppgg___ZZWWOOUUbbeeccee```ssuuyy||{{ppggggiiuuuxx~~~~vvvuuvvoojjmmoonnuuyyy{{tt}}uurrttvvvttnnee]]WWWWddvv|||yyvvzz{{~~uukkddbb]]bbttt~~}}{{{xxiiff__bbllqqww~~~ccFF222%%!!##""$$$$$,,,,((##!!"" ((###$$$$%% $$%%88LL__uunnTTAAA..(( ##(())--11---//''((33??EE==<<66655//**$$""!!$$##""&&!! &&&  !!##''..33322**&&""!!!!$$ !!!!!!""**''$$%%'''))%%&&))55CC>>>>GGGBB<<::HH]]vvttfffYYWWYYUUII<<22%%&&!!%%$$))*** !!""$$////11**!!!((((%%###%%**&&&&&..++--((""##&&(( !!$$$  ##!!%%,,,++..**++..001100333..$$##++3344??CCDD;;;++&&$$33>>>??BB22,,,,//&& ##&&..//(((((..--//..(()))),,,))&&(())++++))--0004400,,--44225577???KKHHIIJJFF99//3377CCCVViixxttooii\\RRREEBBNNIIPPQQSSYYVVVZZbbff\\KKEEJJRRggg||{{||xxxggcc[[NNGGHHFF@@FFF@@::773355::FFLLTTTMMRRXXffiiZZSS@@333$$##**%%%%!!##!!$$&&&''))((##&&((##$$###$$$$ $$***%%''%%  ##22AAEEFFHHNN]]ssʰbb````fffggffrrwwssqq__UUPPPJJGG<<22..88KKkkýĽť{{{yysshhZZWW[[VVNNEEE====??@@NN\\ggttttqqqssoonniiaaRR??77>>>AA;;2255>>IIQQJJZZZooxxqqccZZWWiiii\\\LL==::>>CCII>>9977222**((++++//6644(("""!!++00''((!!(((++''!!!!! ""%%**66::555--%%((--**!!""'',,,--++..004411//2233333..226611++))##!!###&&,,--++((&&&&&""##""##$$##++++11166;;//$$**//5588999++**//5533558855(((,,))**((**''::GGOOOEE66))**++## !!!!!!!$$!!$$!!00IITTWW__kkjjjpp~~zzssYYIIEESSXX^^[[[XXPPGG??44..**&&'' !! %%++555HHSSGG44**((//>>SSSggxxUU<<66331133377772211AAXXjjwwxxxgg[[LLGGGGHHLLLLMMMRR\\^^[[XXZZPPFFEEEMM__mmʷttppzz}}``ZZWW```aallggYYYYQQ[[SSMMMRR__dd````FF33,,!!!$$AAJJRRQQWWYYZZbbbhhnnmmffggjjgghhoozzzyyhh\\\__oo||ccOOKKBB9966677..$$""##**///66==44331133//**'''!!%%%%""##))***))((##$$88BBMMUUVVZZZQQQQPPOOBBHHHHPPDDD;;33&&   !!((""%% !!!""((--++0022))))++'''!!--))**(( ###((,,,,&&$$''&& !!!$$%%''...<>>EEQQqqyyhh]]XXXYYOO>>)) %%&&%%***++++3388@@>>??::999<>88>>EEHHKKSSbbjjjww{{__SSPPPLL>>;;>>==>>FFJJHHH::00//4499AA::11//,,,,,--33//11221100333AAGGPPLL@@>>@@==<<<;;DDPPKK88001144<<>GGSSMMMKKFFEEDDOOVVZZiiqqqcc__cc^^ddwwǨ˵xxOO333--22==HHVVbbwwppYYIIDD@@JJCCHHHEEIITTVVNNEEBBFF@@@>>CC@@;;>>DDCCCC??DDDAA>>==CCSSVVYYpp~~uuiillzzvvooww{{ZZ11$$$$##**))),,--..337799885533300..00@@kk```zzКffDDD44//55662288BBFFAA5554433++//,,''%%%%(((1133;;BBDDIIMMLLDDD33,,228888995566888::<>OO\\ddccYYEE99**$$$%%"" ))*****''$$$$$$""))+++,,66PPrrŏYYY::00..555577JJ^^gghhh~~II..''%%))))""""" ''))--55;;::FFFWWjj{{ggbb__VV]]kkk~~wwzzggccXXXPPLLGGFFCCNNSSXX\\\sseePPLLDDAAA>>GGLLXX]]PP33,,+++22::??==8855,,22::BBBAA@@AAJJTTIIDD>>333--((##""!!'' %%!!##,,**22..---%%!!!!##)))&&  #### &&&$$ ))++,,..00//...))--++((((**11>>KKKTTXX\\]]bb__YYQQLLXXXggZZSSGG6600--77333//++## ''!!!!"""''  &&))((&&"""####''11@@QQggeeRRR??00%%!!!""##+++((!!##))((..//000==EESS[[WWKK@@99444552233--''((""!!!""$$$$%%((&&&##))//0044;;//))++,,,0044BBHHHH;;00++777<<22,,))%%,,--+++((''((--++(())++,,,335500002266<<;;;;;77553377--33//++++***--44))''&&00//..!!!'',,..,,002222110003377BBFFIIHH>>DDBBBAA<>KKVVWWKK==//+++**&&!!''$$""##!!''((&&&))11;;AANNVVTTDD55///11++**0022::::<>;;AAADDBB4400--00**&&%%%!!''##!!((,,//88:::77330011@@CCLLJJBB777//''$$**((****### (('' !!))+++--((''**221177>>:::77**!!))''%%""%%%%!! !!%%--+++++%%((55??99;;22***$$##//++11////445522244**..44((!!####### ''444,,++((//@@XXffmmiiggg]]FF.. ##'''$$   %% $$,,1100***''##""##""&&333BBRR__^^QQJJNNGG:::00..11**&&//77==77BBBEEBB99++     )))--++3333##    --99EEIIRRPPPPJJJ@@::44-- ''555==AAGGMMVVUUZZZZ[[[UULLFFHHJJEECCHHNNTTTTTPPMMMMOOSSGGAA999220000EERRcc^^GG22**!!"" $$!!&&&%%$$$$ !!%%!!"" %%((****(($$$  ---''"" !!#### +++DDmmffEEE..''##--//!!!!!##   gdalautotest-3.0.4/gdrivers/data/cf_lcc2sp.nc0000644003401500001440000000711413614004466020555 0ustar rouaultusersCDF 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.0.4/gdrivers/data/isis3_detached.lbl0000644003401500001440000000357613614004466021753 0ustar rouaultusersObject = IsisCube Object = Core StartByte = 1 ^Core = isis3_detached.cub Format = BandSequential Group = Dimensions Samples = 317 Lines = 30 Bands = 1 End_Group Group = Pixels Type = UnsignedByte ByteOrder = Lsb Base = 0.0 Multiplier = 1.0 End_Group End_Object Group = Instrument TargetName = Mars End_Group Group = BandBin Center = 1.000 OriginalBand = 1 End_Group Group = Mapping ProjectionName = Equirectangular CenterLongitude = 184.4129944 TargetName = Mars EquatorialRadius = 3396190.0 PolarRadius = 3376200.0 LatitudeType = Planetographic LongitudeDirection = PositiveWest LongitudeDomain = 360 MinimumLatitude = -14.8228149 MaximumLatitude = -14.7275028 MinimumLongitude = 184.4411316 MaximumLongitude = 184.496521 UpperLeftCornerX = -4766.9649842452 UpperLeftCornerY = -872623.62882223 PixelResolution = 10.1025 Scale = 5864.9453125 CenterLatitude = -15.1470003 CenterLatitudeRadius = 3394813.8579782 End_Group End_Object # Make sure we test hash style comments. # These comments are expected to have the # right at the beginning of the line. Object = Label # Some comments even have spaces before them (#2956) Bytes = 65536 # Some valid values have #'s in them too. AMadeUpValue = 16#FF7FFFFB# End_Object Object = History Name = IsisCube StartByte = 1 Bytes = 957 ^History = r0200357_10m_Jul20_o_i3_detatched.History.IsisCube End_Object Object = OriginalLabel Name = IsisCube StartByte = 1 Bytes = 2482 ^OriginalLabel = r0200357_10m_Jul20_o_i3_detatched.OriginalLabel.IsisCube End_Object End gdalautotest-3.0.4/gdrivers/data/grassascii.txt0000644003401500001440000000024213614004466021261 0ustar rouaultusersnorth: 250.000000 south: 0.000000 east: 150.000000 west: -100.000000 rows: 6 cols: 4 -9999 -9999 5 2 -9999 20 100 36 3 8 35 10 32 42 50 6 88 75 27 9 13 5 1 -9999 gdalautotest-3.0.4/gdrivers/data/test_ntv2_be.gsb0000644003401500001440000000066013614004466021467 0ustar rouaultusersNUM_OREC NUM_SREC NUM_FILEGS_TYPE SECONDS VERSION FOO SYSTEM_FNTF SYSTEM_TRGF93 MAJOR_F AXTLMINOR_F AX?MAJOR_T AXT@MINOR_T AX?+SUB_NAMETEST PARENT NONE CREATED 24/01/16UPDATED S_LAT A7N_LAT ApE_LONG ՟W_LONG @3LAT_INC @ӃLONG_INC@lGS_COUNT=E?:V.;W#_@>;TV.;W`@:;"3"@H5P:;"3END gdalautotest-3.0.4/gdrivers/data/bytemff.hdr0000644003401500001440000000114513614004466020526 0ustar rouaultusersIMAGE_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.0.4/gdrivers/data/ns3114a.nsf0000644003401500001440000000125013614004466020172 0ustar rouaultusersNSIF01.0003BF01NS3114A 19990107084800Checks the handling of an NITF file with a STA text file. U 00001000010JITC Fort Huachuca, AZ (520) 538-5458 0000000006800003970000000000010282000010000000000000000TEJITC00100019980107084800This is the title of unclassified text file #1 in NITF file U21H00N1. U 0STA00000Agdalautotest-3.0.4/gdrivers/data/erdas_foo.jp20000644003401500001440000035257313614004466020767 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolruuidK=KCզII* (1BCDES  6IMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $A\A??   )#IMAGINE GeoTIFF Support ERDAS IMAGINE 2013 Version 13.00.0002 13.0.0.598 Projection Name = Transverse Mercator Units = meters GeoTIFF Units = meters|(1BCDES  IMAGINE TIFF Support Copyright 1991 - 1999 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: etif.c $ $Revision: 1.10.1.9.1.9.2.11 $ $Date: 2004/09/15 18:42:01EDT $??A\A   )#IMAGINE GeoTIFF Support ERDAS IMAGINE 2013 Version 13.00.0002 13.0.0.598 Projection Name = Transverse Mercator Units = meters GeoTIFF Units = meters|uuidK=KCզII*(   s'?sThis file was created with the ECW JPEG 2000 SDK build 5.0.0.1261 copyright 1998-2005 by ER Mapper. This GeoJP2 header was translated from the following ER Mapper style registration information: fOriginX: 0.000000 fOriginY: 0.000000 fCellIncrementX: 1.000000 fCellIncrementY: 1.000000 fCWRotationDegrees: 0.000000 szProjection: RAW szDatum: RAW jp2cOQ)R IYiy\#"wwwvoongLgLgdPPPEWWWadKakadu-v3.4dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -38.4, 4.4e+02 -40.9, 4.7e+02 -42.8, 5.3e+02 -44.0, 6.4e+02 -44.6, 8.5e+02 -45.9, 1.3e+03 -46.6, 2.1e+03 -47.7, 3.7e+03 -48.3, 7.0e+03 -49.2, 1.3e+04 -50.1, 2.6e+04 -51.7, 5.2e+04 =Xa&%,j[ AC%a0X6l`q_})AL&Nf`S(vo`}TX缸):nuYI`ыl?18꫙i |;n({pU;ڣt`wNAUpDl!/ = "Q;mfe11W"fǹZ`Qo O;*bTGݭy:;K.GI΀;3I.0@HR)R>&hͱt`x;V`pKNЫo=A\~U|߀U *ں;}1y*%|joYPC(/ Q=U}Ϯll7LFO=\ ºƅ!S_϶OE nЈTp8<tInz7E~W3О6қ 7M]b™tsI3Dc+Aϸ dܺB A ;_SxI5"` R!|̔QR`Y4,K (b=i> Dvyӫ|@ϼ%=\@.o|80dz1M"ѮGьsТ_%:U~"qVDM70of=nQRaFާ@#w0>K,Q :M&@KD-T|V #SFdaRACt_H nd= q놦-wkJ  ;M]`4Ӣf l h?iqpW}3O-\` Ƿ;o#rW̻Cyp%ԄD5?=u'|p)4_L}|;/[S-,Gl&ң [?W d̉.4?`H^ufSBH|dc Z_W-1j[nk/h^ w>PȏKQSSO ̩<+P?&i6udzb (bQh",P6=k/$Q,l^;NARPppaFhXl'L֥S3W:1KN0"ϒ wGU;kୱ|-RJƫ!P(~"TOB ?eg.;cRcG;s-|oȨ%@Nwb!13}7I]Ejϧ; .?/4&㗤e6iG 疢Bx RAD2+e[ swpb]LhA|>(їܪ0;Sb,u: :PB; i%5ܚrq8_'3M&xcL"Q#M%(@;]QwM횡FG:ewA%%_BXB?r %T<Aw72>+vT򶷦M߹|>[C 0F]nyڊFRin ]h@WSB^E"9)V`#[P{?֖ L)6x>lg^~i="+7 it)7R_Ò#i` ߳J3DtILM )AA#M شmJɄ6)ͯIaֈBR9t ݷ&C+sm kBV3w ueV, Unʜffհ絁e{8`c3 lсil?χ:ntwz‘J fv/7c0e7˖#)`i@ݼA, FoO1?s/Kb?ZcsM 78ހe\4HC㵚y2m= :k)Bm 4g ¶0+}3QenY#$u`ruX`DZ XP J)0Wq2X]Icr;na/F-Qԇ[X^dnt3F<|n!s3qxun'-D /hmzJָDwbݚ&v"|`";BRo}:ft?ޢ6WnGygYӨ,DzѶA?Q r^1c[j2xu0~%) wAX1CkJZm54IfY͝D!M'ґoogx84곢 p/FEFjO{c;j,-V~:tCC#6RWԊkI=n.V'zi0|^ETACɶR7) ?0 uxKRu!^+,~)jҳ6ΎrsR3kOH 5 ~9C#4@UfLFqaN@&vhK-߯zSQxLPzҥLvHEy MCO ʼnMKO/>oO lؙ.6 lFܢs![ryGr̺N Q:Їh!/U8Amkx!~,jQU (~Yo6`.E"3rr =b]3X÷:f<4~>}pȈ1"\gٽWۙڀS<ˢB,ll0\'d@Av50.]NmϾuaבقcucN-,GY=zuM90ٚOJ4M#\9$&ZB\)U_)CǰLGŭlksz3' hpbF 5 wN%6T?V ~|vXZb쇮0,l;Wj:9s4:pl^b(ޗk+q \+5FהNPnPmIO [iSq>+[wkqw9ۑbTXy9٨v13산u<jğ>`EHyn?cz8K5-1jYDC\8N5ΊlVbT{g^Z# n>*r ,hS4H\dX9R!:/{HX, l 7RVxzyp*,{*IOgZ2k[Gܖ] 2Fұ|%5S8KgLAn)yIF 5(`mN} ƪQj>e`|흲D=[[prڥQJ#7`ps8]p4Q B"tpiAgIam;v[kbv$i;5|P|tsf G"S6Ċ.*ZPn)=eb?]*sK7=|/IѲ6]EfN2W\0쵂&-ݧj K.= Jo]YW4]cR.ƵGtzCQY]&m|xG2 -I盰Z7E,Fúl 룒*7k/-yGlDdwo@yUp0+J:\f&` 1ᘱ\ZfUClRdg"EJDFgV $L 0S۟w3G쟱fv_hBǂبē(Ʇ ر_T(5ogssKO?řT()gr4~HWa߰ UNBŞ@"҇O% %aq6=c gc#5k 6|d=(u5aKKˤ);ir<2K֋ɶ_p,Ke^#p&[oBNgHw ϘSP&b4|L)OkՋwB-zcoS!9~m /*Kǀe]8$uPlV>'Hrb/* i qR!Qτa9#$H=A2r.eY|լ#YPPMW$3G1a6n?N3=_&`=e/J/'~Es”CSGQr\4tz3*DcfD-0F3_;p2O}xʝ s=+cl/ zkUU J17seU5NLeN0,qiXXTc{H쨿ګ8):(G mYx45V^ni煗=YU"T*"L۬› m*]a0{mX$݊(Motc9_Z @Qn<bG:+i_?xAW^qy@ W^-sˌ.N_ yvq>#7%(, ,;&-'f\DISCY7?Cepum@.1tu1jd1Ґ s3? z]♹99ױp@Q2c!e rUw?}e|Lk!t<TMEU!gSpWKq |iڶ YRaXg(wvDHɳ&_9q^"(݃^oS;xŴ̜ҕRouctapg?Š~=5({uFu@̉CAr_N!qjp/)ӻ4JV^pjߛCW'LVZGQ.>cciCLsm ܺAqx1t4Ž6R*"L4jt XEՎ%Ѐ$[Kɋ]1jueJh~`?1}-Ǒ?m[ JsyGx\IE2!%+ygӹ77|e~c`*oL@2 {aGf佷lpEpRW7 F@G crdSkE#ݔ/fHfB/f8h'/=7|]7 UZ(s'V+d=9+P-[3hT|+2@ư+UN4s#&T?T p[fDJO}4}敾*!%į( _WMk&Pጜ^$zK_{>nM̲Jb:m $dk<=t5kTQ|gXa޻e!ϼYWHbBct1D;X{Jz]6`VfVw#CWRx.%7`cmǎ.tIU?5^N;y_N|Ҿu߬i=>g7~d젡8Ɋ͏Pd PnxWʕҘ?*jL8U(f­{v&H'/ɸaOaT-_ ac3I|lQo3(C=fC*R#K9jNR]hUU{ʯozzd%/穵kG?FDwJ\1:[JSiֵ_Lƪ^_LJ֔p#16P7W$FgReq]V.h yF&@l\Tr-gѽ qWNYe^ ^$HZL UB,-2֪Q3a7&\]r\kiF[ /WQa%Yq']CvHk('  db:e'& T=߇tMɗJRR-;+KǿffKErm[Tljǖ 9S[v ;9 8M7]~z2va5q {mC5WyTkvZh]coWLRufaDkY3vy_AFUTqlM1ݴph~ʝF39ka#@g˭YvM@17̗zRS՘NzHzQ3e,^3H2=FF>;vkbU`vkT&,ɇzO-:raD:+i=/0L"&YvA rbX xjzTW(xRK<"CF4qQߑ끐|!F"R1%:jj~zr}r;蟳dcumtt,DAXŵIty?{}D#9^Yqot;o] gq&@m;y8+>C?\U9[@8ʮ慝gꅃu﷡>T{|2eȨhD2߁9vto~ (" {τ9$ªY,+g!Gm 6*Y߆}pB(Xf=-࿄8D_"%2^#.pj9h +ФqRzLv6\S+J8ȲĝA/*%=O1煻`Vs4 (|8JcՎmEB{hRLRЉjE[-`.HN#Dfe^dH8%4lﺿgG׬JKu ߏ#p M52CC 8I o-Xjr&N Hϭ{hf4+.IvX` %G_0EGG B|ܡ@KYQWQЊRWяB1H KXX>ܚAn]>e}2K\v_ue m#eALn@1N^!k Rw2cnL,kb Dh^>8f ]6ߕ0ΊHL .C+ z*0bIB#;|Qž2<Ƨ ((dDi4VXDWutVnϬ&y Ual5s=yPbW R+&ѓ*|<SN{sˈSi!%ZmADL-}1HSeeqC(S]$q1/؇YtadL(ܴ.1d.{dL(]! l$駛6R"X-?  _uጺ6bk}~؇ 7}Cz}ʶZBUgp:\UqWQ'E[N狎"!>}t$5c9g=6OurȨm8jN~Uy3vC=Ρ\Hw7 4HŮLmŗ8kXb ԃA&!u/T5Q 3ELMej# d)E`-o`|2hi)SJUeD.` h Tcъ[ZiTsVT3.$%| GdE5VA.-L% }0>XGK~ Eo퇏/ Gc4ڔhI++JKҵqp:66QtMd~OixQBhIttuC";׭p_ǡ2i9HDۅ*؇-l*/D2Y}3:Ǡ'N#Tn-Mc9 jaX]M<|&-V.]"xJ)OW lIKDsga_gF\N[:c=R8 @UaL(9]&17m'> ר|xʃB|*.%]|,pB1N{#1)Ce74Z5=k0A2_ɓY2|KʴqrtqiR@gCdp-ڦ4ת#mw T s<.Йj3LρvFl(XQA$-Ob#TD%K"k^D~)t<˴΋p3&tu"Wn` /#V z5@ ݴ@Τ0,Klv901FJCU:װPS_.'Sd75|F4%y?\q)>2!cOW,%#H0p>> FyYې)vѬFhpBr;R{9v$A-4vn1o:\Њ @}l'AԞ2G{'7RdXJ撈ݨռ#c8^mfw\i'!*FNK'9_Hy4_wC|'?#ArolEq݁Ƿ'޳=1Ԯ5ws C*-W UҧFw]}!YRS|96O=R&0[0@ ch>~qjN{Ό1znޅ[:‰"ULb=M:yg4{0ڧ Š ڵ8K Ybx#l_wh*<lSѤ FFO?XJb,c*!RUɚaw 9EFd${e ; HP1b^.so浴=NcPd³ yR,`!, #ǡ} JkSހz^Jok+P|;O(oqg]CX8\kbA" f_\o bp{ŰaCkJqC+v@Uw3 lHC%Zh[ZwT$f 39]\Hք'nQ҃] -&V;D`B(jk-M~'oe #x:aZO<&bɧȂM{k2ySyNfYmUja3"9VZ{MϻeI.Ѽޓ|ށ1{Dd*4k4~\WR۪C#j=FHKu9ZF{2v 5%>6RXpn>J]J1#t: R,`we}s[NTWmD$F%͕B!l ?ޗtg36c!Ư qTGHJ @^nC.s鮷&b44y=ʘ-KJo+!4[`Iy013+U!&Y$ *0)K5qqw0Y*:h= xa(=ܵU_j87U;%0 ˰&#)RG`"KT{͂ JsTx2W8DS1^洉Eީx|N-J(C_`sU: ᗣEw$ 9 EeNUb 7=pM-Hǹd=/iws/nevhSeFO@M _eRd6u4p1a 18(Ѕ0EyzJD"<ݼ>'tl,ɹLUyLH!(|H5?{@SSE ˛9=^0pPВמz˞?/A0irƗJiCk0yuPZ Q9u(kC9R2_NG5៱e]= #'xΧl04w^Q<ŲGoo&stvP;ě'"m󮛅j沼PLFu/; izW]T:!犿APՔj չ#u"`<򛾹Ek?-~p;#" figzpÂaԞ8HhB@ih ҝ[T_]U#1.m*ê պ 0JiEw,Ji)~Sv~┈m@Ts38]sSXx<9lܩTLKtd -^hN%.shD43I d,_&h!okzh FG2ju`iBi:r=w.Uxx=mޣaC/@꧄0ⲑ~P1Je=ԿuweG1z4SbIڡV8ϳUN8v>o4rwoz>3jrww~bWք>(Í%N- J؜BS {6-O. ´{ңnkQ:Ϲ}Np[#LKiD9d6(XP,K¡/- 6$LN\d{ rv>ӂtr # 1VPY+FޓtA(]&@`P]FT}=]6&14bhZxBtYo3 &`x~:Eu[qO^W S{/Wqފ-SdK NO0-A5i2Sr .U~׈'%2A"W(uClbd;kC1!s]T p_j2aU9A&8H(7]aE6.%LN0G?]ymlր;m ^Q~%%`PU9~'8,و!}M{L oVGbZAwEcY"qo!ih0oE&q>a/4Uaxm[h|5 Ѻ6mw=,߶UZ/KI36q hŗOquEtos3|f ޘ؃O#̹Y(NzW31rِ!a>o>yNYͱtlMq( 6|}U<''6JNɭ塽W&sWN)_.&DĿ 1ͱ(ޑhRj26؆bCfmr2# z*@6:9J hf+uz(NU 2.XD;R wvFsYfM~=MJ.{(iUm˒ WUW%nc?U5C.|klXۦMMߤ^#R $U!^R2bDCqbV>臬? ZT>ܡj(if&ũ)Nj̫7o.HO~F9Rkh !k [<];iPz[EPZp\6, $7wC_ZO0\(Q b6}<( mmO W{K9Ue`{Z֛Y|(uoZ/$oQF> WL||9U\䋌>7Zo~tq|GUS,bT{p+/0pD28PU86ǫz>tT$ȏ.&/&jhLؤ.F>M严~g>j@*iCbb3. \~ҥ|;)-8H?q@_{e&nUI*<9m*)槁u.{ܬ^NcA<A*MRe2} 5J.6^؟0c*.ĚوzZ!|i5bWL/jo@ :Ak"aXKh.)}DZ_;^IhH7GՀ]&e"# ]lAc[^9MԨw SφJ;6-KH+md8WzH~K.M]Ydk:Hg( HaH&JuRI+>[_yWN֢9ȕR[pw\@ %U56 Ȫ 0|`~IXҖl΅vXMih fk^os@IL|O źl)TX)B.6fU'iVA>Xm UxKnQm:4Y }M^иěu2w#^A^hl]7k=n'ꖍYEl$ Sc+6gdg؜~)ؙ;Od+Z 5 +9]is;c:@SPYY([ڏ}LϮ!8H|=a!prޖ| ",xE $'t$XeJ hyѻ[34'zDO;4l5w|^Lo%8iO`)Y7PHrAnmui Ue2[ͭV\=~\mg}hv8 KG3xo`& vHL>~B2$^B~o}0Nv<͐mXD/ "B\[!3zlWUdԛT2{R)8ZG J9h.PLRf" ő[HO#{#0/~04L#3{/yc,ӝ #Hyh2'[KDYjGkNσHiYb|M:V%P~RBӎ1ݬX-蠛Ɠgt}v#Fnq[>kw(Jxξ`>nsI֌[7em"ü,JN(wۑ'$`q|bXV40+V,rAGsv( -_Y8$!8$ci10??ɼ-&v{B]Yy2*ӉQ߫EnBkM0c(^KT-"R~QK:BH)$Lm=Wf<\Z6# sx^Wv7U[|lI0TG ]cEtRm1Uì#LYJ%aM}S9_皹hq+] j%ZUjìk& WɩKsB FV+*K%Mjl;NO1kaҏW6f4%0~u7R*KDFO*`@](l ]7sZGBY5b3w@XNe&8F+noC y|g`UHrFHX CX_~4>Uod&z *'"NCÿKi-5K_e$/8xq6MWgq Hfn@L.rL[kuW1d1e?S>|⾀Sn>!Kwy㛕Bu:OZAW#)f}|:d退ԶE/1N Eo$,9El%e(c:W\JD_ 3cά-}/;>TTof"DM"xdVl'vZی BRJh,6Tܯʫ+mʻ_*Q [Sn9#5p"\>&/,؉Bd=s$΄xEK&p^/AwY#a<_<^#D^Nmoo{g7\^*?ٲbPs3 ˫P^ 6:°,ǚ{Sk#3qjsߧr ү+HyO[,P/u@3M`7 R1F4tw[SJi gPU)jtrFKjQ5P)Vs Ahp{ od W(O0gEѹR^T5 /#x*!J}؆i؅;E6IFa] 7s6bcjS?uV3=ih^'WMX*BP3 z wÈG_hw1"ԣZK҉, S]ZU 9xwST'%xR>mima\e&/V3B̀aC5Xi=Q_c)LU.X|B&9n!QwOuԕΕiiѻ#O 7_桌:Vܘfw >6:Eo,uۓ!$a [)ر B~a"tx c0y_Z@4Db"9F{{hq(C{}xݬJWgx u` ~Ii}hnnh8X8Wo'C 0Y;h E"g%2 Tz7k%\ӵM[ϪIy9Xj7֮/+s>tb[7+A?74,<1g "dba lff6C\]7cv~2h2il(E|H!1E{xВ\f}}xJLU&Dr R(qͮO#nOqƊ-KG6fh6"m9K<ѐ!#ั^/k486&XvL( jw &]_`Q(T!QJW)9l @ԄӧxA94Zd:NiPGV}/Ӊ9>oXO DoB)<Lrp9M˸;<;Knv.D.p~8+?jJciQ!.MfӴAa܊Ejr}6cw\7ȯ[%) `~\&Cd~>g*`).}{WNAK1zB P+~Vb{zRSw|be:`:x8(HҬdڶܻsU˟!d g NP9emb$FETVƏ7E'zBLBupKinMVKI֍Su845p@AԩSK3H/SawׅhZÉՐ! ^$ 8$xXS=/VKG PZnݢ/(G6`_!%3U@K^qI6`:޽Ak8D 8YFddžhdvY>UaK} RbSغ6E!yN^ c+ȧ3\Ob&Z  x[ʶ{<[GA1f?fLm16\tQ_SHo*n:GB^}M`IFmYB4S`2sɍAg O3IKXkIhhk6oK®5eњ)(;3-nZ@}Vi`!e{9aIy``e^6lG4zZ)!}`5:, }h7 ʮ +ϴKYҤ?pyŵa{X#Jp+]$Ap,!:UXq1CL^'qDyL}>߾V|Noum{M28Q}1dIi9M:5iGe eߢ>nLy "8 Υ^{e {%Ҟ4Ab=9f\G}5ciK;!O8ײ1ˆO-EWΏX-?2@RޑWm{^z-&n5wW6L&i%m調]5^{;U{{Wu]w^] u|U |P>ٴࠓ_3NS↘TF?.zi0Z+/X\DvP{‚W7}LpfŷtZg".c ^EE}p6ї. h7Zc;[g1p[EhszosaMXao΁ohE38M aJ=pZͧy ޷5= )nZ+{3`8g\2#fJ)p/I6ڽbmM`)([(N`+^]z̛4IiСM ]~&5k( Ejȷ'!Ѕ/%0f ! |;7IIwP&ަ@_d󭬂WwXW_,Svh<4ބ; Vb}5_GH+O>RFĸm.pd r,"tU@j#CvJx;5z(PV=*:dH(jgМm>WDV9кOTڄЅU4T&d|&ܫed.*a+h*mN"Ф"4# ؎ud/3Fœ8@+Ib]eKǥhπL7B>Af3=*I@끒㨪m&2ͦ p*.~Ef8># O3Pt|8"9jVn1f1 2#گ|EtC{`O>핺uj,6 _9v iΘ}ж}KFx9Roa==$ƸNB:(Ohђs̬Lst5`x.Iح$ MŔ?`&]kK].Ӱ%?csi{<H/H2dsHFŚ3q?A4'aCNx"lnw[(''rl"eo ~ xYW?sJٻís;.xgQ8_d Yۺ0iU @DeKیRxUl I>_E!0ZT;Z.hcQYu7\<[-]d+k.O 0<~]&šayAQ}lᵧ={LRg gȧI/`3 7gZѰ)dblf-#D ,<&R 㩻wռ0jFO.- U7&iCΎe.A} Aba;2P)*z WEb+Sڛ`l([7F9.S7:̌8JPXH U 삔4}Sڗ(F]~yW4:O8!MHX8_nuO v3^a}2YO Wq-PE/A]ᒂ#c)ןb;bxɹv|s4$!Ty gg5,rQ(E`kO^4FleMEpF^?]B4}qD)KlP6k6\\l-͆Ui2J/O椷cLafwG ;F7}NU {Hl@ ljIU[{wC v$Uc/}zy da3G=O!OM!MN M'fC}' 52PYqp%|S'|y}#{L_uG Y"UU))*T'XsxOgg Ȭ>tZw za~8y|A:f pM.WoOwQ~N>n%mnI"̸Ԙk\[*IDj:~,H0-ejKXڶ …U(~|H" r][#蓞-nȚc*%y)j-E릭LR61/c i/Wgpui5!HRwABIwMwtnf{˦j\Q^OVž(DYC6]S0랄kb\~֜|TAV#KIv#Q!hطIZkxo[q)n];s5gjOػORxmo-dІiTfm,҇gnhBZ]<<,v]ΗpAw鬭QEd}5O)*J0t@ߛTM4yx@L޴Nq2 =H W+3AW>âw況ԇibpV1:>)%+X ]ts WimY,†Y4 +[C6̀kt_m.4ZҎB5)E(Yv IU_Nςjw$-Kt]`lD</~,/ <8h?ۧ}gS M4bVX Ĕ}Rn ǚNQ~ǙWRJښV9S8˔IX)i+@*яǀ3;( L1:3rԘ]1?ى:6}5% 6q+5q][H[ a< ~+;(4NsGhj$ _KAij{:4vF]nJoY 'PW jWNS|MܝR2Ϭ̔dI;{8o얼Fъu.c'm죗KA)>Y4 n.W TNJxׄ!>vRm=T!W"ر\q4JNـ"`5 DN\q(uXlcXX)`[<C^z\PlD犿㴭| 0MaKz ; :GU78D gKEӪ9Y֦yh9Ek*' a(uo:+2nInQE*]w*"zeZLt$9*7yk/7Xę)_,TÊ:&G3o(` i_g pzf@RZח麏kd|#rUcfrrrϮPwvo{{8~;<8sz0NZrWyvϚkO_K 1 &3_X/;ʽԎ6S5W8k؏u5_=T(i`P'v-$OC"Ӆp{Ͽ6zPdt9AИ@K|HeTk3&h ~h!5`NA)P#|9 ]|- Gg|U͂9ESxn& bXo5TAldeb[$?JU;p0\)2C rW%&1Ia;䅣qg2$KlF\ ?ٞwL/3r*H}~5ڸ֊lxZ*z=n nI SΧDփgcy2=\0'QGaS d'Ck>j!Gl? i{m+hrAsj j琔ѱE2ϰ&iroKL!s\sF3yJUYS=-NePc `߽̓|%FpS$0.6xOŲÀkne!x8K 'Wϡ;E-Yq t"iok qIy2&|5eLg`*_U5Ehjpd,~l_]NkO+z?W8+1/K+^C 5?>j},@DL-R*U=_HGdboʓnJy3 XS TE7){F([a4$=,;M*B$+cO:.? iu ;DM&p <*q0@h DAߟE%vPGGKPC\pmbggaId@[a3b஌Tއ6S+ۖp _<|=wI5W 2^Lw^ >CWD:6m#i2ٸ_PKΕLJ .3Vۏ܄OEl/DMPU{iYliC/ՙyd0ݬоo>}, 0~rVz9kϾw[gгآ7$Ҷiq^p#'!.x6eՃ, bDZO"؋:JFD?( phpDP%<ޘÏޠt6ej?6KLnOzN{XY- iO!rK4FTO³M?,t^ǾGb&SƉ?4oJ& kXqxa 8&[hZ͒O!8 p{>`f!&Q9"VB5eʧG!?W+¼#4V5q׸{p#MOSBt/F&>Мrw|hUw̧c4)O^'=30Up zD ,&EJxߵQ3L,`5sِ. iOy'qECס_CTł"ybXKcl0+[툀""ol,@\7Jԣ1Bmp9*deA ƺ6Z3^tߨ-lg*rD`D| #7ΐ%Q&>6B%/Rܒ*DC5uAШI&Jua,AlJ ",f}E> 6L@F]`\ O{Uj Hs..+l/Y 40FH>dZrpYla+rF}%Ⱦ—`5ZIjuZuYY|4榽PP(ڥDKCY879Uy?OeP0iPcȷֈsϑ;/v>54eUy6bIeTWfjfxg.\P<9^Lg|Wvk\~ϐS8~o_7tnB];}:<9 w/d퐘,us$Bj:G?>̌0zU,Ңv}`M\5uG< s-KIoBAFx:?Pᄏ=ũRC;jGHs%sB=h#FG1 h,0.3"9RSU&.nz?uh[pn~/8=_(b8m1HϏ?үoVY#RgI{R/Z@%9n-R+O5 z(NQ@/DDtzfi`!e8KpZhFg\r :m@ .wlOS1A t}d*D8 ѐ94hM  3Pʬ Xr;,59֡:.g,iQo l?ߎ. A\0,d@GAMX\V!j`0C-x4.Xv$ՉTXeM| t-8~wtȹMvw9KVO#PtuHcL"v{ `]FT9UxV.9IW\/1RkZ|E$x3}`#jSj7@wֻLvI4T7wU0¨C!EY]]ϒ=NS"YvA! 9Çsj]wW)Roovw}44;b aBVtfB׏Pq2!`^EE.AfP= -_/KUyzV]{IQD=;)EU h/QM*ina萋H4gVܽKJc.Қ޼)\^g\1w_4{)mRTA*P~巺*;wU۰Vz֩+0K Thu΀|&%B4L l$>4]H fپ`.wF"YY[$ժ;b:sE.[̕AMLzh6쩴WX-d/H*RtaEYM[3@KSJ%^.SYQb CڨIQşPe^Cݦܜ~614pӢxno I=pu3i&Q{Ԃ"rTߕ?S4A͓  405tNŒIk anb(Bټ?Ob*l?IKc6ܣS0MaHe9+G+Nԅ৬F)s^shmM5s_!I2D-*rnH,~ `E7 .#{&fNoҜgp*uicK]DS(O~a՛'8 `C\7vRAIg]֥G)"w 'nIG_.l%Yf֝$YEE6#J}~UFg6dfQG/nqIbw%k9(ۼt_A$l/e.tbTVf<r*󛮲EGU;79hCnE͟Xi38wxiMo͆,Ү.׵ r4["h]pzllW|XX21QB945vJqcnSgS߮ͅ<ɭӊڎŁkF8Dsv7KPyd`P%ވeU1IFbTp4kePo0G`d V1c$ x!fF0ۆ/"f/j|mP1BrZTRM-AL@ 7i q,'qz`N)9:]Dw3 l> glێnOL˭AA]v~yu!Pr x-1$@Y棜9;o b]Gx^# [}.)ub kDp!IʧSP4myPMaeҕ"ȿ|\;eZ e7,5enXAR=Apm Xل'}x,76dkQpwl;ZȲNt,<2StfA:yqQ:4u򟞝(;1*<wJ+= TŤa9]Q/Z4~=?xӒ/X%AobE@9.$+b)D}R6ש'iIZ|- )fR/X2Ubc1sw#`v]:OΠ)'R Y;2j'd)r*`a{Po5nY௙=*c֪ ɡS64k7o\W3@H~]Ca*.EBRP'dVksK$ZpcZ~8!I %Var Pi>28%BDe K!w>pm=B/<'[ؘ}MF5pGhUq4j\esߩE]fN..fS]VCç 镪_ 8`tao%~ӂik' 3q:&V0h3iJCI Y\1ݲ<&l/ÿO V?XuwebvMuM zDTLniSK]ZxgsXt=eZn*7p^iv}t<."}!_^UAssLqp-aj>"ètlZy/0ӹgpIN,<_EV`rY]5yMWVfҹ|NX(kΎbt{I2cN_V!PMBlyI#˺ @]ܰ 0UI q̮fmWG q7JBG?@"!Xd6`ƛ@`\$EMzHc֊WJ yJ;IB*rd\2ڥYpēP LW,3BdnQx+'3E `wŅS?Z|=T0a036y:B'W(> %p;CkC ܂]z;lE2k^u*>Ľ!!M ' }"`W)ƻ@k$* Zaq%W/O~oFD"3-6Zkx~'m+|YGXy%K%nx!rUO_uȯCT=-Q積$[S:Y{Ԋ(dw[@nVW~*D* kx̄# l:dhxK,cr7y(b85 4&}R htNĥ .q/{q!ly%MTP*wXeHI69ʼ-ہw/w%__0 :rg:WtX:34D-N^MtE?JcQz r)niU(YVqyFdBAu񧯫{Rl`f[=@ ˩>0߁(%?^QսT[@j8x^@ۆ/p:UQ^NuN_w4olfAB Ϫ9 |v\Ӊd ^XCۥ/o{Љ%% $=lYU20S5u#Cc {@)E1O a(tM&-cѧzRNC, Ĥ.9b'*AړZj¾l!I+1lr08_-ZakEBUD q6@us"w,ןOU)ȍrPP?({/~-]6} K-SS'a&٦@ jKý0Q)9缋|p6].`դ641PPr} & R!$֝$z_Ts9%`'A ΪVX{BB(◨rP_r `Ouf!A`c4;*G!iFrSVެ߸,aKžm`nH49B"p/J,VUDRUKWRY-yR*, n"#'<@;qB9(Z8ߨkB("=@NNsuU4Nzw$c,Gǵ])EC^!C7 u;0 q]I/J`(HpojPz +BC!|72~V]N22e ؽ$mLoITT%Lm{ +$3FU]⇐Nɜsr>RծmgkŲ]uà7Nm_|,G3;'20UV9RVk#69( UuԤg< &/KФ x4k=od [[>)U hnǷQ3\uq&ܵX X5m5!Ojh <>îK@I b p[aWN /.2f-WJ?+dJK"|FjOvI _aB%:Gwe_S8j쵤Qc6WOF%+Xk0?1<;ֳe'WcBk tr1a'b+Pg(H&ݚk/SHytw ~oJSg8.+d.BSe7=#ܴ-3E`vm c[{fIuUE2‘ҡO~d3ko♇+f-Jńq>윉Ih!f}jWء*pZ(Q-_v"( r[)}]$u-?5l nf6u=))f !`럿0 cNk*jB 38`}I/[?r%{ڎ`yNx^řT Ę*jnI'-ѥS Y&)Pn;5fB>Qs""w!o2M gH^y_1;4+<$Ǽo-8c vQ=ķL%!YTxвѺ9[Km8R!tJ4VIoۭ2pa:ŁN6y,dfz5"EĬ ʢ7?uUD4/3o= ȱҡ68 &Sݧim}zԥAIǑZx=Md/fɺdb´Lm SwM4:[O]PH{\W 7b$HK#>qu ruXS'P`r+.;*/ϓh#=^Y8@yƲ;x5 J"7Ghr?]U޲{u? ޠz@_hu<ƨ SjZj6ai_FprhNw"6$ߡݭou?ݰ)Ik E,҃2IԹl_ 7흰6r?٠x/q }[LPrL-1zX ZIMr'W7%LY!$lb/Mh`^) HօC RE.E+ǝVQkVF52 -*a5G8Q[Oע}ɴ/4$sa?96XYU_azb)W#_pFq)0~hFyʨwloמ? O[?Za2PS8l܈.߷B!r<._.~MH m'e9 fxd)ˇ PB֡W"IAh*DJ{] {NOl~dFNvrz|ЭgOqUݮ-TA߉f=sgu|NVme/Ο)x Cu_m/Xۦ3['= ^Qz:xWL3iZDz3*A$7<ފ˪!?i2 .uUvWp1}΋%3l4cxw-k ɹ5~ 6pݷnokiM.&h 0[eT|uؿiF~٢7Z|ʫT$4_4u-ŭ(*}9%*FU_ZEiIӴWUt0<]F|{qfaD>7NKBBߪ`4u>C;-LfN6'ūI1~,:TGwrg_26F;AEK.r<+ VJn~m% `v<3q$HњQAQm1Py~5ԓ=VvJˀ\БUhaͬJr!wFnWOU88,X9eI~5k[~=N57 @+JMD;Z+D{ @!l5Za[vZFm n^~: jD mC=ia&O'Kb@0fut2U$}tsKUlbc?hpٹj|ξVzu}V v4/ UF8\|dz5j&mN1`UhU8e6"'t0lzw ,&{:6 ei):TנZb` oR` c^ż_#LG^"D,ZB-#PXe7_5BS9짿lU\.;ַ1{=z`+ŚOm.pN'glc'-ZI<~c4-MEϭt͟s H4)fO" A`'%rכLnZOٶvYJE>0F&@~0T&Y}2/vP诀zɳ{_+!JLA.1g^B ȟcb:P ,"٣{oshC6_fg"N Io8YNb5 sL;Z18 ([ 2v :3 ܕ8WޯqN|rk6d) /ə!wo}$CWa%i=.}P6tr`ݥS_FDOz+`Ph0K^T5 &NA ; L(o>qb?Qbk+@T&v.O>R] 8{V͈AJ/WMO@ .d<8w/N;~1;-)ڀk٧[gXH%uI$l&}VOOtIOpPAqx&/(ti>~\=| M2q6Lç0o=qvA/ .n%KK?K *ߥh}:fYQᾟMMN V> (' d "*3!H.2%HBVvyRUN!wgr*~ 'MzѢԟ̧ud ohIp:+}#>EُzI¹%gbe{[o qq`ռـˎ1Kw[qx44#gfvA@ DK7>LՎc"0LqjZo9bq.: ։}PW4*^SWfk&/L7c'dY>(|6x)֏ BҵSjQh[5[m{ Pw1'f!tA%b>ac{ޢ~MFCNmh:U2! y&P9nMoO$'2OlfU!23\Ķ$ltXtO_ L\|tESD,(B6Ix^/dj+U\NՅPNci2p,RwB_à_^%=xYv}F̫,v-@t6I/-eՋVԠKGPD_۬ɼiwff~ )Z٤Z4O#p\AK_KR1@\6;΁Z%eM&JfqCNEe yx*[}M79>f3k);4Ou靳":*28xk.rVM0":rR+ <@(yq#",o~@"$Y9gm3=f[۾ \S8뼕y+ #_ݏf(Z.N>|)*L#$#% heQECg &IR8`1YOjr&]׌ HbT:$EsJJ8O:ZR'`cWRrZeBGtit-OaqOTjv_?RS7|#tJ'>kTgɭ*vPRdq8B-]ڣ<:m_Nq~K]PLV:fve1v] y"e*ҍk-Ta# :ܶM`.(xDé >[ci38à8x?#~SW;fn]hqjSo X4@X5m.S#5=D! )%jIh5 K 塁ڬ , ^wbU(u[;ye"[w،xMs~T%PJ”DAvT`y,zyK;4XkMu>LeRe~x==,Sty11 T zt&՛;q2jfF s4J3>n| 쯓\BmJ}<$u;ȳ@j2Ro5HY{/ep/?Rtca-0G{aV8ZZP:-uhXO(2,5u{Uc|qXL/ln6Ƴ5`)AG1Qg3 z v I>TUy O'bڤ;^%YϾlq]|H.'7.Lv>#*lnxARVlć„=v!/ [8saB ii x{gsBbX7mA>H$%Xי] f]59myr5^$}p|; \>O(a(~$sPoܮt.̦#J8`t<'SJ~jza'4m"BK 0&n羜rt~{]M`ރZ]xoo_ he#2L # ފ$9t~@tpp٤:ۆo+bзǑ1W?MVR>edU Td.Kوp9/k)sY#N^wXEEf!%dgdp P]hiϺ|[9TKy_HcfD|TB|Բt幜+S DP  Œԗ0¹l\u[U!6$,|Bgx19İ?u#`?t/b*_ib_͆f[zCqf e= .4] FrJz5YZr`/e{j$(v]ƾ $J |$ IlmGB/;w.Z!`!j/Еks*a*jl}7XvHv!W*LO^S]Y l3X.RawNiZޒ˂MPVXM&z)6R}ZH2 D8oȿ C1OR [ uq OQYaFʈZF)oCשNBE6HF7eұ˳Ƹ@g _=T:IBq_9 239[r3wܙ3C/f #kv:6lUIYcWxQ<[w0[&/ NCPV!?n6j%=%ߢ.j)(&/TE B12kgť,c]_гV-"޲<;S'02OhajZ,Q*Aˏٕvo揗QJK(q[:^#і%wp@@*a\*v/s\mŃ It]^{*X U4њ2S{Pةdr|,L5m`-I2aKV^̎$/{ncnmS/ nQ6`ΉhM R@x[*g+J\dxEH[2;|B1G~hgZw/+u4-<)qQn ԇz@r,z/:ج_~;y`cSɓ&{9ol $Vy] F2@7 %2/Td21l$SL\8Tp{̵+S.kR^WQᏒ+jzbqHc6]8pJ|#uj 9>ѭ aUj Q- 87/,;"&\Ckѱ(7-B8b_syƃ$XrNةLrk*vZ9!Jgf^L\9Ru.[IrOszZNиr3Z3qO-h?m|>þ'mt-FaD`yqJ]4oR2Ơ*Mj!59Z*}^AP8Fns2 6\%",i ĵ9 OCʅEREmis֦0d .?9(JFƣd#&/JE|7HQMq ^tr砍cב'7c 譢9Ղ`eƂtc~->N$|aUq|͂vt! DqqT+OwQ]\qЛMYaCLdREjO+hQ9j"Ii/yȵ!T׵X4: ҚoxL[Aq:AydK@0,s!//{GW.:޵A(߰d<3ty@v">YHy?us`JJw^~_d~UVƉȅ0|s3g )ő]Mj:^׭drRps L2RF%m\*IA ,@?w=ј YpN;MKuJ}Ϋz; >iϜsyC K;ɴb<7Po$¿\LnAL1&6^hiP^?tQŵynBU,,coq1)lN iMҤI!ܻ6[޵T8J2}}~B2o[ .a{:C1 E _Id5! 6Agdalautotest-3.0.4/gdrivers/data/i8u_c_i.img0000644003401500001440000016632013614004466020417 0ustar rouaultusersEHFA_HEADER_TAG@Rrootroot@mTARXRRDNamesListbleersEimg_RRDNamesListameters840tTA$ZIMAGINE Nearest Neighbor Resamplingi8u_c_i.rrd(:Band_1:_ss_4_)R_4_)Et,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,.R|IMGFormatInfoImgFormatInfo831bTARBand_1atInfoEimg_Layerfo831A@@/ HistogramParametersEimg_StatisticsParameters840@bTAEdsc_BinFunction840.{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.KK BFUniquek%{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.pK1 K ?@@$@&@,@.@2@@@@@B@B@D@D@G@G@H@I@I@Q@@Q@R@@R@R@@S@S@S@T@@T@T@T@U@@U@U@@Z@Z@@[@[@[@\@@\@\@\@]@@]@]@]@a@a@ b@@b@`b@b@b@b@@c@`c@ f@@f@f@f@f@@g@`g@j@j@@k@`k@k@k@@o@`o@o@o@ Unique ValueF StatisticsParametersEimg_StatisticsParameters840@bTA  Edsc_BinFunction840. {0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,.) KK BFUniquek%{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.pK,i K ?@@$@&@,@.@2@@@@@B@B@D@D@G@G@H@I@I@Q@@Q@R@@R@R@@S@S@S@T@@T@T@T@U@@U@U@@Z@Z@@[@[@[@\@@\@\@\@]@@]@]@]@a@a@ b@@b@`b@b@b@b@@c@`c@ f@@f@f@f@f@@g@`g@j@j@@k@`k@k@k@@o@`o@o@o@ Unique Value/ 0StatisticsarametersEsta_Statisticsarameters840@bTAo@X{c]@@U@o@N̴8Y@#F~vDescriptor_TableersEdsc_Tableticsarameters840@bTAK#Bin_Function840#rsEdsc_BinFunction840eters840@bTAKK BFUniquek#{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:LnumBins,1:*bbinLimits,}BFUnique,.pK' K ?@@$@&@,@.@2@@@@@B@B@D@D@G@G@H@I@I@Q@@Q@R@@R@R@@S@S@S@T@@T@T@T@U@@U@U@@Z@Z@@[@[@[@\@@\@\@\@]@@]@]@]@a@a@ b@@b@`b@b@b@b@@c@`c@ f@@f@f@f@f@@g@`g@j@j@@k@`k@k@k@@o@`o@o@o@ Unique Value~Red_Function840#rsEdsc_Columntion840eters840@bTA???????????RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?[[[[[[?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR?RRRRRR????????{{{{{{?{{{{{{?{{{{{{?{{{{{{?{{{{{{?{{{{{{?????KGreenunction840#rsEdsc_Columntion840eters840@bTA??RRRRRR?RRRRRR?[[[[[[?[[[[[[?RRRRRR???RRRRRR?RRRRRR?[[[[[[?[[[[[[?RRRRRR?RRRRRR?RRRRRR???RRRRRR?RRRRRR?RRRRRR?[[[[[[?[[[[[[?[[[[[[?RRRRRR?RRRRRR?RRRRRR?RRRRRR????RRRRRR?RRRRRR?[[[[[[?[[[[[[?[[[[[[?RRRRRR?RRRRRR?RRRRRR?RRRRRR?????[[[[[[?[[[[[[?RRRRRR?RRRRRR?RRRRRR????{{{{{{?{{{{{{?RRRRRR?RRRRRR????{{{{{{?{{{{{{???{{{{{{?{{{{{{???{{{{{{?{{{{{{???KBlueunction840#rsEdsc_Columntion840eters840@bTAUUUUUU?UUUUUU?UUUUUU??UUUUUU??UUUUUU?UUUUUU?UUUUUU?UUUUUU?UUUUUU??UUUUUU?UUUUUU??UUUUUU?UUUUUU?UUUUUU?UUUUUU?UUUUUU??UUUUUU?UUUUUU??UUUUUU?UUUUUU?UUUUUU?UUUUUU?UUUUUU?UUUUUU??UUUUUU?UUUUUU??UUUUUU?UUUUUU??UUUUUU?UUUUUU?UUUUUU?UUUUUU??UUUUUU?UUUUUU??UUUUUU??UUUUUU?UUUUUU?UUUUUU?UUUUUU??UUUUUU??UUUUUU??UUUUUU??UUUUUU??UUUUUU??UUUUUU??Kg  Opacityction840#rsEdsc_Columntion840eters840@bTA???????????????????????????????????????????????????????????????????????????KM#Histogramion840#rsEdsc_Columntion840eters840@bTA@?F@?@ f@@@@R@?i@c@ @A@Ѐ@L@$@j@4@??@"@@P@]@@@]@x@l@~@`g@@@?0@@q@^@@,@@Pv@t@@0|@T@D@(@@@@]@@@n@`u@$@ @ e@p{@@@t@^@pr@d@E@Ё@0@2@c@F@Z@0@@!@K3!RasterDMS_TableersEdms_Stateticsarameters840bTAC=<:8754445/-, +*('&%$#"!            IM I$$mm$%)m$Imm$mIPQNImTtpq.NIqpPTR N$TPuQqN qPpTPIHQTqTpNIpTpQP N)SQPQtpND.ptpTQ$I QPQPQ $HsQTqtqt2J$Is .pPTPQNIs 2PqtQpRI r.UtTPTtP2Is  .PpQpUpQPQms  .pUPpPpPtp2nr2PpTuTUqTQ1m   QUpPQpPpQEpPTqPtPuPuQ$$  2pQtPuPpP.m.  QtPpUpPQ.s  .pPQ.I  2  %I     mI.      .N%    NIm.    NI  N)$  .N r   .N   .NmR N$I  .I$1?@l'   #                     "&) ڶڷ۶I%Iڒ۲rI$ImےI$ ImI۶m$ImڒI$IےI$mm$mۑ$mڶImIm۶mII%mۍ%mIImI$%M$I$m %%$ %$I$ۻnISsSsۻ$%r۷s.mI /rs$r.RQPqMUQ2. ۷s  2QTPUPuQuPQmPQtQpUQ12 mmۗN.RQTQqpqPtPptq%qPtPTpqTpQ.R 2QTtPpTPqPtQPQt)%PqPqPUPqTtPQ2w2QR.QPqPQpTQPpPtPuPtpPqI)pTtUpTpPQPqTP%rQPqPQP.RPTpTqPuPUQUqPpPUQTqTMIQpPUQpUpTpQpmUtPuPTPuptQ .PQPtPpPpTUPptPIQpUpTpTpUpTPNpQqPpupTPTQR RPUpuPUTQPpUPQPutmmQTQPqPQPpUpNQTpTuPQpqpT .QPTpqptQPTptpPQPmqpTtPtTpQP.qPqPuTqTPTQ..QPTQPQ..2QmQPqQpQPTp$TpUpTpPpTqpPQ    ..ImTpTPuPuPI QPTpPQTqPTQ      IMPqPpPpPIRpQqTqTpTqtpt  .%qTUPUQ%PTpTpPqTQPQP     . qpqptP QPQPUPptpQ      N%PTPQNRpuptpuPUP2    IItqtPMPTQPQPpQ    .MPQ%QpUpTtQ      $N2pPpPQP.      .%I.uPUpPQ     NMI$ .PpTqTR  .NMI N QpPpP2     NM%N.2Q2.    NI.N   .NIJ  NM$. N  .NIJ .  NME%N NM%ImqRn N ..M INn2OQPtRNIMNI$In/R2./.RtQTQSM.NM ImNR./.2./NORQPpN  IIMmn././N3N2OSNSRqtpuPTRI.M%INn/./3/2N2/R.ORNRNSORPQPUPqRN.N)Mn.N.N.N2ORNSNSROSrRtPtpPtQRO$$Nn/./R/O23R3ORORORORNRNRrPpQTQTQtQRn%N/2.N/.2NROROrOsrsrQtQpPtPpPRNIn.N.O.32ROSORSRORsRSrRQtPpPtQqPuTqSONIR.323/2.RONONRNRNrnRsRsSsrsQpPUTQTPtPQpRnN.O.N.RORSRSRSROSsSRsRrsruTtQpQpUptPROM%IO2N2OSRONOroRsRrRrsrsrQpQPpTQTQTpPQPUpSRNIn.IN3NSNRNSRSrSRSrRsrsrsuQpTpQTqtpTqTtPpPRNI%N2/NnSNSnSNSnSrSrsrsrsrPTqUpTpPQPpQpQtPqROnjn.R.3.NnnRSNSrSrSrsrsrsrsrsrrvrTqPpPQpUtpUtPTQtQtR)@>A~7 0+'(***++              '67=@P         mmIm$IIm۶mII۶I$mn$mےI%ے$Im%ߒ$mImOrmm rm  Sm .m$Q.  .R$IuUQ. 2PpPpq$PpTQ2 .UpUpTUTPQmItQpUpQQpPpTQPpqtPpQIUPTPQ RQTQTqPqpUPTQtPtvIpqptQ2pPpTpTPTqtpQpUqP2riUPUPQPPtQTQpQpQpPQTPpTQs$mtPtpTpQpPQpTtPtUpUtptqTpQ.sIpQPQPR2QpUtTPQPQPQPQPQ NMmtPtP.tPtPpQpuptptqupTptR  $tQPQ.QPQPQPQPQPQP.ImmpPQ.QRQRQRQRQRQRQ2 NIqN    I $%ImInN.E$rIIMJN)nmNImIn$IJNJNIJMJI%EIJN. IN2.2.. .)I%.RQRQPpPqQtqpPtpPpPQ2.  N I.IMI .PptPuTqTpPTPTQPUtQtqPpPqR.NN.NtPUPQPTqPqtqtqPpPQTPuPTPtQ2N$ .% .QPqpuptpTqTPTPTqTpPuPqpQPQ2 In/NPtPTPUQPpTpuQtqPpUPUPpPUTqtpPQ.)...QpPqQtpPuQPUpPpuPuPpPpQTQUpQ2. I .I RTQtPUTpPtqtqpTpUPtPtQtPpPpQTRNNONpPtPupPqPUPTPUPqPtuPqQTQpQTQtPpQJ)sI RPqPUPUPtTpPqpPtPQPtPpPtTqPptPtPQIN NQtPpqPqPqTPTUPuQtpPuPuPqPpTQuPupQ. .$.QpUTPTPQtQpPpPTQTpPTPTqPptPpPQTQ2NN J PpPqpqtPpPTQUtQpPqUpqPuTQTPuTpt2J..QtPTPTPuQtpPpPTUTPpTPTPpPpqPpPQTQPII I.PQqpqPtPQPtQpqpQtPqTqTQTPuPptpTqQ.NN .TtTPUPqPtuPuPTPTPqPqPpPqpqPuPUPQPtPRN%IQpQpTpTPpPupqPtTqTPTPpPqptPpPT.II2N PpTpQpUqupUtPQPTqPqPpPqPqTuPTPUQuUpR.%.QG?>=<;9876 5 4 3 3 110/0/00001) ) (( ' & & % %ImII%  IIm$IH%I%mI$.$Osmm%.I.smPTtTQ I.  NMN2mN  .IMnN.//mINImN.//RNRII .I$IN.2RQTptTpmI  N%N.RRqPqPuPPQpI%I$n.RQtPtPtPPpuPt .I%n.2QtQPQTPUqTQTPp%IN$N.2RPqPTptpqPpPppQtNIIN.RQpPtPuPQPTPtUPTQtn$N.I n.2RpPtQUpPPupuPpQpuPp$mmI$)N..QQTQTpPpUpTPQPuTPPPUImN3RUptpqPpUpPpQptPpPpuppmN..RPpPQTPTpQTUpTPQTqUPQTPImIn.RQPtQTppqPuPpPpUppTpPtPppIN.RQtQpQtQTTPpTqUPQPQPpPUpUT%nNRTQPPtPpPqqPuPPtptttUuPpPPqn%n2QPtpuPuPuTPTPPTpPQPQPPpPuUpT$mNRPuPQPTPqPPPqptqQqTtPtpQtQpPpPnRpPpPtpqPtTqtUPUPTpPQqQTPTPTPuPI.UPUUpUPTPpQPPPpppTqTpTPpqqpqTpQm%RRpppPpQpuQtPtQtQTQPpPpTqTTPTPQpTII%$.RTQTUpTPPPpUpPpPppTqUQPpPpPupTpQmmNRpppPqTquTpQPUtUUQTpTpTqUuPQPUPTNRQPQTpPPPPqTpPpPppPqPqTPpPPtpppq$nRTtpTqTtqTpTqTqPTQTpTPpQtPqTQUTPmINNrPQPqPQPPqPPPuPtqTqtQtPTQtPpPpqII2RPtPtPptTuPuPpPQpPPPPqQpPpQtQTP$$ NOQtQtQUPQpPtPUtPTQtuPtTtQtPPPpqI%NIRRRpPPpPpPtPQpPpQtPPQPqPPQtQtuTPI NnNRPuPtUtQUpUtQtPPqtpTpTqTpPPQPqImNNOSPPUpPPpPpPPPuQtPTQPqPpPpUpTpTm$s.IRNUpQpQtQTuPuPpPpQppTuTQTpTpQpQIs%RORpTtPtPpPPpTtQtQTQPpPpUQQPTTU.NN3RQPQQPUqTuQQPPtPtpUpUPpptpqpp..nNNQpttpPpPPptTqQPQPPpTpTPPQTPvQTPtMM2SRPPQPUtQtPQPpTptpUpQqQutpTqPpPqQENRNUptpPpPPupTqTQTPTPTTPPPQPuQuTpTI.SORPQUPuUpPPQpPpQqqpqppuPtqTPPPQpQNR.RQppPpPPutTpUtPTPTPUPTPumQppupTpU$NNORRPTQtUpPPQPPPqtpQppPqqI%tpTQPPUpPmI2/RSRpPpPPUpuputQPPUTUPuI$qPQTptpQpPRNNSNRRTQuppPPPPPPtupppr$EupTppQUPTpTR%N.2ONOqpPPUTupUtqPPPQvmPqTQTPppUpQQNNORSRSRRQpppQPPPPTqvIqpPPqtqTPQPTQ.$../RNSrsRRQPtqvrrIUtUtPPPUptpqQINROROSRsrrrsrrvvrrImPpPpPuPpPQTTPNn./RRNORSssrssssrr$IuPUqPuPuTqpQpQ.).RONSSrnrsrsrrwvmIQtPTPPPPPTTpQ.IN.S2RNRSSrSrsssrMIpPqpupupqQpTQNn.N.OSSrsrssrsrsrmHuPPPPPTPtQpR).SSRRNNsRrrssrI%s.22QQQpTPQ$N..NOSSRossrM$m$R    ..IN/RSRRNrsrI%rsN$.N/.OSSMIvvPr.N.SRRM $mvqPptqS     II..n%nrsrQPpUQPPrNNI$nsrsvqtuPTptqSNEnsrsrsuPPPPpQTPr     %IrRrsrsrrPQpuQtQpQ IINSORsSrsrrtTPTPtPtTNInRNRNSnrRssRPqpqPqPQP    .I/2/SRSSssrrrTPTTPtTpU ENSNNRNRnSrsrPqpqQpQpTIm II.2OSOSrSrsRtTPTPtTQP.2//.ONSRISnSrSrSrsrssrsrsvsrsrswsqPtPUtqTpPQPPpQtPpPPqROn.ORRRSRROE SrSrsrsrsrsrrsssssrvTPUPpPPTqTptQtPpQTuQTRRN$RRRrRrRSRMrrsrsrsrsrsrssrsvssrrrsqppqPuTqPpTQPPtQTpPpPpQRSNUPPPPPPQsrnrsrsrsrsvswrvsrsrTQTTPpPqTqPqtQpPQuPuTqTqSNPpuPupuPrrIssrswsvsrssswsrqTqpqPuTPTpTPTPuTpPPPPpQPRRUPTPPPTPrr%rwrssrwsssQpPPTPpPqPqUpqPpPqTupuTPtqRQpqqtqqPvsmnrwrwrwrrsPuTqUpuPtTpPPTUPUpPPPPPqPURPTTPTPTPrrrMsrsssvPpPpPPQPqPQTqpppTpUpuqTuPpPQpQpqPqtrws$$wrvvsqUqTPuTptQTptPTUPQpUPPPPpPuPPpTPTTPPrrMruPpPuPPQTPpQPQpppTpPpupTqPTPUpUqpqpvwrrrPPuPpPuppUpTtQTQQTqTPUPUpTqPPpPTPTPrsrItqTPuPPTQPpQpPtptPpQpppPpPpTUtPqPurvvIPPPpPTqptPtQTqPQPPuTTQTPuUQTQpQtPrrsnnqtQuQpPPQQtPpTPutQpPPqtQpPppPTPPvwmTPtPtUttPpQPqpPPPtquPPPtPUTqpu$qPPqPPQPuTtTPUqvssrvpUqPpPTPPrmuPTqtPpPqrwvPPpTQtqPtqvm۶wwspUpUpPtPQtT$vwqTPPpUQpQpQqM׺׻۷wwqqpUpPtTTpTpu׻ۻۻvsuPPTqTpQpQQPQuI׷۷ۻۻ۶vqtPqPPTpTttpUqmۺۺۺۻۻۻwrvQPQtPuPqPPQPQtvۻۻۻۺ۶upPQPPtQtptPtQ׻MۻۻۻۻۻrrrvrvutQpQTQPQpTpm ۻۻֻwsrTPtPpptTpQPv۷ڻڻvvrvqPuPUQPQpTpvۻۻmۻۻ۷׶wrTPPpPtpQpQPuۺۺM%ۻۺۻrrmItqTuPQTTTtpvۻےۺۻ۶nIIPPPpPtpqpQPۻۻnmIpuqPTPumIۻnI uڷےۻmIۻۺm$׺mmmIImۻ۶m%%Mrw׻ۻ$Inۻے$mqڷۻےI$m׺׻ۻۖIIۺۻ۶mmڻֻvۻ۶r$Iۻۻۻ׷qPmۻuUpm%Imۺۺ۶upqPm$Iۻ۷ۺqQPTP$Iۻۻ۶uPtpQuI۶ۻۺTpUPTpiIۻۻۻۻ׺QPpQpPq$mۻmۻۻ׺ڻupUpTtQtMڻnڻۺۺۺۻUpTpQPPpIۻۻۻ$ۻۻۺۻۻ׻ۻۻPpQPTpuP۷mۻۻۺ۷۷۷TQtQtqPTPۻ۶Iۻ۶۷ۻڻpPpPPUpqPPqPqtQpPuuۻ$ۻۻvPUtUpPPTUTpTPTPtQpqPqPuےmۻuPuvvpPpPQtupQPpTppPtQTPTuTpppuۺPuPqPPUuuQTqTpPPPTUqQQUQpPtqPpPQUTPTpuۻIPpPTppuPuPppUpUpqTTpTppTtQPPTqTpPpqPtQUq%TtQuPUPPtqPUPPpQPPPpPQTPQpPtqPpTqTQTPuPTptq$qQpPpPppTpQvPptQtTtuUpTptqTpQTQTqPPpTpPpPpQPPtQnIPPUTPUQQpTuqPUPPQPPPqUQPPTqTppTpUtqPqUuPtQtQPQTqqtqpqtpTpQPvppppupPqpPptqPpPQPQpQPPTpPPPuPtPtpptMIPPTPPPUPTqwwQTUPTPTupTQPTPuTttPtPtqUpTuPpPQpQTQTQqPupUpqpqqsqPpquPpqPuPqPqPQPQtQPPPpQpPUtPtQppPp%mPPPpTTPTvrvswqTPPPu$QPUPUpPPPPPqPtpqPpPtPuTpTpPPpQppPpPPP.NI2NptppPtQtpuPtPUPTQUPUPPQqTQuPuTTQTPTptQ IM%.QQPUPTqTPUPqPpQpptppqpTpPpPTpPpqtqqQUP2.$I%JQPtpqPpPqpPtUtPtQPQTTPTqTUpQqPUPPPTPppQNn.RTQPTPuPTTQpPpQTPtpPqqPpPpPTTpTpUptqTTQ2InI.pppuPtPqpPtQTPpqPQTTPTuQTqpQpQpTQPPPppQ.%Sn.2TUPQPqPPTQtQpqTTTqpqpQpPtPTPtTQpPtUqUTQ NRN I.PpptPtUqtPpPTTQqpPTPTPtPQpqPqPptQpPpPppRIQRnNPUPUQpPPPQtQqPpTPQtqqPuPtPUTpTPTQtQtPUPT.. uRN$IQPppTpTupTpPtPpUptPPTPpQQtpPqUqpPtQPPupqQ ipTRnqQTPQqPQPQtQTQTPPQTqtQtTpPPUpPPTQpPtqPPTT2qQQR$PqpTtPttPpPppqqtppPPPpQpUppPPqpPtUPPTqpqQ pTpRnqTPQpPQQPUtQTTPTQUPuuPTpUPUUtTUPpPppuPTPP2QTqQR$qpTqTptpQpPpPqPpTpPPPuPPppPpPqPuQUTPPqtqQpPpPRnMPTqPPUPTpUqTqTqPqPtQpPuTPUpQtPTpPpQtPTPT2QUPUQS$qPtPuppQpPTPpTPTtQtPtPQpqPtPTqPqPtQpQpQpP.ptptpRnIPUpPPTTtQpQtqpQpQPQtQtPTPuPqPTTQtPTTpTqTQQPQPPRNIqPpUqqPqPtPPPTPtPtPpPPqtQpPTpqpPpQqPqTpQQtPtQtURN$QpTPTPtPQQ2.....2QQPPPtQpUPTQtTpTpQPtP2pQtPpPrRIMtQpQ....QPpPppUpQpUPtPuPQTPpQtQRRnN     .2QPPpTPpPqPQPuqQtPTPqSOMI  .RPpUqTTPtpPtPTqPqQRRN N   .PpPqpUPTpQpqTtPSNSm$      2pPTPpRuPTPPqPsROR%N    QqQ.srruQtPRSRNNII IIIIIJjNnNN. .sssrRQprnMnIIIMNN.rnmII%INN IIIMNINNNNNNNNNNNNNNJNJII%  .NIIE%N  NJ%ImnnrSNR. R1N222R.2..IInrrrsRSRRRQSnNRPQTQTpPTQTpPqpPUQR2.vsrsssrrvptpTQRI .pppTppQtQtpTqTPTQpQpTPQQ2.vsrvsrrqQPPUPPqRN$J2QTQPPTPpPPQPpPqPtPTPpqtPuPQ1wsrUPtPtPpPuPQSN.QPptuqqTuPtqTuPuPqQtqTPTPuPuTrwrvpuPqPuQuPtPtRNIIRPUPPPTPqPUPPPPTPtPPQTqqPpPqPrPtPPPTPPPpPQPqQRN.QpPqPtqpTPpptuqpQtQtppPTTQTPprqTqQPtqupuTpUtPtPRRnI2tTuPUPPUpUQPPPTPpPTQTPqpptQtuqTPtPqPPPPQpPpQPuQRN%NQPpPpptQpPtPupuPuPpqpuPTQPPpPPPqTQTPtqtPtUPtPtPR.NMpPuPUQPPtPQpTPQPtQTTPPPtqtUpupUpPpTqTQTQpQpUPpQtRRIRpPPtptQuPtPQptPpQpQpUqPPPQpTPPtQtQpPppPpTpPqTQpRNNMUtqPQTPpPuPtPQPuPtPpTpTupTppqQtPPPtUPUTQTqTPtPtTRRINPPTppQtPQPuPtPTPTQUPpPPPUpTPTpQtQpPppppPpPqPQPQQONNQqTQTPpQtPpQuPqpqpppUQqtPpPqTpQtPtQUPUUPuPtPtpptRRN$PppqUtPtQtPPpTTPTTQTpTPQtTpPPtPQPTpppPpUPUqTQUPQRNN.UTPPpQPQpTuPQqpQppPpQpPtPQuQpPuPqPUPUpPpPpPptPpRNNIPppUpTpTpPQptPTUPUPuTtQpUpTPtQtPtPppTpUtQtUPPQtURN NQQPUpUpUqTpPTQpppqTpPQPtPpPqPPpQTQUPQpPPPpPqtQpQRRNM2pTpPPPPPPuQppTQTPPqTpPuuQTtTqTPppptUpUqtQTPTPtPQNS .pPqQtupuPtPTQPptqTpQtQPpTpQPqTqTTQPPpPPPTqpqPqQTR/MMuTTpPPPTPpQtQtQPPQtPTpTpPqPtpPqPqptQtUtqpPTTPtPpROR %PpQpUtQqQtPpPtPutPpQpQPpUtPTQTpTPPTQpPPPTQqpQtQtQN2NqPTpPpPtPtQUPqPPPQTPtQtpPPQpqTqTqUpPtPuqptPTPPPQTSNO MqQtQTQtQPpTpTTptqtQtPtqTqTPTPpPpPpQqPTPTQPpuqtPpRR2MPPpPpPpPtqPpQqQPPPPpQPpPPtqpQtUPUtTTpQpQptQTPTPuQONOqTuUpUtQPUPuTpTtupUpTPpUqPPTQpPpQpPqpTpTPQPppqPpPSR.MIpPPpQPPtpPpPpQPPPTqUppTpTqtPtQtTpTQPUpUpTtUPUTqTRNOrQPuPTpuPQTqTQTpuqPpPpPPqPPPQpPPQpQtpPpPpQpPppPqPVR/2IqPtPpPQPtpQTppQPTPtQTTuPTqtPtQtPtPTPUuQTPuPTQTtPpNSNnIPqQuTtPQTPpPUTppQpPpPpPtQTQtQtQQPqpPpPtPqpuPpQPuRR/N% 2PTpPQptpQuTpPQTUtUpPQUpPpPpPPpTtUPUtPqPTPPPqTpPRRN2NN.QQptPQTPpPQtppPpQP $ # # " " ! ! !                                                         tPqpPuPtvqPUPpPQpPuTpuPuPtPutuڶmmPQPtQuPuPQuE%ptpUpPpPuPpPqmMQPpTqTuPpTPuQ%qtUqTpPpPQuPuPqIPpPqUQtTpPpPp$qPuTPtPpPQTqTQqIPpQpPUpPtPtq$%%qQtQTpUpUqPqTPNIPtPqPpTuPpmIqPqPTpUtQPߑ .IPTpUpPpPtptu$IqQpQtQTuQPmI.$IPtPpPpPtp JqPqUpUPpTm.MPpTpTqUPmNqTPQPpPp$ .MpqtPuTPu.J%PTPQpqPmQ. qQpqtPTPm$Q NMpTPuqu .qPupPT IqPUpQm NITpuPpQ$ IqPQs$ JM.nIn.N%  EN.N%mINII/mII   NIN.IINI .J$INsNI%INu2N$ImPpQJ IIUP. N$IIPpuQJNI)mQTPR!I  TpUp. IUQPUP2INIPptpPuQJN  mUPQPtP. NIQtuPqP2N rPQPtTQ.. /QtpUpQPN.2QTQTPpTp.%N2pPpQUPpQqPQ2 IIRPtQTpuPUQTtTPRJI2pPtQtQTPpPtpQpQpRNQUPQPpPpQuPQPtPTp NptpTqTqTpPtQuPqPQPQPUpTPQTQPpPtTIqPpPpQpuPpqtQtQPQ.IqUTUpTPqTPtPtp. JmpPpQtpTqtQpQTQ2NMPUQtQpIUPTQtPpQmUptPpTPIQpqtPpUQTQ IMPQPpQpmtTPQtPpTRImuptUtTuQPqtPpQTQTQ NMPQpQTpQTQtPpq2NmQtqTpPIUpTpQTQTUPTQMPu%!.                                                                    Im   MNOR.RSnsQpQpuPqPpTI% IM/R/SNSRrQpTPpUpQIN2NRNSNsRUpUqtUpTPt  I)n/.SNSRspPpPqPI%.IRNSNSRQTQtTqtuqTuT. N).NN.3.ROqtPqPQPpPs NE. $ NRORPQPtTPtqtQtQ$mr.$%NNR/RptPqPqTPtPIIEN /N.SQPUPpTpPquPqQۍI N IN.SQpQpQUpUPTPtPڑNJ N R.RtTtPpPpQtQے.)N %NRPQpPuTuQTPpPmnN NNRpPuPpPtQuP)IIN   . N2TPuPuPtQpPTpmmI N NqPpPqPuPTqPpnN .Q.NRPuTtPpTqTq֒.  .PpQIRPpPqTQPtڶ$Ir  QUuTR.nQuPQtqtuPqڶI2pPpPIRPtPtPtڶm  .TpUPUpRNmQpQpQtQtQu۶mR pQpPtpPQIRPtTPtPpPڶ%I 2TQtQPQTp2NnQpqQpQUtPֶi pPtPtpUpQIRPTtPpPQֶr.PUPqQPQTP.NMRqPqPUpTڶ$I2ptPtPtup2INRQTpTpQڶI. QPQpUPTQNI2NRQpT۶s RtpTpPuqpUpIRORNRQqڶ$I.PQTpUpPTPp2NIN3NSRSֶm. ptQpQtQpuPtQINSNSNSڶ.PtPQtQ2NI2N2NSڶI. RPuPutuTpPQINOSROڶ.PpPQPqTuQ..I2NROֶ%% RPptPuPpPQJn/R/ڶms .QPpPTQt.. I.ROڶ$I.2QpPQNNROڶms  2Q.%%.2ڶI.    . NnOڶmI$.ֶI.    Nnֶm    J۶$%.ڶn.    Nڶ$     %ڶm N׶Is   Jڶ$$R   .ֶrN NֶI.   .ֶ$$  N$ڶmm.J۶I.  N$ڶN.JֶN N$۶mIR.J%NIֶ%mRN$IN.$ڶ$nq%J. NֶmEIJN NڶmrN  I׶Is  /ֶ$r  ڶ  ڶ ׶m ڶmN  tPtPtTpTqpPpPttPtPTpQpQtPTQUpvquTqPpPrrrvvvrvqtPuQPqPQPqPTTUuPQQQuPQtPtPPQppTpvMPPqTqUrvvvwwssrsrRPppTpTuPtPqpPpPttPpPuPQTQttTQPQvm$qTPqvsswrsrsrsrsrsrRPUqPpPqTQTPuPQPPuPpTpppQQPptprsvwrwvvrvrrssrsrsrsrsrsqPpTPUpTpppQTptQpTQpQUTPtpUPQm%vswssssssrsrsrsrsrsrspTpQpPpPQUTPtQPTpUpTPpppQTPpvrrvswrrrsrrrrsrsrsrsrSrSrRPUpUtUPUpppQpQtQpPpUpTQTQpqPvvwiIswrssssrssssrssrSrSrsrosntPPPPqPtPTQTpPpPpUPPqPpTpTPTssrsrsrrrsrsrrsrsRrsrorORRSRPqtuPtPpQppPtUTUpTpTqTqPqTqvssrrmIsrssssrsrsRsNsNsORSRSSRONtQPPPqUPUTUQpQpQPQqTpTPTpPqrrsssrnsRrRsRsNsrsRsRSNRORNNN32tPtqTpTppppPtPTptpTPqQpuQTurrsrrsrImsssrsnssSNSNSNRS2O2S3RONPQPTPqPQPUPPuPqPUPQpTPTPPprssrsssrsrrrorSRRNRNSRRORONSNN.NNMutpqPtTtpupUpPtPppTpTqppUpwrsrsrsrsrJJRSRONSSSRS./N2R/2NNIPPPUPqPQPPPPpQUPUPUqPQTQTqsrsrsrsNsRnrORSRR.N.ORSR/nI$UuppTqTpTqtUtPppqpPpTptpPrsrsrsRssrsSMMORNONSOR3.NIPPPUPpPuPPPPpPUTTPUpQPQPUrsRsRsrrRORNrNS2S.2.NI PuppPtPQPutQuPppppPtTptpPrrrsrSSORSRO2IMN/NNN PTPUQuPtpQPPpTQUQUPqQPUPTrSsSnNRNRORORn$NN$PpqtPpPUPtpTqTpPptPtPtqpQpQrRRSSSRO2N3.NQTPPPuPpPQUPqPpUPPQtQPPTTtPQRRNNN.O2O.NnpPqqPpPUtppPtTPtPuPpPtQpQqQtQURRS2O2NN%IuTTTTuPpPPUPpQqqPtPuQtPtPtPPptQR..NIINNpPqpPqPuUpuPuPTPTqPPPpQPPuPtQR./NI%IN TpUPQTPpPPPPtPpqPtPuTtQtQpPR..NI%NN qPPtptPuPupQpQTTPqPqPqPpTQR/NIEN.   pTqPQQPpPPTTtQpqPtTPTpTQR.NIM.PQtPtpTqUpqPpPTTQpQpqPR.NM%N  qPtPUPUpTPTQuPqpQtPTQ2NN INI .     nRQpppPpPqpPtPTPTpQR.N$EN. %NRsrPQUTqTQTQpQpqPR.NI I.N.  RSsRtpPpTptPtPTQ2NN%N.   II   RNrNQQTqQPQPuQR/N$IN.. RSRsrpPtPttPR..II..  NI  RONSRRPtQPR..N JN.RQp2  %.  RSRSNSPpQR.NII.2QTPTP2 NI .ONSNRRR..NJ.2PQPqpup2  IN  RSRROR/.NIIN2QUpPtTPPP2  N$ 2N.R/RNM%N2QppPtQpQqtp2   IJ  /SOS.n%J.RPtTPUPqPpPPPQ2  NNN2.NMIN.QqPqPqtPtTUTutp2 II n.n%JQTPTTpTPPPqPppPPP2  NN  I)NRPpQqpQqPuqTuPUPqUp2    I. I.QPPuTPTPtPTPPpPqTPTp2 .I NQUtQpPpuPpQpqTqTPppqP. JN %NPtPpPTQPQPuTPTPpTqUTPT.   . %. N..pQPtQptttPpPqpUqPpPpqU.   NMN  2PtQtQTQPQPtPTPPPTtQTPP.  .N I.QPQPpPpptpQuQtqtpQpQtqT. JI % .tpTqTUPUPTpPPQTQTpTPPP.    %NN QPTqPpPqpQpUtppPtPQqtQ2   N...uPpPuPTPTPPPQUPqPtPTP.  EI I   QPTuPPuptqupptPuPuPqp.   NNNqPpPtQPQPPPPQPpPpPTT   I$. . QtQpPtPttUttPuPUPqq.   .I) .TPtUqPQPQPQPtPtpTP   JI  .QPpPTptpptQpQQPQt.  .N.QPUpQUPUPPuPtTpP.     NN RPpTpPptPtPpQpTR   E)%   .QPqTQQQpUPUpQQ  N.I2pPptTpPpTpTQ     .I.EI  2PQPpUqPQTp. .N$IM   .QQPPtppP2   NI NN ..2.2..  .N$ N N  NI%PtPpUqTUpUpQpPpQpPUpUpuTpTqTpRSOnI.1QPtpQtPqTQTQpTpPtQpTPpPpPTPtQtPTqPPPQPPqPPPqRN.2M%  .QPPtQtPppTpTqQPPTpQTQuPqQtPPqPtTuptpTqTupTRSROn..RPPpQTQQQPPrrrQpPtPtPtPPqTtPQpPPPQPtPPQPR.N.2$N .RTPtpttpusRsRrRqPpQTqTqPQpUpQuTuPqPtQRSSSSOnI   NQPPQPPsnsNsRORRQQPPTpTpTPTpPpPtQRNN.N...N..QQRSRRSRRORORORNRRQRqppPQQRMNnMNIIII%IIJMNNSORONO2ROROROR/.NNNNIIIJN.RNR3RSNSN2.NNII%IN3ON/N.NNI%%NRNMI%$IIII$$J .NNMI$INNNNI  NNI%INnN   .I    IINN I222.2.22.IINN...2Q2.NPptptPupTtTQ2%INNQUQtQR22.2RQtPtUp..NQPPQTQPQpPqptQ.EIN.2PpPtPTpTpTPPPUpQpUEN.QtppptTqTPPUPUEMN   QpUPqPqQPqTqtqPpTPPMMQPUPQPpQuPpptN    QpTpTTpTtPPPTPTpQtp.NN.QtPtQtPTpUQP2PQqPqPPqPuqpqUpQTQ2J pQpTPpQpTpt  .tPtPTuPuPTPTPPpTpp2IIRTPqQtTpQPT        PQtQpPPtPqPupUpQQT.JIqPtPpQPUpqQPpPpUpqPtPPPPtTpPRNI  QPuPUpTpPT  QuTqTPTQtQtuQpPqTQ%.PpPPpUpQt      QPPpPqpPpQPPPtQTPqI2TuQtQPpTq qTqTPTQtPtpQtPpQP2M  .PpPtPtQPp    QPPUqtPtQUPTpQTttpnPUPpQPtTp    qTpPPQpPppQtQpQPQ2.ppUpUpQQPQPqTuPtUPUPpPtPtpQ   QPTpTPtpT     .TpPpPQpptPuTQpQTPINptQpQpTQP       QpUPupTPQPPpPtQtq2INQPTpUPqpTQPpTPPQtupUpQTpPP2NN .TpQpTpTPP    2TqQpUpPPPPUpPQTqQNN.PQTPQpUqT      .PpTpTpUpupTpTqTpQNN.tptqTpPpPQpUPqPTPPPQtQpPPRN  RPQPPPqTUP      2PpPtQpqutPpPTuPRNQPptuTpPpP     QtQPqTPPPQuPqPPQNTqUPQPqTQu .PtTpTpuPpTPtPqQN pPPppTpTpP       QPQpQPUPuPpUPTQM.pUtUPUqPqP     .PtUPtpPpPtQpqQj2PPpPpPpTTq.pPpQPUqUPpTP1MQtQuPuPTqPp       QPuTpTpPpqPq2JQpPtPPqPpTQ     QpPqPqTTUTp2 N .PtPQpTuTQP.QPtTPQppPp2NRPUpUpQpPp2         .QPqPtPUQt2NNQpPpPTPtQ.     QpPuPpPp.NNTQTuPqPR 2QpPuP2NN.ppPpQ1.             .NN.22     NN     NNN%IIIIIIIINJMNNN       NNMJII$ NNMIIN .NJI) %%IIIII$.  NNII%INNNN.NN NNNmIINNII%INNN  NNNNNIIJN    NN   r$INN  NN S%IN   2RQNRENN     RPtpqN  O IMN. QpQTQQRN     .UPTpPpqsJI$.     PppUqTQq rn{                                   !!!"""##$$%%( +*** ) ) ) )PpQpTpPpP2II.RQRNUtPTqQ12.2.2. IIR$PqTpNsmIpuP.   N sIPQ. Ns2.EN    IM m  JJII NImI.   N.mIN .sm%N.  $NI$$J.InIINiM.mNE%M.NI NI$IN%$ .NII  .J%Q..J%ptQ.NIIQTQP2 NEImPpUqQ  NIqQUPTpPQ. NEIptpPqTQ NmPQTP.  NmQtqtqQ mIP2 TuPuQ  $QpPpTQ rqmTpUpQ  iqPTPTQ sIIqPqpqQ MmtTPT2i%qQpQp. mpTpTQ s qPpQ..mtUTQ Pp. NmupQP2 mtQ .MT. mQsI$ .mI$ m R$I.ni sI$Rq.I%II$%mqI$$ڶImmmI$mIEn|              # " !!   ! " #$%&'()*+,./0235689;=?EڶImS ֶIIrڶ($ ֶ$.ֶ%mr۶$I.ֶIrڶII׶I ںmIֶmr۶ֶ$ ڶH%۶ֶIIڷmֶ%ڶmֶ$ڷֶmڶ$ֶֶm$ڶMֶmַIڶֶֶڷڶֶֶڶֶֶڷֶֶֶֶֶֺu                                    , +40-)%     #,B)M         .N$EN. II..J %N.    NN   .IIN N%N    .IJ. II. .I$N.  .%)N M%N QRQRQRQRQ(MQ  .J N.    PpTtPqPpTqTqIIN$I. uPqPuTqPpPUPI%.NIEN.2R2. PTPTUpTuMN.MN.2ptPtPqPQ.upuqpPpPUPpPmIIN2TuPQPuPtQTQ2 uPTPTPpTpPuPQq I.QpPpPuPpPTQptQ.pqUqQpQPpTQq)N2QtQTqTpPUqPpTQPQ.uPTpTtTqTpPqM%N.pQTpPpTQpTpTqPtPtQ2IږPqPQpPqPRN%.QPTqPqTQpPtQPQtPQPQpTQpQIuQ2N$NQPqTpTPtQtQPptPtQtpTqPpTQT%߷rNqPpTQpQpPTpUQPQpPQTpTQtpP $ITpPtPUpQpTptPtQtpPqTpPQTm%qPUpTpUpPQTQTQTQTqPQtqP$ImqPpQPTpTqpTpTpPIImMPtpQqTPTUPUTQPqTqTutI%IQPTpPqPqPpPqTpPpPI$uuuunrI%m%mmImIIm)MIiIiIimImI$m%mI$mHmI( ֶm)$ֶnmI$I()I)H)(H׶ֶֶ۶ֶֶֶֶڶֶֶڶֶڶֶֶֶֶֶֺ׶׺ֶֶڶֶֶֶֶֶֶֶֶֶֶֶֺN\                     #          # ',1C8N   QUPpPpqN.    .TpPtUpTQ JI   QPuPpQpQtq.IN   .qPtPQTtPqmNI    1PqPtpQPuqI   NN   QuTqTQPTpPMM$$I   PpPtpUqTmINN  qtQtQPQPpPmiI   %I   PQtPtPtUMMN  qtPpQPQpPmIm  $N   PUtQuvmI  NM   Q..m% Ni$NN...  sMIRQR1QPqPq)PpTqTpR.ImtPptuPtTqqQPqPUTQ.smqPUPQPqP$MpTtPpQ.m$tPtPtpTqTqIPQpQtQmiqPqQPQPpPqqPtPuPtm$PTpuTuTqMpQPpPIIupqPpPT$ے$$PuIm$mmmI%ےmI%m%Imm۶mI$$mI$mII$ImIm$Imֶ$%imַ)(mnmmnmmnmmֶֶmmۑۑm$ֶֶےmmInַHmֶ$ֶ׶ֶֶַ׶Imֶֶ׶IIIIַ*+,,--..000133446688:9;;==I$mmmmmm$/*p8, CJEUeu OWWW@* " bTA#Ehfa_LayerTableersEhfa_Layerticsarameters840bTA{4096:Cdata,}RasterDMS,.p eRRDNamesListbleersEimg_RRDNamesListameters840@bTA$IMAGINE Nearest Neighbor ResamplingD)Li8u_c_b2g_CopyRaster.rrd(:Band_1:_ss_4_){1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{0:pcstring,}Emif_String,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumrows,}Edsc_Table,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lmin,1:lmax,}Edms_FreeIDList,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{0:pcstring,}Emif_String,{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{0:px{0:pcstring,}Emif_String,LayerNames,1:*bExcludedValues,1:x{0:pcstring,}Emif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,BinFunction,}Eimg_StatisticsParameters840,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumrows,}Edsc_Table,{1:lstartBin,1:LbinCount,1:LorigBinCount,1:x{1:x{0:pcstring,}Emif_String,type,0:pcMIFDictionary,0:pCMIFObject,}Emif_MIFObject,binFunction,1:x{0:pcstring,}Emif_String,title,}Edsc_BinFunction840,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lmin,1:lmax,}Edms_FreeIDList,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:bcovariance,}Esta_Covariance,.gdalautotest-3.0.4/gdrivers/data/BAND5.DAT0000644003401500001440000000000013614004466017503 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_e00grid.e000000644003401500001440000000143413614004466021122 0ustar rouaultusersEXP 0 C:\FAKEE00GRID.E00 GRD 2 5 4 2-0.32767000000000E+05 0.10000000000000E+04 0.10000000000000E+04 0.50000000000000E+06 0.39960000000000E+07 0.50500000000000E+06 0.40000000000000E+07 -0.3276700E+05 0.1000000E+01 0.5000000E+02-0.3276700E+05-0.3276700E+05 -0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05 -0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05 -0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05-0.3276700E+05 EOG PRJ 2 Projection UTM ~ Zone 15 ~ Datum NAD83 ~ Zunits FEET ~ Units METERS ~ Spheroid GRS1980 ~ Xshift 0.0000000000 ~ Yshift 0.0000000000 ~ Parameters ~ EOP EOS gdalautotest-3.0.4/gdrivers/data/CSK_GEC.h50000644003401500001440000003041013614004466017724 0ustar rouaultusersHDF  1` @TREE HEAPXS01H XMap Projection Centre ?@4 4-@ P$Ground Projection Reference Surface ELLIPSOID PMap Projection Scale Factor ?@4 4x#? PEllipsoid Semimajor Axis ?@4 4@TXA p"Scene Centre Geodetic Coordinates ?@4 4VJ|uF@:(@ 8Ellipsoid DesignatorWGS84 @ Map Projection Zone! 0 Mission IDCSK 0 Product TypeGEC_B @ Datum Scale ?@4 4? ` Map Projection False East-North ?@4 4A PEllipsoid Semiminor Axis ?@4 4u?XA XDatum Rotation ?@4 4 X Datum Shift ?@4 4 0Projection IDUTM HScene Orientation ?@4 4Fe@h TREEHEAPX B001QLKSBI8SNOD` hCentre Geodetic Coordinates ?@4 4mPaqF@QPc(@ 8TREEHEAPXXPSNOD @( {NpTREE/0'( P{N p"Bottom Right Geodetic Coordinates ?@4 4I^F@$T|)@TREE+- XBottom Left East-North ?@4 4"A@3RA XTop Left East-North ?@4 4"A SA @Column Spacing ?@4 4@ @ Line Spacing ?@4 4@ p!Bottom Left Geodetic Coordinates ?@4 4 [\F@CU(@ XTop Right East-North ?@4 4@A SA hTop Right Geodetic Coordinates ?@4 4šF@.X4u)@ XBottom Right East-North ?@4 4@A@3RA hTop Left Geodetic Coordinates ?@4 4-F@K(@gdalautotest-3.0.4/gdrivers/data/ushort.nc0000644003401500001440000002437413614004466020252 0ustar rouaultusersHDF  (0! _:OHDR,s}Vs}Vs}Vs}V"  D ' ConventionsCF-1.5&transverse_mercator,@aTOHDR-s}Vs}Vs}Vs}V*( zh{FRHP  ($xhBTHDd(I j}BTHD  d(I ]mFSHDKPx(I %%BTLFLKX Z20GD\JHV<I`A[6Wמ`< U 8 ]:úPWX5sNBTLF :PWGH6WZU<IL < FSSE Xу"$OHDR-s}Vs}Vs}Vs}V ?@4 4*G  +CLASSDIMENSION_SCALE NAMEx qvOCHK <gOCHK :standard_nameprojection_x_coordinate 9 long_namex coordinate of projection unitsmMFOHDR-s}Vs}Vs}Vs}V ?@4 4*Gy +CLASSDIMENSION_SCALE NAMEy ? %OCHK@yw }OCHK :standard_nameprojection_y_coordinate 9 long_namey coordinate of projection unitsmchOHDR-s}Vs}Vs}Vs}V$ *( # _Unsignedtrue 6 _FillValuefOCHKxn Band1x 4]jOCHK 5 grid_mappingtransverse_mercator \DIMENSION_LISTyyÆGCOLw w n OCHK( l0REFERENCE_LIST6datasetdimension x -iLOCHK( 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$ ^VFHDBBgrid_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 AALALAgdalautotest-3.0.4/gdrivers/data/n43_wgs72.dt00000644003401500001440000010256213614004466020446 0ustar rouaultusersUHL10800000W0430000N030003000200U 012101210 DSIU DTED0F18 062 01A960900000000US090078 SPEXDLMS2009609MSLWGS72AS11+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.0.4/gdrivers/data/gsg_binary.grd0000644003401500001440000000317013614004466021215 0ustar rouaultusersDSBBAALALAR@o@5C5CCCCCC5CCCBCBBBBBBBB-CwCCNCCB CBCC%C%CC CCBBBBBC5C C-CBCBBBBBBB CCC%C C CB=C-C C C%CBCBBBBBBBBCBBCC%CCCBBBBB CBBBBBBCBBBB CB CBBBBBBBBBBBBCBCBCCCCBBBBBBCB CBCBBCBC C-CCBBBBBBB=C-CBBBBB CB-C CBBBB CBBBBBB-CBBBBBCBBCCCBBCBBCBBB C-CBBBBBB C CB CBBBBCBBBBBCBBBCCBBCBBCBCCBBCBBBBCBBBCBCBCB CBBBCBBBBBB5CBBEC-CC C CCBCBB CCCBCBC-CBB=C-C-CCCBCBBCBCCBBBCCNCBCCC CCCBBBBCB%CBCBBCCBCCBBBCCBBBBBBBCBB CBCBC CCBB CB CBCBBCCBBBBBBCBBCB%CB CBBBBCBCCCBCBBCBCC CCCCBCBCCBBBCCgdalautotest-3.0.4/gdrivers/data/byte_gmljp2_with_nul_car.jp20000644003401500001440000000364613614004466023774 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrasoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved ijp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/small_world.kml0000644003401500001440000000066113614004466021421 0ustar rouaultusers small_world ffffffff small_world.tif 1 90 -90 180 -180 gdalautotest-3.0.4/gdrivers/data/byte.rl2.sql0000644003401500001440000001175613614004466020566 0ustar rouaultusers-- SQL SQLITE CREATE TABLE spatial_ref_sys(srid INTEGER PRIMARY KEY,auth_name,auth_srid,ref_sys_name,proj4text,srtext); INSERT INTO spatial_ref_sys VALUES(26711,'epsg',26711,'','','PROJCS["",GEOGCS["",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["central_meridian",-117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],UNIT["meter",1],AUTHORITY["EPSG","26711"]]'); CREATE TABLE geometry_columns(f_table_name,f_geometry_column,geometry_type,coord_dimension,srid,spatial_index_enabled); INSERT INTO geometry_columns VALUES('byte_sections','geometry',3,2,26711,1); INSERT INTO geometry_columns VALUES('byte_tiles','geometry',3,2,26711,1); CREATE TABLE raster_coverages(coverage_name PRIMARY KEY,title,abstract,sample_type,pixel_type,num_bands,compression,quality,tile_width,tile_height,horz_resolution,vert_resolution,srid,nodata_pixel,palette,statistics,geo_minx,geo_miny,geo_maxx,geo_maxy,extent_minx,extent_miny,extent_maxx,extent_maxy,strict_resolution,mixed_resolutions,section_paths,section_md5,section_summary,is_queryable,red_band_index,green_band_index,blue_band_index,nir_band_index,enable_auto_ndvi); INSERT INTO raster_coverages VALUES('byte','','','UINT8','GRAYSCALE',1,'DEFLATE',100,512,512,60.0,60.0,26711,X'000301A513010006FF265CF5B8FE23',NULL,NULL,NULL,NULL,NULL,NULL,440720.0,3750120.0,441920.0,3751320.0,1,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL); CREATE TABLE raster_coverages_srid(coverage_name,srid,extent_minx,extent_miny,extent_maxx,extent_maxy); CREATE TABLE byte_levels(pyramid_level INTEGER PRIMARY KEY,x_resolution_1_1,y_resolution_1_1,x_resolution_1_2,y_resolution_1_2,x_resolution_1_4,y_resolution_1_4,x_resolution_1_8,y_resolution_1_8); INSERT INTO byte_levels VALUES(0,60.0,60.0,120.0,120.0,240.0,240.0,480.0,480.0); -- CREATE TABLE byte_sections(section_id INTEGER PRIMARY KEY,section_name,width,height,file_path,md5_checksum,summary,statistics,geometry POLYGON); -- INSERT INTO byte_sections VALUES(1,'byte',20,20,NULL,NULL,NULL,NULL,X'0001576800000000000040E61A4100000000749C4C410000000000F91A4100000000CC9E4C417C0300000001000000050000000000000040E61A4100000000749C4C410000000000F91A4100000000749C4C410000000000F91A4100000000CC9E4C410000000040E61A4100000000CC9E4C410000000040E61A4100000000749C4C41FE'); -- CREATE VIRTUAL TABLE idx_byte_sections_geometry USING rtree(pkid, xmin, xmax, ymin, ymax); -- INSERT INTO idx_byte_sections_geometry SELECT section_id, ST_MinX(geometry), ST_MaxX(geometry), ST_MinY(geometry), ST_MaxY(geometry) FROM byte_sections; CREATE TABLE byte_tiles(tile_id INTEGER PRIMARY KEY,pyramid_level,section_id,geometry POLYGON); INSERT INTO byte_tiles VALUES(1,0,1,X'0001576800000000000040E61A4100000000CC624C410000000040C61C4100000000CC9E4C417C0300000001000000050000000000000040E61A4100000000CC624C410000000040C61C4100000000CC624C410000000040C61C4100000000CC9E4C410000000040E61A4100000000CC9E4C410000000040E61A4100000000CC624C41FE'); CREATE VIRTUAL TABLE idx_byte_tiles_geometry USING rtree(pkid, xmin, xmax, ymin, ymax); INSERT INTO idx_byte_tiles_geometry SELECT tile_id, ST_MinX(geometry), ST_MaxX(geometry), ST_MinY(geometry), ST_MaxY(geometry) FROM byte_tiles; CREATE TABLE byte_tile_data(tile_id INTEGER PRIMARY KEY,tile_data_odd,tile_data_even); INSERT INTO byte_tile_data VALUES(1,X'00FA0122A51301000200020002000100000200720100000000000000000000C8789CEDD7A1B6D4301405D02B5397BA46560E9F8144F21BE01E0EE4C381E4339EC581C3CEB8672B33AE718DA47C00B615B3B7893D6BDD959B9C0F7958C7483DA2965AA2E67EE91F8347F134A6BEF5B2CC75DC5A89357AEA3FCE0EC5619EA7FB7EF9D78854EA9BD7A1469996AF6787E2307FEEB5475FE67D07F4D88FE172EDDFCF0EC5613EF7714DFFBE005B0C4B6ED3B0BF00F6FFE3788ED8EEF3D62EB79CC6F9DA724433FFC7F1526F53B47C4FEFDBEF14BD5F96B7CBA7B34371986FCB7CDD2BC03A4C7B054CB11781DBFCE5EC501CE6575BA25CC7D721D721529F9754C2FC1FC7CBBB74FB59E7B5B439D6DEB7965BD6FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F89FBF6E9F6101C9B6B7A3BF366AF0',X'00DB0122A51301000200020001A3BF366A0000020075010000C8789CEDD7A19AD4301406D02B332E75131939168745227906DE6071EC232C6E70ACC4E2906071BBB2B232E31AD74ACA03605B31E7B844FDDF97E4DE9B87A1E532BD7929538E5B5D4E11D3DB8FC1BDB8F625D6219635ADA9A73AA6D286C7A343B19B5F3D5A4CB5F5320FE73FE7ED2ABC7FFE7A742876736D653BFD61EE6998B70A70BE7DF8919CFFFD788AF132E6D44BDB1A403A2D3D9F42FDBF1F9F237A9D638D36BCFBBDADD7BAAC5F8E0EC56EAE5BFFCFB7C8BD4E9756DBF60528EBA7A343B19BEF739A7A442A63EE91B621A055EFFF8E7C2B637D394D39BD5EFA79C8B7DA627C3E3A14BBF9196D4D11E5354F43FBB791BAF91F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080FFFA0B1A7B5C01C9BC493FB5D0'); CREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex(); gdalautotest-3.0.4/gdrivers/data/big-endian.rsw0000644003401500001440000015256213614004466021137 0ustar rouaultusersWSRr ```̒@@@j@S`@)s"AWwO WA\M:x ̐rP@ƐQQHH%tx%tLApQL##%t/+0%tdFQ 8F%s`%thaHQ##%tI!%t !IhQI͐I(Q2`HI1IPQ1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZRU@3$5$0(7(5>IDOVHBHDVWLQJ@3$5$0(7(5>IDOVHBQRUWKLQJ@81,7>0HWHU@@Vt         VtVt\ta~gƃcDŽdpʄfbʇekʈhiˉmp̊ngΉpjЍqsғyeҘ-֜.٥0ت.ث.٧uפdڬdڬtة/بm٥g؟sؠg؝l۠eۡeڝrۘ.ۘ|mܖy.ܖ}rٕjڗܗwۙݝXܙyݗyܖxەyߕtݘtޜuߟdߢdݤtߧ/ߨmޮg߮sప.న^߯ZާUޮT߲RⶮR㷰PᶭQ㹱P⻳(ⶱ亰丰亸⻲弳@㼴(㾲mⷰlඨ_ᵫ6ⲧ1߱p㲨mᮤ߲hݬߥߤhઙএ9ߤ@ߢ$$ߜkޚipߛ~gߛjߙsݚe-ߜ.0ߜ.ݚ.ܙ}uݚdݚdݘtܙ/ݘmݙgݘsۚsܝaޜlܚ1ژxٕ.ڗ~nܖ}xڗ|ٔ|ٔzؔz֒|גyבzՒwZZ]‚_ÂałcDŽcDŽf8ˆgpʈib͋kkΌni΋rpЎugӓzj՜sסeئ-ح.ث0٨.٪.٭uڪdکd٨tڨ/٤m٣gڠsܟt۟sۛ.ۘnۖ{۔}ܖ}ۖ~ږ}ܖ{ۙ}ܙݗ|ݘ}`ݖ}ݗޘޛݟߠ॒ݥߩެ(߱oᲨdᶮnᷯa⵭sⳫj߲gബS⵭ᵬᴬ⵬ᵪᷯ8ᷮAⷯ⸲ ⸯ 亳k仲i㾲mⷰlඨ_ᵫ6ⲧ1߱p㲨mᮤ߲hݬߥߤhઙএ9ߤ@ߢ$$ߜkޚipߛ~gߛjߙsݚe-ߜ.0ߜ.ݚ.ܙ}uݚdݚdݘtܙ/ݘmݙgݘsۚsܝaޜlܚ1ژxٕ.ڗ~nܖ}xڗ|ٔ|ٔzؔz֒|גyבzՒw‚_e‚_e‚^-ą\.ƅ_0Džc.Ȇd.Ʌguʆedˈhd͉ht͊i/ЌmmӏusԖ~gנlؤe٫eٰrج.ڮa۲ڭ٨۫ګܫۦ ڠ۟ܡ۟(ܝoۛdۗnܙaۘsܗ|bݕ{pܗݚޘݚޝߠߠ9ߡAߥߧ$ߪ$ઞkޭi߰p೫gතj⺯s⺱eỵ-⹱.⺲0ᷯ.⸭.⹮uᴪd೧d಩tᲨ/౦m߱g೩sᴪg㴪l㶮eᵭe⵪r⵫.ᯠm೩s஡eި-Ⱕ.᭡0߫.ᯢ.ᮣu⬟dߧdߠtࡊ/ࠈmgsgleerߜ.pߜߜޚݙߚXޚޙݚޙ(ޘoݙdܛnݜaݚsܘrۗsۗtڗ~vە~ۖ} ڕ} ڕ|kؕ{iה{pדzgגxjגwsƃ`ƃ`Ń`ņbDžcɇc0Ɇg(̇fx͇hm͊il΋j.ЋkiэlҐoӒu՗X֟ا٬ڮ,۰pٰܱݳPܱܲۨۦ)ڤۢ۠kݜiܜpݝgݚjݚsߘ|eݘ~-ޚ~.ޛ0ߜ.ޚ.ߛudߢdߣtߥ/ߩmଝg߮s౧e൯aතp෭eḭmḬfⷮUᷮSⸯR⹯P⹯ḯᶬ᳨ୟୣᱥದᴩp⵬b㷮k౪iణp௤gᱧjᲨsᲦeᮢ-ਜ਼.⮢0⯡⮠᪛᭜Ⲧ᫝ࠊࠊ⡋ជច᠋⠈⟅p✈bᜆkiᜅpᜃgjsᙂeߙ-ᛂ.0..ߙuߛdߚdߚtޙ/ݙ~mݗgܘ~sݗ~fܗ~eܘ}.ۙnݛuښyڛyڛژ~ٕٓxؒxƆ`gƆ`gƇasȆdsɈbaʊcảeůgc͋ii΋lfЋlpюnmҎsԓv֕z՜ץ٩کڭh۱ܲpܳbڴiܳpܱg۪jܨsܣeܞ-ݘ.ݙ~0ܜ.ݛ.ݜuޝdޚdޚtޞ/ߠmޟgޝsgऑlަeߩeଟr૚_᭢r௢y߱r߮sᰣಣఢᰤᲦದ೧൧೩೦௢᳥Ყ ತ᳤᳤ᳩ⳩YⶩᶫI㷯t㷯t௢kᱥiⶪpᳩg䵫j⵫s䵪e⭡-㴨.ᰡdᯣd᫞t⫝/᧒m᧑gਖs⦔g⧑l⣌e᠊e᠈rᢏ_⣍rឆypᝁmែឃᝅᜅpᝄDߜ ߚ ߛkߛ~iߚpޚgޙjݙsݙeݙ-ݛ.ݜ0ݞ.ܚ.ܙuڙd٘dژtڙ/ؕ}mȇbdȇbdLjctȊc/̉gmˋhgˌgsΌi΍jύkύpҏsՒv֘֞أب٫ڱ۲ܴܴܵ޶@ܶܳpܰbܭkܡpݝgޛjޚsݚeޜ-ޞ.ߞ0ࠆ.ߢ.ोu॑dߤdएtߩ/ߪm߭g߭sୟs௣aᰢaᲦu౥c߬i᭝f߫g߫a߬.ᰝn௡R஠PᯠOᯢPᰣPⱢOᲢN᳨MⶫJ亯JᵧJ㸭K亱I⴪I㷪I彴F伲D㵪D㳦C⴪CᴦC⺮D䶩D潴l滲l䷪l⵨l䳧nᰣnⲤu㮝d᧗d੘t᫝/᪘mᦕg⩙s⪙RᨗAᩗMᦏ{ࢌy⡊z⡊{⢍y៊x❅xᜃᛁ`ᛁᜀߝ ߜ ޜkݜiݜpݝgޚ}jݚsݚeݚ-ݞ.ݡ0ۡ.۟.ܜuۙdȋcfȋcfɉfeˍb2̍fp͍hmύiЏhяlӑrՖy֙לؠ٦٫ڭ۰`۴(ݹxݺmܸlݺ.޻i޹0޷޷ݳܬݨ ޥ ݟkޠi࣏g॓jߧs৏eި-ު.ߪ0૘.ଙ.௟uᱤdೢd߮tଢ଼/௢mఝgᰞsఝeᰟa௛pߪeਔm᧒fଗQ૚Q୛P୛NᮞᰣⲢⳤ丫㻱㻰(乮(o念d澶n仳a㺰süpùm弳D彴P㺯廱弳P中㳦9ᱣAⱡ㳦 Ⲧ 䳦k㳤iⴤp㱣(Ⱔe㰥p㲦.㲥n⯞v⭝z⫚z᪘y⬖y⪕⦎$⢉$⠊➈ឆ➂➄pᢇbᣋk⥏i॑pߣgjsߝe-ߝ.ݟ0ߣ.ߨ.ߪuݪdުdݧtݤ/۟mۙgܚ}sʌd.ʌd.ʋfňg΍iЏjяmғp җu ՚~kסiإp٦gبj٪sڭeܱ-ݷ.ݹ0ݹ.ݸ.޺uັdݷd޶t߹/߻m߶g޲sݬsݧaިlޫ1߫1૘pଘmଚଘଛ௞ᱡ౟Xౠᱡⲡ߰߱ᱥఢଜLᯞᮠAଢ଼ᮜᬛkଛiઘp᭛g᭟jᴩs⳦e㴥-⶧.ᴧ0㸬.弱.弰u㺮d伮d乪t彲/⺮m彲güs佲g弳l廳eºer㸫_ⲣr⮟yⰝj⭘g㮜䶧个䶦湫漯庫乬䷭e⴦-㴦.㴦0䴨.⳧.ⱡu⮛d⪘d⩚t⫛/⪕m⦏g⧑s㩔gᮙlᱢeᬝe૙r৐.ࡇn᠃dៅdऌe੔ଢ଼ఢౠݯޫޤݢ(ݟmܜlۙ_ژ{x̏ȅȅgΏg(ϐiђmpҔsb֚wkםi֠pةgڭjٮs۲eڲ-ڳ.ڱ0۲.ܴ.ܴuܷdݹd޸t߶/ݷm޸g߷s޵g߲lޮe௝eఠr߰.ఞp߮.߮uଡ଼.ᯜm௟௛d߯a߭cச`߬\୘[ᰞ[Ⲡ[ᲟYⰟZᱡXᲠUᱠRᯞOᱟSⱢPⲤNᱣO⵨M㷪JⵥKⷨI⵨I㴧F乭H仯F潰F彲GⷨH徱J·濴t徲tļGCĺBCC估D㹬B䶤@㳤)Ⱡ(䳡+䳨.巪/廪1丫5亭;溬H㸫J漪_绬U溭[湫g庭j㷪i㷮p个g㶫j㷩s䷦e嵩-㴦.ⱞ0䱟.Ⲣ.᭞u⭙d㯜d⫓t⤉/⥈m᥉gᤉsᨑbᩎd૗g߭h߬cߪ`ަ_ߢ[ߞ`ݞjݝ~ޛ|ܙܚ|͑gs͑gsϑhrѐnrҒpԘtԞz֣֝רڬڱڲ۵ܵ۴٭ۮܱۯܱ޴޶޹޶޶ߵޱ޲޲߲߲߳ೡ౟ᯟౠⱠᰠi߯_ଢ଼b᭜^௛\⯚[⮛ZᮛYⱟXⱠYᲣUᲡTⲡS⳥RⶦQⵥO㶪QⶪP㵧L丫K㹪K㶧H丫E㸩G庭E庬F个G漰GFĹG¸E¹DùFFAżC忳D彰B弮A潳?徲?䷩A帨3漬.幫+幫*个+乫-庩*庪)廰*彰,濴1濵025ߟ~:ߝ;ߝ<ߝ~Eޝ}Mݝ~^ݛ~jݛ}rΒl\Βl\ϒliғmsӕtuכz}֡ףةٮڰڱڲܴڲۯڮܯܲܭްݳ߶ߵߵට߷ߴಣഢ߲ഞಡᲡᲠⱣᲡⰞl⯝`ᱚaᯝ]ᯝ]ⱝZⱞZⳟ]᳥WⵦT㸧W㺫W⸫T个R㸧R㹭Q乪S享Q㺫M乩K漭J弯H仰G们G庬K滯J丬IHD濳DƽCĹC÷CƽIùF¹C彲A潳@?Ļ?徱C溩A漰A辱,罰)濱'¶+¹)¸+翳.翵-...濵1徯2享0㷦.䳟-䯙/䮖0䯚1䮗2㭐3㫐`䨌b䦆b䥈b䤉c䥆f䤄d壇c変c䦇_⦅X⦆O⤃JᤅJᣆC⡄=⠄:ᡂ=ᡂ;᠁<ߡ>ߠ>ݡ~=ޟ=ޞ@ޝEޜQҒo<Ғo<ғnBїoPԗse֜ypף}ר׬ڱٴڲ۵۴۱ڭܯܯܯݰ޳޵߶޵߷Ṫศ߶ⶩᶥഢಞᱠⲡ᳣᳠Ⲣ`ⲟ\ⱟ`ⲡ`ⶤ^ⶦ^⶧^⸨]乪Y㼮Z俲Z忳U濳V俳XY濳T潰S徴V佱V亩R忳OLI·I濳LùLIJƿHƽEżEĹEŸEƾDûEĽGƿFƽCµ@=徱?滫@辱=忱=,ù)ż'ĺ*ľ)Ƽ.ķ00澲,廬-帥.嶤.䳠-䰙1存1氚.岜3宗0䭑2媎1䪌/婊4橌.媊/始B䨈K姈N妉Q䧇N㧆I㦇C㥇?㤅:䤂;㣄:⣈;㣅;⢃:⣁=ᣃ>ᣁ:ࢁ;ߠ=ߢ=ߠ=ݠ=ޟ=ޞ9җo>җo>ӗp@՛w=֠>פOשhٯzڴ۶۸۹ܹܷܷܺܺܵ޶޸޹ߺ߹ະ⻲㽴㾴⽲㻱㻭ẪḭṬ仪乬㸨h亨_㹪b㸪`㹬`仮]徰^侳^[¸_ý`Ƽ]ǽ[ǾZWƿYƾZżWĺVùU¸SúSO澯M彲LMN濱IĹGƾDĹBGĸEDEDöDFA潬?<¹=¶>¹<Ĺ8ĺ*ż)ü*÷.)濱(澯*廪(左(嵢)峠/峟+寙.孑-欑1子1䫑2䫌,媊*媋-檋/穌-櫉,檋+橌-橋/樋6䨉4娇1䨇4䧆8䧇8㧇:㧆8夆7奆7㤇9⦄8㤂7㣅8⣅9⣂:ᣄ:ࢃ:ޢ=ߢ=ߠ<ޠ=՞v@՞v@՜xK֞{H֤AקBجCڳg۷xۺ}ܺݾ߿µ߼޼߽߻߽ἱºĻúûúùøúú·vc念]濳Z忶XZWU¹WŻUƽWȾWSNQNMNNƻNźJĸHĹF·EE¸C¸DĹCżA翳@?=翱=µ<Ǻ>ż>A=潮B;ĺ8Ƽ:Ǿ<ǿ;ȿ;9ƾ7Ƽ%¹)),漬(带)䷡+嵞#岖+氓+殓,䬑,欌-䬌/孊.櫋2櫊.嬊/櫌*櫋(櫌0䬌.媌1竊.嫍.䬊+櫊2嫊4䫉.㬉.橇4㩆5㩈6⨉5㧉7㧈7⧇8⦅;⧅6⥇6⤇8⤆9⤄9ᣄ<ࢄ;ޣ?ޢ=ݡ;ՠz9ՠz9գ}=֥Aצ@ج=ڱ>ڳDڵm۹sܺzݾ¸ùĸ´߾⽳ῳ·ùĹźƽƼƽƼŽƽƺļ}ĹvĺsùvĹtĹtùqĸpżqƾnƼmŻnƺnǿlɿmlkklƽkƼlŽlǿkȾmlklǻnõn濮mo¶qöoon迯p濰p濰pn÷sĹnźjźjŷiĶj´j濲h翰#溩(緣$淠(峝$寖%寓*歐殍$宍 孍歍)箍&歎$嬎%歌*笌*欎(欌#筌$讌.孍-孌1箌-孌-毈,歍2䭌5䮊;㬌;嫋>嬋?䬊9䪈0㩊/䩊4㩇2㧇8⩇5㨆8ᧆ=⥇<ृ5ޤ8ᦄ9㧇8婇:橆4إ|إ|ץשl٪qۯqٰuڱx۴۵۹ܼ߾öķ¶ῲµ·øùĸĹĺŻƺŹ¹÷÷¶¸¹ķĹùŹĺļźźĻƺƹƻǾȽȼƻȾƞƛșÙǽŽĹƺźƽǼ~±罪缫~Ĺzöurp翯l潫l缧k湤h淣g浟=岛<泗=簕?篕>气>毓F毓N殓F篑K殒K篐L筒U筒Z殒\箏`篎h箍m宏o箏o殎w歐v殐w毋}母|孏毎殍完孍孌孌䮍䮌䮋䭑㪊B䪊N㪋N㪊M⪊PੋU汌S鲎X㩇^آ|\̚taq[eףzףzإ}ڨ٫ڮڰڰڲܴݷܹ޺޺ຬὫྮ཭໪໮ᾰᾰ㿱´¶ö÷¸¶µ·¶·¶¶÷·øùŸŸźƻƺƻǻɽ˜ȿƻ³öĺżĸóŸz³isŷo³mi转id缪b约]纣[淡[淡X嶡Y渟W湥X淢T䴛S汕籔沘氕簓簒谒豐簑篒篓篓汓籑簓氒籑籓汑篒氒氒篑篑寑氏篑篑篑篐毐殒小䰒導䯏㮊᫉⬎᭏갓đstW\GjN@_G;W>7٣u٣u٣vڦ{ڨڨڧ~ܦ}ݧܱܰݱܰޯ߲߮߯೛ߴട⶞㷠⹢⺦⽭㿰²µøĸĸĸĹŸĹúĹĺŻƹƼǽǻɽåĞȼƸ¶õķ羮羬辩~xyt³rm羫l羨f缥k締g続`級a洙[糗W紗]洚Y浚T沗R峕P泔豔粒沒簓籓籒粒籒粒屔貓汗粕鳔籗沖粕籖籕粕沕糒沔泓泒粒粓气籑汐氏屎尐䭏ᫍ對췓ҝ}\EV9-]<2R8/P7.T<4ZC;YC9٤z٤z٦x٦yۥ{ڦ|ۧ|ަ~ݨ~ި}ިߪߪޫઈᬇ஋⮎⮍⯏Ⱁⱘⵠ⹦们修濱·ùĹĻƼǿȿʾȾȼƹƹƺǼðūʩƤěƻö²龬}辩s缨q齧t翫r迬lkh辩b輦b绥`繢Y蹢^踠Z趞Z緛T絜T絜I継K継J絚H糘F糖F贔B贓豔籕糓糖賗賘賙賖純紓洓賖糕賕糖嵓紕糖泖洓贓洔崔泔泓糓貔糑岑汒籑岏䯎貓᫋u^fC6T:1Y;1S7.S6*T5,U;0U>5T=4٥{٥{ڥ|ۧ{ۦ~ݧ|ݨ~ݨݪݪޫޫ߬ஊᮌୈ௉⯌㰔ᵝ⻨忰·Žɾʿķɴͭͣ͒͟Lj†ɾȽ~ƹ}ķlòlffm迬g]b迫\缤\滣_湢S繡O蹡L躡P縡T鸞Q蹠I鹞G鸟C鷝B跛B跙A趚F渖C浚<糛>紗>贕賘紖跜縠継絗趗贗贖絓絓泖贔赔賗贗綔赕贕紓浒浒糕賓糓洓純洒泓屓Ⲑ絔ڨbwQ>Y=2Z=5Z>2W=4V:/U9.T:1S;0R;2Q:4ڧ}ڧ}ڧ|ۨ|ܩܪ}ݪݪݫޫ߬߮ை்ⱐ᳕ᶞἧ伩ŸɽʾDzαѯѫУϗ͙ɖ„À{ɿvƻmǻkƺdŸgõdeV迨^缦X軣U軣V蹢J躞U蹟V踝N鸝T踜S긜G蹛D趜H鶜I緝H踛I線C縝A縠=緞<踘:綜淘趙跛跜趛鷖跙緗趕}綔赘綖綔鵖贖贘贖鴖緓絕紕淔赕綖巖緖涗䵕䴔꺛᱑dnI:\?4\A8[?6W>3W`E;eJ@{fJ@ycG>Z=3W;1oV;3fS9/S9.|T:,P8,N6-O81P7.N7/N80M6.۳۳۳ڴڷڸ۹޹ݼݽ߼߽߽Ύ⿭㿫㼢仞彟弟濣±ŷǷǺǻõƺɽŸǹŶʼȹǹŷĵŴĵĵ𱯱®|s龤o齠u뼝r꼞}點x麛_輙d麜h麚b黗g麛Y깜c軘g躛W蹜R껙[꺚V麛R鼛\껞P龢J龤D꾧C꾣꼞꼜껚鼛|鼛x齙鼚鼛~鼚꼚黜n麜o꼚|鼛鼙黚黛軛軛軚湘꽜£ۯjqwZEbF;`E9eJ>eH>bF9`E;W=2S7,{T;/wV;2vR:/Q8/P5,P6+M4+L5.L5/M7.M6,K6.ٸٸٸ۶ٸڹ۸ݸ߼޻޹༩⿫¯¬㿥㽢侥徤ðƳįijƶƸǻǻȻǺƺɼɾöʾǺǷǷŶijIJ±®êííĴñ§«ë}鿞|꾠|꿝~꽞v꽚u鼚z鼚y轚q黜g껜l꽜l꼚g꼙a鼚f鼜i뽜f龞a齟c꾞g꾡e龣d龡d꾡^뿜[齝齝꾝齞꾛龚꽝뼞}齝꼞꼜~鼝껟꽝꼝辛輝輝齝軛潜ƣᵕ~hqTE`E9cH>gK@fH9`B5`B7`C9X>5S9/U81U;1W=2R8-R7+P6,N4-L4*M3)M4+M5)M6,K4+ڶڶڶ۷ڸ۹ܺܺ޸޹Ʈؽҵ׷ìưƸɽȾ˾ͻĭƱɭɬɲʶԷԲ¦báīª¨©¨©îí©¥뿢뿡zp꾟e违{龜꽝q꽜o鿝n龜j꽝z뽞n꿜g龞m꾞]뽞`꿝b뾞Z뾟UW꿡I뿠ET뾞a쿝L쾞뾟{齠w뾝뿞뾟꿟鿟~뽠꽟w꾟p连w꽠龠x鿞l龟|迟漝¤Ü|[G`GbF:_C9^B7_B5Y=4U90T92rS91pT:0xT=6pR:3tP7.`Q7-hO7,L6*M6,L6,L6.M7.K60ڹڹڹڻغںۻܼݻí©jmWgSfRx`ÙŮǶ³ɹʶԷŨlnVmVşw]kuƣh^I]GlV*nT=nVim㺛羠꾣羝辜龞鿝鿠v}뿢nu꿟o꿟e뿟kkX꿞cv꿞U뿟NY꿢g꿠i뿟^꿠[Y쿟H뿠HKEMa^vz}y~뿡鿢翠徠ǧนo\aC9cE8hL@eI=cF:r`D:_C7^B8^C7[@3U;1zT9/P3,P4*R<1T=8P:3N7-|O7.O70N5-M8/K6/K70K7/I4,غغغٽټٺٹܺƬizU=xQ?}WEXJ[F\IYI{h԰Ǩ˳~dcKXAUAXCXFhVEVC~UC~WC~VEZKXG}TE9{VEAzTGVwRClaNƜ~ɤ翟辝áá翟æ¤vp뿠}mnjvŸuf]^¡lhWTQNX£YP¤Nã`äM¦yä~¦ģâä¥å¥ää}åġĢƨͭtTFaF7yQ:0zQ6,O7-L8/M7/L7-J4.J4-H3*G3+ggsӮظɬ|m~UuUySBzTE|WEZGYF[G^J\L|UGXFZK[JYFXI]XHiYH[GYF}WD|WE{UE|XGzXEwUCwTD8xTExVGGzXH|YIxSFhRßںciS{gucnp}ԮƤĥáâzģtĢiäcģeĢfģdĤjģsţrţtĢl¥_ŤfţfĤIƤTĥ^ťTŦTŧWĦLħ]Ŧ[ŦOŧĩŨŦ~èĦĥ|Ť}ŤŦĦĤģo~ϱȞgF7`F^F=`E:^D:^C9Z@5U;0T:,R7,R71P7.Q7,yP8+zP:1jP91xO:1P<4Q82N80N91M:1J7/H3+G2+F1(F2+zS=zS=yS=[AaHvW?mLbH;aF<^E<_F:^D6\A6ZA6U=3T:0V<2S:.R9/O6.L5/tO71bP:3kP;3O;3M93}N:4_N;0hM81J70I7/G3+K80H5/G5-zVAzVAxUCwTBuR@sQBtUAuTBsRBtS@xTAwTAvTBvVCzVD|XI}XJ}YIcRYJ}VF[J~XK}WFE}XFBXEP{YEwzUG|zTGZ|WIyVFuREtSCrREsSEsQArQCiqQD rO@0sQ@fsRCuUEyWFyXM`OhRlUgRhSkUfQjUfQjVkǦ}ȫlĦxƨ~ƦwȥxǧwƨrƪyǨǨyƩgƨ^ȧYƧgǧiǩbƫVǫJǪ:ƪ2ǪHǪcƪ]ƩiĩrĪzŪ|ūŭƮƱdzȷƷƳɶ{lweI:vaIaG=`G:^D8]B8\C9]B9vX@9W@9U<3S7/R7-P6+R:1Q:0P9.Q<0Q;3P;4N;1N82{M83K70J6/H5.I60L71J50G5/G4,G4,F3,pRBpRBpR@mP>nO@oPAnPCpRAqRBqR@sRDtSDvTBvUDvVDwTEzWGyVG{WHyVEzVC{XGyUEixUE&xUE>vTD:yUDJuUHWrTFDkSF6hPFgND(gNEeiOFjQCjPChjOC8mQADnRDTmSGNoRCZoSEqTErQAqREsSEuTC_PfQ{dOogTgfRpeQwgNfQhS}fR|u^jֵbжnȰ~ɯkȭeȫ^ȭaȬdǭeƫjİuŰjĮjĮzů{ůzűrȸjʽ[̾>̾B>=wʾ~ʼʺɸȵɵƳȴ|ҽxϱ}vWIz\?4xeI<|_F<}]E;]D8\B8]B7Z@2ZB8ZB8W@5V<2T:1P7.R9/P80P8/O91O;2O=5O:2L80M92K71K80I6/J7,K80H60G4.{G2+E2,F3,D1+E3-lN=lN=lPAlQClP?nP>nPAoQBnPApQ?pSArSBrQ@xuS@tuSB{vUDzXGzXHyXFyUCxVCyxUFwTFvVBNwSAwTE,pSCjREgQE8fNC7gN@eMCfNE/gQFKjRHhQGgN@yfNAxiOAylSHmSFmRCoSCnQCmPDpSCqREsTHp^LndOcOdPcSfOdOdN~hQeNwhPrŤsȭ~̷}̵{ʮɭȬwǫzíűqĴcŴRƵZȹNɼ9WnhW`˽jʸhȷɴvɴuʴʵxʵrɳeѼ`θmywcGoQ=nQ=pR@oRCpQBqSBpTDpSCqR@oQCqSCsTBtUDvVGwWFzWE}ZJvVGuUGvUDtT@rSC mQD eQEeOBfK@ dJ= eL=fM@ eK>-eK?>dNB[dND{eLBdMDfOBiOCkTIoWIsVKrTInQEnPApREqSEpSDzxXEbOdPfOdPcNdNcLhNgTseQmpZvhvĮrϼ{ɲ˵~ʴoʴxʴx˵t˴b˶fϿaRPW͹Sͺ`̹P˳D̵T˵v˲sȴsɱuɰ~DZҼ£y]Kw[?2y`E5T>3Q8-Q7-P91N:3N;3M8.J7-I5-I3,K5,I7/G4,{G3+~G4.G5/rG4,tE0(E0)D0)D2,B2-B0-A/,@90@90@:3K@8]J=YG:[H;fM=jO@qUCrTBpSBrUDuXHuWHsVD{vXEwWCxXHvXIsSCsTDtRApSBhPAidK? eK@cK@dJ@dJ? dJ= dI< cJ="aH:'cJ<bG?3dJB~gMBhODcND`OF_PD[MD`NDjSFnQApRAqVJrWGtpWIgvYIs_KdOdMcPcL}dM~cRseSggR^dQkbNi}kdŵnʻ{ɷyʷpȹgڽbɲXʰ]ʯVʱ[ʳ^ͻZϾNμLɺHȸ;ǷBɺĀ˿z˾ňdE5}Z?1|aF<~aE;r]C7v[A7z[?5xYB5x[@7~[?3XA5W?7U<3P5/S<4P:3P80|S;1P:0N8.M81L4-J4+J5,I3*G4,G2(D1(F2*F1*E1(E1(yG3,yE3+G5.F5,B1*B1*C1*B1.)-')-'(-(+/+./,/0.10.54/;51H?5J>5_L@UI>[I?gRFjSCqXCqTEy\MvXEuUCsRFnREgOAdKbI?aH> dI<cH9)bH<cI;_H:=ZE72:2-;40<<7EA^LAjSJrVKsWKrWJrVF_NdQcKbNbNqcM^eNifRteMziSmbN]v`_ϴeʹa׺iѮpҩyֽ|Ľmոh׻_zoƷqҴi˧]ǝHŘZÒspŕtɢ׿ÅھdG9aG:~cI;`E9}^C;d\B8n[B8t[A6z[A6Y@4Z@5X>4U91R8.O4(S:0P81N7/O92M:.J4)K60~I3,I2*F.(H0'F1'F1(G4,H6.J81F3-E3-G4,G5.C1-B/)C1,C2-D5/B3-382382.0++)&*,(+**-.**,')'#*,*,-,13201.{22-550<61B;7B<7MD=XH@]K@[I@~`LBbJ?bMBbL?cMAifNB dJBcI>cH; _G< XE<OB:J@:)J@:)C=9"=73/:5/6=54G;3-Z<4,b>4-q>73=72=:6@>\KAiSEsXGuXF}^LdLdKaLbHcJcKdLdMgQfRujUk{jҦf͞qОyΠiΡnɖznnh‹lnÊjrčp\iZgVŠnPċjS‰nH‹g{g|n̜qiI:_F>bF<^C9\B:v[A6tZ?4}Y@8X@8Y>2U=4U<2T:2wS;5yR;2Q8-O71Q82P9/L6.K4+K4,H0*E-'G1&E/(F2,G3*G4-F2,|G5/sE3+wD0+rF70xF3,A.(C1+D40B50A3,?1+?1,,0,,0,)+&'%$++()'#+)'.,+-)).+).,(.-+1/+21,0/-.-+-/+/.+02.12.210341553@:6EA:B<6KA9 C<7 ?;8 :74 ;63:75&;88;98:62"=84'>:6,:61";73&=842=64?=72F=30d=5.|942r<63rB94yPC;eNB|pVH}^NbNcOcObOcIdMeOdNfRfQfSkəyvgzetglnWq`nfk_lKfAgUŽqmmcl{k}čmzx^|lN@{`F=~aE=]@7]E9wZB:Z@7]C8W=4}T;3W>5W<3{T:2|R90zR:0zQ:0Q:.S?6Q=3M7/K3)J6/H1(G1(G1'K7+J61I74H62wD0(oD0(iC0'\C0&\C0)mI92F71C2*A0*@20?1*?4-C83A3.,**,**)'%''#**&)&".-*0/-0,*,)(-*(.,*.,*-)(1/,13/.+*31/0-+2111/,/.*431.-,/.,/,+k41/=210430 10-401 854 842 :5083071,73.96384.71/832,9636:30?:51@:522=74&=42<1+*=62A>95K@<8s=84m>70iO?9nhPGz[QaPcRcNdOdPeQfQeQgQiTiX|bc~cacbdd{`mUkVlZwmXvr[otYv~d}lTz`F:v\E9v`F^G=^G;]D:Y>2ZA4ZB8U?4{VA8yXE>YE9Tp^H:{[D8~_G>y`ME]H>[F<}ZE;WC8YJ>rZGVG>UD9SB8xSB:sO<2yM90zL81}M;4~N=7yI7.sH4+wG3-~D0)~B.&G2*E1*D0(~E4,D7/D81}F<4|A3.?1(3+{<1*|%q%q)'#{))'v,*(x(&#s)'%{+)%s#s+%%x+&#s,)$t,,+w-+(v/,(y.+)o20.j.+'y/*'*$!(#!0-.T.-,1-+K.*'+.+'3+)%T23/42/.,- .)( 22- 1+'831!0+(0/(&+40-2+,88652.821=;7<;65.(853963"862':7604.*493.8=;69AABD@?=9=948>?;ED;8WmTGRsWK`z[Lb]PVbPXcOWeRSgSRfSahPdlUjiTriV{n\tr\{x_crvZqlX]mXvoUmWxmWlmVr_Jn}XG{vRCsQ>vXExtU@ttQ?xqO?tU@5tWA5qUB8wWD;yWG<|SA:N7*Q;2}N;2xM90yN;5~N:2wN:2tJ6-}H6-}F4,|E.%~E0)C/*~D.&zC.&A-%@.(?+#=( =)"<)#>(#z<(#y>*%aA1+Z=.)eB2+j;*#f8&$`:($b189/-.,-.,",)' 210 578 ;<; ;9: >=< ?;6 9/+ >95;21(A;8B96NHFNJEMC=PFAULCSC;XHB ^QJ\LEaQGeTLgTI#iUI*lVL&q[N&qZM.uaR>x`Q3l^,p`3t^1u_4yb:{b4}e4cW~eOd[hPhIgSk\kGjambhSjEnMlVm`ldj`kflxnzltiriyixiukwgimN?znN?~nN>}lI:ymJ:~lK=ykK<kJ:xlJ8ykJ8lK:lK8nkJ;nmK5nN;>sQB=pN@EnM=71>71F=7NB;F8/K;3K<4L>5pUH?2ZJBD\LC|`LDhZNmZS4oXMoYL4wbZv`Uw_P}eZ|bUhW j[ n] sb th pb q` m[ r_ va u_ zg |e {h ~j i n o lq q m l pommq&o-o"qpqsrqrt&r/s9rItDt.v=uEsLuEtFsBt9uEvBuFwGvDvwvxtvxzxyxuw}uqqqpwm|ewas|^zy\xw\u[sYvsU[qUGoXJoSLnREmO@lQ5kO iN%iM2bI'~^G3eI1bG:aFt]EX[E~ZA:zX@2uU@jM9ZhL8SiKBiKBjN4mS!oRWtS|tXuYt[vYv]w[vZhv]1z]Pzd|c}czh`lPmjn p m nn ~k m l k k m n f ~e m j j l o q w u v p o k l j m r n ovt'wÚ|Ĝ~ĝ}Ş}Ƞ~ȠȢ˦˥̥̣!ͤ ̥ͥ ͥ)ˣ3̤E̥Cͦ2ͥ5ˤ8̣=̢9ɡ:ɡm̡s̤ṭqˣwʢqǟqśyĚ{mzmtyql}hf|bv}^z^vv_s[6qWoU.lQ5hO.fJcK_J]G!\E^FzWD(iM<.sU@&oR?)mP;piM:_iL9 dH:@bF7M]D31[B45[A45XA6*YB5 WA2+X@4CT?3?uVFuVFtU0wY,wYGxXzz\{]y]x\w[x`xajxb w`za y] dBi[}iUo o nk i |j n }i }k {j~i |i yi |e }h ye o l j k o n t x u r n o q n q s p tsx xyy š{Ĝ}ŝ~ƞǡɢɣˤˤʤ*̦%ͥͦ˦̧̧̥(̢+ʥ6ˡBˠ9ɢ1ɠsʡoʢqʢv˥qʠpǞrŞpxuwysxpjh|az^{]nqWssWyoUPkS$kRiN bJaF#`K'[G%]H0_H8~[G/xYC>yXC=tUADrS@WmQ=qlO=`fK;kN=gK<%`F9"aF9![B5&W@4(]D5$YC5,T>49R<18xXDxXDvX2yW9sVeyYz[w[xYs\rZsZs\\t]y` u\ r^hgmi h l ~h ~n }k |o ~l l m k m }g |e n }k l ~g }f }g l p q t o k xb |e |d |d l }a k lls s vv | Ɵ~ ş} ƣ Ǥ ˨ ϩ ͩΩЫ"̨ΪϫЭϬ Ω ̧ ͦ ˨˦̨ͥͦoͨsʦ}ͧ|ʦ{Ȥ|›yzxy}twp{fq}aqy[|mQhKfKeN|~_G}]ClP>ulR@aI3^G9}\I9sT?AqSBDtVC:rRA8lO:FkO5 T?1*I5.*K7,'J7,$H6**F5-2F4-GpZJpZJtWKpU^rVyuVpXu]vYsXnVgRjTbdNlTlVs\s^t` }h l g k n |g l p ~j {i k j n m |j |h ~j k {i yf p p s m m t l q r |h }d {f k oqsr p x z ›|z| Ğ ĝ Ǥ ̩ ɣ ʤ̨ ̩ Ϋ ˧ ˨ͩ ʤʤ ˦˦ɥʦȢ Ȣ|ʤ}ȣwʦrʦu¢qĠvvtxqqiih{`fv[guYeqWecKgaGp_Ho{[FpvVDvmR?~kRBdJ:gK=dI:ygK1T>/qQ;4LI606G6.7C3,=B2*:B2,;A1'=F4*7C1)9<.(<>0*:tY`tY`uWotVw[w[uUyrVmSfM}bLkTkQhlT|oTAxlQ?zqT@sdJ:zaG;{]G7kO>w]D;\E6y]D5wW?3}L:0N:0xJ7.ZK9.WP=/UH9-]B3*dH9.hC3-fC3+e1zP;.vJ8-dN<1kS@3uP;1qC2,nK:.qM;0tK8/lC3+ljOqjOqiOzoQmM{fNvhQu}aMw]G}`M}dN|gLlu[J]rWETeNRu]Qx_EnX@t_<{d6v`jW u`)jmZp[ hX5ucO~iozbSeeVwb {cTy_T l[ lY oYG fQF kTHgU|cN kW n r^~knx_wd o fi h e ~c no m u o t v o t y w | {ŝ ĝ ĝ Ơ Þ z Û~Ý œ } | x xUsMs8vKp]tdsjwjtonpkfe~fk{\uqTzuZytWyfNzeMhN{fMfM|]E{sV@~oT@uWE}rU>{}]G}xWC|_D8dM;hM;bK9gK;YC5cJ:vrU<_F4qQ=0v`I8xZC6v\E5yS>1|I8-zJ9,oJ9/mxWnxWnzVyxT~pT}vXtS|dJkPs~_ItpTtbI{nVBwoWFp|_MjoXanUZiRNo\T|f=hUkY r(m"m["fVqYI;dSBgWqkYsp_savbn] j^ {bU w^P v_R dV yj t` we q l zd lX eT yb v` x` w]r\s[jnmvt t w v p u x wvvà| á } | | ~ { Þ~ }{tvv qxSx[tau\xatevlsppSlPh{dgb|ai}`m{]sy_zpW{nTyqWznWjOeM}_G|^F|^Fz~]HwvZC~uYAz[DyZBqT@}gL=lS?lQAgM~iN>fM:~[F6xVB5{R?/{\E7P<3vJ8.mD6*hqVuqVuqSu{cInw]HrgNvrV{nShP~aLkR~aLkR~kS{gP{eMqaLslXls\axcVo\XseK}g9zf5o_1tb.we/mY;iV=vb>q^9s_6xc2{g(|m#}lzkqdgV kX o^~lqkdwa|bjnomiyaeu u n kpvtw}xw Ÿ~ x v | | y { z v w}zq r x t\\_ ii{nvam:m%liHj]iG{[kxYuwYywYrVqVbKgMiSiO~kOzz[GpSAeN=~{`F}bJ}qT?yoT?}nR>jP=z]H}nR>}gO={mSAm]I8~`J:bL:ZE6UE5~WD4zeK9ydL:wdM>o^G6nv_Efv_Efz_Id}cNiy`JrhMy~fIreMolSwgO}iP}tWmZo[~hSyx`KlTG|]P~xdvjyh|m[it`W{ePlMkMrcKzgI~jPqKziJ{gD{k>pb=r^N~XC5cP@yvZFyU?7uN?5vYF5vgO?:iP>r^H8[H:YF8H:3H:1wK<0sE70aM?3gaI:ry_Miy_Mi~dMnpSkvZiuXorTptXpt[ssYzpW~gPy}cL}kUt_u]s]~{hqzdgq~fjw`azg[|k]p`er\O`qfWmWyeVv_RnZMzeUKj\Gr`DxeCiXEm^En[B|eU;tc2j)f"~hijxckXjViSx]|do\wat\u_ipn!k%n+n;lOnOtE{Kx?x z|| {{{Š|v{}w{ |n_2*(4?=HU^iRPS|YxXsKmD}dLu[Wlfhru\vw\wuYzgR}uZqXgRiN}gOgJv[DpYGfP}]KmUB|nUB}jS?v^HuXDfN;]I=~^K=tlU@:hP>dWD9TB5uQ?5tN=3~XE7sYG:iP>3N@4x`LJs[It2s'l otsuuwuwzvw{xyvt!]Wa"ir,35Hz[v_sbu0{\{c8-%koGRcnlgdmgkglorp|dplUrhRwy`x|_{t\scMl|cMpt[svZssXojOs{fNpv^JOaN?>cSB8taLkR|`JzWC9UI=9dNC<~gXBw_LnYGvcPAVNA80YL=GbO?P[K:fVC]J@,K@7~MA8OE;5PzeJGzeJG|hN[v\m~_ww]u^t^qWsYlWmZpXlXwdTvdUn[zgW|iY{q]ut`vygzwdvveqwbsudlscjl^ayfX]wjmxhYrbQueYthU`bWH[k]NYlVxX}q]Z_VM[h\Q\m^YxXuUxbWp_U|jU~mXwgXzgWoX{fQtfMnLmEl?}g9xb7h)sopv{xvv{yx_X^;@OWVb".rEpS|^uLvSyXme*#%d%*5hJYliiigfknlv^m|bp|]ut\t|`ncowapq[tuaJsr`LsgTy}dPvlXK{xcQ\~fP&waK;x_I?w_KQr\HybO{iPXybNigUGl^MAYJ=gVCiWCbN?VG9[J?6E:20)2.*HB7cSCK]M@diYEP~jOM~jOMnQnuT~mSo`HrbMmZcnWkVpXvdN|hSpZ}mWxanqo}ixczvhT}ra~{gpwfnwjexhb|m]qWuRyN}kQzfYxeYm\}l\vhZ]sgV^p\rXtW{V~[|]s^t\xk\{YXyYuWyR}QOzOmQxIsiLnS{fiSCf d07BdfzdbfojkjlVns[j~csdzbvfygw{bt}bsx]ys\yr\tjSxv]BkVxcO|fQ/v`N4zePkS6}fS?x`PW~hSVm]KcpaP{jWHdWEtaJr]KdWHgfYGAeVFaSD `QA^QA4bRGJwfKjwfKj~hPymS~sUxXrWoXnV|hTxeQ}hUzjUxhU|l\}jX}esap`ta|i|{g{}jy{izt`kxh_|m]}iaqWxTvRuOtgK|iN{QweV{mXZxe_v]p[sb_ugbxk]~n_|h[mZs[qY~YZvYrWsV|dUr_RyhKpDk92!B=5>94'mLmLvfJucNnTxePraOe[I`XGm^PwfUziSxjSxhXn`q]zg|kn|iW|fSzdP{cp^q_|yj(sd{h{gŁscχweъyjя{m΢ͥ~Ҧ˕sɊ{jŀq`u[}k]v^xZ{o[Xo`TyfSwjToRrWrVoUsS{RwT|hQ{fLj@|d;{d4p2o1zf-vb+zf*zh*o*s1mSrX}j5u`(i\M$&%+>@J:BKJP^W^mDKY6>I ()3efwahYT,815,DU_TgsN`nZj{‹ȣϏxdh͔mNJva{jUo`Rg]LpcPwgQp[vc}jX|fWjXLbVEn^Jr`KgYIk]LnTkT5weQ.zjR4pXq_LcVFRI>ZRAND;973WPCn\LhYJWKA`UDj[HvjRvjRsfQsfPufQ~kTńrY͐{]͈w\whRyhVwjXtfUrdRwhXm`l[veijrpnmspF}h:o:y9ozlugsgHshyl}s{n^~p]Çzhrg\te]Ȅuiwe~orkkq{ktvrIl>|f9s`7nomtcwgxo^tj\{o]Ɍ}i̛s͡rƒpǂtcyo^xfrNE;",,3$%89D7;C /2:KRaʔΖyx:y302 ʈܪݗqw_pdUndTq_wcs_kXr\lX~jTmVwdPraNs`O~jT}jV{hQp^KgVJk[Jo]KxfQxeRt`NbSHfWIcaQGURI@TPJ;PWK?SH<`TF|PG?D@9qY7qY7pZ8pYnVu\q\}mY|kX~pZrfVvjZzl^xjWxiV~lZ|dzcubprj{k|oavgjxiprzky{<p9se.sd.uc.sPmylZyl[݈yg߂qcra嘅rotdxhyeovvmnnrbtf~g~gm=r1y0z2xvqܘpߕkߣr৐y䨑x吂j   !% -07>BL[cv{襮ꝧ飯醖鎞歶l`oUpTOzgUMxchva|oWXrYoZmXsWƀmUsbUm_SvfWvePrcO{nZąnU~eQq^Mp\LjYKaRFXLA]RCVPC[SC^SFZNBNE:LD=H@9J;91EkPkPkSrYoXpYxyb@s^1~nV.}lT.dYHn`PtgVziW܃r_|k|j|k摀i暇s藁p藅o文v菃r{j{j|l~pdthvfp閄uꙈt~myh~kyjudtebpbvTugPwiLrKsup璅u睍}瘅w|mteve闄q預z頌v}g{eꚄm阃lydsc{n[vb旇svenWvSxOtMi[L |    "$,'(03=O~ƧȤġɻºtoig`PscOqWzaJya;nX9}kV8~iX6sbSgYN^SHk]Mxi[IdXHnbSn]{hVyhWp^OgYGbXHo_K|kRp[zfUo]Nq^Mi[G]PCHA:ZQ>{kO{kO|kRpUrTqWt^tZt[tYvhPtfU}o\xcgziU{fPu`MwhZIyjZvd}m|q|{kxjzjwd€rgǍq͎s̈xkNj{mvdr`†{j|sdsj]wm^rhZxm_whs}op}o}jzj~wjKsCw;nu’pēoĜtɚt΍|nȆucŎ~nyira…vgzm|mprvxwvql~jLF>FF;556 $),5 &=EPcouěǝș{|lyiraqdR^VFi]MteR;zhS9m^L/]TD,_VG.eZN.aZNi_PpaTyjW|kYmaSh]R_WH^SF[QD[SEZPFVOGPM?SK?{jW{jW}nV`zkTH|kV{lU~p\q\taIwlZr]wcve}qbƂraƀtb{m]|p]zo^…wew‡}mtdzksuswkscuiugwm]oeWGiaTF\XM=\WF:mdU7wj6s5p{kv,z zixgveyk~mxj |jjp~houxw~m{sbxhuţyzwtq}n~tdvdpq{iaT   h '@)079)*/1"$',/3<+6;H,GJ\Z^sbfwqu߃ⓘ㚞旝䗚䒖ꠡ皞蚠裧鞣雟룦蚙鎍ꉇ{tzq}nzjunbkdSjbRf\M`qgQbyfRYi[MTn`OQn_OLh_MIndTreV\XOMPE``[Li_OmbUzjWzjW}oZhznY_vlXUvjVRwgROmXKvbGynt|ozn{oxm{qbyo`te{hrHvro{n|mzkwkqdƈvjɈxb͇weɁufyl^}pb|ra~qd~oaviugsfrhte{ixh{j|hlziucvhLteCvf;|o?@KFIZdh{|rwrwy| llآ讳䪭륧헙ԕ蒔ꗔ蒏z{ztuolibWYP`[Qf\N_WIKI?AC6UN@`VIvfTvfTwiUpeSsfVyjVxcJxbLo\Mp_R{hZ~payoftetf}qeuesdtrfZevh[_vmV~pTwfNxm]Jsk_Gynczn`}la~obsgZwk\~ra~qfvkymHug~ocl^rc}paI|mapgqamrc~nc{nh|oixh^vfnxeuh~titm`~se{qarl[wmb|pcn,o`psuuvp`~nr{kzkwj~xkge=C? #    $#,0<69F?HU@KV27=&$,*,4AALKMXsy@ms7ir1nr~1./,`8  llËwzzvwtrfTrfTlaQ`seTviUjcSg`OkaQtiY qeWlwgXlylZ}|o`tbˀp\}m[xhVyk[z~oawk\tgY}oc}pd|sc~rdwi~rgzqfxiwf{lꒃr|lxiczl]^yiZUaTNRZQTOe^bJjciHfah`W]bYaWT` 65A;6?NKSWOSqd^{n^ vl\Hxobsm^{pbsk^sl^Ixocsl`tn]Wwn^Yvl`pzkÊ|kxmTyoI}ukDaXOHk.1:I34;V56@:AM//7#I" '  X a \ \ \  X Y((.    #%+I*)3E&%.;&%+7..39>>D83083,).432:10<45?,:;F 48G48IW_nOXi[fyPXi IQ`S^q\g|GRdan~bjSXjEL\MUaEV_qR`hzDdm}J`hzJwmZwmZxnY`vlVznZyoZujZ}paxdtcvdvdEwn]G|o_FsbIxfFykGwfEvm^Fufc6:0ZQ.'-5,0.'*! %('(.-4I&&,;)'-6p_\0_\R. 3@:@0MPV+119/55;`54;8**0 &+(-C@J?=F D@G44< !!*WLM|pf{p{~ ~lzlvxhf_13:PQY~}vzu`lvyPZ`# GF        H    I   T [ X  X Y XTSn&$(g-+1"$'!&(./08U9=E/24F>>=D=>AIDADDWKGIq[PW`UKUU %!'"$!!&&$+(&*$"',(.96=88?JFKC[Xc`UVa "&    l     a  ^  \ S R  N L  K  F        H ''."I  SXYYVWSY!")h !(kk ()*438AEISCES27D5?C9ECOed\SoQ}q~tst{n\WN  >89+ 0 2 . /  ( 8   }  } z t r s    c ] W P QN H GD  !  H*+0%&* &I $(,5T+0:X6/74'.+#"(%! `          B  G CE  F E  C C 0 5 1  0 , - 8   #   l lvz  z  x  r  g  j o q        \lf`glf`glgZmjeWmcbWfc[cbVcaXhe[je\ng]jcWe^QZVJYQH[RFbWOC\_SIWrf^TzpjN}qjI}xsGxtrGvqnD{tnCxrmzso{wq{vmvrloli{un$wmytkwql}toH|uxvkZa\W^[U^[I]d`djehnfQfkcXejdVageS_dcQ_e^NedbNpkjSwrmP~zu^yzuczywh~||}}xyyxxvu|urrlk\ZYIHE@=:544 2 1  ,  $         R        8 < 6 1 33/- ( .` 8     $        l  l  r  z  x w gXXbXXbba\`hgZbcZabYcd\fdZff^ fe[lfd\lif]odb\vje\vsj_rph_ftl`eph\emcVkqe[nia[psjcvngvmi|ulxrlztmsrozwr{zt~ydwwr]zuq[|uU|wpPtqmMxupIzvoFvwqGdofBkqmBuwqqvmntlqts tuplsjlri%rrmprkikh omhHxrm|uk|un|wqzvoI~wpupkhcaQb]\Vb\VVOIHSD>;K=50K:2.L/("TQSf c p *14 E  @< 8  8  3 2  3  1  2  @ G C A  E E @ F  DLSQ     8 9  5  3  3  -  ,  , , +   8    %Z]i3Z]i3UZ\0LOK1TWU*[]X*_]X,fb[*lh]-jh]jf_8ie\khapkbuldsne&rmfrngtqjytlwtkppkrqjvumppj opjlvvol|yvr{ytvxs{{qhovndvwpc~ydz`{j{rzzqxvv{wx}zv~wy}w|~xzzwoumamqm\tsoYzyrRxyrNqslKtroHvtnHurjGzqCxq@}tj|pglfZ]VL`TKDRHAQG>&E=7@94<64`622H "*)/3I 5BFOgqUoXepqSP JJ J O  S  ddd        %         C G G  C  @ >  B I E  D  O L Z      5  7UXeBUXeBMRYF89;FKCFG]QTOdXYMjb`Qje`oj`pnh҄s~~}kic:uoi8ztj4yqk.ytp/zun0{s'{xq.|v,w,{{t,~zv |y8}{u{{w}{w|zx'{~yz~{~yv{st{ux~yw}{ xxl{|l{}Uqv|uumtndhmlcqrpdqrn_zwr>}qE{umr}wowsjojesmftnhtla{ocwh]peXjaTbaXOZZSIUNHCRTOQP=::HF &&G(-/F"$#B"! A"$;BIBP[q|snw'  H  I I X U K B @8 7  6  0 64  1  0  ,    &         D  E  C  A @SOXSOX[]e`a^Z\UKaVQe]Wlf\pjaSNMPIR{u>Cb^bCihfGF9BA]6==]275W(-.Q#('M"GIC F ?A("!##" AV_be     F ? =;9  0  2 5  3  5  4  ,`  '\`a:\`a:\ch7_`]1idY7icZ0ng\7a]S1:;;7%'*HBK,]YZGBLkaduph(ytq|u|tzuzw|yz~|yzyrz~~|.}}y7}}z@yyvB}|{B<}9}}-}}2{~{>mlpF~LLU~nz~xqx|umvwu^uvq7rsq8psp3uts0uvt/ntq(run4vur'{xt1}u*v3t|u8xwnwtnvtoyzvy)z~~wvyr`ywr|zuinlWb_P]YM]X M\UlKYWlI[X1P`]-KZZ2JWREDPOQ>HE?=GB;?IE=;EA9086e#*'`^YVS O(&J -*E    I1;KMJ  E  = 3 7 G  X a  d  j x  @ Ccjf8cjf8X]^:ic[6gaV4\TRN\TRcEA@d79;f;=>325SLRVUV~KILF_XXEogg>zvpA}t@{v9|v6z7x1~|:|-~~w2z{u{{~~z,{|x}|x~}w}{)y{xyvvutqvurvvr:67rrwy}+svw+akg0gmj:kpn=jrm8fpj8dnj6irn4rvq2yxqBrvpOosoMwwtQ}zwv}}rnwl}xc~}u:}{>28721qxv3jvs'aok6[nh(]pn-evo`so8WnkWnkVkhRecM``*KZXGTRDRQCSSETQETQBML;EC2<8 )2.l"('l"..1/4878:=>#!%$*'"    ) H     I   / /  1  A D263263?>=`^TLHRIEPJFSNLYSQXSQIKHGDABLLM,WWT+fec/rnk.vpl3wtk4zws3}{u3|t5{6~v7}{vad}g{~zm{r|yvD}|{GGzE~yF~xB~wo;tne3:741ddr8/u*t{~sz,imv xejk*ipmiqmnvr ksmimmosppvnputsxwz|x~|wyxw*}}{*{,,0~2.22z2x0fuvPizyPq}Qo~cg{|bg{{Ueyw[`ts6Xol=Shh>Qfc;Oc`>Mb^:I[[4H]Z-I\X*FVX1CVU*GYV%FVT @QN8?PM6S MGE D<8`  *3..N3..NOKFE^YSCaZS=haUHF*2=:='10G ('P#!S VcUJE=? =-*!/. +75.<9(:71A<BKH UXRl^^Wlb`Y,[ZS2POG(QPH.1//4SUTYSUTYX[USkg`oibnkcljagh`dea ghdlgidloni)pqm*pqm$rtq-wup5xur?{wrAssoMlpnXpqnesrqqsqmomlspopokOQT>CB85:zU^^dkq~~~v||Vb]u088lGBJgPKK!,'. ~yOKLPJL-F@CB=@JFK QMOH^[Zpkjrts}I|(*!.7;;C~HT}[hzzlk||yz~n}~duwfwtjzwm|zYrqQmkYst|`yys[vuoYqrkVrp^Xsr]ZwvU[xvM\vvKYtwXqsUln,WpnUmlUmkXnm-XnjWlgXliQebM]ZL]YESR?LH9F@7B>)20"!*( ,868=B'%;)(<+(B!0,:"0-9,833:785<;[XN_\Rb^W-LXR_LXR_S[Wjfd]lfe`ldd^mijb@ije9ijc9gicklj8llkmmjppputotqo.nokoojpomtqpsqpsrmyuqvum{xp \ZVl&%'l;<@L?AC`QJSoy}{{X[_ikslls[`\E@@)(*KDMdbfPORDAEGBI[UXmhewspi}}i]YS삊`.{`uHvzvqs~Il}j{|arq>]ooL\qqYRlkeOhjnQihqYrruYtt~\vu\xx]zz^zw\wuXuuWstVsv[vu]zx^}{\zv\vqYsoXpnsYmjhWli]RgdMQebMOb^DOb^BQa\?IXViSPGkMZTMZTJXT`SZWZ]ZX\[^a][`\`b\fgdtjjdujjfunkhvjjkxspluzvlpvtmdyuq[wsrOtqnGson2@=1<9x-82y+4-*2-*3,}*1,y1=6SdXXf_5@>(0/$*& !I5/G4,G3*H3+H4/F3/F2+D0(C3-D2.C1+B2-@0,A4.A73=2-8*%7)"WhJ99gK9IS?3DP<1JB2)[>1)A:-)YE4-_A4,rD4-tC4+q[E5mL:2pM<0i@7-lOD7X81,Fr^IDaPEJ=94XhXGTG=B?6:p]KHC;c]Pj]Nokinxfm|EDK[:AMI13>S [ f  7 =  <  ; N10,+^XOeIEA]"&%/  "$%'(*+-.0235689;<>@ACDFGIJLMOQRTUWXZ[]_____ _ _ _____________!_"_$_&_'_)_*_,_._/_1_2_4_6_7_9_:_<_=_?_A_B_D_E_G`I`J`L`M`O`Q`R`T`U`W`Y`Z`\`]`_```b`d`e`g`h`j`l`m`o`p`r`t`u`w`x`z`{`}```_^\[YWVTSQPNMKIHFECB@?=<:875421/.,*)'&$#!  ~|zywvtrqonlkigfdca_^\[YWVTSQONLKIHFDCA@><;9864310.-+)(&%#!    gdalautotest-3.0.4/gdrivers/data/geos_vrtwarp.tif0000644003401500001440000014301413614004466021623 0ustar rouaultusersII*`*`*=BCDyEyS؅ 8. 0EKT3 Rj1EE@Nb_*O,87a [? ""B##*,@--j../48{9=?@"AALBBvC DILJN&OOPPPzQRR9SSX[[.\\X]]^__A`3cseff2gg\hhijjl}pqqӚhǟ>ӧڴuAyMwв&P@Tв&P@ϓT? L#    ,T )#@TXAr@unnamed|GCS Name = unknown|Datum = unnamed|Ellipsoid = Spheroid|Primem = Greenwich||ESRI PE String = PROJCS["unnamed",GEOGCS["unknown",DATUM["unnamed",SPHEROID["Spheroid",6378137,298.2572221]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Geostationary_Satellite"],PARAMETER["central_meridian",-75],PARAMETER["satellite_height",35786023],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=geos +lon_0=-75 +h=35786023 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs +sweep=x"]]|x1 Oa nx1 Oa nxձqd9E@&6M8|l?<x~_a?<x?<x?<x?<x?<x?<x?<x   WXa?<[~~~X~~~X~a?aX_?+~~X~~~X _x~~X~~~X _y/oo/ؿ?`~~X~~Kσ a  />/77<ؿ?߰_߰? z}7ؿ?߰_߰? /믰_a`aX |/o/?aa?a /믰a_ |~/> z~/>a  7/o/?_߰_``aX3_ |~/>߻a_ |~o /7ؿ߰߰`~~XaϞ_ `aX_ `?a ?7 a /7/o¾ /7ؿ߰_``aX _o?aaXE~|}_7_o?aaX~ _ /7/oo?aaX a 7xKnd7&8!Kɥq׃6nHhSUq6J?~H$I$I$I$I$I$I$I$I$I$I$I||||+l>~>>?p?lr';loW~ _=~ȿ= _a__aw~e?l7?p?~}/_aܿlGgǾGg/a _a_{p0?p?le;l~~a+loa7/?l=w<=px7o_p~~a5x?<x?</?p?l~ 7o<?e?d~~a7ܿlix_p~~a7ܿlX /?p?l~w 7ܿl?l~_?p~~ 7?p^ 7?p+_{ /{׾ /{?p~ /_ao}/p}þ_7?p}/p}þ7?p>o>x?7?p /p}_|$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I>/W)xձ V#֠6G rjJ1z_[?쿶sڿW_Kk+^ڿ,_}._|3E7_N?m^/_KZ?/_KcmisiX{i\?-.kOۿ_kO/?wqKo]׮aiQi߼cmn-kw?-kw?-kZcmnkkW_cmnkOO/|z޿w/xmx/x&xQ0̰,J#e+6X,i%Kt_ˊex:^xn/K 9nB'rIw z =l):\|:c)W=`3?j #lTIͷo-ܯPUJ+~ppZ_[~+~O[|pKz{V[|pnGn~C_~W‡qC?/_ys~_gg{?k~{?x? k/=ܿx?W+z׮/]3+WT/|G<ٯtW_tG|_~ + .=} x_~ +o[=g@P\?_Tx@PTx@PTx@PTx@PTxW_/*< J[_~ +@0;dVG0 `^W#?rMpp%BW= H[?W@p=o(NxAncG9G#ԲN% cqMaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`a?a`?o_`? C'   soOa?`a?a`z _`9@>{7 ||||||||||ooooo/o?>@>~ |g  7777o   uoO a`?aaS[xo777ؿ /ؿ ߰?_߰`/v``?aaO=~O]; W}w__>oo?_?_߰`'1~h~_a``?``c_ ``?```/~xp__?__?|aa}<<<+77ؿuxxxxxxxxxxxxxxxxxxxxxxxxxxxC C C =<<x_?__?__߰`:x_?__? =x_?__? 1 C zaa`?```?^߽@aa~h~_ ߰߰?__߰`  Coaa~h~?_ ߰_?_aa~h~~/"xֱ9EA>M( a1tANoлOq~<8o܏8S︿Oo/'wܟ߸;q7?uOlN<; pN<8'O'x?_q'?u+?qW_q;OݿOqW''xpN<8'UOqxqwOܟ߸;_q' w''M'OݿoqW'߿߸;_q'gwOܟ߸+O~'qw_q;x߸;O <ho?qW'|7?u+?q?O&߸+Oܟ߸O7?u+?qo_x1 Oa nx1 Oa nx1 Oa nxձhE E?r0Kp).ͥD/;ȿ~^z^z^z^z^z^z^z^z^z^z/Z`?/7g/>_'~b_/ Z?/~a?_/Z`?_o~a?_~bؿOk~b~c~b?_/ Z`?/7k~b^?/7~c?_'~`b~c?' Z`b?_o~c?' Z`?/7k~a?_/Z`?/~a?---?ؿO~`b?~c_' Z`?o~a?__' Z`?/7~~x~x~x~?~c_x~x~x~Z`?/7k~b~c?_' Z?/7k~b~c?_' Z`b?_o~a?_/`ؿO~`b?_o~a?_/`ؿO~`b?_o~a?_/|_/`ؿO~`b?_o~a?~a?_/`ؿO`ؿO~`b?_~`b?_o~}o~a?_~a?_/?_/`/`ؿϏ`ؿO`ؿOqؿOؿOؿOؿOؿOؿOqؿO`ؿϏ`ؿ`>/`/?_/~a?_럏~a?~}oqb?_o~`b?_~|ܿOqؿϏ`/q?_~a?q?_o~`b??ؿO`>/q?_럏~}oK-kx֡X1% BS21=`! y[???=3mk#qwܿqg_q_qOܿm{mw?q/'Wq?;߸3폸?'߸3폸?'߸3폸?'߸3폸?'߸3qwܿq/ϸ7Wq?;~8'߸3qw?q/'߶3x?kx1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xֱ8 E-]P@:3X}OrO]3Wo~c7 ~c_o7/|A``7 ~c_ؿo7 ~aa??/?7Ghc`o~c_o7 ~ab?_?/_7G ~aba hc`//G 0x ~ab?_/_?70_o hc`/o/~co/G ~aba.c`/o/~c.|?_?ؿo7 ~abahpp/o~c/o/~c_ؿo ~aba?_/_?7G ~aa?_?/_7G 8x8x8xO~aba?_?/?7G hc`/o~c_ؿo7 _8x8x8xh~abas8x8x8x/o/~c_ؿo7 ~aba?_?/_?7G RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ7YxԱm@QANiB O.n}  8x<xG   /'7?_?O/o_߰?`ah?`?a`a`~~~~ G    G   /'7?ߏG   /'7 G    G  q~~~~_߰?`ah?`?a`a`}_?O/o /' G  ~~~~_߰?`a'7?_ؿ  ~~~~_߰?`a'7?ߏG  ~~~~_/ u?`?a`a`}_?O/~~~_߰?/qh?`?a`a>?_?Ϗ ~~~~_ _߰?`?' u?`?a`??_ؿ  q~|O/o؟~~~|Cx1 Oa nx1PD0H@ Ґ!M'!So?C/O_ O??#?-?%_) So?C'/OO_ O??#? G/?%_ K7c!o?C'/OO_ O??#?-/?%_i) 7c!o?C'/OO_ ??#? ?[_ cSo?C'/O_ ??? ?_) 7cSo?'/OO_ O??? /?_ 7co?'/O_ ??? /?_ 7co?'/O_ ? ?_Cx1 ")HC~0U:Ǭpy/ܯl4p;?7~ey+i޿ w3_n? __#ܟ w o+ WO__g woG WO׼_gwۼG WOWgwۼG WO׼_g wo WO__hޟ w o+l_O __#ܟji޿ w3_;?m~py'ܿ/ܯ~+ZVxu|x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xͱ 0(] Q/޷&>c W7/_ W7?_ %/7_?! o_???KS_o? k/G/_) /_???KC'_?+O_) /_??k/W7??KC'[??KG'W7_???kO/) o -_C' %/_? -_C') o[??#O_C')K_o?W7_?+G/? #_KGO/#C'!S_?) o?%/W_W7_?+[_??+[??+G???+G???+G???+[??+[_??[_W_W%o?)K_!S#C/GO_k-G??+[yyyyyyyyyyyyyyyyyFxAm@!@IGROƖ@~w?WGO?;_w??+/W_37g_o+xAPD!8")_lgӯ |i_i_i_i_~iKgiog?4o3??e?k//?mҿ6_?Wa_K10_Kg?4_?k?mǯO~_/io/?~K2_ǯO~_K1_/o~?k?/_?y//~/?~?mW//~/_?/_?+io~?/_ҿK1_~?/_W/_o~?/_O~_ҿ_/?~?K/_~K/_+/_7~KW/_/_O~_ҿKo/?~?K_?~K_7~ǯ_'_ҿKo/?~KoWo'/~Ko/?~K_[ǯO~_Ko/?~?[o7~[o~?~~?[o~?tx1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xͱ0 /P@:p i`f17' ;;? _+ oGI+_OO_ ?/ٿ_/ oѿI+_GW'G'O?W 'O?W'ǟ+_G_/ ?Go? ?w?_GGǟ+_7w;?_+;/_G_ ?GGI?G???G?oG7?_??ٿG7?_ ??o/_G?/GGgG?_?_G??o/_G???/ǟG???/G?o/G_G?ǟ?_?GG?oG??_?/G??G?G??_Xx1`! HAYwN1kg?o??W_oW_OW~W__???__???~~?s/_o?~/_~c//O_/c?~_~?ok~?~~?~?//~~ߟ?G?~_/W~~~?O ~~~s~ UXx1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xͱ!0~Q %0 Vj@_/W_?_~W_/W~~W_/?o_~~?W_?_???~~~_~~?~~~??/ߟ?~~7_O_~7__/~~~~?~_~~?~?_c~~~~~~_~~?~~~~?_OC~??o?K~~?~K~?G~~+~~7~~_/u~__'x1 0x H@ Ґޚh'T~~'~~~G~l~~_~~?w~~~~~~~~~~~~~~?~~~~`~~#~?~Q~g~??~~?_~~?~?~?~~~OG%~~__K~?~?~_7OEؿ~~~~~~?~?~~~/^x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xAD!DA# )HȁH(.|>|>Y~|>G|>;|>|>|>|>|>|>|>o>|>|>|>|>|>|>|>|>|>|>|>Z|>|>|>ߟ|>|>|>~|>C~|>|>Ϗ g|>|>?O>q|>w>c|>|>|>|>O>GC|>+~| |~|>ş|>>;_/3ccSccccccǚ@xֱm!A!%|)F\u60I5|~|~|>?/>'Ϗc111?bbo__>bo__>b'_>?o>?/>؟|~|~|~п|~AAAAAIAAǯ7'|~|~пjW_>??~ͯ'nA_o~w__~AͯڟjI˯?~W_O~?W_jͯڟjǯ/W_/~ԟjǯ/QͯڟjW_jW_O~nˏ?Wǯ?o~Q__~Gͯ?O~?YW?~QWڿW?O~?YW?~G/QGů'?~QGï7?/~ԟ?YW?~QgǏ?~?Gɏ?_~QGŏ??~ԿG͏'?v?xÍax1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xX7@TJrA~Nc{#|?7ǯ/#1|~̟|>?>? |_/Ϗ/7Ϗ|?>|>?_>?|~|>/|~b|>?>b|~bAA>/?|~|~_|~Пj9W_/>?O~?˯7_|~Пj__~?_/~??W?>ؿ|~?jů'??jï7_aAǯڿj?7?+ͯ?O~?I|~ȿW_O~s7>ǯ/?R_?~Կj_O~fGW>_/~ԟKkÏ_/~ԟY ~|>QOQ͏'W?o~_j'ڿQW?QW?O~W?o~_?QǏ/?~jGO??~ԿQGɏ?~QGŏG՟/`&xձPP)R(Jh5Zy ^ڗc_}_/ӾZK/Ǿo_/ӾZK/}_/ӾZڗc_}_i_}ڗ۾/Rٗ þ?RKm_}~ڗa_}pK/ ?R?Kg_}?pK/OR?kk_}pKӾZڗ۾/R/}pK/ ?R?~׾~g_'Zڗ۾/Ka__R~ۗ}p?kk_o_i_?Rؗ ?R?~}pK}pؗ ˾p?~}p/?R/ ?p?k Ǿo_pٗ _R~ϾOtK}~׾p/?pKO}~}p }p~'Z ?p?k 7/~׾p _?p~ӾpOt ?p?p?~ 7/~o_pA/p _?p~?p~'pOt ?p?p?~+7/~Wo_pAO/p C_?p~'?p~'bOt ?p?p?~ 7/~Wo_pAp _?p~?p~'pOt ?p?[p?~7x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xױ EANit  ؍^b Wvoxwxgx__??z; Wvoswxgx+7;3??_ n ~e_sOxWx6Gx/+?#_޿ܟޯk Wvoswxgs+;??_  ~_xOx7WxGs/'+?#_ܿޟܯSrxױm0 Q8H!"E nox 9яG?o~__??G[__?/_IG'o}}QGO_?Q__W_??QG~ԿQ~K??~/~oV/}}G~o~'~XGbO?_?p[?/_lo}}f~G?oaO_?p[?/_I~?G7o~'/֏ /Qܿp~_pӏ?Q ~pяoQb_?p [?/_lG ~?7o~/ W/}pvQA~} ܯ7_\ ~/>o~G~#oas?pb_?a pяopbW?p+~p aw?` gG_?؁7?33333333333333333333333333333333333333333333333333333333333333333333Rxͱ !0!%l)F ti_?.Wh_WU?W'37)w_,G-W?_/UW7)w_  _.W?h_Og?+oSG-]?_/U?oSY]?_/U?oSG-W?h_O*g )w_ _?/ Y]?_W*g )w_#?+?oS,G _/ 'Y-W?H+O3]?h_+O sIx1DQPޡDR"H19s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9sz쯸?߰_~PNJp8G+7엸`?KO )??qa`'쯸?߰_~PGo/Oq~ -'?q?h`쇺?~~Wo/q?a~ -'?q?h`a쯸?߰_~[/O~ C?_qa`?aA #7'?q?h`a'/쏸߰_ ?~~~P[/O~~ O_o/Oq~  C?_oq`?a~  )??_qa`?a~  )??_qa`?a~   O?_oq`?a~  C?_o/O~~~ [/O~~~ 쇺?߰_`?/7'?u`a`a`?a~   O_o/O~~~ /7째`?h`a`a`?a~   S?߰_`?h`aA   Wo/O?߰_`?h`aA    ퟸ?߰_`?h`a`a`?a~~~~A'/7'??_o/Os?gc$x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\x1 a n\xױF D)E4@08`h q w{>2~ a?_s`?a>?sa`ai)֟?os`?|/Os?}k70g/쏹߰_~{_os`?}yg/쏹߰k췹_~bo>짹/o`13os`?}yko쇹/?sa2k|k4쯹?~~<?ؗϷ `뷹_~5/Os?`_m'쇹/?saws a_sa`?}yk췹_X1Oؗ~ a_sa`?}yk7엹X`6 럹?~~~o/s?a?`_ e'?_s`a}yk7엹/o`2/쏹߰_~~1 럹?~~~b5Oؗ?~~~b3/Os_~~ Oo_췹_~~X6 /쏹߰Ϸ~~~>럹?~~~6 Hi1܏磾X`|Os_?~~~~b5o/OI`a|>ꇹ/ ~~6 ?߰_~¾3/?د?췹_/?sa`a`?} i_د~|kaX|ga`?|/}   /7엹~~ b~>'_o/Oؗ?߰_/o`a`a`?a?`_~~~~}y   b3 k7'/O/7짹/?_o/O쯹?߰_/?_o/Os?`_?߰_/?_sa`?a?`_?߰_/?_s`a`?a?`_?߰_/?_sa`?a?`_?߰_/?_o/O럹?߰_/?_o/O/7' g/7' /x1 Oa nx1 Oa nxձP Q ?T *Et۩`iEF||/7?/O?_o_?߰``?a?h`a`a~~~~ A   '/7?O?_o_?߰``?a?h`a`a~~~~ A    '/7?/O` x0<'`0<A  '/7?/O?_o_?߰``?a?h`aa~~~~ ` x0<~~ A    '/7?O?_o/O?_o/O?__߰``?a?h`aa~~~~=P x0~i`_?o// ?>k_?o/7b/~ib`~i`ca/??o/t_/k~cc``~տ7Kg?o// 5b_/_77K `ca,<|o//~i`c``~ӿo/mXx `````~/_ ~ca?o//`    ```?o77K~ca?o/7Xm~cc_/_ ?o77K/P~ib_z?/_7_z `c``>_7K _~i~ca?/_7'~ib~ca?/_ }?o//~ca @?/_7K/?A?75(<(7?q+O|~qwܿwܿjwܿ7?q+O?q;'i'?q>Y?mOܿjo'ioW~Wܟ'q?m'qχퟸW|pw_q;_q;qw︿wܿwܿj'q?~_q;_q;qw︿xxwܿwܿwܿiOܿj1OR/l۶m۶m۶m۶m۶m۶m۶m۶m۶m۶}W~~b?Oka>>S}?o~}?_χ~Xab`/'~a?>~_>~/o>?ٿ?a~}?_~Xab`//~b?S>O-֧`~Xab`/'~a?ؿ?c?_~/p?ؿ?a~c?ؿ?7a~a?ؿ?a~a?ؿ7 `_O/~Z^/~Xab`_O/~Xa`/i__`?~c?ؿ?oa~cؿ?oa~cؿ?a~cؿ?oa~c?ؿ7 i}}~?/'~a??ok`_`_?_7 i=<Ϗ `?`?_`_?_`_?_`_?_p//~Xa`O~b??/'~Zb`_?_exxA|>??/_Xh??o'cOo`״|~Z n??of~aoXN`_? i_g}<~Z+7X_~Xa`_O7a~a??/~~ao~Xb`_ ?/_~b??_7 a~a??/>'~Z///B~UO/~XbO/~XbO/ _i}2 < tU?ox~x~x~o`?o~Xb`_iֿt~A~Xb`ط|`/m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m;%+Xqxӱq!@J4J {Gv 6Hϯ˿q'3w_q߸OqGO?qgm7/︿q'3+ϸ?o;?hoܿq|y~~#oopx1 Oa nx1 Oa nx1 Oa nxҡ ]BJqi_GʒcG_+qs,`X<x,`X<x,`X<x,`X<x,`aOܿW3?qg__{_Wxۍ1c~tC#t@]vv T_%=]$I$I$I7/ O~op _ p'wܧ>? p?~ #7cp} ܟp~/ݟpw/ o_wx?~ ;op p~7^_p_wt'/2w<7w_/|{ ;?~ /~kݟpw' `w_4_3@Dx_pO'/`~O~;?~ ;@x <@x <@xp?tC'/?~? <{p7< O_pS7|N_ 'C'/|Z_|w?~37<sO_C'/p~{;ݟpg%C'/Т \p?t} O_p/pi ~7 \/G`} ߼;ߺ[7 ܿ~7;ܿzwݟp+Wp_+~ _z _x7hsC'op/|@#L;x?~ >w/@| >_$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IHwxKn0KhХdi^zE$~H㟜.I# o@7P Tx*ހ?p?ހ o@7on~p=ܯ{w'6Kgk[_p%gA=_yp;ugI>giFy|o|_0[?!~ӯtg_o-ܟ| Ͻp8ҟp5|? o/p? o/p? owL8o_WCxBKx?r.[?pǍorCp?@G [?bfvg_~ ;~!:#=/~)ӯt_} +qka0&* / * /`FET&jt#LDsa͖Crj{,?}jpJpbP/2cP]AUvxױm1D,+JQ C$8{ |`Ăܺr>|)SΧ/ojH+43WjL43Hٿ'HٟIٿ'f&f$L??U_|?ia>qNaf%W=5K%xEBS( AC ~6Wzۃ؜qG|Gm]ۿwmG_qmGW_ߵ;?ql}'m?__qmg_qmGow϶qmg_m]ۿqmGm]ۿmwmkw_6ߵy ޟqmkO?_x{:_<_<_<_<o?kG/xѿ︿wmj~o?kkw_ۿkg/kWm^Y?mY_ۿgmhW?u϶,?^+WgulO_W_KKgi]?,kG?si^ߵ_KY.] 2txm+GEC: aPxcƧDJIkWLۿWO|?'>O|?'>O|?'>O|?'>O|wigqϸ;qiw?jiW?j?:wϸ;qiW?jiW?j3?mg_m1mG_mOqϸkWLۿ^_q?noy}/􏸿jy}?qiW?jz}?qig?j{}?qǴ+qϸ[_Wq?niW?;qϸտqfI?m1mj;q'gmOdO?~=ן#yxw~?mO> endobj 8 0 obj << /Bounds [ 0 1 0 0 1 0 1 1 ] /GCS 9 0 R /GPTS [ 49 2 48 2 48 3 49 3 ] /LPTS [ 0 1 0 0 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 9 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 3 0 obj << /Annots 6 0 R /Contents 4 0 R /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 5 0 R /Type /Page /UserUnit 1 /VP [ 7 0 R ] >> endobj 10 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 11 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 11 0 obj 228 endobj 4 0 obj << /Length 0 >> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx endobj 12 0 obj 33 endobj 5 0 obj << /XObject << /Image10 10 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000001191 00000 n 0000001250 00000 n 0000000445 00000 n 0000001012 00000 n 0000001120 00000 n 0000001172 00000 n 0000000015 00000 n 0000000101 00000 n 0000000246 00000 n 0000000589 00000 n 0000000989 00000 n 0000001098 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 1299 %%EOF gdalautotest-3.0.4/gdrivers/data/byte_enc.pdf0000644003401500001440000000505513614004466020662 0ustar rouaultusers%PDF-1.3 % 1 0 obj<> endobj 2 0 obj<> endobj 3 0 obj<> endobj 4 0 obj<> stream uah><4XJs80 %CQ6yP endstream endobj 5 0 obj<>>> endobj 6 0 obj[] endobj 7 0 obj<>> endobj 8 0 obj<> endobj 9 0 obj<>> endobj 10 0 obj<> stream T"W[F}93 *媆?c?eZ^Rra#5jcssG#5fގgWȔy;aq;SvpYQJ sO u}!sIwgAsՠQN1ޜ6߂bt}7nC Q=S.߀hri)OO XUFu"Cf]Lh)PX endstream endobj 11 0 obj 228 endobj 12 0 obj 33 endobj 13 0 obj</P -3904/R 2/U/V 1>> endobj xref 0 14 0000000000 65535 f 0000000015 00000 n 0000000066 00000 n 0000000110 00000 n 0000000239 00000 n 0000000338 00000 n 0000000384 00000 n 0000000401 00000 n 0000000486 00000 n 0000000680 00000 n 0000001564 00000 n 0000001947 00000 n 0000001967 00000 n 0000001986 00000 n trailer <]/Root 2 0 R/Size 14>> startxref 2174 %%EOF gdalautotest-3.0.4/gdrivers/data/caseinsensitive0000644003401500001440000000000013614004466021477 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/isis3_unit_test.cub0000644003401500001440000047630113614004466022230 0ustar rouaultusersObject = IsisCube Object = Core StartByte = 65537 Format = Tile TileSamples = 128 TileLines = 128 Group = Dimensions Samples = 150 Lines = 50 Bands = 1 End_Group Group = Pixels Type = SignedWord ByteOrder = Lsb Base = 8190.1245134999 Multiplier = 0.25006486667989 End_Group End_Object Group = BandBin Name = Red Center = 700 Width = 300 End_Group Group = Mapping ProjectionName = Equirectangular CenterLongitude = 195.92 TargetName = mars EquatorialRadius = 3396190.0 PolarRadius = 3376200.0 LatitudeType = Planetocentric LongitudeDirection = PositiveEast LongitudeDomain = 360 MinimumLatitude = -38.96 MaximumLatitude = -38.8 MinimumLongitude = 195.85 MaximumLongitude = 195.99 UpperLeftCornerX = 653.1326414958 UpperLeftCornerY = -2298409.7101628 PixelResolution = 0.38 Scale = 155622.36097143 TrueScaleLatitude = -38.88 CenterLatitude = -38.88 CenterLatitudeRadius = 3388271.7029792 End_Group End_Object Object = Label Bytes = 65536 End_Object Object = History Name = IsisCube StartByte = 161997 Bytes = 1013 End_Object Object = OriginalLabel Name = OriginalLabel StartByte = 131073 Bytes = 30924 End_Object End x?ɇڇʇʇ͇LJȇʇЇՇӇc9ň\Q uׇ(6 ·+0?yLهׇ)NLA߇߇އć ΉEъJȋ֋Ƌڋ-Gs? ooe΋]$T* ;G %3Yɇ·ꇶ܇·ׇԇЇӇr<~2bۈW{ TU;Q!ׇBψEƈ]3iދ Sي ~C%J@. , %cR Ջ3㋰Çχ‡OˇՇ+ ,"Z~vG2ŇƇ jx/9.U䉅IW͇pMЉljɊ;h'enˋ鋅:ӊ>Ha ۋ"c& ㋩̇ۇ2`Çd{㇕Έ_uRˇPOʉ>`WljŠẇoƈ3"~{3Xʼn,"B!fDЊ gϊ튒֊Zk^a͋؋ ۋ :ɋP+q ݋xʇЇʇćه뇫m;AOU=>~"ć܇O)c̉z9CɈ~Z􇸇Iuɇ߇>Wz܊)"<ߊʉG ؊!5cX#jTK֋8@.)ԋjӋsɇׇ݇MӇчi‡UH;t&vUֈڈ;ԇmӊϊ[qFk`ĉxӊ8zqF /%͋?!ɋŋŋ̋_񇼇ɇȇ؇ˇQF懄ԇ}C|hbχr9VsۉʼnTu߇ZҊ܊D#(≀݊E׋͋ۋ^Vrt+ԊX^$*2ۋrʋɋȋpڇhqχ)F쇮5҈Y"tKzʇ[ֈry݈ 4%R}Ӈډ̊ϊ;j܊׊LDEɊ?܋i‹ɋ䊳CC~bNjҋt?hÇƇ҇%@Uhẏˈ ('_5}B Uh46[IZ*|ȇŇ n !.ĊԊs7~6ԋً֋qF񋲋]mY‹rۋ:^$ohpnuynчDÇʇ҈[2'&dBb/t8SHԈf=ካ=N~sgߋˋҋ!8uꊾbƋߋËPtċދ ֋هևև6SEpɇ[-T׉͈|{'gU>P+dM {b5ֈ ,щŠvU:2#؊[~ ԋNjߋdYYFTrϋڋ~ =wItIË(NjӇևχ݇ʇ܇$=Z ڇQĈyCƉS{(+E0b;҈.3ljX.Ԉ)#J=eYEi x!CDʋ.ˋ?' Ë;ڋ򋱋΋9Eڋ,zʋo񋎋U a-̋܇܇͇ԇՇÇۇ>$N/1򈵈Pш ЊҊa}Ԉmae7zډ;숫5z8mۉTҊߊЊ8"SWڋGˋ싵Ƌϋ 7k5'ϋ΋ߋQ~BNj֋\ꋾ5̋ч·އ*9߇Ӈs e҇9qe-cډÉOi_Z̉:NJ8CAڊ[-) GӋ΋׋PT,+ڋQȋՋԋ|v‹֋B ߋ?z‹zÇ%߇6nɉh߇]Zȉ͇̇`7sfƉO;͉ˉ8 R6}@QQ $ϋ}x 0ы&͋͋Ƌ틻ˋP鋱݋%nmi1m̋ӋeՇއӇ1ʇvˆNs=҉鈼χI5x=މՉ3J;|݋m4{ʋŋJۋŋ틿ϋs B͋ꋖًӋl6ߋ5؋LjC9"L ·Ӈć̇ɇȇԇ܇(#ևhq|]*އ߉~ڈ$؊\yЉcsى)8?'9V5^ ̋֋n_׋y]uY7kۋȋ݋@#4׋ ՋʋʋӋ*kA,,ъXԇ臯ӇLJԇև#Ԉ߈DÈG܉0 B!هm6sCՊ|Lj̉G>+ G[Qҋ:Y^ҋKˋdË݋SJߊŠdIugs{ŋ/̋NjƋ‹׋Ћ[;Tڊaևw݇ŇЇ()߇ۇ;@K҈ʼnԇ}1ĉ'n,b6ډaŊ|#}Jh[hLqϋ7ߋ% ce+).ȋrpsƋʋg8ŊT$~ꈲՇهMۇɇχ·ڇ QUԇ9щp\Ӊ܉5Iy==(lY/uʊZ8bF[eiЊ(pe򋽋)K؋݋֋󋯋v\8'3I"N?Bl̉<ԇ‡χ2& ":&hi߉wωĉJ8pފ*Ɋ‹ߋË܋܋ΊS׊߉P(?$zxϋyww֋ʋċiƋkċƋ؋G4 \CC ? ߊ~߇Ƈ ه:W [io,&jϊ9JE`ˋA%/'S|Fi:"Hы ݋ËՋ6yddLQ~sMIFqc|OˋSf >sÉˊLJ+ۇ122m`5[Tz׊ՊߊҊ6Uȋ [:e7؊OF򉠊=N‹jXau>sOWnbD_%ϊ075ω\;R*,桷&We?M?RՊNJ9[y~po݊Z G/戤A+iҋ싥{z拔Jw@tm‹8H)QQVfh4K=/[[H/b/UwKbX# C'󉚉O`u8؇yɇɇˇKeƈ!4%Rc䋾HH4o\p|vFŋ=׋ɋ [eDg~‹܋΋_krUy&ыBZ%tdbwInyWI<38`@Ή%ۇćڇƇއ%Qʼn鉃{(]nÉng1SRfvXT-uIߋyxًȋXΊgz{X爲=ŋNjЋ΋z ^K9}Ë[+Ŋ"ϋˋvfr}Lhϊ/&%ojMU8F#*(܊/0 ·Շ͇DĉD{uŊKO4/Njߊ3yH̉󉦈gj^TP֋ʋڋ̋H]nPS鋇Fxk΋)"+de0 P(6UX1Ȋ Ԋ֊Y $ފvʼnYtszڊRߋ Zu*]Fn}\S_*PމQȌnыeJwMɉQDË׋[P#1P5؊a.@=;Tt@=CkW;hȊ݊򊇊w;+1eD .g(:Їʇ >؉1Ov󊮊@fmE+NKu-ek)< ƋʼnLֈ? ċi΋592֊D,@MJz%iSq&ފ`0|̊}"&d SiȊՊI57kp%2}g][Ɖӈ̊;5ًSwWEt?׊M|֋8Dx݋ӋSfIP^O=0?YF]功ULyY֊mՊX<Sctˊˊb=`܈[ʼn܊̊[zRډh*|@܉gYkxQ:΋򋓋l]/Љzb݋`7f-O܋Ŋ*ˋtom&KB ŠĊ܊&@zVڊ݊:"fYwʊŠ#{uVzъĊQ.ωgȊ4*9lj߈"$ҋ֋F~]5WfosnK]PM=Tŋ~ŋˋۋ*_fTj![K]0T[8Hъ'늱̊8슢/k|يӊP/$Ŋ99ÊSЊh# Pc+ 2Gꉯʼn܋؋ՋA2xUsXj|[1coZ}ҋU\JrՋŋ((Bah!#7T}݊܊oɊ~X`͊׊ ͊Ҋ6-/7-!W3[݉h&L-d9W[c>ʋɋދ2݋$yƈˉ$׈ ktq1~ԋu֋ȋ֋ȋċhUwsHZ*^AB,Vxߊ5ȊmoP~e‰֋y‹݋]VGv4HOwmwȋ勧FPYA;~t|qt@lRs䋟eɋҋNj㋰tQs_dpeNjʋۋۋɋmh:EJ`di݋sҋۋԋӋd]|ۋ[uߋЋŋ‹xext܋u 닒jPыʋPVdLux*‹ԋY>_O)m|n1܋<΋ދolzSje{&狱ߋ\%‹ۋ؋ZrH^[͋ϋ"B8Ypb6NLEVpϋ䋵ˋQƊ brȋċË=]#4`8"ዱ.DxȋЋ؋V{ /t)ŋ>SqꋫlΉS\G‹ˋϋhM|grWG&a1UZ Htp^H&U3F|ood._p 8E"M#؊ϊ@Šߊ֊ۊnI0S'튳Jى_eKf0ۊ͊;ZdJe6ioBs(ΊFЊ< [, Hj`jJ97P_p#lH~|q#6.-x̉fՉ.ĊLBgIOيT։ʼn8׊ߊ",[D:׋Y9:]NJi%qmڋT3(P^NJ,wUtZ2z kЈmbmҊvዪl~KPM>Y"'~q,SJ;* 臵"@Nc`PGkt'ڈ~爂K4ORcW΋0߈xo֊)@V]j[rr_TB։-)|bj=8XV@PDS_VERSION_ID = PDS3 /* File structure: */ /* This file contains an unstructured byte stream. */ /* The UNDEFINED RECORD_TYPE is used to meet PDS standards requirements. */ /* A label "record" is actually a single byte. */ RECORD_TYPE = UNDEFINED /* Locations of Data Objects in the file. */ /* >>> CAUTION <<< The first byte is location 1 (not 0)! */ LABEL_RECORDS = 32768 ^SCIENCE_CHANNEL_TABLE = 32769 ^LOOKUP_TABLE = 33569 ^CPMM_ENGINEERING_TABLE = 49953 ^CALIBRATION_LINE_PREFIX_TABLE = 50013 ^CALIBRATION_LINE_SUFFIX_TABLE = 50013 ^CALIBRATION_IMAGE = 50013 ^LINE_PREFIX_TABLE = 227757 ^LINE_SUFFIX_TABLE = 227757 ^IMAGE = 227757 ^GAP_TABLE = 42547757 /* Identification information. */ DATA_SET_ID = MRO-M-HIRISE-2-EDR-V1.0 DATA_SET_NAME = "MRO MARS HIGH RESOLUTION IMAGING SCIENC EXPERIMENT EDR V1.0" PRODUCER_INSTITUTION_NAME = "UNIVERSITY OF ARIZONA" PRODUCER_ID = UA PRODUCER_FULL_NAME = "ALFRED MCEWEN" OBSERVATION_ID = PSP_002172_1410 MRO:COMMANDED_ID = PSP_002172_1410 PRODUCT_ID = PSP_002172_1410_RED0_0 PRODUCT_VERSION_ID = 1.0 SOURCE_FILE_NAME = 4A_01_4821F11A00_00_0_01.DAT INSTRUMENT_HOST_NAME = "MARS RECONNAISSANCE ORBITER" INSTRUMENT_HOST_ID = MRO INSTRUMENT_NAME = "HIGH RESOLUTION IMAGING SCIENCE EXPERIMENT" INSTRUMENT_ID = HIRISE TARGET_NAME = MARS MISSION_PHASE_NAME = "PRIMARY SCIENCE PHASE" ORBIT_NUMBER = 2172 RATIONALE_DESC = "Gullies with inner channels (MOC Releas MOC2-1416, image S1200190)" SOFTWARE_NAME = "HiRISE_Observation v2.9.1 (2.43 2006/10/0 05:41:12)" FLIGHT_SOFTWARE_VERSION_ID = IE_FSW_V4 /* Science Channel Header Observation Data Component description. */ Object = SCIENCE_CHANNEL_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 1 COLUMNS = 184 ROW_BYTES = 800 DESCRIPTION = "The Science Channel Table contains engineerin fields describing the operating state and commanding of the HiRISE observation. For detailed information about the contents and organization of this observation data component, refer to the SCIENCE_CHANNEL_TABLE.FMT file." ^STRUCTURE = SCIENCE_CHANNEL_TABLE.FMT End_Object /* Lookup Table Observation Data Component description. */ Object = LOOKUP_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 16384 COLUMNS = 1 ROW_BYTES = 1 DESCRIPTION = "The Lookup Table (LUT) defines the translation o 14-bit input pixels to 8-bit output pixels. The table has one column and 16384 rows, one for each input DN value. The first entry of the table refers to the 8-bit output value for the input pixel value 0." Object = COLUMN NAME = "Output Data Value" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 1 DESCRIPTION = "The rows represent the 8-bit output pixel value fo each 14-bit input pixel. The first row contains the 8-bit pixel value corresponding to the input DN value of 0. Each subsequent row corresponds to the 8-bit output pixel of the next input DN value." End_Object End_Object /* CPMM Engineering Header Observation Data Component description. */ Object = CPMM_ENGINEERING_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 1 COLUMNS = 8 ROW_BYTES = 60 DESCRIPTION = "The CPMM Engineering Table contains engineerin fields used by the CCD Processing and Memory Module (CPMM) in commanding the CCD during the observation. For detailed information about the contents and organization of this observation data component, refer to the CPMM_ENGINEERING_TABLE.FMT file." ^STRUCTURE = CPMM_ENGINEERING_TABLE.FMT End_Object /* Calibration Image Data Line Prefix description. */ Object = CALIBRATION_LINE_PREFIX_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 168 COLUMNS = 2 ROW_BYTES = 18 ROW_SUFFIX_BYTES = 1040 Object = COLUMN NAME = "Line Identification" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 6 DESCRIPTION = "Line ID contains line synchronization pattern, channe number, and line counter." Object = BIT_COLUMN NAME = "Line Synchronization Pattern" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 1 BITS = 19 DESCRIPTION = "For valid lines this line synchronization patter is 2#1111111100000000111#, for a corrupted or missing line the value is 2#1111111111111111111#." End_Object Object = BIT_COLUMN NAME = "Channel Number" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 20 BITS = 5 DESCRIPTION = "Channel number associated with a line." End_Object Object = BIT_COLUMN NAME = "Line Counter" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 25 BITS = 23 DESCRIPTION = "Line counter. First line = 0." End_Object Object = BIT_COLUMN NAME = "Bad Line" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 48 BITS = 1 DESCRIPTION = "The bad line flag is set when the line was foun to have a misplaced or corrupted line header. A line header that is lost in a data gap does not result in a bad line." End_Object End_Object Object = COLUMN NAME = "Buffer Pixels" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 7 BYTES = 12 ITEMS = 12 ITEM_BYTES = 1 DESCRIPTION = "The buffer pixels contain the value of empty pixel after going through the instrument electronics." End_Object End_Object /* Calibration Image Data Line Suffix description. */ Object = CALIBRATION_LINE_SUFFIX_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 168 COLUMNS = 1 ROW_BYTES = 16 ROW_PREFIX_BYTES = 1042 Object = COLUMN NAME = "Dark Reference Pixels" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 16 ITEMS = 16 ITEM_BYTES = 1 DESCRIPTION = "Dark reference pixel values produced by maske detectors." End_Object End_Object /* Calibration Image Data Description. */ Object = CALIBRATION_IMAGE LINES = 168 LINE_SAMPLES = 1024 SAMPLE_BITS = 8 SAMPLE_BIT_MASK = 2#11111111# SAMPLE_TYPE = MSB_UNSIGNED_INTEGER MISSING_CONSTANT = 16#FF# LINE_PREFIX_BYTES = 18 LINE_SUFFIX_BYTES = 16 DESCRIPTION = "The calibration image results from passing unexpose pixels through the instrument electronics. This records the instrument fixed noise signature that can be used to correct the observational data." End_Object /* Image data line prefix description. */ Object = LINE_PREFIX_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 40000 COLUMNS = 2 ROW_BYTES = 18 ROW_SUFFIX_BYTES = 1040 Object = COLUMN NAME = "Line Identification" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 6 DESCRIPTION = "Line ID contains line synchronization pattern, channe number, and line counter." Object = BIT_COLUMN NAME = "Line Synchronization Pattern" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 1 BITS = 19 DESCRIPTION = "For valid lines this line synchronization patter is 2#1111111100000000111#, for a corrupted or missing line the value is 2#1111111111111111111#." End_Object Object = BIT_COLUMN NAME = "Channel Number" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 20 BITS = 5 DESCRIPTION = "Channel number associated with a line." End_Object Object = BIT_COLUMN NAME = "Line Counter" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 25 BITS = 23 DESCRIPTION = "Line counter. First line = 168." End_Object Object = BIT_COLUMN NAME = "Bad Line" BIT_DATA_TYPE = MSB_UNSIGNED_INTEGER START_BIT = 48 BITS = 1 DESCRIPTION = "The bad line flag is set when the line was foun to have a misplaced or corrupted line header. A line header that is lost in a data gap does not result in a bad line." End_Object End_Object Object = COLUMN NAME = "Buffer Pixels" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 7 BYTES = 12 ITEMS = 12 ITEM_BYTES = 1 DESCRIPTION = "The buffer pixels contain the value of empty pixel after going through the instrument electronics." End_Object End_Object /* Image data line suffix description. */ Object = LINE_SUFFIX_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 40000 COLUMNS = 1 ROW_BYTES = 16 ROW_PREFIX_BYTES = 1042 Object = COLUMN NAME = "Dark Reference Pixels" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 16 ITEMS = 16 ITEM_BYTES = 1 DESCRIPTION = "Dark reference pixel values produced by maske detectors." End_Object End_Object /* Image data description. */ Object = IMAGE LINES = 40000 LINE_SAMPLES = 1024 SAMPLE_BITS = 8 SAMPLE_BIT_MASK = 2#11111111# SAMPLE_TYPE = MSB_UNSIGNED_INTEGER MISSING_CONSTANT = 16#FF# LINE_PREFIX_BYTES = 18 LINE_SUFFIX_BYTES = 16 DESCRIPTION = "Observation image data." End_Object /* Gap Table description. */ Object = GAP_TABLE INTERCHANGE_FORMAT = BINARY ROWS = 0 COLUMNS = 2 ROW_BYTES = 8 DESCRIPTION = "The Gap Table identifies the location of gap byt value (0xFF) segments in the file as a set of [start, end) range pairs." Object = COLUMN NAME = "Range Start" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 1 BYTES = 4 DESCRIPTION = "The byte offset (0-based) from the beginning of th file to the start byte (inclusive) of the gap segment." End_Object Object = COLUMN NAME = "Range End" DATA_TYPE = MSB_UNSIGNED_INTEGER START_BYTE = 5 BYTES = 4 DESCRIPTION = "The byte offset (0-based) from the beginning of th file to the end byte (exclusive) of the range." End_Object End_Object /* Observation timing events. */ /* All xxx_COUNT values are for the MRO spacecraft clock (SCLK) */ /* in seconds:subseconds form. A subsecond tick = 15.2588 microseconds. */ /* All xxx_TIME values are referenced to UTC. */ /* To obtain the most accurate results from time values */ /* use the xxx_COUNT values with the latest SPICE kernels */ /* obtained from ftp://naif.jpl.nasa.gov/pub/naif/MRO/kernels. */ Group = TIME_PARAMETERS /* Time when the observation first started. */ MRO:OBSERVATION_START_TIME = 2007-01-12T16:26:59.750 MRO:OBSERVATION_START_COUNT = 853086438:40706 /* Time at the beginning of the first calibration image line. */ MRO:CALIBRATION_START_TIME = 2007-01-12T16:26:59.909 MRO:CALIBRATION_START_COUNT = 853086438:51092 /* Time at the beginning of the first target image line. */ START_TIME = 2007-01-12T16:26:59.922 SPACECRAFT_CLOCK_START_COUNT = 853086438:51978 /* Time at the end of the last target image line. */ STOP_TIME = 2007-01-12T16:27:03.140 SPACECRAFT_CLOCK_STOP_COUNT = 853086442:00696 /* Time when the CPMM readout started. */ MRO:READOUT_START_TIME = 2007-01-12T16:27:05.790 MRO:READOUT_START_COUNT = 853086444:43319 /* Time when this EDR product was created. */ PRODUCT_CREATION_TIME = 2007-01-12T19:53:03 End_Group /* Instrument settings. */ Group = INSTRUMENT_SETTING_PARAMETERS MRO:CPMM_NUMBER = 0 MRO:CHANNEL_NUMBER = 0 FILTER_NAME = RED CENTER_FILTER_WAVELENGTH = 700 BANDWIDTH = 300 MRO:SCAN_EXPOSURE_DURATION = 80.4375 MRO:LINE_EXPOSURE_DURATION = 80.4375 MRO:IMAGE_EXPOSURE_DURATION = 3231013.5000 MRO:DELTA_LINE_TIMER_COUNT = 103 MRO:POWERED_CPMM_FLAG = (ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON) MRO:BINNING = 1 MRO:TDI = 128 MRO:TRIM_LINES = 1789 MRO:FOCUS_POSITION_COUNT = 2023 MRO:FELICS_COMPRESSION_FLAG = YES MRO:STIMULATION_LAMP_FLAG = (OFF, OFF, OFF) MRO:HEATER_CONTROL_MODE = "CLOSED LOOP" MRO:HEATER_CONTROL_FLAG = (ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON) MRO:LOOKUP_TABLE_TYPE = STORED MRO:LOOKUP_TABLE_MINIMUM = -9998 MRO:LOOKUP_TABLE_MAXIMUM = -9998 MRO:LOOKUP_TABLE_MEDIAN = -9998 MRO:LOOKUP_TABLE_K_VALUE = -9998 MRO:LOOKUP_TABLE_NUMBER = 26 /* This table provides a reverse mapping */ /* from 8-bit EDR image data back to 14-bit observation data. */ /* Each node of the map is the (lower, upper) inclusive range */ /* of the original 14-bit observation value */ /* that was translated to the 8-bit image value */ /* corresponding to the node number (first node = 0). */ /* Unused image values have the special range (-9998, -9998). */ /* A special ((0, 0)) map indicates that no LUT was applied. */ MRO:LOOKUP_CONVERSION_TABLE = ((0, 1206), (1207, 1220), (1221, 1234), (1235, 1248), (1249, 1262), (1263, 1276), (1277, 1290), (1291, 1304), (1305, 1318), (1319, 1331), (1332, 1345), (1346, 1359), (1360, 1373), (1374, 1387), (1388, 1401), (1402, 1415), (1416, 1429), (1430, 1443), (1444, 1456), (1457, 1470), (1471, 1484), (1485, 1498), (1499, 1512), (1513, 1526), (1527, 1540), (1541, 1554), (1555, 1568), (1569, 1581), (1582, 1595), (1596, 1609), (1610, 1623), (1624, 1637), (1638, 1651), (1652, 1665), (1666, 1679), (1680, 1693), (1694, 1707), (1708, 1721), (1722, 1735), (1736, 1749), (1750, 1763), (1764, 1777), (1778, 1791), (1792, 1805), (1806, 1820), (1821, 1834), (1835, 1848), (1849, 1862), (1863, 1876), (1877, 1890), (1891, 1904), (1905, 1918), (1919, 1933), (1934, 1947), (1948, 1961), (1962, 1975), (1976, 1989), (1990, 2003), (2004, 2017), (2018, 2031), (2032, 2046), (2047, 2060), (2061, 2074), (2075, 2088), (2089, 2102), (2103, 2116), (2117, 2130), (2131, 2144), (2145, 2159), (2160, 2173), (2174, 2187), (2188, 2201), (2202, 2215), (2216, 2229), (2230, 2243), (2244, 2257), (2258, 2272), (2273, 2286), (2287, 2300), (2301, 2314), (2315, 2328), (2329, 2342), (2343, 2356), (2357, 2370), (2371, 2385), (2386, 2399), (2400, 2413), (2414, 2427), (2428, 2441), (2442, 2455), (2456, 2469), (2470, 2483), (2484, 2497), (2498, 2511), (2512, 2525), (2526, 2539), (2540, 2553), (2554, 2567), (2568, 2581), (2582, 2595), (2596, 2609), (2610, 2624), (2625, 2638), (2639, 2652), (2653, 2666), (2667, 2680), (2681, 2694), (2695, 2708), (2709, 2722), (2723, 2736), (2737, 2750), (2751, 2764), (2765, 2778), (2779, 2792), (2793, 2806), (2807, 2820), (2821, 2834), (2835, 2848), (2849, 2863), (2864, 2877), (2878, 2891), (2892, 2905), (2906, 2919), (2920, 2933), (2934, 2947), (2948, 2961), (2962, 2975), (2976, 2989), (2990, 3003), (3004, 3017), (3018, 3031), (3032, 3045), (3046, 3059), (3060, 3073), (3074, 3087), (3088, 3101), (3102, 3114), (3115, 3127), (3128, 3139), (3140, 3152), (3153, 3165), (3166, 3178), (3179, 3191), (3192, 3203), (3204, 3216), (3217, 3229), (3230, 3242), (3243, 3255), (3256, 3268), (3269, 3280), (3281, 3293), (3294, 3306), (3307, 3319), (3320, 3332), (3333, 3345), (3346, 3357), (3358, 3370), (3371, 3383), (3384, 3396), (3397, 3409), (3410, 3421), (3422, 3434), (3435, 3447), (3448, 3460), (3461, 3473), (3474, 3486), (3487, 3498), (3499, 3511), (3512, 3524), (3525, 3537), (3538, 3550), (3551, 3562), (3563, 3575), (3576, 3588), (3589, 3601), (3602, 3614), (3615, 3627), (3628, 3639), (3640, 3652), (3653, 3665), (3666, 3678), (3679, 3691), (3692, 3704), (3705, 3716), (3717, 3729), (3730, 3742), (3743, 3755), (3756, 3768), (3769, 3780), (3781, 3793), (3794, 3806), (3807, 3821), (3822, 3837), (3838, 3853), (3854, 3869), (3870, 3886), (3887, 3902), (3903, 3918), (3919, 3935), (3936, 3951), (3952, 3967), (3968, 3983), (3984, 4000), (4001, 4016), (4017, 4032), (4033, 4048), (4049, 4065), (4066, 4081), (4082, 4097), (4098, 4114), (4115, 4130), (4131, 4146), (4147, 4162), (4163, 4180), (4181, 4200), (4201, 4220), (4221, 4240), (4241, 4260), (4261, 4280), (4281, 4300), (4301, 4320), (4321, 4340), (4341, 4360), (4361, 4380), (4381, 4400), (4401, 4420), (4421, 4440), (4441, 4460), (4461, 4480), (4481, 4500), (4501, 4520), (4521, 4542), (4543, 4568), (4569, 4594), (4595, 4619), (4620, 4645), (4646, 4671), (4672, 4696), (4697, 4722), (4723, 4747), (4748, 4773), (4774, 4799), (4800, 4824), (4825, 4850), (4851, 4876), (4877, 4908), (4909, 4948), (4949, 4988), (4989, 5028), (5029, 5068), (5069, 5108), (5109, 5148), (5149, 5188), (5189, 5228), (5229, 16383), (-9998, -9998)) /* Waveform sampling timing settings: (image, reset). */ MRO:ADC_TIMING_SETTINGS = (5, 4) /* Clocks timing locks: (first clock, second clock). */ MRO:DLL_LOCKED_FLAG = (YES, YES) MRO:DLL_LOCKED_ONCE_FLAG = (YES, YES) MRO:DLL_RESET_COUNT = 0 MRO:DLL_FREQUENCY_CORRECT_COUNT = 4 End_Group /* Temperature sensor readings at observation start. */ Group = TEMPERATURE_PARAMETERS MRO:OPT_BNCH_FLEXURE_TEMPERATURE = 20.2816 MRO:OPT_BNCH_MIRROR_TEMPERATURE = 20.2816 MRO:OPT_BNCH_FOLD_FLAT_TEMPERATURE = 20.9752 MRO:OPT_BNCH_FPA_TEMPERATURE = 19.5881 MRO:OPT_BNCH_FPE_TEMPERATURE = 19.7615 MRO:OPT_BNCH_LIVING_RM_TEMPERATURE = 20.6284 MRO:OPT_BNCH_BOX_BEAM_TEMPERATURE = 20.6284 MRO:OPT_BNCH_COVER_TEMPERATURE = 19.6748 MRO:FIELD_STOP_TEMPERATURE = 17.9418 MRO:FPA_POSITIVE_Y_TEMPERATURE = 18.6349 MRO:FPA_NEGATIVE_Y_TEMPERATURE = 18.5482 MRO:FPE_TEMPERATURE = 17.8552 MRO:PRIMARY_MIRROR_MNT_TEMPERATURE = 20.2816 MRO:PRIMARY_MIRROR_TEMPERATURE = 20.6284 MRO:PRIMARY_MIRROR_BAF_TEMPERATURE = -0.0162272 MRO:MS_TRUSS_LEG_0_A_TEMPERATURE = 20.2816 MRO:MS_TRUSS_LEG_0_B_TEMPERATURE = 20.5417 MRO:MS_TRUSS_LEG_120_A_TEMPERATURE = 20.0215 MRO:MS_TRUSS_LEG_120_B_TEMPERATURE = 20.8018 MRO:MS_TRUSS_LEG_240_A_TEMPERATURE = 19.5881 MRO:MS_TRUSS_LEG_240_B_TEMPERATURE = 19.6748 MRO:BARREL_BAFFLE_TEMPERATURE = -24.0749 MRO:SUN_SHADE_TEMPERATURE = -35.8885 MRO:SPIDER_LEG_30_TEMPERATURE = 17.0757 MRO:SPIDER_LEG_150_TEMPERATURE = 17.2489 MRO:SPIDER_LEG_270_TEMPERATURE = 17.1623 MRO:SEC_MIRROR_MTR_RNG_TEMPERATURE = 19.9348 MRO:SEC_MIRROR_TEMPERATURE = 20.6284 MRO:SEC_MIRROR_BAFFLE_TEMPERATURE = -23.5637 MRO:IEA_TEMPERATURE = 25.7484 MRO:FOCUS_MOTOR_TEMPERATURE = 21.3221 MRO:IE_PWS_BOARD_TEMPERATURE = 18.3058 MRO:CPMM_PWS_BOARD_TEMPERATURE = 18.8752 MRO:MECH_TLM_BOARD_TEMPERATURE = 34.871 MRO:INST_CONT_BOARD_TEMPERATURE = 34.4121 End_Group /* Instrument electrical power sensor readings. */ Group = POWER_PARAMETERS MRO:CPMM_POSITIVE_29_VOLTAGE = 29.1436 MRO:CPMM_POSITIVE_29_CURRENT = 0.216084 MRO:CPMM_POSITIVE_10_VOLTAGE = 9.02174 MRO:CPMM_POSITIVE_10_CURRENT = 2.32705 MRO:CPMM_POSITIVE_5_VOLTAGE = 5.02654 MRO:CPMM_POSITIVE_5_CURRENT = 7.65065 MRO:CPMM_POSITIVE_3_3_VOLTAGE = 3.31406 MRO:CPMM_POSITIVE_3_3_CURRENT = 1.55702 MRO:CPMM_POSITIVE_2_5_VOLTAGE = 2.50739 MRO:CPMM_POSITIVE_2_5_CURRENT = 0.320927 MRO:CPMM_POSITIVE_1_8_VOLTAGE = 1.81145 MRO:CPMM_POSITIVE_1_8_CURRENT = 4.15481 MRO:CPMM_NEGATIVE_5_VOLTAGE = -5.05272 MRO:CPMM_NEGATIVE_5_CURRENT = -0.694578 MRO:HEATER_CURRENT = 0.68071 MRO:INST_CONT_FPGA_POS_2_5_VOLTAGE = 2.54639 MRO:MECH_TLM_FPGA_POS_2_5_VOLTAGE = 2.5708 MRO:IEA_POSITIVE_28_VOLTAGE = 30.774 MRO:IEA_NEGATIVE_15_VOLTAGE = -15.3089 MRO:IEA_POSITIVE_15_VOLTAGE = 15.1964 MRO:IEA_POSITIVE_5_VOLTAGE = 5.06592 End_Group End Object = cubeit IsisVersion = "3.1.5 MacOSX (Intel) Beta | 2007-01-05" ProgramVersion = 2006-10-11 ExecutionDateTime = 2007-03-09T11:27:13 HostName = gabbro.wr.usgs.gov UserName = lpk Description = "Stacks cubes in individual files into one cube" Group = UserParameters LIST = cublist.dat TO = PSP_002172_1410_PSP_001552_1410_AnaG.cub End_Group End_Object Object = crop IsisVersion = "3.1.13 | 2007-08-23" ProgramVersion = 2007-02-01 ProgramPath = /usgs/pkgs/isis3.1.13/isis/bin ExecutionDateTime = 2007-12-08T14:45:09 HostName = magnus UserName = thare Description = "Crops a cube" Group = UserParameters FROM = /farm/sci7/analysis/Anaglyph/PSP_001552_1410_PSP_002172_1410/PSP_002172_1410_PSP_001552_1410_AnaG.cub+1 TO = isis3_unit_test.cub SAMPLE = 10200 NSAMPLES = 150 SINC = 1 LINE = 10300 NLINES = 50 LINC = 1 End_Group End_Object gdalautotest-3.0.4/gdrivers/data/int64dim.nc0000644003401500001440000002014013614004466020347 0ustar rouaultusersHDF  ` 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.0.4/gdrivers/data/float32_ieee754_split_reversible.jp20000644003401500001440000000607713614004466025157 0ustar rouaultusers jP ftypjp2 jp2 jpx rreqC@8jp2hihdr bpcccolrasoclbl gml.dataasoclbl gml.root-instanceuxml 440720 3750120 441920 3751320 0 0 19 19 x y 440750 3751290 60 0 0 -60 gmljp2://codestream/0 Record Interleaved jp2cOQ/\@]@@HHPHHPHHPHHPHHP]@R dLT_JP2_216 `.߀ AJfD/Om? e@` 4 Zg,ڰ?>@@ J O) Ve.#jh5K.l}mET-Μ?" CT:D<r[e,pt\bl9smSt2@m#}UG^@de/5;z#~w}<cQyu{Mz0ۛG5fv6b=%bT4;=![aQ@6VD?t6#:3 bR)IP` /68}+ԁH1:y`QF ZtK7y~@̎ƝCװ;oC_vH6P߹/F|p8ɅB 2϶V?.*KBo¤9,b׎i߼!X?;@o'#/s1ϣs VՆE_Dmu.at R䷦^r2Fw}o+ݻ]:{ ?g1W{oז^2~[QŻ޾-L7zv󦺼.] ht2ZWL2踅gdalautotest-3.0.4/gdrivers/data/float32.bil0000644003401500001440000000310013614004466020326 0ustar rouaultusers=H==H>======H>>H=>H?HH>侑====>H=H>=HH>H>H===HHH>=H==HHH>HH>H==>=H>==HHH>?==>v?6?6?>>H>=H=>侑H==??6?>H>H>=侑=HH>==侑==6?H>>H>H>H=HH侑V?侥H=H=H===H侑=HHH>H>H>H=HH======侑=>HH>6?H>HH6?侑=H6?>侑侥v?6?HHH>6?H>>==H侑=H>H>侑=>H>H>H>H侑HHH>H>侑=?>>HH>H侥H=HHv?6?H>H>?H=H侥侑=侥==>V?H>6?=HVH侑H>>=?H>H>侷6??@?=H>>=??>H>=V?V?>>>>>V?=>H=H侥gdalautotest-3.0.4/gdrivers/data/byte_scanline.tif0000644003401500001440000000262413614004466021721 0ustar rouaultusersII*S b z N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|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{skkkkksckPS   8x.BVj~ 2FZnN@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|gdalautotest-3.0.4/gdrivers/data/fake_nsif.ntf0000644003401500001440000000362713614004466021040 0ustar rouaultusersNSIF01.0003BF01GDAL 20021216151629 U 00000000000 00000000194300040400100063900000009000000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000003000000030INTMONO VIS 08RG411704N0200433E411907N0200445E411900N0200731E411656N0200719E0NC1M N 00B00010001003000300800100000000000001.0 0000000137000BLOCKA00123010000001000000000 +41.319331+020.078400+41.317083+020.126072+41.281634+020.122570+41.283881+020.074924 U8UUqqUqUqq8qUqqqUqUqqq8UqUUU8UqUqUUq*qUU88q88qqUq8Uq8UUUUU88q8qUqUU8q88U8qUqU8qqqUqq8qqUUUq8U88UqqqUq8qq88Uq8q8q8Uq88UqUqUU8UU88q8UUq88q88UqUUUUUqq8q88UUUq8UUUqqUUU8U8U88ŌUq8q8Uq8UU8Uq88Uq8qqq888U8q88UU8qqU8*UUUq88UUUq8UqUUUUUUUqUqU88ŌUq8q8UqqqqU8U8UqU8q8q88U8q88U8UUqUU88UUU88Uq88UUUq8UU8qUUU8qU8ŌUq8q8Uq8q8UqUUUU8q8U88U8q88U8UUUqUqq88UUUq8UqqqUUqUUUU88ŌUq8qq8Uq88Uq88UUUUqqUU88U8UUqq8U8q88q88UU8qq88UUqUU8UUUUqq8qU8U8Uq8U8ŌUUUqUUqqUU8qqU8UUUU8888qUqUUUqUq8U8qU88UUqUU8U88UUUqUqqUUUUUU88q8U8UU8888UUUqq88UqUUUUUqqq88qUUUqUUqq8q8U8U8UqUUqU88Uq88UqUqq8UqUUqU8UUU88q8UqUUq8qUUUU8UqUUU8qUqUqqUU88qU8U8UqqUqqU888Uqq8UqUUqUqqUUUUU8qqU8q8Uq8UUUUqUUUgdalautotest-3.0.4/gdrivers/data/trmm-nc4c.nc0000644003401500001440000005611613614004466020531 0ustar rouaultusersHDF  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.0.4/gdrivers/data/kmlimage.kmz0000644003401500001440000000304013614004466020700 0ustar rouaultusersPKpD!t2 doc.kmlUT %S%Sux ݖM0"`p*U?vH[G\6Cz32T[YqTlZ)%5rׯأN MӸe&jWr `;J%]˸f[7}.jvփiqk^~?xEZq(ޥvUwnwS^q;{I4bzBSۦR#s}Slu1K\E ZSrqMjJ<M@#"OJB|I aefv*BqEa'Kh3ReS2}0^;*nvb5c1{]h(ete? ̵t'LXʦ]6q'Ч }/q/o""3Qs,h101^d$=o0btcusφ_ J|,Q4_PK=pD͢>} kml_image_L1_0_0.pngUT %S%Sux  sb``p b``R````r1bk < p WU3: *eo``dfbx0Xܨa3ihs ~.PKWpD; 6kml_image_L2_0_0.pngUT %S%Sux  sb``p b``2,8؀ԗ'+=]C*漽q -s82O3 +n[) D1Hp`TbTbTbTbTbTbTbTbTbTbTbTbTbpKq<]\9%4PKpDBekml_image_L2_0_1.pngUT %S%Sux  sb``p  L@HLf3Q0R@1bۃ ~H&X00L< tsYPKpD!t2 doc.kmlUT%Sux PK=pD͢>} Ukml_image_L1_0_0.pngUT%Sux PKWpD; 6 kml_image_L2_0_0.pngUT%Sux PKpDBekml_image_L2_0_1.pngUT%Sux PK[gdalautotest-3.0.4/gdrivers/data/ldd.map0000644003401500001440000002010013614004466017625 0ustar rouaultusersRUU CROSS SYSTEM MAP FORMAT ;A AdP$@$@                                                                                                                                          gdalautotest-3.0.4/gdrivers/data/w0y13a4t.0100000644003401500001440000001100013614004466020100 0ustar rouaultusersPRODUCT ID =00343000-01 LOCATION =034/03900 ACQUISITION DATE =20002106 SATELLITE =IRS 1C SENSOR =WIFS SENSOR MODE = LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = PRODUCT TYPE =ORBIT ORIENTED PRODUCT SIZE =FULL SCENE TYPE OF PROCESSING =SYSTEMATIC RESAMPLING =CC VOLUME #/# IN SET =01/01 PIXELS PER LINE = 4748 LINES PER BAND = 4351/ 4351 START LINE # = 1 BLOCKING FACTOR = 1 RECORD LENGTH = 4748 PIXEL SIZE =180.00 OUTPUT BITS PER PIXEL = 8 ACQUIRED BITS PER PIXEL = 7 BANDS PRESENT =34 PRODUCT CODE =STLCB02AZ VERSION NO =IRS1CDPSV3R1 ACQUISITION TIME =09:54:20:773 GENERATING COUNTRY =GERMANY GENERATING AGENCY =EUROMAP GENERATING FACILITY =CHALD REV CBIASES AND GAINS IN THE BAND ORDER AS ON THIS TAPE 0.000000000000000 15.880000000000001 0.000000000000000 14.920000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 SENSOR GAIN STATE = 3 3 SENSOR STATE =GOOD GEOMETRIC DATA MAP PROJECTION =LCC ELLIPSOID =INTERNATL_1909 DATUM = USGS PROJECTION PARAMETERS = 6378388.000000000000000 6356911.946000000500000 44.146238337358326 41.360021614268064 16.313496707348090 42.711253496184113 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 UL = 0115339.7536E 465904.3608N -336895.626 484016.104 UR = 0224035.5223E 451806.7189N 498964.383 306686.012 LR = 0200946.8453E 383032.4304N 336463.116 -459269.706 LL = 0102751.5248E 400101.4842N -499397.025 -281939.782 CENTER = 0161833.7901E 424931.3858N -336.044 12675.323 2374 2175 OFFSET = 0 ORIENTATION ANGLE =-11.98 SUN ELEVATION ANGLE =66.9 SUN AZIMUTH ANGLE =141.7 gdalautotest-3.0.4/gdrivers/data/ignfheightasciigrid_ar1_nocoords_noprec.mnt0000644003401500001440000000007713614004466027130 0ustar rouaultusers-152 -151.5 -16.75 -16.5 0.25 0.25 1 0 1 0 0. éix 4 1 5 2 6 3gdalautotest-3.0.4/gdrivers/data/rgbsmall.rsw0000644003401500001440000001772413614004466020745 0ustar rouaultusersRSW222222@t:FAPll?7xͫ7]kF@@ L$WPCx-sf,wb6fiJnM?o=lcGlPrRpN|TY"\&%;nj=y"tb$vc%{c(bwRzR!Z1l{X'^pNvR1h'^ Z-f^:t4s#v`sYnR$|^"{ZwT"ZzU|WxSrP(\#~W*_+`}Q "KDCxoE},ykta6|w]wYxW zW&_*cvSyVyTxSxTW3tMxOwN|S"THP4s$vd$|e&i$f'fpR.e"Z&` Z%]yT{XxS }VsL yRyP"W"W LE7|m&i!h{b)k1q|]yZ+gjG hC#[wO}UzUyT iD"Z}T g@rK}TyP R$tg/s$i*l{^/o%dsT9u.j+f#]|T%]$\"ZtM#Z}StMtMrK|U5.9{p)o,n&g!`.l$cvToMxVxTA|"\vQ{SxNpH{S"YxN$\WqJ!|U/RHyd*z[uR$^ ZxN#\wRfC{U}WtQpOrQpS"vYmLwRsNtPyU#}Z"zVsLqM .lT4e%|ZoJ zW"|XnI|WtQyVzV{W"~[uT#|[&|^$uZ%y\#}Z{X+`&{[sQ&~Z!zSmI 7-7hX6mZ4dR5%(bJhGxToKyVqOrPtQ |Y{X|YzWyXsUsW5kH~@tvU)anNoO _=&~ZuN!yU%E:-^N0q[%oU8k'tX)pV!bIX>-wYpO xT&\ eBtReEcFpRxZ ~\wU ~\*d(y`@tUɺR@vZ=pN${Y(^qM zV zV&\"O?aHgJ.f yX!zYlK$wWuStP']nJ%\qNoM*`nP!y[xZ!|[ {ZtV6n(o[%cU!]RN?tqT uUqOjF!~YwS zVpNvT/gT'tYfHrUlOoRnNtTmK!tT uUsRvS |YwT"~[)c(d!]#\bE!lVVFUJ(cU Q<gK${Z&^!~Y }X#[ |Y%\gEbC_@G61z`(^5opRcFhKcC$yYoOZ=dHrTiKwV!}Z(c}Z ~\#{]!uX#pUArM|=zl:|ilP(\ XqIxPpInIkHtRoMhLcG!C}k7k'a$_\>{y[cFV6eH#w[mTnT"x`/leGkJ{X#~]2jG~S9~j!fR1zdJ)a"|Y }VWVuNnGnJkGc@-_iHiJLu(z]}XZ[!c~\'_$x[ ^EpX$zb1q$|d'f!wY"vY.e7kCvƺW9lgJ(a{VuPxQvN#Y!|U {TxT'[O, tQ!rQiJF7>f'~Z"Z$a,m qHsO'd!xdjX3v%}e+jlK#|[pSeN(cT|ؕ‡ȹI)`"Z|UpLqMpLnJlHiEtM#Ya:nH%vU1{_gG hC&c(f-l'frW7}G%~khQxY&`+c@r3q_W}|ʌ[.duNuNsLpLrP%}Y zV-a d=}T ~U {T"yUiH[? +sU(`|S~X|XvX+otYG7~=(j2l!vV,u[J93^U֬]?t wUpI hAlH"vS%|X'[yRyO']h<'\'[!uSfG^B A/-z_,h\xTuS+m+o}b)o5}!zg'hiH \<Y=@,@2KymNt*z]uPwP{T&\wPO,!sPpLyQRS*^pGtPkK#qReF /t`#e5})s"i&jb+o/tAHgTiM%|ZpNeDU<G.O5$rS&\~T|S"Z#]*aH'_?(\~T!YM.a b;oKhFW6_>%R?3A4|,pvV;zRPf8vgL%{Y!xTpL*{Z"vTsO ~U&\"ZqH|RZ(`mJ lL?sSX4mZ${U){XDs%yVtN1qkBGH8P${acL\G9rTT5m3f!yUtM!~W$]%_#[(b*b3g i@)d!XW1 ]:'~XF|&b2n+^lFa?Bo@r |S (%U)zqF:C b&}ceL V>(v_fS5rcHjJ!{W*b0h!]"^Xh@qMfB h?X"\;nT.^6R'e(dsEZ2L*)yV>o'\JslAx YHmWaG#g:/q%d%_]<iM.g(]uQ hA#X~VtJU$ZuQ4f!xT j>%` ~H T|O n@ qA1nY'])[%}U*Y@qrӧ1e^9y*nbL+j.rCM"b-i.f1h'^wSzS{R|S$X{RT,dxQpI$X n@0l,h~J~K+a Z2oUOsF&~V\6iF.efJ?.zbB0b987|?|2j:r;s$KMM,vr(q_+l,q5|#k$hZ'_sQN/gI;~cGp;}d4x_hL:k1b#sPU2hE3d/~]1cPVj<xJsGW&e2w4.y;5p6e5yZ,\]J<@ ~e(k"dc*t;$c#YnLdE$lN$lN^@(vW#tSR.X/ S/`c=S0Q1B$#oO7l,be7|PlCuItC N;77x*z[bH iO$nTVFz(^:qo5f'rVM3%uVvRqH~TqBm<#_)h'h(i-o+n/p1u*k)j7v`|] wS)uLCV$I#%0/- 6/J,0y(i"`*f,f+g;s*b ZWW4 Y8*^I)bA}+i+j2t1qXm7'a-k%h+o%i,p*o%j,s5z4}?z;uYD&"<)7/120%TKQ<*pVwHW!WrI-e"\$]6n-_W1O+ jC!Y0j4pO6w*i4oMp<&`.k(i)ka,r'n(p)p/t`A2cDs W;U3xK#^$}VjG4d%tS[<rO%]#`sBP9qxQ\9&WV"a\2w5{,l6gX(?+4../,0+-'&eQ"{Za7(`ST#^-d2id;g;$\Q rCa4\/^/'\\.k=%_^(j"dn>zO(cM*kGtM}T-n{UV)o5vo)fK1n _ _#`+h+jF8u#c=/t!e_%e`&m(s"p%t(qW'o0x5~-uh9B)m+n6f6lA'?/6423/0,0,1,:g!]TY4mGL6s uHUL0l6v9|:4x&j+o!i,x53>+r&p93~?3~?='m)l>g'L&/62353512.GC+=6"YC?y?{;uڻM|k͡/g0dbAK}@q b>vN"b)m-r2uKː?=B7,q*k:a ?152364400+3*3':OG~̵3oP>~hEo>sC{dQ}1{]!mN X8oHR0tB)lNȒ#g,q5y(itBP {Kn@zS^1z5}4y2sBh)C5756230,,% .#. gdalautotest-3.0.4/gdrivers/data/frmt10.cot0000644003401500001440000017414013614004466020221 0ustar rouaultusers  dYeieis[Rxne`}xsxin``}niVi}xsDRxsxis`esxs}sneVMixIxexsni[is}Me}ni}x`eVsVeY `n`sMVVMe[Vs}iexneesx`s}}}snii`sei}se}x`M[YMVexsV`}niR[MVn}snse[ses}xin[ixss`Vins`[Veii`}s[esixisVR[Yie`n`nR[seinexn`s`n}x}}isxiesx}x[Vni}}xi`isxxsxixiViRIRexiYe[;)%s}xsnxxs[}s}xs}i}xeie}[e[@n`s}nxsD}n`[R`[iniY;RnsxI@iDnxx}}xisn}nx`iMRseVxx}}}`xR2M@[ns}IVe@i}i[sRnIYD2;R}xnsns}}[en}ssex`n}Mx`Ieise@IMRi[2RM}xsxM2;7;nxVReMni}[YRD;sI}sxxnixsxsnsVMsx}n`sx}n`Ves`}}xnxI2DI`}s[eie}n`snMD[DRes[i[eM[x`Y `I7esxix}nR`xxsx`nxixxixnVinVnsRxes`i[Vx`7Re[[eDxR`InVn@`s[s`[Y RD`Rs`sVRI[Vxs`}sx}sxxss}sVsRnResiesiVin;`MD}[x[snIiVsVises`[eY M[RM`esnsDV[RM[V[V[nsxxs}snsn`[`[`R[RIi}seR7[i@Vsn[n}`i`Y xMR`[sM[R`iVD[R[RMRV[n}xx`}x}}Me[I}R7[@Rx[sxeRMY [}sex[seRV`[V[IV[VRMIR`}sxx}}sxVMR[}@M`[i2I2R}nMV}iexYnV[}nxRMRV[VM`[V`[MVDVI[i[In[nsin}sxxVIeI7[II`nVs@esIMs`VIYes}ne}MIV`eVeiRIV[ini[VRnxx}sxs}sxVMi`2VI[eisMVxsi[Ye`sRIR[R[M[RVe`[MID[`[V`n}n}xsM ;`M;en[`xnxsYes`x`R;[is[RVMResVMI[V`eninsi[M`n}exn[}sxxMninxYs`x`R;[i}iM@IR`V`V`n[e[xsxn[D7`ninxnM}};[in}}s`iYxni`s}iM@D[ie[i`ei`@M`xV[eV;D[x}sxDn}`xxxVxsiVRVxn}[Y }V)xnsnD[ie[i[i[niM@`Vsn[enID[V[n}`[sxMxV7@sxennsxsn`esY 2Ixn[i}sxeie[R[i[nisI@nei`ieR[essxx;x}`i}`xi}[Rxnxxnsx`snseY iD;eV[`n`esMseM[MVei[xVI@ninxnxiexsniseIn}exsxxnx`VxsiV`sY }neRn`[s`isxi`IVM[MVi7IiRV@inxnxDex}s`ii2`[iDx}[}sIMs}ni[}seMRIYxeV[`[nx`is[`in[VIMV`ixeD7Resxe`[Dexxi7VsVsDV}e7ns}s`M`s}}ein[snRnY se`i[I;DRseR`x`[Rxsxnxs2`}nn}[x}}snenRn[ne`nxiM[nV}x}sxnR[`VIVYxn[`V`[MV[n[ise`IMnxni`n}xs}`Vnssis7[xi}}snenR;`}xssiiM`xV;Ii}i}xnVY}}nxV;Mi`i[ix}e[VIR[`[n[xnxsRVxiDn}V[`RVR;`}xn;en}x[sniD`sx}ennY}VneVeR`ni`Vxxi[`e`[n`MIVixsxV`sVMieM`}iRi`snsn;ese;R@RsiiIn}xsnxY}Rxe[i[nixnie[Vs}`n`[nseV[RIDIDR[x[es`DRnsD}s}}x}}i`s7sx}xen}7ne%7exsx}xsxYIMVns}MV`[esesns[IVeVD@Msxsenei[i[M[`in}ns`Vnsx[Is}}e`ieninRixs}nn[n2xVD2Mx`DV}}xY xVnseMVinxsn`snseR;7MRineisis`RxM@D[xVesxeVnen}sx}eix}xn}nsnR;xDex@is}xxY  MeexV[MVs[Ds}x@MVRinx}is}n[MI`xsxxini[Vie`sesxe[ieinexn[i@)x}}Y!}i}VieMVR}VRnsi}Vsnxs}nxiVx`[`ixnxs}i}iM`s[ni`n}}ini[nsn[@}nVen}xY"x`ReV`inexxs}xxxnn`Mnx`VResx[D[xssnx}[i}sx`[}D;V`nin}nVi`}siY #iVRei`Vxxs}nxsnienx[Ve}senis}nin}sienx}}xni`nsinxs[@ )I}}s}}si`}ns}eY$`RIR[Rn}ni`nsx[ix}ixxDMex[Vnsixxs`R[`[M}ne`[Vei[ViiR7@n`[x}snxnxnsxY%x`RV`eVsnx}@sxesxsi}x[@[ixinxsnse`[V[R[x`xnVis[`xs;e}ni[exsn}[sxxY&[sV[V[VR[nx}e`exsnixxsRini`siiVRVMs}[x}n}sie`exnenRVMDsx}sesn`xY'@M[`V[MV[V`}}ns}e[esn`snen[nxVM[RxR;x}s}x`xnesM@i[`}iseD`ssnY([DR[`VMV[VinsxsIR`snxeVxsisxexx;iVIn@}sx}xeisi`x[DMneVRe`nsn}M[sn[ni[sY)iDVei`[`V`VeiRMV`sxniseRx}}x`}Vi}s}isenixeVI`nsi[ie[`[nsY *VeiexiMRM[Vixs}sn[i[`ssxn`sM[eR[n}i`MD.Ms}R@ix}s[eR[xs[`ne[Rn`V`ixM[VI[Y+n`ixeVMVe[nVnisxsxsnx}xe`n`eix}ixsn`i`xsn`i@`@Dsns}}s}RV[sVne[`ni[nsxnVRsinesnY ,i`xn`VRe`VIRex}isiVes}ni[Vs[MsV@M`[exn[sV`xsxsixxsiRIxe`sxi[ei[ni`e}[VxeV}@;siR`nY-e`xieVRi[i`Res}}nsnsi`seVe}[sRiMnDMsn`[}R@DRiV}}@n[sxi`Mi`e[`xsneiesR[nsn}M@[RIY.sesxnxeV[V}xnxniVsnsx}[nxneMnsnRI[xsn}s`I[VD@RsVV``s[`einen`i}I[iVsV[iIM}R@`IDeY/``R[VM`esninses}e`}}VM`esxiR[`n`[xVis}iexsRs}IDs[}`x[isx}i[xse`ie`snDeVsenxnMiVI`IMDY0}i[`I`MIisn}snxsns}xn[in}s}eiMIVs}n}VVxxexVnx`Vsnxnx[sn`}n}isMiM`xn[MDV[`;nV;[MY1}n}xsVI[x}x}ns}e`sxs`n}ne[`DRi`Vx}s`e2xs[`s`}s``nxens}}nsxs`[xxRes`[`R[M[ne`7x7Y2xniRen`VIis}isnsnsxnense`MRI`i`}x% 7e}[`eD)D}x}D2@issn`}s}ns}sVnxnxne`eR@se@I[neDY3}s`eiMVeinein[ensn[`V`[exV[s}R 2;sIi[sVi[%s`[RnsexVexxx}xsnnxxein[eV[sVRVR`Y4`ei[nxexnVeR[nxs}e`[nene`xMD}[`xsD%}xsI}[sxsRxnx}nx}sx}ie[V[V[V[V`Y5xsei[isi}s}RVMDI`ss}neR@xsx}nVnIixs[nss}s}nx}nie`[MsiR`[iY6}snisi}s}RM@DVe}[IxnxVnsi`}[}insieMsi}}V}sinxix}x`si[`Y7s}sxnxn[DRM@DVes}`RI@VRxsi}V[xVeVnVV@2Vxexen}[2}xniee`[`e[enY8nssxis[sxs}VIMIDI[ns}`RIeMVi}eMii[es`xDM@R}sn}i7n@2xsis}exne`[eY9sx}sninen`[s[MIinIRMesxsRIVeMVe`xV`MsR[`xD@`exniI 2}sis}`eRM}ei[eY:}xsI`[i`n`ReVIM`MVe}x}VD}neIRx[xVs}x@;Ve`;[R;}inR`nn}@D7`en`}xxnxi}}i}nRDi;[nxsiY;snsi}}VMVnn`DMDI[MDIxnIDRsn[ensix[s@[[eViI}i;Iisx`eDVi}eiVsMe`xsi}[}IDnY<ixnse`i`}[n`sx[VDIs`DIMxV}MV`ixi[`nsiss@[e}iD2D;7n[Vssesnx}}`i`}Rnexx`iR};7xRsY=sx}ne[nsRM`sxVRIMD[sV`IDIe[`i[`[`[i[x[ViVDenD;De}xi[V)7nI}xie2[xss`sxsx`R`sesisn`n`eVRV7Y>s}sVxeVR[ix[@MIVnRieRIRVi}[snsni}nxM7}sxRei[xsxi[V)7nxxn}M.%@[n}I`2[xsx}e[sx}eisVViIsMY?snxni[V`n`DVD@DVeV[`nxsxs}si`nx}2MsMsns`n[M2`xxneViiIiVsInRIinVeMV[`[ne}eseY@s`exnxse`inxsV[`IDIVin}xsxisV`M@e}x}se[ines}ineVi}sis@se[`n`IM[R[nsRYAe`[xsn`InxseMIMID;IMIM}nx}snxnV}s`s[MD`V}e[iR[}2}exxe}s[VsiV[I[R@IM@DR`ns}YBnessVM7Rns`;I@DIDIDIMIn`ei`s}nnVxies[`eDRi7M[nRsRen}}nIs}[`s[VM[DVx}RDMI@DR`MeYC[xnVR@RV`sVM@I@IR`eRIV[Iinsi[i`[e`nD[iMexn2MxnMIs}i}xe2siVnM[DVx}R@7;7;V`i`M[niYDn[@RMI@De[nixV@D@D`}s}nVei@VsnsR[n`nsex}``}M@[I@I7DMxn}`[Vssxeixin}s`MexeI@7;7;Vi`ie[n}YEe[VMIRi`Vi`@MiR@Dixix}nixD@nnixDV[`n}xxein`ni`}VDVnDeM[R@`[Re}}neIRs`V}e.sxe[}eesnsi`[R`MD@`i`ie[nYFiMVe`MV`[M@[7ix[D@ReiVe`[nDiseD[[s[M`[2M;n@DIRResx}VRnMn[.@[`M[en[}ins`R`MDR[seis[RViIRniYG`i[MIRMIMDeM`xs[Me[Vi[es[i`MsVx}iI`eis`ix2@VRD[iRM[[IxnV;snDxnRVnen[}VM[e`Ix2M`[I}niY Hi[MRIRIRV}sxsiVxsDe`}`}xV[sn`eieRnVRMID);[i@RsR`esVe}}sVIxsiiIesxxI[@;`nRDesM;DI`ix}YIsVIVMVRMsiM[s}sn`[IV[n}}eDeis}[}nei[RMIeRI`V7@RV;@D;s}n`MenV}sn}`eisRVein}e}eineR[s[IRni}YJi[DIVDV[MIR[`sIRseR[MVRM;}s}[isVI}eeD`x[e`D[MRxM2[`M;eiI)IVR;ixRnV[sVesxi; xsI`isiV`xs}nesiVDI7.;@nxnsRVYK`MI[`V[n[V[@ix[VI7Vn`enxi;xRiMenn[nxxIVe@IsRns}i7DMI`xinRx[2sI[is[}V@MRis`i[`eVxV[I%;2IRi}`nVe}2;YL`e[@V`R[`n;IM`RMD[n`I`I7V[VR}x}In}RiRV;V[}nMnisM2Mi[;RVRiR7 IxiRDinei77n7@`x}V}exR`iiR}ne[esVsiRDI%.;D}I[@7YMnx`D@[V[RneM[IR`iV2M[xnxnxMVnRsx[ss}RVeRD`sMD;D[V7%Ii`in`Mie[IRxVie;2Ininine`sRexsx}e`xxRiVRMie`esi}n.[R;i;@)Y Nnsi[V`[ViVIDRineV;e[}iDx`Rni`R7Rsx`MIiI[IMRVi})2e}exMDxe;ei%Vs`eVR`Is[`[e}e[@R}DIe`}`VneVM;@MxI7%Y Osn[ns`sVR@DIV[ni[Rsne`n}eIn}s`Rx}[eVx`neMnn`;I}V[siMVeDVD2M}VseD@e}@;IDIV}VD[}IMx[M`IieV[Vsx`nD`R;[snesxsR[iRMRYPeVsi[e``@;IenxMIM}`M`nR72nsD[nx`n`ni[exexI)VsR@[x[@I@.MsV7`7`iMn`MDMn@D@Rn}Mx}sM[I`[}`nsnVRni`;72D[`eei`[V[D[VsxYQsns[Vsx[ienenx[D@nsxR;`[@VieI[iVR`i}sxRenI;7`[;RI@7@n`[Iix7Vin7DM`[DRD;ie``}seisnesxn[@;Ve;RsnxienV[R;`iVMsxYRse`}}en[s`eMVRD}eisVRnMx`}[nVxRs}[i.e[7;InsIMnie`[MVs[R`i@;I[snRIDxsenx`M`s}xe2;MVRMInR`IMeVD;`s@I`YSnxsn}siDIi`e.I@[2`n[iR}e[Iexsx@.DIDeRDeMV}sxe};iD@R`` DVxiRnxsx}sVR[ix[IMD[e[Mni`I;RD[M`sYTx}Rs}2nesin[MixMIieM2[sesnxeDxieneRi}s`RV[IV[ns[[xIDeseiM@Ms.;esnDRMs}sVIni[`nxieResDViM`[ns`ixYUseI[V`neRDnV}RiniIsM}[sVI[nMiRIVDeIM[nenRiRn[s}[xsRDixx[iRM[;@xi;M}[Resx`i[ns`e@[I;RVeixYVMVniRVi`R[RnD;2MRin}iee[nxx@}s[ex`M;)MsM%nRMD@DIsxViisnR.)eis`siVM`}sniMI`[M}}`snisnsxn[Di72)x[2@`MieYWDRes}nDMinVIV[e)2exRVMDse[e`xDesnD`[sn7;`[xeM@IVMIRV@exsiRVis}seIVMe}ins`nM}isesnsn}snsi`R)7;e2Vs`niYX`[esVsni[RxxR}sI@RV}ee`ns`se@IRVDenVe`Mxex[27Rn[ieinein` .in@DM`eeM`s[e}xsRix[nisnsnsMsnRV.%.7Mx`snYYnenI`n[VsxDRn[n;%iiVsnxininsR.@;`ixII2IRe[D.2Rxs`}n`nsiD`s}.2R[M[`ns}sexnsiMVseMs}sx}}iM[VRDRx[)2RniY"Z`[`}`@MVee[R[`xIxMiix`nn`}R@7}x;[RMD.D2[e@2RsiVxnn`;2DnxiD.D[VnxV`x`ssn7Mxx[nxn[xVDs[Ms`I[Rn`Y[nMs}e@Mn}ne}i}RnnnVMexieIenM[;i;MIVV7DIDI`M`}enxi}[2I`M}e[n`}`@RVesVeDsnsI`}}sxxn`e}RD`D;esV.snieY\VMI`}}x}en}s}xVeiexe;2M}7Rxse;7@inDI[@R[``nx`e}s;%V`7@esnRi`nRI`es[R[}si[e}x}xn`sn`RMVMVMnenY]@`}n}ex}ns[Rx2Mn`DM@[IMxRIVD};[@DD@[;%@Mne[sx[xR}R[D@;Issine}i2M`VxnsnVR}inni[`n[}x}RIR[`[`[}Y^72V}xVD}e`[}[[@VDn`eDRV;I7VR2Msi@e`nMR[si`iD}i`siM@s;)VsDVMex@[nR`e}es`niM7e}x}i`nsns}sVe[e[iIRnxn}Y_D@.R}x``xi}}R}I)I@[M DRI@[iRi;.M2D7I[IV@M}nxV2)eVxI[s`s`eV@Ms[n}nI@RVsexnV[`esis`}`iVi`Ve[i[eY`[I);M[i}`Rn}R[sMsMni[``%)M[VRVRMs@IR}V;%I`sR`IRiM}nVMI%7;exVsn`Vi[RIM[}xsnR}enVR[esxx[nsV[nsini`is`enxYaD2 .@7D`s}s}Vx`}R}nsn[VM}e2@MnR;D@ .IV`i2;[n[MIsVIVn`[x;@V@[@RxMIMRnxsseRI[}Rxe`R`VnsV@sDMDD`nsx`i`i[i[`VeYb)D`nR@e`R`ii}@`}nDIMi[2Vxe;2[2@I;I;I@R7;[`neiInI`I7sV`IDen2DReRIVMI`M@snxs[s}`I[n`[nxi[isx}sxR;I;[exse`[eYceeIsx`M`nix}V}R`Vi}`RxI7;[M`x[%i IR7M[@M@VD;es}MV27e[[D.%7IMnDMI;I[Iis}sVns`VM[n`eie[`nixieRMRM`sxn[`[enenYdeeIsxe`RisiVes[`iiMeVM;D@iVniV.InD;2[xVM.D[sV@[VnVDMIesMD;V}[n`[DRnsxsx}si`[V[RR;ID;IVMe}V`ini[e}siV`ei[sgdalautotest-3.0.4/gdrivers/data/gsg_ascii.grd0000644003401500001440000000330113614004466021015 0ustar rouaultusersDSAA 20 20 440750 441890 3750150 3751290 74 255 181 181 156 148 156 156 156 181 132 148 115 132 107 107 107 107 107 115 99 107 173 247 255 206 132 107 140 123 148 132 165 165 148 140 132 123 107 123 107 123 156 181 140 173 123 132 99 115 123 74 115 99 123 140 156 132 165 140 140 99 189 173 140 140 165 115 132 90 99 115 90 99 99 107 99 132 99 107 132 132 165 148 156 123 107 107 107 115 140 99 115 99 99 107 115 132 115 90 123 115 140 107 140 90 107 115 107 90 99 123 115 115 115 123 123 148 115 148 99 132 148 132 132 107 123 99 99 115 99 132 99 140 115 148 123 99 132 123 148 140 173 148 99 123 123 107 123 99 107 189 173 107 115 115 107 99 140 107 173 140 123 123 123 107 140 123 123 115 115 90 107 173 107 107 107 107 99 132 123 115 132 132 132 123 99 132 123 107 148 99 115 123 140 173 123 107 123 123 123 107 140 140 99 140 99 115 123 107 132 107 115 107 115 123 132 123 107 123 132 132 123 115 132 115 123 132 115 132 132 123 123 132 99 115 99 123 132 115 115 107 148 123 148 115 148 123 140 123 107 115 132 115 107 115 99 123 99 181 99 107 197 173 148 140 140 132 99 132 123 115 140 132 132 99 132 123 132 173 123 115 189 173 173 148 148 115 148 123 107 132 115 132 156 99 123 115 132 132 206 107 132 156 132 140 132 132 115 115 115 123 148 123 165 123 132 107 107 132 156 123 148 132 123 123 115 132 132 123 115 123 115 123 107 115 148 107 115 140 115 132 115 132 140 132 123 115 140 107 140 115 132 123 107 132 132 115 115 107 115 107 115 132 107 123 148 115 165 115 140 107 123 123 99 132 123 132 132 132 99 156 107 123 132 115 132 132 140 132 132 132 107 132 107 132 132 107 123 115 156 148 gdalautotest-3.0.4/gdrivers/data/LDEM_4.LBL0000644003401500001440000001027213614004466017673 0ustar rouaultusersPDS_VERSION_ID = "PDS3" /*** GENERAL DATA DESCRIPTION PARAMETERS ***/ PRODUCT_VERSION_ID = "V1.04" DATA_SET_ID = "LRO-L-LOLA-4-GDR-V1.0" PRODUCT_ID = "LDEM_4" INSTRUMENT_HOST_NAME = "LUNAR RECONNAISSANCE ORBITER" INSTRUMENT_NAME = "LUNAR ORBITER LASER ALTIMETER" INSTRUMENT_ID = "LOLA" MISSION_PHASE_NAME = {"COMMISSIONING","NOMINAL MISSION"} TARGET_NAME = MOON START_TIME = 2009-07-13T17:33:17.246 STOP_TIME = 2010-09-16T19:15:57.239 PRODUCT_CREATION_TIME = 2010-12-15T00:00:00 PRODUCER_ID = LRO_LOLA_TEAM PRODUCER_FULL_NAME = "DAVID E. SMITH" PRODUCER_INSTITUTION_NAME = "GODDARD SPACE FLIGHT CENTER" DESCRIPTION = "This data product is a shape map (radius) of the Moon at a resolution of 4 pix/deg by 4 pix/deg, based on altimetry data acquired through mission phase LRO_NO_13 by the LOLA instrument. The preliminary LOLA data are the source for this data set. The ground tracks were interpolated using the Generic Mapping Tools programs 'surface' and 'grdblend'. The map is in the form of a binary table with one row for each 0.25 degrees of latitude, pixel registered. Map values are relative to a radius of 1737.4 km. This label describes an IMG file in the form of a binary resampling to pixel registration. " OBJECT = UNCOMPRESSED_FILE FILE_NAME = "LDEM_4.IMG" RECORD_TYPE = FIXED_LENGTH FILE_RECORDS = 720 RECORD_BYTES = 2880 ^IMAGE = "LDEM_4.IMG" OBJECT = IMAGE NAME = HEIGHT DESCRIPTION = "Each sample represents height relative to a reference radius (OFFSET) and is generated using preliminary LOLA data produced by the LOLA team." LINES = 720 LINE_SAMPLES = 1440 SAMPLE_TYPE = LSB_INTEGER SAMPLE_BITS = 16 UNIT = METER SCALING_FACTOR = 0.5 OFFSET = 1737400. /* NOTE: */ /* Conversion from Digital Number to HEIGHT, i.e. elevation in meters, is: */ /* HEIGHT = (DN * SCALING_FACTOR). */ /* The conversion from Digital Number to PLANETARY_RADIUS in meters is: */ /* PLANETARY_RADIUS = (DN * SCALING_FACTOR) + OFFSET */ /* where OFFSET is the radius of a reference sphere. */ /* The planetopotential TOPOGRAPHY is PLANETARY_RADIUS - GEOID_RADIUS, */ /* where GEOID_RADIUS is derived from a gravitational equipotential model. */ /* By convention, the average GEOID_RADIUS at the equator is OFFSET. */ END_OBJECT = IMAGE END_OBJECT = UNCOMPRESSED_FILE OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = "SIMPLE CYLINDRICAL" MAP_RESOLUTION = 4 A_AXIS_RADIUS = 1737.4 B_AXIS_RADIUS = 1737.4 C_AXIS_RADIUS = 1737.4 FIRST_STANDARD_PARALLEL = 'N/A' SECOND_STANDARD_PARALLEL = 'N/A' POSITIVE_LONGITUDE_DIRECTION = "EAST" CENTER_LATITUDE = 0. CENTER_LONGITUDE = 180. REFERENCE_LATITUDE = 'N/A' REFERENCE_LONGITUDE = 'N/A' LINE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 720 SAMPLE_FIRST_PIXEL = 1 SAMPLE_LAST_PIXEL = 1440 MAP_PROJECTION_ROTATION = 0.0 MAP_SCALE = 7.5808376060 MAXIMUM_LATITUDE = 90 MINIMUM_LATITUDE = -90 WESTERNMOST_LONGITUDE = 0 EASTERNMOST_LONGITUDE = 360 LINE_PROJECTION_OFFSET = 359.5 SAMPLE_PROJECTION_OFFSET = 719.5 COORDINATE_SYSTEM_TYPE = "BODY-FIXED ROTATING" COORDINATE_SYSTEM_NAME = "MEAN EARTH/POLAR AXIS OF DE421" END_OBJECT = IMAGE_MAP_PROJECTION END gdalautotest-3.0.4/gdrivers/data/LanduseSmall.mp#0000644003401500001440000001277113614004466021367 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/uint16-old-elevation-extension.gpkg0000644003401500001440000004600013614004466025144 0ustar rouaultusersSQLite format 3@ & 'GPKG -    !sf 11[;kUndefined cartesian SRSNONEundefinedundefined cartesian coordinate reference system \=mUndefined geographic SRSNONEundefinedundefined geographic coordinate reference system ff + WGS 84 geodeticEPSGGEOGCS["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"]]longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid % ++C=ogr_empty_tablefeaturesogr_empty_tableTechnical table needed to be conformant with Requirement 17 of the GeoPackage specification2018-03-21T14:30:26.812ZP 3 =uint162d-gridded-coverageuint162018-03-21T14:30:26.812Z98@9=hW +ogr_empty_table  uint16 +ogr_empty_table  uint16 ||9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents9M'indexsqlite_autoindex_g55)tablegpkg_spatial_ref_sysgpkg_spatial_ref_sysCREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER NOT NULL,definition TEXT NOT NULL,description TEXT) &a&9M'indexsqlite_autoindex_gpkg_contents_1gpkg_contents''wtablegpkg_contentsgpkg_contentsCREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id)) $$9955_tablegpkg_tile_matrix_setgpkg_tile_matrix_set CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id))9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents uint16hW98@9=   uint16 nnG[5indexsqlite_autoindex_gpkg_tile_matrix_set_1gpkg_tile_matrix_set   uint16<<   uint16 ::C--9tablegpkg_tile_matrixgpkg_tile_matrixCREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name)) JJP ++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)k 1tableuint16uint16CREATE TABLE "uint16" (id INTEGER PRIMARY KEY AUTOINCREMENT,zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,UNIQUE (zoom_level, tile_column, tile_row))+ ?indexsqlite_autoindex_uint16_1uint16?S-indexsqlite_autoindex_gpkg_tile_matrix_1gpkg_tile_matrix 77F PNG  IHDRrIDAT(=/AO'fk2@;w'H!AEPG ɒ &33A>m|V Al6F Ze`U U6J 7`,X4*` Ih`5Lȃbo$]GAA5Nf4UgUq B$Gc7AuP;nf̂uh_;;\< [/AͲsϐYDYI4dEIݫjTUUT7{Rp6"l}//4E'G׭7YP\D߽v1عuziEf؛*;j[ܺEsE2-(hN^ "ydSE2JYddM$7>{'8j1YeOi="n| ;f?cP9IENDB`  !I gpkg_2d_gridded_tile_ancillary  uint16%Q gpkg_2d_gridded_coverage_ancillary hphz5!uint16tile_datagpkg_elevation_tileshttp://www.geopackage.org/spec/#extension_tiled_gridded_elevation_dataread-write I5!gpkg_2d_gridded_tile_ancillarygpkg_elevation_tileshttp://www.geopackage.org/spec/#extension_tiled_gridded_elevation_dataread-write Q5!gpkg_2d_gridded_coverage_ancillarygpkg_elevation_tileshttp://www.geopackage.org/spec/#extension_tiled_gridded_elevation_dataread-write aa)5uint16tile_datagpkg_elevation_tiles8I5gpkg_2d_gridded_tile_ancillarygpkg_elevation_tiles;Q5 gpkg_2d_gridded_coverage_ancillarygpkg_elevation_tiles 44cwQindexsqlite_autoindex_gpkg_2d_gridded_coverage_ancillary_1gpkg_2d_gridded_coverage_ancillaryzQQ_tablegpkg_2d_gridded_coverage_an= Q+indexsqlite_autoindex_gpkg_extensions_1gpkg_extensionsw ++%tablegpkg_extensionsgpkg_extensionsCREATE TABLE gpkg_extensions (table_name TEXT,column_name TEXT,extension_name TEXT NOT NULL,definition TEXT NOT NULL,scope TEXT NOT NULL,CONSTRAINT ge_tce UNIQUE (table_name, column_name, extension_name))   uint16integer   uint16cillarygpkg_2d_gridded_coverage_ancillaryCREATE TABLE gpkg_2d_gridded_coverage_ancillary (id INTEGER PRIMARY KEY AUTOINCREMENT,tile_matrix_set_name TEXT NOT NULL UNIQUE,datatype TEXT NOT NULL DEFAULT 'integer',scale REAL NOT NULL DEFAULT 1.0,offset REAL NOT NULL DEFAULT 0.0,precision REAL DEFAULT 1.0,data_null REAL,CONSTRAINT fk_g2dgtct_name FOREIGN KEY('tile_matrix_set_name') REFERENCES gpkg_tile_matrix_set ( table_name )CHECK (datatype in ('integer','float'))) #  uint16J@_\(@6Cf   uint16 eDo77tablegpkg_geometry_columnsgpkg_g%I]7indexsqlite_autoindex_gpkg_geometry_columns_2gpkg_geometry_columns$I]7indexsqlite_autoindex_gpkg_geometry_columns_1gpkg_geometry_columns#cIIAtablegpkg_2d_gridded_tile_ancill[oIindexsqlite_autoindex_gpkg_2d_gridded_tile_ancillary_1gpkg_2d_gridded_tile_ancillary ++Stableogr_empty_tableogr_empty_table&CREATE TABLE "ogr_empty_table" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" GEOMETRY)arygpkg_2d_gridded_tile_ancillaryCREATE TABLE gpkg_2d_gridded_tile_ancillary (id INTEGER PRIMARY KEY AUTOINCREMENT,tpudt_name TEXT NOT NULL,tpudt_id INTEGER NOT NULL,scale REAL NOT NULL DEFAULT 1.0,offset REAL NOT NULL DEFAULT 0.0,min REAL DEFAULT NULL,max REAL DEFAULT NULL,mean REAL DEFAULT NULL,std_dev REAL DEFAULT NULL,CONSTRAINT fk_g2dgtat_name FOREIGN KEY (tpudt_name) REFERENCES gpkg_contents(table_name),UNIQUE (tpudt_name, tpudt_id)) {sUWGS 84 3DEPSGsGEODCRS["WGS 84",DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1.0]]],CS[ellipsoidal,3], AXIS["latitude",north,ORDER[1],ANGLEUNIT["degree",0.01745329252]], AXIS["longitude",east,ORDER[2],ANGLEUNIT["degree",0.01745329252]], AXIS["ellipsoidal height",up,ORDER[3],LENGTHUNIT["metre",1.0]],ID["EPSG",4979]]786982138982,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"]] ``W5oNAD27 / UTM zone 11NEPSGhWPROJCS["NAD27 / UTM zone 11N",GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9 "+ogr_empty_tablegeomGEOMETRY + ogr_empty_tablegeom + ogr_empty_tableeometry_columns"CREATE TABLE gpkg_geometry_columns (table_name TEXT NOT NULL,column_name TEXT NOT NULL,geometry_type_name TEXT NOT NULL,srs_id INTEGER NOT NULL,z TINYINT NOT NULL,m TINYINT NOT NULL,CONSTRAINT pk_geom_cols PRIMARY KEY (table_name, column_name),CONSTRAINT uk_gc_table_name UNIQUE (table_name),CONSTRAINT fk_gc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gc_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id)) gdalautotest-3.0.4/gdrivers/data/envistat.hdr0000644003401500001440000000020313614004466020721 0ustar rouaultusersENVI samples = 2 lines = 2 bands = 6 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq byte order = 0 gdalautotest-3.0.4/gdrivers/data/offscale_byte.tif0000644003401500001440000000167013614004466021707 0ustar rouaultusersII*(S     -0.00395256916996050006 1.00395256916999998 N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|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{skkkkksckgdalautotest-3.0.4/gdrivers/data/float.img0000644003401500001440000033650413614004466020210 0ustar rouaultusersEHFA_HEADER_TAG@RgH rootroot1AH RRLayer_132110022Eimg_Layer1A @@ Ehfa_Layer10022Ehfa_Layer1A0 I n0Statistics10022Esta_Statisticsrs1A uD@1D@܄D@ 3D@!VD@; sڦ?Z<StatisticsParametersEimg_StatisticsParameters8301Ahp Descriptor_TableersEdsc_TableticsParameters8301AVZb#Bin_Function#eersEdsc_BinFunctionrameters8301A uD@1D@."ZHistogramion#eersEdsc_Columntionrameters8301AoZZHistogramParametersEimg_StatisticsParameters8301Apx  uD@1D@h_ss_4_132110023Eimg_Layer_SubSample1A33 33Ehfa_Layer10023Ehfa_Layer1A{2601:fdata,}RasterDMS,.|4RasterDMS10023Edms_State1A) ʗz%1AfPJRRDNamesList022Eimg_RRDNamesList1AXIMAGINE 2X2 Resamplingwfloat.img(:Layer_1:_ss_4_)oimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.{4096:fdata,}RasterDMS,.R IMGFormatInfo22ImgFormatInfo8311A(fV P RasterDMS10022Edms_State1Af V  .J#mr!\  ! s.1b` i v `cS S  N 1A I sMap_Info10022Eprj_MapInfo1A Transverse Mercator A+[A A1[A* Y@Y@B metersV  Projection10022Eprj_ProParameters1A  Transverse Mercator x#?jk@AcA GRS 1980@TXA?XA@k{?˯MXAI 0XDatumtion10022Eprj_Datumameters1A8GDA94H&1<0Gz @T㥛#@~b>&>9*>2iĵ> Eu?85444443333322221111100000/////.....-----B$B$;B$|B$ B$ B$ AB$ B$ B$ B$B$B$GB$ B$ B$ B$ MB$ B$ B$ B$TB$NB$B$B$B$ TB$ B$ B$ B$ ZB$ B$B$B$B$B$ZB$B$ B$ B$ `B$ B$ B$ %B$ gB$B$aB$B$B$%B$gB$ B$ B$ +B$ mB$ B$ B$B$B$,B$mB$B$B$2B$ sB$ B$ B$ 8B$ zB$2B$tB$B$B$8B$zB$B$ B$ >B$ B$ B$ B$B$B$?B$B$B$B$EB$B$ B$ B$ KB$ B$B$EB$B$B$ B$KB$B$B$B$QB$ B$ B$ B$B$B$B$RB$B$B$B$XB$B$B$B$ ^B$ B$B$XB$B$B$B$^B$B$B$#B$dB$B$ B$ )B$B$B$#B$eB$B$B$)B$kB$B$B$/B$qB$ B$)B$kB$B$B$0B$qB$B$B$6B$wB$B$B$<B$qB$B$B$6B$wB$B$B$B$B$B$"1B$!sB$ B$B$7B$yB$B$B$>B$B$B$B$DB$B$B$ B$JB$"B$!B$!>B$ B$B$B$DB$B$B$ B$JB$B$B$B$QB$B$B$#DB$"B$!B$! B$ JB$B$B$B$QB$B$B$B$WB$B$B$B$]B$#B$#B$"QB$!B$ B$ B$WB$B$B$B$]B$B$B$"B$dB$B$B$$WB$#B$"B$"B$!]B$ B$B$"B$dB$B$B$(B$jB$B$B$/B$pB$%B$$B$$"B$#cB$"B$!B$!(B$ jB$B$B$/B$pB$B$B$5B$wB$B$B$&(B$%jB$$B$#B$#/B$"pB$!B$ B$ 5B$wB$B$B$;B$}B$B$B$BB$B$&B$%B$%5B$$vB$#B$"B$";B$!}B$ B$ B$BB$B$B$B$HB$B$B$ B$';B$&}B$%B$%B$$AB$#B$"B$"B$!HB$ B$B$ B$NB$B$B$B$UB$B$'B$'B$&HB$%B$$B$$ B$#NB$"B$!B$!B$ UB$B$B$B$[B$B$B$ B$) B$(NB$'B$&B$&B$%TB$$B$#B$#B$"[B$!B$ B$ B$aB$B$B$&B$hB$B$)B$(B$(B$'[B$&B$%B$%B$$aB$#B$"B$"&B$!hB$ B$B$,B$nB$B$B$3B$*B$)aB$(B$'B$'&B$&gB$%B$$B$$,B$#nB$"B$!B$!3B$ tB$B$B$9B${B$B$*B$)B$),B$(nB$'B$&B$&2B$%tB$$B$#B$#9B$"{B$!B$ B$ ?B$B$B$B$FB$+2B$*tB$)B$(B$(9B$'zB$&B$%B$%?B$$B$#B$#B$"FB$!B$ B$ B$LB$B$3 A E<5.& B$B$B$B$ZB$B$`B$B$B$%B$fB$B$B$+B$mB$B$B$B$+B$mB$B$B$1B$sB$B$B$8B$yB#B#B#>B#B#B#B$ 2B$sB$B$B$8B$yB$B$B$>B$B$B$B$DB#B#B# B#JB#B#B#B#QB#B#B#B#WB#B$ B$B$>B$B$B$B$DB$B$B$ B$KB$B$B$B#QB#B#B#B#WB#B#B#B#]B#B#B#"B#cB#B#B#(B#jB#B#B$ EB$ B$B$ B$KB$B$B$B$QB$B$B$B$WB$B#B#B#]B#B#B#"B#dB#B#B#(B#jB#B#B#/B#pB#B#B#5B#vB#B#B#;B#|B#B#B#AB$ B$ B$ QB$B$B$B$WB$B$B$B$^B$B$B$"B$dB#B#B#)B#jB#B#B#/B#pB#B#B#5B#wB#B#B#;B#}B#B#B#AB#B#B#B#HB#B#B# B#NB#B#B#B#TB#B#B$ XB$ B$ B$ B$^B$B$B$#B$dB$B$B$)B$jB$B$B$/B#qB#B#B#5B#wB#B#B#;B#}B#B#B#BB#B#B#B#HB#B#B# B#NB#B#B#B#TB#B#B#B#ZB#B#B#B#aB#B#B#%B#gB#B#B#,B$ B$ #B$ dB$ B$B$)B$jB$B$B$/B$qB$B$B$5B$wB$B#B#B#B#B#B#DB#B#B# B#JB#B#B#B#PB#B#B#B#WB#B#B$@B$B$B$B$FB$ B$ B$ B$ MB$ B$ B$ B$SB$B$B$B$YB$B$B$B$`B$B$B$$B#fB#B#B#+B#lB#B#B#1B#sB#B#B#7B#yB#B#B#>B#B#B#B#DB#B#B# B#JB#B#B#B#QB#B#B#B#WB#B#B#B#]B#B#B#"B#dB$B$ B$MB$B$B$B$ SB$ B$ B$ B$ YB$ B$B$B$`B$B$B$$B$fB$B$B$+B$lB$B#B#1B#sB#B#B#7B#yB#B#B#>B#B#B#B#DB#B#B# B#JB#B#B#B#QB#B#B#B#WB#B#B#B#]B#B#B#"B#dB#B#B#(B#jB#B#B$SB$B$B$B$YB$B$ B$ B$ `B$ B$ B$ $B$ fB$B$B$+B$lB$B$B$1B$sB$B$B$7B$yB#B#B#>B#B#B#B#DB#B#B# B#JB#B#B#B#QB#B#B#B#WB#B#B#B#]B#B#B#"B#dB#B#B#)B#jB#B#B#/B#pB#B#B#5B#wB$B$B$`B$B$B$%B$fB$ B$ B$ +B$ lB$ B$ B$ 1B$sB$B$B$8B$yB$B$B$>B$B$B$B$DB#B#B# B#KB#B#B#B#QB#B#B#B#WB#B#B#B#^B#B#B#"B#dB#B#B#)B#jB#B#B#/B#qB#B#B#5B#wB#B#B#B$B$B$B$DB$B$B$ B$KB$B$B$B#QB#B#B#B#WB#B#B#B#^B#B#B#"B#dB#B#B#)B#jB#B#B#/B#qB#B#B#5B#wB#B#B#B$ B$ B$ B$ DB$ B$B$ B$KB$B$B$B$QB$B$B$B$WB$B#B#B#^B#B#B#"B#dB#B#B#)B#jB#B#B#/B#qB#B#B#5B#wB#B#B#B$B$B$B$DB$B$ B$ B$ KB$ B$ B$ B$ QB$B$B$B$WB$B$B$B$^B$B$B$"B$dB#B#B#)B#jB#B#B#/B#qB#B#B#6B#wB#B#B#B#B#B#B#iB#B#B#-B#oB#B#B#4B#uB#޷B#B#:B#|B#۽B#B#@B#قB#B#B#GB#ֈB#B# B#MB#ӏB#B#B#TB#ЕB#B#B#ZB#͜B#B#B#`B#ʢB#B#%B#gB#ǨB#B#+B#mB#įB#B#2B#sB#B#B#8B#zB#B#B#?B#B#B#B#EB#B#B# B#KB#B#B#4B#uB#B#B#:B#|B#B#B#AB#ނB#B#B#GB#ۉB#B# B#MB#؏B#B#B#TB#ՕB#B#B#ZB#ҜB#B#B#`B#ϢB#B#%B#gB#̨B#B#,B#mB#ɯB#B#2B#tB#ƵB#B#8B#zB#üB#B#?B#B#B#B#EB#B#B# B#LB#B#B#B#RB#B#B#B#|B#B#B#AB#B#B#B#GB#B#B# B#MB#ݏB#B#B#TB#ڕB#B#B#ZB#לB#B#B#aB#ԢB#B#%B#gB#ѩB#B#,B#mB#ίB#B#2B#tB#˵B#B#9B#zB#ȼB#B#?B#ƁB#B#B#EB#ÇB#B# B#LB#B#B#B#RB#B#B#B#XB#B#B#B#_B#B#B#GB#B#B# B#MB#B#B#B#TB#ߕB#B#B#ZB#ܜB#B#B#aB#٢B#B#%B#gB#֩B#B#,B#mB#ӯB#B#2B#tB#еB#B#9B#zB#ͼB#B#?B#ˁB#B#B#EB#ȇB#B# B#LB#ōB#B#B#RB#”B#B#B#YB#B#B#B#_B#B#B#$B#eB#B#B#*B#B#B#B#TB#B#B#B#ZB#B#B#B#aB#ޢB#B#&B#gB#۩B#B#,B#nB#دB#B#2B#tB#նB#B#9B#zB#ҼB#B#?B#ЁB#B#B#FB#͇B#B# B#LB#ʎB#B#B#RB#ǔB#B#B#YB#ĚB#B#B#_B#B#B#$B#fB#B#B#*B#lB#B#B#1B#rB#B#B#ZB#B#B#B#aB#B#B#&B#gB#B#B#,B#nB#ݯB#B#2B#tB#ڶB#B#9B#zB#׼B#B#?B#ՁB#B#B#FB#҇B#B# B#LB#ώB#B#B#RB#̔B#B#B#YB#ɚB#B#B#_B#ơB#B#$B#fB#çB#B#+B#lB#B#B#1B#sB#B#B#7B#yB#B#B#>B#B#B#&B#gB#B#B#,B#nB#B#B#2B#tB#߶B#B#9B#zB#ܼB#B#?B#ځB#B#B#FB#ׇB#B# B#LB#ԎB#B#B#SB#єB#B#B#YB#ΛB#B#B#_B#ˡB#B#$B#fB#ȧB#B#+B#lB#ŮB#B#1B#sB#´B#B#7B#yB#B#B#>B#B#B#B#DB#B#B#,B#nB#B#B#2B#tB#B#B#9B#zB#B#B#?B#߁B#B#B#FB#܇B#B# B#LB#َB#B#B#SB#֔B#B#B#YB#ӛB#B#B#_B#СB#B#$B#fB#ͧB#B#+B#lB#ʮB#B#1B#sB#ǴB#B#8B#yB#ĻB#B#>B#€B#B#B#DB#B#B# B#KB#B#B#B#QB#B#B#9B#zB#B#B#?B#B#B#B#FB#B#B# B#LB#ގB#B#B#SB#۔B#B#B#YB#؛B#B#B#_B#աB#B#$B#fB#ҨB#B#+B#lB#ϮB#B#1B#sB#̴B#B#8B#yB#ɻB#B#>B#ǀB#B#B#EB#ĆB#B# B#KB#B#B#B#QB#B#B#B#XB#B#B#?B#B#B#B#FB#B#B# B#LB#B#B#B#SB#B#B#B#YB#ݛB#B#B#_B#ڡB#B#$B#fB#רB#B#+B#lB#ԮB#B#1B#sB#ѴB#B#8B#yB#λB#B#>B#̀B#B#B#EB#ɆB#B# B#KB#ƍB#B#B#QB#ÓB#B#B#XB#B#B#B#^B#B#B##B#eB#B# B#LB#B#B#B#SB#B#B#B#YB#B#B#B#_B#ߡB#B#$B#fB#ܨB#B#+B#lB#ٮB#B#1B#sB#ִB#B#8B#yB#ӻB#B#>B#рB#B#B#EB#ΆB#B# B#KB#ˍB#B#B#RB#ȓB#B#B#XB#ŚB#B#B#^B# B#B##B#eB#B#B#*B#kB#B#B#SB#B#B#B#YB#B#B#B#_B#B#B#$B#fB#B#B#+B#lB#ޮB#B#1B#sB#۴B#B#8B#yB#ػB#B#>B#րB#B#B#EB#ӆB#B# B#KB#ЍB#B#B#RB#͓B#B#B#XB#ʚB#B#B#_B#ǠB#B##B#eB#ħB#B#*B#kB#B#B#0B#rB#B#B#7B#xB#B#B#_B#B#B#$B#fB#B#B#+B#lB#B#B#1B#sB#B#B#8B#yB#ݻB#B#>B#ۀB#B#B#EB#؆B#B# B#KB#ՍB#B#B#RB#ғB#B#B#XB#ϚB#B#B#_B#̠B#B##B#eB#ɧB#B#*B#kB#ƭB#B#0B#rB#ôB#B#7B#xB#B#B#=B#B#B#B#fB#B#B#+B#lB#B#B#1B#sB#B#B#8B#yB#B#B#>B#B#B#B#EB#݆B#B# B#KB#ڍB#B#B#RB#דB#B#B#XB#ԚB#B#B#_B#ѠB#B##B#eB#ΧB#B#*B#kB#˭B#B#0B#rB#ȴB#B#7B#xB#źB#B#=B#B#B#B#DB#B#B# B#JB#B#B#1B#sB#B#B#8B#yB#B#B#>B#B#B#B#EB#B#B# B#KB#ߍB#B#B#RB#ܓB#B#B#XB#ٚB#B#B#^B#֠B#B##B#eB#ӧB#B#*B#kB#ЭB#B#0B#rB#ʹB#B#7B#xB#ʺB#B#=B#B#B#B#DB#ŅB#B# B#JB#ŒB#B#B#QB#B#B#B#yB#B#B#>B#B#B#B#DB#B#B# B#KB#B#B#B#QB#B#B#B#XB#ޚB#B#B#^B#۠B#B##B#eB#اB#B#*B#kB#խB#B#0B#rB#ҴB#B#7B#xB#ϺB#B#=B#B#B#B#DB#ʅB#B# B#JB#njB#B#B#QB#ĒB#B#B#WB#B#B#B#^B# J@97777777777777777777777B# B#LB#B#B#B#RB#B#B#B#B#YB#B#B#B#_B#B#B#_B#B#B#$B#fB#B#B#*B#B#B#+B#lB#B#B#1B#sB#B#1B#sB#B#B#8B#yB#B#B#>B#B#B#>B#B#B#B#EB#B#B#EB#B#B# B#KB#B#B#B#QB#B#B#RB#B#B#B#XB#B#B#XB#B#B#B#_B#B#B##B#eB#B#$B#eB#B#B#*B#lB#B#B#lB#B#B#1B#rB#B#B#7B#yB#B#7B#yB#B#B#>B#B#B#B#B#B#B#DB#B#B# B#KB#B# B#KB#B#B#B#QB#B#B#B#B#B#B#XB#B#B#B#^B#B#B#^B#B#B##B#eB#B#B#*B#B#B#*B#kB#B#B#0B#rB#B#0B#rB#B#B#7B#xB#B#B#=B#B#B#=B#B#B#B#DB#B#B#DB#B#B# B#JB#B#B#B#QB#B#B#QB#B#B#B#WB#B#B#WB#B#B#B#^B#B#B##B#dB#B##B#dB#B#B#)B#kB#B# ,,,,+++++******))))((((((''''&&&&&%%%%%$$$$$$####"""""!!!!!     B$,zB$+B$*B$*?B$)B$(B$(B$'EB$&B$%B$% B$$LB$#B$"B$"B$!RB$ B$B$B$YB$-B$,EB$+B$*B$* B$)LB$(B$'B$'B$&RB$%B$$B$$B$#YB$"B$!B$!B$ _B$B$B$-B$,B$,B$+RB$*B$)B$)B$(XB$'B$&B$&B$%_B$$B$#B$#$B$"eB$!B$ B$ *B$lB$.B$-XB$,B$+B$+B$*^B$)B$(B$(#B$'eB$&B$%B$%*B$$lB$#B$"B$"0B$!rB$ B$B$/^B$.B$-B$-#B$,eB$+B$*B$**B$)kB$(B$'B$'0B$&rB$%B$$B$$7B$#xB$"B$!B$!=B$ B$/B$/)B$.kB$-B$,B$,0B$+qB$*B$)B$)6B$(xB$'B$&B$&=B$%~B$$B$$B$#CB$"B$!B$!B$0qB$/B$.B$.6B$-xB$,B$+B$+B$.B$-B$-B$,EB$+B$*B$* B$)LB$(B$:0B$9rB$8B$7B$77B$6yB$5B$4B$4>B$3B$2B$2B$1DB$0B$/B$/ B$.KB$-B$,B$,B$+RB$*B$)B$)B$:B$9B$9=B$8B$7B$7B$6DB$5B$4B$4 B$3JB$2B$1B$1B$0QB$/B$.B$.B$-XB$,B$+B$+B$*_B$)B$;CB$:B$9B$9B$8JB$7B$6B$6B$5QB$4B$3B$3B$2WB$1B$0B$0B$/^B$.B$-B$-#B$,eB$+B$*B$**B$;B$;B$:PB$9B$8B$8B$7WB$6B$5B$5B$4]B$3B$2B$2"B$1dB$0B$/B$/)B$.kB$-B$,B$,0B$+rB$*B$'B$=iB$B$=B$=4B$|B$=B$GB$=B$B$>B$=TB$B$=B$=B$gB$=B$B$>2B$=tB$B$=B$=?B$B$AB$@B$@B$?EB$>B$=B$= B$RB$=B$B$>B$=^B$B$=B$=*B$B$3B$2B$G]B$FB$EB$E"B$DdB$CB$BB$B)B$AkB$@B$?B$?0B$>qB$=B$B$>=B$=~B$B$>B$=IB$B$=B$=B$\B$=B$B$>(B$=iB$B$=B$=5B$|B$=B$=B$GB$=B$B$>B$=TB$B$=B$= B$gB$=B$B$>3B$=tB$B$=B$=@B$B$=B$= B$B$FB$EB$EB$DEB$CB$BB$B B$ALB$@B$?B$?B$>SB$=B$B$>B$=_B$B$=B$=+B$rB$=B$<B$SB$S B$RNB$QB$PB$PB$OUB$NB$MB$MB$L\B$KB$JB$J"B$IcB$HB$GB$G)B$FjB$EB$DB$D0B$CqB$BB$AB$A7B$@xB$?B$>B$>>B$=B$UB$TTB$SB$RB$RB$Q[B$PB$OB$O!B$NbB$MB$LB$L(B$KiB$JB$IB$I/B$HpB$GB$FB$F6B$EwB$DB$CB$C=B$B~B$AB$AB$@DB$?B$>B$> B$UB$TB$TB$SaB$RB$QB$Q'B$PhB$OB$NB$N.B$MoB$LB$KB$K5B$JvB$IB$HB$HB$V%B$UgB$TB$SB$S,B$RnB$QB$PB$P3B$OuB$NB$MB$M;B$L|B$KB$KB$JBB$IB$HB$HB$GIB$FB$EB$EB$DPB$CB$BB$BB$AWB$@B$?B$?B$VB$UB$U2B$TtB$SB$RB$R9B$Q{B$PB$OB$O@B$NB$MB$MB$LGB$KB$JB$J B$IOB$HB$GB$GB$FVB$EB$DB$DB$C]B$BB$AB$A"B$@dB$?B$W8B$VzB$UB$TB$T?B$SB$RB$RB$QFB$PB$OB$O B$NMB$MB$LB$LB$KTB$JB$IB$IB$H\B$GB$FB$F!B$EcB$DB$CB$C(B$BjB$AB$@B$@/#B ..-],++"*c)((('j&%%/$p#""5!w <}BIOV\! c ( i .p5v;}/c.--(,j+**.)p(''5&w%$$;#}""!B H OV\!c'i . p 4 v;}BH//..p-,,5+v*));(}''&B%$$#H"!! OU\!b'i.o4v ; | AH N0v/..;-},,+A*))(H'&& %N$##"U! \ b'i.o4v;|A  H NU[00A/..-H,++ *N)(('U&%%$[#"" !b 'h-o4u:|AG N  U [ b'100 /N.--,T+**)[('' &b%$$&#h"!!- o4u:|AG NT  [ a&h-o21T0//.[-,, +a*))&(h'&&-%n$##3"u! :{@G NT[ a & h -n3u:2110a/..&-g,++,*n)((3'u&%%:${#""@! G MTZa&h, n 3 u :{@3%2g100,/n.--3,t+**9){(''@&%%$F#"" !M TZa&g,n3t 9 { @ G M32221t0//9.z-,,?+**)F('' &M%$$#S"!! Z`%g,n2t9{@  F MS483z211?0//.F-,, +L*))(S'&&%Y$##"`! %g,m2t9z?F M  S Z`443E211 0L/..-R,++*Y)(('`&%%%$f#""+!m 2s8z?F LS Y  ` %g5K4332R100/Y.--,_+**$)f(''+&m%$$1#s"!!8 z?E LSY` % f + m2t554X3221_0//$.e-,,*+l*))1(s'&&8%y$##>"!! E LRY_$f+m 2 s 8z6^544#3e211*0l/..1-r,++7*y)((>'&&%E$## "K! RX_$f+l1s8 z ? E66*5k43302r1007/y.--=,++*D)(( 'K&%%$Q#""!X _$e*l1s8y> E L 7q65564x322=100/D.-- ,J+**)Q(''&X%$$#^"!!# e*l1r7y>E K  R  X77=6~554C3221J0//.Q-,,+W*))(^'&&#%e$##*"k! 0r7x=D KQX  _ $8776I5443P2110W/..-],++"*d)(()'k&%%0$q#""6!x =D JQX^# e * l 98P7665V4332]100"/d.--),j+**/)q(''6&x%$$=#~""!C JQW^#e*k 0 r 79887\655!4c322(1j0///.p-,,5+w*))<(~''&C%$$#J"!! PW^#d)k0r7x =  :!9c877(6i544.3p21150w/..<-},,+B*))(I'&&%P$##"V! ]"d)k0q6x=D J:99.8o76645v433;2}110B/..-I,++*O)(('V&%%$]#"""!c (j/q6w<~CJ Q ;4:v988;7|665A4332H100 /O.--,U+**)\(''!&c%$$(#j"!!/ p5w<~CIPW  ^;::A9887G655 4N3221U0//.\-,,!+b*))'(i'&&.%p$##5"v! <}BIPV]"d m=<<2;t:9998z766?5443F211 0M/..-T,++*Z)(( 'a&%%&$h#""-!o 4v;|AH OV>>8=z<;;?:998F766 5L4332S100/Z.--,a+**&)g(''-&n%$$3#u"!!: |AH NU\!?>>=E<;; :L9887R6554Y3221`0//%.g-,,,+n*))3(t'&&9%{$##@"!! G NU[ b'i@ ?K>==X=<<;_:99$8f766+5l43312s1008/z.--?,++*F)(( 'M&%%$S#""!Z a&h-o4u:|A@^?>>#=e<;;*:l98817r65584y322>100/E.-- ,L+**)S(''&Z%$$#`"!!% g,n3u:|AHA@@)?k>==06554D322 1K0//.R-,,+Y*))(`'&&%%g$##,"m! 2t9{@G NB/Aq@??6>x=<<=;::9D877 6K5443Q2110X/..-_,++$*f)((+'m&%%2$t#""9!z ?F MT[BAA<@~??>C=<<;J:998Q7665X4332^100$/e.--*,l+**1)s(''8&z%$$?#""!F  LSZaCBBAA@I?>>=P<;;:W9887^655#4e322*1k0//0.r-,,7+y*))>(''&E%$$ #L"!! SZ`%g,nCCBOA@@?V>==<];::"9d877)6k54403q21170x/..=-,,+D*)) (K'&&%R$##"Y! `%g,m3tDUCBBA\@??!>c=<<(;j:99/8q76665x433=2~110D/.. -J,++*Q)(('X&%%$_#""$!f +m2t9z@DD!CbBAA'@i?>>.=p<;;5:w988<7~665C4332J100/Q.--,W+**)^(''#&e%$$*#l"!!1 s8z?F EhDCC-BoA@@4?v>==;<};;:B9887I6554P3221W0//.^-,,#+d*))*(k'&&0%r$##7"y! >E LSEE4DuCBB:A|@@?A>==N=<<;U:998\766!5c433(2j100//q.--6,x+**=)~(('D&%% $K#""!Q X_$fGFFEDD CMBAA@T?>>=[<;; :b988'7i655.4p32251w0//<.~--,C+**)J(''&Q%$$#X"!! ^$e+l1GFFESDCCBZA@@ ?a>==&n=<<3;u:99:8|776A5443H211 0O/..-V,++*])(("'d&%%)$k#""0!r 7y>EHGG%FfEDD,CmBAA3@t?>>:={<;;@:998G766 5N4332U100/\.--!,c+**()j(''/&q%$$6#x"!!= D KI+HlGFF2EsDCC9BzA@@@?>>=F<;; :M9887T6554[322!1b0//'.i-,,.+p*))5(w'&&<%~$$#C"!! JQXIHH8GyFEE?DCCBFA@@ ?M>==IHHGEFEE DLCBBAS@??>Z=<<;a:99&8g766-5n43342u100;/|..-B,++*H)(('O&%%$V#""!] #d*kJJ IKHGGFREDDCYBAA@`?>>%=g<;;,:n98837t655:4{322A100/H.-- ,O+**)V(''&]%$$"#c"!!) j0qKQJIIHXGFFE_DCC$BfA@@+?m>==2z=<@??>E=<< ;L:998S7665Z4332a100&/h.---,o+**4)v('';&}%%$B#""!I PLL/KqJII6HxGFF=EDDCDBAA @K?>>=R<;;:Y9887`655%4g322,1n0//3.u-,,:+|*))A(''&H%$$ #O"!! VMwLKK==<_;::$9f877+6m54423t21190{/..@-,,+G*)) (N'&&%U$##"\! "cNMBLKKJIIHHGPFEEDWCBBA^@??#>e=<<*;l:9918s76685z433?2110F/.. -M,++*T)(('[&%%!$b#""(!i /NMM LOKJJIVHGGF]EDD"CdBAA)@k?>>0=r<;;7:y988>7665E433 2L100/S.--,Z+** )a('''&h%$$.#p"!!5 wONUMLLK\JII!HcGFF(EjDCC/BqA@@6?x>===<;;:D988 7K6554R3221Z0//.a-,,&+h*))-(o'&&4%v$##;"}!! BONN MbLKK'JiIHH.GpFEE5DwCBB== P=<<;X:998_766$5f433+2m1002/t.--9,{+**@)(('G&%% $N#""!UPOO3NuMLL:K|JJIAHGGFHEDDCOBAA@V?>>=^<;;#:e988*7l65514s32281z0//?.--,F+** )M(''&T%$$#["!ߚ#B ..-U,++*\)((!'c&%%($j#""/!q 6x=D LSZ a & h -o4v;}/[.-- ,b+**')i(''.&p%$$5#w"!!< ~D KRY`%g , n 3 u:|AH//&.h-,,-+o*))4(v'&&<%}$$#C"!! JQX_$f+m2t 9 { AH O0n/..3-u,++;*|))(B'&&%I$##"P! W^#e*l1s9z@  G NU\00:/{.--A,++*H)(( 'O&%%$V#""!] "d)k1r8y?F M  T [ b(100/G.-- ,N+**)U(''&\%$$!#c"!!( j0q7x>E LS  Z a'h.p2 1M0//.T-,,+[*)) (b'&&'%i$##/"p! 6x=D KRY` & h -o4v;2110Z/..-a,++&*h)((.'o&%%5$w#""F M  T [ b433?2110F/.. -M,++*T)(('[&%%!$c#""(!j /q6x=E LS Z  a 'h5E433 2L100/S.--,Z+** )a('''&i%$$.#p"!!5 w<~D KRY` & g - o4v554R3221Y0//.`-,,&+h*))-(o'&&4%v$##;"}!! BJQX_%f,n 3 u :|6X5443_211%0f/..,-n,++3*u)((:'|&&%A$##"I! PW^$e+m2t9 { @ G66$5e433+2m1002/t.--9,{+**@)(('G&%% $O#""!V ]"d*k1s8z? F N 7k65514s32281z0//?.--,F+** )N(''&U%$$#\"!!! c)j0r7y>E M  T  [7776y544>3221E0// .L-,,+T*))(['&& %b$##'"i! /p6x=D LSZ  a '8776D544 3K2110R/..-Z,++*a)((&'h&%%.$o#""5!w <~C JRY`& g - o 98J7665Q4332Y100/`.--%,g+**,)n(''4&u%$$;#}""!B IQX_$f,m 3 u :9887W6554_322$1f0//+.m-,,2+t*)):(|'&&A%$$#H"!! OW^#e+l2t9{ @ :9]877#6e544*3l21110s/..9-z,++@*))(G'&& %N$##"U! ]"d)k1r8z?F N:99)8k76605r43372y100?/..-F,++ *M)(('T&%%$\#""!!c (j0q7y>E M T ;/:q98867x655=4332E100 /L.--,S+**)Z('' &b%$$'#i"!!. p6w=D KSZ  a;::<9~887C655 4K3221R0//.Y-,,+`*))&(h'&&-%o$##4"v! <~CJRY`&g 0//.E-,, +M*))(T'&&%[$##!"c! (j/q7x>E M>i=<<.;p:9958w766=5443D211 0K/..-S,++*Z)(('a&%%'$i#"".!p 5w=D KSZ>>4=v<;;;:}998C7665J4332Q100/Y.--,`+**%)g(''-&o%$$4#v"!!; }CJQY`&?|>>=A<;;:I9887P6554W3221_0//$.f-,,,+m*))3(u'&&:%|$$#B"!! IPX_$f,n@?G>== U=<<;\:99"8c766)5k43302r1008/y.--?,++*F)(( 'N&%%$U#""!\ "d)k1r8z?A@[?>> =b<;;':i988/7q65564x322>100/E.-- ,L+**)T(''&[%$$!#b"!!( j/q7x>E MA@@&?h>==-u=<<;;}::9B8776J5443Q2110X/..-`,++%*g)((-'n&%%4$v#"";!} CJQY`BAA9@{?>>A=<<;H:998P7665W4332^100$/f.--+,m+**3)t('':&|%%$A#""!I PX_$fC?BAA@G?>> =N<;;:U9887]655"4d322*1l0//1.s-,,9+z*))@(''&G%$$ #O"!! V^#e+l2tCC BMA@@?T>==<[;::!9c877(6j54403r21170y/..?-,,+F*)) (M'&&%U$##"\! "d)k1r8zDSCBBAZ@?? >a=<<';i:99.8p76665x433=2110E/.. -L,++*S)(('[&%% $b#""(!j /q7x>EDDC`BAA%@g?>>-=o<;;4:v988<7~665C433 2K100/R.--,Y+**)a(''&&h%$$.#p"!!5 w=D KEfDCC+BmA@@3?u>==:<|;;:B9887I6554Q3221X0//._-,,%+g*)),(n'&&4%v$##;"}!! CJRYEE1DsCBB9A{@??@>==N=<<;U:998\766"5d433)2k1001/s.--8,z+**@)(('G&%% $O#""!V ^#e+lGFEEDD CLBAA@T?>>=[<;;!:b988(7j655/4q32271y0//>.--,F+** )M(''&U%$$#\"!!" d)k1s8GFFERDCCBYA@@?a>==&HGXFEED_CBB%Ag@??,>n=<<4;v:99;8}776C5443J2110R/..-Y,++*a)((&'h&%%.$p#""5!w =D LHGG#FeEDD+CmBAA2@t?>>:=|<;;A:998I7665P4332X100/_.--%,g+**,)n(''4&v%$$;#}""!C JRI)HkGFF1EsDCC8BzA@@@?>>=G<;; :O9887V6554^322#1e0//+.m-,,2+t*)):(|'&&A%$$#I"!! PX_IHH7GyFEE>DCCBFA@@ ?M>==[=<< ;b:99(8j766/5q43372y100>/..-F,++ *M)(('U&%%$\#"""!d )k1sJJIJHGGFQEDDCYBAA@`?>>&=h<;;.:o98857w655=4332D100 /L.--,S+**)[('' &b%$$(#j"!!/ q7yKPJIIHWGFFE_DCC$BfA@@,?n>==4{=<G=<< ;N:998V7665^433#2e100+/m.--2,t+**:)|(''A&%%$I#""!P XLL/KpJII6HxGFF>EDDCEBAA @M?>>=T<;;:\988"7c655)4k32211s0//8.z-,,@+**)G('' &O%$$#V"!! ^$MvLKK== 0//.F-,, +M*))(U'&&%\$##""d! *kNMBLKKJIIHHGQFEEDYCBBA`@??&>h=<<-;o:9958w766<5~443D211 0L/..-S,++*[)(( 'b&%%($j#""0!q 7NMM LOKJJIWHGGF^EDD$CfBAA,@n?>>3=u<;;;:}998B7665J4332R100/Y.--,a+**&)h(''.&p%$$6#w"!!= ONUMLLK]JII"HdGFF*ElDCC2BsA@@9?{>==A<;;:H9887P6554W3221_0//%.g-,,,+n*))4(v'&&<%}$$#C"!! KONN!McLKK(JjIHH0GrFEE7DyCBB?A@@?G>== T=<<;\:99!8c766)5k43312s1008/z.--@,++*G)(( 'O&%%$W#""!^POO4NvMLL> =b<;;':i988/7q65574x322>100/F.-- ,M+**)U(''&]%$$"#d"! 7777777777777777777777777777777777777777777777777777777777777777B#B#B#`B#ޢB#B#%B#gB#۩B#B#fB#B#B#+B#mB#ݯB#B#2B#tB#B#2B#sB#ߵB#B#9B#zB#ܼB#B#zB#B#B#?B#߁B#B#B#FB#܈B#B#EB#B#B# B#LB#ގB#B#B#B#B#B#RB#B#B#B#ZB#ݛB#B#YB#B#B#B#`B#ߢB#B#%B#B#B#$B#fB#B#B#+B#mB#ޯB#*B#lB#B#B#2B#sB#B#B#9B#B#B#8B#zB#B#B#?B#B#B#>B#B#B#B#EB#B#B# B#LB#B# B#KB#B#B#B#RB#B#B#RB#B#B#B#YB#B#B#B#`B#B#B#_B#B#B#$B#fB#B#B#eB#B#B#*B#lB#B#B#2B#sB#B#1B#rB#B#B#8B#zB#B#B#yB#B#B#>B#B#B#B#EB#B#B#DB#B#B# B#KB#B#B#B#B#B#B#RB#B#B#B#YB#B#B#XB#B#B#B#_B#B#B#$B#B#B##B#eB#B#B#+B#lB#B#)B#kB#B#B#1B#sB#B#B#8B#B#B#7B#yB#B#B#>B#B#B#=B#B#B#B#DB#B#B# B#LB#B# B#JB#B#B#B#RB#B#B#QB#B#B#B#XB#B#B#B#_B#B#B#^B#B#B##B#eB#B#B#dB#B#B#*B#kB#B#B#1B#sB#B#0B#rB#B#B#7B#yB#B#B#xB#B#B#=B#B#B#B#DB#B#B#CB#B#B# B#KB#B#B#B#B#B#B#QB#B#B#B#XB#B#B#WB#B#B#B#^B#B#B#$B#B#B#"B#dB#B#B#*B#lB#B#)B#jB#B#B#0B#rB#B#B#7B#B#B#6B#xB#B#B#=B#B#B#B$1B$sB$B$B$9B${B$B$B$AB$B$B$B$~HB$}B$|B$|B${PB$zB$yB$yB$xXB$wB$vB$vB$u_B$tB$sB$s%B$rgB$qB$pB$p-B$ooB$nB$mB$m4B$lvB$kB$jB$jB$B$B$B$FB$B$B$ B$NB$B$~B$~B$}UB$|B${B${B$z]B$yB$xB$x#B$weB$vB$uB$u+B$tmB$sB$rB$r2B$qtB$pB$oB$o:B$n|B$mB$mB$lBB$kB$jB$jB$iIB$hB$gB$gB$fQB$B$DB$B$B$ B$LB$B$B$B$SB$B$B$B$[B$~B$}B$}!B$|cB${B$zB$z)B$yjB$xB$wB$w0B$vrB$uB$tB$t8B$szB$rB$qB$q@B$pB$oB$oB$nGB$mB$lB$l B$kOB$jB$iB$iB$hWB$gB$fB$B$B$B$QB$B$B$B$YB$B$B$B$aB$B$B$&B$~hB$}B$|B$|.B${pB$zB$yB$y6B$xxB$wB$vB$v=B$uB$tB$tB$sEB$rB$qB$q B$pMB$oB$nB$nB$mUB$lB$kB$kB$j\B$iB$hB$h"B$gdAO MB$bZB$aB$`B$` B$_aB$^B$]B$]'B$\iB$[B$ZB$Z/B$YqB$XB$WB$W6B$VxB$UB$TB$T>B$SB$RB$RB$QFB$PB$OB$O B$NMB$MB$LB$LB$KUB$JB$IB$IB$H]B$GB$FB$F"B$EdB$DB$CB$C*B$BlB$AB$@B$@1B$?sB$>B$=B$=9B$<{B$;B$:B$:AB$9B$8B$8B$7HB$6B$5B$5B$4PB$3B$bB$b%B$agB$`B$_B$_-B$^oB$]B$\B$\5B$[vB$ZB$YB$YB$=B$=B$LB$=B$B$>B$=ZB$B$=B$=%B$mB$=B$B$>8B$=zB$B$?B$>B$>B$=FB$B$=B$=B$B$B$B$B$FB$B$B$ B$3]B$2B$1B$1#B$0eB$/B$.B$.+B$-mB$,B$+B$+2B$*tB$)B$(B$(:B$'|B$&B$&B$%BB$$B$#B$#B$"IB$!B$ B$ B$QB$B$B$B$YB$B$B$B$`B$B$B$&B$hB$B$B$-B$oB$B$B$5B$wB$B$B$=B$ B$ B$ B$ DB$ B$ B$ B$LB$B$B$B$TB$B$3B$3)B$2kB$1B$0B$01B$/rB$.B$-B$-8B$,zB$+B$*B$*@B$)B$(B$(B$'GB$&B$%B$% B$$OB$#B$"B$"B$!WB$ B$B$B$^B$B$B$$B$fB$B$B$,B$nB$B$B$3B$uB$B$B$;B$}B$B$B$CB$B$B$B$ JB$ B$ B$ B$ RB$ B$B$B$ZB$B$B$B$4qB$3B$2B$26B$1xB$0B$/B$/>B$.B$-B$-B$,FB$+B$*B$* B$)MB$(B$'B$'B$&UB$%B$$B$$B$#]B$"B$!B$!"B$ dB$B$B$*B$lB$B$B$2B$tB$B$B$9B${B$B$B$AB$B$B$B$IB$B$B$B$PB$B$ B$ B$ XB$ B$ B$ B$ `B$B$B$%B$gB$B$4B$42110E/.. -L,++*R)(('Y&%%$`#""%!g ,m2t9{@F M T ;7:y988>7665E433 2K100/R.--,Y+**)`(''%&f%$$+#m"!!2 t9z?F MTZ  a;;:D988 7K6554R3221X0//._-,,$+f*))+(m'&&2%s$##8"z! ?F LSZa&g )(('E&%% $L#""!R Y`%g,m2t9{ =^<;;#:e988*7k65504r32271y0//>.--,E+** )K(''&R%$$#Y"!! `%f+m2t9{@F==)q=<<6;x:99=8776D544 3J2110Q/..-X,++*_)(($'e&%%+$l#""1!s 8z?F LSZ>><=~<<;C:998J7665Q4332W100/^.--#,e+***)l(''1&s%$$8#y"!!> E LSY`%?>>=I<;;:P9887W6554^322#1e0//*.k-,,0+r*))7(y'&&>%$$#E"!! LRY`%g,m@?P>==]=<<";c:99)8j766/5q43362x100=/..-D,++ *K)(('Q&%%$X#""!_ $f+m2s8z?A!@c?>>(=j<;;/:q98867w655<4~332C100/J.--,Q+**)X(''&^%$$$#e"!!* l1s8z?F LA@@.?p>==5E LSB4Av@??;>}==! E KRY`BBAB@??>H=<< ;O:998V7665]433"2d100)/k.--0,q+**6)x(''=&%%$D#"" !K RY_%fCHBAA @O?>>=U<;;:\988!7c655(4j322/1q0//6.x-,,=+~**)D('' &J%$$#Q"!! X_$f+m2sCCBUA@@?\>==!i=<<.;p:9958v766<5}443B2110I/..-P,++*W)(('^&%%#$e#""*!l 1r8y>EDD&ChBAA-@o?>>4=v<;;;:}998B7665I4332P100/V.--,]+**")d('')&k%$$0#r"!!7 y>E LEnDCC3BuA@@:?|>==A<;;:H988 7O6554V3221]0//".d-,,)+j*))0(q'&&6%x$##="!! D KRYEE:D{CBBAA@@?G>== > =b<;;':i988.7o65554v322;1}00/B.--,I+**)P(''&W%$$#^"!!# e*l1s8GFFEZDCCBaA@@&?h>==-HG`FEE%DgCBB,An@??3>u=<<:;|:99A8776H544 3O2110V/..-],++"*d)(()'k&%%0$q#""7!x >D KHGG,FmEDD2CtBAA9@{?>>@=<<;G:99 8N7665U4332\100!/c.--(,j+**/)q(''6&x%$$=#""!D  KRI2HsGFF9EzDCC@BAA@G?>> =M<;;:T9887[655!4b322'1i0//..p-,,5+w*))<(~''&C%$$#J"!! QX_IHH?GFFEFDCC BMA@@?T>==<[;:: 9b877'6h544.3o21150v/..<-},,+C*))(I'&&%P$##"W! ^$eJEIHH GLFEEDSCBBAZ@??>a=<<&;h:99-8o76645v433;2}110B/..-I,++*P)(('W&%%$^#""#!e *l1rJJIRHGGFYEDDC`BAA%@g?>>,=n<;;3:u988:7|655A4332H100 /O.--,V+**)](''"&d%$$)#k"!!0 r7yKXJIIH_GFF$EfDCC+BmA@@2?t>==9<{;::@9887G655 4N3221U0//.\-,,!+c*))((j'&&/%q$##6"x! =DKK$JeIHH+GlFEE2DsCBB9Az@??@>==M=<<;T:998[766 5b433'2i100./p.--5,w+**<)~(('C&%%$J#""!Q XLL7KyJII>HGGFEEDD CLBAA@S?>>=Z<;;:a988&7h655-4o32241v0//;.}--,B+**)I(''&P%$$#W"!! ^#MLLKDJII HKGFFERDCCBYA@@?`>==%m=<<2;t:99:8{766A5443H211 0O/..-V,++*])(("'d&%%)$k#""0!r 7NMMLWKJJI^HGG$FeEDD+ClBAA2@s?>>9=z<;;@:998G766 5N4332U100/\.--!,c+**()j(''/&q%$$6#x"!!= ON]MLL#KdJII*HlGFF1EsDCC8BzA@@??>>=F<;; :M9887T6554[322 1b0//'.i-,,.+p*))5(w'&&<%~$$#C"!! JONN)MkLKK0JrIHH7GyFEE>DCCBEA@@ ?L>==Y=<<;`:99&8g766-5n43342u100;/|..-B,++*I)(('P&%%$W#""!^POO>%=f<;;,:n98837u655:4|322A100/H.-- ,O+**)V(''&]%$$"#d"! 7777777777777777777777777777777777777777777777777777777777777777B#kB#B#B#0B#qB#B#B#6B#xB#B#6B#xB#B#B#=B#~B#B#B#~B#B#B#CB#B#B#B#JB#B#B#JB#B#B#B#PB#B#B#B#B#B#B#WB#B#B#B#]B#B#B#]B#B#B#"B#dB#B#B#)B#B#B#)B#jB#B#B#/B#qB#B#/B#qB#B#B#6B#wB#B#B#<B#¹B#B#B$OB$NB$NB$MFB$LB$KB$K B$JMB$IB$HB$HB$GTB$FB$EB$EB$D[B$CB$BB$[B$[/B$ZqB$YB$XB$X6B$WxB$VB$UB$U=B$TB$SB$SB$RDB$QB$PB$P B$OKB$NB$MB$MB$LSB$KB$JB$JB$IZB$HB$GB$GB$FaB$EB$DB$D&B$ChB$\wB$[B$ZB$ZB$KB$JB$JB$IEB$HB$GB$G B$FLB$EB$_[B$^B$]B$] B$\bB$[B$ZB$Z'B$YiB$XB$WB$W.B$VpB$UB$TB$T5B$SwB$RB$QB$Q=B$P~B$OB$OB$NDB$MB$LB$L B$KKB$JB$IB$IB$HRB$GB$FB$FB$_B$_&B$^hB$]B$\B$\-B$[oB$ZB$YB$Y4B$XvB$WB$VB$V;B$U}B$TB$TB$SBB$RB$QB$QB$PJB$OB$NB$NB$MQB$LB$KB$KB$JXB$IB$HB$HB$G_B$FB$`mB$_B$^B$^3B$]uB$\B$[B$[:B$Z|B$YB$XB$XAB$WB$VB$VB$UHB$TB$SB$SB$ROB$QB$PB$PB$OWB$NB$MB$MB$L^B$KB$JB$J#B$IeB$HB$GB$G*B$`B$`9B$_zB$^B$]B$]@B$\B$[B$[B$ZGB$YB$XB$X B$WNB$VB$UB$UB$TUB$SB$RB$RB$Q]B$PB$OB$O"B$NdB$MB$LB$L)B$KkB$JB$IB$I0B$HrB$GB$aB$`B$`B$_FB$^B$]B$] B$\MB$[B$ZB$ZB$YTB$XB$WB$WB$V[B$UB$TB$T!B$SbB$RB$QB$Q(B$PjB$OB$NB$N/B$MqB$LB$KB$K6B$JxB$IB$HB$H=B$bB$b B$aKB$`B$_B$_B$^SB$]B$\B$\B$[ZB$ZB$YB$YB$XaB$WB$VB$V&B$UhB$TB$SB$S.B$RoB$QB$PB$P5B$OwB$NB$MB$MB$]B$\B$\B$[EB$ZB$YB$Y B$XLB$WB$VB$VB$USB$TB$SB$SB$R[B$QB$PB$P B$ObB$NB$MB$M'B$LiB$KB$JB$f5B$ewB$dB$cB$cB$fB$eB$eB$dFB$cB$bB$b B$aMB$`B$_B$_B$^TB$]B$\B$\B$[\B$ZB$YB$Y!B$XcB$WB$VB$V)B$UjB$TB$SB$S0B$RrB$o5B$nwB$mB$lB$l=B$k~B$jB$jB$iDB$hB$gB$g B$fKB$eB$dB$dB$cSB$bB$aB$aB$`ZB$_B$^B$^ B$]aB$\B$[B$['B$ZiB$YB$XB$X.B$WpB$VB$UB$U6B$TxB$SB$RB$p}B$oB$oB$nBB$mB$lB$lB$kJB$jB$iB$iB$hQB$gB$fB$fB$eXB$dB$cB$cB$b`B$aB$`B$`%B$_gB$^B$]B$]-B$\oB$[B$ZB$Z4B$YvB$XB$WB$W;B$V}B$UB$UB$TCB$SB$qB$pHB$oB$nB$nB$mOB$lB$kB$kB$jWB$iB$hB$hB$g^B$fB$eB$e$B$dfB$cB$bB$b+B$amB$`B$_B$_3B$^tB$]B$\B$\:B$[|B$ZB$YB$YAB$XB$WB$WB$VIB$UB$TB$TB$qB$pB$pB$oUB$nB$mB$mB$l]B$kB$jB$j"B$idB$hB$gB$g*B$fkB$eB$dB$d1B$csB$bB$aB$a8B$`zB$_B$^B$^@B$]B$\B$\B$[GB$ZB$YB$Y B$XNB$WB$VB$VB$UVB$TB$rB$q[B$pB$oB$o B$nbB$mB$lB$l(B$kjB$jB$iB$i/B$hqB$gB$fB$f7B$exB$dB$cB$c>B$bB$aB$aB$`EB$_B$^B$^ B$]MB$\B$[B$[B$ZTB$YB$XB$XB$W\B$VB$UB$U!B$rB$qB$q&B$phB$oB$nB$n.B$moB$lB$kB$k5B$jwB$iB$hB$hB$^B$]B$]B$\EB$[B$ZB$Z B$YMB$XB$WB$vB$uRB$tB$sB$sB$rYB$qB$pB$pB$o`B$nB$mB$m&B$lhB$kB$jB$j-B$ioB$hB$gB$g5B$fwB$eB$dB$dB$ZB$y}B$xB$xB$wBB$vB$uB$uB$tJB$sB$rB$rB$qQB$pB$oB$oB$nYB$mB$lB$lB$k`B$jB$iB$i&B$hhB$gB$fB$f-B$eoB$dB$cB$c5B$bwB$aB$`B$`E L  S [ b'100/F.-- ,M+**)T(''&[%$$!#b"!!( j/q6x=D KR  Z  a&h-o2 1L0//.S-,,+Z*)) (a'&&'%h$##."p! 5w<~CJQX` % g ,n3u:2110Y/..-`,++%*g)((-'n&%%4$u#"";!} BIPW^$f+ m 2 t 9{@32_100$/f.--+,m+**3)t('':&{%$$A#""!H  OV]#d*l1s 8 z ? F N322*1l0//1.s-,,8+z*))@(''&G%$$ #N"!! U\"c)j0r7y>  E LT403r21170y/..>-,,+F*)) (M'&&%T$##"[! b(i/p6x=D K  R Za433=2110D/.. -L,++*S)(('Z&%%$a#""&!h .o5v<~CJQ Y  ` %g5C433 2J100/Q.--,Y+**)`(''%&g%$$,#n"!!4 u;|BIPW_ $ f + m2t554P3221W0//._-,,$+f*))+(m'&&2%t$##9"{! AH OV]#e*l 1 s 8z6V5443]211#0d/..*-l,++1*s)((8'z&%%?$##"G! NU\"c)k0r7 y > E66!5c433)2j1000/r.--7,y+**>)(('E&%% $M#""!T [ b(i/q6x= D L 7i655/4p32261x0//=.--,D+** )K(''&S%$$#Z"!! a&h.o5w<~C J  R  Y7746v544<3}221C0//.J-,,+Q*))(X'&&%`$##%"g! ,n4u;}BIPX  _ $8|776B5443I2110P/..-W,++*^)(($'f&%%+$m#""2!t 9{AH OV^# e * l 98G766 5O4332V100/].--#,d+***)l(''1&s%$$8#z"!!? G NU\"d)k 0 r 79887U6554\322!1c0//(.j-,,0+q*))7(y'&&>%$$#E"!! MT[!b(j/q6x =  :9Z877 6b544'3i211.0p/..6-w,++=*))(D'&& %K$##"S! Za&h.p5w<~C K:99&8h766-5o43342v100;/}..-C,++*J)(('Q&%%$X#""!` %g,n4v;}BI Q ;,:m98837u655:4|332A100/I.--,P+**)W(''&^%$$$#f"!!+ m2t:{AHOW  ^;::99{877@6554G322 1O0//.V-,,+]*))#(d'&&*%l$##1"s! 8z@G NU]"d ! F MT[!c(j/ q<< ;L:998S7665Z433 2b100'/i.--.,p+**6)w(''=&%%$D#"" !K SZ a'i.p5w =R<;;:Y9887`655&4g322-1o0//4.v-,,<+}**)C(''&J%$$#Q"!! Y`%g-o4v;}C==<_;::$9f877+6m54433u211:0|//.A-,,+I*))(P'&&%W$##"_! $f+m3u:|AI>e=<<*;l:9918s76695z433@2110G/.. -O,++*V)((']&%%#$e#""*!l 1s9{@G OV>>0=r<;;7:y988?7665F433 2M100/T.--,\+**!)c('')&j%$$0#r"!!7 y?F MU\!?x>===<;;:D988 7L6554S3221Z0// .b-,,'+i*))/(p'&&6%x$##="!! E LS[ b'i@?C>==P=<<;W:998_766$5f433,2m1003/u.--:,|++*B)(('I&%%$P#""!X _%f,n3u;|A@V?>>=]<;;#:e988*7l65514s32291{0//@.--,H+** )O(''&V%$$#^"!!# e*l2t9{AHA@@!?c>==)p=<<6;x:99=8776E544 3L2110S/..-[,++ *b)((('i&%%/$q#""6!x >E LT[BAA4@v?>><=}<<;C:99 8J7665R4332Y100/a.--&,h+**-)o(''5&w%$$<#~""!D  KRZaC:B|AA@A?>>=I<;;:P9887X6554_322%1f0//,.n-,,3+u*));(}''&B%$$#I"!! QX`%g-nCCBGA@@ ?O>==\=<>'=i<;;/:p98867x655=4332E100 /L.--,T+**)[(''!&c%$$(#j"!!0 q7y>F E`DCC&BgA@@-?o>==4|==G=<< ;O:998V7665^433#2e100+/m.--2,t+**:)|(''A&%%$I#""!P W_%fFF>EDDCFBAA @M?>>=U<;;:\988"7d655)4k32211s0//8.z-,,@+**)G('' &N%$$#V"!! ]#e*l2GFF ELDCCBSA@@?Z>== 0//.E-,, +M*))(T'&&%\$##!"c! )k0r8zHGQFEEDYCBBA`@??&>h=<<-;o:9958w766<5~443D211 0K/..-S,++*Z)(( 'b&%%'$i#""/!q 6x>EHGGF_EDD$CfBAA,@n?>>3=u<;;;:|998B7665J4332Q100/Y.--,`+**&)g(''-&o%$$5#v"!!< ~D KI"HdGFF*ElDCC1BsA@@9?{>==@<;;:H9887O6554W3221^0//$.f-,,++m*))3(u'&&:%|$$#B"!! IQXIHH0GrFEE7DyCBB?A@@?F>== S=<<;[:99!8b766(5j43302q1007/y.--?,++*F)(( 'N&%%$U#""!] "d*lJJICHGGFJEDDCRBAA@Y?>>=a<;;&:h988.7p65554w322=100/D.-- ,L+**)S(''&[%$$!#c"!!( j0rKHJIIHPGFFEWDCCB_A@@%?g>==,t=<<9;{:99A8776I5443P2110X/..-_,++%*g)((,'n&%%4$v#"";!} C L[KJJ!IcHGG)FkEDD0CrBAA8@z?>>?=<<;G:99 8N7665V4332]100#/e.--+,l+**2)t('':&|%$$A#""!I PLL'KiJII.HpGFF6ExDCC=BAA@E?>> =M<;;:T9887\655!4c322)1k0//0.r-,,8+z*))@(''&G%$$ #O"!! VMnLKK4JvIHH==-,,+E*)) (M'&&%T$##"\! "dMM:L|KJJAIHHGIFEEDPCBBAX@??>`=<<%;g:99-8o76645v433<2~110D/.. -K,++*S)(('Z&%% $b#""(!i /NMMLGKJJ IOHGGFVEDDC^BAA#@e?>>+=m<;;3:u988:7|665B4332I100/Q.--,Y+**)`(''&&h%$$-#o"!!5 wO NMMLLKTJIIH\GFF"EdDCC)BkA@@1?s>==8>==K=<<;S:998[766 5b433(2j1000/q.--7,y+**?)(('F&%% $N#""!VPOO+NmMLL3KuJII:H|GGFBEDDCJBAA@Q?>>=Y<;;:`988&7h655.4p32251w0//=.--,E+** )L(''&T%$$#["!@@@"@&@(@.@2@3@6@7@9@<@>@?@A@B@B@D@E@F@F@H@I@J@K@L@M@N@O@@P@Q@Q@Q@R@S@@S@T@@T@T@@U@@V@V@@W@W@W@Y@Y@Y@Z@Z@Z@[@@\@\@@]@]@^@^@_@_@@`@``@`@a@@a@@a@a@b@ b@b@b@c@b@c@c@d@@d@d@d@ e@e@`e@e@ f@e@f@f@g@`g@g@g@@h@`h@h@h@`i@`i@i@j@i@i@i@i@i@i@i@j@i@ j@i@i@ j@ j@j@i@i@`i@@i@h@h@h@h@`h@g@ h@g@`g@`g@`g@g@f@f@f@ f@ f@ f@`e@e@`e@e@e@d@d@`d@`d@c@c@d@c@`c@`c@@c@b@b@b@@b@@b@a@a@a@`a@@a@ a@`@`@``@@`@@`@`@_@@_@_@^@]@^@]@]@\@\@\@@[@[@[@Z@@Z@Y@Y@@Y@X@@X@X@W@W@V@V@@V@U@@U@@U@T@@T@S@S@S@R@R@R@R@@Q@P@P@@P@O@N@N@N@L@L@K@K@I@I@H@G@G@F@E@E@C@C@B@B@@@@@?@>@<@;@:@8@6@5@4@1@1@.@,@(@&@"@ @@@@@:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,.{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e4:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,EPRJ_DATUM_SURFACE,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,.| A /&                 AZAAI2@ƴACMB$0B$ BB$TB$eB",AǠzAAt[Ak<@ @?iٓB$=B$OB$ `B$ qB$B$B$B#B#B#B#B#B#AħAPAxAgap@@W|=Ig@\B$[B$mB$~B$ B$ B$B$B$B#B#B# B#B#,B#>B#OB#aB#rB#B#B#ݦB#ڸA?-wB$ B$B$B$B$B$B$*B$ B#PB#bB#tB#܅B#ٗB#֩B#ӺB#B#B#B#B#B##B#6B#GB#XB#jB#{A:*B$$B$"B$B$1B$CB$TB$fB$xB$ B$ B$B$B$B#B#B#B#B#(B#:B#KB#]B#oB#B#B#ޤB#۵B#B#B#B#B# B#B#1B#CB#TB#fB#wB#B#A)B$'B$$,B$!>B$OB$aB$rB$B$B$B$ B$ B$B$B$B#B##B#5B#FB#XB#jB#|B#B#B#B#B#B#B#B# B#B#,B#>B#PB#aB#sB#B#B#B#B$,&B$)8B$&IB$#[B$ mB$~B$B$B$B$B$B$ B$B$ B$B$0B#AB#SB#eB#wB#B#B#B#B#B#B#B#B#B#(B#9B#LB#]B#oB#ȀB#ŒB#£B#B#B#@]B$.DB$+UB$(gB$%xB$"B$B$B$B$B$B$B$B$ B$+B$B$OB$aB$sB$B$ B$B$B$B#B#B#B#B#%B#8B#IB#[B#mB#B#B#ߢB#ܴB#B#B#B#B#B#B#1B#CB#UB$9B$6B$3B$0B$-B$+B$(B$%&B$"7B$IB$[B$nB$B$B$B$ B$ B$B$B$B#B# B#2B#DB#VB#hB#yB#B#B#B#B#B#B#B# B#B#-B#?B#PB#bB#t>CKB$;B$8B$5B$2B$0B$- B$*1B$'DB$$VB$!hB$yB$B$B$B$B$B$ B$ B$B$B$,B#?B#QB#cB#tB#B#B#B#B#B#B#B#B#B#(B#:B#KB#]B#oB#ɁB#Ɠ@B$=B$:B$8B$5B$2,B$/>B$,PB$)aB$&tB$#B$ B$B$B$B$B$B$B$ B$ 'B$9B$KB$]B#oB#B#B#B#B#B#B#B#B#B#"B#5B#FB#XB#jB#|B#ΎB#ˠB#ȳAPB$@B$=B$:&B$78B$4JB$1\B$.nB$+B$(B$%B$"B$B$B$B$B$B$"B$3B$ FB$XB$jB${B#B#B#B#B#B#B#B# B#B#/B#AB#SB#eB#wB#։B#ӛB#ЭB#ͿB#AB$B B$?1B$aB$;sB$8B$5B$2B$/B$,B$)B$&B$$B$!B$(B$:B$LB$^B$pB$B$ B$ B$B$B$B#B#B#B#%B#6B#IB#[B#mB#B#B#B#ݵB#B#B#B#B#B$IHB$F[B$CmB$@B$=B$:B$7B$4B$1B$.B$+B$)B$&"B$#4B$ FB$XB$jB$|B$B$B$B$ B$B$B$B$ B#B#1B#CB#UB#gB#yB#B#B#B#B#B#B#B# B#B#/@'B$KgB$HxB$EB$BB$?B$B$;B$9B$6B$3(B$0:B$-LB$*^B$'pB$$B$!B$B$B$B$B$B$B$ B$ &B$8B$JB$]B#nB#B#B#B#B#B#B#B#B#B#$B#6B#HB#ZB#lA"B$OB$LB$IB$FB$CB$@B$>B$;!B$83B$5EB$2XB$/jB$,|B$)B$&B$#B$ B$B$B$B$ B$B$2B$ DB$ WB$hB$zB$B#B#B#B#B#B#B# B#B#1B#BB#UB#gB#yB#׋BB$QB$NB$KB$HB$F B$CB$@-B$=?B$:QB$7cB$4uB$1B$.B$+B$(B$%B$"B$B$B$B$,B$>B$PB$cB$ uB$B$B$B#B#B#B#B#B#B#+B#=B#OB#bB#sB#߆B#ܘB#٪@obB$VB$SB$PB$NB$KB$H&B$E9B$BJB$?]B$B$;B$8B$5B$2B$/B$,B$* B$'B$$1B$!DB$VB$hB${B$B$B$B$ B$ B$B$B$ B#B#2B#DB#VB#hB#{B#B#B#B#B#B#Ah B$[B$XB$U+B$R=B$OOB$LbB$ItB$FB$CB$@B$=B$:B$7B$4B$2B$/B$,+B$)>B$&OB$#bB$ uB$B$B$B$B$B$B$ B$ B$B$+B$>B#PB#cB#uB#B#B#B#B#B#B#B#A B$;B$8B$5B$3B$0B$-+B$*B$lB$iB$fB$cB$a B$^ B$[2B$XEB$UXB$RjB$O|B$LB$IB$FB$CB$@B$=B$:B$8B$5#B$26B$/IB$,[B$)mB$&B$#B$ B$B$B$B$B$B$B$ 'B$ :B$LB$_B$rB#B#B#B#B#B#@05VB$qB$nB$kB$iB$fB$c+B$`=B$]PB$ZbB$WuB$TB$QB$NB$KB$HB$EB$BB$@ B$=B$:0B$7BB$4UB$1gB$.yB$+B$(B$%B$"B$B$B$B$B$!B$3B$FB$ XB$kB$~B$B#B#B#B#B#B#@:dB$sB$pB$nB$k$B$h6B$eIB$b[B$_nB$\B$YB$VB$SB$PB$MB$JB$HB$EB$B(B$?;B$kB$;~B$8B$5B$2B$/B$,B$)B$'B$$B$!&B$9B$KB$^B$qB$B$B$ B$ B$B$B$B#B#B#+B#>A3B$x'B$u9B$rLB$o_B$lrB$iB$fB$cB$`B$]B$ZB$WB$UB$RB$O,B$L?B$IQB$FeB$CwB$@B$=B$:B$7B$4B$1B$.B$, B$)B$&2B$#EB$ WB$jB$}B$B$B$B$B$ B$B$B$B$%B#8B#JB#]B B$zDB$wWB$tiB$q|B$nB$kB$hB$eB$bB$_B$\B$ZB$W%B$T8B$QJB$N]B$KpB$HB$EB$BB$?B$B$(PB$%cB$"vB$B$B$B$B$B$B$ B$ B$B$1B$DB#WB#iB#|@ /B$OB$|bB$ytB$vB$sB$pB$mB$jB$gB$dB$b B$_B$\0B$YCB$VVB$SiB$P{B$MB$JB$GB$DB$AB$>B$;B$9B$6$B$36B$0JB$-\B$*oB$'B$$B$!B$B$B$B$B$B$B$ +B$ =B$PB$cB$vB#B#@B$mB$~B${B$xB$uB$rB$oB$lB$jB$gB$d(B$a;B$^NB$[aB$XtB$UB$RB$OB$LB$IB$FB$CB$A B$>B$;0B$8BB$5UB$2hB$/{B$,B$)B$&B$#B$ B$B$B$B$$B$7B$IB$ \B$ oB$B$B$B#A}B$B$B$}B$zB$wB$tB$qB$oB$l!B$i3B$fFB$cYB$`lB$]B$ZB$WB$TB$QB$NB$KB$IB$FB$C(B$@;B$=NB$:aB$7tB$4B$1B$.B$+B$(B$%B$"B$ B$B$0B$BB$UB$hB${B$ B$B$B$B#AB$B$B$B$|B$yB$wB$tB$q,B$n?B$kRB$hdB$ewB$bB$_B$\B$YB$VB$SB$PB$NB$K!B$H4B$EGB$BYB$?lB$<B$9B$6B$3B$0B$-B$*B$(B$%B$"(B$ 499980 5190280 609740 5300040 0 0 342 342 x y 500140 5299880 320 0 0 -320 gmljp2://codestream/0 Record Interleaved 3jp2cOQ)WWR \B@ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\} +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\} VϤ(\ WϤ(\ XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\} -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\} XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\} /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\ XϤ(\ YϤ(\} ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\} 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\ XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\} \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\} 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\ XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\} ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\}  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\} 5Ϥ(\ 6Ϥ(\ 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\ XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\} `Ϥ(\ aϤ(\ bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\}  Ϥ(\  Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\ !Ϥ(\ "Ϥ(\ #Ϥ(\ $Ϥ(\ %Ϥ(\ &Ϥ(\ 'Ϥ(\ (Ϥ(\ )Ϥ(\ *Ϥ(\ +Ϥ(\ ,Ϥ(\ -Ϥ(\ .Ϥ(\ /Ϥ(\ 0Ϥ(\ 1Ϥ(\ 2Ϥ(\ 3Ϥ(\ 4Ϥ(\ 5Ϥ(\ 6Ϥ(\} 7Ϥ(\ 8Ϥ(\ 9Ϥ(\ :Ϥ(\ ;Ϥ(\ <Ϥ(\ =Ϥ(\ >Ϥ(\ ?Ϥ(\ @Ϥ(\ AϤ(\ BϤ(\ CϤ(\ DϤ(\ EϤ(\ FϤ(\ GϤ(\ HϤ(\ IϤ(\ JϤ(\ KϤ(\ LϤ(\ MϤ(\ NϤ(\ OϤ(\ PϤ(\ QϤ(\ RϤ(\ SϤ(\ TϤ(\ UϤ(\ VϤ(\ WϤ(\ XϤ(\ YϤ(\ ZϤ(\ [Ϥ(\ \Ϥ(\ ]Ϥ(\ ^Ϥ(\ _Ϥ(\ `Ϥ(\ aϤ(\} bϤ(\ cϤ(\ dϤ(\ eϤ(\ fϤ(\ gϤ(\ hϤ(\ iϤ(\ jϤ(\ kϤ(\ lϤ(\ mϤ(\ nϤ(\ oϤ(\ pϤ(\ qϤ(\ rϤ(\ sϤ(\ tϤ(\ uϤ(\ vϤ(\ wϤ(\ xϤ(\ yϤ(\ zϤ(\ {Ϥ(\ |Ϥ(\ }Ϥ(\ ~Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\} Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\ Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\  Ϥ(\} Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[ Ϥ(\[  Ϥ(\[ !Ϥ(\[ "Ϥ(\[ #Ϥ(\[ $Ϥ(\[ %Ϥ(\[ &Ϥ(\[ 'Ϥ(\[ (Ϥ(\[ )Ϥ(\[ *Ϥ(\[ +Ϥ(\[ ,Ϥ(\[ -Ϥ(\[ .Ϥ(\[ /Ϥ(\[ 0Ϥ(\[ 1Ϥ(\[ 2Ϥ(\[ 3Ϥ(\[ 4Ϥ(\[ 5Ϥ(\[ 6Ϥ(\[ 7Ϥ(\[ 8Ϥ(\gdalautotest-3.0.4/gdrivers/data/testtil.imd0000644003401500001440000000030613614004466020554 0ustar rouaultusersnumRows = 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.0.4/gdrivers/data/arvidson_original_truncated.cub0000644003401500001440000000725413614004466024657 0ustar rouaultusersCCSD3ZF0000100000001NJPL3IF0PDS200000001 = 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.0.4/gdrivers/data/orog_CRCM1.nc0000644003401500001440000057763413614004466020575 0ustar rouaultusersCDF ycsxc lat axisY long_namelatitude standard_namelatitudeunits degrees_northlon axisX long_name longitude standard_name longitudeunits degrees_east|orog  _FillValue coordinateslon lat grid_descpolar_stereographic grid_mappingpolar_stereographic long_nameSurface Altitude missing_value`x standard_namesurface_altitudeunitsm xc 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_coordinateunitsmpolar_stereographic %straight_vertical_longitude_from_pole@ppstandard_parallel@N false_eastingAJRHfalse_northingA\kdlatitude_of_projection_origin@Vgrid_mapping_namepolar_stereographicresolution_at_standard_parallel@jxc 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_coordinateunitsmpolar_stereographic %straight_vertical_longitude_from_pole@ppstandard_parallel@N false_eastingAJRHfalse_northingA\kdlatitude_of_projection_origin@Vgrid_mapping_namepolar_stereographicresolution_at_standard_parallel@jA6 AMAbCAsAAjAAAA-A%AA:AzBAhATA;A AAAUA#A_?A-A4AAA@AAHAfzAAAgA A©AD AڅAlAAń,A uAƊeAA"AAb1A A3dAɕ=AAKVAʟA-A:5AˀAjAA8AkA̛AACA TA(A@RAS;AamAjAoAoAjAamAS;A@RA(A TACAA̛AkA8AAjAˀA:5A-AʟAKVAAɕ=A3dA Ab1AA"AAƊeA uAń,AAlAڅAD A©A AgAAAfzAHAA@AAA4A-A_?A#AUAAA A;ATAhAzBA:AA%A-AAAAjAAsAbCAMA6 A4APAĂAؽAA*AEA >AAAA AAAAՀAyAAAhACAAAAAUeABA7A6AQ9A8A·'AdA AıLAQAAƅAoAǨA3AȺqAAEA*AAؽAĂAPA4AAyA(:A?ARAcxAqA{AAAAA AuAhAXADA-AAAAAATA#&AAAwA6xAVAĨ%AZA uAƳAZ!A'AșA3dAȍAY^AAmAsApACAamA A@!AΨA AkApAkAmAкVA=AEkAуAѽAwA"AMAtAҖPAҳDAhA޹A7AAAAA7A޹AhAҳDAҖPAtAMA"AwAѽAуAEkA=AкVAmAkApAkA AΨA@!A AamACApAsAmAAY^AȍA3dAșA'AZ!AƳA uAZAĨ%AVA6xAwAAA#&ATAAAAAA-ADAXAhAuA AAAAA{AqAcxARA?A(:AyAAQAqAjAAAQAnA`AAAAAAAAݾAAA-AxAAaA>%AA A»AÈqAQ?AAAƓALBAAȱ%A]OA=AʨAHIAUAzA TA͚7A#AΨA)AϥAkAЏ;ArAgAA,@A҇A޹A0A~MAA AIAԄ@AԹAdA6A=0A_PA|AՔAը~Aշ#AAAAAշ#Aը~AՔA|A_PA=0A6AdAԹAԄ@AIA AA~MA0A޹A҇A,@AAgArAЏ;AkAϥA)AΨA#A͚7A TAzAUAHIAʨA=A]OAȱ%AALBAƓAAAQ?AÈqA»A AA>%AaAAxA-AAAݾAAAAAAAA`AnAQAAAjAqAQA$AA AA(A>AQZA`AmAvA{A}A|Ax=Ap,AdAUeABA,%AAAjAìAăAVFA%AAǶAygA8 AAʨA[AA̲AWAAΕA-AAQAAb:AAaDAAMAӽEA'AԍAAAKAգAADA֎MAAAMA׃A״AAA*AHAa6AtA؃A؍AؒAؒA؍A؃AtAa6AHA*AAA״A׃AMAAA֎MADAAգAKAAAԍA'AӽEAMAAaDAAb:AAQAA-AΕAAWA̲AA[AʨAA8 AygAǶAA%AVFAăAìAjAAA,%ABAUeAdAp,Ax=A|A}A{AvAmA`AQZA>A(AA AA$AA:{A\AzA1AAAAAA4AABAAmA0AYAA»AãAĈAhAEJA AAüAɐAY^AAޡA̛AS;A2AζAbDA NAЫAJ7AAy_A 6AӖABAԡkAAՙAAAlARA״AYAkAؾA AXAAٝAAAP3AځAڮAyATA7A0"ADAS A]AbAbA]AS ADA0"A7ATAyAڮAځAP3AAAٝAXAA AؾAkAYA״ARAlAAAՙAAԡkABAӖA 6Ay_AAJ7AЫA NAbDAζA2AS;A̛AޡAAY^AɐAüAA AEJAhAĈAãA»AAYA0AmAABAA4AAAAAA1AzA\A:{AAyAEAŐAAAA7ALfA]AkAvbA}AfAA~mAwAmA^AMA7yA AAߢAɺAʑAdsA3YA'AA·[AEAAеAgA+AҼAaBA&AԜA3qAASAܷAa=AA\GAҽADuAٱiAA|AsA5AۉAA$AjAܬA4AjAQA~AݧAXAAAA%A/A4$A4$A/A%AAAAXAݧA~AQAjA4AܬAjA$AAۉA5AsA|AAٱiADuAҽA\GAAa=AܷASAA3qAԜA&AaBAҼA+AgAеAAEA·[AA'A3YAdsAʑAɺAߢAA A7yAMA^AmAwA~mAAfA}AvbAkA]ALfA7AAAAŐAEAyAiA mA0kATYAu+AAJAĀAkAA.AA8AA)AAAAYA AɵAʚA{AY A2"A2A-AϥAmA28AwAҮrAfAhASArAAֺfAWjAA؃AAٝA#AڤA!/AۘA AyA/AGAݧAAWrAި3AA:A|A߹xAFA$ AQAzpA A༔A AhAAAAAAAhA A༔A AzpAQA$ AFA߹xA|A:AAި3AWrAAݧAGA/AyA AۘA!/AڤA#AٝAA؃AAWjAֺfAArASAhAfAҮrAwA28AmAϥA-A2A2"AY A{AʚAɵA AYAAAA)AA8AA.AAkAĀAJAAu+ATYA0kA mAiAF)ArAAKAA&A$DA>ATAgAwAÃAČAőAƓAǑAȋAɂAumAdsAOA6A+A|AAЫAAMAA4AԡkA_PAAA~A*AҽAuAAڮADAA`A4AjAAaAլADA߯UAAuZAA'Ay.AA _AOAaAAA'QAPmAtkAGAAA AYAAAYA AAAGAtkAPmA'QAAAaAOA _AAy.A'AAuZAA߯UADAլAaAAjA4A`AADAڮAAuAҽA*A~AAA_PAԡkA4AAMAAЫAA|A+A6AOAdsAumAɂAȋAǑAƓAőAČAÃAwAgATA>A$DA&AAKAArAF)A3AݾA ;A3AYA|AA9AA߯UAaAAvAZ&AAGA(A1ADAˡAMwAXAB=AA"A苻AiAMAoAAJAAzAAS9A;AAmAA'{ABAWUAgIAqAwAAwAAqAgIAWUABA'{AAmAA;AS9AAzAAJAAoAMAiA苻A"AAB=AXAMwAˡADA1A(AGAAZ&AvAAaA߯UAA>9A~AܻAA&*AU+AAئJAAAiA6A'A5A?AEkAGtAEA@!A6A)A_A=AAtAƳAőAlAD AWA_AEAAA%AZAČAŻJAAA3dATArǍAͣAζApALAiA޹A4AAoAA׹AئJAَArAS A.AOAsAި3ArA8\AAvAnA".A A{6A A?A]AAA@AtAAAA2A7Ac AA'{AAA'AqACAsA2WAgA.AAAA#A9JAImAT.AYAYAT.AImA9JA#AAAA.AgA2WAsACAqA'AAA'{AAc A7A2AAAAtA@AAA]A?A A{6A A".AnAvAA8\ArAި3AsAOA.AS ArAَAئJA׹AAoAA4A޹AiALApAζAͣǍArATA3dAAAŻJAČAZA%AAZAĕAͭAWA3AaAʌA˴PA`AA A/AEkAWAfApAwAzAyAtAlA_AN A8AjAAA߹xAA_A,AAOAv A0(AAHAB=AfA苻A)2AAUdAAmA\AqAjAaAA=AAA^AAAQuAAؒAAJFA{AuAuA A3AA.?A9!A>A>A9!A.?AA3A AuAuA{AJFAAؒAAQuAAA^AAA=AAaAjAqA\AmAAUdAA)2A苻AfAB=AHAA0(Av AOAA,A_AA߹xAAAjA8AN A_AlAtAyAzAwApAfAWAEkA/A AA`A˴PAʌAaA3AWAͭAĕAZAAAAAyDAʭAޡA TA6A]AЀAѠAҼAՁAdAAAYAAA7AAOAAAAeAᒵAnAF%A0AA屰AwA7AA1A]A AxAXAAA'ACABiAyAImAAA^A3AzASAA/HA`AzAAANAGAA A&CA&CA AAGANAAAzA`A/HAASAzA3A^AA>A,A|AANA;AA!7ANAvGASAApA}AAAAA}ApAASAvGANA!7A>AAwmA3ABATAFAAkA({AANKAA^AޥAYsAA?FA[ADAqA̽A#]AtAA GALAAAsA'ARAxSA A:AA+AAAA AA#AA2AڸAPAܬAێAnAIgA! AAَAsA$AjAޭ?A2A'A_EAGAÇAAA="A]AzYAA(ACAAʟAAuAƪASAhAAAdABA AyAAlAOA8ApA{A2NABBBBFB+SBsB;B B<ByMBBPB BQBB$BeBB 1B@B^PBxBBqB?BBBBBBBBBBB?BqBBxB^PB@B 1BBeB$BBQB BPBByMB<B B;BsB+SBFBBBAA2NA{ApA8AOAlAAyA ABAdAAAhASAƪAuAAʟAACA(AAzYA]A="AAAÇAGA_EA'A2Aޭ?AjA$AsAَA>AlAb(AڸA A[Aި3AFA6AxAOAA)A\TA苻A:AAKA!A=AT.AgAuAAAAA| AoA^AHA.AABAAA_OA&ARBSIBKBB_bBlBBSbBCBbB.BrIBBB,Bd;BBBB(B ZwB `B cB cB `B ZwB Q>B DB 5B #+B B'BٔBBQBtBLB"MBBBcBYB YBBBbmBZBmBB=BBBCB BB1BBmBBB3BUBV'AAܱAAAA`ACAAPAߔAjAA AtAOA&IAAOAAXAjAAMwAA(A_EAA߯UARfAA,AAA8ARAjA%AmAAA.AgAAAA ADAdAAA|AAAAA=B[BԿBK!BB0jBCB Bu9BJB@BzBB]BB[BbmBB!BMBuBNB@B_HB_BփB B AB sB AB kB B B ;B ZB vB WB B B B VB B AB =B ӭB &B YB !B әB B AnB sB B ,B ;B ,B @B `B }9B B B B B ܋B B tB B B tB B ܋B B B B B }9B `B @B ,B ;B ,B B sB AnB B әB !B YB &B ӭB =B AB B VB Q>BIB}BFBxBJB#^BBSeBeBxB}BB=BNB(BB*BB"B%BMA VAAFAA|ANKAAA[AkA(A,AAImAsAAHAA苻A((A?A="AoAcAqAA.AxAܽA.FA|AA AMAAőA-A,AYAPBSIB(BpB BB BBlBB qBB\BtwBBVBB.}BBBIB ]B B B smB XB `B oB B B Q'B gB إB B TB B B B%BRxB|BdBŞBBB;B2BFBVBbBlBsBvKBvKBsBlBbBVBFB2B;BBBŞBdB|BRxB%B B B B TB B إB gB Q'B B B oB `B XB smB B B ]BIBBB.}BBVBBtwB\BB qBBlBB BB BpB(BSIAPAYA,A-AőAAMA AA|A.FAܽAxA.AAqAcAoA="AA'{AAA\DA+ArAqAAAdAPAA3ApA^ABBBBABB]BBpBBxB_BwyBBlBcBV B4B 5B AB ,B pSB ӭB 42B B B DB B B :B B BBXBBդBcBFByBBBB'BKBkB.B+BBqBݷBBBBHBHBBBBݷBqBB+B.BkBKB'BBBByBFBcBդBBXBB B B :B B B DB B B 42B ӭB pSB ,B AB 5B4BV BcBlBBwyB_BxBBpBB]BBABBBAA^ApA3AAPAdAAAqArA+A\DAAA'{AA7AFAA|A^AJA[AUA^AA`AOASAܱBpBjBH=BByMByB\B1B'BKBmB\jBBbBcB_HBٔB Q>B @B 8B ,B B B fB JB xB 2B gB BBhBBBOBBIBBXBB/BHB/3B\BlBBBBB+jBBqBV/BfBsB}BNBBBNB}BsBfBV/BBqB+jBBBBBlB\B/3BHB/BBXBBIBBOBBBhBB B gB 2B xB JB fB B B ,B 8B @B Q>BٔB_HBcBbBB\jBmBKB'B1B\ByByMBBH=BjBpAܱASAOA`AA^AUA[AJA^A|AAFA7AA)AAAsJA A=%AA#AOAABBtBe,BB.B=hBeBmBBB#YBB;BBIBTB N+B kB H B B 7QB B B B B ]B B%BBvB<^BKB6B8BBвB]B\BUBܘBBOBNBB BB6B[GB|yB_BBFB@BB?B@BB@B@BB@B?BB@BFBB_B|yB[GB6BB BBNBOBBܘBUB\B]BвBB8B6BKB<^BvBB%B B ]B B B B B 7QB B H B kB N+BTBIBB;BB#YBBBmBeB=hB.BBe,BtBAAAOA#AA=%A AsJAAA)AA3AA A#AAj:AA3AAB"BBsB B}B]BBB4&BqBbmB BJBB}B ,`B B 8B B :oB jB 1B QB ,B DB BlBդB<^B0BB^BBBfBBDBRBdBB"BaBBBB B=BlsBB-BBB$B?BWkBkB|~BBBBB ^B "B !~B jB JB B j1B B5BBB B.BB}BBfBBDBTBByBB9BBB@B+BwB+BsZBB B7 BqBBB BBBlBBZBrBBTBfBBBH=BAZA1AA5AA3AeA=B^BB)BBLBB?BiBZBBuB@B4B lB \B }B PFB B B ,B 4BEBդBbBBuBB}BjBzkBBkB@BQB-B+BBB[BB BoBŜBBgKB@BBABBGBB:B5BiBBNByB-BBFBrBBlsBBZB͇B=DBBBz2BݥB=BBBKBBCB<BBBBNBB—BB)^BWB9BeB B*B B"B8;BJ BXtBc3Bj]BmBmBj]Bc3BXtBJ B8;B"B B*B BeB9BWB)^BB—BBNBBBB<BCBBKBBB=BݥBz2BBB=DB͇BZBBlsBBrBFBm>BqB\BвBABQB;BB tB PB B QB oB XB "B y:BTB@Bo BB\BQBB=B"BdBB(BAB%BbGB'BPB$BmB+7BeBBYBB%B v&B &B ӭB B (LB ,B sBBBRBBBBB?&BBWB@BeBpBhCB3B_3B?BJKBQB)IB(BB`BB &B{!BB'CBx^B!BBWB$BQB BQHB BNB B=B:B^BzBgBBuBݓBBB5BBB5BBBݓBuBBgBzB^B:B=B BNB BQHB BQB$BWBB!Bx^B'CBB{!B &BB`BB(B)IBQBJKB?B_3B3BhCBpBeB@BWBB?&BBBBBRBBB sB ,B (LB B ӭB &B v&B%BBYBBeB+7BmB$BPB'BbGB%BBBlhB1BBBwyB5BBB cB B uB B .B B B/_BդByBBBVaBIBBLBTB=B=BT B B_3BwB^B5BRBB:QBBB~BiBFBMBXB[BBBQHBBpB(BiBBB3BBJ{ByBBͤB+B B 0ZB IB _B rSB B B ]B B B ]B B B rSB _B IB 0ZB B+BͤBByBJ{BB3BBBiB(BpBBQHBBB[BXBMBFBiB~BBB:QBBRB5B^BwB_3B BT B=B=BTBLBBIBVaBBByBդB/_B B B .B B uB B cBBB5BwyBBB1BlhBBB"BBOBxB>^B!BBB AB B B oB %'B إB B8BBB8BݷBB!BB[GB>BB4BB=DBȟBQ"BBYBJBVBBFBBB*B(BXBiRB B-~BBpB:BBݓB)BrBBzB 7B rSB gB B! B!9 B!aB!B!B!ŗB!ߊB!B"_B"B[GBB!BBݷB8BBB8B B إB %'B oB B B ABBB!B>^BxBOBB"B^PB+7B^BBJBLB B җB rB PFB B ŴB }9B2BBBEBABBBqBZBB)BBaBBB!JBB=BBO%B^BTBBNB!B;BBB B;BT$BBBnBWB dB jB B!B!GB!UB!KB"B"B#\B#v`B#B#B#B# B#B#WB#WB#B# B#B#B#B#v`B#\B#>B#^B"B"B"B"pB"B(B(B))^B)pB)B)8B*-B*dB*B*B'B'B'2B&BB&n/B&B%zB%,B$B$EB#B#PB"ыB"OB!KB!@kB nB %_BIB5Bf1BEB-~BBBCtBBCBABBBݥB(Bp/BB;B:PBy&BBIB(B^BKBŞB B $B Q'B {B B fB dB BlB?B?BBBzkBDB BBBUBBBBABB?BBXBBBXtBBB?B?B uB! B!B"1@B"B#IWB#СB$TB$ՁB%SB%)B&CB&HB''.B'B'qB(aB(rB)!B){B)ҠB*%B*tB*HB+B+KB+B+ǷB+B,4B,dcB,B,B,lB,B-B-2jB-FB-VB-cB-k3B-oBB-oBB-k3B-cB-VB-FB-2jB-B,B,lB,B,B,dcB,4B+B+ǷB+B+KB+B*HB*tB*%B)ҠB){B)!B(rB(aB'qB'B''.B&HB&CB%)B%SB$ՁB$TB#СB#IWB"B"1@B!B! B uB?B?BBBXtBBBXBB?BABBBBBUBBB BDBzkBBB?B?BlB B dB fB 'BB BB.B\B.BBFBBaB(BBBqB/BB4B\"BBYBqB BBnB B nB!RB!cB"B#^B#B$>B$B%SB%أB&ZB&B'UB'B(BB(B)!B)B)8B*U B*[B+B+gB+B, B,XPB,B,B-&CB-cB-B-B.B..B.WB.|WB.B.B.mB.B.eB/B/ B/B/B/ B/B.eB.B.mB.B.B.|WB.WB..B.B-B-B-cB-&CB,B,B,XPB, B+B+gB+B*[B*U B)8B)B)!B(B(BB'B'UB&B&ZB%أB%SB$B$>B#B#^B"B!cB!RB nB BnBB BqBYBB\"B4BB/BqBBB(BaBBFBB.B\B.BB BB 'BhBFB!mBBBB|yBN\B4BBB BHFB B=BaB'B(YB(B)h?B)QB*hB*B+[B+ϼB,@+B,B-B-{rB-B.:B.B.B/=UB/B/B0~B0^B0MB0ץB1 B1@B1n&B1B1B1~B1B25B2+GB2<%B2HB2QaB&B&B%|B$B$AB#B"B"RB!B ZB IBB3B(BmBBB.NBiBBJB B@ Bp/BBLBBqBfB.BBB3BBBeB?BBB.B(BcB1BB!BBQHB=BҴBB IB!B!B"iB#B#WB$o-B%B% B&ZB&B'B(+)B(B)PB)xB*hB*B+sB+B,pyB,B-_B-B.>B.iB/B/rB/B0-B0UB0ץB1&B1rWB1B1B2<%B2w=B27B2 B3B3:/B3`wB3B3^B3B3PB3fB38B3B3 B3 B3B38B3fB3PB3B3^B3B3`wB3:/B3B2 B27B2w=B2<%B1B1B1rWB1&B0ץB0UB0-B/B/rB/B.iB.>B-B-_B,B,pyB+B+sB*B*hB)xB)PB(B(+)B'B&B&ZB% B%B$o-B#WB#B"iB!B!B IBBҴB=BQHBB!BB1BcB(B.BBB?BeBBB3BB+jBBBBB^BeB=B*BIBBBBWB"BBBv%B 7B B!B"lB##B#+B$B%8XB%B&B'2B'ՐB(uCB)B)0B*AQB**B+cB+B,xB,B-B-B.x?B.,B/bjB/B0=B0B1 B1iB1FB2B2sB2bB3B3WB3B3 B4B4OB4.B4uB4~B5GB5&B5EB5^B5tB5B5B5B5B5B5B5B5B5tB5^B5EB5&B5GB4~B4uB4.B4OB4B3 B3B3WB3B2bB2sB2B1FB1iB1 B0B0=B/B/bjB.,B.x?B-B-B,B,xB+B+cB**B*AQB)0B)B(uCB'ՐB'2B&B%B%8XB$B#+B##B"lB!B B 7Bv%BBB"BWBBBBIB*B=BeB^BBBBB+jBkBQB5BBVBB@BBfBB5B5RB6&B6VeB6B6LB6EB6B7/B7B7,B79B7BB7FB7FB7BB79B7,B7B7/B6B6EB6LB6B6VeB6&B5RB5B5}>B50B>heB>B>BB?B?:mB?VB?mB?B?B?:B?B?B?:B?B?B?mB?VB?:mB?B>BB>B>heB>0B=RB=B=n4B=$tBB6qB6 B7FB73B8eB8OB9uB9B:tB:B;dwB;%B'WB>{B>{B>'WB=CB=rB= BB4~B4:BB3B2B2<%B1B0ץB0 B/fB.iB-KB-&CB,`]B+B*6B)B)-KB(YB'B&B%B$B$}B#2B"OB!i B BBBB B`BB%BBBB+B B!B"fB#B$B%iB&KB'+ B(B(B)B*B+cB,4B-B-B.B/Z,B0~B0B1B2QLB>B?B?rB?B@ B@q B@BABAFBABABABB"tBBMBBtBBBBBBBBBBBB3BBBBBB3BBBBBBBBBBBBtBBMBB"tBABABABAFBAB@B@q B@ B?B?rB?B>B>LB=B=rB"B>B?OB?B?B@TB@BABAqBAuBBBBeBBBB`BC04BCjPBCBCDBCBD# BDE4BDbBDzBDBD2BDBDBDBDBD2BDBDzBDbBDE4BD# BCBCDBCBCjPBC04BB`BBBBeBBBAuBAqBAB@B@TB?B?B?OB>B>"B=B=$tB<9B<B;B:B:bB9B9-B8B7B7BB6B5B58B4.B3 B3B2Q5DB>=B??B?B@8UB@BA BA BAQBB\BBOBCBCo)BCBDBDXBD2BDBEBEMBE6BEBE(BEBFBF,KBF@%BFOBFXBF]BF]BFXBFOBF@%BF,KBFBEBE(BEBE6BEMBEBDBD2BDXBDBCBCo)BCBBOBB\BAQBA BA B@B@8UB?B??B>=B>5DB=AB=?BkB>@B??B?B@TB@EBAYBABBMBB!BC04BCBDBDbBD{BEBEk~BErBFBFJBFBFkBFLBG/EBG\PBGhBGBGŭBGBGBH BH BH(BH(BH BH BGBGBGŭBGBGhBG\PBG/EBFLBFkBFBFJBFBErBEk~BEBD{BDbBDBCBC04BB!BBMBABAYB@EB@TB?B??B>@B>kB=B<BqB?OB?B@AB@ԆBAc3BABBtBB3BCtBCuBDbBDBE?*BEBF BFgBFpBGFBGfTBGBGBH9~BHvBHBHpBI BI6BIZmBIxBIBIBI=BIvBIőBIőBIvBI=BIBIBIxBIZmBI6BI BHpBHBHvBH9~BGBGBGfTBGFBFpBFgBF BEBE?*BDBDbBCuBCtBB3BBtBABAc3B@ԆB@AB?B?OB>qB=CB=)B<&B;їB; tB:kB9B84B89cB7wOB6 B5B5)B4OB3~FB2B1B0B0~B/=UB.[B-wbB,B+B*NB)ίB(B'B&B&B% B$B#B"B>B?[9B?B@`BA=BABBjzBBBChBDBDgBEBEBFBFvBFWBGMJBGBH(BHkBHBI5BI_BIBI]BJ&BJ_JBJBJ BJNBKsBK-wBKGVBK\BKkBKuBK{&BK{&BKuBKkBK\BKGVBK-wBKsBJNBJ BJBJ_JBJ&BI]BIBI_BI5BHBHkBH(BGBGMJBFWBFvBFBEBEBDgBDBChBBBBjzBABA=B@`B?B?[9B>B>B=W#BB6VeB7,B7B8,B9RB:gLB;. B;}B'WB>B?B@=B@BA BB0BBϗBCjPBDBDgBE!BEBF1BBF}BG/EBGBH=BHRBHBIZmBIYBJuBJnBJ BKsBKVBKFBKءBLBLFBLuBLBLÚBLBLRBMVBM"BM,BM1BM1BM,BM"BMVBLRBLBLÚBLBLuBLFBLBKءBKFBKVBKsBJ BJnBJuBIYBIZmBHBHRBH=BGBG/EBF}BF1BBEBE!BDgBDBCjPBBϗBB0BA B@B@=B?B>B>'WB=n4BB4AB3€B2 B1B1FB0-B/AsB.SmB-cB,pyB+{B*B)B(B'B&B%B$@B#B$TB%)B&BB'ՐB(B)֔B**B+ϼB,8B-B.B/B0$B1NB2sB3\6B4BB5&B6 B6B7(B8B9pB:CKB;B;BB0B>B?B@bBABAuBBtBCBCBDbBDBBEBF,KBFtBGHHBGϻBHRBH8BIK'BIvBJ1BJBKBKfiBKBLRBLoBL\BMBML5BMwBMŐBM|BN*1BNTBNyBNBNqBNBNBNsBNBNBNsBNBNBNqBNBNyBNTBN*1BM|BMŐBMwBML5BMBL\BLoBLRBKBKfiBKBJBJ1BIvBIK'BH8BHRBGϻBGHHBFtBF,KBEBDBBDbBCBCBBtBAuBAB@bB?B>B>0B=n4B"B>B?B@q BA.BABBfBCRBDBDBERBEBFBG/EBGŭBHWBHBInBIBJsBJwBKfiBKءBLFBLBMVBMqBMBNBNo>BNBN'BO?TBOzJBOBOeBP ~BP1ABPQBPlBPVBPBPjBPBPBPjBPBPVBPlBPQBP1ABP ~BOeBOBOzJBO?TBN'BNBNo>BNBMBMqBMVBLBLFBKءBKfiBJwBJsBIBInBHBHWBGŭBG/EBFBEBERBDBDBCRBBfBABA.B@q B?B>B>"B=W#BB?B@gBA.BABBBCo)BD'BDBEBF;-BFWBGlBH*]BHBI_BIBJEBKsBKBLBLvBM BMBMBNYBNBO9BOzJBO?BP!BPlBPBP8BQ0 BQfBQBQjBQBR BR&BR<BRLBRWBR]BR]BRWBRLBR<BR&BR BQBQjBQBQfBQ0 BP8BPBPlBP!BO?BOzJBO9BNBNYBMBMBM BLvBLBKBKsBJEBIBI_BHBH*]BGlBFWBF;-BEBDBD'BCo)BBBABA.B@gB?B>B=B=)BB?rB@FBABA+BBBCtBD6BDpBEBFgBGFBGʴBHvBI_BIvBJ_JBJBKBL!BLBM7&BMBN:BNqBO)BOBPBPlBP6BQ*BQBQBR BRhBRBRBS$BSPBS|hBSOBSIJBSBSBTBTBTTBTTBTBTBSBSBSIJBSOBS|hBSPBS$BRBRBRhBR BQBQBQ*BP6BPlBPBOBO)BNqBN:BMBM7&BLBL!BKBJBJ_JBIvBI_BHvBGʴBGFBFgBEBDpBD6BCtBBBA+BAB@FB?rB>B=aB<B<B; tB::MB9QYB8eB7wOB6]B5B4B3B2B1B0B/B.iB-B,B+B*B){B(mtB)NB*[B+õB,LB-B.B/B0B1B2}B3 B4XB5RB6B7B8ԞB9ŝB:B;BQ%B?1B@ B@BABBBC`BD,BDpBErBF{BG9EBGBHBIZmBJBJBKVBKBLvBM,BMGBNOZBNBO_yBOeBP\xBPӣBQEBQBRBR~BRBS4KBSBSgBTBT`BTBTBU eBU6wBU]BUBU!BUBUBUBUBUBUBUBUBU!BUBU]BU6wBU eBTBTBT`BTBSgBSBS4KBRBR~BRBQBQEBPӣBP\xBOeBO_yBNBNOZBMGBM,BLvBKBKVBJBJBIZmBHBGBG9EBF{BErBDpBD,BC`BBBAB@B@ B?1B>Q%B=n4BB=B>=B?B@`BABB\BC5 BD BDBEBFvBG>GBH BHBI~BJ67BJNBKFBLFBLBMBN/BNBO_yBOBP|BQBQIBR$BR~BRBS`BSDBT.BTBTBU<BU*BUBVBVWoBVoBVBVBWBW<BWXBWoBW BWBWOBWOBWBW BWoBWXBW<BWBVBVBVoBVWoBVBUBU*BU<BTBTBT.BSDBS`BRBR~BR$BQIBQBP|BOBO_yBNBN/BMBLBLFBKFBJNBJ67BI~BHBH BG>GBFvBEBDBD BC5 BB\BAB@`B?B>=B=B=>B<B;$B:1PB9; B8BheB?VB@ABA* BBFBB`BCDBDBE$BFXBG*EBGBHBILBJJBK IBKBLzMBM,BMڸBNBO)BOBPgIBPBQ5BR BRBS.BSoBT)BTBUBUz4BUBV@BVBVBWABWBWѳBX:BXKBXHBXBXwBXiBYBY-BY?pBYK BYPBYPBYK BY?pBY-BYBXiBXwBXBXHBXKBX:BWѳBWBWABVBVBV@BUBUz4BUBTBT)BSoBS.BRBR BQ5BPBPgIBOBO)BNBMڸBM,BLzMBKBK IBJJBILBHBGBG*EBFXBE$BDBCDBB`BBFBA* B@AB?VB>heB=woBB.WB/nB0UB1B2B3B4B5B6B7pB8B9B:B;B=B?B@BABBBC}BDbBEDBF"aBFLBGBHBIxBJEBKsBKmBLvBMQzBN aBNBOoBPBP\BQfBR$BRBS4KBSIJBTP6BTBUXQBUBVL BVBW*BWOBWUBXPBXBXiBYEGBY}BYBZBZ;BZjBZMBZBZhBZBZB[ B[B[B[ BZBZBZhBZBZMBZjBZ;BZBYBY}BYEGBXiBXBXPBWUBWOBW*BVBVL BUBUXQBTBTP6BSIJBS4KBRBR$BQfBP\BPBOoBNBN aBMQzBLvBKmBKsBJEBIxBHBGBFLBF"aBEDBDbBC}BBBAB@B?B>=B=BB.pB/B0B1B2SB3B4B6 eB7B8'B92B::MB;@,BC5B??B@8UBA.BB"tBC0BDBDBE(BFxBGyBHvBIP=BJ&BJBKBLvBM\BNBNBOBPQBQBQBR]BSyBSOBT?pBTBUi@BUBVRBWBW BWBXmBXJBYEGBYBZBZ_$BZBZB[F6B[B[iB[=B\)+B\S,B\w:B\NB\dB\xB\ˈB\ѐB\ѐB\ˈB\xB\dB\NB\w:B\S,B\)+B[=B[iB[B[F6BZBZBZ_$BZBYBYEGBXJBXmBWBW BWBVRBUBUi@BTBT?pBSOBSyBR]BQBQBPQBOBNBNBM\BLvBKBJBJ&BIP=BHvBGyBFxBE(BDBDBC0BB"tBA.B@8UB??B>C5B=DBB4oB5&B6B?B@BABBBChBDzBEk~BFXBGCHBH*]BI BI{BJ\BKBLzMBML5BNHBNsBOBPlBQ*BQBBRBSJwBSBTBUABUBVyBW9BWBX(]BXBY-BYBZNBZcBZB[^B[pB\.B\k4B\qB]B]DgB]B]B]eB^B^7B^VCB^nB^B^YB^yB^yB^YB^B^nB^VCB^7B^B]eB]B]B]DgB]B\qB\k4B\.B[pB[^BZBZcBZNBYBY-BXBX(]BWBW9BVyBUBUABTBSBSJwBRBQBBQ*BPlBOBNsBNHBML5BLzMBKBJ\BI{BI BH*]BGCHBFXBEk~BDzBChBBBAB@B?B>B=BB1JB0B/RB0NB1RB3B4-hB5IXB6cwB7{B8B9DB:tB;{BB?B@BAQBB3BCTBDBEBF`BGŭBHBIBJEBKfiBLFBM"BM|BNBOBPlBQ5}BQ-BRBSvBT.BTBUBV:BVkBW BXBXBYEGBYBZY=BZUB[XB[]B\A)B\dB]B]tB] B^%aB^tB^iB_B_?B_w'B_B_B_4B`AB`1 B`CB`P=B`VwB`VwB`P=B`CB`1 B`AB_4B_B_B_w'B_?B_B^iB^tB^%aB] B]tB]B\dB\A)B[]B[XBZUBZY=BYBYEGBXBXBW BVkBV:BUBTBT.BSvBRBQ-BQ5}BPlBOBNBM|BM"BLFBKfiBJEBIBHBGŭBF`BEBDBCTBB3BAQB@B?B>B=B"B?1B@=BAFBBMBCRBDSBERBFOBGHHBH>BI1BJ!BKsBKBLBMGBN!BOzJBPQBQ%(BQBR-BSBTJBU eBUBVyBW*BWyBXHBY">BYABZY=BZB[{B\6B\EB]B]B]B^b}B^ʱB_-B_B_cB`1 B`{B`B` Ba7BaiBaBaBaIBaBbBb0BbBbBb0BbBaBaIBaBaBaiBa7B` B`B`{B`1 B_cB_B_-B^ʱB^b}B]B]B]B\EB\6B[{BZBZY=BYABY">BXHBWyBW*BVyBUBU eBTJBSBR-BQBQ%(BPQBOzJBN!BMGBLBKBKsBJ!BI1BH>BGHHBFOBERBDSBCRBBMBAFB@=B?1B>"B= B;,B:%B9B8B7B6B5cHB4BB3 B1B3)0B4OB5tB6B7WB8B9B;B<,B=DB>ZrB?mB@;BA BBBCBDBEBF}BGBHBIBJBKBLBMkBNTBO9BPBPBQBRBS|hBTJBUBUoBVBWXBX:BXBYtBZNBZâB[cB[9B\NB]&"B]B^7B^GB_3GB_B`AB`B`BaD!Ba4BaZrB=DB<,B;B9B8B7WB6B5tB4OB3)0B4SB5}>B6B7B8OB:B;2BB?B@BA=BBBCuBDZBFBG HBH(BI5BJTBKsBL{BLRBMBNBOBPBQBRxBSUBT.BUBUBVBWj BX.&BXBYBZ_$B[B[pB\e1B]B]xB^=B^B_^sB_B`i'B`Ba]DBaΩBb:-BbBbSBcXBc.Bc\Bd@KBdBd?Bd0BeBeCBedgBe~BeBe3BeBeBe3BeBe~BedgBeCBeBd0Bd?BdBd@KBc\Bc.BcXBbSBbBb:-BaΩBa]DB`B`i'B_B_^sB^B^=B]xB]B\e1B[pB[BZ_$BYBXBX.&BWj BVBUBUBT.BSUBRxBQBPBOBNBMBLRBL{BKsBJTBI5BH(BG HBFBDZBCuBBBA=B@B?B>B=n4BB4SB5}>B6LB7B8B:#B;I?B@B?B@BBBCBD,BE?*BFOBG\PBHfBInBJsBKuBLuBMqBNiBO_yBPQBQ@cBR+BSBSBTBUBVBW^BX.&BXiBYABZB[@CB[=B\dB]\B^B^B_KB_B`{Ba BaBbBbeBczBcBcBdZ!Bd?Be3BejBeaBfzBfC3Bf~{BfGBfBg OBg*wBgEBgXBgf@BglBglBgf@BgXBgEBg*wBg OBfBfGBf~{BfC3BfzBeaBejBe3Bd?BdZ!BcBcBczBbeBbBaBa B`{B_B_KB^B^B]\B\dB[=B[@CBZBYABXiBX.&BW^BVBUBTBSBSBR+BQ@cBPQBO_yBNiBMqBLuBKuBJsBInBHfBG\PBFOBE?*BD,BCBBB@B?B>@B=BB6B7B9B:,B;VB<&B=B>B@rBA* BBMBCo)BDBEBFkBGBHBJBKBL&BM1BN:BO?TBPAtBQ@cBR<BS4KBT)BUKBVBVBWyBXaBY5BZpB[F6B\.B\B]B^nB_-B_B`BaJiBaBbeBc8BcҾBdgBdBe~BfzBf~{BfnBgf@BgBh57Bh3BhBi;BigBiYBjBj>EBjn%Bj?BjBjBjBjgBjIBjIBjgBjBjBjBj?Bjn%Bj>EBjBiYBigBi;BhBh3Bh57BgBgf@BfnBf~{BfzBe~BdBdgBcҾBc8BbeBaBaJiB`B_B_-B^nB]B\B\.B[F6BZpBY5BXaBWyBVBVBUKBT)BS4KBR<BQ@cBPAtBO?TBN:BM1BL&BKBJBHBGBFkBEBDBCo)BBMBA* B@rB>B=B?B@BA=BBeBCBBDBE(BFPBH(BI,BJEBK\BLoBMBN(BOBPBQBRBSBT=BU!BVoBW BXmBYVBZ;B[B[=B\ѐB]xB^tB_?B`B`BaBb:-Bb/BcBd@KBd2Be~Bf-BfBg1Bg.Bh57BhBi Bi/Bi5BjRBjBjIBkJBk8Bk͒BlBl5Bl_BlBl~Bl{BlxBlzBlzBlxBl{Bl~BlBl_Bl5BlBk͒Bk8BkJBjIBjBjRBi5Bi/Bi BhBh57Bg.Bg1BfBf-Be~Bd2Bd@KBcBb/Bb:-BaB`B`B_?B^tB]xB\ѐB[=B[BZ;BYVBXmBW BVoBU!BT=BSBRBQBPBOBN(BMBLoBK\BJEBI,BH(BFPBE(BDBCBBBeBA=B@B>?B= B?B@NBAFBBtBCBDIBEBGFBH9~BIZmBJxBKBLBMŐBNBO*BPBR$BS BTBUBV/BW9BXBXiBY\BZhB[pB\YB]B^\`B_3GB`B`LBa4Bb`9BcABc-BdBe=GBe=BfBg*wBgÆBhVBhBikEBicBjgLBjBkJBkBlBlmBlxBmBmTBmWBmBmlBn(BnL{BnhBn~HBnBnBnBnBn~HBnhBnL{Bn(BmlBmBmWBmTBmBlxBlmBlBkBkJBjBjgLBicBikEBhBhVBgÆBg*wBfBe=Be=GBdBc-BcABb`9Ba4B`LB`B_3GB^\`B]B\YB[pBZhBY\BXiBXBW9BV/BUBTBS BR$BPBO*BNBMŐBLBKBJxBIZmBH9~BGFBEBDIBCBBtBAFB@NB>?B=B<&B;I?B:B;2BB@BAFBBxBCbBDBFBG/EBHWBI~BJ$BKBLBMBOBP1ABQEBRWBSf3BTqBUz4BVRBW BXHBYyBZpB[cB\S,B]>WB^%aB_*B_B`BaBbfBc2mBc\Bd?BewBf/xBfBg0Bh57Bh֊Bir BjBj?Bk BkBl BlBmBmqBmBn0BnhBnBokBo[Bo|BoBo:Bp_Bp4PBpJ BpXBp_Bp_BpXBpJ Bp4PBp_Bo:BoBo|Bo[BokBnBnhBn0BmBmqBmBlBl BkBk Bj?BjBir Bh֊Bh57Bg0BfBf/xBewBd?Bc\Bc2mBbfBaB`B_B_*B^%aB]>WB\S,B[cBZpBYyBXHBW BVRBUz4BTqBSf3BRWBQEBP1ABOBMBLBKBJ$BI~BHWBG/EBFBDBCbBBxBAFB@B>B=BGBHkBIBJ BK=BM BN/BOOgBPlBQIBRBSBTBUBVkBWBXBY>BZB[HB\ݡB] B^iB_B`Bap#BbM3Bc%Bc\Bd9BeBfVBgBgBhBi5BiBjBk BkBlJBl|Bm[BmBnSBnŖBo0Bo|Bo:BpJ BpBpBq$jBq^BqMBqbBq.BrBrBr%Br,Br,Br%BrBrBq.BqbBqMBq^Bq$jBpBpBpJ Bo:Bo|Bo0BnŖBnSBmBm[Bl|BlJBkBk BjBiBi5BhBgBgBfVBeBd9Bc\Bc%BbM3Bap#B`B_B^iB] B\ݡB[HBZBY>BXBWBVkBUBTBSBRBQIBPlBOOgBN/BM BK=BJ BIBHkBG>GBFBDBCbBBtBA=B@rB>@B?BA* BBeBCBDBFBGCHBHvBIBJիBLDBM,BNTBOzJBPjBQBRBSBUBV$;BW6[BXEOBYPBZY=B[^B\_/B]\B^VCB_KB`=Ba+Bb0BbBc-BdBeBf]Bg*wBgHBhBir Bj)BjBkKBl.BlzBmj BmlBnBo?Bo|Bp"BpBpLBqWBqBrgBr`BrBrBs)HBs]BsqBsBsBssBs}BsBsBs}BssBsBsBsqBs]Bs)HBrBrBr`BrgBqBqWBpLBpBp"Bo|Bo?BnBmlBmj BlzBl.BkKBjBj)Bir BhBgHBg*wBf]BeBdBc-BbBb0Ba+B`=B_KB^VCB]\B\_/B[^BZY=BYPBXEOBW6[BV$;BUBSBRBQBPjBOzJBNTBM,BLDBJիBIBHvBGCHBFBDBCBBeBA* B?B>@B=n4B>B?BA BBMBCBBDIBFBG>GBHvBIBJBLBMABNo>BOBP\BQBS BT.BUMBVhBW BXBYBZB[iB\ˈB] B^B_B`BaBb{BcBdBedgBfC3Bg3BgHBhRBi/BjRBkBk͒BlBm1BmBn~HBokBoIBpBBpBqPOBqBrCBr6Bs^Bs{xBsmBt(,BtsBtBtnBu)BuW^Bu}BuBu Bu\BuBuBu\Bu BuBu}BuW^Bu)BtnBtBtsBt(,BsmBs{xBs^Br6BrCBqBqPOBpBpBBoIBokBn~HBmBm1BlBk͒BkBjRBi/BhRBgHBg3BfC3BedgBdBcBb{BaB`B_B^B] B\ˈB[iBZBYBXBW BVhBUMBT.BS BQBP\BOBNo>BMABLBJBIBHvBG>GBFBDIBCBBBMBA B?B>B?B@BB, BCo)BDBEBG/EBHkBIBJBLBML5BN3BOBP~BR BS4KBT[fBUBVBWfBXJBYB[ B\-B],.B^7B_?B`CBaD!Bb@Bc8Bd,BeBf BfBgBhBigBjYBk'BkFBl{BmqBn(BnBoBp-BpBqfKBqHBrBs wBsqBtBtsBtݦBu@BuBu\Bv=2BvBv`BvBw%+BwL Bwk.BwBw*BwBwBw*BwBwk.BwL Bw%+BvBv`BvBv=2Bu\BuBu@BtݦBtsBtBsqBs wBrBqHBqfKBpBp-BoBnBn(BmqBl{BkFBk'BjYBigBhBgBfBf BeBd,Bc8Bb@BaD!B`CB_?B^7B],.B\-B[ BYBXJBWfBVBUBT[fBS4KBR BP~BOBN3BML5BLBJBIBHkBG/EBEBDBCo)BB, B@B?B@BBBCHfBDBE(BGFBHWBIBJիBLBML5BNBOBPBR BSPBT}BUrBVCBWUBYBZ5B[RB\k4B]B^yB_pB`BakBb5BcBdBeIBfyBg0BhxQBi]Bj>EBkBkFBlxBmJBnSBo?Bo!BpBq3 BqBr~LBs^BsBt>BtBuHBu\Bv5BvuBwBwceBw7BxzBxN$Bx!Bx\BxBylBy;(ByRBybByjByjBybByRBy;(BylBxBx\Bx!BxN$BxzBw7BwceBwBvuBv5Bu\BuHBtBt>BsBs^Br~LBqBq3 BpBo!Bo?BnSBmJBlxBkFBkBj>EBi]BhxQBg0BfyBeIBdBcBb5BakB`B_pB^yB]B\k4B[RBZ5BYBWUBVCBUrBT}BSPBR BPBOBNBML5BLBJիBIBHWBGFBE(BDBCHfBBB@BA=BCBDbBEBFPBH9~BI~BJ BLDBMABN3BOBP8BR+BS`BTjBUBVBXBYEGBZjB[B\dB]B^CB_4Ba BbBc%Bd,Be0?Bf/xBg*wBh!BiIBjBjBk͒BlyBmBOBPBR+BSf3BTBUBW}BX9BYh\BZMB[pB\B^B_&B`CBa]DBbsEBcBd\Be3BfBgBhcBiBj?BkKBltBm[Bn>GBokBo:BpőBqMBrYHBs^BsmBtOBu8BuBvBwfBweBx>lBx\ByCByBz*}BzBzB{LB{B{}B|(B|bLB|B|B|ݹB|}B}B}GB}GB}B|}B|ݹB|B|B|bLB|(B{}B{B{LBzBzBz*}ByByCBx\Bx>lBweBwfBvBuBu8BtOBsmBs^BrYHBqMBpőBo:BokBn>GBm[BltBkKBj?BiBhcBgBfBe3Bd\BcBbsEBa]DB`CB_&B^B\B[pBZMBYh\BX9BW}BUBTBSf3BR+BPBOBNo>BM,BK=BJ$BIZmBH(BFkBEzHBD,BBBCuBE?*BFBGBI,BJxBKBM BNTBOBP~BR BS`BTBUoBWBXKBYBZB[MB] B^7B_^sB`BaBbBc-Bd0BfzBgBhkBi Bj"Bk BlBmBmlBnPBo!BpBqBr`Bs0BsBtQBu}Bv5BvBw*Bx6Bx+ByjBypBzB{B{}B{B|ZB|B}B}jgB}6B}B~2kB~dB~B~MB~ɌB~gB~B~B~gB~ɌB~MB~B~dB~2kB}B}6B}jgB}B|B|ZB{B{}B{BzBypByjBx+Bx6Bw*BvBv5Bu}BtQBsBs0Br`BqBpBo!BnPBmlBmBlBk Bj"Bi BhkBgBfzBd0Bc-BbBaB`B_^sB^7B] B[MBZBYBXKBWBUoBTBS`BR BP~BOBNTBM BKBJxBI,BGBFBE?*BCuBDZBFOBGBHBJEBKBLBN/BOzJBP\BR BSPBTjBUBWBXPBY}BZâB[=B],.B^\`B_B` BaIBbSBd Be=GBfVBglBhBi/Bj?BkBl~BmhBnBoBpuBq^BrCBs!BsBt{BuBvcBw%+BwOBxByCByqBzB{$MB{B|A{B|B}@B}6B~!B~DB~B7PBBǠBBJB0BABNBWTB[B[BWTBNBAB0BJBBǠBB7PB~B~DB~!B}6B}@B|B|A{B{B{$MBzByqByCBxBwOBw%+BvcBuBt{BsBs!BrCBq^BpuBoBnBmhBl~BkBj?Bi/BhBglBfVBe=GBd BbSBaIB` B_B^\`B],.B[=BZâBY}BXPBWBUBTjBSPBR BP\BOzJBN/BLBKBJEBHBGBFOBDZBFBG\PBHBJBK\BLBMBOOgBPjBQBS4KBT}BUBW}BXKBY}BZɎB\6B]>WB^tB_B`ٍBbBc2mBdZ!Be~BfyBgBh֊BicBjIBl BmBnBokBp_BqBrBrBsmBtButBvkkBw<{BxzBxDByBzBBzB{B|A{B|ݹB}rB~BB~DBB{BB( BWTBhBQBBtBBuB+B9BABFEBFEBAB9B+BuBBtBBQBhBWTB( BB{BB~DB~BB}rB|ݹB|A{B{BzBzBByBxDBxzBw<{BvkkButBtBsmBrBrBqBp_BokBnBmBl BjIBicBh֊BgBfyBe~BdZ!Bc2mBbB`ٍB_B^tB]>WB\6BZɎBY}BXKBW}BUBT}BS4KBQBPjBOOgBMBLBK\BJBHBG\PBFBG HBHfBIvBKBLoBMŐBOBPlBQBS BT[fBUrBVBX9BYBZâB\6B]DgB^B_3B`Bb'-BcXBdhBeBfBgBi Bj>EBkWBlmBm-BnBo|BpBqBrBsqBt{0BufBvLBw,BxzBxByBzrB{4B{B| B}QB}B~B.BB#BdEBi BgBfBeBdhBcXBb'-B`B_3B^B]DgB\6BZâBYBX9BVBUrBT[fBS BQBPlBOBMŐBLoBKBIvBHfBG HBH(BInBJ\BL&BMBNBP1ABQIBRBT.BUBVCBXBYh\BZB[=B]>WB^B_eB` Bb:-BcrqBdBe Bg OBh57Bi]BjBkBlxBmBnwBpBqBrBs^BtBuBvbBvBwOBx\ByBzzB{LB|B|ݹB}@B~SBBB( BuwBBBFEBBjBB#BPByDBgBBbB%BdBB=BBB=BBdB%BbBBgByDBPB#BBjBBFEBBBuwB( BBB~SB}@B|ݹB|B{LBzzByBx\BwOBvBvbBuBtBs^BrBqBpBnwBmBlxBkBjBi]Bh57Bg OBe BdBcrqBb:-B` B_eB^B]>WB[=BZBYh\BXBVCBUBT.BRBQIBP1ABNBMBL&BJ\BInBH(BI5BJsBKmBM1BN(BO*BQEBRBSBUMBVBWUBYEGBZMB[MB],.B^tB_3B` Bb@BcCBd?Be\Bg*wBh]tBi/BjBkbBmBn(BoFnBp_BqtBrBsBtqBuBvBw*Bx=ByrBzZB{BBbB B8OBaBBBB BBBBBBBBB BBBBaB8OB BbBBg>B(`BhBgBSrBBB[BBH=B~DB}B|cBhxQBi(BjBlBm?BnhBoJBpBqBr>BsBu 9BvBwfBxBylBzsB{B{B|zB}6B~BaBByB B4BBB1VB}B3B BJBB(BZB BJZBp B!BBSB_BB9BBB9BB_BSBB!Bp BJZB BZB(BBJB B3B}B1VBBB4B ByBBaB~B}6B|zB{B{BzsBylBxBwfBvBu 9BsBr>BqBpBoJBnhBm?BlBjBi(BhxQBg>cBfzBdBcCBb:-B`B_B^\`B] B[pBZjBYBWfBVhBUBSBRWBPBOBN:BLؔBKuBJTBKsBLuBMڸBO?TBPBR$BSf3BTBV$;BW BXJBZ5B[B\B^7B_B`ٍBb'-BcrqBd?BfzBgEBhBiÍBjIBl5Bmj BnBoBpLBrBs85BtUiBunCBvBw*BxByBz B{B|B}OB~mBPBBhBtBOBB Bg>BBB]BBB.,BkTBB_B B3JBYB{BBBlB BBBBB BlBBB{BYB3JB B_BBkTB.,BBB]BBBg>B BBOBtBhBBPB~mB}OB|B{Bz ByBxBw*BvBunCBtUiBs85BrBpLBoBnBmj Bl5BjIBiÍBhBgEBfzBd?BcrqBb'-B`ٍB_B^7B\B[BZ5BXJBW BV$;BTBSf3BR$BPBO?TBMڸBLuBKsBL{BMqBNBPAtBQBS BTqBUBW6[BXBYB[RB\dB^B_^sB` BbBcXBdBe\Bg>cBhBiYBk BlJBmcBe\BdBcXBbB` B_^sB^B\dB[RBYBXBW6[BUBTqBS BQBPAtBNBMqBL{BLRBNiBOբBQ@cBRBTBUz4BVkBXEOBYB[ B\k4B]B_&B`BaIBc2mBdhBe Bg*wBhxQBiÍBk BlQBmWBnBp"BqHBr~LBsBtݦBvbBw,BxN$ByjBzB{B| B}B~MBBSBBABB#BBDB]B(BlBtBBIBhGBB>B5 BpHBBBB.BQuBoB?BBBB:B:BBBB?BoBQuB.BBBBpHB5 B>BBhGBIBBtBlB(B]BDBB#BBABBSBB~MB}B| B{BzByjBxN$Bw,BvbBtݦBsBr~LBqHBp"BnBmWBlQBk BiÍBhxQBg*wBe BdhBc2mBaIB`B_&B]B\k4B[ BYBXEOBVkBUz4BTBRBQ@cBOբBNiBLRBMBO_yBP6BR<BSBUBVRBWBYPBZB\-B]B^CB`CBaBbSBdZ!BeBg OBh]tBi(BjIBlJBmWBnBpBq^BrBsmBu 9Bv=2Bwk.BxByBzۂB{B}GB~!B.BJBUBuBB BKBBaBB2BBBP(B=B#BHBBBBVBVBXBvBBBbBOFBB2BXB BmB+B+5BBB)BtB:BBBB`BfBWTBB~DB}jgB|IB{$MBypBxDBwBvcBu)BsBrBqfKBpBnBmB[^B\ˈB^7B_pBa BbsEBc-Be=GBfyBgBi]BjBlBmj BnrBp"Bq^BrBs}Bu8BvzBw7BxBz*}B{]B|^B}6B~gBB BBgB#BuB%BUBlB!BWBqBBCBBB`BB .BVBBB#B]BB:B\BBB4BPBeBvdBZBBBZBvdBeBPB4BBB\B:BB]B#BBBVB .BB`BBBCBBqBWB!BlBUB%BuB#BgBB BB~gB}6B|^B{]Bz*}BxBw7BvzBu8Bs}BrBq^Bp"BnrBmj BlBjBi]BgBfyBe=GBc-BbsEBa B_pB^7B\ˈB[^BY>BXHBW9BU!BT)BR$BQ@cBOBPBR+BSOBUKBVoBXBYyBZB\_/B] B_?B`BbBcBd0BfVBgBi BjBkbBm?BnBo:BqHBrBsBu8BvBwBy BzJB{B|B}BB#BPBFEBӞB^>B BjBBkTBB^B BCBBBBBBӞBFEBPB#BB}B|B{BzJBy BwBvBu8BsBrBqHBo:BnBm?BkbBjBi BgBfVBd0BcBbB`B_?B] B\_/BZBYyBXBVoBUKBSOBR+BPBQBSBTBVBW BXiBZpB[HB]\B^B`CBakBc%Bd\BfzBglBh֊Bj>EBkBmBnhBoBq$jBr~LBsmBu)BvzBwBy~BzZB{B|ݹB~SBPBAB BmB%BBBB.,BQB3JBB+5BBB*BvBVBBBrBțBBeBVBB,BdBBBBB+BB{BSB_EBe Be B_EBSBB{B+BBBBBdB,BBVBeBBțBrBBBVBvB*BBB+5BB3JBQB.,BBBB%BmB BABPB~SB|ݹB{BzZBy~BwBvzBu)BsmBr~LBq$jBoBnhBmBkBj>EBh֊BglBfzBd\Bc%BakB`CB^B]\B[HBZpBXiBW BVBTBSBQBRxBSBUtBVBXmBY\B[cB\ݡB^VCB_BaD!Bb5Bd,Be3BgBhBicBkWBlxBn(BoJBpLBrQBsBu 9BvcBw7By BzZB{?B|BbBoBBB$BB9BBBKBXBBDBDB>B2aB 2BBBBBl\B7BDBBv\B+BۓBB,BtBkqBBFB(gBBBBBdWB^iB`=BaBc8BdBf/xBgBi Bj?Bl Bm-BnwBp_BqBs85BtBvbBwk.BxDBz*}B{B|ݹB~2kBBhB XBBPB%B3B$BBP(BBpHBB*B .BBBB,BkqBمBCDBB -Be BB BZBBB 2BVBBBׯBBzB"%B.B4B4B.B"%BzBBׯBBBVB 2BBBZB BBe B -BBCDBمBkqB,BBBB .B*BBpHBBP(BB$B3B%BPBB XBhBB~2kB|ݹB{Bz*}BxDBwk.BvbBtBs85BqBp_BnwBm-Bl Bj?Bi BgBf/xBdBc8BaB`=B^iB]>WB[pBZ;BXaBW6[BUBT.BUBVBX:BY5B[B\YB^%aB_Ba+Bb{Bd,BeIBg*wBhcBj"BkBmBnBpBqtBr>BtUiBu\Bw,BxBypB{]B|B~SBrBdBBUB BBA]BsBBŰB}BB7B B%tB%tB B7BB}BŰBBsBA]B BBUBB>BBBBBBBTB1B=BBPBaBRBBG(B:B.BBBqB_B<@BBBYBB XBdBqtBpBnBmBkBj"BhcBg*wBeIBd,Bb{Ba+B_B^%aB\YB[BY5BX:BVBUBUBW^BXBZpB[=B]B_*B`Bb0BcBeBfyBh!BiBk Bl~BnBo|BqBrBsBunCBvYBxN$ByB{$MB|^B}BPBWTBBBYBdBBJZBsB"B&JBBVBTB{BBBBB,BBBBBZBB 2B{wBтB"%Bm@BB?B+B_mBBBԐBBBBYBYBBBBԐBBB_mB+B?BBm@B"%BтB{wB 2BBZBBBBB,BBBBB{BTBVBB&JB"BsBJZBBdBYBBBWTBPB}B|^B{$MByBxN$BvYBunCBsBrBqBo|BnBl~Bk BiBh!BfyBeBcBb0B`B_*B]B[=BZpBXBW^BUBVBX.&BYcB[F6B\ѐB^\`B_Bap#BbBdBf Bg0BiIBj?BlBmhBokBpBrBsBu 9BvBwByjBzۂB|IB}6BBAB+BBPBBBOBBB9BBtBTBB8OBțBUBBdBBe BBTBB2aBBBZjBBjBRBB BYBKYBzB3BBB/BBBBB/BBB3BzBKYBYB BBRBjBBZjBBB2aBBTBBe BBdBBUBțB8OBBTBtBB9BBBOBBBPBB+BABB}6B|IBzۂByjBwBvBu 9BsBrBpBokBmhBlBj?BiIBg0Bf BdBbBap#B_B^\`B\ѐB[F6BYcBX.&BVCn,CnbCnZCo CoW)CoCoCpOCpCpCqL:CqCqfCrLCrCrCsOMCsuCsCtUCtCuCu_CuCvCvlCvCw!lCw|\CwכCx3*CxCx.CyGCy]Cz`Cz^Cz8C{C{xC{iC|4C|C|C}QC}pC~C~pC~C1,CCC)iCYCWCCC9CLC}CCyCdCAVCrPCPCVC_C6kCgyCCɕCC+C\CCCC CQhC>C CCwCECuC)C֗CC78CgjCCljCuC'HCWCC CCCCCrCCЫCPC-C\0CiC}CkC2CACoJCCɾCC#CP.C|CCCC,CXZCCCCC/qCYC#C1C CC+*CTlC}zCSCCjCmvCnC}C}C~DC~CCk C̈́CCIxCzCzCCCA|CsCCCCC:ClCCCC4CfCCC$C/.Ca4C4C.C C) CZCCC>C!CSCCCC>CJzC{CCݡC|C?CkCCjCCjCHCsCCCCCICt.C3CCCCDCmP[CmCmCnICnCnCoFCo:CoCpHCpCpCqMCqCq3CrUCrCsfCsbDCsCt/Ctr9CtͤCu)oCuCu"Cv?CvFCvCwWCwCxCxsCxCy2~Cy_CyCzSCzC{C{v$C{׸C|9C|C|C}`C}KC~&JC~C~CPCIC C>.CpRCCC(C9ClCCCC6SChCCfC!C3CfCaC!CC1CdQCCɭCOC.CawCCpCC+0C]xCCCC%CWCC@CCZCOCC/C:C$CDCuCC|CC6CfCC,CC$CTCCC|CC=3CkHC.CChC!CNC{CCCfC-CYrC(CCCC1C\CC-C+CC.~CWCm(|Cm{CmCn"CnwBCnCo!TCowCo)Cp#CpzCp+Cq*CqPCqCr4$CrCrCsACsCsCtSiCtVCu CuhVCufCv"CvCvCw=ECwCwLCxZCxCyCy{KCyCz=(CzC{.C{bC{QC|&C|C|xC}OC}C~C~zC~޲CBCjCC8lCjCtCCC5ChTC0CC C4Cg CC)C>C3XCfrCC̨CC2CeCCCC1CdCCzC;C/CbCCǔCC,KC^CC°CC&sCX*CC@CCCNCCClCCBZCrCCҘCZC1Ca^CCCCMCKCz-CUCLCC1C_C1C*CC~C>CjCC¢C"ClCD}CoVCC_CCCB@CkCm(CmSCmaCmCnPmCnCnHCoQbCoCoCpVZCp8CqCq_BCqlCrCrlCrpCs!ECs|Cs*Ct46CtCt|CuJCuLCvFCvdCvQCw"`CwCwCxACxCyCycCyLCz&CzCzBC{MC{C|C|w C|ڽC}>C}C~C~kC~IC5:C\CC2CehCNCHCRC1lCdCCC]C1CeC{CCYC2CfDCC2CC4CgCCLCC4Ch4CjCΔCC4CgCClC*C2CecCC;CC.C`CCpCC'CYC_CCCZCN C~CC-C:C?CnCXCͲCC+CZCBCCCCACo^CCCC#CP_C|CCCC, CWOC\C0CC*C,PCV;CCl_Cm+CmTCmCn)#Cn~CnCo+LCoCCo٭Cp1CpCpCq;CqfCqtCrICrCs*Cs[CsCtCtqCtCu,CuCuXCvH=CvCw"CwgCwvCx(&Cx,CxCyL6Cy6CzCzs#Cz C{9@C{C|zC|dC|C}-JC} C} C~\@C~C'NC C"C,C_CCjCC-EC`C\CCC/XCcCCʢCpC2BCfCC;CC5^Ci(CCШC\C8CkC7CһC1C9ClC*CWCoC9pClYC*CC{C6Ci[CCCC1Cc`CCnCC(CYCCjCCECLpC|oC@CC TC:CiCC6CC#CR CCC CFC5MCbCCCCjZCCCnCC@VCjqCPClCm:CmVCmCndCnWbCnCoCo\$CoCp FCpeCp8CqCqqCqxCr'nCrCrޤCs:CsCsCtRCtCuHCulCu Cv+~CvTCvCwLCwCxNCxoCxCy42CyCyCz]CzC{$eC{C{C|QC|C}C}.C}C~LC~C0CClC&CZ/CC{CCr5CCXC C@%CshCC٠C C?iCr!CC2C C;CmCCрC C4CeC CCC)|CYCCw CxV\CxCyCyCyCzFCzC{BC{t C{C|>xC|C} C}pC}pC~=C~C CrCنC CTtCmCzCC$CYCUCCC*C_CC CC1%CeCJCCkC7ClCCzC C>PCrCC8ChCCCwCCoC=CFCzCC|CCGC{CCCqCECx_CCܸCC@sCrCCCC6CgC8CȜCC(CXCBCCCCDCsHCCCC+zCXC@CMC C C9Ce8CCC8CjC>^CiCCClZ.ClCm\CmZ.Cm|CnFCn^CnKCoCog6CobCpCpt CpΰCq)Cq0CqCr=~CrPCrCsUDCsdCtCtpCtICu0CuFCuCvQCv9CwCwwCwٖCxCn UCneCnCoCorCo)Cp(.CpCpߨCq<CqCqfCrTCeCCC=C.JC`&CCNCC%CVC6CCCCGCw^CCCC3~CaC,C)CClCFCsCC CVC%aCQ-C|CCCCkؕCl.ClClCm3|Cm|CmCnnCqCqC/C C<CnICDCCC5Cf1C'CCnC(CXCCVCCCECtC CDC@C,CZ~CCCCC:BCfBCC~CCCk^ClClYClCmCma8Cm$CnCnmCnCo"Co~`CoTCp6CpCp&CqOCqvCr UCrkCr}Cs+CsCsCtORCtdCuCuvCu6Cv=Cv.CwCwkCw&Cx6Cx CyCyjjCyѠCz9.CzC{ FC{qC{ڠC|CC|)C}C}C}C~UyC~+C+C8CC6ClgCXC^CvCDCzC#CxCCTECC3CC.6CdCDCCMC>CuHCC&CCNC&C`CC'C]CCtC8C4CjuCCDC ~C?CtClC CCGC{]CxCiC0CJC~9CzCCmCJC|CCCCDCv CNCWC (C9CjCBC*CC)ECXxCmC$CCC@CnCC>C7C"COdC{CC:CC)CkCkVCl-ClVClݡCm6rCmCmCnDCnCnQCoVCz!~CzCzC{\=C{C|/C|C}:C}nC}C~EC~CBC*CHC0LCfCCNC C@]CvCCkC4CRCCCC-CdCxCfC RC@;CwCCCCRRCCC3C,CcCtCϴCC;CqCCrCCHC}CC-CCQCCCAC#aCWTCCCC%NCXRC#CC*C"]CTZCCCCCJC{C C9C *C;CkQCC}C4C&CTCCCC .C8CdC0CUC7CC@0CkR\CkrClClY9ClCm $CmdCm0CnCnuXCn5Co-Co}CoCpECpACq/CqbCqŠCr"CrCr>CsGCslCt 8CtoxCt,Cu7RCuCvCvfeCvDCw2Cw?CxVCxgCxϭCy7CyCz vCzrCzgC{F_C{C|@C|%C|TC}\C}ȄC~4C~C 5CyCC)C`CXC+CC< CsC+CQCCOCCRCC,CdSCCC \CACxC@C|CCUCCCC1ChCeC C CC CyfCCCCQCVCC`C'C\CCƞCEC/Cd C*CCC3`CfCCCC2 CdWCjCDCC+JC\tCaCCCCNC~hCCC C:Ci4CfCTCC hCMCznC CdCxC+GCVCk$Ck|CkCl,ClClPCm9~Cm6CmxCnKBCnConCoaCoCpCp}Cp܀CqC8CICoC.CfCQC׼C3CHCBCCpC+CcCQCC CF*C~CJCC(DC`C CWC CACyCCC!lCYCCChC6CmCCHCCHPC~CCC ^CUCMC{CvC*CCCGCUCChC*CbCCpC XCFJCGCKCVC*eCcvCC՛CCGCCCC+CdjC5CCCG,CCC`C(C`CC~C8C?Cw@CCCCSC.CCC-CcCCPCC8CmCgCC %C?-CrCCC C?Cr`CCCC:2CkCCQCC.C^CC CCCCICwCCӼC.C.VC[6CCCjgCjCkLCktrCk-Cl*|Cl`ClCm?Cm~CmCnZmCnCoCozCo CpCC>Cy%CCC(YCbC8CקCCLzCC3CC5CoCC*C(CXCC˙C6C>CxC\C|C#zC\RCC͎CC>"Cv*CCC)CTpCCbC C/{CeCCvCCCkCkClWCl4Cm6CmtCmCn5Cn:Cn6Co[CoCp"CpCpCqQUCqXCrCrCrCsTCsCt&CtCtCueCuCvC5CCICCTCfC*FCaCjCЬCC>CuC{CC~CM#CCCC!1CUCC|C C$TCWVCCCC CRCeCcCC}CECueCCCC1C_CCCCCiCiCjW?CjCkdCkldCkCl(BClClCmFCmaCnCnjCnCo07CoCo7Cp]CpCq(Cq7CqfCr^#CrpCs/HCsCtCtm CtCuCCuCvCvCvvCwdeCwCxACxCy CyCz`CzrVCzC{UjC{ǁC|9C|C}C}FC~C~{C~RCcCذC&Ca~C:CCCLC C,C]C9CtC6CC&CbOCCCpCOCCeCCC^>CCzCC3Ch\CCCC8dCkCCtCC6 CgCrCʴCC,PC\CCqCCCICxNCC`CC/4CinCikCj$CjCjCk;XCkhCkClWkCl]CmCmy CmCn=\CnfCo CohNCo)Cp2CpCpMCqfCqRCr6CrCs "Css0CsCtHCtCu CuCuCvhxCvְCwEcCwCx$2CxHCyCyuCy'CzXCz"C{=C{C|#C|C} C}C}C~i|C~޲CT*CCC[C:CчC CHcCCC8C6CrCCZC&4CbCCCCQ|CJCCC@tC|CCC.yCiCCCCUCCBCC@Cz1C0CC'Ca%CoCӇC lCEC}CCC%C]NCCCC9>CoCCۉCCFhC{oC/CCCLCZCCClCKC}CCRCCCpCtCRCJCC3LCbTC CqCCJCHCi:CiCiCjNCjCk Ckh+CkPCl'ClClCmJ@CmCnCnsCnFCo<CoCpCpn-CpjCq=@CqCrCrxDCrmCsM'CspCt$FCtCtCukCuCvGtCvoCw%CwCxJCxw.CxCyZNCy̆Cz?(Cz2C{%C{sC| C|.C|C}lJC}C~WC~CD3CCCTtC"CCCCCCCC4>CpCCC%vCaC.CڊCCS5CCCCD"CC)CZCC?CtCXCKC{*CCشCC4CbCitCib CirCjmCjyCjYCk6JCkCk!ClWClCmCm}Cm CnE&CnCo@Cou>CoCpCCpCqbCq|pCqCrPUCr(Cs&CsCsCtl*CtCuGCuCv%CvCwCwvCwCxYCxCy>hCyxCz$CzC{ ,C{C{C|ldC|0C}XSC}C~EC~C3CCCMCC3CC?C{C CC1~Cn@C CC$CaCnCJC"CTCC΂C 8CGCxCCqC9CvC:CFC*5CfCC9CCSCCCC?CyjCCC'DC`CC0C CDC}C(CC$C\CCCwC6ClClCC CACvOCCtCCEaCx`CCmC{CA6CrCC}CC5CdCTCxCJC CNC|ChrCi-Ci8CiCjECj`CkCkcCkĄCl%ClClCmMCmCnCn{CnCoH\CoCpdCpCpCqRCqCr'CrOCrfCslCsPCtG"CtCu$oCuCvCvtpCv|CwWCwCx;CxCy"CyCz XCz CzRC{iC{C|V@C|C}D C}oC~3&C~+C#zCC rCFCCfC@C:2Cw9CRC{C.CkCCCC#CaPCCChCVC CNCCKCCCC?C|\CCC1CnCCjCmC"HC]CCCCK CCpCC5CnCC2CvCT|CBCC C6 CmC?CoCXCICMCXCC!CVCCCNC(8C[CCCC'CYCC CCCNC~CC,C 3C:Ci@CGChCh4CiURCiCjCjpCjАCk1Ck>CkClVClCmCm.Cm\CnM3CnCoCoCoCpT"CpCq(,Cq CqCrjCrקCsECsCt!CtCuVCupCuZCvRCvĄCw6CwCxCxCyJCyzCyNCzdCzC{QC{xC|?C|hC}/jC}C~ pC~mCCDC C@C}CrC(CfC RC>Cq,CCԲCC6CgxCCǢC5C&rCUWCCCheiChCttCu(@CuCv CvCv CwiCwޫCxT>CxQCy@CyCz/cCzQC{C{tC|C|3C}$C}pC}C~u C~RCkCC1CpCeCC+HCiCC=C&CdCCC!C`CzClC[C\DC$CCCW|C$CԸC6CQCCC !CJCCzCC@HC}nCfC/C3Cp*CXCNC$ C_CCCCK4CzC}C:C2CkCCaCCMCkCCC*Ca'CKCCC7ClCCCuvjCu*Cv^zCvXCwHCwCx5&CxCy#CyCzCzC{C{C{C|tC|xC}jC}jC~bdC~޲C[LC.C*Ci^C0CC&#Ce@CqCC#CbiCCHC C`@CC>CC^,CCCKC[CCCCWCCUCCRZCCC CJCDCŻCC@C|CC C2>Cn6CCmC C[CTCC CDC~aCCC)^CaCCќC C@/CvCwCClCNCCCHC!bCU%CCCTC CRCVCCC%CG^CwCC[CsCvCC[CCuCC]bCC|CC_COCC!CbCCC#CcC6ClC$CdCtC;C#CcbCCC C_C~CC>CYOC(CC-COUC=CCJCAlC}GCC&C/(CiCFC`C+CQCCâC#C4PCl&CCCCHC~2CC]CiCSCnCdCC";CUCCCCCMC~CCCVC=CgK CgCh GChiChʄCi,DCiCiCjVCjCk JCkCkClUKClCm'CmCmCngCnACo@!CoCpCpCpCqkCq4CrMCreCs3|CsCCCCR5CCʋCGCAC|CC0C,bCfBCCCCJpCC}CC)$C_C`CsC*C7ClCCZC :C/CqCr"CrCs Cs~(Cs^Cti9Ct߹CuVCuΚCvFCvCw9sCwCx.:CxqCy%0CyrCz6CzwC{0C{^C|C|C}zC}PC~C~CC.C XCM3C|C2CJC7CtCCC+mCgCClCCUCyCCC>rCwCC:C!mCYCCCCC4CjCfC՗C eC>CrCCC C?Cq0CC2CC5CeCCfCfCgYFCgChCh ChCiHCiCj/Cj{4CjCkKCkCl2Cl)ClCmbpCmϼCn=CnCoBCoCoCpoCp/CqUCqɒCr>WCrCs*CsCtnCtCu CuCu>Cvx CvtCwowCwCxiiCCCRCGCvC*CCRCCؗCC^C}CvC'iCjVC9CC2CuC(CC=CiCCCECFCC @CKvC{CLC CNECjCRC CMbCCbC CHDCFCCaC>wC{;CCC/CkCCC7CU>CC5C#C9CqCCC"CNC CCgC%~CZ0C~CfCC)C[CCCC"CS]CCCf[CfCg Cg~CgChECh[CiuCit^CiCjBCjCkCk~ CkClTVClCm-CmCn |CnyCnFCo[UCo)Cp?CpCq'0CqCrCrCrCsvCsCth"CtCu\\CutCvS2CvϐCwLCw"CxHNCx CyFZCy2CzFCzrC{HC{ʪC|LC|϶C}RC}pC~ZbC~޲CcXCPC6CyCzCCBCC+C CPCC CC^4CCbC(ClCCrC6Cz%C_CCCCnC5C CNTCCCCVC%CلCC[CGCܸCC\CzCCCYC8CgCFCQC CC|CDCCC4C1ClhCtC ClCRVCCCC2CiCCC C@CuCC޲CuCECxCRCxC6C@Cq{CC$CfCf~CfCgBECg]Ch GChnChӔCi9Ci-Cj 6CjrCjCkF@CkClClClmCmfCm_CnFCnCo)HCoCp(CpACpCqmCqCr[CtCu4CuCv-CvCw)CwCx&CxCy&CyCz)CCz:C{-C{C|4C|C}CܺCCLCCC&C'7C\C CCeC/jCcC6CC\C-RC^CCC CeLCf@MCf$CgCghRCg̫Ch1ChChCifqCiCj8^CjCk CkyCkEClSCl6Cm1mCmvCnPCnCnrCoiCoCpRCpLCq>CqCr-CrCsCs)Ct CtCu CuCvCvCwCw|CxCxCyCyCz pCzC{C{.C|C|C}%BC}(C~1vC~%C?0CƓC'#Ck#CFCC7C|bCCCJMCCCC]CnCJC, CpCChC?CCC xCPCCCC`hCCEC*lCm_CCC4CvCCHC;C|C=CC=C}C C4C;CyCCzC2CpCCC% C`CC֭CCK$CCCC/ECgJCCC CC:Cy-CCCCLCCCCCKC}CCCZCeCf9CfcrCfƅCg*qCg8CgCh[VCh¬Ci*CiCiCjhCj6Ck@CkCl*Cl.Cl CmkCmBCnOCnCo6CoCp!CCpCqCqCqCryFCrCsnCstCtfCt:Cub.CuCv`"CvCw`CwCxcCx^CyipCyCzqDCzC{{9C|C|)C} C}C~nC~VC,CCC]>CCDC-Cs7CCCCHC}C͛CCWCHCC%bCiCCC5CyClCCBdCC^C vCKHCCCCOCCCCNCĈC CHC5C]C$CCe6CfxCfkCfѰCg8CgCh GChrCh݈CiICiiCj"CjCkCkpCkClRCluCm9 CmCn"Cn"Co>Co8Cp CpzCpBCqpCqCriCrCsf9CsCteCtCuhVCuCvmCvCwv#CwLCxCyCyCzICzC{'RC{C|:C|C}OC}C~fC~C5CCLCVC6C!7ChTCCC>Cu0CvF]CvDCwPCw(Cx^CxCymCyCzGC{ MC{C|C|C}7C}EC~QFC~޲ClCCDCCӓCDCcCCC;C5CfCC[C!C`C4C|CC CUCCC,mCsCgCCICC]CCd&C3CC5CzCCCIC#CClCWC^CCC`CCC#CcCzCC!C`ZCxC)ClCV>CCΓC CECCCC,CeCCպC CDCzCCC(COCCCCCOCCFCdUCdCeCeCeCfNCfCgwCg.CgCh_nChCi9tCiCj@CjCjCkkCk ClR/Cl-Cm=CmCn+CnZCoCofCpCpCq "CqCr CrCs /CsCt CtCueCuCv,Cv.Cw*CwXCx:wCxBCyLCyCzatCzC{xC|C|C}FC}(C~;C~DCYnCCXCeCf CftPCf݊CgGCgChCh ChCiiCiCjICjCk.CklCl*ClCmCm{CmCnmCnrCobCoCp\CpCqYCqCrYoCrCs]JCsxCtdyCtGCunCu>Cv|`Cw>CwCx%Cx#Cy*CyCzB CzΕC{[C{fC|wC}^C}C~%LC~oCECC4C|CCCX=CCC4C~"CCrC[%CCC8;CCuCC^kCCC:CCCC]CHCZC53C|C0C MCR%CCC$CjCCC9C}CCaCHC\CCCQ[CCHCCSCCCCNCGCxC2CBuC~@CCkC.ChCC C~CKxCCCC&C\#C;CCC-C`CCCCc8Cd/CdCdCe`CeFCf0CfCgQCgpCgݏChK&ChCi)GCiCj UCj}CjOCkeCk1ClQClCmALCmCn4Cn Co,.CoACp'BCp-Cq&CqCr([CrCs.7CsnCt7|Ct^CuDCuˎCvSCvCwfCw#Cx|YCy>CyCz"CzC{>JC{NC|\C|C}}C~C~0C2&CĂC+Cu)CCCRCCC1/C{CCSCZC:CC:C|CCCcCCWCOCA%CCaCCfCCCA7CCѐCYC`CCC5C{CCnCLCCC9C]CQCBC&ChCCC,ClCC_C+`CiCCC"C_ZCC4ChCMCXCCVC3Ck\C$CmC8CGC}XCCCCOCCCrCdCcCcCdN Cd:CedCeCeCfVCfCg. Cg*Ch GChxeChCiYCiCj>CjCk(!Ck?Cl\ClwCmCmCmCnwCnCorCoCpqXCpCqsCqfCryCrICsCt CtCuvCuCv*CvCw?CwlCxWCxCyrCz`CzC{ KC{C|AC|C}eC}C~CCC"Cm;CC@CLCCC-CxCC.CZdCCC<C(C?CDCh4C CCHUCC C'#Cq CC8CMxCwC5C'CoCCPCFC|CCJC`&CCC/uCsCC)C>:CC CCFCCTC>CFCC'C*C?C|CDCRC0CkCCCCS/CCC\C2kChC CԙC C>;CrNCCC C=Cc=CcCd%CdmCdBCe=CebCfCf}Cf%CgWCghCh6ChCitCi.CiCjsCjCk`PCk#ClPClCmECmCn>bCn8Co; CoCp;CpJCq?CqÊCrHCr{CsSCsCtcCt CuuCvkCvCwCwCx2Cx CyPDCyCzpC{C{pC|%C|C}LC}C~thC ECCCe$CUCCG'CCvC*ACvC CCZCCC=CCտC!Cm?CCSCOCCC0C{^CCCYCCC6HC&CǶCCWCpCC-CsCCCECCsC~CVCBCC;C`C[C6C"Cb|CCCC[#CCC*BCniCCZC8CzlC=CC>jC~CCCCvTCcCCCOvCtCCC _CSUCCbCcCcv[CcݥCdECdVCeCe4CeCf_ECfCg=CgQCh ChCiCi{CiCji)Cj]CkZCkClPVClCmJ@CmCnHVCnCoJCo)CpPCpjCq[CqCri&CrCs{CthCtCuCuCv7CvTCwUCwCxw.CyCyCz.Cz©C{W8C{gC|.C}C}jC~FC~޲CwCCTtC4CC;*CYCդC#CpCC CY2CCgCACCC*\CwCCC^CCCD}CCܘC(KCsCC CTdCCC2>C{CiC CUCC.C+CqCCLCBxC.CmC2CR}CKCכClCZCCCCZCCCCRCRClCCBC|CCC(Ca7CC^C%C=fCs!CUCC-CDCwCCb`BCbCc,mCcCcCdfCd]Ce=BCe8CfBCf`CfCghCg:ChNCh;Ci8CiCj'hCjOCkLCk_ClClCm CmnCn CnYCoCotCpCpCq%RCqCr5Cr+CsICs8CtaCtCu}6Cv PCvFCw-CwCxQCxFCyx2Cz Cz-C{80C{C|fC|C}^C~/MC~ȼCbCCKCfCC4CCCNCmCC [CXC8CCD CgCC.C}CCCfC'CCNCCZC4CCCCcCCCCCCtC CivCCCAeCC.CdC[$CjC6C)CmWCCxC5CwCCC9CyyCC=C5PCrCCLC(4CcCbCبCcCKC6CPCC*Ca_CQC̻CC5CiCCCbCbzCbsCcItCcCdCdCd=CeaCe*Cf?Cf}Cg"OCg=Ch GCh~nChCilCiCj^+CjCkTCkѢClOClCmOCmTCnRCn0CoZCoOCpfCpCqwPCrCrCsnCsCt1CtFCuOCu!CvqdCwCwxCx*>CxCyT%Cy9CzC{C{C|IpC|C}|C~LC~PCMCCCClCC.C}~CrCCjCC CX\CCCF*C^CC3CCWC CnCC CYCCZCACCHC'CsC~C CUCCC4C~?CNCCX CC$C-CtIC"C}CDXCĊCCRCC֤CCX~CC*C/CUCCC CICCC\C5bCnCCCCO,CC CC&C[FCGC¿CCaCb.#CbhCbCcg4CcѾCd=bCd"CeCeCeCfhLCfڧCgN$CgCh8ChiCi'qCiCjCj\CkCkCl{ClqCmCmCnCnnCoCoCp.+CpCq@CqzCrWRCr,CsrCtCtCu!eCuCvECvCwmnCxCxCy/ZCyCz_,Cz*C{C|,,C| C}bC}C~iC8C"C:CHCةC(4CwCDzCCgCCCWCC8CHTCeCdC8NCCC'WCvCCCcCLCCNCpCC7CCjCChSCCCIICsC.C&xCoNCCCFCCWCCC_CCC,Cp CCC6CwCHCBC7CvCCC/ClHCLCCCXCCCwCCfCfCgCg{CgwChhChCi[CiևCjRCjCkNCk+ClNClCmTCm:Cn]Cn CokCoTCp~CqCqCr!CrCs>CsCt`CtCuCvCvCwCCw"CxqCy CyCzC*C˂CDCBrC} CCC)aCaCeCЌC!C='CrCCCCBCa+[Ca&CaCbcCb:C@CC3C C+C'CwCCCgNCC]CSCC|CcCCC4bCCC'CxC CCgCCBCR5CCC9>CECCCfBC/CCBbCCRClC_CC0C/CtCCrCCCC_EC CdC8C"CŘC qCPCHCDCC_XCpCC#CcCvC`C C^KCNC׮ClCNCCC"C4ClC*CC%CFC{C CC_C`LC`Ca CaCa8Cbf+CbZCcECcxCd*kCdCeCeCfCf|HCfCgrCgChnChqCioCiCjuCjCk%ClClCmCmaCn4 Cn!CoQbCoCpsCqCqCr/CrpCs^CsCtCu+CuǕCvdCwCwCxACxCyVCz&CzwC{nC|C|C}_C~C~CVCCTtCJCRCSCC]CSCCYCUCCCVaC CCWCzCCVCC*CTCCCPC?CCHCCC=CC-C/*C~CͲC6Cj5CCCPCCC2C|C4CCWOCCC,PCr C'CC?nCCCCH6CCȲCCFCCCC:CuCCC$DC]CSCCC:@CpC$CٯC C_.C_SC`aC`BCa8Ca CbnCbCbCceCcYCdN CdCe;UCeCf-CfCg%CgCh"ChfCi%MCiCj-CjCk:CuCvuCwCwCxdCy CyCz\fC{C{C|\C}C}C~bdCC.C73C CC?_CC^CICCCSCsCTC^,CCCh4CCCpCC iCwCC%C{CC'C|CC&8Cz.CͪC Cs$CCCgaCCcCVCCC@/CCC$$CnCC*CJCCC CfCCOC4CwSChCiKCi~Cj]kCjCkuClClcCm$lCmCnJCnCovCprCpCqB\CqJCr{CsCsCtZCtCu?CvDCvYCw Cx8CxCyNCz6CzC{C|;ZC|nC}=C~GC~CC,CCC8TCCyCE>CC CSCCC`CCCn-CǬC!Cz CC+CC!C3CICSC8C4CC:YC9CC7zCCݢC/CCңC#CrC>CC^C"CCDC CڨC$CmCNCCE9CCJCACZCCC"CdPCCC$+CbCCݨCCUCC8CC=Cv9CCCCtCCCC]zC]EC^OC^C_(C_pC`C`yUC`gCa`CaCbN@CbCcAwCcLCd:CduCe9CeCf?CfCgJrCgrCh[ChCisCjCjCk"CkClJClCmwCCn%CnCoFdCoCpCq"CqaCrgjCs CsCtXCu CuCvUCwCwCx]@Cy Cy8CznC{!6C{ԜC|C}=C}C~gCaC ChCoC"CC C9:CCCQJCC Ci|CC#CCC:CC>CO-CCCaCCCoeCȢC!dCyC`C(C.C8C*CzCӪC'5CzCKCCnCC#C\CCCD^CCC%(CnC1CCF$CvCCCZCCxC"*CcCECC!ZC_DCpCCCOCCUC)C4HCkCqC~C CBC]tC]C]C^^GC^C_;C_C`C`CaCa|+CaCbmNCb CcdxCcVCdaCdCee4CeECfnCfCg~Ch GChCl@Cm2Cm0CnqCoCoCpZkCqCqrCrQCrCsCtVrCuCuCvgCwCw"CxCy;^Cy1CzC{fC| C|ܹC}fC~VCC CICC )CjCfC,CC?CPCOnCCCrCӽC4CPCCV&C4CCuqCԏC3MCCCLCChCbQCCoCrC!C%C}=CC+CC!C+CCC%#CvCsChCfCCaCOCCC0CyrCC CPxCzCۨC CcC:CC)/CirCCC%qCbCC`C&CO*CmCCC/Cf$CCдC[C\gC\yC]?RC]C^jC^C_~C_uC_C`cC`CaVCaCbPCbCcQ,CcCdXHCdXCefCeCfzCgyCgCh&DCh;CiKCiQCjxnCkACkClHClCmCn&CnCon`CpCpjCqeCrCrPCskVCtCtCu~*Cv1CvCwdCxU Cy CyCz C{?@C{uC|C}yC~9C~DCC>C,CCcCōC'CC\CNC8CCvCJC:sCrC@C_C&C",CC5CC(CCC``CzC CyC{C1NCC C@CCCJUCXCCMCCCHCCC=8CCC*Cw`CCXCZ CCC4C|DC®C>CLCCC CWjCCתCCTCCsC )CECACCKC)0C`WCCwCtC[.C\AC\oC\C]KAC]C`CCJCCC]CCCiCCCo.CĶClCmMCWCCcCXCCRCCC9CC.CCa7CCC5CzCCTCDCxCFCC^C["C\C\xC\C]q5C]C^]C^*C_PC_̙C`JiC`CaKPCapCbS^CbCcbCcCdygCeCeCf)CfYCgSCgChFCiCi"Cj\pCjCkClEClCmCn@*CnCoCpK,CpCqCrfACsfCs5CtCuLCv GCv`CwCxKCy5CyCzC{`C|(C|C}HC~bCSUCCvCݼCECC5C| CCKCCCCCS|CC"DCFCCVVCOC!CCCOC(CCxfCC; CPCCYCCCqMCC'CrCjC2~CCC5@CCC/C-CC!oCp CC CVvCTC=C44C|8CLC qCNCCQCCZXCCCCWCC?C CGfCCytCz?C{ RC{C|C}xJC~ICC,C`5C*C4iCC CtvCnCJxCC CCfCaC˗C5CC jCrC|CCCCCyCCECaCCqCԘC6uCCCWCC$CoCˋC&UC*CC0CCݶC2CCbC+@C|CCChCbC,CKCCދC&ZCm-CCC;C~CCCBC]CC0C9Cu{CUCVC#C[C\CCC5%CY)CY&CZCZmuCZ܍C[MMC[C\3C\C]!XC]C^C^C_C_{C`C`Ca Ca`Cb2CbCcMSCcݥCdoCeaCeCf3RCfCgjCh GChCiMCiCjCkBKCkClCmJ@CmCn CodCpCpjCqCrMCs CsCtCuUCv4CvCwOCxw.CyCCz@CzRC{C|.C}TC~(~C~ CҠCTtCC+CCCpC CICSC"CCCh4CBC@CCCpCCUCC'CC`C^>CiC)CCfCUvCCCyzCC7CKCCMCpC*CZCC :C^CrCCY~CC\CJCCWC2C}CC-CYVC~CC+CpC6CvC6CwCC C2CoTC#CC #CYZCCECC5CkCXCY&CYCZCZoCZC[RmC[ƫC\CazCbVcCbWCcv[Cd rCdCe5CeTCfjCgCg[ChJRChqCiCj=$CjCkqClCMClHCmaCn\CoCo)CpCqECr/CrpCsCtNCucCuCv8Cwt$CxACyCy-CzC{DC|ZC}0QC~C~޲CJCHZCmC"CzC]CllCښCHC$C%fCCCoC/CJCC$[CCCgCҥC CfCg>Ch*ChӔCi~Cj,CjCkClAClmCm(CnlCo)HCoCp CqmCr3rCr2CsCtCu^CCv-CvCwCxCy|CzTC{-C|9C|C}C~C~C/ CjC$C*CnCcCzCG&CC*CC C~CC`CC@CxCCCCi'CռCACCCC$CPCCCgCGCI!CC Ck\CC'lCCC9&C CC@C6CC=CCC0CC$CCdCBCoC@CC̈́CnCVNC(CCC[CCqCfCQkCCƵCC8jCoCC܀CCWjCWԬCX@ECXCYCYiCZCZthCZC[bC[C\XC\ֻC]VC]ؕC^\C^C_jC_C`pCaCaCb3Cb Cc`CcKCdZCe4CejCfxpCgCgŇChoCi CiCj|Ck/CkiClCmX&CnCnCoCpYCqCqCr Cs}Cz϶C{C|C}vC~[qCAZC CCGCpCCZCCETCC/C3CDC!CCwCC_SCHCDCC'C%CCvCCR5CC)CjCCfBC͚C3CC C_CC"8CCCCC"C RCMsCCΚC CKCCCC:4Cs|CCVCCOCCV_CVCWVFCWUCX2-CXCYVCYCZCZx:CZkC[nC[C\m$C\C]t C]C^C_C_C`+C`tCaQCaCCX*C˸C>CC"CCZCq"CCKCC"xC1CC\LC¢C'CCCPCpCCm_CC%LC_C0C/C CC.CtCC"CqCjC CW*CFC8C2CxC6CCECCmCmƭCnYCoXCp%*Cp>CqŸCrCsoCtH Cu"CuECvCwCxHCyCzkC{SC|>CCC^CECCCC<Cw=CfCC"CZ:CC;CCUCtڻCuoCvFCw0CxfCyMCz7oC{"C|C|C}C~޲CCaCCVdCCL C'CB_CC8CC.CC$CCCC 'CC4CnCHCYCC?CC"CCaCnCjCFCClCC CL CCCrCuC0CC6CCpCRCCJCCCDCCzC3C CCCa CJCYC6;CzCCCB`CCCC=Cy6CNCjC'C_CC^CC7bCUCUpCUCVVCVCW5CW3CXKCXbCY CYCZCZ~qCZC[C\C\`C]C]$C^2C^~C_VC_C`Ca CaCb]CcsCcCdN CdCezCfVCg CgChxeCi3CiCjCkvCl=ICmCmҌCn@CorCpFCq&C{?COCZC,fCewCCԺC C@HCtCT-CUCUmCUECVGXCVUCW)ECW2CX'CX,CYKCYCZCZC[C[C\VC\BC]&C]\C^FC^dC_pC` C`1CaCdCaFCbCc.8CcTCdC]CzC>CHCC]C^pC_ C_C`FC`FCalCb6yCbsCcbCd@NCd=Ce5Cfe9Cg"OCgyChCilCj5Ck CkѢClLCmzCnRCo.lCp CpCqCr2CsCtCuCvqdCwedCx[CyT%CzNC{K&C|IpC}IhC~JCMC(CC.CC5CC=CCF*C"CMCWCTjCCYCڋC[LCHCZmCتCUC*CMNCNC@CC-CCCCwChC֤CCCC/C~C?CIC#CCnCdC*fCCC8OCGCC8C]C܂C,CC1CSBCSCSCTVCT4CU2NCUpCVCVCWlCW}CWCXw5CXCYzCZCZC["C[C\.C\C]UwC]C^aC_$C_ĔC`gCa dCa>CbbCcCcCdxCe0UCeCfACgkCh0ChCifCjCkdCl9CmCmCnJCoCp(CqxCrbCsPCt@Cu2Cv'CwCxCyfCz C{C|PC}C~"C*CnCbC#CC/C4CCCmCPC |CUDCCC0~CvCCCBC!CeCCAtC~JCCC.HCfCfCC C?,CrCRCRCSflCS+CT=CTCUcCUCCVGCV|{CVCWqCWCXpCXCYx1CZCZ_C[ZC[C\9UC\nC]fTC^C^C_?DC_C``Ca3CaߺCbCcBCcCdNCeoCf/CfNCgChCiPCj CjCkClHCmCneCoIRCp0Cq8CrCrRCsCtCuCv׸CwCx|Cy\CzbC{jC|RC}CC QCCCC)CnC;vCĊCMCtC_CkCoOCC}tCCC KCCRCC C$CCyC CWCCrdCC[WCuC=CCCCCWCC#CC~CH}CCC^C5C#CfCPCC`^CCwCLCCUC,CtSCCCCCCC+CG0C CC\C7CqNCCCjCLC4CCR7CRwCRCSJHCSCT$CT>CUCU|kCUNCVluCVCWeCWCXhCXCYuCZCZC[C[GC\DC\C]wC^C^C_[C`NC`CaZ5Cb CbCcv[Cd1CdCezCfuPCg=Ch GChpCi CjCkZCl7CmCmCnCo)CpCqCrCsCtCuCv(CwsCxHCyCzC{C|AC}ͨC~޲C1C|C CC#CC:(CCQ|CCh4CC}ChCC,CC'C|C2>CC8FClC9>CC4C/C*,CClCC*CtC6CRCqC*zCC\Ca7CXC'CyC}CDC~CCRCCCRtCC CDCCݴC(\CqC|CCE0CC˫C CM!C CCYCAC| CaCC$CZCC,CeCQCQCRWCRhCS-1CSCT CT}CTXCUgCUCV[CVjCWYlCWCX`CXCYrCZCZC["jC[C\PPC\C] C^+C^EC_xC`##C`vCaCb8CbCcaCdkCe.CeCfCgFCh]UCi1Cj :CjCkuClkCmCnxCofZCpW4CqKhCrBCs=Ct;`Cu<2Cv?CwFwCxOCy[jCziC{yC|bC}C~CxCsCCYCDCtC8C4CUCCqC3CECCC/CCC C:CRKC*C\C CaCPCa6CގCZLCfCLCÌC8CCFCCCgCVC9CCChC&C)CCC>rCECnCCCC/C:C&CC$ CnCCCFCCςC CSJCKCCCLCTCxCC2|CigCLC0CC; CQCQf CQKCR6CRCSCS~CS.CTdCT$CURCUfCVJCV_CWLCWрCXYCX:CYp4CZCZC[(GC[C\\C\AC]'C^BDC^C_UC`EeC`CaCbgCCc$BCcCd CepCfClCbCcv[CdN Ce*6Cf Cf$CgCh`CidCjCk4ClCm>CnCo)CpߨCqfCsECt0(CuRCvyeCwlCxCz`C{4C|kC}C~޲C CCLCrCPC/iCЗCqCC CRC;CC.CsCeCPCC.JCNCVCCw^CC,ClCC%aCC(fCC"NCCCCCjCCDCrCC{%CFC?MCAC,CVC CC[9CCCOCCC4C}CC COZCFCCCRCCCC@CyCDCbCdCOQC1C CCMCNXCNe.CNCO1COHCPCPslCP~CQUCQCRByCRCS9nCSCT;lCTCUICU^CVbCVCWCX!CXCY]CZCZC[Q!C[uC\C]h C^"zC^C_C`k5Ca6CbCbۣCcCdCeuqCf\CgHCh9Ci/Cj*Ck)tCl-Cm6rCnDCoVCzC|/C}nC~CHCC@]CkCC-CfCwCCCcCCCHC-CC#aCCXRC*CCC C;C}CTCCdC7CkFCCh6CC[CњCEHCC%C.CCdCeC.CtCCKC"CFCWpCCCQ|C(CC;>CCΔCC[}CCJC#CcICCCCUCACJC&C2CgtCCiCC/>CM CMjCM̮CN0CNCNCOiCOւCPECPiCQ+CQUCRCRCSCS|CT0CTCU/CUCVOCVCW{CXBCXrCYYTCZCZC[YC\ C\UC]}DC^CeĮCfCgChCijCjCknClCmeCnھCoCqCr:MCscNCtCu0CvCx1CymCz8C{C}7C~^C@CC30CC5C+CKC|C%CCsC`CCd&C9CCICyC$CCCNYCCuC CCCC,CC1CC,CtCCaCCtrCCLCCCCCA^CC0CSxCCCSVCC_CB)C0CC!"Ch"CChC3CtCC#C.Cj5CLC!CCK-CtCCCCJCzCLrCICfCjC>CCC!1C|CWVCCeC}CC1CCBC*CHCǼCCCWC4C&CCgCC^jCůC*CCCJCCCWNCCCPC@CC9DCC+CCVUCCCCPpCPCQpjCQCR|CS CSCT)CTCUXCUXCVCW=CWCXCYHCZCZ C[|C\BC] C]ݏC^C_C`mCaSCb?Cc0WCd'~Ce$Cf'Cg0Ch@CiURCjpCk>ClCm\CoCpT"Cq CrקCt!CupCvĄCxCyzCzC|?C}CC@CCsCiC#,CC^COC%CCvC,C CxCBCqCCGCCv^zCwCy#CzC{C}jC~޲C*CCqCbiC C>CC[CCUCCJCCCn6C CC~aC)^CќCvClCCU%CTCVC%CC3"CPCBNC"CDCjC:CzC% CCCnCCwCCCU>C#CCNCgC~C)CCS]C/CowCCLCM$TCMCNJCNCOCOLCP(CPCQ3CQCR\CRICSCT7CT/CU]CVtfO*  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.0.4/gdrivers/data/LanduseSmall.rp#0000644003401500001440000000034013614004466021361 0ustar rouaultusersILWIS 2.00 Table 08txbbbh|j~S(gdalautotest-3.0.4/gdrivers/data/PDS_WITH_ZIP_IMG.LBL0000644003401500001440000000555113614004466021432 0ustar rouaultusersPDS_VERSION_ID = PDS3 OBJECT = COMPRESSED_FILE FILE_NAME = "PDS_WITH_ZIP_IMG.ZIP" RECORD_TYPE = UNDEFINED ENCODING_TYPE = ZIP INTERCHANGE_FORMAT = BINARY UNCOMPRESSED_FILE_NAME = "PDS_WITH_ZIP_IMG.IMG" REQUIRED_STORAGE_BYTES = 4 END_OBJECT = COMPRESSED_FILE OBJECT = UNCOMPRESSED_FILE FILE_NAME = "PDS_WITH_ZIP_IMG.IMG" RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 4 ^IMAGE = ("PDS_WITH_ZIP_IMG.IMG", 1) OBJECT = IMAGE LINES = 1 LINE_SAMPLES = 1 SAMPLE_TYPE = "PC_REAL" SAMPLE_BITS = 32 MISSING_CONSTANT = "16#FF7FFFFB#" END_OBJECT = IMAGE OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" MAP_PROJECTION_TYPE = "OBLIQUE CYLINDRICAL" A_AXIS_RADIUS = 2575.000000 B_AXIS_RADIUS = 2575.000000 C_AXIS_RADIUS = 2575.000000 FIRST_STANDARD_PARALLEL = "N/A" SECOND_STANDARD_PARALLEL = "N/A" POSITIVE_LONGITUDE_DIRECTION = WEST CENTER_LATITUDE = 0.000000 CENTER_LONGITUDE = 0.000000 REFERENCE_LATITUDE = 38.827024 REFERENCE_LONGITUDE = 88.872240 LINE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 26368 SAMPLE_FIRST_PIXEL = 1 SAMPLE_LAST_PIXEL = 4096 MAP_PROJECTION_ROTATION = 90.0 MAP_RESOLUTION = 256.0 MAP_SCALE = 0.17555558 MAXIMUM_LATITUDE = 56.86050186 MINIMUM_LATITUDE = 20.49594608 EASTERNMOST_LONGITUDE = 358.02478394 WESTERNMOST_LONGITUDE = 137.67897415 LINE_PROJECTION_OFFSET = 9471.500 SAMPLE_PROJECTION_OFFSET = 255.500 OBLIQUE_PROJ_POLE_LATITUDE = 48.137545 OBLIQUE_PROJ_POLE_LONGITUDE = 242.787509 OBLIQUE_PROJ_POLE_ROTATION = 159.968008 OBLIQUE_PROJ_X_AXIS_VECTOR = ( 0.01533300, -0.77889143, 0.62697132 ) OBLIQUE_PROJ_Y_AXIS_VECTOR = ( 0.95217404, 0.20275286, 0.22859544 ) OBLIQUE_PROJ_Z_AXIS_VECTOR = ( -0.30517126, 0.59348076, 0.74474901 ) LOOK_DIRECTION = LEFT COORDINATE_SYSTEM_TYPE = "BODY-FIXED ROTATING" COORDINATE_SYSTEM_NAME = "PLANETOGRAPHIC" END_OBJECT = IMAGE_MAP_PROJECTION END_OBJECT = UNCOMPRESSED_FILE END gdalautotest-3.0.4/gdrivers/data/test_pdf_composition_raster_georeferenced.pdf0000644003401500001440000000377113614004466027565 0ustar rouaultusers%PDF-1.6 % 3 0 obj << /BBox [ 10 5 105 100 ] /Measure 4 0 R /Name (Layer) /Type /Viewport >> endobj 4 0 obj << /GCS 5 0 R /GPTS [ 33.891530168591 -117.641087629972 33.902352690427 -117.641168620797 33.891597012962 -117.628110837847 33.902419561921 -117.628190189534 ] /LPTS [ -0.052631578947 0 -0.052631578947 1.052631578947 1 0 1 1.052631578947 ] /Subtype /GEO /Type /Measure >> endobj 5 0 obj << /EPSG 26711 /Type /PROJCS /WKT (PROJCS["NAD_1927_UTM_Zone_11N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_1927",SPHEROID["Clarke_1866",6378206.4,294.978698213898]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-117.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]) >> endobj 7 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 19 /Length 8 0 R /Subtype /Image /Type /XObject /Width 19 >> stream x!0 CG5444 ,+:N;-=G`*B) )>F6m.&yow\xqJ1~#;& KYQ095b4hup^ruM-XQvS{eeJo0D޴E:6VԊ\> /MediaBox [ 0 0 110 110 ] /Parent 1 0 R /Resources 10 0 R /Type /Page /UserUnit 1 /VP [ 3 0 R ] >> endobj 9 0 obj << /Length 11 0 R >> stream q 95 0 0 95 10 5 cm /Image7 Do Q endstream endobj 11 0 obj 33 endobj 10 0 obj << /XObject << /Image7 7 0 R >> >> endobj 1 0 obj << /Count 1 /Kids [ 6 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 12 0000000000 65535 f 0000001627 00000 n 0000001686 00000 n 0000000015 00000 n 0000000104 00000 n 0000000391 00000 n 0000001277 00000 n 0000000877 00000 n 0000001255 00000 n 0000001468 00000 n 0000001576 00000 n 0000001554 00000 n trailer << /Root 2 0 R /Size 12 >> startxref 1735 %%EOF gdalautotest-3.0.4/gdrivers/data/southern_hemi_false_northing.bag0000644003401500001440000006422113614004466025005 0ustar rouaultusersHDF  h`TREEHEAPXBAG_root@(hTREE8HEAPXHmetadatatracking_listelevationuncertaintySNOD Hh H Bag Version 1.4.0Bag Versionrow/BAGUfOSNOD(  8X hrow col depth  uncertainty   track_codelist_series fO @ Tracking List Length 8G4  $tI$tI9fO HMinimum Elevation Value   HMaximum Elevation Value  IHG4  $tI$tI9fO PMinimum Uncertainty Value   PMaximum Uncertainty Value  TREEPTX \`dN?NMŸDNšNMMbM MŒqMMśMlN`NŏN+_OŞ=OpwOŇbNtNŜO &O2nOOŢyO]OZOOżONPMŤQM/LţLIL5MfLńLOSNNNŚN>XNŌNzOs4P(Pp>PdPn[O nNŪM0`LŠgLžLM3MIzMũ!M$LŒLL`rMMŝNŎNň!NuoMkGMqM uMOuQ,RuSM N{MŐLūtLזLŽjL&}LdMMMōMŃ#NŪtNʼnNNNŕiNţM MŹMXM',M5MbMŜMŵ-Mx/M@M1MũNq(P~^P,UP6OXMMŞL|LŠ]LŧLſMEMŦL4LnLNLXL=L3sLLr2MhgMŷNNgNNNŨON?OŐPŵMMIhMKmMDM4MMKM-M@!MhL^MťLCNMMh>M-L<#LGiL]M~GNʼn5Pv0PwOş*OfN=MLL{L LŕM/MŜLיKŝK2KKf>LdL/LŒrMŊsN=N;N4N0pNNŎNl\OwPv{QMM@M߾MšM˦MŨMŜLLLHGM1MLrMMLkL{RL LŅFLCMŞMOŧO?O-PQwMœ)MzLgeLLkMŇMiLšL`5KqJņJřJ~KŞLLN[ObOx5O>0OH'N{7MLLLbLC[KqJeiJL*K=K4LNŰ;NzNōUNFNŒMMGMWNŶN]PJPQPQQS/%KI*LRLE_L\LőL6LźiLLŦKs5MKŤK%KmLMżtLŃjLMūMmCNſNީOÅOWhOxNM%}MܻLAPL DL+KS^JūIś)J;KŇMMž NoENdONNŴMŘMpNdMBN}OrRʼnQŗ{RmSVT KşKKWKYhLWLũLLşgN MłwMŎMw%NߓLŻIL sL}tLŤMŝ4NNaOO?MP ONN,M3LKK2IQJLgKMK0LũMŅMN?NNzMLOőOŷ]RqoOPREQ8Qũ#RLTӁT4xTIWU]V@IVŧJŶJJTTL KٶKeL "MsOTOŝ%PILPuOŀGQr7QPO/PƒQLPJ9Q PPOOޒNaNNł#MQM"LEOEOc+PcOŖPdINmO-NP'Nŧ,NũNNMVP[Rg Tť8U/V{VWŇXrZJŴIŲ&JJgkKpKŋLflNϯQ)PAzQxQrS)RųRcQl#RţR;TżTRUů[USqRŶRŭO/O PPOOŸbPŭeQOpRu(RŕbTS\SS8QO[sPŗmPRSřOU#VHWōhWʼnXžzY*^Z_J9!JqJj LYLLNBnQŁ+P26QQ#bR5SŁER(3Sa)aňraaaaxNCO+PPMQų9R \RwRŌVSSVT"TUMXIWũ|W~XyYbžb}+b9Pc QE:R#@S)PRk}R;SvSS SŋTUşU/dV xW]Y'Y YŪZŸB[>\h)hhŽfşLWV+VŊVŷ$WW+zXSXuZř'[@i^3\\Ŕ]a]^ņ:_Ŵa%`aWc2dd3fԻf,IgpgŻh h8f4hkh{Rg2gņ$gLRgfŮghchž\hŮ2iV|i@,hŲ h+`g&hŅEimiO7k%oji=XŸ*XMXBX+XTHZ$ZD[O]U^řz_Ŝ7`Ś`aE``Ŵ`bc9dŗ[e{fvgH2h i2$izhdijPj*j, jhg1h|ghśhŎi`iŐiųjjŲjšjCjjŊk{jlŔlŷplXkXWYYŊY72Z3\]:^9^==e[eś"c%cIc:dNc;ezdegOhťhUiši*VsgrtWtsEa} de%e!LffřgSijūk]JmjnŎsnnmwmTpnGnŬn^nYooGoOoo>p]oźoTpŨ_pźp1Uq1qZqHrkqӌqqcrqŝr:r sttłts#tŘtQ*uQuřttef<gg6hckjjŢm{nţ:odMofpšpň$qŷpŹpŕo)\pŎjqŅquir}rzrŇ*s[1srŭr6tirs[tKtFt>htLotsst5tsshvuśihh`jjmkkal4nMopz9qqrcqůrťv#tHt¦tō2utuŜ#t/uuxrd&u90uōtEu@uŅvspvvJyœ%uvŰvţuƴuuvvQvw vxvńxv6vŨu-\u}unuťiŮkRklnMnp:BqŃqErprů1sNs JttŰ3uv?>v,uņwv5^x8xwDwŲ@wŔ,wxvŴvTx ylKy&yAzů/z5zņ%yśv %wov]ixqKy_z wŠxgwv):u]RtūtŇvOlnņn=o~q| qsŖVsvsŜsPtlctŝuwyyŒyQ'zrzŦzKyjz,zgzř%|yyŻzŕWy~Vx|yZ{>|A+} s|,{{ zxšxŧ?xnyŝ`{ن|{yzŒx'wŷu)8u xuD$ǁŖmDŢŔ~l}Ђ|qEyŔxqwKvv Pvūv%Qwyۖxŭdu<spŶDzb{d{1{|zZz~z>8ztzz@{_}š~V:Hu !y[~Ɂ}{Rqzj}w Œ[PaɅ?ňȁ0ҹ~ }b|AJzŽy7%x,uJtŊs!tW7v2ywʼntut^pŴ{8| !|@W|{Ź[{a{ŃzV{|p|ť~L ŗ`Ŷ4ŧޘž-|@l:@}_ v*栁ŬD6V~ŎŃmG-}š|{ŮxxNvtŹ/rysʼntv;svG/vť užqs}t.}ś|ѕ|ň|ň|6|v| ,~~ (~Ŏ]̍_Áŕv]0p&&A5~,&ŧŃHŷi)`C~ ||do{ߵ{ŀwQ$x&r?Is^uzvTPu71uBtŮ>q@}ŋS}ʈ}U||Ž|}~$\Ŷ(؏ŮǀŇʀůů:ŽрŠ?Ł Lvf1o)4BKzŲn~~v{%{{Bzywt(tt)rptMt/QutFrOyŨzO8|M}X,~A~s%\׀[=fP##}ŧYPH>KyŰ؀MRųWjBŵ?akpŪ<} >}{{=E{y)xv@v!%vŴtŲtIDvńwuv zs}xcvyŚnz#{}}Ń~@~P5=Ŕ$z$nF~nNz~~41~ſm})}#/}pG~}F~ţGŠ8,@*̀ŎŨ.ŌP}h}$||ُzzx$w5WwvpuȂuiw wʼnvŰ2vcwQyxyŻz{U|k|Ň|Ţ%}%8}ŏ}<}P}N}X ~ }u#~q|ʼn6|şz^{K{śzNL{z>z5z7 {|)}i~~[}Ŭ~S~b|~Yv~~9}L|ݞz^Gy]gx[w vNuŮu=lw;vzxlxŬv/v{w5/xŜxlryzlzʼnzz"y2{ʼnzSze{zŜ^z$yyŁDzxłyxŰxxwMwŢxŰxŢy\SzjK{{b|H{Œ{ō!|W}eq}|RX|{řsz+cxŗ5y uft0ukxŨwʼnzzktv7uvũqvńvמw #x]!xŐ]xAxrqősůuIuśwBnŋIpŠ^oVQo~ngo!oPnņnsnş1nŒ oknŴnmm nŧ~lŧ*mżvpvEk`|jkiŎ j>Vk}lŚrlkmOm[n/@pedqfq),r4sFt9tŨtdtstuŴCvxŨu>t$rqSqr|s6 uqEllœm%mŻn?nŏtmbmŪklj(-k|j8j`iŤVjBrkI{hŵhŀegfż]efŢfShŕjJiejKk-mPmfnQoŗoťp*?sG"rŒimkTjje4k0jŽ kokŵ^jŔkũWmړ^ _-_Ż$`_P_t^ `Ѐ_:oaZ-aDa%`O`= `__ __Ŷ^\y\Ŭ[֥[X)[ZůZaZZ/[ř[D`ŏ\!^_řFe˃b%cŇceŋh3RigQ}hŦhũhŸgʼngXgvguhj[ů[+[f'\5|\o\;[ŷ]5]e_Ŭ`_4`y_Ť_%_Ū^Ť4^Z]S^5^8[ɋ[aCZpXų_YmX2UWMYŗV#YŊmZFXŦ\] r`xaŲVajab!c=b0ddfu&hŊf7fafxemeнePYZYKNY#Z\Ż[H]zC]œ^ů^p]֞]r8]\Ŏ\=2[l=\\[d4[ZŻXY׿VŦUU^VG,W}YŝkWœZlt\Z^S\=]{`XRbVJbş}bźbbd(ezd6dŽd'ddţVŕWŧWWVWŊWWŞYiXg\\v7[_\]Ŧ\:[[@[ż[j[œZgZ )Z1ZťVa WŬVU2UT"TT,pTmWpV%WšX XŠS\\ޤ^ű_iaŘ?`ŏcPcŦtcŞcřbc~bů%aVpVţUW&UtTTQVTKU)DZ9Yo[v\,\,ZŐZZ!YŎ9YW&Y'Yŕ7YqXQ;XjkW9VőS TŃSRR0qTS@TOT2qV)WWŧ ZZ@D]Œ\^.a";b`Ԗcalba@`϶U?bUUPTpTDU-TňV|SITVfV9Xt[[zZ6ZeZ:ZűX)IWчWWVŅW4V]fVŽUpTlSSŇR6S@uQōR Sm#SņRoRR0Sť-UPZŦ~]ZőF` ^Ň^w`:bAaňaa `sUUT#U9TŞ;T@mSRŭSŅRfSEIUpWݳT[Ŭu[|%[-ZQTETՕRcQ(QI~PŷO OňO3FOjOrOůOqOŸNxNłwMLł(NIL.8O Surface created from: C:\CARIS\HIPS(x64)\71\Fieldsheets\QDG\Kurt\kurt_75m.csar2007-12-30creationmonica wolfsonUNHgraduate studentauthora small subset of the eastern segment of the Discovery Transform FaultonGoinggridenelevation-103.96-103.93-4.03-3.99Unknowncopyrightunclassifiedfree to usedatasetSurveyLine = C:\CARIS\HIPS(x64)\71\HDCS_Data\QDG\Knorr\2006-096\2l13.s.rawSurveyLine = C:\CARIS\HIPS(x64)\71\HDCS_Data\QDG\Knorr\2006-097\2l13.s.rawSurveyLine = C:\CARIS\HIPS(x64)\71\HDCS_Data\QDG\Knorr\2006-099\2l13.s.rawSurveyLine = C:\CARIS\HIPS(x64)\71\HDCS_Data\QDG\Thompson\2007-364\0032_20071230_104320_rawSurveyLine = C:\CARIS\HIPS(x64)\71\HDCS_Data\QDG\Thompson\2007-364\0033_20071230_114320_rawSoftware: CARIS HIPS and SIPS; Version: 7.1.1; Method: Gridding; Parameters: Track_Source_Data = 12012-06-11T21:40:05Zmwolfsonprocessor-12row7175column5275pointfalse0615075,9554100 618900,9559350UTMWGS84WGS841310000000mslenmonica wolfsonUNHgraduate studentauthor2012-06-11ISO 191152003 gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/0000755003401500001440000000000013614004466022021 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/0000755003401500001440000000000013614005400025452 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/S2B_OPER_MTD_SAFL1B.xml0000644003401500001440000002374113614005400031112 0ustar rouaultusers 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.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/0000755003401500001440000000000013614004466026562 5ustar rouaultusers././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000755003401500001440000000000013614005400030747 5ustar rouaultusers././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000755003401500001440000000000013614004466030762 5ustar rouaultusers././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B08.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B06.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B01.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B10.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B8A.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B07.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B09.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B11.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B12.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B04.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B03.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B02.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000021700000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/IMG_DATA/S2B_OPER_MSI_L1B_B05.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000067613614004466030775 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000020200000000000011575 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L1B_N01.03/S2B_OPER_MTD_L1B.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1b/S2B_OPER_PRD_MSIL1B.SAFE/GRANULE/S2B_OPER_MSI_L10000644003401500001440000000516213614005400030755 0ustar rouaultusers 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 gdalautotest-3.0.4/gdrivers/data/rset.ntf.r20000644003401500001440000000252113614004466020402 0ustar rouaultusersNITF02.1003BF01GDAL 20021216151629 U 00000000000 00000000136100040400100052500000004320000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000001200000012INTRGB VIS 08RG225617S0445005W225617S0444027W230555S0444027W230555S0445005W0NC3R N 0G N 0B N 00B00010001001200120800100000000000001.0 0000000000^YTS_g^uTMMXTfMb[NXYRZdNV_FTJ~dVG_`X~[IX]ScSbX?.dV rk[u__i?dcN.=OPNocSfH_ok]#2L>;VOPWw(Txrmfswxt{|tt{}n^twtxpz!cmkz}nvup|u}fhTy `lRco|wq|IDv`W}rX,6.-*$9)*%-'-* $G1 -(7,%'!F&* ()117'8"&<"$$# <7" 5#-*$ $&2/LL:,+?'/2gdalautotest-3.0.4/gdrivers/data/utm.tif0000644003401500001440000100150013614004466017700 0ustar rouaultusersII*k{skkk{skksc{cJsRssk{{c{{sskZckkc{k{{sc{ss{s{֜sŜŌֵέ֭֭޵Ŝέ極ޭsνŜcksks{s{ksZsssscs{{s{Žc֥kkccJֽŭ挽Υֽs攜νεcRZBRRBJBRcJR{kZR{ZJBBJkkcBkcBkJ{{R:JZZscRRkJBZ:RR)JB:J{BRBBcJZZRJkksZ{Μk{csk{c{kc{cZsskckccskޥZkZZs1!:)!J1)scΜZ{kcZc{sc{k{sRsRsk{ssk{{c{c{sssckkskcZssk{cs{ssssk{ssk{kcsk{s{Ŕεޭޥ޽ΥŽ֥޵ťŜccsks{{kkέ{ssk{{޵Δs֥ޥŽs{{{{k{ss{ŵ֜Δ攭ν樂֭޽ޭ{cΔ{ZBJJRJRBZ1scBksZZRRJcJkZk:kRkBZJ{Z1ZZ:cRZJZJR:JJRJBRBJJ:BcBcJcc:J1RsZk{ckRJksssskkksZcsksskk{scc{ckΌsZsJss1!):)11:ZJkZcsckZkkJJZ{s{sks{kssksk{kZ{ckcsZcsksZ{c{{kk{{{ks{{{{{Žέ֭ΔŵޥֽνŭŔssΔތ{{Ž{sscZ{ssRΌc{c{{ޭֵ֭֌{Υޥkkssk{{kŭֽŜŔ{έŽ{kֽťޜ{BB{BRRZJRJJsZRBBZsscckZRBRccRRcRJZcR:BRkZ{RJRRcBkckBcZ1JRZB:BB:J!RBBZJc:BB:Bcsk֌ss{{{kcR{s{kcRsZ{s{ZZ{{{kkskk֌{sZBk1:)!:!)1sc{ZckkZkkkRsŜ{kkk{kks{{s{s{s{kskssckkksssssksc{Zkckss{kk{{{{ss{kέńBΥννΜνť΄ΌsΜ{k{{{{{{k{{s{ޜRޜޥΌRŵc{{{ޜޜ{ֵŌ֌ֵŽťcckZskŭZZBccťkBksc{JZR:JJsΔ֥Bkk{scsJBRRZckZRcB{ZkRcJZZscksJRcksZsZZckkcZkccZssZss{RJZ{R{kksJkc{{{{֜Δ֜k{kŭcJJBRRc)c1RB:1J)J1Z1JJ)Zkkc{ksss{{{kk{sckc{csscksZsZcsk{kccs{ss{{{s{{k{ccť{ŵֽŜ楌s{ks{{Zs΄{{{{{ss{Žń֔Ž|޵ΥsŔssΜ{ΜŜޥֵc޵ֽν{Jk{R{ssJskkssJBkΔ֥cZJJJJ:R{cńZZZsc{BRJRRRZcZRcJZkJsZckcZks:c{sk{JJZJkJB::J:BcBJB:ZJ:cBZ:1Bkss{{R{Υs{ccc{cksckcs޽ZkkJZ{s{kńJ!:BR:!1)J:!11)!))!1skks{ksc{skscZk{cs{Zcccc{kskk{kssk{ZsΔŽޜZkŭ{挌ﭜŜޜޭΔֵkkkޭsksΌksֽŭsΌΔε{ŭ֭Ŝcks{s֥cν޽ޜ޵ޥνcc{JRsZRZkJks{kc{ŽscBB:JZkcskJZJc{cBRJB1sZkZkRBJcZRskccRJJB:J{ksB1BR:s:B:!J:B::J:RRRR:cBBkkRބ{ޥ޵skc{ks{RZBZcck{k{֥s{sRέkc{{!B:!R1::1111!1:!:)1!1!sRckZZcŭc{sc{{ssckk{ckkcsccZcsZss{{{sνﵔťsޥ֥΄Ō{{{{{cs{ŭŜ֥ΔŭεcΌΜŔνŌ{k{Ŕc΄ֵ|ޥ{RR:JkcZ{sk:kޜRRJZJRcsckc{scs1ZscZJRJJBRJJRkJZRRcJZR:1ZJkccR)J:1ck1BBBJ):JZRZBRRB:c:J{sŭ{ksZŌ΄cZsk{kBsZkcZkΔενΔֵ޽ΔΌ{:B!B11{!:BB:)1!!!)1J)sccs{s{s{{kssksc{cck{kcccsZ{sksskss{sc{ŔŭŌΜŔ{sks{{{{Δ֜k・Ž{Υ{{εŽsRZB{kkkssccsRZZ{k{JJkRZRkcZkZ{ssckRJRJZc:ZJZRJJRscRcc{B)JBkJck{sB1B:BBR:::J::kB:c:c:B:B:1BBs{s{֥ZsZZZscs{{kssk愥{kkcscs挄{{{ޭ{{)B1!!!)1)1BB1J!1!!)cksssk{ss{s{{csc{sskcscJ{sZskskssk{{{c{s{{Rcֵ֌{֜{ks{{֭ńs{{s֔ŭΔέޭńבֿ֥֜{k朵{ν{:Z::kZZRckcZkZcRs{skZBJRckRk{{ks{kcRJRBBZZ:BRZBRRsRkZksZJcJckRZRcBZB:JBR)Z)BJ:)BkB:J::B:):BZ:scsk{{sksccZZZs{scZksc{sΥB{Όs{{{{k)!11)11:!11B!:c))11BcksZckccs{kksks{{k{kskscskkssks{Zֽ楌ΜΥŌsk{{s{csks{s{Δcνޥ΄ֵ֭ŭΜΜオŭޔ歔{{ތJZBJRckZcks{΄Zk{RRZBcJscZBJssޔsks{RcJJZZZZRBRBZZcccscsRRRJBJBZZRc:BBBBBRR:1:R!cBJcJ:J)R::{{{ssc{ssc{ksk{ZZJs{kkZsενk{B)1B!::)RZ::B1:1:B))):!!ksskkk{{c{kcs{{k{{{ksks{ks{{c{cc{{ss{{ksέέ{֔極{ε֔΄֌sk{{{k{{{{ΜΌk֥ε֔έ֭潌skkck{ZJBRkkRZJccsΌsRkJZckscZJJcJJJRJs:JsckkZk1cZBkJJJJBccskRcZZcRJRB::JBcBJskkksBJJR:ZR)Jc!R1JRJkΔs{{ssss{B:JsJ{ΥcŌńkZ:B)Bε֌s{ŵsB)!)!J1!:!):):):Z!1:1{k{{{{k{{ssZkkkkkc{ss{kc{c{{Zk{{s{ckc{ť{kέ޽{ޥΥŔε{{kֵ挜s{s{kkkk{{֌΄֌֭ŌΔޭŔ֔挭{kkc{ss{cBZkZkcJJcZRck{JRJJ{{RZJZRcZcBRRBBJckkcJRRskBsZR:BsckZJ:RRJB)BZRcRZc{RZckkBB::1R)BBJJ:B:R)Jssccsքk{֌ccscsZJZR:{朄Υs֥:)):!ﭜέ{sΥΔc!B):1)1!!!))11!!!:R:::!!{c{{k{ckksskckZ{ksss{ss{ksssε{Δ楥ޥŜŭΜŜ{֥ťsńkŌksk{ksŽ歜ޥ֭εέΔńֽŭεޜ޵skZZZc{{RZRBkJRsscRskZcZBJJJRk{kZJJRJk{ZB֔RRJJZBRsJcBcRJcRBJ1J1kRZs{ZRsRZZJZBJ111::BBR)Jkssc{kskνބcsJ{k{Z1kŔkRs֌k!)11νksZ{sR{kBBZ11R1:1!)))!!!):)11!{k{ccsccs{c{ssc{kkcs{s{{skk{֜Žֵ޽Žŭޥεk朔{Ž{{έkŵ{{k{c{s{sŌέ֔{֌ν΄޽ΔŌŽŵ{s籠s{{ccZBZkJRJsZs{RkkJsksZZRBJZBkkcRZcZεRsssc{JRRBRkkkJRccJckBJ:1ZBksckZcssZcRB)B1JBB11BZŭ{JssR޵{{ZskRZc{sZ{ŜkRR{JcB!ńޜŔތ)1)1))))1))J1))!kZkskZc{sss{{sc{kckk{{ssŵ{{νΜֽεΔŽŵ֥ťޭŜ歭{ﭵk֥޵ތ{{ss{֭ΔŌޭ޵{ZZ{{RcsBJss{ssJZJcRZkJJRccRskRRkZ{kcBZ{ccJsBRBRBJRZkJs{cZkk:BsJRkcckcRsRkkc{JJ1R::B:JcRc{kńcckk{{s{kZcޥέksJRsc{{c1s:!{{ksŽ{csk1)R::!:{)B!:11J1:!)){kkkscscckssZ{s{{k{{{Zk{kkńŵsc{ŽŭŌkŭsν楜sֵ{sc{kskRssss{浥{εŽޭŵ攵ޜέs{kkZJZcck{s{{{ckRZJcc{ZBRRRJJc:JcsJRJ1Zsskc{ck:JkBskRkZkBRZJ:Rc{kkkZZsZscRkscc1RJRB1ZZ{skc{skZޔccksRcZZZc{scscksR{1)1ZcZs{sk{ZkZk)kZBs):11:)!)R1:)!):1)k{sssZcsZcckccksZs{skskssֵŭΜεΌŔ޽ŭε֥ťsŜcskssc{έ{Zťs֥έŜΥ省޽ŭތsք{RcscJBRBBkcZskkJkcJRZZJޥ{kcZcc:kcRZRJk{ssZcBZBccRkRBBB:cJRJkcR{sZZssZkJckkckc{RkcZZscsk{cksZc֌scZ{ck{scZssZJkR{ZksB!B!!ZŌŌŔ֔ssΌsńB:1B!RRc))!JB1)!J:)ń{cs{Jsc{ckkskksŽ{εŵν֭Μks֥{{{s{ssckR{k{ŵ{{s{Ŕ{֥{c֭凜Ž޽νťskΥť{sskckJJJcZZscsJcZJcZZZZcsk{RRZRccJkRJJBJ{ֵJkcRcZZcJck{JJBcZBBJJ:ZZJB:ZkckssckZR{cRsccZZRZk{ZscZ{sk{{RkkksZscskk΄cskcJR{c1B1!1J!:B:!!::kތ愌Z:kŵJ1!J:!!11!Z!!B!1:B)):!1!Rsk΄k{{k{k{RccZŭŜΥε浌ŭ{{ޭΔ{Ό|ޭŵs{{{{{{ks歭Μֵֵ{s֜Z潵ޥ֔νZZcRJRRRRRksZZRRJRcJBcZZsZRkRRBR{JJBBJťޜcZRRRRkJcZZJksB:JJZ:sR)RZkkkZRkJcZkJZZccZskk{ֽskΔkcBcckk{ZRkkZsckkkR:J1))1)1k))B{{ńJ1sR{sJ{)))R):)):R:!:1!:1!!!)ZkskkkkksckZsccέޭ޵ֵ֥s{Ŝ{ޭތΥ֥{sk{{έkŜޥŭֽ֥ť֌ZJޜ{R{kέkZRJ{JZRBcZcZRcRZZJkkZZJRBccRBZZJ:c):skk{{kZ{RZZccZk{ZcZJB!ZBkRZBck{ckcskBJZkZZcZsZkc{kk{{{Jckckcc{kZ{ss{scckkk1JR1:1!::R)R{1::!sssքc{k{JBB))1J:!:)B{)!1:B)::!)ksks{{sZcsZkccZckcc{ε朔ŭŽŵŭŵŵΜ֭Žsk{s{ޥ{{{ťŜ֭ޭﵭ֜{{{{Ŕ愌ckŽ{JZkZcZεZBJRZkZRJRRsRJRZZRRcZJckkBJZs{:cRJJR:sk)kscZ:c:kZJc{sBBJ:ZB:{k{{skkcsJs{Zskk{cccsֵ{Zkckks{RsńckkkskRkc::!:1:){JJ{ssZZJ)Jscckkc111)!1:1:1!))cZ)1111!){ssk{{{kcRkkkcckŭŭ֥ޭ֔Ŝ{ޔν攥s{{ŽέΔ{{kքΥ֌{Zc{΄֥Μ{{{挭{RcJcksJΌZkBRk:ZJckBskZRJBRckJkJRRcJsZkRkJRJ:sRZ愄k{Zkkk{k{JkkZRkcפּckRRB{ZJRskss{kZskk{{{c{s{kJckBs{s{֜skc{{R:{kZBR1kkcsccskZZskRJ1BB)k1BBBZk{sss{{)1BJkR)1k{cscB::!):!J)):11)J11:1B):!1kޜZckcRss޽έބεޔֽŭs{csޜ{֔֜s{sބ{ŔΌkZcs޵ֵ֌{s֥RJkccckcJsRRJBZRRcJcJZBBZcckRcs{JJJ{cJJ1{kskkZsRZskkk{kkRkkZcJJJBcB:JcJ)k{{scskkk{csJJs{ZsZsΌsޜRZΜ{B!RkcskcZRscZZsRB)J{))ZR:sŔkRބkkRRRscJR{c:1!!1):!B11)c1))!!!:{業{Z{k{ŽŭŌŵŜ֥έބΜŜZŜ{Ž֔ť{{sssŭk{ssńZss֔sccޔsRksRcZcc{ccZRcZZcBBRJBZBJBRJcRŔks{kkZ:Rc{{kcccksk{kckkkZZJRJBcBJkRZBJΜs{scssccsJkskZcsZk{sccRs{{::{sJRc:Bc{scZck{k{B))B))ޥRsZZ޽Z{Z1B!!c:B)):)R:R)sk:J)!1!11Z11B1::ŭc{{kޔŽťΌֵťskֵŽνsk{ބŜŜ{{Υ{k֭ޭ{RZ:sskRRccRZZkRskRBZZJJRB:R:ZRJBc1cZss{scZ{c{{kkccs{kkcZksscck{sZs)RBckkc{c{s{ksskkkkR{sccs{{Z歭ޔscJ{cJ޽ZkkZRsckZcZZcc1RRc1B1B)RsRk{քRskZ:kk{{R1)!11::!))B:)Z11!!1!):)1)))B1{{sR{֜{s{{{sֵޥֽs{֥ŵֽνΥ΄޵ŭ{{s{{{{ތŜޭ愄Ōs{ckc֭֭֌{kZB{ZΥ朌JRBRRRcZRRkckZsBcRkJJRRJJsJ)RBsZRccR{քkkscskkcs{sss{sckZcRRkRcZJBckcccsssk{kZsRsk{scJs:sssZZskk{JkkZkkZkZskccR1k:::B11RZ֌RsRBBRB!B:)!!!!!R:::J1!B):)!::1)1{{{Zc楜{έ{ŽΔΜΥΥŜs{Ž޽攽sk{k{ťŌŽν浭{{skskJs朽ZZZJJRkνZJJRZkJRRZcsRZcJJRcJkBBBscRkJRkc{RR:kBcks{sk{csssc{Zc極ZkkkZJsskcZR{ckZZ{s{sskkRssքZkքZ{Zk{έ{Bc{RsRΜcRZsckkksck{R))R1)BBccsssJscsc{ssZB1)))::::RcJkRsJB1sccc{c{εk΄省ΜΜ֭ΌcΥsŽΜ{ks{s{s{s{s{{ֵ֥{s{R{sB{s{ޔ޽ޥ{sRkRRRJBޥ{BZRJJJJRckJZJRZcZRZJZZcRZZZBJkRZZZJk{cZkks{sRskB{ŵ֜kkscskkJRcs{ksc{ksJ{kck{k{RccRքťssBքs{cs{cJc:kZRscskB):Z:1!::B{{ZsZB{sJkcc:Z)J)1JB!BZŜR:::Jk:Bkc{Υsks{{Ō攜ޥνΥ{ֵֽέŜs{{{{{kťŔscZkZJJsBck{cs{{ŵ֥RkkJRZRZJsRRckZBBRR:JkJRZkcksB{:Z{ckZJRZRJ{cRkZZ{ksks{Zsss{{{ss{scks{kc{k{cJ{k{RZsc{sZs{kkkc{JsRkcscŔ楔skޜJkΌssc{ksZsJ11R!1!J1)k{{sZJZs{k{k1):RR޽sB!1))1)11ck֔ŔskޜŔs{εޭńŽ֭ŵŔ֭ŌŽ޵ֵޭ{s{s{{ksk{{Δޔޭŵ{sZckB:ZsksBck{ބZsZBZJZBRJkss{JZRscZBRsRsBBRsJRZRsZccRccccJBckkkscsckRcsZc{ZZZJscZs{ssskkcs{kZZcZZckkkZ{{csZk{{skckk֜֔cscZcskRcZRs{k1)c):!!))k{J{sBs{R!R:))B):::!)B!)!1ֽﭥ{֔{{ťs{{Ό޽֭ŵ֭ν挭ŔŌ{k{{{{Ŝ{ŭ֥ss{sskJckBJsRRcccsJksRsJBZR:J)ccťBR{RsRB:1cZRBZRBJ֭{{R{{kccsZssRkRRcJ{:JssccZJscs{Z{ck{skkR:JkZ{kss{s{Zc{kεks{sέsΥRkk{ZkZRsޭŵkν朔省scsR111BR!))!!:!)1B:!)!Jk{Z{ŵŵŌťŽŌ{{sֵŔ޵ֽŵֵŜŔֵť{{ck{{{ťֵ֌Jkksc{skZsJssZ{RcckcsZZcJJJRZJJBkkŭRZ1BJRJZBRJJJcZkcRRJRssZskJRZBR::cJJRZZ{s{RRB{BkZscskŽksk{RJRBckkkscck{޽kcŭ{sﵭ{Rޭk{RŌk{sk֌Z{{{kJ!)Z)B!1B):RJcBJB))!RŔssŌsνť挥ť޵޽֔ŽεŽν{޵֔s΄s{{s{{ޥﵵŜsRֵkskkZkRcŌRkskcsRZ{c{kBRRBc1JR)sR{sJZRRBJ1ZJZBcJ{kcRJJJZRJJRsZZcks1JBcRJcRJZBR{{sc{sk{sRkcZZc潥c{sk:B:ZBJRBsc{Ό{k{RŌք{sޥޔc֭֜ε{RkskΜs{޽{kcZ{{sR{1)!1B)1!B)!1R1BJR)B:11)1B{{ν{ŵεŽŜεskŜckks{{νεťΔֵkkk{{csccRsc{{{kkccc{:R)BRB{JBZBRRRBJZcsRcRcJJZ1kRZR)JRRRZ:scsBZs{JZ:JBRBc1:JBBR:kZccscksRZsksŭŽ浵cZccRBJJ:RZckcksťkc{{skskck֭έޭckR{ssckkkkssckcZ{ΔcRZRcJRRZJJcR)1J!!)!))c!!:B)1)sZBs潔޽朔Υ{ֽŭ֌ތνŽΌ{ŭ{s{{ŭνŜֽ{ν{ť޽΄cZ{kZkkcRRRcc{JBJ1RRB:BR1J:J{JZRJZRcZZR{kZRRJs{{R1ZBZR:JkRZcZZ:kBZB:R1JZcZZZR{{{{{BcsZkRs{cc{s挵{ΔcR{sks޵{kJJJ:c{{skťΌscŽ{kRŭνΔZ{s{Zcޥ{ccJ{R{k1B!!)1cZk{Rs{B!))11!BB):))!)J)):k{RJsk{攔քŭεքΜέޜ{Μ步޽֔s{浔ޜksc{ckc{ZkBRRckkJRBBZJB:R:BRB:BcsJkZkc:JBZBJsJ{BJscJRRkZsJkZBZRRBJ:BBZkcks{kkscZZcccRkc΄Zsŭ{{{kZsRBRksssksk攄scskkΥֵkkkcs֌kkŔsssc{RZcΌc:!!:!sBsskcR)1!))!:)1))!)!11)k{Z)kks{{RkŵޔsﭽŽֵ޽{ť{εsŵ޽ֵkcsRss{kZR{s{sZc{ń:B:JRBBBBRBcJJsŵcRk{sJB1JR{ckkRcZckRk1JRRBJJ{:cBJZkckkkJsZBskk{skkZ֌ֽńνc{s{{{{Rs{JZ{sssZ{{ބ{s攜skkޜޭsRRŭcssťks{sk{ssZc{)1):)kRZscssZ!!!)R!)B!!1JBRJkRc!)!cks:k{ks{ZŽ楔ޭs歔掠έΥ֌{kΌ{步{{潜Ž樓{scskkkskccRR{{{Rk{{RBkBZBBJ1B:JsΥkZRBBkcckBJJsBZcsBRs{cJRRJZJBJZBkZ{kscksssZZZZZ{c{{kŭεs{{ťs{{Rcckssck{c{籠{cŌskksck{ŵ޵{s1kZccsskRkRB):)!:!))1!11!!)!RcZcZZBJ1!!:!!)!)11:)1!ssJ!{{ť{k{kscsc{ť֜c{kޜs歜ťέέֵ֭s{Ž{ť{歭Μ{凜Ž省{{ks{kskccBk{{k{{kJckJRZ1JJRZRcZZ:RJZJ1ZZ:R1kkcJ{BBBcRBsJRBJ{skscJBZ{Rscck{Z{sέέRJR{kssssk{ss{{޵s朽֔skk{νބZs{BRBB1c:))))1!!!)))))RckksJc1B1BB1)!1)1BB:!!1{s{{{J{c{Rcs{kΥέŔťŵνΜsk{s޽{{攥Δオν朜{ŽΔ֥ν޽ﵵťﭭΜŵޜcskccsk{scsRsֵZޥ{֭kkZRZs{kJ:cc{BZBsZ::ZJBBcBBRJks{sZkcsc{Rc:B:RJZckJskkcBBŔckcJksk{sR{{ksΌkRkZckssŌ{޽k{Žޜތ{skBk:sֽΜJ֔{{{֔Z)R)!!!!):c!!)!)kkkckksc111))!!1!1!:!B))!:1kZ{sskk{skscRcJk{sέ{Ŝ֌޽έޭޥ{kέֵޔkޜ楜ބε֌ΥΜޜ{ńRBZRZJsZc1B:kkc攭Zk{Zkk)JksksZc{sZBcBsZRZZ:kc{kkJkJ{cZZZ{B{εZJcZscZkRskssksskcZ֌{skksk֭scZZR{c{s{cΔΜΥֵΔsscskccB1BŌ{sZ1{sZkcRsks{csc)B1:)B:R)))))RJ:BBBcR)1::1):B!!):B!!)Jsksk{{Rk{kZ{RťŭνŵΜŌέŭ޵քΜ޵ń{ֵέֵ޵{ޭŭŭ΄kkcscsB:JBRkB{cB{ksssccsZc{kskckkZ{sJJZJB:JZJ{{kZcZJcscRck{cBs{{Jk{cccc{kRkssέZsޜ΄k1Rk{{sֵﭵŭέksckcֽZRBBޥkskZsŔscB):)!))!:1)!1!1)1):Jc1!1!)!111))!)))1B1!)!:ks{sskck{ֵŜsZŭ֔εŵεJkքŵޭ歵{֌攥{{քŌ޵Ŝ֭֜ŜޭŜΥŭťssskRJccRk{kJcRkZ!RBZsŜ:ZJZcckckcZ{{sc:1JJsRJ{{JRsZsZZ:JksRssscZZccZZs{{{RkssZscֽkcέcRsRJZ{R歭ŵ{s{kss{{s{s{::!JŽkŜ{sťks{ބc{Rc:!1:)!::)1)))11B!:Js:))!)))1!!):!11)11!Zk{kss{{s{c{ŌޥŜsk歜֜{޽s֭{{{sֽŽŭsνέk潽Ŝ֭Žť֭Ž{{sތcsZJkZZZcRR)Z1cBckkŜRJBZcsŵ{sRcsscR{JZBRBkk{ckc::BRJJ1BB{kk֭{{ksZքńR{k{{sssŭks{RRsBkk:skν潜{{c{kskkssk{ZsRsZť֭ΜΜs֭ŵ{cB:BJ:RBJ1Z:!B):!!BB:)B):)JZsRsk{sccZZJZ{s{{Ŝ{s{k{{ckkŜ浌c潥ޔޥs{{s֔{{ŵΜkֽŜޔֵ֔ބֽ֜ΜέΥkksZksskssRRkBk:kkJJcZ{ΜskckZB:R:cŜZs{{sZcssBB:k:kZk{{kJJskksB:cJR{{{k{{k{{sckkcccsk{scssksZsckZsk:s1kZŭZc{kcskck:)1B::sZcs{sŜcc{νscR{ŌZJ))1:!1!B)J!)))J)c1:B:)RcJRsk!):)!1sB!s)!:{s{s{c{ks{s{s{εέֵŌ{ֵֵﭜνޭενťŽńΜֵ֥֔֜k{ZcsJJcBcskkBJ{s{kZ{ֽckZZJ1!cRZcksZބJc{kkBRk{RJs{kk{c{sZ{{JRJRRcńssksZ{{k{cRs{kss{{{cssRJZ1JskJ{Zޭksc{ΌckcR!B:J11sk{{Z:cZRkZsR{kZsZJ1:!)!1)!)!B111):)1!BBB!:!1JkJJkss))J)):s1!!:{k{{ssss{{kskkュ{ssތŌޜֵ攔ŭŜﭵބֽŽsޥέ֔΄ֽ޵ŌŔZkcc{sJRcsJޔcccsޜsk{kkZkRkBB{kBk{Rs{Z{ck֥ZkBRsR{skZkZcJcsJB)skskckc{֔ksュZcs{c{Zk{sZcZZZ{kRkcsRZBkscޥkks֔JcRZRBB:)skkskksZk)R:!ccŜ{Z:Js!1J!1))!1!)111))1!1!!)!BZB{sc:B1JcRRs111)):{kckckcsksks{{ss{{Ό{sŽ歵{΄֜ޔέŽέ極Υ֌ޔﵭ޵ŽΥ֥{JccccJB{cJscޜRc!ZcRZBBJJsBskc{{Zck1kZcc{c{sRcJc֜cJ11Bsssc{ZssZZkkRsk{k{{cks{{s{k{kcJ:Js:B1RsޜksZcJs{{ckBcc{Zss{cksssZcsssc1:)J{:1B!:)!:)!!!)ŵc:1s{::BR!{{{)))1ksckkk{{{{sks{{ťck{޵޽{έޥޭΔ޵޵{޽ck{ksΔŽ֜ޭ{֭֌Ō{ZkkZksssZ{{ZZk֥ŭZ{νssRB)J:JcZscZJccs{cJ{kBJkk{{kkkRZRc{cJskcskccssBccsccJ{{kcss{s{{{kZZks1BBsJ1B{{ks{sskkc֥ﵜcc{cc1k{s{ks{{k{kcRk{k{:)1s11B:::)!!B!:)1B֜kR1kk:1)1k{k1:)B))B{kksssssc{kc{ccsބŌcsޥŭs{ΔksŜ{ss֔s޽Ŕ֔{ֵ޵ŭŔ{RsRZ{sc{ZRťﭭsޭksZ1!BR:{J{1kkR{{Z{k{Z{kkcJ{sckccZΜ{ccZJkJ{kkk{ccscRk{{{Rkc{{s{Zc{{kccsBZ:kR{ksZ{Δks{sss1BJ{Rcssc{sckcΜ{k!:BR)B)R)!!):!))!BBŌkRk)k{R!BJJsZZk!111R{sR{c{sZks{ss{kcs{kZ{ޔޔkޥ{ŔֽŔŵ{޽ńքk{{ﭜ{sֽR֭業札֌{JsJRZ{ssńkZcRkkcRcBJsk)Jť:cscZRJks{{{JcZcsZZR{ŵ֜{{kcBc{{kcss{k{scέssRc{Rcksk{k{k{ckZ{Z1cc)RsRkkޥ{ks{k{skZŽ札cs{k{Μŭ{ZJ:1B{ZRBB111Z1))!s1ksck{s{ŭkk{{{sJBZ)B{kkskskZ{sZksssZRk{kc{{ńs{k潌֭s֭kޜ歭޵ťֽ{kΥs{ŭ攄{޵ޔޥ޽ތsBJޥ޽֌֌{kc{cckRksRsc֜)ZBRRcR:kcR:k{R{ZsZ:c{:B1ZJ{skRcRcs{Zk{ck{ccs{skk{kss΄{sskc{ssks{ckZkksksks{{{ckR{Z11:cRRsBkZckBk{Δ{{cscc{cckֽ֜s{Ŕ{ֽs:)BB:)1:1)!kcs{R1:Rccsks!c{{R:c:B){csZsc{{ckcs{c{skRk{RZsťŭ{ssŽνΜ֭潽޽ŭޭ{sֽŵ޵֔ť޽歭ֽνŜޔ{scR攽Žޥ֌Μ{{kkkcckJJZ)J:{ckRZ{kB{kZBRs{kRcskks:Js:RεcBksRkkksskss{cZk{cRkZJZZ{{sskc{c{sބZsBsskssń{ZskcskskkksksZR{c1:BR:R1cRB{ZRZ{RkcskRkޜsssksksŭsks޽s{JZZRBJ)J:B1Z:JB:B:)1!ksZJBR{s{s{sk{:c{RcRZB!)ksRssssk{{sksc{{kRBνŽ{{ťŭ޵ŔνޥΥ֭֜έ޽ssskks{ťJZcZcJZ{Z΄ksZJ{kc{{cBcέkc{kťZksZsRֽJ1JBcss{ssscJZck{RZZc{c{Zcckkkk{{cscJsRZsk{sksss{{k{sk{csskJ)RJRB11BJc!kcskZ:kscΌŵ{k{ssks{Zk{s{έsJc1kRZ:B:JBkBZ:kkRJ1RBBc{ZsZksR{ss{scJkBsc1{{!!:{JkJ{kRZksRkkss֭kcŜksέΥ޽֜ŔνŌŽ{έkŭccck{ckŔcZ{RZRccksk{cRsksccs:R:kc{ﭵ{{{sޭk!JZk)ZkkcZkckkkkRZ{ޥ{kcc{s{c{{ss{kckkckc{{JJZkZskcck{s{cscks{{cJZBJ1{::cBkkkcs{kJZskkk{s{scskkkZZJkskkk޽歜{sťJJ:RsZJ11RJRksJ::1{sks・{ckss)11cck!֜!!BskZk:ccRs{kskkscΥŌc{s{Ž޽֜ޔք{νŔŭ{ŭνŭތRk{{kkŔck{k{ssZBkkZRc{kc{{scscZ{BsZR{cZccΥks{ބ:11R)1kck{s{scJck{ZZsBcccss{{kZZk{k{sZkcZJskZRZBR{Rccs{{{{ksBRBJR1B1:)JBRcJ{c{ccνZZBs{sckkckks{s{攽ť{ssssssk11!)1J:JR1)))c{{sk{{ŵs{{k)B!!kZZ){c!!1BBk)ZJcZsc{ksck{k{{{{ccﵭss{{ŭέޜ{ť歵s{έŔ޵{ŽֵνŭΔcc{{kksksscsckscsZRsZcR:Zcc{ޭs{sZJZBZckZs{sZ{c{Z{k1)J{{B:Δkssc{֌{c{{k{ccc{k{{{Zcs{ck{Rkssccks{cskkkckccZkkck{scksck{scZBB:!1BJRkk{Bcccckkέńk޽ŭsksckŭk{{{ssZńk{csB!!1!J1)11ks{{{ssRB{Zksccc{{RJsJkc)kkJcR{cksssckZcRRksk{{{ΌŔޥΔ޵քkŭνֵŭsތν֭RcsZs{cc{RccskcscksccJZcsk{s{kkskksscksΥs{{{{kZkZ{1)1Jc1ss{kRkZ{s{֭{{:JR:{sJcR:R1RB::B:J:J)J)ksJZB:):BJZJZsRZJ1)1!BBJ{Z1Jkc1JZZJZBckkR{RZssskZRs{ZkΜsc{sc{ssŽ{sss{ck{sZZ{ŔsckΜ{sޔ{sŜ{{քckֵZcZJ:JRsJRscs{ZR{Z{J{kk挭k{{ތŵ{ֽνŵε{ޔބ{Μŵ֭޵ν{{scs{kcsk:sRsck{skcsskkcBcsk{kZ{sZs{Zks{ZsscssJR:ZsckcsRZc1:{cJJc{kkZRcscBZ)JZck:{JJc)Z)B:JBJ:):BsZkkR1cB)s1JJ1::Bc:BsB1:JZJ1))cZBB!BJRRZJkR{BcRZ{c{kc{Ŕl{ssk{Z{ssc{s{{cZJcsk{Rc{΄{s{{k{Zބc{k{s{νkcŭk{kBsc{cZZcks{ck{kZkkZkJsk֜s{kŵΔŽޜ{֜ޔΌέksέskŽť֔ŭ޽ŵ޵ŜsZZRkRZJZkskccksskZZBZZcc{cssZcss{cksZsRc{{BZssckkssBcZZJ:BZkkﭜk{kZB:RR:sks{:c:J:){:!kBBJ1:B1JZ{!kJJZZ:RB)1cJB1Z)11)BcB11scc11!RkssJcksRRkZkRkc{ccscss:csskscRJkssRk{Zs{s{{RkZ{քΔc{kZcs{{{scks:1{ZcRBJBRcc{sZsJcJsZcޥsZ・潭ń1skń{{sΌŭ﵌֭Όscޥﵽ֌ŜΔŜνRs{{s{JZJJsZJcRZccRRkRskZks{{ZRZRckcc{k:cRBcZs{{{cckc޵ŵR{{Zs:kckcsR:ZB!c{BZ11RcJ:B)11BZŭR)1:JRRk{BB!1ZcJRZB1k)kckBkckssccB:BRRZckcRJkZkk{{ŭń{{ckkkskk{kkR:!sJZRZcZRcs{cssskkZkss{k攄{s{ޭ{s{{ZcscュB:!ZJZ{kkZRcskkŵJkB{cZcέ{ֽΔŭΥ޵sZBcťkc֔s{{kcń޽֥Δ挄{εŜŭ{ZkεRRZBJZk{ccZk{{ZJcZBkcZRRZRkskcRcks{JBZ{kkΥR1JckkskťcRcBcR:1c:Z!:Rc:RZcJZ)R1Z1:k{JB:)J)s11JBR!:J:Jk11J:Zsc1c{ZJJk:::!:::{Zs{cBRJRc{kcs֔ksֵRΔsZ{ZssZ{cZZ{{{1J:{sRskkc{Ž{c{s{sޔ֌{Μksޜ{޽Js{BJBRkRkJ:BskRBscZBcJkZ{{ť浜s޵樂c֜ťŽŵ潭Z{{֥ťs{cޭsŭ֭s{tޭ֜ŭޥs{c{:ZBR{ZcskRZBkcB{sJkRkkc{{ccZJ{ZքRJJޔk{{{{ޥs{s):Zkcc{cc{RJ::RBBJcJ)Zc:RJk:B:BBBJJcZ{Z:k!BB1)):RZRBJ)))JJsZk{{scﵔBB!:11BskkťcsJsJks{ss{s{Zsk{cksc{{kZk{sccsk{cRJB{ބZޜkZs{ks{{{kk{{c{s{{{kcscބkc{c{c{ZRc{BRZRkZZJscZ{s{{JZsss{s{{ZkZss{Ό{νsޭŜέkε֥ŭεέsck{ν֌{Žޜέ{{ťֵﵵ挽{{s{RksJ{s1ZRckkk:RRνBkc:ksRckkZ){sc{kZksZs{cޭsZJRs{skssccks֜B:BkR1RZR1J1RZcBB!B!BBRkJBkB!1BBZ:RcRJ!ZRBJ1:{c{k1ZB:1:R{ZJ{ckskRZ{sťssc{ssccs:scBc:{s{:RZcs֌kc1B)Bc{sŌ{s{s{攭kkZkZ{JccZsc::cksŌksR{JJJBBksckssZkZZ{k{s{Ό֔{{ΔŜ֭ZsΜ{{֭֜{ֵ֜{ŵ{kcsk{sckRsccs{ޥ1ZZ{sZcZJcssZRRkJskcckZZccŵBRJZ{kkssέRťskkk{s{ZcckRsZ:B1:Jc):k:JJ:ZBJ:Z:)B1R:J{R{))!J1kJR{:1!B!11BZ:1!Jc1BZR{B:1B!:{J:1kck{ZBcZk{sRs{s֌Zsŵk{kkZ{:JR1::B))!:1RZsk{k֜Rs1))ŵs{{޵{c{{Z{k愌ss΄!)1)R:BB)Zkkss:ksJ{{kRR{{cZRsRZJZ:Zkc{sBZ{sccֵ{skŵsZ{ΥŽ浵Υֽ֭{ΔŌs{{s֭֔νν{{εΌΜŜ޽{kkZkskkZJRccZZ{BZ:BRk:RcB11ZB){kkZ:R1{ss{sŵs1{ŌkΥs{Zc{:JJc)J1:R{RJJBkRZZc::1c:R))JBZB1JJ:RZ1)BsZ1BsJ1B{)BJ{cksR:ZB1JZcR{ZsZRJkRcskޔcν{{BRJR::RRBZR:1s{cc):{ŽŌ{cJJ1Rcs{{k{s{csΌέ{!R!)1:11J)!JRkksRskssk)sckcskRc{JJsc{{ssΌ޵sc潜ŵΌュ֭νέεΌŜŵΌ֔kν֥Žks{ޭ֜ŽZ{s{{sk1:BZ{cR!s{!sB)B1)Js{RR{sRssJkc{!cBZc{{c!Zν{{ccŭ{skB1sB1Rs1)J)JB{kscs1:1Z)B:B)R!BJ:B1cJ1csZRcJRsR)c1JksR{J{1:!k{{cskkkssc޽{ŌBs{RRs:)BckJ:BR1R):kcsZks1R֌ΔcRB:RB{{k{ť{ńc{cJ1:):BcB:J!!Jcc{{kZJksBZRB{JZB)s{sJ!Zsc{kkJss{s{kkֽ{{ޥ{֔ŭֵΔ֭֌ﵽΌ֜愽εΜŭŔΌεŽsޥŭŔΜ{{s1cBR:sJ::sc{!):Z{sRskcZBZs{J:֌cs{εJ:BssֽkkssZJkBc1)sc):){11:1B1sZc)!11:1c1!1k:BJk!111Zc1ZJJ):R1:1R)JRZ:cc{Z1:!BBJBBJ1JBZssskZJsZkc{{scZsŜ{kccJ:)B:B)R)1!!::kZkk{ss))JRB1cs{潔ZJsŭs{sޥ{ksZ{{sR!:R!1!1)c{1RksccBkRkBB:JR{s{kZRkcZkcBcssssR֥ν{ތkc֔޵ΜŽΔέ{{ޭťŭŔތkckΌsk)J:{RR)JcBcccťkZZc֭ťRJ1:B::RccBksνBJZkέcs{c{ZRs1!:J1c1Rk::1!BR{sckZkkJ1J:J:!R!:RB::c:JRJ)RZJR:kZRkJZ1BRB!Bc1J!BkZcRR::Ō{{ks{ΔRŭJssZZZ{ZZB):RJJ)BJJ1){{s::R1JJ:RRքsc1Z{k{c{sތ{kcńńsc{k{ssJ!:1Z:B)11!)ck:JcZRZJ:Js:Z:k{RRBkZkc:J1ZR{{kJc!{cssΔΜ歌cޔťŭޭތέ歵ֽŵťckť{k潽ޭs{cΔZΥ:RŽk):1!{BB{ֵޔ:sskRJ֌sJ1BBJZZJBk1{kJZ{kֵk{scRskZkB:RRZ)){cJ!{1Rs{kRsc){c!)!1::J:!J))B:Z!1JZJZ1:)BJ:J!:)Rk)B)k:::B)ZccRZcŌsZcsJs{R{s{{ccssRcscs)ZkkJ11:):RkccZR{!JJJ1:Z1ccŭ{{s:{{ssŽk{kss{{k{{c{cskcR{{1))!:))J:BJss:kZZ)BR!{c1:BZZJRZsRB1{kZ1kcJB{cckRcRέ{ޭ朄޵浵sֵkŜ步ֽŜŜ֭ńsΜΌޥťޭ֥քνk{ZBkR:Js{sJJ1:RscJscJBc{skkk{޽kZBRZBZBJ1:kJ!s{c{Μ{֥ks{{ZJJ!B)cBR:RBc{cZJBc{ZB)B:1R1)1B::J1!)RB{:B1):Z:Rc):)1J{RJZ{{{ZkcsŌRBcR{sRks:{{Jss{{{ksZ)BRB::ZJZ:JcBRcRssc{JRZcRcsZss{{k{Zs{ckֽ{{sΥ:cJZBkc{:1c!ck:JZ:JskZ{csRc:scJŵŔcŔε֜ŭsŵŵťsΔ֭ŵ֜Ŕŵŵkŭޭν֜ŭskZkJZBccZJs浜{{{{JZcZkJRJkcZZssRcJR{R)RR)))11{s{Zńs{ބsRk{csR1J)1):Z:sJ))Z{Js:J)ZZ1kcZ1BkB:))11Js1:Z:Z)))):)B!!!:1):R{s:J)kksZ:Z:sZZccsJ)Zkk1scckZk{c)1JBkcRRZZ)J:)1)!::JB:!JB){::Zc:1)ZBBB)kck{Z1k{J{Z{s{Z{Z{cZBBkJJBsJR)ssk11R{cR1J:ZJck:cRRRέŭֽZքŵŭť΄ﭵέ{ŽֵŽŭ{ޭŵޔssބνJkkRZcRBZBkB:):1)εsJcZcJRc:Zsk{s{JcRZ1J!JZJ)R1J!JBB{!!)RkksZckkssBRsZ)1:)BB:BcRBB:BssJ))JZB!1J))1:JR{R:JkB!1c):)))11!!!1)1!!!)B{sk))1ks{Z{JJRsRR:RRBRsskRk{RBksZZRZss{c)1!:)1:J{:!!:11J::::1Z)J:B1)::Zs!1:BZJB1B1)Z!ZZss)kJ1Μ{ZZ֭sss{Z{BRB1JBRscsk)RZ1JJBJ:kkk)cc)k)RZZB{֜ŵŭŜ{{ZεŔŜŵﭭֽΔ諒ֽŵŽ΄k{֭ŭŭֵkRJ:RJZJ)BJ!RRνk{ֽsJ:cZskkcJc1ZsJB1JBJBZccJR{B:B:1JkckJRs{Bcksk{c{RZkZckkkcsB::J1:B:BZ{J)::kcsss:c)1BccB1!)1!!ZB:):)B)Z!1)1)!1!))Z)!11):Bks:)1Z{ckscJBRcsRJJZRJsskZkZJcsskscZ:B:1RRB!!BR:)B):)Jc)cR1Z!1c1B1!1cssBB11R1:ks:)BRRތs)s::k{{c{k{{{{kkskֵZB:J11B1J:1ks1BRcBB:ťkJBc11R{JJ{Bť޵Zťֵ޽ŭ{ss֜ޥΥŌs{ޔΔֵֽskk{Z{ťŽ֜sRRcks{cs{{ss{Υ{ckkk{{cc{:Bsc{JRRccB1c!))cZRs:B):JJBJJ!1csc{ccRcZ{sJkRkccs1JB)BBBB1c)BJs)J){)::J:1!:cR)1B)RBR)){R:!!)B1RZJJJ:1:1!1!):{:J:{ZskRZJJksŭkZckkZkZkckk{:scscR:BBkB)!)11!B1BB1BB)B)!BBB::B:1ZcR1kJ1)Rc:cB!Z!:JBBBs{!BB{{スZ{sŔss{{sk{֥1)RRZB:!BRRcJ1Bk:RsJccZRBBc{R{1BŽﭔťŵν{{s֭c歵֥֭{s޵εֽεsֽޭֽ֔ŽsZccZ{ޭέ歜{便kޜskc֥֭ksks{kkk{:)!B:{BJε::R1JBB:{JJBckcRkkZJ1{{k{Z{ZkRskksckZcks::1::111BJc):Jk:R{JB1RB!:JB1:)!J!RRJc)kB!Z)!J{R)!)1:!J1!B!!!))ckZޥsk)1ZsΥ{{kZkJscsscZRc:Z{{ckkcB))1BR!)!1)1R:B)1:1)))ZJ1:RJ:1JRJ1c)!J:1B:B1R1):B:ޥ{J:1:cssZs{֔skks{css{k)))1)Rc{R11Rc!:JJR!cZZ!R{BJJ:֥s1Jsތkksŭ֭kΥŭskֵΜŭ֔Ž޵Ŝ歽朔ŭZBZBRs{{sZ{νεsJsBZckJBJ!!1BŜsc{sscRcJJR:c{ckZJ::Z)s::JBZR1RR1k)ZZckJRRkZsťsRk:{R{{ksRskνsBBBBJBBJ:RB)JB{:B:R):1:BBZ1ZB:1))ZsJR!::)cB!1R!B)1JB!B)BJ):k{{{{{ss{1BckJZcsscZcskc{{:Z):JB)!!)1)J!:1B)BBB!!::Bc:Z:)B111B1:BB)JJ))BZ!1!1:΄1R1JJZέkkZksc{{kcc{ֽB:B)!){s1)ks{ssBBZBZBJ1{R:11ZΌZs{Δﭜŵ{{s{sťﵵΔ֜sΥŭ{εﵥέΔ:JJRB{Ōޥs{sskc{ΥZRJR:!!::J{ޥskkkZk:k::B:1{11):J1)Rc1:kBksJJcR{RZsZBZJ1BRޭssR{ZRss{cccJJB::BBBBRRJBB:B{ZJ1):B)BΌsccJRkBs{Z:!cZ::1J{:)!:B!!1R{Rcs)Jkks{{kksޔk{kcckcksJcZ{sJ{1RckJ):1RRBZRB1)Z)R1:Js:ZBccJZ1:1JJkZZZ::sJZZZBcB!Z{s{{k{{{s{s:kksk1)!)1J!ssRcc:R1RksZBk1RJZ)ֵkscJJRZs{sťޥΔŽ{k{{{֜ޜ޵攵sΜΜΥֵskdֽZkJBJBJB{έ{{{{kccsŭΔŜŜssksZZcń{cs{cRc{c):):ccR1JcR1Rcc{JB){k:Zcc{ssJcc֭{sc{s!{Z{sksksB:JJJ:J1Bc:kJ::kR!):!ZJsBB:Z:ZckZZ{!!1JR)J)!)1ZsZckBZskkk{k{JscsJ1ck{JsZJ{Z{Rc{skZ{B1:Bc11:::1c)B:)kBBB::RcBB1:11):BJ!)BJBcRBZR)c::::{sZ{sccscJssZZksŔs)1::B1:11s{!J:JssBscJkZBJR1ZZJc{ckΔޭֽkss΄ޔŵέkkkֵsZ{c{ńJJRcBZZRc{ތ{{{{csss޽{Z֔ksέZkskckccsJZJ:ZcZ1:1!!Zc{!RZ:{1JB:R1!:::ZkscRs{J{c{)!B{Z:c1cJkBRJsZJR1)kcR1!J)1BBsR:BBJBB)J):!JJ)ksZ{:sksk):1kZ:Z:RZ{kckckZ{kskRkk::)BJ1:Rk1B!1:1Z)BBs:1J!1)1):Z)Z:)BZB{ZBRR::BJB){kkc{{ss{{cc{{ޜΌsεksֽB:!ZR{)BJ:JRcZ1Z:R{cBZJc{sZZ:J{Bε{Z{ޭŽﵜޭkkΥck{{攽ŭ޵{Ŕތk{RJB:ZJ:RBs{{skcssks{Ŕcsc޵ZŜ{{skZsckBZ{sJRRRJB:BB1ZRZRJ1cJRR!sB!R1:BsJkBBZc{ZkssssskscJskkcZ)J)ss΄cRssB)1:11)JJ1)cBJ:B1Z)BB!:1{BcccskBR1֥{s)sRJZBss{ZsZZZ{s:RBZB!:JZkkcBRBBB1R1R)JB)RBB:J:RcBZ:JBJksZkJ{J{kZ{{{s{{c{kޥsń{{csZޥ)1)11k1:Bkk)s1!s:cskZZ1Zk޵ŽRBc{kֽέk{{ksR:ZcRZZR歌νŭֵŔ{{Žŭνc֜JBJRJJBcJBc{JZcZ{kk֥csRJΔB1ZkΜ{kccsJB)kcRR{RRk)1RJ{s)B:1Z)R:)c!J)!RR)ZJZsJ{c{Rkskcc{ks{sZ{{ckcc{)c:ckk{c{{sZB:)Z)Z1BRR)))BB)B:)B)::kcsscsRsZ)c))B{!BZJ{ss{cJ:1Rk)R)!))1)J1::Z1J1)B)B1):BJBZ)kJ1B)s{ckssks{{{s{k΄kk{s{Ō{k{sތŭcB:){)JskscJ)JkBJ{sssc{kcJZBk{έ{֭csscZZsckZZBZ攜潽ŌΔ֭{քc{ΜRcRJZks{ZcέRc{sJsޔ֜csk{sZ޵{kckcJ:JRkccc1{)RRBsR1k{Jk:!k:11R1)J)1BJBB1:{ZcRc{skcsssZskZcJJRscRc{{ޭ{kkB1R:){!1):!11:s1!B)1)::{ssks{sZB):!JZcscZRccR{c:JRB:B1)1)Bc::11B:!J11J)B::R)RZBkB:sRk{k{ZcZsZZJRޜ{{k{c{{k{kkkcZ1scBsscZRRk{BBk::{csksJZ1BJBRsZZRk:c{֔skcZRcskc{ccքŌZR{便ss{ŜΔŭ{{{{ZRRZckkkBc{{ssssZsZ{Rc{sŭZR1ֵRsZBJ{s{kRBcc1BR:!BkJ1Z:Z!1:JcB1cZ:ZJ:Z1BsJZJJR攔sskΥֽ{{Js{{{{sŽťkRބkZZsskZRsckZcZsskcccRRZ:BB֥BZńcsc{sssBsZ1::)RB!1B:R!):::1)11::J))JB1c)ZJRkkksssZsscccJBk{{s{k֭k{kνΌk{sBkkcc)B{RZk{sZBRcs{{:RcZsŔskckZsJRkcZZޔZsZkccBJc{{k{Rk{ZkZZkJJBZRkcεs{sŵs{{BkRRs{cJ:kŔZZksZRcssRŽc{ZRB::RRť{c{ν1scB!B)1B)1RR1RJ:BJ!kcBB:)1!BkJJcJ{s{ZZk{{Jcsccksscsss{ks{sk{B!ZB1)Zs{ZB1{{sc{s!B)J:B1RRJR1B:J{sRRZZ{c{c{JcŽŭZ{sc{kk{s{ZsZks{Z1ck:JZBRJ):JBc֜1c!BBJc1s)):Ŕ{sZ1Zk{k1B:ZJk{{R1RZRRssZŔkŔ{Zkccccs{{k1JBRcRZZss{{JRZ:ZJ{kcJZRk֔ΔńŔ֔έ{{skk{kZBZcksJ:R{ZssscZccRRc:sZ1:ΜkJŔ{):ZZ:J1c:ccB1BB1):ZZB:J):)kBckRRJ{{Zk{ss{s{Rcssֵ֥s{k{{ޥsc{ks{{{s))B):kkkRB{{{sk{ssssBZ!B:B:1BB{!Rc{{s֔k):J{RkckkskcssssZkքkZJs{kcss{Jssε{kcsskZ{sńcRsskcs1!:J)BR1cR!B!B:1{1kcBkJkk{!!BRB)BBRBRJZskRk{ckBkR)RZkkJ:::Zk:Jsބkk{kťŭ{kRBcZBcc{ZZRZcRZBBcsBZB:֌{ZskRJBJ{ssZJ:ss{{c1Bccssֽ{kΜεZR{ssRkť{:::sZJ{!J1BZsZBJ:JBc{Jsksc:JR:{ksRkRsťs{s{sZkss{{k{έ{RkŽsZRBBJ:1)sRRBssk{{css11{ZR1J{k{sJssŌs!RsZscskcksskcc{{{sBRk{csRc{ZkcZ{sskk1):B:!RRJZ!B)R))Js{1ZcJcssޔ{RcJ{::ckZR::JJckcR1{{c{ck:J:s1Z!1{{RsJ:kZkΜkZk֥kJkss{{cs{ZBR:J:BBZs{{JZRskkŭεŽcs{cskc{s{{kJss֜{kRccZsZcΌsB掠sﭜJ:1Jc{{BB{::{BkZJ{B1s1{1JZBBBB::cZkkB:BZ:JZ{sRR:kk{{{ksscsޥޔcccŽs֥Z{ckR{B!:)ZJss{k{s{{{k{kc{R:RBRcsck{skέRc{{kk{{cťskJkkssJZscRssRRBRBk{k{sks{{sssk:1B!:Z1JZ)):::)1kk{{ksk{:BkkZk)1JZcRkZJs{sZcJBcBcZ:RZs{cޔŔ{s{{skZRc1J:ZZBJJ)BJB:ccsc{sZks{ck{k{skskZ1JRJssνckZk{ZRkc{cB֔{sRkc֭kcťRBRcs{Z1)B:B!JkJJZc{!::!JJJ!c1ZBB)cJ!kBZssksJ{{{sZ{{sksskk{{{Υ{攌{ksJBB)քs{s{))!1:)RkZk{sskkss{ń{ss{R):))RBRBBZccsscJJsRcsZkskZkskcRZ)JBBRJJZZRJs{Z{{Z)1R{ckss!1!)1R:JJ!1)JB:R{挭ks{{kJ!)kΜR!BkssJJ)J1ZkZcB1JJBJ֜{ZkkBR:Z{ťcZkZJRsΔssBk{sBJ1J:BJ:JRBRk{csRc{{{{ss{{歄kZkZs{kkZkB:BB{s֔sZcZ{sRkskcޜJZZŌŽRskcZ:cZ{kcJ:BJBscRRc!)):JRRR):JRZ{BJBBZZ{JZRcc{s{{{{s֜΄ޜkŔsBJB::BRBB{{{ss{)!B11)ssccńs{{{{{{{sZks11B{JB))1)JZJkRZ{֥ssscBc{{Μ攜Zsk{s{Z{kcRBJBZRs{scZRs{sssJ)1{k{s{k{1::!:JZRR1JBB:1R1{s{c!!!kZB!!!{c)Z:1cJZJR1ZB:BccBc{cc{RJs1RBkcŜΜcZZkcscR1{{Z{{sBRRBB1BRRJ:Z{ŭ{ks{{{{{s{cBBJ{BZZZ{k{{{sk{{{ckkRsk{kkJ{JνŭνRBZ!R:BcRckscc)!ZZsRRc)1k1BZ1:R1{ZB)BBB{BkR{ssRs{{朌ť޽)BBBJ:RJ:::BB:Bέ{scscskc{cckccss{{kk{skk)B:{Z{{c{s{ksŌcc{:sc{֥樂{s1JJBR{skZZs{kkk{{s:)ssss)!BB))RB:JB!Z::R1J1)sﵜ!sscR:Bc1cscZk!sBs1cB:BJ1RR{Jc){ccsZsŭsRR:kZ:{kRRsksRJJBB1J)JZkRk{RcBB{k{ckk:::ZcZJccJkJJckss:BJ:BRBBsJBZJsRck{cJZkcJ޽{ﭽ1ZZBsJcJ1:BRJJJc!BZ:cRBcs:cZRBJRZ:!kRkkJR{Z{c{ε{cBZ)BJ:J!RJJBJJJBJBBssss{k{{kscRkcZc1kZ{kk{sccքkRscRcskkZBRcZsZsZkckk{{ccZ{ckkssք:B))!J!):BB!R)J1BR:{cZΥ{!JsZ)kBRZsJZ{c::ZBZZZck:11):sBRs)JsZcRޭν{s{cRRZJsRRZcs{kcRR1BJBB{kŵscs)JJBcJRcJZJ1RBRJc{:sBRBB{RRkkBB:JJRR:sZcJBkcRskRccckBkέֽ:1):J))RńcsksBcB)RB{R:1Z:kBB:Bc:RkJsJcB1ccZs֌{BsZkŌZsskťZJ!JB1::!B!JJB:BJB:Z1J:Bk{s{{{{{s{ss{{c{{skksskksť{֜sťkcccJcsskZ{cskkcccss{skks{{kckkscsscZsscs{{{{k{B1!)::!!1R))sZskss{΄{ŔJ11!!:BBB::sB!RZs{kBJBcss)B::)JB挜έcZk:k{ksZZ{{RsJ{cZJRZ)BBBsccckcccRcRJBckZ::BJBsZRJ:cJJk{{cJRJBBJB{kkcZcckk{cZZRccBZ{{ss{{Z1:{BkkckkcZBcRJ1k1J):JJJZck!sZRBZZZRR:J1J{cs{ssJscsZscs{kތZJ!B:1JBJ:J1BB1BBB1B1BBBBBBńcs{{{ccks{c{{{ccsk{ZR{s{ksskkk{{Z{{{cJ{sZsckZ{sޭkskc{scRcRJJkRcΜ{kscssk{R{kk{{c{sc{{kk{J!:J!:B)BBB):RB:R:RkcckZ1Rs!1JBc:)J:ZkZRR:R!BJZR{Zs{{攜{sJJJR{cJBRBZRkZkRJBZBBBBcscRcc{ޥsscBRBssRJ1:BB:::BZBBJRccJ:JBRJB{sJB:JJckkZccZssscs攌BέRRcZss{Zk:cZRJJ)k1JZJk)k{ZRJR:J:R:BJc{ssss:skkcJssť{1:B:J:RJ1J:::)BJ1B:BBB:BB:JBJcεk{ZZ{scks{ckkkckkkkkscZk{ss{Z:c{sZ:kJ{{{Zk{cZk{sssksk{{kss{kss{sksc{k)))ZZJJJZcc{BcZs:!J:Z!1J)R!B)::ZcR1BcsZ:1Z:kskJΌJssJsccsRckJJRJJcJ{sskkkc)JBZskRRJ1ks{sքkRRRJBckJ)JJR:JZRBRR1BBJJk:JJRBRB:{sJJ1BssZk{{ZcRZsckcZcJŭs{Rssk{{ccR1RckJZ1cB1:JkRkRRR1R1:1kRksc{cssckR{c{{s11)BBJ1R:::11::J:Z:J1::1BBB1BBJ::JB1Ŝs{sc{{{s{k{s{kkccZkkcckcs{{kcscJΌkscΌ֭ŵc{޵Z{樓kccskkkZ{ck{kscs{kk{c{skk{kkssk{kkBZc1)))!:R:RR)R{{s{{挄!Zc{!)::Z)R)1:BsckssZZ1:BBJJR!B֌JBcRs{cJBZsZ:ssJRJZ{kZ{Zk{{{ZRR1ccc{RRRRJBcRJZB:BRRckBRR:JJB::{R{ss{{ZJB:R{{֭s޵ZRJsZscs{ssBckŽR{Z:1ZkZkkssBkccc!)kZ:R!Z{sRZ::11Bc{{{cskksccJR{ssŔBRkRc::1R:1B1JJJJ::B:B1:BB:BR:1BBB:JJBJB{s{{s޽sRcs{sccZck{ZkcsRsssksŌZcRZsBskZRޔkscZ{޵ss{{{ks{cs{kckZkkscs{kcsk{sc{sckZ{ksRcR!)1B:BJZkJZsccֵBs1BJR11BR{{s{)ZcZR))!B)sŔZc):s{ZJkkRsBJ1ccBkZZB1ssskZkR{:RRZks{Zkcc{s{{cZRkkBB:JBBRBZBcJRc:JB:sZcB1k{{{c)BBZkkΌ{BJRZkZZJccsR:1:{s֭Ŕ{{Z:JR:Jk{ZBcck{k{ss1J!{kZR1{Z{sRc1:1ckc{ss{kckRk:R{cskksBB:R1RB!:1BB:B:J)RJ:B)B:BBB1JZ:1J:BB:B:֜ńν{sc{{{s{Z{{{{{s{{skk{s{ZZR{{Z֜k{c֔s{ssssZks{Zss{s{cΜsksss{k{{BJ1J)!BB1)R!1)!!!{ck{sBs:)!:kcsތRRkZ:))!!):JRkB11{{1cskRRRZ!cRsZ:k1{J:1ksJZ{k{JZ{:skccRZZk{)k{ccBJJJBZ:B1BJJRBBBcsR:RB{scksZZcJckk{skJZZckZRcRֽcZBZ{JkJJ1Z1Jc:Zck{{{cs{Z!R:Bccs{{kscckkcck{Rck{JZ{kB1ޥJJBB:1B:1B:BJ:Z1c1:BBB1ZBB:1)11RJRBBB1:J挭ŭέΜsskk{ksskkkJZZssksk{{{skkcskks{{kBccscZRŵֵsckskssk{kZ{ZZ{sJ΄kJZsksc{Ō)1!!!::1))!1k):!!:c{΄愭)JRk1ccBckssZ!11cJ)JJB)RRs{R:){k1:JJ):)kR{sJJZkBkBJBZ:R1:ZcccsJRRskk:{sscRZ{{ZR:JBckZBR:B1:cJ1JZBBJ1BkJRRZ{sskkJk{s{s{ZJ1R{cskksZcZRkscZ1B:B:1kZ:ssRssckJccŽZ):{RRZk{skcc{Zcs{kkcBRcsskcRZkRZcޔs{cJZ1JJ1:R!1JB::1:BJBJ:::BJJ1:1J1ZB:JBB:1B:RJ1R:{Υ֔{ksckkZZsskccRcskkccs{s{s{{cskk{{ťkkRkZcsscޜ֥ޔΔ޽scsksťֵk{{ssR{{ksss{Υkkks!!11B1:!!)!Z)!)!c{ss{k{s{k!BZcck:sB!1J)!J1c:!B)J)1Z:Z!:::k:Jsc1RsJZJcksc:JքZRBsc:cZZ1cZ:ssֵskZkZ{BRZssJRJRBcJkJRRBJRZJBRcJJksc:R:s{{{skB)Js{k{ckŽsJRkRZ:Bck{{R{BBc)ZB:ZZZJcZs{{Zks{!R):JZRkJksssccRZkcJ{ckB{ksRRJ)B:B)B:)B1::1:1:B):B1:::::R:)J:J)R:::BB1:B1B:1JZńsk{k{kZcc{{kcJcZss{sZkkks{k{{s{Zckksck{֥{Zks{k{便{{c{kscs{{{c{{k{{ssZ{{c{s{skZss11BB:111:)))J)){{ssk{k{cZ)ss{kJRJRks1)1k11{R1!:::RZcJ!):)kZ1sRZZ1R{քkB:RcJ:Z{{JJ1c:)Jc{ssB{csss{JJJc:BJZRJRJRBkRJJ1JR1RJJB{BJJ1{:R)1RcksZsJksk{c{޵֔Δ{cBscZsΌRRscZkcc1ZcZcck{{ssJBk{ccZkkZ{cZckZJkZZcRscR:11:):BJ)JB:)BB:JJ1:B1J:11::B)R)BB1BBBR1R:RB1J:BRsc{s{{{{ssskcZZckZsckZB{Rk{s{ccck{ck{c{ss{sZ{ńR{kkcRk{sk{kkέc֜Zskcskkk{cZ1J1J)B1)B11)Z!1BZcsk{csks:kJJR{)JZJ!!BR!cZ)JZkckJ!)1:!RR{JcB{s1BJJcscZJZBcZcRk1RRR{k)Bs{c{RJJssJJcRB{sJZBJJBZBRR1:JBZBk{R:sJB{:ZB:JRcB:{{RZZ潵έsk{Zs{k{skkcksZZsss{{k{1:!JJ:kcc{sc{kcc{{sss){{R:{sZJJs{cc{s!B:B)JB:)::B1JB:J:J)BB:::J1111::1:BJ:JJJ:Z1J)ZB1s{kss{s{skZcZcZJkcssZkcksscZkc{cckkssskcksss{kֽkskkRńŌkZŽkcc{scskk{ks{kk{潭c{sccB!)!BJ1B):)1Z!!)!ssss{kccksssJsJ))R!Z1)!)1RR)cJ:)1)ZkBks{kc{RR!scRZscR֥޽{{kkscc:Zss{JJ{ssk{kޥR:JccZJsR:BsRR11JJRB:J:RBBJJJ):J1s:ZJ:ZZJZJsc{Z1JsssތŌ{{Ŝc{kckZkBss{kR֜ZZ{sssZs{{s{J))cBZR{Z{csksccRZBckJckcJZJcBss{{ޭ)1Js:B1:::):R):111B:B1BB)RJ::BBB)B:B)BJ:):BJ1JJ)B)Ό{cs{c{ZkRRRR{{{Z{kRccsZ{s{kssRkscŵZ{cs{ť{ccsތcZZޭR{sskZskc﵄skkkk{kk{ŜksέJBZ:cZZcsssRZ{c{kk{ksck{)JJ!JkŔ:J)sR!BR):BZZJJBcZ{Rck{cRcskk{ޜ{{{sBJ:kRc{ss{Z{{:B:J1JJB1s:cBJRkZJJJ)J:RJ{{{{JJJcZJBJJ:RJRZ{ZBBcRc:{{k{kksc1kkZckcJc:Jcss{kkks{{Rk{)JBBkR{sZ{sssccZRRsscs{{JkkkkŽk{քJ{sB1Z:B:B)B1)JB:B1::)::B:)Z)::1J1::::B:BB11BBJBŔkk{kZs{{{k{{cks{{{skkkk{kcsckc{ssŽ{s{s{{k{kRJJBJBJs{Z{cs{skB{k{ք{k1)B!JZ{ss{skRc{kc{csZc!s))J!!!!1:{ckJRZRJ{k1R{{{Z攽ŭ{s{kZ{Z:BRJk{{{sss{JckJJBZR{ZJR11R1Zkc:BcJk:RRZZBRRJkJZJRZkc{kJsk{{ck{kc{޵cJRscZc{{kk{kJJ1{ksBZ{k{JJcRc{kJscRJ:J{ssksRZ{kksk)11)BBJ!::1R:B1J!BB:B:1:11):Z!BJBJBB1::RJ:11:){֔{c{kk{Jk{{cckk{cckssssk{{{ckckss{εskŽccRscB1)1!)cZkc{{kskskZcRkΌkε޽skRB1B::RcRcs{{ksZc{ckkZscR!!!kB:k{cB):!1ZBB{{ZJZRR1)cZJkksB{sssk{c潌Μ֥Rk{kk:JsckZZBJ1ccRJJ)Bk{1RBcc{ksJJZBJkJkscB:ZBkJBJB:JZBJZJ:RJRR:cc{Δ֔{{{c{sΥRBRk{ZscsZcZZJBRs{RscsccZ{{kJcRB::Zss{skZZ1:1B::)1:R!JBBB)B1BB::1R11B:):)JBBB!JBJB:B))B1BRcŜZcZZZskk{s{{{{ksk{kksscsRsks{s{c{sεZ֭{ck{cks{skRkcZkkBRRcZZsZcs{{{RŵsJ):!::kc{skkZk{{kRssskks{s!!Js!{c!))sR)!:)cZsssZsR{sJkZkR)1Jcc:))B1RZ{Jޭs{:cksZ{R:csJB1JR::J)J:{BJJJc{:ZkcZJBs{J:)ZZJJ!JR:BBBcZBR:RRBB:Z֌νssέބZ{c{kJJ:{k{c{cRccs{kkRkZJs{{Z{s{k:{{sZ{sZs1{kc{kscŭ{1:::):B::111:)B!B1BB1Z!BR)JB:B1B1JB::B1B1J::J:J!JBsńkZJkkcscs{{{sZsk{{{{ssRc{scs{sc{ssބsss{kcZ{ZkkcckssskkZZc{cJRkBkssRkZZ{ssck潭cs{Z))):Bkss{ccZkcs{{sJBk{B1Δ{k!!1cc::J{c:BcckB):Rsk:B)1RkJJs){c{sscZsksBB:Rc{ccBZ)1BZZk1JB1R!RRJJJZJZB{s楌{cZssJB1k{Zk)RBJJJZJ:k::::BRZJ){{ք愜c{kcs{kŔkkRcsŭcckRk{ksBB1Rk{sZJcscccssZkcJZksR11B!::!:1B1JB!1:)::!):BJ)R)BB:J:::B1JZ:B:B::BB1:::JބZ{cs{sksk{{kskck{{c{kk{{kks{sskc{{k{ks{{{ZsZ{sR{s楄kkRskskRZ!)Js{sc{JJckZJkZccskkkkkkRB)11)Rsskkk{ZksssskZkŌ{)R{B1!!B1c)Bk{:!kc1::RJ!:Z:B:R!BckBsRZB{ksks{kRJB:{cZBBB:RJ::J:J::JBR:)J1B11R1JcJBk{ŭRR::R:sZBZcJ::RBRJJJRR:ZZBB:1Jk֭{Zޜŭs{c{sZBck{ZR{{:ZkkJkkRBsk{ZZB{scc{ZssccskkZ1JJJBRsZRsZB{111)!)1:BB):B:1::B:B)1::)B:B:B1)RB:J:R)RBZ1BRBB1)BBs֥kcs{{skck{ss{ks{{{ksssZkcs{skRkkskksZs{c֔skJcs1)1Rkkk{s{RBsskZRsZ{{{{skk{R::1B1Bks{kssckkckk{{k{kΔZkJZB!1!:{:c{!BR!RZsJ1)JZ!1BZJJJ)sJ:sBBcJc)s{{skZcJckBR:RJ:J:ZRZBBBBBZRRBJJJRBJs{{ZZBRBcsckJk{s:BJJJ1ZckZ!JZRBBJk:ZBJ1BJ)RֽޔcŽ{{{{{cs{sZεR{έ{ccR{{JRks{kc{BcsZcscZcsZc{skΜckR:{!B1:1J:111:1)11:::J!BB)BB)B1)::1:BBBR1BBBJJ:BBR)JBJkcc{c{skcRZZc{{k{ks{k{{skc{{{ssksk{ksRss{sZk{kssc{)1{))!R{kkccsscsR1cZZ{{ss{sR{{楥Δޔ{s{k{ťťRZZ):!!:)Rsks)Z11:k!BBc{cc:JBZkc{cck{{:Rs:R:R{kZJkkkZccR)1J1:BJZBJB1JJsJRBRJB:BR{s{1JcZJ::cB:BJJBJB{J:BR)J)B:Z)BBJR:JJBkcέεΜŵ{c{{k{{sZ{JJRsťckskksksZcskތZ{ZZcsZJZJc{{cBkckkBckZ:::1B1B::J!::1!JR1B!Bc)J11:B::1:B)B::::B)JJ)R1::1R:::{cscssck{k{s{{{{sck{s{ks{skcZsckcs{RssB΄sk{ZcRkskkc{kBRBBRZJ:BksZRscRkssskccZ1{kZksֵŭs{cscs{֌{{朌c1JB!R1ޜ{!cssR1!k1:BJ)::Zk:)k:Js:J)k:kssckc{Bc{JBJc1JB1{1)J:RBR:Z:1JJJ1Bcc{:B)JR:)1:cZ:B:BJZRcBBRBBZ)cB:::cJ1RJs{޵Μť֔{cssŽc{:Jc{k{kkscksZ{kkZZRkJRZkZsRcck{ks{Z{RR{{:{1)R):)1:)BJ)J11!1B:!)11JJ1R1):B:B:B:JB:BBB:B::BR:B:ZŔ΄{kk{kks{s{{sskk{k{kskksss{c{{{kcc{ssc{kk{sZ{RZckskk{11):ZJ1B{k޵c{ֵk{ZsZ)1ks{{cs{ΜŽZŭkks{cZZBBZsk))ckJRcsc:kR!BZ:JR)k):J:{Bc{{sJkkkBJBBJZRJ:ZcJZsZZBZ)J::{BRJRB:)BJBBJk{kν):1Jc{1J::R)BJ{{k:{BJZBR1:BBBRJBJBRBc{ZޜŵŵťΔcsŜkk1k֭{s{Z{{{sZ{cZsc{skZ{{ZJJZskcJskcB{{Jcc{ckcsBB1!B!!:)B)J1)B::1BR):1:B1B:::B:):::R:1:B1)JBJ:1JR):1B::B1RRŵZ{{RJZkks{{ss{kssskssssk{k{skkZ{kJckk{k{Rs{sZskkRscs{kBcs{{:!:s)RB!Bckֵ֥:sssssR:Rc1sŔcks{sֵ{֜Ŕ{ֵ{Rks!!11Rck{1)J{!)k!RJ:1:k11{ZckZ{J{ksB:Z::RRRBZRccssRsc{{JcJ:BJZ:J!sޭJ1k:{{sZ11Z)ŽZ1::)J11:1JBBkk:J:RRJJJJB:R)JJs{{sބ֜޵֭skքckk{Μ)Rs{kk{{Zs{c{kZcsssJk{cRZkRRs{ZkJR{scscs{))ZZ)J!1:!11:::B)B1):)B:):1R)RB:))!B):B)J:BBBBB1:B::1:)::1:B֔Z{Jsc{{kkkc{cssss{k{cks{kcsZkZk{{ss{kc{{csRJkk{{ssskZ{ss{cńkks{ksk{skkBRŜk{εΥťΥs:cŭ!!J!!!JŵZJk)kkR)BcR:1cBcks{sZcR!B1ksR1c{Bc:BJsZ{cRcJk:kJ!J:JJ:B{޵JJZ{kss)1RBs:B!B:1)B:1B:)1kkkcBJBJR):R1:RBRRcRkZs{Zޭs{kń{s{޽R1BBskk{ZZRkkscZJc{kckcRc{kkZs{JBJksss{{B1)B):):11):1:::1J::B1B:1B1:)J1B11:1:B1R1BB::JZ11R)111:JRksk{Z{s{{kssc{{{ss{ssss{{s{c{csck{kkcZZkZkkkkckc{{έ{{kcs{{c{{JccksZ{k{cssޜsksťŵք΄Ō:!kc!J!{Rs!sss{){!BJZc!cR)1Jk{ZB1JRZsc1:{JB1skckkJ{cBZ1kB:BB1::JsŵRkR{JJJJZB)1JJs:B!B1:BB1B1)BJks:RB1Jc11::::B:Jkskkksŵ޵քssscε{kRB1c:BRR{Jksk{Rs{{{sRkZsksR{{{{kkkcZZsk{:{ssJck޽J:):):1)1)1B11))):!1)!B)BBBB:BB:B1B:J11:11J11):BB1:::)B11BB:1RskksŜskc{k{{Zkkss{{{cscZccssBkRskckZkkkkΌkssk{{sJRR11ŵs{c{Zk:)kZ{ֵ޽k朽ŜΌ{RRR!!1!{B:ŭsRJ:kskJ:JBJ1cRcB:sBJJ{s{cs{:BJsBR:BJRR::skZJBJkkB1BB::)RZ1cc!:1!B!1B::!B:)cc)ZcZ):1RR:B1BsskR{sŜޜޥ{RZ{sZRZsksB{{{ss{ބkZk{cZ1RkJkssks{JB{ZJBckք)1)1)):):B!1!1:)::)::J::1B)::JB1B!111J:B1J!:J!!:!::11)B:1J)R1:k{skZcccsZ{skks{{sk{k{k{kscs{c{ccZ{c{sksZsZc{ZcRRRJkνν{csscsssssZBRZssŔkkcckZccs΄))R))s{)scks:sΔޥ֥cZR{sc{sJ!)11Rs{cRJ!kBBscsZ{B1RJBBJ:J1JBZR:BZZckZ1ZBJ:J)):R!1)cR!)1!B11J!11):RJs{JZR:1:R){{{Rcť諒ssZΔ{cΔRs潜kΌJ{skkRcckZ{sk{skkJ1BJRZskksksZZksR:JsssRZ:B11!:J))11:):::1)B!B)1)1B):::!)11:B)1B)11!J!B!)B:R)1B))1)B)B1ZsJkcskRJssksk{c{cscssksc{{kckk{s{kk֥k{Zs{{kZckZkJcsRskZΌJ{{:Ŝs{ssssZZZcJJZZJkť))!!BB1!!1BB!)cc!ZkΌkcZsZZsc{sc{ZR)JZRkZcskZscRBBBJJRR)ZRs{sBRB:::JBB1)1R{::)B!1):BZsc::)1:B!11B1:k:{1:B!Z{{kBΥ޽ŵcZccssskcť֭kkc{{{{ss{{sck{{ZRZ{k{{sks֔ZJZc:JZBs::)B1:11:11B!)!):1J:BJ):!B)!B1::!B:):1)):R):1!:::11R!:1BJ!B1:11:Js{csε{s{{c{{sssZkkc{kccRZs{s{{{{kksksssޔ{ssZckk{sssk{ssk{{ZJsZs{{JJRJBRRRckŜ{R:)J{J11R!!!kZc{Z!J{kRk1ZcZ{c{kkZRcR1ZsJ:BckkBks{kZs{:1!:!))BkZZJ1::R1J:BZJ:J:J:)1:Jc:11)::1kkJJ1)B)1B):1!)Rk{ZBs!1:sZBkŔssssZ{ksk{k{{{Όs{ss{ŌkBcBRs{cksskRcZJckc111)11::B1BJ!B:1J1)B)11)1)B1:B11J)BB):):)1J1)1))::::B111!::1:::Z:)Jޭs{{k{ksssksRZsJkZsZ{skkkkssBss{{skkZssskk{kk{kc{{s{s{BZRZJRBJJcť{{{!!kZ))11JJ!1!{νRss֜sss{{歭ck11)R{ZkssRRZJBB:1:BBRR:ZJBBRZJB)1:BkZ)1:1Bc)))!)J1)1)BZRJ:1:!:B)11B{B:!)J1B{{sBRJscks{{kkZccs{:{ssk{ss{ťkkk{{Z{JJ:JZkRs{cZcssk{sJRsskc!:1)111))B)1::1)B!BB1J)JB1)B)1:1BJ)1J)1)::11J)1:::!11B)B)!B111:J)11R:)c{k{s{ccZ{ckέZ)ޜRkscs{kk{cJJk{ks{c{Zքsssssk{c{sssskތZ֜֜sRcZkZJRBZZJJcRss{ks1))Zs{1J1!)1Υ潔kZ{kJsskZ:{cJJ1Zk!)BBJ:R)RRckssZ{RcBBk))1)JcRZZ)::1:1BkRBJ1:!JJkB1)1::1:)ZcB)111B1c)11!11c{J:cRsΥ֥ΜkŵZccsޭZk{c{kcJ{s{cs{ccZ{s{RkZJsc{k{ZB{kkZ::))!11:::!):):kZ:BB!:)!B!B1)11)11):1::1B):):1)1B!B!1J)))1B)::11B!B:Ōc{kskksck1ZRcckk{{{{cscs{c{kkccskcZRsssck{s{sks{cs΄{{k::{{J{s{ssZJZBccRJsss{{k11k{B)!!1RJ{{k:R!)):!)R1ZB:Z)::k1)J)111:Rc1:{ZRcscZc{kkk1Zc)ccJBRcJRJ11:RJ1:Jc)BBZcZsRZc:))!:!BJ!1)!)))1){Z:11:B1B)1B!:1scsks{{Ō{ŵ{Z{s{ccRkc{sZޜ{k{kskZcskkcs{k{ssJ{RcccZRZΔ{ŜB11:J):)!1!:!1)s{B!J):B:B1BJ111B)!B:!:1B::11B)J!:B)))JB!1):)):)B1):)R{ckŭ)ksc{sskkkcscs{sksss{{Rk{k{skcssckkkc{ZZ{ssŔń{{s{{1Jkc{{֭ΥŵZsc{ΜZksc{c):BRR)!!R{ޭksZR)!)R:!!R!!R)B1R:RB1c:)R!:RBZks1:)JBBZkcscRkR{Z1RR1!!sRJZZRckc1JZBB1ZR:R{Zkk)s!cJccR)J)::1)11):)1BZB1BZ):J1:)1Js{{{c{k{{{ZJRkkskŵkRs{{k{ZRkﵔRk{k{Rc{ֽZZssRssJZZZZZc{J{Zcs:1sν{{1B!B1):1B1!11:BZ{J):::J:B):::J:B11)JB!:1:))1B:1R:1:)J1:))B11)!):!B11B)ΌkkckŽs{JcR1{ބkR{{{ssZsk{kkkkkssk{kss޽s{sk{sέc{sZ޽Ž޽ΌέΜΌs{RZ{{JskkcJBR)!!R:!):Z֜ތZc{!Bs1Z1)1k11B)BB1Rk!c:JRRJ:cR):)1::cskRkJJ!sJJccR){kkR)B{JRBR1JJ:BJssZs{Z:Z!)))!:JZJ))1:1:R1B):Jc!)!J1J!JZJc:cksk{kB:1BZZ{s{ŵŜŜ֔Rs{Zkkkcsssk{{sZs步scccBZkZk{{Z挄kRR1ZB1B{)1)!)1:!)B)ck1){kZJ)1))11:1B:B:B1ZRB11)J)1:B):)B:::)BRJ):!)B)1:)1)1)޽{{:)BR1k{kZkkZs{k{cscs{Zsk{{{Z{c{s{{RBZ:BB{cskcsscZJR{ń{sssŽs{{kc{{{!!!!!ssccss{{{ZJk!)ccc!Jks{kkB!!ZRJJ))RJ)RR!kB1)RJBR1cZ!:Rc:11))scZkcsRBkR:BJR{BB:JJJcZZkkRRR)J1:R{Z{sJZ:)):11))::cJR1)BB)R11::BkZBBJBJR1RRZsscksB)J1RZskk{ckccsssZk{ss{csBZkc{{ZscRRJk{sRZ):!RJcs1!:J!):1!BRZckBsB)B111BB:1:):1:::1)BB:B1:1::1Z))B):!!1)B1J:)B))B)::)1kRŽ::1skRskckkc{{kkkZ{s{k{cskckscsksRcRBkJZ{{kZ:RsckZ{kJkkkRkck{{ss{cŔk{{{BB:)B1:{s{c{k{sBRck):!Jc)BBkk:Jss)!!RRJB:1R{k!Z1sJ)!RRBB:Jk!:R{BJ:1!:cB1s1JksR{c:1RJs{cRBZBZRcsJcB{RkBk1!!1!!))B1))J:sZJ)1)1J::BB1BJ1c:B1:1s{RkRB)BJc{{ssބ{{{s札΄B{sskcsk{k{{sZŜ{kskR{JscRZcsRRJRRkkskckc:kcRZ:11)B:111ZsskssZR:BB!::):!BB)::1)1B11B!J:):111!B!J!B:!11!)!B1B11:!:1B:)cc{1k1::{kΜksckZ{kk{sR{Zk{Zss{c朽ŽkJskkR{cssZsssޥs{{k΄kkc{ks{Z)1JR:BJB))::11)))ZkkcckcR1R1RRJ潽kc!:B1)RB!1B!1JZ:B!:k:1Z:J11B1k:BR)c!BZRcZk1Z:c1c{ZB)RZZ:BkcZBZ1B:R{{)!cs1BRJ:1:1B)!1))11)):BJs:!11B1:1)1k!J:BJB:R:Jsssc{JR::kZ{{{Z{RRcskRRsBJRcRc{k{{֔sBBJRRBss{{ccZBkJJJJkRJRBk{{{Rck)B:!:B1)):Zs{B{ckB::::1:)B:1)BB11:)11)::11RB1:):1B):):BZJ)1:!)::BJ1JBR1JZRRJBB){kkc{{{{ZZ{k{sk{{sR{kcRkc{kεsRZkJZJ:cZ{ckckν{{ksZcsskZRR・J!c{1:B!B11cB)Bskskks!!:)J:1RkΌŭέ!!J)ZJ1B)J:cZc!:{ZR!:B:1!ckckRR1{Z!:cZBBk:sR!RJ1J!Z{c:JJJJZ:֔)R:Z)1Jc)1)!J1)1)11R)BB:JJ:J::1:B::JkJ!B:RBB:s{cRZB:RkkތsZŭŔޔckckRckJc{:JckcsΌskRcc::!1RRckkcJ{Zc1!::kZJRRk:RZ{Rcck{{J:111B:1){ZZ{k{kck1:)111BJZJJB:1:J1!::)B!1::)::1!B:J1:!:JB:))):JBRJRcRZJJZRskcRcks{k{skskc֭{Zs{JZR{cckRsc{Zk{kBJkkZc{ssskZΥ{k{ks{skskss{ΔR{k{!::J11)J!:)c{{Ό1Jc):11!cŽsc!B)1J!)!!BRJ{JBR1!!)Bk:1R{R:J:BRZcJBZ:)B!JZJ1ZR)R1BkJBcscsν)RcJ):sBJ{111!!:1!1)RBRJZsck:!1:!!):ZR1JB:RRkkZ{s!s{޵{{{ń޽Ŕ{s{{kcccskskksk{cńcRcR{{kc{RckRcR1RZJB::::c{scR{11:11JJBZcs{cs{s::1B):J1J)Z1:)B:)1)::!11:B!:c::11::B:RJBB!:1BJJRJBB:JRBcRRZZck{kRs{c{{s{ZZބs{cRkZ{Rsk{kR{scskcs{{{Jcccsk{ν朥skkޭk{k{sk{sc{!J:Zc!kRRZJk{{sss1k)RB!J֌֔s)B1!)1!!!!B))cR)J!!Z!!)1kZRBZB!):!!RBsc:1ZBR1kJBkRJBZs{kZBR:BBc1:ks:1Bk{k:B:))))B)JZssksBBZB1)B1kBB:):B)s{{ZZ{s{ޜ{{Z֔挵sss{{kkZsZk{{ccs{{Rkc))RR{{{Zkk攄ŽZ:RRkRk11)ZRBJ{k{{ccksk:11::1):ck{s޽R):B1B!1B:))ŽB!sRJ:J:):JB)BcJ::JB1Bc11!sk1):BsR{RJRRck޵sckkcRBkssRks{sŜ{Z{{scckZsscsc{{ks{Zcss{kB{k{cZksk֔{Z{skJ{kޥ{sc{{Z{{{sZ{kccJkk{cֵs1!JB1)cBcJ)1{kkB!1:)c{s{{νRZ:!:!)J1::JJ):))!:):ss{cRkB)1)BZZ)RR{)JRJk!BZ1BZJkJRRkJRR1JBJ:J{{s1R))):!1:Zkk):1BJBBJ!RZc:!BRkJ!s:::kRB)skkZZk{skcs潜{{ŭ{skkck:Z)cRcZJc{kcB{ΜތBJ1JRRRc{sΔΥsRkscZZ{JJJcZc{cZ:!11R!:c{s{{c::BZB:B1BΌ֭:::BBBB)J1JBZcBBs{kRBJZ!ޥskssccccsRcckkք{ssc{{s{{s{skkRkcs{Rk{kkskJkkscc{sZZs{ss{ks{{{{s{{BB)!1sRJ1!B1):BcBJ!!Rsc:RJkZsZk{s΄kc)!J{!1JB)B!:1J)R1BB!1RJ)kŔkc1!!:1R1J))ZRZRkRZJZ11)Z{!!ZB))JJJkZcZ1B11){kss!11!:!1)Zs{{R:1!1B111)1cRB:RZJkBZJJR{kskΔsBքskֽkkk{kc{{ssRk{kZ{ZkssBJΜkscBcssscc{Jck:cR)kZ{{sBJ):s޵R{B)֭c1ZZc{))!s:1J:J:B!){浽cޭ)Zkkk{sZZcksZ{ksk{{{c{{{kZ1{Zk{{kkkk{挔ccZZs{Rskccc{ccksZJkssc{skkk{RJ:)kskJsk!)B!:Rcc:)!s{{k޵ssŔRk)!!cZB!!J11!BJ!11)kZcss{ŵ!)1)!!:JsccZZ1BR!cZ!1kZ)cc!JR)ZscBRJBBZZ{k{c)!):)111:!11ksJ1B!B1:!J)cJ:)!R)Zcc:JZBJ{s޽{ŵ{ޔ朜skJc{Zckc{{csk{έRcc:ν޽ksBZkJ:J:k{cZRZckk{cs:Jk{ck{BJ::Bs֭{֭ZcccJR{ksc)J!Z!{!Js:RsュkkkskZRskޔ{cccZks{{{sksk{{{{֥skk{{ssscck{{csssskkcksZkccsRk{{ksssc{k{csRR1{{JkJ:)):!)kJRJ!Z{֭ťBJZZkJ!:!)R!)1RBJ:BBcZR{ck{ckB{skk{kJ):)))1Js11J:)::1J)RRsJc):1:JBBZ{sZkZZ!BBRkJ):B)Z))111):11!1c{Zc:!:!B:)B1J1:cZ!BJ111cJBZRBŌksZ{k浌΄sΥŜ{RskcZcRcksZs{sc:sc:)ZkR:BR֔{1ZcJ!BcJ1k{RRsck{Z{{cskcJZc潥{{cBRksc{cccR֜kŭ)!R:k!JֵΥkkk{ZΌ{Z{skZ{Zkk{sskcsckcks{{{kks1s{Zc{R{kc)JkcΔJ:)kZ:sssZsksc{k{kccccsZ{ZccsZcZ{{ckB))BZ{sZZ1J)!J1)cRkJ))Jksk{R{{!1):c{B)!)J!))ZRJ1{{sťssk{ksBBRcss1)))!)J)JJ1))JcJ)!:1s1:1c{1RJ))ckZ1kk{Jsk1)1JZ))cZJB):B)))11:Z):)!)):1!:kc1BB)1:Zk{{{{ccsֵ֔s{sޥkcs{sRkkRkkssZ:JJ11ZRBB1R1RJ:s:RJBBZkc{RJcc{{{{k{sRkscŭ{ssZ{kZsZssssss:BZ֌:{{kksńcs{ssssZZ{kkkZcccR{{Rcss{c{kkJcskBsZ{sνZRsB1JBskJ{kB1JŽs{k{skJcZZcskkZ{JZkcZ{)JB{J11:kk!{kcB:{k֜k{cs{:1BBJJ1RZ!!1B))!B)c1kJsks{:!)Jc!)1B:B:ZR)B))1{RBc)J:RJRksc{{{1BJBkcB)R)kJJ:B))))!:k{BR{B:1)!B)1:):B!:J:JZ1cZ{Δ攭挥{c{ﵽ޽sZ{ssZckccZc{cZJcZBBc{RBJZRc!1JBRB:Z愥BJcRJR{s{Ό{Όss{Rŭνk{Zs{s{s{kZscs{{s{k{:Δ挄sc{ks{skRcksk{ZZscskss{c{sskΜkRJs{kks{޽kRJJZZRZJkc{{RRJkZJ{ksRsssZck{kks{kkscscZckRsccksc{s{Zs{Zk1J:sZ::ckkZZkRZ1R:1JkRR!)!:)1J::1csck{ckkcsc{1!!1Bk!)!RRcBZ!:BJ)c:1J:BJZJR1sJBsZRB!!:!J{JJ1ZkB!!)!!)!B1JBsk:1:)1!):skJBB!::scsk{s{ޔcc{{בֿ{kkcckssRscZkkJ1)RJ{skZJkJ{sJksJk{朜k{{kcsk{{scksccckRsc{sRkkck{kccZsΌ:ŵ{s楌kk{{s{{{skskk{c{ZcZc{kk{sssckkc{ޔckks{{ZcJcc{Bc{:kkkJccJkscJsskcks{kJZRZJc{ss{{kscskkZk{kcZ{{kkkJZscsZZs:1):c!Z1Zsckcs!sŵ{!!:B1!JR:1!kRZB{sckB::BB:1ZssJ!)!)1c)!11ZR)1:c1)k1::R!!Zs!Z{sZZc{cB1J{Jc{BBBRJ1JBBcBJ11c{BcckBZRRZR)1)::::ZB:cB1B!J{בֿs֌sk{c:Jksέs{{sRcsccccsBssŵޭ{ZZ{{JkZs{ksΜΔskkckZ{kcsk{{sskZkkks{Zs{{ks{JZcks{scޜ{քkscs{Z{{kssZcJZkńcZcZskRssskscscZR{scskkc{{1Z{ZJ:ZkBBRkss{ssskkBBR)BkJcsksRkss{kck:{kB:ckc{sBJkkc{ZsBJ1:J:)Jsssskcccck:)s{:JBcBZ:1BB11)B11kscRZRJB:ZZBJBBRk!1!!!)R11!!skkc:J11)1):J:RRB:JJ{c{kZRB1BJ1!:)Z!)!1Bk11J{:B1!s{ZkRJB:BJB1{Z)1):BBZ:1ZR1!!c{JsŽkńss{֌֥ZcRcskZ{sssZcssńZ{sk{kZZZc!Z{kss{{kkRs{ńckkskssc{kssscckccZskkkscBsk{{ck{ssZsss{{{sŌkccskk{kssssccΜcRZcRs{c{ńk{c{cJJcskkkkRR{cJ:s{ZcJs{{sksccsZcBJBJRRRZkckkscskZkskssRckRR:Rkscck{c:Bk):1:ZZs{c)J{:!:RkkZ!!R1B))!R{J)B!J:)k1)J:RkJRJBRJ1)JsZ!!)!)!1B:)!BcZc!!J:!B!1))1J1Rc1Zsk{RkJJJJ:11:!Z!1::!Z!1B{J):!:kccR!B:):B11RZ:)c1R)JB!cB:RkB:1R{kέޜcsc{Jck{scsks{{s{cJRB:ssk{c{ks{{Zcs{ccZ{Zc{{sssskc{{{kkscskZcJ{{csք{skckckk{skk{{{{k{kkcsRkRZksskkckkssksJRskZ{ZsZscckkc{sZBJZc{cZcRccR{{JB){ssk{cRcRZJ:Z:ccJZZRZck{ss{JZssZccc{R{{ZcJ{cckRckZ:)::{kZ{ksJR1c:!1Z)1!scssBZsBZBB:Z)BssRcsJ1ZcJ)B)1:ssZ11:JBk)B!)!:RJR:)!JJ1k!!cc!)s{cccJBsc)1)1BRk:):)Z):B1:cB)!RB)ZZ)))J:kRB)1!1ksJ:1BJc{ŵ֌Ŕk{{{֔νks{Zk{sckckZkcBsJBc{s{{ksck{{kkkkc{{ss{s{Υ{ksskssskk{kk{kk{{cs{{scR{c{{cRkck{csscck{s{{skZsZ{{ssZ{sŌRRkZRBZZccRscZJ{R{skZss{{{ŌZkťcZJZsRkZcZs:sRkkJkZZks{{{֥csZcRkcs{RckkZkZs1Jskks{{))ZkZ)R)1BcR:!)::J1!R1R{BR111RB:1BZc{Zss1:k{kRZRJJ::JZcks))!!):))B!B1)ck1JJk{R{kJ)1RcZBBB::)Zc!:Z:RRJ:!:1B:::1)JB)R{BBBR{J1BsRRRksΜΜք{{Z{έc{sss{c{sssccRBBBR{sckRc{R{skZkJJΔ1:BZRJc{c{ssccckks{kkss֔Zs{kBssZ{{{{cZ{{Ōcksssk{ssZc{cksks{{k{ZZZskkcks{s{{ksZskZJZsZsZ{ZZBRZk{R1Zss{Rk{{RZcZcJZss{ZRkRZsZJZ:Z{cZk{ssssss歜Z:ckZccs{sskk1))RZ{cks)Bkc{k!1R11R)B11!!:!J!1J:B:R)J:!))!1!BB1Z!!1RRBZ1!JsksZZ1::JZZZ:k:B)!R)!1BBc:ZZ:RZkR))BcBJZ:BR:)c!:BJBBR::1):R1):Z{:1RZR)cBskB::ZRRRck{s{ss{sss{{歔Ŕ֔sc{cZRRJkkcccZcR!ZZsJkJk{{c{BBBJcZZRcckkZckJRccsk{kssk{kcsckck{cB{{{ckc{Υ{{kkcksk{ksc{{s{{Z{{{k{{sk{kk{sksccZcs{skZssssZ:BcńRRcc֌ZcZJJRcB{BZBk{:kRZZ{{{ss:ZJcRRZJJZccJ{Rsc{kZkZRZcc{ZZR{ZkJBRBckZZZccZsBs1)))kkkckc){k:c1!Z:ccB1:J1JJ1)JRRsR1)!)1:R!BJ:B!B)!RZsk1sZBZcR1Z!1:)!:!:BBRR!BsZ{RcJ{scRJRBRkck1J)1BB!)Bs)B1):1Z:BB:B)cBcZ)1B::{Rs:s1B{Zs{kcs{k{{k֥Žskŭ楜cJJcRJJkk{ZcskkJ:{JR{{RZRJZckcJc:kJ{{ZZZJZBckJck{{skkk{{kZk{{{k{{k{{kk{Rks{ք{{ks{sk{ks{ks{{{cskccc{k{k{csR{Δc{c{cc{kkkcsRckcJB)ZR{:{k{Rsssc1BZsZ:JsRcZZcskZc:kkRk1JRZsJRkscBcRJsckJZZcZcZckccRZcZRJccZZcckssRscskJ)1!{kkkcsR:skks:JBB:RBsk:):1!Rs{:)!11c{!!!B{Zccc!!!1!ZRJc{Z11BRB1!B)J!ZZs!cJB!)1JR:11JZc:!!RkR{B1)R:)111B11!:!JJ1J)J:JkJ::)1B{{{R{{RJkRZ愔{BJBckZ{s{cJ{ssޥ攄ksZkkkZRcJRRkkJ{cccckB:ZcZkZ:kZZ1Zk{kRsBBքc{{sZZ{{sskc{ckck{sc{skksk{{s{cZsk{{scks{{cksk{{sks{kcZs{Zs{k{{kkkkZBRZcZZZJ1))BR:RZkZ)JZ1ZZ{{c{sRZcZck{JcZcZZ{s:c{JBcRssBJcc:kcRJcZcJcck:)JsRc{ZcssckZss:cc{sscssRcckkJRkc:cc{csZ:sR)Z{c1)kRZR!)!BRc)!!!ZJ!!)R{{sc{J:::!!:!{sJB)1)):)R:!1BRRR{:)BRJcsccZ!)!):1:1:B:cJ1:B1B:):!BJ:1:11J:):J)ZR:ZJZBBk{ZJsBkcZRskksRZBBZ{{{cks{1RZk΄sZBBsck{ZcJ:cRcB{{cc{ZJZc{cksR:JckZcsss{skB{cZJZZkskkRc{cs{s{k{{skks{{Z{ksc{kc{{s{Ŕk{ss{R{{ks{scss{k{{s{sZss{csk{c{:RkJBRkR!:kskkR!JJZccR{scBcZ1{cksZc)cccZsZZksRZZ:RJk1JJZJ{JRkkscZRc)Bkk{RccskskckRsJZJRZR{RRRskcZ:kccBcskck:֌Z1skc):{J:)J:!)):1)!)!RRcsccZ!)))B!B1Zsk!!)!sJk{JZ)cBJcksJB)1!!:)!)Rc!1B1:ZB::!1J!B)))1!11BR)RZ1J1B:JcscRBcckZZssRZRks{BsRkkc{ZJ1:{{{ckssk:JJ{kcckB{kRBkRJZkZRZZR:kJ{skRkcscsc{{{{ZcsksksZccs{ckcc{Zsk{{csk{{ZZcsk{{{{s{Rs{R{s{k{kcsk{Zck{ZZ{kŔkkskcBkkB:{Zs{RR:RJZsRZ:kc){ccsJB:sckk{J:RRZ:{JB:Z{RRRJZkcRBJJ{RJcRkkkZcZJR:RJBRsZJskcZ{Bk:ZJRss{RJR!1)!)!{Zc))B)!)!B1kJcccRB:kccRsZccRZ)1cRB!RR)BJ!B)!RZ1)J{kJRcRZB:!11111!R:J:J!kcc))B)B1!1)1JBB)!J!:RRJRRB:RRsZRckckkcksŭ{sBRBB:R{sssc{c{sŌ{{sBkRBZJ{ZcskcJZZkcss1RkZ1Z:ZJcBJZZkRRkkccsk{s֌ֽRcss{scc{sssskkkss{{{sc{ckΌssRckcs{{{ssZkksZֵŭsJ{c{sc{ZssRcck֔RB֥JZckcJRBRRcZksBZ{{{RccJs:J{ZcRJBBRkJZZBkZ:J:cZcRJssRJBccskZskJZZZR:kZRBBcZc{ZRkZkcZJcZBcsZRZck!Rsc:sscc)!)!!)))cs{kckkcccZ{{JBR:!!:!)1ZJ!11:!Zc!k{ZckZ{ZRk)!:BBRJR)B)B{R:B!!JB!11)B)))ZR1BcBZ!R:RR{kJcRkRcccZc{s{ss{1JJB::J1kZ{kZBBZRkk:Z{BR1cRck{{{sZBs{ZBkZss{ZZRcZRJsc{kJcssscŜ{Z1RBBBcJJJBJZR:J:JRc{ccksss{{Zc{ckRs{ŭ{s{sks{sc{csks{sZckskRkkRkcsksZcRZ{csJJc)1RJss!ZZkcks1R{R{BZkBZkZkR11BBcRkcεZ)1:ks{sJcJ:kBBkRJ{sRkkJ{RsJZccRkkkZZZcZkZ{BJZRcJR{ZRZJRZckkBccZJ:BR))Jsc11)!!11)k{Z{ksscZR{ss{BB:!!))RJc)):B1!)R)1csJcc:kJBcZ)))cJB!1J!J1kBJRJJ!1!11B):)::)!R!J))c:JRRR:{JBRkR{ss{BRk楄{ksRJJ1:JJ1s{J:ck1:J:sskBJBcR:scBk{ks:cZ:kB1Jccc{s)cJ{JsJ1)cJJZJJcZc{k!:BB)!Z::)J)::)!)B!k::Zskksss{sZkccRcck{{cRZcsc{Όs{{ssťνcZ{kckskccccJZc1cBZRބ{sť{JR֥RRsc{ZRssk1R:J:11{J1RBB{RssRcBZ:))RJZZRkkZZcRskZJkcBZ)k{cZcZZJ1JRscZZJZBJZkR:ZRZJ11B1JJZJ!RZJ!)Js{R!::)!!!!!)J1B{ssJk{{k{sZsk!!:B!!JZcBB!)1):Z:RZZcc:sRRskk!1):)J1R1::BJ:Z)s:ckZ::!)11))1:1JR11)J1BJJ1BR:{s{k{ZBBZB:JRksB:RZB)::BJk:Z1)JJsk{J:1B{{{cB!Jc::ZkscRkkR{JZkRZR)JR1RskZsk{{{RRZBcZs1BRJ1!B!B)!J)1!B!)1!B)ZB:Bkcs{kskksZ{sssk{RJ{k{{sckŭ{cŽs{skk{kkJ{{cR{c֌Ōs{kJBc{):BB1ńRc:Z{{kZscRJ:):RZBZkRZ::)ssk!)JZZZc:ZcRcZZZsBZJRJRBRJcRBRJRkZZss:BckRJBJR1)cBZJ{)JBs{)B1RJ:J11!B11ckss{kBZ{1:cskk:sc{s!!!1JJRBR{k)1!!:RZ{Zs{kRZJ):!BB1::J)RRRRZRZsZ)1)1)::1B!):1JkBBRJsJkZkBkJ:R{ZsέŔscssRBBc11B1BBZJRRJJRRBRskk){{sZRBBB:JB!Zck{Bksֽs{ksBskZJRRŭRJRkRs{֭sRck1{ZZBRc1k!1)!::1:1J!1B)B):1)ZJZ{s{ތsk{{{c{skJZsksZssksk{Z{kŜsńssRkJRk!c:{c{ZckR޵Z{ckJJBkkc{R{R֭{sccRJsZcZccBkkcZ)!:R{ccRcZZZckkRBBZZZk1JRJcZBZ{BZR:sBZR1):RJRJBRJ)!cJ)1BRkBZR!1k:B)sk)!B1{ZkR)1!k)1))):11:J:)::!!:RR::B!!ZB1JBsBRkJ1)B)!k!1BR:cRJJs:BB:R1RJJ)Z)Rk)!))JRscRckJBsZZsZJcZsck{ss{R{{cJ!k11B:Zs{B1BJBZR1cJRkskRRkcZB)1:ZZZc:c{k{kkccsRkcJZssc{:ZZZZZ{cRJJJRJBBcBBZ)kZ1!::R11c!1:1)))11c::R{sބs{kskcss{RsssZZss{ZZZscsscksJRZJskRsRJRcŌ{scRkŔRB!)ksZkZks{kssk{BZZJ::RJkZZ:ks{{1ZZBR{c):ZZk!!Zkcskcc{{)cRRBRcZkZBRcJJRcZ:J:s!ZJ:BR11BZ{JZkB!cZckJJ))):Z)B:Bc:1RRB1):RZ!RJ!!)):BB:!BRsZRsJ):1)B!!!!:RcccZ{JJ:!:BB)1RJBcJ{:))RBRkkZB{JJJsZRskcckck{Jcck1:1c:BJBcsB1J:J1BJ)RBJssZskcskssJJ:RRJZRZ1ZJRk{ńcZZcZZRkJ:1RkR:ZkcsJs{{cR::RB:R)1R111)B!:J)):111:!1!1:cRcR{cc{{k{ckcc{֌ksksskckZkJckccR1JcJRJkZ:skc1:RZs)sΔcksŭŔ)!JZRR{cs{kZkkZJBsZJ{cJ:Jckk:!BcZRkJkRZZk{B::BZ{kB1)1c:JcsBRkB)!B{{kk1!11B1Rc1{c{Zk{)!BcZZsc:JkR{B!ZR!!)!!JBB::1k{kccsZc1RZB1Js1)))JRR1:ks:):Zc)1::)ZcZ:cccRkcZRc{{{Μ{kkccBJR:BZ1B1:JcBBR)J)1J!RRZcsskssRJ):ssssRs֥B{JZc{Z{{R1kkZRsΜsssckk{sJ{k:{kZks:BB:1):RJ!1R)1)::::)::)1kBBZ{{{k{s{{skkkkZޜkJks{kcssZc{ccZ{cZJZΔscZBZkc)J{J:1R:JckZkkcέք{ńֵΜ{BJ1cZR{ZsskkZc:ZkJ:sJBJ11BsccJ{kRcsZRkJk!JZsZ:cBkckc1BJ:cJBkB1RŜZs1ccZss{)!1J))BZ:{:{){ckcsJkRsc{sskc)Z!:!!))!)Z:!1RB1J{kJsZΔJscs{R!!!BBZsccZk!!!!1!:JZRc1JRR!!)!sc1Bk{::BkkcRBcJ{{sscs{{s{s{s{{sskZJ111s!B:s{BBBB1:JRBBB:ZRkk{kތJZscsckc1J:JRRZ::cRskRscRk{Z{k{BsBJZksZBRR:RJsZkc1ZJk1sJB{k{{c{ZZZckJkRRcRcks{c{csks{{s{RsZk{css{ksZ{kZkcJksccJc΄kRRJJcZZkBJ{kJs::sRBRc{֭s!ksk{sέ{kZskZZss{cRkJ)BsRccBZZRs{ZcZckcRR{cc)Z{RcJcJZsZZ1BkJ{:::ckccRRJRc{J!J:R1:Zc!ccJBR!!1)!!1):sBBkR{cRRRRsJ!1Bskkk11:c!)!:!):{{ZkRc{sZZR))1!:J::1)R:1ks1!!1:BcJ1RBZZB:JRc!RcB11s{{1{sJRZ{ckJkkZRZksssk{{J:JJ1!1k:RsBR)1BJc11BcZsJkc{{{{{kZc{:J:Z{kRJkZZR{sksRJsJRRZskcscRsZ{RZJJRcRB11)J):1Bks{{c:RZJR!)!:1BB::):!)ss{{cΔޥ業kޥkkZR{s{kZZkJBBR:ZkcsJ:kscŭZssccsJBB1Rs)k):k)cc{ZΔΌ潜ss{{kZsJkcsZBZ{RRJZZJR{kJskccJZZkRcs{k{{cZ{BZ{:)ZckZcscRRcRJscc{kkZBJJcsZR{BJckc)c{cJ:kRBsscs1!B!!Bs:BRsk{ckkJ)))1):!!B1B1cJ!B:)sskcZRB:ZZkkkkZRc!1!!!1:!:)1ks!)B!skc1BRJZc{sRZZsBRRskcRZkksZZ::1)!!Bs{kZ{sc1!R)B:1BZBB!B!BBJB1BJkJBJZRRsεքsksν{{{:BcRck{ZkRRcBZ{s{JZ!1{{kss{{RsRcZccsc:1BZ:Zk1:1{{ksRRRBZcs)1B11)1B)B1!)1Bk{{{ks{sZZkֽscRkJscskBkk{BsJ{cBs{1Z:{kΔRRcBJ1BBB)R{BkRR{R1潌sZc{Jcs{cJccRRcR:BJkckskRkcRBJZJksckZRZZksJR{ZRJZccZŭ:B1kB)ccc{:RsskR:c{J1ZBRk{1kRckRskB!)!):)ZRBksZZc{1RkB)B!B)11)1))!!BJ:Z)cZ:RcJZ)RR:R!R::{sZR)1)!:BJckZ1BBB!cZ:cBB):Z:kcRZRkc{{{s{c{Z:JBJR1:!)ss{::Bc::J!RR1B1::ss1B:B:J:J1B:BRJcRcŔkksc{kckJ{kkskRcRkZks{{ccsֵZRZk{JRRBZBcJRRRZB1)RkRBBcR{sJcsZR!1)RJR1R1)))JB{s{{{sťsk{{RRssJZRcRsZ{{kJZcscBJk{R{RBBZRcZRJs1k:J)J:cB1ckRR{ss{֭Zk!skkk{kcZRckBc{ZJ{cZJJB1cJRJkRRZRkkJkRcRRRs:kZZZcsBs{JsZZJBcZ{JB1RZkcJss)ssBkRkZ1BJ{csBJs:RZ):sRB!)!kZkZZ{kJkJ)!!!1J:JR)B!!)11RJRZc)::BRRJ::JJc:!)1!!)cRkkZ1B1BZZRBBJ)1JJcRkRks{ckZkJ11!!)!J{cc{RZRR!R{)1Zc:!:J1B1:R{s:)JB1Z:JRB{RsBZZkZk{{֌΄ckk޽JZsR{c{{kskkkZJZskc:skťs{sccJ1ZRkcRkJc1J)kZsJBk{{Jk{J1Z:!ZBB111!1):):skck{k{cscc{scZsskJ{Zkccks)):1csZ{cJB:B{{R1)B{ckkRkkZs:J1Jc1ZRRJcs{ŭckksZkscks{ZJsc)cckZkssBB:cRcsZZkcc:cccskBJkZkcZRRJ::Bcc::BJcZk::R:ZkZZksZRBBZkkk!J)ZBk!csZB1JR{kZk!1:!Z{R:))::1sk)!1!!:RB1BR:1:!!sRBZZJB::kJcZkJRZc!B):!)BZkcZZ:RJRJ:R:!!!::{{{!kJJJcc{JkJ!!JBZ!sc{Rcc)):1R):s1:1R1)J1Js:B):Z)JJ:Z{kZ{{Jc{k{{ŔsZs{ZZsZ楥JcskkcsRcsccZR{{{ckssJB:1JkRss:!:cZRJkZkZZscZZB:Z!B::11:1:1)B1:{{{c{c{sZRsc{sskk{Z{kc{c{ksc{cZ)R:1cZ:{1B:ckc!JBJJZ)JZBBJ!kkJZkBcZBssJR:B{νޭZBsk{csk{{kcRBZJ{cBB1Rk:cJBJRRRccJZJRZkR{Jk:BB{scRksR{k{ZRR::R)BckBRJRJJ)JcBJZscRckJ:RR:Z::))!!!ZsZs:sJJs{:R))))JkBRZ)!):!BZJ!cRZZsJBBZJcckcsks:!)R!)!RRkRR!JcZ:BBZB)111JcRkJ1:!B!!ZkkJ!B::Rkks{J:c)Z{BJs{sksB)::11:!Zssk!Bss{cscs1Bccs{kZZkBZ{ks{kcJRZ::RZkBRBBkkcJcZsksc{c{{ZRk{kŌŜ{{s{k{cssZkksRRsBRJ1:BRBJ1BB!ZR{{kkc{k{k{{{ck{{sRckkk{sscsZsk{{J1)1RcZ)JRkkJ::)1J1B1J)sJJ{!)1RRR{:ZJcRsB:kZ{kk{{Bc{ssJZRJZccZZZk{cRcRZR{BRJsZkRZJccRZRZJRs{1ksJJc)cJccZ!RRcckZRBkRJZkccJZZ)JRZZBJB!!JB:!!1:{kBZB{B:c::BJ!1!1J1ZkcR!1cRB1ZZkkBJ:JkZcR!!:!)J!sk!1Z!RB1:1!Z:BZ)B:BR:ZJkZ)kJB)RZ)1)Bcks!RcB1)BJ!:kcJkksc:ZkJ)BJ):)1cRs:BsksccR{cBckcscc{{Jk{{kJZc޽cR{k{ksBBc{RkcRZkRZcZkcέscRkss{kckk{{RccJ:BRZcRR::cRkcJ::::1B1!1!J)Jksk{Zck{{ssZk{s{ssRcZsJcRcs)BZskckB1B:BsRs{sk!:)11!)1skc1kks1JZ)RJJR1RcsscBJRJ1:!11B!Zc1ޭRksZZ1RkJkJkJcRJkccJ:ZJRsB{RZkZc{ZkJk:s{Zkcs{{cc{{s::JBcRssZRJcscJZBRRc:k1::JJc:RJ:!!Z1Z)!!R:RckcRsc)JB!Js!:RssZRk!!)sJ{JR)JZckc:BJJ1!R):B!!1cBsR1c!JR:kZJcJ:BZcJRZ!{JJ!11!1JZckcJcZ)J1Z{{{kksZJ1ZJZRc1:B)B))JZks)1kckkk{RBZRJccssZŌ1{k{sZZckBZJZRBksRJsŌZkJ{kkJcsccZsk{scckRJB1ZksZBZBRBZkZ:J:::B!)!1)!11kk{{Zkcsck{{kskksccc:Rc11J)Rs:kZޭޔk޵{1:ބcsZc{ssJBcc))JB!cZc)ZJ:ccR!B!1)11!kZZZ{ZZ1Rss!11JZ:ZckcJZZZccB{cB{RJRJcZ{kksZZs{kkkk{sJ)::::Z:BZkcBJBJkBRsJcBZBRJssJ::1))!:!BBBkZk){JB:BZ{1:cR)!:J::cRZR:Zscckc:R!!1!!!c!)1)!BBR)BcckZc!){RJBc:s{cRckk!))B)):1Z{c{{kkZ::Rs11RRk:RkB:):!R)1c{Z1:sRscc{c:{R1kksskΜRkkZck{cckJZssBkﵜkcZkZsk{s1ZZssJRscsZsZcsJ{J::cZJBZZcRcRRJ1B:1J)1:!!)!JB{{{{cZ{{sc{ssckR:BskkR)JJJBkZZc1{sֽ{JsBB{kscsckc{JR:1BkZ)ZcscZ::ccs)1!!:!)!!{kscksBJsc1scJc:s{skskkcRcJkZRBsZcZBJkscJkskZZscZBJ!1)::J1)BBcR:BZkRcJJkBRZ1scBk)!:)!!!:{sc{ZkB)JkcJ!kZ!)s{kss{{Z{JBkR{kkkk:))JB!)!))))1!kk!!B!!1J:JJccRRZJ!!:ccc)!!1!)1Zs!:1B1R)J))JRccRJk11ZkBk):kZcRB)B)1):s{c!JJssR{:RRsJsc{RRRsRZބkcsssR:Bc{sc{sk{scŌsBk{skckc{ńZBcJ{RZRJBJkkB:JRkRB:B)R):!!)))RJsZksk{{sk{k{ssRZcR:cRcZc{ZεkkBRZc{{JJ{{s{{Z1ZRRRRJZZsk{sJ)R)JRJs{sB!J!:Zc)!1))!)!)1sZRss{cccRsJ:{ZsZkJRcJJJRRsccJkR{ZJ{{{cRBR:cRR):kB1JRccccJZRJJRZRRk{:)!:{{{J))1):{R{ZB:{{s{kB)!cR)J:B!B:Z1!)1!))!:))k!1:JJ:1B:ck{kZ)!R!1Z)!!!:B!J)BZ))):!):)J1c!Jcks{BJJR)kJ{BJ!)))1BBsZskkZcRcc:{RRsssR)ZJc{Z{cŔss:Rs{ZJ{c{{kkckRJkskZsRkkkRck{sRccssk:R1{J:RR)ZZB:)::Z:111::)Bks{kJkks{cc{kZ)JRB1Z{c{ֽRscsޥsZkRJs::cB::cJk{ZJB:BRssJsZcZRk:k1J:cB:!:!!!)!ZRc{kBRZcZJkZ)csJkcJsckcc:ZcZZRR{Rck{{ssRssZc{kssckBZRJR{JRBskJZJJskcc1{ccBcBB))!:1:k){s:1!:{{cRBsJ:!::!Z)JZJBcss:11!:1c1111!)1::BB{B!B1Zckck:)!:):)11!!RR)!B{)!!)1B):::!J:!B:kZZ1BZs:c:ccBJ:!){sB:BB1ckkccR)kBkk::ZZkcJs{{cBkkޥŽ{RZ:1:1::):1Bcc{sJJ:kc{scsJkc{s{{:Rs{ksJR{ZZ11::ZR:11):JB)):!B1)Zcs{ΌkscskZks{cJsksskJŭscB朔ZZ)c1cR:JZs{s1RJcRc1RZBZ1B{{csJ!1s{!!!!!!)!sJBBZccRZRc)Zc1ZscJcZJcZkRcRJkJJZZk{k{Zcc{sJZRcsRsskc11RRRJk1k1cZJRJRRckJR:ZBR1!J!RsR{:{ZJJ1Jsskkck:1:!!!RRcss:J)){BB:JRZc!1:1!:J:)))1!!JZZ)BJBBsB!JksJ:!!!):BcZc)!!BBZck!!))1!BBkZRR:B:ZkZ){Z1:sZkBJZB)BckJ:BBZkZck!s{1kskRkZZcs:楄{skRcJZZkkksRcZsskkZkBc{kŵkk{kZkkcks{c{s{{{ZskZccssksks{sZccRRZRBZ:c{sŜ{{scRkkk{kss{kRksskc{c{:kJccBcBRkZc1!11BJZB)J:JZssk1:BR)!1))B1!1cssRkRccBRcBJ1ZJRssR{{cZcc:kRRkRJRkk{s{{ssRsRcRRc1Z){R!cJcJ{cc1RZRkckRZkkc{Z:s{JBc{Z:BRBBcsRkB:ZRZZJckk:!BkJ)1BZJ::)JB)J11!:Z!!!1)1ZcZB1BBRBJZ)B!1cskR)):JJcc)!!:1JR1:JBkk{{kkJZssJJcsRZ1)c!J)1::)11)R:RkckZ!ZZZkcsZ{Zskk{{{cZRZccsc{:JRRkkk{k{RJk{sscZk{sscssksZk{scskc{JkZkRBcZ{ckRZkcZJ:RZssssZcck{{skcJckJscŔsB:{!ZJRJ1:RBB:Z1ZBR:1ZZJRBJs!)Jks1):1!!JJkZkccJJZkRBk1cR{kRkc{R{c{cZJZk:RkcZZ֥skcZc:JZBBBJBB{kc:1BRZBcRJBBZJsZZ:cZkkcs!1ckRRcJJs{cZkc1!!)BJJc!BJJR:RJRZkkZ!:B!!Jcs{B1!BZ::JBB!)1)!{sBs)!)ZRR{11)):ZZ!)cBB11)R1)k:Zk:cJRZkR1BR)!1R1J!BJRR{ZsBBkRk{{{BRZsss{Ŕk{cs{{Rk{ksZZBBRs:sΥ{Z{Ŕֽs{ΥcckRcZsRsZcckcssZcRkZckkkk{k{JcRRs{kkccs:RRJZkZZcZcRRZBcR:s{Ōk{:Zs{{s:!)!):c)!c:JcksRcZcZR11))Rs!)!!)))!ZRZ{JJJsZJkRsZZZZ{ZcsZBRR{cJcBZZ{kkkcB{{RZkBR)cc!)J::1RsJBJJ)BBZ{JkŜc{cZkBRkk1c)!!RZZ:JJJZZ{scJJcsR1!:RBR:JJsZcc:ZJ1)BZcJ!:Z1JBBJZ:cZkks{R:1):ZckZ11Bks::1:kBRRR!!Z!1)J:1!{kskR):Z))ck:B!R1::ZZJB{{kkJZk{k1s{c{kZ{{ksZJsZsk{kJcBBBs{ΜkΌ{RJsksksZRc{kkJZRskR{sssccscskk{skkZZ{RssRJJBR)JRcs{{csZk:cBBZ:B{c{Zccscc{kkZkssZBJBJZcJ:Bk1{)::1):JcZZ:Bc:s:sBB!1)BkcRZRRsB:1RkcJ{RJcs:1kc{cR::1sRŌsc{sskŌΌscBJc:RcJ)B::)kR1B)11!:)Z{RZkBJk{{R:))!B!ssZcJJR{!!1)1):RB!JBJk{ckssc1:ZJRB!JBcsZsccZRRkck:)!B:kZk!B:1Zks1B!R1c1kkZ!))BRB)!1JBkcJ1c:)RkRBR1JB1)Js{sJ!c{{RZZcc)skckR{k{cBcBRJkRsZRZJs{ZJkcsc{scks{εs{s{{RsscZB{ks{ckZkkkskckksks{ť{k{ccJskB1sscssccscZc{kkR)Zc{ZkRcBRZŽέk{B):ZJRsRkB):c1!!!1ck)JBZ1!Jc1)1))1ksJkBRJ1RRc)ZBZ)BcR{ssZckZJR1JRJZk{k{ŜJkcZ)RZZRZR:!JB)J!!))!1!kss:!!!)k{c:1:sBB{k{s)kcZZsJ!1Jk{RJRJRBcZ{R)!!!ZB:!kR1RR1BZRsksckJ!!):BR{k):::BZB!RcB)k1JZ:!BJB)RJ)B:JJRssBcJ::):ZZ1BBJ1BRck)cZ{JJZRBZscsΜcB!c{{{k{{cksksc:ZR{kskB{sZ)cZZsk{{ZkccRs{sZssssk{cskc{{{kk{{{sss{{kssssZBcZ{k{Zk{kZcRskZsc{kksRc{RŌk1Zck:s:ck))::)Z)))!)!):RRRZBkR:)cBc:!1)1!)!{kZRB1c{ZJZcZ{s{kRBR{BZJBZBcRRcccc1JRcZRZJ{cR:R:1B1))RB)!BJc{{{B{11s{)ccJcJ:B:sZZJR1R:ssk{{{1!)))BZ!sRJcBZ{BZZ::))1!))BscRRkcJkJJJZJcBJJsc!)1s:B:!!:RcR)1B:Z)))cc))J1B:ZcksssBk1BB1):JcB1RZZcRc:BJ1J:cRBcZJZkB1sssZZ֜kZskJ{sssccZcs{sZRss{sssc{ZBRBk{csRkZ{:JRRk{{kk{s{s{skkscsskc{ZsZŵkskkkkk{RZ{kckBRsc{kc{kcs{ZRJZ1:B1:1ZcZBs:JZ{Bc1!1)11cBcRkJcRJBZZ!:!1!cZsZR:1RZJckR)BZkccBZJRccZsZ{c{Zńkk{JkRRkZZJŔR1R)B:JccscskcZcckkBZs1BJk1c:kZk{c1))11)1!!1sB!BZRB:ks{cc11)!!!B!B:ZJ:JJ)Z{{J:kJcJ)1:!))1J1kJ!Bck!BJR1J:cZ{1!)1!J1J!)J!)1BB)::!ZB!cBcZ:R:JJ1JJB1:B1BsZc{JZ{ZJJckkkB{{步֌csscRRRcccZs{ss{RkckBck1{BRBcRsk{{R1Zks{{{ssk{sksksss{{c{RkRckksJcJkZ!:JcJ{Jskc:JRJ:kR:B1B)BBZcJ1JJ:{cZZ!BckRkRZRRRRBBRJ))!!)!!!cRJBcBJBZJRŜkRcJJRZsRBJskckksŔk{JkJsscBskZRc)Rkc11Bk{cs{ZJsBRRJcZ:!JJR!1!Zsk{kBRc!1!Z!!!c)BsZ)B!:B:J:J1:J!!J!:R1cZkkJcBZ)1)1k:!!:B)BBBR{)ZRZ:!RZ{BBkZ!11JB:ZkRJ!::s!!kc1::R)J:R1)BBB):R:sskkkcBJcZJsֵ{ZRkcsssJJckJ{JcskZZ{cZs{{{kssksssR:kk{kk{s{s{{skkkssscsk{{kscc{kkRccZkkRBBssk{J1sń{scZB:JJZ1::!Z::1csJBBcRB{B1:R)JRBsBRkRB:JZJR!)!!kZRcZB:BZ:ZBBsB:JkJsRcBcZZsskkZ{ssk{JRRBRkcckJkZJ1JRR11)Z{kBkJBR:cc{)c)BR{Z1:ZB:BBkBs1!:ckJ!)J1)BsJZB1))kB:cRZ!!!BJ)B))1R!ZkkcZRB1ckRZ11!!!!RJJk!!)Bk!!Bc!!sR!Rc{sBJ{s{RR{ZkJ:kR{k{!B::ZkR{1Z):B!J1JRkZJcZRcZk{s{Zsŵ{{ŵcs{R{cZkBB{ckcc{ZŭZť{k{k{{cRZccskc{s{ss{{{{ZsRZssssc{{cc{sZksc{kskkZRRcJBZRBBB:B)sRssJ:kRB:Z:!!RJR))RJB:Z)1s)J!ssJkkR:Z:BB:!!kB)!1JJRZ:J:ZBkZBJcs:kZRZcksksZRZZRkk{s{ks{scZ:RRZRBsRZZJ{BRkJkckcZBB1ZcJZ):B)!!!RB!11J!J{k!1J:)1BB1RJ1RRJ{BJZRZ:Jk!!J1):B:kZkZcB:R1JZZ!)s{sk!)1):J!!):c!kcRck{cJ)JBJRZckZń{:!c)BJkJR1J:R)B)1BRZRsks{{sk{Δ{ss{{k{k{csZ:Jk{{JΥ步1BBֽŽcc{ZcssRccs{ssck{kkskcZZcscc{ssk{csZZckk:ZBB11)ssJcB:JBkcRJRsBsk1JRZB:cR!!)::J:)!JRkZR1!1!!!1JZ:BZccs)J1):RZ)B!)ZcJJRJRJRcckJB΄{ZZZJsRZcZBcRRsks{k{Rs{c{sJ)cJJJkcccBscZssZRRkkBBkR:JJRkc1cB):):R:1cskZ!!J1)!JB!)Jkc!!BJZcZR):11)scZsc{{J1BB)!JZkcZ))))B:))1)1Z1RRB:))JB11J1k1:BcRZkksB::):J1kRJB!):)B:BZk1{Bs{{ZŜ΄{sccRk:RckcքkcksRcsJZsJJRBsťRB步cZkZ{cc{kZkZckZs{sk{kckkRk{s{s{cscsRRcJJcJkZZkRZZcsR:!!:)1ckkccsZB:{k΄kBR:Z!B!J{R):1ZRB:!!:!B)1:ZRJRcZZc!B11B:ZZ))!)cc:cssJBJJJRkkcBcJJscZkcZ{JBkcJ{s{ZZRεcZZJJcccZZRRckccBJ:ks{BsRkkcZZ{c!:ZB1Z!:1cBRB)BsR{kB)JsJk!!)1R:!!!)BB1ZZJ!)B1)1{cc1B1ZZkZRR!)J!!)1!!:):!!1sBB!BkZ)Z::111):!ZZ::cBJBJck1):11B1B:sJJ)1:RJ{kkB{s{cRBscccZcsJﭔ{{s{JRBJ֜kε֌Z11)R!cZkss:JJkksRc{{sksZccJccckkk{{kkcs{{JRcRZccscc{JBJR:B:c1)):1ckk:11{c朽{:k:J)BRB:R!Bc:)ZssJ{k!)1)!):!):1ZRJZBscZcB1B):B!ZZ1!B!!)kccJckBcZBBsc:kcJcRcRsZs{ckZ{{{kks{{kc{ckssRRccBZZcR:ZksJkZRRRJkBRcRccsRRZZZJBB)JB!1)ZkJ1B!ssZ)!!Zc:BcJ1)cB!1!B!RRJ!1ZZRs)!::))!)1!Z:R!:!:kRJB:ZJ:)BZ!1)sBZRs΄c:J:RZ)):B1BR1cccscRsJR1cBB:!1BJB)!B!:!:!JsZ1c)RcRsRJZskJZckR{Ŝcks{kRJJc{c{skΜskkRZ1BZJ!!JcZkksBZ{kcsk{Zs{k{s{ZkRckZkRkkkcZscccZkJssZs)BRJBBB:!:)!)1)kZRZkk{ZRRkR:cJ:RB)J:ks:cJR)cZk{:)!!!!B!!BJZZsZJZ1!ZBRkkkcc!):!1{JJJk{BRRcRcsRckJcJBBcBskBZc:cZ{ZR{JkJkJkJZcsZRZZckkZRkkBRRccRJRRZRsk:JBR:BJZ!)B1BcR!csR1J:Jc:ZZ1RB1!1!)::!J:!JBRccZ)J1)1kJ:!!R)1!J:B1JZZ))c1)!BJ:ksR歭sB:!kkR:R1ZRRBBcJ{!JkZcJB!:)1)!1J1)s1J1BB:{)R)kRkkkk{ccsssB{ck{RsΔŜZ{{ssksksJcckss{sޥ)kcR11:JR:JscssksscZckk{cBc{s{sZRskckZkscZckcR{{{ZBR{ckksZRRBJBk:!J)B:)J1J!!!Bc΄ZZkBssބJ:1:BRsR1c)J!:{sJ{scs:{k1)!)!1J:)1:cccc{RcJ{BJޜ1!!)JJ{J1BJJJsccJRZBZZZJs1kBsJJRJZckk{k{s{scccZ{kZJJRZRJBBcR{kZ:1!1BRZsZZkJJ:)Bc{B!1BR:Rs::!JJJ1JZ)J!J))1:BBcJ)11ZJZkBRZ1!J)!!:B!)!ksZc{J1!))::!)1JJ{1B:BRJcBsR:cR1ck:JcR)1))!)1B1:c::!1B:kB1:!{JZRBckk{֥ssckcZ{{ΌscJcJkR{c{ZcΌ1!:BkJJR{c1RZ!:Z{JkcB{sZ{{{s{ss{RkZskkcRJccsZR1)1ZRR:J!1)BR1)1{Jc:Rccksޥssc1)BJJBJ):J1B{RckcscZc))!):)!!!!!)RRkckkJcJJ֌s:)):JkkZJRR!)BJBRccRJJR:RRJckckRZ{JskkkkkcckksscskRskJBJBRBJZRJJBRJB!:B1JBcc:BRR!1))!cB))kBBRRcc:B!R:RBB1:J!!ZJkR{Z):!RB1:!JBB!ZksRkBcZccB1BB1!!B)ccsZRRZZZZZBkk1ZJRJBBR:Jc{B{:1:!1:11B::ks:B)R)!JJ:1)cJRkZcJckcŵŵŵťZ1{ΌZZsscssccskkJ:1:Jc1J!BcBZZccRsksRkZkkss{kZ{cssRskc{ks{csc{kB1ZJBJB:BRBB{1Z{ccBRBZsc1Rc:Z{:)B:BkssB{J{֔{{BBBJsc1))))!1!J:RcZkZB)s֜{:!B!!:!{kRRJk1cJsJJJ::1JJc:sRsZRkJcRcRck{ksss{ZckRkkk{ssRc:!:):R1ZcRZRkZZRcB1:{Z:)1Jk!!1ZcJ):1)B))R)Z:c:JR:1:))B:R)1R11Rc:ZZZ:!!)!JRcBZkZRkJ:)))!!::JR:R:RZZscZJk:sZBBBR:ZZJ:!){{::1)1)RRR1BBRBc1)Z:!1!RR1Rs{{ZJZZRBcRŵ֭kccZsŔckkkskc{kssBcťsJ{{ZRk{{skJJc{ZZcs{RZsscskZJc{Zkckk{RB:sRBcBJJ1ZZ1:Js{ks{sZcRZscc{BZJ{kR:RkJJRcJ)k)Rk{BJ:RZ):!))):B!!cZccZcc)!J1!!R))!!skJJskkZcc{RJJ{::cJk1RcZcZJJc{ZJkscksJc{cscksc11RBZRBBBcZcZZZR):Rcsssk!c!Rkk)BRJJB1sB1:!!!)sR)BRJB!)1)RJ:)!!)::J{cJBRBsJcJ!:)::!!RZBBRR:):)Z{Z:1ZZ!ksZksJs{kBZ:1R:1:Rkcs!R1kRc::::!cB!1B1ZZc11)JcZsckcZs{ZRRRRBZ΄k{Rkk{R{{sccsk)JŭkcZZssc{{ZZZsscccZksZcsJck:J{{ZkBBZsŭJcJZ{BcckJJ{ZkJZRsk1RJZk޵RJskk{{Z{)cBB{Zssc)Zss1!1:cc:)1)11)):)RcZ!!11!))!1B!!:ZRcskkcRJBRZZkc:cJcRsc:cJJRZc{sck:JcΥJss{Zck{{kBJ:RJZJRBRkRcJJk:J1:BcZRZZJ!J)!!{R:s)JB)11::):Z::B:B1R1!BJR1R!)):R))!Z:J:cksBJR:!!R1)::RZZZ)1!:J)Jk{ZBRRcc):BZZcsZZskkcZskZZc!1)B:1:):BRccJRccc{cZcksscssZZscB{ΥsńkΜZ{kRRRRc!Z1)):JJBcRcRcZRJJZss{scZRZ{JJJk{RZZZkcks{JRZ{ޜZkJJcksZBZZ:RB:Rss::c{RZ:BBR:!c1ksJ{JkcńJZZ{{B))1!1!1)))ckZc!):)!)B!!BR!!!ZcJckksckJ{JRkcccss1RRRJBcBBZZJJR1RZc)BccŭBkc{k{ssZsZJR1ZcZ:BJ{BBRBBZZZ{BZJ)JZZ::1!k{!ZR{Z)!BJ:B)sB:::!::!!1J!ssc1B::1ZBJ1B1BZB1J11RZ:c11!!1BB:J1BJ!1R1RZJB1Js:RksssRJ)BZkZBkkkksBB!!1!1B!B1ZJJZJ:{RZcJťsZRk{s֭札kJJ:Z1Z{sJJB:J:Rck::Z{ZJJsZk{kZkk{RJcZZZZ{{JZ{c{RcssZcc1sscZ{cZkkZBRRksZBcZkRBsR1R{Bck{ZJ11ccZJ{kBZBR1Z1!R{BBZJZkccJkZ{1:֔ZJB!!1!))!B!:k{kR!B!)1!1))RΔZJRZkcckJcccZZk{R:cZcR)JBJ::BBZ:s1Z:ZcZc{{{{skZJBcBBJRBJ:BkZ{ZJcssZc{kcRssRRZJsZ)1Rc1:!ZRJZ:):!:!::)1!B:cc{kBR))B!)B1:11))1RZB:R!B1::::))Jkk:1Z!)!1B::RZB!):JB{ck{sJJJ:sscsRcssZs:):!!J!))!:RBRJZcsZ!)cskc{kkcέsJJ:RJJJΥk{BZc{k{cJ)R{kZsńsckss{{{cRJcZckcB{ckBZZcsJRkBRcZkck{R:kkcBZck{kJkZc!Rk{ZZ{ZBkZcBcRZZZZZkkRZJcZ1Z:c)s)JB)J:{J11)1!11!B)!R!1)!:!)R:BZJZ1JckskcRscJZccZ{kZRc{kks{ZsBJZ{c{k{kcZkZcBBc:JJJBZZcZ{ZBRRJRZZRR:J1ZJ))sZcJZc:1)!B)1B):B))RcRk1)11!)!))BkBJ{kk{BkR!B)1BcBccB!11cZkZR:1J)kcZcRcJ:1BZcskRRZ!!)1!)ZJJ:B:Rcck{ŜJ))ss):kR{{Ŝ{{J:R֜B:JRRBBέΔc{ZcJ:Z{ccR{JkkRcJZccZkckcRkssckcskkcZBkZsc{scR:JBRckZcZZkRRkRRBZ{Z::ΥJ:1{{!ZεŜ{!RRJ{s:Zk{B:k{RZ!!))11ckZsJ!)!1!!!!:!!!!!B!!)!:!!):!Z)Rkck{1J:sZkZZRc{kkZZ1):BJZZcRcRkcR1cRRRkBcck{RkkRZB:)ZJBJJR1ZsZcckcJBJcsRBkZB)!!ZB!!:111R::R1JZkJB!!:BZ!:ZZ:!1):!:sRkJssksJ):1J:)R1BZBB1RckJ:)JJR)!1B:ZZZscBR)BsckRc1)!!)!)Rc)!)J))!RkZZ::RRBJBB{:Jc1Z{{{RR1!:J:B1kJB޽ťsssZcZk:JZJ)s:BZ1BkZZJZksJZk{浔Ōs{kkkkkZR{ccsB1RJZcZkZkZ{{Zck:B{cR){֭cεk{BB)Z1c:RZBZ:JBRsc11)!)k!)J))ks:)R!!))!!!J!!1:1!!J)1::!!)1:::skR{{kZscZB{RBZ{ZcZkZsZJJBJ1RkZRZcsc{RkRccZJZRccZk{RBJRJsR:ZRB:{:1JZckcJZskkBcJ:sZcRJRc1)RZ)!Z{R1J:R1!!ZkJJ1JRsk:1Z:Z1)1JJ:1sRRB{kZsk))JB)B1sscRRJ:JB!!B!1)ccc::BB)R!B!1:R)))R::ZZkRRR{scRRcskRJB1!cR)J!:!Jc:1!BccR{RZ1s1εcZJ{ťBBRR{RRkkZ1JJ{ccssťRJ1ZB:{ΌckZJR{s{Όc{JJsť{cJ{scZsZsޥ{k{sk{kcckcc{{{k{R:1c1:BRssk{{{sZkJZ{RZ!ccZkֽ{:sc:){c1JZ{1kJcc)1ZR1B1!!ZB)cR!:B::)):J)!)B:1!11:!))))!1){JcRRc{k{Jk:B{ZRB)RBZRR:BZJ:RkcRJkZZBZZRJ::::JZsJkssRRZJ)B֜cRcs)B:::JkZZsJJckR1ZJ)!sBBRk!!!s:!):JJJ)1JBk:1:1!!:Zk{cZ!Rc)Zsc1!:)):BRBR!!!:)B11!skZZRJR:B1:!1!JJZJkksB1:R:BJ{sZsZ:!B!:1:BBB1B!JJ:B)cBZZBc{Z1ckJRBΌJsRcRZRss)Zֵ{B:Bc)s֥έckZZRcc{Zkckk:s΄ZR{{{{kRckŽcsk{JkkkZ:1)):{sksBZJ:cJJkkRscsZΥ{Žks!RJkc1B):ZRk{1!):!:JJ!J:1޵RR1)1!J!!:1)!B!!J:))!:JB!1!!!!!ccJZks{kk{cskBkR:BRB:BBBJBRJJkcJkZJRBB:1ZBRJ:BJJB:ckZkJRBJRJ1B{c!ZR{{cR:)ZcJc{JJRZJ1):sks!1!!RZB!B1BJJ::)R:!!Bc1!11ZcRR:sR:!)Z!!B!:!!!c)11!RRB)!:1!!1{kkccJkRcRZ11B:::)B))!::B1JJ:kZJBJB)!11!!BR1JB:BR11:JZZJRkZJsskscs{RZkkBcJccckRZ:Jc:cZZZkZksRJ11B:RkZ1kc{Z:JZŔ{{ZcޭZckskcRskkRZs:1B:JJRRkssR{ss{RcBBJ1!Zkc{c{RsZkkZcsR:)sssJsks1!:RJZRsޭ)11!)R!!!!1k1!:Z!1!!:!!1!1{sZJBRcZ):JZRB:ccZZRJZZBRRJJZ:ZkcskscRkJBZBJRRBJcB:B:k{BRZscJ::B{{Jc{ZcZZ1RRRJZc{ZZJBkBZsk{{!!)!1:B:):BBc!B1)k:::J:B!1sJccR1)1!1:Rc)RBB)!B!:Z{JR:RsZccZBsRRcR1J1J):J)::JRJB:)R1R:RJBBJ!!!!)R!:BJRJB:{cRkscsZkskBkkk{ck:{BB:11ZZsBZ)JsJJJJkRs{{ccsk{{ZJJJ)cZks{s{Z{JZkZZs{ZZBk{kcZskscZkJRc{cRckscJR:RsJRs{sskZss{Jkﭜ{s)!:1{kZ:1s{s:Zss{:::B1::{cBޭk)!!!s)!)!:)!):J)!:)11))!!!):!1B!:!))!kBJJsRsJRBRcc{JccZBcZ)ZRZcJJZccRc:J:ZccBZRJR:JZ:B1BsJBsRcZZRks{{Rss{JkZZZ{sZRB:B΄B)RZJB!)JZJZR:ZB1:sJ!:RR:BcBJBRksscskZRB!):)1RZ!c1BJ!B!1B)11:J:::)ZRR)1!BZcJsJkkRRc1:::Bkk!1)Z!B11!!!RBJ)!)!1J))B:RJsB:)!B:1!1kZccsZsZcc{kcB1R{{Js{kJ:kBckkkcJBJJ:cRZc1sBsŌ֔s{csRZZkkkZ{RcssccRJZsJ:cZRRkcck{Zssss{{ZZRRRBBJ޵ޥ{ZsŜ!ZRJcsRcZJZ!1!:!)Z・B1!1!J!!)))1!:1)JR:1))1::!!!)!111:))RZZJ:Jk111Zkk{cJJJ:{ZscZcc:cZcJRZJJR:ZBJBJcRBJRRJRRcZZJ:!:ZRckksZ)sc{k{cZcJJscBR1JRc!)1!kJs)Js))kJ))!J!1{c!B:BJ{RB:ckRkBcskscc:1JZcB1ckRsB1:!:!!)BBZ:1B)c!J1))::1!BccZ:kkcBR:ZJ!!J:!11:::Jc{RBB1!!::)c1))kBR!:!JZJB1B{csR:Rcsޔ{ckZcΜsZ1JccccZsss{cZckBBZk{k潌ks{{Z!JJBkZZŜŽsscs{ckJB)RťkkZsJc1:RZkRBJΌcν{BZ{:{Js{ks{:{!):!:)kŵń!1)!1)!1!)J!)JBR1B:!)!kJ!1B1R!!!!!ZckJZ:ZZk{Zccc֜{B:JRckcZZZcRZZBcBcBkBB1:RRZ1:BBB:JZkJZZBZB1JkJJZ{{{kRsJcZkcZcRZsksBRR::1J!BsZkRR)RJBR1B11::ZBBJRJB!kŭBJk:1ZsJZJRJkZ)!RB1)1BBZ1!)1!)!s:RRJBRJJ)kZ1:sZZZ!BR:!))111BJ:cR:c:R!!!:J:!!ZJR1BJBsk:JZc{{{kkkB1):ZRRkkŭsŜ{ZBcťB)BkZkRs{ZέkksZkkRc֥Rcs{cckZJs{cs{֥{cεcZ{ֽޭ1B:ZRkc{skckބcR֥s{1浜RJZ:!1JccR!BZ1)::)BJ):):1Ό))))1BJ!)!11))))Z!::)!:11R:1RB1!!!J)B!)ZZR:RZsksRc{kZތJBBRRkRRZJRcBkZkBRZ:R:RR:kZZcBJJBJ1cckkZ:)J{Zcc{{{{Rs{cZscZskBJscR1c:ZZ)!Bkkk!BZRRJR:Z)B::!:BZJJR:!c:B::RsJ:JkB1kc:RJR!:B1B:!))!B1kJRJ::1:BkRcRcccsk:cJJ:):::BJZR::1JJ::cB11B)))kJZcJc{{scRR:1)Bs!)!):cZsBs朥cRŭRJs{kksR:RZ{RsRkZJcskRsńcskcks1JRRkskk{cs{Μ{ZZBֵc{kRZRJk:R{sRcֵ{s{ssck:)B!sssZ{k)!)1:J111)!Zs):)B:1)::!11!!11cZ:)1)1BJs)))::BsBJskZRcRcZ{ksssk:c:BJZZJkBkRJ{sZccZJBRJcZ:R:JJRRJcR{ZZZcޥ{kkk֌{RsssZsZRBBZRcJ:Bc:Z11k:kZ::B1:J!Jk1{{s1:R{ZRs1:BRZs{Jk{1)11))!!:J:ZRJcJ1:1cRBJ11RcsRcBsBZZRJZRRZZZJRJskRZJR:!k:)J))!skkccs{kRJJZkcB)ZJJ)kJcZńc{kJ{R){sŌBJkZ{ZZ{挜sΌ{{sRccRkRޭΥsZ:R:RRskŭsk{k::{νZ::JRRRskZJRZcRsscsccΌŌsޔ{{)Jc{{cJRcsk{kscsRB:!1!R!:1)B)!1))B!)!):!!B)B)111)111:RB!BB)1JR)!!)!B!:1)!)kZcZ{JccZB{{csRBJBBRkZZcJJckscskRccJZZs1:RBZZZZRZksckcks{cssBRc{{ZZJkZcssccRsscBRJRRc)csZ:!ccRB)B1BZ{R:cJBkc1c{c!J::BR{sB1sk)cRJcRk!B:)!!!1)R!cssZkJcBcJ:BRZ1:Js{RBZ{kk{sZccs{kRZkZskksR1:BB!B1!:!!!ckcJ{sccJk{sZR::)!1Rks)!)RR:Zs{ΥRRccR!kRZssJs{Jsss{BZZ)RsZkRBJB)BZc{Zk1RZckkkRޜcsskZBkRRBRBJJŌRsﭔJ1!1BR11::1csscZkcRskJ1J11:R)1!J{sBJZJ!1:!)))R)Jc)!11:)Z11)!!))kkBRkscJRk{BBB11J{kckccRcZkZZkkRRcZ{Z:BZBRcRJZssRJ{{RsksJ!RcckZRZ!cZ{ssZcs:RZRs!!R!)BZBcRc:)!RsZRc:c:!RcB!RRsJ:!BBBBc1:RRs)11!JsJZ{1sJ{ZB!1!!!:)1!!Z{RRBJBBcsscZkJkZ{:s{{Js{kZcRZ{RccZckssRZ:!1):1:!B)1){:s{{{JRBBBkRB))ssZ!11BRJck:Zksss{RRJsRkkkRRcZcZsJBZksZsZcssRc֥{sscs֜ssJ1!B:cZRJsJΌνZBRν{ŭc1:BZ:ckkcZJkBJsZk{{{Zc{kRRs{sR{ŽcŜ{R潽JRR)έckssBZkskJB{sRkskcJsRZRRZRBBc:JBRJJBBJkk{Zs{{ck{skBccRsBRckcsRJBJ){{ZBJZ:)s{!BcZ:s1k!:1::):J1:)RZkR1!1JBJ!J::J1))!:Z{{c1{csJZ)!!!!JRRJBRBBRk{ssZsss:!:JJZRZkksZs{JZksR1!)!1111!!k{ksJJ{sZR!!R:RJJBkRJkJRR:RRRkcks{ťkkZZc{RֵsΥZ:RBs{k1{sBs{sZcRk:1B:{sŵֵέ浽c1!B:1RJ:RZBνJks֭cZŽs{{csckkRckRBBZZRZcss{kksss{{{kZ1{Bcsck{{{k{kc{{!csRccccckZRkZZJckc{ZkRBk{::RB)Bk{{ZZscZRBckcJZBcRJJ:BBBZkksckcR{cJ{RcsksZJBsZJRk1cRkBJZJBRkk)!J{BJZZ)!JRJ:ZBB!c1)BZJsR{sZB)kB!1B1:B:B:cc!)!BZc{RZZZ{sJ11!))cZRkscJck{c1B1Bcc{ZkkcsZs{JJcB!!!)B!!ckRkZZR!)c:JBksRcksZ1!!J!!JBRJBZZB)ssRZkBRZR1ssޭsc{kc{Z{Z{Rc{c{{RνZJZc:)RkcckέZ1)Rc{{{{skŜJccJ:1)ޜ֜ŵk:ZZ{{JZ{kskc{{csZBJJBccJccZsskc{ZskZ{{ssRccZRssk{{{cc!sscZJcRcZZsccRkJ{ZRsZZBJ)Zk:11BkkskZJ:JRRZRJZZsZJ1BZJRssc{sckckR:kcZssZ:JRkkcscZBZkckckk{:JJR:!ZJ)!R)JB:cZcJ1B:BJBcJZ))Z))RBRZ:ZJZR!:R:ZckB:RZ{cB:!1:1)!1R:s{kRk{s:)!!ZJ!1ZRkkkRBBJB:c:1!)RccBcJ!!Bc)!!1:B)11:1J11JJcJJR:J)kZJcBB1Bk{sssk{c{RJsJccZcR{csk{Rcťέ{ZRZRR{ŵRc:{sŽŽ{ZkZ΄֔{:J){ZR֭ΜΔsJcB!Jk:1)BZ{{cc{Jk{s{Z{ZsRs{ZRZ:ckcssRJBRJ1B:JZkkkss{{{sŜ)k{kk{kskckZZZZZkccsskkJkkJRRZs{skcc1cJJsZZJc{sscZBJBJ{{J{cJJ1BZkZkskkcRZkkJcRJRcsZJRRc:Jc11cskB!ZJJZZBkkkc):Zck1sZ)R!:JBJBBRRZJ)ksR)R{{J!!!ckBR{ZR)J!1:))1kZ::k1:!!)))):Z!)J::R{ZcJJZ1B!1:)!!1R!ZZRZ1BBRJ:1):))!!cBBJBBJkRJ:kR1B:c!R:ZssccsRkk{RcRBZZRRŔc{:1BŽŔsJJ:c֥ŜkΌ{Ŝk{ބޜֵZcΥέΌc:JsB!:R{sńsJsεZ{J{ckccZckkckJJZc{csZkZ))BkJJkJZcskks{{B){ss{cRZc{sckZscJk{c{ZkcRJJZssBsskRJkZcR{ssJkJZskkB1RZZJJR)kJckcZ{kccs{RkZ{cccsBkZcZZZ:J1B)JJk!Bk!{c!J1cB:):B){!J{kJJ1BR!Z::JBBJ1:){ckc!{Rc)sR:1:!:)Z)R)):B!::B)1sJ!ZRkR):J))BB::JJ!RkZ:JRJR!!!1!)1:BBJ:B):BZ)sB11cRsskkk:ccssssccRcZkkJJs{:s:Bkkcs{ń{c1ks{s浭Ŝޥ{s{{kcJνZs:Bcŭ{kccsJcsc1kZsֽc{kR1kkZ{{{kkRcskk{{scJcRJkBRB{s{R{{{s΄JssBc{kZZk{ZZkRZccZsRZccRZJRkkRJ{{cJcscRZsscsZkkccJJ:RssscBkc{{sZkccRJck:BkccBZRBZRRZ1JZZc)!JRB:ZZ11B1ZBccBJZZBBBZ)RBR:B::1B1)RskZk{1{Zk1JJZcc)))!)BJB)1!11:!))1!1)Rk1B):ZB1::!!)!1!)!RR1Zc:1)ZR!))):!!)J:J):k)!ZJZBcJ{{))):BkZckZ{ksJBJZRRZccZccscksk{k{sRZk{{sk{Rkk{Zc{ks{ޥk֔ΌޜR:)J!BcZscε{kc֭Bc:sR{kk!sZZ{{ZsR{Zs{kJJJkskcckRcc{Z:RBZ:kksZssc{k{ks{sks{RckZBccZRRZkk{{JZcs:skRcskZ:R:cRkcskksckBZJRBRZZkkRZ11)RRRkZBkcc{JZJJkJZ{:JksJJZJBJR!JJRJZRZZB:11B::ckkkckRBBZJBZcZBR:)R{:c!!cRJB!:ZsksRk:):!!:cBJ1R1:):)!))Z!1)::)!!1BJ!!!!!!)1BRsBZc!))!:)!J{ZcJJJJB)1BkscJk!BBJJ1JsBJJBkRJRBRJZJ1csJZJRJ{{{sscs{{cc{Rsc{Z!)1RBcZ浥Z޵Ž!!11J:1B)RkkZ{:RksJZkJ{{Bュքk:JB!!R1kZ)RB:B!cJ{ccs{sksJkcccJRZZR{kssZ{JBZBccZJcskZ{Z{ksks{s{Zńc{kkZsc{Jks1{BZޭRkJkRsR::1BRZBJRcZJsssss{kccsZccZRZJZBs):ZcJJJkcJJBJZJ1{cZcBJkZRRJ:ckJB!!BJcJBJJJZZZZRRZcJ{k::)::)ccckJc:kccsBB1:kcZcccZBJ{csc)!BJ)k1):!!1)1:11!:!BBR!)1!:1)ZR:J)B!BZJcJZJRJZRJ1RZ!BR)1!JR!RB1Rc1BZs1cRRR1{BZJR)!)1BJk{sRkRcZskkkZskkZ{ksRcRJ:ZkBcsc{RŽŭJcc!!BB)Z):RskRZZ{BJR:Z::11kBJkֵRRZZJskZZcscJ:cJRRZRk{k{kc{{sZccZscksssZZJ:ZZJ1JRBZsksk{s:Zss{sc{{sscc{sckc{sssRccRZcsZZRBccJsccs{c{RskRRBJZRRcJZ)sRZJB{{JcssJkkZcZ{kZZcR{JskcRRBc1BcksRJZB{1JRZBss{k{!!!!BBZZJRBR!JJ{BRJ:RBsk!1kZZJ)1:::::sBRBB{{kZ1!!ZsJJBs1ZZR)s)!1)!:!:):J!!BZ!))BJR)ZR:):B!!)11c11JBcRcZBZZBRc:cJJJcc!:!cεkssZBc:1kZcJRZB)!:)1Rsc{sBΥ{{sccZJkkZkZccRZkRk{cΔB)!ks{k:)R!kkRJ)B):RJJJc:{1s:{cZkRR:Z{sRBsskcs{J)J!:ZkssRsZkkkscZ{ZkJcs{cJkc:BcsBcZ{sZ{cccZZZR{{kZJssJ:1kkcsJZBkskBR{ŌkZkJ1:ZBRkZRB1ZBZJJJR{{sskkkRZkZJJ)JcJccR1kBZZckR1:ZJZcZRZcRRZ)))!!))JJcZkZZJBBZccRR1c{c!JBRZRRJZRRRkBBJB1:BB:{sB1{{ksB:B:k:1BJZcB!:cc::!!1)1:)!)BB:!B::)1BJ:cBB:!)J1)B)sscBBJBckcBJcRR:cBcJBs!:ZJR!):JZ1JZ:BcskRcsB1)JZkBBRs{ŭck{kkcc{{ZccZBJsRB:kkssssZc{Zk{{c{Zs֥{ZsRB!!!):1JZ:{Z)1!)1JRsJRZBZkcZkc{sRs{Jss{ZsssZRscsR{BJZccZ:{kZc:RRcR{ks{ޜŔ{{{{kss1:BZs{{{ckksssRRJ:BZ{JcR{Rc!kZRJRcJRZJB:k:ccJ{k{{:)):1)s{kc1Z1{RJZBRcsR)JZ{kRsJ1ZJ{ZBZc:B!!1kRkcBcR!:k:Zc1:)11sB1!JBJ)ccZJBR)):1:Z1R{c):1BZ::B:Rc{Z!)BR:c!1:)!1)!)1R)R:JJ1:B1J:cRccJRB)!1)111cckRsc:1B:sRcZcccZcJcJ1!ZZZ1s1JZB::111B!)ckJ:Z1:!1sk1)Z{sk歭RRBsckkRZkkRckcZRsRRZkZksckRcJkkJZJ{Zckk!BΥsZ1))):!)!1!:ZcsZkŜJcckR1JssJk1!Zkc{cZ{{sBZkZZccJZcssRJcJ{J{ss{{{{ksZcJ!B:cZ{kcRc{ZZZkJcc):ZckscZ{kskcZJRsR{:BZRBJ1J1R:cB)!RZ{{{JJRRcckkk1RRk{scZ:ccBB1Bc:BZRsRJ1BR1:!)cRRJRkB1:cBJRJ):R1BZZRB):1:1!:JJ{ssB)J1J!BcRRB:JZcBsJ1!1Z!:BJB!)!111:RR{ZRkkscRcRZZ{kkJ:!:c:J:!B!Bckccs{kcZ)!)!s{ZcRJ1!c)JkscJR1)):ZRsB::c{{sc޽s{kΜkssZkccckRkRk{ccRsJB{RssŜk{JZZ޽֭攽Z!)!!)!:!1):JJ!::RZR{ZJsksBc:!ZJZk{ksRJsccR:cBckkJR)B:sscZcs{k攌{scB)Bs{ksޔcsRcscsRkR:RRRsZkRk{BBkk)JRRBBBZcZkBkZ{{cksBcRBRRcsJRkRcRRccBsscccBsJ!)ZZsk){ZB1ZBBZBsZZZ!!!)!JR1RZZR1:RB:B11!1:RJZkJJ1B)JJB1J1k:JcB{J11RRJ)J:c!cR!JsR{{csRcZk11ZZck:{RR{kcBRRBJ)!)1J)){cJB1BZJBR!!!!!)ZcJc֌Z{:::k{s{{RJRRBBkZ{cRRBRk{{ss{s{JZk{cckksBB{ZJBkZJc{c{Zcscc{kJR{{scJJ!:ckBsk))1111!!11):):!1{!{RskkssRZ1JssBBRskJRRR{csRccJZZR{ss{J{Zs{s{c{ksk{Z1)RZ֜skkk{ss::1)ckcRJZkRcZZRksss{RccskkJBZBJBcRZ1B:RJ:ZZBB1!JRkcccksskcJZ{ksRZcZRcZcJ:ZB!B:!k)JRZcJsR{R)B1)1BccskJRR)):J!1R11Z1R{k)RkB)ZsZJc{sB:)RJc:c:kccZZJRscsRZRRcRZRRZ{k{skcRZ1!1J1:RZZs)1sZ:RRJBJ1!BBB)!JZkJB!R֔Δ:!!)s)ZZRJRc:Z)scRJBkc{Μ{ss{kZR{s:R{ZB{Zc{{sRRRZZ{csskZRcZ{{cB1RJkR!1!)!B!:1:!!R{Ό{ZJkc1c1!::BJRccZRZZk{cZskRRZssk:)B1:Z{{Rsk{ssRckk{c:ckk{c{1!)1sZcRZ{Z{cs:s{c)RBRR1Bcc:JJBZc)RcJBJJ:R::BBJBBB):RRZk{{cZskεkscJBkJZcsssRRZR1:!1{{cR))JJJBRRskBcRJ1:ZB:ck)!s!!))J1:!:):R!!)J!:1ks:Bcc!B)1BJJJ!!cR!1BRk{kZBRJcBRcZBcRkk{{kRBZ{ZkB{Rccs{c)!JJ)JRZ)BB:ZJ)R!B))kZksBRJ1RskZ!!1s{)!kJ!)cB1ZB{skscsZcZkcRν{sckcB1Z{c{sscskRcťsΜ{JZs{{Rkck{Bs!cJ{ZZsJ)Υ{Υss:B1c)k!kZ1:BRkssBZkk1ZZkkRZBJBsZcsΔ1J{RZscBZ1skRc{{sJB1)1{{Zέ{ckc)!1)!1)kcZ{sskZZBkckckRcJRJZkRBJJcBB:)JBJBJBJBB!:J))1BZs:RJZZRJ:B:RkZRsZcZBsRs:B)BR:c{RR!!JRRRBcRcZ{::1)!1B:JRZJ::!)!1J)Z)B:RR)Zck:ZJZ!11)B1:J)ZRZJ:JB1BZ{ZsJkZBRJ1{BJJksR!ZcscsRskR!)):kZkJcRRc)cB)1B)::1):cZJJJJs)Zc{R1sRRRB:J::kc{{kRkRBksBkcZcń޽kJ!cs)::k1)k{kZkkscsޔ{Zkscs!R1k{{ތ{kc{ZR{cRRJ1kZBRB)RB:!JZkBkZccckB1ksJccRcZscB!JZkBkJRs{cks:ZZ){Rkksk{!!!1!!1!:{RcJJs֜kcR{{:ZsJRR:sskZJZ:R:!11J1)BB1::BJ1!J!BJsskRJ::1BBJ1B)1sJsJcZk{sR{:!:!!JRR!!BJ)RZJRZRcJ:)1BJ{cks!BkBZBBRJkZZRBcZ:){BssZ1JJR1k{Bs)!!)ZRZc)!RRRBkZBJBZJkkcs{Z1B1Z)k:BsZ!JJZsZB!):R:BJ)Zccs1J:)1Z1:)!):1)c1RZRJc{{c:):{{B{:cs:s1J:R{{Zcc{kRsskZs֥ZŽssck)ńk֔1:B1))BBR{{Ŕskk{ZRZk1:)ck!sZJksccZZRJsZRsBsBZssc:J1Zk:RJ:kJccB11:JZcJR{BRBRkZ:sZkcRZZZRJBcJc:RkJRJckk{sZ{:)::1:!B!!ZcR:cťcskZscZJRcJR:Z{kZJBB11!!1:11!)1!)::B:)cBkk!B:B:BB1c:J:::RkRZck):1)R1sZ))!Rk{ZJcBcB)JR:)!):BRBRkRZB!:BZRRZ)kkc)B)!){RsccB!1::1JZZ:!!11:R:R1:BkJRZcRJRsZJkZckckkkBkk{{!!)!BssJkkB:RJcJkR!!)11)!))!::B:RkkckR1:::c!!!R{RZBk)s{kZ{csBBBc{{JJkkZZֵ{{k{kcJkΔJ:J:)!)sk{ΥZc:RcRRck{Bc:!1:Z:!scsޭ:cεJ)!k{k{k{s):)):R)Rk)BBB11:sJRZZ):kRB)RcJsk)BRsksccckZJcc1BZBs{{RJc{ksZk{Jc)!sccZBZ{s{kkcccckcsZBRBckRB11R!:::1c)!:):cZJ!JcsZJ{Z1BRRc1:)RZB:RkRZZ:ckZsscJBR)B!!:cJ))!kJJR))!1)JJ1:{sJ:)):scskcRB):R:1111)1):B1{scR!1sBZ:ZJ{Z:JcZZJB!1cR{sJZB1J)1RsZ{kscBJBRss:)1!B)JJJkBkZR1cc{Z!!)::11B)JsskZkcZcZkRRkkss)BskccJ!ZZZZ:{ccJ{kkRŜ籠Jsť1kZBscsZkskcR{sRss{ss{cJc)1)!)JޥJ1Jkkkckcksk1{1sZ1:!c):B1RsJskJkkZ1Z)kcRkRkJsssscskkZcZ1RZZRֽ{Bck{kZJcRkRc{)!kZZccckZsskcskkckckBRR:cB:BRJBBs1Z1)):1kRcZkcRR{{JZJBRcRR:RRJJssBZR{ZkZcJZkR!!RJkc!:J:B!!1!!J11!1:)BRsJ{:cZ{RZJJR:!cRJ1)Zk)1Z!!)1RRZZBZ!B1):1!1cZJckZB)RJ1R1Rck{kssscJBk)!1:):sB:Z!)JZcZ1{BkZ1RJBJZZsscZZs{Zc{ss{{Jss)!)RZBcskcJJ)1:)JkcRkksccBJ:ZcRRJcJ|sk{sZssckJ:Zc{{ZcR:RŽkRcZZc1:ZJ1Z1Z:11)!!11sc!!R{kZRskccR:1k{!1:)JkkB::!!Z:Zs{cRBckZRBRkZR{Z:JkkcBRZBsckRZZBRޜJJJs{ΔskcksZ)1))kJckkJRckssZB{ckkck:BBZkRkk:ZscZcޜ{{sksRJZJcZBJ):Bss֥RcBkRc{cZs:J!!)):B:ZJZRJR1!!1)J:B:)!BB11Z!{:)B:R:BR:ZJcckk)ck1!1JZkkk)BJRB!1sBBJJs{kZ:::1):ZskksZ!J!JcB)RZ{{RRJRkJsssB:BRRBB)::ZR1Zc{J{sc11R{sB{ZsBJsB::)Jkcc{kJRckk{kZsk{B歔{BB{{{{ccs1ZŌ{s!sJŌޜkscBJ1cRZBBZ1)R)1:!)1!sBR{111ks:cZcJs1cR!BZcZsR1J{kJ)!!1B!{ccZkkJ1:R{Zc:kk:B1:1J!J)1RZc֜RR֥kkRZkkkkRkZ:!Zc:ccJkccsRsZsZckcsJJRRcssckZZJccs{ss{k{{sk{1Jc:Z::BZ1:cZZcZkRJkZkscRRssc!1!!1R)ZJ)):)J))!)!)1skJB:11J!):cs:RkR)!):sJ:BJRJ:BJR:!!BRZJJBk:1kBcZ:J!J1Z:::!R1ccB{{J:!JJ:RBcsk{)!!J1)R:JkcR!!))JcZRBc)!1!)11!!1ZJk:)11)!Jkkέޔ{!scRBRk)::sZc֌cB{sZZcJZcsZZckBc{c{s楔B)JccJ1ťsks:B:ssscJBR1:Z:{JBJ!!:!1)1:!Rk)B:RJ:ZRRB1RR!BJskZ!)!1BRRBZZkZsRkZkZZRcRkRZcsskR{BŌ{kŽZ{RZ!s)B:!{cssRkkc{cRsZRRs{sBJs{ksscccs{c{kZksBkc{ckkBcJs{sR:ZR{kJcccks:!1Bc)!!!)1!RRZZckcBRJkc:1!:k!J::BBJBZRJBcck:)!!!!B)JZR:1Bk11B!BJBZZsJJ)!!kcksJkkkc{Jckkk{kRJR)!:!1!!Bc)kZB1!!:!!1{k:))1):1!ZZ{1!11!1s{1cR{ZcJJZJ1R:))JkZs{:kZZ{sJZsZ{s{kcs1ZkZkZksBJk{{JsJZ{cB{{skccť{:{s{k֥c1JֵRBs!)))kkc)!)!kRc!s:)J:RZ:))11R:BJ:1B)1Rc{cck{ckcckJJ{sBsRJB:kkkskcRR{{k:!)skŭ֔scss{sscBcc{{Zk:RckkcZZk{{kZk{kccJ{k{k{s{k{{skkksckBRc{c{ccc:Z{cRJB:ksZscZ:))!11JB!B:!!:cZRZckZ{RB)B:B):)k1J:BRRJBJZJB11!!1J{k{cJsR1RRss!1:Zkkckk)sccRJ:kZk{ks{kZ1!B:J))!!J)1JR!:1BR!!RJR{s{:!!11!!BRB)1JZ1B:ck:kJBJBRJRkk)JZJ1cckZsksZJsZcJZZkkRZs1RkcsksZ{Z:kJ!::)ZRR޵֔ZkJ)J!1:B{ssB!sc:{cBJJ!!)RsZ)Z1JJZ)Z)JBBcB:B))1kck):{JccckRJkRJcZkBZ1RRccJRRsZRRBJkB{潌s{s֜kZkkcc1c{sksZ{sZJZZRkccZkc{k{ckscJZkckss{s{sZcBJZksZ{ckZRsRBJR:::cRZs)1JsB:JJ1:RB:R:cRBZ::R1:BcJBRkk{cRJR)BkZRcJBJkk{{{RZ:!:{{RJ):)JBZsc!)RkR{BB{ssksckRks{::))!1:B!))1BBB!c)B1:)B1kkZ:)JZ)B!)Zc!Jk{kZ{s!{sR{ZB):11:RZ{RcBZcsscks{JkBc){{kJ{ZZsέk{{sskc{cR){kRkkk:Rk{ccc!BcRRkJcZ!B)1!Jc::B:Z{{έ{RB!ZBkccksRJZB1RZ1BsZ)J1JRRk)!:1cZ)B:RR1):cR1!cZcRk{:JRRRJBJcJ::1RRBޭZ{{kcsskJJ{{skckZcscccsk{:RkR{skcRskkks{k{sssZRk{ZccscZk{k{sJcJ1:1JJRs!!BJR:k)ccB:J1:JRBZ1JkBBRJ1:J:B1B:cZ)Bksck)!scc:cJZRBZZ1ss!B1sZkZk1ZcZk11{{skcsscsRss::111!:!)B:R1!!!R)1B):!RJBZ{!:))J1!!{{1!:JB:ksskc1::J:JJ1JJBcZkck{sR!ZBkRkss֜kckckkkZck{{ńRJsŽJsB:JZ1RRB:s)J{ZZR:11:JsJ:BZs!!:1Z:1:{ssck{ks{sss:Z!kBRJsckJ{k:k:BBksZ!1RRJJZRkJJBc{kcRkssBJ1ZJRc)1歄{s{{sc{ks{csss))1):R)):!)!s{cZRcRc{JBJkcZss{sZkJB)){cssk{{{sccZs1ZJ:!!BJcZc11sRBZBBZRRRJ)1JRRBk1))J:R1BR:RJ!::11B{{Z)!!):BBR)cZkcBc!:111)!cccZBcBB1RkJRZZBZkRBkRB11)J)!!1RJJ:ZB1!):1!)Jc1):J:!)!BkksR1kBBZZcJ{:1ksJ::1)JB:RBBB1J:{{{sk:ZRZkskޭZRc{{cŭscsRŭs!))BBsJZkkJkksR:c{B1::BBcss:1:JRRJ1JJR1ck{c:cZ{ZJ:BRB11RcR:BRBcR1:1cc:B!B)JskBJBBJJ{k{JBccBJsc1ZsZZsZ{ZkkZssRk{kcRs{cckk{!!)!!)!))!BskZccBccRRRRRRsc:Zsk{{!!!!kkRs{{sksZRc!ZB::1:R:k{R1Zs::B))s:R:!!!1RZ1)!1kRJ1J::ZRZZsBJZ)RZ11!:RBZZZBBR{kR)BBZ)J!:JJJ:ckksJcc:):kZc{1):1RZRk!!R:Rk!)1:c!))B:R1:s)1)!J1ZB)Zskc!!c!)JcZRsscR!1R:!1BRRB1::1:sJksc:J{1s{{kk{ZckZsk{JR{ŜZ:JsZsJc{ք{ŜRskRsk{JR:RRRZZ{Z)11JBRscB)ZBkJckZťJBksJBB)Zc{{kB:ZZBZRJRsRB1!1!BZZRckRkZJZRRJcRJ{1kkJ11:ZsRkkJBRZskRsBJZBkckccc{{!!1!)!JkZckkkkRJRkZcscsccZkJJsZsRJ!1)!:kkkk{kcck{kcRBc::BBJ1JJckB:!BsZ1:11B!J:1B))Rc:kZ:1:))1:k:JJJJck!!RcJBJ1:BBk:1JJ:11!RkkJ!1ZBZJcscs:!JcksJ):R1)1!):)Z{)J)11)!B:BJRJcJ11!1!!1Jc:k{cssJ1!!!):J1!):Z{ZcRssskZ11B1J!):1Zs:B1B)BJcksk!ńR{εZcR!ccJRscs{ZRcsscsJJcBkZBŌZkZ:cRBZJZcJ:BZkksZ1!1JJcsZ)JJ{R:{::csZkckcc1kZkJRRcB:1BccBB)!!RcBBcJZRkckkc{ss){k{sckRJJRBJ!:cckJZJcccJ:ZJs{ss{c{k!))!!!!!!Zk{cckZZkJkcckccsBkZRccZsB1):!kkZZkk{sZBB!1BBkcZ{ZJJ)R{kJRRRkRBBJ1:BRR!c!!)Jc:ZcZcJ:B!JBRBsZ{cJZc)ZkJ:BJJBRJRBBcBBRRk1R!):JJJsscZksJJk)1RZ11B::!JJZ!B:R:!1:1!::RRR{JJk!Z11J))c)B1R{:!!!!)BJkck{{cs{sRZRZB)!1B!RRRc:BBJR1JRBJksk֜kΌ愭Rskk:sksZ{JZ{ZֽJkJR{ޥJ{΄ޔJ)ŵ:R:Bk:JB{ckRs{RBsRJ:::)c)k!1kZJZcsR:cRcsskZ{:Rsss{cZkcZJ:11JJZ:):BJRZJc1:{cZkkss1kRRcZcZRJ{1BZ1:ZBsRZBJZRZBcZck{kk{1!)):!!!ZsccsskcRcsZJRkZkJBBJJsks::J1!!kkcccsZRZJ1R:{k:R)JJ::scJ1{cR)!)))1BZB::)R!R:s))!1:BRBZ:RckcZ!Rk!)!B:BB)1R)J:R:kR)B!!)!k{JksZZJc{kB:k{kkRJksss{c{JJ1BZ!)1):BRJkBcR1)JR))!1kRZ:BJ!:)!)!ZJZkcZ{kkkc!)ZcR1sJ:J1::BB:J:B:sBB{sskkť{{Zcc{cskccZRkck{{ZRs֭11ťcRJR{JBJ1Z:ck:kcJcRZsJkkJkR):!JZ!Zc{Z!cΥcs{{RRksJ)Zcck{k:BR{ZRRZBJ1Rc{R1))ZRJJZk)sZ{ZRckcsJkR)JB{kscZZZkR{RJZRZc1Jkckck1!!)!{cRJZc{sZkBZZJcZcccJJJBZckZ)!c!!cRJRR:B1BJ1:B::1):Zs:RZk{JJ:RZJZ:B:!R!Z:BcJ)J!ZR)B!!1)kk1kc)J1RBJJZRJZBBkcRksBRsZRZJR1skkkBZ:Zss{{kB11JBk1!)!1J:JRJ1BcB:!:BZB)!!:J11:kkJRZRZRZR{kscRkRss{{s:!B:1:Z1!J!1)1BBcBB:))1s{{έRZZkk{{{ckkcZkkJ{{cZBcB{ֵBcŵcksscJBBRssksBJ1JZ:c{skcckkc))cRBZZ11cRRk{ތsJkccZJkcBkc)BJZsksZRZ:B1BJRJcB1c{JsZksB{RkZ{JRJŽ{֭kcZccsk{cRBcsksRJRkc{Rks:!!!!)!1:BJRRkZRsss{cJRc:BkZRZ:RRRkk!!)!!JRRJZR)ksRRB)JR1!BZsZZckRBk:J:ccRZBJ1)!JBR):1BRRJc1J1ZJZJRss!):!cZskZkJckRR)cckkB)ckkk{)Rs{J)BZB!1:J1k:!!1RZsRBR!)):J!!JBcs)):!!)J1:BJ)JkRccBcB{Z{ZkkZRckssJcJ!!1JZ{sJ!BBs{cJBRR{Z1!)!Rs{{sk{{sZZksBccJs{sk{cJc֜{RZBRZ:1kJJ{JcRZcscscR{RRR)kcscZJBJc1ck֥ΥŌ{:kZc)B:ZBc{{sRcskJkZsZRRRcsscRZkskJcZccBsքޜ!:1:1BR{RJscZZcZkcRccsckkscRckZcZJcc{kckZBJ:R:cR:BZckkJZ!!!))J!!!R:Jkk{Rk{kkkk{B:Zk{JBcZ{Z)!:Rs)JcZZ:RBRJ:JJBBBBRBskRkZZksRJ:!kRJcZkR1B{ZR:Rs!):kR{kRZ!RB)!1cJ:1cJJZJ))kckc!1ZRZ)B::RZR:!)!!c{ks{kB:s{k{{sJJkccscc:!!):ccZRJ!!!::ZJJJ)cJcZ!1)11ckޥ{kŭ{ccZsskZ{skJ{{{J!:):R{ckRRsέJcssZk{{cZZZs{ZR:Z1kB)Zskŭc{BJk{cJ):J)::c{ss:!ZR:BBJ:JksccRck{kkZsskZ!1:ckBB:cBBBRJ֔11:RZRkJcBRssckskc!JkJRBRJkkZk{kZRkRsk:c:cJBZskckZR1s!!!!)!)BBBBZRBRkkc{skJk{{B{sJ{ZBBcJJBRZJ!Z!R)JJ:!1Zs:B:cssJZB:ZZJ)ZRJJZsR:cJRRR:B!))JRJc1RBR)c1!!Z{ZZB:kR:c:Rc!!!ZBJB!)RJ)!)B)J!BckcscRcsk{kkZB{cc1{sZB!!k{ZcZskRZc:R1BccZRc)s!)1):Rޭ{ŭsޜc)JcŔskkscscνΥńB)k:!)kkBBckRRs)::s΄sZ޵sŔZJcs{ksRcZBsBBR1BZJZckεJR::::J:J1B1ZJcB:kcs{sJZ{ZkckskRkss:!)!!:JckZRkJRcRc)sBRk){BBJRZkkRsk{c)!BZJR:)c1ckkkJsRkR{B:R:JJZscsJkZJRJJB1!!!!11cBRk{::JBJBckkZckcBckkkR1!BZR))11J:):R:!!1RBsZZRBBZBZRsZ1B))BBkkZkBJkkBB1Z:R))1BRRcZkskZ!R!))J1kB!BJJZc:!)!:Z:!:B!JRR)Z111::!1kRBRJBJRkcc{ksccccB{ksJ)!!cZZs{B1cs):Zc:RZBZR:s))!1)Bkksk:R!sBJ1)c{k{cscRZssZ{:Zk{cBZck:ssZZsZńksBRZkskRcss11!!):ccJRJZks{kBRRBkcc1Z1):BJRsJcZZZcc{skckZRBJB1RZB1)B1cJccZk{:Z1:Z)ZcJZ{BRcZZZ!!:RJJZZJJZskkZ{kRBZ:RRRRkRZZBRJZJckRJZZ{BRkcJBkcsksskkcZRccZk{{ccZksJZJkB)!ZR!)1RB:)BR!!:ZJBJZscsJcJJJR1)ZJRcZJkRksJZBBB:!!!cZcRZkZs!ZBB!BBRR{R!J)!BJk1)!Z)!!R::!!!1)kk1JJBJBZRZc{sZJcsRkc{{!)):kRksJ!)J{{R)){RRsJR):!!:kkcs:sB111JsRcΌ{s{{skc{skJskZJkBcBZBBB!:BRsŭRsJBZ{ťc1ks{RJJk{RcJZs)B))cJBJJ:ZBJRs{Z{Rs{Zccsc1:1:RZ{k{sŭs{s1RcRR!)Rc{scZ)1))1cssckssZJRZRJ1skRRRJcs!)ZZRRcRZB{kc{s{kkc11BZZZcRcZc1Zs:cckZJkcs{{RRB1)Jcc1:ZJBRskcck{s{kcBckR):ZJZkR:1RcRZJ:)JRk)BRBRBZsJ!:cJcR{ZZRcZRZZ:kR!ZZcJJRk)RsB1:BkJZJkc1))!!BsBB!)B!1)))B{R:RBJZ:JJRccBcccckZZ{ckR!JcRkB!Z1)1!)Zs֔RΌkRBkkRR)c{sss)!11kRŌksZsZkRJZk{{ŌkJJZssRR{R{csZs::1ք{ZBk{:R{csc{s:1)B:cRcR:RskRccc{Jcs1ZkJBccsRkRsRk{{kk{{JkcRBcRsZc:B:!!!cssskkkkBBcc:RcJJZR1)RRk)!!1:kRRZkRRkcscZsckck{ZZB1B!JBBJZ:kJZBkc{JZZkJR11BZcBR{R!RRZBsc:RRBkks{ccskcZ1JJR:J:BJBB!1)Z{JBR!ZRRZBJR{k!!!)BJ:RB:ZBZRkJRBRs)ZZccRcB!!1:!1RRZJJ)!B:!!1!R!1!)::Z{JJBJRJBZ:kR{s{BZJss{Z1)!!!)RZZBJ!!JZRJJBRJ{c:!{sRRBJBJ:Bkckk{kscZńs{{{{Rk{k{ZŽJZ֥ccsckksZ{JcZ{BBcZ{{skZck{cskcR{kJ:!:RJRc{k{BccZskB:k{ks{J{εc{c{J{{kk{s{ssRcBR:)1csZ1B:B!!{{kc{{RZBZZRsk:R1cZ1RZc1RRBZRssJRJZcBkskZssZkZ{kB:1::1)ZBBccJBsZ:J:c1Z{Rksks{ZkBRZkc{ksJccB:R{s)J{RcJBJ!B:!RRcZ:!ZB{1JBJcJZ:cJZB)):R:cRcRZsRkJcB!c!ssckkJ))J1RB1RJJR)1sRB!B)!)!1!B:J!BR1!)):RkscJZBZcskR!)!!!:Rc{1!sB)JJ:)sZ1JRJR:Z!:1!!scオcJ1kťﵽkJ{Rss{{{{kέcZcscR:JJ{sccBk{{R)::BZsεJck{sZ:ZckZcsskRcJZJ:c{{R{ckcRckJcscksJBBcZckcRscskZBZJB:ZJkc{ZcRRcck{{sJRB{Zck{cZZRcccZBskkJccJZc:JJ1{kZc{JkJ:c)JBBR::B)ZR:BZ)1)1:ZkkRRs{kRc:k{{ZZZcc{!!!RZRckssBscJcJBBB1!c{R!!)JZJ::RBJ:Rcckc!JZJ)JJcBJBZBZBcZJB1!RRksckB1{kB)BJ!)::!!BBJkskcZBR!!1))))BJ:!)!!1!)J)Bc!J1!):)BR!!)!!1)!RB!!!!RBZk1)!kk:ksRkZs{kJ:RBBR1!)R:)1J)111kkJJ{c{sskkkŔssc{cc{ZcRsc:RsJ{c{{c{cc{:kcJBsZ{Bsc֭cJs{{kkc{s{ZRcZsc{JRkssRkksJRZk{ZscZRZ:{RckscZ{{ZZBBBRRZ1J:sZkc{)ZJJBBBJk{scscJJcRcsJZJBR1R)JJJZcJRRk1JZ)B!):!BJ11!:ZBB)BR:)cJZRcZJ)Z:JccZZkRBkk!!!kkkk{kkkť:RRZZcRJcsc!)BB)ccR)RcR::B1cZRZZR)sZBBc{ZJ){11BR!1Zckkc{!)kRZ):)1R):!1B1ZksZZ{J!!!J)1)BkJ:!))ZZB1)!B::1)!:!RZJZ))!Bk{1!Z1BRB!Js{JR!:sR11!1B1JB:)c)c:)!)R1::1{ccB:css{{{{Zsc{c{s{sssֽkscc{{kR{R{JZ{sZZk{Ž΄ֽk:cZc{c{csZskJcsc{cBkcsscs{sJRJZRsZRkJkcskkkcJRcsR{{skJB:RcJ{R1B1cJέRń{scRJcJs{sRcssssBscJBJcBBZR:kJ1R1kJBZBRBZRJJ1)))!1B11RRkZZcZB1c))ZZJ)BZBJBZkccssB!11k{sskkŵZBsRkRZ)::JccJ{Bcc:cJRZZZkJRRkJ)!!!1cJ1Zkck):ZJc!:ckcsZ)!BcB1ZJJ1!:B)1c1cZR{c:Z)!!!!)!B!:ZcRcB)1:J!1BZ1JJ1BB:::1B:BJcR1Bs{:BRJ{c111JZ{{ZJ)!Rckc)ZB:J1B)BBJB:B):BJB1Bs{kZ1k{ssk{{{{sckckkZc)J{Rssk{ZkBk{BkcccJŵΔΜ:kŌk{ssZ{sskcJ)Zk{ZRZBRkcZZc{ssJJRZkRsJccck:ZZRksBss{R1R!:cBZk{ccΜsRRkέ{sZRkckBJRRcJRccR1BBRJZRss{JJcR:ZBJ{BR!!!)kRJJcRksRcZk:R!ZRssk{c{RcRcRkccB!):Rsskkc:ccZcJBBBckJRc:1:ckZJkZJkkZRR)!B{{sJJBR:ZR:kZksJ)BsJ)!!R{Rk:)!!1!1:)B)BRc)!!!!:!:B!!B:!!ZRBRRR:J1JRRRRkZ{k:1)JZcscc)JZ{ZJkJckZJ1J:kR1)1):!1BR)::1:J:B:JscJ:RsŜkc{k{skkcs{{sJRZJcRcŔRscs{kJ{{Rc)11!!BZńΥssk{sckk{cJ{{{{B{kJJZJscBZ:k{ZcsZZcsZBJsR:kZZZB!:cc1J:1ckc{s{BRR{{J:Ŕ{s{kZk֌kZRZRRRRZRJkcckkcckkskZJRJ)!1)R1{{{ZBJZ{ckZZsJkRc{{{B:BBZcZZ{1))1):ZBc)RcRZRcRJJ1Z1!RZRkcZkcZRJZskJ!1JRkRBkZ)1B:{)JJss{ck1RJZJBk!ZB:{1R!)1R)B!!1:!!11ZBJ)!B:::BRJBBBJ1JcZJZJc!RkZB)ZscRJ!))RckR::!:JRk1!B:1!1J{:111cB)1BJ::1B1R{ZZB:RssZk{{ksk{cR{k)cZ{kssss{kcsZRcccRBZs:Jk1))R{cBsJ::k{k{{kck{{ZsZ޽kccRsssZRscZJssR{J{sRBZRRkkkkJ)B1!)JBsss{{{cskRBR{ZscksJBZRRJccBZRBBRkkks{ZRJ::B:ZZZ1Ŝť{cBcZ{sZsZZ{cJBZZkRJRJRZR)))!ccZJ:kJRRZJBckZB:!!1sJcc:RsJ{JZsZJ{:)R1JRJRZcBZJss!)c{Rc!)J)!!)kscBc:J!)!!1!!11B!JRRJ)J))::c:!RccJ)ZJBZZJkZsBcJZkBBcsZR!)kcsk:!JR::)!:1s)BRs{B1c!BsRBJBB:J1RR{ccRc{kkcZRk:RRZsR{kJsks{sksc{{skk{{sZ{BJZcc{Ŝ{kŵZ:1:JkΌ{΄cRkkscssskRkk{sZ{sZkccsRsR{scR):cBBJJkcsssckZRJBRs{R{{{cZZskZcRBZJ11B:)J:BcZkRscRRJBB)))νsεkcR))RZssJ1Zss{sZZRZccJB)!!)!)!JRsJ1kkJR)JBZZB1RBZcJc11RRJZkZcB:ZkZ1:c:1ZJRR{RBskB1B!!RZkcR)JZZc1!!{BsB:{R!!):)BR!11:RJB)!!JBJBJ!BRksJJ)B:JR{k:Z1!)Z:J)!1)!)1s:1!:J:!):{:!!kskRRkkskB11J):B:1J{cBRcsk{JBJ!cJcZRR{R:sksRkZRs{RcccZskksckŽ:B{ŔR1))!):cs{sŭssss{ssks{BZckcks{ksRR1!cs{JcZksccZJZZ{{sc{sZkcJkJkRsB::RJRZBZc)R)B:JZZJZRs{cŽ{B1BB)kBRBRޥ{kZZkZ:ckssc!1)!!RB1ssBccBBBZkZ:R)BB:RZBJRZ:Js1RRBcBJ:JZBZcJcRZZRkk{s{:!k{!BBkZc)ZccZJ:ccJ{Jc!:1B11:1)):Z!ZBkk)!)ZJZZJJ1)R:B):skk1!RRZJ):J1!R1R1Z11RcR1))ssssJJRRR:s{k!J):))BB1BssZss{cs:BB1JcRBcB{JZscZcksksJ{B{ZJkssk{ŭ޽ֵ)BcJZJ:Rc))cc1)1)RRRsZJcRZZkޥckJcsRcc{kέkJ!1s{BR{Z1JJ{εZsJZRk:BZkJZJ:BJJBkZsRkkck:sskR1:{kZBkcZcckRֽΜBsZJJBscsR)!!!!!!!BRJc11Z:cRBZZcJ))!1!RZJRcRkRZJZJ1Rcc:JRZZZccc{BkkkZ)!J!)ZR:))!scsZ{!RsRs1BB1!1BJJ1B1!!!RcR):!B1BBZRkskR:kk!)::)!ZJ1!!11)BJZ{{Jkc)::Z{k1R1J:1cskZ:1J):BB!JkckssZRJBJkZ:ZBcs{Zssscsc!Z{kֽޥcs{:{R)!))!):ZJcJ)):JZZZZcRsk֭ZsZcJkkc!1BJcc{޽{{{{B1::{ŵsZc!cRRRZZBkR{ZZs{::JBJsc{k1BcskcRZZksckRstscZkkZ{sZBcssJcRBJRcksZ!!))!ZJJBZcZB)JZ:ZR!!::Z!RJRsZJZRJkZJJcBJsRRc{{ckZcRJ))!JRcB1{JckZRcBcccc)1kRZ))1JJ)J!)J)Z{sskkkk)!JJ::B)!!11!!RsBJ!1BBB)JZc1!!Rsc{kZsc{k{k{kBJJ::c)!1:BJ):J1J!ZkZcZks{sJ1J1J:)BBc{scs{{cc{ZRRkZޭ{k!)!!J{RZ{{B)!111B:k{ZRRcJRskZZcsέ{ksΌ:cZB:JZZJkk{s)!R111:cZ)::{ssJRcťsccJBRkZZ{BBJscRcZZZ{ssBJZRJΔkRB{{k!RBR{k:JRcccZZRcks:!:!!!)!)RZZJkRsJB:R1J:!11BRkRZZs{R:ZZBRZJc1JkZcsZckccZ!!1!!1JBR!B):{scc1JBBk{ZZZck)c:Δ)!ZBB1:!!BcRc1scZZsJ)BB1):::R1c)Z!RkZc!!!!cBZZRRBB!BB{{ck:1JBRk:1BJJZ:))BsRZZZJ1kBRB:)J:J1)Bs{ksc{ksksJ:BBRJ:R:1ZsZkcń攌εZZ!)B:1B!!:)1BskscZZ1ss{BBssscZskcksksccscBBk:{{{{ZksZkBZZckޜJRΜR1!:{ŽB1sŵ{1Υ{skBcJckckZksZskRkc{BZBR:c:ZkBc{Zckֽssss{ks֌1BBZR{ss:cs{JRZBRsJJ11!)11!)1skckRZJ:RcJ::ZB1:BRcZRZsZRkcccZRkR{ZksksckZRB!1!)!JBcZ:!)BkRJBJZsRJcRRcRcscRRssRJscc:B1sZ::JJRR:1c1B!RJBss!ZBs{)B1BB)11JcsRRBJBRkJBccJk:sBkJ{JRRJZBRB1J:s֔RsR:::B:BJ1Jss{kksŵ{֥sZZBccJcB:JB!BBRcc1B{޵ks{{sskJ{{εcc1RRcBsZRJZcsRksskcRs{:kBsR1)BZ{{{s{{cJRŜsJ::Jc:ZZZRJJs)R{JkZs::sJBZ{sZsk{ޥZkZksR{歄kkcJBkcBBRkJsZ1)1:!ck{{kcBJJkZ)1)1ZJZkBZZZZRkck{{RB1sZZsk{{JcR1)!1!)RZ1J!RJRkcssJZJJBs{RBZsR!ckkRkJ1Zccc:BRBkBkRs!1B1:sB1:BJ!RBs)):sk)):)k:J:kBJ{RBRcksZB!)Z)!1Bk!:ZccRc{cs{:R!1Bń{ZŽ{s{sŵ{Δ{ksZskZR:::kJ:BckckZR:{s{sskJc{cεJZc{{R{ZJ{kZ1cJZZscBk1BJ{c֭{J:ޥc:)sRΜk:BR)BRJBBsRZsB)!B{sJ{cJkB)))!RZkZkkťބJJJsBJs΄JkkRkBJR:Jk1!):)!)1)JZcZBJZZ1ZR:1JB!1)Jc!ZZR:RsBsJkckksR!ZscRRcsJkB:!)1!!!!)R)sRB:ZskskZJB1s:Rcks1!ZZs:11ccsJkZZBJcJR:B1Jkck)RZsJcBBJ1:))RRR1J)c)!R1:!!B:BkkkJc{{cssZs:!JJ!BB:JZZRZkRccJckB!J:B:cc{kR{Bkck{{{έ{Rk{s{R{ks{skcZRcksZ:BZsckŭRZRk{ŭsk{ckskkcBRJ{kcR:Z{ZsZZBsscJBRkބZc{:JŽcŜkRccBJcR1RRs:1c{{Jk{Z1::))RsscZksZss{kkckskBJB!΄kń{kkR1ZJRBJR!!!)JskR{ZBck)!!)BJRJ){ZZkJcZRcZBBZk:ZZRsccsR)!:!1)!!)RcR))JRkc{{RcJRRJZ1kB{c!):RRRBJRZcZZcJ111R1Zk1!::{B))!1Rk1B))R)!::ZRRRcckRkksBJZ1)c)!!1:BcZc)!skZ{skk:1RBJR{ckRsZ{cJcsk{c֔kkcssŭք{B{ZZRZZJRJssRJZ1BJRkZZk{R:s{εZŵ{kŭZ{BcRcZcZZc{cRsZZk)Rs:kZ{J:B:1!csε!Zk:kńBJsZZZcJ{{RBR{RJBkZZ:ZsZkRcZ1ksck{k{cscJJZcsZsJBc:1:k{ZkBcZBcRZB:))!!!))!!!JZsZZcsRR:!)!)!Jsk{Zskckkk{R!!!!)1!!J1RkZ{k{k{cB)ckkscJRRZc:!BcB1kR:ZZccBZcZJRJJJBRRBJ!1B)J)!:!BBcR!11!)1RB1J)1JJZkRJJcZJRkkB)!))ZkkcR!)1:ZBscZRkccs{JssZJsk{{{{{ŌZ{ksZŌkcZ޵s{BZJ{ZcJZ{ޔRRks{c{c{sŔŌkRk1ckŵJ{{RRRccֽc{R{BJZk{BB!:B!Js{:kc:Rs:J޽{kcJZskcB)kJZkR:{1R:csZR)Rsc{RcRkk{sssk{ZskJ1ZJ1ŭZcBBJJJcRJR:!!:!1!BZssR1:cJ11!11!1RB:cR{kskJc)!k!!!)11!ckZJc1!{{sJ{cs{Zc!1ksRkRcJJ:RRsZZ)cR{sRsBZZ:JZBB!)k{k!)J!!)RB:)Z:!!J)!B)B1RckRBJ1JJ)ckcBscB1kB)J:RBR{RcRcscs{ckskŌksΥk{ŽskssRss{sΜs{ZRRZcZRZBkRksZ{ckccBZJcZքcksR):kRJ)Rk{Z:kc{Μssk{!J11!!B11{RRR浭{!:RJkcZRB{sZ:BccZZcRBR)1)1BZZJskZkcBZkkk:RքŌkJkZcJBZcJ)))1!!BJcccR:1:1BRBJcZJ{scZZR{sR!!)1kZZ1:!!cJB:ZkkRcs{)cs{sJ{!!1JZ)cBcRJ:RJ:RJcZsB)!BsZ:)!!cR!!!!11)1!!k))!B))!:ZZscJRBB!!BB!)1JcJsRB!JkB1):BkkRBBRBkkkc{Rŭs޵֭{skΔZR{{R{ssńsksc{s{k{Ό{scRZkŭ:ޭJZsR)R)kkckkŵsc֜cks{Z::B!:֥JkνcZRcεZJJZZ1R:Bsc11:k{ŔZBkJ:JZ1:1RBsk{ck{scskkRJcRkccsR{s浵{kRkRJBZZBRcJJ!:!!1B1ccc){RZRkJsk!1{kZcsks:!))!:)JR:Z)1)BkJ{ksksJBskkc:Z:kRc)BJ)JcJZZRJRZ{RB!ZkZRJ1B{skBJZR:{{c:11!:RJ)J)JZsks{{Rcs))!J!kJ1J:cJckRJ{B:J::Rck!JRJk{scc{朥{Z{sZZRksc{sŜRJkkRZs{ŵscޔތk֌{{Bsńk1ssεJcs1RsZ:BcskZŜBބRkRBB1c{ŵ:J{Bk)BZRŽ{{RckkcJs{sksJJ1kcJsJskRsZccJBkR{sB{{{kccJR)sRZRZskRR省c{sckkޭZksc{BJ:11!1:!JscRZ{RkcRcR1!!)!RZc{scR)R:)!!)11!!Jks:B:!!!B:ckZ{έ{RkZkc:R{JJJscsRB:Zc{!)1ZcRck)1!:{B:s:RZ1:ZZZ1):1)1ZZ{JRcRZJ)cs{{{kJJ))B!cZskkJR1RcBR1)!!JRZZ1J{RB1Rc{ŭ{kŭRscZkksksccZZskJck޵ssνk:ckss֜cJc{ֽZR)cΜcք{cεRBZccR{kBkcJεJJRZZ{s1Zޭ1))JRkŔkZBRkR{{{{s{sZJk:J{JZBcRkccks{Z:JRRR1ZRRJRcc{sRRRsk{νތskscsJZ1))1!:BcRccRJZJJJRR:Bތsks{:!!:!!!1R)1)cR{ZsJJRssZsR{ckRZ!)ZZs{{Rk{sRkB:BZckc:ZkkJsRJs1cBk!BR{11)BJZBkkkZkc:!1JR!!BcZs:Jk:J!BRJ!:!1kkBBJckJJcZ{֥ŜsZZ{cJckJsccs{ŭZ歌{c!1Bs:JssJŔB{sJkcRZsJBZss{R!JB)樂B)!!!kc:Jss{{έZRZsck{Rkk{{kccBZs{{RJkkkZRs1kRZ{JR{ZZkZc{ksֵ{ޥ{k{{cBB)1JB)sss{ssRBJRZ))!{kskR!!)!))1!:!:k1)1!)JRk{֥sskck޵R){1)!1JRZkZRJ{{{kk!Rc{Z:RkB1c::BBRRJsJBJRZk{11csJ!!):):BZB)Rk{Z!)!)ZZ):ssZR{Z)JRBBR!!c1!1JJBBZkks{sk{ckssZ{Jk{sZc1Bk{ŵ޵c{sJss{B:{c{Bε)scsks)scZ:JccJccZZccBBccs{JcZ!1c{{sZ:){kkckRksZRccZkk{R1!1BR)Jk{JRkRkZkJkRZ{skss{֭ssŔέkkkZZcssc:!BBJJBksJBkZ:kR:Zc{)!!!!!)))!!!)!)!1))!!!JkRRRsJkZ{cBJ{J:kkkss!1:RsJZBJkRJRBZckskZ)1JkR{k:BRRBccB1B1kRs1B{)JB!k:11)!)c)!BRsJ)!k!B!cZZR1::Zscs{JJ)!sJckk{ֽsέkckk{s:cJkZ{ք{{sR{RRcs֜Όs)!):ZsŵJRޥŽέ֔{{ck)JcZ)1Z):B{cRsJ:ZcJcBscRZccν{1Zckk{޽BcBZcRck{cZcsss{sZJc{JcRZ!J1RZcZkJ{R{skZJcR:JckckscckŜ֥{ckkkkkRBc{kkcBJBcBBRckk{RRJBksR!)))J!J1B!!)!:)1!!:BJRckkRRc1kc1kRRckssBRJ:RZkcJBkks))BZ:k{cRcJkkRZs:BJ:!R11)RZscccBs:JJRZ){BZ1J:J:)B!))11)!!BRBRRJJJJ!!BJkkckkZR11BcJ1BB1:1ZB1B{ksε潵΄cJJcZkR:B:{ZZksZ{{:RJJΌ{1:))!:)Rkss::Jޭ޵浜ŵJRBBs)JBZRRRkJ11J!RJJR:kkJ11RcZcZckcs1!)1!:c{ZBJ!BcBBRkZZZJRR:ZskRJZZRsR11ZJZcJ:ZcZksc1)JRRkcZkss{ZBZJkZc{c{cR:JB!csZZ:kkZsRkJRk{R))1!1Z)RcZsss!:)!1)!!:BB:RJs{sscZsRJkZ{Jss{sc{Bsck:JJZ:!cskBk:sJsZZ{!BckBZBZ!:RkkckZ:k!ZJcJRssBZR1:J1R1ZJ))BB)!1))!!!:c{{kskR!!!::kkB1)Rkskc)))JZ{sJ:ZB)!)RBk{sޔ޵ޜ{JBZRB:1ZscBR1:Js)!))!:ZR{JBsssޥέ{ZZ1JRΜZ1:JJ1:BB:!:1ŽZ{csZscsJBBcck֜!BJkkssc:{::)B::1scc:kZ:BRRJRckcJ{kRZBc{ccBk1kcJccޜ{ksccZksZތJ֌k{kskcJZkRZR)BsckRccc1kscskkcRsc)1!!!ckccsZ:!1::R)!!)B))kkckccsZZ:Rk{Z{scc{ksJkZZskccc{RZ)ck11)!JsJkcJcB:RkBZRZ{{k):1ZJJkJkcJB!kJRBJB{ZsBkZ{:)ZBJ11JBB!11{ckcc{c{Z1J{kZ1J1ZsJkBB!1RZR!!:)1:BZ)s{{޵)sZkksBkZRkRsk{Zs:Bc1RBB:J!:sZssε{{Μcޥskc!1Υ:ZZcBB1:)kcJR{kscc:B)Bk{:s:BRBkB֭kJ)B1JckZcccRRcsJ{RZcZs1JBBBJsBJs{sZR{ckkRc1Z{kck{{k{cRcJZZRRkskRkssR)BkJccZZBZ1!!!:ZRscc)1:JJBkR1))cJRkcJRRck{ZskZRkRccckcZ{sJccks{cBcZZkkk)B!1R1:J{ccBZ{s1Z1JcJcJJ)!ZRZBk:)RsBBkBRZ!k{{kZJZ:!1)::Rcks:R)!1R{RJB!BkZ):cJJZBť֭޽sBRRB{1Rk:{cR{){kskR{scJJJ1!))JJkss::Rť{sJ!B{))J!RssZBZ:1BJε!JνބcJ!)sJ!{))!)1ks{{{֭BBRBJ{ŭZ{ks{skscZZJk{s1k{RBB{Z:BB{sc{{ckZRcksZRZ1BJsZsZskR)Bkc:!!!!!!:1))!JJJ1JJkcJZc)1k{s11BZJZsZ{kkZssR!RRZJZ{kcZRkkJ{JsZBZs΄{kcZ:Jscc))cRZ!B:J:ZJZ{sJJRc{ck{Js)cRkss{!kJ{kJc1{)sk)1csJRZJ:1!ssZs:kkք))1)Bc{cR1)!!c!ZR:BB)Rss:kJRJBc:Ŝ1sRcZkccs{ZRJcJ1JJ:RR))J1!Z֜BRR:BZs)!JscBB{:Bcέc!kJB:1!R֜cR{cccJ1Zs{{sJJ!1)kŵŌcR!ŔccsZR{kRk{JZ)R:RkŔ֥{scJRBcskcskkR{kZBR1kkZkRZkRZ:JskJBcB):1:!!!!BBZccs:R1)ZZRJ1kkccJJZJRksksckR!RsZRkZJcBBZRJsZRks{csZR{scBZBRJ{J):skBJ)BJsJ:ZcRcssZcsJ!!sBBcksZksRJZJ!c{scsZRcBZ:BZkk{cck{R:1!!ZkZkRkJ{RJ)!!!:R1!J1B:JZksB:)Μ޽ޭޔ{ZBBRZZZkZssskcRBsZRZBZRBRZkJkBJJ:ckcޭZB!c{RΌs1)Bkk{ZRRJ)JZ1c{k:B֭{1:BR1:cZ{{kZk{JRεcJJ1ťkcckksRZRJcsJBB:Jcs{{kB{{:ZJRZccRks極ŌZ{skcskc{ZBk1:Z{Z{ZRsckZ:cs1Jcc1)::!)))ZJcZ{kcsJ:kJZ!B)Z{)c{sZZJkR{sZR!kskZRRZ{c1J{ssBcsk{{s:Jc:JJZ!1ccJJsBcsRkZ111kkcck)BJRZkZ:BkZ:ckk)c{kkBZsR!1B)kc)BRkkskccR11)R!B)ZsscZJ)J)11)BRc{cJJJ!Zs)JZ)RBBRcŔ޵kcsJ:J::RB{:skkJ1)RB){kZ{Z:{Js:!:RksR1B)sΥs1)!ΌkRsZJB:!!k:ZJBťZsks{B)11JcR!Jskk{Rŵ1ZB{skk{Zsk{s{ZRRcBJ:sZZJRc:kJRskBs{Rsc浥{֔kR{cssZc:Bcs{{cZ{k:BJ:!Bk11:)1!1)RcJckRccJRk1!!BcZZZZJBRZcsR!{{{{1{{RRZkRcBJ{ssJJJssRs:cŔ{J:c:c1!c{ŽkcJ):JBZkckkZ11sZBkkJ:J!)1:)):1!1R::!:ZJscsk{s{!Z{Zksskk{J:{1B:Bk{BZkBJ1:kJB{c11kZ:!scRcckskέs{BRJkcskkB1Rֽ::B{1B1{11s{{ZsŔ{kRB:)JJ):{ŔZ{ZŽޔﵔ{c1c޵s{ZJΜk{kRZkZ{1kscRJZZ:RJZsckJkJR{kk{ν{Rs{sk{B{RksZsk{ZkkkB{JZB{kk{kR1BJB1:))1111!)JkBcsR::c!:sBR{RJJkkRBRkR1sc{k{RJcRZJ{kksccs{Bs{1cR:cJֽZR1RRZBssR:cZssJ:kckZ!):!!))1!B1J1:kkcsc11BskccZksRkcss)))11kRJccBc{νkJ:RkcZkB!:1c:c1:)RkBBZkcތ{{{νΥs!!)Jk{kZZ!1{BֵZB!J{Bﵽ:ZcJZ:1!Bsc{sεZ{R!c!)ޥk{kc{c1:B:BsZZJJRRZ!ZZsc{skkcskkZ{s{Ō{{kZkRsR:cBs{k{sJkB!J1!J!B)11!kcRckBBZ1JZ1BBRs)1cZsJR111{cZZJk{1JkRB{1ZkcssR{R{ZRR{{kks)kZRk1kks1JcJksJZcZBRkckR1)1!R!:JRJ){cssks:!:{{cJkscZB:ZZ1)1:Rcc!ZckkJR{ֵkBZń{Z11:B1RJZc:ZcR1έcZJ11:﵄ZkֽJk1JcJ{ޥcŵ֜{sRΌJZ{ތkRRkRBZscR{cRs{ZB){Rs޽kRcZksZsJB:1:RZRBJB:RJ1)kskRskΜsckkZBZ:skssBkRZZcZJcJk{RZBZZc!B)J)!!J)!)!ZZRZcscJcJ!!1!{sZ!:Jkckcssc1:1kk{ZZ{J{s{::{{sJZsscJ:cJZcZZcJ)k{Jk1Jc!)!))!Jc1))!!)!B:1kBJRc1s{sscc!1JsscskRBB!BBkscBRZB!:ZkRRcs:֌Rk1:kJ1R:1JJ)ZRBcB1浵RsZkccťB!)RR޽csֵޔތk!)sJޔέZ:Z1cRcskŭZZZ:ޜR{JccZZkssZsR{kkZcťŔ{{scŜscZRsss{ccJJ1B{k{skΔcs{{BkZk{ńkZ{ZZkkckRkJBcsRcRsk)BRJRR{)JB:)!)1kJcRRJ1J::)J{kkZ)ckk{!Z{{Z{ccR1!ss{:cs{{ssRcńk{sZ))1):1)!RJ!:)!BB)B))RRBcRJ1:BJ)!!1kZB!cksss{{ZZJZ:){cckk{BkR{ZRkcJ)!))Zc)RJ:{{{ŭ{{ckBcc))RR!c1!JRBJsRBBR1JJc{楄֌:))B֔BB潔֔Ό1!:ΌcBJޭZεJJkcB)1!֭)Z{sνJRŔcR޵sR11Jck1skcsRRRZcks{cRssέ1B1:{s)Jcs{֥{ZcZֽέkZ{cRcRckRsRZRRBJcZccscBRJ)JBBB1:!:B!ZkscsZZkRRJR!1Bc{cs{Rksk{{1ckkJkkcBBB{csZ1BcscsckJkZck!!1:J:R)1)!!!B!))1!ZZRk)!!{ZJZZskksk{Jc1!Bk{skZksZk{Bss{1k):B!!BZs:kcs1J:s)11RBZc1BB1:Zk)RR:1cssks{ssεc:1:{΄ֵ֥sŭB:1{sJ{k{ބ:cs{kZsRsc{{R{c{sks歌Όs{RB1B{ksBsŔkZsJ!BZJZB)11cssccskkk1{{֭sJZJcZ֜ZksZk{Rc{{kRksZJc{skRcckR::BZRR!JBRkJkcZk{ccccZJB)ZZkZs!Zkkk{kkcR!:1JkBs{1Rkk{:RJsk{JsBRJkk{ck{s!!))J:c)B)1!:!!)1BBB)1JZZJRB:Z!)RB:R!!JJc1scBsZ!:{Rkcs{sccs{kcR!B)!Z!)B!1R)J{1:kRZBRZRR{))B1Jc{J)k:1c:1Zk1Z::1scRRkŭcJŜ޵s{޵cssBZ֥ssR)ckckc!Rֵ{kssRcΜsJc{:cs1s:֔{k){1:RcZ1Bk{JJRkkBsZkc:{kŜskk{֔c{kkZBZk{csckZkZ{{c{BJcZcB:RRc{ssk{{kckcck!R:ks{skJs{Z{sJB:{ZcZRcss)!ZRcZkcs))kZs{cc{ZJZJss)!!B)BJB!B::!)11!1!!:BJ:))))ssZkkRc:!!:RZ!)1BR:kk{ccZZ{ksRR):!Z)BsBBR!!1RJsRcR)kB:)BB1Z:k1::J:B)B1B{sss{ŵ{{c{֜ޜ:νB:1cބ浌ŽZsֵc)޵c::քJZŔBε֥kssc{cc֥kskZZ{kZ1sRccc{ckcZcRksssBs{Zsε{Ŕcք{{cssRkcRJss֌kkBcRkRZkJJ1R{BZBRZRcs{kJkcsR)Jkcsc{1{ZJ!{kkRkcRJZBRZcBkkRssB{sksccRscJ{k11!!!!!!!!:Jk1!ZR1B111!!:1)Jc1BBZ1B!JkcsJ!ccckJB!skcBZcssc)B1!1)!:B!!!Z{kR!!BRkk:ZckﵵR:BBJZcJkcZZcJB:sJkΥsckΜ֥֭ޔ1B挔Rsޥs{kBBB{sֽ挭{1!ZZBscsŜs֔{sc{ֽֽŜΥcskZŔsZ{cJJR{sJZckZŜRJZ{s{cs{sRkcBJZRs{ksccskΥ{s{kk{sccskk:1kcsBBRJZsk{c{kcJBkck{k{{sΌ:Rsc{RRZBBZkkBkB:Zc)Z{ZkkcR{Z{RR!!)!1!B:R:Jc!:1B)!1R!B)Bss!cJBB!!)!)JJR)B11):1RBRB1R)1cs{k:R1!)!)kZkccRRJBc):!1!)JJRJRZ{B1!)!JZZkkBJJkB:1sJBs{B{cΜ{csssk{ŔssΌޜscJ{֌ZRR:R:R))cRRֽֽJckcc1ń{Z{s{cBs{֔ńs{{cs֭:R{Ž{RJ:cRB{JBc{J{kkR)ks)cs{ZZ{{RcZ{cc{s{sZZZZsZBZsc{cZ{Bccs{{cRR{c{c)!{J{Z{:R{{JkZZZkJc{ccZcZ)!BBB:R!)JZJ1))1):J1:Z!JkB!R!:RZskJ1B!:)):J!1::B1kscJZcJscBBB!!k1:BB:!1ZckZsccZB:J1)B{)!J)B)Bk:s{{::!:):Z1c:sZB1:B)kJ::{Ō)sťscksތť:!Rcń))B1Ŕ{1:BZΥcޭ{ZkkkssΥ1JZ浵Υs)ZŔ{sZsJZ{ŌsBέZJcZ1:BBkRRRRsRkkcskcBŌ!Bsޜ{ckskZsc{{{{Bscsss{cskZc{s{{ssccc{s:1!:B)Bs1sRkRsRsk{c{Rc{Zkks{kk:::sB!)cZZsBk:):!RJ)))Rk!):B)!1!:J))c::1cZkRR!):RJ)!)1:):RZRR!!s{skRZkJB!:)1R!!!)Zk1BJksc1)JcJ1)J1JJZkJ1c:!:Rssk:Jsc:BJBRkJB!s1{k֭ZR{kss{kk{BR޽k):R:)sZkZ޽浜Jk1sJkB)Bk{k1)!11)R{kJkZZ:){B:Rs:)Z1JJk{ckZcR{ccJZRcZ:JR{sccJcRRkckkk{{cJ{RkskcsRcs{!!)ZZcRckJJ1RRsc)RJR))))!))1BcsZBR{ZJ{skcsc{Z{{ZkcZkc)))!BcccB!!:!::B1c)!J:kB1!!Js:B:1sBZJR{::)B):1B1ssZZ!!c{sksJJJ!!)!c!){RZJBc1)RJ:))RJ!JR1ZkJ{{)!{c!Zc{1ksRJkBc1έJ{քZ{{ckkRsεŜ{JsΜ{RΔ޽)!!!Ŝތsss:sZkZsZkckskksJRŜZJB1!!11!Jk11)JZBRBBΔc)::ZBcZ{JsBRZ:scssBsscs{ŵ֜kZZBR{s{{ZcksZ{s{BRBZZsBZ!!)!1!!:JRJB1c))1BB:J1)B!!)!!R:J::)1Rk)JBk{kBcJR1)RR))1k{cc)!1J1)c1!:Bc!)!cZ!!R!):B!{kkZkJ!JBsRcsR:))):޽sJRsZkc{ssR!:JJ!JZBRsR)!JZ:!)1)RBR!1!ZkB)ckc:!!BR{JJs1!kkkBJ)B{k{k{skkssckckZRR{Rc{Rֽ{Z1cפּֽscRsZccB{s{քsŭZ1BJ{scsZ1JcRJRJksZ!)J:BsJ)ZsJkRRJcs{c1!:BsksJBJε):sks{{kքkcscRs!B{JJR)!!!1)!!):!11)11{1:JJc11!))!1!!!!!c:!!1)1)!!!!!BBZcs:RBJ)!R1R:))1B::BB!BB1!:1B:1!):JRBkZ!!!ZkJZkZRcRc:!cRsŌńkZ):cc{kcR!1B{{J))1B:1!)1ZZ)1::JJBB)sc:J1Z:1B11kckc!)s{Jk{Zcc:ssZkkskRkZRJ1{c֜ΜZ)ŭk1)ksŽBR{:{R{RksZJZֵZkskk{Z:B1{{ZkckRRk{ZcJ:):)JBR{kZB!:k)Zck{{B!):1J愜ZkRBscZkZֽsέssc愭{RBsJckJ1ZsRkB::!!!))!:))!!RBJsBRB!):!!!1!:!!!!!!!:!!!!!))!B111:{:B!!JB)ZJBBk:RB1!B1JJ)!11c!)!1sJBZ)kZJ:RsZ:B))JZ1cννZkkJ{scZRkJk!RRJ1:!B!1)1):R1!)::11)!BBc1BB11!111Rss{ck:{cssss{Rks{kJsk{RRZZJJRJcsZcRŜk{ޭ{R!R{ŜJJ޽޵ֵZJkkckJZŜZc֥{ck1Jsֵck{skRRsέŌs{{JJcBcJskZc:Z{cccs{ck1!!:kJ{εk{{cckބk{ssRZscs1R)Z1JBBBB)B)!:!B11)!)Jc)1k11kJB)1!)!J:))c!!!J!c1:s)!!!RBB!):!Z:!11BBZRk):)J11):J{Jc:JkZJZ:JB!!)1)!11)ck!kk{ss{Zc1!J:1!B))11BB:JB)!)!1:))ZBR!::!)1::):JsB:::kJBJR{kcks{{{skRkssZkc:RkZcccs{ΌkJ:B!)c֥{֥R{sRcs{s޽scksskk{sccss{kckJJkkRR))BR)RkJZR:sB1:Zcsck{Όk!1Zk{RZRZkJkΌ{ss{cssZ1BZ)JJJ111BBB)!JR)!::)!R)){Zs:)cBZB:!!!!!!!J)!!!)sc:!!)))!1B:!)!J:J!))B::BZR!:JJ)B)!!BBJJ11:ZBB)!!!:RJBBkB)JRk!)!):{s:1sJJJcck{kkBBR!:kRRBRck1!):!!!)1!JZ:!Zk!1!1:)1)JB:B11J:JZkZJkZsZZRZsskε{{kZs{:RŔZޔJ)))1έŽJskRBBZsc:sRcsΜssJΥ{{εsJcc֜c{c{Z:!:J:))Rc{ccZR1J!JR):BB1:BcJJ)1{ZRJ:Rs{kΌk{sskZZJJk)B!!J1RkJ:JB!BR1)!:BB:c!!ZBRRB1:RJ)1)!)!J:J:!)!)!!!JJ):scsJ1!)RZ:!!)JJ)J)1!RJ)!:1)11!BJ!!)1:JsRBRJBB:JB!B:)!!!!){Z)ss1B)::cs!RRZJ1:RckcZ1!!!B)1Zc!)c:R)!))1!B1!B)RJJBk1{s1{{ckRkZcscksssRޥRZsZZZcŜs楜νsJ:11Bsk֔k::ŵΔֵ!JsνsΥZcR:RkkRZkZks޵JckZRJJJ:)sk{{ZBJc)1RZR)B1RB1BRJJťsŌccZcZsֵsRc{s{{RJ)BBB)BJJJ!1BZ1J:RB!!BBBJ!:cRJ1JcR1RRJ)1)!)1:!))1BZ!1B!11!!R)B!Zks{{BBcs!!JJ1)B))!:11)!!1!):B1)J)B!!1:Jk:JZ:Z::B:BRJZ!RBJsRcZ!1cZckBBB1JJ1!!B1R!J1)B!1Zkk!))B)cs!)::1):1)BB1sRJBBZZZ)11{kZR:ks{{{{֔cs諒{kkss{kΔތZ11!skŌ:RZcRތ{BsŵR{{Όsc:B)RBRkskk{ńŭ{ck1):1kBZJcccZBsJ!J:Js)R!RJRJ:cޥkRcs{JZ{ksZcRssR)s)::ZR:1:JJ)JBBJ1B1BB:RB)RZBJsckc1:1))!)11)J1:R!:!J!B1:!:!!1)::!JsJ!J)c:)B{))11B!!1:1BZ!1)!!!:!)BZ:BJ)BJ1BBZcB)J:BZJ:{kBZBcs{ccskB:B))B!)):!BBB!B:)ckkJ)):))B޽BJ)!)JJ:11)BBJ{cZBks){c:sZs{k{{{{{sk{cRskJcεR{s֭ńkJ{R:B1s޵k::kZ{cs{Z{浥BRZZckRR{kέΜ:1!!cBZkRccRs{c1JRcB:):J:kJccsZscJŜ{RR!1cs{{c{s{ŵkcc{Z){ccssBRRRJRck))R:1BJR)11:Z)J:cZJRJ:c:ckR:111)!)!))JJB)!)!!:J)!1R:J!!!{BJ))1!1B1)!1BZB:RRBZ:!))!!)))J1)!B1!J!!:kZBJ))Z1{{{{ZRcs{cB1!!R:{))R)!!ZB:)Rskks:!!!BJBZ1:BsB)11!)1::11RB)B1Zc{BB1kkRsRkkks{ksZ{{BZJB:JRΌk{kRc{sŔŜcsΌ֭ZBkkZZΌcֵk{c{s{skk֥֭{{kk11:kk{ckJ:cJJ:kZ1))B{kJc{RcRs΄ZZBBJZ1Z{skk{1skkJkRkkc{{JRJJJcRZ1BZ!)ZZZcR))J1cc:)J!1B!kkk)B!B1B1:))!):):1B11!Bc!!!:JRBs!Z))B1!!!)sk!1R:)1!))B1R))!!1BB:JBJ)RcsB)B:kJk{Z!c{sksZRRck{R!!:BsJ:!!)1!ZZRk)1J)!1!)B!1B!1BB!JkkskZkRc{RR11BB)ssR)JRJ{ZsskssccZJ{cZcBJBJkRZcs֔kc{Rs{s޵ŭcss{挄RέRk{Όk֔sccs潭kkcJZ{JR:1::J:RZc{RBskc)RRk:Μ{Zc{cJZsk{ccRZΜsck{Rk{{Bs::JskR!J)B1RJ:Z:Zcckcc:1BkksJR:):)1JR:!B1!)):)1B:!!1BB:11:!)::1J:!BscZ1))!:))Z!1BB1R)J:1:{)c1JR::!:::BZBRcscB:sskk{RJZ!1)BJc!::1ckB!!B111J!J:!!!R:1cZkskk):c)1:ZBkkJZB{RJ)!11R{JBcJ{{ZBZ{skZ{{kRcRZ{cJ1c{Rk:kkkk)愜{c{{ss֜{֌k{{΄B:BJZRsJcskkń)BRZk{νJc{JRcZcRcR1k:J:RckZ1R{ޜJR{kck֔kBkJcJZcsksZBsss{cRsk{:B::JJ)RBJR:RJckRsk{{Rc1Bc1JZJ!!:)kJB!B!1:1J:!1!1:B)!)1!Rc:!)!!:kBZkJ!!1!:))s1)1)c!)11!1:ZcBBJ:JB1)!)1J)Z{{{csss!)1:!RR)!)1JBJB:1!!):Zc{s:B:kkZcsc))))k{cs!!B:BBB1B!BJR):!:BB)cBBRckR:RkkRkBZk:BZRcs֜scJs{Z:!:{sckc{csss޽s{{kΥ֭ksν{JJB:1kν{kccZZc1ŭcJ):cRBssΥεRJ!:BBJcZkJcZs{cc{cBkcZss:ssΥ{ccńc{JRkŜscs{{sk{{{{{s{{sZ:BJJ:1kBJsRkZkJkRsB)kR1:!!1B1Jcccck!!)!))1111!!1:B1!J1Rk)11!:Bs1!JR!J!!)::kRJ!1!B1J11!1R)::!!JRJJJJcZ:R:!:ZZ{cJs:))!!!1Z!:!1)B1)::!1JJZJZss{kRRs{scB1BRBRJ1B:)):):1JcZB!):BRsZ:RZc::cJJ)::::JZ:J){ccZR1:!ZBJsZZks札c{{εΜkkJJ!Ō{1cckŌZcBkŔsJ:ZZRsRs{εޜZ)!R1Z!ccZ{{kR{sJc!:s{c:{s{kZέkZ֥޽Ŝ{kRZsskksRk{k{Zkc{ZJ!B!{RRZ:RksJR{kkRJcRZR:JRscZZ:!B1RZcBkJ!!1B11))!::!!!!)BB!!JBRs1!))){111:Zss:J:!)!!kR1!!)!:1:)JR::)B:J:!JJ)1Zk{{cksB1):{)!:JJ!1J!1)!!)RscRkcck{Zk{ccJ::ssR)):1!!RZkRcZ1J!:c1B::){Jss{sZskkZ1ZB1B:JZcZ{!B1BkZ)cZJcZkc{ΥZsŭ֥kkJZBŔc{JŌs{JkJcsŌ֭scΌZ{kZRRcRZkk{s潜J)!:):RZcZJRJsccRJJkZ{cRﭔZŭRcRkR{{kZkJ1!R!JRZ)1JB:kRkcZkBsZJZs!)Z)Z))!!1RZ{ZJR)c!B!!1)BR!)!1:B1)1kRBc1BJ1!1)ZkZ):B:1B)):1!Jk:BBB)!)J::J!::!R1sc{cJJZZcB)1R)!JB1JJ):)!:)!Z:Z)!1)BRckZckZBsccJB!!!::::1:)ZZZ1Z:){ckZRR){kZ:scJ1ZJJkZRZRB:k{1::JBRcJRkJŵs{Zs{{sskssεńsR1kkZcBZBJkscB1sZJRR1Rk֭Z:)!!1)ssscZ:RcBk1Bskk{Zkk{k{k{k{{{s{cckk::1!c)s1)ZJJ11sRRBcs{Z{J:Jk)RBJJRsZJ:)R)B!):Z)::1)):R1J!!1!!:!B1!)1RBZJJ!):!B!!!:Rk:R)JR))!:J!1J:)!BR!!)B)!)Z1ckZc:!JskRJBZk{R:J)1)!J1111!Z!)!J{RB!BZks)!Z:ss{cc!!1!cR1!)s!css!{Rs1::11k{s{cR{kJsRBBBRZR{R:RRZRsssΔkŽބZk{Z{cs{{kkJRkŜk)BJk֭Όkscc޽J{ssZZcέk{Ŝ֭k!ZBRR:k{JZckckZ{{ք{cZsZcRcZRZZsŵ{ZsRk{{{scskkc1:ZcRR1B!1!1{RckZRcksRZckcBkBRB!1JB:RZ!)!!:111)::1:BRBB:JBRRJkRB11!JB:cB)!!R!!!!!!JZRBJ1):BZ!))B:RBB1!1:1)))B:cBJ)!:R{ckk1Bk{{)!!BBB1c1:Z1!ZBBkksc{Z!::BBJscR)cZJJk:JkcJkB){1JB:1Z1ZJk){s{kcŭsJs:RkcJ!BBRB)Zc{ť֜ssckc:)ZkΔkssZcB:ťέsk:R{νŵŽkc:޵{JcB!s{B1R:R1{kskksZń{kRRZkc{{R1ccc֌kJ{{kks1c{ss{cRBJs{kB1)B):kRkcZ{kcBB))!R1J1BJRJ)RZJJB!1J!J1Z1B!1B)!Z))JRZcsJ{Z1)csJZJ1)J)1BJ1:J)Z1B1111!:B)!J)!!:!Bk)!RRcJ1!ZR!)!)JJ{kcJ1Z1Z!))J:J1!J)!JJcRZZ)!))B))B:!!))1R!RJcJsB):JccB{Zc1ccZ1R1BcJckksBJJc{k::1:RB:RRk{{kcέcc{{Rs{Ŝ΄:RscJ:{ΔJJ:sck{sZ{Όޭtskk{s)RsssB!ZZB{ccJBc{sZZZc{B:{{ŭŔk{kssckRJR{ksZ:cBk{{ZcBkJR1ckkckRks1ZccZJ!!1k1BB:B:JBBJ:B:::JB!)c1!1:J:11)JcZRkBBZks:B)J:1R:1:11)!!:!:!!!B!B1B!!!B)!)JZcֽscRc{kskk)!:!BB1!)!Js!1JRRZJkk!c!{{cB!JZ)!!1BJ:)k::R:ckB1)JsJ{JcRJRŽ{sBscB:ZZc:1JZJZJ:JRBc΄cΜ֭έεcs挭RJ1:J:ޥ{:1)RZ)RRJccccssŽ֥ŵskZJk{kRsZJ:)sBR:kkR:Z{RZsRckkk1kΥkksޥ֔csBcZB{kckc{kJ{JRZcsck{{cZZskB1!)BJRR11R1RR!1B:1R:)B:RJ1JJRc{Rc1RB)1!J)B!Rs{Zs1:::1!J!)!:))1Z!!))!BB)1:)!BJBJskJBR:BJ!JZ)BJRJJ11!1B:ccB:sc1cks{1J:Rk!!1!)1::::1J1BJk)1ZZs:RZcJBRB!RcZZscc{RkZ)cZc:)BBJZJJcJB{kcZkks潔{{ZssJksތsRJs):BRZcRsZZJ:ZkνΜ1BB)J޵1!RZsZcRssscs{RR:ZsRkkֵŵsk{ksssckk{cZcsZkR:JR{kJBksBRk11)B:11)1J1BBRkZ!!!)c:ZkkB:ZB!:JkkRBJ:BJ)1!J{sc!!!):!:):B1!B1)B!R!!11!)):)!)!!B1ZcR:)JJsccRsZRBRBcks:1J)!1{B!c)!!1ZJJZZkZkB)R!1Bk1:!R):1csc:!B!)!Z!!Z!BsJkkscss{JsBcksRkcckRZ1:sZcR)ZBJ1RkR:ssk{kZccZ{ބsZ{sRR{ZZJ1JJޔ))R!!B)Rk:Jsc)B֌{{֔{{{Zs{ks{sJcsskkRsBBk{sRcB{BŌcJsΌskkss{k{{kkkscs{{{c{!RJk{cRcRJc:)J:RR1:!)1:{)JZJ):kJB)R:BB:Z:RBZRB:B)!1!:Z:)1Z!!1)!:)))!))!!)1!)!)1!)!!B:1)BZJRccBB1RJZBZkR1cc{k{{{k::1!))R!JJ1)RksJkJ{sk{JZ1)!!ck:!1)c!)!!B!Z1BksJBRBk:BkJk:ZBccJBJJBRJBZcBZcRcJ:B11BBJkscBskscscZsZR޵s)1:JsνZBs֭:)!!c:Js!cZJc{{ŭŔ!1ZsBc1:k!:ssckc{{ZkZ{{c{ckBZ{ZssZZBcRJcs{1BZZs{csR:B)BkckR:RkkkJJZk):J::!)Rsc1ZJ)1RB:!:11:sBZB)!!!1!1J!:B!RZJJ!::BB::!:1!!11:!!:11:1!ZJcR{R{RZR:kscRJRccRkkkcc)!1cB!!1!)JJckRcJZBZc:scsZ::B)Z:)!BZ)!RJJR:!R!c!:)!R)!ZJ1JkskRRZ{R{ZJZJRBZcBZJZRJkcksRZJB:朽{ccνBR{ŽssRcRRJ{1JJBZkksZ:kcZ֥ŔB)1!!:J11sRs:{{RRsJsscJkRkc{ZZkksZքŌ{ZssssR{kRccZRcZsc{JJB!RccZkR1JZkRJ1!RRB)RR:1!:ksBk::R::Bcs1!!!BJR!:B{RB!):!:B1::))J1)1!!:J1):1)kcsJZZ11BZRkkck{{BRksc1!B!)!1)::BJ:cckJcZRcJkkc!BBB)R:J1)JZ{B!)B))JkJR!J1ZJ!RJ:!J{RRskޜs1JRB{ck{cB){JZZcRBRsB)k1Z1BB{Rc:Z΄sskέ޽Ō:{ޥŽ{RZJ΄B1RkތBRZs))έJk1ssŜ{R)11!R{Jcc:)s{s:ck{B{csc{1J{cskRJJŌZ:kkcRZccss{sckRcsZc11Bs{sZskZRBBJ1JJBRZskRZJ{k{kZ:)Jk{BsB1R1Jc:)11JJ!BJB!1)!B)!::1)B:!1!:!:!J)!!BJJcc:B{ks{ZR:)!BsZRcc1Z!:JB:!!):ZZc{Jc:RBRBsskkJZZcZB!11!)J!skkc!)cJ))B!:!Z1)ccskksRks:{:kZ:RBZ1JRcR!Bccc{kskkZ!J{::)R{1BsZcZs޽Z{k޵ֵ:BZRR))cŜk΄1Zť{!k{cZ:BBZť{cs{{scJskc{ZkJkZsJ{c{{֭{kZ{skcc{RkBJ{{BskR:sJZ1csRZcBBZ!csZZ:J{:ZB:ZZRR!!!RBBRRkc)1!!1BZ))!!Z{1R)!1ZJBc)!!!!BcJ:c1RJ)):1:c1!J1BRJkkkJskcRRJBΔR1J1)c!!!!!1!:JR{k:!RkZZBJJB)!1)B!!))RR{{1:BBk{sB{kkkB!RZBZR{sksJkZ:R:1::JRB:))1RBsRsJR{RRc1k1):!){BcJcBεZŭZBBcΔss{1JB{kŌccRRZέJcRk{RsRcks1J:s{֜J{{skBRkk{{s{cZsJ޵kkJZsRcJZksBJBkc:JBB1!kcc1)1Z{ckkJRZ:)1{BR1RkZc)!1!B:!!!Z:R)RRJcJBZJJ)!!)!B:JRZcRBJJBJ:Z!!!JZJ:BBk{{ńJc{RsR1!)111!!!)1::)B:c)c!!1JBcZ:1RRRRRZ1!:J!)1)Bkk攭JkRcsc{J:{s{{Ŕ:k1cRskZc!::ccRJcB:!1ZcZsZkZcR1)JZB1BR1kkZcBc{Jޔ:Bcť愥)BB1JJRckc{k{ks{s{֭֜c!1{:s{Jcc{RJ11B1k{kk{{BJkcBZccc{kBRkc{{{{scR{cZsckRs{{kZkkRZckcRRk{sZR1scRkZ)ksscZJs:k1)JBRccZJ1{Zk!!))!!BZZ:cZ::B:JJ1RR1ZsJB!!ZZRBBZJZkZ):JJBR:ZZ)!!!!!1::RZ)cŽks{s!!11!!!!cJB:csJ!1:!B:JJkB:J:JBBZ)RB1!!:Rc)!k11111{:c{c朥s{JZ{{{k:)JRB11Bs)1RJcZZZBsZJ)!)1:!JsZRRRs{BRkJJcνΥ֭JJZΥ֜{cZcބνńZ{ŭ{{sŽs:ޜ{c{JRB)!:cޥc:cZ{ZkcRk{BB{ZZ{:RBcc{Jk{νskcssRk{ZkZRRZZcc{RcZB1JBcc:JBRksRkJ1ZZcJZk:RBsB!11)):)!)c1JBsRBBJ!JBBB)BJ1J:R:)RR1:1:1!!!JRBJJZBJk)RZ))JkBJJ:11!)1)!::1Zŭksc{c!))!)J)1)B1)!!B:RsRcB)):))1RB1kR:cB)1!cRkc1)s:J1ZR:)J!!B)!Bs{ZJ:JBBRck!skZRBΜs)B:)kBk:){RJ:cRkZRZk1!:J!BJ)ZsBJJJZBZ!cZJcsRRcckŽRksνkֵŽ札ތΔcRsc{ńcscֽR:1:1::Z:RZ{{kskc֜skkR)ssRcsRֵRZZcsscsck{JRRRkkRZZRRZ{c{1ssZcc))JkcccR:scR!JskRk!1:!1:J))!1kkJBcRZ{1R:BBsRcB:)RJB::Z:1RB!R!JRB::)1))BcRR:J!ZR:{ZR):{Z{JJ!!!1:!RksBRBZJZBskc{JBk1JB1!:):!1!R)B:)JRBRkZJ::ZZckscJR)!))sc!Zs{sc:J)1s)BR!!!1J{ZkZcJZJ1)1:ssss:1csJkcBZRRJJ:1:)sRskkkRZBs{s)Js:)RcJcsR{1cRJc:楄JZJJJZ{ε{{ss֥ks{:ZZkkZkJZ!1)!B1cscRkRRR)k{Δ{{RZs{֌kJcR{R{{ŵBckRcsZc{JsRkJZsZskckck)!):1Bk{sB11))ZJcBJ!R!{JZ:)RRZsBBR:B::1JBBJcJRR1BJJJJ:1R!JB1:k::11)1BJZJ1:1cJcBc11cRsk!!1JkJR!!!:k:sk1sB!1B)JBc{cJ!ZJ!!))!!!1)BB:!Rs:kZ:ccZJkcksk:)Z11Z1s!!:{Rs)J):΄քZcZ!J:sccZckJZZJRk{Zk)kZckZBRRZRscJkR{RZB))BR:ZJBZ:R)!sc!kZ{JRZcscZck{ssc{Υ{Rcޥ{ccńcJŜRZ)!!!!JcBksc)1Js{kkscsc{cskZs{{ބ{{RB)ckkckRscsc{{{{sksZckcZB:)1RRcZBc:Bs{)!!:Jkk)1B!)!!1:11Zkc!1JB1JkJJBJRJ)1JBR)R!ZRJBcZZR)R1!:::)))J1)!:ZZk1!BBR:cZ1s{J::)cc)!)cZZk{ޔcRkR!)))1::!)!))!1JZkckZ:Js{:s{ccZRRBsZ!)Zs:::1Rsk!RJ)kRJk{BkB1!!1Bs{ZsR:ccRB!JRkZ{skskB{k{ZZkcccZkZks1!:):kkB!:1:{k::skc֭R:cs{sksskZcﭔΜ{c{{{޵έ{RkRZ1RZ{BRRcBJ))!s{:{c!{kJc朔kJk{sńcsk{csskR)sssccZkRc{{cZZccsRZsZk:11B11R!!::1:css{::1ccZZJ!!11B1:1RR)!Z{c)JZ!JRcBR:ZBZ1cZBR:ZRBZsk1BJB1k:1):B))1JJ1:R)BBR:cRZsZ!::JJBBR:!!!:Bk{R1sR)!Z):)B):!)JZ)k{Z:s))scBJR11:1!1c!1RBJs1!BZ!):{RsccB!)!!BJ{kcskZR:R1RR::BkcRZZkcRs{csscksR!JB!1BZJZJ11:R!cZJkc{Rskss{sc:Zkﭔ{RkΥťJccRsZk޽{ZkB:kcRkRJcJRkJBsBJkcR{c)sޥk{RZckcs{skkck{Z:ŔkkccR)1):)!1kcBZJ::J1R!:B)!)R)1sks{c1{J11:!!J!!cBcsc1BZc)!kBB1ZRBZs{s:ckJs{c1RksBkJcJBZ!))!Z:c)B:1RJBBZR1:BcB:J)JJcJJZkZ!R:cc{J!1ZcBZ!):JB:ZccskBB:BccZ)k1:!JRB!Bs:)!):!!):R:cZJJ!sc{Rs{kZ))11cZkBBJcZ)JRRJΌZk1))s)!Jc:1!cR!cBRRB{Z{sc{c{{kJZJJssJcťŽŜ{{B:{Zc){kB)scksRBRcskZksRsZB{{ckZskZZ{sk{{{sBJ{{Jcck{Z{kkBB1JJB1:kJcB:RRR1J)){B)c1!B!c:BZBkcRkkJZ:!1:):!:)RJBJcRRRRccBcRcB{ޜc{ZZ{{sskc)1RR1):R11)B:1BR1BRRBB11!RBRR)RBJskJ)!RcZZ{J1R11!kk1!!B)ZZZJJJ:R:cJB)JcJcBkkk1!Rs)!!1::c!s::kJk:BBkRZkscscR:BRcscB):ks{Z{ZZ1!k1!BBR)!c!:1!:c{s1JBcckkkssk{cckZcBJZRR)ckŌk{cs֜s{kJRZ)JR{csJZsBs{kckkssZJ:cskkccsZZk{ccZkZsskkZZsss{JZkZc{:ks{s111B:RR:J:R:RJ:BJ1:RJ:BB!J)1ZZJZJ1{B:sB!k1J:BJ1!!!!!JJBZBBRJRBZ{BcRkc1cZcBcs:::R)k)J1JBJZJ:RBJ)B:BJcZJRJJ:kcBZ!)ZJ)R1!!1c))!!:BRRZRR!1)::BRRRR1{RZ:RJRZ!)1kΜ)1!B!JJJ:!J1J:1:RZRJ1)Jks{ΥkcJskcc!11ZZ{Zc!1){kR)B:s)::B:!)1:B1JRcBZZcBsssscckcZJRRBBZZsZ{{Ŝss{sBBZJ{c{ΔJZZ{R{s)BkkJ1{ŜZJcRZR{{{cc1RJZ{ZcRRRZ{kZ1Bs{scRJ{ckc{s{!1s))1R11ZJJ:J:BJBJBJk!!1)!!BZ1!JcJ!!J!B!)!!!BR:ZkRRR{ZckBBBZRkJ{RsZs{{{ks::JBJsB:B1:1)1Bc!)):!cscR)JBRJJR!!BR!)11scR1!11!B1BZRZcJJZJBR):ckZ:JBZZJZ:J!:1RRckJ!c:)ZJ1kRJc{ZkZBRBZcJk{kZRckRJsZRks{RťkkZBŌ)B1R:s:ZB:!B:{RJcscJ)RRRJRB{kRJZBkŵŵkń{ZRJJZsZkŔ{c1ZRkJR1ssZZŜsRcckZRRkc1kŌŌkRR1cJJcckR{BRkRkcZ{{skRksJ:csZk{{!!J1B)cJR:B:))1JZJ)RR{Z11::)1:)!cckJ1J!JBJ1)):1ZJc:c:BRcRJRJR{Jskkc{c)ZJ:ZcR)RJBB:!1:)!cck{JBJB!::1!)R!)))1BBZRkccRJJ::BZ1sc:{)c)Z1)cŭ:!)1!!1ssssJR{ksZscJRZZ:::JRkŌ{J:c{{)B{sRRRJcJRJ1B:)Jc1R11!B!::1Zk1BsJ{RsB)ksRZRssc{{{sskcc1B{B)J!)JJcRcJBscJkJc޽k:JZ{k1{{{cZ:cZcBRsc֔cZc{Zk{{sss{scc:ZZZRscccΔskRBR1:)!JBB):)JZ{Z):)):ZRR:))J11)!!)!!::J)1::JRJJRZRJZJBRRZZsJkcZc1Bs)s{c)!:Jk{R:BJZR!kZc1:ccJ1JBBB:Z{{cB:B))B:RkZZBZJkZ{ccBBcR{Z!Jkε!:Zc!:J)RcŜBZJ{sksZZZksRZ11RBZ1:{s{cR:)BJsc{RJRBcBZB:!:!)ck!B1:!:)JRBZ:B{{ZRZkRZR{֭scJZcs::cJ)JRcRk:B1JBcRksskBR{cJZJB:s{kZZ!{{sJJJ{ZޭskBsŜsckZRZZsJJ֔sRcssJ{ŌZsssZZ):B)!J)R:::J:B1JBsk):J!)1!!!))!ZcscBRBB)!))JJ{cBckccJkZBRZ!J)ckBR:1RsssRks!!):)1J{kkkR!1Z!))k:kscssZRJRRZZRZ)cJ!cskk1Zޥc:JZR޽JkckRs1B11:J:11)ccsBZBcZRRBZRZR))!kR:cR::::B)Jc:RRskJ1BJZksBJJRkŭޜޜJJZkRcBRZ1ZBBsBRZZk{ZR{{J:BRJ{kckRsZZRkRJ::sεJJΌZckRBcsBBJs{s:Rń{:Jss:ckBZ)!1Z)J1:BR!kBcBJ)k1)B1kRccJZRZR:!!B)))ZkRccJckZJRsckBBk:1!)1):!!1):1JRZJZ!RkskR!R!!{BRR1JB)cZB{kR!!):!):B):!!!sZZ!ksZBZ:RBBsskZRBR:cJZkJJ{ks!1::JccZBJ:BRR:!!B:11ZB11!11)BBZ)BRc:BZ)JR:{JJńJkcJck攜{{ZZ{Zk:JkJJkBJJRsŽZZZZ:Z)s{{sskkֽscZBc)RR1cŭ{sskZ{sJ{J1:{ތ{R:Rscc{c{ZBsZccRkR111):!11!!:1k111B:Zk1:kkZRJJ1Z1csc1kJJRB!JsJss1BRkZskckZJk!!!!!1)J!)1!1B1R1!1JJkc)BBRZ!!)Jsﵥkk1)!!Z!JscckBZJRRZsZkcJ!1c!R!1R!R:k{:R):c1sccscRBc:::)))1BJ11)k{RssJRJ:RkBZ:JRBJ{s1BJ))cR)11:!:ZR:JZRRcJJRRJsJkc{ckkkkcZksRB):B:R:BRZkcBBBB{ZssΥν::RBk:RBBBRBck{ΜsZcZ{Z1c֥{{ksRJk{sskZcRc޵)::BJ1R!!J!!)R1)!))))!:s{JRRZ:JJJ:cBRRZBZ!)Bs!!sskk{)ZZsssckBc:)!!JRcZsJRZJ1:sBBsBZJRJ:ZZZB:!)csc愄1)B)11JkB)cc::!!Z{ckc)!!!J1!!1:1!)ΥcΜ{sޭskZccJRZkBJBJZc1B11Z֜c1B1JBRZcJ::RJRs!):!1!1Z:1!:1)!Bc:R1ZBBRJZccsB{s{sZ:k{愽cR{Z{J:JcJRcs1BRJcs{sBcks{s!c{BBZ{ckZkZkkssckc朵kJs{scRs1ZcJZc))!1!::B{Z1R)!!!Rk{ZZc!Z{ZRBRZ1cBk:{cJ!{BJZ:s{{cc{J{Rks{ssZ)!)))R1!!JRRBkBsJZZ1:sckB!ZcZkR!RJR)BZ{Zs{k1)1:BZJRZskBJkJ1))kskZJ:)1B!))R))scJ)ޔֽ{{ŭkcs{s):c{cZ))JsZks)JkR1R:ZcBcJZBBZ!))!!)BB):)B1!!ZZRRJZZBJJckZc{֭{1ޭcޜss{{RRsk޵1Z)cR{B!)kRR{{kcskRZ):Jc{RZֵs{k{skskc{c{Z޽:Μcc޽kR{RBB{c{ss{R{sZkB)J!::!{skc1::!!:RR:ckkRRc:!JRJRBBZ)sc:Z1:cRZRJskssZ!!!!!)!:JR))c!Jk:Rc1!RsRJBscksB)!)cccck)))J!kkZccJJcZJssBJR!!!)))!1:)cތ:νޜsRsRc!Rk{:{ޭ{cskR)1{c{)!1!::!c:ZcRkZk{JkBJZJJ:JR:111J1)1ZB:!:11JZ:BJJ:RRZcRRŽRRZsR{kR1k{Rscks{kJZ:kB1RZZRBB:{B1Rksk{::B)RRJB)RJJkcc{ΌJRk{{ss{kkkZc{kscsRcZscZBZZccksRBJ!)RR:RsccZRRRRkcJkZJs:JRkBsks:RBJsBRks:Z{Υ:{Z{{kJ!B!!!)R)JBRRR!JZRck1BZkJsJ11B)BRccR1B!!Z!:cRJk)c:::B1::J:J)!!!J1)c)k)!!֥11111B:)!{{ތ))!Jk1R1)!11))1kcZccsZcJBsJ{ckBRcBBR:!11!c:)!1B)JJRBRRBRRRcJcsZs{kscBZssJckRks{Jss:B111JRc{:BkZB1)!)JRJcks֥c{ZkkŜJcZssZJ:攥sskB:kkcJBZJ{kkŭB1!cc:JRc{))J1:s:BRJRRR){1!BBZRRJZkRZRkJ)!Jεkss{B!!1!111BsBZRZJck:!Z)1)!Rkss1R!J)1:J:!)cJRZ1s{JZ{1J!1:!1B!cRBJBJJcޜ!:!:)B!:B!:1::1BBR:):!:!:BJ{c!:B)!ZksZRZJJB1:B)RR))!!:)!1:cZ1Z:JRRcks{cJ{sckcZRRssޥΔ{cB1:sZZ!JZs{ޔRkBkcZBJJkk{{ޔc{cΥ{sZ{ksc{J{skZ{ccks{{sk{k:BZks{k)!Rk)):!csB{ZRZZBB1ZkccZRs)!RZcJZ)!k{ֽ{kZks{csZJ)))B!RZ:JZB)kZR)11!JR)ZZB:R)!BB:!:B1)JsJR)!!:c::)JJZs!B{ZRR:J)!1ZsB!)1)B)JJ)!!R!)!R!!c:BkBkJcJ1B):JBB!!!!!!!)!sJ:J:BsJc:Js{kBR{{kZsZkZkR{kcsŔ{RkZ:kcsscc{BR!JBZRcZcJ{sk{΄kRssk{浜ss)11ssRkcsZR{sk!1:Zscs{BJccBB1BR{kkc{JRJJR1J::JRRcBsBR:cZ:!)kk{{RcJZJskJ:)1):!!!)!!)1)BB!)ZJ!1!)1:JZcB):1Z:sJRkJ!!RR):))1B1:::1:)R::!!ZŜ1ZŌ1:BRc!k)1)J1):)))1Z111)!B:1Z1R1JJJZBRRBJ):11R1J)!))!)!::1BRJBJRskZZBkkε{ZkRsRBkscsccc{kkscJ΄ZZJRBkkJcRBBB1cJ:!cJ!1JRZZ:cZZ{k:cs{ks֌ŔZ{{c:s{R{{{cZ{BkRJRsk{{{sRZsR1!!{kssBcZcZcJB1s{BkZ:)Jksc)Jc{{s)!B1)!)!!)1B)RRR1:!!!)RJk:kZ1):)J11BksJc1)1!!)1!R!s{!!{Z)JJ!)ck)cZc)RcJR)!cc)!))!B!ccR:Z:k{sks1J:1:11)1R:B!))))1)RJk1BsZkkkZccssc{楔RcBBcJsskcRk{ZkRc{ZBcB)1BB{Rkskkk:ZJB:B1ZZc::kkskkk{s{cJ֥kńsss{cR{B{kBks)ckZZZ{cJs:!!1:csk)sJk{cJZRJkckZcBkBB)kk1!ZZ!:))1J)!!B!1)1!!)BRBZc:1))!RZZsB!!1):::!JJJ!1skZZ!1)RZRBRZ1))Bŵν{k:Z)ZR)R!Rc)!1:cR):):1!)!:cB1RJBJ11!1Bk1)cc1B!)!!!!ZJJJBck:JZkZ{cskkε{ΔJJkJJsRssssZJJJZJ1JsZ:cZ1Z{scJs:11c1BsZBZRBR֥ZńssJ{sޥkkksZcs{ν{BcJc{kJ{Z1ssRkZJ)R11:1J{kk:JsRc{JJZkBBc{{{BJJZJssk)!!!!!!!:1BBB)ZZBJ{BZ!:JBJ)!!!B)1)1!!Rc:BJ!!)!ZB!:JR!JRcsZsk:)!1:!1Jń֜kֽkJZkB:1B:B:k1sJZ)1):!:J)c::):c))JcJBcsRBBRJB)B)ZcRJc:c1:)::B)R:JJR1JcR:JRcZkk:cZ{Z{ŭŭ:Z{{RsckRΥZŜ)kRZZ1{s{ťskccJRkޭZJB1:k{JZ:k{ck{քssŔcJRZsRZZRZZkkc{kZcZ!))!11{JJBkRssskZkBJsR:cRssJZ!!!!BBJZc{Z1JcJBB!!1BB:)11J!1!!ZssRB!!:1)ZJcZRJ1!k{cZc1R1!!!s1!ZBJB!!11J:c!)k:k{!ZJR!!{Bs:!!Z:JZcŌJ!sZs1:Z:B)R:R)::11ZB!:1JRJJ:R:RRJBcRZZkkBZc{Zskkcŵŵ朄scRk1J޵{skcZJZkcckZJc1{{{cB):BJJR{{ֵZkkskksZcc{JBBk{B{kťŌZZŌ:kk{skRskcZcRc1ZB)){c{R::cRJsBR:Zs!{kBJkk:RZkZkc1!))!)RRZ:Z::1):k:{)1::)Z:J!1!!1:!:ZsRk{J!1JRBZR{:1))k{sR:R:R1c{sB:JkR)B:)R:)BZ)k)!J)ŵcB)11!)!Bkssc:cZRk!k::B1!:1J1::)1Z:))J::J:RB1RJ!RBZs{ZcJcZkBJZZcc:R浔sJB޽JJZJBcsބkccZBRc{csckc::)1)!11Z{BZJc{skZZkZc֥scZ΄Zc֔skk{scck1)skc{sZJRsckB1!1!ZkcccBJZBsRRRBckZRZ11)J1:JkRk:!1))!)!!:JcRckBkB:B!!B!!!ZZ!11):J!1B!)))!R歌ssRcs!1:BJRRZkkRs{Bk!)!k:))1{{:J)!{BsJc)B1J)1k1kkJ:B!1ck)))JJkccB1Bks:Jcsk)1cB!Z1JB1JB):R):J1!JJJJRR1kJcRBcBcB{{RccBJBRB!J:RRB{{ֽ{kZZRRJRRcRskcscJ1JsR1cRRZJ{1B!!:::J:J!JZR1B1ccsc{RZc{skkcZkZJkc{ZR{֌ŜZBJ1RJcR{kkkcBkcR:)JR!)!scsJBBRZRJssZJZsksJ11!!:!!::1!!!1!!1))1RkZcs{s11::)Z))BRsJ!):1:)!!!!1!1c{Ōkc{:1:BZ!BcR!ZJcZJ)!:11JcJRkBZB!!::1!)BέťJ!RB{J1J1sk::Μk)R1:J:R!!1!ZZsR!RBZkskJ))kZ::J1!:Z:BcB1s1:R)1cZZJRJZZRk:R{s!)!JRRB:BRBBZJ:JBJk浵ckkcJkc֜JJRJkBRsΜsZsZR::JJ):{J)BckZkBJRJBkc{{{RBBksZ:1RscsZsskc֌kRcck{BJcΌRZsZRRRJ{)k:J:1ZccRks{ZBc1cZB{kZRBkkZ)B!)1B1!!!)!!!!BcksZJ:BZ1:1!B{:JsB1!!1RZ11J!{{ccŔR:RcZk{!cZkksRJcZBsss:!):)kZR!!)1)!!!ccZcJkZŌss:)!JcRJ)J)1)!!1JssńBJkccckcsk:::1::Rkc1:JR)Js1:s1Zcksk1)):)RsZRZRR):kck!BBBJ!BZBZ!!ckR{潜ZZZscZ{sBcZ{kRc{ZBsťk{{BcRBJ)ZcRJ)R1:kBRcsssJZ{ZcZZkRcZRJ:)JBcť{sscΔZJkZsZ{ZΌ:1JcZRcR{{{ccJB!JBBJ)!cZkckck{RBZZ{c{ZJB::J)1!!11!1)))!)!))R{sRcZRs{)!B1)R!:J{RJJJZ))1)1)1Zss{JRRcsc)!!csccZBJRsRkRJcZcZ1csRR!!:BJŜJR))1cBcB)R!B!)Zk11ޜ{)R:JBkεJ):BRR1){cJ1:RJ1:1:1:::)1ZcZB)Z)1!){ZJ{sJBB1BJZ1J:B)BBBBZJRcsBBkֽkZ{{sss)kZsZRkB{JZs{c{ZsJ:ssk)J:1:BJkZckks{ssBB1Bs{cskskkcs{R{s{ZZk{ŵs:{kB{sssR:RBc{R{{cZR)ckJ{kRkkkBRJBs{c:!11:1BBkJJ:B))))!)))!::!1JBkRB)!JZskZ{BB{Z1!))!B:)B)1B!B)JcJ))!sBc{BJc!{::BJZ!:csks1քsZ){R:ZcRZJcJc)!)!1c֌k{{{{sk1sB֭c1:!{sJ!!)11::cBΌsZ1R)BR:ZJ:)JJBJJJ!R)1JkB:B1Jk{sZJck:1:ck:RR!Z:::1JBJcRB:ccJsޜsksc{cc{ZcBkcRkBckskk)BZZB{JRR)JcJJkk{ssJkksŜskkcsss{sskZsJ{ckJBΔcŜkBc{RcZޜZZBZ:scs!Z{ccskBBskZ!!J):csZB11B1B1B!!!Bkk1{BkRR!1:BZZccJ{kkkZsc)J)))ZB1!!!!Z!!)!1s11!!!JZքc{kZ:R{)J!1!R{BR{RkZZJ:)RcRBBJ1ZJ:!!!!!:R!ZkcZRJ)!)JsZkRc)R:!J)!k1c):k))!BJ:Rk:)ZkR:)J1)B:::1kZ):ZJ!ss)J{1cJ1)B1)))11J:1JB::JZBJc{:skcR{ssZZJkRZZkkZsZZJcJJBJJB::1BJkkZc{Zs{{Bs{ssc{kRZRBRcńkccc挌RkcZssńskRccscZZcֽkZ1)Bkk!RkRckZcJR!sZ{c1!)1!BkcsBBkJJ:11B1cB{Z1:{RkZ{RBJZZR{{kcssZBR!BR!Z)BBJ!B1!J)J:::1)B)!{{ckJZs1ZR1!:)RRRJk{ss{s֔BJJ)1ccsBB!JZRJ1!Zsބ{Rs{B֔s:!1c:BkB)!!1)ks1ZR))c:::!!cJ:!sR!)JJBJ!Z1:JRR))ZB):!::BJ)JJcBZ1)J)1!1B!!Bk:!BBB)B:BRJR1R֭ZkcRc{s:ZZcJZk{sc{sk{{sΔZcZkJZJBc):)BBRB{cRksZcRZckť{kB!ZZkZsJsZcs{sŔ:{ZBJkss{RRcR1RJJΌk)1Bk1RRccJkccZcB{s)!)B:kZ:R{BZRBk{sRJRscZs::!1kB1s{sc{csJ1:Rk)1R1))!)1RJ)R1!)1!!!kssRBBZR{B1))):)!!:!cZc:cZ1!!sք1)BZ:!!1!{c)B)))BRscRR::!!)JJc!R)c11k!RޜZ!!)):J)1kJ11!!Z)Zc1J1)11Rk1B!!):B1JBkR1B::BBZ{RJ:1)J!)!RBZJk)JJB:cZs{ΜΌkcRRcBJkZ{ckZskRZkcZcscZcRRBBJcJcZ::JcZk:JB:{Rc{֭cRBε愄{{kRRB:c֥{cZ:ZkRZZc{ks{J1BkRZJB:){sBRZsZJ{sksJRs):1ZJ{kR:cR1))J{kcB))))!)!kkk:))!Zkk:!1ZJk)JB!RB111)Z1BZR!!!!1!scc֌ckkZ1!1ZcZB!)!!1:)Jkks{:)kεc)!B:1B:)k)Jc1R)RcJBBB))B)1{kZ!!sB)!!)ZΥ!)JBBBcB):!B)RZ):1!)Bc1k:))B:)ZZZsB!B!BB))::B:1B!)JZRJ)1)J):BJcccR:kkcssJRJBJJsJ{Rccs{sZJskRkZJssZZRscZsckZccJRRZ):c{c!ZcŌRJRέsŔkksRssR:ZJscZJZZRk{JZRk{{:kccZZs{:{s{ZZ::JZk{{JsccZ:scs:RRZcBJ)J):1RckccscB)!!!sRRRRJ1BZ!J!:!B!1ZJcBR):1)))!)!歭cs{{Zk:1!)!cB)!B1)1JBksJkJsť:)BB!!:k:!JJ!!1:ck!)!)R!1!!歜J::1!):Jc1::J))JB1J))J:ccB1)B1ZJ)!BJ)JsckJZBBZ)1BZB1:BcB!)1)11:::B)RJJJR{cZJZRJŔRkJJkcc{kksZR{Z{{kcZ{ckZR{k{J:Jccέsskkc1JRR֔{ss{cBRRcJRs{{s{scccRZsksBRsZkZkZ:ZkRJ:)Rc{scZZsJJ:ZJ{k:1BJ)1:JB!!!1!kcs{Rc{!!::!:J1JB)))JB):R!)Rc1:)J1!ssZsB1JZ!R:BscZBJ)BBJBsk{{{!ֽ{))!)!!JZB:)csc:Bs1BJ1!s籠!)R!1))JR1R:!s!!1JR)B)))))1BRk11:BB1R!!B:):!B!1J1J1J:111R:JJ:RBBc:1!:1:Rs{cZsZJRRRJB֌ŽZ΄kRJRcskZ{BJkscs{ksssssZcRsk{{֜k{:Bc:kŜkZss{ZZs{ZcsJZsJk)s{s{sscZsRJsc)sZ!JsZcJB)kckZRJJcckscR1:R)Rk1cRR)s1!ZJBcks{sk:)))!)B1JB!!1)!JZ1!!!!!Zcs1!1:RsRRBRBB!RskJJ{B{)1!{skJsBcccJR:ZZJ!{R1JB)!:)B)Rs!!J{{Z)!!R1!R:!sR:))!1!RcR)1Bs!BZ:J1cZs)!sR)1c)ZsB!1:R!)::)ksB1c:1k11!c):ZJ1::ZJRZ:ZJcRJRcZJRJJcJRcZBJkscR{RJcJc{ZZ{1R{kkkkksZkkks{ssc{ck{k:Z{s{skBB{ks֜skk{cRsRk{Jk{ssskJZ{BJZRskJZ:skBBkZZs:k)JZB:{Z!)BsZs:!B!!1::JZRksccscs!!!)1!):1:)1R!ssZRJsRB{c{RZsJ)!:Zk{1BJksJ)1:!J:1{sJcZZB1:::!)))B:{kcc:k1!!!)!1:B!kR!!Z!1J{Z!:1:))JJZ{))!!BBB!)R1ckk֜!1!)B!!JJJkc:R!!1)R11::)::RRRRckJZJkZkRRZR!J)J)BJ{RR{1kcZscc{kkksckskcBcZBZkks{JsZk{ZJJcνsŵ{ss{ck{{﵌sckkJ{ccc΄JcRBc:ZZ{{ckRcccZ{11)ckBs:ZsBkRsRJ1BJk:B:sskc:11BB1!!!!)RcJ!)cZcBksZZk{)!R{JR))JBskZZJBJRZZcJB1::!:ńޥscc::!!J1JZ:RRBB{ZkRc!:):1!!!1!!!ZRk1B:Z))::!)JBBR:R:BJ)ZsR:JŔBs{:)R1!1:1JBJssBBJ!)1c)!R):BJJZBBcJJZJ::B)R1!:BZZcRR1c:sc{BΔBZck{Zs{ckccssc{cksZ{{{cZsk{cssk{{Δs歄ť֭Ŝ{sJ֭֜Υ{{kνŵcc{sZ{Z{{ss{Rcssck{sZR!kJJ:Rs1!1!BBZJ:{scJZBRRZ:sR)Jks{!!!!))!!))!BB!!:Z:!Z{{RkkΜcJc1B1ZccRJ{!!!RR::ZkBs:Z1{Ŕc!ŭs{cJ1!s1k{k1!)):1!!!1!Js)!:ZR)!Zk11J!!!!c1BcRZ:!:Z:!1:cJk)!s{kŵZ1!!:!B!RJ{!k:JB1Rk1!JJkkJ)BZBcZcckcRcZccRJkRBRBc1BBBcksRsRcJckcR{k{kcck{kss{skkcńk{{ks{k{cΜֽνc{cΥc֭΄{s{sk{{Rks{{ֵkRRcBcRskZBJJ:B1k1):!1)!!!1!1::ckJR{BJR)c1:BB)Z:BJs{J!:)!)BB:BRBRJBZJ!sks{sֵZ:)BZέcRssks1JZ:JJBJ)JRRJcscB!1:cc{R:Z!RR))!)!R)1B)Bk!1!1B!sŵR:ccck!)1sk{{c1ZskRR{1J:1B1!):1)!):ބBR!):!:)JRJ!Bcsc11R{ZRRJsZJZck{sccBkBJZ:BcBRBccZBZk{BsZR{{ZsRkkksk{cs{{scskc{{޽ֵֵskRZck挌Zs{kss{{ZcsR{{kťJ:kBs11JRJZJ:::cBc1)!Z!:RJ::B:B11JB!:J)BBBBs{sJ{B)k:c{sZR))!!:J!!RJ1ZRJ1kcsRk:){{{ֽ{:!Js:B{cB:֥cRk!1!Bc!)Z:1RsބkŔ΄c::BckB1ccZZ!sZ)))1{ZZ!:k!!)BB!))!!Zck1!RJc!!J111R1:1ck:ZRR11!!)1!!1J)c)1sk:!:BBB1J))Bk11B1c:sZRkJJBc{RcZ1cZZ:1RB:ZZZZ:RRBcs{{{{ckRcscsk{{{kk{{k{k{k{sބ{ŽJŵ{{ssk֌{{Rk{sk{ksRc:Z:B!):)J:RRJR1:1!)1)))R)cR1JJB:!!!B!1JR:!kJ1{R:ZZZkZs1RZRccRcR1R:cRccRck1!!:{ZscZZ1ccZΜ{{s{Z::BB:!)1޵{c1!!1:Bsc1!1c{ksk{kRJZ{)R{{){1Z!!)1ZZk):1ZR:!BcsZ11!!k{:1cs{Z!!k{sJZZZ!B:RBJBc:1!JcR)c)!ZB)B1)1cs:1)1kJRJ)11RsRcJZBcJJ!RcBcsBcZsR!:ZJc:Jֵkck{ZJ{s{s{{{Jkc{s{έss{skkk{{R֌sk{sss{csťkckcccscJ)BB!B!1:c)!!B:J))1!:J!)1)1)!:ZJ:)J:JZcs:R{kRBR:!1sRR:JsBZs{kJ:!)JckJ1R:RR1{kZks{!s:RZ:Z!!)R޵!B!BkZsŔ{RJ{ccJJB:R{c11k:ZRZ:)J!!))cR:Z))!R{RZεsZ1ZscZR))!)!Bs1BJJ!B1B)!!!!B!)Jcss)c1)BR:!1)1J1kJ:R{sJ:kJJR:kZJZ1ZB:cBR:cBkZckscsZcJ{k{k{skkk{ks{sk{kss{ZssΜk{sZs{Ōcc{sk{|:B)J:!!Z11)!1RJ!k1)!JZ!c:J)BZ1!11:R:1BJsksZR{ZZk!ZkZZc:))1ZZJ{Z!!kcckskRckscZZBckBc!Z!{{k!BJ1RkJssŜ{!RsZcsRRZB1!s!1::J)!!cJ1BB){1!1:11!Z::))k11sŔB:ckRs:!::csRBBZc){)!BBBJccB:B)11!J::k1)sJ{{:ssZJ1R1kBc{Z::BRRBJkB:R{s{ZcccZ{{skRBsscsc{{skޥ{{{cքskŵΔsޭ{k{ޜssskZBckss{kR)J:JB:!)!)J!J1B)RJ::Js1!RZBBcR!!))!JcZJB{cc1{{{{{R)1Z{sJ!!!!))!!kBBZckZBcZsRcZBJZkss{kBJscsc{)1{ZRcB:!)JJJZ:::{ŔR{ΔBRRR{{k:R:ZBcZR::Z{cBJc)Z)BZR!)JJ!1R1cJ1RJscR:Js:ŔsBRRs!ZJ!:R{Z11!!1B:)sB1BJJkB)JB1J:{J)J)BJJBsBZBRBZJ1RJBJBJc:)J{:kRc{RkkkJRJksksksssŔ{քsZkckcZZޔkkkc愜ssskkkBc{JJkZs{k!::1J1!B!J)1J1)B:RZ:R1!)!:B1cB:1BR{cB!):{{Rs{{k{s!)1)))JJRBZkZ1BJ1:1!Bc{scJ{RZkBZBcŭck!{{k:1!):JssBssk{RZkZZk{νޥkZZBkBJkZs!1kťZs1ccJZZ1!!RZ:!RZs):!ZBkkkR:BR1:!B:!)JZB11k1c!:)!ZZ:1):1BJ:kZ1:RJRBJB{s:Z:JBBJ!RZBJZsc:B!::ZcZccRRBRcckskskŌs{s{{kJcssk{R{έkJksssބk{sZccބs{sRBZss{skJss:1)RJk:)!)!:BBJBBJ1:1)B!k!!!R!ZRB)):B!!1!RBkZ{cZ!)B)!))ks)kZZRZ1c:k)skZkRZJc{!!Z!B{sR:!R!::Zks)1)!cZֵkkքckkńsc)JRs1:)J:cRJkkkB!!!!J)Z1)!BJ!BBJ::ZsB)c{s:sŌsJcRZ!!11:!:1)c))):!:cRRc:RscZZB!1)1!1kkckcBBZ::J1k:JcRJZBcBkZkRRJZBcZZRJcJkccZscckΥskk{skscs{{ssc{kskR{cs{s{kkcRkckkcsJc{Zks:kkRZB)cZRB:!)Bc1))):R!cB):R11{:)!:BB1!::1)kR!)!1Rc1JZkR)ZR!B)B{RsksRkcBJ1ZckJ!֜BRZJ!B{B))!!BΜscs{R{޽ksssŌsRkZRJkRﵜR1JZckJZ!!!))):BJB1RBks)cB1{RRkk{kckcR!)!):cBZR:kckBZ:kJ:)1BR):kk!)BRZB:B1!1kZ֌B11:R:BRB1k:{sJk{ZR:JB1JBcBJ:BJJJkcZ{ssŜkssckksc{k{sŭZR:B1c)B1֭skZcksssZckksk{ŔR:JB{BJ{BckcRRJ)))ssB)BkZ1JJ1R)!1B1B1)Z1!!!!1c{{{!RJ1Bs{cRk{{R{:J{B1Z:1JBJ:ckJ1Jcs1B:Zk1{{cZsRcks:cR)))!kskck!!))1!B1)JBRRJ)J1Δ{kJskcZZ!{Z1:R!111!)cJBRBJZ):JZR:1)RJRck::)BRZcsB::Bc{RkkJ:)1::JB:Jss{sJZ)Zcŭ1sRJcJBsBBBJ!Rsc:ZZs{skcs{{քkZΜŌssc{{ckJBcBsBZZ΄{cRc{cZ{ZJskR{sZBRR)Rk{RRkkBRJ!1)ZJc{sR:ZJ{kss!!JJ))))B::J{B:)B!!1!!ZRsZcJ!!:{sk{ZcRZ{kc:BcckcBZJcZ޵sk1)!!J!ksZsRcB{R{c1JcB{:{{s{JcBcR)sJ1Ŝs!!R:!::!RR!:kZ:ccck{sZc{{s{):)!B:Jcc:B)RJ:RRJJ:)J::c)R!)RB:c:ksZJZcRksZ)!c:ZB)RRkc:JZBBkZRBs:Zc{sRsBJR{cZ:)ZscB1{Zk{kkksscs{{{sޔŜ{{ZR{ZZZJRZ{csckk{{skBJ{Zkcc{{cRssB{scJsBkB:JBBBkk)sRcB{kcBskckB::1)11:B:!{k!k:!1!)B:{RsRc!BB{c11{kJ:1ccJsBJ{B!JJ1JcRZk{scRŔ:1BRZ1!)kZJZkksck{{)1cJ)!!kcRck!!ZJZ{cB:RZJs1c{BJZ)!)!kZR{ZZ!!!)sŭ{cZBJR:ťkccRBJk1:!B!J)B:kJBc1BJB:k:1)))1B:)1)RsJ{scBBBBs{ccsJB1!)):BZ{csk:BJŔRZsBBJ::BsZZZBZB1:Rs:B1ZZ{s{sZsJ{k{J{s{ŜkJ{sksks{sJ{sssք{kk{ZkcsB{{Ŝ{{{RcRR1{kRkRcZ{kZksk{skR:cckcZB1J1c1!J:1RZ1skJJkBckZ:1):)!)!Jkcksk:JJΜs1Rc:sssk:BRsscZR!c{s)Rkcs::!1J:BZs{BBBRBcksJ:BkB)ZR:ZŜքRc1!cBc1RBZJRkkJ!::kc!cJRZ111)!RRkZBνބc:BΌs{1朌Z{JBsֵ{)R!)1!1:BZRZJ:RB)!ZR)1Z)c!!!1k1B:R{R::kRJZkJBZ{Jss{BZscJcRZ{c{sZs:JJŔcZcccZJRZcs:{R:Rk{R{ŭss{s֌sZscRRZ!kRJkc{{k{k{sscsZsZskZkcZckkkcRssR!BBkkJcZsk::scZsB:ZZ{{1Rs{ZBkRRJskZkJJ1)B1BJBJZ:)R!ccscBBRB)1:BBBcs{JcB1)c:JcJZΔ{kcBRckB{c:Rcc{):!:1)RsJ:1!::BZJRRkJ)!BZkkRJ!Rń:1J{BBBccckZc:!R:s1R11csk:JZkckJZŽ{{cJs:cZZssck))c֔kcR{Ŕ{s{ZRRZ:!)!)ZR:)))R!Bc!!):)B:ZJs1!!)c1JkkJk{1R:J:{ZZZs{ckcJZRB:B{k{BcZRBJcJZsccsk{s{cR{ksJŭcZsR{sZRRkk{B{kΌcckZkZ{cc{c{ksBZks{cZ:csRRcJkRZRkccRRkZJs{R!1cBZkc):)1)R:RRZBsBJsZ1kZRJRZJ:RkR{c!!{cBsB{Rck{sck!RZc1Z:Rc{ZR!!!:Z:!kkcRJ)1!!B1BRZRRs!sc!BRssνkBBkkkRJZ{cRR:c1sZ:cZ1:k)R{!!ZckRR)JB1Jk{kcZJB::1kZskR{)R:)ΥΥsB{ν{:k{kcńB1B)!!:J11ccJ:J)1!1))B:BB:11c)1:B!:111BcR{{JcJZBBJZksscJsR{kc{JRsJcBBJ1BB)JRsBJsŵsR{ťsRRsRŜŵR{RRBZZccRRZZcRZk{R֥{Jkkccsc{{skZc1BBsZscJJ{k{JRJR::ccs)1kZBJ:ZZ!!Jss{BRskZ{csZ:11!BJ:s)Z!):!:scsck)BR1ksssZZs:))cZ:Z{)JkBc)!J{JRkcJ1!cZcZ!R:ZZ1BBZ:Zc!BZsR!)BkkR!1!:k֭c{k{kssRk:!:kc֌s:JBJRBR{!!)csZJ!!1:ZRJBRR1sc1BZR:ΔJZ:kBZk{{:Jk::Rc޽{Z:ks)1BkJJRB))!!!B!!!BBB!B:1)JcR{ZRJc{{{kRsZB11ZssZskRZBBZssZ{:JRJ)!)B:!B::kc{ZJJB::)BRkRc{{sR{k{ﵵsk{{{ŵ{歔{ZRB֥{sZkZscJkkckZksckZZkcBZc:cscRc{Bk1JcBc!RB{c)11ksssZZR!!Bsk:k!ZRZZZZcBB!!!1ZZB:1JBk{kkJsc:RJRBJkZ{1!s{{R)J1RZΥ{{Z)1BJ)kkkJZ)1Rkks{csB1:)ZZB{R1:)JJZs:!):cZcRs{skc{:111:11RBJZ{{ckkBZkRJ{BJB!ZkZk1ZcksJsJ!B:kcckkJZZR{楔քRJ{{ZR{{ZkkRk:ZRZRR::)1)11BckccRBB)1)B:JBJBRZZ{kkcZ{kJkk{Z{1:JRscZsRc{cZkk{cJcRZZB:BBRBJkk{{Z:BJZc1ZsZ{cε{kc{kc{{J攌{scRBkRZR{Z{ޔscskkc{sssks{k1:csRsZZZZs{s1c{sZ1BcRcBkJZksZ{1){{{){:ZJcRJJJk!B)!B:RBBJ){scJBsZ{sJZRcZ{!J{R:))J:ksc::1ZkRs{B))kcZ{JccRBBBR::B::1kc{J!RZkc{ss{cskskZJBB:JkcJBsskkss1skkRcJ!sc{!:cssB{sck))BcJkJs1:s{RZk{{JsJscBZs:Z{skJksRk!1::1BR1)BJRRRR1:BZBZ:JZsR:!:::cR)!BcBck1!):1J!:BRRZ):)1B1JkBsJk1B1B1BskJBZ{{kZBB)!!:cs{RZk{{{{kkZskcs{kk{Ό{kZRcRJssRޜsֽkRs{c{kssZc{{sZ:{RRkBBks{kcBBRR!R:BscckR!)1skJB!:Bk{s)JR1JJ::!JBB:1:)1J{kkcsZkcs{RBB:cJ{ssB!):cZc{sRk11J):cc!!kss{kZZZRJck:Z!JJBBJ)c:)kBJ1csRcZccckkskss{c:ZkZkBRsskZ)RZB)kJJBZ)1B:1!cZJBBckc{k:!1:!ZcZ!B1J{B:RBkRRkR1Z1:!Zc{B)!!1k1)JsZ:k1:BJ:BJJkcRcJ1:):k1Z1!BRksB)Bk)JZcZssZ{cRB:B1BBcJ{k{BZJB):JJ)BZRscsZ{Rs{skckkB{JRc{֜sssZZsZ{{Z{csZ{s{{sckZcksZccRcZksc):cBk)!R{J:JJsJZc)cZ!1kkcZ:RBZ:JBB:)!c:c:cR)!!kB:kcckkB:JZsZR)::ZkRZssR:1!:!Jc:)Z1R))cssccZJcJBZcBksRBsscB!JcJJB)k{{BRŌksZJ1RZB:cscsBcsccc11JZZ{1sk!JJ:skRRJZ:Zsc:Zk:1ZBZB1!))!Bc!B!:kZ1:)sBJR!B!::)):!!111)JZZRBZ{:J:RZ{k1ZZ{kcskR1{J1B1cBcJ!BZckZRRZBBJBRRsJsZcBB)::JkRJksZkcZJJBR{sZJRk{{sB{sJk{{έckBc{JsRZkޥŌŭ{cssBkRk{kRZRJBRRkRBkkΥ1{s::JcZ1!B{{s:){sR:cR1:)cZZRR::BZ:::!!:11ccZBc{)!R{skZRBkcZZZsZ!1ZsZRs1JZBZ!{RBZcBRJJBkBkJkZZckZ))))sZ11!sZ1R֭ckkskkcB)11:Z1s{JB1Rkc{sRB!kZJJJR1ZsJc!1kkJscck!cZ!Bk{)1:)B)1:ZJ)B1)cZRRB1JJ1)Jk{RZZZJZ::sRR1skRk:1BRR:R{ckcRBRJJ)cBk{R:)RZJZkJRcZkJB1cRZcZ{sZJk{RcZ)Jcńs{{ksRckΌkkcZR{kJ!stRZ:c{cRR1ZcJRJZc{cc{ŵ΄kR{ZJJckZZcZkŜJJJ{BcBk:csk)Rck{RJkZss1!{s{ckcB1!)Z{cBBsBJ)1B):BBR)RJJ{{BkcJ:cRsRRkks{kZRZcB1ccBcccJsRkkkZZ:1JBBJ)!skcBZք{kscsֵ{{R11)JBJBRR{R{ZkZZ{sZcRJkscB{JkcRJ1ZR:RkR1sJsZ!1:)Zs:Jc{s):!)c!BZcR!:Z{JkZ):1)JRBRcJ:c):sZsZJBZJR1cJZc::{R)Z)JZJRBZkZ{{{sΌsZZZc{kRk{kksksΌ{cJZsck{{J{cBJ{ksJkńcJJc{RZcZsZRk:ZkŭΜss{JkJBkJRZZck{R{Jk{)ss{cZcZJ{{ZRR)skZRkJZcZckksZ1:cc{cZB!!:s{JRZskZ:BR1)!BcB:)!)BB1{{BkcscRZ{BcJc{k{Z!cZ:J)!:B!JZscc!!sBcc{Rcss{RR::J!RJ1{skcRBZssބcskZ{ťss{sRJ::)BBJ:kJRJBZ{ZRZBR!BJJRcc1!:ZJ1BJJs)Zk{R{{B111BJ1R)!JZJ!)BBRB)c:kB:RJJ!JRRRJBcRZZRkZskB:!c{:):kBJk)1Z{)B:JJB!ccRZsZkBZskkksZZkZ!)B:1::kZZsc:JΌ֜{csskZkZkss{sBkRZskkJcJkZ֜JεRZRZscε޵ޥ{{sZccccskJJ:RZ{cksRJ:BZZJRRcsRBZ!JcZ{kk1BJZk{{1J:J{kR!1BJZcc:1ss{ss1R1R)):B!)!!1BcZkZZZ{ckRZcRR1R{)1:ZRsk1sB!JBZckZk!ZZRksZ:cR{ZBcR))!)sRk{sJkRBcZ1RťRkccŔ{sssZsBJJ:BcBJksZcsν!Z{sckZ!!!:JZB!!BJJZRZc{{RΥ{BJs)!!cJ:R1BJBB)!ZZ!!k{ZZ1skBZJZJJZJ){BJ!sZksZ):!:):JRZZJ:J:RZssk)1):!!cZksskRJRB:J:1JZ1c{Z1֌kZc{{k{ZkRks{ckcJck{Žkk{JRkBZJcJc{浔k{{s{cBJBRZkkkkB:{ńRZJ)RZBZJsJccckRkkń:1)kc1B!:BkJ{kJRsc)R:)k{:)1ZcZc:cRZcJBcRcZkc1cJ)BcB{JJkJ)ZkRk:)ťc1kcZZRZs!:R:R!:RZZsBJ)R){攔cνkJ!1{J)R)!!:sk::!!)!:JcscJ{BJkccsRB!BZ:Bc:!)::kRsZ{JR{c!)!)RJsŵkk!1ccB{{!))1BkBccZsk{JB)Rc:BR11ZBB!Z1kZ1ZJsJRBBBckZ1JR:!!!!J)1JRBBRcRRZR::J:1:!sJRkZ{{{kkZRkkksRkk{R:B)sŵ{J{ﭥcckcBsRccJJ{Žkŭcsscccs{R{cZZ{ZZRBBZ:Rc{ssZZZ{s{B1!:1RckRZ1JcJZk1)k{{cs:ccB)B:)sksZJcR1kR1))ZRkZR{Zkkk{Jk{:BBBcBR1kJ:)::!Z{:::kRcZkJkcZJBB1!cckBsk{s:!1kc{{c::sR1ZRZ):Jks{{cscZRBkBJJ!)JZ{RsJZRsc{Bk!1!):RssΜsZsJc:!!!RZ{1)!!ZRJB1ZJcJckBBBBBkJRBRR::BJc:1R:1c{ck)!)!!)B)::!!)1!)skB:ZJZZZB1BBB)JB1Z{ss{ss{:1JJJcs{ΥsksZkR{Js{{{J{cskkkcs{{sk{J:Rccs{skB֥{ccckc{cs{ZkRkkckZ{kkRksc{1:JksZ1Rcsc{cJZcRRJ:BRssRR{cRRcJZ:B1JRsJZ!)!)!)!!)BJ)Z{sJ1BkZJ:ZBJRcs!JJ!Zcs:1!cZJB:)Jc{kJ1!!c{kZJkBBckJ1ZkZ:BJs{kc{1ck{JBccBZ{ccZBcJs{kcBscR!R{JJk{1J1BJ{kk{!1ε:c:scR))kksRscR1!:k{s{!!)!!1R::!:c1RZcJR1kkkRRkcB:kZRcJZkR))R11!:B)B!:11))kB!)!):JRJcBkRBJZ))B!Z:BZkZsk{sJBBkZ{c{sŭck{BsRk{{ZZkkcccR11R{Z{kJBRJss{{ksZJZJ:cZk{{:JZcZccccZR{kJsk{ckscZcZJ):kBk{s1!!RcccR:ksBR:RskkcZ{J1)!:):11!kk:c:cZksRcBJZB:B{))s:!))sk{:1:{kcZRZ::ckkB!){kskZkRR!))!RJscccZ)c:!Z11!:1):1!)!)BRcBc{BRcZ!):):s{scZ{s::R)!k:!R{Zkc{{ZBkRsJR:::B)JJc1)!JBB!!R)B1kZsRJJ{c:::{!)Rccc:RZ!!B::!):)1))1)J1!k!:k::ZRsBBJ1B::1csZsssc{{sJJέZ{k{cRs{s{{ss{楥skJskŜB{ťkkBsJBBkRckcc:BZ:kJss{{kŔքkk{BRZZ{sZckkJJkRksk::B!:!1RZss:cZZcccZ{cBZ{J!B1!!!!))!RJRJ1Z1BB)Rc:!::JJJZ1kckRZBckB!)RZZksskZR1!!1BR:JJ:{Js{B!!kRR::BZJ1ZkRBR)!c:kZ)c{ccs)BRcR:1:RRJ)1{{cskBk{sJRs:Zs{cc{R{ŭ)RZc!J!:!!kZskRkJskB:J):1Zc:kJJcRcsJ)1!:JcsR1)J)::!)1)BZ::BB:!RBckkcRBRckZk{k{c֜ΥΥΥ{J挜{{{RR{ΔZ{Z{cs﵄kJs{cZsskRksZBJRs{{ssRks{εsJck{J:R:::kkR{BBBBR{c{ssBBkR:)skJ!!B1ks{cZckcJZZJRZkkJZ:cBcsRRBB:R11!)!:)1!!1)!Zc:1:JcJZJsc{!RRcRssRRRRskR{sZJ!!BcJ)RJ1ccRJR{B::kZJJB!!JRR::)k:)::Bss{cs:JJZ{{ZZc:Z:1cZRc{JBB{cB)BscscBs{ZkkR:R1!RJ!1!{BJ1Z1:c)1cZJ)JJ!:Zcs:ΔcBRBk1!)B!!:1!1!:RJRZBR1RBBcJ:s{s:kcZZsZZ{Jsskks{{Žνޥc{Ŕs{c֜ޥs{kZs{JRs楔Rkkksk{{sŔ{ZBZ{{Z{s{sZZkZcťŵ{Zk{Z:1JBZcckkB:1ZRZckkJJRkZZR1JskZk{kBckZkZ!R{cZs)J:Jkcck)kkR:J)!!!1!!:!1c::JssJ:BZc{)!:skZRZJcBs!1ckk{{Rkc)!BJkck{kZ:Z1JZRBRZskcRRZZR)Rcs:BkZcJJ!))B1:k:J!1!1B:1c:Z:B{k{JBJc{{c!1:ZB)sR1cssZk{J1J1B!)kZRB:!)B:BZ:JcR{cJ::ccJ1!!1!J!:ZB:)!:)JJZsRcRZRRZc)ZJcs{{RccRB11ZJZck{s{{s{{Zc{פּńŵkkZZΔŵ{ssZsssťB{Zޥ{{RŔssZJsssscZRkֽcRRBkcRR{cZ{RcJZRsscccR1JkJkcs{Z{cRJk1RJcBcc{cZRsc{kZBZsccs!!)s{Z:sZZJkkB1):)1:!11111)ckRZJJkc{))!kcZkk{c:):k{Zsckk:))!:)1k{Z):JJR:BB:kBZ1css:c1RcBB:ZBZsRR1!J!!)BRJ!)))cZJc:c:R:k{c!)!1)1k:)):kJ)1Bc1:ZBBkk)BJJ:1B)!)1))JBJZ)ZB1{J:ZR!)R:J!))RJZ11))11!!:ZJZ:J:c1ZBZskJk:)JkJRBJ:{k{kcZ޵kR{{kέ浥ckZs{֌kŽRֽ{s{:cZk{ckk{JBkJ1R1:kBťJZZk{ZJcRBcscck:kZkk{k)sckJBkcZJRcZ):Z{{B)1kZZ):ZkJs{ccsckJB:BBZ!!B)!B!RJJRJckB!!)!{{RBRZ)!csZk{k:cB!cZ):RJBc{kZRRRcBsRZR)BB)RRkkcJBZscsJ:!!BJRs!JR{ŌBJ:RRcJ{k1JZZJJ:!RZcsZRRc){BskJZBc)ZRZBRc)!1)B::)!!1:!JBsJ1c)J{cs:!)R!:1BJZ)B!!:):1:!c1R11JZZ)BkZJZscBcRJRkcsk!!ZZJsssskkkRcccεss{{kkksBBŽs{sskccޥ{:JRZ{css{{Jcs:JcsΥRkcZZsRkcBZRcZJksJZRRscJZJZkckR:sJZJR)1JckZJJs{kc1B)::ZRkkckRsskcJZRR!J!11BBZ)))11BZc!JB{cskk1B1Rk{k{1)!R::::ZJcZRcJcJ!Jc1:BR:1BBRZkcs:skJcR1:J!cJRcRcJ1{)1Z:ZBBsΜ{{sJB!!cRJJJZs:!1Z:!BJ!!:)JJBBZsB!)c!RJ1!!1J:cRs!J1!J!)1JBBJ)JBR11!!)JsZ1R!!)!BR)Bk:)B:sc{cRBJ{ssssRΜsRJťksZRZΜֽ޽Μ{sεֵkZB{k{s{歌Z΄Μ{sBk{cRccRZsB1:1ZRBRBJ1kcsscckJZsksRBcBkBRcJR{cJ1ckskR!!ckkZBJZ{RJZZ{{scsR{:cRkJBJcJ{RBc)Z))!J:R{!JcRkBk{sckcc!!:scck{{cJ):))c{::ccssckkRJs!)B1RZs{scJZssRZ1k!!)RkssscJskZ:{sB:!Z{)!!)J::kJ1sB))1)J::BJk:)1))J:1)!:JZkRZ))))JRBBJ:J1BJcZRJ)J:R)!:J:)!R!JZccB{ckRkskZks{s{skssŭޭ楔֜c{sccŵŵέskkZ{Ž{ބsksskZ{{Zŵ{kR:kskkZscZscJB:Z:1JZB!cRZcZפּ{kJBBBJs{:Rs1{1{c)BJJkRJ:))c{ZZJk1:{sZ:{kcsBk:1cJJZ1JBRRcB:!J1R::)J{ZRB{RRZk):ck{cJZc!BskZBJkR:cB{kcccRkJZ:))BJZZBJ:Rkssks{1!:)1J{RR!1!Js)!Zsc{kZZZRcscZ)R{!:::RZc1cJ1sZR)Rkcc::1)11RRJBZBR1JR1c:{!)!:!!!BBckcZJB1cBR{::)J!cR{c:k:B{sJJ:JRB:ZJZZ{RZckcs朌kŵ{kssJkֵ{c{kkJ{{{Z{sZ֔{sJsJkZsksk{Rkk:cRZRJ{RRk:kcs1s֌Rcsk!JkkskJZ{c{cBsR1RR{s)!BBkRZ1B1sRZRs{sRckccZ1BR:JBcZcJcJBcsZ)B!:JsZkZs:!{kZJRZ1kRZRc{))Bs11cZc{ZRck)!1:cZkJkcRcJ!cZk{kZ:11RcRc:R1)!!RRksZJcBkc:ZkZZkRB)!)ZsZ:{sB)BJJ:1!!:R{s{1B)!:BZBB!1R:JB)RB:ZZRcc1Js)B1cBBJRcB)1{sB111::BJ!):))1:ckJR:kJRJ!)RJJ1Zs:J:BJsBccZRZ:Zs朽{Z{ք:ZkJ朥JZsssckΜssks{ksk{ZBcR{{{RJsck{ckscccsRBRBBs{JRZB!Rkc)JsksZsBccB:{k{kRkZB!ZkZ1B1sc1):Bc:ZkRs{ZkckZZc{:{kZ1JZZJZsZ!sc1sZcZ1))1!ZcZcR1)Bs{BkBkR)!kskRB)!1s{c!)1Zss:k:Z1:JBckZsksZZZkkZR{{{sRJc)!)ZskkZkc1JskkBRR)BBB:1s:{::JJR):1)!JskBB:Z:)R1!J1B)))!!:)!)!)R!1RJRR!JkZ:JJZZkJ{J1{R:RBsBRRRcZBZZRZJcJ)JcJBR1sRRZk1JRRcR{cZRRZ{skks{ŔŌs歜cs{ks΄J{RsRZk֭ZZքs{{c{{ZZc{քksJR1kBZkcs:kB{ssJcR:1ZkRBkcsc{RBZcJksRBcJ:skcssBRkc:ZZ)J{{:11BkZ)c{ccJRZscRsJBJBJkR{R1:JRZ)Z:JJ!!!!1)k))JZkBBc!!ZBc{kޔ)!J:)Zks!1!ZJZkRZZkk{Z!!)JBkcR1s{ZJ!{ckkc!!1kscscZc:s::sB:k{Zcks)!BRZkkkJ{skR1{:!cJ))!:{c{cRZ!)ZRZZR1)J:cB:BJZB!!1B!R1!1RB!:RR:!BkRBRkkR:RBR:JJB{B:Z:1:c{{J:{B:kJ:Z{::)RBBZkJRRRBJcskskcJkJc{{{kk{ޥ{{RRńk֭{ss{cssk{1kŜkŵcs{scs{{{:RBJRJZsZZcss)Bskck{R1)1RckZsk{k)Zk{ZJskssscssJRZ!11!JRccRJsk:cZRc1Z{cJBc{{csk:J:cZskBkBccBBck{)Z11:BRBsJZJ1:!1BBZBJsJ{RcZ:1cs֔J1RB)Zc{::BR1cZkck{kcJ)1:JkRcssJ{kss{skJ:kskccsBkksZ{ZBBcZcB):JBcJ{c1Zcc{{kk1{sJ!1)B{JkJRkk)!::ZZcB:11!:)!s!)!J111ccJRJJB1B:!1RZ:k{cJRZkZR))kkcBBZ1c:cB)1!RZcRRJJJZcs{kkZZRkkskksc{BޥkRsŔ{{cZZckk{kkk{sR֭Όs{s֜ks{cs{k)kBJ)J:c!kZcccR)cs)BssskR{ZskRsscRZRcBZRZJZ:RJskcckJ:1))ZcsRRZZc:!:JkkZs1!1BJkk{{c!1kR))1:)!RkRJZ):RBB:!!)!:cskZkkJ!)1)!:kB{楌)!:JsJ1J))BZskcRRBB!B::!!kB:1:)kZ!RcR{{:!!!B{kJskscc:{cZc{{k:1s{1{Jsckc!):1s:ZJc1ZRJBBJ!:Bcc:c1Bc)RR1:!1!!)!::B:)Z)RkkckZsRssc{s{!Z1!!RJZskZR:ssR֭ΔcsJZkkksRBRBZRcBk{ZsZkZcZRR{kcckc{s{Zsޭ{{k{cZ{ńs{kssks{ZZ{sεޔֵcBJB!Zk!1Z!BZckckck::JcRskRJZk{֥cBkkJRkcsZskBkcRJcs{{kckBcZkZRJ:)R{kRZk!Zks!)Z!1J1k{cZ:Zs)J:1)!:c:{)::sZR:!:!!)kJksJ){sJ{RRcB)JZksR1{ZZs{RcRB:RRR)kZss{Z::11)))JZZ{k!!::11))kZsŔsRcRssB)ZRcZcR!skRs:RBc{kcZ)111::)c1cBJZB1!!!c:ZRB:BBJB!:1!:R:::ZBZJ11!!!B::BBB1JR!ZRksZRRsZc:B)BRBBsc{cŭJJŽŔ֭ޭJZZBBRJB:RZs֜kΔ{{{{{kkskcJkckccs{{kkksZsZkZsksJss{ZεΔk:R޽ckcB::ck)RZRZRcBBR)k{sZZR:s{ckcckB:ZJ:!Zc{B)R{sJ:JcscJJZk):J:)BRkcRsk11:)1RJR11cBZRZ1))!!RksZckkZ1Rk!{ZsBRRR1csZZ:{J{c:kck{ks):c1{έsscRJc:k{R))1!cckZB!!cJckks:s{s1)1s!1JJ:ZBB!RcZZ!BZZJ:ck)1BR1JRssZJcBRZZ:11:JRRBkR:JBBJB)1))J1ZRs1RcBB1::BJ{BsJJsBJ11)JRk΄1)!1)kέRRBZJ:JRcRZkJZkks{Ō{ZRJJsRJZ1BcJk{k{kZscZkcsss1kcZc{:ŵ֌BRB1::ZBB!J1R޵ޔcsss:JZkRZ:JZcss111:B1ZkZcRk{JZcZ1Js{΄:1)BZ{cZRkJBkZsc{B)B)1)RJs:ZJBJBRcJ!1!1:sZ!)ZsBZ{sZcR!1):ZJk{ZBs{s1ZJk{RR)RBJs{{JRJRc)!sskk{R֥s{RcZ)!Z{{s1cskssZsk{ckBZZkR{Rk!)RscJ!)ZBRcBJ)kJ:))!Bkc{):1:B1:Bc1:RRJZR)ZZJc1BB:1B1JccRBJ{kksB:RJRJB!!R1)1ZJck)1111!)޽{:RBRJRRRBcZcRksŌkkkޭΔ{kscBkBZZ:cJRJZZJ:JcskkR{kccZJν{ޭsޜŔ1))BBkc{BJc{sk{ńRkJZ)J1)RkR)B11:1ZZBkB1J)kkRR{::k{JBcRcJ!csR)!:{c{ccZcJR!:BJk:R1)!:k{1cŔ֔ZcBRc1{Z:11J:RJcJkJJB1Jck)!Rkcsssk{sc{s:1!!{k{Z{kJ{1!1Rcs1JZ{{ks{kZRBBBcRc1){kR:Z:!BJRJBB1)!!::1Zs{!)!):!1RBJRJB:!!R1ZR{JBB)BB!:1Jck:1BRRccZR!):Zk{J)!!::1)RBZ):BBkŜcBJB::JJJRZJJkRsc{kޜZckRRJkRsRZkZc1ZZRRBZs{sŜ1k{ZZc{Z{kΌR):RkΌ1sJc:)RZcsR{{{c:B{RB:B1ZBBB::BsJ:)::Rk:JZ1cR{BcZ{{!!)BJcZJZc:{))!1RkJJR{kZRZBJ1RcZ:Zk:JJ)1B!BsR{:RksRssk:!)1cskJ1))BR:B:BRZBJJR)B1JRRRkskkB!!JBksR!):ccքskZkZc!ss{skRZck{cskR)1sks!BskcZc1RZc:R1{JJJ:11:1c1BR!Jc1B)JRBRZB:Zk1J1ZJJZcJ!)cJZcRZ{R)!)1Z)B1!):BBJkJJ:1:ksBcJc:cBJJZZRc{Zc{Δ֥εֵ֥kZkBBsJB:kRsk{kZJBsŽ{Ō{Jkc{{k{{{Bk:J!!1){JkZZJBB:kssssZk{ZcscsZ{c{:B1B1!1)J)11J1JZ1kZZ1Jckccs1ZBc:ZJsk1ccskckBk))JsZkkc{cBZ!{1{RRBkZZJkZ:BZssJZZBZJsRcJRJZckkZZ1J:csssc)BR:::RBR!BkRcs{skcBkZJccJZ1!!kcsZsck1{Zcss{k:ZRc{Rck:!JBZ{!R{ZRR))ccZZBs1J!1!RJ)R!B):)::JBcsk:RR:cJ1c::!RcJkcZ:1ckBR:BJR{BJRRR:BZZ)c1)))!B:JZRZ1kJRkRZksscJZJJJ:ZkJJRJss{cťŜŭΥkcJZcZ1:1c{RkkkJ{s{cskcŜJkkRBcZkkkk{{ZΔ!)k{k{)Jcsc{kksscZsksckZc{ZJkJ1ZR1:::skc{BJJJJ1J:ZcZZ1RJJZ){skcR:!kJ{kcBZRc))!R:ccBJJcBJkcckRc:kks!BdJssJJssc:BZ{ckc)ZsZkZsscZskZZ!!1ZZcss)JBcZ{kBsBZńckZ{Rckks{kJkB:cJJZBB1)B):{skkkRJ1sRRB{Z{sk{ZJZ1BB1)J!)k))!))!JJBRs!kJBB)111k1::ZRkcRRcR1:sc)ZRZR1)!)BsRRZc{kR!)Bc!)JB:BB:JZRc{RRscJcZkZkBkZBRBZZRRkck{εŽŭs{kRcsJRcJZZZJsZ{sRsŵJJkքkRR:JJ΄ssJRRskRkcc{sk{c{cZ{c{RssBskksc{sBZckB!1:)RZR{R{R)111RZZ)!scZc{{JkJck)ccR{ZR:ZkR:B:sJRRJsJ{cZ:JsB)sskZ)!Ōk1RcZJsB:Z{R:RR!1)!!{csRRZ:)RcRJJkkR1BZBRskc:Z{RZssk::1))!1!RZBBZ))sc11:Z1cJBsRRJ)BB!!BBJJB1!)cRJJ)1)B11cR{k:RJRBkZJc:RssRsJBBRRBJskZBkkBZsks1)JZRZk{kRZ1c1JJ:cRRRB:JZJZk:JZ:kc:BBJJJZZcRkkZcZ{ss֭޽k{Žsk:RZk:sRBBk{cskB{ZZcckcB1BsBkJ:ks:sssskcc{ksRR޵sZkZBJJR{c{kc{{{{JRJJ)BkcRs1::{ks:R:kkkkcskcJR::!1BZ1ZkR1{{ckc:RRcRJkc)cZZsk)cBscksJcRBks1ccsJ)ccR!!!:{ZcksJ1Bss::)JZcRc{{JRJZsJ1sZZ{kc::)!)1)k:skksBsR1{1ZckkB1)BRcccc{c!BJ::1J)::!))BR1R:Rc{csZZJJZkksBBJBccBZZ)kRk:ZcJR{R!)!ckskZcJ:{RZk:c:c{!Zc:BJRJ:cRJ1c:BZBJZBB:BZBJJZZccssks{޽{sRkε֔1RRc{:Jk攌k{Zŭ1{sZcsskkkJJZckJB!!cRcBRkk{Jsk{ZZZskRkZRZJZZs{cBJZRckZk{kBsRR{RJRk)kZkkB1{kcsskR!!JR{scJRJcZRB1{kZJ1B{ssRRJB{ZsBksRZ{s{))B1:1B{{ss1Rs)1JZc{RcZR{sZs{s1)J{ssBBR)1R)!Z1!)RR1!Jscs{k!)RRks{cJJ)sBJRBZ:JZ1:R)B)Jckckc):!)!BBZR:1B1kBk1kZsZc{BZ1!JkBssscJZkskc:ccskR!){RRRsJRZ:B:cJJ):ZRJ1BR:BR:sJcc{s)J{sss攄{֌ֽ{JssJRJRJBcZJ{cksckJsB{:cscBkZcZkJcssBZ1cRscB::csZc{{scsR{Z{kcc{֭kΜkccks{kRZkck{JZ!Z11ŌkR{cJZ):s{kJ1:kZRkcJBkRZkRJcB)JZJk{sZckssJscZZ{s{J!11B!)!)!1RRc{cZssc)R!!k1:BJBRZ{kc:)Jc{{{Rk:!!!!1!:!)J!1ZJ{s{JZ1kZ!1::BRkZs11{RJJ1RR{Bk{R!!1JkcRkRRZZs)BkZs{kkss:ccBRJZ!kRR)RckckkZckZRJJZJcZBJcBBZ:R1cs{{ss{scs{JZcZsRsRs޽ŵJcs{k{{BZkkZkεcBcZkckRJBkcBJkcZJk1JkksRccsRJcRZRJkc業k{kss:{ZBZ{kkkRBskZ:sksZJZ1cΌkZ:k)csJkR:Z{ckcRJ1)BckB!{kέ{ZJ):Js{{ss{kέ1!)B::)Bcks{c{B:!RkJ1JB:)1B{JcBc{c{{R!1JJ!:B!!)!cc!B:!1sk!kZ{cRBJkBR)!ZBJ)!!!):)JZc)ZssskksJZkJ:R:Js)JJBks:JZkZZRBccJJJZBRRJB:1BRRZJ:!cZs{ckk浜挥΄:sc{sޭքsk:Jc{kZccck{R{Z{ZJRsZc!{JcBJ{c΄{Rs{sckZ{c{sRsޥZZZksRZ1RkZssk{Z:::BsJBkJR{Zs{s:{{Bs)RR{:JBRZckRcJRsckZZk)ZB!ZkR{Bcssc:ck{cs1ZkB!!)B1:ń{ck{:Rc)k{B:BB)kBZ1JZs{BJ:B{kRks!!1)!!RJ)R!!)BZZJJc!BJ!!1)Z1BZZZB1RBcZRZ!)J)!):1:Z))sZ1JsskcZJZZZZ!1JJ:ZkJZ{k:BJJ1ZBkcsZRBZRBc1J1:JZJBc)1)ccsc{s֔kcksŜťJ{):sskksc{{ckskckk{{ŵccc1:BBJŵsc:kŵsZkRs{k{RRkkBZR{kťc޵:kZskB!kksRZkRZscccB:1J:s1Bsk{R{Bk{1cBBJcBRRZ11{kJcBR{Z!):kJZJ:Bs:cccksBcJckcJcJsBRsc:!::1)!sZksJ!s::)RJ1B:ccRR1ZJsZJZ1!!)!:)))1c)BZ:):Rc)1s:Rk1!BJ:::JZkZsBRkJJJ11!J)1BcZkBBR1{BJ):J)!ZkZcsBZcZskskcBR:BR:JJZc!k:ccB:cccZR{Jc{sZcBRBBB1RcRRsBJ:scRc{ޔń{k޵scss{{Δ{{cskccJck{sZRΌ{{Zckބޔ{:1:{:{քνŵsZBRkcZZZcJscB::Z{ZZkkcRJ1JB!:1!:RscB1:cJ)1!kZcBJJ{kkJcR1{RZs::Z:BcZB:Z:)!!B)BkZc!Js)JkRsc{cZ{Zޥ{J:J{kR:!!!)JJJRJZkkZcksZ!)sk{kJ:::BB1RJRB1BRkJJ)!11!!!)BJJZ))!BBZcRRR!1)!J11)1B{!!1c1ZB:cJBZJck:RccJkcBcRR:BJckRJBRkJBJ)kcZJRsckcRJB!)1J:JkJRRRcRcc!ZRkRJZZksZcBRRZBRR1JcJJc:JsJsk޽s{ZJRJJJνZ1B1!k{BRRsskkss{csﵥ{s{kkZZkZssΌRcŭΌR:Μckkkkks{Z{kcs{ccRskkBBJkRsRJJkskccZ):BRRc:)kkcZB{RZcJcJ)csBk)sR):c{sR:!!JJZsss)ss1cJc{1R{k:RRc!BR1:ZccŔRksscRs{sBkŔ{JBskc::B11kZ!!)!1:)!)RkR!kZR!:B!)!!)R:cZR{sksJ{kJ{ks{cRRBBk{s{RZccRcZRsBZZ:kZZRRRcJBRJJ:JRJsJZ::RsBskc{cRBZ:RRZkZkRZ:::BJBRJZRZsRcֵ֜kkBJJJJJRJRcΔ潭k{RB{csZcZ{{JZRsR{RΥkJ!ΥkZJss{{kŽksRZkss{kksZRcZkZcBkJk{JZZkcRZ{Z{JcRB:BBk1JZ{{BZBB{ZRJkZJcZ:)k:RkJJ)1:sc1ZZZcJkkZRsccsZZcRks:kckBsck)BR1BZ{Rsk{R{Z{{!!c{Zkcs)1RZ!)!)!))))))1:1!!!)ZZJR)J!J!1J!!:))!JRRcBcskZ)cksccZRs1JRck{{{RcBZZZc:11JBB{:J)1:1!ZRZZ1ZRJJsckc{JZZZckkZZZcJJZ{sRRcJR:::JssZZcŔ{s{kތ΄愜JZ:BB1BJ:RRRBZ֜{ckc{R)RJBBRkZZŜŵZs{{{kskkkssk{RsZ{kkcc{Rsk{skZcsk1:csZcRZZsksZJRJ:BRB)1{BZcRZRcssJ!ccBk:ZkkJB:s::1)BZkksc1cR)cZk:Z)R{JssZcRs1kkZZkJk1ZRs!Zsk{Rss{{Z{skZs{k{{kcZR)s{1Z!1!1!1!!!!1!JcsB!Z)!)!):)Z:B:{BskcZcJRckkZ:ZkRRRks1RkcJc!)ZZscBRRZJskZRsJ::B)!JZBRJssZ:JZJJ:JkJRJBR{ccks{cZZsRkZ{RŽR{sΜ{ŔRޜsZBJZRRRRBJBJ:JJRZ{{sZ1Jkk{{{kk{c1k{:ZZBkkksޥsscksRskBZcs{c{BRBZkc{{sZc{{ZcsskkJkcZ{ZZZs{kkZ{{{cc:1JJJBk!::)!1ZJJksR::RZRZ!{:RJJsRk!R)sZ!Bs:s1:B{J{{{scZJkRZk{sB!s{k{s!)c{sscss{{:kk{):!Zc{cZcss{ks1ZcJZk!!!!)1)Z1BZR1)!!:))JZ!)!:1)1ZB:Rsc)BcRR{JRZkRkRRccBJZk):RB{sZRRZRcc:k)R::R)J!!1!!):JBZRRBJB:JJ:J:sZ1kc{{ZBc{ssc{Z{sRkΥ{J{ֵ{{kssZ:ZJ:B1JBJJRRR:ZBBJRRJss{sZJ1J{{sc{sssŭ{Zs{c{s{kccc{RRZ{{{{{JZkZ{ksZZcZcJJJcRZsZR{cZZBs:J)Zsccc1{!)Js:s)ZkkRZ{JsZZZ)ss)ZsRc!)Z{B)R{c{kRcsZR1RZZ{sk:k{1kJ:{scsscck){k{cZB1Z{skZ1Bss{ssRcB:ZckJ:!)1cck:11!)BBB)1cJcB!:B)J!1!R:k{BZBks:BsB1))BRBkR{k:!JBZkJ:cR:1)c)cc:k!c1J11:1B:::Bcs)!R!J1RJBRBJJBRsskJkZk{ZZZֽsJΜk{έk::JBJBJ:BRBJZBJRBZBcBRcRc֔s{{kcc{c{R֔{kkkJk{ssRcskskkkckkcJsskk{kZZks{{skcZZ:kcBscsZ{:JckJ{k:ZksJ:Bc:RcBBRBR1RBkcsB::ZZcRJ1ZJ!ZkJsZRc{kcBJZRZRs)cscBscBJsZ{ZsssZ:1cc{cZcRsB:RkJRR1Z:J:B1!!!!!:!Z1J!B{1kRB:R!!BJ))B)1ccs!):R!!:B)!:11:RccZ)1B1JRBBccB:1)B1!:B1:1:Bc:1s:1):1BRRZRZJcֽskkB{{Zkތ愽kZ{{極R:RJBRJBB:BJZRBJJBZBRRBJΜ֌kkskckΌťΌ愵ZJ{k{{BRcRRJckcc{sZs{{kckZc{ZRssRJsZZB:ZkJkRcsccBskZJ1{{kRsZcsRZZBZZ:JBBJcJB{{JR:kcBk::::{RkRk{sRBJk{cBB!{!1:kc{kskcsZssk!R{ks{kBZZBR:1::B)JckR!!!!!!B1!cRR!:11JJB1B::!1!Bkc):)!R:c))))JBJ:Zk:!!c1BB!R)1B)R)B1)1:1!)J)J::JZBRR֜{JcńcccsksRJBRJBJBBJJBR::B1RJJBRJJZBޔ{cֵskks{kބkֵ愔Rc{skZR1skZZ{cZscsR1k{ZRBRk{ZJZJcZ:RR:RZ{ss)sJZJ!B11R1R:cBJscBkBRkkRZJcR:B1BZksJkkBs1)ZRZssRckR1kc{s::))1:!!BkkkkBZck{BJsskk{{kBB:kJ!1)!)!:JRBc1))!1)Z!JBZcR:!J1:B1:1!!)kJR!11skJ:1Z1!)1):JRJRkBR!ZZ1J1)!):c)BB)1!1BB):)!:11J)BB:BBRZRB:skck{Z{ckŭskZRJŵJ:BJBZBB:JB:BJBBR:ZR:B:BJ:RBcŽ楄{Zs֔scsΜ{ZsZ{Bcֵk{{sRJ:sckŌkkssskscccBskRJ)kksJZJ:JRZZ{ks{1RkkckBkJsRZckkJcBZRR{sBB{JcB1Zcsc{ZkBBcZRZskJcs:kcc{{:ZssZ1!ZcZkckJk{kckkss{BkRR:B:)!!):BZRkZ{:k{BZ:))!!!Z:)1!):::)))!1!1)1!)):k!::RkZ)Rsc!:BJ)BZRJsRkB!)c):B:!BRRB)1::1)!:J)B:)BcR1JJ)B)B:1c:JRk{{sss{kcs{֌ŭ֜cZZcZcJBBJ:BBBJ:JJJRBBBJRcJRZZBJZB)Jť{ք{sssŭs޵ssksc{{{cZkc{kk{s{kkss{sccRskJ:JBZZ{ssc{ބckccsZZkJJ:JJBk:cBskBksZJ{cskJJB{kkZ1RRk1:ZJkck!BJs{RsZRBk{:RskRk1):!JBJcR{:)1:)!)::B1:1)k)1:!)!!J!))::B1:!!ckJZ!BR:)1!B!!)J11J!!RB1!!!::R!1)!)!:J)k!)RB!c:B!):R:11)RJJ:ZZJ)JBB::JJB{ŵs{{kRsŵ{sRc{{{JBBJJBBRR1RBBBB1RJRJ:R1RJJZJJRBcB{޵޽{{c{ֽcΥZsck{RJZcckckkcZscέ{νs֥RJ{k:Z{k:c{csk{cZZ1kB1BRJBsRZJZkZJJJZRRZJJZcRR!k{{BBckB!c{{sBkJZ1JRs{{{k{sΥccsR!:))!)!B!!)1!!)!1)!)!)1:)1!B!)!:!JkJ))):1):)!!1)R:)BJJJkc1BB!!11BcksZB11:!::ZB!1))BBJ:!JRB)!R:11B)R1BJ:ZcRBZccZ{cŽcΌkss{cckJJ:BRBBJBRJJJ:JBBJ:JJBZJZBBZR:RJRZJR{Ō楥֥s{s޵{c֥sksskscZZc:s{kkťkcsc{ΌZcބs{cBJ1RRk)RskcsscckZZkk:ZR:kkRJ:kZkkRcscZBc:kkZsB!B)ZskkkBZkRJZkZkcckBJ1c{Z{csZcZ{!1:!1:!!11)11!)1)!1!!!J:JJ{RZ)ZJ1!JsZR:B1!::B)BBB!c):!:!!1!Jc111!1!:B!1)RcZ:sZkRsJJRc:cc{ZR::B1J!B)1))B11B!RB!1BB!)1)B)JJBBcB{εksccskcJ{k֜BB:B:J:JZBJ:1R1RBZBBZB:cB::BJJRJJRJJJJ{ŭ޵愽sν歄{csk{s{ccs{ckk{kŽ{ŭcsŔRsc{R{cks{{kcR{cJJBs:JB:k{kcksJsBc:cBk)JB1ckskccscBscZkksss{{)RZ{{{Z{k֭kJ!!))!!!11!!:)!R11)B!)!!:B)Z{cZRBRk{kRkk11:::!R1J!JB!:))B)1!B)):B!!BZJkcJkk{Z:::!:kkRZRRs!:)11!)1!B11B1J!RJ1RZBZ!JR1Bcŭ﵄Z֥1:cccsŵcksJ:1cB:::BBBJRJZJ:Z1RR:cBZ:ZZJZZ)J:RBZZBJssޔ楜Δ{Rssk{s{R{sZkքsk{{{kc{s{{{ssJcRskJk)BZk{sZk)kkRRkZsRc1BRB{kZs{{sJRcZ){ssRcB:{{kcs{R:Z1!!!!)))!1!11):B!B:!)!!!111!!))!kccsZ:skscsJ1sB)sZ:BB!Zk))!!:!!B!))1:B)!RBJ1ZJRZZJ)JcZcZ1!!:)B1JJ1)1!!1B!!:B))ZZZBJJB:1)B:1:RBkcŭsRssZsk:ckRZ޵{cZBBR!JR1J:RR1::B1BJBRR:BZBR:JJ:BJZ:JRBBRBRJֽŵ{ΜŽΔޜcJkB{Z{ss{sc{kBk{{{ksBcsZ極{RcJc{s{ssZc{{ZBBs{ksRR:1cR1:)BcsscsRJR{sZcBR{cJZcB{JZssB{{)k浽Z{sk{BBcRB!B1!)!)!!)B))))B!1)))1B11!B)!!!B!R!Z{!1:)JΜsck)Rs1:Zťk{c)B1)1!)JcB!):{)RBc1)B:1B!)!:Z:)1!::J!!R1)J:):B:)!:J1!!:BB:JJB޵εks{sBνckR{R:RkkcZBZ1:BRBRJJZ)JBJBBJ::ZRBR:BBBJJRJRBRBBBZJJBRR:JRBΜΜ{ΌsֽcsRsZZkskks{cΌskkk{kJZZ{Js{{ss{{B{sZBZcB1RcR:kscZsZkcZR:sZZcZsks{:Rc{ZR:1ck{ckcBZc{ks!):!)!:!)!)!!!::1!!1JB1!)!)1))!)B!:!1)J:1ss{BJksk:1ZRsRkZkcc)1!BJ)!!!JBB!)BB11Zc)))BBBZc!!:!1ZBB1:Z:!1R:1!11)RBBB!)1B11ZBJ1BRJcs{k{cksksskcZRccc{s:RcBB:BB:BZ1J:ZJBJBBBB:BBJB:J:BRBJRZBBJBRBJRBZRJJRŭ{{kskZRccRcJk{kZck{J{RssksZc{{{{{s::Rscc{RcRBJZJc!B:R{RcJJZccck֥ZRBJckŌR:{kckcc{skkBJsZskk{cB:111!!1)!)1!)!!!)!!1R!!!)):1!11)!:1!)))!!sskk:)))!1cckRZZJcJkJZc!!JJB1:BJ1B!:1!1R)c1J)):11B:B1)11JJR))R:ZJJRBJ):)B:)!)!!!c1B!!RRkcJ!1RRJ!BBZscskRZck{s{sc{ΌsckZJJR:1JRZJ:B1JB1JJRBRZ::BB::BJJJRJJJ1ZBRJZBZBBRRBcBŽsބŭťޔkZZckckZJZsk{{skZZccss{kcs{k{{kRJcZk{{kkkkJJRBcZ)ckZsJ{{cZRRZsZckk{RZJskkZ1cJ{ckBJkckskk{BB)!:)B)B:1!!!11))B1!!:))!R!)!)!sZskkZBZ!ZJsck1scB1R:B)!B!11)!!:B:1)RZRB!)1B!))!:kk{cZJJJcRRJZckRBR)!)JB:B)!!):::ZZBB)1)1BR:BJRR!:J)cssZscZsRcRscZ{Zkc{έ{ksJBZR1J:R1BBRJ:RJBJ:1B1J:JJJZJ1ZBR:BJJJ:JRBBBRJBRJBZR:ŭJR歜քkޭ޵sֽJkZkBZk・{s{{{kZJkc{΄{ckcsZRBRkkR{s{RcZskZB{BJcRkZkk!RcJ:kscsΌs{sJRJ:B{ZsccJc:RBkcBs{{k{{kJ:R:))1)B1B:1):!!1)1!!!:)1!)!)1)R!)1!!Bs{s{RZ!)!ZJcc)k{J!B)Bk!)!))))1)!RBJJ:J!BJ)1:)!!!))!)BR{sRkZccZJ:B)RR1)!1)11BR1!)JZZcZJ1BJRsZ))!R)Z)!:kJRsJkksZkZZ{ksskJJBBRJJ:RJB:JJRBR:JJJR1RJJ:BJ:RRBc:ZZ:ZJBJJJJJ:cJ1JBJJJ{浵ŽΜkνskJ11c{kZc{{{{ksR{{c{֌sZs{ssskk{kBBJscsZ{:ssk:cR)Zc{Z{Bc{cck{sZscsRRRBkcR{{{c:kZB1JRJ)1):1!BB:!1)):!)1B!1!)!!:1:)1skssc)1)Jk!BZcZcRBJZ:RB1JRJJR):c1!!)!)R:ZB1!cJs)RJ::)::!1!1JJ)1J1B!1:::R1))!1!J:B):B!!1!J!:RJ!!J:JcB!JZkcJ):1!Jck1!:BJc1Rc1{{Bckc{RccJsRcZRZB:BZ)ZJJBZB:BBBZ:JJJBBR1BR):JBJBBJ:ZBRcBJBBcRJRJZ:BBZ{sŔcs{::Jkk{sΔkZ{{ck{c{cksΔkssk1cZRJRcsZs{s{JJk)kRZ1kcckkJJkťscR:c{ZZccckJkZZkZJs{{{{scskR1:BJ1R:csB:)!):!)!!!1):!):1!!1!!!!11:!B!ckkkRscZ:RZRcBZcRsRsR:kJBJZ)BZ)!ks:!!:!11:B))RZ!)1!!){BRJ!:!:1!!)J1BBB1)!BBR)!)!11)B1Z1BJk!!JBRZcRJ1!1:J!:)1B::kkZsk{Z{B{kcΔ1R:RBBBB:RBBRJZJJJ1JJJJ:RRBRBBZRR1ZJBBRBJJcBJR:RJRJBJBBZBR޽޵ŵcBc:!)skRcŵkkkZkck֭֜{kkֽkJZ:ZZcZ{Zs{{JJkBB1J:{B{sBscscckccskR{RBs1ss{s{s:B!:1!J!ZcZkcB:::1!!!!!!BcJ:!:1!))1))R)))!!)1!!ckZR{sRR1)B:RBR:RZ)Z1ks1BsBBR::Z1))1BkcB!B!::1!))BBBR:s{:1J)JJR1B!!R!!!)!J!RkR)1:)1!!)B)B!:Rk:!kcZJ)1):BBBJ:Z::ZZkZބsJRR{s{sc{sJRJR:JJRJBJR)JJ:RRBkBJJZ:JJBc:RJBRZ:JBR:RZB:RJ:RJRRJJRR:ZJJRń֥JZ:BB{cBkk{kεkss{kkcsZc{sck{sRk1cBZsRRJZZ{k{ZBRcZRBBJcZBsk{RJZkZcskcc{kc:!Jk{Z:1Bck{Z:J11sJ!:!!1:cRB!:!1!R)!Z{c{J))!:!!B!1!1!!1):!!!)))B{{cJkscck!ZBJJckcR!!RZ::):BB:J:ZRJ:kB)J1BJ1:JJJZcZ{J{R:J)::J:R)::1B!B!:!!1B!)Bk:)!!ZRB)BZ{RcJ:B:1)1))RBc:k{{RRcsccJZR:JJsskZ֥޵ބZBJBJZRJJBJBZ1RZBZJBJBZJ:JRBRcBZJc:RJ:RJBRBJRZBJcB1B:J1JJRZRJcJŽ{Žss{:!B){{Rssk{{k{sRkcRZk1Rk{ssksBZs)B1RZ{:BB)1!RBs1JBBcs{Jks{{1ksRJBBc{cZJJsBsZBJ{{11Z:!RBBJ!1RRJ1):):BB1!)1:B)1!1!)J)J1)1))1:JcJR{k{skZBR:J1ckJJB{J))Z::Rc{s!BZBJR1J1:)B::BRccRRB:1:B1:JBR:!:!!!!J1!BB)!R1!!!)B))!!B1kZRJ:)1)J!B)!1))JJcRk{kRR!:cccs{cZRJBJBR:Z)ZJBJZBR1J:RZ)RRBZ:RBBRBJRJZRRJRRRRJBBR:Z:BRRZJZcBB1BBBJRckkΥŌŭc{)11{Ŕsks{cs{Z{skŔ{ZcֵJRJ1Jck{{RkkRZksRs)JcRssZ1BB{ccsR:sZJZck{ksk:ZZ{{Jcks΄{ccc{BZZJ:kBk{c{RR{:JBsZ1{sJB!kRRB1J))!1J)!1!)1JJcc1)cssJ)):J!RZR{sc{s{kkZckcsZsR)))Rk:JRBk{1Bc!kk!1ZcJ)))BBJ)::BRBskc1J!1)JJ11!1:1BJ1JBJJ))!BJ!J11!1!)!!1!!BJ:!11111!!cR1BBBB{քJ{RJZBJJBZRJBBRBBBJJJJ:ZBJZBZBRJJJBBR:JJJkJJBJZZJZJZJRZBBcJZ:JBZJRcJZ:JBkΌZZ:RR:s֭{{kck{ckRcccs{νťkJ:RZ1RJBBJs{k1ZJJRssZZcs{c{{cR{kZsBcscs{{!!ckscZcB:::BR:ZRckkc!JcJ!B)kZ))!!ŔZ:1RkBR)c!BZR)):JsZkJ)c{Zkc1sccBkńkkRsc{ccRRRsJRkcc:))kscks:B))BJc!:B!:1JRBJ:)1cBcc:!BJ)B:R!!)!)!:11JJJc{{1))BZ1!)R!Bc1!!!!!)1k1111RJJ!BZ:)!JB:k!ssk!R1ss攵ZRŭZccB)JJRRRZJBRBRJJJBJJJZJBRJJRJRJBJ:BJZZBJZJRJJRR1c:RRJRJRJZRBRBJRJRRcJ愌kBk:)Zs{sss{{R{s{ΜkRRR:BJRcsJRRJ{RBsRRR:ZJskk{RZRR:BksRcBskRJB)ZcZŭ{cck{kJ1!)1!::ccZsscskBRRc1:1)JB1!J:{c1!kskk1B{{ksks{)!sksJ{kZRZRRZsJR{kccscsZccB{sJsss::11!sk1:k{c)!)BB:11c):::BJBBZJZ))!kRRc1BJ!)B!B)))J::ZJ)B))B11JkBs!kJB11R!!)J:ZRcsssksRR11))1)):!kR!!)!:Z!sބk{cJkZJRkJBRJB1R:RBZJZBBR:BJ1BZBJ1BRJBRBJRBBBJJJRJBBJR:RJBZRJZZZJJJJRRR:BRJBZB浭{:BJks{skck{ZֵZcZsZk:J:Jsk{{ZsJ{ckZk{sBBBsZ{BB):ccskBZc{Z{JkZsBcc{kkc1JcscŵccckcR1:ZJkZZZcskZsRk!B!)!)BR:!)Zk))!sJs{{{{kB{s{c1R{kRc:k{{Rc{kRJ:1JBZRcsZsZZ!1c{1:kc{kk{!):ZRZRZ)1!!!cB:B)JR::)11)J!kZB:1!:!c)!!c:Z:1::!1!!)J1!J)B::J:B:cRRJssZ))!!))!1Z1))):!:BkBB:1kscs:sJB:J:R1BJ1JRB1RJBRRBZJBcBZJ)JRBZJBRRJRRJJJc:RR:ZBZBJJRZRJJJBRBJRRkJRRJZνsZBJ:cŵ{ŌŵΥŭޭscc{kss֥JJBkRcc{{kZZ::c{{kcskZZsk{cc{cZRRJcZkckR{ZRkZckR:c{sRcZckkcsRJ){ZZcZZsskZBBkRBB!1:!1Jkcc1!1kkskZ{1cJckJ!!Rc{{)JRRscssc{{Zks{RZc{cJ!{{cBkZsBkZ!JB:B!cB:JcJ!!)1:kZ:1:RJ)RB)BBBBB):1)!!:!!)!BRRBZB1:!JB)1)1!)Z11!:c:ZR)JJBR:Jkss):!11ZJR)::!11)1!:))ZR)JJBsk朽kccZZRRBJJZB1::R:RZB:JBZBZJ:JBZR:RRJBJRBJJcZRZRZJRBRcBRJRcJJBJZJBJRZRRJ:ZBŽ{{{kcscc愽{kZR{kcsZBJ1JR1JskkZkRZ{J{k{Zsck{cs{c{kRJcBJcc1ssRZRRRRsJckBckckRJkތZBscckcR)JkRRB{Zsscc!11)kc{Z1!)))!RZ)cRJZc{1csckBJcZ1:)::sJJcJ{Bsss{scB{kss1kRkcss{)Bs{{sZkZc{ZscR!J:cs:k:1!!ZZJ::1:::)J!!Z:B:1c1B!1)1JB!BR!::B1Z1!:B1R))BB:1B1!Z1JJR:ZBZ1cZ!::RBRBJ!!k))BsB{{ccR):{RBBZΥJ攭sk!sskRJJBJR:BRJR1RJBB1RBBRB:BBBBJZBZBRZ:RJRBRJJJRcBBRBZJZRBZRJRJBBRJJZBJZZZkJń{ŭŔŔŔ΄΄ֽ{kkZsRks1BBR:1s{{s{skkkJZkcckkZksZBcBRkZRBRRkc!:ckR{c{scssRJBsRRJkRcֵ{cc{BB:RcssckkJRcZZcZB11ZR:BJBRJ)!1:kJZ!ck{ccc)!ckkZ)s1{ss1{R!ZJ{{Bs{kkkc1Rs{{cBc{scccRsR{ZRJZB){cR!{{ccsJkJ::RckZZ1{)JJZ!BRRJBJRB!:))Rck1ZZcBRZB)::)!:1)1JRRkRB:BR)!kJZ1J))!1R1!JB11RB)1B::BZ1JJRB!B)!:BRsc{{{!)1:!J:Z{c{k{{sRRBB1RBBJBJRJRR)c::RJBBJZ:BBJ:BBRBZB:JJc:JRJRRBRRBRJJRcRRJcJRJJcJRZBZRZRRB{kΔ{ΥΜ{JZccs{RBRJBRJRJcsZZc{RscksJ{cJkk{cJRckcBJkkkkk{Zkk{k{c)JJcJkcRΥŵkssZ1!1scJskcRRsRcsk1ckk1B1:1))cZB!R1ksR!11ss{BBRZcZ)JJskk1{{:cRJssskRsscJsZsZZsBZ!!)cRZcs:1):ccc1ZZcJ{BB1cBJBR)RJZ:):R:B1)1R)RZR!)B:)))!J::B)kB1BZ:B)!111k1k!B)J1!!:1{1BBJJJ:!RBRJJ)!RZJ11JB)1:c1JsJ)!::RJ1RZsνΔZkJsckscJsJ:JBRJB:BJ:JJBZJJZJBRRR:JZB:RBRJBBJJZJcBJBRR:ZJRJJ:k:JZBBkJcJRJZJRJJBZBZcΌ֜έńsc{ccks{s{J{JZB:B:1B:ck{{ssckcJ{kc{kksk{{kk:BRJZJZR)1BZ{JksZ{{kZRZRZsR{Ž{ZsZkZc{s{{skcRkJssRZZB!:BkcJ1RBkJZscZ{ZJJZB)ZcJZJRJ{1!:RcskJZJ!ckkcZJ1cckZZRcZZkJZkB1B1:R1JRZZ!:{Jk)cRB:RR)!R)RRsc:1!{))!!1!1):J1!:J:1!k)!1B!J1B:JZkB!!:R1!):JJRJ!!!J):JJRB:J:JBcZ11!R!)ZJ!:Z{kJkc1)!B)J:)BJZRsޔsRsR:kŔkR{s{J1ZBJ1JJBJB:BJBJRR:RRRR1JJBBJ:R:cJ1BZ:RBZBBZ:JJJR:JZ:cJBJRBRRRJRJBZBcZŵΜńk{{޽Z{ssk{ss{ťcR:JB:Z:B:Rcsks:ks{{{scsBcsRkJskkssRkJB:JsRRRRscRZJskskcBJssB{ksk{ck:)!{cJkkcZkkJc{cskc{JRRRJ1{c)c::BZZcRkRBkBZc{cc1!RRZkcRcck:JJ{cs{c::sRkRZ{kskZRRBB!!)))JRJZk)s1kc)cRR11))B:)Rs{1)1:JB!JBRJ1J:!B)::B:)!J:R:)))!!!)RB:RJJ)Z:R1))1!!:1B1!)JZRB1Z1:1BR11B:1RR)JJ)R)1!)!1J:)::!:1RJskB֔ccR{skJJBR:ZBBRBR:ZRB:B:JBRJ:JBRZ:BR:RBBZJB::BBJJRRRJcBcBZBBRBRRBJRJcJcRJZJB{ֽ{{{sssέ{ﭔs{c{ŭBRJJR:R1BJkkZkcZZskJZcskksscksRckskkssRJJZZ{scsZ1Rk{RsZcJ:BJŵZRssJ1!!R:BR{{scBZksskZZ1RZ)JssBkB1BJcZcBZBRJZBJkk1ZBks1:{RBΥkckB)Z{ZJksJckJR1JZc{RcRc{{J1)))!!!ZJ))BZRJ1J)!BZ)!BBJJ::::)!:BJJJ:)R:)!B:ZkkR1JB:BZZBBkB1BB1J!!)!Z)):!1BsBRR:J!JZ:R)JBB!!!!1R:!sBB!!:))!J1:J)ŽsRRck֭{΄RcJJRJBBBR1JRJJBZJJJJBBJJJJc1ZBJRJRBRRJBBJJBBBJBBJJJZZ:ZJRsBRZ:JJBRRBZJZ֜s{cֵ{kss޵ޭs:J:BBBBJsŔscss{kkc{RckckJskBcs{skZsJRckZZB1B{c{kkcRZ:RJ{ŽssccRk{B1)1BZ{scZZccs{kZscZkc:1:JB:!1BZ1:Rssccs:RkkRB{sckZk:JsZ!JB1cέcZs:JsZ{){RkkBk{sRkZRJZZsJsZsk{J!!)!:sRJ)1!!!JJB!!R:Js:)BR1!)Z)1B1B!1)B:BZR1Z!Z!cJZB:BBJ:JRB1B1!J!JBR:RkZB!!!BBcJ!JBc::!!B)R{kB)!)1!)J1J:J)1sRޭk{JΥc޵εŭskZ{R1BJJ:BJJRB:cBZ:JJBJBRJ::JBZJRRBZ:ZBRJ)RZBRB)RRB:ZBRBZJcJcZJRBJZJZZ:Js{{cssֵ֥BBBB1BBRskkcccccZR{s{RksZk{cBJs{s{ksBJRsBc:BccZRRcRkk{JRB1:::::BJkcZJJccskcZZ{ZcksRJZs1Jc{):!):RRJ{k{:{ksss))JcZkBJZssc:B:k{ZcsZ::sJcZck:{csZc{{)BJkk:!))J!)1!BZcscs{cJ:1!k)JBJk1J)J)1::))):)J1JJ:!BZRRJ:)!!RB!1J)JBZRBR)1B!!Zc!BR!!1JZ{kRJB!!:!JJssRBRBJc!):R!))BBc!1Z{{cRcRksΜ{ޔkk֜k{sRscBRJJBBBZBk:ZJ:cBJBBZBRJJJBJRBBBBRJRJBJRZJBJJJJBZJRRB:RRZJRRRcZBZZJZBέkk{sk{{{ŵ޵έR::BB{s{cscZcc{kksJZRcscc:BBR1Z{RRRkJR)ss{BRJRkkZť{ńZJ:J)1:c11B!kRRkkZJcsssJsJkZ1skkks{ZccB:J1RRcJccBkZJJJ:c:RZJJJZcsk{1:kssZRJRZsZk{ZBRks!!kc1!)!:Rc!!B11!BBJ!:):)11BBB:B)J1:BJ)!J!!))1!)))Zc1J)1B)!ZJZR!))RZZ1:1BJ!:J11JZJ!!1:!:1:s!11:R:JRRB!!!c:!!)!R!:J1)1))JB!J!!sksB)BZckksνΥŵsZkccks{RkkBRBBJBZJB:BBJRRJJBZBZRJJJJJ:RJR:JBBJRJBRBZRRZJBJ:R::JJBBB:BRRJRBBJJZsΥ֌ckkkscsޜֽkB1Bc{Rck{R:sskscskckJRZJcckZkB:cBcJ1BRk:skZZskZZsR{B)JZZ1RcZ1)kZksBkkZkJkcŌkZJsssZ{c1!!!11cs{:ZJJksRZcZZ{RckZBcZRŜkŌcscB)s)sskRZZZ{{BR!)!1BRR:RZ!!:1c!1R!:B:!:cBB:B):)::cBB)kZZ!)):!:)R)c)BR!B1:Z:cZc1J))J!!!::RcRJ)1B)1)R)JccJ!BJ::1!cks:1JBc:cs{{{kskskZcZZJJJZJJJJJJRB:JBJJR:RRBZ:RRBBBZJZZJJ:BB:BZJZJRRJJJRR1ZZBRRBJB:ZBRJZJZ潭s{{{sc{sﵜ{{{{{kJBccskk{JccZcJcJJccZ{kkZk{R:k{s{ZRRJJ1:kRckkJcZZZ1BR:ccc{{cc{{cR֔kcRB{Zsckck){RJZc{{:B)1k{{ssZJ:{ZJZZ1Bk:Zc{sksRs{{{ZZcks!):))B))kRJJB:):!!:::)1:1R)RJk:1J)J1J))))1J:!B::1)!J1!::1:kB1:JBB!!)!:1JskR:sc)cRBJ:))1BBc:)):1!:J:!R1RRcZ!):cBZ{ŽcssZZ{kc{kcs{cJR:JZ:BJJJBJBJR:BJB:B:BRJBRZZBRJZBZBBRZRJRJJB:BJRZRBZJJJBJBJRJJRBR:::R{歔csccskZsk{{ZZZsccJkcJ{{s{{ksRs:sk{cBJsRJ1JBB)ZRJJsJck{ZcB:Rckck{s{Z{s֥{skJBJsZBkRJcBZJR:Bckc{ΜJJR{c{1BRJsZ{kckks{Rkk{{Z!)):1BR!)B:R:RJ)1!!)!cJ:B1B:ZR)J)1!JR)!)!):1:::ZJ!JR:1!1ZB:B1RB)!1)!B:skkRJR111BZ)1JcJZB1)R)J1!)JJ)RkckJB!RkB{kR:)k1ssZZ{kcsRk{cք1JJRJRcBBZBRJRRBJB:RJBJ:1JBR:cR:RJRJ1ZJcBZRJZBBRRJJRRJZJJZBRJJRZBBJB֔{s{Jc{{cΜֽ{{ss{ZkRRkcZcsZs{{sckcJJRJRZsZJ{ZJcskcέBBB!kskskkkR{RkkŽ֥cΌJksRcJRRŽ:BcRcc{{ck{RsΥskR1:s{BZckcZ{cc{{ssR:!)ZZ1!)!B:!!1R!!)1:1!)::B:JBJJ1J1JJ)!:B:!)!:1!ZZZk)!!BJRB:):B!!)BR)J!)J)11B:Zc:BcJc{cJJZ))!1::ZJJJB1:R!!11R1JZJ!!)JsRZ:{1!ZcccZccscc{sε:cR:R:BZBRBJJRZJ1JBBBJRBJBRBJJ:JJRBZRJBJZBZJJJRRJJZBJR:ZBZRJZJBZRR1JJcksc{{Δ{{{{cZccZZ{cZkZsRRBJ!1ck{c{kskRZcZRcJRZkc:JJkcc{ksJRkRRscc{sŭscsŭŵZRRc:!Jck!!!BZJ:BBRBJZsR)JJ)1!))))1s{ZZkJkBkB)!):!:!!!!)J!1:!!!1B1JB)B1:1Bc:B1:Z!:)!:B)J1)!:!:BcJc:1!1RcJBBB)!kk:)JB1B1RB:!Z):B:J{JksR::1!B:BJBR11BJ!:B)!ccŭ{sR)RJ{ZJBB)B!sJ!{cJk{ŜkZs{cs{ŵŭs1JJJRRRBJB::JJJBcRBZ:cBJRBJcBcB:J:BRBRRZ:RJBcBRZ1JZJJRRJJBBBJJZJZZBRJsŽ{ks{k{{{k޽cJ)k{c{cJRcccksZR:BkkZ{s{JRJkR{skkB{R{ssR!1{skZscZZZsJkkZZRZsŽޥޔֽքZZR{s{RR{k1:)!::JRBRZZBRZkcB!)!!))!R!!Rs:1B!)!!!!!!11BB11!k)!BZR1RB)J)1!!ZJZkcZ)1!JBBB1))!1)):R)!:!BJ!)1)!11)kJR)J)1:BJ1)cRZZk::cRck1)J:1R11BB:JRkc1!!!RcB:RBZ)!))J1!)J:1Z:Js{ZkZcs{{k歄ŵsRBZRJBRJJJcB::B1R:BBJJJRRJRJRB:RBBRBJB:RBRRRZJJBRJBZ:RJRcJZRB:JJ:JJRRŽνsss{kkZc樓s:Zsޭscskkcs{Js{k{kskcZkZZcsck{Bkk1sZcsRJ1Zk{k{kkcZRkZcZRcRkZkkΥs{RJJZckRBkc{{cZZskRRBZZRB{sJckRs)!!!::!!)!1!))!:))!)!B1)!1))!:!))ZZJ)1RsJ1)::1Jk{sJ:!!JJJJ1:!B::1!scR!!!):RRR)!!B:RJ!!)::R!J::JBJZ)JRcBJRB{)BZZ{JJZZBBR:RJ1:1)RB1!kR1:R!B!!ZkZB!J{J1:):c{sccskRc{{{{sZZJRJZB:cBJ:JJJZRJJJ:JBBRBc1ZRZRBJB:RB:Z:BZB::RJRZJJJZRJZZBBRRJJcJ:BJ{sss{sskk{֥scέs{kccs{{RskcZZBRB1kc{R{c:cZskkRs{νB:Bs{s{k{ssZckZZZccRZRZ֥BZkRksJ{kJJkkc:1Js!Bkcs{ssck)!1))J!B:!1B!!!!!!!!)!:R!!1)Zs{{֭ZJBJ))Rc1kBB!1)B):J1k)1Z)))R!!ZZk{{:!)!RJJZ:J::1))R)))RR:c)ccRZ1B::B1:kk1Z)ΌZRBB:B1B!!!B!)!1):)))ZJRB:!kR)1):B1BZ1BRksRsccR{kc{ŭJJRZZBRBR)1R1RJBJ:RBJRJBJB:Z1RBJRJ:ZRJ:JJJJJBJBRZBB1ZJZcJRBJZ:c:BJ:RRޔ{skcsŵֵZc{JsskRZRss{sJc{ZkkZcZ{ckkBBkskB))J:s{scckZcJZcZckcZc޽{:kJkkckkZs1k{J:!Js:kkskZ:!!)!))J!))s1)!Z!!!J)):!J)!:!!)!BRsťcRcZ!RZJ:BJ)RJ:!!!J)11JZ:R!11!)s:k{B:JZ:)!:1)J1!:k!1BZkJR:ZsR:Z1:Z!BcsZk!1cZ:RB1R):B11RBJ1B!))R::1JB1sB:k!J!ccJ:JckJccksZZksk{s{{cRZRJBRRBRJJBJRZZZZ:JJ:RRJZBR:J:JBRJRJZZ)RRBRJBBBBBRJ:JRJJBZJRJ:c1RJZ{ss{{攭ŭ攜JZcŜcsZZJ{cckcckZsZBRkkcJ1{{s{s{ZZkJRRkcJkcJkkޥZk{s֌BŔkckcBJBJJRΥkRZB1kB:B!1)!BB11:B:1::1)))!!!11)B)Ŝs{ZRRkk:!ZJJB){R1Z!1!!11Jk1!):!!)!s{kB1):!)JJRBBB11ZJcc:RkR::R:RcRZRBRBsRc{{cBB{!)BZB!):1::JJ::1{c)!kBZ!!1JJRRRB{RZcJZs{{{{BJB:JJJRJJJJBZJR:ZJRJBJRBZBR1RZBZRBRRJJBZBRRJRR:RB:RRJJBJB:BBR1RZBJJkε޽νέc{{֭:sk{sZ{kRZkRcR{J:sR{kքcZńքBB{k{scsJ{kZRkRRckZZ{kcR{ZJs{kŜkZZc{JZcB)Z޵{s{c)))1))!:!!!:!:1::!)!1!::!)!!)11:!!1kkZs{cJŭkJskk!Jc{Rk{!BcB)11J)JJ!!1)!!)k1BB)B:c11!RJZ):R1)BckZ!BRcsJB:ZRk1JJ1R!kJJsZRZJRkZ{k:)BcJRZJZ!)1BJ1!B1:J:cRckZB{JZs{)!1:RkRkkkcRcRcZ{sk{ZJZBRJJRJ)BJBJRBJJ:ZcRJJRBZJJZ:ZJBRJR1ZJR1JBJRBBBZJJRBRBJJBRJJJR1BB:BBsνťΌs֌ޥRRksk֔Zskskkc{{ksccsccJ{kkc{{ks{:!Zc{{kkksZkRkRZZckkckkkkŵs{{{JRRcZ1cs֔s{c{JR{s:)!!!)):!!11:::!RJ:))!11ZskJcRkRc{c)!BkkkJBRR):R)!BBJc:))!111B)JB:BR1))ZB:1B:!)B:sZR{JRRB))1c1BBBZJZZJRR!cZkscJB:kcs:ZZ11RRBR!1)1B:RRJ:k:!B:k1JZkscRJJ{cccZkZsBZ{{J{s{cZc{RBBBJJBcBJBJZRJRJRJJBkJZBZBRZBcJJRJR:ZJJR:BJJ)RBJJRJJZRJJJJZJZ:JBBJ{ZZkkk{kZckk朌RRsZccZ{RJJkkskJJ)kssk{{kccRsckkcsZkZcsss{Δs{Js{sksJ{{JJJ):)R朄B1)cB)1!1!!1!)!1!!J))!!)Z!1!!!!)!BJcscΔcZZc:Zckk{Z:J{csB1cJJJJBR)Z:)!!!!))!:1)!!JB1BB1J11BcJcRZ1J1BJRZB{RkRRc)JJ1kR:!BBkZZBcZ1J)kJRc:)!1ck:BJ1:11B::RJ)R)ZcZk!:cc)R1cZR)1:JRJ{ZkZZRRJkks{{sZ{{sBJBJZBJBRBRBJRBJJRZBJJJJcJJRZZRZJRBJRJJZBRJcZR:BBBJBRJZR1ZJBRRZBBBބ朌RskRkRZZkccc{RZBZcs{JJ:J1J{k{sskZsZZcRcckkccZ{{Zkkks{:RJZ{{kZJZcR{s{Zkk{kZ1!BZ:1!!)))))!!J1)!1R!!!!)))1{ss֌Ŕ{Zkk{1RsB)1kkk1BBRJBJB:J!:BB1::RJJJJk1:kZZ)1Bc:)R:BBJcRcZJc)!!:BJJJcZkcRZBJZ:::1J1JkJRJ:1BcRRRk!))1B)!1B1!J!BJ:BJJBks1::ZZ!1JB))s))JkkBcJkckZkZ1BccsZkssR!kJ:JBZJZ:JBJJJJRRBRR:J:Z:ZZJJRZRJJcBZR:BJBBBJ:RBRRBBJBBRJRJJZBJBBRsŽťťssskΜskkJsccsk{ZkkssccZ{RBJkֽ)1k{s{{kscccZckcskkZscccťk{ޜ{kJc{J{kRsk{RJsRskZ1)1!{kJ:!!!)!))!::!)!!!!!)!B!c:kRckZZ:R΄kZ{Js{)RcJs{)kB)::cBRB)1B:):B!)1c!k{:R:BBR1!kkZJRB)1JBJ:RBJR:cJBJRJR!BJB::1cJRsZcsRR!!)1!1)11:!1B111):):1J)!R)1kRB!1scB1!!!1{ZJJ1BZckk1JJR1s{ZRZkBJ{R{:JBRJBRBRJRR:Z1BR:ZJJZBJRJZJRZ:ZZZRRJRRZB:BBZ:JZ:ZBRZ:JJBJBRRRZ:ֽΔskc{k֭sccRZkckkskZZksckkc:s{ckkֽ1J{ssss{scscZccZZcss{kksccs{{kkJcks{skZc{cZccRs1J!!R{{{c))!1!B!::))!1!)1:!!1Zs1ZkֵŭJsBcckssBkZc{BZkkc1BB11Z!)BJ!:1kJB):R!Zs{RRJ:BZR):R1R1RcJR:1JZZRcZRRZ::BRZ)::1:BBJ:ckRc!!R)1B1:1!11:1:kc):1)B:1BRJ)ccRJ)!!1J!s!!1B:BkJR)JBkcZkތkcskJ:ZJ:JJBRBBBJJJBRJJBJRRJBJJJJJBJ:kJRBRBcJZRRJBJJJR:RBJRJsBJR)JRޔ{sŌkskJ{sc{ckkcZkcsZsZ{J{{cZkεJBs{s{ZRRcRkRZcZskssss{{s{{{c{1R:1)BBJcBRk!!1BZքk1!!))!kRcBcZ:cJ:!!!!!)!!!:ZksBk΄sŽքRkcΥ{ccsJ:RsBRZs!B!J:s:1JJ:J!::cZJ1BBc:RkZkR{B)!!R::J:)cJRZJc:RZBJck:!BJB:JRRR1s))R1!!JJ:RJ)1)::{1Bc!Z1!1)!)RBBJB)!)1RJ:1kcBRJ:RZBRJRkk{{ΌksskJJRJBBB:J:JJBZ:RRBRZRZJJBJR:RBZJJJBRRJZRRJRJRRcJBcRRcRJBRRRJJkJRΌŵέskŵΜ{ksRkZk{ks{skJRZkskZsRkc{JBk{skksZcckZJJZZcss{Zk{B{ksZkZksR{JRckRRc{JJ1c!JcZRZ1!!!11)BkZZZ!1!1!!!!:ksskZ{cs֌ťJεksBBB1sZZZRkZJ:sc!::k)):::B1!)cs:Zk:RB)1{ZRss{J)!s)R!:B:BRR)B1kRZ:Rk!BBRJR:::JBZJ!kB:!11ZBRsJ1!c)B:JR!)!J1:::)RZ!1):BcJcBJJRR:{RZB1!JR)ZcZcZkkB{Zs:B:BBZJRJBJZRZ1RRJZBR:ZRcJRJZJcB:ZJRJJJ1RRZkJJRZJJZRRZRcZZJZBk:cŵέZ޵΄ń{kckJRsk{ckRcJskccc{sc֔Js1{sks{{{skcsZZRksk{k{֔ksZcksksRkBRRZ1)B{J{sck:1!)csJ1B:Bs{sZZ!:!J))1JJcRZZsJ{ksZcs{cRBR)JR)JcRZBR:!:cZ)1:Z::1!)J))Bc!!:sckZJc{kkZkJ1::1)RJ1J)1)sZJJJB:BJ::JBB)1B)ZRk{R{JRB!!):RJ1JJ)1!!1BB)JJR:):11)1::B)1!))!kR)RBccBR::J::1Bk:1:ZJRkckskZZRJsJBJ:BB)1BJc:RJ1c:RRJJJZBZBJJRJJZBJcB1ZRRRBJZJcRZRZRBRZZRRBcJckBZkkń挜kZsckks{sccckc愔RJR{{sckckcZskkcksR{c{k{cskRRs{kRsJRksZckBJZΜskBZkJ1!1B:Z!BsskZZsZ1!cZJcB!:BB)1::!)ZkBRkckksJZZcs:{:kZB{ΌR)1RRJ11:1kZk{scRsc!!)))11B:1!JB11!)ck!BkcJsk!s{{sskB:JJcRR11!:!R1JJssc:!)RR!ZRRBRkZ)B1kB))JJ)))c:c!!:BBR1JBZRJJ!!R)))1):)RJ){cBJ!k{ZJ:!):1Rk!ZR)ZkckR:cB:ZRBJcRkckskZJBJJJRJBBJ:BBZRZJBBJRR:s:Z:RJRZJJJZJRJR:JZJkJRZBRRRZJJZJBRRJJZcέΥ{sΌŭΥ{s{{sZZ{{c{{{kckޔ{{ZJZs{sssskckkkckRckckkss{{kRc{{k{kc{J{sck:c:kk{Zkc:RckZZRsR{ccZ)!1c{RkR{{1!!)BRRJk!!)!JB)1J!):BRJRcs{JRBBB:csJs)k)!{cckR{{cťR:RBBcZsZc)J!:BJBRc:RB1!kskcBZ{JJcc{ccs:Z{R:BBkJJ)1B)!1:)ZB1!JRk1sJBBBZJ{JZBBR1J)):scJ1!B:BcBcsJR:JRJ::):!)):)!!!!1B1ccsBB11!ZkRBB1JJJR{B)R1Z!::cRRksJscZRcJBRBB:JBR:JBBR::BJRJZB:JBcJZBRRRRRBBZJkZRRRZRRcJRBRRRZJRJRcJRc{ֵssތέŜscs{{kkZs{ck{cZc{{csBJssskccksZksc{kss{{k{Rc{kZcJZckŌs{Z:έR{Z:1kR)Rk)1B)k{!!)!JRcZZ{11!)1:1!1kk1BRB1)JJB)ks{cRkZJZZkkc!!kR{{kJkk{ckc{{RccZc)11):!JJ1k1BJ:!)s1){sBcsZRZR):JccRs11B::JcZZ)BB:))ZBB:{JBJ1RRcJRRcBJJ1{Jk:1!R!)!!)BcZJ:!:RRR::cJJJ:1JRc!!:!)BB111J{BRRBJJ1!)B)1:):ZBJR!))RcRZBBkJsBJks:JBJJRc)RJJRBBZBRBBB:BRBRRJJJRBRBJZJcBZRBBRZJJRZJc1ZBJRBJJRRRJcZŭތ{k{֜ťsk{ZsRkZkRJkJRcskckksckkksk{ks{{{kcsss{:cs{s{1:skZRZB!JRRsJB!!!):!!)cs{J!B:RB1:!)RJskJ:)!Bc:B1BBcsc{JskcZkc)!)BcRBBsBJkZckRc!{cR1!!)1)JR!:Z::JRZc!RZJ!cZ)J::!cRs{sRkJsB:c:!::J!:B)scB1BckZBJc:J!1BB1kZc::k)BJ:BRBR!1cR!:B:RBcB)::ZZR!1)R)!):1c{Rskk:J1)1!111B!:J)BkRRkRZcZJRcŜccBBBJJJJJJZ:JBRB:BJJJJJJBBBJZBZJBJBcBZJBRBJRJZRZsBRZRJRRRBZZckΔ﵌ŵΥ挵ֵńkZc{s{cRZsZcsJRB:scsckkZcss{{{{{sZcRsR{cssJsks{k:c{{ccRcJk1ZBRk1!):1)!!!1B!cBkc:k)!)!!ZcZZZ1)!ksckcZ1ckcs:kBJkZkZ)Rk)))BJRc{BsZZckZk!!::!RB!!!)JZBsZZ{ZcR1)::cJkBk!):kkc1:):ZJBJJs{ZcRBŌZJRkcBsRBB1Rkk)Z:)BBB!:JBJ)1:Z1:cZ!JZ1!Z1RJ{B!!:)!!)B!Bsskks{RkJcZR1BJ:!)!)1JR!RRBcksRJJRRZZ֜ccks:kZBBRB:JZJZJBRBcBJZJBZ:JJBJRJJBRJZ)RZJJZRRJZZZZ:RRBBJcRJcJc֌֥ν{{kksR{{{JRkBkBZJkc{Z{ksksc{{s{{s{kZZcRsskRcs:ssskBkcRcksskBkB:BJ1:R!:!)B!))RR:kJk!:!!:BB:RRJ{c1!)cksk1ckskk)BRsZZ)Zs)!1{JBJRZk1BscZZk{kRs{c!c{)!!k!)RRZJ!1kcR!ZZ{cs)s:sŜ:1R!JkZRZRR!1J:)Jckc{sZkcJZBJRBBZB1BBB!BRc:1::):JRB:::1ZZRZ:J!1J1BR:s)!!)JZJZcBkJBJ:RZc:B!B)!1)1ZZk{ksJRRccRcckcRkRJR:RJ:JR:BZRZJJRJRRRBBRBJJRBRBBBJJRc)ZcBJRZZJcBRBRRBZk{Ō{cνŽΜs{sRks{kccs{k:JZss{{k{Zkss{cs{RcZBkksscRcsB΄1JkRsJkcskJRZJޜc!111!!!JZ!!!1!)!B!!1)!BBB1:BBRJ)B{s{Z1Jcksk:Zsssk)JBZc1!{:ZcJZs{{sJkccZ{{k:{!1JJRZskZ{BZJJRs:::c)R1Jks1JcZk::J!1B:JkcZBB)RR1:BkRRsZJ:JZ1B1RBBJJss!:Z:)ZB:R)ZB::J::JBR!BB!J!)BkR))))1BBRskkcRB11JBR1))!!))k{ss{cJZZZ!)JkZkkkRΌsZZckBRBB:ZJ:ZRBB:JJRRJRcRJJRZ:Bc:RRJRB1JBJJZJRcBBZRRJZJJk֭Žŵ{Z޵c{BRk֭c{kRZcsRRBBs{ks{{{{kscssJZ1ss{{{skB{RŵZkskR{Zk!Zss1!1:!!R{Z:!1:))1!:BBZR!)BB:R1)!!!!BJJskR!kJJckRBRkZJZZkRs1!:cccsk{J{{::Z!R!JsBR)k{sJ:csJRZ!)kcJc1BR1c:JZJk11B!::cJ:JZZRRBcRBR:ZJBJ)JkRRJBZ:R)JJ11B:!BRB)RcJ!ZRJJB:)JZkRZB!)ZZZsc))kk{kk{sJB:J:RB!1B)cZ:J{Zc1JRZk:cccckcZsk{BJRkc{c1BR:ZBJRBZJRRBB:JJRRJBRZR::ZJJZBZBBRZ:ZJJJBZJZZBZRs΄sε{kkֵ{{kRZsZcZscJBBskŌέ{{{ss{sckk{{csJJJksJccJskssBZZscRRkk{!)Js!)1!):)::!ZJB1RR!J1):ZJZcc:ZZ{sRZZR{csJJ1sccBs)sB{{csJZssZ)!)ksB:)Bc)kZcsB!1k!JZ:JBRcB)R!Rs!1!)1!c1J1s:kkZZBRsRJRRBJBBB!ZR1JkRccZRBRBR1J:c:JcJ1RRRZ:BBZBJB:RcZJcBk!!:1RJRRJJJRRB:)))Zcs{s):B:ZBk:)):!):kkkRJJJ:JBBcR!Z{cZkRJ!:)RZRZZ{cZkJJscBBB:BcBZBB:BZJBRRBRB:ZBRJZZRJZ:JJJJBBcBBJBBB:JRRk{ֵŽť{Rs޵s{{kcsťJRBkkkRBk{ŭ{{{{c{kk{RJJJkksJZcZcB֭{{ΜBRRcskcs)R)!!!!)J{s{1!)BB)1::1)B!):ck)::ZR)JR1Z1cckRBRZccR{kJc{Zck{ZJRcB::!RBs1)csJRZccs)!JJZJB!BkBJcsRc)Rc1sBBc!!BBJ:::R:Rc11:R:J11έkRRZJckRc{sZsRZB):Bkkcs{c:RJRBJJ!ZRBJ1!J)JZ1BJ1RJBR:R1RcBR:RZZZB:cJkkB:BZJRZc:J:ZR)JJcZZZ1BRBc::R!!!1!RcJssBRBBBRZ!1R:1:JkR:csBZJ:)cZkRB{{1:BZRRRBJc1ZJRcBRRRJ:J:BBJZBBc1ZZJcBJZBJRJJc:cRcck{νŵ޽sB֔skZέ{sJsZks{ֽkRJc{Ōss{kssssskkc{ZJsZkZkk{c{sc{ΌssRZsJkskJJc{k{ZJ:1B)1J111)JZ{)cJss!:BJcZ11:)c:1B:BRBBBJB):B!JJcck:Js1JZ{{RcZ)ZBR1!J!sB:BRcBRkZckB!!)1)BcJR!J:R)JBkB:J!JsB::)sB:)))R1R1:))BJZ{RRkJBJ:ZsBcsscJR1)R{sZZ1:BcBZB:::RRc1RJR1):):B:!)R!:BJB1ZkkJJB1kcsZZ11BJ)RZcRcRZc{{{RR1RB1BcBcB)1))1:JZcRB!1BJBJ!!)J!JRBJcs:JR:RcJsZZRkRk:::Z)BRZBcBJJRZJ:J:BJJJRBRJBJJJZZJBJJZZJRJRZZckksťŽsֽsZk{{k{s{skΥs!Jsss{s{{{{{sss{sscckZJcZRcZcksZccsccZsZkZ:kJc{Zss1::1Zs::JZ{ŔBZk{1)!:Z!BJ:JRc!)BB::RJJ1!:ZJZcZRsc:ZccJ:Rcc{kBJ:!:kZkc::R{{RsZZBc):!1:kBBZ:RJRB!11J!c:RcR!!1{R1B:1BB)1!cBB1)11Zc1kk)sZsJJJk:ZsZZBJ:!Js{{R:ZJRB1J):))sB)J:JRBBJ:cBRJ:!RZJ:JZkZ1!)RcBJRB!ZB1RRֽ!JBkRZR!!BZZZ)BRs))!:!!Zksk)!!!Z:J:!)kskcJccBZRZ:JJkcZckJJ:Bc:BcBBRR:ZR:ZJJZ:RBRRZcZBc:JRRJRZRJJcRcZckcŽksŌkc{s֭ccssckRZc{s{sc{{{s{{csss{cs{kZc΄kJ{sRZckZR{ΜsJkZR{sskRs{JBcsB!JRJsŌc{޵BBJB)B!!:)JBZ!RRJBBB1)!1:R!11!JccZcZ{)RZRcskkkksc)!JJsJRBck{{kccZRR!!:Z)RBJJJBZ))!11:)BZ!!!Z)!!)!B:BJ)):)B:B:B{JRR{sBcJRR!cBcRBZBJ:BJ1kRk1RJJZJBJZB)JRB:!1:BZJJJBJ:))RR1:BcB:)1ZZJZc1:R111J)JRk)1)J1B:1!Zs1!BRB:):J:!){cZ::B1R1RksRkRJBZ{cJ:kkskB:BJRJ:ZZ:BJBJJJRJZJZRBcBRcJRJRcRJJ1BJJZZccZsc{{ZνkέscscscZ޵JRs{csZ:B{k{{{k{kkcs{css{k{{{ZcZ{cZsZk{Z{{kcJ1JcZZB))BBc::):!))B!JZBB:):BJB)Zk11B1R1:)!1J:Bc!1RcJcksk1Jk:Z:RJcRZsRkBkZ{cZZZcsZZZR1J1B:c1BB:J:::B!)!!)BJ)!1:JJ:!!)BJB:)!R!R)Z:B!BJZJB1)!1{R1RJ)k1Z:1)::BBJBBcJ):R!::B)Z1BBBJR:JJ1JBR)ZJZ:!c:B)BJB!1BJRBc!J:JcRB:J:ZsJ:Z))!11B1RRJ11BR11{{cZZJZ1BBBZRZBJs{ν:kBRBJRRBRBBB:RJJZJBJ:RRcZBZBBZBZBBBBccRccRkRcksksks{Rkk{cŔsZRsŜ{kR{cJZBs{{sscsksZs{{ccRRsk{{{cZckc{c{Z1k:RJ:Rccc)1::1!)!1B)::JcJR::ZJ11!!JR11RJ:JJ:J1cR!ss{{1Js:J:RB:JR{:BBcBRJZZ1!!:ŵZccRc!)ZsZRkR:JRB1!!:J1!1R)1B)!!!))1Bk)1:11BBJB)B:J)B!1RBc1JcJR))B)cZB)1BZ11!BRRJBJRBR!R)!RB1JBRcBJ1JRB:kJccJkR1B:J!ZZR!)J)J:)JkR{BZBB!!:1R:BZc{k1:B!JJBJJkcR!)sckB1JJZJB1RRZcZRkZ{s{JJBJZ:RJJZJJJ1RJJRBBBc:JBRJcBRRJk:ZJRJcskk{sckcRsk{kk{{ތkֵŜs{΄ŔkcksZcJRc{{{skkskZsRkZsR{cc:kcބcJc{sŔsZkssJ1Bk{ZR)1)B1!c))!B)!!)!!B1):BRRRJk:JR)J:JZ1ZJ!BRJR11{ZkckJR:csBBZZcJZRs!)cBkcsRc1BskskBkZsJJ1!!!!{ZRZ!!ZJJ))):BB1R!!!)1!)1B!)RcZR1))BcZR1ZRB:J:RRc)c:ZJRBcJR1):JRkB)JJ:BRRB1R))R::!1!:1JRcZZ11c{){{kZBB:)!)RcB:BZ1:!1c{kR!)::ZJ:B)k:)):):kB)scJJ1sBB)1c{BRB!Bk{{s{:ks{Z{kZ{BBB)J)JJZJ:BRJJRR1RR:ZRJJ:RJBRBRJRZBRkZsckssskkkskZkk{ť{ksk֜cB1R޵{cRJJBBss{ssscscs{Z{{ks{{kskcZR{{ZJZsR:1s:1!cZ)JRkZ1J!1!1!11:)1skJJB{cccZJ):RJR)1)JRR:))::ckJJ1RJcsBBZZ{s{){{J):kRkRB!Bk{cR)!)!)!BZcB1)RR1)!)!1)!!1)1JJJcRJJ1J:J!!BsR)):)B1{JR!kޔsJRJJ::c1:RB1BRk:B1RR1RJJ!11:1!B11JJRJcRk1cccZB1!:ccZ1J::)BRBJJ!1!RB:ZRBcscJJs1JB!kR!1J!sZ:1:)!kZZJ:)))){s:RscBJksccsZ{sBZR{:ZJJJB1:J:JRJBRRcBRB:JZJRRJRRBJ:RRcccssZ{cssZsckks{ksZZZBc{{{s{{ctc֜kcssBJc{scccsskk{sń{css{cckZRkŜkkkZBcRJJk:1)BB:scJ1!!B!RJcJBJ{kc:sZJ:)11cBZZ!JZJB1:JJ)J:1B11JsRRJBRRc1J:JBcc!Rcck{Rc:ŜΜsZk{J!11{JcBssZ!1J:J!!!!)!))1)!)J:{J::Z1)1BcB!!)):J:kJRsJcsBRBJRBR:ZR1:)B!ckZJJ:B1JBJBcBB:sBBZRkkR::{RZ:ssJcBkJ:)1)1!11RJRRBRksJc1B1!RZ!)1JZJ:J!B)!sZB)1JJBZs{kRsks{{{cZcZJRBJJ)RJR:B:R:R1JB:Z)cJJRJBRcZRBcZZcckccksskcsZkZεŜ{νsk{sccscc{{RRJR{{sss{{kcJR{{ssckZ{sBskJB{{{ZJJRZckZc:1c)sRR:))JRck:1!sccR):ZZcJZZ!:JBZBcRBJ)J:1cZ:1!:!:1R:kkkcJ1JsZJB:!1!JJ:RckJcBcBֵBR)!1)R1B)JJBJ1!!!)!)1B):):JBRZ):1!RB)B:1!!J!J1BRZZJsRR::JZZBcZR:)):::JJkRBR1)11:sBRRRZcB1RsJRR1BZssJR1!)B1!!::::BBZRBRB1Jքk:1!!111)1B1RkkBZ!!11k{s!:J{{ZJkcR{kkcs浵sJssJJJBJZB:RBJRJZJBBRBBJZJkBRJBZBBZBcRcckskcck{{Rcksŵ{RRkŌ{{{cZ{{cŜ{kRZR{ss{ZkcZkck{kZskkRkk{:ZJkk{{ZkkZ:JZccJkcB{ks{Zk:)1ZJcRBZZR)!)JskB1):J1!!)1RZR1:Z{BRkkJJRcZJ{ZksZckBcRRZkRZZs1s֥{kkcBJRBB:B1R!!!!!!)!)B))RJ!c)1B:R)!J:!JR:BZJ1:BRBZR)cRBJZZB:BBkJJBR:B::1::k:)RB):JsBkJJRkccZcJB{:BJ{B!1!):):!))1!J!!B1BBJZ:):B1ZńJ))B!!!k{sJ!))1k!1:!cskkkR{{cRsZc{c{{csBJRRRZ:RBJB:JBRRBRR1:BJRJcBJccRRJccckkkkscckskZk{ޜ{kRk޽s浌kR:RJB:{kkcRk{ks{kk{ss{RRcBskscss{{skk{{Z)Z{BRRkcJ:B:s::JskBBBR{c!BJ:J!!)))R:J:JBJ:))BR1R:ZcJJBk{)ŭckZRcJs:RZ{)cZssJJk1!)JZ!:!!)!!):J:!!!)1:cZJJRcBB!!!!B1:B:BJ)cc:R):ZJ:BRRsJJR:1ZZJJ:!1)1:BRZB::RR:ZJsc1BcJRBcsJ{1cR)Js:!1)1:1)!B)!:J!:JJRBJ1BJBRZs:s!1R!!))sssJRJ)!)!J1!)ccRR{kJZ{{{ŜZオksB:J1JRRJJJZBkJZJBJJZ1RRBJBBBRRRZcRZcRccksskckscs{ֵŌ{֥JkkZZcť{RRBZ{{c{skskccsckcckskss{Rc{c{cs{csksc{{ZRkZsR1JcsZsR:{ZBBc{:Bk)J)!R1)!!)))1))!BBB)!)ZRR:JZ1RcZJ:)kkZ)JRBBs:1ZRc)!1BRsR!B!B!)!1!)!!1BJR1:B)JRRJ)B)J1JJRcBJZkB:1RZZsJ:cJR:RR:::J1ZBZJ::JZ)):J)s!1::R:Zk{1JcBk:ssB1!!1)!!)RJZJZ:Z1BB:JBJ11:1BR1!B)JRZ{11s)J1)):Bs{sckZֵkބ{{sքRBJBB:BBBRBRBRJRR:RBBZZJZRRRRJJ:ZJkkccckZZcc{ccŽŽkΔŽcZJccBckֵ{kscss{sRsssksZRs{kcks{ss{ksksskZR)BR:JRB)11!J!RRZk:ccc1Js:c:R1!11B)1::)!!:)1JBB:!))1R1cc{cBBkJ:)!ZZRk:)cRBJ)!!!)1!::c!::J)JB1))!!1)1sBBcRc:BB::)1))1B)RRRkRZJZR1{Bc1ZZRJJRBJB!1JJ::BBRBRR1:1J)!)!JRkkckB1s::c1k!B):!:1J:JRR:J11J1B11J:)B1!)1:1):1)!ck:JZBZ1BRJc{ΥkRskksŌks{kZBBZB::JB:BR:JBRJRRZRRRZ:BZcBZRcRccJJcccckkkccνkcZ挭Žޔsk{k{ZsZc:ŵkcs{{{s{kk{{cZkcs{潜{ZR{{sck{{cc{scJcsRZR1JRkZB:RJc{ksZJRZkJJB{{sRRJ)1)J)B)1)))RcZRJ:!!BZkssk{kJJ:B:)!Z{s{cBBZs{!)):!1!!1!!!!)!)!:!ZBJR)1J:B!BB)J1BJB)B11BBJ)skJcBJZ:ZZ:)JBBBBBJB:)Z11!))1)1)!BB1BRZ:Z:JkBJ:s):!)!!1BcRJ1JZJZJ!R:RJBZBB11!:1!1B:J):c!B:11k:cc1))sŌcRkkkkR:JkscZ:JŔ{skBcBBJBkZRBJ::Z:RB:ZJZJRRRcBJZJRZRkZRJckZRcc޽{ŭΜksckc{sksRcRRRcέ{ssss{sssssRkZ{{ck{{{{{sssZsZ:cZBRZsc1J1BZR{kZJsZZc{JR{BBcJB:RRJ:1!BZ:JJ)BBcBZk!!c{sRBZJZ{JsB)1{Z{k)!!!!J{Z!1!B1:):B:J!!))J)!1:BB1:::J::))!!)RZ:Jc1ZBBBJkJ{ZZsRZBB:BR:)RB):)1:)ZB!!Z!c1B1):1RZJkRJs1scZc!!k:B:BBJJZ)JZBksB:JJRZZ!J)!!!))!:kZc!kB1BRJ:BR{J:)c{{RJ1B)ksZs)RRJkk1skc{Zk{J{sŜZJ|B:JJBJJ:RJZJZcJRZcZRZcJZRRkRccֵ{sscsskZ{JBkkŔcJZ{s{{{s{{RRZJJZRΔŔŵŜ{cs{s{sc{{ck{kJZJRc1Z{kcRkR{kBJZZsck)::!)1::!JRRR:c::JBJBcJR:sJRs{ks{JJ1J{{kc{k:ks:c!!!!:1)1J!!!)1:1!!!B!!B1JJBJ1R:)1)11J:ZJ1JRB:BB:Z:ZsJcJJc:cskB):J1B!Z:B):BZB:Rc1!:ZB:ZJ)ZkZRBRskccJc)1!!R:JcRBRJRJZ1::R:cJZR))!)!!!1)ZJ{!!1)1)J:ZZ:J!:!!))1!{ZJRBs{ZZ:):cccZ{cksBZJ{楥{ޜތksBcc1BZ{{BRBBZJcJJcJJRJZRZRRcZZZZkRRkޥŜRcksks{RJRcֽsν{{s{{ksZ{ksskŔJcBs{ssss{skscsckskJZc{sR:RB{sZZ:BB:RZJkRJJsB!J)!)BZZ1cJJJBB!)J)ZBBc)!ZkRsZ{s{B)R1JcJcRs!))!!!11!)1:11J)1!!!!B):1Z))B:BB:RR1!!B!)BB)Bc1J1JZJBJJJZZZ)RBcBZJJ:ZRZBJ1::BJJ:)c):BR!JRRJc:RRcBRB:{:)!JBkBBZcBkRBRBR:ccJ:R:!1))!!:!1:1ccZ:cBB1:B:J)Bc!!Rs{sR:RRscBZZZcJccJJR潜Jssޥ{s:Rccs{έkZJBRRJ:cJZJBZBZRBZZZZccZk{ZcŜޥťތcksRckccRkcťsֵ{{k{sskkssZZZ{sssZ:R{{RZJZB{{sJJ{ckksk1ZkccRccBJJcRRZJkZcBZJk::!!!!JJRB1!1:R:!JJJ:Z1RRs!!!BZJ:1Z{sB:BBZkksc{{):!!))11:!B1:)!!:)1!!1::!1:1:BZJ1B)::!1:1JcZZRR:)B{J:ZZ:BRBR!:sc:!JJJ{RBJJB:B)Bk:::)1!1)1:BBJRR:1ccc1J)JB:BJ1)RZBZRJB1JRRZZB:!:)B1R1B1!1R)RBBRJJ)1):)1)11!JΥcRZBBJRk:)Jks{sZťcksR{{{Ŕ{ckB{sc:kRBBZZkZZZRJJcRRRZZ:cZRZRcRc{޽Ŝkք{ZcZZkcBkť{ŭ{{s{{s{{{kJRZcJccJ{sŜkZZZ{kތsssk{s{kssB{ZJ:ZkRksR)cR1kscRZc{{B:B!):11B1!!!!B:JBRBZJRJ1RZZ!)J{sR::!Zc{{{R:BRJJcccc11)!)!!!{c!!11)!:)!::)!)1::1cJJ1ZB1:B:J:!:!):)Z{ZJJ)!!{{cB)cJRB:s:s)!RR:kBB:J!1JkJJR!!!::J)JsRBJJ:RZc:!!)1B:BcJsBBZ!:B:)R:)):::BB11ZBJ1JB:BBJkZ11ZR)Z!:1::!kRcJcΔc1::JJ))1:s{cJZsRZZZc{JkZk{cR{{Rccs{B!Z{cZRRRRJcRcccccsZRZŔťsksssZs:έ{ss֭֌{{s{{{ssskccRBsJ{kέsZZBsk֥cskkkkk{JRcR:JRkkZZBRZ1kJcks{cJkRR1111)::!1))1))!:JRBBZ)c:RJZZcZJkJZZs{cRJBRk{ccc{sk:kkB{kZR)!JJ{Ό)!:!))11JJ:)1)1!!))11B)RcJ)BBR:))1:)ZJRRJ:J:!s{cJB1BB:RZJ:ZJBBJ{:BR!JBRJZ))J)JBBkJJ:RJZRRkskc!)1sBJ)cckR:B!:JRJ1!!:J1BJ!:BBB1BR1J!c11:)!BRRkkkB!111B!JRkssR:11J)Zc!RJ!1BB{Bk{cJRJRcRJk{{kkZ{{cJ:1!BB)ńZZRkcRcRRZRcRZΥ凜ޔkksRcJRssJssέֵŔ{k{kskkZcBZs{kޥJZsε{֥c{ZsJk{ssRRs{Zk:ccJ:ZZZcBB)Z))1:RZZkB)111):!11RBJZBZJJB1c:R{BR11ZsRs{s:cckZkRc{JBB1:!)!!!kkk1!11:!!!:!)1!!)!!!11JJJBRRJJc:!))J!1:)JJ):B1BRkkZZR!1Rc)ZJBB!:BRBBcJRRsJ!BcBkJ)BB:B:Z:JJJZJcR)cJcR:)cBJ:R{cR!!!)))!!)1):B1BJZ)!R:J)BZ1BJ:cssJ{R:BB)::J:{kZJ{sZB))RB!{BJ!::!sR:R{sRZJB1B:JBJJB{)kkֽ֔kks{kJ:JRR:BZJccJRRZcRZkckkZ޵ֵ{RsZ1Js{ckZΔss{Z޽Ό{k{{kZJJ{kk{cޔŭR֌ތ{{cZcRs{ck{::{cBRcZZ{ZcskR:RB)BJJsZkB{1:!:)1B!BJcBJZ)!:1ccZBJ11!)!JB1JRJ!:kcZ{ksJJRZs1:ZZs{:kB!!!!!)!!1:kZ!1B1)!!!1)::):!B!!BBB::B::sB:!Bs1JZ):JB)B:1)BkZB1sJ1:Bc:))1){1cBRckJkRR)RZR:ZJJBJB)1RB::B1RccZkcckJ1c1!)!ksJ1!1!!)1))1R!11:)!):JBBBR::BB1)!:11!:kRJR1R!1Jc{RJZBR1))RB!c1Zss:JcBJ)JZZJ:11BBJJJZkcccńcZń{έccckBccZccJŵZRJkRZRs{ZscRsťkscεs{{s{kZckk{{sZ攥s{scZνsRscZkscJZ{B:cR{{޵J1J1kscckR:J:J{k{cRkkBcJJJ:ZB)1!)ZR:1R:)kJZccc!BBBZkkkscZckcJc1!!J!!B1J1Z:)!)1!!!!1R)::BRBc)BRBRRBJJ))R!)JZRk1)R:1!Z:BBksBZBB!::k1)::c:c:J:cs:k:)B:{JZ1Bck:ZZ1J):JRZcBsckJ:J:1ZcZ!J1{:):!))!1:1:1):J1JBRBJJZJ)))1BcsR)B!B!:ZssJ!)1B))1sZB)cBRcZBJZ::1::1B:B:ckBZJŭccεŜΌZkkJRRsk{kkcccscZޔsccZs{ބskkBŵ楜ťńsks{{k{{{{kRRsZR:1{kcs{{s{sskskkcZccJZJ::BJRRRccRBkZZk1JBssRscZskckRRcZJBRBRJ:1ZckRkB)!BZBRkcRJkZZR:JckckkR:1!!)1!!1)!)1!cscJ)))!!!!):)!1ZZRJZcsZJcJ1:B1:BB!JZBB1)!B1:JZ11cBBJ)RR::11JZ1R:BsRR:1:RJRsZ!:ZJ:RB:RB1B:k:kcR1!!))cs{R1!J!!)!1)!B)!!):!1)J:JZ1BJ1!)))B):{kZk1:ZZBJJ1!J:!JZZsB:)1{BZ:J:B:JB:BZ:B:kRRZRR朔{{{kc{skkck{kZcRs޵ޔkkk{sRBZZkRRJŽν歵{{scscZsckkkkk{Jck{{s{sZs{sk{k{Z{{kccskZRJZRRBZs{kRRssRkcskΌJ11c1:!!)BBcs{cJ)BZRZJ11ZJkcJcR:RBs1cRRB)s{JZBJBcBkkck!:)B:!1!!J!!)1c{!1Z!)11)!!1!::)JJZBRBBRRccBRR1JRRB:1RJsRcJc:R))!1RskBBZJ:)!BJZc1:JBccZRkZ))1R)R{k)BBcZBBJ!cJRkRcR)))!1csZ!:!)!!:!J))!)Z)1)!!1!11Rk):B!B!1!!B1!))RBZcccJ)R:!1!1R!)csZkR1B11Z1BR:11R11:JBZZRJB:{{c{֜sε{{{Jkssֵέ凜{sc{kccZZΥένs{ksZs{{sJkckBcsZRJcZ::sckcńk{s{ޥ{{ssscssRJJZ{RZs{cscksZcJRBcckZZJ:1cssZ1ksZZkskRk:cJZ::BZkRJ:::1R:cZZss{sZZ{{cZR!!!!1!)!)!ΔZJZJJ11!!!!BB1B!1!!):RB:Bc1):BcBJZ:ZB:::)JcBkc:c!RJ1!)B:k)!)!:1:BJBZB{BR))JJZJJR:JJJZ:B1:kBJR::Rc{{cR:!J!!:B1kk!!)1)!:J!))))::1!)1B1ZJJ:BBB1!)B!B1!1::BRRJ):!J!1:ZkssscZJZ)BJZ!)ZJ11)B)BB:kkcJ:JB:ZJsc{)1Jcs{Z΄k{εcccs{޽kss潭RkRZZ{ssֽΔcssc{J{RkkRsckRZsck{{{k{s{ֽ{{s{k{skkkRBJZJZccss{kRJsJZJRccs::)Jcc{Js{RJsRcccB!1!RZZJBBJRB)BZcJJJ::kRk{ck:!1!!1!1!)!)ksRBs:!)RBB!!:!RR:!JJ1Z:)cJRBJZJR):cBBBBZ1Z:):!1B)kBB:B1!!ZJZcRJ:Z!)RRc1cB)))11:ZBBcRkJ1{1{kkJsZBJZB!:R::k{!!!!)1!1J!)11)J!!!1)))!BBB1:BBB1)!1!1:!)!!:1Z1ZkJBZscsZsJRB:1!)B::1J!1)!!JB:JkRB:)))ZRJk!ZcBRť{sΜsޜ{sΌk{ksc{ZZ{{ŽνZRsZk{ZcRZZcZZRZ{ks{BsJk{{ss{{{s{RJ{kkRRkccJccJsBJccZZZ{{kkkJckB)RR{ZBZkRRsZRcZZ1!1)1!BR::c111)):BR:1BsRJBcR1:!!!))!!J:B)R!1έZ::B::!!1B1!)!RcBZ:JB)RsRJ)1JJ)1BJR11RBZJBBRZ)B1R!cB):1)1ccZB:RB:::Rc:{R)B:B1RJJJc!)R:c{RcsJRZ)ZRc!)R1R)csB1!)))!!)!)B1!B!:!:1J1!B:1:R:JB1!!!)1)!!)!1!1!1B!BZ::!k)1!RZB!)R1B1)BJ1!B)BBZJ:J)Z1:ZR)!Bccc)Z{挔scZ{kŭ{ތŵ{νcRΜ{{ťޭcZ:ZJssRkRRc{{ccksk{skcs{sk{{sks{kZZ{cksZZZZŭcc::Rcc{kJ1c11:RZ{BBcBsJZRkkskR:ZZZJscJJs:Z:)11)!:{ksssRsJ:!!!)1J::::J!1Z):BkkZs:RB:1!J!B)1::Rc1R!ZRBJ{k)))BZR!B)Z1)BB{J!JR::1BB1)BB!11::c{{JcZB:Z)s)JRR!11))1cJRckRck:RJcZ:1sZcJ1J1!B{:!)!B!:)))!)B11R:JJB1ZcJ:!)1111)B)1!JZ!1B:)R)1{JB){:!)kk:1!1J:1::Z!BJR!1))J1BB1sccksRZsZkRRZ֥{sŽńŽνRZJsscέ{sc޽޽kZ:BcBskJccssRkRBccssssJs{s{s{s{k{kk{ZZkkZscZs{ZBRJZZ::!1s:B:JZRkZ{k:JZ{JBZJ!J!!)BscsRZk):JkZZRBsscZJkck{Z:1R:1J1)JRBJ:J::RRBBR:!{cZJcJJRJRJ1)))))11kJB1JcR1J)RcJcsB!)BRRB!J1J:JcZJZ{:Js))1)B1!B:ZZRkZ{JBJskJ:kBJ1!)!!JJZZJZBRR{J1RcZ!JBcZZk::1B))1!!1)1!J)!)):!):1!)!1!)J1Z)1R)!):)!)11::)J111B!BJsc)c:1:{ZB!Z:B):!1JRRB)!))!)):1kZsBRs1ccc{JJ{{ŵksŜ{scsscRccΥ{{JJJRJRkkkZZskRcZ{{cJkZk{{c{{{sskΜ{Zskks{RZkk{Jk{ccBR:{R1:1ks)RccZ{c{1!:kkJR:RcJJR:kZc11!JZ{cZ11ZZcJkRsJBBJJZ{BR!:1kcRZckZ:1J!)::JBssk){JZBRc!J1B!:11:J1:Bc1JBR!JcJ1JJB:Bk1J)!Bc:JJcccRRRB!)1B1Z!)c!!R{cJZ:RJJZkJBZRJB1!1:BJJJ:kRZsZ:RRBBZJRRkkJ!)11J!:)1:1JBJ!)!:!)J!RJ)1!BcZ)JBB!!::1!!:BZk)!:!1!J):JZ1{c1Rckk1!J{k1!:1JkR:1:!!)Z1sRcBJccJRZ֥kJ{νތkŜ{步kJkֵŭ֜{scRZJJBZRJZRkc{Z{sZRssskZZ::ck{c{sέ{εΌssk{{kkc{s{ZJ{BJJBcR1ZkRRBRssBB:{{sBB!::ZJ:Zk::R):JRsk!BscZ{sJskssZBZJB!!::k{skRc:1B:):)1:sJ!c:)Z{cZRkZZ::J!:RBJBJBRRRJJ:BBJ1RB11JBR:::BR1::sscZ!J:JRBB)Js:BZRJBRJBRZsckRB1BB!11c{cZJZRJRZB:BRBBRc:JZ1:!!11111)Z):1!)1):!1)1B):11!!J111JRkBJc1)!!!)B1)BB)!1J)B!!!:B!B1J)RB{kk{c1BRkZ))BR{k1)!!J1BBs:RJcRZR{ZJc{R{k{ssŌ@  .N@N@@A̞LA)## WhUTM 11 S E000|gdalautotest-3.0.4/gdrivers/data/byte_pds4_multi_sds.xml0000644003401500001440000001724013614005400023065 0ustar rouaultusers ${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 -117.640846184838466 -117.628433273895808 33.9026884702547235 33.8912612930438613 Transverse Mercator 0.999600000000000044 -117 0 Coordinate Pair 60 0.060 1855.34503419624093 1855.34503419624093 -59250 3751290 Planetocentric North_American_Datum_1927 6378.2064 6378206.4 6356583.8 Positive East byte_pds4.img first_sds 0 3 Last Index Fastest UnsignedByte Band 1 1 Line 10 2 Sample 20 3 255 74 74 255 126.765 22.928470838676 second_sds 200 3 Last Index Fastest UnsignedByte Band 1 1 Line 10 2 Sample 20 3 byte_pds4.img third_sds 100 3 Last Index Fastest UnsignedByte Band 1 1 Line 15 2 Sample 20 3 gdalautotest-3.0.4/gdrivers/data/small_world_pct.rl20000644003401500001440000030000013614004466022171 0ustar rouaultusersSQLite format 3@ `-`"   efSiepsgWGS 84+proj=longlat +datum=WGS84 +no_defsGEOGCS["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"]] $/ small_world_tilesgeometry'5 small_world_sectionsgeometry /small_world_tilesgeometry 5 small_world_sectionsgeometry  ]--mtablegeome]--mtablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name TEXT NOT NULL, f_geometry_column TEXT NOT NULL, geometry_type INTEGER NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, spatial_index_enabled INTEGER NOT NULL, CONSTRAINT pk_geom_cols PRIMARY KEY (f_table_name, f_geometry_column), CONSTRAINT fk_gc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid), CONSTRAINT ck_gc_rtree CHECK (spatial_index_enabled IN (0,1,2)))?S-indexsqlite_autoindex_geometry_columns_1geometry_columns++[tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name TEXT NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name TEXT NOT NULL DEFAULT 'Unknown', proj4text TEXT NOT NULL, srtext TEXT NOT NULL DEFAULT 'Undefined') I--Etableraster_coveragesraster_coveragesCREATE TABLE raster_coverages ( coverage_name TEXT NOT NULL PRIMARY KEY, title TEXT NOT NULL DEFAULT '*** missing Title ***', abstract TEXT NOT NULL DEFAULT '** ?S-indexsqlite_autoindex_raster_coverages_1raster_coverages &33stablespatial_ref_sys_auxspatial_ref_sys_auxCREATE TABLE spatial_ref_sys_aux ( srid INTEGER NOT NULL PRIMARY KEY, is_geographic INTEGER, has_flipped_axes INTEGER, spheroid TEXT, prime_meridian TEXT, datum TEXT, projection TEXT, unit TEXT, axis_1_name TEXT, axis_1_orientation TEXT, axis_2_name TEXT, axis_2_orientation TEXT, CONSTRAINT fk_sprefsys FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))A i= *$  small_world*** missing Title ****** missing Abstract ***UINT8PALE # small_world* missing Abstract ***', sample_type TEXT NOT NULL DEFAULT '*** undefined ***', pixel_type TEXT NOT NULL DEFAULT '*** undefined ***', num_bands INTEGER NOT NULL DEFAULT 1, compression TEXT NOT NULL DEFAULT 'NONE', quality INTEGER NOT NULL DEFAULT 100, tile_width INTEGER NOT NULL DEFAULT 512, tile_height INTEGER NOT NULL DEFAULT 512, horz_resolution DOUBLE NOT NULL, vert_resolution DOUBLE NOT NULL, srid INTEGER NOT NULL, nodata_pixel BLOB NOT NULL, palette BLOB, statistics BLOB, geo_minx DOUBLE, geo_miny DOUBLE, geo_maxx DOUBLE, geo_maxy DOUBLE, extent_minx DOUBLE, extent_miny DOUBLE, extent_maxx DOUBLE, extent_maxy DOUBLE, strict_resolution INTEGER NOT NULL, mixed_resolutions INTEGER NOT NULL, section_paths INTEGER NOT NULL, section_md5 INTEGER NOT NULL, section_summary INTEGER NOT NULL, is_queryable INTEGER, red_band_index INTEGER, green_band_index INTEGER, blue_band_index INTEGER, nir_band_index INTEGER, enable_auto_ndvi INTEGER, CONSTRAINT fk_rc_srs FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid)) TTEDEFLATEd??&#d$0|p8|\ȸx8d8\D84P\\x$8x(8XL088@(@0HHP ||Xh`00PL0HXL@HpT0|`@0x@d0 0@8`<@XlhPиPH(t0@XX HX8@l`8Ȩt0p|8H $|00hL0Pܸ@X$HP txĀԠxt`lpHH (PX$|pXx|\484@x\@@ $ȴ8H hX0@P Pd@@000x80 808lX8l\LHX$8@S@@^@\@s@@^@@W@T@ q@@R@;@;@a@l@U@q@Pp@ f@`h@l@k@"@`l@@i@*@@X@\@d@@U@^@@a@n@@T@I@R@R@@@ b@@[@O@@X@l@e@b@g@b@@T@A@@a@F@K@,@e@u@p@a@p@@Y@F@,@P@`f@8@`o@8@ i@L@ `@1@\@H@@j@p@P@o@a@'@@V@@\@@G@@U@S@U@h@@e@ c@``@X@g@T@a@\@\@J@(@n@V@T@x@Y@_@z@@ e@;@?@8@@W@@pv@Y@[@X@K@n@ l@@U@@X@@h@p@j@g@p@*@Q@@d@Z@A@k@;@&@g@2@R@*@b@Z@@@b@@W@`e@W@Q@?@J@e@a@H@U@Y@@U@E@(@b@e@T@c@D@@@`h@L@J@D@J@n@T@D@T@V@3@D@A@^@0@E@R@"@P@(@K@Q@Z@@q@ b@D@X@R@B@A@R@Q@:@&@4@E@[@0@:@s@e@&@,@=@B@@J:!*LZ   SSdg ==atableraster_coverages_keywordraster_coverages_keywordCREATE TABLE raster_coverages_keyword ( coverage_name TEXT NOT NULL, keyword TEXT NOT NULL, CONSTRAINT pk_raster_coverages_keyword PRIMARY KEY (coverage_name, keyword), CONSTRAINT fk_raster_coverages_keyword FOREIGN KEY (coverage_name) REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE)I]7indexsqlite_autoindex_raster_coverages_srid_1raster_coverages_sridu77 tableraster_coverages_sridraster_coverages_sridCREATE TABLE raster_coverages_srid ( coverage_name TEXT NOT NULL, srid INTEGER NOT NULL, extent_minx DOUBLE, extent_miny DOUBLE, extent_maxx DOUBLE, extent_maxy DOUBLE, CONSTRAINT pk_raster_coverages_srid PRIMARY KEY (coverage_name, srid), CONSTRAINT fk_raster_coverages_srid FOREIGN KEY (coverage_name) REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE, CONSTRAINT fk_raster_srid FOREIGN KEY (srid) REFERENCES spatial_ref_sys (srid))   EP ++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)g 11ytablesmall_world_levelssmall_world_levelsCREATE TABLE "small_world_levels" ( pyramid_level INTEGER PRIMARY KEY AUTOINCREMENT, x_resolution_1_1 DOUBLE NOT NULL, y_resolution_1_1 DOUBLE NOT NULL, x_resolution_1_2 DOUBLE, y_resolution_1_2 DOUBLE, x_resolution_1_4 DOUBLE, y_resolution_1_4 DOUBLE, x_resolution_1_8 DOUBLE, y_resolution_1_8 DOUBLE)O c=indexsqlite_autoindex_raster_coverages_keyword_1raster_coverages_keyword52 55tablesmall_world_sectionssmall_world_sectionsCREATE TABLE "small_world_sections" ( section_id INTEGER PRIMARY KEY AUTOINCREMENT, section_name TEXT NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, file_path TEXT, md5_checksum TEXT, summary TEXT, statistics BLOB, "geometry" POLYGON) hJ @L@L@\@\@l@l@|@|J @@@,@,@<@<@L@LJ ????@ @ @@ /small_world_tiles1small_world_levels5 small_world_sections   d +ML small_world_pct020bad2645fb7e75db5ed7d91f0ec8a4x}oo0ƿ FU*]]5Mh#mJҵy+>dw.7ƿ? VYFS(7(xw+ 7p:r2,,ɤHeDϋ^LkШ!"BF嬳0Sc'bWZ^PZ]>QI#~j3Ng6R >Jw_p< FA'uV O-Kz'Q:i+A-V^T!W'Q4~=ϗ{?jfC'8@A@7?o@_vc@nAGi@q@h@M@V@p@U@<@P@j@0y@h@@@[@0~@i@Pt@(@&@L@h@0t@e@@V@@r@@a@d@@7@T@0q@ `@&@(@@S@@X@K@l@P@@@9@>@S@@^@\@s@@^@@W@T@ q@@R@;@;@a@l@U@q@Pp@ f@`h@l@k@"@`l@@i@*@@X@\@d@@U@^@@a@n@@T@I@R@R@@@ b@@[@O@@X@l@e@b@g@b@@T@A@@a@F@K@,@e@u@p@a@p@@Y@F@,@P@`f@8@`o@8@ i@L@ `@1@\@H@@j@p@P@o@a@'@@V@@\@@G@@U@S@U@h@@e@ c@``@X@g@T@a@\@\@J@(@n@V@T@x@Y@_@z@@ e@;@?@8@@W@@pv@Y@[@X@K@n@ l@@U@@X@@h@p@j@g@p@*@Q@@d@Z@A@k@;@&@g@2@R@*@b@Z@@@b@@W@`e@W@Q@?@J@e@a@H@U@Y@@U@E@(@b@e@T@c@D@@@`h@L@J@D@J@n@T@D@T@V@3@D@A@^@0@E@R@"@P@(@K@Q@Z@@q@ b@D@X@R@B@A@R@Q@:@&@4@E@[@0@:@s@e@&@,@=@B@@J:!*fVf@V@|fVf@Vf@V@fV@fV 99D 4C4´B TD]][tableidx_small_world_sections_geometry_parentidx_small_world_sections_geometry_parentCREATE TABLE "idx_small_world_sections_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)<[[Otableidx_small_world_sections_geometry_rowididx_small_world_sections_geometry_rowidCREATE TABLE "idx_small_world_sections_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)5YYEtableidx_small_world_sections_geometry_nodeidx_small_world_sections_geometry_nodeCREATE TABLE "idx_small_world_sections_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)5   XsX fVf@V@|fVf@Vf@V@fV@fV  fVf@V@|fVf@Vf@V@fV@fV  fVf@V@|fVf@Vf@V@fV@fV )z3UUItableidx_small_world_tiles_geometry_rowididx_small_world_tiles_geometry_rowid CREATE TABLE "idx_small_world_tiles_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER),SS?tableidx_small_world_tiles_geometry_nodeidx_small_world_tiles_geometry_nodeCREATE TABLE "idx_small_world_tiles_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)T//Wtablesmall_world_tilessmall_world_tilesCREATE TABLE "small_world_tiles" ( tile_id INTEGER PRIMARY KEY AUTOINCREMENT, pyramid_level INTEGER NOT NULL, section_id INTEGER, "geometry" POLYGON, CONSTRAINT "fk_small_world_tiles_section" FOREIGN KEY (section_id) REFERENCES "small_world_sections" (section_id) ON DELETE CASCADE, CONSTRAINT "fk_small_world_tiles_level" FOREIGN KEY (pyramid_level) REFERENCES "small_world_levels" (pyramid_level) ON DELETE CASCADE) 99D 4C4´B4C4´B4C4´B     MZ~Ma%%tableSpatialIndexSpatialIndexCREATE VIRTUAL TABLE SpatialIndex USING VirtualSpatialIndex()/77}tablesmall_world_tile_datasmall_world_tile_data#CREATE TABLE "small_world_tile_data" ( tile_id INTEGER NOT NULL PRIMARY KEY, tile_data_odd BLOB NOT NULL, tile_data_even BLOB, CONSTRAINT "fk_small_world_tile_data" FOREIGN KEY (tile_id) REFERENCES "small_world_tiles" (tile_id) ON DELETE CASCADE);WWUtableidx_small_world_tiles_geometry_parentidx_small_world_tiles_geometry_parent!CREATE TABLE "idx_small_world_tiles_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)_[Z%BPr;c̹}wO\s93 W|/T>T#d ~%g~bD^U e 3@ P&Ķ)?%XPgQRjkT96ۗ} >:v\"֪蝃\µo9/-2. J"QNӂ$Y;,z.L.3sS4)%oA`XW9Z>:=C\o3_p{8J[/̛| m20Nm$~gY*_~+ߜ'H4g1࿱ {+a+{3XD'rrjvQ-ߙ%}=vAҥ&S]#Mq{,k>A8_kꗻv#`Jٴ`USmen8m`#/fx cK5(kŸo(Q H.2]nhhZС[d};B3O/oʡfqvaQP"ړR(]nX9E" U4mf4 -U>д#!VCKJ4EџL)``BF AC%mg`j9FOv`"s->URV/~J<?@دK:#gA4خe?;C\89evXWQ{Nr&s~lzƭM3$ zf1p(0zğK .t l VXzf|70 :8+DžEg1:I L̐"4-J~<x`[J) "ɄEz8$HۃW_аeƗM/gvC* 6IuΏu_7'mC} lA<;iX?hc3EBC$d@Kff@MJرX߶oɱIY)# ]cLLiPpY6rrrKgkk/T}-㮠sŗ׾tyr?$x B{wd@sߐHyQdtNdKn,"l%ǯ cU`)  cΛnHw+k kj NCluú] YGӴKyrM׺V'.L裲o*,>}+]&L! bf{u񠚧~ ]5z:X}?,F⣄,p#WJ/RB*y\\ Ǧ33t&wor/`?ÛO;:N|j@ c|5} u*u݅{ؑ[]k}Aćt?7BZV{=~;tR-C蚸Lvm~^Vro@G/EKˡkl}:vcp;i;Ju5T{hC)svӬwcFk5n;RФ>.O}Bc  TKօB,VvY\8S|[9ha기G7\X1Y3?2q~r8ӻdsyP;~6n?bmtVA_){a„ų=9ˢa3{9)LqMkʋ`siLn2l pb&w7IW >@L %E)q1 %ox{_PfSS]6eTPiVIBZMm~#0Ju\ 4Z;ɥx{k{˗ucf%vk|VK^̺3s==lUKK{޲ciͯǂB{ y8A. ש*8$4\B=ct2lOAcIْU s3:@$9I˲ _zit?k߼05l4Ǯ^yo=Vd9z~!+ZzqF>0[oo4y!,ڮgTtL < ھ!1SڨiNkLt8>UC0X7t-6Ztz쯛oeoQts6>y vб075kª8! V*Q<=*ixXyF0b?J>l4e ujQh=.7D]C)=",M=YudUx83<Ш68ȠL j=E"t dGhVmL{$I'bIΎ %{Xkg X-~ufŇݿ!Sann)DWQU&FWut1|15fEN&i7b quNO-F7^E|Lu˺W U~*5۫zz˯?6 r/U [8v==?=>0Igίr*&2`(pi$/./6. S|vw 1r h=FYlPoO;71T.7mq㞏"vJn7hP8_e?gmg𿢮[Yd9A)s ,ۧ3:6z_`5:-viAMׁr"P"!h>0=FJ'^\pP۰k׏ hcN7 ˵Oi+*|y ݹmƚ0h%cicƜ?;*$ ;K%.cSy0ŁM,/m!lu VjN]r0y?ĸ^?: #7 &18P7)oV,.e^ܡpVePrD"cH~ O)f$BnFo;8BlSz-/>IZM*?;;<,msk_ޱ֨gȐ-;RvY*z=P$W>oz{yAxc>vݵzo .{=ӯ yaagޖ3'?9nsŠIrbƲ_V?ndc㭄~^ܣJ+֋5us`&{X:sb~%rw #D˜ֲUdI#?̸ ZVrn}.|UVv2 `PS h|>P٘&@fS2KPKg>4.r~NRӷcKg 5lt \c3ޮ92}8ò׽nzLJm U`IRp|ھ*|M\ ;C*$@ 7:8sPEch8)3UGFK'Z5{yF 5KLF߸R1I}*{҈ '3j;/;sϮ@#H >鹭Oh tSyŒ W:zTP^{!_Qϼ 9Ac!>be* jvb!jLgg _XYB0_ŸHW,hYܳg| *Ɣi}>vjƽ4̮Hp1")B9JZ 6̻78Cjz7f{jlbeieΖa<8;V(_t-,twbE>|޽5ƋqX$a*}W΢gDmRrnF FAF8c;[+- sfhYWroԼ{Q-[\;é-7j ttRo"aT^Ul$fB5=\8w@*N"̻[* jaR4eԤj4/|齹bG)E>fzuVc} =}TDjK632GwԾ4A=SP+VgҭGʢB9+!&N8GsRSS(|-"ToCK~DI qi )m~1N&.D^%ZBraOYA+T=)t=?g_׺@<1ǺkWlnwtu b2BqQD >/@FK1ԁ`N \WQ|Da;zIvLj3XQ`u|\&'']/NȌ΀;{_sqw^L|;:$Fsn iv}ذě3/jv}0jS4<%&Ic8w`p-!4nuaδ[D9m^(cG_D6R,q&!~cGvKBڴ 6O<c][]|zm .t ۟eo60e?##]HJ6 ̑q&fG jH6k]0"I/bwݘ yo˱6xfs"Ui?visY~q/a%WY ZQY|l´ ->>}pԫiצ: 0xGéA-3ْ\&NL:>~ ȼh 5\C\YhG‹b%[!꽻"V/S3Xn.E{#Pw2xxԖ9H/ƙ)U%P@K]&keNmM\:!;ZbU #dM^mi-+w?UWus.=WITݓwݹ1ÝvRg>mi+ V/> Gɸ쟰'Nu8&?Zn-wQ˹KcJuXuȰ=%c%&xpÍ))´OG* #Hɴ,$0B:їKBi\K# *N䥯 d:׆][wi-q}7y,O/ yDq"GMs:ٳ$-D9hd`{?k/mS`i~ȳ:~sR{TԫisF}l~uGo SzRJ=:/"gfn nxtkC_XuG՘_^gr6 g˞!Y. Mg9l*fz$cH0/ _i2.85c]}ҬA0"R=X+%^c[\F#oY<=5Yl|C0Kz|y 븾eN3 |0Ŀ kCsYl`n[ᴣ|ߏhD+pRGޥV'hծ.XYvũ]{n@=C\&`61psoXv Kݏ!LሢjxUGˎ.o# Eɉ$[Մ=H₩HNF Dl@>%>P[ږרg|Pk-29N}YU_emE(rY?қB Owr7GSS^5;#=ؤx"N)wr&}緔,LN:5 kGl0=dɚ2㐏~:#jrWXCR]%b&E:qI^MaT<,Xs7LT'\4a(V&~ d3N"S[.! jW ։q`[dϝϏI|;%_]#J \!Y:LJPK@9- ;pz䰠nSS^;w_y4BW%df .9j> {VSթ ͘C`kjߝIۀ1c^uxXc8mw{k"0AKR' |ʴDWRdU;tqC.}춘ϰȔ$-.,._!2V,W,)2)9|^ʵڹ$)9C`QyTjSJ3;֑P$|%-qۓG5'#,!΋9YO 0`ֲ=F?I)~DEvG ]68ꗖuȗ9np;חc@~_fS>)5zШH}@\~r"V$Q_V |b\rpvN}^ h,Lb!hryfYzk$XQz<=TeF~U>F=&0L2|k$$ib!Qn]hK_ÕyƝRelY)09!]AMW`ʭeRtW<) gj_(Ny.YP0 ;v:68^z(ⰦƷ}Ϗ Jy:hا)d4 ٺ %lƹ9gFX@v]jJbGTsƣˠJ_έ$+DZ2]b<\K|%!ދ14»7<ԣ!+wf`%w<7t31f$0)2<#~b8.1Ύ7^\֪< XhLMhed ưʸEi̺bMĖa֟$~2K"U20YSqHvJ.!Xa#=1;9Cr?~!_eSlxb(y{`^Mjg ܵEA Cӑ7 'gEř^ uo#0!p誏c"8pa&,;sh:Quo [ /_s%fz*ã +] yf\2AU*W *Տ, hc ȅ>J@ NTȶ>iw#n} ̃+;{RmZ]48 :  :%:&ȅKcK`,57$bYk8M~NEzfk&~^qjQ~UMRDiMg2d'X'8 d&L:¼=o;LPGL=c,ߺittyT3~K7A,(*yگ<횷*u堳eH_02jA­P%p"hO’wb &cp 2 6KI#&H,,,ٱ2!i[4^a3$0m+&*IRr> FtYEt-_BO]&n~Q̯vV;d(q.#w?ZS<89лjGgGBg 5Yb:δ}`ATI|t 皲{/I>)ņ1IE8y+߱"+ޕBagC?B& h0\GCEѳ5 S )c]S*xV%5HܚL[O'F4`r&v*H?)*9><=]O6U-= ;5}3aH%}!c#,;}!%ڴZ?<'|y .`1 Tb)݂Έ>\T:^r_ ORmę3)?,_A==` 'I vxߧ2a|VKr`,"TA7TQ*gb5Xkgzh\L˥k7q!{d N@R= *.9uA3'5'Apu&iL}VKE c`Xoyu,z}%;95TӫN3՚ܧ>r0RgSa=? XzDSGT$䯙ssf FIA`5BT*3ƃBUV W;$ &UpƣQDz=qvgjrW~,+fy8HCh򋒰%81Da-.=:rwsn'tw1온g^zhMP`ku*H4S7CjeY@(iúcP4{"Mt^x5kal>_uwkZ'G{3 {Rd`Q1X au:qXE04p#MsQ )8hPؤ,Pv=s).jC':x/\"Jۑ 3fپ?M&YѲsnCA: z03Eu.@ -C}AG !sA+,BxV(S5f3d20g6%#V{í?|)B@>Zy`Y^w.a g;29-0di J2}*>dà.g_[sE̵FY&b ;`&))g{IٮfFE?3/A')vp%ev{+d-m%^F>QrH#a6ʐ(QaΟ`zyw?~}0.aiX4aL++H/"5ǰC0xt 1^Y& ?ЇGW&͹-vL(Ӯ8΅'b&7S)陸D2̬ I_#j†ƈ$N-cbDlf:!*sC I? uQ:YLbgo>Ih|ɒH*+  #=X\NseH ՜@rh.I,Az+P(O ̍vq:5FSް2BK_!PFŠDR75ߖ-YyEu\6c7<`c0d.\iqʺ(8HeoD(b>;2S9{qْU^Bc Ρp-td!7qi~cR 51 ˒zv-\zjxh᧖S*əB,g*cbLϕQIe?ZCY+dg2q, FRs{ktm_=ݖJ^zVwMS54̻N2u~qc1ȱGA=F`N8ܓ^|sj7wkW@myƨU*S{`y3tǣ:B-%q F"u4)]z]qޗ٤ʌsнu]P0рSDvNmp-)6% 926QOEۓϯҧNR3?2Ӎj}Qi݄}NMs@w9!ٵMCv-zXF8n6zjhi52$1X[y.\"̄9eMn)ߵ@qpWb.3tM{iW5\,m+ Cv[Xj2qM,N7a6#D2(k4H 4O*t;j@7*vۏJrxFCR Xʹ,a`i۬?wR+.(o\c-z0,*^YAP29 Jt@h&~5Qk^M=@멡CwOSOyeae2DPqD=+lșm:r6Pa7Mw2;qHָ%e܆l.?![ VߒVW?K2L|YڰE<Xv6ea[2l!ǜ5 xl` ܈1#|z?6h-1N21~>.l<$6hgȔ30.SX3E"?'J& bu7le72Ċ~}c^.&X[.sS|M^@ha'̙oʼQ[>wm6GAaEtEg\Ł,',Jo)MN:KC,{'O~i[\'k\E4jkWEr.hYY"uJ$9 uG()sM`R4&6*&H18vJ t1)? ŸfFTTϐO4/I.ƛ =!pψ{wAwD"SfqH-E]lW'5͈ F>|Hk+y ۡ=pI*gfEF1b _DkQ)Go`nȞX'lȉ{:RɸH5֬חՅii'0 vne>_a8\p:p9sS2>ޒc jzs`XLB'AB4nzq5Բ_aŌRQQѠ^+OCi`q#;q[i̵xa] d./ wRbx{޵hH (Ԥu4||?,ԫOF°^c 5IQ~ @O5 ,(~BGP%LtC .3yvZ- e)%Bj=>o^yb}Z/L2nM'LKN0[⿩5ݼ^ťsM3 Χ:@]T(0&W&sٮ9 i{M Ƙ@'t UO-WF5Ia OG'[.Z9/i"؟ lj#o!cKg곭Vݏ9| I!G9- IO?vdRՌqc7EzO!46npK/'N, ~oQg:M}ׄ j8!e[k3`%T@G$mЈ*~u*)X%y8%'JgXnCbl;xKo0,82႐s@HZ"$C{'+'iz ևWf@V$%-.{B`[MX_|U^fiHJ|%B~7/0*z~vKd Ѻt?ߗLTWr6 =-&=>U VU]3t|v`sԳ݀t>d7By0̃6ΤunysWXQ0SN=€wXz1Z#"dN9ig n{U@.+M. lo1~}. R!H[_h.}C[_)]'pr0hs):ۃBKmB3T;aS@<4HAH0\H^9R1ǜ<\sgr+o K ~t=J$hFC]iRn>R³%.XO_P0RpOF- NmC-ɘw}гՅ.FtH)PkdoR\.xnHF7͉ D1LK|Mƺu|*k:C@ IEf2\h&HL26+#w3F5SvUA_@n{ :2#b%(==׸ MPN$[\ ??}#QShqfvDÃpu5fJ eBaQ,I1&dV۳eH.YetB</c")+ Rd–ąԳzAЊ2 _Uk"&^m$;2ep@'خu T;]GW-欟P}^X)J$EV)pqBSpYd[$#89 `YPOΪDs!)"xN xX~2 #)#)gshQ O֦qX(ːԴkeA* &KeEkGo8drѡʏS52={_uP+ BNm,Jb`8%Qsa>–1 Y>6.hI",=~y S\(RrLyoeO-@$Jn[: \ H <ڬߔG[oR!*`75w3AStt1s!C%dxBޡ^Ư@8+~E k&5 >}"DofHyeqW $q̬lEAo\<5n]BYMLllVDHraX!*Elc)tP1Ѝ@f/䎜[Jw`mbkhYDp5@dA_Sys@G*XLXt6oQᅬ]OW;C(ʭA/Tbw2Hk 󈁛+d9\g'}M)!WQag[?8Ѧy(R)#d-"m ƑYH%JL Awc3D J\* T8"9ǠNu[xӑgȺRr!n"SNrH\3RRq Hg?#C/x[MƩX#" :10G)(y0WB '[b+啒_'ka%"'$ϕ`[L2`h*"ΈLKA)w]JggOAD6aĥ"a DșWlj#1Mh[2aR)fuLQF;'gAEXrOЯPȸ:gȭb4 45Tg Tw4cdX >>gۉM1ؘn/m$DnqDH>ڤ/#SCv -,n#f p {+!0`G+rV8%PD 2ΪO A=@6!Y;$b"A7?Wp=˱XX1f|9Ngd戳 :M:+{:bFQ,*5^֍B |džg؝G1x"T9pm!39d&{VK.\BEVr^xo_ \ZK-HN(23Yl͖W {SgfɆPq㇇LŜ qif( Ԕb\^|<"XETY)p:@")&D?gUbP!%lևf%侀.m&( bv"p+ 2Ik{F`T!fOMp@˄D@;bÄR 22]:%獗g8ΩHY6ijpO6`mmERn%pHڋ`EJ$Eū0t纄I~度]Cx0A&]4paqJ FRo9=)#FV[Y87xhE!~?\&rT׃dD d`Hed4Xfc<1ca 99I/JE|#֫5`hobdIPěMRNfdy:Hhj.W.z o!`]wgOׇ-Gm9p6nS#ٯ$޵ ,#gT}=u>QA+4}0WU6vHݑ @EkgfpyvE)<.Evb vTA{m}zܵDANENCKfŦ Dy$e[C-8sZ/NMąGSqS|XY5!k3mn>셍5j:A nR?k2MZ)ex%v+3$V߰ |[HZ)q' xщܛ@֚_LnܝZkj#nvoC>$eF32Mq$&%c!rq`TCnj)^I 1 7sMe:t8f՜0:Gs_e}fv߯D7&qjXcO'fJQvm Cfg;DE!P_Tm0wWYFι __r+?Kcsai?cޙisn͹˛8۔|g^!>!ӴEx!}ʹC紾)H^#9]Ƈ:Bu?L7i ٮHA<| D{jyWz #pM2#Yrqε/a!Whfutޡw7НQQ%LN˭*eٴ [<)GO/$X2,/xO@}Iks_7f+RnUg4T)5;47 &[u\Wbb/ӴxōO극uP'ϕ kRg!w(,i`|i{@c !kژO.F(DaAHen9;d en{F́ӃN.u{3TRZ5}1stlІ{7f -=D}wWg$?mO.Z涸I|cǼ klyv%ẳ&]h;,:͏#ifV}φ[3&swGιUn .^׮7)ʎ!r$=uTLj,_5T/de ke)INyw}jk 燏6W IbjWЋW _Ew_ $u >+:ӭ2j3mMDm49+M4^{ W4rn M,^RoM=fޒ{zv=y~rϪWeeEg)YܽjkDs"鎖'Vn~^:Eν[m;R&Q:Xm_@/8EhklVIT,Dޗ ax!$J[e"T׬}&oF 0ĶHX$*Ò z+.ғWQ,48.^sr(eg뮐V]V-GhVTx-qZqwk.1QBNFlF<2`cbhiU[uNL{B^D#4k\ W՛U7J.ڟN-hiSTeFXWx9+Tsi7!b ~J]rg݄WrN̪?\F;LQj:)[Cז[ۄ- -մK hu"#*KSNeBճt͖%ZZ`&cGAg{Ylj@ο?I4!.pX9X3-!kW-ѐygk:ec'ܬnE.4Ī6O-3OHagWb{>5XJz&fߡ._"e֝>x&E?ZpmdO]TQH LT?[+^ojEUa~%E-a.Vt_ ,g 7 ꈒ KȖ:+}tyuҡ9,X߰؄9?&}j7 y}o;]pCPIP'wVN^3q7i`6- gU]n2ѿ0e K3Iz?6d45Y;ƙ㳏J3{պH#Asfpו#d9ǚZ2 3vL>FZڣ,G&873)~jUE˴?#RMqwFz`O{,KF@5'9R"iin$^eyz*z- GS)ͫdJt硉>H[}}n|66ln^)fz{EBZGS'º_8_{HN'QMst?%ҠB>nWCZ&&$COQ5 ͻ'7Mj:B#o]Qhx0A{yXT,S)3HișD%+Su%0Y;`x]Yv+RtPpcCy"'*Xӫ)Wyj(p-ye7CXvXZY*'4c)j;?ה\wq`plMkLo& `*,+hVy8ji;ȉZbɊwpuxTxn2pj\xnL|h2amϧVձn©`2b7:H]ϺE6 1 8c w'Υy%⮴iwY*Mқs9\}PGgٽYdup" 0nghm˽Y)o?sr9DtgŕĦd('7ݓSib=霡}>LvyQөt|(ɉl.Q.g(ow=U}KHFb# +RMɿ̰Mc<+X ML)ti?}mDfqFzTvvz.*\l׿"l׿]x{@L7~吒ʡ[9$i E$I&*g5$b Ƥ(DC'BHHʡD;I(TZk~Oa^Z>g"_Η(_=w}Iļ)ng3{zy=띧0H_ϸ"iiٌ_27=*Ӂ/%gj߅+ jݘmL?k@*f=LmЊվ*fDI5+{OV1sM:xՈ#˽=>;: ʤx_1"^.Ov: Yqɑ_ t6x?R_{&d/~acvQڹ.~c̜\bmp)cp.X՜XuX{ (Op}VV$4tѐ2|v ~`Y>ǾEqmJ hyK҄ڙ.[Elp`cDOH n\C ڏYqbУ-v ,ޗ8Vض {5Ɨ}&Ywυb{NO8Z9U G* B(PWp|%$g g*D՚f~p2~qY )fiϣD4W9ndd((b .?*r-kA)8B;(H5E9?U4b|<1Mo D;tQ1-IwXB Aԗ~g}k(& Zn۾< }8eŠ%ƺH«~0+u6{tB_鲿ŐSqoMCwDJjE:3K7BFLȦP7\fM79MO% v=@~bӧ-~1l'k/3bdy'&OWDWe.)&/ ,n<^B{7l .fC}>x7)@D`?[l@s JDmkJ(8ԝtk4Lwrj GR/aKfZvbcE:mH- Ԃ_c8^.qæ#ݠl:A;kL2,Y83ԲM򙐓=6ɦ:?wQb͙$Rz"`0ن`QmA&od C"BG龪kPێsfܾ {\Z @.qbٿw}  b1)/<[um[/OOY|qߝcqTq)[NPΧ7zj?Fb#-R>.7,OX1Ft_alo*ކyxN޹֙bl\ _B6/x$7gV1'ޙ8v(5 UV|a<0bC\/׳# +{M@i|d|mrާG;CG]z|ɛ9DRvIo^C 鮄_ymi0v'ǵ <8ݖI~V~>i!ק$ 9%!Y Z?l~gun!8n/hkׇ9d7ң,:}jJGO<[ uǡQ~Qc\2W7XjK7y 6y:?1W{ -⏯_%d1k4ڌ3B_Bxb#>y գ+ދs^CH۬[$㍾Geoz9h6 :sm/nQQ1JaӳI /Ӯ3im$$υϺ ˒[xL_ }kY>kZwX퀗΀Sv[G塚6~A7P’EWJ ~8ݡwr>|>`Rc&n=܂}7/UӇe|m}~I#+"Z^+3r_N 3BAe&8 n> ?%]0GI,Z^,gÆ-ˢcYySAU~feffQ|cN^Bh0D4VZYu3o1WgqXpЫEJ?q0e ^~-n@njF}idSj #(,(`5skzN^ B\;sǁAR.;nV :>`aA[fA0uTr*CtR F?c-nك;{M=E38+I6=;"3v̓V$OtoV^&Y/38GtT8jw]pt]fsMoy;&[7O[} te+d|;vɌSvLq gt5=sjkD GyN0LJ> G_Zݹyv IID¬6p /6۾mצ~,^sVJڷn_VC FwAtJ :Q3 S8anTI#TƕʹU0vAO?>˫󆇎M; $JNXɣ[Te&̂+g>xRtˤY8v s'kI30K\YŴ `3io u OMZ;~Diyi|!*t46y0m{c}E{g{"S|Ѽk?_'\o@Rh,٘* CCRT΁m1UYng:tv-d׎n sBl)E\v|ՅԆ{Y-'} `jb⣪26[>;}2y[q ޚݲ=9M v/Ϩj`tB W ]ӟat;iX+ڹʪ}5̛j xͿ]?l tOm9ƹ~1 vy0N秷PJ'Q֧F` h Cw_F-l^8 kB)RWdO5&6t+naxgXLro͏3&!8ϻWe(5 zZSoծ eͻV .Rrv.>ļ]6tdI) )(9~ueuhj;.KbIYg )^w?Y K!U.@ :c2,Q|PwvtX mc`ZA*%@/iSI]Lu;.씳^vJ!O4N/!9?;O+IQ'5~( f6})rYoP'Cb'u}OĻ>gfWP8zR<[~Q*?eZo)J9 |aRJ㱦 5Q>}v7`mΣˇ.am6ٻt6pUJfB$ eKAmo\hHE)]I X#"-}CMR<HX ,viX#:yKXD6V DmMu_8sF]դ|հ{!d+>QCalIHT6 l &.pjP. "OO nClvp̩zƒ4Ǿ/L sic?A }CazS;Vi {Nxu8Uw]ijw`pmьk݌)kĸsyL\PG.88+ `wS5ږtb-WNk)s]bGn1,!΁v1\t P2MgߘpǬ8Pd1 d^)M/'P-o9#}:wI[r_b d!b:w9v̵ Eio}(R0ޥwaSԸR=e7J/65 I<摒 Bk?];T6b8Ud0t5+FS1|#_-VZMA1q^ 4f97,PȻU=V} 7,Z&Zjg%u8Mz튔8v .rl/>'S㮮?5:]vJV_/ 7~ѦYrrY_Nh 'ϡ=퉅W Eޙ8`J8FC~UlCm~|0r:*v|sچ6t&E^l= BL#WR@~!cnig'{F:B@`*$ף.(tѯU2;FOz6- >y׀ L>M?07CG݁"ݘSnk;>7hMl:GGclWI;~C,eOYA*fmHW؏/Uݗ^¦v SF-zu[)͆w@XUFaV8ظs2]ꚧM7 ת 4]\j󂩮/CZ{ta Ul`UFL غ+{߭<:kה]rtƺ x(j{ZLuk i"̥X' 0Bد~ΖR,FU};u>?yz돉^|-5Z`=Iџ%. WozBF}G'dt6*=Hl;S4b݆ !ǡ]_;rL[w+.AhW,k QO)T⎦H$F9e1H/_S1 @JmG;+y4uF (S{1CCFDEż6F2}6ZBCɌR6)#B^FV]<`HGB7l[la^3u7TFg7?0! ]\qv8=rH 'E3*"Ťh*)NuT1vAfǸ.Id|Swx՜9gv0 w/63QJ0x^M6 f-y; y|8j-nDS3]7Zn =laRz!n7{1NnqlAh)*oP?#CJZٲa؀DfV22wδ ^>mMҤi -f.~>~[.{֬v|@ V 2 #k762յ^,[g>}0_bZf On~T^ӡ\ ) C&?n(Ҝ?DZs(EŽ 3->8Pp rˏ}wGoGd\0jkٛ _g,p!٪݅Dz :%ƐtPhG#\8.a`8ȲwwrOO>` خM+tɊii4AAGTOԧ9@8gN^5d'QV>/`Vu5|U 񪷇FK, GBmg?aNa4ymyuv9^QwbN+RU ހ~x@D)t<\%Q\ʽJ})N"a.@-f*/8@K plzL nӡ@NȴzLm{u}6M?!ƗEY-?cZ5Pd@Yi6_j.6:5ߌ ?$k~tc:=jI s/0v9_f+ Bѫc]8*uȸJ/)=.{]:Ahp[g6Td{ލD5< Z!9$ 9Ð_O Qep`wBoE̡n)?!],4 GA%|DB وWr}43? HhЌd UVN^\ҦCMMjuza{:ce)-'\JHЙa^ki`ʥlC}d܅Hl\-'w9w7~{sI%j@+ (WhORjmNPG}oLJC\يm11[V Bˉd |l;*ҿ lZQ1% HF,&z:ϼpv0 ;.Y?Y '/Nv s4Iƈ5#iР`˪zD)D$+nY7l˗UNaywՂZl:m{p=C=:NUG,3k2-IJ`0C0o2j6ݗ3^bqGϸaT$Nw̟<P*$[HC&LL\2iS4#J@6ж@'N;[`? 9KqLK-1Z^㕱j]ܵ?^,rdo=@skAƃKHD}6 b98 ;Kg!b7v:[+#^^ ߡN.m t 5s$, _O}M/[b N$X`*7 KUW$0%{i} 'NޥGʼ ./H(x>f\S@nkh94iϏ}r:;{@mtQ⽀H|MX2څq.D-d=4H5Z(Vb RZa7(@1 O6d (. !`Ǐz;:yxuQ"|D" H8*L!3A$&ݣ`<UVU&y=s: -[1ݥ^O&N;@BҐH=:ftٻEKӵCnFVqKI/mX2,rR"R [e?V0Fc7q.ڌ( [L@d7Yyӏ{s=X,G^L#je=[]*҇ɻ!yMUUca⺼?ڮh`?jRlFd.1m_//ۢ_0BP,F Pg 9) C w {xu0L}62C6!s+"v G {LĄtcO 9.nef8 VnjuuʇL_\$}#p© RaHIcoŽ ~XPfcEr n58 hA/w< 26(4MbLz\t{M}Jmh_%qw[m\P-!\܈ȶP0s8`=!r}V/yo_xysty4)aSX LT=1W4}) j"zoS(CԃHe;.D& >ܵ{k+\1>ԡQUE,YоJu__*Ú7jN/$%!Jʗ"'7Z_gP #& ^y;c.hTF656 |t4b.w>,vt(xΎ7+`#^ΕTTx$fh]gVDGVfZ.p/|bsdm湩&Ӽgߦ+8: e;Ċ[E{ o\UO 1 I XsKQ籠Ai;6fʺ1Rq+'w٦ގ^_E-N 4 m ym}79nhs!`(O/@@U?8Ik&g8x&\p1U+a~c=QqIP);odg;e`_ 9L!֣Lt!MM;WZ)vt ^|RLB(ʢ PcnEȦ#)Uj{ݨ멷*iR':OlQ4a1LX%3AioӮĦCTCҼ:}1 M*:!/P̷̪kF§?}y/VM,G&ʯ`h)0_Jhcuau'C4Si^Y|$h`kHaʖo[uJ ڨWn1+w2'讪@_=74Ozq. sA@1W+bB(۲y*ӁEh3 ߳5{GݏrIBvrW@O C[FqSBl52t2صS< /T4ßQ3"9bvY.['I7%J񞔍چPyl_"w;5Յ;t؇Fu_lqv0}-3(,?pgJNL_WWmʵaa*@/MbK] DOC FK.|kj[XP5t:0xnZJhs#Rle葄Ћ" ?Gen"t>e"[2yO㐡ALyMJ<l Mf;1]Wmh叿T|PnsLQ#z;qu˧ɂ) a5TX:iCouʎϩ.N]rvd.wF4ób! Ia8xOǖWR)42KrJ=ҽ} f\F ȘV(n?()maE HOU8܅ۤKʁ2.MSnxXײ jrf/uS_h.t8bv1A!M踜Rz[?/f?/;ےVm n&̜KL|@#W#%)/ĉոAJZL6mEuC$x<#?IPk8s>8.P! eDހT,$+a_5T/Xno[0'̨|iޙL T[t|.  m!}Qvkγ[[ҖPU)%,I'I˩]/0DF ;~NQ/k[̄Kꘈ'VQ -o1T O֡5A"^U@2a2ZQjRה/.xhSbر,<խ9m7:8h ř$ $d(itjshSy &\?>5oO-ovˣS%,#  DO2mF%%XV!1!p~Rto1hb) IY_cQYem*R{Vm Lx>a侸ҍ/NK 󨄼G}g} `)0 )K`?Lyȸ8KR<.U塴 ɇ+"G9W~tZO^ӶLiC2%K:}x59:Ar~qHȗϘ)bHz>lfݤfUʗ#Z8/TȌm8}Zkqy8h\RMi 4e, * Gz_:qZ>{bzFlXP$b." 5*^Z9 |Cr*(I} mdF\ %UyP,CC+:U)!3H ^dʳyn<{tqтUА[3y@qt nWIYadV=AW-*}2&P+"m~oS1r~/ ^:#\Im-w&%*c!}ʅ paewEg nLۿzO82ԕK*!#N*, M'gH (*#0tj$*GOrjXto,es,ଁ5 쀸 3.?]:qj; UnNtqj})ZQiq-=2wUbjJvgeӋ3S / ;C `U r*ݽF@ق CH Q ( G<߁t~f\j[ug䰩~hW{;x+tR> 2L r!xPZEF#7Gjzeg~CpqKA';|m½ "Ned" %0bX;ߌ7:ƴOm>'9H|"=3"]1Ie)2q[]1192S_^7MM}\ 3aI.CՎF TK&YHZg/* /&T^p )k:VF{V~`W'aϯx[%[S8%%~mKՊ}KRa?SYIv㒒`c#wӜ,q*y9U F>m;Vѯz%N N{_8HpEZa/X eȆ`d q CV5Ș )K  ü*#Ҟc~ޏp$âQ(j#W#0Ed(v#na4Ki~OGTIS4H/# rY:PȮH'9T&`k#kFJzֱnmD+b tVXfx 2W( ~E % P"yO)T?&PYp?S;ܐy2;Mo(H*yIE_K4ƃA<*0*' Ynj,L$)+7FS t.-08xC0x,Nu7wsa2.+BOPUE,)9AcAF 1O'} z|]㚑?TN8kI-m.cwp~>C:H=wu8S@B| ,(2U 8<} ^ VDYvA7bڜR\!{O.C`% (>Oh,*H-X׃1ef6NvYJ(Rc)&WB&NmxgͭX-Ef87yGM=7pa i 0^\H{@/ 51BT7f?X[!Q HrPc*6EUQȂxe:wlIQx/b梓5?V;/b$ ~E}+[Wp#7%t(*` .Bus ܭ n䯜*G9]5!,-y̺ȊR'5Sp*J>F:+=FwJ@Z,GS{"K&Gϗ˜RY߿tIyt l N2#0obz "VL'@wnRB'Mx{$bn|۸Ĩu @l @2=*ZrKһ)%@Z Teߒm1 1!L %lDR8 :c{xPfa7g/0 sUh"oA(`:? |D`8猀Љ m G|ô(G)Gysu&KycV;2=%y₤> Qо̍(Dv[Cf85pP&ڌ** F$?.$`A/*?ɘZ!e4lЭr@1WPK$+% (4JNL MF ,Ⱦ/ O"NE brK!_/h2E;2\+@79t fl_K_"Z\&:%W ֦H UYoI>r3CKN@|{*v?$A5B2BfdC7t/d9s cr@}o,Ӑs_ I`1(|Io !,A )b؀?e؀qRK !B8 p2?RrsIwx'ۣd9*.7\$j @h I9is\A$ۿL'(T7ۿKśˈA$!竰.信p#kO+va@mpVt_6k> #\SU~AꮎsE3w S{Le]o%ӄUPԌ\`3 P'Sdk[4tf@  Wd,8&:%.Hg%[~EʮlNRʵ:G@Hv$zsbĜ/cAe^8S+!ӮyIY7H$)XTgny_vv2:x5K!G3-yv /} 7vxeT35ǂEmL28,:uJx$ _#ZhզhL؀Nn$ᰓ\#+±W"c÷@_uR{cZK?h8+)?]BQ‘PE\X-8p~K2(t!@7!$~;h_^թ֡7K 8 3OweZ`;:DSPXd;E qu]V òf@vyB81+qKQ^reFPĝuo Xm/֥#o&<S@ DKkc^'pv)=_L6MY<,dad5ٝhf?I|nQ>GOW~[2A1VE)nvtyn6Q!}HFNO;}fg0 ;}xtqƗ6S,_Xɽgd^sN`2;WI? n%nEރ@sOO??nEyތ:9KDL$F B'EkM` \r}ᐘQS.XsfVo}t q] |uā]c~%쪆^kKZ]ɐF6wXyI8.{yK_K7h]ٞa [@~wjgQӳ@%[w;SeX^/1B%:س0+z k.>9fߘBqRE?|dlOOGj'IN;Cou+qh#,:& wJy@ hMeˇY8>RPBܦzll'п$nv\%d"Yd Ot+c8]:{iޣ8ĂXPkE$J£ↆXYzXl5[܂pn(TLI yRшRTYhMPx{'h=s':/'3so3gxM ƣ#[{p[[(]IUdaQGoFn[]7I C&ެ)kZx.^j%eo9-zDSEx>]J]+u_ϭR2BFVH]+V &é$}ű4aqO>:]B4Uz*L4a5Ѿyc\_z.<%92^5j[SE]^K%\ V#&r&ޭvԦ\Q{ҥ{u&/T4 eA?eGd{QXpNpe)?MQ#z-~c:}( Q)}&|:dmyCk+V)xLz4ʧ%pZ'9'vL>b 6ߋzaglcLO&kĉš\&"q15: vd dV*KϭAKz+Cfܸh$ɺ2ailZHFvnJjZ.vWANj 6sjڨX"'`{8O?m_,;G%qҒGQqKF:5ݙqO6ut8ϚUˡ\tV ՚zkTlfI-Sg S/NuAC\dTd#=uk}Y5y3gT9j=)*4[aWgRKvnpDuipYdnlJ> ?)؉k cm":&qu?yWy:L])<J;x/&d=b|ą>kf}c5"R8|`CEe&WDRQ`.$Z/W^Лu)ABqz2]%En<^=s'HE P}O #T N~Rj˫ʗ;'לKdRXZYmMUFE--xU&rj2?:߳Љz9J_DejY"Rk۳/,/VrPے)Zp=4& u %kD_/aK.t-(x:sIկX9O_ ߟ~h0}r1nG\-5hh7Q˘CuA^Ϟ.jkmDuZxFy; ;,奄KȔ4e}us_5emlU{Wgp]]&PJ"a$"6|Jd:WSRuV0X[%F!##rcIeYWeB V>໽l{$TOjv#I}.F ,y˷Y$mPbBUKz2ErFY)8 xԳ2j ~bg:fꟴbso7fVslde]DZ.)Ϩ%_6YN)RԻNq<=y̬{J+ld ֔kKդO#չ5sBۆ5-{b_bHcLpfTADWoJwOY6%GL8sЏ\6r]YVѽWGWם_ [gӽ3J?W˕:׸}ڥw9U0p,985N+e2L*s XgӚ.&i]Ё/M5XV~k'Hclgdoܨ/pw*\g幬Ή7^7 k`[ځ 4vjfq -͡ a9_a+3]h?7kQiTA7FvFSK> 9躬"~h);V<qMbYDVy.V : lM%a+β"',姢p%*nIH6ўYs+s_H(].ȱ,NB,-%]ܥs;DW򚫁3.dϣzߔJni|64O[IdgVӢ pєANn9E"tRlܻgyvdЙVwvRs)R,7:?7nbb'rD=k w+IКb=ɬLt+c7=s~Rtēbq|hÍkx\.~z6}t|W}y64Zo}[;?&7B>'XG˧ᢛ^vr~?_{qbey,6y{!: xP-Esb孁s)`HuXsl?yWF,k,ZXi4ʽVηݹrя~?}_ʏ#Hy˛Ϝ}֩Cu.gu*bֿ{bxw̩j}i?o{֕ѼrO.<‘c'H{;Wzo.]W7`D[iIENDB`ɶ1111111111111111111111111XYVW%VWȉPNG  IHDRJY0XIDATxˏGgv^k'~`؄<$6@q@qA-g8 . '$NHqA@ 8E'ͮwwvvf8x %a4i᫮NޕPYǎvZ^ĉtt{ʱ#Gz(]_88D#xK/޸~m3X^4Y;~tsckww9 G\\[*""GJ9"<1Sp'y[wָnen'4A9F+;Vזn=/~]~tQn(کaL&(N*LRݙ"uۭVY7Ӣ.ڭ_v6Bu[դ3 \Z\M#G)"]=wk7v)MU;7Iw==爔ݫ>7^^aUDʩ(;J[M5Wnv a]Yoveb+[94)7`\x޳ѴڝK'6^k2WHy;EX_=\~S7.;_嵓GӦW>/䑕aӗtR=OMU&Ͳ@ɥ~J)EnrscSz#olU940zuY4v?)`ʊ߻9n ʑSD qꡗwBܽt_qNJXYͺΫz)<#Y֓j5qD:pZGN#"Ypj~3agtfyR>^['߽ZL?i>(,.tw7F{z9kO1=R\?ѯ|x퉇|vK큒ˑ,~&@< <9" <΍??Wno"fv4/ ,-FGsa8ʲGf纳`<~<ϼ;'kv1_W6A5M)fRE9},SJM}) ;lOYgSR{{Gys#f=Ń٣tKLUjZpܹqťw=xRg4Vu󡤀׾\t_\x3VsVB&("77oMdZ8Y(=jy]GzI36Q"G=s(O&9Hv:^`<M<h}s4T߳ߪ-x> IENDB`B! :x"g]x{\Mۻ?BKj7.("Jb+nrYV..jKr鶕[tQ!-J$ !!D&n%ȉPNG  IHDRJY0IDATxɏ\Gufzxo!DM@ XrBH98K@H@"vO^qc8倱D~KuWWU}U/-uI ȑRD伸쭮,/u/_uJ:xrpnFJ)rםniJ#"Zr/15"N\Ίfyl*oeQDqI{ɓݝэ~R<.r7nko\u9+sFHwzpKڽ`j vhpknܷilG*Hi>("ͫzV纮"uV\Q\{qso7u{uw7KKG#ŝ9/R~+׆մ1^5iAnw~l6ޟO+մncir{m\x_ܡOvӴ?|7 o~;WEX NkH9r"Nη?~Nzz#GH)"Gz'>`]\gϼᣣNg?Ӎ#'7~ۧ]4-g1"rt H@HrIgc4wZFf#ETuuo|ZnTi]oϝx[?<__Jӿl_3çl4'ȃM`;+-w9rʋix9"LkmܵFQWRA;rtWkiy#{{gʤw|R4N/uS5iFU]ڮ! #NYv賕뻫.qϏ;,tq(!?ͯK7_<FAPcIENDB`ɶ^)Y%)YȉPNG  IHDRJY0IDATx1 %Pw4~n^#zy1{ۊlIENDB`K\ Cr %ȉPNG  IHDRJY0IDATx1 P f B\ **'IIKtableidx_small_world_tiles_geometryidx_small_world_tiles_geometryCREATE VIRTUAL TABLE "idx_small_world_tiles_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)0OOQtableidx_small_world_sections_geometryidx_small_world_sections_geometryCREATE VIRTUAL TABLE "idx_small_world_sections_geometry" USING rtree(pkid, xmin, xmax, ymin, ymax)w55tableElementaryGeometriesElementaryGeometriesCREATE VIRTUAL TABLE ElementaryGeometries USING VirtualElementary()gdalautotest-3.0.4/gdrivers/data/small1bit.rrd0000644003401500001440000002120013614004466020766 0ustar rouaultusersEHFA_HEADER_TAG &{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:dx,1:dy,}Eprj_Coordinate,{1:dwidth,1:dheight,}Eprj_Size,{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics,{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction,{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{1:lposition,0:pcname,1:e2:EMSC_FALSE,EMSC_TRUE,editable,1:e3:LEFT,CENTER,RIGHT,alignment,0:pcformat,1:e3:DEFAULT,APPLY,AUTO-APPLY,formulamode,0:pcformula,1:dcolumnwidth,0:pcunits,1:e5:NO_COLOR,RED,GREEN,BLUE,COLOR,colorflag,0:pcgreenname,0:pcbluename,}Eded_ColumnAttributes_1,{1:lversion,1:lnumobjects,1:e2:EAOI_UNION,EAOI_INTERSECTION,operation,}Eaoi_AreaOfInterest,{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,.l! Z?DependentFileEimg_DependentFilebsmall1bit.imgM !4RasterDMSEdms_State/Mٮwpkyyv[deweڻុڿƾռwwűٷͧ٬ڹ! Ehfa_LayerEhfa_Layer {4096:cdata,}RasterDMS,.rootroot !Layer_1Eimg_Layerl!l"_ss_16_Eimg_Layer_SubSample@@gdalautotest-3.0.4/gdrivers/data/byte_with_valid_range.nc0000644003401500001440000000027413614004466023250 0ustar rouaultusersCDF xy Band1  _Unsignedtrue valid_range _FillValue~gdalautotest-3.0.4/gdrivers/data/LanduseSmall.tb#0000644003401500001440000000026013614004466021346 0ustar rouaultusersILWIS 2.00 Table dX22KK2gdalautotest-3.0.4/gdrivers/data/sRGB.icc0000644003401500001440000000112013614004466017641 0ustar rouaultusersPlcms0mntrRGB XYZ acspMSFT-lcms desc8cprt@Nwtptchad,rXYZbXYZgXYZrTRC gTRC bTRC chrm,$mluc enUSsRGB built-inmluc enUS2No copyright, use freelyXYZ -sf32 J*XYZ o8XYZ $XYZ bparaff Y [chrmT{L&f\gdalautotest-3.0.4/gdrivers/data/fake_snodas.dat0000644003401500001440000000000013614004466021327 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/byte.nc.txt0000644003401500001440000001123313614004466020475 0ustar rouaultusersnetcdf 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.0.4/gdrivers/data/42BW_420730_VT2.aux0000644003401500001440000001775413614004466021117 0ustar rouaultusersEHFA_HEADER_TAG@bRrootroot> AlR DependentFile20Eimg_DependentFileAZLayer_1t gR 0 Band_183593720Eimg_LayerentFile> A D l] 4RRDNamesList720Eimg_RRDNamesListA% (IMAGINE 2X2 Resampling"BW_420730_VT2.rrd(:Band_1:_ss_4_)"BW_420730_VT2.rrd(:Band_1:_ss_8_)#BW_420730_VT2.rrd(:Band_1:_ss_16_)#"BW_420730_VT2.rrd(:Band_1:_ss_32_)#MBW_420730_VT2.rrd(:Band_1:_ss_64_)$xBW_420730_VT2.rrd(:Band_1:_ss_128_)D >lF*MapToPixelXFormmeExfr_GenericXFormHeaderA$,Affine ;PolynomialNXForm0xelXFormmeEfga_PolynomialmHeaderA k T? *[Z]ÿ (jv /䆦tI>GȊ*V>^Rf>w4`P>F//b> J >V/E ")j@)8@  3btye^<ݿX҉?IQؿV~U2?vUIy>Li? [- m>&Evk7c[k=z"ѾELng"{*A>mJ<<1> RfZ@HPʴ@ lKMapInformationmeEimg_MapInformationderA,NAD_1983_StatePlane_Alaska_4_FIPS_5004_Feetus_survey_feet> l ProjectionionmeEprj_ProParametersderA +DatumtionionmeEprj_DatumametersderA 42BW_420730_VT2.jpg 1,.HHlEhfa_Layer93720Ehfa_LayerentFile> A{35392:Cdata,}RasterDMS,. lRDependentLayerNameEimg_DependentLayerNameAe IMAGINE 2X2 Resampling $ 42BW_420730_VT2.rrd(:Band_1:_ss_4_)$ 42BW_420730_VT2.rrd(:Band_1:_ss_8_)% 42BW_420730_VT2.rrd(:Band_1:_ss_16_)% 42BW_420730_VT2.rrd(:Band_1:_ss_32_)%> 42BW_420730_VT2.rrd(:Band_1:_ss_64_)&k 42BW_420730_VT2.rrd(:Band_1:_ss_128_)0lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,. State Planet@o wGRS 1980@TXA?XA@k{?˯MXANAD83 nadcon.dat{1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,{1:lnumrows,}Edsc_Table,{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column,{0:poEmif_String,titleList,}Exfr_GenericXFormHeader,{1:lorder,1:lnumdimtransform,1:lnumdimpolynomial,1:ltermcount,0:plexponentlist,1:*bpolycoefmtx,1:*bpolycoefvector,}Efga_Polynomial,{1:*oEfga_Polynomial,forward,1:*oEfga_Polynomial,reverse,}GM_PolyPair,{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum,{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid,{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters,.gdalautotest-3.0.4/gdrivers/data/rasterlite.sqlite0000644003401500001440000005600013614004466021774 0ustar rouaultusersSQLite format 3@  }#-7indexidx_geocolsgeometry_columnsCREATE UNIQUE INDEX idx_geocols ON geometry_columns (f_table_name, f_geometry_column) --Ktablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, type VARCHAR(30) NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER, spatial_index_enabled INTEGER NOT NULL)f++tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256) NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name VARCHAR(256), proj4tex   BfmepsgWGS 84+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ''test_metadatageometryPOLYGON 'test_metadatageometry CC,;f++tablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys ( srid INTEGER NOT NULL PRIMARY KEY, auth_name VARCHAR(256) NOT NULL, auth_srid INTEGER NOT NULL, ref_sys_name VARCHAR(256), proj4text VARCHAR(2048) NOT NULL) --Ktablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns ( f_table_name VARCHAR(256) NOT NULL, f_geometry_column VARCHAR(256) NOT NULL, type VARCHAR(30) NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER, spatial_index_enabled INTEGER NOT NULL)}#-7indexidx_geocolsgeometry_columnsCREATE UNIQUE INDEX idx_geocols ON geometry_columns (f_table_name, f_geometry_column)C1+3triggerfkd_refsys_geocolsspatial_ref_sysCREATE TRIGGER fkd_refsys_geocols BEFORE DELETE ON spatial_ref_sys FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'delete on table ''spatial_ref_sys'' violates constraint: ''geometry_columns.srid''') WHERE (SELECT srid FROM geometry_columns WHERE srid = OLD.srid) IS NOT NULL; END DD\1-ctriggerfki_geocols_refsysgeometry_columnsCREATE TRIGGER fki_geocols_refsys BEFORE INSERT ON geometry_columns FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'insert on table ''geometry_columns'' violates constraint: ''spatial_ref_sys.srid''') WHERE NEW."srid" IS NOT NULL AND (SELECT srid FROM spatial_ref_sys WHERE srid = NEW.srid) IS NULL; ENDZ1-_triggerfku_geocols_refsysgeometry_columnsCREATE TRIGGER fku_geocols_refsys BEFORE UPDATE ON geometry_columns FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, 'update on table ''geometry_columns'' violates constraint: ''spatial_ref_sys.srid''') WHERE NEW.srid IS NOT NULL AND (SELECT srid FROM spatial_ref_sys WHERE srid = NEW.srid) IS NULL; END 4//viewgeom_cols_ref_sysgeom_cols_ref_sysCREATE VIEW geom_cols_ref_sys AS SELECT f_table_name, f_geometry_column, type, coord_dimension, spatial_ref_sys.srid AS srid, auth_name, auth_srid, ref_sys_name, proj4text FROM geometry_columns, spatial_ref_sys WHERE geometry_columns.srid = spatial_ref_sys.srid''stabletest_metadatatest_metadataCREATE TABLE test_metadata ( id INTEGER NOT NULL PRIMARY KEY, source_name TEXT NOT NULL, tile_id INTEGER NOT NULL, width INTEGER NOT NULL, height INTEGER NOT NULL, pixel_x_size DOUBLE NOT NULL, pixel_y_size DOUBLE NOT NULL, "geometry" POLYGON) ''7 5truemarble338169.tifR? E3? E3fVf@V@|fV@f@V@f@VfVfV@ +raster metadata zz;> A'triggerggi_test_metadata_geometrytest_metadataCREATE TRIGGER "ggi_test_metadata_geometry" BEFORE INSERT ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT type FROM geometry_columns WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; ENDB A'%triggerggu_test_metadata_geometrytest_metadataCREATE TRIGGER "ggu_test_metadata_geometry" BEFORE UPDATE ON "test_metadata" FOR EACH ROW BEGIN SELECT RAISE(ROLLBACK, '"test_metadata"."geometry" violates Geometry constraint [geom-type or SRID not allowed]') WHERE (SELECT "type" FROM "geometry_columns" WHERE f_table_name = 'test_metadata' AND f_geometry_column = 'geometry' AND GeometryConstraints(NEW."geometry", type, srid) = 1) IS NULL; END ee$aX A'Qtriggergii_test_metadata_geometrytest_metadataCREATE TRIGGER "gii_test_metadata_geometry" AFTER INSERT ON "test_metadata" FOR EACH ROW BEGIN INSERT INTO "idx_test_metadata_geometry" (pkid, xmin, xmax, ymin, ymax) VALUES (NEW.ROWID, MbrMinX(NEW."geometry"), MbrMaxX(NEW."geometry"), MbrMinY(NEW."geometry"), MbrMaxY(NEW."geometry")); ENDaA'ctriggergiu_test_metadata_geometrytest_metadataCREATE TRIGGER "giu_test_metadata_geometry" AFTER UPDATE ON "test_metadata" FOR EACH ROW BEGIN UPDATE "idx_test_metadata_geometry" SET "xmin" = MbrMinX(NEW."geometry"), "xmax" = MbrMaxX(NEW."geometry"), "ymin" = MbrMinY(NEW."geometry"), "ymax" = MbrMaxY(NEW."geometry") WHERE "pkid" = NEW.ROWID; ENDYA'Striggergid_test_metadata_geometrytest_metadataCREATE TRIGGER "gid_test_metadata_geometry" AFTER DELETE ON "test_metadata" FOR EACH ROW BEGIN DELETE FROM "idx_test_metadata_geometry" WHERE pkid = OLD.ROWID; END yx/P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)AAEtableidx_test_metadata_geometryidx_test_metadata_geometryCREATE VIRTUAL TABLE "idx_test_metadata_geometry" USING rtree( pkid, xmin, xmax, ymin, ymax) KK7tableidx_test_metadata_geometry_nodeidx_test_metadata_geometry_node CREATE TABLE "idx_test_metadata_geometry_node"(nodeno INTEGER PRIMARY KEY, data BLOB)'MMAtableidx_test_metadata_geometry_rowididx_test_metadata_geometry_rowid CREATE TABLE "idx_test_metadata_geometry_rowid"(rowid INTEGER PRIMARY KEY, nodeno INTEGER)/OOMtableidx_test_metadata_geometry_parentidx_test_metadata_geometry_parentCREATE TABLE "idx_test_metadata_geometry_parent"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)%%Mtabletest_rasterstest_rastersCREATE TABLE test_rasters ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, raster BLOB NOT NULL) 99D 4C4´B   V0JFIF;CREATOR: jpeg-wrapper (using IJG JPEG v70), quality = 75 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222R" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz %test_rasters ?(I ( ( +CMҥ$:\7ZE/r9 qgԹ3z ׭ۿ2&zyv[vv)6i$"Fvޝ:@<91$HN2J2!xtYP^5BEr[C4niMu{&1 BXF13^S3ErBA+&Χylaݏړ?Zt/>|uId-#{d曓]x8#"b=vLyv6~g pXd6ȃw5**){O!Dנd n)t#5*9b2ebh>7dZNq,ʦ/C^$4hZK{a&|^ݏ֫\&}iSKEJ2XMhZh dحܜbƕ2zLőA?*tDY?&}G4" "+me91\ I>I[hRZv Rd,H 1讇SҠqE VJ穦QE0ފ;\rTa.-Qwr+*Ѧ UTjv^F} Odsp 3 d銷(I7ӐdR|v[+Ih-62*M#PbaAoCo#bp\m˂O_r(oKϧv}iJr9 zV7qhP}Y ki}BI+):WýS ;V{3];'?JWs[Wpg= 8孼ߧֳ|FI_`*yj-fD9On.g[X 9WRIXs5&ݦ_DL$XW+x-$jI|W2ޗ9/?)7^^r|Iϩ?Z0jڶmI6̓ӐzZ|GXӯm2` *A56W q,30-PI/qux$x #jO|7}wcsf'j= `F?E,$ɒق EH-fU%HL *=@txuV9ɕ:"_~wi}α(\抈>db{il㣩ǵAEtX!˱cM6)TrZ PQI}˕8_nJӬh&a=b[d 1^RDgg#.2כjq491o!c;r5iwFʁ꿸Yȧ3lvsSeTy!>1Zvk*0@MVby 0[WRs`#E%шo^-.̃&:Y^I kNZAΞbywڪQEuYXaEIp;@pH%( sH =ܰ*F{ѡB*[_]7wHB΃ֲMim]mTsW74DZW$\A;ՔOY_-3,r8cm%I;(sTNHEwlm>bEd9mnkuS)#|h>'f{e; 5<_\cvLJ VEʅWճ=ES?$5p57(s^[o*[k?(S+5i'e ƫ1Ӝ?xoxï_§h",җ+{5wC^c*#cpk:fgw=/uh&2G}oSH‹uyqBjLbTthE'e IjaznZUWPNx>ZSӚז Czl=|ǔeH=>걽R/ZurF|qN>y3M(wmAWfv02r;W$Ҵ."T[rU*ssM9QE+r=jJ(ފ;\rRqQ]W)cmPEPEPm2ïJmz;SlXrhJ3w{ 0VsBXPn 9X2W^U$$RqΥELV$hę黷P1]Eaz32E6m`C}5vVJ{] IPQE@8ҧ8}MZSGxԶ6p}zu5V!p\U9NBQT}X<#xs_>x{Xn#VWWՖ=.jȥw{[R'ULOz>qY I.|噏?r)Zml5{3yoH'=y\ϫZ$ր}躑?ZƚT8 э7G˷h4ev7Z3|_3ԭmYhq^_CdCpz`u53oaM-ȁY.][-kzHWc@'yg Wn9ZUw(܌s]W5giA"@XV땩!"ȼ2ASz_u10iz^o-ɸfiI{kUåʲ yֱPTרvJU U]v #dX}ƹRO@qV&ZF =qY7-KT@S\Dc4biKmRBUiI_uge*)rBRzRR㞴H?ހE=G$zL{Gz+P7 sIJ:(yC?%(8撀 )F;PEPEPڴkt"W!#S \,: ͭ &Z\2>EZm1MJڌ p8玔0qF19ES((,E6!G#*ѯ 7.?Ͻa3'(!%xɚRV08WJ5,ZN;cHeQU 5O<8mOWyj8#XFJ ƟH$+1M6Zp䂉H($`0{>Zjֳ[&0OuIn2UR-WqV=*Ig?{k6s^F2uN5!yj,*+Ե[hׯWmK"դwBXkg;@p+\->gi)XܷAsy/n+sh]jsyaD#VuvӌܺgQZ((%G O#]|-?m*2vzII?.dQ:ɸCqpk BX$ڼV"wpm NLN-L)#k̈́@4tZŬV:j`ΪrlZUjF=gRZ)ce%IERE5^@8@Iq^tz׳B|H.}>`Fhҕܻ=MlHÍ3E'z+C$(((()TIEtR`v\λ-FmHKn+M)Bw8}i/@61 Jjխʍc5}\Y'\FA+wiBKI4J(Ḧ̨2 Pq@ EP]EmYO-v2W/ED*2q5UƽVuSTUQJ'P(e+㑞Q@Q@z.teu_!cl|NwV.fRkc|gb_Ǒ#ێ+vu9Ā1c/~܏¼1 gW ˍifu^ chPH͂@-kqNijm¤ɖPqӚuc Vc)H,rENQފP( ( ( ( ( (;ot:[#YH@\Ưquw-nv:T :QQ¶1IE`aBTTTQ@Q@?s oseQEQEQET`1WES(((vޒPxx4hz(EsEWA!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP{Gz+P)UAXu(AaShQMhE6=Xu(AaShQMiE6=Xu(AaShQMiE6=Xu(aShyQMiE6=Xu(AaShQMhE6=X;Egdalautotest-3.0.4/gdrivers/data/4byteFloat.prj0000644003401500001440000000064113614004466021125 0ustar rouaultusersPROJCS["NAD_1927_UTM_Zone_11N",GEOGCS["GCS_North_American_1927",DATUM["D_North_American_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.0.4/gdrivers/data/L71230079_07920021111_HTM.FST0000644003401500001440000001100013614004466021707 0ustar rouaultusersREQ ID =0000308280000_00000 LOC =230/079F ACQUISITION DATE =20021111 SATELLITE =LANDSAT7 SENSOR =ETM+ SENSOR MODE =NORMAL LOOK ANGLE = 0.00 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = PRODUCT TYPE =MAP ORIENTED PRODUCT SIZE =FULL SCENE TYPE OF PROCESSING =SYSTEMATIC RESAMPLING =CC VOLUME #/# IN SET =01/01 PIXELS PER LINE =7428 LINES PER BAND =7012 /7012 START LINE # = BLOCKING FACTOR = REC SIZE =52085136 PIXEL SIZE = 30.00 OUTPUT BITS PER PIXEL =8 ACQUIRED BITS PER PIXEL =8 BANDS PRESENT =LH FILENAME =L71230079_07920021111_B61.FSTFILENAME =L72230079_07920021111_B62.FST FILENAME = FILENAME = FILENAME = FILENAME = REV L7A BIASES AND GAINS IN ASCENDING BAND NUMBER ORDER 0.000000000000000 0.066823529411765 3.200000000000000 0.037058823529412 GEOMETRIC DATA MAP PROJECTION =TM ELLIPSOID =WGS84 DATUM =WGS84 USGS PROJECTION PARAMETERS = 0.637813700000000D+07 0.635675231400000D+07 0.100000000000000D+01 0.000000000000000D+00 -0.660000000000000D+08 0.000000000000000D+00 0.500000000000000D+06 0.100022883000000D+08 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 USGS MAP ZONE =3 UL = 0654253.3551W 262922.7769S 3528432.250 7071172.000 UR = 0632851.4727W 262803.7852S 3751242.250 7071172.000 LR = 0632615.1647W 282150.2432S 3751242.250 6860842.000 LL = 0654235.6396W 282315.8679S 3528432.250 6860842.000 CENTER = 0643503.3325W 272555.7121S 3639986.250 6965977.000 3714 3506 OFFSET =0 ORIENTATION ANGLE = 0.00 SUN ELEVATION ANGLE =60.4 SUN AZIMUTH ANGLE = 76.8 gdalautotest-3.0.4/gdrivers/data/small16.raw0000644003401500001440000001036413614004466020370 0ustar rouaultusersk{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.0.4/gdrivers/data/small.raw0000644003401500001440000000207513614004466020221 0ustar rouaultusersk{skkk{skksc{cJsRssk{ssk{{c{c{sssckksks{sks{kssksk{kZ{ckcsZ{{s{s{s{kskssckkkssssssss{{{kk{sckc{cssckss{ksc{skscZk{cs{Zccŭc{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{ckkskks΄k{{k{k{RccZŭŜskkkkksckZsccέޭ{sZcsZkccZckcc{εk{{{kcRkkkcckŭޜZckcRss業{Z{k{Žŭc{{sR{{{{Zcc{Υsks{{֔Ŕﭥ{֔{Z{ŵŵŌťssŌs{ν潔޽朔Υgdalautotest-3.0.4/gdrivers/data/geos_microradian.nc0000644003401500001440000000215013614004466022217 0ustar rouaultusersCDF y x  ConventionsCF-1.7 fakedata  coordinatesy x grid_mappingfixedgrid_projection|y  standard_nameprojection_y_coordinateunits microradian scale_factord add_offsetA`, x  standard_nameprojection_x_coordinateunits microradian scale_factor@d add_offset`,8fixedgrid_projection grid_mapping_name geostationarylatitude_of_projection_originlongitude_of_projection_originV` semi_majorAXT@ semi_minorAX?ީperspective_point_heightAc8sweep_angle_axisxdBCLCCDDD333DLDfffDBCLCCDDD333DLDfffDgdalautotest-3.0.4/gdrivers/data/nitf59.nfw0000644003401500001440000000002713614004466020223 0ustar rouaultusers1 0 0 -1 150000 4500000gdalautotest-3.0.4/gdrivers/data/test_match_overview_factor.gpkg0000644003401500001440000007400013614004466024664 0ustar rouaultusersSQLite format 3@ 'GPKG-   =ff + WGS 84 geodeticEPSGGEOGCS["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"]]longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid\=mUndefined geographic SRSNONEundefinedundefined geographic coordinate reference system[;kUndefined cartesian SRSNONEundefinedundefined cartesian coordinate reference system >  =mytilesmy2018-04-29T08:45:10.842Z /?@  my  my   |DDAU/indexs//[tablegpkg_ogr_contentsgpkg_ogr_contentsCREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count INTEGER DEFAULT NULL)''wtablegpkg_contentsgpkg_contentsCREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id))9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents9M'indexsqlite_autoindex_gpkg_contents_1gpkg_contents55)tablegpkg_spatial_ref_sysgpkg_spatial_ref_sysCREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER NOT NULL,definition TEXT NOT NULL,description TEXT) $o$SI ]7indexsqlite_autoindex_gpkg_geometry_columns_2gpkg_geometry_columns I]7indexsqlite_autoindex_gpkg_geometry_columns_1gpkg_geometry_columns 77tablegpkg_geometry_columnsgpkg_geometry_columns CREATE TABLE gpkg_geometry_columns (table_name TEXT NOT NULL,column_name TEXT NOT NULL,geometry_type_name TEXT NOT NULL,srs_id INTEGER NOT NULL,z TINYINT NOT NULL,m TINYINT NOT NULL,CONSTRAINT pk_geom_cols PRIMARY KEY (table_name, column_name),CONSTRAINT uk_gc_table_name UNIQUE (table_name),CONSTRAINT fk_gc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gc_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id))AU/indexsqlite_autoindex_gpkg_ogr_contents_1gpkg_ogr_contents    myLZ  my P_PC --9tablegpkg_tile_matrixgpkg_tile_matrixCREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name))G [5indexsqlite_autoindex_gpkg_tile_matrix_set_1gpkg_tile_matrix_set 55_tablegpkg_tile_matrix_setgpkg_tile_matrix_set CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id)) ]sO+nH"]& my>ր>ր& my>>& my>>% my@??$ my @ ??$ my ?&?&$ my ?6?6$ my ?F?F$ my ?V?V$ my?f?f$ my?v?v# my@??" my@ ??" my ??" my??" my?ƀ?ƀ!  my?ր?ր   my?? a|sjamymymymymy my my my my my mymymymymymy my my ^<Q-triggergpkg_tile_matrix_zoom_level_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_zoom_level_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); ENDP++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)_)tablemymyCREATE TABLE "my" (id INTEGER PRIMARY KEY AUTOINCREMENT,zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,UNIQUE (zoom_level, tile_column, tile_row))#7indexsqlite_autoindex_my_1my? S-indexsqlite_autoindex_gpkg_tile_matrix_1gpkg_tile_matrix   my lTU-1triggergpkg_tile_matrix_matrix_width_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_width_update' BEFORE UPDATE OF matrix_width ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); ENDDU-triggergpkg_tile_matrix_matrix_width_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_width_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); ENDJQ-!triggergpkg_tile_matrix_zoom_level_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_zoom_level_update' BEFORE UPDATE of zoom_level ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); END YYYW-9triggergpkg_tile_matrix_matrix_height_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_height_update' BEFORE UPDATE OF matrix_height ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); ENDHW-triggergpkg_tile_matrix_matrix_height_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_height_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); END XXYU-;triggergpkg_tile_matrix_pixel_x_size_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_update' BEFORE UPDATE OF pixel_x_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); ENDIU-triggergpkg_tile_matrix_pixel_x_size_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); END XXYU-;triggergpkg_tile_matrix_pixel_y_size_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_update' BEFORE UPDATE OF pixel_y_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); ENDIU-triggergpkg_tile_matrix_pixel_y_size_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); END DDb)triggermy_zoom_updatemyCREATE TRIGGER "my_zoom_update" BEFORE UPDATE OF zoom_level ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''my'' violates constraint: zoom_level not specified for table in gpkg_tile_matrix') WHERE NOT (NEW.zoom_level IN (SELECT zoom_level FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my'))) ; ENDT)ytriggermy_zoom_insertmyCREATE TRIGGER "my_zoom_insert" BEFORE INSERT ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''my'' violates constraint: zoom_level not specified for table in gpkg_tile_matrix') WHERE NOT (NEW.zoom_level IN (SELECT zoom_level FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my'))) ; END !7triggermy_tile_column_insertmyCREATE TRIGGER "my_tile_column_insert" BEFORE INSERT ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''my'' violates constraint: tile_column cannot be < 0') WHERE (NEW.tile_column < 0) ; SELECT RAISE(ABORT, 'insert on table ''my'' violates constraint: tile_column must by < matrix_width specified for table and zoom level in gpkg_tile_matrix') WHERE NOT (NEW.tile_column < (SELECT matrix_width FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my') AND zoom_level = NEW.zoom_level)); END 07#triggermy_tile_column_updatemyCREATE TRIGGER "my_tile_column_update" BEFORE UPDATE OF tile_column ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''my'' violates constraint: tile_column cannot be < 0') WHERE (NEW.tile_column < 0) ; SELECT RAISE(ABORT, 'update on table ''my'' violates constraint: tile_column must by < matrix_width specified for table and zoom level in gpkg_tile_matrix') WHERE NOT (NEW.tile_column < (SELECT matrix_width FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my') AND zoom_level = NEW.zoom_level)); END 1ktriggermy_tile_row_insertmyCREATE TRIGGER "my_tile_row_insert" BEFORE INSERT ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''my'' violates constraint: tile_row cannot be < 0') WHERE (NEW.tile_row < 0) ; SELECT RAISE(ABORT, 'insert on table ''my'' violates constraint: tile_row must by < matrix_height specified for table and zoom level in gpkg_tile_matrix') WHERE NOT (NEW.tile_row < (SELECT matrix_height FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my') AND zoom_level = NEW.zoom_level)); END  1triggermy_tile_row_updatemyCREATE TRIGGER "my_tile_row_update" BEFORE UPDATE OF tile_row ON "my" FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''my'' violates constraint: tile_row cannot be < 0') WHERE (NEW.tile_row < 0) ; SELECT RAISE(ABORT, 'update on table ''my'' violates constraint: tile_row must by < matrix_height specified for table and zoom level in gpkg_tile_matrix') WHERE NOT (NEW.tile_row < (SELECT matrix_height FROM gpkg_tile_matrix WHERE lower(table_name) = lower('my') AND zoom_level = NEW.zoom_level)); ENDgdalautotest-3.0.4/gdrivers/data/rotation.img0000644003401500001440000000000213614004466020717 0ustar rouaultusersX gdalautotest-3.0.4/gdrivers/data/byte_with_neg_fillvalue_and_unsigned_hint.nc0000644003401500001440000000024013614004466027342 0ustar rouaultusersCDF xy Band1  _Unsignedtrue _FillValue~gdalautotest-3.0.4/gdrivers/data/inconsitant_geojp2_gmljp2.j2w0000644003401500001440000000002513614004466024065 0ustar rouaultusers1, 0, 0, -1, 100, 200gdalautotest-3.0.4/gdrivers/data/invalid_bag_vlen_bag_version.bag0000644003401500001440000001414013614004466024706 0ustar rouaultusersHDF  ``TREEHEAPXBAG_root@(xTREEHEAPXPSNOD HhHh X Bag Version`GCOL1.6.2gdalautotest-3.0.4/gdrivers/data/black_with_white_exif_ovr.jpg0000644003401500001440000001176613614004466024317 0ustar rouaultusersJFIFHHTExifMM*, JFIFC  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ|  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| ?gdalautotest-3.0.4/gdrivers/data/test_FARSITE_UTM12.prj0000644003401500001440000000065113614004466022135 0ustar rouaultusersPROJCS["NAD_1983_UTM_Zone_12N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-111.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]gdalautotest-3.0.4/gdrivers/data/LanduseSmall.csy0000644003401500001440000000070513614004466021500 0ustar rouaultusers[Ilwis] Description=Coordinate system of Cochabamba area, Bolivia (UTM zone 19) Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=CoordSystem Version=3.0 Class=Coordinate System Projection [CoordSystem] CoordBounds=795000 8071500 808500 8090500 Width=27 Decimals=2 UnitSize=1.000000 Datum=Provisional South American 1956 Datum Area=Bolivia Projection=utm Type=Projection [Projection] Northern Hemisphere=No Zone=19 [Domain] Type=DomainCoord gdalautotest-3.0.4/gdrivers/data/isce.slc0000644003401500001440000000170013614004466020016 0ustar rouaultusers?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@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@[@@[@[@[@\@@\@\@\@]@@]@]@]@gdalautotest-3.0.4/gdrivers/data/small_world_400pct.vrt0000644003401500001440000000406413614004466022544 0ustar rouaultusers 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, 2.2500000000000001e-01, 0.0000000000000000e+00, 9.0000000000000000e+01, 0.0000000000000000e+00, -2.2500000000000001e-01 Area BAND Red small_world.tif 1 Green small_world.tif 2 Blue small_world.tif 3 gdalautotest-3.0.4/gdrivers/data/geoserver.wcs0000644003401500001440000000020313614004466021104 0ustar rouaultusers http://demo.opengeo.org/geoserver/wcs? Img_Sample gdalautotest-3.0.4/gdrivers/data/t100.mtw0000644003401500001440000051467413614004466017630 0ustar rouaultusersMTW NN8@@ j@@@Y@UfWAx>\A{Te? @@A?`@NRUiL.zd5. eNo5IZInT**L 1 L(۔ 9ۣRH0 )E$0 ա刖z ,..k 9.McOUo _ɿ,o uc` ppyھq# _׌խH{ \DO^ި1ʰ{> NX/| _!o<$ di2㊈~/wok8hK.206"cks227j!+` ɱ ekP1 nh(5]0j  rM㸹͈ћ } p # $ w vf13ge9[!)$F&a!# W:Q 2pZ pyešˁH),V2׽P{ ^p.xNf %^ $vtq9Q q_:]ooxP_%a1+wQ es-Ԉd>znlJ2g k!,)!#31B@ p@a dU1ng9`(jnm'|ttG v5t "9FA d|]s g! &$)` M>/ `e8&6!>XP2 V{!ౌ' Y iY ;w?G5+R!R'x&0e!!i fc$R#J% ObhBp L ++/k%s6<&d]zq\ q"; = .q0 dW/~ag&]ihZ~-y& [#q `Vsd9ap AnY#'-r #e:Z4e $+7?PzM? "a+u3 ̓dߢrW?3 9N3/7ivwgEJ/STl 1_)}} _ɯ7 f@( *vP Pہ2*/#4I3@c>R -d)t0!! p` j0Yyg+/Eiclf<YM " wH  A !Y.e#\q;X l0m O,$$J "OdW#$ ">ơ>"Y#[%܋:H~ $VSdO面d=n-<5C0? !J&-)s-dRe|=(Y 0("/28WT:Y![/ Q `@܇P R)i+ $UiIslo a!e 0,Y!_!v"#5 3!s׈&T󅡍J] "q&5~ $ f2ӁbB%c !k8 jN'2&(;h'ayp PpP ?'b,;ES[%f8٪{d5N U@ϱ"d0b1 JH "am6/ Q_p g4AZ6?h#d 7k ӯjgP;^Z.n G>47/&HJ6\ !da:됛 R"" Db Q ӸdΡ !vm\'xg%l#bf2ͽ肶ncB%]Ol5A|!ߒ񊉹[?; (eh8ē}` 7"%fr.?/u*oݗ #gmoJAY).ɲ3*". t@ 7PznB/` #e$!کbQ!C.=f_ i.>4mKIr-U v !C5 0Qۥl£!%'$2 !Vȥ Xa '22"DڬRpO|_TcC$W!;6g^!jG]¯9)j2/ G|^1!"e%~"bx(wLb'B(s2R0!2 Cv0;W dϽ٠Wb"aE1 )gַap(g6._qam"C~ O#"q(v H'2_%Ye"r~!c3&iۯan*>RcD$ U~D-`!E"\ 10Ac7` eqvs.0]"b:NbB%U 5&*s Yp Z3"i"kvV H$!!'$ -pI3p7 !7AE I !oS޼ňՊ_ ?W!+x !J%}#"H\Ub]ɳM)R@/B2l ':GJH(݁"`p`mjɸC(SW*[I. g$]"dD 0`@p AP\q#'  ͈ #)1o"!! q0}#n!zv!'$u]@!xx#!'%^ƣZZ<$s#>'!&^l&')z~=U !r!$!6!:! .SΡ"|@ A`!0C]xJD UIx3!㩼j#\OcemVJ &r:#ߡ!'%8!&%K0ݼvɿ=ǯB&!A\9=  ,EAL!A5;=` \s&]  $&Tٌ!37a‹n '_mdCq Q PqE& L&  "AcS PB12\rǠ$9% _䬬m"O.E\@9S= m! M*D' '")s!' k! uRПF Z!a٢CwɩIƐ=ii $`#X '"loi"9#cyd). & ~ $6bB!nE>Qy-䄋ѳܩJkK "0=_1Q! sD&?" %{ "D Q0r62Dǂ A O`У _8 c= PhQcO$ !X! !M !_ ! 9%#Z!]=ԥ%8!I<,wn4~{~̧ -!y"mض #xy%1 @0 Kd7!Њ<1o+ſ 1aƃ6mތ {  [|̸#'5Jcp q |~H΢!f~ &W @ H,&BB]B=v!n4P `p fo,0BD}7!/ !"5Eg!'! 4%"!r!Bϡ#q" !!u%R۰<تy $u(Ob+ꋴ -FP + %E>!Wk!:ώ,С?k&~ŽL:o(Q P~ֿ (6Ngpug#1G&ZAQ aP#c@KlUEVuA#/Aa ocq~0"8bޏ_ ar AE +߮|"fw!mt /$@  )$!Y?XLv_,cZyb$!"PI!(q+l!'!" z?5ހ "*a`f_$)O !v5IҺ!mkn,K"?A񹾡 &X!"'!E>5:G! !#Uz޿gp5 "bX!U!T aÄNТs})(/%[ #sM+k؍뗢"'!&x #dC ! /@ K9۪[{o۞[sE0i ʎ.~WrM3#*A G"cdtM%,L :!-!bSA 7!v"91NK>%5k(M )[K"m2$']"*"#" K "% ',]NBo쉎P$\aCi'!g2k! R_yKhLZq@ n|'tJ SVbÂyy)) =Y$%U[Zd- #ƮbO"ߐfDa <#$ M^q=S!;(!'! ! V| $Zl"-"$Ժ$!&&'Dk莋L>/ٞ>M! P?'D}4#'!aE9":M*^,m6#8s J "dð # 9;a"n:VJl7]6'C6b## ?"o:Ӓm (/*  5hNB7dQF 'n%$$" #"U bI! ~_ע!i#az&nۯ}uoObt`Ƌڢ] ('&au !ౡ'+v l$a ˭q]qLdɦ  t v >"UNOtS &'"󏻭iQl;pN֡J ! ,)U4bI)Q !!cj^*H!!" $!l <"Sb&'ȿ+ 6 #A v˩#4kk&1"$'(!!/wT#lx>zm"dR( Jeئj k #f c@  R  "'+~inp`CR@S !""M"*.^>@;)Vux *! D#[ (%&.)%5l""e I f -#Lck Zk *.јȸFI"SD<5_""W߫rծrc"*!~acCp"O""" %$m)"k w!u#\vgFT@<ޠ%ņ%׀J!<r!~"إ%sROKǡ_%d9"_a"s !{u""f% $$fn #I0{٤f Hͫfc -Q `tRm+  (U SQJJF[()2+FkHQ $4/Or?&# a e;$} !E"zv%'#bA%V!&B| %!g Q%R,r. Q")ݚ: ʍH?f d !e~ B vl9 " a'& N$Of  H&߻g N5b@= %!w !o#{K ?" jP $UIޤIN _,naL$6b {_!; dB G!'!dm[`"W!\K!N"'! 'px|x !l" DK $M/ D[o#P#J *$$e;z' "e&'@/{Nu:#yLbA'a(ޣ!Af  Gު g N!3f  'dei"$! rU- !L!ى1&sWF4"P6iz(aU?EZ? "C6 )"Y "o&!!)_$7J!%'& n匴rP.}l#BɬlK=i>tkkhze 儃 L?$ _ St< .'!"We޿Hw{"sª ^+ESbKg5Κ aE #-/ tE+,"8 p "A 1"WEUUD~@FS33 :p1ǢF!EaP 2>/vH_B ` %cO">m#" <"'%G#zu!!y'"_" h- $U!eCg F&P ܥXϟr-_N-$;#[w׵Iw ]+XBegV#𽪩PäH[| ; b > #~ #M4͚=#BA1 "#$ ؄.}aO-ʔYc#qar6m[d "Qq 7^i$!'$dc"l$"!'!zbآoVpP4 !B"PfB h~]Aϵz 8aA|sڽXU6ه=$wp1#a1x*¶ Oy]4^)X1TeF3ά x!,!0    $.>b .@-ˣI"1  !&}=sN _4F #<oPrU= !n DZSjk k#w"v z'!&m-""!'WzY?3l0~zLg|=SG, M$8""~ hT,-F"A pԮ *:۔#$ "X!CUE3߼#+a@"r x B $$1StI~I_"a& /&v  /CsY#!_͂;Mz ! p")~(!!y=!Ea;b͉PJl!#5gP#rRq!|.ߡv+'. ^:~!wA " .@bwQH !Ahi"b큑%X6=R8^ $HWhoݬ8W"W!CT4޼ ]-b#2 9"o!( Wp@^S_ !l!'&'!J!Va$B* $G=l[^##'##!#U $$A %'"E#οh?)"Z𨸋 S" "dlt$HbXh%8"Be1"3"V"F2؍08F] #t!X!2C4 N"b !D#=cS 7U # 1c#u %!0! N!'!"'"v!jɡ S(/S+m( !$B!Bo%'c !!1""N#NkJs}"T"?,ɩ> ¡!0<"Va"e/5յxF[2$B%FP " 3J0ޗa$ bL(' ul"W!"C#AK 5$ 2r')#:T X$  #!X"2#H !kXr%c (:R`M$K " @ h $"u)3Hu.", %D!UV!"'!S0!'"yw#r!'#DS'# f̢!'Jv "Yhy*]? P+} "dz# .73 "WH*! tb=S¿A M"/!V"""$ _rw' j-!@auD er$,2I!I !y#S~ !v/:s4d!!!'E#!ϒ ۣv;O #! >!UZS!cHLeR.Hͣ P׭-P%b"wb+ !9"y%W$?LWi!-S'}ׁ, V"X"!!'*a$Zl&G2gOFJ)Xp<#w aklS8AV$[ )bm'"# l quej& b# 'M? "  F 79#[tPhQ *! `~ie݊ #!%>#`j$'!l!!cp"'!!!~ ȥ*a =%Ua"V \HL%F/#J¿" H" '! 7a*;N#"Tb fQdacCd"dJ> d:. %kV Q a,ĕR[Uj h,0!\#0# aN>j $Q<~R %< "zbkw#: "pQ&( 6" u$x ?i)0 Y ""! #!!ğ?r* Lܻ!nad 4J "!H$Ga"/\D@r_dEa e3C*G d6$hzVt -o ",ϿbD|3$@!+ '-h zNB ';[1/\A һ m?bA %hI+(k>bKʕ"cD$Gb +p+a~PwhĈ". #gK]I=+ '% :JDR?w | &8t=BbnG0- ʱ|! 0" X#$bh6 "b$toeb`Ȩ̜N;cCG^K"|c 7%!j!B$}&!M@] v^# )cB%#,tY8""YP{k!A$Ab 301/ ?iڒ]Y0 !f_M@1& 7'"vIdOe 8 m %# ȤY!b-ܤ>#Mj򈤋"pt"%%OH\$-ɬ mԮeu!=] Z'*Y2"T^mҡ!'!/C14ơ=f d4; .dB% (*خϯ4!iR!$Eb:5nL~o 1}om֜ɊIqfrTB6(3;I$y'#HgPe`;D%!l13*,`F P$ cs#؈di Ik"!bv;O "IVMx ^\ ڵʿ"dt!><_44 ",0" s!'ZTI~~ n 5dB$dig "7"D=!A%D0b@9d!ܯcQ>mjDB3QeaH6%T''$tHR={ '#hA&#dp󄩺Ckd1& 0"#^!'"#:Ġl0m+zb*}% Yݹ܋̣ uZ#*q# -a0Ja%Ge$?dwe?d#p=ͪR %cHp%!R~0"CbEx|-(?xol$wT]NS$C fyR:'c0#''!DKv4C;Yyet!"`'!'b!''\"o "xx!57!"? !1.^D0KĊϿǣ>!g=.4D>" ;eW>$ NJ Z_TB G &z|ٱ^5b"!-6"{(> $FҚ#BAbG>+1ͳ LSm#̭7$qfdB+ IX[ $''!S=Dd6! p'!6"$!n#'"#n$#k% &ꅰ %8u `#  k09,$& N" !4R#Q&En &c"?`&k s3)k􍾻" H!G #!BAh2՘"ep㐊.&/Ag\<% '"+|!35."aQ #N!'#0'##'!k "!#;"o @!!'"#!'%!=z"X!cĐp0#0NG!o()*$! G!RY31r( "cD]&!c9n$"5#A "7&K"+!6΢" 4e hj(h^"_ppǾڝ2OBؐP eiF,C7 N"ZDs7l2{g$!'bz< !"kl#'!'#0"! W%! /e ! Fڝ !rro"X"A e/rP ~x %w#J $?%("'!,F #=̤Jm f"#= "ڸf.ǡa" 0u"l/#$" 8w:dB/qخi? @ gqO4!  C2?!SA%Twչ|D!"'b! v!ؔl&mF y.4@$C dd!#l#$dÂn2!]!$ N!'8'cFP "7yk"#q"D"Ÿ\ߥ\K9Z"` )4!wO $"Awͯ$kHovjV@,e  N!J~ @i!C #~.U'!ܦcl #.E ^!0!F! &<" #!^c"Bo*F=a AFR(د Z!N O(h6%$ N!'!;S4l]SmYg %N #Tj 'E" N$ '3!uX;l.ݲ! "#u*A;n MaaSA00KQ NG>1?ԡPotءH!k *Ϥ H[ ! ." D (ec"$"E/nݞS:<"%k+G B mq@nO_Ͽ9j_C1 ## N'UA!%Ua&aȼ Z" N"BlA ! P]h""tlaLm/KTN@439/ 0u]=ڢa !b#݄j f "qZx%-O'!^Ȥ*!!e 'cI# $AZ~r.s׈"w"2ػr~-~MTbomasH߱T/~#" N'%p fɗ "NbE˸盛Z-审W" N0@v`)  0!&ui& &"b? !G h{U?o5DG=51/#=c!,1B|l;ɡg"njS%\ #ݷ+%)l$!'! %0% $!S # bG~C- }zԡ*|$KTpr]ǯ"a$ ?l'U|_ ";5'!+b!MY\bmcC>Mݩ̳gmˡB$a! Najqm d ?!e'i` "ߗ&aE bC xo"5::5.)'٢%dTlυ|km y'p\g}ZS "s! |%"'g$.(GD^!n$bj褬$'! ]v-כű $c͎D?" bg w!{!) |!''!؎"ދNjcB oo;"( "" N"A"} !(ى&)h "2 @# ;+ $a/c.Fi"'. $ " | ƛh*ʰB)F'y s! |$;"q | "saa8y"NTcE!AbA q $$ _ Ne.fk Knn#o  bR ʬ#!$ " d'l!؄uU̡#%c/$#,O "K">#!'$|I+* W- C= #4 $ !'#S!oc !ibIC(elaܑ'% ="-!/:( %mߣ^dDU!AbJ#m  a" N+* 7ȭ%g31@ ߋ~$'8 / 3 )!F! 8!!Mࢅ"7$- H.# b %Qءʓjcr!C/!* e l 0!7gB6c'!AO"hG(D'{!& "L ($"uAFEYkG-ߦdDKJBAlT N",)|]z8C "f]"up5 ~d_"@'#' ! pl%zL#z!B!\L2%O !an> " " &@J @r &#\i*$p2 q%"V'$^!g5D'D!'(ac_A#/jʤm XÆMϮeB n3`(H u i:Xz A Y2"&7*Nv(W"n#dac"''!Zjk R&w"!"d@+"C! v\ ,%6[_"[_ $$'&2@xR+y @Y^"D!^؈ɚ5 &X!eAwwfF&vj @$EaQc"0"&Uuȣ*Tfi! k&>]{4W N'rJB2!} "'!A d[% N!", $6 ! "l'"B|t!d"!$ ݫaX"+Z#X# &5}^ߣ$!! y "ުΖN")q# e "E%~r#'#b)).N ORJ"xURl"C!AgGZz,gP -i,Cv /Z N'?JZJ %"'&o!''% [  "#!"3!Vmb$c8=':r L! s5!ڪ& l &G^0!&!'!mrOQ# 8 "i +;{mj}s$ d!Dea"E&$U!bK+\NݾK`[9 ",U M4Y) gC吝2~Yհ%Kh r ӯ^.ˡ N!!5L#kY~Sx* ܡ!#I @"# 5!'"''!؂kZY$ ] \q"ws"ʜqCl>"BѭS_?&&db'!'# #k] ݭn8Uc# 5!L" &ds"i#40ۀX:ˉ\ s֟"bZt"b<"c"ar H rf e!:;L8lz{&!xx@saC 3֜"!'!'" =k#'!؃_z #!L!@U[ ,"~nȡbbq}9a%"<&!BL'"  9 ^'[\_nA #p)C'{+%Qڊ)"twz #!Z0y!rN#}!"K""b =00e󃾁 ge艃 |Sn@|La"+"$tAD5'|!:##'$'!'"?AϤi #Ey^ab/$^ aB'M!p ! G (@TgN Y#s T%bqB,;C( R!6<5%D&bP~.f@3Nd -fВ:a!l@}DP pBi%؂椱"*l '"? !3!'!N"z&' @"#h!ӼB%V.c6| (ް#F q ( ##P$ Ub1A6!;;)x&#)G(błi4`X"aA '>2 l,gȟsbj\.׉i|"!h!p$DĻ'$ H!'!%/ ! !'!@!M 8$za:,I6w # u}6ؗ"$Jy#%"c B%5 i"莻",t-d#b #QI0 3lizb e>xjūha 0Z@n^$!HwUʡ!!%T#'#'!"g !'Q =$ _(뉝 +B+H>%ޮbE0ryFv^K*bB r# %D,+}K' 9]} #H"4%VL uDk#Ac .l-R"]7ojôgKf^됻$:%#$!! "'vE {j#'!eOT!K-w<=p4vb[C+M%]*r*if0RKB!dļW}l,d[#T&C+) $o #aA#> d $ U"0Sp`Pv#l\?jú/eaDo _doS0T S$0!!X"'Bpg^Kp[ M 8L0 /F=#U` "!!>'"ب#H'%kA\%$ "b " "\"b)e [*l:˜!g! #$#CםnΧ[;D v b% +rݢBb$'!g,c>~ )#2%߇Y"E1ebi #u e-?/o7eɂaWY!A.s g!>V^A%vw"ؕ[t|p"s"!H&2 !r3 "yO p wOi"Mwo !bT"l$CdVPFP 2&H["ljmHH!a E$A s%4#!޽\$& ! 2gb% *쳢""'$uMB $bo%#]&!#F dA| !b 4&S=hdÂbWDq$3 @ LJ "-ef% "D$!"H&'#! DorFMMU'q#2oŰdy[Q&'!"(D F$ Z#  !tq糀 ~1IR%K^íPgi"bOB')^<9z!{ $\#X#bR$(%D<'?AWvâ)! _`p?c S623!FV% ~ "m !.H# "ب#H!N  y`y"'!2D_T@~Ru(/t=$Of W &"t:!'!D[$8,@>}f &;S # ~BKT48a cK B(mTS !x!O##&Cqa&'TKq"6c&b!Aяz?zo BdMq0 Z *!'! # [7X'"{  !!".lP >xl"'![a#R* OK(#*_av$Xt ]'xx!b"k!U##ju{"[f# 2#'`U 2/"aC4)uÐ3*#g Ȏ "l! Yպ #la&!&a aaܵ5` fśeH Q㾦Q"'d;NFa3 !vZ# 0&!#"!'(]!3? L!.%~#U( A &qr:]Gt(#&-!#{ * el$!D m1>#W.n3`#("h !'"d"H^bE%q5a O |  e9BfDa!ހWo !ir"*  %!!''$6r "+" g!#2'(LE` ) "&@1_ᚹ8F0X [) ,NB0/$C SH]R{-9 (bWg %fTRt $!hR 'b P %:"'!!oub(0?$D؋09hq udՋVˁh*avoHnh>a)O֍PĻ!^jv #"'!'!`!""ac!'!؊ " T" #!+*B m=X;˲F# 2 G p 9(X'nk'qPkQ0K ! bW48 )b ( I %/$ޑ sox" O N$# N+_!Nf2TXC"i&;a ᐽg9#l('&j#'!"H['"wy!"!䃷X #%! D"K nH$#il 7|u2$?#s 4q u7'<:Ͻt#Z,L"`b: D-&H/ ֡&#IfY@-4@ -w~ٱ'BV x %ڑ`g ϒ- &! N#!S`We?/EAe/@8"jަ6 YJ+'!"e"7=-P!'!u!zu0""'#l")&p# &[( 'Z|8{'[ dP'D $&Q} .s󂠹' ' l!f T`샣-"7! N!8_2?{fs=] pRA j¿3'lͻ>"'$b?G W8$t y;#!!!%''!!#*l !"'!{# %Zt7"4'j8L{p! &E;N ;?Vn] K 3^, % c*йܢbGG&O౱O#` >> mZi؉!T&)M' A k¾/oҧTCy'#F l Q!~r!#l@$'![AI* 6nG"##C$!Y "& Ik[0!](E~^$EM RU# Y$ 2 َ%M+`*}b\^ 3=EsꪯJ!5 PA eϝ#E$nm,|,4ڠY'! ! _!U!{"A!!&! 0!'!Y!G+&"-" 6!\hQ"q""'!2r% & ՙ! M!gy! .!$c|"_{y7}8D4|-27n^ڑ8܀V$_ -0T2I]xS!-Ψ޻4RX&b3#^i2}p2nğ)NݬE  -boT ! !* "!!#5 '!&!"+m 'B%#Ϲw "!r'W!kaH!$|PD#? â7!7CK!\؄" N!aBIt3[T!F^N! 2L p- {#X N j# *w b"a$J$=2"z `K6 :3BWn&n e !Aut !  T !G! !xx"]`M!r> M>4ݖ"#bi,W_"a!T/D2 %n l"*R#" "_("HKUt2ν U "" *"UZew*v'! N" !5%:#bc@Q#Oi/Nn$_>Q]ƍ#c* + +a5(tI!^!1" .(!")m h!! H ϡ! M1bC;T " "i35_2 aA- #&HИ"%:. !'#+Q 5A+H"~ *.+M&K"#-!؁%t'"" N#*1؄R"b$16Y*.#nSD$MԺL@ #zd  !3>$#!pY$!"na O3"#>fD~ !,-{nz"hMӞ,"-]$! ?"(" 6$|S5a $Uə&:]Q $9K b "R>fL_8UB &N!بn>"! N$T~؋rXAc (F` ʥ T z\!I 2$b" EѺ c #omܵI(RdW6dTH$'k Z  #c!q!"&myb"!&l#2bi"ϐh "'!^1j!o .Ȏ$"g 9[""'v s"m%" 0*lϰa)b* }N~~!F <Qm $#3'!! N$"#S!d.F@'" N"B:LV$&a C !s["ǟ"Qr] 4 #'!}P"硼 "0 "'#؄l$: "!^!i"%f % ]4 $ ! 5@GY%#!"+N!Ʊ=E(!W %K"auM;1b=Y1w*J%Jmܱ "fLɅ}_@%Y5+0'!<" N" f&<' N&g O+4ݡ"Bbak@/N" "D!b A4-Jow"*|"f"xx!&#Ci n?}` "A&脱*38jE #հ"cE'+#(`%  '3 R*` f #L", +?@-$ Gd2` ]8V@"'dt4nMo#$Yۇ N%#R"U  $(iڰOH޽'Hٸ "YbE^ &~ I .ߠ/"0 x'"'!vz"Pm |z,A%" !K!a%bա11LPX##> bA#W $X"9%( P]'!/&CC>YMMZOp 9"(Oߎ "=1#:Arz(X"!p$ P!1 M$ ;#qb0" !(>_k$YJ^!yc݌M^;.aD y  %! ) $b#h {E Дd> %W"'%:[&X$A b쪈[۷f㰡 "\" ![ # V!Eڛ"-!,"b% j"b'l !#]*j2ɋ +9\m"aI@"\'#& "t= `1#3 $ko\1ޗ#!3"!=9 !c*П"ni!bao .a#?<+ 7 0'!@ 8 #< 8!!"&ٖ$M=+NkޏJ !!'!>i͡#K']M[ o!"1!!/Y{q !<ܤ"Y!c/ b\ED!D)q#s&pk@ $%L-/Xn"3' .BV}'sV&׬ %0 #~ '$/d̈́" !Na],c@ː|#v3 #'!Őo%' e "E !!:Ɍ+=LJ9"'"xx!'! *hZ %V #$i# Ng" $ Ƅ;٢C#(P%CS" N !#E{"JbC!=# PwR ` K^A"g1U_jjP K"Q::M N̆l|>#'"'$ReX8la"ez!S9#/8"]a a'B D'eC'%'!R!!& (:%X!"D!!'A%S!؃]4^ڹ?UZ# N!kU֘25P$r "+."az+ Za75M<Or1 vh$$AV4 u bƠ n!6%I=΁ $ $ XW0{K2KI.Q 0"Kc=$wa/?'""| y!wq!!)eÄO>bB 6Ӫ!`5_OG$GryQ@'$1}ky"+7K*]5Mb "!أh !'"0`h $G.n$ N!Iq\L:4ADO!3#J*#"^PE "w  [# Kb-9$9!,1{ˆz"C Įz$$!f,AA/=ߩl _'"V8Ŭp'#p#UQ!Ovo\WdO o\^)82*Q\eBvO]!Q(ɀ !#Yqt6fHΔc*J"E#n!2q?|,!!'$)Pzz.XT$ N"/Mep?Ѯ҈I/f8 # N"K !Ov' $ 8#Y䘂'4D= 'b=${Af6kٰF[ɫ ! '! K:дc "H[")!>Av^66d! (.U3) 6J6DGC  kԓ " !'G| ?b$cLdȾb# F!m"&!| '`&! '$+ /"#<$ N!Ve's2]c,J1 " N!, c,Ђ "N# F]"@) &/,, .'#c|jL._!Q" V*0sIBaȂ%!zYmÝ}ح?b"m"]#C&RCZ ,lq%p eWŪ{. !C[#s'! =B>%8 W!1 S&aWP _~$,ub q/ >I&[D\N1 NxcD!z:? }$^ʹNZh E g4RL  !A bu & ]XN/߻ʤo^F"Cb!'na@"G"ķ a!U ' wO؍;(4se!(  ?xw)TA $6\"5qCz $D90I&e1XoI#b,@--$ MA4r+%,I™,7 psXRnĿ}v9cE!Jz{"YG!!'m儭=e  !dM;#5,qJG,\#>dN1% %N$cw'.#wHkhh![LjK L b! H& v>zWE&L_ (Wu "b"# U %&e9(ܲ#c1E. W<S+ *")"'"0*R(=1 ' ^mz/TO'!v9| * P l!B$k| )&H&b#d ;Rd$ݽHMn)`_ &U0A]=\"t7*$6"[7^!g򿒨E)\IiMJk[! N!-N$.D} Af  $M)e1e?O!##zv!D!EN l_5{ىscb2!'"/ S"x̐~N_H )9r9(Wj#N:Jޙ  jI#ŻC" ~+%fgçq/2 6$'"RI&S/ D gPZ,[i$WM b) B$1"AР +q-#{窟f6"Kڏ?  "l#e?j!Vt "bWf칮"(3*$ hda5o'~SBIVm % ]<  } *p@ M.>Yop3%'% ;JKlJYq~{r!$a cH% Yc+! 0"|w"#~   {, #aSmbS B##ɢ*p2R#$ja#}ُN\ !0!bZ6x "C'#c "\A$#ӞIJ  |A QN~)XYUFy* ^b\Ǡm$/PM/0$ hyd]kFd1FU/A#X4HKb$u+S9R)9S(P!9.bC 3oNo#P! P "V"| C#b$ܡ!U !BeLG !!Gbғ Ua9dCSXn !3 "?`-=׶Q 1ab`>h"g/B@p^* ]x #{! zfcǡ"T aqž_V!'"u E8? P * c|)Â-B&32TA4EM%w o0 D|%"'! dI;"_#'"#b`O" o#$'!Kx/M "< 4W ݏA7 .1nԁ "85 =c % #zw-N#iȖ ]}]~^!'!x . $*E&t ؘM !'%J 4"  (t)| t+'%bvR8D%+U^ "#-ז#'" Y =!t }"" <"Nag#|#UKpc/j ,A^̙ "6v a S% P W@cځ#b*|P t,j#:u]x=Η sCq%#'#~r"t4Q#%b*!Vac`'"'#OhcA.On.#`:pC%/%kb?fբ9H,@!m Ⱦ]F.ڔ@c(;BFbB Q "( "'"@/ HUpQbEn)!S"0;)G  'a_p~( $L :Ϻ ('$'D2l'"1 XO$adzN ۜE W"d $bu /$0g˅W1 Wp`dV  , ޭ٬{Eb?/`cB)t*=-d[* # "!$'"M!E!b5)! i=JuE"nKu!F'&$. | 'Ab dp,\!6e}fvx^!'!"' "@ .ބ91Ւݕ+G 'pc!ru&BY~dĈdnoO" F`ce\ 5ocn(N<# AjէwЋkTbta'GL $9jdC'Y躦 % c_#a0R1!$'!#+!ac2 Pv]ҙ"dk(Ǧ-!  k6PAT)  Q &BqbTPUhza\qʨma"{!%'!& "GM 8G9_VXKbxN ;CHc,c"5Z0{Q ;`T Zi& ǽ e5,ψqNѥ^% JÈ !yE (8"[i:ὟC&|W"sn#C0# @ J.!aJ +`"cCND8"c*!I!)ʂPSpzi>!(%2Qu246 0#]jbS "n!'#&'$!'#X!vc$.vX"JnO>9}>/! "yw!f1.1.O*(-R?A hܿ2xcd15v  &B:]Gs# #੫|J ^@h"gD%)#NIN`YQ'#4(|xx#'"-k d(?Gi"2"Mوx"ph"$kq a3?HDB2W hqRCSN4UwP G- #i "XLk[lo*cäVv(؄x% T/'!  ) f%uq ") N؂" #$ "e{ecB0+0,tR" fX6OP43@]!'·6ќh|!__w\!bH&*).[< |XlσMt d~'#2# b Fp# N!"%/Pb !`cDU%B@ ` # &V X%'"U KO'"cd " !$'"s  "a=' #!![)J&V3)Aa Bl fF>.21 Md 4'~"Rai!ѐL>+_#< &maJ%. zZԪYI"'#6#e%]rX"/!Iqh#! <G "-qb-#c7G 9P$^/ #.ԮkIC"%'Ւ?w @#'!f; шV@"آ ^'!a ":߭ʞ #Q ?/a"a``%C(9R"BFQI,a|cЄ !dޘK 020.Lcڝܬެ-fi"glj #H%I+髵+ZkXáJ&*=bJ'! 9$Af2+Ϻ*ݶ"-/!Zso !y  !p,1~ByP#p'0/蛏j  \\q{u"a $!a"fV?اh*%5!2to % !<8n1/ $0/"cV+T  8Q!q+Ł a18_M_$'`_?A>jn쯭m^RdH"ffX"54H"%f (7 1;O 4 51 H^O#'k/#Bad ".Ӳ"1 !YZ ' !j !Pe < "! !p8ȢLm"P0oDFu J !B^gdW- "s8!HU^t !5Ԉot^Ae Xb'<"d!0Jp = .5" xQ]0s """@B{² ְo塿_@#љ˘"DH$H%/ !G%m q :,۪#>"xq Q! N#BQd  #W| MW4 u !4 Y!a$/`?qo1$Q ctboS.%3󩯬{*a7DpP hDgBAfM:*%赃sr!]3غ F'!}hfLj8^]Ҭ "2cyA !Ag #7Xe%ÆD+!"p N%|$40 "{oՃRl  #0w C)"ʭ:7$h_[g'" N#F1l۾&"| @  a!Ab,PSqDbeƌ_XNdwTv.-cW%x_TID@BEl7g#7祃9o-<$'!d;n)~Ok &A!)"Bsf&/,ρ%3;d,'C*<dt@nȜ;%#0 "֩bP(P=խ!x~Iy"t U -#J>;=))څ%p?BbA'!R0#F 5# )!a'   %9A/TeJP _C_2$"a]OPѭ#"%\^?fǂN"w%'0Zt\H?>~Gں[ͭ^A.@-Z22"BRg &DF65D1J) ,' !08$axj(#  gO[4)#!Mn $X $c-n,'1&9" _t Q z p & D#'E9$n "# uݟ /c􂛸'b#ck+7SNeߡnXc"!NOآ'!`VUB-:kKd`@F9D"CAe (wV3t2 ڭ;ں "o a`"'"1nх[MD1J0 !?#ao p" "y )p5P"SZ٧ {6 &!UB\!$A$"&'|!"S& \!W@k^6n(9odۂ*d$?"#< /hN[O/n9. El/Gmߋލs. hR!E!Da)[uP-[P dj5[ӹ$ P%'!M !4" h Q(h #e9Eɢ% t (NٰHb^,pS>*#"p~Z'!0`%-vۂ= 5!!K,!"1-"-ĥ?4ɭ טޘ hۂf/^Jy"2 cWb$!Ǿtoq1QcqiVA]!cy WMY[ɗņ ԍOI!,'E )=-W$m&ft %뙡?Z| $kR%+ *ﶯ0#s|ePβ#e=Hg#6CVw #a\mģ;u8zʦqޥ bI!  '"J.%T 5 5!% )!!s8 #b "h&R 4(;ӡ!an͏ri o ɚ#^Q' ! s%Lt 5!'H ,"!U ] %*sYM1$ #jQ7O: #1QA~ 1(Ri/_` :?Q^ho>Lŗl7,<#PuH& F!~#]bKE,Q8`& 7Ͻ +oTbGܭ- yv#M#, d!qb ci( C^1 28t^&ȒuMKǵbb"Neȍi 'cU$qnϬ !#" u  $$#c~_w[5 EJ)Ľ u!%d $$$T 5 5 !  &./  'Ih8""b#aHkѫbD1^>J!/RM3NuW/@_$Y^"#KV*w-b -0em&  ba(0A#ucS#};)Z{h*cB +A/b*ֆ^(ܜ 2%\} e!v"{ e 'cI/^o&"M v$+3Ǻ1(,,] }ק-PNL ?s[%v#~z:eJ %OϡD!2@W7$ ~ P7%02q!29]O U>o$Nbˮ udMڟX= K/ͽu o%M $To2 @!9/ & q oj+' w-"U 5" 5~! V&Qd N&mBh@'iK!j ѾXD3-Г, g0ԟB&PH1 )K"] #@. ( !!' : X` 5!! 5# N!ex  "" $ %_" s#"bt;@!cgDnΏ&Z -5$jl!j8Q>B%>"nK.)_ c2,N"e F_8 $Ad Cu aA!b.#3*LQ,ʹ=*O"aW7"d%󂾚%8 P: 3# -& ,Vte[z & j  "!<! 5% Nq !"("e>Rk7{$&S*" ! &i0f!c|C5// ('u4=L!k.5!B(KJR#ca"f'O1$Ad 5[@ f B%t'^.2:c /cq$J$W_'K쓡!gԦmbo$ C;67x$b5 +B | &dP) "-lC a# ! p \! NIs]y#!b0,lY!$#H 7"'vhfj~!Ų=(``͙2L<="j'( C'pWJL)bkK)/bǮ $Ae*Gj PsQ1ahC_m@n>dc'Y!R"}"D"c쉠я?:Dt!7ߟ!$m ޏ>bD=  1 SW$Ope"s ÒM!]%! 5"T0"#\=Dշy"" , $=!E{""{YTqW| pa#d !( D "jD&@7" Id.1!iE#?!c(#B!f"9Tu0 X!xQT[.ٟ4@dB$~yه4Ţ,V" !d.#NM"$v$7>aV#M GOB !`P0MГ[;|=%! 53 L'#aeM&BlM=& 3N F T,$ )SbBJa$b (!GKM #i E$"Id 6iF)$b(#C!f,B]P p 0y/ $p{_wdE+~:%R2A&>u$W *2K!' l!ay" m <QAx%{Ӣ}` DG:q!! "bL̠P /%%sXV^s*#5:!%&se !obB)w "c'c D4aF$؃l17UHdjБ!k4TAjA%C!f "3Id` _}mAʖ `b$޹wvdӾ܂K.#? C3FKvfuwv%6cP=.֟ h bj ' $w H!Ac)]p '@|HA)>pӡQ!w!Y* \Q +bC&i$'#'!aOE!8 ~Gd?M`M}h7cW0A$C!h&7Mh| ` a (|"P m`ūÄ[}o$'Lj;,sU!'!M29 C = !FF"V!33 D && 7!!Ed>!%0Oq=|3# !bv#$ "k ) tU#|`cA ( "'#'!G&!' {E0kPBAffooW=%I7Bl "9B\faN &n *HD-B c7+2 κ|}~-&l.p#E* "'# & * u  !S!!"! V\n '@ ~ L "| !cy)G#a{P'a o F\b%EC r_ . 1Zpkc(; xx!'!''$'(!'R5D _o~ ~Xh_O<( JCwj )8JGE;ĂtOa%n ,6&Cc +҇-mc8R"ؑo'!(  ^ '![b3eC (5b 8 Cɚ X" w2?wy"vb9(Y 05>`mP ta'L!'!!؈x'!'##'$!'!F@ H ֑dE쁄iJVRNC6'#I" l3-644+ ر$Am#$F=1ڔ;݊Nvb#I !1U"'!  % -g}!6 !sG@.['&tEo:!#%ՂAVC@#"; R!/`( E~a 4@`(nq/ 2%(X""!'!) b# N!TD}a  W kQW.-)-(& v&#j)!A %l D-7%%mxeJ!lŨB;xx!'!~ L!D0!nn !'&} ( |d(|  #'RH " N$,T/D7_ LQ Ұ 3%e,ל L!~_~<"'!"ߣ''$R N!A{0)(a F kh!^8%j.f $B$d  D6dE-O5#ļϞrdB Z1<"'!1!$7sfŬ!'!'%"'!!'(%B Jo! N"B"dtR !>*&tB m+"s.sd򮡑!3ʴޕJ6r~$'"''#" N'_@,b&"j iN?OPT+tiPC>&N, 'c M/Ϫ-QMRmL#e iϔH i}!'!o u! /z!^#'"va"<  !X!$.g&~b!2 (!ɧNLm3 ", I| Rp0"$!r8#+ ]ʙ~""'' Ae y#y'ʥν"'!![ 'V-{H!HIa i džfd'%էM'&'" N'"&+Qe  $\ &{׵_W# n" %?*Ú%.!!''"# o hǁ&("4#a!DD$- ,}~̪u^ ,abf&-"0K"}ob# !P `5,D iMnL Db"CLQ}M? s.b]' 5~DS!RԻj} :BC$ͣ''R ANC $(  N'#bo #<2]>sIq mOd"Q cP.<bR#D,=0vߐUX]0]#(7!8'~/1^Т!Ѭy%o"#w!#%DĻ'!"Z :=Y| ,D/#T NG'#Hv""' N!dE;"ad2a ^r#dBD@ 5!c"'#4"!Sq,"\ٳ*K+Y[ &ܳ/Tp -Pݘ"0? u"A"a^$^a'W< 9 "p.& G7Q/Ľ" 5+,E;%P8m+_/N'! #- "#az3"[opm*D!< # }Y"'?,!D7 RQ HD "$@iЎe#!b<$#wP!? ! !cSܧ[%!g;0 _y "c4E"aMlw j&4[7|!K1 '[~kk0" e 9#2B XL3=' &t IC [$ad%eI /*!!-!" T 0 !(s%D }x b> A G#660l "#)@ Y#!l!a*Ĭvk$T#+p1ǡ~$4  v[/a$ {(S3DS0&>)]b=̮!uzi7cԴ</?[\QѦ|$$ b8O zm #'"1px /R%'"o "qD  S$+# c.Z ]eȢ٢ !HT8q {!'#@ 2s"ʾ;x' 4;b1qJy %BAc.c cfH$0 Q&2*c3 et0V;)&+mK8a+^[%U -s[᜽i)"#t$0߻_K[lɺ-->18$."h /W\ %'!Q"'"! 5;!/h <]mB悅rOD"dVߢQ"++_R۰!'!#"tB|ڰ 'tJAC-݂$%qa(@AoIAj ?[ssH ]$ 9! E!8%]AY)Lʚ+*mmLmV[W/6M $$''Sq!sۺa %؜**1p% en #'! N!I#F*#k .I@ ^!cv #x "7%"DE!t⁌ìj([7!,i װ~ Bbk#=FJ8 ֟#d$^u{ 0# wH)0|"ꖡ"WbrC_0; %'#p$ :ukËӸL%eޚ2b(% $!"''$@ BuiW<X #a #0 Ma}hv!NkW=c| 'XUD/2lF!Aed+P&> #Ot|#i'1- $h+12@LHl$ Kan(Ǫ "OtTc2Xi(Va cR0",,Ԣ- s#%2B%dY"' "'!Dg'/ۘ - 3az #bJ$""Α}׸|'a ٵm+Kc8! !cBb #] !#wΩD6e #bU"t '! Fm"s!g2#,A#'I4!!L뱯}*~`/S#0e3TG " 3i3'b !k  2R4$>KJe9¢Ib*#sKT; &N4P,WiY[-m>O E5c$:":Zmx= 6Er a"BdO S A#!!]8h =#c!!'"G!R4!nfa(..JQT ,2,|B$+t<| "Æ$Wa B"Xx tEbzB''TC^18. #9sc7 (P@a&h#} '&{}Z0+:ʿn"3!f\G bpkL "XG#J> *bA (K2dcע!'!6 > f! N!AaG#Bӡ#'!E!" /OD""5b!!! 3AOb$b12Xآ],)b_E'aJA=#G5%bn(b)hB%] sop('$'&LܯO*+ڂ*Ϊ϶ G#6ŧrmˣ j=!c^A 'c(Lc!c VcV! NJ!ES#'$!K *Ķ'$ \4*]#-)µ;Rež1ע$'.ew.Zb6&'Wi "A" ? 1p ^'(!'#'&LŌ'B#N:&HčǞ q#t(vn!ѯ5!c(A,F$Y !'/`9!I"#&$@<$'!g|",qȺ%|4l6"'!8!]t7<&'#>ùLNpc׺" N"25"djV4 #9  !8i^1yk # '!!'BC %Α ]#^&,ȭL^8ۻ#|t!"!9}z/ ,S4Ha W9.9 '"qjl9 N!H""2>v [il !$!G('$'#1Vy !&v820,hH ;"zYL_ N"Ys#B"c"쁞"> 7 "L A.%\җ< [M% @! #(ZMBP #fN%o'ȵ-bXP|,t1!o![ѦńeJ,3|%Q "q"c &pzo '"'!&*#FPi]"'"6!("'%}K#F;CQ/ MǛZ0m N!}03 c 4#ӵ$T[<$Lѯ &Eۖk1$yo$!!'" j % eIAtT."##k݌𸜉$p!O!nʧ;Z+I-?? *G#deYSA#$'!`.!FAXL·}^!kH!' |"{ !ߐ$;( "&`qD.kB"''g: EM=!CGm! !7 %O &[58 "Y2B% @!'yC! ;T*%Ib".̈""r~lJ8{"E!"DĻ"r mZ DT%* !C!s]>P1K#i}*|Tp')8 T'E#{urJ $7!n."!! N# R Hpl $"/'O: ]Qҋ#@$،^יLJ0`% %3)e$Aiq̻P "(5e/!'$L&BhF!"cqS 'q "T \Q:;_B%M2$,S:#vșKϓm'T!A &m$". 6 Y!p"@ "! NdbiL"]'Py &cf!Mju 69! ,"! @  %i;$ Y 6xw!G'!xl@ "d* E&ڹ #mƤ +& P<"2N0*C!F/ Y O@O-ʡ!''؄z''&k#P'- !PQ Pր ymGC!R f U U'oc(*V̈́{_ Eb e 8 !'! &E舣xi<#f 7!!'!؟2)!'!!c!'#!nʜ#CD(/%To/v!'(^!F!մ'!M )>|L ɨ$c 4 O $# &R7"zQ1  E95x bwA$c\Y@ # I '!cg | 'wh"g 3R:c ! ! N%"؇!gA#yH}yl (b6-ٜ+ ')р V&Q35d6Ҳ,87ez"-^iT$>." ,))-!`!wo *!I"n;+%b"'!x(#tO b2),3- )cb\һL:b)'!%Y@ h !"##aI4ad9!؂#! N% #%"c"=Ƚً_}MEKbC؈HYf&Ki!y@1 f;H39V/R"dE80莽!=/ġ"o$)`#! o $I $ !BrLIAb;E4[6 ar' { (dɹ쇇ƣ4c'!'A)p! #Zm*(c$B7!؃T:" N%? #Z'#!c[My ͬ\عd![)$PQ x'r&1tf"-%I%,hƅ,=Է "')^!" !*پwM !I9 !!p\_-rPQQ"v#N 'eʮ뇒՚u kd''!?D=qs7Z !F)aCV6A#!"~''$!'#!!'&TJzPP n-.da"؈܊ n #˫P4"Lr* #!'!Cb%+swq !%C0$ Qyq "Ad/EbQ6톌}p‰dB V '#*S!c8 *k_ )!$ J0דh nT''#^'"! 2#'!WaN #V"10Iߙ% ߒ'r0m7"Q !q>`EK_r.0O["Y4 ! a.W#ߡb## o!C=@'ES? !|"pRaXRW&a "Af 3Dc mp"d-B MR7i '!*.,iO*M&Ma #v40}M嫮!c'=!"!K _A En6: 'cT o*?,d)[(WZYk # VAR)Raa62-! a1":rVR O0s.HmG2$"Ip\ʈ }1X Ng #!_#@`%"! # }-$-ˇa #Bbf2C c]ɻ$Cc7b(?'!'!с g *?:${L"#n%L #b`~$N!''!Ɵ!!(" U#]'b g-4Q#?l_]!2ȗ$1QJr5!Q,*@2b_B'!"*I ! m ^DYO/|!b-%?fA$D~ f !#["=6 $9 -Op(*Fr*TQaeY$@s-r0}( /L}Α&+ENxSIeKHmйZ T  "'$wM!!b~hD8zZ P!H$1tf =cC#놷L̬Zhn)A#|"S V!@5QN% e9 $b$ܢ'CLxx 0 0!r~ m,% xNy rߴ >֮qŢÞ &`7BR(. сʐ %rNs=$L-); 1l0p WNQ<$r"V&1z"':ࢸ$6cbL"- / a H 2teTH ci*7Aʼʋ%D!#aO'%'!yeAI!8N C?&nJ !'"'#){L!!#׭v>ܖH#P!y`G-Ӈ-jQb$Gg9T26a1nv"& 3go y:DLp 0k@$Ҩ~ m[a"@Km>|{h" !'s "0 $%"wc- D Ca*H7$'#5 !#'&'"'$k uܠ_>D#P#aG]*e"'&!-AMJ'a! A θ /dͥ<*+` ~ 2&h  - !V"^l?  1i $:-w? y9"1^M0 aL",$/ J(698'-$H T c['$;7eAZ %b 'K '!8wص_e@ d2:A?ޢ ,#d7C !#'"D}>Mkc&D3 !QP6O! ߿0A d֢B+ ~e # |"E x] !^"2 Cd { 6a.ޏ# b\%C !dE '-# 5 O%8"*la8`? k-s&uak"|?$& !a"aث!drG!!' <`N]]w(콮a" CR S 7"b^:h'I$ $b? !'&i繱*1T $1c $aֆzOsea5"f E ] .W"w"`g3Q.0a G1 !SM&,`O\ "|'̡.ڡ&'i!z )!'/ds!g x"oVKisaك#-<&S dk A%1ܤ-y! #'J< (p "ȡ" E~ _q%Q>!'؎..^/njxI% ZIv/" E ?)FQ e[嶞e$'*{/14@PSS 4D{ %99,  g!'/ H!~ԥO>^<+R%2*IVБ^l"[, T$"^#q\_[o.l_ c!E؉B=/"%6|3u5._ j?n(f("}_$' <#'%j.22" b"vqs4C{&0+  ꢢN"'.D!*" }TN.6/Kc'*Z6b",Z;$! 6ZP#Կu"%qЎ"j؅ ޑ$|A0a" L!e4j"=~*= &;%pV, A pbiy= ,65b " DH H': HOs"vlg@9P] (jEAh&!'vS"؃0H"8aT"Y"'(Jm ̿ʸY % wdj3L7E '!~9ۮ '#_}$Kt !bk",? 4|   墴y !7U:'"I!_ >= $^TDTC" 1{'  _"#'(e>s׈? G!:,$ w' !  ! ) ?#R';s$š#zv$''cDY 8Vnؑհ p"}F= 뙛5"'(ȫ3Ϡԑ[M4~a%p,Ł!א-^<'! $''!"L!7> va@&r$ z.{   ɩ$b"!''Bd{#B@ " - '! ,X~bB|( "5B"؄]h'#o"E^ !aT !`=a EOĝ#O" !vƯÝD7bD 2# Y# <&DĻ'$  '+'.y   ᩁc#g  ,L#f#ji LE''!|,a5ܗ * (!!''#c#+XnĦ!!%YC12Xʊ #Ud7" G8q|˯ HM-_d#VU$\A ?,}4#'a}C"'We'p ,Na&m Eg اL!i/  (v '!pBo0WHݞnޝT geF Z ""'!Gꈏxq ܏"'%'!SJ {PA%4mQ bAB@5$o%%'#"DFerö &L5AYN'Kǀ%a m=#i!'"'&u) 3!dTk 7N(S!'''!CTo4G,""b""G; $0"x'c1vRMҹ* C 1L"8QaZPK '"oup+!DĻp '" # &di Lg= ($p!'-,-)((&! EUE jǿ̦!FP$p F9m'!ib1yb"Z?"#/ "l!$&ҫFjʎ#1"b JP?M #`~!0CP<&A@ X!2& $d,>@/m "!bz'~  w/sP8>O>!CI'$$~!!/05345530)! ӾC' w !0!'s'2({ JPb;91]",3H!'t k)""L '""!!77$0'  !v /O $ :J!cԹ k \D^ۡ #ElV' *Bc :.P$Kc'' Y"ad..k M!B'%$|!)1:9=ABAA=92' ˴$fNor$F{ #!St8@`_!Cy#˄q4zy -.|S!'! e (؃#"''""l " %R idF0ա! ""؏մ0Q G~^#w $-&~yc?D'!B''!'!g1'B30_. "%؃t2!v)&>=EKMOONKIC9. zorb$H"1gs=De $KA%Nen0Ґ $Є-D` ^-$Dl!'!  f' '#"'!`w"a?B\pab eEОooo9 $!؂T"{A T=#'!#Ea%?9(E#'''!5RD%T1쇞Kȭ &؃Q!s6@NUY[]\\ZXTND6 fOL]%d>;>SB (bB t q !;rA4%ӄA< ` t+;H<#'!  &!'!o.;!&| =":9e "j'C ! l!؃$H"%hT ٶ"%"" Ȑ@RY9z4 d?)! D'''!LFkզV,V\ԡ!7 y<%؂`sfegjklkkjifc]SEG_&5c%I?<$H(b ? =#b@&Յʠ ˠ    *JZJ!'!%!"''&!! * g}~}}~}"!/'$NNM>..<<<:>飞^ݾּ=> xAp !htmWa7 C|2eb,2om_N`)O쪝b.n2l  Z':/ d!]afpcU1e{Vdnf$d~>n 檞.P6-}? d󋩒|o &!} `%/d>P q*omP@1MG^~^ X;5 arO_ X!$%|-#b v ϠB.e ;o;q.d3=ߴ~5^}߰͝m5ߖӫ3 ;#.EBs F/c(CaMp L,e'nqG Ѿvb}Ni̤}r+^ ߩ/>g!r q](2C= $3"6c+e\Adk'%#l@fR+" ɱӪ͞)^,nm^ "q!G2 c.<4B*¡#}?Ha*eT#b9&"n#?:%DY< }]FN,-&IPMq=6NeNY6R'5_^)sd Mq< 'D'ս=R^l%bC !?ocV-8H-ZOR)ZdCd7Nb9D=cCdD'( |ӳ@nNj^e.gN.=ܽUÎ܎rd&f5QY  !f˯(l/@f&GoIꮏJp"1 "[<ɞ9][~zeFe  兲,dOC iо(aI/e2o 60>T Mզ"n~\fNvܨٰ n[~N#d !!E$ wV^y !i̺($Nu~ ௾Ad'/^` K騾b!E#EsDlek#fL5׬\w ~ ~ۛnd )n\!Q>n o'c!D.(q h^ŧBICL!x 4.cȕAc.M_A0OeEj^S~)=;%!-ab#'!c=$bN1b! n~ ooj :OOm^NΞ xbKs잌HPb '(b[HC-o*oev? o鸎>_~+ x!" -)1n "''ahbO.i-Ν~>)?ggA.֎ 6Od&|N$R'";"Bbu"5EUo׸]Ѐ=Î..ZhϾގf_'// +P?d.2# t݄tI''DkM 0/B}.-՞ͧ ž^i˼ᣍpA+',_Wud}s#b@@ D'&b;#zba:sC_!b̬>mǽeGM/?/pe颔\"Ac9_'(gطBd !!ofت ", mm,åv_egf'!BAe 6'(aNdMF%!yw=2A֮#"zBI,Ы]!CAd&b? Uy8#!\z3놡k " vpcpagh$"F!'*[>OXz"#؇ ˲K&/ oh#ȼ#"D" I+.K){pn&˒6ƚ$ !%,´Lj *%hIŻe#D3e'[\ $W{$b>S{!J p r!؊HϤ )c iF?s)f+(>k !Kj $]}cNj " ؍INm (bܨ!h2'- f ; Fi)#;#؎~_,-Y۹] 'b㣄io&( -oGX"u fA GaM |6'nZb"ٹ 6| ^{$A bËS)n;X I,"to"4B9#K\Hտ¡!!b*#,F_d֟[ڊC>> ZK.0%U4f1Ÿ8>\C,&> +zFߥ>O"8?īG?j Ԗ 8M˻)N=b ,9"`* j|݂n ]_  KǑ󙰮XKŬUH;brʲͫ}a~V#}Р`oقq?] ²{+4MNc/BЛ#d^B'29iX$Γkʉ(d<d W]\>5%n,|a"}b3B2\!kfk 7!d.Xɨkº\|d$xYLc? bE$n  a%} $e-Ke $a D 9ˇ-}.(]''OPa_'k*   9s9'#"9 %8c^"v'Agם텖@90+(g! "x!Xw "!g!aW a@#ب̈@>"-(b֌8Z_` ~`"'N%b"$#!O!a#lb]HL۾Lfxu "5HPL\pOC?~o_?!Q5Ҿo%BbTTx hˡ!R兡 /$|!@ Ȟe"Yw !'hPq1O ^z7B ?$d'p/!>!c+b!aOKo ڜ/ک>I &dV !Y!b㽑p_En^4ȓmoc%!g *Hm ÿ$%!P!Nb %an9l=ZE$!n/}|g]t|9 B/92$g# BY` #/2&! h"3.'b/>; Y 12.>xxC_N^ag! nU;gE@ Ǭ&< ?!4. -ƢG&Adˣ}b!grM 7K,^"e  !c P2: #C:S2mjFgIP|E!h b% ;;xU7ao%  " j1ThDQ08"Iy!A d5"d@> !v3m 5'];n# nFS!bUC%at` Pbp"@}#al(̲nH" Pi!D`d%'ޅd/ #؇?ߍ}ʋvB>R^9ob@C'0 oS0em!e3HjyJt&D!Ut$#>! "!>s-U̺z/c5I@6ben/r5j "COV8e }_'D:4ѐH D.%́ 36"lAM/h7&fK! Zfpt"X C1"w!K!_ˣ8+PL 4HCk\|ͮpp !]=̌ڡߢ^&R)8/q fj3 >It#/[#k&!ų $#|Sa$4im#i.^̴A"29!M ~8F? 2AeI"'3tnϥ=#V2K.豧.`}${ #DYD۸#!(#U׮ RQ&q ei2t!Q;u =@s#?mK ق񫊫$ ~+ #Z34ߋ "s]-mΓBΠ;  eiP$/؜{ #L$j~mԉlaꬰ # = $LٟJ @*X-߬^"o ZnP˟@pp doMDCT!g+ |d쮐Mo;Z"[$ :l #.I!r>/? p dkQ/Cxp"-MeҶf/x>H{#+!'!:@">\]{]wwWXdI} excL/Cu!"fSd#y3\!> BW>o,,Яn&t(T!(okITX_WE,CIbu"d̢+"dS_#q Ny#bG# ੟ZÈL) <?l&2BC<' N#'"6#B9dC "as֖Nb2,7踤mk|>;!,h!n#+/,O!(, a܈Tlt#f l$N*#J bE Z"!6 cB R[ }l ^ȌJk̭!jO!'!'!2"} " ڿ#M<}]ؗ!c ."Z -dqXv|ߜmh>P 5ēҷ=g%O%Z8 ~  Q :~Rjh#V!'!)cS-Љ=ʉЌӧV,;6 .+!Af.NDp+շ!'!UsD 5e!2 qN"w!T%? z|./ LuNÍ ܾ۾۷ۊMcB'Ŏ$dbcxqK!'$'ań3X7 _L[mmoZ"';!x7~ - dPZ+ڵ @ K" 0!''"'( 2'!I|A&"'I!ƭc罎N]^߇ dzʥqkϑMa  :,!#' <"o '"Yi.S>0%"%n.!N2.ㅞ@dlЫMş 6 $V '"'!W'!!3|Oojn.0񊧡h Z폾錞5^G~.㶭 X^߮d̻t 9,- &IU "i'! N!!'!H["R= :ژ*@ƽn..Z.Rx j;e~  #0h#'#'"( !aHEtLh}D>潭}M>Nnf=ʪ 7 $g!%$> v)!> b^W)^"'|ۑ r]}.8cCdLP8 %+"% "^IiJ "c+#;n^Y]KFON za"BX "A %]!,!'$P{Δa~v,$ˆLB>Vw茾nXb$;z#56%N!'''zF)1 / <>)f1|Nܴ9O.Ŏ c^ _"d41K>& *'"''=Ȣfu>b횰"X ^P躎^O$=6 Q(}O&5] !|&Mꇯ n<1>̛maN`w?O/A*O!ddJâ K`4'"I?!'m'"aa|=>Ie ̓MM}e"msfƄd*͐A'V- 'v  &#| Jِ U " f\m–tab"v_Kh\S '"!' &_&c!.~}\;l5mƉ<#_jvڣB bO#@l+Cp(%g(!'! \ &C!ź  # Zvة^=m#kgP ̵A '1LaG%C)n!  $e# bc #G= N%l~/+2 B%K[v<#E%; a *!o ' 7Y"ex+8W":Ң;"s( )h6C$S_ `^ocTF3P"D! # "@!Z'"dO)jB>C$Q-9e,  !-#_nWk:&!"@u;rbp#Y)j$/ GC4>8 dD+:"#!!Wk4G5 "lb-$d[ڴ)jGî^,am^ N!Bh k!3/8PO !IVYA!` $b(Aj G.Eapկ a* Nj1(v !# h [+ .Aj Eb…eOYzȧ{\Ȁ N! Q > \ " ^pf( 5N|AO$b΃b1 Fti EcG%bޮ[oM N$4Onf 2]BEק! `bv%#C!i EcƜuoOac”5.} # !D9o!!;<H'!XQa=#Q!dg6dԳ|oaۉYo~ڽC "@'&!'" '?D[(#a؆'$P!CU$߼ h ƭLڇ.f \44F%#("u$P2D hŷىN,ny z zW833#g$FD dM\ݝ|!M%Q!#g*؏Ed>ռ$>`T! pDc %bXOv߫pG%Q!!f* CTaK-iư7{ h] bp& !9 ' &H'hroD$,8b籎}o>>⎞ X mA aU"7Zw&.R#dz "ؔ|#u!')B)agl_VPT~A bϢt?듎I1co* 'Z $'#]{G!'5emsfa~d Ěc.P 4q! d? +!HdI!'50!cunop oeݶ__3Ocz cL'C*'"S ]!{ˣ'!'4a0@g  9f1 Ц|fd?y etM- C&pb6 b !'1c@"  uĬPjqo[B,D6$IA_-%!Q-oK!',g7U_ "cbBt¼)=FA>,$ F$ȯ  % bt"+"\ k!d c g ̉/P@Wu>!t! FG̯~ C "3& zd DL 8eې oz.? ,$f,F'aHSE#RÞ~f>u K & Z !c P! `dνicFKe '![Ӆ&,j#Els⨯"nN1,/% c.Yg!=$I 4 ^"as!u1 {n?n!"S.c1d#"w#"mE $ʚ/1?-vV6u׆b@ QO`@/*?ݢcc#' ! 0!\2&"!ʄ-}Ba, _dWum[DPeDob9>. !($''"!ʄn )/P(JkPs7Pv; _!Eq*?n!-_n.91Z"'ab J"R!q%`#!!6o"/,,BIp ]HfNaВ_`3@ꊬX-eCguP!'"GrUn6 !Y#E!!"l53-)LBZbsp#6e@!O!I#M~ PqO uN"'#r";"M$e!`"bfd?%;\` ˰$Q 7 L)`.ޮ#ܰ5~bQbĜ@U#}'!,o '4!#ui&\  0 "'![k+"t `7 !]7\[[%s2  (t#^!J-͍$ G_b'~IH:>E1^ "򃡞 @c&R? g("l#!67Z "a{ { `'b 8 #ʙ~ PT !!>X7j "?Q6os(%E!J!13"R" ^|_'!a&q(M}N^qݿc, )4kLav;& 5jbB MB!"`'@dO> Pv@~ '(:f>Z]9K7L"5g&agIcm=bm "݁5Qcz n')#q(w3$H;8SBX$F:̚"JAKekM݄"%2S'(!ɗn0b &}OA*d@3RO⏬Ո("3Жۻ݀OnF**Y5~''%le ќ1ga%&+~ $Uc2<ْ" 4_C!ÿ\}rKnֱ TB.CKx?6!'!#؂"f &̺^n!`~h]J"k l!D\^M "a qa"Ua'!p%k%oFM%ܿ $P@ la"!|ј ͦ J ZH PPn''P 3%$m!Lٽ Q"`ӮݟۀblMܝR<3bޑ2@ !h+8[\.؁."5!'!$ !q! )${mJ囫"%>(`{!![R|԰N[b*ŰXm+! ʡ!c #?${6BI "q %-|/S !N/!l̹\֜]#ʀ_@2_ xX"Š"%?c=!>"X}z ˹8 1 zcD,z8=\ ۣѫ"Aqe"D S_!"gNgd1[Zo # "hkS ?lH( "#K#Bldʖ.?"%d$w.B ayc<\"N!cO"b#"d0 pica:ۿ z^#S]b{.ˑ` "  x "a ё #'"0 #R  e$9a͹ :".&AHJtˮwQU'?Qv :$$& 0# 0!O#:^i!ѸˈxVfQP?_칝"L]!Ar1a'!$CA`/nm/b.j(T ":DdQ[˚O/ &z]@~g#=_5{~r)i=ϧ-n*0̮ 4\kH 9o..]>t?ܪv"aكtw!T3# DnDi ##eɏQ:==kЮȡ"vz&<0n#^.z껾E}C ?^=a#aقdv!2w/༝>ݑ (5%#co";УX~өl":O]D]c>2#m삁"/v!r)@|!c!?/  _,b#N'%&"&h F:7/~+ s!2&#Q:ٿ! C=~8!wWNoԘ _!EL !'U:D!iUĭؠmؤP@p??Anq"w8G$l"SCtgq{]{vl#0%by |#+!鳢7طMb@&8qތ`@^lb/d'5wO΁LI!FAONS o:/yQ Jc9$gIۉ] KLYmэ#GS4xC|1Tgڤ6~!e OdF% $" ]udBfe;ȼcR!:{Ӳ  #:/<H z b  "2 |N%- %ʀt  &fwT4ᾃ6aԫ،DI;Jod"v G nYC\T "MgVTd(wjٺ"NiSTFń:8+K~ ;ҭ !58av XF px#$ n@Q4(@`\"1 h 3ׅ'OD!{{G4! mGIP̢I Ne ,aC ]ʫę{>acؙy "M>nȦ!! F" N!;a G "o % -n"nςPlk@-" kK%)A`D!!D% Jp H["F-G_Kћ;*,T "-]뼴٪њѺ $c[>b&rU9KbM6Q'!ł?] I: ) ;# :s;˭"Z# ǎJfy %p;DI""ar. Mc}'$') :# (LO><2{v&pbF! $g#!.O!cA$'$'))XJ[}[J3m۱$g40.@:8mLi8c('"l%'"'+B)aZdj= JB> ,j "오Ѹ}J̬pXy  N%!'!'E& -J2I-k6k 8ɍKŚ{e[~ xk F G L#''!!'M !] -."3J !@?]v],N+D ӀNye͍임9,,($ #" D'#'!"'- %!ȥXcF#jKLC.wd֎ۜڨj|'Fv 6ao" '!'"| '- 2**c *1.j~,|Tݵe܍KZ6k./H tՈd?I#ӄ'!'!v'-"$"i "P^5fuB| eBľ} ҉p=@ 1F ''!'$! %;`Q:n{8؆D^!e6Aa$ !шuD_-U]b!'R !'!#%NȨ͹#:> ,@=ǚ +ėN"e gIU< '!d] ͅ`SQ "BZn''!F#< U &P/g{.#U"N!Dcb`H pP '!'a8AɅG>"Q 'kI("' X%7HլMRMJP ֹH"ej"B R6!A'!'!^aŊ  @=ŨI p'm% L"rrҡ "#(O}N!hk꛸"e(C_9 "D''!. I; .ņ-^Q*gc8' K Q)F#'$Jd'! !1@*ѽ<"d C:'%'"''!1 $aD"@c'!? ++0(!'$'"!'!upa!I"B$O%'!'"'k tc`C z 9yP%'!a9 W{1`r!`$4e]# D''!'#a/y+D'+"vjƚ#'"F' F[! $0 !E$$B'!''%m 9 !Zf !A$''# "ɉU[ 0Ii^  '|d@b_ ''"L&^#;BBuej NN"0Xy&Bz/֢'!''!'$Y~5Ҽ! -'!{;Lo8Rf"bF#>i r/$!_} !+2'!'k$FV< _3,,0 N"\A!c   T'!#'"!'"KQ$" ! <"' @$繍8JŇj1վҦZ ;V N"f!*!D! %I Q klG| !'!ǁ dA#` "!'!'>#]Yȁ"Aؿ(!'N5!&PƉV N# N#u8L W &3#@'"| m!3"y '$% 3?{h {ܡ N(bHGZl:b;t"'m :Bm8J Ӆ_ "!؍s"'!!x" a~1 |c^ N($b ##ށ ŧNjcBIԡ8!'! G<;Ǝ{t ڇ{rolT£ !'!?1{:!z] N#c8!b2(#'$$2Fi^ #vT^ q pLxdIĜkM " b< $# N""lD N("'!6"mr2&F "c "d - vh&Up-6 X#("#[%'!9K֣9$ N'"'!BB}A%eRJ6ela Ewa"N]zD4"o(xH{)G"9 ! N$U"'0RQ#H<2c!gV-&#"+:GFoޖdӿ: "< #e *BP^#$:%z' d"'|!4^*= !Pfs_NEET{SPb5p{" W#%E P V ))G F K $1O"'oqa#;SUR_iMhxfXiQI`=RYu3Iί ! j$G L %Bκ{ yE h $ N"!'!KB0fM !i]T^UQ^iRtP.ED0>]P$p Dg$c "AW& N!B"@".P~^ i21:=LB^X| Bb/}7n(m5xS|D Mg>#d C]H<Ӣe{% N!vLr&/Ta , i2!$@_wr $"-2Y}ʉFp cd .#h ElKՕ#'' m6aGAqݪ$h) &k@ 1ݱ%s! ʿ ~0" N!%$&i &/%d{{t}oq ab2c'iMҰU"ס'"d Eٖ'ɔ6;}Rؔ! N!'&r% lFW`_` 71!b|}ot]1L!d E jYH}7rn!E N'&w& VySfe"`Q eaM aa[h%dF̃x- "cu!G N'& }/=& X7[b^] ؠa;Md詞e#Bfd G :!$K# N#'"co,% EB dLe"oRQO anvd?"f H? Z"N:C!f.%'%&7Ha2$kuA2Qm#.> HIn^/ #~~ , C'$|Oi]_4XtUErbWC' uqRarql:*"3 H>Ϲ#cBaM Tu#̱`m謟 =&4;rcy4C&5!` km1,  '&-u8K'P?%^C\T$ #_,?*6/cF CBA ae"cBce˻ W$2_Ek;9xx #-,AQ%r!cH CA !gg "j\`F"a [?Ѿ `>"ml 6#ܹ> rqbbK&h"g kwKZd̢,_㋌=e!S;0_-4X2{ $/0 #e rZ jYԥ¦Yfڝ{*^3OmY'.e1QST{ @&N$_Lqh  ,-!8 fG7ǁ#e/#~p=-k !dɫ.4H n *!h/ 5Q ar BRk&\0{ dߕMRg6"S "x`%aO0 !i#- <{'adwjثL){* kJkO!e-"/k Y !K%'mm0Q0&&;u!A aPc_>jɏ+Q!A e Jdkus T -'d!#fe0#8r a@j //eW+_:[v"Dka 1 CT%VZCf 712(aDVf>V,!0i bt1'.K@*B.ܳ؄7oP=$zۋyN!C&8&neA$$:Q fsDq$ʱbj |ɻ 0^dȷ_y2d)-n+\dz@(a[I3\ED1_b f@}@ 0bf yPC/!TTcY?v?cܾ -'bQe$"CDt6zr!mAA eC3)0Y ~ F bb +밌LGo=9`.@М` j(b\cÂ6CrhCS&] vY ` p0 a m'4`_[OYnN-wl-%*0ғ#X*p pʐ ܰ  a9vowNP.>V&O^_?>(F+b`kޠA!`R&pb6TOQР  bZhz$M 3nߛ{ޏ^>S~ -cbUuZAA#%C#J2Q1 @9tcr QU۬ʩ K5=Ӫk>/o^ -pn `8A`0M,$1!8."z$!([a=!7򃛺 E!Z,Nu+!éj1 0d- &g,69/Ձ.$pw6RAr&" b9K )x$>V*˳3& /d< &h"#έ$vew5Su"b4Tf6wzł ;9p +Xz|ߝbA)fRHԼ$g#"-^d[E\bq;%eVmg`lʿ[/9:!S"7<"t+kla&bF"f<$e #R-4=O\Y3tYpg\ɸ E8"3 C#̶""1#cOgXij$CEa$τ6G8CMw"9cu{u !%ΰ6#$>I̪5$qnH;HbE%ؼ*1X3H6c;8yVoe e|̼ 5$<<<<000xx(rz{z{z{z{z)000000>#\˴LqR** '!jVj!   #[Z[Z''(wED')&*Q &ȋȌȋȋ,   'aaaqaKKK00-&h6h6h'   (˸˸L1AAAxx# h~hg' #"000" .'!'! "o&9 + '"'&5'dd%B) `<"z '¨Zy )W R'OS+ r A~ "Ț ?^O~dŁW# 'D ( (~Չ}~!_@}r$@ p 0 Ub]Η $' B H !zF;Z!bY"#'.pO '%gD"?1/L"$8.'"lq''lL컣؞raNN  o u$y0"k=%?!"( % |~ 1.'˄#Gw^ $&􋖨- d '!( c'aӎ4n_ "ܻ婯ԣb#  a `&A dg]oqo\$l"(b@;qN#i N duu$'-겆,:FZ'!'!f17 O #*Q  ", N!PwjW,ۂz'#81$A _W NN~|1J "!k"" LP KZ'SVir̰ e`J)cf W"%S{Ȩj~ _{a#T NV+@"$aYw 6#}í .$L1n ez?S>ȡ"`w;R#~ #T> o`p cCāBZ "'- '#')u̲Z!4~ P#"J N0MjK-'&깁n!? cE)o/pٿd`%>t|B "'#`"'!Y*A fU,͉^?n l؉mDŽw^"b~#? ''p:K=A!o#aT &pm;l#&%}a d<'薈}ǻ>&ۣ0}tGu ![]*<* 0q`#"O)RKR"''"'#OT w^# N`Ai0$)ɂt'!Ƨ7 Oa,iw;㟝 *ٛZ)r=Ȥ-? !q '"$''Ϡ gmH-مP/@w "U!n{l"eqL.Iq|L0!r/0"c "eȹ3aY%,=ۭ`٢e #k>e!T a v@ @b6HCcH$ #ikD~a/ā c!A+.)ׯ;!Sa)!#@#Z" N DBf$ܴyb|$8Vy-p.UxH":!' N$#'"zhF;+pL%28Y(>bWc''>" K$d1D& 嚽#@R&qO+! c C5/"N"2"a0Ad4) Ճm|t! V36aO'Wu"eQ.bM "b-ӡ N iM 䩁"!'"R ~$/Ҽ^rgՔ6(X!y@ N!TW =-G&e>:u! A#''!"j| &d% {M5 "^73 aVQ_bBU"" "'!Ab&@d?(׃/ ʑW3 a4&t""cfabB$t1c$0 ߥJ N fƂ~#L gyXm " b~CU N]YcB G"!c#'!'a&W:| Yĵ?Upu|!! N"'Sl8 &d $Lٍ, ˷=h`(C3-/RecQ" 4"=$jK޸pb! bQA$Iaa""n1cD-+6"#'"!={!''fÿs"'" " "'"-L"n3`ne!!؃T'"'agٴDO,P_cB*VKZ_=HΡ'% '^ &G 45͇$?7,2*rhq|$w"0& A!  b rO>u"m= bvd|ڇӀ P#؃$`&Tzơ'$c~!2.|'!!fü$!] !  "v)"~'oc"c._tr''$pDPt̴^<P˿WodB)!U: ^!3!'"#'  ~&E aٝw1N̫L]uo1!~)="#`1Q x " cw?D` " ?#dCa@O#c%kn#XS܁ fdt;Oc;'%#á'cy NE$'! d6'!O  !S vfAğ) ݿ +nb#F؃ q'' <" R?ӼjF0AeC'ҍ|R|LL$Ns '$!'#Q &E bܙ' Gmm݅>L  "A@ Ǡ!!ɴ[D) !qpi P PL"e'3B4ԁf:4 Nw"'!0A_}`w!Q ';B` #{'s`$OQO"$q!! _N0]ʏ7 !cNӢ'!"b'١'!''!#q?fC%7!А+^<˽#0b? t'! E2   %E b㮓`ONM.j! ;'1%M5TRb1` !3s!@#Bo+ !Rp{ !f ^mYǵ e#➄eoe>'!C &'ulp9#āR!wOf%bvf {#,j^Ƒɳ %$""''''K牟k^-yfC$n9Ιpw* ,\O '!a%&g/ $Db}^Ob(#4"s * +1r=Ue" C/@m "%Xr:6$Fm\ң|gN5ĂLndׯH>Q'@"_ b[Ү PV_40? 0_jN$ "jW[$|r-x@ "$! q*!'''(0+2G\{agF!sK$1JUq ՞e$ 3b=DcɠqN/!;=RD/ b@S9"$9b62D0#1e5ágMǰ b&.ﻊN _.ݖ>P !3$n{/>6N䕼6D0efɌ nkPO.$ !x" %-""(@/''')?J]ɞfH!-Ԙ-Ӧ"LB49b-!'D Ŧ41'$t W$bBC&d׸o%Qq?Δ5%+dga(4@>b(3 1 _L3cF"!=zI˺#- W !?~o>c'( } q `OP[^<#zGq(`>"`%9%B;!!'%!% ''*,Z- #b"HؓN6+ɒv C(#w!''!u<\"za/du/[ i7ͽf0i;soywQ^ 8%4*ODr!%I94z#J2"gowb"w>_伾H[,E^4QbGͳs z1RA*_a T@v9 "x 8 "-S"6 %婚˒?؂"?؄lP N!')x'Ğ=.ؕG/ɾ,iL. kJ$KwA. m[%ļ("Ѯ8@nMD%_;R5 [LaOP ]n#FBnG $s!T*xt B=a[a )o,I# B:g ܆}w '!|BQޡ `7ZF#'"`S3dR1'cIɅ:SnJ'!P!޲#f''"'% l jhL&'U?%}$ ໔!@ٞܨ=Rh~ %RJ!Z n^.~% \ [b">71j,%x] *5CBcW%Ph% "a@X?Fm #{  i])ĺڡ!'2!!0ekxpC'OگI"9  'ILUMD8 )۰o \%!'!7#Jq"P"'''$3a׿c;Β%#N! hK 'pX~'} ]!d3 "d|=Da% etB;A`"[= _ E"C3 U &aJʑ #C67$@.k:)Y^%blW  }q= S" $hr-v;O !fK;sB d%7  !1 E v +50a) s".#'z4yM `w!! S'!''"C)ńNʠM@p'azw'#syeElbK+!'! Ae>B ^#aECad8#K Q 012n!aZ"ﺯ # Q 6 &5{!,=S.@$lۊ ?O)&  =( }c!uL&*A#DQ d 0]nK4 "K-Kڝii/'$ z!&"''r n4{lܽ?bW('!y !W!::g)@: = !'!H!f?B bY%EdtEAV <f4HXZ!p N Y j& ȺML!"24$aE/AZpq" ‹/Q͞-+!: !2ac jW{ c!% " N'`W$(pRO x#6 ,f-ܵ7J# A"p"!'!%''!  ;+9_FbkQ4n#!'#!.\"C$g& '!'#'!h B(D!op 0(}8dg<gR@i".!\ E<%]aMp#bRt # " wl* -ʡ@%eN" g^\4; n%aN%_#%/@ .="* Cʫ `'w$2$"!''̥T#Bh1﹮޶⎚ !f7 "'#*nfo {lg  ''! !'#q_!f N"'$Ai GB*L1 .5UXٳ8B)X4 C@s]'s_:^J%c5?%PLj5?2$$h?j"Z`1>pw_L_5h V  !}'-ɍ7aXb JBd5C%[4"!VL1/^'lܝp 2j"!'",m"99 FV9@"a멡 BLk5 nҤ|! P0  %3!!"'"'! L !y +؞V 8')!V.l{, *E! '''$E!CiHB*ca#m)  'O "U+9(B #P$P$Q #~U ɃTQ0s#y!5}/x" wo,[O $b#'7M-л<Ԇ\BBW"٪iDbCI!!` /'<!q" X''Aţ!o!gi:!E'''$EjG#p&d9Qiy!7 @? 0#@0 n˙<&B/o߱M "{e ̃"_ "FqpbGq2# !<\C#@ߡ Mao'"7zϑ| &F",d!"Ww'N 'W"v dlYbc'c8󄆛٪!E''#Ej C"b(Miq%gZOsR #֢` {oٱ!.)(nٓ~ $`jyH ΅0U4:DZi-.*"*:@̱|. 6 "1Fsc!!"'"'qzMTơ."&_djC322+?! T'''!'(Aj  4ہv)U, Lw!Ё0BSu[U![)(v( ~< 1O$)F  5Ќ GB4!8:e~;"'=6hx ~Cb ! 臡IkEv!]'"'F3 ]#+6E!KʺM''U'GSEecd/7*cWn ,0 AY2PTsS N~P&{q! *l %_:Hrm"$,+ ъ"d%? B+ <"'=+KL&C (JqلNa#=!X!> '! ko#J tOfc$*"C#! ُ'!'!sXE" D!% =q? #P$ZsO&o "y1h6A2߲lD6 ! " K1!gH!ޚ!00b׊#s8!?me<"'=8hep] %"? U#* a(xe #bS'\![" -b'!''')SC"o "Q dˁ"Fb]O66g&O!62ɂ&I>!9 gs1"b2P e#m} "5F%~ƌ"/i!5ȝb"Lr$/.nd܌fHBr|?`'d03"5>"5 ˞ " Gl #]$#Q $ }'"ew'B+K!g# !j`'%(!'$" 7#3A5Q۬md.l " jeV>+$"/ SLBX" % 1G5*mߓY<M^r,>`E-mב Bc"p5-"¬>/ # b#.!'!{qV5Fڿ"!bC'"|!b. _bC)0#:u9H !'''!7"u!q6%?h&MĬ'ZN BbE_EQ+ԑ9@ Ad.? Ob0]ܥ"%u"^6R$_ cu rCO/T5dB|c7d=0[?,W (]" 5]ê. BP-Oɡ" UFBko aCL'"n"Ac0?@FbC(M/8 #1r '!'vF@`C #s!26;!U/~cx x40lQJ.'[`!l@QN"fIy& " 4!fG;K䔭Gf0!R@}J1X-WA*׹G $g6sK}ݲ/  @)?'|"d3] "B1d ;E)cB&J!,ىȣ"'''!dUfq%8-Pӑ8C: ! KȜ'?/CoCC0eOUaȏ@<ۿ <&Kb8 Cas@P P d1 cA~WC@ДJ[%V ! zJ#,>l# 5ΫM-ϩd˧&s}+5"9?&'! "B!e*LLp cB%!b'#g뼼Ʉ"'''8 6DV=nA4@AV2(e@VB%gQ! }1DODO qp'%c蠄?O dJE54"DbaA &C  k䖮s+3EꊘQL7P cEG (P[.)%w1b2 B.Όik( #Ѐb"5)$ $"Ya @ B$Ag !. eVG1*""B*<B b:LMڮ/.4A9S eQ ,/ QW uk=+G2b- B*,-d[zjl"O%0.3`I~gվID !Ǒ' K#B!h#2@TC0b ad " "'"=sZo '' %ʙ\,:143b1"LnWS_ |1@/Q'<Ud$Kr=  ofU>&&b?%rݞknPkՌ2 0^  H![4! @bb!(s3McF B)%Bnqږv!/:-n#c "m$#إf'"'#C!h &6;O;p21 "Կ"u!)}c!& N#( $H<ªlބ-)" |0?jAp q 1Lo^)n7 G 0)q`A/,dN "b$=@`":t }?}.`1##ɏ- $t&B%q>J(h10nA0dn6 B%(vdmy 7&d3Ջ8! c'"؂"! "L "C!i ,57TCb #b|΁_# !s}!{,X!"m$+!M&Q﹐(q `> &d ttc1."@PRZ^ Pr07P;+fA' Bakp ߄c~'v&; %01)tEWU)&! $M#cB%(c؁"l U6.ڝk/F!c UR!pJg!'!'$Dsi %)5;mk@3/7q>r mqf !+ '"'!b$׷&" ˏD)QPo^2?B__ #a$8$?Ѕ,A.[d{R Pbo$ ()k9$0_t a\߅Z aEa` ՠ b7_," Vmd]F `0%D*"(b%9+:N$a2l ;m]6/XDF='#!a!''!oQ  (7DDmvͲy-Fd "m@ؘ !"!>''# 1  #C 8s @ -cV@ &+mLf %d 32K r"q; GObqbv/\]cDg/H[\Jс%j % uUuN;f'B(B=%ۮJ#Z!յ #!C'"f@c%!"''!h7( / Z$6 &3!!"'"'''> MWUN!*!d^C-CW[PUI|\} c'eHhCH0 8+k\/_i !Viɶ"l$'>p dO!!'!'!gJFa   -֕`"n"?!!~] +#+:@9#D- l ! 䇡I'5G1ձ c6Jd8N+o_~Cm~ !1BI>%'!oP d"!^{'(W аNQ(H7 #\M*U!!'#؄ | N"'&G/.y"f{. +<^h'!&4&)#b #n e:ق,a2&Q tfsC9+$B($(+-M"l,L%]{% }{.a3RQbTP8ݼdTPeuA鳔$'!p"a$e~i؄Qb"x#ː "pSABMl #| !ؙw!'#uX5'''& ȿu|`*sP#>d ["۞0 bs"\-I|$d1Y$V>-#$r4!q;71%?%'& 텦tkU!5 *VX b($9ę r&Z01 cj<4-nן ɖs-ȣڢ ##'!1" "`焵0q  #b&b 1@ pwQ$sa+:, 0!1'"9 !'!'$`H6H1)XbIse]"f'L"}p "^ߍ h̠ڧk$bk#/dEF7(@r?)!J)& J(Sԯ0 d"$*)o/ Ad{G" 3Pd^߅M4-L/ qt,~ s#'b#e";1@c1d#AcH~ ̠ A+Af&<.-ڦ ʧJƵK b%1N5:\c.$r2"fÆU?N$D2a"1*2&!bC? #N[Bk/ )~nG Qd~P0,ee"rz)^ pmށ>q/ێ$'!1&1q^q$xxc'#Bre(Fd}p Rv Ty.!Mci##4''!a46:%s 'CfKf"͡m5m:kr(105b2(5^%E! 1%3B co2 C7)/)(@ edD. +g*\-]&R?_#r.q 1 EbR/!Bj'#Bbk4HcjthVZq @ #( !mu b!ǘs" N!c`]{QJ($b"#M\M E")6//2/b(/"!."%f;>69%E&za#qcO! C%2bޑOg]?32$+i^7nGna-݇<;ㅮN>o8$'9*?cs*OCB"BBn %9EUUS+4/_v{$""s~ '#C%[ N" 7/n (]'mLNL5m͍(dU*$B,,*{$!0 d8+)()2sa dY+ C1g㺕p!fA*'$md汞Zo^$M#'"SD+2 P.^B#'"C!n'9%!_|4<'$8!d%^!7 "H;d/" #>LѱܴJI 'doN7EĀB*r)*w%/1+dR-$'/ zAeT<( D%0fԿ,#e C'(}1ٜ["EdנO"g }"oBG?a R=IlN$'$i  )/% ށ["ch,؃'$  !c;'!c:ن9nye%8! ! dqh 1NߟӶ˾'Ɛo Y)}2%Mr)t&F9dJ,$J?덞M](PQ!e  D60g(U$aF-V(|Ӱ,\#H "&h$'!3oR6yz/*<N AnA%'#iߠ0 "'@ڟ#>#|!c '!K#*% eu}?G! A 9DŽ,ɹ]a& @ 1'1B$8$Ƣ(l-%a eR*#a&"cz/#eD60A g $aE.3(8˱ -cB #'O>WS~jnJ< <=& dh  + eD"!( 3!  !E1'_y" *:8k!0#Srr /}! ,t%  ϰjJ23%v(/sh%c "cƽn.$Y !o #a!E3"4d $i N"_ <[/$'UB{6""Ӌ K'P# "Ah $ks |_S*q~!fZ$` #¢Z"E'!/f$͚# D!$!J EJ )=Ů ɐLį,rNa%@ @ ٰA12'QS,B)r7,U%G "?b!-"D7F,qi'߬quɝ Š+ ؤ'eMU! <$'!e6 #eHn˴ $ "IqwUAh "e& !fy'#Y{J"A('$-"v /R!" R WX .Ϲ+¬Bl' 0ZLB*.r,"SG#,M!o%kX &w$9a[c%N^LȀH.bB$k P5#o '#u6 %+~[='Nx $;:#FRgcw!'&)bBZ$%'!% !Aup ] l"Y&| Ο,'ְ  H#&?80:)aH'po!.{UBQ% N!3!o ;aǁKcm;F&ihNl=\x'cE$ ` \9gT&HJ _r >hܟ!IS$ !'}6!O}%!9$%'!! !; "x72&T$R[L}%%dnisk qQ(2Fe1=C?4av#o$$}ʪz ߝ& N%8ePNO aN'3ր"\ zncE0nAuA1'n5'e\$/$O= M0&}֊t۱Nc$d!dFW]*`a|"av$u#{i DJƀ eFb # d !pl"{ LxZDt#dy' ? o"⽽ -l !c "G=5wv)؀}s""-''#+Oݭeq))bp gC*M%.BVnb(q@!&bF ! =>r -1]g{  %O_faB'5fP<ɜod֚jq/@P$ ( .h/P"Lyo _# Hq~g8=L.~ !B=( `8eL"}3Ƞ  b!#9ا-'' q %4Pb(1c{.n =ɮ.^Tb%cc`! t!"4LVQℎ E !+<П k LD+eXh#'3fWG+奒p_40_t쓡B,ۢ_~O ;Ve6q#nPoPOJ>YCʶ',d\J,"N$qct*&b~!c''''#. y P7#m cQ##`%dVo3_b/ÏgjX=I] / )hB2=qܴB !, ;Ԛľ 22_c)yQ d5p#'2f]N4ȃ~_ud~ԣ^QN %]2$Drߟ. " luYTVY# b K.b#VV!@#p'R4T"w"<##s^ Oo蹍i '''$c "P%aE%v7?DH?Kk4JBEar@  #3$)vB(A* U EjugHlژ ]K |Q"|"A dZn" D'/geS9'fT`YoOWn]|x.ͪ%*"CrC|.\.Zj%XV454ot-p "\b5#hyJ"]  "q#:i"KR#(X7 '''!'$M>$~"B$hdwʉiJ}_OgA)261"$! ߽l 24- !d+zWT`ۑZ dqB& GUa+*hoY?*޹d? (O40Y% ~x|HqIs0mQV .8!D5Nc6fs' ;d4a."| $mܨJo%thZ !U m N%R"aI~r%@(Z*'!'-vCz(̡ dz⟃qcN!g"A:qȞ- A4E`vV%-9 .KM5 P d^* 4"b"d"q'i{bD/# ᩍoj 迾7 o&!J {Q; 5:-~ٌOUMuD EeЪm_bue$ܪƺ(5N;0 bh>Gb s&T!|?!'!lH3'%%(#'*y "((i^ ૘ 6_,'݌Q0` " .bPA]̋Ե!!ad d_/[#'"`"`I%րioP.'ôWoW]tMrKh% "ltI!) b %*Ύ?۫ Vk|H?onT#{ ֎N.R4f! g &k$,y"!Et7&$P)!%3 K)a6P#Q <5'haF۽"Jyp "PY*#^q?'#L3ޞԾ}@'bDu e~L%$'!aeD 1a#@ i{W=, Ҹzo9( u/ # X/M ]$MW0W6 1?n D?bñ~b4#y_>j-?u9)^> + &* 3@$Xi".z򂶹#"W+!1 -&$ ~)q"F'jyG%e.A<"b\". "!OA ,gGS}}uNJ"؃TXb'!a*C dJ‡^ i`C6ĔOoQ ~\X De $мn)c%'$p)" `X >b+PR"R#9s : J(!L#U.K# N! [ %aM!$n3 !"!6'iX0u/*nȯhK #. -=)q-!8h ;r 0e_[QR~"a#E'!oidH<ƨ{/A cƇ@l!^^=N %E^" I%g$$ Ya׿nܥnC挴 " >:\$Q y_O ߠ"* q j', (>#!g# N":a&e)@=`Q, !z e'h!&ڡ=hFLy  !3׳@>4!, #Op\g %47") 3'#!ה'@_.kz^GAą`A cԪroOM TRNE&K]Ԯ!I*-Fd&d͋3#[){"T`C:mr.! g R`Aa X '!=?#A"^vH$ *fHeTۆpj$gf<2*$ts#'d#Ìŗ?XE` @qP-/smَ(=`l "x'>!x!9/ 994uc# aq<:/5L^J] -hM !B*dDAPnA '?P "L"b9DžXŲ .0$'#$"'r&Q1/n̽7ï?A dѭ[?_j> ,&7.0/^^ǭRn V;%QtD8@ n+=P L $~r!c$5IM!;m N"1r 5"a2>.Aˢ ,*N(0"U3"2_ !˴2/ 'cR[S>gү|OOUfЄdś M&hɹSj;0CXN˰LN# ( !dP&bd`"27| =ѡ!Q=|";PK] {c${@7 N0!c!B%u3Jo !Uh1O.+ _o-Oh^B8GA~HoK !AMJU ".b,c.`qci['9BPx1KZ%eޝS?ESugӞA g̻Hp bwC%b"cD'& a#'ބ}P-l˾)קe~ &AbL 7#sW]xk / eC~ Na"C<$7aR.ef ?A " dx.\ *8H RB !=SRShAD/U"N!4:|Q-}|^:dɅzK/ofB a!g#aB%\A)X)Ħ{,opaA $ml s %BQc7j` 0)[pѪڳ +/x("J V  ,4$"fuO"\*j!4d׊QN“$' b;x "hbYO%F R$wYbr_MD%t+ # | !^~Ln~:7:kg#(%Y;0$&]**><̉f{u b'. / %BQe!:E2!ƛ]}׭ #]M +SwHi\N NVO*0z U%a4#b#\#U"}̼ߊ;#?h[ fZs^LeJ !"]U; 'Rbh" \EwGhִ#ah:2p$Q !?@~ɪ]/n}')uNL3lIZ~V@#*F&C1d#bXwm4"a#123Gz`Ơ NB7A/ @' ӧGE"bbC$wJ/!r#kܱ[,,o ؐyV~N"I !a_ 'h Mc@u "̾Eoͽ&. e $bcQBd 2QX.Rq9Qpݿ> ;2'bٝ .mɾ d٪r})&C$ "BM Z!cņfL%b N!kHO'B~|r)^p :L~߫ >M p >]N~x'aDaqbpx '&N/Mc}$Jx#-=i-"ef#A b︁if0 );:q L(r 2ANثK^Ӕ_ &H. ݾO(|d"?^OM)w9)@6 ѻKh{eݺ%\$C N(r*k)e|ɮР Q sn廍w ؼm %!fa'bci"iHyC$|ﹹH|қ ­"e&#A bﻁj~@ %)s+BpuE!E'pa ʅMyYCb $b/yŖg~?;zwoI '87]~qK,}-=,Ĕ,=O \!D N7x%Z@8 %! f4 #`a"+R/bn}W;:%[I¿{ !/,T`nצQf*(I䫌M y% N!dLb +b%*RO n`$/_"}Mb (.!>}A]"ؾ茎|a$I !f`?'""CI&:_˩6АC#d $b‚ gM5@s vw^(a) .! r  "#t8#+­}3,]َ.m_X"! "9#Z`4 $r= A&Z+"" S*AcS ^ _Ob "p^Ō֍cA=N o AA;!by$x$o#pl.ϲ !eڶG`R3c)T~ " v &kͣm'$D$a~ cP' $5' (r`<"W]Y>$zJ 7lb"Rq{t!r}H%Q3"0+~ozo>d5 "' # o0*Da}d JP y "Pٮ;|ӷ= !bR"L" S$ "$#ے#dƢ`^X(ub#! ݚ1# Z &! DڱLcv.%D$?I'6 " d (u"Q'x"5vCz4?2; %z`ƧI $C !f !}3/,#Y  # cA $### ^ !y/@es543U?pZgNWz{[}t $0pdM"}aB "6 fI޿J7!p\ 1Az"X $ &f*!=.&B%a""-, "  (pq$3.5NS$9 ".}.椦2H!/&C(p P">1#PedD#44Z Z l  L/ !Frƀpj<-ҋ""dcFꎁ#U^ɗ \s8 !+fyN<_[[a i?tL # #}"Mz{4,ʾ@/`ndܰ0 5  (Q T?q( G[CO1N "O׍ 쵣 f$ N`&cJ¡b#` T &# hX㩖CM$7h G "  ^/cFyy2$X.D,iLtL\"Z"/oAd.Tj"ac &\.mNQYEA" 1uܔ$ v #,K2Lxё,`o>jzO !(Ew %}#? M (iؿ "O"fɯL ^4%@! N#\f3VM^"mLnBͽ޲}% $" = !%.c "u=ꎏ@0ӽKV}FLv' =/Pe鰌wo⭡[&=ɨXI9~!Wpm|#Rpɇj",—Lc| -9+U*01< {i* g%"b$h #ڂ(4K / 8  -DeU7g^ W]ڻ^ ԝ}ܝ֩IYK!e‡4;o`"Dۻ*mZUa{Ҥ $˰*mCtSs K-' ]~#^b'GpӲ3dn|E} "-x , ۴l8̥<0~^)\阣cv$ H( N%Bbc $P* " .bH B*%  #&;2p!~譾cnٽՋޚ^ng۷v9$} -Td?<-ɄN#a!0(3@~`^;孎b'd.d/6zO 31DW%VWR6n*j5=n`(Z/\BW!r9 o* N"E! *[X+,D [ j ,7?. o l$["{?5V~nFb}ȟ Vn !pͷ RH;DA$jbI\Td"㽄#a*'r'2.1N=q]`Ec%ܡmxt t !S933j y ߃ " s0سu ӫ恤(ϷJ˅o!lE& N$/&$ U Y A)  0g V S%!1eȶ́a$ I|ƭ/]/~lC a %g $M%e ۋTAb洞n/#a,&,! q I0.<8/e^_ G++S "!h#Ji>ԙ Q [A#){f B#j#(d\#`6J޽Ʉ( bbA &"]6a < ^ .4H ^$\f}& cjVkc~PE0b~l%c "$4 D:ȫT+1gTcգ.D$a4&qPΌ "D/4!c"t_>' z! M+aB%g !t\ '+"k$ey P7#fY" k[۟b%hqh<'qd%4|!..tK[t | 7 } (Pt M'"JsI$6cEis @uq  !p>+Н]O.ތDaj !b"| ٬^M_!OTcŲ)?G $b -' > d6 cM+auOOW#,}!a?# 1R8Ņ,IP%C b #"x&&p~'c)~'b@mS"p@ C@*r0OQV\n" ϧ[x&  _B/'Wu_%D, 'm g nKʕmm$a#etLo%JTbhw$b.@+{e$&PW*e恹&='pV!G{Hٚ%''k %&&D'$MsyWG=ʳ}ݹ=dA'4&d ԙp b Is*S,2CIIeTa:zO' ζ9 & w35H=wEBu%bn8)"ƨB䕮$a-7ZT~j_(~T 0&bTb^?#b 0-aiže*Ad(&b s ʔY"f8l ס$%@.ڑM-$xJ+(s& !pɸ_M *Qm/"~ !!c  yp@02gb6C:JpUdd%KsV7yV Ϧh&jm)9" V 5Ls$1xxM@\"H%>o$a1 H2 "nkͱ5S$lafOa|oo.`"b p/ˁN%b &J`b& } q $ ! u$$ b( B%N $ckՀ)N $/Ԛ/m %Ddw.Q%ƣ=!C+"0 K]CENV")U@O6~&-y2% ">/ 0?%Ko4>1&J8.|].IlY ae*KQOڮ%c&%歏%ddI'c"E O[#&s!@cF5D&p #azYY%7INj[ "APd٩xOhEL"2O(H cu~5HJ5P3!Br 6 &د-%aB w E <2O"ηl, c+I..n/]Mc7FbDn)&5%%v~.$c f7ҫ#Aj D(G%H H dR" "  U  C/.o%Z{mKhC\&-n( WVCHAB)DcAg "B"#% Y 0S Bׅ _)aw TL|b/[B!4o^B#`WQ0QI"bheʿ#j  E'` 'ɠ" !dd qp p)ph? #kξEl{=="db,y&  ÷NEAՃZP67" {3}sΜ$Dq Y0v "ao= "Җ&|#z> ono@(g~T =Ao?"K'콰6  phż#i  H%-+KM#Ӱ eք2#D.%!@DgS`semޤ]dZq:,ͫnk~r]c!-PoT%  7K"%]S6e< @ϡ%N!, A /G&^o.0" "'!CJBM !A d쁞# , "/;N5"+( i!YHǛۍj"m & H;" Y," m %tT>OD62f8%!11c,$e#b "(^֖\@]}Ҍ@.g'&N7X#%Z! i@B #h#ku^ $ / )#A c,"`?{>v!d ̻9 'i7# lan#=@~ "9 õ 8[Žm_u¼D aE[^ϋY[qN-zp%!O"&dNɗKS6%+2'3+rkY=;8 =F[C% sb,wP&q%p8$ "0r4)E'z" e n .lֲ<}ܼ4N!d *"_o~U;e 8 Z&MإIIlrIS#;>| "Xto5f;=[޹?pžH;aG 0^rf5r!5td'`H mQ'j(p#kvG1[ W "@H&b#|Hä- R%) 4"p%@iq7 #t#2F$}ObD ,,Ё,m͡#c!p۽&be V "֡" u#kh) "a 5oq.' "juIHFE+dϦghpբG% aH_8^ZIw !cRY>79ɆB  !"ڱskwP/p)"b ±;( &A bރc^W]& -ePd\@Cp s87} "Os"".TUs"Gf t'K? O#w짾 zy1/i_?!e,:@Jc^߾ "M!&{ :?픞?C$CrNS͈l;~ Nná"a FpaH' "=GtY# d#2.w" !˿[C cnH2"jq. D0*"ڒ>ZAŠ艡#8 $ 'a7CP k&T⚲/?#~z\.r!c\"?Ae EK5 "b0``# =Nw%sNX1μ;c-~\n!D4!e!F$:X!A bOSP ".b&~.S p euQ<"BDc9I̞ f,=>ܣ_`+٥ i\# $ N"cQ""/6 #c "'"Z J&1L3#Ա-}r=$5(#A b"g; 0^8l[y#'!b4; u! I.ffEcu;[T=j9m"Ce !G%<, p!c]" W !e*gOcoD^hfZL4'  XE@ {J#c]S^N{ ='#x#q!%pf!G|f# ''! %\ "p'HCL(N2 "Dj  O<}/LZ"  #hrZ1XR"U/'^b4 " đ|WMNm%d "F% mVJx!b^&$G"b,d "dBw(~n\>=^ݔgUٸ{N:z!x N!7I z!2?!aN % _"d<D6&'!_ $+?"F ];(4$k#G"!P B b+y$0JR w_:/GOM^l D:KŮn>vm"f "Ad !'"" gJ!Cy:&yg4 Рb5$cxd%jiO=:I| ~^|i N$D!# +c J^ 2fe7(bN'! M "Ccd#y G $_"/~#d#h(/"Bw eFbL@D?2w{b/CIb`#ޣ_7bL}m㖮//{ ޭ:n!b c-AI PYW$$ 􃳚 dUi:y@'>2*B sADJo# Nc "Wچ# Nb `u>pg= I#eia'I/9 ȏ$#&$rIkdi$d&!"m7%\F $cg{> : }doBG 0KTH8Ӛӄ0~׮PzNѶk( VX u`T/q 7!.]82mE S"N>NFLܗwx N;e 1RJv N"eeUcOt_eaU؁Tg`yO!$O?l@'+q5zXCM &AFj.vWG#p-s u$r&?ٮ:( B NG!cJ($j!C. ~dAB_2$2#8V՗-0ʾ?z ŌC3 9I]1iί.A%D2/ bj$~XNuuů>~87Ň(l ޭjsG-~Z vU->#&=e!SZ4e}Y-衄w! dQ+탃'aV<9 c$/95dd# -Ҷ|%ql. ہS0%%!dee(#  {[=_<ȠX*`'m=صM73{yȀq/\3+f>X^fu2%N2]EZB`ܠɰ|v$"ʥð+$:ѡ;I"t i`ǪKg)  ex [fpMž@ eRkk _ }63)?@Q,Qw5\) O] !rk&' % ˁv!h77偟d^Aρ"1e z qR?74oo bMG~ľ+/rz̏5?+n֜Z,Ը^ @G1 ʟ1r&?"$ʲ;J#'O`{Rtɿ۹a+ηd[.}u|E  >3ֱ0z|H. V*$lw.,Tx~i? "r dv7bMNkB /|p hQ$HAL/.HQ]7 jL+{>` A  8^xcZ-.|ycw N_:)>OiQo~N3啾LzУ\PLؓ+.S*T g a/c Rp CA@jfdC3Eq 07 u9%kUI$ O!Cj 5#+VOMb%a#4bAU,4@L*u"*!ŁJam%'!wڿaZ<#I!v#510RS~踞ҪRh-ֽꓽbJ)l)#m".q;*T1'F"% pd20%bN:"S!=#Cgh< m̍N $Lm̒{%J-!9S5/s%b A$+d_9!O!wy%[!o*׍]k ?"ņ<8 D0%$1("1 =b3<"aC=mTq;@5U҂ 9S!K%'$g|[[!E}Nv|Ρ̽#!f/r$1A%5-wdG, $ D5u8$0"l x%'& Ok޿")t",[%QR#eb9f(dVt$dL !7Ba$*"'( (79uqoq 0 % _#$C$-bʁ5"Y !'/\ya"{Owd$7p"ap[m $5 x<a&5#.** .oy _ZoN%yc >Ap !:./ ""EDc'42 a4c4" e-|ZcUh.En  ^*PN$*qhe 63#TaJ5,NTlLڔ$1 ,\Ֆ|n]>} d𴄞4!/G(T( NJ B3EN  bB5W#r^lJR-]yO̳;*]H`e R_H3%#:Ղp#PN}55># i-b6Nc£Q05:cq+bXӞč"􋈘mbmH_h+A:3[\OOAO[^Z36~cmc#*ciS9"٪8l݄"g**" p =dF̠z37͛E6N[dP!b )`0d]odJ "Ag " J !; Q%Wm֮L6C?d!B.()!d^sKD]ڎ #Bf>R9 +$-](o 0 Mx}6H~_{ş*c\'{ÿ۸{:&f$Es! $on_$NN.{6} %")lVߥ(٪w$!HNF-)d}6umN"! D'I mF˻w]Mal$ !G1"V ,%f>;7\) 0"W#~! m[/˪Xɝ̘%$0a J "g'NjN73='%b!Q ld?ϥUt ('$lJB m a!h-~7 ""e3}i :5ɬv_mьI'1!!A$D  c #eҢOO=86$ea†gպZtoG"g"$Z"+\ bUyb8;\ah.#LTӦdfi/vo?1 %&"8) !f j(C8θ5 ;מ #,~LXϨfnޞI,scNΝjº !b ;T"21& # /i«{bW6no>~$7?ʦLy %kο3Jkw6"u|γ<GtN,%!$e鑢 %>  "d(hl22r9$XP "8<\˱,Ӌ]2秞mbB'(0"&{N=( # p!Ca "=on_ua2q+ G Lͬll1՗nYή\cB&c'B-I $R!Fqu?b91a>Ű$7|ƪR حM#nkN_cC'b7'ڦA E%#dot?k0bDŰP "Ћϼ2y] `~ddB'b'۪xy''!An@]Oqa/cLF S~@lYףv.>Wc!B)b E%L]=>||(v[HѿŽ*A]$l!EGl&,Ǽi#MМ;L #~` cZn=3*8T\?QW SlC!v[0 "a_er,!xI)%/HN==xi Z:! l X  cA]\c|/y# !d1"q1BBHq0T?haUq %%fq"!!-MϽL߬ӿo "H dq=ʹ14@ids22g ao .z!g偔cI#7, `"m#Up1Sx! `dd"ɦfWa\ b_e灧d^M%e;q $$? pPfhjÄXOx nY8^  d@e5Ŀ enb2l滍#b '_T/h.E*DžJOl>7P 0;@ Ed[LfzuC-"<{ eq=?g՘+ y_kr=! ` c}PW m/a$q 1xOngnyQ>h<|-d  i]qih-,ѐp pHa 0#mZ"e b8tޙh@.ZBK- ɁwNڞmo-0.c^M}  h ǽh}7 2 ecE+apb>\@ i 17؋>޽MܬMGjJ>=]خ) g6!`f[7@ hdnfP:&ȑ 0Q$9S g#ޓ ? r=ޛ~@}ݹ^d́fI ݿK2 ew! D iol\H;- @cQ'.dߑ 0 o5 ]niC@A cha2( dRId= p ji}CV;$ "b4! cBRPr N|=ץl _`O]a0 1_P)!qgz4+3RFc&UBQ` N|?.~@ n.륍x=e~o1 ` .&<|jNlޙ,ec a7NTNq!dd%!G.PSB>-ؿ^>7" ն -hɏw CQ$1>0"a';Lux "9߳;1j N." %]\SɞĀji3"̗A).%T,Bva0Sqt,a%i %.hNh"|<^+%ϩ̵!'fHᙛ^"oa &a1HRyA"ۑd0qn& W %a A(`Q]U X^҇-+%dt y>" U&G#%ް P^& O$a"N>}/ޤ<rpoo## nvOOs$+?AW 0@> 'R$yy`x;ۄ>N?F^ޢM|"&Q 9;&$6_fT<6-#7q @(o~}"&"-#'{F!` ~L>^h\-Zn"cqX1&DHb5Sx/#3&@p@ک\"q p} %$mg~vb[>/(ľԚ^"b%'9XTBFPTJ1& Zj"B) a7YUp0 sŮ@ =)] 'd@ 5*65>dXxE S "6#r"a!%/> d /A ` m"}_@]醨 C=" (*6C@4Mdq+11$6tt(j@'] !EB Y!ߡ#S?B%@3."arn+\  V.N2qcD3$D,1b!:Q #-ؠ2G0"3?]i.Ҿ P"p/"CaDr"q1$"/1; aMgI# *>]8 [\fp =.A$D=ɡ{0NGOʳEaI[gd6! *v^ "*dw{a@*"AdI`d/  -˳`%O#$DRaC%gqU0;( Qj& / "N%E 'Ef& -+/%I2G%}Qaɂ bTA#j,eV1-6Gu6z&xh ,z"'S!T%T$A bLs "i+ W9D# 'l~1Z-"`J p 7% 3"aSb톎ekY(  @P yd8w & t!\"fr $ !XkVt "\b0 ՞'ll@* *D7Lt ` 0?  %r "R*.%9!$'$ }bhV"t'!kH {KNHSf`aig^͂ h #w -0FD6A( ]cϽIɉI", >!b'ed8{N1-'#o(58;NA<<35/"5K>tġ$n.GoLڭ#e C '%ʰ޻/>j>^+.* pL7%j*#=D,,(ljzo D "br"@s%?.X&C ! Hܧ e|9!'6 u t#./ lU8&ϲ !$"ay ":cu "~aA" Aھ! Ŝ̺x"'! #*m-#i%$ }YU"I!d5Y8,+<!\ ߆s _!b=/浽!Q! D'0 d | #"f%"+!#AM_8 &ȾC|v{2W*'") e`Jin~\M+("' #|h F ǝ=5<0C4_^l|,Ƒǡ&iޣ) "ۂR~]+`t L!P "O"'#-P: D_u Jms>1B`{]ݿն؎&u j1d0MN׵ F &8a"O%8uO%N" A5,! %~ 7/(^P $  !b. G ϡD! h /:F "q"B b q+e~-=$a u :!e>Ce#C~ #!?x936R:#bpnH ?$ * = !c҃'bJ+!) GEd!z2eaD3& > O +4oȗg "PLծ b',!(@*l="y%%e 0p$B$p1 bt< #>kt!3k%nr`_ծe !Ǘ& -!6 y"Z!&*G$*b%c"{"([,L[`uK 3z:2?ȃ$_ *3'.JÐ ek#J(y.l 3bD+#v $b8#_%M+&0 gl.ȃ$$0tzJ2_ʜų|ڌ)cDKGP4{"fe"!")JP1 Q> 4} 1>\"9lz<҄]ˀ $Do$fh}N=*$ 2gQ2Q7 !2рb ϼ֊K|؀0 Y: {$#y9< &b4vq fnTJESw & !]Kb#5Hcazmxb0Z J{?2ȋ|g}(ʯܼƸuOPj>9WfZE6,3] "ttj = _Zz͞c )F?p8kZs4]nRK_,ЪM⓮d,aՂkmxgC0-5, ;!Lτ ʳkm:]a8JJgdalautotest-3.0.4/gdrivers/data/trmm.nc0000644003401500001440000002137413614004466017702 0ustar rouaultusersCDF  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.0.4/gdrivers/data/mc02_truncated.img0000644003401500001440000001700013614004466021700 0ustar rouaultusersPDS_VERSION_ID = PDS3 /* FILE FORMAT AND LENGTH */ RECORD_TYPE = FIXED_LENGTH RECORD_BYTES = 3840 FILE_RECORDS = 2 LABEL_RECORDS = 1 INTERCHANGE_FORMAT = BINARY /* POINTERS TO START RECORDS OF OBJECTS IN FILE */ ^IMAGE = 2 /* IMAGE DESCRIPTION */ DATA_SET_ID = "MGS-M-MOC-4-WAMOS-V1.0" PRODUCT_ID = "MC02" PRODUCER_INSTITUTION_NAME = "MALIN SPACE SCIENCE SYSTEMS" PRODUCT_TYPE = "MOSAIC" MISSION_NAME = "MARS GLOBAL SURVEYOR" SPACECRAFT_NAME = "MARS GLOBAL SURVEYOR" INSTRUMENT_NAME = "MARS ORBITER CAMERA" INSTRUMENT_ID = "MOC-WA" TARGET_NAME = "MARS" FILTER_NAME = "RED" CENTER_FILTER_WAVELENGTH = 600.0000 BANDWIDTH = 50.0000 START_TIME = "N/A" STOP_TIME = "N/A" SPACECRAFT_CLOCK_START_COUNT = "N/A" SPACECRAFT_CLOCK_STOP_COUNT = "N/A" PRODUCT_CREATION_TIME = 2001-11-28T00:00:00 NOTE = "GEODESY CAMPAIGN MOSAIC" /* DESCRIPTION OF OBJECTS CONTAINED IN FILE */ OBJECT = IMAGE BANDS = 1 BAND_STORAGE_TYPE = BAND_SEQUENTIAL BAND_NAME = "N/A" LINES = 1 LINE_SAMPLES = 3840 SAMPLE_TYPE = UNSIGNED_INTEGER SAMPLE_BITS = 8 SAMPLE_BIT_MASK = 2#11111111# MINIMUM = 12 MAXIMUM = 160 CHECKSUM = 912269773 END_OBJECT = IMAGE OBJECT = IMAGE_MAP_PROJECTION ^DATA_SET_MAP_PROJECTION = "DSMAP.CAT" COORDINATE_SYSTEM_TYPE = "BODY-FIXED ROTATING" COORDINATE_SYSTEM_NAME = "PLANETOGRAPHIC" MAP_PROJECTION_TYPE = SIMPLE_CYLINDRICAL MAP_RESOLUTION = 64.0000000 MAP_SCALE = 0.9261153 MAXIMUM_LATITUDE = 65.0000000 MINIMUM_LATITUDE = 30.0000000 EASTERNMOST_LONGITUDE = 120.0000000 WESTERNMOST_LONGITUDE = 180.0000000 LINE_PROJECTION_OFFSET = 4160.0000000 SAMPLE_PROJECTION_OFFSET = 11520.0000000 A_AXIS_RADIUS = 3396.0000000 B_AXIS_RADIUS = 3396.0000000 C_AXIS_RADIUS = 3376.8000000 FIRST_STANDARD_PARALLEL = "N/A" SECOND_STANDARD_PARALLEL = "N/A" POSITIVE_LONGITUDE_DIRECTION = WEST CENTER_LATITUDE = 0.0 CENTER_LONGITUDE = 0.0 REFERENCE_LATITUDE = "N/A" REFERENCE_LONGITUDE = "N/A" LINE_FIRST_PIXEL = 1 SAMPLE_FIRST_PIXEL = 1 LINE_LAST_PIXEL = 1 SAMPLE_LAST_PIXEL = 3840 MAP_PROJECTION_ROTATION = 0.0000000 END_OBJECT = IMAGE_MAP_PROJECTION END igffffeggfgfdfffegghggggghfffefggggffgffggefefgfggghhhggfffhhghffefefffgggggggghhhhiiiihhihhiiiiiihhhhighggghhhhhghhihhihhhhhhhhhhgfgbbaabbaa````_`aaaabaaaaabb``aa`_`_____^]]]][\\]\\[ZZYWXYWWYWXXZZZZ[ZYXWVVUVVVVVUUVVVVVVVWYYYYXXXZ[[\\\\]]^^^^^^^^__``````__^^^^^^^^]^^^^]^]^__a`a_`^^^]]]]Z\]\\^_bcbbbbbaaababba`__`````_a`aa`a``a```_________``bbbbabab`a`bbbbbcccccbcbabbaabaa`_aabbabbbbbbabbcbccbdeededddddcccdeegefgfgedeeddeddddcbccca`aa`abbbcccccbbbb`bccccdceedeeccccccbcccbbbddddddbaa`bbbdbcdbeeddddfddddddddcdccccbaabaaba`a`aabbb`aa`a````a`````_aabbabbcbababbbbbbbabaabbcbbcbbbeeeeedcbb```aacdccccccccccccddcfddcdcbbbcba__a````a`aa`a`a```aaabaaaaa`````````_`````^][[\^\^^^^^^\ZXYXZXWXYYXZYZZ[[YXYZZ[[\[\\]\]]^^^]]^^_aa``^^`a````_^]^`acbaababaa`aaaa```a`accba```````____^__\_^_______^_`_`__^^^^______`__^^]\]]\]__`aa`a_`_a```^^^^_aabbbbccdeec``acedeffffeeeedcb_^]\\]]^_^__^^_^_a`a_^_^\]]]_^][ZXYZ\\Z[]^^_^_^^^^\\\]]]\[ZZYYYWXYZZZ[]^^^_]]]\]^^^^]\ZZZ\]^^^]YXX[\Z\]]]]^_^_```a`````aaaa``bbaaaaaabccca```a``_```_`____`_^__\^abcccccccbccedddggffgggghffghfhhhfhfghfgggghggffghhiiigefecbdeefeddeeeddeeffgghffefeeddeffggfedccccbcccdcdcccccccbbababbccbcbbbbabcccccddbcccabbcefddca_bbbabbcba__^_aa_`_aaabaabbabbbbccccccbbba__aabbaa_^_`___`_^[[^^^__`_____^]\\^__^^^^]]]^^^\]_```b```aba``a`____aaaa`^\\\[\\_`baccefgffdccbbbbbabbccb`aa__```_```__^^_``bbccbbcbbbb_``abccdddeddccdccccdeeefggfddcdccddffffffffea_^`__``a`__aa``````aaaababaaaaaa`^^a````_^^^]]_^_^``^^`^_^^^_^`_``^^`_^^^]_^^````abcbbaa`a^^^^_^_^^_____aa`__`^^^_^__``bbcccaa```__`_``^^``aaaabbaaa````aaabdcccbbbbaba`aa```__````_```bbb`aa`aaa``_````aababbbbbabaaababbaabbbbbbcccccccdcedccccbbcbcccccbcccdddccdccededdcb`cbbccccccacccbca`bbbbbbabb`a`bbbbbbbbbbccbbbbbbaa`abbbbbbbabaaaaa_`^```_`aabbcccbbaaaa`abbbaa``aaa```__a```````__^]]^^^_```aabbccbacdddefeefgfihiiikkiiifgggefeeeggggggghhhiiikiklllhc\ZY[[[XXVUTRSTUUUUWZ[[\^^`_abcdefhhhhiihijijihhhfggghjjjkkkmooponnmoommmmnmmommmnnnmonnoqqpnookkkmnmmonopoonmmmmnnoonnnnnnnnmlljiiiiiiikjkkkklklmmmlmmlllmlnnnmmnnooopqooppokijkkkllkkklkkklkkmmmmlmmnmmmmnmmllllllmmmnmnnonmlkmnnoonpppppppoonnnllkllkkjijjkllllllllkkjlllkkiikikkjklnmljjkjmmkljjjjjjjjkmmnnmnooonljiijjkkklllkllllmmllllmmmllllllmmmmlllkjihiiikjiiihihjijjkllllljjjkjjjjjkmkklmkmmlllllllklmmmnoononmmmmoopooomlmmmmmnmmnllmlmmllllklmmmllkkklklmnonmnmmmmljjjknmlmmlmnopqrrrrrqqpoopoprsstsrrrpopooppqrrsrooooonnonnnnnnonnoonnmmnmlnmllmnnnnnllmnonnlllllmmnlllllmlllklmmooonmmjghjllmjjjijiiiijjkklmnoqrstrqqmmmllmmnqrqomlmmnnmkkkkkjklkkkjjjjjjjkljjjjjjikiijikkkllklllllllkklmljjijjlkmmmllmmmmlmlkkklkjjjkkkkllmlllkjkmmlmmmmnnnmnmmmnmmllllmmmnopoppspoonmlklklkllmmlklkmmmnnnnnmnnnnlnnnnnppqpqqpppomooooonnnnoonooonppqponopooopopoooooppooonnllnlklkkjkkjkjkklmlmlkkklkkmmnnnlloopppoppoqpqppssssqpoooppppporpqrrrrqononnnnonnnnonlonnnnnnnooopoopnnnnnmnnnmnonnnnnnmnnnmmnmmmmmmnnmnnnnnnnnnnnnnnnomnnnknlnnmnnnonnononooqpqqsssrnlkknoononlllnmonnmnmnnlkiijjjjlllmlmnnnononmmllkklmmmmmmmnmmmlmmllljiklmmmmmmlmmmkkkmlmmmlmmlmmmmmmmmmnmklllkkllllmnmooopprrqpnmkkkjkkkkkllllllmlllmllllmlmllnmmmmmnnononmllllmmmnmmmkmklmllkmkllklllkkklkkllllklllllllllllklllkkjkkkllljkklkjjkjlkjjkjjkkklkkkkjklklllnlllkkkkjkkkkkiklkkkjjkijjjjjkkjjklkkljkjjkkkkmllkkklklkkkkkkkkkkkkkkkkkkjjklklllmppqqqqqppprrqqppnooomoommmmlllklkkkkjjjhfeffigfgijkhhghhhhhhijjijkkkkklllmklmlllopnononmllmmmnnpoonnmmmlmllllmmmmmlllkkjjijjjllnnmmmlmmonnnnooopponnmmllmnoopnmmmllkjjijklllklmmmmnmmllmmmmjihiiijjkijiihhghgfffhhijjjjjkkjjjkklkklkkjjijijiijjjjkjjkkjllmmllllmmmnnnonppnponoonopmmnmmomooooopppoonmnoooppooopoqqponoopnnoonnmnoonnnmmnmmmmlllllikkkklkkiilklkkjiikkjklmmlkjjjjkkllkllmnnmnnmmmmmmmllmlljlmlmmmmmnmnnnnnnnomnnlmkmlmkkkjkkkkjihggggiijijkkjjjjjjijjjjkmmlmmnmmlkkklknnmnkkijkkljjjkkklmmooonnoommmlifdbceghhhjkmmllmmmmnnnmllllllmnnnonnonooonmmnmlmnmnmmnpopppoppppnnnonqqqqqpmlmlmmnnmlmmmmmnnnnnmmmmllmlmnmllmnnnopqrtsrgdalautotest-3.0.4/gdrivers/data/gtsmall_10_uint16.jp20000644003401500001440000005342313614004466022167 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrd colr%asoclbl gml.data asoclbl gml.root-instancexml withheld 0 0 499 99 x y 39.9958333333333 -99.9958333333333 0 0.00833333333333 -0.00833333333333 0 gmljp2://codestream/0 Record Interleaved |uuidK=KCզII* a  4 #  mtr@@TXAWGS 84| ? ?YD@jp2cOQ)dd R IYiy\#"궼LLdEҗҗadKakadu-v6.0dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -55.2, 8.5e+02 -56.0, 1.0e+03 -56.9, 1.3e+03 -57.7, 1.7e+03 -58.2, 2.2e+03 -58.9, 2.9e+03 -59.8, 3.9e+03 -60.2, 5.3e+03 -60.7, 7.4e+03 -61.8, 1.0e+04 -62.3, 1.4e+04 -67.2, 2.0e+04 LX`@   U 5(:3SNNUGo8n{CR8Cs%K@etSo _z6``%B ӯ"F &J@ Eɇ^􍜴nt{]f&i<<6p_ˇÀdմ oK{]rJKOCtDwug2)-9d!g.n|]Hq<'w׀PN̦hkܡ-ݶNz3՗L51~/ hK7V.>w{sA#mԂm|Y_C"=Tم?Fĺc *oFkK D [2c"HlJpZ? rf: pnoxl4wI x 9.в'BLVϦˉH]0T˾1 {l1J-- wlՌYT3K/JAv- *X=V *ڿGLI-R)gR#=FC[uzԿʩ%}XqF?=CWm&w}j*1Q3 Pq vVuj1+poS봙 K:84Lp6(hDDZq8NpfNtP11 ^)G$Wa!oa =Dpb lnrO\V<2 E?H-nƀ ~ z&{{VJw8^VE_+4{+JeP/^)@%VQ(ByO(w^2)|wh4AFTZ(簃 p\sV]ѮKr>:$FT:r)>oj)—/zGoC:-5nr{&^媭dWSN*EA&H@#1({ok13!'w岲7mY\,vMa!+z݇bZjF z0#a oЎh&)L[|ʁP#3RN@EOϸ;-M[$.z.|M>eOAvpl|/kd&;2ld3:#xDf@+H%xKEq T۝|!@J4q|h+KQ19:-VIy[R`\3{|hLJcI(]>s+(4x A8ڂE&PNⅵ&6q|f~JZ*?vѝ)[pg+VLVJU(7{zλך^kҧxDVЎԺ׸n&м<x6a3Hl+|[=bWFkz[l,3@n-% Ew'2*Bȁ^x hwLdvT?U/AzQQHSnA)c|P*/]y~;MGiyѻl)?A4 tkgwlyJ-#tZKz[X䙽w I)(1 7S;Ov724{/>R͸NPۆ+3 )UzlkgiBfu.V"ѱ}}ǰ`DmU(XkMZ܁_km#dױ Gӽ=buC@;-#gB  {HwRpmv::&t&M8@L4{fJb҆_f{~.])_ht4)4y%ʜ i aSW== 7%wnagc΀XF`/MȎoC|}1#"x^V4C bkvez]T/tllNEP+r@WY`PXԕor Q$`^Pp~ jJOJ<.m2gSCXķXe Tȣ$i4z7ca%B&QhaU L:r @ʶ9|l ̔1'Yƒ;1_W.cCM3TCp1.,^pD'8^G_d k$Ŋ@e8##2)EiW QofҘ(":o)/P!.I*v$(i)ոA"ULe)/_[)%pW0sM){5șO!矴d2Ы%t0c}- R|Ԇ~@,D E*b*]||t! ͖T*#=.s# Z(^?D YgJ.a4Ȅ]^}d?Ck4w+ks$۰$: ]S$ \EXib?!(FL8TtACtaB 8Vj_yrDfƴݝš֩SxYh(˟gTbNs9l LѹVѰEƽID}xUsۤecwX\|%f(/MA:Q[E}hnϧPuХte&2:{$rϴla*Fu4 Eta<%*>oK>Ҧ;'ԸC%FߠBAm:x#iKᵗ0&,d)IE_>"'-Lg^ZrlǨCe no4%յYmSgx8ůB1t/B1WCGٜ-qC,3²'7!.[ Cz5~76,Jr\ zDD0GfpM,oy@ qCO*jT®l#j0n|9}c0!5*#J0p:O9dmW M1ضZ]e}յ>*S_Χ29ptJJ LBPvz#6ŠlPIj(LЇ fVt tΰ9RE˱cb%RiJ:rZՋVCK:gI㴬+r[:Cp0ᆏ$W\ɵwE^~UE-勞5Liו6FA8qޔ\]<->{!ZVݾ WPqelWco>=Kl{Ԭs؏Nyо`MQxդRaj<5͍v(Jt,|޽rmEI^ ]A{Cg h0X-`3t8 ) S4xD5tQ7%T&2y姈kV`c.da+MC$EQ,~ZX2|f/X!v@gH_QƷh-BtXnMVw:٧wl9<Ҿ5 ^|h"C7l:ٰby tB#;ji%hϦ{eLc%o|?r.k+9+mP] y~xD1?,>Z ¯\ZҐٛK7Р%#M11f{Gӧ_՝`M#2ܢ$Ф:5j( 0Hڅ`Q_2)Y"lPWzS]:?d)T6x9$deUicnar 2~8æc$*\G66 @9/*;/[+,3iy82u7A8Z"_lƥĔi 'Nuz-!6cdN!9B Ͷ,&x#CoSR:忲;s^Nd31J| pfc̐1ՒrMO^(#ڞ4>d)jtiD{ F.s%-ԬjmDZeAYd=;O/I;r{oR K1zi>@~|< ޝj/*c6[j [5#~mѣcdLKQm>͘Y*o2Kecp'd7 BlJ0~J]-D zpoff_ Cj?#^URbQr,W[礥ochjHexiz1>=~?.=v=_>[u3y ϫdF59Z!Jυ'S /{{5]I{9}t>uu T(̮mK!|S(_MJ@ ꘔ}iظ.8\=u! ]VVY{d϶=+>QsQekrY')f[3/XY}z A3xX\t̵֔0\$sm5U^0Dy2)ĊZ*XX>hP JLybVf.LH=9T m[ucmUnՏB;n_ YW3U1w 2L{T[?,А76$:y`?P`Z$ y^ti앾xjF,1/duҒl%uWr}#m"%=+DLIL2Ė ͊c25N ɻYSJ`7P.'X'%P{T)bAEl5othJy!&\)f׺1U9Q퓹 YǪ) emUl/pT 0"+L?S2+ξ( `Xh}Ts֓҃C$֜;Z'i?Ir`J6^"YL!}7mX);|NΏIA+ 4~m+R%g {5OW+pэ&P-h܇_L NpӖ_Wts2@],!dY:!#3È:w۠;nfϧY aoqQ >җE#1qY]ozHTT^n9i =g.M"SuHsH9;*fwJ V ޛh6] 0DūAZDt|%ܸ4ʰL*ZAqU  n=ڧNe}#E:gF-yqkl.w&q^#007\Rh2,Xɷ/eH!S¬Yѥ&B"nEpu(sb=W"vGZ#컏!~V2BjclaSpx;,pZ.t5_q`Tqf 7 DEs>1 qDtj3ƪc9\pt OyUIfÆs'"-Vo.FU_ ϖհ{cCFDz3vj bRcpPC.8LuL}"2ah`@$9웑6y7q>-2GM<ߴO$~EEKd, h]u%g!9?⮸(<y NF@.M?%RXΕ;nj*@͔PX`yWҋt Ғ3G\3NdyYaC$ZLIQT~BܛE45xz~z[l*֢o.zEc^ Aed% ڞ(|T3E~z6M!> Iڃ՜5:E |,]do1J'vK$ 'cCg<,'=E_Jq]' z5Eΰ?9/h:L^0!j31-_p*tV򽭟oKK񍿉H_dM :4Sbiy8 w,mF(%|Ť 2ҀxR>0y<6K`O |*˘TvNG=u!}J)ҏ O @:nJ M2KaWjm@zCζLJ&sP#0 TVuմ <@[Lj3 .dzyA KSt6=+XM[ʛBO>[PX9Br"5bv 7\> /6^z%Ovo% 8$_8"@bPU&r JgP1OeT}qU%Z`[|v&8^3C&}6^H@r2U]K'qax]?Qd^R&:p<06x/q#w>g0Sy0t`((g\ѳO(e>"2ڡ'oiHG`4I\y?![♹x.]ѣm%롹}BVFxvPtTvX^:漛Ą@i8)BBꌺ'+icpiÆ5ܨk4G;4!R9ykGdOC˰@)Zɮm52Ȫ֣lt|UjdNZ] bٺHMRϐAK-@ֺrоN)"PTpj)C!?n/%hޠe.h7Y_ Y;KhD:{>/B"E?Zنp "xRL=a vpCl T?DQFHQ\L}G%-^a&{OUe /M\^73E^K' (rcj܉VeuS,{B\ ؂QRseP\|H9 Y6O27.òZ ȯSp[ Lٳ턈ݜfg"C%ACC͵i32 cInZ-zxGuc` 6TNk@YڴyKE'jWI:51kqn9Upq/PpFN-&&{d}$imDa-Z8"L$A/od{b)1q$ Z$.ΚWȪQ7"ٝkX".Ѩ5Q=Sȩ*KQai7Yg̗C^s sw׍Eݴ7:7sS5?wyݸHⒾ >s s!ߊçXuSآΈðxU=h;Ôy5X LS@VEx'/t_7k~)2QWSUcoZ 7s:(l]%E2+,Jjn ԖWni=tn`ثD"Xs)eʔ&hu72i؋AR @A|# _H,#m;Z^y<Krme ?g5<FP#],+<5w,T\fh$o4Wh;xؾpWI,jdicS 2+yJ쁘uN8Kw)*î\^<jdaWr>l@uF( odX R)ɽ(?=Ip>*i?.H%\e1//~k< V8h+̓ұǢ-o0\yc4ƶjy-8)BmTj_h|>G)?%)%o?|Xxkd΂R4c?斖\!ol3ci2 T+:jC#bıX r68\`yr<,x/&8""-nYĊ[n`tDY$k :+mɴBVr_*SLjߣ[K*ȼEa穗&Q=8AX`N [r zW ;9})x̪eTȌ q|q# XiE0f",| $Vh0YGl!2pB}j|Ÿ́?=]/u$\h3JTH5Ω{w [ `]Y+^c^ _nHF*C28} #*wWZn: !uk=4LCȌt: D;(,`Gs層V;G̃C+o7LhlzEֱ".U`ڵ>*AhVS^Y`jggH1SQ-B_ ̭4vdF#A kݏ&=mmS/k H]Z +|-.bZٟ[PX/;,gPz]5{ `@[qy*S%Ƣv©P݄hH@=Aۄ6DaxE"UVصvHf遫xN8B{C&ؗ[or:4n%|Nlk#@cꝋX@^ϽT'IEsaPWM9T@`mn`'4 "ک_ 6ad %5:mv{Sk1ǐ>R=y_F#WF>=>a%> "Cqanz  F=gqڣ Fx94-ai?{K`nF~2GEnQIt!|ԠeP:ռ'!8T]oVqs;C6CxGdUirs5glZ腽9:H >opeη50?S$/` d@K,-M l Dlͮm&QoV3* 3f_vi?B^0z$HcX++G 8ւfjRM/s,Tv%`iTF/ɚcךg?UxIJZ1eP6T 9zWdsoPa/ 1y`TV-34LZ+Gy5⅛ʢ\gn$bx uHg^H䃫R+DGJOx6,9sI@J"Tnؕ#jj3s#+7]uah5˿=rL0(ZA'h үt诗/w 08.t;YC\LHB=gFŏ8|ޣ/\]yv:T('kTJ>&ۨx"_Бf}u}[E'5#MϽ_i<&f^kΦv]\)Dt- ۆnIUNet=.ֹ);Pȗzsu.v+ c ߨ}E֍s'۠T 'J\orQej'boa}fl%gWs"@#f-%'gxe/~==֋cSBY.8by=mJKN`ߥ&|V ղ]aejYlUY)ڮ9ejfPu  ȃALO\CIIAkO uo).=%iPx|8dhy2/r*No__3;?Ζ^bT<1Ra>^lErVZҝc$k~]ꕛBE까D ٽ?e%a 8~R }jYGԷ) :jM ^ KزlJb0u31ZR2oTqފ6G]‚/5FPeދ ]z:C&YPmpB^vƝ; [)T)7XO,sL9_ru<.% ëެ]TcZow A2W)=& |sbQȩ^”ݝÌo6I$hML>~4kYݵTsٻe_7*+M1YNa B Dls>7Ō'Tʛcq:~a'kLXׂKMGX64;1cG}+Zǭ$Lo2|'XE+J쾵Ϻ'}2;g X]ؔ1I "6|trkӣ bX6N="MK,+у`[}G 8Oւzڋ$Mޤ<^Op''[,c wЙa{g~ j2T!fq Wi[5myXzGQ3l #G=ܖ#y7/w XM /lIsNY t#Z!^F3C.x)~ ͷI5Z_͇Z0.I\ ֯LL0~ 3M #)YJ! 2uG*ކ,!y!H jqWfSiRb΅$Lv[ȂwEKAgXv8=I' փcgR'xgWkEquD,j k_~2) vs j4Fܰd 28:u G]$mR4 eΟN\x>//%ip+njʫR`L@$왱t\TxU?̞+C9/@v,^JjgtI1ݚcd,m0s_o&c~7}w9 4QSpRg@yL<Є(|A,z_6엀P8D7L_ c/KfakhpO<1Wғrc!֍{uL̔htK+:sv'v0a=s5n ~ ɹt[)i,Ww'Ya$w"x\w>MK w/ˠΰmÌ0/o8 ne]PQJSoh6l1d~:;!+:mo&&-S+vNFH2a7j' T6A!ƙe"4[V2Yq=&iGIy'4Ǭפ;NKɄZdJluMe۷`0ǡl#L <Dc&ޤѓz)uב"VbPd @¹NPw\ﰼ\ٷ`\Ju܀}zn>2R)H9a&bG a6a@N<fq77{t(`,Yȁ^3Y xT[hїS6\H%cwcxvW=J?`<2ww[҈} $ށ br &(8z|V!L| k "%SUz̏ Xbd)PP1TȆ Ag$ƕEZN^MQzݴ8^lu/pBv/ !ppHN{@͈ĭ12u1 FXnj$SBh{>WDd+Wc#W0m/_T^ۘ̔UG}/&3[deCZ8F2̈́QՀE-LE (TluN⛝R?k]YM[D8QeE *젮n w Kr&lށ`V넖}WUQʮ`X slpg@C [A?۬xNTyF3S6o [" E@fɪoz;i@H0ruMvK#ASaRPLmPo,b:c ZUi"\ǪoHg9r]I\S[n[*BG{d'/1|`nc.QE_ wbW1GanC1vzŶ,2 -o{]ܴf `-S-btn'ߥjt;EY,zŊn21]Y/63M lo| |hs00f>3`"/h;tun=<%5Y se.i$hg7 CP~* Y>"J(B6lJKj]H!<~HYgdalautotest-3.0.4/gdrivers/data/test_ogc_bp.pdf0000644003401500001440000000252713614004466021363 0ustar rouaultusers%PDF-1.6 % 7 0 obj << /CTM [ (0.05) 0 0 (0.05) 2 48 ] /Description (WGS 84) /Neatline [ 0 20 0 0 20 0 20 20 ] /Projection << /Datum (WGE) /ProjectionType (GEOGRAPHIC) /Type /Projection >> /Type /LGIDict /Version (2.1) >> endobj 3 0 obj << /Annots 6 0 R /Contents 4 0 R /LGIDict 7 0 R /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 5 0 R /Type /Page /UserUnit 1 >> endobj 8 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 9 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 9 0 obj 228 endobj 4 0 obj << /Length 10 0 R >> stream q 20 0 0 20 0 0 cm /Image8 Do Q endstream endobj 10 0 obj 32 endobj 5 0 obj << /XObject << /Image8 8 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 11 0000000000 65535 f 0000000973 00000 n 0000001032 00000 n 0000000232 00000 n 0000000797 00000 n 0000000904 00000 n 0000000954 00000 n 0000000015 00000 n 0000000377 00000 n 0000000775 00000 n 0000000882 00000 n trailer << /Root 2 0 R /Size 11 >> startxref 1081 %%EOF gdalautotest-3.0.4/gdrivers/data/spill.rde0000644003401500001440000001010613614004466020207 0ustar rouaultusersERDAS_IMG_EXTERNAL_RASTER@@ks{ssŔc{{{scc{{{{s{ccgdalautotest-3.0.4/gdrivers/data/geos_rad.nc0000644003401500001440000000251013614004466020475 0ustar rouaultusersCDF 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.0.4/gdrivers/data/spill.ige0000644003401500001440000001010613614004466020201 0ustar rouaultusersERDAS_IMG_EXTERNAL_RASTER @@k{ssk{ssks{sks{{s{s{sss{s{kŭc{s{s{{ks{ss{s{ccs{kk{c{kc{{{k{{ssZc{{k{ckk{ccsckZkskZc{gdalautotest-3.0.4/gdrivers/data/hydroc1.gtx0000644003401500001440000000170413614004466020471 0ustar rouaultusers@E @qL?? ?cf±±±±±±±±±±±±±±±±±±±±±±±±±A4łʼIʻ16e껠.±±±±±±±±j pe">'Kmr%1{\8F±±±±±±±±)''0|VM{T󻂾e`B9w,(±±±±±±±±±±ﳺ+R/'ŬP'ŬqIR±±±±±±±±±±QG:SeV.~G9:'Ŭ:\3r±±±±±±±±±±:G::sX'Ŭ-dhQ:;:;:g:jU±±±±±±±±±±±:&:I9f͹G:9o:d±±±±±±±±±±±±±±±;:X:B::b;sX±±±±±±±±±±±±±±±;T;>;,\;%[;49X;O±±±±±±±±±±±±±±±±±±±±±±±±±±±±gdalautotest-3.0.4/gdrivers/data/rgbsmall_index.kap0000644003401500001440000001210413614004466022057 0ustar rouaultusers!Copyright unknown VER/2.0 BSB/NA=UNKNOWN,NU=999502,RA=50,50,DU=254 KNP/SC=25000,GD=WGS84,PR=Mercator PP=31.500000,PI=0.033333,SP=,SK=0.000000,TA=90.000000 UN=Metres,SD=HHWLT,DX=2.500000,DY=2.500000 RGB/1,112,120,56 RGB/2,56,72,32 RGB/3,44,64,8 RGB/4,0,16,0 RGB/5,104,168,40 RGB/6,88,112,16 RGB/7,124,176,48 RGB/8,104,136,56 RGB/9,80,136,16 RGB/10,40,80,0 RGB/11,132,152,72 RGB/12,80,84,32 RGB/13,80,100,40 RGB/14,88,136,56 RGB/15,72,120,8 RGB/16,116,128,76 RGB/17,128,168,56 RGB/18,120,144,56 RGB/19,72,96,32 RGB/20,136,160,64 RGB/21,88,104,48 RGB/22,16,24,0 RGB/23,120,144,40 RGB/24,192,208,144 RGB/25,104,120,32 RGB/26,80,120,16 RGB/27,80,120,32 RGB/28,104,136,24 RGB/29,72,128,16 RGB/30,24,60,44 RGB/31,104,152,48 RGB/32,8,32,40 RGB/33,0,0,0 RGB/34,104,120,48 RGB/35,88,112,40 RGB/36,116,152,64 RGB/37,44,72,52 RGB/38,88,88,40 RGB/39,148,156,72 RGB/40,60,104,52 RGB/41,104,160,32 RGB/42,64,112,0 RGB/43,96,128,48 RGB/44,56,104,0 RGB/45,32,40,4 RGB/46,56,88,0 RGB/47,152,176,84 RGB/48,128,140,76 RGB/49,128,144,48 RGB/50,56,88,16 RGB/51,80,96,24 RGB/52,80,112,24 RGB/53,152,160,112 RGB/54,32,68,0 RGB/55,112,136,40 RGB/56,120,160,40 RGB/57,148,164,64 RGB/58,72,96,8 RGB/59,64,96,16 RGB/60,128,160,80 RGB/61,64,104,24 RGB/62,16,48,48 RGB/63,88,128,40 RGB/64,96,136,40 RGB/65,16,16,8 RGB/66,68,76,32 RGB/67,100,144,68 RGB/68,124,136,64 RGB/69,112,152,56 RGB/70,56,96,8 RGB/71,88,136,32 RGB/72,168,200,116 RGB/73,24,60,24 RGB/74,56,100,16 RGB/75,48,72,0 RGB/76,108,172,32 RGB/77,112,176,44 RGB/78,80,92,48 RGB/79,104,144,40 RGB/80,60,76,16 RGB/81,64,80,48 RGB/82,112,136,64 RGB/83,96,124,56 RGB/84,120,164,64 RGB/85,72,112,16 RGB/86,8,8,0 RGB/87,44,48,12 RGB/88,112,160,48 RGB/89,88,152,24 RGB/90,96,152,32 RGB/91,124,188,44 RGB/92,48,96,0 RGB/93,120,152,76 RGB/94,56,80,8 RGB/95,184,204,132 RGB/96,96,112,32 RGB/97,68,84,24 RGB/98,120,152,48 RGB/99,28,64,32 RGB/100,120,160,56 RGB/101,112,152,40 RGB/102,100,124,68 RGB/103,96,160,40 RGB/104,96,144,24 RGB/105,96,120,24 RGB/106,104,128,40 RGB/107,84,104,12 RGB/108,80,128,24 RGB/109,96,108,64 RGB/110,68,80,8 RGB/111,144,196,84 RGB/112,128,160,48 RGB/113,128,176,64 RGB/114,128,132,56 RGB/115,116,140,72 RGB/116,64,104,8 RGB/117,112,144,48 RGB/118,16,40,40 RGB/119,96,128,32 RGB/120,84,124,56 RGB/121,28,48,48 RGB/122,96,120,40 RGB/123,112,164,56 RGB/124,132,176,80 RGB/125,148,156,84 RGB/126,96,160,28 RGB/127,16,48,32  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D##+=44GG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-D##?i??44@G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#r##4??i4?#@@!!!!!!!!!!!!!!!!!!!!!!!!!!!BRD"``?@ii.!!!!!!!!!!!!!!!!!!!!!!!!!! }"j7w7????i?4??!!!!!!!!!!!!!!!!!!!!!!!!!!BS7uwi7U:??iU?l=4!!!!!!!!!!!!!!!!!!!!!!!!!0u77?E@?w?4?4!!!!!!!!!!!!!!!!!!!!!!!!!77wi4?4U???4 !!!!!!!!!!!!!!!!!!!!!!!!!Qju???@?:U?w?l?Ui?U !!!!!!!!!!!!!!!!!!!!!!!!!#7U444?7U@it?7U?? !!!!!!!!!!!!!!!!!!!!!!!!#u?@l?G@7??4#@??44 !!!!!V!!!!!!!!!!!!!!!!!!-f#@??:li444444 !!!!!!!!!!!!!!!!!!!! +4Ui4ii??i?#w?##4!!!!!!!!!!!!!- =?U44??4# $@44F?4!!!!!!!!!!!!!N"###="?t#=:4wi?jzD}_}$:4#?4?!!!!!!!!!!!!B:+#?4?Uw44?4i4# N]R#4U?4!!!!!!!!!!!!#U4444?+7w?:#a ^#?www;;;!!!!!!!!!!!P"#4:=:4::U?@?##D0 ??UUU==!!!!!!!!!!?@@ iU.=447:Uw }" ?????4U4U;+=!!!!!!!!!!0#l?lGw?:7zj"D_ =?l4?# =!!!!!!!!!!??4j7j7U?# 5  ??44U4U=?,4#"!!!!!!!!!!!U7'jki??$"05  @44?F?=2!!!!!!!!!!!!#?li79 ju#"& 5R4t4??t??==!!!!!!!!!!!+747e7jUF20#w 4il@U==!!!!!!!!!!!"?p)w77 Uz4:= ?lGG@ ;?GlF4U.2!!!!!!!!!!}p98ui/}Hr=?4##4@GUl@Z$lG|##$#!!!!!!!!!!!"'''/:a}}7"4?@@G@=Z?.2?|Z@4=$$!!!!!!!!!!!-}'?jU.zk:=?@G@Gt4ttGGE ,)Z. $?!!!!!!!!!!Dn#:7?.k"?=?U?G4=ZG*UG?@#?$H!!!!!!!!!!!7kj/@?l?lli4?*lZGGl4?F=Z!!!!!!!!!!V5/'r7@@44G GlGGGGZ,4J;+ !!!!!!!!!!//91j7@4??{{)ZYZ)Zl?.;#!!!!!!!!!!!D18eiG@?<#+$; {)q8?\"!!!!!!!!!Pee))eGG4_5&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >2!!!!!!!Q _7<s{q/ " 2UioLo)* *i81uC>>> P T $ X ( \ , ` 0d4h8l<p @tDxgdalautotest-3.0.4/gdrivers/data/4byteFloat.sdat0000644003401500001440000000062013614004466021262 0ustar rouaultusersO????????O????????????@@@@@@????@ @ @ @ @@????@ @OǀO @@????@ @OǀO @@????@ @ @ @ @@????@@@@@@????????????O????????Ogdalautotest-3.0.4/gdrivers/data/ers_dem0000644003401500001440000001134013614004466017732 0ustar rouaultusers<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<B <<<<<<<<<<<<<<<<<<<<<<<<<<<<A?|BABJ<<<<<<<<<<<<<<<<<<<<<<<<<<B,vAAB1Ac@<<<<<<<<<<<<<<<<<<<<@@<<<B B"ADA}RAB-AkA8<<<<<<<<<<<<<<<<<<<<<AkB۞AAAA4A\dATP<<<<<<<<<<<<<<<<<<<<B ۰BA:xLAX?Ap A=AAzzAvA[<<<<<<<<<<<<<<<<<<<<ABDB(BB"AA2MA%AZhAA}AG<<<<<<<<<<<<<<<<<<<<A$AJaB$qBXcBABBB+XBAt"<<<<<<<<<<<<<<<<<<<<<BBB9B<BrSlB6B)0zBL#\A6)|<<<<<<<<<<<<<<<<<<<<BZ$Bh B[oBjB6AA AybAߖ?4<<<<<<<<<<<<<<<<<<<<B9B<3BkB{B?&AA@nB@A:A*<<<<<<<<<<<<<<<<<<<A6nAiA\BnnBmRAۑ@B(B WZBA<<<<<<<<<<<<<<<<<<<<AB9BCBTRBA{B!qBf0BB,As<<<<<<<<<<<<<<<<<<<<BBopB-B $BB{:BWBB>wBoAJ <<<<<<<<<<<<<<<<<<<AÿBB(BevBBBսB|dB6BΣBBhV<<<<<<<<<<<<<<<<<<<AHB_ZB:B4BB7BǗ BAnBB<<<<<<<<<<<<<<<<<<<<<BlBqBB>+B^B9BiBBu<<<<<<<<<<<<<<<<<<<<<B BnBB-B;B>B1Bm AP|<<<<<<<<<<<<<<<<<<<<<B/Bv\B'LB C B꡸AAz<<<<<<<<<<<<<<<<<<<<<BaBu,B[BBB0An<<<<<<<<<<<<<<<<<<<<<<<<BfBwA∐A AG(?.<<<<<<<<<<<<<<<<<<<<<<<<AjAAƶ<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<gdalautotest-3.0.4/gdrivers/data/rgbsmall.kap0000644003401500001440000001156613614004466020703 0ustar rouaultusers!Copyright unknown VER/2.0 BSB/NA=UNKNOWN,NU=999502,RA=50,50,DU=254 KNP/SC=25000,GD=WGS84,PR=Mercator PP=31.500000,PI=0.033333,SP=,SK=0.000000,TA=90.000000 UN=Metres,SD=HHWLT,DX=2.500000,DY=2.500000 RGB/1,112,120,56 RGB/2,56,72,32 RGB/3,44,64,8 RGB/4,0,16,0 RGB/5,104,168,40 RGB/6,88,112,16 RGB/7,124,176,48 RGB/8,104,136,56 RGB/9,80,136,16 RGB/10,40,80,0 RGB/11,132,152,72 RGB/12,80,84,32 RGB/13,80,100,40 RGB/14,88,136,56 RGB/15,72,120,8 RGB/16,116,128,76 RGB/17,128,168,56 RGB/18,120,144,56 RGB/19,72,96,32 RGB/20,136,160,64 RGB/21,88,104,48 RGB/22,16,24,0 RGB/23,120,144,40 RGB/24,192,208,144 RGB/25,104,120,32 RGB/26,80,120,16 RGB/27,80,120,32 RGB/28,104,136,24 RGB/29,72,128,16 RGB/30,24,60,44 RGB/31,104,152,48 RGB/32,8,32,40 RGB/33,0,0,0 RGB/34,104,120,48 RGB/35,88,112,40 RGB/36,116,152,64 RGB/37,44,72,52 RGB/38,88,88,40 RGB/39,148,156,72 RGB/40,60,104,52 RGB/41,104,160,32 RGB/42,64,112,0 RGB/43,96,128,48 RGB/44,56,104,0 RGB/45,32,40,4 RGB/46,56,88,0 RGB/47,152,176,84 RGB/48,128,140,76 RGB/49,128,144,48 RGB/50,56,88,16 RGB/51,80,96,24 RGB/52,80,112,24 RGB/53,152,160,112 RGB/54,32,68,0 RGB/55,112,136,40 RGB/56,120,160,40 RGB/57,148,164,64 RGB/58,72,96,8 RGB/59,64,96,16 RGB/60,128,160,80 RGB/61,64,104,24 RGB/62,16,48,48 RGB/63,88,128,40 RGB/64,96,136,40 RGB/65,16,16,8 RGB/66,68,76,32 RGB/67,100,144,68 RGB/68,124,136,64 RGB/69,112,152,56 RGB/70,56,96,8 RGB/71,88,136,32 RGB/72,168,200,116 RGB/73,24,60,24 RGB/74,56,100,16 RGB/75,48,72,0 RGB/76,108,172,32 RGB/77,112,176,44 RGB/78,80,92,48 RGB/79,104,144,40 RGB/80,60,76,16 RGB/81,64,80,48 RGB/82,112,136,64 RGB/83,96,124,56 RGB/84,120,164,64 RGB/85,72,112,16 RGB/86,8,8,0 RGB/87,44,48,12 RGB/88,112,160,48 RGB/89,88,152,24 RGB/90,96,152,32 RGB/91,124,188,44 RGB/92,48,96,0 RGB/93,120,152,76 RGB/94,56,80,8 RGB/95,184,204,132 RGB/96,96,112,32 RGB/97,68,84,24 RGB/98,120,152,48 RGB/99,28,64,32 RGB/100,120,160,56 RGB/101,112,152,40 RGB/102,100,124,68 RGB/103,96,160,40 RGB/104,96,144,24 RGB/105,96,120,24 RGB/106,104,128,40 RGB/107,84,104,12 RGB/108,80,128,24 RGB/109,96,108,64 RGB/110,68,80,8 RGB/111,144,196,84 RGB/112,128,160,48 RGB/113,128,176,64 RGB/114,128,132,56 RGB/115,116,140,72 RGB/116,64,104,8 RGB/117,112,144,48 RGB/118,16,40,40 RGB/119,96,128,32 RGB/120,84,124,56 RGB/121,28,48,48 RGB/122,96,120,40 RGB/123,112,164,56 RGB/124,132,176,80 RGB/125,148,156,84 RGB/126,96,160,28 RGB/127,16,48,32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D##+=44GG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-D##?i??44@G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#r##4??i4?#@@!!!!!!!!!!!!!!!!!!!!!!!!!!!BRD"``?@ii.!!!!!!!!!!!!!!!!!!!!!!!!!! }"j7w7????i?4??!!!!!!!!!!!!!!!!!!!!!!!!!!BS7uwi7U:??iU?l=4!!!!!!!!!!!!!!!!!!!!!!!!!0u77?E@?w?4?4!!!!!!!!!!!!!!!!!!!!!!!!!77wi4?4U???4 !!!!!!!!!!!!!!!!!!!!!!!!!Qju???@?:U?w?l?Ui?U !!!!!!!!!!!!!!!!!!!!!!!!!#7U444?7U@it?7U?? !!!!!!!!!!!!!!!!!!!!!!!!#u?@l?G@7??4#@??44 !!!!!V!!!!!!!!!!!!!!!!!!-f#@??:li444444 !!!!!!!!!!!!!!!!!!!! +4Ui4ii??i?#w?##4!!!!!!!!!!!!!- =?U44??4# $@44F?4!!!!!!!!!!!!!N"###="?t#=:4wi?jzD}_}$:4#?4?!!!!!!!!!!!!B:+#?4?Uw44?4i4# N]R#4U?4!!!!!!!!!!!!#U4444?+7w?:#a ^#?www;;;!!!!!!!!!!!P"#4:=:4::U?@?##D0 ??UUU==!!!!!!!!!!?@@ iU.=447:Uw }" ?????4U4U;+=!!!!!!!!!!0#l?lGw?:7zj"D_ =?l4?# =!!!!!!!!!!??4j7j7U?# 5  ??44U4U=?,4#"!!!!!!!!!!!U7'jki??$"05  @44?F?=2!!!!!!!!!!!!#?li79 ju#"& 5R4t4??t??==!!!!!!!!!!!+747e7jUF20#w 4il@U==!!!!!!!!!!!"?p)w77 Uz4:= ?lGG@ ;?GlF4U.2!!!!!!!!!!}p98ui/}Hr=?4##4@GUl@Z$lG|##$#!!!!!!!!!!!"'''/:a}}7"4?@@G@=Z?.2?|Z@4=$$!!!!!!!!!!!-}'?jU.zk:=?@G@Gt4ttGGE ,)Z. $?!!!!!!!!!!Dn#:7?.k"?=?U?G4=ZG*UG?@#?$H!!!!!!!!!!!7kj/@?l?lli4?*lZGGl4?F=Z!!!!!!!!!!V5/'r7@@44G GlGGGGZ,4J;+ !!!!!!!!!!//91j7@4??{{)ZYZ)Zl?.;#!!!!!!!!!!!D18eiG@?<#+$; {)q8?\"!!!!!!!!!Pee))eGG4_5&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >2!!!!!!!Q _7<s{q/ " 2UioLo)* *i81uC>>> gdalautotest-3.0.4/gdrivers/data/single_char_varname.h50000644003401500001440000001406013614004466022620 0ustar rouaultusersHDF  00WOHDR " latlonef!+OHDR !  Q +CLASSDIMENSION_SCALE ZNAME@This is a netCDF dimension but not a netCDF variable. 1q"OHDR !  - +CLASSDIMENSION_SCALE ZNAME@This is a netCDF dimension but not a netCDF variable. 1/LOHDR $   *| \DIMENSION_LIST00 OHDR $   *| \DIMENSION_LIST00 5OCHK |0REFERENCE_LIST6datasetdimension !a0OCHK |0REFERENCE_LIST6datasetdimension !x&GCOL`gdalautotest-3.0.4/gdrivers/data/4bit.rsw0000644003401500001440000007166713614004466020012 0ustar rouaultusersRSWs@@j@$@"?Bɣ1@sH@/m"?Bɣ1@"?Bɣ1@offfffffffffffffofffffffffffffofffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffofffffffffffffffffffffffffffffffffofffffffffffffffffffffofffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffffffofffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffofffffffffffffffffffffffffffffofffffffffffffffofffffffffffffffffffffffffffffoffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffofffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffofffffffffffffffffffffffffffffgdalautotest-3.0.4/gdrivers/data/wc_10m_CCCMA_A2a_2020_tmin_9.bil0000644003401500001440000000000213614004466023433 0ustar rouaultusers gdalautotest-3.0.4/gdrivers/data/ns3034d.nsf0000644003401500001440000000165113614004466020203 0ustar rouaultusersNSIF01.0003BF01NS3034D 19971218121539Check a mask header with 0 or black (00) being the transparent pixels color. U 00001000010JITC (520) 538-5458 00000000093700040400100043900000000940000000000000000000000000IMMissing ID19961218121539 - BASE IMAGE - U 0Unknown 0000001800000035B MONO VIS 01R 0NM1M N 00B00010001003500180100100000100001001.0 0000000000@>>|>gdalautotest-3.0.4/gdrivers/data/unittype.nc0000644003401500001440000000043013614004466020572 0ustar rouaultusersCDF xy  Conventions COARDS/CF-1.0 xyz unitsm/sGGGG||||gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/0000755003401500001440000000000013614004466023030 5ustar rouaultusers././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614005401030066 5ustar rouaultusers././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614004466030100 5ustar rouaultusers././@LongLink0000644000000000000000000000025100000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614005400030065 5ustar rouaultusers././@LongLink0000644000000000000000000000026200000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614004466030100 5ustar rouaultusers././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614004466030100 5ustar rouaultusers././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_WVP_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B03_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B02_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_AOT_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B08_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_B04_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R10m/T34VFJ_20180818T094031_TCI_10m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614004466030100 5ustar rouaultusers././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_WVP_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B12_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B07_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B03_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B06_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B02_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B04_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_AOT_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B11_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_TCI_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B05_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_SCL_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R20m/T34VFJ_20180818T094031_B8A_20m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000026700000000000011610 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000755003401500001440000000000013614004466030100 5ustar rouaultusers././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B8A_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B05_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B01_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_SCL_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B09_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_AOT_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B04_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_TCI_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B11_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B06_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B02_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B12_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_WVP_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B07_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033100000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/IMG_DATA/R60m/T34VFJ_20180818T094031_B03_60m.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000067613614004466030113 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/GRANULE/L2A_T34VFJ_A016478_20180818T094030/MTD_TL.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000000664613614005400030103 0ustar rouaultusers 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 ././@LongLink0000644000000000000000000000021400000000000011600 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T34VFJ_20180818T120345.SAFE/MTD_MSIL2A.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2A/S2A_MSIL2A_20180818T094031_N0208_R036_T340000644003401500001440000003473013614005401030077 0ustar rouaultusers 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 gdalautotest-3.0.4/gdrivers/data/missing_contents.pdf0000644003401500001440000000313113614004466022451 0ustar rouaultusers%PDF-1.6 % 7 0 obj << /BBox [ 0 0 20 20 ] /Measure 8 0 R /Name (Layer) /Type /Viewport >> endobj 8 0 obj << /Bounds [ 0 1 0 0 1 0 1 1 ] /GCS 9 0 R /GPTS [ 49 2 48 2 48 3 49 3 ] /LPTS [ 0 1 0 0 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 9 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 3 0 obj << /Annots 6 0 R /xontents 4 0 R /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 5 0 R /Type /Page /UserUnit 1 /VP [ 7 0 R ] >> endobj 10 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 11 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 11 0 obj 228 endobj 4 0 obj << /Length 12 0 R >> stream q 20 0 0 20 0 0 cm /Image10 Do Q endstream endobj 12 0 obj 33 endobj 5 0 obj << /XObject << /Image10 10 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000001191 00000 n 0000001250 00000 n 0000000445 00000 n 0000001012 00000 n 0000001120 00000 n 0000001172 00000 n 0000000015 00000 n 0000000101 00000 n 0000000246 00000 n 0000000589 00000 n 0000000989 00000 n 0000001098 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 1299 %%EOF gdalautotest-3.0.4/gdrivers/data/n43_partial_cols.dt00000644003401500001440000000754013614004466022151 0ustar rouaultusersUHL10800000W0430000N03000300NA U 012101210 DSIU DTED0000000000000000 01A000000000000 PRF89020B000005MSLWGS84 430000.0N0800000.0W430000N0800000W440000N0800000W440000N0790000W430000N0790000W0000000.0030003000121012100 ACCNA NA NA NA 00 gdalautotest-3.0.4/gdrivers/data/byte.rst0000644003401500001440000000067113614004466020073 0ustar rouaultusers *?FJJJJG@*!" /;CHJHC;) &)+%6AHF;(+5=CA4( )-15:?4$!" 1)$)0;=$:. & 4GB( ,'&5AIM;'$% ??GHCGGKMEEQMT`TH6KOTOID53,%DczhL 1.1.1 http://sedac.ciesin.columbia.edu/mapserver/map/GPWv3? EPSG:4326 image/jpeg GPWv3_1990_Pop_Density_tif -180.0 85.0 180.0 -60.0 36000 14500 EPSG:4326 3 gdalautotest-3.0.4/gdrivers/data/grib/0000755003401500001440000000000013614005401017303 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/grib/lambert_conformal_conic.grb20000644003401500001440000000154513614004466024741 0ustar rouaultusersGRIBeQIr(+`G@uu@@̀"{k{{ΜŔs{ckZ{{{ks{ckk{{kksksssc{cskc{{{k{{c{kckksZsk{{s{{{csZc{s{{sscskkskcccsJsssssc{ksssZcs{kkcZcscc{kskksskss{sskkscck{{{k{kss{kkkks{sscsks{sc{kk{{{ks{kk{cks{{kcss{kkcssk{ckcks{{{c{{kcZkkks{{k{k{c{c{skkcss{{{skssscsks{k{ckssskssck7777gdalautotest-3.0.4/gdrivers/data/grib/jpeg2000_nbits_zero_decimal_scaled.grb20000644003401500001440000000027213614004466026552 0ustar rouaultusersGRIBH:\r0m0:\r0m3g*@"(A7777gdalautotest-3.0.4/gdrivers/data/grib/template_4_40.grb20000644003401500001440000000074313614004466022440 0ustar rouaultusersGRIBU HE+Z0u0ʆ$(HcE(/8<-,OQ)R\Bg8gPgPghPPPGWWWbd%Created by OpenJPEG version 2.3.0 $PTt HKv0HKk $%u΀z@  PTx\a. @ ) B_ a!/7777gdalautotest-3.0.4/gdrivers/data/grib/template_4_65535.grb20000644003401500001440000000110113614004466022671 0ustar rouaultusersGRIBAT &^%`G@0?@ppZFXEH\BkkRJRRRk:J):!!!!!)!c:!B1J:[[JB:1!1!1RkBc1:)1)1BR:[BBscBB[):)!:!::[JR1!!!)B)!):)1)B!B!)!1)))11J)J:J::!1):B)J1:1JBcJ11!1!sc!))!B!cB111!B11))!c!!!!:1):::1:1!J)1Bc1!111!BBB)1!:!)!)1:1!1::1):)1:)::11:)1:))!J1J)J1B1!):)!)1k!{cJBB::1)B:::1:c1)sccJJ)J1!:):R1)::!:R:B::)))1J1[1:!!:R1J:11)::1)1)1!)J!)B):):B:1)B!B):1!::))!)!):!1J)[)B!11:1:::R!1:)::B:::!:!::!1)RJ7777gdalautotest-3.0.4/gdrivers/data/grib/rotated_pole.grb.xml0000644003401500001440000000110413614005401023253 0ustar rouaultusers 648964 rotated_pole.grb.begin 0 0 1024 1024 647936 0 648960 4 55 gdalautotest-3.0.4/gdrivers/data/grib/twenty-se27w.2017102006.hwrfsat.core.0p02.f000_truncated.grb20000644003401500001440000043670613614004466031254 0ustar rouaultusersGRIB= HyxȀ0e= L_N N " C1yH G<-,AidVA $ RAY @9$ZA8^AidVAI$NAYZAYPyF@2AY$%2>AXNAY$ZAYRA9dRAYNAY2Ai>A) JAY d@I$"Z?I^AdVA9dRA9dVAYX9JAIVAI AIV?i$VAi$NAI$VAIVAIHdV@d VAY$@ Z?dfAYVAI$VAi$JAIZA)dB@$JAHJAic>AyZAYRA9dVAIdRAPZZAdV@$JAHBAyBAIVAYRA$ZAidRAPTZA)dF@$RA8ZAhVB9dVAIdBAIdVA$TB@VAYR@Z?IdAidRA)$bAYVA)dAi$B@$VA86AiA9dAYZAY$NAIdZAI$PVAIdVAYR@dAdVAidRAYZAYJAIAIR@$VA*AiA)dVAYdJAYZA$P RA9VAYR@A d^AYZAY$ZA)dFAYT RAYRAYA(Z?d^AYdRAY$RA9ZAYVAP.dVABAId.J?$ ZAhRAdZAY$FAYRAidRAYZAi$FAId+R?$ VAydZAdVAIBAIdVAdRAidRA$A(*AIJAYdVAYdJA$VAY$TiNAYVBy#@A$fAYdVAIdRAidVAIAidVA)$A8#&AYd@dVAidFAYZAY$TRAYZBi@d@$VAYdRAdVAYJAP$VAIVBicJ?)dZ@)dfAYdVAY$JAYZAIdTnA9dRAidA Z@)dbAYdRA VAidVA9@@ZARAYd>d~AydFAIVAiR@VAidNA9$AidVAI$>~AyRAydVAi$RAYZA9$AYdRAYdV?dNABA)dVAYdFAidVAY$TIdZAIRAi$?dZ@VAYdVAIdZAYdZAIPd~AIdVAd?.A9dZAY$JAIdZAYRA)@ZAYFA9dN@x6A9dZAidVAdVA)dVAidVA9FAidjA)$ZAIV@JAi VAIdVA$RAydRA@VAY$FAIdN@x2AidFAY $VAidVA$VAidNAPzAYdVBiF@9ZAZAYdVAIdVAYdVAidJAPdRAYVBidAIZAdZAYZAYd>AIdVAYdNAPVA9$VBydA9$BA9ZAYdVA $VAidZAYdPIdVA)$ZAYJ@RA)$VAYVAIVAYVAdNAPdVA9$ZAIV@RAIVAidRAdVAYVAYdAidRAY?)$ ^AYVAdVAdFAYdVAY$T dnA9$ZAi@>AYbAYdVAIdVAYdVA@dVAdZAY@dZAdVAY$RA)dVAYRAY@ ZAYdVAi ?dVA$VAidVAIdRAYdVAI6AYdVAi ?i$Z@dbAYVA$JAYdRAYdPRAYB? JA$^AYdfAIVAYVAdPidVAI$Z@A9dRAydfAYdNAdVAY$VAPZAY$ZAic@9$FAYZAYRA dVAYdVAIdAYVAi?IdNA)d^AYNAYdRAYdVAYdVA` $VAYdZA($AyVAYZAY$JAI$VAY$VAI4VAidZAi:@)VAY$VAYdRA dRAYdVA@VAYdZAH A $RAIVAYdRA $VAY$VAY@CVAidVAi@dJA)d^AYdvAIVAdZAY$VA`VAYdJ?FA)$ZAYdVA9RAYdRAI$:AidZAB@FAY$VAYdN@fAYVAIdRAYdZAiA$FAd^AYdVA)dZAYdZAIdAYdZAYdA BAYdVAYdFAIdVAY$T9dVAYdN?VAi$VAidZA)RAYdVAY$PdVAYZB @YFAYVAYdBAIdfAY$VAId2AYdZAY@$JAY$^AYdVA9dVAYdVA$T VAYdR?yZA9dZAidRAY$VAIdVAYdRAP)dZAYdzA9:@ VAIVAiRA $VAIdVAI$AIdVAid?RAYdVAiFAI$ZAY$RAY$T $VAiV@H@VA9dVA dRAY$VAI$T Y$VAi?y#ZAYd^A9dVAYdRAdVAYdVAY@ҐVAYfAXAVAYVAYB@RAYdAIdRAP7$VAYdV@$AYZAiRAidRAI$fAYd VAI$AYZAY*?VAYdZAI$R@RAYdVAYdRAP;VAYV@$AidZAY$VAi$FAI$VAYdRA9dAidZAi$A8~AYdZAIdZAI$FAYVAIXdVAiR@A9dZAi$VAI$FAIdVAYdRAYAVAYV@AIZAY$VAyNAYdVA$VA0KdZAIV@$AY VAYdZAY:A VA$VAYAYdjAY?$RAYVAY>A9dVAYRA RZAYd.@^Ai$^Ai$RAi6AY$RAdfAPV$VAidV@NAydZAYRAYNA dVAI$FAIAcVAYZAY?9ZAIdZA9dZAY >AIdVAIdNAP[VAI.Ac=dZAiRAi BAYVAiNA9dX$VAN@ZAid RA)RAy$VAVAidVAdAIdjAid&@8bAYVAY$JAY$*@dZAidNAIdBAPcdVAIdZ@AYdVAiVAYd@JAidVA$Ti$ZAid N>VAi$bAYdVAY?yJAYdRAY$JAPg$NAi*AIc&AdZAYdRAi$ 2@9VAY$BAYdAY$jAi=$VAidVAidRAy$>A9$ VAYdVAVAIdZ@~@YVB VAIdV@BAI ZAIR@dRAYZA $z@9ZAYVAYdN@BAY&?>A@yNAY6@hJAibAid^A9:AYVAY:AY$AYZA#A)$RAdRAi$.AYfAY 6AY$AIZA)d@)dVAdRAy.AYdVAYNA VA)dR@AVAidZAY$6@$ZAYdRAYd*A`bAIdNAA)ZAY$^@$ RAYdNAIdAIVA cAiVAdRAI:@dVAYJAIAYdZA6?ZAdZAYdZ@ZAidZA9$:A9DRAY$ZA)#AIjAYdRAi NAidZAY$.A9LVAi$~AVAydfAYdRAY A9ZAY$:A)SRAIA)AIzAYdVA$J@dFAZAI$BAPRA)R@dNAidVAYV@JAZAY$VA`RA9RAAYVAYd*@$VAidRAY$VA`RAiRAAibAYdRAyd@$VAidRAYVApVAYB?fAi^AdNAI @RAYN@$\,i$VAidA9ZAiVAidZAy NAyVA)NAYސVAIJ?d^AidVAY$^@ RAiZAIdBA BNAY$VA#*AdVAdVA)d:@i^AIdRAI X0iVAYdJ?^AidVAdZA)$^AVA9dNANAIVAYd>'ZAYZAYdZ@$VAyZAYd NA`VA9R?>BybAY$VAiZ@$RAiZAY$.A@ͤVAIdVA86A"VAidZA)$ZAYRAyZAIdB@CRAi$VA86A#ZAi$VAi$VAid JAVAi$NA $X4dRAYd >y$^AidVAIdNAYd@NAIVAid\5$RAid>d'^AYdRAIdRA9dV@^AYdRAYVApVA9V@H ZAidVAIRA9Z@ydFA)dVAidJAIRAY$ZAY2AyVAidVAiZANAi$VAiBAYɐRAY$R@ ^Ayd^Ai$VA)dZ@iFAIdZAidJAIAIZAYd @y$ZAdVAYFAI VA9$VAidVAy RAi$Z@$ZAYd^AY$bAIdJAY$ RAiZAYZAq VAI:?dZAYRA9$bAIjAI$RAyZAYVAaVAIdVAZAiZAYZA$VA)6AYd JAY$F@AYV@ZAZAIVAIJAYVAi$ NAId*AYāBAYVA#RAVAYVA)dNAY$:AI RAYF@drA dVA9d?VAYVAIdJAY&@$2AIR@\KIdRAY$F?ZAYRAY$VARAId RAY*A ʐFAY$VAYc2A9ZAYdVAifAI$VAI$VA$:AYސFAY$JAYc2AI$ZAi$RAidRAYNAd2AIdRAA)VAY? VAY$ZAYRAIFAI$2AIF@A9dRA9=IVAidRA)BA$JA)$ZAIdVAY$ RAqTdVA9$?)/VAidRAidFAydNA R@VA9$XW$NAY? ZAYRAYdBAI$N@$ZA $VAYd\ZYdVAI$N?ܐbAi $ZAY$VA9dVAId:AI>AYdNA А2A9dVA8:AY$VAyRAY$NA$v@VAiVAidRAYVAI$RA8c"AydVAIVA NAFAYBAIdVAqVA9d>ZAYVAdVA9VAIdBAIdB@dRA d @dNAY;ZAYRAY$RA $N@dZ@$B@d@dNAd@VAidRAi$bA(>AJ@$FA9$XhyVA)d?VA$RAi$NAY$:@ZA9dVAi$VAa VAdb@㹐ZAidVAY$RAi$6A R@$VA $@dVA=Y$VA9dVAY$RAY$:A9dVA9fAY$\nVA)d2?dbAYRAi$NAI:@$nAIRAy$VAqdRAYdV@#ĐbAYdJAYdRAYzA9 >AYNA dV@d@dFAYd&=YVAiVAY$RAYZA9 JAidRA d^AI\v$RA d>zAYfAIdRA)NAI$ >AYdJA9$^AI\yY$RA)<VA9dVA$NAR@ZAIVAIX|)$VA)=^AYRAYRAI BAIJA9dR@AY$R@$AidVAY$ZAIVA) BAIdRA$R@d ^AId ZA FAizAIdVAY$JA .@$ZAI$VA$ RAi?RABA#nAyVAdRAYBAId FAd>Ad6AYgFABAH?VAI$RAYRAd 2A9dRAIRAi>Ab#RA)$AZAYVAI$RAYV@ $ JAydBA dVA $"A)$RA9#F=VAYRAYRA$J@id>AydVA)BAYאJAIdB?cVAYdVAYdZAI$NAd >@dNA dV@d#A$B@vAidVAY$NA)$VAYd:A)$ZAI$ZAY\dR@c>YdZA9dRAYRA9$F@$6A$FAY$%NAYR@N@YdVA9VA9$RA9d:@AiFAYBAY}FAYd@AiRAYRA9dNA 6A6A)ZAIdXi6AHAYVAI$JA9$R@y:@$N@fAYd`dR@cF@VAIRAY$ A9@$ RAIfAY$\>@dAiRAY$NA$ZAIdA NA)$VA(AYB@ >VAYdRAYRA8$R@$FAJAIdNA)).AI6AXd@RA9$NA)$"AY$.@fA)ZAydNAr$V@$@HfAidNAIVAId6Ai >@JAVA)$*NA$.AYAidRA9$bAIVA d*A JA)$FAIʶFAIdN@ ZAidVAI^A)N@Y$ ^A)BAYRA)ېJAI$N@cZAidRAIdrAId>A92AydBAYBA2dJAIdV@cZAYZA)RAYFAY#.@N@dVA $,A9dF@d@AY$ZAINAY:?c6@N@dVAI$\dF@d?fAYJA$VA d@ @2AYd>ARܤRA$ *@#VAYdRA$fA8R@d@ *A$ VAdBARFAI *AIdVAy$FA)RA9dF@Ic6A9$RA9dRA)NA*@N?ZAI$RA#ِNAdAI>A$VAi$ZAbFA9d B@#^AibA)dAYdVA)#BAI$NAYZA)$X$J@ B@ZAi$RAVA)d@ $BAIdfAY\dF@$"AHZAdRA)RA)dAIRA9dVAiXéN@dR@ZBdRA)dRA)NAY @$NA9jAY1bA)*AId&AyRAIAdJAI A $A)$VAi$NAcdR@$ J@ "AidVA)JA$RA9d @$A9bAI$\I.Ad J?dZAi$Z?RA$@9>@9dVA$\N@2A$ZAYVAR@dJA cJAYbAId36A)d 6A "@ZAIBAINAIdA AdVAdVAc;N@iR@d^BRA  VA9$nAY V@i2A)dVAdVAcBRA $JA)$ZAY:A9nA9$N@$ R@VA9dRA)$FAI2A *A)dRAYdFAiNAY6Aid6?dVAdXӹd6A)drA9RARAYZA9$RAY N@?dVA$X).Ad6AyrAYJAIdRAIdAYB@dJAYdNAcZ$>@RA9$Ay$NA:AYR?BAYd .AY$RAY5AYd*A AINA JAY$NAY>AYd?IdVA$Xى$"A $>AI N@$J?d VA9dA9dA RA)NAcl$:@RAIdVAi$F@9FAYR?dBB$AYVAI7AdRAI@dNA9AiFAidA)d*@dNAYX$&A)$:A9 JA dA9dJAY$AId 6AYZA)$7A dRAI$NBNA)*A9RAYV@F@FAYRAcd&A9$VA9$AYFAFAYdVAH$Z@9ZA)dNAY VA(RAI$ RBIFAi$"A9dFAidA)dB@NAYRAc&@yRA)"ZAY$6@INA9dV?Yd$>@JAYRAcd&A)dRA)^AYdbA9NA VAi#F@AIdZAd9AFAI$FA RA A9R@d@>?VAidTYd A$FAiFA FA)dJA)dN@IF@cFAJA d:AI$&A9$FA9d^A$ @d>A$RA9d:A$"?VAYd:fAId"A9d>ABA)JAIVAI@d:=idVA)d:AY#A$RA $RAiJA)$JA9ZAI$*AI6@NAYVAS&@IVAi$VAdRA:@dFA9J@d :$VA9;fAY&A)dBAIRA ZA d&AIJ@*A9#ZA dVAc$ B@I$ RA9$VAd:AY$Z@dZA):AÏA9dFAcd F@9d VAi$JAy:A9F@dZAF@ : jA)2A&A9dVA BAYZA9N@jA "@FAyXd.@)dVAYVAIdJAAi RA(B@>JA9OQ.@x RAYdVAiJAY$&@:ANA$ B<$R@=@d&A9dRA J@R@ZA96AidF@#Ad>A)6A)$*A9BAI>>I$6?JAIN@$ B;9$2AIϟ:A)$@RA VA)VA)$AY >AIJA Aid2A3 B@IdZA9d^A)ABd&@$nA) AY$ Pi6@$RAiRA  ^A):?$"A nA)&AdVA) Td6@IdVAiRA $VAI$ Bd"@^A):@)VA9Q6@)$ZAdR@AIA 6A>A)$BAYdR@P+R@"AIVAJ;NAi$n@>A$>@$AI :AT>A &AYRAi$V@ $R@$ >A9JAy$FAH$AYN@PnR@@$FAIdBA9cVAY$B@d@B@@ZAiU:@IZAdZAAIB@ F@Yd^A9A ZAyU 6@IdVAdV@dRA9d:@dA J@d@dRA dC6@$*@IZAYdVA)AF@9d^@dJA):@idVAy$AT9R@d VAYZA$JA)d6?A)JA@$VAid DAY$ @JAidn@$JAId@NA)dFA)dA)$2AI,BA .AicVAicrAIdF@#ː*@ dNA)J@H#VAy1 B@d VAYdVA$JA9$>$A9$JAAY2AD]FA9d2AYdRAY$NA9F@dA)dJAYd@dJA FAI$ @dAI$F>^A?(NAyRA)$&AYd9)d6AIVAYNAYcBA)2@8RA9jAd >d>@z$VA$6AYdJAY#A ZA) 6@INAy$FA9B@ZA $H.A9$6@idV@YVANAY6@2A>A  F@d^AYdHA)dA V@V> RA9d N@VA :A(BA dInAI$6@ydVAIR=dNAi"AYRA9d"@Z@NA92@yV@y$VAINAI ^@NAiJA9dF@idV@dVAId FA dRA) RA)dJ@$:AY$JA@ V@dKA9$.AdA9dJ@)VA) R@$FAIF@9 "Ai&@NAId B@ VA9 RAIJ@:AIBAY@^Ai$LA9$B@$V@dRAiZ@JA$>AI$JAJA  AY6AD$NAI$ NAdZAY$bA)VA) J@$RA @RAYGRA$ R@.@d6AIF@dJA9dJA@)dVAY$ MA9$B@$>AY$F@d6@RAYFA9$@dVAIRAdR@dAYFA dJA $RAFAI@X$6AIVAId R@"AY:A9dNA)$ NA$VAN@y AY= $>A$ JAYVAI$2A>@RA)RA9 AY>VA V@2@$JA)$ NA$jA)$?dAi P.A9$2AIV@dR@dJA9dR@$ZA)$JAY$:?NAY PAI$B@$ BAYdRAX:A :B^A)JAI.@$VA9TERA$ R@d"AYdBA9$NA9$VA)JAdN@:@$R@dzA)&AI VA9 FAYVA9VA9$NAdR@$VA)FidVA $ FAiNAi$:A9dF@dJ@VA)$.A9dVA%$RA$2@"AY$A9dJAYZA9dVA9$JA $J@RJAYdV@$ JA d^?dRA9RA >@$FA)$&@dVA)RAI$ &A9RAY$@ZA)fA NAR@dFAYd=KydRAYd.AdRA)$BAYNA d.@NA)d F@dVA9TʐVAI$6AIJAY:A9$JA dR@R@$FA99M$~AY*A9dN=Y$FAidNA$ BA)d J@3V@;$VAIdR@$VAiJAIV@>A$NA)$BAdAY$SAIdR@d JA9$vAdFAY$ZAI.A &A$VBdTAIdR@ V@ZA)>A9RAIdR@>A9*@VBdTJAIdVAId*AIN@y$VA9jA$>A^@&@YZByTrAY$VA9$*A9ZA9^AYRAY6A:A9$6AV@I$VAIdV@dVAId ZAYRA$F@$J@dR@ A d=RdVAdV@dNARAirA):A9NAIdF?id+VALdRAY$R@N?)$VAijA:AFA9d@9JAYTAYdR@d FAY@dJAI$RAYdjA9V@$VA)d=SdVA9*AY$VAX ^AiNA)d>A$NA)$:AY dMTidZAY$R@dVA8:AyNAIVA$R@dJ@d .A-6A5RVAYd:AIVA9 BAIRAyRA)N@B@FBdU.AYdjAI2@dV@VAIZAYR@dJA$F>(=TdVA$ B@$ZAyZAi$JAY^AIdnA)$:@)$MTdRAY$B@$V@YdVAIRA)$JA9NAd RARVAYd>AVAI@dRA9JA9VARA*AIU*AYdVA $2AY$?d^A9$VAY$VA9dJAIBA)d&5TydVAY$V@?idRA)dFA)$JA9dJAIBA%5TidVAIR@$V?i$RA)$>AFAdJA9FAId9T9dVAIF@V? ZAyR@NA)dF@JA9dV@UAVAYRA RAX:ANA dNA)dFA)JA9$BA))SdVAY$F@$F@ZA9dVA dJAY~@$RA9J@SdVAYF@$RAY$AiNAJA$ >AIN@$ >AiTAIdVA9dJA)2AiJANAFA9$B@F@J$VAdRA $ VAI2@$NAi$BA9$Z@NAIJ@$)QdvAYdBAI$VAdJAY$RA JA>A9$:A 5QdAYdRA)J@8VAIdBAYdr@NAIFA  TAY$VAYBAJ@VAIdVA dn@NAIdJAd*A>dRAi$RA VARAI$BAYdZ@JAId2@dZ@yVAYR@VAY#&A9dBA^@JAI$:A)$IMdvAYdFAR@9$ RAIdnAdj@JAi$>A)$Z@ITϐVAYdVA9VB#@yRA$F@$r@dBA9$ BA9V@0VAdJAIVAh@ZAId6@$ JAIdVA9$*AYRAYdRAIdVAI6@RA):@d JA$RAI.AdRAIdzAYNAI@ $RAJ@&A $^AId2AdUJI$VAYdRAdV>d 2AI$>A$B@dNAYJ@d:AU%VAYdNAIV?$ FA9FAY.A)VAI$BA9$R*AIdrAY$BA)c"AdNA>A $&A9ZAIVA)QAIdvAYFAY@I$ RA)jA)~AdNAi$JAY$QAIdVAIdRA)#>A$VAdBAdRAY$RA)QrAIdVAIdRA)$@9NA9dZA9@ ZAIVA9B@LVAdVA9NAIܐ @dRAF@$ VA9dRA9dF@;RAYdVAJAAIJA)$VA)d2@$NA9dNAYdUB$VAY$VAdZ=I$JANAId B@VA9:A)$UAi$ZAYRAN@rA)dJA9.A)ZAIJAd JAEdvAYdNAIRAX>A)$JA $*AZAIBA9dVATdVAi$NAINAX$ FA)$BAdA9ZA9>B)$BA9SRAdVA$VAXdFAYBAId>@yRAYBA)$Q=dNAiVAdVAHRAdJ@dA9ZAIBA)$RAdRAdRAY$FAY@$FAIB@i$RAi$RAY$JAIY;RAidFAI@$FA$:A)6@dZAI$VA NANAiRAYVAcBAIdJAId2@$b@dRA9$NA$JA9SJAIdVA9JAicBAY$VAId>@$ 2AIdNAYJ@I$U9)$VAFAIdN8iBAF@&AyRA9JAFAISFAYVA)JAh$NAVA)dJ@$ RAi$RAYAIMAd^Aid>@dJ99$FA)d*AI$ "AydZAIVAVA9S_FAY$ZA9FAXNA)dRA9d2@ydRAi$VAYRA4dV@RA)$VA dAIdFA$>AId AZA)VAI$VA9;FAYZAdRA&@$BA$:AI$&AVAIVAI$RA9S-BAY^AdVA9dBA9$>AIdB@ RANA9dVAIdVAT$ ZAyR@$NAI NA9RAId"@RAiZA9dVAIdL>A ZAI$:A9d>A9NAIJ@y NA)$JAIJAYdJATd.AiJA dNAI JA)JAIJ@BAINAIVAY$Q0y$bAidB@FA $>A)$RAd ^A NAYRAYdVA4&Ai$FAY$ FAIc@$NA$BA$ ZA JAYdNAI$L @ZA)$FAI.A ZA)$"C RA9VA9NAT R@VA9VA9c>A9$ NA)$@VA9dZA RAY&A)VA)VAc2AVA9F@IRANAYd JAIM/ZAyjA)d FAhd:A):AZA)NA9JAIdK@ZA$FAYA dRAIB@RAIdNAIJAY$VAD VAiVAdNAH#"@d^A$@$NAydRAidRA9dK@$ZA9$.AI@I$RAy$ZAdBA)$NAYFA9$NA$VAiVA dVA9A RA &A9VA)ZA)RA)RAYZAIRA) JA FAid N@^A)ZA dNA9R@ZAY$:A9d@9FAi$N@d NAIRA9$NAY$Q/$VAiRA$F=BAFAIF@$FA9dNAY$NAYAYRA9NA($>A)VAA$NAYRA)$L@$VAiRA)dJ=y :A)N@A9dNAidVA9dQ5)VAiRA9dJ>)d.A>A9$BB9JA9dRAYM@ZAIdN@$@$FAy$NAnA9VAi$VAIN2@I$ZAY NAI JA$ @F@$&A$JA9$VAidRAY$M:VAYN@NAJAIdF@$RA9dVA)dVAIO"A)dRAI$NA  BA)R@$@VAIZA)AIOA)dRAYdFA9$ ?&A)6AA JAIRAXNAU$VAY$R@dR@Hd :?2AIZ@ZAIRA$A)$PA9dRAI$>A8F@N@$F@idNA9dVA9AIQ2A)dVAYdRA)R@ $A)BA).Ai$NAYJAYcJA9dQAdRA:A9$F@ JAiFA)6AdNAY$V@NAE#$VAY VA9V@) JAY$NAd6AYdVA9$RA $RAIRAY$:A)$F@ߐ*@dRAiF@yd NAY$VA9#VA9dSA9dVAY$J@>=iJAY$RA)FAI$VAAY$TAIdV@d:A86@bABAI$ZA9$ZA9$UAIdRAYF@$ @9$JAYN@dRAVAinAYdMZRAJ@dR? &A9NA .AdRAYdAYWAY$RAYV@IdN@i&A)dBA9$ A $RAIRAY$NAUFAI d2A)d6Ac&ANA$:@$nA9$ZAYVAIdUfYdRB$ BAYdJ9dFA)dbA$:A $RAI>Ai$RAEJAId6AY$>AI@NAY$FAIA $RAId@Un dRAYd2AY6Ad@yRAY:@dVA9$VA$AY$Uq$VBi$ RA)dF=d>A9RA >A$NAi$VA9cNAYZVAYd&V@J@R3VAIdN@:AIRAY$RAdRAU$FBid :A9d:Acؐ6AI$JA) F@dVA9$RA9$RAIݐNA .@BA)$N@dRA)F@dZA9JAAIQdA9JAi$RA $BA $RAY6A ZAI$VA)#VA $avAi&R@VA9$N@VAd6A)NAY$NAX$JAIRAY *@JAIEJ@$ZAJ@dZA9d:A(dRAYߐRAYd.AIRA)d@JA9djA VAIdJAIVAFH$VAi6A9dFAXB@ZA)d@dRAi$B8dVAVXRA $ >A9dRAc6@IdVAdBA9$VAY$B@8VAYYVAI&A9dVA)#f@VA J@$RAY$N@ZAY$gAYdJ@$VA)dR1d @FA)$ B@ZAYdJANAIhAi$ Z@$VA9d@I RAi *@dZAY$VA9AidUid@dVAY$NA($ :A9dF@dJARA)dZAY$U$"AiRAIN<>AY FAZAY$RA)ӐVAY$k"Aid"AYdVA9@ RAY>@dJAidVAVAY$QI@$VAYdB:H*A dV@fA)$VAY6A)FAI[4VAi VA RAI$NAHc"@:A)$VAYd:AI:AY$UdA)$>AIdRAY㹐*@9dZAIrA)RA9$*>dVAF$ZBdBAYdRAdR?Id BAIdJA)VAYdZ@#ΐVA $My'F@$VAI$NAHd@dBAdRAY.AidJAYϐVAi$ BAYdRAYN4$*A dRABAy$VAd RAY$VAF$@$VAidfAYF:dNAIdFAIVAY2A $ RAYVBi>AY$RAYB1(dFAY$FARAIR@$BAIdqAiA $VAINA@YRA9jARA9$ 2Ai$M@dRA9dB?Y$RAYjA)d^AIdN@VAIrbAY$@dVAdZAi$@dZAIVAJAR@$rAYd"A$VA9J@A dNA)dFAy$2A$RAIܽZAy6AYdRAY>,I BAIdRA9$^AYF?VAYԐZA)dFAIdNAY$@$ VAY$NARAI$.?$RAYZAyFAYdNAI:6$@dRAI^AI :ANAIZA9VAdJAi$2@ $VAdRAibAI :A$RAdt*AiA dVA)$N@&A9dZAIdZAI .A9$RA)ZAid>A9dNAIR@#NAIdVAYdVAYd&A #RAI$tAidBAIdRA9F; RAYVAIVAI FAXcϐ>AYdR@OV@)VAidNAidF8hdRAYVAI$VA$ @BAIR@TdZ@ZAI$VAIB;y#BAYRAI$VA$@dRAIbZAYRA9RA)d26RAI$RAYZAId NAH N@$uAyd BAIdJA)BA*AdVAYfAId6@2AidN@ZAiRAYJAY,>@dVAidRAi$@d:AYd%.A $VA9VAicF@$RAYdVAY>@dJ@NAhdZ@$ZA9dZA)d6.d JA9dfAYdVAZA8N@$Iک2AYZAIZAi#J@$ZAYVAY$:A)cBA9A۩BAY$NA9V@6A ZAYdRAY NAHdNA)=܉ BAY$FAIZ@ӤA VAdRAZ@)dA Ԑ^AiFAYNA)V@#*@yVAYdVAYVAidBAZ@dZAY$RAY*=RAIdVAIdFBYZA9d wAy$JAY$VAI*2) A$fAY$NA)dVA)FAI ^A dRAIdNAY$*:Y:@dNAY$FANA -IRA)RAdVAi$ A $NAYdRAIRAIdJA  yAydRAY$BA9$Z@ңʐ"? NAYdVAId BAI$VA9)FAY$NA)dZ@ذd&@jAYdJ@>A9 >A7$VAdNAdZA c6@ dNAYdVAYRA9R@=RA9$NA ZA #1*A ZAYNA9RA)dB@${A9dZA9dJAIV@#?9RAYVAI$ VA)d F@ {A9JAi$FAYZAY@ 6AY$fAYd:A) dNAYdB@BAIFAY$RAYB@NAYdVAY$.A$V@d)y$VA9dRAZAYdBdVAYdVAY$BCYdV@d-VA)dNA)$^AI@VAidRAdRA)$2Ad>A9dFAYdR@"A9dZAYRA9d A)^@i1>A9$NA)dZAI@iVAidVAI$JA8RA9$ @`)ZAIRAYdBAIRA#>@ZAYNA9R/NAY$>@dB@NAYdVAYd:A(d NAYVAYJ:VAy@ ZA9RAYF@$ZAi$N=$>AYVA)dAifAId:Id6A9$F@ZAi$R@dJAIdZAY>AY㰐VAIR@)6d:A9dR@$VAi$R:$"A)dVA9$^Ai$VAI$ Fd6A9FA9VAid>AH֐N@dZAYR1Y6JAIAr$J@FAY$ZAYdZAI$>idZAYdJAIAI^A N"9F@VAZAYdZAIdA VAiBAiKRA)J@dAidFAYd*A)dVAIdA$jAYNA9$V@ZA)$AidVA9d@2NAVAIdNAYRAI$RAVAidVAIAYRA"@JA d6A9dZAi$VAYVAIFA)$bAYfA)d B=dFAYRA dVAidRA$6AIdRAIVAYfA)>@ ZAdVAIc2@$RA$FAId>A9VA9d2@6=i$>Ai$JA9jAic*A6A)dRA)d2AIV@ N@H$R@ZAI RAYd^AIc&A $ZAIJAidnAH$B@BAYBAIdVAY$V@dBA)NAIdVAIdV@9V,dVAiNAidRA9d@IRAYNAY$VAXd&@$NA$RAIdZAY$RAYFAY$RAIdNAIdzAYvAIZAY$VAidVA9dN?NAidVA)ZAIdR?d >y>AIRAVAYdbAI$ JAYRAJAI:?alZA$ RAid>AIZAYRA)VAiJAY>A)$A9")RAi$:@d VAYdVAI$VAIdJAYdV@*@i VAIZAYVAidVAI$VA9RAidNAdVA9@ JdBA9$RA VAYRAYdRA9:AYNAVAYN>@dVAVAYRAY$VAY$FA9RAY"AN@$ZA$2A VAIdRA9RA JAIdzAYR@dRA ZAid:A9VAIdVAYRA)dVA)dVA$ @R@V@$ZAYdRAY$VAdJAYNAY"AIVAIZAY$ RA)VAIdVAI$nAY$JAYJAYN@dzAY$RAi$2A9ZAY$VAIdZAIdFA9dNAidVAI BAW>AIdV@dZAYNAIdVAIdVAI$NAIdZAYQYdBA9d6A ^AidRAY$ZAYJA9dNAIVAIdF@yN@rAY$2AYZA9$RAYdVA)dZAIVAi$ AjdVA VAd>@$VAI$RAIdJAI$JAIdR@y A$VAYd*AIdZAY$RA9dVAIdRA)$VA)R@dAөdNAYdRAY VAidVAIRAY$VA$NA)>AIj@QY$RAY$>AivA)dRAY$VAdNAYNAB@Ys^AY$NAYdJ@dRA)$RAYdnAidRAYVAY "@VAIVABAYVAI$RAYdVAYdVAdz@dUdJAIdVAYVAidVAIdJAY$RAYdNAYdVAid@$qFA9$VAidBAYzAY$RA9dVAYVA)djA FAGRA)dVAY FB)dV@NA9dVAYdRA9dVAYd :A9VA)vAYdNAizAIdNAIVAIdRAidFAY$R@dU9dJAIdR@VA$JAYZAYfAIRAd^A $MydJAYdfAIdJAR@dRA9dVAYRA)VAi$JAImVAIdVAYZAYd:AINAIdVAYVA9$ZAy$.A EVA9dVAYdNA9dvAYVA)$VAidVAI$RAid&A)l~A$VAYdRA dZA$JAi$VAi$NA)FAY&A RAdVAYd RAidBAYRAYdRAY$N@ZAi >A)ӐFAIdVAid>AYdzAYVA9dVAI$VA dZAY$NAVJAIdN@ZAY$FAYdVAY$NA9BA)V@Q$RAYdR@$ZAYdRA)dVAdVAYRA$ZAi :A)jRA$ZAYd:AYFAIdJAYVAidZAIdZAYBAV$JAIVAIZAY$NAIVAYdZAYdFAi>@hbAIVAYd2AYZAVA9ZAIJA V@$QdNAIdN@d~AY$JAY$VAdJAI:A@dQdRAdN@dvAYJAi$ZAY$NAYFAiB@$fFAYdVAidRA)dVAVAIdjAYdRAi$>A)d >A6Y$VA9dVA$ZAid>A)dNAYdZAYdNAI$VAi@$dAIZAYBAIBAINAYdRA$R@dZAd N@VA9dVAY$ZAY$NAYVAYdVA9dVAi2@ڐNA9dVAYZAid:A)dVAYdBAIVAIB@URAdNA)dAY FAYVAYFAId>A)F@ NAF$NAYdVAYdVA:A)JAYdFAIV@dZAy$ >@aAIdVAYdJAi6A)dNAYdJAIdRAZ@`VAIdVAYJA$>A)dRAdVA)dRAdn@Q~9$VAidZAIzA9$RA9dNAYZA$FAI$BA*@Y^AIdVAYVAid>AdNAiRAYdRA)Z@Qw $VAdfAI$ZAi$FAYdVAdRAYNAYV@AsYdVAYdfAIdfAY$JAY$NAidNAYNAij@Eo$RAYVA9dZAI$FAYdVAidNAiJAi J@RA9dVAYdFAd>AdRAY$JAIdVA9.@$Z A9dVAYdVA9RA $VAI$jAIdVA9RAi@dY"AI$VA9dbAY$FAIRAIJAYFAIdF@5`VAYdRAdVAI$VAYZAYRAYRAYdAI͐RAYdRAY$ZAiRA9dNAidRA9$VAYV@$^@cdVAidVAYNAYdBAYVA)dVAI:AY$VA9:AT$NAidBAIVAI$VAidZAdV@dRAid R@VAIZA$VAdFAIdzA)$VAIdVAIZA$V@5RAidVA)dRA$RAYRAiNAYNAY6@Y$RjAY$VAidRA9FAI~AidVAYdB@dRAi$ :@T\RA)dVA)dRAdRAYdNAIVAI$BAYdVAi$R@TRA)dVA$VAINAYdVA)dRAYd^AY$b@$A>I$RAYdRAY$BAIVAVAidFAYdVA96AYSRA)dVA9dRA $VB$VAYdFAY$RA R@$RAidNA9dVA $VB dbAYdRA9dVAIR@$!2VAYRAdVA9$AYVAdRA dRA9R@d Q.VAYdRA$BAYdAYRAY$FAYVA$VA FAYdRAYdNA$RB$ZA$R@dNA9R@1( dVAYRAdJAId~AYrAIdJ@dRA9d6@d I.A)dVAIdAIVAId!VAy$VAYdN@$VA)^@d HZAdRAYdVB $BAId~AYdnAYdN@$NA9$Z@d GAdVA)$RAY$RAYdVA9drAYdN@dRA9:A dP$$2423dS!#!22/$42B@@Sc5B "222CC 4064E!#!# "2B22C6RR54Q2#"2"?$44$345DR"#!2?C44$242DR2###"!$3 $2e45CT"#" !CB0$"cCSP!"B##!C4!C&$B55"##3#30$RVD3cTR02!"/B"S% CU!""22.3#%3R3E""22 /B3BE5 #c4b2# "21/220$RST64b"!##"2 2"@5#3CF"""22 !/##@5$CCF"222"#"#$RD54S""0!"#/#2!@0TCT$R "2!"2# $D4E!"2"/020@T35"## "2#06 C@4R "#2#/2!#Cc03R"#2!##/00#PSCQ!"#22!2."PS51!#"#"!2500CS""1 ""/C3245445B#2?2235DCD22 /2B44RCE! ##!2"2B#CE0D4 ## !"#/$ 244SD!##""""@E4D$5"!2$"2B20DSC$522 #"C# DSS5" # !2"#/ 3#BE543R""## "22CE$D%2!# 2C#CPTCDS! "23!?2#BPTCBEB "2#" #B@TD4R#$ ##!/# $$E45!#""2"24$D44R $2##!/##460D4R"C01/224#b4E"2 "22##B5CR"# "4"##PSCEB22##!!24#cC5222222/"225@E53 2222#BTT52##"!/"0##STS52#3 #!!2355D4R"322#2!2055D3E"#32222ST34R##2"#"!2$2STCE"222"2/!2B5ECCE"3#2## /!205ECC"#202242TT3@#"2"2!/#B%ECCA"2##A"##U@T$2!3#!2"2!24%D3B!222012/"10%SCC"32"22/"2UFBC"#3! #?2"T`B4C"0"2!2# $TE"#4"022"E0B4""4"#"4#"##$Sd3C"# 21#B#!##$Sc42"223"23!1"$ECC!# 22#"2?" $ECC!#3#"02#$5$"3# #A3"CPD42423"#2CSRCB!#CB20#! $5545B"4###3/"CTT$4""$23##3"2CgCC$422"B2C/! $4eCED2#C 2"2CBETC02"23C ! 2B $&T2C!"T22$#$?"$&D2C2"4fB3#" 312BPD22#4U2#"13"C`T241"#42E## ?"#$6C 1"$43E#$#23EC23"#33"V233EC#1"3C"2VB23FT33"#CB"5B23CeC3"#CC!#$?# 46SC##CC"2!#S33@T42"4022233#ET22"23C!#"2C#0FT04"42!#?!#36T32"$T22#?!#5CC2"$TC"#?"35SC2 "EC0"C#4$eC3"ED0""###A#T#"#EC"!2##!4#T#2 #S2!23"B6SC#0"4224BO!$#SC#B!"2T22#32"B%D32"#422"4?"$#VEC0" #CC"25?2B%dSC0"#3C0"3?"!$#PPC##4253#%6BC2#!24S22#C"4"WE04"!4CB2$4?!"BVE022! #400!"#S/#BPE43 "25D22!2?"#BP@B2#!"#4D2B2##$B2#4C"1"2O""CFCB2 !"$23!2O"04TC!"#$5!3B##$2$4DC#!"2C3""#!N!#4U$22!"C#B4-45SC2 !23D2B$23dC#B$$4C 224-245422""BCD202#>220543!##CC30"!04 #3UD22""2SD33BN2245E3"""$44 ""D>22#ECC#"!232C!#C.2245C#"!#"C 3"#DV42!3#22"522#CX4C2#C$42"B2$3 $P@C2"#$32 0"BN"2CPEC""#B53$#!#2>C#$5C" ##$33#A2#>C#$PD02"24#4322"#2> $PTC"$23C3#"#$2$VC "3C#$2B3"###"EiT2"24#T3$"0$##STCC!$20C20"2"NB3E02!225C#"A"## #4YC22#5C2 ###"#X40"#24$B3"2>C#1EC2#22BT230"###$XD$2 22T33 $322AHCC202C3T"B#"3>23$WC2$#C2d222">3#CXT3" 2CBUC21"> 3XS222C$d222 $3$%u0""243U23 "$$4TC"#!25C"23 $##23E4 "2#CT223#>4"2Tv42222$5B323!"3#SC#"2#453"C!### 5HS222"$52D##!2>225GC !#2"4T43#!#"24SB2!4##ECD"2#>2$5hC###$#"ECC2223$56B4$22$TC$2"2>2CS2#C#$43D2C"2N2BS3##C#%4B322.##E6C"422cE 223>24Tt22# 5C4c#2"#14RX42# 4b0U2B21#$2BS`C##$#R4T3C2#3$%Et"##C#BCe333 #$!BTt2223"$5cB3"2>244UC#$0##6T2"B#>244WC##2C`C2BC24$WC##223eD2$!#""4$UC##$2FP#$ "224BWBB204#$e2B"#%CGCB0#r4$e4T$ "2DBT4"3F#BFTCS#2#.3#47CBC4'4#d`C#!#2D47CB3Cb1$VC221#>#$444B$43#$VC222N"02Ct02B3#$cC"#!"N3$C4t02B$4225dC223#CCSB$4d235dS##"=$445d$4t23EdSc2"C>3D47T!3&C!$VCF3 #>C$CD4"3424VEG2234D4e2CCC2Ed$c$ $#$BCV02454#5FEA# $##CCD2C#25DT6#"#>BCB4d3#CBB25DDG# #>BBC#FD2C3#B"54De# #>CD#CRC3##$cTD""344#E$3#B26BTTRB!3BD4e243BC"6RDF$ #>#CC$C642"d4F2"3CD2EC$6#B2&S@EbB23CC42#CrC2%dCF$22>DC43cB3%sDR2#C44@2$4c$2"%tD2B#B3CS#CcC"$t5C$!A.#S#D@2CCcC"#tSDB#C3C@2CECCB6@CV2#B3CT3#3G44!6D5"4D234#Cc$0"eD5c"">$C#4224S3C#5TCX4C$@B3CS#43R23VT4E"2@B2@3443C$5CI1#3@C#C#CCCC$CTCEr2#@B141423E#CTT4Y4##@C243#CC4S$4TTH$##50002CC4S#TSG2542532CBDc$5DDi2.C@B242C2F44DTD0#.C@C#223C3f5#@D322>DT$$23B$TcSE4582C#0C"324V$6CS ED9S2C.C@C##G4F52A5E92B>C2422F#Db5BD4T$0B#3#v4T3T#3Dr0.CC!335S3F3T43TT0#@.B@B"23#"4TCd4C4U0#T.C@B$#$$R4d6CCDT3#".$0B"2#8235T6C3ET%B B#22F2CVCd2C3e"2.$#T"C2282CECd344Ts#2.C@B#2##d45%FC$4T2@.B@B12 332F$d445e32@C###&d35T&CC#ED2B$#3#sC2GCd434eD2D43#uC3$uF3#CFT3SN3@A7B6#$peCC#EgBBN24###cC3WvS2C5#B2@B4"4444vT#C4USN24#d26C#G`c"C3U3NBA4d26C"Fe2##Th54#@B4B&22FVT"2C5Ec%C#@C&C#022@U@3C55s$B#CB6C&2E4C$5CEC#@CCB7424b3#CTFN22@CFC#S24T3"2#T6$$"4453@D4S3 4#d5FB#C$c#04$542C6TBC244&3$24T3#C5Tt2C!4552#$424TC$425T2B244&"#C#ED243eN $0Ce#SB4D4$42VVC$244R5D3E3BCC#TT#N $ 4b2404S423%uR^#$4b3CB4543425eB^2CDCS##P3E433!TeC^0#D6D435233#VT4CS5 &SC$%3242#FVS$40CR#dT3@32324Tu3M0$0Bb&CD3%2CC#$UEC#%#%BC"52C324T$C23E2B2bC#5"CC#$S%C03E2b"s$252T424T5C $05!'B3"33T43$%C$$S52#t4#3DC3%42T=22CCc$SC#44T43 @2TM##CB6C243DC%CCS=##R8C243DC$5@C$$46!73"$3CD3%Cd2#$ 4#s2222CD2T5@B#$4%2WC"#C$4C2T2@B##Bb6C#"23D32U2@C#BBS3!#C$SC%C5C$ 5#3#35C42%DT=4 $%R5C2"4SC2T6@C24$B7C2234343$eFS#$$B8T2"32C3C$T50=22CBR#t2BC#@43EC-##$$!#C##C#4414VC@B23BD#UC"#2"$42D@@B23E"42C"3$33T6@M# 022T2$232CEES=22 4C%C"3#2C4@C##E3'TC#23C3#CS###2vT####BC2440M22#%3vT2#42C23C@M223527T3#3#CC2C3BM02002HU2242#CD2C#EM2#C4vT2C##T4C23TM22#52DT"#3""D0#34]22042ES 3$2AC"%ECE# 44VR"3$3CC#DBD 2$5#EB2C3CD2T33M#"C 5C"344CC%C3M#!#CEe"#3C4$2C4%#!4544T###C3D2D3C13BT#"CCCD2T4 M#240$vS#43CC2$DE=2#CBGEC#C3C0$CT M2#C 7UC! 43$C%Ce$ !B3Cue2"C@DCBFBM2#$7EC#@E44CSC#C#uT044S34@4=24# 28VSCEE32"43C#BC#7EC03TS#"2CB2C38T40#E2D###2C2Be4244C1#2S##7E4##TC2##C22 #C2#"4T3#$30=13#28UC$#ED3"#20=## 202CC$#4T22$23= $##(T043EE3#"C1-####2T##24TC#"C 2 22334TC#!C#2322C#14TC#!@C2. 23#C436EB22C#.2####4344TB##C#" 2B2242CEC22"T22$222240#CEE3##$2#.#B23#(3T22DTC22!442>2C#129CC"CFE##!$6#. !"229C3255CC3472>2#2243#SE4B2"Cr2$"#429CC#REDC#!$6>2B#B242#BT4224#$## r42#2ECC$"2.2#$#2D41#BSTC#!# ".2D###2C43#5D222##"2244523UT22# "C"2S#D42C5T@3"$22BA3 24C4205T3#"#!".B22434C#45D3!$2B2427T53#CUD41$2##$128TS#CPT32$2!$## 9C@3CUT3B$2!.C###)TC3CDT04"D22>4#"42C#CUD42$23 22"D#3ED422$22#$##"hT3#CTCB3!C2#3$#R#uT2##UC3"3!## 3#"43##TD3"2#.R2B##ED225D##"22.$#B2CCeT2#4TC#2"2#.C3##HDC"3E@C2222>R422#C34T 4"#"2C#C8VC24T3!##.R3B##8EC2#EAC2#""3$"03dT2$4TC2!2"!$$"545d235CT"!"2!>2B2044T33EC#!3$=41#3EC##4TC#"2R24223WUS#CET3"#b"43$#5tPCC5D3""4"c#CC2CuD443E#22#c#2C#C'PS##TC222F2502CTT223T@2"C&4#C#C&T213EC "24#"=$SC#07US##5DC"#'#$CRB42HU223UC"$2#E$#CT2#EC"s#CS24$T234T3""r=44B5C%dT"34DC"2r#4SC%#FTS#3D43"22!<CC#CiT20TD3222=4042B9EC"#$T2""C##4RC2B"u@2"2T43""u2=BE B2C#eC"E24" ##-C@4#C9t#"354C1"261-C@02429T2"55D2!#$$"@0C#C(C##%543"222=D2CB422550302R=41$42422#SS3!#($#@0C#"42#DSC2#2B=C2295C#5543"Cs"=CSBB##2#SC#"32R$2#EB#D2!38%E0C#$'EC#DSB!#C!-CSC##)C#4E3"!461#E0C##:ee24554"052D$ ##e2432##C-C#23C#E41"#Cs"BBB228eB4D2!#3'224B3#4ee22E5#!#Cs#-CC2#9T#$BC232B-C 2222T2CB2CC#-CBB228VT"D32#G# 53# #'UC$5#!#$'$2-@4222T"D3"3D#2533 "2:VT#443!34#"S!129T2CB22C5#,@0B2229eC$4#"3$RC"CC22"3eC#C3"#4b#,CT3#7T2#B"4S13" #2T"2C2455"3"224T"4#2#Ts#,$4B222:UC"2C"46s!,C 22232"32#TG22<302###IPT##"5C" " #B2022#1$#CCN ""0#"032#2B444"!20## 2"22B#$2N2"!0#### "3$#$$$.2"20#22#"22$$#N2"##"02 # #2$ 2N1"0"#"#3#2$C4"0"00#!#$"C#C$!"0!B22#0$2$S$#"B0"02 0##4$ Xf"Aˁ:-rdM{aľPa/x jñ 8 IzƽJyl}I)051,y#$(Tfh%`,=^I+TO|&aKkKګ!b!`4-z7-DwHrX)s ƃO[_#!3l[H3+$`k0VZ}[ih4Dd0 uӀ]!|r??JK^ioXt-i7DZf  If`E-%H/SHb-Jԭc$bXS['$2X&@|:q]CACq\ Mi.LȲiLM4?pOݡ@l56>~ 5."-~+{Hol ,9p4Md -nL9p$и6OܒL!k Xs݃m5!8 46X;/KeHjfoOSڱCdݤ .sZo\6 zO@OSk k^)9k5Ip3QOXc%okG(h4ײjQ2E& `;`ąh5sXM{mL ̀`i s&.z6}`W!2`un1Ze;(m=w5hWQ2?} t=rıc_?.VMsPrh6 5)<6% [09!k5cD,X'[d͗/ZW|`7 ,z_`Ăj^<1k-QxiT@?ڋp lxFH6S9!jP[^񓁵BC g-j7zہ N`#Xe4&D Ӂ'i)uvױ,aOҏ-L"$s>ֽv҇k~Qh4\Pbbeps`b傡_Ti[v]~ K?K 7YkjqyU~JӰh4HB]lX1dtTpt"'d\ƹ&›RC|o[i``N=J ƻMJpذ|K d)%AKg , c0k:0*Zov 8[!l(.PX0 7dWv=Qs '9R G9Dݿ*=@N_SXb-- ~T'k5Ԟ J9g'N -V# ɭg'Eh0RXnA&bNfF .׵1 Vp+6`^"%/R4ZǪ;p6dR j"7b*ہ!1hb%i%G_+?sdC&.wr *K0X[45T%8FE$ hkCAbp| ' soh( MrI 1gd[=YԽqL^- *IYc :D\ǭzŎvS׮+h)KB)rrv?o`84}K=HŋygZU&j&국TE Kfk@E5=.lIAFKi˓nF99錧iJ3W\mOɄ!tU&@7xL&Ұ$**fh.(1`\%MkE%GjS7Ihհˀ+šZ".;9l+E0zU:Sb%$lX(Hc\ Oޏ[ 5 K9[dx(=MTH;P. "-(΃R)-ԕ5)KhaI%mP0+G4;AX`l5˨h&$YKg ӊ5RPe B93 nZT([\5xAz1I5܂HZR LR6hX+'@&IqQa/ hh˂*JY(lCuT1f0KEJ6$[Ԥc`>eҒA X׽*a1ۜ*M "4V]v-ܕl+]5>jƲZfN Z ˘H(cb:+QꖥUbԥ4`9rܦ4pid1*!Hj\s(PHY/a"]JVl6`gZ\ZJHŅT0QJՃ E#n=jJ5ZRxR %)X>%0UPJJ1`IJ)RIPz,6W${%HX\5@zcތZe.?߅ĚA@&ZJ-m\\+S l$,FR)sb1Kҷ!R[X5kKCA'дk^攃".8#)R`R"Ӹ5*h -&“dX,q'ȁe,XIKz^JNT4낙brJ9NAťFjRO'Zf7cZ XCzDJi}KP“'H^X$I6L+*ىr=pѱM~8ؘrAv!g[T5 1)C3TXo*hZIDzPnI i(!-efXÄvS0L\Ƶ"$?3a*'&X0JZN1mKC'B t&,MmI\] bKI44BU){Givդ1a@.XMGuv5;C!T銊1Q4AQM{[:AIT?UX$S#nQx-@ԈB$a #=;&Ҙ%Iy5,&a>fK1f["Y-rx]:U0YJr15Jd2 zDH :V^\ K@֫i*a hձa&`+S@ h!Ii6Cc3bؤ*pnm`K+x&+BdI`nTEk`6-3i1qIXYtrS{JOczRƲY[kҸ)h2+1.G[%L{qD `شPD:BwduLaI"KFc̹L\JD7q]Tmc` rr)DXUJZ,m`]s>TmTUau;([e\ioي\ &sDò#cP˨(vbCBۖHe_<Ҧ :1cK:ؖB1j1I% RZ,X6T5(bU lԍ.JPn}[hP6A}Y $ m|]ED0+BUshA`uEqžԮGl4;&f$9rƭ IfhDnQEgq#@5 `U#@ncE$ű94^_p+[EZb[RrML\:>Z-${IX\)|S b҅[}+JI4yo5TGڔ*H,Ɂ{ة!cQ\SJ6%5"6Lu+rn]-Q^7GCu@1ujZR'i*T@;sS²ZWP %R`.aՊcg!IZ〈h+t-^-̢Ҷ@2jؗ!Od$cZ*=Lkk$-$vsZ/JSP{-R6-STR("!*zQ =7XtB9"rB`4Y%T](|E,_FTڶ- )JµpH [V0:U;[ FIQG)!EvLWlҼf(f҅9u] aVmr 8(UjY*h2anĪ1+R_UNbt]ʫ1r)iT;+3iQ+wiQvP>%h 5`LlToR6 2 <K RW'XmdFDz rG5KlryfBIaehĤ=*+)b+$1v˸BaSP n;kSGG1 Ah&)cI.Vvz2mq hj j ()? u ahu*QW#)$89bPdjQY[JNf)2^ ,h%G?u)K"ìHư?%vUZ#300 D DRܐKp`ޒ]f 6jꩤdzzanǪQZ+tJĒTb%h d֒RU1eH"SJƅ)R X  KK5" )kTSwlZ^#+VF'R|52V>~bkKjGc1MRm3a jG@Uid`5ZEA)Jd^1%a{_oVfygZøн2ɢ B HRJKjY'-EAJgc 1ᚰ0m > 檦v-@LQBK[1y > %31J,9[(gZڢy`ѰA)eY e«jVATGָq0_̴=Òԙ>$.ktMjkr44^" l)ra 2K(ݰQo[c%9A' #':-[n[JL3'fCVb]lBQJ5a8\Դ:)KAF v^)?ٰ1^eD8hjv?63ޤ zhʌҏ߂j`5KV۹nXdVd@ Zư1#c?htKH9z[:E#AskX0ռ:})4^Y*cVTA`l1>;>6,K y2+R&JR^k?,M2*,z:!^a'&I0KV s(3kZtԘ\&RqKLrj + hY)>j\&Vb!V-BLplR-ZA]DzEP[L^87, ɸZI XijA-ÖjУCA$Q6)<$JK65hT=YަrbR,i= lT(64kA9&aj.;Q5 tHZ*/{fr#ʀfĂJ3 T 0JQ*+cr"(7“*k[;):._B>drZr(ꋜ?"*'LS=kr ^*ҋ%+Edؤlkr 8M\f IẮ-Y:gtHB5tŵ ք,9}2>H}YE`|vK>0SQh>m]եZ1\ڷr`>8AǩS_`TB)ɌX X?6G*\vs--JաRWb?Y)G.,\l2iB*MrYr 0 ſdyf|/yκM"71)K RԏQɮ[မ,d,29L{F2[T)b([OUIMjIe)~X*AƱ-cƱ.\H0ы֘+zչL ,xr+M a2-p0kJ@,,AeJUsAHbQH[tȫ.Q2'Y_ 2 @Q":aCn[0\9IصI#AXm/之[&ը7(TP -{ c%ZDY 5$ŋc\ű{1x0|l#˒嫲,-%R`anZ jɀQq~ƹ`AMe+TbO$ZX%BFԠUI$Ղkai~7+Cꗭ[dūՂR4 Z5gYis8Oz̵ ֠Krݝ2\Lkyvvdqd* dGaZ`k.[USTf" KeZZfiY (8c+jqsUG` *P(L_ 8&lO ዧι,sMQr  K2ٱ"Ƶm .t&"LTH `3 eh 5,bMJI,-nZ@R7&T jRK eod%𴉵df|0k-1 (, V}mX$rޠi0[E]jؠSಅKuIcu~1b,Y+]Uj5j_pZZ1`ä `r?Y=wd*8C'-+c[-h3a׶GX4e}2bA?T/b)rWkh0\ Amv U%lAFI21e\ STY0Mdc]Ri(%@> 4VrÆ ?)v rƃ,qU.41r偸 R>V5``x25mdfkй,rܰ>WbW1As0Ph=u$ڔ*[L|` e"V`rI%LPe',ġ"y5 TO`4UZh4V,/0@E) ČaM0H! 1)ʝݝUvVevK$"T"&Bf7WU3STS/u2(2FR( jD8(K $8sL\"4K*/* An͈&(L֚j`H*&]Sui*d;mɢ ֪PYBGmC'=[4mSq "0D`#ii@@H4ӻwMT!) ϑ=UVMT܅EDMLLtsLCK5M?EQݮ{x INR'0[dTeriiiD{Ktѭ%F7 `DD+2DRHf'zv5d궨S=wVPRQ ]sԼOXY$'Oȟ?"}DzVfeuuQD 3fK-YB PI"!!A (R =RkJt@Ȝm"B̤@<ɉGY  "$!*-+l!*DeZ{'dޚ)rηwKeʌX0YWv+I]*UhUEX)"YX]]]X(DĄIyHD GnIuHH!U k[wzoօP(&iL7(IMU)J"H*15LK0w}ӳOVu5ΊOYowQ_m AqYXIrQaE",DXT1,]-YdUdR8$[-fejkXHD )ڟyyIr_nq "YVSLJe4Fb01$(6i=9I!4RM]grJB`42%61T0THTSeE@ 1f)X(IdVuHeDUSF&XE_Ye+VX6{qU )+5]GB~@],fhhfhvHdf`rH]dH7*DLOB! !& I$+G$sg8յDH`Ha ݭO 66CM703"=e'%bFe ʳ 4.8X1Bڶܑ8$p£#VRHY\?%fgq,HEDE%{-nw6@{ޡMHh΄m(#08m )[%0b(bحHj[ڻ#L.wW$~eebU:4X@aa@#G$A9rS rC;n(P:*] D""7JA Ys_9sswKIՀ@:@0(JJ`(5+h BV%Ud)LaeYjg3{$v*RVT$dȫwEWMuUadG=]$@g0m"UDBg4@$B@"FIb`bD%{zs{mffmKL%ɛVd% @"A5O5303suMBbBp$RxDJ%"ZbM{qdY%le,E)wUmR LpEJM6JjdZIMFE CDD443X# !1"w +Qɧ/K <3>,B;Dxi]9( ʱ$14͓Q BBULTW=ʒљ39PR"P[R,B %JDDI"&_"24YiWjK䨉,"(*R˻ͽQQrP"2dD"$ l(HPȇR D2I+)Nk) $+-m,lyWZY UB[!T$G%JV!fW;D;--YtLIQ ͌QG*]jjRa$ˏ`l43Y44a yI"Ŗ5~w]T(RI%@XB,b{ԥz^" .UY]U:I!}H3hp%1V"c9s4)ʤ6qjn2F-YI*t좢 #%!Rk- I:,QR/Fd,(&$d% pb;:yUmtHtCWE^TtTʉmZi*m׈1ȀJ*@$ٔ W Nwm%b;$"J1(@w@ԭnJ@x IVHL z#uPE}A@D!0@{7w%9@z۠I1PCK0=ɄwWs@)&$UHbcu%"AP1FQd嚠{ޖV%|Wef$vil+r"H4vr@d$BBBSSf-kM;f D"<D$3U 7wr kzw%0R[փPR]@dJ"J& cݥ"(I ! YvY*flKIVmtHRF$*QQIRi٧g\٩dH@ \ /q0 (pF*77^ݾ"X LVl$G; 8#bUUZFHDB֜Iu]AaH䘌f[V%yjG\)%KJ>n̐eI$(aHDR $3A!3A JodQh4KDYgKi!` i)N0bUbHS*BAn2{2*IJ+ qB(MwdrER I]>2v!"!!QD]vH')̂DHBDbcD B$wrι|1Eb zteyBn8TQvx pK0 1,j*PmnE{K" G%PA&%bIVrRPTVwN H&E A nצe"(!$ryw DI !LT+{rw8{]}EsWIb!IH$TK3;0WMh {W& xXV(UaeٕXX橅j`:쑸f5"Kƅ&!Q@iVH^IcH"@EUR!{HJ($XfɌZ !کA3w{]}6JQ<&"$F"LHջT<0#Bǡdb1UahV"&dgFm8ʦ&[!*T&/VbYAI&);:Tk} A!GTU DHHH!"j%@D! Q7a&: {!rI”ZTyyYz`+ZsMVEē=>2(*2* G) * K3KRZ $2ljȬaL0TDB%"Q@ HbY9LIQE"ERI̕"&ڒ w~ $S%5k歉K_JR6g9N ˣ=A !5aY=*T2RH !D/$UbaUXb&*[5ZjulK5YR[jRHؕ9ZHaQPDsM>bƝnc0,3LYdZU E$l AQ/@DKsݪY *3o̘I LA&]ٞaET h $b%%VHcUa]v8, Ul153 El-i(l$$$NSW,VDʳd@h( D!(QlQTCT}#TD@*V zwo;w'r3{sB?x mR~$YYV#:je.h2E)LbY|JJ$B0VHQi 1Tܴm'VayMZJ$&JAR3?>)c]viДMkl D<'o9ݟpfOՙGXb!)J$2 3#7$Y$ /1~;I7晢vnZ. r0 , Q$Ny0DKԈLMO][Uo$@T-H$̜[UA$2  'LDI 1 e rHQ-+]ݟr@l.[*.I@hI FJJ)) , DSsHyNT<0GnI$EU!m$HaeVa(-!"G "[9y )"֚;H I(u,VeZĈDUdhZQC 4hpPsN$،*l')23R)PA,I0DU=6MbtZkQV="g"Iax $YVV;pBY,f\Y+D=L&$"LtII " B+Klon3c"62*DS]373fxIG % AB)SRV%UHB*n"BXKunޥB+Ñd,,/ BV( LL,J@PRB]k[B"D*@`{*C!Xkkslڕ9Vu':OndFDE=ߤBIL@D"AcB4=*A*w+[~4Ki8M1BX[YIL-V\PDKQR՚A *H>}hG֏WnH4JA GAQ'!L3.#1I$G$m 8DMipZ9Yf\Yc%i$ L` raUrT"ĪEmmf4EUu ,/JBA$%[,Xw-VG($6e3L[s>D|HQTUfiDH#"IR^$A#sqU #Mj7s|7ZDХ)յaL A2t$ ! p-b%U D`-%IH *ʛ i#.**%q*P( "B jw{#Gv; eIHFI%DRbt $BB:qήc83a!% FtizJtT׫3Vb}$ՇdA@ !^CYX%Hb^emihJ!MHUZ5&Tdz$"!ޥRaRF%b;(EbfiQȒ*G;$àBzr&)kgKR_q# JP=DfB ǜi n_&3$F!aL!phb!TaXeV`I`3H)Z%$Bm&L:(Ƭ2jH$ 5$A@٣5sVªHGXU]Ah$2DB0ASxI^I"I- dVEԩ,R#6"S02 ʔiFv02D*B1,==-F ҭ%S${aMAYIQYRgYR$ S,Ri%&SKKluzwwXʾ) HȆrjw`22G1Ec##Lq,1$C ID:2]3fªf-έcu2 ^H ('LT=M33<Tu J(1(FDD)ݝgY*c(1a&ū{cXs9"0dFvi*e4d ,;4DFP$=cLD1$0 D=NB_Ckjm -OG*e&TeeYw0X "QDL٦g( ,.YYJlRA!yR F1eB1'o~ f(k\$D8bED H Ba-v h@ GXUR"aabVzhډ2hFt^zٴJz$[+ @2h$f%ѕEj%f`5ΎfY5c Q%IEjL"C5C s9'΂&gr@fĎ|؀ ƌ#`و"4S#C"I2R3 1SVmi.I%`*"ҥeyk}s]XQ(X,UP$\,K$ERRF2XhZ1-1FK P@ z͒ޚiQwx^eemo 2P "7h`@xDK3#X(ց(!r&*DfB\BnK#t%TbXXP1RVEWnک-Q$kHmUoㄠ$R(XjBQ$RvUffnI0*12jJ i|ߞթgh;:6 K97:3@ [212" A8Q1@:ȮGmުݳmy[(./ $(K4E]0K*, B@H5Hn,GQTRVԙFdXV*APĶ)$`])(ٚ6o"y/|gs@ $#a Dy#DheiGBB$!T2%1|cݷmΚzDǴ2b)10 &׽A(H'eb@ Ѐ[,K,ǻ̱h4ZdVD3*a^.j⦭j`ɛ\6OQKH iBJdW0J +BI$JZ26Jjvwn9ݩjbJX rhT9t3Z IˉXi"!HIh$*jI*UeēL= DIXF6e1cHaDLR%YUF /^]:汝Y2SG$tQ Wq4o|@2 ğRsGY4j9!XRDQa"Ue5")qkoAD!$,Ѻ(- /[I%$A3Mii UX#FB0YUbbI5TD?+ h4Q/ wBխmMڵh!쪳Q@@ -Q1/ FD o<-oU˿b%#k&KhscHeVjдH"ID"ȒFF(J$ " EK $S1%EBҰ-q8^GU̓QwJWUU7/U@7 IP%Dfb`dv(xGݘ 4ulsZՖW=sQh8Q%Www{uxom&!""h2VԐSV+uDša$s,, JR̋ +X_CƏV*ЀE|O?]VfIYw7vov1j5 ]p" P"d"BH@aI @D߻6誮]uVS[&DȒDhyw8 ꤄KYI",άJI18bAY/vI,̊eb梖AAbdY%VF$)2Z,+NșwUUw`5]^8S0I!Cd̄ULO LP%, GRDGU;:ފuݠ$0zWaS[EXkm[\4(*+#M&Z NR1lJ]Al&l%dX0mHX{uHI !h@.2[GMEЉӭdB"tb . )sX 8Cc7 E JD|q ;)~BHZzޢmݛޫzs&A!]yS7T=mmPA;R0IC,,Di9WR#*B (d)XRSeVww D`x3wEZB @/HRֽkB|jJ ̬fd'LN T ;K>gÐ%5HhH!"oimr7fqsDDD # WwYxMSM%'ER$q&>UFqU:U&ZVfvguҙdQmکZ\bbi#YYV%[M Yh檩 d@k5ZH;fO&DEYQGե V%e"URLbs ?BA%"j6]ǁ1dWb:"$,ʩ$YPRUP" %EHm҉`Qad\$(/63j0mf$;l-bXL"e*To" J3J9<5z+wQ!IX%CC%>"X:Tq5SW;lې餳IF0dK+DāDIG]2 J5$G#ek$E^9kko6q@WR$L%I,6 AbS9RRfnJҊ40%'QgJ) ]($&9 C2ێnUnY(T+cd:AQ20HoEDc((%zI%nֆok| !JDBD1 [o:R12>I]ePq4LQEU460cJ-`40wZGfED$R" 86RJDQDu[mW y ӫA۾uc&x)=SZXq$$Z%+fe cQ)XvϧJ̽L͎6N l&DZ|$+| D̒ ĪLL 1HpUj_bm} C1n $[iA&X%OdYkU=:*v4QQ$T"ERXȢbUgEQE@I".˘LK09QWEit DZErAY(SxnA!"HIDDd"HDRV D0yhxR P0Т "Dٓ%  \oS1/. ikf։ "D(F e%jE3EUS"  l~ ݼݳ\r%HJ2^f% @Q) 1Q-[MM-V%RRXIJmm{TM,Vg]U)*i3wWUDRO*"1W1+K3K1iG.qE땩 A"D]YսP$>6zH$IL$Bky9]б(R2, U˼6Te Ԋ) IORFia0Q2JooSV[m4I&xf$nX.OJXQE9($ OΎB!JάH(CB0@"C @(%bY %YzGqFiE\ͼD݀%JNY)@}lIQ]H*?uye"3II!,MͽOCґ%fMM_p_&U3U4JD"n.Х+= (DBI yi_=Ck 5Mcp2 0JDVUջVE$Q%8Pk7]QU3Ki)ΓԀ("ٚsQl@" dA g+ 1$3NW>ws;< WDCjaa u֡e+ -ֻ (%H̦F] nDaed l٦! KER:J=zRWSV%vI*"By tkVj[;C[ՔҠ. GdF 9eT(L /8,3$ JcŻ;lԁQvAؔ~}ؙHT :B'^<,@p$ N$aA;vVH$ӍB Q)hzy&0WxxL O" 3DTH'IIA%/O(΂"@D1đ 1% )$$HəyNT;4D]zYb}MʼnM[]A+&Q4U2rGj2$!CEyT\R]Lo(@O=x%OE9b3 rFtJLEW!6 %&`YV""*HLgDy& 78D220A![%jP"iCY\!R 1}&rI-e["E xRP!$۵k fRI&w붺Yc΃`WMnh@V+*Jt:J"(""0#̈NQV)(DT%K $D14DDJI&TՒ;^#*jJFs4;hpfG4^<^- Ih.?uHQ"'[) &@.7snO6ՄmI%MYv̍U8`_i {e.=L`d)RPJQ$e"V"Hg-v}HFwu5k_.lQúDJJe2ZV6gmrJG,MJF>DU WGڴIdK,I( @ibVzǧuWT OS66S@"clD:.DJ n(ӑ:Ue"%&b"%Tnk6w}ctXbC1P B{5Yyxwum?-68`e䖘H)YFX2HknrMK>zˬVu4  ˮYre9ޑBg]-%#^`@ &Лo &Й%9)BQSw\*(o}UgWΚng]YKN)iG2B1-DB)(LDLRcmK3[na(vewffDv_SUwu<)6%Uܢ3 W붶@ 1& *$I!$BKX+IDDӷ]iIԲ*"<׵gX/33?D4"hdi*$0"$ht@,MD$(.,Q+ *"1*]LSm+A!8hfg ڍPE ݝ(++]Ѷ 5u+r8Q pA*JP!"RB>A"HDm\k2LF`F$BbE{V]w@Z,24ĈFXGLA2[zI Ҍ1KB.ATMӬ$Vwp!V(]&`֐ ~e&ebYYec{~ﶷUT.@et|AQ B  $ 0sn s>K+ZىTi @ũ8/ ttSPx8 µ5NL)[abfYbfZ%6qFTqbWZF5*Y{{wk"&FYYia Vθ Nk2:VbLvIБO喹bT3 Ҳ J&ЩLȈHDjwH{-YDH6Du[7BB4*JfCnt**EADU$ n5[3wzkH1515s$ B0ޜiuʩ.o쨲ly8*DOiHA΃ (2oAnfwmYUF LCu(3devz5k@BpI)TLUD\}re$R%mFsGTelhj$ v7r,J%,o>  2E2B H4g2U4(_M -jfKV cgQd@@.0ȠFlBB$ұ${[Bʰ$Li[DW "wheef}#װ e57̠U EW5y@R%?-3q3dAa" ثX]l,$i @Th3'5KD^A"i"$d%xV@(34ѓ*Lh*4I>Q0"yLjgP#e4&B=[LD4DZMllܙu%V3A pR bh+nU5T@$ !""5Eь+ 9D w^o yE!DITl)]XLrlPu'w)MLOߓ@b{{B!!$xuLĉA̿;sk6rه,  IE+[39 M-@A" 05_xݝba /qĄY`tU$SqM٢ڮ*ղŴl̢puRe3Iu͕`Xwox_ mMS {zA@ L 01l?)XiâPH `@䁡K,[tK0ªM5{1F%"H@$;6sT7ߊ'q1d v eR5KNšji%uHPV(K Ej-͑Y]A!T]a[nfFW%mYeFV(%o 5J9 X @s1Z Td[պC"JQe^L˅y.WmUq̃0m#ʈ IM;Vyjt1bYZUIe5MTkD$irցmGԨt5Q b$$j"(4l&%"At &hovѸMVb(UDDejB+">A W UVfM 6bӷ y~LʑR[28v*)a#Y*` ofg"0DMmeܓyI5m vK#\(eknȲbB  H@<@ )Sa??4̓0I P +B7=S(12PkֹVaaADDV",0"$c%:5 BudBƭWӯuFvVicFBCuFjrG"&%7[d1eV%޿A̐k;`@ ?_'HuYgjP%DH~l0k:9>~̂fiD&/%V{)[U09fلiu(iwuNbPdML;obV)5KP~VihTJ0N~O俖KO俄:AAQ!MkHDHDLkQ$[,pC /Ő@B'FfkI P`)0ZH@ L$ D۹hxQaHX6wM室@6gPɍ.󄁠sІuJAWT,N aِ1ۮ"@ݒJDCCn8(?[~oU -JīMi("JAgw i![9ou,j%UFۡ \ sP,k5G`2 E4ɚ;mR&`mK*-@nB숵$&$ rajIJ!ږ]m @ۢ*.T7k R0k $ tx!zkM,fm'3Sw/" ƚ {$V@#h&ﳿﳿOUuHP(A,~TBȈȈDH zi* -1hȎt XA$X)8gJ*ĨF5<]o2Y䦈!vI2)$#&eԀa.ԗ\Zh޿V 6[E$dAarѦ ]3DpDL b2RQCR}wT hbf` Vc1H n>Lv 1tI9OV&!p0D 5P 4*B7SUd"(ISt ݢf/RLA3LM,a73l x(ڙWnc7TBѭKl [Q25ƂD ,'om[!AnH#<95O8㡠HM F3PQjVEF۷DE. .wl9mg=8-P/H+K"D̳V %i EnL.U& ϮIlJ[kLȆ !Y!MK "BHA8NwXiVV 0_-k{@$HMR҉A--$i Ѭ,DӵF/lM2ErVfA m/3d"zvfKMTV$ͼ@ %YMgd[fD"&X&ԓa:닮N*I NJ)nwm جk[qXh%܂ !cb&$\erGIG*`n)WH&cHQqkZtޣ*Kn;,Q UIUP!s7LGfUEk5ovQ&MէURuO0!!$T.T(Km g0i^At)9ҕww()HFOB}UuHq "U!wS.W$bXܘB@IF!7gcbRRI"G1*2Ml"xB 6դL*u#ޥsw.9]Ĭ4ZIT]g$U7P  $HDYS i.T E\) @|B%Iv@wdHQDʥgu ԋ Q%eUZH "&b*A67NW{Zzx.hf)-"b g@Hg0*G7E&S3ՌLA$[Wb%SY V"g M5_Xf e'+  &8ғTDˁۨCzOfzI`ru!Ai~N 7\Un Nlzu֮m%vʵ RխKfA0/,54e![){jӒR'YTBBa MEw*IIOnfU+`WCCZI9FOuMJvϺCI/D"ILuSLԑMpc6ZBXzVvEAvd(T KIM$I #CHj"(9&vj:g6}6jA"afM{ş ڰKV,jAk ̍H%"#, )f[;Wu;2 nPE5! XYUh' eVquԁ0U^w/2E[X!IwwcB@:F(#7D K1(r8n)#K*jg6oD} 1.jV-J.x%*NT"Pcea cԳ3KIpmu;7iZiRq]H(¹ zM$He9S9#9 hS v MKO{-A<L"E"fz[%喻]@Y=gџF|gɟF|`i kumBb*f"KYt))gO s):Zs6X^\\XZX`ĩCX 2˻ (-,9.׫l(ٝoDߜm@%%$H Q ((y؟IK ö́~ URU]U p=]Zyw.쁜B@"E 3[9l䳘c8Ѳ&ffiyH[s;s;medlȌ JE{҂Eiܕ֚ D5*$CoόZEHUvob*5Ld]fղ o#L$c/%6I6ۘEd&dTD&2-bG+!fIzɽdQPE˫n-A{׹"cT ̬M Gi"Y@iw4d&dd`wBդZ ]؈W$ 0n$ FAǻ|:,rU%QL+K(9lv_XO(k(2"] [.-]lSfM]Ut=qܙJdɄ@`sD qƖq,L0W "IF%4A;T Z @DE2:u$bh;XN (hr l(amݬg'I5)؉Gh!!m^VRā!?@d&܌emLyϞH%%Um@ [ Pq垏 U!LkE 5fwn ]TfAU -,7]ueK7ۑoY"15HM5{!6aYS`t-7VB 4hbb2oQI4`҈BF6ED7LY(R6܉ďzvVD2 _ ǀ0NK- D:MeGv4 b MQR*QEi߾Z#24#y#lrUb^C];̬j"~k@ ĹC nNξuytLqM׻ef&d$)(@@z2jګu75\-!SMWT7eIsjvSPgbf)H$߫&iFh{ǻyM٦!ؒ,VLۛ׻ݽݽ@d^PZ5GqS Hμ5"FͶCh/ @1}g:²ZM,I4ӾnkUm# FDՊ6]EWu$N9.㭪TԦeHfHa=/0H@ V5mg]heXK$*ܫɬ5Yekm&*;1S4PB] Q'H&l9@Kz"`r|#M8DL* UAjMoPwvIns<{;4B5Ge:K$NNS *۝B)!VE륉h;,(dU͜PAپ߾X С&0 `[QnJI( N0AˌLZYmM#"mjGmP+-bmPW6S:De/Dҵ)pǷʱ5i̛0q6fPcpXb"%Wg'jBEkI18TuǺvۂYda'.3+;wuV%2.ުǁbF&R+ZhC_۶\e% MԓS\P"+34!Ͳ,RǔR2+0ڐiIl{@+X&w4E릚keB #Ԡ)rD.eaXaal)s4bK.{CiQɪ ˬsZ Ii[5L _}:&DJ0;S1hj?B݋!6JDDUSQjT\C&EppHh9`w+yȩAHVgB[e$rםRgR `,ndiCsswsrnbk-lӡf&y I$\Q"#+͒!!#g*e=0Dfg˟wvgE})-%adbUbQ[ImԀ {(;t9nx+nfŵa ˻˶P|HQWGvH2Lka7D @$j$k-54 %n*";! C(ƖW H3Dr`GlQ9eT +& Uz))Q'*H whk\~:auW Q ꪳJ{U@0P#y qS< Z*ddQBH% pAXnke$Xwvp!)w43=+vLS2 ۼo\jҳD w03FɤvM8XU, I[(3uƣj["(;}մκdˮ .ِP\UٲjP"njo.2jPR$RycTwGd[J& &Yl n4A6w<Ӻ 8\ A7ZV2ybbc&%QR@HHSMM%\x5j]f!aY'@E7F" $F߉!'R43 j$UD`@#v${M:KE")ݥ0UrFDRb[b!hႯdB#XjdF[5B R% FT3\̑"7&eX!Q $IHQZP$ +"24)3D:^Ra""Q%jr:쓹SU(;| TA -B )z`uD15[ҥNۛ) h&iAD`d3Q‘ P6-t pIQ=rWRss3HhDT;=O+mS9xJ0I2~21S0,nk3E4 0 Uf1-Y]&ffedU&/HKF<两 *t+;MRDQSS57@fXɺxt@gHU*0S1ӓA$j&TQ NC}<Ne^BԔDFK+5|BKysFK>HSK%3Kl0"Gk>Ĉ[L#"4+#)"UEW,9!&XVIl!_W_YdKAH I! @ I%@.]/ s&Bc Eb E"lAæ@4LNT,ӃᛴX(4 }WޢtE Ɯzze]`Dۊ(޲R(Ik7~c]kN."^*M M8I&`dvx 1 bQhH@_Q @QB- Cq@)flDR@ՍC($L/\-fXQ/Ie]EDm0&(h2l9ͫ W +*3 9NQ,$"((1EeRZjVZ&߽&yyw.(u{+!͉G:ү8ЌZ@Tqf!PՕ^>H.bEdS^~{ab$۪%$RqHq2DNʁJ(A(]XJ`0:CD$3`j)o<G\IQ"@ZYiuZai>RI*n̽ʼDE463u1W@:&* @1NBg9@Yai"-Svexy \25X跈vD7j ].<TNJ(5Fe  sX O^3j:e^_0i ]( @ ͙+5[ҚfqH̥AD<@YgVYgVzwofenidtP"""#ȸ݄&aKHDo\qi74h*p!'0@ 0BVeƙ&F'nU;3*n9 @B %mQ'y ͭ}fД bf fM2m"ә$wvs6 rYM ^ mE"* mQ75StP B""$eA`ciR+HFg(zDA&n`TEy##S:S}DBE,Bi&\J155|JL0=4#h IDLu2Z- 3bXn%a=\ LZd) DkU0ls% $YAd哖PYKMF5\d˹2r8l0% fwywvt-k[6nNܨM%6ƐY'iKl B &z-:Cک1U"m UJ$]PJtq\Q$SDt5Vu\% Hl嶓vpCTdѤsHf6LҀ x|f˘4EMf|R^yAH(A-UiK .dc^B9W!B=N՗ vo sY&Lֲpե零 %7lz!8MQ"| zaMBu ETӿ!%J5=R #w5y!Uuyr6ir:ADCd AKXP!"@'dWhPmAtfҒ`m ǵk107Nl&N{RđI`BW HZm$T׾AC<f HM#4B1S2Ph|:zq.(.#VvqjvQmime* ɹ~&lYp%F,RM-Gd}C%DA 7Za(J$ĀMEq|I>cf[l^ mkE_d€4oMQ@K}$\{$#UN93O'QK`@x҇nBj>jU4ѫFpi*jyvfXmi#ju 53SS-P KmZ9N3X݀7273D((%:THG%! @R8;H]UUED_1$ eֈɌa)+aCr`bVA6=2ܖDXunR @PߩLRt8H&M.g*h|<dm5s5d[V*^M`6]e]nfVHPݍPQEHvF1H %@y$HYB Ő #wN L-],I((f,]svP7Ev٤ؐe;dc E; B}|ΐ)0X *QM xxvd0fE4Hg5.#@ Hť͑>LČ $@mDlڑb{*|TT[+s@ ̼̀-heH WܮM&Ҧ}0"9OȒ,@ [+fzYWT(mWF#jd@!ZUKTDTMu"-NLKX<TBcBPUDw}h)Ĭ aI1U]e`-eWgv+zoovqb\60 1!+a%]YXL92vmF7cZ`*ny$Ġ)O9>p!ceٔi&b@$ۥbku_-q @*'TV-t8񀡕- fjGetjH@I,ˌ$&Fd|?ߗ$$Vɻ KdF]n^N&i \HJ*Xm }匥ad%lmE'( ɹHŔbDQiuwdXVZ9$ k F;g QnsI)wؒvU}g8I(+-XLEUXcTfד7 (I#B$g}mBSr;I$REI:H6!+F4SQSN3wwxI5Sa6qBTJ$Shmߪ*OęD$f%j3fQ+@@f4!ICS,5LLù@u4TrM,RRb߻UfqIȡESP Hn VuRADCWB==@;m4l=W+OMVMHn9xQGz<Ud~ZֶʼI% ,WOLF$SZ@^ioԷD*buwhy5&dhi|T4ߌA%-#"8K.%K6m+p@#3e{1NYu+lzw2%Zi#C=20КLYwYZiuƢꋔ]551U!0õ.[s6srrAjUbRYԣhtu+ ;#$X8t͓6HE4FQzno,+dF{VAE&"AˤYv[Nw쵣BlT,9Pyœ-;[< O?T͋#r8EMsgBQD%BQD* @xw1a311@un;׬H xn'ڑiPiDUoXƠjidmE[lP7M (wdP![mvOy@EV9re6▹׍CQPYQab , A'.0Cw}c[d""R ИԋL̻F -y׻ ;gM(,UerMTe #2ImT5@d[a)UT'+Q`dlU#iłMqIu̠O5RineXIp  2θ,τ+/$nW΋-mDSz0j;P1@ P:"&"]!V9DLLDve"I(3aJ( ǒ=V I($ܫdF%1 ?-l_RİAʒұ?3* @Q9yr@f;%[NF؅@ si-{jA'i80 dӫ!)˻(  DY뽑 q*b &W *3> ֟Z}ȟGS@K4p﻾w{sz~bdQLH@QCIUo _‘tڰ- ERH@bHˇm.-9 gb҄^Ԕ]3`.ɘ]Uɻ# H*5taroFd6FRE b"^$FHZeN#PkycX,PHZvg.l HV -i$]ܵ ySDnQSuf(7 (/-]{keT-Mrٶn.B*f**f\7;sws{f0Smv]ki yY1R)J;,H("\Z[n6nƄf,3$5!x+&FCG {Hv HIUL|PA_Ka5h }$Ԡi7Sti"A1% DAp%b@ff8YIE|j1f:Ե 0({yyۻ. u%ԗZ]]i+~= wUUw0*U!2U"B.@7͵6ݭI d5#(qI2˚rbE$(ba ۤJ/Z2)8(pA2  ʑ4ѲDD7x5R|hR1"jY,UUhE]f1ŜNEe(   X12mMUMUU\ܱ@G7u9oξ<igwwzˀh6z0\"Ltvm[u-g32oL )`ׄj&ZnkyMR뜹2u JSʼn똈b 9clH@cuߙ5]BRq2+̋-&PQ!`9&&9j x}[fHJ OrU [԰Y\T)PA)b[&S&u//255QqU0 dLV!$R -dS2̤<óͩVBnG"8m *Sm `x$5\s5+*o t4qg`ThVEa'feJ414%BV eoLbX4 6<꧆1=q`J [i2̶`@pyi<I'zI'X4T[:kv01 SU3Sn1,YP.eX3"!WuRYGn77ՖTRq@stUU֛Iip$$x AYEOM#ݻ@F>i[趠(*ͱ@Dkj+;$^G}(F.HԊ h0?6Z,P("ִM#n KTD\LNӊ;N33с߮Dp# @D"@rĪ_ܠnWO-@ r$vloՖQC"y~5`3fa ǔQ7 M(X볃 (~jjy%n4`+ZmeTHuK^+ -K":IPj2R*@2MV\HE$\jE$Qs1(b`U$UTK,W` J)dD#kGfeeBu!)j{ Fe]!fY)-),{_/ZUSJBbbݡbB X1¸Fx:eLHw Js^FHi"fI%aeaܪˋ&%@Ya}髠jN*T H- RQM26鶆MyHp@Q|%_FTBDTT 42*4&wiX1Ϸ9e\TNtm2%/]Yh-q2iG1F98+ xQ(Y#J-W(6AZtQn[%e` 51.SKdZ` mfpQ0r#t 3]k6o&kX8$A`"TMQP)f2202[uWn/0CoM(E_Fh 2 a]dwA)^՞kM 18Zh7 \d6FclgvUG:>q9024?D4C}ٻaqF7hݣta"MOm u!0181O T(%@BN_J%I%n@MF"e*) 5,G,-4҉N2 rq%2z&)}V5I6rfL4FQ,TQ%*1 ΁N"@D!FYߡۺ܌2jzC8 Iq3353DL03Z2 &@ ^ 0;@ %k"DHm2)?8.;5S9Y_sSs729;n olT %dn,T ޒJ9ٟT갰`ײ+ 2D:KVK:FIN\L#/ɩFb\[DLVV"'l6>i.PYp\,P$BJ@- ZȈTKZdC= 4CVffheyw@AID 39u$%1CMD eYc J&bF%)[ $L@sI"estPE (M6sDCĨ8cCNT4;'{^HiC߫= rۼoMk0 !w5:z?')*pc-`1")$42 UyyyoYZUXb(WEAE ՐAAoj7swsŽȔPdZ:f]]2]L¹,J0MYePD# H(ڛQы’ǁRE3$j@a#(u0όU @`SVvJ5ZؚZ$B 'ClFjR]݌@@`@@i-, nvmgHE!JHD @ZSC<; pD*Ψ l"l,ʈKM-vVZҖBFzwi"B>M\mwNsJ I,M,bܚ RdB(nnQy}/.䐈bj< ("L\DEfDJ|,{|0@ATfAdjPQ9I XęIZ]ٝۃQn L0ݱEY2ewͮ:SDg !=0@.X>D@+BS -7}3C"UR!4`nu:++N ;cD.b342FVd[ueQ{E)$"P+I\ RDCTU\!#r71mԳU<Ӵ !ro| ( DQuEI횷 SJָ$YP=.93uQVH)$9q93.r1]TY$fj[G2H1gvZ[}d4V[kZww᧔^|lJG]Ik!x @]K%VK=o02 溍L U6ɨ`cۏ"YY`+b6Q4YSXY"5C5Fu'm F Mvh"ۏ4lo߽ S] =#5ݻ.@3u @"dUo>"߶H-[`Bs'yq&pZ(q'1 0mۭ=Y^z׽Dx If4"XE<c&b""P@k{4Xn6ǮiY܀ T]tEͪ[(ܖb$7P O0@D3Cda7VSjr&F *݀DlKB*)y1UC2B:q"@3S# fwq>NzkޖA"@ aR]Vl֪RO/ 0Iw{{mO f4;( 3,HD,E2KŒi%Yw%YR[l̊F}3ǯJ}2݀Pf*!UMY;ь )qD+6GՋL'1*d qf(r@ D %TP.:yv󷝽 6B EPG,[fQWzICDȬePiӲg.@&R QA*Rj.Iy=Ii4m,S_lh̊F@S,nI: lY+2D@bnz  G XAW< hmU!+]" 0!#WMCvi~:a *. ' !엷 M2`(m1&8]8M(ֽ0}$DYVbn,I {Pl#K3$3@Q@;;@HyTPhb`Zݲ[g;W]7[\[@THD%:ov;rEL,WRNL\CüTAvd(kC5..I?jٍh=Ι2L 2d.B;1D,Zk aZy0dwJ@ W+WWU6$*,!kR_I萐 -{ btRa M u wxY)RPPynlĒɿ9RW %ww`cxc,ULJ 7//@ @;^𗫜@Ĉf+ sl9X@g''6u:lr$e"YȀ];Oxސ'K4BHAd)-[Bx\.\&!>DH a5Ѷ"V( Έ5D"RY*Kߛa +XYiХ9`72lF(r&^W_"S2B?[fs6ASO Nŵ`B&[wI ׹y b&$O,bR. Y= vUW:i!Yi=H@HDYtooQWaHTąpQH]Z!!X={ALx dJ=GY!"EH qGΛ\ RSn'VI)-"m7ߗ J n IYa }s}`F-k-:Z6\8! (hP!Og$,Ԁy"P!6JJI"j(`$QE@D<Àhj)b\B 9bB"lFiu $TaiIy"GL3["0a)0y{yw:wW\!L)i޸ C&AzUNfm%$FE6U6d-(d)[5mm|L KN[˕10$$ol(;>6(8d,YӑD"dnL!>FMpzܷn$Qd($4FBqr[-ov3o@u8|1JtE7mZ)(Đbbb|sZS C2 ;) K)@._h`$tTZ޶Ͷө)58䍀"PpmQ&SJʖUN -[)4=CK3*_h;=v P,I0%SA9P EJuUS7sW 5,RWydX`}YM}kʂui kIf @$ eXpm@Ybv"$B)etA'f$ -sZDU DAp>=MTpknL #*SK{@K&e1ՑUr I$]R$Ajmwy{x ȱ;A]]+e8 @"xT eEOԎכ5&Eȑă3!1&FnJhA DWzL2.;66@[Z-ͭ`7˲43YXpixppx23+b$&*=D*.L̽DE`;^@e;-ٮvS$HBbD5zm]e]JSa^[QfޔqG ˋWS^^j(DP˙+-HDE`u@"cS%~sߵڠJ0=SN}8"m׶@)Yn7$l=򐞅ÒӤÊxh )0mʬ y]e;)Nv~B"IudvhjiY/ݿm2%3TH w,k*2Apm&i*ЪMҒҢ "o0w5E$+Aic 2ZNMe -iDUna]ϏFY%]4t f[֗)j߯ i)$KvK׀AH $ Y=IH)Ū MJ]}~}uwwOiTQ2[D]Uoό> a3`=A`PeJ&eI143]S- t>d!:ܚB2Vo;ۘշIʹ&\CLrNуB BZb|ȈL$IUv9e;3@$":RGR h8V8R -6vMf(DETD@TPiA} )¬"P7jBed Z1]M5quH^ wWa3_AԺϓ@ FtVEݭ(#m0wX`&2!"9POƛeNvkξQ! r"$ƀbBTwݮ f5:-ld#AU8dR r' J0f`êJFפmBgoL,ߑ7 'qqdZRQC5$bm#vlJ2RI_Yccce>㺺222XzHHw爄 HD!J!qL^a! H]f6mm䪪cZֲK$8ZY$"NĢ@oHcz59Odr4A848rXHtK$U Vi$yT&E4gUX۹\3 =VR.)$ ޗ:@I4J ugv}HR"SDd:DvH(`aQgd^! zJ%Q f$L' beV !%_6[,X&ѲTP0O4#tdu!$WnՔD_N2"^׮ D sYq;{BJ sbRio\)tbE9D!E#1!00uiZxxP$" !H@%$9(K^p6P,M5 Ul% 2#8c##`Ps٪hq ʫ5R6(¹:J h-}AO΄C@xT~A^DM MQ#JQ<-9)wpx$ ĄD\gBOn[7ywwUxom*&鐉Ȁ`(q+n/7 b7H @!iF- "FmH&P /U-l7-,Lj wSItlShk(*O$y"JM>A`'FgfC!HHE`yABhN"cT6Q}mV A@&tPղbYB _ۓG$)Dp㇖7%JV ģ@%PdZš |#Q$h]  (D'_9 M]+kme)4RRɥUYYV9M=k=ݢ" !UԺS1+ Ҍ햽.;$JqHjM xu$6a>U)&WiM8z6H#{HAI%HksU@yLU;.삀W T+/I6AD! Ǧ ƀBTV`Ҏn8V!AAݯa0L/% (1 RC%Kdeie:2ؚq9qYY!U&P<HƬ%,Z[QM,jHk 龒 ʺeu0&hl yޙ#xVQB%i.P*⻁@m 8QieGEa- q-*LZH`Sˁ2+*"nog_gd bL%|!$#R!MzUZUU=Q+ZpD&:Q5*mtX< 1\\TQi)-{oF?p[vjm*&.Nkx3g T"P%A%J $a_FIJJ|UUA&$TlA"ꨌ*̢ahlj0e#~6wh[`5}H Ffh&H IQUU3Djl\$U!6pt4h0>Ran $ŭZֵ% ZH$I 5Y8SYLy;| ۸r9HL vXZZ^ E@XF $BYq2(48,vkvuIJnܠ z'!I0 m]lxU07黭vDF9+:Z kռ]p e{gyJV]]3<԰wh.eʀ*l3[ە f{XY)2XiTXP[@j:Yɶ!'La(f!)",%)$S+]XZbI_DR!35#%AV1DDD D Y3[sO*`j>醳)DkB@EDbÛMUo'w4 +_dN`a0ݕxHVBY9B2k/a H%?DEieA_gAIhvFdj drBlt]oX_ee9 i',D0(C!(ӯ xܼxҨUAoEg7ʼa&T)V\i*#8n&lU7{IȱC8Rye M4˭//~[:Up!E$x HA'IC Ѷ]u$n9ž^iBKhv8D%8ɚtE}S(BGŌQ]kf$ *)jԚT Dۅ qNKD6X!챀;39dBIe @9(+n\\Dǟ}}yql7kZ4 !M$_,Fm\ B'&Ĕq.IM^7Q'#deQ\ F!%9G,.._>\dnMdj)8dJIG(YiqQ ]|K Q*K3REj I%1mfjeGuӬ59wJsrR Ljk eC$y0-taDhf/EU$ sg%"V.pE0vۣ_'RډrLMr'@ 7VzruuU<Zۍ:&>@=@,$: "*n3c;-(Q-7ހM^LeS9qXD!=& QFm;өB/W=MC1% Mj U͕4Y?+ cSMW9\40l$hᔘlu +5fPH&A1HiKJ YU-MA#0 ؅m}ޣщܶ}5W-m[t 2<`wHŽQ(0 ̈N k猰@@ (@ @q\v뱖v5\:6UIRB]]2I\hZQ%)qFM$[%vFB{l`[dtjVGE1eYxJ.ka#$]" +3ȭT7(`&S{}r ~߇B3W8`@3s>taH@g6u EɵJw@=g9@ 싒 \qLs0%o;[Uu%G+޶aV<1Cjӳ [mR1-41T%K$-YQh\=Q &c$"E,*K#DS;+5o $/YC2=b`hC3u~(Sܤ(y2J Yr_է'nPr [ZD BG3#mDIuE\W-]j93Ϊʹ)=\' ;B$qڌ1Bv,2$FQ;"xKP"? 5۬}@Op&.ieQGnMQ 6k**H`U_շpp$("y-N'- !O@dXp22S%63f"iRf9H KG ߽ǕVb "{/B*,=%(FLDMC€@n) MuݿKڷ#hEM2ܷ k\b_tL L**c *IHDlN(SՁ>TdHC1_ǘQ{uIVEf/s"Lr좢9)N,pL jehYX&Y%n,ZKe&i;$۫r]ognzk@L\ceJƬckf #mLh u&i&4N{>7@f){>&QVD]7,";tM@!&gui"ALTdd-6XeיJ"I )D ݃LhWw:+:$INS5 O 0h1;wh(9[!ml9qoTGj.$He7ťG:p4 'vW̱4 k36*eX2ںy%ښ2͉tg]ola) 1!0n緛]6aXvD [ny-P"#Hv,2%IAQp(ew~ba" ׽s0ue{ V$WN6][Y E(1W.oQh̠I4>@+]VTe]e^YP2؂A D]mS۽fߵކ{A*hTFeC30ZB8)2HF]1XVۢKX[(v VN(gOmdv%SR< Ih7+jh-Hs_[;`;:bC}zmQ$(u8ۏ0J7 [EZY q:SNx|ꩪf6fSdEQDUEDQH`ʨ7!SQ(0wfpg6im5meub:8IKQNk=÷gy㐤FjZPhYբk I@r2 &jbf@O@MۼM]SwDÃhuUuNL;4%D+Ȏ",#"-PSۛ۠-D1)Q)Cn%]r}`mMmv<` j,DfB!$-Kώc.M^/?C H納&2LM\D{T 9R92 OadDO n*˵Ov`;3$UmR믑MQ,;#S:4l&c 1*D`#H4#H%rGbI( P NeY-(sKmR5Y6.kMmaHw(.HS2mׇR-8\[]2lDQ=eҫsE43Df^rs+X5eJfK 1#Uj<1!vOso]J` ͕zD! MFM^\ަuqYh=GQD}GQDv#p7aw7Hv;dPY ."Bk`V\FkoH_lQ.FX9@HQPY{zK8 kO}7HM4 !bY$me @!LEOMN`Kk|Y"DH;uD+ VBRsY!g];3+ i\3 R E2zCIjBVrR1l/[mlZR&nג~7 KTo:7֣ T"3'R)dE{x]bAe;{s/TMwe l,|)$RI.PJ{]`k!504ڋi(`$,(0h}aA! di%- -D. dg9Eh(sDMK3d2 2?X(1'iL6/bS@<Y.kێ7"\13F(FY% xh,1  ?߄٦%V\ҺhvkbpCi`Vhj"^}\%tDU]Ͱ!+ep )hOXBzfb!Z۫[H@Հf CW{)) _nS(*Ɇgpf42rmkGDmDIz^'BAdA7DD@@Fem]p`S6Fmj{]o]y:0ش?/ - 5?Ve/Fݗ" }Hk摷@w2%9OHUmu"B0QWd$@nXUgf[hDB0/8k5kH*iB%FDeȇߝK3YV2e@I <ډ"B(lkǻBHHI"+Eu8@B/jZՓRB!_ r AE`$$dII_Eu6bH Q LD$jws=tAk4l& "" #)REnwݮ=#,U.6b*m& A1b@,x$"ƻpܿ-5 -[1[n:CdJod@ѣ/a( Rm{pa u"S m r뚊6YU"͕޻Ko ؤsR4Td3-!ʇ "P&$N,DP Hm; i-!Glч$l-Ypdl7؍CP Dx[û@oղ{jPA~G$#$[Jߖ=hwQ܄!3Wu"*)Hla%) 0ִশxw4u!Jb s9]K$yH֍z@@d02dq8Enm7,LpvK=)2Ԧ`XX R.}pܚ˵`vˀ /$R 2gu 9^lQ 2¬k !INzWdX@E5 *B OMQ~@"zBbVLRq7]YB ]u4hZmd%+4p#MKj-ɭ_TO;"L@I ` "}JP +ΦşmbPNM7h Za*&X,2(ԶU;PB5"B-?@}GUҐ! BFPi$DB|lӐM/T@nWdq'VhuT@2"⫢ /&oF/\Kl#u!ijMK eɠƑ ~€u)Qu2[B;̀ة,ŗ1&eKi,9%Q()dmAPmA|-N"F$%+# g[Ije s`-w{\ ']vH!b"fe̅)w89@0XXTQR0MHZ2ۗ} BdB4F̅";g[RX Bu 1ܬW ePIQDQ!S"#K! 3jUIuk&iBe`F A6 Otk Yq`đrp!3*d̗ZfvV=뼅@5 XȈo52}#%o!™ț(&GX!"M]l hwh SGh$FWuS|Z17Z۔0dekW:E"CF(R4C=S&ckSNrH@p% b!]Gd `- 3Y/d2@: p5tK!X;O( /5ʁm٫7bU 5|sܻ@D<+\]Q4TBK UnԦ!D\$@]f fJfj@M$mQ^P̳N"f $'a Dm;loTC_^Kʓ@,@SZmultrȰTA2(곩'QC^,Z˨ksV)nwlTp6 drQdImI\Vn[3n݉4`J*5؂ Dk#E#Z`gE"A›6 D` bĉPD HMD_vg{xXwxEEh̤#N0 n7`Ktmپ3)OtQI.34ii a"XYEu"8䂀PHN)8Z|@IMn)%"ZU,-3Ls3Rm(ƒN˻˼mf*E$dF6i/{GĆvR)oXjP LrSK6mr@otɍwy۽2 g{v W*) ,0MNnRkAjA6*cDRGߟuB0 @bAtR DB%1,@ ,-.#HGmб&kt٢Tʣ-00l%rdZ x& XQP낢`ZTB12\SmU9E "@3;Eӫ =!HH5-ivŧee31 kJUP"Ȃ!i6Ж<Ym8@# ) j2$I\ vehh[dMҠ3(p0SDdͷ%DsDi&6B)@Omiiڳ Kiµ" ` 4vs2 2(̩Hz-UjxY$::.s+3@C53,v$*)$K&U-@ȈȈB %0D1Y%lVfHDD' M7o)D!"BͩA045K#IJiNqBKMٮ [~0QGcqe"39K" $]BmDivp *PL4J DM"$IDݯ{e1%)U)adO% v-UPDsSXHP2'a[ mV@KPn  U2쨚iU ߵE! i6>`Qgf@$I0!'MMIY7R8% #; "-zi *ΒHvIlѸl8c<WbMg WhgkPh 6Bk鹈)C!3~ҡ) E:>穰H~ܘg~ԈXXf^#L*if 5L2DDDTDIFlu4HN` H'bic,3Jv-'QU R 0=)JPJX\$`i%)f([/)J(#:)Uծm"EOAOwDV!Y{i!㧻hѫVlÎlpVR̍rԍ=%"""@$ӳ9bJBJ%0#@"ԅ]R43!ydr;53s`@N݀A$2Rbo6U"ϴVd~i)GJ )Kew~hc%F\!$hFzw~LiYXYd-$Ym'^ļ32fIU#[maU",Y0O5351$=W^evHI^LC|T2 4|KXz=GNl)8831jΦaCDA5[ H]ldr Vac7W44@c@V"0™;̊AV[ZiF ibi,s[秲!3D!(h" $%R glq6GdYLK ̺`m%0w$mVZSBchU\sULGeWOha!7 LMANҕ*ꦠq HfQ쒂$E{9$0¢sûH_r(P9<5$q@#`!  UFcb A %6"bZbBhӍhVH2FE^b"YYA3WHRJN*^ AB%5خ(NvpJDk6湠H,Nw?JP@MhIjQDLvMt KM,TIQ  QRQJ-Qe$Iwhw?6VX՚[$ Tl*#4+N9߼uTw`VĚ DY*vڂw;a/TH%^պI _$2HIuQHYyۢvpr7\ǀb74#qܒF,I$7Ҋ~fhj4څmC8$4] yóAKH fvWgVab*ݑD OSpKV I)P$Rn*R r e]L( ޏعv Āo7~H!I-lw45E0%u3BE*HK,-14rYH$RzIhu ɑLlc\LgZ* JЖsoוR`# DDB'} @RUN% TҘIXq(c-5_t\4\tՠO5 2 lJuM#|Xh(*k)SW0$c@wdll*t+(hj7Rw7Pn2H(FMH`*mH߾ Fe)֘͆jYsz@FPLH㈉L HsowAe:*TCNFY'c'*D|V[Cд Z' &*>CH3\ B#QP3D-!v%U?MnL2oļ*!}jJ'QY# z29PH5u`,6:KeUXXTXyvnEIe(F@6*A+3 S b)"[gMngu簥Q= lTUHf- IڍUz$K@/R1:2<˃ ER<l?nL3* 8$Q*MjJ?;٦sgCWE8aqŇ^ 7Td"!0$ %-)ro-!Fׁ!!ow}F`鮺I@I+dАjdܰ6a=oHwwU3` h0RI]1pTKsM[D)C*)9 vGcnr (;`e嵦^"YCVʪ#k39dAɔ$%ڛ4$E"2V$+˴44"0;KCwqIEED IBkH Mn $n7M$ cD-%aL4ǁI&̛Fw4A D8Wd+`!RRƉ9mB$D]4'b>iơ2Kd ?|̘Q{/3MB(G 8PD_oVwkwQ2Ȏe#qʺY c"1TRGA&d:aJvtgj'&f3n&&o|y' Rp"JhT̉9Qu8 6%{b&r郧 ۾Hũ2XJ$[j("jLAƣ! @¢*) .z^+`3P0!\ %] ;~+0$Cw$$+u\ia9TY%e[ '& f kr)$%bc_VF(0"BY2 Pdd@Dd$C1R<,6czl@WWWaw7Wy`J,)UߙͧQ"dK"UȕpE4&k]KY}2DJ 5JDiQVHl|P@x//0+. RuXiY@Kk.̀~2i"qnA@F)P1D<$7ׁ iX%IEH0X?_t0""B`t@BB#mYֱ wv*d!$1"H\VY#$!6yVPvMT A]Fd*pDfƖidfC5c24SVE&e+!`#u$*) L(ZeJATddb(6QԈ ($$BD$BT#D#l(aTF =~Q$VBexTێphm R: ~nآÜpyL;U22"i(J  %!0m<Ҍ]9is[ "$8d -o{2aKr2Yq  @P=C;?Tj95  ;_6S)[/IV.)J*V[tU:]i8[p&d+ĸ E*o p[%QET)iPaQU M -eqXˆ*ʎ۠abz߼{|맻}IƒR̰P H$LO|IHv'bxxvVFe腤ҍRHQDHc xJ*hI BGot4kN.|A֫G J<VҦoǂH u13*)!\>a'-2+T-wsi&)3\K <(dd]@c9Ү$ID MQ0}7}}' D1魇ZjRfl֌n^M [WrI޷[Wnt&D>hɁѝØjH" E'P̨ cmB@<֡%=rd[ ,y*ڷjD!)7D"7 c$M4>ԙI,$bK鞑^<D QAP{;C*)+\M,dPaEaJeq 6D2&ybhĩ4jg8UfD{OpI"n,zqD몸_Buh9kJWCwxvHJ9dTZ&׷q@* %!2R!& '\ZJY#&1\GIQ٤ڔL" m.惥Y뤰ҍ 7 0MuK%p2f(3mdi&Ow z NK-OXy骜69 i\+h.Xlz:6Z2Q2 =,SlW_N׀$@dDhY$H$v2muu^'BH"uwʩNd孠2mYev̘+<3^Qgp/CvQw'Geԟ4[Cp(a֮Ufdla,@# BA'++([Yh6"&E;8J9@1,la i>YF%D%:Ӭ:˧:O"4&[rI$vhTMDEKJIKqQ )E:vVۍ=J_&뿯ڔ; d0踯fT2Ƒ)-]с L`U\u!LURbzdk,(₊ʎΛb6!7i`m%NV @G)L8w7tB 0D{sҨUTi{ڙ("J&-4rVMEFdk]K[m ~J6 Ɔ;I 4 6iۈH{p&1$Fv4+F y& .6F I%2n-! ܖU 8( DL@D Raq\y#+S(vifY2eXrmo;dIF LKHexmglz V\dUV gok#ED5}D(&eߡ.wa(xfn-"*4>Ա=qͅ6p-YF ^޳fD-qWq`1 2$8z%8Ieej[WR*!g$XNZq5Yl#if5Հq8RD8^tU)"YIz QBG56mUei:֜1Aá駉 (( imZ ,c-)ø86^k`ykmCݔR2*ԫ@93k2AIG 5'}T`$@N""] %r+MZ,W0Ylx;*w$Xzh#C*YY$lȕݭ#PCLCA.L: CpJI)fN4mM6a11ڢ:|~7~~^,d=vwghwm%X̩jԪ?fv$m8hF{^"LZ@!SI`9Kt^kb8IBE JBԑ Irb*u*_U%h@54\-[Ch :|g jsW!I$bg% @E]V.c"DUSt@XP,`]}̠[UjM4R%Q`A%[B"q Pۭ~kܷrPu ;TK4 m-\Peak2aaTE1~MlS;ZM  erPTGϋ(yaY==Y36+1,Jέ@- ɁYn2aʰ$TWĬg d6Ҩ`8 ̭ @7M!! "ll=䉉4FUbTVLuqH 1u4W;]UlE%bHjJ:h&jG&CCmeg[u8H=۷ HK;;8JtflJ"vNnmrܓ*i&Lt#Q>H 3IS_,5 , ۪M7b+ >ٚt1 Œl)$S $wieTDVc%f<H@DXUo̠Xz=m$ Ra{mU-[}K=ln{+VoL.kLn&B2NYQLAk)$ ,5R"***Ҧ\\7Đid%4ѕ8ƊYK  $7J"B“l#:XH @¦2Nd3 YK6e UZ" (Jп@Ģ;u[Z63S6K0[5$ *Ī5Ubhj1ōQBEI3B3W %$G"9NMI F"iΚY[5mc=dBdAd a etfjr&ZuEuUoˬ%9ͻ -}TkIU]WWv` #9;TQSPԅ[0& I!V%dVNuH&UYUq`KU`0C[URQWiuѨzxzsXJ(@BGvmJ}FK-; ͻIʳI"#*D4Q;(IRCRQ0XhqhhvSfOU\n]DѠI2Ҭ0ʬ@"wrHEVd\q[l}+dȈ&M+v$5Ueee^U*-mKWMw{[-jsdhRe8+RpHjH ;2&.\# 1<E0W<cUDX9m1*Igus±ʄoe51N1̖%q^&gk_BFBa/~{ e@VI%*Qm)Mݭ~l Nupi5 jJ$2UZsfE,5[}RU7cvd2\-6`#vt˂l+PIX$.iڀ]V"UbXV"a6]XiFUme2ZIUXS1jq+ "7GjP+mͼmIf5S3sS~7$"}؁P%Id -/ (?5P~ɋ-S~s3ws1tx`2`R"9y#0 jk t,i蕉%a%V$ շTmtGV {KLL<<:B$MepICO[[tp"]"u]vauavEE֑۬MGm֔*jaJ#ĺNKւ$SR*\/.6W̆C9fLvȧ L/HTI¤%A<ʷ%WV$=(bIX\H% T$`X'c gЦ <4bM %rY!$fHdٝajF]H%e"Pؿnmü I ~4 '-V[vU3S1su.D 1sIqA $p(̞  K)n,ZnV tĘ1+ 3\C A6ݻaN=PdS]N :lf_B?H !*HGf̼K̸{msg EHsir3QSFB*2fMm]Qnfm~ca 7y3^{`Ae<0ܐzZeU%XVr)䅍Jqpc(;*N/O^0QuH-#{POzoN߻[6 **Wݭ,qm:<]V+JgF4a4Ov=DYw4IǓjf.ס} QL̶9 ` T`"ۖILdRD≒%mV$%_IhP"Վ FMBfq ƤQ_\dBóޥpbLyycݮlefbbM*iQ%rXqHl BBQ4 %y& ڦZ)PHtab# bP?7;3swXGqTa27[%I+0Xwwye(YJD'JG`[N7B;l ?y8ܽ;{f,HE";SFI-C lB'M qTRABMQJ0F! 0 l21HhM('c>rkmm͸Zi1H9qwʥ-i.%I$dJ0,(!;̔ i&U`hs[3T|4 ,uDofUD!trr$&"&HMʦ8"vݑVKiWai ePfd-ȿMrghwxw2VHY#'d_僭,a{v2Լm<ʖh &M5עZdhHe뾟K{[eM5C1rtRCb5g!% @DMPfR0LE18"Qۋ[񡁉$҂-ȟ§R- n&hlDļDEniRjniTJ TP(hL[.vSrj(HWzSiTGbgpliӷnzNot><3ک3yD)H(ڋQe$`FJ`"bQlY4@2 UTVH54M̼c˼ԛRHîXq@[I2R m)kmNDA!ED6٤f)5K~n- -StGR!Zz|&Fe2R*HPсLSVhXĕ()MYڟ(Z@ %eC439!`}5ڐY-`+9ߏ{󷻓lk0c ?d*8iUm8Q jbvw}n6P<-sI8 (\Jj*,sWq:Vs #@mNyVVp'6Yf2YXUWSX9 dO4F:[+"aUTH SJ@ k7 R+v w|O>'{!/f@Ke:ȒB)ڥ,rE[^zyf Vʏ@P)S,f$REPDWQ4Hڱ k, gyi(PA A)&㵈ahn #K+v;ND#Ec053|ƙ-WLӭ,N"A(ad ϼHB&bbF B(IS&5% b ICn&nV^VIʨ*l OtiKm]PG}W\ybuPwN7D%%oe "Kؕ$Q(:fTED&i6$a9QCԼ0 H,HVNJ.HvieMe5TltA(3=)A L`;Mv! @ (4L[m;LDTM)ovA@`"2,kkzҡl`u}4{[-<) M9\KX(">$@H ap̨/wiirLXerҮhㅧf}%,"Q12=5DQVYBY.Z6%7ifE$kfu6#PUj[1ZY\r@#lo~9̖vIt댘$$!%d1HD PtQEUg"QIF(:yĢ&*u:*6spne %;z#E7vR58QW Ֆj@B`!AYڭ G̼W5]079M$sREK&z3.fS5_c۲/[m5!ؔIc&D*1"*3m+FO׫k|Xr]u۩i%Vt@ ^݁e4Pe"JJ5Df7r,j*CR-@gRe%6mF+3vdai]rG]9Ogiiu+sa 'NZhB҂,ጠLFX4+q6 ʜ-D)! .h0u^&ꩺ9v,QBIfu3M quJH  N jMJ""`d$F@t @˻nJ1c8 }vP*K+׏e#W6eKM^z)#b 0c%[if74W%ѵ+;;8Vfd_fg U%e`lloa9(J$ ﯈{ݶ4eP c%EGQ) hdlDT#-m$[zvΫPn8wVi|ݜ=o1 /!jYD&K "6ky7վ E$祸im%we@@]\-/ -*k)DVdKD`#ZFz1j%HgUejC܍'7]ۥFI4HKvqK-b1uHR2'Ql6ɑw 3: ՚#mA@3Wt1uUXV۝ju5Ƹ׀d$LwiF;^$" JJ#qK mԽLA&%0{>#HcmLQL9uBQEq -2EKB5x"RymPU53$q &1 01mJS\hyWyYwe.9z6a[unyJ HV|"Yz+-E$F o.ֻߙ D- $$9 $"K1J- 3ӻZuG QU Y%bA`*M6NH5bY=u3(S)XjȐM#[y{' Y=T1E~.eQL3Y1!HHIH+KrPMiҺ$L64mgݻM;AmLt] )^h{57t$ژ#`B@$2$- m]n%}Xe5#04$r#g!!uՖMAԲ;V[vꫦ2($f_fXeS%"gug#q!D Ue@xvIإ !,ݮ$DPd)Qe$ +l5k'JR1) DEC, ^%+%߉Aڂ% wmD&RIuEB](BҺ*9K3 ֖RFPK4Du 56oVBN7#ʠI:;lP(≘?yI-u]#û:4D;i%b\QU9+Y-A beH!!XX).]oB%' ] cP 4RjAg]aiMSL Dha3Zr 9mvGVE4rHII@ nK%k.neĤ@P@ B BJR,(,@%jEQ "jĦ&UUUQ!J%QP'Uky4`SxviH4rpviٚd9'ER8.mԩٹ% LJ\z"(K+5i&kUپ]T ;jW ۶?V0YmTQzif&hz)BDt2AɖPlfđ PV*[&|]Ad%"IPK,2XC Ҋ3H[Q' &w& <`^@m@KjPn槡D`\---?o./FI"Y$ @ }ޟ|ywDgdD"K$!@q GfKtκֳ VnavݘIeZi$J&wvZ6ۀj5ɄJ&IBH vX{*+nK[p__e_FUD[Ut*"E^Y#rQb"bCM(InJj1DZ15ZkhKJ"(k-Nu1fBO+*e۠M2V65D,dE;;`bڤOUwv+o\E%xY2x "W]MNHlՙPhwRA \0)Kb6$0Zwr]cjY[Zh$  [> "]|[7PQ$VMU5/mțM6Uv%b_A eUURN4#h"PI2V%D Ymݵ1@խ m0*f;FP$XKR&R(G$$}wz\D=$cցu8J+2) -u 3dqvȝ'fy?yrL}uN`IXeQAIBRRY$Pn9equ}veRlMhIYUU@}!ma&rW2 AIgl]^G#ƛ fn7$uJaA]Q]@IX~Ku7&عl$vĒM B mǿC $HTJDtً"yeqoe Di$I %)窠j6AoRzdI%ZRE2U#'Rm2([E $ZE im6Pe%HE^j`5"%q$Y Q7@`:*6F Y @"Bx?hEb*a\]u-Wnr4hE(v+.}Y$6jw""V*"V"7Ivl@]nkDv}*Y$WKU7TM [xD#b& pLn7T0!r8iڃ͖U P+$bY"Xٹ[{t4\)ZۦQd|#G$D]^̱(+ D"I,6j߷g6VHl`TB%\H$kb:*Ò;#3Uhoqة3@Ee&jҊE(Hq߻Xe*Hm1$b)$T "nBR$y$25@d$lb P@W\dHj_*ʲF313-J% dʘH ]u[q "" ޼%ZlD$ NiU RTdue﮻nn I@Օd*"BMI] IUTMiA%2%yOmkI Xi5̸]U]DAr-]4(qH I nmVd%`#jZasA"uȵHT*B[\wZV`Dͼy1%' |kd@ 8C)L͵Q(IBQ9$ $Sl HOYQ. ٨K,imQmO›k槪}PD^F&@4C )'ޱ@'NvgȐ]NB$B hg& vbeғ&%1iZsIgPHLHtB֚7҂) 8fHE`שTQ>tk9e5+ʲR!J 0?UȈ֪&$HBi}A# VihD N$i1!o.49{/snj&mE34qMjkXצi7aaZ5DJ\¨4:ôC R%M,׫ EA٣ae2e*$Y\B uH%؉HdE(:#IJVU\]ҟz%fYF DDĕ"@B.$V9Wmgg{iNtӦ$M:u(%eeJ}V$b%mUaQaUrxHbK(I:ԼR,kvVI]8ۀk~m Q4H"HB!$$"6i.zTJ)+Ey0#O(,,Q%q d|0Yfj߯J""Bp&SFXcfD qC I92ڊ"BKeE3rerYdQ%`GdJ[jv Q!Tdzi0r*}$Iģ2I#]׈ %d)}"DvH37{dR1TTD\۾u V[)&1JP©VEW]4]Z ;3O->{MR)$YJD HBGcLĪTiuQ$ -m9AS@<38MAdjQ53&RԶ r31("pL9D$0J˫ >#o([4ә9JBuHWhuO{\Q&OTPHoont #JEQѴmDek"`)'"1D*Me]d#v1%IHA"QTZU PTXEE+z#U`Uc(nj8Y&Kc$M.;+Wd$RVoϛr̓ l%bƕ$&'IwO,e3uzgtlme=ՈĈLڙ2+j*n⦭OX.^/L&jUdVZAG]uq]{*s*(K*$2>$ gb#W[*,"2uJ4inf/I$@X KfzT+SmN I@|DIJHAĢ%vUo]ṯ2,Īl!F5 C[-2TOVHDIjzhVkmumAd-8 ۍf2UZKFI qIb)" ӻnՠmƂfɫ `OD e]U7SSTE0R6-0 &Ԥ]o 2Ħ)+*Efi`v)(Y3sk\KD]^=쾱Jʤ+3$*"0 #jB5$dXeRIa KeZܶt]4-C[չMbݸ$I(yh?mۍR8 TYQaGdLDCC@ "I)HB Q(GH9dELD^4aR$QB,uO;-::@M47) Hӕe}0Cjm$"& " BVֶ-m_WqE-7U=U*J9DčKmLLV6UE-"RC2K $qmifai]1YX4cJ NXت !*L:{ĒH "KnMke4YkRY* N{Ml'-.%Ƴ\R(nyJ믩URbXdbX(v)*gǂ@) %nITuWR+B"EI&h vG*$$̶'E”MDt0B%_#겘R3oZkSU5 z`|DQ+4 /Ay^CQ`RkaXfW.7-Q߬忐$;2!J9py$ IJ+% Qm젉%2Bʔ 2fN }NHmtM2CV  ԽͼΥx IKݖ1U{ 8 ,mT]x9zXۍM&m0&Lou$Y\Ded"gY("J'IxJ *b9qJ,;1# 55u릳qJo# $i832ųٮ ߸d(J@4l4#aq%\`a +ޡWw;d:rߍȥ*'F}vGR,4LJ8\N72`&Mv@@d@j54m0֨ WH멆vCD´s733 j*ioPHF!{(% 6 J±0,q :qeTEBQpT4%hsK4Jdɥb)95.I2r !$欐 )*ʔieۙܺI`" *1[H؝γٙJUeK)@uhTbLUV"FZ]sN$B" "%%4gkmYU5b,n eQ(Sʱ3K/+I92@ɴ2,R<)V:dfqW",Dhq|" {PhWMnUZp,g8ĵlf;XVRgywvIaA%/ȥzDB)+t;A "uʬD+KvSiALvBjt!!UUXuRH]FURG*RְmK2JK5{B' juVV`!$Bq:MI)F,*Bl$!7L-(O}]`EEV:슬H$FDDLV Eݷ.ʠ L  _Ba*Ne((I#JB)*HC3 n$|"zwr<'c!IDL41(ЊWVq۝QY "(ϳ-  u;e jm(ETCj0B ܎DU@DOtR@A+5% 69Um*JRJ)*K-$$3,\ҐY(M,d߮׊sjtUSF! I$sj(0JLPaI\! EM$-ֽ,!Jw씡2"* $qr [XlK8A*b*%XCVYR$UaITREJ%d& %Km[}}^iګA%IJ`RI=YE,B!FHUdD%LI K4[!*4Kh&&*0P۽I&F MZ9Sv3 % ʺ@!zWeGeYםڭ%\R!VIV#(i6"! %*0] TA9N&ReY"!B%:6]nFwZ(HTe8I@ER Z5HW6¥DU[E %Qqzݵ°vwm3㍶D QTV,IWQ%25IVB]XE&!UEo6m1BQ] DQ4lJMFrb!H%LRCX&|TQ%ldFii(ADkH՗yyJvvnDbT!9M3U;l03 ÊJE1)*Iy&I#[MTՂI;]W ( XRB( Q*;qIH3[;;mF2RR42樢,;AJҕW՝ B"1 J){ ̼"$A (00.*)OOHY"%U! M5U#VD+|I&Si I2j{UMڛ[sݙM]jj'iQI")%Q2|pbq\HV([]L_pΟjX.f,lRYdBC D*0DC55-#3U0Hb*ij橪]Ԉde A"I%Qkuvފb mmNY"XH2b$r8H2f[H;H)""kp4i5ssU(UUS@GJ8a B0JCo.jD A2PsnPSuR! !}ڙbghV# &R.ـuq6)A^=w!Z)(} vnDɠ.nj..J-vm OnӶu+. K("eszvh'j檦 !Nġ% B $A]LŅVE%$9 P)(m&L4oW&L9}WVbF&ƏG`]uwmBnfe`N]XD$ZbdVTbV$8ޭ Kf&Ba*B[avjwjHa E qYDª(*5`Tqi@*ĭUv֐IqGQ&bB!-@]5ɧ5`7777gdalautotest-3.0.4/gdrivers/data/grib/template_4_48.grb20000644003401500001440000000031013614004466022436 0ustar rouaultusersGRIB6 A%T_ e0p@@:0><< ;+<={;=>>u<>=GCEEQC(?=#;9<:>@=<::GG ECA=R=>@B 8:5@9IMuJHH>u@>?B59;5PuPSOQTON5EQHBJ;68~;;BMOBNwJ9LfKOOMD1s/y:?=<<}BOYNTJ1LONMMI:;14LK3KD&8G77;?@EGGghPP6OJJL/KJMdC9:"9W;?EnIIhgg%i\PO>LJLKMgJC,?;\>!?3?HIH(ff#fg3MMLwK/MsMMKGB?q??FD6I*IJ%g9fee7edNOLIM7O2OL5JPC~?CeCBH=JJKhfhhehccbENNeLKOPRQuPSMGBBEKuLLL_d3eKfd`2^>[Z?fAcCa][P,LMNOPQPMHF6H|KOcNFNN`ib*df?f_Y] ^jcrO/NOOPQUPOMKJrJMyO>PPTY^ig#eeegfhihiiFiZiiiqiqiiiiPia` ad/cdidiiijiiiiiiiijVXt`QZ\^_ ^jjjjcjjjjjjj^ij\X9USTcVSZ \l!kekgk]k]kkkkjjjhW&TR:LNLLn:mmmmYl]l6kkikikDkFkFTPMLFEFlnKnknnnn mmm_l%kkkTWPQcLIGEIEnknnnnnnonnmmYm U~QLM'M}JII&GDY?wB MiKnPTQT[WC^Nas_a `.gqq$pppoq0q;r,qppYUUPOROgMRLmJXG7DHBC@EF&HKJjJNQ PmS2 2k1>=GH,KNNNyOQR8TVAW)WZZ\s`ecadafa_\JdisYZXQUOJN?6R/,..x49@DGKsJGJOPuQSORRITUXE[5]_`apaff+cZzuNNRG@954./u+[-0f/\37z5;?k@HCHvI}IdMOMP[PPSkTV$X[#\_abxab bM_x3mzo=7t3q/0/++62`5c44L4Y8z:@DElFGHJMKKNOYQU,X5WXYnYZL]P`bdddnl{vLswv9x3/T-^+/ 3015Y8457;S]^a(cfTo}}K@=:?:;|767.5 4g:A9Bw@{A%CDFIJKKMPP:MNBP)RSSUWl[Y^\^_apbdggAD??>=n8p9 68:=-BgB#D]BBEFH0IJ/JGKM@P]OPRRU;WYC[\\^^^a0drd~eggE"BBB;/9:><:&A@{>?@ B BuCF2IJKM;OP=?dA)@B@DSH;HIIKMyN#ONgQ RU_aUacg gLoH,GjDA>`<<=<>1?k@RABJDHfI=I|K;KLMN LMZN`"brgqgJGJPG0ECCq@=C?B@LBWCEFIIKLXMOMNNRxKJH$DUFBDBA=P?B@@BBgEHKKKNODOQQQMQkJIIdGDDED_B>>?@BwDEIJRLXN MMOQRSSUfHGGGfCE>DD?b@AZBCiEHAJMkN NLN3O QDRcReSUE?HFzDDEeFMFAACEDHG*IhLNNNNOPPOPScUXyFGfDzFFHZIH\EKGDH3HJN\N O NNOP PQR0SSUSm$qtG=H(GF"HHJtIH"IhJKhLTLN MNOyPcPQBQS>T,TTTrAozFIIIIH0KJISKLL3NMNORPPRMRDT(TTWUW=VVqu tpKJJJKLdKKNPN OR6RRQUIU$TV\VVXXYZ'[YZ'WxkxxwwM P\ZZV^yxuwwwxTSQR.SWT=TTZZ[H[^][^^___`aCbOaO` aa`cac*f%f_]\q]VYWQZo6^uwvusuxx y7777GRIB ' BJ{WNpLMM@j ?? ???3?@|???????????????7=/RZZWWVUTQT*SRPODNNNNN8NM[[iZk[@XVUTNNNNNMMeM:[[[c[8^YONOOMMH1HCIJ[ZYXUU"T S8S8S4RRmQQKQHQPH=HHlK^[ZXX UTTSSSRREQQQoQQJK/I+IKK_]][XWV"VUU(S(RRRRMQQLOLJ9MN``_]{CEHikomn lihPgfddcbcn36:=dDEjhkmjyiihNg1feTcbcd6c8=?CGSljjh7giqhyhhhdddcI:X3::<>DjXiPjZkgf=ihfffcWb>P;3::O?jjlglFk jkj2iiPJnIjMcMLMMeMMMMOMNsNNwOMsNVPcNgRLKMJnoxnkhgRefgLec[_YZXUSSROMeRROQQQNQQU3XP]q_:gHmleocquxspp0kk>h3efh#eb_2ZYWTSQRkPJQOMPuQQPQR U]f3luooqtdsutsp|n]mMn.lmjjfZffLfecCb2a^YW;U SQPP[PPPFRPNT,MBHJbl#kq`rps's uqu1qoIppnlkifffffheedrah^XWTTrTQPOOPQNROPP>RcLSFH9DCDrutut1qrromoll2jiig+gfffed&_^8^#XVWtUTOMJGILJjJLJICEDAFHI>EqqqqSoIpmooIqll jg`i#hXff/fIeebfcU^FZXnX%WUU2P2N4KuIIFECD]DF A%AmnUo8namop$opqj[k6iai@gefbefdtcaY]ZYXXXUPcO+KIHGFQCgCBAAGCInno6moWo:oopQo*ihgfggwf%eecb` ^L]Z+ZNY#X}VSOTKNGdIGFlDCA?@\B!?ofonnnppr\qdpiggfeffePdca``U]ZoXXXwWTOLJGFDBB???>?9=oonnrtAri^qvrgXghh3gffed``^U\FYXX{XVVTPJ5G"GCB@?><=?>^;:;"pqrsLtXutsiNsi8ihgh ffca`` ][YXYX^XS|><96_56ovrrbrbtvJvj1hgec=`t\%VUvSSRPY:;z;==}rO9~]y}8{4y{vt\spom_jJggfc^~[XTRRPOuPMHJ3I6:G=o7?L,}{|z wt/r\pzqlljqhhwfdjbx\VSSCQQP_P:LJIG.;E???+=<\w݂Kz|Gzwmtqpznn~khLgfd`UUTSeRMR*PPPMKIHEA;^*0?>)>X>+>w#O AR}0~|Wx[vrqvnluhh/gg d^]4WS~SSWRQ]PgMMI?FEDm@{=88(%T.1A->==H?7777GRIB ' BJ{WNpLMM@j ?? ???3?@|???????????????7=Cu`N6mhѵkF֍j6mQmFލz6lgύN6mhѵkF֍Z6lxeˍ>6|liӍ6$lHؑ#cˍ.6\lqeƼy6l#bFǍ64|hqIƓ'N4ׄ ^-xZ ķo(Q4Dh#DF24dhё#FF>=W^Cx-[ı#@F 4$hHБ#BF"4DhoCx gϱc>}4h#@F4%÷o3g1c}-xZ7c9Fr3g(Qc:u3gX1n^%xJhQ5Fn3tfћ9Fr3g+׃Ff34fhњ5Fj3TfQ7F_3f8q1c34fhљ-[n2e/_~2f8wv*FT^2ex+Wn2ewtFPB2eʑ#*FTR2eHʑϻwH1#&FL22ddɑ#(FPB2{r2,dXȱc"I&2Ld1c$w%ޘDZc A2 d1c"E˸p.F:u1cDZc={1cǷmnݸqvc(эF6m1chQF:uvmn.]1tbьF2e1c(Wjnݭ[vbx+W1\bqF.]v5kjnݩG1b8q'O1}weݗ7vng]Ev0`(QF 0,`n}u a.]v"E˱c.]v>;wdݗ/vnٻwgE/_F 0]nyu۰`.] vE؋c.]v>}dݓ'v^{}E/_Q~Eu7]nuuכ_n݀v%Ka.]v2e˱cݏvN_8q|/_8q}]fuU[qu[7^n}u `.] v"E؋c.]v>/\^qz/|^{cu5֫WZ]nu7]nuuכ_n}vKa.]v"/$^z"E/D^wV_u~;Y]juu\nqu[7^nyu۰`.]/^y"E/%KU[u~wXcu5֫WZ]nu7]nuuכ7_bE܋r.]Ȼw"EuB U.]Wu^ջwW_ukY]juu[qu]Xubًf.]1vn]Hu2 U.]Tu^ջwV_u;wY]fuU֫[ыF.]tbыu-[R.]Lu2 U.]Tu^ջwV_u~;wXf*.T\sb͋6.ۧPnAu-ԋR.]LuB U.]Tu^ջwV_.4\hqEƋ.UkWN]={u QnEu"E˩S.]PuRKUW-[oE‹ .+WK]:utۧOnAu-[R.]Hu2e T.]T-[qnŻw-[J.]t+WM]6utۧOnAu-[R.]Hu2e˪lųg-[xmŷwt={wJ.]t+WM]6utۧOnAu-[Qn]Hu2e˩l"Ea-[ql"E?t~;wI'Ot]K]2etkN]:{t7PnEuEԋj"EQ-dZȵk"]1trG#Gt=һJ+]t+WL]6mtӫWOnEI-$ZHi"EIKF.]9trG#Gt=һwJ.]t+WM]6mu,ZgbšC- Z7Cn!tRKF.]9t~H#Ot=һwJ.]tu+Qfbř3f,Y1fb t6mۢD.]!tRыG.]?t~wH'?t=һwJ].%J,Y(eb+V-[Bn t6m D.1tRыG.]?t~wH'Ot\r*|TT\¹s5kW2e\͹s673njչsf͛7.n\ܹsk={EK*\TqR_\}s +W1c\ʹs*5ۙ3nhѹsV[6nlٹs};;wCT8qQ[ܻwr0a\¹r5kW2f͹s674nfչsV{9us*TP"E@r{-]ܻwr0a\ƹs5̫W2e\͹s6m̫74nhչsK9.r\s7777gdalautotest-3.0.4/gdrivers/data/grib/ds.mint.bin0000644003401500001440000002522513614004466021371 0ustar rouaultusers****0000010882**** YHAZ98 KWBN 211651 ****0000005507**** YHAC12 KWBN 211651 GRIBnHY1 a7 d1--RGP&%&%:  1Y1E3F<ooEGDq_DqGEGDq_DqGEGDq_DqGEGDqG"8sG8ÇDsG8r*DqGDq8GDp#DqGQDqGQDp#"8#"8\#".pG8#,q8uG$\cN,ps"8q:pPP:@PYe"8bH Dp9,0ȋ$qC ,HDN:\/苝.\s:/苌.pè":\c$pè8]E΢.p#8#Du_DuӨE_E/D$_"HE/D$_"/莝EӨ:uL 0 0 0 0 0 0 06Lm 0C mL0 0 6L0L0 1aaaln WXa\lrی&\zmL&i]a]3XAnlCelheikvXAeaM0 0A H$ A H$ a A"!!#$%%%#  h ]  V  3  +5 #$") &/o /r/ 700. %J$2 .%B'<*3-2 #)" $ &  (+$  +-%   . %  &4()%31! ! 3  4) )+   ! %(_&   x$  ! ) %* % S   S S S S S S S S S S S S S    ?`` 000 0 ` c333610mmfffflmmm03353`mamm6b6mm33333``00 a ,̓mmmmX n6Fc1X``0`YeYdX˰@@8 6mmc\[033333333301fck ffffkl ? UUUUUUUUUUUU ř06̓mm03350l@0fffffffffff`fkZֵkZ`-kZְYk5Lh-k b 4 4 @*J[35X335 Z[p2ֻ,@0u,Y^J, HciHcîR˜Yl  &(x#I p`3b cfc$fH4(0?,@+ZR`]%Yb0k4 R 0 333330c 8 kZָhc2W(-mmU_U-mms)cs\f111Kp.SX Vk-@ 2YbXkZAe uYh]T@ c716333333333 d&6(333333330`d Ɂx`x wmsF1-2c"Ն2 07qmmm J-mm.ci%33`30c6Z4:3tQf$b . aX@ٙ.hB .kh@!VZo` "+a,6zH ,, biw,;AE0Xz#P@ZD \J@ bكlb6ڶIcQc  4L0f 3jL^G,]z\a/q]Ub-WBPBկ<DnԘp$I$*IawB0řٙ f fffffffffff`n[Ummeq) RYV> 0o1c񑄡s`XxA v00hcn6\6hh ŗ ,1;^`%\ j00c33333`0h ]Yvָp2j LfbČU1TV-bA)Ee !lաle-#e ZְY`3b33 333 33+ m BmK>% 16 @ r&CnG@,6,6*⵭kZR0j**% ZֵıXh UUU UZUUUUUPUX,*rl63X3300 bffffflkffffff``cfŌ4Ic1R("%"Zֵk]]Z363653635̀,l̀$ 1c (mk,VkjZֲqcJF1ccAl k BB B!B&63353X5̀bl`ffff`ffff`Ym1epb,VF ZUU`333333363333335 l,kZf c333333333` m1@ J J`0`0` –UUUUUUU*UUUUUUUUUZ7777****0000005316**** YHAD12 KWBN 211651 GRIBHY1 a7 d1--RGP&%&%:+  1Y1E4F<^^sqg?qgsqg?qgsqg?qgsqg?qgsqg?qgsqg?qgsqg?qgqeYoqgYŖYgqoqgYŐYŜYŜYŜYQqgŢqgqeZ'qgqwqgqwqeYŜYŜYŜYŖ]ŜYAgqdqgqYŢqdV]ŜYŋEd]u0Vqgqep]u-ŢqPYuAbAgő-dsHqgAqa-eŐ1dqdAg?pŐ1ZeYYuZeY%EAe]]dIEeqeYAgYwŗsqe]Ŝ]sŜŜ?qs?qs?qs?qw?qus]L 0 0 0 0 0 0 06Lm 0C maa & 0L0L0 1aaa r 6Xa2ak)k0f6u;.e n5Аe)eea,1A & naa aH$ A H$ 0a @"!!#$%%%#  h ]  V  3  +5 #$")  &/o/r/ 700. %J$2! %B'  ' *3-  2 #)" ')$ &  G(+  +-  ". ;!  &4. '3<" 3. 48 9 +    %(_*   x$ ! ) %* % S   S S S S S S S S S S S S S    ?`` 000 0 ` c333610mmfffflmmm03353`mamm6b6mm33333``00 a ,̓mmmmca[0``0`kZֲ`!PXQ1 f`u{ff fffffffff`0c =ۃ5`1mY0 )UUUUUUVUUUUT( kflP`c33333333333033333336 m `  mh1cY c3`3536X xLaiHfl fffl0fkfof ^60=J, cxQc61X˘6X fT@EA`ff a $*`@x,1`fl f`fl fae]ffffff aqEL.y`333X X؍336P ,PPDfffffffff hAV^ʄ Є,BhYJBaa *.%Zֵf0Vcaffa\ fŋeYWUr3336+e/LlQfffffffffaP++AkZkZ0Xh%+!  M,QfcF1fffffofffffm cxذ`dIt500,i,a-4m5Tp,[mmE*R mmm4h-\ [30c633e.Jэ[<Ú-sIr $fDc ٘1m`VɇeYQX{ fakpI\fFk p,@mB`Uf*Fr`!Y!DXaRb"]X"536+6[33`335`370`mYٙUفscimYZqVs $ epZkUYoKXZ k.}9..)C;|Q 1<@$! bl` 33333`3X3 3X `^05",# ȡ`veqvcEWlfffleuu 6*x¸ ,c бb ,9&1+[l8 b6,6;x1cblmbmb b4 JR@y^gd)RYHc11XJ вB fffkffffff0cIi.L $hcuϴ ܠ\ X[XZ.,6,6*낸v, UUUUPZUUUXc8a6-m[3X330\*r偬ffkfff`3336X`l1ř٘1l1qnˌ6 1F``u1c c`336`33`33X`33X3`X3`35mm  0@0*mm6b RZR-R ff fff`fk8 *G+ZXkY`-kZֵk\mb̀ b̀bmmUVm1m1Ŷm-kZ`Y]Gc11mm l333X6lmm( flfk@0RR` 00000000)UUUUUUhJꪪ@)UUUUUUUUV7777gdalautotest-3.0.4/gdrivers/data/grib/gfs.t00z.mastergrb2f03.zip0000644003401500001440000000122413614004466023773 0ustar rouaultusersPKDgfs.t00z.mastergrb2f03UT qSSux stb```bF !add&bf+D1`N({ |)0}wB0vJ*@1$@MfNôB,ru[ $ƞ^TkǰkP=5'{ULP.)a[Q%agjfadjagloaaja I0`bB.08$ąliO %,pL2Y(ռ)fygB>,LSKۺ9a_f{6Tzٝf %Xf/^ʲL1~YGX:KY⦊TZ6` f #R| VvPKDgfs.t00z.mastergrb2f03UTqSux PK\"gdalautotest-3.0.4/gdrivers/data/grib/one_one.grib20000644003401500001440000000054613614004466021673 0ustar rouaultusersGRIBH)0)  @"Qg ? 7777GRIBH)0)  @"Qg ? =7777gdalautotest-3.0.4/gdrivers/data/grib/albers_equal_area.grb20000644003401500001440000000154513614004466023527 0ustar rouaultusersGRIBeQIr(+`G@vv@@̀"{k{{ΜŔs{ckZ{{{ks{ckk{{kksksssc{cskc{{{k{{c{kckksZsk{{s{{{csZc{s{{sscskkskcccsJsssssc{ksssZcs{kkcZcscc{kskksskss{sskkscck{{{k{kss{kkkks{sscsks{sc{kk{{{ks{kk{cks{{kcss{kkcssk{ckcks{{{c{{kcZkkks{{k{k{c{c{skkcss{{{skssscsks{k{ckssskssck7777././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/grib/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2gdalautotest-3.0.4/gdrivers/data/grib/CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P0000000644003401500001440000000026513614004466030671 0ustar rouaultusersGRIB 6 H fb#v0$y0 ÈPP@" f(7777gdalautotest-3.0.4/gdrivers/data/grib/ieee754_double.grb20000644003401500001440000000641713614004466022604 0ustar rouaultusersGRIB H&r0N8rHVV@"  e@f@f@c@b@c@c@c@c@f@`@b@\@`@Z@Z@Z@Z@Z@Z@\@X@Z@e@n@o@i@`@`@Z@a@^@b@`@d@d@b@a@`@^@Z@Z@^@Z@^@c@f@a@e@^@^@`@X@\@^@R@\@X@^@a@c@`@d@d@a@a@X@d@b@c@^@Z@Z@Z@Z@\@a@X@\@X@X@Z@\@`@X@X@Z@`@`@a@Z@a@V@Z@Z@\@Z@V@X@^@\@\@\@^@^@b@\@\@b@X@`@b@`@`@Z@^@^@X@X@\@X@`@X@a@\@b@^@X@`@`@^@b@a@e@b@X@^@^@^@Z@^@X@Z@g@e@Z@\@\@Z@X@a@a@Z@e@a@^@^@^@Z@a@a@^@^@\@\@V@Z@e@Z@Z@Z@Z@X@X@`@^@\@`@`@`@^@X@`@`@^@Z@b@X@\@^@a@e@^@Z@^@^@^@^@Z@a@a@X@a@X@\@\@^@Z@`@Z@\@Z@\@^@`@^@Z@Z@^@`@`@^@\@`@\@^@`@`@\@`@`@^@^@`@X@\@X@^@`@\@\@\@Z@b@^@b@\@b@^@^@a@^@Z@\@`@\@Z@\@X@^@X@f@f@X@Z@g@e@e@b@b@\@\@b@`@^@\@a@`@`@X@`@^@`@e@e@^@\@`@c@`@a@`@`@`@\@\@\@^@b@^@d@^@`@Z@Z@`@`@c@^@b@`@^@^@\@`@`@`@^@\@^@\@^@Z@\@b@Z@\@a@a@\@`@\@`@a@`@^@\@\@a@Z@a@\@`@^@Z@`@`@\@\@Z@Z@\@Z@\@`@Z@^@b@\@\@d@\@a@Z@^@^@X@`@^@`@`@`@`@X@c@Z@^@`@\@`@`@`@a@`@`@`@Z@`@Z@`@`@Z@^@\@\@c@b7777gdalautotest-3.0.4/gdrivers/data/grib/template_4_12_spread.grb20000644003401500001440000000031213614004466023765 0ustar rouaultusersGRIB6A%TBS 0r0沀@< UUg  ?R@7777gdalautotest-3.0.4/gdrivers/data/grib/ieee754_single.grb20000644003401500001440000000333713614004466022611 0ustar rouaultusersGRIBH&r0N8rHVV@" 5C5C5CCCCCCC5CCBCBBBBBBBBBC-CwCCNCCBC BCCC%C%CC CBBBBBBCC5C C-BBCBBBBBBBC CCC%C%C C BC%CCBBBBBBC BBBBBBCBBBCCC BC BBBBBBBBBBBBBCBBCBCCCCBBBBBBBCBC BCBBCCBCC C-CBBBBBBBBC=C-BBBBBC C BC-C BBBBC C BBBBBBC-BBBBBBCBBCCCBBCCBBCBBBC C-BBBBBBBC C BC BBBBBCBBBBBCBBBBCCBBCBBCCBCCBBCBBBBCBBBBCBCBCBBC BBBCBBBBBBC5C5BBC=C-C-CCBBCCBBC CCBCBCC-C-BBCCCC CCCBBBBCBC%BCBBCCCBCCBBBCCCBBBBBBBCBBC C BCBCC CBBBC BC BCBBCCBBBBBBBCBBCBBC%BC BBBBCBCCCCBCBBCBCCCC CCCBCBCCBBBBCC7777gdalautotest-3.0.4/gdrivers/data/grib/mercator.grb20000644003401500001440000000111013614004466021700 0ustar rouaultusersGRIBHH &+r0nrH(@--"skkkkksck΄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{s7777gdalautotest-3.0.4/gdrivers/data/grib/rotated_pole.grb.begin0000644003401500001440000000200013614004466023545 0ustar rouaultusersGRIB ci2+ &xPu^$<dd@u0: B{ p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{=p{ IAp{=p{=p{=p{+ h^t@[@E<0QtNrzև@9A"1# TK_$& Hb=ЋV"XA ` @APV#A IVC=uöPd;xsà8z\8! kCXφ\2A xeD؆6A oÎ8mnۆ5A @aB03 HiCDφ6! lC"Q=(##bWpf*1LpTBп1ѕ mC54s< $!I rORI8;xq6q llGAgdalautotest-3.0.4/gdrivers/data/grib/README.csv0000644003401500001440000001000113614004466020757 0ustar rouaultusersfilename,format,provenance,comments albers_equal_area.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Albers Equal Area grid (Template 3.31) bug3246.grb,GRIB1,https://trac.osgeo.org/gdal/ticket/3246,test messages with different grid sizes CMC_rdwps_lake-erie_ICEC_SFC_0_latlon0.05x0.05_2017111800_P000.grib2,GRIB2,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,Simple packing with nbits=0 ds.mint.bin,GRIB2,unknown (originating center: US-NWSTG),used to detect GRIB driver presence gfs.t00z.mastergrb2f03.zip,GRIB2,NCDC GFS,test that GDAL can read in .zip ieee754_single.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Grid Point Data - IEEE Floating Point Data (Template 5.4) with single precision ieee754_double.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Grid Point Data - IEEE Floating Point Data (Template 5.4) with double precision jpeg2000_nbits_zero_decimal_scaled.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Grid Point Data - JPEG2000 Compression (Template 5.40) with nbits=0 and D!=0 lambert_azimuthal_equal_area.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Lambert Azimuthal Equal Area Projection (Template 3.140) lambert_conformal_conic.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Lambert Conformal Conical (Template 3.30) mercator_2sp.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Mercator (Template 3.10) with standard parallel 1 != 0 mercator.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Mercator (Template 3.10) with standard parallel 1 == 0 MRMS_EchoTop_18_00.50_20161015-133230.grib2,GRIB2,unknown (originating center: US-OAR),test Grid Point Data - PNG Compression (Template 5.41) one_one.grib2,GRIB2,https://trac.osgeo.org/gdal/ticket/5532,Test 1xn or nx1 grids (1x1 here) png_nbits_zero_decimal_scaled.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Grid Point Data - PNG Compression (Template 5.41) with nbits=0 and D!=0 polar_stereographic.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Polar Stereographic Projection (North) (Template 3.20) rotated_pole.grb.xml+rotated_pole.grb.begin,GRIB1,extract from RIVM_HIRLAM_H11_2017082106_000_GB.grb of https://trac.osgeo.org/gdal/ticket/7104,test Rotated pole geographic Sample_QuikSCAT.grb,GRIB1,https://trac.osgeo.org/gdal/ticket/2751,test GRIB1 support in GDAL simple_packing_nbits_zero_decimal_scaled.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Grid Point Data - Simple Packing (Template 5.0) with nbits=0 and D!=0 spatial_differencing_order_1.grb2,GRIB2,unknown/generated by GDAL GRIB driver,test Grid Point Data - Complex Packing and Spatial Differencing (Template 5.3) with order=1 template_4_15.grb2,GRIB2,https://trac.osgeo.org/gdal/ticket/5768,"Test Average, accumulation, extreme values or other statistically-processed values over a spatial area at a horizontal level or in a horizontal layer at a point in time. (Template 4.15)" template_4_40.grb2,GRIB2,https://lists.osgeo.org/pipermail/gdal-dev/2017-November/047779.html / 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,"Test Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents. (Template 4.40)" template_4_65535.grb2,GRIB2,generated by GDAL GRIB driver,test support for unknown template 4.X transverse_mercator.grb2,GRIB2,generated by GDAL GRIB driver from byte.tif,test Transverse Mercator (Template 3.12) twenty-se27w.2017102006.hwrfsat.core.0p02.f000_truncated.grb2,GRIB2,extract from http://nomads.ncep.noaa.gov/pub/data/nccf/com/hur/prod/hwrf.2017102006/twenty-se27w.2017102006.hwrfsat.core.0p02.f000.grb2,"Test Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for synthetic satellite data. (Template 4.32)"gdalautotest-3.0.4/gdrivers/data/grib/polar_stereographic.grb20000644003401500001440000000161213614004466024127 0ustar rouaultusersGRIBA.r\0@"k{{sssksΜk{{kc{΄ssksksskks{{{{scsks{k{{{{sck{c{c{{ck{ccccck{{kk{kZsck{ss{{{kc{csc{kk{cks{sksks{{sksk{{sk{cs{ss{s{ssks{kkkcskkssk{k{{sssk{ccsccZc{{kccZssskksss{{{sZc{cccs{{{{k{sJcZs{{s{{sk{Zskkck{ccssss{{cksc{{{c{cskkkk{{s{kk{{Zc{{{k7777gdalautotest-3.0.4/gdrivers/data/grib/mercator_2sp.grb20000644003401500001440000000111013614004466022464 0ustar rouaultusersGRIBHH &+r0+`NTrH(@"BkkRJRRRk:J):!!!!!)!c:!B1J:[[JB:1!1!1RkBc1:)1)1BR:[BBscBB[):)!:!::[JR1!!!)B)!):)1)B!B!)!1)))11J)J:J::!1):B)J1:1JBcJ11!1!sc!))!B!cB111!B11))!c!!!!:1):::1:1!J)1Bc1!111!BBB)1!:!)!)1:1!1::1):)1:)::11:)1:))!J1J)J1B1!):)!)1k!{cJBB::1)B:::1:c1)sccJJ)J1!:):R1)::!:R:B::)))1J1[1:!!:R1J:11)::1)1)1!)J!)B):):B:1)B!B):1!::))!)!):!1J)[)B!11:1:::R!1:)::B:::!:!::!1)RJ7777gdalautotest-3.0.4/gdrivers/data/grib/lambert_azimuthal_equal_area.grb20000644003401500001440000000110013614004466025746 0ustar rouaultusersGRIB@@%rM+`{0uu@"skkkkksck΄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{s7777gdalautotest-3.0.4/gdrivers/data/grib/MRMS_EchoTop_18_00.50_20161015-133230.grib20000644003401500001440000003621513614004466025214 0ustar rouaultusersGRIB<  HD a(aR`' B@}d0w''",dfD )z;PNG  IHDR Ǵ@ IDATx{u}Ϟٙ̅d Ca#BXQJQꅢ崴U[/tIR{z= biBmTKE IL$B!FGJf{z3{?{?y?['fI m\tԽ]Mw]̭`r۵_7i=`nʍmUpͿ=]-+`]<{ף?ظE7sf@kKJC9/' EsTtԿo=9꾩僙} :8y30YgM/>0ٗW2R}Md hUl0prّh?ǻݿYlԑ[;v/9Ѯu~sJ?Yu -yu%@]R.:_w &-i&KyMx3W@:٢q#jXJPSzxҞd)E7+ 7tU ]{旆+WW6ǍcO|yumŕVEaѡo.}b֯&ڢ.1Y!izG?ϺWLԱ{Aj߮~Z`k.^5P.T+-O7IƗO]{d笽;9;=G].qi|zƓwJ[+/:[m絝3|c}UcZt?ųj曏 f޷']R]]kS ' [/89_IwZs֒O,[@y妤뽯i^Zϲ  g5hl~wg7wM^'˗ӭ Jyo9U%E֦.4xjszG[ϣ޸g4}49pa.Z\%+Z?teiegJ%YS-Քsyw @ ܡlPdQWn>/H4| Mm|l__i\h2;{ʮ4Q4h✕4R0i5\2m|[sa8NX46 CMe,J>jӖuz 'z<V6[(3ҥlj{ق7-*ߪ>w~nr`dENI[i\G˿1*M_&v^%Ol:a9E+sjÞջw2̯^P}[vͲ.K~۳/]MS-gyMȮܟM0ܩss^tҔ{3 o̮,Ho^3y^;Ԅ %^4l*sO>9eOdjqvW4^v`iL7#iHȮK{~ueIz/$HV c7}*o??%6>|9]jD I~W8cٝ/+>ۛ7TOb?<ӭyӕlu[o]Kzǂ}lM*=ʟ\ִd$-νiֆdGҜrd$[䋏-vIVCM'^\?5߲g?ۓNZJ/o#? +o8_odK &iģIdM}5CiNzn=[?5e莋}ɖkx2w2EJ76>q(..|7_,~9e_W[7+g/݅/ܛ^6}OkgJjǦO^,lHw'N\6YQd{q㫻~[\<}ʱKոg. @Q ܡfM.M_|Q۶]512qJO%CYՁܕ>՞E{ ]Ӹg͛G^綮qO5\? Ir_sݿ]Q/z?~YI5c{_?0p@_u]빼ΫENeLt=t|^ۿˋ+`;M]3w '[w~f=ܡ62]^`eK5.wMCYEGLl.w23K0CM_G]tEKnxcN4zПnokrjCy󘜔S;\t `ΥYgww-wY9ejǾUt Եe?eE7}cny̬Ƣz ǝ+VFGƋNPtP/̳~ U6wE@-x,9 ƒ^t@}xtѡ汵]EVGdq;'Zc][kIEwTtG޷'Y$_kfZ]IK/OIk^ɺ@+P>=٘O[/-eκ*N%5ݐٗןQt8Tӆ$Xg\1|[cPuwkхw(wM2'%ّ]շg4ehd*l6t2pzo[zS)/Hr6ӜG4tvE7P ގ̉7;#Mwkd*e}3=zv~Uf>jq.?ړ"?o 2 rfIDATpck'زE@Rb޿oK,^F,Nvj7f@~\; ."v_vRWu嵕-@Ye@n־d@ Ծ]UvCD(ڏ rҪM`DmvNvPfT'ƞ/#QxmU@yud@#TY|i6~=(?'( W΁OmRM@TVVlM HՖçB+"6_]iҙK _{vPlWGgvw`H:}"C?dGpO Fw`=1`w Fw`_;;{uw-PX3oP}@AL9>ޭM9)>+=]T{vPv'\LzʩBti@ V6}ǎSbݲ{]`4cC+cL,otԔo%PxS.zf홝]U/J7 qg8JF.h%''\۳;(FeI߮<ۺ,5T&Gew,Kn"hĬͱ#;Utyvu(6'""bҌ侈XȱuUv1qLTk. ""1lW{v@KxjM,4#$ZE+:輫&Vґ@A=^[;feG\ݿc==;>W߹2h;nhv0_uڳa4>~)0@1~I"g@a_.h ?fCӞG0eTvvO.4['Θ8yPn@cEO51apq<eמ4)p6zkD)1ciPJN@I W"╈rZN;!C?wη3pz7F,Yy 6 pz'"1g;샱 1Pz0tFoՖwމ Ve; wV@_):eh*4t|/h+eaec c֑b(whGWgc /gc y `00pX]4;4Юio|pM5 de dUD5WMfv0|N!tm.hPDDnG?`<9,դT'*g2xw5~r9;p#!@U∣s6Lnp눼 IʴչIW{o^? 3V wM5Ї>@S RutaDDZߙCJt⊚ U_ٗ`!ea|-/8@I800P(6C`}gW5cՆ΁s̆Ql؛~Uv9{Bw0x[L ؔ,OR-I9A}ϣ 3 ~znٱ_a:&@cn>셮AX3ZgX4&"5cgrRf$3K'MU,ƹ/^~b-wmPU&Zۮq~4 pVc냅 ٴN3Rw҈ҼWڇБ;7EDT %i!6<)8|CIpܝ)}}XތZ{8~oo}iY w7K4u 6tPTjdU,k/O *4Gא6f8?ط=_͉;3ߔNbް=]MH򠩍i]HhE7c$MrMhyd/ cY:5UVv ɴ(:gŔuzߡ0< ߨO5K(fv|1u~H+=M`s7ژ~w6GH5Uhc2l^_[^m:S`;)#.]t X˅ZKXncqG{3D&&Nلַv}ǴJ<]kMg7zrU1|Ltd~G$M.mWR;7HlӷK@b56RǓoeMPFENNdvo0l1cohToRzV4UǭB zEApr7f֙DgQFУFW֑>ir-n;(fŌD-fl+H%1uJG76*.x4+C[>Θ{i- /§gM]W;0 ή:d1)Bۛ͠X΋zx?i!I+ \C8{}R dS;74Qp~NJ `3e [ gc2J?lbRh5}BxN 4/ȟ0 $[izšeQVCU- 7W[mh +wսOuZmQNFC5* vzCE <| hWɹNN nTEkՎY"A-?e bWq5͈Fo$Ь R)ٽ%b|v S:HXGX(n:<ȀXϖVV=p3 5 凴3 t"UÜ{-/x":^OC?ګj5 graymfoc"!'otaL7d 1"rGǾo nV>,hؾ[ h]vX: QwMdSwe"@\ pX meH `lك EK*HK]"bA./H,_s$z}Y |a.*E$O_ELǮgt ߗ8D4,i83lհ4I]JqgJZDլT}+\K,t5?W܁r;X\ű^<$SWBRԌt3@Ë6݆3 . T(2^TC@ _r(UEW՛&1&$ 7D0+)Wa/@)C*i_NOc iR"P8_ϽX5.AiZDdxc^wNywz=Znb1+MҤ+RpEĖ+yl&ó+fך*Vs&h w I]YolY7o#k/X[=WUM}*vcT/ފJ{#40ٽ "laTف d{Y<X3tj:z1<>\v&IV{턢 OUE,=pRWaJ8WߌXρu$?%>y`,@>zNEdt+b㬏˿3Zj;tfjڬ#8XYM);+hozLMk܋D.33\ѕ{󬁓O"ymZYEs6̎*).O䞚7 =15Eͺ-)cU17N#{1i-$UMI#A 5%lқKzg 2E/xJnn(RD%HmzKo I5m%Elu}EM#dPR#uw)!~rս>MY:vRBF>`_nGss Hփpnc0[{9ĪW>MT@Q&f0}q(UK~|8KX9Sb۝uo(JkeLJib5`ël4[=2ꔃ:-!ĠRGs}(NxToFҝB K&E* =c]sl#)oUkETG6:$1=iA]AKZB{t#O{h3S,کǼR/wE )+&g62( U'3m5CsKL{q.nАgmnlh5F|:pɁDܝyWFtE17XWSaF588VcY-^2Y_A ^Вss\s^ %$G VG]{ O22cyZt@LLyL A-[Yx ~ I;#U>bP?g%#5!61X9JLזhꉏgH;|&CL@)E^=!>$::i6]6Ey4_Vp`mĩ2GՅ &Eu舗II!zRNt~1 ;|8Y gn %CN8?¶R%BD4D м#ϩ#BE _X<|Άq,A r9aA>B}&Pf;7!x) }³9Gb2[Y5 l`K)a86W85v%֌ѝjbrfEʂ#j,m=ۜc{qƯo%`ǼY,ݿӭ U,œQ[e{'gpDI)$k6Q6%4!:u~~r攂[jV1dSo R2Vkى25M)߬l q\l#+=o)gl ϲ?:0q^bng\=";9_i{Wr։=_b1WG ō攭4V&1_|bA"üF_8صٞ#u / 1B)*nStw뉱9d]+RIR/J9Ƞ5bڜ.25p=`]ُi7#U7H9= ]%"G\~67eؠ2ZBy(޼^@ĿENIONL»Ό16.=a.kW,ԫK#6oQ5xڏenH[x")ttOߌ A LnpHG`zzCn0ckeHaW?W MCdRK|,]T1:OTf^qŮ ̆󤁫d-bν&#pH8:S9ib4rS(S8]uKa&(D.wCL]lޱ4+Z G%?3~HDz~y59C+qR>/$<( n4"O:{âO}4+D"~7P/ݳ;ƒ́Uy@a)B$q%uOw<pu!ٛjIL . 'ڙ EDD]+NnRtóVSi*e#ȥl,>۹>fsY)+us{_d-iHyg}ā~cceD V8,ևi[__}VZwԉ}~W?h?kJӋ}V_o"ڋ q x{Z3&vCp0"$;PVRMhb~d֊Q'$)oZ Y=̆cQx*(~@n@>VXaץ_81>Dq}tn=H(o5~3v%m nea[A' bI諁~UiV9#$*z>$ĶG5Ts<^?BZ633ՓӵY%DxorA$|&z~UsgW\[y9vtYmchPy^)HyaAh`m{L 2vզ3jOK:?_ N$s@WL1N{wU,(4o$}.š:l6PZk-:zR+6=Ѐxd l S?NwUMB0FÅxP?3Tz󺗗b_YWke<|ˀ["NY;Ak3q׭JA7e!?v>֮~!o \Wo ȣ]aAoP> 4I :_:nbcZx"3O2HhL} gZvE6O/|.>gSZ{{w`4Pn zWk9Bz(8[R|Pؒeͮ LD/,v #m>ot}W8 ";U%n7?S":p50d +wv!P@_ yFY4lo&VcniJY^ o.7<(փeʵF^5c~6UBS<PlX<S^bE`qH8ʕGU `SKtFv>n: 6'тiuȂnhEF^~:-f׃ M3J xo%,{^@#"ʘ T'&sh*L^Uk sn_aiYYkծiekpM"z ^'P&0E< i E yj̠&a׉50\grJN{Ѳl5Wi}3>3݌&k7p^v*<©cl1!|1e>Mw?==6ujySHpR4.@e D;߉탇0mi ~QZI([~P7Y ޟ)YaꥥL¬,wJ:3Qس8 ZH'm:5m0kqTQ1?.^>Mk|9xk Axld' I1G~ɻ{MŬ8z@%;=sx֌V3qfN#z^^_@Z[w4b\z9ؼQH ɢ' 355 5M`VwʐZ??, Bzu WkY󤀎NJa̯)|ckiKvέ[d|rrFY].Po=oQxƊjj}O%|B>yNޏ2XOU@|N8Mf9~> sZ s,`<8);2iCu <>݊jVۄmQ &W5l k7n=kι/oe6HmQ[#+KeiByoʬ'toÏu< e=A"q5ѐD1&%Тh=\ηSw_VZl;]cfnȂPT gQPBI!I+ "'B@F=/^* J)&Ǒ$ 19a @D$K'd z"#p2ebFe >,sVG2}84 rg 㥍)ɖ Rq #A\DUr.o"®6в$U+8$bCkt=^5`/[YnC>|9#ko}Ŀ =_nLc,ٽRk#Rt'SZ7dLyUH٢JDD3leIybzvj:lXRgM G. ]ư~6+htGȗ7_q+\=e9]iJ!)$u킣" rz'!`Am P5bׯE"[|Y -dd K4ok S;dI=fF}ޮVl 8DEiĄh[kz*k/z7*_!c7fuGTH`{o'QGWm) AXH!d4(Z,Yz 錖c F >{ & tϲ1'=}@6^\|F&UE KGgK!!@:0Z)/?8 hub7maGKz# vd_>,>h{AW4>} iL p[Pi5AF D(88[Qn^~6(Z\8jLϾm|C9zL~>#W<́l"mš RB8A!0hc/)=A UWgN[I1pt%:lS((nީƞBwґ|_uWw%s 6OfblvØzc' I,]G#iItco fMe7i,@<ĕ]Oozn 6{!^uO3j 9C)8Nϼ ;>=&ֺݓ'02AJNǝe5Zl""c^(6?&bVސRim4ZJooăïۙb#хXSI/U09aI1Z{]ep(k;_hK2i#N'<뗱tllggs}Ͷ\I8Gi}bp+Zo296`-] }=/#(Ė`tG1&irJAVʋmP T8¿PXGס#q܁,pocCݳev'(B<DhIݟCSa]HEX=ll]9h`Z{&k[.\;j`ݥtӾ@4vHG+qz!H\h Vd\$24)YQ91]v'lVBx_N"xݰRR_s#>GBB́2Todc-_Eˆ*/ =%_x(n!p@ᦼg{n x7>uRMܛKy'+ӞJI^&n*Z}tnq_nO P%=kq~܎+J^@(4q8W`L\UzË$A?rƿ8CLdnY,wZo۽%9EnGYB [spԶBt&bv#'Weā+gf,*E9GM[P Ee$e=Y_;k>H ;W0fTpJUBx~đP܂ ⱴvs7898Feŭ~ &G/}]h2&Z ϝ|ijmd,Q1DɺDR}!8),SqNl:6`S1s^;cT4ɬ՝DJiڜ3Gl1ָ$d2/ծhYYU\߁k Ј']ge96Q{^5nN]ֿUDsLjÁ7JKW1逹ꝉx\a%JA\H3$ԖPHmFh8X8Q"!bOd;2]>.U[ IU~c#SdUyj޷ "k+Dį$\)}lq-'q2$1} 45Xn$ҕ\*UzWFčBm? obyWf?مbL=. ը&Z}˕>i Vd`{E'4 @ދKwi({mns[*ߧ0{ذ7d!tysūþV˂S/DflsA2SDtvȚ2^ݭ;=C\RKO.o (7Zl_IeEwtI%. ƙK"$Oc!XX:ul;.'I]Uzt5$AGXUC>YkTXWD w%e2M|`@u%o[ CD&eϠV`k8eJLc[\^>1nM SiIRǻ$k?7q'Kn>B0'E}F$EH@VQG;e5XuP{S&lg>払p& TxQR( 5mM \Ȼtƣ˛wםx;>fhYK;X̛>~D :RHܮ5,5 m-'{ebػS֕De72nwcw! &Gw'99qap'4J1wwT+G.ha%4]F_*7P'Ӝ^IK?]wl,R-x@鼟eQ:w)f_ˈKL!VѦԊ/1WWOa[G8h_-e{5Xe\ePhGq_/y DsǴ''p&9Y!7<5RX^m=5 UmISdfw=4,g=iPF CkF@0fM-pם5Ҷ:R.YnMoRV-VaY"e{{2m9`9 )12ome u;z8{ 1obdnďCr;+.1Qre zɗ8MOFRD0Phĭ ole)fz)c쳋TSfFf#pJƙPCW -nE0%]n>EQS4j4pSܮ"*6aq.hzX5ŲJ9Tk({.9_JB%bTqkz`YVrű^FU8FM|NxX΄7QzOFJ}]W}FOi/+XrDő#*j]XtʒdBdh0Ce2=/$&,34sLTCl}uU@"^$tȄܦH?^;F\p`pq\JH-L}@h#\e* b`'nzkݞ14 dkf.O"-JsY4 (ྣp>eo(t#Krҽ?$qF ~kZ r6DnQmX\)`:YAS<.k; pC ro%nHDulJ+ -84D]ƋtQJ !{= H# Hܿt,.J5Qz@?U89 [ZS:HY+:,?+]V^#IFøyY6gapo(}3ȟ5`FE|m2..UA^G@~xYs)bm:WwvLZه,Ra3"8R% ص"z>z_]zbwmH}g8ұy(vUƑBY*$a LW88\eP* !qi*UnM=_%h^>Or_]Lp'[Fqȇz+7l9orًv*",<|[{b `hO،>~r;F&V ĨMVbڎԗPzo]5EP@DVV&vH|~9iy{.3܌bJB/&};l>Quz"莢2FJnCڹɳXYVU)ǫ%cNYAKc:`{sZ!ߵΜX ɗs&d,Š![bdnec.1|[r?AcH]ʜ6l&^jwŋ # =c23f*^1,fV8r!yjyzmq{Ŗ]lUvɀNLCrN ]:ƒ9{o| |aB<\2XN e sњy2ܶբghYkB=M jU􍀞|nS p7)CGEG'OC5yl7Tm @F夎|ʃ8A& y#Po:$\ؤ􄚋EFnհ؞CNDj[Oٰ-Nʀ6,8)=烆с8- Pdj zq/~SƏe-hr12v'm˼Έ菐#N,rwd:8O7\"h7ǎ}.1$jDv*GBe= #1@[ιv( J H-,UGoݞ\eAϷ:f`c>۹~/{Y՝;,$eLE#N&S Y*KSii4L%HyBUS)FN&SI@R)J5 >N'Ie4KS:O ]>S)e6OSi:NTj]0M&S)e6NiFQ(Sq0Tm0LSLOӪa.O'Sim6N'S}DQӉa,RJ$}MSe6MSi}FTI>I%S)tY4NIe0Jdu8N&@MSI4҅BR)DuN&SqDT)ty>Q' Ty>R+j:TTSii4N'@MӉd]6QIi:NRd}BT*Պj`W)Iĺa6N&ӉyDPRdi0O'ɤmP& ti6P>M& q4M&iyQ**JDO 5"6MS)$I(L&jDR(Te*y*J% dY,K)}ST y8Mq4M(T5 DM%RIF4]*K&ie4M&ItU,N' e,F"S m4K%SIa2LiTq6K%ɤm4M'S:K&Sdz!E#QEIRti:Mҩ$U4M鄲M&N'u>Q(*@MSI]0Ii4N u:P$j-H$$rA$Hq>PRde4I$RIU4M&SJ2NSU"DNSe2IɤeP'y:L&IڅHL%ӉY*KS)a2MdY$G $uLiq0N'S}@R Z\VT$qK&IFS)*jLO& da0J$iDe6N'Īa4LӉJN'*5 }M(e6Kiq6Mu2LSiy>KɵZUI1D"DU(I$j1H$I$I(J$iDQ&H$Rm8Mim4M&DM,K%(jA$L&өa&F$Ri4a2MS dU(H= J$RA.I%S m8Mim6M&S)]*IRDM*J$ȴZA(I$Rɴ}BOe0MIt=H$DM Lii6Mim4M']2K&)i4KRR)JTdm>NiiN&Im6Miq6Miq8N'm2M&)i4N'iDR)e8MӪu::M&)e6MS)a2M&Im6Mim6N'q8N&ie4LR5Mm2IҩtFMɴa2N'Sq2M&SIi4M&im4M&iq6Mim6M&Im6M$R(z9I$Z!ERI4Y.O(SuLa4MSii4M&Im6Mim:LIe2M&Im6M)e2MdQ,N'Sa6N'Se4LIi4Mim6M&iq4M&Ii4M&ii4K% Q"HR)Q*L% u6Mii4M&im6MIi4M)i4M&Ii4Mim6I$iD9 G#QrA$IS q8Nq4M&Im6Mii4M&)i4M&)i6MIm4M&iE"G$q6L%iq6NS@O'm6LIm4MSIi4MIi4M&SIi4M&IE$Jiq8P(*% BR))i6P'u:N'i6LRe4LSIi4M&Ii4M&IU.M&Ii0O'ie4MdU.O  HQ(TJi4MI,N'Ii4M&Ii4M&Ii4M u6M'Sia.M'StM(I$IuP()@M&di8O:M&im2L%)e2M&ii4M&IyOөi4LIa.M&S)i4M&Ii6M&Ii4M&Ii*K&iq:NSu:O&Ӊm4LIi0Lie2Mii4M&I]4LIi4M&Ii4M&Ii4M&I$=$LSuO'i4M&q4JRm4M'Ii4M& i4M&Ii4M&Ii4M&Ii.JITY8Miq6M'q4M&Ii2L&y4L&)i4M&Ia2LIi4M&Ii4M&Ii4M&IDY.J%Rdi2MIm8N'i4M&)i8Ne0MIi4M&)i4M&Ii4M&Ii4M&Ii4M&Ii4LӉi>M&S a6N'Su6M&Ie2N' }M&Ii4M&Im6M&Ii4M&Ii4M&ImLS dq6M&SiHQe0LRi2M&Im6N&im4N'iyFV+fNIi4M&ii4M&Ii4M&Ii4L RRO'im6L%de0M&S)i6Mii4M&Sii4M&Ie*Rm2JEJ:NIi4M&Ii4M&Ii4M&Ii47777GRIBQ-2 gNtS' @?`???0?p~?y;~? j4m&}r8[mEk fEp7MfUiZ&qo6Z6Mk5-fAq8\ ]j vQh6'ij-Ao7mfEk5ڭak-}m6Zf]c1YL{QhehVAi4muhnMakY c=kfil5ZmIgZM6Yh3ڍ}m6[-eo,֋Uk5-um6 F1imVugZm}lۭMm[MF]iMFem[5k5ZMV]j-FylQjmYhM6Ml6mQiZQm6V]j36ql[Mii4M&EjvYf4[mAnڭFUhYliq}jEiFUi4-]nZIc2Ym5-mFUj5Z&Yi6EjZUd3ڭ6If2X6ijm}k4-ip5-FIbZVYn Yj3lKiLVK=p8Mh[mum5sQk5Z]kڍFQj5VIp &id ;c+m6Z6=f}k4M&Um5VQi-fMgڬAmVmj5MEi %~^/X &C9fmV=feh5f=jVIh3YSEi3-Mo5FUl5&ag3YL+~_{5j-F{%h7FQiZ,{Io6mae2mh3 [AiVui4ZUm6Lk)cM&=j5l[!o-Qh3Yl֫ulͶ5iZfYh٬Ƴuj[MQl VYmVEj5ZfUi٬sIt8ZsAg3-Fai4CAm6vAimfMjFAl5an6ZvEk5MIg2ٍ6ur6Lk5im{Ae1Mem7V{=k5fQj5vqj5 um F{=l56AeMm4M6UilcAlۍMo7 6QjZVMj5 }jZfmn5ms=jM&5dmem6ۭYe2&˅p-FEk[-QjZ6Qj5vek6Yk5,kEi4 K!amUn6Z&)f4ێGKm6FYlMVQj4mVagMF]k&Ih3Al6Zc!d2l{Ee2Y,fC-nWej5 ]jfMgZ-6=im6Ukm9i2]q[V9elk1c즋mn6Z&=j-eiڍFIh3YLsAj4ڍVYjlƋ5h5[G#m4ٌk9fYk1gQg2,{Uo6FQjY춫%e2Y K!f4fUeel-vAfs9g3-aj4K5k vQjVEi4lS-d,֋QjL{AlLc=jMMj4m6Uk-EjMuj5VUj5ZV=f ]hZ Al6ۭQf4[ ]m[qmFs-g4mejZVUjZVQiQm4Z {=ifMFmn7\'n6ZfAeMYjZVUjZfIg4 eiM{5k6ۍ5k5vio ak5fIiVUjVMhMUj&AfM&k-g4ڍQo7ۭYk5ڭfYjVUjZfYi Ah4ڍ&Ag [)gkAj5[ ik ]jZVUjZfYh4Zm{Ah3Eh4ZM&#)i Ai6Ek6[-F]jZVUjVYk5VQj4m&Ej5Z&{5j4MS5hZm6Yj4&UkZVUjZVUjZfYk5Z͆Yj5ZVej ]k5փQk1VUk Uk5ZVUjZVUjZVUk5VUjfUm5ڍ6k1o8\ Qk6SIk5Zai-FMjVUjZVUjZVYjZfYjVUlS%nqj6Ek5VUhfUjZFUjZVUjZVYjZVYjZFQjZV]fjm%hmVQj-&Ui5VQj5mFUjZVUjZVUjZVUjVUn6-Vel[ֻQjZmEi5ZfQiFIjZFQj5VUjZVUjVUj5ZVUjZVil5MƻejYaj6UkMYk5VYjFQjZVUjZVQjZVUjZVUjmeo7[MV{9jMFeiZVQj-Mk5ZmFQj5VUjZVUjZfUsenMMiveiڍVQjmYj5FQj5VUj5ZFQjZVm5 ekZm6Ij[mfQj6Uj5FQj5ZVQjVQi-VUjZfUo6V]mMIjii6Uk5vUj5V]jZVUf4VUjVUjvQk5-ahfqj4ZVMjZFUj5FYjZVYk5fYl66Ik6]k6[Mek4ڍ6MjZVUj5VUjZFYjZVUj6kMh5'yj ejڭVMj5FQj5VYjZVQk5fUj,Yj6.g mk[-ai5FMj5FQj5V]jZփUjZVUj Qj5 +jai4FMjZVQj4mFUk5ZFUjZVUi5FAk7.&mj6MvQj5FQj5ZFQim6MjFQjZVUjZFUj5Uo7QlmUj4ڍFQjZFQiZVUj5ZVYjZVUjZFMj4M6al5 Yi4 Mj5FQjFUj5FUjZVUk5ZVUjZVEk6 VMkFYj4Ms9hZVQiڍFQj5ZFUjZ&UjZfUjZVUh4mv]j6QhZM&If3ZM6{9i5m6Qj5VYjV]jZVUjZVUjڍfee3-=e2lsAh4Mf9f{9j5VYiZFYk5ZVUjZVUjZahYs1g K%iVeg3Y{EhfUjZm&Mj5ZVUjZVUjZVUl6-vIg{Ei3,kEkڍ&=gZakVUjZ&QjZVUjZV]jZVamڭ&{9j56Ig&IhElm]kZfUiVUjZVUjZfUjZvakZm{Qim&Mi4Z 6=hZ-Ul5ZFUjZFUk5ZYjZVUjZVYkZVUjZvamڭfQi4ڍVUj5ZMQi4-6MhZM6Qk5VUjZFUjZVUjZVUjZVUm7mekZvYiFUj5͖aim6Ah-6YjZFUjZFUjZVUjZVUjZVUmMal5fIjFUj5[-QkZFUj5Z͆]j5ZVUj6Yj5ZVUjZVUjZVUjZ6]kvYk6ZFUjFQk5[ }l7[mikZfUjZVMjZVUjZVUjZVUjZVYjLMj6FUj5FQjv]o8YmfUjfYjZVUjZVUjZVUjZVek5Mh4ZFQjZFYj5ZfMkvEl6 fUjZVMjZVUjZVUjZVUjZ6ej4mIh-UjFMjZf=h[-VMm6VUjZVUjZVUjZVUjZVUj4Z &QiMkEg4Z6IjڭFUj 6Qk5-mjZVUj5ZVUjZVUjZVUjZVMg4M&MhZ {AhmFUjZVej6alZVUjZVUjZVUjZVUjZVUi61h Ij4 Aj5ZFUjZ]j4ZmVQjZVUjFQjZVQjZVUjZVUjZVUj4-&ah-6EiMQjZVUiZ-6]k5ZVYjZVUjZVUjZVUjZVUjZVUjZ%m7ۍvMj4MMiFUjfYj6[-YkڭVUjZVUjZVUjZVUjZVUjZfQk1l֣uk5VMjm&IjfMj[ fYj4 Uk5ZVUjZVUiVQjZVUjZVUjZVUl5ZUj5Ym5Ii4ڍ&QjZFMl5{Ii5V]jZVUjZVUjZFUjZVUjZVUjZVYjMYj5[-ei6Mi4ZVUi4ͦah5ZVUjZFUjZVUjZVUjZVUjZVUjZVUjvYo7MVIiMUjZm6MimVQiZfUj4VMjZVUjZVUjZVUj5VUjZVUjZVUjMfyk4SQn6 fYjZfMj5VUiVUjZfUjZVUjZVUjZVUjZVUjZVUjZVUk6Vaf1l֣Yp66Yj vYkFQjVMk5ڭf]jVUj3햳UjZVUjZVUjZVUjZVUk5fEeZVUl5VQm-ajZFUjZVQimFQk5,c~c'ajZVUjZVUjZVUjZVUh3ZEk4ZMV]j5͖qk5vYj5ZVUiZVUj51_2Zm6vr<]jZVUjZVUjZVUjZv7777GRIBY`f  H(P(Ev0'r=!p"T20H"$H"x7 $ԗBrF++&;"2)$PQ 0$(!B&H#\bS) ^* &vI'm_#Ԉ ȀE!9R'Ĭb.ϋ/, +`B{ M"1Ǘt|rB!R>IZ' /, 0P .lrə#ȇr 3!@N&${J6*-TK1S< 2R (ܟ"z)I- 0ƣޮXz?*61Jx jg㉸pͦ)};E`3EPF) fa@LeOѩ4Ydfw%i2c5+fwy$uAM28ぴM$TFYnvAd΃D\pX-jeC֪ w!XKQo9\$ѥg9ϧ5AzKr:MD$s%"Idqw 6LYn/U1(̆;M46W-[UvH\r?$Ǣ9eYf[o uKOPDjS/ \n{\.]jԨtIPc ]EaX5jy<Χ2؜6}zZTUjV>Ogy/ApRi5HPh e1%z^u8MYm6IYz7;ܮGqȍ#I!JrXr5;mV9d",573uzK+6KQk.{#E"pik܍2pnv!|Ba\2w،{r1[=f]?ߏ6 `2{eo_`7777GRIB`"i   H(P( #w3pYk=i2mX [2T%neN)_.*"fuB#JU^;W* e+_s+jӦ qlB%80s}|:FX[ &5zJϨt&u<)U[e| u#iE$ҹS%ȥORN!$92ʤ$2;3C^-͎~?n {?ľM%l_!p4V1Kev3[v.6Ӆ"qd5 |gu\N7qyEaDB+A`iu]v]l5f=%Iш," cYwg1vs(ʤ1: ~ߏzՄmڌuntr< _OwTL֓9V+V̾Q␧y;E`,BǢhRy:.kZVuDY:bxJ)Cb(Kfj"i"M t* !wYq3Y,Eҥ\B*"}=^nNge,ĪZo<.cl2f;iW{H|Uuժ՘e,^(7777GRIBgXd H+>(@;po??? E( y6t—BV qK&!1Њ At!3TF`x46Aän+wl1F"V>'h\@n3B-EH |O 8u"?E"D8 @ 1@HyctbGIY:'D$/F%d)$kOj!O+*9%]-%p VJZ&q<9Fd!t" `je,=D0ԵdėW M<&tѺ07.˘WʉB&"(@;po???B cY0[cY]J5.٣9f칓@Y[3g-4jU^EЙ5e콛vКehT 8f 4Y:h55jI- c{ekMM4VZkPfdϙCxsNq 鸶cFgl8e 6fϹgܚDgL͝2fL!4F|ʹޛCTi 4jQي3&=عFVjQ&Xt5KMJA5pmѴ5Y)bm^lk%6^ə_*u.#]mMQ3F\˙C#cl]2kiilٔVRc Qҙs cu1(YS5fLIe7ƞXc,i,ڛemɨƺ̘b]08ڛvu ;FbLQ1F[z/7ؓbE]3aIf֜zI&pۋwm>7777GRIB;Xe H+>(@;po???x7SV3WYq[\]]]^_bcAdbfbhxnJp[nZYYLZ[\\]l^D_2`dei=llpA1}.GkGn[\C\D[\P][]]^u_`ci7mNu~3}bzeNI]]^F^g__```0ab1enyyr]T^ ^_N_`abNbbbb a^Z^]acy\_U__`vac2bccqaacza[]_q`a__``abcWcbadk\[~^ _`a ``abNbc$bb;d[iZ\^ac(@;po???C Zmu/Ø5i-(@;po???a]]^`[M[\\\]m^__`@VWX_YYZ[\h\]y^^q_`bIOeAjkPkGk%mjj(iihhi2jkklm6mjkkGjjij`kzl lmnovop&kgg(lljjkkklmnopqqrr khm3kklglmYn3oTpqrTsssssnp{llmFmn6npqGr@s+stauWv.vumn7no(oepqsstoToppq3rzstjtupq qFqrttuxuvvF7777GRIB=Xn H+>(@?;po?? B Rd1 l*Aa5Ƙard$9'%d)"ĸbg##!1V8ȣWs|Py8CB][> A+&<ԗSiC|rnF 4 c踗CDo.eTy%(O!^Cjl^Knn(r,SmLb`s~Sn'ch,\N**)$ګEgl1ZwnE5X _kU @ٵ3,WY =D.>df%@mOHXPBH ~7]cn͉m4F]ʑg;ՙRX`I 3f^:b `b t-A`+DxA4 4k"S El t+ 7777GRIBXm H+>(@?;po??uABVY [\q]]] [YYB6AuBA?JaLMKGEHAji-h;h^ggjiljbbU^V+WgXOT"Kf2jm0jgliQeabdZXXHXYSZ~Z0XFZjbiBig$cbMb eaXY^p_`ba8a@]a>devcdabfqW?Z \_ha)caa`qaa`abc[[^dcbc cbbbTcRpWO[\aGeeVdGdvddecba]`R[ Z]gf]fffeddHc_X\$[`[h[[]`aPhgf;fMftdcb_"\[X\] ^`/_jggfeeBdc`Z]z[[[]2]qihEg^fweda^\\]\^^ ___kpiihfAcad]C\$\^^9_]_``^Wnmkhfb][^ \] ^`]UYtQqEmRhe!_LZ[ZWZ[[T\]w\qje(^{YmYcYOZZTYVWWX>YH\XUGUcVWVY`7777gdalautotest-3.0.4/gdrivers/data/grib/png_nbits_zero_decimal_scaled.grb20000644003401500001440000000027013614004466026105 0ustar rouaultusersGRIBH:\r0m0:\r0m3g*@")A7777gdalautotest-3.0.4/gdrivers/data/grib/spatial_differencing_order_1.grb20000644003401500001440000001307613614004466025655 0ustar rouaultusersGRIB>HY1 % d01--&Q֢@&%&%:+  1Y1E3F<aW6*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*m Л*lT&ʛ*lT&ʛ*lShM6TShM6TٲʛBleM*l&ʛ6ʛBl*TeMlRʐ6l͕6Xd*lЛ*leMBl͛Bl6m 6m ,leM*TfЛ*ld @m  lٴЛ*l!SeE*m  ly͡6Tآ ,@ٴ&ʛxCd Bl leM*ٳf͕6xP͛6TءC6lfʛ @!M6l*lHXSeM @6l)e6,b,TaD ,lSeH6(ceM*lأd LlSb6U1ŊlSe6Xʦ6lci@lchM6TSf͕Bm,lf͕6Tٳf͛6lٳf͛6lٳf͖@le,d 6XI$I$I$I$I$I$I$I$I$I$I$I$I$I2I2!0ddI$ LI$݌nSt$II$I0 $ $ӭ$m$mI7]I$ӮM:$f;hI_vM;I4wu { '}0Mm$7ouk4>4e֜lۡKLalJNaL6 4Ia$LiI$I$a0L& $$ i ^  W  4   !,   %$   *   0'  p 's ' 0 (11, &33%2  &/ *(* +%  .   $  #  %  ' )  , , .  /       > =   =   =  =  =   =  ?  >  7  J b c%es *{+   9???? f?3333333303333333 333(33333?ffffg, 3333?",Ye(Yhfff c0 dsQ1 333 c11`]g@33 c1a`1k0(?`(0**)TRX 33033333333(YVŖYeY`QJR`U Ze1c,&1c0Le&1`03,&Y(aK-,aQRYc 3 c3c @J((,U` `c `3 e3030eh(` U*ֵXkYe, Ye1h1hYc6Ye Z?c20F0EQEETPQV,,,-aPX,X$+ 13 + E,X e X0@c1`e` A-`ab` X X f, DF0`1VekX E$K)JRP QEd]DSY(A)kZ-`X`N0'31c H D 0W0H#fpr@U 8eYe1@1`Bpa1c3 c18aEȖ., X eY-0KDaD]&1c1,&1"B@ 2  ,Yn 66Z+a@,8 8ͬ  U0bX(?% h +"akYC ˑ80EŘU1VUUUUU@UX kZ̴bqr˗$0Y".bXYPfff`f`PYV(kZ h㈘,c, ."ZYe0D0E-E(QE, X10 2ŖZ X J)Q".0rÀRmKA E)@RYa (XkZl ,,X (2(X "0 8 UE)JP(P ZŖe  ,d+Zֵk( U3333 333,X(,Z(R  Z QmXn(PeZֵ`ZPQJR)J*0` `X`QJR XeXȖYV*1eZYeY`,fa0 01c1c`P DF0F( (312̰03333333hac,,X@@ ,1`1` DQ,0`1f2`PUUUUUUU@*RX A(dLc1c RE)JJRYVZֈ 0 11c1*ְkZ* YV Zֵ`0 ,  ? `????UUUUW7777gdalautotest-3.0.4/gdrivers/data/grib/transverse_mercator.grb20000644003401500001440000000031013614004466024155 0ustar rouaultusersGRIBT a(a(a(0?@pp[8h\" sk{7777gdalautotest-3.0.4/gdrivers/data/n43_hillshade.vrt0000644003401500001440000000706413614004466021557 0ustar rouaultusers 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"]] -8.0004166666666663e+01, 8.3333333333333332e-03, 0.0000000000000000e+00, 4.4004166666666663e+01, 0.0000000000000000e+00, -8.3333333333333332e-03 Gray n43.dt0 1 Python hillshade 1 Int16 gdalautotest-3.0.4/gdrivers/data/spif83.ecw0000644003401500001440000005256713614004466020225 0ustar rouaultuserse@@ _ph@ o_hgjWA:OdZAANAD83WL2CAL6M A@ x#Q%Y,2 tK& vPXw)}U0˫O}[,lþm>e/2*z{a<[w >;?8-I/B:72A=93QU^h]VJYaVI XWN*W'ZXCEYRT.H<4@CELTFOKJD0GGH+S)M5FU,P16|(^Q=UsOVZɓUOVSMϞ=陳gΜ9{*WVۤ}b{N"}[Bv$7B<<ۨ@ a_V%|*ٛHn^gp}z@}oPtbe!QZ{LwN۱Н h+\IιQg_NQQBň/-g}>+*˞8R֒\攱IX}UcNL0U3<ƿS{_^<}R#$#!]5#a{4Yy3E.kCƖCgu4y"P}┙ 0t\ \י91WF˞>v $+xITDn-TnoO݀W4YUq0ߟ} \6hA3$mOiLs=[J}*1R Y(.?Z*aǗ~dz [?zRGG ,ˤ#M|5VN1#|z2]g#]8wNj@Ёԭcfb>(^/$DMН95S7GI,07}0 !aYBYSt~s4_Mjzht\>Egd#kV.-ήi^m &`٪t %hYTEPW o3_`j\ap1Q2Cbh73 ًpw`DL\j=DL/\<:W\τg7p<2hh\pFL:yVZ.uh*r+ vy}W^,VlӬg&"sbsr;x炥;f4!6)5yÜx0ދ>(m䑝H*"XԗCtcuӷyOijcxR^җke!\~ٿ~#%dUQ9[َ6WNhQI]?Ʋ&xnBb}EqZa{,͛~ܗ~l{'Izy_iI}}uިr;!G3tPC|yU^2[.$ۇVޒu(h9(喣NIF=RLGӬݶ;cEÆos=-!O~SOasy|S|jW,ioaU[[1{k w5\jW<T[svm?}X{ن'OM<fu^UX?_Gp#* EqWS?N0ߣ*4*= (9!S{q8;qVCM 8ģLܾq m7?8B3*%M``r>LsG+@蛞3YyXqS݊!O!hW,ڰ;tF'/\vc87??a yO_h؍;R0&><0(n/9rAy7 ~u?;Д~)Qb23-ΒjߤA?1sd5NN M>4;Jyox}vOPM Ni!gN12MZh}xzM|ߚK6O7kqnu5HL3]7ցoW[m |m1ֈU?bMt]&aދYMϽ!~(8SQ٭x8:>^a$Ս([koqQ;jo^7O<-iOCœ9=ww3NʸjS<`m mPbH۷Ǹ]{O:̘4+nr7`;j ww;pWňiuzE`|Vaj}߷&ް_e ݆kffЄiRaTVW\@]NIAEGbCQSU@d @@@Z^@MFDXHL[YeOcKJB}޽{7nmEƝF6nT׶;nFoDvlkCvF6[}kt$.nD"G,Q3<ժ 7 T)C%p t)9wn|-LJO쀔V+Yb4X5ίgP{ sݞCC p>G>3ʗi{`nVD?d9/9_[@O3x;Gd_8AݳE><8fM/"Tƾ[\Lf`3=сfۓ_UDÐO|p>+ 5Q- ػr臿4 p򁜽q{bWsH?G&q\:5b/f2'W5iډ\TΈpq֠/)fT˧鉈ؖD./RE})sgp)?ެ~E[C}`f[w.製-jG/b|R̲gzq/^{2jxFO1%Qnp㿂i1 *5>ޝ^d>>FZ;n;]G ϩ>/Yvgts) F7kJŸq3bil6Kнl|(γl_n|fwkT_&ܶǫLjcU\- ib#}?c6FQŎPñt%LN"}~ƿ/AP/\;Fal8lECx"=%V Mt}˽Kcl1M>3"#3Om6t6{7])> /f?SzPX@,L\[x)dٞ:_J'BA>s3bOK_dzȟ{|sѷim|Cx |rVr9v-1J-( Ν JͬUjLc_n(3ONa' !8%(Xs4?'ud >e&kAc~\@}AM; jf;f?RgczK;\sp1HoI;73ZѺ虗 ɂq6hWbCoѽ7X.$5KjOXWn]d|jV7|m*u`oDa3߸Z1'Sx;ɋh[꼹G w91Zqyqo֑w'%GQ^.KouCA-(c7ӻo͌{sX__Ͼ9%Zi~HQn-[ҳkYsָs}h|ztu\KoS yH4z/`6+wxʣI9m ?ڲ߈4 :'\UJF_|@0kf0zI~o#W W Ď~: >y_[ ͂<9vS.\77j5G*]u'[R`[6 x ̣7O)GonkUz6ru 9Kb L[wY#ᅯ5_ȋ*J 2qَ-t1xR~ʵW#7_™U#caDՁ{^=svj|^im]۞G;9oSg!0 [yR?1b?NMN!ӟy릥ΰa2NǗ'q\c4ZL[^sJ*bp7-H C[Ax8'muw5!t*+`܀a >Rul7`r<ۨ^-tK .LkVK-trڍUt幪CZw Zxí P}%<`x_\DB]uGGۭgvj Qn\7ü 9{MoJ4(~Yi4aaR$q?$XNH.ˆLc5@Hb^,^w,{}T)ۢiԇaհ|H:>^3fY]- ظ,n *TmW}f}`ϭ8۩>~VKtW^\=D=B+ܗ+Oڵ'7lqS͎+йs~ڙwF" ۣmtkdi$#_E]~-Mȓ9[S#K%WԤLS ^~M:NLFEۭ,:몊pFMqڭ⹍~k xLnUcQzɇa݋#Vz1:-\g$':up~1:qOgWhn=w>nA&эXӜ}`o.ˤnq}WѾ,zw9sBhtnNE!}O\^x쇒]Rxٻb6r 60dnEw)ֹa6q!:,z>{8z?]DP>eC؟Ņ=Gl@ (>P8|$|, aP[iLz bIM/}ع>4/䶓,f/%Ŀ Q+e\nV-G1{=BK,-!.VġԱ,?5vq̊'\Otsǟ%#iF`_wYj杕.OM)xߒ%Z{skM*2WHԻU}b\L&E67σC->U^l˾# oD`Mw1a/|w+qѹ'$d%3^:< Fa?ۍm~:,KwH yU k"隭}bY/[VJYiD`` 4$sbp?^W(=u#(ȝqU wYci(e]f$e?~ҾnAM_OjΪ|Ώ*0 }@W/VsB;L*}X(=]z>:rs#4YJߑ4ﳬЧE3>YY7uBBPRPS#Y 'Q!ͭ&GWUYiGE\cƐGqb{3|."dhCzyeGw8}:\ z#:#E׍Nr2:{ ߇#Po>W_U~7 fD5Fx֋}" ΂ Ћ6"Z=hBx\-3E̯ k25+^xDr؃Q:9 u.o=+zƓ''ZW#VM4qm_t۫kct~[A>bE3G=yCcǙ#z/'7/׽CnwG CE^ebnD/u2*-w|l$?y=->w-fX}uOs6v yLϙYLğ=Z8_ C4Ϥ?^˥BŽǣ]/MǦ'{t]<9_D|kmo 3 ;]LK|__o0NR|j;}P63X({bo@#,QzKξЋe=_ܼd–1zwУ9OOOP?㖚G R|ՙuge}95- Jc-̪2B'm(s^5lfSpӞNGnOOI'W7f^[~XG~˖$*t| N=+RqLyzgJ>9}m,S!M26^Xl-vw )BĹi9nMz?6~0__|߽y"aכ͠ܯ6cnyti6鷋vhsIi[9LYJoY"fprdmv;N0c ME?l&7 Mp2 c!>A8;@S24=E<1?76:9qB 1:צWoϣV"XQaRASBXcVCFDT׽s[LJNʃZ;CRTD@X$@@YaWUGESQV,@@'@.@@@@@AFB@@ g2.pav"ޥ';Rb$W4Z}yZ DSabTCVREFYGBAQ1'.sqA@UPGmjgk)'"ClbfinQBeRohcdaA}DDDDDDDDDDDDDDDDDDDDDDDNDDe,E&Y {}hQ[qmIg;ZUKdG:߭ث?3gLQm%i6Ng=kn_C-bO&nM_m۳E42uy[DeDN 2ܬ ֙C 4I-MB#ͻ-X&|zgҭp2ymgn ,}/0͙[7A6gaFfz~/@4X;okd\;\Ra]^ 9i4ȾHhn8[rlNٍ`HPl%I">^vV\q.\!7$aA|h$y#$4'hZ~1 H:>+7h?yƺ^DQX%AbasY[lE!-s?=ݣWK*_obv &2˙m%D"_8H{7ݫ7jH.WR7 u2ZpT|fvnhpm kK3k$^lG.QKYY aibhkBjmoCnAcea(lfR$#!dg*0>?'+5P" 3Q m Z1Oەl;;d~:6S o^]:oW_`Y4ĉh-QjQܢAo:F)Vypsc_\#ř[6MřNrf4d/iX<x,ofq9Z O yw.S s8rO/-4-3ʜmm$asiaKz'n+ًdQ+{}aWGQpN͛`:V l;!3r yڦYQBشhҹn6aBw)khG{v{Z_iYyM-|yw4'.E;}= V4_lkecfDSjC/idRA+4,7(>h- "=e =yƆEsvV(z};z-wlk7f^iA`Qgf<51c1U~?\##nY8\CI[V\&0>EX$f,w[>66 R692mw;<>ъ/I؎쫦ɽ%_Lb#[}pd[tKd>8X-fasΖ҉cJd㎏zۧX01kؿ?10)I6I,'cilm~&*êmr,\Mݝou͏;ogNa8k_~#,fSqĊ0 赕6?ih5C2 1!"%+#9:&/4'jngcbAi-8BefRkmdaolQt[D5erR 1'#ssh3I٥gwv7uZ2$e'|6۶ąj57mgc1߱7qt}ri)?7s^_Ζs-vwåV6yIYz(03/?㵫Mb ;88ȷ}">Ymw!omVMأ/8pICޛ`~iDۥ8&оΰ;#߹g]pz6e2ݷo,] $MbL{MHVW6 nʗ7#(7m-曳/ 7i8Yǭm 'W۾Nbw7G}X&#Cgqi6_$Ç˵v2:,+1KuwÓce0~ͶHRpu6:\{+E$ gGHduoJqfy. ܲ-"/ m=:i-{"r)1S޳3{"M[LW| A@@16@Ac)eQTmRiSa.{wwwawGD@@  _jRnoUgm$+D" %CSWfdbQBieal#'khcTAQlgY"8^r=9"E%ZSg -6ϛ&4kyzOyP6DoG1t:6+HeD [HܯEbD*S-&$96̴99->,:=O9:\zOY Pz͆SbnS҉{ytRěvqJ-& s4nSS6M)O˭6β7hl>^7^K5(RγH%XvJkgyΏ$"hs%Gf:xMgS08 AYeAxF 5E;شtdj[2Cmn: EegpS̱mKe{u^/dN`iP[!Mʼn&7+6ۘi%pB6oC7-%l3JW<:b|>~u;:0 ý0{; w{{{?U_bdgaehQAc!nf?-kjiB7'&)*$,2m .#l%C3 IWoV\3RTx={܊ m}b/˭iuS$vҷ9WQ޺{XspRxNO}Eq9@+hӴon h%ɤPdQc5 22_(<"gckcq}?Gj%q'w Dɿ[+;'>[УGFI2f鿓_w$pۛ?0r$4dWDm6\ٯEAQ}DneۗghnfeS&+4R0o!B9?$-5*)(c# jidal/"kmgbQAydjߖKoL>4enrٛ 6ى6KO#if;x÷%7ɆF68ܲx*7[>\ RNrǩĢ[W,Vl)tTdz$ <NK߾Ӳu"tsr3ՔHm["uqd_ jy\>ENqYbO?ʶK7c;doL'o'Xܚ'L%S 'LL_>khx 7ڲɎ4ۧ[-F=X#xxG8tdž#om UclkCea2&.$"!:Ri#bdojmBnhgfAQ7dr7* 7dݵdN$mPt8眭C^?L_w]33?!3{+pl{s!f̎;zl=8f!sqZʏ7g>L jIgkz02b7ދK)ێf5܍4otyC7Kk^ qC9ϴ<[3Ycqxslqg:Z;ӳVۆ6sْ㵆:3 ^\K<$1.5*46YuKl=F~&K͎ZHR8)[^ٔu]A&yx ߺ7{ 3⦼[s?A̔i;~٨u΅6睿ƳґLu˺eлzpsK\$}X b:$$&[a&X.\[6,lȺ=n '$QA;.x;L#- nre1 5v->f-w>-]d(zIK ~JʦdJ3WmQrW|ь^Cʚ͚^4z4os ?9WxExs-˚kiMrY85NIݶ{s[-mU$ipkii#^mL'u@@ @@WDQCSAaTRBVUa0 ÔT;~vuϽYw0666664ogacdmkAQZYvO^a!0an*~.kfbe,QM$?|e}̀g-cd4jr< hB2(~HCEA,@J`bә"y"L,^,↑-#SyBGu2-wIӝ|߯g3j)?Qifef]Sɀ%vx:>rƤN>&wуM:w>9 7=wprELgXk5$n"g[kY:@"@@?m@@@B~@@=@@À@~ cQA5HC),!71BSl#'cdTmsf+3=@<a2ge>bn?nidkFUU:|tDZթMwկVYuZ4iҮN컻jҽtѥy6en״Fykeil&BzcY/6-4pg=kRnaj&QU*<^eo8ˀH>slbkE9,0fF?Amm[c/ŌwHG,;hQ=b@@-@8@e@@@@=@@?@q@?fTKAQIe B2laR?/=6g 耀";-)d4h~ej5UGUUՌ Ls7r{wmE'mWlamǢ{?1ٓ~}; LlC9E-bd5WQA\a2,u@B?$_hxX`_/ȓ=8O2£Ipf'O>'?@"3;@}@@@ @A5QOxa@B;8(c>fhg=n? 7AH GT~MQ:4;9?9@@@@!@&@@ۀh@>@VWہG@+@n@@@@G#X4A@3  ?%a>QAqm۶m۶m۶m۶m۶mNUUUUUUc@ @Ҁ@@@%@9@;Z@;@=@! @(@@@@}@EL{@@@>@D@߀@.WEL>@@@ w@ "@@ @ @*"@?@Ă@w[@ "A>@m>@ e @H@?+AJMme?bj̄n =a8@~I遀UQ#;/PbKSs3@>#\.?@?@Ar@]@ ~=@?@v@ @>@ &6@HbAM=1@Ѐy ?(:dAQ۶m۶m۶m۶yGm۶m۶mVMO@{@<Ás@g@@@$@>@ @@!Z@@ .P3@@V@e=@܁@@@@)k'YW!3dGn7icaj"gmQ<+Ah>lb=;@?z%#)eb ԀnZ}uAP'tC]\tuc[;$Eg-LKOnrNt&w[7s8s\Ow-LG@-fUkofg7{VN@5@*@Q@$@@@iJ@@%@I=@@@<6@@@@B0@?CB@@@@@@I@@@@@:F@LS$À=.CIagbQi6Ln3%7l>?A0,w`d!;<cApW,Z|iAtcfq6?lAaQb333333333333333333s{{{{{{{{{{{{-l27Q?BR,a~;Lˀ#-@{ƀ>退NA:{ M zAMQMcz;A?7hgQaf0b%njmeB/i4d5"k(.61$|z$Oߒ$I$ɗT璇3:v^^tvkG۽$I$@΂@}?@;@;@Ё@dR ' H7Q?RA?  @ 7B()dAQCq@R&O@=+<G\)nAs{g6<3ke*lmdf?! c>aTbdQA:DFc9>cgDq}DyQ;e{{ 79e$aA=k7?-"O@| gb> QAhH\~ 3ؙmMNlE-w'nO(@<@@@?@?@\ @@%?@@!a =@a@SP ,@HY QbacA~~~gdalautotest-3.0.4/gdrivers/data/hrpt_little_endian.l1b.zip0000644003401500001440000000060313614004466023442 0ustar rouaultusersPK 'Ehrpt_little_endian.l1bUT % T+ Tux 1 @I"cbi^La}aAM+Qyoafž`2\"E@>@@@@@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@gdalautotest-3.0.4/gdrivers/data/n0o0y867.0fm0000644003401500001440000000526513614004466020220 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/0000755003401500001440000000000013614004466024367 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/0000755003401500001440000000000013614005401027526 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/MTD_MSIL1C.xml0000644003401500001440000001710713614005401031712 0ustar rouaultusers 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.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/0000755003401500001440000000000013614004466030635 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/0000755003401500001440000000000013614005401031246 5ustar rouaultusers././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/MTD_TL.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/MTD0000644003401500001440000000775513614005401031633 0ustar rouaultusers 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 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000755003401500001440000000000013614004466031615 5ustar rouaultusers././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B12.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B04.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B03.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_TCI.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* **BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B02.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B05.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B08.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* ** BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B06.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B01.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B10.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B07.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B09.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B8A.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*S././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG_DATA/BAR_B11.jp2gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l1c_safecompact/S2A_MSIL1C_test.SAFE/GRANULE/FOO/IMG0000644003401500001440000000067613614004466031630 0ustar rouaultusersII* rr BCD$E$*Sgdalautotest-3.0.4/gdrivers/data/8s.ers0000644003401500001440000000140013614004466017432 0ustar rouaultusersDatasetHeader Begin Version = "6.0" Name = "8s.ers" LastUpdated = Fri Sep 24 15:34:23 GMT 1999 DataSetType = ERStorage DataType = Raster ByteOrder = LSBFirst CoordinateSpace Begin Datum = "NAD27" Projection = "NUTM11" CoordinateType = EN Rotation = 0:0:0.0 CoordinateSpace End RasterInfo Begin CellType = Signed8BitInteger CellInfo Begin Xdimension = 0.75 Ydimension = 0.75 CellInfo End NrOfLines = 10 NrOfCellsPerLine = 10 RegistrationCoord Begin Eastings = 484875.86243129981 Northings = 3620515.0848810002 RegistrationCoord End NrOfBands = 3 BandId Begin Value = "Red" BandId End BandId Begin Value = "Green" BandId End BandId Begin Value = "Blue" BandId End RasterInfo End DatasetHeader End gdalautotest-3.0.4/gdrivers/data/ignfheightasciigrid_ar2.mnt0000644003401500001440000000024413614004466023651 0ustar rouaultusers-152 -151.5 -16.75 -16.5 0.25 0.25 2 1 1 1 0. x -152 -16.5 1 2 -151.75 -16.5 2 2 -151.5 -16.5 3 2 -152 -16.75 4 2 -151.75 -16.75 5 2 -151.5 -16.75 6 2gdalautotest-3.0.4/gdrivers/data/DeepBlue-SeaWiFS-1.0_L3_20100101_v004-20130604T131317Z.h50000644003401500001440000111574413614004466025773 0ustar rouaultusersHDF  `TREEUHEAPX8viewing_zenith_anglesolar_zenith_angle TREE2pX ~$tHF0slAj-Ssdk vquv xD\|$Ի$$P$Hh $l9$ $$#$$i$ 2$DBD HPP H$] HHLiA Hlu H% H H H٥P H q HD1 l? l$ lHll l$ l  l/ l; l ]' lD2"="$="H=l="A"B"#B"EB" gB"DBDx^V[ =C9i8MyT4DIHv3'g!¥L]S.TInH{Kf{y~~ߵ׻b&2aHSBxY$ʿEa2?*aHpča0ĭDTa(](Q~Wa";| GLS(Z!H^AaRWypvEB*&.ao ǛAYA^W/qv"_-s ߦٸ2NA,3Fn`GB%Gn!@;8 3¬=❾Y;1v6@jgd@/5y޹c.(/[np[=@kz<3uC3pf =;<Yx5&)w3jnBm=/Lvyh q{ȿUǯo4(YMDž4p; 8 l+W a,mfvpGM=BM)>lcftOuo,?0/~LAV`Y`dLLam2sGˍawV5>F0i҅C,CĊIV#C04Fw#a!T[L .D_Qƿ~ հwgh!p 4Q0_ xDaok":Mfh{2VX 7LKrȉUƑʨZ=J%X uĪt~m"AĻ}LdܔG 88GasthE;eFqʅ y4`;8P<" s \cÉ +5:JMm\|YS I!Xխ ra@v} e!BjD, NЎ=aeͧqz2F) d/$j;A H V?~>PuitF6=HiAaF(C/ i$$9#d Rmgu6SS7 eN#.9FNm!~I':H2/PdϔHdHRә9(k(ݪj!K+mINN'3dR|EFݴĥ' "~/=^AwH"mM;V;6@hWNEJj_(0evи=F[NʙN=m?Hm{>H]q?fE[K9=ۦZzhxxiH>/ęrNzne.92B'iNu'}K U^rݙ ~Z1@#j<7@(3uЅC4~̬i0лtfP0{0wkK1kztj(U7R2nZN{Cu`Be"Q@O91'em$?k,>e#5E;N URx`$ᵒ4RhIōAFҰb6¢Qic#)Cl"5uxULUUu;PG&ʃMEE\xXGO7uU~r2(8G ( D`2N!Bfdj#o.6iCZՋ6i&:h­t6i`JouT^Q¦2P| dbr QW|Ul5UuR *i;6On9)`j FeFKQUqIn3,#d56cw}Ѷ^VB#K"; tT=D]OH1H1<.)U,eJ%,^n𐷻J1~[ PAq1m %:N-R6v:U}!HSZ J8J0hǝ|}3Շq-? ڮe> K4Ҽ^_Sɴ|\I_^=x'(H U=T6,z)'QD= ˳`+ Q!3 TjZ]5CcH5&2AR=n2X5!A )4R~Bt# (+ Jq!CPm %lkdZ[B?ǿWY(|Tå S&inؿB6o[V&H#9&#) U`\\K"ʲ,\2ͦ۹Į)nb&?>ӥ*-豇TKdo9}=Ͽ3_M mw4`}AQb#;a]s-f5|[# [!9Ñ"5;zvQbZ%kP,&6I8+|?6Mwĩ{FG483FBOSڇt*o;x@}\<2 Ήw[[;Yg,0} 0h8A5z'_IKdu}WN!V@O #~RoĈet!v,ΡQęaR-%Zj#LFaCP[0ת"] 6 J E1&lJ:Fk8I{ʳ h金 n|GgM,vG?!+:o$+]tkH ;&7fq1D1pq¼~'$C秠6Zkd2\l>᣽<,=[FaM4ͧ>SRq>KHH Ŵm[&!˅( 3P1l] e;e\qaU <eA\iyo(a{`쁽KaR5q^O[+p!/OɽhV>ud^Ae{P$zO|4y -u}L#zݩ7XĚ?HtXog"^z"o-'!~&qPƆڒ^*hC/icZC#m u&_O`NeaGx$4g"w/\O-6ΝSE@=TNFcfW_ {'-v<åLe?(?׳hjeU3Be-=AW0^&,y`dx/n,Þ41ǐz%dXOtQ?)G^Ut|>,k}\IEѳ1m8a5yIO #~o6չ>&:VAF^_!:DJXX[Ll.oGfz304 #t`T!Lr vEں@c:X e=SAр,nT s/tgUmXe;EvR)U_?~PS8y@ad{,> Phsڢ;Wi!wD_zإaӐ_"1߼p{Zfے{))ꦼ: ,|1r]̦]WGTФ4\l;? ]ΰ_ٸ ؗ9\8m6AkJ8SAݒsP댨vgZȗCϾޒܧx:G#(֑z/m鐆 "1xcS*l"}*MCJ+(x^W[Si%zKBB@Afcűa좢 TEE" *R& ˽?y)^[ޟex;B 19s~`|ĖatH5ֆ akXw0+0XLׅ`:h(_EKe1j+@@_ fR4w m1D-|j{)zCWw?‹|0(FHvEsUoXoƒ0ox!nRC~'=F>O-DfoLhCٸa/1}Wl|`'V/vP 4 p7~tFV;6ݙ p+9〪3븁?> k9c$ }i=|`gXu@p ̀j+wDWDąП[îy팗P7gla١F# kbLjke8+a&AhfekiMc-L 8bAְ=ax/\AY;d^q֘6d ש: naְĿ'RK:hU&m Ql>H.>q?b%!C/ I̱_7Dh(6ĽBM WGaB$@D>fFi.OsGT&U@\ā:egcc:YCJl X@c*xЪ4|!HEOÕҀd6jB*9\lBc>m$y1+ )p=@tN7EPGaAyA%=U`' B-:0B!rf`^䒫TBTŭҶedNv/kj6_}-Hi8]젭CtѽMr'IdB?)L*iҡ6.뤻gZIo4馶^Ǜ ey2*4> tQX%q:wnr|BͿӃ;m+ɇR:B8mT>4Ѕ &ŷT|N76w|'mImt[mٙTO$bEC=d7mLnE] o'ʭ#o"q\Ӳ'=T:huf?&6R%{Bh\?2HCtk0'Clv& ơ1z1{HuҤCe?O~sIAQ-?# ~REQt' uC˖1*搧K`a&[ R2U >*] 8#`&F˃\2 K<;`^ rL=@$YĴ0&1.72]pET/?a^}W¾m(1zl|QBnv*܂ lt)aD}z%-T,6cWlG(z2'.+C*c)K馈!6)bj{)!*0Ef/KHUSEfq1\xT񐭊,,zƝ ;)y߈eʨ0\B!ITn5h,⁜Td*~Q~tW;S0)bYGShDmRCaTqCvpB 4Č-]67m.Q^% j|2ԉ+҃}6~J}c.>Ʒ]Lk"q|dg=(8 F1z:&FTX0@ QN=VAaukY &qDREU- !v.¼\vr>t3&-8ԁ*}q-BB~2J.]Ӈ!> 1Auh%[S;j^vLpMUޯY/4aW/+/·"Tm0@QaO竅)͉-DZ.p13E*3'4b!+UL,6pTz)_|E L`cΤ%95Li( Q0EX6hf1L`r;uHu6c 6j{gHCțEiwҜ]*hDYҒa<#(:UrI06堤254!6³"EN1ߍ 9'»*Fn-{1ŚA|l3CV1'yK0]Tw(Qya .禎S:;e'!7AkZ`ZjR!P"7C+OblO\zRL{Zr[Nnmz*N<53=PүQ, .>rZgUD(a^Df(*='ߌK|c;ӵy$*]T1^>!us4X?rb^#ggtF5'y爆1UE u#WIohIsع/>K(fr6%(FdC9y'^` YL&q;I2CƧ#<,Rű(9N?KHl*8#>/=E~$m+xCрGI\OU=35ɏJmƊDyP+!5 %9!5m JycT6MFgqv1!i=pU ۤgBu_SKuiJ , r(YWBYR}+ߜi߈'I\}ί(]RB9DwimZ Z >jx!+j&DD[wC:O}^UB .YsbX]BrhT=|J?hJZ&I'l>JY4SIcX:C=[tP>GiO;i}z϶g&xP>5X /o!*]uk&#?B HxOB;AJh]z^Fquq/Y5i&\鼴nGUP|:#!0 ]ȧAO. :`x@MO۳, ıE - ZUc1B JgrP~mE5dLotؚI~EǿA"x^͗?Ǎǔ ƌ}ϖ6~%YD8m:JuNڷSt-:6KlšHRȖ-"+?\뾯^%SPQ B(uzN 8bP=/t! Fs6[e(bBa8\GmC Ab4ah"pP7O,%v:˃P.~!+=OE>_В4B_\>ꋳ!Pg^3qT  0 sauF~H[:퇭栻7` E7o34m\p뎬eHqlcW{7!p3jΐg&Lp&K纡d3 8#j&oয3߸[ kmpb\3'8#2|&a+6s]q,Ja?YbekD|{G x:&-n>pēӱS? .Q{m`nfb{\` ًfw d ֘f4l}6n m{d={"]A޺q^EyR<҅1 Vc:CFCl 25sQ_#|cN?CR$CH)$XUR\(EHji\+E$]CTV&7IlpPD;SxX+%c&?*s+bgqTEs"#U% HjU, /P;hZ6^T)C _Xh:nv R] H/ p r(>NSu0Z_qZP&'uyRX?*#tn?|g(N-8)KڲH?ȷ=eDK6&j"2YI5}ڳ^ >@E mV.饏w6ڞ5D_Ў:D '|7FSUC-v%8ϐwty4)B'5t̮0O/SJWtRfZ R:)mb Sie$P\3 (LE)H?]OoIkROt~T &7IZHݿF?ٷl[;i^|J:]VhtQbWE_һĞ$AwcnJCkJAawYd{hҖvJi&/nr/uKu 2k%nՋ~zʜesGHXts_F* ۋQەt0X$syUwJv!~*Jñ#4zq~6 R9lXISl|~\џ,iydE ܬ@3tFAq|</|L@sP_aCwT XvC1Q\裂Y|aM N \9 pt{jh1V$U8(#ZEu3DCI :-C$ ➕S9Wwu@Fia`&5&.?RƷ|]Q[;U1oq@KDS§J`Nx~a$jjH!;fKQrA >)$cĵN[UƢz]kԉ~upL ؘRZ걊[ D} ZV]x]@)k!tU])e!U0C!|Y(B]6/>Ae}n1zh"F{q*ٻWb`^ܮMRj aBX:-@>B qv&9)#:I%ʐqco9h|`#+!7~?۵!cghQ=`-ܮ0Sc_2O5ƗtǺlM`P)) G W@E2<&Ez)G44 etfeh,YS,Ep~W4\HˋtelMQmy4xBBl%zśD+c~C@?3a-EӖrۨ|<]ȁٜ6/okdjBNpX8I= lD_:|TQ.#|l8XgiZsMd~\*a!ech: ZHrᚓ .3ŒŦ/0I3#5@Z1|T6ZLs (ѽEۜ_!%+6!aa檏x!DF U<#q.&ܡkYeڅi"mM,Gh34Ybř AWRiuM. uh,1 mV DK#DCp7R* M*B\M3)qyq=YU5t~.4h6_-R$0:ߘg_ffZ-[̶qkB f'M`:ϻvWP)u~@[>+Kx5>iFL]n}EoSUf.yeSbI&zEsf}4SughRF]- o([L?m{lwQZFUVPuS-Szh*$=edLwF0"r_&ٽtSKrt*;Sin=4|M Zbj$LH7'8(:!+ ۧ#̱m9|YUP*'\tA 7sE 3wȜ 6d83R4T;w g=y5UTL|i>n?ǤUսӐwpb`|3?t_ NnPɖv¸S[QWiU:H~Wh ЭFzTA5 tˤP,pͥgJO:,7,`6ӰɺGD0+.o\\Png'\hy0񷦢;{ l'f!0 N'1y6xa^@ e[O7B&Jw%1VR>2D'V5c[оdzJkfaLkÍ٭ %(D;Lsi#Oد|[FA5#{α IohOT mf吼u69$]D^WT¾"|MǙ펿WxS]扜gLļ}4G1+DK dvX`` s޸ #~L/tuWk0{<88fvJyJN!HIKgќ|RA%L٦9L6El&MeX$sg2_,(DĄlL=`Ia+~c-n# kp ϬV]l|=_>'Vezp&UOS"9t P'JQg{.<g&y"_2Þ$E\[Q}lk̍8 XGc|{e.2g6Zæ y P[[L߳6(/"*ȳ&ȏ986y&X=f ]ya>;={e#:H,>Ma{2WclV؃AkuZC V%Rt< >m/":%Xp\Ft|@}~>*-?"x^WgCTWeЙt麗JGш{A-0`CX$#F@D["*`A;Rޯx{9VX"p6֎šp;D`6qby86f9q8+M3X3i±!,;q& q}9:aaƜf#Y> 膆viE1eÑ``v]iSKVua`@`2+o#?s]a:5.+Q K @je(>?{!GtRpzY2 a 6k;*](!w_Dⰹ/"Cx| Eg8!/ҼEv/|l_-T_ &lQ[D2_B  EnC6y&⋴pl1<<|7e#)QZS̵P$:l>:& {A5gm`y8]c:8a UWAn ت 7S^I!yfиr% THh 6epVØznvTxotLM{߱q6xZzx iiM+iL-d:E%-ta7kSvQ'ij_MGt?"=]4~R7mkEnrb@Yݴ0+OCrl!C4}m;YI-dגR;IgM+ɦ[ly=]VOW͔zzc 1o/T7yO;eejȿR4SJC3ͽZO)LWS\E_h) t>&JSG;Yصф$dHYFis[4Ү/픲RԛJ?бf?*'+H~lcZhTEyIJvh&i#nl3yǴ8L7jZ(84鳭\F]tԯMgo"ݴ{><쥖Ckw?FÓGh^d7G=$Y.6v|aaa \cv;,\a(Rj8`b:Uj0/cٰ*dJsFh4YL հ&A\u$d_2\;4Q4aPƼ룅9.<ز1w5R$($,PVXBfv9VWaO2̓jpe*ب7BnFKaXA\jÎ͇0"b2,a8K QGG8< 9ds9]i5ī&8zO .W*Kn\9?c ӟ!7xynlf!nR(' -q"W̐P$G!ŷ_M)\ ~MZOG.-ʤE&hѓ/<MaR,0ݠġtZGf+ }4)3y[aQP!-?60(VX6]ǻ)%GNduA=uʠJ(m Zg!#E D5b3tɤ%Qw 8[}pʌ&3-:}o<{h Cblگ_Ϊ<UݽNtz{6|FkھӉ+:1"dzJ跁Wj6 2hӵLz ?#a0DxEyby7m] ?i=]Re>.neT>%gtZAuӳ{rЄ*G2 Zj[=$lZN&,<>[΅M ᱣ0aΨ?ܰi8 "Gp=fj>DFM4QF:S"0"eP:1{P[Umm-樕XcK>Ա<KQT6mSrg=:LWRXp 0W=єꉨ(a>v3q j}{T̤i9n/§ċ-BFZ訍k+/W-^f i4\yOiR5m"os8 ѿ~c1nAV/H|a/vyc=J75Vuoz)=\ޢyiT#hBytgaZƏg*%k[2I?;Q̒R!Nc=`'.&MDhAQ/G:2\X?iQYpV:Y[Si6{PQ_-a#7*ӱQ|*v4RM>طtiI_6B5y8lg^K&⍖|y\AS+\_)A`#p}/ s 7.?#tPB.ij#%t4!ّE247-ޥnA5Ӿss]ȴĤX`.`Z}FZM38Ur)|-:aln&ɧsEWGj:FꡤU4q~!ɾݣkUdFmC:H^`\ e X\ǟ}<Pl_#O-Qi|̆޳6:PFH2C!Id>%:rS8i|f?Gޠ*dm/ߘ!9ޕFKSjSza%Y,4pu䐝ãno4@w]N 3X:Gf%kC?Bj~H+]ޯ ޺ϧ"2[koeqCԓz"B29Xw3i_C͔K4AQ= 3pp҇} Sb9<<&Ze5 P,3(54+)ŗ!K9F8h}dUEZ%J#~L.-S;MK鳄3⛼Q831-@ 1P)R|5CO왽Iw6WnQ|,x^W[T2  ] Q*ƮAѠAK3*' "XbAQ]tg{k2ViH,ı808KcHd1JAID&""w)#qϻY8lō12Gq}4mc04 7NG(F&H&ϢyFb,#1m,<)£CpEvB39&OP~2~84,8# m`  J(>v(Fӊ`t23wMmw0~2 MTCpґXm~{v/9B2O8={71.pb~k7w{a0g=lJo1kHP'F~.>`'maLS+Qÿ@<̫e~n`b s1<=9 Hz*J,8.BܯT vQ\x9jXC09XR6+!@ mv Ӥ=ֽ6Y_角_OU_&<Gj,4ȣ cg"5g0MW͊k%97Nc^*2!EZOɋt8{U J-mlfbBI˰nNdxBS@Dewg~εN3o'v駿{;u5iQήc4|oSX7f >EGJy]IV^rvFl2&R/ &NK~m͔ٝqF[i_)bE;%6uUjlymBkӾӟ*U]3Vѧdu+m}JH\D\3UlNlb#NʸFO7}Mi~r=렠t\hqM+%AR+Mss;i6s^gW8@2Z)7z;LCjl51h駬B%dw~Ik L)U/y.좿RGi:Tw{t$c;))}1D>|YM{>8A::Je `;FGʀ.`z^#VhY"Gb>&P]B!û1\UNJ|%L[aq1?@ J)A@x֯]0zYU uB8Yq7U|,a1gԡS 5|#^ҥ*׃17ňL%0GF.X)"lzhu.q~Re0 XF%j8Ҕ |ψξĴJ`rQpL=JU&C Qg%`,œm#iͩV%APae1pĈ:#AX"*!#.)cN%Wb] ^oT|X4,yG. t:lG StGxZ4<m Jpi04b>.5fC|ǵ)h`O]㼌-ب5p.U->L^7ECP1~3Ûz(b73WKcKYf*!3@w47[i"<] Ez?iP_cdS$c-xwEF$2?}- h qU tU&\ک~ܨ% H4SB;UYD-AU&ZSD7 WSLF=ZO﫞Qb==%? [/#u1b_ⴛZՔ*;T.&7C7\Eu Em:H31bzVc<0 J-m`G%Pv >bXfjA om1.sR:bLO:ͽ%4*;T֓Mmrh2_KӕCDxE[񞄂VXyXLj֨['FPmtl2{E7`=J&RiX[c:F>WPr.es]%4!%>f NpVس6(pߎ11V_LNUCy89cw f|rA:'E&QuF''$.+sb6]_Kv3߾g4`ˡz?7@kc@ Ӝ8M.8wblQ'!-s%WdB) Wy-USq+D\^ *zGiB>-I*70?.=wH^CtM)7k :`;d?ި@nw/w`ީ8k'q;d*$j.AO&8PY|H)Tz?nYVɺ>MNC'PgO;A=dO8an$y U7LM3=rz^M8ucf3~HㇾH?=e:PX ,Ք,"\QȦ?8h{t5ZOCe%:x"p_wӟ$!ehbJ47n? V# f=aT]{GU:(! Rb$ ٴyi>ͿVBιTu4eX<QT?,rK-4p0! ?cq]G`@`|m0Sg{&^v<{>= B]c0ּ3h(<28@xfB3oxz3fOft| Ae4T`\<(U@= xip sS'awֱW;,eYM{OƳzX'^iq1I6_MwBBLjЅ\y05ĉ%<$H?ک "FF5 K?AQJdžي!:e+NU]$vЕ!2'z)zVR~\/}BS/[ m5,ϋT ;ӲOx䥂*^#'3)/wS@;裿dşi0{zIej?{X@}z2Hl"/lm wd0H bZ*~$nc7GoB#nJd>@t6u#7D iB6SƩfdN3|?RNJ@R8ϭfF [h&:DQ1mش+VzuL64ϷSn5҃]ݤQN#tﵒϱv򨍮tPܭ..:V+Mm"Vgr>*$^ j!}/k۝:is'Rv]dlN頽J$޹aJ:r@Iv A;D0Lۆhh=@kY]!6%!h- TҴJDIe(NI_C$7DÔQQq|Te0ְ0[Tp`<-,8Ĩ`YO`qc ]5\T )TŽ$ drH ,nQlUla\:c)T15^_f*UTف_T`3c΁z\`;\|*y.BXt/<$"n~`W-L=Vhblbn `8[Cm.Js3;50ލuO8H4G-Xi#6]cu&`s;bG:_>_/hkDz!__@?'͟4ᖥZ`=ʭ({]:PbL+І~X!5fbjS-aV)T.BƀG&Tc5LFz^ !NBް`uWtq?I3Y;LIB`A1)x&sr |8z=l$@ GGmv 3<7A߀9h&|h;1A$shHt#8bo &ec+p]5fO`2)OsD"nTYx!<,UwPMДk#*A9p: \a*2Eb&bt!NZ#8X=MW$v})|K1 :͵zV(bC1·X!m2i㤅! `xqmli pj!&H/BqSLH%6 d ,~!kтE!Ԭ1^R מXI.EK3g +sd}B3_]h&'IRsuX!un lu5m+9?U8`%Ji*F"O pvT Ig6 :[1c gQ eRqi+An]_eDs5N̷GWl`!k|FӺyj7Dx3ycqF(1xTlwDadSr7G_.Jɂ:檢D>^' *!Pp& ^ޠ 8f`?WA}!Y1F\l,KT=B),>Z|>Tu}iZ$< ]59YЭVu갹̇:Ӄ=Ͱr[t$$M.hj5pp[x+L4zdK^<.W{Llpgx}/ma9y}\>L~AdB#Ӄ#A1bRx}|fR EIMNJ(& ?'q,,T&w)3]zW@ (m\|_:\D/6Pʞ~2F ~O%i}@)8l#k@hV~%fsܧʩyEAr!(%  ~B.Ƈ;Vӂ2,>Sb9o̥%ſk&q(aHCw4nY-;sqL59O (ǭC<;[lKshFWdѾhoXi5\M0Т w,֭{A%^p LN&})zIh#*#Sdc4Oh& x& ClE̘t,%mi|G__N$r'dgĝŠ K. ?<&-4#AA '$m^%:w[b/IE0#"a}2(Z)Íq 6)dw˩zUw(Ӷ7Ux^͗g[UƩPMʡ7~@QGM$64I{/nbDA#b vblAQT@MbbϞYs^wʟyIѸe0f7Wxܞ9cRJl͑>-D2'bLׁXr"R$tSi-Ko.lʳۧz:ORڹC{8#/ɻd.'DE` _H$uJ"K%q`c"ԉDlHdRt/sun/VM% xLjsU"bٺ$Lc;$ O %3 ꝄE"˹blK(_eb06w2s;#p6s̞hMǢ펥E:cYUBQ؏A8?bufQSO.-f\>x@{7޾Y&+_e' a>\MNMg Rpoxɏ-~toڟO?sn?w;RׇƸLa?:~@:pƛ+ĝ1#hі8q찚aG>;bU_>us]9q S?Z'q3V:ž(; Ft#,vkڳOرo }P3ǀnJzc=JF* ΐl+CNRj%noe&nEjgL1#w3gف̘ޖPqA_8lRdC^u2 ㌂[_hA}FisY$Lez)Jmrfgz?K|-tn\xqO =jq"ټHzTH첗Z-CK$ۧR?,R|-[7Tx+ ˥i[YVZN>w)rYx T!kVj~,aE1H>j)T*y_*?/hߖIlVNJW!utT5(7TJr]!?V_U2ZlB+ʼRjދRf8 ͞ *$ (cɹdf]_#*eONoGZz)lZl{'fj?Ydnh5HG1Q6i}e[:0Y^odLAnaj(e҈fyoT/?J'9JbW*eQ(i3Q›kI;ڧτzl,thQ\h}-:6oUz(Cy:ޥO]>벧JOu [Mj.E:8wm;ΗJ{8&/+M< i0N9;aCCHS2Jj <֐+KlV5ހ,d@TCg)إcȈu활ICT!}ηD|x2PcQ%>JޮUT&TV0b1JiTg ?KYڄyXVc[Bb3f9Ϝf 3A&ńGWaΔ׍yr׈Ջ؞gHP]?Zf{ir&h́*M@Yd­i<{KfYOMS;Hf6G>l#_wgj ̴䛻*vtc(;Z}k/98Þ|kTW\Sk BX5[q:Z5C}?^T <_`GI[HœL'b:YĮ:59ƜVp' `H3AĻlp?dO)<oM9<[oN|cit̂8_s̱`L kv{|dGnщN<L `{skXK͞Tiq"4ֹ̔3ڝ/Vlwr3O ӌdRTs.4v6)V-kdM [xyߑ!wʅy/ޓ8͝gAX =p7__6N_t!ʅ`wptt7ّԂԉ*-h(-=;鱨U ZU1t^dŅ.wfڍW.XʇtOpΕcUvfq̗5ˆEuh^#Yk|E=ޜ%f,Ês ,4=Ps_MS~ߝu8[}f)^d)459:|ރa~̈G7W8`݊k2)b6J 4wa8s@s<gM2-䭢@Lا:4liڏCN) T`Q%ņdWf;̙)َS896 m(DMS?G)I;-#9ۑN\l KYay;]o],ij+?$OFwD9lwcgvA7w7`.<>;=ޞl'p'`ww" ^sfUOڭbœeOeuUX\g䯼,)nːgŢI &k; ЭqOLÞޔ2$5YЎѢCV/KIg&?ѯ̝뽘_ͮc24D&O V_Έݬ,5CU'4GVWa{m"-3v%w'b/#y?hH9?{Z0o}fG'L@Kf0nď^mEcɚ/eb]It:yF~pȒq<+g_0g0[T#]wV@mS0VD2*^SɑhѸҙс}̍0P^مWèy$c>Y*JӲb y!; OL n $>3ĮPM(7j2oa6 LSk Q9U,h6b7 n e_D֎*gPN`\cBM>GsϑRɏ+^%P,)iQbyR~u͓ySimid[H.Z0ab0-! ]!H\մjiԥ;W)N<lM&U11 n)I9(?{EI'Lސ!3NC pmظ6I*+|졹p"fDZVn|v 3!1Xvǒ)غɖŃMآG]zR"MbUgLٙtZu(1 Iqf?Upr2 9ݘWd1B,tbeE!$˻?Z赱3Qkl3MzX5rMɊ3ץG$:.<疬Q"D'YGQh~94i9[gGɞ~+(M΄=q .}3(o̍` E>T$ \QhgJW\?Gnf]8\ޙjʈ<[r8v I'^MN$m =H?U8=ګc=O;†8:wMă^ 1q//:)=$ɽ#_ b,vBַ?+=oJPY(ӝ X%ھδ3oJ 7'q*7'$s+_ZFɘQJZuՍp@Ƭ4ԧ4?Œv34W'·XH1& ;+sG[j1RLJNlтzf. =FX7!«GڰD ;0;KֵݵTٿod]-[mc%H/9 tVWC5Ə'+JxJ([W`CìouM8һ 3MCS] 謭g:?c?ո ?ח`K̷*з!mp qJ!ά.qvxVN5>e_ ׀e j>}y~cMX[ՄX=3 HvmF/_06#gknuR ]oU]˕ؠUUհ[*S ٮ* *`U[3=U]ľQ }m5+8ЏyHDtptBʃ!ƣ6dE(۱z-y롒_g4#ha5zlhFdp k-0tiWU"g*^%L}*S/ϐ;NQхyr\1g/FFq/rH.j/O:%I3kjH^sq"*2P1z(`] lr[J\Ə\*R^E^ޤF.>bfd1#X͕u:B4^3 tWf8EFiX]Z oUcNN߫]G;0R̕\#fIX=fһU\VLJB}ڼOŝƴeL;SN3b#6Ͳ$sNzau<#{'a! 1b.=تNJRmӤt@!ƐCluW><ߘM3ΔB)!s31DaZFƘgm{kFVa$m<‚)4祭|߂AoNYJ8ƶ԰ѥ.MXۀif\L!넄XxÜ+BQ:T1抻\gHs*$ĔVZM-$ 9R(e_Lj9K'Jy>NYZ,bg{-&$jR_?qE)c >'c56BD-4^]btcV!Up`)CFNOd<ipz;nTCmXlïf r%Ox"mPc"-´#*ONv:4`#=MX`zga_pHTŬFxw?NfʱPJ]+4+ -B;Uj`1zs9 `T =tMx,Y(cZ%w-P,e0QaiHa?$<^!a]] GADQI"3j@,ui7ܔzL$=ka..Wq| W*fBo3Ό$\ic6.ԧCŎ^v|>͆V7e<ÊFpH6 \2)1x9.-(9jsd.ң֌>ŷjG%a0G1bN X2Ԝ[Rb {ƭrځ39ӎ^6\k(</Msp\vݩoʴ*NŐ3L\w 3e4k^(Zr;@3iרǜO4>#h˛<96; J<>o eP{:ʦJlޒזWke*x.rw3I8ϙ P\݌cU()Fo? wY*f `Q6⁛G3I9V1r[3\҃/K_i^{`f+YH`N3wďpoc7Ƹ| Gt ^ЧCGVaїBD$DS:^^J 8`9K]6b3&*`XUUga ? }:n }#9$ M̝Fϐ0`a=@Y0>Wk8oC?v~DӾgd!w/)Јَ<גJF `9.5 2t`{-1wSu 8!7^4Gd?׺8?ʶ@j*1מI;m5.Aۛ8ȇ~UC*ZzJޑxJDUöc㼫ߑ=}?vI` 䌄5JSHsy}"+@pChZBp]>0R*kp*1Rbt4AѼq]3r}Ck#y#̘~;k϶l8|Ϸ3_Cw J48ۘ? ذY4IU0Q6ڽ9E4ތ/ڳ-,bؿUʄPZr9ƞ+ [Z_jETB.#I!Un7t_Qa>xSY`M} m zqW0p Lp%Ll8OLdeVs=/cOذI;طܜVq|Z2ON dC20špU-iq4:77!/~0EN m0j]35[ù Vfh6 G١]h 73q$uңf@.U8v9\9huk9%Ph|PyUF Ok[zؠ7ཊ1RN0t- al<*T} {B_-Z~WCj4Ds $I[9@) ,eK76E.RҤ1*9Ync7(*bTqKU>4;T)<" dqqV 9Rhx+9_)Jg-nR.ҏHŝd:Y(LRp-Ē*?g]f`; V&=@71swkAW3ȨdN>88w(hK)f %ٚNr,Z/|I澢5j775whv}H?QagCu?S}O>S!N_o Ek6J9ďj%I˹t)ux$"7P[bnm=C"JrxF? JzNh[_>Q#R} EFdȴQ $otHa'e8ݴAi6 oJ/}Ko#4uKVR iHf}K1 ZRYUGڊHxŨ|%^YM~"s=S:L`1ֿūZ)ONˤPFvʓE+i`hJgB_+ᙁ2+cLBoxpߨ;9_CťJЀǰ&88nԀsFuYX^$UPSEn)# Uݯ{nE4)lu6b}Zr$æJtS5t=],G,{J6nցu!<㽇zY"!:2Fj!kH!LP[aPφl%Hp-m`Pn ka:Z.@/<$)Ľ̅)!ΔjXn!l=D0BQ.":X<,"QO kq۟TuDGA)( &d]N=Y:I< 6~F*̆ƇUOp_ذ=`-lFx_shJ?t1F䯏z0B\";W'uaK<.â~,v$p@W[2ʰ?qWhl1+VXC;Ӥj=1kMйFlC=6tW6'^|;,S ծcD#SDNBrI!Lʡ7 2\O҈¨Us[`R`oG9ⲷ#)٤U1FXbJ[8^,}]Ӳ&(B!;t-ppTOS%0UIWQYg}Dg"#ur'{;Q_T[ T@nH /"[,r]Gq.%NF'{*Ym_:QB=àk5$렗v^3V FG$pw. %=8,fS|t:R)t9ڙtsL%4%oy_X,JVi\R>i'Wb6~f3!vªJ s&'ݧGYW&F(oC*i],V1—8KܞĬ_h|8dѯ etצ*)m*N p?&8 d{4UAN({asl5  ûRBЖ<$̦w-trm%mLwFFަ P}h;}P+b]9*&/)vI?IY }CH춆عAY 0s1?b?٬ e,uS)= yIsܥujOvA%g9⬢YۚL,\6%?ͤyJ=D? :7YN ЅH\?A}|3 X K]>GK;3\O+ UűTf~%"9DѴ6ZCўI~Zp.MVGM&31M 4/4D=1>a(]{ +k %>N3]_I="̡MLZq.]66R՟T|B<_q8ns j8x^WWF^vمeeDH*4ĂbQ5`M!4ib+H"XP}{9s;ssr[X\§Q X41c\;;BoAxX\<Q},x""hD,ܘe̍ ٭p>"DjV,\_ sboа B}0|!P;-P,;+X(9(o4`QֆAq<9pl ¿m E0|&Ph4_nvk1A}P J~o,tBz7*sl)AV2}"`gxݽؼ6K0fKx+ҥbh%_Vb0~m0}pwȾ,oCK+b+!7 ?!&nv"=~pASs{"h4gŎI7`nGDqz#| ܑ?duv~t6`tzbV7 8=Xo7mq*\ḚJc /S3B19k5'|ikKG]M)PZQa~Kۡ`2jCMxʯaGWZO ! ;- Tb ]ڪM'pmQƌTM@y0RE8(DW>-:hP!yB [Gc!6Ud'"ل yX7Ez$!R7I1 J&jR>0ǐç8 ӄmГut4MBơrU +L)n:ł@AB3'jJ8 2:A %W uO$Y~Sr^OwIhK&Ct~˃tm R(M"]t8i[tu#]kn42DŖdm~N]!=7HaaG:=_(0)ӈ(~Z1D)%6FUWtJnt 4@%t0PL FT݉D8P#\+Ɲζ" XAfIMa^rK3艨bwhDd1HJ#t2C ̉%q'h`ꬆ|I(x({(u1SF߽Nw7hJt!}Ԇ(%P!7@5}-_7L1lD~eCMwL莱PL(18U> X3al8Fd1@NBawY*hKiA;.rnLB$f4l.ڏd)1JI&(0m,1*JE ] Q xA@  cXQ*~x |n0́3To`WL0/BllgeLؠ6[Xg&<|1"Ul$g1⫈jE>`Tb.=Xkz%hVJ:-JhåS\J W^EW-)co8dBDI7y8G >;/%󐰀"!8CV\PUUzMLm.JapC H}-5!x*na&NXxW'\ȯQ{'^`5ÃS TQQ|_J$yHZ$ӝ04U?>ZE@:F1GL0za"UB>2JػAkԐ•i 5x Oٲ:68K~ĿWSz oHV'\ivꢴ!>'㫴z'p%b.P=Y_քЃ;2U)+k.2FH wGU;RmvBE~nƈe#;:b.C 4d| pq m1tq\,ädL債=J)ա"-ά)ƍB5ܒ(DѤ>6l#Э2 -@a)M`6!nD/hU} &j&Rp 8Uw>SD#iT= z*<-v\+%}Cy2#[51Ԣ'56ӳEo~˶ ʥz:ë&̭ήͣyG2vЙ\.TGAR:zEI}֊J*<\KKnQ7JSBa>ͱ[찋eSQC J瓇x'5)$EU wN:Nm2γB, Ntov=b[lc5 v5RǴʴû\ɥSyгjfɡ̾bRBsRIg\'YfR^J_xOHZߠEFxK`~7`㆓YEn:B ,q IY4-_ryLOM̥fqmP.#wj!`2*1Q/e>{K!kӲO!_KYs顨+t z^J3dZ laObEj8z"w-Gw|dv+^_JTHRM?{x\bӴgpc ~Ic2&=`кE-47QZh|!uٜj2LY*aRSwS7䷸xwi|*9C-Tzӫf2#gh.OG/6zl 0^VI =_%tZ[Y(Öl[0kQ{+x\+-yMɧ~%YYHVVK35~n%z(g$o(@i,pY]Vx*ǽ|)Y(}ݦum,Ykr=:n\\d~g|I+)aGk-Jh.:LIy:)Wݰ7:PCА oOGlH@>!*Uf; zHa*w&0Y:M FJ/_tեV,%G{(ˬV \:1&Jx5F5zD[lr^Hƕx6y@>k*$_ ỌvqzJ>6/#p;609[<1_30ż P+;9Vt:ZNrX桊s`_BG ɡ]CI:gtOA,t1.R$tJ=}8EkW4 ʃL=C**Fq.ߍub+?w93^~R 5P[y4Vs!L3-ukX?́}D4OEa@13K6p44Q]yk{/ڄ17x^gXA)(I*)֢"r([Ē{h=F1;U@AEĊ(Obo{ {M9Wzp@2`%é_JXhxiuL{qדzQp-^a0,O|/H"_8\UJcxz-JŹG4lѪLU6ƕae~ܵ=NdPM apAJ֊U^ڇA=9y~ z˯ڹh|Uэ}dq\/Hq-z<3ǰ+7_G?]ƙIaP&m5zAT䍐\Yc)OpM vmtУyá$֝yZoR~c#V~7&hX8+63"x*̏;BbAL5v> [8G1Սs/pzC&r}) obAbkz: Ď ]ȶgrvs۬, dG)PMF^dǨo=nUp0o&i7B $ЂZ/qIN^;T_be:2D7I|ȱd6JN@U#ҩ-(}zP!t nȜVz\f͆gh1`};<վ<:ŘSթrX=Ţ8g@"$'"ut kօRLV [X;ۓuy.A7y/ |;/qy<[$1̂2{øHӿ0y=1T;3|u٣S};(o Q rfTڬ̖*}>lÞae WďsT%qV!g5`XO\ XבO@0}MI|Ky6𤭼29V}[ q"XAS:t0)uԥvޜpo[[ `T4uEͱD"u(?IL#y pł<T38-2](ba:TɯQtK1$ ұ#.A3#CݟFt~#LoshmOBB^CZq Ƅ@fAojQ^htL(^,pjW]UO%=BݰJ<!d}:Nó==(wK=S)uځX_F̈́?Yu Bb^L.|45CmI[y`K4\Xƕz}8ȷ/͑PʛEX, ,4%7[אRDX5 FсSyFƧXC4mq"MS?&luIiMY<| ps>b1L1DsN3}9oѳݟc\cLэ-Y]X; :`̞gAx u!0@WitUhI' Q8OԮȯ~Sxf JG?HMܯ4G;sV+ΘTcm.g@ (ٍ8+!\i1Tw b~L*g&ˆzsXیzrI֥x?x>4SG[kKc:L>.y:i48 Fzev0TAm(X'Fe#4/0meh+-s4xgǰ!0[ra&;ŵ8xmu*^GTsӚaGon筳LNB^/ysXZݐW"sIse`8&Jed=lȋGϴ5o"XȹQG;t2W)Ҿ`0i^CL5 %k`f&~u<$$nbvJKnw~d]*X:!A' /gbR\B`Ӌ#+ 6.cIx3(dA{ K1z40feT%^ E c$tMr 0% )1{*~s'wYDwB'$r*EOI[L&&K@A0f$1mZH+ǤnTkqocWcf׍~>|=ql\įeGntqNGQ;V<-S۰jqX_cVԇ!ALݕiւ%VYl x` @\gw x:72{ه86c<1[GkUœX)Ոݗ7WfBu'7NsPS{WݸGn\gäEݬīzƘj>kCD:5_M=|έHRs3^o8f(3QьMܹ1 L8VA4|jThXZQ=V&K#4g<}<`Abe@QE~9p08a57486݉q)d,|MoX~r|HPْU5oP*Xnl e]St#:fbڍ,(ŷ&xC]yo>e Dd"6ۡkCG{tc|5:-J܆Ɋcwѷ#Kt[ejw4Bf"4lL76l(f;N&q|``?uvۿ] @lL?m8M;ӑroޔn]h]-pk;~z;q ʳMCl$Ra_N_%Mo!$JgP/.)nILAjafPoU0Oh0$_WZc#w-pݰ2&yKcqqaaHxVэ TE-'nF*)H <#*H-,5$5H^jVO6TFfҭ@!]ҜHŜl*!x+'}X`P;Ӧpk`߿⍩<98Q-pHGbqҳ7hL_&[B)˾B!Á62؊,/)@1]uF{N:/Qu[hN̾'dsƎ[*xqEQ9YPw~*Bw7fFn[cbXBӞEM ^O;i_*1䅴7+AB ҆ m2<WNխΡ-)tT* uM9O{M~'87p=6{@Ƚ%kĖ79bd=Ķ 7g6uQzSR|fˉ)iIe/˅T.@7z:I_51f\]iBB/(R%O3ePnceT PǶ(b?>-XȸVZ}>q4QBǤRLv>ظcP+gvY$ A ClZ-zh֋tζ|;!w}5VqA[!E+כֿDU7X3RXxJ wH:ɺfƭ)4'tQ 5,\**iIW(f*%I||hk; YY]s4VI\VR]:#?=s*(|m1Ri i>7°b s=hRD.q,k%7e6 t]=/+ 4L gd Hf^*W?|R? [ N 5a+tXmA32F<|a)nJl3Zij5UiFe*qߥQkzN}l,5qmWQN;'#%}_QzMS/0#i/b>`S;멘QB\aU]mn>%}~DvwMjPb  P( $#@Wu &a]{xn4AF ?ɎnJ=%JrG-b5]D|Os @Hw.eT D 8bw\UO#_рy}Bi4:.0Ш|K%XaY;P Jl-{g2 ^!bQ]N_ΈT@X{}+lõ@>g;55?d[Ѣi#FIqH qabOV“V185ҩR{AERaw!|LkжHYF.l%l?f*+|B͘5 z-6ƪ^xBύå^〗l܋e3O w^F^ȡqB^/=r]\ 503pEݷ}}htၛ7soi}ZqoHd,0Xcnq:xb+/p m* pB&W 'i8ZcmDtz"+> ,7ܷ8 N0ayE gڿ}P!ع扶6s tTaFR,ÒdI+Q *<@kEև D}ڛQM_#Y+o]`(gApG/_ Pf/s9P$Jt2 i|*yPE2w{HnttQ}湢! '@P\.Dd z}3oZ-Aؽ SRb,N#|/P˒Y^/L)v{*Frh!:aن9sP#nVr|OK}7#( koNv3*X/qfשlJNSbf5S tTC} .;¥߮mp/ 9sҥ So旤!pg7V:&IT<1eg|*LJ-u$+Z˔**CLg,z;faP/TܶpRn>'<L7 <]COYAQ9#mh*s饆VwF6x?a^488Sa;; gxa;<72Nd`V-B* Ȣ'QjB66[3 25=`(O/PnC>ǽCΰ15ŊLܿ O^E4-!-4^ڣLa`a:0 G>AQcWJ0&Y:A3iMD2_ΦB^PT(1D=6~?5ax3h>0>u[f^l+4՞R(49A)[?hӱK'S]u2B1D.19K@b#.7#*\HǺQgNOӐ@ԫK|uk!tǃXf)QH)lufHљan& [x#v?*@gܯaC>wѱZfQ M;IW>\oG ɜyMwH㜧6dwZ!WIVOx^y8iHA)k9ϬYhoMimRMMzTD,)L2mHPZ~O3;|q^)[*jPf%}׿0cl8&2^'JC\iƭX'ַ3L||vޓ澓̏́,iOf;sxO$uO`Z-;r貿`L⑹Y|$+fҺY%(<Ոw\/j 5x[*u_ܴ͜(|xZH0jCF~E9udݪ1|6({'VdžR3ؗ2nTS&>*pw& Gl,* +Tmp\RBwO.Mc!fD>vROQAVGNni:ܟ& pC(y/YSV'%X}O9͒G2ʇx3X ڐ`(٘G4i C9 ~~rЖ U7a~+\'W#0$?"t(@.|!8ȡ:TvTg.A a4 9OѼ&A?d-W1݁,/Ey7eu2yj]`Z*UeSRh b<ׄ09QS3r@ rq//: A~ *vzYy + %)[K)ySEsũ5p):ׅ]|=_OZJ(t\ ~mY#?/EvJ|2&Ͻ||/g~[&p_Ui2ѐχrg{S"yu6N ]8 hPEz Zw3\~9N/?dF8>JΙkGث+--{_2a/§OW T!֟KM ׎fuB e>E\*vTlJicJ :Z2 &yqx}ɓm͠!m>77D ٖ˚Bm/ë\9'Fg:=(fV/ˤS ķ'Zzv;z;*à!\/ K0@n 1Û1=O[Ό+`/&}Yc(F7/7(f 9P<T1{Ey-B⛋ЩKą+p.7YsDhJb싫>K/['Ǚ0V!ˑ/s^s4&S9N'Ԃ)8U.̀cexCv1C-y`{߅Wr. 10 SoAoDE!A%=46d#x)՞ <@7 nko֧^y xfnj/GW]FVL~ -%ꤚPreFr⯁U`|ÉO5v-?PiFB.8wH>s1B?r5`A},Oӡ=P װqc͑`'g:3:/g(>s2炭jL3ZφTV:(©'՗y}؋Y6\/7×)e{#\BxmUnF/Qx'wBx0uզ[4 lBT>|m1&$N5Ejx^yX;oڕmGӾi461H e)I-BW- eoQ(KR)Fq]uy}9,:34q}h!ddSqm HzO\`SY X0˿a3]c„}3tK?RZy'1'TrqL+ͰUF! 8O w)z=9z )".Ib;V2tdnWĢ;4W=*TtAjH3Iw+E‘ 9pRCqg1k2S@كi@ciB.-V u_8\bkrE !1RMC=%\%9MKIzi UoKhLQD-}zk_۝!h |8 q:J .bY;uč.PIBFB*=W>}s"GzEߢuU4.r(~YZz4zHo ɣ6]`i"" j̦_K$ڴX%eM0L!1W('U:?^$}Q#Bo%`n'# Q>@Xg?zu/7>cPJӊbϡm)2vROj䰲GMx/|D`d{o&L i?Hۿ򑃋QR8 [1mx+2ajwM*Υ򨪣LJG ,st^¾ K$`xkno|qf6bBGƇͲ GǔVKY (Hyj˛lE3Z;Z%!Y©|m$パz{X%L'5 Ζ@ۯ|b9 D+d1|*!f0n{zrYJ^94XDW)jE ZQ w5;\q@tVs%ԚUƛt/'}byia7h;dp8A vbɇF73(6>9v?i _.¥,Ѡ0>v#' 7h Q$7}F`"n8s{ Qzl#A:ryC%i!wt)uW-$6!}aI/fs&pZ}P3 )haLtPD-Dڰ=tLB*N֗lBJi{y; ap]m"m<;ڇ\1w5 x" Ț:xdW$ /JnR("J0¯vWoc.+ W{aO9Up-B_/%(CwlJtF>K:@Db#t|E+E_rbZ:(@ ddK#؅E! |qZQ0c|y, f{eS q=K\\RGZ$_Gw8 OI՝zo~yH:E"5v)Π0`˷kls8Nš#/6E:jDOs[BɥjRN{a53 dO4y} x ˆ6vX> +ѰO-1GqҰY*[έЇg(.-2Ȱׅ5T#P;>"kq~>y1{3=aoi qx-h9zCQJ ;ŦI@X[ ^c3hkGb$,k $zt5$$ E~usgbJ7KĺrN ZMla4pxbB`>kGm=Q0U0Or3KlI$,$cg>΢•ԞJ{w-S}h}#i2usר3i69RX nS2Q8%uA̲!hF]rw1mըѿ批[VSjr`*4z*V_;FGGGޫf5z>y,rǾ,\ b kJlCԝS_+f$$3_(6 K~7+lDITK ʣ%vEɢ; ?W'2 {3a+q9}Ο ao&b$WӚ%g0..SJ{5.[l}}FxH: >/)p c ~+ĝ,C,hXhΝ;hAxWbkYͰ~a9>}2ąõ}hLL{}ZFhyp:<_P/g҃Er<cFtzj] zqL/_;6},ዔxAq4َgU{ʬmQ(Y^ȸ:Oq m9PI ddXv5 fv!p:Y<ƂDYN6Vf7=L#oTg!ұBpY7tEJ"uSݚ̞{)ץxˌ9=^|-1G)jkj g3wQLl\XX>YC*Ѽ:Y+ ;(ޙ:$uB{ G?P1LWfaӗ[^7^Eglh+gD[Rc!^)-02,PNu๰ ^80749Gތ8{;[̢Eb{m َyr>OTp״x$r™z<ذ݌zx~0Vc&ח |E:~=(a<lCe*LU˛l7 2 PRmi𭾀Ըf<8kxC*3Eߑ xqߘ.~ァK=3WF1,EIApa ==YjL<ͮ@~F~"Kr/co"V byXY'X9|cMYv_£E>\4O< "P| ^y4i)M]Z"?Oɋi{ӥIs$_O4dٲI;hdCKbFaEdj z:1%؁"<[?O<5tP8?Jv7^ʆCezЫ帘 ƛKB|Uu0> O[0b*yk͐/ºxħ=HtasS[άPV5xxH5yј+h:BTf!k7Frcp؉^yZʱx"L_QfxI,YR3{>YmEZ}&FgoQیguE+BwwC jlnv*Rx̏b^.NC97 /ji.=ПK3ԴZ>rg):ʪ1Fֱc|Dc[Xs!|/UF֙p{zOu5ofq7ݸ_l,C&'hjFBX)z1_ ~r,٭͟ߩ ӫH@b2PK0->UF(̖,.J مf#{yD!op`SZŨpGLW\.;{W赑6Q> /x(pv2fh3,ڂ[`6- pC!\p>}6>cy;5INh Rn\*skI9Cb%FV9{԰Ծe\n`RU'<(џp#SfR%@m p~Eݿ:|^I<=W=(ӧ:th:=Am"nF~T=|#e Xk_,R`/ٍ2;z~;W6 sa6>=:>c@!͋]q_DO>x\?DCyv>c_-'x1c?og;̞8Kfkr4Q/E/F@ߌdxCf+Eg7 u7a9$CA]OVsOՎyN^UFs*\M螁eaF<-M 3hK%3-:f]}.#m%J~Q:ɚJ̼0tB*b,F61ɟ.c&:f/m:+^F) ??ǃ4sZ*kz@njvv.r~!lZەx^ydټ z*;YBrht? ivI6{`DW shD|MtبPsÐ'}>4G0 za *cLdm2ƽ \Mq`-$=6 ӮN>z1pR+ea[ L++57]<-VI br\YPakvxwgas$VaA@#YSP/cY)(,+*vP\0䃡g3eJXS ,N~wHyk1s8$ސM%twZ O]ĽjEéM͵C)zsaQDVz T*ʇ#j577"/M_(ˆښ)^ QkF;RS*;:B $Hc6'|oà5% 1OàvENP`bj#_W -D:TՌSa>1p~NJ?7Sm,$9MrzL:}7F'! ycRdxgE!4:^kMgbDiDֵ<=!&~cC&hVƇ x,Ȗ7@}N srH)[r,1pMCMԙ>vԍ=p?=<♑0m<f TӖ@#r ^/fXLb DR>l}|.*,U$#a-^#]3;DA)! tu@P$DOuD?=\}_l,Zٵ^Xt&A{v(qO#u#u41eS!Qy:!Os5@m?\yHT9Qv(1:J )zx(/Dd]aO8jyx|ҎʛK7q(mB1U>GB$tSj]Ty9G,Hg!_=lL=9ظOY;E'g a})f89OZ2':E9-OjsR/Yk"z4d1>P12T6*pwv 504z)[cdžcf+](DB}0*m Se56\ڟi \J㦀`!K-pog{Adg൝74ݿ= t<*&86^;DKo)٢r(T1)k6!=0n4hra?|lt #. .1{FF$b3U]s} i4O(\WB~;Hc>u%zwL'UWTo%p8jW"lԷg846^r[-ܤx JU|AƢNu4 [t0pkǀ 0 I~_K{<5AB2.V@ݫnSCU#XxWUpC7 )-ԾRvb{DqYb5D%'*n'∛Lh%BݵXRmTx$- {FQoPu%E~C0{NDY={Q(⇺w\m/hu=ޜB)v.d4LmN2{4 vxi'|^Gn}B7}yTf! bSaLq<ҧߦYŹt@C? ߴd( 3 Qn8?u F+>z~N6ls3k\[sc[JosHF [iqA8),#XӐ/֌H4믹{A6j 2"`Da\]7$*,F K\ϩ_VtQ(2ϫ!YI.=| x^y\iƥ)TJhuDJL:ط7d󴯴ѢI%eml!އg3ᆵssgU-Gmihxf| ׋`=2 ՗R~1Q%>:)b0%D&CrgSb4݃ha'U8>+,ґ0{쉬, cJg'b V{]{qV9W880$>vҰV)(Q=,ԅ5XhHVkf Ƭ:o~/<< ;N#gǀBNRbN;!x=~0ąr>Eonr|KfaO&ypcc) S0ˇ[\x c0T22ZшZP.LǓ_Ehofl}+cN=q!}Mlѫ PY'FLk@ˮgPe:a+ lAe4r ܜނuYѡhM"LInD|/Ê8>=ڢLx۟eh +xy,NJh!%}8i.` ̪!*ባᩒHy\)Ul2qmQ&FVbxf OV/FXPe2gk ܑ_FJ𱸅;;XRm ՄLsea_=I?2?<8 ځF<3dYq.Dp>gKcH/_&/)r ̖fWG1 b1mu؏~p[Ȯ'>l;ώqe} c*kbm*=&գ$^ pS-8ډwԨ3͈Ex&V}_ g%ndॖ3ߦB7D 2 -7xu<7o#¹p _]5ʒߩ 5/PjU+aMc*vA0&^lƓuZl"`ݦ5+Fd$Y+Xʍ.F4qe߷)cXowOZ]Sq~TN>g#6թrkSDh]NY$; qpaZQ;F|" +蔁)зɀ^\F;Úg]c1{'#pO `'_ ١lNm* ~-B›$U(s߄ޏAt<ׇ{PSyr93Kd<-.MX,7KZ;u <=ZsW *2:%WiD:ajVă0H ގPCCXkz x; $D%`|45 +(kjSf:י~\.KǪ<*={a=sG̎FE&)p.'HgFW*_#=QdN ˡ" b\Fh/m5jävE=|U"pQ}$+ru[\eM԰DLP=x}S9:];~{~F`V9_S%;+2n,ØO%wdĕͯ9u>Bveز(bd^gi8{do|.9c~]绳>Noq}5Tx< [kV׶+XXҚ+ؖ ͤxm&L'QsO*;1*ޜyj(3|,(iCNC' Μ{5&zf`9^%?r9sqd`K#QR"5 z*l 4݇W h?y ކp.dU6wvet!5QR<*e)i?mu^vԾ[)A<Ӌ]0 ']T(>\9k*Զa{lpŽN:p )'?nLUԖwG8sJ^LꚉtF.Wv#sNH*9V˺5_s3c֠g瘸(dt.˨鼋-<_ Vΰ\hϗ^L:gN3cJԩ[ X0* /p`v2ݓaߔ3 UY-%=Nt EI Ծi%;sezᬞn)R,g&,ϖd؞gB(^ťۜ_gA/-~&)X<5;)&'$Tt9y32~=˼x^2KH|q;UZ1U,ICgp`'k3ˎEx>t\1[: ;gwܦEX6օ6JQ^rgS#};qҿ9șdr8wCLCUb֧Q +xNF5 K'޻ˇ+YO[rkkڋjx7C5-/?[>x^y82N2f2f!JOsnۨ4htS4; RHOr Q(rߧ~o?>w;<ЈcK }C-N zmE#Bx4fq>AY% c/2qz1hOc77=> &.&3}cM;[HY\/!΁@zC%[*-pNJ&)plNݣWP >%+hU>U/-}Mf]2v#^!D,%aH Ck Gqƍ&xPK; CNGh]O*h[,lX|zm͚ajR"Jw&tdS-jUKkGI״Qh'oN|bý"HeYMh+&LŅ_PDGaLmO+ ^7HU^)fZ#ƧD>FYJG[pXm 0ꉰ@ HldZnSsuj"/ZBr" p F:ѶR/Q3^ψA&>KRw}EfKe$spi14QAB!Zlh;P+CQدȁ'#j "5 i=P~oC PhTr y-ȵp15a, "f*yaf 멡]tKؠBH\J(2CӔ(hNm?4 d߷{>\&[xb :O|(Xx/8.`Zp.$+V 'sЬBzVAy#VFc8hA1˧>yCx501MaU3.Oax N^ P払pv\- *5a;!,dMKIY 8d$Gh\} [~1~ܟC™fWv :N@&@NӁiOGB{#f] 0,vrxDJQ 2"?f ,l-C&c]AX?^\~`C"':cS[&@a ~M3ʼn\,/=vT$lkTC )p)yW}HQ|:)]A34m)@"5.pv +gi>rD vcˀ#dx([s0IN@Vy/,y̼-7>Gkx VvަM$,ϻPB L{ae}ͳKLT9X)~a$O˳'qӹF7~qz*8P*٩=)ݠt|%ߠ5uHCT:Mb1!C#` 7t,Bߺ&-%-qpp,`j-L+Nl{Milɣ߯ГƇwܪ/?`8˽2LϜ\!&D8!^nbW[ڃ=ҋ 3^ӱț>b9N핔SOkxT13vߡ[PHG>.ߴd<#xX!tk9T+ .y|16`ڰxVPDž_I9Ƴ&B]\%G(m ZA_bF5ebG0q ' `F*vX'}r7&ιLQbh^&qԯQ$lqB|&mUbZ %&wDZ {hG( DBlEyB9Yi~:6zQtVe; {bLGӝE^8cu9JjYlHxbl76o=0-6EgdcRz(q(<6㜑==Dj$>HeO)G=4DZ)!SJQ3RO)$J#Ğh+Fjlp.wQ):#{h).*3lU@[~g'zP|51Y:@([Ts'sQe^@;U蚁j]Pdz\9տB]]5g}hpԄaL B_B>TuE 1:I18dR6j&"x㣄T+c ܅~qGJtՄ\+<~w+!b!rp&d+Ij8"vQuB!{>|V@icm<$qc=Ȟe8^Tŗ^3$xBݑ==D7Z(6D NІXhu h7 ƍ11s:&#vR"i )7D-\9\ާ {n?>!G@}i̠98V2z%FEel 12_S+RSv ηQ|8ձ =w߿9ɅOx1pc n;VІltȨfl';`oYDhҍpӿj@8L]fuL~7fN:pK[Rۻd"2eUY@{;˻[ 45"jsB!lr1/ž$f{ 宬.썣kҶNNcT`LbGx@\EַgR:*\]J5տNrO:=Σ[)mtTp0k]L}dѰ/q0F8qZyHgQCsG!b;6T-r(6Ĥl'H9E 4-#F%^"6/Hsu3YaU,75 -#aWѤ^2<Gu {cڏgWa/xs`1 +Jӟ4=(m)0q6+$TnvOx#]ﻴmM-o3AM\/{‡p'asdW0LgS,2 i? p#Tp=6Ă$L e 1^0l/E?}Xz!a̹X[0dtrs(ck.l|@? Y4*b \x~\/ ϴ!TL L LNpp"fPeҸqxSTu>Ϧ222>K⵬7kd`x^yXiK/ZЦE'JTڵ3.b}mTJ(!Iͼfy8x|/B[ѐs˲p5S<˞߁VGzbM2vLzY}.:g$ j-վZȜ_h]K΢!TF&FP,QѺ1~B n_Y#>t#F %Uaգ< Z4o9V%5bl F(q ,4&LQPs0["=B4F5^ Yjjso3jG;3kp ழQ=nbQ `#ym>b,e=)rNXa]H dcY1Bѓ85X*zTԇV~{8P7lhܹ$S5o7~<9eg*x]ܗ<(hO99/'ff,HB%!˃QzFT)/'a2*FXeTT0+ƉuP2"pd-'<=$Q6Qغpp%e:Ap( zx^kq JfRӗ-ˀVlU`s L+}绘P[X{ͅySI3<7)^cLOv}/cgse$mu<ݖ6-H؍(³xnGuQe/T>AOh dK[\8`&z Al('S͛s\x˒9nsAC!ѷ(^wQs#OlS>ګɯpu++@a >+gxU׋1d19pk36q#C񴪏~I3!TY}So=%U8=n`flu6%Nvy;WRX*#ĉBWՁSE"L bHm*/Kza~&.@3J+UCXM) cuEw?0X03Od`4ys 6TK3ݾ"ʱr$ #aji2ւqͮ\f {T7}%׿%{-d^+ā)X?:3Oe,wPoL Scn̢vBl,oLs,VRX[ʈ^1}(^kD3uc I/;[G%}̤ˠw" kR٫ev2Y%8J2k\?ߐάʙ!˓S džVo/wPcF)/269fc7rX f-x]*掭 *Wĝ;9q-d$D)rp~<=Amwpgi}87LQ:߿}ᚏ!<;K9iavrh_\|!֡9'A;P[OL gQZ@ gCMnԍ3~؇{̓PJ{ށxi/j^[;1HgS$V-މ\)O+ jGLK$w*3>8[C23o0puWNԢ|#~ =(f1z#?8e1ٓG,y\St>v~ : c5Tw\oZaβ-8OZaӨ~Q2\ʐ+\9_QOù;ЎzJ0t,=* d)i{’jL҆Ѝ0p+Aѡtyf"^Iq0~T`aƣ% QS_V`/*"(CoR v(3R#pѹ9kBC%T)<#׹{@A@3+I/`f\Ohnjg3w. xsHx S4wOF2KuX5 "'2'GWهsyYV$͏媝`˄*7@8HA.NGh8W?`z0Q47GzQub:= &{ yxqK9ՑGd < R#~j6ڑC:f\ƕ,׹p^Pr$35jڔx^y<Ǖd/)\vq~^ZC֫MeKE*)-Z6Ԉ)2BB)eEHE")149sG@{y=:8 k t4:&~Yi"JOΧ#(6n(wna3S k " !h ?b?!GK":Z`ᎄ@!u?XlL7o HS!+iwSg%0&[x_LŊĝNbICtL7qWtaA qR=>֐R5| re`J+'038F_źm{2XiXƽ}>WBWL)"ṭƏe)*^ ӱ+{"*X;;ً0th}¦t=߬s'`l뉀a|y!HĂF+#D{2E!ؙ$XByTM*RƻEۢS=G.G FO7ςgz? Gwr။G p; 4 J=!& W6x=,%FZR^֢lWVR̮.FPs+~NFZ!p1z.}?<.F0³"`CÝ\GDqsɖrZ0D&h(rik#s&(JyC|r폀g06nB2 04k4Ἒ?9b\|:>xoK`řx?dT>o4VNr?~*[& +s*{]6t@ni/Ӣ`}e18b`[.\OC>$qQMn8diۆHORgLjdISH*h|rVFբOh!z"4*6ĜHE X8=8-ze]3w) QDɲPjF[fsKi5DgD50)yӰ[S b,p3sW{щIqvSlQT*vC]Ag0"q~S`ZM'3j$bl=GT&??rqsϹ)X&x(ƩПWRMK:)CA#e!>K~?Ć]؞Qy[y$U1=6͇u\ aC NzL XfEʥT(b9</U9M;`8Bd7̓:T'HE0{Yy930 #.js*;BlRvN֓04%'}l۩ 4d vkYpy"ZHGWbA@\ Jo޶2=zкuDaa2$Nc}t,}cY lKɷ_:kcz0c!'sNvCsKWiы#RyH3 -^yb^؜o=j C?eH:.axV`p?2uNC-&QqSSOeigG ?s.#sЁ5(@BXj/($N e]l=(E?H3nF;X<@f'zeD%}(tI>޼4)ӛ~8n{9 FT ;9\j{#3o EOo1=8lbA.~BQf6'%utVEJ*d"V  vtv\"M`!>A]5VgV.;~xD62:!0j :AM%̷08Gt7p! '3ޡ`t~>l!#K4n8ʠf7ڇ>MĤK0 )G]gD=kwp2RJ$\6_9M~)\ǖb6(b17:aQ1k'ic5|r*+uQLh퇣AMl;F]Qy*ӯѲaWBS )8=qN_o!^88vL>DߘAKk?V]g2%p/e_nM2Ys<;)0\S)8F0_b'Eiy{8vX+~ \.~&;loײy{< Qħ2ẓˤM@xy47D !?xSW}-;C7J BP,dž\gЈVa\MQ%Ɏ"fQoϣ%=}3H>&<[8zCL<^B7hUb vwvlRV3{=3,k U*ohΎZZZ@ i뺛T)O:&VQ [y;Ǿ'4x'ghܞd7] P6`Ӧ01v[TO$H;ɇ<^^Mw$RqT)P+*_r?x^gT׶)"Ҥ Rd+IjXcb%רQ@H " cA G1g3՜UCt^b=2#ZV'2?Ӆ<Rf?*GTI`B90)UMA.[ӝ i*KIR\ }geU3ligf>˳0xx9V;],z"4x:nU㣀LebW>3Ĥ<}mcgНGF96؁ۊS'ĥ]Exݎr OϮN/n*OJag ;ʝ!|9a׳(T"a#lP.SLG2nc*ߤ-X/£C| 뛥8lXcXmn<3_@éCSӘGJa%Ho oShjGi\j`͑$ƽ|9hF \BLc]V>3 #yL2IsY҅*);ZGN2PddF({ )N7Ooǡ|//ڐ qX1GĄPDo|ypx=ٳ^\lɧZ5B ,Jg*8wr4OM/9m<'}uJ=P|\3)@]a-P/,ǼW--ܼgˢzL-pC31+UŔQ^ vekD^Qg3*xl5?rRߡˋ[l8qOq;l&u//-R`b. 1I8*'~|bYK>{ŧݯYoDYpZ^{5)L-O7ڙ l-mr$gكөjJHU?ërHOagJ.Ww4!KRk-SXJmZ|"aVʔd3r =yed="9O&Wk'/`w'd", S+ap5Bl&}Ca':B_åOK"7)H'Z,e^ɜ0}c49nÊv]وYb~RӑTLg ev*-G'B|5 J 0Fʞ&^4y YNMalK8j64̇J4g(sUP4+& XN愭9;Wn͆,$5 2}_nk^2 %sz}c0jkL%>'%xi"D8>7mB>~ƅl.G>@^6_@a`hM%7pdNS ~[eNhSlԮ_dcrp{ͅa̛,<4O3dY}ǫB8ڕIN/*Ք9y7ɟIie4ܚϔfqWU.^QN/gJGyfgř0umaQ9Bd~k;K/ۈ;xX!ϻJ?'xҨ֖ƊߪIҬՌ{OrT_KSaEj̛3 y%O=X+BzEiFd(jqm-mZA(gIHt)Bq0%ƼX_)B[x.XuZ y,Ӱ-n =uU QS&^V֡+luf~͐%υ{,x04]81˔OP}* 9r!.f9ߖ8i oqsFEpۃ\Ϋy"~9r4ݘ4GJu8t p]o:tڊ]kBXC1{LsdNkG3vo'y0vׯڋyCY(28^7OC$et62B2k{qKp.·VuelhHzƟfbr]=7^a/ c'‹[B)秔( jL}23n!3E^uc$O0$s(r8?Ms'gZE6u5 oz tc^okaFzT~v30޲ox5;ǂnx?&,_EPxgt<>4r8Bs'ر/]yJ24CqC TX58e]X\$sM5gNY.Pp>e~Ћ4O.\~ބ\aXklZ`Vmlmme4 x^yX+թ]֮:Jbi,1A쌆40C8]u)%dGR\.9{z֗a oi}"\*!o Z8l%dUNa$~꠻F oC\9 3W߆DclF&Nxg/:'"C^/<[XHև<$s T78Zt02MFu \ #j-O]9NQ[A' ʈa 3)782 ofp2'A?#qo?wĈ<;*x YyF)j5Dך(MXDZ@U(3qLV=Q:F/F}ODِj cZP)W-&HR>o\o gHB+ryW%a~ b,Sn.wQk|uB{_Dz77#"n1- Pfuf(cL/,PpUkT5] 84ۙ[ 3A<Rr8nOQ"8YdW55F:5M+QED8L/̴G·^vXMi?}TNM4S )i 9۴\,N\R-=4cL+Vт-1QXIPֻk伾T=Q 1qO9ؽ{qO]T`gLQ. a&ƞliޝ>UKҊkX=WL?8կۖ韛֨&WOs`;#>9tRT [  DZ¤9]+]ШaIKsr#!/&'fR}KONrx"8' )UL>)VǁC 8!}1 av4xf(<KC1ԽLkVET )lk+EzVMn C^MQ)`N0nvx^gP)K Ez)+p^(ek1jDM$hTD b/қ4a Vhx3̙g4,{9LOJ<6}KTPKSh"ڌQM5R: N{åRújҗȦ-*h!=C|x0sK$ŨbLGh$IYEz]20۷y!z[$L5)|dJpr ktCt7kkƢ}6 5gk#Z̻b)O)R:|KHA`gB`L,q.\"Y(޷Q8Q ct)&S:/dlPJʔpMx@\} 0o>&ӾjȦ]xXba+<<4# 詵khMY~좙K$Oi}"FCd 'L$TFP ٥Cm9@ 8/3K T] ۼXBOOWM2j?$JrΧ":X#x( OXjbӐ$6AFnRi'ٔqtUQZ>x%bDT#LQV/Z.}XL:[>>+HtI^(>c9lh//C|JgT?y9zMkJ 2.Y$ +.qxg Dy6X`חwVm),%Ը`ajhtzC=h\J@wHvdTКWij3`NpUFp-'nLB^AmRIP^oBQT4[м/mhI֕ >-[T"),̄s3ءtIZ241n"jðDϮpDxl$,q\kdaCLJZǧ7!þ (y[A{nl{%"k/-q4j(GhN'*DQvO8\Q)ԚQCqdȧL t8JB! ӋI'J/4YnDyX 9}Ɗ@&n~jP%tM7ñl)[ZXnfy]YȎ> r*{E;K+6٪KJnas'^|&o ]`r&26#SlU 7%hq^21W EhUnMwiu]+= ìLFC#mi.P*+7Y^8uŁK\]UF]YY_Ey~4\qp%F28CO琅x#EGb瑙p @DZƳ$[F43ӧ.4yPs0ُ]!% 96Ӵ\Z- ݻud$1DZ;T qLXW/C/7r& H1V5)`is^ymF&oRBL1-dmP[۹.<;oyhОIV,s])3Q/ W^a0Nĺ9KK)A(.ϗR[{7}{G gu=^zh{QNGJhm*' lnaCa|1&9w7#e(pSJ2IZH9۩F_=jUX~,7% l\FVJ,3bt4ufPhUKJ:R %שM= 継XrAش'O'l.q.$ `DC=ara/ ;`w~Wc\] 7Z^i>AMׯ]*1l3|1%CQ9H:鋜`'gp<_mAa!e۠Tk%BKqOWd?u )^,E%; ]pLV"I?] :+o΁JbepCzUAbbv%Sa'wlCqv3G COt䫉cl4D#8LB>JIF!doЭ1Z9e.ZK`4W4t`wݒvu Kc#?5H2Tűu"j$QGޮrR bMВ1s}[4Tc"'̅^3o0!A[ᆗճS(NJBz<_2l{r,t"a>Q^H:-ar _'3AQl(Ro,D-tƻ^-wӧ96K -FFEP*vHEf~ qA MަgԅH-ڥ,VJ#nyeD%;3PC1 L g:,v1/ l_Irm(ڿV:HYYHҁu5țIψ]1+w`)R:"c~6?ưcœ)oSO esT5%{L3tdZ+4N87=.}{z~дȼFV[ :âPwrul2S]{Tx9amФߏ.,mP}gzfUBa/|_+$i"*Es*MQI@1`vШ0|)%Fg>g*yHlD7* rPBy=,uMݗGzS_L3  WۮA+;hzc^vRWުbV_pOQ1-~~0Fp8%3RH{o:ji(uƮNq03q| ]v}7LE` 4:B-3*XvWheZKJWhԠ%mi\GiH"e=*`L%Wh},֨{&uKe4:3CZަtrB3JCD%6X8 NJ 4eYY88DB *Χ7'zFyߓe"d'c?81,3Xe 5cM9vPQY] l(?#š:?O[4|^?OaMz0HEF7ifZrʋHAq!5M? Ɛ`N,33CQ''f\YI5zHNP@<_"Ǚie] 6Q}JKs {`b1z~Q(cݱQ 4 Tªg DJ)WN2t/MG%}|)$\J#VR gמ-H0_ƅ!3l"Vo x5t9vj#wSq##ƼP?y˴%RꬤT+/L4n5wWd4 PKj8=|!̽ٸBTt Kv,exA]̢k(%K[Kk] N*N_-,GdK ].2v@h<<o wf'eG1jȿ IQMH[!h;|Zt>iRaq5{G8yw Be~>c'9-T KrVM5SÅП:c?hm!?Oo&LJ.a!ȇqW UܷϘ&J%q_Qbb1tЬg931ܮ[| :2 B]dx̸yI ٢ [aS8^%3fF> F80e~=CQjͯƏOri 9@yRhۨ=V,uCvNBx^gPRTP"E( u H]1A&&֠Ɔ]c,Tv"(ņ"(("x3s2Ѹ\3=.+ Κ$wh˜B*ɻ/h-mEx-6@t] q0Cn@eԿ6,&1;c㑦즄It)N.X`T⻉cPNŴky, 0ca4+b7MUFSz(qgPHnEy\LSƨvts9b5l<,PHrpUL˴]*gua>87 ҝw^PW6*k20PAJX \,rA]~^r(n5:xvWªK9.<ܦmoFO/"J@<5&ɣqڮɥc|aDm orE!-\GFju Nz },dsz-08yo$|gczs6<؟ecϽM Tp*&J? 3.6o = lmO(q5E:5!c<}T'<'O\7k1!hqMhAfHJ.%i? qGL&n62bNG;))|04kxعIȴBt|/- 9YܒMl*[fR8kA(rũNQGL)ɑ #[W!rvs-yܺL-Ĕ~isM\`iH"L6sxvv&fxboibK[73˱HaMO0Dg26Ӽ+JHmdw~R2Swm]0g|kE@k0E/߯<`=K\\+QMzcPL2!u\҆zy]#xeN|,۞LhLāx?'*"O"?%=0yh&tQ2Z+94[>Y#>"Rl..#^H+5g!pmm_%M[PA(^6 eP8Ɠp!gjϸC9FCgy^)јD ]`>\-"Ak)^.YB ,\"Cj<# Pc7 oŒ g96@iom # (Hl Ep]YDij. .[&?~H0#0~?롿?M9xS0E(p:iEH1RBș:a~+۞d`]q& ?vss1rO$kxE]TNbr^ݥNCt.Tuo"<'SyN s :>E`0}kR]Ѫ5Tw ^Tlb}5 0쨑m/v~OX<-X{|$Y` ɝ鈞kSmnΣ?I:凷ӃѣUhm9;*q5_x#kkw Vӧ8#q WE&2~p bR!9o#pDnЛkj=kߴYA1 j9nn2G`4vRE)}E"s˥Ӣ:qS7vC)x7 n 9t0)Lc*8 ة"< }I8-=^jplN6DURgE?-Mmƀ߮pLmm/;}4b,!9RfߙSEGcvYI eԽ)j`r x#B9DžF )?-duL z>;&ʨ1ԡ "רd3 "$vբ G5c+SbF,tDaS_[z1eQ =U:9yQXCCNQ h"v wǛR dj smĴw/ܥꃔbpjIܨX#﷩Rh0 Øpжm$#*=VMɚi2 ':dshk6*mF&#Su* 81HuVuFbeshT/Y|!u@1x r'.4\@g҉SBJzrR{Lp@_mGpDqH!uv8Wc. @fP5OFb_~;) e"(Ze"`F[2`Q"qtQ$.;{x^yXJ4iP5T&*<ǼTcfajNh* "$"CeH!~k_~9?y>!`&ZLƓ3}W\_e50UAm6A-}xZ_C鑅ش!Rek0o7O\ncn?ʱcX{*BX̯GC+ԚN?y1{{0x4`6ageQO7V6Ǘ\Xׄ)%JtaI9ZE 8nYp̍Я]Ђb9(e[ Mp(r$ `b٘݃amUv4:T@=̬l1" FVIs6Cl`;kl_7KjF#fȁ !=*F湧XY; F4D >{Tr! 9x';68pz7GJt˂ދʬ9 Ccu8Zk? @6 8g\D>lȽGJ)i-TIňPmd*㩺5LўV*Θ0σu{aʤH4VC}tsVҙ0gzTwr,œm=(hr3Wk8 /Bu؄uL|._z\*eGYjʧnTÓ%czF,3}nI9*x 86Mص>AlN/^TGsyqЊ8Y xrNdLc 暏f+kH9ȊFax5T'{BXhi V =xdid;\&Vm^7g'Ix1Zu9R/hDN\аϑx'кm$m@i X\S >!6|V!EP2d?\5 , Ps!tZ5Fe%%h1rADnSb\@V`3ƒs♆C2WP O^<䲔asΔ?z^P ݩ׷dW]0)NLa3v|2xMцꣴȻO%B(sDVG^aM*i7u$gUC_$~\˃YY">{YƳ>0Sͨ/!2|jPV)^d1o}B~ +װV1 r>BrU̬y ڋ!<[3w+p59S^+w%ңù3=ߍɎ2gSobi!^fAh=fEHQ)AWr#R_ OŹ\sm+E?lLN@.rqMY3?Yvޣ&ic4szZg6OTXBXhEzL ,#HɑNr1N.P6{]m ljbvZhJ*EKN*3TW|rnq_vxv`!dY8X mKH t~#Ůp6 S!fw=A|mbăם8ɗ]`nX:ހ[QV׈bԃ՛482Òv9G$cTE0?FгwU&+r6,)F~saބFʸy1[9"l9ky'|d}1_w4Y>8jOH@ǩ*pˀu_DWV3<}?!UA'ȅ!#MxZJS_ O\lmh^qbNA:'ͮ1p[&pᶿ"b0Iޙ|٭*Y.HpY?m|ܜkX.$WbCY4HFx:#-im>wW2k&xwRؿD}sH=ew]\7.x!u4mw 6M~w3jae -.nK9)q TF1ʟ|QU.Di6#axmD-?k6=͔ nq- eJ)w8Ztytk?>GijB"1J]ـ2*=™f4hTŢ\3i4Kǫ0^j~m1wCK6[Ռ"Yc4'Yl;ԊlM.hDOXrw[F҉&guxSB)"әo~an9%Nn$5{qѢDDjyͳd~je:t՗M(SC8׭ !e9d0{mYg=Vaam.}\Η{YM2DydЉ)J`#k\mx^y\K(5GI%iTj7U{8$y8L#{7hBiT4HƎ[˱<=k]k B`2K+Ohzt#cgGɜEoDҁwrG`02ַ(K,a&VOI x{lN7Bo*"E1N%t }t2H75h.gLw !mC-)l$4^DrD)DizȥrI /tS޵U,fGċ0sw=,Ce!N)қF"O oXnK8kiAd|AυFs6c*ꛍj >&0Si+ ~]*H߻)*ʵap牑:2dh{*E=r@1wSy{̖=3p-2y^ 'ۇ1']G-=^=x5*ʓ Fa`XN!(F}~I$Pz[ Vx莦ςSp~(=i^]x6qoIݧ<{9Crya6WQf>l>]~%kSK>;'IuUc$̘:7ءCXSNn*Ϙ] H7q,q I0n$PiPyM' ?kG$V0cZ"'hmخ/խ(87z趓?( -d2/^(`%#Cz3=Uk WGDfwh ٌxbPy~LeTgKnѝAj̴/l&1U/ ŻuFOfK7 _4֎m zWt'Y+&y݌~()ag2U,\i!t7` u! HUSu" =䵜KՁeuvj+uLu.ƌ(V!Mr20_?*W6-]Y^F:`Kµq>֐~[D8sU8B̐Az3zMbz,l ;_7RzYy&R0lDX]˥ZnX]-6ڥ#4 IDŽz"aY7l w=}6"{tZ[ZiQ\UO;80-sxoh40˳@(B"|SA;mMLv))6<\CA)m> >bi NXf %ehk/;n p+kqFNxcʨ=K_o~/ͮ ML5ev ǫkEzB'L8{T|6=(ed0n<'6jwu̘IA MzfAWgaѯ3m*!:ڔCBrQ#4[*3Qf|A-p1 }6[ /9 }Qq͙V3l|;6FQAJx'9+YXƬ/֘3zg#xe8llqY q ވ ¹.].I̯! IT$1cw-k!^cǨ9F]a"4,˫&rsOҔL1d! ã׳Go/ FЀJ:5H{IMj(x$QD0#޷]څ,-jJJԄ"twq<ٹX ^''sdPJ? YA-9j/؞҈{@SEHWzAxWE“Da 2Z˗Ą'YG+鈯 F0ZH{ltUYk|KK`N8|.ŵ\0wNG5؎ͺ ϟěK~?dU7w:ΐiƕ#["vswbU5n7I,u_y,K"ĺ>Ah}+u9 scsY֍rYT${Ciehy+ζB2G}#(ޔ͝2ؕժj(T⽵:g3r #9= ''*].΋1y!.ꈰs^;14V |t߃od( 52\z3;yC[{_du[<Ǜ4ŀwX]0M;%\r ƽ>`J<1InY ,D < A}0FR0~QdV7y3͞#X_,Ǻ'ϡu^xu1M4o =ܴo`Ms܃ v@?EP-A_7 5g&~51mt; y3D4 SӸ7XsqrF6ҤjMjrQ|э! fͰSȇR!(F] &gM{JyWN֍aͅ t՗,SmQU{C8u:O~cӊ_ 786Yn`O/y|oƵ Yg4_طlрʗAkƔvD_V`C8_ԃ7x阼7j1oc?%!Y&C_OeBDj;ٱpeOc X]B}b:=wp+-'2r-](IB<3q]smwMC.H˟^7 F"^ƶ i6ccy??$SXoKpf=zgA+#|_Ƭ_q6b[_!ju~/8Wաv}<lńdP-uS(sˋ{l`.FV3[W` ;{Yܬ%#>=nZ +naDq.<Lco`Ard۵0 J.X4GSygM5W8zɊ--u\"]GO0Jes1%ȏr1my|JA&[=YP҇ M.{cqw VQFI+ c8{WH ٤M{0zSh_ƔׄaWӿ/qs[^O~ j迍W&wp$'fb;Ӊ-Fڄxď:*zP-6 Y[ K,F*!%dG;{ .4L7V |īAm"D4!yM;YsFkA9!,!}rΑ+g}"^\ N}rZvm9`u#=hXok1yX뙌Cn:5bSа [ܑ9Ae, p-hӗ%w^~X荬{VjХQm@ t9%}?x6j=8zi LT6gPQA1U8ꋣu嶘+ȯrHfEvT]}1c3XsSL&d'SFR|^D ./Z#ٿAoy~S2 0\܍vg= 9i^XZ` c nT&_wHmhN{x`h_0c8C5؟'j}=2w&Sѐe/UT K\14Q!|k%zWy\}A)+cJ"w+INQ{{}`U`ȴ2*XkBS蹶3LqlS^<2wiTQx]=Hic(_c@nK\z+9"<}?N\:ȻAXtB]3o:4-7Ajzz&)Yb W/  /fV%htF~N@P7yk9L>9@J^#fsАC_FHȘ\7w<44IU'~5nLEom\YhdY =+1ԟj a' j+1%W#eRnQ&@wxKqSq𰁏UoA3ǨYO(l6m{¤N;lh\s}ğƘ*톌`$.f4WN]B!,ŌX#]rE^Ki>*{4.Ti;}{?=1cu#N}{" S:c${+%!mX;!\<0;+-{BŬrt D^T1y1i(%6Z mSg-Uh󃰓줞 P.Q'Luoue\þŤjsLʩH/grL)ՕƷY#fG(e[Qv^R8hR+1Y^}}稊k:ȁ;`$LY f6FPvR]!QLƇE$|nIU£Lw>fJ9O,rf ݁>:˃5RDVhj)Ƞ]Q<bfu$\8`j!C*cɌz+W(0IU7Cܡ /Rz^ 5@՞>bp/<:͒^\4|%YM1X7,8/㧛@Q۞Fٿ#Ь`+7*}xIGg<+l=>1B=mFge#"PCt&@5*xVǢgVƶ'r~AQf 9*Eח!EjVѶ":v4KꠦJ(aGbgo."^Ȍh,@v'2D,K[O&bzo]J/6ߡꯁnpP$^Q#/İ ?H`վe@G{1_ټ . F7j+| ą1kXay>[Pw|'\y S[T dU + gshj^%x0%1G|q(}w2-BX⌲<U!OzC Eʳ(H&2Hf -?XI9{?+݉r9Uo1emg28=v_EZ/c*8ΐ+wq-=glpg-OxanDfe>g)F";BƳV{r:arYؚ S;=<ϊK>yq:B;<\|x܁c([hO)|c|Ay 6>LNgٸJ9X(MJ @[Hɝ6[ay>WՂ(uS9хZo'PVQ^N RE( 6R"nˢsl7+#xV{Gu nj9hj|MItQr ?f=.|lAEшj g#):0=Mel}8ۼ<_ bi=B %"ĽyA8zpx_>)X%f['_pDm5eZ]l;w E0/@eodCs o{wױnfyp̸qq yTl=98֥rWqka!^Y :!a/)8͏ /WgbRU)bȆmIlguBW`v9\h̯2ô%ӥ=ʼi45PYY)QTVB4q=h}&r4f&E6'aU}/ĬĭDY~6ڬehdNyR&5MI\أdm=|l{01oMݕc ig7T˷%wrzDb`6k<1%1ig8<_ʟĂb܋"E ,yn1bz+9hRjU?ՠe{6.(UHIC XYR4P^(GsY Fn T7Bͯc(nAш2yg7 'qo.FtKz#F5 \r}3YS)wǰi0[<8%v"we_Dn!\?mQ0Y* 1ʃ8ՂE8-Dۧb= e=t 7Y2slhl^$K:}"&TPw<ר9a+Lt2εckXV-|L8r 2Dў >\&ӟ<8"igrGHV/W UʥJ4Y.Sg\Nk^/-b7F{ĭÛg,i[pU#*>o[~1Ƹ!suUO!FYCntfpɜ6t]a>B~Ud: ϕf=ȹ5rvŔ3gr)7ƊMb0;1 'E0ȽQ=|7Q\`_N0/JHme#l5rYb%(nET1'N=34ߴCw ;8tOVn'ǰ%EҥN\l/y1Ue_B>p&l1;1ez6UIqpȅ@,ht99}a5YޝyH4&^zda 6ׁ8Ԡ" {L2YVY?FjeBPfC.7S(w#~MB(ʙFmkbPޮQer%{3a.E[s M3ff"JڐU䈅h:~@kHjߓț7"6N"™a:g,Į'<%ÝM9h:7Ce"x]BZ2+LKmUEo2ܠu/M97k*,íF-w}9!_tYpFS@SP- qV1[i=0Ǟ\ ~Ddqgw XpfM>X 6 (7 Jx^WgXTgA&A`€utCg(CfF1jV >*APD7 F24(] A-`g"Ώ=9~$U.'tdfDY?SHoOP*BԈemXg"=,-#ý4u?↤kL3Tq?DEh\R=9ԭ0+*JH8SjGCXcl888BPR0۱TiZ/6+=KEtϼ$mXSeVi d) x]p&3œ'ak8"{ zzOvs1=Lhu$Uy zT9nBs-?7^%!vp2D[?5 4Hca,SWisdcv9d/:Ed"\` -!d%tpؙ|N8exEٻS) )1.$nRe1+5_JU~ 98js7SL/}Y 9_S8S=C [iӮ&+kA?MG.-tB )$Tcmp@`!bgY.r jOmlB V$w"XLZo?SUp Lwԇ"S}H(M`Ҧ"v!jPsDָ֡e3n_GtDjg7R0u:*`p.VjOy_5yfC~B$W2 D+'<#|uUP9b~Mb hΡE"JB>HMrX4ݯ#={-՟ cZ+ pFaA [TUi 5:&myJh1D=T`σ3 Q7EȐ3FzR|vkb,JHt;<>Z:XK 4PץGh&4ϳ 3{G  8Xc c4XM[|# u!nDi2ƚ䙢 E|$gb^`XIn%Aj>ADHҡL9$wVdclvfN D. s6y"ICѵN3`5pp Fg b$ב\^\h Y졇ۥઉs3}#~D3y8e퍎]HdbYj$6ܟأBHsf!zv9" kTx"l9F!t|2n"g?T%q{`с6uV; qۉ{8e|+#q;{msy.nTW-i*2Z uInFr0PE p=x?8GYcXM, Ɖ_%DR{A^0kے(yjժh\#WR~/~e:6?TǨ j;"$ Iah7wZhϹը+VZ·Mę}+>`6 ${vh3 nwDK gS pl6, ĽcdzE=ͧXJx΂ ٬rI̛-SB s/Z,Qo\Y:P|c[.pw;vę)#7UX~s?sP-ˏ=:<$ ,T#SDSB~T+*@D \TKk)U#P(cci_?Gҡ|Q@˄u#F=1|^GDŽ}ŹQ@f x"v6衒:=O#kDZHP*-R~ش/iC{$\-ȺgaB*^ѣM?LؙL-z0?$5bӃZfPD)Ľ1@7NJ^elȌ-m!nBzjf8} V^x {e=xsMx[yMu[oy>^}_MK6Sd)!!^{,~zGZG~aFr|W2\Tiҭְ@Q)9YV`2*H= k|Y.V2>I3RtY4jq 6:@B%HKyƬҥ=NN- ',m~5J!zyHT0 i2޵`:I0(qD"Gh1(F%YnrO\#j't=/@#x^WiTnAzS)ڴV$%ҢD cicg0Ľ1C]ːooj*-*YS${Ϲ3C{|=-Ͽ#3.Qs jk`&_ :چǝ?ڏ7>L!l](\КmsuzV Ԫ\: N!}?<_yKӐ4e7Q*5N}"b܊xރ$ 38^w ++e@5k؈i!46:G.a2yV˽Gk =^q3֕}2It1l_?öFn [!OpB0-˩@:`:o=cȈw]x1 ]T].Ǡs(Ѣe'QsoFכ4W!%O8?em,v}e`x? 9`sRUm7P;2 % ^hҌĞ=(8L;\܈Ux7H % ^Ag -:TxołS3]{VQgjޔ8r\5P/ co(P'\y^1El{) 6#;QX}:Б 3W/Ej>δ6[Mr0C^&Zp`v&kw 85w[M)C7$MYb>Ze4Ux,Ƙ㞥-%N![tS`FE -G1F5'AhIAfud(Oօp[dNĶ4L.F\ĎoM6 pf/G,ۯF dV7Fqݩq[E5 %l6ȮU2jǽn\_),AѦD"L*-&؏UI/~xaR V^pʳ\ez6d GQy趸g9BW]]9z/}*1"xBfn'FRs]r;@g-yc&GMR_ʜOexF g`? @j a6}ϟ9QXIm_o`~LsBl>O*]}6R,pgC˹R'ȅxacm.|!; ҫo$O@r7.9NGzqih')~Ra(TY0Ɖb˙y9?>"XΌMJ\aފAkaK ͉k)¦Of"5u 8|- wP^2 ]S YEir7TK4aya%; Z羗e:\1SPZv혪L<gMS0b7.zYJ._.u#cyֈ`K,6ң`yICbXH^OUƜbɅ7sȞ${" c%pn(E]yuQHq1{ OXF-]PR,'e).Fx_Ա8s 2i%~юE(RH&HqĥIj|d3v\3\Nu hNGfOr454q t=6GcEnyҧEmwSv9)樦ZDFꃩrÛ ]zdyB}eۄKLBVeߜwgӉ5z>|׺Pu^TfD' 0. j`fq6 v, d`u~\bv YCs0v )bS:d IIo0L6o_Kum1{jB6LĨẀ0}@Eޯ7F~`En|nEz A:9/IaV}MEpԹgjs@<}ݍ7!YƐ@*mi3I.^/U!uMwˋ} isuZO?o ]x^Wk8Q{Bn%!ܯzٹmmlUSQ4H45396Rp/:T2ǓVioap䃟xp4s`YMQ{R R8繤,[9P<{4pG{1bF>-MsͲ7O7d21pk($+`owcc9HOuؕOÇMqL r` ڣ743-s;g"C8s. 2oRAme4ўZx/.EFƬ01[CIxB߅e3n wN1ZCC wdk)%szN?"oYS_a413K> zCZ΋y;ťAs*3*Q4?"vjҠW1:ܦ?Eb#ϗwp,N_/yG8DŽ&Ym?BUB*$%|AG1]\Ƙ? 9,.6)Ԉ+T\X/j-uE]ôV'QcDf>!(0\{g~-(~FZŋv`o7)";Q_huߔR\ҸFv*ʸ>{$M!Ўk+a׺_NKK]LEEd9Kע*W' KbC#(:L/gi>KY{,rXفQ_k Y͒}j2B6pb5H}!\6SSku=q vӟt"fYإo(ce$?"jڝO_j-DCYa>59j i)8#'OCfjnujp>KRp3[!i}>@hzIhh]hDZy0aO틞ԕ(B/3m"@i>X:,E}>-ꋽ C0MĕR\afҮA8&c48,oq2uFG"p!j!UxjF?$+\ |2N7vRQfzʼn]2 )%l5o^_ĸԾp}0p5K<%q{"9tYƶh4xj& 4 )6VY˨-^94Ji!) ; O5Y۪ރ_.nD or C_5 `IyCGh9'(O(>mPع\z*aFO%9Ei|/?]񗱅0 'CNH3D='eRHc:q¯0@3b-䬝s}ܥr::GeVMЕoR[hCRF8<.Ui$F-E1N}+d"Y[53!|ԈpyXfNKVӖBA#[󞧃4#U;ba[l2}6sQbIcWؙm~ q- gTLAx+4UOu?I)Θ6z.(%F(j*W\*h<F}(+m7E2/x^WgX綤J(w 3t׍QQc16]cǃxhƲ7E TET4"6 HS;89I߼3k5KT ߳*A >h4.겢ɖ]}){!̫\ :1M K ғ3wӧX-LX8kN:VT %p&UҎZ6yv.lB'hPa=vP8s%6'!:Qyw Bodr{qcT)ҏDQO_{%QM<܉Kvrqõ3^sThDr0^zG"-;Ӿɸ;iAT{B"cVKraPMnbf!5!X/hQ5גB;/ ځ{X?]bDI*Cޏ2#UX}OUzUø\՝-fܭΗJ2VoMzsj, `WjŽl14{0yBPhƩ8Z-mx؇&\E<ᜣMEV\Kb>Ut,žqbLxNbL5bT'xI.Q.SvF5b$oDY{Ĕsf38Fێ%}WhɗJU2,Z{ [JJ$aT)̜nB4ku.p?w)5`|Z 5vH)`n:zUWqQ5k$;g~pbF^GS=1(+ЊB Z6wWiEVU\,ӢnKF΄* [||ѱ*xR;♿SOAFzҎV5vr75 vC s0csA)NwY1s'CGQy /N<^%,됱*r̩ϟ\Ƿ񏞼+϶PjHӵ&wL 6XtBKUʥi{wZfӅO3\y\Y@49x\RIs.0u L?|#p-._ѤHM #9E͏Y٣.e'rrJ|n4o ǾuEPmWzĪAYTtm8%Fㆳм k kzrcw(u%qs{/_\oMa⇲l]s *y@|KnU⋬J_qs)ثi2\b\MN=Hآ >ȕ2|iK>B4 ~nG W롿4ab?R ї&yF!,q's6bq)?~ αlu ?w^^aK=&T\<-#}=[$dri KWיzƬUDxD~:Nס7XދGlxQ'4Ԫa]|s%9He܇YeV4vg(iieW MF,˦Rd7XqO[a܈?$׀mH%F^Ϯ1bke-n/.b[!T2| 9&u0JTmYmʽo-CdbbNj1lZ)~{C1u2uqy0'w3GwW$qԄl{CSGjL}-wuC6m-wS%36f1p2s%khP x1IJb4Hr hJ}JYbt]cnKfR49{x'.'*=y|=G-1uW\Ŭ 0pCx/jPPԃ16P \=i>m 1+39Ah2nJ3ߔС |o}kUi" #KI[R'<ǯ2/RFfB+;*ql}^Bx^Vy8d9%.[/DZog6M wIԔE^4Խ5Y eMR#F("IQk?Isg}dÅ@qtL}KPa4ɔčA*XEoP-J"wJu-, {o %R )˳ X* b^jM2Ϻ,z߲[/c GX 7 DQ3R7$*KT\ 4~oXDR!Y2T9 ow}'\ƆTU;kyW~r\F|"H3^ !fQ=LG}%3-5rBPs_ _ `RO{* IwTr蛶[ V6V ̿( >=Ԗ?EBQ}V lb"GRVH`b$W ?[37!1Dڄϭ:)"OЪڠrRϤq$9ud@[Wh!%D4+9guǞ_m EZ3g~y`cW?iC:X VzPB4nGM57D.p,^ J&X뀾 _ͬy& іpż337-G`}݂x{w!RqɦPnR(pJƍ4Lp/A Zr-ˠ<\$G}q4jK-háR5h%p!4ɢ6X`ՙ5/W!a )w6&xpQRP 4.y$f҈]F &f}<;}V~^siaS tt`[m R?05]Z% /P#:K)bk9M-!4~آXxò᪡1oy>=m1G (=IfCϡm$"qZHz0 9lޮ&s \=: Sh`m;}~e^ F{' !o!U0*̧&3sz~Nq_ĶvU÷ ǁ],! 8:s09b/C0p1<` )75H1JXHYB4;VQdyJ -DF.^Ͳn@uLd/ơb#h"̚>!V\b{#Ԃ!92@K*fݧ#ײi)v*FS|ǚpt~ܤN" `Y%85.gHn~ `%j#pNN%WB\7I׋Him#9\s9dr6t6) zqyTUEO⭡sWXG I=C<7Bc)lܩBCj" Ly eAc*j8RhI/IIzDE$F/DJq0U=EW20YOmdWL 1ŪQ?U_ u%x^wTVƑ.^Ei']Q:16TA 1ޢ1Ds/UB@ DQPT (Z/J[w9g#+5 e.b|~r!C"ǵ=*)Scz*0&+zEֆ]mDE["\wP!>Uf3}f;lx MFƮU}泳+^]tSm:ΉI76 ϋB&uF;zeьoPDom@nYn[|NÞ1,;"{0å>{6 OXu59? o/7#Qo#+Uh}1\BƲ,<ؕa8 2.,(Q-۱tYE nǬBc\Ќȭ \ܧVq%-ù~p@̳D;W}EC6%2 ue; ju"8L 70cntތd+ƴB3d(i5{-c)!4|K6}YLW_8 ߧ> J</G.jUUa׎5 +rV멯>KSؘBAԮ3}%!. e"oƕлS$kb,Aݪ5J X6iǴxou \jSvI)SUhYXsQ>.فe#HElRv8Sɟ1GJ!)Ci1 5P{0d8u'NfG;#,Xÿ@/Xb8<@>)PlCj/&ʌ=S&ND=# \T:_lDgb%BBb&L᜛<Wu9S8ivWؙK]@IbƲaLꅽwv*ћ1ڨGfMgɻ+ݙ2'g~gj!6snr({[Py0%0&}> )И:$nKqbK'kRq OiķmH9'*8[_T:pp3q㗑a|2#+w:݉qj&x&nkB{gXN,Ų5b)Q{ Yҳ̍M:[ǾmynYsXmFtgاVasо*'{Fu/grp&eIkpwE8,Odo`^WՄfN,#=;ǝ37r[]+yr̻lkgeط,]f1 d+oL58c Sw !Ƀu6>EL`FD^ ᜃAv' Ii$]4X4ʈox+%3WZEIJ* |nGaQ ;ᙛĤfDw/Ơ0}(N?Ky<%ٗ=E&\7>@W#ڌJa8$=e`J .Qa-l!Hnuuq"![+c7Ӫ-5єBjEvBE icC/ _\z8jn“r>7Uu.‡8C16ʡy Kdx*i84P~_+?hJY'=)sZ'Eͣ϶SٟIsuS3N}dټ>Vlňn-Bt_^bf>Onr `uh$/>F%R'srk5^zxvs[koipu)iHoO~f>64Oc&$eaYIgf#B8.2، by ЪEghUkήK~^LW$jC< ba"B{DG@>b<}Yt):.TRّ>:€z!_ 8Az?8GQk+|#e"!~*"G)5n ,%sN ]GZk|/ n"kfo\$۸0pI~jg.S,S͈̞|)x*jq' q~~Gl V˃%PݥP 2_Pq~19Ƈ[^VG3G5mLwDlM8R@ǁl,Yc!XaE[;Mz+fR@W̦^Z{T/̦Yx<1g0<샃ɢ/ c[F8cIiGZMRXJpA1Ye3س5Fl-e"0U}pwL4G1i"XH$ZU%+fX3'}!:aK@`bφaH 0\ϰd3 \DM|zwGגӤaZiی> 9CTKֈqg=(3)Xl =s:o#$ sLm}cE5I2iM>^;=F@ FlVsQ%չ OY򸞈FMX>VF('$N/ϧfJ8/Ƹ0zae|:Ó|v񪀃4.L0ggBP{+9A 3/%.IQ0mr#* 0:ECaNO[&(wc^D渉2 E-ԼTK♕Ӯ :I%N"5ZhfpcslݞWDVOhD U|So3!csEbi$ب9A/OM<#ۂ,ճa)J`I !v=\ں.yO 1~p]gw͒ W|o)΃͒hၒduTyXOHay&-vSdW _eg΁N-s\ QA)d8k}ꌤXia<'t:SfiDyIߕSLr I _Dd*BW~+J YDZs6;c7$C>yy`gP[\PẊtM6|6>N&,o-k ~5对^UJnIe@fco| ؞E ?R15Z SäR@2ih(ZiZЭY;NȵF{'+%6R\ř2A ?[BpTȟ_0vӺB}n>Ж(؉tROgP[&Rs:l%ml祳P|x("R~+r(ji覹20r>4:`hG 73m4{:iugnROJ3iSCtP)azl@+ |гOW.gRN)Qk/ut!gWǒhfZm.l`j'z^PCRgJ:]CŅ]di.UqX¹tAMR3@>G cpg#d&5zj'ӌ}P O/WIi֣,*Ytgmw)eD>B{qd4*c'g:{[c^, h>!r(YI+r_QBiXAm ].Ij$~;茪Q0ک(U]f=#>$+hr?m͕P˳Hx==++Y3F YBۃ?yqE|xujVυ7tN:D0QK-҇kE\LCBݱ,z,ǧ2n[ж=drbS cgB.ڹ(/#|8Aڊ# ]]䭸@OΰKFSAgpe*j]y$A7+Ȩz%0J$0DKsب2]5{6N"~le!QG/8ɝ"uo!rx^gTgQH2834]XE]A F% # H^DVņ("Kf 883vN/ztM-/ y?$GQ\F\e nH;Ƕ3\2Q&C d&zIq$EqHgdLJẋZ.9 (zm(W&[MB0PVERC'\#/ u3+kclؠ"P-\h}GvHEmxq; a6 x*B{'t] :PJ gV!eX JB ;ir[ t,#㠑 H>ݣYg#0q?vǝ0k83@r"&O~%EyQ#rq$0djXNr"cKog\zH 7|]-Hh|#q^<D!h26ҼT1TF7_gG!* z(dbwSJ-l]&o%# 禍J39#q"6#TOI.&nW|4^m; Y~#Hmz6pl5DK2J&7/ sPB[(6/7b½53I{-dgr!ՠN0t#iL D~7PcruL?{Oܡs'ŠsreB.2+ssyXy=+#yLsC`+*&(s{O㢹B96FWO\N:TM#9Y$8!ĺRA)W" ~:4%M;Z&3n P @s:!([ƣ@5AsP>ڡ\녾:g d1+4P]GSbs5-{,b-0u1 Z 6'*=1`^2>^k8# K1!,U/f+-p*})땈jIN +>RY4h h[0BxuqA9owGPDߴŞc3@ ?$ZPE7l +v$KxH</[o_"x^WgPVT@DZ77(қ|O뵗X(L,cF`1jGUZX+P@PQTDq{o9Z{NC&7=xOS}LJ%| sFrV;p+ru $=Yh^ yckr_g6NfFCx9=,d~c F ICE}XX\4̀de=w<iq5z݈V ٣{4{ Ήfz ۅ,Xތ1uwP\y1$n/JZ5?hIP^;c'6fM= qPA):(R%H_&ʱE87FT}rY,`իI<ߦ1((3Λ7ݫGpX\IA&bҲ>xTƛQ6ezRS ɹP8~=0:Kef٩4g?{x눶Au1bY1|VmW#=;??}suŷGX.>~) 4gwZmO*oʾ<Ԯ  ZipN❆͌I2^}Z܊s$<0gB W^*5㪟&͛?5~t1ZD8zkPkGsL}.vr]3_ 7ix jTykFsu7 f~0zW3?i2 R5/iN!%̀fK"J'v}7u\ԊCM=]@gf tiH0Mi N0Nɑݾ\iΥ 82n*oJүTS gTbƁlZ-Z`TvXɜeܸ'ylybtanjug-{-_l$ 8Z^k`[ >Sp#2[ d#3򩳐S\ vRøa<,n=uS$ݙ*&NPz}~EtF!xZ'(R)F:AVՖ(!=/5F+kpGq]0:ǜ37D,7!b3|N&񒏱0N`Y) > X]!ݩ)Mt.E'= a~Lۢؗ?ܩLKuhznL~[JHue㲖c=\_ u*6ŎxV_xYE=y&mOK4bs,k dωX[>ol9Uo"[*qs/렖ZxzOMv5gଫ8q-O! M;V|>/'_Eg`[h)T4CMCa<߁]޼#{t\GWbut3 "x3lU!t~75v|Y2ßc^NȮ=zjRu͊S$ӕA&xet5;Ch@Wgx*\haT eg;gcRqH/\o#]DX?2k*Kj~˽oʋS؜ύ9Q:61+,ķ7u +2RVV&jxT2 IS-3bFL_M3p%s2ķ7WaC}a˪!^4-F736#׋c*h؁SMè&lw/ELaG0y/:r5c.~;I2<҆Cra6HWz$7T/^k1u$/@V?RyN1.}S&av34å8]} }&2z ﻳ->yak{؏O0NSyȼ 0<"Ž\dT")( cZ5&1f#;%l*ǝ3Y苑-q#mM*h;p^?J dkTz.c 4wT~շ˧o2;Q#ɥG3Q3~zQ'VcEH+Ŷ ^~e-$W.4 k%LH{5݆N.10[0%gpO c]-zwpvAK)7:Qc%7$.By1D3RX~nÃJԮЦ$.KL$\FBn />kn#JWma oБĢ9pgh5d?uِº;z^r@~-0<+2k(xL~Uy 6ChW֤9FΜ1"* U#c9$y4ZDr9W[r1"En|7ƛp+&TC/Q쭗`EU|/H;Nb(,rr zvA2aW;->O?FFQY- Ȏ\ ƮfخH{S '+Fb\|.CRn[R{[uCJnPFً6l45>K[n_ ʹ$x^gTWƇ&EDJ>tT03((UAcꂊ E " Ų9k@8{|xe\J`dFZ/(YCR\ 2E~dR&/ԡ&>UJ* I, }sM GԾ (Pθᴢ)z: /QzahŎvIÏcPM)IG5 Eu#YQ$6a_#LGy~CHO@ZKȼ҄q(+ƥ h!<+8iFXt/6QN k9i.vAX:5rD+lċ@:u 吿 PM34:<90W,xk U8@Qmj^{MСvMԾ٭|6sDmH2qXT@`+ ZO[)n ~}_0Ό,0Bu[ۖт|sZHs3E\xGɄa pҝ\fzgD''&YD'S|3j|*#,CGχ%(T!9H~J]zLrӟ,F*`zmI)UF@)+ h_ǽ"tN:kp8I*se:Ü`0a"êazQ2{/-xdz%I<0m/ eӂ!="Y4jͱb;2Y`.gP'B270C@|)ВN2bO{;Bu_K QļUɞ(M'tkib8ج: }G{Oظz`*k!G%O 0?#LLSb`4ܥRӢ"u\Ab {o\u`WYAh{o-!^ p.b `㊽̐R}IJy4EBH\|r]3F:Y߲QT,Y~(wdĿQGk2 O!!eά/<^S:QuQqWEDy8`?,.l?4 N0Ԑ.;hvD|lHqdw#512~-cZJgF7e0n?9㾩<)#U{%?x^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^oPaZCǂ $F` %?-!c]E^azq8 Dy n(ԁ%]" ]9u{zyᆲYJjHBSX c Pߋ˫7YFm!QE޻hljh&odͻ4oi #m]VwqQ6E/"+BtN8r 1Y)J2TFIe4FGwm hr-dFYmt^] ^4.Оf7آy†Il&Ī`FC#GW2\s5P榭U|O{"U|A4r,c+2W%Vi/|o=}Q YFi! 2NR`"ůzGl4 F9. T2>\1Q VM18W-@y;bYi8NVeZ񛩨_Gzs#MexSX><8(!JRKWǂS{B/d8@ a(lk ÜM? }LN4}m0Щ}:0Pymͨ;1JPKڧ^uIHiO/ : lD|Zf"pXm@,L!&?{uƿQNd-?pW_@`0 `0>+x^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gGCOL8 `(hh  y deflate $$Q (unitsdegrees @ long_nameviewing zenith angle P valid_range  B P _FillValue  yy `DIMENSION_LISTBBSNOD ,RTREE2`$:qHl0۳y1 DU$` $$$H$ $lO4$A $Q$\_ $n5$ |p$D? He H$ç HH(J Hlȿ H H H Hf H  HD l l$ lH+mllD5 lC lMG lؘ k-1\"K hx&uȽ"Qv>mPO""&{$ޯ5pmZFI 9g 8&D`ûao CS 23k%2Df^"rA̅C΋ ;$ЭZ࿱"2\HF+D>|Uײ}Dկvw}jѸK8ytE< d'Hl_&2 $+@Z?5V9XE)1BSBg"Ѳk" mXRj`| d+2QU**c5͓טHDN"=d=5Ĉ/ {@h=\*pR-Lߺ -卞od~9u|5!=e_/x{%r핀ᵞO:DLyg6k_49X`(~H̟X# \Lp1DH!p?KI^[=9 G<t#d8ə-s~X@Njd>mTyO`fzh؄{Y_Nq"6zbfg}`}tkţ:zcGO =m] a*=XO)=1F+mr \uZdA@zz?j0 vNujQ?Tm k t3TχV-ISqj>K^ :~[O=]a)9ATU.z,б:2^H[㴫Ŏz:iN`W6ً3r.huqZ^mj\|ZllVf-o>STh*k=ϋ]uxqzFv򼏎>Z.ՠpGρ>z Vhx\}JA{O͉zvTj8%K%kH0{L jjq WSX^sS6ig:Ds (-Բ]Ù N}d>ك,בrV6jx%el B5\sp􁆋jZeN/ag-I/yQͪ<5[±*[{UC\=%s4+27UGjYl|aI&9r.dM֓$<_(J!EͰj57LV🚐sRV_S͖j6jAӡfߞ,iɌ*{N sx5?-zx%]tUP9OWq~p9+owJ3+(a96y5GR%5fKK%{WNՌo+*߳,.g2JQ|,پruX"0u\ eZJǫR*shC1sc)-HqGtMת<Օ3_>ͳve#J9VFE˘KIM+lƙr3γh30I¡-397fyl ?bl|:KRp{2UG E}@`D6opTBfvR>S,Zgqv^EYctޛƆgax#p2W\:p"Tc7('~< Ul<7%yL1Ù{t8]i(*sȨlyeQg 6eS&1=/WM/WO2McF:YNZt. MGRZڏacyDYIf\]Jbt9/aI6Zzr?tCٗtԭiNƴZS)z%_*L{Xa/_v *OpIt"Az@,͑>hY&Ɖ4_MeY*cU80m *0S!$St,'&} d%["UINb$:&xW/$qqFɔF&i@2ɬV'Sr%m";1N~Z#XTϹl|+ ưu Vc^KUq?Ǿx9/xƓ?q4&b8Ҷʗˁ~؟нD/  yOm9E@oofŧ ~(7?q }Gy?;e?[ d?na/A=+`A{y)On$ypɛz^zS3>, r4nqa.l7]rН&'lw'|/yu_2ğ=|I${7uFxv@pO?MGl䀁EizviN2R >t\"zN'睞8#l,nG&=S3ɀv?Q^M78ȬV=Gd`ZvS|POGҟ |sy22b`@OFRyfW:$@`_#qۮ簩MzrH왩+=:~gWu\{e3O -5nLk7Yg^dV9z| 1.k<qh <ױ =O.^QGZ+Hu$EؙKuo {ri4&-VUǡK,^I9W̉qS?zCǩZkL^M=k-!Z.jWt~Jtdk%C~[ㅰZ2&i14%2hq 1eZ6tk%R mZӢl-5,lpRm-'OiZ̯^!v-Z~s2|5er u iX3-wh%]CW47j(Wh8B|oV\M-S$ZS#y(54X >nRJ5EBnj~4hqgCe (~& k_5{UxL~WTMu ;)uS2rnXK 5hUJ4{ 5UBOVQUԑ!JlQrO>H3 |Z Lh{`/JӕUVmi{JQT(0f-V* zk:FŤ j6?Uq*^lQP,UbU*g` Jl+h#剂d|.g0%I**KV`"^|an#(N\Ξp97 \UGyN 稑.V1Wj~#G"J؟*^{ ZrRcU!kU2Dm2Ssr",1:~/c{Gul"Ǧ:c_e '*WKMFMd V0lJwX-٤` 92,JHe*WGE9|kY6Jγu}ʕ#g;2GZ+XT:+Ւ0~ٵx.S1,[GrQܶRw˙*UQK9|2(ex;Wr\oj8dUG70dQgR͡;U4.La>s)Yu|bZRVPaHƮEجܟLXf2i5"jƌar4 Ԍ.Ocz ݉rʙuՖb{ }WeX~. :~}%/]IZDMeitx*Yk T0['s]?e̳*R_Î~(uD%?K)M-cvI]1 P8XVt0G=5ƐV]'0C`Nb ͟*xWQmo_΂oJ1>%L/ū"{q_! ckX&c| Gq}Uyx4=AyXNȡvK.e3i?Eʇl64}6l=IL*@XĉŬy[½E:; 9!;e>Ǡ!rT7c(|޼+r=!K6 q-I2Ç<,.ZgQ1 7x?t.9qU*~i zs9Zy{>qI#m.Fc`ҚLnz $s1MBKL߲JRBT`Gk4C>Ky6 a4 ǴTʼR\[}n!L1>BLփdX͕^JHJKkw6IRNүFϝR6K)8,%3+Ob/b;O'п1f_r?6z?]1=Jg'[wTyQ=99ϋ;^LgԮش!..,wk7u#]x!كlOOvfȇg |,tbG'>wfG}'B ]'Õǩnz󺗈>&{b/dUxVbwޝu8odNw`F#;2D՞qDʱNYlFTwVopѓV)>)J~vd&'.qFC'nmvW~pW*"K<SJ>.ڹR2mɖ۱[;it ͑Zˉ6g^w⁹+ݨvgZkgذϖ۝:͎vuȑO]X<Ι$S]FIy-b7t9Vof >Z%S[Q3ٯ֌fڢܑHϴ'|?W:Rdp)gL]9,8b^AmCc-y+;wĎnINq$މBo.dpw*1ҁD\d]L[:в \sr,h}fSԜ}5GvpݖmȾs*Д;L~YuΜS{n5G~-/owb=8p5;rAΕ/g:#&׭hv3arY#z;ֶpSt6(l,8fɭVt4X ul7hx^͗WTWDZ # ѨhTDTP1$R931k!k&^]hL5wuY眽mϞf-;iJ_Q&)=QI&4m"Nmv^F>gUıFKL͐ТW_Ո|фO Z*X&#Lx#xzqdbK {,3.ƊL\D0&xUodzH~35F"ȸj#)XI}md|oHP77F~oi$3ɿL+ˮɺoľZ#W oaĨYAfXBm7#vU&"H.27^Z1҅&^tsdӈLAQLf b#߬1rd od66RsEmL!& 72 w22MFuS2Ize`QW 412gQf[#!r+Z%YU2}Gd#?Gu!'D}v2ʉcD}L4 4!r,b'3r>ʔG6`E\3pSxq,6Z{eo`$XEeVJs5 >>0p~XWO6-H|(5DfRfR{/t.ULfxW%$&&4Kx.8*rgc킁 «,H9*꾗H5h#Q@]z((@"DtWWuU-[m>@^ O%jK,%]Kj$4ulNO.pohW]Uc$ yk$*E%86HH.OK8KOZ ɢ/@Y#@uLh0;z{t l!Q/^q8;Yˁ.5sZz2Q~Oǻ2~B\+xmk=yo544^#]T|у: En:=w\g;YGtۤ+hQqw9Do iyV<-*IˮZER*U$\3BG-̕X7YgbOKiznֱ"PG:-kVGw;-S&k2 45mVs6PMn{5jpL4LܦJO !zl/pBW*rRI⥞E?hxvNb[(ӱyf<#5I{5hXa٫2dWS>^H':_͹gzv2,;E>Z~Ұu)V[4D,и_ԯq~%:]4|osPÅ[j 2Ni8sN)yeG$l.Z͇0(}9fK E2ŮUZtC,tqF)Z⣵:c)5#uEKܰ@ìl-?kn('rZ~EAۘRjsuW.Pe|-u& ;~4אK((2,asi1͖JZ4Q":g ,K!o*fb3/b|͓EN\v1ϠSw# ΙͅT+ϴ<>#+9yLŹi*{LG6Ξ|:-V@o hiϧbBH~0\8SHQȞ|fa0mcp˙"{2_|5K 7,Ms}xV2g42Mb͑~>ga"V94:cltcC\?ۓhhcүṫiԥqQ8NnyKgFHi XԬq>>˥SyO!ٜۄqtÞYTeٜ8w`ҽ4|>+OȘ7_q<ã1M$N#yR+G*[nJ!T2 Ѳ@du_b}(hՇQ}(?g׳Iyd&><~Fq9"eYLoɾi,k=Ù|- S~d *8|eISo=4W3f%Hc"azR!yHD6YNHAp^ƐoEhOzT:󺧲g[ |H,m2/'9u'')<,ٶ;$Pmz0uݫcn uL`U|0OI—$v[G&Pۓ/O6% KΨ;]zu}wBwFswԍ'f L3]vʛ{N?%vD >aPq;vfv֯TfsQ4M)cI*X_*N@*a/$N쳌bO(G1nNUQT EǮ*FUqMUqTwU< qSTxmܼ#q0E<',;I#1InH;BnL. eP;ua@"vN,N".FcsH$64"981@'pk(fPa,:ʼaX&2W,L21U . "98`Fw !L{R't=B!/ yZ(LPr(އ2]GVٺ@=Tu҃XA4vw Mѽ&/QGt?/elfցx $*3A7gOt b'0 "q?av8+ /rg3?pN$$DɃJ+ߑ:3B / ј/pb0\'?(Ÿ{#n?^s|9mo)ѻv"oI>hF#ه;>hxsžJ:cGyc܇X/w}p!bLJ>=-Gޜs|G{0N@:AHodK%/z{[%ruanƍ D* *-6mcGWvTβ'(dGx̱δ9†\qƊk >Nt'O;0dVg(h U]AW[܉hk;̰oS] {yǝNH\ZkŁVf͟M֜nå}Ҟuj'#$8 ;>щ8a \xʍ,;x0?8$ 'lъ*GkXºEww6nuŴ܁Uuķ-5ZnKf.ּ<`<َؒ9Ɂ;NT O N=p皥3Yw--1Ȃu )NQ {F{B;;`«5wN9o2 sO n[[rE;vo!w`{l=nv\qW /2=@v\ [i)[њϞ[;Љ//ɒ~f=fq-hվ%qU+"}mmKdr%/㚝56ζPžHr'q.p!+ksrd{3Čz3p4x^͗[Tgׅ-HRA ( vQT"X@0(""0}`$v,Ĉ؍K^5ya_Z{skʣM{Z610Hz4SGeiz"'ghN:nhp7j#ejԲ"]CJ-j55 j;hMOR}Mhi0&˞زP>z"h2Xh-ZfҲ粆J4TRaY#VQj~{*5hpPsUh&V)՘iTlOBoaH[ 't<2PAZX@s:RԌ ԡ4iqLYL5Z[ je]Q1ALg ;gYI{U8-W(j(AŪ)UhTc$ O:z%~:A_崭Z+Li"颊ֹ*Vk?@ŅLaUZbk(T@&\M *.S!YVib]EmTIJZ吆4e1V$veW}K4X&9*iWxUwJߩ~RɐjWaWc%eUSܽuz8kTD+~R v/Tl*.ka}_Et!*: UL,6g`jݬ⋨|M֩<+T;rZ.r<,QRMI|Fń J>NŻG'RkU2 ]& 2NcI;**cͽr"NbYQ9M$MS"cK)VŧJ"]9RpAFS–qlq,cJHz8r V*b"nG߶;%O@ƆR,D47 ݾiVʁRT8,/ŕq=NG|Y0iXRsb&eb:8ۘ1L>[,QSѼm4E eoyus$ݲߘKx\F<. NCLxe\X: [Yfșg8," y#iP@A|޾왔K!ePcɚAOLJ!_g=Ngo ds{  aD'L>gq'z,t$wJaQ}2ÂR({Ldy?R0NXW'Q93#SwE,&//㓸`L"aCOµjYjۇ#㾮ĎĿHI^ӑ[ŝP7H&IЁt`{~;> [[GO) OIޙ/ПN2HKH'c"'aO"s&EO.ٓ2GB))Rn(۳`#3 bH~mHDv'&2<5щlޅ%rz"ӣd(8"s2L 8͉ql#>wql~<&is*+r31?|!cmIIiˌڒ#qDlc88xt?oC<4mcb[è1\0ж6bX?K _Ke,{g⢍幢-\˰m,g 9}o4 FI4͓۠׆~1wKf̊naKX eX"7(6DN( lIr&*L,E9iF4M+i(GJؿD(9sj8Fp68Dh$=ņQhh-'PNjmaS֌?ߚpG*/p9FgyDoU/DK$j"ɧHpneԋPȸ]ð0qQӬ53GfCpcApV'Q8 zEps z?!?P=+a2Zߗ<90q`NZSVƄ{i oLCM0+C ?Ciȗa C;>3[nl?VOa=A, z0'kBJgɇ|^D[fiµ N /;QGe?ηGu֟.z@D@n5⏥A Dxo`¨MiO^a`/_<-GU?8jť@bO[ \h= @ī@Kj/="7OnzS^>UbCqÏj==ĕCsɓxRm/B{a{)—W}A{W@1>_1~lǺѝiKăC=֓Ob[ފa^ 7v|ޗ:?NM *W1fCݙ"`'}yrX_:_.?{X^ܻog/&bb7<ђ- wl m\n+~߸1u>xڷ8aWGL{g\8.ʝT7nTO"7rW< dƒ==@,ǑĢNl9)%[Tѳʝ2jOڱys&ovcsܖ\nx?)Uka7ƍ~\Y6ÖmՖmڑ̞+ρdX8ȉKlՒ.+2XbnȚ64ңq=Ǒ2g~+W\itrڃbs<;גvCy]EdВG-Rbxk߰fT O9ˎ]O{82ԉ]тW< ,)+ra'3y"3$?^O̧): xe ݥC"'JDbJ$6M/)o&rR`]"{^ k=gE\zƶVY"EJGwp(D6;~9趀w*kAvK-x"qhvG!jVc-YģQ0J>.r`u\w~+.Gh8XCJjz 芈> %бl[uk` 5f Nk:N5*HUkNPM 3hPTԓ5>R"AC5%uj6)Jl;I|k =N0DCes Y QM ;\v樑+13Qa!T<|rS)jXqGIym5t"H3+=IFjiJIPrYq5ppYT 5 W-Yœj.5p#,NR(%%J(*p{w%8pX)=JF\ o4' da_ʥQ0 R4$ƪ:95RMEǗ$)[AůJN.c[? +]A2bK*#g YJV ̋W|I*TçeZSLtWHsR"[M\JN) f ,Tܤ@ʧR * _W KI .%kR(e>Օ rUE@n g(Կ;Rlb.L* U|WJLŬL$MLTጊe1R]#+$+i-Y2;(xۢ}KYYR7hVLK95'J(.N޸\wX@/5w*YuYgnϊ0hVLb+d6.]/"h&]H"C 1>U"^P̳,ΨƪRf%`(/bNV))b̷Bfv-UA197R_X828f2ߠES?2+jV!Ro衅VN[9odnD<ݟ@xΥF_-rܦ\4>ad| FOAT|/(Jdh>~]<]spԴ0'—8k2y[#3m`WAC82 s5?'/}$uL{ z B}iuHVj>\7k9O8œiخO ƶ3a:cx3wuforO6M&<~XvKIXW,"_AM,Ʋ#1cn wgtɀx&̊l} Oޅ}{c3b%k(EZEh"Em *ieጊ`֕E2S$}"9?)̲HFN#iEċHVF4.#QQ0Q<,GJ4uQȫ(DE F8wlB,C;(#S;Yё;fGr{y@NrL;1雜rv1r9}UA0*]߱ f-fy>. x?՟;$@6 \H؁;ЁW:p4&K89I'h9nqYEb0cIY61i}x|#9؟5@IMs4 Q׳N I n`{=>l|]@?"q7ʟu4`Q;;` 6PYԁRoҞn>NeK/Jf/_f-㣴8ӇZ#OYx[ɿ<9ߋ.McLڞ>ZC^l٭>Ä>wt#o'2v0Zf{2'Kx̀8o{k7wxs*‹+ &7Ȩ-# /U }Ώ I{܋;üi؞V_f<ڋBoyWEo {z;׭d#qrf;^o;ZwZKx |gw~ +~`ĕXs7s$\Z;Β/ɖJw;~c=w;wvn;791<יY.Թ ÿxXFvXޔ00;n|ƴv2zyCƇ .ҹ˞WcFD 8rjٿkf.td aTܲƬ {6ۖ ȴvrǵ[?ǑiN~r>ō12f1gtf(:l1.Lhmͮ2kW813 <=Ł'8$>pݖmkLĹђǭaM M6yfK9;R3O.82'n>Ε;\yؑ1{p@@G?v`%fe=+S8ґn)(d[&Oa iG*R”̕fL`mQZ0+ђX1PFX gCNΎju1ݖVK,BИ694aO̫[k:yQʶrkw֘uI[B,sʒ V`bq-}~cw{B8vb ǺX1Z:ǛSmL` 7XRފуl֖>54}`Mj ۜͩ[m?iD#3m+Z=iE10eqiӃ[Zqd5cذCt=\d@BQ0ޘY{-..OiQnOX+K՛"<;`uT3.!(a;zdP1MK+ɶ2%5njbn\ 4_#lFfZ x^͕_UWޛt*AQl"`ϽXbkT I5jFHKlXyx?={fZk9f# u: QrPK~/ԱoG>uԄ^/M:ԑZkYǮ%uPG{@?:>?,!㴑,wpYGme:QjP!rjōZxR-x-Z=Ph1{功@T^a6-JtNEˠ:zc -[xjt4V S%+i$y$Rl-Kf 5P`/J內l"#t|CyVZo6R wjR#𻝖VW`z Z,p7ZN7 \!j׺ywjxxEz d<}+kn  ,)\  y-LF("fa"7{vȭ/Q KP?P$ Kq~$C}=O}XNiha 4 |:Aᕾ z v<&<ޣ!L#N^Aey4$$h8=G@sPMn1V))Es4P3{Z<FDTg!_< jJI,Pn1c4]Q:Q<Cãye^gix.ؖf 9*Rp&කփ*z8ЦfL?:1Bͫj: [IS1>YM7LXدKjΦ9~YͲjvL65*iZȩO5oSo}_?Yf%SE 1WC* RUE*ҮgEj:YdM%}n+FMj.\^]CVfhy*|/AJUyW*~|+(+J*|QA9=SR=Bޣ2)y$ck%#,WҔ5Ud[5=**ފxb(Y檙69TSZIAT?%˔Z 2()㮠Wɬf9)|"*9Tb}!),دpg-Hgȩh(P0vW ~BI Q@}S"Qy ɹ`]$^ Rt>9Ȉ<`W^-n'c 2$2YyWqMO** C'rEM*F)ZdV*0}$$Y}2 $"TQ`_7(c2~\$g,9kjiːd0lf5ߩe_R iRѿQFv){>VikC H9[e$[2mA9[Nw e9RˠrЛ'Yr_ƮZ8VK󼫰 ѷ u5 ?Eœ49kp< 3T4Q$t"rlabsX(+ƲXlhK2'h/g?b8op~;TRhLd|3Lzr.!,akMѺ!DZ'& c$>f&Ѽ14V@QLߗA1엎@=5C8bqÒlĈ\ݟ.Iȩ&Qĉ$n1\/ZI&Ghax~ܠx5+g.C$OHfMlJLa<'QYښZ<$}.ۋMv'0Xe<)3(bI[9>vp0yX mn,Ա\KۥXHJQRƳPSo (6_J;)K7\J)uRz T-XzŲFɱ\\˹XRm %$H_~RL&r`@w&t!tZ 9c=ۿcX`(aT| J"a 1TNfZuWwE8=nt[ nMdH0(+xX!Uh*C|(aDCNp.Sx#wé<=cxwcynF^vyF"n!l2E'](7߅¨lo8)Qӹpbc]A. a Xy![\̦*_$s߆]΅RxPl x41a8 0_[FNܕzD $pw r,{A8)0E'?]0E~OpOnn=cyW!_d ̃p&[ c aSD [u$1 ;~EUǙS~p??ض,S]ѕ@2tZO0o*Y`|2}}~#ߏ+llkfPtw?gGqOz w ;o/&Ƚgްӛ>|8 _LسϏa r/p_Ew|{yvGzRޓ#^x<=}pC_mc'_|<Rw0'?\rC%sc]7ruwyE[/*{:ׇI׉ۣ3s! *Wn|Pǝ{YY;Ϛ@,mX2і_~yvW#K8ɜ|ggɹB[1њ{ڠ?ǖC*;ۣ:gGvb 鹮 u/WftOρ5V2bμX 6%ßX͒.kk 7nyюwv&hN?g&= GW3ꮞ Lf9y§_\c=(L * l0Xͮ]t 'U:SyNG"aꭁ}j i_O8e w=sdpa|3\G=ck d _ɺpOg䋁1:WpY炻?,4`3?Yz.sW'l 4UD+rm{qz: 6h,/fyomvzF붦:F8zLG -_tZqՑZfZ.(gϜr&.O%](YUY_y}e/IY9LE^5ݯS;Q¶$OJ81}ʘ^٩Rݓ8gMh)D3c I^>|zN`"Mf"lSITlJ}Je](ffH.n.kr!o3q.,ϔIW=,Jd`?lbYx*QpuV,mr4e3Q\ůCP|bܒ(\E[҃zPΏpω`؍E>HfQ_#9B$7Z#:-{1䨢x%ϺŁQő6D3# pZgKqaa|μ[a< UFp-8\.F9m̿;75P֯|w(oB H65a0]c|CsYMY8!ܐp[&d9rdrMS*ȹh]^;3DΘi2n`^T4nB)!u#wdW7;Yj+Ǹ %rj.g<9R6;Lϗ`d*dt*Q0ߝ333hh gW4\2#c %]IەotTWL?m b\ooT2"dL*qP0OX>81ۃاdd588hӦ@.< ䷆@54m $~Wt dw 0.|*ei_61~FL26%;@i$:-ECoҕq5CEAp$K}}DfqH?V]%M|>x˗|yƉ~T%5͏-'y7׶{oI)*ۛ3^ UO7]xJ8s#~8:Ɲc2v6z4ËQތX^1_H N8qE zwaW/W6ѭ H zrK8Β@޻#{0`D/qw[]i_4wr0_Bd Z\BVgFm0wvg%m2n$K)-eW#d;sJ+ /u <]Bb\z1h;D Wrj8q3N\?, 7XAkzؐ!–z[VHg>?ٳuYRzu仞NLqVRL4GTlu«9q9;Cʞݎ$DF3~qf=GdϑٵYƒs0'kG,;ؒǖa%_kl=l~kC[Np֎kR83· {:āׇx؆W8{ڑ`O,őxjKvKzbSB"MLΕ7CЅ/wP0לC|’(+B4PזE/cȉR$IhsԖͶdMNp5ۭ ~aç VqH)ND4ZaY#Wu`ћ„QD)=o~Ugf(̨ۅU4qKdV?X|-M}ҫɚEӭ˴v8FZYH=Ɇv߷s5k-2zV0kԘ xn—?MՑlk3wbs{%eIka_vqZars R;;#߅I3xLZlL;u৔|gԁ)mض B!78Kxݎ2c!2{M8=#tgSF7#i,oĬ5f6HO_eux^͗[iR7 x A"VR嶹w.!j5Kbo+6Ka?sf9k9G!o` =K'2yC Ⱥ [ܹ-j=}{1{s?)z>(򹪁i+0B#PQF!k4j};-iZ6:\lOWK-> ,,pbWtO w;-w rC$=F <|)s[ñ7?j(7xv]f m5l}1 t5fžJ>V򷂴#x B 9ݷֳ ӂzmc"U@MmEz:8O|۾*F*.?U(X*JDD)KJ(Xw[ +xaPϖ ,ggS=3;ZJ9xulL#ŷ irQr&GER Ϩ)|bE*z}RRr謒rZXXzL,'Mo'l0VsK{.TNzDzZcIhXST2WN>C 4dH= J^Jn_lPF93TWG:ڤ\νKud ZnvSD#g=c2m &&kQ%fۣeqe6*UҮWz,^)()z%1 Ir䗕|SGkY`9""gܶ98,j>DkczWW.Pjv[ˣ\Y!)12J'1$8U2qo`rn87r| o Yy أL,? }t7k/tfHN϶t.f1X +6 Z!7WSx. \4}02HëWiF4vLdvODMD$%% ;x $(#I$Nb^@2:d% |ܘ̢dlMt]23MRXpN6*9U 藈ۢDL$R$$H¶<$^,L"_Ozd4'brL3qGCY~#Tw1'/(y\ƳfS< _Ɠ8i $Pq"GxuY_Ϡ㑩c˧̞՝Iq x`>!ed''[ʥBʵ~Dc7_$ N6]}7EAbw0n#BLPc0KI"!Pp5,!k'f3:; 5о JW!6 aG/vti7So,í7>|5k'rYԟ(pU WjnPHꏁdN bg/N&`7}i>K@?7k.,N7zީu#^by/NI?i[HJpǂM?J,q%q;_/`zBUҷ[.dF@?wm+94Y:/9!ȉc$̊~ZQԁ;0{kzؐab7ܳcAw Ls |,xzς/MКk6L{n=1ؗ9R ;c*]܍e.%h?CfÜSD Ĵ=/y%c2I(k`Eј/6&le¸v04zSk͸e{OSՒVP܁Xt _l)|vʁkN^L.w ̵<ΖZ{ؘŃMlBd2)]7ڜ 淋!+d_3GPuڀ= 7bU#܏3f !fɌփzgANt+"eWY8Ŗ[{r`'G:3t=kVa߬`~΀I+ mi3cZlMH9cŠzbx^͖_TWUPAޫ4i# |)X(V 00}T Įh5Qc^F YgֳgNdZZVj a{ LJ9lY>6y t1pMψsH4p5_z"AosOLzvSQϥ =414y3BwB&uX1pRϷ)zO)ަ᚞ c<0L_zrY:֙}f|Kai@R`wFhܤg0JG=G騊qEǭ&-<iyGz6n6-]tL\[ۛZj-+4pSVn ggz~7yG_u7x/pl}c: 獵鋎tёxX˥d-Yh٠{i?hx |>jٱ_IN"-fZ>h"[eX-a:vqb: ZO e{P0K\6iY>X}Z~oXCbZΧi(ul+ &R5l쬡Gý,5^L-ZN7՘i0+4!X`邮 jh2⽚ES4 j~aS|/Sc./S,OMc)ܟf-g6" 6%T)4<۠a΂O: 뮫V]5ݾS󶏊` _Uuj,/Y0m5̺K!N"^EIO|@u99CU*g[JUPMWP-s ǟ(j5XTv0J&mWqTWJ=`])4jHUFLŰ%)-5<U,!(q-'w:%`0SƆ &@9|XX&Jvu]37 FW]SNyߔSPP߯mZNr[s2 IjG[)=+XvINEm_R*JYCEc\)kU{2~Pڏ aȷZYFVZ)_L|VM 5N /eF[|7^)]2 u2N9'#"E cpIYW$'yF#*KxVYt'neL,#~| oX("=JxAN&>J$g2'd<.D9AA2usD--&b~rJB&r)ud/."R)%Wf%mHTFfÚY؎+|4bԡ|-=7/dx#gLVި"Ky*/&{)}p1^LgYNwY̏ gz#/(B>v*Ӆ">.VPf#cKn΃|_d|:<ܫd:Wqrdgh:&OTr./Blz.xP30랏|Z.fٴ(v[g i_D (VPN*DS!ry옇Nt:&}3&c4}T>;ߟN]DH&17ʚ9ͯKf"\Yf1lڴv} F#ng,ִ~dB6a$ʡz^6m㳹6*L^>IT g%㑎Ϥ_:Q oHxb?aй64#9p.Gd$҆f7e.Mg,Lʳ,_ʦ>& 2ټe3O8nXG \{itܥcp=2É5ҡ9웒 y@OaRxx>ůR1S9jI }՟Q!ddd:k,S}oyB:Fs(nxphn' \Wd>I.&~.tIdS"YH@T"ةO2В_8s~ϓؚD$Ck}i%[yHҨZ4KCqhkc=cyv3|ۖXb:q:q1'8NrjHq?q}GE<5dz)AbMdBC c{47¸Fƒ0:eS;ᬖiW߄0Jzk $d͗bc%HKP#oB`S@* l b_A W8ڄB±w!T0^ZB)LVJh&N.A7Fc1.lHxc W{ n 3 aHLz͟Ĵ$fO^ԦB~i D-!lF (6?PPEQAs?w{y|ɟ] V1vHy)'1{q"/`~G?SpՏ*{u"?2'N}Z; f^FLJL91[ExX' ЮCX,`V{;//D͖^yf7fvp˗|t~8((e#|֏T"qi"aɹ.8%v/piޗۗ KC7'iΧ+RLwLcw%L}e/,DE\)d'ꅞlv&ɋq=yzœMҝAWB|r]88ޕܻecN>w*{Qx;^|OL$ Oآr2ٞ8Xw'X.,<>lwnׁ}+厬g8g8{ OFڍ_ܸvНG=;Ozҿ1|}wD37ʝTw& Ϛ\yԍ"ƈm(0'cfԑѝXO nBS>BC3Os,,ْ[o8bñCsm:bڙ^ަ҅vZ3ow_sr-xjlEBkڰGm>9b]O7q{oFD 2,щfBSFwa׿f׍Q[ɂj+/1+˞ x^͗[i*U{G (JTQJ"N3砉-j,]jT4ĮѨĆ؍Ɗ$DsO|{]3ctTaWÝz.3z .z>aawM 8i@>wݣ\yQVCo"?= \2wcz[2`UPC 54=Xzv \ᾞEj6P[$ ^Dד2+zLѳ܀Yk0'lo%qJ $3pkK\?FϮ^6PP+Pd'z*Lt,R1^")0;V%"M?J:gPȤ3t 2`sA4 "GzHm/#ދlh)wc'wțu"S抜'[8#PãY:OtX)=#lWF"Ozq9zf9!#q)r!uvy2Cd`'^_\NµLdzLVGEkxWK`oFcI{"b{ ):9# 1"8$ՑmHcY:f0Gǡ=t|:WKX\zXG'&>zeJ$퐆5R5:ƾאOG.-Fh5O1oZ$Ih#l@Rv:;nxD (_@BZ~} 0kl*H+yI>@m::/IZz DM2SoZ7k_Cz  oQ."ҸSÞ,-K6i QSsz5#zJ51&Dp{lv]sO` +9ĿA'j܏(ۣaB 3WyIA3Ul_EF [[՘hT_>j;jFC)ReQ? <;)0>POF`<|^CL jbGyjzT WHPM%{TnVnF.w* kSD{ZO#iU!RRj<2 ?Z Ì%}fgk ߥ@Yɟk|PqmJer>gKy ;NJ|*ث1_AZ9;gz CkSe>nj6 ♆pLCj '3<ޮ5GAUr~S\D4M RgTIwr^2&5kݔEi#o)NSQLYŎr~Wt)3\ (%+7UiTDΗ8CUJݔq,GyJZd&M$Qř*+|jh,VS[uNY?Ub$>biKTdV4Gj9b9s\UV&u|_Mai2"$]Jt3 Ȩj"xvHާKJ%߬dQ:O5+q杴dX1*G(`r2ϔcreu &W.PE׌0E1^9U/V% byW2y%-_m:񶼚춪"A5Ut~:TPI*ݪX~@nj*6}fwKKe.r}1mSq1ݛVXHBn.m oNJVRۻ1_󺥒wpʸR;7+atOQŘo c |OK5 Td!%7-y|zXBY.]!qdM>n*7bտߒ+Ȩmۨ|t pFLctJhϩqhyޟH ؝i!<t}.7/0aX\EьfdXFsj$ I4HRJpںPW!VH==Kr?S:[y:L >%E䳠G!zg.F՚bE\oIz ù"C(jeJt//?d%sfsC3fN*oRY6>RJT涥Rn14웙lPfhd>عi$gG8sՃ607SkFμT=NE~''R֐ʴTFƐ ҅d,$'6L ;bRȯJ,IaޤtB}Ud7eh Hփe),I=Hd4InLd^LV[2[IW ) B݌s2ЕnTƐݨ5N$c"!CKuq":a"$$EyI H<~gpr%qh}u®]}ZWZvd74u#,<DDfO$. 5.&ztaw<Ә٬x柊E<{x hO`\mf[H¡+^&%ە)w}SMcdx,IϐQωxOIQt*nhJg(1FPx,Gc/X<[b86㰛G8+z4iq<݅Ϗc)(z=-h6F+Y b*-^$ pn\k7FҙI5hHFrn_g"<Q VF1gV죙MMJ4Dmh\)smr8=7j8y#0#s:qߙH̕.rN0'T$aC9?a;ƥpvA8?o g΅p.FG`L'#$GkRg$ %x0m N ·v <3P2S(?w1j?5&N`{=Y4 bFauc.}R(֡,Є쾄/ C9YůBƪ#]MO?\b iģAZ̪%HfoaZC$_7JG?k,wsbpMiYu/my K ndFڵ@M vey͉8VAteW?:.cv?kY,5~lA' =sғ#˼X˛4|KF/*:[TڏSi/Mzq硅%i'9s=˅.$v%+r77v#E㎥.{P;Ó7^dƇAξhGm,|HIA͙m>ַ݈tsh \xʛ(rw`a;[ȻGz:q͉pɕ =>ϓq X>b>=Lу Oܟl8?s@/#wN w&3g וnz-ٲ8ӎoXQ։$4CLG9Qfg=s ;ʓKpAk;qGް*_WZY5 mezkDa_J %YYlQĒB?S"ά$U^DĖtwt:p#eqb@Tüu$5Efؑ# Wی>{t+‹];2j +gJWXQK nTVFAl$X*:6jb|uGICtEbȫOD֩^hz^ƺ]jyxT/4i Վ:k]VA|sNdxl.H(dbʨ]F Nf^,H<; V*CʢUa٤&f;BrHK:eS{u_?%qP3dpVU(iID"m_W<:+u䷹hgQ-eu|=U@"v Z9F h-A-J.E`9YLƶ.¤0ډ~}ϯ恶ؒJ)lNO`a 7IQU*٪p];q ]~wg,E&97.i4yۦ,fM.] HKeTŁZ>?H+zWJpH=&٩r Q-ǬX"QVG[rup(&V]TEvb#76GHnEUXg)T /WQl,島jm!ɐW1$귐=5K*Bk0=.4sT{F0kk+ZY V** C3U717atI gw$ c=+_ʖt$8'i1Q2zW1ڿ!n#X"bٟ= O N,SJumRTšj-%9;H*1خ8MpٞƏ3|GrRIR\uLk"ysŷrM>y|ʋ9}cKjHX8T;@gz1i=rA:HGsSfK p RtZ>%l<%TJkQzy{+U>o29<,s~9>5[X&n^=oĉ$}gvͶqwEyq,Wa}̷b?:C xeBd[˙Vö kq ?Tu1iGmJ,ȣhUs(c/qb%PjͦuG] ~4)_MVg)eihs:c̡OY #d]C6ەPWQ=o9;.,:j>s<@ELNtkgNBEe/^\qRW3wRWYE>Ӊ Z)D? % l6>Ɨv i=%6flҾY5?k)3x|˜Zc+]|8{qX%ew&-,㇟>~^Exϖ]ÆNlq\D]fo|^`E?ؕ'{>d^yԘgH <'",Zjھ<Ĝ#N%c7 )W딉S.1r_[&&"INFE*I@Q4*bPcnL.c0w@J";]|Zc S'=6R|3mȝo/'4k8S˜ǿ,+B.>%s'}&ߟa ͣD>'zCXҭihYz^#JĪ(~sLB٘, 1L9J뼿"fyYc`qvXX=o65Kav2{3X%̯B\# ^;6؋y<hF$1XC" DN .mUDT\4n]· ?a82IU~_Lqtg )x^{X?tP1[1 5!,l#bN9̘Ӝf!ITH)TRR't>ӯ\w6^}t7X"6X9٬ luBiXpVE(;&8q0?PP!,D}@1[U]!8aX,kdDYt~ blGa$Y) T~KC<[8r3VLFD/' b4E$FElOWUMR]^Mq0@]4Pu- uoFnhf~+iЁcVeDlY!1+>b]ZTM̚ZNê3i33ٯwBeyDV Ԓ{+ "+KI: #~bP0@șk_e2ΆүBZ6IIDY Xeׁk`.#4DPk.!=֩bTu2vaɄ\X@A|sNQا,j ajb_W?@~\])7JXWRSf^#3eJk=Ґ&~tHFϭ  (vh ٧H-3X4o8t{yq2^V|sU^0#2)XKܾ@?޷!?gc5]mĺ :h9.m9$bIp .i)GT}ӣhn ҘYLva<ӃJqի`x}5`sk%I>g68dy. QĆׯ`LoB۩^+ޖBH^+#R~T9T^2=$X0ˬ=LAc!l0BSY5FCG+$;<;Ҷ,B&^Lq9C/Tј_g lù6Ɋly8@5:`% X {"V=BU1m~t~æy ɖռ,RH\Fux:<$)'4B20|É[ԥ4f:~pk┤ .J?=}_<=Fx(Ñ3Q g3d"dKU.=lKì!( cj[Ϯ$Lds0)R _RIZ~D6n)eV7y @҃uKN8"9䒙RӘ<x:a[y91a oLx#Fox,]ίR"Ѩ$GZKk}:'G}z Eѵ>p~"H'o%e hxbMN/ = bG( #HU<)#ML#4u۟yϟJYPɤuysڙQFJ:z&K2n\`*j0;obyԞϟ'^βݞdr3~t dRm3h pr4;gCSUK\F*.e݊NGȼFݨ@ _apmS PƽwWWIy -^R[BHh3? 8dʓ8;1Ve1/0a>ҵ~rmDtoxua.7\GțQ3D/.GEfj߾\.kw~gMn0Q2MÚxΦ$h|ͳI^@~E1G+HVHnfW+<=ܑFsט[F- d‘ԤuQ։D3f9ny2a. apdb:M),~,2>Fx-j-O]㋬pteLZŋsJDk\mwd3MDm/S0F`}~Ȍaibqw?|(Yֲ&<=Wa=V\Ds+{x~Z2rl{ȑDgrgH 7";eL$q%Sf2) Ikd^,ٛ|ټ"J$ Fmk.)cE-۝*vauF;y0y{UT2SQƚ f9Ns{t.ap_'cNܥobaߋȚ^uθwgH4u?3tȥ[ҙ /!ɵ{O$^spebopX`޻lzqwҋ ~< xA8+%log˱%bZ͆7O2R9,y)H\nCs.NE9֚s5K6yךvxԽFI˛|S%tyɴ">)usV3+?a9j_ey-/2ULr<2EA Bi j>{9xiI_Nu K߼g'Xl{)&v1Sp@9XBk CM Wݣdn4T P0y3O3!Sst-l޼mGczݧ#W]` [7|BCE$Y9\؞,V-R 3G} m4H6LL|`s#{7&KD"Ѽ܂3=%fXQhrC4}ZZڄNt-kƭWn~EDu>ڥhW#L|Ǫ_i_f[~ nE?ex(ErT7)G8N?w~qϰ˛?͇hEK!x rʠ<,xKװ_sV֫O,8q2wͻ{H e4m 4MJcQ6z 9\=3*ԯk.]e9z{d4 6{,t52d}!7G1R!CΦ1I6)gWz-gؼo sXͮOqvj~yѭ[:[MgPfRe`+5 ,VwhHB1I?aNA.c1°5hccӭ|-;8Q;OF[t"nL.y{ |#3|@U2c2&܎vK7[uR< ߠx^w\eٲEP:23M4r`q,\8B++Ü(""" ʔlaz}_:y~TS G׆ tŶC~khIT+uƩ9-a@9$/ "F0Uچ*bAb]U񺾺8!i#tčCD&=1p/6+hbutQ^bFM1a?X"g5a#'-lnli1ϙڃ[91a+DVe"MUjb qP^KvJu0weJQ LUDq ]Mybd#: CŸ5Tm:N@œFI1;¼m<Ȟn~Nɉj5sXQW:UlUaS&z!o,V,"늘5(ײFUQD) -*"hjQvY"YK6Xw"z:%<+,c -1`]Bgw;Y9Q9MNtʋţ¦^E -QMѷP[7֣uŦLO*eORGyqE!],fy45-v눢<&ksq)XR¹2v˺Ju4424RʨVnfu#}LNX ;6eI 13BMjZ"YEGEa<2GٷlUDɇ*bݧbx)z6hpR6V[)Up<́B)A /gt<2l\Jg+ ;YȏuEW$RL4Dr-1WK[IslU<0ʺ.ޔ!bce"w5U]P'tֵ1Ri~ciogL\Qܢb,B%54n@53&cvwYrblaOIHd0jWz5_aq.fv\j琇,V-}deK5Qv)c*,thnj$ĭY`3ag₢X".تm=FU)cH)_Ok}+aTND(rWq~yynz zqL`>F`y+s(.% qq3h>B?[OʋJ"iHXrwy%bوU+S!2OyKQ,PrTPg^L{Ų5&M@Fϙ4,ɲ<,g1xRG)mxyvI?UEGU^`>i}U5tW¬Z9!R+.Fo>P .!.|u(ޱXMb-0g{6啎kK9[ɡuĪIɍk$7eqw*{SI#TUcVÁʰK](|O^ɼ?yfy}VʼnpFǘO>({v~%[ɖu HijGϩ 9OA,U˝s$R j6eRkFQu7)SsɌ]<_ TMط=㋱LlMөl[\|/2۲3L@;`SNlsV9,aߒ<?mru"E3{6]O<]6{s@ɟBrv1,[ȠPA1nIRzY#OwRpo9ơ؞H曠'TVoO,$گq3#Ӕp㬝ەxc/Ud,,F%pd^*3 fgL+csB5kk, ,Q)Lr[MF\͢?DƮ8[|{ד%3``c$%Y'r{IS+dk-AR"ڱ롲#OJTe/uEW0[_V}RF.́?P{*]B;5ǰP>]vbv6&h&d{"% ¨'mM[! <1Nuo6:K*a~XNʕ-ë/vA)ȸ;vl!|x$sıky2T38.pcMn'oya~SO5+OɿWrjYl̵Zf02MW٨bp|!-#hɉAqQ6>> `ny#Fb.gѰ2iZ1fm-Hi?1m3]dM{\JPw'u]cUl #™'X&òSF%&l~C^`veE0ncz }YL㩤Qjb+Nb\lexLs;o#PghBpДPdٝ~fi/59or/%v|KDWs**Oi`ϱֿy=?|~>Ş1ڝ6y/Կgn0~ WRQEC//EQK.$H df׫ȩtI8[+0W#'wYsV.sr.7Þ dN#9{Yfɑ\t+Y||7םcXϺ'TD26}i4X~~3.?aqhWl~>|ؤCny"YOOYYDBt%Nu'7x}oRY&2/ƭBz~Y;FVWH.rw{1>vN!LuB$E:&QAݠ767tкqpf=fsv YĦaBCm~D5uϳJi/' (~*1r-; l\[m 9Bgc}8ZL /$Ɲcpe':B&z}w^jŠHuع1J ;g!ެ~'Rc\0}pZcF9ꈟڂZ~\hѴ.x>zi< 9[Ov ~$Y2+9xYNjq'Y 3,g:yL' ?)3,q8EiWpsy!*ؠ@i{ sGM8Ob٘,$DE\I')GBq-3v&؟?v z_-ƨ&c¨;ó$fg^j 4ǝ^X%gS{eag"0Y5 ^QV#kyc] <ĄmD cC?GWc'c[Rʎl#bn›xY1T IXrҊjސl'?Q0Pp$oa6_Zr7&lܔJl̢ oƱx^wXU(3r7d,-ÕHK^+LEQA2٠LAd^u^o?}9ܿsGmKCӻCmuy1(I?,vT@qwHi,S] "1B"j~Z܉g?E.wHDV9qn|ZQhS*75`&[ZX]?$PqJ"n Ah, Tqv+Uqk~."ÄfU53R]mfm!6U]xi?e^VtJD9⚾P/PԶYLz˵Z hcamߙucr㨼( 3NY؅ gUŃb]51bBGN2d[WFkxwH;4Iצ&fM;] ?)+'N/.!5ϩjGqS|…c "y}aM^tw+yJXub*r*3"]bJX3+xٷjVGgR4ڟ:hM[Pk>EH>sJVA3R6F./F"t䅆H;O/VK euO]̝X6s2'%YTM*L.'ULaaD=bk`Y*`WD{rYܦ"ʗ2*-%Q^NݓgDE%Q, oBz47'TJ̴f|g..hM1JY[|E=[+0;C8w#KGB+įUXH[ASdKryqJMIW.>SoQ$(zLth>Gpۂ 1nc^q'LAc:KBD 7j`f"e5qO7$b)y1OQM'Nn ?Qy;c8z6Hx~̤oޔ^Ķag<<`p?Y;7)(fәgy:S϶2:7A]l|K*yq硢XO =2 X,"i׏!8ꩨdzd#VP6Y?`O걼o=t.g`r'[̉+a;:US)[Yܿ5'g*ӧ f08G8p% ק?S,gv{[9"Gޱ mZӨkb|d rkuʸ]|7Y"wˋG)㙻އƋ?[Lo۾">aaqGcABPpܟʸ[v#~¿Gq&o_cńUVêT)ɭ瑌MLՓHkOV3bX8'"ewC:wb%"wb̖4fa%39͂bj6TZvlΓ6etӾ[N ~"7&8ЃoBg NsFaFPNg$JV1iX *;_sM˂ؘ =~̝Nun*s܂d`Ovm42]+/{rdAIW S'B]k&y"ZSRm{a>W6ΊY۰dMi;qp+ڕۼɟOEr0́pg"Sӈ EľUɽD09f+X͵b&Fd֗ki)O,8Nvv7pwbwN@~Ʈ/Y&̈́VƩ 5;HиX0fX6cJ$m~)MC~ #,bkÑs|~ϙW=AL0d%2'E۹F2Pjyi Cu̴(2M۱w#珹1F.҂f, O`A %X[G[95]mh#ޖ?ɜ oǙ܎]<&:ɐ~E&Ʊhw'bAjy5/fyޛ}zE} 4TɌ?Lk##)Q񀟭$7q;KZj|%OM'6'Ա{<ȿdȗMd3k[h7?/ `04@Tjz1VQkրk%v>Vܵ~r9[&\cz `.?ت޲(VOgiK2VfG!'*\Qyd7 I!uY~u X?ef0"~&}~Oes[p9_Oxf 9\GWiG iJN%3U쐾Ȩ(76j#zG \,;QΡ白O6aTZ_v&6s^Jlv]܄.>ɒ6~F&tI"T/SY:j8}Åolg/ֆt|̌0B )QuyO`x^eXŮ6M77uǩcN5Qgn:kvNE EHnA|syѽ*~>bsmaO\ * b 1FI3Yi/'L|0],r=UĘU_]iٻBH[4Sb\i'b,2f!jp%?#nWQJV~[3緲S *yhC&ɈȊ_oˉ˥c$\>RTŠ£KC?h "ArGE߷bUQ=P]jZjg_1vC?Qsn`F^%+T6uho khM{+uV z8pQF6ʊ~#ŗ7D*"TU8Z=H[Aʢe]/VBVtˉOľJ"whQj"󆦘G-4>,z"^c8W5ojyc_v5sgk5:<2bu~H^8NQ(,8yIC\LKxbQZ;_,x7FXHc`:yQ7UQ* O !:}EnrYcePsx1(] k/ xy4Q(itgu#(#&ȉ5-bYhROTtuFSzG]zMZ/tn@7/ȈɉGĊyJ"rp&B5DZB&XC*#٣I|6[s YRin%Q5,o ۩CмIԊ.uH_^^SJbP8.aI 1<ބɰ66b^d/ˊ[aK?E1>FY-Tzx|_r'qKF49f<70q~12g8^]Z~ >dSgTw5ѷ.ZũFiaJDVl"񼢨TMxުyy m11GqecFB! \[JPrXe-o`7Gl[̵Ίx]sy}*_3*F4p[ڏVuG%arYvX8h+$_> a(_F"{ӈBF *Ih s=POIU /s/Оȶ4Vg`XQHu9+_ĢS0לO'[~6l+p{y{/?+Xqt2JAIJk>dcn2|H kC}qț%3F&u`mWfy= ^ %x+#i-{ÌaE蜮ءy㍙Ŕʖhoǀ&;V9НysaS!dv2bYy8;^# iq()OF09v~4"?Sé0R$Ȟt|bUq٠Q+TSvlRŰÁn|cE|?FB4bYo,nN|-ՖWK7' ):5Oe*Yj9X FogsKi^e KXo=z/AG`s[®YXjWC{V_xF(i_%(Kxxxs}զyG]kD۸b7~F'qv4EdCqmCbsnDZμVl/aA ~ ,1̠a _+wX mdVȲ@zQ=OߢgT?8*D uq7e-z ȸ9И@0dc9swco <:čL`-iv uv%A$IgfR, }X|ċʝOJ(VErP|R 4wjϽcĢȑr$ .s5LJ@DCBL:譺7ٿI{VOR.s+ h.cC:iI9[ʲ*74'O X;^ayt$6-_vZ r\'YߜMRmC} 3a?{Cx9z?ou^ &]ag+uf7y0l0DVKk YyҼ70/2ϩ>@e7~@6XުnUL7/ zYѼ dpWKHwk 79wƻP*hwkS1<ĶQYLLl5M<+`KfA,Qᐺ?0rbCe2wunM4{xH]'EO.UnytRZvPO;'7}6T&蹣ːAL֔/NTڗ歗旓M?XV͋28ꆡ1ؗAݏ]Փ3lAi&Gm= gG W4.`X'fŽZ Zh>Lq㋋,) `pNp'-웚Ʌ223IoX%;ƌ;#oco4s'%>⥶Kgp)X4S8:Q7po$l }v$;}|M #xnID*ddG\]VGus_֊Qw{ώ"),k2O<,ҁː.,_ M1KA$QQ*"!4Ηbsq;E[ #:uxo.'쮔fJ*UO O+&ien vRiT@}\ E, /ۥ$+|bZr i"hU+;%ɉq_HDQ콥$O)U#Fi -"}HS XqrN 3 e׊Jߩkl70Z3rF[[fuys*̨J\Q6JI=UgW;g^2YVEJSEa(Z"BU5ޢmd#:qQ.Oc\صŴ*M)+ |X{?񟤣әJ±t>e,v)_QO٥(IY#W-uh$aY+ZMUzޯn5 'NFPPjCe U1CKD';bN~&[><~Zlbtij7]ɰ:38s! [NΗͶ[ʈկDگ*hAݠrpKS?)Uo=CG>D[?v(2#2$6?{=Z1|1$šev1oWn׫1g[C3! 1CQ(ᡩpsXZv~0wH}p6v"4nLZ9(,c,z/eJ䡧 7%Qю*vQpzs+q(bHII4|VK XV[?tciA{nf8Ge-am,EkP0}BK:59Yr74:4v,s^|vQI-41X^0+c3gwq1䝖>O~C2_epvkK \jsʶ7zkA5lɲbHfU)`8pS6rwaF ee=y5ʘLF1̾YȔ-o`9$[Q"~c%Y n8nhq묏t`dt"lW5V =z\=SV{_಺+1F){oY0 *ojB 7>Ƒq|7OiGztn _Fj;{ַm?C&=G9&\Uu *;kΰGl]ZÂsȿXh9}ͪ?,)e\b5Imod?KlI.[G9Xv;K`_s;g'̒BJsMAy5,N͗{Cci #=|YQ{&ͷXKt2>fߤTe9e\_^ÂƷ7s?_iEH f+f{ϒቲ=}̙swTHj "{u!&sUbq5W5_:eʝii|3l/j5MMT}s+&,~fEYn+e|d]Oʻ :UdN]̰zsF/9 e4w3Jq=k_!pqufؘYSj.Y+ 1oSQ~MBIYثDEv1=ex-\ v_]ѯ ]uu[M/xF3B[vϯNIzS+ =_ϮxXF)ky}_I"G.8o0iG|д ¾,ٻD,NG=/ jv;Ѹ[~HR{lʬ6nsd-w:};0e3a#.'vS ;Wš*F4yg_Nx^yT7IIk̐kƠ}SDZ| m*J]Z!ᜯ;?s?s}=^%*85atB]lsjM=ʼnĄVm!zBmkOTYM{iG;^MrF^VEQ0QTvj"X^Cn!j4Z"RE[눸⍲(^+>߯(SD񩋪.fEkSMaStR]SO\,b?id&LZx@]W,,ke6^ DzN02VwTİ jbS!>_^ c+Į"QAڡ$TTD/hZ.C5ŜcZb mޢH[[UWW]|=L}R* ^qvh-8r"I^ڨ(jįgTp,UzU{eR-S]G\ZFԲE7ErXf$4窈!j uCS;:B~OJaVFr*#+TFe ԡj6f.Ji\Jشvt8FN2E]0&~STĪN5aCT)$Ģ^|='L!msҤȪ)gw#j+F\n+ ڨrBѻZQ|PY*}ԅEB[+4pk]3/9~Ŀ*J*7JM|_C8)Zj FI1|MAm.s3{Eh..Z9 |󤚏k| [qJ>B^^8)%1IETUʥT\bf-% oV*ex7bv,^vRw_LaV2 ,{6>3FC =; ~OkRRzPMmAkv𲯼 D袸`XyJ" qq$mcr@!#ZAv5A6ѕDV~ĸ4?j 8;T`,FX'>݊Yav?_I\?/"29_?J@e,ұB~(RT6?kzKT"DJRqysszʰ'Ŝ(|N\n5c#eom<5xj7J1ϟcοf> 2$NZZ3 \n^/Z)V043^Ghl0:=3&|tͺ5$~op`ܟx<NI^޽ER?#4e|9Ie?ĥ$3ŹL. MVmW,lChKMS9r[B1;KVm̨)tG@yOB19G|[S i1bO)d߼2ު[ D͆ ?Lje;{M!Vw }zl{Xlt)JPvmfɔ;R'ޑ8Ώ%, ߰4=<%^/=]~iȝPAj)na^y8..fm!4iѯz5s3iXכWq628&X;$sWX3ov)A#4NN$IbiY̴>Y>%2?Q:JTL?/y.2{=qN&_C U9!X6(|lHesLtKr L-{+u &0~%5TFK2v qE=Vi aM;/yi IXDpU~\`3NGxҐ<|U5*Y40sD+4_u;ר2$6kh>(>D l֝]0ݑJb%Xjtr`"`Se(HK&-rVps{#M|tc+jtmIgnݻꃷ Y#pڪd\bpsla~o`ۣXdim)#n o$ax9E fH[Ჹi.Gbm\iNv{Dzy6?goMce6)s 02)+mOiůte8 0;k0>8-ogEFq"0}<1Ϳ3AbV$0I)I#rucB  爰clKLiF{4q=KջX{c7OpR Jgmd TNZNܖݜ/oǸ.pC2$+Ylü;l{#$_CoJ\NdTI:Ɵ2hh7Rz|lY{\Pd-F bU8-1l/c^㜊 6=P̈f$TC3%lV1e3~/yK?ԹvT;*n0:E XtR.0LŁcWvՊ@tÙ0$f?G<6P%u7Ulevn0kc{󤏼%/G]eoccrbcJ.{).hW3U#ŭjZN­RT%_)K#Pm{ដ"U5e2Meb=3 &-[F_& bx,F"ԝTQx1hG}-늋}ENxGXk)gFΗ5Q+em 6R?^5sa?, UaY/U5xGøfF'6![$gɽS5Յx-4'^}~S)o*A~)SI@vw^Kz}Մ&_[K7yX,;1*1 JVPz|51:vU+ eqSU8 xHSL+%stDaO,/pT eeJ,leX ܫQZWD <_M+F.FȦ^b||t2J:,ss?]|=YKx-)$kj;ik@O6p.O16e)Um(c:lAl+u򕗢{VYd{"bЮ_c" 8*ɩ,XNCd&r ϧW C\SêqlRNʒ<9O,L1 d&BYNS{}^ Oi@`2=盽O{Z})h` kҴ92hQ]rOSTDԙh$8`Zc͡ৣQw?SaeeA4<(8*(r+|Mi Z͗̐r}+zlVݣ}4BIFc?~??&%+naNNW ?V?nfbmG=ee0քbkޏ^Aj* b"+ʹR,V "[ݦ T ]}8~ 6j%=a3|`c/R܌pyc\ [Nx\TRȢ|/ oKB#Fm;~|:n3':oCqSe`#6l+[FDXMާuC4 rqw bKv86Y<~%痵mfk7;vwb%~$5c} 8xgRw.V頧$b(}SN"4]ƻU)˫ɉ'>jIduT5olQʓ9՘miΧK_\~g:Ӯ͍-wP%MOH &# 1 1NG,b]90yE϶u{#AW1*ҫ_w`%7k.c']ssO|1*zO1Gyv%1 sOfLzc*ż 0hR㤞[_+VqMROkOgΑONLwd*"mnػ81z/>2RY|.)c|\o6vY|=#St3 MEZgk5g]ێNV.vdy<{6ܣD{ E6T\zǍ RDUb%#뻬zgnzORY$E,gVZ)OM=ݱRDVⴶ[?Hqોqvυ8@/IʲyQߌ^3>dsQ> 3K9XM^kX?fHp!seS-o-$VbU=OC/s֟ ;~!dމ N#/L$΄˹4,'7n5{F]~.cXM[Xaҁ'HIs=${Q0FWp<{P_A5=2kT*e*6vq'ȝgAiLab~=M0?j6?dxt$3e&g ذ_O`h9I ~]Zg~ p')dKI93 Wyd=>^BXI IQJ O<(5l*"gkW7i:R l9q5}mZŇ;p/A9uJ:5_Ipj2}oea_UȡDW?dxٔ^l-{dx \b|yF:ן+iYhTHd\`*MrgPB~x9$: S^_d͔R[FK WÝ[x)ω1aF+a&r)r}WU<12u8N+"cKVXepyN8[Ğ~WN#"Tc-['yY V_#U8w #K46%ixbRBc5owN/I@kH*GD.Lvv%ΎBg7 Y8@EIٓΆ<⇕h&cGp9Ey-a~Urk#0vSv|q){]ȕ6>(G>‘a# 12JuqoʤnlP#f+] ϑ2*\56㽇LHX;hx'q< vG5\5=ӫ%wJGR$2V6>W{*cGTוq',jg2|9"AsZY]|7)YwCA\.}w^+j/GnȓI 1\$)ltYQzf۵x^wxg UEV[hj"w*Ԩ," $I$Ȓ#{-DCqzys\}_rB^WFJye^4H4UgF 7DD#w2ʪGy1nFnaݡ^f1H=+%rOKs2"ZV y1GQX+k*Q{4E+%dTeD!Y1[N4 &:+ I[A}ҡ&2 ٚb*6 #[ʈ%ٲikJ]L<ö\ o&-ƜˊS兞Z]I{( OUY(9.{ RRd讓mJQS *BOUot4Cč"ڴUOĮtn62LZh-iGu6v}KrKϤmb= fQyIAMtYaE=hKgk>.'l)㏔Dp8"D\S̋g P֣*k]GDt+G`^%SIFI iY+Uİ]חfDڅVl;/p\Ktiqs#/&6)J%s8AMPS7b~z˰+G]95̫9={| CN'P])$+#*eC踬(&xT2կiQx)4t+[; ONJo5ANȯT$*vJ]_U4 x~q.zLyY"y&Z,}Z]{~ߕ˴dOŞ[b<46Dz06=2*ȱyR˹"" JaX3j0ldVDTкU#:04BJp/gA5&hb{ckvtc>)1IF\A^,WjcbP#nC>LE;u^&=' i[X/8V6|B{~htve㒒l(fLz:UlCx78_+%DJ|R%#ɿƬK# +b;;D&0W? ;)ǨKY9G1 sy35/ٵpKA$3V+6Yֻ4cېѐi}N~ui L_кIJ,$(PϢC[R_[ [̮a8} &ޗ2#4%QܔƠcl #cKͩ`ZNlx۴^O1i'JS_L%rf_ VE ,Jva fp"-d1ŰuH|`Jcu•y*Rw#M:*$4VȡDY> ێ{ěx1?shO7cITe3 5Ÿ=ҾFRZԎ叽}6S,m&6;s;S|X@@+ԣ86X>Bfc)G~vOgxO}K"2xD>J'47B)aJNԱȭ':Y9 ̶DmVv|W7zC1]J~\۟yLrWePp$@”oEB{χIZw%y&U0.yeTV#13}g_1c9< 1ʼn116 aDCkZn1lw9u dN dbc(Sy/RgM]qKUuj!f_RM)k̹cm=˜[Α &#y't|Ιf{5zoy~?e¯L%dN᷷ԁ\Xӯљה(S9?EWثiBҿI&܁3.xyџ1\s4f#,j*Y@Wm˳L \e)lԹ]-o,KB,U鯸HW< M`R se87~C]숣)3 2暇\.H99V29߱v93{7#3>s*qEK)̌pOң=+'y}(EsdORJ#F{l2-jā3k!pPsKz.yC7eO\/YSaz ޳ߎr#m/g+s:/YG6& X*7?gcn Y}*oyya(_{tT"[Ìy<ߌj֬vw Pו6o iv gÆ8MI&:|?\'<Vyٓ\oÊ2s._tFǫ:5 H}pǦD[Y5/b>,o*XiWOP?ҝw/qMo@*Lr= *^D5.LϤxˤ67>GCI`tjRs_Ĺr&ס_yڟQU&0$Utˉ/#5ܐ/k_='Btd#sI-"l>JauXZc؉KJoD9\bdϊ}lPt{C,~Չo,|]).Y?aqqQ {ˣ3[H?ʗ8>#{Nyfrdn jf;3{'&iSRO[h;{~f8pIw2э~L^V%bv:Qy5J4 kۆ쿞;,M;c'[IdY Kwi)qS-i{ئ凍f(1 M%Ot橤+Y7R2wlGʋgt?dU .̴c<6Rs>6's;8oA_?#ILn`Wq9S:?ka)ME\qެ^ĨSoyzf $9󌜹I|E¹x0h6dor!-ͧM<؉Yj?V}KɃ{8~+Z#|̯Nodj_'u+UY++?bh*%wǘ6a5;]g`knX6>?'[x^gXW颈bK^"j4Qk"016PQP,(PA{ґ68̏w/{ { *bz7;Q>9JxqOF\Ir⅚>']@:hV*~mGk7͓]>h393_QX~LTRer"B*ct uXЪCDfƺ= ^Y#Z).q>FuC[!0]? &Y[v5d~z,D.K%m& L>O5ύ_үZZtFg6?ݍ/x]~_s2Hg9ڄѸv*\B}jj>} ?c`"\18΄O phH|ƣz6Y{RƎOjIaIJ,0,_*:*3cadakz㉉F2]̓燽ωbA0Ra")v5vq 4D0] r+/%ov|7oʖ=xĒ"=k۱ىfn}Æ@ot%d*UJ2$Qab]h&}Z +@5]1՘)MoXs K{̙EC_-N?LQ$0ܗ h,s\k;y0 %Q1;wq7De!W__D4GC_yL5مEʌ0Np> HF~QGup2Jc)X{Y[M9j  L[?`ÀW)p1],񕳑{n`5*s(2 k8[c ‹GYTU`vA$^g9H[ RZ%N6qq)FtxD-vo% >o1&㤹 l'rH np"b}>XDwz~ lR;8+YQqImy ɟSѾ_~xʩ )x2Ng?avcQ:Mf70Z߁]W=h{KZQI;8q0y'"c?F>=^q %:y.o!%aɌ$Oh>ӽs"eH҉nJ)C#\ރw=Wkt@2Ǖ'p'u ȡ"W";3ڪї LBF".fdyQu׽]bt_# V~D7Ԫ1.u16HgKl̵RK[% }HHD>?HݤYG㎳_q +vh!3G\܈˴?꧄Ѳ"R(m ~g:~<u$dHTHEyu'u LXvO0h%+Y_7&־ơXfbW*4ϫՍQe!Nan2I>Y٦ҹùggWntKw8Qb9O |VI8s8KSy71%LbT{]'1{xڱZޗ4KWy0 !wlɱxND+\za1ptغjf]nbvϖΡq$4R].PUz[#{Ɉrד)'bQ+Y7ޝgĸHJA?hoF-[7ӣ?9x^wPSip[hBi%+ (/b]ˊ. Z`łQ@AEP0 zeo3gιoys23\Ff9b9xMj)l~#]mI{(AƳe!soM#tD|:m.J,ZMdQ@%ԭyCm[ޓVvPAmʤln+toN =;ZNUSrg{6wy;gR{DZקQjv{m; QSJJBoigUZ6>$TJUP|t^LtyZ?R`byTCO7teYܿN{ke=hyLnTWCHZBk7SpRtsM>7-8s:5dPnzx\YǛn4ϒsEO'd!U@K&PrUMN::Sk4^J˔-JҌR^BK˩~5ѱOtz2΂U!9]U5EL̥ET[F-*i[`@bI?jrfe*=2WIϾ%s 骘fuRFf?43J+q]GY*r5˦ф_R'HMFTjs;DfžO4oV 3,'A[qjI9K[-=~BbdV*8(<"'c |P!^)!/TOٟI];{)_XpG=S2:q&7S}t~ Xh P@%TSJ)RI)=zAS%qɪG>O &c0/GtrS+(ՔYKh[ͣNUf&6/U*b/UGT&zGipyV6yԓCckEF7-,_H'4K^vwR@}ŴKY#p| ǕJ"v&:RyTH))&ӟ%`A %$d+b2*^A۵Et|{z<(F[:Drɣ"9 :ʕS",TT=ߑ̉ Ge28£D683%i9TӖZ#v4Δ.}OMpd7\.J`b@қݗtpAO:4jN%% D4e{՚ű7LWǑpWUtLo fu(<ekI_l9طI'_#J{w颋c(2|CquH-Ev7.wYƈJVEj 7AyH?Lt?^tcL'6ҌLQŶRM bo<8( Xu*>TtF]B E,Jk4P!]M4Ą,cd&'K#>LEJL\lC"9+#0V 5N_"~:l<#ylp$Wg NV-,SS4ltU3Q:vv2f) `)!b*Ԁ zq90à ,Q3?f|sSŶ0aIc\3ñXjv*M%PO60^kbrvy"K@e׳σ .64-K4FM>_5Qa^_\UTW@8 M;;-1j rqj(ٰ -*Fz;,wı;xa  쇊@Z =,i1,dX! ÖtWL?o I:BQ[ e9>?vX <~sV `x{vD8~#oU< Kx( D qPN ^$G!^b4ͦX< zlo, c~` ֓ J?Kiu$g~_{$ZBQH—hX 8;SkSa9(#y||pqT0BK#I+ GcHEfF4~6+Lx]*9?m h ÞQ?zx^y8kɖ`h"c7.BGiyUhQJi׉-(K%TRG;92}ݟ<{P46YAts/)r3(nqz>~RJ/Qɇr3A[s}U<&+v6\'d0Bj zȋPCt9'8G/ҬbZ*2E:JS[(I^_f. [P O) b)udOrydRH6)/JWzR|HZim r~K3hm)(qMCG=AOSq9t=--'T~]-lY. wөPI=J1Mn%F+&U\ڦS@u%]AouԹ&аM{ߓz' SŹ x=D`TXe)C[ AUqLՎb(+Â+#jiE9/\C,|sdqPt a**IQC`Ӟ[t6n5 l~NyW3Smiq)W 6 ]PǶHbkd6Rb1{zcP{tòT (%U=}#z3:RX5_[ +ħEC;/SܙHZ y,|J+vPC7;K Pr4V.1 ;WV-ݨ#vB 1vIЊ OH?]{s,ӤXyF_fUi"{(1Xе!a&wɷ5fN-?  3ePP7-f.1`kjZjxژlS3ȧFo%N*>ReJu9GijĂCólTn3!1z[5 ʌDNtҰWtMHʥ x$e 8RZ?U^|m^j>pb?ozK63Dl GISCe=]G)Xb7_=!X€|u0iU=}zX2 S >ͿUGD.&)[HVH3u]M<4)aS˓^;3b 1&mfX$o]Q5б}8D>u}4gr#+<. U;+~ 0b.SU\}̍0bcxZy!X"UApDNd*E0N)c~U/ژ3CNC^ ӌ=1Rxjc5E 5X;q%)_+KUƁpkS&rXƅ2C,13p!tcfoA<;r@XԦ:#4cIԴU'8B23Nh|l0e=As6w#FbQ0~s\?'7p@XZ 07c ("9Y!8اi۽X|YE8Qjwl{~(/₹e~tH۹Z_׼$i,N6V޻rcL3E]9TWYa%DgyP tqq8(r˛bM&N(EH8#'D>Zk3&2lZv逻B8Lg`7 ;ᠲWNxWdx źh}9UNY#)X{xqFR n.ua?vXVJu[F+ 7s^(#s\a4k8gN]f3Y.pP 2ۼ BV- ?\akN'%ᾘ`⏻rA(Z"J+$9 m-dZpDeB_ݐ=L[^P^6jdcAߗvzbz`6?87[C'L"cl?h}>#㌝|;| ^HYH3!n l_ n֗|/ _8@̈Qf.ERX F@E lwz^'sQv9Ebx_鐂_,컕 ŰѬ:$&@K \L77 _c@#Җ'Bs-8lL4|5 8F;,KWN[lǭjD_Wi]'by.La<&+Ј }kf!.(8y arbCtLj~Qؚ2T? gcۑރKF(359)M'a[' -ؕxAbb W f k<Q0{5`t<4B\9cWt-B6ݟoQVދB)V> ~=O5gy&ODmnkѴ;ۯ &G_cj*W1* o㇖ e~e>4 JP zVh).HB4 82N_χ'\Ŧm7P3'I4! ^ujXLlv adHO!Bcj8]lvA[s~"3.,ǐp U! ̃3X +P.-XeW7 OoC,;,J0*uT &WENsU_% ;c = ;m!ƇOI4˄/D݊rXWcZo#6FBN7vpN4Lgm% d]~M^{ G2й!a3Ly7gx3bWwXSs! JhV]uL$}UjٯGjj5hFx[c rb﯀^-~PjF7I^fhy~U)?Oyn'gL6o(D2 9Ni֯:0=vKRd)]%8RWjΣ ^A HpEIQ mQ<5 bxXC(Ee%LfT3bg=O y,wOM ?ut{dzji)pV2' wzUaHw#<_]J-4aBk)urShR+tׯ>Uy-G6KtJ y*1p*qEZK/9@v7SU˭N璬*g؂oбpPi&x1w"gPN'4@sEeHoL 12mX}4A?0鋾{ WbD?ķZH0%Aǃ LSBh0rJՀF|lBXSځ.^48>C8wE=»J`O@NQfPƺw do\qϔU,hX^>\6B7U5F[sTb,36RFht/1j!ⵄ`k3G_c,GG <]BX?{dx@7*qN*uyGڔyǖ fѪ܄/ߘWɊ~6tȷ +娛4RM_!mZWqJJn5\Фm\5A#jؙ0֌Z!\iǠby="G)Sfuut9Em:T"heN_dEuZ%i`}&d ƴgx 㶌Jq`Xs27 ^8x芨^kюnBMSLMNZM5K=F>=i1:}=լ*e! tAn<;T,Ӓ!jвXzSu(+1~ܫAǩZ6}&H>W9㬨ن~"'>]K2S,& P$nvq XcD%'O ucib!9e[lWמy؅G)ɐi3!!CzLΧRg|xp[WSĔwi:ˊ7m8u(ppOfx ㌑~byV_#ҨԈe+LL8l4Cm6N{/=,lŕF6J2G:t-wzP7/d7L AtN1}m^XpOw17Bόs-ĊQ3mxnrdgmpͼѾA6sƤ<ÌYh0_4Kh`Of/?^6c%Ys= sf#GLuaT{w7}W~wş#h['f;z'Ѩ6) <f1):6{zlF&9W#Wĸǃ~c/_MRW`&r~MFX-͆ 4rqwgsW#u93+ѕnjO6zs _kNRi8NL9z>z{w 'Ĺ}WN|e1PFzQ0zgR@gJH. aTtyx/ 0<',9•k}܃ڼ>KJ;dw$x+ϋz>";=Fѡ>͸cAu 9Pz*SHƃR'G$z̵$zR̛> +-uE$f4er`uPq[dn5mdW}k>%όq%U?ɷ8_4?8“Y>5.3ٯgP7MR}76*#x^gTa(Coކ2EDG bAMP $ *c "`QP ""w]+w2?y9fH8DH▋4$*2*?WWBwQ6#q[_FFx8뉻C=Nϯ)b`|1>&I ˌ%G;`1\qе34{\Sȸ[&BcFVݔ>@׍L)<@?yPrdGy_ ie!OQ9 tBqѵԵ6ݧo^>vzKӾ$HL!+gA:-eʉs/ʃR .WNChF{i4 aY!)=H#ł$l`MY,Y)y̟8aj/!y͓YDfSY-D=ޫmd<;)vqեz@?gzKH,"Ҩ>sʎEq dl/PUR;SGw53C+Jސ --`R 0uk~2?x񲊨Ju\ cc Q}7h׃4>fqxV> h|-H|Es Rn ~*G&)2QxYml>ʈTuQԏ! s:[/Ϗ MO!qCZ)ѹP9jc`3DX%l\BVj.|9SY{𺋅mDYP,fuyJ^']_ig$ߔƓ!&&:($:u>|d*f@k\[] n6Lr_ZG:iEyF uKP +؏j|*8-Ѓh7h~U:*4Z;}bIc,g&O!Az'%Gɢsb{F-PbEH::4Ѩ]hcƸ| B71kk!Y-X<;L096=壽{ F'ɠ+? EhrT RG[?hã$Ngc]cxڹh݅ƨ5)Pk|W LrT=9d(b2,רj9 gҴ.3&CN{,6hCm7Bd)4$-B4[Lj/Ӭl2PF/5D뱰T4#Kt@hj5F92,Xhgv7 Mp0;g`S=VZ:c/} 8Zj(hl~u%"7/sp-&{j0'invH8\|lє1Wl@-Dh<  ?l=v;!bC;CE5$LɆ.pvG)Jvamb`A%y-=cQb@){̖rO&x!ck3dVZ ukmq1V:#. H:i~ VOذb}`l#B+`n{F88wvG}wv[Bs}lN'LuEe$^aX>vhVc=[l9=S/3.㬱5n8o?B-8WtdL X>ƢyE^l0S\ kT bu^wn@oߘa|`%pFgWd=P>r7k3ƛ Xaԣ).ZBpf8 jXtX6F5{< {]a莋7>PT {FШNn|з>&cn5١LsrM7ݭ(np1,oA=SESlQ=;al` ipyGj?̽}([cDPuQ|,,H ޷mNG' wǣ> vT'F=;@hN9Շ<m_zX A` q4|_E;p.HV ?)QQ6 VBQ}V&{ps@^h)SYلWPJC0Ղh3+qڷc SAE/ׅCZ# 57C'9`nʨ>뺤;\?07N:>Vm<'> 7Eh8tOS1IZ#+ݡXEGp0Sм0)^ҨN> iUKAPLASIEbhXIN@bfT'Ch*P x^yXyMiM)_) Y.e1c31=2K5HDM)MJ)=wwAy^]$1p 0,KVAkL&VB|j}9$&bF&.h%{|.+08M0;;H,ĖX)>ן㘭)IG,Fo/ɛ%8WD簘7U\+=C(G;>ucn M.) 4*Q[ FMN\()72q"C21N ,5)mP{ ڷW,u7?6ꆷ{.AXЏnf+cDX+{S\)qbyzWf 6 #>sc]aȮnj9H=1T S:̭i#9P-IVu8i0 h h:oă\|VKWXKEjEo橘}3cF^%aS1X3=۱B$b yQ#IUK-|{psKWC`@#tBX~GGH*E Q%wF 1}Pe9^VDӃyB/z+bG{ع/1>p|V7vO%բCZO&鼇ubYk=WQjzAm\"FSyU"mskNn<.έ2QeJ4yr?Y:߸h;K7q!2@3fjԊWlip|rp|%gP:hqasOu]:lj S2iM!#-;ڳMljuY*>byj9FVDÈ6G?o$C*pRmzhem)r3GLu\+,|/2ԇ~j~by2aʵFe̟?[ggĬ&|-gu? %m胶 Oy9ΙL0ࢷ U_$2y7qŏks~)O|+ٶ_О%~gl;ez]TʗEѼeX f,VK|fB%ZRFdž+,מ'91O3W; Ca` eCAD9FTPA4vAl+=(1T!HB H䜵rWa>oRu)Jޗߺ49p H}(!# *_GdS!=xN3iצAR,& X#X=+Iy 9?Lk'`(Uk9nWiCZRDWQvmP@d[z{i{*k&2oM=9j`$d;E?*!D}#U4~g6,=(!MCHݮ=.ϟ4mRh" (^*wP,Db%+Py0D0!-*:Z=+Od'Ź~N"&#!&Seм_& %RKh O<")bY v/L?p חff/k'n'^wT;BkOi⦏7+ADZ8PUz=];Le커x ]VO!Ye$ӎWU%A2ߋo0 e)sSP ;w ?џ p*b4p^V]~2NAj7W"=J-]0e,.VCMtua=sn@0iY?+ *C=|ǺcxEtDi.j!4/ jЄ(]^9z93K릠F氰ggg1c: ʲx<(b٨Z`ҼI`^2X{Lbf1W]/}TSu0`xKĴh dqD6Tfja o28RFhృ9c~|6w>.> ~8`Tk8#%EY0jQBmU@Cj+Մg:w2* #gm%yH/nknA Zflf'fs+b xo`Mr:4ó!}.e"E qo vX倈 oiF"S,C- .(kdD<'`;T=, =+0MB urGBf?&sL\j%_YL|\`vG<邻!BLD9D<38p{ &ùo!~s B jmq{lLsBN+fŻc ѝf~%txXw:⒊ vrz~aJoxdp6Eg1?ͱ- 5lp-@#LW{&&O9KH`%n {;h0"!"?x869=mBW η,؊sOGFQ!{8V+w*k[>/G\vN7\:_(7H"Z&P*,7FX e|=sYkh{B?8l OײG!GrB7 @ܨ^|L\"OH9YqkX/_٣, [ߨvh!8-o!:fŲN_Au:9"U|I-!p$~ `/X>p+:=="ƣx? @SU0, ţ3NxvEl! Z=qO~S} RB0cHxdb+9 g❷;.xaOЯF ?\ S_"p|(t7B4zC<o䋧.!Mbkax{،qJaר=z : \ 7#!eJRQ Bop@:뷅. Qh"qysΨ0vŅc?L D]k0|b~8j~ĹȬBxVf@"}q0[B`ѐEx\&Q"eWhDJ[E6n?q"r*rKC3N"::*pP&~g:.g!;UF+`7-X"YIKicx\*|aEAv*bhs8pt*|Cx^yXKJVڼzEiSDJdlL0492̠8$de-[IhC)M6%:u]\ל3qw?~}_VܐmLC9$g=*Wa‰ۈ)jy0}ގѽ /k(󧬷Ie ~DҘS=GbN`k \,q d2c|TߪN'Hx&v..BR, goQWY:mwn@Sv vuaJ?-e yRba*hoylT<K+48 w",AC{A#Fb7_cI,W tWbt*}Fj=^)GpT<g`!.M}֖ **UA%^i!74ǜ*V\jfCs'{D<](O+y6*2L$)sQ*-ja8uGݍYl|6ޒSF2mkŸsXLݝ]MG_o3/+&RuLgM6\1~Tv52ߏj1˧8S+ݙuތj|0' \^"UY-2ygT"&NqdR{<]Ɂc;=_7󧱁<D!4 囌0TF1EIķbfu4j>l=Dɇ}GKO sH&2K7#갮Rys9,ŕnLxepV[@s2MaL/`NT+=\8G}.%r=2p̓48ffR 7)L^ 0v'E#d,Ï͓1!LGY;?YF&3NM$LP\ߛ#Y$W9<uJHix^i8plyބmmZ_ 4Ju48NT4Q{JT(M'D4\CEJEd8 d^n?k}ZoWP:[B&M(xWbC[BJ_?=A[UxsnQi /(wJkom$#)7JCD'vT JIOOnGLQ`UyDGI6кGlR|hVMSmv{n'Ҳ19@\ۏ5bjk*h̞n0$cAq=ߢme&2uE^[K_hǴdSJzjIM:Ixv"B>&(-jTVIOc5>Ba(j$tq(&ŨSv ٩*{M͞pi+SIn"X$pj6]&^0&L$? lF6nwZBu\Gtx9TWkJ}K-dI;y}dXVPFFd I?'WRŒ)hΒaE)<( 0R-XҷS\{:,Aݔ5@&Ub8\{t͔ϛ+Ffh38c~&$ JXRCu k$ʎPQ>(IHB~,ʊݪN:xZy ;RV{)xp\Qs)3 K+%J8vZ4<5 D6d01OGDQH 9^G ӹ.P_tν"b-(%11\ ae ZIJ`@YWNL,+ rDWTqfƬ&]Y_ ӆJa~rd S0C_Q esfk̐idɇuQJnӔ2dudkA~׃F0h6A]6i8bw ):š}d1:wa,ѧfc Gu9coiss*FԡZ L6|!E9Pn\ND  b.D}|!V0m[Zi0x9P O6T2CI9YA:E쑵\Aoo񅯲#mgEi9]~za}$~(n @zv R" 6 lq*o1υ7 &xw/fI#"!sa0y_}}?8 99ʡ%1|\d+l̵M-\ ;\xNTX_VG倎'noS.zcW,?PriGզz`iv*:b\ 0I#Mļ3HroauҔpL`T@: ta:}Gx^yXy۴iu*Em6FckE\Ä6%%"R*s?{~#u}S?rζ'ӐT*m$kZYDK}r=k^{[z=EIB6Ys?HW$5xк45L 7~bv"}Oiͦ|AFw+.Do_Rw{v 4FI\)vM4ֿ=EɬstV:%_ʥ:~I%F%S3z:5)Ae)}6Z1|OJQ*UeԸshZ\>y[ߠW}:B/mI2J(+bk'ıo62W@Qݟh\R+*T(J%"|r#GʯR::)UdmOkZx$ MUt-U=gZ5ӿI&[Rr ϫb K+HnA-|B -ul]4w' 9"5^N,e Ibc)y~ υeđGHY)QJ:/:h #-2柤!@/ NV)Xȧu*kwo8@G虷Y޼$ ;8I$w<-Dd4DI2u)bz &^ffF>K+QW>>2:HCNPbTKx3e6ċUX?F>#a/om-vTiIekrVm'nO!3{(_0g*&cO&x>d?M 9[־]+:GqJ3ߑ=vD12ä-ec1Iߩ[ Eliy#:|_}CF3;ɱgTtw >2D)ҰC ٪,iN$ pOS1#NRMs|/#,-iĽfy>R¢~`I e\:c܊4eYs0#aCA/Seq|)qf"xݦH @˅!tqCkmagO3'FGrb@7 K$(^-8gPչX]ß8ZÏnv8ѵŅQG9K56ʻt῟YI<~Ua Q , |SQ$FAZCǝLCHna6>lMPeS 8kMg\d 3wK͟\%# 1p0d!%^ K^w Q XoOǃB/FGɝdѓ,vmaot mN(wBqɘJ @i3kz1bK19)Xt M :a_W?;Q"18oFp$}:#KOMfl=VHc1'x[ R늏'G$A%{#8ЗQ'xRFQ:go$g%W<7 {${ 1МD F{f1O'+W{猲BLa an/Ie/$z2 ;Rn3 몃GeGbT-0eXuS\PSwq\`>兢ޘ若^ 2jYh ¤96*/:i"\2 eiXa/o)5_<DŽ@+.t[0,!]q]f2B=X5;1:Zp 58pޞ9 C]mΨg$ ЧgW.NA穠P \3Г{ AhT(4±<vOrFFp|WZg4i2/M62.@:k&wVg6D'BeG<\qҷ;x^y8ipc;vrαٹ,JiɴL5Ӧ=)hE0F 5BȾ\q_S6ouT7LGID>VL~ Ym8K/g]ڡONg~%7J'#$}&Z2?Oڼmu_oU]T0@ _In)D'O9:%rܤNMO~EO;tti)yCTxB]cC ~M/Tkz#EF׻6DO5"&6{-kH3(gmRېGzB7NQAA%pf:0RzMn•L!c Γ2*C/LfKkGhBk'.g+- fs>#iB_$fR.z^OaMc4:*³.c /dfh ]OqcQTQzIԄi/2vw^K (1ek59UЇF1FR=7Dlq-*1j~Jjh(vnm'1DeSYp)',EĪGҞ$iWN7DuQ3U 'x6 !w+VztNosHx( 9 C/B 섞(TwPc*?SB=>ڲh4GGJ/L!e-d M[%1[rUCCRF6:H6;Q`+$m7D)o9m"ֵ::10ZPa/'"/w,DEˢ[J'FwtRzqbƼPW yȰTȓeR:]AgnT~F|/~h+-e2лFS:%% n9p2D7S~o$~^(2JZiDc?lLhz199Ao):ZA.kK3`+Zy2H\fB.jk#VQFX|OgLП$ N$ŪzWrQE6Rӳ&4l'sAJGXsP%P 9vb m:qe,s` c<.F*BKVNC5ռ.T4?S}$i3J?B66ı1 -Z^N%xp}wW(_#L;JN)T"eX q.!#z7 ;A7꿐0o- HɈf$]p#XrKL.vDĂQg'\q4V򸤡H(⨹@_,~i=7HgR{a 1^R,u+`26`G"z;>N9"P2CI[9LRD W `@&SOML0F2r,mA]y,R]?ƅSMHM ŻUP:,5|w \WnS~^\B lM1JpwŋnI>'w0JR*HPí/W&x d %l UDq!MC: fFy~μjbǪ ]T EݲT@2"9XcǴ+]%Pg![1nwacx a. ^ƴR=(᳔@^()!gyIASz %t: pAM>$} I1|MϓQrԑu11fyמ /^GYx_)ty038xYUgհ/[8A9KB4vmt/EH*9 uX)ka KK P`k<쵀+LEi+7,]([,UP52dj#FQ Qk ixDV%XS!.BvjCbhL"wkk+; lžDܛ.Y 6X/!|ۤݕXgxcl>ǃ69T-gJHء \l3ļoڸ֢w`WY X} ̳Ƨg2-e6_9/U-|Ag>uFXm s-\>̟#H+%!q!Mp .0A=MݐdžW2nlFe]A6%MMnVPVF+UZ. Dka&9}]<\)\k|ek8䌧na»oTuD5kbGm#xg oZ J9 7M=І2=Ĩn1Rxp^bagkTaC w!] xwyǮH>NE&Cf -m [\pI'H>w;^hF6,Ȅ/fEod~^*fXV5#8Cw pf|m(kڢxN+p:w,򂅪7*|/4qޙ"w-Q`g<pDː"/&QrHI5P j\7w4tbbl UyM`Zs\tMDp񒟗wΈt?3[n+,7i؛{+/ U[} FbZ@3,,Sb=8fr5:]m5]6S[ ' d_N] C1&y0Ohg`!K~gㆃo=ϭhU;쓓 \猗Vn7^獊7鏬@ʬP|pvqr'hɘf{_2Pױ?.p&SOdl!(rAƺPLGp< MS@"I sGn't|4'cPW 6cw"8POSAX.PZ8fE;RQr?) `u>B ph/dLFWOAlkl/@F^g'#$fSdc [Bqqv‘-su4 mĞ!w4dxbCoa7V+ᒿ?4} R¦"4Ox^Y\wŭujNERmiR+*"{¦⮨U^w+R`Gkkuu204}8os>lSZq{lV8A7]|plvW4=*]@o>a06?3W4>s z7]乤l8n˚,;ȏ\pu|7m>z+u11LV^s85e.'z,q2k`e>#Ɓqǝ}΅8yqv|-p0.XTy/6yrdo_vpɞ/r='t!s|I@Ʋ9HQ"w&b`aL.9rm3ُ~n[YL](-éfyF/'vO 'd3]ˈy=~^ bYnlx֡L^60 OhZgJ<'%dSLIrI&Ogd`S9,dX̔9vHBMW#ȴ¥U@*6:$Ro!YAǤ|ڪVĴPdڕ((i˹]'GS qfq|+M,KaF*(g>9\ć*-wl1) kd)6OZnEђ.َq\Ϫ5V lKc IX/!xV'fg'dj Q*bbֵG86e'$ ړi,lMa" M[Gdp#rs:C*& |^GUS ASJPYvq$j%gA*ӹ+}K~4gej&!lҜsI):)uAB S71 x1DP̐, e%l[]JiSykb:efx2~> 故lMsqHK>1B 󛈀]f[!~-E|zW$(~)Fm&G8KMYè#wJW"3iAS!τ}'bZbd*Fb}%Jb'eo9ee] 7<ޮǤFAJW`> $•ԇoSȉIELV{ŜKX\ʾ3Re9/2@<,TF=Zٛ-$p>LOFi}[RdR".\/aw–K,(p)/irxY RQeb3c x^@C=nF,,pZnqG o뗥+e2碜6COQh9W-#i]^;40O*s(ŮbK0/Zo)V)Ve̯cSEO'%N̰TMՠV*8ZkKYDg1zdSNKM7^o,!agJu,5|K:1rƹ3^AC?%JU{5n iU%Ak|Eg4Ol TIn-_q`W}ŸJxjx"e=)e'geQnLM9)*| qԐ;Փ*yOK%#H13'J9:Wq]=o5z9 )Zɰ8/A&gPDo+0QaPV\李䲆ONV Vj-WtԔV1WǪk^se"1.ճC_q ĵH^g Ƕ ÍSixrتX5BM 5;5\QA{X%s,a7yXf5p|-ozQe ^MZgeu#9u :(lG9 *NPzWF __k` ,԰VaySŭ*{=^clK*ٱT^TYQӣUsgnS"79YIMXl[ɝo+E[1,v0=oHpnx^WtUJhPiJ H(MR !!$|_ =1a@Л`(RFB^sŬ5¬sqx~E ,MOz?eI?o0Ρ-Y@4ۙuz9t,w .|37K<ț!>~HHW`q/Pi8W*#17Op,͏|>5ʦ HIͨ7k`4?A܂x^9els0g S± ^Hf]Ai.qw{ & X#IzEźX܉#ӃO1 \{ t$}7P—4<xL0·՝h\~ۿϽlW+kG)4$vd4Nc/Io X<<8/x|lpZGϯY, |ÆG0z!>~9H&y g6 ~ 'lBVGs8>T%)S3Oxly,A4ʱ`](d cCA5ߤ;/G r,2vT qidRF9Dmz?US1c:8ɤ(jގP`<–idltMkU.0/X„u F5e1˜2kg=O\ F}1e%F32QgtM"Ԕėi%frE6΁F-d(eڏT9'ZP5ˤټl&r>ժizq9w#f%ڞLur(3139!cyQ֩,#Lf{y6<) eyB"x澐DmR,⹖EɔJ/g1pi]&X3D%|-s2xEǨlðbVhCZ&|)#9$ gN "&E 1}KpvbR%P,x"?Bԏi?c6BHDL)y-+lr§c C/S y2TYɚ=ȥP_̹"IU'ӮYݚѾGAt-bωR4̒'iL iձl ^D9?wj҈"ߺ,v<,c1>8I6]t6lzG>u yѹvD/4 B/1F,GZ,$fP?%MDl'sQ}ϳc-SUbrk$ԝ2n]3rX>;)- "nVyw J 9%gs)<)tơLdWlr~ ]Ĕq/Mg)a{lڔϊB3v~ Yo n8x9 v%(VRE?d:<}8{ 9hy\^@E/?[̲ :ZkJׄBN?)b&| 23bwtBI]#F<&g#ߛ=/ xf^8S/1Jpqe z!CAC ] |3x/&:L:O)&Xvn%:06FNjDKŞB5xh'oёaӳ19F'fƽVmniGҪSS)RIcUss* ii9B_k=5Wdn7prl B3\?̏ݡR}3ni9̸Z(2Ao"6ec+@|p4J@tL2[=*4rqC afV!; \?4rlfJ ]4e(.6Tⱺlí1Zm !H '3dlV}txn07̬ P?ʪ&+gla'2&sݷPJ>b/(迈ӆS:t!zZt4qՀ]bL:Q2z|+.ۈpS)*#^&;Ě f",ݬH[lk;N ,\n|;W+h~*`EHbݿψ7Fd]3Y-|f8,?kҺRLe4s;Z V:۸|F R>t)c2IQ~JU:OMO4uCR3SZгŠFbጝ%LL.4Nja;B>46,YY{pjw[6cZff)+>6<_c'w\_-˸ܮ_3Z72(s7O?7x^WXge/5j4FkƖnDTK^^a*e5 QCQ0A]m5*bbfiuA{>)tγDjŨkvmYIOv|5j ⤵~ȉ9.qԃ^Ľ3+$ Y sb9V0t 5[ۻͷ8Ɂp'puH`k+S}[Ȕ !\q Y$g3 eYY<2̹F (z^`_넰wdW0LF~|-11|$ %r8SL $լ=BŘ gdy,*9]4ֱ^O2ݒBΏ9L $|]'z4`.BUȧ6 0g\DZC@tȇɌNkMM;6r/4DH!Լwgє0C1,8[>8<(.Y`/c?Zzmy|D$ b3YtAHճ,oRO -n9=YTIh*rK5_-_] ~exf[$p&9ʉ4~*HM& s΢3"DTy{Srhyeci͹<%+ZX n|87 >mɠ?MBdޒ "!!<&)z]k'dicY^Z[~ny2Q?t3PIQQYe/Wvc~aHd.S\E>_ɺA2R$Q|Fάnj49aȌLz _l|%"n&_XXWSl,-uT)I>nYYr2 wZa}aߊs(˃㹸m |0"t $܌SrKEV^ZeR Yĩŝ<&p0\K}Y*1A%T;J|L qW&# r B썽yWɫ*hftZQ["N6㴫3qb!SxPWvicoO]N>weF?ʙ`(1jb t(d"Zgsd\ <21|@i'EZ̧v%.3lxRǔ1nJ'e_&r \ĬMn"5^Ns zSWc!bvpI'He|^)s:m-3@g8U")S_щLF(1Bc*ZF2qNW6bY8=#L j`Rr ^E G"WԌIgQD-u-8I׉™.vc;==͛}11 Ҟbqʉw׻cԃIӼ%%՟AW8wO[`c~[N묥Pg3~lHIS7C,'݂qdzg>gN^P=of#+ ĺ< |ތg:&Otb FS]l;@EF,<&Ul0W.zޅETF/Ļ|x|8[R8'#EE3AW^[$59r&ޙv뱳s#f*#!s! gq<ߓü8ȗIBvY @(C964H|h, PL_Sq >Nόغqonyb⍬ї1Œh[0QB)N]HDs'0eύ3*ѽWHGoM[Js0u;=a;>[ou7`яA0D<<;IKr#!P =;61QϏH1K(^Gm<'(OdI,lHKә^t~M `~0Y(W z3 J"[8jFS20 5":F28E+_-EMcvƳd%R8iΌixeC8»>4b2/>%L #DļTbME a DL>9%07˦IܲJ?U٩"M蘇d^8k-W4{#&.E|Y ORa"Hv{0nyu\BϦ8)d1^ޞdB[RX{+U'iHK\ۧ"fErZ?^Ob0x%_1ap^&gEilNgC9Q2И*oձʿ(Oq|$=M"aCO'c3ЍBOɘ gS" XL+)Qg)`qGYQALοUR$ jjII}m1DžJ? )Mse OcʰtNOIT BNaT6GJ9-q&6 tfHyfL^Qa683JUB"ӒhnOb0*cTIYM2I|C:yr6&$c^7๔2ؤkj:Q?Lle,fesTEfqiԳaR2ڒ隞)TN2`/4Bұ07 Rѕb|EJTF4DӹОt.ˠTLW*vZ=iX5j8/Cryt;{b%FK??˸la6/|#G'_dت\m&%XŤ,M:6rPeLz+YyS/'8=2YijZesͥ%"?xJY&+[8)Mtt?iP0=!J̧faz+t#&gG|IIV%*pefv#4|+hr-|&.fcLNJ9D and U`ɲJten"ЋavKR`,Ndn⸎5WhҰKC4yLqgM WsU%-r΋2xf * NmYl2(Q!VGeTd7C%4dkx6sTuUQ5C+5lI.Q#BYEĖS-sDx gp&sÔLYg/n&,NE,a}(gvjڮYYC\>}˄Syl!,bUJR="^om3%? 9}/y\✽"} [i6a;=WgYEzjtѠ2:"sr)ɡ<ƤsyMgҬ[JTWp>YZ>__i9W#ye6gH5WhP[ž琘و]Sdfwji[y?<ǝL!1wH!nr{g#ń+aR62F) vWUyZտ?`žj;kB`˘\RV |B 0RHu{!=Y̪%,[JkLܪeS, JV՜__hO.Lɣfw.,-,x7NJ#+&hI zx)o4Z9ɗTVAJeU?5It<#G9}?2Oq%8*NXLœ9p7ׅky&fO[H9]F0o2uv^R\qc[ϥQ8{r,arT!"nY"$1e1] ,CFL2[Qps[Z]eJ4 ٽ_Vmb&,vfB&+\f@:~)e4T[x70]-dkT.EĐyc^/a:3pHs!K蓕tM/VVMEmJ%\7F͸2 Vaۦ}Me.;&ߍy(S&Jh>"e\(q.ڃB6Q1Q͋~*Ru{ mK0oOqa+kd*$RT~'>9A{tLWiR!*jbc5|-:NxfTC!%_E:YZ >31qDRƦc2bL-ટ;+1Rŝu7xA t̽?w-N -nzJKFF5ޘg]p*g{(ﱒ b}O>OpbqZe 8`vƑr{>zXH%&$QffX_˴fI9 ;[AJwBTxѸkѥgZfբ=002 ˏeyo5"d"I T)~-σ1)h7AU ^b=GhtZ*z@& 2swCk1'`P4.5mf V,fm{&1LJ&.djTc jXr6XG-z:` &Fndنb:IlLQjf^<1s€o\[_*ldn(S)e^:١;AC["/b(=?c@3O-nֵ6>~fr}f&-DgZ7m_}Y)cկ,~]bdU4="G{}GM7L7-XQ0U%N.Y2`qpVFfC{OvOɅZw1긎z\a`[q Mr3Poyq})^ZcJyAcw{_O<si(5Lԛ.34))U2ٟSWjPx^gT׺mh1*ch'( ?E]zC03 &'̹JTEc%E5FcsN:YF=u>S;฀|ո1iDwoYRi.z|8G#yk4vy{hEGPSθٸʣn؝X^p?bA(\x.Az_]|~%gu3*k^s<؉#qa>-Ev &/D? m4%͡O`bF;?`/ܻrC ^烉s%|c8ȯ/){_OlBWܸiVypЗ`!:EgoGѰe1IIo]eqDM{(Fp\Eέ+C)B&쁥ċcE>Gua AX@4Ab)>\ɏ &0` a,Á|--cIY-t\/{!(6I}Y[g|@({YRR4x.cϰ"FdsB g>]-Xq?듈ʄtn^//9/ˇ~@N{; P6,ia2*A )껄Ψ0vGF G1>y%lפr3B26fc~ez?}89>!hRm$͎fm`,SE"[,S-[C1өQUu, oMıg "4/%\A8(\У`6f.vF1dF kLOOi{ wXm pD`jı`ky|:霳[D본rOH (.z!ϡ&iќMe}Tob1rR,cx7Ijf9!K*78(F(i)6?XQ%\|G+gNEga.=#߯* ,,+!W<ܜ0:ROD".t{XڽȷJYCƓrZX.aM%)Tʅdګf-cmMEXXb/ N6t%eS?r9e>fwzs@&1bfEJ!t`} JPxi.eH<3|Jm\/m1IX75#UcͷDD3(_–bOG;2".鈂ڽ%ۥ*^۫x)հ O!SC}[E\ b$WH!.rW0<^sB&bWV5u̹yKs~ 0cӮ"zuii$g9[3Sco4Ҁ E9^_Shbһ \Sɴ*̬O XÑZ1{}'W<ݟ2PSoҮ0&'WN%Y]̅\lzs_+xQ%#T1 jo>T?/Ǹ'&w[ޕ|b>k[=]&6O@[O?lW4x^WX;(15Sgܩ-.@d( {#{'V C Qb:b\G"Bi.({={g,pbEnOvmkڹwX.53fS5z_=`9=55uxѦ?̉63'Rq]N8g]E `#s}9e 0BJ#7Ĵq@Kbxŵ9Λ|xi6shL_2SN0m.3f( al(v%0J^m?.}e0|F-6n -ޱ%`IZX=m9D[,9팏S&%Ŵ69g>BbGeR#///Iwtb,s$6Row')ԯKcw6G_@t+Yd %' djgc9@}uu3൘3̵)[82YmK'l ɫWž}Kp&"ŝ1|-crLQA*\Y07^V3W^ds\ou~%uLGx"Ν l|!ŘX:̎'͐Ȧϒtrf60VuLAy$i X eqxp.Ed( ż3} "+fN0S*Ӭ鑜Mb- UJS4 tH3Qp2 1)gP^bu2n{Uc(^ oH`2:k*%+fCtYE\6cU1[;G1%{!䍕2y7DI6:4bOsi_&;gm%|l-޹wGBD"*yz@ySDyb $K 3vK8&iLZN3ipF}#ú"ʃqD!MO%BEtMҧ3 1C1 vK,]t~Iϳ%a<.`js!w^W%uSz!wh%aP)24K,x"Ab]%NJt̑jmUg2~8cshGRr~b ]@edkĬ͔G$e^F-r5 (Z*EJ *|C993;:}_8;PHQ-]@";iA̩ URjevS0 UCtWFȰ suq#W>YD ~g{!Eg;^o HȅM",K,.|ܹ# (JTPRC_g<,GF7%hߠe=Oez|S%trЩNZ^"lTWTWP_ qC-AO~_|0Z5 pղUG1zD th|:X }L.fKAb.sR_2F[UrfX)",EͤDN"\Lӑ/[a /[T\ݪ]JUPf*GOeKL ],>.ENƃ\9>~ y(^jďpt ?'hc[O=_4HGFSy $uKENlUpUJ'TdWjP/Ғaz$i//hYvFv01 7qBc@Gٙ4W88|CڗV ]-[vɱFs';7pkWNrO>֒h=zN:ﲽ9;x 63d 5^tg(ht[Fx U=޳RUdaE XI#ˈviw3c bܟ|&*͌J26TȰSZ)+ .>mힼTo{I&gfCFHX_ᨱMәoy7]pux^gtdFQE$㏖F1Ldj2J( RBQB J[ 5@,=~Ͻsϳ/4^vB@!'t]O ˸pds7ά`>? 80~g0B濲yc}Xur;S yӞ˕ȄZq{Ib)Yg\HN/ob@_gq#y/%8ݎz!OE9ȎlDHgJ;7&z|ol}Ts{928qpO~Ƨ?ʐ@2 a4Yd?}!D[=9b K]8+pe|q֓}x-~9a_3:Xpf)\8Ǝf+<^?oqVmhK}U{^)'^9crwN M6~ ` %v+?sw@ob&r|aZCdFi$/F- ^\p}7.cZOfy_Z@<} 4ժ]{/$>,_N\j˚P] g(R#ciDɬ|9蛗1y!2d4teDmh[xʛž#"7'1AK a,#8}cc]HeF{(<+֋->N_Ue ;c=3HdЪh|/G^~@|LPkù1H;biH@隄<~(!9v}\s]Bc\"(B7h=[ͥ&v( dQc0|LTcӹ~$iCMϥO]>nC/it0r!?A~$POv]"N'Vuz( a`4NEc,6?cS"G4<)tfwL.` !BEeڵ+9w'C] 15 lJ֝Jƹ9{)9' fҬdraD:V3_MZLocnIem"]/z#B;;Y|ry8S0oJeK:,2t,m)|+HfɞBFDMH(9+q 6i\zNÉLlsy%3P*7p+Y"ګyKBFar:*Pr:+i.zkU&gs4\!)xcSsIߑGDtՃ$v }EObFp|&W)aƓ?SͱK^oxw`T;3D y'&k io`_!"L36HBg)n2:yMAڲb(e`B?9Gx|>W`"st!E$1"B{5@He!u .\D7H0KwSJs2frRATK1 -隊]7rLM\"("3pT"Kż+3Oiw.x3E,'bpw3r([L~%ܳWT͈fj9Wgt5!I?&Jњ?seEX8y$<^/%P[$Ɓ*&QA55xhQu7J=LGEX*\QRݕ2I*9s{J"jmRlrdę4i쮂ݸoVb*a@5k5kY2W,=Sf7>^€RޒaqPF@"UL|(% m<ܬS^t ?Sah:N|8|^Ʈ l5ҷΊLA%{6gOɭ[7'+a1A7I[Br uUL~Ukgմ0X%0UI'gKY?I:awS7s2ȹr򆚴G>4>oy1aF5xV~g?3#J-x^gPgl1j51(A1bYDEI~XPқ84KDh,AYb\_5h4*DKĒٝN¼~{'o~m0778 MCSEfw;ے,*~ ?Nc cJݟߒy<H !13n'͓X|!(&bZiȇx0=z}еj_0ewQ;&#߆G)1a{-GExrF*yϩ|m:ׯ7I?sOd{/bEU+KW6-;b\ הtŏi`Fq)2%3 "sH^sprv!N/bP~+Z^8YlM8%PSym,8Pġ)9*Oɟ 3i|v/`)m(hΌ۝Am# iJhF35:cE`~D~t )Ҹr'Ur~<r!b ~R]C`xO$@2JeŮtUd>g"#ijJa_Iې>9L dO q)`B_ C$of\L,jv#q˨Nr:gmY~ƅN˘=3nE:CL#ASV(,0DpI$]b#+:Њ$N/4&fe<ű\>fOR{d)0\a DԪG%yP>#I_\c82^p"d|)hNc{LBQmEcxZxs58g2ms>['"疸Uq?"]cX=' ƥ˸Ts:A{2Ix<( (l*bq1Iáh]gEo[_)n2|h/%Dv%3)143= qn/"17%ܑQΫ݊9Z g*7Tjޒaa /HJޝ_" .+ejp\މ' i$$ d.Kt9bj% T+^f F9㳪o(x{;[UP3󨆎kp]\|x"YDd䋑Hxm ;}11mKSJjUx8)a-)SuhL,ရJn8fp c=[ y(b*Ib'Kp e0'eiӿ|$S&W3Daf_tܠs׿5N|o& Y!Fː_oөFLdIL}X ;ex4ssN \Sɰ*^iᓇ>Ԣ~/ 0}j-;\tY ȴ*5ir(iB%7UŪ4RݻNlrL_DX'3;f:4Y8~6/2Rwe523D<3G 3|ӊwGhYʐex}gr6\xghajj8?L˄Z6VH]qF67Dr3VV/[ey92Sa&9A΂W)m<WavA匙Wʯ ~UZZ! 8@1#C>4a1 +ݬ nc]͂'.*+diTv+5Q6?(eKvv.޵3R9U༥Tq5?Q;=9c@6H[Fz3qc ]#uR w UNW +U ZbcˆRn\ʱex WWMJ \oWqwS5e9=pS<~?pIއ&0OirV>22ZmF)l}oG]9W6WpJ7wR>h.eB;);P CW '3/Q +X,$p8xadxmZ9_Sޛk*6w'ːkՙVL6 oWע2ΟgYLXx^it%NU!AV ZB$gB}-df2[f&ۄ, ,HX ڒTH e1PET@!VI}?X\x&[OerƷ a]6yuo[|^@ C{8oaբ7s/d 8[璞猕K ue&w'l3K =ɍe,dQ>lc-u! cc$ݕќ68&%쒌u;nAi/|i| Gڋc7ξs9 K; "IYG]k5v(ɨrTNʧO4{n9۾|6>;]N:̗1' §0EaXF}< !fX2yP"dr)Y,yO@L]( g0Eѽsx{PMlpVl`4}|UN1cRzL,Y̊᫸}gW#m3vdbu.{rіcS"'ĜE)ʨ(gu1%Ɩ>Q70sF*oMtYrk^sp|) DfcU>[ D`y.]#c[#"N+^^BR4*CXMͳQ`E`fl˵K/VU6RQ X>MJ̄[b;%EQƺ"-r]*fJxVAx%k櫘7zF5rVo|>د|PYB--lb7J,9!!C0{o97Fr0T7Jr*o,#i)-~X [1WHnY!\&d( Aʯٴ"[wW1%f۔Pq ۡFi;JIq~~&a{RNj Dˣ-(r -ǒRF)8﫤OH2nX6MWu9[$ȑqʵD})bE>9q1gKl䵻J]R1,h0Uˏ:vy~g/e^Eܝjrj,&~CY=%L )aR^ ?PrǠ!ajFi(J|ryp7/Z"b0RQos,M*R Tsj#z+뻌>4Qwiθ )b:O0⇕ /Y\śj{UJ[3e%0>zRѶ2*մb-jY5:zA.Zj,u:sȾr T;Dp ~RɑUTM\[Sb-!X\G`cjN5.Rե^zm}-ntlr#XN޹rbL\\o&5TRRId\=kyN 9Vfڻl Rl}3Z&Q|Gm=˟VE8v[4rn~PJ*y`XbF/+K-5yDCYpfi)&B//ʦ FS> A ؇XyrgO*2O4eg_ .Zx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^kLuqrJk%ڌ&4 6+$/9t 5s$b+$)Spn9y9GKޖ"R,ɲٔi=ntP[/z~Qm[OE&MmLI'kk&j< [8;{@m5.Nꐛ5'yφ"HyU©t^1W%7G43Djf0BCjLOuq뜋ߊ?!CffG]KoH\!)3&*Wdָѣ]1n 4h!9ޅbG7G[.p@#^yXCcBT^1fǝ2˄WUէrǫڠ3)qA._ 2PέsSp܋wK>͝봟'$ dݔ{BBD;*?TkzC!{ Vg9;$̽ôh".BuCdy񚟼#"W$>}Kfր3,UҘFmN{z :h=I2 2)q}VX_aJ!O(yJlnԽ;mgGٰX^BSJSQ cgX,bX,_Fx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gx^1 DŽa m43gGCOL8 (hh  y deflatecV$$Q (unitsdegrees @ long_namesolar zenith angle @standard_namesolar_zenith_angle P valid_range  B P _FillValue  yy `DIMENSION_LIST,,gdalautotest-3.0.4/gdrivers/data/foo_5dimensional.nc0000644003401500001440000001646013614004466022155 0ustar rouaultusersCDF station time zyx time( temperaturexx ?@@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@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.0.4/gdrivers/data/two_images_jpeg.ntf0000644003401500001440000000420213614004466022244 0ustar rouaultusersNITF02.1003BF01GDAL 20021216151629 U 00000000000 000000002178000420002000439000000040000044300000004760000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000002000000020INTMONO VIS 08R 0NC1M N 00B00010001002000200800100000000000001.0 0000000000IMMissing 20021216151629 U 0Unknown 0000002000000020INTMONO VIS 08R 0C300.01M N 00B00010001002000200800100000000000001.0 0000000000C    $.' ",#(7),01444'9=82<.342  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?R9Q6=:J߯L*W{@'$!v5&eW>ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q gdalautotest-3.0.4/gdrivers/data/test_pdf_composition_raster_tiled_blending.pdf0000644003401500001440000000456113614004466027731 0ustar rouaultusers%PDF-1.6 % 4 0 obj << /BM /Multiply /Type /ExtGState /ca 0.7 >> endobj 5 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 16 /Length 6 0 R /Subtype /Image /Type /XObject /Width 16 >> stream x!1C9D֎V6l}&Bݶ2hh!Wl+]ӊα>k&+s 'oSNk3hՎkG\黫+!Al90U.r$,A$WgQI0j9YR_|o endstream endobj 6 0 obj 149 endobj 7 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 16 /Length 8 0 R /Subtype /Image /Type /XObject /Width 4 >> stream x ȡ@ >C Ei#5g;Pk]m>qzKҝ$*i2)? ( endstream endobj 8 0 obj 60 endobj 9 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 4 /Length 10 0 R /Subtype /Image /Type /XObject /Width 16 >> stream x 0:BK$|Dvޙ\yZF14,>T@" endstream endobj 10 0 obj 67 endobj 11 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 4 /Length 12 0 R /Subtype /Image /Type /XObject /Width 4 >> stream xKniYӓ] @o endstream endobj 12 0 obj 22 endobj 13 0 obj << /BBox [ 0 0 20 20 ] /Group << /S /Transparency /Type /Group >> /Length 14 0 R /Resources << /XObject << /Image11 11 0 R /Image5 5 0 R /Image7 7 0 R /Image9 9 0 R >> >> /Subtype /Form /Type /XObject >> stream q 16 0 0 16 0 4 cm /Image5 Do Q q 4 0 0 16 16 4 cm /Image7 Do Q q 16 0 0 4 0 0 cm /Image9 Do Q q 4 0 0 4 16 0 cm /Image11 Do Q endstream endobj 14 0 obj 127 endobj 3 0 obj << /Contents 15 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 16 0 R /Type /Page /UserUnit 1 >> endobj 15 0 obj << /Length 17 0 R >> stream q /GS4 gs /Group13 Do Q endstream endobj 17 0 obj 24 endobj 16 0 obj << /ExtGState << /GS4 4 0 R >> /XObject << /Group13 13 0 R >> >> endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 18 0000000000 65535 f 0000001883 00000 n 0000001942 00000 n 0000001526 00000 n 0000000015 00000 n 0000000075 00000 n 0000000394 00000 n 0000000416 00000 n 0000000645 00000 n 0000000666 00000 n 0000000903 00000 n 0000000925 00000 n 0000001117 00000 n 0000001139 00000 n 0000001503 00000 n 0000001702 00000 n 0000001802 00000 n 0000001780 00000 n trailer << /Root 2 0 R /Size 18 >> startxref 1991 %%EOF gdalautotest-3.0.4/gdrivers/data/nc4_vars.nc0000644003401500001440000002625213614004466020442 0ustar rouaultusersHDF  ,0 =WOHDR-PVPVPVPV"  gx0yBand1q- &FRHPE (q(8OBTHDd( @BTHD  d( rFSHDPx(BTLFU1z8IY3Cuh? Sq2w#y2UU9Wx;' 0-!R ?>|M)BTLF ?U12238U9!M? ;' ƾFSSEEbm*BTHDd(M _*wBTHD  d(M! &uFSSE^ GCOLtestval_stringarrstringtest0@OHDR-PVPVPVPV ?@4 4*G# +CLASSDIMENSION_SCALE NAMEx 1standard_namegrid_longitude 9 long_namex coordinate of projection unitsm axisXpNOHDR-PVPVPVPV ?@4 4*GM# +CLASSDIMENSION_SCALE NAMEy 0standard_name grid_latitude 9 long_namey coordinate of projection unitsm axisY{OHDR-PVPVPVPV$ *,  iAv&TFRHP (q$NFSHDPx(.7BTLF-O?q HU5$:/+/;>l,|G D-Kqm?j<O(? >|9{\ c[gBTLF 5Kq9:/;j<?H-O|G ? \ 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.0.4/gdrivers/data/geos_vrtwarp.vrt0000644003401500001440000000654413614004466021662 0ustar rouaultusers 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"]] -1.5628130024270072e+02, 1.4534981708669393e-02, 0.0000000000000000e+00, 7.6404172905756070e+01, 0.0000000000000000e+00, -1.4534981708669393e-02 Area 0 Palette 512 128 6.71089e+07 NearestNeighbour Byte geos_vrtwarp.tif 0.125 -5434894.95475267898,1002.00865774377053,0,-5434894.96445174422,0,1002.00865774377053 5423.99999516018943,0.000997995368874063891,0,5424.00000483981148,0,0.000997995368874063891 -156.281300242700723,0.0145349817086693929,0,76.4041729057560701,0,-0.0145349817086693929 10752.0809709369441,68.7995361840427933,0,5256.57165844142673,0,-68.7995361840427933 PROJCS["unnamed",GEOGCS["unknown",DATUM["unnamed",SPHEROID["Spheroid",6378137,298.2572221]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Geostationary_Satellite"],PARAMETER["central_meridian",-75],PARAMETER["satellite_height",35786023],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],EXTENSION["PROJ4","+proj=geos +lon_0=-75 +h=35786023 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs +sweep=x"]] 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"]] 0 0 0 0 gdalautotest-3.0.4/gdrivers/data/gmljp2_dtedsm_epsg_4326_axes_alt_offsetVector.jp20000644003401500001440000001647513614004466027664 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdryycolr+asoclbl gml.dataasoclbl gml.root-instancexml withheld 0 0 120 120 y x 33.9962809917355 43.0037190082645 -0.00827134986225895 0 0 0.00827134986225895 gmljp2://codestream/0 Record Interleaved jp2cOQ)yyyyR IYiy\#"궼LLdEҗҗadKakadu-v6.0dKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -68.7, 5.4e+02 -69.7, 5.9e+02 -71.2, 6.7e+02 -72.0, 7.7e+02 -72.8, 9.2e+02 -73.9, 1.1e+03 -74.6, 1.4e+03 -75.2, 1.8e+03 -76.1, 2.4e+03 -76.9, 3.2e+03 -77.9, 4.3e+03 -256.0, 5.9e+03 ,XU$  1   ).3(7#9;PM@z2#"!9H.&!Vx'-jq@@9g@^@`@@A.r ]`z mr'0źHa] n@>;V@ɥ1KA\ eɀR_@ vɝ򁺜#M v}Nk&C{T.&W {F(Je7Fnb6 ` _߰=,ȔlK\K ;arh$̉)Ǫ@頪|ue;GwiX 2lj@_37x̣Emd (>y L"ʨUWXvT-ٔ4ęG P4Cn ~.] J!Qݥ3wLnK|fzlV _hp/n ʪbmVHQ%k?ó% _eWLk ,uN\DqA92Lfu>IkrX8!I%a: Q/MUtY=L9N[ oV.OOfwwWsve[9<ϯb܆b#w\:~PjW5g}|Ş}bwp\̙!Xb0ޔ.C Vr2aI`]'^ U?SL!yAkB>r=7Ĵtṡ[(z\p\)_"KCK83})3ZdžDApC8D.TX_Qw\)ٳ90=Z eeujzN! @EP⃤{m ʋj{A@O_"y^ C7泗,mTic2tkoVf]SlVm(ÃN7Jp<g P3Bs<+c]I-MUT(UZ5*?vB{MF C@~K` #~Ʃ诠}*Z!:6vv!+[T{5\x f?[yb<"F?isSVOlTm xC,U#Li-/IZ2k-dp _>ҰEGZµ4}[#$c̀I|7հ?݉uD/GkjXP)e~s{{5PV']*f'jZҰxp(`KDg_GYGp,1 gPL$f^<1b"3s#3Qo2R9kX@rXoV|tf%3ܛ3xz$ldžkUH4Q۪1.Z[cUN(H08d,[ˊSg(`e0.x:[$ ƱMa1' h3[cr_ʷKeZ)֧HJ`duc [+ПJmhҌ/PKwt4 74=n  (T|6!=0[(Y *f@xm4R!4@x8@X^W3MD9p֙;4=}ToQ6(;zKB_{3U8 rEJ~|HwhipP~N:V[n?yɻ2k Co%=#a;Ad!U#cDö=EgLMe3|-BW/'''M\FGJҦcaſY$ 6T#~ݶuGն`X]%?Nz(Vd?vXYt-.Fm(yywU pGF`$ RWi+o]$i)(h?JK7f(#(:meNݭ>$D{ M9%ѢzlsV?_2Bo&c:ɵ;\e<|fK­z`!mLr_b*trc"Y?OJ js'v}i ?gA䖡lqm/)./{HuILqॽ]|MSR97_hT>A.bY]l&GrO|sOZsHʀP7)~ǺOUaJm]&3͂&* ]S"ynfzZzGMN0UIH|Rƒo<6o>v'&jLFZFBGp?Dr2Vu"y9 ټ{f {{LW:\zWt uq]/ %<0]zxN8+WI(,/~!a$xʎ *G)'M㸃 O |$/ZCX#Lu{(;=u M yA4ܽS$7gT\1 S5eTJ 1P)lzM.RHԤ>2sl1q{*V) XVNBpؔԲ&a=AYэ$@=90 qY MC&;P \ɬNӏ IP<Ɩ哛O."tg_&Bc$2HӆF{h!U3-ɀ`Gk]Z| /=FE^By85 O.Pm@<<0B>YjN>]GmRQ=Z.tִ Ո=>s`H+۞2溬2jJLds!ߎg=#F${K|VN\Ds'-B,]#[emL' rls:sn ?)ܘQJ>z^4m՘_z }ᳬrLuֱAM= }dNNAtsiȧJl>ǬI5K PV"փeRRKZ+ iW4K| {'&[uC{ @@ u9$[ٙ!|C0A;hp bAA|).ɰ`f4V .8VB=`oQHf0Bж]SD8*e 5/2=yB9hr56^20B/g)50Bkmp:_9(O,cG/g;Ӂ͆#NaK /E2[5}OYg&?Mn_Ee;Zg&V̚8)Ԣe\n.pP(шOZއQ;aRT^,58\ t.I#W? ХsPo9r &G+xr<(#3U'WѺgEHv)۲fՙQ]+m:&-i a8ؿ(i3踣-9CS?V|1@AWʴrV$ImIȇ 3ğ*(ߛU&EG!z"KoÃ˕r۟\ugdalautotest-3.0.4/gdrivers/data/251_sparse.xml0000644003401500001440000000166413614005402020776 0ustar rouaultusers 87629264 Stuff at start of file. 251_head.dat 0 0 2768 RasterDMS node. 251_rasterdms.dat 87313104 0 160 Stuff at end of file. 251_tail.dat 87611924 0 17340 Default for the rest of the file. 0 87629264 0 gdalautotest-3.0.4/gdrivers/data/byte_with_xmp.png0000644003401500001440000000312213614004466021760 0ustar rouaultusersPNG  IHDRB;IDATA{W& $[[w+H^`x "HwkHQIKv_$`j "1k @ ;BTGc*49@ŕi2Qze2x",YbA&gc& KcNNw[*t4xX4EԎH@2\0,1|`qi/%&w|^{/w*az:`Ka.4 1α|<"6vq{zR&%ԈZos}‡ʶ{ծ^#,,%x>tEXtDescriptionDescription Z tEXtTitleTitle"iTXtXML:com.adobe.xmp Description XMP Test Title 8 1 20 20 1 1 1 ^FIENDB`gdalautotest-3.0.4/gdrivers/data/byte_without_geotransform.j2w0000644003401500001440000000013413614004466024330 0ustar rouaultusers60.0000000000 0.0000000000 0.0000000000 -60.0000000000 440750.0000000000 3751290.0000000000 gdalautotest-3.0.4/gdrivers/data/dimension_labels_with_null.nc0000644003401500001440000001414013614004466024310 0ustar rouaultusersHDF  ``TREE0HEAPXdataH8  `/]x@SNOD  DIMENSION_LABELS`????????????????????????GCOLxgdalautotest-3.0.4/gdrivers/data/testtil2.xml0000644003401500001440000000112113614005402020650 0ustar rouaultusers 20 20 16 WV03 2015-01-01T00:00:00.000000Z 2.700000000000000e-02 byte.TIF 0 0 20 20 gdalautotest-3.0.4/gdrivers/data/wms/0000755003401500001440000000000013614004466017200 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/wms/gray.png0000644003401500001440000000734613614004466020662 0ustar rouaultusersPNG  IHDRU> pHYs  tIME v@tEXtCommentGDAL-testhIDATxڍ[[bH $=Rz7^8/)#w!C^!`<&pJ S{}>AT?B48)I.( mܧ&Z -,GJwev%Ebw./ť `"x]u_2oF3~0*}ym"yff4R$}p~9/HPTy̌BFo"߳L="4{Bh-ye F C+ 15! ȱ>@7˶O+é$!Սf4$rmK:R,3ߎS/ݛ4V )X_*G w{gf=FEpȘ" hS*vPyi,;==f3!1wň#ch 6bD1{Bɸ Ԯ^_"$@aJyF^s{,Ra)AM M+2 ͏#(V@Hgǔo2qHpN[\>00;"(*Ӏ8Xhqk5xlv?4zyg4dA"/1q!v l?G_gHӸb(܁}q@**(nvSW30ĉP*0XZ%E`f.j70op޾ C1=.K:VZxڊ?]a: 1,*-HF!&jo"J@>&":Irf ) M=rx/$#aבmײ< u,; qƴ4?Wu;Q:u2 N([LʱpinJ Z3P|D]:,CP~ŏ, :``bׯ\7<Q|2}{JXIШ jSeP(lQ:wTV n 2rh$x>u[ o՛ ·}\ Q2}`ByR>S1 "/=ʈ\IK54U232DwP󟶾pɄH y:E.P=.*hC>Sxt첃2jW%:|wD#G\UYɜ!_48GUvp4]^\J3籕J72Xg@hE&Y4]K #IHzã7-GMM dUǍ*dV IOBI+ R!n|ph789X,DbXU+i] _A28u0. di9&')pq$ZBW$*>I&A&m8J3c}?ܿӒ#4_ & Ն̦ q 8x6jf)&<ؔ<hTsr(Cf ~у91y$)?Hё&4Jц!w̎NY8iN6s]H<"# .Fj0)O x6`$0JG r%--WC"٫8&%}"J"¿\I"D8Ꮥ9RQGpLٟS(#*p$#&pѐf ZmSyqQ/#gOo@4GYhpS捂V>tY8Qum8,B:&u1 }  G7~4 Gc~m]"+JJBA-9<;h,SU&u1lydp#uTK  kະ{*,'8uh4z &`כ6?,&n~A$__mXc~E8ݡZǦJP0xBC N`CViճ?ܩ!:^f 01'uѤ+6DZf9㿶/Ń8ldTxTqi)A},BN4YfSaŮoisdm_~D1u4#:kܙ?FcMEMQy5Jls䴐8 ?|v_& PU-A;Sw]c?-g4M)z}PRWL\4!dT!7i. 9ZHEk"y{R}=,6_G7*aeǁ) F-v;PilPҍ0F P*T5KM`2BySk SQRiOV]utelLִv(JH6Y_2a~@7u2.L JuB9"Th OZ4%@spZU\c=~QrFsi2Q~&QbZ UICd  }745Q̕1.gc>*YN2^}i5sAA!k(0*e*M,O3b_smyɒn`{D1]ic #!#\JHQruALٓjyQ:_BA4+8;nB u< _~~ZUvUj݇82OO͚f| yf"-`J.Dhc2m'~wGG0x fA=s/t%;ȮRt̃84kp=~r]OR$TzLS'O_թO`\I7V`Pя!%~_Q:X! ITO_/[#λmw+J5nd~^:Y؟Sv߷4b}6_ADj_h }o(wo #.Z]ECQof!~`_NwE'3.Z_4/Ke6kxiQSPu׶A5r^0GbyvI]뺮;|`01!%̘Wo:$6št)"!f36/uTǂ-hGU[h׃]|}E[ 8^h^r~5"h^[jHxX Ÿ *ƛqn7 r@7;.Y=QĿ{-GSzk7^~w&uIENDB`gdalautotest-3.0.4/gdrivers/data/wms/rgb.png0000644003401500001440000002647713614004466020500 0ustar rouaultusersPNG  IHDRL\ pHYs  tIME {'tEXtCommentGDAL-test IDATxڭ}Y#;o,To}E0`ݟNJC`$_%Rƽ- " X+ZZ?#?/#?K>,~>YY\K>ʵn\00T!`*T1A@MAX\o^&"_7 @E!Px%]O(~?zO]gEۯ~yoUilj?lOϨ?#y{u $$~+|~Ggxݷ$qk*;Or.?lk߾? ˆ7`ClBѾs?8>/@2@Bƀ3E׀By t*4 [ nI_ T̄|74Xݍ/mɂy:D@B=N/ݴB݋ f|Zi3Q| x([Ti[n1{F:@ !HoL6 (!)LU``Dž".fN` ݎchn"1=^ULEHCD>L 7tpC_5ߌ xupu ՙ[TE7UE\)@gÑtN6$1.~p&&a=zanP(.6{y.HD {vQUd,h*cOoүJh`![0Ƞ>S-܉<ؖi[v79ϛqnPȾ!\~*'pax p_0$lIk*px) tUXBy+ҩ3~__>(xqT5%;,ڜ擲E,Ot7’/͞I'e G~ y/ћq6GU' soHb=3'<;Nk?w1/fW(0mt|^ x}w3, 7żXB19yr%JY*J.*ljr3 \: Eh}|?WʺACɖT! nr˱yTa iTe0} |M_! 2>7'B*2 l/*he#@c?i `ןl~am.=KV~r%?Ѐ_|@D<\ (fPqyu[G|3of_GJ {r-2Pa0m3 ;v(>a1bۤJnilצ.OLl煦yW]~OJߜ`K8YO6ڮAS4DJ8K!hꜚ*unSQ ݸГqnZ_Kmyٙ#^CNG-1Bql,yTkAne45]~p J> MKoK:+2W'[qC(S?32M2C';2Ō MLlJ i_wU}azp"'l`Gj DfDBۣVfhNe.5bF\<TOg֬f:*b^"Y\m,a+OU4ơԣcŃR>ڊ~i]6)qN$eVʾNe1 DX|yV:W W{d,Qvs%99%D-LL'iNQPϏlz|A~jQZmp'tl̹p(-{'8'xLD@=|-kXF$Z-}i{^o?]YP:7r\_1t~RtC|_e(A$3ڶ :peO_{JjU|-shz@\$$y&HȱG  Ȑ]([&cb"u>+Xk@ЛAE w_5hѧU"qZ LDtbqK B73D$3ȈU#n-ר6q֊I`Cn\| ;[^!Hp_Kt.kzh^Y#"ZfJ+](%"F?0{^wN4w*+.gyLE4 ۞\@rD5=DTtq%ǼxQ UuHns!Дhir' cPPbxa_G:9{}wy6ލtNܕ7]\Ղl^:M09W|U&NB@N`W]%#œ'p9z / aMl怮O^'KPu4IhRT\-Lkc`29`c OݸkQFGryL@5ZVIu p}䓜F80Y fCL( GLSAx2]zHٺ*Vt-\"bJѸi$'VYqvezk?`uSE-.X(i[ϱ n*J(#L WL 9FX&"0 DetO*bT WY׉("[ %uT/lIh\Ul%j@oa1+Jt,%XՕN8=YZ'J ThA}+0b4[0L97VWcΌb<.p m@3!}9ȹ}|>|XU(M%p\a z"^ OGpB``zT ZlVh3EzHB9&I}zGB`}A׆|JJ5ZqZQ ɋ[?)Wț&A ة@+>G|%U)C3K#oTlJ0?-p$A[c VS+<\ *MEIoe1g@ x3źZzEp:r(1T5 HO_'xa; 89]| \ QJTҁH|& L il(v`W7<NL `dlU1рU cPFucNz'Sc gF^ )w^;'h͹<ōdžR(줿eLPPBxkJn#3QP} SRNP΀*TPBDyױVEXDU:_/5+8 w'PT 8c8;~ي֓qUs<2+LKq&a#ͪ#r|֖b:RoR =׎}U.6Y%yX*Uh\\01âדժ饥^=ǒ#j/NxX8zaG Wu2v.:R8%I}b\l>,sJy(#d-7v#|O5~7Bl'A ҮVB8Ԭ%ڨ"ԚɵÆC}#YJ"W]TB<GVe&g♮'c! 4Z>Ҕ XΈ2o8'wAff&# _ t֏/U(S !.6<47@=z HFg{f=3.Z_0oF- "mF*(gz(+t[F*u<( %hwPP#2{6SLU1 ;N>J8CS? DHA#8TETwU.@6w#yzK/OK [?b75#a}dH5:.#bL ܪ.2F>ZCq=ctK*AE`tD]jj]ֵޢ (Vg|V?\!`#|^@2XIhR?8Krڑ"kΗq^{*wG&. 4w\<%詩&IodQqrAC(-⟤})p@&BWme:h?z&5ϲcuaMQG'X0ʙU <?,X |#ȓ_lјxlc |xܭ9z ]2IBE BE&IcJ(xbW)`aK)5)ϟ:KPթ1ܡ h/ȝ.~ڤҦ1P-Y~ؐ< >HQnN3P.s!*vMtQ+"*'C٠s|$jCyjd0b/+%N}5)^ SC >jeP`NbaрrS?;5AC殿*()abU!gi,Q0kq55;K|nf:h 9M xdW@`u&. 2HOXQOt9f2 yY! fTdA)PDB)F4}SQ1V׬VjpusJ/Foc@+/\\3,νraVPA)t aQ0P|tfR -, LMJLrQ ̄DWHӀ"zb5Gs~jjRs4 ~eN <(?du!M ,IqGP;u:-P!Z/N#{NJ3BLPyр8lWSۀv YB@} G_O{1Ϡ<_toṶ̂2tY4z/ZlHZ3"礵7;3IC]3=@|:6HaV!]~c2f N`C;K!@etjl0x bPgY'W=8+< sϨ oӨLTu8ʼq90_7~a~Q> %sN|"CM,r/ p@j(*gSGqL&yX{axMquJ322R ;Sh5Vl;z-ȃKCZ}6ҟPbU: T6pfP"ՍJMYq" 5_*Lt~lOifeʻPtߌi;ŏ*ڭRUTW8Q545S4esE~8$@ Z:gU[!PE+$k!1d2=^v3@8; &+ SB$dN"<i vƀD}[ջ6բP<%T· > Ĵe͓Qw-=GWzaq9I*Hb.iRHXu'b߲M~ }uj1<<4@8y,f]DK=`cQW&p!Ҁ; nG13%%20#bC~6xt3~jvjQۤЏ ^;/1,V62πcgnfyK5vdo*SЧ FXQҀ 3ZW;Nm[zYBB8,G'vZsj &׉k 4YL# nb*yըPY;a\6}E0P8z.K"gw wk.@m3c yF„&j"CȠEN}]viea`;5ٯ3=G#/7S"؃D&ͅ:?Ǣo6 `-8&jKHYkf8|hPݒi8UH O:x> ) {@ x$.b?Y`:9H %ѳ 6_Kc9Sb^D "VWpǝ ( =qÚ;T瘡vOdɆ">. swѡOOVOeQb3G rCjTn|hoqnMTcj8~aRNJ{NLk"%zUT IDAT[j;]XqCbqΡ?q`NuLRc@|?sKӽcϾgSElm%/nb[YoEmcw\nJslm6`BE_ Hr/IM.rٗ/{~o?moo~о'.ɢ9jȳ(~~t7rm5P@R .7g^6OYkFcBPӚĿb}a} #%쳕0J\S絓% %%{,b?.wi[m$gJ^qcXM k}hlfQ֠M0S1xG0ɉ nS 5G-%>VܯnuoA_q9pm2&_T+LI~ָ{~:Yfw0lPrQw_Uz֯>h{W n= h|^& ac)3cĴ{wdrm6wK.-5 L{oZ0~6Ay89^a~#c2e*;_yjxˍPL`;w>B[z:?IOzjf/= }>ie_3@<0mUmiU0`_Fo)g!`"ryr+ U|w.\8QaJ,# 9a6 d(從|ût/1sxMZ3wxxțwnFT\C2/7%DAE m'NQ^D4tƃqm*:l Vᡅ'0ޯ>7t%>#U7<)Mg[}β=X4zAr2zsx|у_ex?.h@Z /3)]~ې[?j~-⒫Zd+./gp!;l0- gYЀd,~ovX& OywSrXcx,_L| N^J9 n̍Y {9=ޅt8KmZbT> ˝81P3o{)gvNa<ܞӸh A6s#:‹*onq6Z6䰡{vqojiE-}vhɦz3|߀9!xyBuG]•c'.'a DG[5֎9DYU[?mbYw}0tK҃="﫬gc?`OxldDm~Mce(tgkPU:`\y/޵A&Lɭ4w?4)"w^>| ҟ{ibs\ ̞D\GJV߶ }UU11; W YZB`D|.&w})3 w%8{kX}>6LTuB\K֋W7t,T!sY6~'DוWnz-žg6#OmK"qq6{qsUߍHϾHbIӃ6o>$_x&9gk[y6?q>asf7Z$ &W;p怴NM"NiyP"Am!6#\tgi4=΀Ό^Pc ,0dRzAk4>bcߗсM{zhvZb͋.ug=ГQ_02?ȋx/`THyCeȕIb9tDAQ6Pӊvc9cNW/ZcQ]uC& 39"Ɇ R #+-ʚ9(s|5Nj;(Op'}rA}b ~F΃[ ޖ7{<@ۿ>vߵ-w ND*/ >n 3r$FmN}N=U}f%[Kn=πٿ*iV: exa@w֨/_rzΎbɒ~ԑ=`Ipd8*V8V+Q)<rGS{t.4jg(/_[ +vtq)X ;7|tdo5eK ZjWnw7tYOar-L@$9-5Xk$N,7FuُP4Esw/`8E/,R?5UĐ7y_)JpHJCG ,yc[{@lGچrrQG_Iz7OUbo7%w%^JuO)>{X9?GQfAu}5lddq)pLK^bl[Ήy6=^X$P;J}K=Ú⟧v >}M}533A((>e>rs_I5R %GLp$~!SrSԲ4+Սck_޷0'w be^'t_}η_ _jP<]ҩl{|xA+u3{rt /ZD^x&ތS~W` 'sړOAoY| w9;ߒ$yq_=2t6PGp4#ײt }\%I˿y>1/Y7.5im;zdI_7ʃW~}[c q|F.u_~k_a/j}!_䗏VZR?#Χ_i:F<_JIENDB`gdalautotest-3.0.4/gdrivers/data/wms/rgba.png0000644003401500001440000003134313614004466020625 0ustar rouaultusersPNG  IHDR>a pHYs  tIME tEXtCommentGDAL-test IDATx}ۖ:n$v5I5h)" 2)eVu{-tTV"pACq,}""Vh|mί8_"rQȋuSP+f?C{x[5Ģ yP^&C7#<}Dh_mޏ%%?z'D'ߢgp#ܻz'{ l|moN` )P-5'GphLk"|C |[_j~[1dM#| *dAd5|=npn >D 0}- i~EEs]x-!PJց/"~$FpU3OfaWR3dqL ݮ E~ =m?O 4 snzJ(ЁPeh0. ['[5hVo0;7>5y50e1h B`'ѣIVHP Ew>RMHvŠ]3,5;3/ϡ/f_$gH΅j0SkEh/^bu }ۤu~gЋ8 h(aC!EC,ɏzn)kNMTd@=l@%@rSc٦SFЖR{h~ju4:NsvpI A!AqEehCJH ]3U3dx>O v_M`rc`HP@dd`؞4',Òp]A'!E:A> ]ѲkO59#!Mv  &in!~-~mWL x>׆k7 *f9'L.P1C#}O|S}rygPOi;BX!0PAXDs ;I7J|,$LTR^% J̷DuʢFηF ~l[nt5@%Ch$h3-@0k]; :m>VGxo$!B֬IzrCd3"Hd9/aW|ε|oqPи$ 3ȰP̀*CꭀϪLD}H jp(lZIύBx\R, dŲ81`K t`Il N2kf^1/`Eݻs] /cy&L6XT,F26b*A kpO X5VY?֬qV_w2 V$=-k'RA/zAE6Є~C,+])jdhK ˄Qp&Dt$'EVK(W'BL׍p,?,ͪDUé[ wM` FHLШ6LZTv_>Ēa̤BM7 d0Xx&^N,G_Ic2Zt0z)j`$- \3R箯/9Nz1$Vց]O@Mo\ 1KRx6F1gkZb$Z)d0F ~xnBWbS?@%@F} k.1Z)߯+)@ fp c: X#gK$F d(=MA11u"gLK$ b Dxm)"VʎƷD3ֺ$8lגϙH`g@k[>MAYZH#MmYow 6Ŋi_ D5@BC(o |QLX^S(Ҭ_w І6j.)kHfB3폄Zxd# U]4xt ",J it*Z ȞIcz]C6= *.:MB \xrE'2ȕh"M!p/$Hwf~}m#KLMFzt%SBɑ\XL&B40辀v)"w,5b}xl z$,sh\x_rC^>|Fe\)JSN09M q+-\ i.7,d((bڝ<sI\BFn@Vi y꓂&aSH-'d0C;kr+R.rӐ%$T^dj* K@HCdva : o~OxХ"r „1e C\3D#i6mr '}aoѓDhI_,Mys w0^v8BD=) `h ȳېr!}d0&<hn**['x*%.aUlD /S&PZ/GWػ*Eox9L_^!\ҟ\P\M\/XB]U=`rpAQ_'-[h H`Dkg0kX[ &!†,ټa`>^ oG(!/9-$|!/9h */9PM@u٤g$h2Hi" d:"WxmZ79Ґ; 7-I! X79)0uf k| Jzx)Kk&@?Z/iS ȋ\ym\r%禸S;NbA*KHzH"aWcLZ< @u93Ʈ(r42̩> nKhi&'x7 ȴUB,*?A6/z!ksi?C 5w үW& ]IA5-f^1^39ѷ,)=: p=Du7 @j|ҟ'|y_.9s!xUqȋgJ|=เ:p!EՓdwwЁoHzՓII S$ǒt@h>BE' ,ӵغs#_= ,!&8 00/nL2k"@}5y A%oL,qr$Kƞ+gKjbMj=x^fbGŬ0w]%%qΦy4|i`,xDT]O6]/&D' ) zAx|U!?W8M̝ ! [cK K,2D-_%naMBȩpytBm%$uLځT4 #jwmZX# &wH!4 a\5L&A^i$_Ug&.`)[R폎nAk oJɷn ]&pȹF_E$NW&IjEALN`H:ت Bhj}">GBxʅ:pTxaKo*` gf=`4oJB05ANz=WHik_0nZ];x#Ձ["3~a|5ѣn9 _?a?yʅyKC:hl _b# t-@!0ΠKUgk$H5ӄjVŮ]9@fYIsm@qOM4&zնQT]2w :ģ䀥DʉA.IrǸ$,wc?Q1KPkw-b>@,U!hM<*2hS Ôc24͂ȉM8N"އ3sq)$!CSX)/h5 ,]htG% |aﱀ/3 LBK  <xߩ "p`>WL'P=Ea PHy+?5gfyT7I#y GTH)t"X2{( DF?_:ZQ7y?r9IE3 u\rR#@ Gf46Ѹ@BɟkƂ+{`XLF`YE;h+ 39kj-`DLR zoB(!2}У iOt+U}:!Q0a6&;֌j3;B t @ HhH Q=}+5zZ-4M-ȶlڮ[â9EX 5h3<~>y'~~þ?xuE3/0ijK~ !t4Q5x%[郆J1P:&j4׉酋V>\`]LC`ԋA ƄXfmD8e X4@ 49%_EYJ>_3 6(6q O<*iDD'^Q򿋱K,(I%g%AzZTp A rji&B+r> 9E/ZB&FHޥ?}`'%:QDÉ6AC'OU0(kBnWH {` }P Jk=8bq}es,ޣd sXOlɆޥ%`H}aA?s-zu pgoL-D-;zJFzz$$L%HȘN՜@+NVYڷ̣Y&^`Bk[wNtGuxmxut0/;m#mN-~h~A@UMw'آqYIDATf=&IO: 3O^#@Vlnld`Ib+o$GC\rDPFX>^,p6.Zj ~:]8Z-H@+~I]buyi#{ٕ&p@]Gs (D%ٴd0T9~Z~}sNL!JZk %lKFMheYz$vbB#$Gia?5\+տ*5{h|?6fo|aQLF6 Euv(ۚ 3rHTGK  'FsSKr{AwuC@׬Y_%ǠnU)8]: ] ʲ:yѥ>!ݟ>AU~u}^YG\x*Ś]&G\Q(Z /k8p/rH U>@L椚S>zWvL˚ak7Q>n{߫}_r?OUrZ9q&,6|)cbekp*yl;V2vz1芜@s`Eώuu"95ƺX/ہywl^l䏅ćDwPJ(پZeN qvygM(w:c#YcL)FVلs U}f7ic)0FE9zΡ$Ԍp3k5@k0@skrH^J= x-C\@*?3GV>"r?͗uSilͪc;Db ?cAs)3Nj!H Z)b(K|;3Lw G@zyOHyI5V|,Oe<3iAOߙen}FƠ]ʳ7B}5 I Q)mݛLanMn6U6Iv (HM)سBƂFyX⬞)4zF:-vӮjFl=H~\N# ~; Ɩyy:1d_bl t72ͪhcQ64?xh*?R#5ܫ_?K]Mʑ L ٺ.5v/w;{M͢:QQ)u,[9h&cY쥂~+5-FEA&~.ݡq,5WGaaV"!^'Da+4Уڴi%:ywƊ𫭯tj5 V}3 CJ~\ʼN(F:G}{_ح5Sqpe\%xjeRz *D̮Leo_5 v[_EB!?Kr%;h՚`Z*0M)-Wsrq,gu1m`NQ]|j?@( zcH6y9b-pl 9Fp` eeXWUl6K}o*YR5]C=TǨ`L:41Q}_ -(X.O ) :%;$ 8ؗ x[Υ(qXצMhYsH}]E,uqM,anu޻Ǻؤs[eӆ!>e޹+ (2ԄdjeqG )GچEkœKRϲUMJ8˼|^&_Gu i'ܽP1 (>?; d^pOvSYR^J:[OGϫz:y9ۇy=l,<U/3xP]es1ν^ƫn2H{"TX>͊ JzϝDX є<[ Q Ow4>e4 "ovt(bY3 Q4mplpLތ@ fNG$4FfтYM6\* 5: t!lA(G19.9'g`L? vc0-:v"fnN1n8^|7Et" c^aDG: 9OqF9,L!.capv>i6M2Qq,o["l0m;tS20:7v[ǦYb'xYEa\ q0x+5_8r}oNe:e.@8tulv#y?T ah:^fs)ݵ#HKʞ3f\2 ئl.xܗ菧:|J^ !o7QĢ%Sy8O{ 6owjOeq'ۥ;`/d[I3O%qAߦ4*dfml)T̚B1_k.NOc(2m[=AU8luBER#eqlI^ ;c)ެ$ŀ~oIfc.v}H-#avP&A.. X2PzWW KfYnH%;=+7DBd*,|;">)޽;V儐4%<,Jꎟ#>%_p][b QĻDw@veu~KOۣ~ge⽤s\ODXb{ll#} r*ZO "ܘBcT_L 5'tvscx[ŇVYY_C(9ba`ԥޚ@?M$+Nalldor!÷@U{QRހ mM(:Xґjm:i5ɱLZCe@,Ş@"MOaʹ@zރ R> mΑ}"gvC(ϜF8L9ђ$;T w?o Qtjo2ɗۃ'&@/ O 8y]X6lb~`*8u Pzw2\nd 1L l4qG@+a>}ng ln5F9kΤ eݽ1ҫêďmesx n9a |/A[`˶R0 9&R(>U6QqdzS-/w-P܎; v }1h2r|C|O6EME%B5jGt;m蟐8x\4ķ*(׸Q|{B w%{*¥l\85κx=!&b>nAۗdh7OK3Ț3p}I;mPv|ݻ0f+fǯnSR)I)o|҉m|O~'2m0'o $YitFg'Oyy70!A+|| iC= >`w0oU.;){g@ypHp^lavU)I>w~o >ww!7yJ?ewV^f,OM6ύЍ^>n*u}o`?0 cs6nM7&( Vms '&Rvc|I/ܟ4,{ދsS7S?u.yΟ;?pO 4MnM[| ȗX5bD$` CYWNE8.i_>D[<?!o>\l>OrhoI~{;"fbϓkJCXS4b|w>{OE'S ?4r &p/Mh$Iz0܅4bچD}V%2BOJ!w>zw@ J>;[J;" #V871!\7R+M =HDk!v t0!),|ߘU<ܜ?A7NJ/Ȱ$Ý+7jS` 2h?0Yh&O| ~/H[]ZxMx_Topg ~?4ܓ_`$7ɡTF|%ѩT6: $_ə|"~WFI.?x-MC?IԷsk*3[>ݿn&ZIENDB`gdalautotest-3.0.4/gdrivers/data/wms/gray+alpha.png0000644003401500001440000002144013614004466021732 0ustar rouaultusersPNG  IHDRi7@ pHYs  tIME .^BkGtEXtCommentGDAL-test IDATxڥ]ۖ$j@={JeuoU)⟙ghfd$ D $Iov}?g/}a4(~kK[|X|}?]?zF}~R_z3)NeS %''<_> > WSW;>R\EG ) ӧDBD,(}:uL?IN1(gYq|x޲:!{q2K rZnhe0MŢAL!0x--46w&<ȱrDbde4In&wF`4106[Ҵ\2Dw7!)t~|?oKA.~M^jR%Ip:qwat9\fmpFs :Qp6NEQ%rMy=P1E"X|zDA)n\N6p8Ǫ9=Tkt=Q' ` -^.3K|ȩXDw҆˱aXI}ݶ|r%$ksSj-w饘_h@,%<l#m=@#Jp6͕"e})qU,CiB? @H AJr0-#O#%g @f.@ib&Erq)"k9*(ދ^|?h\L) iLgmm stInH+DP~IaZx!2khu #0Z" [ c9rE;?;+k9c)å/A) "@b4k!puZ!<؊)6 IR($r9 b/Lp+˶pZSnAIp& a* 2L3wn۾Hhkk=4K*ŰO,>?ցKx!ߎ7豧|96dnn.E $'a>.Beb7sc3XC W,5?28;(fO`?+ı"b+MV/6vdžF`dg5!HfNH-r67s}NgX``ēPZzqCUց!E09TJIf}3yrF;rŽxAI _\ $dSu?z h GO+LNETD8QBHX$M& ЅYul?y @x0,}e<"L42`SJP26V ʮ%yٌk C!BaXŃ‚">SjMX~mk.0&A3R Rƥ%]$ ?RK D]&:@tJNpZ^ ‚`@J;j(~I&P:u :tk8c .+-eaLX=( Sθ!AwO$+#fdP4HyL\&x[6ӡw2T m:BC(*Г0r'.H|v |]bK#U+K">`Ba ~uUh@"2 H_l̽y(R<ͰpLp=@S tXJ 4;g:j8d"q6b"Xi$< fZUR,Rp1˿c VAD!@3W(O dzAPehB;8޹Wf"%a*;3ZJmBلEAGQnX%29+H >}rGyn2gd9Y[È 0. Nܞj2,Pc;""8f4R MW~8'ω)mL0/K60d˻2JU28S:f&LBɚ˴:1@8'OaQM,)LSh,$=sY=^(0؋ܥ*—d7d{ h<7kzJ~(v1 Y54sÏ/0ÔA6d$`q[ C*s+A1)XӴq:uBQ+B"sqXėaw‹ԐD & s]{{ǺFxQ8>J";HU󌡌|Ӯ׎@w=ӭ:9Ֆ aDYE7rCXTtwȃʆv2'!z{nn'3)h$+I Pyf`hp_BF* A0Ka<1AD3%@sU2.x KDejU &KyX ڱ|?, N%&D?"Ȝ1c 8zra@W6y_VKsR9!2ځMYWGui0LBnG'.rS\ 8!-3ayك+Jㄧ!xE [DLd)'g#? QW8T5UlF*پ el;(a {W V 0I $ϭ * zr9' 9W ^u3 xHT5җ^>#h>1(6!)Y`i "GB3TpMr-TQӗ/#@Z鏊MYwIs6}TVlr+ ˗?rnL&n$B8ʁN75[c<! |0#.p9x.3;/Xs[ 60 Mu顐'} ,G9B$Ŏ.pEF&FY_[pr Ixqp dGrX\fHfVBj|]*OڇRyY-L@<|TEi.T%xX e{fC2X]Ef̩> maYcp>*3DP0H81cɶYl#an"$0NWZ/#\MoǕ64MXJT$ǺdIʲ. hmJ{E 9~<:}NNs *M ׄ<uTH#.vڈGN ˔'>mZujzu #: U]-V`:;!DGArWA45t ىc :\܍N6^ Q&1h gVbNf0S'2)@`FqFb繊wAx0:ëx|#:>. "$-ɫO9qJ@$ן|K?zꤵF3wkD5B~XG/͗J fB?@.:GwEsfDcUoO$bВW:/ھ#U@*69ծYS$>ԹYH9%iQr_>m>YW=$f@tPc2k{F1Pg{{^t*hFFK/A*e.pԃ1ìP'Fϋև}ŅkJ;%CI"ǽ:j3-Ee-"[b x~yc2@@^rBWzDAy "0m-$3*[:ACq4ϯ٧q ^q:/ 'XUN<䎌4\/KP_t}4+2z|2OM09/,]k@ϢUg5Dr}¸vm\ ֣`J5L-d3 enbVVd,*?#,aEAp <a3KO6A @w=6s`V (h:4ZD.!$A칣=%[Sv衋IW"jə@P&̎FW .dH\"HA(OwM\)uk@bsfDWB/> QbB~͠lDStA37kUKͥQG#mgr̡ c-ߡ'/Z>hIPAPɋGNw8S߁}^0H]PBԼe/uq-p9EHci*Mk~Lz,ݺo&`b.IRLX(|$^n,4`Wruiƕi1I]@2{5Y'. otu3 `w X?C|!:1JwsV,s]A_3OЭ[{](DVOoGJ6ȸݫEI!4yq_#kXݵ>R%=C#CdZ5/V U@6(firF129: *Bվr<# /7ftq{G=hIDBTmS5)ЀhZN8TU| TޓxJ@n#,Roq08X׆~6c[=_ h$Mci#y#ܷ\y^My\ a;aQsָ }$PꮕfOz/l{FH_" 0W8:L7xq^tdQ=FuV)(;&E^_1D"BPga1",|gtFkTea!؞sSaRaa&1e Z뻪Ѳ1" JkY3,ߊ^Z=LR5뢭g6n"FN7 W U*oqR<ʌyW3EpzQVl X|D_)HDlIS!8=κMsJ=2U͇<|9բW==|d5,ݓ!`y<" p8Jfs%گ?_2dь37acKƢ|`*,Yࢅ {=vt>5|NNљI15v.&Jiqr،"ȣ.q&c LUv9h=̤_-^ۆ3/4zV=7_kcq]C105pSek3Zzu5 X)L/ wV}:3E*r, ':3P،9-=ԫ uңҀ,`ALyo}kdJ@<~PL8,pbЗ9f+(=jBkr7c8[V[ӃVidǍheܵl6{L=fb%^B@ TSL/ic ,#q3ʃ5t6O5`?/^\S>a˰$bg`Jc}f0nsj`,M_p6cOP]N,G5Z=h:9cpca_/7ӫnaq͍x Oe?h#gGu:BN aCêq?Vd~?m|h̗0%bs>X) t(:ӑKs|ÍlBcM!)RbX9>b xьcң'qn..~KF]pNG<`2Fe\YުnYYI+spڵtgQٰxSԾAw ^ v9C hƍ?VZ.Jů{5nQJP @q:{t fG!B|ꀗp/$~'rGh\\tl.lnL[k+<_knE}Ux[FhsΨxW wXE1T &Yޭխj@Lc+3z9K} ^/oF~ݘUȧܵyAw1!Т9;;&fe>Qt?n`Qe-| Ƃ o\'T;N^]m a@VNM>tEm.}.~88%is>{T|$Pw(3*岥{BQ/g/.({vovBحgضw:™.pvHx:[!TYh2)K8|dRԉ9x[>%&k7X>ZEriبWg#&o:q#uU+-˱땏ο@}Է(%fOtO6ߵ ̎` ( {Mʘ:g#U#&͝)l ӛߣ*z0N{Dn7#^ìv}.gۭAs 7OCi)}cj口l|_@G9g%^}%oO Ƒ;KM:>K[ ]դ=IDAT̮A Rs㼹N\S@_ K5ܾ&VX}9 ;XD-XռYDQ,.,(N {tX׭in;jNbGpNAQ\aT)7$ŔdĀ;WcM:|Kr .m {>@}S2=, PIyF摊/Z/=PoTh})nXhtk{ y\@!2e=o_S VyǴv! ŐD\.!:7w/~c^N)8iwu+<9=t|)'\6.˞e@Ffg grlL8K(} >nO VߟIfu] P }1*A[rd{)PWEE)1ڪkTG_,?kHPw"2Nj29g3F_#Iy5v<9I s_Kl64`oa]9.L>n, rXһs" @@sPE/ @@#ZS(D`JӊBН]sԥLW @@vφԣO!؇H`fffuHQ$PJLuj$LB  u@0qIIENDB`gdalautotest-3.0.4/gdrivers/data/tiledb_array/0000755003401500001440000000000013614005402021022 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/tiledb_array/__lock.tdb0000755003401500001440000000000013614004466022745 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/tiledb_array/__array_schema.tdb0000755003401500001440000000026613614004466024471 0ustar rouaultusers^^xcbu@DH $ dxN~. @$X H:bc!rB\}B] 2gdalautotest-3.0.4/gdrivers/data/tiledb_array/tiledb_array.tdb.aux.xml0000755003401500001440000000243013614005402025553 0ustar rouaultusers PROJCS["NAD27 / UTM zone 16N",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",-87],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","26716"]] 4.4465000000000000e+05, 1.0000000000000000e+01, 0.0000000000000000e+00, 4.6405100000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+01 GZIP 1 8 699 929 Area 1 (unitless) 72 72 gdalautotest-3.0.4/gdrivers/data/tiledb_array/__99b96dee99e8415ea23d6e0e52843a7d_1556650358803/0000755003401500001440000000000013614004466027351 5ustar rouaultusers././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/tiledb_array/__99b96dee99e8415ea23d6e0e52843a7d_1556650358803/TDB_VALUES.tdbgdalautotest-3.0.4/gdrivers/data/tiledb_array/__99b96dee99e8415ea23d6e0e52843a7d_1556650358803/TDB_V0000755003401500001440000171756213614004466030220 0ustar rouaultusersmmxkX3M3E7E !c `B ZB 6B!HFcclclcc*RUTU:Nwek{瞗g~|?㧥6\\I$}Wx-(hbXWVY\'dyP/{j= `Vye Z4BtRqI` , F۶+Jɼj|d4ձBT)FH*Mpc)F9$VEubӥ1ʣs6`I0 kIuTs&c"RJA]*j|xGf[ 4r?q^(|PHY :MQlIQcGg'^!*a4Kϑ*b5Qs׸ļ:->&|_c)}bU@1V:PnDyt f6 Q hSX Vw:5L^BkO\P%*8ySӆ[j55u=49-7b]24k=ZQΥPӆ>έC;M$B͖+]c^ZBx@q ▇ONEU$F^&QQiKt p%M2JӰJVۃiTuU*}wpT/J}$[-2HaW7wê$@}өX(y>K.ePBJsܹX'}ƥ-.]]-Riq3J+.3OP8 BrSlFΡxNgh@qHr dX$J܈ojgTCkjILP_g)y\HHfAML1iBŸdYpu.gT`C:7O掁Æ^Izr;,coӁO.T1MY(8;Y*MtdH^P"cT68Y+5I/n$ +GZ:-%?m3 K!vRJ(0B[pqhTuE!I(+OA:Zࣶlx;݊sLx2fbJV/T nyE{}xF&MU,4'O 24rSkY l`Pcaw jy-*IXDKG?ŇwP~JvsxCXUEp@`~ gs%A{!{FTV҂.$b@V5# ά+>U{K sNOM0.^;JoV!dg?P)u0g9R9 Ke72Y0$t?_&7HLd)\}Yk\28<ƄkBuGϮrJH.C@bQpA>JjXI&jXf\Y5׮8Eʲ(R]ӳ"7 ߆ 9QCL±:vw ^ꁲ%XHO[E=Y8PiჅ ٞs6XZ;qhYSX_Km$ h_wX"e"8K&"u,ksW7HޗJ!n#:~ׯ JcPK{eSXH`h02IR2;klD<6WƄ$`[٤ݖսâxah+qO4EeģxC {ޒqq@:dzZ4Lw߼' #yBN,Nl@>2֢)M(BG88#Iä-mOgn=.LI8_ayAX8Rq0 q*n>c[dlL–XͺOMR5$uiY!RtFre-(=_al^M~%jpIsԧq!?K{QV7^;ᡔx()D BҸKBշ+G'gZ%/?^\m)ZdrF02dU$lj!ǧd4smQF\֓D( *֭&z_Ze)1cVA~nR6nFӅ. H(Ч厧_4 yh)v"q~/vs1ղ85 ٍ/-!2MҦzAW_llJQ2/nD[5\ڥ\$f [' Dy{U%2U U7gьPeX Jڏrk 2n\NK64E#u?Z[KM'-`SLU ǿyɸyS'wG[*~mvp>v|b:FF~մy%QR"t|lYaxP V?Gecg25hय़yQ~]qàyJt1x*#:Ye-6؜R%V?fi(G$"$f)Ίu(_vc:&vD۲,ZͣiGӚ Rʱ;ǭTAX.yU)OBϹi>.@^kB=k5LkUe5 6{a;_`ewWbSqXaU|4k\ li||:o͵Pj=v3϶'-4ShH8ndr;,L5qAJ?G]~$📟VИ6K,FQpe!oz_i mJ[էsmik2r؄+OZ"1nЫ^* |"> RJ|'~&VO_~onjp˫A_f8YYO$`MKN'GR"q~efP{̛JQ:Q\h{@لSF2]巂:}5cT _ݾSk:^jIē)ͷz9šƚ EX:|bpkTD_}{ݷ鬒|r-9و\s,|MU'_~N*(l.%d)e??Մh0q9pc9Z׬盬5LZQXj˔Xto^˯JcrײfO4[ףf>b{gcy[8MLP-rhZUU~óo/!:ڤY?~*$'o>h`x Q [Q7r޻{'燅]55)Ձ`\7SnE \ *WƊwI|zgM|s[j4yy'EI+=yB(Y)2}}D['2RB8?,Zx`9홼:$갻<%뮪H=[wp7_NVA9 V9ܤ'#Z~~rq[Lǻa.0 ⷟_]gW~{b)N6YR!arG@r}V(-(WRRd+i|w cbK"oQfLLJ)Մ^S枍A!?wn>t4P!0 ߞY+U?MNAOV`e֟FCDݎw;URY2>uh٘4{*ayNQyv|l\ utㅥ\]^rJoy%F2+/N-V˙< џ{?}dj廻_oz49I"I^'JEjgڨ ,۠q7ŋ*ڤ Φa}hqGRZ`ڍX望24Sb.͈Ƌ Cfl,ʊ03u4q=-nns*fdMEEo}:>zwAخ[`4Kә+ll"$W{x;tw< (MWGS_݆EsN|Eˬrցh#MmV497NSpo0ywݛAnȄ [FtVDDay=l嬧sbCRkۗ;I`4Rb ,tNf"idMa/a-%5P X,HfHq Y_ze`D~ X|خ$p:¢M\P`8 XgYT`Ъl6LQ qnaq /QWvh][&ޣ7Ny#[nv9+ɇ0HkEQK g5~e69YWjsԎBita2]:NQɰ7~ P8`_Y(ߝ8$qY`\U x-},Cxe<ӂij׹7˫h&OyOylqO- 1|o,Z#]Mʠ4Lo^oQ8CZ`x_]ד{ PYivͶbzrtyՎs=uY4s-Xlp7Ϫ\(*mROJsB]R מ!) 0YAt? Uct$~Ӑt a؀\/6=.'p3{g?&/|m*5'WU ~VfXq#^"a9˓QÝi`^w7 Hfx8W>?-Vm |8xL[N-e[N{QYa6{5N^^imky &Rx M)K Aqȩ bZIRn2%ۋmƃ,Kn`2)\*FFn^I?y/[/4 ~q_*clLR C)hkuv<;/$ vF _-]15YtjuG e"2+TrK8ʾA`H=xg˻|;'~ڬm!YT?‰츑g"Z,n4VJ-.MɍZu:3c%㕝[ZD.%YUeP{ t6,Jro 74BE/LCO5h1]`~\t;Z?-0fTxƧKxMm"3J^Z[7Wؠ`K ؔa.ϓí69mZ0 7cE1 OTܺxŧWU|5+uJ\4 (4 5B,$_a,yPc-2 ^K/g:ptNa~{&ˍBZseRmyQ=0}e^^kL<n__vΏ\=$4xֹ/H#msԀ"<~a|.&Qф"G8 ٬Leީ#QA;FkjnKZa6r#fí~3ʯ%ި;ub!RxƐQbIi ZU#3rY$FHŒq9ުԋ(+Q왑#t[YlCs_ O.>VAP2fPsً^LmgV@^ńzN.XfkxPo3ZDӹ!]g͆5~ 3( !,_7&6b(+Zš?ϣƴ X*kk "ŁIQX"݃<>$`3\6br Q_dNaoi(aBQcg~|_@2FX*+aJhv_.d Ȭը`(~{dWV^hʸ07NSDU8srJs ?3XwI "&7‹_-ʽB}5wFB\gq슊t ,w~tD+I I'hp@ J1Dv3 fAγО'n4|&+[ZW,RK8;Z Y~s;?oT 3) FryL(hK4In{ͫ7Q8D+sj{=LSmaa(0O"t>9Y8Q<xԷDgş"jUt!a`Cv R)ɤF//PѴS)ixn+82:{v[ ѱ(3?ݶ6ݮip>g}T:e `ܭG// .}xiJe~uϱ7 iq?E[V]7ժD<2A4N {nG"N) Rd˜#:+T 6, 5%׳JNg :۝L9xFZV&N 0.2$FZȧVB{+ƻDAO-I%9**VU?YwǞQrG^)}md?T[|a'1JX8P8$B<_^}6e+ּ̈jL 4w dkyo)@sYM_w gB\ b3T.&E;[Kᢙ܁x9qU~uI/Dz_oUՎ&ׯ_|xl6ijYU0o'^z_K ȻoƵm}|5F?~c)ܝ5,+r(o \Kfiynލ? 198cNomq%k,e1$3dè&YbK"+W Ahe~p@1 gslNDKX?}~=j} 0dvZ, ~@^<~^^VÖ ETaεUMŠH%GטzRթf>1`(%}U)h^wW{r 4o:lݲ F;tJ$CLz(H)v~%Qٙ\zuB\O|;$zb`m 4e70yulOz}%(%N{5 L3-]*uEdF?;Ddh)b.&~ IoY+/& Ϭ/#hluθ(ŕ7=oKCD-uMI:8^fdRd'I^T'aT߼(T_?pIyo&WLg_}^D( IT(B|n:/qg~Umd/jGNYsGr~fpˆ<ِ4߰\dK%<I,%::^&!v)y<*ObiS\g?7nYƖ?eڋ/RH{Z7O#t7h v#_Ų1si#g×Cz78iWUB3D|Ae-xd{#Vy3^-wuIͣ$+6N^s|Jp.= ?odVP SM0֜:':]Hq^s=\rDok8j9*0.MZ{|Gq)zXn\߈<efdz$1Pb4_RbU7}|䲉J\* |8է<Α B.H6z֮[~rIfN$3<3݅Q;oYJ:ܾ;n+u>ܼ9."37bX(zר͵iv+lz&JئRRʍNq0u7etZj&c IH6ϳhjU\'<%:Ooڸ%~2{t+N8k vXϼyXi >JWl 0jEUBw? ~v_=埾x_˧Aa\i5*l^1n vkr8V7>4IUZL_};`4 6Jiη[q!&#T~ܮIb89rr {+su`Q32iE_lzzx{^e_xIQuY,U˔Ztfd46+._xjmӹd1:b~Ԗ4I/]:јb񏩍"r~t/w/'j MJi4E͒hj`yJ`ݖ]J(w߽z}twK){Q7z]Ѹbu9i?b>*bxZ̳ |a[5k;p7,.8 j{;8;Q;vɋ;ۃRo5a+³tcn tɵhJ!&?+ i"O#`uxw@⺇?$rckQ͇0->@ 4{ՙ+\}{^3~iP0~po.yl"E,+^}zMv?ڳx~9t.gB˖lҍsLƽJhdǣG3-~؍,VAמY2U*a[Jš㔺*F7lr['As(#<P^l`yuCu5W"KʣMmoʆcڝ'hj/LjVXw+Tnj,-͢ ;~9"[vK6+( )AdPH5|PZ4iP5#9fõ¸TdU &4.mݾ|jg~zfjF"}qeL6L\jFmޙ먾{zȷ E}I bm K*Ri<uV(/0 U)`ӫsdNv/Vio-9yְir-T)pJѫ֬ڵKvTOlCL^[zmR-0eEdt܉;dTŝt d@/^]0xH<7srF$+vvx`Ta)DsAGh'Òn#R.Na,D1qi!^Zs mCZ@C1BmB@ B $Bc$$~Ź4mڦe:Lfs9g;}̙_${y#_޽;?<ahDj" &U7XDa(d>=!'# Q(И'!cdZt~XPݕ@2B$p:%N̰[6]?M)V]>T:A-[+q$hFPExpO0 E($RH7i܋\m1ʦ)_}?Oz RI荒93Чg "Ҭ/[]H Ğ:IN C r`@-i!h[f>c!%,9SߐPޤ*&fJi:\} 1qt9KiD$G 0L` @@"rOBMhM3P|s|5TrVzCU 3-p)_.3 vH2e{~z/}q ҹu#]B:$͚2G(qrGq6YiJ!IVhuMVi͛4V1^y ZBH@,7M |IIj)X([ټ˻6 _~.Bdq<5 d.*'E1,|t @QaU %hMrЫׅ%oc.Te|a~o߾ۏ|W CN3IRxPLo&t4tO%N|E@{Zf,H1Q"$'[VCI#H3UR|)D9%lOJTɶa(yڱ"崨?3nzbxW F1*dHF>m? " >AAgyIl~{5?cX|9{wϿ}GDǚʈUNL% 85Z)F2F V0c _X>`` ~Wd<ጐMI~Ƞ!* NKه5SEr|*:BJ_}mgmHkT&cgMO@a&h7bA P"&*0COƯ&p"Ip_3\`#VUWkV^Ds)0;90lm 4"rAKI&`NfӶ^p\^"I S:a ?5K% $qm|Em)n`jkRzU,Xb9b{9Hcs"KQ2IX|Ga1MadrPF,@IѢ0X$3 Q<|y9D9_h:c퀀lRPTLb=qr1V !l<{ihHix:" EvCA:eކ'vX~hVh,}g~, $~ 8`(@"_HETbc8M l9-cTTO6ΊG?~wq=.Owvͧ= 4'Ic fjL ٶ2uK|,s6%[i_mx<r*e7Ehrٸ*kNaWcFtgqTJpYkB ŒOX!I$ +[Fq=e_iDiP~ykYE3_b$5mQnC(i:xR%y;FOl59!z9' 93m5*׌$i1|2aτf{ǸK9[,A+F1i}CX!YL0ޫZTɗ-Nђ#ղ: 3-BSo TK, CI (&g53oSL 2rix#T%+M6*UVH9Ç@P*~O@@ʠ9+퐑@I9n_|1I+0KUQ+fLU*@D\E#[VFQ4H+>"u/^D91_Bnpo#4׮{h"(_s AdT+!&#y& ^lfIEkhFEiy +[up{6H{dS !BQ\y$ Fڷ/OJx͑ ?>IATq.vJ}k}DVBܓ{ưhl؊Yu=bUQֻ &Vn+kՅz MQ8`4gJ|O1ը>E&3|̶&18,=&a8X 4q!zqP7ܞ.vח9ݯ)RB(v("نN 4}aKȯnV|ҳjmWda:aV<͚gJ7Spabr.˦ٙBP^Z=*~_~ť4.G8 睾KY΋OϮv.[W,"fYsH:J}Z2\BbWSj0ḚBHP[E&A3m7ANDM͕;ʭq[0Uʼr׮6#+d]=·Ǐ?wJ]9pFH2@{~fogd]Om~޸Ys\`FW%3΀i\|RBIjgJ!ҞFZ7gW? #02elgO\- Gm?[AHX%Bp:C\yfP2Dg|.ol,YPZƑ2业Xcγa't=#yVO@h Jgn;;01ݨ1?ݘ/mkkù=oL,m]1fṅ_llH_ ,S2s6xRH A9]/\-ٌf}Le55] lKY1G5K;{U Bbք[Idݪ4`HiܓG )|:(59XFwq^OgsL-(%A8k RKJk JhJ=beSmڗ'{Y?N7k^Of4?lL';Wt7q'*zaB!QbLE-T;ac{)p" N0C8.0Q %0eiIzJn@~^RN;tZbVVsnu7 x~]~Pt{h*G`qpe$rWLD0^w{y=`+*!ƃ#k^J5!CnA[k`N(W"zŇ1h eЮ ܙ|کu"iZ݅p`Kd AVBUDX&eFd GV ,(c j:n~OX=Y_2r.w33םש8cqeHEI%eV\m`$ vVH׽lb&ETix Ӎkq-WjצKOm{dE7 'u4PDžN`2+6mdmfZ0}:#_R!ИsTl~H( f\*;=H3.EU^9|ufs,M*E;h=eJZ HU0+pحb$0Yj<ȭ G6 etE|>m?8ؘ̟̺լTtYL*bit>ʔb7ݫ_-#$dbO`kqV,fy5IEWEH2)RγBA:'Qg }zst)A[`Z0ZR\('SnOwneCj% d$5,+8!C0z/#\q|}R W…r'?eE ?е*Nyhl=v8/V^ޜ}$Le8qGAWW53=-thhw:zM6e?H%OV^SڎVNoz1zz{޼y}QTԼ*CץLYC[G{yNpeΕҡbLper6۟`S9QӭR &3_K^stQnotubk$ 4AquoQϞ(BQÕLMBw "d YKC=ݟ̟N{o[Um*뢒}`.\s>|Yh<s=˹g.i?>dTS:vɁ^+ePVDbg5S;ŤvUU$,+Jo|%{}{ڵA]7N w"jzH*gy| *O΍nw2hĜ}1U6;iA]5ן>*t=+6{g=d .K]}L xI-`ėuH -e}7.<3< ""lqƸZbgNIPt,I?^:[NąhA=Y@1ʈX8Re4m|QI0٨KJ-Vrikfs|Qh% |wJ6:ʩ* s*˿׽@i'FJ/k=.j44力}ѥtW8%i5h0 wۋ뺓V(`HYa .><R!+ 5=i,7d߭>՝X&ya]/'@~ e 3#'rחhUek0=Mxߗ;b}ǫJ0Gox^E9E,1A߆R1U_cTWRkZXAv/Ӆk`1DZgengE;I(W>=۝T2D4h=5 +ikc j IIRrZ8AY f+RŪS4$^PU8VkzS_4)R;kZT@I28!\VOnQf,XdAT㉋?~W7߈4 4Oۂns` "Ok"+#Yve-0qU#TK3=!"I*qX{Uqk{wC~U9-ČrkĜ,ɂE&G;1s=:2tƢڤ̮O|sU)UEH"R\lLsՌn%4A j^!!)|ǡG |~ڠJ{V{OF9T[e&s%~ZV#?'u:ybbk2,Mvx6VqV09TotzJ@vѤvkB i`] ryj3F-TȔ\fʅpj~nrMd&Щ^\I=.7S9jF31*N!s!AJJ~!SuA7 Q?g λ-X477Ï=P>?l")AT6666kg68JjeL)^/dOZ#m?DD1 l^xCdTi1yAAaɡw9H)N'b6 " \SUbF;\0L=Ö3lS>KxyZ7#(#jݦAY0URUC!)" *=.7_lbG&:|}ud6 'S"<]iRCb5AGgQSY +(% Hgt|q̒]hO&a *^>~ߞ A[$J+q_4qYF]uf7~rtAɗic% MFQ1j+OfJ&" Yd2{ *bk(S2X5+Qm1{<#󄒘Qz&3ݼ޿>Hwgv'BcqV2'xK4 T\]yR&Wy*i+y i*0*L̛"Yw3ág9KH\RRQv뫪,YiYAW_0KE &$J0U=Q E 0}!.\vO|wc?FVR2>.#Ill[ӛo.o!~4AeGxwtt+cH^ޝUj^`cPѦ XX"ƚ^fpAX'^9It7c r]bE d:^y^57S*]X{ VWyHUhIl)9-?^ 8!W"3Wzrk vr꽚CIxkx|4.)KY_z/F1 GwǙW=b) PAetgk|iژ|+G$ޭ =5, LNKi,̃}ۥTW*ȴbHZ:kRKY"($_. fƗd}n*rG NeRf%Ab iv[ꧡbۓwu6sd"=wLkf"J8nH&D.B["[wrĹ_ig&0P(S"e . ZZ-;x(3y;Ev A$Tky_iQ-lf9 y!(Gh8P s2MRk,?pfFm.ߵ j~&oq~cN‘RQ({y)ލ \߬۩55dptqvCC˓nD2}I$-Fu;xJtP)//9~wb8\uΑɘX"jx1/%Gb47y?ԪB/ۙTZ%DY& $8ް%!1/ު[_ 4be51JKTA@y2=E|wʼn`qŊsպe |[68Ek99mmU0a9Qm>;g=>;=\YAJ%d癇ݮDARP K&FG*JZ8 *ZU:8rIp=Ys|Z,w2)(M eAiӰS(K٬DJ?<}!Hc`aU3Lٞu"H:-Rn1pM>YvU^O"wdbF/mlQiƁf-@q&"޾QVvF]`Ci#ܧjM UuD ×/[L䒯57nghJ HtP Fj̢e6cp@Y#j9K1*b6oyQn6:'mOu6shv6L-S\XZ/M-(ɦН}h[['o}YkDT0hq5TRV9N`Q3W>`y8 ci*/3{OqvnT4N;EIʦܴ0slpE2J:"dWֺW,_4JXt.ߌllj4q`YDRn1&…m|*%$\ofV HgggjVggq OZ=x= ,P.M,23=i-;7]743{[[As=*XIp+֘1NοMdĠ-keߧ38mMڵغLEp6sȆOWFN *.1dؘzxGq!4U>hݮkfMTl-4K1>'v-5e+{ȝ]~C8x5EkmCU|rmwQ2J88n븺n&QIQ=+[9"STUlo^F{tzg<%-:z/bt"RҤ?JYq)?|b6nzy'F*o6)58vkPvTOK/`-r'wJvfڶV?h84F|6_h[6%x ;7}Ac @2(<99_9ڙ_o)v@PJ*+׳ xhh:4ϣΦiZ/Gۏ?]<>x;_~~N! BCdn~ɐ@#` }}˶{n-Nubݖ\N_:Dx1̃pYvpoHEݯz]W㺧s8'AVF廙}U0DF=&ز3b͢k7OG?%' #Q{q^%cRs\kVJo%b.wwGWts>w z+_nGRfAӋdͯΦG}gTM8nrd& w<0K ;Xg͛Q7 R<7!c$"OףaHYG5hl4:Zf~@ֹ'@PBz( au @?l@$a4O!bsޭxp:bW*]~a3_\mL{,SK43JHW%Qe=M"U8z q5QQ4A,T óυ'7;p)wRZayef q]Bhplq̯S1[;Ǘ÷XaR^Gjz8K+xfa>9-A8l<>9o׆NgzkXgV򆣩8!e7%pGi$UnatB&XRsF*)dqɳ^tgWr~Sפ.O,YɶUtr OP<=Ok!o_Ⱦz1 W$ P&՛_dۜΊ'ٻܙԲ(1O@P(6ѿ8Qb0$ W̳g)Uʽgo@N^Nvt=|u dwVFRuΡ] Yb}ui)jjG'ߤAA@Y71i̲2yB LLf^'U.=oh=kfqtL+N5G׵t,7v2bRLa˯q&0WzJ`:{ZyiqiOZֲ;kGo<]scB(f⑕zDCT 9, D3km oxA#8OkP+g1ؒe{gƠ]@q kuj@,u-cQ@B֠l?>>ڻ}s~Q-=Z!5^aR Ef^:PFZ%e9N~˫7lK3N0s| $ߓӸsDVxjp6/zd8JW޸ _OEE{۫'g_6:dT"Ynq!ó5]{Gj(&a0i[GQͽ:Xntش,D!$=cJ`F $GtҪ42J(D*41KA'Ŧس4!\MYӏʳwo~)2ll4E2hHsm -N w?!9^^bfpru-U?5YM̢R kelz3{DY.JnUM2 R4kݮ~ݽڷ ?w+(V(\JoR Xp|Wf {UpZ( Z;k;Y蟵k,fPx%rr~ 1g5D7D(wBG@dcմeմd7e[Q&\1gtk?EN8خ$֭ukA,0M&w2(!%ǟ+ݳ}JP' AqZWBakxED sBDJyߝ\&7ZKzhBLo/ug>J߹<~#l\4im\Ws\*_7'sWylժqRyC>%E\! !j -W"a,/3ޖzdcw,N[6 tNza_\^]N2 S)cFc/綶Zxaa7NC=t/ rŵӬj)}KLӨxԩ[g5_X+WvFEw] %R5vr6:ğ,hq`tV vRǷ\nͲĺtIKH;SЕ&$ f,cP"/ӰJFQשּׂU7:bznfA0z͹\Ռ2Fz(T\i*{ЬLLh\hi%Zjhai8rlX5Juv*L]OyxnD*Iwr=;$٦5PES^8 nnXjѬj[mf kcBksg151 3$U4Ɇ^>zX Ɍ\ðbA̱"Fu Řh!p8 t2DuꖤDqakkuzMA&XK:T/y V- sq:GGԈ!P^9^1,KME0:녒mZrT,m{bS/R- A_u(5llA1S#p*c9MQnvs!,I;u\}<BQF0pqC-xFRݛZ~ݛKvNd|Z5e@J:3J?zhw8 aRuiEaEY{^ hW|QLu\xl)@n^0<+s۷DOX"_;Fw=G#H ۬t7ʥ2Z\L>5 (HxvM7JҨcQ,m{wyB)uh!]ruqׇ?~}'/WDz\]oo@l+]|-,bb*lP kr4xe sX]#I::0o2hHր3R,QUm*d$SKjC)/(bf+W]lQqE ep[}t~A4d?qfn~CVH]ޤaʪLxXM"qlɭi}m#[rDx8S+׺le#3ٲ \s|jwmk ʻe\(](ۅ3YGoW}~ t7v} aK"zw_6OQl~g5Ke2Vo] $+p(mׇ3fE%aRK<]p~q;}e%FK"#2bs{[}~ޞJ䚛RZ)ZFE!2no)˲e{4*S$o]Na ӹH9O?,5Klj6$0DS`KW۠mM$SjV`l6x* n@pyJ#}!2MvPB ğa ϘYgDI^a?ßGH$`dCTJL9xfɫ`$vwova9u/,g}}ct "w7_<.2TV{pqfi6l\6-(9Al ꗶQ@;nXdmv7rV0KQ#r-vQ>jz{)$'ƐhA9)!7fb@g" ΍7\deTs)7hxy&k]OWo?ޱיLd'4b-d}9^UB"/]׫pTP-'F= T"D7 ɳF,.ƀEw ;Ԕ* lЧ0ܖY:99<{e=+@gs {h?ګ ri],vփRm \*31Ncx(=tvwWoUJrY|u W] bCBlh^F ߵ0ͮڳ0 w sI\ ҌL5.בRQ0Qk.o=5U,2 ]Xe+IeWd+9pZAW4HT]JEgsz&HZ9vl.dvJgd[oN,y/hL2 o{ƴY>z_wҸ|m5JfdnƴPњqsʎYbJ<Km7| s{)> SAG\Sw 1m+3 f `UhF{B)ld>k6i"XWEC}'MƸY3l3T*E D )L.qպobjw?l^ۈ[^Ql3tbr -UZ 37d$[%z &Fu_Xed~c&^}Dz\iVݛM ^ϡ?t8FR VKZɲ?Zasz~fo{WoֿmNP: ׶Xƻfg7A$JZ?.*a ޺C*qӭC+&9|eZ826kήc 6w75d@xGK =^K* 2$M Z%A6GzN r<(Bs~cIųHt?+Lz.PhBnɓ"b٪o_NZhg x{w) ~,#W+ (pN1~i?Yrͦ,%SBvPFԢ3#bSүW{h}>W̐ʗ~(j ;m* mZ!*RL#ingFӽ=16E SDQqd T$Vf)L&D2H_G4 MUjnC8Cl;>0<3;)3t\o6Ggo7v&}s{rf7]p+J׻87 / %) #4O}em\8"%$:uS^kzwwwZPlz)C(Mڱ L8^V^kd72ĉ ;]( =Y=άF0ʗDx"(}pLxa( ?gP,IG ۅ% ,IZF:ذ 9O//_;TLbn Y9@7\Uv%!8W>ypqo(a3cKIDžL~~+Qm-ˣgL2ӿd5Ektŵ-1t1i ٧J2e&?U@ CةMI?E ÎߣSt,4ɱ}rVƪ m0$k=hO/.7wϫ\/e$SNAbְqU _GMEbZ^r]⃡ġ[1 Nn"AhZwoƀ7:hx05NͿDA<{KD{)I|99L\fYTU:aP!L2z9#`4N)P,OJ4.7vuscxw|qx!Uo` 3 ,\Pv>{☤;,̴TXbS{yQ(f_;,^M"ERhN^(ޝO(w]0;ѶvX⻇/RJjo.bB V7V94g[|,U_P'$P>89V*/ $03S)8'k<uYP9:_|NE"b@rԚʤnn5R!n?*r^VSxJfS1ᇻƫ{Fh3B&~VӴEd䇇UdzX:GfKxlR3bSq=={~iqa QbTH m7Pf_PM?7gCf>ff;3ɥ|Hƹ} {:[PcTq8K^oWWil`ɛ̎f6~./[_v Fwf9;61>:m|;(l=Vʖң|nI,ƃh\V{n= `]8 1j%ur.:L'١4ͺw:ћow Jmwd $(t<)7NDq}tq)x9u're֭8;-ЀTIR'boF#%U(y׎KN'%@4;Z}O4nW\4=/l@=$\0J) J,E@LDOh⊨w "FnIf9JeOeS(!Nʹ<յ=|DcQ06jy2z;\ Y(4S &y}赆I/ Ae֪x@n;/+7_=grMF/#[ߺhuA"wvem#lQe T. V-i >LS勑Ҙϛ%\ybRU8 #`id'ӦINpX9/zoM@σzq}]``ʚ:ngǚ(\ɒORՌvc:"j {y޲) \m8A||z_+f:U{0D٫y$1Qothp9aj], 8@Pz15G t TDXQгS.= !,7k)8㒸DrEkS7,/j>Mj~{mݛ呒fLu_nכbv{C]B2h2Ώ-߹ yW5gDF/]ۂ7_^_kCoXͺa(Ha\eeH.'଀L_T97yZr:9݈#tX$@1$rYmIX{D'qsp!Nh`V#NKc_^ݩ'?8h Vn9I&g7O/w_%Zw4%(as) zcԡ,WoiI6 ߚ-U#>V5Khi)yA/TۇEz&uImm9<3+>߀VZ" &pLi5Z38\Kˤۉ4"Jߏ7kV?9{QRs= Öip lL+t#kԥ5C$G\jVRkoNS}x_{KXF?7/ /:< ׿|i]^\z93o<GV\= 4 UP{`.X5x__MIՌf#("\ORLG$6沨hMCH\rKzzz6;&PVX'h ?=gL޲J`NWXd F r֎Z]^VÛǗd W:DQ_ eWZsMO7jY-QPX.bQj.ɝgt;tiUV_Z*QdjH0\fcHƵ͚y=?JsR`wGEDx&읢aWWg;ީn.NZX&L&)fʯ6WT1wbR'9$uky7\Pi,CrXRʸl^#P84%|j8r 4Nv]&,w0Tn{fK֦G.Rp"ANٌۗ5K>MS}ܛ6E_ws{=W"#T@aQXd |J/Z]dOwuUr^peڣZ=o?UQAIՋ>hm(U>h&+\P߭ #`*2G< 9> A7,}d͍㭎y|3 x"ȵ,5m#緞aP+"/Ύ w.,KG|})X~\eB{=h {~$ԡvaR:5J?!& fz7K{MD Ծr[ "K4#y&vW`)6Fbb4,LNyvR3 kk.O/CKIsh< EH&$дYwgW| Ql%Ҵٮۨ`[c-f]~>sP"`O7xfP&ox;o[Yֶhc?%oU6lHݎ=;^{i1-v+dcInJ#Zz#{7d,בbj"Q@t*SV0z{K׌-i"*I^q?h=[p |5V8:xKZn^J_4Hqwy#%辜ؙ;y*4`~.!R{$@8KPJ;8 {uɜޥg ۼOǗU+.{W4`Dj x ȹΰc[ѱb}6r)^Ezp`eϞgNr>2wwޏ⣙쇃q%t*MoYkmL,5,b,b4~ppz>(/v E! SuE1!] |HYlb{R؍BՐ7?q-g]IDYzvLlvXhHf,)(蔲 j !0Tn=ţ% G,Ŭ2wz"1©Z6,WE&׬D0p,fآMq%d G&@YrX{yvs8gWI7xT_X҉Bþ~b$ IŞ溮ҡ[R Ix2%#[D^*)]ɏKDiѫ"m^2gi)X9c!A!1,PCqB!S{Tfu15*/1x5*6LA}dvC}&"HHp#D\q9iM 5oy]I:pn.eF[';TmILJjvREf!|MjlFW8%8E6Ǵs055]yhel֛@4[9*vLi ~(O)_;kY8|d1xr@r1ܱ?&v>Pz9Gp$-lO[(2ת I@r I$RHa,q/j~3q*^k]2c,e\+gWAQ߻fT\1ς$ |n0˽dh w@ vAWH_Ei."EO`t ٿ>1f\6}|6zAd0,'!70j+,+[訬BbѭwB O#+Kt$ J6 jufq̻;[kEN]m%Px&(& CHLflYȒrV0rm&K*_>2y,}o-FYZRc/`qi=Q0r^+8yj;8N57^Y;"OPp\B0aF;~<,K,C0nrg]ݬ^]" +@N陘%J=M[ݠrz~B,X 'L7A62[?uK8'jlVܐ_#V&SBpGzW~\־ˌ,8_}d߿<\ `FPzZB" b ?)gÛfi< H\]5 gl!2te.t -=/,9ri?T켬ZyhTԒDqD2~enTOWqݱygE*TO49#.WGgNUիǟίw/ ku2~[yGFDʹR8:qHb:gV7'1ݟw.]QM{\F1mUN4i֟s [RD ZYE5 $lL~_ DEKyiJU(P+,Wl@֐![f Eigwf(Xu"(T5 ZFB9QltTUV8($k#1 @aq&ۮ '?][_lEoN?拕-/ŔL\hgkL;r^{J aq\}Z#M*2uABVekN'/ va4nna `VNd{NAqG`U4_xK5<2߶铥^%JmhE , /g\}_ۗ%#G8* Wmc?%e_{u0dx)6 ݵ|>8; W? z)ŨXᡕUbOjN$|уYZY~7iyX:mNUxK"Ӊd7$>L'TBSK>DI q:6;ui޴z磻~+=@`PYtWo!:G0+~koL6:K+H5ׯ2MtMG? ~9kv*lϽeM7bKK,I+oy(mGeךξLŶca& ),dX%J.64S1/zyu{[}(N;rgbߦGV"!ׯW[R2*.Ɂ_FX8Q9{?n (eK;ZAhX-̫)욻j|Ǿ*[TT e .+G{`՜|+lkROM(F,㆐5Z1n4XnCXʑĤ Ɖ|훃X&})ى7vc_hP/_e`1į=-?JgQ;^ %:<8||p[OsQ$NRWֺ"ţOoULWKܮ (`  2-Q3a?1D<ᚎZ,w[cb$c@x>NPA22~}z}W׺C:{v?>㒆O~{(*:űb颋* AąElp& @ !H!B !DQEE Reª[]]]USwgϽsq9ybRR'Anyuvs}5Acx<28/7`N#$=h}O,3a1B+-DVFinN(' (Un-Pćc}0~QFjON;%.UvQzsGb03S$!T22ȼ"O1Vv*URI%Zf6pNn=7OGb8y(lBh,f:D -mU z) E CWY=g6dXN:[b7cDѸSDव*d7=J'D>u?Qo_Tgt+,2Tɓl8QG:xGÊ3EQd6Wx @]\Qr& GggG}1 Iő'ل55;RO4y7_ʟc-` %5zZ#c|';'JTYO9҈TmG`0Gk *g8f]Mc kWޏy?cZ Yޅ;+FNeָ ˖zqfoOcOwm><D?h:h{ϯ$бX̅h$l&`A7Iٗ8a<-Y}[NX`f:r=,u%R({.~[tuwlr`uX4UmCF&K_de769H AO|&C`x2v//vo};4P $#3tITdY{/zǏ7o?Cw^[ ⸰;5uVϷNvz  A~? g%Bթ,; :Vڛ7oڣCVk5ũ6FsǔHͷ*VۭHWk.윶D/VRy-@"bNe(vY g(W cYQ(Pi{o]۷5&XZC"D 1"Q ?!~u^<R,[_Tɚ7$ʦSevd~Qb p⌙=ۋ9@0K =@0B3+mtQe^rKkBSD&I kLϮ?~Vbzu8TIeN$0S/aLv Ev^|ZUP4$seplvl.n\&mbEl ،.sS]uwE F]Ȣ2Q0r{ru۰ ؚ񺄛ɛG}tp=}IگN7:oOQRl䀤>Xjk^bGDfnϢdLZ:uVTQ!ͭ$m(vυG7kzz/>C} _]DRx*WQv\~w4[:V. b OK_\wDcX%/e3zS0X~|g؏<!s #,7dHCh1;^|_o^~pmމܴUIeL?J Ok$3\(Vc1D"% AL~H كyh|_‰IY4p`X4O RRtY+0AI|HCKr4Bùa5-II/'McH$ᐩY3"+mp׳?k5+bΫ^(lZ)lg$߿0hlBw ֭ȁSCeG7{e ;뷢PLe&"'cvHMk}k*$eR;Cmׅ5z;p]ܚD{֠Mq$g̳WRθ*4-% 8]? $ J&P*L~q4Џc%x:ν7UblrjvK=5dvA!PPs{fY @l1tscZI&%.Kz\. &sίjA߈K'~5su0)5^őEwSlHDbO䬄$Nӵ]D 4tѯ\,K*ligovHvP$͗Wow#&{y'PY^f& psgŠ?<ތ8I0%`rEoO4770$ I?p?S rPGKU|mqD02ea);=^I- xjj%  ЇrX4#G푈gtb z0\μyv{@R P Lyi= ~lŧ]hT<^&I5mdFH}?ݓKAݭRɈH!/O W@t)?ۋ_ݘC( Khrv@G7!mnA$CgKu+%/pUG"}X3qksI| s84յ4VqS<:nۙd]3MÈ?@X}6"-ԏY>FbF`7Zm8d{Y|LdP\(+VgcwP^:vwXK(x^JNk?~nX!bXuـQ{%<g^س?>m6 ^P>ʓM^.8BiFxO֢^?y:"5=Z]YYzIvb7]>ʜUE~SZMWwokyo~Al3i53O_HK3uxװ{ćr!V%k|2ݝk2@p.py?;5ൿ Q&YVKz7ߢ JGMyFCL0 -F8>L"bwr[8(UmOX7JK,W%:D'zzvO`:*H 1 ؑ\ *xmʐ J&3Bu9Qɧi i;ݮ䵑r?&&Hxc#) ĂOUWK? V[푐5o!ޕwvۓ{wQ1j;Y2lAv|z^^=Eח5/_xhlN!L{3~KF[,2)(ҀfgBhLEF?.)-&H jFì{vPMx=?~yK4m=J|w|jߥFӒ'{NNna]|"_ó? Aڟ%=-)C2c9.Ϯgb\jY۸DRS˼ѕshp 9ňcV=}YlBr]/W" fAjq~IF)vT9φP}])-*k`B:#_>$Ͽn=̢Rlq58*/}l^-mf`>ݳ'A&nur5Fn y/7}{{w}Ӈ],ٻ~?b}ph9hP0Ӓh) g Q2--9F7*?JHQ`ޙEi:@ҪWWnI5:ZƸHZ/nOZtl\iK2-$lVQ 73%Һ릩7_^ҨTsCPIᗟ; gvtq589Jޤ=p2 myJoN%v(>L/Y?\]r@STA ƭy6ZDAo\m $1aՔ>r14Lq)X Rs^i3VZ15`v^波_Cf6}!5hkatޞVaAĞ,|^sr:DJ{dOO:e]_HۚM&bgsO>r7Jvܜ-ϟfƁR֊Vި24e3ث<%:Qhی@غJ%,ՖG9^1pJZRsYh ܅2$E*6?-'lTn% *YFD'NjGvF?xUدxZRA|m4ڏREj=:h+gVWodOs ؄ɃX)->ekc_W 1CEd>XfrGf7 *(s tq0~6M|@:uʼnڱzq砕,Դj3CKδ1n-$5܊l߳R,G(Qtv'?2Aj:O@ɘ_x]_V(u뇻E fY*ʖ椦qQ UI MDI P#@$|  dSMܾ&8_-+/ћ}\iGpi>QZVol tQ_WXfSVS5 }]}Nৢe rfRڽA@cl9\5``04OgBT{xNt+FNUs+0vtq2â紋s2\èN&#S_LͶU9"$8eL"34g3j+)m~r j=#=6R^F0U/Hr0*ӕN{xxh>w3&eZ8u㮓ߖCJYW:vϓ{Y 'n3${ٕI_1썘$;LkʰFmAXOĠXcIQ zׇ%L%C$ei-Ztb, H)}iҒvR(tlS4^l٭=ɏs߿kMO&Yk4|ILi^!-2|q^xuvaNU Ef'pҚ8+LjqIm ("=e#@!4{>+AVAS$P {Df} rJ~pե{,Ͼw%QIIt᮳#=;P\ڶbxI@ԛUrBŭzIp}_U a:2B|;Ʃ0Fȥ\۠IQjj)j3 < 5zPlVoUXbH8C==&jsx~O׍{6(Q48x?.垸nl^n6qڳqoiķ`AD&L!BqBd,ͤ8ec$]H lFwUI-1ķDQ1+|'d%]G"P 3*||~2ۛZs ĐvR=wӵ]Ų)$HFg[!Nfsdb=;.ʭE͋H12 P02ChRSd#_. Ps:NF_+g< NvVolM⹥;nIwZ2wG\759Yyǽh CP"M|V+!PB>BҧgWx?+fc ?N0Y]l+*,dRv(=&if`vfmQ`l!1DtJF Ⳳo4n꣫_=@Ib?͇&{WGG"lT JlvS(!2jnG=1*vG Twl -rK&J6n_ 2^fb=ʖvm>>IN`$; 2oeA U2VׂV^d#cZ,.gx<.vͥÄe!QfQ's-ҿ|TʠQl=H1$.4ģ YHZ(1h xʐsQf+؋va$X>nVV/djt;Zfk.U5$uR[p@$…?D[߮4)m#)#[BG0U% K~\|^ 5[ny2Hzn/P8ҽ9k3h_.o>=xT޿~Rfv!|?KOH>kf"O{}DrMh8OHl*).%e+oɥkUWﯿywT2:s\T%yjh,H># OEa sqݸ!8L'4#k垓1Ql74w"鋪*6zWAtnУYYlC,z?x<ї_C`A80b+Ɗp:L'ںtVHGݷ|jcz{Y-x#\zEjtT{x՛x[Szb8>lܨ,i_,!6HrL QW8h95.H?ۓ4F|mUk{b14cxxkpL2\kPIwo%ϖvy{.F%XNp!K}M_ֱ=E 1 pTiu=TB+ֶ!cF- G0fMGū7ooM*e[yl߿?ƀYd@VT|B2jK-  guؖ34 @>.DA+-Sz<&L`L(ӲcSC 7v|?n|o`P\oCM>c)Q@j &0~\ͬ\h~(ak9gXxdYYxy3x.]~0Άyʆ)rhWm*^Lnϖ*K2("ٽj?\&%ҲZ SHGW*eSl)O~ǵQ+.LJȑ:*+ bv4 ;,P2=VA(O J3SK HJR/dlL{CE2Gr|i 4%DݱZ=:~w,&)tpFUYƧ6! #WyDO\sa^n`6"εg{ 1hsVRTKN4͢j85JOe0AH:؃tNv=z.tYڪ !E:B"SK T]/.{Qj@vVP06JYqߝ Ũm2iy4J 0Uf? 4Zm?-#~EHJ)IEOdZKijI8NxAhEpcs8 wmӳ]O`T6" (3thdYh$C?Z{8<4j C@,lh&Ah6DY fh[Nι'hYlxκV;/u({r׏ IƔ|ۚcs֛yC! e*e;3S͖ TiX ,$T8tT17⤭K/4KޘA/5Z'߯s&͉ ),a%Lhɹ.- zZJfy$Rⲫ ᗝz߿|%8nOX^_iT:- ePfX)L, i >-9m'gyT–8mk.?rioImN}4^LA- ca3qk'vKΥ L+ʹlfy:zxkN+Fkubp~rz~~aEOYpB`(儛\gOtX>E 8" c&>,ӢjpQ5ah=.6|4 1p6ފrOvSW^Ȇ׎,eb~Zu"xAhJFOzpuVo.lؖowrLRO : A894_c5 O ߶uX V+3Ë%r#G 5<Ӊ˃1?q0a"5_3J+{8YˏWۥ%%( kxɆơaw avތ’o|8}Zݎ?麞KɩkY9hz3*RIaNmpeq&,,&Ff ;E,0Ƌ`(aL%_%JgnDL{VT)CBKX-E͹a*LՄ.T: ]'sZrAqRUoJq<:[pfUO?1QT9wOXcFCA\ \MW庍{16 &qBTG5J@D3 [fù5}d K@ +AƂޏKr)GlUtՠ&ҠTXyXp0}oi%9! B怳z&lp.9`@Gw-ϰ kD8r/ - †@U\ }-w-DG-DcPny L6 /TkQ5Mt?x3/0l7CSr-I\?)Y Ꝼ.RyzKIߟ0`ݖW"^"y.-+,1FhfI`T'd tOchE.uKѡ`6 0l",p\C \ !w]it;fk|[2e"QJ T 赃;cF#3O^j{'aP- y< xn۞ça`F?|6pRIF [@GSLP=^_խTsaF*8iΓU5]1敔KfS 4%6=w놯ݙuz?V+ xKPu<a 0D*@f H]@ -IHH>嘸`!@G//B'"RUj:ލƫR1ۻ,i7N.2i1Z b/Ulj7#D7ysra| m'÷昞S&n g 4,>y˟=7 8z'1?`\<`@#Z=dyxx@8&[-/X?D 1䓃MԄz 98T<)d)Q+ndrAc<اN]e%qEH)ܻ>Jwyu|O:n蹌> 4Qd<&HچX xh/òX$,ÇH(т&b:2C{p薐 <dj`1A708Ip(AAg$S3PVhuY:hH0(/U&*{R@Aɮo]utv|]F8 `\"sʰ/HZ pE)pFf O 8 `)\)‘hT,l &(oBXf R\P Y)4 ,TΞf)j\W-?;ۓ_?>Y ǧ1 e@B̈́r7 !bagtSTx.1H`Ch`@ p+`{,* ̅0A0XFKn,( 3],/5&ylF.HFG.ͤB>}<-a]ro v6zh yyr㥰3׫~h6P7p _"D!51 ,|kSSA`8*lB?x9v#|H1*a#gg4R-,q@{ܬ IWt=p)?vȔ4tq[7:,Ox-bW,{K_pvg{nW9AɈj ?c᥺ .bd@v5 WH 0lK#9 [}œBRb ` :"<",>6VN^NHRP2R!צׁ(0d&&LqEjk˨[) wuc>97R/|8VJ\+Lp*`8kvU6A[6q?4-|H6Y@l` W$!W?ٗ$i5ʼnܤ~YrdZRѫtTYTV j䥡Y f]pnab-uzk?g''o~}%I !>݃cu J,AπWUx:CCFW$F0( c0PT#$u.X(^{+YY  M+piG:.n]*Z^nffkݣgo}8Yy/Gh씀Rƚf5@L z8]c׏GZFLĐ2CCB2eTXV]rf Yoo5)[K+ך~#0~8jmO `f4Uw5ճRR +|$-woNa׮TdsVB(&:ŴeabD<3T/q;'Ҁ'@(^_0R!:0:J}݌_/sJe!{f2aZhZQmlT_׿]N_ie{ YnBCOR g&߃hne 2K9UgTa ۆ0a 6lLT?(RFrzS.zot1_;^jr)>tNV)|_?(Rة qr)|+VɇW9`.[ XxN2l/o#3LSc߱cBLOdaYtn>bhODQ4ZFhMYxi ֿeVM%pO%KJ7f\Owool%vUߺqw߼z}twT}[i'v1ȉjsSq9XЁ69h_sK7V$K LoNrG+lr!oTss='{ZNnqdq'.:{q2g{\JōHqPiźQͱ0#c#0AD d_0QA0@]% X`1dwS"J 0Lmj٩07{$v!Aխ6Ծ[_u[B=Dq#BQ= ~ f ?:sxo^3܂r3j:ˮ|t?4x&Bhe(06xx䃦N,ծ-8 ;B? t(&BmMDY Xʏbs~{Q3wߞ?Z0s m.-p{* $R*ebq5Whhlt4EU;+k go'[ܫ/ݿwog~:ٞ}+pO~zH? ru[w-?XF  /G A\EML9#aS]J o.W uWUa>8a]jkKCܫI̵+U;iϬ.N\^Moxl7W[{'߿?,vskw>|+rb0 T=}bc տL Lj lD\OkJv D:f8H0L)ΖZ&Fળ~/xX6sܔZhy!xrGߟ?>yyݏ6Oaxlm8Q_Q1˄יLױhb:riW̏T*Z"t!1@cJhef(zI9rϺ';|pT&_ݓpkU Vv^\kUɺAVJ9iWUe量h/'V= %E{P~po}t'O_}wvr PW'oN#Qn-d 4X,j_}I;Q E {/X8lupMWDF%/(IGLx.fȱ6u z`K~վoݹ&$?jigоMa7*A$Z߱3 (JXbyYzkNrsO^{~xtַ}yz=|26!r fHaGDWlùP;lb:4}`LMC.m< >C?;ϟ7n_/UλrkśR"!Ii~-&o|Mrb[ µ o$RVYڛ=p2y7_ݾzwo_}7u,y𴮆I:LmӐaQwEr!J"GUz 04~e4'0Dm&5f _cݳ(kWe+Wdi8b[AsygebqUi&A9Vn09Wjee~\ȰBZ2oHuk>{}px4gG'GGG_y/4p Sg=븖a] T 5|_N`x(r?'J`29N:jBQDahJ~j[+B}zqRQ6HK|+q{s2CܮNڏ(xփѡq;~/?=y&5'vAҏ& qB2OSDm=7oE/qMlDא>Q`HcY}8\:/ _ڗ"jBJU7|=UQĭ N.L-yq*/]4x)nTX_-?ڽndz~ӽ*&󺝫Yfa෿ɴ2h9v\]]_[9~w꣕L;T%d XH8[/ź 5JQ g!ux!Scb=KGh9AD)hrˉ[R={i^(W|C4)LaL0A13D#PtCƒT4ml tF.8 z.<ʩڞb >Fr,#C\aQUL}T4=ֻxoŽm!)iP;:0EIf?m_o_YxqN?*ƴ[ۯ _fcw]CdxJF_X[V˛Z^'Odx0έb닯 O;@)6 P ?XŶJo‘""ZKU}i #' O OۦQc?zo -jĴ:cs:8?d &%br*ť݅ͅ^{P_Z])W%ҭV7d5"uv^\A}84TJEx`AlAXьr @<~f@a'[ Fb+4p Hm_ E s4lxa`)`a2>9yt{b3Q$KAp~<ŮW3O c? (aT(~T廕9F Q[StE]<ްGXgp-T ۃ=,EΏ@" × 1p,y>x 81OPPY#pǍv0 NMmzG?C;n7Iаf/@ިzO-'9_6EVl<ۑtxzL@s @ h `&Rjbuax4`ިs?Q[l Æeǎ-4U$˙ v5s~Ń(j;\Iʉfđ˰{9R껭SjMo\gr^ߵ0sN,+t<chjkLxh\qQVZ`.y&b0GB]ǀm#y)4cBZ-KfwA܈f(uU_W~yS3T[-I¤ģC /܌iLW >7KJH֚YU4$?S8}Xga=La[cE`aX\d'>  ɐ5 tW5W"OYFCaŮ43^*=LN&݇w?ŝC,Z;97^ dh(Ӫ<ײ7"Ʈ4w߮j:hh&Q'Q[T&ЍT},AԾ5Lݘs\@ ꍨ38crQa;P t1< 2sBd{]߄_[_)).\b=̓ejEzX8QdS3`z5na-?t-R>Xx 1Qq K*{Z(uC!;bfĘ eb5R~.)(\}NGq__[~ )Q+/ÌsTFiV-pSڤ:9],H9il-r~\oLqD`yo K.?~|WEc!zQ2==!u{c]67!H 삊6雗gNuMٳlqF01*08pKn ԙKe'@ KB݃h"s Ls11 b,䇃R@%(H` r_Z\מ7vY_zoů&“%ݼs3+ϤU?$H %)2Ss32Ѳ×B]'f(TLT*Kz*yPj"";F71s'Ftl#pPv?aRio / |諣J]wJ..m-_kIzwiqgf6Eo>M;R{g״F)5vr]h+,.ev:e~Fu_<Ӌ+#M c|>Χ,r{ iAtw):"*u+D a F%ò:f1yZJb׼$iK`#(nӓSrr~kF%j1z8I5/)tA<TJ$^5gG5GgaK!߇&H teK$<]p|vhgX.D6d|~8Ȁ@Th^'i)aq+_YWAĠ3D=b,~4> X@ʃYA&g\ԻzPsUҭ؛a^Zq95U^4 ,={?>>o8L!e5(ң5Ӽ,OGy ]!>Kձ|cƪh-Xf{Q#Ek2"4Vjr \K(XxX]q eH,v<BX߽yISt5;Svx%징ܚ%wn2y _2ZUq֟jS_|hgF|kQXBKlafEr*u&Qz&-:}&{bg#P_0 5l]-76Dg)y~^{;7vk 3򮖙YXlUTijj!(id '?_fLhl̈́ab9Y,|PuiO5p !e꩎k2o g“E7^,& }zq Ebo%hd4z{EVt. J>%RO+ޗוw*ۿNJ53ҕ'f¥9P5dS-ʵ ݖEΗo },tSӰ{C&}`)%XD?G?GX@& n DK)vGl; "r'*#Eh*#,Z#(:3uj8R*|u[IzflF15wV#lv:]_l$zC>/VT(Ng&TmgPӆ4q0gtn?bU_/pcm&n@ CizHޘb'ԉP@ABV]zhA({aWch$kkfCCёw0eJ3ص<_~Թ{xe뗠{ifX횫f w93?n/-M|?Uqʹ8QpU]s5c@X13aUOLb_,m0O{ި z 4*ɋ{E7!dVbF*kV٦Ecnz+8317r{/]kj2L+Ǐ`i5 ^Y֤)#?n6mNJKd ӕNX(araX/;bDFɿQ縣VI+yd`! (j0U?O]oujyvEN_uK3x罺x\[?{1}i*lc~:f? C{@dn&Sz*4Lb9b/>]PTGė$H&<# o;#v CCFJ6K D54u+K/l xQWi+42Fxm1a')ՖdJs屏w`Wғzě| qp_!X, *̔L`^l@qMd)jag%, M_,1,]ldWX>09+*3$R$m /тU,%Cmk6|v7^NGq kVM?Nj^wKXxKlݮ.aNx*n^_8+V9`Gs @?M|h!8$=nΨCh$8q*&"U DBGLL|ΦDf9'=b H xG@[Ka2'f">3NڊmK%ݘ݌k|rmg%rlK<3[CZOWfbڅ)nX8+@n1<=f .߶|)a0@#2"&2%0e;qp#5|"67)2K]\f-xb,(V.r7o{ߕ0'ƾ";֗O|` #,[SKQvt# V} .F} 1='9ENECE,*x{42s2IEϷ.'E_L*)LYQp֝1 H,d3 n2m2+xT^(pzix^+lV& }ڛWutYlis3?fT*]1:W]E_Cĝ6 a!%"^]Ѣ ./ڀ0C GŌkt4VCYJdiE-llB^V 9s#择d4T[0oRee,]}>O4Ɔ7hޢ\~kT`樱{wd _4'Mo gu"01_&ntD mVG-$! ,f]Q41b--T+db+^ap?bvkǍpc%zǾ6r66N /( SJvsc~$͗dlt/dmzA.jmGr@} ,_0bP;u]`C# īul,$Am*䟃?QN\r+uMzK]Ky'9rוf!+ŹR%*\6Z]ߝb;LI[Ӌ_f KN7!֩8 iɨQm]ĮtaxHa@Ž`Wԇl7@g"Ћ;6 ""x+  KI83csu^ vBka +8-IY 2e\v$(f%T0.2PR~3Tm?,-{_L \,f*oRqIQŔ E\yV=YmQ41Ӏ |آ#LrS0+68/Pߚ[}?[8Q52s38Ir3YݝaJ/RF~\ ИVZ̗G˵9z]E16Q4k ݨ> $-B(UXU"rx̀~m!UqW(.FBI 1o2ޱkkvi5ͿW5vfB%}ڞ87v`Ғ€a gU\1%&FFq3s"u8YK਎/ ґb!bqD[鴴+,8wOʐR?n*w̎V.{ VXyab#?X_VR{_^hN[։hWpbٶ0qzICgqҰ#uFDۏ&,Q?i ׁ;pF!)49W]1aX{B^Hz:h\vo:\\ؑ5Ǭdw׬4sq:\kJwa!]hIe+ߏj;Fb{R l;d:Pdt/r(Q+q0>cqQ^q 4nPVd'x [uqEэfAdB.!D*D"v36v;=T,l&ӡZV1=rh.d/t4{æGo`lls!\L KiK|x[ܪwϽ:6J11+N>O$p|]&fIŨѥ~5Hx2Ŝ.`tqH 7Z!с}IKus mM|\OM +ZfܲԺsM{k-_ۘh!Y3B>YBX ;!]!1#h菘jsp a[ '(`x.> SwaD k#4*DĮ0p@Ca$fDEXbwX[$n}RB0+i[u;K]Le&!w67NV>r=}a/֛WWdkiӥ0#̛\ׯ@HG+82bB&F@[1 D$@,]Dp^ &??Dj0|,aT8"\Ֆd۶ÛЎ ƭBX%Ц'D2k n/Wb?S]+mTy2܈7~4-y5 ݂̬Oh;=Ǖ WN-q L!\§u/ ǩ4~-a. F by,ePf30Xy.%)BU7n(N&zy&oL&˥HN2C=Β+fHmޘ׿c%7bh0C kwtKŠkγ (_d4alQC),"0NMg`: @#2'/rƒan0,愡e6Ao[U`1F+w&N{gEOWFZXI,n%kJ EPyQ!! ʳEx#m*linCִ8hXC"lG-F7f~ex?zmafYAִAW ;װ9PndB%'='?U@7y6 u$Mhቯ^lo237|>.XzeO;\DƓXgD s(٠0P%n]@fxOx` `1!lD̩4`C: b E8FD<;DUz򼯓EIeWn-AzQ͋ wS8)gӓ`Џrd sI?ٮR9v<,C&b6CA4nEo|aZ)84ǖ_ tV 3QtA4:DߌW+1j[㣙ЮPVY폯Kr%#eQ7ׯ^ 0Ua  [96;CIǙa6@w`HS&0[1maqd,Y) ")+kw~Q$.,[73d19/?EKK{RW_VnO\A f*+$uk6L׳N eZu O0Kfj %}⇇Œp*c,:`-6 &;Ixv1f>Tj4Sjj͒Q?~ޱ5vƯLh;?ﴕ- .1d(2^Z"-)HBxhmKetgC.`"c%.sY(N ypv 'M`g [0IodN@ÞHP\:nxbs ?돛ΤYh˷,y97QkgcJh7V[C' 9Ѵ53}w$Qj!")ʘ C(5"O{AK ,/!*N )pDe$R|/r^p_D͟:~K|b~E,^{d?WٓNkgNd8A0!=J "aT`F8a/788'džPobIPtAU1%DrQ,Ã{GO6~|!Wa*"'Hz/Gg{D_x+De#Fr!|aI%UijZӂW{YCI~kˀ ^4 ${ezd BITc#aabhz^'N0 2x .tAK~xwq-/dɥs(/l SJv,j4"ډҍqk1_=aQHd]!Suz}Dv2>ڞ7)V=1b/2%5 X,u"FHLё5зl 0U^S}TϘv17ha5134J"yO7r+u*vCA*Fte /5w6H zzuGF qk;06i Xqj.΂;nteg(h(G%W<xfBY= Ȁ 221KTm J"Fxwr|2Iʳ^vMu`2,2Wo+W_|ٙ@q.4teTw^lj}ſAl`%iKBC-<&pMs@Cra$H Mx,q3T™Z2KN6ԻFmow7`,8xp#yD*v`hRʣߢqqDOsu>rW?}Tӊ51^2~9^+"\`ab臁7 _Ck .tPV1_4al#az #YpC@1R+d1NV1wL@c&LSdٺ -˿S쟫Ւ:s_a0KZ\KAto_D2Ob1XM 'paYAsGd <6XCQVcp]Б%sv%Eq2ޞw·1 qS)k.$f$7\G땠iĵNOI׺uib޸.1Ov.>y;#ni?:eO6B&ˌ.Z &hˣǀp+zei8C z4p bt3h d}kH;9@&7+v:rR'l'˱㣕zǾX}`tƲgCDzpn.xwwTLLTپZJ]6H$IAۿ|^cP0WMǘ-c-yje`j. LhKtT#)zEwK:(T ~{v~crVJM'\bZ)rs!m7RV}w>1^sKg#rHNC!թ ŐM7RQ]p M`N8 %70m[3e)־K N(Z]DΘy\)}|)̮+l'^Z0 7">:"1NlY#:~.^y4uz!20ZTkBA}9Zro[}*lQSMa9__8G>Y(KtLG ]Ȱ%T.nv:Ч[侦$G+|Fkr !#(lo*P$@6nΊ+8cy ];w͸ރG)9Q>լԵZ>Blw;ϲbʠ mm30:d2#`i'E?-|x!O 1 [4"|J9bK y4 ^YYt9㚀?c4rc@\p { I{1&IJ{di߽m 9"jT-;mtKLz*^!mY9)7tRs~o>{qR`.Zʴ7”6t t8 *3B(~L@h`h<5FXoQ @iڴ\Nڣ{ʘf&^l)-X񽽭X-5la_FD1;OK:^^Voe[G."l8P?~7@|ǃ?ldrfpPE/`` #,faMe5BA ha q;tJi G xE{g(eWu^JWM#k8IY!QVGgg!,o*2T9u) hQ7[*sezPÀ?x+S<1Xr^A> r;@[\ĪH"[`So(aHJ𫍝̤hw1bϣ^Rzz)"βWEO$nlD.::2d]L^^N4+ʊER*ְ>$8Dކh ׀EVu D? i$Zh@'@>TA4,z3-buQl;곽WM13%b>X%,tqՎ\ ;a)s\|2+9u-=T@:dP%Nr,q.Lvq1Ug/ԊJY%0XZ/k,_j[ⰵ0U˒zib m'O&@U=sq(a2m5zzqry|ﵒa!ғ&֛lN.4J_WӒŲDHey  Dt~8Wڽ63P:(b"L9h`v/tSFpz;4)6ͩ8Y yqlK5SS2v{'_v[7]Ҍu%JL}hn~vgXZ j̠!>׻2+'2^Gmj\*I3>}1%.2[xzzN+Aj´B{v6%ٞ XE ) ) .; DZhQ0S(4EBw͵CeT9][o-6(3UR:۞rsᯆ9Z8*5v\Pe*!%e-H۰04c*E7%"vS+`Y&Z&/N pIlZLQE*t%CQltv%L,J *Oy@6DSc '8eTX eHS:5| Mp_/hBdm%2rޝ3߹-x2>J5/% /κSX9Nj?>ڶʁ`~OPT=}9V]^gi2/Y/"8 ?h@kzxR6$(~S23f%0H=ܸzoOÄ<6Ww7o9Wy{<.eUwKٌ/GU'ݯ./w\E?!F*3(_xI򘝸@OUEz&> iԅL )71\|+pp 9 ܿV¿LTC+Ն"bBtX_@^]ϻ'b[ݙEO؛gˢms, [YRg2 @GdʎQN w U9i=0M:zrc% AgRpX~m(NB:B氈} '6g6$² H7,4hC3x -t(”)2*d9*/^W:+#k]{swqr\,n ќ>}}!$-Rhu)j,Fk(Dh7hAf#Z*wSJrx>Cv"6Uv0h[7L0QɃf*6h%@n Ep<)c/G'j2򖆝vR,+TX?[W>\ԨՒj\0S_(pK ,OAiBx[)jqMkN;) $@ 9UM誂m d10xq{PDX _ ߂V fFMQP$`*rgZS{Z0OKat|}FF+\h~xةzT*.ctn]-hwjݑcv7Fv׏;,Ax70 uMiؑ E̍Ǚtǫ]PEhGQai([sR E]2")(e.{xUnƇ7nx3qrA92}lVN=I,~YΤYU)e8Z,[ui[MpGD(+c# 8A (IװH9̪!˕N2E>:L"@e*X'Kݩ7#g!/Ңf3r|2XkODlK0\^^[09ϔO5c2X8)cD f,El~}ɂL:nݨcSϫTX2eDAY k r0(?Bw 0`eh2'8D[kÀޒr#ߩŜٚl/-y}/0c5^~.:Ae mHtmwwv;6%6[7ݸqOD"WTʡ$1 hϯ|{x '-c: 認ل0Jz(We2P.T?AKdz_i"_ |!6n"#ϻ#oU>3ˏW޴#HyY3ʹxoX_7Z8Q):,s!_Wc+E|>?}|#XT2}F2!X P4Xdc, 1 &ˀ tK,1!KFRov;$)q,lo ݲ6iNۉ㒭Rrt5ϫ!8K!f~$*8e=;m *bݏ9S!E6$DKt[·Ƙp_O"jMb!Ye |gU;:+jCvz$R3KlTfå$z""8^-.W.N߽;p0 Z7{jUXȀϩt&tzM 2EUl^], @hJ॥qA905Tײ/>|Y;ɍ#ޝ=2^ Gi-k﮺h>,\no7O A#GHx0:¡WhJjLW3+ߝ's;ÆƂ0@p4>a➌[Sӷ1,X`)я: *P&#e5үթ3w;Oq/+Kb-QTG-EbIENJhC}foT:vVyГAA^譙FIs\6ڲÏoON~ 1Pcn6k؛ME8i QT t-A,(a-e bY Ѭͣ҇#cUl Fe4}c 3~5oT`b6ظ7G[](mhFa|!un7J:<7zEK=sթTaa?ZuWYW#[AWOӳ޿|9PɚK,2o;^QHR-X%E%"#8L @^Y"ui_d4LqC!%yBd4"bKWkqş+ڽH@V`p'Nj{f7nDlֳح;RiWzR`zh !qkrZn@?{sˏeN6u}ja,x)`I OhYCa3$*8@6oހl6+(A?D%LD*" ʆAYFOIpi5<}?\59aDdxW+??UB͕&5H/^gB0tnz'zj=ڟ3ũ+6oa%NEwpҁ#rECM`P؀z}5`oWSvl㏡.f% `1Yث eE {|vtкJr&7Z{uCeo*bZ#jڙr\"ߺDWZRj(}rfẆDED,1=:V>c m ,JLo@OyMw:eAP7P]ÂX*O8*杶2k#Gs;_G;I"@<ņi*\ǞRN÷{F+Ȯ2y~ ˣ$gZ?^6RJ*ò+Z5 S,[Xj~Q[x=xl嗜F21{v2χ;2QMc# :$T2@C!E$$?^gT `uNHxRklGEaK)RѶ`2XB -$(hr/?],#IQmk\ 2[aPӢ@d@)='qr\"&Z]M/AeP 1A)Ҩ|"Qܹ}Xڎ'5'3a|Hfq_.MN'Cqk鮣$mM6ʱRvGt/Ey2Jk e/( 9I\_Η$S[^%@*J +N6= va̮kJŮQ>e͢J7e%qKn?'խ\0ƶ I/|8?tiPvc,050Q6ʄ͏w,WȾ,qAa0C,*` ]  ^ cyL\ymH;;_gSN ՜Y\@yG3jlQDcr*}Gݙ[\L-ƫ1/w&%W'p3P y1jV/?/?_ފI -@`0^ ?%cб7QeH m7ZK:$:[! xpQ)KI_^VUZPVǓz'϶5̼KM2+ZWCЬjXl[Wr+ Cmw`eK=k|JavVo莐Fo߿odM |J*ӑrL%;be6 9 +N7+VPx~mB;{sDWiK$" ֵٰ(14)dPֲ`*4xltEe (8 XFLpN32tPA7qQ)}ճGk:~v\FXcu"GՄRcxMhzUg7PJS!E*U 1F8Pް}mwwBo|6S fp*~<#!@UJg3l1Qy9`L$ʬcO*X"r??5B#j_| a.n03.jŢ\pϟή&Gk7G7Y"Ù67>\ Io~^[2\$=GB^6a&^2xrj-*P9YO.:}(Y)F*W$O1:!hcClFM$P`ж4(CVfV ¯鄬;x;!8 ]pq bX7AI`gICY тF?Z!^r[}Bd׿˥4G #!Ϣkׯekgt;3WPt7n2<# 'r,EuZ HQ gx沦9L6GE>s2 E,;0'L Cv^pF&UQ6-q,LO\/.,%7rO-MT:y˨QO*{qphh3e[ֿ*$lq BSm駽aP4. 6zCCKx*D/ 66+`T o hes@v県J#/q9 Dc>nb1f=id;+k۴DS󶝗R\:iF7\4Za ^-1Q|BxXx=ߋ^7{JkA "9Jw/HSgU @lVȔRHm>1$<2`G\HNCq5I[du)ޝ$P2Bg7D/ 6T!Vܺŝϝ\K):!Lvb oȃVn!$D|8"HbyB> rp'ӪÓ1EL6[RlmZS̐7۾=mM^^F%VBGU2Uk<ŘT+sg>U'YwZuOƳrnFIva=ҽJ2N[k .|w}qv^nvuCYH͈:x _P)f &1WaaNb&߱,ǡBGu'<% eZ7+8k.?]|<=_ϞƃK[?˵߿|񋓳(zK' syW% Z Z|0a*Yh(/ EU'Lv__^}v~*/<;zNsifԫ=~Iޮ2dӬ+#$7:P0 ٢$؄YQE54Gkv*4PD c:dAc4YHA kCB:4p ţ?'SƒQ1BFk;Kέ{Cɉhcd.VQ]# :؜Ġ@gZ6+9l!(Z L,[XNUJ=N>_rt~x^0ŢcE1s(1B?ȝCD4`M;4 4C@ 4Rfjy>&t^_~˯gу ԉ+DhX*?y̓\[]/fK?NV 8Fv&R ,h'B^:f2N-EzztF`l \$ʚ2Ҍe\!K)=բ=!T!#5>y÷ ;VdP6Y?aƓt0CʁT+;O,l(O60 <d"T?Pip;mpb4tؠI$ٽ:_&B>[onrdT Bjn[KH~JC14=5C 6E7}g7b>t!â6:p-kкͼ<|d]-C⡓ K+xgT51gZԴ*/ts}s_~<8ީmoQ[^ǸTs>Z$77=2˸[]:Z:aAC(La(S)+a J(t_`aC0d`Kd7#iZv>3et3Eitwyt[a'SSvdGLbӯIi3n/!_06HqٓߣDرɦo˔gz+.;CՐ3 Zviގ$hgtT?gp}4 $^BZnVi@F|YV i CgB"(Z{ҦcBV9F^~طsɍRqr{tc|mt;O7$"JAhJ#~3b;h3-4O :+//ο["'ѝP~}vݜlvwiQ4KWF|YdyM|p<\r"s \áei`/ ➄7d\b,HArdh }[UJ 7JaѰ28❚130j&x(:zC**TX>08jq{{p3͍ǟ>_>}zQ[GPDGRG X(P]Y |gt_ B<\u˴ɋv9J͔>8"Z{\.V)TpShbJ&i-bMh)Ͽ~nyrq}>%7])x(E%I]_`C\`q~[16LAБۃ>2 H:{T7? =j2"qfSƚJD$ <dXFԈb^rUFl42ލӃ^/ߌFPBF8Jz5{uf&"( Ϲfs>,gV ,P)S ЏRa>O Hʍ܂GR,Wĺ~ƛ|)5QBn8$;('p8\*mP\"X>Abdg pQL*kYmm {jFdp?itѝj L(!B\U( 77@%%R@Dg%,`R͎B$]Mjy&j?I.ǃ֭& (iZ%0_Q,n2Vw#P?)r`*~@*9XpaOGvf_/߉:Õ҇^" GJ(N/oKpX:zݝ{K'~^I;ulP[4J D,_ȸSa+ wn̳߫6ǂA4QWdXj CA B(@?%kA4{Sfm `!J7~}1alR&\[ry\\=["܂7/q2 0G/?jo\Ζآ8J1(k\Tn~wqO(E[d4UUCUB72wSsUQ!D% B 9Ap#*@Q`́6އjƘp5he׎­_ׅna PB$"(""0 \ \ \ 2 ""*"""* $!!MӟM4{';;9=;gwz> mRZZgwgxlVn=̎hQhy-Y$ ihuycO~W"?zBad(uϣ%dgwguŅ8H/pr$/ LE!}J MS2&Hظf3 M{P!#``<77FL?襃񛞂BK@.cb9 Kkn?@v-9q5(Q._rE=ȪsHe6?DW!&G^Ԣ :J>y̅b{d\ W)KM Q;ac)cNCkt*)~f 2!bfT|9@P 6xHC=^~x^8$A7(R$UzOZō_~6MO9HdFV)bJ'Z:JInΎͥﮞz1uVN'Z՚eu\"FD# pUx`D<߮,8]z&pL BM@$2Y>߻=t:/HgHP-DbVvWb.^bZuBV'qeG1Y^0J׍N/R$U8Nn*a'1mñ\ū pƇ7l|"QH#uBlf 2S< ySN`t<||zߤF˒ñ;(\!l gݾh;ׇ01#4aO[U乹Glׂ&z!ӡg HGNn.kqڝ!+9L`fw<[dQg` xW&BE(k@DAd@({ "k$(2 gԉ,Iǯ&O/O~xBͮ(TZ_vIB QI\0ANLV:KGIz78CwR^,uX,&z549ޥ^\ Ã퓨R}24Z=hwrbts}_^xMoDHx's.QtכߠknrzFJ5P1_LMBO>L {zpB*RT'CP q'eL<Ϊ` < ` L{y @7,2@>XՈ$uż槔fK1xo~K/l +Le_ b!r-뎓'ufd᝞/&mVNzE 2=Ǭq E!%$pG \n]3ox 07Ou74Nؠ2~_)8?'>vr[m=θ-&$:Pd /p289?$-}z'^Yp_A~|Kk ;줈=@D,M4y""To-g '_|̀n 'x3>G_@ imAP y%ptIbUUM=!J5{j\2ZJ~ǝu}WffX!pVd_1]sm[{VCs#ӛ4V۫:F^5wruq"&ِ^19ЮSr"_6-0pA LppXsr$0_UbEvY)HϳO?֚ݦL@ώ1_N\|z|GHJ>R^wW bԜC#`es4 W )q? edJʭ$6K `]@#\7Vi^^2G*0@ϤFx@uk_Ix1I;,H_8@l^ \Fr?l ~(]o/:~cc$J~mX'~jZqԂA6ՒYxK7y^_,&pI#\GW;)qMI!S!!P^s":Qzs1a1$%Uu4~*>-&}OVT&#e EAh7} O)kɈ^SGL "Y1ZsSR^[LOtĤٖVT}zw9^9 #wg⁄b[jy*m_4|gbWʴ9ax^*!^үhJ%e]3|Ȳ/U"MdRƧ7'9\5`bsOF(Rcb('Nx:@]@ aJL2H:14?$Ȋ%_3~uk]#5{?\ 2( f}!+U}9?9^Y'8/ٙJޅtk(Έ$lbqUS;B@lmW]3>_J*mv0%NF>3 >1? 7?O@ytG| eQ6M4~@# O./WẎ?(^5|y:">Z(Q ɛ,Mo׃V>Q@zvr3QB5ydx ('0 ܰ CBD䬒pȬ^|@$L_xǁ8S!23 M x (|!4(x\SCt$<#j@/XA'mUYTIjAf7Z-lTd5x*YwME>]U{n'a5lwdyU҃Z1%P Ge4d@A4ip.UOV# 4NqEHES#A9̓ iȚ[wAԀs01=Шh=+5JC<Ͳ?Ao„j"T(>xN3ZP0A )BXİϫ]$@i'Y}^\'OX(J8R#V&l`mq(-1x},tq` ü]p<7XF0dIK꫓/GAB1*iy5+ A4 3ഀ~mSBS4AT+N+XNGǃ^:ȵ"Lb]?{B{Ób=9'kasv.H;n} ǁ6FJVRb2n 7pN9'`HC>ԅ`L¸{nb8H/*'uBk+ godA { >s IV6MpƈTD(zA_ʆxĤLXCX-p7 T g#(՚LHh@ 4aABZ4Լ `ec4pjfs9V9H iu6,z<-(^*$ fb8@/YG}(Z@TWU?M\fشQӊ*/yMxf|8%;!!?]Dal(D'p8C^ <=Y8W3~ 򬐣q3nԣe{ ASBTrTA _;ڟY/dR|IF HF4x,*]gy9 Fa=yO:&]/4]N$d-~w}䕇C6_@©ӥ*l9SY6~ Tqͦ';2 ȱ()b>32FMxI4aF. rQRRIym|1Z8>54J=?U G_C+\}2dx}!i" ~I"셶i{KI^+V]q?n˽\#QXH@ 4x#G8@Jxf@l,B"ɡFs C$ -()댇J=i(6Z癙GE?A0졜z'bj2\XΉ8HR"G/33ҩIݭ~?O5Ȇ4ZGn\oz_?]6JBART6y fFOpI%yHAx2 @}"+IUzN5Cɧב籗.-RwI󔲔),Ƈ^1(N& jm5ZO96X ڱSCBeAxQ7b8 kr[K|>>[? <4jRwwEDQZ3Q faT?@H`$5H&!u [x.Ϭ~-.Z\<=،]V%)zɎ<,Iz%Bm@h$mBH^Yu7m _4S8ʧbh_ک执?{gtMFa׼'_jv4ޚYFcxڬA/\=os)Ĵ|3Y" s,ex$H(Q_BNl F={RߦޖUE4"F$ KzpuSn.gSs'O.Oqc`^/GjiU;MXWۗd(EB };Mi 6-s M34.zJ \i;LJzWJ46ɻLjM.Y82м ksF^L-.4M8]n#qxl4j:Qx l#)^[N:ĥL}LAXaE)20& cShڤJW:X|q#z}DZVh:TrD_7RA?\(U5]""Q@XsCJ,eIĀ.Ъ%M6/.ģGge"ظNzp'$6 V"fEy4r*/Qf "+.gt\!U uU%].LTF͎>HUҁZ`$;^AD$UMPvC__xy{8L]G*zrOڝ_MyDaxŽ2r8/y v0Ӻ5:Dch *C>?cwX+%81n/IY@~W81d$fF:4 /A_6r'`_}*a8G !&NTI9i $,֘t>[u"fo$`+ ͒}xgr!WfcOr{%5r5fO^^h~ˢ1Z3QA3铝7oŰxPot Tll$&Y VRV'ID2.RZ5uuª`LM?`w7 [ji2]B*^`?~|Gp,FMZSSE0Nw=U !?  *F˕ʅN*:t+F__fpB 4%Md j }4dA//WY>Oǯ,Gf?vuSJ#aVfu} Hy`n`9a# SJߞ|s~u?[m ^)oS#^%kmv{5u(ױ0 ?~;KE:/J=Y*\eeN&64Ctu덜h>Z燍ES7Pֳ+/C;-̓ȁ aq'+)k(b)oQ[03ar!MsxϷgoOwwO{گ$:= 5\tȽH W>x%PhO2i>>`Y'^T$rA ֹY\t -^me9_\:PZZ|2 =mm8ݟ|>lH8Pˆ/ăoDdg\~  *Xm }Xp:z wxw?^O[+ǻA(jc{_ɡAYEpȠ28Xw'\,b]&׼9i@^SW@.Nc)7Ɩ&'-Eˋ/$}|ۦ7=={ʹwPoHz6Y8{A>4_@̅ưA03޴j](}0* []ݱWfz]<knomGР^qqV6`1*l$G/S!nχq?Hdr(V;~0ʑlt"-W;ç`֘}ID">N]Qr_f<L&c _u@#YlvB4'D}G y.j^% Br.jV<^u$i 0I)tEJB;:\zFAU]"ubFE M9-P^-q0fsh/QhH3F~CQ K8gZhȨ%:szB"`B<yu;nxs+nf*ٟ0h±MR+b5Id[o+㛷'7[pq^_VWW*˹uI4L?)lRlBjjEu`q[t+˗*&yq;#VZoOoQ],[-`ó(-_-J7FOt*G:A̗{5#՗5ȶIO/~7B^]oض<|"5Rb1jdȝ\x\PW?A\ӗ}B]MrCu jGFE9x:4/3]8;r4WY%#22-~ akxӉH0i#NZq-SպMڱ0~% Cv_>frݵ4Hz|\X`푥My`l"HڔG/^D{+H/7I:Eh@< FQP,:qgycՋxfݯ b1(h 2jVn,=]vzjhбT E*׃!8&zy{1i&]./YZź:Vz*}x߿ )V09nbRL/xû`??]>8}b~vuؿeC}HfmVh/Z_eUvp!L+Fq*oO*%^F"6j.7I~=8;)E/oySsb9`'Xn˙ئqi"W6-磸M 4'`F€$dna.9Wep{{sygg7wFfͲ~JE"N&w6T,@er;{),!,~jy/Tu()ݳcZY^R˚rހjڅRk꠯ --/uI?R7h;F_ޏ}ԛHQKQQa1?{bzIJ>nZV RIP,CKiuṫ.nVhU2j_6yH>}_/eL>~~ŏ<v]"}O[,(9gݿe^<2ai7VxhڧM(`W}Ǩ4*Mpz2 oX@6Be::'W+z{K. ?v@Wd[\ul}*:-:s۲NWO닙dsGE>]"vA+S{ g][C:G=g˹%޽t+csb /(:zCd=eMfet^KjQtx?wEJuW Ig1/9˟ꬫ?Q}1{,VAf_|5((7$ozQZ[IIH oL!&0Ǹj/K&˫n> L\NLry:0/I+,vax3 ho: B vSv1fiu˲>GxЎ7֖ik}`.Pgϫ{hhDmkZ\%7aMo2oZ͑6Pgv@{fdDVO 9܅te-{8L?8WQo@N_V'/$e|NEN{Ue*YU_7G{g"d7꼏8tIA'| [3Mf݌n:ڃko9βfnnu+eE"ZBėeqj<%`(z72,:5~_?0F_iwaMjheؼiZtop23-zW}?pOg:trZDq]ކpT$ʪ(эgcLX-P/' PTh7%/Q'u޽ e5 epWlDHK zl}d>AMv^6&E>`2o"<}r1X XUhQu{n([koZ:ҊyOk*!3b }(xlhaڃlŃ"Njs/^AN,:/:轨@B@'H@Xx#Gsc;[%.rnr1 >bú`@%& ЉIZg/@ZDCHV,VC{Bi&hd^N. [zSW^q emVmܼ_׭bC+M8nȏܓKPQA;IO2& oFeoRO=uc\0 w7 Ur^'X T.-N+tr6 k S<5ǹܕi6g|DJ7}NPo\f\e۴DrL[6e Ʌ7@TT?!@vƉIDLۗc C'ĸ\.~,&Y?"&( ̻) 9y}Y$"ˠP5n @<G0OI7hde\188kM/H8|vJR>ISCw_/tk .ow XR24orᇪnA6 e|)Uֱ=yA Z\>+#驛q\V>[s%rWVޗ )v(k h^ i]D_++?n`  dh_ՂRg/䯛bB"'~][P @wqE!q5 .\v %)Pzvҥb96OےC)~&x|1j<A+#NQɻ{/W=mW(%9f#(ާ+Zgk[MhPI玼r?e($Ēɓ Hk'|< 0_%2ѣ*.ߛM8o:<2~r m;[{/t8%/M^kLL@bl6i(z F?܃E ^@08X1't7>}hPMj2j  O(+u@-Q`rxzm,pT@+y\={Õ_J؊͐X""'3Yh0tcfj:teE:nvFR _5QCQm/&aŅ"xlpnEJ( Q_&Ej"bg3wf쒰ځڇ(sWjх"ﺒƙ7.qX9irc #+!=9 (_P5qK)I6J~Y ˮE_w9(@nZ?`w*VlzO܄-P0;.eɍh˛=6ƐaBAZ/#('x|-?iʉ)rP/xwjM>au%tZ# ftڂ.qMutP!9OX4~=<"n}Bnc0Ggnr|mOHDz]x xanf\`Uw0` h>/puasF#:r2*pH 8^_~GQQWy3mKrzP]|%F\bQx;Ygf}<֩cOgIߕ .P#5p.'/:$~WFyСV/>0tkj c[.O-3Ҫ,~Wtßf]X(-$b [#;TM뇜CT9@{ ʬ}̻_N*0p9Y3m+`qUBl({| /8%Ea!B@' =v\A&jv_{8u{u/`u%whQ_[DbeA~7JwR?,Alc2~7 + 68(!ِom ok-/}EQ?/r \N>X^W3Xx\^2+A LxեRjFv~h  N1ބ;r&7!!6pu3DudZd2ftd9g@~R{uiP&-EHGOT Q;HRu<A99 UGAxr_o ,22 };\6<Pd"6tjo@uCP Sa ^1$c}-xo B`R( *(NSH7ؗS!-7A_׶.!J1r~5$ e(}!m0ʲ=ɓMLVEng(9A_9xFҁBxSߡ-/^N*u7* | &vAH>eAP*xv|1\=A ~`;ӯmRȓ0V?R]r--?dEY~vxP/pθW0 {)-kx 9SWfhWP! K>0O|_68C)bM)c yzZ9Bc`*P^^aM'qAhڱ@qn?\ <$B['gV|t,]cj ױd#a 7c+B@>9rlT 岶.;.iU_$L('8S4/X.g\-wj0 Ph6S29N6hI+|0qN{9\0ׄ! ZW(C;Pčhv̊Ak.g\qv,_(`H=z*2w-O˹Ȩ2y#.O];NŒ<6kcV>{A$ehP$5LQi!%'tD;d+s)Y~a\pS>xR!ϊWemh֞er:2idd6$F yE*fׁt! 껱\t ,Ikl)#ON;v: E}FdܳtCЌ^a{3QpjExmD5-@ܵrōTjZu6}&K>;k t9xxKěI)qӻn@x,nS &a 6DCX6C-SNID5WwMIMzvi__ax'DJȷnZ? v~\/0PhnӷMp}, ~mZ `(&EqZBiݔ\A:/$[ ^u[y qMWoeF:@Ino/ y!VdwI$0Q(>SnC; \O>=Z o ޓ#.'_0 ){; BHo<~S Փ.v*ۆVGz嶈z0 YܧƳ*2Wu#}ĭtOcv0) ht{ltwϛ>U>{@=re W*XOq⤕v݈>?8}:|QïI`ɺs яHa^'W0~aM:^/!ҐOiKՐD~u$ʹtL 2^Gg2M+fg*N'ɗ @T$sgN@ah?Q֛=a$͎fuu;QeރέnC;-W+=˥+҂.y?SI>!lTLɌl wVW/u?ȝeJFeI[b"[eaT>B>UzRu|B'B q!hO򫋼pc0&+5Bo8ˉIۦG3\$@vxΣP EG:-Dܰ+M$w `HB-#hQ}>3k G+#,^@oVԎV S"<.wF:h}&1XdZe0V"jmtɉ 7BNJwAJZ c"M7cze/!dVFrM"Q8Npm$$RHwC?9ݐ "׷*hs 62|s$4!]쟎j7@JXW_xhg R~< n~U*PSi\ oHQy@+epUh[Vki %fY_KX*Ɉ/~iT@ZPHTQj[3t7B/Y'Ձ2j\^(EZH4Sv6mD^bK(2"P*n1PO~.nȓ9M9-8,w70L' (E"ٗsPHn|C|,G2:gJ+ңXL!T뗛kݓ3]&@lE *#IF| h-Nr0:n+}o(s[C ..C'cN*Ab?~,7r4B@{A2K`>k*! \AIxq Th #5$::F.P9OзS]/ Lv'T$Yқ?]Y,XHAVi]݊Ho _VY;Bp(|_zh3ubTtq.L![%*P<>T7})tSt!Ȗ&7 P3c:(8S|5v!lm1|h}m"`XUp .- ٞE>aF#m7[xy!ܺC&[^'N# (Cu vtd+ʎB[dmQd>c"dPawdHKY![ JaF^sDr.u~7,/:uayW٣R!N@`_7G6tp@wO2YOAdi8Ŋ>Je1bUxBn7"6Rr Xڱ(pt\w%72/֬,bpÀPG\ 2W9ݍ,cJ6Qۺ%Ѣ%嘪S@bPίC.Zk-&0&_Fl2%a4OlWLq.~4o,My):ߤxɈx6~ x'QKAq́f/ խIH7zz~=Fج~bs&A"$k~@$/;',L3_6E!Si1CaSui, 2:D?\ןjMw1`,:.ٷBP4ʣB.̋@B4(B/mSgkLC-M=^ZǗ&B&ȓ}@vYRr5ڵ01f9:FшFS(5=kne3QL6#]^$]WVx*۩X0?P׾;qm_\:6zp\YQ*AWj\ȱOH89%($X+3j}k 䶏1780@<~@0[{Ɨ D ':⚌Oɂ_]DA`iOI h$h\O;CgbA[ t]\ւQ(GiNƨb#sq8F]_,}= ֕?8;U;:Jp$w͢zVB" [\R(wt?Gnދ4LNar:xFp򍻀>t4'!KGfJ{w$?)!fj.׫J%l%S,a: pım۾[c&@PwGRtO8MMu|VM to_vcη=%\緷s b7;?B3]82>j:0ߣy#6@ڭu>+ ̡b87f7S#l}w 5glkܩ &ַ)=-8 ʳ1;!FT7s ƹ@E1BOEu 5 -a/ (timI B4 Ej'G];&t%={ !KcTb"á;b_XiH9^}<~K١UCGs*grAPyZvW {39j"`j0@5N3Er*Q$ 2^DCA㕀4̘ڮG lꌎ{حJ.XzSG^*7l߮m sƅjӃr!zw1(Q7xn3ehVc])pcXT.=wj)*!6סgPd49*P=P¸9h(P)/Z -'rҀ%LzT(۸GG)"U6Ý6K̐d<~m"J$N Nwӯk^-JP].0cԌC4)g 6 bBG.NZ%P-2?(lk}[ܩIQ4ܗHy>}SoMEU&%hLp!HkkEef&ԮbTp(ϟR6"C"w?΃+= 6ȣuY@wBwR@g0ddnNۂyyi> 9ٚxJ37=727߿"&v `_O. zD&0^(\,I}7OI3 <3Z$%#&7Q.#eIdOw.A |r >0 ELa43mEu+!/XS!`0A(Bi٤OB?]Ѳ6ţ< kw1Q#ƌ *A*Hh(0JUxܥaY]^+OZiNZY97$_P`氎CkL 8^C][1x |?<xUcUfM8C7rX|_޴~Njn.]uF껁QZ28DJ3VgFg,|jiRG2+>trK@lymd&KhBGu m9b內֫DERA&gރS4LWq,q{e;H#N:Fhb &:@u2X%/o'56Mfn=gne``wISk^.bK 7]YAEE |¬f1Ň/\|?C\AGz;_΁XomwPΝىFU%k@вsV9kJ"|6ac"xe:!N/b4',msY=O 2$zq5x7c]Ngk _ygGހgY vuDÕr;hs/ jڍp+Ɠ$)L6 >LmpaVygfS{(5 sqO\=)O$fcg=5Mg{{'0ځW}Di6[0b#*0@rLd /ۊmAl2{8/%(F3"f @77X((rcˊCƑk[`BrBAJmdoc^ܐDĚq(2ϯ\ݓ^m,t+|2'+L QPcBvE0YOʏ fu\Wɹ "Tۘ(&82{y93QwXdZq!2ସ!躝 I++ƹ BE1]mft(-HrvM"NF3UֻC~o\Pً4+zpݴd&3X݌_Gı̧/.T'IU8{iO9{/;P A٠Qd^9QDϱ3ʍmaZ!kyPFOx0>c6/GdvtUʧ_Dx *TRg x+"8=)tG)?LrTHt1[rmÏ8>lv,/3lY;a)XKFBzi%L'IgKQW_iK|b[ePvK7}ikk}L"U(ODK\q$@&ԂƳ^m.x vxPn"ezإ:Llq}8\59q5-Oe\?uw_ӹs qTn2t6ԋ YNWmfS|ZA7-|MI><ӬѤ9,A Zԕ"y7yK^ iʸV8Z6"-W@ìKd+B<8lr;Mym(y]ޖ='&c27SO/қOWNW݉J=Lp,όp:ON(l'E u:垡B5O0OJiox\pZ۴=i T>xI( |ҿL /~6ϏvȞy0AA}We,鹤yEFliAx&]Ѿ/Jx?}Za7&ȥ,(- MY” 204:dk5 U-XwGM_Hƾ+Lv琋hd Og(ح)嚯}rlyr?m4꥙/g~H#/lt=ŽZ s{*T߇ak G\- "3ߒ{ϣ9rFsh1 L%0b :xX{c:@deNOhr']v/,$Tw-x ʍk {BpPk%Y)c4ktDGr\{fɜ\{@ly "FB>'),Vwz@]B9]aՑ'},VtKW_ Я[hF|_Ŀ\4<!m )Vp $j <%OMW%,ڂ04_٩9fKVe:+Jɦ8GX:QuIY9rˣmq/M<`fi 3CgׅzS_2gׂOM#ȗm||u:,ER3$c6kf߀ ṵyir *b(8Iʖ*Xs&{-H(h>+}LBoy"@r)Q?ۧ=TSVH,Tz4.e {2C OJnjgX* 99Q#I!'ںBҠBcbAv*iwɢ"?L T)bi Ce<䨙<КfB/'T N 77m,A8(-tw: cnBCv9{|L5pׯ?uƪk#n?re*5%tLaN"u@TBUЮ$pk  u6E8-&F 6}"K2p%dQX;??wC&jnj#QFQN%aN1п$0wVmz'VSIWX8̋^sHcP6{V 09j&ncM<>t1WI[Va͘µv/BOj5\CO3*;D yl>ZiD™ID.k9<4/Ky.`o/Չ4ɂԫ>'SPa|Nqn1>5+X@81Ą>oOf @^Ī ʜ]Zmip w-AXaiL]d 4)O+"1lN~hkSP^T>wrBzw%H^0J.PȼZM/!rxzINfR,#.u:H9 otem]/1mw_`62ߞ?} Ei?'9>nOFrsDYFǼ_w?d0N`2zHLH՝Qf{P1/ 偑_gsr ~9uo!Mvvs +ȟ1]͏rM¾ ,M wAeQGH9B֧?f Q l] =h2Q f= X2{et;;Ppf{Eyi< rk@D;牜"1b! U( Vmo}r/LD=րN]~ 'BȈLtVuXFMe qRkt5qD6ttpJ^(uVfkpY].˛u/ڬ~̅(.es"tl{~`z&g&ӡrQ Zt)] k}TBR7Ltt\F.{5Cj;#`߾Fv)DLwm_XwmD)^ ho_r隐J1TgX1|A v r _'b;w\.{0[BU;ʼnO\# tC 7mHӮ7:~?h"_ߌFJ`)2y,ZHa A 3zLf]juVO^4>ah]bBM` tlU-Ey &'v/@-*GJL#|a\<'']`.AMq5 > nmx|'r&\v 1oCeugpŔd(wp zr!lMNhAGd(R/kS0ewc23\oB",Dӑmf7ŀ= p(~M;utgʹͣ!M%aQǸ1Mqr"E&勡@/~5Su9%OYUV537[ʀS͗rm(EWs (אOƅG41BaAxx v ph7 ^z`*Wך6DRT2PR=5\;rgY(7BޢO1|MQ$r.I׻X}%. }m1 !/;~ Ve >6V P$$<=-" M >Hkvl` XC(mϙOm$/-ㆬ'. =\!:rA}:Qb 4;4`mVƽZ`^Z6"IV =&Ɣ]_j~Zæfp"b)iyQb $sjHid.;T DMhb3>@1/AE__6=7q(_̍К.ɩF V]M-LAa0Ov9zل9_C UjqN[/]; ktP׀.owͿȓ92MrKh.?%̶_][А.S3[kخ AQN|H#z'x@yD.TK׻ gMɼ\rcIIlܸ6-]p-Sְ2cO@0#s{` MP%wh, T7R )'iy+ BzFѶo봮aW"$EbI+I"a!/g 䒒^~s:y,`Cm>b,H R[ST\^唙:A}J<Ec 3b, ڎ8]察FC(к-` ~Plzztp2LPLNXCQE" & 3M2@|b̛Ood!e&]G}Kϖ~e)ٛ0\"D2zS3`'b1+B .WM/Vcz{{`Mp[fǴveЇwpI;aܷ/3yF(|(tL@Ng OhyY=;c:fVAsgt'"Cw xX0ɍJQ<`yi X r_I(\(Ͽx_}]" 3=}ޗ軄ߺ+(|IzVzB,ղQT7h o  ׋'6ys)pC@ pZΕ=KMY7-2+Ƶ:tYJ/\N?m-+.#:jKNYq?QM,VBfÝu!PF9/+Ø2.q#dFZrzyyE!2ڭStSRy(4Nn1CgsV?DRX, U|@rZLd5.$m7|Q#̞g2̂@``{Igl(D"U {do:^/kY\хA25쐰/vl + QKB/{4%#8ɬmѳ<=ጩJu?m% (5Z ^S{n66,D*N$ ~^c~gY,Af0Əyu~fRPxxmdEMD_{&K 8e.dן4Nj~,I-gY-cƂQY%e}9ᴈAsJivTnA=)`Z03ӶA N_CFaRW)+V]:)=ss{Y4H3FAj[&;B͍_PD0Uc<20(4Z f֬q+O*du4AJU=~{ݺrVYwI\-dMn>@ ׸ K-]s?߭'`]^:̓c GY9r.=%l2k2ݷ(UH $_3dM_|{yr%$; =_,->l6wI,.ytRҐZidtk..GR%a(Na&#> [G\:nGr@eQY9\Sj2L#2FuRw|waax o~AdHYfWNou2z%\֮5ĕʕ9=?X1K3@b3QDOsyM􋯟z'??rJ.69W]SS%_cNQ}dQmThQ ttǗ6o|vsw/vs\f%:MV&Q0EN;qhJG3idAs'Pf!9)ꅫL !UrL.(>I T5+єWL4ܽ*n.j$fF?i$pIv$)n}OR%:|)QBOĂ )c#4Q[dOpϣNIMo~I7-ϫFR3d"SjC0_zI7P%s݃ |divׂ}eUnP 2&(B}J_i oZ[OyVUYxPAȚ>,e=0zx,q@.^5ҴwF3 Ӣo*#4 {aiA@ H͓P<7f[N$?ۋ@Li={q0Plq_9-|hzz|4l3 ѼCl+Gz)P(LL*P+ s $b@? QxQ{3YݾB٪ *V(12=N㠴87vӕ'+ի7Ǜ7NdZQ~FFW^ Pؑ y3ORR} {jl 9\[8z/ m9D\DG9O+mӃw{upxK{Q&j*P@4a! )$)HO"EҎo֑>*#`!{q=A=LwFMћ<>|s|OĽ ƥXZL٨$S{ b&`rLP0`U!2ʄ_p/fqܞ]&lץ!k&uʿH/ȧտ߿?xu~=>woy&αY C LRt+5Ha`iS3M8lJfK%{6+\"n"LV&d4W^wib5ZCԕ*rmeG.[.wnS,/P^Z[LZ%0 (}_5wNϿ۫/ӯ2FߵN<ϮjuNktl(4mFt8[~w4jO㖧{3Պڧ??}RIMd@Leu%Sl|},#I+ N:*o(hw'(sC--Nst]ӶYh8ϒ&YKŐK sjFZ1Uɧvx"4.m괣Qۤ[$QEaw߯7{pkh ;So~^oUxe/^fofhn{+jZߍg٨%2VʦrɎs@Tb na9}Ǘ? kW^ [t+?PD5fG?MXzTNdQȬ ?k H[홻n͎}Ng)/Zf-@N|gcRӱ]iF}ɓPypJ`SZI'%Y Z^?jDS=N"={ cqlma9Cfg<^wzMo6V~r%*xJꡛ_,9 nj*:f2:<(&W!==H4 L{TpBiyT0upowT<˔Y]$3zPM@^>RTq$vt^o.咭rdm>.N*0n?j;}E xMG~ e`)PէyBfְ֓?Qӭ` rX2C7]"Gf ܳo#1X3蠹A1j9qEm )m]r#ƥ4Z .^Dh852 =mIl.nxE'Y :5k7Iׯ]5oFoQM^ 7O\ںd+%޿ar_]D=~8]t|[^ݮWjbG@~EDU98$:BJ% =[d*T>,M)"KN>m/n:)8'W_:Du:{]޻isgMIŋ)64Jվ o_} R^->akHP[~Q֒!~Cvڇn8kgn}A1x%VUJ)6Nijj” L۬bu4f3x[EW lZ+@1"Ymň,;&9UL͑|Tj[FY yv]tZ+8W "HfncOOLխۋ/g4OK<.yjhsZUgyuf##~^TaiE`DܼfðU'/o|& O/G`wLoH@Ek,^7-N3UMQlEbVڷΛ'n6[)2ɖٴfNj\m& #cjurg+-۠tVuӽ:u1&6{3Tu߯*d+(^;DðW5L`ypLme0lb0~:<=ӝx9:1c0= .&n^}19-k'8{~><׉RmLı/p3OL ,co#b \\]ހB4۩뭦3 @&)Qt;rUƎj(T>ʋ%|YdU"וB>Y5,:y:VnK= ԁT25۾ NmemI煪(CH~}9T쌄fGWke=+_c~I Rj3KЭ|M<_h7ϖ&cl /o_3"Ik+`N\ZnoSyT\E^Aa-ѻ=+Ohe^"B}C"Gގsd;cQaCCځy!˯`~%iƅ#L_};uY;T8૙u%)Ou6GOQӇ E"HvN0,gAlJD[j ږQ[0P_)LuM'1jkvEװÚ9n7 4F5Im3jO&-lr\u?Ճ%8ğjB#3'כOo/^yAX#@<4@3n+*IXYZI:sd\Cr^-e}g=7ltE=lsjx 6?c%{bIeL?$CeIh:tڊ:׵p0l7zaM;JH&{x?\z4kO/w:WL!ntM5v*6jqہgAŖ~UQ*КZ& +혆(>A(ԪF<7-ĥFݏVѯ UZP/?)h&Z+xh)鎣8)BvJ{}uWT/°_%[1xxŌZE ƣݨu`vn++ 8*x 7#px)yrH:lqeXK/&1{^ez;,\1M=c.ˁ[ZeЬv5]r{~cR1x2g4W,¬~-A@ӿEnɰ%>6M$8j _NT}bZ;q[;JO! LD^K'pv6&] 5_䲬PADVbh#Qu9!vIZL6x}HgQsbٻ:+V1\3ic2}ၴZe׳i]jjFϞ޽MwA!|zėV&yH b+C⥢ȌqByDPvƝQ S\Q%f.a)!jJ 6 + _O Bp3\@P<.~:X$f ـgK9+6D g|_,XUY|ۃ=ީj!3+Ǜ\J焫 YZT7ή>/}8ؚng(NnO{>aRp͂JWAzBUan(09m!b+ "'9kJ@gsEZn. xr蜾($&ns-E3 UQc|XI,s} lh' R̓8\zTqx=kW*Z"٣a(?8^߾6oݭ1|1k+\I/,äe g䴉3k:&o"u\9 Ki-?$zl͓̐[^ك$|92~nRtUy*9, e9cY)ÁP˴LL}çOQA!TUA|;1$Rq}a$WwXd*z]+$*zCǪ5\?>%9w/n:+b!ދ֘Nkf9zrYf/,.֪YjT+Mgqe$zM&j6ĵ! \ZKNCJ2I((HL&Wd\P9ntrE{5B"5L""Ɠ׭bM^nJolk|d)g/5w({pp],lfRڛݽdd5s[ӳƢwgEԊ_J6nB\YNԚJ=˫n[J9[H AדCcgh}y9x-0JH>?~xUS)VLJ/7:d/f(bSK}_X0N`JUsBo  w+P=3EǗՂ#dtL7w; Ă[[/Ih7P|)K^ ]7(h35iWH@u_*sʹ4|w<+I8UnzgSY` $zԿ*g/NQ eKs˼d8\T*dm-i}f)orn#K,Lb5[!~1 o/_lOښ,1 ]f7m/~O⾊G0p5*׆XgׯOoO_ُ_Ӑ1vW҇z;DjߘO+otXjZϕ ͩW R0n _R~%G J(QC3h7:x'uzs_,Xofo8n]#՝8HUH䀼>[v4udO$]_DX\*}vz?}۾!LBw=g'g^sr8V_XV$yw}5ea}}{oo,f}jԦy|ޮ6;nt} ۝*ӛ폗f4>^R*(LvsK%̺zw}!~xS}b/{ OIܨ~?(ZG^5Xzzmw&L ReP~X J[\;=A7;nOJmxgf_T;6ߝtj9NpP ( dԞ'Wm7e?iZu~ebyR|'M#8?9f$`UDQӯ7'?Ff"+Q%YZGQz%X|U$A$/[;masǃ#,\5#xiD"%(SJZq0J8,<&i)q Π 0\(.8E(1_Ch)ȳL 6T݆]! fE$2b;e=b tO:w֙7gb)j>tӷoGd)GQHNH ŊV}vqu> BjnM TKwt^bږ_APLAHґٹ p8E :_^b!7\*I(]g;Src#.X_tTwZ|_ J$CD琂ZnJ$-;J)]J"Y(Ҝw/OwLdtGl4Zl(mtӪ4boW?;J5(4 wFoh)%S0_sUATM4-N8 y*e]Wҋ/;jAj<8^ՇX͐G`\ kuSݷ;CbT6M .,veXYqQZC9wS}r8Tt>z?MmeS|si:RXu~ rgZ  X.NsRԻ<p>qX0X[1knZ)#G4_F'M#ϯ=;5mV5|h\#cΥ7^eUYuE}9M4U! : 橜pϞ\6hJ;eDl3޲lчӅ8yX3AJf ":-tqBpB/*)<.GC 8#2GPv\Q4rZOJm]ڈZݩ[ގ?#)V;h՛BŜr \z߯Zv8q"C+P$p@VuCgNC5j(F\vdgwKKKd5|go_<1*2{{nv&p; ÷hd>ޫ@ _[ol,ntrcm-3FwDz|*9S jݟ}()2(|{IBˢy6yK !O#Z9Sy/T},KkTܠٓG9۝=KGD6\{og7&}cdW4}*x[wVxs{z5ڋ:z`۵zy؋םqCxBiVF~U3('brb7,c{~3bĢL+jaJH"8o <5 NaX`3OÅzcx[N.n( 8GYIMϢm+? a",8Gr$Y5P(Nˊ ycZ%Q>Py!ܜhDou]H1$Eư3GPT7[l1zGahg_X.֞v>nk'l&fjvU<ݵ=4hv6,N?UBfQf JŵNHܜHX±Hf !gQOiP^cZ &x""(Cl|vo4{RJ^l:ZnM:2śv HN˒Ri@ud)_%qbk:y[D<3C?9D" FѠ55{n ہW  fQSnիzm6+"lYF`FK?5]MFz9l}ۧ=/]_ꈕZȱh52Puisw:݌D0v;7g\,3z '_~y]q/Ɇ JM)i5aD'eBxEM㷪f -*sSS uI +Y"t4vk0) +A0,ͲmqۋF?ѴNf}js{ñQ"DSRן(g׊z~^{n~ :(h bnIL)f$[PpCg +\#HOV֟<}JF{zKY9"hDe:hT\Өz[rM^1mWj*K28uysam[4&l?ڙ %i=Xz~'`e}u)VԂbP C\%~|t8lûd10t. `\%_d<{=^]Iײ" ke")YdN?٬et Klry9.@ 孀|<1~ Js05<6Hb 03J#sCnVz=wѬW]: `n,3bJVJcZW$.JT4$i2hf/nrҶTfĻ/w?|ckEInR<v?4틝~.&Tx F nB̢}*x94F{=cJJ)A%tNzw/fzݫD8HY2*Qt ;{vo\s{os ׼*X=N6{ zdn$y( TΤ$H0 `5?_RZێb#y82PX,~T Tcf[;a_>8nɚ"W:p17q)^꫋B6OOd~xӏ?x"*8YgQs.sGfj::;pS-{/tfE 96:(NmW`=ӭ_^Wk:Xu;։ Z=Qn-ЛNrU[8Y[F]is ǽdAnR1#n (dKRjq0]*NwFB8ҥB.r8'R .>ӎmˎ 6:4=sBs`Urhik:7z*o^nmtwn>kiRWϏ_<%KkvZa'Rn;jVt6hꃰ>ϩM2{k Vj }e GUۇv) ˥qg߾~7k6oh+|G>uF*L/WyR\j8Ha=J>5dL[.G+[^=b<L"~{mI?+fs}=Lڽ*I PBI ӎ =}*Ff{7Q˭oe\D3mEd,k9~Vj9L̵2l[(Fvz2 gQco'/fǟ~/*iR ~`tՋd8?Yg oq\t0EjZe:;ߟl_5VTFdӳssC'Z#?,]VBǛW7ۻȱ:S]/d1֨}a\z6J +$6[ `USޛMw=+xV!g;tH&UJKu{t|gvџ.`$S6/fsD Q_RRfa`$!\"\"@  DDJQQ(etڙtvvn=ϽI>yޯ$\2U /L3F0Ȋ 2kcaRњ󦭔%+Q8Y4^ D4@0TleSa̼piXEG\fFQ"x"R) * uvzHmb2dt YTsUn?T!)8g4j*!\AH϶fhhMdԴ\ ciZ@ؘ$'z!ǫpUOdnKV.8MsI'UIA¥WV\¨(X<7#I): b(kiR|8ܔW/wܽ=~1)s4%ST<7#Zpwnkz]> ח~:̝ۣ;r 'p*DG(Ѿqp<ܬ,”C\ @%/"1N1UFHl0} F qnj9%%Wǥ^cMH4)UΞjEP"N"Lځejy@++y&eыezbԈz.rXj=5JV7/n߼_CF0S}tzCElDírar<-6S(r(g'/t62Q>8qhp|>V'5G ljb2)8 !/)FjU:NJAxco0˹ခD:)A2U8; m-z).fL2OfSpF Oln0JGpc*PcA f= %Ly+Yr+(,4kuw9$!'أmsVB$qt!I#jFۧ3D{ͨ!IaOBl`BJt>X]滋w"|nQQ1"ՔbveompHIy{Y!1ρnWzՑG-bh ,G"ƢaG-V**&P0P݆傓<UW9=In\4X˳"ɉz E*?|*_k[ 7:. mg L.K瓹dԈ|dJTR &޶퍺an Z۬Gjr}دυ0>QF]"R#שif є"Bl5ED/BT!0os9:1GE/$?lW~A Pzy2\}+la?3 .jU-@>hb( Lzd O9Vs]-eHGh:z2v z"J7vUU^_U ٶz ms9v/|Nl4T:5o|tmъp0{ܠӑ")&c05Oe# }"⩝ =&8 <qCԎF|Q1ѳhS{.8ϯD9˦\fe.!e (r۷ xJ+Jh_'a(iJNk0YBuR7Qsm㻯- BG@`D? xQ jNQBf|%C VP7ǂ)KHZ'mva q6Իj ɨ|Y+G}߷?H,EƜ) @ub$ВȪw},aiWw:ziӗybZgɼk\ΦՎG]Hx֖EC)«sp2([Vڑ7(Jjr?>5@UM 8_A428IHl'Je~׏7!V ~ dZMsNp >Z(fK3;5rʠ,#PݛU}Z@=,$LiF8A9+dRo 6em'x)WDŭev>N",M JuG%x_LO W !F=lX{Ѱ3OKr:p͡`kY%I4LcU46sqˑިhOT&l^"/}nj]TMҹ%&5$] N~X_3B@@w7LXl5ڶUIي}tn#r",/n#4~sl<&:~2ʐ$>O-O(X9>zM.RrpO^$V;e]Jkݣr03^|G=x\Å ;Pĩ#ٺ:;)Go-J.[RI-~!F b\x?Ok ܔkIeO{;Z<3?|MN&7;Je EMcqwhU`# 񶑜B<9S۝|AC9ԃݦJ(Tqn 9NZSgaA{X\B܀; Һpdn-"k))9<3a8~i&ac7D!֟6J&B|==:Ns>d-rV{ HPU)J3Z+Ӟ+<-pd$` I0250hB)7gf]oqK OQ0d ؃ YG@ d1*OB1')G8>|5x«_~ZN!bfg'f#[Jo2*NV"}|_'xθB,QI,@YIrQDQq^VIjpngNR 1M3G#«yb)"R\TcY-THߣdQI6!qEBQe-|v^n jUlhˀTwKfݜmZqخ;@&vxX&$NJBh,z rs r8N0xe ;>m&'#$XI\P,|WP As`X(N 'q||WíM\96:/UkGBQ0/Q9-Wð&i!Lߖ%!dPqғ/J>Ta)i]wGGVK]e \f&2|J ¨qRHL<(p>D\#F_ U-0ty#l"t7s+ ݹZ8 'd%L#1RY&u~l`{sNQ/֮s,(6Zd,ģJ_ tL*atO͆cĺI˳,G*py8pש~fovw/IJ潎0QyF_񫽄^@aQi'4>8>HvhEn 4橩#?֓4";9aQ 䓳sH^r5!}f?/!bxd?+YG(Bb>5t$F䒳};|Uu5/ґ [8&J(ΉRb4:…|wuvIuA!M~,pN 8ameꢏ}3xL**+OQhW?r/F 4 (_ 7[-$EW3:|Ǐ7e)I|[j,v[sI(#qC䟛˫zd_e]Rdebœ@Lmw&NtHtY,F,MNj{Wj"JG)^:=W8Dڹ~7x4TQ1ܛώe/d-d"o4/Xߑ1ϟo˾;0sʨVVj[W⩼=oMmnà qG/a7SX g??T?|}E Ihfm;76/.s%n޺+nF8 >Y|l♘GLUϩ' t7RR*BVMdzoYëlx2~?~QL}j/ĠDy.cf氖RDPRb5]Oxg{Þ}yC^ɶ:!8tor}~IlspG7z_?}aZzxoaEHBLǜ:u;h6 -gDKN B\x q([^qC:7HSF!cla̟+gyאֵrXu48|wF%C|%~ɄY@;ߜfd~, c|wPsy@=4v4?N2=L/_5@ +8(RX=h"{ۛpg¼:A7"էD8R0B`K9?@u3 J #kpvFٳw׽u_E= !O,Z~/lr_t^nޘv8}-<:r?jۉ>ApkƗ~+;ό ck:v|zQB%K#9//$TYG(;cM#kԎ=^|ZA3^Y$>Ƿ/U-^essz5ZW^y/Vߜ8pL]}-nƣY?ϡ/;7Q̴Z'C×Ug7דJ`anw3?gJ1W6 a6zTg*@4v)OcE XL" N$y w,YoP}Ppךj+d[ 7,:h2U1t \e)N?v`B 8%8Qc `x ~\Z Kj -Zp: ̳X{d"_҃EPț;ըkZ{ p^>"3h@.V,+U*ZZV"E=~/Hɬl{ZuT>s9(ÈEelӋa$.xc&EӖuiZ˲L3GAh4뵖UhU{VݮgGiD߹rw *QCJ6 J_5MVl|6Ms[ jvwح{fw_ˀ(@/.> P H5fʕp5_>m ~x,<_ڿnCM.{J7Ch+raAʤs=V:MQS|4)FV$~n[ՈnMؚo67=E5ͱn(ʎw _)OT+R^-ܶB|YUjxk]z'O v 9-}P y;{u"dPRkdz%_Og#COw6[mÌhg+>IܼxPc1(gBEouNP!M:* >b:j}z;53ԍډ/YD $GiyΆV<؟LQ'_bW]U!ZϭF ŧpyV%hFsOcOUqzqjGpΚTԢXדy^m-m7z 7gkW_EJCS{L~zғK"Ú{ INL5'hXBuzi^pgߠ#.džB\Njt|$lO ߑo'z͘QKm#j'SKP.ݞ>2-Fo vy$4s֌Z?x!{ .ي4Jlrgwt(_?g~X{kMN^p3Y]T6喱PQSc02C# ?~|V;x\FaoߎK1=춤(k!\%(.S$Eje"n_2.7Qk9/ŵZVb4e_^=l$Aո$O5t]lz/ܾƳOOͽ軜+]f":-}eŒ#kb?پjLGYB 5R`H:3 O``Caztkːw:]@IGQ1;HJ؞ԌAb~3>#AkPcۏ͈ ^}w;^0;X0RiPSX(X2UKݛX{IZZYj G~,ЉdZq .- I0.pid[{ȇN?nnN yQ,/ᕇ4~dϯ?^9)˧}\Z}Dɂ5}è^~ws{<^v̅;AWOkg7%Ay4*vˉHG-.Vi5 AeKu/OI`jO7_|w|ys2&N7ڿ_ntO>L#"y}n${AG^QHRjB6BjQs1Bhx|=~ܽG;HCRX O*$$ƒ+@kH2!~v||~b~J}к@OQkj.9w*'X* v?ǣD7]0&͗Œkp(T%ZO@(3WIS 8):߅RP 300"" ^ȅ/x#$!AD$ $ b(*JP k;m鴝in?߽2~ye Tnl\TQ RP^dž$k|.SwX64h]oَ,fs<Ϙ-ǖT%mVujťn7ÎnIgdrd4Oa0ZRhV:ffޫdwq^P4 $ڝ"SI*kVj>k<1zȋt2d32[Ӝ$Y6~Qol!>bP̈_nf\E F9M D`|̣G_͙>_059i_FlSe%雱m۶led@mIQ"%?(JoU,1uzŭ=m+뚚洂h7#l2 B#JiJygXJrn.L5lٲ#p(PktW)ZJ2fvBZ802@I*YirMռ6( b2|ȋes&c̈F}՚|%)05= o>O?=+Ǡ '.!䶔dq.-QY.rZ\RPU%̻ Sv9I:J6<+!UR(rimv[p-?oC9vtRT;m0|1' .Ox:B ?a9-ӹLW(m̳.UWt]׷B3 X/vQM g۹bcwYe[|l&wXKqQSIU)iYXqxUQ5lC" I0`wJ}"B[Kgf⊢-e\,Y}7\LdnGEbS.'E dᤕ:(lJr\*U؏3xG?z OGp{p0OOăJv4ీs~qNjrpR0_c}sRqq"'<NB " `-t#,ZX茔0jq9\N}}DnN1Ny nkEEⴈP4*eI.T*kY1A2av\rO?4_6n*Fr:$ > Ս4˭ˁG'OǭV5' 5b Q(|wB FfrƸo .u?=%Dp1Sa_ _AٞB$و*)RbNWA|i!6~Y:_Yy+Bx 8o#G)PT -ʥkcAh||mKs+DېRꊴwuV.%Ͳ]GׯR\+1Σ~ lp-&X$p, E?>ywp_dj=sRZm]`KeT@l-z "bV窈ڡhԇqD]@ N`1%}.jw>oYX8lJM*آ٣͹/wM|rC再8In\s.:@IV2|–{lrVkA1 '\UA?nV+t`7vl5ۻ͢tJm[Ėgw``84.ofbry[5ᱥtx? HtNu;G @Ba\S1ڲ`q"T0c7FSДQ쉣Uί0Ffv{Iw7/Oozl7k `oF.ow^}l_,sZ=@<s>4Xj !iKhΐ+XC& <HK7qޱ/o?]9̫~Xն8ڵ16%I!9Gi‘T YOw k+(r("l_ܩҬv㊱! ͘c;U/mrr+O' p6e$%;u[. - )1.' `b0ꋠiC[L=C)tS` iY ֝n{Ui8-x5& !ce~kG1x7v*LzPG 1{77ysk`x$$_B(?ۻzMUbkamSI+֜ѯI Si\]Mr/9gcJlmqK?` 4ݠڌEm:I  a('mP`g} x-N32_L?/~3[HzwXu̅^N^ʹbÊq7N6Iqۛb0J,U __~$2t4lmC(K'g}fBLQJ)[Ӌggg`"OWWׯkA&>k_tƳjI۴t.Z\6Y ,Ca2öŇ6م@wUA=cc;0r㍅c[\Zu<\~t+Uv6_5~4ojʜY04iu7[vSU&6 t:ɠ[_Zkc0?^k6zН4e͚]^G+Wk($ǾzVWͫf@׌Va KOߗu?;p'FM(fdןyUKr$?s4tr.K򙾙.wҦ84uSЪ]U Nu1\E8h1NKKZeY5Ug"6KEkB*f- 6Zz=:g_4ʠ,ʍnw'4]S  p>n.{NSf#XV7e8 @q٭Va%_ }U+zCotj7^rQwTWkD~ ¾PDLp0zx>qPn);H)7zi}lnǶ+̆ S#pA6&ŲQ 5pzHr;.2NvF7ľ@ۃ=TuCËU7n^X 8%fWjI24Ir'>aqh><6̬'hrA.0ff[VF39V=-& d ep~:F<0w?l7 LcaGpmhȿ(U6v5/n%X~T3;F8gHog".D"(bEoEPVb`\+f7j5]?90 0ޞB16i]M1"G͠isۖl7gG.?0"mdx),dM(#T?E 6ŅqB`X;?KM@?ysLž@8p8 Î5l<7WNK]PfT&g|H-n|?|HCTVX!LGDs {" xڂ‰+Vw6>7hs:M6%'!υ[fJ>>.]^tB3?({iqI9tĎPqr R` N5r'G%NQOG.')' ?~c@$gPe_ [vWv4UG3{F+!zͅơ_y.AQw]h<  #Ǥ0vDcaB%hsu,#'ұ 31Urpȇ9o=4z5s_aRp\8l`KdDX%HݸtIơ$`sPd +4s%Y1tL[dlBˆ߫௿C#Qڙ4tvOέFX\svK̯:6U}3:ECaE}qBB&h$DӔFx#lin7r`DT.{_~5Q׶W2й:jX)rݺmTli| N=/8/{Zv1I $0c)5.+p Ql7kwx-j/i_ޭn9{ 6\fX?[Vf >ʡ2=p~^zӛuQ9@!&ꃘ+ڬQvkWF_ߚ4kg+/q*5%O>]89x=Dwq+֔(z2oY]UcgWtf+aQbɍWlHQ ;Sb~bD_}puypTlNc>42z4-^kF=[ŲbPk1B:T􊒭ԇ'GFq[(4dUF%1UK[#9!j/Sld0h헷R(?+YFf) =v]0{ϳ贷ܖ):@w{j\66 ^Jdҧ1L Lzwӭ^QxN($|ɗ*L.r^RڭV0IpTmC,4wsBH-+Yݖ;-uDdG/Z0mV~l/~{r04'K40Qnh /…|b/7׽d]F}iaqZ<*h=Z +L\+K@"J[oۿ4(ǭ5Vӱ?ntˏ+IS]Dq.L {D Akc_l<.4zF$Q-sgYEs8>e7>63NYƟMyGWQȏeZz102NGJg?t˞cGxT2~yn[_y,e?h6y S*JE1[A'^B/CLOd3l,)vl^u}뽌ndako_~FkjxM6îqЈo\nWKn_1C<21*}v6l#X!O)u~e&\/n?N^%)9aMj ¬iz"I$ډkCmmF!N-y>y{9\{kޟ+9r^WӢFzV\^*Q%#2T PqXV@x<#A̳^*ӓWEzspӽps;61u=B}3|9(r@l9#[ݕ񭿻:}ӉB"y~wxzRbu\U9DY)VR l@XfOk#|q{LNô{yLhץ;uӫ~t8M=ES 4Qo$Y1M˶ـrf } >.oG]TRX䐦m# 3Q1ݐMщ.uGpi /E#ސeeltiɤhv73;͚bc"፲HaL<<0&61KtfwR'$$5=v1}|y6?,fHHy\L[ pڝtc~O e75`tݪeר& inL5AMKݍj$p<ąN5U ;V9 'Q*e@g4uZL`ēG(-=6 o+'WMh,ITAt^}yz}S&5e~bR{%pR[6r)m &E叟=|&zZ).. `q{M'6+__qBT3`T!^r;aWV-q&$Xx|;*gM^%PeҾl ʩUr 7GIv[i;/>ts7(9gۇ#|R9âմdu"nНιAe LIyTqn:{mnfѕɷg_=Rpؔh^\ti\*&\V+%wGtF;:3LFfh1uK1,2´`-d΁ٗ]վ8lfr'; WC+EL)<w˞{~zT` 8Sohz2f ΁(uwZaV F֕_>]I`wT(S0?ÝmyIoU򰻍*0\h'v9h ns à^1_839z=ݞnneoz|XZy_1̢($Y]Trie$`N_^=عVa`KX㦪:{'՟2&$n<}:Khuoyk-x}0l\o%irEҪb՚YE%Rqm* 9>w[4ߍqz^a3Ef{ "HC8IedxC^.S4NgѬ0r1h@pUPYp_4⧼k7[zOm#MZJKJ&z#3gc֠o0^(yK3| jyCc֓^_$@!N `  i]t:mEH;`DR}PyZò pNfrie$HZ+v{]4#t\"rLfV5}x #dcSȨ AR#dE0 GaaC ӋP p =?K0Qjĉdp_Q=RKL2aw7o\Iהy]q\U̙$|&Edh_숾tM٨`Ң5x{bI:Q.iy,UJ0BAvZ@5 1{R[|8ad MbE0Q4ܹzA9Z/孋+oMWʀ 1k \92zeدI$llsp)ZooBLGe+$OI &[Ug_h Pә@&3Y-sv@E* ^ڜA899Z^bM"X"hF5Tɮ=|.ev".#`p8/eb-ܞVђz_JYٿXn)1H981jG#,Ǡ;@3?") Zav|hͦXTR(@M'_7.$}Hcj(#ugTdwI!"0òs6@[yx.i(qy[iMƱd|6\$N'nQE*.$|x|~9]0Lt_$ ^QȚQ<B72y .&,” {k\8HRLM@{퐜:w$Ԥ,z+9vr y hͧz·¼K݌Yi/>*'.H? Q<3/g_L%%jڟLɿ=ԷPItВ+`3!?4&ܥBVNmmBP{&s 2vb#=$?!j*[OFoĩuJzՑׇFcwۓ@3L?F37WOrjWCXiZE"{qؼtepXD1 ;/}`y w&Gq>oOkY4r(lN?=y1+I͵j6y39)D!Ϯ~10w(YN-$R.BhB'GD d:^뇋wgg3e0BG@`R= Ӿz8`c!G!]:)n2|nrP>LhdZyp ?[g岲ahd\xE>:Iohn"hj>G ӷ]^-KPpAǗ?~c"'kunL<{-ހg&z1a;,.{RUWS*ԯa!Ql%ܦ9HЖS(@HyCn](+5B}A4Nr8q;F]P)#xvxCոI1@_\N2^мd_|ӧM8+~ 6zśgt{Us]<:˗Oܙi39JQʼ dhѻjI5f{$^o˚IĊl!҆v#Pݎz8<;+Y .QR$̦z6A.]^0oNo(boD`2Q7qscdr^?V=&VM^)yTd;C6nBK%.;wYb{b3u] KPjռ8O*Ųn}hv|'(5- -c}T6qt=V+k} t|bm]i4ꆦj VgOLn[_$Ok#m}gPmF-+Ŝ"TNxITZ1_ZFޭ{k]1V51DXY?ڙV,ƕȨ儼1G{Ŝ2lŚȴ^E3,9JRkNl?]KUUAS#| ȴ&ҳM3WjpѰ"WO[V4ϏRf5lyN!7C IwCKjIB!RrRf @ GqKFQ"ųdm{|H G[ϔԎ.D^oZ^A^T*l{y!;WhKJ%WPݕOY(?4|xߚ-Yo^|">cQL5/JJ)R\%Us\NMQS\ڬXʴzOǢV9%ƤE8a$DZnm'xԪv_|i)m#ْI k"^y(Ts =>oܴӅA\m#zt_}<2!/{$'}_/NoO{zP.*F<(t78$U꽬& z YkaoPꮏ }4&!'XSHdEّr62qimc%:yW8'if.|yKIJ5K&# ;( y4-U0]\pa! ̉V1 w$i,L,6$ѳG;Nf=cd|s/2?v;jqi{rr5K|1ml0۽׳=ZR8uFZqI[nzwUX3N7$k)FZm ;kõ~-L'c YLbQXܮ *˕F.Wji,xstK6k-On1K4fʶWvzy}LVR6mѬkF>&F&%]?ݼ,;p8Z ٵ^:hv6)-til;f>el6el;_JB1;ɦc@#>rzbo<Ni=ϧ YZ*t 'd\J" .004|kW5[)%6U9f5 J:9wM& O%h L r/^nc{ќ&8tW^xSf{嬢J!P3ղ$E2FvV!a* RaH{Tc*+[Wo2v9_qf鮍'W7gOζFɲHf>k0YKJQC'UA<`HNb]q0 lY=vLT ;YRJ)adUR ͔٫wƇo\ $F8USp H$ I,C".2oFڔؤl)&^f()9Q 0de18BwNFwlX1PLR[2ŚT R+Ýn&Ax ze˱J7'%2RٔXҢGc]pl!žxjB(-K#0A?h6kՄ !Q.4!w֕ "E&1e%kQ"hGkIv\3rPk*XY\ %1c̠#!ޤ93ѥNDY[ivNgCJ"+ /IkY-e<YI a9^-2!+-%=}b6*u4iFJ=֬ƅBgT OѬ`bZy]ZtHuGX.6v=.˭fyOJȥR~S{[+ [덬RM( U38O.$Y+3J$ 5oHlHe=/jխ]hَՓu3#VR16im.(j#rR6QriQ H!R+̤cf;3ޕu..uZHnsI [T4^~Va(Ō/DI=q{25=(4>8i)ZHKzE‹*a^Ő IbHEwnYưҮn̢+IyYHE `[m;劝i" f6q)vѳߧ7oon-fz"&A!IħU3*«~ ,$ȎWxK*Ovu;A6H{.'*M|W͛l0co FQ\8Y, ѓ#< gdf%`aPƘv; q o#Y+@QNȝP/xKFnNbN|nnnޟ?qR$)H Ա(0˶)(A({C_oi+2" \I'>`auX/_n^^Fm߬.ۍZ!nOgns|=]rwn((#uQr Qﵶ5eBDqpex`JYfbJDE-;{kܳiaaLZ37ͮ{A$J<ã>cً4dl2l*HDG!F0a>ϣųh&?ﯯg{?_ow:mM+[T ְ)OOyvM7Yݪ[nu3*SvtD $u:aaJeZD\B F\M$վ> fz~N*Yp4wFhլݏ0}7ݾlF{QuH|F=QWZ&~/ <8Yp>(0{ fL!~4rc+EZEk溛vi4p_<}r}wt{ sl? /y T(I6EijYf-.tи:4P4\/S0if`.8&S6 rmӘ[>ߺ|HFlz%0_F1\H$8pjYǑEGI CvLv8,>^]͞rҨ x4ڮf|<9o=}v<mh,!H2$MyRfEu1Ci|dѝ%T@h-Ʀ~s=ۺx:HӰVs1q~`>) ˁ(A$eœɛɛw×O-goG`5~vqd2>yqy` m:wgH$UNTF`xcmR'x*%drQGZ3 i,[8A;{1qV~&q$`/n_~!pj\}y'R6pq4;UE,XګRm8޾c]#bh2-D4.j6ٿ=ع^wv;kX;֮MwTvӹfzG1&$lg +axW/ݸ'c Tf)^Y<4"pSwla]Ng 7RG2CotGۍܽn= +0MԺ7L]XZy81EX v,[{Á\t"5Ki[I֋/^dW_3Q)ђrk3F5 瞫䲇^Nq6T#;kkF_\]Ŝ$d-fK )+,CTٹe¼c$Inpv}eǷǯI$#zp7{?e=Ӄ0ڥt&S(-2YΕLSf^*8٭^hQwJ[InVļ5Y72Iەv$ZFEMPˠHSf4P>:DzoW![]Xy0Ĵ̤v˻Z;t0E9y'8ݔ;6{r.1 nT=sB֕iX3RN3I'NLJ!Iͪe򪚷^(RBjØ`<)Ѵxb DW0%1A8Pȑn\4ϱ&9q$aBdϙr[ j(v,Yx*b}]na铧OO'OX{ I7jB)YKA /.H[i.犭A1*mؾZoW=}u")l)lbVQXZy<\j$HbHq=|wdd*>TI`C@q^8\$`(X-H =>3T@>N/OVUٔCqzz2^ `zr:T+Φ+3^muF6?)|f)V۹@fŨZs% -|0ekj,@yJ33)&]B^! %H%B(FU__~W%ݺ{6jҰRh%[ʦgL9$Qx1/gш WV$0b}l#Ms"l*뛭I,l8莛B1ʰF, JUXD,?>6&?"UFNR\L9Q !, e|#䶤UQG,% UOJP|{.9Rcf* ¿Y>lѓݭADP,L' e/eT l:^v7Y44[l|OݦOBO'^IRfrd\Q2 &FdEp/~ӯf>(l7Mq՜@B S\y\҄y}z rjr$%r_x8,%b|PcVWwUPɅ4(rⰖVx|7{ %Djm73jR2`5ѸyL6ioe /H#=P7owGZnpy|r $W~p7{Ià~}f Lgn5%L EŘ[1r{p6Ɓ&9MB"12_ů~CY`2*b%+g.1*r"O`\~2?;]/n/̈́#}uy3{ZR=콿}{{1v/ '-U#brz)Ham]VI9>Mqdr7fIdž8ItB`!ޏQN!@0 (/˛LX,O_Oϥi`(Kqj#oڨ&\]OR:ŕ%69,1h9HFͲU&pԫO)N.7l* 1f;y2G.ߔ'B)Ôd{Zzj4`ĐL1E TυEbQ1{K"hrhZ,7뛫c:1HtYܭF[ 4nճvo~2O&v-~) 0iҡUG!Zbp'"4.qf+oą3HhG)! <7UHêLuPLcg%Ko}#)4ųc]f{:{Q{qτǭ(K3ƮrGeύ1"bo?ѥaԎD?zE ׬lWvSh IP9e(LQf<˦ce_ "Q2%V@P k 9>&Ҷ)%#ˡdoΎks;#9\&pd{z_:p7uŠ`Wsa—]Ma1(AbʯP$V!t4|D}8ƤUH7Rӗc2 i}8(-J`\1P@ %U8pI@LFN%%.ӍQɯR(%ܣz$]? 3t5YIb?~bjWsY&B4 XBWj:d0؏3Y(%4RlñSXFPХrZu0v0$(! yD+9"on|iDmyS0;,DcwkP%]Kt$&w ?0KfT׽QHɵTy?J76_,'8RN*+ `:ƭt+RE"f-&%`` (˷8BC#~! ~,E=ܔg4=dXRЀ4Gdg__~W?~!Bs6*x50ex!T=|ޥН_`6rz^M]v&nIHmnz7GL;?̇Xc[$ $%PC" I IByBVBH(>Jtւd2>^ T+y K bQ\> ++^ooQ!JEU%+Q?z_KC'։6fjVCӮwm;( * f19V9uƍ`@D!0D"M3D`hHZEm:IvNa߭S+ZnA|RO^_ 6hӍV%P8D\erՔmea3^ĺ"؜~z,]֗@ҵjiʼn1T*PZז^O//_L.tC1%UC b%CuzܲZ,~ p+]gngOz:m}wO:[?>9n>ZX׼gDZ}颔8}\ZǫbwTTK(O͒8,AR\p% 8I= L (L\a)6T( jXDxD`$R/}3yrxu:? yu ɦ\NZf#eC=nw'dYm7Y{ ǸLã!R=}˨XSłv5I|bCeBo(&C@0 0 ҰQ^g9EJEM.-0VXFU*] /,+gBx ^eq||4H'ʷWfs7.>>$BrRtRT"U-wrlwo4gݍށ̔ŬUvw[ݵܚmIP4YxH)mz}9nT}PAwU|1b"NPŧ5>F iZB"B 2$%)JʎHVlo˃"UZuw.]|Gpqp=M?e`~1HITz+_47?'U(rfV2,SD Ȉ\UQvݥ?|ao8,hlly[E>_ -"Xް |%p\D%ۤ y$ %xP0gYY 9i-92-lrۊѳ!B0yGY!Ecuԥb(Z\tYfֶͿNt+U!#Qe!D5m2 ZW cP%WbERN ~e*Ќf0@IʼnC ! j_fc1!.\A8C+@fBpaE7`G<B-{FRSq͈GV:V^ʾw/{Ɲ Kڸ| |\(cY*כo;z-8Q0{1}Iᅽ4:Tp-S/ݿ[~%I;O|6+g!PBtbuxJ`L4SC5BF"H+{z.VXQb` 70%up"'3l@l~yԚH`9}wRy] skpmQhnc-5vg|e /ߣhh7ߨ3msW dnټlKغ_Y ¢m$YN q HKH<|Y#]z$$aM&GFX<#qztC02q%nb@2 h>rv(0!̉n22'ѳt+'tdq $ڜ]lpc͞ն3g?%~OIo_|^7޾&nG|w8GN=Ĭ j.z8 c`,< 8jm\C *G@bc`u og_=vD?f:bO|({%a.nhVΏlwz92P7"?_aǧg[W 8*5U?i^?8}d+zn}vsc>pݙ޽z ~Nي͝ hkI1]4 `AB:/(HpR[bC ~) q EcKVDŽݖ{O$,KJK8YW]Fǂ+f(sIԼz[K5Drb,"MjrWpǫ_߫Wۮݜ 7E6K?wܸ`IKu^NOI[G3X@`39zI7֕Wl Lr"eUB}ܸxvnvxՌ&it:MW$?FE]Ka&;.{6 i\B"JaN@K@VDY,Z:E2QFp$7HQQQ. Vs_8?@0DF澙O~sZbs|}d^F_RW]|U>=.7/r.ٓӝA/(x$_hz~'0X)--""!!\"\"@ """""`ؿؿۺ뺳l<<<~&eX;֫':$9Y\_rq8,{x>Q-zYF,p9vup{xU+G,FcΌ;oV'y`9LՃV-;qB0o5Pl'Peӧ_C )7: Yv1f[ER+8vC2a1r~*]PUlVϫTy\ Y[\h2}v؝TEP)w>k[cF"_~~װor?_>0(G-۩~Y`@k0/E#˓G%^}[ :i|ÂD[BUJ8R|z횯w?L`$I^Kz6z[ IԼ $mD+]qh@er&F-Vnr{8s9 (o.˹(=J5`YD:aNʃQ?.)2p٘Hkl),Kڛr;v9%ۛgf9;Ɯb?mR) KZSHW"drzł3u"H1CmdN87|f̊@l„ɺn"60F`4(INSYkTt\bKu_xFH \TY'%:d#vWY=}|{3%)w%U fdL s>q9J'rPʙD? h,f+'tl&|?n,XH%zhdC3L "{Y CF峚=˻WWg|vӯ/o?M{B "Q*usa!.S?]4jpUBwk>^XCI]lm5peȨke|*.[eɭ-hUn+{{V3ϡVәLi2$Y~;YY_H !]68F}6l{q3 .Мͮ |s'nLkd9W $ _d$!bT݊,[3R}tYRpvcziT\wWsxDXe @pI ug\P赎یVV2to qyQTdGA'} `:v=,$(OtY*Vz4NNhԣEHIfW WӕYBIMSLQ 9X)AX9PD4bیQ>%1P$2)7`%ԊP{I$wY}n'JT1o,YjmNN^AK@BV&,k+#lN߯[ՀΛ\T)2V1\ٟJxfq0!$nVg;{ Ue i/xޓ 8k~ IX/ww.-dq} !Q9D9;?CB0E^B`$Fxc(pDKHZ)yE֭ɈZwen/#Z> S^5LlPMg3Chղy=TᠾߋLZ7gϫ[CneX ڨޭV@Hlbodv1Kf[Q/y ЪkqcPfY!Jbac泃yoc0mZm~FgExWH=Sy_ngS.zV:T$ [N?57թ?P*NWo&[duf/<^0ސTuOV kO˄!C"tKKKK'Z!Xf`!n֋dЙ5(&7"B[t4ze h ۝q-ܧu;R)V'h) 8qLj0<+iLXGRƍN92_Igv}ima4)f6ה#'䌽59ߛXia+l<];rre mb9x^_-.nmp qFC9CK8+hh9cIVS:AX t3,Vuq\ Db$S[q^7Xdz9NƕLq!QS#f`~+{y}Bn5ZD׿~boe1*z*|SRvGgjȈ%妓*y+ٓrF=3FYڞ)(م2 *1+aiȜ6?/2.4ld愉:@ ED,+I)C!1jKّRT~"2KHn*S 1W=/ eN7w.{rۧj;4`E"ŏ@FHOIoCƞZO=؟_r(f5dF`FehNڀGqxN,G]H&rRSG(R}jJe@,|JF#ܹWRDq<<98=UG*[r6;rY7D Hǐ8_<{sl!^???X4a$IПqD݆-f3Xx)ݭ`՚ m{ә+W\aۜa{|~ǣ ,it*gM,.סjnL  Ag14G\9y?~y׏o?޼|߾PZuQgm/{~XK.vt6|ݙ&@W`{Zg݃4b0u*jh|gEH/P;ei@zVÍZ)M&^oʙJf*N^Q+Z *\9W H)tKm1t; ;׺NøE1a<4A[ &٥Qt/^~×ϟ?}O?Y}IÙ˥|'oW *|dz'thA w҂# Pz2Y2M,K:O|N5FD0Z0# ,@o5 @Xhq]+~j^sk2.FQ;jWOGMͤXk5[mL={jPvAe=Vm5jZ(.;zhlqoܾ~{/w/oO^F5RP,e`̋]DXk+`4uL.9y+`Bn_$5q*kF1DBȂ#u/xY,M,ަ9V nTJk~uԩpY۳E=="a )a"aY\=rwTk|lݗԓ/Oߜ/ūǧ5uT(^R nM/Jΰ;QF X1ƙSƝh$RO7JU3r8Xէ::&\^X׾Ӝ5[Me nN1.;>9;޻::;z~lS}~vއۏŷ~ B hTeGZ*IKޤ SSJ!Ue_$ny-/?C{gf& [F=SJZU(c^0*9] R׻~KGN&rRkr6U{B2g*9_ooΊ4ޞ~Gو C]Ы`H9_Vdj~/.:0:p˷O^|R/zISK?ᩄSװm 3ǚP̎V'3 5s׃Lcd8^hb\x"Y+fko){ =~BZL(wVoXRjTqKtjt?ԫAY{EgLo+Q3YP h!|0ɸaڨۑw'@,vԳmpYO\xn/t7{ =86BH:166܉xMճag^"Vb8vJHԊ|"+%bhtz.-,5r]$hj[tH.y~M_=/Ղ]ϾFS-E4jlI3, 3< .QxRc%ybw@'rpnud6Y#bA+~Z!:7b4;Jq4>:k'hwu.4:ZtFsŵJ'Aaq4[';B}#9[Bm\|%+z!j^'&n>JfwCNC| KK͈ (U1?2.e0-OLk{IM(d&bZJZ2U[|/" [HX@L0)`#0E=unDǑ[~b{:FJV=Vu|Q曲P:S*'vt,[mSK+z4ܤA8׬jZ;n1_zl<$FN@ ɉ-j]_~{N|ږ*X믺4QTv_3\Bl O$/N.TYQykX'BhRu$}.9:N4r\"LNMlGGHVz؈);8W7JϪ#r}λݪH^7;\?$֬yvB&Tݻ LX1z/D(h~_./]n9WUxK "ǸH3,$)U1X5H6iZΨە/U=S :<.vkì,luK( D({.l~&H1BrEGm31OXPX,ľ'l:h?[JUFWkh?d;9 .Nn_~Gjmq$-6Vd Ch6JY&pz*BJ^LNrMJAwyl3Z+h'Tߋٜq*⯵]d@w+`~v2jв:0PfO+xGx{cFB8ZMhmpWzVtkv'jShMVm)w}WG]&\?U{j9h$P 9 ȴ$IIm<]{e*|uke:VY-S+d\Ѭd5!776 F09BN`U8'[zcZ[`:+fԀ+j"S0kbKΝ?nn.fc*ᨩįs}_ͪb>m?nS4!b;ZVl:Π4v\dFYN8mtm^;Lz'1- v朹U1=P _=H'!~Y(NOϯ/oI@M<{vx빶dcug_Vy5SwoIW, w}Y2R}]Ⱦ}룍ޭWDx\T:jMb}oYfB%ldcӫ]U)6i%%Zr-ZfXH44|]//]^rYws?,TwXqhs/ 55Q0X?x˻~h@@̏WE9SITɓki|=ō(pQlQx{t[5?n^=1ÃpcIJ@zYHDIB%B^p}Pws0:LV40~RaZl ltd,[֞n5nM`⬏t|z7ʂXj4 m983h|Z6(h1TDBM\anoTMd'%B"Êm$ϋGصcg^ yDޤ|5)'~/ZYƖ TMy}RmF 6Eap#X]՚=a&Ym܂VAXtDZ 82I<^ݺRVqC^OΪ4-#a#p^e&yH#^ A #n؀zD=…2sF4p,ɾ̋,q){)f ĵ\vzR+$9^x+;\*]KhSfĂK`@բIr'Y1=) Qdo@6,dtH0,0ΩKK7]~=M_v:N0nNDMFy xC#Q IB9onۃRXs 2"<џ4iQ58wieGv'L>S-wlXׇ#5:=*G$|bo͎XZwT C-&J\6ɊBEbova<:e5xl=}Ӓ䲺~{ CtͅgIrWQ|U<Ċ]UpHk7thchļ1RI(*Z%F43.A8459IX.e{Zw*I'{C%[{0y%6WDr3t,#H0ڽt;лG|i;ϯ~zsf 1Ґ0Pi՞8Ӑgugw FIRiNs#UEO鮻pKY0Q?Z'T8j=sރ%T\Rn{ϓt}t?7Ğ j.r_z4ꌄ;he~y>5sL:Qe7rO:~-}E x8i,Z_62;(޾  HL20@ XO j!Њ, bHX=/GnT[[*2( 0a\=S[YՀ 1 !ʼyf/_M꟮jWyVP|?<F_osHEk=3@2dw}GWpp&Bf^˗l l!_$И;x!P3KÜ䍦~D\@2D,O>Z&m,G2GhX [ jxqz=nN 9,,/s`pV!k0]rD#ЀH{o8c'HnsVN=7W^{q-fEX+̣k\A7սY.Rn3Ss1o$T"] ^1FfpH~ZhQa k, ~@@CQxbsͣ~*7+t;NKbl` 7uT`"p  N+r\|%=d+|I;/_ܝ߿o֝ q:][gt:g~u)V^vg)K%Aw48Cbp;]l&LV*]h?nd>KcT>Y EBd,|N̋|.p{2kIpR ; Ixx?4$\Jd[rȲgyy}id <&+b(IQUZ}AbA`-dmCy{g짣"qZa5^YI\) ų$á FW׿q8e/{aFSuTRdP9!P$t12p)X)vT)~*~@mta qAM슄6=+9{.l/ĝ##ghw!3Pr6,OkQ5ᤝ.i  A9 Pc?7^\_Y-T{ΛExD1HyLA $j{q6T+>*xeYIhl'0Ȕ@F`<u 6՛?ӽ J,ӓuU3``bJ8MdђMXb&ҌP aj v)d:SA×>Ϸ ͔,b4ϢX&yMu>k9(M ֚O>a1(ї9#qQˆl2B(JfK>nEpBhP|NaX,X4d̠ "lV Ōm?Rf$ Q.=NKͥ.KprvRLc),.".PZqa0a <uAK3P!`"A#M1 Z͡ŝ-Zyn_C ", Aff8rha?":xpEUo1s}T:^ByBoz9J`CtNwk [Q3W}Buk0-Q:Q@2L9@P.]9$fY$Ij JS N!ì6:C')d5R_iEt^ M4,4|%GF5>GBPԅƑuK+:r1~]$yܩ:/FGjQp*7ϛ2b&4eԋ1jA+Eh 5a d&,Xag@ OkD"’@Фi:3BP&)\LФM0ңπ ER5 0(AA9M ȇ F_k8}3QǫFN?L:#ݔq&;t;aؠ'H#,:6q}xu9bGШ֮MbjID N Y #I"?^oafBFRCfG p"6 NbX;' 0;')if5ڊi\J0#vEg$iv ۣn5M$h&7r e_Wi;I_߭dxeVQk 乂A1 5uRh0PZ#m 4"9<(j6b1o Xc5b  xA5 9|y?{g1HӰ'?.|ȦE h'AhpP# ‖`QB!KzJUL|yO9>w ~*(ú 'i?x/ U@vD+ =dr6׀5bc+S6ƝLHDdsA&֢K!NQ;98E4\DCdk,31(k~h=Av qՂ:mPqyL:ʏv7ِ? ֺp? n]Wjsv+,Zo}AR)zLZa3/ǚe,0kV0r%6I[ UQ:97?jF8$Y]S"؇ ՜ ܃i!4` c]ZR9*MU1^y5X0Zv߾||?>|uەtfT7v[ڌze{.9aƏ=䈱QًzaԌ@t;XJu5I|](Z09YQ=K( cVq 8R0kT8YFG-jv6;?&s,8 epXrWR%&]R$]6YpNjY$r~xq7^O=qb\C!BA]*lf 'u=Ydݰ>uP ӒI R2NuoG"?g5g)KVN|:YQ$oc>RzҫY,%ȤvPrNnh],4k#EX̆CVJ,ϻm4,H~'(Z8?Kug4:3$j0y ;jaynBdP \r}48*VL>:~6 Nip E/ dDm#$_SN`"Mek9HТ|8ͲvZN}H^8FZJa%IJP@JωZаK G4L-<-Wc6n@<ghßb-ͽTG!sBVGNR20"("B B "\r\r@EDTDDEDETfEfLm;۝vӞ==ힳg~w7Kiiiy'r c(Usj߮y`+!X-T򉤪'y;T~7Sǿl~9nm6ʹL*vd;M&0X0 (`MLʫj.h沖&+2YS}P ec=F, 16 (:8)FAx8d˓^Rb<ݍnb!oy9Eټ~4lNM=Tpw5Y̪\6'<~,\[V}sES/$LWs3 vf($  X Nqv#!tItQ!` E5̫q+ (ԏђ0Dhnu{mj̋ݍ}YӠ"jjLА˯-cBfq>NՓ'x<'fQf<=S2bMꂖLTl=7b22I6ˀh}2& Ƣ50rBd EsI"D#O&T1AU ]@qXi d8!i&@cXDP  jܛl6oOQO3ic "0#A k;)Οt[0;sYf'=BT&U"X%4i+\b~DDPGe9VEBA%ΟS80h<T: ~gHu2X4"!8`J jT?Z*=H!i ^]8`JMPNR|X:9BX 4) 1m]eG%7'tFK' U\l#J\$EsHOKQL3bĢ91fPI!~5Wx:Ps u wA*X]|@}<ð_e! a0h|1oĻŖk`ĕNo+@$!03\}xMRuzÇq-*\lDi"V-[dq+ x°*k#jAk)T*N ">roeH bTf YK-ϻy_,oTNSH(ZLz}HD٨$$Z0LJQ͋/a AS Ѱ ,9!@Op^1)ÇՎQh^^L2gWX[tOӠmvrz*9M5f_1 j%aߣnol@A9_Zft\# [|w Gr?PV6WrؠId*V0mu{0ou+y'<[E5QC٭r>4hDPgxoF`1C'Jຖ)Փ4%g6" &Pd[Ik4“Ti̢">+8:6Oʁ4A V}D I@?ؿfWھ*C\T}3J>Inx䗏Rv~_xgPs?I\q>$p$LGh>e 0KZ۟{WZ.5}`R''EsF]?0I;6Rr8}Ln IcI`6BVlFf?O'JWwDx0w3,Nn/#}1OSLZT+i,RY{xTWdvkw%2t.`&Y8F0CA뻛_&("D n;|IT@,dk8ezzHB i@0"O"F"~Y,Ȁ,1#wʕڳ\4_O>xubΗ ,^^|x{CV<[[,hU޾,FrOX~|Oi-xXN͗i <{^Ȝ:=e6[G]Sэ_o+í{P F׋#O]\wyY-8rk[q [Zez 0QxޢWnFS]5^q@ٮkKߕ.܀&Ϩ @v_bimˉb\OdmL)K"c9 R ?=ī4qnq9Fa fp 3[Q"̈́xu%_=ۛ<ݽ9>l.)эy>7 Sf,Ou?mKKu"`Mgx^bxxÏo*8w^.4€2r1?ypTl'Z(g_gW[ [Jغ, JP`|ˇ4ĕO_]g)0ko_vah}d< q 8thg|@PVy;@(`&Or@:Ksj%kˆ S<0@ԒjRRPPb}V+1 >gzġCLV#A|Wh)e`djwZkJ͈~Oֹ.<F؀#AhrK fB՜ʹQ.p8()?| .XtFr_etnj.ߣ &'_,x8H9wno*%8OeEOOJtBڳTnhHͣi@ҤE#l}ܬS/~̮O{۟׻Ft>(hDbҤl|y-HDB[A(l?9;p(L%=A#ߕs _J=q"2'FP?۬F~^p/A6]~y2 ;=K^*{gOq . ƒ&/Lypÿ~ӧ*׸-RJ=]vo&vч4?yyYJ]wZE$ef*0ZOUz_* s\El8)==NF`eĽ&)q 0.12yQI܍К0=&DsĘ/˻_jroV]|~DWhgQ앟~_?߀ V٨&lEnۜyW&ozc!,cʅD&_sh謯# *YG{{gZB*}o6z^H$274FZfu{'kWU=pBQIGC%;uM{4<&b>0`xYp(0#/s'?DQ"jY˞@vΖ 2@"H l7ct%YIeR.+iѨeRvir[(= 4kDFxLZ'ߞ=TazhktT / T**mfVw*qEɢ<b+'.KX0'K4;{'h!.!P/c6u[7P$H1rJ^̖+Fż=|/tZ,4r^ܲi#68wa>yrU5;t^mώ\<=>:yx>:9>gn[;͘6EtDlT(AsH`^4E\OY,'H"gMZ (A!vY+1 C`M= ΒA D"~?wzh/3vx`x@>9 6N2 (0?HVv/|2jTYs4(VV~O*RQ_=N6qb_N7zkֶ7INS>&nT('x@@4CۉE_ЁڹW%4 4BwLpM#Q\ aA ~"=3vX /r@pl>WI[*$Ũ0ˉD*Ъvh6׊\\)g{jQ( f<}E}L&:F?lowrr}3O6M_l{28_ywE!k l9 Vs@$+mLNj, ЇE A4c}StZ-jNJ[,O*WWL1n5^1Dм倂 U?[Ӄl6f?_t`xȗJ[*TTX⵭*g;w۱ؖh/ G*N99'(,ʌ/W9-BTIͩXT  |!EN3,RKNgT.tH. 2^}xT&Nm7˥v+\Zzՠ5kl7GgԤ&ռ> " ys o_Edqw٬9uk&b;=iaA8c//7@WHYe?{"P*dBh!]ׇ< AҒ A:yf!>~eyrљ.e)w*x{ [m\gEQ'?2a俩orEOA2(^4 \ˊNQ kyY:)&rNPmg`z)WY#mRLiaݼ^ZnWϞxU8fGN杣μte#oi}"^TuͲ4C [o;%=5fu3,Ń죛 *2o/o8 +IU@OlNjQO+th\{"u?Ꝫ\Ia0aK}yh㗷/̍vдܒU|lɇgy3͒Ey'#}7~w_Zcn;ti_ׯ~U"(g1**E` CQEmv^%r'~nJ SX+MP.,Yf-Av71a=xٞĪ.Kh燲/yux (Jtںly?{z?i"o9Mз/e)G2gB 'jRuwj/n_7 EHG>?j jmWb1Dk/( N5WV&kՊaiQ`d~@q?ٽip)H(l_T1offSHLfa4VoKGw!C`$X=yoy/΋v3ϜK!PZ;V( uz"1X |rv77PGF?}N-C^VMtLH:pTBgP͸ S(TPTcU2kqn4%7DW"&ê.>)Dϣk _;|M`, R X_L pw Sɤ {io[>zD/ KKU۾~.S/T[EZ5K- ~f1y_$ X\N|6*U7R5ڡ BF]ˤLcf5s4V,gD—G+ A3eI磊) VYu0ȡ0" 6jg̃2fԼ8D8@4ۿ4? at'm;Z+~z|k -x8ܶ#ɰܝ^MCxww㔗:9fACx?eڃAa1fˌYQVr`{dٵZ0ՌJD/&)"7cb@AIl~'B;Aq! h(AȈ{}A0aeKbe6ւD6MF75ȼIqeqjh 6knNw/i'_ڛUZ)/R2)H|sʛ'Ӛq4:Cuv[QLɢN({*lhbJP YQF U7`00`: o#PE#ˈ !,DP4[l,UGc>ue~EG@"pA`8Q<DSNxr?NW/5GOz~1ǻ;:SƠ7' 5p tPq΍睒F<'*w3XK*`9(_%U0 *9:dPlVf;2 `\@/ A!pC.`"ĺUGA$%"6r  mAf(U>Z\TѤSjcveQهI`guu~ŵk.OR<&H,ZOp9irI-椵L4fgq=j%+! e0QoCdQ0%5aB@L-#Lё(!s`VWVWPvv<ˊ֩L\1oYuL)pو̇[x4BPeTŬ.98pjIk?vNޕ&p]*%n *vU"1MR^X3y3̀?h,Rt=[vM'b1V7bg֭UTkpNz!W_ [o8mc|X>WiL%a3J r2L\@)S]^ě|!(qUY=rq{e%^8A%I4'4gxuJP~QK}6UYOH Yvt@ZW귏g:֌ Ɨiޕushs\iԲv.2?{ ߿ o 絯$jU=Zۛ<̔hL&{Lav\o1d*<[,&θUDad1ZG/&Lbi!TRiw3ZڎSYKbf R.̤$ 1Z~"^tJR=#ngn-/Inw>hb,6*ڲ |n~ߔt `0iUUja$Upo7p sQKi{v@, #*/i7ݸ 9= 3Sº1l42{ \4OIk$y)ةl. 滱a8}A ^d%(&>$Y 4CdԿz"TVL9ʪ Q6K`~/x})4Y|}]t (r"/#Q,ka(v)((‹P_,a$a8s\+.U i=uHqR1p8AtޙdPμemW]VCo Ѻn: {?)FʪAs `!tW{ʆc \_[ӝ0!ebh?!D YCZS٪NdЦR%GE!T^$Gc&vM4T驼)gƅ4=|5_"v2 b%]9YA,7aOqR%#]so3eHR0w*%$yZt˛ Jq s=0ɲ{5;al)jT%}#/"/x(G(ȗ8+{srtJV{1(#iZKC-tXlC]ߚ^n;*&u5J9x'syNbQ-;/$ph2LvZR堟řЙQnow^B}ILE?XZέ]='1jz (YҩhBm'(1ۖL#LR>4Њsl vP 9#8RZV@;Wh/ +_nfw^$Ef8SfE &Q?p!̋l@J$&9 oJ,|H[4๘(<r:& ߘ4?PxndU]WwkZ$c0rÁttQNnH%Sk(鬐H|bQ2&x$Km^;_vHЧW\ݹϔdA iؤHLr?nql]O5n|yڊgm@Rư#,'-?#ԗQ 2'AW?Q c~/ MQK58"n?xiPDZ""L P9~;y m }fExHu7{[1tn9N;1rkқöڪ*J9عs>;ۣ{t{6;_MzD)gF΃>d)D*fѕVb P< } <!J,ՏU%+@ Ɓh&Ú/ KNG=Ǔ7:BP,'Ø8SזcHD;]!-tA R!VQB[`XۛLZouӝlx4m7jnN9Oͦã'G2xl>BV ".*  Ei<#ҡ6Gy7IYPXu?$>͖tաm"/Jx>JWW5?W3E| E"nXyt2h03x<p@ӫ9i۵j/x=ԩtyԺw6Wۃٝa5G|"UZ??E_ƀr0ZyNt9UXf∦8054(QRI((h^5M8CMy[A1biqɿr{fT("\<@< RZ&P4nZɠ_`֐Q#apL5{Fœ-G&CiVNJkO3]qB# ;IP%C.O{l,IvV]CAb 0d<\"&$]%@'ɊQ@@R̎C>^ϫ0 ?x"(,OK:Xf(6q⍅!uDaLfE+:ճkK%@ ))9g _|*YT]TZmsޞah c٩a |v֝3$J|QD H#dpa$kpѶn{|H( 漢Gz-i~e{q,Yd8 E*x睖 i$p^H0u 't PpޛW;mAl6eKeMO[[21[evi;xC#h kaO*ބ]%Ay҈z7@#À9yՀC(*, <[?% ive3{ X.'[;n,~X-lͱFB'}y'pÛ[: c-DQ7P>v|9#)>|>%t(M-|Bqj@x'A%^(q 1LR`9RBp޺ۉ 7ߐcAalʂ̢ GR][#`<1{q~'OjJtE޸4&>~3<8|JǸrX\o~DƠb4Vڮ~_?3ߟʭl@8ӔtLۂXLHJ$B6;.ʦhs^Km)d`@ޭh?TZ9Lм PH))xo)&]PNI<,$BQ:"(K0ho,Ea/"~A"a] c~$XJJ P2KIX__{b E޳W/5 Հ؆02^lYUPy4`0U6Ԍf"ÉIq7JgQF Uh sS@Yἲ')Bu ,ţVFP("wݜ \(?,삶4 ͸4s )oToٛR-=ڮbI妙λ>_bⳅòVc1YfMԿ E2a2o3m;G'b[^KX,uI,WL]a~s|{US[mt>8;={e\NLmIڠj-v*̸VШ9 Ue4=*)_",5Nd9AXR#8;o%Xk#AW,IP?p>LaE?V⎎,:u(Rn.f x4VGsf iYH(֨>dI1]]e OWXi5;[o Ry ?1lYр0,l E(?_&Y"!ZyhR5$KLB,>a K[YoYq^ JԾH0 ΀!`C&ДdLbOE>܀m>Pg]tD A4p{pt8'4#q'_\ eZ ~YnWOl5n{t*kwo$Z'%j:0 L,8WÉ }WVBBAS˪T@Uf8&@.Z 9oܡ,q,Oٲɨz ?*/+B+ l:$CU5Yt eaI(+Z ʽ(C"1j +D[ov{ AQc`i>KI&~c7u+I˼*pu^7kCxhsc徼HݫJ`_Ml|̄ ju1NaĉAF^q*썮H_HwM2$xALb(aȜ"Oχéro;fvsc<~85NS/,װDB.sUfy~z&)ˬX6h˛Hɔr$U*#<.|.,T!@2ZHtC< #X^<dƥ(Ktt["B7no=t81 E aE A.M}?>v_2aGìٓG^@05-?Cl?BRUUD{l6⹄BXFGLYx! +;Caj R%795_hFcSMiu)U8KOo:Pbhڻ5ZjuvM{=Kwwvf;G~O7۽h*W9nw3 `ԲY-&dZLٴNUln Ux{?H )6Zջ@򳋖>S +X0_Ȥ[׸8q$ckZjp9J u-8HڷGX=ؘN&GwlR\O0 0dכhU%խ*=dX_fZ[rĘ:gX9rQihN@~-@/+ P5~W D)#JX& Ώ8Z'~@q]_Qʳ!b40Y`x˭0KD -ITI|j4.~ݞMVpdPP.۬2^2hO{[k pEQ3 +%Rg_X!|iv@5M`{)8J \\if,S Vח"~¿$_loԣhEij}"Kpku+"@\R9K&Ag3A3۫nJQyj6IH] (ÔT`X ߒ/W #+){n0,mz.[O `[UaiIkz&spҺP)oChQTg G5sW^oՐO|[֩n\ŤJ9.*Dp Դ77ՀbPˆ!( (ӀD9qIbdZ*Kݧ !m&X vf=uUc.vsK_ǜ3,1`>z7"eHfij!⻾f͍Ԯ hLv*lXG5N1y."(7l[n$ǓUǫR-uAgu{ aјr0$Ko?~ P"eF̉T7/RI90[v ϱcF1:TY(A̩c 3WR7G4p;ePV MႽ@I6ha+>mnqa B@s |.[k.m]_/~׺A`EWHf:-oߛD?EӀ cV(!t?zjk&0i<5,5Nq%G(m;$*JfR*ZAr,iZBUN7EHjIFs D*Ωl4h])nqLY_$V|W\tV7;q\EOӑeϳ^ۣ}F}bzTbzk~zS][] ;8*E0ڥgCJ2DDA"ap~%UJ|iP<\[@q(9f)G8Dv1Ln>Q$|z=Ǚ[Ӗ0 n͉^FpmSN$]85fuR !!d$'A`LgGVHYѼWEW TtNUƌu6(0%pe)Ļb[FtRQu _TVbX`! w߼x? JRd["=zNZ/ ,ٲ enɻ!m&a'qSJ"Q^C2-fk-<ݍ{WJ:pG``@z/z m gWnoLwnU[݌_X]7*Wzudh*br͓C* tJg'EV vIGbF|(7;  41?汁x}|jx¬sr bеU*i͓){Ͻ  @S)K񒠰mrP,41b*0XBae⼂[rr4;CtAjM!WK{l 2 灦7'ARE ~K6ULvZ6F\Vv8f9jI!%D5B$n/WCDrj,mfTaW䵕"*Fk_OVH"g x\a  /ƈ~> 1cڼ<}r~^=˨%#G?}6lEXT!y=M)$d.ȴL&Ȭ}p8o+132zPU.$&+$`! 6 ?fN:;t B )ymxlY3>AHE2 J!N$ӈaP PɑJ M+g/=l̇!dXI^hvs3I@'tVh -'VN[ވoo1uN1,Ꮣ9£(^5HPKN-":.t%׋Y-=onT꬯&,ȭyt}14rϟ./r}.'Uwσz @rdWga]WzkSF^k^okff ɠ0*-lO胫g/=9ފa RN'?snl~_v"zj /4|Ar qʫ,tUQ72(;07z-swwZRY,o  F$UJH9}3&y9O}2ł'iovuKlˉ{5>X&YV!Oo+kHZ'o_vv} ZLsߒhHYiqD>IɌp@Q-H4AFb Aj NoAB Pt֐{@IT33WYEݧ/f%㷵Í|iurm<ɭOusn_,J>jM__nbtpur&IZ!R5j l}`&K󝨴XKDOyő2+KA㘀2.8 0=wdz^(^T z^נPzK1[<7}90w4Ѧ+g)緋Kvm~~3Gn!^<~#|ib0m-ᭇ|):o}}߹<5^}vyAU'f#'p.n5o{s?J>6e eYldyӓ]ng8^aDwV 5G)UC@\4ATTz%u5[TMQ= Yû.wQ]_\O:U}tc0C_-+BnR:_jez2X;صxz?+g{q*წ1RgO1_clnG0jjw˯?s<@wmK5&xJe^kF;IE8@k7Bᓌ_ HS+r3v;YLjVN! 1G0tg[#gcm+[4dSUV, v Ay-x+tcZ,Ձ3oK ȷެ3{tNkW.&>7/?~hOI593&0Sqhջ~x N!A›.f fRyYr ð\VBg)T Fv-=[7[Fiӊ$_oЩı|=1gR`F.|b>\omBJicZU^GFk:'/fNic ֊O`d_=~9?ߕ%fת2) lNkA9[c:!u^5._u^ޚA%kLY(-˭/5ϊToihEye!* C5~Ӎ\et8{b&dݭy-=:{Ԉ Ekk ")'[_K+/ u0kmq|hk{y1ooLZs,yvh ݜ}mT3d9fpJZ/ss2pWiFP2y?0>'(d}WkZxˣ 1&=]Gϧsg^؇X lV 71u{%#НW{}~[>ɦm4z3SɧmP:7|ojy2W4\l3ũ4(oΊ2\Ov[!Ȕrݯw 5Ļ7@$sP z$;[lr)h p[Q+:1MLw8k}W|o. |ڴ[dYmgbUjhftę\]R]Hf9Xg?k)2GwU!^W+GKN.'q2pP*)ƻz 0&~7SV zG"!8 JeKAC0N;3CᰪͶ Lޱut#Dᅴٝ:s:s##}9J$dOISU׺9 ~$nEtVT24 YIk `Cvng&/Dg^_~ϙ1sjBZ旔`sCbGt6u!;B=y)U~0=м;ǃNO|c:Yj6:qZbgJ}O o$V1Y-T+ӻ,ݻ8-a#l9D%l1_1BP PӴk,Bz34IQ4&^ E3iV`kh%eas`*bQgjvgw0du.q8Ct5Wn[N)W>Avb緑~RÓ-S/cMʕP(T)";l{ qHgq5#xW %WfS>(B=oEH=B=l7 cD6diŻȁ$+ Ҕ4Tͻ˛H@yvP=/L%Y4R8Uo 60h ƢĜf\ͤ1lgiݿ//>}vZXU:W `ILg TOh).C >_T{6C/(FӺj&y} ,&\㷹"()=S1\Dr~Xl !srJe#LӂqJ>_I_6}ga(44B0.Ѕ@7Ѕ@7B!0cclcl`_t:md:ٻ{9Җ Iߟwg,K2"erCbV(PPD-OنneJY]ӻ}e> wnuOVlZSlVNgBb.v9i{%:𤕾?kO!ӮO+ f\jF)YG(^YRɦv&x7g傃w8B;Xe@/$VG$A4⟈7ZU9jG -@1h'3.4r%uqz"/ϓpZ&.d5.z^&Fe&L1GCtYD1qmɢZr;\ӂj0iUlTO (ERM$[I]K*oD|-^y&E ~9~^Y!<7X!J<0J <_ku3?Ig}lFm2:p-ry)٨S۟T1$۫70&k-Yr `h澽ܪcxe}Ƀ[kjRmN[z<rMO*"Td%ɪ:|b"F@ٰO,0<,OA(&h|% $Q2wR DA)Ard]WYGI4g Fqxܝꥨ@V/g~9|4:;$fáyd{1FJ@- Z9:K"B'TsjmWXIPp".Էj,,ͤBџH ;}>-$uABN dX.0.1x/%:ɸL> p4?lofOVL{4,D ;>cem{\7ť6giG'`: 0n..//ȗ_#[:TQlVH:([V!ŅaxٴB2<+.Ț(8 ӬB")f"&y@FF1fQ`XM$)NRHFVwxϷ';kR|$ߺwݚm#sسO\Kp⸛OW/4djٶhyQ @ IQ{:Y5=$FL\,)Ԝr PCh6̓0< a<Sp15PI0 %u|8uX q95G,WQ <_w{~tZ{PbȄP (o&ไ ~R?F`12Ӛ](e'dq0  j" )(C<~.HZZn_돗;Fi\]Ώfo-*i&njVĂf @ܭ1aȲDQ:N;Kӣstrsqf ~3?0Q/?.gBncr'xV2PX#0R%r\): I`Oi<,wU(P,c;ψ<-' u:\Uz(2@^:o^?;<ج+"q`ҒU+7<r2[%_R"3Z:Wq8## ~UTa4oU$G{^VP A"To=]CVh73$,I%zq2.PetMPEgdZIOX? ,D wÀ%0,`Yxf!/Do[//?t,뎺٦\TN4QDTo,+}KTm24q噤"I$L +O\2?>^-b1Mk]|_9Ζ2lpo)OEĪ92J Z"uQG;1`i YQE6x/`[`/8b2im ^nj<'C~S,6kYKɝ?~JкGSVq3Fʷ5B]1&xn>@wP^? -7*3ؚWdN×Ҹ䯚l08^>PG(Wa??ϪZ#37=hFǘw)oo} o`[`3 >0MP]\ /?ϗn޻ NXhv}? |qc 6Eѭ{զ;М^N:Iƍ{9/-xW91\8.Ec7#xZgiwlN\%{71',/p'X$M^e5:X@<q T YaaxDHI2_1..a"N ;b:ໟ)ܽ6j5U7o5^Thmg{_O|7=,ڨ>0Ā3w:RyYn?᫾ڊj{Z&1w獻_1=`(J %ęI.r<H+Ns}wn_)Tu˃[(l0WrJuǧ⋔תj5Kow9mkE\1 11Ȝ%7 t(W/>bѧVD-qt>Φh{O8 ##K$m 7HÞgɷX8"z]N{!(O"Y=cAλJc-Ҹ|bǡSgw̽ڬ^؟nlnoool"ցV%vujmiaʙi_JHtyfK<&Dt=Hi^qa7-)mǏ}tŒ ֦Ɨ,A%UqCi!YXpӁ bB\W<;LfW4p xK$";T3a94 ^apIXtPs{e\pzpg(T.Ƴh6XY 7m`O3&ME;2,7G²*$P|RFVI)zcP6)F40,ЍX2 5lsp*& &ai2q0$;7i*p5x,q'$uҠ/|D1 DAH97"pgwA[Y9NڴW%ΧVfӍ\ˡ{Y }ۭVJV y~RJˢqOELj*v'ɅgGLQas Iuk~V[Bb DDu(1A h$KשXA,+ l A>K8Rc;~~ÑOGhZ6|n~vN7w>U5kU2fde-Fڨ ] GglO*1+l=Fa$i;T0G%DVA0I#7" 8Pt H X 3\DpyIYT0 f_?k$;[cK}4D­_<4:8ylX( |h*NZ/ź;|3l[?^"[y\f6-쮙KxxygEjʏ&&tR}&\?9\^E'wl\̏Ю˲ EmyMvoi ~|]i Œ53*o a|>`lr2Z\\xs;nR`o"pNUzq3_effPCbiV1\vT"YQ_~a1n/j%vv2XHT8 m:*z ڧ(ƥK񸑁]0PDJRi -BY kSIիi[XR"Tom6]8;[׋~>_w{Q36^~O֬Άfu?7]X) ,)?S:& $bØ!HfZ>bCG +K:!_#X]UZ`5EVDaSFgx&|ớ@ho??\] ,oW|c AYG1]ߎb =P2ޞ<ԟ # ^G*oq;"JA KHm9&;1?#EkpۗeXq%C3H,±H^ps_XZ_Y] p1'pA:PA<D˟P?̞o1Au65osuwώ[~zR8`<;@ p'N_q6, KQ3mۅP\NI[Qͱ)ׯOn^L1ɐ&2 4e >Sb "ep{cp2XP81rS W"[??}x8i]-Nؾ?Bѯ -ٻ8l7Fu{&g%xw#*˔ĝs})hX47PH=ogRJ®"bҧMedM"&SqOppc1@JilsPa4\? ' [EET@Y~yzp}_ەvhnztr鸶V6Ɠ餋IjT۹"Qs[ûwXVo/xV^-Hz>T2Vw7dHi5 $YYF2E$#J$er9چK;H2cṕȰ wDkם@<De<Bt~a)?qHwfg]Ӝ'i}ݨ<26̪ /݉ǭ5síkq;hHfY NG-1gbqyW4&g! ߊXdPDsCmC BC`98͂h AS# P F}*xp.cwS[&H5Ct[?>YߺX=|WŹ [N^lp;Hc?4YҘc^3j5_W.@Q`e2^C^IRޫ# ;cJ*B>'(Yu [RWF'(%6`Q;h)tw[ b,kUJC>Ip/IO!.%#S>׋VtVSۥF.4%yxa헭˖SIZB^p_Ӭroy7fqP9p 5J[,=Iygc>M$b+nfRQs__Ѫ*O("NT (cFT O⤫) L9*M*M "H`*#HuÒa/SyG^izCtfD6ftڍQT䚣 v|p&k2{}+#0$!,:[Mp,t.܊\-[EܸXc %S^ JY{/Y2zIZO^mpFpA+Qa1gx.UY,@z\Va3!s50a迆 *T.ءV?<)o4!VQ˭RojlI锖Da{L\ʴ>jL^ʽD"F'=v(!jc9;өԮjn:뻁e~ޢdӶըEN|Be64@HqXbbV^cH% ݧ5! Vp0g{g%ʣtNkEuv߽Q"bbڎ󨮔Jl$p|\N w/~/Qq$^*:%V%_l!w\b*KDW=q>Qv1MQ[Epx):0 zJCI;=@_GSg,^`EMBDP vųE!p0z8ˏ_|)cGV$A[؜Z=`jn&QSyf7V&Ql]p0mj"(vĥlefqTP//ҴQ7^$cUv)3 t\L%c$Hр+h >`,@SI0p &Jnnxͫ.Ǖ{G=MMQMą1ƈ $ 1A b$$  FI!d#eedlc#T(ȟخrv%۲ru}wx R:{ֳzֳo2 K^ƧS?{ 0O9/shc>Jy*Я~0Ҩ>xU]N)~*۸L#SaRXB8O9)Ek4gXu}3/7%ż<`~}uRK|IZ>n CrI5;-_r}fmfNa;)O)ƒ~vSrIkпK2054](i5)j?8Ovmuyp~Wir%Gv"0RMåǟqFnP__o}O!{oil]~?~v!\XTƳ}_uBz9}^_ z]:%:)Ƚ YO-GφTk3ݼ׿ޟ$[eWtÛ>m:2x}Lgjob j#WCgwOIbuL%N~p*!ʐdcÿO~ϾO!E׷ ~Ptj籭e:k򘀻KqLZA_m}y=']4I_}M}Ei~R*PDHd|ko~+_{o_׾\4|ŭqv\eMa#ULE6mLa":=IWqQ/a&e(ueՒ&urыӳkEm>Tl}2ݞok=__JixdN-e] s szk_d x?]ƪg-E$% 1?~ast>;m(1M=]i31r#|^A;R~Z?9ԍkuc˱/W[^XTh+t}몓YM~S5K[O":䒜#VAmR>f0j_t2rEWwW=W 9 =i)M?]:n4S8rt6&6m`8^/. 9.xwͬ?~RfPS B+:U2̡ ԴWuq.hƳnޣ9Uap֬7,c鴺tש gGl(aտ啮EO! #8-Ǭ`YӜغnvtܮ/څE)ku0;}N]o_oNe&?*W^-4'q\+wk^rsOIfҽHhyYa^Q7*"tYRZ>R`  N^Fbf-'q?k0G{j? 3 )*ѱ hs~a/W2_K0~211Iy= /N}uI8}wyzS/=?×>x'}zf8R޿{3*bumYW͞h|Z=԰K2 #YY_y?~_?o?_|hx[/a<ݷ?p%0w:M12<}R~o~ͯ}띗wɛ??+}/؝Xog A+A^Lg@7 3:6٭}A/"Ze o Ne3t!, ywὟ_|?ҫ~ncy~ _~'?/v'n+^3Mx=QW 7d?JYFp*;籎t&D%J QDk՗$s& - :foo{yo^ʗz~?ώ3O,O޻mokܛwwNN|#)[R+NȌO/[)Aeϝř`q5,ІW+8m17+޷|+ʋ[߂7\~>YA6^TED8@&Tl~gG"3+__n#I΁48iٿ?~_~oݟyOK>ֻo㻿~u-$eF9*X-k=+CdgnC'%nhA!PIucJS&D><&Ǭ?gg?_}~?^oֽ_o}G?߾w~S i3(FgnFC:~r|U+jL$wzVo/!? uYP4CH*;~_oo|S__cyxSxs?{?ONe|QZNY+W(O֛]Zׯe==JaZf+Y?3ZGګ{/{~՗z$4~a*=XƅoT︝YLAO7S c}C2SE~O$<<ʙ*h0vI""O|;o}o~Wן_ys{ͷ^_ <%-ezaC*_GKOT8zYWQF}S|'NʆxLq+ ';Ī~av忿}{ok_ۯoҳ~3/s~^}>?n%#ִĩ E+9\-"0v=PI Om+7f|يkAl|+%WRA7܇8rK2zTiS7ݏc?H #/[L:ݗ^P_C&Wz y]ݺ'g?eEd u(2 /yΥ,zօq V*$9˖r\),kݔ 'd9y YҴjbN$kg7󝇷Ng9N1؟K#Lj/c9(h;[-k^|eut˴lAV*/s\5 2}ɣ"P=b,s8eM?Ϣ# \p:_?y7.Y:8n{ky2{?e Ye胣&,f}@AkעzR< 1[ hw^`^Pu i&V/' CbVdx_|H*jݹ2κKISˏq x+mE* !SdP޿X+@L')/2H|n@RI6z-9SdW7|y.\t=CW_=&0"ޑpȗN7=C&,Z^2-yCSe}G RZLD'A(6s-ysgA>qN E$yj;zu]vl=YJ! y o1%!;K]3_N,n)z-Tzt_| V~٬#_2 , Sugw{!]a:4Wi ( 1aIsj>Y]Q Ms49w؜IֳNDwO{᥿=@ܨpLjN]H#9FHw"8Զ8oǽ߶rj-h^t}1 ub)*YVH,xi=zv:k֕b?0$"HF,Av#(3q]Y/}osOSO}?{/=G̓OPs:WL Hp® g%T-:='y{roqEA< Z<0 O#.!8{O҃=~nK[̣je1Ҍ]<^q#)l*nG|CkU~=qgKPsSn:ѫ̥ym'66.Ah ~]f?A:NZ:x@_xM2dFҶ҅a֫14ȎwʇX%_Ǎi[{I^ d6o &@y x:Zf g:;af0[[$E Z6Ŷupt[l~,FSQw2ՐSOqP Lb'g%G$+eL3( * H \Ѹ@Oq T;8u]Iv! &2I`h¿3V=U=9Ȁr:D(r> E; w^TOP:hN, Ż8Ajq 7:5nc~r28C_rw0Z8h ?~!`4 8Ŧ| {ZxY!VSGSh #'cM׹ +̤oEE2:]=\sp:=WR 7W|ؤ}?;cO7k2!iu~ (DfEbe#U*wOz] D1|Hkm^Sɑ7#.:]:Lڏ󎄦G2N#z?n h#paO$:\pՂ`WP H<}ӺW]`eI Bh7@6'l~ŶϔhYc_>5A?5ۀI: dCHNIӟاhʲbuZU.u] rdJ fu# ܠ=E' TV|h%a}Inbvs=pNJE_@yھsM7Z,Po!aUyHzGe EvD:p'n3})sNvt ܊G'-i9FGQC`ُƍj:qezsyg>Ͼs|>W.Wr7uVbxN,s"fI |EUkI"JnIF7.q$k^_:r ¶%: ='=OG{O?sޙ.XZ2->(!\tSW䁒5f!WtTIStMhYrGX}E%N0A{/?wasgb)M F86X0H(`d}ZNWC:o֚XF2?A8p3\'/ž_w;uHBiŁXa&"^HATEnIX1uQO?5s2hBx} WpArrV <.*e^xjXeG|c1섢7ԠnB!ippkG[-^=)]`ޑV]w 89!gRQ lJg%bN ۑ[y4-g?Gґ9iE$| <.g3ȎQ0wBfx9b$.&3uX;#NDvR~~s)ö8#,*@7R? due/HZ.+.۸e9y]oҳ1I, `9CFpSqA@GVQ/zb1q O6>԰o?q0M3ſd?kbȻX6̖֧Z=:^žrwH;$[]v8& ߴ?}zFP5^-*6ETܧnvۊіPnuaQ`b,.>`M"~cݼIvlX9a8Rѯ3п\R"Zp;nMS9޴hycpȍIVUBwBy Q&7Bz`\0əBF߻2J+ )*'[➩ _3])d(jf_1*NmN'kieLn44 paZM,I q6zPgW!?5AqqA*0?e.d{K=XX(s!&5Ȏw,lVB).K6j' Rǧ2(dMq[jy|8r$m-fz e d ]@Z0ر:t5fwfԵq;gԵc-2/qL/Sf_9c8X۔5voQ'u_EۧuăO"^ID GkhFsc$+`fd˦R@+{z^eXMur.hMp@O'ҩҌKJCz#gtŎ]˴O,W`/{n 8av2[;<+wu]D͚BΤXav+bië%GAzDb~)0 HPZ=KB߁/?1gԞ׶iQkkU#+LdS28=y<(-t:<\'Aa4EA ~Kg%!OCrZaY'°^)g;s{+ E`^I*IADžGu Ծ%}"s}BPۿGrD; fvZtAC*wTK5u15]q68wB36d]bC S3e=~sI~OY4qܮAWct8QUACsABv: #uD.m>v hEP7Fi`WG !F)FCrŮ8=$Cp $nܟڵ1 Vzi s whh3o%`jKCNu7R !?-&DȤa =fuY(ݠ2n`w5FK 9?9n_:QR:&̷/KZoF_E=}4@14驌 -)4&wo0έi IGl>:(n!SFWrN*64ؙo~fQTH`I?  ղ(]`jDZ83>/׫pY(L{ K4m"`}0'oܵcJ&4+LCj9>ݐ9"x#_!7pR MEh3 H*HO~pB\BtEH^J6yqٰb҇#N`MBjakHEP6E-S3k @ZTUɈY&wI92NfͷbaV-۶(pP*%fj p|ie*FgmblXM>JAof09D>nȁS))G$9 sD1aUd E%D}sL`I$MnJ /=%tyV6m+}h3M;O=GGA<((IvzSh]+;)n6G(@A@{Zښlvlf IѭxXG#y#t y;XjwY ~2֛"rkQnOudzNAofhtt Wvoet2lsYN4G ilѵY [tܮ^ c=#NeI&Ɋ(eN3bA7`9ٖ_Lg"M)eZ?]iV\ig9UVM^pI#\SR-,# /_S!P D&H{ۑ.0JH͖ [bا}Al<`Z+e,h}R?_v!uہ"6K&g],Qnam(J>(Ws+1^FmrI. .F#RRuHժZ5Dl_^w{RfbeiBy'p,JK3n7^&9"I `Y!A3D?(1Q$K?+&Lz/o'3H`3X˦ǁ4r(7k,Ȩj&~QCaT!“B^D!X`jp8 lͪ|t 99&+("gZy,u>b{יBM6W> i :>XZi0Ioۚq4]]v'Q=G@oȹzcF߆t5PUD _I!(V(l2cZ/X4CC f\;o*A`y pTe(LRh[Բq6=Kc馒 jQ]=\1U;I1yu+{%!(o'_dKY_Oh0t.1b62\KM&ù/כnv_sw_,#&7iCE<ٴewBC#LN櫬$f킷 fi]fB&`b8-/B 5cɛm@z3a,vEbEL6D*AŢ|5Pz:E؆B !kI/716<#nb¯Ywi~GBj& 2(&G7KϤ +\dAG eEHuA,[ci .(ZM﯐W.LfjقuY㐱n ojHq8}MW!Kz^1.چ-ϙ "xٔ{"Etބhx Yqml} Α(B3-`, ^#j7- j7<Ӹ:f`|0b Xod&_\;LzySb5}J.[U.",X[5B*#c* guRz4٥gin!+>7`) G,ɏhFKD_X>XM^86&qH'U.=+՝YW1Cf]#ZCVZ2z6 ~%NQ=C1ȈX=(''E'H7MAԳȖwVo:I7*EMa0$l?8!\y 뤱rTNp:=2D}ո!Y AY;zE$z4FôisUVυ ,K.sfm{KC- t`hu![(/aΦ@g/'?n s,w/Nq2ѺbItpd 0_`I1 H|T[wӲW)eaȄV5ż3 T1$FQ@@R*m9XHM). -W#?d1Ljdp>T#!zT/Y.Lz ٓ,Dh,4ܖ7MpEhpvP gJT *s<TGRI{!M& Fz%@Q'KRҩ!jo?VF,_<^[OJC#L~K;o67ˤ10:sarK7zŦi]5Č 6$0& yG?pɽHRpseKs`9l[Ga[ Tm(^`ܷt' %4=SCM=6?fr{68&*Hdt" F̩{WށֹO%tDv-LKl7ӪW.]i GV*V({ǽgw]]mBnjxG@&yT;o[L:\9iB7Y2зA-8ȏ/?vbC] zD߹07S\6E} }~Z(1<F>Ao(Kkou^6IXV}.m@@mQ|2,Є!Cr[5cD+Q0~c&k32eh&O!d~h `.zKi咶es#Kri qŊCsXmㅶԁص[1d`@f@([ e6:hΑISC)ĸpA&``xF_YtkzD]%݀QÍܽExKv {'.m2cMA%ъj>pC};@g$B&)`ܨ:Z(o F]_;may_"*ૐXUL^Eh"aݴi}6X^k烗A00P"֐5}w둥ay"jQs/~ tBMs=]O1PGI o{Yz3]?970!hYXA}E9Bފ>@' FG%aQ- ڹmۜuf96"E:-_QINF,ج;'$kY #`~N+2&ML4f:(\D:j{o* l8]@ſ˺e缭9ZpP 8j. !2||HsP0먿ӐаTD# o@gM:Y_3c3"]iFG>kD#ZM]~f]EW90ie׉q-oZjZl,l|:@b~u:3($Kb= H9aZY|ϊ/ʥOs+abTwߠ0!gar ) 0@ 2fq崎n)1 plp`=";n- u` P4Do,ſ:}w8K;'mv~⟙38&5'mKG:/#; b3Ȁr=LR*< ^6<-ކ#_sy9/g)C{{@ r1Sze{=0l߻3  ˰/ _.BA)02hkwFڠ(0:Gxk8u[~Εd"ӯڝ2ojݍn%YGiNn;@ۛI?$Tpi}['ThzWVuooV,{ I;0Lx6cF3AUV/w^VAՙ{pLU2| ݃Ygzl> 6Z5j\}ӝO:ld8 _6\!>$±6JxTײ`ffrdZg~vM<[Cn: AwTKғ[7:c=D|\-8~G[IsHABsuӪWEb0]h5D 萓tg?ٚ~R"p+Dr!VM62ky ᱬA@LM4pǧveҦJdQ4_@6-X-ޡL0Im eL2sKpuTn45+ 8W|nv.M_AOkD(]v8 GMVM֧o.;!X?O`ߊB XSqaUpP,t*V[Mv(Pg5 a^MApYl+(׷׺m F$(jsdvLSYNVGcJsijBFOI0- Dƚi.~q=cJ#q_}MpYf:*_Tu6RuTdO؉w5F8)X DŽD1M|3=63Yb !1DӶ(Zyx֞9$8Jw33lkbm-:{iY<ż ! $#FVӵ(-ͫ$Ȑ#N 8c5&hфd}'?3b ,yWv7g8;t5i}}grS޽0MjsF^DMǍ}5LZgHج}LutR3M`[L«s$^_4Ec9h]&~ܝ lX3~ژfr7 ӹ- i3%yus<8$ M>[{AY.^OgYVx بkvSDž?jtbP~JL`ow}b-dn&d5إF/H4.4kJlgX֤i21(pIuyۊ'j$/mD Nn^p糸@m%3#v"39ޟˀ3#ϰC-WxtXR/.@PԷBܚ&eQ IMg)WgS5#Huئ<:'5țXX?IaWV5C, ׯO|V6P"%a|e1!xzTc"°RI&^LGS;7ë\u2?6m1g2޵.'DXPo#+K |r|btd?rZ1{D)Hhz otc=Q,M67ҁ&aG(rI_+o(0 WaDv7 ,SOvgtW x/P'Nc,iLy1LVٽV\:vtcj_!lF;i U d|>ύw {WT=ϸ=h% A(8b'v$j 4!X\9^QB2e:n`6Y(Ui饛ckŠ'q^E1;l824:qf3ꦑ\@GavCF|OA M)gOVw>*9q:?G(:jj "x6"k绚KK2n&L2(cX7< -ADCr!+ txk3B ؚI0)ϭWeBarttXKWJN"Y˅Kkq+uq,m-,6Cgsܻ|ɣegJ?T}hy)RL`Mht}w;۽?j=wiႲ/ uIN3nk5BxcǿN>fetv2h>hd^뎣_2 Cy#B=:u:eIg}x^ČE)D<jAY\FVB5J5ۘ o:`R3>,]LU[]dĐ- 6Ota=Dm_3&P?y!5))=iC24aTI6G%G%nBޢ~[-²s0`#Qڀ Բu#J 6WwfZċT%cQFSZ{V%V&T r$ F@q >+H/>=ôg}HA}1 >Q2ɢG߸V6Eo3炂Ll'~Bv?~Hen|pUF@h"ms+#k? j8 _/t8I&ja rDZ.p:)a sҌ0Sc栂r5Ω.T xrF˾j>fciXc@]׈| '8xD4=4AED P+K:9.zv8 H(LQJ,"Ao=&.㹭iW&251Kv7pWlz7p}}_!68427m uaO=HI, >i+8nG yhJVg-{gmlfBG,)^]X=Bh61JA4TljFB Oz;stG1`ǘϫ'x35FOzA-rU۴wc5HQ܆ԽgPH`PDY"<(/jܦo00cVmK 0Gڂ3˸\%-Wɴ*TuA 1e 0S'?1t45/0M/jʱz8j_4Qfo0sw.+BnQS6@=ӱv6Ԝ'u ~$Z-ld hNR24Mh3V!PD7h863bbÍ,\Ix2bTHζ8޷c)AiuB_XVpyi%z'}PBӘD< M<.gD=1Gf ԦI6i7'g0L;@To4Jبyg2u(,94הh)z좕6_0}ݝ цȎ:i'‰ɓ4H/f]vCW6ʰ Z\Ĺǩ')SѷP ݯ_F 5N6@m.3n(Z!7?% ОRn!'-X܄QVG~SO`yd7~I0Hi34ۆG?̴Lɹ߮c]ˣф|46[6lLYhS_b`33܌56`:|@-mѧ;@Ǣ# .^h-Z=N-ZפH;eÐ^ YJMBr;lƪ;( gxs3K?UN7 X1tX ui\krk̽/Ty-;m4;${& G߻G^ Ts!IM~PUWQw%L͊o 4"<\YcVۃ71%#RzM]{Of.G׺v5?Hm]*F'MKH`uQn?Hr[YM\3&:QRp>0ĵ?>R8 ȘdN[GF;6/SV"2Ɍ,2b4ߡXN(@9ǣ:׬ ( jXMך\T+ֹxoavUfĴ{Kl֧ՇjA,qJi|C6% TmBaU*I(!a"4ʃ߯4wz\llQpq1I0h=^274Sa i{udF(9>}bYG(J@ _ %Ȃ(:*uC戬 Bô[7ڷM0|d-2KhRuدg0&O"4r_WܓC"Z[?x01#N(?ɍ^xgY O_s|lĨsB˨9ɁƣߧQuT=n~C yX ":N3WHfWl'"Q.D-a:DGBD.xHM Z6lǛ-"kP;Z<ڲc?ƻS)ӽp~~-St]XNg~vؤ}tD#Ѱ͌Ng.W?Fd@=D2 kKF(G?+^Ua|iS !PLf&uhGlh'cxQ :I9LyYh.XB.KDfb9xk ;F& GQdg:B6 뀦r 3^BEF޺j0e2gjgL|@b;Cu^|6gٟM&k9tD\1bG\7Ŕ7.S4PuCZMi9ٸwTc͙{Ѓ+<>y<\'ko6*. y2jVܦÊK d}~,b&zY6ͥ@f9pvMyfU'x%6FoҐv#:J!goX : 2nc d6o:Gsޠ'PlȆ6e gS:"5g]l=je}ա&>oIJpf3HM d(Ag7&J2XY0*QYVM Wo-УwZVm$^<Ӟw!S*]h'_IJ xJb>nx'1HJx;ٖX5)k=@nT5Pq"[@,%r3~|-Ϥdv2\Fܗ=9lO5Iga-tPcn'oo!D3 (k{X:KD_LvrB\bަt{Fw.XLѲ@~od\-ݎr,3n1iC A\Ȏ.8L};#1OvfKYEZ =󽗝y嶬ӥiC77bO y"DvRL[VA}$=UF-Mž6OH99~ М[GKc^ܑ⇃s#b,We/nZHh؝)wDfn ^(CF:+r&I04f찰#7:UhHJ _MLՆӬg( tg&Z@P^H^&z"nqɢ:Llh8'dd1ظOI}M5_Xd<,inSs?րo'_2D w ^nC_̬L\ t&Msη$P "f a#RQEݪ7Ro&MheWPBInF4vFTiV}py -Cj74C=dA)k1j-y08@6M0 $,~3i?i20)tA&n}b _ {CB0)"Shإ&6K|i& *CYȝO+ cF†NLvO}n:"P8} {6`=aЏT<z[WSm+ʒ`xr=ۀڰ00QSz؋ .utDkȤAlƫPadG#?PA}PA!:eE0AW\Qq,"<^m<<5YjzYF5 Xq9yȎ I@[{@Bˡ]8i~gEMVwQoj%oJ4"vq,]hj`*e~*Ÿ:1gP4ـUNl1M9e:eJJ03G* %)3mC7fڤ -Lg{#7Z өRp䤷'zɧx{/F`h/$HJ&wF0ycMB01AhL֛I4cj_= d:k뢟&* q'X+X: Tq G%Ze،Lq8#p2҆Ja@,DQo(v9<~X EIPOd9;bYaP-hm c0SEB^ s~G7pdLw^+Jǀo;3hL"XRV藋b?Hv(wVG{P! ҋ`` q^{r[_Á 2>6W$,{%́yf]^{q,ؓ"ަ6S^RbW.!}(OꬎW58g .9 Qг{•Ntj-w?h hdE>9%5M0u@"m.Sz/UfT}.T^CVٗ6فؒ+QǛvi,̲p貽nt{"jpH4\!!6S1[ '!("qJx\{ő ^Co \.XYfB_h@wJ<=^5>_U=?-~Yv8[+ji.&͠v}o}|m0X:fzY㶩G'#%CG_ A\C AaV>5˲zWT\H nXZ/<R!T{Ň&#jn̽xM ǟ?w тXY1݁WuX 5Jw ; f9Q@Ѕ?mx(П@nZ}W ي)=Z\"!Y=+cJ4ܱYgOh6o @Y|@6"YXɣ%܋4ЬJyd;m[gL.vhN 0/I! 1I~J\hVAhN5zLLaRPSQWl*#BN8OxV ΐΑE6R['PL 6xӝ#xgF$~]@S]IIaMOj_:1.0Z:@r\ %r?zy`2$b̵PP3,#ӚM` sx3XtoO>Lz\yrG^!mpbX%35@Ob Ѽ]uH.U>n ;N72؏ I* ؉ r7'YXЁʨPGSb!tbH*؛9c[x@s/}U4guN}@.!ulhr!K~ Qʜ<6A+0%S׽D=U 3cu03?I6<ׄ ,o6*a},c{vCS483SKu`}#ŒO kO)[Xc翞W+|m2WAA0TpX':eb"z`WŗR\Xھxi0ڽ51cLOS1_w~굒_ xLuRM@b<lz_˯oO|䎅I|isA?%Y'h hkDгMO?Waxg߮b_ hvu ^~W=*cMi"5AWa`5=`AL :@0ht I'Vl{se?lS׿a3 M$"H5kpi9huP;KAp(x3OF깒#F'1m՟ ^ QCk|sդ |>FezrÃ?t iMrh^_llw͟yYuzG5G]vP:> .^Q3 NN&u6ױ k+Q ,f>$@B%Sm]Ht?nW)LSb;pxFd$} p܁UVB'zz ^|nSfP+L ;Xn AO"8_y* ;6}Onmd myACW"Kڬrg<+*/jЭ#).B6m)qv6K[ir0E԰eD4h|Փ vU]N5Ah!,;Jס{&l]zmMɣhPR~hh'RR޻)gUyZB55<^m>Ӈexn՗D݌hfEmŒ!:61 mOtRQ}光ki`/IcZ ݅Y*[R~Dye lOlu&O]E9`NN 49+SFW ?U;YfS lm@=Cd2`!I1a"Qª4E: sb I,c~)nCyW}?\)['a 6N#<n؁K : G䠓|#!ͻ]ïɊݓnX& 6<ۆ-[;Hӧ?"uq׻`FZ+ HT:ӭno/кx2쑺Y%%>;3,@֩:(2y0Ȗs= L!=ӧW]Q'ni9m$yNf pҪMS0WB+O^oOvv}g^1I{2X26F@Y>/ ~ՕQ07w<,Vhci@+?Q'1:W=hŽu]׋;ϬyHMQ.x<u z^|) N`0* y{1`M"p PFӎ{H4fK=P7B\_ց2qJ C7>՛C'\yd$aZ?7grJ|1n_Nb}o1.gvu ߊ.(gy[3X:+,)3c_Nv6~eHw~>ǃ`}~|j4N (? &rKc^lcrZ`︠:MidN}^Sp?=YcǤF%֞=] g|x8x0舧oٌr92/|u1˓1 CwPk춍z}߼,z]eVn>t]Dkv i|Sjy 2gy?mp>w71ߝ?4JRp+e, }ws5'rM[-ҿ{K4DG9r~|X |oy!AJp3ظU^dQotPv /H z \qRw;DJ@JM fSYb_@vڊ˚t r]<4 \"]9)O=/Mu-F݃Gx]}&bf馡( DA<<@$9$B!H! $J((A1h'WW5=ӽ5k~~˻zz*]!Gn*O0Q"PeV֥qqy !XI@yP*%Z,ܽ][gvոTh6 9U`+݆TLV(_3콓<W^GRpV:my>zXV7N,}}p}lMi_jVm^ˇneP.Uin<].o۷E\!Hj'$f(ŅA)(&"@LrCt&Q-l$=b-zpx6iKI!18_5ڵd2$( dvr], 3F,RJdr`f}Xw!X rcozkucoKC^r Đd!/ݢ ]֕Ǐ=_:i~<\!^R]5Is thX6m!avnH<(8,\(5U!sST4\CC!g΢}^gHAzR8rK4lyy)Pß 'zsv~yo 韯ׯOv6F 'xi=|4~tFl̨gz.Sus5953&^؟lk5}鷻'ev8T@!xO_$olZ6tWV@x"Dx@bJUBoﭶM_Oio9ס1BHwR1Z3~*Z4 Q*@ vi|@\$n`ϔ[3B)(`}|J# ,u`wjョ$}Vwwg73Gd4˦#bx;d-%!d˝YZ5yh],0(J[H`D| qgddbWO˝cS =}#R(+L)Jb4ey|ɍ9*~5֦|+[kg W`|?ֿ|sC5"ᗐEfn?)jJ,2ۀO(&E3lf}(y1O$K A<:SGkzsdLs/rx,t99+*Q_'٨ Ia =) @N8j[Vg{7_mu*\/Vm>aà7mJ3[Cuas~sۗ_~7C7/1u»8ڜO {^zѱLZ/[nv- !_Dk(!JV:2]02]y^L, >^6u=Qׯh0P@&;~&)pQ2sU>Kp s{C lYhNe* ɖe0??ge'mMWX,) y@Y[l5ZӦc4`gl*&S@@8CB6Ρmc7E&w viƓ/U+G ]|u:X0_S KVU*7(ʷhƙg \i6 XށJa(FfWL-x\TXp ^vg2E8Oh Rf Z a'tqonj|:u+Mvۛ)u#4-CmԍoVBhF<W_dw}gqI|W=:S5rOGlEP,4W~3r9 hBފbb~>uKH 10quȊS - ¨rcDP}L.XIY??nN-e-dzWg7WAřQ87[Q4:(ӿOzRۢ1졖狊bZC唑8#yVEC^r EJn?L"uddx5De$plA (%yP[U@+bpaACS(ɢS6ܠpL}*=9)M&1;hv޿^]_|8MTū0G-xv|e"r)A^(' +A2tz|:|u?H.c=]Jwѷ+<'zF>}gx"Br˱3.SfQPlT",bw<'v :և?6Ap0#w@JWOB?Xo7%Yq>:fzܜݭ_=Nl~߲$@Z5\nCTA:_]ٵ x<&2Of785zipoI8'gtC .(52 "פwPrZRAyw E9@ /?ݴ;`Ku䇴qQgFz_ۋ\O/eڴ۽PԽV忏ݙ[.dT,z7#:沰~~wǯ֟y0HXiesrەCE5C'ɋWEWGQTThHQ)h 8l>Bh^)@̶Xj7ُcMttu-ΜYvm2vn-f\5= c͉Xot!{&jwܪv&D]Nؘ^Mq2? i9R(B].֨52<aHItQZӣ6^Nt*#Q,5m6r!X"P`"6!(pbKlA ggj &) dg6ddĚ2z-)Y Q99Á/VoGIi4W]6ؠ@ z"HadlCÂoٲ,Y%oح** 㬚iaw]=ިrR'U j[sip>G28θ srػl+!t`"Z^1ly[Ip8 6!Ms2XC|wƅiq$dͮzz)-z,\g7sYQt+^ɣ:>=5NrZ`E(D0Bʵ/Tk8)u>`*EFHݫȀR#FƞNl,ԴhZ>>Դ,H4aTT?kubغ̠,%H ;\˭RnPCғvݔ u_[X#87EW^ЗR`ٿ{\_JJft1KK$C X%{]*KeaN&ЂBlC` "wPrD~v갻;-<)¤Y&ۋSC"8z@b100vͮ\ϱ"+3, y*b6'0^VꦽjcЮwtT | q]/_n˾ l]shth/ O[?& F\܎_.3f4Җ(cV ,8M1M~|?8 %\5ܞ+NdDބ1z! + W6^L*r_4x2u4P6RJ嗡,G\2v j-'?8ɸ@,CnKc.OERZ`sP-{D$*#6pbE)Hf55W^}rY/WrxSP=۬7dřJB]'tj7}11b! )u'0< 봼VZN7#%HNuyO3D'g̑`tK)jxI yIH +*@g7P ppN' 8(/66X/ fbm,K.j\cZz};q14ݩqRRcYzs+ֻy3ʳiM?x/ɠno"WZl d۵pp<Ȯ(YR~B1I!9B3ٗL:E EQDu[+<6t!ZRmn>ݍcôyb;kz9`g=Q!x'ǃ:_婄ud(+^VGeUV\O7wYZ[룓`6t׿}~o'S}iwv3b yF{槻Q?t%0U2 q$կuOۙZvv?D32dx.f`&r4i]+ i.? og>Agwz*u=J'7 K,,(S$AKr\HU m-fؓlrSFjT^XC<)M5vJXWrllգ~0ZI'PJбPlYs$Nv[1s Z&‰D}s g 'e^,uS(W^ِc*R~[F( 씜jݪ]juHr۶֫dFے 1\HjT%m6Tk`xO-d_ju<立bEVFQ$GBmp&B>4zŷ=p`lƨٵHQd(.'ǝݾֻQl߽d|}rpyQ}gTDU. 8K1Jt 譜U &I<Ղ#D+K!$wz&á21)5 h _oGnSO&O_o׏~H0o,{+;5 jpzTuQҔV'\_O]5}5ᐒ7킅E 9H QnZ nx? By[JnyQw^9W8\X'p(&G|ɡ{hd#H@UCMo(Ty,чdÜLxnv-W'Ǟեwt& nB%J6.XV}K0S,oϓ~(:-2H}n[A8HγEܸe_Wzk|W_яI@Ž岂uǧ[x%)}s/#6H>?UY ͽkԛ[@85(v z4C4@* mL\ؒ]O/mCjUY˞1XfitSoKKTjvYaX5L,ؑ~$L{xt')NoG8[CVmY'Epl:\ۜonnn>~ Ҕ8;ő"ke h? frD ]< eJzg'nz4H JE(l- m _> ݴkOvC!\JjUC&' 3iC`M!$+K|R J:nmyubD~u*/dEmv.jD3Ji8Zlc^(o \:{/wu rͻpδ'ib٬%9-YJh C4Y{(+| PHhWIf'aǛ(|O-&Mp<)\Ωtitm*E`s-wp/o.nNg}k1|*U+S"`mf~]2il Gxe~'vv8"aTX@Zυhgʵ[m^wSe*͒W*bfZq KV]=gNk4ɧaY񾺘l>}mC2$2=~JL\230.c$rY\?EZ@Ҏ)W *Y^_X$7S*G[d3|5QKVX(yod3/P vr?Ӄ)K/}ĒJ"WО).FHLsFwJZپU` uj1TϜxT%ώo׍3;w?r&p&ƀ-Ȋ,2W Te K@`կX H7ٖUɡ 77wSE֟N{YCYif@8V eׂa H@y=XPuAW$Rs:u[(yӉYѢWv#Fgܚ#J|Lo.^ݝ]c:i޿>:$Llg`i`0tPlL6˧*Bo{'w..WW\0>zv0eeSywOe4 xYmZ=4FY"?B[|P@]/g"/qE Evc|.Ɉfbw;<<sEnk͇ͫUnؘ6JŽD Ͷ*TS÷۶b]APԴTp^z1 Spn! ò , 4tSEQB ByC "" ""*"E$ ! IH~%U}NLooLΞ9{~BGK$^$N@Cl GVqSfu, đfMt"jy٘MqcƝ-3!U,U1fjdҺ cfs˾[5ZO7K`6}-oO/_NE.-ÓR`^8^qRXQEe$خ錖Y۹{llior,5BQ?%jeuTdxjzY3 ԭ4 bO5'lvԴkyVyΙ{~ e,ҡǶ/a?ϏScݬ*mِݚaDQ&{Y\?? .˩61)۷DhchOCik^e j_dք@,:Zm|>R4,WN${je$cSJvmYJܷDxttH"GV13X$9o:>9^#|MWXaAJаLF+*Cjd-y:0g#n*rO\FJ1dZ Y߈as׵9ƾF4L*h5 rȒE Cfٜч#'׏V|z|y5woϛ֟áCYM8nKj?_^z=lJ{M@yq*Gjr$VUŰԐAa"XUUG{^bFf+QlddUgΜ)AIQ֗0:E(!mww~Oǹ>Np|nr;( Y(Q3FuA[p>Rd{|quɣӗ/Ӈ_A(~ HD9͛NYF8IrLř\9})! nj:|VJJ3u @iș\";KET5 h&O:qw`@ū|ŀ`w=)$$Z.+s6PCux!QWZA' p3 ۈ6l:Yc=yroi^~~q]aLg5A>xX[8US?uDf.տ'r~ۙ.@ Zaj9fB$50b{w|}<1;8a p jtܤ$(fnܬ!-=PC4zSsl\ U9mf SLD5N wR&%Tq{2V[t1w E!Ie@:`Յ=1UҦSCa(Jh,[rl(Bhe}=?JZkyS^NQ/E3xsRE<$}LqZ7Cƭ7NN{?ԠFSEU89㟯V?~`ۜ+ڪu,\tl-0;^^(_k]ggRLʀtKuySQJȳ9NKe( R,!a1 Bu /;Aj&_K7Pz([6;oicۚn0' 'hn/Ǜóo_>k`J,vpLa'2d:hkO@+2,XU:%/ 'FEJ/릈Cɬ!C`$kW4eF/-Bpɋ[羫(-^RÔo)3?է3f#%Ӳ f$eK p?]5]sdQXo{˳Uw/yt%Lzai" *K/{ A`̅r Bxe1ybE]JHM&(k7#:~nq˖G& ,F4X\`y9fJ g"U?%^"%Sv,f8l{'Yɞ|$/9i7o(UF"0y՛U)%L?ű!ic7(&sW6PHP@ _`7 ɬq4hW)NZIwDt\WmwAɄ B4AҊ7A5t[a7IpRZgh~S'ۢafm7,:deOѩ^v[\>9]x|3oxW6#YFCm6daInN0@Kл1o2bGb/ @Tj_MMM 1 Hų O%uխbY6o[㴢D#;d-p:} `oa+:Q;7 [[ߥEw~qKx3tq ̨mzQ_|8|p:z`{AV駿|y~*ggջ9SK)64-3h d ei> b9H5"T+YnXfs&b}M'r%^̙j`MA‚J3S7qXQ*)ԋGLS~,8V瑐.=C7׳籲xw||~\_ﯱ2œ ~$H^9Teٳgg=kZb}yp}>YzOo|GQNҦFz[N)f}BmL|gp'9*Usyi%9H=,Rb p !)ݦzk hwǃp\_]\ϗ/hŒ[pTˇFV ؃·SX@yiDf`&* Jϙu1xk8R axI ߟ~Gxd_CbcħDŽI{nݏR(]}w{RdAY4]y硺)tO^x-W|vg9NpҚ1?}|vyq:[ ^>铿*o._ʊEɕlROVTYSGwF<H!rĥ^(e%~862v͘i_`,?X5F5.}+s{8YUtMD {ȡݞޓp ?` \%P(t'g]\>Mn>2RnL~Á)>MEDZ~4Jl.}'2x,oܪ5m1Pغۈ}f,M31 a;ꎷucJbHFooZ=05ܳzd`KW)%ua•{܋d(9~4D%9Zl8$M1TU+3ML@;oUITV%tZ:-E F5Hhyw=iOx^]v(nah]6}35N`~s‘Gw1ҐY3\,_V?9'yyP/)=lD>O;vĢlƶ!߱Nxh!)HXjQʛb&%SG'{c{rWnq|Eh-q( 6d^5݇| AkA`+gD?mBu-9Y cٙ,H|;5dz&yzǛ]䤽~yruxUIǡk|xe掏-ʜt]\x}Xur+BcwV%gSLjj$D, \- k:\KPC%Vy Uqcrx|`jDqST-MQ-M0Ӱ}v_={ۗ܏G?]eǏ8Vǻ,0_Vɸ=l,9Ѩ>ԍZ*< hߡTe㱺fvd.{zIHMK{*hXƋz\*犅b(j!|ʕ&X! P²wOG;U:kFGF~ zyG]l-A:p9^ N;=>N僇W^<3;'?_=Klw{gW7b+,B+ۿR:i}j9-U%G]/0V3?:bT+I>zgˎƱ3UWrpVJ0U/g+XBF)Ք{+0XT]؃N)nO5=Οhizh{z(yEM9_?ѧNsLD #9ٛG/Kh{nrt<,)BV]v2"<β C4#KKÈu2XN{akױgJ>h9 ~_ t2C)Qɪʇɶ,UN% b|?wDyUC%JD329X@7 ȊXY$@| q+ `nұHv+,zMgh>ʰ 6ʹ憒(kI"Jrz)5`z]h0q8=GbjVI̸f °9wܓr2EEF9]{}?_5*OϞ;uYf^a|)S-Q`<?j uGTXE ͘o|]Q[ƽ$1 0kߐʽr8=zs ê36:-a@ɣʕ{h2XX*lnZ*pƫg]:U:>?0P.3(s}m㟿{@i# ?yz}1k'8qmep oN>ZRW˕2\Fx vPÍJ A0@ d F|~W{IC/OHX0z"5,r `TKRL D(Z#ZG(@@IFiXdRufkep ΒϰBFJȤƙ"oj[QXKSIMT#j{whp/u{ өZY=בM\㭦y|Ƽd/ ~x}t)VlF+w.}!O^\-TJ$XXDAXEaAS$G >6hǐ^7$n,Y)׹[Żlq BeIbygq1g0p$n@W1Ej|qŝ/t8{P(EG|mׯ^w/ruշz۫ᴷ&j"[qwZQpO'Ua i '3Ll2' 0&9E*RDShJ6t0؂HPeb~흵W?la2< 6OFk!4)r\_P 5֒e0R2$.RZRD xhJΫ?s00Tw;!2P[k'K`owgwz\$'WaSvZHkG}pyӡ]*tl>\R !H"uMuL˃%j')-ؙu \X.u2uC)x?^^>?AFr8{mwA)$1Rg kXI(^~7ۛǫQr' !bWsa|7l9ۛv^'ɓE^ XKr2Kp`2< Py133~4>&#}v+$W݉HtyT$+~ ON]qOݤKrVnrq{r%\o5=}>?<t'|89YG o^vȢp#6Zg~msd9B_#"Z Ec[pSq"4A8F0˜8GvF r>kKV@婪!$ʘB d5bL uR:rδ(K)c1!kw I.u<:|EwF((~0!alv3g-:`5V7 iVb\ TێYǰ^Ȯ)< (PI" 6b*Tp.UT]s4*IԩsDa8&ıb5ThfG29UhVRyRWx\"d88 h` e" ,3i28W` eXyATZt!)yS^Jmvۣ0LY%*u&}@5 & Knnި1ݯ5A{46']H?_Ts#)}_yO 4qϖ9OQNbt<@UA@x!Q!62(El%t1rA$R&p0T"tRVf%PMNZF-Y3-o,l kF9!Nd ϲCO F(qE\k=#{2U-?T(‰D@L@HLZP%R St}٦~*p8Nvt`0\w>5f*-Ij1pY C`T<ɲƦglZTԜ}rFxU-WЍV+`B5VƧC \u]p(u`\f7yIV4)]Ȝ(o[}0\ Y4_ҏ:;~|w8]]yg$IZApq&vi;r I^:NT=3(FSB(sƱH\' ;libkods&?\QǾP+on3 &2Ch2ٻΨ=ֻ9Gz+ fd:ulb2ƭQ*/W7Ձ{t6G^e&PY04qDWt0Ⱥ+2 `J6Ӷ 3?<cs zvЧ[K5+ε{4JT2MkszcƊL,ډщWǓXg"MOlq#h{5CҴGF>6rk4L) M\ qs^UC͊u ꮜbQ%n߾[}*CK«#Vܷ:SzP[(-$ <9X!TZ|Pe ^39l{ىkUkFyI$dJF!߫2EOuzK%lba kj;pv j;)$䷙' {(tjRƴdFݒC+S~ѭD"}w?&N'0ۢuq<j;7|+;-peַ͟6nDs˹u@;iͭ"_mzH"Ԑ;C]CfmA5;Q_w;LT VbJlZԤ .n]+i4FFU D?~VdmTՇ욨q EIx%Dɍ;K(Ժ~MɸmczY׬hP;/ڙ>` _{~yxyV]p#`O[ DY JjKC jNcr#"n)ԛ)kq3:g?"5|gKRZ]5~cK?|3خ@d9|-=n -LvkH(, gu:Ղے5{qrn,hִ>~י; !* V#f]`3rЊ+RmؗIk]~K$xs5=ji-,V̭?"P7Ȫ$o jAO]P<48˔wo~~h &ۓlj:建 1vNC49r<,Ã8./o?_vL tupOЊd6rVSmb+z2z"$Iѵ#u5ZV (JSn_n7n[θ΋(/XzHR5.vtUe,#L w?ׯ٬a9|'i:C'*&azѨ7;ExJRAmx-yʯ ] 5+0 y} Rm6K%OD%AY77xcx #|-JTp>K&&[5݋UpןZ\J%-_X;M^I&re:/N&oإ:n؟NRqwy.akg}&4bOaJ:f}'<@,` sg`b?FYUz ,vk&Kؚ$;}:kMRl" 5Oōjx8D^zo`t-n !^$8ngf ,Xj(O}>;x<:8in5}Ean,)N.m-.ʙ-ǩy!M 7~{ O/|6<P;r-BHO)ѮvKr.ĺKr(1TqQ ~R3@Ȣ k#wIhk׿~y{ׅC\BD2>j#,:|Z,PA۬}mm/ΓdoT-8<kvj"'cpۊfVwWaΜĝ$ؿ:7 k}Q]o ).8qm65;st[YIΜ"yH71vٷj߼~+q\\ݚ&7p[ Ue8S[XXZ:HwFw4_ 7r-(u$\rqS~AZ3"=R`Ԉ<LА4 Kbѱ/H5g=nXs6&v Ko. NX^gN=afee}_X_PF lמCwE٧8kFxTkNT6|0wvv Ara_F^E9YhAd Ïla!uΞsM6̎u(g!E'nL@V#Mv j6/Q< an)E!!^x (""""H"!$!$!! R!wW5Uwjfzzzf{wzggٳ~gb|^F䠃tq8jȚxC4ZRS (k T7Ohu!c[t^Ř}5ilFl`P9օ|:!]51}tl "yӋӞ{+9'טf#ͩˆu4,5?]L?ݙFJsXbƂ"{!MˣJq>vASO2$ȓCkxnǖ b\S9`H2>sP֣*,^?+D/ _OS&.;>ׄ0CB3l6;C[H~la^ԂUP+S@|η|?wA&N{cnntWrǒCd+f_漐';W$?QP<V.1$BEĉ&) }@;_#DX=@Qש`msI db.+qs@m wqB[㫖t7YKvOɶT(_"ǹkH 2j8x3AA ,7 TUX&e=R"J2b9$X(>dڡ"U?sŃ{Rdu/84:̔Z~gM5(ME}y1u HFkz͌`@l-j7h9q ѠdcU]++Yuyiz#l?t=N+0gt=| Euy#-#Zd8׸jwJ,3 Cxhѓ` Q=W$nzG=kjBz.IXdEvj)c䂭 "ɶAJ;0 W[KXmW5£thREFf:Šifk9g}޲bqZxݨ(v"1fcnLIF`jˆICM!HD%GqL2Y Dɳ3p_̃>"88P,E-` 0jrYBkuҽ^$at1Z2ۄڑTP 6K#Zo_:,ҬԜ,[ue+T{nkd߀q;vwL7!'fC jd"zs 7\eDe=\ hnF2&pA1jh X2opY(!̑|?Ujx>(YMM:P)$!/G\ BUPĝb$Ƕkl$ZQ(S+wkjVNz«DUM$i&}M;#pݱaHSc|*6 ٫Vpsdt\]#^O:&H(b|}ax]wۯ;Q%H~S[ T:"լӸ7foNpe<.e=wYa}r5KΦPm;z:z2 X.{u24`dcG'ZKGHz9/l~@O]BB DJ ~wԎ7,j:YOxm On+%؝X4η]|M=̽x-;m[]`@3mYE?&rqtJiQE۞&.m.;\nc@7 JŪZMSkuH+($pEtzHnFڽUt^.WM2HP90}patPx 7:{r C!S=ba!!£jUyIʂ2ڇ:͕{h˕fzP+}b2 G_LrT6R[Avt"!oAEdX[*qX{")f,}ҤB 5BTJsz"C,7эRDw-E5aJw)CCvoO{utm^iٍ7MڱTD< Wy,6S+m6?~r=vQKb{ony]8ʷ:D#4fkjU-;Sԋ5 #σq|=).vq܈DxDtV`2DVHt zٖ7{MCLWڇo{3Cd+PBb8>fCcX˟?~R/$2?YPIX$\Ui-MN$v6ѓEÚVw2tۖNXTQA+e .k vX`&T^3O0.S,TmO.rX}!T["E;Up#-]sS^+ˣYUfJЄm5&,.ć%>C"<¿ʦM]>O𤋮R*?$$Š% [="E[s+8;vU;԰xu醯@wYщ^f1PUg^e#i d@YֽMبV*2W+Rm ҟFh ^}6,>uv:snFthC ?)sYކr(M"ܯnb9e{q+֟?o? et7EA,83o6?m (6EUL"Ƙx>'X{bZ%=jƘa>VѬuph~B9RmT}}@WOjļѻ0B3}*$'YIVX?, _m6[Ҟ]}[7m;^bLJT@!_X- V]O)VXRyF쭃l|%˗0,]R,?ǙHbb|vlC@+N'0t8_/{#BpuiwIVZkͭ}ãdis:^k5Z%~r6..`k>57Υpc|3{l$Gg0zA#ǠT#znz Se^@zsY`ӃNe;`Sw<}ӈ>/xt|^~'Uz㨓F01SEG+k.3Pvsu'iFpAOwrFp4{s[a.S =9_Al*>ʕI<'+n؛_fs>K:a[1lMe e+ʿ|\Auߤd1 z2bw|Ah%#m~kQwO7GqRQjB#y2%Kyh:pn3Q*ygFS67^$\Z=,[g&:4]6.b IZ<<%!:f{a={ SU(7~o~Tד&;5װjҏ~k'Gɡǽ%MBmU (E6.w}[R DTKU.㷫?4*E&D"k!)]yi .KҍM[}! Rcoj.K,+:|ѧf]RX^4ӾSEb C#'3plOr\-$YvғmP -tP81GIx~*>ff{< i+x33k1u͢5JB`9#޴c A:{s_* 4ӆȳΖ-vLU4򋧇 Uo@f&8:peLv h"MȺ8NKJh-N&Ms9g6§bpJ|Nڶ[dxq[(4!$%%]- n\Fa|ema+\3J p90^,S-"0q 6/= FCQttuR4U,퓅ZRrcc\|1@wvٸ-czoO>t~-Czl|\߼rH,NQ"$T PMj9Lwu^]("v]R+ O[B_VF`}'20cdbɄَK5l8]W:ey?B֪EeBTuWr@uE:G;Bt#Q0<'Fvaq!P{C^$ zPtnI'ci} em/yzt[Iktl:Y j% k`5x o2L1Oϧnf?Vp.qv16 IqH:sW,Tn@U#&b͗[.cel|f0l>iei<{CǭOn3W G,70 O յM;y/,9_6IQ,LUYfsOq_(:- r' 5MazKiS7,l|BXQ9nU/p&4}jCAkFw?M7(] #; GvRYkp AVuZ`caTtiZ߽ճo/kD-jl#-BP>`zU_S5MvL(ue{ݮpS;RY}[=lpulcȕiP~RݣQrB%vNj  ~)_kG"뛬Pګmۛ߾o:c]JZ[jF"Pհ5;M=z *G?$ $Y;, 0#6XWx.'L3aRCoOuVi_irz?HmW+#t,i{4ҥ;lvDn*k_|ޭyL:q8W1~(gYɞO7e{Hϲ14y_n%b(ћ7io4e  hHgWD*b:O~w(j4Rr$I$|Y X_]odh "_w9Gӳԝ5[÷l5&Z[\cO;8I F0$_7CiڍNW"Fw^^4&½G( ʋ,if}=5n]9?hil~IŠZ B:Msu&gQ:$gMW:F n)V _Ĩe(BrԴտI׎4DѢ켹 y!NRj^1= S /Xp ֘0 $ ѝ-uB EԴASb׫!i# 8h{M'"ū]JdstHfe%ǂX4!'8-1tM-2[k# 0w6.O7}zrIBxONf0 #qh-67Yxe)؋wN׼;:͹I&|0big9Pr=UEAT(:N.Gv\͖[#ՊPyPW|勨.l0f >P(uLq{(ߚ0f7Ue[2!qә%ݬ1N J4ͩmxݫe(/zg̤*$Z$F3ɇB {V9_4)-}#?ڽ(Ig$0̨PjriZw OT(J;Mh[l(M2=d"=y: YɶU`RJwlkEgDֳ%dz57I2ł,xM2I ЕH'd VrFjs"g4ć10зD~M" i?!I"Jb#Ͻؐ^&zRc)VFLn`W!WeT%EcErp g^epeM}[LRNzU)A!Ge>o1c9l,m 2{"Kzb(4W瘕Z5ۉ՚ba1mЉJtA,umFgfOf!-cۢ7$"]vċUD_囕ӘO#RVU="MŐyu|3 8+%STQU;a2^f9Rwg$\lj-Ӳ'Sw W\ ,j&\XtrCi~Zʡ.Y.6k{5MڨS5 Cɳc>; Vmi*,5A\8(Oq[agc$̖E˥Y3SmnQru拨VlGpM;h:Y-j8<=Z9azyyDhaYH)S'7O=<(2GVlENըtzi"G0Y<gl !Y7$qze} 5 V<%+@QB(φ*EMad\XAyui4_J:iXΥ:{/~yUۡ1S5i Z\9wWښoF~Cu.8 42[ D:fty>Uq`n'5b [t(‹m>hV9k)i/zqs싼T CM:V7lߵg*P"<Wf\X\H}/Q;}̉>F7nk۾#NA/Rz$iL^#lk9ag6[Zë0x`T>FL"m }ճd|6m 4Qn4NDKqa`Fa^wfX"+@QBS_ތQ+gFbJ,7؉#sy:2d9__^ ]'f8ɷwO j_:tCh~"wE+R4T oet)u=tw؞Q%E:ͳ:,3קBl뤑5.^76beYJ0'ncZ(\U&)(O!*oYϔ6395"e-"t?6F#nNZh;Ȗ/JS;Y )cbܡ*q_Wwk2 ZbQozbOԎ7=a|=coI;qBE$2k:K4 (O,-^4_mWByF}zl'Tc'=fOϵE$hYWcׯ@1Dx?oӶ_-//MGIN޺ -ӻ˯^ cFTіiڱ!x}xA|!y k)ixrx|wҕɓݢ,&Zd͑I'HBڐ]ph=SN(6;EùhKr }_3HPڱ׍mw4oKa$ۍ}V/#t՘JU'2\rP@G( Ht42`ěW*al;!1X%A«"ʐ]lVgܷ<@jeeENP=lRi$+-˰0-1iKtul=K`ܣhl3N@s A ۹H>j\% 8wHsIQ [ӓxA6G*] %@$ # hx>G]ؔq5d)7zP[+_mLPU+Nck۷wEQ_JZ:4rs)[c6ʏ:Ii#y.UY^lFFW &>%/!AeĊtZ7/;.Da`0Iv[h{D!A%wsw}>[]/#p4آnnFNgtj_^^ܼlyN|J?(E b< ss@7>e7 $|q``_[D\3R n!B $sb Y9'=n89xr(f=d R(жHvߜDT,8ἱJ%`51R`iFzÞb4di zx} U|s3j[Ey+ʂon 9TWB'%ӧGM B}.A? I_QcI|%}/uh[X4b /_JݣL 1)Vp ;N*T2Hj$y\sF<~.ߝ)ǃvgl[/Qkv]*\e>XcQ9Hn11}1x-+ϲr] MC'qP8N1u8>WHd[/$R?jeq՘ 5eL'=͟.JhA1u͎y8DuNJ}5:`=LPaYjqԲDy Y1d3vro^夿L'7楼Ce%yXNhRǺX7?OX.ѡ[XtחoR[_K4`D[h||y||21ټy"-BeKiNjzOt$xZ kI~>h(;θi@L/`4~:[|]u2?lx'ĩX [~Ƀ.J x .뵺f+ӽΖW{9X7'{Q?i׭ݘPDv77@Nf g [On[5VoѦ3/N|YZ8ˢ@Ȅd/@Mao($;atLIo*vf1mdcst7^y)/"0A]<8 `gϝqc9}Iaxr!~ըyOsgicޝ/}RJ߄*SaljZ<b!C\km[&-Ykm}{{~FJu:hV=ݘۊ\bWgfvNLn˧'=E}/hޚW @/UH/jP/NTV|>|̈nwKt}ܢqApaj%ٵ{[?30 DY,=-2ʓ:zLe]fRJArr( BBP Q%(ԶVֱNgvg{|>ߟ@\zI$B4ͦڞXg\Z* $7 ?lҗYϖ"LY@{_wߒD1īQ#VXGjlz{iO15\=.5/Ë;i%сH3K~/ܣH%0L V|uqcw$1]ԘVOT AY©}jX}KIs Kʌ(뻝VΔZВ2rˍ:U|+J[2xAu vϗTUy?#e^ HzUTZQ˳Qe>"+Ŵ$zY+U_6-32,9%$*ri)(d&η4^k6ҜNt!(e\&!Tru_"BYróOj]z=oEl.\6sF9S=0|σvh\ Ca\hF B-x<- .&2 #"Ser.ɋ)%U`TS"ҜB %Z5L<՜zBQowEb)4B^n(`,'`s{gZ<%AqOޏG$TT:;|rw ]^xMooݛ)/_Hy8n$d#.jVya{"K؍JZtB1MVꮬҁ<;Ow>OgcXs~:tvq0m`]Zm# l^5TEB;KtvH^.u2gnw?MBUV`y1~a9 dԸ;o⦊˒n2™ZMp݊35kGB4Z]3otnw%hUL3W ޸(Z9:q{ut-.Wa6NL7%sGܖh:R{4tZ,҅LlAA6,Y9VAahzelWEjxTjWuV"xPPȱ:CvgjobI.>:brl\,*pA~VF@HgY"XdقJ|+_Zp zk+]5=4*A Sd/O7Gs umV\0lGogO3K}]m 2DiШeU㠡5T(MNlOCFL[3{]$Sd"otx> b8VvشZts$3P͏:jL*壡Pa!EmM`y>]RR[Pt "nĉىmv>: [Xؼ}b|{Ʋ|3 xb<]gcOAO%Rf*c۹WbWJ7oTû<5Ɗ"*r Bְx|q'bgN!A7D%Gl$Zoէs,Ϥ"x " kh,jIAa/ ~-6xݯ]L&fƜ.ޛ:죜N Kcc|f Z2K3עL=-`RH/J[tY3,]3Iect.uԏ17^/FSa(pfiUjZ{4!m@^ۋ-k_g3T}dUPT(=TvKTw2!$5=V6D*JDMvF>)ŏM vefӆ;6D'dpttwC]8-Ai=o7A)'Ee2W3G7p;+棡E՟^|9:TGa~اf,YF1*c~v5 ٛp9%%<%5̮a7$锒H%C" {x-3plzux\0ݽ\b&Nq-v[f:;?㗇/f #ׁ?rgɛTJR5(skTI\?^'g_7aI4(_췂~M< wZFWnV#t8EdNv8ka_mz* |oΔDGF]l[lU=>x}Fq#o1#b^Q?+r5&WvD9|5pTQ%.̉lTޝϏ|~ߺ8}xx]S$~90/ՄcE+H\נ:pϼ~_XΠ~F!wv39?Ibvgj-ݱ)_◷yt㻯 ꢞE˵*y\~6!vJ֩Fi*G߂ii[2-FZQ1JA R݅ANFh n??>zV9%V[l}[zפzNRkL8CW"]t_W"/W>ZJQnU@(h4 Dm#:Qo+嶵b#~4}qacmh$ *ʰ!GS@̉~̧jAu?|\ REHVZ,m4n+YKCj:;]B0ﵻ;Bg:=MZ0Kwq>+fT} s@\b͗Ѷjzz *ӆX TmGmҴNjm.)(8=uB>GJjBغ-W2+i!3u+ TD?芤6s~fԻùp\xmJ$FN.("DNJ@.O"#Gzbm5À_[fKe@p<]3YLkA}C8)hUŘ|\8%F-g۩Z$9=S1e]Y]S@l{_7\ lg:VtPᇭٗF1E=ɣ?XT5[#D\_˷'ظ7o!4E-s$%mm!p*c$SVÔ@gMnlI[ lz O>۬C֩JBI`l+T-0 Zkd_0 wPBq&!~ьimRNiQgXFl .+/mpܽh c?YB嶖soO񣯟ک.O >=s8ߙkх#4+oN ӳbfjKJ)L䖑6>Z3VUxvdmq|E^Cs٢sr`م6+gc>Ldb1P Y~f@<-jIF (a;hu2ΊЅH+-(#h3wԚ<>/Z,Q\p={鴽&~vs]cݎr(Ga~5*n3xLQ k$^ޓ[&dP-E${@H&D>Ln}Fp7C,TAԈǒenudFk[j}:g7 r]B$Wxw1ۓ+FYסpO&GMF+l?~M'o>n'OӼ fHۿp `Hn6]Hkl6awݏfֵ. EF1{SrM߼kkl#6va 8z5]yQE}J<`<H2cW. 4Ôhby?.ՙ-L X$D=F69&hO6޴1<7s15vFi]HͲ}\esF!Nq_ǽ!ۚE;Dũu,ƅ9A%UjMdoR"aRH׷f8Y άS.cMi?Y.iǁ(B"99d C:,.[GzorR}%JNnKׇMgÛJùɞ 4_ׇ<,vdTfw;uC_庐ǣTbo9*UA(Qo7elݪ_I{A_;&%*ޙMބM:)|;hUF\O/H^h_RD;"!$Y&r?-"vC8L5h?iMH9h "  atޡBI' )1= < oD oNQlr8݊*N^QrPH54jjQ)x\*p{v>|9<.}c~mL,K/x^qEU=(w'j9-oWÈ!leY.RI+6C(+$$)?%B,Ep;nʻpxo+T(gL] X }Ln%b-JtfC/"w]=bVH3BCeN+Z3R}}ϥG?x1zB3'xIG SH B ϖʲQ$c)|pB;(œ^xжL lCdt RwM? K&~*ObEJ뉀$`MUR|P&rδ`8 ѵv}TJÉQD?kv/N^p- U%1Ȥۦϗej5ef/j-H'ƣ7Fz.ωt%dTI0^UFaIhi1YIeEːӆim~2gc[xQ{v-=kUl6£~?Zf%E|_GN))ik_.x8 ãVH 5?OxFVt4}a+sۣ0Af/$BͿRy2x kX2gYшMo#v+Z~ܖk%=NϚ@ϹHzN͘dsX"w%X//y?}l?X*&1s~i_9nCcLg?(Eto.ŤPa~i7t6)%tE2WaIF۝͟uţ&B#Ck3 #r@vJˏS0n'Q1钺@ B`!{WdD11ڵX=o =K$V8?46(Q(G9OϮ?̯&@n؅ݾ8=F=gerϣrs9Ӓ0+Ešg/Mmt)Tv`o[sU1gJayRJΧ=KVU;9_XX $EצPoV xcD&[5k\^m#CTt;ߋnx8-$7V;3\t9ۨ$n)kQ2yH`4cv4#џOq?-¤6d~ o?.8ߏ,]gS 9iUlEV|RÛ-۳ %ְ+[ڜeQߚwxIZr| ]N> ƚU;^H=N'rV3XcODx  s00V8^㜢2VҶ/[`(ZS*OrR"[Yaߵ( -{lpzf.>ͅRqk!!E+bDzHC%nFh;N>~zGښy]]; w^O.ԫɟ/ͅ4B(ǛPuS.`lR.HY}x~6Ybzx6]njBh|b594 c & x`+qmPeD]R%;XxJ&2 \IÂ)U$-IGO{J[ll81Q<=<~,rYX z,=]R"$iO&^7 6y4+ VQ[0'0kQbr婊QP2oּ`,)ΘFݰo[k)L!~}pnunCL&Cͺ36z^ZF~ü (#2.g&AD\Wfl1҃lquyq1%?o\[̗BdmS1 sv:MIiج'u) y-b C@ޠaF;>\‰pҏ #9?.o~?Tr<֜t,lvj_~w]t ,`ͲAr8-knj"!@yP#8vvdw0l?;V_Z18_7QKN,lmV)r+U6׊,6J(c*e3q!}%`sZhF٭}L3DgŽV([~0~ѿ:pQ-$vק@mQp=hн,pI w9F`ifQBhG)pR+]_x=ڙ͎Ϗ@LkoҹR^7zkj`owk627`tI3&0 JR$ 18EoF،e~uEX'^DԾwO4?j@౹=0ANw 3Kѝa CcP91&6Mhp~f$K}5*),O>}X}Әͥnt\,ܕb%;9\QVQ+!(!5l~(ÒZn H)>ĜE}uv -U'p&V;22{vÖPRh8 &Y/Y PnhF rGAraX~KrlMشz5(`骝#/ZL1>4$p IbqT!z™Jmw#FT"T)ͥkz(L %yf/OΎov|x )VߞntSx$,#n A!;)f$YrfʅA(N`j_:e)I']L:( ,Xv9m/ܶ2]\H6or5}ss>9ol!BrՍB9./OjcxiTd$B2NUúvcuFPܐ ^HIhDž}l[qM4E9fxXK|7ǧ!pܗIy%,(D8 ȴ3\Rp0e Ҵ@ZR:nҤ#@] K;Х8e77W`fnrMw݉z`l*Rt^gHӋ;e:);(&/#~2^iN\k|.%|AJ^멁emhY\70q5%$R*MF8S̆<+V*C^xeù^Oc_Ÿ"DwӿTe; .l,/Lɻvqܸ|0N盯,{}XpN28h̆D"IFNV }ބ %MBopċT?>4C?^/9zvLI='f9;{wᨐI"g/l'$j< .#$^V"{a7F020 |0 ⛪ v;ѩqQ6e6 uN <6ONi͑^UZ_/?~:Lvgͳ>*$Hp9MJ.1olﷳ"FQ~`=]nOR1vZ%mn;pk{K9?m=06Nh"8h=TB>KuF8ΰ%.%&aJbx F0@ " Ҏ>ypv:-Y;qV EHapʿٰ}idCSq{i|59iηCͯ![,q-s2mHTbLڄ[ލB]jU  Z͢@!+`[6ZOŪR1F{2qA6Ȳ8SQؘ z+΄V"-5Oh'YIIf[-^Z7dEKC=:oNVo.42r|8TIN|)$>om 2F2Qy7" g T f$䪧=-ʪDH(peR. <_ U2ZQ?Zy0B^OZm/J^+({_Yx${]hh]CBC!1х@FF !B!clcmmllc#"|!iLv33HI<}vq2FCܺ0U+kgO.vge"ku*G`ƯtM{ksc#C,lV~&9u{nr=:iET"\VΨ.ɓIbQ.Os&h Mʉ4r7*$GQ0J<+<$Ɛ 1<2 +!Q<,Έ8IC /"+-2ټ0H\Z( B32ŃۏF6PDHRE"0vteƈ3l,Waad^VXzm>?-{6P%:Oq{͠˻Щ}0ܼiL\MAv{vBf(rI:CQIIѱL3,GIȀqdhLdxJD,L!%IBb8iY墙aPÁ_wo?>PSj3FUÄIQjP,¬bIfjIAx]T:N,W0y73X+>$?'9Hx3chFJ 8,J>DP9I g)!0Y #L8yIdAb@42(c\NchN<*1DL tI/AS,xԧ 2@ a,Β4Ͱ,%`@)  _tUFu^5<F Q%*^7PG] nK1+^IElvG҃KpV4?'_3X-~T5zT0;X}. q~x-JA1X3'd2&CR (1($P AVb q4À2΁Iaq[AH[~*Xh7yviGq 慻ݮgJI>-}=@GwPnGqVEUo]ҭϵ'Aq GSp.XgՖҩI?U#soKLH 564 (1HRpAE@H,XkM ,&"UH)%xeNRd$Fy.rp OBt{Zs4gÜ EB:W[v 765+N'/!/V|٪G"o7s7+T򹛦4Ϧ8lE3)49Lri2C Vg z!Ҽ< ( ~ P! _)JfDr1~> 1aScXeϳ;;OzS-YOqڷ'34 6dUnePd-w;LZ2Ui3x!ߗOf@q2DY#BYݵBc ի!8!p\04­eE`Eq g;.Ph8 $Oy0|Q:@7?f =AӶfXʅPZ/ pcp\c$ {i.Oxf9xhq'/?\N<_$S:_غdye%Y2eOCQL$Y4T&zq( %D_Y,EƑbLU-oEN2RG[6(-8mJRPG-dz;`Dlňx\r d 4M$H=#"6@`T$h>  Q`\#B)!!lX7/w]zqtDS a:!e{]E{k]Q3!@t|X%Ő0犹5wkw#. ,l=>h ;toUz IlU^ubr, i\!$(E$|qjAbi#)p<肀KL$*рP2'O)D.>}q6\HFhVty%S & Fqu" \OyiZD^ܧns fHZ |;;+tRP:.R56ls^TM茭j:od'wcLS4cC)3('DOJfMj"i`mb8p#~{PIAWhSD5I-K` FJ{ \\VO*˫߽w|%ADA|~! , D0bV QFd $2 JQ[c:B-b_F32#YiK/cgxE+-p,tSłU1v&e,.  @*$y`gCP)@*J]dLQ9+<>C6)q$!9F_eI.Il{7HwVu|PVi6[Ş%냪 Rn4_ׇz ^uE1</k0rVPI-4zN{Ud]gZ&$ɵì)ݎI(fFmjyiA~0ndI'я0axyPJ$ĺt'X:TPPK ,&΀/co?Ÿ `a*Q}/Kn-8}V Q/w7uKzvFVq,u?-Dc(!"- T&a,&`1 = Br P6E 8 P; W0 Sah "*h/=<;J"S0;)E9p^}t6~VN0 ywyummP/!tլs6kC}xkirgڪgfHl+*m X? i:EYȃ_? 3FBc" ̓ pz* XYH?li. &ty\5n2 \1X s[A?jsq珢ͻ?pS"MIݥz#9vxbN@b?T1 STdDUYT Fg& JY0p _T'. 8Eʹ !^X\(-HӸ B[#gGⲂ%4iٌ) xHuo. Qa7v3xR5<(߯:aʺM{ӭ$ItJ,ֵh<uE#k@J~j1LP9CƢ8( /8]X`\X 1hyW("jXiq.G. ;3"cἱB ~o)JQtZ2>!QѰ篶6;0{=V*54ċӡeR$T5tsDu^e "Ey[İ˼dM?ƀ1H׊6@}MօZ%qo'TUAg+ t3a*33W.ߑX #j R-eZx+9y"{>oۖ1^߱Eq\sS[}YO"bE.N)9 /Ɂ ݢ(s sJ [ۭ,& E#W]&_Z74`;u,Vh)%i?^7fXZZ n>/gθʼn$ϩ'!PU_3˹ɖH4-Vimi8*zCH_ |]h8a뫔>\}'_5xB€ ( uA4`Q0@pLJ5"͊P ",cg~1$yyyع;FƸȣTpܝ:` #ut] ԱIx'7`! zӼ[ł'b<*;[Y68 l'Ax} rBQ(>zU>3G"#"Ep<",11 !N`As'2 Xu; s: I>Pk{b' NI[kWusv=2ӹ%Xpf`,Fq'P FAL '2H2p ",D$8 пh!A-v᭷Sr["k#O*Y ǽB/dw woR[?.("J򏵯 1kDSoKV'fqZ˜/TR)J+k,:RWZX7/}}[M,dϑ89 c`[&xZTJ˖sf bD"4QTHi~#ws2p&\JLP.[s1zcii#zѐyvwWEbWuۘn\i|S\WkfѴcpg0V.RO|Sl3'8@mVDEW5 []3[?/ᕼI`:ReS g=4<*FQ@sTJeŒ q Y[/t%Ϧ`*=;fg{3j{2bW H 6!_J oFT*M(lj$n9p[k2kza0^dݒ??4 OT@eQP?".  )Ųg`:g2Ւ:}8)Nawt'L|E3(]z^.5+}vfޠmɓL%2:{Me f;#߷D.zvz<fi٢vŖcW~z~G$@ ʇS| 8f Á 4%(eyE[ JY[w։uٱ~+S4:͖EmN1vqa0[5,xa$PdvsBGM+Wq 7eRk9vBn=I}%'̥eY{c. Y@ ' " m`DhKVY+n{ B O'ku4'=kDS Aqn ysVċ/x'x3iFR>oGZf]l>|2ʗN맻ӊF՛63\tO_5%? .oA@)0pnA9 decTA e;cpDP+2z7c 612c8WheK6'PЯz[T@:O@w s"UOLus1pq~ )\jDzMTͬk&\J'gA;{vWlVŰ35FD*KGO"1_?]OOg~j "@/|0܏xFpq&ta4)F ~.R35QCTzVkB3lt۽$lh>ugwru ֮JW~AiMh>?+|y5/ߞuw_mL Ng0<oFSAuLN[wg^L.-_A^!؎䰨%sDz6JR-ߪt{DaA]kHj7RP~S4\OTwk\t ظ ~O`[4CXu@@([9WCZa9oU~G!Qn"Z"gF!Fsi5uk(zs7Ce|A]6iׯƍLɆ3jɏTyfrzV Qr]ҊFbrg7ow﯏ΫD}x]cxj͂?}~Y:A @\"(XIB@/"-p BPq6Ae2F(]˵uٷ'l#ARV$4S?cUO)_<#V}S_g,ߛ}Q=q Q Q0s"-X04\+%aF)PjX0(W臡NPf7К1!h3"e+WILTA7<9f~zOv?z'jV,AT2>?~z;T ~=T^V,I/GqXa7S1V18x,ZNRH"A]0|I_[Gv~iq8K`$ !z0C` e,&b2(qR~7Ý<(ƅ:b˰כQEX ,lGo' o烢T:vkUa8VKܠߜZUדǡ^~S81*+7^\P٢iZ 5}Z%+Չ[+%դHlѶiMҺY6\w~hP4Jf*G`3LVv`gx:m 22$gId yuq+x7ו77_˗׸ Mi܏^+-^VmJ}3uF@lݖbmU,DӐ4 9(u[n%d̐8D[m5yv:NY#aL캆&Ho4U\Mf\gԮQ.02f ] Dē6qqJg[/?|GՌloOk_|6k ?p)qfz7 ]l_n jU3xQٵb芓~fJJ5_̶+M_?k,WټdrRCbJvv DbYt~A)B47S)#mjAn۱w??ΫD^7Nz,F\4M.zt>G*Q2;t W6SIVu4 LbDZ;>9d7HE0sFt/;LZerYkW:Jm5d_2x}7|TOmulu;VhL SNb]WEoz(+|VZޜ:%;7+|gtCv׻'_>m{gW<<0uu J#, Npc7'$QE;2w_y|z?o2y8?pEKJwva9?nBf_w33]E5#-rD٢糔o97ëǥJ|ƫɶskh'j->wg_ڒ<-gUGo/_`Os"NBss+AcHR0#)P:{Usi71 v=R8ËG0%-lU" JTr6$KFshs=ۚVm,ָJ늎Vhxr)i2&'AMQzWRyպGYh:~F#$3r( {-ϖJfw>b.nW_Z7hҀ58$Hm{x +" ikJ'ݪ\v{zqlDUmW4|ݾT/K ~YvtKpk}z)v[AT4 A5'i"+nZ"lzZk\bS?:LN`3 zz~S_N6*|?$Wz|%1!a!Fʳ^\ǥY`kJZm̋K&7=wp燡utvaRޯf')KKwg?ܛ^vb~5tEs;Rn9l"p#+MkvY/sqLLq$+h`\Id&Ud(JIIW\OAր@vTԻqx|^wfϘrCoEl۬e{a)$Ӡj;7r+{5N0j8BPz<9|G 7G3ߌq R8Uog TCyȨ[oeUjDI,m]YRι[VjK$5c/zvIPQ9BR\4>O'Q8:LG' BdBmWb!b) M%Mye]a eZo I#u͒Nnf=绅|eX3Tmvvy/\34iەI/4vmY> 6g3Sa4tRص9x7b"j!-Q}[| z,'Ovn}GOѢYuԫ=A)?=QaO6R!k:*mx8<>c֖2]ܱ_Bm 5SKɵ򎖾%^7%C~Nwgy~lt/t)wp4e.pL[jJ>Qlm*CzyԩAQ9-$^Q2P_ 歼65Gp̈^̢'G;ё\)n:~KRw0>fh7ghr Fq/gCIqjKf gvO&t}[ܤPЧf[ՌIdzNc(¢Jp<A7;l'LJ;VtZ'>(ichF@?0-h: ,#0o qvz=}3:g';h{p`~2>LĨg "^IPZb;}x Y i,q#v3$:#{3'fa,i~rϾb&ɒ1Gooo?׳uR˛-CmusPnd˹,%QlSv<Tʵ&'J}VO\ )(ua( [MHnqb@`'ll3*S֐e՚NU\ƝF⓺8I. A-8sN Zۯ[ۻ {qVgv3ݡW~nN?~T~?'!nϓ22*va\TB{ +˗܌qg~׿?,kkԲ Hg , .މGbTZ<9Qdw{Pmn[O6xfUkmv-fISJ b2DBsi7q5#g޶~=Ynr\ G[l#PM!ۆ'}0.dG̲|&<+yGr'GU߿݇{G{1܄Ut݀2fT|WӃ*8_=<_>{zPX(ca[̣ɱD^R8˔Fpc8@ ˲9V3/riܮj#Gw>wՍ;pc/=<d9$XiViBTdlQr{"7/˶xh }gxQWl1~wtՅdV$pr8Eׯ^m[v2=IXozp@h$`%af7!Vy 4AZnŸJ`{ APT.ܗ4blp:^v쪘aːt>mbe &x=kFۛƺ9=zQs ]/dp]|/dgµ( Tp8)$awvuyqi7gXڿywYxa@iU+S*%)\=>A &( 8iVd܏[IJv+I\X(yN3=ִqϮ(x3^Gs?ia!@QEWt EK.'r+(zVisX_OGΰܮ^9m RVkVzuqKѷP&PE85$q&aWv⫯^}{ dkvÛD󟞐&Fݭn͟L8ʤQ]~W۫.(MXj[sHtouΝ^嵮f#zwx> Puk7}S3S`K7>B7Vk4ۏ|og޾*sb1Y/XYF_>v- ӒU\:SKkWqVcL=_֒Cf'|}˫<"IMΆu:90ADMmu=lP4 >g4#SOM:?zrPZ͝(EN:z$ c!Wno=h$a|H h.gg iW) vFוBPn6baRI-B9{= euZw)ְcz00]TVW/Xv^riMݨ݄:ί?DAG˫`^cC|snb[UAf4IrQ^p14)A*lqTmm7^n1QN^ҧAiO?}ǣK϶8MYAI dΔZYoL]IQ0ǝ^0w[˚ F+ 2;8, 1yy;pfg\>e~`>yY(wuEc4-0r(RBa43>.Mf+)ţ0 ^Zyv[Q$3c8I48ҿW,/pw[`.&7kj%T:l6e$Q%G iGAvΉ@6t(6\pw܈&k|L1/(QoBjPOWFuc} ZIdcQR8E$Fy}_Ask&VhKxQo6FظV/b#רLJ2Ɇ-C?1s S6| AFP@?%UEcDR5ڵB6 "p֮>:]؃yMoz&H2ZlS7Jy՗h4Cjg/񹑫?]_ݕT"Ȗbm>f)(0DRX A(_֛)R4ú ^T{=3h̃ zJ 'yqi2mHCFUo䠰ݝUZ]#S[>6-s4LLFP7X7^zΞv->*&Pw6V-wDDLӥw;"+*|~T`vϦx4+RΈ ?JYɲjcBݜY}rdy*6YKjy=2e6 sxŤ?ƻ|C#NP$YK@v>\ǨӕG6jN,+,uh6RZ?Fm J*S߆sgZ?/:i%U nR)ܺwK4?H+eFUL&#!_\w-pc8:e|r?7 (!ta SO~nje·m+(YcLoc$&hXjbE+#"I&-ٸ_WlԜɕ%OgGUc;~T,k KE7סTǶy>Bgre7"wqc+2}',rH*`.!i] $0"˳yKhTdsHW^voXz-N}x%xTb#-s;}d@ ~% !#X8bIwg8%c>*β;u0TRϯx|+$qNyp֗D4p=3Gxe4/ǐ+Ff}3}(lQ'̗1 Gp j/sweO(Tp7Ku2W*e=0ݝD#7L:(IDw"H)S8QJ"++HWhf=q3-lP㣶m:Q_߮v?W ^fbhQ^~ g^A|}Ÿ]^Le5^9F"x rf똓0K^Xs(CldI7Jq弣7:-WIoj:K>cn.QG־]LV» 6m&"45zɘ-ь@Cwr]ס a7,:w{%1>IT~^ @&uD?Mȯ`Yޗ5NexDī˹z1xnI^0^|nl]`U 6A %8cnJMǂGIL 5n'elN'I2H\M'Dvœg};w!c:xNrK{}r75W: kpRB,qxٱHap_ dvRQxDJrTMdP`)2 KA$.xZwJ^WpP2ʍٛ~>-%H+eTp PݧR D7䍘z8QC d %N/\zH4˲F{K\]BS(yB癕,` #rTiRwuR*x/\d%7t60<$ fG%ڻ?KXgz1!1mW{⛟?j~o1i\ cc5j`xr5` q"i1I{x @tYfGi."(糝ۼ+Y؟[/&LO 9vkf.d+دS?|FSuR@5JbUJ!TKȴ'm9jsȈ[ J(Haa.F"Xѓ ^sg(; ˤǮ\;lO\T]K{lM.+nw^JP3$TRT4(됂{e9`m㫃t5?/mC ^ ?X:T-in @j fOl㇆/ILJDllLlMHt &QЃvsEOaSRW+TZRXȇU͇ζYZI^gdZ@߷]%pA*IY1g44飶Uryn .N@sfndl{~]]g}Fa.X{Q: xLNoQ{o K4JDSLW %ɟntC.!"Ԧ0{)c$:Yk_TrFgɔnFe8jw#c9?fFf&[!֟n9JHClV^4A9-ұ|,~;bm9?wJ:;> {淠K^1u%AFѬt[/ jI ':/ N *#dNTkEI5!CeG9*!ȯL=cV9ls&ʓ{ij*kT{ؒ|B"*kv cjMf:0h/%IB DS.BV`/uY,)w^SwaG-kzdIN|WsKaR}|3YB~k(@cTkB9DT )^(Hr񉝆M@vRkrsx On&_2n(lͮ:¸v}ߋ}EĚ&(O'^VwH'^ .tstqV?>N )9{E]BO[qP8 38~7solTh~tEO:Z Xw&8G8D( Cq$@o,bLgZ\/jg} ɼpW4SRfG*aA˜O.ǯ5) >ӟׯWєpznpV&˸;}:ߝOH|?l4糝ް g"[Vaey \w[ GcLHXtLdG&\llŠ JS; ES#)!U[x{Uslݦ'j63St7-C 3{#c#XY FIw1t;6hg/_ ^~@ *wlY'5>_{u7 f>`A=*pu<ui^Im[!Y$YHg%Zq_OB<FJsyP ^!M0Aȅ ]ɜlWoL96m>!Oɥ&P #6 h7}ӝGAX,IhmEf?gJD.^wۋ˫ywW`uA ?Y`˴LvX8l핋xi5oo#Ez$G]dƋHl[^hi6poHxbrLp摄Yl rU?(f*vo0r2} ,H [.vc6ǞE.] %I=%qAdkxr~rTsn'a Ax ̦b{px~>[.f7GwĠ6^̛`]l[ Nl0a[6evǩr}c'QBH$SpJ1q.64Ah\$Iso0(("P1{wR)ۧG cV*]ة&M2Uxۛm槧Kwm-ICj1 3,rCYz~v"^kTg_?E &d <.?< z(t M~ډ;a6?hkǗšCӌ#tusa8;)ij\KÙJhvQ@6>1"Xe:$FBNwggzm߲[zﯖ&%8M+(nCݤfv;G7U{[jӇ4)|d^HEw&L !iN?pKWEl ɊqE!ƀgBkdjJNMt~XNM+wFM=oy(b/bJ:(P\EG=sHd1Ʃmw{{ѽfogJ 弭Drpa[%26tLg>F6/?>|~&xSPBae9F:aր//Q+HlHŘ.vACD z8\\8MƲهipZ7I>] Kp )ݽ3.g{uW7.J@Ki-7BX(H,ƴJTM4 i!"E?x_jm=/\0RJ' p6Zz!XtZprs_£]kxy4{|aif~maL%P̝!1e%LdXr{kk(P\*49 u.B]n0AQ'cx‹Zr@ c›4x(WjÁ>"j#\3raɧ#r~Ѥl=7QOP40DZa7lq\i#1Vʃ;{?E ]^u Hlwy;"08$Ƨ6ҧwLJJ4wcusr=pjnx/^?f+r?k\ VP -FN llݮA\*g}8'I$ aAeVCj;rs>%JgHX AwFia_Φnh=Co7u˪sf7(+ zInOp,qlgC@>[>*}ɠ\y8rV^v+`xvbowȞ郆hDaLN.[`0uޔ@LcnT[֎"ݩDp8,lyWilxaukK^|iLMPG%kr@G-7G~HR\pԏ#?^ "'A)"^&Y|8_ܞ^x,#qNP16z&{\2mxx:A#J=K{?A*Z}~ ΋tV'p=NHy#=a ))xuve١^rPn=&lӴO.AvJ/ft^Nd+)]X#r*̆hw?0Ŵ@S :d\υ)҈nlyA+c;"G'wgg?iD3pBNtڿYXy45#T=,&`??]Aa QmHFK$0GpdVʘ,Dp/ d hZ%ZUm0I5M\(9\E6hRIy,*@019kz7c.rE$(W$/5|'7GE{%iZ hF]Kmf옞QOWQmtl2iރQqI1dG4ei)R)խ&H@;_{=tA@8q Uw_9: J>rI^^-۾89ݔUlhlw{S "9&Lk^#]/q@F]b"hCZ%^C] eY&y(-kd蝰2%KJ7'd6`k*aN7v] 3׏,ްQ'K& %Mk_=nF|?n&><􏌪n![{J] ha Ӝ> kl(/J"jnYK4lStonXrU%n#K^&0KB.PVvl`|w(Eٿ2z_iTR't|6J,Ugسam[{s qwVo}5gOhܩn6:VW\`o)YQ'<,d{^sfڋB HPJA C">>rVR 47[屖 8 }qck[} RMF}ѦȘlz> ʥ\kER*˙rv[D1܉0b8DװY[/X~bd⤯?&I~t޻EHP'^#9>?;byg@6⇉u;V_7ߎv[q8mA "P(< l3qj`Qwb m&vzZr.GeHyRW^+/){lԗ*C)s&7- ;m-?5VЈ[J&bdy<^5RC( ~T^z&sl(0<~l1 ՙ[zwXfLh٬}Rc[('%bPh;5(PW6~P6`hh7Nf^4KscPy + ]$,W*kֆA+^In+$ moZ#)a Xx{%$%^cp0NOhvЅiƃAqvPo ta:/LbyùOɝN@ڬ Lftu Ch-zEYw(#8;7SK7ѾjCXu[W-asQ @rGM Wqr)kۨO8ˍm 1Q=ɥ5)A<嫎'pE%Y?8/ ,*6.vzϔDrVX\[|:=VA-R `Q@=/GUfbEN֢ˎ鶎-C] z:A9E1l5#CoօKl}y_w/^^]A5FйQhW; -s5YzQZ<Nǧ2ƔAτhTEVs-Hx@ѾR;t8/b LH$MeNpɄ+wߛ[K^ CUTDf+.֓-qw_lON:lCWwVB3M8Plѻ^'ҔWrhϗ{l~zRY{wq5np"a%RJɖw OM[ӿF d*-,6ԗ=k){1PV.7TI$NZkǑ6 CtwID-M?䀊V.Pk(mUP2aSc36-VB-8Vyc4CMDJ+6_.-/nGd!*ޝO@"Xڋm8zj緛;EZYn#eyNaE7qyZaF .u~ّp9RoOFLGݬFm-S0 B qѰT#D;;ٕQ8XA/zBJeGo|oJz3.I 0|Iz<=l9:\H޽{}zg-~_~{IK ٬f7vx($qu(R<'<m 퀖7 "{킘7A =梄UpAZ=W^B84. ~ռY%e3ퟜy1}Q i+&S4שʙv5*L|? GEvqrz rd~x~yp~gOokv k~3igO7-[w|KxfM4\$Y!b@ɤr,60;[[,}9HݟA$rcεPDy!N&/{lA XG=+4{;&2( oIT +CaVh$X,[Ӝ ynqts{tj\rݶqx_eI6xgVR"Nh kGQj%;O]z q9YYM8)Ihȣ18&C1OӇߞGt f\S;QK Ƥh1YW%HH@Utú-]!|?m"N/~ȟ_p|GQ0RqAkG 2Y_$c)b|{uu|9'7''EO7MF%Xc[Ɔ>eFgaΆݏ5݈)~6p$e?K*b5%!P@8O[>`3eQǍD-醷PmP*{IiAK:;kv0$!m[uG E`lqd'o< 0U4@4 vg^L'{`^y'cP/oVhM< 0!׼t飅U%ů29 @Cy]caFu]:eZ.ռ+#_-~ƊBI'W;ªE&qfcQToGW 9J 2 m`U9܁!Kxx\8^|zxe?Z$󧷜?Ųad|"bLݑkV bO*)P@aU ϓ|A29FڭJ #x[.%egMqS)PڤL*u?gbT@nRZgG8[7=_-HX[w K!q 0em]X<䫏x*?3sG| =mCP>p$I ^;?NuE5BE5-NvS\O7j,҃_P&vQšY6be( ﷫y'8{0L>6J瓩ް{FMrq?ۻ9MJ gy!^Am^'J@6o9w. h@4 Y̨02Q9HlEg6rFy9rLZS7V |.)]! j$.d2v&$e3 ! {ALSғqUh*1 +#uӽlyq>;0Ԉ/,~>+ajϞ~Cʯw>|XBOy)2H&R)?ŭNTbĸC1F1LsCjB&>T:al*BI\D$V$CVJgtp2wZU0Mi5p6+V;-()cjo,t=8KqJLh~?YKŧqC^7rꕊ|,ygwqAY==Mv+0I1Ekj|z|$B''!*$`ڂ%ϣPQ'υ AL#MPG?{hYd !&(Qyx-Ղl}5$ Bq/$_h'rfh)DABM.rM !BABEDTDDEDET%(Z[+qvs;3g/iyD[%)lc_kQAH `l (iwG#[jv~2\ '́pnvj;&89(4?>>_\L^w>>I$ o: += 0$bPwY)‡wB_ >n6o/ $4G 0O bqNv'ķkOd]r`<ɲfVr>Y + +F@S,.M02RMC#al{|+UٲO3yKuydfC[]h#H$1UK@C3Yu|gT)acnOu71#6[O8*ez ln#X `wW?6qMaqf?us BFpiZ-9s˽DXlL".@t(H܎0 +j7V9<`g7E6wy;@iF~q_!r6۞v4!vQ U#Ql, E!N t?gA5$e9YՏuk>#5#KlV45_7HP[?~Ǝa +4M;Nü q#DXbR.1f~\NA!yja i(BBO8og).@`5iāJL#7Un^ ۝]In eQØH#*eq|ʞMMz2~^3ngnu90Nv$x}z;Mq>/?|i?ʕ*tF9'jR0=QLbx=T>^5ѕa)DI/BEfNNbc(GB &Pazߎb/~h? A;\ fk:En-e|Նn?G4K 41ȅOwx‘P:S+T}z[KEcm&Fd͘1')Rfa1!W(Ueb~wv)t[hhhl'ڠM#N^<>'1B8ϣ r(Ŕw7돛pt:>7d"\"Y0l8.wh-&2ߦVn9` K?}YlX/w#\-g˪ڭqs=TRSm>^U xQ'Q P-pI~;K3n(J6NZbi$|fѯJO ؖ0Rvr ,0HMJs2OΆI{t6`DJ7;Ǧf指xXSxf+-We gܨap Xy=S.˜? 'V;c\p&do0;TI$r$ʩē) .~[MvGi W޽)@ԚQ(BZٶ;}{ZwaQϧV2_?L*@8]d>9U/?Zb ,(LRy,[[~? )AvQS0V2~s>Mb/mɫ X}9!;o8!Z+-ݸmehZ%AړN)Z|_N&@s\#l%TK-s!;.3RLh4?WPAuP) ICmghɰ%.Nv$3"o0J~W9Tg%2=9])W(0i8ˤ[gݲ[8ŀq)Į)`JTxZ"'0vNd[ޮ$y8ME_?2IjHlN|r,Uݏ![N]qg9szo t+hG? ps]C͠&T9%)3e3jֳE+x+)DUjdPi(W,R#r<ͦW7 캲-F8Ml!FLoC:P`$aCh.SmKݷki M!!"@%iqFM$Z{+_؉5j񔔎ZԽ” j!Y6lq5`,s;#nfhb/sM ?۸TxN/BX]϶{MþNcDۏ&"2btڿQgs?N?C~tns6nrAhFJ1'yS:5q_tR-d/k͎B~ إFP{A//dba.ݍ*!9,=vb(*^ o{'Pk'n׍"j!_y`npfvj }ѐ ۻ>Fke1Zht'}foBl0qa(B.ju/,Zï_}༦qLD:p`ɇE`B]5؊f59tܷt@}!K2'>J:\JM` TQ0׶104C;)i0\Jv+ij"Xi6qnxı׳hzu8=9e}xv[pth?mZOY}Fa;6\6٬Aw^J#"REC8Mn6r@2G{{^[Q3|?|(ͲEezx9;;.ކQ>htLA?bk֓(TGeWgwoe*@4E F4Ýɒ(tB+r3/Ǻ'{ŽЂ9W 4iVSgO| <2_xKeشm`w{ݻL(5ڥLbws5?0HCIA:9ꏢ{8r1F}G8vR/x9'WeڷQzeDʆPF c?[w0qikEv Pigo\Akrc3 W/X%W\5j.ɎEr$!#0o%*[N 5c~漰Ӎ%GY}8{Kŋ-ІСx^(1 ;x2gG1/N;3\:}wll6 6J h Ϧ/pNqyfB5ceքXeJoq4TIʹ7+u/4Ct$թXa5][Du,N5Shq]t$'MvXby]}MA@;ŭTI)GQBDZ>ȩrru~vr|3DER9cYl \g̏T o`4DMq89``uXoIz6Z1$f BsDS_*t rEێl:AQt%F g{o.Vėx`۶Ə' 5sH< |ZyZuUN?0K 23@:oɽig/-fPrn )d9}Q|HlX'/҅_(UdM0@p'\_z600r`hS$bV ȣ 1dRt"09 6v_.M4)tBjUFw'"$yta$ Vw"P wgwMD8+rIO{eYQ8~"P,.x|Ă2v6lO"O>~CXA3;jփ{+E6̿->}@t/!nGYBl֗82 9 yDB8E)4Qt.c7(q.j{ahT R 6H}h7lHBMZr^+dxV"Nڤ zy8D[%фr+&y E@_^\fYwv|dMydg_̈́A0~ANvn31tpt1ey @B1 NA~7/@Slၭbv2{nEvq/Z@LФ)~=d6-'06` cdYC(-I"F]j^U2pGceP@ķ`Ţp;7g-Ť7z= i7Os5"O[AN˃`ނ͝чWݗs @^L &/Am+QA (ѸR4g7$N2?^e$k3u頝H"8 h2:5N||W@,kaEL3jԳSߵekY2=Iޤ9+9mF9x]l8:RJ`ӓEI@2A62iN >\/u!O,kO3sZwq.ٰWhwF)=Iq5ف^≥aۙĺ5C궔,'J}H,cfܒ%K赭hwpr!7E:Y,a,FhD^vkj,/g Bޮyk`-iw]kL_'Ov~s_flbkpVa QԠ?H  5 dw+- +bQe1-ً> 6W ƆċNƼIa=1@Z$+ϞJ`m]`@~}E4Iƻ"V2jT]o, R&a4ާ&tb aC.fWyutfRѱcO1Q-1.& r,tуKc:cB_U:Dޜۓ8 `ݿ|= pJ} 2P'H|v=|_,zs.WiE4WRlE4Yz>9| +9$"xI^w)ՁӐˎy 1 Q>_&n~z\Zk@(I9\.rFZ#`657\6s)tX-9,X&5R8o-t>tmD fC7+aL"*1V/dx_6>- ZQ~Y]s7iЌ蟅9E8S|RR>osH.XQhuLŭ>5) !rۯ?cy/_#TԨd7T6j-Zdz8Tj咤nY1הBo5u@AΦ@Hu>l6T|e2΂D XH hmf8ZNjvwV65i-YP܅Sܺ_gpA A+Z.#֧53dV]sG$VK2/Y^L7SfA=Q1ܪ:i;n YJ)5YJh0/X"?E]o1XAg8b *Mn?EpMS  ى:nHʩ|mVỶ/^X-`4_UO&n9/#x Zͺ1tF\N)o!aA Du[p `YzZx[ϙNiϐzou.g(_2퇲̴nvf"RMD&\ *'&rK%=tTTZ!jp;S٠p;`mKYn}؉{Ly,*&bޡw_摼 OOLh~w4. j^隄A|6 pDdv:rIif5p߯~`ѥ0Fk[ R~x2v{ýϊL>$Ԇ9(%EèqI©!?YjxR0_4,m lmk`]w°TJ#:.S7z(/]OÜ@fS랜4j7 ĤpxcU.Y ;#".3bpS%;$9ax6_XLd8ܭ0j`9gR$wۈ$kǞx}1J&s{_# ̕$:eQI>)?Yb8޴loY?7ml&4UȽ5՚͎Lv6/ᙺRAW˳#5&\anGH8!3.3;z`Mӭv( ?7MHNawlyx+Ca4 }t˰\gFcsh;4K|(>\+ Nڵ[5\tXAg=b!. B,fs ͌Uep3)|_,*PmTT#|ٰjYt?d՛mG6 |2ZVun/Y*c׋B̚ὢ$u: ל ( #&n[fSՖ{룋˛S J5$:C[͍?^Aܾ[nwC+m}VJ viq*Ɋ2ÅՀZ5/ڪRr*SyØb#)>.<sV|f|,}s7lrvfWóCOO?sjɯ:PnD @0h<Ө7XY+I\b4ώ&"c0yP0% MoH]cEb5fWIns yTcz'N4(bDI%$y6拭Vow\(S^^dUMNO/"]hN_yͻ'전bP6%e4E`ʟg&tW el$L6jUKqu"C"L2 w Rl6GEX`"EX76B4 9~_xlF U兏O+G50!}.pB\()mglpsz}r=͆WrJ2v+{͇wgcەLBfȉ +<̓{sh??~[|S>"ME7l"m`gsJ`0bd mh]^5!:S89|2>8iՠ W*9eet烽닳?z(x2ib0*ZO;Q9=?us<J;YL( l|HOA|2FgsՁsDvv<~9oޟVG)I:jc0N[&pO=c tAnN^_ k~e:Q0 g1=h@^ #C~s'  A$$&NE`TKێlXlyQX1:l=0dju:<;Ζ?+7/N\Z[z ٜ:(;Ipϟ,4RG @eNB]rn۽\5;KE0<rWtSzg[k e#h`X:o4=CfjՔWèi7;{ia}{tʪr~Қ{A> WjѻrԧH7+E3qQ=-r}tOq[x%e#M sPmx[DIZM$bֶ7lF*MJQ}Aۘ_1a/?{R7v=Z/O:r#xhM7>l IŽ]|qu@/:I9lŲyE-:[|>j$b r*KY [&7a3[OR-[ rU+];o{IO2~rxgyI*>)03nU~` G@8Ħdë![Q.p<<>%@*W#뻛dMoY[A` ݂WəTѡGICˇN9|2jʑûUaLi4Ca~Qv۝Wx]Fgk!JZno#&X]Ti x@{B=7UELD?>]M?R4*S>ήFKE㾒 {WXt6ZgdwI"&0^KR{R wz^7󗟿{<.#U8=82,`2VN[q.`LOn1VN/ w|nR^y'32D)oޞ_\Y Ƒp5bZ7Ûr<^,g/_` aR/߫ՎnەRwp ;IZ~Ӎ#28y"׾_ZuKvT5Y(%$)T :,N`!$Y%-'ߋtvxz\wlK0xf^kR* 8͎џT؅!VxDd:O/Nf'deF-,9 $M(oV߿AEy]4SLMrRz߾]r`vm<0YDyܫ y{8 9#YJ7 jzfrXNɉi=ZD>[ߴFɹ] >̑bU]f5?!bOEb.4 t\N{ÁIuHRbl9ݞnPf|~v?')a%0x&S/r?f .r6gdzM>ƈuAƛʼDbi: ;LտU7D ݻv݇d7o G—<बV+!ƿ+ݡL o_:T6\J&$Mʙ"(`j/Gr.:0 bcw iVg|?g?yIfM@%@h|N'#m1.x:CHYtX7o&}),Bn y%.~/%-ʧt&dw6B'\p*gI@ 1\ng:o JtRКpPl$o@VoHÆn5F v@R)y0&un<8ϧ7rrura@Hlc?ǷgZtO~;~$j4 Prഀl} 9,ߜ@ikW a:R?WlA% ;7ALgI-7(N1 %Z| c'ẌY\mn8\]xS'5 5f++vKfe%x 8 wsY%@# > o՛V`پr[l:`z}~5y~x?.犙o!8ք 4/8IO={7ۯ^,A fI|1Z+꠱(i~|~o?TC0VvU; m:]ôRYvnE"~ӥvݴlIhԢʝ4a:X=~P\^]=85 Ti̚7ټ; Z5Dj:Oo.W痫ߋ:(1(Bݥq|qttv&M -TQSŃnaTϟ ҇TD>?R8k DA%B'hE +ጝcTr}YdLtE4g;m5n'plg׫fx޽݌g|<^߼YG`|v1K Tf#c?Lyvvv݇ʫjÈ#=ldqޝ`:"18ArKedRfTO5M_JmztWV<_c 9NbH@ָg٭z^m*tVL&=*<) L6É\%Hdrd>WgrTEo [t${89==LO ѬG{bpӋ׳cGxR3T3&qͣS<"KF&H!!$R<|+/US oz^-5 XxW nG-4*X\Ke|LNz{|1[NsH:h2W jeow(wZ^ JH)eGyC(/ZO/Z|4UlW r [Og6[Gr P"R}B<fqD9Rnj-zaǬA^l,zyNE^O'~/ΐH<6A` w z=_tތҐx%_NfCr\? ʙT*ƥf+~ !)bÓJ[-zbxw4/7_O֯Oz <eog룳h<{'@N=CpaA/9orkI G)yiKBHBfpI[t-L*m "W`h]31bQKe2qq1`G!3mf+R$X)n*ME-sr HX:8Ho;M.닣LQ"CO֡^rMzgq$ODy  j `4A JIǽhlV?Wi[+="\qBTPw=S <3vWv%\?Wϋ53VJűub8lf6C4tS Bnr@nBADAD$"*_vMuuTMOMO3gw|UU\kwՐ̺ŕ 2xz 4 I[PCo7D\әt[2FWgiԢYٷ'mbB0',7UfqE32JuêzԈݺl;Ac bXY=nf`xPx-W,tµftyxn)W!(>Ww?|Y^ h_wT>>Ђ cKZپQ%68}ځFS7{Q*F 112-lh( KA@{ؼdžZ2@7,8mn -"^ P@, Œ_~}z3;xymJU(Ζ]_/l|9~AH7 xpۻw7o˓gopG{ҁ%u%-20fu$IEi(dпo?#=CCI*Z4N+C~)CbF%!8WQ$:?|>.W-F˪mӐcI4ӄ PBQeۓJpw{yt~5n1(qwph=>=[^,OvV׿|.Jǻ燇N?1 J϶[&AK|gpheQŸBYövt'$Dcb%s=vD7!tg2Ķx"W dvkcV_65:Q ۄٿoP4,:;ߝE>?3\^b`cu1PrC V;x}zx|uzXǧ5rdo<3׫_p=^>~A&a{Znɿʽ0u?bcZ hA4P81dbQT ڃ}N+.XTrv[j"HZh-tuo7xLk~ELJqdǻ"\kCcu{/7'lgrs0tz0\c(O@\.GGW?鴣D`UM2vHCGqP7gzۡX+i DYz%5Y@ҘgM pwʹ|KKIL2VNF 6mtnlBCΓ@y^0Ort©[Sڨ^ϛWш$afk$7݇o&O'˝yQ?_MIFy5Xb6ޯ>pu%6]O75_.b:XRWwz}fh!Hɂ(Zj⬬I  KAÖ=i= {_עJC*n&Bqh6]7wsZ+>^|w__H7*~-_1ەXhFLftLhWhZ @&o~zd]/syzmfsnH儇匿Ϯ?tn`x~P4$(>$7/q_dWLrisn .E<^(MxdD,_\,0"+dX᡾GB %(#RAfAؑyx'|˓&nvmp79TK탯N/7 gޗk!1o6)÷7zjyDU!(P08[1 $E_x9Y&Gy#|(]m`+-ܲ؜JE5fҫ D4c<#9z{q\7-S]Q%&+t8w<:91ۍպH*ʍ[")rbIN]ܬn;Ky;BZ#.K@0GXb` h$HA X?iۂY/m[h)unSA)!dO̚9ݬ΁Ւ&Pm{Oc}L,E992E{ b&FXI9ntg38$Oͣe;iU 6PɣOf~ԷPʃWGZw!!B Ze(AuBa[`UH8-~02/X m9/FvPMg{lzTgA(r,zA/-b[p.JrAmvu ŲE RUotDQWzcq||T"{= Q9!S:{ɧO.>=,+FDX#ZE0r2>,B$Bay~7N6G(#評 "N|X^,VI!7ޝVHm؍F,-/~]ȭghhpCD-jzkԌٸP7:VU0nC7 -uzs:IGAVRé (Eįo.nSV *uO(IkI $eErΖʅ"H=ͷKնV)Gr# jwl`RxQX_ͪ+HY5S һ*l|n&Z,jZSS0Aj̬֚nr6B> dKǤ_T%~yv_1)U,|<-㢝#1ǣRx:ơ Į2 G,_?̀He„v:kJz`DzrIOʡWp=-Rz=ɄRlwX_Ŝ)t 0&ϵ |8h0IUti 477iݷؖtdyz=A.&ڭt,y}>/~{;sk:T0j]`|aZ0T(稕@B)u_Z[ZocQ`&H%:)"*ؓ> |+$\f\\\kOGPnb2 n_E_±/߭βcrz%.ҟD!5Vaɡ[ݼ9?xeb zt"C%ӋBm AHODʳRň(F1U#+6(:$"SmF $4˜`3)!Hב駱ia7d 6S\i"Eg߫ϝ1eTWTF[~mRumoOta|GE{܀Eޠ7 -3?COn/w;^*z?UHH7JbVh ꭖBtuUP ca$f+Dj?.la,?F I04"0tj2L̠xQdID*AATFr[ews@ XpqR)]V<-W{9&2ѽF=扖꫃vQ ґeidΟ z;%0m'+׮-|}V6X'a%NOO%ۖj"J€>Ķv d$}@Bz=[y=LsV>*Bi; X9[ = @(i{UHq45{widE#[;~C;kٶ*:Q+ ڹ t`a)IPDYk |/O#   d9t? .'/I1ynviWM. ymҶF@8KwoK֏~)j[:>}8B˷ju9-+ 7N^)oeӽT_]; EUίq<䚊4B"`eS82-Ǩap~;ˆ Q1oȋ L^wy#1k(8B[p@YR0x[ FA#o3u+8t؇O4BߎD:X֭0$t~Üv?Xtڙ/_bVfkR4Siuj0G+y7˙2 hx헛XO^ b{oR"469}!6tKH6PhEOP8pZ?0k*|el Ȋ8U!a|״@+pe'0 /SK 3pYaT ^v}(8Rq(є3tU4:{ ԓ&uRՂ~5#d@|la< ڣ7H|9i)uX_-?4/l N`()Q^*GN ڪoyyWE s'`7^B|7!k4CȧTwVHH+DڛHeVRG& eRY+*GF̥Ax.83$G!xiI"6` p[Yʐbg Q96g2Ow_ItDcxK3<x?K~}ryt){c,c2gR*n{=5|%=~{hlYД46>}vl]{NϮxww]dlÍ$OG;)k"Q JWz(H>U(@`O\<ຈ[_oyGRMQK.p8[dBwgW?\f6?/(#aZ5*%{MjYH`WJ}fΦ;Y@7;@w*p6bsKɚ(z%=I;=/bƦ,_HӁaHJCǑfqZ}%PѺ$:DAE4d>锃Ks[(iD/F@NT+^\,,~nB|^ؼJB{uʔ*\׌I=~#j!(Xsau#CU,;Z2qU؃!B5oT =,fw {HtXa/m CX0W<MIG|RJ(%Xa~!+p #a 0/n5QbPa:8p"t졭n +\  z%#E2sEm-qS#Ni` f oae)gε(+%v?.}c;O~!Ƥ(^E& T ŊHGJPF(DlS[7xb^\/E[t(D4(PO5ˡa_p26|-HC Ug~y{W6 5PT_: g/TF\w &a?iś.FR뉢 CKmĶA/Gi nqŪbڨ}QV~Oc2X\b0/i YjhWN@J5K8QT$9X\օP%I yPx +B(bHyK$M0MP! Dj].mD%ZtMtDZs, L6Q( E!ɊkD1Ҩjϕ*pq¢jdْB"TYJE[=!V1PʊZkJ-MDK]v(R3ԠY/fN`0r\M6G!YJU,\\BxQ$XBԐ'!}w]k>o #a`( ,C3Xԇ;f6 ݔ Ec vCtoj̹`P3]sGR*qY]^_r*BŘsm "a82oJn x.swwJ{gNbuv2x+ 7Լ|r;GJ\4x U ^%sw=@L+A֗9}q-àwiM^!#jd&J<| @Ĵ\**$gßCC9:Q"+zBY`p Qֆ *%\eN(gCtOpڳK LjFk%xmB`"`2X( yCܨ%m&2*QWe__O 1W讄:V=ZN;yV{Wrm 6aFw7ޱݢLlyRHJBg Z{V820 ueSQWMZ4EwXN+^-Fǹ\.E/ǹ*zvP(AVmx,mm*. 6}>#+a>9#VϹH 6v>D0@O5"hW;VR& UCȩ/% G#*Uw%{ ]%alQb$Xz'mu@U]4HQUܷ-Ppy]\kTvJ5d~r&ܴ}Onè(7gJο\&y]nmX E 7JO9` o K'&CzrtX&Re5s/O)F|Evso2OB%yD cBEjH|]f AAG^L@HԲL7V |.UCQϲ*/dt+e3ݘ_ov xQ\@|KT_ٟk / ֌ ymӒVDvm1CҖ\C i qXfF;hIan.7Ӓ|٭yuLBn2\y3D +p"&pc8?F )ͅGiR5~6H! @r C9i{ Ć HRm ;Naՠz+Fvp* !ȕH7Ҽ/biUbF)4JJ :!> dkPDF%CSp9RXA8R/1h`0v TqEX%|)D+̅hkQЍD 50ae0" AK8t^iYo<&trV} bG7͗m_~]>^ie+%pKR=77[FVbTPJxR$>Nrej)!Hx4h4Dr .7[ED>,C e e+$LR @Z8[9MSfJ%4IXGP@Q$PT>2_SglکEJJQ5بښ6XNIEe0V7f*6; xq4;O˛;7Ýó{gWGcc^-jm;V*jKv+[R( enrr0ZQ^&yS+4k2Zr YF_)r} !8Gק)p 2IFee>Ɛ`Mp(,#L4^ 7;ȓ7@ 8TqyTZ7{h|dz nal9(,Tm<9jT LJ8.)Xx-I9 0q8+F .7\)hue/%P zH,p֧w/^gZ*% JIڤTH3/4vNZ]kq@s땰 ,6O{?p?]_|pKo,ލ̸z8~vojfhzUm:0;r1`g`N{@SqJ2g@G evpeQKAQfXHLF\Q KA}aa%D0TN^ۙ^6}+68i#@eɥRzz^@ٟN*[͛ח?>f1(jL̗:V^k ։h[|291v/a < 'ky ħ YbkUq'$ir( scYõ#( n,eUYdzUgGpD8O0)jo&F<4w:%"?=N/{%t<7GLk--e'E{3 xjKz}i É1vlgY^LGS,ui [b,:e/W) B  B4Ek8E;ZIr[>w;3JfFZ :_'\Fͫm9-"o~kVsŮ~JkaT+w>A|A'xMʉ8 0 ` L20soDޮ}S)LIc0yȣuu@YH Meg֯?N?X 1V`e F6iixϊ%򭧑E dC!&>O ؛MM !4ޱfz ַ<ztUeUVv?ef˖Wn~䣵w8S\r[5ڣҗ]?Z鏎<y_KZ֐J!G=oN7}PbےC q /sd~۶)d}>r];QuM!uzkqa˱7Qs˾䥄ؗXSj.+KkVk(H9C QnXgD6`tewYKկ{iV&_]nu-YTh[{:ǮCU׾`Iuժ>{sZuw!ehǖW\8JҦ-iڼ.:J3?[|r^YZBGE^,܁vOl/|_EOv`{⾵*/vv2*_q-&-P߽y*2%?uzBMf}ݰ[*ۜ&؄ȓ Y1|!g9ڮK+}3^V]ӝT~][y-Y7ZX&GvsRӑPdֱo'_4tzuퟷγ2 a3_]ӻϬ;Y.qWo_Z@6f[Wc:|LV]ѥHWxev~=Ƣ/9g0'zj   *r5&]mY9=:p՗\;v]";XϯsO;i˾"8>OmUUP_/yy#cUn I̲|2EW_fP/w7hZYx˻\{ FAEs[;XD^q({_[w@+KOgc~+ZG0R=2;HYg.<{݃(T$}Z?8zw?ùE,g~-}ZXyr|bt[٦ ] :"}Cљy*OxR ూ!Uu]ڏڪu'0& 3WVsmնQ!hʊ׸8YO8ڸc:3.˘B6_F3ӫY~@ېtu"&6//PP!?nyCKOA'%/.4ع5< he .,KxLOn A?\S5Rk"XOB4"%l,w/ӮɮK̇^ Ƃ3^ C\g֯%wZj]-#e鐏ԋF~8ZmLp ǯebMlŠ_\_ĎȕSE`p!pXɺ&!o?˻S0P BtԚUNUКN8! mB۴bM;}؟Zti+oX ԰:t}4pX%*SduOw!Dڱ `7wn dxxPMKWgV4>v/e,:Uֲr}pؑ\޵~WVӻ a/ge:ҕW_Na _J"Q^jɲsy\>o1U:HusXX>F>~(sgEo+?E(Zr;w?.?Z@iKy+7[(pЎ^p k] ɕegqZ,g?|EU8E ;PXvX?鿬;/z?zm ʡ+`?ax݈l[euz Y.%0Hw9y\ ;-0Ү/܋qC.E6ͽtz6*>{;w95lz?þu^%BAK׾+*#.Qk+!5Έ_*xIN#S!>ZΙ`'h*ʘS|Owϗ;u^cֿmjH;&Jd_!N]:@s"Du$ $'`G:~9!_emO j&{~Ο nIK6\_s`tAzOH~܀W*On~pxx/RbOZmnrNn؜ \0DEzCH vRYOTo!(d=E5zFv>gd:ﰅ:VÀ I#P kcۢ/-'BYxJ7-\uy ݺWy ҜZo(![,jiZrsyk.ž,AO2,0 p#z€Yo7zE:On:^;6_Q~kۋOӥ%ӗc$3 4Bls_d뗋,Ayﯼ|A(Mu G+Ь xvHX)| s{==.~- 79(dWC>}=3p{1"05*A$7ZqdKW6?EMFS>ŗBEG^99lh]ޮ?wګ|k?tVe-:B-b*)pRz$ /|u}~p<U޴FALl[$%ܨɜ 0:N|CDBz/A~Jtr{ C$ 9+HSqɅcXAFd໺RV62"I%Op@1][q.>?U*N3;.Wr]@}χ@@lA(KU|[ e7qb DL_UYR({.yԼul Xkm??7>ng˩۠*8CQ\C*O!@p̷q/]Ț 6 ) Fq 5I3Ir ÏPD|$XJ V|Wf7 iJ2AR=QE uPF"[ϟ-zl޹SF,&$:LZLiG V r l$G:ӗPzeԅoc2'| m@n^N%GOWG!<\|*dqYz~#ꓐLiN ;l3rrִ)@]O-_0˿G ҵ6Ȋi9(u>0c89F !Nnef|e.Ӣ;!Xuџ)߮vzu 2 C/'FJJ[1MLQcyo\-٨?¡Ы_|m,0( &Dyug>U̾Ndg>[-}{},_7'ID[UlxQZ}efRXfʪNV9 12:^߻˻\wU~ϘKUe,ɾg<’EǘOD.v W̨Љ(&>BϞ ɵu3?ы5l&~*??`{7tY.BݣdtlYk}EP_ h?2aNnb6\yC.e[p",$6a:)6nSZw{wyW:s6łsKEv_PK_8D-Yq?ޟ<7O] 0Đ71OxRD$Wh[)C~ݑj:> }Ԯ{p=_م_O.J$$uhA":k@ 8 v_ ;َ0xWw~/yel⑄+ǟ ]u9:ond;R[c H.ְBmaB, fا;CaϺHwj XGNiYWXK!Ւ58:Rf݉/xk҈kzh7֏/ae4 .R"|5ſdA(~^j ^'cGO9Н}^x.tr6 g0 A?)Z6gT˖_Ϩ9*5Q2)~>.)]G^}?Z+he_=m=[6g4^~y*X4a"XPG qhqS%+l/ i5~i ^s8Ny >IfS 4Lthݤv|چ[\P!Wt2~praT>5$YUnS"y?ާB~+&>.zgKmܦCHx2f&|ӖRC~OÅ/2dTL5ԍ_xh C%ɰKK eҟv  #KOt[4֒ #p_U^Uq?~#pN?w:ڹCH E;|x0XPҧO?ο? Y q\o^pV##~L`.bdϿ(hDZ 4ow7/DOZ Jkl@e@?z/|b!S۱+Xonl^rS)/3U?7TCh@ ,ʣkщ}71qtdi{$:/|jkrw:+`fo ^o0w^W͓9W7FΘSяh Yek2T)TQFQƇ_6UgzNY?H;i,)USbx@%@敻١V==H8 Gnv3" ?.i*lh\ڇowWy|-GCK9Qm QXa6q`/WUG]! Ȉp'tHGi?(>icՉ޶ANk:.^ vE=XϿ|R.B%URξj L!XX\'DH\g9݄) Be)@7whP__S@* QHIMxvf/e 1CG:*&8l`!]QPY;LGuoiwuȍM0 z}3q@hlqwF|AdH mC{'~^;˽ߘ+p])SEd4ĩ`>gN4{ f6NԈD'Z~}h@N]r) ߲z{z^wй)ZtV&L{H'=>N.kN:\󠕓łD?nЅuSW. ZK+D'HrUz4yg:;׀7/[huSײt[p`ާ.[~PNXI|'=ekޯ,RN!87:e dž4qQjuLCȓ@6c >x0/zJ?=$ :|lj>w'={&w/ܳ53=]`ֱqOGG@\k'FW `?:Ep0夋g;M;pfO?Ȁ0@ |Kg(#L(ޝRWYzRGpmkU̠#Jnvw!S)>W}da?_C[XE#-7S1'P |}ωN~2i9 AżG7B 4LFdk})w=[Oh0yoD wv(:'F _;: >|I Hw-$Ox_ٺ8#^̄=yjo'yW]M;\A+㮥u8! T>:aȝ@M܈}̡qOsU Ohً>|'l>ez z=3 $̛ 9p80]aM[Pq濸J[i/e\,h3i}ѵy(Hb !>-4f?O-.?28bp@6CWWzgY #VmUQ x5q>հ_X,cJIϭOL p]wL3nvL Z;N)΋ZWt^=,g{.mעSjx}>X!oWaDA[9WJ0_ԇ菖uaL䆡Y?Gt*}\x|@-׾ TʆIr! ^i Iw(PЅ,G\(؍*H3B(*?w3U-HhqSǫ^׳.ER}\]e ^W<$}cE 7a0}P[Og;/ BW۳OY Z/k'bIԹd,8lp`zћ_!p =yQE`p9@׀ղf36'؟? ];?-܋2PR,àӳY?e54?(~lܥ oZإYU/(=77DٽX/mEh6k ur~>rڞ #˧( LthEyz-xxyژS0Zo9䶗_pyߛ"J??Zqg _ So#ӹ\_tm;KAI`1퇜wq[aZ_v$f@_6"4Ң>P+@3C.w<XsnL^[2 lս{v˽e2%`\me~Hp 5kq| 'Ԃ)D~SO?:>"F:Y@?J88p^umhxy\[R?0 HoQ/at ґ WSڨ{ul]˂ :wpы )ZEws!w&ejm3y;zDBa ⟿O(Ddmj6KrPG3eE&lHHgyO_=v ϻֳKQ#[ &#LE(_  g\A:IzOtqOqUӴn;CCWi<}ߓB@b66EG:P=N؆] &7u!g/{fC kP#.@hGIP&X DE&':_8y'ʁdTLaYs;0@FzOBwF_OisF2;FŌt]\YXGlͧ߯yE L;?׳l{ .7gP$Oi\Ro!f ;fA(ɩԇj20'&8}r)}j=?+P8Y:^JqO/ pe^o>fq eM08,rm$Hq `/v"v`!9*NpEb=Cxǟ~?˻K1e=Po()pt=~gSw E>ڨH_;fO\f&"/V,;$S7Nu`<ϷB^3.ߺ 1y N(pytl_ ch!6vX딙дHGp"ZA 6:A@|^Pw?gQL h>P'8 4hi+/}h<>TW| ǂR{ ^lK3(.i|Pdٻvx0}-=ӭNT=C Vmݖm(@ zPEz]p>|d W"Q0v*M9Ls $P p^TAZ?ޥ/wKGyƲs|LϹ=&ݕԗt80d G**+odg-@Y99tRwm"H|J8xOӝ ,7/?f#L}t6Tc۷:-PZ"phx?OB [3u! !`~ AiMD0`>x[opW}Ֆ¹NXeKm.Cyiֿ|kWox$RzT>LrX;/B9%oaٌHJd.>uh^+ _LHC =4尚 /-Y_qE҆6Ho.@|L=v揄a"(ħWQ@W?y5-[ *):'e#=B@y@ B0_ʹaEi]4 ̇\O=+& ϓ8vp$X-t?A 'vst"8&Thkz4l0]rjN!0{zĈ$]֭$9hCsnUKvu߷m:40Zvb] A08;'7ϞvȠ!81+fPۋ{>d6(0.$萌+w]]^B?Y ,K_HSaNNů2'=DŬS"wv' qD #[:~_zrk?oTz.[uB!`jm{`g^m'7 goiٗ5vaTg ߒ\yQгn!{ՙuO41Ɲ;|m"9oFhyl#Ȁ/mA]LStDn9x?:W٧C{ـ?:(#}{W;п 4 +R,L@o}oރ|ʠ7!uCʅAKYD{oWLБc6cَSO*spt`;9(HYjvwl?O?gI=/>aQ~6Fwch)FoQ SS!Z_4oH˿4'<o2>*Gz q)£?.& ԟ<*W~Q?_DyYNj#I?~D f)w+~ޡ|#<0>9Iab@O^>rF)gZ~g2;nz]~D@b |$Y* =FլWU y8՟\f,9b6>xk|!ҿ I}u[Q.'x =c{?( Awnx|S[! R $74eLE k?֯@l|u6*ABY1}a>LTc>j[ԜA .sMUQ~!GX1x?Z_?<0e0>o3 79رCzoO>Yl4mA>-ݿsGǽ>.z}V?DP~NX,يgPV72bWT?.S0F8J?SO sBVZ,xTއ{S_vzkznfS&iQ"<ˑܞćlE&ss2{Ƣ貯pȓ -cOtLڐ}AYq;{9JӅBhٍM U;Q` }W.:$dC]*ks@z 0<ۺ)(j|a߳ ?f|wtDۃE{u¹ֽ+#g_*tC).9ru̇da}eoj}; =!<",o@8ORP¿S*r,gOe1-}C^J0ܮy-2EbC1̔`v0`;>aU3Rd۞eK 2!(0#iq^FJ'?csuj)[2 sYGVOc&3)|nDe""G]~w>╌3#ūM Z'L3Z'x ̞B;2Ƣ , _d-Izd'ݗ:= aʀTcݏ˂_o~4gke7{FW! _XC̙EN0]w)* VZP>6 DSMʋȘ,_˯_;P<FϴZ-&F XuQhZ䑜ZYHcM d~BmoBOGˑu{O?R&b<^|y\08qxf9I:m 18oŽH~B$'M>G2:?¼r~7rB°ic>_BwW=H8y ~XߜBE~fvۛ fb/R>a2{qO?d}ߠߪ) x1KWP,b_BCB0a &"iu=~1BF%q ~?\[o$yc427͊;=d4d)n.bӻ:tɾa+Mr(wZ? *1/͑o`ay ?eO?tz軛ܿ~O.zzNJjMJ `ų]"X\2J3 J3pW'GnW4^S;Q_` ;uVe$0־[P&2J%&;Q߬4\>oS'}W,{E<ߙ˧׻#szG;vto`to#EᔉM=uj[ϳQ죳,ݵ:A'V.hMO.y6A[ #)tޮ.77}'WwDŽ w+B6A&t;b_R3MCx z%)hgRaApoO^;O܃׽쌶w=}$Tw9Z0n-VcÍ͈{w*r!Hz׃pj.%( Z4 _?qIj['@m娷Dq;kndΘ {"'`Ƙ=~hU7& 7!Dcߍq,ń3y@\62qd@!y[ȷ۱ӅjwBѾ^sP>1_aGvEM{/J юS T+, Ƅ#?tW}s?%'ח'aK~ ߏ;B T9Y-- O3= Go!/[5p !„dSj r?00#)Kՠ(u@z1**dRv?ǧ0w{kݯg?"eiݹoQ[lK_K!H+y5MC77ω Eex@4W m\ W쯐m߃"?9PGY!Umɟ84lGY/8 E~uNK0yi4|yt L{7 IU!}JB/!O0oHI{1,\iA)uj1/xg3_R7~+}gӚeY){I=(_T_|+i&ßNr9Vm\a#=& B y p ^ۗe6h/f z3Q$A$*v" ň쿽?w++>4MNߗc/q9·o <lˑAtSa<38>̦+iwz{;ōv9:ҹ EK8Q?_q՟ W^)v4}Rve{2 lc}7 j}D?54:݇3,:#J7H^SHME+)Պ%.mi.,\m݉Z 8 w1'@#AQ!*+ey,ʃcW|;m{\pO3ᧉ(_ @<ŮrN?qO@ umgV $p|;iQ|)\EZsG_hmp`Yc.(xG'!I;/zxJw|܎+ܿhk|ݴi8.K_qЂD[/A@z] ;WO -C@̛s^M{Q8k"K8@LHaSW݋~d{q@DzkoIm@ͪ])ʣh 1@t2 >FBmI  zڹ\)kkvIϟ^<?+(k NB hUnЎfg=F/>r?nz*/>6z9b^E_\CMK?80(|ѝN}Ƈ nw\kcZ)_ŕQ Ott~s^|hۑ7_xo<# Sחͩ'BZ75?N+=^얣W&մν3-A7|P$rh'E@A+!CT"̟}>7X1oiOs_M+}ܬ<B,XvN -(AY FQ=|aF}C+Op3pc{4{40^teZ[Ѭ/g@nx8^dI, i6(z&܇9ChՉO݂ >EgO8}۷7bVB5Ze'AgY[Yöd5]1@>bj@'6mf$;^n;(¿:ĝ^ /!y.9CO} 92 Bu2|0'\f\!"LLijrt֘Q: U𷸬"y>!Ο k>z C"kv`0(m=́+{\2x}k(?diG (48yZ])a`(Ѫ}E9QV' tZ߀'Cxjɫg l Gj7NdX9PZ!<nF Og ^c³i3rm请bKZw`=Ns,UVGKPtNӹcR043G u72&oh0Gmì`3'6\O"!B ޑFϻ@j<} k>y翮@i/W}9ʗuQZ?$tc.6~g',ooL7}v1r^ *}ȀuqJY~["93bg_{|Z n_jy+t|/W(x\YR߷3 2_k8Gf2BZ;?@[/;% @=9,o2ѕr4&QLs'L!!hQ3ar[PH6on⪿N:1 =7g@ۍ sv'LC?9;ki[}}n_Ū_z` ߱ ׸kt?]Ή'<atDVwm?j=uݟZT:_7@!}=ď rDGڢ<]J| b|Wگf.j.wAu#l;<@0M/N~0ީг$2B]Eީp`eEv·P4hMc( |gr΁dm=JQISπ4*.5'.--K< >^HW|d#>dF)kf7sOeu|Q3Y #>Yw_gcS57Y L`"aZI'^h2 J-H |j֏e,sf\?پz DNz?s:rynP5G0&  ~g#[ #Gn2mfܧe`O Sqa>.+I& Ws#]a Mż\|'A*c-hkds4UjQ*2|Ef{+OLo v }ŕaJeA5ubn<[1%G]Jj|7Ͽ>B}#y: 0KȑȻƂ.ʸDT0]km@Mϒ0 z,a?uW0d/~7ݾjrAx$6%wx&.($YcGvRHt EU1r&޲,^c/w^dp ^Moo{㱟cCܷXn;ٿ[3|m"vևA1`g,ee_I@clCf4} M;~e_s9zAGn^ xl~qt-|\{Q6X3Śd OD^ mJ!x ]z%,C~u^b5꥗iW~w%7lP';f2Ab#L\n[ XP3զOT8Ʌyh4%S?hCo=?/\PõX 2P*Ƞ:NO`s![{ƫPnuoqZ$!`sgamЖ)+o)\1_MYMUb@8u 0m|5吇b<2Y{CR_h$3XR0'I;hG]@X1Sl>2IpS/O@L:^_]s秚~:|</aF"ZFvf2K 0v(Ľ#mToP_ PPB|9nU? 3/Eš!?xYM/a#   }CtvLz38@Pţ׻W ڵ7#藱HR0|)ʼ~~ӭύF&ջNu:Gcik֪,~V GZ\.;3RS'G , }mnEI+DZ=;>*oq+Gv"nb+[CAE Wl7xfBb2× q)FQPDK" c?*TQz|-1;`G: o_ mu.XAYmXjX=hlI͑Obҁ7Gfi) v? 3} ʇ1U~ )-8p(\E+P҇&K<7.6( c"l0/DnK9  ~NfFpBGnN$ Hg`!<d1OCa  3="x䳳Yl8F y]RO$|X,h(=03,0nD2ݢ;~Fa;w4<=b+klȇ:p|;JoH[FvS-sI1M<˝'aLʦW㴐I ¢'|ܔԁ:ԩ#Ǐ41efWll>US1kҋ7%--xjfraF{S\2c۾?ʯ'7ŋ ,zS_;4} b_^Ƶ<1`O=00a $3HIf|, J֐ `fv9>?i)ߞ4dw>x 9 a1(-e_"<04@)`w=eh )}pҎH*S'<zDGJ <-ii(G@fi{6C;.$QXښ'~/L^[dXVx ^dKO^6K( l``?W-uT7|Mx`cJVwtQn|p%/Tpèڒ-iKP!˅-~-ʬ%%?,2^ =ga 9z.vͶ`?Bz ~o&"OMv([xX8/KuXeWjo}v.GO_T6s?ՏۉR9Cbh6QP8O*>}$Dw羴d/AP1_T?xX",~gP 4 #_U;'\֯Y/&j+QF-?SiK]0'4N5B|]U7˰+bgF? Vkuq)$߃x;!AF"K9v6{*@0R@Z|(bؕ8cђ0*v'`/b2N 0ksS~ g%Y~Hy^u(7/uwY" :au࠳Z꤁K g|B_IJl+x4`cТW3Y&NC*9Tx' 2=O_[>Q$ޔe]/lQ/Ȳǧv7Znƪ zk'k/O<>Dm!hʼbX/.#UHEMhr Eq `0Nx4"΢0J>44 7t7߽y,WO|O\Ln3uĚMnFIӽmYUUئ@ \Ǘw^ЋXfs`w`Ho. dOI2X23kD7~J~^45";*? e,iz?{ʻ4F!&A`!"f<}=;J.\MUjD{U{L?pœg}}0Ӌw`빪rKT,g1_̿t8iN4 Aƚ^xа WHf9}͝>UtFÙ}5K?ݛz:.~>>C)W"7QlPUZ@Wc.Q.U'1 Zu7쉝j ͍l])9?~s_=O`w^<[Tk/@ԼnEu>Xd8/r9/ADGgEwǎ+xݵ'_ax-SVoэٗ?>8+!9| ?[zk0l'[,:_bȀ0YBZHҺU*$|aM@ 5-X?79}^$,&W/ԁIUnڏ<^O|.y@r oi^#wt~vy$6 hmxo҈^ݸ]k~Uro/ e:+.0 eݡ/Ÿq[Pe( S$ m6*E緡yڸ]jMátK8rn?WG6{ۻCb4DCS}G5VwLk.o]ԓ'W t:= /Oߺa0$Ѡg҉\;Nܡx%ǫJ׃wJ ^RJ\p-- ǃ7Zۻ><* I%8x_!>%W%j!#/NQ KъdylF~YEyvN4ayU)Bz"HQ>'t-4UAB8? qVG`2Q"@4GxuldъCLGhd d2N]gz?fxmcNTBn=AM߁*ݷEJL ^ޤf#(TF]lU+IVѠՀ/;4ŭv7#m*-ڎ}&zޑ (]S- c|( {0=`uc?,d{އ׏_mQC fxy0w'HF;4{xBS_hbd R<26 5n>=Vӄ]n7 o?+ d!erqtNnN˛0綮QG;<u  zJUޞfaNdqUR_5T2E•NyWos0eTw`8uӎ:ٞLS/CTšjVy/}^U{~`Uَ/UjiGq5itXk<,[`L8c,M.׍G Mp]<ƣp BQ`8$bņ  ; fPIPRGEc/JabQOmpߋS?ڞNLm{lhF:`foK ܉5l,CwPﴇ] %0j(xzy0Lӧt,},04q|'\5FHս$h6 LXR{ldQw s H:w~ǯ&C_Vф+#0Ŕ8&yO3Qm+u;:IviYj<x17';ZGk;cϬwf} sףYK@84@ xr4 G/׋q2q{2{ g> ^XPt|5 %km[YX%?7~Pu/k"y&T?O*nǖ?kwĊ^]f^h3YE=8Hv#qkZ6~X%[8^T};[l6 :^2vGq4{m"ke[͕xÛekw=OEu=.E 0ѓ-]!{T|.8v== zxs0bQyCjUƪ8$hv}_pp}Φm``,>:4Mo,v|"=a(<(nGm!pyr㞪D4⣱߱ǣЧ?`ɴh=uF$/W̳˗ ^|C"*EX!'g)*LK,…F:0ZQ(~96D8FbSeyI67X,SمPAs:ByZ] |\دPpj8w<_AP9d q] .be`M[bqU4ۍ;~hy{K 0NAIN2Vj  sVE#@aP߿rۿ lxL6^y\,F/FmP{ཽOeT}_zj(O|׊uj>FQr~ۓߟ]jT9RC&Yc[b`9kk?#Tk=xU-;+pr:j`sqs4Y7]PPl>Kd(AD+h. S7^$>q\I`U<>7շ?, (4&ώ0|W* Pz_~a.kDXS?4ͼvIj7iE:έ u]-l]AЍ źOabDBT^A~0w:%5߆d8}jA$0kD?(Ln±%wxnvRdꉍR>/c$IErЏ8^#Rg?m>n=~_].j`YW!Xl"2—C8Q:`մj٣4&26N1Zn9CتylP# $L$`ef#4WdߞvhI4ӳMJy{g|{`_sU:`3^<}w(  nvz1ۼPw/N648\ZG{;\܃J]4s; TX\35_gb'^AS(ojݩwyft! P8LLV0( Q<2(Dɺ_^]9$Ճ~Ѣ@cX>]ݫ@q{iϓpsty_3͞{2P{=,IQ ?P$Qhق;uUԦ{ ёO H|QRC7 J!(} ˗|s4$5Z֟GX3 g>JދA8jSt4=z 04%fn}{hλ(?LB(j bIs7v#1xR><,.aJōLL䴚tz|~G](y*?oٞ T`IQT7ܻ/}j2AծX vjUh&eD4?jq;O d}{eKn ; 6WX](WY& ,L^|Qk:k.g+_^:rmHrKq)^>vqN9`}/5J*7,80 E/⩠}Tʗ^Ҙm F"04@#(@ P, ^NoosWoaV29wGw.nMkXy<%* 'i{o-gAU1Nv=ƀ5-abEu)ye,w:%1n[LH\Epn[ @$*h5QnTSKkjtծ*Q[OX9lo^’%Ց5͓Ve!P5wH-cqoo-?gL@(?m fR%c oꙸkРamӜUO۹&! e'6ӤWƂhuqYMpn=%2j*5ۀ0j]4l΂**͝bzK9ja0ʂ*ռI*$0sj݅]<G (' zt זIHi3[?=ϡMK̿҄` 3SVJz 4xCYmwiTqY5|fq={(E*: 0_.iUмUPj^B&u^oG>xTȗ?=! B@D %@U3͟ L!8n﨓.7 l¯D9:Oiz/&v)V`8n_3A@1h\sT?4L~' }`堳9O޴=vQckMa<I#USh3-9_;5:.vU8IQȈl=~Ӵ"Mlպ9}lEW5P/`cy֐N2g3|r0K&]S׵b΂5!U% "޹3e8_5騵`18FKXVԞpYR;e[gi}a15*080;Am/5z~{h (ldGA)Vfj: :~s- GcvxB"& y RaڞRB@%ev@=(>(x)U>6Kt5o -R@j~8cfT$2 U@T[}݋$}ѹz8hu[JT!0\H䧩շ _x˭PyPVQڊ4ޝoJ@oם^ն{`mԚ͖GΚ4n$8cSoWPmo=?Kf'tF=BiY.=l+gddTji ŝJl+RxeѦW وQ͛V?:Rmˌ m]E 7DXV1`g*X?L%ӁW*Iyõ2 b&|vr3K;`@ppeNA:>q /+J>Sy5Qrqw斬vzw&PjWk5eTR թaiLp" UGdT"fH{/+u(|`U4r˅PF/2cd>nܞɁ6Y[u\w\9Om5z|"7 UdjY1l7QRr?Y,"|Dak̾3!ըh Yl7S3{5w%v+GM=HVFAp3 .ә}S82i+<|BWf:Y֑ F 2ܠsxض݈3_oFxsoqeˎ1T_Lw:6L5F*]`L8>OnBR#eԛwZbEH8=nzriGW}< P]!\28s4mKٸ Rɭ]o acɡ"Jm+繍 uk52 a=@fr{)%ePdA53pr 7m\M. -=ijA"\DDh{Ӟx3bTa6X1bU,{|Q씠kH,QiVVI]ɠ Q "i>vHGVK)oc֪(13VzAp=b9^vx7Ev8e= ="Y{\[v9\l_ &ܮ펤u CWS%M7+]@#wf͙"R͂m1}NB3laI{vGV-De)6 ^6,^Br373Gl`^:+TR@!>W<;Ӫ*,pUs`MKXc986E=7ë ae eۃu]QQN9ä$"+4O9,#i6OYC/$ÃmA(Ą"DemN/ɋIuTCӏa&@ FO9 ׮j )询F+Gceue$G6͛5[~Ds7-%4qUSdeu YL<2&Fp{e]U8R'cmهfP+Ď/oW9Kֳ?Bû7/*d5;zw]G0\%[ĭ*RW!"Fᱦ3o 6S% ]yi7*ZUƖ*>*ܗL^K֎ёHPA{hvŋ[H-AeI &suYxmTぷ%HvH_׋WL&n^,8S7άs8-` ]"B|Z#hCq\f(䰍,D;XyFI!xv7 }GȩVFFOxt}VF:n 4sƪHBAiwh,IqMkda"k 4*P4! eѤW"b}AC;$l }/bWB.m7z(mY22գ)s|9-eɟgQ٢Mz>W 7Vhzn>A#}5!@{QVjT&(Fe oM_6*(C; hLl*m"{?5ob,l@xf ITncH;|mK߿70u"W8KXJC`Ky|' Qm[/8hH?h=l12 zdBoԾI~"(STc؟sgX& % IUQOro鮘H8鸇\_/,&5p@$2 YPLa2xdbJ[MQ Z*vF=#Qۀ8?݃HCG$)~vY**4z!ܚHnݾ{{KuA;{Hf6rmV>jTAL Z̆!L=۟ ԋ VX3Ly=!ISH'/0kp b]Į$9*Tr@'q>x.z=dDCSRQT䥤[kpWGbvW{~PEX'ALXx52ݻN5Ownf]p0ln,E@w gŕq8Jcyy<"}e0bwBU)S,Vk嫵UA-2W+ ~' Z]_Ƴ{RC܈t/Xi_Q9apQz?2 0jbzkOZanjK=pzTJ? Ѥ;x1O6Qaܭ⛺-!L[1$7*쌬,˂$W,a =1M0#>}3iPh^!dUwK^5[~iiK7{(ΗIgP›{!$vb"&ե4B q JYlk-/~s5wt=/[ ky7kH.p:65+9IGS ϓj/ 0 ߛ,.4P;׺/QmSihϖdsd((iC/^ f-G:INEC@nlPe8ҽGәSpgi+On z:ǻD}|d2V%#TA}?]Avh.xcHDZUER;]8Y6*R͏w po8=vWsne191fN؍L7g닞dLOd%'w)^R7Hx41]nb$rwX)}I0g ~ ӄ8=Kwof-f %Xk2u,Z2xn 7};7^Ie+޾?]+lA%XX"X}yA|gӅ ҂ؽ^'HO?|u{Z$w`\is,7^ꓣ=m,n HAhɬY] kŊr.j>خ3"_?4Q? ڕ^u?fʴf@Ee89]; ﹶ # 2 x$}N;GP]`㗩U 4\j A zV[xvAkLoo_۶I*րv]Vi]5Yvu.0d~">i+$0Sd_$6Ap)bK΁xcz^OK[ᄍ^+n D;v:-\["'Q #ɥu-3abSG~+nIҸ*fe Jc.3<~ ?/i)94- `R2S!,fwR-9h͓ ӹrڂmvrLI}uR h9" |Q6?[>'ׇÃ/oJѓhrA%Ftn Y$hwYכ(_|v+٢"Qn%`90$5Šu.!Y0eCWS[)ђ=lSBeOm >U>ȧ#u B;B2tczu}t9=;RF>T4H#<nl={~[/|vZK(*͟F?fWj@6>-)_ */ڤyLb*;__:j,"g(KeUQ'JƸ c-\-\Ođ TD6٧H:+Y.h@* tW D(&vvo-SEggjcfr}u:&S٘[?M o~u˓n Zvä睝]߂/ j@qucEzi&6X*M=ŤP8fiARh3j pkpH"PaGا{fc)</^+ol3w3H=2'Q5`Id?G/ŰmX5 VH9`}ԃznf 7;铋1чhoGyfk-Àomr>7R>gڌrgPDr>dJjsv2Q(fv:=4׹W5Rf]ZLQfmQ/%2&hJ}̙87m~396ݎV,-nf6UOl]; %!6qgkRT=ƸS-dKSnrd%'#bYENTRBX5TTF }[ RtEqO(Wxfs3gTJAu)u,+4;#m7 7^e/ UKzq]fvnX#ڮ@-< "(>O19S|lG)[n溑!f/]ue:;QlYί4;&ޝ_}xo7£!y8!#dc ^`,\m5:?3v2F371vP.n=VD(_qS+b/]%VWjs<$Q0;rMezSوiu`z"15FLYgZL~w:[Wsiyb.͔qcş~].ʼn_-( IՋ D{~xB1^'z?u.uoM\t"5a7=:AYh|^oDudz+hkWfM`EXÕzK3!b /A96YGTVNڥXP,u>yB}׹uj%+ѾD|麞h_&o?|p*0KͿ⣈Q K7գ;e5S*P{3HQ)+군IJiJ[kl&Y#$L0 qh0j7;]Y3/AH^Q~ S =f1+?6Dsj@Tlae*hJkQ(^h *+f;n֎ gCNa.dS#}7)([ jEXڇ߽;iUKvC+_\}A倳2:KѮQ(:=MS[_L6wiԝ"!EuV]yX8 .(av`Yjl fq5P|WܒyaѭdcJ[NJRy+YV(u܉OR̖Fr"K5z}5'٥nrp]"Q!* f]|җLΰWV(yQ UYzMCPjl=z=̀[[X >L`ؤχ AD.4Ti%3-=g iaSN%2>:EF ?6 ;/zja@%*=J^Ma'*edu*9l4ߝs^.ӈg*njv)$vF?󎄞&㓼N焩(Z4H]?;jV%t(/3uo~{O\䁭̓da! fSZsfj14qBMT^bhڏKKI"g#it.awl k^AuĬlfjIXbAf.zwǥ?0D Ӿ(lOU2 TWT1 d뷿VB2>!LWz2Ԁ=cY-˲oK&Γ^Lwb(hʽXdm]-WVsaЈg9LtϢLoeJ8MB΂f)T "T$[b:k~f}z^^][y%8aGzܠ_yLr nn\Ngذ9vr8>~ NTv"Z*upTm̢aYZМh Fހ^IJ38 q MEM9$ ŜA1j RQhiKB==Pŝz-W'޽}˫dw^whѪ1|۱ !̪kS_}]Lח2n.c~qkeECVtjx(\ט\A.ګ@jĊ"!!Ѩa=W?d)7!q,us"Azx=ifޖHL#2`$)]'@"K'vU_BlGHB0ʃ{0M%GqĮbKwimwtC{#Y-Fu4PJ \9sLƏ(AnC]r[ n(^gW4t慧2S^'+`KN:@j~a8{pbTdK_`UQ1+oj.{ )"יɈzK6y3eZ4oATW .GY h//,~o!Fϭwx 6󡭦n%ģx<o=0f}HVR2x3: =M&ٝ}}HNbDZIj}ۈp48?gx$1Cr'Ηa?q-U(}"yWI*>TKցmuϚMX]v1 `9vq?xMD=TXb:c@t$>vy}d6`\(|d9dNZr{rhu)ŽXdY3^B@3q AXZ2SIrp< .i63qLA玚t2HcJGgߞj^?N @~9iڨ1)K![czؚ!>za?>WixCZ ocӽ(ȭ80' s=%Ecőd&'!!'}TwCD;:x'`ݵnCSYvh)/ VʇsqGpNOP3 *^Q]Qi+V'm !m X}"OYeD^=)HÀ~r+23F?S-ej\?SJG{nؠӭ4=bcr-Sg×j鳼8=hF#^"=Dԗ~`$c~2x1lrYW||p};kG=V,~tP =B`̱3Չ`i` cx {w򿿭ѓbTC/ t.y- E3AI.=]]NHd!D淟cT@52A`kv+J9o^zåoS?}3%{(#gvU 5 z$?ר<>[1ǮLn`ˍ2>;ru{nU&>dA( ouqFC]wni3Uʸ 帬K_LB91:щãU)e46~>E:B0'$̡^!;ֻ]e%њ?:d>x_\vL]F0Ro;IՃI87ߍv܏P,ZLrO9©7{wϮf p|sSxyw\tѬ<q1R¦fkau\=?;/DYŕ0ܯӓ&R˕gZo0E6g9fmu8^d1X>52b&X_^<T*?}Ự3˛l0(hrQr1 sh9,Ǿ*m/Ƅ(49~;O]w6]óF hu-=ʔ.y-\gJya$l_1n =QoPQQHĸV?'crW4"Q wer [h8Ovt#wZ`.O=?}%d{ 2W{M$\pԟM-E}Q'>7W|S#kط 0ӊW_lջCPAhbeantZe9h5*F +Bǰ*Iߋtx!ʃh9] YCZ9ij̧}Z+vK%E'>@0!ñG YD}) fZLq;X"u~ Z8>K41K1^M_ʔiӛWW.'}=4w2Vs;㬓iN$fvٖ}2^ / z΢t&~DF5T+D2L#RG-'ҥȒ5O irj!ɾ[kLRV0@|f Qűu{MC$VQVA #fT-!a8RnNvJH :T-06:C;!gyͬ]00jl4:}՗mR\)QH?y^OֳQ F{x{_`C؜F1ߕL4r)vu{mD!*8C?1ZMW/O~dzg;vUY┒GwF/zb~uC$Q rMJ#F^, v`Nw82A!d(`=&Suhvvװp*(ۏ1U~_~ѓMmsBF `;1+)NzkF7"(ኢcFZهYM1qH QƬͫo@XWW@/˥VE8t%O_X/֎ lv0a[Q03撅McQt!Ժ"OѮ*QNsi4={{nS߹95BlzOS+K?E8u!u{ϠPT0A_%@~=e"nyqj&tX>c??Mk 89:l0v3CMn56x{hjH(l_^ t#a<TmYu@П$A J J}'>xGd؎a%!󛀨 9&ܝƝ+Ū u=Cx- ]=G-ny"wGB}hwsmR>KYpj-'$W97b@vQ:ИFab;f"M5\*9À(&]\}!'P JZ$./k{x~/W)k#r(F@ P$勰~YM; 58-h:5ke7Vk8vtJpN~}OLm-](| 촇_fUC\ eCH9Jn"dGfnv9COn*\C۪#fH`7T 9]pk6$[ ӝLFI_ 9SB66} 8;7o|sBP4Si &yK_>==}dk¶+#{5DZvD޼{w=<vj\b\C}sT`zv  [](R7C۴ w>cA' jm{`?Ǜ^:W}#@f'7I{C;J,7jўyWu??{vZ zn$|WDgu~hW쭆Zp<h5,+,ƖLb ؝|q=2@3Ɔ1- G`򅀉pÍLD\kz܅!b7>iIV a۔e82/yb:/l=ɭYduzbЬG>9t_}˃Yq>WY1ai`Ε~V@h28w@e4W ewۨ`Oh^o~ջ] 'eh,?S/HRi#SSȶǂX BtsyRm!8S1;,pE,S7G'A||zS_B,݇j/|oȶA8ޝ>hHB;=Qz(@JQ_a:﷗-_6GX=}ބ׿59y_?Uqu NΉa\n&g^h;\eY͠؆51 F .FSESy8n gscjUR L~s~! jB] ۟5Kj}Itj4MK'l~+~q$zK5/^= p?8L߯ӟbc"K#HnerH ] W-4YGnN#wyk{j>/)=鯅&5sڠs#;ͩj`'ӸhYw_;O3hŪj߾k(_Tf@Ҁ C U~PB Uy0}* no kj4L]lQŤ}|&POQ~a2/o8h`qH-a.[P>#Q#Z bô㌬aUgYIN>BxHcP{'YaQ҉c1\`^mZmCXAv! ѱ\pl;YSD*{P0FjّN<- [2χ,0"P dYu5xɏ?c}'ki#xI#>AsG~|`:ײiW:i_~ud^\3])2 *Cf6PjHNݐDj %# Rj t},wzHh?٦Z0bdiI0_v(~-ǯ>6:C泅``TI˟߿~W6Aqn?-T~aճSZ1]L -ɍw]#:k;jkm֓qzxi͙;`[ܾT&2   `: ^{Ipٶa14@l MQꩡ JSrlQ1lђX[l=7sٸ=6oxۋ(N7=S۟w֟]IM6ŗ:aUP17Q2{t> ucӿ]ZG!%DD@Ǫ5NqWb5#!f $MB9\ +ev03ߝA qqYKe uS;w }3no.Ā3VG2(-:Юx6JbnqAu,xk4e*rBd8N _Ecw~ȡ9PoH 4Q=lVby45sJhA3]Ne>$hqQ5@Gۼ a+RT4𛱴(Z$V~fn&d$;.UR.r{I67:j ,Q=n"Ѐ29"tKZghɉo~7_s? t ޿?Z^;8qC$4®fG uDhsO SD>mf Vn{T b*8~9Rb\YIh92C˂Mj BP0{( */.3 RB @^x ("""1DL! ! IH- NKvٝg={~p}'?_a顐}`Q؝fu~{oyi^ٖ XW'iC9l6ji"K F@t5krtT@/دIZ%@ JOyTt Y}CkKIR P>}szpOM =~JLnҮy>:8"uQ+*Z?6ٟDWxTy⎔e% z'vC-Վ+G,PlX.GdM7cD6{XQT%ڔCNîZj0? K& 7+O&_]  J_~}"(ʹDicw!ATaRTÒ$ftqtQyΎF sUu>XXy1 A2v"$bf5:XXVr(g.gyNUX3!&jN#1J-u9a͂k53C=M:^D~_ 8}ZNoAj6GB ddhKS.;ƀy9,ۙuX N)BOi(ЫBkb !t$I-F.a*>G["CnOP^ez)R,95 ,0'@ g5lng#cր+`+#)n+bxxܐ;]$aT.ϒn8Z_o޼JqE\^[wc9['qUYΉ V"dwr$gilFw\^ mt漗E(hW$&_X dc2T͢1_z{|lA _Oh`3h[bݞMxfuHx'UȚqW?5fb^*u%X\a#wZWkV~{3g/o/EN gd~f7Dbq3<ųKwrAwPP-cX[̆u] Up#tžo:#9W*l:ecm'òwn1ra쓢 V;vH:Q>.Ma)-y\l_j/|\qF.L=V4RӇ}uc?zHTm>*, v>,ͺ 䓆 z?/F `iSZ{#~{BWS8TX\i<fU%.aItl7YoT%Ԫw>g1y d/A>-] ^PGsȦzN_'j!! C5[ P1Od>h~qzqv2L<Օma޾)n b{ лD}ʅ5t\ ~Kv_3$](y [}|`K/4H錋|P.~{u4XQ3A7=ϜRa7MՁAө~ڨ@E %óp1[UcJ K܂Tۊ#S]eQ?L$[557z//Yjo2m'ͣSZ,n5+HE*s.l26~0]t  /|xs D Po̜RMRty2V=\ [eyF;1qTֳmo9 ej53G #/LY`dKS$4+Ë0?k.֋{.&6be۽y΋pbh_uv/XS]cgj|a:ޝNy}5>-dw<-x?S9El#=UY+iM{̊7 YVW:q;aNax˚$1zJ0k`AAZJ~'cp_%Q\3 b+7z;W x6?iw8i lɓ/k,In/jvIgf*MVJpΨm3{8ˢ+j˛V4?:\T\Ds؎RFqQ f68.'^,6)W:d~Wi279>{Hvu:65w4 4ŭ8T(,M+EV5N}4Zg'=SrWt*Iw*I-.yVher# m;\\U2p;,0YDY,ޔn[ ,_7]F{EK.@8 }_'|. scf9@`+YU|6-Idg=R$sb|'Q̇IAd2NbFNZ&OrQiԷ{Zٶ~3ng/`.?Ǎ^oqu-!Hϳ ZIA]h xW8z;cV/ qUO<   D&b42 (ΝF/1TWmZ}Ȏ씂BhÏtE,׿n޴f>g t0TBX, $ĉV1n'꽽'恹@'ۋ=w:|V/Znrf7l6Kn(aڥJ\2WKK|{xXQEEbJ0 ή qԒSPcο;[ʞ׃/2LݎF m"qf(HY5zc`tw?tLz ֒l{R* "_&Qdh \ljN3"=;7PpϳVkشԌnR^xŠChhۇoޝ,iV;qrׯ ``yBG !RpaƴGYe %{S` [ɱQi_iW-bv-WtWN$a5p6lu,aLnȡ[o{MJs^-.\(`Tvwr9-zWwwJ3ZB,5ս]HfU1`5{z{I0<ȸGt<&D _b$(L@0`U3!d~8ݶVqh ۉGvz*dEhQvd@EBһ}x{c1 A%n/@!om6Mjn5L.xؠg|+VWwn9%&7CSqVq5L Gp15A7.ΖUOϟ"ldr*輂xX!b<#J䉂9\">ŭN4:\=~,t $);WPw1 Y0E)?6V%-2ڨJ`XyuTf(OR)ǸȄong/(]Y wBґc7p sxz7 no\rxtd݈O{r~DE :yP@ KeD|keC >S.}Nb9 *"UƠ*Oa~C@eZDi^\_rP GˎW`2NK]Y=<\.@YIAXkg+ X u'vzypkҾ>>z,vo_E*%:O%k?ÇXE`fl;k>I]>xa7ڒDz/f fqHhn9{ cEU԰c Ea7T[g !SPY7Dye.xr֕ëooNh{m~o x~|3vy;p鉃wlg,Y"__.>>_Cjl $a\~,F3NEX \r.+.lx:]oۛˆ3|5ٌE*M?m+ͲDǂ&${Å(%zP'5|p ϶NN_4Dxہ48w|_O l~vxw[٨Q&7L# e~8'pܛ* ŢR{>iJgvIlfuƶ}7PPY>:S;xQ gAmsQF5h´=wn2y~qtcdFUr_L˭ *BLƳUIXO$Jpxy~JpgGs((\?;毿~y,hۥ+}Ap2̿zmGWp=ۺ*8A͓"m eʘF#$[Jex2T6]%F$bPY-yuNb3o篏%DZq̗GS_HRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT Mp-x$]hp0Cii)4B01]t nt n!!!B#!166&oIڦifNLӝ3syݳen$M}y#;TAYT&pP痿v4wg|qAxҠT6o8ZQΧ۷?ےz/q6M"F-RJ FbzQZrSЬ]yZuθc_@EQ9^S՘Ikd|7{}۩xEd ( (Y5B{tzK4=|*Pl C/x:'6spjk'ٓp?k!49Bb\xV3ryXi׉YV) DS!BJ̰DXIS$sxƤn0&c*+%jW"E#&L$\yzo<wW姥]!;.s~q( Wfk 'NT+G׋07- Qyd㩴;;+RMaDqRAHquY/v~1NZ&qiy,a ; dYL,]E_/ q0 "G p;T6$U-dΖs_tA vȫ{.3IkjVLrP(ݯΩBjH>VaiɭvGhVgGWWEhzy vSi8uVR^/5'{~Sù PrV&5YJ?cD0ݵ:a=)0EPEL]pBdd0b:b,I)t~(N%"iMdIT)ILm>^TJZ/6!>~X$LNۇx&,GK\p} D2ݣeƀ7jwĶɓJ@wN](Dd(Is:vI#:ܣVf$ XV$( ߝKC|H%p&(~.$is/FDHS'`qi=ظ|E uȇޘhF\+X F pf J.=x~zQmBU~ Gi(ŗm4وQۺ-ʵ3,g9(6ׇagZ݁ɦ(0fhR{?KeqBJ4wE?-,]r8h 0~6)On˟^^t7K2ׇGaŭGk~<^Km3Evk\+ ]o'(IѦ}w_4 |Ef*JҤk:(B ; X shܦU٭úXeGNzy;; X,߅^i2O?pSz0oLyM>ġB3UdKGO0Bؚm!_ +J3oB8:xB|[D !ʼwĂ( `#솎`ХHWrN6@3*r*:p۸ܭ/Ir3WR-!=_|m1%_}g04u)z1:ɵnTNJ"HzT_???hM9΢Sl7ݼ_ >en4.rb\ a# h*s!8)O 퉢]dENXk,> ")-q B`3Y&j kƖMJfÌ,Y/k煾pIJnw#?Aoa]eؔ^JS$W^U 7T!V׳w*!NwU4Y1V:zzCJhޮZm BZ͗|TN }:(3N{76 JYMX)n Fߦf*N6DbS6b STr :PD]l}8OC3xY(X/,5es͍vyn^IBzgR?Dd"M…(jF(Y \GZV{4~p9++Ja2:N[D&:(S58hU)6-NyUQAԢ% )@@qJXppHlc3WrvISZzwc:FXS?]Zs$nd ͷShxoͲ4LOET,r5n^D<Uni"V*>_Z5w]=cm I(8a̶m9c$'CNtg>k#j,/2 4`2'h2ڎfA-I"j{4+A9_4'W4aMb_.G]iK?Z(*U>ҷV~xBJ%D2veXhsVbP\JYp`;"$DM7,>H1*  !2N@b@-Ŝ`ʣ'?J:ZTb Mu4?ؠhp{IN4|@@ y!d8j1ED2)?|te;jk\ԇBeݪtaTl+*RD2pDؚ޻BQp/i9,Aޠo}Ak8{(:8B2q͑rJMǪ;9:hI@B60YMlFܜv^kI#2 1؟ EwҴ f W9A Q4 _suV_0}u.*.Ot1ТӊJfNd1lRF$HJ7ߧ9x*I3Yd&$dY#lt V/&y]WEߏ&XnQWQ͐EȌ#kdDiU(NZ/i$Jn[laY7 =!p\{g\pwFk4śe\ vP#//l^Nxy"ز[Xق (:0Q˟||0tʧ9ИZp,'xq7S`6DRr+V @ڊdU^D 0|Yˋ4 4Lq >!{<u{aklR;/kfJݜhFpSʣU~]P9>ȼ-u sq߆DcP.]++bgz@eƛv@Ukśo_Ai1AWYeZ.KJCW׫ 9V_mjY`h,s"HJ]BjuۧoGaS4$dR^ːBS,#!5UHӵ<-0\cv',*n:'"B2?tIx8ɦ03{>y zs-PqazgTnL QEQѝ3HL4ֿGKq?gr qRy "odPHbJ^^Ngc$VvTl=y`VTKEr:dD"2Yn'}Rrn cL8sod w,ã[QI'2J2N+ݵ*N?}^P^2JH +&_!+l,KC1l{[^r%ejD{Ӹ-fH*F LZ5+xJ,nϏyrurled\͂L_] I}_+o` +$1*ڲ I6vX Oѕ?P$`9%a"j!yN,plP784XrDe9txdVs@_A9o&J=b2H1WJ lPV i6$WeA&YV *@?E;Z uy5nɪj?o~c-)Nf PC3zZQeʂI$d)QIȕ9y'$e j ʮ,>Z;,:sX鶝X|{r6-G9gr#WC::k,$^$E5#19!5Z" f#EI(Au&SE5ۏjE݊ΣTgmw6D3F@߂BUdF1Od CeS%NbUDVf,^q47i8Z(USҥĢSK 3t0_t?{x$虳˄U[Q,|qR Һ,keҗvuD S  P@M4h *W֖I9̴9%7=¼_*ׇe͔~Mv; R۫D|o*p;߿YAZFn%Ae~oPi+ZZ+$GS6&"6|_Gn|ouR+E:M}*hZjo:xrEl5*|H^o|kȰI h@DpI:P",TkrDZ|$YSU)&LDZUwuIЙٱ891拻HY=f%J6k? Ha"BA߅f|1dUCj= eV1*i'iuJY g1&~L׊TD4AB@˵۳BNd|Y>1XR.(oO; J3 i. u5hxmo~urOCN>~BzhvLW~lJ[E ɨYồ/D:lk)7 #BR,d6\?Cƪu~"մG$"[0gQ:ەxrfRJ˓g^ U-Q JID(+K>dt#,ţiHDפ| 48- r+Bp2c?{]t3,XsuWywӒ?=hUşXSWRxS[M85lm`&x Āt J>16hw‘VMR-qN$enUkaKQV $|z5n?43҆K!"d4+7*?V8J}/ |kKɄڼ0djQgFz{z!ӽvXuw0 Ud: lu\#'՜9;9 ٬LlKYz Nom=DC%4ȁhD%7M}wGY;ur{:4OenVn6 P]n 봋LIR3R 2@8ZXyO:4q/b[7__D%՘2Z7Et YLBƳ*^VW~Y$h tQ1_k\' %RKX.aF|7yᡘmgG]NE}m kJǷS3ƽo403TugfVn` 9 c2/:pCypfi @ųvt|7꣛vm,N|'bH/&=-z+(DLDvN%p"~ZT (rgUO+Sӫ )Tȭ\aIlG:7(ܗ`6i(Է284JHs<v/ _X0MK'?\?ڴq=OtEl[O:?"(H}nQ,S(F@HN  M7z]:5f=f\UU?4瞮; EywK՘|gU Uu+++ KX% +-gKٸ۰h%9x4WYNVc[tlKkSEPa}Ӊ$]Z<Rwo+@ A~K9 BIϫ FΧzV%։_ucXP잞2r " &'_,sO~%ЍCwzٍnN|4eE8f" ;O{{(%rT{vq֬)AyxXQbTEBۿYIb#@ocz+;޴Z k ѹ YB#&1F3Oq2;g,^q.0kS#<_9CQ%[ݘܭ?ã2{7P,p(vOvNݫѳkj`v&v$ŋ<}. ,r(2m%4VZP(96o+DŽ; DJ43znw-S=aDk&fsrEMp=v#;]DB!/.b)~%/&4胳OJoA<:]M/?dro%soJ8F v]?eVB7(D'Ҕ AԲD '9vrN @o!%FOʶpQ[V7M&Mf 5o~l%`Lv6pyHrT,vp WEj_UGnX9]h]u=jhcބ1#㐯KcWż,U>\}쯘o~77l7? 5Վ3N2`>o2vœO>=_& R"E0 8ùoQ7DePh-5*GLcM- }/K 45y[QN:=|x'&+Rm&׼dU%7,!ȃQ4kfh͒Q?|9$@thWV BLu׳ZCH(ӊ:a tq, ?R ͕X HLG&V>pzA5Nΐ UUҝ ?}-deK͠mWvv/'-e{O1㤤2 7-˕iB}}kE0 Y :.ړY^gW/.~ \-"-PvoOQP5O;.|Xl I&Ew⫕uT#,kv&ӣju(cok1PT4ǃRVPk杅_6%'b*^I'&)~OӍT:hU[+V7Zڔqi 9oh'g۳NJJPXpTv@PJvDQ50lAՊ$rt-uǹJ#BևJN؃U@C'A҄5Y]>_o.{i_BVbI8"Rʩ,~IȦ>M] $Kd5 Wɷ Ų{zey9g *s-V[5|pN&Lam)py#e1j>-+em{>ӴneGxς27˩ :(j* [MJ!`geU"s\GkDBJ[1"iHdJ*ॻ/ްw>|~eZf=T;JYv\k{~-oN ~q}K FK nG$l4SH%}` dyRok%wTZÊ}žFkw{^b-QNl"X`wZf x.ѹWc}TtoغQn.g^oY|G0=$Y8;lpI~{wDq^ jzh':y~~]lope:di6R7>Iԯ b PZbox9!z*qܰOgd*9!Z5 Ѣӕيnf7!U #IdWC6Z ˈ2;e9U <K{'g]ܣ)#*NO oo~O t$=l=91yt8/\-UI0b9N)l0ȮPnZ0tQ(dAg͕ǺC#^ ͵TKꛕh6)~S{j8ʝ/4JI4L/kSʉu_.nWR Lk8\=&謌[#NYYƘ._YBhK傲SauZչSJ8Qt`_޽+.B]iيLXg !P GpP8+Nj+ņNUۍb*!Q˛Vz[#ye}EXe[vme7f1!uBlWj>:+o $;:d `lBo'@g5Hp$@BeCX?@Xx 6 +ɘXkfU{V0OGxBZ!(gϳST (Y=n&13IV'{\ACZZh3[̬sǧMHP*R;v=WwG{`臧Qkq!&tlx!Uy/闺 4[("ŸDzHIn^Cp0]EG$mbi1if0(iDb4ڪ 4bIiIL8ƷzhrS\f\tDP(_  $b-*ruJA鄏+ϯ2on>^M.F(#Hv %4(n{-,*,w(ݬ.dTv^^%8 |Pgw˞5) ᒍN((ECAJC<%KCQ2= )n޸E-ۭ2~/>m FNXt]Cxzzxr@˵tJݖcgZԓA5?K友YoqpqZt}uxnYvӶ^v7r=d/v02d5YFL,u={({~}Rh̞98J‚mW+#L8ϛ`A2ZE6wXݠrYu76 l}Dqи zM*쁔m%%p\rMx*m Lr{KM mA92~9$*5LO^UPt0gNiJg-aL:@P{~UK?=] = )q:/] l,p "ez*%!wzBZu4Lul WP;7fQZ-h2P!f*)̤-eMD&Zqޭͯ['f/IӦ;JޫѕhyzӃ#^* Sh-]uH\}s=`fwtVGKMIcZfYFnDZHYV&sz_zQc%fm.QFesk(3A9{‘4ǗRȀzk& 1IQ=-9Z}e~&{yFUYNQ}o;FȝWp;AB\Pɇu;*%Hm*+$X9 @4N JΣ]fht'JR4RYSq9o2)*k#h8(Ya‡(W5't􊛏{Zմf#5waЎzaoQR$/\#Wt|+E&pˬK&b~Wz.ӝ~_|dD"dQ#K,<&*a!00|5Oҏ& 9^!1X\ˑi㇒N~۪RVlSbo0{w^+Syĺ l-иhz5C~Y \88ݟTI*F&Ś9hJh3_ZMd+^v +h7pCs.@9N%0x2ˬA!_YnW$TX$yFF_0QK+GWOgE8& W⾹|؂@'6 ۋ+?vR'-ls=IFK*p$4Jf$\\&}`-O|ߒ5-?$'R1?},'~& 9|Z/ KѮ%0Vyjñ:i-EWui,xN"2'"%Cw5[G9QH¸Q jo`A'x|;7Jʝ\R 駙.g˲鮛y#u^kВ`':߁u}1Yj02 oDM6|=MCr2Ndk:]pEuO,OHwיh֗w_WV͞xdeC}o<3'T& 봱?WAa ԅ5᥵ѝ:NܱQ}ȺZ̿]5=9jdXо4|3&OAO0a|n;q2KQeZ@CcJteSe5t5zgtዕoR·tv%&9Q?*Xb* 'x$vxhZ@)@lQGZ~0hųA6k.4hi !cx!B 6Zh!F !B!Ycdcmmll lJU]}9=gg^eެAu[u3 $ٚU],/Ê!" |pssd$J%H#)H폶 3vX,8 EU5 ճU#AIE2CVJNjϝwnRWrwײ.u:lj餓O۳_XX #+sx8~9\R*5 %Cn sdhh+y!$\.7wA% uZ- t^q`g'g[:Ȕ@N~akanF[ D(%n q0J8[$֌i|Nf 4Bc p`V)ͯӗmnl.BJXMI0D߈nSܿ1fqYbqGu?h5Z#ʙ$YX#'qw`G!g|vӧ? /k*-qxfHIezVQ3,g/ƗGF&5g,q7Ӑ@+}kY01~qW%"1"i%JuPAbcs蒬-B$49Ib)$'7ٞqL)vmWxT8XПx;߾{&W4ؓݬ,E}3Y+7*S"gEW)h  g{ QԈy4/dPq}TP@& U((&*Ł31éXVPbxڝhh|Ob L%emdK`﫺%1p-@)3HwE-oJ{W?T&sӏOi{qx7o74İr4 g:-eTfxFFzh)|$c!l)Dy*3))ѠɔO#i]Z!KG5s-~?Ho3GlB_WI 7V{^9%˥âNj** 7ߟ+hϳ9SBJhĭINۣV,v?]k%j]8?/FW' 3 !c* &W{|p}|}sb$K+A*CkQxx"<0BFra\8YJi`Yif%v_Oww_. S_$ XZxXr~e5&&X;Hr\+_edRZf^ uհ$%2(T}\??Yțst1dJ'#Sy 'i^)M7m|9z?ƺűl#4Ep5?lDM\_d+J7ýV:eoven3wH2P)|y _^,;żX ӱLҤl5!T!x(%15~R},lU1$8J#aR@@<B<}^Ͳ;+b/jo1 s!NUP(J ],n5˞[m:_SǶv]#Xib|sQG@ce/5 0uPz]-8 dn\w]Xֆb"|'>:{D@fphxAOČ:iŢ-x  *`_ܾ>HT_V2,{ޓ2DN L_ذ" evgG`1|K ѸU&*÷O?,,x~Qv% . 2;D7^6n3]%4,}09pנC%4+uY2BWR1T%j$rP%Z]"P+MoZM+% EyEYL37rxan/??a$wc#ojE,v¡<^[fI%ls|wn^(۠J|Cά*'W;(EH%THF4N4GQ fD4ȳA$b"/;`3F'ݙC w9*uͣY&Req[/RrS6[< C풂PR"Gq@`:h8,7o[l+Ɉ:_o ͏r8?\\a υ\Սp9[A"0OfV˧>Zz؎0Y@U,*I+3l0$[,JXx{js؈ϥ&رa |O_A"j2O!w-kpv9 \1*29TmG"Z#hDq$%k۞S.k `ئZ2_۝ݼPUx5#ݳo eVU٘`]vqЏ2ϰ%KNKyu:PveqV6eП4[`1jn?$Zk%ZLF29#G0ϼoQTw+] U(*E#eeFd(<_@DvM?aJ<.Πmp|^NO_KI\'^BUmؐ5};@F05|Z-dz+215- Yuv~}܇|EEc(A.+PKQ@ $0Kno%soN3$9Nn+{!<+*-P&߂'e5|[bxnL:Ku[w7y.F#ԜF e%:iX5 Tf|*ϷVn64Ax8O/Wo/8FuS&6V3i8:\87сԼR"WXLWQbKeP"'29/ ͵-V`…p W=6ة$5YNZtjFEJķGﯯswK\ @ȃ9AI“/z#,2M=i%4{liWn5&6DIhyU5fxxgkiϾX"c؇U nwH$ =tmRh#=?Z7q#4͉h2Î*1s:0E&HPhNlof'z#llLˆ عhGۭ? [tIJy49#yJ#(α?(VeEW?F0Ǣ x.{gN^^muՕfץhht$57O7Fv++?nNzoLmNnAg#]*=|Jl-L -JVofΨ/[$,Ⱥjd8"D`Ox/$̀FzM ]Y#LK:kaxyZ77=Ԩa/(  te{׫1ie-" ;briͥ׋Q ; SK>u >qe{\YYI"gQăkU{׿oq&=5o<], 4˦ *sWM1haGG?_dAk~#yƒi^O;DjiI.X/.n> CT9bo?Sϊ ゞW// pf{xqݰ"9ۃsr5}ӆDK*Tr`6]K\rf>?Ghb{QdsOwЪmo1y6X>\5r;OҦF2ʔ&y:(i8ov?tP^p‘3wyՑ.VR0sKn N:MRn#n_T$o?ݤ4*LU^[Il:~XW8mEc^(0!N\K%^fEt?Aa;ͱD6|Vx Bd́͊dB//j:]9'T*7OaČ RXls}W$& *|{JA6=yRy6D:]^=C;x#O׷fFSy屲"T^f*2CcS} <`hCb`G^̊_d+a:b|t>-s-mVL^dM}*VXA1}M`>)o|_חUZ^1#/yH]U ZlA8tSX X*[FĢVeupX($< 68'+%mj[XZMQsMWW/^K_D Ju Z2X"pV] f͘S~::< W6O+(:?<|i ej>uN}_݆}&@^ݼGHªҢIB`x2Y1TZYӒͣ&0<7,T* 1_ HU4M;t :.: c`k!ZٛO?V E K7{s%Oi4i:1LOM[.+ϱ4!$QׇHڠԟwtG 1P\M H!Uvbߣ6đ!!R)+:99;%Yw8HYtYʯf׽J*Oo2$(YRPbwӃ+=dX_TꓽśsGu՝{=lXOi &m)`5%H.M0cY, v78 wGzz$fGif>K #(t:>n+ASF]˶L&My,P'!;==8ߗ,4~\|1c*1<H!U#W3ە~'OJ Ǽ~ %rphYtjNUT^q2JqL^mӨS穼+5@ ID{W鴪N8JW St:V mHHMy]y+7|&KoDj\,?|Nt&En5Pb0W:e5dq٤aޯ !޾{u`$9p76OδwK$POTp9qR 9*Y*Ȱ^QB8B>tS5}D]2rfoaCJM}Yۻ~=Q^jiJvGWs sZ9(V^|w gCyUI&;2J. 맃BqRIC<^̵*a+\^]ޜ?Up+`P0/*A6*6Yph@L^t (q"U5(Cl#X<1m謝%i 5%,Afz?Nȥ^Ms>_?}}8I Bbϟ7ӓ0HdsXbUkׇp.8w&uп vH {$Ȝ|o>s9Dwd,,E0AUk<7qCkhLҮY/}gZ2Fzأ5iсP 74RaڵUId;7AR8J姅@fx;I ^(EO4d 45% {kKRIM2F%XK1lNffwa~HROpLHTd[WXYDE.E300y50]mqJbyPX ]'څzP.q`C,eq]?2:</Ue ,ކJά[ Q5]>>U]k[ n'HD_Q%2myhz ʀɷ_}NLuMKw 䨆KψY92ϩqXS$HXv5[&(xuɘkY ĸTDI4oiHVUQ0a4țݺe=wOVI6IcyϕtdU\#8) ^z*X .)մI%ƛa5AeI`|h9JM R{f宪F,yQ9[C`n'V#6,xIHa|϶n*9c;RRSy$7_ͷ_?ݿO {0a:&H(rMRZ8;18جbI`zDX*5y L9y;u>ȐMzS:Cv͉5G_?y О4ʲ9B4p鸱fR ږݲ]]8tH($q׉`yRH۹,_K;^l=]N[ehPH0F>zaI-b+reBQഴuں9>%v[s0 JiI`~ݱƦ'xڿZVoSA@Drij7Q@zdE2wo7 1ww f.v B5G4ˍhћXr 7ay?ڣ^~gf 3 (H7;h޼wl7/GO?^V M˕_}5fθ[l\H4N9 9#,ʒTEѣR9NFX$BP1(A ,]]"sEPBW|m)vԧbrl̪9!oM?cP K˅eVs_26F'; :6%W-!( ZRP%9(} 2F%EtL^Vq &4&7U>X(^Nλ"-6(64Dg@"eNc,k' rX,b3\)`:iUIs3 iW~)iu+JĚҗ* }]=s@GLLp"xD*H$IhR{[wg4J[@ Z7zwjr=KHsOv(*d8ȯh(J4E2>4J*b'ɡ(J0B3x&!C,^e7205$ۘf[v Bݬt f+olœ`?_޼F&)YrfbCdM@;4)޿ϪyeSg?d;4v)olnv{vU ɤ\NlE,Zx^h4Jݭ }@->)pg=8/Prõt 3ݳINcOD)}ļ?߾us5cP֪NUst _֫9v*r&bI8qI8 옜u qlFn$OrmqukJbPVґC2t`w4g d:cER<%#SHFeHG3y٦Ĝa:fQҧQLp1g4s c^5(nQ62Ț|wu5FJ ϑ"Va׵a>c _#ryeAH%IfH0e!nw܆VE&'ki^dOI͸Ag!FnXyKH9LweZi^㏟now8hP">QRreoĭ)C ӯȽ4g|e+)|uCF{sQfȆ8Bu3n}hzˋ'MI[,~ZU)8e pќ~KiPM2Y}dNy"`HRy5X)JeK 䒤(,Jtekps|et|Y%|@ޭ+f)^D_~A[I3pz+&I,8|5:p݆A/1)ἀBewkz:]>2K&׀j1[헉! €'s28Eeqz'l]z6Yzzq-ǁr+_{(7 \5˲4,4tQ"@x!x^"""DD#"b$$$$$PEj{WMOmOOoN={{?<&cJv;QnE`unQ /C(ec"rz-%1/ovﭗ-߫vZ#h6PA1ic;'CQ6QP"Rhs봅g}|+:%k5Xg2 -FfG{nT^~~˟o)?0d_9q:l>)Amm$0.yӏ^t J}O:JQ.q#_ox=D`ggA6c!z˗$&-BhVCIo:2y{{4cFb_ϵ&ȸwA Sy^ Ň6?h$4Tf<-]n]+%: ^|?>?y˫V PA^Z7?̝N<Ҷw7gG@6ꃯv[[_5pޔDERli*8TٸuE?MIr*QW.Ȋhɪ"R8^43}uFMMq&\(kQWF"-@BAzK ge#>M{z؅h@g?Ś+WӰ١g1` ޹waARxHqh)X:H޷?mς^ @@%H6aRKB=tQ3:cK+eQTXQoLr \!%!_h\i*M =[+cdϦq꯿~ogWF$JΟˇ"?k#&5ZEU>xf{qKɰ-Oâ?ߛe{[^=;`5XllPX ȝѻ'!(@&Ns&=}{J(ܲ5Z_`&d_~%ZJeòz"| '=xă-(Pًӗ^ea< {&$ q?ʹߩ*C5\4H#|ؘMCt$K;Kz/ ֣R4i nۧ }y[Bː=&SBo'5 ׽`qg,;ڝڳAfls67xLmq=s֝ *ٰ3[Lid QywVܒh}t \)dUTR}qb?\A-'DYT QŽ=xj3{vF .&6 d cE \ R 4 ?]Gp?;6A<(<@lNTXw qlZ1l= [UwWG_?h6t:^f޺CWrd|UdJ;FZ?:%\mA?B(nV >|q4ZgI3<0ECed'A7RntdX]bqV 9U`&<\,VPhe[[2aJQG]U0 AOȍ%VQT"2:@rכ_ d1rR17 i"ܖ? ]Hv7mN%G ?t"F&- ?xR{`f{2ڊH^ d=؞ .whcQƄJҸײ!e(I(@k")C`PY1[m u 9ISSg}ߜ,X _'9vRQD\$ ;Kx~"--L*jJ/sDB_~z-1VV NKa7 _DX ˎM]X叾R7u?ejR ( UoLc5Bij5l8x]}KcFnRRY_˶?PmށB6)θ›i;Jq;CN8{3cXa\,YBc`7TF}k-Md;좏W#JnTbpzy_b! r)ώJO@iTLUq-BNREaIڱ$]#eNe<IH굽O'Vm :2 Lŋc6{k~?i6cjB̈́4NG{m/J6l,FS#=QQżlHAJ>u˦d2yV~04O*nt~WfR⛃/^ME&:=)1ƌs5ry=k~( B ߮M^xBHHg& | @/:1Paq0V*[Ah=3APuC|C e$H7]CI5Ay ‰KcSXAyMuL834Jl n8 UEO,{Փ{Q#'_j8Q35!hY>Qn:Mzaթf+Fmh.Kg>@AKDaJNjgY \e)脫TJ40ՈWHo"j׷D慼H:n cKlSeTD$EI=qQ+ҾڮbM#wZ{`E e3Q]t`HHZ]-}2tqyA 7Ss+!ף]y_{>7s\O{[.mSװ[ K^״Ƹ9/a]]oxR9K }AKv)U'iKR%jm15PN![(Z ܷ{>ǦʮR} ^l):öe-|ܶ{ǚ##Gp7?Dɾl=Yzڌwq;ޠt;[:ٱY7$0DWryHRrY딷WiԁmҡWCRYzص'ڀ=l~ஃݣxK-5l޶K>S-U$YrHL"^|K(J/ܴ ZAN_nkN./m]rRo]W,_[ѺhBd/Gw'@=G{zo@InuZ'o-6q+H6sߗ 쉝(μ,g{2V3iMX}~YHHs77;t!z}"S&WٵqM[%BbV//ؓc,rqDHEzʚ5'+3_*c@GnZ%8C%qNr|h;THuւ-`?ɉp\_RKڢuV%~p &AC b\Sw)a?uC$pǡךdNz!amvڲԄVo Rj ?{# M:Nҡ-v |̆^ Cd<U;$-U?+M幏vC ia,K '-w*DJXau9("c%5^Cz0RYXeirym/㈥ S3zn3%1ka,>~p KMhيfwB.HyQNBJQ]2\厽ZD&P//+P6PM'y.xY,uyD"qJk'A ?BcxXPbufdOPXF9C$zXw wY^r}ui# /yʌXe@UL``IV+;(x[* : k8v꾦+P\dn&doC&qq8Ž!c Bʜ-\79b Ԋ,4ӒWþ79{|'!Mu~D_L Z+ߠWq wٿ$ϟ N%k`5ah͂#J xֈj/8}0re\V[ E qb-?.!}$`1Ka+QR[. r} JkB/̧iP.fI\.Kuvр6<ijx͒q2~і~BK@CI~&iH'2_ʬUBг+k .[0,l0MK,Q):T9di '̠^!~[4 CPF,P"L$À;/wſB>yKg]P 6"]z, w>\GVAq=OAH f|tJ!~&8mD]FU1vDֽkPXp͖f~B?I@*7'_/7X@CVB*ظ/@7H,FIԷJp.o?D#\6 \dm n9=u?>@pwSi]Z0/t赦%KM͒ aՂ$* /}%4Սsz"ỸT@ r UnE;iD4rA_t5U"XRvg߂lA=Pp[¯3J~)As-XBwBR<Ī i% ,X$]Z~pglDH/GX?%+œZu M$nR'+zL>e-! %&G?qd#@@Eh)x[:kg^8X~*I\ ۯ[89|Ɇ ȘIy+K#2X?žBHrDx7r!spTKچd|-kI3- r<Am,Qr@-bؼEě#ʺC RHKI @mKA$%@EM+AvJ@VI=w=e؆`l8d{&W ^8O! Q k0q:~C@AO[Z+VoJ+#j&)ɢJ}';#uj}CHZ>>&% :v$2]tx@hHt)H"q+"kaE?:N"5N ݾh'׻1\_0^K{k uw# E@;g*W8DMH,I4Yk$u % )[Ak__$(+(H is "Q|j伫vC]TڿxQ@ T&\A/뗌D'PҨb EJn)׺:vD8_orWY P["³kwNBr YhNiURe̥h"w* Ӛ#ЦjKZP2'مV[RP[2 AA gx磞²x.+ۗd?0$"5?@st&/p׺N?pc kpu8}d3{NFFҨN& S^r?'ɯOY 5πp )\o{˅Hk_8")đ1 m%&围Ii0ݲ[2s_Xz ۓV˗ˤ]}D|%p֯P/+(-Q<А g\?g|2n2R FOgn IN%UKHɣ2 qJ@|#9^ meMCbeIrFuAh7;mA6(0DL , 7_'g&RX?Ow`$r1F> 4^a~[ꗱZYzxoylվi8/Bkd ĕ%C&PUlCEQu rxA6t)W }miQV=2nSwRc>"$-$nmT$* 7 Pѻ/yq3OK..8v)_K8+Pc$XoHFsI^V e!fG$Jޓ.j2A'1~KZ? @^*[˟sģ<8"{ 6[BL/}5un?4@ 2E}AN{j o+Z(:@gBrW#|j{Fk2mV/ܫjCg5tOm&?qܔH1\`~F I)bSnO$ c}! (E_{$gQP<׌D+ӂX![e/f?mQA.WG=`zm.^ʱm9le*"|9*w).l(*7u*赏:kwLY 񤭓~)WȘ3}(v𭚷o..O@ECY/ Jzv kCDPhX{?e(EA`2g]o GqeXJ|xx@,;;'ꗹ@6rA;A;aHp0Xl.1cRt[ʚ,} Kh>׫_Clt9HFh(k9 G(0pS|H~KrG|sv'[aMzbEu 5jܰ M^?DU@spk((Ⱥ(-7?ky}r=FfX/&NW>/$~e\۱mÕ/p`h fѲ`ej2<c?>=p1  o?~ϷBw; @˳jMlBSR!LNN+)c# ?nm|@jHV7uҺ,݌s`-k?E^pnqoYκ'WIvat*bqcGa,.@Ac7NJ#@"<^  ;Rv!R'FO=%pw/{fMS6Wx C2D_a+[ŸU"I~ EoS_*52͆_# 'ڠ dEiWʥ8$0+@$0'@-ITݟG?TdԆ9Zs2}`RZ3S|NrZ?%M xE^Q2K+4 d́ +eN!_KE ǨF<ߴ;电:Lb\Q{>(K]|e"YT %.G) Lh3f 1aAn$>_5J1'1pK̉}A/A3ɆbIfLI >\z&Z< ^PE(km"G0N Z#^ $xSz1ꫜlo6Y Ag>TZ;EtKINhJ~){#лU`aOD&cYunw_Y6l!=5^i_n&@.f8H3͒Nr0#\A1vxm#BOI޻b1j)Fi5z2Xpk `Q2ys^:3K":[~|?@_bX^Ϥ>v1Mo1`,z W\Q|5I;IxRa`PgjOs1p|D$7hX v1h'-=?F hdepʕT8x޸Y ŠH)yTXe%]:6‚ "0Mg/Ȁ|ʹfG{%,rbDZ\W\lG*e6zҀ+^[ ԔuYg~vA~jQM.1Xg vuh}:|`:Oʴ|r@(PE@ a%̬d)3xaQYd q aS?ٞC!`KXIQ BmL%:鉡.oX@z=e0CTP]8+!3#^\Cg$l|z U˕W3m0ܛwQ]1!qF!j@t7lTL@rdLOwbq s{][Ⴒ[g>0M陸iZ~Sˇ^ 3P6:on1]rJ" FW# s l1v߼ʼn]'&:/-'ͷQtYL  /ӡ `OS)M9 vȘ. <%ilTa$06jd]BOcvZviq>7pF/@2QНC,30 VUV)e WTXizyWCa08g|TҼt0'@1(Ch1Vi';W--y%@eBT  ᥬ2|4/:%0o" {7F1l=|1ˠM:܆S @t'9o*YC#_ƤIFLϸ:E 3a80 AaF1)8>I{t?H`[EO=3&N}X%c@B m6E(#A Ŋ[(s2: 5/Z^3+3_`0f BjҾ37vh_*'3K[D-Zwz Y+ASZPka#|Wo:j+N#w`:F>k*/a`ɠ”W XHza͢+Mb8=YYԨhFMf{c3 b^kI$oV"Fg6gZ{2J%ѡ6x߈˱XYwٳXPcFE§^B _u̳}(l񖰀LUqlVojntO$oQ6m,"Ѳ4͏|uU|lF/!K*$< aFCgWo13Oz'&\h' .[! HTh0h!%J+Sb0)ZS[,cb %)b?^wA$$&*Ͽ~ZhBI>sތCʼ1&`f^uxÍ̈,VD0Gy;mh´  ͟e!m$v?b.M׳OEx>רmN9m˖} ,Xya52^0ȘZS'#dhD@A< KZ‛?_1۴9Ɖ ҥTiI1W/RdY  eYtd/ݰy+Nlӵ(AHy&^G!nmvɃQM}墉=0fԿxf8B*{x̷r6# ~vMюY3rMV8?s ;D/@8#?ʥxWbcl%RT^KHUd:T{klg Db仌ԃ +(c3o>;_mF@qm"܋Vn{:Ksk-nɭYTm2u-S;GFiF(EȌU׈m~~L+Lv ܖn YL}e38cv?9S tx4B&ܕbg(ބwkA`UMSRADÓH`A5` 1L6ĿRK8F;[:S|2&u7ffۚIH-W[T0M_0tb)4=[̈́5 KP|D؟|,=;N_sԬ~P5 5[F8TfF.a"}8zY iOTMH0r`']oecON{)@Od+jI يP:e&jVqɚ"#s*I.#Qc8.hsC*]r6{,Nw@Ijߌ߃{Xg=˵1Z2oMMp/Ki)]MCȖ"81J Wlݜ`=34jĀyJ. j1)8Ɇޅ6 w,ySGl(_4dB `nǗ8B"]lv0 s(tLî몕ֶ0bk7'=/1Q)gl{| F>[a! :Z%6 m DNR$ l$N@@ ]_slVHtW0`,Su@&s{\v8m4Ot[j <qAqRp@sQ)iV W!GI#~T0?b2=fC/kJAlwag3ڵ?(Z˘9o QK岔]Ϧ˙n *02w(~!P\$ 4(vYRgR CV \=PE/C`D~6&bL|w lA)tlQ+A~ X]68 -bx$-ej#xKE.^,x>8W]uO)çtBҿ Ldr3m5kߔ')ud:G-Ax"h&"T;`ݚC6H9xJzC*?,lC>Ld!5ɝБ_rfc% yOD~;>xv.+Xwʛ͙Ӻѭ'o AwX] ?p`]{J:.g5H~s ؜=; COx7+Ʉtǝ;u5T3WcI"wfOe[syA"RzMlq=cQ?`oMlw*M2_(n_O ZH$$o-k6!zLaE^ǖ~0B#yx+F/6wKyĂ _7gy,ri^jZ59aӆd"=.PbrxA.S ꗵϘ*5/hk~`lpWQdgR9Qj_GE# 7J0'n#)7 [C\ȎN rf $Tjw(X݉緔5zG$lnkۘq† ;t~$LE8 Ѽ?}h7] 1v!"q T8ADtk.eBf{=ڨsǍ iBdAk1dz'GClrGW΁uj0~'#ѹ=  HХQlP #~} ɮ@g?_1w_Zߠ?{|3=d[,yԼd-Ŧ=]`=N~ RSJ~B=mw] -gۙ~r?(!nEA?4y1Τ@eBF.Uڄ0}Q )?c[_@.i5lCfA.<俙hwY_df[b1̳ 4~ LwOF1]B/`0v5BlCgH[K\sX> ڠZ2HWGa|yǷBV1Зs3Wdg/]]][B@5Ⱥf#zk p13p2^PIxлz5rtd (Y<_g} zg6M1˯9e9ΑKJzՁBCx9taPiCA `.%ZvxFbe Xlw|&u<>y&! x9&_uү@B8c䆰: axiv}A:z%_$603:삛i'HZ=LC͜"?]`>g'PSAy*&, )F@Jr;u\k;yDZj2z + F1%e犔pcE[_2/3 U!Y_pb"A5)5vDh6.oD"i@!Ob 1[D @|+ð؍1k߮f+AT&%|"Cg8d A;T>»,“(=['ˆecծ⻬j?x- m@Dgm5<67xS?% /GdtEmupy 읜H(_?1/i0Ka(ӷl_vrߔA \p8wAujZ1[? ?:w)m2  #d#q:Jr ROkp5$Fwm"s`X0>./E@uR /N࿔p*`V$OCATj DY;_V? /ۭ̕~]} q?=JȀg6OwBG7o[8O!y׫ ڡs7aa('ѝ^Ha ڵ8 wҺOB$ͩS8)[SD +eW]0./Ⱦp,m嚠n {3 W}֒-OA2qG?GRtއ,+k5/ա($LKGhBccӻoKY9j:.d]5h{Yo==LA~Yפ W+W\f'eʬu_;sqrVM^=FB/5袎 ed@,hmm38x$ 0$S )(}µ\8`™=X=2Ȑ`Xi c S'nv3H'8 h32Jqp蟺]heWyJ%ڃ1[{ަ3lJ!1?3whF wV f8KX:i8ϑ$Hn( JPnٓǙ=+,{2ͭ)>4joؗV~Ó>. #GI&QٻC(?L [5\WQv֑]_-_~YsV_}} *mvfxroP` *_9R/K[f8OoL|m BS қ3=D~SdR''0.]i9OFbvg؟ܠ(#xV}%b};̡ !2 YڼY{~+]e{WxQ@p=Ӽ`y<⠗"2yB?*=rnAY,e%lô;a~* 5L۽Y@nV^[Cn:svn*з'Fr_ jq3zbdtC |10# 8e=rD1 Һ;"?)F?vG<@&a]fʱ[y쳍٨8Ib랏9x:'P0vViXYII˱֡#Wm x G--WGf]c Qp&~>^G}  oÎ8.G?ѡf+*'_DxKk + l6f ?Wk]dwuݢSDɣ.][y><|y><|y><|y><|y><|y><|y><|y><|y><|y><|y><|y>i#%indextiles_indextilesCREATE UNIQUE INDEX tiles_index ON tiles (zoom_level, tile_column, tile_row)uItabletilestilesCREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)IgtablemetadatametadataCREATE TABLE metadata (name text, value text) /bounds-180.0,-85,180,85!      xV߬Q,ebJ#<֌B.anIXx;AȣtjJ }6ejӔYLϲ=J|GM [Vv*P9#^_Jyv7\3d @ʗX3[BKӟ)*vXs6 φZÿ@); (q펕wMG!%B(TDSօ&1VmU+4R$5np0$I >bݨu"xq`0s^a]ūne$ee,- pW ]բ m\p=]-nv\>^)k'|?.#m$Acre<-fkCe9Sڹ5+Bt/o(M<) '8; +QҭaWˢU!@uOjM<=ak-E G1~ls@1SȀS@J*{w^ت_X@u)dE FN {!n+Y,BWFDg/5 ^bfmeJ{Vpm1QZ((((+ImHQ z_Cq0;យXRKf dzJITQ wur7VrNM#;|ǒy~\xĺij\]\Hb2JEǧq]gV# t[h1_xUo&)ĉ*wko-' ܖg#̎I w5NdtF۱P (^drZ$8vLQz 25;ŹhB͵0F{IH&W Z4GH4tjV^t;h-G练UY;} s3ld/N(MQZ2qCo+i1=Gj­u |ikc {Iyɴq=:+w \iz@wUXc?S)R@29:NEqn5t8|;X$ ~UN+>,6܄%˦A8YV ZϠthk[[/":$qU)$$ڠ,~#1K,P .pU/^9}j_K4+G(Efb@iZdxhBK TS"JzA'wڶ=ȱf6,T(Wh fx}8[[#}̪@ K1I$ς +*Rb`M~ºZ[ImErOQ֮>d))>^Կ|Qs7&N2###qc1`_3e%LJRE*{^5εq$ј"U) ïq]iH{y]:*6tfR>d`^I=x^i VcHx+c!Ӷl^kMj6O đȹk :qڌbDVi̡38{:U803ha PGpE'0qֲEdD[Fd1j喌d6ӑ# 9d3<ɑKgOsWKg].l3v8\iE.da zz,M8I ˱voiX[y9$g} ګ$`,rps\֧])Z{AmϷk̩)5˽-5Y |R+eA37s0=Z3vYq uI#G_CTu}=n(~r`sH4$nsHi;*#>Ct^M?3/]o$ҫ=$|&ep99rdnIx!>xur32GWj9 wVO>PdɌ?xJv奚ID7fk9&l65[ `0T*vr/wb;i.tB$NEF Dmelc#g*( YBw, 9#9kicɧ#h_\ `8'5©IǚUIa/ۏn l 1=qPTG|On_+ӽ$zo:9丘nV]lea)˻;3v$$zm/zoĹE 9z~Kv{]-#F |Bvx9E(^4B{#Qkw|6qF 8*=BI2f32A+*lOSÈQS24K 0"̂fccݜiIf`%p5hAcH p0+ɽXSz^{Ego,6ރ>u4m#3<ژPh6s?2=ɨ$<1"R1=zes= -3x >M\Rы*yRC9'H$oj^_.HwcAYg"pNx8T'ߕT=*&|٭khlE +2x銛)6f;:Vr1@F%3385RdN@fGWS a]+ DV4#@\k&,4#nxV)tX!(([QF0FX@Eyz߅%Swqb @*y<<70NfCπ ,9k1WS= ۅ [0z'J&Tbq=O<ND2DszU dW;Lvb8B?Xm-r M3X ''IE{PTWB(=7MԤHXӮ0{YsXK}8[gq"%E=xx5͊q\ݙ9]6=|RʖM `C$SЏqJkwn T6:3GkK6cftn 珧 pZr_88JiQRR2ןL5D:㧷O֥u=n|_,1HzcFGVm+G ~/jER,*4"]j~;Gk "9ڌ'rs޽M&+{T< P䁅_;k--^?hrJ*YГO'hȯF-Lwq?zH?#?NzMv:)E+= e8 haa f <<,[sMu35<:  v1`Al-_Z*v{}Kism-0q?5fA1"XMF8 qK6X]:pA8x G|) J Uzt~i7ػnep:B#ss\5+t#[k4rƹkKW9uc݀? CYpԗ;!v7RK 1"y_Tܰ#JhownAEVQJ0O'Rb2!OxHW30@Q$3Ȭ*g8N.[>lqqA=1CķDIpc"=)ߵH섫n$dp;x^^3J6Î 9^4pU*= gS6\E:EJά vYXzV')%#wcOylo&c \ޘg8z 0F?s=lfQGQ]eQ@[Zy:Amgm'=@_Exi,)^ ;t6*[Rmd'!pÁ=N#_)GA.f$X=SUHҸi_Syq`O`SBK8&xq<2d i., aJdםNkͪ(˦xNIwq aA6k3c; `n8f9\"Z/Y \spH#r$r7̎܃WuQrLpD71<ꬺt855)%$I&+aEPEPEPEPZk7q՜:/PG|} I\ 'igd1Eic hsx?gX탴QKu*o9z6|ߙkYauqlrhdjEE]TF w]q=a yj?xq:g8G-4QEv?֓BnH p$WS^B-d?G#E*HkSEmX›Xsyǧ\WNˍIco,e&Dv8/$&221\w.pNwux}eT8>dL'Jqu]zיS RS6{>:b&"rQmB@= q7Zަ[^iK{:9Oz- MgMy<99 1pp3>]]_s0+-a"3+YN>晧(YP@(@SU쒫;b5̑QԻ9%CnkwܩP2{笸 9uA8 ꧎)nw HFk*[5luʂSKjTe#Ėjnj F8zfG/$.h袊(((@Q@($GQIEX[j6 Jr28 y5SnSTaqsxLym4ة;ո"RTCr (\0A kcޢf,mm4HQß?]ny-!d۷>Jrsw)QE!ѻG" tEsker9>Zk]:H6DcĬK7R@'^vaԤSs||Gx1Т,(qLA$25'U<&࣮ kV)nUE\{8-`,>֪uJJ耢**V :qZMv'fEAp6^(MOW\z[J@ڄUVB6YAILEwp f@Otv~A`D*):tcihވoAud%VMOLp}:Vl ?ֶFsq$ d9CП± <j)]ɵ+VbU=E%EtQE(((+Jxdٴp?յs6?C$JH۟íe_ReAI.M_6c8<2mn%bJ(}*BiA'~z(QEI)jfF Up (vP,v (z(8*?wߏ,ZYƛ.慳4 0$A9ÚCj-)Y:lЅ#+?\pyמ^:ͩIooW=}+.%ߔ䎼k4NlUZ_Mīkp9YTQ]ͻQV (|3go3GĀ;=byF%A&MOGc] rIqV:\s,lfD8R=}^XԩQS%:6If$6^חktvybs[^}؅ OkQtly{X#==GɂQ%ԌO-G+9(N ((((JoB63A~zCHH<ĂqQ6~qX q><^Ggc՘䚷 VyB:@ `cU*Xj oՄQEHQER9RA84PEPEPEPEPBrW ^^63 H1$'_rppzvkqvw*yd`%zp?ZGpbp: mjtrp Nҿ2:{G"PpFps qQEQEQEQE:G1)Q@Q@Q@Q@ H=yIGZ((((((BŒqi8HEРTu^yvp?x]d#F+gI9F.'&;iN3٤Q@Q@Q@蚎|l>!_3 wJQRKu)B2ʊY>ITVj@cV I =TY$/Aqױ$~WU 2[;FzGCZ5'I/+m/:^$dycQJU⒘Q@Q@Q@Q@9 c8lm$5 k((\nks Լ&{i }fʏI'`9в/˻hwCgfܣhpNOOqY{ׯ7Z,[J?EIrhOve+K9ʖ`TL=G9ּޟq/mtC[%ʱ1]xF7 ($('&<7˯2Z m ;XHk߼k}êteud_$nAjTJQNxxcx #^Uoʾ08Fѕ}w?Ŏ{(6s2*s俭g6>y4ɵ9"g~?w Fqtoz.tKϱ|&:[Qxg9jR^p*2Fe8KɷIXN\e(ZL0 cbylV&wk F%n9]&ͮѰX rsKFiʬx >Qȏn6~vskJv.~"~ۗ<#ڼ_f}^oYɴfwMz[Ud}G%O=*RQ {)Yat1s A@#EA_Fxj%h٘૟WzpoVTߍ8WՈ({ X$g8HB$uh:j$c )!y vֻ^eזWQڱkVI {b.+5nR%ZeZ09'bj2=5MtրNw 'X䈫a`xH3};7=zl&ȋuKr rwvӥiV$3\Jɶ";%M㎿WS`G16QJ!2'hBϵPTh021MĞf~ץN-"EO-pS 9:6N*g u9naAD8D4Sa͂vs׮C[mW ،u6%Fj:KK;XpS[ev6֖Յp]=̊Ƙ?*J턞SD G\3=\Gޜג*yB9~>E<85iTymdRWwgd>e)OP2U$'W.uL0-طN> ]\#P6Y !R Ӟ*ȅ^fl>"=& |TR8O4 GF]f>קXRZ_гUV8'h#8kZ2M6EjY{W rI$p1]Tc][KM63S􏇚&ZVw$ ,W!Gu6z#*8LZ؁GIlS6ŻmE]崲yxj;fk5#gk=$jgkpaʧDū6fcwspZXHuV$O^ҩ%ܖI"'wq]>h7_-[S[X# qӶ§{h18`T6Қg#`XƷ1 bs}Tn9>m]L"3Fz0\N9@UF53! a=cX4oBy@?ζoRBF+윊J])Vl<SڨIs,pǮ?OoafgQPNsh3wl|:,OnE|nc÷}+Ě̩f }z?O[I0q\uقW Q^ɘQEQE%PEPEPKIEQEQEQEQEQE? Y՜˵02.9ˠ>Dj[Ydm z\hI[P"4e kќP.$qIJqb"p`~lg>s9ּKh*(⟕Y@0bjW%cpKgT/ufvFzBS|DWcS ݌p+Sj7F#g8Z^d ( ( ( ( ( ( ( ( ( ( ( ( _as0G\ 5U)%: 4Ha`ӊғqrXfKx `5fs#аGY3mWּvTR[q3k5*N}ko ®8'5+M3X޻LeQ^((((((((((((u5D?^r_ n^w-2XBҧX"?B-63'd)A$U`bo4I2mHOv܏CEPEPEPEPEPEPEPEPEPEPEPEPE5ųG R&]ˎÎC֔N ~r VRU$I'@9((((((((((((RO2C 4Qeu4cOQ6n2ʪ ]Gu{_xU<}x۵/=5(*ɷj922G8j>g j$r">D;hr֣_y^WAٻv0T(QEQEQEQEQEQEQEQEQEQEQER,B%撟Mr;6=phQEn{6S,gY".c2q8=?vzC/2HFq {w~8Q)%C𭍵I\+0F_#S܂KIkpo^i}+_ocwݳg_x=cOZK#!=zqZ業K8( ( ( ( ( (((((qQF03֊(^|Fmu+7wr˽8*A8nq}¯ iDee$e&\qx-]mM0LUB֩xk^AxX0jz-QZ!(ytfϖZú{gY;Wx?:c^/ [ iXE8o>хN͜Q]aEPSZZvnC]=_<]I2-ΞQʯ99*g.X5|gI3BN@۸ +aԡΫ xY9sɬKú]h=e_bO Ҵc ug&]G'k˓擑4cFj5(xlN?£2N@<㚫3->Y1^PzV,JX`̒ewF/''s5<2MKGk;rsmbK }+8eKm#k>zvC>Iz7B`N2c!s+/Rl P ~QHd[9e+s+%.61F)AdGH`v8n Q()OOqu =ywPT[v51WcI v=Æ!b< j0g*Q"]>4YzQpçsVݑ ]w͵ 3nR4"OIXz-;BC3ӏA*Ia@g:jM3i/٣hyC=(g1F$ p*<{n%.r1LU$cO%}! jO2UϮqUkVDH 0F՟c)5Y*O ~w;}2xQ}DC`'cJa0GQ^:|NH>е+x^[mBLwwVfwE^ӴkYd66h: ԊAV{mĀ<<.N#I_c OZi,Mi+WvCrQg`R֖ ӯ>ƠeJ2c#DxB/PF|$iᴌ>bĚ1tW!n*{ %soЄ'_|Cc:~ȭXn%o:35exױ"n38WIEI[k`n$5kHnݏUPM..H=*}4(71T˜B"ukki&!sߌlon9ֆ@@չ!hcU2EgW=iԦ!dBF܀Î Bھ; ᾿Ү{Lv/: `2O4I|ch֖j(?iwٍgwJ#1L<ЍN#͔2P"T>cT)֭i;w{sޙ,ҦZiC[/ 0kVUNqfBi^+PFKe!ؙB"VΡ䃧ɑF;}=kB\k*o5/R^2;ԑBoLP?5jA]-07UF :YZ\-b\!9=I׏OiӿQ ˗$ sXDGs=˲R7 թ?j>G^e+e *=`\Nɣl.N 5?m_SiNE5$ L6tj _ʹl=jD hv?%DEGV2=>-J9䳸HNO Q?9MO9EǷ?ְ* 33$JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?("(*OjKcl!!qm!e8 5 elLmKL6^T}~4[/ 001\JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?("((((((X;RQ@t |S:<+C{ d}Hnt}F=:h,f7+d6W3{f4ng{T+1=={WPVR9_c*\kH8$dIO'֗8'b-(\ HCp=$wג5n3?΢.rmM?b"2 WkmQvGr3g̣=n_+JEW ((ĨRx(QEQJF(('4RPEPEPEPEPEP[@ՉZ73rqU%XɮHTgqXS#nm˷ !+`p3QǾؕ\dߏʦO$%"qctb\_1\kZ'q-dW}~PGzqh7k?![EW0(((uQGJt+8km)P=:zW1`#lcҮhp{,Rnu_R;d{+bM= rozm^(Ğfh{mjw>Z4f>X J"缐E9`xXn*H|\C&m=;o{LC#+.عa͞GQm'>Vp㿭 MQ%fafcRdi$d6On&Y.O.P98s@9ST@r #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?("(((((AN-@ti+ !x=|(ҸO|?iln,܅T9czT4qX~ +?\oG i:8, 0H_'=R+ho4nS|podmMrf.~r\\k~+??ŮU.4Yʹ_A3 eqo/&1'܎@jg]c]fz}^+:6\Ͼɢ6Q dԚQQZL- bu`Yo-iU578i"lFq߆=h"fF_.\B?~+_c%]1d،:щyF坋1&Boq(QEQEQEQEQEQ@_ !.Ity"&P3ݐsӌb8J/ׅmu ?θu}HĥG`M.ࡤ.=9OٌmQj}VU7#źcR5}iڭZ,ٕh;"E==s^z\];oh9{ @ue`6I8\rzTax.};NXmUak|wi[Vw,aK,y +OỶ^-󅽻hރ3=k,axztwhϐ>Wp !7>{kc\~sW$}X}X"7>\w5qf9\FK ֭,xjPe/F`eOa]Oݤ݉nz iM%o߷a`xcq]Pt9,F A<(((֙2,4n20G>H s7Zˢk.e6Ecל^{ď_!qZ |zߐ|"($Q[QEQEQEQEQEK|]mcl!dW8BG Vοs/5BX_Y1`I*r#v"c;kI;9>WB5;+[R-.qϕw;XGKo7i2HA~:ƛ,aۥkj rIGؔg@J'[> k rvɟzdW[Z.4=oQ]L0ƖI/Æ#>OᖉjSjeܾEoYs!,rA\y*g6sk][6)<YNT{׮6%ܐ1ܪqmn¼z'ol-|ȇi!0cBF4kǨ֢frT8 BR;c25k^#D:0ۇ9?^[Q>y(~Qltn]F/htw c=2,# euX^ׄ GI{|b{s[yuSO4ԯ-ɸmS׼6#3 f9$eq)غ ’*aJYz& 854&y/4{ -|AɱxvuOzK-J(.9dbHPC`k+vQEt(((()UK0%:6 lg蚌 K}OHz%d2NqVmR8m8Cu3wʍf;jcR8F5qqUHZI>S0Fz{'6zm0KI.2d?` xgƶKGٷ}~[S;)#cW :Fwg-y~Qc8>ǂWĺkXˤٞ |h?f⫷_}Kvi'\}e{hN>-x"8Jgd?/.r'?W[ _3#6-wןomEy]ೱ坨xo?\hkW^۔7LuN=kAM',nnm.PO@ku%u`gݐMnDdRVu_W['ɻv01ҷ+-Q@ #[ HOК}EݱKc8+5e3v]M gfou$GWYmoťo`y2485]7/ +q F%)1)(ekqnLm%v2wzS¦#=`@*E6}~mn6ӌ玸2D2q4MH:8_Ӣ+@B`N'޸MK??/ȘI7;:qֻK;_7aq'kīFt⹴fI q@Y GT\T5$Ƹvk O?v3u&_waOs ^R4\K׆HS \xWv1\5bTKWaI [FW8QJwٱu~wǿ3콅gl~N1ޅ/eS]݌宨ψiiVmd5̑#mkWL[M|.RMڐӢ+!p̨xeB3e${\)MYvj;\1 {W$qֹJz>&è .3O˞j 2k͉F蠱\he"T5? $6xZAm) FE w,R,aԨ7u= aw$nGЌ($j2&v+%#Byl X JՒy&!b0;5R'v1> DxnyeQJl$]ѸuaqӊxZD$$ݞثLȬ˜=S;qv+,uq4֒,r"4\pT &d|sTu-J;\5?=NO²-.WX|o)v=:q%j 'O[Ƿr!I ޶/ѕ;r<+WTJ# J3{ߵn5QKMFHgmq˽3ĉqz-b"EP r պy]ɭHO1=Fqqr߇W2Q& uki[fDGd^A?0W> <䍭hǢJw_,WTA X\s}k?0\$BNQϢ=X֍_'$}[佴oFea-#v)c&o?"Yk+HiR#89#+ثMKV&>Y^iY]سu& +@WXB[FitHm4pF}{Rڥl#I$O5K\I,.c(dSpzwRM:2hVRX٢I-BGC '^S\"qQEwȊ?'|dsUb:Vm֟Wr2pǎJWk^A{G&,h:t&(MݕڥPL65Sp (QE(#X~%s݀qESVP, 3);Py>WX. +eb8 g-Bo:΢r\}|POT y S>p$aXQJ%MYU JtP] RRR~uTU*JY|Eh<ř!# sIEUEn7$ V|m2[K^&x,W<3Wok[!f<هzf$[N;Բv1ʓ֦kQ n_˕\gj v#?$22" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?axSPr92?ª^AE) 0O8RGFEKavШd2(@?fL[.C}AN/o#Rv ĮϘOw毤1\ilyžӌw]g ز, ~N>S;|]54!գ ] +[$l+pw9THsu` Q] QQ^ɐQEQEQESvF ȦQH&[޻H?B9i\9*9_T{IS7usv/,N.@F,e "=1ׯ=RTb9u-\,pѶTFk:8a6[2T:Jaq)q!NATʡQN3 (26*xٕ?.OZ!,aE^[Nbҁs?Ûg`h p 'fLe PH_o6 bK;#^:Z3B' -I"*z+c N [(e %oA8?J0wO)"96;RRQL(Bqm#rr<+s޴~J>QZv6PF^f'#n@9ϵG%TW^Jue$lю o9R_:9Vť܄A8:UxQp, ՐH-+> g*3׃*8-NtA{uQqqJAi+E-(f tqIE(q@ E26Ԟh`zմ[1x#>%ݬiCO#a1r ."ė&dH6k Hb5⠩izӜ0˜*||#)8־2,@ߥ`H O8<3%Cܴ֮SF}BPb>.qHhᱍ nrz?v{?{tBkcnt> oa+e';nF3@=MžJREuQEQEQEQEZӮ 6Zrz']| \Y庱&fy ?hx> WFXc!::tzԅ|T}My\۔#B:Ih "nOS֪8cO_M[*0:T.="2\@DT9jk3ۻG~x&[2pO4JO&SAB8P3kz0d/uqX'YYݠr|I'~ vx׻G<Ǖ <wLYC~hQL( -[oiWڭy~j~e*r>k-nEݬ:&ɓX7<ߞԜ薰2 e'`}870SӇ˙y 3 cS\ |aV0q#5 VPZF=Ol4F[ӏ\RC3.9$3#YV>&S&'fLs5C]p]|\ KSg8e)maY@3=+aǷ_Ҹ[ٖ{e^۸j)yQ^QEQETi7 u8{QE(((((((tr4R,p4n3Lۤ=NUUm@(`h7-ZIˊwfăy"dgzFa㱿{F |GOP,N&XT5#9QS(GQE>"HjOkoA!*:YrfIXň2Nkco'T ,ԨC Ĭh9n(((((( %hH>_n?` (EPEPEPEPEPEPN#:Ln`8mH­EGEPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Vc<3^6"e[:ʖ)m c Jc.42M2VR8 *QEU; FV{w2Ar8toYx7SH.n4N;t;7.pW'玔Kp9EXಡS_>n:~&?zNkno!o, T]*}k9QhgF`J#F236N[M->A3#.T9qXVPF.Rq[WYO^'mqe,;D]TTm/QRֶS,~BI5p*`^σᨵ BThUIrS#W\#_ٺA,i ĈmprqR's|)Hf0~V6tBwڬn`ڡͅ I: UʔR*pi)(((r -h:6}^zuTomzmƒS̯` F,)gbUFI'8 Wa[\ g_#Y7gӊ%%rk'qɀJȅO 5kX䷒#PYv]s]g|7y5/|/csnzW3o/zjc;~9z&mfbSάi#*q|ZRE0=(VXylW[G_os595u<^޾s>7S<":]cPddLu}T+ ^#G5|bO/Z9Z5>Jm3d0)k^M̖_^? |yn=몝m=:~0AP^\-ISWa+О/ݮUxR7c3En*[Ĭ3YF~XxD$c1Rߢ\Z;q"CK:qcqvJdo]F/b%{{-[C& Li^sWmlm ac2B)s<'=Iۢo5[] [r5EscmGn$[XmI_24NxOc X zXzKQ˴#"<㷮*+DUMݭ1Сt-=]2me*H?¹Kd)|#i1p! >\Vmoq,o;]M }rWODM3gkLXt$*t%.ԧh!TN:̲)<}+d[4Q0A*BVrJ[>87|2xW<61Wvǽq>+S{,|nI{Lnۅ*x9QtkƋQQH\:n? Q9i؏wo?JnPG᳻ok|jTy-&c<2g9:r:tXBv2pqJ3/ƑltFyO\#bǡcךmknjކT,LS =iubjkcpLt݀`IlrpW=kW*$cqӞs"CayT wFUl0x<jIv3zSgx-,1 n^_w]OVwc=q݁3žp9hԴ:H투^= cg'h}7V]O}2m#RicLdAQ%ƶۤtR^]̏geysUWje1\SaX(+ʽmbXǴ` jYdcjtbݻ~4畲JHˎXb3!TOo¢Xcf kU7vuNU F~)k׺El<_w;=^Y9Ug֮gtԍh4I*۞2*P氵MRx.*C.Aͫq q^yxvHcAfXsǸ/?->{YG,c Eي]x3GҴ#frwp;WUc*G XW+%26& \*?1@j7:hl/⌀}:bL~\Tc}ꔒVF{k=ZrP s5dܣP ,gpGȸ9*(vUgalg9#9OK 1r8IX8⥷21E{!& 4#۹DQLvI4&Z3N:9=*mm?2jpF qZElGY&>Hڛ4khUF p}K=9v3mEQs5DžW[K) OBX~REV wkBz]%F#xNzQ][C3*1VC/c>ϗr=(QhFy&?`nنȎ.  \g ?ڸ)ȅ;Aje`~U49BcKR} |hPOL⭙d,1#pjyGUFxJ8زFe8XҵnP]BKu Ȇ7ΞJ%$pi0P\^VYɏ=Ge[c\yxjCnOɵv89Tu?v%V'#"/nc늲l^6M?P$ag=ϽRF~=*O>5inp{B:Ҁ$O.θFj 7~d_2۞uvhbE !$8w|ӎ' kHeH5 \tu):qTVF p8#$d5NG\ҥ$%*O^i**#ӭRG\zVTvl*ǭZZ 0ˉq}"nJ#mH*18?FH3v)&y?/WolQI>cHelю::f4l?@0Z{0(⩄mqjFcjrXdw_9 Q` C$Ǯ}i"!3Q4#Ƚ8%L]AᜎJII]-9?/ShUׇV륯Xk5Q&3A'?y#RUU}KKP:ڲQzUuG~^\zڥ^N$ȉHU[4\62Fo1r.Ushu4~kxk.#Nizy>}KZҮ`H4(4`GKO:]OT%x_ҥ=[ϳ<<fsnֹcTXh+{>I}Z< ؍)#VLÆpWlm"*o x҃"3KGQsŠ((R:p[l kn=Nk!}cRỼ#ԬcA2=xGuE֏Vofub9)Pk5=;)~OҼV(hv9X?*5z&R)eqs"jTtQEhEPEPEPEPEPEPe &7irqUbF =*5[/W6lmv*0F=\ݵՌky I ai-=į,1gF,ORIk>Ew{{/q72>й8 Gz*ҲQL(E0W'12lugs>_aVs+>M=GWImkpA W7V5, Pd`** $vlkGxWXJ4c%sUtTIEty2aWMSBهY==TP߰9q$[7F|ֹ aE^HgWUep}~6AsLWqq?*b[r5`_qJ"Ǭ]GE`T`ATԌfL( Td ~G_WQE0 ( ( ( ( ( ( UTu'i?Ey{~|q4%vОV_ G7R0j(Z"8'L/Mgm3Ml:Ni6lݞ33Iͅ7cOqbq1\cQm35ƢjUO}{cj[;,fCcMy[ M/*=qec.?VIMěaG׷Ҕ-5h// =}GM&K9(oc]u熾w-n m\خL;9+ק$$zJ+b}Gwn^1Ab= mN*|,M4nhq.2ivˍq`uc:s{7aוɻj?)qJȢޝ5N ?f#gzqom ӵgS(0 5Y#/C$1?O~;W ]7/m+ǽsb*;ܒ<,<%$Ԓ{jޡe ߽<9PA]vgp+׎iIuf]#7k=Đ)*WG~+pg-Rq?V$fR+Rv~0X=; sGJswBfqH"$!'bN7Bz73}ɷ1\7Y1ZLjM& 'Uk.ז]di.Xu$ol7Q.H 0N>\ pKI :t %3XmsӐ޾ׅm0m@DnF9zfI5b*gR߻h c5/͏@)b1>ѫ2[;0LdT>qVoڶe,lZc{}s ;qjvBq戂(QE$14R>Zy?z| s2 8EoMP Uw@J  pI ̻Cu3Hdz5$c'һ v 8rc]iY2i>J]6H%Q&:ncmE`1^έ-^FT1~kMj ea.z{VozeQ9)V8TcWG[^#l$!IZږ-VyOvXOۼV7[4Ȯ` U /R"ث_ r @8PMSӡ9{emuXGO):x#i83(ɨГ늂G+ I ,1ұzܼACsR2`9c*0iNk.eUpI?:I\U2XwyQ_gҐWQJ=*B;wsDZ̮d?13WK29k>@5(6UX1 pjIMm2+iʤ1PZ2Xxb@ɦ\ӦH<Ұ8[<aM{ߕB#j&@+d.b=NbKxʇ-?TS×Ѽ1߅lcv9gbv<8xӏ,F{5PQЮWrIq=[#HrF\ǯZfB8S}5(#9rRQWfh-!Z2<';ZM@Πp*yqZHnR6\G q*;p7=$:9?Juc6\:$ \HAmz`E1mP *8cz ҭHr+1ܑKG#<7{Ĭ A81#~xԖ4#l0椒JI9S ,G \ Be>d ~h`?Zd ˜fRqqM]&X&7:rj\~\Ro>`9!%R#$``{Qʳ16m9u<v<}P.kp@!?6S\@'zFtRSplNzPil2d94<#r9d Jge$2Gz0TucBSW4y&WtNkr䋟dݵh`W )gs ;45]!e!rq1\L| \isN]DQE^ͩW(o.2W=pOn0?[xbd6ۓ֬Y=$ )F%9'u2:(ÓVsoDpxǵIŻ zF]2=HQᕐ$ CJT"!e={6VwVu=NlrB})yTW!-nq֬C344cQU' եK(lqa& A:*lȷKzU2|֪iPTp|2Xmw*O?Tzbqb( .33sZٗqr*vFˎ@#4-D&'[A4ED:yʏιmCI]22g (зJڜ i!RyYq= Xl0m*rN*幸` i{F\4n@$ wR⺫-<Ѯ8<YݔvwKgdk69Sj72oo<)1;OO^ߝ**vbQ*lQꚚiv0 '^QWk7gW^vc̘0V:*6: 5T]],(QI?s[Vn>hF89cSwFdB{6x>X7$c8[;&!Gںj[PHL!*6Uyg{=G!>PHגk~k2xxټHPb wYNHܪ-tEGHӡBm֤pm?tWt1*?ˎFGNoPլMaloEUy8Qjε`N:ιӱCҖ88:?ZLѫ'qcOҪ7hoW_PU_% q*3)e',=*8nw̃!y-b=c]x&iI& (Q@.n纛|;p1Vɭil !ss/Z'5Cs1O507mn?^d-ɭԾiZU 2qp{qִm/YZ+Hd;n,[՘څXߣG{w\gTF(pAW\誜ͭY&Zk1ڤjL?z^Wl䓍סqqw~_"NR.鎿OʨYivQy^Z9]xNs?O-S|0_5FϺGK>=эc^mU*Rrf񦦮0-{.%c'KVWׁ͎}=)~ ]:HQxy+],nH~<8'qɮ BGG,q[Sє52;Kl3z3>0ۡ}0GMUJ35!2x9ڝp|9#Mq:juyr$ 69_4f"5VS8vt{AL,;Wnz2*]V][T ˀFK /@x淌nvR*Bw2xVbλ\kUc,2Fڛyy-Ҳ70 j-=Yl-Ǖ N5Vw#g/.3imH֖" ބlg_P-/KO=_]n9ޝuZgy =q\mkO$VV̇-ϧ4b,NndpUUn DwC&Hl1ƒɕdP>0-ǂO\ޥ{mxӎqS!ұ|CH1ǒeF1 R+W8$ܘNomccߜg\1f,NI95ܳPIC^ywq)q ^5&J""a?\+JlΛN=e^J'Ev+Zu]Z~!Ԃ(Q@Q@an$?Oδ8&=O"䌫 략XupZtadUAB |urGx‹ۭ3uʖ/'x'Rijw&&GĘcps_O0D r٫:qƦ¡&A}ҥUjN-Z1>tiwOږqd{3u>yiQ2v־dI $?27u9 !E#TR2~s*YًO·^N$3ŀ~BYةk[ $& 8뎟Oƹ W&$;oB?L8x%d؏"Hk{F;i҉j+ "O2/c㝤~6mڵh5i<}}Nɨ XÖ)ad)th-uR[k*ی}jNNTeΔY٤aqIyrmP~PsIږQs<Էm Y~6"8V8O«Ēi7̲nͣ'6qzsIilfR sFNyw*9qZSyzmvqfIu41=3_ERW[W$,SLV@QE0 ( (>ǚ12c%Izg&ao!\ ӟj׊g $wps< 1~ dzR%MH zKxRǎ>`#P %[=k-/0*[#{4MGkfII=@9POmCJϴF9=9Zt>[`{DZbkLrPH;c'9cZL ȑ˕p10;^SyӤ̪m`NټG?0F{Sms.qx BrOק^_ˆ!MyvXmг,9~P:e,̐ÃQұ4: Sv741$#q\56-i_&E\prC>VYJs>UMJ/.j% 15Fvz?j\ݍ)KZ^9ծlm#UGM'I$`gzW]5̬C7VHF4KrdOe,p_*9/RɮO׮5s#OhN䎤G=0ӵ*OȫǾGЍH]CvGwwdigJ8n*N?:y/Q&8 3t+][$f""1ۡ+N,G#d־ǻ' psFU*ݸu"Ԃ;('xkԯhy~ NfmѨe\n THK)QE@QEQG@Q@'Kws3Gr89lW9G{LhΡ~9sfI0,5iVe۳2U(bhXO-9as F7ϫ^Uy%"7uPiBbMd$ё{sߥR[:e#}~`~bd =yY:Ja}.2I!62(OPB2wH *!{e4 @8܃ үe-l'r+ {#vH'B&>l)8Ǖ zQEhqޒ(("Z(Awp cYՁ[w%#qOEZg)v Z a8uAZe͌c=ZmɭmicV̠+SQՕ+aEPEP$Aؠ(©v&l,1% KP ? ӧ*Ԯ]@|Q]ΟU#WIsBG8cA#n<}mMd?+1 ( ( ( ( "2Gs^?؝(uc&WMo ٛm|uxt~RɣI\f_xBWaĪA8F5!CJRq6e'ɓUXG'ZW9%]ۉ8xO|W .VwQ q*H$C]]r{&IQvgT%ك4* k2nw6Ã?sݏN~yookZ8jv9*%;T`H/~p71lzVj7&MžQyٯ)&@E(`|d~' Qsٳ4vwfcci)F9IUa? m{ aES(((++_dEwn1IݖLvjIE^[ +莇f,䏱n+4+P!\L vݜNߥ/%aeAcn}%bWb~lIDIF kU܏R8()A#㱠sFIGjmQEQExI#vI+)R:}iP޳  eYv9ݸ7eSVXD0L Hk t9#B#(7o"BwkPJ QE|MP+$p;cMM?4A2cv@ֹh4hx >a#IWw*ULe>N@f[q"b[(8,\܌s09=kOmMI/25kCgKw*[9*3Y`X1ת[h99<*d]ۋ" #8:鞔*ZKBiE*-͢QF1M(((Aд6ծOjK&Y *`x%g>w/5} ILq)n00fΤMEl$ZCk4*dukI3g9]>g_qNߝy,wgdalautotest-3.0.4/gdrivers/data/frmt24.cit0000644003401500001440000003021013614004466020205 0ustar rouaultusers ????  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~dE"&1qGC#E\QqEKxy37"@!0Nyp"Q8&F iA?An0J bMAP 7qI  ! X/o`H-]8D^D mAaK`:X^&L" AntЃوĩa:F68(C`hM0 ӡ)L!*$~^t7`7 N|Q1L!a[fă({7 D&`H.ㄕx7 ٨$$0ߢ|<.a^x3@ C ^ a0qb`:!= pEŒ>Ph0qf0qpĩB Q 0q`KK` |ӑ@ 0`a: 3`_Y0X3`@ߦC3kI >Ea-Ὲ3)YT3`8,E|I%0 X D柠4, ?ޢ& ]L"B.tACt$!g#t~fÂ-MaC%I!C  f$ItāKt'(pa6%$-tAfzi&QRXÂzIMQ !"KC$I&=$8xH-.m:!l'cIC$=La}IpKtp0Sj %t:L]nKāA% &.%I2q`zI2q%8(JX$)`0q8!hIaSL7qX$iI%iyI7KQ$I`I(I$I$Ғ$M/Q&$I$I0C$I$I0qkG%r%I .8iI}z ֛! tK$IĥI8+IK$I%KK!:ӹ$8\dIdhA$ݒ`@$I K(\$I$ ̀9 HҒd,Iz0I'iI3 Z$I $!3$Id GJ` K$IK%h G%IdZK$'I$I>4$IZ$!-HL Red rgbsmall.tif 1 Green rgbsmall.tif 2 Blue rgbsmall.tif 3 gdalautotest-3.0.4/gdrivers/data/test_ogr_no_xyz_var.nc0000644003401500001440000000014013614004466023013 0ustar rouaultusersCDF record int32Xgdalautotest-3.0.4/gdrivers/data/h0o0y867.1ah0000644003401500001440000001100013614004466020161 0ustar rouaultusersPRODUCT ID =2434Dr00-01 LOCATION =024/03400D7 ACQUISITION DATE =19981108 SATELLITE =IRS 1D SENSOR =PAN SENSOR MODE = LOOK ANGLE = 2.30 LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = LOCATION = ACQUISITION DATE = SATELLITE = SENSOR = SENSOR MODE = LOOK ANGLE = PRODUCT TYPE =MAP ORIENTED PRODUCT SIZE =SUBSCENE TYPE OF PROCESSING =SYSTEMATIC RESAMPLING =CC VOLUME #/# IN SET =01/01 PIXELS PER LINE = 5815 LINES PER BAND = 5888/ 5888 START LINE # = 1 BLOCKING FACTOR = 1 RECORD LENGTH = 5815 PIXEL SIZE = 5.00 OUTPUT BITS PER PIXEL = 8 ACQUIRED BITS PER PIXEL = 6 BANDS PRESENT =P PRODUCT CODE =GRUCU02AZ VERSION NO =IRS1DDPSV3R1 ACQUISITION TIME =10:32:26:938 GENERATING COUNTRY =GERMANY GENERATING AGENCY =EUROMAP GENERATING FACILITY =CHALD REV CBIASES AND GAINS IN THE BAND ORDER AS ON THIS TAPE 0.000000000000000 9.720000000000001 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 SENSOR GAIN STATE = 4 SENSOR STATE =GOOD GEOMETRIC DATA MAP PROJECTION =UTM ELLIPSOID =WGS_84 DATUM = USGS PROJECTION PARAMETERS = 6378137.000000000000000 6356752.299999999800000 32.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 UL = 0112245.2072E 481549.0796N 676567.591 5348339.002 UR = 0114613.7873E 481517.5182N 705637.591 5348339.002 LR = 0114522.6724E 475925.2528N 705637.591 5318904.002 LL = 0112201.2933E 475956.5243N 676567.591 5318904.002 CENTER = 0113405.3835E 480737.8662N 691095.091 5333626.502 2907 2944 OFFSET = 0 ORIENTATION ANGLE = 0.00 SUN ELEVATION ANGLE =55.8 SUN AZIMUTH ANGLE =159.6 gdalautotest-3.0.4/gdrivers/data/rgbsmall_with_xmp.webp0000644003401500001440000000163213614004466022775 0ustar rouaultusersRIFFWEBPVP8X 11VP8 b*22>6G~3X2Q{ycR&;%j^^c-{?m gfI O d4 iHM@jy=v;G\dYHfObuYQ$|oʙ/S&l,gפd>@LM>3 Mk7>ԩu'_K{'v vНfTYdv9x>N^"E=:!,G4z%)P? k#eWh׉lG0ʅ co2Eres|^1{|)" *8V̡aA`]^G-}EKyqA 0@;i{?[ ӻbz`7dt6DS5' >DWL2Bv1PÉzHdTl!XJ`YG82ږ5< \C2ɺIo5ԺٖP/ B]y;0Ky?0Z$t);:,DH;G \,m׾1d>6  }m9,\K":F]ͼbqw,ҿ3巔 Tw{[`ϋטp35tG4tT0߸tqѻq )c&tWT}=^w'lK# t\oi*)g%cPOuWo|_ʋ«jx1`2~'[N`<P?E9ZEtwԻ<muHzMc8xMETA FAKE_XMP gdalautotest-3.0.4/gdrivers/data/corrupted-subheader.rsw0000644003401500001440000001264513614004466023106 0ustar rouaultusersRSW@UUUUUd@N@tLA@A@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~WWW     @Y@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~dRSW@Y@P@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~kkk{s{ksssskŔc{{{{s{ccsc{s{{{c{{kskkkcss{sccZccckkkk{sk{{c{ksccck{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.0.4/gdrivers/data/vophead.jpg0000644003401500001440000003523013614004466020525 0ustar rouaultusersJFIFHH8ExifMM*IrfanView1 i0C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222p"." }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?P6 ڱu7AлG ?ZVI0Fy\-}O26A!# OlrO*ۉޕ@8($qaMIXdgzT!PySwnvJBO$S:4zh t==;1=H8<Ѹ:h' ʁ$4LOL*[}(c 'ڀCE5f0G֗ gzc>իal+=yVH)l'cm_c\ƛ=pޣZu[0G6] .! Ȅ`7t>nI+}k2#~_&Mf?W? k] ) 8,x=G=cĖCF@"L=iO 1ҘSF2Ԯq'@ g>֐Oǭ8 wztmx#})z96;@G"!BL z@1HCL|rH~`1Mdg,-3O2cWrO)SB~A0:i+qc5 qM!TI,:?¡,[r=jɋ# >_Jhk~T&ryWV࿘%$asjw>P ۦ*d'T㩫۬G$QװS{3nctV#b\GjcHM!pHUFpi_:T>Ve\΂EPC2GZ!F3_|V>6;tL$s[:vHeܣ%rsvR;`Nz:Vޝi!ymnBkXX9W֝by dT]Qae8P.Xs\-"[w.kr4?Z4'.;{{yY jx[үOskgE1r"dځ Jc?Z ݹ{ַv X}R>LҼR2p[|;I0`y,0s]slcF:ـl?QX:7^hLGWn yO,#$4pAԪQ֟|M3sɮ?;+"-rzơZX#gw'YqV!RB㎵ф^>4| 5ʖf\+=U '>*lLHR%;baWckoF>_Zn ײ-Rr`@Z%\goSZО:~*ܵ}PIzxNCyJヌ:EN~rM<ҕ0QӊBy%2ǯ,q皨3婡RBǗXL\j;ZЧ#8HcBZ\gzL,IS ?*xU s8HsSز<3c?5T iBArǨ,&BŊ+N+.}BiNd!q K:[H0^s!dX.BIڭA"sܒ$T,VŨjEz w-zRع{TlqNo>ܑNiPp*U^GS=inp7c@bV#3v ڙG="֝zNhMQ1`zc$M0'B)ǥ':M!2S+w56rJ$@&W'i?`gD}gF}iC68E ~G u`u'm=1Og_Z]=# g@9+ۃ 9 Nr3bc$UoaYN`&7؝{V-#7)"{5vV qҢUfuᛅ%H{Z$cb ژ1+֚jz"asSv'9?OJM'k c#qyzXH1tE.0G!n<Jr A =s@卬wg'ruGNڮh"*Nk4n@!pseR1JEcѺ*yș=9#9SdK@nҘx˖5,G ܚrP$5<Ǚ39zqO@ ' #$:#' R›Cb9*F3uT-i<|LgU&hi#b;{$1{dRz5ԟi3zqIju@ qԳ$q͇ե,\1⹻-A2Abz]wLÁy]N:$9iQQQԃnY:.zHﴶG鎥NIX0cQb VeLbUCc({/PprAj,ϯJ`p㿥DBz œw=o0)23bZ:3'O.6UiN,]H#3\*]'J2HgY]JZ@&ʁC*I'v{_Q[BK2==O #h,~ɦ#z8OzSӃNFilv 4dTz(N=2N> Al㚑yiT1П(ikȧK*(mdyPkl6 ?QaMLަX[*Pl]pq4|S\s7w%gOM!Ljo" I3($ a#/' :1]=PEN0s)&$XG/8NFG>.֥ʨlgYD<Ԋj<:L ɬ wU0nzݗ~&Y37 ]ΤQjfeؖEsvۘ?V0d NzӓDuՇ9MDOSsS1b^ 2uxY3t$3>7oJ$j0du3ޛ(2= T2qpA˹q[ڲ.->C+&m !rCLv#SUbH%)0=Dh0ʰ6bHɴ* GFn8+i#NLP{SmP!Aw>L͵ zV1! #1~L㸮R-;H QgF m4_O^kJkAVߺ;o/S4.ӲwJHEHo?*sdxc`^inWY0q֫4AJ2W&H[zBsS5I=i\H‘9<}*]9 ~Ǒ}9ۓqӵ"LLLi1X/$uB dJ_0A)^4 a4܌]I\pNKcSOHGEv̢n!hݛ-"]"9 bcybxzL3֍)^Tv8X`Gn|c&W#R8`˞2:ShHd H y u8a]>\ }K(Oe[㑒8ӜnG$/Rp 9#O[d֩"y|_5Y7 $6Go#cfÕ`~\;\8gegbx>B$e=In&`EK\)9#j*xsibT1(Q;&Pd ͞3TrIطp}@Q`YK9[LຕJ~n\Ҝ]'sZ@b1j4 Zd{9wpg;\9޵tf]e@ MkO5)tr[ HHlp=+Gg [^4n~!8Pz+bF}0qҒiYlbj#" F%qs׊kp[VӬ)CH Kog8"چO,`џ47wܵtЉA`q<#Wc6 RET9F}& {U; ެFivxTy= c%TZ 9zK*8Lzr0zU eGr(KQ$J&<@=H"ڥx u2/X*qڬ]+sӊVR2ԓJ%FG'("e#w,y&cF8⪴(~`FN2Xlg= LIvf96=Gk#o#w cC0bb+K;G@X؜(qg%z⥹}ț@jj]JEh~S?"lg֎BONZH,ۗ Q]Fq@>j"Uzv5`7 ;[VktOީ0(PQ#L*LL|x=v~zJDIlOLJ.hQj[ybXgr)lKp,UYLe}i̊ IsjE)/&4:7&~R:\bK<5hҫ.q>t4 23cfWp:ӂs9JXپSn7WUJ9& &GF2+W*ћ:Q!R@df@vdūBp ^ӮW'ƓMd)?C(98AT)0#u=鍴/N J'# \t=sP]Zq&)R#[LL$\Q} {+ؐQY rߑYrxl SJk[Tlj-lĊҡc 8t39,5}cQW!U{)4Oy' \@(0Gpz*5IXO9JW 7*Fv U1J<(Ӊ ]`  U%GgpWd9ߌC \`9RдĤ҈H \BaIdfRu)5Fw~#x'X!.st#>[?whuLVݷj*c<0J.~1-\1* lҍ-M&ySnҿ@GK J'XV\{ yH:3ءe@LcUc #uS UV/r*%v( \UĥjzRFZnjQkFͤiF&'gښɡ!GJc%V~TUifV͎ܿ;zqe9,9Lv,OF=B\5-5#N *Rjj8GJbPĜ+ -g**iH8 B'_:[**TDOZ @>e)19lV@W#U4Ax ǯ(bۉ\zty;J H8ܭTeI8zSKMH)l CrH8#5q>i0N0 44:98## /^G֥Pl@&D|G, r@5ePeĎ fG֋gei\/zX g |\u]6jny8~od1N!Q9*{HWvbj•`>Ԉsךv)aғ`70=3KU1ǧ+e:TR1F1'#LcJXc8M+Չ s@OJSԐ}i MgsLI<[)|ҹtEE<U2E8+v8$ӷ恉IjxI љ_)޵V H`/BFxaF9bU!AYVbktuN;mߐnl<9lqkui8EDCX+j# bc,I9o~w$[]ͦ$}eR2{戄Aw{v4лTd98ҙH;GZDXʩ9瞽h9Zpp@ӈ=7{ 8઎I$D LqHb7$?/Lm+О+qDAЈT' @)pg5j+/$TnfÎ1U됗Txow<ֺK+UfOvzcLw$?_ҝtAL5%zS (d|ETY|Kj'?ti\Ab'_J6p]ZӜuyE#`8c v4G'? ӞĔ;m'x*0#ƆQ@HDZ7 #`7K^0A{RG&*29SK9`21Z,"g'vzڣ!@!0jCcNj,:hd`N2=)nA*%#=s@1NNҀH8늉`g3@\I暙Rx:f  ޥ;H>, ^QqPs<ӗwq3`NI85 6ҀN4hO\ -8a@Pzb<ԁ79 t?Sޣ)z Tu3Q)cLD. n) R?ʣ`Q~\Ӹ`TD S-'cX`Wh-ޣ<2Qj r{jms ieh-˄p6I,I瓓Pۼm$͸zaL#lv3ެY~cJX#SnT-)fqӚ]01l;pU N98c89#H0?Zb#" ҚE'A=}n8鑚c,> 4;sU` vG#2s׏H8ON vN2;S:SIr} ,ۺ czGr,{U)'O0lv chW*s(w<ӌy9 Uvԍ Լ2qzRѨl+u'3]Ι;i~M1Ԟ ZO Ek6sڳD*;w3O9r~bIOsE3ěyEYPc~$1C?_Z eEJtN`$qJ?1zumqN4 zA{խW8gޝH+HpZ58P`zQXeε Lzb9Q#@b*qEkYxrMBfAfW8O]kgT _j^6=팶34n_qU }fY ov;z{j'ҿny"/'4ۭ2]t 8 ?@ۑUkQ,g6N;Z6À0zֶ#8H8 O_JV|.SM˂|Yj<jK|zva═6stw5Mď#ar1\2zQ~$w'+r=F񅎦&a kXWq,(H-#Ʒlʿ#R7o=^JVY|Wx:Xs%ޞխa XY<]Ju 9&Kc,刐z 先;^yYީBr˼vN&iyC,S.uZف,ua#SN$_Q襩mH03Z .#Y:%g2²⽕C,ŁUZEm(Ci/#{W;s>ɔO"em=YeJZEkz[G (v5V5RCWih?xz$9K%4P?tlDʒ[G=36p}ϕ#aЊVe^ն}wjIgrT1늌AT@n2=hSR+ `{У'LT >XP@MIs8+.Hǥ0&ѐ>'Ҥ,#1)'=<K ٥$nR o =ZP39K%Ig"?}OV_LU< ;{c:1q,Kd ޙktGjr[΀⠞ehK[-nd>UPyM%qNvrqN"఍)]gfgdalautotest-3.0.4/gdrivers/data/rgb.ntf0000644003401500001440000002036013614004466017656 0ustar rouaultusersNITF02.1005BF01GDAL 20021216151629 U 00000000000 00000000843200040400100052800000075000000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000005000000050INTRGB VIS 08RG225557S0445025W225557S0444007W230615S0444007W230615S0445025W0NC3R N 0G N 0B N 00B00010001005000500800100000000000001.0 0000000000 PxfbfJMolGPRNTY\%jybccbRRZlX^NRh^Z^ts`YR^ZTZUWSP\W_`Q Do}ka|]YWW_cSVTST3MONSHsdeiffReZ`Z]TXSVLRPWWEmihbkq]ZgGC[OUUTDZT@KTPgsil^odTujf]T]\ZMZSMMKU.pong`lcTMVT|\QSNHSYN\WJUHnhqcYZaS`GH`\RZSWHTMRXIUTTdMOLMWjMbWoAXbgJSVOXVQUXl]\TW]cfY\RMUSUbVVR[MPd[R^ZN\RCUWQOQSYLRNPUZVLMTeZJWXIWQVVW[T[^Z\ZX`[QZSI-XZR%JGTKVOPQYXYWXUWk~tUaNO=ZNU:N[UkXVI>YOT\BREFRZ\U\d`tv=NY^MVV\?HJfXYKWSP]J\NM`P[Z[ZVn[URtTUOFYSVNTTYHUORNTKTURSYT[cd]\EVFJU|pVzvLYTLZTOU\ZHRZ`JLsSXmUXsVNkaLGrmfUMW]_[bbg@dX1:X|bn^F?orS%qbcL>_SrHJWbh]^X@MB?X\n.6RedE2*Vo\lxHWGgqd_`HTO@AnY][UYq^ynLjrbifh^SSRSXRTdQIX@lhJKaZoUOFV6Fezq_ddOLNQKMMQOPVPSZOKVV^EUaoKBbv niPr`ONkfPMY[XRtuoai_Zcg_hsiTX:?SRxvysiSZ^gW~jYR`s=1Fhrgu~|{ynv{uj\0gi0Aprmmj][PlL~WhHS3nos~xnz||jrsMrq_lq|khZ_Q/Icpd_LkbP2Ed]cV[HOTz^qtg_cd^JLQ\SMWazvrm6"nnhcVISSOOofV3VRHTB<_hhionpukjv`]SLV#/yi`ffgsbZW48^b}ijtqX7akhoipojsz}zY&KpVHWWIe\]n_1+CYjpwioM<`kikarnpptn8SRq]]VMPUOfKeyjPOvBPbUdbTGAgclerk_\B2[HiLXFF>Acs;3K^VGdSOc*GMTnUVovmRpjeojxT]VHkrqp{x|Wmojqi|xxptOvnvUhhd7ofKn__`hjucte_e`msptqWox~uhmnfAg]TYmsHUlv|xjoixrp~~mlg&+"Cy{u|gdA}q>Nbmruwg}tqqkaGohos{}]N8HRtlgqyiBPK@S^z}ysh Wswinclrp|&ntv{wz{pvfvsn|{wz|xr~}KxytwwxzvyyxxWtxw|Tv|py{x}syyL|{|yjhw}zyi}gr}y t{s|t}ttr|5{voxxv{xp{xq|R|}xhjw}p|uzpypwptstpxd}rx~wzuq{}||}snxxz}}wqt&yzuxwf{}tprpvmwsty}zsq l|oz|n|tyz{~u||uy}{{s~zm7hmd5bhxoyqrt|{|zyssޏvno_~uyE^qotpbXwpxetecpx~w~yɚZp{qzzOagyzlwutnqonyx|{toc]quqj~wzpvgtfrlontmtusv|w~blVUcQg{~}|gb_GzpchcyoZdriw}}~{upz|lqxpnktohc!}ycVewmnxek{~~fz|}unnkciiz}~x^pz|wvƓтg{uxv|{xOtriF~qsxj}l|pecȚ|pqpnlitanv{ghr~hxquuspr}zd}~{yi[ s|~|vtvuJ^՟wphlv|yyhuf^Azxu}zi\Y@@yzuw{wOspyptkqe tgi|peUGOr~|H_~bohW_%vg{xp{vs~q|ml{{ytq{c\yt~iW]~la|(z}eVvfcj{hqfhT^sZLysYma]iuh~tuxj~|nq}ebwz{|{xpn~~s~\itpuxotvzvx~|{uhsab vvurp}|v|]`ux~~uq\PgY1K}pѮsgqVݴ˭KvsNg~}xhsUh~jxsy\~ndll^vtRXcSQBoe|lutU!x~{sxjQ||G9~oqij}uwwB721wyxeg`zbinz|v}W2.(|mwwqqrMuvq~qm|wuI0-6WYmuD<710TwrWOjpT;652/gktruketpaoumƠf7521,Dwjvom``WUx}jt[rsx\X?4.,+'e{adgra\^\knzMkt}{A9)(&' wuyb@/,')'l?62/,,,uL6331.C6Yڟ͔bbv˻?5340+*'Ȯ~{mXoȝt{nzC763,%# $C-,6?=";="$%(!1'1' -:4#$""(#*+"CE,6 &*"P4$$&$'."& %  "" 7&!)1+ # " R$/$*/%9.+#%$"#9),&!.$A""$!/<)4& !'' %#! %)/(7)/" &1"$#&)$* %>*$ #"#".4% ""#&$%#+&&! 764( 5H@) &!%-0%8')!- &   *(@UR@$( &". !$'%*!! 6(%!N? ! /'!  ")(!#!( $&! # %1(5$!( #!#AM=:( C7'$>#"/#2GS9!1J)" -L(!'$ $1$'!".7CW9(#! ' !>'"$, '!3%+#(|I)"#%1 &(-'7G%&+@3W|[.% -  "+(+G7=(2!,3]?  "%''''! -,++)5!' KN*&!*#/#5)"&+/AH%$&"#*(!. R?3A4,;RPf8%!*" &"( ?4Z$)D%1BGH8P$9TT53!!$%#(*3 )! 'F&2+B@ U)F:C & (5!*0!" ";'()>'JA #:/%%.( #$4! %  1')%*@r19*+.CM"-.1'$,$ 0,+ 2&.fJ?.987?2:;$M,(+,5#$';G;4:1#3/1P&24.;565,J<@ ("*;$#$$(# /#7, ;775'%#)'(-+/1*)7 )C$%/ J,0("*,+;*  *I)A++21'-%+%,*%,54?;")/2%Q<*!-"$6- !04O6*4&.(),'()/<+)/441*3"#!"52A4E#Z)**b-$(+('9@*0441-3  2D #$4%%#9&"25,6+./0-&"(#-2$ '%("(-)5<8'7--./K9.4/="/743=:?33&* 3;78194+5#.@,-00,/.>)1 #++F8#=/!%&("%('05-9B)+66'/43001:!4GL6 L069:4&+!,53>+&93?3?=')>'/2552G=??;Mk/0K@ ")-2K?=B7,*: 1264033:~3P>E>CdQ1! 0B)N#,5( 1542B)5520,..gdalautotest-3.0.4/gdrivers/data/byte_corrupted.jpg0000644003401500001440000000071513614004466022131 0ustar rouaultusersJFIFC    }?gdalautotest-3.0.4/gdrivers/data/isce.slc.xml0000644003401500001440000000601613614005402020611 0ustar rouaultusers l image {'doc': 'Instance family name'} writeread ['Single look complex image.'] CFLOAT slc isce_slc isceobj.Image createCoordinate First coordinate of a 2D image (witdh). 14.259166666666667 0.0008333333333333334 {'doc': 'Coordinate quantization.'} {} ImageCoordinate_name {'doc': 'Instance name'} ImageCoordinate {'doc': 'Instance family name'} 5681 {'doc': 'Coordinate size.'} 1 isceobj.Image createCoordinate Second coordinate of a 2D image (length). 38.22083333333333 -0.0008333333333333334 {'doc': 'Coordinate quantization.'} {} ImageCoordinate_name {'doc': 'Instance name'} ImageCoordinate {'doc': 'Instance family name'} 26624 {'doc': 'Coordinate size.'} 12 10 BIP image_name {'doc': 'Instance name'} Release: 2.0.0_201410, svn-1651, 20141103. Current: svn-exported. gdalautotest-3.0.4/gdrivers/data/LanduseSmall.tbt0000644003401500001440000000130413614004466021467 0ustar rouaultusers[Ilwis] Description=Table with land use information Time=991346400 Type=Table DataReadOnly=no PropertiesReadOnly=no [Table] Domain=LanduseSmall.dom DomainInfo=LanduseSmall.dom;Byte;class;12;; Columns=1 Records=12 Type=TableStore [TableStore] Data=LanduseSmall.tb# Type=TableBinary StoreTime=991346400 Col0=Landvalue [Col:Landvalue] Description=Average value of the land per hectare Time=991346400 Domain=value.dom DomainInfo=value.dom;Long;value;0;-9999999.9:9999999.9:0.1:offset=0; Range=0:10000:offset=0 ReadOnly=No OwnedByTable=No StoreType=Int Stored=Yes Type=ColumnStore DataReadOnly=no PropertiesReadOnly=no MinMax=50:1000 NrDepObjects=0 [TableView] StatPaneVisible=Yes RecordView=No ButtonWidth=25 gdalautotest-3.0.4/gdrivers/data/fake_grid_cell0000644003401500001440000000074013614004466021230 0ustar rouaultusers 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.0.4/gdrivers/data/real.rst0000644003401500001440000000334413614004466020053 0ustar rouaultusersCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCzCqCCCCCCC{CCCCCCCCCCCCCsCuCCC|CyCwCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCyCuCCCCCCCCCCCCCCCCCCCiCcCkC{CCsCnCCCCCCCCCCCCCCCCCCCCjCfCCCCCCCCCCCCCCCCCCCC~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC|CCCCCCCCCCCCCCCCCCCCCCCCCCCCCgdalautotest-3.0.4/gdrivers/data/39109h1_truncated.dem0000644003401500001440000004332313614004466022055 0ustar rouaultusers39109h1_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.0.4/gdrivers/data/rgbwcmyk01_YeGeo_kakadu.jp20000644003401500001440000000536313614004466023414 0ustar rouaultusers jP ftypjp2 jp2 Gjp2hihdrd colrres resd2e2e0uuidK=KCզII* (  '_n@n@zA݊PA &i  )#IMAGINE GeoTIFF Support Copyright 1991 - 2001 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: egtf.c $ $Revision: 1.9.2.9 $ $Date: 2002/10/28 15:14:13EST $ Projection Name = NAD_1983_UTM_Zone_18N Units = meters GeoTIFF Units = meters|IMAGINE GeoTIFF Support Copyright 1991 - 2001 by ERDAS, Inc. All Rights Reserved @(#)$RCSfile: egtf.c $ $Revision: 1.9.2.9 $ $Date: 2002/10/28 15:14:13EST $ UTM Zone 18N Ellipsoid = GRS 1980 Datum = NAD83|jp2cOQ/ d dR \ PXX`XX`XX`XXXPPXdKakadu-v6.1.1dYKdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes) -256.0, 1.9e+03  & ^ËjߚPp W'4{vok~xFsͥ RT`6dmQN߬nSO|;UG> Zߠ+@j~tKhf&jjNm6VG l"(`hX뵤V1|jbwۢ2&~(Ð6,'-v@ VJ"alLA.̴!n>xKy]v;'q.%4 Dn]'fЧͨ) U'(#J Ia@p`*E"p5!} L c0dieFʬjQ<, E[ )>-upe##<0 1\l t]( do>\8wlr 0/@\F ^)_F,zĸ8=ŸZSZ/y1 A!O侶lbM!I_|ruG ,u|f{Ħ>SDu!ȞAjCW :V:X6ET~MAhm+NU4c3~Ke`±FP@bwȒoRO+l)\%*{b0v掹K^RKΔ<>xfIv6F5-unuH91vWHbI, l&Ohrlo N0XlgJ js8y1ZE'!*oJc%I l%//Wm. !q9 F5-W0ͽPP.4A#>=V)CEUOԩ˵NGz|f_#lb@-eߛXh$ap~_7 a)vH@Lߴ/i`_1OuSDB'&nH[L/)yK^Pq/)yK )yK^R|FѪ)xDbdv`ض-W:/)yK㑔/)yA/)yK^O~ljĆuIW<q[u|7|7ʹl6 al6 rgbsmall.tif 1 gdalautotest-3.0.4/gdrivers/data/dimap/METADATA.DIM0000644003401500001440000002160713614004466021205 0ustar rouaultusers DIMAP SPOTSCENE_1A SCENE 4 048-261/5 01/11/29 10:30:38 1 M COPYRIGHT CNES 29 11 2001 10 H 30 MN 38 S JPEG JPEG +4.3641728203e+00 +4.4208225461e+01 1 1 +5.1937875606e+00 +4.4105080365e+01 1 6000 +5.0277057238e+00 +4.3579069851e+01 6000 6000 +4.2053233519e+00 +4.3681541962e+01 6000 1 +4.7036149861e+00 +4.3893572795e+01 3000 3000 +9.7694940432e+00 EPSG EPSG:4326 GEOGRAPHIC WGS 84 POINT 1 +4.3641728203e+00 +4.4208225461e+01 +0.0000000000e+00 +1.0000000000e+00 +1.0000000000e+00 +5.1937875606e+00 +4.4105080365e+01 +0.0000000000e+00 +6.0000000000e+03 +1.0000000000e+00 +5.0277057238e+00 +4.3579069851e+01 +0.0000000000e+00 +6.0000000000e+03 +6.0000000000e+03 +4.2053233519e+00 +4.3681541962e+01 +0.0000000000e+00 +1.0000000000e+00 +6.0000000000e+03 +4.3640990841e+00 -2.6643496819e-05 +1.4239355527e-04 -2.0095394654e-10 +2.6521261246e-11 -6.8487943015e-10 +4.4208332836e+01 -8.7782663961e-05 -1.7179784977e-05 +1.8702677440e-11 -2.2187479777e-12 -2.3351749623e-12 +4.8824220362e+05 -1.0726214269e+04 -2.4451593111e+03 +3.4503454414e+01 -4.6856166478e+00 -4.6341833825e+01 +8.1566060357e+04 -3.9051709585e+03 +1.6206098799e+04 -2.5694309455e+02 +3.3634380699e+01 +2.1990286174e+02 1 1 1 255 SATURATED 1 1 1 0 NODATA 0 0 0 131299101 SCENE1A Spot SYSTEM SCENE level 1A SPOT_IMAGE 2005-05-12T17:24:33.000000 CAP_T 07-01 SLS_TOULOUSE SCENE 40482610111291030381M SCENE HRVIR1 M 048261 5 2001-11-29 10:30:43 SPOT 4 HRVIR 1 M 1A -1.9977978043e+01 +1.6508350907e+02 +2.3545636152e+01 298 DPCM DT Y FULL 33 6000 6000 1 8 UNSIGNED I NONE BAND_COMPOSITE GEOTIFF NONE 1A RAW SYSTEM 1 0 255 3000 1 PAN equivalent radiance (W.m-2.Sr-1.um-1) 0.000000 4.357726 2001-10-01T00:00:00.000000 gdalautotest-3.0.4/gdrivers/data/trmm-2x2.nc0000644003401500001440000000376013614004466020312 0ustar rouaultusersCDF  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.0.4/gdrivers/data/trmm-wgs84.tif0000644003401500001440000002161613614004466021035 0ustar rouaultusersII*((  (S    6 v   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$#  mtr@@TXAWGS 84|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.0.4/gdrivers/data/rgbsmall_with_line_break.kap0000644003401500001440000001156713614004466024112 0ustar rouaultusers!Copyright unknown VER/2.0 BSB/NA=UNKNOWN,NU=999502,RA=50,50,DU=254 KNP/SC=25000,GD=WGS84,PR=Mercator PP=31.500000,PI=0.033333,SP=,SK=0.000000,TA=90.000000 UN=Metres,SD=HHWLT,DX=2.500000,DY=2.500000 RGB/1,112,120,56 RGB/2,56,72,32 RGB/3,44,64,8 RGB/4,0,16,0 RGB/5,104,168,40 RGB/6,88,112,16 RGB/7,124,176,48 RGB/8,104,136,56 RGB/9,80,136,16 RGB/10,40,80,0 RGB/11,132,152,72 RGB/12,80,84,32 RGB/13,80,100,40 RGB/14,88,136,56 RGB/15,72,120,8 RGB/16,116,128,76 RGB/17,128,168,56 RGB/18,120,144,56 RGB/19,72,96,32 RGB/20,136,160,64 RGB/21,88,104,48 RGB/22,16,24,0 RGB/23,120,144,40 RGB/24,192,208,144 RGB/25,104,120,32 RGB/26,80,120,16 RGB/27,80,120,32 RGB/28,104,136,24 RGB/29,72,128,16 RGB/30,24,60,44 RGB/31,104,152,48 RGB/32,8,32,40 RGB/33,0,0,0 RGB/34,104,120,48 RGB/35,88,112,40 RGB/36,116,152,64 RGB/37,44,72,52 RGB/38,88,88,40 RGB/39,148,156,72 RGB/40,60,104,52 RGB/41,104,160,32 RGB/42,64,112,0 RGB/43,96,128,48 RGB/44,56,104,0 RGB/45,32,40,4 RGB/46,56,88,0 RGB/47,152,176,84 RGB/48,128,140,76 RGB/49,128,144,48 RGB/50,56,88,16 RGB/51,80,96,24 RGB/52,80,112,24 RGB/53,152,160,112 RGB/54,32,68,0 RGB/55,112,136,40 RGB/56,120,160,40 RGB/57,148,164,64 RGB/58,72,96,8 RGB/59,64,96,16 RGB/60,128,160,80 RGB/61,64,104,24 RGB/62,16,48,48 RGB/63,88,128,40 RGB/64,96,136,40 RGB/65,16,16,8 RGB/66,68,76,32 RGB/67,100,144,68 RGB/68,124,136,64 RGB/69,112,152,56 RGB/70,56,96,8 RGB/71,88,136,32 RGB/72,168,200,116 RGB/73,24,60,24 RGB/74,56,100,16 RGB/75,48,72,0 RGB/76,108,172,32 RGB/77,112,176,44 RGB/78,80,92,48 RGB/79,104,144,40 RGB/80,60,76,16 RGB/81,64,80,48 RGB/82,112,136,64 RGB/83,96,124,56 RGB/84,120,164,64 RGB/85,72,112,16 RGB/86,8,8,0 RGB/87,44,48,12 RGB/88,112,160,48 RGB/89,88,152,24 RGB/90,96,152,32 RGB/91,124,188,44 RGB/92,48,96,0 RGB/93,120,152,76 RGB/94,56,80,8 RGB/95,184,204,132 RGB/96,96,112,32 RGB/97,68,84,24 RGB/98,120,152,48 RGB/99,28,64,32 RGB/100,120,160,56 RGB/101,112,152,40 RGB/102,100,124,68 RGB/103,96,160,40 RGB/104,96,144,24 RGB/105,96,120,24 RGB/106,104,128,40 RGB/107,84,104,12 RGB/108,80,128,24 RGB/109,96,108,64 RGB/110,68,80,8 RGB/111,144,196,84 RGB/112,128,160,48 RGB/113,128,176,64 RGB/114,128,132,56 RGB/115,116,140,72 RGB/116,64,104,8 RGB/117,112,144,48 RGB/118,16,40,40 RGB/119,96,128,32 RGB/120,84,124,56 RGB/121,28,48,48 RGB/122,96,120,40 RGB/123,112,164,56 RGB/124,132,176,80 RGB/125,148,156,84 RGB/126,96,160,28 RGB/127,16,48,32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D##+=44GG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-D##?i??44@G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#r##4??i4?#@@!!!!!!!!!!!!!!!!!!!!!!!!!!!BRD"``?@ii.!!!!!!!!!!!!!!!!!!!!!!!!!! }"j7w7????i?4??!!!!!!!!!!!!!!!!!!!!!!!!!!BS7uwi7U:??iU?l=4!!!!!!!!!!!!!!!!!!!!!!!!!0u77?E@?w?4?4!!!!!!!!!!!!!!!!!!!!!!!!!77wi4?4U???4 !!!!!!!!!!!!!!!!!!!!!!!!!Qju???@?:U?w?l?Ui?U !!!!!!!!!!!!!!!!!!!!!!!!!#7U444?7U@it?7U?? !!!!!!!!!!!!!!!!!!!!!!!!#u?@l?G@7??4#@??44 !!!!!V!!!!!!!!!!!!!!!!!!-f#@??:li444444 !!!!!!!!!!!!!!!!!!!! +4Ui4ii??i?#w?##4!!!!!!!!!!!!!- =?U44??4# $@44F?4!!!!!!!!!!!!!N"###="?t#=:4wi?jzD}_}$:4#?4?!!!!!!!!!!!!B:+#?4?Uw44?4i4# N]R#4U?4!!!!!!!!!!!!#U4444?+7w?:#a ^#?www;;;!!!!!!!!!!!P"#4:=:4::U?@?##D0 ??UUU==!!!!!!!!!!?@@ iU.=447:Uw }" ?????4U4U;+=!!!!!!!!!!0#l?lGw?:7zj"D_ =?l4?# =!!!!!!!!!!??4j7j7U?# 5  ??44U4U=?,4#"!!!!!!!!!!!U7'jki??$"05  @44?F?=2!!!!!!!!!!!!#?li79 ju#"& 5R4t4??t??==!!!!!!!!!!!+747e7jUF20#w 4il@U==!!!!!!!!!!!"?p)w77 Uz4:= ?lGG@ ;?GlF4U.2!!!!!!!!!!}p98ui/}Hr=?4##4@GUl@Z$lG|##$#!!!!!!!!!!!"'''/:a}}7"4?@@G@=Z?.2?|Z@4=$$!!!!!!!!!!!-}'?jU.zk:=?@G@Gt4ttGGE ,)Z. $?!!!!!!!!!!Dn#:7?.k"?=?U?G4=ZG*UG?@#?$H!!!!!!!!!!!7kj/@?l?lli4?*lZGGl4?F=Z!!!!!!!!!!V5/'r7@@44G GlGGGGZ,4J;+ !!!!!!!!!!//91j7@4??{{)ZYZ)Zl?.;#!!!!!!!!!!!D18eiG@?<#+$; {)q8?\"!!!!!!!!!Pee))eGG4_5&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >2!!!!!!!Q _7<s{q/ " 2UioLo)* *i81uC>>> gdalautotest-3.0.4/gdrivers/data/i_6130a_truncated.ntf0000644003401500001440000001535213614004466022224 0ustar rouaultusersNITF02.1006BF01I_6130a 20041123010102Test functions of overflow "RSM TREs for NITF2.1 dated 07/23/04". U 00000000000JITC FT HUACHUCA (520) 538-5494 000000006890000417001000442000000000100000000000102090000058210000000000000IMGrayPix 20041017010101 GrayPix w/BAE RSM FrameSet 1 of 13Oct04. U 0Unknown 0000000100000001INTMONO VIS 08R 0NC1M N 00B00010001000100010800100000000000001.0 0000000003001DETRE_OVERFLOW 01U IXSHD 0010000RSMDCA010172_8 1101222272-2 1101222272-1 06001000062_8 06-2.42965895449297E+06-4.76049894293300E+06+3.46898407315533E+06+8.90698769551156E-01+2.48664813021570E-01-3.80554217799520E-01-4.54593996792805E-01+4.87215943350720E-01-7.45630553709282E-01+0.00000000000000E+00+8.37129879594448E-01+5.47004172461403E-01 010203040506 +5.77388827727787E+04+2.60049315375747E+03+3.19928338117848E+03-1.31174811541913E+00+2.20596677933116E+01-2.84031890108660E+00+5.11824419774739E+04+1.11777635517993E+03-1.93235228164728E+01+1.74818259318562E+00+7.06800879909857E+00+1.75094830424667E+04-1.51827591855326E+00+2.88288601417383E+00-3.57854210117485E-01+9.21252244533737E-03-1.05784554995790E-03-3.62502042683891E-03+1.04702372207584E-02-1.05046419207449E-03+1.14369570920252E-02RSMECA020582_8 1101222272-2 1101222272-1 YN060701 -2.42965895449297E+06-4.76049894293300E+06+3.46898407315533E+06+8.90698769551156E-01+2.48664813021570E-01-3.80554217799520E-01-4.54593996792805E-01+4.87215943350720E-01-7.45630553709282E-01+0.00000000000000E+00+8.37129879594448E-01+5.47004172461403E-01 010203040506 07+1.00000000000000E+04+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E+04+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E+04+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E-02+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E-02+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E-02+0.00000000000000E+00+1.00000000000000E-0212+1.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00+1.00000000000000E-07-1.00008176833852E+00-1.11437111194167E-05-2.10928468971611E-04+5.63463890093240E+02+2.10378945726364E+03-2.41578874722478E-01+1.74077554574873E+02+1.31005883607607E-05-9.99948437979009E-01-1.72134893831482E-04-1.91914100398291E+03+6.18659653597604E+02-2.05410691498182E-01+2.29140321587218E+02-1.88000374720331E-05+1.33640873294927E-05-9.96994960856037E-01+6.54111494045653E+01+6.28462636194570E+01-7.12623476845529E-01+8.65286410729262E+02+8.15131122853020E-10+5.09474138589725E-09+1.98482385443210E-07+8.89408128622832E-01-2.82198392231150E-01-3.58263953168625E-02-2.22004330300662E-01+7.69281402473103E-09+5.64817629532889E-11-2.27099775858959E-07+2.48154450641811E-01+9.61895506456725E-01+2.26849271978781E-02+2.44306094490897E-01+4.71499538150666E-09+3.43903372974882E-09+5.91159234969748E-09-3.79954994290064E-01-3.23458982189980E-02+9.99096719019677E-01-9.45517636383226E-03RSMIDA016282_8 1101222272-2 FRAME 19700101000000.000000 R-2.42965895449297E+06-4.76049894293300E+06+3.46898407315533E+06+8.90233155120443E-01+2.50327118321895E-01-3.80553890213932E-01-4.55502457571841E-01+4.86367706250322E-01-7.45629911861651E-01-1.56226448294838E-03+8.37127701219746E-01+5.47005275276417E-01+3.60917770743581E+01-2.28824840001127E+01-9.99992874460703E+02+5.18884362473253E+03-2.87450036723962E+01-1.00211587769373E+03+3.79919348686812E+01+4.59734548268640E+03-1.00166489059808E+03+5.01402740997898E+03+4.85440104533856E+03-1.00381011450997E+03-3.60920649717823E+01+2.28826665274178E+01+1.00000085119816E+03+1.88541350122103E+03+2.07081675817197E+01+9.99720731314608E+02-3.53972599523443E+01+1.74601545186290E+03+9.99761368681871E+02+1.81960288385246E+03+1.84110851608994E+03+9.99477441903243E+02 00000000000092920000000000009122 RSMPCA010742_8 1101222272-2 001001+3.98498860405865E-09+3.63668781918539E-09+4.64600000000000E+03+4.56100000000000E+03+2.65571142640788E+03+2.40732324869712E+03-2.33161661728923E+00+5.59920000000000E+03+5.49720000000000E+03+3.11793659470231E+03+2.96084811268529E+03+1.00233148808220E+03111008+4.63481151803541E-01+1.47720153582094E+00+2.45032267644299E-02+0.00000000000000E+00+3.89362443002779E-01+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00111008+1.00000000000000E+00+5.02862720499332E-02-3.02226608403966E-02+0.00000000000000E+00-4.48001662401358E-01+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00111008+3.66773732052461E-01-3.99759610583925E-02+1.49479106149881E+00+0.00000000000000E+00+3.60340008196375E-01+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00111008+1.00000000000000E+00+5.02862720498340E-02-3.02226608402894E-02+0.00000000000000E+00-4.48001662401429E-01+0.00000000000000E+00+0.00000000000000E+00+0.00000000000000E+00gdalautotest-3.0.4/gdrivers/data/wcs/0000755003401500001440000000000013614005406017161 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.1.tiff0000644003401500001440000000340413614004466023550 0ustar rouaultusersII*S : R$ S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 4@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.0.0-scaled.tiff0000644003401500001440000002227213614004466023713 0ustar rouaultusersII*<--S J b$ $c WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 Undefined Undefined Undefined Đ@q@AYA#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|                               `46T23Q!R  &"U Qdlh95l2/}o%,)sh % X&l&%a+ w                               MP(%`-.N..XYM #0-S  a1 u#6ZRv:>Z u**[%k2%u                Y[9            XV'j<9i40nk` &*!`  d){=/!X`/1&A=`3#V                                /.aQ56P& ZZ&a  ! D@u(R v " K49]d Z`g4#FD'c                              &%^;;&# &("Z&Z'a &!Y):&ik"n!o_(-2=M(!f)'c-x"`42t                               <A\)q$#    & " I"]1'$ dh&1 ].*S2/W3&)x)M* ++1(u#\6Kn'c N**                  ""y,([Z" # &' *-!hD>&!N-)d+&^(h u#jJB}-RR]1 85T+ & lm(u??a v#U1!                      (w&Q 22! ! # %'D!^!6,'(%p&daM,#k"V ABAq-!qF@q0+Y, .#fC"=9n-*_#-G.!             amd )%       #U\;  $\35T c'T&,+Qa+)hCB8|+#Z3 ) h,Pd.$e/* *                )u]e8      1&<]CC<! )(  %B(&   0MQF # W^K (* " %# 1#) 6"  K=y     %}f 76^  &} s0'n  >-` 2&w h  8%  ! " % ! 0+6(,C# 2          "U{!V :6j '|  3'N*z  #r  %y#6#hlA4T;;S% % ' 3!#c%        "Q&d     )t:&*, 73C? +x, ,        $X          -.L!YQ#    LPJ.%;5i ' { %g%3 $0"H v BC  "NMKQL%#Z        T'#a   ^c93(w85o1,. &k ' #   *w)A  # %m    X   ++OE&$W          $ )$`   "r"m9$i,0 .4    +* H8}e#:%)h%|        " &H9K D@u l  `+#r"m   d(  k( (  ;*H S      46Q 11T%)%a!t          z G TC:* y r o   ) n )$cU          &m);!w z v[#(h    g  !3   x -*n                  A6~-{   t" ! * ,  b"FK^2& t 66]e            #UQI{    })  =3`)!.,z EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 GRAY_INDEX 0 255 GRAY_INDEX 1Ԕ@^y?*@iHAMqYA((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|                       gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-2.0.1-non_scaled.tiff0000644003401500001440000000446213614004466024511 0ustar rouaultusersII*(S   HHjq?jq?#@TpxADG@gdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman2-2.0.1-non_scaled.tiff0000644003401500001440000000061413614004466024410 0ustar rouaultusersII*?$ RS   .n@@7C+R@IcTA# y )#WGS 84 / UTM zone 33N|WGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/requests.pl0000644003401500001440000003633613614004466021411 0ustar rouaultusersuse strict; use warnings; use v5.10; use XML::LibXML; # args: server name (or all_servers), # version (or all_versions), # test_scaled, test_non_scaled, or test_all # clear_all: remove all XMLs and TIFFs # say, say_all (optional debugging) my %do = map {$_ => 1} @ARGV; $do{say} = 1 if $do{say_all}; my $cache = 'wcs_cache'; my $size = 60; my $first_call = $do{clear_cache} ? 1 : 0; my @not_ok; my $setup = get_setup(); my $swapped = { 2393 => 1, 3047 => 1, 4326 => 1 }; my $parser = XML::LibXML->new(no_blanks => 1); my $coverage_param; my %urls; # to collect the URLs, WCSDataset::GetCoverage must print it out for my $server (sort keys %$setup) { next unless $do{$server} || $do{all_servers}; for my $i (0..$#{$setup->{$server}->{Versions}}) { my $v = $setup->{$server}{Versions}[$i]; my $version = int($v / 100) . '.' . int($v % 100 / 10) . '.' . ($v % 10); next unless $do{$version} || $do{all_versions}; my $coverage = $setup->{$server}{Coverage}; $coverage = $coverage->[$i] if ref $coverage; if ($version eq '1.0.0') { $coverage_param = 'coverage'; } elsif ($version =~ /^1.1/) { $coverage_param = 'identifiers'; } else { $coverage_param = 'coverageid'; } my $gc = "GetCapabilities-$server-$version.xml"; my $dc = "DescribeCoverage-$server-$version.xml"; if ($do{clear_all}) { unlink($gc, $dc); } # download GC and DC unless they exist my $url = $setup->{$server}->{URL}; my $gc_request = "$url?SERVICE=WCS&VERSION=$version&REQUEST=GetCapabilities"; unless (-e $gc) { system "wget \"$gc_request\" -O $gc" } my $dc_request = "$url?SERVICE=WCS&VERSION=$version&REQUEST=DescribeCoverage&$coverage_param=$coverage"; unless (-e $dc) { system "wget \"$dc_request\" -O $dc" } my $options = $setup->{$server}{Options}; $options = $options->[$i] if ref $options; $options .= " -oo CACHE=$cache"; # test that the origin of the 2 x 2 non-scaled piece obtained with gdal_translate # is the top left boundary of the BBOX in DC # tests implicitly many things test_non_scaled($server, $version, $dc, $coverage, $options) if $do{test_non_scaled} || $do{test_all}; # test that the width of the scaled piece obtained with gdal_translate # is what it was asked # tests implicitly many things test_scaled($server, $version, $coverage, $options) if $do{test_scaled} || $do{test_all}; # test range subsetting with 2.0.1 test_range_subsetting($server, $version, $coverage, $options) if $do{test_range_subsetting} || $do{test_all}; # test dimension subsetting with 2.0.1 test_dimension_subsetting($server, $version, $coverage, $options) if $do{test_dimension_subsetting} || $do{test_all}; } } if ($do{urls}) { open(my $fh, ">", "urls"); for my $key (sort keys %urls) { for my $test (sort keys %{$urls{$key}}) { say $fh $key,' ',$test,' ',$urls{$key}{$test}; } } close $fh; } if (@not_ok) { say "Failed tests were:"; for my $fail (@not_ok) { say $fail; } } else { say "No failed tests."; } sub get_setup { return { SimpleGeoServer => { URL => 'https://msp.smartsea.fmi.fi/geoserver/wcs', Options => [ "-oo INTERLEAVE=PIXEL ", "-oo INTERLEAVE=PIXEL -oo OuterExtents", "-oo INTERLEAVE=PIXEL -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 INTERLEAVE=PIXEL ", "-oo INTERLEAVE=PIXEL -oo OuterExtents -oo NoGridAxisSwap", "-oo INTERLEAVE=PIXEL -oo OuterExtents -oo NoGridAxisSwap", "-oo INTERLEAVE=PIXEL -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 => [qw/GREEN_BAND BLUE_BAND/] }, GeoServer => { URL => 'https://msp.smartsea.fmi.fi/geoserver/wcs', Options => [ "-oo INTERLEAVE=PIXEL", "-oo INTERLEAVE=PIXEL -oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo INTERLEAVE=PIXEL -oo OuterExtents -oo BufSizeAdjust=0.5 -oo NoGridAxisSwap", "-oo INTERLEAVE=PIXEL -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 INTERLEAVE=PIXEL ", "-oo INTERLEAVE=PIXEL -oo NrOffsets=2", "-oo INTERLEAVE=PIXEL -oo NrOffsets=2", "-oo INTERLEAVE=PIXEL -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] }, beta_karttakuva => { URL => 'https://beta-karttakuva.maanmittauslaitos.fi/wcs/service/ows', slice => 'time(1985-01-01T00:00:00.000Z)', Versions => [201], Coverage => 'ortokuva__ortokuva', Outsize => "-outsize $size 0", Projwin => "-projwin 377418 6683393.87938218 377717.879386966 6683094", Options => [ "-oo INTERLEAVE=PIXEL", ], } }; } sub test_dimension_subsetting { my ($server, $version, $coverage, $options) = @_; return unless $setup->{$server}->{Dimension}; return unless $version eq '2.0.1'; my $o = "$options -srcwin 0 0 2 2"; if ($first_call) { $o .= " -oo CLEAR_CACHE"; $first_call = 0; } my $url = $setup->{$server}->{URL}; $url .= "?version=$version&coverage=$coverage"; $url .= "&subset=$setup->{$server}->{Dimension}"; my $result = 'x.tiff'; my $cmd = "gdal_translate $o \"WCS:$url\" $result 2>&1"; say $cmd if $do{say}; my $output = `$cmd`; say $output if $do{say_all}; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /URL=(.*)/) { my $key = 'dimension_subsetting'; $key .= '2' if $urls{$server.'-'.$version}{$key}; $urls{$server.'-'.$version}{$key} = $1; } } } sub test_range_subsetting { my ($server, $version, $coverage, $options) = @_; return unless $setup->{$server}->{Range}; return unless $version eq '2.0.1'; my $o = "$options -srcwin 0 0 2 2"; if ($first_call) { $o .= " -oo CLEAR_CACHE"; $first_call = 0; } my $url = $setup->{$server}->{URL}; $url .= "?version=$version&coverage=$coverage"; my $range = join(',', @{$setup->{$server}->{Range}}); $url .= "&rangesubset=$range"; my $result = 'x.tiff'; my $cmd = "gdal_translate $o \"WCS:$url\" $result 2>&1"; say $cmd if $do{say}; my $output = `$cmd`; say $output if $do{say_all}; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /URL=(.*)/) { my $key = 'range_subsetting'; $key .= '2' if $urls{$server.'-'.$version}{$key}; $urls{$server.'-'.$version}{$key} = $1; } } } sub test_non_scaled { my ($server, $version, $dc, $coverage, $options) = @_; # load the DC my $dom = $parser->load_xml(location => $dc); my $doc = $dom->documentElement; my $xc = XML::LibXML::XPathContext->new($doc); my $wcs; if ($version eq '1.0.0') { $wcs = $doc->lookupNamespacePrefix('http://www.opengis.net/wcs'); } elsif ($version =~ /^1.1/) { $wcs = $doc->lookupNamespacePrefix('http://www.opengis.net/wcs/1.1'); $wcs //= $doc->lookupNamespacePrefix('http://www.opengis.net/wcs/1.1.1'); } else { $wcs = $doc->lookupNamespacePrefix('http://www.opengis.net/wcs/2.0'); } unless ($wcs) { $wcs = 'wcs'; my $ns; for my $n ($doc->getNamespaces) { $ns = $n->value unless $n->name =~ /:/; } $xc->registerNs($wcs, $ns); } die "WCS namespace undefined." unless defined $wcs; my @low; my @high; my $crs; # grab the CRS and BBOX from the DC if ($version eq '1.0.0') { $crs = $xc->find("//$wcs:nativeCRSs")->get_node(1); $crs //= $xc->find('//gml:Envelope/@srsName')->get_node(1); $crs = $crs->textContent; my @o = $doc->findnodes('//gml:Envelope/gml:pos'); @low = split(/\s/, $o[0]->textContent); @high = split(/\s/, $o[1]->textContent); } elsif ($version =~ /^1.1/) { $crs = $xc->find("//$wcs:GridBaseCRS")->get_node(1)->textContent; my $o = $doc->find("//ows:BoundingBox[\@crs='".$crs."']")->get_node(1); @low = split(/\s/, $o->find('ows:LowerCorner')->get_node(1)->textContent); @high = split(/\s/, $o->find('ows:UpperCorner')->get_node(1)->textContent); } else { my $srs = $xc->find('//gml:Envelope/@srsName')->get_node(1) // $xc->find('//gml:EnvelopeWithTimePeriod/@srsName')->get_node(1); $crs = $srs->textContent; my $o = $doc->find('//gml:lowerCorner')->get_node(1); @low = split(/\s/, $o->textContent); $o = $dom->documentElement->find('//gml:upperCorner')->get_node(1); @high = split(/\s/, $o->textContent); } my ($epsg) = $crs =~ /EPSG.*?(\d\d+)/; my $swap = $version ne '1.0.0' && $swapped->{$epsg}; if ($swap) { unshift @low, $low[1]; delete $low[2]; unshift @high, $high[1]; delete $high[2]; } my $result = "$server-$version.tiff"; if ($do{clear_all}) { unlink($result); } my $o = "$options -oo \"filename=$server-$version-non_scaled.tiff\" -srcwin 0 0 2 2"; if ($first_call) { $o .= " -oo CLEAR_CACHE"; $first_call = 0; } my $url = $setup->{$server}->{URL}; my $cmd = "gdal_translate $o \"WCS:$url?version=$version&coverage=$coverage\" $result 2>&1"; say $cmd if $do{say}; my $output = `$cmd`; say $output if $do{say_all}; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /URL=(.*)/) { my $key = 'non_scaled'; $key .= '2' if $urls{$server.'-'.$version}{$key}; $urls{$server.'-'.$version}{$key} = $1; } } # test my $ok = 'not ok'; $output = qx(gdalinfo $result 2>&1); my @origin; my @pixel_size; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /Origin = \((.*?)\)/) { @origin = split /,/, $1; } if ($line =~ /Pixel Size = \((.*?)\)/) { @pixel_size = split /,/, $1; } } if ($do{say_all}) { say $swap ? 'swap' : 'no swap'; say "bbox = @low, @high, $crs" ; say "origin = @origin"; say "pixel_size = @pixel_size"; } # origin is x,y; low and high are OGC print $server.'-'.$version.' non-scaled '; my $eps = 0.000001; my $dx = $origin[0] - $low[0]; my $dy = $origin[1] - $high[1]; if (abs($dx) < $eps and abs($dy) < $eps) { say " ok"; } else { say " not ok ($dx, $dy)"; push @not_ok, $server.'-'.$version.' non-scaled '." not ok ($dx, $dy)"; } } sub test_scaled { my ($server, $version, $coverage, $options) = @_; my $url = $setup->{$server}->{URL}; my $result = "$server-$version-scaled.tiff"; if ($do{clear_all}) { unlink($result); } my $o = "$options $setup->{$server}->{Projwin} $setup->{$server}->{Outsize}"; if ($first_call) { $o .= " -oo CLEAR_CACHE"; $first_call = 0; } my $slice = ''; if ($setup->{$server}->{slice}) { $slice = "-oo Subset=\"$setup->{$server}->{slice}\""; } my $cmd = "gdal_translate $o $slice \"WCS:$url?version=$version&coverage=$coverage\" $result 2>&1"; say $cmd if $do{say}; my $output = `$cmd`; my @full_output; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /URL=(.*)/) { my $key = 'scaled'; $key .= '2' if $urls{$server.'-'.$version}{$key}; $urls{$server.'-'.$version}{$key} = $1; } push @full_output, $line; } $output = qx(gdalinfo $result 2>&1); my $ok = 'not ok'; foreach my $line (split /[\r\n]+/, $output) { if ($line =~ /Size is (\d+), (\d)/) { if ($1 == $size) { $ok = "ok"; } } push @full_output, $line; } say $server.'-'.$version.' scaled '.$ok; push @not_ok, $server.'-'.$version.' scaled '." not ok" if $ok eq 'not ok'; if ($ok eq 'not ok' or $do{say}) { say "==="; for (@full_output) { say "$_" if $do{say_all} || /URL/; } say "===" } } gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.1.tiff0000644003401500001440000000132013614004466021540 0ustar rouaultusersII*S  $N + NONE NONE Velmu_wcs_testi 1.1.1 3@4@(b:@S*[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.2-scaled.tiff0000644003401500001440000006074213614004466023643 0ustar rouaultusersII*<x-S    * j z   &-L OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.2 Undefined Undefined Undefined sVU?sVU? Bh#@DIVIVIV.3+[&(&"'$ !##TIVIVIV*<)@+a)'"$ !    0AinIVIV3(,=+])'!#!! #"fm 5",3+M*~(#"!! ejAM-,+=+])&#!!  1%0A /3.G*y%"!!  r"@*4D%+C*Z')#!!  "i)/HW.+H*m( !   !'*/,5+L*y($! '7P0y|FS9%O*y(! /'<,?O>+j%  ('G*x /3*-+Q'"E&,<(   1+]" !#*H'  $0)>'  +4.(h %3;-")["  @L3(##/ ΰ >)O% B 2) 6?8()x !  N=.+$5 p_T 3+gi[_gE[)YPE?N"x, SZ:+$iPJ*9E*LGHu   4W)%~|W8%?PH9=+)f)#ioD ~.=.U ev]suOlz{x)C,;C7. IZ V; 4v01f5 /!f E^g>"|TC cx k1L]1>(` ,T,3M4 e491>?7J!`ҽLB2F "IV ݑ}Y0DW8WM/6B6r$X5]\ a5D ݘɛJ~&!)0[6*V33 6x |ڗ]>EDwi/ưcz Ťd:3!4[9hs3 x ~wy Xn?f .A>'F{y{, cr)+ s9<8 ԡ N1M63{D 37k]1ف3@,( F3 1:z3 Ei3xOf!~#1.@fK^  (oq/CA38v3 AunXl8ak ֻ/  5tZovi[:;^K9J btP//,KME>J );~6 %/9@J JC6!.Y~g3.0n"(ZR*ڳ#/n\+cVo}D}*.W-8b   ]r  8> {     MC14LV]-0E Gbq  jjl to%U7g33r ueXkjBOo  ~6Aqhz {Q&+5="+"+   {E^RQVD:OU35mbk &53 ~ ݜp k(cZ7@D^(c!8L{X}|05 z&$+lN9N6; N475 EP ZCP7=6=J @6{NFL{|35N]q3V^x*5#Ir+0 y(-#,2  _?BB44 *54.L5927N  |:C9A7A;g8P"7pQhCp (3  {   ~ur`>PKR++h GK8Y!!]67?N?x592:_ ^H;)R-A7 +:Ty8Z\5 a61    ~k +1 6<%*x"'S RE J>9C!!]X8Y33yJ/1H>4%AT u39 r/7(=3[4(W0B a"K{veZ5s%    +1}xmg$'KCg' 3 D16N--j-22}7B(&&b@##_-0WD7<  # ,j 66̏vl.G2BNF    >V1*4vQS{H(E: w9` %  9A  }xxl6:zUYJP F G F4BL z&)?V3AY ZSqegp c8@9AG6?v Y6~%7s>|D ?:}#j  3kw} %*_U$&Q((fLOR3>V#. C. H..j33p@**tDC24a r174fd O:{|7bSOaz$*,2{ ] q]Qh') R?IL""^2U=MNP D X6/ EV4 C%%bUd;!(`5:SF20;,K Ic57UL9Vgw057<39H{6<5:B/1Pv3547_XQ$$l?//kU..k33u<E=5N7 D,,iOMM22~ TG)M%IP!!l\#%y02Z- |jj5.3$ 39 xs28f" i58Q WH P##g*+xA;!!_S MB NQSG**f \811n^,,u'(y3U \ FZA_v8> $&WKV5H |!-h ', "!&5:4;!.3t/8 ;mN346; "%CA+0)-Y$%t-6G18L93%NK9L EA9[U7=7AY7&'xIO a'  $* ,1#+q)/6<7= %") wl5:9A9A~-? h*+xA476<NE?<H""^4**g8>&T3402--jIR?7= >%0QDHAS=&e lw  !' 7=}7=k6A9B#,)1188AA9 &'Sp   -p7L34`G2Y F33p r k35$$bS6..m  P9EB$%w "u "y0B) 284; 3; x;E:C/J":D +17=495:"+ fS+b@35 [eX')13"$)38I8W 4WAf#$r35|),Z< +128,38>079A7.0466;UW02B:C 7@ {35 r" \Y4:Y.3166;") ;E;E  -5 (17@(4fr^n' 'D~i;g  ):C*C:T$:C9p !`0;>/[!+$4;F $+%+6;8s  [27-5 -  06 *2:D;F` k  5<9B:DaА{-55y%E:g.\4L%Z"3`_.t$ Թ YO-z/ 2Lq3+ ".tR4Z | ;N &0 1<H776*%>3(t 4y.YO:w85X̂kJ4H>ufKSj;Sɍ3,9rOrbK,4WwG 6h9U.-N7 -S&(yIY>J?9%\(?LRo&p8.}7636".9M5;4;ri{xjLLO3-e$17 Rm\qRF26&ctdfxs==) {c!aZs" 85?#c383Y9(Bonw * #/665450t< TXQnk\MBD1V!!B?=] n:53333=cʏ34 7o3@:4j1/,+.3'XRgK2QM4!lPI6[LE0A4C<3M@qs3_\Z+skW3_]Z%3WhT"34E33=82IgT3Mr4Vd5y1%_J#YRTNf_xlk3(iNO$JWej8 یb3U55B87:=qX;:;D΋x$-BG3sXNv)A2Ce|4}45W%b;>GG;3tF,D:΍{',aT32,5WkdXkeO<6,Yhb;Rlx6DXS 330 <y tD Z?NDJOQ\^st?3X0/ Θ8)om3, .qSjCOw~cNs333)33@Λ*j/34o3W ,k->M7c6.: Sm33  p33w;8ޥ32 0( `*7,+3:, toֱ3 ')    9C' f3ob$/"$   ^c1.3 /~h'2u'' /f Q^D.'34!0&Os.- 3/|f" 1 D2*)3qvhac   ldRm z &7)+C o$3}\  z..3RR I3IKK!tq XF' &)4[Gd82(:!c\^~cw39_f-H1PUBCB6E_ W{+$4 YG^acj!q ph"fs~ 3xv 9BIk.[+p"L7`7^:B88=0Y4C13ju "NOAlI.dZGM in6XG!2 -v t>FP4(b&x$x$~/YE4}  v@ %qm !}xjWSQ3WbS)8VS"װ>X*NqI3@@`w(M'Pgܧ٫%␃i "Q$ .<"!_-?$xЃIP9RQeZcg]o9a4M#.T~  %% uWnAQ)0;R/U'K +.TZ8[@3aUe#܅>PK6 f% #32\J1v}wؔ+ r&bLQO8#A yp%m C8Kygp\    3eD1E>92d$؀4JOK|{i)y*OJ{&Z O afEW7\/^s ȏ3 !$$$& ,3 3G0(!ĕzi/7i2?E/e%߂;XZ)K~-Z$4,!+/25"3  /xI-%Oe=F96WJLiy|e]LC2v9H>F"2_ )&%h33D3b`OV֋`t_VXM_W=H3_* ;J2P! ,-,"04˜1;FDAbYfZgXc^>oMV@9t q  ' 656*%mqjoIrn?vXVz~g\dTaNcK^1fl|xI BL!! ""##(3@  y [ _@H9l&|$n.`E>ODaU*)(  "#%%%#!# )33W 1d`fn}bZ^UbYcX`Rk7^ejp!"$##'$$$!'$$! && .K`ginkn_WbYbYbYcVbAZ"^n& w,))%(&#""%%"%!!!,y[W T0[LbX_VbYbYbYbY^UaNX6V$_bnx{HR(f).*,(%$#"!%% &)& ^[V3XM^V[TWN[T`W[S\QO@J5M,TZ kbIV%8?+N-N-P-j)'&$#%%%%%%%%% dil,f=w_`T`\_]^Z]YZV[V^YbYL8h6k$t*EQIV5F,-.3+?+H*Z)|&$! %%%"!!!  4))6?LSaaev`_V`YyhU6+gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-MapServer-1.1.1.xml0000644003401500001440000000717313614005402025441 0ustar rouaultusers European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean BGS_EMODNET_CentralMed-MCol 0 0 2976 3882 30.01040372 9.83125 46.18958333 22.23542659 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:method:WCS:1.1:2dSimpleGrid 9.833333335 46.187499995 0.00416667 -0.00416667 urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS Red/Green/Blue colour interpretations band bilinear nearest neighbor 1 2 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-GeoServer-2.0.1.xml0000644003401500001440000173537413614005402025307 0ustar rouaultusersWeb Coverage ServiceThis server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. WCSWMSGEOSERVERurn:ogc:service:wcs2.0.11.1.11.1.0http://www.opengis.net/spec/WCS/2.0/conf/corehttp://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0.1http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs-gridded-coverage http://www.opengis.net/spec/WCS_geotiff-coverages/1.0/conf/geotiff-coveragehttp://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coveragehttp://www.opengis.net/spec/GMLCOV/1.0/conf/special-formathttp://www.opengis.net/spec/GMLCOV/1.0/conf/multiparthttp://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scalinghttp://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crshttp://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolationhttp://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation-per-axishttp://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/nearest-neighborhttp://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/linearhttp://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/cubichttp://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsettingNONENONEFinnish Environment Institute, Marine Research CentreAri JolmaSenior Research ScientistHelsinkiFinlandari.jolma@gmail.comXMLapplication/gml+xmlapplication/gtopo30application/x-gzipimage/jpegimage/pngimage/tifftext/plainhttp://www.opengis.net/def/crs/EPSG/0/2000http://www.opengis.net/def/crs/EPSG/0/2001http://www.opengis.net/def/crs/EPSG/0/2002http://www.opengis.net/def/crs/EPSG/0/2003http://www.opengis.net/def/crs/EPSG/0/2004http://www.opengis.net/def/crs/EPSG/0/2005http://www.opengis.net/def/crs/EPSG/0/2006http://www.opengis.net/def/crs/EPSG/0/2007http://www.opengis.net/def/crs/EPSG/0/2008http://www.opengis.net/def/crs/EPSG/0/2009http://www.opengis.net/def/crs/EPSG/0/2010http://www.opengis.net/def/crs/EPSG/0/2011http://www.opengis.net/def/crs/EPSG/0/2012http://www.opengis.net/def/crs/EPSG/0/2013http://www.opengis.net/def/crs/EPSG/0/2014http://www.opengis.net/def/crs/EPSG/0/2015http://www.opengis.net/def/crs/EPSG/0/2016http://www.opengis.net/def/crs/EPSG/0/2017http://www.opengis.net/def/crs/EPSG/0/2018http://www.opengis.net/def/crs/EPSG/0/2019http://www.opengis.net/def/crs/EPSG/0/2020http://www.opengis.net/def/crs/EPSG/0/2021http://www.opengis.net/def/crs/EPSG/0/2022http://www.opengis.net/def/crs/EPSG/0/2023http://www.opengis.net/def/crs/EPSG/0/2024http://www.opengis.net/def/crs/EPSG/0/2025http://www.opengis.net/def/crs/EPSG/0/2026http://www.opengis.net/def/crs/EPSG/0/2027http://www.opengis.net/def/crs/EPSG/0/2028http://www.opengis.net/def/crs/EPSG/0/2029http://www.opengis.net/def/crs/EPSG/0/2030http://www.opengis.net/def/crs/EPSG/0/2031http://www.opengis.net/def/crs/EPSG/0/2032http://www.opengis.net/def/crs/EPSG/0/2033http://www.opengis.net/def/crs/EPSG/0/2034http://www.opengis.net/def/crs/EPSG/0/2035http://www.opengis.net/def/crs/EPSG/0/2036http://www.opengis.net/def/crs/EPSG/0/2037http://www.opengis.net/def/crs/EPSG/0/2038http://www.opengis.net/def/crs/EPSG/0/2039http://www.opengis.net/def/crs/EPSG/0/2040http://www.opengis.net/def/crs/EPSG/0/2041http://www.opengis.net/def/crs/EPSG/0/2042http://www.opengis.net/def/crs/EPSG/0/2043http://www.opengis.net/def/crs/EPSG/0/2044http://www.opengis.net/def/crs/EPSG/0/2045http://www.opengis.net/def/crs/EPSG/0/2046http://www.opengis.net/def/crs/EPSG/0/2047http://www.opengis.net/def/crs/EPSG/0/2048http://www.opengis.net/def/crs/EPSG/0/2049http://www.opengis.net/def/crs/EPSG/0/2050http://www.opengis.net/def/crs/EPSG/0/2051http://www.opengis.net/def/crs/EPSG/0/2052http://www.opengis.net/def/crs/EPSG/0/2053http://www.opengis.net/def/crs/EPSG/0/2054http://www.opengis.net/def/crs/EPSG/0/2055http://www.opengis.net/def/crs/EPSG/0/2056http://www.opengis.net/def/crs/EPSG/0/2057http://www.opengis.net/def/crs/EPSG/0/2058http://www.opengis.net/def/crs/EPSG/0/2059http://www.opengis.net/def/crs/EPSG/0/2060http://www.opengis.net/def/crs/EPSG/0/2061http://www.opengis.net/def/crs/EPSG/0/2062http://www.opengis.net/def/crs/EPSG/0/2063http://www.opengis.net/def/crs/EPSG/0/2064http://www.opengis.net/def/crs/EPSG/0/2065http://www.opengis.net/def/crs/EPSG/0/2066http://www.opengis.net/def/crs/EPSG/0/2067http://www.opengis.net/def/crs/EPSG/0/2068http://www.opengis.net/def/crs/EPSG/0/2069http://www.opengis.net/def/crs/EPSG/0/2070http://www.opengis.net/def/crs/EPSG/0/2071http://www.opengis.net/def/crs/EPSG/0/2072http://www.opengis.net/def/crs/EPSG/0/2073http://www.opengis.net/def/crs/EPSG/0/2074http://www.opengis.net/def/crs/EPSG/0/2075http://www.opengis.net/def/crs/EPSG/0/2076http://www.opengis.net/def/crs/EPSG/0/2077http://www.opengis.net/def/crs/EPSG/0/2078http://www.opengis.net/def/crs/EPSG/0/2079http://www.opengis.net/def/crs/EPSG/0/2080http://www.opengis.net/def/crs/EPSG/0/2081http://www.opengis.net/def/crs/EPSG/0/2082http://www.opengis.net/def/crs/EPSG/0/2083http://www.opengis.net/def/crs/EPSG/0/2084http://www.opengis.net/def/crs/EPSG/0/2085http://www.opengis.net/def/crs/EPSG/0/2086http://www.opengis.net/def/crs/EPSG/0/2087http://www.opengis.net/def/crs/EPSG/0/2088http://www.opengis.net/def/crs/EPSG/0/2089http://www.opengis.net/def/crs/EPSG/0/2090http://www.opengis.net/def/crs/EPSG/0/2091http://www.opengis.net/def/crs/EPSG/0/2092http://www.opengis.net/def/crs/EPSG/0/2093http://www.opengis.net/def/crs/EPSG/0/2094http://www.opengis.net/def/crs/EPSG/0/2095http://www.opengis.net/def/crs/EPSG/0/2096http://www.opengis.net/def/crs/EPSG/0/2097http://www.opengis.net/def/crs/EPSG/0/2098http://www.opengis.net/def/crs/EPSG/0/2099http://www.opengis.net/def/crs/EPSG/0/2100http://www.opengis.net/def/crs/EPSG/0/2101http://www.opengis.net/def/crs/EPSG/0/2102http://www.opengis.net/def/crs/EPSG/0/2103http://www.opengis.net/def/crs/EPSG/0/2104http://www.opengis.net/def/crs/EPSG/0/2105http://www.opengis.net/def/crs/EPSG/0/2106http://www.opengis.net/def/crs/EPSG/0/2107http://www.opengis.net/def/crs/EPSG/0/2108http://www.opengis.net/def/crs/EPSG/0/2109http://www.opengis.net/def/crs/EPSG/0/2110http://www.opengis.net/def/crs/EPSG/0/2111http://www.opengis.net/def/crs/EPSG/0/2112http://www.opengis.net/def/crs/EPSG/0/2113http://www.opengis.net/def/crs/EPSG/0/2114http://www.opengis.net/def/crs/EPSG/0/2115http://www.opengis.net/def/crs/EPSG/0/2116http://www.opengis.net/def/crs/EPSG/0/2117http://www.opengis.net/def/crs/EPSG/0/2118http://www.opengis.net/def/crs/EPSG/0/2119http://www.opengis.net/def/crs/EPSG/0/2120http://www.opengis.net/def/crs/EPSG/0/2121http://www.opengis.net/def/crs/EPSG/0/2122http://www.opengis.net/def/crs/EPSG/0/2123http://www.opengis.net/def/crs/EPSG/0/2124http://www.opengis.net/def/crs/EPSG/0/2125http://www.opengis.net/def/crs/EPSG/0/2126http://www.opengis.net/def/crs/EPSG/0/2127http://www.opengis.net/def/crs/EPSG/0/2128http://www.opengis.net/def/crs/EPSG/0/2129http://www.opengis.net/def/crs/EPSG/0/2130http://www.opengis.net/def/crs/EPSG/0/2131http://www.opengis.net/def/crs/EPSG/0/2132http://www.opengis.net/def/crs/EPSG/0/2133http://www.opengis.net/def/crs/EPSG/0/2134http://www.opengis.net/def/crs/EPSG/0/2135http://www.opengis.net/def/crs/EPSG/0/2136http://www.opengis.net/def/crs/EPSG/0/2137http://www.opengis.net/def/crs/EPSG/0/2138http://www.opengis.net/def/crs/EPSG/0/2139http://www.opengis.net/def/crs/EPSG/0/2140http://www.opengis.net/def/crs/EPSG/0/2141http://www.opengis.net/def/crs/EPSG/0/2142http://www.opengis.net/def/crs/EPSG/0/2143http://www.opengis.net/def/crs/EPSG/0/2144http://www.opengis.net/def/crs/EPSG/0/2145http://www.opengis.net/def/crs/EPSG/0/2146http://www.opengis.net/def/crs/EPSG/0/2147http://www.opengis.net/def/crs/EPSG/0/2148http://www.opengis.net/def/crs/EPSG/0/2149http://www.opengis.net/def/crs/EPSG/0/2150http://www.opengis.net/def/crs/EPSG/0/2151http://www.opengis.net/def/crs/EPSG/0/2152http://www.opengis.net/def/crs/EPSG/0/2153http://www.opengis.net/def/crs/EPSG/0/2154http://www.opengis.net/def/crs/EPSG/0/2155http://www.opengis.net/def/crs/EPSG/0/2156http://www.opengis.net/def/crs/EPSG/0/2157http://www.opengis.net/def/crs/EPSG/0/2158http://www.opengis.net/def/crs/EPSG/0/2159http://www.opengis.net/def/crs/EPSG/0/2160http://www.opengis.net/def/crs/EPSG/0/2161http://www.opengis.net/def/crs/EPSG/0/2162http://www.opengis.net/def/crs/EPSG/0/2163http://www.opengis.net/def/crs/EPSG/0/2164http://www.opengis.net/def/crs/EPSG/0/2165http://www.opengis.net/def/crs/EPSG/0/2166http://www.opengis.net/def/crs/EPSG/0/2167http://www.opengis.net/def/crs/EPSG/0/2168http://www.opengis.net/def/crs/EPSG/0/2169http://www.opengis.net/def/crs/EPSG/0/2170http://www.opengis.net/def/crs/EPSG/0/2171http://www.opengis.net/def/crs/EPSG/0/2172http://www.opengis.net/def/crs/EPSG/0/2173http://www.opengis.net/def/crs/EPSG/0/2174http://www.opengis.net/def/crs/EPSG/0/2175http://www.opengis.net/def/crs/EPSG/0/2176http://www.opengis.net/def/crs/EPSG/0/2177http://www.opengis.net/def/crs/EPSG/0/2178http://www.opengis.net/def/crs/EPSG/0/2179http://www.opengis.net/def/crs/EPSG/0/2180http://www.opengis.net/def/crs/EPSG/0/2188http://www.opengis.net/def/crs/EPSG/0/2189http://www.opengis.net/def/crs/EPSG/0/2190http://www.opengis.net/def/crs/EPSG/0/2191http://www.opengis.net/def/crs/EPSG/0/2192http://www.opengis.net/def/crs/EPSG/0/2193http://www.opengis.net/def/crs/EPSG/0/2194http://www.opengis.net/def/crs/EPSG/0/2195http://www.opengis.net/def/crs/EPSG/0/2196http://www.opengis.net/def/crs/EPSG/0/2197http://www.opengis.net/def/crs/EPSG/0/2198http://www.opengis.net/def/crs/EPSG/0/2199http://www.opengis.net/def/crs/EPSG/0/2200http://www.opengis.net/def/crs/EPSG/0/2201http://www.opengis.net/def/crs/EPSG/0/2202http://www.opengis.net/def/crs/EPSG/0/2203http://www.opengis.net/def/crs/EPSG/0/2204http://www.opengis.net/def/crs/EPSG/0/2205http://www.opengis.net/def/crs/EPSG/0/2206http://www.opengis.net/def/crs/EPSG/0/2207http://www.opengis.net/def/crs/EPSG/0/2208http://www.opengis.net/def/crs/EPSG/0/2209http://www.opengis.net/def/crs/EPSG/0/2210http://www.opengis.net/def/crs/EPSG/0/2211http://www.opengis.net/def/crs/EPSG/0/2212http://www.opengis.net/def/crs/EPSG/0/2213http://www.opengis.net/def/crs/EPSG/0/2214http://www.opengis.net/def/crs/EPSG/0/2215http://www.opengis.net/def/crs/EPSG/0/2216http://www.opengis.net/def/crs/EPSG/0/2217http://www.opengis.net/def/crs/EPSG/0/2218http://www.opengis.net/def/crs/EPSG/0/2219http://www.opengis.net/def/crs/EPSG/0/2220http://www.opengis.net/def/crs/EPSG/0/2221http://www.opengis.net/def/crs/EPSG/0/2222http://www.opengis.net/def/crs/EPSG/0/2223http://www.opengis.net/def/crs/EPSG/0/2224http://www.opengis.net/def/crs/EPSG/0/2225http://www.opengis.net/def/crs/EPSG/0/2226http://www.opengis.net/def/crs/EPSG/0/2227http://www.opengis.net/def/crs/EPSG/0/2228http://www.opengis.net/def/crs/EPSG/0/2229http://www.opengis.net/def/crs/EPSG/0/2230http://www.opengis.net/def/crs/EPSG/0/2231http://www.opengis.net/def/crs/EPSG/0/2232http://www.opengis.net/def/crs/EPSG/0/2233http://www.opengis.net/def/crs/EPSG/0/2234http://www.opengis.net/def/crs/EPSG/0/2235http://www.opengis.net/def/crs/EPSG/0/2236http://www.opengis.net/def/crs/EPSG/0/2237http://www.opengis.net/def/crs/EPSG/0/2238http://www.opengis.net/def/crs/EPSG/0/2239http://www.opengis.net/def/crs/EPSG/0/2240http://www.opengis.net/def/crs/EPSG/0/2241http://www.opengis.net/def/crs/EPSG/0/2242http://www.opengis.net/def/crs/EPSG/0/2243http://www.opengis.net/def/crs/EPSG/0/2244http://www.opengis.net/def/crs/EPSG/0/2245http://www.opengis.net/def/crs/EPSG/0/2246http://www.opengis.net/def/crs/EPSG/0/2247http://www.opengis.net/def/crs/EPSG/0/2248http://www.opengis.net/def/crs/EPSG/0/2249http://www.opengis.net/def/crs/EPSG/0/2250http://www.opengis.net/def/crs/EPSG/0/2251http://www.opengis.net/def/crs/EPSG/0/2252http://www.opengis.net/def/crs/EPSG/0/2253http://www.opengis.net/def/crs/EPSG/0/2254http://www.opengis.net/def/crs/EPSG/0/2255http://www.opengis.net/def/crs/EPSG/0/2256http://www.opengis.net/def/crs/EPSG/0/2257http://www.opengis.net/def/crs/EPSG/0/2258http://www.opengis.net/def/crs/EPSG/0/2259http://www.opengis.net/def/crs/EPSG/0/2260http://www.opengis.net/def/crs/EPSG/0/2261http://www.opengis.net/def/crs/EPSG/0/2262http://www.opengis.net/def/crs/EPSG/0/2263http://www.opengis.net/def/crs/EPSG/0/2264http://www.opengis.net/def/crs/EPSG/0/2265http://www.opengis.net/def/crs/EPSG/0/2266http://www.opengis.net/def/crs/EPSG/0/2267http://www.opengis.net/def/crs/EPSG/0/2268http://www.opengis.net/def/crs/EPSG/0/2269http://www.opengis.net/def/crs/EPSG/0/2270http://www.opengis.net/def/crs/EPSG/0/2271http://www.opengis.net/def/crs/EPSG/0/2272http://www.opengis.net/def/crs/EPSG/0/2273http://www.opengis.net/def/crs/EPSG/0/2274http://www.opengis.net/def/crs/EPSG/0/2275http://www.opengis.net/def/crs/EPSG/0/2276http://www.opengis.net/def/crs/EPSG/0/2277http://www.opengis.net/def/crs/EPSG/0/2278http://www.opengis.net/def/crs/EPSG/0/2279http://www.opengis.net/def/crs/EPSG/0/2280http://www.opengis.net/def/crs/EPSG/0/2281http://www.opengis.net/def/crs/EPSG/0/2282http://www.opengis.net/def/crs/EPSG/0/2283http://www.opengis.net/def/crs/EPSG/0/2284http://www.opengis.net/def/crs/EPSG/0/2285http://www.opengis.net/def/crs/EPSG/0/2286http://www.opengis.net/def/crs/EPSG/0/2287http://www.opengis.net/def/crs/EPSG/0/2288http://www.opengis.net/def/crs/EPSG/0/2289http://www.opengis.net/def/crs/EPSG/0/2290http://www.opengis.net/def/crs/EPSG/0/2291http://www.opengis.net/def/crs/EPSG/0/2292http://www.opengis.net/def/crs/EPSG/0/2294http://www.opengis.net/def/crs/EPSG/0/2295http://www.opengis.net/def/crs/EPSG/0/2296http://www.opengis.net/def/crs/EPSG/0/2297http://www.opengis.net/def/crs/EPSG/0/2298http://www.opengis.net/def/crs/EPSG/0/2299http://www.opengis.net/def/crs/EPSG/0/2300http://www.opengis.net/def/crs/EPSG/0/2301http://www.opengis.net/def/crs/EPSG/0/2302http://www.opengis.net/def/crs/EPSG/0/2303http://www.opengis.net/def/crs/EPSG/0/2304http://www.opengis.net/def/crs/EPSG/0/2305http://www.opengis.net/def/crs/EPSG/0/2306http://www.opengis.net/def/crs/EPSG/0/2307http://www.opengis.net/def/crs/EPSG/0/2308http://www.opengis.net/def/crs/EPSG/0/2309http://www.opengis.net/def/crs/EPSG/0/2310http://www.opengis.net/def/crs/EPSG/0/2311http://www.opengis.net/def/crs/EPSG/0/2312http://www.opengis.net/def/crs/EPSG/0/2313http://www.opengis.net/def/crs/EPSG/0/2314http://www.opengis.net/def/crs/EPSG/0/2315http://www.opengis.net/def/crs/EPSG/0/2316http://www.opengis.net/def/crs/EPSG/0/2317http://www.opengis.net/def/crs/EPSG/0/2318http://www.opengis.net/def/crs/EPSG/0/2319http://www.opengis.net/def/crs/EPSG/0/2320http://www.opengis.net/def/crs/EPSG/0/2321http://www.opengis.net/def/crs/EPSG/0/2322http://www.opengis.net/def/crs/EPSG/0/2323http://www.opengis.net/def/crs/EPSG/0/2324http://www.opengis.net/def/crs/EPSG/0/2325http://www.opengis.net/def/crs/EPSG/0/2326http://www.opengis.net/def/crs/EPSG/0/2327http://www.opengis.net/def/crs/EPSG/0/2328http://www.opengis.net/def/crs/EPSG/0/2329http://www.opengis.net/def/crs/EPSG/0/2330http://www.opengis.net/def/crs/EPSG/0/2331http://www.opengis.net/def/crs/EPSG/0/2332http://www.opengis.net/def/crs/EPSG/0/2333http://www.opengis.net/def/crs/EPSG/0/2334http://www.opengis.net/def/crs/EPSG/0/2335http://www.opengis.net/def/crs/EPSG/0/2336http://www.opengis.net/def/crs/EPSG/0/2337http://www.opengis.net/def/crs/EPSG/0/2338http://www.opengis.net/def/crs/EPSG/0/2339http://www.opengis.net/def/crs/EPSG/0/2340http://www.opengis.net/def/crs/EPSG/0/2341http://www.opengis.net/def/crs/EPSG/0/2342http://www.opengis.net/def/crs/EPSG/0/2343http://www.opengis.net/def/crs/EPSG/0/2344http://www.opengis.net/def/crs/EPSG/0/2345http://www.opengis.net/def/crs/EPSG/0/2346http://www.opengis.net/def/crs/EPSG/0/2347http://www.opengis.net/def/crs/EPSG/0/2348http://www.opengis.net/def/crs/EPSG/0/2349http://www.opengis.net/def/crs/EPSG/0/2350http://www.opengis.net/def/crs/EPSG/0/2351http://www.opengis.net/def/crs/EPSG/0/2352http://www.opengis.net/def/crs/EPSG/0/2353http://www.opengis.net/def/crs/EPSG/0/2354http://www.opengis.net/def/crs/EPSG/0/2355http://www.opengis.net/def/crs/EPSG/0/2356http://www.opengis.net/def/crs/EPSG/0/2357http://www.opengis.net/def/crs/EPSG/0/2358http://www.opengis.net/def/crs/EPSG/0/2359http://www.opengis.net/def/crs/EPSG/0/2360http://www.opengis.net/def/crs/EPSG/0/2361http://www.opengis.net/def/crs/EPSG/0/2362http://www.opengis.net/def/crs/EPSG/0/2363http://www.opengis.net/def/crs/EPSG/0/2364http://www.opengis.net/def/crs/EPSG/0/2365http://www.opengis.net/def/crs/EPSG/0/2366http://www.opengis.net/def/crs/EPSG/0/2367http://www.opengis.net/def/crs/EPSG/0/2368http://www.opengis.net/def/crs/EPSG/0/2369http://www.opengis.net/def/crs/EPSG/0/2370http://www.opengis.net/def/crs/EPSG/0/2371http://www.opengis.net/def/crs/EPSG/0/2372http://www.opengis.net/def/crs/EPSG/0/2373http://www.opengis.net/def/crs/EPSG/0/2374http://www.opengis.net/def/crs/EPSG/0/2375http://www.opengis.net/def/crs/EPSG/0/2376http://www.opengis.net/def/crs/EPSG/0/2377http://www.opengis.net/def/crs/EPSG/0/2378http://www.opengis.net/def/crs/EPSG/0/2379http://www.opengis.net/def/crs/EPSG/0/2380http://www.opengis.net/def/crs/EPSG/0/2381http://www.opengis.net/def/crs/EPSG/0/2382http://www.opengis.net/def/crs/EPSG/0/2383http://www.opengis.net/def/crs/EPSG/0/2384http://www.opengis.net/def/crs/EPSG/0/2385http://www.opengis.net/def/crs/EPSG/0/2386http://www.opengis.net/def/crs/EPSG/0/2387http://www.opengis.net/def/crs/EPSG/0/2388http://www.opengis.net/def/crs/EPSG/0/2389http://www.opengis.net/def/crs/EPSG/0/2390http://www.opengis.net/def/crs/EPSG/0/2391http://www.opengis.net/def/crs/EPSG/0/2392http://www.opengis.net/def/crs/EPSG/0/2393http://www.opengis.net/def/crs/EPSG/0/2394http://www.opengis.net/def/crs/EPSG/0/2395http://www.opengis.net/def/crs/EPSG/0/2396http://www.opengis.net/def/crs/EPSG/0/2397http://www.opengis.net/def/crs/EPSG/0/2398http://www.opengis.net/def/crs/EPSG/0/2399http://www.opengis.net/def/crs/EPSG/0/2400http://www.opengis.net/def/crs/EPSG/0/2401http://www.opengis.net/def/crs/EPSG/0/2402http://www.opengis.net/def/crs/EPSG/0/2403http://www.opengis.net/def/crs/EPSG/0/2404http://www.opengis.net/def/crs/EPSG/0/2405http://www.opengis.net/def/crs/EPSG/0/2406http://www.opengis.net/def/crs/EPSG/0/2407http://www.opengis.net/def/crs/EPSG/0/2408http://www.opengis.net/def/crs/EPSG/0/2409http://www.opengis.net/def/crs/EPSG/0/2410http://www.opengis.net/def/crs/EPSG/0/2411http://www.opengis.net/def/crs/EPSG/0/2412http://www.opengis.net/def/crs/EPSG/0/2413http://www.opengis.net/def/crs/EPSG/0/2414http://www.opengis.net/def/crs/EPSG/0/2415http://www.opengis.net/def/crs/EPSG/0/2416http://www.opengis.net/def/crs/EPSG/0/2417http://www.opengis.net/def/crs/EPSG/0/2418http://www.opengis.net/def/crs/EPSG/0/2419http://www.opengis.net/def/crs/EPSG/0/2420http://www.opengis.net/def/crs/EPSG/0/2421http://www.opengis.net/def/crs/EPSG/0/2422http://www.opengis.net/def/crs/EPSG/0/2423http://www.opengis.net/def/crs/EPSG/0/2424http://www.opengis.net/def/crs/EPSG/0/2425http://www.opengis.net/def/crs/EPSG/0/2426http://www.opengis.net/def/crs/EPSG/0/2427http://www.opengis.net/def/crs/EPSG/0/2428http://www.opengis.net/def/crs/EPSG/0/2429http://www.opengis.net/def/crs/EPSG/0/2430http://www.opengis.net/def/crs/EPSG/0/2431http://www.opengis.net/def/crs/EPSG/0/2432http://www.opengis.net/def/crs/EPSG/0/2433http://www.opengis.net/def/crs/EPSG/0/2434http://www.opengis.net/def/crs/EPSG/0/2435http://www.opengis.net/def/crs/EPSG/0/2436http://www.opengis.net/def/crs/EPSG/0/2437http://www.opengis.net/def/crs/EPSG/0/2438http://www.opengis.net/def/crs/EPSG/0/2439http://www.opengis.net/def/crs/EPSG/0/2440http://www.opengis.net/def/crs/EPSG/0/2441http://www.opengis.net/def/crs/EPSG/0/2442http://www.opengis.net/def/crs/EPSG/0/2443http://www.opengis.net/def/crs/EPSG/0/2444http://www.opengis.net/def/crs/EPSG/0/2445http://www.opengis.net/def/crs/EPSG/0/2446http://www.opengis.net/def/crs/EPSG/0/2447http://www.opengis.net/def/crs/EPSG/0/2448http://www.opengis.net/def/crs/EPSG/0/2449http://www.opengis.net/def/crs/EPSG/0/2450http://www.opengis.net/def/crs/EPSG/0/2451http://www.opengis.net/def/crs/EPSG/0/2452http://www.opengis.net/def/crs/EPSG/0/2453http://www.opengis.net/def/crs/EPSG/0/2454http://www.opengis.net/def/crs/EPSG/0/2455http://www.opengis.net/def/crs/EPSG/0/2456http://www.opengis.net/def/crs/EPSG/0/2457http://www.opengis.net/def/crs/EPSG/0/2458http://www.opengis.net/def/crs/EPSG/0/2459http://www.opengis.net/def/crs/EPSG/0/2460http://www.opengis.net/def/crs/EPSG/0/2461http://www.opengis.net/def/crs/EPSG/0/2462http://www.opengis.net/def/crs/EPSG/0/2463http://www.opengis.net/def/crs/EPSG/0/2464http://www.opengis.net/def/crs/EPSG/0/2465http://www.opengis.net/def/crs/EPSG/0/2466http://www.opengis.net/def/crs/EPSG/0/2467http://www.opengis.net/def/crs/EPSG/0/2468http://www.opengis.net/def/crs/EPSG/0/2469http://www.opengis.net/def/crs/EPSG/0/2470http://www.opengis.net/def/crs/EPSG/0/2471http://www.opengis.net/def/crs/EPSG/0/2472http://www.opengis.net/def/crs/EPSG/0/2473http://www.opengis.net/def/crs/EPSG/0/2474http://www.opengis.net/def/crs/EPSG/0/2475http://www.opengis.net/def/crs/EPSG/0/2476http://www.opengis.net/def/crs/EPSG/0/2477http://www.opengis.net/def/crs/EPSG/0/2478http://www.opengis.net/def/crs/EPSG/0/2479http://www.opengis.net/def/crs/EPSG/0/2480http://www.opengis.net/def/crs/EPSG/0/2481http://www.opengis.net/def/crs/EPSG/0/2482http://www.opengis.net/def/crs/EPSG/0/2483http://www.opengis.net/def/crs/EPSG/0/2484http://www.opengis.net/def/crs/EPSG/0/2485http://www.opengis.net/def/crs/EPSG/0/2486http://www.opengis.net/def/crs/EPSG/0/2487http://www.opengis.net/def/crs/EPSG/0/2488http://www.opengis.net/def/crs/EPSG/0/2489http://www.opengis.net/def/crs/EPSG/0/2490http://www.opengis.net/def/crs/EPSG/0/2491http://www.opengis.net/def/crs/EPSG/0/2492http://www.opengis.net/def/crs/EPSG/0/2493http://www.opengis.net/def/crs/EPSG/0/2494http://www.opengis.net/def/crs/EPSG/0/2495http://www.opengis.net/def/crs/EPSG/0/2496http://www.opengis.net/def/crs/EPSG/0/2497http://www.opengis.net/def/crs/EPSG/0/2498http://www.opengis.net/def/crs/EPSG/0/2499http://www.opengis.net/def/crs/EPSG/0/2500http://www.opengis.net/def/crs/EPSG/0/2501http://www.opengis.net/def/crs/EPSG/0/2502http://www.opengis.net/def/crs/EPSG/0/2503http://www.opengis.net/def/crs/EPSG/0/2504http://www.opengis.net/def/crs/EPSG/0/2505http://www.opengis.net/def/crs/EPSG/0/2506http://www.opengis.net/def/crs/EPSG/0/2507http://www.opengis.net/def/crs/EPSG/0/2508http://www.opengis.net/def/crs/EPSG/0/2509http://www.opengis.net/def/crs/EPSG/0/2510http://www.opengis.net/def/crs/EPSG/0/2511http://www.opengis.net/def/crs/EPSG/0/2512http://www.opengis.net/def/crs/EPSG/0/2513http://www.opengis.net/def/crs/EPSG/0/2514http://www.opengis.net/def/crs/EPSG/0/2515http://www.opengis.net/def/crs/EPSG/0/2516http://www.opengis.net/def/crs/EPSG/0/2517http://www.opengis.net/def/crs/EPSG/0/2518http://www.opengis.net/def/crs/EPSG/0/2519http://www.opengis.net/def/crs/EPSG/0/2520http://www.opengis.net/def/crs/EPSG/0/2521http://www.opengis.net/def/crs/EPSG/0/2522http://www.opengis.net/def/crs/EPSG/0/2523http://www.opengis.net/def/crs/EPSG/0/2524http://www.opengis.net/def/crs/EPSG/0/2525http://www.opengis.net/def/crs/EPSG/0/2526http://www.opengis.net/def/crs/EPSG/0/2527http://www.opengis.net/def/crs/EPSG/0/2528http://www.opengis.net/def/crs/EPSG/0/2529http://www.opengis.net/def/crs/EPSG/0/2530http://www.opengis.net/def/crs/EPSG/0/2531http://www.opengis.net/def/crs/EPSG/0/2532http://www.opengis.net/def/crs/EPSG/0/2533http://www.opengis.net/def/crs/EPSG/0/2534http://www.opengis.net/def/crs/EPSG/0/2535http://www.opengis.net/def/crs/EPSG/0/2536http://www.opengis.net/def/crs/EPSG/0/2537http://www.opengis.net/def/crs/EPSG/0/2538http://www.opengis.net/def/crs/EPSG/0/2539http://www.opengis.net/def/crs/EPSG/0/2540http://www.opengis.net/def/crs/EPSG/0/2541http://www.opengis.net/def/crs/EPSG/0/2542http://www.opengis.net/def/crs/EPSG/0/2543http://www.opengis.net/def/crs/EPSG/0/2544http://www.opengis.net/def/crs/EPSG/0/2545http://www.opengis.net/def/crs/EPSG/0/2546http://www.opengis.net/def/crs/EPSG/0/2547http://www.opengis.net/def/crs/EPSG/0/2548http://www.opengis.net/def/crs/EPSG/0/2549http://www.opengis.net/def/crs/EPSG/0/2550http://www.opengis.net/def/crs/EPSG/0/2551http://www.opengis.net/def/crs/EPSG/0/2552http://www.opengis.net/def/crs/EPSG/0/2553http://www.opengis.net/def/crs/EPSG/0/2554http://www.opengis.net/def/crs/EPSG/0/2555http://www.opengis.net/def/crs/EPSG/0/2556http://www.opengis.net/def/crs/EPSG/0/2557http://www.opengis.net/def/crs/EPSG/0/2558http://www.opengis.net/def/crs/EPSG/0/2559http://www.opengis.net/def/crs/EPSG/0/2560http://www.opengis.net/def/crs/EPSG/0/2561http://www.opengis.net/def/crs/EPSG/0/2562http://www.opengis.net/def/crs/EPSG/0/2563http://www.opengis.net/def/crs/EPSG/0/2564http://www.opengis.net/def/crs/EPSG/0/2565http://www.opengis.net/def/crs/EPSG/0/2566http://www.opengis.net/def/crs/EPSG/0/2567http://www.opengis.net/def/crs/EPSG/0/2568http://www.opengis.net/def/crs/EPSG/0/2569http://www.opengis.net/def/crs/EPSG/0/2570http://www.opengis.net/def/crs/EPSG/0/2571http://www.opengis.net/def/crs/EPSG/0/2572http://www.opengis.net/def/crs/EPSG/0/2573http://www.opengis.net/def/crs/EPSG/0/2574http://www.opengis.net/def/crs/EPSG/0/2575http://www.opengis.net/def/crs/EPSG/0/2576http://www.opengis.net/def/crs/EPSG/0/2577http://www.opengis.net/def/crs/EPSG/0/2578http://www.opengis.net/def/crs/EPSG/0/2579http://www.opengis.net/def/crs/EPSG/0/2580http://www.opengis.net/def/crs/EPSG/0/2581http://www.opengis.net/def/crs/EPSG/0/2582http://www.opengis.net/def/crs/EPSG/0/2583http://www.opengis.net/def/crs/EPSG/0/2584http://www.opengis.net/def/crs/EPSG/0/2585http://www.opengis.net/def/crs/EPSG/0/2586http://www.opengis.net/def/crs/EPSG/0/2587http://www.opengis.net/def/crs/EPSG/0/2588http://www.opengis.net/def/crs/EPSG/0/2589http://www.opengis.net/def/crs/EPSG/0/2590http://www.opengis.net/def/crs/EPSG/0/2591http://www.opengis.net/def/crs/EPSG/0/2592http://www.opengis.net/def/crs/EPSG/0/2593http://www.opengis.net/def/crs/EPSG/0/2594http://www.opengis.net/def/crs/EPSG/0/2595http://www.opengis.net/def/crs/EPSG/0/2596http://www.opengis.net/def/crs/EPSG/0/2597http://www.opengis.net/def/crs/EPSG/0/2598http://www.opengis.net/def/crs/EPSG/0/2599http://www.opengis.net/def/crs/EPSG/0/2600http://www.opengis.net/def/crs/EPSG/0/2601http://www.opengis.net/def/crs/EPSG/0/2602http://www.opengis.net/def/crs/EPSG/0/2603http://www.opengis.net/def/crs/EPSG/0/2604http://www.opengis.net/def/crs/EPSG/0/2605http://www.opengis.net/def/crs/EPSG/0/2606http://www.opengis.net/def/crs/EPSG/0/2607http://www.opengis.net/def/crs/EPSG/0/2608http://www.opengis.net/def/crs/EPSG/0/2609http://www.opengis.net/def/crs/EPSG/0/2610http://www.opengis.net/def/crs/EPSG/0/2611http://www.opengis.net/def/crs/EPSG/0/2612http://www.opengis.net/def/crs/EPSG/0/2613http://www.opengis.net/def/crs/EPSG/0/2614http://www.opengis.net/def/crs/EPSG/0/2615http://www.opengis.net/def/crs/EPSG/0/2616http://www.opengis.net/def/crs/EPSG/0/2617http://www.opengis.net/def/crs/EPSG/0/2618http://www.opengis.net/def/crs/EPSG/0/2619http://www.opengis.net/def/crs/EPSG/0/2620http://www.opengis.net/def/crs/EPSG/0/2621http://www.opengis.net/def/crs/EPSG/0/2622http://www.opengis.net/def/crs/EPSG/0/2623http://www.opengis.net/def/crs/EPSG/0/2624http://www.opengis.net/def/crs/EPSG/0/2625http://www.opengis.net/def/crs/EPSG/0/2626http://www.opengis.net/def/crs/EPSG/0/2627http://www.opengis.net/def/crs/EPSG/0/2628http://www.opengis.net/def/crs/EPSG/0/2629http://www.opengis.net/def/crs/EPSG/0/2630http://www.opengis.net/def/crs/EPSG/0/2631http://www.opengis.net/def/crs/EPSG/0/2632http://www.opengis.net/def/crs/EPSG/0/2633http://www.opengis.net/def/crs/EPSG/0/2634http://www.opengis.net/def/crs/EPSG/0/2635http://www.opengis.net/def/crs/EPSG/0/2636http://www.opengis.net/def/crs/EPSG/0/2637http://www.opengis.net/def/crs/EPSG/0/2638http://www.opengis.net/def/crs/EPSG/0/2639http://www.opengis.net/def/crs/EPSG/0/2640http://www.opengis.net/def/crs/EPSG/0/2641http://www.opengis.net/def/crs/EPSG/0/2642http://www.opengis.net/def/crs/EPSG/0/2643http://www.opengis.net/def/crs/EPSG/0/2644http://www.opengis.net/def/crs/EPSG/0/2645http://www.opengis.net/def/crs/EPSG/0/2646http://www.opengis.net/def/crs/EPSG/0/2647http://www.opengis.net/def/crs/EPSG/0/2648http://www.opengis.net/def/crs/EPSG/0/2649http://www.opengis.net/def/crs/EPSG/0/2650http://www.opengis.net/def/crs/EPSG/0/2651http://www.opengis.net/def/crs/EPSG/0/2652http://www.opengis.net/def/crs/EPSG/0/2653http://www.opengis.net/def/crs/EPSG/0/2654http://www.opengis.net/def/crs/EPSG/0/2655http://www.opengis.net/def/crs/EPSG/0/2656http://www.opengis.net/def/crs/EPSG/0/2657http://www.opengis.net/def/crs/EPSG/0/2658http://www.opengis.net/def/crs/EPSG/0/2659http://www.opengis.net/def/crs/EPSG/0/2660http://www.opengis.net/def/crs/EPSG/0/2661http://www.opengis.net/def/crs/EPSG/0/2662http://www.opengis.net/def/crs/EPSG/0/2663http://www.opengis.net/def/crs/EPSG/0/2664http://www.opengis.net/def/crs/EPSG/0/2665http://www.opengis.net/def/crs/EPSG/0/2666http://www.opengis.net/def/crs/EPSG/0/2667http://www.opengis.net/def/crs/EPSG/0/2668http://www.opengis.net/def/crs/EPSG/0/2669http://www.opengis.net/def/crs/EPSG/0/2670http://www.opengis.net/def/crs/EPSG/0/2671http://www.opengis.net/def/crs/EPSG/0/2672http://www.opengis.net/def/crs/EPSG/0/2673http://www.opengis.net/def/crs/EPSG/0/2674http://www.opengis.net/def/crs/EPSG/0/2675http://www.opengis.net/def/crs/EPSG/0/2676http://www.opengis.net/def/crs/EPSG/0/2677http://www.opengis.net/def/crs/EPSG/0/2678http://www.opengis.net/def/crs/EPSG/0/2679http://www.opengis.net/def/crs/EPSG/0/2680http://www.opengis.net/def/crs/EPSG/0/2681http://www.opengis.net/def/crs/EPSG/0/2682http://www.opengis.net/def/crs/EPSG/0/2683http://www.opengis.net/def/crs/EPSG/0/2684http://www.opengis.net/def/crs/EPSG/0/2685http://www.opengis.net/def/crs/EPSG/0/2686http://www.opengis.net/def/crs/EPSG/0/2687http://www.opengis.net/def/crs/EPSG/0/2688http://www.opengis.net/def/crs/EPSG/0/2689http://www.opengis.net/def/crs/EPSG/0/2690http://www.opengis.net/def/crs/EPSG/0/2691http://www.opengis.net/def/crs/EPSG/0/2692http://www.opengis.net/def/crs/EPSG/0/2693http://www.opengis.net/def/crs/EPSG/0/2694http://www.opengis.net/def/crs/EPSG/0/2695http://www.opengis.net/def/crs/EPSG/0/2696http://www.opengis.net/def/crs/EPSG/0/2697http://www.opengis.net/def/crs/EPSG/0/2698http://www.opengis.net/def/crs/EPSG/0/2699http://www.opengis.net/def/crs/EPSG/0/2700http://www.opengis.net/def/crs/EPSG/0/2701http://www.opengis.net/def/crs/EPSG/0/2702http://www.opengis.net/def/crs/EPSG/0/2703http://www.opengis.net/def/crs/EPSG/0/2704http://www.opengis.net/def/crs/EPSG/0/2705http://www.opengis.net/def/crs/EPSG/0/2706http://www.opengis.net/def/crs/EPSG/0/2707http://www.opengis.net/def/crs/EPSG/0/2708http://www.opengis.net/def/crs/EPSG/0/2709http://www.opengis.net/def/crs/EPSG/0/2710http://www.opengis.net/def/crs/EPSG/0/2711http://www.opengis.net/def/crs/EPSG/0/2712http://www.opengis.net/def/crs/EPSG/0/2713http://www.opengis.net/def/crs/EPSG/0/2714http://www.opengis.net/def/crs/EPSG/0/2715http://www.opengis.net/def/crs/EPSG/0/2716http://www.opengis.net/def/crs/EPSG/0/2717http://www.opengis.net/def/crs/EPSG/0/2718http://www.opengis.net/def/crs/EPSG/0/2719http://www.opengis.net/def/crs/EPSG/0/2720http://www.opengis.net/def/crs/EPSG/0/2721http://www.opengis.net/def/crs/EPSG/0/2722http://www.opengis.net/def/crs/EPSG/0/2723http://www.opengis.net/def/crs/EPSG/0/2724http://www.opengis.net/def/crs/EPSG/0/2725http://www.opengis.net/def/crs/EPSG/0/2726http://www.opengis.net/def/crs/EPSG/0/2727http://www.opengis.net/def/crs/EPSG/0/2728http://www.opengis.net/def/crs/EPSG/0/2729http://www.opengis.net/def/crs/EPSG/0/2730http://www.opengis.net/def/crs/EPSG/0/2731http://www.opengis.net/def/crs/EPSG/0/2732http://www.opengis.net/def/crs/EPSG/0/2733http://www.opengis.net/def/crs/EPSG/0/2734http://www.opengis.net/def/crs/EPSG/0/2735http://www.opengis.net/def/crs/EPSG/0/2736http://www.opengis.net/def/crs/EPSG/0/2737http://www.opengis.net/def/crs/EPSG/0/2738http://www.opengis.net/def/crs/EPSG/0/2739http://www.opengis.net/def/crs/EPSG/0/2740http://www.opengis.net/def/crs/EPSG/0/2741http://www.opengis.net/def/crs/EPSG/0/2742http://www.opengis.net/def/crs/EPSG/0/2743http://www.opengis.net/def/crs/EPSG/0/2744http://www.opengis.net/def/crs/EPSG/0/2745http://www.opengis.net/def/crs/EPSG/0/2746http://www.opengis.net/def/crs/EPSG/0/2747http://www.opengis.net/def/crs/EPSG/0/2748http://www.opengis.net/def/crs/EPSG/0/2749http://www.opengis.net/def/crs/EPSG/0/2750http://www.opengis.net/def/crs/EPSG/0/2751http://www.opengis.net/def/crs/EPSG/0/2752http://www.opengis.net/def/crs/EPSG/0/2753http://www.opengis.net/def/crs/EPSG/0/2754http://www.opengis.net/def/crs/EPSG/0/2755http://www.opengis.net/def/crs/EPSG/0/2756http://www.opengis.net/def/crs/EPSG/0/2757http://www.opengis.net/def/crs/EPSG/0/2758http://www.opengis.net/def/crs/EPSG/0/2759http://www.opengis.net/def/crs/EPSG/0/2760http://www.opengis.net/def/crs/EPSG/0/2761http://www.opengis.net/def/crs/EPSG/0/2762http://www.opengis.net/def/crs/EPSG/0/2763http://www.opengis.net/def/crs/EPSG/0/2764http://www.opengis.net/def/crs/EPSG/0/2765http://www.opengis.net/def/crs/EPSG/0/2766http://www.opengis.net/def/crs/EPSG/0/2767http://www.opengis.net/def/crs/EPSG/0/2768http://www.opengis.net/def/crs/EPSG/0/2769http://www.opengis.net/def/crs/EPSG/0/2770http://www.opengis.net/def/crs/EPSG/0/2771http://www.opengis.net/def/crs/EPSG/0/2772http://www.opengis.net/def/crs/EPSG/0/2773http://www.opengis.net/def/crs/EPSG/0/2774http://www.opengis.net/def/crs/EPSG/0/2775http://www.opengis.net/def/crs/EPSG/0/2776http://www.opengis.net/def/crs/EPSG/0/2777http://www.opengis.net/def/crs/EPSG/0/2778http://www.opengis.net/def/crs/EPSG/0/2779http://www.opengis.net/def/crs/EPSG/0/2780http://www.opengis.net/def/crs/EPSG/0/2781http://www.opengis.net/def/crs/EPSG/0/2782http://www.opengis.net/def/crs/EPSG/0/2783http://www.opengis.net/def/crs/EPSG/0/2784http://www.opengis.net/def/crs/EPSG/0/2785http://www.opengis.net/def/crs/EPSG/0/2786http://www.opengis.net/def/crs/EPSG/0/2787http://www.opengis.net/def/crs/EPSG/0/2788http://www.opengis.net/def/crs/EPSG/0/2789http://www.opengis.net/def/crs/EPSG/0/2790http://www.opengis.net/def/crs/EPSG/0/2791http://www.opengis.net/def/crs/EPSG/0/2792http://www.opengis.net/def/crs/EPSG/0/2793http://www.opengis.net/def/crs/EPSG/0/2794http://www.opengis.net/def/crs/EPSG/0/2795http://www.opengis.net/def/crs/EPSG/0/2796http://www.opengis.net/def/crs/EPSG/0/2797http://www.opengis.net/def/crs/EPSG/0/2798http://www.opengis.net/def/crs/EPSG/0/2799http://www.opengis.net/def/crs/EPSG/0/2800http://www.opengis.net/def/crs/EPSG/0/2801http://www.opengis.net/def/crs/EPSG/0/2802http://www.opengis.net/def/crs/EPSG/0/2803http://www.opengis.net/def/crs/EPSG/0/2804http://www.opengis.net/def/crs/EPSG/0/2805http://www.opengis.net/def/crs/EPSG/0/2806http://www.opengis.net/def/crs/EPSG/0/2807http://www.opengis.net/def/crs/EPSG/0/2808http://www.opengis.net/def/crs/EPSG/0/2809http://www.opengis.net/def/crs/EPSG/0/2810http://www.opengis.net/def/crs/EPSG/0/2811http://www.opengis.net/def/crs/EPSG/0/2812http://www.opengis.net/def/crs/EPSG/0/2813http://www.opengis.net/def/crs/EPSG/0/2814http://www.opengis.net/def/crs/EPSG/0/2815http://www.opengis.net/def/crs/EPSG/0/2816http://www.opengis.net/def/crs/EPSG/0/2817http://www.opengis.net/def/crs/EPSG/0/2818http://www.opengis.net/def/crs/EPSG/0/2819http://www.opengis.net/def/crs/EPSG/0/2820http://www.opengis.net/def/crs/EPSG/0/2821http://www.opengis.net/def/crs/EPSG/0/2822http://www.opengis.net/def/crs/EPSG/0/2823http://www.opengis.net/def/crs/EPSG/0/2824http://www.opengis.net/def/crs/EPSG/0/2825http://www.opengis.net/def/crs/EPSG/0/2826http://www.opengis.net/def/crs/EPSG/0/2827http://www.opengis.net/def/crs/EPSG/0/2828http://www.opengis.net/def/crs/EPSG/0/2829http://www.opengis.net/def/crs/EPSG/0/2830http://www.opengis.net/def/crs/EPSG/0/2831http://www.opengis.net/def/crs/EPSG/0/2832http://www.opengis.net/def/crs/EPSG/0/2833http://www.opengis.net/def/crs/EPSG/0/2834http://www.opengis.net/def/crs/EPSG/0/2835http://www.opengis.net/def/crs/EPSG/0/2836http://www.opengis.net/def/crs/EPSG/0/2837http://www.opengis.net/def/crs/EPSG/0/2838http://www.opengis.net/def/crs/EPSG/0/2839http://www.opengis.net/def/crs/EPSG/0/2840http://www.opengis.net/def/crs/EPSG/0/2841http://www.opengis.net/def/crs/EPSG/0/2842http://www.opengis.net/def/crs/EPSG/0/2843http://www.opengis.net/def/crs/EPSG/0/2844http://www.opengis.net/def/crs/EPSG/0/2845http://www.opengis.net/def/crs/EPSG/0/2846http://www.opengis.net/def/crs/EPSG/0/2847http://www.opengis.net/def/crs/EPSG/0/2848http://www.opengis.net/def/crs/EPSG/0/2849http://www.opengis.net/def/crs/EPSG/0/2850http://www.opengis.net/def/crs/EPSG/0/2851http://www.opengis.net/def/crs/EPSG/0/2852http://www.opengis.net/def/crs/EPSG/0/2853http://www.opengis.net/def/crs/EPSG/0/2854http://www.opengis.net/def/crs/EPSG/0/2855http://www.opengis.net/def/crs/EPSG/0/2856http://www.opengis.net/def/crs/EPSG/0/2857http://www.opengis.net/def/crs/EPSG/0/2858http://www.opengis.net/def/crs/EPSG/0/2859http://www.opengis.net/def/crs/EPSG/0/2860http://www.opengis.net/def/crs/EPSG/0/2861http://www.opengis.net/def/crs/EPSG/0/2862http://www.opengis.net/def/crs/EPSG/0/2863http://www.opengis.net/def/crs/EPSG/0/2864http://www.opengis.net/def/crs/EPSG/0/2865http://www.opengis.net/def/crs/EPSG/0/2866http://www.opengis.net/def/crs/EPSG/0/2867http://www.opengis.net/def/crs/EPSG/0/2868http://www.opengis.net/def/crs/EPSG/0/2869http://www.opengis.net/def/crs/EPSG/0/2870http://www.opengis.net/def/crs/EPSG/0/2871http://www.opengis.net/def/crs/EPSG/0/2872http://www.opengis.net/def/crs/EPSG/0/2873http://www.opengis.net/def/crs/EPSG/0/2874http://www.opengis.net/def/crs/EPSG/0/2875http://www.opengis.net/def/crs/EPSG/0/2876http://www.opengis.net/def/crs/EPSG/0/2877http://www.opengis.net/def/crs/EPSG/0/2878http://www.opengis.net/def/crs/EPSG/0/2879http://www.opengis.net/def/crs/EPSG/0/2880http://www.opengis.net/def/crs/EPSG/0/2881http://www.opengis.net/def/crs/EPSG/0/2882http://www.opengis.net/def/crs/EPSG/0/2883http://www.opengis.net/def/crs/EPSG/0/2884http://www.opengis.net/def/crs/EPSG/0/2885http://www.opengis.net/def/crs/EPSG/0/2886http://www.opengis.net/def/crs/EPSG/0/2887http://www.opengis.net/def/crs/EPSG/0/2888http://www.opengis.net/def/crs/EPSG/0/2889http://www.opengis.net/def/crs/EPSG/0/2890http://www.opengis.net/def/crs/EPSG/0/2891http://www.opengis.net/def/crs/EPSG/0/2892http://www.opengis.net/def/crs/EPSG/0/2893http://www.opengis.net/def/crs/EPSG/0/2894http://www.opengis.net/def/crs/EPSG/0/2895http://www.opengis.net/def/crs/EPSG/0/2896http://www.opengis.net/def/crs/EPSG/0/2897http://www.opengis.net/def/crs/EPSG/0/2898http://www.opengis.net/def/crs/EPSG/0/2899http://www.opengis.net/def/crs/EPSG/0/2900http://www.opengis.net/def/crs/EPSG/0/2901http://www.opengis.net/def/crs/EPSG/0/2902http://www.opengis.net/def/crs/EPSG/0/2903http://www.opengis.net/def/crs/EPSG/0/2904http://www.opengis.net/def/crs/EPSG/0/2905http://www.opengis.net/def/crs/EPSG/0/2906http://www.opengis.net/def/crs/EPSG/0/2907http://www.opengis.net/def/crs/EPSG/0/2908http://www.opengis.net/def/crs/EPSG/0/2909http://www.opengis.net/def/crs/EPSG/0/2910http://www.opengis.net/def/crs/EPSG/0/2911http://www.opengis.net/def/crs/EPSG/0/2912http://www.opengis.net/def/crs/EPSG/0/2913http://www.opengis.net/def/crs/EPSG/0/2914http://www.opengis.net/def/crs/EPSG/0/2915http://www.opengis.net/def/crs/EPSG/0/2916http://www.opengis.net/def/crs/EPSG/0/2917http://www.opengis.net/def/crs/EPSG/0/2918http://www.opengis.net/def/crs/EPSG/0/2919http://www.opengis.net/def/crs/EPSG/0/2920http://www.opengis.net/def/crs/EPSG/0/2921http://www.opengis.net/def/crs/EPSG/0/2922http://www.opengis.net/def/crs/EPSG/0/2923http://www.opengis.net/def/crs/EPSG/0/2924http://www.opengis.net/def/crs/EPSG/0/2925http://www.opengis.net/def/crs/EPSG/0/2926http://www.opengis.net/def/crs/EPSG/0/2927http://www.opengis.net/def/crs/EPSG/0/2928http://www.opengis.net/def/crs/EPSG/0/2929http://www.opengis.net/def/crs/EPSG/0/2930http://www.opengis.net/def/crs/EPSG/0/2931http://www.opengis.net/def/crs/EPSG/0/2932http://www.opengis.net/def/crs/EPSG/0/2933http://www.opengis.net/def/crs/EPSG/0/2934http://www.opengis.net/def/crs/EPSG/0/2935http://www.opengis.net/def/crs/EPSG/0/2936http://www.opengis.net/def/crs/EPSG/0/2937http://www.opengis.net/def/crs/EPSG/0/2938http://www.opengis.net/def/crs/EPSG/0/2939http://www.opengis.net/def/crs/EPSG/0/2940http://www.opengis.net/def/crs/EPSG/0/2941http://www.opengis.net/def/crs/EPSG/0/2942http://www.opengis.net/def/crs/EPSG/0/2943http://www.opengis.net/def/crs/EPSG/0/2944http://www.opengis.net/def/crs/EPSG/0/2945http://www.opengis.net/def/crs/EPSG/0/2946http://www.opengis.net/def/crs/EPSG/0/2947http://www.opengis.net/def/crs/EPSG/0/2948http://www.opengis.net/def/crs/EPSG/0/2949http://www.opengis.net/def/crs/EPSG/0/2950http://www.opengis.net/def/crs/EPSG/0/2951http://www.opengis.net/def/crs/EPSG/0/2952http://www.opengis.net/def/crs/EPSG/0/2953http://www.opengis.net/def/crs/EPSG/0/2954http://www.opengis.net/def/crs/EPSG/0/2955http://www.opengis.net/def/crs/EPSG/0/2956http://www.opengis.net/def/crs/EPSG/0/2957http://www.opengis.net/def/crs/EPSG/0/2958http://www.opengis.net/def/crs/EPSG/0/2959http://www.opengis.net/def/crs/EPSG/0/2960http://www.opengis.net/def/crs/EPSG/0/2961http://www.opengis.net/def/crs/EPSG/0/2962http://www.opengis.net/def/crs/EPSG/0/2963http://www.opengis.net/def/crs/EPSG/0/2964http://www.opengis.net/def/crs/EPSG/0/2965http://www.opengis.net/def/crs/EPSG/0/2966http://www.opengis.net/def/crs/EPSG/0/2967http://www.opengis.net/def/crs/EPSG/0/2968http://www.opengis.net/def/crs/EPSG/0/2969http://www.opengis.net/def/crs/EPSG/0/2970http://www.opengis.net/def/crs/EPSG/0/2971http://www.opengis.net/def/crs/EPSG/0/2972http://www.opengis.net/def/crs/EPSG/0/2973http://www.opengis.net/def/crs/EPSG/0/2975http://www.opengis.net/def/crs/EPSG/0/2976http://www.opengis.net/def/crs/EPSG/0/2977http://www.opengis.net/def/crs/EPSG/0/2978http://www.opengis.net/def/crs/EPSG/0/2979http://www.opengis.net/def/crs/EPSG/0/2980http://www.opengis.net/def/crs/EPSG/0/2981http://www.opengis.net/def/crs/EPSG/0/2982http://www.opengis.net/def/crs/EPSG/0/2983http://www.opengis.net/def/crs/EPSG/0/2984http://www.opengis.net/def/crs/EPSG/0/2985http://www.opengis.net/def/crs/EPSG/0/2986http://www.opengis.net/def/crs/EPSG/0/2987http://www.opengis.net/def/crs/EPSG/0/2988http://www.opengis.net/def/crs/EPSG/0/2989http://www.opengis.net/def/crs/EPSG/0/2990http://www.opengis.net/def/crs/EPSG/0/2991http://www.opengis.net/def/crs/EPSG/0/2992http://www.opengis.net/def/crs/EPSG/0/2993http://www.opengis.net/def/crs/EPSG/0/2994http://www.opengis.net/def/crs/EPSG/0/2995http://www.opengis.net/def/crs/EPSG/0/2996http://www.opengis.net/def/crs/EPSG/0/2997http://www.opengis.net/def/crs/EPSG/0/2998http://www.opengis.net/def/crs/EPSG/0/2999http://www.opengis.net/def/crs/EPSG/0/3000http://www.opengis.net/def/crs/EPSG/0/3001http://www.opengis.net/def/crs/EPSG/0/3002http://www.opengis.net/def/crs/EPSG/0/3003http://www.opengis.net/def/crs/EPSG/0/3004http://www.opengis.net/def/crs/EPSG/0/3005http://www.opengis.net/def/crs/EPSG/0/3006http://www.opengis.net/def/crs/EPSG/0/3007http://www.opengis.net/def/crs/EPSG/0/3008http://www.opengis.net/def/crs/EPSG/0/3009http://www.opengis.net/def/crs/EPSG/0/3010http://www.opengis.net/def/crs/EPSG/0/3011http://www.opengis.net/def/crs/EPSG/0/3012http://www.opengis.net/def/crs/EPSG/0/3013http://www.opengis.net/def/crs/EPSG/0/3014http://www.opengis.net/def/crs/EPSG/0/3015http://www.opengis.net/def/crs/EPSG/0/3016http://www.opengis.net/def/crs/EPSG/0/3017http://www.opengis.net/def/crs/EPSG/0/3018http://www.opengis.net/def/crs/EPSG/0/3019http://www.opengis.net/def/crs/EPSG/0/3020http://www.opengis.net/def/crs/EPSG/0/3021http://www.opengis.net/def/crs/EPSG/0/3022http://www.opengis.net/def/crs/EPSG/0/3023http://www.opengis.net/def/crs/EPSG/0/3024http://www.opengis.net/def/crs/EPSG/0/3025http://www.opengis.net/def/crs/EPSG/0/3026http://www.opengis.net/def/crs/EPSG/0/3027http://www.opengis.net/def/crs/EPSG/0/3028http://www.opengis.net/def/crs/EPSG/0/3029http://www.opengis.net/def/crs/EPSG/0/3030http://www.opengis.net/def/crs/EPSG/0/3031http://www.opengis.net/def/crs/EPSG/0/3032http://www.opengis.net/def/crs/EPSG/0/3033http://www.opengis.net/def/crs/EPSG/0/3034http://www.opengis.net/def/crs/EPSG/0/3035http://www.opengis.net/def/crs/EPSG/0/3036http://www.opengis.net/def/crs/EPSG/0/3037http://www.opengis.net/def/crs/EPSG/0/3038http://www.opengis.net/def/crs/EPSG/0/3039http://www.opengis.net/def/crs/EPSG/0/3040http://www.opengis.net/def/crs/EPSG/0/3041http://www.opengis.net/def/crs/EPSG/0/3042http://www.opengis.net/def/crs/EPSG/0/3043http://www.opengis.net/def/crs/EPSG/0/3044http://www.opengis.net/def/crs/EPSG/0/3045http://www.opengis.net/def/crs/EPSG/0/3046http://www.opengis.net/def/crs/EPSG/0/3047http://www.opengis.net/def/crs/EPSG/0/3048http://www.opengis.net/def/crs/EPSG/0/3049http://www.opengis.net/def/crs/EPSG/0/3050http://www.opengis.net/def/crs/EPSG/0/3051http://www.opengis.net/def/crs/EPSG/0/3052http://www.opengis.net/def/crs/EPSG/0/3053http://www.opengis.net/def/crs/EPSG/0/3054http://www.opengis.net/def/crs/EPSG/0/3055http://www.opengis.net/def/crs/EPSG/0/3056http://www.opengis.net/def/crs/EPSG/0/3057http://www.opengis.net/def/crs/EPSG/0/3058http://www.opengis.net/def/crs/EPSG/0/3059http://www.opengis.net/def/crs/EPSG/0/3060http://www.opengis.net/def/crs/EPSG/0/3061http://www.opengis.net/def/crs/EPSG/0/3062http://www.opengis.net/def/crs/EPSG/0/3063http://www.opengis.net/def/crs/EPSG/0/3064http://www.opengis.net/def/crs/EPSG/0/3065http://www.opengis.net/def/crs/EPSG/0/3066http://www.opengis.net/def/crs/EPSG/0/3067http://www.opengis.net/def/crs/EPSG/0/3068http://www.opengis.net/def/crs/EPSG/0/3069http://www.opengis.net/def/crs/EPSG/0/3070http://www.opengis.net/def/crs/EPSG/0/3071http://www.opengis.net/def/crs/EPSG/0/3072http://www.opengis.net/def/crs/EPSG/0/3073http://www.opengis.net/def/crs/EPSG/0/3074http://www.opengis.net/def/crs/EPSG/0/3075http://www.opengis.net/def/crs/EPSG/0/3076http://www.opengis.net/def/crs/EPSG/0/3077http://www.opengis.net/def/crs/EPSG/0/3078http://www.opengis.net/def/crs/EPSG/0/3079http://www.opengis.net/def/crs/EPSG/0/3080http://www.opengis.net/def/crs/EPSG/0/3081http://www.opengis.net/def/crs/EPSG/0/3082http://www.opengis.net/def/crs/EPSG/0/3083http://www.opengis.net/def/crs/EPSG/0/3084http://www.opengis.net/def/crs/EPSG/0/3085http://www.opengis.net/def/crs/EPSG/0/3086http://www.opengis.net/def/crs/EPSG/0/3087http://www.opengis.net/def/crs/EPSG/0/3088http://www.opengis.net/def/crs/EPSG/0/3089http://www.opengis.net/def/crs/EPSG/0/3090http://www.opengis.net/def/crs/EPSG/0/3091http://www.opengis.net/def/crs/EPSG/0/3092http://www.opengis.net/def/crs/EPSG/0/3093http://www.opengis.net/def/crs/EPSG/0/3094http://www.opengis.net/def/crs/EPSG/0/3095http://www.opengis.net/def/crs/EPSG/0/3096http://www.opengis.net/def/crs/EPSG/0/3097http://www.opengis.net/def/crs/EPSG/0/3098http://www.opengis.net/def/crs/EPSG/0/3099http://www.opengis.net/def/crs/EPSG/0/3100http://www.opengis.net/def/crs/EPSG/0/3101http://www.opengis.net/def/crs/EPSG/0/3102http://www.opengis.net/def/crs/EPSG/0/3103http://www.opengis.net/def/crs/EPSG/0/3104http://www.opengis.net/def/crs/EPSG/0/3105http://www.opengis.net/def/crs/EPSG/0/3106http://www.opengis.net/def/crs/EPSG/0/3107http://www.opengis.net/def/crs/EPSG/0/3108http://www.opengis.net/def/crs/EPSG/0/3109http://www.opengis.net/def/crs/EPSG/0/3110http://www.opengis.net/def/crs/EPSG/0/3111http://www.opengis.net/def/crs/EPSG/0/3112http://www.opengis.net/def/crs/EPSG/0/3113http://www.opengis.net/def/crs/EPSG/0/3114http://www.opengis.net/def/crs/EPSG/0/3115http://www.opengis.net/def/crs/EPSG/0/3116http://www.opengis.net/def/crs/EPSG/0/3117http://www.opengis.net/def/crs/EPSG/0/3118http://www.opengis.net/def/crs/EPSG/0/3119http://www.opengis.net/def/crs/EPSG/0/3120http://www.opengis.net/def/crs/EPSG/0/3121http://www.opengis.net/def/crs/EPSG/0/3122http://www.opengis.net/def/crs/EPSG/0/3123http://www.opengis.net/def/crs/EPSG/0/3124http://www.opengis.net/def/crs/EPSG/0/3125http://www.opengis.net/def/crs/EPSG/0/3126http://www.opengis.net/def/crs/EPSG/0/3127http://www.opengis.net/def/crs/EPSG/0/3128http://www.opengis.net/def/crs/EPSG/0/3129http://www.opengis.net/def/crs/EPSG/0/3130http://www.opengis.net/def/crs/EPSG/0/3131http://www.opengis.net/def/crs/EPSG/0/3132http://www.opengis.net/def/crs/EPSG/0/3133http://www.opengis.net/def/crs/EPSG/0/3134http://www.opengis.net/def/crs/EPSG/0/3135http://www.opengis.net/def/crs/EPSG/0/3136http://www.opengis.net/def/crs/EPSG/0/3137http://www.opengis.net/def/crs/EPSG/0/3138http://www.opengis.net/def/crs/EPSG/0/3139http://www.opengis.net/def/crs/EPSG/0/3140http://www.opengis.net/def/crs/EPSG/0/3141http://www.opengis.net/def/crs/EPSG/0/3142http://www.opengis.net/def/crs/EPSG/0/3143http://www.opengis.net/def/crs/EPSG/0/3144http://www.opengis.net/def/crs/EPSG/0/3145http://www.opengis.net/def/crs/EPSG/0/3146http://www.opengis.net/def/crs/EPSG/0/3147http://www.opengis.net/def/crs/EPSG/0/3148http://www.opengis.net/def/crs/EPSG/0/3149http://www.opengis.net/def/crs/EPSG/0/3150http://www.opengis.net/def/crs/EPSG/0/3151http://www.opengis.net/def/crs/EPSG/0/3152http://www.opengis.net/def/crs/EPSG/0/3153http://www.opengis.net/def/crs/EPSG/0/3154http://www.opengis.net/def/crs/EPSG/0/3155http://www.opengis.net/def/crs/EPSG/0/3156http://www.opengis.net/def/crs/EPSG/0/3157http://www.opengis.net/def/crs/EPSG/0/3158http://www.opengis.net/def/crs/EPSG/0/3159http://www.opengis.net/def/crs/EPSG/0/3160http://www.opengis.net/def/crs/EPSG/0/3161http://www.opengis.net/def/crs/EPSG/0/3162http://www.opengis.net/def/crs/EPSG/0/3163http://www.opengis.net/def/crs/EPSG/0/3164http://www.opengis.net/def/crs/EPSG/0/3165http://www.opengis.net/def/crs/EPSG/0/3166http://www.opengis.net/def/crs/EPSG/0/3167http://www.opengis.net/def/crs/EPSG/0/3168http://www.opengis.net/def/crs/EPSG/0/3169http://www.opengis.net/def/crs/EPSG/0/3170http://www.opengis.net/def/crs/EPSG/0/3171http://www.opengis.net/def/crs/EPSG/0/3172http://www.opengis.net/def/crs/EPSG/0/3173http://www.opengis.net/def/crs/EPSG/0/3174http://www.opengis.net/def/crs/EPSG/0/3175http://www.opengis.net/def/crs/EPSG/0/3176http://www.opengis.net/def/crs/EPSG/0/3177http://www.opengis.net/def/crs/EPSG/0/3178http://www.opengis.net/def/crs/EPSG/0/3179http://www.opengis.net/def/crs/EPSG/0/3180http://www.opengis.net/def/crs/EPSG/0/3181http://www.opengis.net/def/crs/EPSG/0/3182http://www.opengis.net/def/crs/EPSG/0/3183http://www.opengis.net/def/crs/EPSG/0/3184http://www.opengis.net/def/crs/EPSG/0/3185http://www.opengis.net/def/crs/EPSG/0/3186http://www.opengis.net/def/crs/EPSG/0/3187http://www.opengis.net/def/crs/EPSG/0/3188http://www.opengis.net/def/crs/EPSG/0/3189http://www.opengis.net/def/crs/EPSG/0/3190http://www.opengis.net/def/crs/EPSG/0/3191http://www.opengis.net/def/crs/EPSG/0/3192http://www.opengis.net/def/crs/EPSG/0/3193http://www.opengis.net/def/crs/EPSG/0/3194http://www.opengis.net/def/crs/EPSG/0/3195http://www.opengis.net/def/crs/EPSG/0/3196http://www.opengis.net/def/crs/EPSG/0/3197http://www.opengis.net/def/crs/EPSG/0/3198http://www.opengis.net/def/crs/EPSG/0/3199http://www.opengis.net/def/crs/EPSG/0/3200http://www.opengis.net/def/crs/EPSG/0/3201http://www.opengis.net/def/crs/EPSG/0/3202http://www.opengis.net/def/crs/EPSG/0/3203http://www.opengis.net/def/crs/EPSG/0/3204http://www.opengis.net/def/crs/EPSG/0/3205http://www.opengis.net/def/crs/EPSG/0/3206http://www.opengis.net/def/crs/EPSG/0/3207http://www.opengis.net/def/crs/EPSG/0/3208http://www.opengis.net/def/crs/EPSG/0/3209http://www.opengis.net/def/crs/EPSG/0/3210http://www.opengis.net/def/crs/EPSG/0/3211http://www.opengis.net/def/crs/EPSG/0/3212http://www.opengis.net/def/crs/EPSG/0/3213http://www.opengis.net/def/crs/EPSG/0/3214http://www.opengis.net/def/crs/EPSG/0/3215http://www.opengis.net/def/crs/EPSG/0/3216http://www.opengis.net/def/crs/EPSG/0/3217http://www.opengis.net/def/crs/EPSG/0/3218http://www.opengis.net/def/crs/EPSG/0/3219http://www.opengis.net/def/crs/EPSG/0/3220http://www.opengis.net/def/crs/EPSG/0/3221http://www.opengis.net/def/crs/EPSG/0/3222http://www.opengis.net/def/crs/EPSG/0/3223http://www.opengis.net/def/crs/EPSG/0/3224http://www.opengis.net/def/crs/EPSG/0/3225http://www.opengis.net/def/crs/EPSG/0/3226http://www.opengis.net/def/crs/EPSG/0/3227http://www.opengis.net/def/crs/EPSG/0/3228http://www.opengis.net/def/crs/EPSG/0/3229http://www.opengis.net/def/crs/EPSG/0/3230http://www.opengis.net/def/crs/EPSG/0/3231http://www.opengis.net/def/crs/EPSG/0/3232http://www.opengis.net/def/crs/EPSG/0/3233http://www.opengis.net/def/crs/EPSG/0/3234http://www.opengis.net/def/crs/EPSG/0/3235http://www.opengis.net/def/crs/EPSG/0/3236http://www.opengis.net/def/crs/EPSG/0/3237http://www.opengis.net/def/crs/EPSG/0/3238http://www.opengis.net/def/crs/EPSG/0/3239http://www.opengis.net/def/crs/EPSG/0/3240http://www.opengis.net/def/crs/EPSG/0/3241http://www.opengis.net/def/crs/EPSG/0/3242http://www.opengis.net/def/crs/EPSG/0/3243http://www.opengis.net/def/crs/EPSG/0/3244http://www.opengis.net/def/crs/EPSG/0/3245http://www.opengis.net/def/crs/EPSG/0/3246http://www.opengis.net/def/crs/EPSG/0/3247http://www.opengis.net/def/crs/EPSG/0/3248http://www.opengis.net/def/crs/EPSG/0/3249http://www.opengis.net/def/crs/EPSG/0/3250http://www.opengis.net/def/crs/EPSG/0/3251http://www.opengis.net/def/crs/EPSG/0/3252http://www.opengis.net/def/crs/EPSG/0/3253http://www.opengis.net/def/crs/EPSG/0/3254http://www.opengis.net/def/crs/EPSG/0/3255http://www.opengis.net/def/crs/EPSG/0/3256http://www.opengis.net/def/crs/EPSG/0/3257http://www.opengis.net/def/crs/EPSG/0/3258http://www.opengis.net/def/crs/EPSG/0/3259http://www.opengis.net/def/crs/EPSG/0/3260http://www.opengis.net/def/crs/EPSG/0/3261http://www.opengis.net/def/crs/EPSG/0/3262http://www.opengis.net/def/crs/EPSG/0/3263http://www.opengis.net/def/crs/EPSG/0/3264http://www.opengis.net/def/crs/EPSG/0/3265http://www.opengis.net/def/crs/EPSG/0/3266http://www.opengis.net/def/crs/EPSG/0/3267http://www.opengis.net/def/crs/EPSG/0/3268http://www.opengis.net/def/crs/EPSG/0/3269http://www.opengis.net/def/crs/EPSG/0/3270http://www.opengis.net/def/crs/EPSG/0/3271http://www.opengis.net/def/crs/EPSG/0/3272http://www.opengis.net/def/crs/EPSG/0/3273http://www.opengis.net/def/crs/EPSG/0/3274http://www.opengis.net/def/crs/EPSG/0/3275http://www.opengis.net/def/crs/EPSG/0/3276http://www.opengis.net/def/crs/EPSG/0/3277http://www.opengis.net/def/crs/EPSG/0/3278http://www.opengis.net/def/crs/EPSG/0/3279http://www.opengis.net/def/crs/EPSG/0/3280http://www.opengis.net/def/crs/EPSG/0/3281http://www.opengis.net/def/crs/EPSG/0/3282http://www.opengis.net/def/crs/EPSG/0/3283http://www.opengis.net/def/crs/EPSG/0/3284http://www.opengis.net/def/crs/EPSG/0/3285http://www.opengis.net/def/crs/EPSG/0/3286http://www.opengis.net/def/crs/EPSG/0/3287http://www.opengis.net/def/crs/EPSG/0/3288http://www.opengis.net/def/crs/EPSG/0/3289http://www.opengis.net/def/crs/EPSG/0/3290http://www.opengis.net/def/crs/EPSG/0/3291http://www.opengis.net/def/crs/EPSG/0/3292http://www.opengis.net/def/crs/EPSG/0/3293http://www.opengis.net/def/crs/EPSG/0/3294http://www.opengis.net/def/crs/EPSG/0/3295http://www.opengis.net/def/crs/EPSG/0/3296http://www.opengis.net/def/crs/EPSG/0/3297http://www.opengis.net/def/crs/EPSG/0/3298http://www.opengis.net/def/crs/EPSG/0/3299http://www.opengis.net/def/crs/EPSG/0/3300http://www.opengis.net/def/crs/EPSG/0/3301http://www.opengis.net/def/crs/EPSG/0/3302http://www.opengis.net/def/crs/EPSG/0/3303http://www.opengis.net/def/crs/EPSG/0/3304http://www.opengis.net/def/crs/EPSG/0/3305http://www.opengis.net/def/crs/EPSG/0/3306http://www.opengis.net/def/crs/EPSG/0/3307http://www.opengis.net/def/crs/EPSG/0/3308http://www.opengis.net/def/crs/EPSG/0/3309http://www.opengis.net/def/crs/EPSG/0/3310http://www.opengis.net/def/crs/EPSG/0/3311http://www.opengis.net/def/crs/EPSG/0/3312http://www.opengis.net/def/crs/EPSG/0/3313http://www.opengis.net/def/crs/EPSG/0/3314http://www.opengis.net/def/crs/EPSG/0/3315http://www.opengis.net/def/crs/EPSG/0/3316http://www.opengis.net/def/crs/EPSG/0/3317http://www.opengis.net/def/crs/EPSG/0/3318http://www.opengis.net/def/crs/EPSG/0/3319http://www.opengis.net/def/crs/EPSG/0/3320http://www.opengis.net/def/crs/EPSG/0/3321http://www.opengis.net/def/crs/EPSG/0/3322http://www.opengis.net/def/crs/EPSG/0/3323http://www.opengis.net/def/crs/EPSG/0/3324http://www.opengis.net/def/crs/EPSG/0/3325http://www.opengis.net/def/crs/EPSG/0/3326http://www.opengis.net/def/crs/EPSG/0/3327http://www.opengis.net/def/crs/EPSG/0/3328http://www.opengis.net/def/crs/EPSG/0/3329http://www.opengis.net/def/crs/EPSG/0/3330http://www.opengis.net/def/crs/EPSG/0/3331http://www.opengis.net/def/crs/EPSG/0/3332http://www.opengis.net/def/crs/EPSG/0/3333http://www.opengis.net/def/crs/EPSG/0/3334http://www.opengis.net/def/crs/EPSG/0/3335http://www.opengis.net/def/crs/EPSG/0/3336http://www.opengis.net/def/crs/EPSG/0/3337http://www.opengis.net/def/crs/EPSG/0/3338http://www.opengis.net/def/crs/EPSG/0/3339http://www.opengis.net/def/crs/EPSG/0/3340http://www.opengis.net/def/crs/EPSG/0/3341http://www.opengis.net/def/crs/EPSG/0/3342http://www.opengis.net/def/crs/EPSG/0/3343http://www.opengis.net/def/crs/EPSG/0/3344http://www.opengis.net/def/crs/EPSG/0/3345http://www.opengis.net/def/crs/EPSG/0/3346http://www.opengis.net/def/crs/EPSG/0/3347http://www.opengis.net/def/crs/EPSG/0/3348http://www.opengis.net/def/crs/EPSG/0/3349http://www.opengis.net/def/crs/EPSG/0/3350http://www.opengis.net/def/crs/EPSG/0/3351http://www.opengis.net/def/crs/EPSG/0/3352http://www.opengis.net/def/crs/EPSG/0/3353http://www.opengis.net/def/crs/EPSG/0/3354http://www.opengis.net/def/crs/EPSG/0/3355http://www.opengis.net/def/crs/EPSG/0/3356http://www.opengis.net/def/crs/EPSG/0/3357http://www.opengis.net/def/crs/EPSG/0/3358http://www.opengis.net/def/crs/EPSG/0/3359http://www.opengis.net/def/crs/EPSG/0/3360http://www.opengis.net/def/crs/EPSG/0/3361http://www.opengis.net/def/crs/EPSG/0/3362http://www.opengis.net/def/crs/EPSG/0/3363http://www.opengis.net/def/crs/EPSG/0/3364http://www.opengis.net/def/crs/EPSG/0/3365http://www.opengis.net/def/crs/EPSG/0/3366http://www.opengis.net/def/crs/EPSG/0/3367http://www.opengis.net/def/crs/EPSG/0/3368http://www.opengis.net/def/crs/EPSG/0/3369http://www.opengis.net/def/crs/EPSG/0/3370http://www.opengis.net/def/crs/EPSG/0/3371http://www.opengis.net/def/crs/EPSG/0/3372http://www.opengis.net/def/crs/EPSG/0/3373http://www.opengis.net/def/crs/EPSG/0/3374http://www.opengis.net/def/crs/EPSG/0/3375http://www.opengis.net/def/crs/EPSG/0/3376http://www.opengis.net/def/crs/EPSG/0/3377http://www.opengis.net/def/crs/EPSG/0/3378http://www.opengis.net/def/crs/EPSG/0/3379http://www.opengis.net/def/crs/EPSG/0/3380http://www.opengis.net/def/crs/EPSG/0/3381http://www.opengis.net/def/crs/EPSG/0/3382http://www.opengis.net/def/crs/EPSG/0/3383http://www.opengis.net/def/crs/EPSG/0/3384http://www.opengis.net/def/crs/EPSG/0/3385http://www.opengis.net/def/crs/EPSG/0/3386http://www.opengis.net/def/crs/EPSG/0/3387http://www.opengis.net/def/crs/EPSG/0/3388http://www.opengis.net/def/crs/EPSG/0/3389http://www.opengis.net/def/crs/EPSG/0/3390http://www.opengis.net/def/crs/EPSG/0/3391http://www.opengis.net/def/crs/EPSG/0/3392http://www.opengis.net/def/crs/EPSG/0/3393http://www.opengis.net/def/crs/EPSG/0/3394http://www.opengis.net/def/crs/EPSG/0/3395http://www.opengis.net/def/crs/EPSG/0/3396http://www.opengis.net/def/crs/EPSG/0/3397http://www.opengis.net/def/crs/EPSG/0/3398http://www.opengis.net/def/crs/EPSG/0/3399http://www.opengis.net/def/crs/EPSG/0/3400http://www.opengis.net/def/crs/EPSG/0/3401http://www.opengis.net/def/crs/EPSG/0/3402http://www.opengis.net/def/crs/EPSG/0/3403http://www.opengis.net/def/crs/EPSG/0/3404http://www.opengis.net/def/crs/EPSG/0/3405http://www.opengis.net/def/crs/EPSG/0/3406http://www.opengis.net/def/crs/EPSG/0/3407http://www.opengis.net/def/crs/EPSG/0/3408http://www.opengis.net/def/crs/EPSG/0/3409http://www.opengis.net/def/crs/EPSG/0/3410http://www.opengis.net/def/crs/EPSG/0/3411http://www.opengis.net/def/crs/EPSG/0/3412http://www.opengis.net/def/crs/EPSG/0/3413http://www.opengis.net/def/crs/EPSG/0/3414http://www.opengis.net/def/crs/EPSG/0/3415http://www.opengis.net/def/crs/EPSG/0/3416http://www.opengis.net/def/crs/EPSG/0/3417http://www.opengis.net/def/crs/EPSG/0/3418http://www.opengis.net/def/crs/EPSG/0/3419http://www.opengis.net/def/crs/EPSG/0/3420http://www.opengis.net/def/crs/EPSG/0/3421http://www.opengis.net/def/crs/EPSG/0/3422http://www.opengis.net/def/crs/EPSG/0/3423http://www.opengis.net/def/crs/EPSG/0/3424http://www.opengis.net/def/crs/EPSG/0/3425http://www.opengis.net/def/crs/EPSG/0/3426http://www.opengis.net/def/crs/EPSG/0/3427http://www.opengis.net/def/crs/EPSG/0/3428http://www.opengis.net/def/crs/EPSG/0/3429http://www.opengis.net/def/crs/EPSG/0/3430http://www.opengis.net/def/crs/EPSG/0/3431http://www.opengis.net/def/crs/EPSG/0/3432http://www.opengis.net/def/crs/EPSG/0/3433http://www.opengis.net/def/crs/EPSG/0/3434http://www.opengis.net/def/crs/EPSG/0/3435http://www.opengis.net/def/crs/EPSG/0/3436http://www.opengis.net/def/crs/EPSG/0/3437http://www.opengis.net/def/crs/EPSG/0/3438http://www.opengis.net/def/crs/EPSG/0/3439http://www.opengis.net/def/crs/EPSG/0/3440http://www.opengis.net/def/crs/EPSG/0/3441http://www.opengis.net/def/crs/EPSG/0/3442http://www.opengis.net/def/crs/EPSG/0/3443http://www.opengis.net/def/crs/EPSG/0/3444http://www.opengis.net/def/crs/EPSG/0/3445http://www.opengis.net/def/crs/EPSG/0/3446http://www.opengis.net/def/crs/EPSG/0/3447http://www.opengis.net/def/crs/EPSG/0/3448http://www.opengis.net/def/crs/EPSG/0/3449http://www.opengis.net/def/crs/EPSG/0/3450http://www.opengis.net/def/crs/EPSG/0/3451http://www.opengis.net/def/crs/EPSG/0/3452http://www.opengis.net/def/crs/EPSG/0/3453http://www.opengis.net/def/crs/EPSG/0/3454http://www.opengis.net/def/crs/EPSG/0/3455http://www.opengis.net/def/crs/EPSG/0/3456http://www.opengis.net/def/crs/EPSG/0/3457http://www.opengis.net/def/crs/EPSG/0/3458http://www.opengis.net/def/crs/EPSG/0/3459http://www.opengis.net/def/crs/EPSG/0/3460http://www.opengis.net/def/crs/EPSG/0/3461http://www.opengis.net/def/crs/EPSG/0/3462http://www.opengis.net/def/crs/EPSG/0/3463http://www.opengis.net/def/crs/EPSG/0/3464http://www.opengis.net/def/crs/EPSG/0/3465http://www.opengis.net/def/crs/EPSG/0/3466http://www.opengis.net/def/crs/EPSG/0/3467http://www.opengis.net/def/crs/EPSG/0/3468http://www.opengis.net/def/crs/EPSG/0/3469http://www.opengis.net/def/crs/EPSG/0/3470http://www.opengis.net/def/crs/EPSG/0/3471http://www.opengis.net/def/crs/EPSG/0/3472http://www.opengis.net/def/crs/EPSG/0/3473http://www.opengis.net/def/crs/EPSG/0/3474http://www.opengis.net/def/crs/EPSG/0/3475http://www.opengis.net/def/crs/EPSG/0/3476http://www.opengis.net/def/crs/EPSG/0/3477http://www.opengis.net/def/crs/EPSG/0/3478http://www.opengis.net/def/crs/EPSG/0/3479http://www.opengis.net/def/crs/EPSG/0/3480http://www.opengis.net/def/crs/EPSG/0/3481http://www.opengis.net/def/crs/EPSG/0/3482http://www.opengis.net/def/crs/EPSG/0/3483http://www.opengis.net/def/crs/EPSG/0/3484http://www.opengis.net/def/crs/EPSG/0/3485http://www.opengis.net/def/crs/EPSG/0/3486http://www.opengis.net/def/crs/EPSG/0/3487http://www.opengis.net/def/crs/EPSG/0/3488http://www.opengis.net/def/crs/EPSG/0/3489http://www.opengis.net/def/crs/EPSG/0/3490http://www.opengis.net/def/crs/EPSG/0/3491http://www.opengis.net/def/crs/EPSG/0/3492http://www.opengis.net/def/crs/EPSG/0/3493http://www.opengis.net/def/crs/EPSG/0/3494http://www.opengis.net/def/crs/EPSG/0/3495http://www.opengis.net/def/crs/EPSG/0/3496http://www.opengis.net/def/crs/EPSG/0/3497http://www.opengis.net/def/crs/EPSG/0/3498http://www.opengis.net/def/crs/EPSG/0/3499http://www.opengis.net/def/crs/EPSG/0/3500http://www.opengis.net/def/crs/EPSG/0/3501http://www.opengis.net/def/crs/EPSG/0/3502http://www.opengis.net/def/crs/EPSG/0/3503http://www.opengis.net/def/crs/EPSG/0/3504http://www.opengis.net/def/crs/EPSG/0/3505http://www.opengis.net/def/crs/EPSG/0/3506http://www.opengis.net/def/crs/EPSG/0/3507http://www.opengis.net/def/crs/EPSG/0/3508http://www.opengis.net/def/crs/EPSG/0/3509http://www.opengis.net/def/crs/EPSG/0/3510http://www.opengis.net/def/crs/EPSG/0/3511http://www.opengis.net/def/crs/EPSG/0/3512http://www.opengis.net/def/crs/EPSG/0/3513http://www.opengis.net/def/crs/EPSG/0/3514http://www.opengis.net/def/crs/EPSG/0/3515http://www.opengis.net/def/crs/EPSG/0/3516http://www.opengis.net/def/crs/EPSG/0/3517http://www.opengis.net/def/crs/EPSG/0/3518http://www.opengis.net/def/crs/EPSG/0/3519http://www.opengis.net/def/crs/EPSG/0/3520http://www.opengis.net/def/crs/EPSG/0/3521http://www.opengis.net/def/crs/EPSG/0/3522http://www.opengis.net/def/crs/EPSG/0/3523http://www.opengis.net/def/crs/EPSG/0/3524http://www.opengis.net/def/crs/EPSG/0/3525http://www.opengis.net/def/crs/EPSG/0/3526http://www.opengis.net/def/crs/EPSG/0/3527http://www.opengis.net/def/crs/EPSG/0/3528http://www.opengis.net/def/crs/EPSG/0/3529http://www.opengis.net/def/crs/EPSG/0/3530http://www.opengis.net/def/crs/EPSG/0/3531http://www.opengis.net/def/crs/EPSG/0/3532http://www.opengis.net/def/crs/EPSG/0/3533http://www.opengis.net/def/crs/EPSG/0/3534http://www.opengis.net/def/crs/EPSG/0/3535http://www.opengis.net/def/crs/EPSG/0/3536http://www.opengis.net/def/crs/EPSG/0/3537http://www.opengis.net/def/crs/EPSG/0/3538http://www.opengis.net/def/crs/EPSG/0/3539http://www.opengis.net/def/crs/EPSG/0/3540http://www.opengis.net/def/crs/EPSG/0/3541http://www.opengis.net/def/crs/EPSG/0/3542http://www.opengis.net/def/crs/EPSG/0/3543http://www.opengis.net/def/crs/EPSG/0/3544http://www.opengis.net/def/crs/EPSG/0/3545http://www.opengis.net/def/crs/EPSG/0/3546http://www.opengis.net/def/crs/EPSG/0/3547http://www.opengis.net/def/crs/EPSG/0/3548http://www.opengis.net/def/crs/EPSG/0/3549http://www.opengis.net/def/crs/EPSG/0/3550http://www.opengis.net/def/crs/EPSG/0/3551http://www.opengis.net/def/crs/EPSG/0/3552http://www.opengis.net/def/crs/EPSG/0/3553http://www.opengis.net/def/crs/EPSG/0/3554http://www.opengis.net/def/crs/EPSG/0/3555http://www.opengis.net/def/crs/EPSG/0/3556http://www.opengis.net/def/crs/EPSG/0/3557http://www.opengis.net/def/crs/EPSG/0/3558http://www.opengis.net/def/crs/EPSG/0/3559http://www.opengis.net/def/crs/EPSG/0/3560http://www.opengis.net/def/crs/EPSG/0/3561http://www.opengis.net/def/crs/EPSG/0/3562http://www.opengis.net/def/crs/EPSG/0/3563http://www.opengis.net/def/crs/EPSG/0/3564http://www.opengis.net/def/crs/EPSG/0/3565http://www.opengis.net/def/crs/EPSG/0/3566http://www.opengis.net/def/crs/EPSG/0/3567http://www.opengis.net/def/crs/EPSG/0/3568http://www.opengis.net/def/crs/EPSG/0/3569http://www.opengis.net/def/crs/EPSG/0/3570http://www.opengis.net/def/crs/EPSG/0/3571http://www.opengis.net/def/crs/EPSG/0/3572http://www.opengis.net/def/crs/EPSG/0/3573http://www.opengis.net/def/crs/EPSG/0/3574http://www.opengis.net/def/crs/EPSG/0/3575http://www.opengis.net/def/crs/EPSG/0/3576http://www.opengis.net/def/crs/EPSG/0/3577http://www.opengis.net/def/crs/EPSG/0/3578http://www.opengis.net/def/crs/EPSG/0/3579http://www.opengis.net/def/crs/EPSG/0/3580http://www.opengis.net/def/crs/EPSG/0/3581http://www.opengis.net/def/crs/EPSG/0/3582http://www.opengis.net/def/crs/EPSG/0/3583http://www.opengis.net/def/crs/EPSG/0/3584http://www.opengis.net/def/crs/EPSG/0/3585http://www.opengis.net/def/crs/EPSG/0/3586http://www.opengis.net/def/crs/EPSG/0/3587http://www.opengis.net/def/crs/EPSG/0/3588http://www.opengis.net/def/crs/EPSG/0/3589http://www.opengis.net/def/crs/EPSG/0/3590http://www.opengis.net/def/crs/EPSG/0/3591http://www.opengis.net/def/crs/EPSG/0/3592http://www.opengis.net/def/crs/EPSG/0/3593http://www.opengis.net/def/crs/EPSG/0/3594http://www.opengis.net/def/crs/EPSG/0/3595http://www.opengis.net/def/crs/EPSG/0/3596http://www.opengis.net/def/crs/EPSG/0/3597http://www.opengis.net/def/crs/EPSG/0/3598http://www.opengis.net/def/crs/EPSG/0/3599http://www.opengis.net/def/crs/EPSG/0/3600http://www.opengis.net/def/crs/EPSG/0/3601http://www.opengis.net/def/crs/EPSG/0/3602http://www.opengis.net/def/crs/EPSG/0/3603http://www.opengis.net/def/crs/EPSG/0/3604http://www.opengis.net/def/crs/EPSG/0/3605http://www.opengis.net/def/crs/EPSG/0/3606http://www.opengis.net/def/crs/EPSG/0/3607http://www.opengis.net/def/crs/EPSG/0/3608http://www.opengis.net/def/crs/EPSG/0/3609http://www.opengis.net/def/crs/EPSG/0/3610http://www.opengis.net/def/crs/EPSG/0/3611http://www.opengis.net/def/crs/EPSG/0/3612http://www.opengis.net/def/crs/EPSG/0/3613http://www.opengis.net/def/crs/EPSG/0/3614http://www.opengis.net/def/crs/EPSG/0/3615http://www.opengis.net/def/crs/EPSG/0/3616http://www.opengis.net/def/crs/EPSG/0/3617http://www.opengis.net/def/crs/EPSG/0/3618http://www.opengis.net/def/crs/EPSG/0/3619http://www.opengis.net/def/crs/EPSG/0/3620http://www.opengis.net/def/crs/EPSG/0/3621http://www.opengis.net/def/crs/EPSG/0/3622http://www.opengis.net/def/crs/EPSG/0/3623http://www.opengis.net/def/crs/EPSG/0/3624http://www.opengis.net/def/crs/EPSG/0/3625http://www.opengis.net/def/crs/EPSG/0/3626http://www.opengis.net/def/crs/EPSG/0/3627http://www.opengis.net/def/crs/EPSG/0/3628http://www.opengis.net/def/crs/EPSG/0/3629http://www.opengis.net/def/crs/EPSG/0/3630http://www.opengis.net/def/crs/EPSG/0/3631http://www.opengis.net/def/crs/EPSG/0/3632http://www.opengis.net/def/crs/EPSG/0/3633http://www.opengis.net/def/crs/EPSG/0/3634http://www.opengis.net/def/crs/EPSG/0/3635http://www.opengis.net/def/crs/EPSG/0/3636http://www.opengis.net/def/crs/EPSG/0/3637http://www.opengis.net/def/crs/EPSG/0/3638http://www.opengis.net/def/crs/EPSG/0/3639http://www.opengis.net/def/crs/EPSG/0/3640http://www.opengis.net/def/crs/EPSG/0/3641http://www.opengis.net/def/crs/EPSG/0/3642http://www.opengis.net/def/crs/EPSG/0/3643http://www.opengis.net/def/crs/EPSG/0/3644http://www.opengis.net/def/crs/EPSG/0/3645http://www.opengis.net/def/crs/EPSG/0/3646http://www.opengis.net/def/crs/EPSG/0/3647http://www.opengis.net/def/crs/EPSG/0/3648http://www.opengis.net/def/crs/EPSG/0/3649http://www.opengis.net/def/crs/EPSG/0/3650http://www.opengis.net/def/crs/EPSG/0/3651http://www.opengis.net/def/crs/EPSG/0/3652http://www.opengis.net/def/crs/EPSG/0/3653http://www.opengis.net/def/crs/EPSG/0/3654http://www.opengis.net/def/crs/EPSG/0/3655http://www.opengis.net/def/crs/EPSG/0/3656http://www.opengis.net/def/crs/EPSG/0/3657http://www.opengis.net/def/crs/EPSG/0/3658http://www.opengis.net/def/crs/EPSG/0/3659http://www.opengis.net/def/crs/EPSG/0/3660http://www.opengis.net/def/crs/EPSG/0/3661http://www.opengis.net/def/crs/EPSG/0/3662http://www.opengis.net/def/crs/EPSG/0/3663http://www.opengis.net/def/crs/EPSG/0/3664http://www.opengis.net/def/crs/EPSG/0/3665http://www.opengis.net/def/crs/EPSG/0/3666http://www.opengis.net/def/crs/EPSG/0/3667http://www.opengis.net/def/crs/EPSG/0/3668http://www.opengis.net/def/crs/EPSG/0/3669http://www.opengis.net/def/crs/EPSG/0/3670http://www.opengis.net/def/crs/EPSG/0/3671http://www.opengis.net/def/crs/EPSG/0/3672http://www.opengis.net/def/crs/EPSG/0/3673http://www.opengis.net/def/crs/EPSG/0/3674http://www.opengis.net/def/crs/EPSG/0/3675http://www.opengis.net/def/crs/EPSG/0/3676http://www.opengis.net/def/crs/EPSG/0/3677http://www.opengis.net/def/crs/EPSG/0/3678http://www.opengis.net/def/crs/EPSG/0/3679http://www.opengis.net/def/crs/EPSG/0/3680http://www.opengis.net/def/crs/EPSG/0/3681http://www.opengis.net/def/crs/EPSG/0/3682http://www.opengis.net/def/crs/EPSG/0/3683http://www.opengis.net/def/crs/EPSG/0/3684http://www.opengis.net/def/crs/EPSG/0/3685http://www.opengis.net/def/crs/EPSG/0/3686http://www.opengis.net/def/crs/EPSG/0/3687http://www.opengis.net/def/crs/EPSG/0/3688http://www.opengis.net/def/crs/EPSG/0/3689http://www.opengis.net/def/crs/EPSG/0/3690http://www.opengis.net/def/crs/EPSG/0/3691http://www.opengis.net/def/crs/EPSG/0/3692http://www.opengis.net/def/crs/EPSG/0/3693http://www.opengis.net/def/crs/EPSG/0/3694http://www.opengis.net/def/crs/EPSG/0/3695http://www.opengis.net/def/crs/EPSG/0/3696http://www.opengis.net/def/crs/EPSG/0/3697http://www.opengis.net/def/crs/EPSG/0/3698http://www.opengis.net/def/crs/EPSG/0/3699http://www.opengis.net/def/crs/EPSG/0/3700http://www.opengis.net/def/crs/EPSG/0/3701http://www.opengis.net/def/crs/EPSG/0/3702http://www.opengis.net/def/crs/EPSG/0/3703http://www.opengis.net/def/crs/EPSG/0/3704http://www.opengis.net/def/crs/EPSG/0/3705http://www.opengis.net/def/crs/EPSG/0/3706http://www.opengis.net/def/crs/EPSG/0/3707http://www.opengis.net/def/crs/EPSG/0/3708http://www.opengis.net/def/crs/EPSG/0/3709http://www.opengis.net/def/crs/EPSG/0/3710http://www.opengis.net/def/crs/EPSG/0/3711http://www.opengis.net/def/crs/EPSG/0/3712http://www.opengis.net/def/crs/EPSG/0/3713http://www.opengis.net/def/crs/EPSG/0/3714http://www.opengis.net/def/crs/EPSG/0/3715http://www.opengis.net/def/crs/EPSG/0/3716http://www.opengis.net/def/crs/EPSG/0/3717http://www.opengis.net/def/crs/EPSG/0/3718http://www.opengis.net/def/crs/EPSG/0/3719http://www.opengis.net/def/crs/EPSG/0/3720http://www.opengis.net/def/crs/EPSG/0/3721http://www.opengis.net/def/crs/EPSG/0/3722http://www.opengis.net/def/crs/EPSG/0/3723http://www.opengis.net/def/crs/EPSG/0/3724http://www.opengis.net/def/crs/EPSG/0/3725http://www.opengis.net/def/crs/EPSG/0/3726http://www.opengis.net/def/crs/EPSG/0/3727http://www.opengis.net/def/crs/EPSG/0/3728http://www.opengis.net/def/crs/EPSG/0/3729http://www.opengis.net/def/crs/EPSG/0/3730http://www.opengis.net/def/crs/EPSG/0/3731http://www.opengis.net/def/crs/EPSG/0/3732http://www.opengis.net/def/crs/EPSG/0/3733http://www.opengis.net/def/crs/EPSG/0/3734http://www.opengis.net/def/crs/EPSG/0/3735http://www.opengis.net/def/crs/EPSG/0/3736http://www.opengis.net/def/crs/EPSG/0/3737http://www.opengis.net/def/crs/EPSG/0/3738http://www.opengis.net/def/crs/EPSG/0/3739http://www.opengis.net/def/crs/EPSG/0/3740http://www.opengis.net/def/crs/EPSG/0/3741http://www.opengis.net/def/crs/EPSG/0/3742http://www.opengis.net/def/crs/EPSG/0/3743http://www.opengis.net/def/crs/EPSG/0/3744http://www.opengis.net/def/crs/EPSG/0/3745http://www.opengis.net/def/crs/EPSG/0/3746http://www.opengis.net/def/crs/EPSG/0/3747http://www.opengis.net/def/crs/EPSG/0/3748http://www.opengis.net/def/crs/EPSG/0/3749http://www.opengis.net/def/crs/EPSG/0/3750http://www.opengis.net/def/crs/EPSG/0/3751http://www.opengis.net/def/crs/EPSG/0/3752http://www.opengis.net/def/crs/EPSG/0/3753http://www.opengis.net/def/crs/EPSG/0/3754http://www.opengis.net/def/crs/EPSG/0/3755http://www.opengis.net/def/crs/EPSG/0/3756http://www.opengis.net/def/crs/EPSG/0/3757http://www.opengis.net/def/crs/EPSG/0/3758http://www.opengis.net/def/crs/EPSG/0/3759http://www.opengis.net/def/crs/EPSG/0/3760http://www.opengis.net/def/crs/EPSG/0/3761http://www.opengis.net/def/crs/EPSG/0/3762http://www.opengis.net/def/crs/EPSG/0/3763http://www.opengis.net/def/crs/EPSG/0/3764http://www.opengis.net/def/crs/EPSG/0/3765http://www.opengis.net/def/crs/EPSG/0/3766http://www.opengis.net/def/crs/EPSG/0/3767http://www.opengis.net/def/crs/EPSG/0/3768http://www.opengis.net/def/crs/EPSG/0/3769http://www.opengis.net/def/crs/EPSG/0/3770http://www.opengis.net/def/crs/EPSG/0/3771http://www.opengis.net/def/crs/EPSG/0/3772http://www.opengis.net/def/crs/EPSG/0/3773http://www.opengis.net/def/crs/EPSG/0/3774http://www.opengis.net/def/crs/EPSG/0/3775http://www.opengis.net/def/crs/EPSG/0/3776http://www.opengis.net/def/crs/EPSG/0/3777http://www.opengis.net/def/crs/EPSG/0/3778http://www.opengis.net/def/crs/EPSG/0/3779http://www.opengis.net/def/crs/EPSG/0/3780http://www.opengis.net/def/crs/EPSG/0/3781http://www.opengis.net/def/crs/EPSG/0/3782http://www.opengis.net/def/crs/EPSG/0/3783http://www.opengis.net/def/crs/EPSG/0/3784http://www.opengis.net/def/crs/EPSG/0/3785http://www.opengis.net/def/crs/EPSG/0/3786http://www.opengis.net/def/crs/EPSG/0/3787http://www.opengis.net/def/crs/EPSG/0/3788http://www.opengis.net/def/crs/EPSG/0/3789http://www.opengis.net/def/crs/EPSG/0/3790http://www.opengis.net/def/crs/EPSG/0/3791http://www.opengis.net/def/crs/EPSG/0/3793http://www.opengis.net/def/crs/EPSG/0/3794http://www.opengis.net/def/crs/EPSG/0/3795http://www.opengis.net/def/crs/EPSG/0/3796http://www.opengis.net/def/crs/EPSG/0/3797http://www.opengis.net/def/crs/EPSG/0/3798http://www.opengis.net/def/crs/EPSG/0/3799http://www.opengis.net/def/crs/EPSG/0/3800http://www.opengis.net/def/crs/EPSG/0/3801http://www.opengis.net/def/crs/EPSG/0/3802http://www.opengis.net/def/crs/EPSG/0/3812http://www.opengis.net/def/crs/EPSG/0/3814http://www.opengis.net/def/crs/EPSG/0/3815http://www.opengis.net/def/crs/EPSG/0/3816http://www.opengis.net/def/crs/EPSG/0/3819http://www.opengis.net/def/crs/EPSG/0/3821http://www.opengis.net/def/crs/EPSG/0/3822http://www.opengis.net/def/crs/EPSG/0/3823http://www.opengis.net/def/crs/EPSG/0/3824http://www.opengis.net/def/crs/EPSG/0/3825http://www.opengis.net/def/crs/EPSG/0/3826http://www.opengis.net/def/crs/EPSG/0/3827http://www.opengis.net/def/crs/EPSG/0/3828http://www.opengis.net/def/crs/EPSG/0/3829http://www.opengis.net/def/crs/EPSG/0/3832http://www.opengis.net/def/crs/EPSG/0/3833http://www.opengis.net/def/crs/EPSG/0/3834http://www.opengis.net/def/crs/EPSG/0/3835http://www.opengis.net/def/crs/EPSG/0/3836http://www.opengis.net/def/crs/EPSG/0/3837http://www.opengis.net/def/crs/EPSG/0/3838http://www.opengis.net/def/crs/EPSG/0/3839http://www.opengis.net/def/crs/EPSG/0/3840http://www.opengis.net/def/crs/EPSG/0/3841http://www.opengis.net/def/crs/EPSG/0/3842http://www.opengis.net/def/crs/EPSG/0/3843http://www.opengis.net/def/crs/EPSG/0/3844http://www.opengis.net/def/crs/EPSG/0/3845http://www.opengis.net/def/crs/EPSG/0/3846http://www.opengis.net/def/crs/EPSG/0/3847http://www.opengis.net/def/crs/EPSG/0/3848http://www.opengis.net/def/crs/EPSG/0/3849http://www.opengis.net/def/crs/EPSG/0/3850http://www.opengis.net/def/crs/EPSG/0/3851http://www.opengis.net/def/crs/EPSG/0/3852http://www.opengis.net/def/crs/EPSG/0/3854http://www.opengis.net/def/crs/EPSG/0/3855http://www.opengis.net/def/crs/EPSG/0/3857http://www.opengis.net/def/crs/EPSG/0/3873http://www.opengis.net/def/crs/EPSG/0/3874http://www.opengis.net/def/crs/EPSG/0/3875http://www.opengis.net/def/crs/EPSG/0/3876http://www.opengis.net/def/crs/EPSG/0/3877http://www.opengis.net/def/crs/EPSG/0/3878http://www.opengis.net/def/crs/EPSG/0/3879http://www.opengis.net/def/crs/EPSG/0/3880http://www.opengis.net/def/crs/EPSG/0/3881http://www.opengis.net/def/crs/EPSG/0/3882http://www.opengis.net/def/crs/EPSG/0/3883http://www.opengis.net/def/crs/EPSG/0/3884http://www.opengis.net/def/crs/EPSG/0/3885http://www.opengis.net/def/crs/EPSG/0/3886http://www.opengis.net/def/crs/EPSG/0/3887http://www.opengis.net/def/crs/EPSG/0/3888http://www.opengis.net/def/crs/EPSG/0/3889http://www.opengis.net/def/crs/EPSG/0/3890http://www.opengis.net/def/crs/EPSG/0/3891http://www.opengis.net/def/crs/EPSG/0/3892http://www.opengis.net/def/crs/EPSG/0/3893http://www.opengis.net/def/crs/EPSG/0/3900http://www.opengis.net/def/crs/EPSG/0/3901http://www.opengis.net/def/crs/EPSG/0/3902http://www.opengis.net/def/crs/EPSG/0/3903http://www.opengis.net/def/crs/EPSG/0/3906http://www.opengis.net/def/crs/EPSG/0/3907http://www.opengis.net/def/crs/EPSG/0/3908http://www.opengis.net/def/crs/EPSG/0/3909http://www.opengis.net/def/crs/EPSG/0/3910http://www.opengis.net/def/crs/EPSG/0/3911http://www.opengis.net/def/crs/EPSG/0/3912http://www.opengis.net/def/crs/EPSG/0/3920http://www.opengis.net/def/crs/EPSG/0/3942http://www.opengis.net/def/crs/EPSG/0/3943http://www.opengis.net/def/crs/EPSG/0/3944http://www.opengis.net/def/crs/EPSG/0/3945http://www.opengis.net/def/crs/EPSG/0/3946http://www.opengis.net/def/crs/EPSG/0/3947http://www.opengis.net/def/crs/EPSG/0/3948http://www.opengis.net/def/crs/EPSG/0/3949http://www.opengis.net/def/crs/EPSG/0/3950http://www.opengis.net/def/crs/EPSG/0/3968http://www.opengis.net/def/crs/EPSG/0/3969http://www.opengis.net/def/crs/EPSG/0/3970http://www.opengis.net/def/crs/EPSG/0/3973http://www.opengis.net/def/crs/EPSG/0/3974http://www.opengis.net/def/crs/EPSG/0/3975http://www.opengis.net/def/crs/EPSG/0/3976http://www.opengis.net/def/crs/EPSG/0/3978http://www.opengis.net/def/crs/EPSG/0/3979http://www.opengis.net/def/crs/EPSG/0/3985http://www.opengis.net/def/crs/EPSG/0/3986http://www.opengis.net/def/crs/EPSG/0/3987http://www.opengis.net/def/crs/EPSG/0/3988http://www.opengis.net/def/crs/EPSG/0/3989http://www.opengis.net/def/crs/EPSG/0/3991http://www.opengis.net/def/crs/EPSG/0/3992http://www.opengis.net/def/crs/EPSG/0/3993http://www.opengis.net/def/crs/EPSG/0/3994http://www.opengis.net/def/crs/EPSG/0/3995http://www.opengis.net/def/crs/EPSG/0/3996http://www.opengis.net/def/crs/EPSG/0/3997http://www.opengis.net/def/crs/EPSG/0/4000http://www.opengis.net/def/crs/EPSG/0/4001http://www.opengis.net/def/crs/EPSG/0/4002http://www.opengis.net/def/crs/EPSG/0/4003http://www.opengis.net/def/crs/EPSG/0/4004http://www.opengis.net/def/crs/EPSG/0/4005http://www.opengis.net/def/crs/EPSG/0/4006http://www.opengis.net/def/crs/EPSG/0/4007http://www.opengis.net/def/crs/EPSG/0/4008http://www.opengis.net/def/crs/EPSG/0/4009http://www.opengis.net/def/crs/EPSG/0/4010http://www.opengis.net/def/crs/EPSG/0/4011http://www.opengis.net/def/crs/EPSG/0/4012http://www.opengis.net/def/crs/EPSG/0/4013http://www.opengis.net/def/crs/EPSG/0/4014http://www.opengis.net/def/crs/EPSG/0/4015http://www.opengis.net/def/crs/EPSG/0/4016http://www.opengis.net/def/crs/EPSG/0/4017http://www.opengis.net/def/crs/EPSG/0/4018http://www.opengis.net/def/crs/EPSG/0/4019http://www.opengis.net/def/crs/EPSG/0/4020http://www.opengis.net/def/crs/EPSG/0/4021http://www.opengis.net/def/crs/EPSG/0/4022http://www.opengis.net/def/crs/EPSG/0/4023http://www.opengis.net/def/crs/EPSG/0/4024http://www.opengis.net/def/crs/EPSG/0/4025http://www.opengis.net/def/crs/EPSG/0/4026http://www.opengis.net/def/crs/EPSG/0/4027http://www.opengis.net/def/crs/EPSG/0/4028http://www.opengis.net/def/crs/EPSG/0/4029http://www.opengis.net/def/crs/EPSG/0/4030http://www.opengis.net/def/crs/EPSG/0/4031http://www.opengis.net/def/crs/EPSG/0/4032http://www.opengis.net/def/crs/EPSG/0/4033http://www.opengis.net/def/crs/EPSG/0/4034http://www.opengis.net/def/crs/EPSG/0/4035http://www.opengis.net/def/crs/EPSG/0/4036http://www.opengis.net/def/crs/EPSG/0/4037http://www.opengis.net/def/crs/EPSG/0/4038http://www.opengis.net/def/crs/EPSG/0/4039http://www.opengis.net/def/crs/EPSG/0/4040http://www.opengis.net/def/crs/EPSG/0/4041http://www.opengis.net/def/crs/EPSG/0/4042http://www.opengis.net/def/crs/EPSG/0/4043http://www.opengis.net/def/crs/EPSG/0/4044http://www.opengis.net/def/crs/EPSG/0/4045http://www.opengis.net/def/crs/EPSG/0/4046http://www.opengis.net/def/crs/EPSG/0/4047http://www.opengis.net/def/crs/EPSG/0/4048http://www.opengis.net/def/crs/EPSG/0/4049http://www.opengis.net/def/crs/EPSG/0/4050http://www.opengis.net/def/crs/EPSG/0/4051http://www.opengis.net/def/crs/EPSG/0/4052http://www.opengis.net/def/crs/EPSG/0/4053http://www.opengis.net/def/crs/EPSG/0/4054http://www.opengis.net/def/crs/EPSG/0/4055http://www.opengis.net/def/crs/EPSG/0/4056http://www.opengis.net/def/crs/EPSG/0/4057http://www.opengis.net/def/crs/EPSG/0/4058http://www.opengis.net/def/crs/EPSG/0/4059http://www.opengis.net/def/crs/EPSG/0/4060http://www.opengis.net/def/crs/EPSG/0/4061http://www.opengis.net/def/crs/EPSG/0/4062http://www.opengis.net/def/crs/EPSG/0/4063http://www.opengis.net/def/crs/EPSG/0/4071http://www.opengis.net/def/crs/EPSG/0/4073http://www.opengis.net/def/crs/EPSG/0/4074http://www.opengis.net/def/crs/EPSG/0/4075http://www.opengis.net/def/crs/EPSG/0/4079http://www.opengis.net/def/crs/EPSG/0/4080http://www.opengis.net/def/crs/EPSG/0/4081http://www.opengis.net/def/crs/EPSG/0/4082http://www.opengis.net/def/crs/EPSG/0/4083http://www.opengis.net/def/crs/EPSG/0/4087http://www.opengis.net/def/crs/EPSG/0/4088http://www.opengis.net/def/crs/EPSG/0/4093http://www.opengis.net/def/crs/EPSG/0/4094http://www.opengis.net/def/crs/EPSG/0/4095http://www.opengis.net/def/crs/EPSG/0/4096http://www.opengis.net/def/crs/EPSG/0/4097http://www.opengis.net/def/crs/EPSG/0/4098http://www.opengis.net/def/crs/EPSG/0/4099http://www.opengis.net/def/crs/EPSG/0/4100http://www.opengis.net/def/crs/EPSG/0/4120http://www.opengis.net/def/crs/EPSG/0/4121http://www.opengis.net/def/crs/EPSG/0/4122http://www.opengis.net/def/crs/EPSG/0/4123http://www.opengis.net/def/crs/EPSG/0/4124http://www.opengis.net/def/crs/EPSG/0/4125http://www.opengis.net/def/crs/EPSG/0/4126http://www.opengis.net/def/crs/EPSG/0/4127http://www.opengis.net/def/crs/EPSG/0/4128http://www.opengis.net/def/crs/EPSG/0/4129http://www.opengis.net/def/crs/EPSG/0/4130http://www.opengis.net/def/crs/EPSG/0/4131http://www.opengis.net/def/crs/EPSG/0/4132http://www.opengis.net/def/crs/EPSG/0/4133http://www.opengis.net/def/crs/EPSG/0/4134http://www.opengis.net/def/crs/EPSG/0/4135http://www.opengis.net/def/crs/EPSG/0/4136http://www.opengis.net/def/crs/EPSG/0/4137http://www.opengis.net/def/crs/EPSG/0/4138http://www.opengis.net/def/crs/EPSG/0/4139http://www.opengis.net/def/crs/EPSG/0/4140http://www.opengis.net/def/crs/EPSG/0/4141http://www.opengis.net/def/crs/EPSG/0/4142http://www.opengis.net/def/crs/EPSG/0/4143http://www.opengis.net/def/crs/EPSG/0/4144http://www.opengis.net/def/crs/EPSG/0/4145http://www.opengis.net/def/crs/EPSG/0/4146http://www.opengis.net/def/crs/EPSG/0/4147http://www.opengis.net/def/crs/EPSG/0/4148http://www.opengis.net/def/crs/EPSG/0/4149http://www.opengis.net/def/crs/EPSG/0/4150http://www.opengis.net/def/crs/EPSG/0/4151http://www.opengis.net/def/crs/EPSG/0/4152http://www.opengis.net/def/crs/EPSG/0/4153http://www.opengis.net/def/crs/EPSG/0/4154http://www.opengis.net/def/crs/EPSG/0/4155http://www.opengis.net/def/crs/EPSG/0/4156http://www.opengis.net/def/crs/EPSG/0/4157http://www.opengis.net/def/crs/EPSG/0/4158http://www.opengis.net/def/crs/EPSG/0/4159http://www.opengis.net/def/crs/EPSG/0/4160http://www.opengis.net/def/crs/EPSG/0/4161http://www.opengis.net/def/crs/EPSG/0/4162http://www.opengis.net/def/crs/EPSG/0/4163http://www.opengis.net/def/crs/EPSG/0/4164http://www.opengis.net/def/crs/EPSG/0/4165http://www.opengis.net/def/crs/EPSG/0/4166http://www.opengis.net/def/crs/EPSG/0/4167http://www.opengis.net/def/crs/EPSG/0/4168http://www.opengis.net/def/crs/EPSG/0/4169http://www.opengis.net/def/crs/EPSG/0/4170http://www.opengis.net/def/crs/EPSG/0/4171http://www.opengis.net/def/crs/EPSG/0/4172http://www.opengis.net/def/crs/EPSG/0/4173http://www.opengis.net/def/crs/EPSG/0/4174http://www.opengis.net/def/crs/EPSG/0/4175http://www.opengis.net/def/crs/EPSG/0/4176http://www.opengis.net/def/crs/EPSG/0/4178http://www.opengis.net/def/crs/EPSG/0/4179http://www.opengis.net/def/crs/EPSG/0/4180http://www.opengis.net/def/crs/EPSG/0/4181http://www.opengis.net/def/crs/EPSG/0/4182http://www.opengis.net/def/crs/EPSG/0/4183http://www.opengis.net/def/crs/EPSG/0/4184http://www.opengis.net/def/crs/EPSG/0/4185http://www.opengis.net/def/crs/EPSG/0/4188http://www.opengis.net/def/crs/EPSG/0/4189http://www.opengis.net/def/crs/EPSG/0/4190http://www.opengis.net/def/crs/EPSG/0/4191http://www.opengis.net/def/crs/EPSG/0/4192http://www.opengis.net/def/crs/EPSG/0/4193http://www.opengis.net/def/crs/EPSG/0/4194http://www.opengis.net/def/crs/EPSG/0/4195http://www.opengis.net/def/crs/EPSG/0/4196http://www.opengis.net/def/crs/EPSG/0/4197http://www.opengis.net/def/crs/EPSG/0/4198http://www.opengis.net/def/crs/EPSG/0/4199http://www.opengis.net/def/crs/EPSG/0/4200http://www.opengis.net/def/crs/EPSG/0/4201http://www.opengis.net/def/crs/EPSG/0/4202http://www.opengis.net/def/crs/EPSG/0/4203http://www.opengis.net/def/crs/EPSG/0/4204http://www.opengis.net/def/crs/EPSG/0/4205http://www.opengis.net/def/crs/EPSG/0/4206http://www.opengis.net/def/crs/EPSG/0/4207http://www.opengis.net/def/crs/EPSG/0/4208http://www.opengis.net/def/crs/EPSG/0/4209http://www.opengis.net/def/crs/EPSG/0/4210http://www.opengis.net/def/crs/EPSG/0/4211http://www.opengis.net/def/crs/EPSG/0/4212http://www.opengis.net/def/crs/EPSG/0/4213http://www.opengis.net/def/crs/EPSG/0/4214http://www.opengis.net/def/crs/EPSG/0/4215http://www.opengis.net/def/crs/EPSG/0/4216http://www.opengis.net/def/crs/EPSG/0/4217http://www.opengis.net/def/crs/EPSG/0/4218http://www.opengis.net/def/crs/EPSG/0/4219http://www.opengis.net/def/crs/EPSG/0/4220http://www.opengis.net/def/crs/EPSG/0/4221http://www.opengis.net/def/crs/EPSG/0/4222http://www.opengis.net/def/crs/EPSG/0/4223http://www.opengis.net/def/crs/EPSG/0/4224http://www.opengis.net/def/crs/EPSG/0/4225http://www.opengis.net/def/crs/EPSG/0/4226http://www.opengis.net/def/crs/EPSG/0/4227http://www.opengis.net/def/crs/EPSG/0/4228http://www.opengis.net/def/crs/EPSG/0/4229http://www.opengis.net/def/crs/EPSG/0/4230http://www.opengis.net/def/crs/EPSG/0/4231http://www.opengis.net/def/crs/EPSG/0/4232http://www.opengis.net/def/crs/EPSG/0/4233http://www.opengis.net/def/crs/EPSG/0/4234http://www.opengis.net/def/crs/EPSG/0/4235http://www.opengis.net/def/crs/EPSG/0/4236http://www.opengis.net/def/crs/EPSG/0/4237http://www.opengis.net/def/crs/EPSG/0/4238http://www.opengis.net/def/crs/EPSG/0/4239http://www.opengis.net/def/crs/EPSG/0/4240http://www.opengis.net/def/crs/EPSG/0/4241http://www.opengis.net/def/crs/EPSG/0/4242http://www.opengis.net/def/crs/EPSG/0/4243http://www.opengis.net/def/crs/EPSG/0/4244http://www.opengis.net/def/crs/EPSG/0/4245http://www.opengis.net/def/crs/EPSG/0/4246http://www.opengis.net/def/crs/EPSG/0/4247http://www.opengis.net/def/crs/EPSG/0/4248http://www.opengis.net/def/crs/EPSG/0/4249http://www.opengis.net/def/crs/EPSG/0/4250http://www.opengis.net/def/crs/EPSG/0/4251http://www.opengis.net/def/crs/EPSG/0/4252http://www.opengis.net/def/crs/EPSG/0/4253http://www.opengis.net/def/crs/EPSG/0/4254http://www.opengis.net/def/crs/EPSG/0/4255http://www.opengis.net/def/crs/EPSG/0/4256http://www.opengis.net/def/crs/EPSG/0/4257http://www.opengis.net/def/crs/EPSG/0/4258http://www.opengis.net/def/crs/EPSG/0/4259http://www.opengis.net/def/crs/EPSG/0/4260http://www.opengis.net/def/crs/EPSG/0/4261http://www.opengis.net/def/crs/EPSG/0/4262http://www.opengis.net/def/crs/EPSG/0/4263http://www.opengis.net/def/crs/EPSG/0/4264http://www.opengis.net/def/crs/EPSG/0/4265http://www.opengis.net/def/crs/EPSG/0/4266http://www.opengis.net/def/crs/EPSG/0/4267http://www.opengis.net/def/crs/EPSG/0/4268http://www.opengis.net/def/crs/EPSG/0/4269http://www.opengis.net/def/crs/EPSG/0/4270http://www.opengis.net/def/crs/EPSG/0/4271http://www.opengis.net/def/crs/EPSG/0/4272http://www.opengis.net/def/crs/EPSG/0/4273http://www.opengis.net/def/crs/EPSG/0/4274http://www.opengis.net/def/crs/EPSG/0/4275http://www.opengis.net/def/crs/EPSG/0/4276http://www.opengis.net/def/crs/EPSG/0/4277http://www.opengis.net/def/crs/EPSG/0/4278http://www.opengis.net/def/crs/EPSG/0/4279http://www.opengis.net/def/crs/EPSG/0/4280http://www.opengis.net/def/crs/EPSG/0/4281http://www.opengis.net/def/crs/EPSG/0/4282http://www.opengis.net/def/crs/EPSG/0/4283http://www.opengis.net/def/crs/EPSG/0/4284http://www.opengis.net/def/crs/EPSG/0/4285http://www.opengis.net/def/crs/EPSG/0/4286http://www.opengis.net/def/crs/EPSG/0/4287http://www.opengis.net/def/crs/EPSG/0/4288http://www.opengis.net/def/crs/EPSG/0/4289http://www.opengis.net/def/crs/EPSG/0/4291http://www.opengis.net/def/crs/EPSG/0/4292http://www.opengis.net/def/crs/EPSG/0/4293http://www.opengis.net/def/crs/EPSG/0/4294http://www.opengis.net/def/crs/EPSG/0/4295http://www.opengis.net/def/crs/EPSG/0/4296http://www.opengis.net/def/crs/EPSG/0/4297http://www.opengis.net/def/crs/EPSG/0/4298http://www.opengis.net/def/crs/EPSG/0/4299http://www.opengis.net/def/crs/EPSG/0/4300http://www.opengis.net/def/crs/EPSG/0/4301http://www.opengis.net/def/crs/EPSG/0/4302http://www.opengis.net/def/crs/EPSG/0/4303http://www.opengis.net/def/crs/EPSG/0/4304http://www.opengis.net/def/crs/EPSG/0/4306http://www.opengis.net/def/crs/EPSG/0/4307http://www.opengis.net/def/crs/EPSG/0/4308http://www.opengis.net/def/crs/EPSG/0/4309http://www.opengis.net/def/crs/EPSG/0/4310http://www.opengis.net/def/crs/EPSG/0/4311http://www.opengis.net/def/crs/EPSG/0/4312http://www.opengis.net/def/crs/EPSG/0/4313http://www.opengis.net/def/crs/EPSG/0/4314http://www.opengis.net/def/crs/EPSG/0/4315http://www.opengis.net/def/crs/EPSG/0/4316http://www.opengis.net/def/crs/EPSG/0/4317http://www.opengis.net/def/crs/EPSG/0/4318http://www.opengis.net/def/crs/EPSG/0/4319http://www.opengis.net/def/crs/EPSG/0/4322http://www.opengis.net/def/crs/EPSG/0/4324http://www.opengis.net/def/crs/EPSG/0/4326http://www.opengis.net/def/crs/EPSG/0/4327http://www.opengis.net/def/crs/EPSG/0/4328http://www.opengis.net/def/crs/EPSG/0/4329http://www.opengis.net/def/crs/EPSG/0/4330http://www.opengis.net/def/crs/EPSG/0/4331http://www.opengis.net/def/crs/EPSG/0/4332http://www.opengis.net/def/crs/EPSG/0/4333http://www.opengis.net/def/crs/EPSG/0/4334http://www.opengis.net/def/crs/EPSG/0/4335http://www.opengis.net/def/crs/EPSG/0/4336http://www.opengis.net/def/crs/EPSG/0/4337http://www.opengis.net/def/crs/EPSG/0/4338http://www.opengis.net/def/crs/EPSG/0/4339http://www.opengis.net/def/crs/EPSG/0/4340http://www.opengis.net/def/crs/EPSG/0/4341http://www.opengis.net/def/crs/EPSG/0/4342http://www.opengis.net/def/crs/EPSG/0/4343http://www.opengis.net/def/crs/EPSG/0/4344http://www.opengis.net/def/crs/EPSG/0/4345http://www.opengis.net/def/crs/EPSG/0/4346http://www.opengis.net/def/crs/EPSG/0/4347http://www.opengis.net/def/crs/EPSG/0/4348http://www.opengis.net/def/crs/EPSG/0/4349http://www.opengis.net/def/crs/EPSG/0/4350http://www.opengis.net/def/crs/EPSG/0/4351http://www.opengis.net/def/crs/EPSG/0/4352http://www.opengis.net/def/crs/EPSG/0/4353http://www.opengis.net/def/crs/EPSG/0/4354http://www.opengis.net/def/crs/EPSG/0/4355http://www.opengis.net/def/crs/EPSG/0/4356http://www.opengis.net/def/crs/EPSG/0/4357http://www.opengis.net/def/crs/EPSG/0/4358http://www.opengis.net/def/crs/EPSG/0/4359http://www.opengis.net/def/crs/EPSG/0/4360http://www.opengis.net/def/crs/EPSG/0/4361http://www.opengis.net/def/crs/EPSG/0/4362http://www.opengis.net/def/crs/EPSG/0/4363http://www.opengis.net/def/crs/EPSG/0/4364http://www.opengis.net/def/crs/EPSG/0/4365http://www.opengis.net/def/crs/EPSG/0/4366http://www.opengis.net/def/crs/EPSG/0/4367http://www.opengis.net/def/crs/EPSG/0/4368http://www.opengis.net/def/crs/EPSG/0/4369http://www.opengis.net/def/crs/EPSG/0/4370http://www.opengis.net/def/crs/EPSG/0/4371http://www.opengis.net/def/crs/EPSG/0/4372http://www.opengis.net/def/crs/EPSG/0/4373http://www.opengis.net/def/crs/EPSG/0/4374http://www.opengis.net/def/crs/EPSG/0/4375http://www.opengis.net/def/crs/EPSG/0/4376http://www.opengis.net/def/crs/EPSG/0/4377http://www.opengis.net/def/crs/EPSG/0/4378http://www.opengis.net/def/crs/EPSG/0/4379http://www.opengis.net/def/crs/EPSG/0/4380http://www.opengis.net/def/crs/EPSG/0/4381http://www.opengis.net/def/crs/EPSG/0/4382http://www.opengis.net/def/crs/EPSG/0/4383http://www.opengis.net/def/crs/EPSG/0/4384http://www.opengis.net/def/crs/EPSG/0/4385http://www.opengis.net/def/crs/EPSG/0/4386http://www.opengis.net/def/crs/EPSG/0/4387http://www.opengis.net/def/crs/EPSG/0/4388http://www.opengis.net/def/crs/EPSG/0/4389http://www.opengis.net/def/crs/EPSG/0/4390http://www.opengis.net/def/crs/EPSG/0/4391http://www.opengis.net/def/crs/EPSG/0/4392http://www.opengis.net/def/crs/EPSG/0/4393http://www.opengis.net/def/crs/EPSG/0/4394http://www.opengis.net/def/crs/EPSG/0/4395http://www.opengis.net/def/crs/EPSG/0/4396http://www.opengis.net/def/crs/EPSG/0/4397http://www.opengis.net/def/crs/EPSG/0/4398http://www.opengis.net/def/crs/EPSG/0/4399http://www.opengis.net/def/crs/EPSG/0/4400http://www.opengis.net/def/crs/EPSG/0/4401http://www.opengis.net/def/crs/EPSG/0/4402http://www.opengis.net/def/crs/EPSG/0/4403http://www.opengis.net/def/crs/EPSG/0/4404http://www.opengis.net/def/crs/EPSG/0/4405http://www.opengis.net/def/crs/EPSG/0/4406http://www.opengis.net/def/crs/EPSG/0/4407http://www.opengis.net/def/crs/EPSG/0/4408http://www.opengis.net/def/crs/EPSG/0/4409http://www.opengis.net/def/crs/EPSG/0/4410http://www.opengis.net/def/crs/EPSG/0/4411http://www.opengis.net/def/crs/EPSG/0/4412http://www.opengis.net/def/crs/EPSG/0/4413http://www.opengis.net/def/crs/EPSG/0/4414http://www.opengis.net/def/crs/EPSG/0/4415http://www.opengis.net/def/crs/EPSG/0/4417http://www.opengis.net/def/crs/EPSG/0/4418http://www.opengis.net/def/crs/EPSG/0/4419http://www.opengis.net/def/crs/EPSG/0/4420http://www.opengis.net/def/crs/EPSG/0/4421http://www.opengis.net/def/crs/EPSG/0/4422http://www.opengis.net/def/crs/EPSG/0/4423http://www.opengis.net/def/crs/EPSG/0/4424http://www.opengis.net/def/crs/EPSG/0/4425http://www.opengis.net/def/crs/EPSG/0/4426http://www.opengis.net/def/crs/EPSG/0/4427http://www.opengis.net/def/crs/EPSG/0/4428http://www.opengis.net/def/crs/EPSG/0/4429http://www.opengis.net/def/crs/EPSG/0/4430http://www.opengis.net/def/crs/EPSG/0/4431http://www.opengis.net/def/crs/EPSG/0/4432http://www.opengis.net/def/crs/EPSG/0/4433http://www.opengis.net/def/crs/EPSG/0/4434http://www.opengis.net/def/crs/EPSG/0/4437http://www.opengis.net/def/crs/EPSG/0/4438http://www.opengis.net/def/crs/EPSG/0/4439http://www.opengis.net/def/crs/EPSG/0/4440http://www.opengis.net/def/crs/EPSG/0/4455http://www.opengis.net/def/crs/EPSG/0/4456http://www.opengis.net/def/crs/EPSG/0/4457http://www.opengis.net/def/crs/EPSG/0/4458http://www.opengis.net/def/crs/EPSG/0/4462http://www.opengis.net/def/crs/EPSG/0/4463http://www.opengis.net/def/crs/EPSG/0/4465http://www.opengis.net/def/crs/EPSG/0/4466http://www.opengis.net/def/crs/EPSG/0/4467http://www.opengis.net/def/crs/EPSG/0/4468http://www.opengis.net/def/crs/EPSG/0/4469http://www.opengis.net/def/crs/EPSG/0/4470http://www.opengis.net/def/crs/EPSG/0/4471http://www.opengis.net/def/crs/EPSG/0/4472http://www.opengis.net/def/crs/EPSG/0/4473http://www.opengis.net/def/crs/EPSG/0/4474http://www.opengis.net/def/crs/EPSG/0/4475http://www.opengis.net/def/crs/EPSG/0/4479http://www.opengis.net/def/crs/EPSG/0/4480http://www.opengis.net/def/crs/EPSG/0/4481http://www.opengis.net/def/crs/EPSG/0/4482http://www.opengis.net/def/crs/EPSG/0/4483http://www.opengis.net/def/crs/EPSG/0/4484http://www.opengis.net/def/crs/EPSG/0/4485http://www.opengis.net/def/crs/EPSG/0/4486http://www.opengis.net/def/crs/EPSG/0/4487http://www.opengis.net/def/crs/EPSG/0/4488http://www.opengis.net/def/crs/EPSG/0/4489http://www.opengis.net/def/crs/EPSG/0/4490http://www.opengis.net/def/crs/EPSG/0/4491http://www.opengis.net/def/crs/EPSG/0/4492http://www.opengis.net/def/crs/EPSG/0/4493http://www.opengis.net/def/crs/EPSG/0/4494http://www.opengis.net/def/crs/EPSG/0/4495http://www.opengis.net/def/crs/EPSG/0/4496http://www.opengis.net/def/crs/EPSG/0/4497http://www.opengis.net/def/crs/EPSG/0/4498http://www.opengis.net/def/crs/EPSG/0/4499http://www.opengis.net/def/crs/EPSG/0/4500http://www.opengis.net/def/crs/EPSG/0/4501http://www.opengis.net/def/crs/EPSG/0/4502http://www.opengis.net/def/crs/EPSG/0/4503http://www.opengis.net/def/crs/EPSG/0/4504http://www.opengis.net/def/crs/EPSG/0/4505http://www.opengis.net/def/crs/EPSG/0/4506http://www.opengis.net/def/crs/EPSG/0/4507http://www.opengis.net/def/crs/EPSG/0/4508http://www.opengis.net/def/crs/EPSG/0/4509http://www.opengis.net/def/crs/EPSG/0/4510http://www.opengis.net/def/crs/EPSG/0/4511http://www.opengis.net/def/crs/EPSG/0/4512http://www.opengis.net/def/crs/EPSG/0/4513http://www.opengis.net/def/crs/EPSG/0/4514http://www.opengis.net/def/crs/EPSG/0/4515http://www.opengis.net/def/crs/EPSG/0/4516http://www.opengis.net/def/crs/EPSG/0/4517http://www.opengis.net/def/crs/EPSG/0/4518http://www.opengis.net/def/crs/EPSG/0/4519http://www.opengis.net/def/crs/EPSG/0/4520http://www.opengis.net/def/crs/EPSG/0/4521http://www.opengis.net/def/crs/EPSG/0/4522http://www.opengis.net/def/crs/EPSG/0/4523http://www.opengis.net/def/crs/EPSG/0/4524http://www.opengis.net/def/crs/EPSG/0/4525http://www.opengis.net/def/crs/EPSG/0/4526http://www.opengis.net/def/crs/EPSG/0/4527http://www.opengis.net/def/crs/EPSG/0/4528http://www.opengis.net/def/crs/EPSG/0/4529http://www.opengis.net/def/crs/EPSG/0/4530http://www.opengis.net/def/crs/EPSG/0/4531http://www.opengis.net/def/crs/EPSG/0/4532http://www.opengis.net/def/crs/EPSG/0/4533http://www.opengis.net/def/crs/EPSG/0/4534http://www.opengis.net/def/crs/EPSG/0/4535http://www.opengis.net/def/crs/EPSG/0/4536http://www.opengis.net/def/crs/EPSG/0/4537http://www.opengis.net/def/crs/EPSG/0/4538http://www.opengis.net/def/crs/EPSG/0/4539http://www.opengis.net/def/crs/EPSG/0/4540http://www.opengis.net/def/crs/EPSG/0/4541http://www.opengis.net/def/crs/EPSG/0/4542http://www.opengis.net/def/crs/EPSG/0/4543http://www.opengis.net/def/crs/EPSG/0/4544http://www.opengis.net/def/crs/EPSG/0/4545http://www.opengis.net/def/crs/EPSG/0/4546http://www.opengis.net/def/crs/EPSG/0/4547http://www.opengis.net/def/crs/EPSG/0/4548http://www.opengis.net/def/crs/EPSG/0/4549http://www.opengis.net/def/crs/EPSG/0/4550http://www.opengis.net/def/crs/EPSG/0/4551http://www.opengis.net/def/crs/EPSG/0/4552http://www.opengis.net/def/crs/EPSG/0/4553http://www.opengis.net/def/crs/EPSG/0/4554http://www.opengis.net/def/crs/EPSG/0/4555http://www.opengis.net/def/crs/EPSG/0/4556http://www.opengis.net/def/crs/EPSG/0/4557http://www.opengis.net/def/crs/EPSG/0/4558http://www.opengis.net/def/crs/EPSG/0/4559http://www.opengis.net/def/crs/EPSG/0/4568http://www.opengis.net/def/crs/EPSG/0/4569http://www.opengis.net/def/crs/EPSG/0/4570http://www.opengis.net/def/crs/EPSG/0/4571http://www.opengis.net/def/crs/EPSG/0/4572http://www.opengis.net/def/crs/EPSG/0/4573http://www.opengis.net/def/crs/EPSG/0/4574http://www.opengis.net/def/crs/EPSG/0/4575http://www.opengis.net/def/crs/EPSG/0/4576http://www.opengis.net/def/crs/EPSG/0/4577http://www.opengis.net/def/crs/EPSG/0/4578http://www.opengis.net/def/crs/EPSG/0/4579http://www.opengis.net/def/crs/EPSG/0/4580http://www.opengis.net/def/crs/EPSG/0/4581http://www.opengis.net/def/crs/EPSG/0/4582http://www.opengis.net/def/crs/EPSG/0/4583http://www.opengis.net/def/crs/EPSG/0/4584http://www.opengis.net/def/crs/EPSG/0/4585http://www.opengis.net/def/crs/EPSG/0/4586http://www.opengis.net/def/crs/EPSG/0/4587http://www.opengis.net/def/crs/EPSG/0/4588http://www.opengis.net/def/crs/EPSG/0/4589http://www.opengis.net/def/crs/EPSG/0/4600http://www.opengis.net/def/crs/EPSG/0/4601http://www.opengis.net/def/crs/EPSG/0/4602http://www.opengis.net/def/crs/EPSG/0/4603http://www.opengis.net/def/crs/EPSG/0/4604http://www.opengis.net/def/crs/EPSG/0/4605http://www.opengis.net/def/crs/EPSG/0/4606http://www.opengis.net/def/crs/EPSG/0/4607http://www.opengis.net/def/crs/EPSG/0/4608http://www.opengis.net/def/crs/EPSG/0/4609http://www.opengis.net/def/crs/EPSG/0/4610http://www.opengis.net/def/crs/EPSG/0/4611http://www.opengis.net/def/crs/EPSG/0/4612http://www.opengis.net/def/crs/EPSG/0/4613http://www.opengis.net/def/crs/EPSG/0/4614http://www.opengis.net/def/crs/EPSG/0/4615http://www.opengis.net/def/crs/EPSG/0/4616http://www.opengis.net/def/crs/EPSG/0/4617http://www.opengis.net/def/crs/EPSG/0/4618http://www.opengis.net/def/crs/EPSG/0/4619http://www.opengis.net/def/crs/EPSG/0/4620http://www.opengis.net/def/crs/EPSG/0/4621http://www.opengis.net/def/crs/EPSG/0/4622http://www.opengis.net/def/crs/EPSG/0/4623http://www.opengis.net/def/crs/EPSG/0/4624http://www.opengis.net/def/crs/EPSG/0/4625http://www.opengis.net/def/crs/EPSG/0/4626http://www.opengis.net/def/crs/EPSG/0/4627http://www.opengis.net/def/crs/EPSG/0/4628http://www.opengis.net/def/crs/EPSG/0/4629http://www.opengis.net/def/crs/EPSG/0/4630http://www.opengis.net/def/crs/EPSG/0/4631http://www.opengis.net/def/crs/EPSG/0/4632http://www.opengis.net/def/crs/EPSG/0/4633http://www.opengis.net/def/crs/EPSG/0/4634http://www.opengis.net/def/crs/EPSG/0/4635http://www.opengis.net/def/crs/EPSG/0/4636http://www.opengis.net/def/crs/EPSG/0/4637http://www.opengis.net/def/crs/EPSG/0/4638http://www.opengis.net/def/crs/EPSG/0/4639http://www.opengis.net/def/crs/EPSG/0/4640http://www.opengis.net/def/crs/EPSG/0/4641http://www.opengis.net/def/crs/EPSG/0/4642http://www.opengis.net/def/crs/EPSG/0/4643http://www.opengis.net/def/crs/EPSG/0/4644http://www.opengis.net/def/crs/EPSG/0/4645http://www.opengis.net/def/crs/EPSG/0/4646http://www.opengis.net/def/crs/EPSG/0/4647http://www.opengis.net/def/crs/EPSG/0/4652http://www.opengis.net/def/crs/EPSG/0/4653http://www.opengis.net/def/crs/EPSG/0/4654http://www.opengis.net/def/crs/EPSG/0/4655http://www.opengis.net/def/crs/EPSG/0/4656http://www.opengis.net/def/crs/EPSG/0/4657http://www.opengis.net/def/crs/EPSG/0/4658http://www.opengis.net/def/crs/EPSG/0/4659http://www.opengis.net/def/crs/EPSG/0/4660http://www.opengis.net/def/crs/EPSG/0/4661http://www.opengis.net/def/crs/EPSG/0/4662http://www.opengis.net/def/crs/EPSG/0/4663http://www.opengis.net/def/crs/EPSG/0/4664http://www.opengis.net/def/crs/EPSG/0/4665http://www.opengis.net/def/crs/EPSG/0/4666http://www.opengis.net/def/crs/EPSG/0/4667http://www.opengis.net/def/crs/EPSG/0/4668http://www.opengis.net/def/crs/EPSG/0/4669http://www.opengis.net/def/crs/EPSG/0/4670http://www.opengis.net/def/crs/EPSG/0/4671http://www.opengis.net/def/crs/EPSG/0/4672http://www.opengis.net/def/crs/EPSG/0/4673http://www.opengis.net/def/crs/EPSG/0/4674http://www.opengis.net/def/crs/EPSG/0/4675http://www.opengis.net/def/crs/EPSG/0/4676http://www.opengis.net/def/crs/EPSG/0/4677http://www.opengis.net/def/crs/EPSG/0/4678http://www.opengis.net/def/crs/EPSG/0/4679http://www.opengis.net/def/crs/EPSG/0/4680http://www.opengis.net/def/crs/EPSG/0/4681http://www.opengis.net/def/crs/EPSG/0/4682http://www.opengis.net/def/crs/EPSG/0/4683http://www.opengis.net/def/crs/EPSG/0/4684http://www.opengis.net/def/crs/EPSG/0/4685http://www.opengis.net/def/crs/EPSG/0/4686http://www.opengis.net/def/crs/EPSG/0/4687http://www.opengis.net/def/crs/EPSG/0/4688http://www.opengis.net/def/crs/EPSG/0/4689http://www.opengis.net/def/crs/EPSG/0/4690http://www.opengis.net/def/crs/EPSG/0/4691http://www.opengis.net/def/crs/EPSG/0/4692http://www.opengis.net/def/crs/EPSG/0/4693http://www.opengis.net/def/crs/EPSG/0/4694http://www.opengis.net/def/crs/EPSG/0/4695http://www.opengis.net/def/crs/EPSG/0/4696http://www.opengis.net/def/crs/EPSG/0/4697http://www.opengis.net/def/crs/EPSG/0/4698http://www.opengis.net/def/crs/EPSG/0/4699http://www.opengis.net/def/crs/EPSG/0/4700http://www.opengis.net/def/crs/EPSG/0/4701http://www.opengis.net/def/crs/EPSG/0/4702http://www.opengis.net/def/crs/EPSG/0/4703http://www.opengis.net/def/crs/EPSG/0/4704http://www.opengis.net/def/crs/EPSG/0/4705http://www.opengis.net/def/crs/EPSG/0/4706http://www.opengis.net/def/crs/EPSG/0/4707http://www.opengis.net/def/crs/EPSG/0/4708http://www.opengis.net/def/crs/EPSG/0/4709http://www.opengis.net/def/crs/EPSG/0/4710http://www.opengis.net/def/crs/EPSG/0/4711http://www.opengis.net/def/crs/EPSG/0/4712http://www.opengis.net/def/crs/EPSG/0/4713http://www.opengis.net/def/crs/EPSG/0/4714http://www.opengis.net/def/crs/EPSG/0/4715http://www.opengis.net/def/crs/EPSG/0/4716http://www.opengis.net/def/crs/EPSG/0/4717http://www.opengis.net/def/crs/EPSG/0/4718http://www.opengis.net/def/crs/EPSG/0/4719http://www.opengis.net/def/crs/EPSG/0/4720http://www.opengis.net/def/crs/EPSG/0/4721http://www.opengis.net/def/crs/EPSG/0/4722http://www.opengis.net/def/crs/EPSG/0/4723http://www.opengis.net/def/crs/EPSG/0/4724http://www.opengis.net/def/crs/EPSG/0/4725http://www.opengis.net/def/crs/EPSG/0/4726http://www.opengis.net/def/crs/EPSG/0/4727http://www.opengis.net/def/crs/EPSG/0/4728http://www.opengis.net/def/crs/EPSG/0/4729http://www.opengis.net/def/crs/EPSG/0/4730http://www.opengis.net/def/crs/EPSG/0/4731http://www.opengis.net/def/crs/EPSG/0/4732http://www.opengis.net/def/crs/EPSG/0/4733http://www.opengis.net/def/crs/EPSG/0/4734http://www.opengis.net/def/crs/EPSG/0/4735http://www.opengis.net/def/crs/EPSG/0/4736http://www.opengis.net/def/crs/EPSG/0/4737http://www.opengis.net/def/crs/EPSG/0/4738http://www.opengis.net/def/crs/EPSG/0/4739http://www.opengis.net/def/crs/EPSG/0/4740http://www.opengis.net/def/crs/EPSG/0/4741http://www.opengis.net/def/crs/EPSG/0/4742http://www.opengis.net/def/crs/EPSG/0/4743http://www.opengis.net/def/crs/EPSG/0/4744http://www.opengis.net/def/crs/EPSG/0/4745http://www.opengis.net/def/crs/EPSG/0/4746http://www.opengis.net/def/crs/EPSG/0/4747http://www.opengis.net/def/crs/EPSG/0/4748http://www.opengis.net/def/crs/EPSG/0/4749http://www.opengis.net/def/crs/EPSG/0/4750http://www.opengis.net/def/crs/EPSG/0/4751http://www.opengis.net/def/crs/EPSG/0/4752http://www.opengis.net/def/crs/EPSG/0/4753http://www.opengis.net/def/crs/EPSG/0/4754http://www.opengis.net/def/crs/EPSG/0/4755http://www.opengis.net/def/crs/EPSG/0/4756http://www.opengis.net/def/crs/EPSG/0/4757http://www.opengis.net/def/crs/EPSG/0/4758http://www.opengis.net/def/crs/EPSG/0/4759http://www.opengis.net/def/crs/EPSG/0/4760http://www.opengis.net/def/crs/EPSG/0/4761http://www.opengis.net/def/crs/EPSG/0/4762http://www.opengis.net/def/crs/EPSG/0/4763http://www.opengis.net/def/crs/EPSG/0/4764http://www.opengis.net/def/crs/EPSG/0/4765http://www.opengis.net/def/crs/EPSG/0/4766http://www.opengis.net/def/crs/EPSG/0/4767http://www.opengis.net/def/crs/EPSG/0/4768http://www.opengis.net/def/crs/EPSG/0/4769http://www.opengis.net/def/crs/EPSG/0/4770http://www.opengis.net/def/crs/EPSG/0/4771http://www.opengis.net/def/crs/EPSG/0/4772http://www.opengis.net/def/crs/EPSG/0/4773http://www.opengis.net/def/crs/EPSG/0/4774http://www.opengis.net/def/crs/EPSG/0/4775http://www.opengis.net/def/crs/EPSG/0/4776http://www.opengis.net/def/crs/EPSG/0/4777http://www.opengis.net/def/crs/EPSG/0/4778http://www.opengis.net/def/crs/EPSG/0/4779http://www.opengis.net/def/crs/EPSG/0/4780http://www.opengis.net/def/crs/EPSG/0/4781http://www.opengis.net/def/crs/EPSG/0/4782http://www.opengis.net/def/crs/EPSG/0/4783http://www.opengis.net/def/crs/EPSG/0/4784http://www.opengis.net/def/crs/EPSG/0/4785http://www.opengis.net/def/crs/EPSG/0/4786http://www.opengis.net/def/crs/EPSG/0/4787http://www.opengis.net/def/crs/EPSG/0/4788http://www.opengis.net/def/crs/EPSG/0/4789http://www.opengis.net/def/crs/EPSG/0/4790http://www.opengis.net/def/crs/EPSG/0/4791http://www.opengis.net/def/crs/EPSG/0/4792http://www.opengis.net/def/crs/EPSG/0/4793http://www.opengis.net/def/crs/EPSG/0/4794http://www.opengis.net/def/crs/EPSG/0/4795http://www.opengis.net/def/crs/EPSG/0/4796http://www.opengis.net/def/crs/EPSG/0/4797http://www.opengis.net/def/crs/EPSG/0/4798http://www.opengis.net/def/crs/EPSG/0/4799http://www.opengis.net/def/crs/EPSG/0/4800http://www.opengis.net/def/crs/EPSG/0/4801http://www.opengis.net/def/crs/EPSG/0/4802http://www.opengis.net/def/crs/EPSG/0/4803http://www.opengis.net/def/crs/EPSG/0/4804http://www.opengis.net/def/crs/EPSG/0/4805http://www.opengis.net/def/crs/EPSG/0/4806http://www.opengis.net/def/crs/EPSG/0/4807http://www.opengis.net/def/crs/EPSG/0/4808http://www.opengis.net/def/crs/EPSG/0/4809http://www.opengis.net/def/crs/EPSG/0/4810http://www.opengis.net/def/crs/EPSG/0/4811http://www.opengis.net/def/crs/EPSG/0/4812http://www.opengis.net/def/crs/EPSG/0/4813http://www.opengis.net/def/crs/EPSG/0/4814http://www.opengis.net/def/crs/EPSG/0/4815http://www.opengis.net/def/crs/EPSG/0/4816http://www.opengis.net/def/crs/EPSG/0/4817http://www.opengis.net/def/crs/EPSG/0/4818http://www.opengis.net/def/crs/EPSG/0/4819http://www.opengis.net/def/crs/EPSG/0/4820http://www.opengis.net/def/crs/EPSG/0/4821http://www.opengis.net/def/crs/EPSG/0/4822http://www.opengis.net/def/crs/EPSG/0/4823http://www.opengis.net/def/crs/EPSG/0/4824http://www.opengis.net/def/crs/EPSG/0/4826http://www.opengis.net/def/crs/EPSG/0/4839http://www.opengis.net/def/crs/EPSG/0/4855http://www.opengis.net/def/crs/EPSG/0/4856http://www.opengis.net/def/crs/EPSG/0/4857http://www.opengis.net/def/crs/EPSG/0/4858http://www.opengis.net/def/crs/EPSG/0/4859http://www.opengis.net/def/crs/EPSG/0/4860http://www.opengis.net/def/crs/EPSG/0/4861http://www.opengis.net/def/crs/EPSG/0/4862http://www.opengis.net/def/crs/EPSG/0/4863http://www.opengis.net/def/crs/EPSG/0/4864http://www.opengis.net/def/crs/EPSG/0/4865http://www.opengis.net/def/crs/EPSG/0/4866http://www.opengis.net/def/crs/EPSG/0/4867http://www.opengis.net/def/crs/EPSG/0/4868http://www.opengis.net/def/crs/EPSG/0/4869http://www.opengis.net/def/crs/EPSG/0/4870http://www.opengis.net/def/crs/EPSG/0/4871http://www.opengis.net/def/crs/EPSG/0/4872http://www.opengis.net/def/crs/EPSG/0/4873http://www.opengis.net/def/crs/EPSG/0/4874http://www.opengis.net/def/crs/EPSG/0/4875http://www.opengis.net/def/crs/EPSG/0/4876http://www.opengis.net/def/crs/EPSG/0/4877http://www.opengis.net/def/crs/EPSG/0/4878http://www.opengis.net/def/crs/EPSG/0/4879http://www.opengis.net/def/crs/EPSG/0/4880http://www.opengis.net/def/crs/EPSG/0/4882http://www.opengis.net/def/crs/EPSG/0/4883http://www.opengis.net/def/crs/EPSG/0/4884http://www.opengis.net/def/crs/EPSG/0/4885http://www.opengis.net/def/crs/EPSG/0/4886http://www.opengis.net/def/crs/EPSG/0/4887http://www.opengis.net/def/crs/EPSG/0/4888http://www.opengis.net/def/crs/EPSG/0/4889http://www.opengis.net/def/crs/EPSG/0/4890http://www.opengis.net/def/crs/EPSG/0/4891http://www.opengis.net/def/crs/EPSG/0/4892http://www.opengis.net/def/crs/EPSG/0/4893http://www.opengis.net/def/crs/EPSG/0/4894http://www.opengis.net/def/crs/EPSG/0/4895http://www.opengis.net/def/crs/EPSG/0/4896http://www.opengis.net/def/crs/EPSG/0/4897http://www.opengis.net/def/crs/EPSG/0/4898http://www.opengis.net/def/crs/EPSG/0/4899http://www.opengis.net/def/crs/EPSG/0/4900http://www.opengis.net/def/crs/EPSG/0/4901http://www.opengis.net/def/crs/EPSG/0/4902http://www.opengis.net/def/crs/EPSG/0/4903http://www.opengis.net/def/crs/EPSG/0/4904http://www.opengis.net/def/crs/EPSG/0/4906http://www.opengis.net/def/crs/EPSG/0/4907http://www.opengis.net/def/crs/EPSG/0/4908http://www.opengis.net/def/crs/EPSG/0/4909http://www.opengis.net/def/crs/EPSG/0/4910http://www.opengis.net/def/crs/EPSG/0/4911http://www.opengis.net/def/crs/EPSG/0/4912http://www.opengis.net/def/crs/EPSG/0/4913http://www.opengis.net/def/crs/EPSG/0/4914http://www.opengis.net/def/crs/EPSG/0/4915http://www.opengis.net/def/crs/EPSG/0/4916http://www.opengis.net/def/crs/EPSG/0/4917http://www.opengis.net/def/crs/EPSG/0/4918http://www.opengis.net/def/crs/EPSG/0/4919http://www.opengis.net/def/crs/EPSG/0/4920http://www.opengis.net/def/crs/EPSG/0/4921http://www.opengis.net/def/crs/EPSG/0/4922http://www.opengis.net/def/crs/EPSG/0/4923http://www.opengis.net/def/crs/EPSG/0/4924http://www.opengis.net/def/crs/EPSG/0/4925http://www.opengis.net/def/crs/EPSG/0/4926http://www.opengis.net/def/crs/EPSG/0/4927http://www.opengis.net/def/crs/EPSG/0/4928http://www.opengis.net/def/crs/EPSG/0/4929http://www.opengis.net/def/crs/EPSG/0/4930http://www.opengis.net/def/crs/EPSG/0/4931http://www.opengis.net/def/crs/EPSG/0/4932http://www.opengis.net/def/crs/EPSG/0/4933http://www.opengis.net/def/crs/EPSG/0/4934http://www.opengis.net/def/crs/EPSG/0/4935http://www.opengis.net/def/crs/EPSG/0/4936http://www.opengis.net/def/crs/EPSG/0/4937http://www.opengis.net/def/crs/EPSG/0/4938http://www.opengis.net/def/crs/EPSG/0/4939http://www.opengis.net/def/crs/EPSG/0/4940http://www.opengis.net/def/crs/EPSG/0/4941http://www.opengis.net/def/crs/EPSG/0/4942http://www.opengis.net/def/crs/EPSG/0/4943http://www.opengis.net/def/crs/EPSG/0/4944http://www.opengis.net/def/crs/EPSG/0/4945http://www.opengis.net/def/crs/EPSG/0/4946http://www.opengis.net/def/crs/EPSG/0/4947http://www.opengis.net/def/crs/EPSG/0/4948http://www.opengis.net/def/crs/EPSG/0/4949http://www.opengis.net/def/crs/EPSG/0/4950http://www.opengis.net/def/crs/EPSG/0/4951http://www.opengis.net/def/crs/EPSG/0/4952http://www.opengis.net/def/crs/EPSG/0/4953http://www.opengis.net/def/crs/EPSG/0/4954http://www.opengis.net/def/crs/EPSG/0/4955http://www.opengis.net/def/crs/EPSG/0/4956http://www.opengis.net/def/crs/EPSG/0/4957http://www.opengis.net/def/crs/EPSG/0/4958http://www.opengis.net/def/crs/EPSG/0/4959http://www.opengis.net/def/crs/EPSG/0/4960http://www.opengis.net/def/crs/EPSG/0/4961http://www.opengis.net/def/crs/EPSG/0/4962http://www.opengis.net/def/crs/EPSG/0/4963http://www.opengis.net/def/crs/EPSG/0/4964http://www.opengis.net/def/crs/EPSG/0/4965http://www.opengis.net/def/crs/EPSG/0/4966http://www.opengis.net/def/crs/EPSG/0/4967http://www.opengis.net/def/crs/EPSG/0/4968http://www.opengis.net/def/crs/EPSG/0/4969http://www.opengis.net/def/crs/EPSG/0/4970http://www.opengis.net/def/crs/EPSG/0/4971http://www.opengis.net/def/crs/EPSG/0/4972http://www.opengis.net/def/crs/EPSG/0/4973http://www.opengis.net/def/crs/EPSG/0/4974http://www.opengis.net/def/crs/EPSG/0/4975http://www.opengis.net/def/crs/EPSG/0/4976http://www.opengis.net/def/crs/EPSG/0/4977http://www.opengis.net/def/crs/EPSG/0/4978http://www.opengis.net/def/crs/EPSG/0/4979http://www.opengis.net/def/crs/EPSG/0/4980http://www.opengis.net/def/crs/EPSG/0/4981http://www.opengis.net/def/crs/EPSG/0/4982http://www.opengis.net/def/crs/EPSG/0/4983http://www.opengis.net/def/crs/EPSG/0/4984http://www.opengis.net/def/crs/EPSG/0/4985http://www.opengis.net/def/crs/EPSG/0/4986http://www.opengis.net/def/crs/EPSG/0/4987http://www.opengis.net/def/crs/EPSG/0/4988http://www.opengis.net/def/crs/EPSG/0/4989http://www.opengis.net/def/crs/EPSG/0/4990http://www.opengis.net/def/crs/EPSG/0/4991http://www.opengis.net/def/crs/EPSG/0/4992http://www.opengis.net/def/crs/EPSG/0/4993http://www.opengis.net/def/crs/EPSG/0/4994http://www.opengis.net/def/crs/EPSG/0/4995http://www.opengis.net/def/crs/EPSG/0/4996http://www.opengis.net/def/crs/EPSG/0/4997http://www.opengis.net/def/crs/EPSG/0/4998http://www.opengis.net/def/crs/EPSG/0/4999http://www.opengis.net/def/crs/EPSG/0/5011http://www.opengis.net/def/crs/EPSG/0/5012http://www.opengis.net/def/crs/EPSG/0/5013http://www.opengis.net/def/crs/EPSG/0/5014http://www.opengis.net/def/crs/EPSG/0/5015http://www.opengis.net/def/crs/EPSG/0/5016http://www.opengis.net/def/crs/EPSG/0/5017http://www.opengis.net/def/crs/EPSG/0/5018http://www.opengis.net/def/crs/EPSG/0/5041http://www.opengis.net/def/crs/EPSG/0/5042http://www.opengis.net/def/crs/EPSG/0/5048http://www.opengis.net/def/crs/EPSG/0/5069http://www.opengis.net/def/crs/EPSG/0/5070http://www.opengis.net/def/crs/EPSG/0/5071http://www.opengis.net/def/crs/EPSG/0/5072http://www.opengis.net/def/crs/EPSG/0/5105http://www.opengis.net/def/crs/EPSG/0/5106http://www.opengis.net/def/crs/EPSG/0/5107http://www.opengis.net/def/crs/EPSG/0/5108http://www.opengis.net/def/crs/EPSG/0/5109http://www.opengis.net/def/crs/EPSG/0/5110http://www.opengis.net/def/crs/EPSG/0/5111http://www.opengis.net/def/crs/EPSG/0/5112http://www.opengis.net/def/crs/EPSG/0/5113http://www.opengis.net/def/crs/EPSG/0/5114http://www.opengis.net/def/crs/EPSG/0/5115http://www.opengis.net/def/crs/EPSG/0/5116http://www.opengis.net/def/crs/EPSG/0/5117http://www.opengis.net/def/crs/EPSG/0/5118http://www.opengis.net/def/crs/EPSG/0/5119http://www.opengis.net/def/crs/EPSG/0/5120http://www.opengis.net/def/crs/EPSG/0/5121http://www.opengis.net/def/crs/EPSG/0/5122http://www.opengis.net/def/crs/EPSG/0/5123http://www.opengis.net/def/crs/EPSG/0/5124http://www.opengis.net/def/crs/EPSG/0/5125http://www.opengis.net/def/crs/EPSG/0/5126http://www.opengis.net/def/crs/EPSG/0/5127http://www.opengis.net/def/crs/EPSG/0/5128http://www.opengis.net/def/crs/EPSG/0/5129http://www.opengis.net/def/crs/EPSG/0/5130http://www.opengis.net/def/crs/EPSG/0/5132http://www.opengis.net/def/crs/EPSG/0/5167http://www.opengis.net/def/crs/EPSG/0/5168http://www.opengis.net/def/crs/EPSG/0/5169http://www.opengis.net/def/crs/EPSG/0/5170http://www.opengis.net/def/crs/EPSG/0/5171http://www.opengis.net/def/crs/EPSG/0/5172http://www.opengis.net/def/crs/EPSG/0/5173http://www.opengis.net/def/crs/EPSG/0/5174http://www.opengis.net/def/crs/EPSG/0/5175http://www.opengis.net/def/crs/EPSG/0/5176http://www.opengis.net/def/crs/EPSG/0/5177http://www.opengis.net/def/crs/EPSG/0/5178http://www.opengis.net/def/crs/EPSG/0/5179http://www.opengis.net/def/crs/EPSG/0/5180http://www.opengis.net/def/crs/EPSG/0/5181http://www.opengis.net/def/crs/EPSG/0/5182http://www.opengis.net/def/crs/EPSG/0/5183http://www.opengis.net/def/crs/EPSG/0/5184http://www.opengis.net/def/crs/EPSG/0/5185http://www.opengis.net/def/crs/EPSG/0/5186http://www.opengis.net/def/crs/EPSG/0/5187http://www.opengis.net/def/crs/EPSG/0/5188http://www.opengis.net/def/crs/EPSG/0/5193http://www.opengis.net/def/crs/EPSG/0/5195http://www.opengis.net/def/crs/EPSG/0/5214http://www.opengis.net/def/crs/EPSG/0/5221http://www.opengis.net/def/crs/EPSG/0/5223http://www.opengis.net/def/crs/EPSG/0/5224http://www.opengis.net/def/crs/EPSG/0/5225http://www.opengis.net/def/crs/EPSG/0/5228http://www.opengis.net/def/crs/EPSG/0/5229http://www.opengis.net/def/crs/EPSG/0/5233http://www.opengis.net/def/crs/EPSG/0/5234http://www.opengis.net/def/crs/EPSG/0/5235http://www.opengis.net/def/crs/EPSG/0/5237http://www.opengis.net/def/crs/EPSG/0/5243http://www.opengis.net/def/crs/EPSG/0/5244http://www.opengis.net/def/crs/EPSG/0/5245http://www.opengis.net/def/crs/EPSG/0/5246http://www.opengis.net/def/crs/EPSG/0/5247http://www.opengis.net/def/crs/EPSG/0/5250http://www.opengis.net/def/crs/EPSG/0/5251http://www.opengis.net/def/crs/EPSG/0/5252http://www.opengis.net/def/crs/EPSG/0/5253http://www.opengis.net/def/crs/EPSG/0/5254http://www.opengis.net/def/crs/EPSG/0/5255http://www.opengis.net/def/crs/EPSG/0/5256http://www.opengis.net/def/crs/EPSG/0/5257http://www.opengis.net/def/crs/EPSG/0/5258http://www.opengis.net/def/crs/EPSG/0/5259http://www.opengis.net/def/crs/EPSG/0/5262http://www.opengis.net/def/crs/EPSG/0/5263http://www.opengis.net/def/crs/EPSG/0/5264http://www.opengis.net/def/crs/EPSG/0/5266http://www.opengis.net/def/crs/EPSG/0/5269http://www.opengis.net/def/crs/EPSG/0/5270http://www.opengis.net/def/crs/EPSG/0/5271http://www.opengis.net/def/crs/EPSG/0/5272http://www.opengis.net/def/crs/EPSG/0/5273http://www.opengis.net/def/crs/EPSG/0/5274http://www.opengis.net/def/crs/EPSG/0/5275http://www.opengis.net/def/crs/EPSG/0/5292http://www.opengis.net/def/crs/EPSG/0/5293http://www.opengis.net/def/crs/EPSG/0/5294http://www.opengis.net/def/crs/EPSG/0/5295http://www.opengis.net/def/crs/EPSG/0/5296http://www.opengis.net/def/crs/EPSG/0/5297http://www.opengis.net/def/crs/EPSG/0/5298http://www.opengis.net/def/crs/EPSG/0/5299http://www.opengis.net/def/crs/EPSG/0/5300http://www.opengis.net/def/crs/EPSG/0/5301http://www.opengis.net/def/crs/EPSG/0/5302http://www.opengis.net/def/crs/EPSG/0/5303http://www.opengis.net/def/crs/EPSG/0/5304http://www.opengis.net/def/crs/EPSG/0/5305http://www.opengis.net/def/crs/EPSG/0/5306http://www.opengis.net/def/crs/EPSG/0/5307http://www.opengis.net/def/crs/EPSG/0/5308http://www.opengis.net/def/crs/EPSG/0/5309http://www.opengis.net/def/crs/EPSG/0/5310http://www.opengis.net/def/crs/EPSG/0/5311http://www.opengis.net/def/crs/EPSG/0/5316http://www.opengis.net/def/crs/EPSG/0/5317http://www.opengis.net/def/crs/EPSG/0/5318http://www.opengis.net/def/crs/EPSG/0/5320http://www.opengis.net/def/crs/EPSG/0/5321http://www.opengis.net/def/crs/EPSG/0/5322http://www.opengis.net/def/crs/EPSG/0/5323http://www.opengis.net/def/crs/EPSG/0/5324http://www.opengis.net/def/crs/EPSG/0/5325http://www.opengis.net/def/crs/EPSG/0/5329http://www.opengis.net/def/crs/EPSG/0/5330http://www.opengis.net/def/crs/EPSG/0/5331http://www.opengis.net/def/crs/EPSG/0/5332http://www.opengis.net/def/crs/EPSG/0/5336http://www.opengis.net/def/crs/EPSG/0/5337http://www.opengis.net/def/crs/EPSG/0/5340http://www.opengis.net/def/crs/EPSG/0/5341http://www.opengis.net/def/crs/EPSG/0/5342http://www.opengis.net/def/crs/EPSG/0/5343http://www.opengis.net/def/crs/EPSG/0/5344http://www.opengis.net/def/crs/EPSG/0/5345http://www.opengis.net/def/crs/EPSG/0/5346http://www.opengis.net/def/crs/EPSG/0/5347http://www.opengis.net/def/crs/EPSG/0/5348http://www.opengis.net/def/crs/EPSG/0/5349http://www.opengis.net/def/crs/EPSG/0/5352http://www.opengis.net/def/crs/EPSG/0/5353http://www.opengis.net/def/crs/EPSG/0/5354http://www.opengis.net/def/crs/EPSG/0/5355http://www.opengis.net/def/crs/EPSG/0/5356http://www.opengis.net/def/crs/EPSG/0/5357http://www.opengis.net/def/crs/EPSG/0/5358http://www.opengis.net/def/crs/EPSG/0/5359http://www.opengis.net/def/crs/EPSG/0/5360http://www.opengis.net/def/crs/EPSG/0/5361http://www.opengis.net/def/crs/EPSG/0/5362http://www.opengis.net/def/crs/EPSG/0/5363http://www.opengis.net/def/crs/EPSG/0/5364http://www.opengis.net/def/crs/EPSG/0/5365http://www.opengis.net/def/crs/EPSG/0/5367http://www.opengis.net/def/crs/EPSG/0/5368http://www.opengis.net/def/crs/EPSG/0/5369http://www.opengis.net/def/crs/EPSG/0/5370http://www.opengis.net/def/crs/EPSG/0/5371http://www.opengis.net/def/crs/EPSG/0/5372http://www.opengis.net/def/crs/EPSG/0/5373http://www.opengis.net/def/crs/EPSG/0/5379http://www.opengis.net/def/crs/EPSG/0/5380http://www.opengis.net/def/crs/EPSG/0/5381http://www.opengis.net/def/crs/EPSG/0/5382http://www.opengis.net/def/crs/EPSG/0/5383http://www.opengis.net/def/crs/EPSG/0/5387http://www.opengis.net/def/crs/EPSG/0/5388http://www.opengis.net/def/crs/EPSG/0/5389http://www.opengis.net/def/crs/EPSG/0/5391http://www.opengis.net/def/crs/EPSG/0/5392http://www.opengis.net/def/crs/EPSG/0/5393http://www.opengis.net/def/crs/EPSG/0/5396http://www.opengis.net/def/crs/EPSG/0/5451http://www.opengis.net/def/crs/EPSG/0/5456http://www.opengis.net/def/crs/EPSG/0/5457http://www.opengis.net/def/crs/EPSG/0/5458http://www.opengis.net/def/crs/EPSG/0/5459http://www.opengis.net/def/crs/EPSG/0/5460http://www.opengis.net/def/crs/EPSG/0/5461http://www.opengis.net/def/crs/EPSG/0/5462http://www.opengis.net/def/crs/EPSG/0/5463http://www.opengis.net/def/crs/EPSG/0/5464http://www.opengis.net/def/crs/EPSG/0/5466http://www.opengis.net/def/crs/EPSG/0/5467http://www.opengis.net/def/crs/EPSG/0/5469http://www.opengis.net/def/crs/EPSG/0/5472http://www.opengis.net/def/crs/EPSG/0/5479http://www.opengis.net/def/crs/EPSG/0/5480http://www.opengis.net/def/crs/EPSG/0/5481http://www.opengis.net/def/crs/EPSG/0/5482http://www.opengis.net/def/crs/EPSG/0/5487http://www.opengis.net/def/crs/EPSG/0/5488http://www.opengis.net/def/crs/EPSG/0/5489http://www.opengis.net/def/crs/EPSG/0/5490http://www.opengis.net/def/crs/EPSG/0/5498http://www.opengis.net/def/crs/EPSG/0/5499http://www.opengis.net/def/crs/EPSG/0/5500http://www.opengis.net/def/crs/EPSG/0/5513http://www.opengis.net/def/crs/EPSG/0/5514http://www.opengis.net/def/crs/EPSG/0/5515http://www.opengis.net/def/crs/EPSG/0/5516http://www.opengis.net/def/crs/EPSG/0/5518http://www.opengis.net/def/crs/EPSG/0/5519http://www.opengis.net/def/crs/EPSG/0/5520http://www.opengis.net/def/crs/EPSG/0/5523http://www.opengis.net/def/crs/EPSG/0/5524http://www.opengis.net/def/crs/EPSG/0/5527http://www.opengis.net/def/crs/EPSG/0/5530http://www.opengis.net/def/crs/EPSG/0/5531http://www.opengis.net/def/crs/EPSG/0/5532http://www.opengis.net/def/crs/EPSG/0/5533http://www.opengis.net/def/crs/EPSG/0/5534http://www.opengis.net/def/crs/EPSG/0/5535http://www.opengis.net/def/crs/EPSG/0/5536http://www.opengis.net/def/crs/EPSG/0/5537http://www.opengis.net/def/crs/EPSG/0/5538http://www.opengis.net/def/crs/EPSG/0/5539http://www.opengis.net/def/crs/EPSG/0/5544http://www.opengis.net/def/crs/EPSG/0/5545http://www.opengis.net/def/crs/EPSG/0/5546http://www.opengis.net/def/crs/EPSG/0/5550http://www.opengis.net/def/crs/EPSG/0/5551http://www.opengis.net/def/crs/EPSG/0/5552http://www.opengis.net/def/crs/EPSG/0/5554http://www.opengis.net/def/crs/EPSG/0/5555http://www.opengis.net/def/crs/EPSG/0/5556http://www.opengis.net/def/crs/EPSG/0/5558http://www.opengis.net/def/crs/EPSG/0/5559http://www.opengis.net/def/crs/EPSG/0/5560http://www.opengis.net/def/crs/EPSG/0/5561http://www.opengis.net/def/crs/EPSG/0/5562http://www.opengis.net/def/crs/EPSG/0/5563http://www.opengis.net/def/crs/EPSG/0/5564http://www.opengis.net/def/crs/EPSG/0/5565http://www.opengis.net/def/crs/EPSG/0/5566http://www.opengis.net/def/crs/EPSG/0/5567http://www.opengis.net/def/crs/EPSG/0/5568http://www.opengis.net/def/crs/EPSG/0/5569http://www.opengis.net/def/crs/EPSG/0/5570http://www.opengis.net/def/crs/EPSG/0/5571http://www.opengis.net/def/crs/EPSG/0/5572http://www.opengis.net/def/crs/EPSG/0/5573http://www.opengis.net/def/crs/EPSG/0/5574http://www.opengis.net/def/crs/EPSG/0/5575http://www.opengis.net/def/crs/EPSG/0/5576http://www.opengis.net/def/crs/EPSG/0/5577http://www.opengis.net/def/crs/EPSG/0/5578http://www.opengis.net/def/crs/EPSG/0/5579http://www.opengis.net/def/crs/EPSG/0/5580http://www.opengis.net/def/crs/EPSG/0/5581http://www.opengis.net/def/crs/EPSG/0/5582http://www.opengis.net/def/crs/EPSG/0/5583http://www.opengis.net/def/crs/EPSG/0/5588http://www.opengis.net/def/crs/EPSG/0/5589http://www.opengis.net/def/crs/EPSG/0/5591http://www.opengis.net/def/crs/EPSG/0/5592http://www.opengis.net/def/crs/EPSG/0/5593http://www.opengis.net/def/crs/EPSG/0/5596http://www.opengis.net/def/crs/EPSG/0/5597http://www.opengis.net/def/crs/EPSG/0/5598http://www.opengis.net/def/crs/EPSG/0/5600http://www.opengis.net/def/crs/EPSG/0/5601http://www.opengis.net/def/crs/EPSG/0/5602http://www.opengis.net/def/crs/EPSG/0/5603http://www.opengis.net/def/crs/EPSG/0/5604http://www.opengis.net/def/crs/EPSG/0/5605http://www.opengis.net/def/crs/EPSG/0/5606http://www.opengis.net/def/crs/EPSG/0/5607http://www.opengis.net/def/crs/EPSG/0/5608http://www.opengis.net/def/crs/EPSG/0/5609http://www.opengis.net/def/crs/EPSG/0/5610http://www.opengis.net/def/crs/EPSG/0/5611http://www.opengis.net/def/crs/EPSG/0/5612http://www.opengis.net/def/crs/EPSG/0/5613http://www.opengis.net/def/crs/EPSG/0/5614http://www.opengis.net/def/crs/EPSG/0/5615http://www.opengis.net/def/crs/EPSG/0/5616http://www.opengis.net/def/crs/EPSG/0/5617http://www.opengis.net/def/crs/EPSG/0/5618http://www.opengis.net/def/crs/EPSG/0/5619http://www.opengis.net/def/crs/EPSG/0/5620http://www.opengis.net/def/crs/EPSG/0/5621http://www.opengis.net/def/crs/EPSG/0/5623http://www.opengis.net/def/crs/EPSG/0/5624http://www.opengis.net/def/crs/EPSG/0/5625http://www.opengis.net/def/crs/EPSG/0/5627http://www.opengis.net/def/crs/EPSG/0/5628http://www.opengis.net/def/crs/EPSG/0/5629http://www.opengis.net/def/crs/EPSG/0/5631http://www.opengis.net/def/crs/EPSG/0/5632http://www.opengis.net/def/crs/EPSG/0/5633http://www.opengis.net/def/crs/EPSG/0/5634http://www.opengis.net/def/crs/EPSG/0/5635http://www.opengis.net/def/crs/EPSG/0/5636http://www.opengis.net/def/crs/EPSG/0/5637http://www.opengis.net/def/crs/EPSG/0/5638http://www.opengis.net/def/crs/EPSG/0/5639http://www.opengis.net/def/crs/EPSG/0/5641http://www.opengis.net/def/crs/EPSG/0/5643http://www.opengis.net/def/crs/EPSG/0/5644http://www.opengis.net/def/crs/EPSG/0/5646http://www.opengis.net/def/crs/EPSG/0/5649http://www.opengis.net/def/crs/EPSG/0/5650http://www.opengis.net/def/crs/EPSG/0/5651http://www.opengis.net/def/crs/EPSG/0/5652http://www.opengis.net/def/crs/EPSG/0/5653http://www.opengis.net/def/crs/EPSG/0/5654http://www.opengis.net/def/crs/EPSG/0/5655http://www.opengis.net/def/crs/EPSG/0/5659http://www.opengis.net/def/crs/EPSG/0/5663http://www.opengis.net/def/crs/EPSG/0/5664http://www.opengis.net/def/crs/EPSG/0/5665http://www.opengis.net/def/crs/EPSG/0/5666http://www.opengis.net/def/crs/EPSG/0/5667http://www.opengis.net/def/crs/EPSG/0/5668http://www.opengis.net/def/crs/EPSG/0/5669http://www.opengis.net/def/crs/EPSG/0/5670http://www.opengis.net/def/crs/EPSG/0/5671http://www.opengis.net/def/crs/EPSG/0/5672http://www.opengis.net/def/crs/EPSG/0/5673http://www.opengis.net/def/crs/EPSG/0/5674http://www.opengis.net/def/crs/EPSG/0/5675http://www.opengis.net/def/crs/EPSG/0/5676http://www.opengis.net/def/crs/EPSG/0/5677http://www.opengis.net/def/crs/EPSG/0/5678http://www.opengis.net/def/crs/EPSG/0/5679http://www.opengis.net/def/crs/EPSG/0/5680http://www.opengis.net/def/crs/EPSG/0/5681http://www.opengis.net/def/crs/EPSG/0/5682http://www.opengis.net/def/crs/EPSG/0/5683http://www.opengis.net/def/crs/EPSG/0/5684http://www.opengis.net/def/crs/EPSG/0/5685http://www.opengis.net/def/crs/EPSG/0/5698http://www.opengis.net/def/crs/EPSG/0/5699http://www.opengis.net/def/crs/EPSG/0/5700http://www.opengis.net/def/crs/EPSG/0/5701http://www.opengis.net/def/crs/EPSG/0/5702http://www.opengis.net/def/crs/EPSG/0/5703http://www.opengis.net/def/crs/EPSG/0/5704http://www.opengis.net/def/crs/EPSG/0/5705http://www.opengis.net/def/crs/EPSG/0/5706http://www.opengis.net/def/crs/EPSG/0/5707http://www.opengis.net/def/crs/EPSG/0/5708http://www.opengis.net/def/crs/EPSG/0/5709http://www.opengis.net/def/crs/EPSG/0/5710http://www.opengis.net/def/crs/EPSG/0/5711http://www.opengis.net/def/crs/EPSG/0/5712http://www.opengis.net/def/crs/EPSG/0/5713http://www.opengis.net/def/crs/EPSG/0/5714http://www.opengis.net/def/crs/EPSG/0/5715http://www.opengis.net/def/crs/EPSG/0/5716http://www.opengis.net/def/crs/EPSG/0/5717http://www.opengis.net/def/crs/EPSG/0/5718http://www.opengis.net/def/crs/EPSG/0/5719http://www.opengis.net/def/crs/EPSG/0/5720http://www.opengis.net/def/crs/EPSG/0/5721http://www.opengis.net/def/crs/EPSG/0/5722http://www.opengis.net/def/crs/EPSG/0/5723http://www.opengis.net/def/crs/EPSG/0/5724http://www.opengis.net/def/crs/EPSG/0/5725http://www.opengis.net/def/crs/EPSG/0/5726http://www.opengis.net/def/crs/EPSG/0/5727http://www.opengis.net/def/crs/EPSG/0/5728http://www.opengis.net/def/crs/EPSG/0/5729http://www.opengis.net/def/crs/EPSG/0/5730http://www.opengis.net/def/crs/EPSG/0/5731http://www.opengis.net/def/crs/EPSG/0/5732http://www.opengis.net/def/crs/EPSG/0/5733http://www.opengis.net/def/crs/EPSG/0/5734http://www.opengis.net/def/crs/EPSG/0/5735http://www.opengis.net/def/crs/EPSG/0/5736http://www.opengis.net/def/crs/EPSG/0/5737http://www.opengis.net/def/crs/EPSG/0/5738http://www.opengis.net/def/crs/EPSG/0/5739http://www.opengis.net/def/crs/EPSG/0/5740http://www.opengis.net/def/crs/EPSG/0/5741http://www.opengis.net/def/crs/EPSG/0/5742http://www.opengis.net/def/crs/EPSG/0/5743http://www.opengis.net/def/crs/EPSG/0/5744http://www.opengis.net/def/crs/EPSG/0/5745http://www.opengis.net/def/crs/EPSG/0/5746http://www.opengis.net/def/crs/EPSG/0/5747http://www.opengis.net/def/crs/EPSG/0/5748http://www.opengis.net/def/crs/EPSG/0/5749http://www.opengis.net/def/crs/EPSG/0/5750http://www.opengis.net/def/crs/EPSG/0/5751http://www.opengis.net/def/crs/EPSG/0/5752http://www.opengis.net/def/crs/EPSG/0/5753http://www.opengis.net/def/crs/EPSG/0/5754http://www.opengis.net/def/crs/EPSG/0/5755http://www.opengis.net/def/crs/EPSG/0/5756http://www.opengis.net/def/crs/EPSG/0/5757http://www.opengis.net/def/crs/EPSG/0/5758http://www.opengis.net/def/crs/EPSG/0/5759http://www.opengis.net/def/crs/EPSG/0/5760http://www.opengis.net/def/crs/EPSG/0/5761http://www.opengis.net/def/crs/EPSG/0/5762http://www.opengis.net/def/crs/EPSG/0/5763http://www.opengis.net/def/crs/EPSG/0/5764http://www.opengis.net/def/crs/EPSG/0/5765http://www.opengis.net/def/crs/EPSG/0/5766http://www.opengis.net/def/crs/EPSG/0/5767http://www.opengis.net/def/crs/EPSG/0/5768http://www.opengis.net/def/crs/EPSG/0/5769http://www.opengis.net/def/crs/EPSG/0/5770http://www.opengis.net/def/crs/EPSG/0/5771http://www.opengis.net/def/crs/EPSG/0/5772http://www.opengis.net/def/crs/EPSG/0/5773http://www.opengis.net/def/crs/EPSG/0/5774http://www.opengis.net/def/crs/EPSG/0/5775http://www.opengis.net/def/crs/EPSG/0/5776http://www.opengis.net/def/crs/EPSG/0/5777http://www.opengis.net/def/crs/EPSG/0/5778http://www.opengis.net/def/crs/EPSG/0/5779http://www.opengis.net/def/crs/EPSG/0/5780http://www.opengis.net/def/crs/EPSG/0/5781http://www.opengis.net/def/crs/EPSG/0/5782http://www.opengis.net/def/crs/EPSG/0/5783http://www.opengis.net/def/crs/EPSG/0/5784http://www.opengis.net/def/crs/EPSG/0/5785http://www.opengis.net/def/crs/EPSG/0/5786http://www.opengis.net/def/crs/EPSG/0/5787http://www.opengis.net/def/crs/EPSG/0/5788http://www.opengis.net/def/crs/EPSG/0/5789http://www.opengis.net/def/crs/EPSG/0/5790http://www.opengis.net/def/crs/EPSG/0/5791http://www.opengis.net/def/crs/EPSG/0/5792http://www.opengis.net/def/crs/EPSG/0/5793http://www.opengis.net/def/crs/EPSG/0/5794http://www.opengis.net/def/crs/EPSG/0/5795http://www.opengis.net/def/crs/EPSG/0/5796http://www.opengis.net/def/crs/EPSG/0/5797http://www.opengis.net/def/crs/EPSG/0/5798http://www.opengis.net/def/crs/EPSG/0/5799http://www.opengis.net/def/crs/EPSG/0/5800http://www.opengis.net/def/crs/EPSG/0/5801http://www.opengis.net/def/crs/EPSG/0/5802http://www.opengis.net/def/crs/EPSG/0/5803http://www.opengis.net/def/crs/EPSG/0/5804http://www.opengis.net/def/crs/EPSG/0/5805http://www.opengis.net/def/crs/EPSG/0/5806http://www.opengis.net/def/crs/EPSG/0/5807http://www.opengis.net/def/crs/EPSG/0/5808http://www.opengis.net/def/crs/EPSG/0/5809http://www.opengis.net/def/crs/EPSG/0/5810http://www.opengis.net/def/crs/EPSG/0/5811http://www.opengis.net/def/crs/EPSG/0/5812http://www.opengis.net/def/crs/EPSG/0/5813http://www.opengis.net/def/crs/EPSG/0/5814http://www.opengis.net/def/crs/EPSG/0/5815http://www.opengis.net/def/crs/EPSG/0/5816http://www.opengis.net/def/crs/EPSG/0/5817http://www.opengis.net/def/crs/EPSG/0/5818http://www.opengis.net/def/crs/EPSG/0/5819http://www.opengis.net/def/crs/EPSG/0/5820http://www.opengis.net/def/crs/EPSG/0/5821http://www.opengis.net/def/crs/EPSG/0/5825http://www.opengis.net/def/crs/EPSG/0/5828http://www.opengis.net/def/crs/EPSG/0/5829http://www.opengis.net/def/crs/EPSG/0/5830http://www.opengis.net/def/crs/EPSG/0/5831http://www.opengis.net/def/crs/EPSG/0/5832http://www.opengis.net/def/crs/EPSG/0/5833http://www.opengis.net/def/crs/EPSG/0/5834http://www.opengis.net/def/crs/EPSG/0/5835http://www.opengis.net/def/crs/EPSG/0/5836http://www.opengis.net/def/crs/EPSG/0/5837http://www.opengis.net/def/crs/EPSG/0/5839http://www.opengis.net/def/crs/EPSG/0/5842http://www.opengis.net/def/crs/EPSG/0/5844http://www.opengis.net/def/crs/EPSG/0/5845http://www.opengis.net/def/crs/EPSG/0/5846http://www.opengis.net/def/crs/EPSG/0/5847http://www.opengis.net/def/crs/EPSG/0/5848http://www.opengis.net/def/crs/EPSG/0/5849http://www.opengis.net/def/crs/EPSG/0/5850http://www.opengis.net/def/crs/EPSG/0/5851http://www.opengis.net/def/crs/EPSG/0/5852http://www.opengis.net/def/crs/EPSG/0/5853http://www.opengis.net/def/crs/EPSG/0/5854http://www.opengis.net/def/crs/EPSG/0/5855http://www.opengis.net/def/crs/EPSG/0/5856http://www.opengis.net/def/crs/EPSG/0/5857http://www.opengis.net/def/crs/EPSG/0/5858http://www.opengis.net/def/crs/EPSG/0/5859http://www.opengis.net/def/crs/EPSG/0/5861http://www.opengis.net/def/crs/EPSG/0/5862http://www.opengis.net/def/crs/EPSG/0/5863http://www.opengis.net/def/crs/EPSG/0/5864http://www.opengis.net/def/crs/EPSG/0/5865http://www.opengis.net/def/crs/EPSG/0/5866http://www.opengis.net/def/crs/EPSG/0/5867http://www.opengis.net/def/crs/EPSG/0/5868http://www.opengis.net/def/crs/EPSG/0/5869http://www.opengis.net/def/crs/EPSG/0/5870http://www.opengis.net/def/crs/EPSG/0/5871http://www.opengis.net/def/crs/EPSG/0/5872http://www.opengis.net/def/crs/EPSG/0/5873http://www.opengis.net/def/crs/EPSG/0/5874http://www.opengis.net/def/crs/EPSG/0/5875http://www.opengis.net/def/crs/EPSG/0/5876http://www.opengis.net/def/crs/EPSG/0/5877http://www.opengis.net/def/crs/EPSG/0/5879http://www.opengis.net/def/crs/EPSG/0/5880http://www.opengis.net/def/crs/EPSG/0/5884http://www.opengis.net/def/crs/EPSG/0/5885http://www.opengis.net/def/crs/EPSG/0/5886http://www.opengis.net/def/crs/EPSG/0/5887http://www.opengis.net/def/crs/EPSG/0/5890http://www.opengis.net/def/crs/EPSG/0/5921http://www.opengis.net/def/crs/EPSG/0/5922http://www.opengis.net/def/crs/EPSG/0/5923http://www.opengis.net/def/crs/EPSG/0/5924http://www.opengis.net/def/crs/EPSG/0/5925http://www.opengis.net/def/crs/EPSG/0/5926http://www.opengis.net/def/crs/EPSG/0/5927http://www.opengis.net/def/crs/EPSG/0/5928http://www.opengis.net/def/crs/EPSG/0/5929http://www.opengis.net/def/crs/EPSG/0/5930http://www.opengis.net/def/crs/EPSG/0/5931http://www.opengis.net/def/crs/EPSG/0/5932http://www.opengis.net/def/crs/EPSG/0/5933http://www.opengis.net/def/crs/EPSG/0/5934http://www.opengis.net/def/crs/EPSG/0/5935http://www.opengis.net/def/crs/EPSG/0/5936http://www.opengis.net/def/crs/EPSG/0/5937http://www.opengis.net/def/crs/EPSG/0/5938http://www.opengis.net/def/crs/EPSG/0/5939http://www.opengis.net/def/crs/EPSG/0/5940http://www.opengis.net/def/crs/EPSG/0/5941http://www.opengis.net/def/crs/EPSG/0/5942http://www.opengis.net/def/crs/EPSG/0/5945http://www.opengis.net/def/crs/EPSG/0/5946http://www.opengis.net/def/crs/EPSG/0/5947http://www.opengis.net/def/crs/EPSG/0/5948http://www.opengis.net/def/crs/EPSG/0/5949http://www.opengis.net/def/crs/EPSG/0/5950http://www.opengis.net/def/crs/EPSG/0/5951http://www.opengis.net/def/crs/EPSG/0/5952http://www.opengis.net/def/crs/EPSG/0/5953http://www.opengis.net/def/crs/EPSG/0/5954http://www.opengis.net/def/crs/EPSG/0/5955http://www.opengis.net/def/crs/EPSG/0/5956http://www.opengis.net/def/crs/EPSG/0/5957http://www.opengis.net/def/crs/EPSG/0/5958http://www.opengis.net/def/crs/EPSG/0/5959http://www.opengis.net/def/crs/EPSG/0/5960http://www.opengis.net/def/crs/EPSG/0/5961http://www.opengis.net/def/crs/EPSG/0/5962http://www.opengis.net/def/crs/EPSG/0/5963http://www.opengis.net/def/crs/EPSG/0/5964http://www.opengis.net/def/crs/EPSG/0/5965http://www.opengis.net/def/crs/EPSG/0/5966http://www.opengis.net/def/crs/EPSG/0/5967http://www.opengis.net/def/crs/EPSG/0/5968http://www.opengis.net/def/crs/EPSG/0/5969http://www.opengis.net/def/crs/EPSG/0/5970http://www.opengis.net/def/crs/EPSG/0/5971http://www.opengis.net/def/crs/EPSG/0/5972http://www.opengis.net/def/crs/EPSG/0/5973http://www.opengis.net/def/crs/EPSG/0/5974http://www.opengis.net/def/crs/EPSG/0/5975http://www.opengis.net/def/crs/EPSG/0/5976http://www.opengis.net/def/crs/EPSG/0/6050http://www.opengis.net/def/crs/EPSG/0/6051http://www.opengis.net/def/crs/EPSG/0/6052http://www.opengis.net/def/crs/EPSG/0/6053http://www.opengis.net/def/crs/EPSG/0/6054http://www.opengis.net/def/crs/EPSG/0/6055http://www.opengis.net/def/crs/EPSG/0/6056http://www.opengis.net/def/crs/EPSG/0/6057http://www.opengis.net/def/crs/EPSG/0/6058http://www.opengis.net/def/crs/EPSG/0/6059http://www.opengis.net/def/crs/EPSG/0/6060http://www.opengis.net/def/crs/EPSG/0/6061http://www.opengis.net/def/crs/EPSG/0/6062http://www.opengis.net/def/crs/EPSG/0/6063http://www.opengis.net/def/crs/EPSG/0/6064http://www.opengis.net/def/crs/EPSG/0/6065http://www.opengis.net/def/crs/EPSG/0/6066http://www.opengis.net/def/crs/EPSG/0/6067http://www.opengis.net/def/crs/EPSG/0/6068http://www.opengis.net/def/crs/EPSG/0/6069http://www.opengis.net/def/crs/EPSG/0/6070http://www.opengis.net/def/crs/EPSG/0/6071http://www.opengis.net/def/crs/EPSG/0/6072http://www.opengis.net/def/crs/EPSG/0/6073http://www.opengis.net/def/crs/EPSG/0/6074http://www.opengis.net/def/crs/EPSG/0/6075http://www.opengis.net/def/crs/EPSG/0/6076http://www.opengis.net/def/crs/EPSG/0/6077http://www.opengis.net/def/crs/EPSG/0/6078http://www.opengis.net/def/crs/EPSG/0/6079http://www.opengis.net/def/crs/EPSG/0/6080http://www.opengis.net/def/crs/EPSG/0/6081http://www.opengis.net/def/crs/EPSG/0/6082http://www.opengis.net/def/crs/EPSG/0/6083http://www.opengis.net/def/crs/EPSG/0/6084http://www.opengis.net/def/crs/EPSG/0/6085http://www.opengis.net/def/crs/EPSG/0/6086http://www.opengis.net/def/crs/EPSG/0/6087http://www.opengis.net/def/crs/EPSG/0/6088http://www.opengis.net/def/crs/EPSG/0/6089http://www.opengis.net/def/crs/EPSG/0/6090http://www.opengis.net/def/crs/EPSG/0/6091http://www.opengis.net/def/crs/EPSG/0/6092http://www.opengis.net/def/crs/EPSG/0/6093http://www.opengis.net/def/crs/EPSG/0/6094http://www.opengis.net/def/crs/EPSG/0/6095http://www.opengis.net/def/crs/EPSG/0/6096http://www.opengis.net/def/crs/EPSG/0/6097http://www.opengis.net/def/crs/EPSG/0/6098http://www.opengis.net/def/crs/EPSG/0/6099http://www.opengis.net/def/crs/EPSG/0/6100http://www.opengis.net/def/crs/EPSG/0/6101http://www.opengis.net/def/crs/EPSG/0/6102http://www.opengis.net/def/crs/EPSG/0/6103http://www.opengis.net/def/crs/EPSG/0/6104http://www.opengis.net/def/crs/EPSG/0/6105http://www.opengis.net/def/crs/EPSG/0/6106http://www.opengis.net/def/crs/EPSG/0/6107http://www.opengis.net/def/crs/EPSG/0/6108http://www.opengis.net/def/crs/EPSG/0/6109http://www.opengis.net/def/crs/EPSG/0/6110http://www.opengis.net/def/crs/EPSG/0/6111http://www.opengis.net/def/crs/EPSG/0/6112http://www.opengis.net/def/crs/EPSG/0/6113http://www.opengis.net/def/crs/EPSG/0/6114http://www.opengis.net/def/crs/EPSG/0/6115http://www.opengis.net/def/crs/EPSG/0/6116http://www.opengis.net/def/crs/EPSG/0/6117http://www.opengis.net/def/crs/EPSG/0/6118http://www.opengis.net/def/crs/EPSG/0/6119http://www.opengis.net/def/crs/EPSG/0/6120http://www.opengis.net/def/crs/EPSG/0/6121http://www.opengis.net/def/crs/EPSG/0/6122http://www.opengis.net/def/crs/EPSG/0/6123http://www.opengis.net/def/crs/EPSG/0/6124http://www.opengis.net/def/crs/EPSG/0/6125http://www.opengis.net/def/crs/EPSG/0/6128http://www.opengis.net/def/crs/EPSG/0/6129http://www.opengis.net/def/crs/EPSG/0/6130http://www.opengis.net/def/crs/EPSG/0/6131http://www.opengis.net/def/crs/EPSG/0/6132http://www.opengis.net/def/crs/EPSG/0/6133http://www.opengis.net/def/crs/EPSG/0/6134http://www.opengis.net/def/crs/EPSG/0/6135http://www.opengis.net/def/crs/EPSG/0/6141http://www.opengis.net/def/crs/EPSG/0/6144http://www.opengis.net/def/crs/EPSG/0/6145http://www.opengis.net/def/crs/EPSG/0/6146http://www.opengis.net/def/crs/EPSG/0/6147http://www.opengis.net/def/crs/EPSG/0/6148http://www.opengis.net/def/crs/EPSG/0/6149http://www.opengis.net/def/crs/EPSG/0/6150http://www.opengis.net/def/crs/EPSG/0/6151http://www.opengis.net/def/crs/EPSG/0/6152http://www.opengis.net/def/crs/EPSG/0/6153http://www.opengis.net/def/crs/EPSG/0/6154http://www.opengis.net/def/crs/EPSG/0/6155http://www.opengis.net/def/crs/EPSG/0/6156http://www.opengis.net/def/crs/EPSG/0/6157http://www.opengis.net/def/crs/EPSG/0/6158http://www.opengis.net/def/crs/EPSG/0/6159http://www.opengis.net/def/crs/EPSG/0/6160http://www.opengis.net/def/crs/EPSG/0/6161http://www.opengis.net/def/crs/EPSG/0/6162http://www.opengis.net/def/crs/EPSG/0/6163http://www.opengis.net/def/crs/EPSG/0/6164http://www.opengis.net/def/crs/EPSG/0/6165http://www.opengis.net/def/crs/EPSG/0/6166http://www.opengis.net/def/crs/EPSG/0/6167http://www.opengis.net/def/crs/EPSG/0/6168http://www.opengis.net/def/crs/EPSG/0/6169http://www.opengis.net/def/crs/EPSG/0/6170http://www.opengis.net/def/crs/EPSG/0/6171http://www.opengis.net/def/crs/EPSG/0/6172http://www.opengis.net/def/crs/EPSG/0/6173http://www.opengis.net/def/crs/EPSG/0/6174http://www.opengis.net/def/crs/EPSG/0/6175http://www.opengis.net/def/crs/EPSG/0/6176http://www.opengis.net/def/crs/EPSG/0/6178http://www.opengis.net/def/crs/EPSG/0/6179http://www.opengis.net/def/crs/EPSG/0/6180http://www.opengis.net/def/crs/EPSG/0/6181http://www.opengis.net/def/crs/EPSG/0/6182http://www.opengis.net/def/crs/EPSG/0/6183http://www.opengis.net/def/crs/EPSG/0/6184http://www.opengis.net/def/crs/EPSG/0/6185http://www.opengis.net/def/crs/EPSG/0/6186http://www.opengis.net/def/crs/EPSG/0/6187http://www.opengis.net/def/crs/EPSG/0/6190http://www.opengis.net/def/crs/EPSG/0/6200http://www.opengis.net/def/crs/EPSG/0/6201http://www.opengis.net/def/crs/EPSG/0/6202http://www.opengis.net/def/crs/EPSG/0/6204http://www.opengis.net/def/crs/EPSG/0/6207http://www.opengis.net/def/crs/EPSG/0/6210http://www.opengis.net/def/crs/EPSG/0/6211http://www.opengis.net/def/crs/EPSG/0/6244http://www.opengis.net/def/crs/EPSG/0/6245http://www.opengis.net/def/crs/EPSG/0/6246http://www.opengis.net/def/crs/EPSG/0/6247http://www.opengis.net/def/crs/EPSG/0/6248http://www.opengis.net/def/crs/EPSG/0/6249http://www.opengis.net/def/crs/EPSG/0/6250http://www.opengis.net/def/crs/EPSG/0/6251http://www.opengis.net/def/crs/EPSG/0/6252http://www.opengis.net/def/crs/EPSG/0/6253http://www.opengis.net/def/crs/EPSG/0/6254http://www.opengis.net/def/crs/EPSG/0/6255http://www.opengis.net/def/crs/EPSG/0/6256http://www.opengis.net/def/crs/EPSG/0/6257http://www.opengis.net/def/crs/EPSG/0/6258http://www.opengis.net/def/crs/EPSG/0/6259http://www.opengis.net/def/crs/EPSG/0/6260http://www.opengis.net/def/crs/EPSG/0/6261http://www.opengis.net/def/crs/EPSG/0/6262http://www.opengis.net/def/crs/EPSG/0/6263http://www.opengis.net/def/crs/EPSG/0/6264http://www.opengis.net/def/crs/EPSG/0/6265http://www.opengis.net/def/crs/EPSG/0/6266http://www.opengis.net/def/crs/EPSG/0/6267http://www.opengis.net/def/crs/EPSG/0/6268http://www.opengis.net/def/crs/EPSG/0/6269http://www.opengis.net/def/crs/EPSG/0/6270http://www.opengis.net/def/crs/EPSG/0/6271http://www.opengis.net/def/crs/EPSG/0/6272http://www.opengis.net/def/crs/EPSG/0/6273http://www.opengis.net/def/crs/EPSG/0/6274http://www.opengis.net/def/crs/EPSG/0/6275http://www.opengis.net/def/crs/EPSG/0/6316http://www.opengis.net/def/crs/EPSG/0/6317http://www.opengis.net/def/crs/EPSG/0/6318http://www.opengis.net/def/crs/EPSG/0/6319http://www.opengis.net/def/crs/EPSG/0/6320http://www.opengis.net/def/crs/EPSG/0/6321http://www.opengis.net/def/crs/EPSG/0/6322http://www.opengis.net/def/crs/EPSG/0/6323http://www.opengis.net/def/crs/EPSG/0/6324http://www.opengis.net/def/crs/EPSG/0/6325http://www.opengis.net/def/crs/EPSG/0/6328http://www.opengis.net/def/crs/EPSG/0/6329http://www.opengis.net/def/crs/EPSG/0/6330http://www.opengis.net/def/crs/EPSG/0/6331http://www.opengis.net/def/crs/EPSG/0/6332http://www.opengis.net/def/crs/EPSG/0/6333http://www.opengis.net/def/crs/EPSG/0/6334http://www.opengis.net/def/crs/EPSG/0/6335http://www.opengis.net/def/crs/EPSG/0/6336http://www.opengis.net/def/crs/EPSG/0/6337http://www.opengis.net/def/crs/EPSG/0/6338http://www.opengis.net/def/crs/EPSG/0/6339http://www.opengis.net/def/crs/EPSG/0/6340http://www.opengis.net/def/crs/EPSG/0/6341http://www.opengis.net/def/crs/EPSG/0/6342http://www.opengis.net/def/crs/EPSG/0/6343http://www.opengis.net/def/crs/EPSG/0/6344http://www.opengis.net/def/crs/EPSG/0/6345http://www.opengis.net/def/crs/EPSG/0/6346http://www.opengis.net/def/crs/EPSG/0/6347http://www.opengis.net/def/crs/EPSG/0/6348http://www.opengis.net/def/crs/EPSG/0/6349http://www.opengis.net/def/crs/EPSG/0/6350http://www.opengis.net/def/crs/EPSG/0/6351http://www.opengis.net/def/crs/EPSG/0/6352http://www.opengis.net/def/crs/EPSG/0/6353http://www.opengis.net/def/crs/EPSG/0/6354http://www.opengis.net/def/crs/EPSG/0/6355http://www.opengis.net/def/crs/EPSG/0/6356http://www.opengis.net/def/crs/EPSG/0/6357http://www.opengis.net/def/crs/EPSG/0/6358http://www.opengis.net/def/crs/EPSG/0/6359http://www.opengis.net/def/crs/EPSG/0/6360http://www.opengis.net/def/crs/EPSG/0/6362http://www.opengis.net/def/crs/EPSG/0/6363http://www.opengis.net/def/crs/EPSG/0/6364http://www.opengis.net/def/crs/EPSG/0/6365http://www.opengis.net/def/crs/EPSG/0/6366http://www.opengis.net/def/crs/EPSG/0/6367http://www.opengis.net/def/crs/EPSG/0/6368http://www.opengis.net/def/crs/EPSG/0/6369http://www.opengis.net/def/crs/EPSG/0/6370http://www.opengis.net/def/crs/EPSG/0/6371http://www.opengis.net/def/crs/EPSG/0/6372http://www.opengis.net/def/crs/EPSG/0/6381http://www.opengis.net/def/crs/EPSG/0/6382http://www.opengis.net/def/crs/EPSG/0/6383http://www.opengis.net/def/crs/EPSG/0/6384http://www.opengis.net/def/crs/EPSG/0/6385http://www.opengis.net/def/crs/EPSG/0/6386http://www.opengis.net/def/crs/EPSG/0/6387http://www.opengis.net/def/crs/EPSG/0/6391http://www.opengis.net/def/crs/EPSG/0/6393http://www.opengis.net/def/crs/EPSG/0/6394http://www.opengis.net/def/crs/EPSG/0/6395http://www.opengis.net/def/crs/EPSG/0/6396http://www.opengis.net/def/crs/EPSG/0/6397http://www.opengis.net/def/crs/EPSG/0/6398http://www.opengis.net/def/crs/EPSG/0/6399http://www.opengis.net/def/crs/EPSG/0/6400http://www.opengis.net/def/crs/EPSG/0/6401http://www.opengis.net/def/crs/EPSG/0/6402http://www.opengis.net/def/crs/EPSG/0/6403http://www.opengis.net/def/crs/EPSG/0/6404http://www.opengis.net/def/crs/EPSG/0/6405http://www.opengis.net/def/crs/EPSG/0/6406http://www.opengis.net/def/crs/EPSG/0/6407http://www.opengis.net/def/crs/EPSG/0/6408http://www.opengis.net/def/crs/EPSG/0/6409http://www.opengis.net/def/crs/EPSG/0/6410http://www.opengis.net/def/crs/EPSG/0/6411http://www.opengis.net/def/crs/EPSG/0/6412http://www.opengis.net/def/crs/EPSG/0/6413http://www.opengis.net/def/crs/EPSG/0/6414http://www.opengis.net/def/crs/EPSG/0/6415http://www.opengis.net/def/crs/EPSG/0/6416http://www.opengis.net/def/crs/EPSG/0/6417http://www.opengis.net/def/crs/EPSG/0/6418http://www.opengis.net/def/crs/EPSG/0/6419http://www.opengis.net/def/crs/EPSG/0/6420http://www.opengis.net/def/crs/EPSG/0/6421http://www.opengis.net/def/crs/EPSG/0/6422http://www.opengis.net/def/crs/EPSG/0/6423http://www.opengis.net/def/crs/EPSG/0/6424http://www.opengis.net/def/crs/EPSG/0/6425http://www.opengis.net/def/crs/EPSG/0/6426http://www.opengis.net/def/crs/EPSG/0/6427http://www.opengis.net/def/crs/EPSG/0/6428http://www.opengis.net/def/crs/EPSG/0/6429http://www.opengis.net/def/crs/EPSG/0/6430http://www.opengis.net/def/crs/EPSG/0/6431http://www.opengis.net/def/crs/EPSG/0/6432http://www.opengis.net/def/crs/EPSG/0/6433http://www.opengis.net/def/crs/EPSG/0/6434http://www.opengis.net/def/crs/EPSG/0/6435http://www.opengis.net/def/crs/EPSG/0/6436http://www.opengis.net/def/crs/EPSG/0/6437http://www.opengis.net/def/crs/EPSG/0/6438http://www.opengis.net/def/crs/EPSG/0/6439http://www.opengis.net/def/crs/EPSG/0/6440http://www.opengis.net/def/crs/EPSG/0/6441http://www.opengis.net/def/crs/EPSG/0/6442http://www.opengis.net/def/crs/EPSG/0/6443http://www.opengis.net/def/crs/EPSG/0/6444http://www.opengis.net/def/crs/EPSG/0/6445http://www.opengis.net/def/crs/EPSG/0/6446http://www.opengis.net/def/crs/EPSG/0/6447http://www.opengis.net/def/crs/EPSG/0/6448http://www.opengis.net/def/crs/EPSG/0/6449http://www.opengis.net/def/crs/EPSG/0/6450http://www.opengis.net/def/crs/EPSG/0/6451http://www.opengis.net/def/crs/EPSG/0/6452http://www.opengis.net/def/crs/EPSG/0/6453http://www.opengis.net/def/crs/EPSG/0/6454http://www.opengis.net/def/crs/EPSG/0/6455http://www.opengis.net/def/crs/EPSG/0/6456http://www.opengis.net/def/crs/EPSG/0/6457http://www.opengis.net/def/crs/EPSG/0/6458http://www.opengis.net/def/crs/EPSG/0/6459http://www.opengis.net/def/crs/EPSG/0/6460http://www.opengis.net/def/crs/EPSG/0/6461http://www.opengis.net/def/crs/EPSG/0/6462http://www.opengis.net/def/crs/EPSG/0/6463http://www.opengis.net/def/crs/EPSG/0/6464http://www.opengis.net/def/crs/EPSG/0/6465http://www.opengis.net/def/crs/EPSG/0/6466http://www.opengis.net/def/crs/EPSG/0/6467http://www.opengis.net/def/crs/EPSG/0/6468http://www.opengis.net/def/crs/EPSG/0/6469http://www.opengis.net/def/crs/EPSG/0/6470http://www.opengis.net/def/crs/EPSG/0/6471http://www.opengis.net/def/crs/EPSG/0/6472http://www.opengis.net/def/crs/EPSG/0/6473http://www.opengis.net/def/crs/EPSG/0/6474http://www.opengis.net/def/crs/EPSG/0/6475http://www.opengis.net/def/crs/EPSG/0/6476http://www.opengis.net/def/crs/EPSG/0/6477http://www.opengis.net/def/crs/EPSG/0/6478http://www.opengis.net/def/crs/EPSG/0/6479http://www.opengis.net/def/crs/EPSG/0/6480http://www.opengis.net/def/crs/EPSG/0/6481http://www.opengis.net/def/crs/EPSG/0/6482http://www.opengis.net/def/crs/EPSG/0/6483http://www.opengis.net/def/crs/EPSG/0/6484http://www.opengis.net/def/crs/EPSG/0/6485http://www.opengis.net/def/crs/EPSG/0/6486http://www.opengis.net/def/crs/EPSG/0/6487http://www.opengis.net/def/crs/EPSG/0/6488http://www.opengis.net/def/crs/EPSG/0/6489http://www.opengis.net/def/crs/EPSG/0/6490http://www.opengis.net/def/crs/EPSG/0/6491http://www.opengis.net/def/crs/EPSG/0/6492http://www.opengis.net/def/crs/EPSG/0/6493http://www.opengis.net/def/crs/EPSG/0/6494http://www.opengis.net/def/crs/EPSG/0/6495http://www.opengis.net/def/crs/EPSG/0/6496http://www.opengis.net/def/crs/EPSG/0/6497http://www.opengis.net/def/crs/EPSG/0/6498http://www.opengis.net/def/crs/EPSG/0/6499http://www.opengis.net/def/crs/EPSG/0/6500http://www.opengis.net/def/crs/EPSG/0/6501http://www.opengis.net/def/crs/EPSG/0/6502http://www.opengis.net/def/crs/EPSG/0/6503http://www.opengis.net/def/crs/EPSG/0/6504http://www.opengis.net/def/crs/EPSG/0/6505http://www.opengis.net/def/crs/EPSG/0/6506http://www.opengis.net/def/crs/EPSG/0/6507http://www.opengis.net/def/crs/EPSG/0/6508http://www.opengis.net/def/crs/EPSG/0/6509http://www.opengis.net/def/crs/EPSG/0/6510http://www.opengis.net/def/crs/EPSG/0/6511http://www.opengis.net/def/crs/EPSG/0/6512http://www.opengis.net/def/crs/EPSG/0/6513http://www.opengis.net/def/crs/EPSG/0/6514http://www.opengis.net/def/crs/EPSG/0/6515http://www.opengis.net/def/crs/EPSG/0/6516http://www.opengis.net/def/crs/EPSG/0/6517http://www.opengis.net/def/crs/EPSG/0/6518http://www.opengis.net/def/crs/EPSG/0/6519http://www.opengis.net/def/crs/EPSG/0/6520http://www.opengis.net/def/crs/EPSG/0/6521http://www.opengis.net/def/crs/EPSG/0/6522http://www.opengis.net/def/crs/EPSG/0/6523http://www.opengis.net/def/crs/EPSG/0/6524http://www.opengis.net/def/crs/EPSG/0/6525http://www.opengis.net/def/crs/EPSG/0/6526http://www.opengis.net/def/crs/EPSG/0/6527http://www.opengis.net/def/crs/EPSG/0/6528http://www.opengis.net/def/crs/EPSG/0/6529http://www.opengis.net/def/crs/EPSG/0/6530http://www.opengis.net/def/crs/EPSG/0/6531http://www.opengis.net/def/crs/EPSG/0/6532http://www.opengis.net/def/crs/EPSG/0/6533http://www.opengis.net/def/crs/EPSG/0/6534http://www.opengis.net/def/crs/EPSG/0/6535http://www.opengis.net/def/crs/EPSG/0/6536http://www.opengis.net/def/crs/EPSG/0/6537http://www.opengis.net/def/crs/EPSG/0/6538http://www.opengis.net/def/crs/EPSG/0/6539http://www.opengis.net/def/crs/EPSG/0/6540http://www.opengis.net/def/crs/EPSG/0/6541http://www.opengis.net/def/crs/EPSG/0/6542http://www.opengis.net/def/crs/EPSG/0/6543http://www.opengis.net/def/crs/EPSG/0/6544http://www.opengis.net/def/crs/EPSG/0/6545http://www.opengis.net/def/crs/EPSG/0/6546http://www.opengis.net/def/crs/EPSG/0/6547http://www.opengis.net/def/crs/EPSG/0/6548http://www.opengis.net/def/crs/EPSG/0/6549http://www.opengis.net/def/crs/EPSG/0/6550http://www.opengis.net/def/crs/EPSG/0/6551http://www.opengis.net/def/crs/EPSG/0/6552http://www.opengis.net/def/crs/EPSG/0/6553http://www.opengis.net/def/crs/EPSG/0/6554http://www.opengis.net/def/crs/EPSG/0/6555http://www.opengis.net/def/crs/EPSG/0/6556http://www.opengis.net/def/crs/EPSG/0/6557http://www.opengis.net/def/crs/EPSG/0/6558http://www.opengis.net/def/crs/EPSG/0/6559http://www.opengis.net/def/crs/EPSG/0/6560http://www.opengis.net/def/crs/EPSG/0/6561http://www.opengis.net/def/crs/EPSG/0/6562http://www.opengis.net/def/crs/EPSG/0/6563http://www.opengis.net/def/crs/EPSG/0/6564http://www.opengis.net/def/crs/EPSG/0/6565http://www.opengis.net/def/crs/EPSG/0/6566http://www.opengis.net/def/crs/EPSG/0/6567http://www.opengis.net/def/crs/EPSG/0/6568http://www.opengis.net/def/crs/EPSG/0/6569http://www.opengis.net/def/crs/EPSG/0/6570http://www.opengis.net/def/crs/EPSG/0/6571http://www.opengis.net/def/crs/EPSG/0/6572http://www.opengis.net/def/crs/EPSG/0/6573http://www.opengis.net/def/crs/EPSG/0/6574http://www.opengis.net/def/crs/EPSG/0/6575http://www.opengis.net/def/crs/EPSG/0/6576http://www.opengis.net/def/crs/EPSG/0/6577http://www.opengis.net/def/crs/EPSG/0/6578http://www.opengis.net/def/crs/EPSG/0/6579http://www.opengis.net/def/crs/EPSG/0/6580http://www.opengis.net/def/crs/EPSG/0/6581http://www.opengis.net/def/crs/EPSG/0/6582http://www.opengis.net/def/crs/EPSG/0/6583http://www.opengis.net/def/crs/EPSG/0/6584http://www.opengis.net/def/crs/EPSG/0/6585http://www.opengis.net/def/crs/EPSG/0/6586http://www.opengis.net/def/crs/EPSG/0/6587http://www.opengis.net/def/crs/EPSG/0/6588http://www.opengis.net/def/crs/EPSG/0/6589http://www.opengis.net/def/crs/EPSG/0/6590http://www.opengis.net/def/crs/EPSG/0/6591http://www.opengis.net/def/crs/EPSG/0/6592http://www.opengis.net/def/crs/EPSG/0/6593http://www.opengis.net/def/crs/EPSG/0/6594http://www.opengis.net/def/crs/EPSG/0/6595http://www.opengis.net/def/crs/EPSG/0/6596http://www.opengis.net/def/crs/EPSG/0/6597http://www.opengis.net/def/crs/EPSG/0/6598http://www.opengis.net/def/crs/EPSG/0/6599http://www.opengis.net/def/crs/EPSG/0/6600http://www.opengis.net/def/crs/EPSG/0/6601http://www.opengis.net/def/crs/EPSG/0/6602http://www.opengis.net/def/crs/EPSG/0/6603http://www.opengis.net/def/crs/EPSG/0/6604http://www.opengis.net/def/crs/EPSG/0/6605http://www.opengis.net/def/crs/EPSG/0/6606http://www.opengis.net/def/crs/EPSG/0/6607http://www.opengis.net/def/crs/EPSG/0/6608http://www.opengis.net/def/crs/EPSG/0/6609http://www.opengis.net/def/crs/EPSG/0/6610http://www.opengis.net/def/crs/EPSG/0/6611http://www.opengis.net/def/crs/EPSG/0/6612http://www.opengis.net/def/crs/EPSG/0/6613http://www.opengis.net/def/crs/EPSG/0/6614http://www.opengis.net/def/crs/EPSG/0/6615http://www.opengis.net/def/crs/EPSG/0/6616http://www.opengis.net/def/crs/EPSG/0/6617http://www.opengis.net/def/crs/EPSG/0/6618http://www.opengis.net/def/crs/EPSG/0/6619http://www.opengis.net/def/crs/EPSG/0/6620http://www.opengis.net/def/crs/EPSG/0/6621http://www.opengis.net/def/crs/EPSG/0/6622http://www.opengis.net/def/crs/EPSG/0/6623http://www.opengis.net/def/crs/EPSG/0/6624http://www.opengis.net/def/crs/EPSG/0/6625http://www.opengis.net/def/crs/EPSG/0/6626http://www.opengis.net/def/crs/EPSG/0/6627http://www.opengis.net/def/crs/EPSG/0/6628http://www.opengis.net/def/crs/EPSG/0/6629http://www.opengis.net/def/crs/EPSG/0/6630http://www.opengis.net/def/crs/EPSG/0/6631http://www.opengis.net/def/crs/EPSG/0/6632http://www.opengis.net/def/crs/EPSG/0/6633http://www.opengis.net/def/crs/EPSG/0/6634http://www.opengis.net/def/crs/EPSG/0/6635http://www.opengis.net/def/crs/EPSG/0/6636http://www.opengis.net/def/crs/EPSG/0/6637http://www.opengis.net/def/crs/EPSG/0/6638http://www.opengis.net/def/crs/EPSG/0/6639http://www.opengis.net/def/crs/EPSG/0/6640http://www.opengis.net/def/crs/EPSG/0/6641http://www.opengis.net/def/crs/EPSG/0/6642http://www.opengis.net/def/crs/EPSG/0/6643http://www.opengis.net/def/crs/EPSG/0/6644http://www.opengis.net/def/crs/EPSG/0/6646http://www.opengis.net/def/crs/EPSG/0/6647http://www.opengis.net/def/crs/EPSG/0/6649http://www.opengis.net/def/crs/EPSG/0/6650http://www.opengis.net/def/crs/EPSG/0/6651http://www.opengis.net/def/crs/EPSG/0/6652http://www.opengis.net/def/crs/EPSG/0/6653http://www.opengis.net/def/crs/EPSG/0/6654http://www.opengis.net/def/crs/EPSG/0/6655http://www.opengis.net/def/crs/EPSG/0/6656http://www.opengis.net/def/crs/EPSG/0/6657http://www.opengis.net/def/crs/EPSG/0/6658http://www.opengis.net/def/crs/EPSG/0/6659http://www.opengis.net/def/crs/EPSG/0/6660http://www.opengis.net/def/crs/EPSG/0/6661http://www.opengis.net/def/crs/EPSG/0/6662http://www.opengis.net/def/crs/EPSG/0/6663http://www.opengis.net/def/crs/EPSG/0/6664http://www.opengis.net/def/crs/EPSG/0/6665http://www.opengis.net/def/crs/EPSG/0/6666http://www.opengis.net/def/crs/EPSG/0/6667http://www.opengis.net/def/crs/EPSG/0/6668http://www.opengis.net/def/crs/EPSG/0/6669http://www.opengis.net/def/crs/EPSG/0/6670http://www.opengis.net/def/crs/EPSG/0/6671http://www.opengis.net/def/crs/EPSG/0/6672http://www.opengis.net/def/crs/EPSG/0/6673http://www.opengis.net/def/crs/EPSG/0/6674http://www.opengis.net/def/crs/EPSG/0/6675http://www.opengis.net/def/crs/EPSG/0/6676http://www.opengis.net/def/crs/EPSG/0/6677http://www.opengis.net/def/crs/EPSG/0/6678http://www.opengis.net/def/crs/EPSG/0/6679http://www.opengis.net/def/crs/EPSG/0/6680http://www.opengis.net/def/crs/EPSG/0/6681http://www.opengis.net/def/crs/EPSG/0/6682http://www.opengis.net/def/crs/EPSG/0/6683http://www.opengis.net/def/crs/EPSG/0/6684http://www.opengis.net/def/crs/EPSG/0/6685http://www.opengis.net/def/crs/EPSG/0/6686http://www.opengis.net/def/crs/EPSG/0/6687http://www.opengis.net/def/crs/EPSG/0/6688http://www.opengis.net/def/crs/EPSG/0/6689http://www.opengis.net/def/crs/EPSG/0/6690http://www.opengis.net/def/crs/EPSG/0/6691http://www.opengis.net/def/crs/EPSG/0/6692http://www.opengis.net/def/crs/EPSG/0/6693http://www.opengis.net/def/crs/EPSG/0/6694http://www.opengis.net/def/crs/EPSG/0/6695http://www.opengis.net/def/crs/EPSG/0/6696http://www.opengis.net/def/crs/EPSG/0/6697http://www.opengis.net/def/crs/EPSG/0/6700http://www.opengis.net/def/crs/EPSG/0/6703http://www.opengis.net/def/crs/EPSG/0/6704http://www.opengis.net/def/crs/EPSG/0/6705http://www.opengis.net/def/crs/EPSG/0/6706http://www.opengis.net/def/crs/EPSG/0/6707http://www.opengis.net/def/crs/EPSG/0/6708http://www.opengis.net/def/crs/EPSG/0/6709http://www.opengis.net/def/crs/EPSG/0/6715http://www.opengis.net/def/crs/EPSG/0/6720http://www.opengis.net/def/crs/EPSG/0/6721http://www.opengis.net/def/crs/EPSG/0/6722http://www.opengis.net/def/crs/EPSG/0/6723http://www.opengis.net/def/crs/EPSG/0/6732http://www.opengis.net/def/crs/EPSG/0/6733http://www.opengis.net/def/crs/EPSG/0/6734http://www.opengis.net/def/crs/EPSG/0/6735http://www.opengis.net/def/crs/EPSG/0/6736http://www.opengis.net/def/crs/EPSG/0/6737http://www.opengis.net/def/crs/EPSG/0/6738http://www.opengis.net/def/crs/EPSG/0/6781http://www.opengis.net/def/crs/EPSG/0/6782http://www.opengis.net/def/crs/EPSG/0/6783http://www.opengis.net/def/crs/EPSG/0/6784http://www.opengis.net/def/crs/EPSG/0/6785http://www.opengis.net/def/crs/EPSG/0/6786http://www.opengis.net/def/crs/EPSG/0/6787http://www.opengis.net/def/crs/EPSG/0/6788http://www.opengis.net/def/crs/EPSG/0/6789http://www.opengis.net/def/crs/EPSG/0/6790http://www.opengis.net/def/crs/EPSG/0/6791http://www.opengis.net/def/crs/EPSG/0/6792http://www.opengis.net/def/crs/EPSG/0/6793http://www.opengis.net/def/crs/EPSG/0/6794http://www.opengis.net/def/crs/EPSG/0/6795http://www.opengis.net/def/crs/EPSG/0/6796http://www.opengis.net/def/crs/EPSG/0/6797http://www.opengis.net/def/crs/EPSG/0/6798http://www.opengis.net/def/crs/EPSG/0/6799http://www.opengis.net/def/crs/EPSG/0/6800http://www.opengis.net/def/crs/EPSG/0/6801http://www.opengis.net/def/crs/EPSG/0/6802http://www.opengis.net/def/crs/EPSG/0/6803http://www.opengis.net/def/crs/EPSG/0/6804http://www.opengis.net/def/crs/EPSG/0/6805http://www.opengis.net/def/crs/EPSG/0/6806http://www.opengis.net/def/crs/EPSG/0/6807http://www.opengis.net/def/crs/EPSG/0/6808http://www.opengis.net/def/crs/EPSG/0/6809http://www.opengis.net/def/crs/EPSG/0/6810http://www.opengis.net/def/crs/EPSG/0/6811http://www.opengis.net/def/crs/EPSG/0/6812http://www.opengis.net/def/crs/EPSG/0/6813http://www.opengis.net/def/crs/EPSG/0/6814http://www.opengis.net/def/crs/EPSG/0/6815http://www.opengis.net/def/crs/EPSG/0/6816http://www.opengis.net/def/crs/EPSG/0/6817http://www.opengis.net/def/crs/EPSG/0/6818http://www.opengis.net/def/crs/EPSG/0/6819http://www.opengis.net/def/crs/EPSG/0/6820http://www.opengis.net/def/crs/EPSG/0/6821http://www.opengis.net/def/crs/EPSG/0/6822http://www.opengis.net/def/crs/EPSG/0/6823http://www.opengis.net/def/crs/EPSG/0/6824http://www.opengis.net/def/crs/EPSG/0/6825http://www.opengis.net/def/crs/EPSG/0/6826http://www.opengis.net/def/crs/EPSG/0/6827http://www.opengis.net/def/crs/EPSG/0/6828http://www.opengis.net/def/crs/EPSG/0/6829http://www.opengis.net/def/crs/EPSG/0/6830http://www.opengis.net/def/crs/EPSG/0/6831http://www.opengis.net/def/crs/EPSG/0/6832http://www.opengis.net/def/crs/EPSG/0/6833http://www.opengis.net/def/crs/EPSG/0/6834http://www.opengis.net/def/crs/EPSG/0/6835http://www.opengis.net/def/crs/EPSG/0/6836http://www.opengis.net/def/crs/EPSG/0/6837http://www.opengis.net/def/crs/EPSG/0/6838http://www.opengis.net/def/crs/EPSG/0/6839http://www.opengis.net/def/crs/EPSG/0/6840http://www.opengis.net/def/crs/EPSG/0/6841http://www.opengis.net/def/crs/EPSG/0/6842http://www.opengis.net/def/crs/EPSG/0/6843http://www.opengis.net/def/crs/EPSG/0/6844http://www.opengis.net/def/crs/EPSG/0/6845http://www.opengis.net/def/crs/EPSG/0/6846http://www.opengis.net/def/crs/EPSG/0/6847http://www.opengis.net/def/crs/EPSG/0/6848http://www.opengis.net/def/crs/EPSG/0/6849http://www.opengis.net/def/crs/EPSG/0/6850http://www.opengis.net/def/crs/EPSG/0/6851http://www.opengis.net/def/crs/EPSG/0/6852http://www.opengis.net/def/crs/EPSG/0/6853http://www.opengis.net/def/crs/EPSG/0/6854http://www.opengis.net/def/crs/EPSG/0/6855http://www.opengis.net/def/crs/EPSG/0/6856http://www.opengis.net/def/crs/EPSG/0/6857http://www.opengis.net/def/crs/EPSG/0/6858http://www.opengis.net/def/crs/EPSG/0/6859http://www.opengis.net/def/crs/EPSG/0/6860http://www.opengis.net/def/crs/EPSG/0/6861http://www.opengis.net/def/crs/EPSG/0/6862http://www.opengis.net/def/crs/EPSG/0/6863http://www.opengis.net/def/crs/EPSG/0/6867http://www.opengis.net/def/crs/EPSG/0/6868http://www.opengis.net/def/crs/EPSG/0/6870http://www.opengis.net/def/crs/EPSG/0/6871http://www.opengis.net/def/crs/EPSG/0/6875http://www.opengis.net/def/crs/EPSG/0/6876http://www.opengis.net/def/crs/EPSG/0/6879http://www.opengis.net/def/crs/EPSG/0/6880http://www.opengis.net/def/crs/EPSG/0/6881http://www.opengis.net/def/crs/EPSG/0/6882http://www.opengis.net/def/crs/EPSG/0/6883http://www.opengis.net/def/crs/EPSG/0/6884http://www.opengis.net/def/crs/EPSG/0/6885http://www.opengis.net/def/crs/EPSG/0/6886http://www.opengis.net/def/crs/EPSG/0/6887http://www.opengis.net/def/crs/EPSG/0/6892http://www.opengis.net/def/crs/EPSG/0/6893http://www.opengis.net/def/crs/EPSG/0/6894http://www.opengis.net/def/crs/EPSG/0/6915http://www.opengis.net/def/crs/EPSG/0/6916http://www.opengis.net/def/crs/EPSG/0/6917http://www.opengis.net/def/crs/EPSG/0/6922http://www.opengis.net/def/crs/EPSG/0/6923http://www.opengis.net/def/crs/EPSG/0/6924http://www.opengis.net/def/crs/EPSG/0/6925http://www.opengis.net/def/crs/EPSG/0/6927http://www.opengis.net/def/crs/EPSG/0/6931http://www.opengis.net/def/crs/EPSG/0/6932http://www.opengis.net/def/crs/EPSG/0/6933http://www.opengis.net/def/crs/EPSG/0/6956http://www.opengis.net/def/crs/EPSG/0/6957http://www.opengis.net/def/crs/EPSG/0/6958http://www.opengis.net/def/crs/EPSG/0/6959http://www.opengis.net/def/crs/EPSG/0/6962http://www.opengis.net/def/crs/EPSG/0/6978http://www.opengis.net/def/crs/EPSG/0/6979http://www.opengis.net/def/crs/EPSG/0/6980http://www.opengis.net/def/crs/EPSG/0/6981http://www.opengis.net/def/crs/EPSG/0/6982http://www.opengis.net/def/crs/EPSG/0/6983http://www.opengis.net/def/crs/EPSG/0/6984http://www.opengis.net/def/crs/EPSG/0/6985http://www.opengis.net/def/crs/EPSG/0/6986http://www.opengis.net/def/crs/EPSG/0/6987http://www.opengis.net/def/crs/EPSG/0/6988http://www.opengis.net/def/crs/EPSG/0/6989http://www.opengis.net/def/crs/EPSG/0/6990http://www.opengis.net/def/crs/EPSG/0/6991http://www.opengis.net/def/crs/EPSG/0/6996http://www.opengis.net/def/crs/EPSG/0/6997http://www.opengis.net/def/crs/EPSG/0/7400http://www.opengis.net/def/crs/EPSG/0/7401http://www.opengis.net/def/crs/EPSG/0/7402http://www.opengis.net/def/crs/EPSG/0/7403http://www.opengis.net/def/crs/EPSG/0/7404http://www.opengis.net/def/crs/EPSG/0/7405http://www.opengis.net/def/crs/EPSG/0/7406http://www.opengis.net/def/crs/EPSG/0/7407http://www.opengis.net/def/crs/EPSG/0/7408http://www.opengis.net/def/crs/EPSG/0/7409http://www.opengis.net/def/crs/EPSG/0/7410http://www.opengis.net/def/crs/EPSG/0/7411http://www.opengis.net/def/crs/EPSG/0/7412http://www.opengis.net/def/crs/EPSG/0/7413http://www.opengis.net/def/crs/EPSG/0/7414http://www.opengis.net/def/crs/EPSG/0/7415http://www.opengis.net/def/crs/EPSG/0/7416http://www.opengis.net/def/crs/EPSG/0/7417http://www.opengis.net/def/crs/EPSG/0/7418http://www.opengis.net/def/crs/EPSG/0/7419http://www.opengis.net/def/crs/EPSG/0/7420http://www.opengis.net/def/crs/EPSG/0/7421http://www.opengis.net/def/crs/EPSG/0/7422http://www.opengis.net/def/crs/EPSG/0/7423http://www.opengis.net/def/crs/EPSG/0/20004http://www.opengis.net/def/crs/EPSG/0/20005http://www.opengis.net/def/crs/EPSG/0/20006http://www.opengis.net/def/crs/EPSG/0/20007http://www.opengis.net/def/crs/EPSG/0/20008http://www.opengis.net/def/crs/EPSG/0/20009http://www.opengis.net/def/crs/EPSG/0/20010http://www.opengis.net/def/crs/EPSG/0/20011http://www.opengis.net/def/crs/EPSG/0/20012http://www.opengis.net/def/crs/EPSG/0/20013http://www.opengis.net/def/crs/EPSG/0/20014http://www.opengis.net/def/crs/EPSG/0/20015http://www.opengis.net/def/crs/EPSG/0/20016http://www.opengis.net/def/crs/EPSG/0/20017http://www.opengis.net/def/crs/EPSG/0/20018http://www.opengis.net/def/crs/EPSG/0/20019http://www.opengis.net/def/crs/EPSG/0/20020http://www.opengis.net/def/crs/EPSG/0/20021http://www.opengis.net/def/crs/EPSG/0/20022http://www.opengis.net/def/crs/EPSG/0/20023http://www.opengis.net/def/crs/EPSG/0/20024http://www.opengis.net/def/crs/EPSG/0/20025http://www.opengis.net/def/crs/EPSG/0/20026http://www.opengis.net/def/crs/EPSG/0/20027http://www.opengis.net/def/crs/EPSG/0/20028http://www.opengis.net/def/crs/EPSG/0/20029http://www.opengis.net/def/crs/EPSG/0/20030http://www.opengis.net/def/crs/EPSG/0/20031http://www.opengis.net/def/crs/EPSG/0/20032http://www.opengis.net/def/crs/EPSG/0/20064http://www.opengis.net/def/crs/EPSG/0/20065http://www.opengis.net/def/crs/EPSG/0/20066http://www.opengis.net/def/crs/EPSG/0/20067http://www.opengis.net/def/crs/EPSG/0/20068http://www.opengis.net/def/crs/EPSG/0/20069http://www.opengis.net/def/crs/EPSG/0/20070http://www.opengis.net/def/crs/EPSG/0/20071http://www.opengis.net/def/crs/EPSG/0/20072http://www.opengis.net/def/crs/EPSG/0/20073http://www.opengis.net/def/crs/EPSG/0/20074http://www.opengis.net/def/crs/EPSG/0/20075http://www.opengis.net/def/crs/EPSG/0/20076http://www.opengis.net/def/crs/EPSG/0/20077http://www.opengis.net/def/crs/EPSG/0/20078http://www.opengis.net/def/crs/EPSG/0/20079http://www.opengis.net/def/crs/EPSG/0/20080http://www.opengis.net/def/crs/EPSG/0/20081http://www.opengis.net/def/crs/EPSG/0/20082http://www.opengis.net/def/crs/EPSG/0/20083http://www.opengis.net/def/crs/EPSG/0/20084http://www.opengis.net/def/crs/EPSG/0/20085http://www.opengis.net/def/crs/EPSG/0/20086http://www.opengis.net/def/crs/EPSG/0/20087http://www.opengis.net/def/crs/EPSG/0/20088http://www.opengis.net/def/crs/EPSG/0/20089http://www.opengis.net/def/crs/EPSG/0/20090http://www.opengis.net/def/crs/EPSG/0/20091http://www.opengis.net/def/crs/EPSG/0/20092http://www.opengis.net/def/crs/EPSG/0/20135http://www.opengis.net/def/crs/EPSG/0/20136http://www.opengis.net/def/crs/EPSG/0/20137http://www.opengis.net/def/crs/EPSG/0/20138http://www.opengis.net/def/crs/EPSG/0/20248http://www.opengis.net/def/crs/EPSG/0/20249http://www.opengis.net/def/crs/EPSG/0/20250http://www.opengis.net/def/crs/EPSG/0/20251http://www.opengis.net/def/crs/EPSG/0/20252http://www.opengis.net/def/crs/EPSG/0/20253http://www.opengis.net/def/crs/EPSG/0/20254http://www.opengis.net/def/crs/EPSG/0/20255http://www.opengis.net/def/crs/EPSG/0/20256http://www.opengis.net/def/crs/EPSG/0/20257http://www.opengis.net/def/crs/EPSG/0/20258http://www.opengis.net/def/crs/EPSG/0/20348http://www.opengis.net/def/crs/EPSG/0/20349http://www.opengis.net/def/crs/EPSG/0/20350http://www.opengis.net/def/crs/EPSG/0/20351http://www.opengis.net/def/crs/EPSG/0/20352http://www.opengis.net/def/crs/EPSG/0/20353http://www.opengis.net/def/crs/EPSG/0/20354http://www.opengis.net/def/crs/EPSG/0/20355http://www.opengis.net/def/crs/EPSG/0/20356http://www.opengis.net/def/crs/EPSG/0/20357http://www.opengis.net/def/crs/EPSG/0/20358http://www.opengis.net/def/crs/EPSG/0/20436http://www.opengis.net/def/crs/EPSG/0/20437http://www.opengis.net/def/crs/EPSG/0/20438http://www.opengis.net/def/crs/EPSG/0/20439http://www.opengis.net/def/crs/EPSG/0/20440http://www.opengis.net/def/crs/EPSG/0/20499http://www.opengis.net/def/crs/EPSG/0/20538http://www.opengis.net/def/crs/EPSG/0/20539http://www.opengis.net/def/crs/EPSG/0/20790http://www.opengis.net/def/crs/EPSG/0/20791http://www.opengis.net/def/crs/EPSG/0/20822http://www.opengis.net/def/crs/EPSG/0/20823http://www.opengis.net/def/crs/EPSG/0/20824http://www.opengis.net/def/crs/EPSG/0/20934http://www.opengis.net/def/crs/EPSG/0/20935http://www.opengis.net/def/crs/EPSG/0/20936http://www.opengis.net/def/crs/EPSG/0/21035http://www.opengis.net/def/crs/EPSG/0/21036http://www.opengis.net/def/crs/EPSG/0/21037http://www.opengis.net/def/crs/EPSG/0/21095http://www.opengis.net/def/crs/EPSG/0/21096http://www.opengis.net/def/crs/EPSG/0/21097http://www.opengis.net/def/crs/EPSG/0/21100http://www.opengis.net/def/crs/EPSG/0/21148http://www.opengis.net/def/crs/EPSG/0/21149http://www.opengis.net/def/crs/EPSG/0/21150http://www.opengis.net/def/crs/EPSG/0/21291http://www.opengis.net/def/crs/EPSG/0/21292http://www.opengis.net/def/crs/EPSG/0/21413http://www.opengis.net/def/crs/EPSG/0/21414http://www.opengis.net/def/crs/EPSG/0/21415http://www.opengis.net/def/crs/EPSG/0/21416http://www.opengis.net/def/crs/EPSG/0/21417http://www.opengis.net/def/crs/EPSG/0/21418http://www.opengis.net/def/crs/EPSG/0/21419http://www.opengis.net/def/crs/EPSG/0/21420http://www.opengis.net/def/crs/EPSG/0/21421http://www.opengis.net/def/crs/EPSG/0/21422http://www.opengis.net/def/crs/EPSG/0/21423http://www.opengis.net/def/crs/EPSG/0/21453http://www.opengis.net/def/crs/EPSG/0/21454http://www.opengis.net/def/crs/EPSG/0/21455http://www.opengis.net/def/crs/EPSG/0/21456http://www.opengis.net/def/crs/EPSG/0/21457http://www.opengis.net/def/crs/EPSG/0/21458http://www.opengis.net/def/crs/EPSG/0/21459http://www.opengis.net/def/crs/EPSG/0/21460http://www.opengis.net/def/crs/EPSG/0/21461http://www.opengis.net/def/crs/EPSG/0/21462http://www.opengis.net/def/crs/EPSG/0/21463http://www.opengis.net/def/crs/EPSG/0/21473http://www.opengis.net/def/crs/EPSG/0/21474http://www.opengis.net/def/crs/EPSG/0/21475http://www.opengis.net/def/crs/EPSG/0/21476http://www.opengis.net/def/crs/EPSG/0/21477http://www.opengis.net/def/crs/EPSG/0/21478http://www.opengis.net/def/crs/EPSG/0/21479http://www.opengis.net/def/crs/EPSG/0/21480http://www.opengis.net/def/crs/EPSG/0/21481http://www.opengis.net/def/crs/EPSG/0/21482http://www.opengis.net/def/crs/EPSG/0/21483http://www.opengis.net/def/crs/EPSG/0/21500http://www.opengis.net/def/crs/EPSG/0/21780http://www.opengis.net/def/crs/EPSG/0/21781http://www.opengis.net/def/crs/EPSG/0/21782http://www.opengis.net/def/crs/EPSG/0/21817http://www.opengis.net/def/crs/EPSG/0/21818http://www.opengis.net/def/crs/EPSG/0/21891http://www.opengis.net/def/crs/EPSG/0/21892http://www.opengis.net/def/crs/EPSG/0/21893http://www.opengis.net/def/crs/EPSG/0/21894http://www.opengis.net/def/crs/EPSG/0/21896http://www.opengis.net/def/crs/EPSG/0/21897http://www.opengis.net/def/crs/EPSG/0/21898http://www.opengis.net/def/crs/EPSG/0/21899http://www.opengis.net/def/crs/EPSG/0/22032http://www.opengis.net/def/crs/EPSG/0/22033http://www.opengis.net/def/crs/EPSG/0/22091http://www.opengis.net/def/crs/EPSG/0/22092http://www.opengis.net/def/crs/EPSG/0/22171http://www.opengis.net/def/crs/EPSG/0/22172http://www.opengis.net/def/crs/EPSG/0/22173http://www.opengis.net/def/crs/EPSG/0/22174http://www.opengis.net/def/crs/EPSG/0/22175http://www.opengis.net/def/crs/EPSG/0/22176http://www.opengis.net/def/crs/EPSG/0/22177http://www.opengis.net/def/crs/EPSG/0/22181http://www.opengis.net/def/crs/EPSG/0/22182http://www.opengis.net/def/crs/EPSG/0/22183http://www.opengis.net/def/crs/EPSG/0/22184http://www.opengis.net/def/crs/EPSG/0/22185http://www.opengis.net/def/crs/EPSG/0/22186http://www.opengis.net/def/crs/EPSG/0/22187http://www.opengis.net/def/crs/EPSG/0/22191http://www.opengis.net/def/crs/EPSG/0/22192http://www.opengis.net/def/crs/EPSG/0/22193http://www.opengis.net/def/crs/EPSG/0/22194http://www.opengis.net/def/crs/EPSG/0/22195http://www.opengis.net/def/crs/EPSG/0/22196http://www.opengis.net/def/crs/EPSG/0/22197http://www.opengis.net/def/crs/EPSG/0/22234http://www.opengis.net/def/crs/EPSG/0/22235http://www.opengis.net/def/crs/EPSG/0/22236http://www.opengis.net/def/crs/EPSG/0/22275http://www.opengis.net/def/crs/EPSG/0/22277http://www.opengis.net/def/crs/EPSG/0/22279http://www.opengis.net/def/crs/EPSG/0/22281http://www.opengis.net/def/crs/EPSG/0/22283http://www.opengis.net/def/crs/EPSG/0/22285http://www.opengis.net/def/crs/EPSG/0/22287http://www.opengis.net/def/crs/EPSG/0/22289http://www.opengis.net/def/crs/EPSG/0/22291http://www.opengis.net/def/crs/EPSG/0/22293http://www.opengis.net/def/crs/EPSG/0/22300http://www.opengis.net/def/crs/EPSG/0/22332http://www.opengis.net/def/crs/EPSG/0/22391http://www.opengis.net/def/crs/EPSG/0/22392http://www.opengis.net/def/crs/EPSG/0/22521http://www.opengis.net/def/crs/EPSG/0/22522http://www.opengis.net/def/crs/EPSG/0/22523http://www.opengis.net/def/crs/EPSG/0/22524http://www.opengis.net/def/crs/EPSG/0/22525http://www.opengis.net/def/crs/EPSG/0/22700http://www.opengis.net/def/crs/EPSG/0/22770http://www.opengis.net/def/crs/EPSG/0/22780http://www.opengis.net/def/crs/EPSG/0/22832http://www.opengis.net/def/crs/EPSG/0/22991http://www.opengis.net/def/crs/EPSG/0/22992http://www.opengis.net/def/crs/EPSG/0/22993http://www.opengis.net/def/crs/EPSG/0/22994http://www.opengis.net/def/crs/EPSG/0/23028http://www.opengis.net/def/crs/EPSG/0/23029http://www.opengis.net/def/crs/EPSG/0/23030http://www.opengis.net/def/crs/EPSG/0/23031http://www.opengis.net/def/crs/EPSG/0/23032http://www.opengis.net/def/crs/EPSG/0/23033http://www.opengis.net/def/crs/EPSG/0/23034http://www.opengis.net/def/crs/EPSG/0/23035http://www.opengis.net/def/crs/EPSG/0/23036http://www.opengis.net/def/crs/EPSG/0/23037http://www.opengis.net/def/crs/EPSG/0/23038http://www.opengis.net/def/crs/EPSG/0/23090http://www.opengis.net/def/crs/EPSG/0/23095http://www.opengis.net/def/crs/EPSG/0/23239http://www.opengis.net/def/crs/EPSG/0/23240http://www.opengis.net/def/crs/EPSG/0/23433http://www.opengis.net/def/crs/EPSG/0/23700http://www.opengis.net/def/crs/EPSG/0/23830http://www.opengis.net/def/crs/EPSG/0/23831http://www.opengis.net/def/crs/EPSG/0/23832http://www.opengis.net/def/crs/EPSG/0/23833http://www.opengis.net/def/crs/EPSG/0/23834http://www.opengis.net/def/crs/EPSG/0/23835http://www.opengis.net/def/crs/EPSG/0/23836http://www.opengis.net/def/crs/EPSG/0/23837http://www.opengis.net/def/crs/EPSG/0/23838http://www.opengis.net/def/crs/EPSG/0/23839http://www.opengis.net/def/crs/EPSG/0/23840http://www.opengis.net/def/crs/EPSG/0/23841http://www.opengis.net/def/crs/EPSG/0/23842http://www.opengis.net/def/crs/EPSG/0/23843http://www.opengis.net/def/crs/EPSG/0/23844http://www.opengis.net/def/crs/EPSG/0/23845http://www.opengis.net/def/crs/EPSG/0/23846http://www.opengis.net/def/crs/EPSG/0/23847http://www.opengis.net/def/crs/EPSG/0/23848http://www.opengis.net/def/crs/EPSG/0/23849http://www.opengis.net/def/crs/EPSG/0/23850http://www.opengis.net/def/crs/EPSG/0/23851http://www.opengis.net/def/crs/EPSG/0/23852http://www.opengis.net/def/crs/EPSG/0/23853http://www.opengis.net/def/crs/EPSG/0/23866http://www.opengis.net/def/crs/EPSG/0/23867http://www.opengis.net/def/crs/EPSG/0/23868http://www.opengis.net/def/crs/EPSG/0/23869http://www.opengis.net/def/crs/EPSG/0/23870http://www.opengis.net/def/crs/EPSG/0/23871http://www.opengis.net/def/crs/EPSG/0/23872http://www.opengis.net/def/crs/EPSG/0/23877http://www.opengis.net/def/crs/EPSG/0/23878http://www.opengis.net/def/crs/EPSG/0/23879http://www.opengis.net/def/crs/EPSG/0/23880http://www.opengis.net/def/crs/EPSG/0/23881http://www.opengis.net/def/crs/EPSG/0/23882http://www.opengis.net/def/crs/EPSG/0/23883http://www.opengis.net/def/crs/EPSG/0/23884http://www.opengis.net/def/crs/EPSG/0/23886http://www.opengis.net/def/crs/EPSG/0/23887http://www.opengis.net/def/crs/EPSG/0/23888http://www.opengis.net/def/crs/EPSG/0/23889http://www.opengis.net/def/crs/EPSG/0/23890http://www.opengis.net/def/crs/EPSG/0/23891http://www.opengis.net/def/crs/EPSG/0/23892http://www.opengis.net/def/crs/EPSG/0/23893http://www.opengis.net/def/crs/EPSG/0/23894http://www.opengis.net/def/crs/EPSG/0/23946http://www.opengis.net/def/crs/EPSG/0/23947http://www.opengis.net/def/crs/EPSG/0/23948http://www.opengis.net/def/crs/EPSG/0/24047http://www.opengis.net/def/crs/EPSG/0/24048http://www.opengis.net/def/crs/EPSG/0/24100http://www.opengis.net/def/crs/EPSG/0/24200http://www.opengis.net/def/crs/EPSG/0/24305http://www.opengis.net/def/crs/EPSG/0/24306http://www.opengis.net/def/crs/EPSG/0/24311http://www.opengis.net/def/crs/EPSG/0/24312http://www.opengis.net/def/crs/EPSG/0/24313http://www.opengis.net/def/crs/EPSG/0/24342http://www.opengis.net/def/crs/EPSG/0/24343http://www.opengis.net/def/crs/EPSG/0/24344http://www.opengis.net/def/crs/EPSG/0/24345http://www.opengis.net/def/crs/EPSG/0/24346http://www.opengis.net/def/crs/EPSG/0/24347http://www.opengis.net/def/crs/EPSG/0/24370http://www.opengis.net/def/crs/EPSG/0/24371http://www.opengis.net/def/crs/EPSG/0/24372http://www.opengis.net/def/crs/EPSG/0/24373http://www.opengis.net/def/crs/EPSG/0/24374http://www.opengis.net/def/crs/EPSG/0/24375http://www.opengis.net/def/crs/EPSG/0/24376http://www.opengis.net/def/crs/EPSG/0/24377http://www.opengis.net/def/crs/EPSG/0/24378http://www.opengis.net/def/crs/EPSG/0/24379http://www.opengis.net/def/crs/EPSG/0/24380http://www.opengis.net/def/crs/EPSG/0/24381http://www.opengis.net/def/crs/EPSG/0/24382http://www.opengis.net/def/crs/EPSG/0/24383http://www.opengis.net/def/crs/EPSG/0/24500http://www.opengis.net/def/crs/EPSG/0/24547http://www.opengis.net/def/crs/EPSG/0/24548http://www.opengis.net/def/crs/EPSG/0/24571http://www.opengis.net/def/crs/EPSG/0/24600http://www.opengis.net/def/crs/EPSG/0/24718http://www.opengis.net/def/crs/EPSG/0/24719http://www.opengis.net/def/crs/EPSG/0/24720http://www.opengis.net/def/crs/EPSG/0/24817http://www.opengis.net/def/crs/EPSG/0/24818http://www.opengis.net/def/crs/EPSG/0/24819http://www.opengis.net/def/crs/EPSG/0/24820http://www.opengis.net/def/crs/EPSG/0/24821http://www.opengis.net/def/crs/EPSG/0/24877http://www.opengis.net/def/crs/EPSG/0/24878http://www.opengis.net/def/crs/EPSG/0/24879http://www.opengis.net/def/crs/EPSG/0/24880http://www.opengis.net/def/crs/EPSG/0/24881http://www.opengis.net/def/crs/EPSG/0/24882http://www.opengis.net/def/crs/EPSG/0/24891http://www.opengis.net/def/crs/EPSG/0/24892http://www.opengis.net/def/crs/EPSG/0/24893http://www.opengis.net/def/crs/EPSG/0/25000http://www.opengis.net/def/crs/EPSG/0/25231http://www.opengis.net/def/crs/EPSG/0/25391http://www.opengis.net/def/crs/EPSG/0/25392http://www.opengis.net/def/crs/EPSG/0/25393http://www.opengis.net/def/crs/EPSG/0/25394http://www.opengis.net/def/crs/EPSG/0/25395http://www.opengis.net/def/crs/EPSG/0/25700http://www.opengis.net/def/crs/EPSG/0/25828http://www.opengis.net/def/crs/EPSG/0/25829http://www.opengis.net/def/crs/EPSG/0/25830http://www.opengis.net/def/crs/EPSG/0/25831http://www.opengis.net/def/crs/EPSG/0/25832http://www.opengis.net/def/crs/EPSG/0/25833http://www.opengis.net/def/crs/EPSG/0/25834http://www.opengis.net/def/crs/EPSG/0/25835http://www.opengis.net/def/crs/EPSG/0/25836http://www.opengis.net/def/crs/EPSG/0/25837http://www.opengis.net/def/crs/EPSG/0/25838http://www.opengis.net/def/crs/EPSG/0/25884http://www.opengis.net/def/crs/EPSG/0/25932http://www.opengis.net/def/crs/EPSG/0/26191http://www.opengis.net/def/crs/EPSG/0/26192http://www.opengis.net/def/crs/EPSG/0/26193http://www.opengis.net/def/crs/EPSG/0/26194http://www.opengis.net/def/crs/EPSG/0/26195http://www.opengis.net/def/crs/EPSG/0/26237http://www.opengis.net/def/crs/EPSG/0/26331http://www.opengis.net/def/crs/EPSG/0/26332http://www.opengis.net/def/crs/EPSG/0/26391http://www.opengis.net/def/crs/EPSG/0/26392http://www.opengis.net/def/crs/EPSG/0/26393http://www.opengis.net/def/crs/EPSG/0/26432http://www.opengis.net/def/crs/EPSG/0/26591http://www.opengis.net/def/crs/EPSG/0/26592http://www.opengis.net/def/crs/EPSG/0/26632http://www.opengis.net/def/crs/EPSG/0/26692http://www.opengis.net/def/crs/EPSG/0/26701http://www.opengis.net/def/crs/EPSG/0/26702http://www.opengis.net/def/crs/EPSG/0/26703http://www.opengis.net/def/crs/EPSG/0/26704http://www.opengis.net/def/crs/EPSG/0/26705http://www.opengis.net/def/crs/EPSG/0/26706http://www.opengis.net/def/crs/EPSG/0/26707http://www.opengis.net/def/crs/EPSG/0/26708http://www.opengis.net/def/crs/EPSG/0/26709http://www.opengis.net/def/crs/EPSG/0/26710http://www.opengis.net/def/crs/EPSG/0/26711http://www.opengis.net/def/crs/EPSG/0/26712http://www.opengis.net/def/crs/EPSG/0/26713http://www.opengis.net/def/crs/EPSG/0/26714http://www.opengis.net/def/crs/EPSG/0/26715http://www.opengis.net/def/crs/EPSG/0/26716http://www.opengis.net/def/crs/EPSG/0/26717http://www.opengis.net/def/crs/EPSG/0/26718http://www.opengis.net/def/crs/EPSG/0/26719http://www.opengis.net/def/crs/EPSG/0/26720http://www.opengis.net/def/crs/EPSG/0/26721http://www.opengis.net/def/crs/EPSG/0/26722http://www.opengis.net/def/crs/EPSG/0/26729http://www.opengis.net/def/crs/EPSG/0/26730http://www.opengis.net/def/crs/EPSG/0/26731http://www.opengis.net/def/crs/EPSG/0/26732http://www.opengis.net/def/crs/EPSG/0/26733http://www.opengis.net/def/crs/EPSG/0/26734http://www.opengis.net/def/crs/EPSG/0/26735http://www.opengis.net/def/crs/EPSG/0/26736http://www.opengis.net/def/crs/EPSG/0/26737http://www.opengis.net/def/crs/EPSG/0/26738http://www.opengis.net/def/crs/EPSG/0/26739http://www.opengis.net/def/crs/EPSG/0/26740http://www.opengis.net/def/crs/EPSG/0/26741http://www.opengis.net/def/crs/EPSG/0/26742http://www.opengis.net/def/crs/EPSG/0/26743http://www.opengis.net/def/crs/EPSG/0/26744http://www.opengis.net/def/crs/EPSG/0/26745http://www.opengis.net/def/crs/EPSG/0/26746http://www.opengis.net/def/crs/EPSG/0/26747http://www.opengis.net/def/crs/EPSG/0/26748http://www.opengis.net/def/crs/EPSG/0/26749http://www.opengis.net/def/crs/EPSG/0/26750http://www.opengis.net/def/crs/EPSG/0/26751http://www.opengis.net/def/crs/EPSG/0/26752http://www.opengis.net/def/crs/EPSG/0/26753http://www.opengis.net/def/crs/EPSG/0/26754http://www.opengis.net/def/crs/EPSG/0/26755http://www.opengis.net/def/crs/EPSG/0/26756http://www.opengis.net/def/crs/EPSG/0/26757http://www.opengis.net/def/crs/EPSG/0/26758http://www.opengis.net/def/crs/EPSG/0/26759http://www.opengis.net/def/crs/EPSG/0/26760http://www.opengis.net/def/crs/EPSG/0/26766http://www.opengis.net/def/crs/EPSG/0/26767http://www.opengis.net/def/crs/EPSG/0/26768http://www.opengis.net/def/crs/EPSG/0/26769http://www.opengis.net/def/crs/EPSG/0/26770http://www.opengis.net/def/crs/EPSG/0/26771http://www.opengis.net/def/crs/EPSG/0/26772http://www.opengis.net/def/crs/EPSG/0/26773http://www.opengis.net/def/crs/EPSG/0/26774http://www.opengis.net/def/crs/EPSG/0/26775http://www.opengis.net/def/crs/EPSG/0/26776http://www.opengis.net/def/crs/EPSG/0/26777http://www.opengis.net/def/crs/EPSG/0/26778http://www.opengis.net/def/crs/EPSG/0/26779http://www.opengis.net/def/crs/EPSG/0/26780http://www.opengis.net/def/crs/EPSG/0/26781http://www.opengis.net/def/crs/EPSG/0/26782http://www.opengis.net/def/crs/EPSG/0/26783http://www.opengis.net/def/crs/EPSG/0/26784http://www.opengis.net/def/crs/EPSG/0/26785http://www.opengis.net/def/crs/EPSG/0/26786http://www.opengis.net/def/crs/EPSG/0/26787http://www.opengis.net/def/crs/EPSG/0/26791http://www.opengis.net/def/crs/EPSG/0/26792http://www.opengis.net/def/crs/EPSG/0/26793http://www.opengis.net/def/crs/EPSG/0/26794http://www.opengis.net/def/crs/EPSG/0/26795http://www.opengis.net/def/crs/EPSG/0/26796http://www.opengis.net/def/crs/EPSG/0/26797http://www.opengis.net/def/crs/EPSG/0/26798http://www.opengis.net/def/crs/EPSG/0/26799http://www.opengis.net/def/crs/EPSG/0/26801http://www.opengis.net/def/crs/EPSG/0/26802http://www.opengis.net/def/crs/EPSG/0/26803http://www.opengis.net/def/crs/EPSG/0/26811http://www.opengis.net/def/crs/EPSG/0/26812http://www.opengis.net/def/crs/EPSG/0/26813http://www.opengis.net/def/crs/EPSG/0/26814http://www.opengis.net/def/crs/EPSG/0/26815http://www.opengis.net/def/crs/EPSG/0/26819http://www.opengis.net/def/crs/EPSG/0/26820http://www.opengis.net/def/crs/EPSG/0/26821http://www.opengis.net/def/crs/EPSG/0/26822http://www.opengis.net/def/crs/EPSG/0/26823http://www.opengis.net/def/crs/EPSG/0/26824http://www.opengis.net/def/crs/EPSG/0/26825http://www.opengis.net/def/crs/EPSG/0/26826http://www.opengis.net/def/crs/EPSG/0/26830http://www.opengis.net/def/crs/EPSG/0/26831http://www.opengis.net/def/crs/EPSG/0/26832http://www.opengis.net/def/crs/EPSG/0/26833http://www.opengis.net/def/crs/EPSG/0/26834http://www.opengis.net/def/crs/EPSG/0/26835http://www.opengis.net/def/crs/EPSG/0/26836http://www.opengis.net/def/crs/EPSG/0/26837http://www.opengis.net/def/crs/EPSG/0/26841http://www.opengis.net/def/crs/EPSG/0/26842http://www.opengis.net/def/crs/EPSG/0/26843http://www.opengis.net/def/crs/EPSG/0/26844http://www.opengis.net/def/crs/EPSG/0/26845http://www.opengis.net/def/crs/EPSG/0/26846http://www.opengis.net/def/crs/EPSG/0/26847http://www.opengis.net/def/crs/EPSG/0/26848http://www.opengis.net/def/crs/EPSG/0/26849http://www.opengis.net/def/crs/EPSG/0/26850http://www.opengis.net/def/crs/EPSG/0/26851http://www.opengis.net/def/crs/EPSG/0/26852http://www.opengis.net/def/crs/EPSG/0/26853http://www.opengis.net/def/crs/EPSG/0/26854http://www.opengis.net/def/crs/EPSG/0/26855http://www.opengis.net/def/crs/EPSG/0/26856http://www.opengis.net/def/crs/EPSG/0/26857http://www.opengis.net/def/crs/EPSG/0/26858http://www.opengis.net/def/crs/EPSG/0/26859http://www.opengis.net/def/crs/EPSG/0/26860http://www.opengis.net/def/crs/EPSG/0/26861http://www.opengis.net/def/crs/EPSG/0/26862http://www.opengis.net/def/crs/EPSG/0/26863http://www.opengis.net/def/crs/EPSG/0/26864http://www.opengis.net/def/crs/EPSG/0/26865http://www.opengis.net/def/crs/EPSG/0/26866http://www.opengis.net/def/crs/EPSG/0/26867http://www.opengis.net/def/crs/EPSG/0/26868http://www.opengis.net/def/crs/EPSG/0/26869http://www.opengis.net/def/crs/EPSG/0/26870http://www.opengis.net/def/crs/EPSG/0/26891http://www.opengis.net/def/crs/EPSG/0/26892http://www.opengis.net/def/crs/EPSG/0/26893http://www.opengis.net/def/crs/EPSG/0/26894http://www.opengis.net/def/crs/EPSG/0/26895http://www.opengis.net/def/crs/EPSG/0/26896http://www.opengis.net/def/crs/EPSG/0/26897http://www.opengis.net/def/crs/EPSG/0/26898http://www.opengis.net/def/crs/EPSG/0/26899http://www.opengis.net/def/crs/EPSG/0/26901http://www.opengis.net/def/crs/EPSG/0/26902http://www.opengis.net/def/crs/EPSG/0/26903http://www.opengis.net/def/crs/EPSG/0/26904http://www.opengis.net/def/crs/EPSG/0/26905http://www.opengis.net/def/crs/EPSG/0/26906http://www.opengis.net/def/crs/EPSG/0/26907http://www.opengis.net/def/crs/EPSG/0/26908http://www.opengis.net/def/crs/EPSG/0/26909http://www.opengis.net/def/crs/EPSG/0/26910http://www.opengis.net/def/crs/EPSG/0/26911http://www.opengis.net/def/crs/EPSG/0/26912http://www.opengis.net/def/crs/EPSG/0/26913http://www.opengis.net/def/crs/EPSG/0/26914http://www.opengis.net/def/crs/EPSG/0/26915http://www.opengis.net/def/crs/EPSG/0/26916http://www.opengis.net/def/crs/EPSG/0/26917http://www.opengis.net/def/crs/EPSG/0/26918http://www.opengis.net/def/crs/EPSG/0/26919http://www.opengis.net/def/crs/EPSG/0/26920http://www.opengis.net/def/crs/EPSG/0/26921http://www.opengis.net/def/crs/EPSG/0/26922http://www.opengis.net/def/crs/EPSG/0/26923http://www.opengis.net/def/crs/EPSG/0/26929http://www.opengis.net/def/crs/EPSG/0/26930http://www.opengis.net/def/crs/EPSG/0/26931http://www.opengis.net/def/crs/EPSG/0/26932http://www.opengis.net/def/crs/EPSG/0/26933http://www.opengis.net/def/crs/EPSG/0/26934http://www.opengis.net/def/crs/EPSG/0/26935http://www.opengis.net/def/crs/EPSG/0/26936http://www.opengis.net/def/crs/EPSG/0/26937http://www.opengis.net/def/crs/EPSG/0/26938http://www.opengis.net/def/crs/EPSG/0/26939http://www.opengis.net/def/crs/EPSG/0/26940http://www.opengis.net/def/crs/EPSG/0/26941http://www.opengis.net/def/crs/EPSG/0/26942http://www.opengis.net/def/crs/EPSG/0/26943http://www.opengis.net/def/crs/EPSG/0/26944http://www.opengis.net/def/crs/EPSG/0/26945http://www.opengis.net/def/crs/EPSG/0/26946http://www.opengis.net/def/crs/EPSG/0/26948http://www.opengis.net/def/crs/EPSG/0/26949http://www.opengis.net/def/crs/EPSG/0/26950http://www.opengis.net/def/crs/EPSG/0/26951http://www.opengis.net/def/crs/EPSG/0/26952http://www.opengis.net/def/crs/EPSG/0/26953http://www.opengis.net/def/crs/EPSG/0/26954http://www.opengis.net/def/crs/EPSG/0/26955http://www.opengis.net/def/crs/EPSG/0/26956http://www.opengis.net/def/crs/EPSG/0/26957http://www.opengis.net/def/crs/EPSG/0/26958http://www.opengis.net/def/crs/EPSG/0/26959http://www.opengis.net/def/crs/EPSG/0/26960http://www.opengis.net/def/crs/EPSG/0/26961http://www.opengis.net/def/crs/EPSG/0/26962http://www.opengis.net/def/crs/EPSG/0/26963http://www.opengis.net/def/crs/EPSG/0/26964http://www.opengis.net/def/crs/EPSG/0/26965http://www.opengis.net/def/crs/EPSG/0/26966http://www.opengis.net/def/crs/EPSG/0/26967http://www.opengis.net/def/crs/EPSG/0/26968http://www.opengis.net/def/crs/EPSG/0/26969http://www.opengis.net/def/crs/EPSG/0/26970http://www.opengis.net/def/crs/EPSG/0/26971http://www.opengis.net/def/crs/EPSG/0/26972http://www.opengis.net/def/crs/EPSG/0/26973http://www.opengis.net/def/crs/EPSG/0/26974http://www.opengis.net/def/crs/EPSG/0/26975http://www.opengis.net/def/crs/EPSG/0/26976http://www.opengis.net/def/crs/EPSG/0/26977http://www.opengis.net/def/crs/EPSG/0/26978http://www.opengis.net/def/crs/EPSG/0/26979http://www.opengis.net/def/crs/EPSG/0/26980http://www.opengis.net/def/crs/EPSG/0/26981http://www.opengis.net/def/crs/EPSG/0/26982http://www.opengis.net/def/crs/EPSG/0/26983http://www.opengis.net/def/crs/EPSG/0/26984http://www.opengis.net/def/crs/EPSG/0/26985http://www.opengis.net/def/crs/EPSG/0/26986http://www.opengis.net/def/crs/EPSG/0/26987http://www.opengis.net/def/crs/EPSG/0/26988http://www.opengis.net/def/crs/EPSG/0/26989http://www.opengis.net/def/crs/EPSG/0/26990http://www.opengis.net/def/crs/EPSG/0/26991http://www.opengis.net/def/crs/EPSG/0/26992http://www.opengis.net/def/crs/EPSG/0/26993http://www.opengis.net/def/crs/EPSG/0/26994http://www.opengis.net/def/crs/EPSG/0/26995http://www.opengis.net/def/crs/EPSG/0/26996http://www.opengis.net/def/crs/EPSG/0/26997http://www.opengis.net/def/crs/EPSG/0/26998http://www.opengis.net/def/crs/EPSG/0/27037http://www.opengis.net/def/crs/EPSG/0/27038http://www.opengis.net/def/crs/EPSG/0/27039http://www.opengis.net/def/crs/EPSG/0/27040http://www.opengis.net/def/crs/EPSG/0/27120http://www.opengis.net/def/crs/EPSG/0/27200http://www.opengis.net/def/crs/EPSG/0/27205http://www.opengis.net/def/crs/EPSG/0/27206http://www.opengis.net/def/crs/EPSG/0/27207http://www.opengis.net/def/crs/EPSG/0/27208http://www.opengis.net/def/crs/EPSG/0/27209http://www.opengis.net/def/crs/EPSG/0/27210http://www.opengis.net/def/crs/EPSG/0/27211http://www.opengis.net/def/crs/EPSG/0/27212http://www.opengis.net/def/crs/EPSG/0/27213http://www.opengis.net/def/crs/EPSG/0/27214http://www.opengis.net/def/crs/EPSG/0/27215http://www.opengis.net/def/crs/EPSG/0/27216http://www.opengis.net/def/crs/EPSG/0/27217http://www.opengis.net/def/crs/EPSG/0/27218http://www.opengis.net/def/crs/EPSG/0/27219http://www.opengis.net/def/crs/EPSG/0/27220http://www.opengis.net/def/crs/EPSG/0/27221http://www.opengis.net/def/crs/EPSG/0/27222http://www.opengis.net/def/crs/EPSG/0/27223http://www.opengis.net/def/crs/EPSG/0/27224http://www.opengis.net/def/crs/EPSG/0/27225http://www.opengis.net/def/crs/EPSG/0/27226http://www.opengis.net/def/crs/EPSG/0/27227http://www.opengis.net/def/crs/EPSG/0/27228http://www.opengis.net/def/crs/EPSG/0/27229http://www.opengis.net/def/crs/EPSG/0/27230http://www.opengis.net/def/crs/EPSG/0/27231http://www.opengis.net/def/crs/EPSG/0/27232http://www.opengis.net/def/crs/EPSG/0/27258http://www.opengis.net/def/crs/EPSG/0/27259http://www.opengis.net/def/crs/EPSG/0/27260http://www.opengis.net/def/crs/EPSG/0/27291http://www.opengis.net/def/crs/EPSG/0/27292http://www.opengis.net/def/crs/EPSG/0/27391http://www.opengis.net/def/crs/EPSG/0/27392http://www.opengis.net/def/crs/EPSG/0/27393http://www.opengis.net/def/crs/EPSG/0/27394http://www.opengis.net/def/crs/EPSG/0/27395http://www.opengis.net/def/crs/EPSG/0/27396http://www.opengis.net/def/crs/EPSG/0/27397http://www.opengis.net/def/crs/EPSG/0/27398http://www.opengis.net/def/crs/EPSG/0/27429http://www.opengis.net/def/crs/EPSG/0/27492http://www.opengis.net/def/crs/EPSG/0/27493http://www.opengis.net/def/crs/EPSG/0/27500http://www.opengis.net/def/crs/EPSG/0/27561http://www.opengis.net/def/crs/EPSG/0/27562http://www.opengis.net/def/crs/EPSG/0/27563http://www.opengis.net/def/crs/EPSG/0/27564http://www.opengis.net/def/crs/EPSG/0/27571http://www.opengis.net/def/crs/EPSG/0/27572http://www.opengis.net/def/crs/EPSG/0/27573http://www.opengis.net/def/crs/EPSG/0/27574http://www.opengis.net/def/crs/EPSG/0/27581http://www.opengis.net/def/crs/EPSG/0/27582http://www.opengis.net/def/crs/EPSG/0/27583http://www.opengis.net/def/crs/EPSG/0/27584http://www.opengis.net/def/crs/EPSG/0/27591http://www.opengis.net/def/crs/EPSG/0/27592http://www.opengis.net/def/crs/EPSG/0/27593http://www.opengis.net/def/crs/EPSG/0/27594http://www.opengis.net/def/crs/EPSG/0/27700http://www.opengis.net/def/crs/EPSG/0/28191http://www.opengis.net/def/crs/EPSG/0/28192http://www.opengis.net/def/crs/EPSG/0/28193http://www.opengis.net/def/crs/EPSG/0/28232http://www.opengis.net/def/crs/EPSG/0/28348http://www.opengis.net/def/crs/EPSG/0/28349http://www.opengis.net/def/crs/EPSG/0/28350http://www.opengis.net/def/crs/EPSG/0/28351http://www.opengis.net/def/crs/EPSG/0/28352http://www.opengis.net/def/crs/EPSG/0/28353http://www.opengis.net/def/crs/EPSG/0/28354http://www.opengis.net/def/crs/EPSG/0/28355http://www.opengis.net/def/crs/EPSG/0/28356http://www.opengis.net/def/crs/EPSG/0/28357http://www.opengis.net/def/crs/EPSG/0/28358http://www.opengis.net/def/crs/EPSG/0/28402http://www.opengis.net/def/crs/EPSG/0/28403http://www.opengis.net/def/crs/EPSG/0/28404http://www.opengis.net/def/crs/EPSG/0/28405http://www.opengis.net/def/crs/EPSG/0/28406http://www.opengis.net/def/crs/EPSG/0/28407http://www.opengis.net/def/crs/EPSG/0/28408http://www.opengis.net/def/crs/EPSG/0/28409http://www.opengis.net/def/crs/EPSG/0/28410http://www.opengis.net/def/crs/EPSG/0/28411http://www.opengis.net/def/crs/EPSG/0/28412http://www.opengis.net/def/crs/EPSG/0/28413http://www.opengis.net/def/crs/EPSG/0/28414http://www.opengis.net/def/crs/EPSG/0/28415http://www.opengis.net/def/crs/EPSG/0/28416http://www.opengis.net/def/crs/EPSG/0/28417http://www.opengis.net/def/crs/EPSG/0/28418http://www.opengis.net/def/crs/EPSG/0/28419http://www.opengis.net/def/crs/EPSG/0/28420http://www.opengis.net/def/crs/EPSG/0/28421http://www.opengis.net/def/crs/EPSG/0/28422http://www.opengis.net/def/crs/EPSG/0/28423http://www.opengis.net/def/crs/EPSG/0/28424http://www.opengis.net/def/crs/EPSG/0/28425http://www.opengis.net/def/crs/EPSG/0/28426http://www.opengis.net/def/crs/EPSG/0/28427http://www.opengis.net/def/crs/EPSG/0/28428http://www.opengis.net/def/crs/EPSG/0/28429http://www.opengis.net/def/crs/EPSG/0/28430http://www.opengis.net/def/crs/EPSG/0/28431http://www.opengis.net/def/crs/EPSG/0/28432http://www.opengis.net/def/crs/EPSG/0/28462http://www.opengis.net/def/crs/EPSG/0/28463http://www.opengis.net/def/crs/EPSG/0/28464http://www.opengis.net/def/crs/EPSG/0/28465http://www.opengis.net/def/crs/EPSG/0/28466http://www.opengis.net/def/crs/EPSG/0/28467http://www.opengis.net/def/crs/EPSG/0/28468http://www.opengis.net/def/crs/EPSG/0/28469http://www.opengis.net/def/crs/EPSG/0/28470http://www.opengis.net/def/crs/EPSG/0/28471http://www.opengis.net/def/crs/EPSG/0/28472http://www.opengis.net/def/crs/EPSG/0/28473http://www.opengis.net/def/crs/EPSG/0/28474http://www.opengis.net/def/crs/EPSG/0/28475http://www.opengis.net/def/crs/EPSG/0/28476http://www.opengis.net/def/crs/EPSG/0/28477http://www.opengis.net/def/crs/EPSG/0/28478http://www.opengis.net/def/crs/EPSG/0/28479http://www.opengis.net/def/crs/EPSG/0/28480http://www.opengis.net/def/crs/EPSG/0/28481http://www.opengis.net/def/crs/EPSG/0/28482http://www.opengis.net/def/crs/EPSG/0/28483http://www.opengis.net/def/crs/EPSG/0/28484http://www.opengis.net/def/crs/EPSG/0/28485http://www.opengis.net/def/crs/EPSG/0/28486http://www.opengis.net/def/crs/EPSG/0/28487http://www.opengis.net/def/crs/EPSG/0/28488http://www.opengis.net/def/crs/EPSG/0/28489http://www.opengis.net/def/crs/EPSG/0/28490http://www.opengis.net/def/crs/EPSG/0/28491http://www.opengis.net/def/crs/EPSG/0/28492http://www.opengis.net/def/crs/EPSG/0/28600http://www.opengis.net/def/crs/EPSG/0/28991http://www.opengis.net/def/crs/EPSG/0/28992http://www.opengis.net/def/crs/EPSG/0/29100http://www.opengis.net/def/crs/EPSG/0/29101http://www.opengis.net/def/crs/EPSG/0/29118http://www.opengis.net/def/crs/EPSG/0/29119http://www.opengis.net/def/crs/EPSG/0/29120http://www.opengis.net/def/crs/EPSG/0/29121http://www.opengis.net/def/crs/EPSG/0/29122http://www.opengis.net/def/crs/EPSG/0/29168http://www.opengis.net/def/crs/EPSG/0/29169http://www.opengis.net/def/crs/EPSG/0/29170http://www.opengis.net/def/crs/EPSG/0/29171http://www.opengis.net/def/crs/EPSG/0/29172http://www.opengis.net/def/crs/EPSG/0/29177http://www.opengis.net/def/crs/EPSG/0/29178http://www.opengis.net/def/crs/EPSG/0/29179http://www.opengis.net/def/crs/EPSG/0/29180http://www.opengis.net/def/crs/EPSG/0/29181http://www.opengis.net/def/crs/EPSG/0/29182http://www.opengis.net/def/crs/EPSG/0/29183http://www.opengis.net/def/crs/EPSG/0/29184http://www.opengis.net/def/crs/EPSG/0/29185http://www.opengis.net/def/crs/EPSG/0/29187http://www.opengis.net/def/crs/EPSG/0/29188http://www.opengis.net/def/crs/EPSG/0/29189http://www.opengis.net/def/crs/EPSG/0/29190http://www.opengis.net/def/crs/EPSG/0/29191http://www.opengis.net/def/crs/EPSG/0/29192http://www.opengis.net/def/crs/EPSG/0/29193http://www.opengis.net/def/crs/EPSG/0/29194http://www.opengis.net/def/crs/EPSG/0/29195http://www.opengis.net/def/crs/EPSG/0/29220http://www.opengis.net/def/crs/EPSG/0/29221http://www.opengis.net/def/crs/EPSG/0/29333http://www.opengis.net/def/crs/EPSG/0/29371http://www.opengis.net/def/crs/EPSG/0/29373http://www.opengis.net/def/crs/EPSG/0/29375http://www.opengis.net/def/crs/EPSG/0/29377http://www.opengis.net/def/crs/EPSG/0/29379http://www.opengis.net/def/crs/EPSG/0/29381http://www.opengis.net/def/crs/EPSG/0/29383http://www.opengis.net/def/crs/EPSG/0/29385http://www.opengis.net/def/crs/EPSG/0/29635http://www.opengis.net/def/crs/EPSG/0/29636http://www.opengis.net/def/crs/EPSG/0/29700http://www.opengis.net/def/crs/EPSG/0/29701http://www.opengis.net/def/crs/EPSG/0/29702http://www.opengis.net/def/crs/EPSG/0/29738http://www.opengis.net/def/crs/EPSG/0/29739http://www.opengis.net/def/crs/EPSG/0/29849http://www.opengis.net/def/crs/EPSG/0/29850http://www.opengis.net/def/crs/EPSG/0/29871http://www.opengis.net/def/crs/EPSG/0/29872http://www.opengis.net/def/crs/EPSG/0/29873http://www.opengis.net/def/crs/EPSG/0/29900http://www.opengis.net/def/crs/EPSG/0/29901http://www.opengis.net/def/crs/EPSG/0/29902http://www.opengis.net/def/crs/EPSG/0/29903http://www.opengis.net/def/crs/EPSG/0/30161http://www.opengis.net/def/crs/EPSG/0/30162http://www.opengis.net/def/crs/EPSG/0/30163http://www.opengis.net/def/crs/EPSG/0/30164http://www.opengis.net/def/crs/EPSG/0/30165http://www.opengis.net/def/crs/EPSG/0/30166http://www.opengis.net/def/crs/EPSG/0/30167http://www.opengis.net/def/crs/EPSG/0/30168http://www.opengis.net/def/crs/EPSG/0/30169http://www.opengis.net/def/crs/EPSG/0/30170http://www.opengis.net/def/crs/EPSG/0/30171http://www.opengis.net/def/crs/EPSG/0/30172http://www.opengis.net/def/crs/EPSG/0/30173http://www.opengis.net/def/crs/EPSG/0/30174http://www.opengis.net/def/crs/EPSG/0/30175http://www.opengis.net/def/crs/EPSG/0/30176http://www.opengis.net/def/crs/EPSG/0/30177http://www.opengis.net/def/crs/EPSG/0/30178http://www.opengis.net/def/crs/EPSG/0/30179http://www.opengis.net/def/crs/EPSG/0/30200http://www.opengis.net/def/crs/EPSG/0/30339http://www.opengis.net/def/crs/EPSG/0/30340http://www.opengis.net/def/crs/EPSG/0/30491http://www.opengis.net/def/crs/EPSG/0/30492http://www.opengis.net/def/crs/EPSG/0/30493http://www.opengis.net/def/crs/EPSG/0/30494http://www.opengis.net/def/crs/EPSG/0/30729http://www.opengis.net/def/crs/EPSG/0/30730http://www.opengis.net/def/crs/EPSG/0/30731http://www.opengis.net/def/crs/EPSG/0/30732http://www.opengis.net/def/crs/EPSG/0/30791http://www.opengis.net/def/crs/EPSG/0/30792http://www.opengis.net/def/crs/EPSG/0/30800http://www.opengis.net/def/crs/EPSG/0/31028http://www.opengis.net/def/crs/EPSG/0/31121http://www.opengis.net/def/crs/EPSG/0/31154http://www.opengis.net/def/crs/EPSG/0/31170http://www.opengis.net/def/crs/EPSG/0/31171http://www.opengis.net/def/crs/EPSG/0/31251http://www.opengis.net/def/crs/EPSG/0/31252http://www.opengis.net/def/crs/EPSG/0/31253http://www.opengis.net/def/crs/EPSG/0/31254http://www.opengis.net/def/crs/EPSG/0/31255http://www.opengis.net/def/crs/EPSG/0/31256http://www.opengis.net/def/crs/EPSG/0/31257http://www.opengis.net/def/crs/EPSG/0/31258http://www.opengis.net/def/crs/EPSG/0/31259http://www.opengis.net/def/crs/EPSG/0/31265http://www.opengis.net/def/crs/EPSG/0/31266http://www.opengis.net/def/crs/EPSG/0/31267http://www.opengis.net/def/crs/EPSG/0/31268http://www.opengis.net/def/crs/EPSG/0/31275http://www.opengis.net/def/crs/EPSG/0/31276http://www.opengis.net/def/crs/EPSG/0/31277http://www.opengis.net/def/crs/EPSG/0/31278http://www.opengis.net/def/crs/EPSG/0/31279http://www.opengis.net/def/crs/EPSG/0/31281http://www.opengis.net/def/crs/EPSG/0/31282http://www.opengis.net/def/crs/EPSG/0/31283http://www.opengis.net/def/crs/EPSG/0/31284http://www.opengis.net/def/crs/EPSG/0/31285http://www.opengis.net/def/crs/EPSG/0/31286http://www.opengis.net/def/crs/EPSG/0/31287http://www.opengis.net/def/crs/EPSG/0/31288http://www.opengis.net/def/crs/EPSG/0/31289http://www.opengis.net/def/crs/EPSG/0/31290http://www.opengis.net/def/crs/EPSG/0/31291http://www.opengis.net/def/crs/EPSG/0/31292http://www.opengis.net/def/crs/EPSG/0/31293http://www.opengis.net/def/crs/EPSG/0/31294http://www.opengis.net/def/crs/EPSG/0/31295http://www.opengis.net/def/crs/EPSG/0/31296http://www.opengis.net/def/crs/EPSG/0/31297http://www.opengis.net/def/crs/EPSG/0/31300http://www.opengis.net/def/crs/EPSG/0/31370http://www.opengis.net/def/crs/EPSG/0/31461http://www.opengis.net/def/crs/EPSG/0/31462http://www.opengis.net/def/crs/EPSG/0/31463http://www.opengis.net/def/crs/EPSG/0/31464http://www.opengis.net/def/crs/EPSG/0/31465http://www.opengis.net/def/crs/EPSG/0/31466http://www.opengis.net/def/crs/EPSG/0/31467http://www.opengis.net/def/crs/EPSG/0/31468http://www.opengis.net/def/crs/EPSG/0/31469http://www.opengis.net/def/crs/EPSG/0/31528http://www.opengis.net/def/crs/EPSG/0/31529http://www.opengis.net/def/crs/EPSG/0/31600http://www.opengis.net/def/crs/EPSG/0/31700http://www.opengis.net/def/crs/EPSG/0/31838http://www.opengis.net/def/crs/EPSG/0/31839http://www.opengis.net/def/crs/EPSG/0/31900http://www.opengis.net/def/crs/EPSG/0/31901http://www.opengis.net/def/crs/EPSG/0/31965http://www.opengis.net/def/crs/EPSG/0/31966http://www.opengis.net/def/crs/EPSG/0/31967http://www.opengis.net/def/crs/EPSG/0/31968http://www.opengis.net/def/crs/EPSG/0/31969http://www.opengis.net/def/crs/EPSG/0/31970http://www.opengis.net/def/crs/EPSG/0/31971http://www.opengis.net/def/crs/EPSG/0/31972http://www.opengis.net/def/crs/EPSG/0/31973http://www.opengis.net/def/crs/EPSG/0/31974http://www.opengis.net/def/crs/EPSG/0/31975http://www.opengis.net/def/crs/EPSG/0/31976http://www.opengis.net/def/crs/EPSG/0/31977http://www.opengis.net/def/crs/EPSG/0/31978http://www.opengis.net/def/crs/EPSG/0/31979http://www.opengis.net/def/crs/EPSG/0/31980http://www.opengis.net/def/crs/EPSG/0/31981http://www.opengis.net/def/crs/EPSG/0/31982http://www.opengis.net/def/crs/EPSG/0/31983http://www.opengis.net/def/crs/EPSG/0/31984http://www.opengis.net/def/crs/EPSG/0/31985http://www.opengis.net/def/crs/EPSG/0/31986http://www.opengis.net/def/crs/EPSG/0/31987http://www.opengis.net/def/crs/EPSG/0/31988http://www.opengis.net/def/crs/EPSG/0/31989http://www.opengis.net/def/crs/EPSG/0/31990http://www.opengis.net/def/crs/EPSG/0/31991http://www.opengis.net/def/crs/EPSG/0/31992http://www.opengis.net/def/crs/EPSG/0/31993http://www.opengis.net/def/crs/EPSG/0/31994http://www.opengis.net/def/crs/EPSG/0/31995http://www.opengis.net/def/crs/EPSG/0/31996http://www.opengis.net/def/crs/EPSG/0/31997http://www.opengis.net/def/crs/EPSG/0/31998http://www.opengis.net/def/crs/EPSG/0/31999http://www.opengis.net/def/crs/EPSG/0/32000http://www.opengis.net/def/crs/EPSG/0/32001http://www.opengis.net/def/crs/EPSG/0/32002http://www.opengis.net/def/crs/EPSG/0/32003http://www.opengis.net/def/crs/EPSG/0/32005http://www.opengis.net/def/crs/EPSG/0/32006http://www.opengis.net/def/crs/EPSG/0/32007http://www.opengis.net/def/crs/EPSG/0/32008http://www.opengis.net/def/crs/EPSG/0/32009http://www.opengis.net/def/crs/EPSG/0/32010http://www.opengis.net/def/crs/EPSG/0/32011http://www.opengis.net/def/crs/EPSG/0/32012http://www.opengis.net/def/crs/EPSG/0/32013http://www.opengis.net/def/crs/EPSG/0/32014http://www.opengis.net/def/crs/EPSG/0/32015http://www.opengis.net/def/crs/EPSG/0/32016http://www.opengis.net/def/crs/EPSG/0/32017http://www.opengis.net/def/crs/EPSG/0/32018http://www.opengis.net/def/crs/EPSG/0/32019http://www.opengis.net/def/crs/EPSG/0/32020http://www.opengis.net/def/crs/EPSG/0/32021http://www.opengis.net/def/crs/EPSG/0/32022http://www.opengis.net/def/crs/EPSG/0/32023http://www.opengis.net/def/crs/EPSG/0/32024http://www.opengis.net/def/crs/EPSG/0/32025http://www.opengis.net/def/crs/EPSG/0/32026http://www.opengis.net/def/crs/EPSG/0/32027http://www.opengis.net/def/crs/EPSG/0/32028http://www.opengis.net/def/crs/EPSG/0/32029http://www.opengis.net/def/crs/EPSG/0/32030http://www.opengis.net/def/crs/EPSG/0/32031http://www.opengis.net/def/crs/EPSG/0/32033http://www.opengis.net/def/crs/EPSG/0/32034http://www.opengis.net/def/crs/EPSG/0/32035http://www.opengis.net/def/crs/EPSG/0/32036http://www.opengis.net/def/crs/EPSG/0/32037http://www.opengis.net/def/crs/EPSG/0/32038http://www.opengis.net/def/crs/EPSG/0/32039http://www.opengis.net/def/crs/EPSG/0/32040http://www.opengis.net/def/crs/EPSG/0/32041http://www.opengis.net/def/crs/EPSG/0/32042http://www.opengis.net/def/crs/EPSG/0/32043http://www.opengis.net/def/crs/EPSG/0/32044http://www.opengis.net/def/crs/EPSG/0/32045http://www.opengis.net/def/crs/EPSG/0/32046http://www.opengis.net/def/crs/EPSG/0/32047http://www.opengis.net/def/crs/EPSG/0/32048http://www.opengis.net/def/crs/EPSG/0/32049http://www.opengis.net/def/crs/EPSG/0/32050http://www.opengis.net/def/crs/EPSG/0/32051http://www.opengis.net/def/crs/EPSG/0/32052http://www.opengis.net/def/crs/EPSG/0/32053http://www.opengis.net/def/crs/EPSG/0/32054http://www.opengis.net/def/crs/EPSG/0/32055http://www.opengis.net/def/crs/EPSG/0/32056http://www.opengis.net/def/crs/EPSG/0/32057http://www.opengis.net/def/crs/EPSG/0/32058http://www.opengis.net/def/crs/EPSG/0/32061http://www.opengis.net/def/crs/EPSG/0/32062http://www.opengis.net/def/crs/EPSG/0/32064http://www.opengis.net/def/crs/EPSG/0/32065http://www.opengis.net/def/crs/EPSG/0/32066http://www.opengis.net/def/crs/EPSG/0/32067http://www.opengis.net/def/crs/EPSG/0/32074http://www.opengis.net/def/crs/EPSG/0/32075http://www.opengis.net/def/crs/EPSG/0/32076http://www.opengis.net/def/crs/EPSG/0/32077http://www.opengis.net/def/crs/EPSG/0/32081http://www.opengis.net/def/crs/EPSG/0/32082http://www.opengis.net/def/crs/EPSG/0/32083http://www.opengis.net/def/crs/EPSG/0/32084http://www.opengis.net/def/crs/EPSG/0/32085http://www.opengis.net/def/crs/EPSG/0/32086http://www.opengis.net/def/crs/EPSG/0/32098http://www.opengis.net/def/crs/EPSG/0/32099http://www.opengis.net/def/crs/EPSG/0/32100http://www.opengis.net/def/crs/EPSG/0/32104http://www.opengis.net/def/crs/EPSG/0/32107http://www.opengis.net/def/crs/EPSG/0/32108http://www.opengis.net/def/crs/EPSG/0/32109http://www.opengis.net/def/crs/EPSG/0/32110http://www.opengis.net/def/crs/EPSG/0/32111http://www.opengis.net/def/crs/EPSG/0/32112http://www.opengis.net/def/crs/EPSG/0/32113http://www.opengis.net/def/crs/EPSG/0/32114http://www.opengis.net/def/crs/EPSG/0/32115http://www.opengis.net/def/crs/EPSG/0/32116http://www.opengis.net/def/crs/EPSG/0/32117http://www.opengis.net/def/crs/EPSG/0/32118http://www.opengis.net/def/crs/EPSG/0/32119http://www.opengis.net/def/crs/EPSG/0/32120http://www.opengis.net/def/crs/EPSG/0/32121http://www.opengis.net/def/crs/EPSG/0/32122http://www.opengis.net/def/crs/EPSG/0/32123http://www.opengis.net/def/crs/EPSG/0/32124http://www.opengis.net/def/crs/EPSG/0/32125http://www.opengis.net/def/crs/EPSG/0/32126http://www.opengis.net/def/crs/EPSG/0/32127http://www.opengis.net/def/crs/EPSG/0/32128http://www.opengis.net/def/crs/EPSG/0/32129http://www.opengis.net/def/crs/EPSG/0/32130http://www.opengis.net/def/crs/EPSG/0/32133http://www.opengis.net/def/crs/EPSG/0/32134http://www.opengis.net/def/crs/EPSG/0/32135http://www.opengis.net/def/crs/EPSG/0/32136http://www.opengis.net/def/crs/EPSG/0/32137http://www.opengis.net/def/crs/EPSG/0/32138http://www.opengis.net/def/crs/EPSG/0/32139http://www.opengis.net/def/crs/EPSG/0/32140http://www.opengis.net/def/crs/EPSG/0/32141http://www.opengis.net/def/crs/EPSG/0/32142http://www.opengis.net/def/crs/EPSG/0/32143http://www.opengis.net/def/crs/EPSG/0/32144http://www.opengis.net/def/crs/EPSG/0/32145http://www.opengis.net/def/crs/EPSG/0/32146http://www.opengis.net/def/crs/EPSG/0/32147http://www.opengis.net/def/crs/EPSG/0/32148http://www.opengis.net/def/crs/EPSG/0/32149http://www.opengis.net/def/crs/EPSG/0/32150http://www.opengis.net/def/crs/EPSG/0/32151http://www.opengis.net/def/crs/EPSG/0/32152http://www.opengis.net/def/crs/EPSG/0/32153http://www.opengis.net/def/crs/EPSG/0/32154http://www.opengis.net/def/crs/EPSG/0/32155http://www.opengis.net/def/crs/EPSG/0/32156http://www.opengis.net/def/crs/EPSG/0/32157http://www.opengis.net/def/crs/EPSG/0/32158http://www.opengis.net/def/crs/EPSG/0/32161http://www.opengis.net/def/crs/EPSG/0/32164http://www.opengis.net/def/crs/EPSG/0/32165http://www.opengis.net/def/crs/EPSG/0/32166http://www.opengis.net/def/crs/EPSG/0/32167http://www.opengis.net/def/crs/EPSG/0/32180http://www.opengis.net/def/crs/EPSG/0/32181http://www.opengis.net/def/crs/EPSG/0/32182http://www.opengis.net/def/crs/EPSG/0/32183http://www.opengis.net/def/crs/EPSG/0/32184http://www.opengis.net/def/crs/EPSG/0/32185http://www.opengis.net/def/crs/EPSG/0/32186http://www.opengis.net/def/crs/EPSG/0/32187http://www.opengis.net/def/crs/EPSG/0/32188http://www.opengis.net/def/crs/EPSG/0/32189http://www.opengis.net/def/crs/EPSG/0/32190http://www.opengis.net/def/crs/EPSG/0/32191http://www.opengis.net/def/crs/EPSG/0/32192http://www.opengis.net/def/crs/EPSG/0/32193http://www.opengis.net/def/crs/EPSG/0/32194http://www.opengis.net/def/crs/EPSG/0/32195http://www.opengis.net/def/crs/EPSG/0/32196http://www.opengis.net/def/crs/EPSG/0/32197http://www.opengis.net/def/crs/EPSG/0/32198http://www.opengis.net/def/crs/EPSG/0/32199http://www.opengis.net/def/crs/EPSG/0/32201http://www.opengis.net/def/crs/EPSG/0/32202http://www.opengis.net/def/crs/EPSG/0/32203http://www.opengis.net/def/crs/EPSG/0/32204http://www.opengis.net/def/crs/EPSG/0/32205http://www.opengis.net/def/crs/EPSG/0/32206http://www.opengis.net/def/crs/EPSG/0/32207http://www.opengis.net/def/crs/EPSG/0/32208http://www.opengis.net/def/crs/EPSG/0/32209http://www.opengis.net/def/crs/EPSG/0/32210http://www.opengis.net/def/crs/EPSG/0/32211http://www.opengis.net/def/crs/EPSG/0/32212http://www.opengis.net/def/crs/EPSG/0/32213http://www.opengis.net/def/crs/EPSG/0/32214http://www.opengis.net/def/crs/EPSG/0/32215http://www.opengis.net/def/crs/EPSG/0/32216http://www.opengis.net/def/crs/EPSG/0/32217http://www.opengis.net/def/crs/EPSG/0/32218http://www.opengis.net/def/crs/EPSG/0/32219http://www.opengis.net/def/crs/EPSG/0/32220http://www.opengis.net/def/crs/EPSG/0/32221http://www.opengis.net/def/crs/EPSG/0/32222http://www.opengis.net/def/crs/EPSG/0/32223http://www.opengis.net/def/crs/EPSG/0/32224http://www.opengis.net/def/crs/EPSG/0/32225http://www.opengis.net/def/crs/EPSG/0/32226http://www.opengis.net/def/crs/EPSG/0/32227http://www.opengis.net/def/crs/EPSG/0/32228http://www.opengis.net/def/crs/EPSG/0/32229http://www.opengis.net/def/crs/EPSG/0/32230http://www.opengis.net/def/crs/EPSG/0/32231http://www.opengis.net/def/crs/EPSG/0/32232http://www.opengis.net/def/crs/EPSG/0/32233http://www.opengis.net/def/crs/EPSG/0/32234http://www.opengis.net/def/crs/EPSG/0/32235http://www.opengis.net/def/crs/EPSG/0/32236http://www.opengis.net/def/crs/EPSG/0/32237http://www.opengis.net/def/crs/EPSG/0/32238http://www.opengis.net/def/crs/EPSG/0/32239http://www.opengis.net/def/crs/EPSG/0/32240http://www.opengis.net/def/crs/EPSG/0/32241http://www.opengis.net/def/crs/EPSG/0/32242http://www.opengis.net/def/crs/EPSG/0/32243http://www.opengis.net/def/crs/EPSG/0/32244http://www.opengis.net/def/crs/EPSG/0/32245http://www.opengis.net/def/crs/EPSG/0/32246http://www.opengis.net/def/crs/EPSG/0/32247http://www.opengis.net/def/crs/EPSG/0/32248http://www.opengis.net/def/crs/EPSG/0/32249http://www.opengis.net/def/crs/EPSG/0/32250http://www.opengis.net/def/crs/EPSG/0/32251http://www.opengis.net/def/crs/EPSG/0/32252http://www.opengis.net/def/crs/EPSG/0/32253http://www.opengis.net/def/crs/EPSG/0/32254http://www.opengis.net/def/crs/EPSG/0/32255http://www.opengis.net/def/crs/EPSG/0/32256http://www.opengis.net/def/crs/EPSG/0/32257http://www.opengis.net/def/crs/EPSG/0/32258http://www.opengis.net/def/crs/EPSG/0/32259http://www.opengis.net/def/crs/EPSG/0/32260http://www.opengis.net/def/crs/EPSG/0/32301http://www.opengis.net/def/crs/EPSG/0/32302http://www.opengis.net/def/crs/EPSG/0/32303http://www.opengis.net/def/crs/EPSG/0/32304http://www.opengis.net/def/crs/EPSG/0/32305http://www.opengis.net/def/crs/EPSG/0/32306http://www.opengis.net/def/crs/EPSG/0/32307http://www.opengis.net/def/crs/EPSG/0/32308http://www.opengis.net/def/crs/EPSG/0/32309http://www.opengis.net/def/crs/EPSG/0/32310http://www.opengis.net/def/crs/EPSG/0/32311http://www.opengis.net/def/crs/EPSG/0/32312http://www.opengis.net/def/crs/EPSG/0/32313http://www.opengis.net/def/crs/EPSG/0/32314http://www.opengis.net/def/crs/EPSG/0/32315http://www.opengis.net/def/crs/EPSG/0/32316http://www.opengis.net/def/crs/EPSG/0/32317http://www.opengis.net/def/crs/EPSG/0/32318http://www.opengis.net/def/crs/EPSG/0/32319http://www.opengis.net/def/crs/EPSG/0/32320http://www.opengis.net/def/crs/EPSG/0/32321http://www.opengis.net/def/crs/EPSG/0/32322http://www.opengis.net/def/crs/EPSG/0/32323http://www.opengis.net/def/crs/EPSG/0/32324http://www.opengis.net/def/crs/EPSG/0/32325http://www.opengis.net/def/crs/EPSG/0/32326http://www.opengis.net/def/crs/EPSG/0/32327http://www.opengis.net/def/crs/EPSG/0/32328http://www.opengis.net/def/crs/EPSG/0/32329http://www.opengis.net/def/crs/EPSG/0/32330http://www.opengis.net/def/crs/EPSG/0/32331http://www.opengis.net/def/crs/EPSG/0/32332http://www.opengis.net/def/crs/EPSG/0/32333http://www.opengis.net/def/crs/EPSG/0/32334http://www.opengis.net/def/crs/EPSG/0/32335http://www.opengis.net/def/crs/EPSG/0/32336http://www.opengis.net/def/crs/EPSG/0/32337http://www.opengis.net/def/crs/EPSG/0/32338http://www.opengis.net/def/crs/EPSG/0/32339http://www.opengis.net/def/crs/EPSG/0/32340http://www.opengis.net/def/crs/EPSG/0/32341http://www.opengis.net/def/crs/EPSG/0/32342http://www.opengis.net/def/crs/EPSG/0/32343http://www.opengis.net/def/crs/EPSG/0/32344http://www.opengis.net/def/crs/EPSG/0/32345http://www.opengis.net/def/crs/EPSG/0/32346http://www.opengis.net/def/crs/EPSG/0/32347http://www.opengis.net/def/crs/EPSG/0/32348http://www.opengis.net/def/crs/EPSG/0/32349http://www.opengis.net/def/crs/EPSG/0/32350http://www.opengis.net/def/crs/EPSG/0/32351http://www.opengis.net/def/crs/EPSG/0/32352http://www.opengis.net/def/crs/EPSG/0/32353http://www.opengis.net/def/crs/EPSG/0/32354http://www.opengis.net/def/crs/EPSG/0/32355http://www.opengis.net/def/crs/EPSG/0/32356http://www.opengis.net/def/crs/EPSG/0/32357http://www.opengis.net/def/crs/EPSG/0/32358http://www.opengis.net/def/crs/EPSG/0/32359http://www.opengis.net/def/crs/EPSG/0/32360http://www.opengis.net/def/crs/EPSG/0/32401http://www.opengis.net/def/crs/EPSG/0/32402http://www.opengis.net/def/crs/EPSG/0/32403http://www.opengis.net/def/crs/EPSG/0/32404http://www.opengis.net/def/crs/EPSG/0/32405http://www.opengis.net/def/crs/EPSG/0/32406http://www.opengis.net/def/crs/EPSG/0/32407http://www.opengis.net/def/crs/EPSG/0/32408http://www.opengis.net/def/crs/EPSG/0/32409http://www.opengis.net/def/crs/EPSG/0/32410http://www.opengis.net/def/crs/EPSG/0/32411http://www.opengis.net/def/crs/EPSG/0/32412http://www.opengis.net/def/crs/EPSG/0/32413http://www.opengis.net/def/crs/EPSG/0/32414http://www.opengis.net/def/crs/EPSG/0/32415http://www.opengis.net/def/crs/EPSG/0/32416http://www.opengis.net/def/crs/EPSG/0/32417http://www.opengis.net/def/crs/EPSG/0/32418http://www.opengis.net/def/crs/EPSG/0/32419http://www.opengis.net/def/crs/EPSG/0/32420http://www.opengis.net/def/crs/EPSG/0/32421http://www.opengis.net/def/crs/EPSG/0/32422http://www.opengis.net/def/crs/EPSG/0/32423http://www.opengis.net/def/crs/EPSG/0/32424http://www.opengis.net/def/crs/EPSG/0/32425http://www.opengis.net/def/crs/EPSG/0/32426http://www.opengis.net/def/crs/EPSG/0/32427http://www.opengis.net/def/crs/EPSG/0/32428http://www.opengis.net/def/crs/EPSG/0/32429http://www.opengis.net/def/crs/EPSG/0/32430http://www.opengis.net/def/crs/EPSG/0/32431http://www.opengis.net/def/crs/EPSG/0/32432http://www.opengis.net/def/crs/EPSG/0/32433http://www.opengis.net/def/crs/EPSG/0/32434http://www.opengis.net/def/crs/EPSG/0/32435http://www.opengis.net/def/crs/EPSG/0/32436http://www.opengis.net/def/crs/EPSG/0/32437http://www.opengis.net/def/crs/EPSG/0/32438http://www.opengis.net/def/crs/EPSG/0/32439http://www.opengis.net/def/crs/EPSG/0/32440http://www.opengis.net/def/crs/EPSG/0/32441http://www.opengis.net/def/crs/EPSG/0/32442http://www.opengis.net/def/crs/EPSG/0/32443http://www.opengis.net/def/crs/EPSG/0/32444http://www.opengis.net/def/crs/EPSG/0/32445http://www.opengis.net/def/crs/EPSG/0/32446http://www.opengis.net/def/crs/EPSG/0/32447http://www.opengis.net/def/crs/EPSG/0/32448http://www.opengis.net/def/crs/EPSG/0/32449http://www.opengis.net/def/crs/EPSG/0/32450http://www.opengis.net/def/crs/EPSG/0/32451http://www.opengis.net/def/crs/EPSG/0/32452http://www.opengis.net/def/crs/EPSG/0/32453http://www.opengis.net/def/crs/EPSG/0/32454http://www.opengis.net/def/crs/EPSG/0/32455http://www.opengis.net/def/crs/EPSG/0/32456http://www.opengis.net/def/crs/EPSG/0/32457http://www.opengis.net/def/crs/EPSG/0/32458http://www.opengis.net/def/crs/EPSG/0/32459http://www.opengis.net/def/crs/EPSG/0/32460http://www.opengis.net/def/crs/EPSG/0/32501http://www.opengis.net/def/crs/EPSG/0/32502http://www.opengis.net/def/crs/EPSG/0/32503http://www.opengis.net/def/crs/EPSG/0/32504http://www.opengis.net/def/crs/EPSG/0/32505http://www.opengis.net/def/crs/EPSG/0/32506http://www.opengis.net/def/crs/EPSG/0/32507http://www.opengis.net/def/crs/EPSG/0/32508http://www.opengis.net/def/crs/EPSG/0/32509http://www.opengis.net/def/crs/EPSG/0/32510http://www.opengis.net/def/crs/EPSG/0/32511http://www.opengis.net/def/crs/EPSG/0/32512http://www.opengis.net/def/crs/EPSG/0/32513http://www.opengis.net/def/crs/EPSG/0/32514http://www.opengis.net/def/crs/EPSG/0/32515http://www.opengis.net/def/crs/EPSG/0/32516http://www.opengis.net/def/crs/EPSG/0/32517http://www.opengis.net/def/crs/EPSG/0/32518http://www.opengis.net/def/crs/EPSG/0/32519http://www.opengis.net/def/crs/EPSG/0/32520http://www.opengis.net/def/crs/EPSG/0/32521http://www.opengis.net/def/crs/EPSG/0/32522http://www.opengis.net/def/crs/EPSG/0/32523http://www.opengis.net/def/crs/EPSG/0/32524http://www.opengis.net/def/crs/EPSG/0/32525http://www.opengis.net/def/crs/EPSG/0/32526http://www.opengis.net/def/crs/EPSG/0/32527http://www.opengis.net/def/crs/EPSG/0/32528http://www.opengis.net/def/crs/EPSG/0/32529http://www.opengis.net/def/crs/EPSG/0/32530http://www.opengis.net/def/crs/EPSG/0/32531http://www.opengis.net/def/crs/EPSG/0/32532http://www.opengis.net/def/crs/EPSG/0/32533http://www.opengis.net/def/crs/EPSG/0/32534http://www.opengis.net/def/crs/EPSG/0/32535http://www.opengis.net/def/crs/EPSG/0/32536http://www.opengis.net/def/crs/EPSG/0/32537http://www.opengis.net/def/crs/EPSG/0/32538http://www.opengis.net/def/crs/EPSG/0/32539http://www.opengis.net/def/crs/EPSG/0/32540http://www.opengis.net/def/crs/EPSG/0/32541http://www.opengis.net/def/crs/EPSG/0/32542http://www.opengis.net/def/crs/EPSG/0/32543http://www.opengis.net/def/crs/EPSG/0/32544http://www.opengis.net/def/crs/EPSG/0/32545http://www.opengis.net/def/crs/EPSG/0/32546http://www.opengis.net/def/crs/EPSG/0/32547http://www.opengis.net/def/crs/EPSG/0/32548http://www.opengis.net/def/crs/EPSG/0/32549http://www.opengis.net/def/crs/EPSG/0/32550http://www.opengis.net/def/crs/EPSG/0/32551http://www.opengis.net/def/crs/EPSG/0/32552http://www.opengis.net/def/crs/EPSG/0/32553http://www.opengis.net/def/crs/EPSG/0/32554http://www.opengis.net/def/crs/EPSG/0/32555http://www.opengis.net/def/crs/EPSG/0/32556http://www.opengis.net/def/crs/EPSG/0/32557http://www.opengis.net/def/crs/EPSG/0/32558http://www.opengis.net/def/crs/EPSG/0/32559http://www.opengis.net/def/crs/EPSG/0/32560http://www.opengis.net/def/crs/EPSG/0/32600http://www.opengis.net/def/crs/EPSG/0/32601http://www.opengis.net/def/crs/EPSG/0/32602http://www.opengis.net/def/crs/EPSG/0/32603http://www.opengis.net/def/crs/EPSG/0/32604http://www.opengis.net/def/crs/EPSG/0/32605http://www.opengis.net/def/crs/EPSG/0/32606http://www.opengis.net/def/crs/EPSG/0/32607http://www.opengis.net/def/crs/EPSG/0/32608http://www.opengis.net/def/crs/EPSG/0/32609http://www.opengis.net/def/crs/EPSG/0/32610http://www.opengis.net/def/crs/EPSG/0/32611http://www.opengis.net/def/crs/EPSG/0/32612http://www.opengis.net/def/crs/EPSG/0/32613http://www.opengis.net/def/crs/EPSG/0/32614http://www.opengis.net/def/crs/EPSG/0/32615http://www.opengis.net/def/crs/EPSG/0/32616http://www.opengis.net/def/crs/EPSG/0/32617http://www.opengis.net/def/crs/EPSG/0/32618http://www.opengis.net/def/crs/EPSG/0/32619http://www.opengis.net/def/crs/EPSG/0/32620http://www.opengis.net/def/crs/EPSG/0/32621http://www.opengis.net/def/crs/EPSG/0/32622http://www.opengis.net/def/crs/EPSG/0/32623http://www.opengis.net/def/crs/EPSG/0/32624http://www.opengis.net/def/crs/EPSG/0/32625http://www.opengis.net/def/crs/EPSG/0/32626http://www.opengis.net/def/crs/EPSG/0/32627http://www.opengis.net/def/crs/EPSG/0/32628http://www.opengis.net/def/crs/EPSG/0/32629http://www.opengis.net/def/crs/EPSG/0/32630http://www.opengis.net/def/crs/EPSG/0/32631http://www.opengis.net/def/crs/EPSG/0/32632http://www.opengis.net/def/crs/EPSG/0/32633http://www.opengis.net/def/crs/EPSG/0/32634http://www.opengis.net/def/crs/EPSG/0/32635http://www.opengis.net/def/crs/EPSG/0/32636http://www.opengis.net/def/crs/EPSG/0/32637http://www.opengis.net/def/crs/EPSG/0/32638http://www.opengis.net/def/crs/EPSG/0/32639http://www.opengis.net/def/crs/EPSG/0/32640http://www.opengis.net/def/crs/EPSG/0/32641http://www.opengis.net/def/crs/EPSG/0/32642http://www.opengis.net/def/crs/EPSG/0/32643http://www.opengis.net/def/crs/EPSG/0/32644http://www.opengis.net/def/crs/EPSG/0/32645http://www.opengis.net/def/crs/EPSG/0/32646http://www.opengis.net/def/crs/EPSG/0/32647http://www.opengis.net/def/crs/EPSG/0/32648http://www.opengis.net/def/crs/EPSG/0/32649http://www.opengis.net/def/crs/EPSG/0/32650http://www.opengis.net/def/crs/EPSG/0/32651http://www.opengis.net/def/crs/EPSG/0/32652http://www.opengis.net/def/crs/EPSG/0/32653http://www.opengis.net/def/crs/EPSG/0/32654http://www.opengis.net/def/crs/EPSG/0/32655http://www.opengis.net/def/crs/EPSG/0/32656http://www.opengis.net/def/crs/EPSG/0/32657http://www.opengis.net/def/crs/EPSG/0/32658http://www.opengis.net/def/crs/EPSG/0/32659http://www.opengis.net/def/crs/EPSG/0/32660http://www.opengis.net/def/crs/EPSG/0/32661http://www.opengis.net/def/crs/EPSG/0/32662http://www.opengis.net/def/crs/EPSG/0/32663http://www.opengis.net/def/crs/EPSG/0/32664http://www.opengis.net/def/crs/EPSG/0/32665http://www.opengis.net/def/crs/EPSG/0/32666http://www.opengis.net/def/crs/EPSG/0/32667http://www.opengis.net/def/crs/EPSG/0/32700http://www.opengis.net/def/crs/EPSG/0/32701http://www.opengis.net/def/crs/EPSG/0/32702http://www.opengis.net/def/crs/EPSG/0/32703http://www.opengis.net/def/crs/EPSG/0/32704http://www.opengis.net/def/crs/EPSG/0/32705http://www.opengis.net/def/crs/EPSG/0/32706http://www.opengis.net/def/crs/EPSG/0/32707http://www.opengis.net/def/crs/EPSG/0/32708http://www.opengis.net/def/crs/EPSG/0/32709http://www.opengis.net/def/crs/EPSG/0/32710http://www.opengis.net/def/crs/EPSG/0/32711http://www.opengis.net/def/crs/EPSG/0/32712http://www.opengis.net/def/crs/EPSG/0/32713http://www.opengis.net/def/crs/EPSG/0/32714http://www.opengis.net/def/crs/EPSG/0/32715http://www.opengis.net/def/crs/EPSG/0/32716http://www.opengis.net/def/crs/EPSG/0/32717http://www.opengis.net/def/crs/EPSG/0/32718http://www.opengis.net/def/crs/EPSG/0/32719http://www.opengis.net/def/crs/EPSG/0/32720http://www.opengis.net/def/crs/EPSG/0/32721http://www.opengis.net/def/crs/EPSG/0/32722http://www.opengis.net/def/crs/EPSG/0/32723http://www.opengis.net/def/crs/EPSG/0/32724http://www.opengis.net/def/crs/EPSG/0/32725http://www.opengis.net/def/crs/EPSG/0/32726http://www.opengis.net/def/crs/EPSG/0/32727http://www.opengis.net/def/crs/EPSG/0/32728http://www.opengis.net/def/crs/EPSG/0/32729http://www.opengis.net/def/crs/EPSG/0/32730http://www.opengis.net/def/crs/EPSG/0/32731http://www.opengis.net/def/crs/EPSG/0/32732http://www.opengis.net/def/crs/EPSG/0/32733http://www.opengis.net/def/crs/EPSG/0/32734http://www.opengis.net/def/crs/EPSG/0/32735http://www.opengis.net/def/crs/EPSG/0/32736http://www.opengis.net/def/crs/EPSG/0/32737http://www.opengis.net/def/crs/EPSG/0/32738http://www.opengis.net/def/crs/EPSG/0/32739http://www.opengis.net/def/crs/EPSG/0/32740http://www.opengis.net/def/crs/EPSG/0/32741http://www.opengis.net/def/crs/EPSG/0/32742http://www.opengis.net/def/crs/EPSG/0/32743http://www.opengis.net/def/crs/EPSG/0/32744http://www.opengis.net/def/crs/EPSG/0/32745http://www.opengis.net/def/crs/EPSG/0/32746http://www.opengis.net/def/crs/EPSG/0/32747http://www.opengis.net/def/crs/EPSG/0/32748http://www.opengis.net/def/crs/EPSG/0/32749http://www.opengis.net/def/crs/EPSG/0/32750http://www.opengis.net/def/crs/EPSG/0/32751http://www.opengis.net/def/crs/EPSG/0/32752http://www.opengis.net/def/crs/EPSG/0/32753http://www.opengis.net/def/crs/EPSG/0/32754http://www.opengis.net/def/crs/EPSG/0/32755http://www.opengis.net/def/crs/EPSG/0/32756http://www.opengis.net/def/crs/EPSG/0/32757http://www.opengis.net/def/crs/EPSG/0/32758http://www.opengis.net/def/crs/EPSG/0/32759http://www.opengis.net/def/crs/EPSG/0/32760http://www.opengis.net/def/crs/EPSG/0/32761http://www.opengis.net/def/crs/EPSG/0/32766http://www.opengis.net/def/crs/EPSG/0/61206405http://www.opengis.net/def/crs/EPSG/0/61216405http://www.opengis.net/def/crs/EPSG/0/61226405http://www.opengis.net/def/crs/EPSG/0/61236405http://www.opengis.net/def/crs/EPSG/0/61246405http://www.opengis.net/def/crs/EPSG/0/61266405http://www.opengis.net/def/crs/EPSG/0/61266413http://www.opengis.net/def/crs/EPSG/0/61276405http://www.opengis.net/def/crs/EPSG/0/61286405http://www.opengis.net/def/crs/EPSG/0/61296405http://www.opengis.net/def/crs/EPSG/0/61306405http://www.opengis.net/def/crs/EPSG/0/61306413http://www.opengis.net/def/crs/EPSG/0/61316405http://www.opengis.net/def/crs/EPSG/0/61326405http://www.opengis.net/def/crs/EPSG/0/61336405http://www.opengis.net/def/crs/EPSG/0/61346405http://www.opengis.net/def/crs/EPSG/0/61356405http://www.opengis.net/def/crs/EPSG/0/61366405http://www.opengis.net/def/crs/EPSG/0/61376405http://www.opengis.net/def/crs/EPSG/0/61386405http://www.opengis.net/def/crs/EPSG/0/61396405http://www.opengis.net/def/crs/EPSG/0/61406405http://www.opengis.net/def/crs/EPSG/0/61406413http://www.opengis.net/def/crs/EPSG/0/61416405http://www.opengis.net/def/crs/EPSG/0/61426405http://www.opengis.net/def/crs/EPSG/0/61436405http://www.opengis.net/def/crs/EPSG/0/61446405http://www.opengis.net/def/crs/EPSG/0/61456405http://www.opengis.net/def/crs/EPSG/0/61466405http://www.opengis.net/def/crs/EPSG/0/61476405http://www.opengis.net/def/crs/EPSG/0/61486405http://www.opengis.net/def/crs/EPSG/0/61486413http://www.opengis.net/def/crs/EPSG/0/61496405http://www.opengis.net/def/crs/EPSG/0/61506405http://www.opengis.net/def/crs/EPSG/0/61516405http://www.opengis.net/def/crs/EPSG/0/61516413http://www.opengis.net/def/crs/EPSG/0/61526405http://www.opengis.net/def/crs/EPSG/0/61526413http://www.opengis.net/def/crs/EPSG/0/61536405http://www.opengis.net/def/crs/EPSG/0/61546405http://www.opengis.net/def/crs/EPSG/0/61556405http://www.opengis.net/def/crs/EPSG/0/61566405http://www.opengis.net/def/crs/EPSG/0/61576405http://www.opengis.net/def/crs/EPSG/0/61586405http://www.opengis.net/def/crs/EPSG/0/61596405http://www.opengis.net/def/crs/EPSG/0/61606405http://www.opengis.net/def/crs/EPSG/0/61616405http://www.opengis.net/def/crs/EPSG/0/61626405http://www.opengis.net/def/crs/EPSG/0/61636405http://www.opengis.net/def/crs/EPSG/0/61636413http://www.opengis.net/def/crs/EPSG/0/61646405http://www.opengis.net/def/crs/EPSG/0/61656405http://www.opengis.net/def/crs/EPSG/0/61666405http://www.opengis.net/def/crs/EPSG/0/61676405http://www.opengis.net/def/crs/EPSG/0/61676413http://www.opengis.net/def/crs/EPSG/0/61686405http://www.opengis.net/def/crs/EPSG/0/61696405http://www.opengis.net/def/crs/EPSG/0/61706405http://www.opengis.net/def/crs/EPSG/0/61706413http://www.opengis.net/def/crs/EPSG/0/61716405http://www.opengis.net/def/crs/EPSG/0/61716413http://www.opengis.net/def/crs/EPSG/0/61736405http://www.opengis.net/def/crs/EPSG/0/61736413http://www.opengis.net/def/crs/EPSG/0/61746405http://www.opengis.net/def/crs/EPSG/0/61756405http://www.opengis.net/def/crs/EPSG/0/61766405http://www.opengis.net/def/crs/EPSG/0/61766413http://www.opengis.net/def/crs/EPSG/0/61786405http://www.opengis.net/def/crs/EPSG/0/61796405http://www.opengis.net/def/crs/EPSG/0/61806405http://www.opengis.net/def/crs/EPSG/0/61806413http://www.opengis.net/def/crs/EPSG/0/61816405http://www.opengis.net/def/crs/EPSG/0/61826405http://www.opengis.net/def/crs/EPSG/0/61836405http://www.opengis.net/def/crs/EPSG/0/61846405http://www.opengis.net/def/crs/EPSG/0/61886405http://www.opengis.net/def/crs/EPSG/0/61896405http://www.opengis.net/def/crs/EPSG/0/61896413http://www.opengis.net/def/crs/EPSG/0/61906405http://www.opengis.net/def/crs/EPSG/0/61906413http://www.opengis.net/def/crs/EPSG/0/61916405http://www.opengis.net/def/crs/EPSG/0/61926405http://www.opengis.net/def/crs/EPSG/0/61936405http://www.opengis.net/def/crs/EPSG/0/61946405http://www.opengis.net/def/crs/EPSG/0/61956405http://www.opengis.net/def/crs/EPSG/0/61966405http://www.opengis.net/def/crs/EPSG/0/61976405http://www.opengis.net/def/crs/EPSG/0/61986405http://www.opengis.net/def/crs/EPSG/0/61996405http://www.opengis.net/def/crs/EPSG/0/62006405http://www.opengis.net/def/crs/EPSG/0/62016405http://www.opengis.net/def/crs/EPSG/0/62026405http://www.opengis.net/def/crs/EPSG/0/62036405http://www.opengis.net/def/crs/EPSG/0/62046405http://www.opengis.net/def/crs/EPSG/0/62056405http://www.opengis.net/def/crs/EPSG/0/62066405http://www.opengis.net/def/crs/EPSG/0/62076405http://www.opengis.net/def/crs/EPSG/0/62086405http://www.opengis.net/def/crs/EPSG/0/62096405http://www.opengis.net/def/crs/EPSG/0/62106405http://www.opengis.net/def/crs/EPSG/0/62116405http://www.opengis.net/def/crs/EPSG/0/62126405http://www.opengis.net/def/crs/EPSG/0/62136405http://www.opengis.net/def/crs/EPSG/0/62146405http://www.opengis.net/def/crs/EPSG/0/62156405http://www.opengis.net/def/crs/EPSG/0/62166405http://www.opengis.net/def/crs/EPSG/0/62186405http://www.opengis.net/def/crs/EPSG/0/62196405http://www.opengis.net/def/crs/EPSG/0/62206405http://www.opengis.net/def/crs/EPSG/0/62216405http://www.opengis.net/def/crs/EPSG/0/62226405http://www.opengis.net/def/crs/EPSG/0/62236405http://www.opengis.net/def/crs/EPSG/0/62246405http://www.opengis.net/def/crs/EPSG/0/62256405http://www.opengis.net/def/crs/EPSG/0/62276405http://www.opengis.net/def/crs/EPSG/0/62296405http://www.opengis.net/def/crs/EPSG/0/62306405http://www.opengis.net/def/crs/EPSG/0/62316405http://www.opengis.net/def/crs/EPSG/0/62326405http://www.opengis.net/def/crs/EPSG/0/62336405http://www.opengis.net/def/crs/EPSG/0/62366405http://www.opengis.net/def/crs/EPSG/0/62376405http://www.opengis.net/def/crs/EPSG/0/62386405http://www.opengis.net/def/crs/EPSG/0/62396405http://www.opengis.net/def/crs/EPSG/0/62406405http://www.opengis.net/def/crs/EPSG/0/62416405http://www.opengis.net/def/crs/EPSG/0/62426405http://www.opengis.net/def/crs/EPSG/0/62436405http://www.opengis.net/def/crs/EPSG/0/62446405http://www.opengis.net/def/crs/EPSG/0/62456405http://www.opengis.net/def/crs/EPSG/0/62466405http://www.opengis.net/def/crs/EPSG/0/62476405http://www.opengis.net/def/crs/EPSG/0/62486405http://www.opengis.net/def/crs/EPSG/0/62496405http://www.opengis.net/def/crs/EPSG/0/62506405http://www.opengis.net/def/crs/EPSG/0/62516405http://www.opengis.net/def/crs/EPSG/0/62526405http://www.opengis.net/def/crs/EPSG/0/62536405http://www.opengis.net/def/crs/EPSG/0/62546405http://www.opengis.net/def/crs/EPSG/0/62556405http://www.opengis.net/def/crs/EPSG/0/62566405http://www.opengis.net/def/crs/EPSG/0/62576405http://www.opengis.net/def/crs/EPSG/0/62586405http://www.opengis.net/def/crs/EPSG/0/62586413http://www.opengis.net/def/crs/EPSG/0/62596405http://www.opengis.net/def/crs/EPSG/0/62616405http://www.opengis.net/def/crs/EPSG/0/62626405http://www.opengis.net/def/crs/EPSG/0/62636405http://www.opengis.net/def/crs/EPSG/0/62646405http://www.opengis.net/def/crs/EPSG/0/62656405http://www.opengis.net/def/crs/EPSG/0/62666405http://www.opengis.net/def/crs/EPSG/0/62676405http://www.opengis.net/def/crs/EPSG/0/62686405http://www.opengis.net/def/crs/EPSG/0/62696405http://www.opengis.net/def/crs/EPSG/0/62706405http://www.opengis.net/def/crs/EPSG/0/62716405http://www.opengis.net/def/crs/EPSG/0/62726405http://www.opengis.net/def/crs/EPSG/0/62736405http://www.opengis.net/def/crs/EPSG/0/62746405http://www.opengis.net/def/crs/EPSG/0/62756405http://www.opengis.net/def/crs/EPSG/0/62766405http://www.opengis.net/def/crs/EPSG/0/62776405http://www.opengis.net/def/crs/EPSG/0/62786405http://www.opengis.net/def/crs/EPSG/0/62796405http://www.opengis.net/def/crs/EPSG/0/62806405http://www.opengis.net/def/crs/EPSG/0/62816405http://www.opengis.net/def/crs/EPSG/0/62826405http://www.opengis.net/def/crs/EPSG/0/62836405http://www.opengis.net/def/crs/EPSG/0/62836413http://www.opengis.net/def/crs/EPSG/0/62846405http://www.opengis.net/def/crs/EPSG/0/62856405http://www.opengis.net/def/crs/EPSG/0/62866405http://www.opengis.net/def/crs/EPSG/0/62886405http://www.opengis.net/def/crs/EPSG/0/62896405http://www.opengis.net/def/crs/EPSG/0/62926405http://www.opengis.net/def/crs/EPSG/0/62936405http://www.opengis.net/def/crs/EPSG/0/62956405http://www.opengis.net/def/crs/EPSG/0/62976405http://www.opengis.net/def/crs/EPSG/0/62986405http://www.opengis.net/def/crs/EPSG/0/62996405http://www.opengis.net/def/crs/EPSG/0/63006405http://www.opengis.net/def/crs/EPSG/0/63016405http://www.opengis.net/def/crs/EPSG/0/63026405http://www.opengis.net/def/crs/EPSG/0/63036405http://www.opengis.net/def/crs/EPSG/0/63046405http://www.opengis.net/def/crs/EPSG/0/63066405http://www.opengis.net/def/crs/EPSG/0/63076405http://www.opengis.net/def/crs/EPSG/0/63086405http://www.opengis.net/def/crs/EPSG/0/63096405http://www.opengis.net/def/crs/EPSG/0/63106405http://www.opengis.net/def/crs/EPSG/0/63116405http://www.opengis.net/def/crs/EPSG/0/63126405http://www.opengis.net/def/crs/EPSG/0/63136405http://www.opengis.net/def/crs/EPSG/0/63146405http://www.opengis.net/def/crs/EPSG/0/63156405http://www.opengis.net/def/crs/EPSG/0/63166405http://www.opengis.net/def/crs/EPSG/0/63176405http://www.opengis.net/def/crs/EPSG/0/63186405http://www.opengis.net/def/crs/EPSG/0/63196405http://www.opengis.net/def/crs/EPSG/0/63226405http://www.opengis.net/def/crs/EPSG/0/63246405http://www.opengis.net/def/crs/EPSG/0/63266405http://www.opengis.net/def/crs/EPSG/0/63266406http://www.opengis.net/def/crs/EPSG/0/63266407http://www.opengis.net/def/crs/EPSG/0/63266408http://www.opengis.net/def/crs/EPSG/0/63266409http://www.opengis.net/def/crs/EPSG/0/63266410http://www.opengis.net/def/crs/EPSG/0/63266411http://www.opengis.net/def/crs/EPSG/0/63266412http://www.opengis.net/def/crs/EPSG/0/63266413http://www.opengis.net/def/crs/EPSG/0/63266414http://www.opengis.net/def/crs/EPSG/0/63266415http://www.opengis.net/def/crs/EPSG/0/63266416http://www.opengis.net/def/crs/EPSG/0/63266417http://www.opengis.net/def/crs/EPSG/0/63266418http://www.opengis.net/def/crs/EPSG/0/63266419http://www.opengis.net/def/crs/EPSG/0/63266420http://www.opengis.net/def/crs/EPSG/0/66006405http://www.opengis.net/def/crs/EPSG/0/66016405http://www.opengis.net/def/crs/EPSG/0/66026405http://www.opengis.net/def/crs/EPSG/0/66036405http://www.opengis.net/def/crs/EPSG/0/66046405http://www.opengis.net/def/crs/EPSG/0/66056405http://www.opengis.net/def/crs/EPSG/0/66066405http://www.opengis.net/def/crs/EPSG/0/66076405http://www.opengis.net/def/crs/EPSG/0/66086405http://www.opengis.net/def/crs/EPSG/0/66096405http://www.opengis.net/def/crs/EPSG/0/66106405http://www.opengis.net/def/crs/EPSG/0/66116405http://www.opengis.net/def/crs/EPSG/0/66126405http://www.opengis.net/def/crs/EPSG/0/66126413http://www.opengis.net/def/crs/EPSG/0/66136405http://www.opengis.net/def/crs/EPSG/0/66146405http://www.opengis.net/def/crs/EPSG/0/66156405http://www.opengis.net/def/crs/EPSG/0/66166405http://www.opengis.net/def/crs/EPSG/0/66186405http://www.opengis.net/def/crs/EPSG/0/66196405http://www.opengis.net/def/crs/EPSG/0/66196413http://www.opengis.net/def/crs/EPSG/0/66206405http://www.opengis.net/def/crs/EPSG/0/66216405http://www.opengis.net/def/crs/EPSG/0/66226405http://www.opengis.net/def/crs/EPSG/0/66236405http://www.opengis.net/def/crs/EPSG/0/66246405http://www.opengis.net/def/crs/EPSG/0/66246413http://www.opengis.net/def/crs/EPSG/0/66256405http://www.opengis.net/def/crs/EPSG/0/66266405http://www.opengis.net/def/crs/EPSG/0/66276405http://www.opengis.net/def/crs/EPSG/0/66276413http://www.opengis.net/def/crs/EPSG/0/66286405http://www.opengis.net/def/crs/EPSG/0/66296405http://www.opengis.net/def/crs/EPSG/0/66306405http://www.opengis.net/def/crs/EPSG/0/66316405http://www.opengis.net/def/crs/EPSG/0/66326405http://www.opengis.net/def/crs/EPSG/0/66336405http://www.opengis.net/def/crs/EPSG/0/66346405http://www.opengis.net/def/crs/EPSG/0/66356405http://www.opengis.net/def/crs/EPSG/0/66366405http://www.opengis.net/def/crs/EPSG/0/66376405http://www.opengis.net/def/crs/EPSG/0/66386405http://www.opengis.net/def/crs/EPSG/0/66396405http://www.opengis.net/def/crs/EPSG/0/66406405http://www.opengis.net/def/crs/EPSG/0/66406413http://www.opengis.net/def/crs/EPSG/0/66416405http://www.opengis.net/def/crs/EPSG/0/66426405http://www.opengis.net/def/crs/EPSG/0/66436405http://www.opengis.net/def/crs/EPSG/0/66446405http://www.opengis.net/def/crs/EPSG/0/66456405http://www.opengis.net/def/crs/EPSG/0/66456413http://www.opengis.net/def/crs/EPSG/0/66466405http://www.opengis.net/def/crs/EPSG/0/66576405http://www.opengis.net/def/crs/EPSG/0/66586405http://www.opengis.net/def/crs/EPSG/0/66596405http://www.opengis.net/def/crs/EPSG/0/66596413http://www.opengis.net/def/crs/EPSG/0/66606405http://www.opengis.net/def/crs/EPSG/0/66616405http://www.opengis.net/def/crs/EPSG/0/66616413http://www.opengis.net/def/crs/EPSG/0/66636405http://www.opengis.net/def/crs/EPSG/0/66646405http://www.opengis.net/def/crs/EPSG/0/66656405http://www.opengis.net/def/crs/EPSG/0/66666405http://www.opengis.net/def/crs/EPSG/0/66676405http://www.opengis.net/def/crs/EPSG/0/68016405http://www.opengis.net/def/crs/EPSG/0/68026405http://www.opengis.net/def/crs/EPSG/0/68036405http://www.opengis.net/def/crs/EPSG/0/68046405http://www.opengis.net/def/crs/EPSG/0/68056405http://www.opengis.net/def/crs/EPSG/0/68066405http://www.opengis.net/def/crs/EPSG/0/68086405http://www.opengis.net/def/crs/EPSG/0/68096405http://www.opengis.net/def/crs/EPSG/0/68136405http://www.opengis.net/def/crs/EPSG/0/68146405http://www.opengis.net/def/crs/EPSG/0/68156405http://www.opengis.net/def/crs/EPSG/0/68186405http://www.opengis.net/def/crs/EPSG/0/68206405http://www.opengis.net/def/crs/EPSG/0/69036405http://www.opengis.net/def/crs/EPSG/0/404000http://www.opengis.net/def/crs/EPSG/0/102113http://www.opengis.net/def/crs/EPSG/0/42302http://www.opengis.net/def/crs/EPSG/0/42301http://www.opengis.net/def/crs/EPSG/0/54009http://www.opengis.net/def/crs/EPSG/0/900913http://www.opengis.net/def/crs/EPSG/0/45556http://www.opengis.net/def/crs/EPSG/0/45555http://www.opengis.net/def/crs/EPSG/0/54004http://www.opengis.net/def/crs/EPSG/0/41001http://www.opengis.net/def/crs/EPSG/0/42311http://www.opengis.net/def/crs/EPSG/0/42310http://www.opengis.net/def/crs/EPSG/0/18001http://www.opengis.net/def/crs/EPSG/0/54012http://www.opengis.net/def/crs/EPSG/0/53029http://www.opengis.net/def/crs/EPSG/0/54029http://www.opengis.net/def/crs/EPSG/0/100003http://www.opengis.net/def/crs/EPSG/0/42106http://www.opengis.net/def/crs/EPSG/0/100002http://www.opengis.net/def/crs/EPSG/0/42105http://www.opengis.net/def/crs/EPSG/0/100001http://www.opengis.net/def/crs/EPSG/0/42309http://www.opengis.net/def/crs/EPSG/0/42104http://www.opengis.net/def/crs/EPSG/0/42308http://www.opengis.net/def/crs/EPSG/0/42103http://www.opengis.net/def/crs/EPSG/0/42307http://www.opengis.net/def/crs/EPSG/0/42102http://www.opengis.net/def/crs/EPSG/0/42306http://www.opengis.net/def/crs/EPSG/0/42101http://www.opengis.net/def/crs/EPSG/0/42305http://www.opengis.net/def/crs/EPSG/0/42304http://www.opengis.net/def/crs/EPSG/0/42303http://www.opengis.net/def/interpolation/OGC/1/nearest-neighborhttp://www.opengis.net/def/interpolation/OGC/1/linearhttp://www.opengis.net/def/interpolation/OGC/1/cubicsmartsea__eusm2016RectifiedGridCoverage17.475602613769112 58.781311815855325.816386818370457 65.8500230503874561600.0 6540600.0432000.0 7304000.0smartsea__eusm2016-EPSG2393RectifiedGridCoverage17.476423085843237 58.7814874118187425.81728699126928 65.850203673623613061592.6391462097 6543350.3810893353432141.361396798 7307056.899896299smartsea__southRectifiedGridCoverage17.750846897764713 59.4022172977940832.07494665128107 65.0694980711167461619.99999999983 6610360.0739199.9999999999 7217020.0gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-ArcGIS-1.1.2.xml0000644003401500001440000000431113614005403024576 0ustar rouaultusers Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 2 0 0 24099 34818 61676.038377249904 6605831.1432084311 543676.03837724985 7302211.1432084311 urn:ogc:def:crs:EPSG::3067 61686.038377249904 7302201.1432084311 19.999999999999996 -20 Field_1 Field_1 Field_1 nearest linear cubic 1 urn:ogc:def:crs:EPSG::3067 urn:ogc:def:crs:EPSG::4326 image/GeoTIFF image/NITF image/HDF image/JPEG2000 image/PNG gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.1-non_scaled.tiff0000644003401500001440000000465613614004466024516 0ustar rouaultusersII*(S   &  V   HHү!q?د!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.0-non_scaled.tiff0000644003401500001440000000202513614004466023645 0ustar rouaultusersII*@@S  @ g4@4@'b:@S*[AT#     > )#@TXAr@EUREF_FIN_TM35FIN|GCS Name = GCS_EUREF_FIN|Datum = ETRS_1989|Ellipsoid = GRS_1980|Primem = Greenwich||gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-SimpleGeoServer-1.1.1.xml0000644003401500001440000000475513614005403026614 0ustar rouaultuserseusm2016Generated from GeoTIFFeusm2016WCSGeoTIFFsmartsea:eusm201617.475602613769112 58.781311815855325.816386818370457 65.8500230503874561600.0 6540600.0432000.0 7304000.0urn:ogc:def:crs:EPSG::3067urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs61610.0 7303990.020.0 0.0 0.0 -20.0urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents1.025.0255.0nearestlinearcubicnearest neighborGRAY_INDEXurn:ogc:def:crs:EPSG::3067EPSG:3067image/tiffimage/pngimage/jpeggdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer-1.1.0.xml0000644003401500001440000000522613614005403025433 0ustar rouaultuserseusm2016-EPSG2393Generated from GeoTIFFeusm2016-EPSG2393WCSGeoTIFFsmartsea:eusm2016-EPSG239317.476423085843237 58.7814874118187425.81728699126928 65.850203673623616543350.381089335 3061592.639146217307056.899896299 3432141.3613967984urn:ogc:def:crs:EPSG::2393urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs3061602.643161389 7307046.89588111920.00803035910304 0.0 0.0 -20.00803035910304urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents-InfinityInfinity255.0nearestlinearcubicnearest neighborGRAY_INDEXurn:ogc:def:crs:EPSG::2393EPSG:2393image/pngimage/jpegimage/tifftext/plaingdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.0.0-non_scaled.tiff0000644003401500001440000000200313614004466024471 0ustar rouaultusersII*@@(S  &$V -255G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.0.0.tiff0000644003401500001440000000213113614004466022370 0ustar rouaultusersII*US ` x$ -( WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer2-1.1.1.xml0000644003401500001440000000531713614005403025517 0ustar rouaultuserssouthGenerated from GeoTIFFsouthWCSGeoTIFFsmartsea:south17.750846897764713 59.4022172977940832.07494665128107 65.069498071116746610360.000000002 61619.999999999737217020.000000002 739199.9999999999urn:ogc:def:crs:EPSG::3047urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs61629.99999999983 7217010.020.0 0.0 0.0 -20.0urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents-InfinityInfinity256.0256.0256.0nearestlinearcubicnearest neighborRED_BANDGREEN_BANDBLUE_BANDurn:ogc:def:crs:EPSG::3047EPSG:3047image/pngimage/jpegimage/tifftext/plaingdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-2.0.1.tiff0000644003401500001440000000335413614004466021551 0ustar rouaultusersII*S " :$j ;0 EPSG:3067 image/tiff nearest-neighbor,linear,cubic WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting NONE NONE Velmu_wcs_testi 2.0.1 Band 1 0.0 255.0 band_1 3@4@(b:@S*[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman-2.0.1.tiff0000644003401500001440000000750613614004466022232 0ustar rouaultusersII*: S    "2 0 application/gml+xml,image/jpeg,image/png,image/tiff,image/bmp,image/jp2,application/netcdf,text/csv,application/json,application/dem,application/x-ogc-dted,application/x-ogc-ehdr,application/x-ogc-elas,application/x-ogc-envi,application/x-ogc-ers,application/x-ogc-fit,application/x-ogc-fits,image/gif,application/x-netcdf-gmt,application/x-ogc-gs7bg,application/x-ogc-gsag,application/x-ogc-gsbg,application/x-ogc-gta,application/x-ogc-hf2,application/x-erdas-hfa,application/x-ogc-ida,application/x-ogc-ingr,application/x-ogc-isis2,application/x-erdas-lan,application/x-ogc-mff2,application/x-ogc-nitf,application/x-ogc-paux,application/x-ogc-pcidsk,application/x-ogc-pcraster,application/x-ogc-pdf,application/x-ogc-pnm,text/x-r,application/x-ogc-rmf,image/x-sgi,application/x-ogc-vrt,image/xpm,application/x-ogc-zmap http://www.opengis.net/def/interpolation/OGC/1.0/nearest-neighbor GMLCOV/1.0/conf/gml,GMLCOV/1.0/conf/gml-coverage,WCS_coverage-encoding_geotiff/1.0/,GMLJP2/2.0/,WCS_coverage-encoding_jpeg2000/1.0/,https://www.ietf.org/rfc/rfc4180.txt,https://www.www.json.org/,https://www.w3.org/Graphics/JPEG/,http://www.w3.org/TR/PNG/,WCS_coverage-encoding_netcdf/1.0/,GMLCOV/1.0/conf/multipart,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_processing/2.0/conf/processing,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_soap/1.0,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_transaction/2.0/conf/insert+delete,WCS_service-extension_crs/1.0/conf/crs rasdaman server - free download from www.rasdaman.org rasdaman Jacobs University Bremen http://rasdaman.org/ Bremen Germany Campus Ring 1 p.baumann@jacobs-university.de 28717 +49 421 20040 Prof. Dr. Peter Baumann Project Leader pointOfContact 2.0.1 Red Undefined Green Undefined Blue Undefined {Gz?{Gz?fV@#  mtr@@TXAWGS 84|1100gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.0-scaled.tiff0000644003401500001440000006074213614004466023641 0ustar rouaultusersII*<x-S    * j z   &-L OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.0 Undefined Undefined Undefined sVU?sVU? Bh#@DIVIVIV.3+[&(&"'$ !##TIVIVIV*<)@+a)'"$ !    0AinIVIV3(,=+])'!#!! #"fm 5",3+M*~(#"!! ejAM-,+=+])&#!!  1%0A /3.G*y%"!!  r"@*4D%+C*Z')#!!  "i)/HW.+H*m( !   !'*/,5+L*y($! '7P0y|FS9%O*y(! /'<,?O>+j%  ('G*x /3*-+Q'"E&,<(   1+]" !#*H'  $0)>'  +4.(h %3;-")["  @L3(##/ ΰ >)O% B 2) 6?8()x !  N=.+$5 p_T 3+gi[_gE[)YPE?N"x, SZ:+$iPJ*9E*LGHu   4W)%~|W8%?PH9=+)f)#ioD ~.=.U ev]suOlz{x)C,;C7. IZ V; 4v01f5 /!f E^g>"|TC cx k1L]1>(` ,T,3M4 e491>?7J!`ҽLB2F "IV ݑ}Y0DW8WM/6B6r$X5]\ a5D ݘɛJ~&!)0[6*V33 6x |ڗ]>EDwi/ưcz Ťd:3!4[9hs3 x ~wy Xn?f .A>'F{y{, cr)+ s9<8 ԡ N1M63{D 37k]1ف3@,( F3 1:z3 Ei3xOf!~#1.@fK^  (oq/CA38v3 AunXl8ak ֻ/  5tZovi[:;^K9J btP//,KME>J );~6 %/9@J JC6!.Y~g3.0n"(ZR*ڳ#/n\+cVo}D}*.W-8b   ]r  8> {     MC14LV]-0E Gbq  jjl to%U7g33r ueXkjBOo  ~6Aqhz {Q&+5="+"+   {E^RQVD:OU35mbk &53 ~ ݜp k(cZ7@D^(c!8L{X}|05 z&$+lN9N6; N475 EP ZCP7=6=J @6{NFL{|35N]q3V^x*5#Ir+0 y(-#,2  _?BB44 *54.L5927N  |:C9A7A;g8P"7pQhCp (3  {   ~ur`>PKR++h GK8Y!!]67?N?x592:_ ^H;)R-A7 +:Ty8Z\5 a61    ~k +1 6<%*x"'S RE J>9C!!]X8Y33yJ/1H>4%AT u39 r/7(=3[4(W0B a"K{veZ5s%    +1}xmg$'KCg' 3 D16N--j-22}7B(&&b@##_-0WD7<  # ,j 66̏vl.G2BNF    >V1*4vQS{H(E: w9` %  9A  }xxl6:zUYJP F G F4BL z&)?V3AY ZSqegp c8@9AG6?v Y6~%7s>|D ?:}#j  3kw} %*_U$&Q((fLOR3>V#. C. H..j33p@**tDC24a r174fd O:{|7bSOaz$*,2{ ] q]Qh') R?IL""^2U=MNP D X6/ EV4 C%%bUd;!(`5:SF20;,K Ic57UL9Vgw057<39H{6<5:B/1Pv3547_XQ$$l?//kU..k33u<E=5N7 D,,iOMM22~ TG)M%IP!!l\#%y02Z- |jj5.3$ 39 xs28f" i58Q WH P##g*+xA;!!_S MB NQSG**f \811n^,,u'(y3U \ FZA_v8> $&WKV5H |!-h ', "!&5:4;!.3t/8 ;mN346; "%CA+0)-Y$%t-6G18L93%NK9L EA9[U7=7AY7&'xIO a'  $* ,1#+q)/6<7= %") wl5:9A9A~-? h*+xA476<NE?<H""^4**g8>&T3402--jIR?7= >%0QDHAS=&e lw  !' 7=}7=k6A9B#,)1188AA9 &'Sp   -p7L34`G2Y F33p r k35$$bS6..m  P9EB$%w "u "y0B) 284; 3; x;E:C/J":D +17=495:"+ fS+b@35 [eX')13"$)38I8W 4WAf#$r35|),Z< +128,38>079A7.0466;UW02B:C 7@ {35 r" \Y4:Y.3166;") ;E;E  -5 (17@(4fr^n' 'D~i;g  ):C*C:T$:C9p !`0;>/[!+$4;F $+%+6;8s  [27-5 -  06 *2:D;F` k  5<9B:DaА{-55y%E:g.\4L%Z"3`_.t$ Թ YO-z/ 2Lq3+ ".tR4Z | ;N &0 1<H776*%>3(t 4y.YO:w85X̂kJ4H>ufKSj;Sɍ3,9rOrbK,4WwG 6h9U.-N7 -S&(yIY>J?9%\(?LRo&p8.}7636".9M5;4;ri{xjLLO3-e$17 Rm\qRF26&ctdfxs==) {c!aZs" 85?#c383Y9(Bonw * #/665450t< TXQnk\MBD1V!!B?=] n:53333=cʏ34 7o3@:4j1/,+.3'XRgK2QM4!lPI6[LE0A4C<3M@qs3_\Z+skW3_]Z%3WhT"34E33=82IgT3Mr4Vd5y1%_J#YRTNf_xlk3(iNO$JWej8 یb3U55B87:=qX;:;D΋x$-BG3sXNv)A2Ce|4}45W%b;>GG;3tF,D:΍{',aT32,5WkdXkeO<6,Yhb;Rlx6DXS 330 <y tD Z?NDJOQ\^st?3X0/ Θ8)om3, .qSjCOw~cNs333)33@Λ*j/34o3W ,k->M7c6.: Sm33  p33w;8ޥ32 0( `*7,+3:, toֱ3 ')    9C' f3ob$/"$   ^c1.3 /~h'2u'' /f Q^D.'34!0&Os.- 3/|f" 1 D2*)3qvhac   ldRm z &7)+C o$3}\  z..3RR I3IKK!tq XF' &)4[Gd82(:!c\^~cw39_f-H1PUBCB6E_ W{+$4 YG^acj!q ph"fs~ 3xv 9BIk.[+p"L7`7^:B88=0Y4C13ju "NOAlI.dZGM in6XG!2 -v t>FP4(b&x$x$~/YE4}  v@ %qm !}xjWSQ3WbS)8VS"װ>X*NqI3@@`w(M'Pgܧ٫%␃i "Q$ .<"!_-?$xЃIP9RQeZcg]o9a4M#.T~  %% uWnAQ)0;R/U'K +.TZ8[@3aUe#܅>PK6 f% #32\J1v}wؔ+ r&bLQO8#A yp%m C8Kygp\    3eD1E>92d$؀4JOK|{i)y*OJ{&Z O afEW7\/^s ȏ3 !$$$& ,3 3G0(!ĕzi/7i2?E/e%߂;XZ)K~-Z$4,!+/25"3  /xI-%Oe=F96WJLiy|e]LC2v9H>F"2_ )&%h33D3b`OV֋`t_VXM_W=H3_* ;J2P! ,-,"04˜1;FDAbYfZgXc^>oMV@9t q  ' 656*%mqjoIrn?vXVz~g\dTaNcK^1fl|xI BL!! ""##(3@  y [ _@H9l&|$n.`E>ODaU*)(  "#%%%#!# )33W 1d`fn}bZ^UbYcX`Rk7^ejp!"$##'$$$!'$$! && .K`ginkn_WbYbYbYcVbAZ"^n& w,))%(&#""%%"%!!!,y[W T0[LbX_VbYbYbYbY^UaNX6V$_bnx{HR(f).*,(%$#"!%% &)& ^[V3XM^V[TWN[T`W[S\QO@J5M,TZ kbIV%8?+N-N-P-j)'&$#%%%%%%%%% dil,f=w_`T`\_]^Z]YZV[V^YbYL8h6k$t*EQIV5F,-.3+?+H*Z)|&$! %%%"!!!  4))6?LSaaev`_V`YyhU6+gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.1-scaled.tiff0000644003401500001440000002362413614004466023717 0ustar rouaultusersII*<--S $ <$l $1256 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Undefined Undefined Undefined Đ@q@AYA#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|                               `46T23Q!R  &"U Qdlh95l2/}o%,)sh % X&l&%a+ w                               MP(%`-.N..XYM #0-S  a1 u#6ZRv:>Z u**[%k2%u                Y[9            XV'j<9i40nk` &*!`  d){=/!X`/1&A=`3#V                                /.aQ56P& ZZ&a  ! D@u(R v " K49]d Z`g4#FD'c                              &%^;;&# &("Z&Z'a &!Y):&ik"n!o_(-2=M(!f)'c-x"`42t                               <A\)q$#    & " I"]1'$ dh&1 ].*S2/W3&)x)M* ++1(u#\6Kn'c N**                  ""y,([Z" # &' *-!hD>&!N-)d+&^(h u#jJB}-RR]1 85T+ & lm(u??a v#U1!                      (w&Q 22! ! # %'D!^!6,'(%p&daM,#k"V ABAq-!qF@q0+Y, .#fC"=9n-*_#-G.!             amd )%       #U\;  $\35T c'T&,+Qa+)hCB8|+#Z3 ) h,Pd.$e/* *                )u]e8      1&<]CC<! )(  %B(&   0MQF # W^K (* " %# 1#) 6"  K=y     %}f 76^  &} s0'n  >-` 2&w h  8%  ! " % ! 0+6(,C# 2          "U{!V :6j '|  3'N*z  #r  %y#6#hlA4T;;S% % ' 3!#c%        "Q&d     )t:&*, 73C? +x, ,        $X          -.L!YQ#    LPJ.%;5i ' { %g%3 $0"H v BC  "NMKQL%#Z        T'#a   ^c93(w85o1,. &k ' #   *w)A  # %m    X   ++OE&$W          $ )$`   "r"m9$i,0 .4    +* H8}e#:%)h%|        " &H9K D@u l  `+#r"m   d(  k( (  ;*H S      46Q 11T%)%a!t          z G TC:* y r o   ) n )$cU          &m);!w z v[#(h    g  !3   x -*n                  A6~-{   t" ! * ,  b"FK^2& t 66]e            #UQI{    })  =3`)!.,z  )#@TXAr@EUREF_FIN_TM35FIN|GCS Name = GCS_EUREF_FIN|Datum = ETRS_1989|Ellipsoid = GRS_1980|Primem = Greenwich||gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-2.0.1.tiff0000644003401500001440000002140013614004466023544 0ustar rouaultusersII*"S 6" N"$~" ""O!0 EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 GRAY_INDEX 1.0 25.0 GRAY_INDEX 4@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-ArcGIS-1.1.1.xml0000644003401500001440000001514713614005403024443 0ustar rouaultusers Velmu_wcs_testi WCS 1.0.0 1.1.0 1.1.1 1.1.2 NONE NONE WCS 1.0.0 1.1.0 1.1.1 1.1.2 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 nearest bilinear bicubic image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF False True Näkinpartaisniityt_1 17.483058091685201 59.36197532178339 27.956287922334681 65.841210879037476 1 Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 2 Avoimuusindeksi merenpohjalla_3 17.483058091685201 58.78220036767393 27.956287922334681 65.841210879037476 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3067 image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer-1.0.0.xml0000644003401500001440000000522613614005403025432 0ustar rouaultusersGenerated from GeoTIFFsmartsea:eusm2016-EPSG2393eusm2016-EPSG239317.476423085843237 58.7814874118187425.81728699126928 65.85020367362361eusm2016-EPSG2393WCSGeoTIFF3061592.6391462097 6543350.3810893353432141.361396798 7307056.8998962990 018519 38169YX3061602.643161389 7307046.89588111920.00803035910304 0.00.0 -20.00803035910304eusm2016-EPSG2393eusm2016-EPSG2393BandBand1EPSG:2393ArcGridGeoTIFFGIFGtopo30ImageMosaicJPEGPNGTIFFnearest neighborbilinearbicubicgdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-MapServer-1.1.2.xml0000644003401500001440000004261313614005403025276 0ustar rouaultusers BGS EMODnet bathymetry The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. OneGeology infoCoverageAccessService Europe EMODnet Bathymetry MD_LANG@ENG MD_DATE@2015-04-14 OGC WCS 2.0.1 1.1.1 1.0.0 none none British Geological Survey (BGS) Mr Matthew Harrison Science Director Informatics +44 (0)115 936 3100 +44 (0)115 936 3200 Environmental Science Centre Keyworth Nottinghamshire NG12 5GG United Kingdom enquiries@bgs.ac.uk Mon-Fri, 09:00-17:00 pointOfContact WCS 1.1.2 WCS 1.1.2 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol WCS 1.1.2 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol NEAREST_NEIGHBOUR BILINEAR image/png image/x-aaigrid image/jpeg image/png; mode=8bit image/tiff false urn:ogc:def:crs:epsg::4326 European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CentralMed-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Aegean Sea and Levantine Sea 22.23541667 30.39790787 36.73542827 41.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_AegeanLevantineSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Bay of Biscay and Iberian Coast -26.11458333 32.58123877 -0.489562830000001 46.61458333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_BayBiscayIberianCoast-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Celtic Seas -26.11458333 46.61456967 -0.489562830000001 63.69791667 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CelticSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Greater North Sea -0.48958333 48.8104034 13.76042807 65.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_GreaterNorthSea-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Western Mediterranean -0.48958333 35.21874234 9.83125826 44.78958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_WesternMed-MCol gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.1-non_scaled.tiff0000644003401500001440000000202513614004466023646 0ustar rouaultusersII*@@S  @ g4@4@'b:@S*[AT#     > )#@TXAr@EUREF_FIN_TM35FIN|GCS Name = GCS_EUREF_FIN|Datum = ETRS_1989|Ellipsoid = GRS_1980|Primem = Greenwich||gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-2.0.1-scaled.tiff0000644003401500001440000001455413614004466023006 0ustar rouaultusersII*<OOS " :$j ;0 EPSG:3067 image/tiff nearest-neighbor,linear,cubic WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting NONE NONE Velmu_wcs_testi 2.0.1 Band 1 0.0 255.0 band_1 s@Js@JN AS*ԸZA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|ccKccccccccKKKKKKcKKccKKKccKKKccKKcKccKcccKKKKccKKKccKKcKKKccKcKKKKKcccKccKKKcKKccccKKKKcKKcKKccccKKKcKcKcKcKKKccKKKKKcccKccccKccKKKKccKKKcKKccKKKKKKKKKKKKccKKcKKKKccKKKccKKccccKKKKccKKKcKKKKKKKccccKKKKKKKKKKKKKKKccccccKKKKKKKKKKKKKcKcKccKccKKKKKKKKKKKKKcKKcccKKKKKKKKKKKcKcccccccKKKKKKKKKKKccKKcccKKKKKKKKKKKKKcccccccKKKKKKKKKKKKKKKKccccKKKKKKKKKKKKKccccccKKKKKKKKKKKKKKccccKcKcKKKKKKKKKKKKKcKKccccccKcKKKKKcKKKKKKKKKKKKKcccccKcKKKKKKKKKKKKKKKKKKcKKKKKcccKccKcKKKKKKKKKKKKKKKKKccKKKKcccccccccccKKKKKKKKKKKKKKKKKccKKKcccKcccKKcccKKKKKKKKKKKKKKKcKKKKKKKcccccKKccKKKKKKKKKcKKKKKKKcccKKKKcccccKcccKKKKKKKKKKKKKKKccccKKKccccccKcccKKKKKKccKKKKKKKKKcccccKKccccccKcccccccKKKKKKKKcKKKcccKKKKccccKccccccccKKKKKKKKcKKcKKcccccccccccccKKKKKKKKKcKKKKKKKKcKccccccKccKKKKKKKKKKcKKKKKKKKKKKKcKccccKKccKKKKKKKKKcKKKKKKcKKKKKcccKccKKKKKKKKKKKcKcKKKKcKKKKcccccKcKKKKKKKKKKKKKKKKKccKKKKcccccKKcKcKKKKKKKKccKKKKKKKKcKKccccKKcKcKKKKKKKKcKKKKKKKKKKKcKcKKKKcccccKKKKKKKKKKKKKKccKccccKKKccKccKKKKKKKKKKKKKKcKccccKKccccKKKKKKKKKKKKKKKKcKKccccKcccccKKKKKKKKKKKKKKKcccccccccccccKKKKKKKKKKKKccccccccccccccKKKKKKKKKKKKKKKcccccccccccKKKKKKKKKKKKKcccKccKcKcKKKKKKKKKKKKKKKcKKKKKKKKKKKKKcKKKKKKKKKcKKKKKKKKKKKKcKKKKKcKKKKKKKKKKcKcKKKKKKKKKKKKcKKKKKcKKKKKKKKcKKKccKKKKKKKKcKKKKKKKKKcKKKKKcKKcKKKKKKKKKccKKKKKKKKcKKKKKKKKKccKcccKKKKKKccKcKKccKcccKcKcKccccccKccccKKccKccKcKKccccKcKKcKKcKKKKKcKcccKcKKKcKKKKcKccKKKKKKKcKcccKccKKKccKKKccKKKKKKKKcKKKKKKKKcKKKKKKKKKccKKKKcKKKKcccKccccKKKKKKKKcccKccKKKKKKKKKKcccccKcKKKcccKKcKKKcccccKcKKKKcccKKKKKcKKKKcKKKKKcKccKKKccccccccKKcccKKKKKKKKcccccccccccKcKccKcKKcccccccKccccKKKKKKKccKKKcccccccccccKKKcKKKcKKKccccccKcccccccKKKKKKKcKcccccccccccccccKcKKKKKcKKcKKcccccccccccKcKKKKKKcKgdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.0-non_scaled.tiff0000644003401500001440000000465613614004466024515 0ustar rouaultusersII*(S   &  V   HHү!q?د!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer2-1.1.0.xml0000644003401500001440000000531713614005403025516 0ustar rouaultuserssouthGenerated from GeoTIFFsouthWCSGeoTIFFsmartsea:south17.750846897764713 59.4022172977940832.07494665128107 65.069498071116746610360.000000002 61619.999999999737217020.000000002 739199.9999999999urn:ogc:def:crs:EPSG::3047urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs61629.99999999983 7217010.020.0 0.0 0.0 -20.0urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents-InfinityInfinity256.0256.0256.0nearestlinearcubicnearest neighborRED_BANDGREEN_BANDBLUE_BANDurn:ogc:def:crs:EPSG::3047EPSG:3047image/pngimage/jpegimage/tifftext/plaingdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-ArcGIS-1.0.0.xml0000644003401500001440000000664413614005403024443 0ustar rouaultusers Velmu_wcs_testi
NONE NONE
application/vnd.ogc.se_xml 1 17.483058091685201 59.36197532178339 27.956287922334681 65.841210879037476 2 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 3 17.483058091685201 58.78220036767393 27.956287922334681 65.841210879037476
gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-SimpleGeoServer-1.1.0.xml0000644003401500001440000000475513614005403026613 0ustar rouaultuserseusm2016Generated from GeoTIFFeusm2016WCSGeoTIFFsmartsea:eusm201617.475602613769112 58.781311815855325.816386818370457 65.8500230503874561600.0 6540600.0432000.0 7304000.0urn:ogc:def:crs:EPSG::3067urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs61610.0 7303990.020.0 0.0 0.0 -20.0urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents1.025.0255.0nearestlinearcubicnearest neighborGRAY_INDEXurn:ogc:def:crs:EPSG::3067EPSG:3067image/tiffimage/pngimage/jpeggdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.2-non_scaled.tiff0000644003401500001440000000202513614004466023647 0ustar rouaultusersII*@@S  @ g4@4@'b:@S*[AT#     > )#@TXAr@EUREF_FIN_TM35FIN|GCS Name = GCS_EUREF_FIN|Datum = ETRS_1989|Ellipsoid = GRS_1980|Primem = Greenwich||gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer-1.1.1.xml0000644003401500001440000000522613614005403025434 0ustar rouaultuserseusm2016-EPSG2393Generated from GeoTIFFeusm2016-EPSG2393WCSGeoTIFFsmartsea:eusm2016-EPSG239317.476423085843237 58.7814874118187425.81728699126928 65.850203673623616543350.381089335 3061592.639146217307056.899896299 3432141.3613967984urn:ogc:def:crs:EPSG::2393urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs3061602.643161389 7307046.89588111920.00803035910304 0.0 0.0 -20.00803035910304urn:ogc:def:cs:OGC:0.0:Grid2dSquareCScontents-InfinityInfinity255.0nearestlinearcubicnearest neighborGRAY_INDEXurn:ogc:def:crs:EPSG::2393EPSG:2393image/pngimage/jpegimage/tifftext/plaingdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.2-scaled.tiff0000644003401500001440000001252013614004466022776 0ustar rouaultusersII*<OOS  $N + NONE NONE Velmu_wcs_testi 1.1.2 s@Js@JN AS*ԸZA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|ccKccccccccKKKKKKcKKccKKKccKKKccKKcKccKcccKKKKccKKKccKKcKKKccKcKKKKKcccKccKKKcKKccccKKKKcKKcKKccccKKKcKcKcKcKKKccKKKKKcccKccccKccKKKKccKKKcKKccKKKKKKKKKKKKccKKcKKKKccKKKccKKccccKKKKccKKKcKKKKKKKccccKKKKKKKKKKKKKKKccccccKKKKKKKKKKKKKcKcKccKccKKKKKKKKKKKKKcKKcccKKKKKKKKKKKcKcccccccKKKKKKKKKKKccKKcccKKKKKKKKKKKKKcccccccKKKKKKKKKKKKKKKKccccKKKKKKKKKKKKKccccccKKKKKKKKKKKKKKccccKcKcKKKKKKKKKKKKKcKKccccccKcKKKKKcKKKKKKKKKKKKKcccccKcKKKKKKKKKKKKKKKKKKcKKKKKcccKccKcKKKKKKKKKKKKKKKKKccKKKKcccccccccccKKKKKKKKKKKKKKKKKccKKKcccKcccKKcccKKKKKKKKKKKKKKKcKKKKKKKcccccKKccKKKKKKKKKcKKKKKKKcccKKKKcccccKcccKKKKKKKKKKKKKKKccccKKKccccccKcccKKKKKKccKKKKKKKKKcccccKKccccccKcccccccKKKKKKKKcKKKcccKKKKccccKccccccccKKKKKKKKcKKcKKcccccccccccccKKKKKKKKKcKKKKKKKKcKccccccKccKKKKKKKKKKcKKKKKKKKKKKKcKccccKKccKKKKKKKKKcKKKKKKcKKKKKcccKccKKKKKKKKKKKcKcKKKKcKKKKcccccKcKKKKKKKKKKKKKKKKKccKKKKcccccKKcKcKKKKKKKKccKKKKKKKKcKKccccKKcKcKKKKKKKKcKKKKKKKKKKKcKcKKKKcccccKKKKKKKKKKKKKKccKccccKKKccKccKKKKKKKKKKKKKKcKccccKKccccKKKKKKKKKKKKKKKKcKKccccKcccccKKKKKKKKKKKKKKKcccccccccccccKKKKKKKKKKKKccccccccccccccKKKKKKKKKKKKKKKcccccccccccKKKKKKKKKKKKKcccKccKcKcKKKKKKKKKKKKKKKcKKKKKKKKKKKKKcKKKKKKKKKcKKKKKKKKKKKKcKKKKKcKKKKKKKKKKcKcKKKKKKKKKKKKcKKKKKcKKKKKKKKcKKKccKKKKKKKKcKKKKKKKKKcKKKKKcKKcKKKKKKKKKccKKKKKKKKcKKKKKKKKKccKcccKKKKKKccKcKKccKcccKcKcKccccccKccccKKccKccKcKKccccKcKKcKKcKKKKKcKcccKcKKKcKKKKcKccKKKKKKKcKcccKccKKKccKKKccKKKKKKKKcKKKKKKKKcKKKKKKKKKccKKKKcKKKKcccKccccKKKKKKKKcccKccKKKKKKKKKKcccccKcKKKcccKKcKKKcccccKcKKKKcccKKKKKcKKKKcKKKKKcKccKKKccccccccKKcccKKKKKKKKcccccccccccKcKccKcKKcccccccKccccKKKKKKKccKKKcccccccccccKKKcKKKcKKKccccccKcccccccKKKKKKKcKcccccccccccccccKcKKKKKcKKcKKcccccccccccKcKKKKKKcKgdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-MapServer-1.1.0.xml0000644003401500001440000000717313614005404025442 0ustar rouaultusers European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean BGS_EMODNET_CentralMed-MCol 0 0 2976 3882 30.01040372 9.83125 46.18958333 22.23542659 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:method:WCS:1.1:2dSimpleGrid 9.833333335 46.187499995 0.00416667 -0.00416667 urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS Red/Green/Blue colour interpretations band bilinear nearest neighbor 1 2 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-MapServer-2.0.1.xml0000644003401500001440000002132613614005404025274 0ustar rouaultusers BGS EMODnet bathymetry The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. OneGeology infoCoverageAccessService Europe EMODnet Bathymetry MD_LANG@ENG MD_DATE@2015-04-14 OGC WCS 2.0.1 1.1.1 1.0.0 http://www.opengis.net/spec/WCS/2.0/conf/core http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0/conf/get-kvp http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0/conf/post-xml http://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coverage http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart http://www.opengis.net/spec/GMLCOV/1.0/conf/special-format http://www.opengis.net/spec/GMLCOV_geotiff-coverages/1.0/conf/geotiff-coverage http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs http://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scaling http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsetting http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation none none British Geological Survey (BGS) Mr Matthew Harrison Science Director Informatics +44 (0)115 936 3100 +44 (0)115 936 3200 Environmental Science Centre Keyworth Nottinghamshire NG12 5GG United Kingdom enquiries@bgs.ac.uk Mon-Fri, 09:00-17:00 pointOfContact XML XML XML image/png image/x-aaigrid image/jpeg image/png; mode=8bit image/tiff NEAREST AVERAGE BILINEAR http://www.opengis.net/def/crs/EPSG/0/4326 http://www.opengis.net/def/crs/EPSG/0/3031 http://www.opengis.net/def/crs/EPSG/0/3034 http://www.opengis.net/def/crs/EPSG/0/3413 http://www.opengis.net/def/crs/EPSG/0/3857 http://www.opengis.net/def/crs/EPSG/0/4258 BGS_EMODNET_CentralMed-MCol RectifiedGridCoverage BGS_EMODNET_AegeanLevantineSeas-MCol RectifiedGridCoverage BGS_EMODNET_BayBiscayIberianCoast-MCol RectifiedGridCoverage BGS_EMODNET_CelticSeas-MCol RectifiedGridCoverage BGS_EMODNET_GreaterNorthSea-MCol RectifiedGridCoverage BGS_EMODNET_WesternMed-MCol RectifiedGridCoverage gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.0.0-scaled.tiff0000644003401500001440000000726213614004466025005 0ustar rouaultusersII*<-&- S ` x$  WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 Đ@q@AYA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.0-non_scaled.tiff0000644003401500001440000000200313614004466024472 0ustar rouaultusersII*@@(S  &$V -255|G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.0-scaled.tiff0000644003401500001440000001002713614004466023625 0ustar rouaultusersII*<&/&S : R$ -S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 1Ԕ@^y?*@iHAMqYA((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|                       gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.0.0-non_scaled.tiff0000644003401500001440000000202513614004466023644 0ustar rouaultusersII*@@S  @ g4@4@'b:@S*[AT#     > )#@TXAr@EUREF_FIN_TM35FIN|GCS Name = GCS_EUREF_FIN|Datum = ETRS_1989|Ellipsoid = GRS_1980|Primem = Greenwich||gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer2-1.0.0.xml0000644003401500001440000000511013614005404025505 0ustar rouaultusersGenerated from GeoTIFFsmartsea:southsouth17.750846897764713 59.4022172977940832.07494665128107 65.06949807111674southWCSGeoTIFF61619.99999999983 6610360.0739199.9999999999 7217020.00 033878 30332EN61629.99999999983 7217010.020.0 0.00.0 -20.0southsouthBandBand13EPSG:3047ArcGridGeoTIFFGIFGtopo30ImageMosaicJPEGPNGTIFFnearest neighborbilinearbicubicgdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.0.tiff0000644003401500001440000000340413614004466023547 0ustar rouaultusersII*S : R$ S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 4@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-2.0.1-non_scaled.tiff0000644003401500001440000000200313614004466024473 0ustar rouaultusersII*@@(S  &$V -255G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.2-non_scaled.tiff0000644003401500001440000000465613614004466024517 0ustar rouaultusersII*(S   &  V   HHү!q?د!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.0-scaled.tiff0000644003401500001440000001252013614004466022774 0ustar rouaultusersII*<OOS  $N + NONE NONE Velmu_wcs_testi 1.1.0 s@Js@JN AS*ԸZA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|ccKccccccccKKKKKKcKKccKKKccKKKccKKcKccKcccKKKKccKKKccKKcKKKccKcKKKKKcccKccKKKcKKccccKKKKcKKcKKccccKKKcKcKcKcKKKccKKKKKcccKccccKccKKKKccKKKcKKccKKKKKKKKKKKKccKKcKKKKccKKKccKKccccKKKKccKKKcKKKKKKKccccKKKKKKKKKKKKKKKccccccKKKKKKKKKKKKKcKcKccKccKKKKKKKKKKKKKcKKcccKKKKKKKKKKKcKcccccccKKKKKKKKKKKccKKcccKKKKKKKKKKKKKcccccccKKKKKKKKKKKKKKKKccccKKKKKKKKKKKKKccccccKKKKKKKKKKKKKKccccKcKcKKKKKKKKKKKKKcKKccccccKcKKKKKcKKKKKKKKKKKKKcccccKcKKKKKKKKKKKKKKKKKKcKKKKKcccKccKcKKKKKKKKKKKKKKKKKccKKKKcccccccccccKKKKKKKKKKKKKKKKKccKKKcccKcccKKcccKKKKKKKKKKKKKKKcKKKKKKKcccccKKccKKKKKKKKKcKKKKKKKcccKKKKcccccKcccKKKKKKKKKKKKKKKccccKKKccccccKcccKKKKKKccKKKKKKKKKcccccKKccccccKcccccccKKKKKKKKcKKKcccKKKKccccKccccccccKKKKKKKKcKKcKKcccccccccccccKKKKKKKKKcKKKKKKKKcKccccccKccKKKKKKKKKKcKKKKKKKKKKKKcKccccKKccKKKKKKKKKcKKKKKKcKKKKKcccKccKKKKKKKKKKKcKcKKKKcKKKKcccccKcKKKKKKKKKKKKKKKKKccKKKKcccccKKcKcKKKKKKKKccKKKKKKKKcKKccccKKcKcKKKKKKKKcKKKKKKKKKKKcKcKKKKcccccKKKKKKKKKKKKKKccKccccKKKccKccKKKKKKKKKKKKKKcKccccKKccccKKKKKKKKKKKKKKKKcKKccccKcccccKKKKKKKKKKKKKKKcccccccccccccKKKKKKKKKKKKccccccccccccccKKKKKKKKKKKKKKKcccccccccccKKKKKKKKKKKKKcccKccKcKcKKKKKKKKKKKKKKKcKKKKKKKKKKKKKcKKKKKKKKKcKKKKKKKKKKKKcKKKKKcKKKKKKKKKKcKcKKKKKKKKKKKKcKKKKKcKKKKKKKKcKKKccKKKKKKKKcKKKKKKKKKcKKKKKcKKcKKKKKKKKKccKKKKKKKKcKKKKKKKKKccKcccKKKKKKccKcKKccKcccKcKcKccccccKccccKKccKccKcKKccccKcKKcKKcKKKKKcKcccKcKKKcKKKKcKccKKKKKKKcKcccKccKKKccKKKccKKKKKKKKcKKKKKKKKcKKKKKKKKKccKKKKcKKKKcccKccccKKKKKKKKcccKccKKKKKKKKKKcccccKcKKKcccKKcKKKcccccKcKKKKcccKKKKKcKKKKcKKKKKcKccKKKccccccccKKcccKKKKKKKKcccccccccccKcKccKcKKcccccccKccccKKKKKKKccKKKcccccccccccKKKcKKKcKKKccccccKcccccccKKKKKKKcKcccccccccccccccKcKKKKKcKKcKKcccccccccccKcKKKKKKcKgdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-SimpleGeoServer-1.0.0.xml0000644003401500001440000000465713614005404026614 0ustar rouaultusersGenerated from GeoTIFFsmartsea:eusm2016eusm201617.475602613769112 58.781311815855325.816386818370457 65.85002305038745eusm2016WCSGeoTIFF61600.0 6540600.0432000.0 7304000.00 018519 38169EN61610.0 7303990.020.0 0.00.0 -20.0eusm2016eusm2016BandBand1EPSG:3067GeoTIFFGIFJPEGPNGTIFFnearest neighborbilinearbicubicgdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-ArcGIS-1.1.0.xml0000644003401500001440000001547013614005404024442 0ustar rouaultusers Velmu_wcs_testi WCS 1.0.0 1.1.0 1.1.1 1.1.2 NONE NONE WCS 1.0.0 1.1.0 1.1.1 1.1.2 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 nearest bilinear bicubic image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF False True Näkinpartaisniityt_1 17.483058091685201 59.36197532178339 27.956287922334681 65.841210879037476 1 Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 2 Avoimuusindeksi merenpohjalla_3 17.483058091685201 58.78220036767393 27.956287922334681 65.841210879037476 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3067 image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.0.tiff0000644003401500001440000000132013614004466021537 0ustar rouaultusersII*S  $N + NONE NONE Velmu_wcs_testi 1.1.0 3@4@(b:@S*[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.0.0.tiff0000644003401500001440000000366413614004466022407 0ustar rouaultusersII* S    P ! OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 none The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none BGS EMODnet bathymetry MapServer WCS 2015-04-14T14:29:00Z 1.0.0 Undefined Undefined Undefined ӯ!q?ӯ!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-MapServer-1.0.0.xml0000644003401500001440000000730513614005404025436 0ustar rouaultusers European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. BGS_EMODNET_CentralMed-MCol 9.83125 30.01040372 22.23542659 46.18958333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean 9.83125 30.01040372 22.23542659 46.18958333 9.83125 30.01040372 22.23542659 46.18958333 0 0 2976 3882 x y 9.83125 46.18958333 0.00416667 0 0 -0.00416667 Depth band bands 1 2 3 EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 EPSG:4326 GTiff nearest neighbor bilinear gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.0.0-non_scaled.tiff0000644003401500001440000000446213614004466024507 0ustar rouaultusersII*(S   HHү!q?ȯ!q?#@=DDG@gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.2.tiff0000644003401500001440000000656613614004466022416 0ustar rouaultusersII*j  S     R b   OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.2 Undefined Undefined Undefined ӯ!q?ӯ!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.1-non_scaled.tiff0000644003401500001440000000200313614004466024473 0ustar rouaultusersII*@@(S  &$V -255|G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/urls0000644003401500001440000006675013614004466020114 0ustar rouaultusersArcGIS-1.0.0 non_scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=2&FORMAT=GeoTIFF&BBOX=61676.0383772499,7302171.14320843,61716.0383772499,7302211.14320843&WIDTH=2&HEIGHT=2&CRS=EPSG:3067 ArcGIS-1.0.0 non_scaled2 http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=2&FORMAT=GeoTIFF&BBOX=61676.0383772499,7291971.14320843,82156.0383772499,7302211.14320843&WIDTH=1024&HEIGHT=512&CRS=EPSG:3067 ArcGIS-1.0.0 scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=2&FORMAT=GeoTIFF&BBOX=180996.03837725,6980011.14320843,199996.03837725,7005011.14320843&WIDTH=60&HEIGHT=79&CRS=EPSG:3067 ArcGIS-1.1.0 non_scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7302181.14320843,61706.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.0 non_scaled2 http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7291981.14320843,82146.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.0 scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=181154.371710583,6980169.37105653,199837.705043917,7004852.91536033,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=181154.371710583,7004852.91536033&GridOffsets=316.666666666667,-316.455696202532 ArcGIS-1.1.1 non_scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7302181.14320843,61706.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.1 non_scaled2 http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7291981.14320843,82146.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.1 scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=181154.371710583,6980169.37105653,199837.705043917,7004852.91536033,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=181154.371710583,7004852.91536033&GridOffsets=316.666666666667,-316.455696202532 ArcGIS-1.1.2 non_scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7302181.14320843,61706.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.2 non_scaled2 http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=61686.0383772499,7291981.14320843,82146.0383772499,7302201.14320843,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61686.0383772499,7302201.14320843&GridOffsets=20,-20 ArcGIS-1.1.2 scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=2&FORMAT=image%2FGeoTIFF&BOUNDINGBOX=181154.371710583,6980169.37105653,199837.705043917,7004852.91536033,urn:ogc:def:crs:EPSG::3067&RangeSubset=Field_1&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=181154.371710583,7004852.91536033&GridOffsets=316.666666666667,-316.455696202532 ArcGIS-2.0.1 non_scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=Coverage2&SUBSET=x%2861676.038377249904,61716.038377249904%29&SUBSET=y%287302171.1432084311,7302211.1432084311%29&Format=image/tiff ArcGIS-2.0.1 non_scaled2 http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=Coverage2&SUBSET=x%2861676.038377249904,82156.038377249904%29&SUBSET=y%287291971.1432084311,7302211.1432084311%29&Format=image/tiff ArcGIS-2.0.1 scaled http://paikkatieto.ymparisto.fi/arcgis/services/Testit/Velmu_wcs_testi/MapServer/WCSServer?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=Coverage2&SUBSET=x%28180996.0383772499,199996.03837724988%29&SUBSET=y%286980011.1432084311,7005011.1432084311%29&SCALEFACTOR=15.702479338843&Format=image/tiff GeoServer-1.0.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016-EPSG2393&FORMAT=GeoTIFF&BBOX=3061592.63914621,7307016.88383558,3061632.65520693,7307056.8998963&WIDTH=2&HEIGHT=2&CRS=EPSG:2393 GeoServer-1.0.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016-EPSG2393&FORMAT=GeoTIFF&BBOX=3061592.63914621,7296812.78835244,3082080.86223393,7307056.8998963&WIDTH=1024&HEIGHT=512&CRS=EPSG:2393 GeoServer-1.0.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016-EPSG2393&FORMAT=GeoTIFF&BBOX=3199988.18514013,6620001.14539506,3279980.29051582,6670001.21326246&WIDTH=60&HEIGHT=38&CRS=EPSG:2393 GeoServer-1.1.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=7307016.88383558,3061592.63914621,7307056.8998963,3061632.65520693,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7307056.8998963,3061592.63914621&GridOffsets=0,16.0064242872824,-16.0064242872824,0 GeoServer-1.1.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=7296812.78835244,3061592.63914621,7307056.8998963,3082080.86223393,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7307056.8998963,3061592.63914621&GridOffsets=0,19.9982655809873,-19.9885103294844,0 GeoServer-1.1.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=6620001.14539506,3199988.18514013,6670001.21326246,3279980.29051582,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=6670001.21326246,3199988.18514013&GridOffsets=0,1322.18355992883,-1298.70306149087,0 GeoServer-1.1.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=7307016.88383558,3061592.63914621,7307056.8998963,3061632.65520693,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7307056.8998963,3061592.63914621&GridOffsets=0,16.0064242872824,-16.0064242872824,0 GeoServer-1.1.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=7296812.78835244,3061592.63914621,7307056.8998963,3082080.86223393,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7307056.8998963,3061592.63914621&GridOffsets=0,19.9982655809873,-19.9885103294844,0 GeoServer-1.1.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016-EPSG2393&FORMAT=image%2Ftiff&BOUNDINGBOX=6620001.14539506,3199988.18514013,6670001.21326246,3279980.29051582,urn:ogc:def:crs:EPSG::2393&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::2393&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=6670001.21326246,3199988.18514013&GridOffsets=0,1322.18355992883,-1298.70306149087,0 GeoServer-2.0.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016-EPSG2393&SUBSET=Y%283061592.6391462097,3061632.655206928%29&SUBSET=X%287307016.8838355802,7307056.8998962985%29&Format=image/tiff GeoServer-2.0.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016-EPSG2393&SUBSET=Y%283061592.6391462097,3082080.8622339312%29&SUBSET=X%287296812.7883524373,7307056.8998962985%29&Format=image/tiff GeoServer-2.0.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016-EPSG2393&SUBSET=Y%283199988.1851401255,3279980.2905158196%29&SUBSET=X%286620001.1453950591,6670001.2132624574%29&SCALESIZE=i%2860%29,j%2838%29&Format=image/tiff GeoServer2-1.0.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Asouth&FORMAT=GeoTIFF&BBOX=61619.9999999998,7216980,61659.9999999998,7217020&WIDTH=2&HEIGHT=2&CRS=EPSG:3047 GeoServer2-1.0.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Asouth&FORMAT=GeoTIFF&BBOX=61619.9999999998,7206780,82099.9999999998,7217020&WIDTH=1024&HEIGHT=512&CRS=EPSG:3047 GeoServer2-1.0.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Asouth&FORMAT=GeoTIFF&BBOX=145300,6688700,209680,6737500&WIDTH=60&HEIGHT=45&CRS=EPSG:3047 GeoServer2-1.1.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=7216980,61619.9999999998,7217020,61659.9999999998,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7217020,61619.9999999998&GridOffsets=0,20,-20,0 GeoServer2-1.1.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=7206780,61619.9999999998,7217020,82099.9999999998,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7217020,61619.9999999998&GridOffsets=0,20,-20,0 GeoServer2-1.1.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=6688700,145300,6737500,209680,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=6737500,145300&GridOffsets=0,1073,-1084.44444444444,0 GeoServer2-1.1.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=7216980,61619.9999999998,7217020,61659.9999999998,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7217020,61619.9999999998&GridOffsets=0,20,-20,0 GeoServer2-1.1.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=7206780,61619.9999999998,7217020,82099.9999999998,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=7217020,61619.9999999998&GridOffsets=0,20,-20,0 GeoServer2-1.1.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Asouth&FORMAT=image%2Ftiff&BOUNDINGBOX=6688700,145300,6737500,209680,urn:ogc:def:crs:EPSG::3047&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3047&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=6737500,145300&GridOffsets=0,1073,-1084.44444444444,0 GeoServer2-2.0.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__south&SUBSET=E%2861619.999999999833,61659.999999999833%29&SUBSET=N%287216980,7217020.0%29&Format=image/tiff GeoServer2-2.0.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__south&SUBSET=E%2861619.999999999833,82099.999999999825%29&SUBSET=N%287206780,7217020.0%29&Format=image/tiff GeoServer2-2.0.1 range_subsetting https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__south&SUBSET=E%2861619.999999999833,82099.999999999825%29&SUBSET=N%287206780,7217020.0%29&RANGESUBSET=GREEN_BAND,BLUE_BAND&Format=image/tiff GeoServer2-2.0.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__south&SUBSET=E%28145299.99999999983,209679.99999999983%29&SUBSET=N%286688700,6737500%29&SCALESIZE=i%2860%29,j%2845%29&Format=image/tiff MapServer-1.0.0 non_scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=BGS_EMODNET_CentralMed-MCol&FORMAT=GTiff&BBOX=9.83125,46.18124999,9.83958334,46.18958333&WIDTH=2&HEIGHT=2&CRS=EPSG:4326 MapServer-1.0.0 non_scaled2 http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=BGS_EMODNET_CentralMed-MCol&FORMAT=GTiff&BBOX=9.83125,44.05624829,14.09792008,46.18958333&WIDTH=1024&HEIGHT=512&CRS=EPSG:4326 MapServer-1.0.0 scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=BGS_EMODNET_CentralMed-MCol&FORMAT=GTiff&BBOX=9.9979168,35.00207438,14.9979208,45.00208238&WIDTH=60&HEIGHT=120&CRS=EPSG:4326 MapServer-1.1.0 non_scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=46.183333325,9.833333335,46.187499995,9.837500005,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.0 non_scaled2 http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=44.058331625,9.833333335,46.187499995,14.095836745,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.0 scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=35.04374108,10.0395835,44.96041568,14.9562541,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=44.96041568,10.0395835&GridOffsets=0.0833334,0.0833334 MapServer-1.1.1 non_scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=46.183333325,9.833333335,46.187499995,9.837500005,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.1 non_scaled2 http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=44.058331625,9.833333335,46.187499995,14.095836745,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.1 scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=35.04374108,10.0395835,44.96041568,14.9562541,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=44.96041568,10.0395835&GridOffsets=0.0833334,0.0833334 MapServer-1.1.2 non_scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=46.183333325,9.833333335,46.187499995,9.837500005,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.2 non_scaled2 http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=44.058331625,9.833333335,46.187499995,14.095836745,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=46.187499995,9.833333335&GridOffsets=0.00416667,0.00416667 MapServer-1.1.2 scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&VERSION=1.1.2&REQUEST=GetCoverage&IDENTIFIER=BGS_EMODNET_CentralMed-MCol&FORMAT=image%2Ftiff&BOUNDINGBOX=35.04374108,10.0395835,44.96041568,14.9562541,urn:ogc:def:crs:EPSG::4326&RangeSubset=band&GridBaseCRS=urn:ogc:def:crs:EPSG::4326&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=44.96041568,10.0395835&GridOffsets=0.0833334,0.0833334 MapServer-2.0.1 non_scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BGS_EMODNET_CentralMed-MCol&SUBSET=long%289.8312500000000007,9.8395840000000003%29&SUBSET=lat%2846.181249000000001,46.189582999999999%29&Format=image/tiff MapServer-2.0.1 non_scaled2 http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BGS_EMODNET_CentralMed-MCol&SUBSET=long%289.8312500000000007,14.098258000000001%29&SUBSET=lat%2844.056078999999997,46.189582999999999%29&Format=image/tiff MapServer-2.0.1 scaled http://194.66.252.155/cgi-bin/BGS_EMODnet_bathymetry/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BGS_EMODNET_CentralMed-MCol&SUBSET=long%289.9979300000000002,14.998329999999999%29&SUBSET=lat%2835.001187999999999,45.001987999999997%29&SCALESIZE=long%2860%29,lat%28120%29&Format=image/tiff Rasdaman-2.0.1 non_scaled http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BlueMarbleCov&SUBSET=Long%28-180,-179.96000000000001%29&SUBSET=Lat%2889.959999999999994,90%29&Format=image/tiff Rasdaman-2.0.1 non_scaled2 http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BlueMarbleCov&SUBSET=Long%28-180,-159.52000000000001%29&SUBSET=Lat%2879.760000000000005,90%29&Format=image/tiff Rasdaman-2.0.1 scaled http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=BlueMarbleCov&SUBSET=Long%2810,15%29&SUBSET=Lat%2835,45%29&SCALESIZE=Long%2860%29,Lat%28120%29&Format=image/tiff Rasdaman2-2.0.1 dimension_subsetting http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=test_irr_cube_2&SUBSET=E%2875042.7273594,705042.727359%29&SUBSET=N%285094865.55794,5454865.5579399997%29&SUBSET0=unix%28%222008-01-05T01:58:30.000Z%22%29&Format=image/tiff Rasdaman2-2.0.1 non_scaled http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=test_irr_cube_2&SUBSET=E%2875042.7273594,95042.7273594%29&SUBSET=N%285434865.5579399997,5454865.5579399997%29&SUBSET0=unix%28%222008-01-05T01:58:30.000Z%22%29&Format=image/tiff Rasdaman2-2.0.1 non_scaled2 http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=test_irr_cube_2&SUBSET=E%2875042.7273594,705042.727359%29&SUBSET=N%285094865.55794,5454865.5579399997%29&SUBSET0=unix%28%222008-01-05T01:58:30.000Z%22%29&Format=image/tiff Rasdaman2-2.0.1 scaled http://ows.rasdaman.org/rasdaman/ows?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=test_irr_cube_2&SUBSET=E%2895042.7273594,145042.72735940001%29&SUBSET=N%285104865.5579399997,5404865.5579399997%29&SUBSET0=unix%28%222008-01-05T01:58:30.000Z%22%29&SCALESIZE=E%2860%29,N%28360%29&Format=image/tiff SimpleGeoServer-1.0.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016&FORMAT=GeoTIFF&BBOX=61600,7303960,61640,7304000&WIDTH=2&HEIGHT=2&CRS=EPSG:3067 SimpleGeoServer-1.0.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016&FORMAT=GeoTIFF&BBOX=61600,7293760,82080,7304000&WIDTH=1024&HEIGHT=512&CRS=EPSG:3067 SimpleGeoServer-1.0.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=1.0.0&COVERAGE=smartsea%3Aeusm2016&FORMAT=GeoTIFF&BBOX=145300,6688700,209680,6737500&WIDTH=60&HEIGHT=45&CRS=EPSG:3067 SimpleGeoServer-1.1.0 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=61600,7303960,61640,7304000,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61600,7304000&GridOffsets=20,0,0,-20 SimpleGeoServer-1.1.0 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=61600,7293760,82080,7304000,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61600,7304000&GridOffsets=20,0,0,-20 SimpleGeoServer-1.1.0 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=145300,6688700,209680,6737500,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=145300,6737500&GridOffsets=1073,0,0,-1084.44444444444 SimpleGeoServer-1.1.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=61600,7303960,61640,7304000,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61600,7304000&GridOffsets=20,0,0,-20 SimpleGeoServer-1.1.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=61600,7293760,82080,7304000,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=61600,7304000&GridOffsets=20,0,0,-20 SimpleGeoServer-1.1.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&VERSION=1.1.1&REQUEST=GetCoverage&IDENTIFIER=smartsea%3Aeusm2016&FORMAT=image%2Ftiff&BOUNDINGBOX=145300,6688700,209680,6737500,urn:ogc:def:crs:EPSG::3067&RangeSubset=contents&GridBaseCRS=urn:ogc:def:crs:EPSG::3067&GridCS=urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS&GridType=urn:ogc:def:method:WCS:1.1:2dGridIn2dCrs&GridOrigin=145300,6737500&GridOffsets=1073,0,0,-1084.44444444444 SimpleGeoServer-2.0.1 non_scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016&SUBSET=E%2861600,61640%29&SUBSET=N%287303960,7304000.0%29&Format=image/tiff SimpleGeoServer-2.0.1 non_scaled2 https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016&SUBSET=E%2861600,82080%29&SUBSET=N%287293760,7304000.0%29&Format=image/tiff SimpleGeoServer-2.0.1 scaled https://msp.smartsea.fmi.fi/geoserver/wcs?SERVICE=WCS&REQUEST=GetCoverage&VERSION=2.0.1&COVERAGEID=smartsea__eusm2016&SUBSET=E%28145300,209680%29&SUBSET=N%286688700,6737500%29&SCALESIZE=i%2860%29,j%2845%29&Format=image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.0.0.tiff0000644003401500001440000000244213614004466022457 0ustar rouaultusersII* S J b$ $c WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 Undefined Undefined Undefined 4@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.1-scaled.tiff0000644003401500001440000001061413614004466025002 0ustar rouaultusersII*<-- S : R$ S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Đ@q@AYA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-ArcGIS-2.0.1.xml0000644003401500001440000000466413614005404024611 0ustar rouaultusers 61676.038377249904 6605831.1432084311 543676.03837724985 7302211.1432084311 Coverage2 0 0 24099 34818 x y 61686.038377249904 7302201.1432084311 19.999999999999996 0 0 -20 Band 1 0.0 255.0 RectifiedGridCoverage image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-2.0.1-scaled.tiff0000644003401500001440000006301213614004466023633 0ustar rouaultusersII*<x-S   " R  0N1P EPSG:3031,3034,3413,3857,4258 image/png,image/x-aaigrid,image/jpeg,image/png; mode=8bit,image/tiff NEAREST,AVERAGE,BILINEAR OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_post-xml/1.0/conf/post-xml,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/multipart,GMLCOV/1.0/conf/special-format,GMLCOV_geotiff-coverages/1.0/conf/geotiff-coverage,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_interpolation/1.0/conf/interpolation The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 2.0.1 0 255 band1 Undefined 0 255 band2 Undefined 0 255 band3 Undefined r.U?r.U?eS#@~$AF@#  mtr@@TXAWGS 84|K%&&&)"%(((Od)%9:HZeptV\IVjn^aIV#k"'&#&%"''''''!\ +D*CQIVIVS^`jmvb"$'#&%%$$'"'''$'+V0GTIVIVv{wz)#W&y&$&'"%$$'#'"'$'' $)A1~FSIV|)M(w&'&%#$$' #&"''''!"#%\"BOMXIVIVDR#I(z('&%$''!#!"'''! Y$Q[txIVIVIVGT-<)j''&"$'!! "*;IVIVMYDRJU$8',L*u($"'$ ! ##IVy}IVIV-4+Q*r%#" "!! ### IVIV/@,4+J*w($#!!! # CQHT.*,>+a)&#!!   /!,2+F*q(""! " 8#+<%27+['&#! }(>+P[9H6+K*s(%! "!%  #%b,$9,9+U*'"" "!+-./=+\**"   -w591B*X)  1%cf81U*  $$<+]#"1;%,@' \.'(2(h! i$0+W$  &)C' %'.,9({  ")zb,*[ $<.|Z%O!yE 42( **T چ+O'0!4) ?*2!!97(6sf^33;",)r(ZLE4g B' lRK'5K;8  I1(`q1-o) |XD+B<K' (6+)y($y,%"T.W~!ETtz !/N*IA'3ggl$5EXp-3[0LX F$5{jڠ ٹ`+Ux'&~dQ G$=!M  $#ڄđ3ܢn3 a44T 2ŻB #mB#ފC)} 0IV%׳4'b2g8 ,4-XS*@91 QS6:8RXޱѡT63j5- Ñ(sH~Ņ=" >%2c)3r>1(Н33r_!DĐm3 Y ey08$5w,ceUkk?Db ָ@>4ViڍXg|5, 0Xq]62)+N?=3h[eG2K# },yWr !2~9^6$3Tq6,.234mK9s ӄx34c[670p5vx }r[8C8dx+p[S= ̴ ("1!]Ryp w#-c1Z3p91Wl`3Tu@uwB8EO DWkkCZcz  ye[p| {*89 O`+6)Z{ &1S&",3D 'USth{^j"&  R+2qn *)s/:{/  ;P1<I(#e#= 0@Er3337MwGN YLK1!6E5%2 &0",9{%Q -5c4 ,b-8 5F-A4EӲ i\Z8@9E:L.O9  acr 7=-38?4 ip X=JKhYZI-2 G0QW$gɄ ݿv1;8$3v1-97 i8.hFqh4?  Fo{38  q  9A {  k:BI x26n#<Q!!a^| c {'2 ځm4IK6{ cCԌ'w{l`6P !  %Yr3:  !):B E2: i>D593#$p.1)JV%I)6:  &*G#MR46 C F D&&b F \U.ZMp :B"m"Ia$'oI0& b3&'%  i&~ u dP |,29B  :<$$hKYT&&b.//l8@;7@65:8>9AF`4f G(*6a/Գ cB5>e#   |~!rcSMP=1!!]S33qJNKJUJp47]d >KCO0=r.X`~H/^EeK`p " o $*whJ# ~H/;?X::*9 DU h**gU,<H \35/H!&"'u]2 U0n7c4,J)S%ۀ=H:(\w O#,   Oz |vjs dcFH36;61220U++h36=#T FS_DWf388?   n z+ d_xo|֥3&*.rIEm(3   7;5Y8 FB0XY00m12%%a>A""^78B345:E% =)Z@L;]88}WE96Y)/ 176< 6;6;Z')U35W((s`V0((l..l F78411o'(u8?CB>00m=;8,,m#$ww//x CL5((s]i y[.9?\+zp !#( $+nYh `|X4hF23&&j[cA>6OO"'$X''n13X< FZ=T F PJ;W C9ON""`j59!yWUcF/"h  .3%#+1v6;9@Zn !o X-.| hEJ33{U..m35"F,,q##&Q= A""^"8F!JD@U;@5 d ;F7TKNlBL7  ',;}6;27/5&*6< y _(*}467> '.7**g #G4SF36""f8:LI F--u>>S))j''iUB AT%%dQ%_L@M j}%hG   $$T-37<4:W8@8@  7> :CHkl,Nx/6)29A7=R..w=,,m=KdA700m.15:6<+,~)R33q97=  b MK$%t!"r13v>Y)/6=8?9A 9B:B#e.3>5?  !'7=  r 8? zt"`+,Go2 CW''c11v/2'J3O7>*R))hb T12n #Hg '--3$+29!(It:p 8@:C!  6=9B (2A@Mo )2.T3`p=n.'0 S 6 41,)#(53:M%6Y,nNUD]KI@D;P:um4d#kR q8 >4jXV}wtF^o'39ΒE`333J>t733K$Ei-332:k,y \G*WNPHgadb|x=,&iJa)23&JA=ѓp33 :r4?&6633?0587B_cΆxq w:UU33s1o^cV P7/D|w$BBU#. Z|5,2N(Ώ%e337(5#_deZLA8ME=;Re!hH,33)*; F W?SMGL\UdI2t_33 Δ@#e3 3nM0mE F{{l@i" 3-- ) Κ'nr #p.C*$߈"W<43'g3$1333o 3I '{*36 6! =^(51&" (w33,H7, *(   ViA# .tm<$*   3  sa$3  - s t?@ $(3( V| ) /g)l@J  12 3 `Y*ja-  rmZe Z &(EFT 4f>-3s n [g RWG&C=M Y8. S]Z (,3D ~x'j =cE dg z3.? ͯ`'RDRWC>E(R z D<#7yC M*imyb(Ch.y f3m x7>Q/>6V=~>N8Z8Y>3<#:Z&O3  aCE8QABf 'VQ+K!O{/]~\7k ׈4j+o+q(v6Y[>+z  pP +[ wP*zlE(82>ll%l۽A .p>@npA@oj1N*N|x* y3%% Tb|jʚ033 ˻{Jz8H:+)'LSAR6VTm7SB)SD+  %  &33 hK*2]Y_zѿ0k*NO*KI[lolC/'r`nP '  3kJ"F9Bg$i<55<3l3} .Zs6 }IRel {A;@oxT0(l%! jjbaIyPG).{\?BRleha>P3$*gN 3'f&.##!%hUE6NC>= ҄#@A/]oHJI0L`?5E.w:,". !$!! qQ p`bTz}>F!ՄȘ8DaUUUbIUKVL.ZgƎ9%N;.&3 "$$$!$ ]I/D8B:KJ%yh*RW_N^;X6W&RwЍ.' $$$% +3  4urHߒp-0]+D@4`(y8PO WA.#k#E'$+)73#%-@`3v\LD'8X?>ctwv?A-# Z#)G+Z9-4'I + #5uy3Xn?[j``3>NE!uPn`XXM^U?>ٱ1u jμ-+/Y ! 3-&(צ073=GcwQI_VbXdV_d2kEO>( /  3-30$ ntk`p_=NpbYhZeRcKY.i]YquI,!""$ $$&<y\fQBG5e*{+]1NF;WITDw!E3'(f    %"%#" !"l$-'13W2\X_nnhbZyyU;$b J'_hnu$!! "#''$$#&"%  s"4LP]crmw_WbYbYbYcWiK\"^f x{!#(("$%""%!%!"" (~)TR,]Oc[bZbZbYbYbY_V`N[8Y%`q rg<,'*,('$$#"%%%$)%  .`ZY5XL[T[S]T\UbYbY_TTBM4N)U\ hvIV)L*T-P+T*{('&%#"%%%%%%"% gdf*]7sdaW\X\XZVZUVQZU[U]UP9\+efIVIV&9&-1+9+F*P-g(|(##!%%%" % "3 ,>DUz[ghufui\VaZh`_;/gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.1-scaled.tiff0000644003401500001440000001002713614004466023626 0ustar rouaultusersII*<&/&S : R$ -S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 1Ԕ@^y?*@iHAMqYA((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|                       gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-MapServer-2.0.1.xml0000644003401500001440000000651313614005404025440 0ustar rouaultusers 30.01040372 9.83125 46.18958333 22.23542659 BGS_EMODNET_CentralMed-MCol 0 0 2976 3882 lat long 46.189583 9.831250 0 0.004167 -0.004167 0 0 255 3 0 255 3 0 255 3 RectifiedGridCoverage gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-2.0.1-non_scaled.tiff0000644003401500001440000000473213614004466024570 0ustar rouaultusersII*(S   & $V  $ 4@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-MapServer-1.1.0.xml0000644003401500001440000004261313614005404025275 0ustar rouaultusers BGS EMODnet bathymetry The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. OneGeology infoCoverageAccessService Europe EMODnet Bathymetry MD_LANG@ENG MD_DATE@2015-04-14 OGC WCS 2.0.1 1.1.1 1.0.0 none none British Geological Survey (BGS) Mr Matthew Harrison Science Director Informatics +44 (0)115 936 3100 +44 (0)115 936 3200 Environmental Science Centre Keyworth Nottinghamshire NG12 5GG United Kingdom enquiries@bgs.ac.uk Mon-Fri, 09:00-17:00 pointOfContact WCS 1.1.0 WCS 1.1.0 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol WCS 1.1.0 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol NEAREST_NEIGHBOUR BILINEAR image/png image/x-aaigrid image/jpeg image/png; mode=8bit image/tiff false urn:ogc:def:crs:epsg::4326 European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CentralMed-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Aegean Sea and Levantine Sea 22.23541667 30.39790787 36.73542827 41.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_AegeanLevantineSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Bay of Biscay and Iberian Coast -26.11458333 32.58123877 -0.489562830000001 46.61458333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_BayBiscayIberianCoast-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Celtic Seas -26.11458333 46.61456967 -0.489562830000001 63.69791667 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CelticSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Greater North Sea -0.48958333 48.8104034 13.76042807 65.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_GreaterNorthSea-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Western Mediterranean -0.48958333 35.21874234 9.83125826 44.78958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_WesternMed-MCol gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-ArcGIS-1.0.0.xml0000644003401500001440000000543113614005405024601 0ustar rouaultusers 2 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 61676.038377249904 6605831.1432084311 543676.03837724985 7302211.1432084311 0 0 24099 34818 Raster_Pixel_Columns(X-axis) Raster_Pixel_Rows(Y-axis) 61686.038377249904 7302201.1432084311 19.999999999999996 0 0 -20 RangeSet_2 Band 1 EPSG:4326 EPSG:3067 EPSG:3067 GeoTIFF NITF HDF JPEG2000 PNG nearest neighbor bilinear bicubic gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-2.0.1.tiff0000644003401500001440000002145313614004466022402 0ustar rouaultusersII*'#S 2" J"$z" "-"L!0 EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 GRAY_INDEX 0 255 GRAY_INDEX G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman2-2.0.1.tiff0000644003401500001440000000710613614004466022310 0ustar rouaultusersII* & RS     0 application/gml+xml,image/jpeg,image/png,image/tiff,image/bmp,image/jp2,application/netcdf,text/csv,application/json,application/dem,application/x-ogc-dted,application/x-ogc-ehdr,application/x-ogc-elas,application/x-ogc-envi,application/x-ogc-ers,application/x-ogc-fit,application/x-ogc-fits,image/gif,application/x-netcdf-gmt,application/x-ogc-gs7bg,application/x-ogc-gsag,application/x-ogc-gsbg,application/x-ogc-gta,application/x-ogc-hf2,application/x-erdas-hfa,application/x-ogc-ida,application/x-ogc-ingr,application/x-ogc-isis2,application/x-erdas-lan,application/x-ogc-mff2,application/x-ogc-nitf,application/x-ogc-paux,application/x-ogc-pcidsk,application/x-ogc-pcraster,application/x-ogc-pdf,application/x-ogc-pnm,text/x-r,application/x-ogc-rmf,image/x-sgi,application/x-ogc-vrt,image/xpm,application/x-ogc-zmap http://www.opengis.net/def/interpolation/OGC/1.0/nearest-neighbor GMLCOV/1.0/conf/gml,GMLCOV/1.0/conf/gml-coverage,WCS_coverage-encoding_geotiff/1.0/,GMLJP2/2.0/,WCS_coverage-encoding_jpeg2000/1.0/,https://www.ietf.org/rfc/rfc4180.txt,https://www.www.json.org/,https://www.w3.org/Graphics/JPEG/,http://www.w3.org/TR/PNG/,WCS_coverage-encoding_netcdf/1.0/,GMLCOV/1.0/conf/multipart,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_processing/2.0/conf/processing,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_soap/1.0,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_transaction/2.0/conf/insert+delete,WCS_service-extension_crs/1.0/conf/crs rasdaman server - free download from www.rasdaman.org rasdaman Jacobs University Bremen http://rasdaman.org/ Bremen Germany Campus Ring 1 p.baumann@jacobs-university.de 28717 +49 421 20040 Prof. Dr. Peter Baumann Project Leader pointOfContact 2.0.1 b1 b2 @@7C+R@IcTA# y )#WGS 84 / UTM zone 33N|WGS 84|L@?i@~?C@?@(?gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.0-non_scaled.tiff0000644003401500001440000000172413614004466025655 0ustar rouaultusersII*@@(S  &$V 2554@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer2-2.0.1.xml0000644003401500001440000001022313614005405025511 0ustar rouaultusers 6610360.0 61619.99999999983 7217020.0 739199.9999999999 smartsea__south Linear 0 0 0 0 33878 30332 i j 7217010.0 61629.99999999983 0.0 20.0 -20.0 0.0 RED_BAND 256.0 0 255 GREEN_BAND 256.0 0 255 BLUE_BAND 256.0 0 255 RectifiedGridCoverage image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-Rasdaman-2.0.1.xml0000644003401500001440000000664513614005405025271 0ustar rouaultusers -90 -180 90 180 BlueMarbleCov Linear 0 0 0 0 8999 17999 Lat Long 89.99 -179.99 -0.02 0 0 0.02 Red Green Blue RectifiedGridCoverage application/octet-stream gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.0.0-scaled.tiff0000644003401500001440000001254413614004466023001 0ustar rouaultusersII*<OOS  2$b ? NONE NONE Velmu_wcs_testi Velmu_wcs_testi 1.0.0 s@Js@JN AS*ԸZA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|ccKccccccccKKKKKKcKKccKKKccKKKccKKcKccKcccKKKKccKKKccKKcKKKccKcKKKKKcccKccKKKcKKccccKKKKcKKcKKccccKKKcKcKcKcKKKccKKKKKcccKccccKccKKKKccKKKcKKccKKKKKKKKKKKKccKKcKKKKccKKKccKKccccKKKKccKKKcKKKKKKKccccKKKKKKKKKKKKKKKccccccKKKKKKKKKKKKKcKcKccKccKKKKKKKKKKKKKcKKcccKKKKKKKKKKKcKcccccccKKKKKKKKKKKccKKcccKKKKKKKKKKKKKcccccccKKKKKKKKKKKKKKKKccccKKKKKKKKKKKKKccccccKKKKKKKKKKKKKKccccKcKcKKKKKKKKKKKKKcKKccccccKcKKKKKcKKKKKKKKKKKKKcccccKcKKKKKKKKKKKKKKKKKKcKKKKKcccKccKcKKKKKKKKKKKKKKKKKccKKKKcccccccccccKKKKKKKKKKKKKKKKKccKKKcccKcccKKcccKKKKKKKKKKKKKKKcKKKKKKKcccccKKccKKKKKKKKKcKKKKKKKcccKKKKcccccKcccKKKKKKKKKKKKKKKccccKKKccccccKcccKKKKKKccKKKKKKKKKcccccKKccccccKcccccccKKKKKKKKcKKKcccKKKKccccKccccccccKKKKKKKKcKKcKKcccccccccccccKKKKKKKKKcKKKKKKKKcKccccccKccKKKKKKKKKKcKKKKKKKKKKKKcKccccKKccKKKKKKKKKcKKKKKKcKKKKKcccKccKKKKKKKKKKKcKcKKKKcKKKKcccccKcKKKKKKKKKKKKKKKKKccKKKKcccccKKcKcKKKKKKKKccKKKKKKKKcKKccccKKcKcKKKKKKKKcKKKKKKKKKKKcKcKKKKcccccKKKKKKKKKKKKKKccKccccKKKccKccKKKKKKKKKKKKKKcKccccKKccccKKKKKKKKKKKKKKKKcKKccccKcccccKKKKKKKKKKKKKKKcccccccccccccKKKKKKKKKKKKccccccccccccccKKKKKKKKKKKKKKKcccccccccccKKKKKKKKKKKKKcccKccKcKcKKKKKKKKKKKKKKKcKKKKKKKKKKKKKcKKKKKKKKKcKKKKKKKKKKKKcKKKKKcKKKKKKKKKKcKcKKKKKKKKKKKKcKKKKKcKKKKKKKKcKKKccKKKKKKKKcKKKKKKKKKcKKKKKcKKcKKKKKKKKKccKKKKKKKKcKKKKKKKKKccKcccKKKKKKccKcKKccKcccKcKcKccccccKccccKKccKccKcKKccccKcKKcKKcKKKKKcKcccKcKKKcKKKKcKccKKKKKKKcKcccKccKKKccKKKccKKKKKKKKcKKKKKKKKcKKKKKKKKKccKKKKcKKKKcccKccccKKKKKKKKcccKccKKKKKKKKKKcccccKcKKKcccKKcKKKcccccKcKKKKcccKKKKKcKKKKcKKKKKcKccKKKccccccccKKcccKKKKKKKKcccccccccccKcKccKcKKcccccccKccccKKKKKKKccKKKcccccccccccKKKcKKKcKKKccccccKcccccccKKKKKKKcKcccccccccccccccKcKKKKKcKKcKKcccccccccccKcKKKKKKcKgdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.1-non_scaled.tiff0000644003401500001440000000473213614004466024570 0ustar rouaultusersII*(S   & $V  $ 3@3@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-SimpleGeoServer-2.0.1.xml0000644003401500001440000000570513614005405026612 0ustar rouaultusers 61600.0 6540600.0 432000.0 7304000.0 smartsea__eusm2016 Linear 0 0 0 0 18519 38169 i j 61610.0 7303990.0 20.0 0.0 0.0 -20.0 GRAY_INDEX 255.0 1.0 25.0 RectifiedGridCoverage image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-GeoServer-1.1.1.xml0000644003401500001440000001043113614005405025265 0ustar rouaultusersWeb Coverage ServiceThis server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. WCSWMSGEOSERVERWCS1.1.01.1.1NONENONEFinnish Environment Institute, Marine Research CentreAri JolmaSenior Research ScientistHelsinkiFinlandari.jolma@gmail.comTrueFalseXMLeusm2016Generated from GeoTIFFeusm2016WCSGeoTIFF17.475602613769112 58.781311815855325.816386818370457 65.85002305038745smartsea:eusm2016eusm2016-EPSG2393Generated from GeoTIFFeusm2016-EPSG2393WCSGeoTIFF17.476423085843237 58.7814874118187425.81728699126928 65.85020367362361smartsea:eusm2016-EPSG2393southGenerated from GeoTIFFsouthWCSGeoTIFF17.750846897764713 59.4022172977940832.07494665128107 65.06949807111674smartsea:southgdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman-2.0.1-non_scaled.tiff0000644003401500001440000000457213614004466024335 0ustar rouaultusersII*S   " b r xGz?xGz?fV@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.1-non_scaled.tiff0000644003401500001440000000172413614004466025656 0ustar rouaultusersII*@@(S  &$V 2554@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.1.tiff0000644003401500001440000000346313614004466022403 0ustar rouaultusersII*/S : R$ -S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.0.tiff0000644003401500001440000000377413614004466022471 0ustar rouaultusersII* S $ <$l $1256 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Undefined Undefined Undefined 4@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-MapServer-1.0.0.xml0000644003401500001440000002360213614005405025272 0ustar rouaultusers The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. MapServer WCS OneGeology infoCoverageAccessService Europe EMODnet Bathymetry MD_LANG@ENG MD_DATE@2015-04-14 Mr Matthew Harrison British Geological Survey (BGS) Science Director Informatics +44 (0)115 936 3100 +44 (0)115 936 3200
Environmental Science Centre Keyworth Nottinghamshire NG12 5GG United Kingdom enquiries@bgs.ac.uk
none none
application/vnd.ogc.se_xml European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. BGS_EMODNET_CentralMed-MCol 9.83125 30.01040372 22.23542659 46.18958333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. BGS_EMODNET_AegeanLevantineSeas-MCol 22.23541667 30.39790787 36.73542827 41.38958333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Aegean Sea and Levantine Sea European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. BGS_EMODNET_BayBiscayIberianCoast-MCol -26.11458333 32.58123877 -0.489562830000001 46.61458333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Bay of Biscay and Iberian Coast European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. BGS_EMODNET_CelticSeas-MCol -26.11458333 46.61456967 -0.489562830000001 63.69791667 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Celtic Seas European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. BGS_EMODNET_GreaterNorthSea-MCol -0.48958333 48.8104034 13.76042807 65.38958333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Greater North Sea European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. BGS_EMODNET_WesternMed-MCol -0.48958333 35.21874234 9.83125826 44.78958333 OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Western Mediterranean
gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.1.0-scaled.tiff0000644003401500001440000001061413614004466025001 0ustar rouaultusersII*<-- S : R$ S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Đ@q@AYA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-ArcGIS-1.1.0.xml0000644003401500001440000000436013614005405024602 0ustar rouaultusers Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 2 0 0 24099 34818 61676.038377249904 6605831.1432084311 543676.03837724985 7302211.1432084311 urn:ogc:def:crs:EPSG::3067 61686.038377249904 7302201.1432084311 19.999999999999996 -20 Field_1 Field_1 Field_1 nearest linear cubic 1 urn:ogc:def:crs:EPSG::3067 urn:ogc:def:crs:EPSG::4326 image/GeoTIFF image/NITF image/HDF image/JPEG2000 image/PNG gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.0.0-scaled.tiff0000644003401500001440000000647513614004466023640 0ustar rouaultusersII*<&U&S ` x$ -( WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 1Ԕ@^y?*@iHAMqYA((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|                       gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-2.0.1-scaled.tiff0000644003401500001440000004225413614004466023717 0ustar rouaultusersII*<-%-S <$ T$$$ $$$J#0 EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 RED_BAND 0 255 RED_BAND Undefined GREEN_BAND 0 255 GREEN_BAND Undefined BLUE_BAND 0 255 BLUE_BAND Undefined Đ@q@AYA#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|                               `46T23Q!R  &"U Qdlh95l2/}o%,)sh % X&l&%a+ w                               MP(%`-.N..XYM #0-S  a1 u#6ZRv:>Z u**[%k2%u                Y[9            XV'j<9i40nk` &*!`  d){=/!X`/1&A=`3#V                                /.aQ56P& ZZ&a  ! D@u(R v " K49]d Z`g4#FD'c                              &%^;;&# &("Z&Z'a &!Y):&ik"n!o_(-2=M(!f)'c-x"`42t                               <A\)q$#    & " I"]1'$ dh&1 ].*S2/W3&)x)M* ++1(u#\6Kn'c N**                  ""y,([Z" # &' *-!hD>&!N-)d+&^(h u#jJB}-RR]1 85T+ & lm(u??a v#U1!                      (w&Q 22! ! # %'D!^!6,'(%p&daM,#k"V ABAq-!qF@q0+Y, .#fC"=9n-*_#-G.!             amd )%       #U\;  $\35T c'T&,+Qa+)hCB8|+#Z3 ) h,Pd.$e/* *                )u]e8      1&<]CC<! )(  %B(&   0MQF # W^K (* " %# 1#) 6"  K=y     %}f 76^  &} s0'n  >-` 2&w h  8%  ! " % ! 0+6(,C# 2          "U{!V :6j '|  3'N*z  #r  %y#6#hlA4T;;S% % ' 3!#c%        "Q&d     )t:&*, 73C? +x, ,        $X          -.L!YQ#    LPJ.%;5i ' { %g%3 $0"H v BC  "NMKQL%#Z        T'#a   ^c93(w85o1,. &k ' #   *w)A  # %m    X   ++OE&$W          $ )$`   "r"m9$i,0 .4    +* H8}e#:%)h%|        " &H9K D@u l  `+#r"m   d(  k( (  ;*H S      46Q 11T%)%a!t          z G TC:* y r o   ) n )$cU          &m);!w z v[#(h    g  !3   x -*n                  A6~-{   t" ! * ,  b"FK^2& t 66]e            #UQI{    })  =3`)!.,z NONE NONE Velmu_wcs_testi 1.1.2 3@4@(b:@S*[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-Rasdaman-2.0.1.xml0000644003401500001440000005532413614005405025124 0ustar rouaultusers rasdaman rasdaman server - free download from www.rasdaman.org OGC WCS 2.0.1 http://www.opengis.net/spec/GMLCOV/1.0/conf/gml http://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coverage http://www.opengis.net/spec/WCS_coverage-encoding_geotiff/1.0/ http://www.opengis.net/spec/GMLJP2/2.0/ http://www.opengis.net/spec/WCS_coverage-encoding_jpeg2000/1.0/ https://www.ietf.org/rfc/rfc4180.txt https://www.www.json.org/ https://www.w3.org/Graphics/JPEG/ http://www.w3.org/TR/PNG/ http://www.opengis.net/spec/WCS_coverage-encoding_netcdf/1.0/ http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsetting http://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scaling http://www.opengis.net/spec/WCS_service-extension_processing/2.0/conf/processing http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0/conf/get-kvp http://www.opengis.net/spec/WCS_protocol-binding_soap/1.0 http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0 http://www.opengis.net/spec/WCS_service-extension_transaction/2.0/conf/insert+delete http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs Jacobs University Bremen Prof. Dr. Peter Baumann Project Leader +49 421 20040 Campus Ring 1 Bremen 28717 Germany p.baumann@jacobs-university.de pointOfContact XML SOAP XML SOAP XML SOAP XML SOAP application/gml+xml image/jpeg image/png image/tiff image/bmp image/jp2 application/netcdf text/csv application/json application/dem application/x-ogc-dted application/x-ogc-ehdr application/x-ogc-elas application/x-ogc-envi application/x-ogc-ers application/x-ogc-fit application/x-ogc-fits image/gif application/x-netcdf-gmt application/x-ogc-gs7bg application/x-ogc-gsag application/x-ogc-gsbg application/x-ogc-gta application/x-ogc-hf2 application/x-erdas-hfa application/x-ogc-ida application/x-ogc-ingr application/x-ogc-isis2 application/x-erdas-lan application/x-ogc-mff2 application/x-ogc-nitf application/x-ogc-paux application/x-ogc-pcidsk application/x-ogc-pcraster application/x-ogc-pdf application/x-ogc-pnm text/x-r application/x-ogc-rmf image/x-sgi application/x-ogc-vrt image/xpm application/x-ogc-zmap http://www.opengis.net/def/interpolation/OGC/1.0/nearest-neighbor test_irr_cube_2 ReferenceableGridCoverage 75042.7273594 5094865.55794 "2008-01-01T02:01:20+00:00" 705042.727359 5454865.55794 1199750578 NIR RectifiedGridCoverage 0 0 1916 1076 RadianceColor ReferenceableGridCoverage -90 -180 "2002-07-01T00:00:00.000Z" 90 180 "2015-01-01T00:00:00.000Z" BlueMarbleCov RectifiedGridCoverage -90 -180 90 180 NN3_1 RectifiedGridCoverage 0 126 multiband RectifiedGridCoverage 234989.6219400902 5816800.1278943575 500467.1219399674 6097439.6278945765 lena RectifiedGridCoverage 0 0 161 161 NN3_2 RectifiedGridCoverage -0.5 125.5 test_AverageChloro ReferenceableGridCoverage -90.0 -180.0 "2015-01-01T00:00:00+00:00" 90.0 180.0 151392 AvgLandTemp ReferenceableGridCoverage -90 -180 "2000-02-01T00:00:00.000Z" 90 180 "2015-06-01T00:00:00.000Z" climate_earth RectifiedGridCoverage -0.5 -0.5 -0.5 719.5 360.5 60.5 Temperature4D ReferenceableGridCoverage -90 -180 "2013-12-17T00:00:00.000Z" 0 90 180 "2015-01-11T00:00:00.000Z" 1500 AvgTemperatureColorScaled ReferenceableGridCoverage -90 -180 "2000-02-01T00:00:00.000Z" 90 180 "2015-07-01T00:00:00.000Z" visible_human RectifiedGridCoverage -0.5 -0.5 -0.5 1023.5 607.5 1882.5 meris_lai ReferenceableGridCoverage "2003-01-01T00:00:00.000Z" 40.000027885 -89.999999885 "2003-12-21T00:00:00.000Z" 49.999999885 -80.000027885 test_mean_summer_airtemp RectifiedGridCoverage -44.525 111.975 -8.975 156.275 NN3_3 RectifiedGridCoverage -0.5 125.5 AverageChloroColorScaled ReferenceableGridCoverage -90 -180 "2002-07-01T00:00:00.000Z" 90 180 "2015-05-01T00:00:00.000Z" NN3_4 RectifiedGridCoverage -0.5 125.5 climate_cloud RectifiedGridCoverage -0.5 -0.5 -0.5 719.5 360.5 59.5 RadianceColorScaled ReferenceableGridCoverage -90 -180 "2002-07-01T00:00:00.000Z" 90 180 "2015-01-01T00:00:00.000Z" gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.0.tiff0000644003401500001440000000656613614004466022414 0ustar rouaultusersII*j  S     R b   OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.0 Undefined Undefined Undefined ӯ!q?ӯ!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-2.0.1-non_scaled.tiff0000644003401500001440000000172413614004466025656 0ustar rouaultusersII*@@(S  &$V 2554@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.0.0.tiff0000644003401500001440000000134413614004466021544 0ustar rouaultusersII*S  2$b ? NONE NONE Velmu_wcs_testi Velmu_wcs_testi 1.0.0 3@4@(b:@S*[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-ArcGIS-2.0.1.xml0000644003401500001440000001357513614005405024450 0ustar rouaultusers Velmu_wcs_testi OGC WCS 2.0.1 http://www.opengis.net/spec/WCS/2.0/conf/core http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0.1 http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0 http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs-gridded-coverage http://www.opengis.net/spec/WCS_geotiff-coverages/1.0/conf/geotiff-coverage http://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coverage http://www.opengis.net/spec/GMLCOV/1.0/conf/special-format http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart http://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scaling http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/nearest-neighbor http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/linear http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/cubic http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsetting NONE NONE image/tiff http://www.opengis.net/def/crs/EPSG/0/4326 http://www.opengis.net/def/crs/EPSG/0/3067 http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbor http://www.opengis.net/def/interpolation/OGC/1/linear http://www.opengis.net/def/interpolation/OGC/1/cubic 17.483058091685201 59.36197532178339 27.956287922334681 65.841210879037476 Coverage1 GridCoverage 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 Coverage2 GridCoverage 17.483058091685201 58.78220036767393 27.956287922334681 65.841210879037476 Coverage3 GridCoverage gdalautotest-3.0.4/gdrivers/data/wcs/ArcGIS-1.1.1-scaled.tiff0000644003401500001440000001252013614004466022775 0ustar rouaultusersII*<OOS  $N + NONE NONE Velmu_wcs_testi 1.1.1 s@Js@JN AS*ԸZA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|ccKccccccccKKKKKKcKKccKKKccKKKccKKcKccKcccKKKKccKKKccKKcKKKccKcKKKKKcccKccKKKcKKccccKKKKcKKcKKccccKKKcKcKcKcKKKccKKKKKcccKccccKccKKKKccKKKcKKccKKKKKKKKKKKKccKKcKKKKccKKKccKKccccKKKKccKKKcKKKKKKKccccKKKKKKKKKKKKKKKccccccKKKKKKKKKKKKKcKcKccKccKKKKKKKKKKKKKcKKcccKKKKKKKKKKKcKcccccccKKKKKKKKKKKccKKcccKKKKKKKKKKKKKcccccccKKKKKKKKKKKKKKKKccccKKKKKKKKKKKKKccccccKKKKKKKKKKKKKKccccKcKcKKKKKKKKKKKKKcKKccccccKcKKKKKcKKKKKKKKKKKKKcccccKcKKKKKKKKKKKKKKKKKKcKKKKKcccKccKcKKKKKKKKKKKKKKKKKccKKKKcccccccccccKKKKKKKKKKKKKKKKKccKKKcccKcccKKcccKKKKKKKKKKKKKKKcKKKKKKKcccccKKccKKKKKKKKKcKKKKKKKcccKKKKcccccKcccKKKKKKKKKKKKKKKccccKKKccccccKcccKKKKKKccKKKKKKKKKcccccKKccccccKcccccccKKKKKKKKcKKKcccKKKKccccKccccccccKKKKKKKKcKKcKKcccccccccccccKKKKKKKKKcKKKKKKKKcKccccccKccKKKKKKKKKKcKKKKKKKKKKKKcKccccKKccKKKKKKKKKcKKKKKKcKKKKKcccKccKKKKKKKKKKKcKcKKKKcKKKKcccccKcKKKKKKKKKKKKKKKKKccKKKKcccccKKcKcKKKKKKKKccKKKKKKKKcKKccccKKcKcKKKKKKKKcKKKKKKKKKKKcKcKKKKcccccKKKKKKKKKKKKKKccKccccKKKccKccKKKKKKKKKKKKKKcKccccKKccccKKKKKKKKKKKKKKKKcKKccccKcccccKKKKKKKKKKKKKKKcccccccccccccKKKKKKKKKKKKccccccccccccccKKKKKKKKKKKKKKKcccccccccccKKKKKKKKKKKKKcccKccKcKcKKKKKKKKKKKKKKKcKKKKKKKKKKKKKcKKKKKKKKKcKKKKKKKKKKKKcKKKKKcKKKKKKKKKKcKcKKKKKKKKKKKKcKKKKKcKKKKKKKKcKKKccKKKKKKKKcKKKKKKKKKcKKKKKcKKcKKKKKKKKKccKKKKKKKKcKKKKKKKKKccKcccKKKKKKccKcKKccKcccKcKcKccccccKccccKKccKccKcKKccccKcKKcKKcKKKKKcKcccKcKKKcKKKKcKccKKKKKKKcKcccKccKKKccKKKccKKKKKKKKcKKKKKKKKcKKKKKKKKKccKKKKcKKKKcccKccccKKKKKKKKcccKccKKKKKKKKKKcccccKcKKKcccKKcKKKcccccKcKKKKcccKKKKKcKKKKcKKKKKcKccKKKccccccccKKcccKKKKKKKKcccccccccccKcKccKcKKcccccccKccccKKKKKKKccKKKcccccccccccKKKcKKKcKKKccccccKcccccccKKKKKKKcKcccccccccccccccKcKKKKKcKKcKKcccccccccccKcKKKKKKcKgdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.0.0.tiff0000644003401500001440000000205213614004466023544 0ustar rouaultusersII*&S ` x$  WCS,WMS,GEOSERVER NONE This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE Web Coverage Service WCS 262 1.0.0 4@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.0-non_scaled.tiff0000644003401500001440000000473213614004466024567 0ustar rouaultusersII*(S   & $V  $ 3@3@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman2-2.0.1-scaled.tiff0000644003401500001440000053072613614004466023552 0ustar rouaultusersII*<h >RS 0 H x 0.NvnV6 -MvmV6 ,LvlV6 application/gml+xml,image/jpeg,image/png,image/tiff,image/bmp,image/jp2,application/netcdf,text/csv,application/json,application/dem,application/x-ogc-dted,application/x-ogc-ehdr,application/x-ogc-elas,application/x-ogc-envi,application/x-ogc-ers,application/x-ogc-fit,application/x-ogc-fits,image/gif,application/x-netcdf-gmt,application/x-ogc-gs7bg,application/x-ogc-gsag,application/x-ogc-gsbg,application/x-ogc-gta,application/x-ogc-hf2,application/x-erdas-hfa,application/x-ogc-ida,application/x-ogc-ingr,application/x-ogc-isis2,application/x-erdas-lan,application/x-ogc-mff2,application/x-ogc-nitf,application/x-ogc-paux,application/x-ogc-pcidsk,application/x-ogc-pcraster,application/x-ogc-pdf,application/x-ogc-pnm,text/x-r,application/x-ogc-rmf,image/x-sgi,application/x-ogc-vrt,image/xpm,application/x-ogc-zmap http://www.opengis.net/def/interpolation/OGC/1.0/nearest-neighbor GMLCOV/1.0/conf/gml,GMLCOV/1.0/conf/gml-coverage,WCS_coverage-encoding_geotiff/1.0/,GMLJP2/2.0/,WCS_coverage-encoding_jpeg2000/1.0/,https://www.ietf.org/rfc/rfc4180.txt,https://www.www.json.org/,https://www.w3.org/Graphics/JPEG/,http://www.w3.org/TR/PNG/,WCS_coverage-encoding_netcdf/1.0/,GMLCOV/1.0/conf/multipart,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_processing/2.0/conf/processing,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_soap/1.0,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_transaction/2.0/conf/insert+delete,WCS_service-extension_crs/1.0/conf/crs rasdaman server - free download from www.rasdaman.org rasdaman Jacobs University Bremen http://rasdaman.org/ Bremen Germany Campus Ring 1 p.baumann@jacobs-university.de 28717 +49 421 20040 Prof. Dr. Peter Baumann Project Leader pointOfContact 2.0.1 b1 b2 @ @7C+4@Ic0TA# y )#WGS 84 / UTM zone 33N|WGS 84|~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?~]@?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?O@%?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?oC@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?=@?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?B@Z?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?_K@?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?T8@2?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?Q+@?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?ƪ(@*?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?I2@j?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?8@?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?"@z?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?@S?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?s@-?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?u$@=?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\?y#@\? @? @? @? @? @? @? @? @? @? @? @? @?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?J@?@?@?@?@?@?@?@?@?@?@?@?@?T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??T@??W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?W @?????????????????????????w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"?w?"??7??7??7??7??7??7??7??7??7??7??7??7?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C?@C???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @???????????????????????????iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?iY?j?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'?D?'??V??V??V??V??V??V??V??V??V??V??V??V? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?g??g??g??g??g??g??g??g??g??g??g??g??g??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ??ԟ???z??z??z??z??z??z??z??z??z??z??z??z?~??~??~??~??~??~??~??~??~??~??~??~?? @? @? @? @? @? @? @? @? @? @? @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??zM??\??\??\??\??\??\??\??\??\??\??\??\??d??d??d??d??d??d??d??d??d??d??d??d??X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?X? ?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?0 @?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?`? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?v? ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?.*?j ?$??$??$??$??$??$??$??$??$??$??$??$??e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?e@?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?T?s?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?\?v?????????????????????????u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?u@!?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?6@>(?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?}cu?D ?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?=?s'?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?@x,?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?+/3@2?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\@3?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(?\&?Z(??4??4??4??4??4??4??4??4??4??4??4??4?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?W&@_<?gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??gU@??R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:?R{@:? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,? ?,?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?@#=?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?uE@LF?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?m@E?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?"\@<?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?v@,?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?;@ >?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?UZa@F?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?;}@C?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?E@h9?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?zC@*?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?]i\@@8?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?!v@>?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?@I<?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?<ƃ@/6?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?Lf@9+?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?+mr@1?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?W~@5?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?P@.7?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?|@8?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?x@s0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?Ʊx@0?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?5z@>3?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?x@9?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?o@:B?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?u@58?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?jp@3?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?lm@E5?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?j@<?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?d@#H?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9?g>k@9? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3? f@ 3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?$d@%3?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Kd@8?Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??Rc@??l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@+?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?l@%?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?;m@$?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?p@z%?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?;t@:&?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@?@?@?@?@?@?@?@?@?@?@?@?@?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?齆@L ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?8@$ ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?W݊@W ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?ɞ@I ?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x?@x??@??@??@??@??@??@??@??@??@??@??@??@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>?^1@>? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(? @(?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?(@?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?@n?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?3@?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ?0@A ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ? @ ?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?F@?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?@ ?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!?S@!? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @_$? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)? @)?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?@=?'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??'@??@??@??@??@??@??@??@??@??@??@??@??@??u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?u@'A?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E?Y@*E? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X? @X?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@|V?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@T?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT?@jT??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V??@V?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?M@c?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?@]?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?e@Y?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?u@X?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@^Z?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?@>`?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?*@Y?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?@.T?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?.@R?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@U?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@X?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?@P?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?\@L?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?T@K?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?:@cM?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?@dP?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?x@#J?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@HF?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?@E?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?g"@H?gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-1.0.0-non_scaled.tiff0000644003401500001440000000172413614004466025654 0ustar rouaultusersII*@@(S  &$V 2554@4@@[A#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-GeoServer-1.1.0.xml0000644003401500001440000001043113614005405025264 0ustar rouaultusersWeb Coverage ServiceThis server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. WCSWMSGEOSERVERWCS1.1.01.1.1NONENONEFinnish Environment Institute, Marine Research CentreAri JolmaSenior Research ScientistHelsinkiFinlandari.jolma@gmail.comTrueFalseXMLeusm2016Generated from GeoTIFFeusm2016WCSGeoTIFF17.475602613769112 58.781311815855325.816386818370457 65.85002305038745smartsea:eusm2016eusm2016-EPSG2393Generated from GeoTIFFeusm2016-EPSG2393WCSGeoTIFF17.476423085843237 58.7814874118187425.81728699126928 65.85020367362361smartsea:eusm2016-EPSG2393southGenerated from GeoTIFFsouthWCSGeoTIFF17.750846897764713 59.4022172977940832.07494665128107 65.06949807111674smartsea:southgdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.1.tiff0000644003401500001440000000377413614004466022472 0ustar rouaultusersII* S $ <$l $1256 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Undefined Undefined Undefined 4@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer-1.1.0.tiff0000644003401500001440000000346313614004466022402 0ustar rouaultusersII*/S : R$ -S255 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 G4@G4@Q[GA9[A((# Y  )#XZdTx&1p^NbX94@Gz?jtV-?KKJ / Finland Uniform Coordinate System|KKJ|gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-Rasdaman2-2.0.1.xml0000644003401500001440000001300113614005406025334 0ustar rouaultusers 75042.7273594 5094865.55794 "2008-01-01T02:01:20.000Z" 705042.727359 5454865.55794 "2008-01-08T00:02:58.000Z" test_irr_cube_2 Linear 0 0 0 0 0 0 62 35 3 E N unix 80042.7273594 5449865.55794 "2008-01-01T02:01:20.000Z" 10000 0 0 E Linear 0 -10000 0 N Linear 0 0 1 "2008-01-01T02:01:20.000Z" "2008-01-03T23:59:55.000Z" "2008-01-05T01:58:30.000Z" "2008-01-08T00:02:58.000Z" unix Linear b1 b2 ReferenceableGridCoverage application/octet-stream gdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-GeoServer-2.0.1.xml0000644003401500001440000000606613614005406025442 0ustar rouaultusers 6543350.381089335 3061592.6391462097 7307056.899896299 3432141.361396798 smartsea__eusm2016-EPSG2393 Linear 0 0 0 0 18519 38169 i j 7307046.895881119 3061602.643161389 0.0 20.00803035910304 -20.00803035910304 0.0 GRAY_INDEX 255.0 0 255 RectifiedGridCoverage image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/Rasdaman-2.0.1-scaled.tiff0000644003401500001440000006166213614004466023466 0ustar rouaultusersII*<x-S    :J 0R.N application/gml+xml,image/jpeg,image/png,image/tiff,image/bmp,image/jp2,application/netcdf,text/csv,application/json,application/dem,application/x-ogc-dted,application/x-ogc-ehdr,application/x-ogc-elas,application/x-ogc-envi,application/x-ogc-ers,application/x-ogc-fit,application/x-ogc-fits,image/gif,application/x-netcdf-gmt,application/x-ogc-gs7bg,application/x-ogc-gsag,application/x-ogc-gsbg,application/x-ogc-gta,application/x-ogc-hf2,application/x-erdas-hfa,application/x-ogc-ida,application/x-ogc-ingr,application/x-ogc-isis2,application/x-erdas-lan,application/x-ogc-mff2,application/x-ogc-nitf,application/x-ogc-paux,application/x-ogc-pcidsk,application/x-ogc-pcraster,application/x-ogc-pdf,application/x-ogc-pnm,text/x-r,application/x-ogc-rmf,image/x-sgi,application/x-ogc-vrt,image/xpm,application/x-ogc-zmap http://www.opengis.net/def/interpolation/OGC/1.0/nearest-neighbor GMLCOV/1.0/conf/gml,GMLCOV/1.0/conf/gml-coverage,WCS_coverage-encoding_geotiff/1.0/,GMLJP2/2.0/,WCS_coverage-encoding_jpeg2000/1.0/,https://www.ietf.org/rfc/rfc4180.txt,https://www.www.json.org/,https://www.w3.org/Graphics/JPEG/,http://www.w3.org/TR/PNG/,WCS_coverage-encoding_netcdf/1.0/,GMLCOV/1.0/conf/multipart,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_processing/2.0/conf/processing,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_soap/1.0,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_transaction/2.0/conf/insert+delete,WCS_service-extension_crs/1.0/conf/crs rasdaman server - free download from www.rasdaman.org rasdaman Jacobs University Bremen http://rasdaman.org/ Bremen Germany Campus Ring 1 p.baumann@jacobs-university.de 28717 +49 421 20040 Prof. Dr. Peter Baumann Project Leader pointOfContact 2.0.1 Red Undefined Green Undefined Blue Undefined VUUUUU?VUUUUU?$@F@#  mtr@@TXAWGS 84|JO78E(AG1PR8KP5NP8FL4KN5FI/KM4DG1SR9XVUUH,=E,DK/AH,;D,DG1FE,OO:SS;TT;NO58E) >g"Bk"Ak"Bl"Bl"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk *17'#*"Cl"Bl"BlIO6UU.3"7?'8E.9\"Ak"Ak"Bk"Bk"Ak"Bl"Bk"Bk"Bk"Bk"Bk"Bl"Bl"Bk"BkE)C)=J'-86=$EN.FK.EK-BI-EM/DK/;C*LN6OR7EI.BH/@F,MQ5QS8PQ;KO5QT9VV>OR6=G,8=)8E)NQ8BJ3!?h"Ak"Bl"Bl"Bk"Bk"Ak"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Ak"Bk"Bk"Bk"Bk#Cl-4=b$0'"+#Dn!Aj"Bk"'&'/ -20;"'09'3KP3EN0FJ/GK06A(NQ6@I,QS;HN4KN3IM3HM2eaGPT8.6#KP5DJ/H*AK0LQ6PS:LP4JO3SU9JN0/3 >d"Bk"Bk"Bl"Ak"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Ak"Bk"Bk"Bk"Bj!@i"Bl "Bk"Cm"Bk!Aj&/-&+4$, +6 #4A!7C#&0<(25>")36;#09#AE+HK-LQ2EJ.>F)JP5GN3:E)GI/"Bk"Bk"Bl"Bk"Bk"Bk"Bk"Bk"Bk"Ak"Ak"Bk"Ak"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Ak"Bk"Bk"Bk"Aj9^!@i"Cm"Bk!@i-4 "+ kj_!(5N!"&1 ! ,27A# "-&6F#,8 6=$DK+JO/HM2OR9HM3IO3IL2"Bl"Bk"Bl"Bl"Bl"Bk"Bk"Bk"Bk"Ak"Ak"Ak"Bk"Ak"Bk"Ak"Bk"Bk"Bk"Ak"Ak"Bk"Bk"Bk"Ak"Ak"Ak#Cm >e 8V"Bk%4 $ ( '+",50>!* #.$-)6 %02@ "4=!AD(CI.GM3LO6IM3CJ0"Bk"Bl"Bl"Bl"Bk"Bk"Bk"Bk"Ak"Ak"Bk"Bl"Ak"Bk"Ak"Ak"Ak"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Bk"Ak"Bk%16>=)" ;K$ '( ! /7     ( 07"*6%,!(+,3!&/6 <='LO8CG0 >e"Bk"Bl"Bl"Bl"Bk"Bk"Bk"Bk"Ak"Bk"Bk"Bk"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak=d"Bk+75$ !+3B".819#,  (4 %1" .$.?Q(*53:#PV7/7"8<$YR>"Bl"Bl"Bl"Bl"Bk"Bk"Ak"Ak"Ak"Ak"Ak"Bl"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Bk"Ak"Aj"Bk"Bk"/$')8?#DG/CI/ON2[V<^X; >E(PO4?D)  36  * 1>)78B$'4 $,&(,:E(08?H+CI.<]"Bl"Bl"Bl"Bk"Bk"Bk"Ak"Ak"Ak"Ak"Ak"Bk"Ak"Ak"Ak"Bk"Ak"Ak"Ak"Bk"Bk"Bk"Bj"Aj"Ck"Bk>E*FI.8;$4<"6;$;>("&(.OQ4&+>A&.6 !)0"  $"' $+"2%9D$)5-="7:&07! &SW="Bl"Bl"Bl"Bl"Bl"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Bk"Ak"Ak"Ak"Aj"Bk"Ak"Ak"Ak!Aj!Aj"Bk"Bl'0PP3IL2ZW?LM3)/+2KO.DJ-&*<=$ $=D&+2 -;,:;E'  )2 25!.= '!&?I++:'+"(.CG..9 =1"Bl"Bl"Bl"Cl"Bk"Bk"Bk"Ak"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Cl"Bj"Bk"BlZV<)1;@%AG*\\=1;$.7@A*04IO, !$#,->  )( (3-7$!(*:)/ '2/@!5G&:H)=D+6A(EK1!34#"Ak"Bl"Bk"Ak"Bk"Bk"Ak"Ak"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Ak"Ak ?f"Bj"Ai!?gCE+ >H&1A!/7+1"*3E#1997# ", ?J(HN/"++6@C(#(.<NN0VW  1: -149%FL4$,.5 >D).3"Bk"Bk"Bk"Ak"Ak"Ak"Ak"Ak"Ak"Bk"Ak"Ak"Ak"Ak"@i"Ak!@i"Aj"Ai"Bk!Aj 19$0<$-(4#.:<$=@&SV4$)6IK+!**2=C'#0 5A#$$/!'.-;  5?$:=&  ?J+)48G%>J1f!@h!Ai"Bj66!  $7J$  NL//=!")*608+8=@)IL/FI-WU: %3  !!#+#-JQ009! 4="5?$8D%*5PT99=';A(?G+FH,"Bk"Bk"Bl"Ak"Ak"Ak"Bk"Ak"Ak"Ak"Ak"Ak"@k"@k ?h"Aj"Ak"Ak"Aj!Aj"BjUP6&4   !%2? =A%%.!4?")6!*7?#E',> /7 )8EQ//6W[648$4: CK*7A$@F)34#7:%EE,5C!+6   ,9"IM1JP0/7 %)=A%"Bk"Ak"Ak"Ak"Ak!@j"Ak"@k!@j"@k"Ak!Aj!Aj"Ak!?h"Ak"Ak"Bj"Bk%GrLM5?B(&/..&1   7;#%+")6; $$)=,>N)/1OP/%.BB*KM->@&LL2.9GL1 %(05< 4D @I(HO/KN1AC+37"7>""Bl"Bk"Bl"Ak"Ak"Ak!@j"@k"Ak"Ak!@i >f!?h"Bj"Aj!@j"Ak"Aj#Cm"Bk"Aj"Ai!AiHK+'2#0: $07?!-2 !!* $)3%AK)g!@h!>g!Aj#Cm&Iu"Bi#Cn "@i"Aj"Aj#Dn &0LI1"%BG+/3#+'3.:0B &2%7+51=  )5'48"'2=!JO1NP4 ( 2>OP5@?G(6:#:<'TV7"Bl"Ak"Ak"Ak"Ak"Ak!@j"@j!Aj!Aj!Ak!@j"Ak >e 2U",(!?h!@i"@i >g =e :V:>#DF-25','5+20@!)4-> $30F .;H&KK2 *6/5', -25@$ 57"%++.  /= &" (39"?A(=^"Bk"Bl"Ak"Ak"Ak!Ak"Bl"Ak!Aj!Aj!Aj#Dn"Bl"@i!@i!?g!>f!@i!@i!@i!@i"Aj!@h!Ah=B&#*6= &*2 /809'4$+ +: ''/#*>E''0%05>#29 18 /7((1 5?#7B&?F*15!11 "Bk"Bl"Ak"Ak"Ak"Ak"Ak"Ak!Aj"Ak!Aj"Ai79 !@i!@i!>g!?g!?g!?g >g ?g"Bj"Ak!@i!Ai479;#4>!8C$")$3.7(#%0 +AB' -1!$$)6@# ,7$,&-1<aaV 6?!+2$28!IQ10H3"Bl"Bl"Ak"Ak"Ak!Aj"Ak"Ak"Ak"Ak >e!?g!@i!?h e >f!Ai"Aj"Bj!Bj"ClBC*,//<#3(*2!)1> (0"'+7*2% ! " *   +3>K'    ?J''40;BN+49"02IQ;"Bl"Bl"Bl"Bk"Ak"Ak"Bl"Ak"Ak!Ai#Cm ?h!?i ;"Bl#Dm"Bk"Bk"Bl"Bl"Bl0O8]!?h >e,,%!>f9_8^ =e!?f!?g"@i"Ak!@h!@i!?h!@h!@h8<%5<"!.*6+:5>!$).:4e"Cl"Ak9`9^;c;`5X3U3&0Q!?h.G!@j!?h"@i!?h!?h!Ai!9O,+  #* -(5-7?B'+#/' )7A%&*4-0:E%"AM)9G%4= FL,8=%>A)>?("Bl"Bk"Cl"Cl"Bk:^:a!?h #AD(!HI-HI/"Bl"Cl"Bl!?f"@j#Co9`/O1S4X7]8^(C&A!@k =f4W7\5Z:a9^ =e"@i!@h"Aj*.  '18@$*: %/&-%,IL22:(1 '+5 /:7I" &)*-=M&6?@C)%% (;#2= !27#IL1%<9"Bl"Bl7[8]2U+I1S!@h#<9b4Y1T.N0.N4X f >h/O5W=d!@i!@i   2; 5:#jdJh_D DE.%,7>"'*5-99H$.;0A.;GT0BH.16 >B*9_8_3W2V7]*H%?%Ht%?%?3V5[(D3U+I$=,K6[0P5Y9^9_"@i!?g!@h"AjAF+-9 >A(KH4KC.[Z@g"@j/P =c#;6[(D'C.N5X ;$.73> 4=" 1F$ FP3 ;b6\+J.O =eg7\3T2U3W =e9]0P:_!@h"BlPP7EF0 *9>$4:$1;"$,!1FI-,4*4$$;7?$.7 /:  AH;CD>#)6@% (7(9 %<  =e:a/Q6\/O 4X =f"Co >g8_5Z(D6[8_9`:`8^.L1T.O*G9_3V3U!?g!@h!?f"Bj!.GG157"67#1304& +75I!4;"2; (- :I&*1 PWG ''5+7!*.D (+E*= i ;b6Z1T%Gt!?i >g5Z%?.N9^7\3V >f;`!@h!@h =f!@i*<75:EG17;#PM928 2;! /A272;+2 29! ( #-# 0A&.RV;  5Y6\,J-N4X"@k'C,J(E%@2T6[0R6Y&@7[ ;b3V,K8_7\.P/O4X2T8]5W!?h"Aj!@i!@i==*@?)IK0=E'AG)eAC)LN4=B(HK/38!"  #6(1CI):A  +<):  *3 4F$,!//>#5#Cp-M5[5[ 8*3X5Y ;d":/Q-M2S3W3W*F$<+J*I/N:c"@k)F6+G"9&A/P5X =d!@i >f!@h!@i!@i!@i4=%ZY@=@& #-FI. $*"6:!0<)9B&>A)6B!AB* .9!7K$&$  ;b!;e.N3W2U5Z$Cp)F#.O =f6['C2V1U!>g*H6[-K6[/(D!86\.N.N8]8^0Q,J:_ J$  $$+(4.N(C/P2V3W+":,L2V4X5Y"@k 2U!7$> 7$>&@":/N:_5Y5Xf!@i!@j!@j!@i!?h!@i"AiBG1 :>(GG3IJ5/7 !"*)1 6<# .31S6\+I2U3W6\3X"<)G8]"Bl --M6[4Y#<'D(E,M0*G'C0S.P2U,M*H)G0S*G2T"Bm;b7[.M"@i!@i!?h"@i"Ak >f >f!@i"Ai!Ai"BkIJ3LO3PQ:FL0^YCFC1 +DH. $,07 =C'2U.O0R2V3X 7[4W3U7["Bk!@i"Ai>E)LO9TU=ZY>[ZCGH1&*'6&.A /3,K,J9`2U!>i8\2U,K-M2W1U0S $&C5+J)H0'D'C0R)G/P/P+J)E(E)H*'B2S.M >e#Eo =f3V5Y8\5Z:` 1 3  )23U8^8^!Ah%Hu8_3V:` =e=d!Aj"Bj)2EH-/FKE3BB+AD+"/&4>$5Y2V&@/Q%@9`1U+L*H(F8` %":%@&B#=!9'E3Y8^+L-M*H 6+J 6*J 950'% #3$(4Y2T(D4X1S3U;`#DoJOC6R9_7]!?h ?f7TFE/RU:LK5 " (C-M(D6\7^:b":.*J'D(E-":'D*K(E'B+J5[ %?'C'C(G33":43#>6( !!;!8#;":'*H.O/P6[5Z0Q,J-K&@4W7\"Bl"Cl$Fq*8& 6S  2U#<-N6\*G7](10S%@)G.#<(G)G)I%?'F--P-O*K.P%@ 7":$?7!9 9$>54!:%B #< 2U/R5#=5Y0Q:`5Y8]#Ck$Fo!Aj   "(D1P!?g!AjLM6+K0S 5(D4Y"2V5[&A%@(F*H)G*H(E'D(G)-N3Y!6*K 6#<$="<+L 8!:)H2 9";151&B)I(F/Q4Z6 76Y5Y6\4W 2U%>)8^h%@'B.%A(E)F)H)H)G(F(F*I)H'C)F$,L 91$@ 9!; !;"<"<#>#>+L56[3";-N2V/Q5Z;`4X5Z:`!>g"Cm >d3W"Ak7Y#Cl"Cl"Bk"Bk!Ai,L-N+ #.(C 5(D'B*H)G*I)H*H)H(G(G(E+J)H)H,L#<5"=!;%C, 5#>!<!<!<"=$'C/'D*I.P5Z4Y2U5Y4Y3W8^6Z3T"Ai6[!?h2U,K&B$> $+J)H3%@(F*G,K(F)G)G(D(G(D-N9b.O 78$@65[5"<!:!:!:!: : :8$@.P,M(F76\0P8^9`4Y45Y3T*F*G/Q"@k=d4V!?g!Ai"Aj 0R0R.P.O2X+K)F$<)G5&B)E(F)G(F)G'D)H(E";'-/"=#=2!:!;6"!< 8 9 9!;!;'D(F"<1":1T/Q(E2U4Y1T$>6Z2U0R0Q(D!>f5X;b:`=e =e/Q3W.P.P-N'E($?2*I(F(E'D'D'D)E'C)F!:0"< 8"<'E4 86 98"<#> 7 98 :0.6!:(E5 -5 85Z/Q1T3U3W/O&@,I5W#Dm-M0Q >f 8%A 96 .O)I(F'E*I(E66 &":5Y2T.N)4W1 6.O2T3W,L,L5Z0'E1V.Q1W(D)I)G(F(E%A)H0T&B&C%A 0!;!;%@ :#"; $.5  : (#=$@";&B6&B$@'C*I%A)3X,L'D)H04W/P-M2U6\8_ !'C4Y*H6\3W5Z(D'C '5[3Y50$?(E)G.Q0S!8!:#=$?7!:"="<#=$@$?1 9# !:$A  $?";"<%@7!:#=$@$@17$Bq&B4Z%B'D-">i!93W)G'B4.N(D4Y3W8`5[ 6/%? )(F5&C)G(F  %@$>#<$>!:$?"<!:"<#>+K!;!: :!<4$?#>"=214!:7"= 9(G"< )H!&&#= .":.$>0Q0S,L4Y/Q2U6\-L2&C(F'D(E(E)H)G)G%@#='D%A$>$@$?"<#>%A#="<"<#?"=!;!;"=#?%B5"="<!:!91#=25 % +K4423 ,N 16["Al8] $?$@"<"<!;"<%A %)H$!;4#<"<!<!;,"<) 6   +07#?8(2 (  0'J|!>f1S4Y4Y!>i4Z#=(E*H*I+M)I+L"<#=*I+J'D(F%A$?5 7$@!;&D%A#<";!;!:!:(5#?-O4#="= "*I"<#>7$?47!;#=$>#>5(E)I5\ 95)   6[6\4Y2U/N 5)F)I*I,N*J4Z*H(G)H(E'C0T-N'A!9#>$?*J.Q&C$@"<#?77 7#>- 7' 8$A"<, ($18#>"="<"=#>7!;%=2V/O3"=!;22.8^ !:#>#=%A#>7#>4"=5&D!;#>#>!:"< *#8"<!:!9%B#<*G,K'C1'E)I+L*J$?)G*J)G.P1V)I.Q*H#=)H3Y.R1U,M 7/S'D/#; 6_)H*I&A$@$?!:+M*$<!:& ,N0S+J%?$A#<"< 93 +1"<#=$>%@";4Y+I14+,L+K,M+L'E*J3Y.P3X+K *$Ap1T :d3Z%=* *J,O!70T'A#;*J .P6)E"; 9%A(G5#> 9#?1!;0 4#>"<6  !:#=%A$@'D$?2U0S&$>)G+K+L,N,M&D#<-N4Z)H-N4Z &1T/Q1T$Bq3X2V-P.Q3X(E$Bs3X0T/R$?$<"<(F-O'D%A0 9d$@*K05]7)G6`!9 8!<!9,5 6#?*J"9"=";'C"<#<#<*H*J,M+K*J,N*K+K+J'J|!:e 'C/S,L+K.P-M#<-O9b1T)I,N-O.P-O3X'C7\$Co1S4Y(D(E-M9`1S2V8`)I/Q(D ;f4Y!l1&?!g3Vj2V0S1T8a2V+K- (D)H,M+L!9,K!=h0S :e3X5\9b"@m!>h*,M'C-N,M6^:c >f#Do%> k*I #;$Ao0Q#;;c3S#Ao/Q#=+L-O1V7_!=g"?k=c7[3U9^!=f :b4X&B6]'B.N%@,,7])P 60$<2T)F.N'C & 7*I";)H4Z'1U*I7*J(C3W5\3X:c7^*8a%Ds'L{3W .N0R-J#8P$<0S+K3W!=h8]%Hv(N~!?i =f"Bl!>g:a i$Cp"?j%Gv(K}(L(N~&Jx#Co9`7^/Q4'/9`1T$Cr3U0S $%4Y:a%Dt ;e3V!?i$Dr(L4Y*H32V6*I":(D )4Y.M   4Y5Z#Co#Cn5W4W!@i$Fr"Bk#Bm g$Er=a2V  34W$Dr/R (E2U(D7^8^#; /P6Z!?j;b'K|5X"@l&B!86\(C:`(K}3X5Y!@j ;c5[4X7]5Z6\7]2V*G2 =e$Fs#Cm(M}(M}!@jh0Q!7 & &+T(L~)G,I5Z7],L";)O">i0O4X!6"60R%Hu"Bk/Q5V4W%Er!>g%Fu ;e/P4Y-M2-M0R9_!g1S2S8^+S"Bn$Co-J%>6[7]1T)P!@g#Do#@m3W6\2U4X"@j*F9a5[.'L|5V5[$Er!>h*G7Z$Ep*R&Jw,V"Cm)E:b"?j5Z8]:b8` ;c)E2U6\5Z7]#Bn"@j)P3S!@j$Dqg3W-K EC, ;d!g g#Cn$Gr!>g!?h ,K7];c$Co!>g8_ =e#Dn6Z$Gs4T%Hu'K}9[#Cn$Ep3. /,#Cm&Jw$Fr++ ;A'TQ9OO7VS8#Ep&Jx(L|&Fv(N)P+T,U$Fp#Dn"Cm!@i$FqHK/-5/> "Bl:a3W!?i"?i =e =e#Dp"Aj,T#Dp7[8]!?h"?h:`)F#Dp$Fq#Do$Fr"=h6Y2"7(L~6X"Bk)($Ep!9RKF/?=&PT049!OH0=7&FE, 8C$ 7=%/.NL1"Ah$Fq$FrML3 55"HN5HH-$, =L(! +9!?h!?i =e"Al"Cn"Al#Dpf&Ky)O >e$Eo"@j#Co ;dd:`5Xhi;_&=f"BjWO:LI2LG.30!?>(MK/DB+?=97!JH.@N(!HO.DK*EJ*>I'-;/6 *9 .B!& &* 06&Iy;`#Bn"Bm >g=a%Gs =c:^:`+I#Bm&Hu2S9_ gd=cgXA]Q9TO4HG,PN6A>*96# NO,03:K(")3:**! ()&) 0=!9>%FM0DR- ;=$ #Al >f f0O"?h!?id%= =e!?h f"AiQF0\Q9>;)UO6@:)HD-SQ4ZX;"!,1./%(6;#(+FN,ebB+,;<%;9!\Y8D>&0-KM2 !?f"Cm#Dn"Cl >g"Aj%Gv:_!?h!@i"Aj!?h"Al#Eoe%Gt,U3W $$Ep >e!@j"Ak"Aj!@h"Bk$Do"@i%Gu"@i!@h"@j!>g!?h"@i!?f?;+-*,*GD-&#HF,0/00TR0><'?@*Z[6+)14EL,48NG)MH*UQ3ON.@@*,+$Eq"Cl ?g"Bk"Al!Aj"Al!@j:`!?h!Aj!@i!?h =d5X ?f*F+9`+F"Aj!?f"Ak"Ak"Bk"Cl"@i"@i"Aj#Cn"@i ?g;a:_"Bk >f"Ak"Ak"Akff"@i!?g"Cl"Bl"Aj!@i"Bl"@k!?h2R!?h"Bl5V7] f"Al >f:_:`#Ep$Eq"?i#Bn!?h7[)D9]!?h!?f!@hwqQ^X)?>( #:?%TM4^W;h^A"Aj"Ak"Ak"Bl"Bl"Ak"Aj!@h#Eo$Fp#Cm"Cm!>f%Gt"Bl1Q$Co6Y8\"Ck!Aj!?h ?g >f"@i#Bm#Bm"@j"Bl"?i-K/O.M:`)D8\ 9)@F,9G%8>#^X8^T7pdF"Cl"Cl"Bk"Bk"Bl#Cm#Cl#CmSI3XR9#Cm"Ak#Co9]!@j'J{9b7](C0P7[
f!@i >g >f!@i"@j.L$Dp$Eq(M|!f =e =d!?h"BjRXG^T<^T>QH3+)+-EE- ]V8j^Bh`E=L%AD#Cm"Cl#Cm#Dn2HK/1EA+E@*OL0"Bk"Al"Cn!?h!@k'K|!=e >g:`.Z1Q!8 ;a#Bm!?h9^#Cn7\:]"Ck >f ;c.N8_7[-K:`8\:a7[6Y5Y(C!8#<7[;` >d!;FB<,50!FC, "OL3MK4mbD\TBd_A3MAN"Cl#CmOK3OI3%#PK1GB+?;'"5J"@j!@i >h"Bl"@k!?h#Am#Bm:`+I1Jg ;d0R/5/M =d&@-L2R >f8_5Y4W#?k2Q)P'L~'M~#Al $:a8]7\2U0O)F!?f=c ?f_ZFB;)GE-NI3LG0NH2d\@dZ<66"f_H A1"Bl.@4PI2EA*HE,TL2@?*@C2"Ak"Ak!?h!?h"Bl"Ak"@j =e"@l!7&LI3mbCSK2l`C\W=JB/UT9ZS9DF- "UN3YR8\Q7"@j"Bk"Ak#Bm"Bl"@k!@i"Aj =e#Do"@k4X-N'/O5[4Y5Z1T":!89` :c8^5W8^7[ f!>f >g ?f`V;dZ?JC.c[?87&,,e\@aVi"@j:` e"Aj!@i!@h!?hUQ9qfI**%%<:%),VO8\U;TN7WT;!@j"Ai!@i!@i!@j!@i"Bl"Bl"Ak =d&Iv$Dq"Bl"Al9_!=g =f'Iz$Bo9`/P ),K:b)P8`0+K)H/R 7#Do =d >g"@j"@j#Bm9^!>h/N8\ >f!?g!?h"@i!@i!@h!@i_U9k`Dl`EE>*\R6RM4]Q:QN::[ ?g"Aj"Bl"Ak!?h!@j"@j"Ak!?g!?h!?h!Ai:`9^ >f!?h:a7[8] !*G4X1S9`"Ak;b"?j3T%Gs#@l"?k%Cr6\1T !!?g8]7\ ?g#Cn"Bm#Bn =f+F ?f!@h"@i"Bl"Aj"Bj!?g?9',(`Uf9^8\!?i'C2U+H3U ;c8\!@j5\-K,J$Er =e"Alg"?h9_ >ff\T8[V9bX=;6&VK4|mO <_"Bk"Bj!@g!@h"Bj"Bl"Bl"Ak"Aj!@h!@i!@i!@i ?g!?h!@i!@j =d!@i9` =f ;a =f!>g'A"?g:` =e ;d,Ih#Dp!Ak =f$Dp#Ep ?f"Aj"Ak"Aj"Aj!AiE>+k\Am]BPI4eX?nbJ"Bl"Cl"Ak"Ai!Ai"Aj"Ak"Bl"Ak!@i!Aj"@j!@j!@i"Ak!Ak"Bm!Aj"Ak!@k!@j >f!>g >f"@k$Gt"Ak"?i4X3"?h >g"?h8]9_7\f8\#Cm%Iu#Dm"Aj"Ak"Ak"Aj"Bk!Ai^Q:aW:60#_S=eXf6[8];b">j5Y)D3T$Cn!=f!>f 'C9a2T*F-K#Dm%Hs(Jv"Al"Bk"Ak"Ak"Ak"Ak"Ak!@hugGl^@cWfX=q`FcU="Bl"Cl"Bk"Bj"Bj"Bk"Cl"@i"Bl!@i!?i"Bl"Aj"Bl!@j ?g >g!@j ?g!?h!Ak h"?k7]5X!72R;a "TI6%Gr$Dp"Ak"Ai"Ak"Ak"BksdHh[@maDk]BeYg"@j"@j!@j"Bl"Bm"Al!@i#Bm!Ai;b4Y!>g9^/\+I4X .L #Dn!Ai"@i!@h"AkrcGncF{nQk_DvgHtdHgV?reM"Cl"Dm"Cl#Cm"Bl"Cl"Bl!Ak"Bl"Ak!Ai"Bl!?g#Do!@g#Cm"Bk!@k >f:_6Y8\/P$Dp$Er#Cp+G6]"@l5[)&7]:_#Bm8]9_!=f%Es9a/N#:-L"@iiY@8^!@i!@i"Aj"AjykLsUykLnaFpRj[@j[BuhMk\AniFLJ9#Cm"Bk"Ak"Ak"@i"@i!@h"Bl"Aj"Bl"Bl"Ak!@i >f!@j#Co"Al"Ak!@h%Hu$Fq"Ak!@i#Cm9\$Eq :b7^!>i#:/M6Y:a =f =f g&Hw"@j6Y -M >f =e!?f >f!?g"AjrfIw`y\rbFziNscIscGq`Gr`Ek]Bq`Gi[C#*#"Cm"Bl"Ak"Aj"Bk"Ak"Ak"Ak"@i"Cl"Bl#Cn"Ak"Bl$Ep#Do >f ;b >e$Ep!@i"Bm#Al9^7[#Bl"Ak&Hx!?i7]9^f =e!@i$Dq =e =e4W9^7Z"@i"Ak"@i"@ipdI|nP{jO~bh{go]DucFoaFr`D{kQ`Q9"Ak"Ak"Ak"Cl!@h"@i"Ak"Ak"Bk#Cm"Cm!Aj"Cl"Cl"Cl$Fq#Cn$Fr"Bl!@j8\!Aj"Ak"Bl >ff9]#Ak$Er!?g:a7\8^8^ ;c!>g >f$Ft$Fs#Cm"Bl"Ak;b!?g"Al"AkvjLz\udInRwZz}jsaGo_CgY?k\Bq_EfW@!?g"Ak"Ak"Bk"Bk"Bk"Bk"Bj"Ai!@h"Bk"Bk"Bk!Ai"Bk"Ak"Bk"Bk`R;!@i&Hv5X#Dq"Cn"Bm!?h!@j"Ak$Er&Gv$Cq7\6Z ?h!>g4W5Y5X!=f0P4W9_2S6Z7\;a!?h}kNrSq`H~kQziPrVsXufJnQzbF|hLv^FwfN"Bl"Bk"Bk"Bk"Bk"Cl"Bk"Bk"Bl"Cl"Bk!Ai"Cm"Bk"Bk"Ak!@i"Bl"Bl"Ai!@i9^"Ak"Ak"Cm!Ak"?j#Cl"Aj ;c =d8];a =e9_!?i!>g:`!>g!>h >g e5X9^.N"@j#Bl"@j%Es9_:_:`8\:_:`!?i =f:a9_;a >e!@jmQqSoQkO|hLq_EzhK{eGkNkO{fKxcJv^EueM"Cm"Cl"Bl"Bk"Cl"Bk"Bk"Bk"Bk"Ai"Bk"Bj!@g!Ah"Bk"Bk"Bk"Aj"Bk"Ak"Bl"Bl;af ;c:a8^ g ?h"Al f >g >f!@i"Bn#Bn!?h#Co"@k"@j!?i;b"?j!@j >e Velmu_wcs_testi WCS 1.0.0 1.1.0 1.1.1 1.1.2 NONE NONE WCS 1.0.0 1.1.0 1.1.1 1.1.2 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 WCS 1.0.0 1.1.0 1.1.1 1.1.2 1 2 3 nearest bilinear bicubic image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF False True Näkinpartaisniityt_1 17.483058091685201 59.36197532178339 27.956287922334681 65.841210879037476 1 Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 17.483058091685198 59.361975321783405 27.956287922334674 65.841210879037476 2 Avoimuusindeksi merenpohjalla_3 17.483058091685201 58.78220036767393 27.956287922334681 65.841210879037476 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3067 image/GeoTIFF image/NITF image/JPEG image/PNG image/JPEG2000 image/HDF gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.1.tiff0000644003401500001440000000656613614004466022415 0ustar rouaultusersII*j  S     R b   OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.1 Undefined Undefined Undefined ӯ!q?ӯ!q?#@=DDG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.0.0-scaled.tiff0000644003401500001440000005604013614004466023634 0ustar rouaultusersII*<x-S   8 h !d'G OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 none The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none BGS EMODnet bathymetry MapServer WCS 2015-04-14T14:29:00Z 1.0.0 Undefined Undefined Undefined sVU?sVU? Bh#@DIVIVIV.3+[&(&"'$ !##TIVIVIV*<)@+a)'"$ !    0AinIVIV3(,=+])'!#!! #"fm 5",3+M*~(#"!! ejAM-,+=+])&#!!  1%0A /3.G*y%"!!  r"@*4D%+C*Z')#!!  "i)/HW.+H*m( !   !'*/,5+L*y($! '7P0y|FS9%O*y(! /'<,?O>+j%  ('G*x /3*-+Q'"E&,<(   1+]" !#*H'  $0)>'  +4.(h %3;-")["  @L3(##/ ΰ >)O% B 2) 6?8()x !  N=.+$5 p_T 3+gi[_gE[)YPE?N"x, SZ:+$iPJ*9E*LGHu   4W)%~|W8%?PH9=+)f)#ioD ~.=.U ev]suOlz{x)C,;C7. IZ V; 4v01f5 /!f E^g>"|TC cx k1L]1>(` ,T,3M4 e491>?7J!`ҽLB2F "IV ݑ}Y0DW8WM/6B6r$X5]\ a5D ݘɛJ~&!)0[6*V33 6x |ڗ]>EDwi/ưcz Ťd:3!4[9hs3 x ~wy Xn?f .A>'F{y{, cr)+ s9<8 ԡ N1M63{D 37k]1ف3@,( F3 1:z3 Ei3xOf!~#1.@fK^  (oq/CA38v3 AunXl8ak ֻ/  5tZovi[:;^K9J btP//,KME>J );~6 %/9@J JC6!.Y~g3.0n"(ZR*ڳ#/n\+cVo}D}*.W-8b   ]r  8> {     MC14LV]-0E Gbq  jjl to%U7g33r ueXkjBOo  ~6Aqhz {Q&+5="+"+   {E^RQVD:OU35mbk &53 ~ ݜp k(cZ7@D^(c!8L{X}|05 z&$+lN9N6; N475 EP ZCP7=6=J @6{NFL{|35N]q3V^x*5#Ir+0 y(-#,2  _?BB44 *54.L5927N  |:C9A7A;g8P"7pQhCp (3  {   ~ur`>PKR++h GK8Y!!]67?N?x592:_ ^H;)R-A7 +:Ty8Z\5 a61    ~k +1 6<%*x"'S RE J>9C!!]X8Y33yJ/1H>4%AT u39 r/7(=3[4(W0B a"K{veZ5s%    +1}xmg$'KCg' 3 D16N--j-22}7B(&&b@##_-0WD7<  # ,j 66̏vl.G2BNF    >V1*4vQS{H(E: w9` %  9A  }xxl6:zUYJP F G F4BL z&)?V3AY ZSqegp c8@9AG6?v Y6~%7s>|D ?:}#j  3kw} %*_U$&Q((fLOR3>V#. C. H..j33p@**tDC24a r174fd O:{|7bSOaz$*,2{ ] q]Qh') R?IL""^2U=MNP D X6/ EV4 C%%bUd;!(`5:SF20;,K Ic57UL9Vgw057<39H{6<5:B/1Pv3547_XQ$$l?//kU..k33u<E=5N7 D,,iOMM22~ TG)M%IP!!l\#%y02Z- |jj5.3$ 39 xs28f" i58Q WH P##g*+xA;!!_S MB NQSG**f \811n^,,u'(y3U \ FZA_v8> $&WKV5H |!-h ', "!&5:4;!.3t/8 ;mN346; "%CA+0)-Y$%t-6G18L93%NK9L EA9[U7=7AY7&'xIO a'  $* ,1#+q)/6<7= %") wl5:9A9A~-? h*+xA476<NE?<H""^4**g8>&T3402--jIR?7= >%0QDHAS=&e lw  !' 7=}7=k6A9B#,)1188AA9 &'Sp   -p7L34`G2Y F33p r k35$$bS6..m  P9EB$%w "u "y0B) 284; 3; x;E:C/J":D +17=495:"+ fS+b@35 [eX')13"$)38I8W 4WAf#$r35|),Z< +128,38>079A7.0466;UW02B:C 7@ {35 r" \Y4:Y.3166;") ;E;E  -5 (17@(4fr^n' 'D~i;g  ):C*C:T$:C9p !`0;>/[!+$4;F $+%+6;8s  [27-5 -  06 *2:D;F` k  5<9B:DaА{-55y%E:g.\4L%Z"3`_.t$ Թ YO-z/ 2Lq3+ ".tR4Z | ;N &0 1<H776*%>3(t 4y.YO:w85X̂kJ4H>ufKSj;Sɍ3,9rOrbK,4WwG 6h9U.-N7 -S&(yIY>J?9%\(?LRo&p8.}7636".9M5;4;ri{xjLLO3-e$17 Rm\qRF26&ctdfxs==) {c!aZs" 85?#c383Y9(Bonw * #/665450t< TXQnk\MBD1V!!B?=] n:53333=cʏ34 7o3@:4j1/,+.3'XRgK2QM4!lPI6[LE0A4C<3M@qs3_\Z+skW3_]Z%3WhT"34E33=82IgT3Mr4Vd5y1%_J#YRTNf_xlk3(iNO$JWej8 یb3U55B87:=qX;:;D΋x$-BG3sXNv)A2Ce|4}45W%b;>GG;3tF,D:΍{',aT32,5WkdXkeO<6,Yhb;Rlx6DXS 330 <y tD Z?NDJOQ\^st?3X0/ Θ8)om3, .qSjCOw~cNs333)33@Λ*j/34o3W ,k->M7c6.: Sm33  p33w;8ޥ32 0( `*7,+3:, toֱ3 ')    9C' f3ob$/"$   ^c1.3 /~h'2u'' /f Q^D.'34!0&Os.- 3/|f" 1 D2*)3qvhac   ldRm z &7)+C o$3}\  z..3RR I3IKK!tq XF' &)4[Gd82(:!c\^~cw39_f-H1PUBCB6E_ W{+$4 YG^acj!q ph"fs~ 3xv 9BIk.[+p"L7`7^:B88=0Y4C13ju "NOAlI.dZGM in6XG!2 -v t>FP4(b&x$x$~/YE4}  v@ %qm !}xjWSQ3WbS)8VS"װ>X*NqI3@@`w(M'Pgܧ٫%␃i "Q$ .<"!_-?$xЃIP9RQeZcg]o9a4M#.T~  %% uWnAQ)0;R/U'K +.TZ8[@3aUe#܅>PK6 f% #32\J1v}wؔ+ r&bLQO8#A yp%m C8Kygp\    3eD1E>92d$؀4JOK|{i)y*OJ{&Z O afEW7\/^s ȏ3 !$$$& ,3 3G0(!ĕzi/7i2?E/e%߂;XZ)K~-Z$4,!+/25"3  /xI-%Oe=F96WJLiy|e]LC2v9H>F"2_ )&%h33D3b`OV֋`t_VXM_W=H3_* ;J2P! ,-,"04˜1;FDAbYfZgXc^>oMV@9t q  ' 656*%mqjoIrn?vXVz~g\dTaNcK^1fl|xI BL!! ""##(3@  y [ _@H9l&|$n.`E>ODaU*)(  "#%%%#!# )33W 1d`fn}bZ^UbYcX`Rk7^ejp!"$##'$$$!'$$! && .K`ginkn_WbYbYbYcVbAZ"^n& w,))%(&#""%%"%!!!,y[W T0[LbX_VbYbYbYbY^UaNX6V$_bnx{HR(f).*,(%$#"!%% &)& ^[V3XM^V[TWN[T`W[S\QO@J5M,TZ kbIV%8?+N-N-P-j)'&$#%%%%%%%%% dil,f=w_`T`\_]^Z]YZV[V^YbYL8h6k$t*EQIV5F,-.3+?+H*Z)|&$! %%%"!!!  4))6?LSaaev`_V`YyhU6+gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-MapServer-1.1.1.xml0000644003401500001440000004261313614005406025300 0ustar rouaultusers BGS EMODnet bathymetry The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. OneGeology infoCoverageAccessService Europe EMODnet Bathymetry MD_LANG@ENG MD_DATE@2015-04-14 OGC WCS 2.0.1 1.1.1 1.0.0 none none British Geological Survey (BGS) Mr Matthew Harrison Science Director Informatics +44 (0)115 936 3100 +44 (0)115 936 3200 Environmental Science Centre Keyworth Nottinghamshire NG12 5GG United Kingdom enquiries@bgs.ac.uk Mon-Fri, 09:00-17:00 pointOfContact WCS 1.1.1 WCS 1.1.1 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol WCS 1.1.1 BGS_EMODNET_CentralMed-MCol BGS_EMODNET_AegeanLevantineSeas-MCol BGS_EMODNET_BayBiscayIberianCoast-MCol BGS_EMODNET_CelticSeas-MCol BGS_EMODNET_GreaterNorthSea-MCol BGS_EMODNET_WesternMed-MCol NEAREST_NEIGHBOUR BILINEAR image/png image/x-aaigrid image/jpeg image/png; mode=8bit image/tiff false urn:ogc:def:crs:epsg::4326 European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CentralMed-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Aegean Sea - Levantine Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Aegean Sea and Levantine Sea 22.23541667 30.39790787 36.73542827 41.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_AegeanLevantineSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Bay of Biscay - Iberian Coast region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Bay of Biscay and Iberian Coast -26.11458333 32.58123877 -0.489562830000001 46.61458333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_BayBiscayIberianCoast-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Celtic Seas region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Celtic Seas -26.11458333 46.61456967 -0.489562830000001 63.69791667 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_CelticSeas-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Greater North Sea region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Greater North Sea -0.48958333 48.8104034 13.76042807 65.38958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_GreaterNorthSea-MCol European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Western Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Western Mediterranean -0.48958333 35.21874234 9.83125826 44.78958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff BGS_EMODNET_WesternMed-MCol gdalautotest-3.0.4/gdrivers/data/wcs/GetCapabilities-GeoServer-1.0.0.xml0000644003401500001440000001026713614005406025273 0ustar rouaultusersThis server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. WCSWeb Coverage ServiceWCSWMSGEOSERVERAri JolmaFinnish Environment Institute, Marine Research CentreSenior Research ScientistHelsinkiFinlandari.jolma@gmail.comNONENONEapplication/vnd.ogc.se_xmlGenerated from GeoTIFFsmartsea:eusm2016eusm201617.475602613769112 58.781311815855325.816386818370457 65.85002305038745eusm2016WCSGeoTIFFGenerated from GeoTIFFsmartsea:eusm2016-EPSG2393eusm2016-EPSG239317.476423085843237 58.7814874118187425.81728699126928 65.85020367362361eusm2016-EPSG2393WCSGeoTIFFGenerated from GeoTIFFsmartsea:southsouth17.750846897764713 59.4022172977940832.07494665128107 65.06949807111674southWCSGeoTIFFgdalautotest-3.0.4/gdrivers/data/wcs/DescribeCoverage-MapServer-1.1.2.xml0000644003401500001440000000717313614005406025446 0ustar rouaultusers European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. European Marine Observation and Data Network (EMODnet) bathymetry for the Adriatic Sea - Ionian Sea - Central Mediterranean region. Native data is multi-colour GeoTiff. OneGeology continent@Europe dataprovider@EMODnet serviceprovider@British Geological Survey DS_TOPIC@geoscientificInformation DS_DATE@2011-06-30 Bathymetry CRS_SUPPORTED@EPSG:4326 EPSG:3031 EPSG:3034 EPSG:3413 EPSG:3857 EPSG:4258 geographicarea@Adriatic Sea and Ionian Sea and Central Mediterranean BGS_EMODNET_CentralMed-MCol 0 0 2976 3882 30.01040372 9.83125 46.18958333 22.23542659 9.83125 30.01040372 22.23542659 46.18958333 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:method:WCS:1.1:2dSimpleGrid 9.833333335 46.187499995 0.00416667 -0.00416667 urn:ogc:def:cs:OGC:0.0:Grid2dSquareCS Red/Green/Blue colour interpretations band bilinear nearest neighbor 1 2 3 urn:ogc:def:crs:EPSG::4326 urn:ogc:def:crs:EPSG::3031 urn:ogc:def:crs:EPSG::3034 urn:ogc:def:crs:EPSG::3413 urn:ogc:def:crs:EPSG::3857 urn:ogc:def:crs:EPSG::4258 image/tiff gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-2.0.1.tiff0000644003401500001440000002242413614004466022463 0ustar rouaultusersII*% S <$ T$$$ $$$J#0 EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 RED_BAND 0 255 RED_BAND Undefined GREEN_BAND 0 255 GREEN_BAND Undefined BLUE_BAND 0 255 BLUE_BAND Undefined 4@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.1.0-scaled.tiff0000644003401500001440000002362413614004466023716 0ustar rouaultusersII*<--S $ <$l $1256 WCS,WMS,GEOSERVER This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 1.1.1 Undefined Undefined Undefined Đ@q@AYA#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|                               `46T23Q!R  &"U Qdlh95l2/}o%,)sh % X&l&%a+ w                               MP(%`-.N..XYM #0-S  a1 u#6ZRv:>Z u**[%k2%u                Y[9            XV'j<9i40nk` &*!`  d){=/!X`/1&A=`3#V                                /.aQ56P& ZZ&a  ! D@u(R v " K49]d Z`g4#FD'c                              &%^;;&# &("Z&Z'a &!Y):&ik"n!o_(-2=M(!f)'c-x"`42t                               <A\)q$#    & " I"]1'$ dh&1 ].*S2/W3&)x)M* ++1(u#\6Kn'c N**                  ""y,([Z" # &' *-!hD>&!N-)d+&^(h u#jJB}-RR]1 85T+ & lm(u??a v#U1!                      (w&Q 22! ! # %'D!^!6,'(%p&daM,#k"V ABAq-!qF@q0+Y, .#fC"=9n-*_#-G.!             amd )%       #U\;  $\35T c'T&,+Qa+)hCB8|+#Z3 ) h,Pd.$e/* *                )u]e8      1&<]CC<! )(  %B(&   0MQF # W^K (* " %# 1#) 6"  K=y     %}f 76^  &} s0'n  >-` 2&w h  8%  ! " % ! 0+6(,C# 2          "U{!V :6j '|  3'N*z  #r  %y#6#hlA4T;;S% % ' 3!#c%        "Q&d     )t:&*, 73C? +x, ,        $X          -.L!YQ#    LPJ.%;5i ' { %g%3 $0"H v BC  "NMKQL%#Z        T'#a   ^c93(w85o1,. &k ' #   *w)A  # %m    X   ++OE&$W          $ )$`   "r"m9$i,0 .4    +* H8}e#:%)h%|        " &H9K D@u l  `+#r"m   d(  k( (  ;*H S      46Q 11T%)%a!t          z G TC:* y r o   ) n )$cU          &m);!w z v[#(h    g  !3   x -*n                  A6~-{   t" ! * ,  b"FK^2& t 66]e            #UQI{    })  =3`)!.,z Rakko- ja itämerenhauruvaltaiset pohjat, Fucus spp._2 2 0 0 24099 34818 61676.038377249904 6605831.1432084311 543676.03837724985 7302211.1432084311 urn:ogc:def:crs:EPSG::3067 61686.038377249904 7302201.1432084311 19.999999999999996 -20 Field_1 Field_1 Field_1 nearest linear cubic 1 urn:ogc:def:crs:EPSG::3067 urn:ogc:def:crs:EPSG::4326 image/GeoTIFF image/NITF image/HDF image/JPEG2000 image/PNG gdalautotest-3.0.4/gdrivers/data/wcs/GeoServer2-1.0.0-non_scaled.tiff0000644003401500001440000000473213614004466024566 0ustar rouaultusersII*(S   & $V  $ 3@4@@߇[A#   )#ETRS89 / UTM zone 35N (N-E)|ETRS89|gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-1.1.1-scaled.tiff0000644003401500001440000006074213614004466023642 0ustar rouaultusersII*<x-S    * j z   &-L OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 1.1.1 Undefined Undefined Undefined sVU?sVU? Bh#@DIVIVIV.3+[&(&"'$ !##TIVIVIV*<)@+a)'"$ !    0AinIVIV3(,=+])'!#!! #"fm 5",3+M*~(#"!! ejAM-,+=+])&#!!  1%0A /3.G*y%"!!  r"@*4D%+C*Z')#!!  "i)/HW.+H*m( !   !'*/,5+L*y($! '7P0y|FS9%O*y(! /'<,?O>+j%  ('G*x /3*-+Q'"E&,<(   1+]" !#*H'  $0)>'  +4.(h %3;-")["  @L3(##/ ΰ >)O% B 2) 6?8()x !  N=.+$5 p_T 3+gi[_gE[)YPE?N"x, SZ:+$iPJ*9E*LGHu   4W)%~|W8%?PH9=+)f)#ioD ~.=.U ev]suOlz{x)C,;C7. IZ V; 4v01f5 /!f E^g>"|TC cx k1L]1>(` ,T,3M4 e491>?7J!`ҽLB2F "IV ݑ}Y0DW8WM/6B6r$X5]\ a5D ݘɛJ~&!)0[6*V33 6x |ڗ]>EDwi/ưcz Ťd:3!4[9hs3 x ~wy Xn?f .A>'F{y{, cr)+ s9<8 ԡ N1M63{D 37k]1ف3@,( F3 1:z3 Ei3xOf!~#1.@fK^  (oq/CA38v3 AunXl8ak ֻ/  5tZovi[:;^K9J btP//,KME>J );~6 %/9@J JC6!.Y~g3.0n"(ZR*ڳ#/n\+cVo}D}*.W-8b   ]r  8> {     MC14LV]-0E Gbq  jjl to%U7g33r ueXkjBOo  ~6Aqhz {Q&+5="+"+   {E^RQVD:OU35mbk &53 ~ ݜp k(cZ7@D^(c!8L{X}|05 z&$+lN9N6; N475 EP ZCP7=6=J @6{NFL{|35N]q3V^x*5#Ir+0 y(-#,2  _?BB44 *54.L5927N  |:C9A7A;g8P"7pQhCp (3  {   ~ur`>PKR++h GK8Y!!]67?N?x592:_ ^H;)R-A7 +:Ty8Z\5 a61    ~k +1 6<%*x"'S RE J>9C!!]X8Y33yJ/1H>4%AT u39 r/7(=3[4(W0B a"K{veZ5s%    +1}xmg$'KCg' 3 D16N--j-22}7B(&&b@##_-0WD7<  # ,j 66̏vl.G2BNF    >V1*4vQS{H(E: w9` %  9A  }xxl6:zUYJP F G F4BL z&)?V3AY ZSqegp c8@9AG6?v Y6~%7s>|D ?:}#j  3kw} %*_U$&Q((fLOR3>V#. C. H..j33p@**tDC24a r174fd O:{|7bSOaz$*,2{ ] q]Qh') R?IL""^2U=MNP D X6/ EV4 C%%bUd;!(`5:SF20;,K Ic57UL9Vgw057<39H{6<5:B/1Pv3547_XQ$$l?//kU..k33u<E=5N7 D,,iOMM22~ TG)M%IP!!l\#%y02Z- |jj5.3$ 39 xs28f" i58Q WH P##g*+xA;!!_S MB NQSG**f \811n^,,u'(y3U \ FZA_v8> $&WKV5H |!-h ', "!&5:4;!.3t/8 ;mN346; "%CA+0)-Y$%t-6G18L93%NK9L EA9[U7=7AY7&'xIO a'  $* ,1#+q)/6<7= %") wl5:9A9A~-? h*+xA476<NE?<H""^4**g8>&T3402--jIR?7= >%0QDHAS=&e lw  !' 7=}7=k6A9B#,)1188AA9 &'Sp   -p7L34`G2Y F33p r k35$$bS6..m  P9EB$%w "u "y0B) 284; 3; x;E:C/J":D +17=495:"+ fS+b@35 [eX')13"$)38I8W 4WAf#$r35|),Z< +128,38>079A7.0466;UW02B:C 7@ {35 r" \Y4:Y.3166;") ;E;E  -5 (17@(4fr^n' 'D~i;g  ):C*C:T$:C9p !`0;>/[!+$4;F $+%+6;8s  [27-5 -  06 *2:D;F` k  5<9B:DaА{-55y%E:g.\4L%Z"3`_.t$ Թ YO-z/ 2Lq3+ ".tR4Z | ;N &0 1<H776*%>3(t 4y.YO:w85X̂kJ4H>ufKSj;Sɍ3,9rOrbK,4WwG 6h9U.-N7 -S&(yIY>J?9%\(?LRo&p8.}7636".9M5;4;ri{xjLLO3-e$17 Rm\qRF26&ctdfxs==) {c!aZs" 85?#c383Y9(Bonw * #/665450t< TXQnk\MBD1V!!B?=] n:53333=cʏ34 7o3@:4j1/,+.3'XRgK2QM4!lPI6[LE0A4C<3M@qs3_\Z+skW3_]Z%3WhT"34E33=82IgT3Mr4Vd5y1%_J#YRTNf_xlk3(iNO$JWej8 یb3U55B87:=qX;:;D΋x$-BG3sXNv)A2Ce|4}45W%b;>GG;3tF,D:΍{',aT32,5WkdXkeO<6,Yhb;Rlx6DXS 330 <y tD Z?NDJOQ\^st?3X0/ Θ8)om3, .qSjCOw~cNs333)33@Λ*j/34o3W ,k->M7c6.: Sm33  p33w;8ޥ32 0( `*7,+3:, toֱ3 ')    9C' f3ob$/"$   ^c1.3 /~h'2u'' /f Q^D.'34!0&Os.- 3/|f" 1 D2*)3qvhac   ldRm z &7)+C o$3}\  z..3RR I3IKK!tq XF' &)4[Gd82(:!c\^~cw39_f-H1PUBCB6E_ W{+$4 YG^acj!q ph"fs~ 3xv 9BIk.[+p"L7`7^:B88=0Y4C13ju "NOAlI.dZGM in6XG!2 -v t>FP4(b&x$x$~/YE4}  v@ %qm !}xjWSQ3WbS)8VS"װ>X*NqI3@@`w(M'Pgܧ٫%␃i "Q$ .<"!_-?$xЃIP9RQeZcg]o9a4M#.T~  %% uWnAQ)0;R/U'K +.TZ8[@3aUe#܅>PK6 f% #32\J1v}wؔ+ r&bLQO8#A yp%m C8Kygp\    3eD1E>92d$؀4JOK|{i)y*OJ{&Z O afEW7\/^s ȏ3 !$$$& ,3 3G0(!ĕzi/7i2?E/e%߂;XZ)K~-Z$4,!+/25"3  /xI-%Oe=F96WJLiy|e]LC2v9H>F"2_ )&%h33D3b`OV֋`t_VXM_W=H3_* ;J2P! ,-,"04˜1;FDAbYfZgXc^>oMV@9t q  ' 656*%mqjoIrn?vXVz~g\dTaNcK^1fl|xI BL!! ""##(3@  y [ _@H9l&|$n.`E>ODaU*)(  "#%%%#!# )33W 1d`fn}bZ^UbYcX`Rk7^ejp!"$##'$$$!'$$! && .K`ginkn_WbYbYbYcVbAZ"^n& w,))%(&#""%%"%!!!,y[W T0[LbX_VbYbYbYbY^UaNX6V$_bnx{HR(f).*,(%$#"!%% &)& ^[V3XM^V[TWN[T`W[S\QO@J5M,TZ kbIV%8?+N-N-P-j)'&$#%%%%%%%%% dil,f=w_`T`\_]^Z]YZV[V^YbYL8h6k$t*EQIV5F,-.3+?+H*Z)|&$! %%%"!!!  4))6?LSaaev`_V`YyhU6+gdalautotest-3.0.4/gdrivers/data/wcs/MapServer-2.0.1.tiff0000644003401500001440000001063613614004466022406 0ustar rouaultusersII* S    : z0 EPSG:3031,3034,3413,3857,4258 image/png,image/x-aaigrid,image/jpeg,image/png; mode=8bit,image/tiff NEAREST,AVERAGE,BILINEAR OneGeology,infoCoverageAccessService,Europe,EMODnet,Bathymetry,MD_LANG@ENG,MD_DATE@2015-04-14 WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0/conf/get-kvp,WCS_protocol-binding_post-xml/1.0/conf/post-xml,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/multipart,GMLCOV/1.0/conf/special-format,GMLCOV_geotiff-coverages/1.0/conf/geotiff-coverage,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting,WCS_service-extension_interpolation/1.0/conf/interpolation The European Marine Observation and Data Network (EMODnet) is a long term marine data initiative from the European Commission Directorate-General for Maritime Affairs and Fisheries (DG MARE) underpinning its Marine Knowledge 2020 strategy. EMODnet is a consortium of organisations assembling European marine data, data products and metadata from diverse sources in a uniform way. The main purpose of EMODnet is to unlock fragmented and hidden marine data resources and to make these available to individuals and organisations (public and private), and to facilitate investment in sustainable coastal and offshore activities through improved access to quality-assured, standardised and harmonised marine data which are interoperable and free of restrictions on use. none none BGS EMODnet bathymetry British Geological Survey (BGS) http://www.emodnet.eu/ Nottinghamshire Keyworth United Kingdom Environmental Science Centre enquiries@bgs.ac.uk NG12 5GG Mon-Fri, 09:00-17:00 +44 (0)115 936 3200 +44 (0)115 936 3100 Mr Matthew Harrison Science Director Informatics pointOfContact 2015-04-14T14:29:00Z 2.0.1 0 255 band1 Undefined 0 255 band2 Undefined 0 255 band3 Undefined jq?jq?#@TpxADG@#  mtr@@TXAWGS 84|gdalautotest-3.0.4/gdrivers/data/wcs/SimpleGeoServer-2.0.1-scaled.tiff0000644003401500001440000002661013614004466025005 0ustar rouaultusersII*<-"- S 6" N"$~" ""O!0 EPSG:2000:2180,2188:2292,2294:2973,2975:3791,3793:3802,3812,3814:3816,3819,3821:3829,3832:3852,3854:3855,3857,3873:3893,3900:3903,3906:3912,3920,3942:3950,3968:3970,3973:3976,3978:3979,3985:3989,3991:3997,4000:4063,4071,4073:4075,4079:4083,4087:4088,4093:4100,4120:4176,4178:4185,4188:4289,4291:4304,4306:4319,4322,4324,4326:4415,4417:4434,4437:4440,4455:4458,4462:4463,4465:4475,4479:4559,4568:4589,4600:4647,4652:4824,4826,4839,4855:4880,4882:4904,4906:4999,5011:5018,5041:5042,5048,5069:5072,5105:5130,5132,5167:5188,5193,5195,5214,5221,5223:5225,5228:5229,5233:5235,5237,5243:5247,5250:5259,5262:5264,5266,5269:5275,5292:5311,5316:5318,5320:5325,5329:5332,5336:5337,5340:5349,5352:5365,5367:5373,5379:5383,5387:5389,5391:5393,5396,5451,5456:5464,5466:5467,5469,5472,5479:5482,5487:5490,5498:5500,5513:5516,5518:5520,5523:5524,5527,5530:5539,5544:5546,5550:5552,5554:5556,5558:5583,5588:5589,5591:5593,5596:5598,5600:5621,5623:5625,5627:5629,5631:5639,5641,5643:5644,5646,5649:5655,5659,5663:5685,5698:5821,5825,5828:5837,5839,5842,5844:5859,5861:5877,5879:5880,5884:5887,5890,5921:5942,5945:5976,6050:6125,6128:6135,6141,6144:6176,6178:6187,6190,6200:6202,6204,6207,6210:6211,6244:6275,6316:6325,6328:6360,6362:6372,6381:6387,6391,6393:6644,6646:6647,6649:6697,6700,6703:6709,6715,6720:6723,6732:6738,6781:6863,6867:6868,6870:6871,6875:6876,6879:6887,6892:6894,6915:6917,6922:6925,6927,6931:6933,6956:6959,6962,6978:6991,6996:6997,7400:7423,18001,20004:20032,20064:20092,20135:20138,20248:20258,20348:20358,20436:20440,20499,20538:20539,20790:20791,20822:20824,20934:20936,21035:21037,21095:21097,21100,21148:21150,21291:21292,21413:21423,21453:21463,21473:21483,21500,21780:21782,21817:21818,21891:21894,21896:21899,22032:22033,22091:22092,22171:22177,22181:22187,22191:22197,22234:22236,22275,22277,22279,22281,22283,22285,22287,22289,22291,22293,22300,22332,22391:22392,22521:22525,22700,22770,22780,22832,22991:22994,23028:23038,23090,23095,23239:23240,23433,23700,23830:23853,23866:23872,23877:23884,23886:23894,23946:23948,24047:24048,24100,24200,24305:24306,24311:24313,24342:24347,24370:24383,24500,24547:24548,24571,24600,24718:24720,24817:24821,24877:24882,24891:24893,25000,25231,25391:25395,25700,25828:25838,25884,25932,26191:26195,26237,26331:26332,26391:26393,26432,26591:26592,26632,26692,26701:26722,26729:26760,26766:26787,26791:26799,26801:26803,26811:26815,26819:26826,26830:26837,26841:26870,26891:26899,26901:26923,26929:26946,26948:26998,27037:27040,27120,27200,27205:27232,27258:27260,27291:27292,27391:27398,27429,27492:27493,27500,27561:27564,27571:27574,27581:27584,27591:27594,27700,28191:28193,28232,28348:28358,28402:28432,28462:28492,28600,28991:28992,29100:29101,29118:29122,29168:29172,29177:29185,29187:29195,29220:29221,29333,29371,29373,29375,29377,29379,29381,29383,29385,29635:29636,29700:29702,29738:29739,29849:29850,29871:29873,29900:29903,30161:30179,30200,30339:30340,30491:30494,30729:30732,30791:30792,30800,31028,31121,31154,31170:31171,31251:31259,31265:31268,31275:31279,31281:31297,31300,31370,31461:31469,31528:31529,31600,31700,31838:31839,31900:31901,31965:32003,32005:32031,32033:32058,32061:32062,32064:32067,32074:32077,32081:32086,32098:32100,32104,32107:32130,32133:32158,32161,32164:32167,32180:32199,32201:32260,32301:32360,32401:32460,32501:32560,32600:32667,32700:32761,32766,41001,42101:42106,42301:42311,45555:45556,53029,54004,54009,54012,54029,100001:100003,102113,404000,900913,61206405,61216405,61226405,61236405,61246405,61266405,61266413,61276405,61286405,61296405,61306405,61306413,61316405,61326405,61336405,61346405,61356405,61366405,61376405,61386405,61396405,61406405,61406413,61416405,61426405,61436405,61446405,61456405,61466405,61476405,61486405,61486413,61496405,61506405,61516405,61516413,61526405,61526413,61536405,61546405,61556405,61566405,61576405,61586405,61596405,61606405,61616405,61626405,61636405,61636413,61646405,61656405,61666405,61676405,61676413,61686405,61696405,61706405,61706413,61716405,61716413,61736405,61736413,61746405,61756405,61766405,61766413,61786405,61796405,61806405,61806413,61816405,61826405,61836405,61846405,61886405,61896405,61896413,61906405,61906413,61916405,61926405,61936405,61946405,61956405,61966405,61976405,61986405,61996405,62006405,62016405,62026405,62036405,62046405,62056405,62066405,62076405,62086405,62096405,62106405,62116405,62126405,62136405,62146405,62156405,62166405,62186405,62196405,62206405,62216405,62226405,62236405,62246405,62256405,62276405,62296405,62306405,62316405,62326405,62336405,62366405,62376405,62386405,62396405,62406405,62416405,62426405,62436405,62446405,62456405,62466405,62476405,62486405,62496405,62506405,62516405,62526405,62536405,62546405,62556405,62566405,62576405,62586405,62586413,62596405,62616405,62626405,62636405,62646405,62656405,62666405,62676405,62686405,62696405,62706405,62716405,62726405,62736405,62746405,62756405,62766405,62776405,62786405,62796405,62806405,62816405,62826405,62836405,62836413,62846405,62856405,62866405,62886405,62896405,62926405,62936405,62956405,62976405,62986405,62996405,63006405,63016405,63026405,63036405,63046405,63066405,63076405,63086405,63096405,63106405,63116405,63126405,63136405,63146405,63156405,63166405,63176405,63186405,63196405,63226405,63246405,63266405:63266420,66006405,66016405,66026405,66036405,66046405,66056405,66066405,66076405,66086405,66096405,66106405,66116405,66126405,66126413,66136405,66146405,66156405,66166405,66186405,66196405,66196413,66206405,66216405,66226405,66236405,66246405,66246413,66256405,66266405,66276405,66276413,66286405,66296405,66306405,66316405,66326405,66336405,66346405,66356405,66366405,66376405,66386405,66396405,66406405,66406413,66416405,66426405,66436405,66446405,66456405,66456413,66466405,66576405,66586405,66596405,66596413,66606405,66616405,66616413,66636405,66646405,66656405,66666405,66676405,68016405,68026405,68036405,68046405,68056405,68066405,68086405,68096405,68136405,68146405,68156405,68186405,68206405 application/gml+xml,application/gtopo30,application/x-gzip,image/jpeg,image/png,image/tiff,text/plain nearest-neighbor,linear,cubic WCS,WMS,GEOSERVER WCS/2.0/conf/core,WCS_protocol-binding_get-kvp/1.0.1,WCS_protocol-binding_post-xml/1.0,WCS_service-extension_crs/1.0/conf/crs-gridded-coverage,WCS_geotiff-coverages/1.0/conf/geotiff-coverage,GMLCOV/1.0/conf/gml-coverage,GMLCOV/1.0/conf/special-format,GMLCOV/1.0/conf/multipart,WCS_service-extension_scaling/1.0/conf/scaling,WCS_service-extension_crs/1.0/conf/crs,WCS_service-extension_interpolation/1.0/conf/interpolation,WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis,WCS_service-extension_interpolation/1.0/conf/nearest-neighbor,WCS_service-extension_interpolation/1.0/conf/linear,WCS_service-extension_interpolation/1.0/conf/cubic,WCS_service-extension_range-subsetting/1.0/conf/record-subsetting This server implements the WCS specification 1.0 and 1.1.1, it's reference implementation of WCS 1.1.1. All layers published by this service are available on WMS also. NONE NONE Web Coverage Service Finnish Environment Institute, Marine Research Centre http://geoserver.org Helsinki Finland ari.jolma@gmail.com Ari Jolma Senior Research Scientist 262 2.0.1 GRAY_INDEX 1.0 25.0 GRAY_INDEX Đ@q@AYA#   )#ETRS89 / TM35FIN(E,N)|ETRS89|gdalautotest-3.0.4/gdrivers/data/mrf/0000755003401500001440000000000013614004466017156 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/none/0000755003401500001440000000000013614004466020115 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/none/byte.mrf0000644003401500001440000000166413614004466021575 0ustar rouaultusers NONE 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"]] gdalautotest-3.0.4/gdrivers/data/mrf/none/byte.til0000644003401500001440000100000013614004466021561 0ustar rouaultusersk{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.0.4/gdrivers/data/mrf/none/byte.idx0000644003401500001440000000002013614004466021556 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/deflate/0000755003401500001440000000000013614004466020562 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/deflate/byte.mrf0000644003401500001440000000166713614004466022245 0ustar rouaultusers DEFLATE 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"]] gdalautotest-3.0.4/gdrivers/data/mrf/deflate/byte.idx0000644003401500001440000000002013614004466022223 0ustar rouaultusersYgdalautotest-3.0.4/gdrivers/data/mrf/deflate/byte.pzp0000644003401500001440000000113113614004466022254 0ustar rouaultusersx!! ОGD"c#ȱ#G_ =CX=rdeqcTx-AEόUcE+#ĨGQ9G޻1b{!*zߵƪU?ȯw͙m!*XVZOS{Vc6[Y{_dU~̷=#Ƹ˞EjuWoSTα>&l*%}^5]-^ Ϻ%p'z|F^m\wS[_sw>s6Q9wy?|u'Ƚ/gdalautotest-3.0.4/gdrivers/data/mrf/lerc/0000755003401500001440000000000013614004466020103 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/lerc/byte.lrc0000644003401500001440000000332713614004466021555 0ustar rouaultusersLerc2 ?o@ZGQ"T*J*2eF Ed*2dY&*Ret* ʄ2!]&%S U2Jh҅NU]Fʨ"!PB&MBJBet!UYHQe"!D&QeBT*& dDP&!KDT!U(RTt*T$BPH 2H$2J#P$&tHD"QK.#EdH&(ɄꖺPH$$dL$ h skcZ{εT)fCCFG6fTj#+Cdf5SUT&se&HTA"*2: "*2: "*2: "*2:hkcZJ{sνs1DPSg0eG!3J"dITk:M)rJ h{skc*@QL"*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2: "*2:gdalautotest-3.0.4/gdrivers/data/mrf/lerc/byte.idx0000644003401500001440000000002013614004466021544 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/lerc/byte.mrf0000644003401500001440000000166413614004466021563 0ustar rouaultusers LERC 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"]] gdalautotest-3.0.4/gdrivers/data/mrf/jpeg/0000755003401500001440000000000013614004466020103 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/jpeg/byte.pjg0000644003401500001440000000706013614004466021553 0ustar rouaultusersJFIFC  !"$"$  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz? =(.aa1<`5?,Nd_2P#K^|_☇7RcR{Dq㏛5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE~u"pvaJdgǮW9;FE$p[ v|lG2\ ߾C׎QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWkߴEcY< Et˖@'Mb r| ;`p1\oď5,E o`}(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((gdalautotest-3.0.4/gdrivers/data/mrf/jpeg/byte.idx0000644003401500001440000000002013614004466021544 0ustar rouaultusers0gdalautotest-3.0.4/gdrivers/data/mrf/jpeg/byte.mrf0000644003401500001440000000166413614004466021563 0ustar rouaultusers JPEG 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"]] gdalautotest-3.0.4/gdrivers/data/mrf/tif/0000755003401500001440000000000013614004466017740 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/tif/byte.ptf0000644003401500001440000000142513614004466021420 0ustar rouaultusersII* =BCDEkSx!0 ОGXjhh(*hh0pᇥ:3tjF%y{ȜX?xQ)_=fhuqwL\gTGe1wuVFTQ_:wu+ޑwusy}|׹̶g?yƸ;&bWޟ5hn "[owul蟵AiʯWyV#|ψ1^eOwuD_gf?1qi5eT/FWf{:%=ƫ_]֗-91q p~{Xq|rgdalautotest-3.0.4/gdrivers/data/mrf/tif/byte.mrf0000644003401500001440000000166313614004466021417 0ustar rouaultusers 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"]] gdalautotest-3.0.4/gdrivers/data/mrf/tif/byte.idx0000644003401500001440000000002013614004466021401 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/lerc_v1/0000755003401500001440000000000013614004466020511 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/lerc_v1/byte.mrf0000644003401500001440000000172013614004466022162 0ustar rouaultusers LERC 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"]] V1:YES gdalautotest-3.0.4/gdrivers/data/mrf/lerc_v1/byte.idx0000644003401500001440000000002013614004466022152 0ustar rouaultusersygdalautotest-3.0.4/gdrivers/data/mrf/lerc_v1/byte.lrc0000644003401500001440000000117113614004466022156 0ustar rouaultusersCntZImage ??ÄCJH):1!:B:::!::!::!JR)11!:))[)J11!B:1:R:::B:)!B)11:)B)::!!)!)11:J1::)1)1)!J)!:)B)B:R:))::1J1)!:1[1R:!Jccs1J)J:):!)1R!::BJc{::B:B)11::)1c:)J1J1B1J):)!1)!!k):)1:):1:11:1)!)):BBB!1)!)!:1:1)::1!1:::!1:1)J!1cB!111!111)11Bc!)!!!!)1:1Jc1!1!cs!!))Bc!B!::J)1B:1J)BJ1:B!B!)!))1J11):J)1RJ[)!!!)B:)!)1)BBcs:)[):!::!cBkR):1)1:RB1BB[c1B!:[[:J1:BJ1!1!JRkkkRRR:)J:!!!!!)!gdalautotest-3.0.4/gdrivers/data/mrf/png/0000755003401500001440000000000013614004466017742 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/png/byte.idx0000644003401500001440000000002013614004466021403 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/mrf/png/byte.ppg0000644003401500001440000000130413614004466021413 0ustar rouaultusersPNG  IHDR&IDATx!r$7?[jf#ذaa0Zhv60I0gX9WoI?[#͈Zj9 V-m5VZye?YquFF,tgE 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"]] gdalautotest-3.0.4/gdrivers/data/aea.hdr0000644003401500001440000000075413614004466017625 0ustar rouaultusersENVI description = { Registration Result. Method: 1st degree Polynomial w/ nearest neighbor} samples = 434 lines = 3 bands = 1 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq sensor type = Landsat TM byte order = 1 map info = {Albers Equal Area Example, 1, 1, -936408.178, 2423902.344, 28.500000, 28.500000} projection info = {9, 6378206.4, 6356583.8, 23.000000, -96.000000, 0., 0., 29.500000, 45.500000, Albers Equal Area Example} band names = { TM Band 1} gdalautotest-3.0.4/gdrivers/data/rgba_rraster.gri0000644003401500001440000000002013614004466021542 0ustar rouaultusersk{skkkgdalautotest-3.0.4/gdrivers/data/overviews.rsw.gz0000644003401500001440000001370113614004466021601 0ustar rouaultusers-Zchess-gray-1024.rswuU 耭`wb݊݅-vcwwccwvwacqp:=9>G^ImmҺi-ʒԌtUԵLu0#| 6Z3̀[ԤYfi޼yZh-[UViݺuڴimۦ]vgqҾ}t!;no֦cǎԩSL0p 3De'$LI'4M6Y&|t9]tSL)2SM5UzL34vi3te 3̐g134Sfy2,uY3legs̑93]v\s͕;3Ow7| dB -^8,H]t,bY|ӭ[e%ȒK.Z*K/tYf,YngVȊ+VZ)+rVYeYmҽ{ѣGz5X#kfZk+{kuY'뮻n[o` f6oM6$ni6llb-[f[o>}dmɶn.o}vai;g]vɮv-{ck{g}ɾ/8 x`:|9Cr衇#8"Gyd:}9crN8!'xbN:餜|9Sү_z9R__O?=gqF<̜uY9s9sy睗??\pA.\tEs%K/e]/7pCntMs-[oMsmowܑ;3wuWs=0`@w}C=~8|/W_eРA7ow}>?C~ <8?S~/_oeȐ!z'@Zkݬ6-*kڪm*kڮSYWu:^FW̰?&bӯ/T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_TߣgYR߬&m;ft4^/cĩkS\׸l\S[7ZqGxz7x^mWwHڿu9އz?jz^z^z^z^}z^z^z^zz^z^z^z^t_z^z^z^z^o/z^z^z^z^7ݗ}z^z^z^z^˾?^z^z^z^Meߟ^z^z^z^={%͒NI3:Ӧ᪫\5nkخOƴOKtK555þxdQ{jF1A ھg&C[7n9g0VXȿ,p_}Yᾘ}1eهb˲ܗe/>s?Tf5THȳc1y.U߸{j\j]K }Uo.5}c?ogdalautotest-3.0.4/gdrivers/data/DIM_md_ple.XML0000644003401500001440000000601513614004466020707 0ustar rouaultusers DIMAP PHR_SENSOR PRODUCT en Bounding_Polygon 144.840636904079 -37.76255126780603 1 1 145.0707684049999 -37.76262507869971 10375 1 145.0709608547251 -37.87458462982676 10375 6132 144.8404320970826 -37.87444098444605 1 6132
144.9556995652217 -37.81855049019464 5188 3066
EPSG GEOGRAPHIC2D WGS84 urn:ogc:def:crs:EPSG::4326 0.7054510257833884 0.7145258524056943 0.7059011471512184 0.7146027093640137 0.7058404840473139 0.7146858168174818 PHR 1A PHR 1A 2015-01-01 00:00:00.0Z PX
gdalautotest-3.0.4/gdrivers/data/byte-lzw.rsw0000644003401500001440000004765613614004466020726 0ustar rouaultusersRSWDA@@j@j@?DH@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~u;??oQf}t~*'\B dr_fyxrLsZ~"eՌǒPH 4M҃@x@Dk0sx BBTC hp_L9%һj"ioFEx@ xҍP Ҏ@@ Վ4HDžpZ@6k/KԴnPx.He=K ҍ szLH $vҌ %p#xeX==FK,=7$aX4NuHMһV=ai"q(% Њ uDj @ 7S^@z۶قeDihԱYg$a?CX/p 8{kOy^ z&rOlu!9JaU&i-XrG&? T=Hv182Ǭ&4^ $>iY2y+ǬP~6 빜H&xaSD~ X {@}wp0# eUwQ?I'׎Jo/*"r:rH(d8WfKQ_K[B~ʈp1 z( 1 &_xN6&UH;eYhԐً(Hș)d@<NL Qy ME*VRԽKX.hJ<0i0H3%Y7MпXL!FG7*nbexpknxaםBA%>rHe =N< 47)ղ*"۶>F W ny %u KK3y BCI[ Ξ x4en̦^ ⼏̡wňyX4.B*c /` s :ʽ Y6qpǮÜ`hpdJ Xfh BH͛?$R| (_ 0Jr8!Q(iX6̨p_ɘI18{g pWs#p,ݒ!$~ƞ)N\sT=V2ҿA^Y%&\u9_|'Y) ~LNljMr a Њ)蓱jxs\xdڎ;ᛷy gU@@]`Rјcpˏ p&RQQn_4: f\K105ܯﺃ;yދZ2 J~1-TRNM)`𠐶`*Paor!΢ 2! KdgH C<` \=[Cx4̕BD_YyY&\!$}9ZoNN _q&6r@EF$W_ṩ;FIo@]s uݞ q %G3$xQ)Z+2XrHա6 dzsH* o ΍em(jE<+E嗬!JN80 T_կaOB/ xEfD-l8Xqy=6>EŒX30NH<$GODD;m>͑2_pyY'W%P s)H!c(s#HPy'ӫK3T4wX ۏLȟ0"7؅{IqΈ%O v @Pi㢩΅ ΍$+ࢊX/`yNEn!+p;k'BȲ=եȠ$.q9qUYp3`a;sL˘k(V6 P~9U`^|rI:\5Ԍ6Zw>>Ж:ċƄC?+eK{A-؀+Ϻ@( #\%;ԝ<[t9 18{=?rL`80ˈj97A4 aM !'8 cծ|+bdԼ69H URut~3 X/ B)%WԱeT,A߻mBI%_,pо` *: 3XǴߺsA; a %PSp( 2 y-b}@P W#kψߺACRJGn Ģ,?AC_Qug 7+.Yˉ<ưUu~앍W$"<@7,!@<ϻYhNw&Jf_hP{@Zݲ)}Ƥ~c8[&W@:&R J?g=v *~#rE&YԽ- c<`MUo>U&ZNʉdR>AYn11PiJz`xYIH[ ?t-%~gP{2e+[8af]NvQ̨q6-MDXgA_|LĬ(u#"kw{̪ o}HӠ}*FDd7,)nuHȥ4jML؁ :\'rOA?:ԉ (΃GҗH_Q1‰:K/BBdM>%RpspT曮q F] %! Š"y-D5Z[6"8+тxq f[8N&Y^ 6 K{42Kq !~67+ ]< }BZъ[$'A;!2 %~՛q\2 zҢLZP|Bs%+AdGPOɾ<k4+ ! .;W/@$a;ؐ`(p"xz iZԲ&H %O*K:aYAEN%:TK+l 'I LBfԡ"MSrG4Y[/Pu68D[P~jpH0`HE8Y}Yعf6p :"{+/?z3*9L $SBBp'8{rλ0VB5Hq&^P{9/Z(4Y}.Z{i^STՐ2#,q+H@Ig7|=uUS]A, _2'ahpn|W):( o2/t:.ao7=64hak_% d-WYu~ i{ߺwh a@Zz>ix:|UZ~ i%&q .)Ϻ+JA @'G ^Ğ[Ӎ'׊yQ-%hjAT " %>1Uҗ۬UN-Txk<^vSERuW%H@hH OU$?,WIR?Ի m Ϻ%@S(FlroAND'c-FltT*`BdOVnx'U2;:`n-΂ &HIИs);T*oGRDHW"ᬭ ,0i Ƽb/xZn |}\\_I@ؐ6spۿpi|?BHgAX,xFI@ҮtQ- k^EQ)ȥ ؁Mj66ْ8$pNxk`_y¾>uAx_TȎ%Q o @ ̦Z׌$Ni ^@+?mʼn%:0 t@H@|l>o̵i@Us_ MN:=K=ӣE<"d:Ty%X!£7, +m8Z7q `y @J\~\s:@$ w kEk|k,_ ᾞඈvN47:!H@4e$p fSn =ZHN1)`ҋ'$Yes۽:!H*ҕu#A`Ox0Ttnn|? 3-p1:7N$01kFZSS ~w`@Hv ykpTz#EG3pP8\pK1H 1h\_^xXyYr+r$U1O72h?8q؁XpdTpp`_4)o_#vR@ְ\0T$ CH?0~x{.;f_,`PJ ^CN%@ @?0,=,~piOL] `8p+ȅ3ӊ]Yݑ) <@, k@~MvȚ +@i@LE=IV50 m?La PٽƼ@؁@nnx n3‹ E?z_yV_ƻ:@7O*we kªq4 apmKBM]҇ $W\`$i\0iRSΕ$E5 A=wyE[8mӕ`ij=38︲|xTp͔^gTSS(3i e39My?,ّ:4  @cE_OU y荾Ƈ #T̩HAGD -_ hXp@ʉ?(ڌMS=/]i<0~1șը jF~Yt.Tt+B @ y8E#OC8 dxf8T;B@N e 8p kd#!JAෆ{_{1|YrxvpANEƺ #ȁ!yދ)}%C!JA"XJP`Z_,+nLgѲKm)%K sz, :O%B @ _ x\v 2=NE5LyFpN&O7< n ̡LĦaG䮀 qﰊndžd{7 A@Xv`APeF2"eK7 o `yǀNQ%Օ9&jB@~ ms DΦ=;r l8tز H{sDq0 b4Gy95KBM?ы %ẁ`eh%KB( H'w ĸXT800P Ge0V@ފP~`yH Y09O~$5gC~Y^:~7$fyi8dc'TA:x ˎu!? `vx̮ xkK `x195C ܾCrPrʲ)y!0aZ"p`_v7 `NҴmZ2 95KBQ p{I2_"Z0HH/@~ Ӈ(A9&cop.劺 .E bxhph{|x `HoQ)p h N@TfdzJ-1"Q-UPpҊXdvFmcYTr}; e~THTFԂz/_>aon1ҭ*A_1ߍX LSDs؂:4Zv/ߺ%H@I%Fxՙ{6onVrPp*Ӊ1RY#%?0~[HP aefrx@ҦrK-*V=P7+¨)4@6 RY{Be`qYGSr. m*GzFSg(fdԽE0; c Mጏ4 !BpsD_/ [/kFr97.hAۅ'L* YxsG&B /~fp D&Qʤnfr^sZbQgL?ua(rp1z- ZD$"?i."ܺgXǠLɽ@ ޏTo҇o(*aө6h9)·/J-R'; bާhDԼMUenoAe^8O y!|9ȁ؊04h AeҊ$<2PrCĝ62|@vYV#!; !{ FM?$I{@ $?6G0e ' > ߺ@˜𨀓 립x}LU cFFN ?i)cO+@ @ono`@ xKªo7%+o mm(1~UӪ\XpPҔ+@w1g.V+flJBxE 5A\PvZ)wwꓹ,3Ըiڇ*?$k؁ gK"mXn7$PD>V'K9,^*d@sUaݏGhcߺH8 EsLT;80NY h8M*H؟U _yrfr(+ -ID(a\i"xH N3 @ߎ !eԱ 5hՌxiى?tr՘9+ppeY7 x y ASpr ̘wω01'DdҹVɏ ȟ `s0yRSWM0Kj@j@0@OXK@LhHK0@0@oQMPxfz^_h ͵݈Щ~Թ% $I%ȥxH * >**}ׇhar Яy@iRSW@Nj@j@P@OhN@OXNP@P@ngdalautotest-3.0.4/gdrivers/data/rgb_warp.vrt0000644003401500001440000000350713614004466020737 0ustar rouaultusers NULL 0.0, 1.0, 0.0, 50, 0, -1 Red Green Blue 512 128 6.71089e+07 NearestNeighbour Byte rgb_gcp.vrt 1 0 0.0,1,0,50,0,-1 0.0,1,0,50,0,-1 gdalautotest-3.0.4/gdrivers/data/rgbsmall_truncated.kap0000644003401500001440000001150213614004466022742 0ustar rouaultusers!Copyright unknown VER/2.0 BSB/NA=UNKNOWN,NU=999502,RA=50,50,DU=254 KNP/SC=25000,GD=WGS84,PR=Mercator PP=31.500000,PI=0.033333,SP=,SK=0.000000,TA=90.000000 UN=Metres,SD=HHWLT,DX=2.500000,DY=2.500000 RGB/1,112,120,56 RGB/2,56,72,32 RGB/3,44,64,8 RGB/4,0,16,0 RGB/5,104,168,40 RGB/6,88,112,16 RGB/7,124,176,48 RGB/8,104,136,56 RGB/9,80,136,16 RGB/10,40,80,0 RGB/11,132,152,72 RGB/12,80,84,32 RGB/13,80,100,40 RGB/14,88,136,56 RGB/15,72,120,8 RGB/16,116,128,76 RGB/17,128,168,56 RGB/18,120,144,56 RGB/19,72,96,32 RGB/20,136,160,64 RGB/21,88,104,48 RGB/22,16,24,0 RGB/23,120,144,40 RGB/24,192,208,144 RGB/25,104,120,32 RGB/26,80,120,16 RGB/27,80,120,32 RGB/28,104,136,24 RGB/29,72,128,16 RGB/30,24,60,44 RGB/31,104,152,48 RGB/32,8,32,40 RGB/33,0,0,0 RGB/34,104,120,48 RGB/35,88,112,40 RGB/36,116,152,64 RGB/37,44,72,52 RGB/38,88,88,40 RGB/39,148,156,72 RGB/40,60,104,52 RGB/41,104,160,32 RGB/42,64,112,0 RGB/43,96,128,48 RGB/44,56,104,0 RGB/45,32,40,4 RGB/46,56,88,0 RGB/47,152,176,84 RGB/48,128,140,76 RGB/49,128,144,48 RGB/50,56,88,16 RGB/51,80,96,24 RGB/52,80,112,24 RGB/53,152,160,112 RGB/54,32,68,0 RGB/55,112,136,40 RGB/56,120,160,40 RGB/57,148,164,64 RGB/58,72,96,8 RGB/59,64,96,16 RGB/60,128,160,80 RGB/61,64,104,24 RGB/62,16,48,48 RGB/63,88,128,40 RGB/64,96,136,40 RGB/65,16,16,8 RGB/66,68,76,32 RGB/67,100,144,68 RGB/68,124,136,64 RGB/69,112,152,56 RGB/70,56,96,8 RGB/71,88,136,32 RGB/72,168,200,116 RGB/73,24,60,24 RGB/74,56,100,16 RGB/75,48,72,0 RGB/76,108,172,32 RGB/77,112,176,44 RGB/78,80,92,48 RGB/79,104,144,40 RGB/80,60,76,16 RGB/81,64,80,48 RGB/82,112,136,64 RGB/83,96,124,56 RGB/84,120,164,64 RGB/85,72,112,16 RGB/86,8,8,0 RGB/87,44,48,12 RGB/88,112,160,48 RGB/89,88,152,24 RGB/90,96,152,32 RGB/91,124,188,44 RGB/92,48,96,0 RGB/93,120,152,76 RGB/94,56,80,8 RGB/95,184,204,132 RGB/96,96,112,32 RGB/97,68,84,24 RGB/98,120,152,48 RGB/99,28,64,32 RGB/100,120,160,56 RGB/101,112,152,40 RGB/102,100,124,68 RGB/103,96,160,40 RGB/104,96,144,24 RGB/105,96,120,24 RGB/106,104,128,40 RGB/107,84,104,12 RGB/108,80,128,24 RGB/109,96,108,64 RGB/110,68,80,8 RGB/111,144,196,84 RGB/112,128,160,48 RGB/113,128,176,64 RGB/114,128,132,56 RGB/115,116,140,72 RGB/116,64,104,8 RGB/117,112,144,48 RGB/118,16,40,40 RGB/119,96,128,32 RGB/120,84,124,56 RGB/121,28,48,48 RGB/122,96,120,40 RGB/123,112,164,56 RGB/124,132,176,80 RGB/125,148,156,84 RGB/126,96,160,28 RGB/127,16,48,32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! D##+=44GG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-D##?i??44@G!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#r##4??i4?#@@!!!!!!!!!!!!!!!!!!!!!!!!!!!BRD"``?@ii.!!!!!!!!!!!!!!!!!!!!!!!!!! }"j7w7????i?4??!!!!!!!!!!!!!!!!!!!!!!!!!!BS7uwi7U:??iU?l=4!!!!!!!!!!!!!!!!!!!!!!!!!0u77?E@?w?4?4!!!!!!!!!!!!!!!!!!!!!!!!!77wi4?4U???4 !!!!!!!!!!!!!!!!!!!!!!!!!Qju???@?:U?w?l?Ui?U !!!!!!!!!!!!!!!!!!!!!!!!!#7U444?7U@it?7U?? !!!!!!!!!!!!!!!!!!!!!!!!#u?@l?G@7??4#@??44 !!!!!V!!!!!!!!!!!!!!!!!!-f#@??:li444444 !!!!!!!!!!!!!!!!!!!! +4Ui4ii??i?#w?##4!!!!!!!!!!!!!- =?U44??4# $@44F?4!!!!!!!!!!!!!N"###="?t#=:4wi?jzD}_}$:4#?4?!!!!!!!!!!!!B:+#?4?Uw44?4i4# N]R#4U?4!!!!!!!!!!!!#U4444?+7w?:#a ^#?www;;;!!!!!!!!!!!P"#4:=:4::U?@?##D0 ??UUU==!!!!!!!!!!?@@ iU.=447:Uw }" ?????4U4U;+=!!!!!!!!!!0#l?lGw?:7zj"D_ =?l4?# =!!!!!!!!!!??4j7j7U?# 5  ??44U4U=?,4#"!!!!!!!!!!!U7'jki??$"05  @44?F?=2!!!!!!!!!!!!#?li79 ju#"& 5R4t4??t??==!!!!!!!!!!!+747e7jUF20#w 4il@U==!!!!!!!!!!!"?p)w77 Uz4:= ?lGG@ ;?GlF4U.2!!!!!!!!!!}p98ui/}Hr=?4##4@GUl@Z$lG|##$#!!!!!!!!!!!"'''/:a}}7"4?@@G@=Z?.2?|Z@4=$$!!!!!!!!!!!-}'?jU.zk:=?@G@Gt4ttGGE ,)Z. $?!!!!!!!!!!Dn#:7?.k"?=?U?G4=ZG*UG?@#?$H!!!!!!!!!!!7kj/@?l?lli4?*lZGGl4?F=Z!!!!!!!!!!V5/'r7@@44G GlGGGGZ,4J;+ !!!!!!!!!!//91j7@4??{{)ZYZ)Zl?.;#!!!!!!!!!!!D18eiG@?<#+$; {)q8?\"!!!!!!!!!Pee))eGG4_5&!!!!!!!!Vr1??==q{ZZGZ*l8'!!!!!!!W"`e7e4U=;# #/]?EEZZZl?wddTCQ>>(!!!!!!!- 7e@wi=4$#K#Ul**Gww#fc>>)!!!!!!!'p8@E??.^?<TG,Z)8$Scc>>y*!!!!!! /el?U?@. t?EogltZ)[euQ>>>>+!!!!!N4u?@? +"q];|@GZZlU=Hg))Z(>>>,!!!!!!z44?=U:;"]. @="#2 ?Z*{. ZGM2I>>>>>-!!!!! \@ GZZ,,GlU,.\Z *Zh)*j =4li8{x>>>>.!!!!!Vql@ UeqqGM)ddu87C(c>>>>>/!!!!!!$ZZZ|ZqZhZ)LL88e(cyy>>>>0!!!!!!!Gl?|o{l|ML[[[epe$%>>>yy%y1!!!!!!!=$$TH@=TDt4ZMoqqeI>>>>> >gdalautotest-3.0.4/gdrivers/data/byte_nogeoref.jp20000644003401500001440000000026713614004466021643 0ustar rouaultusers jP ftypjp2 jp2 -jp2hihdrcolrjjp2cOQ)R \B@ 4zR.$gdalautotest-3.0.4/gdrivers/data/rotated_pole.nc0000644003401500001440000007546413614004466021415 0ustar rouaultusersCDF 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.0.4/gdrivers/data/byte_with_xmp.tif0000644003401500001440000000264213614004466021764 0ustar rouaultusersII*S n   Title Description XMP Test N@N@@A̞LA# Wh )#NAD27 / UTM zone 11N|NAD27|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{skkkkksckgdalautotest-3.0.4/gdrivers/data/int16_rat.clr0000644003401500001440000000152213614004466020703 0ustar rouaultusers -500 127 40 65 -400 154 168 118 -300 172 218 120 -200 82 77 117 -100 245 192 117 100 222 0 86 200 191 173 69 300 14 110 243 400 102 86 25 500 97 139 179 600 211 152 39 700 141 88 211 800 225 127 60 900 128 244 208 1000 162 132 156 1100 193 78 134 1200 202 170 254 1300 6 252 240 1400 157 235 249 1500 183 201 168 1600 91 144 146 1700 153 252 228 1800 243 122 213 1900 14 105 160 2000 145 97 47 gdalautotest-3.0.4/gdrivers/data/test6759.nc0000644003401500001440000000111013614004466020217 0ustar rouaultusersCDF 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.0.4/gdrivers/data/L72230079_07920021111_B62.FST0000644003401500001440000001640413614004466021626 0ustar rouaultusersPPFFEETT]]]iiwwzzyyzz}}}}{{ooccee__bbhhqqqggccbbbbbbWW__ZZPPPVVhhxx}}yyy~~yymmbb^^aagg``cccoottqqxx}}~~||||yyy{{~~xxwwwwzz||yyyvviikkrrdd[[ZZaaZZZbbbbffrrrrqquu||{{{||~~zzpppddnnuu{{xxxx~~vvmmllhhoo~~xxccYYJJ>>>99==@@22**%% ((+++++%%##''**''"""""""''0000''))((//..111;;44>>KKUUZZUUOOOOOJJCCDDAA99AANN]]llrrr}}uuttzz~~qq]]]HH5511//++22@@ffpppllqqzz~~iiWWBB,,,%% && ))6699555++++77KKYYcc``cc```__ee``\\WW^^aa__dddbbbbVVPPLLCCHHTTXXOOOLLII@@>>885599??LLLVV\\YYRRTTVVVVVVYYY]]ZZ__YYDD;;8888===DDGGIIMMMMKKGGMMccfffnnyy}}~~{{wwwvv||~~rrhh```VVQQQQXXcciibbccbbbiiuuyyttttssdd__hhppp{{{{zz~~~rrmmttxxttuudd]]ZZ^^ccchhhh``ccbbggmm~~vvqqssyyvvwwhhggrrvv{{~~ggKK88*** !!&&**,,##!!!!!!! &&&''!!##$$!! ## """!!))@@RRgg||wwhhLLL<<00!!##**++(('''**((--3366::77;;55544++&&!!((++**++%%(($$ !!!!!   ))++**---,,%%&&!!!!!!$$$$!!!!!''%%''&&''++++(()))--//,,,,338899CCAAA::AACCOOddtt~~rraaaRRNNHHBB77--))""""!! ((((&&&""##$$&&((((//**!!!$$(("" $$##))''""!!((,,**!!## ""$$!!$$  ##''''((**0002211//++..333300)))**""%%**--66EEJJ@@666))""&&"""'',,000::55....,,##!!%%**))//11--"""##&&##''--((''**,,,((''((((**..--0088800$$((((&&**..%%$$$//5555885522,,****999KKbbww~~oooaaYYZZZZVVZZbbbbjjjkkuuuullUULLJJQQ___{{zzzzyyuujj``]][[ZZZZZWWGG;;7755==IIZZ]]]ffooxx}}ttVV>>>--++%%##!!##"" &&&##))((&&%% ++&&&!!!!""&&  )),,,,,,,##!!((//5599>>HHYYmm}}}dd^^bblllmmffffnn__WWMMKKKKKDD==77,,22DDTTvvǮп»÷óooqqkkdd\\\JJBB>>??WWll~~xxYY??44222554433==CCGGMMSScccuu||rreebbffjjcccPPCC>>DDQQQQGGBBAA@@@@@779999<>FFCC>>99999==<<<>99::>>HH]]lll``JJGGGFFCC@@BB??@@BBEE>>>7755::BBAADD<<,,))'''))**22..337777;;777==JJPPMMFF>><>@@NNLL55110066GGGSSkkeeeRRHH@@CCEEEEEESSVVVddssòzzssffTTIIHHBBGGGOOJJ@@<<44--&&%%'''**,,8855--(($$"" &&.....%%!!&&%%##""!! $$'',,//227777332222233..))&&%%))00///3311,,//447711##,,@@@IIXXmmooollhhdd]]WWZZQQII666%%%%####%%  !!""!!""''''''**1133@@GGXXXnnzzxxxxvvccOOGGMMUU[[YYYPPRRKKRRXX[[UUZZYYYPPGGJJWW\\kk~~ÙܹuummwwooUU99+++**1166==AADDJJTTVVVYY\\WWJJCCFFHHHHMMMIIGGTTYYSSLLHHDD===::<<55;;EEMMHH>><<<<<@@BBIIUU``^^ffss~~xxqqqqssaaa\\[[@@$$  $$''..****''+++22661155<>AAEEJJPPQQCCC//----)),,7777<<:::<<@@JJUU^^WWggvvzzqqpppuu^^OOHHGGKKKZZkkxxPP::++&&&##..555**!! ''**)))%%''44IIccaa888))!!'',,//::UUݠZZ66++))&&%%## !!++66::BBTTTTXXXuu˺ŷwwoonnooxxvvlll``__QQHHIITTZZ__]]]zzddLLHHDDCCC8888>>GGCC44++,,&&&(($$--//11//--1199@@@;;44<<>>??==BB>>===//''$$''!!))## ##''**++,,,''$$((!!"""""''%%###%% !!&&&%%&&******(($$(((++,,&&!!""&&11;;999FFRRTTWWZZ\\TTPPJJNNNWW]]QQAA7711--55999..%% !!$$""!!!!!!&&!!##)))((!! !!,,,,))&&&&&((,,77IIbbnnggQQQ55''%%''&&%%%&&"",,,)) ""%%**6655666::<>CCEEEBB<>333,,%% $$++--228884422))1144BBOOQQIII>>33))))&&&&44::DDD>>11....$$ $$""##""""####!!!!,,77;;::55//---))&&%%""!!!!!!!!""$$""###%%!!''%%$$%%"""++,,$$!!!!""&&(('''''$$%%$$((,,//))))(('''##'',,,,3311++33///,,--//++))5544+++++..33222233774422+++++**,,..0011::<<::>>><<778800..--((%%!!! &&**))..66::DD;;;11))%%##33<> endobj 8 0 obj << /Bounds [ 0 1 0 0 1 0 1 1 ] /GCS 9 0 R /GPTS [ 49 2 48 2 48 3 49 3 ] /LPTS [ 0 1 0 0 1 0 1 1 ] /Subtype /GEO /Type /Measure >> endobj 9 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 3 0 obj << /Annots 6 0 R /Contents 4 0 R /MediaBox [ 0 0 20 20 ] /Parent 1 0 R /Resources 5 0 R /Type /Page /UserUnit 1 /VP [ 7 0 R ] >> endobj 10 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 11 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 11 0 obj 228 endobj 4 0 obj << /Length 12 0 R >> stream q 20 0 0 20 0 0 cm /Image10 Do Q endstream endobj 12 0 obj 33 endobj 5 0 obj << /XObject << /Image10 10 0 R >> >> endobj 6 0 obj [ ] endobj 1 0 obj << /Count 1 /Kids [ 3 0 R ] /Type /Pages >> endobj 2 0 obj << /Pages 1 0 R /Type /Catalog >> endobj xref 0 13 0000000000 65535 f 0000001191 00000 n 0000001250 00000 n 0000000445 00000 n 0000001012 00000 n 0000001120 00000 n 0000001172 00000 n 0000000015 00000 n 0000000101 00000 n 0000000246 00000 n 0000000589 00000 n 0000000989 00000 n 0000001098 00000 n trailer << /Root 2 0 R /Size 13 >> startxref 1299 %%EOF gdalautotest-3.0.4/gdrivers/data/test_deflate_2GB.tif.zip0000644003401500001440000000722013614004466022775 0ustar rouaultusersPK*ONM~ test_deflate_2GB.tifUT g\g\ux ܻjTQ3&H R)(6x `ocg/b7B,AH%0y0o-8v[0 0Y&k?|O4g{^{dy??ŏão^y2+4q8_<E8qoo_Cˋ> p6fw{G.?^iU0RE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0Z F0ZE0ZL6W 5w&WvPK*ONM~ test_deflate_2GB.tifUTg\ux PKZ gdalautotest-3.0.4/gdrivers/data/adobe_style_geospatial.pdf0000644003401500001440000016032113614004466023572 0ustar rouaultusers%PDF-1.6 1 0 obj << /Length 2 0 R /Filter /FlateDecode >> stream xKo$IZ\X&. iA=^D](Wjzؑtt*{珿q=|o;ooklJpei滟}{cM .5>Z-cޤL-%׃oŸߟ7!FӜ~W ͤT=I>F?Ĕ/>xUILŐ-4$)2ujM@Br(4g{6lII%6QAWbIG4mW(}W}3-d +(2e> YmOg|-+3!ئ#q)R&o*}ޠRBQԳJJ5-<lvL 17 h!J?Vs -wʡ,(r3ߘ*1#5W&)@A77%cb Pssw'֌~YwIFJJ2+5oo?#\kG?|'[j/>G3}a.~hBOAhh]SDդL~hn|2|O(̱\anNRbU M$R&].7O{{ר&]soeuIkTr65z9ڼF5%fm7͉Xר7`VD- pln<\nN=J7.m}ZJZj߫xPCcme95ٸHHus9fWjεF744>\n'`\dib; Ov"1ga|5(ЄiIX^( 5Y}kw%яZCyY$1 %}"W&| etF u5dm\cn֋&LUIw!IRK3ll$R60qn 'Ɉqh+99P}ļE/# (r٢1טŵI4b\%Y"1zY?GVMj.+̍|ԾdU*|XGyElOEd?iLx506ɧ{HY@S#^q(}, G-Bf_m;6ɭZB6GlOg5>oy1('? jO?8뀛UmK1%wyﯩ]}^`;7iƾt BL4Zlssdʚ{pfj Qmu i`X~7{5w nnYE7X{/4%(+nDj}+}_e..X7[{%W;`\tqvCX>m;bbvn7u {xfJP+!dSbi-Wћ~ׅMǕ-xK{{xGM-?к-KZY+ڛGoM°[e1n7_@{CҷuQ_ІRk_EgI91iXE7X7{%W;XC6F_)Dt^7U7suon1|[kU$mijxE9lۨoX_li7'iOg7>Dstg e mt'T*}ӏY 4gb֫[9r޼Z2Kؕ ?@H?xB`J87(&Ty2pn?lv8;2@(>f)y<6ٶ J3Gz\E{C ;F|<H_gTD.өq D,-'&Coð?Ho2`#H8p~0C`_!k,p8a9 av, J$VΔq m3KNrQޠs=;@Hw;B`J,=^ `J0"+%AE++PJ$Cl@KD O2X5 ҉ O fН g" 03H9!w>LQ3.Is }okH[j(q] iΘ`RDC* sbZ39)kH91w.PLU1ͱ 0HFŎLuƴB%R eȝ b1(H]CK2 VŴĂTbq#4>ҀoBwi?J)i] ij!+QB0C\LU3- `ܹF+2-茘J$#b@RDA s2 VʹTs`4Tbqs45=ꪂ `1 `ݧdi0EgT"rf;0 @(H!1i!Ew34Z @3H9!w>܌LQ1[lQ֌`jN۷OK"-VĂBQeȝ bDs,Pքr,c\+͡ @FŎ%1@,5̠TxcAFY1ʑ 9 h J4ʘThF1 QfН i*%gr,#r^Fb|2+H^J RLU3 #xRrdi Fw34ZiE=gT"q;0 V4n|Jʐ; `LK0KqWJ0cRLX=_!XFܧ>†/woڲw)1zI"R)e1VaE3>|Чk8(ňV(Iyq=.{ó_fљћsڬʮg$B8Wޑ1Ur77iLѪ?vҤl8sg̝07XƵ9֙;[uNʛGg ڲg{)u>!f[MΤg>JHjeJi:EO_=w+Z;otAl1, Ub4 ayx᪱N g((3ޡI@1u8 bG G.x H ։0 }1*1igw#$(1u$ bE^үC&F.e_I@1u8 bGC}8꾒 ub4 a'yX_m@)G@r}l ƥPHh 뇔UiHG u$ -"r3q\.:VpiX^Lc14:wG/A)Ap-yX^,96gsE9aU@Wp^ ?_gor=ê<$qj2;./i7|X J$㖮?`w endstream endobj 2 0 obj 4041 endobj 3 0 obj <> stream xy`TŲ0^$d' K d% " BXd L!˄̄ `DE/{@P ⾃⽸_u3NW a)07vb\ˡ\B\V3`g$ ~n|a֡ ʚ;r,߾L< P"׷ rcbq+ֻV{g.~IkF{<R:Y ~_a&t)=s` 1Pa]N'Xed \Gn'-it?}~c,X3[ngrgYz~#798ٴZ6I;&_zgzOЇ}~~@HI鐒Rrq4UKLNKMJ#53ux3ՕFi)NmN]{OI_"}uoO }{'Z_fpd\1;,"kuc9' DO 81ĐN|urΩzRQJ:J}A@\Gbo7-!Ͽ-uq̔Nfkǒ&omz((\ؔ\(NĔRILM63;\IGκ2J}Nt\s&J:?ANt>DJqb':qŧtJqϱX2}Z#Ѳ#M4܌u֞=Z#|*N~GNy50> !?rO.:l=҄!4Ə~Ȟzo8W[8ó}q8pCCPCy8zC;/~*G|:T>,9xAL=r09ioI؟½`ղrfM7V+$i?eNM3G;|Z.&ioCX/@aIڦ>1?7۞SOL<]wZw ] KX WUp+ wQtz8?ZVó>'x^Aeep~x ^Wp x^!Zxބ澁J nZ: ^hf| J%p)cp;,0,o{M6 %p"$Mfr V l"oNBH( #6NrC{}~ypރȏ c??q F~'Lr$H+q(((jB44h8Nh4$ɦ4&$ڑvi2BuTCriɣ]i:͠hwڃt5RE]KuZz@ n7ћ-tFFdrv[Ůdk5znňwdml'͞dϰK=`Ge?O8B"Q,=IOVǸAL8O^ bPd1u9BuAg"qX*.+JZ45jN\'nF6Lŝbxc#Oc/^7XoxOXJ|'~¯1͢iZųD3-#WUкk=^Z \-_+ˆ?fJ0m6BPFkc8m6Abn0YMզiEٰPll!˵*w=|+1>[6|'?qv7߃Igs|Ke ;?_MaC#~̏O39ɿ_o;=??c'O~L>#_7;m6| s xv>Ul &ql<&)l*Jg/'&8. k 2\zbr{46]Qa&_y+BWf~_Z~53kUNr ߄ymm7Kf~;f*wh>Qk0Ogs~y>ZDQ*&.Lg),mL X1NG+%f 'ZH1JF['/]z14{DǺ|X,.EKyUhKX&V}-ͲXrX.chQک-5ZD;M梭Vk5;-h2Oz{ wCCl-m:7ZyZ|V50g!@/f GEuOHLةsr=%5kzF=zf';'7/oaQq?`c 6|ą#G3v K'M2uf̼xl')+wUTVVy5x},\tK/[tW\r+Zk]{7pƛneӭm[z}|mٱvO>g}n/_W_{xy?ࡏ|pppppppppppIAD$q$ H,[{Yo12`+e7yU_YZcx4)"E w*ܧ7a||MRZ1cO 3{r[k}W%G{XܯfkS?)-DGFI\Fb Hu)FUhQFDڄn} ?,~*`kxUl~vOxB?9c0^/'Vz: [7noPI(.wg.{Z7 dEydJrFw)lyϲy&{>d Pߎ{8'̧S&x#NZzºx B)%1?0:}s5}#I7r^uYYݸ+z:~q%4cD, 3ڏ̆_p=ܿFb11TsyePLoJ ۓ!Aﶘ,W>Q{ b%-g$7g# =>ثC+RD:xyuL 7+Fʿg _5\z fɸsQb(}M :n8](ť`x{0A&[uOgt=Į{%izˁ!i.2}TIUhSx8))8@/IzIU%tB vB C%>~@BKm` GZ҆$ gy˸SKtLIֻW \6.hT]`"Ӣ n(2[ҷۼfδ;gLmaiFT&*N=xo;.ͫ㧶"Ӧ8<IA!#5zŴ- $˕UsȖs ҪF$5)ۓG Do.2c4NbyGzozf2-"DlWTw,@htdjH>\E\VgQ-wK~]o4gyvs4ݞּ>Km/0]=WulfʪMAmidmzҩ)g_0m[W|7uPTFYeF\vjU;v,UojP]T5Fl56mhs6#}ҩGmi: ] %*%*I=_L|ڄ'x|#5G~!B !je?42di Aa;#CS'y$d?T̙O9$*XBN6̌ayqx~uzs =Bkx߻LǦn GF2#$E/3Ę٘vu,[YT ݑ@C(? K0E=x7L9y8ǞHIMţ^Cg2iw&%szGd$$Gbx8bQ`-fçMA8K igtgL_Wİ0MNi-`Sls';FS { GhHVG!B,a $fT܅;̈8c:,&:qvDžI(rѲR‡]ݰIAv!!vu] "[uƻ.yUJG1/&9E LcۡCtji2brF3R-ڤ6`[.^|w-p&}pri܃#1<}RZǨPxء3i| dp,D%/*C嚀8vU#J)RhR(Jّ(ЉOM8p_$JEbҟ\r|@d?X/&Qrō)iQf)۷01? Xa/ϒk동זLeO&KSRX,M4^vHNo;Ed Q@ܗ+ ڢ":Ga1tRrlsoǩV ޡgԤ=Kz"{8O{\<=no}em4V(zQ̕ODEcIv)1[ Am%%ڭrN֤N,<پ($+%HBmPt`'E[΁t%ЮЅ\0h fWX-' i|7K.Dv[ -3|pPM1}S{/yL2T\XbC?i6iᑶqɝxrNGxZ-!@nƯ[2e>#?]`SF`9cΈ]d#<.Kv?XEUYLdd$3?=]ێbڻΝ)2#+-WlsdR;aٻXyi(ES+׿Ž2. j7Shx2N6vn p )"49.Sta'w `Ix2]&}%ҎЈNÝ!7Fh{#sd͝7]֐I,$[dA?pwcBcb^ -∑8"6GЈHG1z,A%{Q5vnM6I{Mluz"z4;lt9}m@BgF![|5+SA9>ȼJLJ\ q2&=wS;\3eM{zlkoOmy؁OΟ~DfmQsq:CO2z]"I20ұ{#c(RcC eS=9.5|^t49}LՉd7$q>=TfrrgmtuewowR݌=MJSOb)E覧)Er\8E>;fIE LЕ9ag׮i'`]8HzJ%bG=Ky|.$v}$Hp' *xM#4bR3"[ Pie/ĶS);HBՓMC=QT+>i+~ScpK'F=Ce[}ed$YL}f'?yߴ]m|a]qC#b_8Zy2 )!p/VHƪhREϢl ӊ2s^Ǐ"1; @Fb#Ti4KZB'۹Ⱦѭ'v||Ko'hh aYGbF'eeE$k{rtxrM<&;aD_ھ!R,>뼰[c+VV{ 1ѩSwғd}d[ϐ'n!H;I{!!hÞtw" D#i.r F<9hܺ8;jmZy-20M#f:[bb[̭V׮Zr휕UW\YQ߈um}%=6Ǜ+nk'@k!U+*[w/̀)`B.<1q[e?_;R$fkbƬ!3]d27D!}b̰#ILL=afՇ- aU8G+fʷ=921]au -}thՑkŖbZ?h4:Ҋ-1~D;hgD$۶bSb?HT^Tڴ=O='% KO,JGM%#:#FGMâFDK SFOIon)0N3EmbW*Jmŕr[uOlE8mk$RBig*Hf\YVLmH[lLt[ -?" A-:Jqhx#K0Vkr\Bl\\B-$$9.([dnۣClք8eEKbR)!::* IIA!d<lCp uBHb.rնOJ}*)ԩS cJ\C4}2#ObP HF+#YpvZa߷2%rȖӧnꗢiؘ=Q~hl Öly)$/C|B,#i$f!K5(شN|WYc[_{Nqw]SI!4ktװw`m y!݉{>dy.v;#m 1Gܓ$ܺ.rhd܏ x, 9w4mlhIYY2w-eeCԷ ˯|;+֎2–Ϻwvç*`a5hímh͚$SjB }.^Ca Mb2L%`:K`{aG>F0!lD(wsyT.*nC| jP;qP1`#oevS~;3p\XB,4l\e{r\4BHcCFb,/@XEj߿c ˑ*َ0,kQGq(;3߽$"h@؂P1H.S6#mSچ؏2DޔkM3sI:)PmBSi˶rOI ʾݓ:MK{;&yP{m+P}<ӋXތv\ڬ/PJH[S2=aۭ5[,ѹߴ.Xj^5s~Ab(Y+ {ϗ., vZ}}δ3K[п)qe`?J'}sYLC;~L7u "{0{߯ ߣoeZ.#=:jXjCX <5ٝnPqt/D{wDy"|6fXHdp?b; ) dLdQ2 rlDx1 /6mb lѾ\> }^(H[!~b8~ p 9Oo( KXf`9jMyܩdc."K`'I0향p;V.7IT^Zi5P?ݏY~-EݏRaZnUr Cڈ'C3τbZ~^m+pf޽w16 +](s#bq@Txy gBXv<ȺpxAr PLXcj%IavT>v+cn |2HQЛ{wE,2wY1Нw`n)_q0񫡎/ۆ6 5WtyM t6J? );S$[k3ruJ4~ ?N9/}-CF:6a0 V /6 W6 b,^!,CO!p)a 8nO|'k"8,{! D d>r9Ĝ "rgr_g5wg)}->(QOœ&hYfo*ER2_]}g ?9_eƍͲN_>g5bkh}ne~C$3/ #i¨gI7Pj#|' <Y _`@ sp98sp98sp98sp"e>|;}~`>l/N %LB8 .{M# A`Dh&n}Z/Be@s&ʟU%s"LL<\ۡ3 Ԓ &N@Dd,уLA\E0q ;MsL 11v]M<:#006quM<:p)u[ R#a d{|G+MwSU 1ud Б:2pޮ#7td Б:2pCGn #7t$v Skp[) ˵W*<FǶ'1U hsvnקK;^=~{+|ĭekn B=P"BG|f/cqtb[бg!6D;3 rD|SF`iˁbdCoUpD pL%S&|^-.(W<;9i@:rn#x9cRTTfcdQ U3OR}&ZaS,+|S m{٩teXdXf߭Vԫ}fXciufj76 y͝\Vڬw񞱾25Ctiyl?+P+XdUvSڨ j]nwzw״6dUq"5Z[޶YA\I^풅UhMSI!!E80{ZCeW5*K<ʠy8C6~t3I4`vV{HykAw}JL槌Y'aF uTށ<樷 cfYЇkTc|CkOM5}GRLjҋ7}`3hd.sg{A)7*L3yv,mlz}I[<S3unjUKg[ٔ>TzKhHƔUvv|YpLcD ^IV-osݴźv>4@Wr%iwh.nr/)]?`WkRVlM~~QI\_\W{5=!cW՛O6~9m.34VceJug y,QU~`>cO\l=jˌԜgƜgȺ?MgS8=8#-0BfQf  1Zo*r3$iV 1Q}&U*'Gz}Ӥ>Y*˔WqBbCl څݦ]Y\^W|W`OU+'iX{8z뮬jp;k2tZOKjuֹ>,]}U:-=7]e.՝uo,T:Xқܾ*VO-'Nd&kr.]Hc,]3\N_-q^I@6 55*^|>Toa$r]z4xqZ'_ֈgngGor \5(^Rz CueY_B1֕!nZu,qm^Tr]3k+s\zUnH5Q2X&Wxp8#.sUʥ7P>o/&/LVkE:+e 5΅]j;5R,^9^ٲXWecd'6/+;[>]:z.UVu_l+wkD#t)®&>=C/Rj*5fl鈡#*1v>v>j1KA&.SZZHZENUT68*:,z2i]c]> 4(ehnflpfpXM3Gn=;)&i.TKjUCۨ@ٷ%t.,Phs}85]nAݼw4:U:hUGgꔝ/ d*SֻW딅ʱr1ZNr\dsg0Uu!կP5 [ٰj44Ωq{$w-7򏪪_oJtBJ#*'=޼FWA_Yj3W`:{<5hݮ&ŝ|5BQkD3.X.ir]*L_aNt~äzzaNQ쐐I#1;''?yza߂*_>MMMYŗyj >$e[™&x>˃ܤ 2ST{Ë(_ݧW[ӧWurJ?%\5!ǔɐGم*MZH17*Eɤ̶'@*1?QsN:m65O9|$g1v#bTr;/aTz&0Gw '?ZF0`HWF`ń5hD b CD#tΐ ]0KTHxipOԱ7&=}Tin>&}1-T|_1Q-0 BLGaZ+1E)$ S`*¦E0fŘV2VSrUҩ#S:05ˁ&%.`rX./4 VÕ WX W5zamDp;l;@^x7[^!yPT]"*/} vnOӰg9 ^eWo[6K{߃k{Gp>ˀ嵾%|_U~ p~%qY^\ OIy1 krcyEy=X^KO%ā .6&M䅿Z_GIK I)&y?9  "d)!C02 dMƐdO&L"2L#EdI.&l$sH)'.RA*IqԐZRG<# K|'MdYHKbr),!K2r9YNV+J&Wאjr Yg^zY6>:-䎿gys ϓκݥ.yO> &#򩼴|A$_7[^^/k^l\s8K guQeW񌋛{44m B^BKգt)]F/ z]IW i3i4t+7zEЭ^z>@чi FG>Jn>NOҧt/}>KH_/W &}Mߡ!=Hя_5~Kӣ#=vUk&,B+YdvŢY eqg ,%̒4֕e3/U"VXv>2.`V†al8.d#(6Z],X /W^0]f2x3`\VjX-cVe>&-d%l1]Ɩl-g+l%[V+Y3ak]ˮc׳z606[mol3maw;]nveA{`a;N({Ry ¼`/{=˞c^b/W*{`o.{>`f#)}ξ`_dv~dO"d3~c? vbρN9 q ø; ~̇>|sQ|4q|<'R>OST>O|&⳹exUj^kyzuնx#ϛ/R~_—erW]vuz~_7n]xWޜx+ DPBh""D0a"BD "FĊ8Aċ(DGItɢEHiH.z"SE#Ey"_PbO.#  $.Q"ab|j\-O ZVhhkCm6L.Fjm6NM&j$m6EMӦki3,mheZ*JJsksZVyzm֠y5֨ךBmvXTL[-Ֆik˵JmZRk֮hkEV]cMS'lPjsX;% KyS"y\Z3Ks2SsU[F )s((xX\e)1;N%[Qr5\ZQ2kTG!E^#Ɏ1^W*BƖ1Fx6(̚ѿ(&^UXK\g"Zͧ 1$3dRRctX >]rb)J\>'WΚ*(wW]s{ݕNs6*w6NZPV㬕X4h./Nlh4ո*|5ևR}=c,4*V^g bsPOʣ鵹Z^W'5=Y+s*OʮT/y/z@l9EֹLC=sjPB5k6 UJ7YpW<\\5bs^#5Crw%>{jHЂIDd WhjR=͗v-!D U)*TbIXw AqÔM\U. 2V_c 4_0>udb j2*ᦞL6HR9e`R&&dي+Zp-ȓ,+ %\"]循:O\l2P󨃰#Ra>lu LOSPonfzt) kFNA,8sAn^qn bA bAm3BJVܥ(njѶvKC! ʖrU%lkjF(HqC4$ u% iuк*)iTq=3sw4 sϙs=D!2-%r3ٵLW":>F%`"IŧAT+d[d`\, <V诧zٮXI3I@ )RHK] v9j=Ǎ$m?;mٟKY. X*g2aTDҟ/$tj6jn`VJ z_(J¼ʼuЭrEMVJ *sYG_!9\H@Hp\,$xռZ *;"I1o伎$b[,I-#$[%N>Մ\᩽4n+/]7${=*ll>*`@regl)9H RC"ZIDV.%)JNJHTt7%[*RRHY)Rv#RHY)RV )+BJ!8t*H ]BJ!eRHY)RV )+B x̳RH)Raݥ䧐SH)Rv );B q|BN!eSH)Rv );B .)$ ɁB D 1L0D 1L0D 1b!C S)vIFloۚq9Q)`0w7d=й g//&UfdΗnمC2 l?i j<?b ?{f,,q>@A/8`n3>'s~`3dwTpP J:WH=w|'8EpQp_EHnqtRVd)U0} +++ )Eؕ] [(Ӿi+JYZn{]Rrb},$zd29pXޑe {CH g;L:MA^ܬ7p+B=܌f-P_Iշ{ !@jjTlzsbf3XlEs+,f6c܌X4"yJqR6wZ$1iObYHgV9\VJmY*e,7f9\VYnryC H ˆrZdud3O%^bn2-6sc3WWdA!%@0=U5I pJ<]-17}>9ǫrďp>dPR,R,R,R,R,R,R,B B 1,İJu͜^yrRW۲klыsKҠ7o5Uc3+K̥*[m2C9 -QRUO_\r,ssdN5uoH'_zA\ϑgs1n,C~YOI}\pgc i,h8WI%:H.4mA)D-(33+)I@F\|R`5ԠA,C~oРIf媫 .P)V"wT +w\s\;.s[܊Wړd2_[jN2_9jһSk;v$uQg 8J>$crUDt q֭-N=#8*>#ϬgcɌh'cɌ]hAbkұeFXxWsd|S̈Q;qdr=;; Pjt\F3kQk=5SϮP>{[1{[㱭OPFőz325Q5h,z' ;uu(췎31NKg.] rե'}]atJ4n!shJCZqC˞- 9~Cr).n Ɇ9Lՠ 8)OoVxTV'].֖sާL5KS;֗u~s\xSũGnHsn+'*3DD-O!DWukiFtqM9{KVCs1[{?.$?f#TO&f3#j?H‡E+}ve83}/Vꗨԍt]kd>L7kʙEqVK93jNQ3֍ڐ7yRc|mNqi7ne'O׌ R9ItѻD1~dH0~"$:MtT?~Mz\F$aAԭS9`Oڿz Xȏ{/ Câc;ƿ&TJ{ZȠ`q3D/ut{ZD=js%.=DT&:N5Ja:ƻj2lwnwowk|{u$USFm?Dی^;0_4nQREXQӑ>shLwgb;@v4c>#Z! ّnړ݁]o6ۍv]zdt 8.hKB8ٌ6-nlswٴ&bZ.6韈MQ&MG&ߗ6fX׎4͇cᙱpLs/_n-V5B;Sժ|׌}4_mT_:O#{^{.$_ӶO4G+V*ZSQRp՞WIsM\Z^Zɟ%!եX~.lK4m}t{Ss+===u}Xo;c<)3F#]o/~tעU2nȴGO> stream xxU0<ݛJ6 !B "BM6&YH!Il"* [PT?V{Qs݀>uw8f̙9nX8L눈p݈-{fV5& _q,j ?6ᖟy{5΋Ⱥ fr]+>? !$pbo]C`ɣw,*7ܱ@=8nIJ=+|tfOq/x.}v@^&FmTpe!}>=xD18mɃ@ R{]5b|z`ņ rJ^se#Hɖ5l- ~:ϯ!+߉Z] fh^+{awgۇNP0phϾ~} '#;cH32θا[> g\wO&͌Ȃ,5+5GV߬AYaYYd]:km֕Yfݛ`֎dzz5덬]=*{AvUvMo7 =@ ;<ão9ʣ#Hң6(l ! ,\ڹ §3:~ nhov2Rmv96cI3㰗YڹveNj'O/C; T+B;-ڐ+ݨv< !J;?L<r{)kVYDlW^GN= A+C y#} 0~>^߷OOw?>k_EXfٟ|v|>hߥ5_m_ F9<ky~1{[pso{^{͞/|&gyaS{܃\<=)3j=}ٓWC?{vmF uioJ3~+:tKu6xV @q?Ž[uq V o#gwLܫm4pdg5\p w@=1A+N H9L ¼`cSA5j4F4Xڅx@iJn4gkQ,~EPcM-IKakiZO[v\}Z_ ҆hy@sh.3pj,B+hcqxmv6QUh)Tm63Ylm6{N3uâX4uZӼ~'7|3ìo[xG1n;,8?ɟ;,?_/*o.c#1 %Ϳ |N~- ]C\0<ϒ/! y4bX&)lflNa?F; 2.##I+s镤 ~O7sasi x o+y+/j~_/k~_/Lr#_綛voxR] h-Zl>}S~A_ѯ;OFo&7 }JT i, =w8ULD_{N1;-"2*:&K\|BbRn)i{۞'oVv <$7/t =iGU6|qOpIL6}Y=yg_ʪjOMmwF_fmegu{p\K/[wW^u5^w 7[6zwܹq]wo{oy?;{'3> /+?xzww>ܳ?9pMě‰7o 'N)xS8pMěB7z(=x6! O;=u0~>K;J n0| $?ݷK"`DI0$#{ p%\O#׮}W0 #O@X׉ݑc^|hzAXCs?l^) sJtXx 9E` WH",v3_Ie·Lwplpw'?ou|)'O [C ʓ|*d4_tEpiymvX{)Ҷ-Ў=9ļٝB*qw sO5}ȶw7;PG܇D <2,$>7}@|~:'THs2޽z螞ܭkRbB|\ؘ&8gY`o^γ3Ǎ,nlp5,hcӘc 0{瑥8昑Rk$a3δo#sFљs>QxFN֍1ukFr[2uȐx[)Tb)*?9sٳ6CcXd'oUwkȶON*NMG0-s”k0SM/ =l6N vgtk̎iYSb`s"&m TfH>4sNNŬa(/Ϧ]&S @k֌ɴY`{[L{|tݴ|imwov. Eg0jK&Y=eK)Y=mg?H -[0jΖ7{;DJU+Ze.k0?H#TW^TjaFxՆ?J M l0j+%mQw0iq xMԜ_6)ఉG#?/#!#! OGlRi_ ~ͻlpe%Q6Ͷ͑<Rd̄9sgMKKQBKtV9&vSeb?{w#ߍMOmYɮԍrh\)6蹻_t39(]P"ex0N]KxD|H2$G٢ѲK#uݓ<#!o~c3xY<%!0}ΒU lBl$DTt bbbcKncx,< l;cc?)S'62{,DIC$n=ect.;ȩd_,uDrc{t0ĒUbH?;8uǜ31bN8\@ n $Gg#: ~e9㷎h/KG4ziqb#ƅ]1EӮ˵vLLHJHL\F ]bvU~RJd^'zTyWؘmtnil(%1jcW|]]y]K=]z,^xt7SHi IIe(Mm# n0`NaR: 2^E lȱ|u]]PW嫝_Vtz(抾Ԙ։-u/]::1½u|eVZAwGnǁg/@&J)ᶈܚ{vX<Z&3 ǣ*WC̵$%dt(MHL,Şn\m V"^k8#G>9-OA{B_#E^Lz_o-]/g00N4<uk뷪ߵץ{w{mqyҖta҅]WעEMrb9bCG B젗b*YjqNCK/(/Oo&ƎSчȖtMٖ"ĥ;vigu7輜xrQj|x^N.pS}٧lJ s!q U_ ,[qVԺ}~'MY6gVs`N uwG-?Y^$S1zGOwvkٗHNWc7Y: eE-ecð=e[֤ᕄI sb'LMZS>K"=7g1E|7Trڜy"ܠoΰ]ߟ+IbzOcA$T0^nMA3dnJH|Yra'W{?.=쩓jqȴ^&o8r&~бck\{sԫ$Nm~ܰ_"Կ~>JپCn86Aΐ4cáC2~5DK ث0a.NǾEe' ߂u?WҒQ?6'Dlf0 a$ya3Ҙ/sXh{NF^p *1ƾkk-DzlI #~ϑcU)τSWa ~ۓRf,c*,g`9ݐ7U9jrI/Gp1i9?%G\X t}p0z2c9n\&_ u:2P&o^Gx3LcN̩'p}F^:ė$u= x5G@p39Bl@;6 ˴kVl+d ]˂"l? 4UP-eeo%# ˦n>:zupBJ#3;Ʊ ȳ\nWhQ|t;%/DޏRhmF72 !u˥!,@ (}FEӤ^3 844ڽpqOY_Lҷ_Ewrҧʫ0fO2([f)]*KMtJ3Kkr?=a:#p~/fi*߀Lra&`X؆0@E-+pǔI" e.Iuw! ~+,~\y,z,%{Į`sI,AsF"mDR*J}6VuHE=\ 2ٷ}0?sYzl)}F],iv <"|ب/U~p 뱼ct1i;/-en]ܧ(%e|1NHd3[Ϳc*s}=!!i^ >]h[|I\`ԝz,̥RO2/yTdCnPcʣ3Um)Pt_yUCzCz;dL䭈c;t֩gh !AA|]}61Eb ̖WqϧG7}355?ɹNp}r #nk.v*]|u!ij88;" nHa,QRwO?GE !C@FK~bMo:O|>~'4kZm'.nZA1{ql9}:}jp>F#%ƏG 5޻2\&[pD?$cs\KY7+n㯫 w|:Δ!$D- y0\E_f8_RCIQZ,_,ԿW" B+\f˿]V8m*1p RTsZG@5wxFqx4Tvqx tcAw9濟Z7 _ O,7p CTxkW * < <ʓxu2hOx 87x,w!+ozX琞B.=*sHNpi5-d琘pKJ-R1)U!5e# n_}u\qݾ:Wun_}u\qݾR:| Ĕ CtKlRx)o8)+<^y%}|~:T]7pZTTGuo5"Vx_8@ (~RQ`EUtxD#uń f.a)4j UXnP(;aqtcWcK=hRʵ$4W{e}cˇ̓P#qF=SqN-P"=?B3ZЈ}h$iFv68㽨!;ΐ%FTeВJ}f(WP7(^ uzW+RsQQɧdkiRDUJ*&{jU(nv!\*FUoS cOyvHt;.4=J+^,uUFKҴUK|.JjTzG1P\Je͐jp53VU[T-dUz%ݟsZd_ь|Һ W)~oZU66cȫjжN!Vwؕ{՘&tolT3{,;/1,ӠozKU yox?f}UJEEioz`1]eF][򻀲Feu)^d&ex6(aK-Vސܫ.Yj-緩~DC!]5ߔؤޤ|APS!ա6JEjlip2# f4 `DPכߠgenmSkDCBJ:s&vV&y(5&ӯ4^gPpt cpEV9 >OU2 rQUtUW(Jͣf.n&þp~C4+SJջǷX<8E ?Cd l=Vx7G$Fܮ23o4czY =XYŪ;j 3};^jF%1WmJu+ 4BԪ:kJ{8*#[jȵж߈W{ư8[xM3[IԤ4+sWư8j򕻿ZiN]a~:'{MI}ӯ|)/R &f,X=δ(Kuzt½޺]dG(wWk?r9O7qW-UA1QOW[9 Oro}'=ysV6oG][qy>6->F5!-ϡ٢D\iRYf$%E`̞.C{ `|qx"5 D^%M/;**OHlڝm_YkD[)T:8kSܟz&mV=^ei U߮3sxyYN.>*BH[3_y~bЦX /hO_qWywۧyN6|Mfwk7W v3(WOշ}|#/)zTom]o{[=eƀAi^jq{kq}d]oQn/v6=wWչUx@ю}K45{=U췻nRUg@K tl׻w0f[zpt"-KؕJ|f7./qKNj%%3T"Դ#dE >dmnRpMH%OsQh-Bn5*ɪZo }fS!*3lc짎/+4>r哦FFMCcqy%=_mn#_jr}Eά>ҵ4V+C@R^EfGVFU͇3*kNAs{}=U~H.ix_G QaCW4}~~S(tKdVw}G =>QyRs&8)v[:~vbQ9]]6FiVklnVU1 ^ dƵuV^}m3-^䃴tu7{hv uf1&8x F*OsfCn5_kF_mz w8Fu(0ZkDT8 l,6sJdk- B*̘6>޿U4^_<8ϕ9c6\,rً J JbmmmCLW>&u[BJS}C'aa$7iOsǜU ڹu܆@qbl/NhcZG5%Gݩ'-$ZkԱ1eqSX[͞`ϱOyv*bkOt{櫢|!,X._q7SoV= Zѧ^MJN|8?B^K|/4sr,I>wn?[ԙIX&:kg|xjßhkO6#|DC ͻ@C$Btn ) iݡ^e@Ȅ_@`<檃.<ѿC$'p(((ã{9Zl,a<=0PW3j`6΅tgvؠJkԫQ'i:KߑwR.A-3,8 uypG.U.5p1KR pjppL4mp;wFwݰ~ywN_%{vuOSgYxEx ^W7n| ށwA>6n RA)ok=;~OQ):2wuka8"o؄ aݩ)o4nT7b0SHҼҼҼҸ͒Ad0"I'qRHH1)!CId9 '#H)IF221d,GƓSr*H& 2L!S42 3,2!sit2AM*I&RCjId' HYLH i%md YJ3Yl"g>K# Jr!YEV k%RrYgxZNjHwh؍Qyh. vW(E#!C|J>w%/Wk |G'?[ CC ?Լ=/Ci7&魡ͤ}c D!4|NbZBғ0z2NGR:et4-cX: T:Nt2Bit:AgYt6Ct=Χ V*ZM=: "ZOh#&6S? J.gҳt9]Aϡ^HW{Nz1]~)huzM6z;I7M.z7LNCt+}>Bv>FO'St'}>C E}B_?-roѷ;]GߧC͒-~O?7ݩL0X4ne]Xg ,%Kf),t֝`=Y/J,mA)f}S}d_od?ُK޿~avfGQ83ιɣx4ᱼ <'$ޕw<4λ'.F}x&˳x6| `><]O?Ex)C,4 OA< d41|,S|t*' >OS4>3,>sit>+y^ky| x6/,~6_Ws<~>v5tJ~_cպuoGQT0)D>D$n"YT&EwCDoa}ED1@ 9b,\'C8KBQnh>Y #D)F21Z1b'[wޚww劙b-戹4qgݑkޝ[#jEb ݸ]M,K;rq8O/.+}\ygZqT\&W+UjqV\'7zqY"6[mvqSl]nY#]lVxD<*Iu?vKeuMx[#{}[| >{^ؼW|._μW(Ŀ[~?!qXGEjjL4ͦEhZhZ6`-IuӒ-UKҵZu;yuW,hF`\ZViZy36\a'n>M;]hnRҪ5V[bAk|ZXk>VM[-Ֆigjgigk˵9ڹyJBmZH[]..C[}9|oZYCK>k泊^U7}/٣5x}mdeգUa5zzr,Z/F:[1c *{=zq%T^T%Izw^LG5"R31m^45}|^L^׻#MׇT!f4D|Fΰ8X2URec n1pu^osjO}m4Hmp5ycPxgIUAb&O׬5yH.kl kiRJ5X/Pi nJ'ϾcC>J~Ymu{<Ģ}cF_ Jmv,21mL~HYD&2b)1B)2qtEIiq-säS`2;M1brw8-r,-&e)lRvu]kbkiU- e)Z}^6z_U/Red :8zoImږ&l6ՍzY_Uy=JL@bF[>Fj*ҨxЅ|2U-F^w:o8K^OǟB M>MS@jzpj-wMD/rj \zQ 3i巍ԃͭer5- 5%U!\[1ãZ=rc(ՆQ+G#bnj $z\؜9*ͼڣyUao5d#x#z20 CxSEH~XnVEjvכ$i4VX< C !P.OSy悧[t\ }-g[ 3t-g n1<+z[>' _ZHUXjz2B%4Htz׭`,=7fU{=fb}RU.nZdTG6,QW\ʏT4qDb=2p:x)5U>G*k4a "kcMT-jLX )D>h_13GU4xjA ^މP(Libʋ>W&M% 1sBCeNlZlI'{:Rtwl3>oi֣ܡEz15ٵT+2eRhY ȜDH^Bxq(YsOS?fPfU(1'c5qq6iN+ȷ0z]V`aVdaVbbyf(4y,z|JEaQqXTK>Ea(;,Ӣ(;-NKNx8-Nx,.xx,.+gkF5КQh(fYRYYYY,E"rEآ\lQl(x[<-bGţQb(xXoY1 0uX:kueF1#j,r0=FS!ƖFa Eu\&mD)4(ԓ-(:2;Skd5Ԫ! _1VɺH,0E/6?z,˿JcMY5]sQJvkІI%!XH3>E5DJ*CEILgMőn}xR+xDGG"q=F20FJtZaaj}F+@:Iv20he(c&KǢ% 4!rʮjJOLė]Y((y[k5.y=qVQ/zp),ͲVAӈ4E.cwKJL̈Sb SbVhaaaN sYXZXXY[d6rr30$9eJPaR(6z%j+t9 IQbiid0ZRY MYEyfU"knQHWzB+79 ](1$f"k\%sYXVbXmy8[\cEWbЌ Xs z JL-[bڲ8$q6#ae"{MzŎf-vZm!o*kšސ !u9F(mFYz9$X8(3;1yy#rQٯ83<XXz,1GKi;Y]!+K ,qFTXhEӯ%fPqX.1s+/OH_lfT+tbm~fE+KEk!Y8eXXYY!"k 6"kG-z!PoGH>K"k兡VwXE,E,Vt9BmErX+ I`IZdaq+Z[qHKb˖Gq7D/$+zKX g͒Z]NK%%VFv9aPnvZ-ϊoy^^+߄\VP.;X<]Qk(C>iQηݖ[~_oelyXV*vfX8,{,GQe+;B:$uNuܐe,Ӓi촤rZ|7U[_.u 5mJ ;Vh凍-ËBxI80 w*M9lRg00 wa∧0a3$ i)gK0M94 Ӕ3LS0M94 ӔY ari)gari)ga$)tV Ӕ+LS0MYnbari)W\ari)Oebcqq\ari)W\ari)W,I0XO~L,0XXYXY<-|G#oȷx[<-apX<Ê) FĝaKTO=gg|TؑoŎ|gqB6",I5Tz?+}+?(Foơ;5U}9artYZre omc6WG| X-VQP`1;eƚ5Kxk7ˍҠ00p jT_! Vg/P 9 Y,CF; a0dwcirtXH˦Qn M-%}lCkpW4RnNK5$0%Or; ە\FvK8w1O`J8>KHQxO:A{w! Җc䰈Q $@^Tۉ$`ɰ4h4@(aMܫҒ*jEjEQ@Q~p?ՁBw/A)}~޼;ٴһc}ێ5u:o:{Mۋ<l;U}v۫>UM[󭱽j\WYdmٓ-\+Cn^ܩs;br{-brZP jz*J**[Y9'nc sڥ:Zg:γ|η:l-|+F+Ofx2,,?e,Y{nuZkwLǻ_,S 'K0 %% KX$, } aΚ\9Zkqr0O } a0_'O|? [d G ɿBaUhezyQU)03pT>霼eKK+Fyt :oΦt T gZh V{{8:oW; FǥTie'J#ҳ{J+g=ϭҜ{[UN@G*UF+ONYgƕwGF(NKV.-6V=k574͋Z@q[P?./%]}ލWؒg0^eKkɸL~N|΃w˧t\[.wCϩQz6BOqp_\>\{o]=ss]1}SSoݬq >70xfj[ٗGb b1Ŝ]qb}"ͭKٝK\XbWC{Ns_=F-J3՗[/ ku4QEkK5{R718f9`͒|B58N#:1;է\z.Q&Dw-z͎d~oG5+!*=Nq "Grѕ[w[0s(m_K]=:B:"z{Qq8n=7ZSn({A3Q2/՝;3h Mm9P :!E h70M7057057 .u-sz][6ty Bו̉ܺ9HE X5;ef}}ʭ;7vZ/6ZCj(oc7Jw0 {ܷXOJU}laonl__+_c7&xk?Iξj4E3d/u1|ׁyѱkZuSR&eooϘkTA |SsC>7Es#N{rM?1u(!v.ǑNCpQ4p=wџapZ$GERt/mKW2ވbe3ّ슕ΤGJO7.|עHX=d^ڊ)⺬\&pMq믕6f^}\\\)p}[o+"<`̃1`̃1Ƽb̫ d̀1 31 3`(wŘc )0c )0R)0R    O1<0<0<0<# F,YȂ# FV1`d*F4i0Ҋ# FbHV)0R`#F )Hi@$c -0R-0cK1c˼jm?eMP6eMP6ATMP6A٤/bX6!W W!n(Z^ ```*FFF`, Ʋb, 2ˊn"|Ө'qW O^~[*XQxK뢨P. ;iDv#`U6$ yl:dVvAbVil~A[f?lv(-;zO!8DpSژY@̂WOC!;Ca~hSO(Hܨ{؏ Ł3x2ݼA;p5^ 'a'U -H@2[ن_S c !z{{$uXiKt8' fk$'E0Ad|{x;?FbȾ x/ D^a]yaI9³#Kp{!O=@4c`Xđ#4xdwR ʉ7ňJoDDB6{= ez Qfi38vwJuܱo?kYK.BD[5}o}ڋ#  W2G=6w)tnmu`@y2iIՑmeV.TGZ.rqQ,c>Oh'3 l0BfwtzrC6Ck`+_xa6lڪx>fkѨ7_M7ǞOĺαs51˗|kSW废&EerMNǦ+3rA>wmxO<5<]4 L6uCM}O;5`_B:M ᱳ_˥zvDj ~Q |S,OXى}$5SYm,e[oqI2ԆaT딿\n_Nb}W g^N<ĈϧCr,*1gRfidYY.zgF{EѩK,/B@]FQxY* oE.P E=!}AqpCDQ Ek endstream endobj 7 0 obj 23376 endobj 8 0 obj 54920 endobj 9 0 obj << /Type /FontDescriptor /FontName /MPPRDJ+ArialMT /Flags 32 /FontBBox [-1361 -665 4096 2060] /ItalicAngle 0 /Ascent 1491 /Descent -431 /CapHeight 2060 /StemV 0 /FontFile2 3 0 R >> endobj 10 0 obj << /Type /FontDescriptor /FontName /MVGEWD+Arial-BoldMT /Flags 262176 /FontBBox [-1286 -771 4096 2069] /ItalicAngle 0 /Ascent 1491 /Descent -431 /CapHeight 2069 /StemV 0 /FontFile2 6 0 R >> endobj 11 0 obj << /Type /Font /BaseFont /MPPRDJ+ArialMT /Subtype /TrueType /Encoding /WinAnsiEncoding /FirstChar 0 /LastChar 255 /Widths [750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 556 556 556 556 260 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 ] /FontDescriptor 9 0 R >> endobj 12 0 obj << /Type /Font /BaseFont /MVGEWD+Arial-BoldMT /Subtype /TrueType /Encoding /WinAnsiEncoding /FirstChar 0 /LastChar 255 /Widths [750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 ] /FontDescriptor 10 0 R >> endobj 13 0 obj << /ArialMT 11 0 R /Arial-BoldMT 12 0 R >> endobj 14 0 obj <>>>>> endobj 15 0 obj <>>>>> endobj 16 0 obj <>>>>> endobj 17 0 obj <>>>>> endobj 18 0 obj <>>>>> endobj 19 0 obj << /Font 13 0 R /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Properties<> >> endobj 20 0 obj << /PrintScaling /None >> endobj 21 0 obj <>endobj 22 0 obj <> endobj 23 0 obj <>endobj 24 0 obj <> endobj 25 0 obj << /Type /Page /MediaBox [0 0 612 792] /Parent 26 0 R /Contents 1 0 R /Resources 19 0 R /VP[<><>] >> endobj 26 0 obj << /Type /Pages /Kids [25 0 R] /Count 1 >> endobj 27 0 obj << /Type /Catalog /Pages 26 0 R /OCProperties<>/OCGs[ 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R]>> /PageMode /UseNone /ViewerPreferences 20 0 R >> endobj 28 0 obj << /Creator (ESRI ArcMap 10.0.0.2414) /CreationDate (D:20101021125101-07) >> endobj xref 0 29 0000000000 65535 f 0000000010 00000 n 0000004135 00000 n 0000004158 00000 n 0000027731 00000 n 0000027755 00000 n 0000027779 00000 n 0000051248 00000 n 0000051272 00000 n 0000051296 00000 n 0000051506 00000 n 0000051726 00000 n 0000052954 00000 n 0000054187 00000 n 0000054252 00000 n 0000054401 00000 n 0000054540 00000 n 0000054673 00000 n 0000054820 00000 n 0000054959 00000 n 0000055123 00000 n 0000055170 00000 n 0000055612 00000 n 0000055802 00000 n 0000056009 00000 n 0000056196 00000 n 0000056493 00000 n 0000056559 00000 n 0000056782 00000 n trailer << /Size 29 /Info 28 0 R /Root 27 0 R >> startxref 56881 %%EOF gdalautotest-3.0.4/gdrivers/data/mercator.sid0000644003401500001440000005241613614004466020717 0ustar rouaultusersmsidQ, ( r!.=pIpIxIIm  eȼA#rوm0CQpW? ri xGL%#1p4$KAI 'r &I#e~?HYPT"JsqXm'f$#T<xO0M2 W* ra}/%"销A8J1_2G`ĂB*"(2K%be %pg' &a`N"G$acba3Ţj4(˥!lc/$q֘b2'X^,F#![,ʅr)غH*GSk,6La0ebLO/#8X dAAeK3e|r-2,U#d!,4b=/"JtJ#$QD?$$R5)/^`<œi|T, B94NAr4 t܁;H D3h-MDZ$ !9Hx;&#yĨ`-KYxZ# Gcd4Et;ChE,\1Ϝ끰lO&Sĺq%Jq@b@bcawqΣ2!4IөR3& Ñ}ϟ)D4)Xb3 #.2MԀ;GS %SLh7A~2غg!uG(\@# Cql+F%2r8\v:$Hv% 4qIh6 e݊R8C |>" kḰ4MRtt_,B 0J&E?ZCyZ6 ɨR" łvbBF;bDڴfD&OU}y,-U8(,mRk!:O۷iܗmۑd&v6D2׼^4 O jBw"U.nzON 8* =DǶlWިXJWL6|\4/'/tN<s *4wbΩY97FJ?_i'!j^dC'T?}<}2}WۏLlnh]6 1cbl&iݡ؟-lzH[#zq} ܆]2vVOmm6Rk;FE_nl,]PtuFgS1b29'x#(쫒o".,   ƢҋA{|wբڊ魽1>-:e(1Ԟ?R5X؛i.kI|Vf r68C$ ]2OrZ7jJkLɥ9G50B^?Gk\ud"*Nn%00(Aݜ<>FoF^n,Vn0Dh&Sa_]x-$˚ /-Y6Ғ9|El'UU6c!`!~1#h*y J@״$ܳgdC'2HePZNX AMOH 4_Mǻ$M2"j qXQG !ծJ⣅.(k<\\ESKw-ԊIuBDȭ *8e~ߍbf= /tzNQeP9pito{sVBJ]}Qߓw$wsޭdUe{㶒sX!ӹ9YYBgƓdfXp6ۖGP`Tu9vB>^. PxREs=%Rw0"9̧vΌfh{䦜r/ `,KxCF>ap qi4fR_9cH.'O9L~p8ϒSlᔳh}ܙ@:h4`>ap^{_3/W1qXfrdt!8_c5V3Ie׋2'WT2 *Rfd+rRYO;DEC.RR#3Χ1j˪8wa~o9}[9qɹ'\~Mn9pHeFIOqfA=T7 .=*nSw%1gxY])GJy,B3d\˳6>=8s˄ nce=[ǘG.X )nG]CxE43 s#RtJv8p5/°Ug~ss%v"(rp^thgr4(=3ӑ 0Pvz1THiϟ {7:bGoD0;7>2m>χ,Ik/j#,gTi Cda ~,c5C?CS߇B}/b~>O6eZcvNO[1w?=l:hm">۾ e+ ;/ëoW @'#p6&RU)f Xd1ZF&9+9;i/` ]e`ļ9m@?B1>y矟~~ߟϟ;[>L{/{v  "zcMpUm|&,hM\UEu[BpDRl !)xRMLa'&D.!?R'"3>ⰻ(9n[tiKodXc%QuK FRBH?b|RF;gzUm[VVˎX&շSSֱYVOV mqWN5l)=XV3!IEm.CN9Q55VmqEeY|"rHb~(RL_]p[_qJ04ML~go-C̊D ۋ{5ػhx٢(g:hh]RqB}KS~$ Ym_t¾󉫾v,䋅W89Tݠ0X⑶NzYI OF/qghxЍSM8'TPiUDzugઅ"PVZ-hq@0az$FI!w %/h&Qd*ͮU\RŕmM5'#UJ'"}cfާ+ӒF"YeR.jS$դ IȤ6´KM.8!98rnt"j2 R>k/-sڷPFQTh{㑍`3DYSFcf[ug1{'&%-#vw9Q'&p]Ta.D/89MǺ%Ox{kG/ErIj4*sju.~3Gϭ9{(R.38_|3EDL&9Y ÏRb tzMڈ}ǒcsʆ%%;xz=Lg5)o͵r=ې*~}y"L}wAPuϋǕ|sJAK>vDC MNLdNr2[ώұd3XJ"+E<.p8l=MB!qKmzn.6IWhkyY8sſtMŞ )8s]^;̭Nܲ Mz"68e=1>d9Q=w C$s3cSv~a7=/rM BWMU~{wu $Ehwȃ"+gn~6{)oC D7X8)3(@N'S})OƠo~qNb%obME "ns"Ϋ"),o*ϧu(g~"Z&¯dP8?q "^m?٪Q8 Tskާ?@Y(8E}EMOUMraAPA>:Q0bBM>z,PQjW港)H4)\4si$'VK-iX:5,gHіNΒ$R_??B1Ě/)]k< hj_xKuP7V@޳ΰ9a>o>̷sӛ6m|aat#Vmy)`SXr|0FxSG&F޽1!]jfoc`Gĝ5MÅ;?\߃.DD-1 ìHoN'i]Ϟk (onv*<3JNx5?&e#i?vT3]Ė:IF;e'~:GF^?e7cX 0FmN;k+o`݌d>R HL߆MԤ`B[(^523/xzc8lp8+uM! rk-q2_LZB.^I﷗%N]t,hUzS^^aq"a3giBX~~mDocko?kGW "LHỗkHFi h;%|fb(ÎnFXXtۋ}>U"WS!4{:[gf VVVb.˝{;vj`sc7נ?ϺDIY5>-Y*=09JFl򑮖G ~F<%}p%k}zwDsD⎷nzcs&0stf>V}&=I%ܝcY֗_YڄwFPVT_6WnݰRvˤl%^ 6 v="C9j>6_Ub6 ,HÁ Fw}MjR ;CcسkpYX/M26\fe+ȡ7aazTSL7_A;Ч>zPu }r1[}~ׁZx>QFo5/O_L#|o<&\.ΞR ˱r.NR.e=}X㪙rVc{a.ïy4cۖͫ6vbk.lJz7MX6Jqٹ0/`ﹷݤ$C@H"X΁4a@Pq%jB8{j!)]t̓Irݻgk4b+7 /tdv>vAvcyמnyLXEIi*?#YfEa8c;GfKCwB'` Hp4$x{Mkͤ)KN]&"fmQ&MǿVh2u.33! B"$.H..Oц=Chz*#8HI0{=1=o}0?dJ?'Omt@!dh qpߜ#T11=p6)TGIF駷8P}!灱@}"R cZA;Ƙb,\qiIQgf糝0ztäL}tP > XF4#<Ԯ+^0i&1:@mX>C#:! DbV1k1E)1Ņ+ GM~E6aƻs(m•LaґE\IaFhŁȣ?.h"`Ŋz1 bHgmc :tVD(]8v•OZz\!N'(=4"yZŅdM# ‘;=X0" XPRSKZ8V5¯dXB(!~ta/6GV1dcJT#qi پAM%}:zaHGUh/ cQ>#J% 4 uFB 1t g6Io ŤX\ 8Gyybtу$6EXi`%`~ؘiQ]4G= HӂA>q_?ִ  q:v`|yf'11p t0XdiF810%#9'+FQ?}\ \=:]c# A :p# 9ʜFC^8apvFՎr>45^Νp:i|.s1e=8Ԧ>g!kw"jͻ4-{(f\a:>fݘO~NS1~GdZE6;(9㤮z};aӣz]'FD4)+<Sam:UN0t%V"`N0,5Wfi4ְbmXNnbXCaC5&ҝь#OKNpybh+c#Gn:hCtvPX%0: 1ۥv i>^M` 0$~+J4^z4t=|z#vvWCה;t:^SٰoɢD?.:L+M;;#X7 Avz.xbbAƐ!gO)]sE+ >GI 0!LvТ> WM+cʐbBaà`Ҙy4Sn#pM=1=f1vF(g Wn"q6ĥ1)0cѳC8thCIa ӵF49:)z!_Ӣt0 XvcZ8Pg+ ?#X`%S(eg0ذ icR8DҎϳbiMJânSN>R18vkN'ONaG}_AZA0j.*zan4gtӦ0V!`V9? 1na#9ÀOqhP+0!ۋyygekX|1ǛY"$?@X$6$!x+)*cZcс9$`r':`4tV` p &%sD<΄lpc i18>$"GΜkY6mCtm@bD9,`:;(tAHSg:>Ob/F ?n:"1ƌ>8b^tab'â!ntblvTa٢$+FmFv=D c\AhO6;>1GN!D118CND6SL#KBGDX`Wbi'ǣ(­hh^Nc8ptqJtm¹ӱ48`)y6t8a4mDLN SٳcAC 0|Ecvt40A{cy>! 4Lzp^i]q~ذǿB $XhŸL\N{cp9hihc 5эƚ(W:g QH#(`ҥ+iDJl;"i۷K8BN0gSB$p$oHGь:v§BhtFxV0+! ){aX!JA $Z$(] B0"`?A9ۈa!ʼnH+CŸn߆#(,vtF BN@C1&.d6cm&?< 5L59eB00cHCVV8LjV#?ӣmJ_K>4OD7"W|+]`Q4Nb@(iiB$0'+G.o!Oe}rJA#;{XFi8$a8\!N婡Nl0LW#0c cUNtl"R%!%0"ci11:'!O놃Dt CriiD; 1I;hB$+Q)_#Wi41F+!X,?# #XgMtSJ  >'"~+f:/"Sg;)كVҀ4eċCNtSB1@EvNя|XOG3aGPJAXc; @OM$8 SLjlُr< ~q;t%!a~ Jiӣ ÄA!XCpgnʉ9xG y'n1Aс ~4ѷAiq`wH|0a+kFgn%~^f-'1 5$Nƛp4=L<{! Jh`S 1'"f. B/==/=k{wzz^{^_UUUUǪU!a9! ')H {L<\k{v0GN!M)ٲ1Ub CPaSGN cZA=Et%!v"aCGfq\B4ѣM4BA1118CƱ6ji1CC*|}%R>>&E?hńůXtm}8}ZTqnK|B0)ڱ#|h]4h"@b^#X|> B{H@1D8B8+ }! =4a{;| CЌ6VҫJ /'ikU83xG p+ 0=RxEt0vr/+xVs hq0GB„#W04A| x 0kgc0>>`~s0\ă!D4p}"D' //6BRI ;Jƌ!;:c{m:t?*`9OA1]4AP]> Ecv遇ǔ{BT')J1`:!l b!ѦaD*B4< ԃ: 0!;W't:z 0Ҙa "΋aIT/Wkab>,t:9ӱ!'51"cLxP zaxxB5!=X|]! >H|B&&4jp#JDp`41zUGI9{?$qcG~_fhѣaLpNB0K`im8J!B0:=;Hu8A4 t! {!F<'FXb`0 0 WūCJ) 14)]X{D\Xـl ю}8X *HU*h ]1F ~Z΂cXp 8-}!0}=tWV4V,; a4 ?/F nm'Hc;:CG6r17B@$!?O'_l{ftl"M,},5@ 1 hgW1aAUZō yXƁ4 bV5gi_ 8E ªg t#㈟x) Ha0o}І '>1m0^8^t5tpi߅Wc4ŀUb Zt!azxm+{gSa/)a'#ӆoC莏wz qk$h,}Jl4{_ jyX`pN,!xm"Zgy ?sL:P`~s ߠHO  cl !㴎C)H(X@cS4֜Ǝj~1ñCP6c bUi`%C}{+ +(8HaOoH *NpLx #?8QXa\㴆 ": q"=JD!4€mFA!ƘĂŪXCD/#SF`X!Hٍcƚ_ĜR;:6}(WEZԢaM4F18iB*B6 sB br¯sqŤ(^`F걌RRc;>߃#_GAP6 $kH1aBV#4t4TV?J9$']M=DM"v?V)v1ZƣcT0hL#WOU/# Ke4a>3B0J<<& G4Gi^5s ZBPqxbsHIs<q8}ca )Ŏ:91 (8SqIiF+ `%q'+:C: I 1ï!cyX"p!N;*l+=iyaȩHQ"8;* i *Bw)A,t_>0Xa_@FBrq1H# iT@Sl`cXΆǵ4mCN*].b;ڐ'}czGD!)k ?\!; RR? a Nvc%R="){H@Ti1LpB;$QM c uu8ZvP+Fw+ЎĆ#ѧH 'p1x Wkvb Tv`1Hr3c4zv:x/J7 =!D6א QV+0!)BtuZF00F> 4Bq4EBpWDB V$c U)hcQL ZVZR,N1HpCi'׺/===h~Q^B*R0bҴyV8HWWN-!ӨU9I QhƘ@lhr! #Z1$;hppZhfū881:!OnDV{gv>XVjQGJKA\*V`Xa6Ұ1pѝF'j k<D0ŀ_b(>cQx^FmkXt PB91c<Di^t!ÝclpqbTt׍1 -J? @g31=8< EO,B!G1+\bi4~GٰNa(:bv _?Ntwt} HE_ka4G4kv`a GƱ |9Ͼs9p9Ü 9}'s} 9=  iB=I?IUImN{ c@(pjXCvqǏ0iOoç-HF0;>1/LpbSѿ)ʺ:ư4M9#B'а?x0Wh#iѡlGtƵ=E>z=GP"´CN}@0cmHvcd0½83E`:+HB M;)LtT›8iaq1qK#:!:11q!HFc )qS_CiN·X8Xh>ҵю~p <ՏmZtV͆~ߚ8@gM T¯bv];x;x] @f>O!J:tSd+ۧo<]X )枎{=!(t b׳oӉ) p4ՍȧNP@k?Z bmzOѲ1#c_A&aLa}c) }? p8GiHĈ# m#^>ucF P1+Eha4kV=%c~aR4p ]6Ņo~a`f=;Vֆ|C`D#FRz Tc XUE#6B EBakֿn8tW>i#Ƭ|];6 X鎃v>D 3i|0b# "pcJ>;6W O`_īN/,cF!`^xA ÷G>F0?)5Ƽ(?'F8QXmXB4IN<f61v1p?kMx>c$5 5bbbvn :!V TkIpĬqϐ?WF!a>R>z1=0+0iA#4Ph"ƺa vCi0$!F;cѵaMA0;#q?ώhbt=)ck+\pGR,}<ȣÏOJd{0:+|C04Ҵc&8F'vc-p! qH,)a6;L #sPG Z"Q#:HzSLc+B.ȑxGJvĉ8EW4G !k8/LS!a)LHGoÅ B(4# B1V8~ڄX!hkvaH6A?aJҸӉTH'4iф6`°0'3D#|GHϘk|ǎ0Fdh8;Lxz ~OA %6R5o6cGi(?ߕ%8mbbizt{t/^ 0M a UK|,0W׌1a5Co#>$]$}0+}K`)cJ;t8;R:X~/!ӞCDc?nWbGlh:?ӣf5v#\FH\ilOBl 0ѥ88q۰iOl}0},1FfG !) ֱ>UHV-}x6vžDѥcAnU0PD}j?ǎ SFCaqh(iO>ǧB%!FLt1#4/1dC lchEa!G`FXOO$IMAGE::NO_DATA_VALUE#IMAGE::COLOR_SCHEME IMAGE::DATA_TYPE&IMAGE::BITS_PER_SAMPLE4GEOTIFF_NUM::1024::GTModelTypeGeoKey/GEOTIFF_CHAR::GTModelTypeGeoKeyModelTypeProjected5GEOTIFF_NUM::1025::GTRasterTypeGeoKey0GEOTIFF_CHAR::GTRasterTypeGeoKeyRasterPixelIsArea3GEOTIFF_NUM::1026::GTCitationGeoKeyMER E000|7GEOTIFF_NUM::2048::GeographicTypeGeoKey2GEOTIFF_CHAR::GeographicTypeGeoKeyGCS_NAD278GEOTIFF_NUM::2052::GeogLinearUnitsGeoKey#)3GEOTIFF_CHAR::GeogLinearUnitsGeoKeyLinear_Meter9GEOTIFF_NUM::2054::GeogAngularUnitsGeoKey#4GEOTIFF_CHAR::GeogAngularUnitsGeoKeyAngular_Degree8GEOTIFF_NUM::3072::ProjectedCSTypeGeoKey3GEOTIFF_CHAR::ProjectedCSTypeGeoKeyUser-Defined3GEOTIFF_NUM::3074::ProjectionGeoKey.GEOTIFF_CHAR::ProjectionGeoKeyUser-Defined7GEOTIFF_NUM::3075::ProjCoordTransGeoKey2GEOTIFF_CHAR::ProjCoordTransGeoKeyCT_Mercator8GEOTIFF_NUM::3076::ProjLinearUnitsGeoKey#)3GEOTIFF_CHAR::ProjLinearUnitsGeoKeyLinear_Meter:GEOTIFF_NUM::3080::ProjNatOriginLongGeoKey?]^^#@@H+q9GEOTIFF_NUM::3081::ProjNatOriginLatGeoKey?]^^#@@H+q:GEOTIFF_NUM::3090::ProjCenterEastingGeoKey?]^^#@@H+q;GEOTIFF_NUM::3091::ProjCenterNorthingGeoKey?]^^#@@H+q=GEOTIFF_NUM::3092::ProjScaleAtNatOriginGeoKey?]^^#@@H+q#IMAGE::X_RESOLUTION@N#IMAGE::Y_RESOLUTION@N#IMAGE::Z_RESOLUTION$GEO::ModelTypeGeoKey*GEO::ProjectedCSTypeGeoKeyIMAGE::Z_ORIGIN*IMAGE::COMPRESSION_VERSION /IMAGE::TARGET_COMPRESSION_RATIOAo'IMAGE::COMPRESSION_NLEV)IMAGE::COMPRESSION_WEIGHT@(IMAGE::COMPRESSION_GAMMA@-IMAGE::COMPRESSION_BLOCK_SIZE$IMAGE::CREATION_DATEFri May 02 08:26:46 2003 IMAGE::EOMgdalautotest-3.0.4/gdrivers/data/byte_jpg.zip0000644003401500001440000000122413614004466020720 0ustar rouaultusersPK {/>DTbyte.jpgUT 21M21Mux JFIFC    $.' ",#(7),01444'9=82<.342  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?R9Q6=:J߯L*W{@'$!v5&eW>ޚ̬0ZfăI#'ӠzgV_\ Fc21<1ֹ*Շa6Is\9n~Q PK {/>DTbyte.jpgUT21Mux PKN0gdalautotest-3.0.4/gdrivers/data/swapedxy.nc0000644003401500001440000000115013614004466020555 0ustar rouaultusersCDF  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.0.4/gdrivers/data/two_vars_scale_offset.nc0000644003401500001440000001052013614004466023273 0ustar rouaultusersCDF xy  Conventions COARDS/CF-1.0 x  long_namex actual_range$@$8y  long_namey actual_range$@$z  long_namez scale_factor?zG{ add_offset?q  long_nameq scale_factor? add_offset@ l$" ?@@@@@@@ @"@$$" ?@@@@@@@ @"@$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 BHBpBBBBBBBBBpBHB 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.0.4/gdrivers/data/iristest.dat0000644003401500001440000020623013614004466020735 0ustar rouaultusers @> %Z%ZCAPPI250CAT PPIVOL_A CAT@ @UNFOLD X<Ȁ4Ht<0|pșSMCXRADSRV01 8.128.12%Zcomposada composada 6Ũ>  *}[ҿ_% UTCIHNPW\\ZYYJFIYEDDDDIIINNLLIINNNJGNKKKKONNJJHHGHHMMIIFIGIEIHHHHHMHHKLLNFKKNNJIIHQKXO_HQZfPVZHJEEIITTVd_ee_mtVZbKWWJEEIIJJkba]XbiimmotzzbbiWSJNNGGLJJNSlaZWemdmoqy{{wil^ZUSSKIGGNLLO]opbjsqhhqp}wwqliiecUKIINHNOO\hej|woojp{v{ptlkicZJMPOQOHUOKKT]]rujonnqtvrrsfmlgZNNNNNMMVSSSSUNNM]kq\goj^srvrspeojVQNONNNKQTRRRRLLMORTWfosw~v~~wwgkUXP\\NNOTTQQPPLHPRPPWk|~~~klZXa\\YPQTJMKEEEL]u|{{tlfa]YVQIFGNVNO_vz{ygpbdVMQ?=JJHaYY`u|ypsdaaMP@?LQN@=Rb\c^jrxysttaYONIJXQM@=AKKEZ]jhmqxv}rssts`XXOWS_OHHHBEMMKKEGHFWejebuwmjllwwso`WmbfQXPLXVOOED\MMK\VHHIIIXllnjtqjkz~y|sohbf`X^`UXOQQQPDD\bU\UVSLDQ[nqrsgbfdslmpynznuvc``\agYZ[`_W]]EE^TTSSPRTOIBCNZ\jjbc`ehmlqg`psvqy|zxwqts[vzstooeZSabbYYKXOWQRBO[_\gbc`eihrxqorw{v|{|yww|b{|{qywof`ff\\TKKUQQ]\__cJDCUWZ]g]T^cbqtvzsx}wyuwwz|n|zzmwn^^PPLLUXX\KKJJKNQQ_\]`]W=LHTW[Y^Ucg_nnsvrwzvouur|z|~mbY`SSM\\XX\[KKLLN`WV`^WDSWiZQcttsy~mll\\KKalWc`lmx{xzw|k``VUTGXXX[`gfikjgg]\YXXVXXQOONRZ_h[S^SCBQVQVY~qpelvqgliZ]HK^OKdmirx}|sc__\GGVR[`_afhhhh\Y^\\^XQTNNAegidVSSK8PTKKRn|pbb^opdiccUURRM9Zhmryyvgcc[IIHRONU]YhjjegZ`\^VQTUUvggdb]GD?F@>D8TSRR[y}i[YddikddUURD9Lfjrtvd~tujje`LLLJ??S@@@NNNAeeejgf``YVV\^Utqnfe]TQAFGNRIFA@K?A;J9@MH>ELTK_WI}fYXaaggeeRJ:Xfog`Yby}}yxlon^VIIKKIMM`MM@ENHNPeejjfdYYV\^Eprsic_ZOSJMLLOKaU]HAELWT@CM8:BADX\f_eIs`XXZ_[c]`SJA8FZm[O[`qyrphli^f_bXSKUVajZZGCEENPPbckkb\YRVxvqobe\]aXcLMOTQ\ec\XNMUUMB@@MQDB?GBM^gpcWKcaaZW[Q]XSFAC=aGOS]ksuljnlrqilkfm[[fafii]PCEBDDE?PX`bc[\[DD~vqnjbdfbdcgcQTXd]edXXOTPVPI@?PBEKYL\ogibSQYkc_WQQGC4[^jtmosnsstklzukskjjlkh]ZZKFFA`__Z\O?D~|xussijefhhhcg_qhqfiaUNRMTVXH=N?:IYNRShn[]\XJ]b\QMGFA7YZnkllopx{q{wtvwpuupjj`^]PLL=<MN_WZMO{ysqrppjkkhilijnpx|s][TNSSZQUH>:>TWVUT[`[_dSTd]]MMBK`gdfbfnxk[lyzzqz|vvlki`_`WKK=?MMMQWYZNON|sututicgjnljmyxv|~kgdNQHIHPXSSZLGUJE4TMVXbR__f_i\^wfs}strrraTVVfWWMZZ[[``bbXQgqrooqrhmklichje]imfaZSLJONQSNZOA6BA@SV[STFONFG;:PSRRIjeee````dgmvssqu\\MQa[[@PS``UUXXXgrosprqnhh`]bq_ZYSga_LMH=BJPPNId\_cdeddfhdaibaZ<?@17_ade`lstnif^_ZVTVWZZbS=aa^adgbchhhc_jOOG%!QSdfeUgnd]_WW[LIEMRR^S<a`Yehhh`gonfehYKFDQSZj`RRROWWMMLCDQR@gdabfjfccdikid\SFJPSZa[R@K:QQD@<98;JOE:ie]HJQJJMOhkikfilg^\a_`igSTPMM*WWWF@<@@8BEPCAcie]VVMQQ_a=OOapojWbkgZY]\V\]j`YVSED):B>:LBcoo]]VYa\`_aeZOa[Nca`^ad^WY[WY]]^aZSMLD#::ccovmaYaehlaeZfOa[NMLb`jlj[[[bXX]X\Z\\ML<` Tdkvoqccaelq}ecfytNMMKONQWdf_[[\ZX[\[`aiZSM0>dcxxp{kmu{mv}svyttl`KO\bCCKKNS_gjgZ^d[\[_ijeMMFBWcgsmwm}}|{v|vjimkd\bdFCGOORjjgeddc_[_Zje]UBB>AGbellvxz|}votpnideeOQTQPOGRTYZedbbc_aZW\[UUOBD;A[unv|vnlqrlpkz{zre`[Wfv|yrlLQMNNO]YVTZROKOKFC01;*9MA:DNIKKX\syxsg]adghtrywzsjbgivwrur_dTUVOLGT\YOOKDKFB"-;%MGHJLK?EX_hsxsUVcnolmuttuujmso}rwzwmcVVULTLLGLLYOEBBD$8<%DB=LI;;RAELVdkpc_OR\^eouzssqppmryvuwrqlifh__8LMTSSFEEIELFEEEBD:993A4FMYRMKFN`fgaZUY[ddgl|u}qnpnou{{wwywqhhlh__MW_SQSNEHFDD5M.;9>8<+867L7IJIJHHRbbni_cjiblmr|yvsfjhv||zhkddoffbSUVVLE<<B;=@B=66HL7BBGHEEPZipjkntrbllqxsrqjlm{mklrojpshXVWXMML=F?<<7=EGB<::FAK>HGONDCTalrmkoxpikgwuqslmk}}~xwrrqwv}mdfXXUFK9IMMMLHCAA=F?@@77@BKIT]ZK<7<@UZYWRRimolrw|~wrtpvsppmuppvwrww{qifcURTFKTIKPORNGFCAA?EE??>>EBA1ITbT^M@FUU@:<1;ACYXXVb\[U]UUUTH[g`fkgntt}~z~zx{xqnrmglt~swz~vwuhhbcZ]TJSNQWTRJDFGB==BBB>C>>?=<<).D<<)4RZM^`dpnjdea^`ZZ]]\dideupnmw}|~zrwturxqwtx{w|~~yy~~~ucc^XWVJMMLOOB@BFDDA==@C@AA?D;GWigrsltrnulU[[]X\c`ggpqqvvt|wsvzptxwwu|w}xzwyy}{yfhZ``U\LKLN<;FJBB?<<:AADD??8DII?:Da[qwpu}rpkk[VPRVSW]_dhtw{rvrp~{}{x~xyy{wxmqsqxuqqppoxnpi^YgSWZUY\\?A;DEDB@CC@>=BBJA@DYwvnpqrtqsd][VPGPQX]ZSouw}tsuwkpw~vrq|kgjttsxvwqxuuw{|iinggj^ac`\\ZGPCAA;>ADABAA>>ECF:crvvsuphjkjOMPCDTVMHIS[moxxmuuwllnu|txvotyllnhvotx{wyxxsw|||zny{gepooogZHRRRGPPHHKBD?=FF?BAB??H?>=99@=:8ovkv{poad_QMO@FDCGGSScnogkkngkllphu|ytyoojj}yxrwolqhjhq{{vzgntvvzxxfhqooog`_FLKQNKRMMABMFECDCC@>H>>=::?>=8[u}{sp}wfbaVQJK?DBH;FHEEC??CA>>>BJD>>??=B>78Xs{sp|xphaU[JJJCF?@VVX`dcc\Zknmjkqnuxnsnmllq}{sm|rxqmihihuvolmoowuspopnh\Y@@AQLJJNNOGBD>>?A::AB===:=28>ixylfliffXTUIGMF?85Q`ggccYY^^mjkkgqrpkjlmlpz|~xzx{wxpptikkgnmmilr}usoik`OYGGJ@O??GKA>=>CCG=GGBCAG=>?CCGFF>@=?<<@=A<<=:@HF>Slxhqfgh\_WVULLM?7-QRRggb_Y^^[[deefjjnkgklmpvxq{wwvzvlrtywslkmmkdgryxtshk`OL>???PGHIKA=BECFBBFJEE==>>CBE??@>:<::=7<<<@BEEIIOTVybgj[[\WW]VXKI7QR[\_b__FM[[d^ZdjkgahikprrmlotyyppqqzyyynmkkkdgrzwtshbTRB=?SYSTSIC@?>GIFGEGFJGA>>8>?BCCD??CA@<>@B:;;;A?@ACCFFEKC>9CACIGA?C@8>??:;<;<8BA87:?TYSDWWSSQSUVUUUCMRTNKNSKJ`_UPSafcojheqgr{rxrmnlsosqqnppqqxqpikZ]NJ_mnuoaLLB?DG;>EE>IGHCD;AAEH?D@IA@<@:?D==:A88<;96?D:CBF>BHCA9:9@D:HB8=??<BGF=B-88IFFETTSSFBF@BPUUtrifiwnx~|yvmvt|xpqpjhuyxsh_jhb?I]U_VTIXXo`HH?@F<@@=CAB8?:EEBDBG?@EGDC>69;A:=7?BDF=BB.8@GFD/E>A?BPUttekdjustxkns|~x~s{w}yo\W][a=JTJ:`ogT:==@@8=>EDC9;GCCCCI??ABEA>789>B:<@>8;=C?;==GJ8@OZg~ybYN_`]fXYXklr}wz_]]YVfZOF8MOMMMEEE@?>F79HDBA>@B;;5;9;;A=JL?/IKD/&fijwvxiNMQ][TPPPWleie]]\]YVKNC@<MMMEFF@D;=::HEE<@BHCFDFG;CB=:;:::7A><9?>;;:99C8FHDBBKB9(Maopqog^QTXXINKRR_]_aXXXTM:H=JEHC<@BC9A7886@77<8;9<:?;<>ED5AC)(FPZ]\pvg^WP`XQPDGSSZYXVST8F4=6;=AA@GD=B8?FC=A>:75>:<77:;7;C9:9?CJ@F.-"0(ENUaoomb\LSaP]X^`UVUUS7D?GD:87GFDEE>AA>D6A=:57857>589?=:8&A?+,Tepvml\5:]dbW]^`VSOUSTDB@E==AB@4>;;:A9@7875=764B>CB:29?UyA3VT_rvvo^^@OBbb\\d_QT[ZTY64;==:3=AEG@<;;>@<:<;896:<;:3957549C9@:;9XVU(N^kt|k`MH9JPbch[e[NZWVO@<68<=C??=<;B>>8==:<9876:7779447F8=9?BC<<6:@>98<774756@?66@@F:E.BSns, TWssuj_YKFQO=BJOSND4<@73EF@
;?<>97<8<:87;7:66@7>;>4:3;7676@9D;;?A$&r:~n )$HXVM@::KKK@3@:A>=<<85;594279:58:72@?;?;<;4-N'.EKKKQP;98A;:;78363414758;542B@A?<6;2`6:"BBKQSRR48?:<93;06036863667202;@A<9<;59<M_XSRVV9763=775216.7=60;89=96=<92$M_`]RV420454784.31.7976;85:<;8@1330VS]H,12.66:3251989859689<7%*SRB,121632-582A4683055;2K"&R,-220.77<8>>11816??"$2=-2--/34971865?U5!7%&$22E2-02427859054E>{_>))')30:D/17,,54./2'lU6"xzA'=,;43,)*.04+02-0;gj, /E1)S]\RHF?1)),,-+0,-10fD)$`7STV]\YRRUR66,,+(*--3,/sL)+-O68F0TSV\_TV\\YOOTURR2:/),+%*5.*10+"QTUXX\_]\UUZOTUUR+)(%*0Y/.1RRXYT]SS\ZZ\XUUT&6*'H`:#&2RQVTPPT\[]]\XSTVSS.>?4{_2,,2VVVPTSZ]]]XSSVVSSV..0%{+!VRQQZZ`]YYZSVYSVV-*,'RQQS`a__YZXYTTOV$12''^RRSSSSS_]XXTTTOO-.*'#')S^^_S\`SS\]XVVTTV(%%'*0SST_ch\`X\`[[VWUS4(.%&)1/322UUTY`hhdXXXX[WXUUS," #0/24UUP```dd]]XUSXWWS4#('&+##%&,*-*0PPP``a^][RSSSWW32/+($*"%'%,**)*/+PQVTa^[RTTS'1/&1,(#/%&&%.-%((*-2./VTT^^XXTV433230.%=(@?#*'''*1+/*(/0=2.*,45/XY3@C:.4/!8###%.-!,.+(&++',/,.-+EJJE>0&!"")/&0%1,-++(/-*--+2BFD=&.670&8,,/*+-(()1HPE5))*)!%24361)4('',,+.,0028C<33# +4(-!./)-)''+2+'/'%.5)2$(*+'&2/*)00**-**"! *,,*"*03<$)c55/2Q4GXH4DGF40cca^GUQW<!DS642)59>cca^`NMJB\!4;(8=)#:a^^cca^^b\^ONMQONNNN(C<-"___aa^^eia^`b^edeMQNNNNLL()&5__d_ca^^eiijj`\^edecaJJJXLL1egl4__dcjjll^eihjnkfedeeaaJTRXPE>67eglp__d_cjllehihhnnkf`decaaHPPSTP/,Skeegnrrrmj_jlleehidjnkfgbkkcaaFSSWWB$160J|qfnrrqminollehidbiipfgbkffgaGGSVVB)1Sgfexrqminllhhhidbipkd`kffgggGF3$)SghlminoljhkifbippkdgkffggiFFF)=4BHJghllojjkkffgbpkdgbddfggi7;FNP`hhlszjkiffgifbdgadedcihHHCNShrvvszokkgdgifbbbcaaacbdhHHKII0NShn}yzzokhddikb`bcadafbj}HKToXIIKMSbrrnhddikoofd`bcbaimZZTouc`OKMSc~}}nfpikoofad`bjjnspZZ`fkc`OKHZgtngpvsofjdcbjjnrr`fkgnoOKHF<]lvpvvtsrigdhjnrjp:=MLLLgnoZLFGG]`g}t|rnmigdtvrjpJJUJ^eLLHLMoZLJNI`gjrw{}xvvguhtv}zFGEE4WLX^`_ndfPJLMSVJFP[]bblrw~vtzx|x{}zFJJT^HTT7KVQWWcg`iu}rlkXXMSVYbO>[bbfruqq}~MGUYUGJEEUjjldvi`KQ[|w}zq{}xpmwaWUDVMP]bfekkqq|QYYUTNKKEEDDfxqttsu\[dsvzqx}qtymTUSTTJKdfekihh}yv~@MYYc_]NQKCDDQYUVhEEGLFd\uu{{|w~|eqw{jk|o`TYVcbPUnbfiihes{}~@Q]bceecgLIIEC@@OQpproqUVhcZZLM`zssr{~|w{|t}uu|kkq{tq[V[]Vls`]ihecmtuCQ_eegpbTTTJD@B@VG\\R[m~~qrrVZcZWMUhz~}x~~~wy}w|zalvvkb[YUilc_ebeemmuxx~BGLWW`ppb[X]X]]^LVXXgR\\eas||~rmVZc^OKKTjwv}~vyz}xxrvrni[ZZZ__a\gcmousxzBBLWXcfpi[^\\]^^LVXXggod^knk|}tvvcWW^PPKFG_uuzx{wz}xxhcujoqYZ__\gfcaqywz~KKPaX^dhc``gi`bkk`XckosvkqtkktmmcWW;__`zyrrussz}}qfhcvx}mir\T\\\fccajvuxz}~KEXe]dhkjlkgglutusbkrsvtzrtngbmcYW`w{zyzrrsszw~{qfcox~nrofT\\[fcas{wqxy}{|{{~DDee_bhjlnlsylv}}sursrvrttnfa]\YWWFIkysszssqonwvvdcooo~~xnrom\\[[`^csyqiqx}||{|{{~~|{x{DWTaYfjhjtoyrr}yxpolrmhba\\ZWWWXbdyssppoqqgheadd[bolloxx|ojdX`[[^^^fmrpvv}||~~|{~~z||wvtr>DOOTTgjjtlnks}xsllmhbcc\Z[[IWXXbdemmppokqg_bea^[[]_llosx{_``V`gg\^krpvtpz|~~|~|y~z|{vrrnTOLSSbjepnhXggr}skkeabcaa`[[_`XX]Z\dmmmkolkg_b_aXM[]__coswwwfef`V]oojnqtnmpptx{z|||~|ywvr||uuxrwMOWTOY[U[fecSVVOaarrwlbjcca[a`cc_`^^]Z\\XZmmkhkkjeeb_YIMJ__ceorwvwyzfefgVYqrojxtnmmtx{||{z||~}|ywwrrr|vuxtnpM\`SY[_\egUTSNHHUHpbab_X]]\accc`^^\W\\XXXZ[[khkkle``^YWIIK]cahorswyxxwztnfgiietupmjnmmmrx{|xt||~}wwklnvtruuqquxtnkQVd]QMZ__[ZMTTBDOMMQLUTaaaaccb[[\WW^XXZZ[kkld``IGFF]]edhhmkoowwwzzz{lkfee^jps{wpfhhwrwvtsrpnolhjnhjkosqnnpmhjjQQ]]QP``_YZMMBDMNLLTaa``[[[WW^^W[ld\[EEEFI]edddmkhdewwsuz{ppifedebetyzvmhhrwvljnmpnlhelikjnhlc`pmhgdjNRYTBBCaYEEEDDJNMIJJH``^[[YX^^WWW\\IIEFJWfdddacfhdhkvp{uupidbdfeiiilqqnhpuyvjnmmjlhqfjhmnvsii`fghddiNTNCBaaA@DDCCEIJFMJca`^ZZYXXXWWW[IIGJMMfcdaacfdhkjimuurkdhb`ciieiwkkmkiyrokkmjligejhijtwsojfgfeedhDBMLTQEFIIIHFJHXXY^ZZ]XXWFGGGMfcfeadfefbjimlorrkhdca`^ieiwsmkfgkrokknjihgdlfmmrnumifgfeejkFFFIIDBBMMIIQQDILLKJGDDXYYJE]FFFGGfcfeddeefbbiillomkhhfha`^`iwsnnhfgfikknlljgdeqjqpsnqjilgeejjfOOddAIEEDDXOHQQIJNDLMMKLLCFYTEEEFGGIIcfedca_fb_``lomjnkhfhj^`eiisnhhhkiinrnljkhdhjghpmjfiijkecjkfBXdffZ^UUJJAMNOJI^XWWGEOQRPNPMMKKLKJTKKEGGGNQedca_b_`^^bffjnkfhjkkmeic\\hhhhinrvwtkkjjjgkjpkmgmhlmfddffDXXjj^gUUUINNMJHKAMTNUa^WWW`FWVQZPfWMMKKJNKGaa_T`^b^_jkkfhkkkkmkl\\\chhhiirvwtohgoklkjrpnknmlmmdiii??DXXkkkjUZZCCdNNNMLLLMNKCUT`_a^aW`aWWYg`fhZMPPJLNS_HH^b\\afihhhklllkllk\c_[^higiwtolloihgkjkrvkijllndjjiQQ^^QQVBAADZZgggxxcccBZ\GiVV]abb``ab^^kkeddggjfhggLLSNNHJJK\^^]ihfhlllljlklkk_[^[giikjologigfhjnllohlljlnnllVVQQQZZUUZZQWWWYGIISXb[tt{{cccWWB\\iffSN[\^gagaffbekfgdoqjppggf_NIKBJKIJ^^]^fhhilljmiklkaf^[VYikjfenedhedahjuqvjfmiiqqolSS^^^cc^]]bbQNUU__^__XXTTSUU\VPOUUUWjjjriibZWUNll\[WWPSSS[VVWW[fggoopfabefhfqppkne^_[[LNNKBJJKIJM]^^bcigghjmidkafhhcVWQRffekhhofbcbhxzvqnphljqnoGGXXXhhhcc^``]]XXXYYY^]^^VVTTTSW\]]VVUUUjeerpphZppllnWhjj]][[ZXVVYYZ`fgpppa^ghfhgikkje^^^VMKEXXXJKKJMUPPbcbdgghgidfgifhc^_WQRWeddklkifcdiqzyzvwrqpqqlGGHHXXXX\\\nnnbbfffiiiZZXXX][[WSSTUUbb[iii`ffeWd[[[[`pu|spnqqghjmbbjZ_[XYY]]bomppqq]]gceginjjj^^QZMVEEVVXYFGPHGUPJNbddchgg\\fgigh^__QRW\\ddpomilcdbbmmz{y{|{tqp]]]HWHHXXZ\_\jfjoppbbhhhrrr__SSSW[[[UUUYYbbdmminnnehh``]XXvvu}}suuswwmrojjjb``^^^bbhmouqnnYZaceennjjgdRWVVVVOOVVYFFJLPPGLKHEEJNSSdccccg\_`igghf_VUUacdfkpqmkkjfabjovx}~zukRZZ___]]ffZddooitnsqqqeejoivvvaaUUUWW[^VVTIYYjdglllluuhhi]]]SSSgg{}u{{}}}yyyjkjjbbb[[bhffusnppj``aiinmlgd`\Va[V]]Q[Y[PFJJ\YZQTKKJFFHHHILLUNSYVXcccd_```Zhfd^^Uegdfkkinlpkdabdflqqx~~}{{|QSQQkglll`]eeeffttxxttssseeoyo{{{ll__]acc_WWW^^^\dgggllglll\[]]SSShhhvv|||yyrvvpfkjjcckkibimonljjj^__anmlkd``[Ze__``[[[^^__\\YZZTUUJLSFFFHNIOUQPVXXNcdhh``Z\Zfd^Te_h^Yrrihkrmklieegopzyy||{{QM[gkrle``cciix}{||wrrooccyoo]]bkkkhWW]^^^cc`d`ggabfb\\YZZZqqwwwrruppkjppkjhkkminnsjjl`\\aaamlldd[[__`[SY_`]\^`b_a]]]\ZTTTLSSRRFFIIOTSPPLXNOOdhe^_\ZZZ^TXd_^]]_qghkwoknnogkmqq{~z|KWWoor[``W\kkoxt{{|rrufdd||~~}}ppbcckkkhhdjddd``ejjaagaic\]]VVVSXlo}~~}ttu~~zuutkbbpkkkkkjlmisqjlm\\ZZccckkdcdWT^[[YW`^\]]bca__]]ZXXTTSSSRRRIU[TSNNLKKSOOOae^__[ZZ^^aXX_a[]dcgkipjpsnlopquv}~|WWZ[[[TJ[\kqqttuuttrvutooy~zzzkkkbbiiioojneeeeefiiigkooec]]ZVVXTTnnx}}}uuuzzutnncccccckkimmgeqqlmmmZ]]cc\\ddddLL[[Wbbb[[]]bca]]^\]ZZ`RRSSORRS[[OSNQVKLQSSSOa]]V_[ac`^acd^a``_bhikjoovrzqmlnqzuzv~]NGGOOZSUYT__jmmsspuss}}ssjj{|rrihfe^^bbbhnxxxuuffe```kqplck]]]^^YYZYYsswzztuuquunnnfcca_dd`idhhiipppmmd]bbN\\icdla\JMUbibee^abba__^a]```cRPSOQXSYZSSSQVXLQRRSSYXX]VU]aac`acdbbuumhojiijltuvwulmorxx{wyuZ^]]ZWNZadakmmqqvvvv||ttqq{{urjjii^[b]]cszzzuuennlaapqqkkibbb__``^__ttttttqqmmnjjfhhg____`d\\[ddepjdd^^DWZifld\UOORillaaa`b``^^aac``c]]SSTXXYZZ\kTQVXXTRMXXQVU]aac`bb_dbfgnpmgpijlkvqtssuvtxwuwzuwY[]^ffZWWZ\ddiiinnxxxxx}~zzzyxphhik\^hh`]dhsssooottqqjpppiibdddaabbaacfvnnnggmffjiihhhggg___]\[[eeijc^^KIIMZf\d]ULNQQ\nnmaa`^^^Z[Ycdd\_]Y[TUUPNV\fkQVVXTTMQQOR]a\[[bb_cbggfeadmfilkvvutrruttsxtvy||__kmfYWVR^_fffrrttttz}}{{{rrkeefi^\jjj```jjfkkkqqqnnlmmbb_bbbbbba``fknneggffggijjhhhghhe^^^^^^aidd^\OFFM\WWXXLL]]ddmiaa^__ZZYYd\\___[_UXXNVVfkig\\[PPOORT\[[]^_cchgfabb^fiiimxutvtloqss}}uz|^^hhmddYHHbbgghpprrrrvvvsssggZhhdf_`fgg^\\cccmmmllliibhhh_aabbbcc`bbkieiifhhgfffkkkffleeb^__^aa^d^^\\\PPDWKKIIFWWbddiiacc\\YY[YWX][]]Z_^ZQXVUUigee[ZZRRRTUUP]^`hchlffabb^iiilpuuwwqovpsuu{x||YhheddDDfffggglloooonnnkkkddZbb^^``[[ccX^^ddnnngggbb_cccabbbbeddcgggddiddheemmmkkklllbbcc_^^^^[^\\\\[[VPFGCEDHFLZZb``^d\bbbTW[YWXX[]]Z\^ZZXZZUWUReb_ZXSRRQUPU\``hklffhbhkkehirrpzuoorprttuu|yRN_Q`fggeiikjjjjiiigggdd^``ZZ[`ZZee___`ijjffff__\aaab``eehcccccchhdddeeejjjhiigjhhcddZZZW[ZZ[[[[[[WVVMMGGEFHILLZZZY^^\[^ccWZY__VVV]]\\]YYXZZTWRWb__XSUUQHVPU\]]hkjjfhifjllhe`gpszqqspuuuvur|}RRFQQ\dccfffffffgggggga^^``\\Y[YY__YYY\__fddggYYXcccccchhaaabiiihhkkkgffdhh`ggehhddbb_WWWZ[[^[Z[[[WSSLLGFEIGGKJUV\^__aaggbZdca]VYYaa]Z[X\\TPUW]]__^[UNZQQG\]XRXjj^iieelhe`cckpuuosssuu||tFU\___ddd]]aabbbggg___]]]XXWWW\\YYYY^^dccddd\\\aadddaadbbbbeeeecgggddf``^eeadccc___WWY[^^^ZY[[[TPSRMMHHGLJPOOO[]]\\\bXdca]bYa_aaa[[`\YYSSR]__^[[NWWNABXXRXjl__delkkgabhkmmrnrqrxyyw}}[Z\Y_______\\\aaa```]]YZZTTLWV\\\YYYcddbbb^bbdd____cccbbbeeccieefffa^^^^a__ccc]]]\YXX]]ZYXXQQPPRUNNJJJJLKKQQOOXY[]\aXYYaacaadd`add`aYY\STRR[[SRRZXJEQWFRXd^^_emmlkgefhhllouoqqktrtosz}\\XZX\\\````VVV^^^^^^XWWYYWWWWT\\\]]]dffddd^^^__Waaacbbbee__iikfffaaa_^ZZ_ZZ```^\\ZXXXYZZJ\\YPPRUXNNLJJJEEMMLO]]W[bbZZcc`aa_`_deea__\\XSRUVSUXHHZMGQWSSE@@Xd^beemijgeefhggootmmjprssstz^^WWWXXX^^^^XXX]]]YYYVVVWYY[[WQ```[[\`````````XXbbbb\\\egg__kkkkdbb_^^ZZWZVVV^^\ZZXXYYYGI[YY\KRLLUULMFFIIL[T___c]`\\\\_\\^^W]]]XTSUVVUXXXRWWNOSPPEE@>>X^blhmijklefhhghispppollojjxyyMMTTTVVVV[[[___MPQSSZZZXXVU^^^ZZ[aaa]]]___bba^^^^]]gddd_akggbbb^^^WXXXZZZ\\WXX]][[Y[[[\\ZGGKKUSMPLTSSRR]]\^^Z\Y\SNWVV][TSSSUUSXXSSVTTPPPH@@@BBXWWbl`gckklkhhggijqqqsggkqqmss|{EEOOVVVMNNNZZZVVYVSWZYYY[__aaa^YYaabb^^\```eeea\ggfbba^]]]XZZ]]]WWWX]``YYY_[XZZZZHMMSSPMMFFOOOOLGZXYRRNOVVV[RRQSUUSUUWWOQRRPPGKI@@DWWWbcggcdlkhhgghijnnriiipiinxx{yMMVVVLLTTZZZYYZPRUUV[[\ZZZ^^Y\\\b^^\\b]]]\\\\Yfbba]]]][[YYYYYY\XYY`bbb___X^^ZZHHJMMPPIIFFOLGGXXSRNMONVTRRQPSVVTUZWLLLRPNK@UUUbcegcdgdkhgilhjmoomkklfhhlgtyxLTWWWZZJKH[[[\``[[[YVV```^\\bbc]]]WWWY[[[][[ZZZWYYY\\`YYYbbbb__]]^EENNJMNNNNFFFFSPNMNRRQPPSRTVZWSSLKKMLUUUNUeecdgdd`gilhhfggmihhjhifgmsxxFLWWWNJJFOZZZ`]]___VZZ^^^]]]ccc___XXX[[[\WWWY``ZZYaa___`]]]IHHNNMMNOOOVGGPQILSRRVTTSRRKLMUNUUWecc`d``]]lhdfddihfjiihccmxxuFKKLLIQZZZ]``^^^ZZZ^^^^^^ccOO\\\YYYYZWWa^^[``a]LMMMMMNNORVVMMLILLRRRRTTRLMUWTTc`\Z``]Z`ddddaifimjjggaooyqKZZZbbb[[[ZXX\\\[MMYYYW[[^[[[aa\FTTOOGMMTTPQKRQQUWZ]^[X`ca_^`dfflnnihhchutpXXX^^^XXXXXXX[[MYYY[\\\[[^\\ZZPPTPQRRUW]^[XXca_`^ddbbkkkotjhlrpmVVVMMEEXXZZZ[ZYYNKKQQPPPWX\\[X[ZZ__`d__hffftkjlnoojKKKHH[[\YY[JJJX\\[[[ZZX^`d]]]cbbfkeiilqqm\\F[[JKHHTT\[[[TZX^`]d]][```fcgffggnlQQHHKLHHTTT[[[TW^^`]]_[[\\_callcbblqQQMMGGGHHTZYYTWUU`]]_[Z]\^]_cggiikqkLLLGGIIZZYXYUUUaa__Z]]_]__eeniigghLGGIIYXYY\Uaaab[Z]_^^aa_ani_hhhIYY\c`aab_]Z_^^^]ca`cc^`bc\cc``b__]WW]^]a__aaa``^`VY```b_]WRW]]a__a]]add`^VYY``bbbWRW]]ZZ_a\]_\]_`^YYY[]bbb__W]ZZ__\\_]]__`^Y[]]bb___]]Z___^_]]XZ`Z^SW]]`____c_____^\Y]]\Z\]_QQSWWZ`_[[_c__[__^\YY_Z[\]]_OONNWWZYW[[^``_[__abYY_b^Z\]_YODDCRRDDZYWWV^```a___bb^_b^ZZ]_YYVPPIIDDOTTWWVUU``agg_ab^]\\^Z[^^YTeVVWWMMIIQFFTTTVUUUWagge\b^]\\\Z[^^^ZXceSS[[\\WWYHHLTTUUWVVge\\^\\\\VU\^^ZTTRcGG]]``ZZ^RJJWVVU^\^^_\\\VU\\^ZTTSMMYYMMeedd_ccUGGUU^WR^_\\VXZU\_``TTVPPQKPPWZZZVeeddaa\\WKK^WWRV\\\XZ\\_`__XVVQQTQQQKT[[_^ggddaaTTQWRVZ[\VXZ\__`_XWWWTRRZKW_dd__]]VVQTVZZ[\XX\____XWW^Xgdalautotest-3.0.4/gdrivers/data/rgba16.png0000644003401500001440000000171713614004466020170 0ustar rouaultusersPNG  IHDRNIDATH_he?;650MYgBm 3t: 7YL6HMH)^dlbCucM[H ufL2?@5 u x'>6 Ģ;^DY 9 (zYhLu)wY:Y`98%ZAFGAwJ(-6ۥ'ٟ7:,`~;mm g-uK]F;{g61eod(_aY5hBZ].rR&d4!#J:f ZZ}b?ZzRp%lePu8nUԁ#Mt|5 `-y Py DR hw6S uX6ZWdPzu*A6 h+u4V2T &6IENDB`gdalautotest-3.0.4/gdrivers/data/n43_sparse_cols.dt00000644003401500001440000000754013614004466022012 0ustar rouaultusersUHL10800000W0430000N03000300NA U 012101210 DSIU DTED0000000000000000 01A000000000000 PRF89020B000005MSLWGS84 430000.0N0800000.0W430000N0800000W440000N0800000W440000N0790000W430000N0790000W0000000.0030003000121012100 ACCNA NA NA NA 00 gdalautotest-3.0.4/gdrivers/data/STDS_1107834_truncated/0000755003401500001440000000000013614004466022127 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/STDS_1107834_truncated/1107CATS.DDF0000644003401500001440000000523613614004466023517 0ustar rouaultusers001762L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107XREF.DDF0000644003401500001440000000100313614004466023515 0ustar rouaultusers002332L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DQAA.DDF0000644003401500001440000000050213614004466023462 0ustar rouaultusers001472L 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.0.4/gdrivers/data/STDS_1107834_truncated/README0000644003401500001440000000574613614004466023023 0ustar rouaultusersThis 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DQPA.DDF0000644003401500001440000000633013614004466023506 0ustar rouaultusers001482L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DDDF.DDF0000644003401500001440000000053113614004466023457 0ustar rouaultusers001762L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107IREF.DDF0000644003401500001440000000054613614004466023511 0ustar rouaultusers002072L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107IDEN.DDF0000644003401500001440000000115113614004466023474 0ustar rouaultusers002752L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DDOM.DDF0000644003401500001440000000127413614004466023506 0ustar rouaultusers001912L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DQCG.DDF0000644003401500001440000000522713614004466023503 0ustar rouaultusers001412L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107LDEF.DDF0000644003401500001440000000043613614004466023474 0ustar rouaultusers001962L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107CATD.DDF0000644003401500001440000000363313614004466023477 0ustar rouaultusers001672L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DDSH.DDF0000644003401500001440000000044113614004466023500 0ustar rouaultusers001832L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107STAT.DDF0000644003401500001440000000326713614004466023542 0ustar rouaultusers001672L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DQHL.DDF0000644003401500001440000001111413614004466023505 0ustar rouaultusers001362L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107CEL0.DDF0000644003401500001440000004277313614004466023457 0ustar rouaultusers001882L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107SPDM.DDF0000644003401500001440000000063413614004466023525 0ustar rouaultusers001992L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107RSDF.DDF0000644003401500001440000000102013614004466023506 0ustar rouaultusers003512L 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.0.4/gdrivers/data/STDS_1107834_truncated/1107DQLC.DDF0000644003401500001440000000261013614004466023501 0ustar rouaultusers001482L 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.0.4/gdrivers/data/F0116231.aux0000644003401500001440000001537713614004466020051 0ustar rouaultusersEHFA_HEADER_TAG@Rrootroot'AgRRDependentFileEimg_DependentFile'A ZF0116231.BMPl R0 Band_111815367Eimg_LayerentFile'A l oDescriptor_TableeEdsc_TableentLayerName1Ad0 Descriptor_TableeEdsc_TableentLayerName1A91de,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,.PPP gEhfa_Layer15367Ehfa_LayerentFile'A{1104:Cdata,}RasterDMS,.D g\ DependentLayerNameEimg_DependentLayerName'Ad Layer_10 gR Band_211815367Eimg_LayerentFile'APPP1 l Ehfa_Layer15367Ehfa_LayerentFile'A {1104:Cdata,}RasterDMS,. l DependentLayerNameEimg_DependentLayerName'A( Layer_2l Rw Band_311815367Eimg_LayerentFile'APPPnd0 DEhfa_Layer15367Ehfa_LayerentFile'AL{1104:Cdata,}RasterDMS,. w0 DependentLayerNameEimg_DependentLayerName'ALayer_3 gtDescriptor_TableeEdsc_TableentLayerName!'AIMAGINE 2X2 ResamplingF0116231.rrd(:Band_1:_ss_4_)F0116231.rrd(:Band_1:_ss_8_)F0116231.rrd(:Band_1:_ss_16_)F0116231.rrd(:Band_1:_ss_32_) l RRDNamesList367Eimg_RRDNamesList'AIMAGINE 2X2 ResamplingF0116231.rrd(:Band_2:_ss_4_)F0116231.rrd(:Band_2:_ss_8_)*F0116231.rrd(:Band_2:_ss_16_)PF0116231.rrd(:Band_2:_ss_32_) 0 RRDNamesList367Eimg_RRDNamesList'AIMAGINE 2X2 ResamplingF0116231.rrd(:Band_3:_ss_4_)BF0116231.rrd(:Band_3:_ss_8_)gF0116231.rrd(:Band_3:_ss_16_)F0116231.rrd(:Band_3:_ss_32_){1:lversion,1:LfreeList,1:LrootEntryPtr,1:sentryHeaderLength,1:LdictionaryPtr,}Ehfa_File,{1:Lnext,1:Lprev,1:Lparent,1:Lchild,1:Ldata,1:ldataSize,64:cname,32:ctype,1:tmodTime,}Ehfa_Entry,{16:clabel,1:LheaderPtr,}Ehfa_HeaderTag,{1:LfreeList,1:lfreeSize,}Ehfa_FreeListNode,{1:lsize,1:Lptr,}Ehfa_Data,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer,{1:lwidth,1:lheight,1:e3:thematic,athematic,fft of real-valued data,layerType,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,1:lblockWidth,1:lblockHeight,}Eimg_Layer_SubSample,{1:e2:raster,vector,type,1:LdictionaryPtr,}Ehfa_Layer,{1:sfileCode,1:Loffset,1:lsize,1:e2:false,true,logvalid,1:e2:no compression,ESRI GRID compression,compressionType,}Edms_VirtualBlockInfo,{1:lmin,1:lmax,}Edms_FreeIDList,{1:lnumvirtualblocks,1:lnumobjectsperblock,1:lnextobjectnum,1:e2:no compression,RLC compression,compressionType,0:poEdms_VirtualBlockInfo,blockinfo,0:poEdms_FreeIDList,freelist,1:tmodTime,}Edms_State,{0:pcstring,}Emif_String,{1:oEmif_String,algorithm,0:poEmif_String,nameList,}Eimg_RRDNamesList,{1:oEmif_String,projection,1:oEmif_String,units,}Eimg_MapInformation,{1:oEmif_String,dependent,}Eimg_DependentFile,{1:oEmif_String,ImageLayerName,}Eimg_DependentLayerName,{1:lnumrows,1:lnumcolumns,1:e13:EGDA_TYPE_U1,EGDA_TYPE_U2,EGDA_TYPE_U4,EGDA_TYPE_U8,EGDA_TYPE_S8,EGDA_TYPE_U16,EGDA_TYPE_S16,EGDA_TYPE_U32,EGDA_TYPE_S32,EGDA_TYPE_F32,EGDA_TYPE_F64,EGDA_TYPE_C64,EGDA_TYPE_C128,datatype,1:e4:EGDA_SCALAR_OBJECT,EGDA_TABLE_OBJECT,EGDA_MATRIX_OBJECT,EGDA_RASTER_OBJECT,objecttype,}Egda_BaseData,{1:*bvalueBD,}Eimg_NonInitializedValue,{1:oEmif_String,fileName,2:LlayerStackValidFlagsOffset,2:LlayerStackDataOffset,1:LlayerStackCount,1:LlayerStackIndex,}ImgExternalRaster,{1:*bvalidFlags,}ImgValidFlags,{1:llayerStackCount,1:lwidth,1:lheight,1:lblockWidth,1:lblockHeight,1:e13:u1,u2,u4,u8,s8,u16,s16,u32,s32,f32,f64,c64,c128,pixelType,}ImgExternalLayerStackHeader,{1:LspaceUsedForRasterData,}ImgFormatInfo831,{1:bcovariance,}Esta_Covariance,.gdalautotest-3.0.4/gdrivers/data/inconsitant_geojp2_gmljp2.jp2.aux.xml0000644003401500001440000000015013614005406025443 0ustar rouaultusers LOCAL_CS["PAM"] 100,1,0,300,0,-1 gdalautotest-3.0.4/gdrivers/data/LDEM_4.IMG0000644003401500001440000002342013614004466017675 0ustar rouaultusersB.63$7=k&(" -3K]"CqJG\ne^S4? " % ~nwpTIP(!^n``\`]_RijBss #QDi:M$W$%L n7u~zQ $F$'5<.*jWIf<_XdAKe-HJL8U`[X3jbehS.J/!&6R&M,H,.Pd'BwTzf`ez{'n~^ w!150=AR:chP@yWpk8|zx  V,.;WLdIWeJ.RRPwgj}$7">MGRtg{o]cUF,  zw{jVWA.")( atndR@MKD/")wwutolkuraUTVeo]RXPBC=COWXNE:I:6?7'. ~k|6969BKmsyj#&& &}pebZYWQMSO[YqonhV^cajht{vury~~ (=FPV$"(+<LG" !  ~kF;8@[y~fb66>%@ fmf\X.$ }mhj[VQH6643*& !,8=JS^fu 0>?JWbls| )/;?AGIRYafkrtz "%,/4688<?AACJRPZV\hmou:FMYAC90$/2Q9D<-5FuiTiic^y~r|qwtfmVSFZZ>HJD>34$'#zw~vujswv}|g^WXbmfSUSMNh]bNK]gF8GTH%!+ /C9L#Ga01..** !&,$NPUa0-`'tr][mn'02KNL>?+ ubhVO;O3 4JXq  `jcbB SxdY&OfF ="#1c}aKQudOIeI-*3)4 xhdQ`beeB\QGFVKLOHcOjlj[aW\joouvbjYXCINXHOHGG@/EHIPQRRQXRXa`bbqssw{znpgr_txvsujjhow{{w}y}tzo~q{xuruwjhvfy4<31' (DPc|$Eg$4CLL?Ww ";LkK_kEq3@;j$_nA}$d8g|XmeHo0*%  t]I;976,%#&#'-+1B@XSbkUPOTFL92-ugagJ(#{qd`YPLU^b]JD<1+*+0304=71""4)Q]poj|_AYWFX+"}t|vtrnkfefccq#"7\g@+%  ++:KV_giuutx{vwl]kj]RuYbDQI&~lP9C^ugXQMA+  <84X|[\VE8PG@kkY.Km\bWYwy4%gi6$co_DmJxZQaW}gpWjq~ ,F`q&'(5290=IUbu 14FMZTt]EASHCy3Eq& )- q:E& )&U|Q_oIK@8;++(# ${xwu{xxxzyrssppg`cagdYK+1Sau||ulfb^SJIIRSJE?<:861+! !*FFHNqsFc_dhO;/.8EA<:,!-+8131)7="*13*7:6<98>IN`mosuwgca`d`V`_L1 ~{zsnhfa^]]`_[TMQOONMPPRSNLRW`_`^ddgfdeeccbchlpsroqqv|}}{xxuuuuyutvvy~}v{yz{{tkhmejqvz %'+49??LWbjox *9I_v%6R]pT5>/DmH /@};KDh**3DWA!"d'%)~t99K<4-t[J2aI3|U6" %) 1'Bcv_`fwdlc`rt~qXMO[P\VNN:AGDC-)**,-"  aG+rxr]PYT>4;  5@D=>+'$((4=HLTRVRxE5SouMclnkndaGOB7)B\`r~kYA7+#-[@?)WisTc\zyxb`6TfR{fiMS_~~yigcR5  z$ $4IU^fnqjdZSKCA3 nli6pTX].3070R:792)2Ww /LYcv$AZp  #'.*5OIEPZVQB8B4,-=AMYXHACQNk[ow]=N2kEb+lI'T:) lxti]WSPLJkifehirxkdsbLG'@BJJN{{ jvIV;'80//0E+- $BFDKV^VV8UnWPXdUIg1FTBe- !+9lmJ#1*ALk+Vwvrpa6r^>|mz_vcU,zN9 ~wnfZ[3&  g]T[]TNJ8yw}gul[W(){}x}v}~yqporligj`eiedSFIKNOA62&-(-;BABKUfgjmuiXKCDC7+.:CGNNI@3""*9:( -2.$),9C@EKX[h{oji[W\acgowx~z}tvzytquxnqtzzvu}uzu}vx~zrdba`]STMMNPY\ba]ZTVOPNFFA:??;432,/, &771'/?EEBB>Ia]T`Xi   /45;@QR]o|6DRp 'Ix>^{Jr \r*l`oC \{e?i9u@w,aP/Rw<<[on}7*If'swM26xG f(~/\(nA ##?7#6c%Mr 6#KUnhH7 n\<:xa:I, ~P'gdalautotest-3.0.4/gdrivers/data/fakeiris.dat0000644003401500001440000000120113614004466020653 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/uint16_envi_bigendian.dat0000644003401500001440000000144013614004466023232 0ustar rouaultusersk{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skc{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{ck{{k{k{skkkkksckgdalautotest-3.0.4/gdrivers/data/cucled-2.rsw0000644003401500001440000001264513614004466020535 0ustar rouaultusersRSW@UUUUUd@N@tLA@A@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~RSW     @Y@@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~dRSW @Y@P@  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~kkk{s{ksssskŔc{{{{s{ccsc{s{{{c{{kskkkcss{sccZccckkkk{sk{{c{ksccck{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.0.4/gdrivers/data/rset.ntf.r10000644003401500001440000000536413614004466020411 0ustar rouaultusersNITF02.1003BF01GDAL 20021216151629 U 00000000000 00000000280400040400100052500000018750000000000000000000000000IMMissing 20021216151629 U 0Unknown 0000002500000025INTRGB VIS 08RG225603S0445019W225603S0444013W230609S0444013W230609S0445019W0NC3R N 0G N 0B N 00B00010001002500250800100000000000001.0 0000000000jbcRZXNhZ ok|YWcVS3OSmhk]gCOUDTKP.oglTV|QNSNWUTMLWMWAbJVXQdRZ\CWOSLNUVM-ZJTVPYYXW~taOZU?JXKS]\MPZZnUTOYVT`oFCOHKZZ]U|i\IIHMGuX[\[XqfYkJVQYT[QJGclWQ`r}ʎNLPV=UU?_\SoogH=2tPTPPQSGKFpzvYLTUZR`LSmUsN%qbL_rJb]XM?\.Rd2V\^njbf^SSRdI@hKZUF6enP`NfM[Rua_c_siX?R0rm]PL~WH3o~nz|jskcYENW.S=1ObPINo9z}[s\ONove]JI^Rw{h)"nhVSOoVVHB_hopkv]L#KVWI\n1CjiM`ianpn[iXFAs3^GSO`PQWawl(jox]HrpxWoq|xpOnUh7]YsUl|xoxrmg"Go{}NHtlgyBKSzyh nt{w{pxywzyxWx|||hwzi}ry5vxvx{x|wpspxdr~uyuf}ppmsyzq7mbxyr||yso~yOgyluonx{cqq~zvzccodi}}{p|qpkoc}~xpvg{x{tigrhʢusrzd~y[zuziY@u{wsypke%{pv~|l{t(zevjqhTZyez|{pn~s\vupv`x1}pљsgVdlvRcQo|uU~qj}wB2(|wqruqq|uI-TrWj;5/wm`UjtrxX4,' wuyb/''63.6O̠mot{z73% ;"%!1 C,6 *7!)+  )&.A!)"> #" 6( H@)&!" '% 6%N! 15!##M:(L$1'"7# ' &-G&@W[ "-+)!N!?A,;P8%" "( 4$D ): (5*! "()'1*+C".', , .]C&$2'8!"%/&&G+%R)0=D-4972;J@(;#$( #, 7<,<622)19+$"2604A)$>'%#'-/*7)$/%<"6 0O*&(')<)41-3 D#%#&"2,+/-94="73:3*371+.,0,.!G6094+,3+9??'>/52=:~PECQ!0)#5 14B52,.gdalautotest-3.0.4/gdrivers/data/LE7134052000500350.H30000644003401500001440000000370413614004466020535 0ustar rouaultusersNDF_REVISION=2.00; DATA_SET_TYPE=EDC_ETM+; PRODUCT_NUMBER=011050105003300008; PIXEL_FORMAT=BYTE; PIXEL_ORDER=NOT_INVERTED; BITS_PER_PIXEL=8; PIXELS_PER_LINE=15620; LINES_PER_DATA_FILE=14680; DATA_ORIENTATION=UPPER_LEFT/RIGHT; NUMBER_OF_DATA_FILES=1; DATA_FILE_INTERLEAVING=BSQ; TAPE_SPANNING_FLAG=1/1; START_LINE_NUMBER=1; START_DATA_FILE=1; LINES_PER_VOLUME=14680; BLOCKING_FACTOR=1; RECORD_SIZE=15620; UPPER_LEFT_CORNER=0912047.7816E,0123021.1611N,320332.875,1383055.125; UPPER_RIGHT_CORNER=0932341.5564E,0123038.3968N,542903.625,1383055.125; LOWER_RIGHT_CORNER=0932332.0449E,0103708.3904N,542903.625,1173879.375; LOWER_LEFT_CORNER=0912127.5867E,0103653.8244N,320332.875,1173879.375; REFERENCE_POINT=SCENE_CENTER; REFERENCE_POSITION=0922222.1984E,0113352.0236N,431618.250,1278467.250,7810.50,7340.50; REFERENCE_OFFSET=80.38,-17.02; ORIENTATION=0.000000; MAP_PROJECTION_NAME=UTM; USGS_PROJECTION_NUMBER=1; USGS_MAP_ZONE=46; USGS_PROJECTION_PARAMETERS=6378137.000000000000000,6356752.314249999800000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000; HORIZONTAL_DATUM=WGS84; EARTH_ELLIPSOID_SEMI-MAJOR_AXIS=6378137.000; EARTH_ELLIPSOID_SEMI-MINOR_AXIS=6356752.314; EARTH_ELLIPSOID_ORIGIN_OFFSET=0.000,0.000,0.000; EARTH_ELLIPSOID_ROTATION_OFFSET=0.000000,0.000000,0.000000; PRODUCT_SIZE=FULL_SCENE; PIXEL_SPACING=14.2500,14.2500; PIXEL_SPACING_UNITS=METERS; RESAMPLING=CC; PROCESSING_DATE/TIME=2005-01-05T15:29:57; PROCESSING_SOFTWARE=NLAPS_4_7_00e16; NUMBER_OF_BANDS_IN_VOLUME=1; WRS=134/052.0; ACQUISITION_DATE/TIME=2005-01-03T03:58:49Z; SATELLITE=LANDSAT_7; SATELLITE_INSTRUMENT=ETM+; PROCESSING_LEVEL=08; SUN_ELEVATION=45.44; SUN_AZIMUTH=140.39; BAND1_NAME=ETM+_BAND_8; BAND1_FILENAME=LE7134052000500350.I8; BAND1_WAVELENGTHS=0.50,0.90; BAND1_RADIOMETRIC_GAINS/BIAS=0.9755906,-5.6755981; END_OF_HDR; gdalautotest-3.0.4/gdrivers/data/022gdeme_truncated0000644003401500001440000002046013614004466021675 0ustar rouaultusers 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.0.4/gdrivers/data/8s0000644003401500001440000000045413614004466016652 0ustar rouaultusersfec[e_HBD0 '? ?3,QoD%'YO1lo4 ! 6f < FzJ/  gdalautotest-3.0.4/gdrivers/data/srtmplus.wcs0000644003401500001440000000025213614004466021000 0ustar rouaultusers http://geodata.telascience.org/cgi-bin/mapserv_dem? srtmplus_raw 75 gdalautotest-3.0.4/gdrivers/data/LanduseSmall.dom0000644003401500001440000000274213614004466021464 0ustar rouaultusers[Ilwis] Description=Land use units Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=Domain Version=3.0 Class=Domain Class [Domain] Width=25 Type=DomainClass Representation=LanduseSmall.rpr [DomainSort] Sorting=Alphabetical Prefix= AttributeTable=LanduseSmall.tbt [DomainClass] Nr=12 [Table] Domain=String.dom Columns=3 Records=12 Type=TableStore Description=Land use units Time=991346400 DomainInfo=String.dom;String;string;0;; Version=3.0 Class=Table [TableStore] Data=LanduseSmall.dm# Col0=Name Type=TableBinary Col1=Ord Col2=Ind StoreTime=991346400 [Col:Name] Description=Class Name Domain=String.dom Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=ColumnStore Stored=Yes NrDepObjects=0 StoreType=String DomainInfo=String.dom;String;string;0;; ReadOnly=No OwnedByTable=Yes Version=3.0 Class=Column [Col:Ord] Description=Order Domain=value.dom Range=-32766:32767:offset=0 Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=ColumnStore Stored=Yes NrDepObjects=0 StoreType=Long DomainInfo=value.dom;Long;value;0;-9999999.9:9999999.9:0.1:offset=0; ReadOnly=No OwnedByTable=Yes MinMax=1:12 Version=3.0 Class=Column Sum=? Mean=? StdDev=? [Col:Ind] Description=Inverse Order Domain=value.dom Range=-32766:32767:offset=0 Time=991346400 DataReadOnly=no PropertiesReadOnly=no Type=ColumnStore Stored=Yes NrDepObjects=0 StoreType=Long DomainInfo=value.dom;Long;value;0;-9999999.9:9999999.9:0.1:offset=0; ReadOnly=No OwnedByTable=Yes Version=3.0 Class=Column Sum=? Mean=? StdDev=? gdalautotest-3.0.4/gdrivers/data/fakemfftiled.b00000644003401500001440000000000113614004466021225 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/groups.h50000644003401500001440000002315413614004466020154 0ustar rouaultusersHDF  l&`HEAPMyGroupTREEX `HEAP0 TREE(  SNOD(HEAP0lTREE SNOD   p HEAP TREE(   p Group_AGroup_Bdset1   EyAx     EyAxSNOD  dset2 gdalautotest-3.0.4/gdrivers/data/netcdf_fixes.nc0000644003401500001440000004040013614004466021353 0ustar rouaultusersCDF timelatitude longitude  ConventionsCF-1.6 U bla%wbla_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________bla(latitude  standard_namelatitude long_namelatitudeunits degrees_northaxisY(( longitude  standard_name longitude long_name longitudeunits degrees_eastaxisX((time  standard_nametime long_namejulian day (UT)unitsdays since 1990-01-01 00:00:00calendarstandard)ndarstandard)ce 1990-01-01 00:00:00calendarstandard)B:hB:iB:kB:m:B:nB:pB:rXB:t B:uB:ww_ ___\)_33_ =^H^R^\^ff@ͪgdalautotest-3.0.4/gdrivers/data/byte.jp2.gz0000644003401500001440000002340713614004466020377 0ustar rouaultusersqI}ePYgpw-K2w݃lv?k޷뜞 X+#… sW/GkGVwG],MO5!8:qT(feZ#{# {|4-W =׬ B@k{Vu=kBXBA"Xȿ AԄb>@Ґ)r3{;؛(Yɛ2OiOBo*- !"m@'RR ~df x'/3gi{s^b[ CV13[O b4L,#9jc/W3}?z=1#7=11;#3;`gaX`p/dz;O#׿pPFw`s0?3+b 3M d0'@4Hph 8{ĂDD% (:qTA Hc]@$߁|KMDÝDz _q"`% 3W!qqJz7 xoP3aPP(FX 4ݏp  #ۂ$@B+RI~*L>TMKx6޾ Eb\qytPʪ*R ZfO zQuf!Ԏ \!Hġպ6TҪJ\T>6"m~q8 KҠE^S0Pau*ǃ4/D[$+3uq*= }C `VQ+[j.m+]9зn!Z 1Tx, ('X{N4}[NS-Rn{UHle+QxXƎVstU%\A4>ͨqQ pWԣ/S=)Bm1YGvʻ v}3$q/YWy_.{RHҟ?St3 G:5X=AܔP|*iw FKAfaH@a=zR~ٳs֭75pL1l(9 }Rr &DA | JjT>ʒkT-+蹧4hߜ-s)2/EgQ8CR:| ?=)= gɝ;!T߭}'hpWz^KmƲ*ُV,1w)Xt̥?X"1>S/+PZ,Gk`' 38P:\݋ g"ɢ14#vRÞ$= jeؠV3ck2iQvlɋNwo>w1jFE9fn{3.GI3%h*ŏ4PBL_V^$*ؘˠepՌ9_-xy4j´VpRgNa \B3 o9]RZEK^7qm.MmY4tu>>RFNhUD5ڒj],,8„#j@nITjآҤEs^wL|^Waހnl {w}.-0deu-r]L1O!ڦKK5K=N =q;}7XăzJuv{\cߡEV0:vn/̌q >7gIuXQWDV"LO P9)&n#SWɅ1?sK1+8> b2F#Y" (̷*;fG U}S/oohKo$psj,vãg~'*^"(8#73?)dCqbṄ`a'p&Cw2Sv,pLQq"mB[e|;{e!FO`P=2}]u'xʢ6듁` 0H%@?5t$&f<ozT# hn:F)I1 ߒ`D?ζybfi%GNJynJ( zJ/\A_/Q1k [< T Jӑ*k(S&ʲtŲ=\rlJN,Vcc7@=)Y'1W`y"#k?2nJ@ff{QOvrD(#)~xffb/zZ֛"!}0j_c&% ɱsmGUg:v} kD:)$t  S("kJ FadB 7wGች:֤b}X(Cz V㦶!qYtJb.i9lj#;%[ª{u3C1uXB|] x‰3 Z!o1=* Н2s+]/7AR n{Ҕ-XR^ku$gPǬ;-7F>r=Ҩ>soMr9ƥ k,}ntYh"pؘ *.B7}:HtOJNwd*l/84o厗ܰ'Q;E^N/#'EݬFl 򣈙󸒧I?4)b5Nhoʟ 1AxBCi+sAB$ߦ.!fd<C'jϫg!@9-[XhQ)o~zq7 VstvȢaAg%g3VLSPJ=*sک_ryjQp%+K6\7~uuQ?VLLpK| [5$쫂! {֍!P\r;L/@V<i)&a:ɻy jFXW%ARNd`;J0ӏBs: {'I <4lN͓0L-/FO ^FMa'1BD CZM:)(vsBFi|ҊijNtw|]y>*Z2nޡ_w-x4_&%9_┚O6cԊSq>GZ~9{͗b[!~xd'ՠl]",, gs1A ^؛OEVkjf}XeG2iV_ v#JY'Qq`p3hƹT; w3*8|Ԧ]XJFn4pq$YR_=zCE4W̏2 BV%rr;?xʞ_2otsC%ذy-|uQVy#h3{Fꡨe0 _z6޵g+a,)B)eWmZAl H79>[s'`qN5V0J\ʾ aQ>j>[bϼ%˜g[ o)e +)#"~~6(Lfb}uzMԎAI) I|{f|^ -<4PQpW0Pe6vugߓdpA6/tH7G?v4#hwUx'PVa<W-FrxL⮨grպ}p,Pmt;g G%]s3}ֶGOb$}t`K#=}NԺM< AN<&*emF/8"_0/e6^2^IB懟7B7 [}G[}7a<]o J@U@Yrxr !S60(Om86KB?.< B\Fqsgl4m(Z9ʥ-ճmݤ6ꢗxHKuF骃@E/k?/Ć$UGh~3pasG3ɍ* ܫ}B4PdMf AKo2tSeOݏ(%}kSXO׹@a1C-,tpbQEB^34YAJ婯mfdMx{SIŁO ڍ0t7=ڍ:;!7p?-Ƨ.ƬBԖ-6¡5Vɲ!eYgz@Æ V{&wz"_0h=tʞFGD<\U6H/W:A&I!-ʼn }B&ΟM *;sG54 )00X-33PUo7. h<el駘!\lw {ozL.吽LIӘV.zpLT:acH,|u6fbI3\/;K EHpYjESlDb)a@s4V,9_9<ߧ˷CEbIUF{*[D:4%?penCVDxH͍l"1<&\s $l63? *QjG85mp>|i /1qfկ]Sz;: 9QC< ⾬Yx)zYLX*:~@Kvzmm·j_q9Yy+]f}Gfβy s*11֫} y;/5ڿ$Wϓ]2psY~&])~<a@X7VK@J2 xRd,t<@2OH]FF`4 <1I&Dg=+X}w 03<پ:}4W21n(Yr(chz _ZTN<x5^xsA*aeMX"z\2&=~bV,[ޡ`Aw~[ֶ!}pu7\(8"ڂ|!Bd"UlϮ3{q=Z2Z-`ca):]3EeԱH)Sf3q-V:?-;0:뷴B8KǪ߀/N~IH| 9x=kR֏싨~?W]ÛƸ%.?*%ڜ!x e/d7 )NMۥp3lOB 0Xېպ[c=hay)" L13SaT(9MQe"<5z1Օl?l"6}TyFCpJy[A2#t/gԀo9Q5]yLFҪt۩DB1tq΋s.#IQڔ\as'hPj.Yy35E4-o/Ti VM jxB$)1B}JQ H^;pyZ<ؤZJ3Z=Ȟ:k =-lX9LjO!9A"""<&E{$cYLM|h^ p I2kiN|N| \j $ r+jP\$)_i#!!-Dz-UaMp$-x /A秃Pp_W$Dk!pl n14Z7'XCB/H ۘڳ {7H&,k959LZʯbsbR֍qY_pVW Lv^38k -aMBD~Qa_usp2H9 Ф >W[?a{fh13bCwY~GXp"1!-t+]qaS9BxS⦍Ô5N(g.pJon/=pK̷t\ߥX,awB í}Qx[8ۛ}9ׇf p o$rKίgh$^$,Q%p,ל4WA͙t#c_FTO!7XC!&7;OAsUqi],DX f5Z뫵kc K p8!H`KեӤ4FOR*c|t\([xVq_GS𸶟4ZR},Zv,6AL}YB؃HR߱;*,B8߽BX%S3_{mF#Ñ @p b̽9e!tmЏJ,/ܙUMsRXK~hM]?&Wyo<ߎ>x{@dInk*"88)42ڊqe0 d-^l@JgZ={j-Tz y&D"?1NO`ʸ΀(JT@pɎZR]fQyi?G7fѠJYX6Hx/IVk/UVZ4m\I3TZ+n7z] p~8T-+;u}ur. (nѴz)s]Kmx V ^/0?=ӈZo ^0}<wY;S t?K5^n(7-t-J:#Hyg ]NjҷAT[RZάLp+۾wY } 5N?0.WAʸka}]Ev-%*ϭ}-H>nKni957?,lgI@rH]/KHw^!=mb8U:4b,d Zإsze0m w}\ꄭ.wT/BڢƔtShYD¤I1TL227 vKc53e2ћFJ'1!{֘I"+eB~U׿N+~|j(IHҋ ˮXӆeQI%E5wJ~@6N0%1W6>ĦMy͈ݾCX!w7#1K,?)ea[%zq#Wܓ~|[Ir*x{SQts6ތI&UfDmQ~3 Q|,uxoDx䀆EU` $_h=0\AW'H bzϵpԥT: [*'l#q0̭l/w/yQv%=N^CPS7<5 S0Hq<6 yy.ZQP51=b 1v1OdmQw;#{>/%od6K˞}_#ҹ7v ˏ$0jJp3VP47P_-ImsY@?3+=R ~@A,gVo 6@.hS\<>h;46liL8͞Ɛ_E]͕_4TUs1w-):ⳈDu66T_Hr:3xZhNx<ጵʬh'.Oyw1)3 k( F|RWPY;4YBy5FƺUKճ1^'eYDMkw]aT 7h6j1*ּiwL™&`R{[~[=(gdalautotest-3.0.4/gdrivers/data/w118n033_trunc.dt10000644003401500001440000000654413614004466021334 0ustar rouaultusersHDR1DMATERRAIN000100UHL11180000W0330000N00300030U120112010DSIUDTED1USGS SOURCE 0000MSLWGS 330000.0N1180000.0W330000N1180000W340000N1180000W340000N1170000W330000N1170000W003000301201120100FROM USGS (c) M. Pinard & J-M PaquetSANTA ANA - W CA NI11-08W ACCNA NA NA NA 00gdalautotest-3.0.4/gdrivers/data/avfilt_nodata.vrt0000644003401500001440000000115713614004466021746 0ustar rouaultusers 0.00000000000000E+00 ./data/test_vrt_filter_nodata.tif 1 3 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 gdalautotest-3.0.4/gdrivers/data/no_scale_offset.nc0000644003401500001440000000465013614004466022052 0ustar rouaultusersCDF xy  Conventions COARDS/CF-1.0 x  long_namex actual_range$@$ty  long_namey actual_range$@$z  long_namez$" ?@@@@@@@ @"@$$" ?@@@@@@@ @"@$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.0.4/gdrivers/data/case_sensitive.ASC0000644003401500001440000000562313614004466021734 0ustar rouaultusersncols 15 nrows 12 xllcorner 0.100000E+06 yllcorner 0.650000E+06 cellsize .500E+02 nodata_value -99999 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .270E+01 .186E+01 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .614E+01 .931E+01 .868E+01 .200E+02 .266E+02 .122E+02 .313E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .162E+02 .542E+02 .944E+02 .953E+02 .977E+02 .833E+02 .505E+02 .144E+02 .209E+01 .000E+00 .000E+00 .000E+00 .000E+00 .199E+01 .170E+02 .784E+02 .173E+03 .266E+03 .332E+03 .264E+03 .230E+03 .120E+03 .415E+02 .941E+01 .801E+00 .240E+02 .000E+00 .410E+01 .177E+02 .116E+03 .303E+03 .562E+03 .756E+03 .759E+03 .618E+03 .309E+03 .171E+03 .603E+02 .792E+02 .254E+03 .242E+03 .483E+00 .678E+01 .529E+02 .212E+03 .585E+03 .108E+04 .140E+04 .128E+04 .817E+03 .436E+03 .219E+03 .275E+03 .890E+03 .145E+04 .158E+04 .000E+00 .307E+01 .162E+02 .141E+03 .435E+03 .862E+03 .109E+04 .889E+03 .559E+03 .289E+03 .296E+03 .116E+04 .245E+04 .332E+04 .309E+04 .000E+00 .000E+00 .516E+01 .296E+02 .128E+03 .245E+03 .305E+03 .223E+03 .119E+03 .472E+02 .517E+03 .173E+04 .289E+04 .345E+04 .309E+04 .000E+00 .000E+00 .000E+00 .266E+01 .107E+02 .192E+02 .146E+02 .182E+02 .805E+01 .378E+02 .442E+03 .165E+04 .274E+04 .280E+04 .214E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .528E+00 .000E+00 .495E+00 .000E+00 .706E+01 .225E+03 .123E+04 .210E+04 .189E+04 .105E+04 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .844E+02 .405E+03 .752E+03 .430E+03 .244E+03 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .000E+00 .577E+02 .350E+02 .196E+02 .503E+01 gdalautotest-3.0.4/gdrivers/data/PDS_WITH_ZIP_IMG.ZIP0000644003401500001440000000030213614004466021450 0ustar rouaultusersPK iBD!PDS_WITH_ZIP_IMG.IMGUT >Q?Qux PK iBD!PDS_WITH_ZIP_IMG.IMGUT>Qux PKZRgdalautotest-3.0.4/gdrivers/data/ignfheightasciigrid.gra0000644003401500001440000000007013614004466023055 0ustar rouaultusers-16.75 -16.5 -152 -151.5 0.25 0.25 1 4 2 5 3 6 gdalautotest-3.0.4/gdrivers/data/USRP_PCB8/0000755003401500001440000000000013614004466017737 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/USRP_PCB8/FKUSRP01.GEN0000644003401500001440000000160613614004466021450 0ustar rouaultusers005812L 0600097 3303000031000001033031DSI035064GEN143099SPR117242BDF040359TIM034399DRF051433 GENERAL_INFORMATION_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&DATA_SET_IDPRT!NAM(A,A(6))1600;&GENERAL_INFORMATIONSTR!LOD!LAD!UNIloa!ZNA!SWO!SWA!NEO!NEA!SCA!PSP!IMR!LSO!PSO!TXT(I(1),2R(6),A(3),I(3),4R(10),I(9),R(5),A(1),2R(10),A)1600;&DATA_SET_PARAMETERSNUL!NUS!NLL!NLS!NFL!NFC!PNC!PNL!COD!ROD!POR!PCB!PVB!BAD!TIF(4I(6),4I(3),5I(1),A(12),A(1))2600;&BAND_ID*BID!WS1!WS2(A(5),2I(5))2100;&TILE_INDEX_MAP*TSI(I(11))1100;&DATA_SET_DESCRIPTIONNSH!NSV!NOZ!NOS(4I(2))00268 D 00073 230300105000DSI12005GEN95017SPR55112BDF16167TIM12183GIN1USRPFKUSRP4000005000005 M+17+000000.00+000000.00+000000.00+000000.00000050000100.0Y+000500000+00500000000000000012800012800000000100112812801088FKUSRP01.IMGY BID00000000000000000000100053 D 00039 22030010500DRF0905DSS101010101gdalautotest-3.0.4/gdrivers/data/USRP_PCB8/FKUSRP01.QAL0000644003401500001440000000214313614004466021451 0ustar rouaultusers006322L 0600106 3303000019000001033019QSR059052QUV104111COL080215QOI040295ASH070335ASV068405RCI053473 QUALITY_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1600;&UP_TO_DATENESSEDN!DAT1!DAT2!REC!REV!SRC!DAT3!SPA!DAT4!DAT5(A(20),2A(12),2I(3),A,A(12),A,2A(12))2600;&COLOR_CODE_ID*CBD!CCD!CR1!CR2!CR3!FRM!NSR!NSG!NSB(A,I(3),3I(6),A,3I(3))1000;&OTHER_QUALITY_INFORMATIONOQI(A)1600;&HORIZONTAL_ACCURACYAAH!UNIaah!APH!UNIaph(I(5),A(3),I(5),A(3))1600;&VERTICAL_ACCURACYAAV!UNIaav!APV!UNIapv(I(5),A(3),I(5),A(3))2200;&BOUNDING_POLYGON_COORDINATES*LON!LAT(2R(10))00369 D 00061 3303001005000QSR038005QUV111043COL154154QAL1UN  007,20120505024,20120505000000 022,19930501 020,19920101021,19920101 000 000000000 001 255000000 002 000255000 003 00000025500061 D 00039 22030010500ASH1705HOR100080 M00060 M00061 D 00039 22030010500ASV1705VER100020 M00010 Mgdalautotest-3.0.4/gdrivers/data/USRP_PCB8/FKUSRP01.IMG0000644003401500001440000001340113614004466021447 0ustar rouaultusers001712L 0600053 220300027000013327PAD2860SCN3088 RASTER_GEO_DATA_FILE1600;&RECORD_IDRTY!RID(A(3),I)1000;&PADDING_FIELDPAD(A)2500;&PIXEL_FIELD*PIX(B(8))05718 D 00070 8403001000000050000PAD000038500005SCN000017933855IMG1 // ????0????0????0????0//// //// //// //// ????0????0????0????0//// //// //// //// ????0????0????0????0gdalautotest-3.0.4/gdrivers/data/USRP_PCB8/TRANSH01.THF0000644003401500001440000000124513614004466021444 0ustar rouaultusers004062L 0600073 23030003000000133030VDR90063FDR76153QSR59229QUV45288 TRANSMITTAL_HEADER_FILE1600;&RECORD_IDRTY!RID(A(3),I)1600;&TRANSMITTAL_HEADERMSD!VOO!ADR!NOV!NOF!URF!EDN!DAT(A(3),2A,I(1),I(3),A,I(3),A(12))1600;&DATA_SET_DESCRIPTIONNAM!STR!PRT!SWO!SWA!NEO!NEA(A(6),I(1),A,4R(10))1000;&SECURITY_AND_RELEASEQSS!QOD!DAT!QLE(2A(1),A(12),A)1000;&UP_TO_DATENESSSRC!DAT!SPA(A,A(12),A)00163 D 00046 22030010500VDR5905FDR5364THF1003  1001FAKE_USRPDS001007,20120505FKUSRP4USRP+000000.00+000000.00+000000.00+000000.0000108 D 00046 22030010500QSR2705QUV3032LCF1UN UNRESTRICTEDUSRP 1.2012,19930501USRP 1.2gdalautotest-3.0.4/gdrivers/data/testtil.til0000644003401500001440000000057413614004466020602 0ustar rouaultusersnumTiles = 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.0.4/gdrivers/data/float32.tif0000644003401500001440000000362013614004466020351 0ustar rouaultusersII*HBBCBCC CCCCBCBCCBBBCCBCBBCB%CB CBBBBCBCCCBCBC CCBB CB CBCBBCCBBBBBCCBBBCCBBBBBBBCBB CBCCCC CCCBBBBCB%CBCBBCCB=C-C-CCCBCBBCBCCBBBCCNCBEC-CC C CCBCBB CCCBCBC-CBBCBCBCB CBBBCBBBBBB5CBBBBCBBCBCCBBCBBBBCBBB C CB CBBBBCBBBBBCBBBCCCCCBBCBBCBBB C-CBBBBBBBBBB CBBBBBB-CBBBBBCBB-CCBBBBBBB=C-CBBBBB CB-C CCCCBBBBBBCB CBCBBCBC C CB CBBBBBBBBBBBBCBCBC%CCCBBBBB CBBBBBBCBBBB=C-C C C%CBCBBBBBBBBCBBCCC5C C-CBCBBBBBBB CCC%C C CB-CwCCNCCB CBCC%C%CC CCBBBBB5C5CCCCCC5CCCBCBBBBBBBB @S  JzN@N@@A̞LA Wh )#NAD27 / UTM zone 11N|gdalautotest-3.0.4/gdrivers/data/fakecpgSIRC.hdr0000644003401500001440000000026413614004466021154 0ustar rouaultusersnumber_lines 1 number_samples 1 altitude 0.01 near_srd 0.01 sample_size 0.01 sample_size_az 0.01 transposed 0 gdalautotest-3.0.4/gdrivers/data/byte_pds4.xml0000644003401500001440000001401713614005406021007 0ustar rouaultusers ${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 -117.640846184838466 -117.628433273895808 33.9026884702547235 33.8912612930438613 Transverse Mercator 0.999600000000000044 -117 0 Coordinate Pair 60 0.060 1855.34503419624093 1855.34503419624093 -59250 3751290 Planetocentric North_American_Datum_1927 6378.2064 6378206.4 6356583.8 Positive East byte_pds4.img 0 3 Last Index Fastest UnsignedByte Band 1 1 Line 20 2 Sample 20 3 255 74 74 255 126.765 22.928470838676 gdalautotest-3.0.4/gdrivers/data/BAND4.DAT0000644003401500001440000000000013614004466017502 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/test_pdf_composition.pdf0000644003401500001440000002014313614004466023320 0ustar rouaultusers%PDF-1.6 % 3 0 obj << /Author (Even) >> endobj 4 0 obj << /Length 229 /Subtype /XML /Type /Metadata >> stream endstream endobj 5 0 obj << /Length 6 0 R >> stream button = app.alert({cMsg: 'This file was generated by GDAL. Do you want to visit its website ?', cTitle: 'Question', nIcon:2, nType:2}); if (button == 4) app.launchURL('http://gdal.org/'); endstream endobj 6 0 obj 189 endobj 7 0 obj << /JavaScript << /Names [ (GDAL) << /JS 5 0 R /S /JavaScript >> ] >> >> endobj 8 0 obj << /Name (Satellite imagery) /Type /OCG >> endobj 9 0 obj << /Name (OSM data) /Type /OCG >> endobj 10 0 obj << /Name (Roads) /Type /OCG >> endobj 11 0 obj << /Name (Buildings) /Type /OCG >> endobj 12 0 obj << /Name (Buildings name) /Type /OCG >> endobj 13 0 obj << /Name (Cadastral parcels) /Type /OCG >> endobj 14 0 obj << /BBox [ 1 1 19 9 ] /Measure 15 0 R /Name (Layer) /Type /Viewport >> endobj 15 0 obj << /Bounds [ 0 0 1 0 1 1 0 1 0 0 ] /GCS 16 0 R /GPTS [ -90 -180 90 180 -90 -180 90 180 ] /LPTS [ 0 0 1 0 0 1 1 1 ] /Subtype /GEO /Type /Measure >> endobj 16 0 obj << /EPSG 4326 /Type /GEOGCS /WKT (GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]) >> endobj 17 0 obj << /Neatline [ 1 1 19 1 19 9 1 9 1 1 ] /Projection << /Datum (WGE) /ProjectionType (GEOGRAPHIC) /Type /Projection /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"]]) >> /Registration [ [ 1 1 -180 -90 ] [ 19 1 180 90 ] [ 1 9 -180 -90 ] [ 19 9 180 90 ] ] /Type /LGIDict /Version (2.1) >> endobj 19 0 obj << /BM /Multiply /Type /ExtGState /ca 0.7 >> endobj 20 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 21 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 21 0 obj 228 endobj 22 0 obj << /CA 0 /Type /ExtGState /ca 0 >> endobj 25 0 obj << /A << /O /UserProperties >> /K 0 /P 24 0 R /Pg 18 0 R /S /feature /T (feature1) >> endobj 26 0 obj << /A << /O /UserProperties >> /K 1 /P 24 0 R /Pg 18 0 R /S /feature /T (feature2) >> endobj 24 0 obj << /A << /O /UserProperties >> /K [ 25 0 R 26 0 R ] /P 23 0 R /S /Layer /T (test) >> endobj 28 0 obj << /A << /O /UserProperties /P [ << /N (id) /V (3) >> << /N (link) /V (http://gdal.org) >> ] >> /K 2 /P 27 0 R /Pg 18 0 R /S /feature /T (3) >> endobj 29 0 obj << /A << /S /URI /URI (http://gdal.org) >> /BS << /S /S /Type /Border /W 0 >> /Border [ 0 0 0 ] /H /I /QuadPoints [ 10.5 5.5 10.5 9.5 20 9.5 20 5.5 ] /Rect [ 9 4 21 11 ] /Subtype /Link /Type /Annot >> endobj 27 0 obj << /A << /O /UserProperties >> /K [ 28 0 R ] /P 23 0 R /S /Layer /T (another layer) >> endobj 31 0 obj << /A << /O /UserProperties /P [ << /N (id) /V (1) >> ] >> /K 3 /P 30 0 R /Pg 18 0 R /S /feature /T (feature1) >> endobj 32 0 obj << /A << /O /UserProperties /P [ << /N (id) /V (2) >> ] >> /K 4 /P 30 0 R /Pg 18 0 R /S /feature /T (feature2) >> endobj 33 0 obj << /CA 0.4666666666666667 /Type /ExtGState /ca 0.4666666666666667 >> endobj 34 0 obj << /A << /O /UserProperties /P [ << /N (id) /V (3) >> ] >> /K 5 /P 30 0 R /Pg 18 0 R /S /feature /T (feature3) >> endobj 35 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceGray /Filter /FlateDecode /Height 20 /Length 36 0 R /Subtype /Image /Type /XObject /Width 20 >> stream x%!rD1 C# ~td2d%IA*I$vW㠒 ZlCW }@"[ D',jO6׽hA;߷tiǸYr|00H*\UQ2E l u])#bMv;F|tTTyw8]QlY˸~ˀNo:1xݪr 2pm[i5ٽ~4?> xO endstream endobj 36 0 obj 228 endobj 37 0 obj << /Type /ExtGState /ca 0.5 >> endobj 30 0 obj << /A << /O /UserProperties >> /K [ 31 0 R 32 0 R 34 0 R ] /P 23 0 R /S /Layer /T (sym) >> endobj 38 0 obj << /BBox [ 0 0 20 10 ] /Length 39 0 R /Resources << /Font << /F1 << /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> >> >> /Subtype /Form /Type /XObject >> stream q BT 1.000000 0.000000 -0.000000 1.000000 15.000000 1.000000 Tm 0.000000 0.000000 0.000000 rg /F1 0.352778 Tf (foo) Tj ET Qendstream endobj 39 0 obj 123 endobj 40 0 obj [ 25 0 R 26 0 R 28 0 R 31 0 R 32 0 R 34 0 R ] endobj 41 0 obj [ 29 0 R ] endobj 18 0 obj << /Annots 41 0 R /Contents 42 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /LGIDict 17 0 R /MediaBox [ 0 0 20 10 ] /Parent 1 0 R /Resources 43 0 R /StructParents 0 /Type /Page /UserUnit 1 /VP [ 14 0 R ] >> endobj 42 0 obj << /Length 44 0 R >> stream /OC /Lyr8 BDC q /GS19 gs q 8 0 0 8 1 1 cm /Image20 Do Q Q EMC q /GSinvisible gs 0 w /feature <> BDC q 1.000000 w 0 J 0 j 10 M []0 d 0.000000 0.000000 0.000000 RG 0.498039 0.498039 0.498039 rg 0.500000 0.500000 m 0.500000 9.500000 l 10.000000 9.500000 l 10.000000 0.500000 l 0.500000 0.500000 l h b* Q EMC /feature <> BDC q 1.000000 w 0 J 0 j 10 M []0 d 0.000000 0.000000 0.000000 RG 0.498039 0.498039 0.498039 rg 10.500000 0.500000 m 10.500000 4.500000 l 20.000000 4.500000 l 20.000000 0.500000 l 10.500000 0.500000 l h b* Q EMC Q q /GSinvisible gs 0 w /feature <> BDC q 1.000000 w 0 J 0 j 10 M []0 d 0.000000 0.000000 0.000000 RG 0.498039 0.498039 0.498039 rg 10.500000 5.500000 m 10.500000 9.500000 l 20.000000 9.500000 l 20.000000 5.500000 l 10.500000 5.500000 l h b* Q EMC Q /feature <> BDC q 1.000000 w 0 J 0 j 10 M []0 d 0.000000 1.000000 0.000000 RG 0.000000 1.000000 0.000000 rg 14.647222 6.647222 m 15.352778 7.352778 l 14.647222 7.352778 m 15.352778 6.647222 l S Q EMC /feature <> BDC q /GS_CA_119_ca_119 gs 1.000000 w 0 J 0 j 10 M []0 d 0.000000 1.000000 0.000000 RG 0.000000 1.000000 0.000000 rg 14.647222 4.647222 m 15.352778 5.352778 l 14.647222 5.352778 m 15.352778 4.647222 l S Q EMC /feature <> BDC q /GS_CA_255_ca_127 gs 0.705557 0 0 0.705557 14.647222 2.647222 cm /SymImage35 Do Q EMC /Label38 Do endstream endobj 44 0 obj 1370 endobj 43 0 obj << /ExtGState << /GS19 19 0 R /GS_CA_119_ca_119 33 0 R /GS_CA_255_ca_127 37 0 R /GSinvisible 22 0 R >> /Properties << /Lyr8 8 0 R >> /XObject << /Image20 20 0 R /Label38 38 0 R /SymImage35 35 0 R >> >> endobj 1 0 obj << /Count 1 /Kids [ 18 0 R ] /Type /Pages >> endobj 45 0 obj << /Nums [ 0 40 0 R ] >> endobj 23 0 obj << /Type /StructTreeRoot /ParentTree 45 0 R /K [ 24 0 R 27 0 R 30 0 R ] >> endobj 2 0 obj << /MarkInfo << /UserProperties true >> /Metadata 4 0 R /Names 7 0 R /OCProperties << /D << /OFF [ 10 0 R ] /Order [ 8 0 R 9 0 R [ 10 0 R 11 0 R [ 12 0 R ] 13 0 R ] ] /RBGroups [ [ 11 0 R 13 0 R ] ] >> /OCGs [ 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R ] >> /Pages 1 0 R /StructTreeRoot 23 0 R /Type /Catalog >> endobj xref 0 46 0000000000 65535 f 0000006775 00000 n 0000006969 00000 n 0000000015 00000 n 0000000051 00000 n 0000000361 00000 n 0000000602 00000 n 0000000624 00000 n 0000000712 00000 n 0000000770 00000 n 0000000819 00000 n 0000000866 00000 n 0000000917 00000 n 0000000973 00000 n 0000001032 00000 n 0000001119 00000 n 0000001282 00000 n 0000001482 00000 n 0000004869 00000 n 0000002042 00000 n 0000002103 00000 n 0000002503 00000 n 0000002526 00000 n 0000006878 00000 n 0000002781 00000 n 0000002577 00000 n 0000002679 00000 n 0000003259 00000 n 0000002882 00000 n 0000003042 00000 n 0000004307 00000 n 0000003362 00000 n 0000003492 00000 n 0000003622 00000 n 0000003707 00000 n 0000003837 00000 n 0000004237 00000 n 0000004260 00000 n 0000004414 00000 n 0000004756 00000 n 0000004779 00000 n 0000004842 00000 n 0000005109 00000 n 0000006557 00000 n 0000006533 00000 n 0000006835 00000 n trailer << /Info 3 0 R /Root 2 0 R /Size 46 >> startxref 7293 %%EOF gdalautotest-3.0.4/gdrivers/data/envirpc.img0000644003401500001440000000000213614004466020526 0ustar rouaultusersagdalautotest-3.0.4/gdrivers/data/BAND3.DAT0000644003401500001440000000000013614004466017501 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/cgg2013ai08_reduced.byn0000644003401500001440000001112013614004466022322 0ustar rouaultusers0[..@@-../0?0a00111234568,9H:7;;<=>3?AKBCDPEIEEEDC^C+C,C;C)CuDDiD{DSDCChC2'k')&C&'&(()h*,=-U-02367A9':];;<>>@BFCIMP?Q8QRsQNO5RVY\_r`r``dfd  > 5  T I W qv"%(/3Y9k?AAF:DBT8N5,> GOZwc5w8+jhyrLnu x u$mgv0s\:I&$1%I1D5T$b_jos@x~xmW}rvxR G5Mۑڮm ʄʲ]6OEMgGBQaPw\jT[]kT(Qnco#q4/}qu|z>ق,;:RBe6l>wY{L[Px#t P^e+GBzzW\ܬ?a:cf]? Vih:7*Fs#((+.)='x FָơZ.yi^a d.mpvu ݿGdmt4D"ne'+0&7;(BDD0G Z?w}{q^mQDBOVh)} z4!,Mg#-p4<9<)/C T 2/8dR~ n}k{vAPn^'Ls=TϮ{.zx qjjp8!ky, y{|oFa ftr :2` N8QƴXHrS{mvc`YajYY[P"sWKOR5h|]$Su1u>ۂ>ʅEwCha\]iu|IJk^]lO7VF`mts|B=av}cIs>,лK|!kZ&SQWmEw"tN8;IM`Zuh5zLBa&fjr`44 ̄S{"l[LNJHMZs]; ^|+Y=>c5u97:G.`ig%;O Uh!p#p5׋Bp\FND 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.0.4/gdrivers/data/test_vrt_filter_nodata.tif0000644003401500001440000000130413614004466023641 0ustar rouaultusersII*. S0 S0gdalautotest-3.0.4/gdrivers/data/small_world_pct.tif0000644003401500001440000012126513614004466022272 0ustar rouaultusersII*  =@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.0.4/gdrivers/data/real.rdc0000644003401500001440000000104413614004466020006 0ustar rouaultusersfile format : IDRISI Raster A.1 file title : real sample data type : real file type : binary columns : 21 rows : 21 ref. system : plane ref. units : m unit dist. : 1.0000000 min. X : 50.0000000 max. X : 70.0000000 min. Y : 50.0000000 max. Y : 70.0000000 pos`n error : unknown resolution : unknown min. value : 227.00 max. value : 412.00 display min : 227.00 display max : 412.00 value units : unspecified value error : unknown flag value : none flag def`n : none legend cats : 0 gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/0000755003401500001440000000000013614004466023210 5ustar rouaultusers././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614005406030157 5ustar rouaultusers././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614004466030164 5ustar rouaultusers././@LongLink0000644000000000000000000000025200000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614005406030157 5ustar rouaultusers././@LongLink0000644000000000000000000000026300000000000011604 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614004466030164 5ustar rouaultusers././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R10m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614004466030164 5ustar rouaultusers././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R20m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614004466030164 5ustar rouaultusers././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000027000000000000011602 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/IMG_DATA/R60m/gdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000000013614004466030164 5ustar rouaultusers././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000033600000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_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.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000000067613614004466030177 0ustar rouaultusersII* && BCD$E$*S././@LongLink0000644000000000000000000000026400000000000011605 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/GRANULE/L2A_T34VFJ_A011330_20170823T094252/MTD_TL.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000755003401500001440000000732513614005406030173 0ustar rouaultusers 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 ././@LongLink0000644000000000000000000000021500000000000011601 Lustar rootrootgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T34VFJ_20170823T094252.SAFE/MTD_MSIL2A.xmlgdalautotest-3.0.4/gdrivers/data/fake_sentinel2_l2a_MSIL2Ap/S2A_MSIL2A_20170823T094031_N0205_R036_T30000644003401500001440000004215613614005406030171 0ustar rouaultusers 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 gdalautotest-3.0.4/gdrivers/data/fakeeir.img0000644003401500001440000000000113614004466020465 0ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/SMALL_ADRG_ZNA18/0000755003401500001440000000000013614004466020720 5ustar rouaultusersgdalautotest-3.0.4/gdrivers/data/SMALL_ADRG_ZNA18/ABCDEF01.IMG0000644003401500001440000014400113614004466022323 0ustar rouaultusers001852L 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.0.4/gdrivers/data/SMALL_ADRG_ZNA18/ABCDEF01.GEN0000644003401500001440000000324613614004466022325 0ustar rouaultusers009083LE1 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.0.4/gdrivers/data/SMALL_ADRG_ZNA18/README.TXT0000644003401500001440000000027113614004466022256 0ustar rouaultusersAdapted 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.0.4/gdrivers/data/byte.rasterlite0000644003401500001440000001600013614004466021432 0ustar rouaultusersSQLite format 3@ -  uuW5osepsghWNAD27 / UTM zone 11N+proj=utm +zone=11 +datum=NAD27 +units=m +no_defsPROJCS[NAD27 / UTM zone 11N,GEOGCS[NAD27,DATUM[North_American_Datum_1927,SPHEROID[Clarke 1866,6378206.4,294.9786982138982]],UNIT[degree,0.0174532925199433]],PROJECTION[Transverse_Mercator],PARAMETER[central_meridian,-117],PARAMETER[scale_factor,0.9996],PARAMETER[false_easting,500000],AUTHORITY[EPSG,26711]]  ' byte_metadatageometryhW &PII*  P`PHg%%tablebyte_rastersbyte_rastersCREATE TABLE byte_rasters (id INTEGER NOT NULL PRIMARY KEY,raster)$--{tablegeometry_columnsgeometry_columnsCREATE TABLE geometry_columns (f_table_name,f_geometry_column,geometry_type,coord_dimension,srid,spatial_index_enabled)++qtablespatial_ref_sysspatial_ref_sysCREATE TABLE spatial_ref_sys (srid INTEGER NOT NULL PRIMARY KEY,auth_name,auth_srid,ref_sys_name,proj4text,srtext)Sk{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{skkkkksck ^^ @N@NWh@AtLAA̞LA|@AtLA@A̞LAA̞LAAtLA@AtLA ZKK3tableidx_byte_metadata_geometry_nodeidx_byte_metadata_geometry_node CREATE TABLE idx_byte_metadata_geometry_node(nodeno INTEGER PRIMARY KEY, data BLOB)AA?tableidx_byte_metadata_geometryidx_byte_metadata_geometryCREATE VIRTUAL TABLE idx_byte_metadata_geometry USING rtree(pkid, xmin, xmax, ymin, ymax)#''tablebyte_metadatabyte_metadataCREATE TABLE byte_metadata (id INTEGER NOT NULL PRIMARY KEY,tile_id,width,height,pixel_x_size,pixel_y_size,geometry POLYGON) !!P$H2HJdJd`  X-OOItableidx_byte_metadata_geometry_parentidx_byte_metadata_geometry_parentCREATE TABLE idx_byte_metadata_geometry_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)%MM=tableidx_byte_metadata_geometry_rowididx_byte_metadata_geometry_rowid CREATE TABLE idx_byte_metadata_geometry_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER) gdalautotest-3.0.4/gdrivers/data/melb-small.tif0000644003401500001440000003615113614004466021131 0ustar rouaultusersII*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}{